doublecmd-0.5.8/0000755000175000017500000000000012257501472012513 5ustar alexxalexxdoublecmd-0.5.8/build.sh0000755000175000017500000000333512047424133014150 0ustar alexxalexx#!/bin/sh # if you compile first time you must change variable "lazpath" and "lcl" # after it execute this script with parameter "all" at doublecmd dir # "./build.sh all" it build doublecmd # by Attid # You can execute this script with different parameters: # components - compiling components needed for DC # plugins - compiling all DC plugins # all - compiling components, plugins and DC # default - compiling DC only (using by default) # path to lazbuild export lazbuild=$(which lazbuild) # Set up widgetset: gtk or gtk2 or qt # Set up processor architecture: i386 or x86_64 if [ $2 ] then export lcl=$2 fi if [ $lcl ] && [ $CPU_TARGET ] then export DC_ARCH=$(echo "--widgetset=$lcl")" "$(echo "--cpu=$CPU_TARGET") elif [ $lcl ] then export DC_ARCH=$(echo "--widgetset=$lcl") elif [ $CPU_TARGET ] then export DC_ARCH=$(echo "--cpu=$CPU_TARGET") fi build_default() { $lazbuild src/doublecmd.lpi $DC_ARCH strip doublecmd } build_beta() { components/build.sh plugins/build.sh # Build Double Commander $lazbuild src/doublecmd.lpi --bm=beta $DC_ARCH # Build Dwarf LineInfo Extractor $lazbuild tools/extractdwrflnfo.lpi # Extract debug line info chmod a+x tools/extractdwrflnfo if [ -f doublecmd.dSYM/Contents/Resources/DWARF/doublecmd ]; then mv -f doublecmd.dSYM/Contents/Resources/DWARF/doublecmd $(pwd)/doublecmd.dbg fi tools/extractdwrflnfo doublecmd.dbg # Strip debug info strip doublecmd } build_all() { components/build.sh plugins/build.sh build_default } case $1 in components) components/build.sh;; plugins) plugins/build.sh;; beta) build_beta;; all) build_all;; *) build_default;; esac doublecmd-0.5.8/pixmaps.txt0000644000175000017500000000066712014201074014730 0ustar alexxalexxavi=video-x-generic bat=application-x-shellscript deb=application-x-deb doc=x-office-document htm=text-html html=text-html iso=application-x-cd-image jpeg=image-x-generic jpg=image-x-generic log=text-x-log mp2=audio-x-generic mp3=audio-x-generic ods=x-office-spreadsheet odt=x-office-document pas=text-x-pascal pdf=application-pdf po=text-x-po rpm=application-x-rpm sh=application-x-shellscript txt=text-x-generic xls=x-office-spreadsheet doublecmd-0.5.8/docgen.sh0000755000175000017500000000017711740433676014324 0ustar alexxalexx#!/bin/sh # http://pasdoc.sourceforge.net pasdoc --marker en --output doc/en/dev-help --define UNIX --source units-doc-unix.txtdoublecmd-0.5.8/clean.sh0000755000175000017500000000177412215276721014145 0ustar alexxalexx#!/bin/sh rm -f units/i386-linux-gtk2/* rm -f units/i386-linux-qt/* rm -f units/x86_64-linux-gtk2/* rm -f units/x86_64-linux-qt/* # Clean up components output directories rm -rf components/chsdet/lib/* rm -rf components/CmdLine/lib/* rm -rf components/dcpcrypt/lib/* rm -rf components/doublecmd/lib/* rm -rf components/gifanim/lib/* rm -rf components/KASToolBar/lib/* rm -rf components/viewer/lib/* rm -rf components/ZVDateTimeCtrls/lib/* # Clean up all temporary files find . -iname '*.compiled' -delete find . -iname '*.ppu' -delete find . -iname '*.o' -delete find plugins -iname '*.w?x' -delete find plugins -iname '*.dsx' -delete find plugins -iname '*.or' -delete find plugins -iname '*.res' -delete rm -f src/doublecmd.res doublecmd rm -f tools/extractdwrflnfo rm -f plugins/wcx/zip/lib/ZipConfDlg.lfm rm -f plugins/wcx/zip/lib/abresstring.rst rm -f plugins/wfx/ftp/lib/FtpConfDlg.lfm rm -f plugins/wfx/samba/lib/smbauthdlg.lfm # Remove debug files rm -f doublecmd.zdli doublecmd.dbg rm -rf doublecmd.dSYM doublecmd-0.5.8/components/0000755000175000017500000000000012257501472014700 5ustar alexxalexxdoublecmd-0.5.8/components/lclextensions/0000755000175000017500000000000012257501472017572 5ustar alexxalexxdoublecmd-0.5.8/components/lclextensions/include/0000755000175000017500000000000012257501472021215 5ustar alexxalexxdoublecmd-0.5.8/components/lclextensions/include/gtk/0000755000175000017500000000000012257501472022002 5ustar alexxalexxdoublecmd-0.5.8/components/lclextensions/include/gtk/uses.inc0000644000175000017500000000010612014201074023433 0ustar alexxalexx LCLIntf, Graphics, gtkdef, gdk, GTKProc, GtkInt, glib, gtk, Math, doublecmd-0.5.8/components/lclextensions/include/gtk/lclext.inc0000644000175000017500000000047512014201074023760 0ustar alexxalexx function DirectMaskBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC; XSrc, YSrc: Integer; Mask: HBITMAP): Boolean; begin //todo: see if is possible todo it faster Result := GTKWidgetSet.StretchCopyArea(DestDC, X, Y, Width, Height, SrcDC, XSrc, YSrc, Width, Height, Mask, XSrc, YSrc, SRCCOPY); end; doublecmd-0.5.8/components/lclextensions/include/gtk/delphicompat.inc0000644000175000017500000001027412014201074025134 0ustar alexxalexx { This file is part of Delphi Compatibility Unit Copyright (C) 2007 Luiz Américo Pereira Câmara pascalive@bol.com.br This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version with the following modification: As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules,and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. } {$define HAS_GETBKCOLOR} {$define HAS_GETTEXTEXTENTEXPOINT} {$define HAS_DRAWFRAMECONTROL} {$i ../generic/stubs.inc} {$i ../generic/independentfunctions.inc} {$i ../generic/unicodefunctions.inc} function BitBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC; XSrc, YSrc: Integer; Rop: DWORD): Boolean; begin Result := GTKWidgetSet.StretchCopyArea(DestDC, X, Y, Width, Height, SrcDC, XSrc, YSrc, Width, Height, 0, XSrc, YSrc, Rop); end; function DrawFrameControl(DC: HDC; const Rect: TRect; uType, uState: LongWord): Boolean; begin Result := LCLIntf.DrawFrameControl(DC, Rect, uType, uState); end; function GetBkColor(DC:HDC):COLORREF; begin if GTKWidgetSet.IsValidDC(DC) then Result := TGtkDeviceContext(DC).CurrentBackColor.ColorRef else Result := CLR_INVALID; end; function GetTextExtentExPoint(DC: HDC; Str: PChar; Count, MaxWidth: Integer; MaxCount, PartialWidths: ObjPas.PInteger; var Size: TSize): BOOL; var lbearing, rbearing, width, ascent,descent: LongInt; UseFont : PGDKFont; IsDBCSFont: Boolean; NewCount,Accumulator,i: Integer; begin //based in lcl code Result := GTKWidgetSet.IsValidDC(DC); if Result then with TGtkDeviceContext(DC) do begin if (CurrentFont = nil) or (CurrentFont^.GDIFontObject = nil) then begin UseFont := GTKWidgetSet.GetDefaultGtkFont(false); end else begin UseFont := CurrentFont^.GDIFontObject; end; If UseFont = nil then DebugLn('WARNING: [TGtkWidgetSet.GetTextExtentPoint] Missing font') else begin descent:=0; { UpdateDCTextMetric(TDeviceContext(DC)); IsDBCSFont:=TDeviceContext(DC).DCTextMetric.IsDoubleByteChar; if IsDBCSFont then begin NewCount:=Count*2; if FExtUTF8OutCacheSize nil then begin Accumulator:=0; for i:= 0 to Count - 1 do begin Inc(Accumulator,gdk_char_width(UseFont,(Str+i)^)); PartialWidths[i]:=Accumulator; end; end; end; end; end; doublecmd-0.5.8/components/lclextensions/include/gtk/uses_lclext.inc0000644000175000017500000000001712014201074025007 0ustar alexxalexxuses GtkInt; doublecmd-0.5.8/components/lclextensions/include/qt/0000755000175000017500000000000012257501472021641 5ustar alexxalexxdoublecmd-0.5.8/components/lclextensions/include/qt/uses.inc0000644000175000017500000000011412014201074023271 0ustar alexxalexx InterfaceBase, LCLIntf, Graphics, qt4, qtint, qtobjects, qtwidgets, Math, doublecmd-0.5.8/components/lclextensions/include/qt/lclext.inc0000644000175000017500000000044712014201074023616 0ustar alexxalexxfunction DirectMaskBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC; XSrc, YSrc: Integer; Mask: HBITMAP): Boolean; begin //todo: see if is possible todo it faster Result := StretchMaskBlt(DestDC, X, Y, Width, Height, SrcDC, XSrc, YSrc, Width, Height, Mask, 0, 0, SRCCOPY); end; doublecmd-0.5.8/components/lclextensions/include/qt/delphicompat.inc0000644000175000017500000000367512014201074025002 0ustar alexxalexx { Qt Interface Initial implementation by Zeljan Rikalo } {$define HAS_GETBKCOLOR} {$define HAS_GETTEXTEXTENTEXPOINT} {$define HAS_GETTEXTALIGN} {$define HAS_GETWINDOWDC} {$define HAS_OFFSETRGN} {$define HAS_SETBRUSHORGEX} {$i ../generic/stubs.inc} {$i ../generic/independentfunctions.inc} {$i ../generic/unicodefunctions.inc} function GetBkColor(DC:HDC):COLORREF; var Color: PQColor; begin if QtWidgetSet.IsValidDC(DC) then begin Color := TQtDeviceContext(DC).BackgroundBrush.getColor; TQColorToColorRef(Color^, Result); end else Result := CLR_INVALID; end; function GetTextExtentExPoint(DC: HDC; Str: PChar; Count, MaxWidth: Integer; MaxCount, PartialWidths: PInteger; var Size: TSize): BOOL; begin Result := QtWidgetSet.GetTextExtentExPoint(DC, Str, Count, MaxWidth, MaxCount, PartialWidths, Size); end; function GetTextAlign(hDC:HDC): LongWord; var QtDC: TQtDeviceContext; QtFontMetrics: QFontMetricsH; QtFont: QFontH; begin Result := 0; if not QtWidgetSet.IsValidDC(hdC) then Exit; QtDC := TQtDeviceContext(hDC); QtFont := QtDC.vFont.FHandle; QtFontMetrics := QFontMetrics_create(QtFont); try {TODO: FIXME we should save somehow text flags into QtDC cause we don't have any function which returns current flags !} finally QFontMetrics_destroy(QtFontMetrics); end; end; function GetWindowDC(hWnd:HWND): HDC; begin Result := LCLIntf.GetDC(hWnd); end; function OffsetRgn(hrgn:HRGN; nxOffset, nYOffset:longint):longint; var Region: TQtRegion; begin Region := TQtRegion(hrgn); QRegion_translate(Region.FHandle, nxOffset, nYOffset); Result := Region.GetRegionType; end; function SetBrushOrgEx(DC:HDC; nXOrg, nYOrg:longint; lppt:PPOINT):Boolean; var QtDC: TQtDeviceContext; begin Result := False; if not QtWidgetSet.IsValidDC(DC) then Exit; QtDC := TQtDeviceContext(DC); if lppt <> nil then QtDC.getBrushOrigin(lppt); QtDC.setBrushOrigin(nXorg, nYOrg); Result := True; end; doublecmd-0.5.8/components/lclextensions/include/qt/uses_lclext.inc0000644000175000017500000000001712014201074024646 0ustar alexxalexxuses LclIntf;doublecmd-0.5.8/components/lclextensions/include/carbon/0000755000175000017500000000000012257501472022461 5ustar alexxalexxdoublecmd-0.5.8/components/lclextensions/include/carbon/uses.inc0000644000175000017500000000010212014201074024106 0ustar alexxalexx InterfaceBase, LCLIntf, Graphics, CarbonInt, CarbonCanvas, Math,doublecmd-0.5.8/components/lclextensions/include/carbon/lclext.inc0000644000175000017500000000044712014201074024436 0ustar alexxalexxfunction DirectMaskBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC; XSrc, YSrc: Integer; Mask: HBITMAP): Boolean; begin //todo: see if is possible todo it faster Result := StretchMaskBlt(DestDC, X, Y, Width, Height, SrcDC, XSrc, YSrc, Width, Height, Mask, 0, 0, SRCCOPY); end; doublecmd-0.5.8/components/lclextensions/include/carbon/delphicompat.inc0000644000175000017500000000071011751527542025627 0ustar alexxalexx { Carbon Interface Dummy implementation. Not tested. Waiting for someone with a Mac to implement it } { Only a few functions are necessary to compile VirtualTreeView: } {.$define HAS_GETTEXTEXTENTEXPOINT} {.$define HAS_GETTEXTALIGN} {.$define HAS_GETWINDOWDC} {.$define HAS_OFFSETRGN} {.$define HAS_SETBRUSHORGEX} {$i ../generic/stubs.inc} {$i ../generic/independentfunctions.inc} {$i ../generic/unicodefunctions.inc} doublecmd-0.5.8/components/lclextensions/include/carbon/uses_lclext.inc0000644000175000017500000000001712014201074025466 0ustar alexxalexxuses LclIntf;doublecmd-0.5.8/components/lclextensions/include/gtk2/0000755000175000017500000000000012257501472022064 5ustar alexxalexxdoublecmd-0.5.8/components/lclextensions/include/gtk2/uses.inc0000644000175000017500000000007712014201074023524 0ustar alexxalexx LCLIntf, Graphics, Gtk2Def, Gtk2Proc, Gtk2Int, pango, math, doublecmd-0.5.8/components/lclextensions/include/gtk2/lclext.inc0000644000175000017500000000047412014201074024041 0ustar alexxalexxfunction DirectMaskBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC; XSrc, YSrc: Integer; Mask: HBITMAP): Boolean; begin //todo: see if is possible todo it faster Result := GTK2WidgetSet.StretchCopyArea(DestDC, X, Y, Width, Height, SrcDC, XSrc, YSrc, Width, Height, Mask, XSrc, YSrc, SRCCOPY); end; doublecmd-0.5.8/components/lclextensions/include/gtk2/delphicompat.inc0000644000175000017500000000647712140233030025225 0ustar alexxalexx{ This file is part of Delphi Compatibility Unit Copyright (C) 2007 Luiz Américo Pereira Câmara pascalive@bol.com.br This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version with the following modification: As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules,and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. } {$MACRO ON} {$if lcl_fullversion > 1000000} {$define TGtk2DeviceContext:=TGtkDeviceContext} {$endif} {$define HAS_GETBKCOLOR} {$define HAS_GETTEXTEXTENTEXPOINT} {$i ../generic/stubs.inc} {$i ../generic/independentfunctions.inc} {$i ../generic/unicodefunctions.inc} procedure pango_extents_to_pixels (ink_rect: PPangoRectangle; logical_rect: PPangoRectangle); cdecl; external 'libpango-1.0.so.0'; function GetBkColor(DC:HDC):COLORREF; begin if GTK2WidgetSet.IsValidDC(DC) then Result := TGtkDeviceContext(DC).CurrentBackColor.ColorRef else Result := CLR_INVALID; end; function GetTextExtentExPoint(DC: HDC; Str: PChar; Count, MaxWidth: Integer; MaxCount, PartialWidths: PInteger; var Size: TSize): BOOL; var layout: PPangoLayout; i: Integer; Rect: TPangoRectangle; iter : PPangoLayoutIter; begin Result := GTK2WidgetSet.IsValidDC(DC); if Result then with TGtk2DeviceContext(DC) do begin if (CurrentFont = nil) or (CurrentFont^.GDIFontObject = nil) then layout := GTK2WidgetSet.GetDefaultGtkFont(false) else layout := CurrentFont^.GDIFontObject; pango_layout_set_text(layout, Str, Count); if PartialWidths = nil then pango_layout_get_pixel_size (layout, @Size.cx, @Size.cy) else begin i := 0; Size.cx := 0; Size.cy := 0; iter := pango_layout_get_iter(layout); repeat pango_layout_iter_get_char_extents(iter,@Rect); pango_extents_to_pixels(nil,@Rect); inc(Size.cx, Rect.Width); PartialWidths[i] := Size.cx; if Size.cy < Rect.Height then Size.cy := Rect.Height; inc(i); until not pango_layout_iter_next_char(iter); pango_layout_iter_free(iter); end; end; end; doublecmd-0.5.8/components/lclextensions/include/gtk2/uses_lclext.inc0000644000175000017500000000002012014201074025063 0ustar alexxalexxuses Gtk2Int; doublecmd-0.5.8/components/lclextensions/include/win32/0000755000175000017500000000000012257501472022157 5ustar alexxalexxdoublecmd-0.5.8/components/lclextensions/include/win32/uses.inc0000644000175000017500000000004212014201074023607 0ustar alexxalexx Windows, win32proc, CommCtrl, doublecmd-0.5.8/components/lclextensions/include/win32/lclext.inc0000644000175000017500000000200712014201074024126 0ustar alexxalexxfunction DirectMaskBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC; XSrc, YSrc: Integer; Mask: HBITMAP): Boolean; var MaskDC: HDC; MaskObj: HGDIOBJ; PrevTextColor, PrevBkColor: COLORREF; begin //this is a stripped version of LCL.StretchMaskBlt if Mask <> 0 then begin MaskDC := Windows.CreateCompatibleDC(DestDC); MaskObj := Windows.SelectObject(MaskDC, Mask); PrevTextColor := Windows.SetTextColor(DestDC, $00000000); PrevBkColor := Windows.SetBkColor(DestDC, $00FFFFFF); Windows.BitBlt(DestDC, X, Y, Width, Height, SrcDC, XSrc, YSrc, SRCINVERT); Windows.BitBlt(DestDC, X, Y, Width, Height, MaskDC, XSrc, YSrc, SRCAND); Windows.BitBlt(DestDC, X, Y, Width, Height, SrcDC, XSrc, YSrc, SRCINVERT); Windows.SetTextColor(DestDC, PrevTextColor); Windows.SetBkColor(DestDC, PrevBkColor); Windows.SelectObject(MaskDC, MaskObj); Windows.DeleteDC(MaskDC); end else Result := Windows.BitBlt(DestDC, X, Y, Width, Height, SrcDC, XSrc, YSrc, SRCCOPY); end; doublecmd-0.5.8/components/lclextensions/include/win32/delphicompat.inc0000644000175000017500000001275512014201074025317 0ustar alexxalexx { This file is part of Delphi Compatibility Unit Copyright (C) 2007 Luiz Américo Pereira Câmara pascalive@bol.com.br This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version with the following modification: As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules,and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. } function BeginDeferWindowPos(nNumWindows: longint): THandle; begin Result:=Windows.BeginDeferWindowPos(nNumWindows); end; function BitBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC; XSrc, YSrc: Integer; Rop: DWORD): Boolean; begin Result := Windows.BitBlt(DestDC, X, Y, Width, Height, SrcDC, XSrc, YSrc, Rop); end; function CopyImage(hImage: THANDLE; uType: LongWord; cxDesired, cyDesired: LongInt; fuFlags: LongWord): THandle; begin Result := Windows.CopyImage(hImage,uType,cxDesired,cyDesired,fuFlags); end; function CreatePatternBrush(hbmp: HBITMAP): HBRUSH; begin Result := Windows.CreatePatternBrush(hbmp); end; function DeferWindowPos(hWinPosInfo, hWnd, hWndInsertAfter: THandle; x, y, cx, cy: longint; uFlags: LongWord): THandle; begin Result := Windows.DeferWindowPos(hWinPosInfo,hWnd,hWndInsertAfter,x,y,cx,cy,uFlags); end; function DrawFrameControl(DC: HDC; const Rect: TRect; uType, uState: LongWord): Boolean; begin Result := Windows.DrawFrameControl(DC,Rect,uType,uState); end; function EndDeferWindowPos(hWinPosInfo: THandle): Boolean; begin Result:=Windows.EndDeferWindowPos(hWinPosInfo); end; function GdiFlush: Boolean; begin Result := Windows.GdiFlush; end; function GetACP: LongWord; begin Result := Windows.GetACP; end; function GetBkColor(DC: HDC): LCLType.COLORREF; begin Result := Windows.GetBkColor(DC); end; function GetDCEx(hWnd: HWND; hrgnClip: HRGN; flags: DWORD): HDC; begin Result := Windows.GetDCEx(hWnd,hrgnClip,flags); end; function GetKeyboardLayout(dwLayout: DWORD): THandle; begin Result := Windows.GetKeyboardLayout(dwLayout); end; function GetKeyboardState(lpKeyState: PBYTE): BOOLEAN; begin Result := Windows.GetKeyboardState(lpKeyState); end; function GetLocaleInfo(Locale, LCType: LongWord; lpLCData: PChar; cchData: longint): longint; begin Result := Windows.GetLocaleInfo(Locale,LCType,lpLCData,cchData); end; function GetRandomRgn(DC: HDC; Rgn: HRGN; iNum: Integer): Integer; stdcall; external 'GDI32.DLL'; function GetTextAlign(hDC: HDC): LongWord; begin Result := Windows.GetTextAlign(hDC); end; function GetTextExtentExPoint(DC: LCLType.HDC; Str: PChar; Count, MaxWidth: Integer; MaxCount, PartialWidths: ObjPas.PInteger; var Size: TSize): BOOL; begin Result := Windows.GetTextExtentExPoint(DC, Str, Count, MaxWidth, MaxCount, PartialWidths, Size); end; function GetTextExtentPoint32W(DC: HDC; Str: PWideChar; Count: Integer; out Size: TSize): Boolean; begin Result := Windows.GetTextExtentPointW(DC, Str, Count, Size); end; function GetWindowDC(hWnd: HWND): HDC; begin Result := Windows.GetWindowDC(hWnd); end; function ImageList_DragShowNolock(fShow: Boolean): Boolean; begin Result := CommCtrl.ImageList_DragShowNolock(fShow); end; function MapWindowPoints(hWndFrom, hWndTo: HWND; var lpPoints; cPoints: UINT ): Integer; begin Result:=Windows.MapWindowPoints(hWndFrom,hWndTo,lpPoints,cPoints); end; function MultiByteToWideChar(CodePage, dwFlags: DWORD; lpMultiByteStr: PChar; cchMultiByte: longint; lpWideCharStr: PWideChar; cchWideChar: longint ): longint; begin Result := Windows.MultiByteToWideChar(CodePage,dwFlags,lpMultiByteStr,cchMultiByte,lpWideCharStr,cchWideChar); end; function OffsetRgn(hrgn: HRGN; nxOffset, nYOffset: longint): longint; begin Result := Windows.OffsetRgn(hrgn,nxOffset,nYOffset); end; function SetBrushOrgEx(DC: LCLType.HDC; nXOrg, nYOrg: longint; lppt: Types.PPoint): Boolean; begin Result := Windows.SetBrushOrgEx(DC,nXOrg,nYOrg,lppt); end; function ScrollDC(DC: LCLType.HDC; dx: longint; dy: longint; var lprcScroll: Types.TRect; var lprcClip: Types.TRect; hrgnUpdate: LCLType.HRGN; lprcUpdate: Types.PRect): Boolean; begin Result := Windows.ScrollDC(DC, dx, dy, lprcScroll, lprcClip, hrgnUpdate, lprcUpdate); end; function ToAscii(uVirtKey, uScanCode: LongWord; lpKeyState: PBYTE; lpChar: PWORD; uFlags: LongWord): longint; begin Result := Windows.ToAscii(uVirtKey,uScanCode,lpKeyState,lpChar,uFlags); end; doublecmd-0.5.8/components/lclextensions/include/win32/uses_lclext.inc0000644000175000017500000000002412014201074025162 0ustar alexxalexx uses Windows; doublecmd-0.5.8/components/lclextensions/include/generic/0000755000175000017500000000000012257501472022631 5ustar alexxalexxdoublecmd-0.5.8/components/lclextensions/include/generic/independentfunctions.inc0000644000175000017500000000157112014201074027540 0ustar alexxalexx function MapWindowPoints(hWndFrom, hWndTo: HWND; var lpPoints; cPoints: UINT): Integer; var i: Integer; XOffset, YOffset: SmallInt; FromPoint, ToPoint: TPoint; begin FromPoint := Point(0, 0); ToPoint := Point(0, 0); if hWndFrom <> 0 then ClientToScreen(hWndFrom, FromPoint); if hWndTo <> 0 then ClientToScreen(hWndTo, ToPoint); XOffset := (FromPoint.X - ToPoint.X); YOffset := (FromPoint.Y - ToPoint.Y); for i := 0 to cPoints - 1 do begin PPoint(@lpPoints)[i].x := XOffset + PPoint(@lpPoints)[i].x; PPoint(@lpPoints)[i].y := YOffset + PPoint(@lpPoints)[i].y; end; Result := MakeLong(XOffset, YOffset); end; {$ifndef HAS_BITBLT} function BitBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC; XSrc, YSrc: Integer; Rop: DWORD): Boolean; begin Result := LCLIntf.BitBlt(DestDC, X, Y, Width, Height, SrcDC, XSrc, YSrc, Rop); end; {$endif} doublecmd-0.5.8/components/lclextensions/include/generic/unicodefunctions.inc0000644000175000017500000000202212014201074026661 0ustar alexxalexx { GetUTF8ByteCount returns the number of bytes necessary to hold the requested number of characters (count). Not necessarily the number of characters is equal to the widestring length but here we assume it to skip the extra overhead } //todo do a function that convert the str and the count at one pass function GetUTF8ByteCount(const UTF8Str: UTF8String; WideCount: Integer): Integer; var CharCount, CharLen, StrLen: Integer; P: PChar; begin Result := 0; CharCount := 0; P := PChar(UTF8Str); StrLen := Length(UTF8Str); WideCount := Min(WideCount, StrLen); while (CharCount < WideCount) do begin CharLen := UTF8CharacterLength(P); Inc(P, CharLen); Inc(Result, CharLen); Inc(CharCount); end; Result := Min(Result, StrLen); end; function GetTextExtentPoint32W(DC: HDC; Str: PWideChar; Count: Integer; out Size: TSize): Boolean; var TempStr: UTF8String; begin TempStr := UTF8Encode(WideString(Str)); Result := GetTextExtentPoint(DC, PChar(TempStr), GetUTF8ByteCount(TempStr, Count), Size); end; doublecmd-0.5.8/components/lclextensions/include/generic/stubs.inc0000644000175000017500000001036012140233030024443 0ustar alexxalexx function BeginDeferWindowPos(nNumWindows:longint):THandle; begin Result := 0; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; function CopyImage(hImage:THANDLE; uType:LongWord; cxDesired, cyDesired: LongInt; fuFlags:LongWord):THandle; begin Result := 0; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; function DeferWindowPos(hWinPosInfo, hWnd, hWndInsertAfter:THandle; x, y, cx, cy:longint; uFlags:LongWord):THandle; begin Result := 0; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; function EndDeferWindowPos(hWinPosInfo:THandle):Boolean; begin Result := False; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; function GdiFlush: Boolean; begin Result := False; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; function GetACP:LongWord; begin Result := 0; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; {$ifndef HAS_GETBKCOLOR} function GetBkColor(DC:HDC):COLORREF; begin Result := 0; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; {$endif} function GetDCEx(hWnd:HWND; hrgnClip:HRGN; flags:DWORD):HDC; begin Result := 0; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; function GetKeyboardLayout(dwLayout:DWORD):THandle; begin Result := 0; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; function GetKeyboardState(lpKeyState: System.PByte):BOOLEAN; begin Result := False; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; function GetLocaleInfo(Locale, LCType:LongWord; lpLCData:PChar; cchData:longint):longint; begin Result := 0; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; function GetRandomRgn(DC: HDC; Rgn: HRGN; iNum: Integer): Integer; stdcall; begin Result := 0; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; {$ifndef HAS_GETTEXTEXTENTEXPOINT} function GetTextExtentExPoint(DC: HDC; Str: PChar; Count, MaxWidth: Integer; MaxCount, PartialWidths: PInteger; var Size: TSize): BOOL; begin Result := LCLIntf.GetTextExtentExPoint(DC, Str, Count, MaxWidth, MaxCount, PartialWidths, Size); end; {$endif} {$ifndef HAS_GETTEXTALIGN} function GetTextAlign(hDC:HDC): LongWord; begin Result := 0; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; {$endif} {$ifndef HAS_GETWINDOWDC} function GetWindowDC(hWnd:HWND):HDC; begin Result := 0; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; {$endif} function ImageList_DragShowNolock(fShow: Boolean): Boolean; begin Result := False; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; function MultiByteToWideChar(CodePage, dwFlags:DWORD; lpMultiByteStr:PChar; cchMultiByte:longint; lpWideCharStr:PWideChar;cchWideChar:longint):longint; begin Result := 0; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; {$ifndef HAS_OFFSETRGN} function OffsetRgn(hrgn:HRGN; nxOffset, nYOffset:longint):longint; begin Result := 0; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; {$endif} function ScrollDC(DC:HDC; dx:longint; dy:longint; var lprcScroll:TRECT; var lprcClip:TRECT;hrgnUpdate:HRGN; lprcUpdate:PRECT):Boolean; begin Result := False; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; {$ifndef HAS_SETBRUSHORGEX} function SetBrushOrgEx(DC:HDC; nXOrg, nYOrg:longint; lppt:PPOINT):Boolean; begin Result := False; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; {$endif} function ToAscii(uVirtKey, uScanCode:LongWord; lpKeyState: System.PByte; lpChar: System.PWord; uFlags:LongWord):longint; begin Result := 0; {$ifdef DEBUG_DELPHICOMPAT} Logger.SendCallStack('Dummy WinAPI Implementation'); {$endif} end; doublecmd-0.5.8/components/lclextensions/oleutils.pas0000644000175000017500000001062312014201074022123 0ustar alexxalexxunit oleutils; { OLE helper functions Copyright (C) 2007 Luiz Amrico Pereira Cmara pascalive@bol.com.br This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version with the following modification: As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules,and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. } //todo: add error handling {$mode objfpc}{$H+} interface {$ifdef Windows} uses Windows, Classes, SysUtils, ActiveX; type { TOLEStream } TOLEStream = class (TStream) private FSrcStream: IStream; procedure InternalSetSize(NewSize: LARGE_INTEGER); public constructor Create(const Stream: IStream); function Read(var Buffer; Count: Integer): Integer; override; function Seek(Offset: Integer; Origin: Word): Integer; overload; override; procedure SetSize(const NewSize: Int64); override; procedure SetSize(NewSize: Longint); override; function Write(const Buffer; Count: Integer): Integer; override; end; {$endif} implementation {$ifdef Windows} function ErrorString(Error: HRESULT): String; begin case Error of E_PENDING: Result:='E_PENDING'; S_FALSE: Result:='S_FALSE'; STG_E_MEDIUMFULL: Result:='STG_E_MEDIUMFULL'; STG_E_ACCESSDENIED: Result:= 'STG_E_ACCESSDENIED'; STG_E_CANTSAVE: Result:='STG_E_CANTSAVE'; STG_E_INVALIDPOINTER: Result:='STG_E_INVALIDPOINTER'; STG_E_REVERTED: Result:='STG_E_REVERTED'; STG_E_WRITEFAULT: Result:='STG_E_WRITEFAULT'; STG_E_INVALIDFUNCTION: Result:='STG_E_INVALIDFUNCTION'; else Result:='Unknow error'; end; end; { TOLEStream } constructor TOLEStream.Create(const Stream: IStream); begin inherited Create; FSrcStream:=Stream; end; function TOLEStream.Read(var Buffer; Count: Integer): Integer; var Res: HRESULT; begin Res:=FSrcStream.Read(@Buffer, Count, @Result); if Res <> S_OK then Raise Exception.Create('TOLEStream - Error while reading: '+ErrorString(Res)); end; function TOLEStream.Seek(Offset: Integer; Origin: Word): Integer; var liResult, liOffset : LARGE_INTEGER; Res: HRESULT; begin //soFrom* constants are equal to STREAM_SEEK_* constants. Assume it here liOffset.LowPart:=Offset; liOffset.HighPart:=0; Res:=FSrcStream.Seek(Int64(liOffset), Origin, Int64(liResult)); Result:=liResult.LowPart; if Res <> S_OK then Raise Exception.Create('TOLEStream - Error while seeking: '+ErrorString(Res)); end; procedure TOLEStream.SetSize(NewSize: Longint); var liSize: LARGE_INTEGER; begin liSize.LowPart:=NewSize; liSize.HighPart:=0; InternalSetSize(liSize); end; procedure TOLEStream.SetSize(const NewSize: Int64); var liSize: LARGE_INTEGER; begin liSize.QuadPart:=NewSize; InternalSetSize(liSize); end; procedure TOLEStream.InternalSetSize(NewSize: LARGE_INTEGER); var Res:HRESULT; begin Res:=FSrcStream.SetSize(Int64(NewSize)); if Res <> S_OK then Raise Exception.Create('TOLEStream - Error while setting size: '+ErrorString(Res)); end; function TOLEStream.Write(const Buffer; Count: Integer): Integer; var Res: HRESULT; begin Res:=FSrcStream.Write(@Buffer,Count,@Result); if Res <> S_OK then Raise Exception.Create('TOLEStream - Error while writing: '+ErrorString(Res)); end; {$endif} end. doublecmd-0.5.8/components/lclextensions/lclextensions_package_doublecmd.lpk0000644000175000017500000000350411751527542026673 0ustar alexxalexx doublecmd-0.5.8/components/lclextensions/lclextensions_package_doublecmd.pas0000644000175000017500000000056512014201074026652 0ustar alexxalexx{ This file was automatically created by Lazarus. Do not edit! This source is only used to compile and install the package. } unit lclextensions_package_doublecmd; interface uses DelphiCompat, oleutils, LclExt, LazarusPackageIntf; implementation procedure Register; begin end; initialization RegisterPackage('lclextensions_package_doublecmd', @Register); end. doublecmd-0.5.8/components/lclextensions/lclext.pas0000644000175000017500000000350712014201074021561 0ustar alexxalexxunit LclExt; { LCL Extension Unit Copyright (C) 2007 Luiz Américo Pereira Câmara pascalive@bol.com.br This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version with the following modification: As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules,and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. } {$mode objfpc}{$H+} interface uses Classes, SysUtils, LCLType, Graphics; function DirectMaskBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC; XSrc, YSrc: Integer; Mask: HBITMAP): Boolean; implementation {$i uses_lclext.inc} {$i lclext.inc} end. doublecmd-0.5.8/components/lclextensions/delphicompat.pas0000644000175000017500000001071012014201074022731 0ustar alexxalexxunit DelphiCompat; { Delphi Compatibility Unit Copyright (C) 2007 Luiz Amrico Pereira Cmara pascalive@bol.com.br This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version with the following modification: As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules,and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. } {$mode objfpc}{$H+} {.$define DEBUG_DELPHICOMPAT} interface uses LMessages, Types, LCLType, Classes; const //Messages WM_GETDLGCODE = LM_GETDLGCODE; WM_ERASEBKGND = LM_ERASEBKGND; WM_VSCROLL = LM_VSCROLL; WM_HSCROLL = LM_HSCROLL; WM_CHAR = LM_CHAR; WM_KEYDOWN = LM_KEYDOWN; WM_KEYUP = LM_KEYUP; WM_KILLFOCUS = LM_KILLFOCUS; WM_SIZE = LM_SIZE; WM_LBUTTONDBLCLK = LM_LBUTTONDBLCLK; WM_LBUTTONDOWN = LM_LBUTTONDOWN; type //TWM* types TMessage = TLMessage; TWMHScroll = TLMHScroll; TWMVScroll = TLMVScroll; TWMChar = TLMChar; TWMKeyDown = TLMKeyDown; TWMKeyUp = TLMKeyUp; TWMKillFocus = TLMKillFocus; TWMSize = TLMSize; TWMLButtonDblClk = TLMLButtonDblClk; TWMMeasureItem = TLMMeasureItem; TWMDrawItem = TLMDrawItems; function BeginDeferWindowPos(nNumWindows: LongInt):THandle; function BitBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC; XSrc, YSrc: Integer; Rop: DWORD): Boolean; function CopyImage(hImage: THandle; uType:LongWord; cxDesired, cyDesired: LongInt; fuFlags:LongWord):THandle; function DeferWindowPos(hWinPosInfo, hWnd, hWndInsertAfter:THandle; x, y, cx, cy:longint; uFlags:LongWord):THandle; function EndDeferWindowPos(hWinPosInfo:THandle):Boolean; function GdiFlush: Boolean; function GetACP:LongWord; function GetBkColor(DC:HDC):COLORREF; function GetDCEx(hWnd:HWND; hrgnClip:HRGN; flags:DWORD):HDC; function GetKeyboardLayout(dwLayout:DWORD):THandle; function GetKeyboardState(lpKeyState:PBYTE):BOOLEAN; function GetLocaleInfo(Locale, LCType:LongWord; lpLCData:PChar; cchData:longint):longint; function GetRandomRgn(DC: HDC; Rgn: HRGN; iNum: Integer): Integer; stdcall; function GetTextAlign(hDC:HDC): LongWord; function GetTextExtentExPoint(DC: HDC; Str: PChar; Count, MaxWidth: Integer; MaxCount, PartialWidths: PInteger; var Size: TSize): BOOL; function GetTextExtentPoint32W(DC: HDC; Str: PWideChar; Count: Integer; out Size: TSize): Boolean; function GetWindowDC(hWnd:HWND):HDC; function ImageList_DragShowNolock(fShow: Boolean): Boolean; function MapWindowPoints(hWndFrom, hWndTo: HWND; var lpPoints; cPoints: UINT): Integer; function MultiByteToWideChar(CodePage, dwFlags:DWORD; lpMultiByteStr:PChar; cchMultiByte:longint; lpWideCharStr:PWideChar;cchWideChar:longint):longint; function OffsetRgn(hrgn:HRGN; nxOffset, nYOffset:longint):longint; function ScrollDC(DC:HDC; dx:longint; dy:longint; var lprcScroll:TRECT; var lprcClip:TRECT;hrgnUpdate:HRGN; lprcUpdate:PRECT):Boolean; function SetBrushOrgEx(DC:HDC; nXOrg, nYOrg:longint; lppt:PPOINT):Boolean; function ToAscii(uVirtKey, uScanCode:LongWord; lpKeyState: PByte; lpChar: PWord; uFlags:LongWord): LongInt; implementation uses {$i uses.inc} LCLProc, Controls {$ifdef DEBUG_DELPHICOMPAT} ,multiloglcl, filechannel {$endif} ; {$ifdef DEBUG_DELPHICOMPAT} const //Logger classes lcInfo = 0; lcStack = 1; var Logger: TLCLLogger; {$endif} {$i delphicompat.inc} end. doublecmd-0.5.8/components/lclextensions/readme.txt0000644000175000017500000000016712014201074021556 0ustar alexxalexxlclextensions v0.4 http://code.google.com/p/luipack/ Some modifications done so that it only compiles VirtualTreeView.doublecmd-0.5.8/components/build.sh0000755000175000017500000000152712162610121016326 0ustar alexxalexx#!/bin/sh # Compiling components # This script run from main build.sh script # If you run it direct, set up $lazbuild first # Rebuild widget dependent packages if [ -d /usr/lib/lazarus/default ] then $lazbuild /usr/lib/lazarus/default/components/lazcontrols/lazcontrols.lpk $DC_ARCH -B $lazbuild /usr/lib/lazarus/default/components/synedit/synedit.lpk $DC_ARCH -B $lazbuild /usr/lib/lazarus/default/ideintf/ideintf.lpk $DC_ARCH -B fi # Build components basedir=$(pwd) cd components $lazbuild chsdet/chsdet.lpk $DC_ARCH $lazbuild CmdLine/cmdbox.lpk $DC_ARCH $lazbuild dcpcrypt/dcpcrypt.lpk $DC_ARCH $lazbuild doublecmd/doublecmd_common.lpk $DC_ARCH $lazbuild KASToolBar/kascomp.lpk $DC_ARCH $lazbuild viewer/viewerpackage.lpk $DC_ARCH $lazbuild gifanim/pkg_gifanim.lpk $DC_ARCH $lazbuild ZVDateTimeCtrls/zvdatetimectrls.lpk $DC_ARCH cd $basedir doublecmd-0.5.8/components/virtualtreeview/0000755000175000017500000000000012257501472020141 5ustar alexxalexxdoublecmd-0.5.8/components/virtualtreeview/include/0000755000175000017500000000000012257501472021564 5ustar alexxalexxdoublecmd-0.5.8/components/virtualtreeview/include/intf/0000755000175000017500000000000012257501472022524 5ustar alexxalexxdoublecmd-0.5.8/components/virtualtreeview/include/intf/gtk/0000755000175000017500000000000012257501472023311 5ustar alexxalexxdoublecmd-0.5.8/components/virtualtreeview/include/intf/gtk/vtgraphicsi.inc0000644000175000017500000000376612014201074026325 0ustar alexxalexxuses gtkdef, gtkint, CairoXlib, gdk, Cairo, glib; //procedure gdk_drawable_get_size(drawable: PGdkDrawable; width, height: Pgint); cdecl; external gdkdll; procedure AlphaBlend(Source, Destination: HDC; const R: TRect; const Target: TPoint; Mode: TBlendMode; ConstantAlpha, Bias: Integer); function CreateSurface(GtkDC: TGtkDeviceContext): Pcairo_surface_t; var Width, Height: gint; Visual: PGdkVisual; begin Result := nil; if (GtkDC <> nil) and (GtkDC.Drawable <> nil) then begin gdk_window_get_size(GtkDC.Drawable, @Width, @Height); Visual := gdk_visual_get_system; Result := cairo_xlib_surface_create( GDK_WINDOW_XDISPLAY(PGdkWindowPrivate(GtkDC.Drawable)), GDK_WINDOW_XWINDOW(PGdkWindowPrivate(GtkDC.Drawable)), GDK_VISUAL_XVISUAL(PGdkVisualPrivate(Visual)), Width, Height); end; end; var SrcDC: TGtkDeviceContext absolute Source; DestDC: TGtkDeviceContext absolute Destination; SrcSurface, DestSurface: Pcairo_surface_t; SrcContext, DestContext: Pcairo_t; begin case Mode of bmConstantAlpha:; bmPerPixelAlpha:; bmMasterAlpha:; bmConstantAlphaAndColor: begin DestSurface := CreateSurface(DestDC); if DestSurface <> nil then begin DestContext := cairo_create(DestSurface); cairo_set_source_rgba(DestContext, (Bias and $000000FF) / 255, ((Bias shr 8) and $000000FF) / 255, ((Bias shr 16) and $000000FF) / 255, ConstantAlpha / 255 ); cairo_rectangle(DestContext, R.Left + Target.x, R.Top + Target.y, R.Right - R.Left, R.Bottom - R.Top); cairo_fill(DestContext); cairo_destroy(DestContext); cairo_surface_destroy(DestSurface); end; end; end; end; function CalculateScanline(Bits: Pointer; Width, Height, Row: Integer): Pointer; begin Result := nil; end; function GetBitmapBitsFromBitmap(Bitmap: HBITMAP): Pointer; begin Result := nil; end; doublecmd-0.5.8/components/virtualtreeview/include/intf/gtk/vtvdragmanager.inc0000644000175000017500000000003612014201074026775 0ustar alexxalexx {$i ../dummydragmanager.inc} doublecmd-0.5.8/components/virtualtreeview/include/intf/gtk/olemethods.inc0000644000175000017500000000003512014201074026127 0ustar alexxalexx {$i ../dummyolemethods.inc} doublecmd-0.5.8/components/virtualtreeview/include/intf/qt/0000755000175000017500000000000012257501472023150 5ustar alexxalexxdoublecmd-0.5.8/components/virtualtreeview/include/intf/qt/vtgraphicsi.inc0000644000175000017500000010524112140233030026150 0ustar alexxalexxuses qt4, qtobjects; {$ASMMODE INTEL} procedure AlphaBlendLineConstant(Source, Destination: Pointer; Count: Integer; ConstantAlpha, Bias: Integer); // Blends a line of Count pixels from Source to Destination using a constant alpha value. // The layout of a pixel must be BGRA where A is ignored (but is calculated as the other components). // ConstantAlpha must be in the range 0..255 where 0 means totally transparent (destination pixel only) // and 255 totally opaque (source pixel only). // Bias is an additional value which gets added to every component and must be in the range -128..127 asm {$ifdef CPU64} //windows // RCX contains Source // RDX contains Destination // R8D contains Count // R9D contains ConstantAlpha // Bias is on the stack //non windows // RDI contains Source // RSI contains Destination // EDX contains Count // ECX contains ConstantAlpha // R8D contains Bias //.NOFRAME // Load XMM3 with the constant alpha value (replicate it for every component). // Expand it to word size. {$ifdef windows} MOVD XMM3, R9D // ConstantAlpha {$else} MOVD XMM3, ECX // ConstantAlpha {$endif} PUNPCKLWD XMM3, XMM3 PUNPCKLDQ XMM3, XMM3 // Load XMM5 with the bias value. {$ifdef windows} MOVD XMM5, [Bias] {$else} MOVD XMM5, R8D //Bias {$endif} PUNPCKLWD XMM5, XMM5 PUNPCKLDQ XMM5, XMM5 // Load XMM4 with 128 to allow for saturated biasing. MOV R10D, 128 MOVD XMM4, R10D PUNPCKLWD XMM4, XMM4 PUNPCKLDQ XMM4, XMM4 @1: // The pixel loop calculates an entire pixel in one run. // Note: The pixel byte values are expanded into the higher bytes of a word due // to the way unpacking works. We compensate for this with an extra shift. {$ifdef windows} MOVD XMM1, DWORD PTR [RCX] // data is unaligned MOVD XMM2, DWORD PTR [RDX] // data is unaligned {$else} MOVD XMM1, DWORD PTR [RDI] // data is unaligned MOVD XMM2, DWORD PTR [RSI] // data is unaligned {$endif} PXOR XMM0, XMM0 // clear source pixel register for unpacking PUNPCKLBW XMM0, XMM1{[RCX]} // unpack source pixel byte values into words PSRLW XMM0, 8 // move higher bytes to lower bytes PXOR XMM1, XMM1 // clear target pixel register for unpacking PUNPCKLBW XMM1, XMM2{[RDX]} // unpack target pixel byte values into words MOVQ XMM2, XMM1 // make a copy of the shifted values, we need them again PSRLW XMM1, 8 // move higher bytes to lower bytes // calculation is: target = (alpha * (source - target) + 256 * target) / 256 PSUBW XMM0, XMM1 // source - target PMULLW XMM0, XMM3 // alpha * (source - target) PADDW XMM0, XMM2 // add target (in shifted form) PSRLW XMM0, 8 // divide by 256 // Bias is accounted for by conversion of range 0..255 to -128..127, // doing a saturated add and convert back to 0..255. PSUBW XMM0, XMM4 PADDSW XMM0, XMM5 PADDW XMM0, XMM4 PACKUSWB XMM0, XMM0 // convert words to bytes with saturation {$ifdef windows} MOVD DWORD PTR [RDX], XMM0 // store the result {$else} MOVD DWORD PTR [RSI], XMM0 // store the result {$endif} @3: {$ifdef windows} ADD RCX, 4 ADD RDX, 4 DEC R8D {$else} ADD RDI, 4 ADD RSI, 4 DEC EDX {$endif} JNZ @1 {$else} // EAX contains Source // EDX contains Destination // ECX contains Count // ConstantAlpha and Bias are on the stack PUSH ESI // save used registers PUSH EDI MOV ESI, EAX // ESI becomes the actual source pointer MOV EDI, EDX // EDI becomes the actual target pointer // Load MM6 with the constant alpha value (replicate it for every component). // Expand it to word size. MOV EAX, [ConstantAlpha] DB $0F, $6E, $F0 /// MOVD MM6, EAX DB $0F, $61, $F6 /// PUNPCKLWD MM6, MM6 DB $0F, $62, $F6 /// PUNPCKLDQ MM6, MM6 // Load MM5 with the bias value. MOV EAX, [Bias] DB $0F, $6E, $E8 /// MOVD MM5, EAX DB $0F, $61, $ED /// PUNPCKLWD MM5, MM5 DB $0F, $62, $ED /// PUNPCKLDQ MM5, MM5 // Load MM4 with 128 to allow for saturated biasing. MOV EAX, 128 DB $0F, $6E, $E0 /// MOVD MM4, EAX DB $0F, $61, $E4 /// PUNPCKLWD MM4, MM4 DB $0F, $62, $E4 /// PUNPCKLDQ MM4, MM4 @1: // The pixel loop calculates an entire pixel in one run. // Note: The pixel byte values are expanded into the higher bytes of a word due // to the way unpacking works. We compensate for this with an extra shift. DB $0F, $EF, $C0 /// PXOR MM0, MM0, clear source pixel register for unpacking DB $0F, $60, $06 /// PUNPCKLBW MM0, [ESI], unpack source pixel byte values into words DB $0F, $71, $D0, $08 /// PSRLW MM0, 8, move higher bytes to lower bytes DB $0F, $EF, $C9 /// PXOR MM1, MM1, clear target pixel register for unpacking DB $0F, $60, $0F /// PUNPCKLBW MM1, [EDI], unpack target pixel byte values into words DB $0F, $6F, $D1 /// MOVQ MM2, MM1, make a copy of the shifted values, we need them again DB $0F, $71, $D1, $08 /// PSRLW MM1, 8, move higher bytes to lower bytes // calculation is: target = (alpha * (source - target) + 256 * target) / 256 DB $0F, $F9, $C1 /// PSUBW MM0, MM1, source - target DB $0F, $D5, $C6 /// PMULLW MM0, MM6, alpha * (source - target) DB $0F, $FD, $C2 /// PADDW MM0, MM2, add target (in shifted form) DB $0F, $71, $D0, $08 /// PSRLW MM0, 8, divide by 256 // Bias is accounted for by conversion of range 0..255 to -128..127, // doing a saturated add and convert back to 0..255. DB $0F, $F9, $C4 /// PSUBW MM0, MM4 DB $0F, $ED, $C5 /// PADDSW MM0, MM5 DB $0F, $FD, $C4 /// PADDW MM0, MM4 DB $0F, $67, $C0 /// PACKUSWB MM0, MM0, convert words to bytes with saturation DB $0F, $7E, $07 /// MOVD [EDI], MM0, store the result @3: ADD ESI, 4 ADD EDI, 4 DEC ECX JNZ @1 POP EDI POP ESI {$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure AlphaBlendLinePerPixel(Source, Destination: Pointer; Count, Bias: Integer); // Blends a line of Count pixels from Source to Destination using the alpha value of the source pixels. // The layout of a pixel must be BGRA. // Bias is an additional value which gets added to every component and must be in the range -128..127 asm {$ifdef CPU64} //windows // RCX contains Source // RDX contains Destination // R8D contains Count // R9D contains Bias //non windows // RDI contains Source // RSI contains Destination // EDX contains Count // ECX contains Bias //.NOFRAME // Load XMM5 with the bias value. {$ifdef windows} MOVD XMM5, R9D // Bias {$else} MOVD XMM5, ECX // Bias {$endif} PUNPCKLWD XMM5, XMM5 PUNPCKLDQ XMM5, XMM5 // Load XMM4 with 128 to allow for saturated biasing. MOV R10D, 128 MOVD XMM4, R10D PUNPCKLWD XMM4, XMM4 PUNPCKLDQ XMM4, XMM4 @1: // The pixel loop calculates an entire pixel in one run. // Note: The pixel byte values are expanded into the higher bytes of a word due // to the way unpacking works. We compensate for this with an extra shift. {$ifdef windows} MOVD XMM1, DWORD PTR [RCX] // data is unaligned MOVD XMM2, DWORD PTR [RDX] // data is unaligned {$else} MOVD XMM1, DWORD PTR [RDI] // data is unaligned MOVD XMM2, DWORD PTR [RSI] // data is unaligned {$endif} PXOR XMM0, XMM0 // clear source pixel register for unpacking PUNPCKLBW XMM0, XMM1{[RCX]} // unpack source pixel byte values into words PSRLW XMM0, 8 // move higher bytes to lower bytes PXOR XMM1, XMM1 // clear target pixel register for unpacking PUNPCKLBW XMM1, XMM2{[RDX]} // unpack target pixel byte values into words MOVQ XMM2, XMM1 // make a copy of the shifted values, we need them again PSRLW XMM1, 8 // move higher bytes to lower bytes // Load XMM3 with the source alpha value (replicate it for every component). // Expand it to word size. MOVQ XMM3, XMM0 PUNPCKHWD XMM3, XMM3 PUNPCKHDQ XMM3, XMM3 // calculation is: target = (alpha * (source - target) + 256 * target) / 256 PSUBW XMM0, XMM1 // source - target PMULLW XMM0, XMM3 // alpha * (source - target) PADDW XMM0, XMM2 // add target (in shifted form) PSRLW XMM0, 8 // divide by 256 // Bias is accounted for by conversion of range 0..255 to -128..127, // doing a saturated add and convert back to 0..255. PSUBW XMM0, XMM4 PADDSW XMM0, XMM5 PADDW XMM0, XMM4 PACKUSWB XMM0, XMM0 // convert words to bytes with saturation {$ifdef windows} MOVD DWORD PTR [RDX], XMM0 // store the result {$else} MOVD DWORD PTR [RSI], XMM0 // store the result {$endif} @3: {$ifdef windows} ADD RCX, 4 ADD RDX, 4 DEC R8D {$else} ADD RDI, 4 ADD RSI, 4 DEC EDX {$endif} JNZ @1 {$else} // EAX contains Source // EDX contains Destination // ECX contains Count // Bias is on the stack PUSH ESI // save used registers PUSH EDI MOV ESI, EAX // ESI becomes the actual source pointer MOV EDI, EDX // EDI becomes the actual target pointer // Load MM5 with the bias value. MOV EAX, [Bias] DB $0F, $6E, $E8 /// MOVD MM5, EAX DB $0F, $61, $ED /// PUNPCKLWD MM5, MM5 DB $0F, $62, $ED /// PUNPCKLDQ MM5, MM5 // Load MM4 with 128 to allow for saturated biasing. MOV EAX, 128 DB $0F, $6E, AlphaBlendLineConstant$E0 /// MOVD MM4, EAX DB $0F, $61, $E4 /// PUNPCKLWD MM4, MM4 DB $0F, $62, $E4 /// PUNPCKLDQ MM4, MM4 @1: // The pixel loop calculates an entire pixel in one run. // Note: The pixel byte values are expanded into the higher bytes of a word due // to the way unpacking works. We compensate for this with an extra shift. DB $0F, $EF, $C0 /// PXOR MM0, MM0, clear source pixel register for unpacking DB $0F, $60, $06 /// PUNPCKLBW MM0, [ESI], unpack source pixel byte values into words DB $0F, $71, $D0, $08 /// PSRLW MM0, 8, move higher bytes to lower bytes DB $0F, $EF, $C9 /// PXOR MM1, MM1, clear target pixel register for unpacking DB $0F, $60, $0F /// PUNPCKLBW MM1, [EDI], unpack target pixel byte values into words DB $0F, $6F, $D1 /// MOVQ MM2, MM1, make a copy of the shifted values, we need them again DB $0F, $71, $D1, $08 /// PSRLW MM1, 8, move higher bytes to lower bytes // Load MM6 with the source alpha value (replicate it for every component). // Expand it to word size. DB $0F, $6F, $F0 /// MOVQ MM6, MM0 DB $0F, $69, $F6 /// PUNPCKHWD MM6, MM6 DB $0F, $6A, $F6 /// PUNPCKHDQ MM6, MM6 // calculation is: target = (alpha * (source - target) + 256 * target) / 256 DB $0F, $F9, $C1 /// PSUBW MM0, MM1, source - target DB $0F, $D5, $C6 /// PMULLW MM0, MM6, alpha * (source - target) DB $0F, $FD, $C2 /// PADDW MM0, MM2, add target (in shifted form) DB $0F, $71, $D0, $08 /// PSRLW MM0, 8, divide by 256 // Bias is accounted for by conversion of range 0..255 to -128..127, // doing a saturated add and convert back to 0..255. DB $0F, $F9, $C4 /// PSUBW MM0, MM4 DB $0F, $ED, $C5 /// PADDSW MM0, MM5 DB $0F, $FD, $C4 /// PADDW MM0, MM4 DB $0F, $67, $C0 /// PACKUSWB MM0, MM0, convert words to bytes with saturation DB $0F, $7E, $07 /// MOVD [EDI], MM0, store the result @3: ADD ESI, 4 ADD EDI, 4 DEC ECX JNZ @1 POP EDI POP ESI {$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure AlphaBlendLineMaster(Source, Destination: Pointer; Count: Integer; ConstantAlpha, Bias: Integer); // Blends a line of Count pixels from Source to Destination using the source pixel and a constant alpha value. // The layout of a pixel must be BGRA. // ConstantAlpha must be in the range 0..255. // Bias is an additional value which gets added to every component and must be in the range -128..127 asm {$ifdef CPU64} //windows // RCX contains Source // RDX contains Destination // R8D contains Count // R9D contains ConstantAlpha // Bias is on the stack //non windows // RDI contains Source // RSI contains Destination // EDX contains Count // ECX contains ConstantAlpha // R8D contains Bias //.SAVENV XMM6 //todo see how implement in fpc // Load XMM3 with the constant alpha value (replicate it for every component). // Expand it to word size. {$ifdef windows} MOVD XMM3, R9D // ConstantAlpha {$else} MOVD XMM3, ECX // ConstantAlpha {$endif} PUNPCKLWD XMM3, XMM3 PUNPCKLDQ XMM3, XMM3 // Load XMM5 with the bias value. {$ifdef windows} MOV R10D, [Bias] MOVD XMM5, R10D {$else} MOVD XMM5, R8D {$endif} PUNPCKLWD XMM5, XMM5 PUNPCKLDQ XMM5, XMM5 // Load XMM4 with 128 to allow for saturated biasing. MOV R10D, 128 MOVD XMM4, R10D PUNPCKLWD XMM4, XMM4 PUNPCKLDQ XMM4, XMM4 @1: // The pixel loop calculates an entire pixel in one run. // Note: The pixel byte values are expanded into the higher bytes of a word due // to the way unpacking works. We compensate for this with an extra shift. {$ifdef windows} MOVD XMM1, DWORD PTR [RCX] // data is unaligned MOVD XMM2, DWORD PTR [RDX] // data is unaligned {$else} MOVD XMM1, DWORD PTR [RDI] // data is unaligned MOVD XMM2, DWORD PTR [RSI] // data is unaligned {$endif} PXOR XMM0, XMM0 // clear source pixel register for unpacking PUNPCKLBW XMM0, XMM1{[RCX]} // unpack source pixel byte values into words PSRLW XMM0, 8 // move higher bytes to lower bytes PXOR XMM1, XMM1 // clear target pixel register for unpacking PUNPCKLBW XMM1, XMM2{[RCX]} // unpack target pixel byte values into words MOVQ XMM2, XMM1 // make a copy of the shifted values, we need them again PSRLW XMM1, 8 // move higher bytes to lower bytes // Load XMM6 with the source alpha value (replicate it for every component). // Expand it to word size. MOVQ XMM6, XMM0 PUNPCKHWD XMM6, XMM6 PUNPCKHDQ XMM6, XMM6 PMULLW XMM6, XMM3 // source alpha * master alpha PSRLW XMM6, 8 // divide by 256 // calculation is: target = (alpha * master alpha * (source - target) + 256 * target) / 256 PSUBW XMM0, XMM1 // source - target PMULLW XMM0, XMM6 // alpha * (source - target) PADDW XMM0, XMM2 // add target (in shifted form) PSRLW XMM0, 8 // divide by 256 // Bias is accounted for by conversion of range 0..255 to -128..127, // doing a saturated add and convert back to 0..255. PSUBW XMM0, XMM4 PADDSW XMM0, XMM5 PADDW XMM0, XMM4 PACKUSWB XMM0, XMM0 // convert words to bytes with saturation {$ifdef windows} MOVD DWORD PTR [RDX], XMM0 // store the result {$else} MOVD DWORD PTR [RSI], XMM0 // store the result {$endif} @3: {$ifdef windows} ADD RCX, 4 ADD RDX, 4 DEC R8D {$else} ADD RDI, 4 ADD RSI, 4 DEC EDX {$endif} JNZ @1 {$else} // EAX contains Source // EDX contains Destination // ECX contains Count // ConstantAlpha and Bias are on the stack PUSH ESI // save used registers PUSH EDI MOV ESI, EAX // ESI becomes the actual source pointer MOV EDI, EDX // EDI becomes the actual target pointer // Load MM6 with the constant alpha value (replicate it for every component). // Expand it to word size. MOV EAX, [ConstantAlpha] DB $0F, $6E, $F0 /// MOVD MM6, EAX DB $0F, $61, $F6 /// PUNPCKLWD MM6, MM6 DB $0F, $62, $F6 /// PUNPCKLDQ MM6, MM6 // Load MM5 with the bias value. MOV EAX, [Bias] DB $0F, $6E, $E8 /// MOVD MM5, EAX DB $0F, $61, $ED /// PUNPCKLWD MM5, MM5 DB $0F, $62, $ED /// PUNPCKLDQ MM5, MM5 // Load MM4 with 128 to allow for saturated biasing. MOV EAX, 128 DB $0F, $6E, $E0 /// MOVD MM4, EAX DB $0F, $61, $E4 /// PUNPCKLWD MM4, MM4 DB $0F, $62, $E4 /// PUNPCKLDQ MM4, MM4 @1: // The pixel loop calculates an entire pixel in one run. // Note: The pixel byte values are expanded into the higher bytes of a word due // to the way unpacking works. We compensate for this with an extra shift. DB $0F, $EF, $C0 /// PXOR MM0, MM0, clear source pixel register for unpacking DB $0F, $60, $06 /// PUNPCKLBW MM0, [ESI], unpack source pixel byte values into words DB $0F, $71, $D0, $08 /// PSRLW MM0, 8, move higher bytes to lower bytes DB $0F, $EF, $C9 /// PXOR MM1, MM1, clear target pixel register for unpacking DB $0F, $60, $0F /// PUNPCKLBW MM1, [EDI], unpack target pixel byte values into words DB $0F, $6F, $D1 /// MOVQ MM2, MM1, make a copy of the shifted values, we need them again DB $0F, $71, $D1, $08 /// PSRLW MM1, 8, move higher bytes to lower bytes // Load MM7 with the source alpha value (replicate it for every component). // Expand it to word size. DB $0F, $6F, $F8 /// MOVQ MM7, MM0 DB $0F, $69, $FF /// PUNPCKHWD MM7, MM7 DB $0F, $6A, $FF /// PUNPCKHDQ MM7, MM7 DB $0F, $D5, $FE /// PMULLW MM7, MM6, source alpha * master alpha DB $0F, $71, $D7, $08 /// PSRLW MM7, 8, divide by 256 // calculation is: target = (alpha * master alpha * (source - target) + 256 * target) / 256 DB $0F, $F9, $C1 /// PSUBW MM0, MM1, source - target DB $0F, $D5, $C7 /// PMULLW MM0, MM7, alpha * (source - target) DB $0F, $FD, $C2 /// PADDW MM0, MM2, add target (in shifted form) DB $0F, $71, $D0, $08 /// PSRLW MM0, 8, divide by 256 // Bias is accounted for by conversion of range 0..255 to -128..127, // doing a saturated add and convert back to 0..255. DB $0F, $F9, $C4 /// PSUBW MM0, MM4 DB $0F, $ED, $C5 /// PADDSW MM0, MM5 DB $0F, $FD, $C4 /// PADDW MM0, MM4 DB $0F, $67, $C0 /// PACKUSWB MM0, MM0, convert words to bytes with saturation DB $0F, $7E, $07 /// MOVD [EDI], MM0, store the result @3: ADD ESI, 4 ADD EDI, 4 DEC ECX JNZ @1 POP EDI POP ESI {$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure AlphaBlendLineMasterAndColor(Destination: Pointer; Count: Integer; ConstantAlpha, Color: Integer); // Blends a line of Count pixels in Destination against the given color using a constant alpha value. // The layout of a pixel must be BGRA and Color must be rrggbb00 (as stored by a COLORREF). // ConstantAlpha must be in the range 0..255. asm {$ifdef CPU64} //windows // RCX contains Destination // EDX contains Count // R8D contains ConstantAlpha // R9D contains Color //non windows // RDI contains Destination // ESI contains Count // EDX contains ConstantAlpha // ECX contains Color //.NOFRAME // The used formula is: target = (alpha * color + (256 - alpha) * target) / 256. // alpha * color (factor 1) and 256 - alpha (factor 2) are constant values which can be calculated in advance. // The remaining calculation is therefore: target = (F1 + F2 * target) / 256 // Load XMM3 with the constant alpha value (replicate it for every component). // Expand it to word size. (Every calculation here works on word sized operands.) {$ifdef windows} MOVD XMM3, R8D // ConstantAlpha {$else} MOVD XMM3, EDX // ConstantAlpha {$endif} PUNPCKLWD XMM3, XMM3 PUNPCKLDQ XMM3, XMM3 // Calculate factor 2. MOV R10D, $100 MOVD XMM2, R10D PUNPCKLWD XMM2, XMM2 PUNPCKLDQ XMM2, XMM2 PSUBW XMM2, XMM3 // XMM2 contains now: 255 - alpha = F2 // Now calculate factor 1. Alpha is still in XMM3, but the r and b components of Color must be swapped. {$ifdef windows} BSWAP R9D // Color ROR R9D, 8 MOVD XMM1, R9D // Load the color and convert to word sized values. {$else} BSWAP ECX // Color ROR ECX, 8 MOVD XMM1, ECX // Load the color and convert to word sized values. {$endif} PXOR XMM4, XMM4 PUNPCKLBW XMM1, XMM4 PMULLW XMM1, XMM3 // XMM1 contains now: color * alpha = F1 @1: // The pixel loop calculates an entire pixel in one run. {$ifdef windows} MOVD XMM0, DWORD PTR [RCX] {$else} MOVD XMM0, DWORD PTR [RDI] {$endif} PUNPCKLBW XMM0, XMM4 PMULLW XMM0, XMM2 // calculate F1 + F2 * target PADDW XMM0, XMM1 PSRLW XMM0, 8 // divide by 256 PACKUSWB XMM0, XMM0 // convert words to bytes with saturation {$ifdef windows} MOVD DWORD PTR [RCX], XMM0 // store the result ADD RCX, 4 DEC EDX {$else} MOVD DWORD PTR [RDI], XMM0 // store the result ADD RDI, 4 DEC ESI {$endif} JNZ @1 {$else} // EAX contains Destination // EDX contains Count // ECX contains ConstantAlpha // Color is passed on the stack // The used formula is: target = (alpha * color + (256 - alpha) * target) / 256. // alpha * color (factor 1) and 256 - alpha (factor 2) are constant values which can be calculated in advance. // The remaining calculation is therefore: target = (F1 + F2 * target) / 256 // Load MM3 with the constant alpha value (replicate it for every component). // Expand it to word size. (Every calculation here works on word sized operands.) DB $0F, $6E, $D9 /// MOVD MM3, ECX DB $0F, $61, $DB /// PUNPCKLWD MM3, MM3 DB $0F, $62, $DB /// PUNPCKLDQ MM3, MM3 // Calculate factor 2. MOV ECX, $100 DB $0F, $6E, $D1 /// MOVD MM2, ECX DB $0F, $61, $D2 /// PUNPCKLWD MM2, MM2 DB $0F, $62, $D2 /// PUNPCKLDQ MM2, MM2 DB $0F, $F9, $D3 /// PSUBW MM2, MM3 // MM2 contains now: 255 - alpha = F2 // Now calculate factor 1. Alpha is still in MM3, but the r and b components of Color must be swapped. MOV ECX, [Color] BSWAP ECX ROR ECX, 8 DB $0F, $6E, $C9 /// MOVD MM1, ECX // Load the color and convert to word sized values. DB $0F, $EF, $E4 /// PXOR MM4, MM4 DB $0F, $60, $CC /// PUNPCKLBW MM1, MM4 DB $0F, $D5, $CB /// PMULLW MM1, MM3 // MM1 contains now: color * alpha = F1 @1: // The pixel loop calculates an entire pixel in one run. DB $0F, $6E, $00 /// MOVD MM0, [EAX] DB $0F, $60, $C4 /// PUNPCKLBW MM0, MM4 DB $0F, $D5, $C2 /// PMULLW MM0, MM2 // calculate F1 + F2 * target DB $0F, $FD, $C1 /// PADDW MM0, MM1 DB $0F, $71, $D0, $08 /// PSRLW MM0, 8 // divide by 256 DB $0F, $67, $C0 /// PACKUSWB MM0, MM0 // convert words to bytes with saturation DB $0F, $7E, $00 /// MOVD [EAX], MM0 // store the result ADD EAX, 4 DEC EDX JNZ @1 {$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure EMMS; // Reset MMX state to use the FPU for other tasks again. {$ifdef CPU64} inline; begin end; {$else} asm DB $0F, $77 /// EMMS end; {$endif} //---------------------------------------------------------------------------------------------------------------------- function GetBitmapBitsFromDeviceContext(DC: HDC; out Width, Height: Integer): Pointer; // Helper function used to retrieve the bitmap selected into the given device context. If there is a bitmap then // the function will return a pointer to its bits otherwise nil is returned. // Additionally the dimensions of the bitmap are returned. var Bitmap: HBITMAP; DIB: TDIBSection; begin Result := nil; Width := 0; Height := 0; Bitmap := GetCurrentObject(DC, OBJ_BITMAP); if Bitmap <> 0 then begin if GetObject(Bitmap, SizeOf(DIB), @DIB) = SizeOf(DIB) then begin Assert(DIB.dsBm.bmPlanes * DIB.dsBm.bmBitsPixel = 32, 'Alpha blending error: bitmap must use 32 bpp.'); Result := DIB.dsBm.bmBits; Width := DIB.dsBmih.biWidth; Height := DIB.dsBmih.biHeight; end; end; Assert(Result <> nil, 'Alpha blending DC error: no bitmap available.'); end; //---------------------------------------------------------------------------------------------------------------------- function GetBitmapBitsFromBitmap(Bitmap: HBITMAP): Pointer; var DIB: TDIBSection; begin Result := nil; if Bitmap <> 0 then begin if GetObject(Bitmap, SizeOf(DIB), @DIB) = SizeOf(DIB) then begin Assert(DIB.dsBm.bmPlanes * DIB.dsBm.bmBitsPixel = 32, 'Alpha blending error: bitmap must use 32 bpp.'); Result := DIB.dsBm.bmBits; end; end; end; function CalculateScanline(Bits: Pointer; Width, Height, Row: Integer): Pointer; // Helper function to calculate the start address for the given row. begin //todo: Height is always > 0 in LCL { if Height > 0 then // bottom-up DIB Row := Height - Row - 1; } // Return DWORD aligned address of the requested scanline. Result := Bits + Row * ((Width * 32 + 31) and not 31) div 8; end; //---------------------------------------------------------------------------------------------------------------------- procedure AlphaBlend(Source, Destination: HDC; const R: TRect; const Target: TPoint; Mode: TBlendMode; ConstantAlpha, Bias: Integer); // Optimized alpha blend procedure using MMX instructions to perform as quick as possible. // For this procedure to work properly it is important that both source and target bitmap use the 32 bit color format. // R describes the source rectangle to work on. // Target is the place (upper left corner) in the target bitmap where to blend to. Note that source width + X offset // must be less or equal to the target width. Similar for the height. // If Mode is bmConstantAlpha then the blend operation uses the given ConstantAlpha value for all pixels. // If Mode is bmPerPixelAlpha then each pixel is blended using its individual alpha value (the alpha value of the source). // If Mode is bmMasterAlpha then each pixel is blended using its individual alpha value multiplied by ConstantAlpha. // If Mode is bmConstantAlphaAndColor then each destination pixel is blended using ConstantAlpha but also a constant // color which will be obtained from Bias. In this case no offset value is added, otherwise Bias is used as offset. // Blending of a color into target only (bmConstantAlphaAndColor) ignores Source (the DC) and Target (the position). // CAUTION: This procedure does not check whether MMX instructions are actually available! Call it only if MMX is really // usable. var Y: Integer; SourceRun, TargetRun: PByte; SourceBits, DestBits: Pointer; SourceWidth, SourceHeight, DestWidth, DestHeight: Integer; //BlendColor: TQColor; begin if not IsRectEmpty(R) then begin {$ifdef CPU64} //avoid MasterAlpha due to incomplete AlphaBlendLineMaster. See comment in procedure if Mode = bmMasterAlpha then Mode := bmConstantAlpha; {$endif} // Note: it is tempting to optimize the special cases for constant alpha 0 and 255 by just ignoring soure // (alpha = 0) or simply do a blit (alpha = 255). But this does not take the bias into account. case Mode of bmConstantAlpha: begin // Get a pointer to the bitmap bits for the source and target device contexts. // Note: this supposes that both contexts do actually have bitmaps assigned! SourceBits := GetBitmapBitsFromDeviceContext(Source, SourceWidth, SourceHeight); DestBits := GetBitmapBitsFromDeviceContext(Destination, DestWidth, DestHeight); if Assigned(SourceBits) and Assigned(DestBits) then begin for Y := 0 to R.Bottom - R.Top - 1 do begin SourceRun := CalculateScanline(SourceBits, SourceWidth, SourceHeight, Y + R.Top); Inc(SourceRun, 4 * R.Left); TargetRun := CalculateScanline(DestBits, DestWidth, DestHeight, Y + Target.Y); Inc(TargetRun, 4 * Target.X); AlphaBlendLineConstant(SourceRun, TargetRun, R.Right - R.Left, ConstantAlpha, Bias); end; end; EMMS; end; bmPerPixelAlpha: begin SourceBits := GetBitmapBitsFromDeviceContext(Source, SourceWidth, SourceHeight); DestBits := GetBitmapBitsFromDeviceContext(Destination, DestWidth, DestHeight); if Assigned(SourceBits) and Assigned(DestBits) then begin for Y := 0 to R.Bottom - R.Top - 1 do begin SourceRun := CalculateScanline(SourceBits, SourceWidth, SourceHeight, Y + R.Top); Inc(SourceRun, 4 * R.Left); TargetRun := CalculateScanline(DestBits, DestWidth, DestHeight, Y + Target.Y); Inc(TargetRun, 4 * Target.X); AlphaBlendLinePerPixel(SourceRun, TargetRun, R.Right - R.Left, Bias); end; end; EMMS; end; bmMasterAlpha: begin SourceBits := GetBitmapBitsFromDeviceContext(Source, SourceWidth, SourceHeight); DestBits := GetBitmapBitsFromDeviceContext(Destination, DestWidth, DestHeight); if Assigned(SourceBits) and Assigned(DestBits) then begin for Y := 0 to R.Bottom - R.Top - 1 do begin SourceRun := CalculateScanline(SourceBits, SourceWidth, SourceHeight, Y + R.Top); Inc(SourceRun, 4 * Target.X); TargetRun := CalculateScanline(DestBits, DestWidth, DestHeight, Y + Target.Y); AlphaBlendLineMaster(SourceRun, TargetRun, R.Right - R.Left, ConstantAlpha, Bias); end; end; EMMS; end; bmConstantAlphaAndColor: begin //todo: see why is not working { QColor_fromRgb(@BlendColor, Bias and $000000FF, (Bias shr 8) and $000000FF, (Bias shr 16) and $000000FF, ConstantAlpha); QPainter_fillRect(TQTDeviceContext(Destination).Widget, R.Left + Target.x, R.Top + Target.y, R.Right - R.Left, R.Bottom - R.Top, @BlendColor); } // Source is ignored since there is a constant color value. DestBits := GetBitmapBitsFromDeviceContext(Destination, DestWidth, DestHeight); if Assigned(DestBits) then begin for Y := 0 to R.Bottom - R.Top - 1 do begin TargetRun := CalculateScanline(DestBits, DestWidth, DestHeight, Y + R.Top); Inc(TargetRun, 4 * R.Left); AlphaBlendLineMasterAndColor(TargetRun, R.Right - R.Left, ConstantAlpha, Bias); end; end; EMMS; end; end; end; end; doublecmd-0.5.8/components/virtualtreeview/include/intf/qt/vtvdragmanager.inc0000644000175000017500000000003612014201074026634 0ustar alexxalexx {$i ../dummydragmanager.inc} doublecmd-0.5.8/components/virtualtreeview/include/intf/qt/olemethods.inc0000644000175000017500000000003512014201074025766 0ustar alexxalexx {$i ../dummyolemethods.inc} doublecmd-0.5.8/components/virtualtreeview/include/intf/dummydragmanager.inc0000644000175000017500000006030412014201074026530 0ustar alexxalexx //---------------------------------------------------------------------------------------------------------------------- // OLE drag and drop support classes // This is quite heavy stuff (compared with the VCL implementation) but is much better suited to fit the needs // of DD'ing various kinds of virtual data and works also between applications. //----------------- TEnumFormatEtc ------------------------------------------------------------------------------------- constructor TEnumFormatEtc.Create(Tree: TBaseVirtualTree; AFormatEtcArray: TFormatEtcArray); var I: Integer; begin inherited Create; { FTree := Tree; // Make a local copy of the format data. SetLength(FFormatEtcArray, Length(AFormatEtcArray)); for I := 0 to High(AFormatEtcArray) do FFormatEtcArray[I] := AFormatEtcArray[I]; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Clone(out Enum: IEnumFormatEtc): HResult; { var AClone: TEnumFormatEtc; } begin { Result := S_OK; try AClone := TEnumFormatEtc.Create(nil, FFormatEtcArray); AClone.FCurrentIndex := FCurrentIndex; Enum := AClone as IEnumFormatEtc; except Result := E_FAIL; end; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Next(celt: LongWord; out elt: FormatEtc;pceltFetched:pULong=nil): HResult; { var CopyCount: LongWord; } begin { Result := S_FALSE; CopyCount := Length(FFormatEtcArray) - FCurrentIndex; if celt < CopyCount then CopyCount := celt; if CopyCount > 0 then begin Move(FFormatEtcArray[FCurrentIndex], elt, CopyCount * SizeOf(TFormatEtc)); Inc(FCurrentIndex, CopyCount); Result := S_OK; end; //todo_lcl_check Delphi treats pceltFetched an PInteger. Implemented like in fpc.activex. What heappens with // a C Program call with a NULL in pCeltFetcjed?? //Answer: Yes. Is necessary a check here if @pceltFetched <> nil then pceltFetched := CopyCount; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Reset: HResult; begin { FCurrentIndex := 0; Result := S_OK; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Skip(celt: LongWord): HResult; begin { if FCurrentIndex + celt < High(FFormatEtcArray) then begin Inc(FCurrentIndex, celt); Result := S_Ok; end else Result := S_FALSE; } end; //----------------- TVTDataObject -------------------------------------------------------------------------------------- constructor TVTDataObject.Create(AOwner: TBaseVirtualTree; ForClipboard: Boolean); begin inherited Create; { FOwner := AOwner; FForClipboard := ForClipboard; FOwner.GetNativeClipboardFormats(FFormatEtcArray); } end; //---------------------------------------------------------------------------------------------------------------------- destructor TVTDataObject.Destroy; var I: Integer; StgMedium: PStgMedium; begin { // Cancel a pending clipboard operation if this data object was created for the clipboard and // is freed because something else is placed there. if FForClipboard and not (tsClipboardFlushing in FOwner.FStates) then FOwner.CancelCutOrCopy; // Release any internal clipboard formats for I := 0 to High(FormatEtcArray) do begin StgMedium := FindInternalStgMedium(FormatEtcArray[I].cfFormat); if Assigned(StgMedium) then ReleaseStgMedium(StgMedium); end; FormatEtcArray := nil; inherited; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.CanonicalIUnknown(TestUnknown: IUnknown): IUnknown; // Uses COM object identity: An explicit call to the IUnknown::QueryInterface method, requesting the IUnknown // interface, will always return the same pointer. begin { if Assigned(TestUnknown) then begin if TestUnknown.QueryInterface(IUnknown, Result) = 0 then Result._Release // Don't actually need it just need the pointer value else Result := TestUnknown end else Result := TestUnknown } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EqualFormatEtc(FormatEtc1, FormatEtc2: TFormatEtc): Boolean; begin { Result := (FormatEtc1.cfFormat = FormatEtc2.cfFormat) and (FormatEtc1.ptd = FormatEtc2.ptd) and (FormatEtc1.dwAspect = FormatEtc2.dwAspect) and (FormatEtc1.lindex = FormatEtc2.lindex) and (FormatEtc1.tymed and FormatEtc2.tymed <> 0); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.FindFormatEtc(TestFormatEtc: TFormatEtc; const FormatEtcArray: TFormatEtcArray): integer; var I: integer; begin { Result := -1; for I := 0 to High(FormatEtcArray) do begin if EqualFormatEtc(TestFormatEtc, FormatEtcArray[I]) then begin Result := I; Break; end end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.FindInternalStgMedium(Format: TClipFormat): PStgMedium; { var I: integer; } begin { Result := nil; for I := 0 to High(InternalStgMediumArray) do begin if Format = InternalStgMediumArray[I].Format then begin Result := @InternalStgMediumArray[I].Medium; Break; end end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.HGlobalClone(HGlobal: THandle): THandle; // Returns a global memory block that is a copy of the passed memory block. { var Size: Cardinal; Data, NewData: PChar; } begin { Size := GlobalSize(HGlobal); Result := GlobalAlloc(GPTR, Size); Data := GlobalLock(hGlobal); try NewData := GlobalLock(Result); try Move(Data^, NewData^, Size); finally GlobalUnLock(Result); end finally GlobalUnLock(hGlobal); end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.RenderInternalOLEData(const FormatEtcIn: TFormatEtc; var Medium: TStgMedium; var OLEResult: HResult): Boolean; // Tries to render one of the formats which have been stored via the SetData method. // Since this data is already there it is just copied or its reference count is increased (depending on storage medium). { var InternalMedium: PStgMedium; } begin { Result := True; InternalMedium := FindInternalStgMedium(FormatEtcIn.cfFormat); if Assigned(InternalMedium) then OLEResult := StgMediumIncRef(InternalMedium^, Medium, False, Self as IDataObject) else Result := False; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.StgMediumIncRef(const InStgMedium: TStgMedium; var OutStgMedium: TStgMedium; CopyInMedium: Boolean; DataObject: IDataObject): HRESULT; // InStgMedium is the data that is requested, OutStgMedium is the data that we are to return either a copy of or // increase the IDataObject's reference and send ourselves back as the data (unkForRelease). The InStgMedium is usually // the result of a call to find a particular FormatEtc that has been stored locally through a call to SetData. // If CopyInMedium is not true we already have a local copy of the data when the SetData function was called (during // that call the CopyInMedium must be true). Then as the caller asks for the data through GetData we do not have to make // copy of the data for the caller only to have them destroy it then need us to copy it again if necessary. // This way we increase the reference count to ourselves and pass the STGMEDIUM structure initially stored in SetData. // This way when the caller frees the structure it sees the unkForRelease is not nil and calls Release on the object // instead of destroying the actual data. var Len: Integer; begin { Result := S_OK; // Simply copy all fields to start with. OutStgMedium := InStgMedium; // The data handled here always results from a call of SetData we got. This ensures only one storage format // is indicated and hence the case statement below is safe (IDataObject.GetData can optionally use several // storage formats). case InStgMedium.tymed of TYMED_HGLOBAL: begin if CopyInMedium then begin // Generate a unique copy of the data passed OutStgMedium.hGlobal := HGlobalClone(InStgMedium.hGlobal); if OutStgMedium.hGlobal = 0 then Result := E_OUTOFMEMORY end else // Don't generate a copy just use ourselves and the copy previously saved. OutStgMedium.PunkForRelease := Pointer(DataObject); // Does not increase RefCount. end; TYMED_FILE: begin //todo_lcl_check Len := Length(WideString(InStgMedium.lpszFileName)) + 1; // Don't forget the terminating null character. OutStgMedium.lpszFileName := CoTaskMemAlloc(2 * Len); Move(InStgMedium.lpszFileName^, OutStgMedium.lpszFileName^, 2 * Len); end; TYMED_ISTREAM: IUnknown(OutStgMedium.Pstm)._AddRef; TYMED_ISTORAGE: IUnknown(OutStgMedium.Pstg)._AddRef; TYMED_GDI: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy GDI objects right now. TYMED_MFPICT: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy MetaFile objects right now. TYMED_ENHMF: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy enhanced metafiles objects right now. else Result := DV_E_TYMED; end; if (Result = S_OK) and Assigned(OutStgMedium.PunkForRelease) then IUnknown(OutStgMedium.PunkForRelease)._AddRef; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.DAdvise(const FormatEtc: TFormatEtc; advf: DWord; const advSink: IAdviseSink; out dwConnection: DWord): HResult; // Advise sink management is greatly simplified by the IDataAdviseHolder interface. // We use this interface and forward all concerning calls to it. begin { Result := S_OK; if FAdviseHolder = nil then Result := CreateDataAdviseHolder(FAdviseHolder); if Result = S_OK then Result := FAdviseHolder.Advise(Self as IDataObject, FormatEtc, advf, advSink, dwConnection); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.DUnadvise(dwConnection: DWord): HResult; begin { if FAdviseHolder = nil then Result := E_NOTIMPL else Result := FAdviseHolder.Unadvise(dwConnection); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EnumDAdvise(Out enumAdvise : IEnumStatData):HResult; begin { if FAdviseHolder = nil then Result := OLE_E_ADVISENOTSUPPORTED else Result := FAdviseHolder.EnumAdvise(enumAdvise); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EnumFormatEtc(Direction: DWord; out EnumFormatEtc: IEnumFormatEtc): HResult; { var NewList: TEnumFormatEtc; } begin { Result := E_FAIL; if Direction = DATADIR_GET then begin NewList := TEnumFormatEtc.Create(FOwner, FormatEtcArray); EnumFormatEtc := NewList as IEnumFormatEtc; Result := S_OK; end else EnumFormatEtc := nil; if EnumFormatEtc = nil then Result := OLE_S_USEREG; } end; //---------------------------------------------------------------------------------------------------------------------- Function TVTDataObject.GetCanonicalFormatEtc(const pformatetcIn : FORMATETC;Out pformatetcOut : FORMATETC):HResult; begin //Result := DATA_S_SAMEFORMATETC; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.GetData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium): HResult; // Data is requested by clipboard or drop target. This method dispatchs the call // depending on the data being requested. { var I: Integer; Data: PVTReference; } begin { // The tree reference format is always supported and returned from here. if FormatEtcIn.cfFormat = CF_VTREFERENCE then begin // Note: this format is not used while flushing the clipboard to avoid a dangling reference // when the owner tree is destroyed before the clipboard data is replaced with something else. if tsClipboardFlushing in FOwner.FStates then Result := E_FAIL else begin Medium.hGlobal := GlobalAlloc(GHND or GMEM_SHARE, SizeOf(TVTReference)); Data := GlobalLock(Medium.hGlobal); Data.Process := GetCurrentProcessID; Data.Tree := FOwner; GlobalUnlock(Medium.hGlobal); Medium.tymed := TYMED_HGLOBAL; Medium.PunkForRelease := nil; Result := S_OK; end; end else begin try // See if we accept this type and if not get the correct return value. Result := QueryGetData(FormatEtcIn); if Result = S_OK then begin for I := 0 to High(FormatEtcArray) do begin if EqualFormatEtc(FormatEtcIn, FormatEtcArray[I]) then begin if not RenderInternalOLEData(FormatEtcIn, Medium, Result) then Result := FOwner.RenderOLEData(FormatEtcIn, Medium, FForClipboard); Break; end; end end except FillChar(Medium, SizeOf(Medium), #0); Result := E_FAIL; end; end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.GetDataHere(const FormatEtc: TFormatEtc; out Medium: TStgMedium): HResult; begin //Result := E_NOTIMPL; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.QueryGetData(const FormatEtc: TFormatEtc): HResult; { var I: Integer; } begin { Result := DV_E_CLIPFORMAT; for I := 0 to High(FFormatEtcArray) do begin if FormatEtc.cfFormat = FFormatEtcArray[I].cfFormat then begin if (FormatEtc.tymed and FFormatEtcArray[I].tymed) <> 0 then begin if FormatEtc.dwAspect = FFormatEtcArray[I].dwAspect then begin if FormatEtc.lindex = FFormatEtcArray[I].lindex then begin Result := S_OK; Break; end else Result := DV_E_LINDEX; end else Result := DV_E_DVASPECT; end else Result := DV_E_TYMED; end; end } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.SetData(const FormatEtc: TFormatEtc; {$ifdef VER2_0}var{$else}const{$endif} Medium: TStgMedium; DoRelease: BOOL): HResult; // Allows dynamic adding to the IDataObject during its existance. Most noteably it is used to implement // IDropSourceHelper and allows to set a special format for optimized moves during a shell transfer. { var Index: Integer; LocalStgMedium: PStgMedium; } begin { // See if we already have a format of that type available. Index := FindFormatEtc(FormatEtc, FormatEtcArray); if Index > - 1 then begin // Just use the TFormatEct in the array after releasing the data. LocalStgMedium := FindInternalStgMedium(FormatEtcArray[Index].cfFormat); if Assigned(LocalStgMedium) then begin ReleaseStgMedium(LocalStgMedium); FillChar(LocalStgMedium^, SizeOf(LocalStgMedium^), #0); end; end else begin // It is a new format so create a new TFormatCollectionItem, copy the // FormatEtc parameter into the new object and and put it in the list. SetLength(FFormatEtcArray, Length(FormatEtcArray) + 1); FormatEtcArray[High(FormatEtcArray)] := FormatEtc; // Create a new InternalStgMedium and initialize it and associate it with the format. SetLength(FInternalStgMediumArray, Length(InternalStgMediumArray) + 1); InternalStgMediumArray[High(InternalStgMediumArray)].Format := FormatEtc.cfFormat; LocalStgMedium := @InternalStgMediumArray[High(InternalStgMediumArray)].Medium; FillChar(LocalStgMedium^, SizeOf(LocalStgMedium^), #0); end; if DoRelease then begin // We are simply being given the data and we take control of it. LocalStgMedium^ := Medium; Result := S_OK end else begin // We need to reference count or copy the data and keep our own references to it. Result := StgMediumIncRef(Medium, LocalStgMedium^, True, Self as IDataObject); // Can get a circular reference if the client calls GetData then calls SetData with the same StgMedium. // Because the unkForRelease for the IDataObject can be marshalled it is necessary to get pointers that // can be correctly compared. See the IDragSourceHelper article by Raymond Chen at MSDN. if Assigned(LocalStgMedium.PunkForRelease) then begin if CanonicalIUnknown(Self) = CanonicalIUnknown(IUnknown(LocalStgMedium.PunkForRelease)) then IUnknown(LocalStgMedium.PunkForRelease) := nil; // release the interface end; end; // Tell all registered advice sinks about the data change. if Assigned(FAdviseHolder) then FAdviseHolder.SendOnDataChange(Self as IDataObject, 0, 0); } end; //----------------- TVTDragManager ------------------------------------------------------------------------------------- constructor TVTDragManager.Create(AOwner: TBaseVirtualTree); begin inherited Create; FOwner := AOwner; { // Create an instance of the drop target helper interface. This will fail but not harm on systems which do // not support this interface (everything below Windows 2000); CoCreateInstance(CLSID_DragDropHelper, nil, CLSCTX_INPROC_SERVER, IID_IDropTargetHelper, FDropTargetHelper); } end; //---------------------------------------------------------------------------------------------------------------------- destructor TVTDragManager.Destroy; begin // Set the owner's reference to us to nil otherwise it will access an invalid pointer // after our desctruction is complete. Pointer(FOwner.FDragManager) := nil; inherited; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDataObject: IDataObject; begin // When the owner tree starts a drag operation then it gets a data object here to pass it to the OLE subsystem. // In this case there is no local reference to a data object and one is created (but not stored). // If there is a local reference then the owner tree is currently the drop target and the stored interface is // that of the drag initiator. { if Assigned(FDataObject) then Result := FDataObject else begin Result := FOwner.DoCreateDataObject; if Result = nil then Result := TVTDataObject.Create(FOwner, False) as IDataObject; end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDragSource: TBaseVirtualTree; begin //Result := FDragSource; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDropTargetHelperSupported: Boolean; begin //Result := Assigned(FDropTargetHelper); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetIsDropTarget: Boolean; begin //Result := FIsDropTarget; Result := True; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragEnter(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin { FDataObject := DataObject; FIsDropTarget := True; SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, @FFullDragging, 0); // If full dragging of window contents is disabled in the system then our tree windows will be locked // and cannot be updated during a drag operation. With the following call painting is again enabled. if not FFullDragging then LockWindowUpdate(0); if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragEnter(FOwner.Handle, DataObject, Pt, Effect); FDragSource := FOwner.GetTreeFromDataObject(DataObject); Result := FOwner.DragEnter(KeyState, Pt, Effect); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragLeave: HResult; begin { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragLeave; FOwner.DragLeave; FIsDropTarget := False; FDragSource := nil; FDataObject := nil; Result := NOERROR; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragOver(KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragOver(Pt, Effect); Result := FOwner.DragOver(FDragSource, KeyState, dsDragMove, Pt, Effect); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.Drop(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.Drop(DataObject, Pt, Effect); Result := FOwner.DragDrop(DataObject, KeyState, Pt, Effect); FIsDropTarget := False; FDataObject := nil; } end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTDragManager.ForceDragLeave; // Some drop targets, e.g. Internet Explorer leave a drag image on screen instead removing it when they receive // a drop action. This method calls the drop target helper's DragLeave method to ensure it removes the drag image from // screen. Unfortunately, sometimes not even this does help (e.g. when dragging text from VT to a text field in IE). begin { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragLeave; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GiveFeedback(Effect: LongWord): HResult; begin //Result := DRAGDROP_S_USEDEFAULTCURSORS; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.QueryContinueDrag(EscapePressed: BOOL; KeyState: LongWord): HResult; var RButton, LButton: Boolean; begin { LButton := (KeyState and MK_LBUTTON) <> 0; RButton := (KeyState and MK_RBUTTON) <> 0; // Drag'n drop canceled by pressing both mouse buttons or Esc? if (LButton and RButton) or EscapePressed then Result := DRAGDROP_S_CANCEL else // Drag'n drop finished? if not (LButton or RButton) then Result := DRAGDROP_S_DROP else Result := S_OK; } end; doublecmd-0.5.8/components/virtualtreeview/include/intf/dummyolemethods.inc0000644000175000017500000003473012014201074026427 0ustar alexxalexxfunction TBaseVirtualTree.GetTreeFromDataObject(const DataObject: IDataObject): TBaseVirtualTree; // Returns the owner/sender of the given data object by means of a special clipboard format // or nil if the sender is in another process or no virtual tree at all. var Medium: TStgMedium; Data: PVTReference; begin Result := nil; { if Assigned(DataObject) then begin StandardOLEFormat.cfFormat := CF_VTREFERENCE; if DataObject.GetData(StandardOLEFormat, Medium) = S_OK then begin Data := GlobalLock(Medium.hGlobal); if Assigned(Data) then begin if Data.Process = GetCurrentProcessID then Result := Data.Tree; GlobalUnlock(Medium.hGlobal); end; ReleaseStgMedium(@Medium); end; end; } end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.RenderOLEData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean): HResult; // Returns a memory expression of all currently selected nodes in the Medium structure. // Note: The memory requirement of this method might be very high. This depends however on the requested storage format. // For HGlobal (a global memory block) we need to render first all nodes to local memory and copy this then to // the global memory in Medium. This is necessary because we have first to determine how much // memory is needed before we can allocate it. Hence for a short moment we need twice the space as used by the // nodes alone (plus the amount the nodes need in the tree anyway)! // With IStream this does not happen. We directly stream out the nodes and pass the constructed stream along. //--------------- local function -------------------------------------------- { procedure WriteNodes(Stream: TStream); var Selection: TNodeArray; I: Integer; begin if ForClipboard then Selection := GetSortedCutCopySet(True) else Selection := GetSortedSelection(True); for I := 0 to High(Selection) do WriteNode(Stream, Selection[I]); end; //--------------- end local function ---------------------------------------- var Data: PCardinal; ResPointer: Pointer; ResSize: Integer; OLEStream: IStream; VCLStream: TStream; } begin { FillChar(Medium, SizeOf(Medium), 0); // We can render the native clipboard format in two different storage media. if (FormatEtcIn.cfFormat = CF_VIRTUALTREE) and (FormatEtcIn.tymed and (TYMED_HGLOBAL or TYMED_ISTREAM) <> 0) then begin VCLStream := nil; try Medium.PunkForRelease := nil; // Return data in one of the supported storage formats, prefer IStream. if FormatEtcIn.tymed and TYMED_ISTREAM <> 0 then begin // Create an IStream on a memory handle (here it is 0 which indicates to implicitely allocated a handle). // Do not use TStreamAdapter as it is not compatible with OLE (when flushing the clipboard OLE wants the HGlobal // back which is not supported by TStreamAdapater). CreateStreamOnHGlobal(0, True, OLEStream); VCLStream := TOLEStream.Create(OLEStream); WriteNodes(VCLStream); // Rewind stream. VCLStream.Position := 0; Medium.tymed := TYMED_ISTREAM; IUnknown(Medium.Pstm) := OLEStream; Result := S_OK; end else begin VCLStream := TMemoryStream.Create; WriteNodes(VCLStream); ResPointer := TMemoryStream(VCLStream).Memory; ResSize := VCLStream.Position; // Allocate memory to hold the string. if ResSize > 0 then begin Medium.hGlobal := GlobalAlloc(GHND or GMEM_SHARE, ResSize + SizeOf(Cardinal)); Data := GlobalLock(Medium.hGlobal); // Store the size of the data too, for easy retrival. Data^ := ResSize; Inc(Data); Move(ResPointer^, Data^, ResSize); GlobalUnlock(Medium.hGlobal); Medium.tymed := TYMED_HGLOBAL; Result := S_OK; end else Result := E_FAIL; end; finally // We can free the VCL stream here since it was either a pure memory stream or only a wrapper around // the OLEStream which exists independently. VCLStream.Free; end; end else // Ask application descendants to render self defined formats. Result := DoRenderOLEData(FormatEtcIn, Medium, ForClipboard); } end; //---------------------------------------------------------------------------------------------------------------------- type // needed to handle OLE global memory objects TOLEMemoryStream = class(TCustomMemoryStream) public function Write(const Buffer; Count: Integer): Longint; override; end; //---------------------------------------------------------------------------------------------------------------------- function TOLEMemoryStream.Write(const Buffer; Count: Integer): Integer; begin //raise EStreamError.CreateRes(PResStringRec(@SCantWriteResourceStreamError)); raise EStreamError.Create(SCantWriteResourceStreamError); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.ProcessOLEData(Source: TBaseVirtualTree; DataObject: IDataObject; TargetNode: PVirtualNode; Mode: TVTNodeAttachMode; Optimized: Boolean): Boolean; // Recreates the (sub) tree structure serialized into memory and provided by DataObject. The new nodes are attached to // the passed node or FRoot if TargetNode is nil according to Mode. Optimized can be set to True if the entire operation // happens within the same process (i.e. sender and receiver of the OLE operation are located in the same process). // Optimize = True makes only sense if the operation to carry out is a move hence it is also the indication of the // operation to be done here. Source is the source of the OLE data and only of use (and usually assigned) when // an OLE operation takes place in the same application. // Returns True on success, i.e. the CF_VIRTUALTREE format is supported by the data object and the structure could be // recreated, otherwise False. var Medium: TStgMedium; Stream: TStream; Data: Pointer; Node: PVirtualNode; Nodes: TNodeArray; I: Integer; Res: HRESULT; ChangeReason: TChangeReason; begin { Nodes := nil; // Check the data format available by the data object. with StandardOLEFormat do begin // Read best format. cfFormat := CF_VIRTUALTREE; end; Result := DataObject.QueryGetData(StandardOLEFormat) = S_OK; if Result and not (toReadOnly in FOptions.FMiscOptions) then begin BeginUpdate; Result := False; try if TargetNode = nil then TargetNode := FRoot; if TargetNode = FRoot then begin case Mode of amInsertBefore: Mode := amAddChildFirst; amInsertAfter: Mode := amAddChildLast; end; end; // Optimized means source is known and in the same process so we can access its pointers, which avoids duplicating // the data while doing a serialization. Can only be used with cut'n paste and drag'n drop with move effect. if Optimized then begin if tsOLEDragging in Source.FStates then Nodes := Source.FDragSelection else Nodes := Source.GetSortedCutCopySet(True); if Mode in [amInsertBefore,amAddChildLast] then begin for I := 0 to High(Nodes) do if not HasAsParent(TargetNode, Nodes[I]) then Source.MoveTo(Nodes[I], TargetNode, Mode, False); end else begin for I := High(Nodes) downto 0 do if not HasAsParent(TargetNode, Nodes[I]) then Source.MoveTo(Nodes[I], TargetNode, Mode, False); end; Result := True; end else begin if Source = Self then ChangeReason := crNodeCopied else ChangeReason := crNodeAdded; Res := DataObject.GetData(StandardOLEFormat, Medium); if Res = S_OK then begin case Medium.tymed of TYMED_ISTREAM, // IStream interface TYMED_HGLOBAL: // global memory block begin Stream := nil; if Medium.tymed = TYMED_ISTREAM then Stream := TOLEStream.Create(IUnknown(Medium.Pstm) as IStream) else begin Data := GlobalLock(Medium.hGlobal); if Assigned(Data) then begin // Get the total size of data to retrieve. I := PCardinal(Data)^; Inc(PCardinal(Data)); Stream := TOLEMemoryStream.Create; TOLEMemoryStream(Stream).SetPointer(Data, I); end; end; if Assigned(Stream) then try while Stream.Position < Stream.Size do begin Node := MakeNewNode; InternalConnectNode(Node, TargetNode, Self, Mode); InternalAddFromStream(Stream, VTTreeStreamVersion, Node); // This seems a bit strange because of the callback for granting to add the node // which actually comes after the node has been added. The reason is that the node must // contain valid data otherwise I don't see how the application can make a funded decision. if not DoNodeCopying(Node, TargetNode) then DeleteNode(Node) else DoNodeCopied(Node); StructureChange(Node, ChangeReason); // In order to maintain the same node order when restoring nodes in the case of amInsertAfter // we have to move the reference node continously. Othwise we would end up with reversed node order. if Mode = amInsertAfter then TargetNode := Node; end; Result := True; finally Stream.Free; if Medium.tymed = TYMED_HGLOBAL then GlobalUnlock(Medium.hGlobal); end; end; end; ReleaseStgMedium(@Medium); end; end; finally EndUpdate; end; end; } end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.ContentToClipboard(Format: Word; Source: TVSTTextSourceType): HGLOBAL; // This method constructs a shareable memory object filled with string data in the required format. Supported are: // CF_TEXT - plain ANSI text (Unicode text is converted using the user's current locale) // CF_UNICODETEXT - plain Unicode text // CF_CSV - comma separated plain ANSI text // CF_VRTF + CF_RTFNOOBS - rich text (plain ANSI) // CF_HTML - HTML text encoded using UTF-8 // // Result is the handle to a globally allocated memory block which can directly be used for clipboard and drag'n drop // transfers. The caller is responsible for freeing the memory. If for some reason the content could not be rendered // the Result is 0. //--------------- local function -------------------------------------------- { procedure MakeFragment(var HTML: string); // Helper routine to build a properly-formatted HTML fragment. const Version = 'Version:1.0'#13#10; StartHTML = 'StartHTML:'; EndHTML = 'EndHTML:'; StartFragment = 'StartFragment:'; EndFragment = 'EndFragment:'; DocType = ''; HTMLIntro = '' + ''; HTMLExtro = ''; NumberLengthAndCR = 10; // Let the compiler determine the description length. DescriptionLength = Length(Version) + Length(StartHTML) + Length(EndHTML) + Length(StartFragment) + Length(EndFragment) + 4 * NumberLengthAndCR; var Description: string; StartHTMLIndex, EndHTMLIndex, StartFragmentIndex, EndFragmentIndex: Integer; begin // The HTML clipboard format is defined by using byte positions in the entire block where HTML text and // fragments start and end. These positions are written in a description. Unfortunately the positions depend on the // length of the description but the description may change with varying positions. // To solve this dilemma the offsets are converted into fixed length strings which makes it possible to know // the description length in advance. StartHTMLIndex := DescriptionLength; // position 0 after the description StartFragmentIndex := StartHTMLIndex + Length(DocType) + Length(HTMLIntro); EndFragmentIndex := StartFragmentIndex + Length(HTML); EndHTMLIndex := EndFragmentIndex + Length(HTMLExtro); Description := Version + SysUtils.Format('%s%.8d', [StartHTML, StartHTMLIndex]) + #13#10 + SysUtils.Format('%s%.8d', [EndHTML, EndHTMLIndex]) + #13#10 + SysUtils.Format('%s%.8d', [StartFragment, StartFragmentIndex]) + #13#10 + SysUtils.Format('%s%.8d', [EndFragment, EndFragmentIndex]) + #13#10; HTML := Description + DocType + HTMLIntro + HTML + HTMLExtro; end; } //--------------- end local function ---------------------------------------- var Data: Pointer; DataSize: Cardinal; S: string; WS: WideString; P: Pointer; begin Result := 0; { case Format of CF_TEXT: begin S := ContentToText(Source, #9) + #0; Data := PChar(S); DataSize := Length(S); end; CF_UNICODETEXT: begin WS := ContentToUnicode(Source, #9) + #0; Data := PWideChar(WS); DataSize := 2 * Length(WS); end; else if Format = CF_CSV then S := ContentToText(Source, ListSeparator) + #0 else if (Format = CF_VRTF) or (Format = CF_VRTFNOOBJS) then S := ContentToRTF(Source) + #0 else if Format = CF_HTML then begin S := ContentToHTML(Source); // Build a valid HTML clipboard fragment. MakeFragment(S); S := S + #0; end; Data := PChar(S); DataSize := Length(S); end; if DataSize > 0 then begin Result := GlobalAlloc(GHND or GMEM_SHARE, DataSize); P := GlobalLock(Result); Move(Data^, P^, DataSize); GlobalUnlock(Result); end; } end; doublecmd-0.5.8/components/virtualtreeview/include/intf/carbon/0000755000175000017500000000000012257501472023770 5ustar alexxalexxdoublecmd-0.5.8/components/virtualtreeview/include/intf/carbon/vtgraphicsi.inc0000644000175000017500000000115612014201074026773 0ustar alexxalexx//todo: properly implement procedure AlphaBlend(Source, Destination: HDC; const R: TRect; const Target: TPoint; Mode: TBlendMode; ConstantAlpha, Bias: Integer); begin case Mode of bmConstantAlpha, bmPerPixelAlpha, bmMasterAlpha, bmConstantAlphaAndColor: begin BitBlt(Destination, Target.X, Target.Y, R.Right - R.Left, R.Bottom - R.Top, Source, R.Left, R.Right, SRCCOPY); end; end; end; function CalculateScanline(Bits: Pointer; Width, Height, Row: Integer): Pointer; begin Result := nil; end; function GetBitmapBitsFromBitmap(Bitmap: HBITMAP): Pointer; begin Result := nil; end;doublecmd-0.5.8/components/virtualtreeview/include/intf/carbon/vtvdragmanager.inc0000644000175000017500000000003612014201074027454 0ustar alexxalexx {$i ../dummydragmanager.inc} doublecmd-0.5.8/components/virtualtreeview/include/intf/carbon/olemethods.inc0000644000175000017500000000003512014201074026606 0ustar alexxalexx {$i ../dummyolemethods.inc} doublecmd-0.5.8/components/virtualtreeview/include/intf/gtk2/0000755000175000017500000000000012257501472023373 5ustar alexxalexxdoublecmd-0.5.8/components/virtualtreeview/include/intf/gtk2/vtgraphicsi.inc0000644000175000017500000000307212140233030026372 0ustar alexxalexxuses gtk2def, gdk2, GTK2Proc, Cairo, LCLVersion; {$MACRO ON} {$if lcl_fullversion > 1000000} {$define TGtk2DeviceContext:=TGtkDeviceContext} {$endif} function gdk_cairo_create(drawable: PGdkDrawable): Pcairo_t cdecl external gdklib; procedure AlphaBlend(Source, Destination: HDC; const R: TRect; const Target: TPoint; Mode: TBlendMode; ConstantAlpha, Bias: Integer); function GetContext(GtkDC: TGtk2DeviceContext): Pcairo_t; begin Result := nil; if (GtkDC <> nil) and (GtkDC.Drawable <> nil) then Result := gdk_cairo_create(GtkDC.Drawable); end; var SrcDC: TGtk2DeviceContext absolute Source; DestDC: TGtk2DeviceContext absolute Destination; SrcContext, DestContext: Pcairo_t; begin case Mode of bmConstantAlpha:; bmPerPixelAlpha:; bmMasterAlpha:; bmConstantAlphaAndColor: begin DestContext := GetContext(DestDC); if DestContext <> nil then begin cairo_set_source_rgba(DestContext, (Bias and $000000FF) / 255, ((Bias shr 8) and $000000FF) / 255, ((Bias shr 16) and $000000FF) / 255, ConstantAlpha / 255 ); cairo_rectangle(DestContext, R.Left + Target.x, R.Top + Target.y, R.Right - R.Left, R.Bottom - R.Top); cairo_fill(DestContext); cairo_destroy(DestContext); end; end; end; end; function CalculateScanline(Bits: Pointer; Width, Height, Row: Integer): Pointer; begin Result := nil; end; function GetBitmapBitsFromBitmap(Bitmap: HBITMAP): Pointer; begin Result := nil; end; doublecmd-0.5.8/components/virtualtreeview/include/intf/gtk2/vtvdragmanager.inc0000644000175000017500000000003612014201074027057 0ustar alexxalexx {$i ../dummydragmanager.inc} doublecmd-0.5.8/components/virtualtreeview/include/intf/gtk2/olemethods.inc0000644000175000017500000000003512014201074026211 0ustar alexxalexx {$i ../dummyolemethods.inc} doublecmd-0.5.8/components/virtualtreeview/include/intf/win32/0000755000175000017500000000000012257501472023466 5ustar alexxalexxdoublecmd-0.5.8/components/virtualtreeview/include/intf/win32/vtgraphicsi.inc0000644000175000017500000007645512140233030026504 0ustar alexxalexx {$ASMMODE INTEL} procedure AlphaBlendLineConstant(Source, Destination: Pointer; Count: Integer; ConstantAlpha, Bias: Integer); // Blends a line of Count pixels from Source to Destination using a constant alpha value. // The layout of a pixel must be BGRA where A is ignored (but is calculated as the other components). // ConstantAlpha must be in the range 0..255 where 0 means totally transparent (destination pixel only) // and 255 totally opaque (source pixel only). // Bias is an additional value which gets added to every component and must be in the range -128..127 asm {$ifdef CPU64} // RCX contains Source // RDX contains Destination // R8D contains Count // R9D contains ConstantAlpha // Bias is on the stack //.NOFRAME // Load XMM3 with the constant alpha value (replicate it for every component). // Expand it to word size. MOVD XMM3, R9D // ConstantAlpha PUNPCKLWD XMM3, XMM3 PUNPCKLDQ XMM3, XMM3 // Load XMM5 with the bias value. MOVD XMM5, [Bias] PUNPCKLWD XMM5, XMM5 PUNPCKLDQ XMM5, XMM5 // Load XMM4 with 128 to allow for saturated biasing. MOV R10D, 128 MOVD XMM4, R10D PUNPCKLWD XMM4, XMM4 PUNPCKLDQ XMM4, XMM4 @1: // The pixel loop calculates an entire pixel in one run. // Note: The pixel byte values are expanded into the higher bytes of a word due // to the way unpacking works. We compensate for this with an extra shift. MOVD XMM1, DWORD PTR [RCX] // data is unaligned MOVD XMM2, DWORD PTR [RDX] // data is unaligned PXOR XMM0, XMM0 // clear source pixel register for unpacking PUNPCKLBW XMM0, XMM1{[RCX]} // unpack source pixel byte values into words PSRLW XMM0, 8 // move higher bytes to lower bytes PXOR XMM1, XMM1 // clear target pixel register for unpacking PUNPCKLBW XMM1, XMM2{[RDX]} // unpack target pixel byte values into words MOVQ XMM2, XMM1 // make a copy of the shifted values, we need them again PSRLW XMM1, 8 // move higher bytes to lower bytes // calculation is: target = (alpha * (source - target) + 256 * target) / 256 PSUBW XMM0, XMM1 // source - target PMULLW XMM0, XMM3 // alpha * (source - target) PADDW XMM0, XMM2 // add target (in shifted form) PSRLW XMM0, 8 // divide by 256 // Bias is accounted for by conversion of range 0..255 to -128..127, // doing a saturated add and convert back to 0..255. PSUBW XMM0, XMM4 PADDSW XMM0, XMM5 PADDW XMM0, XMM4 PACKUSWB XMM0, XMM0 // convert words to bytes with saturation MOVD DWORD PTR [RDX], XMM0 // store the result @3: ADD RCX, 4 ADD RDX, 4 DEC R8D JNZ @1 {$else} // EAX contains Source // EDX contains Destination // ECX contains Count // ConstantAlpha and Bias are on the stack PUSH ESI // save used registers PUSH EDI MOV ESI, EAX // ESI becomes the actual source pointer MOV EDI, EDX // EDI becomes the actual target pointer // Load MM6 with the constant alpha value (replicate it for every component). // Expand it to word size. MOV EAX, [ConstantAlpha] DB $0F, $6E, $F0 /// MOVD MM6, EAX DB $0F, $61, $F6 /// PUNPCKLWD MM6, MM6 DB $0F, $62, $F6 /// PUNPCKLDQ MM6, MM6 // Load MM5 with the bias value. MOV EAX, [Bias] DB $0F, $6E, $E8 /// MOVD MM5, EAX DB $0F, $61, $ED /// PUNPCKLWD MM5, MM5 DB $0F, $62, $ED /// PUNPCKLDQ MM5, MM5 // Load MM4 with 128 to allow for saturated biasing. MOV EAX, 128 DB $0F, $6E, $E0 /// MOVD MM4, EAX DB $0F, $61, $E4 /// PUNPCKLWD MM4, MM4 DB $0F, $62, $E4 /// PUNPCKLDQ MM4, MM4 @1: // The pixel loop calculates an entire pixel in one run. // Note: The pixel byte values are expanded into the higher bytes of a word due // to the way unpacking works. We compensate for this with an extra shift. DB $0F, $EF, $C0 /// PXOR MM0, MM0, clear source pixel register for unpacking DB $0F, $60, $06 /// PUNPCKLBW MM0, [ESI], unpack source pixel byte values into words DB $0F, $71, $D0, $08 /// PSRLW MM0, 8, move higher bytes to lower bytes DB $0F, $EF, $C9 /// PXOR MM1, MM1, clear target pixel register for unpacking DB $0F, $60, $0F /// PUNPCKLBW MM1, [EDI], unpack target pixel byte values into words DB $0F, $6F, $D1 /// MOVQ MM2, MM1, make a copy of the shifted values, we need them again DB $0F, $71, $D1, $08 /// PSRLW MM1, 8, move higher bytes to lower bytes // calculation is: target = (alpha * (source - target) + 256 * target) / 256 DB $0F, $F9, $C1 /// PSUBW MM0, MM1, source - target DB $0F, $D5, $C6 /// PMULLW MM0, MM6, alpha * (source - target) DB $0F, $FD, $C2 /// PADDW MM0, MM2, add target (in shifted form) DB $0F, $71, $D0, $08 /// PSRLW MM0, 8, divide by 256 // Bias is accounted for by conversion of range 0..255 to -128..127, // doing a saturated add and convert back to 0..255. DB $0F, $F9, $C4 /// PSUBW MM0, MM4 DB $0F, $ED, $C5 /// PADDSW MM0, MM5 DB $0F, $FD, $C4 /// PADDW MM0, MM4 DB $0F, $67, $C0 /// PACKUSWB MM0, MM0, convert words to bytes with saturation DB $0F, $7E, $07 /// MOVD [EDI], MM0, store the result @3: ADD ESI, 4 ADD EDI, 4 DEC ECX JNZ @1 POP EDI POP ESI {$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure AlphaBlendLinePerPixel(Source, Destination: Pointer; Count, Bias: Integer); // Blends a line of Count pixels from Source to Destination using the alpha value of the source pixels. // The layout of a pixel must be BGRA. // Bias is an additional value which gets added to every component and must be in the range -128..127 asm {$ifdef CPU64} // RCX contains Source // RDX contains Destination // R8D contains Count // R9D contains Bias //.NOFRAME // Load XMM5 with the bias value. MOVD XMM5, R9D // Bias PUNPCKLWD XMM5, XMM5 PUNPCKLDQ XMM5, XMM5 // Load XMM4 with 128 to allow for saturated biasing. MOV R10D, 128 MOVD XMM4, R10D PUNPCKLWD XMM4, XMM4 PUNPCKLDQ XMM4, XMM4 @1: // The pixel loop calculates an entire pixel in one run. // Note: The pixel byte values are expanded into the higher bytes of a word due // to the way unpacking works. We compensate for this with an extra shift. MOVD XMM1, DWORD PTR [RCX] // data is unaligned MOVD XMM2, DWORD PTR [RDX] // data is unaligned PXOR XMM0, XMM0 // clear source pixel register for unpacking PUNPCKLBW XMM0, XMM1{[RCX]} // unpack source pixel byte values into words PSRLW XMM0, 8 // move higher bytes to lower bytes PXOR XMM1, XMM1 // clear target pixel register for unpacking PUNPCKLBW XMM1, XMM2{[RDX]} // unpack target pixel byte values into words MOVQ XMM2, XMM1 // make a copy of the shifted values, we need them again PSRLW XMM1, 8 // move higher bytes to lower bytes // Load XMM3 with the source alpha value (replicate it for every component). // Expand it to word size. MOVQ XMM3, XMM0 PUNPCKHWD XMM3, XMM3 PUNPCKHDQ XMM3, XMM3 // calculation is: target = (alpha * (source - target) + 256 * target) / 256 PSUBW XMM0, XMM1 // source - target PMULLW XMM0, XMM3 // alpha * (source - target) PADDW XMM0, XMM2 // add target (in shifted form) PSRLW XMM0, 8 // divide by 256 // Bias is accounted for by conversion of range 0..255 to -128..127, // doing a saturated add and convert back to 0..255. PSUBW XMM0, XMM4 PADDSW XMM0, XMM5 PADDW XMM0, XMM4 PACKUSWB XMM0, XMM0 // convert words to bytes with saturation MOVD DWORD PTR [RDX], XMM0 // store the result @3: ADD RCX, 4 ADD RDX, 4 DEC R8D JNZ @1 {$else} // EAX contains Source // EDX contains Destination // ECX contains Count // Bias is on the stack PUSH ESI // save used registers PUSH EDI MOV ESI, EAX // ESI becomes the actual source pointer MOV EDI, EDX // EDI becomes the actual target pointer // Load MM5 with the bias value. MOV EAX, [Bias] DB $0F, $6E, $E8 /// MOVD MM5, EAX DB $0F, $61, $ED /// PUNPCKLWD MM5, MM5 DB $0F, $62, $ED /// PUNPCKLDQ MM5, MM5 // Load MM4 with 128 to allow for saturated biasing. MOV EAX, 128 DB $0F, $6E, $E0 /// MOVD MM4, EAX DB $0F, $61, $E4 /// PUNPCKLWD MM4, MM4 DB $0F, $62, $E4 /// PUNPCKLDQ MM4, MM4 @1: // The pixel loop calculates an entire pixel in one run. // Note: The pixel byte values are expanded into the higher bytes of a word due // to the way unpacking works. We compensate for this with an extra shift. DB $0F, $EF, $C0 /// PXOR MM0, MM0, clear source pixel register for unpacking DB $0F, $60, $06 /// PUNPCKLBW MM0, [ESI], unpack source pixel byte values into words DB $0F, $71, $D0, $08 /// PSRLW MM0, 8, move higher bytes to lower bytes DB $0F, $EF, $C9 /// PXOR MM1, MM1, clear target pixel register for unpacking DB $0F, $60, $0F /// PUNPCKLBW MM1, [EDI], unpack target pixel byte values into words DB $0F, $6F, $D1 /// MOVQ MM2, MM1, make a copy of the shifted values, we need them again DB $0F, $71, $D1, $08 /// PSRLW MM1, 8, move higher bytes to lower bytes // Load MM6 with the source alpha value (replicate it for every component). // Expand it to word size. DB $0F, $6F, $F0 /// MOVQ MM6, MM0 DB $0F, $69, $F6 /// PUNPCKHWD MM6, MM6 DB $0F, $6A, $F6 /// PUNPCKHDQ MM6, MM6 // calculation is: target = (alpha * (source - target) + 256 * target) / 256 DB $0F, $F9, $C1 /// PSUBW MM0, MM1, source - target DB $0F, $D5, $C6 /// PMULLW MM0, MM6, alpha * (source - target) DB $0F, $FD, $C2 /// PADDW MM0, MM2, add target (in shifted form) DB $0F, $71, $D0, $08 /// PSRLW MM0, 8, divide by 256 // Bias is accounted for by conversion of range 0..255 to -128..127, // doing a saturated add and convert back to 0..255. DB $0F, $F9, $C4 /// PSUBW MM0, MM4 DB $0F, $ED, $C5 /// PADDSW MM0, MM5 DB $0F, $FD, $C4 /// PADDW MM0, MM4 DB $0F, $67, $C0 /// PACKUSWB MM0, MM0, convert words to bytes with saturation DB $0F, $7E, $07 /// MOVD [EDI], MM0, store the result @3: ADD ESI, 4 ADD EDI, 4 DEC ECX JNZ @1 POP EDI POP ESI {$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure AlphaBlendLineMaster(Source, Destination: Pointer; Count: Integer; ConstantAlpha, Bias: Integer); // Blends a line of Count pixels from Source to Destination using the source pixel and a constant alpha value. // The layout of a pixel must be BGRA. // ConstantAlpha must be in the range 0..255. // Bias is an additional value which gets added to every component and must be in the range -128..127 asm {$ifdef CPU64} // RCX contains Source // RDX contains Destination // R8D contains Count // R9D contains ConstantAlpha // Bias is on the stack //.SAVENV XMM6 //todo see how implement in fpc AlphaBlendLineMaster // Load XMM3 with the constant alpha value (replicate it for every component). // Expand it to word size. MOVD XMM3, R9D // ConstantAlpha PUNPCKLWD XMM3, XMM3 PUNPCKLDQ XMM3, XMM3 // Load XMM5 with the bias value. MOV R10D, [Bias] MOVD XMM5, R10D PUNPCKLWD XMM5, XMM5 PUNPCKLDQ XMM5, XMM5 // Load XMM4 with 128 to allow for saturated biasing. MOV R10D, 128 MOVD XMM4, R10D PUNPCKLWD XMM4, XMM4 PUNPCKLDQ XMM4, XMM4 @1: // The pixel loop calculates an entire pixel in one run. // Note: The pixel byte values are expanded into the higher bytes of a word due // to the way unpacking works. We compensate for this with an extra shift. MOVD XMM1, DWORD PTR [RCX] // data is unaligned MOVD XMM2, DWORD PTR [RDX] // data is unaligned PXOR XMM0, XMM0 // clear source pixel register for unpacking PUNPCKLBW XMM0, XMM1{[RCX]} // unpack source pixel byte values into words PSRLW XMM0, 8 // move higher bytes to lower bytes PXOR XMM1, XMM1 // clear target pixel register for unpacking PUNPCKLBW XMM1, XMM2{[RCX]} // unpack target pixel byte values into words MOVQ XMM2, XMM1 // make a copy of the shifted values, we need them again PSRLW XMM1, 8 // move higher bytes to lower bytes // Load XMM6 with the source alpha value (replicate it for every component). // Expand it to word size. MOVQ XMM6, XMM0 PUNPCKHWD XMM6, XMM6 PUNPCKHDQ XMM6, XMM6 PMULLW XMM6, XMM3 // source alpha * master alpha PSRLW XMM6, 8 // divide by 256 // calculation is: target = (alpha * master alpha * (source - target) + 256 * target) / 256 PSUBW XMM0, XMM1 // source - target PMULLW XMM0, XMM6 // alpha * (source - target) PADDW XMM0, XMM2 // add target (in shifted form) PSRLW XMM0, 8 // divide by 256 // Bias is accounted for by conversion of range 0..255 to -128..127, // doing a saturated add and convert back to 0..255. PSUBW XMM0, XMM4 PADDSW XMM0, XMM5 PADDW XMM0, XMM4 PACKUSWB XMM0, XMM0 // convert words to bytes with saturation MOVD DWORD PTR [RDX], XMM0 // store the result @3: ADD RCX, 4 ADD RDX, 4 DEC R8D JNZ @1 {$else} // EAX contains Source // EDX contains Destination // ECX contains Count // ConstantAlpha and Bias are on the stack PUSH ESI // save used registers PUSH EDI MOV ESI, EAX // ESI becomes the actual source pointer MOV EDI, EDX // EDI becomes the actual target pointer // Load MM6 with the constant alpha value (replicate it for every component). // Expand it to word size. MOV EAX, [ConstantAlpha] DB $0F, $6E, $F0 /// MOVD MM6, EAX DB $0F, $61, $F6 /// PUNPCKLWD MM6, MM6 DB $0F, $62, $F6 /// PUNPCKLDQ MM6, MM6 // Load MM5 with the bias value. MOV EAX, [Bias] DB $0F, $6E, $E8 /// MOVD MM5, EAX DB $0F, $61, $ED /// PUNPCKLWD MM5, MM5 DB $0F, $62, $ED /// PUNPCKLDQ MM5, MM5 // Load MM4 with 128 to allow for saturated biasing. MOV EAX, 128 DB $0F, $6E, $E0 /// MOVD MM4, EAX DB $0F, $61, $E4 /// PUNPCKLWD MM4, MM4 DB $0F, $62, $E4 /// PUNPCKLDQ MM4, MM4 @1: // The pixel loop calculates an entire pixel in one run. // Note: The pixel byte values are expanded into the higher bytes of a word due // to the way unpacking works. We compensate for this with an extra shift. DB $0F, $EF, $C0 /// PXOR MM0, MM0, clear source pixel register for unpacking DB $0F, $60, $06 /// PUNPCKLBW MM0, [ESI], unpack source pixel byte values into words DB $0F, $71, $D0, $08 /// PSRLW MM0, 8, move higher bytes to lower bytes DB $0F, $EF, $C9 /// PXOR MM1, MM1, clear target pixel register for unpacking DB $0F, $60, $0F /// PUNPCKLBW MM1, [EDI], unpack target pixel byte values into words DB $0F, $6F, $D1 /// MOVQ MM2, MM1, make a copy of the shifted values, we need them again DB $0F, $71, $D1, $08 /// PSRLW MM1, 8, move higher bytes to lower bytes // Load MM7 with the source alpha value (replicate it for every component). // Expand it to word size. DB $0F, $6F, $F8 /// MOVQ MM7, MM0 DB $0F, $69, $FF /// PUNPCKHWD MM7, MM7 DB $0F, $6A, $FF /// PUNPCKHDQ MM7, MM7 DB $0F, $D5, $FE /// PMULLW MM7, MM6, source alpha * master alpha DB $0F, $71, $D7, $08 /// PSRLW MM7, 8, divide by 256 // calculation is: target = (alpha * master alpha * (source - target) + 256 * target) / 256 DB $0F, $F9, $C1 /// PSUBW MM0, MM1, source - target DB $0F, $D5, $C7 /// PMULLW MM0, MM7, alpha * (source - target) DB $0F, $FD, $C2 /// PADDW MM0, MM2, add target (in shifted form) DB $0F, $71, $D0, $08 /// PSRLW MM0, 8, divide by 256 // Bias is accounted for by conversion of range 0..255 to -128..127, // doing a saturated add and convert back to 0..255. DB $0F, $F9, $C4 /// PSUBW MM0, MM4 DB $0F, $ED, $C5 /// PADDSW MM0, MM5 DB $0F, $FD, $C4 /// PADDW MM0, MM4 DB $0F, $67, $C0 /// PACKUSWB MM0, MM0, convert words to bytes with saturation DB $0F, $7E, $07 /// MOVD [EDI], MM0, store the result @3: ADD ESI, 4 ADD EDI, 4 DEC ECX JNZ @1 POP EDI POP ESI {$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure AlphaBlendLineMasterAndColor(Destination: Pointer; Count: Integer; ConstantAlpha, Color: Integer); // Blends a line of Count pixels in Destination against the given color using a constant alpha value. // The layout of a pixel must be BGRA and Color must be rrggbb00 (as stored by a COLORREF). // ConstantAlpha must be in the range 0..255. asm {$ifdef CPU64} // RCX contains Destination // EDX contains Count // R8D contains ConstantAlpha // R9D contains Color //.NOFRAME // The used formula is: target = (alpha * color + (256 - alpha) * target) / 256. // alpha * color (factor 1) and 256 - alpha (factor 2) are constant values which can be calculated in advance. // The remaining calculation is therefore: target = (F1 + F2 * target) / 256 // Load XMM3 with the constant alpha value (replicate it for every component). // Expand it to word size. (Every calculation here works on word sized operands.) MOVD XMM3, R8D // ConstantAlpha PUNPCKLWD XMM3, XMM3 PUNPCKLDQ XMM3, XMM3 // Calculate factor 2. MOV R10D, $100 MOVD XMM2, R10D PUNPCKLWD XMM2, XMM2 PUNPCKLDQ XMM2, XMM2 PSUBW XMM2, XMM3 // XMM2 contains now: 255 - alpha = F2 // Now calculate factor 1. Alpha is still in XMM3, but the r and b components of Color must be swapped. BSWAP R9D // Color ROR R9D, 8 MOVD XMM1, R9D // Load the color and convert to word sized values. PXOR XMM4, XMM4 PUNPCKLBW XMM1, XMM4 PMULLW XMM1, XMM3 // XMM1 contains now: color * alpha = F1 @1: // The pixel loop calculates an entire pixel in one run. MOVD XMM0, DWORD PTR [RCX] PUNPCKLBW XMM0, XMM4 PMULLW XMM0, XMM2 // calculate F1 + F2 * target PADDW XMM0, XMM1 PSRLW XMM0, 8 // divide by 256 PACKUSWB XMM0, XMM0 // convert words to bytes with saturation MOVD DWORD PTR [RCX], XMM0 // store the result ADD RCX, 4 DEC EDX JNZ @1 {$else} // EAX contains Destination // EDX contains Count // ECX contains ConstantAlpha // Color is passed on the stack // The used formula is: target = (alpha * color + (256 - alpha) * target) / 256. // alpha * color (factor 1) and 256 - alpha (factor 2) are constant values which can be calculated in advance. // The remaining calculation is therefore: target = (F1 + F2 * target) / 256 // Load MM3 with the constant alpha value (replicate it for every component). // Expand it to word size. (Every calculation here works on word sized operands.) DB $0F, $6E, $D9 /// MOVD MM3, ECX DB $0F, $61, $DB /// PUNPCKLWD MM3, MM3 DB $0F, $62, $DB /// PUNPCKLDQ MM3, MM3 // Calculate factor 2. MOV ECX, $100 DB $0F, $6E, $D1 /// MOVD MM2, ECX DB $0F, $61, $D2 /// PUNPCKLWD MM2, MM2 DB $0F, $62, $D2 /// PUNPCKLDQ MM2, MM2 DB $0F, $F9, $D3 /// PSUBW MM2, MM3 // MM2 contains now: 255 - alpha = F2 // Now calculate factor 1. Alpha is still in MM3, but the r and b components of Color must be swapped. MOV ECX, [Color] BSWAP ECX ROR ECX, 8 DB $0F, $6E, $C9 /// MOVD MM1, ECX // Load the color and convert to word sized values. DB $0F, $EF, $E4 /// PXOR MM4, MM4 DB $0F, $60, $CC /// PUNPCKLBW MM1, MM4 DB $0F, $D5, $CB /// PMULLW MM1, MM3 // MM1 contains now: color * alpha = F1 @1: // The pixel loop calculates an entire pixel in one run. DB $0F, $6E, $00 /// MOVD MM0, [EAX] DB $0F, $60, $C4 /// PUNPCKLBW MM0, MM4 DB $0F, $D5, $C2 /// PMULLW MM0, MM2 // calculate F1 + F2 * target DB $0F, $FD, $C1 /// PADDW MM0, MM1 DB $0F, $71, $D0, $08 /// PSRLW MM0, 8 // divide by 256 DB $0F, $67, $C0 /// PACKUSWB MM0, MM0 // convert words to bytes with saturation DB $0F, $7E, $00 /// MOVD [EAX], MM0 // store the result ADD EAX, 4 DEC EDX JNZ @1 {$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure EMMS; // Reset MMX state to use the FPU for other tasks again. {$ifdef CPU64} inline; begin end; {$else} asm DB $0F, $77 /// EMMS end; {$endif} //---------------------------------------------------------------------------------------------------------------------- function GetBitmapBitsFromDeviceContext(DC: HDC; out Width, Height: Integer): Pointer; // Helper function used to retrieve the bitmap selected into the given device context. If there is a bitmap then // the function will return a pointer to its bits otherwise nil is returned. // Additionally the dimensions of the bitmap are returned. var Bitmap: HBITMAP; DIB: TDIBSection; begin Result := nil; Width := 0; Height := 0; Bitmap := GetCurrentObject(DC, OBJ_BITMAP); if Bitmap <> 0 then begin if GetObject(Bitmap, SizeOf(DIB), @DIB) = SizeOf(DIB) then begin Assert(DIB.dsBm.bmPlanes * DIB.dsBm.bmBitsPixel = 32, 'Alpha blending error: bitmap must use 32 bpp.'); Result := DIB.dsBm.bmBits; Width := DIB.dsBmih.biWidth; Height := DIB.dsBmih.biHeight; end; end; Assert(Result <> nil, 'Alpha blending DC error: no bitmap available.'); end; //---------------------------------------------------------------------------------------------------------------------- function GetBitmapBitsFromBitmap(Bitmap: HBITMAP): Pointer; var DIB: TDIBSection; begin Result := nil; if Bitmap <> 0 then begin if GetObject(Bitmap, SizeOf(DIB), @DIB) = SizeOf(DIB) then begin Assert(DIB.dsBm.bmPlanes * DIB.dsBm.bmBitsPixel = 32, 'Alpha blending error: bitmap must use 32 bpp.'); Result := DIB.dsBm.bmBits; end; end; end; function CalculateScanline(Bits: Pointer; Width, Height, Row: Integer): Pointer; // Helper function to calculate the start address for the given row. begin //todo: Height is always > 0 in LCL { if Height > 0 then // bottom-up DIB Row := Height - Row - 1; } // Return DWORD aligned address of the requested scanline. Result := Bits + Row * ((Width * 32 + 31) and not 31) div 8; end; //---------------------------------------------------------------------------------------------------------------------- procedure AlphaBlend(Source, Destination: HDC; const R: TRect; const Target: TPoint; Mode: TBlendMode; ConstantAlpha, Bias: Integer); // Optimized alpha blend procedure using MMX instructions to perform as quick as possible. // For this procedure to work properly it is important that both source and target bitmap use the 32 bit color format. // R describes the source rectangle to work on. // Target is the place (upper left corner) in the target bitmap where to blend to. Note that source width + X offset // must be less or equal to the target width. Similar for the height. // If Mode is bmConstantAlpha then the blend operation uses the given ConstantAlpha value for all pixels. // If Mode is bmPerPixelAlpha then each pixel is blended using its individual alpha value (the alpha value of the source). // If Mode is bmMasterAlpha then each pixel is blended using its individual alpha value multiplied by ConstantAlpha. // If Mode is bmConstantAlphaAndColor then each destination pixel is blended using ConstantAlpha but also a constant // color which will be obtained from Bias. In this case no offset value is added, otherwise Bias is used as offset. // Blending of a color into target only (bmConstantAlphaAndColor) ignores Source (the DC) and Target (the position). // CAUTION: This procedure does not check whether MMX instructions are actually available! Call it only if MMX is really // usable. var Y: Integer; SourceRun, TargetRun: PByte; SourceBits, DestBits: Pointer; SourceWidth, SourceHeight, DestWidth, DestHeight: Integer; begin if not IsRectEmpty(R) then begin {$ifdef CPU64} //avoid MasterAlpha due to incomplete AlphaBlendLineMaster. See comment in procedure if Mode = bmMasterAlpha then Mode := bmConstantAlpha; {$endif} // Note: it is tempting to optimize the special cases for constant alpha 0 and 255 by just ignoring soure // (alpha = 0) or simply do a blit (alpha = 255). But this does not take the bias into account. case Mode of bmConstantAlpha: begin // Get a pointer to the bitmap bits for the source and target device contexts. // Note: this supposes that both contexts do actually have bitmaps assigned! SourceBits := GetBitmapBitsFromDeviceContext(Source, SourceWidth, SourceHeight); DestBits := GetBitmapBitsFromDeviceContext(Destination, DestWidth, DestHeight); if Assigned(SourceBits) and Assigned(DestBits) then begin for Y := 0 to R.Bottom - R.Top - 1 do begin SourceRun := CalculateScanline(SourceBits, SourceWidth, SourceHeight, Y + R.Top); Inc(SourceRun, 4 * R.Left); TargetRun := CalculateScanline(DestBits, DestWidth, DestHeight, Y + Target.Y); Inc(TargetRun, 4 * Target.X); AlphaBlendLineConstant(SourceRun, TargetRun, R.Right - R.Left, ConstantAlpha, Bias); end; end; EMMS; end; bmPerPixelAlpha: begin SourceBits := GetBitmapBitsFromDeviceContext(Source, SourceWidth, SourceHeight); DestBits := GetBitmapBitsFromDeviceContext(Destination, DestWidth, DestHeight); if Assigned(SourceBits) and Assigned(DestBits) then begin for Y := 0 to R.Bottom - R.Top - 1 do begin SourceRun := CalculateScanline(SourceBits, SourceWidth, SourceHeight, Y + R.Top); Inc(SourceRun, 4 * R.Left); TargetRun := CalculateScanline(DestBits, DestWidth, DestHeight, Y + Target.Y); Inc(TargetRun, 4 * Target.X); AlphaBlendLinePerPixel(SourceRun, TargetRun, R.Right - R.Left, Bias); end; end; EMMS; end; bmMasterAlpha: begin SourceBits := GetBitmapBitsFromDeviceContext(Source, SourceWidth, SourceHeight); DestBits := GetBitmapBitsFromDeviceContext(Destination, DestWidth, DestHeight); if Assigned(SourceBits) and Assigned(DestBits) then begin for Y := 0 to R.Bottom - R.Top - 1 do begin SourceRun := CalculateScanline(SourceBits, SourceWidth, SourceHeight, Y + R.Top); Inc(SourceRun, 4 * Target.X); TargetRun := CalculateScanline(DestBits, DestWidth, DestHeight, Y + Target.Y); AlphaBlendLineMaster(SourceRun, TargetRun, R.Right - R.Left, ConstantAlpha, Bias); end; end; EMMS; end; bmConstantAlphaAndColor: begin // Source is ignored since there is a constant color value. DestBits := GetBitmapBitsFromDeviceContext(Destination, DestWidth, DestHeight); if Assigned(DestBits) then begin for Y := 0 to R.Bottom - R.Top - 1 do begin TargetRun := CalculateScanline(DestBits, DestWidth, DestHeight, Y + R.Top); Inc(TargetRun, 4 * R.Left); AlphaBlendLineMasterAndColor(TargetRun, R.Right - R.Left, ConstantAlpha, Bias); end; end; EMMS; end; end; end; end; doublecmd-0.5.8/components/virtualtreeview/include/intf/win32/vtvdragmanager.inc0000644000175000017500000005765712140233030027174 0ustar alexxalexx //---------------------------------------------------------------------------------------------------------------------- // OLE drag and drop support classes // This is quite heavy stuff (compared with the VCL implementation) but is much better suited to fit the needs // of DD'ing various kinds of virtual data and works also between applications. //----------------- TEnumFormatEtc ------------------------------------------------------------------------------------- constructor TEnumFormatEtc.Create(Tree: TBaseVirtualTree; AFormatEtcArray: TFormatEtcArray); var I: Integer; begin inherited Create; FTree := Tree; // Make a local copy of the format data. SetLength(FFormatEtcArray, Length(AFormatEtcArray)); for I := 0 to High(AFormatEtcArray) do FFormatEtcArray[I] := AFormatEtcArray[I]; end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Clone(out Enum: IEnumFormatEtc): HResult; var AClone: TEnumFormatEtc; begin Result := S_OK; try AClone := TEnumFormatEtc.Create(nil, FFormatEtcArray); AClone.FCurrentIndex := FCurrentIndex; Enum := AClone as IEnumFormatEtc; except Result := E_FAIL; end; end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Next(celt: LongWord; out elt: FormatEtc; pceltFetched:pULong=nil): HResult; var CopyCount: LongWord; begin Result := S_FALSE; CopyCount := Length(FFormatEtcArray) - FCurrentIndex; if celt < CopyCount then CopyCount := celt; if CopyCount > 0 then begin Move(FFormatEtcArray[FCurrentIndex], elt, CopyCount * SizeOf(TFormatEtc)); Inc(FCurrentIndex, CopyCount); Result := S_OK; end; if pceltFetched <> nil then pceltFetched^ := CopyCount; end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Reset: HResult; begin FCurrentIndex := 0; Result := S_OK; end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Skip(celt: LongWord): HResult; begin if FCurrentIndex + celt < High(FFormatEtcArray) then begin Inc(FCurrentIndex, celt); Result := S_Ok; end else Result := S_FALSE; end; //----------------- TVTDataObject -------------------------------------------------------------------------------------- constructor TVTDataObject.Create(AOwner: TBaseVirtualTree; ForClipboard: Boolean); begin inherited Create; FOwner := AOwner; FForClipboard := ForClipboard; FOwner.GetNativeClipboardFormats(FFormatEtcArray); end; //---------------------------------------------------------------------------------------------------------------------- destructor TVTDataObject.Destroy; var I: Integer; StgMedium: PStgMedium; begin // Cancel a pending clipboard operation if this data object was created for the clipboard and // is freed because something else is placed there. if FForClipboard and not (tsClipboardFlushing in FOwner.FStates) then FOwner.CancelCutOrCopy; // Release any internal clipboard formats for I := 0 to High(FormatEtcArray) do begin StgMedium := FindInternalStgMedium(FormatEtcArray[I].cfFormat); if Assigned(StgMedium) then ReleaseStgMedium(StgMedium); end; FormatEtcArray := nil; inherited; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.CanonicalIUnknown(TestUnknown: IUnknown): IUnknown; // Uses COM object identity: An explicit call to the IUnknown::QueryInterface method, requesting the IUnknown // interface, will always return the same pointer. begin if Assigned(TestUnknown) then begin if TestUnknown.QueryInterface(IUnknown, Result) = 0 then Result._Release // Don't actually need it just need the pointer value else Result := TestUnknown end else Result := TestUnknown end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EqualFormatEtc(FormatEtc1, FormatEtc2: TFormatEtc): Boolean; begin Result := (FormatEtc1.cfFormat = FormatEtc2.cfFormat) and (FormatEtc1.ptd = FormatEtc2.ptd) and (FormatEtc1.dwAspect = FormatEtc2.dwAspect) and (FormatEtc1.lindex = FormatEtc2.lindex) and (FormatEtc1.tymed and FormatEtc2.tymed <> 0); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.FindFormatEtc(TestFormatEtc: TFormatEtc; const FormatEtcArray: TFormatEtcArray): integer; var I: integer; begin Result := -1; for I := 0 to High(FormatEtcArray) do begin if EqualFormatEtc(TestFormatEtc, FormatEtcArray[I]) then begin Result := I; Break; end end; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.FindInternalStgMedium(Format: TClipFormat): PStgMedium; var I: integer; begin Result := nil; for I := 0 to High(InternalStgMediumArray) do begin if Format = InternalStgMediumArray[I].Format then begin Result := @InternalStgMediumArray[I].Medium; Break; end end; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.HGlobalClone(HGlobal: THandle): THandle; // Returns a global memory block that is a copy of the passed memory block. var Size: Cardinal; Data, NewData: PByte; begin Size := GlobalSize(HGlobal); Result := GlobalAlloc(GPTR, Size); Data := GlobalLock(hGlobal); try NewData := GlobalLock(Result); try Move(Data^, NewData^, Size); finally GlobalUnLock(Result); end finally GlobalUnLock(hGlobal); end; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.RenderInternalOLEData(const FormatEtcIn: TFormatEtc; var Medium: TStgMedium; var OLEResult: HResult): Boolean; // Tries to render one of the formats which have been stored via the SetData method. // Since this data is already there it is just copied or its reference count is increased (depending on storage medium). var InternalMedium: PStgMedium; begin Result := True; InternalMedium := FindInternalStgMedium(FormatEtcIn.cfFormat); if Assigned(InternalMedium) then OLEResult := StgMediumIncRef(InternalMedium^, Medium, False, Self as IDataObject) else Result := False; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.StgMediumIncRef(const InStgMedium: TStgMedium; var OutStgMedium: TStgMedium; CopyInMedium: Boolean; DataObject: IDataObject): HRESULT; // InStgMedium is the data that is requested, OutStgMedium is the data that we are to return either a copy of or // increase the IDataObject's reference and send ourselves back as the data (unkForRelease). The InStgMedium is usually // the result of a call to find a particular FormatEtc that has been stored locally through a call to SetData. // If CopyInMedium is not true we already have a local copy of the data when the SetData function was called (during // that call the CopyInMedium must be true). Then as the caller asks for the data through GetData we do not have to make // copy of the data for the caller only to have them destroy it then need us to copy it again if necessary. // This way we increase the reference count to ourselves and pass the STGMEDIUM structure initially stored in SetData. // This way when the caller frees the structure it sees the unkForRelease is not nil and calls Release on the object // instead of destroying the actual data. var Len: Integer; begin Result := S_OK; // Simply copy all fields to start with. OutStgMedium := InStgMedium; // The data handled here always results from a call of SetData we got. This ensures only one storage format // is indicated and hence the case statement below is safe (IDataObject.GetData can optionally use several // storage formats). case InStgMedium.tymed of TYMED_HGLOBAL: begin if CopyInMedium then begin // Generate a unique copy of the data passed OutStgMedium.hGlobal := HGlobalClone(InStgMedium.hGlobal); if OutStgMedium.hGlobal = 0 then Result := E_OUTOFMEMORY end else // Don't generate a copy just use ourselves and the copy previously saved. OutStgMedium.PunkForRelease := Pointer(DataObject); // Does not increase RefCount. end; TYMED_FILE: begin //todo_lcl_check Len := Length(WideString(InStgMedium.lpszFileName)) + 1; // Don't forget the terminating null character. OutStgMedium.lpszFileName := CoTaskMemAlloc(2 * Len); Move(InStgMedium.lpszFileName^, OutStgMedium.lpszFileName^, 2 * Len); end; TYMED_ISTREAM: IUnknown(OutStgMedium.Pstm)._AddRef; TYMED_ISTORAGE: IUnknown(OutStgMedium.Pstg)._AddRef; TYMED_GDI: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy GDI objects right now. TYMED_MFPICT: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy MetaFile objects right now. TYMED_ENHMF: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy enhanced metafiles objects right now. else Result := DV_E_TYMED; end; if (Result = S_OK) and Assigned(OutStgMedium.PunkForRelease) then IUnknown(OutStgMedium.PunkForRelease)._AddRef; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.DAdvise(const FormatEtc: TFormatEtc; advf: DWord; const advSink: IAdviseSink; out dwConnection: DWord): HResult; // Advise sink management is greatly simplified by the IDataAdviseHolder interface. // We use this interface and forward all concerning calls to it. begin Result := S_OK; if FAdviseHolder = nil then Result := CreateDataAdviseHolder(FAdviseHolder); if Result = S_OK then Result := FAdviseHolder.Advise(Self as IDataObject, FormatEtc, advf, advSink, dwConnection); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.DUnadvise(dwConnection: DWord): HResult; begin if FAdviseHolder = nil then Result := E_NOTIMPL else Result := FAdviseHolder.Unadvise(dwConnection); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EnumDAdvise(Out enumAdvise : IEnumStatData):HResult; begin if FAdviseHolder = nil then Result := OLE_E_ADVISENOTSUPPORTED else Result := FAdviseHolder.EnumAdvise(enumAdvise); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EnumFormatEtc(Direction: DWord; out EnumFormatEtc: IEnumFormatEtc): HResult; var NewList: TEnumFormatEtc; begin Result := E_FAIL; if Direction = DATADIR_GET then begin NewList := TEnumFormatEtc.Create(FOwner, FormatEtcArray); EnumFormatEtc := NewList as IEnumFormatEtc; Result := S_OK; end else EnumFormatEtc := nil; if EnumFormatEtc = nil then Result := OLE_S_USEREG; end; //---------------------------------------------------------------------------------------------------------------------- Function TVTDataObject.GetCanonicalFormatEtc(const pformatetcIn : FORMATETC;Out pformatetcOut : FORMATETC):HResult; begin Result := DATA_S_SAMEFORMATETC; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.GetData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium): HResult; // Data is requested by clipboard or drop target. This method dispatchs the call // depending on the data being requested. var I: Integer; Data: PVTReference; begin // The tree reference format is always supported and returned from here. if FormatEtcIn.cfFormat = CF_VTREFERENCE then begin // Note: this format is not used while flushing the clipboard to avoid a dangling reference // when the owner tree is destroyed before the clipboard data is replaced with something else. if tsClipboardFlushing in FOwner.FStates then Result := E_FAIL else begin Medium.hGlobal := GlobalAlloc(GHND or GMEM_SHARE, SizeOf(TVTReference)); Data := GlobalLock(Medium.hGlobal); Data.Process := GetCurrentProcessID; Data.Tree := FOwner; GlobalUnlock(Medium.hGlobal); Medium.tymed := TYMED_HGLOBAL; Medium.PunkForRelease := nil; Result := S_OK; end; end else begin try // See if we accept this type and if not get the correct return value. Result := QueryGetData(FormatEtcIn); if Result = S_OK then begin for I := 0 to High(FormatEtcArray) do begin if EqualFormatEtc(FormatEtcIn, FormatEtcArray[I]) then begin if not RenderInternalOLEData(FormatEtcIn, Medium, Result) then Result := FOwner.RenderOLEData(FormatEtcIn, Medium, FForClipboard); Break; end; end end except FillChar(Medium, SizeOf(Medium), #0); Result := E_FAIL; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.GetDataHere(const FormatEtc: TFormatEtc; out Medium: TStgMedium): HResult; begin Result := E_NOTIMPL; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.QueryGetData(const FormatEtc: TFormatEtc): HResult; var I: Integer; begin Result := DV_E_CLIPFORMAT; for I := 0 to High(FFormatEtcArray) do begin if FormatEtc.cfFormat = FFormatEtcArray[I].cfFormat then begin if (FormatEtc.tymed and FFormatEtcArray[I].tymed) <> 0 then begin if FormatEtc.dwAspect = FFormatEtcArray[I].dwAspect then begin if FormatEtc.lindex = FFormatEtcArray[I].lindex then begin Result := S_OK; Break; end else Result := DV_E_LINDEX; end else Result := DV_E_DVASPECT; end else Result := DV_E_TYMED; end; end end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.SetData(const FormatEtc: TFormatEtc; const Medium: TStgMedium; DoRelease: BOOL): HResult; // Allows dynamic adding to the IDataObject during its existance. Most noteably it is used to implement // IDropSourceHelper and allows to set a special format for optimized moves during a shell transfer. var Index: Integer; LocalStgMedium: PStgMedium; begin // See if we already have a format of that type available. Index := FindFormatEtc(FormatEtc, FormatEtcArray); if Index > - 1 then begin // Just use the TFormatEct in the array after releasing the data. LocalStgMedium := FindInternalStgMedium(FormatEtcArray[Index].cfFormat); if Assigned(LocalStgMedium) then begin ReleaseStgMedium(LocalStgMedium); FillChar(LocalStgMedium^, SizeOf(LocalStgMedium^), #0); end; end else begin // It is a new format so create a new TFormatCollectionItem, copy the // FormatEtc parameter into the new object and and put it in the list. SetLength(FFormatEtcArray, Length(FormatEtcArray) + 1); FormatEtcArray[High(FormatEtcArray)] := FormatEtc; // Create a new InternalStgMedium and initialize it and associate it with the format. SetLength(FInternalStgMediumArray, Length(InternalStgMediumArray) + 1); InternalStgMediumArray[High(InternalStgMediumArray)].Format := FormatEtc.cfFormat; LocalStgMedium := @InternalStgMediumArray[High(InternalStgMediumArray)].Medium; FillChar(LocalStgMedium^, SizeOf(LocalStgMedium^), #0); end; if DoRelease then begin // We are simply being given the data and we take control of it. LocalStgMedium^ := Medium; Result := S_OK end else begin // We need to reference count or copy the data and keep our own references to it. Result := StgMediumIncRef(Medium, LocalStgMedium^, True, Self as IDataObject); // Can get a circular reference if the client calls GetData then calls SetData with the same StgMedium. // Because the unkForRelease for the IDataObject can be marshalled it is necessary to get pointers that // can be correctly compared. See the IDragSourceHelper article by Raymond Chen at MSDN. if Assigned(LocalStgMedium.PunkForRelease) then begin if CanonicalIUnknown(Self) = CanonicalIUnknown(IUnknown(LocalStgMedium.PunkForRelease)) then IUnknown(LocalStgMedium.PunkForRelease) := nil; // release the interface end; end; // Tell all registered advice sinks about the data change. if Assigned(FAdviseHolder) then FAdviseHolder.SendOnDataChange(Self as IDataObject, 0, 0); end; //----------------- TVTDragManager ------------------------------------------------------------------------------------- constructor TVTDragManager.Create(AOwner: TBaseVirtualTree); begin inherited Create; FOwner := AOwner; // Create an instance of the drop target helper interface. This will fail but not harm on systems which do // not support this interface (everything below Windows 2000); CoCreateInstance(CLSID_DragDropHelper, nil, CLSCTX_INPROC_SERVER, IID_IDropTargetHelper, FDropTargetHelper); end; //---------------------------------------------------------------------------------------------------------------------- destructor TVTDragManager.Destroy; begin // Set the owner's reference to us to nil otherwise it will access an invalid pointer // after our desctruction is complete. Pointer(FOwner.FDragManager) := nil; inherited; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDataObject: IDataObject; begin // When the owner tree starts a drag operation then it gets a data object here to pass it to the OLE subsystem. // In this case there is no local reference to a data object and one is created (but not stored). // If there is a local reference then the owner tree is currently the drop target and the stored interface is // that of the drag initiator. if Assigned(FDataObject) then Result := FDataObject else begin Result := FOwner.DoCreateDataObject; if Result = nil then Result := TVTDataObject.Create(FOwner, False) as IDataObject; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDragSource: TBaseVirtualTree; begin Result := FDragSource; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDropTargetHelperSupported: Boolean; begin Result := Assigned(FDropTargetHelper); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetIsDropTarget: Boolean; begin Result := FIsDropTarget; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragEnter(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin FDataObject := DataObject; FIsDropTarget := True; SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, @FFullDragging, 0); // If full dragging of window contents is disabled in the system then our tree windows will be locked // and cannot be updated during a drag operation. With the following call painting is again enabled. if not FFullDragging then LockWindowUpdate(0); if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragEnter(FOwner.Handle, DataObject, Pt, Effect); FDragSource := FOwner.GetTreeFromDataObject(DataObject); Result := FOwner.DragEnter(KeyState, Pt, Effect); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragLeave: HResult; begin if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragLeave; FOwner.DragLeave; FIsDropTarget := False; FDragSource := nil; FDataObject := nil; Result := NOERROR; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragOver(KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragOver(Pt, Effect); Result := FOwner.DragOver(FDragSource, KeyState, dsDragMove, Pt, Effect); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.Drop(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.Drop(DataObject, Pt, Effect); Result := FOwner.DragDrop(DataObject, KeyState, Pt, Effect); FIsDropTarget := False; FDataObject := nil; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTDragManager.ForceDragLeave; // Some drop targets, e.g. Internet Explorer leave a drag image on screen instead removing it when they receive // a drop action. This method calls the drop target helper's DragLeave method to ensure it removes the drag image from // screen. Unfortunately, sometimes not even this does help (e.g. when dragging text from VT to a text field in IE). begin if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragLeave; end; //---------------------------------------------------------------------------------------------------------------------- {$IF FPC_FULLVERSION < 020601} function TVTDragManager.GiveFeedback(Effect: Longint): HResult; {$ELSE} function TVTDragManager.GiveFeedback(Effect: LongWord): HResult; {$ENDIF} begin Result := DRAGDROP_S_USEDEFAULTCURSORS; end; //---------------------------------------------------------------------------------------------------------------------- {$IF FPC_FULLVERSION < 020601} function TVTDragManager.QueryContinueDrag(EscapePressed: BOOL; KeyState: Longint): HResult; {$ELSE} function TVTDragManager.QueryContinueDrag(EscapePressed: BOOL; KeyState: LongWord): HResult; {$ENDIF} var RButton, LButton: Boolean; begin LButton := (KeyState and MK_LBUTTON) <> 0; RButton := (KeyState and MK_RBUTTON) <> 0; // Drag'n drop canceled by pressing both mouse buttons or Esc? if (LButton and RButton) or EscapePressed then Result := DRAGDROP_S_CANCEL else // Drag'n drop finished? if not (LButton or RButton) then Result := DRAGDROP_S_DROP else Result := S_OK; end; doublecmd-0.5.8/components/virtualtreeview/include/intf/win32/olemethods.inc0000644000175000017500000003466612014201074026325 0ustar alexxalexxfunction TBaseVirtualTree.GetTreeFromDataObject(const DataObject: IDataObject): TBaseVirtualTree; // Returns the owner/sender of the given data object by means of a special clipboard format // or nil if the sender is in another process or no virtual tree at all. var Medium: TStgMedium; Data: PVTReference; begin Result := nil; if Assigned(DataObject) then begin StandardOLEFormat.cfFormat := CF_VTREFERENCE; if DataObject.GetData(StandardOLEFormat, Medium) = S_OK then begin Data := GlobalLock(Medium.hGlobal); if Assigned(Data) then begin if Data.Process = GetCurrentProcessID then Result := Data.Tree; GlobalUnlock(Medium.hGlobal); end; ReleaseStgMedium(@Medium); end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.RenderOLEData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean): HResult; // Returns a memory expression of all currently selected nodes in the Medium structure. // Note: The memory requirement of this method might be very high. This depends however on the requested storage format. // For HGlobal (a global memory block) we need to render first all nodes to local memory and copy this then to // the global memory in Medium. This is necessary because we have first to determine how much // memory is needed before we can allocate it. Hence for a short moment we need twice the space as used by the // nodes alone (plus the amount the nodes need in the tree anyway)! // With IStream this does not happen. We directly stream out the nodes and pass the constructed stream along. //--------------- local function -------------------------------------------- procedure WriteNodes(Stream: TStream); var Selection: TNodeArray; I: Integer; begin if ForClipboard then Selection := GetSortedCutCopySet(True) else Selection := GetSortedSelection(True); for I := 0 to High(Selection) do WriteNode(Stream, Selection[I]); end; //--------------- end local function ---------------------------------------- var Data: PCardinal; ResPointer: Pointer; ResSize: Integer; OLEStream: IStream; VCLStream: TStream; begin FillChar(Medium, SizeOf(Medium), 0); // We can render the native clipboard format in two different storage media. if (FormatEtcIn.cfFormat = CF_VIRTUALTREE) and (FormatEtcIn.tymed and (TYMED_HGLOBAL or TYMED_ISTREAM) <> 0) then begin VCLStream := nil; try Medium.PunkForRelease := nil; // Return data in one of the supported storage formats, prefer IStream. if FormatEtcIn.tymed and TYMED_ISTREAM <> 0 then begin // Create an IStream on a memory handle (here it is 0 which indicates to implicitely allocated a handle). // Do not use TStreamAdapter as it is not compatible with OLE (when flushing the clipboard OLE wants the HGlobal // back which is not supported by TStreamAdapater). CreateStreamOnHGlobal(0, True, OLEStream); VCLStream := TOLEStream.Create(OLEStream); WriteNodes(VCLStream); // Rewind stream. VCLStream.Position := 0; Medium.tymed := TYMED_ISTREAM; IUnknown(Medium.Pstm) := OLEStream; Result := S_OK; end else begin VCLStream := TMemoryStream.Create; WriteNodes(VCLStream); ResPointer := TMemoryStream(VCLStream).Memory; ResSize := VCLStream.Position; // Allocate memory to hold the string. if ResSize > 0 then begin Medium.hGlobal := GlobalAlloc(GHND or GMEM_SHARE, ResSize + SizeOf(Cardinal)); Data := GlobalLock(Medium.hGlobal); // Store the size of the data too, for easy retrival. Data^ := ResSize; Inc(Data); Move(ResPointer^, Data^, ResSize); GlobalUnlock(Medium.hGlobal); Medium.tymed := TYMED_HGLOBAL; Result := S_OK; end else Result := E_FAIL; end; finally // We can free the VCL stream here since it was either a pure memory stream or only a wrapper around // the OLEStream which exists independently. VCLStream.Free; end; end else // Ask application descendants to render self defined formats. Result := DoRenderOLEData(FormatEtcIn, Medium, ForClipboard); end; //---------------------------------------------------------------------------------------------------------------------- type // needed to handle OLE global memory objects TOLEMemoryStream = class(TCustomMemoryStream) public function Write(const Buffer; Count: Integer): Longint; override; end; //---------------------------------------------------------------------------------------------------------------------- function TOLEMemoryStream.Write(const Buffer; Count: Integer): Integer; begin //raise EStreamError.CreateRes(PResStringRec(@SCantWriteResourceStreamError)); raise EStreamError.Create(SCantWriteResourceStreamError); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.ProcessOLEData(Source: TBaseVirtualTree; DataObject: IDataObject; TargetNode: PVirtualNode; Mode: TVTNodeAttachMode; Optimized: Boolean): Boolean; // Recreates the (sub) tree structure serialized into memory and provided by DataObject. The new nodes are attached to // the passed node or FRoot if TargetNode is nil according to Mode. Optimized can be set to True if the entire operation // happens within the same process (i.e. sender and receiver of the OLE operation are located in the same process). // Optimize = True makes only sense if the operation to carry out is a move hence it is also the indication of the // operation to be done here. Source is the source of the OLE data and only of use (and usually assigned) when // an OLE operation takes place in the same application. // Returns True on success, i.e. the CF_VIRTUALTREE format is supported by the data object and the structure could be // recreated, otherwise False. var Medium: TStgMedium; Stream: TStream; Data: Pointer; Node: PVirtualNode; Nodes: TNodeArray; I: Integer; Res: HRESULT; ChangeReason: TChangeReason; begin Nodes := nil; // Check the data format available by the data object. with StandardOLEFormat do begin // Read best format. cfFormat := CF_VIRTUALTREE; end; Result := DataObject.QueryGetData(StandardOLEFormat) = S_OK; if Result and not (toReadOnly in FOptions.FMiscOptions) then begin BeginUpdate; Result := False; try if TargetNode = nil then TargetNode := FRoot; if TargetNode = FRoot then begin case Mode of amInsertBefore: Mode := amAddChildFirst; amInsertAfter: Mode := amAddChildLast; end; end; // Optimized means source is known and in the same process so we can access its pointers, which avoids duplicating // the data while doing a serialization. Can only be used with cut'n paste and drag'n drop with move effect. if Optimized then begin if tsOLEDragging in Source.FStates then Nodes := Source.FDragSelection else Nodes := Source.GetSortedCutCopySet(True); if Mode in [amInsertBefore,amAddChildLast] then begin for I := 0 to High(Nodes) do if not HasAsParent(TargetNode, Nodes[I]) then Source.MoveTo(Nodes[I], TargetNode, Mode, False); end else begin for I := High(Nodes) downto 0 do if not HasAsParent(TargetNode, Nodes[I]) then Source.MoveTo(Nodes[I], TargetNode, Mode, False); end; Result := True; end else begin if Source = Self then ChangeReason := crNodeCopied else ChangeReason := crNodeAdded; Res := DataObject.GetData(StandardOLEFormat, Medium); if Res = S_OK then begin case Medium.tymed of TYMED_ISTREAM, // IStream interface TYMED_HGLOBAL: // global memory block begin Stream := nil; if Medium.tymed = TYMED_ISTREAM then Stream := TOLEStream.Create(IUnknown(Medium.Pstm) as IStream) else begin Data := GlobalLock(Medium.hGlobal); if Assigned(Data) then begin // Get the total size of data to retrieve. I := PCardinal(Data)^; Inc(PCardinal(Data)); Stream := TOLEMemoryStream.Create; TOLEMemoryStream(Stream).SetPointer(Data, I); end; end; if Assigned(Stream) then try while Stream.Position < Stream.Size do begin Node := MakeNewNode; InternalConnectNode(Node, TargetNode, Self, Mode); InternalAddFromStream(Stream, VTTreeStreamVersion, Node); // This seems a bit strange because of the callback for granting to add the node // which actually comes after the node has been added. The reason is that the node must // contain valid data otherwise I don't see how the application can make a funded decision. if not DoNodeCopying(Node, TargetNode) then DeleteNode(Node) else DoNodeCopied(Node); StructureChange(Node, ChangeReason); // In order to maintain the same node order when restoring nodes in the case of amInsertAfter // we have to move the reference node continously. Othwise we would end up with reversed node order. if Mode = amInsertAfter then TargetNode := Node; end; Result := True; finally Stream.Free; if Medium.tymed = TYMED_HGLOBAL then GlobalUnlock(Medium.hGlobal); end; end; end; ReleaseStgMedium(@Medium); end; end; finally EndUpdate; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.ContentToClipboard(Format: Word; Source: TVSTTextSourceType): HGLOBAL; // This method constructs a shareable memory object filled with string data in the required format. Supported are: // CF_TEXT - plain ANSI text (Unicode text is converted using the user's current locale) // CF_UNICODETEXT - plain Unicode text // CF_CSV - comma separated plain ANSI text // CF_VRTF + CF_RTFNOOBS - rich text (plain ANSI) // CF_HTML - HTML text encoded using UTF-8 // // Result is the handle to a globally allocated memory block which can directly be used for clipboard and drag'n drop // transfers. The caller is responsible for freeing the memory. If for some reason the content could not be rendered // the Result is 0. //--------------- local function -------------------------------------------- procedure MakeFragment(var HTML: string); // Helper routine to build a properly-formatted HTML fragment. const Version = 'Version:1.0'#13#10; StartHTML = 'StartHTML:'; EndHTML = 'EndHTML:'; StartFragment = 'StartFragment:'; EndFragment = 'EndFragment:'; DocType = ''; HTMLIntro = '' + ''; HTMLExtro = ''; NumberLengthAndCR = 10; // Let the compiler determine the description length. DescriptionLength = Length(Version) + Length(StartHTML) + Length(EndHTML) + Length(StartFragment) + Length(EndFragment) + 4 * NumberLengthAndCR; var Description: string; StartHTMLIndex, EndHTMLIndex, StartFragmentIndex, EndFragmentIndex: Integer; begin // The HTML clipboard format is defined by using byte positions in the entire block where HTML text and // fragments start and end. These positions are written in a description. Unfortunately the positions depend on the // length of the description but the description may change with varying positions. // To solve this dilemma the offsets are converted into fixed length strings which makes it possible to know // the description length in advance. StartHTMLIndex := DescriptionLength; // position 0 after the description StartFragmentIndex := StartHTMLIndex + Length(DocType) + Length(HTMLIntro); EndFragmentIndex := StartFragmentIndex + Length(HTML); EndHTMLIndex := EndFragmentIndex + Length(HTMLExtro); Description := Version + SysUtils.Format('%s%.8d', [StartHTML, StartHTMLIndex]) + #13#10 + SysUtils.Format('%s%.8d', [EndHTML, EndHTMLIndex]) + #13#10 + SysUtils.Format('%s%.8d', [StartFragment, StartFragmentIndex]) + #13#10 + SysUtils.Format('%s%.8d', [EndFragment, EndFragmentIndex]) + #13#10; HTML := Description + DocType + HTMLIntro + HTML + HTMLExtro; end; //--------------- end local function ---------------------------------------- var Data: Pointer; DataSize: Cardinal; S: string; WS: UnicodeString; P: Pointer; begin Result := 0; case Format of CF_TEXT: begin S := ContentToAnsi(Source, #9) + #0; Data := PChar(S); DataSize := Length(S); end; CF_UNICODETEXT: begin WS := ContentToUTF16(Source, #9) + #0; Data := PWideChar(WS); DataSize := 2 * Length(WS); end; else if Format = CF_CSV then S := ContentToAnsi(Source, ListSeparator) + #0 else if (Format = CF_VRTF) or (Format = CF_VRTFNOOBJS) then S := ContentToRTF(Source) + #0 else if Format = CF_HTML then begin S := ContentToHTML(Source); // Build a valid HTML clipboard fragment. MakeFragment(S); S := S + #0; end; Data := PChar(S); DataSize := Length(S); end; if DataSize > 0 then begin Result := GlobalAlloc(GHND or GMEM_SHARE, DataSize); P := GlobalLock(Result); Move(Data^, P^, DataSize); GlobalUnlock(Result); end; end; doublecmd-0.5.8/components/virtualtreeview/include/arch/0000755000175000017500000000000012257501472022501 5ustar alexxalexxdoublecmd-0.5.8/components/virtualtreeview/include/arch/x86_64/0000755000175000017500000000000012257501472023437 5ustar alexxalexxdoublecmd-0.5.8/components/virtualtreeview/include/arch/i386/0000755000175000017500000000000012257501472023172 5ustar alexxalexxdoublecmd-0.5.8/components/virtualtreeview/include/arch/pascal/0000755000175000017500000000000012257501472023744 5ustar alexxalexxdoublecmd-0.5.8/components/virtualtreeview/registervirtualtreeview.pas0000644000175000017500000000117212014201074025637 0ustar alexxalexxunit registervirtualtreeview; {$Mode ObjFpc} {$H+} interface uses Classes, SysUtils, LResources, LazarusPackageIntf, VirtualTrees, VTHeaderPopup; procedure Register; implementation procedure RegisterUnitVirtualTrees; begin RegisterComponents('Virtual Controls', [TVirtualDrawTree, TVirtualStringTree]); end; procedure RegisterUnitVTHeaderPopup; begin RegisterComponents('Virtual Controls', [TVTHeaderPopupMenu]); end; procedure Register; begin RegisterUnit('VirtualTrees', @RegisterUnitVirtualTrees); RegisterUnit('VTHeaderPopup', @RegisterUnitVTHeaderPopup); end; initialization {$i ideicons.lrs} end. doublecmd-0.5.8/components/virtualtreeview/virtualtreeview_package.pas0000644000175000017500000000073512014201074025551 0ustar alexxalexx{ This file was automatically created by Lazarus. Do not edit! This source is only used to compile and install the package. } unit virtualtreeview_package; interface uses VirtualTrees, VTHeaderPopup, registervirtualtreeview, VTGraphics, LazarusPackageIntf; implementation procedure Register; begin RegisterUnit('registervirtualtreeview', @registervirtualtreeview.Register); end; initialization RegisterPackage('virtualtreeview_package', @Register); end. doublecmd-0.5.8/components/virtualtreeview/virtualtreeview_package.lpk0000644000175000017500000000455512140233030025555 0ustar alexxalexx doublecmd-0.5.8/components/virtualtreeview/doublecmd.diff0000644000175000017500000003152212140233030022713 0ustar alexxalexxIndex: VTConfig.inc =================================================================== --- VTConfig.inc (revision 2731) +++ VTConfig.inc (working copy) @@ -22,7 +22,7 @@ //Lazarus port options -{$define EnableOLE} +{.$define EnableOLE} {.$define EnableNativeTVM} {.$define EnablePrint} {.$define EnableNCFunctions} @@ -42,7 +42,7 @@ //under linux the performance is poor with threading enabled {$ifdef Windows} - {$define EnableThreadSupport} + {.$define EnableThreadSupport} {$endif} {$ifdef CPU64} {$define PACKARRAYPASCAL} Index: VirtualTrees.pas =================================================================== --- VirtualTrees.pas (revision 2731) +++ VirtualTrees.pas (working copy) @@ -745,6 +745,7 @@ toAutoHideButtons, // Node buttons are hidden when there are child nodes, but all are invisible. toAutoDeleteMovedNodes, // Delete nodes which where moved in a drag operation (if not directed otherwise). toDisableAutoscrollOnFocus, // Disable scrolling a node or column into view if it gets focused. + toDisableAutoscrollHorizontal, // Only autoscroll on focus vertically never horizontally toAutoChangeScale, // Change default node height automatically if the system's font scale is set to big fonts. toAutoFreeOnCollapse, // Frees any child node after a node has been collapsed (HasChildren flag stays there). toDisableAutoscrollOnEdit, // Do not center a node horizontally when it is edited. @@ -2018,7 +2019,7 @@ var Allowed: Boolean) of object; TVTDragOverEvent = procedure(Sender: TBaseVirtualTree; Source: TObject; Shift: TShiftState; State: TDragState; const Pt: TPoint; Mode: TDropMode; var Effect: LongWord; var Accept: Boolean) of object; - TVTDragDropEvent = procedure(Sender: TBaseVirtualTree; Source: TObject; DataObject: IDataObject; + TVTDragDropEvent = procedure(Sender: TBaseVirtualTree; Source: TObject; {DataObject: IDataObject;} Formats: TFormatArray; Shift: TShiftState; const Pt: TPoint; var Effect: LongWord; Mode: TDropMode) of object; TVTRenderOLEDataEvent = procedure(Sender: TBaseVirtualTree; const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean; var Result: HRESULT) of object; @@ -2543,6 +2544,7 @@ procedure BeginOperation; function CalculateSelectionRect(X, Y: Integer): Boolean; virtual; function CanAutoScroll: Boolean; virtual; + function CanScroll(const ClientMousePos: TPoint): Boolean; virtual; function CanShowDragImage: Boolean; virtual; procedure Change(Node: PVirtualNode); virtual; procedure ChangeScale(M, D: Integer); override; @@ -3015,6 +3017,7 @@ function GetNextNoInit(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetNextSelected(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetNextSibling(Node: PVirtualNode): PVirtualNode; + function GetNextSiblingNoInit(Node: PVirtualNode): PVirtualNode; function GetNextVisible(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = True): PVirtualNode; function GetNextVisibleNoInit(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = True): PVirtualNode; function GetNextVisibleSibling(Node: PVirtualNode): PVirtualNode; @@ -3033,6 +3036,7 @@ function GetPreviousNoInit(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetPreviousSelected(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetPreviousSibling(Node: PVirtualNode): PVirtualNode; + function GetPreviousSiblingNoInit(Node: PVirtualNode): PVirtualNode; function GetPreviousVisible(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = True): PVirtualNode; function GetPreviousVisibleNoInit(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = True): PVirtualNode; function GetPreviousVisibleSibling(Node: PVirtualNode): PVirtualNode; @@ -13858,7 +13862,7 @@ FFocusedColumn := Value; if Assigned(FFocusedNode) and not (toDisableAutoscrollOnFocus in FOptions.FAutoOptions) then begin - if ScrollIntoView(FFocusedNode, toCenterScrollIntoView in FOptions.SelectionOptions, True) then + if ScrollIntoView(FFocusedNode, toCenterScrollIntoView in FOptions.SelectionOptions, not (toDisableAutoscrollHorizontal in FOptions.FAutoOptions)) then InvalidateNode(FFocusedNode); end; @@ -15036,7 +15040,8 @@ LeaveStates := [tsHint]; if [tsWheelPanning, tsWheelScrolling] * FStates = [] then begin - KillTimer(Handle, ScrollTimer); + if HandleAllocated then + KillTimer(Handle, ScrollTimer); LeaveStates := LeaveStates + [tsScrollPending, tsScrolling]; end; DoStateChange([], LeaveStates); @@ -15660,7 +15665,7 @@ if (Shift = [ssCtrlOS]) and not ActAsGrid then begin ScrollIntoView(Node, toCenterScrollIntoView in FOptions.SelectionOptions, - not (toDisableAutoscrollOnFocus in FOptions.FAutoOptions)); + not (toDisableAutoscrollHorizontal in FOptions.FAutoOptions)); if (CharCode = VK_HOME) and not UseRightToLeftAlignment then SetOffsetX(0) else @@ -17879,7 +17884,7 @@ if hoVisible in FHeader.FOptions then Dec(Y, FHeader.Height); - if (Y > 0) and (Y < Integer(FDefaultNodeHeight)) and (FOffsetY <> 0) then + if (Y < Integer(FDefaultNodeHeight)) and (FOffsetY <> 0) then Include(Result, sdUp); //todo: probably the code below is bug due to poor timeGetTime implementation @@ -18424,7 +18429,7 @@ begin if Assigned(FOnDragDrop) then - FOnDragDrop(Self, Source, DataObject, Formats, Shift, Pt, Effect, Mode); + FOnDragDrop(Self, Source, {DataObject, }Formats, Shift, Pt, Effect, Mode); end; //---------------------------------------------------------------------------------------------------------------------- @@ -18576,7 +18581,7 @@ InvalidateNode(FFocusedNode); if (FUpdateCount = 0) and not (toDisableAutoscrollOnFocus in FOptions.FAutoOptions) then ScrollIntoView(FFocusedNode, (toCenterScrollIntoView in FOptions.SelectionOptions) and - (MouseButtonDown * FStates = []), True); + (MouseButtonDown * FStates = []), not (toDisableAutoscrollHorizontal in FOptions.FAutoOptions)); end; // Reset range anchor if necessary. @@ -19392,7 +19397,7 @@ ClientP := ScreenToClient(P); Panning := [tsWheelPanning, tsWheelScrolling] * FStates <> []; - if IsMouseSelecting or InRect or Panning then + if IsMouseSelecting or InRect or Panning or CanScroll(ClientP) then begin DeltaX := 0; DeltaY := 0; @@ -21111,7 +21116,7 @@ if NewNode or NewColumn then begin ScrollIntoView(FFocusedNode, toCenterScrollIntoView in FOptions.SelectionOptions, - not (toDisableAutoscrollOnFocus in FOptions.FAutoOptions)); + not (toDisableAutoscrollHorizontal in FOptions.FAutoOptions)); DoFocusChange(FFocusedNode, FFocusedColumn); end; end; @@ -21809,7 +21814,7 @@ begin if Y < 0 then - Y := 0; + Exit(nil); AbsolutePos := Y; if Relative then @@ -24335,6 +24340,12 @@ DoCanEdit(Node, Column, Result); end; +function TBaseVirtualTree.CanScroll(const ClientMousePos: TPoint): Boolean; +// Determines whether auto scrolling can occur based on current mouse cursor position. +begin + Result := False; +end; + //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.Clear; @@ -26446,6 +26457,22 @@ //---------------------------------------------------------------------------------------------------------------------- +function TBaseVirtualTree.GetNextSiblingNoInit(Node: PVirtualNode): PVirtualNode; + +// Returns the next sibling of Node performing no initialization. + +begin + Result := Node; + if Assigned(Result) then + begin + Assert(Result <> FRoot, 'Node must not be the hidden root node.'); + + Result := Result.NextSibling; + end; +end; + +//---------------------------------------------------------------------------------------------------------------------- + function TBaseVirtualTree.GetNextVisible(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = True): PVirtualNode; // Returns next node in tree, with regard to Node, which is visible. @@ -27064,6 +27091,22 @@ //---------------------------------------------------------------------------------------------------------------------- +function TBaseVirtualTree.GetPreviousSiblingNoInit(Node: PVirtualNode): PVirtualNode; + +// Get next sibling of Node, performes no initialization. + +begin + Result := Node; + if Assigned(Result) then + begin + Assert(Result <> FRoot, 'Node must not be the hidden root node.'); + + Result := Result.PrevSibling; + end; +end; + +//---------------------------------------------------------------------------------------------------------------------- + function TBaseVirtualTree.GetPreviousVisible(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = True): PVirtualNode; // Returns the previous node in tree, with regard to Node, which is visible. @@ -29252,6 +29295,7 @@ HScrollBarVisible: Boolean; ScrolledVertically, ScrolledHorizontally: Boolean; + OffY, OffYM: Integer; begin //todo: minimize calls to ClientHeight and ClientWidth @@ -29296,7 +29340,14 @@ if Center then SetOffsetY(FOffsetY - R.Bottom + ClientHeight div 2) else - SetOffsetY(FOffsetY - R.Bottom + ClientHeight); + begin + // Leave additional space at the bottom to have scrollrect start with full row. + OffY := FOffsetY - R.Bottom + ClientHeight; + OffYM := OffY mod DefaultNodeHeight; + if OffYM <> 0 then + OffY := OffY - (DefaultNodeHeight + OffYM); + SetOffsetY(OffY); + end; // When scrolling up and the horizontal scroll appears because of the operation // then we have to move up the node the horizontal scrollbar's height too // in order to avoid that the scroll bar hides the node which we wanted to have in view. @@ -29350,10 +29401,13 @@ end else begin - if ColumnRight > ClientWidth then - NewOffset := FEffectiveOffsetX + (ColumnRight - ClientWidth) - else if ColumnLeft < Header.Columns.GetVisibleFixedWidth then - NewOffset := FEffectiveOffsetX - (Header.Columns.GetVisibleFixedWidth - ColumnLeft); + if FHeader.Columns.Count > 1 then + begin + if ColumnRight > ClientWidth then + NewOffset := FEffectiveOffsetX + (ColumnRight - ClientWidth) + else if ColumnLeft < Header.Columns.GetVisibleFixedWidth then + NewOffset := FEffectiveOffsetX - (Header.Columns.GetVisibleFixedWidth - ColumnLeft); + end; if NewOffset <> FEffectiveOffsetX then begin if UseRightToLeftAlignment then Index: units/carbon/fakemmsystem.pas =================================================================== --- units/carbon/fakemmsystem.pas (revision 2731) +++ units/carbon/fakemmsystem.pas (working copy) @@ -15,6 +15,9 @@ implementation +uses + LCLIntf; + function timeBeginPeriod(x1: DWord): DWord; begin @@ -26,12 +29,8 @@ end; function timeGetTime: DWORD; -var - ATime: TSystemTime; begin - //todo: properly implement - GetLocalTime(ATime); - Result := ATime.MilliSecond; + Result := GetTickCount; end; end. Index: units/qt/fakemmsystem.pas =================================================================== --- units/qt/fakemmsystem.pas (revision 2731) +++ units/qt/fakemmsystem.pas (working copy) @@ -15,6 +15,9 @@ implementation +uses + LCLIntf; + function timeBeginPeriod(x1: DWord): DWord; begin @@ -26,12 +29,8 @@ end; function timeGetTime: DWORD; -var - ATime: TSystemTime; begin - //todo: properly implement - GetLocalTime(ATime); - Result := ATime.MilliSecond; + Result := GetTickCount; end; end. Index: units/win32/virtualpanningwindow.pas =================================================================== --- units/win32/virtualpanningwindow.pas (revision 2731) +++ units/win32/virtualpanningwindow.pas (working copy) @@ -41,9 +41,10 @@ PanningObject:=TVirtualPanningWindow(GetWindowLongPtrW(Window,GWL_USERDATA)); if Assigned(PanningObject) then PanningObject.HandlePaintMessage; + Result := 0; end else - DefWindowProc(Window,Msg,WPara,LPara); + Result := DefWindowProc(Window,Msg,WPara,LPara); end; var @@ -87,8 +88,7 @@ with Position do FHandle := CreateWindowEx(WS_EX_TOOLWINDOW, PanningWindowClass.lpszClassName, nil, WS_POPUP, X - 16, Y - 16, 32, 32, OwnerHandle, 0, HInstance, nil); - //todo use SetWindowLongPtr later - SetWindowLong(FHandle,GWL_USERDATA,PtrInt(Self)); + SetWindowLongPtr(FHandle,GWL_USERDATA,LONG_PTR(Self)); FImage := TBitmap.Create; end; doublecmd-0.5.8/components/virtualtreeview/units/0000755000175000017500000000000012257501472021303 5ustar alexxalexxdoublecmd-0.5.8/components/virtualtreeview/units/gtk/0000755000175000017500000000000012257501472022070 5ustar alexxalexxdoublecmd-0.5.8/components/virtualtreeview/units/gtk/fakemmsystem.pas0000644000175000017500000000075212014201074025270 0ustar alexxalexxunit fakemmsystem; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Types; function timeBeginPeriod(x1: DWord): DWord; function timeEndPeriod(x1: DWord): DWord; function timeGetTime: DWORD; implementation function timeBeginPeriod(x1: DWord): DWord; begin end; function timeEndPeriod(x1: DWord): DWord; begin end; function timeGetTime: DWORD; var ATime: TSystemTime; begin //todo: properly implement GetLocalTime(ATime); Result := ATime.MilliSecond; end; end. doublecmd-0.5.8/components/virtualtreeview/units/gtk/virtualpanningwindow.pas0000644000175000017500000000201212014201074027043 0ustar alexxalexxunit virtualpanningwindow; {$mode objfpc}{$H+} interface uses LCLType, Graphics, Classes, SysUtils; type { TVirtualPanningWindow } TVirtualPanningWindow = class private FHandle: THandle; FOwnerHandle: THandle; FImage: TBitmap; procedure HandlePaintMessage; public procedure Start(OwnerHandle: THandle; const Position: TPoint); procedure Stop; procedure Show(ClipRegion: HRGN); property Image: TBitmap read FImage; property Handle: THandle read FHandle; end; implementation {$ifdef DEBUG_VTV} uses vtlogger; {$endif} { TVirtualPanningWindow } procedure TVirtualPanningWindow.HandlePaintMessage; begin end; procedure TVirtualPanningWindow.Start(OwnerHandle: THandle; const Position: TPoint); begin FImage := TBitmap.Create; end; procedure TVirtualPanningWindow.Stop; begin FImage.Free; FImage := nil; end; procedure TVirtualPanningWindow.Show(ClipRegion: HRGN); begin {$ifdef DEBUG_VTV}Logger.SendBitmap([lcPanning],'Panning Image',FImage);{$endif} end; end. doublecmd-0.5.8/components/virtualtreeview/units/gtk/fakeactivex.pas0000644000175000017500000000005412014201074025050 0ustar alexxalexxunit FakeActiveX; {$i ../dummyactivex.inc} doublecmd-0.5.8/components/virtualtreeview/units/gtk/virtualdragmanager.pas0000644000175000017500000017010612014201074026443 0ustar alexxalexxunit virtualdragmanager; {fake unit just to compile - not used under non windows} {$mode delphi} interface uses Classes, SysUtils, Types; const // Drag image helpers for Windows 2000 and up. IID_IDropTargetHelper: TGUID = (D1: $4657278B; D2: $411B; D3: $11D2; D4: ($83, $9A, $00, $C0, $4F, $D9, $18, $D0)); IID_IDragSourceHelper: TGUID = (D1: $DE5BF786; D2: $477A; D3: $11D2; D4: ($83, $9D, $00, $C0, $4F, $D9, $18, $D0)); IID_IDropTarget: TGUID = (D1: $00000122; D2: $0000; D3: $0000; D4: ($C0, $00, $00, $00, $00, $00, $00, $46)); CLSID_DragDropHelper: TGUID = (D1: $4657278A; D2: $411B; D3: $11D2; D4: ($83, $9A, $00, $C0, $4F, $D9, $18, $D0)); SID_IDropTargetHelper = '{4657278B-411B-11D2-839A-00C04FD918D0}'; SID_IDragSourceHelper = '{DE5BF786-477A-11D2-839D-00C04FD918D0}'; SID_IDropTarget = '{00000122-0000-0000-C000-000000000046}'; //Bridge to ActiveX constants TYMED_HGLOBAL = 1; TYMED_ISTREAM = 4; DVASPECT_CONTENT = 1; CLSCTX_INPROC_SERVER = $0010; DROPEFFECT_COPY = 1; DROPEFFECT_LINK = 4; DROPEFFECT_MOVE = 2; DROPEFFECT_NONE = 0; DROPEFFECT_SCROLL = dword($80000000); DATADIR_GET = 1; type //types from win unit Long = LongInt; WinBool= LongBool; Bool= WinBool; ULONG = cardinal; LONGLONG = int64; LPDWORD = ^DWORD; LPVOID = pointer; TCOLORREF = cardinal; TIID = TGUID; LARGE_INTEGER = record case byte of 0: (LowPart : DWORD; HighPart : LONG); 1: (QuadPart : LONGLONG); end; PLARGE_INTEGER = ^LARGE_INTEGER; _LARGE_INTEGER = LARGE_INTEGER; TLargeInteger = Int64; PLargeInteger = ^TLargeInteger; ULARGE_INTEGER = record case byte of 0: (LowPart : DWORD; HighPart : DWORD); 1: (QuadPart : LONGLONG); end; PULARGE_INTEGER = ^ULARGE_INTEGER; _ULARGE_INTEGER = ULARGE_INTEGER; HANDLE = System.THandle; HWND = HANDLE; //HRESULT = System.HResult; HBITMAP = HANDLE; HENHMETAFILE = HANDLE; //activex types IMoniker = Interface; WINOLEAPI = HResult; TLCID = DWORD; OleChar = WChar; LPOLESTR = ^OLECHAR; HMetaFilePict = Pointer; tagBIND_OPTS = Record cvStruct, // sizeof(BIND_OPTS) grfFlags, grfMode, dwTickCountDeadline : DWord; End; TBind_Opts = tagBIND_OPTS; TCLIPFORMAT = Word; tagDVTARGETDEVICE = Record tdSize : DWord; tdDriverNameOffset, tdDeviceNameOffset, tdPortNameOffset, tdExtDevmodeOffset : Word; Data : Record End; End; DVTARGETDEVICE = TagDVTARGETDEVICE; PDVTARGETDEVICE = ^tagDVTARGETDEVICE; tagFORMATETC = Record CfFormat : Word {TCLIPFORMAT}; Ptd : PDVTARGETDEVICE; dwAspect : DWORD; lindex : Long; tymed : DWORD; End; FORMATETC = TagFORMATETC; TFORMATETC = FORMATETC; LPFORMATETC = ^FORMATETC; PFormatEtc = LPFORMATETC; tagSTATDATA = Record // field used by: FORMATETC : Tformatetc; // EnumAdvise, EnumData (cache), EnumFormats advf : DWord; // EnumAdvise, EnumData (cache) padvSink : Pointer {IAdviseSink}; // EnumAdvise dwConnection: DWord; // EnumAdvise End; STATDATA = TagStatData; TagSTGMEDIUM = Record Tymed : DWord; Case Integer Of 0 : (HBITMAP : hBitmap; PUnkForRelease : Pointer {IUnknown}); 1 : (HMETAFILEPICT : hMetaFilePict ); 2 : (HENHMETAFILE : hEnhMetaFile ); 3 : (HGLOBAL : hGlobal ); 4 : (lpszFileName : LPOLESTR ); 5 : (pstm : Pointer{IStream} ); 6 : (pstg : Pointer{IStorage} ); End; USTGMEDIUM = TagSTGMEDIUM; STGMEDIUM = USTGMEDIUM; TStgMedium = TagSTGMEDIUM; PStgMedium = ^TStgMedium; LPSTGMEDIUM = ^STGMEDIUM; IEnumString = Interface (IUnknown) ['{00000101-0000-0000-C000-000000000046}'] Function Next(Celt:ULong;Out xcelt;Out Celtfetched:ULong):HResult; StdCall; // Function RemoteNext(Celt:ULong; Out celt;Out Celtfetched:ULong):HResult; StdCall; Function Skip (Celt:ULong):Hresult;StdCall; Function Reset:HResult;StdCall; Function Clone(Out penum:IEnumString):HResult;StdCall; End; IEnumMoniker = Interface (IUnknown) ['{00000102-0000-0000-C000-000000000046}'] Function Next(celt:ULong; out Elt;out celftfetched: ULong):HResult; StdCall; // Function RemoteNext(Celt:ULong; Out rgelt;out celtfetched :ULong):Hresult; StdCall; Function Skip(celt:Ulong):HResult; StdCall; Function Reset:HResult; StdCall; Function Close(out penum:IEnumMoniker):HResult;StdCall; End; IEnumSTATDATA = Interface (IUnknown) ['{00000105-0000-0000-C000-000000000046}'] Function Next(Celt:ULong;Out Rgelt:statdata;Out pceltFetched:ULong):HResult; StdCall; // Function RemoteNext(Celt:ULong;Out Rgelt:statdata;Out pceltFetched:ULong):HResult; StdCall; Function Skip(Celt:ULong):HResult;StdCall; Function Reset:HResult;StdCall; Function Clone(out penum:IEnumstatdata):HResult;StdCall; End; IEnumFORMATETC = Interface (IUnknown) ['{00000103-0000-0000-C000-000000000046}'] Function Next(Celt:ULong;Out Rgelt:FormatEtc;Out pceltFetched:ULong):HResult; StdCall; // Function RemoteNext(Celt:ULong;Out Rgelt:FormatEtc;Out pceltFetched:ULong):HResult; StdCall; Function Skip(Celt:ULong):HResult;StdCall; Function Reset:HResult;StdCall; Function Clone(out penum:IEnumFORMATETC):HResult;StdCall; End; IPersist = Interface (IUnknown) ['{0000010c-0000-0000-C000-000000000046}'] Function GetClassId(clsid:TClsId):HResult; StdCall; End; IPersistStream = Interface(IPersist) ['{00000109-0000-0000-C000-000000000046}'] Function IsDirty:HResult; StdCall; Function Load(Const stm: IStream):HResult; StdCall; Function Save(Const stm: IStream;fClearDirty:Bool):HResult;StdCall; Function GetSizeMax(Out cbSize:ULarge_Integer):HResult; StdCall; End; IRunningObjectTable = Interface (IUnknown) ['{00000010-0000-0000-C000-000000000046}'] Function Register (grfFlags :DWord;const unkobject:IUnknown;Const mkObjectName:IMoniker;Out dwregister:DWord):HResult;StdCall; Function Revoke (dwRegister:DWord):HResult; StdCall; Function IsRunning (Const mkObjectName: IMoniker):HResult;StdCall; Function GetObject (Const mkObjectName: IMoniker; Out punkObject:IUnknown):HResult; StdCall; Function NoteChangeTime(dwRegister :DWord;Const FileTime: TFileTime):HResult;StdCall; Function GetTimeOfLastChange(Const mkObjectName:IMoniker;Out filetime:TFileTime):HResult; StdCall; Function EnumRunning (Out enumMoniker: IEnumMoniker):HResult; StdCall; End; IBindCtx = Interface (IUnknown) ['{0000000e-0000-0000-C000-000000000046}'] Function RegisterObjectBound(Const punk:IUnknown):HResult; stdCall; Function RevokeObjectBound (Const Punk:IUnknown):HResult; stdCall; Function ReleaseBoundObjects :HResult; StdCall; Function SetBindOptions(Const bindOpts:TBind_Opts):HResult; stdCall; // Function RemoteSetBindOptions(Const bind_opts: TBind_Opts2):HResult;StdCall; Function GetBindOptions(var BindOpts:TBind_Opts):HResult; stdCall; // Function RemoteGetBindOptions(Var bind_opts: TBind_Opts2):HResult;StdCall; Function GetRunningObjectTable(Out rot : IRunningObjectTable):Hresult; StdCall; Function RegisterObjectParam(Const pszkey:LPOleStr;const punk:IUnknown):HResult; Function GetObjectParam(Const pszkey:LPOleStr; out punk: IUnknown):HResult; StdCall; Function EnumObjectParam (out enum:IEnumString):Hresult;StdCall; Function RevokeObjectParam(pszKey:LPOleStr):HResult;StdCall; End; PIMoniker = ^IMoniker; IMoniker = Interface (IPersistStream) ['{0000000f-0000-0000-C000-000000000046}'] Function BindToObject (const pbc:IBindCtx;const mktoleft:IMoniker; RiidResult:TIID;Out vresult):HResult;StdCall; // Function RemoteBindToObject (const pbc:IBindCtx;const mktoleft:IMoniker;RiidResult:TIID;Out vresult):HResult;StdCall; Function BindToStorage(Const Pbc:IBindCtx;Const mktoLeft:IMoniker; Riid:TIID;Out vobj):HResult; StdCall; // Function RemoteBindToStorage(Const Pbc:IBindCtx;Const mktoLeft:IMoniker; Riid:TIID;Out vobj):HResult; StdCall; Function Reduce (const pbc:IBindCtx; dwReduceHowFar:DWord; mktoLeft: PIMoniker; Out mkReduced:IMoniker):HResult; StdCall; Function ComposeWith(Const MkRight:IMoniker;fOnlyIfNotGeneric:BOOL; OUT mkComposite:IMoniker):HResult; StdCall; Function Enum(fForward:Bool;Out enumMoniker:IEnumMoniker):HResult;StdCall; Function IsEqual(Const mkOtherMoniker:IMoniker):HResult;StdCall; Function Hash (Out dwHash:Dword):HResult;StdCall; Function IsRunning(Const bc:IBindCtx;Const MkToLeft:IMoniker;Const mknewlyRunning:IMoniker):HResult;StdCall; Function GetTimeOfLastChange(Const bc:IBindCtx;Const mkToLeft:IMoniker; out ft : FileTime):HResult; StdCall; Function Inverse(out mk : IMoniker):HResult; StdCall; Function CommonPrefixWith (Const mkOther:IMoniker):HResult; StdCall; Function RelativePathTo(Const mkother:IMoniker; Out mkRelPath : IMoniker):HResult;StdCall; Function GetDisplayName(Const bc:IMoniker;const mktoleft:IMoniker;Out szDisplayName: pOleStr):HResult; StdCall; Function ParseDisplayName(Const bc:IBindCtx;Const mkToLeft:IMoniker;szDisplayName:POleStr;out cheaten:ULong;out mkOut:IMoniker):HResult; StdCall; Function IsSystemMonitor(Out dwMkSys:DWord):HResult;StdCall; End; IAdviseSink = Interface (IUnknown) ['{0000010f-0000-0000-C000-000000000046}'] {$ifdef midl500} ['{00000150-0000-0000-C000-000000000046}'] {$endif} Procedure OnDataChange (Const pformatetc : Formatetc;const pstgmed : STGMEDIUM); StdCall; Procedure OnViewChange (dwAspect : DWord; lindex : Long); StdCall; Procedure OnRename (Const pmk : IMoniker); StdCall; Procedure OnSave; StdCall; Procedure OnClose; StdCall; End; //Fake interfaces IDataObject = Interface (IUnknown) ['{0000010e-0000-0000-C000-000000000046}'] Function GetData(Const formatetcIn : FORMATETC;Out medium : STGMEDIUM):HRESULT; STDCALL; Function GetDataHere(CONST pformatetc : FormatETC; Out medium : STGMEDIUM):HRESULT; STDCALL; Function QueryGetData(const pformatetc : FORMATETC):HRESULT; STDCALL; Function GetCanonicalFormatTEtc(const pformatetcIn : FORMATETC;Out pformatetcOut : FORMATETC):HResult; STDCALl; Function SetData (Const pformatetc : FORMATETC;const medium:STGMEDIUM;FRelease : BOOL):HRESULT; StdCall; Function EnumFormatEtc(dwDirection : DWord; OUT enumformatetcpara : IENUMFORMATETC):HRESULT; StdCall; Function DAdvise(const formatetc : FORMATETC;advf :DWORD; CONST AdvSink : IAdviseSink;OUT dwConnection:DWORD):HRESULT;StdCall; Function DUnadvise(dwconnection :DWord) :HRESULT;StdCall; Function EnumDAvise(Out enumAdvise : IEnumStatData):HResult;StdCall; End; IDropTarget = interface(IUnknown) ['{00000122-0000-0000-C000-000000000046}'] function DragEnter(const dataObj: IDataObject; grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD): HResult;StdCall; function DragOver(grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD): HResult;StdCall; function DragLeave: HResult;StdCall; function Drop(const dataObj: IDataObject; grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD):HResult;StdCall; end; IDropSource = interface(IUnknown) ['{00000121-0000-0000-C000-000000000046}'] function QueryContinueDrag(fEscapePressed: BOOL; grfKeyState: LongWord):HResult;StdCall; function GiveFeedback(dwEffect: LongWord): HResult;StdCall; end; IDataAdviseHolder = Interface (IUnknown) ['{00000110-0000-0000-C000-000000000046}'] Function Advise (CONST pdataObject : IDataObject;CONST fetc:FORMATETC;advf : DWORD;Const pAdvise:IAdviseSink;Out DwConnection:DWord):HResult; StdCall; Function Unadvise (dwConnection:Dword):HResult; StdCall; Function EnumAdvise(out penumAdvise : IEnumStatData):HResult;StdCall; Function SendOnDataChange(const pDataObject :IDataObject;DwReserved,advf : DWord):HResult; StdCall; End; // OLE drag'n drop support TFormatEtcArray = array of TFormatEtc; TFormatArray = array of Word; // IDataObject.SetData support TInternalStgMedium = packed record Format: TClipFormat; Medium: TStgMedium; end; TInternalStgMediumArray = array of TInternalStgMedium; TEnumFormatEtc = class(TInterfacedObject, IEnumFormatEtc) private FTree: TObject; FFormatEtcArray: TFormatEtcArray; FCurrentIndex: Integer; public constructor Create(Tree: TObject; AFormatEtcArray: TFormatEtcArray); function Clone(out Enum: IEnumFormatEtc): HResult; stdcall; function Next(celt: LongWord; out elt: FormatEtc; out pceltFetched: LongWord): HResult; stdcall; function Reset: HResult; stdcall; function Skip(celt: LongWord): HResult; stdcall; end; IDropTargetHelper = interface(IUnknown) [SID_IDropTargetHelper] function DragEnter(hwndTarget: HWND; pDataObject: IDataObject; var ppt: TPoint; dwEffect: LongWord): HRESULT; stdcall; function DragLeave: HRESULT; stdcall; function DragOver(var ppt: TPoint; dwEffect: LongWord): HRESULT; stdcall; function Drop(pDataObject: IDataObject; var ppt: TPoint; dwEffect: LongWord): HRESULT; stdcall; function Show(fShow: Boolean): HRESULT; stdcall; end; PSHDragImage = ^TSHDragImage; TSHDragImage = packed record sizeDragImage: TSize; ptOffset: TPoint; hbmpDragImage: HBITMAP; ColorRef: TColorRef; end; IDragSourceHelper = interface(IUnknown) [SID_IDragSourceHelper] function InitializeFromBitmap(var SHDragImage: TSHDragImage; pDataObject: IDataObject): HRESULT; stdcall; function InitializeFromWindow(Window: HWND; var ppt: TPoint; pDataObject: IDataObject): HRESULT; stdcall; end; IVTDragManager = interface(IUnknown) ['{C4B25559-14DA-446B-8901-0C879000EB16}'] procedure ForceDragLeave; stdcall; function GetDataObject: IDataObject; stdcall; function GetDragSource: TObject; stdcall; function GetDropTargetHelperSupported: Boolean; stdcall; function GetIsDropTarget: Boolean; stdcall; property DataObject: IDataObject read GetDataObject; property DragSource: TObject read GetDragSource; property DropTargetHelperSupported: Boolean read GetDropTargetHelperSupported; property IsDropTarget: Boolean read GetIsDropTarget; end; // This data object is used in two different places. One is for clipboard operations and the other while dragging. TVTDataObject = class(TInterfacedObject, IDataObject) private //FOwner: TBaseVirtualTree; // The tree which provides clipboard or drag data. FOwner: TObject; // The tree which provides clipboard or drag data. FForClipboard: Boolean; // Determines which data to render with GetData. FFormatEtcArray: TFormatEtcArray; FInternalStgMediumArray: TInternalStgMediumArray; // The available formats in the DataObject FAdviseHolder: IDataAdviseHolder; // Reference to an OLE supplied implementation for advising. protected function CanonicalIUnknown(TestUnknown: IUnknown): IUnknown; function EqualFormatEtc(FormatEtc1, FormatEtc2: TFormatEtc): Boolean; function FindFormatEtc(TestFormatEtc: TFormatEtc; const FormatEtcArray: TFormatEtcArray): integer; function FindInternalStgMedium(Format: TClipFormat): PStgMedium; function HGlobalClone(HGlobal: THandle): THandle; function RenderInternalOLEData(const FormatEtcIn: TFormatEtc; var Medium: TStgMedium; var OLEResult: HResult): Boolean; function StgMediumIncRef(const InStgMedium: TStgMedium; var OutStgMedium: TStgMedium; CopyInMedium: Boolean; DataObject: IDataObject): HRESULT; property ForClipboard: Boolean read FForClipboard; property FormatEtcArray: TFormatEtcArray read FFormatEtcArray write FFormatEtcArray; property InternalStgMediumArray: TInternalStgMediumArray read FInternalStgMediumArray write FInternalStgMediumArray; property Owner: TObject read FOwner; public constructor Create(AOwner: TObject; ForClipboard: Boolean); virtual; destructor Destroy; override; function DAdvise(const FormatEtc: TFormatEtc; advf: DWord; const advSink: IAdviseSink; out dwConnection: DWord): HResult; virtual; stdcall; function DUnadvise(dwConnection: DWord): HResult; virtual; stdcall; Function EnumDAvise(Out enumAdvise : IEnumStatData):HResult;virtual;StdCall; function EnumFormatEtc(Direction: DWord; out EnumFormatEtc: IEnumFormatEtc): HResult; virtual; stdcall; Function GetCanonicalFormatTEtc(const pformatetcIn : FORMATETC;Out pformatetcOut : FORMATETC):HResult; virtual; STDCALl; function GetData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium): HResult; virtual; stdcall; function GetDataHere(const FormatEtc: TFormatEtc; out Medium: TStgMedium): HResult; virtual; stdcall; function QueryGetData(const FormatEtc: TFormatEtc): HResult; virtual; stdcall; function SetData(const FormatEtc: TFormatEtc;{$ifdef VER2_0}var{$else}const{$endif} Medium: TStgMedium; DoRelease: BOOL): HResult; virtual; stdcall; end; // TVTDragManager is a class to manage drag and drop in a Virtual Treeview. TVTDragManager = class(TInterfacedObject, IVTDragManager, IDropSource, IDropTarget) private FOwner, // The tree which is responsible for drag management. FDragSource: TObject; // Reference to the source tree if the source was a VT, might be different than // the owner tree. FIsDropTarget: Boolean; // True if the owner is currently the drop target. FDataObject: IDataObject; // A reference to the data object passed in by DragEnter (only used when the owner // tree is the current drop target). FDropTargetHelper: IDropTargetHelper; // Win2k > Drag image support FFullDragging: BOOL; // True, if full dragging is currently enabled in the system. function GetDataObject: IDataObject; stdcall; function GetDragSource: TObject; stdcall; function GetDropTargetHelperSupported: Boolean; stdcall; function GetIsDropTarget: Boolean; stdcall; public constructor Create(AOwner: TObject); virtual; destructor Destroy; override; function DragEnter(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; stdcall; function DragLeave: HResult; stdcall; function DragOver(KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; stdcall; function Drop(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; stdcall; procedure ForceDragLeave; stdcall; function GiveFeedback(Effect: LongWord): HResult; stdcall; function QueryContinueDrag(EscapePressed: BOOL; KeyState: LongWord): HResult; stdcall; end; //Ole helper functions function Succeeded(Status : HRESULT) : BOOLEAN; function Failed(Status : HRESULT) : BOOLEAN; //ActiveX functions that have wrong calling convention in fpc function RegisterDragDrop(hwnd:HWND; pDropTarget:IDropTarget):WINOLEAPI;stdcall; function RevokeDragDrop(hwnd:HWND):WINOLEAPI;stdcall; function DoDragDrop(pDataObj:IDataObject; pDropSource:IDropSource; dwOKEffects:DWORD; pdwEffect:LPDWORD):WINOLEAPI; function OleInitialize(pvReserved:LPVOID):WINOLEAPI;stdcall; procedure OleUninitialize;stdcall; procedure ReleaseStgMedium(_para1:LPSTGMEDIUM);stdcall; function OleSetClipboard(pDataObj:IDataObject):WINOLEAPI;stdcall; function OleGetClipboard(out ppDataObj:IDataObject):WINOLEAPI;stdcall; function OleFlushClipboard:WINOLEAPI;stdcall; function OleIsCurrentClipboard(pDataObj:IDataObject):WINOLEAPI;stdcall; function CreateStreamOnHGlobal(hGlobal:HGLOBAL; fDeleteOnRelease:BOOL;out stm:IStream):WINOLEAPI;stdcall; function CoCreateInstance(const _para1:TCLSID; _para2:IUnknown; _para3:DWORD;const _para4:TIID;out _para5):HRESULT;stdcall; //helper functions to isolate windows/OLE specific code function RenderOLEData(Tree: TObject; const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean): HResult; function GetStreamFromMedium(Medium:TStgMedium):TStream; procedure UnlockMediumData(Medium:TStgMedium); function GetTreeFromDataObject(const DataObject: IDataObject; var Format: TFormatEtc): TObject; function AllocateGlobal(Data: Pointer; DataSize:Cardinal): HGLOBAL; implementation uses VirtualTrees, Controls {$ifdef DEBUG_VTV}, vtlogger{$endif}; type TVirtualTreeAccess = class (TBaseVirtualTree) end; function Succeeded(Status : HRESULT) : BOOLEAN; begin Succeeded:=Status and HRESULT($80000000)=0; end; function Failed(Status : HRESULT) : BOOLEAN; begin Failed:=Status and HRESULT($80000000)<>0; end; function RegisterDragDrop(hwnd: HWND; pDropTarget: IDropTarget): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function RevokeDragDrop(hwnd: HWND): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function DoDragDrop(pDataObj: IDataObject; pDropSource: IDropSource; dwOKEffects: DWORD; pdwEffect: LPDWORD): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleInitialize(pvReserved: LPVOID): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; procedure OleUninitialize; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; procedure ReleaseStgMedium(_para1: LPSTGMEDIUM); begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleSetClipboard(pDataObj: IDataObject): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleGetClipboard(out ppDataObj: IDataObject): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleFlushClipboard: WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleIsCurrentClipboard(pDataObj: IDataObject): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function CreateStreamOnHGlobal(hGlobal: HGLOBAL; fDeleteOnRelease: BOOL; out stm: IStream): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function CoCreateInstance(const _para1: TCLSID; _para2: IUnknown; _para3: DWORD; const _para4: TIID; out _para5): HRESULT; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function RenderOLEData(Tree: TObject; const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean): HResult; { //--------------- local function -------------------------------------------- procedure WriteNodes(Stream: TStream); var Selection: TNodeArray; I: Integer; begin with TVirtualTreeAccess(Tree) do begin if ForClipboard then Selection := GetSortedCutCopySet(True) else Selection := GetSortedSelection(True); for I := 0 to High(Selection) do WriteNode(Stream, Selection[I]); end; end; //--------------- end local function ---------------------------------------- } var Data: PCardinal; ResPointer: Pointer; ResSize: Integer; OLEStream: IStream; VCLStream: TStream; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { VCLStream := nil; try Medium.PunkForRelease := nil; // Return data in one of the supported storage formats, prefer IStream. if FormatEtcIn.tymed and TYMED_ISTREAM <> 0 then begin // Create an IStream on a memory handle (here it is 0 which indicates to implicitely allocated a handle). // Do not use TStreamAdapter as it is not compatible with OLE (when flushing the clipboard OLE wants the HGlobal // back which is not supported by TStreamAdapater). CreateStreamOnHGlobal(0, True, OLEStream); VCLStream := TOLEStream.Create(OLEStream); WriteNodes(VCLStream); // Rewind stream. VCLStream.Position := 0; Medium.tymed := TYMED_ISTREAM; IUnknown(Medium.Pstm) := OLEStream; Result := S_OK; end else begin VCLStream := TMemoryStream.Create; WriteNodes(VCLStream); ResPointer := TMemoryStream(VCLStream).Memory; ResSize := VCLStream.Position; // Allocate memory to hold the string. if ResSize > 0 then begin Medium.hGlobal := GlobalAlloc(GHND or GMEM_SHARE, ResSize + SizeOf(Cardinal)); Data := GlobalLock(Medium.hGlobal); // Store the size of the data too, for easy retrival. Data^ := ResSize; Inc(Data); Move(ResPointer^, Data^, ResSize); GlobalUnlock(Medium.hGlobal); Medium.tymed := TYMED_HGLOBAL; Result := S_OK; end else Result := E_FAIL; end; finally // We can free the VCL stream here since it was either a pure memory stream or only a wrapper around // the OLEStream which exists independently. VCLStream.Free; end; } end; type // needed to handle OLE global memory objects TOLEMemoryStream = class(TCustomMemoryStream) public function Write(const Buffer; Count: Integer): Longint; override; end; //---------------------------------------------------------------------------------------------------------------------- function TOLEMemoryStream.Write(const Buffer; Count: Integer): Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} // raise EStreamError.CreateRes(PResStringRec(@SCantWriteResourceStreamError)); end; function GetStreamFromMedium(Medium: TStgMedium): TStream; var Data: Pointer; I: Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := nil; if Medium.tymed = TYMED_ISTREAM then Result := TOLEStream.Create(IUnknown(Medium.Pstm) as IStream) else begin Data := GlobalLock(Medium.hGlobal); if Assigned(Data) then begin // Get the total size of data to retrieve. I := PCardinal(Data)^; Inc(PCardinal(Data)); Result := TOLEMemoryStream.Create; TOLEMemoryStream(Result).SetPointer(Data, I); end; end; } end; procedure UnlockMediumData(Medium: TStgMedium); begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Medium.tymed = TYMED_HGLOBAL then GlobalUnlock(Medium.hGlobal); } end; function GetTreeFromDataObject(const DataObject: IDataObject; var Format: TFormatEtc): TObject; var Medium: TStgMedium; Data: PVTReference; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := nil; if Assigned(DataObject) then begin Format.cfFormat := CF_VTREFERENCE; if DataObject.GetData(Format, Medium) = S_OK then begin Data := GlobalLock(Medium.hGlobal); if Assigned(Data) then begin if Data.Process = GetCurrentProcessID then Result := Data.Tree; GlobalUnlock(Medium.hGlobal); end; ReleaseStgMedium(@Medium); end; end; } end; function AllocateGlobal(Data: Pointer; DataSize: Cardinal): HGLOBAL; var P:Pointer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := GlobalAlloc(GHND or GMEM_SHARE, DataSize); P := GlobalLock(Result); Move(Data^, P^, DataSize); GlobalUnlock(Result); } end; //---------------------------------------------------------------------------------------------------------------------- // OLE drag and drop support classes // This is quite heavy stuff (compared with the VCL implementation) but is much better suited to fit the needs // of DD'ing various kinds of virtual data and works also between applications. //----------------- TEnumFormatEtc ------------------------------------------------------------------------------------- constructor TEnumFormatEtc.Create(Tree: TObject; AFormatEtcArray: TFormatEtcArray); var I: Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { inherited Create; FTree := Tree; // Make a local copy of the format data. SetLength(FFormatEtcArray, Length(AFormatEtcArray)); for I := 0 to High(AFormatEtcArray) do FFormatEtcArray[I] := AFormatEtcArray[I]; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Clone(out Enum: IEnumFormatEtc): HResult; var AClone: TEnumFormatEtc; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := S_OK; try AClone := TEnumFormatEtc.Create(nil, FFormatEtcArray); AClone.FCurrentIndex := FCurrentIndex; Enum := AClone as IEnumFormatEtc; except Result := E_FAIL; end; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Next(celt: LongWord; out elt: FormatEtc; out pceltFetched: LongWord): HResult; var CopyCount: LongWord; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := S_FALSE; CopyCount := Length(FFormatEtcArray) - FCurrentIndex; if celt < CopyCount then CopyCount := celt; if CopyCount > 0 then begin Move(FFormatEtcArray[FCurrentIndex], elt, CopyCount * SizeOf(TFormatEtc)); Inc(FCurrentIndex, CopyCount); Result := S_OK; end; //todo_lcl_check Delphi treats pceltFetched an PInteger. Implemented like in fpc.activex. What heappens with // a C Program call with a NULL in pCeltFetcjed?? //Answer: Yes. Is necessary a check here if @pceltFetched <> nil then pceltFetched := CopyCount; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Reset: HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { FCurrentIndex := 0; Result := S_OK; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Skip(celt: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if FCurrentIndex + celt < High(FFormatEtcArray) then begin Inc(FCurrentIndex, celt); Result := S_Ok; end else Result := S_FALSE; } end; //----------------- TVTDataObject -------------------------------------------------------------------------------------- constructor TVTDataObject.Create(AOwner: TObject; ForClipboard: Boolean); begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { inherited Create; FOwner := AOwner; FForClipboard := ForClipboard; TVirtualTreeAccess(FOwner).GetNativeClipboardFormats(FFormatEtcArray); } end; //---------------------------------------------------------------------------------------------------------------------- destructor TVTDataObject.Destroy; var I: Integer; StgMedium: PStgMedium; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { // Cancel a pending clipboard operation if this data object was created for the clipboard and // is freed because something else is placed there. if FForClipboard and not (tsClipboardFlushing in TVirtualTreeAccess(FOwner).TreeStates) then TVirtualTreeAccess(FOwner).CancelCutOrCopy; // Release any internal clipboard formats for I := 0 to High(FormatEtcArray) do begin StgMedium := FindInternalStgMedium(FormatEtcArray[I].cfFormat); if Assigned(StgMedium) then ReleaseStgMedium(StgMedium); end; FormatEtcArray := nil; inherited; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.CanonicalIUnknown(TestUnknown: IUnknown): IUnknown; // Uses COM object identity: An explicit call to the IUnknown::QueryInterface method, requesting the IUnknown // interface, will always return the same pointer. begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(TestUnknown) then begin if TestUnknown.QueryInterface(IUnknown, Result) = 0 then Result._Release // Don't actually need it just need the pointer value else Result := TestUnknown end else Result := TestUnknown } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EqualFormatEtc(FormatEtc1, FormatEtc2: TFormatEtc): Boolean; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := (FormatEtc1.cfFormat = FormatEtc2.cfFormat) and (FormatEtc1.ptd = FormatEtc2.ptd) and (FormatEtc1.dwAspect = FormatEtc2.dwAspect) and (FormatEtc1.lindex = FormatEtc2.lindex) and (FormatEtc1.tymed and FormatEtc2.tymed <> 0); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.FindFormatEtc(TestFormatEtc: TFormatEtc; const FormatEtcArray: TFormatEtcArray): integer; var I: integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := -1; for I := 0 to High(FormatEtcArray) do begin if EqualFormatEtc(TestFormatEtc, FormatEtcArray[I]) then begin Result := I; Break; end end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.FindInternalStgMedium(Format: TClipFormat): PStgMedium; var I: integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := nil; for I := 0 to High(InternalStgMediumArray) do begin if Format = InternalStgMediumArray[I].Format then begin Result := @InternalStgMediumArray[I].Medium; Break; end end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.HGlobalClone(HGlobal: THandle): THandle; // Returns a global memory block that is a copy of the passed memory block. var Size: Cardinal; Data, NewData: PChar; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Size := GlobalSize(HGlobal); Result := GlobalAlloc(GPTR, Size); Data := GlobalLock(hGlobal); try NewData := GlobalLock(Result); try Move(Data^, NewData^, Size); finally GlobalUnLock(Result); end finally GlobalUnLock(hGlobal); end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.RenderInternalOLEData(const FormatEtcIn: TFormatEtc; var Medium: TStgMedium; var OLEResult: HResult): Boolean; // Tries to render one of the formats which have been stored via the SetData method. // Since this data is already there it is just copied or its reference count is increased (depending on storage medium). var InternalMedium: PStgMedium; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := True; InternalMedium := FindInternalStgMedium(FormatEtcIn.cfFormat); if Assigned(InternalMedium) then OLEResult := StgMediumIncRef(InternalMedium^, Medium, False, Self as IDataObject) else Result := False; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.StgMediumIncRef(const InStgMedium: TStgMedium; var OutStgMedium: TStgMedium; CopyInMedium: Boolean; DataObject: IDataObject): HRESULT; // InStgMedium is the data that is requested, OutStgMedium is the data that we are to return either a copy of or // increase the IDataObject's reference and send ourselves back as the data (unkForRelease). The InStgMedium is usually // the result of a call to find a particular FormatEtc that has been stored locally through a call to SetData. // If CopyInMedium is not true we already have a local copy of the data when the SetData function was called (during // that call the CopyInMedium must be true). Then as the caller asks for the data through GetData we do not have to make // copy of the data for the caller only to have them destroy it then need us to copy it again if necessary. // This way we increase the reference count to ourselves and pass the STGMEDIUM structure initially stored in SetData. // This way when the caller frees the structure it sees the unkForRelease is not nil and calls Release on the object // instead of destroying the actual data. var Len: Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := S_OK; // Simply copy all fields to start with. OutStgMedium := InStgMedium; // The data handled here always results from a call of SetData we got. This ensures only one storage format // is indicated and hence the case statement below is safe (IDataObject.GetData can optionally use several // storage formats). case InStgMedium.tymed of TYMED_HGLOBAL: begin if CopyInMedium then begin // Generate a unique copy of the data passed OutStgMedium.hGlobal := HGlobalClone(InStgMedium.hGlobal); if OutStgMedium.hGlobal = 0 then Result := E_OUTOFMEMORY end else // Don't generate a copy just use ourselves and the copy previously saved. OutStgMedium.PunkForRelease := Pointer(DataObject); // Does not increase RefCount. end; TYMED_FILE: begin //todo_lcl_check Len := Length(WideString(InStgMedium.lpszFileName)) + 1; // Don't forget the terminating null character. OutStgMedium.lpszFileName := CoTaskMemAlloc(2 * Len); Move(InStgMedium.lpszFileName^, OutStgMedium.lpszFileName^, 2 * Len); end; TYMED_ISTREAM: IUnknown(OutStgMedium.Pstm)._AddRef; TYMED_ISTORAGE: IUnknown(OutStgMedium.Pstg)._AddRef; TYMED_GDI: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy GDI objects right now. TYMED_MFPICT: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy MetaFile objects right now. TYMED_ENHMF: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy enhanced metafiles objects right now. else Result := DV_E_TYMED; end; if (Result = S_OK) and Assigned(OutStgMedium.PunkForRelease) then IUnknown(OutStgMedium.PunkForRelease)._AddRef; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.DAdvise(const FormatEtc: TFormatEtc; advf: DWord; const advSink: IAdviseSink; out dwConnection: DWord): HResult; // Advise sink management is greatly simplified by the IDataAdviseHolder interface. // We use this interface and forward all concerning calls to it. begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := S_OK; if FAdviseHolder = nil then Result := CreateDataAdviseHolder(FAdviseHolder); if Result = S_OK then Result := FAdviseHolder.Advise(Self as IDataObject, FormatEtc, advf, advSink, dwConnection); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.DUnadvise(dwConnection: DWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if FAdviseHolder = nil then Result := E_NOTIMPL else Result := FAdviseHolder.Unadvise(dwConnection); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EnumDAvise(Out enumAdvise : IEnumStatData):HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if FAdviseHolder = nil then Result := OLE_E_ADVISENOTSUPPORTED else Result := FAdviseHolder.EnumAdvise(enumAdvise); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EnumFormatEtc(Direction: DWord; out EnumFormatEtc: IEnumFormatEtc): HResult; var NewList: TEnumFormatEtc; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := E_FAIL; if Direction = DATADIR_GET then begin NewList := TEnumFormatEtc.Create(TVirtualTreeAccess(FOwner), FormatEtcArray); EnumFormatEtc := NewList as IEnumFormatEtc; Result := S_OK; end else EnumFormatEtc := nil; if EnumFormatEtc = nil then Result := OLE_S_USEREG; } end; //---------------------------------------------------------------------------------------------------------------------- Function TVTDataObject.GetCanonicalFormatTEtc(const pformatetcIn : FORMATETC;Out pformatetcOut : FORMATETC):HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := DATA_S_SAMEFORMATETC; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.GetData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium): HResult; // Data is requested by clipboard or drop target. This method dispatchs the call // depending on the data being requested. var I: Integer; Data: PVTReference; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} // The tree reference format is always supported and returned from here. { if FormatEtcIn.cfFormat = CF_VTREFERENCE then begin // Note: this format is not used while flushing the clipboard to avoid a dangling reference // when the owner tree is destroyed before the clipboard data is replaced with something else. if tsClipboardFlushing in TVirtualTreeAccess(FOwner).TreeStates then Result := E_FAIL else begin Medium.hGlobal := GlobalAlloc(GHND or GMEM_SHARE, SizeOf(TVTReference)); Data := GlobalLock(Medium.hGlobal); Data.Process := GetCurrentProcessID; Data.Tree := TBaseVirtualTree(FOwner); GlobalUnlock(Medium.hGlobal); Medium.tymed := TYMED_HGLOBAL; Medium.PunkForRelease := nil; Result := S_OK; end; end else begin try // See if we accept this type and if not get the correct return value. Result := QueryGetData(FormatEtcIn); if Result = S_OK then begin for I := 0 to High(FormatEtcArray) do begin if EqualFormatEtc(FormatEtcIn, FormatEtcArray[I]) then begin if not RenderInternalOLEData(FormatEtcIn, Medium, Result) then Result := TVirtualTreeAccess(FOwner).RenderOLEData(FormatEtcIn, Medium, FForClipboard); Break; end; end end except FillChar(Medium, SizeOf(Medium), #0); Result := E_FAIL; end; end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.GetDataHere(const FormatEtc: TFormatEtc; out Medium: TStgMedium): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := E_NOTIMPL; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.QueryGetData(const FormatEtc: TFormatEtc): HResult; var I: Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := DV_E_CLIPFORMAT; for I := 0 to High(FFormatEtcArray) do begin if FormatEtc.cfFormat = FFormatEtcArray[I].cfFormat then begin if (FormatEtc.tymed and FFormatEtcArray[I].tymed) <> 0 then begin if FormatEtc.dwAspect = FFormatEtcArray[I].dwAspect then begin if FormatEtc.lindex = FFormatEtcArray[I].lindex then begin Result := S_OK; Break; end else Result := DV_E_LINDEX; end else Result := DV_E_DVASPECT; end else Result := DV_E_TYMED; end; end } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.SetData(const FormatEtc: TFormatEtc;{$ifdef VER2_0}var{$else}const{$endif} Medium: TStgMedium; DoRelease: BOOL): HResult; // Allows dynamic adding to the IDataObject during its existance. Most noteably it is used to implement // IDropSourceHelper and allows to set a special format for optimized moves during a shell transfer. var Index: Integer; LocalStgMedium: PStgMedium; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { // See if we already have a format of that type available. Index := FindFormatEtc(FormatEtc, FormatEtcArray); if Index > - 1 then begin // Just use the TFormatEct in the array after releasing the data. LocalStgMedium := FindInternalStgMedium(FormatEtcArray[Index].cfFormat); if Assigned(LocalStgMedium) then begin ReleaseStgMedium(LocalStgMedium); FillChar(LocalStgMedium^, SizeOf(LocalStgMedium^), #0); end; end else begin // It is a new format so create a new TFormatCollectionItem, copy the // FormatEtc parameter into the new object and and put it in the list. SetLength(FFormatEtcArray, Length(FormatEtcArray) + 1); FormatEtcArray[High(FormatEtcArray)] := FormatEtc; // Create a new InternalStgMedium and initialize it and associate it with the format. SetLength(FInternalStgMediumArray, Length(InternalStgMediumArray) + 1); InternalStgMediumArray[High(InternalStgMediumArray)].Format := FormatEtc.cfFormat; LocalStgMedium := @InternalStgMediumArray[High(InternalStgMediumArray)].Medium; FillChar(LocalStgMedium^, SizeOf(LocalStgMedium^), #0); end; if DoRelease then begin // We are simply being given the data and we take control of it. LocalStgMedium^ := Medium; Result := S_OK end else begin // We need to reference count or copy the data and keep our own references to it. Result := StgMediumIncRef(Medium, LocalStgMedium^, True, Self as IDataObject); // Can get a circular reference if the client calls GetData then calls SetData with the same StgMedium. // Because the unkForRelease for the IDataObject can be marshalled it is necessary to get pointers that // can be correctly compared. See the IDragSourceHelper article by Raymond Chen at MSDN. if Assigned(LocalStgMedium.PunkForRelease) then begin if CanonicalIUnknown(Self) = CanonicalIUnknown(IUnknown(LocalStgMedium.PunkForRelease)) then IUnknown(LocalStgMedium.PunkForRelease) := nil; // release the interface end; end; // Tell all registered advice sinks about the data change. if Assigned(FAdviseHolder) then FAdviseHolder.SendOnDataChange(Self as IDataObject, 0, 0); } end; //----------------- TVTDragManager ------------------------------------------------------------------------------------- constructor TVTDragManager.Create(AOwner: TObject); begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { inherited Create; FOwner := AOwner; // Create an instance of the drop target helper interface. This will fail but not harm on systems which do // not support this interface (everything below Windows 2000); CoCreateInstance(CLSID_DragDropHelper, nil, CLSCTX_INPROC_SERVER, IID_IDropTargetHelper, FDropTargetHelper); } end; //---------------------------------------------------------------------------------------------------------------------- destructor TVTDragManager.Destroy; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { // Set the owner's reference to us to nil otherwise it will access an invalid pointer // after our desctruction is complete. TVirtualTreeAccess(FOwner).FreeDragManager; inherited; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDataObject: IDataObject; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { // When the owner tree starts a drag operation then it gets a data object here to pass it to the OLE subsystem. // In this case there is no local reference to a data object and one is created (but not stored). // If there is a local reference then the owner tree is currently the drop target and the stored interface is // that of the drag initiator. if Assigned(FDataObject) then Result := FDataObject else begin Result := TVirtualTreeAccess(FOwner).DoCreateDataObject; if Result = nil then Result := TVTDataObject.Create(FOwner, False) as IDataObject; end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDragSource: TObject; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := FDragSource; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDropTargetHelperSupported: Boolean; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := Assigned(FDropTargetHelper); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetIsDropTarget: Boolean; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := FIsDropTarget; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragEnter(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { FDataObject := DataObject; FIsDropTarget := True; SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, @FFullDragging, 0); // If full dragging of window contents is disabled in the system then our tree windows will be locked // and cannot be updated during a drag operation. With the following call painting is again enabled. if not FFullDragging then LockWindowUpdate(0); if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragEnter(TBaseVirtualTree(FOwner).Handle, DataObject, Pt, Effect); FDragSource := TVirtualTreeAccess(FOwner).GetTreeFromDataObject(DataObject); Result := TVirtualTreeAccess(FOwner).DragEnter(KeyState, Pt, Effect); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragLeave: HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragLeave; TVirtualTreeAccess(FOwner).DragLeave; FIsDropTarget := False; FDragSource := nil; FDataObject := nil; Result := NOERROR; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragOver(KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragOver(Pt, Effect); Result := TVirtualTreeAccess(FOwner).DragOver(FDragSource, KeyState, dsDragMove, Pt, Effect); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.Drop(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.Drop(DataObject, Pt, Effect); Result := TVirtualTreeAccess(FOwner).DragDrop(DataObject, KeyState, Pt, Effect); FIsDropTarget := False; FDataObject := nil; } end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTDragManager.ForceDragLeave; // Some drop targets, e.g. Internet Explorer leave a drag image on screen instead removing it when they receive // a drop action. This method calls the drop target helper's DragLeave method to ensure it removes the drag image from // screen. Unfortunately, sometimes not even this does help (e.g. when dragging text from VT to a text field in IE). begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragLeave; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GiveFeedback(Effect: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := DRAGDROP_S_USEDEFAULTCURSORS; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.QueryContinueDrag(EscapePressed: BOOL; KeyState: LongWord): HResult; var RButton, LButton: Boolean; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { LButton := (KeyState and MK_LBUTTON) <> 0; RButton := (KeyState and MK_RBUTTON) <> 0; // Drag'n drop canceled by pressing both mouse buttons or Esc? if (LButton and RButton) or EscapePressed then Result := DRAGDROP_S_CANCEL else // Drag'n drop finished? if not (LButton or RButton) then Result := DRAGDROP_S_DROP else Result := S_OK; } end; end. doublecmd-0.5.8/components/virtualtreeview/units/qt/0000755000175000017500000000000012257501472021727 5ustar alexxalexxdoublecmd-0.5.8/components/virtualtreeview/units/qt/fakemmsystem.pas0000644000175000017500000000065012014201074025124 0ustar alexxalexxunit fakemmsystem; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Types; function timeBeginPeriod(x1: DWord): DWord; function timeEndPeriod(x1: DWord): DWord; function timeGetTime: DWORD; implementation uses LCLIntf; function timeBeginPeriod(x1: DWord): DWord; begin end; function timeEndPeriod(x1: DWord): DWord; begin end; function timeGetTime: DWORD; begin Result := GetTickCount; end; end. doublecmd-0.5.8/components/virtualtreeview/units/qt/virtualpanningwindow.pas0000644000175000017500000000201212014201074026702 0ustar alexxalexxunit virtualpanningwindow; {$mode objfpc}{$H+} interface uses LCLType, Graphics, Classes, SysUtils; type { TVirtualPanningWindow } TVirtualPanningWindow = class private FHandle: THandle; FOwnerHandle: THandle; FImage: TBitmap; procedure HandlePaintMessage; public procedure Start(OwnerHandle: THandle; const Position: TPoint); procedure Stop; procedure Show(ClipRegion: HRGN); property Image: TBitmap read FImage; property Handle: THandle read FHandle; end; implementation {$ifdef DEBUG_VTV} uses vtlogger; {$endif} { TVirtualPanningWindow } procedure TVirtualPanningWindow.HandlePaintMessage; begin end; procedure TVirtualPanningWindow.Start(OwnerHandle: THandle; const Position: TPoint); begin FImage := TBitmap.Create; end; procedure TVirtualPanningWindow.Stop; begin FImage.Free; FImage := nil; end; procedure TVirtualPanningWindow.Show(ClipRegion: HRGN); begin {$ifdef DEBUG_VTV}Logger.SendBitmap([lcPanning],'Panning Image',FImage);{$endif} end; end. doublecmd-0.5.8/components/virtualtreeview/units/qt/fakeactivex.pas0000644000175000017500000000005412014201074024707 0ustar alexxalexxunit FakeActiveX; {$i ../dummyactivex.inc} doublecmd-0.5.8/components/virtualtreeview/units/qt/virtualdragmanager.pas0000644000175000017500000017010712014201074026303 0ustar alexxalexxunit virtualdragmanager; {fake unit just to compile - not used under non windows} {$mode delphi} interface uses Classes, SysUtils, Types; const // Drag image helpers for Windows 2000 and up. IID_IDropTargetHelper: TGUID = (D1: $4657278B; D2: $411B; D3: $11D2; D4: ($83, $9A, $00, $C0, $4F, $D9, $18, $D0)); IID_IDragSourceHelper: TGUID = (D1: $DE5BF786; D2: $477A; D3: $11D2; D4: ($83, $9D, $00, $C0, $4F, $D9, $18, $D0)); IID_IDropTarget: TGUID = (D1: $00000122; D2: $0000; D3: $0000; D4: ($C0, $00, $00, $00, $00, $00, $00, $46)); CLSID_DragDropHelper: TGUID = (D1: $4657278A; D2: $411B; D3: $11D2; D4: ($83, $9A, $00, $C0, $4F, $D9, $18, $D0)); SID_IDropTargetHelper = '{4657278B-411B-11D2-839A-00C04FD918D0}'; SID_IDragSourceHelper = '{DE5BF786-477A-11D2-839D-00C04FD918D0}'; SID_IDropTarget = '{00000122-0000-0000-C000-000000000046}'; //Bridge to ActiveX constants TYMED_HGLOBAL = 1; TYMED_ISTREAM = 4; DVASPECT_CONTENT = 1; CLSCTX_INPROC_SERVER = $0010; DROPEFFECT_COPY = 1; DROPEFFECT_LINK = 4; DROPEFFECT_MOVE = 2; DROPEFFECT_NONE = 0; DROPEFFECT_SCROLL = dword($80000000); DATADIR_GET = 1; type //types from win unit Long = LongInt; WinBool= LongBool; Bool= WinBool; ULONG = cardinal; LONGLONG = int64; LPDWORD = ^DWORD; LPVOID = pointer; TCOLORREF = cardinal; TIID = TGUID; LARGE_INTEGER = record case byte of 0: (LowPart : DWORD; HighPart : LONG); 1: (QuadPart : LONGLONG); end; PLARGE_INTEGER = ^LARGE_INTEGER; _LARGE_INTEGER = LARGE_INTEGER; TLargeInteger = Int64; PLargeInteger = ^TLargeInteger; ULARGE_INTEGER = record case byte of 0: (LowPart : DWORD; HighPart : DWORD); 1: (QuadPart : LONGLONG); end; PULARGE_INTEGER = ^ULARGE_INTEGER; _ULARGE_INTEGER = ULARGE_INTEGER; HANDLE = System.THandle; HWND = HANDLE; //HRESULT = System.HResult; HBITMAP = HANDLE; HENHMETAFILE = HANDLE; //activex types IMoniker = Interface; WINOLEAPI = HResult; TLCID = DWORD; OleChar = WChar; LPOLESTR = ^OLECHAR; HMetaFilePict = Pointer; tagBIND_OPTS = Record cvStruct, // sizeof(BIND_OPTS) grfFlags, grfMode, dwTickCountDeadline : DWord; End; TBind_Opts = tagBIND_OPTS; TCLIPFORMAT = Word; tagDVTARGETDEVICE = Record tdSize : DWord; tdDriverNameOffset, tdDeviceNameOffset, tdPortNameOffset, tdExtDevmodeOffset : Word; Data : Record End; End; DVTARGETDEVICE = TagDVTARGETDEVICE; PDVTARGETDEVICE = ^tagDVTARGETDEVICE; tagFORMATETC = Record CfFormat : Word {TCLIPFORMAT}; Ptd : PDVTARGETDEVICE; dwAspect : DWORD; lindex : Long; tymed : DWORD; End; FORMATETC = TagFORMATETC; TFORMATETC = FORMATETC; LPFORMATETC = ^FORMATETC; PFormatEtc = LPFORMATETC; tagSTATDATA = Record // field used by: FORMATETC : Tformatetc; // EnumAdvise, EnumData (cache), EnumFormats advf : DWord; // EnumAdvise, EnumData (cache) padvSink : Pointer {IAdviseSink}; // EnumAdvise dwConnection: DWord; // EnumAdvise End; STATDATA = TagStatData; TagSTGMEDIUM = Record Tymed : DWord; Case Integer Of 0 : (HBITMAP : hBitmap; PUnkForRelease : Pointer {IUnknown}); 1 : (HMETAFILEPICT : hMetaFilePict ); 2 : (HENHMETAFILE : hEnhMetaFile ); 3 : (HGLOBAL : hGlobal ); 4 : (lpszFileName : LPOLESTR ); 5 : (pstm : Pointer{IStream} ); 6 : (pstg : Pointer{IStorage} ); End; USTGMEDIUM = TagSTGMEDIUM; STGMEDIUM = USTGMEDIUM; TStgMedium = TagSTGMEDIUM; PStgMedium = ^TStgMedium; LPSTGMEDIUM = ^STGMEDIUM; IEnumString = Interface (IUnknown) ['{00000101-0000-0000-C000-000000000046}'] Function Next(Celt:ULong;Out xcelt;Out Celtfetched:ULong):HResult; StdCall; // Function RemoteNext(Celt:ULong; Out celt;Out Celtfetched:ULong):HResult; StdCall; Function Skip (Celt:ULong):Hresult;StdCall; Function Reset:HResult;StdCall; Function Clone(Out penum:IEnumString):HResult;StdCall; End; IEnumMoniker = Interface (IUnknown) ['{00000102-0000-0000-C000-000000000046}'] Function Next(celt:ULong; out Elt;out celftfetched: ULong):HResult; StdCall; // Function RemoteNext(Celt:ULong; Out rgelt;out celtfetched :ULong):Hresult; StdCall; Function Skip(celt:Ulong):HResult; StdCall; Function Reset:HResult; StdCall; Function Close(out penum:IEnumMoniker):HResult;StdCall; End; IEnumSTATDATA = Interface (IUnknown) ['{00000105-0000-0000-C000-000000000046}'] Function Next(Celt:ULong;Out Rgelt:statdata;Out pceltFetched:ULong):HResult; StdCall; // Function RemoteNext(Celt:ULong;Out Rgelt:statdata;Out pceltFetched:ULong):HResult; StdCall; Function Skip(Celt:ULong):HResult;StdCall; Function Reset:HResult;StdCall; Function Clone(out penum:IEnumstatdata):HResult;StdCall; End; IEnumFORMATETC = Interface (IUnknown) ['{00000103-0000-0000-C000-000000000046}'] Function Next(Celt:ULong;Out Rgelt:FormatEtc;Out pceltFetched:ULong):HResult; StdCall; // Function RemoteNext(Celt:ULong;Out Rgelt:FormatEtc;Out pceltFetched:ULong):HResult; StdCall; Function Skip(Celt:ULong):HResult;StdCall; Function Reset:HResult;StdCall; Function Clone(out penum:IEnumFORMATETC):HResult;StdCall; End; IPersist = Interface (IUnknown) ['{0000010c-0000-0000-C000-000000000046}'] Function GetClassId(clsid:TClsId):HResult; StdCall; End; IPersistStream = Interface(IPersist) ['{00000109-0000-0000-C000-000000000046}'] Function IsDirty:HResult; StdCall; Function Load(Const stm: IStream):HResult; StdCall; Function Save(Const stm: IStream;fClearDirty:Bool):HResult;StdCall; Function GetSizeMax(Out cbSize:ULarge_Integer):HResult; StdCall; End; IRunningObjectTable = Interface (IUnknown) ['{00000010-0000-0000-C000-000000000046}'] Function Register (grfFlags :DWord;const unkobject:IUnknown;Const mkObjectName:IMoniker;Out dwregister:DWord):HResult;StdCall; Function Revoke (dwRegister:DWord):HResult; StdCall; Function IsRunning (Const mkObjectName: IMoniker):HResult;StdCall; Function GetObject (Const mkObjectName: IMoniker; Out punkObject:IUnknown):HResult; StdCall; Function NoteChangeTime(dwRegister :DWord;Const FileTime: TFileTime):HResult;StdCall; Function GetTimeOfLastChange(Const mkObjectName:IMoniker;Out filetime:TFileTime):HResult; StdCall; Function EnumRunning (Out enumMoniker: IEnumMoniker):HResult; StdCall; End; IBindCtx = Interface (IUnknown) ['{0000000e-0000-0000-C000-000000000046}'] Function RegisterObjectBound(Const punk:IUnknown):HResult; stdCall; Function RevokeObjectBound (Const Punk:IUnknown):HResult; stdCall; Function ReleaseBoundObjects :HResult; StdCall; Function SetBindOptions(Const bindOpts:TBind_Opts):HResult; stdCall; // Function RemoteSetBindOptions(Const bind_opts: TBind_Opts2):HResult;StdCall; Function GetBindOptions(var BindOpts:TBind_Opts):HResult; stdCall; // Function RemoteGetBindOptions(Var bind_opts: TBind_Opts2):HResult;StdCall; Function GetRunningObjectTable(Out rot : IRunningObjectTable):Hresult; StdCall; Function RegisterObjectParam(Const pszkey:LPOleStr;const punk:IUnknown):HResult; Function GetObjectParam(Const pszkey:LPOleStr; out punk: IUnknown):HResult; StdCall; Function EnumObjectParam (out enum:IEnumString):Hresult;StdCall; Function RevokeObjectParam(pszKey:LPOleStr):HResult;StdCall; End; PIMoniker = ^IMoniker; IMoniker = Interface (IPersistStream) ['{0000000f-0000-0000-C000-000000000046}'] Function BindToObject (const pbc:IBindCtx;const mktoleft:IMoniker; RiidResult:TIID;Out vresult):HResult;StdCall; // Function RemoteBindToObject (const pbc:IBindCtx;const mktoleft:IMoniker;RiidResult:TIID;Out vresult):HResult;StdCall; Function BindToStorage(Const Pbc:IBindCtx;Const mktoLeft:IMoniker; Riid:TIID;Out vobj):HResult; StdCall; // Function RemoteBindToStorage(Const Pbc:IBindCtx;Const mktoLeft:IMoniker; Riid:TIID;Out vobj):HResult; StdCall; Function Reduce (const pbc:IBindCtx; dwReduceHowFar:DWord; mktoLeft: PIMoniker; Out mkReduced:IMoniker):HResult; StdCall; Function ComposeWith(Const MkRight:IMoniker;fOnlyIfNotGeneric:BOOL; OUT mkComposite:IMoniker):HResult; StdCall; Function Enum(fForward:Bool;Out enumMoniker:IEnumMoniker):HResult;StdCall; Function IsEqual(Const mkOtherMoniker:IMoniker):HResult;StdCall; Function Hash (Out dwHash:Dword):HResult;StdCall; Function IsRunning(Const bc:IBindCtx;Const MkToLeft:IMoniker;Const mknewlyRunning:IMoniker):HResult;StdCall; Function GetTimeOfLastChange(Const bc:IBindCtx;Const mkToLeft:IMoniker; out ft : FileTime):HResult; StdCall; Function Inverse(out mk : IMoniker):HResult; StdCall; Function CommonPrefixWith (Const mkOther:IMoniker):HResult; StdCall; Function RelativePathTo(Const mkother:IMoniker; Out mkRelPath : IMoniker):HResult;StdCall; Function GetDisplayName(Const bc:IMoniker;const mktoleft:IMoniker;Out szDisplayName: pOleStr):HResult; StdCall; Function ParseDisplayName(Const bc:IBindCtx;Const mkToLeft:IMoniker;szDisplayName:POleStr;out cheaten:ULong;out mkOut:IMoniker):HResult; StdCall; Function IsSystemMonitor(Out dwMkSys:DWord):HResult;StdCall; End; IAdviseSink = Interface (IUnknown) ['{0000010f-0000-0000-C000-000000000046}'] {$ifdef midl500} ['{00000150-0000-0000-C000-000000000046}'] {$endif} Procedure OnDataChange (Const pformatetc : Formatetc;const pstgmed : STGMEDIUM); StdCall; Procedure OnViewChange (dwAspect : DWord; lindex : Long); StdCall; Procedure OnRename (Const pmk : IMoniker); StdCall; Procedure OnSave; StdCall; Procedure OnClose; StdCall; End; //Fake interfaces IDataObject = Interface (IUnknown) ['{0000010e-0000-0000-C000-000000000046}'] Function GetData(Const formatetcIn : FORMATETC;Out medium : STGMEDIUM):HRESULT; STDCALL; Function GetDataHere(CONST pformatetc : FormatETC; Out medium : STGMEDIUM):HRESULT; STDCALL; Function QueryGetData(const pformatetc : FORMATETC):HRESULT; STDCALL; Function GetCanonicalFormatTEtc(const pformatetcIn : FORMATETC;Out pformatetcOut : FORMATETC):HResult; STDCALl; Function SetData (Const pformatetc : FORMATETC;const medium:STGMEDIUM;FRelease : BOOL):HRESULT; StdCall; Function EnumFormatEtc(dwDirection : DWord; OUT enumformatetcpara : IENUMFORMATETC):HRESULT; StdCall; Function DAdvise(const formatetc : FORMATETC;advf :DWORD; CONST AdvSink : IAdviseSink;OUT dwConnection:DWORD):HRESULT;StdCall; Function DUnadvise(dwconnection :DWord) :HRESULT;StdCall; Function EnumDAvise(Out enumAdvise : IEnumStatData):HResult;StdCall; End; IDropTarget = interface(IUnknown) ['{00000122-0000-0000-C000-000000000046}'] function DragEnter(const dataObj: IDataObject; grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD): HResult;StdCall; function DragOver(grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD): HResult;StdCall; function DragLeave: HResult;StdCall; function Drop(const dataObj: IDataObject; grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD):HResult;StdCall; end; IDropSource = interface(IUnknown) ['{00000121-0000-0000-C000-000000000046}'] function QueryContinueDrag(fEscapePressed: BOOL; grfKeyState: LongWord):HResult;StdCall; function GiveFeedback(dwEffect: LongWord): HResult;StdCall; end; IDataAdviseHolder = Interface (IUnknown) ['{00000110-0000-0000-C000-000000000046}'] Function Advise (CONST pdataObject : IDataObject;CONST fetc:FORMATETC;advf : DWORD;Const pAdvise:IAdviseSink;Out DwConnection:DWord):HResult; StdCall; Function Unadvise (dwConnection:Dword):HResult; StdCall; Function EnumAdvise(out penumAdvise : IEnumStatData):HResult;StdCall; Function SendOnDataChange(const pDataObject :IDataObject;DwReserved,advf : DWord):HResult; StdCall; End; // OLE drag'n drop support TFormatEtcArray = array of TFormatEtc; TFormatArray = array of Word; // IDataObject.SetData support TInternalStgMedium = packed record Format: TClipFormat; Medium: TStgMedium; end; TInternalStgMediumArray = array of TInternalStgMedium; TEnumFormatEtc = class(TInterfacedObject, IEnumFormatEtc) private FTree: TObject; FFormatEtcArray: TFormatEtcArray; FCurrentIndex: Integer; public constructor Create(Tree: TObject; AFormatEtcArray: TFormatEtcArray); function Clone(out Enum: IEnumFormatEtc): HResult; stdcall; function Next(celt: LongWord; out elt: FormatEtc; out pceltFetched: LongWord): HResult; stdcall; function Reset: HResult; stdcall; function Skip(celt: LongWord): HResult; stdcall; end; IDropTargetHelper = interface(IUnknown) [SID_IDropTargetHelper] function DragEnter(hwndTarget: HWND; pDataObject: IDataObject; var ppt: TPoint; dwEffect: LongWord): HRESULT; stdcall; function DragLeave: HRESULT; stdcall; function DragOver(var ppt: TPoint; dwEffect: LongWord): HRESULT; stdcall; function Drop(pDataObject: IDataObject; var ppt: TPoint; dwEffect: LongWord): HRESULT; stdcall; function Show(fShow: Boolean): HRESULT; stdcall; end; PSHDragImage = ^TSHDragImage; TSHDragImage = packed record sizeDragImage: TSize; ptOffset: TPoint; hbmpDragImage: HBITMAP; ColorRef: TColorRef; end; IDragSourceHelper = interface(IUnknown) [SID_IDragSourceHelper] function InitializeFromBitmap(var SHDragImage: TSHDragImage; pDataObject: IDataObject): HRESULT; stdcall; function InitializeFromWindow(Window: HWND; var ppt: TPoint; pDataObject: IDataObject): HRESULT; stdcall; end; IVTDragManager = interface(IUnknown) ['{C4B25559-14DA-446B-8901-0C879000EB16}'] procedure ForceDragLeave; stdcall; function GetDataObject: IDataObject; stdcall; function GetDragSource: TObject; stdcall; function GetDropTargetHelperSupported: Boolean; stdcall; function GetIsDropTarget: Boolean; stdcall; property DataObject: IDataObject read GetDataObject; property DragSource: TObject read GetDragSource; property DropTargetHelperSupported: Boolean read GetDropTargetHelperSupported; property IsDropTarget: Boolean read GetIsDropTarget; end; // This data object is used in two different places. One is for clipboard operations and the other while dragging. TVTDataObject = class(TInterfacedObject, IDataObject) private //FOwner: TBaseVirtualTree; // The tree which provides clipboard or drag data. FOwner: TObject; // The tree which provides clipboard or drag data. FForClipboard: Boolean; // Determines which data to render with GetData. FFormatEtcArray: TFormatEtcArray; FInternalStgMediumArray: TInternalStgMediumArray; // The available formats in the DataObject FAdviseHolder: IDataAdviseHolder; // Reference to an OLE supplied implementation for advising. protected function CanonicalIUnknown(TestUnknown: IUnknown): IUnknown; function EqualFormatEtc(FormatEtc1, FormatEtc2: TFormatEtc): Boolean; function FindFormatEtc(TestFormatEtc: TFormatEtc; const FormatEtcArray: TFormatEtcArray): integer; function FindInternalStgMedium(Format: TClipFormat): PStgMedium; function HGlobalClone(HGlobal: THandle): THandle; function RenderInternalOLEData(const FormatEtcIn: TFormatEtc; var Medium: TStgMedium; var OLEResult: HResult): Boolean; function StgMediumIncRef(const InStgMedium: TStgMedium; var OutStgMedium: TStgMedium; CopyInMedium: Boolean; DataObject: IDataObject): HRESULT; property ForClipboard: Boolean read FForClipboard; property FormatEtcArray: TFormatEtcArray read FFormatEtcArray write FFormatEtcArray; property InternalStgMediumArray: TInternalStgMediumArray read FInternalStgMediumArray write FInternalStgMediumArray; property Owner: TObject read FOwner; public constructor Create(AOwner: TObject; ForClipboard: Boolean); virtual; destructor Destroy; override; function DAdvise(const FormatEtc: TFormatEtc; advf: DWord; const advSink: IAdviseSink; out dwConnection: DWord): HResult; virtual; stdcall; function DUnadvise(dwConnection: DWord): HResult; virtual; stdcall; Function EnumDAvise(Out enumAdvise : IEnumStatData):HResult;virtual;StdCall; function EnumFormatEtc(Direction: DWord; out EnumFormatEtc: IEnumFormatEtc): HResult; virtual; stdcall; Function GetCanonicalFormatTEtc(const pformatetcIn : FORMATETC;Out pformatetcOut : FORMATETC):HResult; virtual; STDCALl; function GetData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium): HResult; virtual; stdcall; function GetDataHere(const FormatEtc: TFormatEtc; out Medium: TStgMedium): HResult; virtual; stdcall; function QueryGetData(const FormatEtc: TFormatEtc): HResult; virtual; stdcall; function SetData(const FormatEtc: TFormatEtc;{$ifdef VER2_0}var{$else}const{$endif} Medium: TStgMedium; DoRelease: BOOL): HResult; virtual; stdcall; end; // TVTDragManager is a class to manage drag and drop in a Virtual Treeview. TVTDragManager = class(TInterfacedObject, IVTDragManager, IDropSource, IDropTarget) private FOwner, // The tree which is responsible for drag management. FDragSource: TObject; // Reference to the source tree if the source was a VT, might be different than // the owner tree. FIsDropTarget: Boolean; // True if the owner is currently the drop target. FDataObject: IDataObject; // A reference to the data object passed in by DragEnter (only used when the owner // tree is the current drop target). FDropTargetHelper: IDropTargetHelper; // Win2k > Drag image support FFullDragging: BOOL; // True, if full dragging is currently enabled in the system. function GetDataObject: IDataObject; stdcall; function GetDragSource: TObject; stdcall; function GetDropTargetHelperSupported: Boolean; stdcall; function GetIsDropTarget: Boolean; stdcall; public constructor Create(AOwner: TObject); virtual; destructor Destroy; override; function DragEnter(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; stdcall; function DragLeave: HResult; stdcall; function DragOver(KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; stdcall; function Drop(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; stdcall; procedure ForceDragLeave; stdcall; function GiveFeedback(Effect: LongWord): HResult; stdcall; function QueryContinueDrag(EscapePressed: BOOL; KeyState: LongWord): HResult; stdcall; end; //Ole helper functions function Succeeded(Status : HRESULT) : BOOLEAN; function Failed(Status : HRESULT) : BOOLEAN; //ActiveX functions that have wrong calling convention in fpc function RegisterDragDrop(hwnd:HWND; pDropTarget:IDropTarget):WINOLEAPI;stdcall; function RevokeDragDrop(hwnd:HWND):WINOLEAPI;stdcall; function DoDragDrop(pDataObj:IDataObject; pDropSource:IDropSource; dwOKEffects:DWORD; pdwEffect:LPDWORD):WINOLEAPI; function OleInitialize(pvReserved:LPVOID):WINOLEAPI;stdcall; procedure OleUninitialize;stdcall; procedure ReleaseStgMedium(_para1:LPSTGMEDIUM);stdcall; function OleSetClipboard(pDataObj:IDataObject):WINOLEAPI;stdcall; function OleGetClipboard(out ppDataObj:IDataObject):WINOLEAPI;stdcall; function OleFlushClipboard:WINOLEAPI;stdcall; function OleIsCurrentClipboard(pDataObj:IDataObject):WINOLEAPI;stdcall; function CreateStreamOnHGlobal(hGlobal:HGLOBAL; fDeleteOnRelease:BOOL;out stm:IStream):WINOLEAPI;stdcall; function CoCreateInstance(const _para1:TCLSID; _para2:IUnknown; _para3:DWORD;const _para4:TIID;out _para5):HRESULT;stdcall; //helper functions to isolate windows/OLE specific code function RenderOLEData(Tree: TObject; const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean): HResult; function GetStreamFromMedium(Medium:TStgMedium):TStream; procedure UnlockMediumData(Medium:TStgMedium); function GetTreeFromDataObject(const DataObject: IDataObject; var Format: TFormatEtc): TObject; function AllocateGlobal(Data: Pointer; DataSize:Cardinal): HGLOBAL; implementation uses VirtualTrees, Controls {$ifdef DEBUG_VTV}, vtlogger {$endif}; type TVirtualTreeAccess = class (TBaseVirtualTree) end; function Succeeded(Status : HRESULT) : BOOLEAN; begin Succeeded:=Status and HRESULT($80000000)=0; end; function Failed(Status : HRESULT) : BOOLEAN; begin Failed:=Status and HRESULT($80000000)<>0; end; function RegisterDragDrop(hwnd: HWND; pDropTarget: IDropTarget): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function RevokeDragDrop(hwnd: HWND): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function DoDragDrop(pDataObj: IDataObject; pDropSource: IDropSource; dwOKEffects: DWORD; pdwEffect: LPDWORD): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleInitialize(pvReserved: LPVOID): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; procedure OleUninitialize; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; procedure ReleaseStgMedium(_para1: LPSTGMEDIUM); begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleSetClipboard(pDataObj: IDataObject): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleGetClipboard(out ppDataObj: IDataObject): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleFlushClipboard: WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleIsCurrentClipboard(pDataObj: IDataObject): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function CreateStreamOnHGlobal(hGlobal: HGLOBAL; fDeleteOnRelease: BOOL; out stm: IStream): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function CoCreateInstance(const _para1: TCLSID; _para2: IUnknown; _para3: DWORD; const _para4: TIID; out _para5): HRESULT; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function RenderOLEData(Tree: TObject; const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean): HResult; { //--------------- local function -------------------------------------------- procedure WriteNodes(Stream: TStream); var Selection: TNodeArray; I: Integer; begin with TVirtualTreeAccess(Tree) do begin if ForClipboard then Selection := GetSortedCutCopySet(True) else Selection := GetSortedSelection(True); for I := 0 to High(Selection) do WriteNode(Stream, Selection[I]); end; end; //--------------- end local function ---------------------------------------- } var Data: PCardinal; ResPointer: Pointer; ResSize: Integer; OLEStream: IStream; VCLStream: TStream; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { VCLStream := nil; try Medium.PunkForRelease := nil; // Return data in one of the supported storage formats, prefer IStream. if FormatEtcIn.tymed and TYMED_ISTREAM <> 0 then begin // Create an IStream on a memory handle (here it is 0 which indicates to implicitely allocated a handle). // Do not use TStreamAdapter as it is not compatible with OLE (when flushing the clipboard OLE wants the HGlobal // back which is not supported by TStreamAdapater). CreateStreamOnHGlobal(0, True, OLEStream); VCLStream := TOLEStream.Create(OLEStream); WriteNodes(VCLStream); // Rewind stream. VCLStream.Position := 0; Medium.tymed := TYMED_ISTREAM; IUnknown(Medium.Pstm) := OLEStream; Result := S_OK; end else begin VCLStream := TMemoryStream.Create; WriteNodes(VCLStream); ResPointer := TMemoryStream(VCLStream).Memory; ResSize := VCLStream.Position; // Allocate memory to hold the string. if ResSize > 0 then begin Medium.hGlobal := GlobalAlloc(GHND or GMEM_SHARE, ResSize + SizeOf(Cardinal)); Data := GlobalLock(Medium.hGlobal); // Store the size of the data too, for easy retrival. Data^ := ResSize; Inc(Data); Move(ResPointer^, Data^, ResSize); GlobalUnlock(Medium.hGlobal); Medium.tymed := TYMED_HGLOBAL; Result := S_OK; end else Result := E_FAIL; end; finally // We can free the VCL stream here since it was either a pure memory stream or only a wrapper around // the OLEStream which exists independently. VCLStream.Free; end; } end; type // needed to handle OLE global memory objects TOLEMemoryStream = class(TCustomMemoryStream) public function Write(const Buffer; Count: Integer): Longint; override; end; //---------------------------------------------------------------------------------------------------------------------- function TOLEMemoryStream.Write(const Buffer; Count: Integer): Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} // raise EStreamError.CreateRes(PResStringRec(@SCantWriteResourceStreamError)); end; function GetStreamFromMedium(Medium: TStgMedium): TStream; var Data: Pointer; I: Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := nil; if Medium.tymed = TYMED_ISTREAM then Result := TOLEStream.Create(IUnknown(Medium.Pstm) as IStream) else begin Data := GlobalLock(Medium.hGlobal); if Assigned(Data) then begin // Get the total size of data to retrieve. I := PCardinal(Data)^; Inc(PCardinal(Data)); Result := TOLEMemoryStream.Create; TOLEMemoryStream(Result).SetPointer(Data, I); end; end; } end; procedure UnlockMediumData(Medium: TStgMedium); begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Medium.tymed = TYMED_HGLOBAL then GlobalUnlock(Medium.hGlobal); } end; function GetTreeFromDataObject(const DataObject: IDataObject; var Format: TFormatEtc): TObject; var Medium: TStgMedium; Data: PVTReference; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := nil; if Assigned(DataObject) then begin Format.cfFormat := CF_VTREFERENCE; if DataObject.GetData(Format, Medium) = S_OK then begin Data := GlobalLock(Medium.hGlobal); if Assigned(Data) then begin if Data.Process = GetCurrentProcessID then Result := Data.Tree; GlobalUnlock(Medium.hGlobal); end; ReleaseStgMedium(@Medium); end; end; } end; function AllocateGlobal(Data: Pointer; DataSize: Cardinal): HGLOBAL; var P:Pointer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := GlobalAlloc(GHND or GMEM_SHARE, DataSize); P := GlobalLock(Result); Move(Data^, P^, DataSize); GlobalUnlock(Result); } end; //---------------------------------------------------------------------------------------------------------------------- // OLE drag and drop support classes // This is quite heavy stuff (compared with the VCL implementation) but is much better suited to fit the needs // of DD'ing various kinds of virtual data and works also between applications. //----------------- TEnumFormatEtc ------------------------------------------------------------------------------------- constructor TEnumFormatEtc.Create(Tree: TObject; AFormatEtcArray: TFormatEtcArray); var I: Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { inherited Create; FTree := Tree; // Make a local copy of the format data. SetLength(FFormatEtcArray, Length(AFormatEtcArray)); for I := 0 to High(AFormatEtcArray) do FFormatEtcArray[I] := AFormatEtcArray[I]; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Clone(out Enum: IEnumFormatEtc): HResult; var AClone: TEnumFormatEtc; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := S_OK; try AClone := TEnumFormatEtc.Create(nil, FFormatEtcArray); AClone.FCurrentIndex := FCurrentIndex; Enum := AClone as IEnumFormatEtc; except Result := E_FAIL; end; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Next(celt: LongWord; out elt: FormatEtc; out pceltFetched: LongWord): HResult; var CopyCount: LongWord; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := S_FALSE; CopyCount := Length(FFormatEtcArray) - FCurrentIndex; if celt < CopyCount then CopyCount := celt; if CopyCount > 0 then begin Move(FFormatEtcArray[FCurrentIndex], elt, CopyCount * SizeOf(TFormatEtc)); Inc(FCurrentIndex, CopyCount); Result := S_OK; end; //todo_lcl_check Delphi treats pceltFetched an PInteger. Implemented like in fpc.activex. What heappens with // a C Program call with a NULL in pCeltFetcjed?? //Answer: Yes. Is necessary a check here if @pceltFetched <> nil then pceltFetched := CopyCount; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Reset: HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { FCurrentIndex := 0; Result := S_OK; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Skip(celt: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if FCurrentIndex + celt < High(FFormatEtcArray) then begin Inc(FCurrentIndex, celt); Result := S_Ok; end else Result := S_FALSE; } end; //----------------- TVTDataObject -------------------------------------------------------------------------------------- constructor TVTDataObject.Create(AOwner: TObject; ForClipboard: Boolean); begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { inherited Create; FOwner := AOwner; FForClipboard := ForClipboard; TVirtualTreeAccess(FOwner).GetNativeClipboardFormats(FFormatEtcArray); } end; //---------------------------------------------------------------------------------------------------------------------- destructor TVTDataObject.Destroy; var I: Integer; StgMedium: PStgMedium; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { // Cancel a pending clipboard operation if this data object was created for the clipboard and // is freed because something else is placed there. if FForClipboard and not (tsClipboardFlushing in TVirtualTreeAccess(FOwner).TreeStates) then TVirtualTreeAccess(FOwner).CancelCutOrCopy; // Release any internal clipboard formats for I := 0 to High(FormatEtcArray) do begin StgMedium := FindInternalStgMedium(FormatEtcArray[I].cfFormat); if Assigned(StgMedium) then ReleaseStgMedium(StgMedium); end; FormatEtcArray := nil; inherited; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.CanonicalIUnknown(TestUnknown: IUnknown): IUnknown; // Uses COM object identity: An explicit call to the IUnknown::QueryInterface method, requesting the IUnknown // interface, will always return the same pointer. begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(TestUnknown) then begin if TestUnknown.QueryInterface(IUnknown, Result) = 0 then Result._Release // Don't actually need it just need the pointer value else Result := TestUnknown end else Result := TestUnknown } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EqualFormatEtc(FormatEtc1, FormatEtc2: TFormatEtc): Boolean; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := (FormatEtc1.cfFormat = FormatEtc2.cfFormat) and (FormatEtc1.ptd = FormatEtc2.ptd) and (FormatEtc1.dwAspect = FormatEtc2.dwAspect) and (FormatEtc1.lindex = FormatEtc2.lindex) and (FormatEtc1.tymed and FormatEtc2.tymed <> 0); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.FindFormatEtc(TestFormatEtc: TFormatEtc; const FormatEtcArray: TFormatEtcArray): integer; var I: integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := -1; for I := 0 to High(FormatEtcArray) do begin if EqualFormatEtc(TestFormatEtc, FormatEtcArray[I]) then begin Result := I; Break; end end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.FindInternalStgMedium(Format: TClipFormat): PStgMedium; var I: integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := nil; for I := 0 to High(InternalStgMediumArray) do begin if Format = InternalStgMediumArray[I].Format then begin Result := @InternalStgMediumArray[I].Medium; Break; end end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.HGlobalClone(HGlobal: THandle): THandle; // Returns a global memory block that is a copy of the passed memory block. var Size: Cardinal; Data, NewData: PChar; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Size := GlobalSize(HGlobal); Result := GlobalAlloc(GPTR, Size); Data := GlobalLock(hGlobal); try NewData := GlobalLock(Result); try Move(Data^, NewData^, Size); finally GlobalUnLock(Result); end finally GlobalUnLock(hGlobal); end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.RenderInternalOLEData(const FormatEtcIn: TFormatEtc; var Medium: TStgMedium; var OLEResult: HResult): Boolean; // Tries to render one of the formats which have been stored via the SetData method. // Since this data is already there it is just copied or its reference count is increased (depending on storage medium). var InternalMedium: PStgMedium; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := True; InternalMedium := FindInternalStgMedium(FormatEtcIn.cfFormat); if Assigned(InternalMedium) then OLEResult := StgMediumIncRef(InternalMedium^, Medium, False, Self as IDataObject) else Result := False; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.StgMediumIncRef(const InStgMedium: TStgMedium; var OutStgMedium: TStgMedium; CopyInMedium: Boolean; DataObject: IDataObject): HRESULT; // InStgMedium is the data that is requested, OutStgMedium is the data that we are to return either a copy of or // increase the IDataObject's reference and send ourselves back as the data (unkForRelease). The InStgMedium is usually // the result of a call to find a particular FormatEtc that has been stored locally through a call to SetData. // If CopyInMedium is not true we already have a local copy of the data when the SetData function was called (during // that call the CopyInMedium must be true). Then as the caller asks for the data through GetData we do not have to make // copy of the data for the caller only to have them destroy it then need us to copy it again if necessary. // This way we increase the reference count to ourselves and pass the STGMEDIUM structure initially stored in SetData. // This way when the caller frees the structure it sees the unkForRelease is not nil and calls Release on the object // instead of destroying the actual data. var Len: Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := S_OK; // Simply copy all fields to start with. OutStgMedium := InStgMedium; // The data handled here always results from a call of SetData we got. This ensures only one storage format // is indicated and hence the case statement below is safe (IDataObject.GetData can optionally use several // storage formats). case InStgMedium.tymed of TYMED_HGLOBAL: begin if CopyInMedium then begin // Generate a unique copy of the data passed OutStgMedium.hGlobal := HGlobalClone(InStgMedium.hGlobal); if OutStgMedium.hGlobal = 0 then Result := E_OUTOFMEMORY end else // Don't generate a copy just use ourselves and the copy previously saved. OutStgMedium.PunkForRelease := Pointer(DataObject); // Does not increase RefCount. end; TYMED_FILE: begin //todo_lcl_check Len := Length(WideString(InStgMedium.lpszFileName)) + 1; // Don't forget the terminating null character. OutStgMedium.lpszFileName := CoTaskMemAlloc(2 * Len); Move(InStgMedium.lpszFileName^, OutStgMedium.lpszFileName^, 2 * Len); end; TYMED_ISTREAM: IUnknown(OutStgMedium.Pstm)._AddRef; TYMED_ISTORAGE: IUnknown(OutStgMedium.Pstg)._AddRef; TYMED_GDI: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy GDI objects right now. TYMED_MFPICT: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy MetaFile objects right now. TYMED_ENHMF: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy enhanced metafiles objects right now. else Result := DV_E_TYMED; end; if (Result = S_OK) and Assigned(OutStgMedium.PunkForRelease) then IUnknown(OutStgMedium.PunkForRelease)._AddRef; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.DAdvise(const FormatEtc: TFormatEtc; advf: DWord; const advSink: IAdviseSink; out dwConnection: DWord): HResult; // Advise sink management is greatly simplified by the IDataAdviseHolder interface. // We use this interface and forward all concerning calls to it. begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := S_OK; if FAdviseHolder = nil then Result := CreateDataAdviseHolder(FAdviseHolder); if Result = S_OK then Result := FAdviseHolder.Advise(Self as IDataObject, FormatEtc, advf, advSink, dwConnection); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.DUnadvise(dwConnection: DWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if FAdviseHolder = nil then Result := E_NOTIMPL else Result := FAdviseHolder.Unadvise(dwConnection); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EnumDAvise(Out enumAdvise : IEnumStatData):HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if FAdviseHolder = nil then Result := OLE_E_ADVISENOTSUPPORTED else Result := FAdviseHolder.EnumAdvise(enumAdvise); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EnumFormatEtc(Direction: DWord; out EnumFormatEtc: IEnumFormatEtc): HResult; var NewList: TEnumFormatEtc; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := E_FAIL; if Direction = DATADIR_GET then begin NewList := TEnumFormatEtc.Create(TVirtualTreeAccess(FOwner), FormatEtcArray); EnumFormatEtc := NewList as IEnumFormatEtc; Result := S_OK; end else EnumFormatEtc := nil; if EnumFormatEtc = nil then Result := OLE_S_USEREG; } end; //---------------------------------------------------------------------------------------------------------------------- Function TVTDataObject.GetCanonicalFormatTEtc(const pformatetcIn : FORMATETC;Out pformatetcOut : FORMATETC):HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := DATA_S_SAMEFORMATETC; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.GetData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium): HResult; // Data is requested by clipboard or drop target. This method dispatchs the call // depending on the data being requested. var I: Integer; Data: PVTReference; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} // The tree reference format is always supported and returned from here. { if FormatEtcIn.cfFormat = CF_VTREFERENCE then begin // Note: this format is not used while flushing the clipboard to avoid a dangling reference // when the owner tree is destroyed before the clipboard data is replaced with something else. if tsClipboardFlushing in TVirtualTreeAccess(FOwner).TreeStates then Result := E_FAIL else begin Medium.hGlobal := GlobalAlloc(GHND or GMEM_SHARE, SizeOf(TVTReference)); Data := GlobalLock(Medium.hGlobal); Data.Process := GetCurrentProcessID; Data.Tree := TBaseVirtualTree(FOwner); GlobalUnlock(Medium.hGlobal); Medium.tymed := TYMED_HGLOBAL; Medium.PunkForRelease := nil; Result := S_OK; end; end else begin try // See if we accept this type and if not get the correct return value. Result := QueryGetData(FormatEtcIn); if Result = S_OK then begin for I := 0 to High(FormatEtcArray) do begin if EqualFormatEtc(FormatEtcIn, FormatEtcArray[I]) then begin if not RenderInternalOLEData(FormatEtcIn, Medium, Result) then Result := TVirtualTreeAccess(FOwner).RenderOLEData(FormatEtcIn, Medium, FForClipboard); Break; end; end end except FillChar(Medium, SizeOf(Medium), #0); Result := E_FAIL; end; end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.GetDataHere(const FormatEtc: TFormatEtc; out Medium: TStgMedium): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := E_NOTIMPL; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.QueryGetData(const FormatEtc: TFormatEtc): HResult; var I: Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := DV_E_CLIPFORMAT; for I := 0 to High(FFormatEtcArray) do begin if FormatEtc.cfFormat = FFormatEtcArray[I].cfFormat then begin if (FormatEtc.tymed and FFormatEtcArray[I].tymed) <> 0 then begin if FormatEtc.dwAspect = FFormatEtcArray[I].dwAspect then begin if FormatEtc.lindex = FFormatEtcArray[I].lindex then begin Result := S_OK; Break; end else Result := DV_E_LINDEX; end else Result := DV_E_DVASPECT; end else Result := DV_E_TYMED; end; end } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.SetData(const FormatEtc: TFormatEtc;{$ifdef VER2_0}var{$else}const{$endif} Medium: TStgMedium; DoRelease: BOOL): HResult; // Allows dynamic adding to the IDataObject during its existance. Most noteably it is used to implement // IDropSourceHelper and allows to set a special format for optimized moves during a shell transfer. var Index: Integer; LocalStgMedium: PStgMedium; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { // See if we already have a format of that type available. Index := FindFormatEtc(FormatEtc, FormatEtcArray); if Index > - 1 then begin // Just use the TFormatEct in the array after releasing the data. LocalStgMedium := FindInternalStgMedium(FormatEtcArray[Index].cfFormat); if Assigned(LocalStgMedium) then begin ReleaseStgMedium(LocalStgMedium); FillChar(LocalStgMedium^, SizeOf(LocalStgMedium^), #0); end; end else begin // It is a new format so create a new TFormatCollectionItem, copy the // FormatEtc parameter into the new object and and put it in the list. SetLength(FFormatEtcArray, Length(FormatEtcArray) + 1); FormatEtcArray[High(FormatEtcArray)] := FormatEtc; // Create a new InternalStgMedium and initialize it and associate it with the format. SetLength(FInternalStgMediumArray, Length(InternalStgMediumArray) + 1); InternalStgMediumArray[High(InternalStgMediumArray)].Format := FormatEtc.cfFormat; LocalStgMedium := @InternalStgMediumArray[High(InternalStgMediumArray)].Medium; FillChar(LocalStgMedium^, SizeOf(LocalStgMedium^), #0); end; if DoRelease then begin // We are simply being given the data and we take control of it. LocalStgMedium^ := Medium; Result := S_OK end else begin // We need to reference count or copy the data and keep our own references to it. Result := StgMediumIncRef(Medium, LocalStgMedium^, True, Self as IDataObject); // Can get a circular reference if the client calls GetData then calls SetData with the same StgMedium. // Because the unkForRelease for the IDataObject can be marshalled it is necessary to get pointers that // can be correctly compared. See the IDragSourceHelper article by Raymond Chen at MSDN. if Assigned(LocalStgMedium.PunkForRelease) then begin if CanonicalIUnknown(Self) = CanonicalIUnknown(IUnknown(LocalStgMedium.PunkForRelease)) then IUnknown(LocalStgMedium.PunkForRelease) := nil; // release the interface end; end; // Tell all registered advice sinks about the data change. if Assigned(FAdviseHolder) then FAdviseHolder.SendOnDataChange(Self as IDataObject, 0, 0); } end; //----------------- TVTDragManager ------------------------------------------------------------------------------------- constructor TVTDragManager.Create(AOwner: TObject); begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { inherited Create; FOwner := AOwner; // Create an instance of the drop target helper interface. This will fail but not harm on systems which do // not support this interface (everything below Windows 2000); CoCreateInstance(CLSID_DragDropHelper, nil, CLSCTX_INPROC_SERVER, IID_IDropTargetHelper, FDropTargetHelper); } end; //---------------------------------------------------------------------------------------------------------------------- destructor TVTDragManager.Destroy; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { // Set the owner's reference to us to nil otherwise it will access an invalid pointer // after our desctruction is complete. TVirtualTreeAccess(FOwner).FreeDragManager; inherited; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDataObject: IDataObject; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { // When the owner tree starts a drag operation then it gets a data object here to pass it to the OLE subsystem. // In this case there is no local reference to a data object and one is created (but not stored). // If there is a local reference then the owner tree is currently the drop target and the stored interface is // that of the drag initiator. if Assigned(FDataObject) then Result := FDataObject else begin Result := TVirtualTreeAccess(FOwner).DoCreateDataObject; if Result = nil then Result := TVTDataObject.Create(FOwner, False) as IDataObject; end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDragSource: TObject; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := FDragSource; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDropTargetHelperSupported: Boolean; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := Assigned(FDropTargetHelper); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetIsDropTarget: Boolean; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := FIsDropTarget; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragEnter(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { FDataObject := DataObject; FIsDropTarget := True; SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, @FFullDragging, 0); // If full dragging of window contents is disabled in the system then our tree windows will be locked // and cannot be updated during a drag operation. With the following call painting is again enabled. if not FFullDragging then LockWindowUpdate(0); if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragEnter(TBaseVirtualTree(FOwner).Handle, DataObject, Pt, Effect); FDragSource := TVirtualTreeAccess(FOwner).GetTreeFromDataObject(DataObject); Result := TVirtualTreeAccess(FOwner).DragEnter(KeyState, Pt, Effect); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragLeave: HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragLeave; TVirtualTreeAccess(FOwner).DragLeave; FIsDropTarget := False; FDragSource := nil; FDataObject := nil; Result := NOERROR; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragOver(KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragOver(Pt, Effect); Result := TVirtualTreeAccess(FOwner).DragOver(FDragSource, KeyState, dsDragMove, Pt, Effect); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.Drop(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.Drop(DataObject, Pt, Effect); Result := TVirtualTreeAccess(FOwner).DragDrop(DataObject, KeyState, Pt, Effect); FIsDropTarget := False; FDataObject := nil; } end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTDragManager.ForceDragLeave; // Some drop targets, e.g. Internet Explorer leave a drag image on screen instead removing it when they receive // a drop action. This method calls the drop target helper's DragLeave method to ensure it removes the drag image from // screen. Unfortunately, sometimes not even this does help (e.g. when dragging text from VT to a text field in IE). begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragLeave; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GiveFeedback(Effect: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := DRAGDROP_S_USEDEFAULTCURSORS; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.QueryContinueDrag(EscapePressed: BOOL; KeyState: LongWord): HResult; var RButton, LButton: Boolean; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { LButton := (KeyState and MK_LBUTTON) <> 0; RButton := (KeyState and MK_RBUTTON) <> 0; // Drag'n drop canceled by pressing both mouse buttons or Esc? if (LButton and RButton) or EscapePressed then Result := DRAGDROP_S_CANCEL else // Drag'n drop finished? if not (LButton or RButton) then Result := DRAGDROP_S_DROP else Result := S_OK; } end; end. doublecmd-0.5.8/components/virtualtreeview/units/carbon/0000755000175000017500000000000012257501472022547 5ustar alexxalexxdoublecmd-0.5.8/components/virtualtreeview/units/carbon/fakemmsystem.pas0000644000175000017500000000065012014201074025744 0ustar alexxalexxunit fakemmsystem; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Types; function timeBeginPeriod(x1: DWord): DWord; function timeEndPeriod(x1: DWord): DWord; function timeGetTime: DWORD; implementation uses LCLIntf; function timeBeginPeriod(x1: DWord): DWord; begin end; function timeEndPeriod(x1: DWord): DWord; begin end; function timeGetTime: DWORD; begin Result := GetTickCount; end; end. doublecmd-0.5.8/components/virtualtreeview/units/carbon/virtualpanningwindow.pas0000644000175000017500000000201212014201074027522 0ustar alexxalexxunit virtualpanningwindow; {$mode objfpc}{$H+} interface uses LCLType, Graphics, Classes, SysUtils; type { TVirtualPanningWindow } TVirtualPanningWindow = class private FHandle: THandle; FOwnerHandle: THandle; FImage: TBitmap; procedure HandlePaintMessage; public procedure Start(OwnerHandle: THandle; const Position: TPoint); procedure Stop; procedure Show(ClipRegion: HRGN); property Image: TBitmap read FImage; property Handle: THandle read FHandle; end; implementation {$ifdef DEBUG_VTV} uses vtlogger; {$endif} { TVirtualPanningWindow } procedure TVirtualPanningWindow.HandlePaintMessage; begin end; procedure TVirtualPanningWindow.Start(OwnerHandle: THandle; const Position: TPoint); begin FImage := TBitmap.Create; end; procedure TVirtualPanningWindow.Stop; begin FImage.Free; FImage := nil; end; procedure TVirtualPanningWindow.Show(ClipRegion: HRGN); begin {$ifdef DEBUG_VTV}Logger.SendBitmap([lcPanning],'Panning Image',FImage);{$endif} end; end. doublecmd-0.5.8/components/virtualtreeview/units/carbon/fakeactivex.pas0000644000175000017500000000005412014201074025527 0ustar alexxalexxunit FakeActiveX; {$i ../dummyactivex.inc} doublecmd-0.5.8/components/virtualtreeview/units/carbon/virtualdragmanager.pas0000644000175000017500000017010612014201074027122 0ustar alexxalexxunit virtualdragmanager; {fake unit just to compile - not used under non windows} {$mode delphi} interface uses Classes, SysUtils, Types; const // Drag image helpers for Windows 2000 and up. IID_IDropTargetHelper: TGUID = (D1: $4657278B; D2: $411B; D3: $11D2; D4: ($83, $9A, $00, $C0, $4F, $D9, $18, $D0)); IID_IDragSourceHelper: TGUID = (D1: $DE5BF786; D2: $477A; D3: $11D2; D4: ($83, $9D, $00, $C0, $4F, $D9, $18, $D0)); IID_IDropTarget: TGUID = (D1: $00000122; D2: $0000; D3: $0000; D4: ($C0, $00, $00, $00, $00, $00, $00, $46)); CLSID_DragDropHelper: TGUID = (D1: $4657278A; D2: $411B; D3: $11D2; D4: ($83, $9A, $00, $C0, $4F, $D9, $18, $D0)); SID_IDropTargetHelper = '{4657278B-411B-11D2-839A-00C04FD918D0}'; SID_IDragSourceHelper = '{DE5BF786-477A-11D2-839D-00C04FD918D0}'; SID_IDropTarget = '{00000122-0000-0000-C000-000000000046}'; //Bridge to ActiveX constants TYMED_HGLOBAL = 1; TYMED_ISTREAM = 4; DVASPECT_CONTENT = 1; CLSCTX_INPROC_SERVER = $0010; DROPEFFECT_COPY = 1; DROPEFFECT_LINK = 4; DROPEFFECT_MOVE = 2; DROPEFFECT_NONE = 0; DROPEFFECT_SCROLL = dword($80000000); DATADIR_GET = 1; type //types from win unit Long = LongInt; WinBool= LongBool; Bool= WinBool; ULONG = cardinal; LONGLONG = int64; LPDWORD = ^DWORD; LPVOID = pointer; TCOLORREF = cardinal; TIID = TGUID; LARGE_INTEGER = record case byte of 0: (LowPart : DWORD; HighPart : LONG); 1: (QuadPart : LONGLONG); end; PLARGE_INTEGER = ^LARGE_INTEGER; _LARGE_INTEGER = LARGE_INTEGER; TLargeInteger = Int64; PLargeInteger = ^TLargeInteger; ULARGE_INTEGER = record case byte of 0: (LowPart : DWORD; HighPart : DWORD); 1: (QuadPart : LONGLONG); end; PULARGE_INTEGER = ^ULARGE_INTEGER; _ULARGE_INTEGER = ULARGE_INTEGER; HANDLE = System.THandle; HWND = HANDLE; //HRESULT = System.HResult; HBITMAP = HANDLE; HENHMETAFILE = HANDLE; //activex types IMoniker = Interface; WINOLEAPI = HResult; TLCID = DWORD; OleChar = WChar; LPOLESTR = ^OLECHAR; HMetaFilePict = Pointer; tagBIND_OPTS = Record cvStruct, // sizeof(BIND_OPTS) grfFlags, grfMode, dwTickCountDeadline : DWord; End; TBind_Opts = tagBIND_OPTS; TCLIPFORMAT = Word; tagDVTARGETDEVICE = Record tdSize : DWord; tdDriverNameOffset, tdDeviceNameOffset, tdPortNameOffset, tdExtDevmodeOffset : Word; Data : Record End; End; DVTARGETDEVICE = TagDVTARGETDEVICE; PDVTARGETDEVICE = ^tagDVTARGETDEVICE; tagFORMATETC = Record CfFormat : Word {TCLIPFORMAT}; Ptd : PDVTARGETDEVICE; dwAspect : DWORD; lindex : Long; tymed : DWORD; End; FORMATETC = TagFORMATETC; TFORMATETC = FORMATETC; LPFORMATETC = ^FORMATETC; PFormatEtc = LPFORMATETC; tagSTATDATA = Record // field used by: FORMATETC : Tformatetc; // EnumAdvise, EnumData (cache), EnumFormats advf : DWord; // EnumAdvise, EnumData (cache) padvSink : Pointer {IAdviseSink}; // EnumAdvise dwConnection: DWord; // EnumAdvise End; STATDATA = TagStatData; TagSTGMEDIUM = Record Tymed : DWord; Case Integer Of 0 : (HBITMAP : hBitmap; PUnkForRelease : Pointer {IUnknown}); 1 : (HMETAFILEPICT : hMetaFilePict ); 2 : (HENHMETAFILE : hEnhMetaFile ); 3 : (HGLOBAL : hGlobal ); 4 : (lpszFileName : LPOLESTR ); 5 : (pstm : Pointer{IStream} ); 6 : (pstg : Pointer{IStorage} ); End; USTGMEDIUM = TagSTGMEDIUM; STGMEDIUM = USTGMEDIUM; TStgMedium = TagSTGMEDIUM; PStgMedium = ^TStgMedium; LPSTGMEDIUM = ^STGMEDIUM; IEnumString = Interface (IUnknown) ['{00000101-0000-0000-C000-000000000046}'] Function Next(Celt:ULong;Out xcelt;Out Celtfetched:ULong):HResult; StdCall; // Function RemoteNext(Celt:ULong; Out celt;Out Celtfetched:ULong):HResult; StdCall; Function Skip (Celt:ULong):Hresult;StdCall; Function Reset:HResult;StdCall; Function Clone(Out penum:IEnumString):HResult;StdCall; End; IEnumMoniker = Interface (IUnknown) ['{00000102-0000-0000-C000-000000000046}'] Function Next(celt:ULong; out Elt;out celftfetched: ULong):HResult; StdCall; // Function RemoteNext(Celt:ULong; Out rgelt;out celtfetched :ULong):Hresult; StdCall; Function Skip(celt:Ulong):HResult; StdCall; Function Reset:HResult; StdCall; Function Close(out penum:IEnumMoniker):HResult;StdCall; End; IEnumSTATDATA = Interface (IUnknown) ['{00000105-0000-0000-C000-000000000046}'] Function Next(Celt:ULong;Out Rgelt:statdata;Out pceltFetched:ULong):HResult; StdCall; // Function RemoteNext(Celt:ULong;Out Rgelt:statdata;Out pceltFetched:ULong):HResult; StdCall; Function Skip(Celt:ULong):HResult;StdCall; Function Reset:HResult;StdCall; Function Clone(out penum:IEnumstatdata):HResult;StdCall; End; IEnumFORMATETC = Interface (IUnknown) ['{00000103-0000-0000-C000-000000000046}'] Function Next(Celt:ULong;Out Rgelt:FormatEtc;Out pceltFetched:ULong):HResult; StdCall; // Function RemoteNext(Celt:ULong;Out Rgelt:FormatEtc;Out pceltFetched:ULong):HResult; StdCall; Function Skip(Celt:ULong):HResult;StdCall; Function Reset:HResult;StdCall; Function Clone(out penum:IEnumFORMATETC):HResult;StdCall; End; IPersist = Interface (IUnknown) ['{0000010c-0000-0000-C000-000000000046}'] Function GetClassId(clsid:TClsId):HResult; StdCall; End; IPersistStream = Interface(IPersist) ['{00000109-0000-0000-C000-000000000046}'] Function IsDirty:HResult; StdCall; Function Load(Const stm: IStream):HResult; StdCall; Function Save(Const stm: IStream;fClearDirty:Bool):HResult;StdCall; Function GetSizeMax(Out cbSize:ULarge_Integer):HResult; StdCall; End; IRunningObjectTable = Interface (IUnknown) ['{00000010-0000-0000-C000-000000000046}'] Function Register (grfFlags :DWord;const unkobject:IUnknown;Const mkObjectName:IMoniker;Out dwregister:DWord):HResult;StdCall; Function Revoke (dwRegister:DWord):HResult; StdCall; Function IsRunning (Const mkObjectName: IMoniker):HResult;StdCall; Function GetObject (Const mkObjectName: IMoniker; Out punkObject:IUnknown):HResult; StdCall; Function NoteChangeTime(dwRegister :DWord;Const FileTime: TFileTime):HResult;StdCall; Function GetTimeOfLastChange(Const mkObjectName:IMoniker;Out filetime:TFileTime):HResult; StdCall; Function EnumRunning (Out enumMoniker: IEnumMoniker):HResult; StdCall; End; IBindCtx = Interface (IUnknown) ['{0000000e-0000-0000-C000-000000000046}'] Function RegisterObjectBound(Const punk:IUnknown):HResult; stdCall; Function RevokeObjectBound (Const Punk:IUnknown):HResult; stdCall; Function ReleaseBoundObjects :HResult; StdCall; Function SetBindOptions(Const bindOpts:TBind_Opts):HResult; stdCall; // Function RemoteSetBindOptions(Const bind_opts: TBind_Opts2):HResult;StdCall; Function GetBindOptions(var BindOpts:TBind_Opts):HResult; stdCall; // Function RemoteGetBindOptions(Var bind_opts: TBind_Opts2):HResult;StdCall; Function GetRunningObjectTable(Out rot : IRunningObjectTable):Hresult; StdCall; Function RegisterObjectParam(Const pszkey:LPOleStr;const punk:IUnknown):HResult; Function GetObjectParam(Const pszkey:LPOleStr; out punk: IUnknown):HResult; StdCall; Function EnumObjectParam (out enum:IEnumString):Hresult;StdCall; Function RevokeObjectParam(pszKey:LPOleStr):HResult;StdCall; End; PIMoniker = ^IMoniker; IMoniker = Interface (IPersistStream) ['{0000000f-0000-0000-C000-000000000046}'] Function BindToObject (const pbc:IBindCtx;const mktoleft:IMoniker; RiidResult:TIID;Out vresult):HResult;StdCall; // Function RemoteBindToObject (const pbc:IBindCtx;const mktoleft:IMoniker;RiidResult:TIID;Out vresult):HResult;StdCall; Function BindToStorage(Const Pbc:IBindCtx;Const mktoLeft:IMoniker; Riid:TIID;Out vobj):HResult; StdCall; // Function RemoteBindToStorage(Const Pbc:IBindCtx;Const mktoLeft:IMoniker; Riid:TIID;Out vobj):HResult; StdCall; Function Reduce (const pbc:IBindCtx; dwReduceHowFar:DWord; mktoLeft: PIMoniker; Out mkReduced:IMoniker):HResult; StdCall; Function ComposeWith(Const MkRight:IMoniker;fOnlyIfNotGeneric:BOOL; OUT mkComposite:IMoniker):HResult; StdCall; Function Enum(fForward:Bool;Out enumMoniker:IEnumMoniker):HResult;StdCall; Function IsEqual(Const mkOtherMoniker:IMoniker):HResult;StdCall; Function Hash (Out dwHash:Dword):HResult;StdCall; Function IsRunning(Const bc:IBindCtx;Const MkToLeft:IMoniker;Const mknewlyRunning:IMoniker):HResult;StdCall; Function GetTimeOfLastChange(Const bc:IBindCtx;Const mkToLeft:IMoniker; out ft : FileTime):HResult; StdCall; Function Inverse(out mk : IMoniker):HResult; StdCall; Function CommonPrefixWith (Const mkOther:IMoniker):HResult; StdCall; Function RelativePathTo(Const mkother:IMoniker; Out mkRelPath : IMoniker):HResult;StdCall; Function GetDisplayName(Const bc:IMoniker;const mktoleft:IMoniker;Out szDisplayName: pOleStr):HResult; StdCall; Function ParseDisplayName(Const bc:IBindCtx;Const mkToLeft:IMoniker;szDisplayName:POleStr;out cheaten:ULong;out mkOut:IMoniker):HResult; StdCall; Function IsSystemMonitor(Out dwMkSys:DWord):HResult;StdCall; End; IAdviseSink = Interface (IUnknown) ['{0000010f-0000-0000-C000-000000000046}'] {$ifdef midl500} ['{00000150-0000-0000-C000-000000000046}'] {$endif} Procedure OnDataChange (Const pformatetc : Formatetc;const pstgmed : STGMEDIUM); StdCall; Procedure OnViewChange (dwAspect : DWord; lindex : Long); StdCall; Procedure OnRename (Const pmk : IMoniker); StdCall; Procedure OnSave; StdCall; Procedure OnClose; StdCall; End; //Fake interfaces IDataObject = Interface (IUnknown) ['{0000010e-0000-0000-C000-000000000046}'] Function GetData(Const formatetcIn : FORMATETC;Out medium : STGMEDIUM):HRESULT; STDCALL; Function GetDataHere(CONST pformatetc : FormatETC; Out medium : STGMEDIUM):HRESULT; STDCALL; Function QueryGetData(const pformatetc : FORMATETC):HRESULT; STDCALL; Function GetCanonicalFormatTEtc(const pformatetcIn : FORMATETC;Out pformatetcOut : FORMATETC):HResult; STDCALl; Function SetData (Const pformatetc : FORMATETC;const medium:STGMEDIUM;FRelease : BOOL):HRESULT; StdCall; Function EnumFormatEtc(dwDirection : DWord; OUT enumformatetcpara : IENUMFORMATETC):HRESULT; StdCall; Function DAdvise(const formatetc : FORMATETC;advf :DWORD; CONST AdvSink : IAdviseSink;OUT dwConnection:DWORD):HRESULT;StdCall; Function DUnadvise(dwconnection :DWord) :HRESULT;StdCall; Function EnumDAvise(Out enumAdvise : IEnumStatData):HResult;StdCall; End; IDropTarget = interface(IUnknown) ['{00000122-0000-0000-C000-000000000046}'] function DragEnter(const dataObj: IDataObject; grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD): HResult;StdCall; function DragOver(grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD): HResult;StdCall; function DragLeave: HResult;StdCall; function Drop(const dataObj: IDataObject; grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD):HResult;StdCall; end; IDropSource = interface(IUnknown) ['{00000121-0000-0000-C000-000000000046}'] function QueryContinueDrag(fEscapePressed: BOOL; grfKeyState: LongWord):HResult;StdCall; function GiveFeedback(dwEffect: LongWord): HResult;StdCall; end; IDataAdviseHolder = Interface (IUnknown) ['{00000110-0000-0000-C000-000000000046}'] Function Advise (CONST pdataObject : IDataObject;CONST fetc:FORMATETC;advf : DWORD;Const pAdvise:IAdviseSink;Out DwConnection:DWord):HResult; StdCall; Function Unadvise (dwConnection:Dword):HResult; StdCall; Function EnumAdvise(out penumAdvise : IEnumStatData):HResult;StdCall; Function SendOnDataChange(const pDataObject :IDataObject;DwReserved,advf : DWord):HResult; StdCall; End; // OLE drag'n drop support TFormatEtcArray = array of TFormatEtc; TFormatArray = array of Word; // IDataObject.SetData support TInternalStgMedium = packed record Format: TClipFormat; Medium: TStgMedium; end; TInternalStgMediumArray = array of TInternalStgMedium; TEnumFormatEtc = class(TInterfacedObject, IEnumFormatEtc) private FTree: TObject; FFormatEtcArray: TFormatEtcArray; FCurrentIndex: Integer; public constructor Create(Tree: TObject; AFormatEtcArray: TFormatEtcArray); function Clone(out Enum: IEnumFormatEtc): HResult; stdcall; function Next(celt: LongWord; out elt: FormatEtc; out pceltFetched: LongWord): HResult; stdcall; function Reset: HResult; stdcall; function Skip(celt: LongWord): HResult; stdcall; end; IDropTargetHelper = interface(IUnknown) [SID_IDropTargetHelper] function DragEnter(hwndTarget: HWND; pDataObject: IDataObject; var ppt: TPoint; dwEffect: LongWord): HRESULT; stdcall; function DragLeave: HRESULT; stdcall; function DragOver(var ppt: TPoint; dwEffect: LongWord): HRESULT; stdcall; function Drop(pDataObject: IDataObject; var ppt: TPoint; dwEffect: LongWord): HRESULT; stdcall; function Show(fShow: Boolean): HRESULT; stdcall; end; PSHDragImage = ^TSHDragImage; TSHDragImage = packed record sizeDragImage: TSize; ptOffset: TPoint; hbmpDragImage: HBITMAP; ColorRef: TColorRef; end; IDragSourceHelper = interface(IUnknown) [SID_IDragSourceHelper] function InitializeFromBitmap(var SHDragImage: TSHDragImage; pDataObject: IDataObject): HRESULT; stdcall; function InitializeFromWindow(Window: HWND; var ppt: TPoint; pDataObject: IDataObject): HRESULT; stdcall; end; IVTDragManager = interface(IUnknown) ['{C4B25559-14DA-446B-8901-0C879000EB16}'] procedure ForceDragLeave; stdcall; function GetDataObject: IDataObject; stdcall; function GetDragSource: TObject; stdcall; function GetDropTargetHelperSupported: Boolean; stdcall; function GetIsDropTarget: Boolean; stdcall; property DataObject: IDataObject read GetDataObject; property DragSource: TObject read GetDragSource; property DropTargetHelperSupported: Boolean read GetDropTargetHelperSupported; property IsDropTarget: Boolean read GetIsDropTarget; end; // This data object is used in two different places. One is for clipboard operations and the other while dragging. TVTDataObject = class(TInterfacedObject, IDataObject) private //FOwner: TBaseVirtualTree; // The tree which provides clipboard or drag data. FOwner: TObject; // The tree which provides clipboard or drag data. FForClipboard: Boolean; // Determines which data to render with GetData. FFormatEtcArray: TFormatEtcArray; FInternalStgMediumArray: TInternalStgMediumArray; // The available formats in the DataObject FAdviseHolder: IDataAdviseHolder; // Reference to an OLE supplied implementation for advising. protected function CanonicalIUnknown(TestUnknown: IUnknown): IUnknown; function EqualFormatEtc(FormatEtc1, FormatEtc2: TFormatEtc): Boolean; function FindFormatEtc(TestFormatEtc: TFormatEtc; const FormatEtcArray: TFormatEtcArray): integer; function FindInternalStgMedium(Format: TClipFormat): PStgMedium; function HGlobalClone(HGlobal: THandle): THandle; function RenderInternalOLEData(const FormatEtcIn: TFormatEtc; var Medium: TStgMedium; var OLEResult: HResult): Boolean; function StgMediumIncRef(const InStgMedium: TStgMedium; var OutStgMedium: TStgMedium; CopyInMedium: Boolean; DataObject: IDataObject): HRESULT; property ForClipboard: Boolean read FForClipboard; property FormatEtcArray: TFormatEtcArray read FFormatEtcArray write FFormatEtcArray; property InternalStgMediumArray: TInternalStgMediumArray read FInternalStgMediumArray write FInternalStgMediumArray; property Owner: TObject read FOwner; public constructor Create(AOwner: TObject; ForClipboard: Boolean); virtual; destructor Destroy; override; function DAdvise(const FormatEtc: TFormatEtc; advf: DWord; const advSink: IAdviseSink; out dwConnection: DWord): HResult; virtual; stdcall; function DUnadvise(dwConnection: DWord): HResult; virtual; stdcall; Function EnumDAvise(Out enumAdvise : IEnumStatData):HResult;virtual;StdCall; function EnumFormatEtc(Direction: DWord; out EnumFormatEtc: IEnumFormatEtc): HResult; virtual; stdcall; Function GetCanonicalFormatTEtc(const pformatetcIn : FORMATETC;Out pformatetcOut : FORMATETC):HResult; virtual; STDCALl; function GetData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium): HResult; virtual; stdcall; function GetDataHere(const FormatEtc: TFormatEtc; out Medium: TStgMedium): HResult; virtual; stdcall; function QueryGetData(const FormatEtc: TFormatEtc): HResult; virtual; stdcall; function SetData(const FormatEtc: TFormatEtc;{$ifdef VER2_0}var{$else}const{$endif} Medium: TStgMedium; DoRelease: BOOL): HResult; virtual; stdcall; end; // TVTDragManager is a class to manage drag and drop in a Virtual Treeview. TVTDragManager = class(TInterfacedObject, IVTDragManager, IDropSource, IDropTarget) private FOwner, // The tree which is responsible for drag management. FDragSource: TObject; // Reference to the source tree if the source was a VT, might be different than // the owner tree. FIsDropTarget: Boolean; // True if the owner is currently the drop target. FDataObject: IDataObject; // A reference to the data object passed in by DragEnter (only used when the owner // tree is the current drop target). FDropTargetHelper: IDropTargetHelper; // Win2k > Drag image support FFullDragging: BOOL; // True, if full dragging is currently enabled in the system. function GetDataObject: IDataObject; stdcall; function GetDragSource: TObject; stdcall; function GetDropTargetHelperSupported: Boolean; stdcall; function GetIsDropTarget: Boolean; stdcall; public constructor Create(AOwner: TObject); virtual; destructor Destroy; override; function DragEnter(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; stdcall; function DragLeave: HResult; stdcall; function DragOver(KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; stdcall; function Drop(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; stdcall; procedure ForceDragLeave; stdcall; function GiveFeedback(Effect: LongWord): HResult; stdcall; function QueryContinueDrag(EscapePressed: BOOL; KeyState: LongWord): HResult; stdcall; end; //Ole helper functions function Succeeded(Status : HRESULT) : BOOLEAN; function Failed(Status : HRESULT) : BOOLEAN; //ActiveX functions that have wrong calling convention in fpc function RegisterDragDrop(hwnd:HWND; pDropTarget:IDropTarget):WINOLEAPI;stdcall; function RevokeDragDrop(hwnd:HWND):WINOLEAPI;stdcall; function DoDragDrop(pDataObj:IDataObject; pDropSource:IDropSource; dwOKEffects:DWORD; pdwEffect:LPDWORD):WINOLEAPI; function OleInitialize(pvReserved:LPVOID):WINOLEAPI;stdcall; procedure OleUninitialize;stdcall; procedure ReleaseStgMedium(_para1:LPSTGMEDIUM);stdcall; function OleSetClipboard(pDataObj:IDataObject):WINOLEAPI;stdcall; function OleGetClipboard(out ppDataObj:IDataObject):WINOLEAPI;stdcall; function OleFlushClipboard:WINOLEAPI;stdcall; function OleIsCurrentClipboard(pDataObj:IDataObject):WINOLEAPI;stdcall; function CreateStreamOnHGlobal(hGlobal:HGLOBAL; fDeleteOnRelease:BOOL;out stm:IStream):WINOLEAPI;stdcall; function CoCreateInstance(const _para1:TCLSID; _para2:IUnknown; _para3:DWORD;const _para4:TIID;out _para5):HRESULT;stdcall; //helper functions to isolate windows/OLE specific code function RenderOLEData(Tree: TObject; const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean): HResult; function GetStreamFromMedium(Medium:TStgMedium):TStream; procedure UnlockMediumData(Medium:TStgMedium); function GetTreeFromDataObject(const DataObject: IDataObject; var Format: TFormatEtc): TObject; function AllocateGlobal(Data: Pointer; DataSize:Cardinal): HGLOBAL; implementation uses VirtualTrees, Controls {$ifdef DEBUG_VTV}, vtlogger{$endif}; type TVirtualTreeAccess = class (TBaseVirtualTree) end; function Succeeded(Status : HRESULT) : BOOLEAN; begin Succeeded:=Status and HRESULT($80000000)=0; end; function Failed(Status : HRESULT) : BOOLEAN; begin Failed:=Status and HRESULT($80000000)<>0; end; function RegisterDragDrop(hwnd: HWND; pDropTarget: IDropTarget): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function RevokeDragDrop(hwnd: HWND): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function DoDragDrop(pDataObj: IDataObject; pDropSource: IDropSource; dwOKEffects: DWORD; pdwEffect: LPDWORD): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleInitialize(pvReserved: LPVOID): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; procedure OleUninitialize; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; procedure ReleaseStgMedium(_para1: LPSTGMEDIUM); begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleSetClipboard(pDataObj: IDataObject): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleGetClipboard(out ppDataObj: IDataObject): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleFlushClipboard: WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleIsCurrentClipboard(pDataObj: IDataObject): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function CreateStreamOnHGlobal(hGlobal: HGLOBAL; fDeleteOnRelease: BOOL; out stm: IStream): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function CoCreateInstance(const _para1: TCLSID; _para2: IUnknown; _para3: DWORD; const _para4: TIID; out _para5): HRESULT; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function RenderOLEData(Tree: TObject; const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean): HResult; { //--------------- local function -------------------------------------------- procedure WriteNodes(Stream: TStream); var Selection: TNodeArray; I: Integer; begin with TVirtualTreeAccess(Tree) do begin if ForClipboard then Selection := GetSortedCutCopySet(True) else Selection := GetSortedSelection(True); for I := 0 to High(Selection) do WriteNode(Stream, Selection[I]); end; end; //--------------- end local function ---------------------------------------- } var Data: PCardinal; ResPointer: Pointer; ResSize: Integer; OLEStream: IStream; VCLStream: TStream; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { VCLStream := nil; try Medium.PunkForRelease := nil; // Return data in one of the supported storage formats, prefer IStream. if FormatEtcIn.tymed and TYMED_ISTREAM <> 0 then begin // Create an IStream on a memory handle (here it is 0 which indicates to implicitely allocated a handle). // Do not use TStreamAdapter as it is not compatible with OLE (when flushing the clipboard OLE wants the HGlobal // back which is not supported by TStreamAdapater). CreateStreamOnHGlobal(0, True, OLEStream); VCLStream := TOLEStream.Create(OLEStream); WriteNodes(VCLStream); // Rewind stream. VCLStream.Position := 0; Medium.tymed := TYMED_ISTREAM; IUnknown(Medium.Pstm) := OLEStream; Result := S_OK; end else begin VCLStream := TMemoryStream.Create; WriteNodes(VCLStream); ResPointer := TMemoryStream(VCLStream).Memory; ResSize := VCLStream.Position; // Allocate memory to hold the string. if ResSize > 0 then begin Medium.hGlobal := GlobalAlloc(GHND or GMEM_SHARE, ResSize + SizeOf(Cardinal)); Data := GlobalLock(Medium.hGlobal); // Store the size of the data too, for easy retrival. Data^ := ResSize; Inc(Data); Move(ResPointer^, Data^, ResSize); GlobalUnlock(Medium.hGlobal); Medium.tymed := TYMED_HGLOBAL; Result := S_OK; end else Result := E_FAIL; end; finally // We can free the VCL stream here since it was either a pure memory stream or only a wrapper around // the OLEStream which exists independently. VCLStream.Free; end; } end; type // needed to handle OLE global memory objects TOLEMemoryStream = class(TCustomMemoryStream) public function Write(const Buffer; Count: Integer): Longint; override; end; //---------------------------------------------------------------------------------------------------------------------- function TOLEMemoryStream.Write(const Buffer; Count: Integer): Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} // raise EStreamError.CreateRes(PResStringRec(@SCantWriteResourceStreamError)); end; function GetStreamFromMedium(Medium: TStgMedium): TStream; var Data: Pointer; I: Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := nil; if Medium.tymed = TYMED_ISTREAM then Result := TOLEStream.Create(IUnknown(Medium.Pstm) as IStream) else begin Data := GlobalLock(Medium.hGlobal); if Assigned(Data) then begin // Get the total size of data to retrieve. I := PCardinal(Data)^; Inc(PCardinal(Data)); Result := TOLEMemoryStream.Create; TOLEMemoryStream(Result).SetPointer(Data, I); end; end; } end; procedure UnlockMediumData(Medium: TStgMedium); begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Medium.tymed = TYMED_HGLOBAL then GlobalUnlock(Medium.hGlobal); } end; function GetTreeFromDataObject(const DataObject: IDataObject; var Format: TFormatEtc): TObject; var Medium: TStgMedium; Data: PVTReference; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := nil; if Assigned(DataObject) then begin Format.cfFormat := CF_VTREFERENCE; if DataObject.GetData(Format, Medium) = S_OK then begin Data := GlobalLock(Medium.hGlobal); if Assigned(Data) then begin if Data.Process = GetCurrentProcessID then Result := Data.Tree; GlobalUnlock(Medium.hGlobal); end; ReleaseStgMedium(@Medium); end; end; } end; function AllocateGlobal(Data: Pointer; DataSize: Cardinal): HGLOBAL; var P:Pointer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := GlobalAlloc(GHND or GMEM_SHARE, DataSize); P := GlobalLock(Result); Move(Data^, P^, DataSize); GlobalUnlock(Result); } end; //---------------------------------------------------------------------------------------------------------------------- // OLE drag and drop support classes // This is quite heavy stuff (compared with the VCL implementation) but is much better suited to fit the needs // of DD'ing various kinds of virtual data and works also between applications. //----------------- TEnumFormatEtc ------------------------------------------------------------------------------------- constructor TEnumFormatEtc.Create(Tree: TObject; AFormatEtcArray: TFormatEtcArray); var I: Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { inherited Create; FTree := Tree; // Make a local copy of the format data. SetLength(FFormatEtcArray, Length(AFormatEtcArray)); for I := 0 to High(AFormatEtcArray) do FFormatEtcArray[I] := AFormatEtcArray[I]; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Clone(out Enum: IEnumFormatEtc): HResult; var AClone: TEnumFormatEtc; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := S_OK; try AClone := TEnumFormatEtc.Create(nil, FFormatEtcArray); AClone.FCurrentIndex := FCurrentIndex; Enum := AClone as IEnumFormatEtc; except Result := E_FAIL; end; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Next(celt: LongWord; out elt: FormatEtc; out pceltFetched: LongWord): HResult; var CopyCount: LongWord; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := S_FALSE; CopyCount := Length(FFormatEtcArray) - FCurrentIndex; if celt < CopyCount then CopyCount := celt; if CopyCount > 0 then begin Move(FFormatEtcArray[FCurrentIndex], elt, CopyCount * SizeOf(TFormatEtc)); Inc(FCurrentIndex, CopyCount); Result := S_OK; end; //todo_lcl_check Delphi treats pceltFetched an PInteger. Implemented like in fpc.activex. What heappens with // a C Program call with a NULL in pCeltFetcjed?? //Answer: Yes. Is necessary a check here if @pceltFetched <> nil then pceltFetched := CopyCount; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Reset: HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { FCurrentIndex := 0; Result := S_OK; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Skip(celt: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if FCurrentIndex + celt < High(FFormatEtcArray) then begin Inc(FCurrentIndex, celt); Result := S_Ok; end else Result := S_FALSE; } end; //----------------- TVTDataObject -------------------------------------------------------------------------------------- constructor TVTDataObject.Create(AOwner: TObject; ForClipboard: Boolean); begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { inherited Create; FOwner := AOwner; FForClipboard := ForClipboard; TVirtualTreeAccess(FOwner).GetNativeClipboardFormats(FFormatEtcArray); } end; //---------------------------------------------------------------------------------------------------------------------- destructor TVTDataObject.Destroy; var I: Integer; StgMedium: PStgMedium; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { // Cancel a pending clipboard operation if this data object was created for the clipboard and // is freed because something else is placed there. if FForClipboard and not (tsClipboardFlushing in TVirtualTreeAccess(FOwner).TreeStates) then TVirtualTreeAccess(FOwner).CancelCutOrCopy; // Release any internal clipboard formats for I := 0 to High(FormatEtcArray) do begin StgMedium := FindInternalStgMedium(FormatEtcArray[I].cfFormat); if Assigned(StgMedium) then ReleaseStgMedium(StgMedium); end; FormatEtcArray := nil; inherited; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.CanonicalIUnknown(TestUnknown: IUnknown): IUnknown; // Uses COM object identity: An explicit call to the IUnknown::QueryInterface method, requesting the IUnknown // interface, will always return the same pointer. begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(TestUnknown) then begin if TestUnknown.QueryInterface(IUnknown, Result) = 0 then Result._Release // Don't actually need it just need the pointer value else Result := TestUnknown end else Result := TestUnknown } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EqualFormatEtc(FormatEtc1, FormatEtc2: TFormatEtc): Boolean; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := (FormatEtc1.cfFormat = FormatEtc2.cfFormat) and (FormatEtc1.ptd = FormatEtc2.ptd) and (FormatEtc1.dwAspect = FormatEtc2.dwAspect) and (FormatEtc1.lindex = FormatEtc2.lindex) and (FormatEtc1.tymed and FormatEtc2.tymed <> 0); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.FindFormatEtc(TestFormatEtc: TFormatEtc; const FormatEtcArray: TFormatEtcArray): integer; var I: integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := -1; for I := 0 to High(FormatEtcArray) do begin if EqualFormatEtc(TestFormatEtc, FormatEtcArray[I]) then begin Result := I; Break; end end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.FindInternalStgMedium(Format: TClipFormat): PStgMedium; var I: integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := nil; for I := 0 to High(InternalStgMediumArray) do begin if Format = InternalStgMediumArray[I].Format then begin Result := @InternalStgMediumArray[I].Medium; Break; end end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.HGlobalClone(HGlobal: THandle): THandle; // Returns a global memory block that is a copy of the passed memory block. var Size: Cardinal; Data, NewData: PChar; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Size := GlobalSize(HGlobal); Result := GlobalAlloc(GPTR, Size); Data := GlobalLock(hGlobal); try NewData := GlobalLock(Result); try Move(Data^, NewData^, Size); finally GlobalUnLock(Result); end finally GlobalUnLock(hGlobal); end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.RenderInternalOLEData(const FormatEtcIn: TFormatEtc; var Medium: TStgMedium; var OLEResult: HResult): Boolean; // Tries to render one of the formats which have been stored via the SetData method. // Since this data is already there it is just copied or its reference count is increased (depending on storage medium). var InternalMedium: PStgMedium; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := True; InternalMedium := FindInternalStgMedium(FormatEtcIn.cfFormat); if Assigned(InternalMedium) then OLEResult := StgMediumIncRef(InternalMedium^, Medium, False, Self as IDataObject) else Result := False; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.StgMediumIncRef(const InStgMedium: TStgMedium; var OutStgMedium: TStgMedium; CopyInMedium: Boolean; DataObject: IDataObject): HRESULT; // InStgMedium is the data that is requested, OutStgMedium is the data that we are to return either a copy of or // increase the IDataObject's reference and send ourselves back as the data (unkForRelease). The InStgMedium is usually // the result of a call to find a particular FormatEtc that has been stored locally through a call to SetData. // If CopyInMedium is not true we already have a local copy of the data when the SetData function was called (during // that call the CopyInMedium must be true). Then as the caller asks for the data through GetData we do not have to make // copy of the data for the caller only to have them destroy it then need us to copy it again if necessary. // This way we increase the reference count to ourselves and pass the STGMEDIUM structure initially stored in SetData. // This way when the caller frees the structure it sees the unkForRelease is not nil and calls Release on the object // instead of destroying the actual data. var Len: Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := S_OK; // Simply copy all fields to start with. OutStgMedium := InStgMedium; // The data handled here always results from a call of SetData we got. This ensures only one storage format // is indicated and hence the case statement below is safe (IDataObject.GetData can optionally use several // storage formats). case InStgMedium.tymed of TYMED_HGLOBAL: begin if CopyInMedium then begin // Generate a unique copy of the data passed OutStgMedium.hGlobal := HGlobalClone(InStgMedium.hGlobal); if OutStgMedium.hGlobal = 0 then Result := E_OUTOFMEMORY end else // Don't generate a copy just use ourselves and the copy previously saved. OutStgMedium.PunkForRelease := Pointer(DataObject); // Does not increase RefCount. end; TYMED_FILE: begin //todo_lcl_check Len := Length(WideString(InStgMedium.lpszFileName)) + 1; // Don't forget the terminating null character. OutStgMedium.lpszFileName := CoTaskMemAlloc(2 * Len); Move(InStgMedium.lpszFileName^, OutStgMedium.lpszFileName^, 2 * Len); end; TYMED_ISTREAM: IUnknown(OutStgMedium.Pstm)._AddRef; TYMED_ISTORAGE: IUnknown(OutStgMedium.Pstg)._AddRef; TYMED_GDI: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy GDI objects right now. TYMED_MFPICT: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy MetaFile objects right now. TYMED_ENHMF: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy enhanced metafiles objects right now. else Result := DV_E_TYMED; end; if (Result = S_OK) and Assigned(OutStgMedium.PunkForRelease) then IUnknown(OutStgMedium.PunkForRelease)._AddRef; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.DAdvise(const FormatEtc: TFormatEtc; advf: DWord; const advSink: IAdviseSink; out dwConnection: DWord): HResult; // Advise sink management is greatly simplified by the IDataAdviseHolder interface. // We use this interface and forward all concerning calls to it. begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := S_OK; if FAdviseHolder = nil then Result := CreateDataAdviseHolder(FAdviseHolder); if Result = S_OK then Result := FAdviseHolder.Advise(Self as IDataObject, FormatEtc, advf, advSink, dwConnection); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.DUnadvise(dwConnection: DWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if FAdviseHolder = nil then Result := E_NOTIMPL else Result := FAdviseHolder.Unadvise(dwConnection); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EnumDAvise(Out enumAdvise : IEnumStatData):HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if FAdviseHolder = nil then Result := OLE_E_ADVISENOTSUPPORTED else Result := FAdviseHolder.EnumAdvise(enumAdvise); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EnumFormatEtc(Direction: DWord; out EnumFormatEtc: IEnumFormatEtc): HResult; var NewList: TEnumFormatEtc; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := E_FAIL; if Direction = DATADIR_GET then begin NewList := TEnumFormatEtc.Create(TVirtualTreeAccess(FOwner), FormatEtcArray); EnumFormatEtc := NewList as IEnumFormatEtc; Result := S_OK; end else EnumFormatEtc := nil; if EnumFormatEtc = nil then Result := OLE_S_USEREG; } end; //---------------------------------------------------------------------------------------------------------------------- Function TVTDataObject.GetCanonicalFormatTEtc(const pformatetcIn : FORMATETC;Out pformatetcOut : FORMATETC):HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := DATA_S_SAMEFORMATETC; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.GetData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium): HResult; // Data is requested by clipboard or drop target. This method dispatchs the call // depending on the data being requested. var I: Integer; Data: PVTReference; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} // The tree reference format is always supported and returned from here. { if FormatEtcIn.cfFormat = CF_VTREFERENCE then begin // Note: this format is not used while flushing the clipboard to avoid a dangling reference // when the owner tree is destroyed before the clipboard data is replaced with something else. if tsClipboardFlushing in TVirtualTreeAccess(FOwner).TreeStates then Result := E_FAIL else begin Medium.hGlobal := GlobalAlloc(GHND or GMEM_SHARE, SizeOf(TVTReference)); Data := GlobalLock(Medium.hGlobal); Data.Process := GetCurrentProcessID; Data.Tree := TBaseVirtualTree(FOwner); GlobalUnlock(Medium.hGlobal); Medium.tymed := TYMED_HGLOBAL; Medium.PunkForRelease := nil; Result := S_OK; end; end else begin try // See if we accept this type and if not get the correct return value. Result := QueryGetData(FormatEtcIn); if Result = S_OK then begin for I := 0 to High(FormatEtcArray) do begin if EqualFormatEtc(FormatEtcIn, FormatEtcArray[I]) then begin if not RenderInternalOLEData(FormatEtcIn, Medium, Result) then Result := TVirtualTreeAccess(FOwner).RenderOLEData(FormatEtcIn, Medium, FForClipboard); Break; end; end end except FillChar(Medium, SizeOf(Medium), #0); Result := E_FAIL; end; end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.GetDataHere(const FormatEtc: TFormatEtc; out Medium: TStgMedium): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := E_NOTIMPL; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.QueryGetData(const FormatEtc: TFormatEtc): HResult; var I: Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := DV_E_CLIPFORMAT; for I := 0 to High(FFormatEtcArray) do begin if FormatEtc.cfFormat = FFormatEtcArray[I].cfFormat then begin if (FormatEtc.tymed and FFormatEtcArray[I].tymed) <> 0 then begin if FormatEtc.dwAspect = FFormatEtcArray[I].dwAspect then begin if FormatEtc.lindex = FFormatEtcArray[I].lindex then begin Result := S_OK; Break; end else Result := DV_E_LINDEX; end else Result := DV_E_DVASPECT; end else Result := DV_E_TYMED; end; end } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.SetData(const FormatEtc: TFormatEtc;{$ifdef VER2_0}var{$else}const{$endif} Medium: TStgMedium; DoRelease: BOOL): HResult; // Allows dynamic adding to the IDataObject during its existance. Most noteably it is used to implement // IDropSourceHelper and allows to set a special format for optimized moves during a shell transfer. var Index: Integer; LocalStgMedium: PStgMedium; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { // See if we already have a format of that type available. Index := FindFormatEtc(FormatEtc, FormatEtcArray); if Index > - 1 then begin // Just use the TFormatEct in the array after releasing the data. LocalStgMedium := FindInternalStgMedium(FormatEtcArray[Index].cfFormat); if Assigned(LocalStgMedium) then begin ReleaseStgMedium(LocalStgMedium); FillChar(LocalStgMedium^, SizeOf(LocalStgMedium^), #0); end; end else begin // It is a new format so create a new TFormatCollectionItem, copy the // FormatEtc parameter into the new object and and put it in the list. SetLength(FFormatEtcArray, Length(FormatEtcArray) + 1); FormatEtcArray[High(FormatEtcArray)] := FormatEtc; // Create a new InternalStgMedium and initialize it and associate it with the format. SetLength(FInternalStgMediumArray, Length(InternalStgMediumArray) + 1); InternalStgMediumArray[High(InternalStgMediumArray)].Format := FormatEtc.cfFormat; LocalStgMedium := @InternalStgMediumArray[High(InternalStgMediumArray)].Medium; FillChar(LocalStgMedium^, SizeOf(LocalStgMedium^), #0); end; if DoRelease then begin // We are simply being given the data and we take control of it. LocalStgMedium^ := Medium; Result := S_OK end else begin // We need to reference count or copy the data and keep our own references to it. Result := StgMediumIncRef(Medium, LocalStgMedium^, True, Self as IDataObject); // Can get a circular reference if the client calls GetData then calls SetData with the same StgMedium. // Because the unkForRelease for the IDataObject can be marshalled it is necessary to get pointers that // can be correctly compared. See the IDragSourceHelper article by Raymond Chen at MSDN. if Assigned(LocalStgMedium.PunkForRelease) then begin if CanonicalIUnknown(Self) = CanonicalIUnknown(IUnknown(LocalStgMedium.PunkForRelease)) then IUnknown(LocalStgMedium.PunkForRelease) := nil; // release the interface end; end; // Tell all registered advice sinks about the data change. if Assigned(FAdviseHolder) then FAdviseHolder.SendOnDataChange(Self as IDataObject, 0, 0); } end; //----------------- TVTDragManager ------------------------------------------------------------------------------------- constructor TVTDragManager.Create(AOwner: TObject); begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { inherited Create; FOwner := AOwner; // Create an instance of the drop target helper interface. This will fail but not harm on systems which do // not support this interface (everything below Windows 2000); CoCreateInstance(CLSID_DragDropHelper, nil, CLSCTX_INPROC_SERVER, IID_IDropTargetHelper, FDropTargetHelper); } end; //---------------------------------------------------------------------------------------------------------------------- destructor TVTDragManager.Destroy; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { // Set the owner's reference to us to nil otherwise it will access an invalid pointer // after our desctruction is complete. TVirtualTreeAccess(FOwner).FreeDragManager; inherited; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDataObject: IDataObject; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { // When the owner tree starts a drag operation then it gets a data object here to pass it to the OLE subsystem. // In this case there is no local reference to a data object and one is created (but not stored). // If there is a local reference then the owner tree is currently the drop target and the stored interface is // that of the drag initiator. if Assigned(FDataObject) then Result := FDataObject else begin Result := TVirtualTreeAccess(FOwner).DoCreateDataObject; if Result = nil then Result := TVTDataObject.Create(FOwner, False) as IDataObject; end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDragSource: TObject; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := FDragSource; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDropTargetHelperSupported: Boolean; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := Assigned(FDropTargetHelper); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetIsDropTarget: Boolean; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := FIsDropTarget; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragEnter(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { FDataObject := DataObject; FIsDropTarget := True; SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, @FFullDragging, 0); // If full dragging of window contents is disabled in the system then our tree windows will be locked // and cannot be updated during a drag operation. With the following call painting is again enabled. if not FFullDragging then LockWindowUpdate(0); if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragEnter(TBaseVirtualTree(FOwner).Handle, DataObject, Pt, Effect); FDragSource := TVirtualTreeAccess(FOwner).GetTreeFromDataObject(DataObject); Result := TVirtualTreeAccess(FOwner).DragEnter(KeyState, Pt, Effect); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragLeave: HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragLeave; TVirtualTreeAccess(FOwner).DragLeave; FIsDropTarget := False; FDragSource := nil; FDataObject := nil; Result := NOERROR; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragOver(KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragOver(Pt, Effect); Result := TVirtualTreeAccess(FOwner).DragOver(FDragSource, KeyState, dsDragMove, Pt, Effect); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.Drop(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.Drop(DataObject, Pt, Effect); Result := TVirtualTreeAccess(FOwner).DragDrop(DataObject, KeyState, Pt, Effect); FIsDropTarget := False; FDataObject := nil; } end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTDragManager.ForceDragLeave; // Some drop targets, e.g. Internet Explorer leave a drag image on screen instead removing it when they receive // a drop action. This method calls the drop target helper's DragLeave method to ensure it removes the drag image from // screen. Unfortunately, sometimes not even this does help (e.g. when dragging text from VT to a text field in IE). begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragLeave; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GiveFeedback(Effect: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := DRAGDROP_S_USEDEFAULTCURSORS; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.QueryContinueDrag(EscapePressed: BOOL; KeyState: LongWord): HResult; var RButton, LButton: Boolean; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { LButton := (KeyState and MK_LBUTTON) <> 0; RButton := (KeyState and MK_RBUTTON) <> 0; // Drag'n drop canceled by pressing both mouse buttons or Esc? if (LButton and RButton) or EscapePressed then Result := DRAGDROP_S_CANCEL else // Drag'n drop finished? if not (LButton or RButton) then Result := DRAGDROP_S_DROP else Result := S_OK; } end; end. doublecmd-0.5.8/components/virtualtreeview/units/dummyactivex.inc0000644000175000017500000004056012014201074024504 0ustar alexxalexx {fake unit just to compile - not used under non windows} {$mode delphi} interface uses {$ifdef Windows} Windows, {$endif} Classes, SysUtils, Types; const TYMED_HGLOBAL = 1; TYMED_ISTREAM = 4; DVASPECT_CONTENT = 1; CLSCTX_INPROC_SERVER = $0010; DROPEFFECT_COPY = 1; DROPEFFECT_LINK = 4; DROPEFFECT_MOVE = 2; DROPEFFECT_NONE = 0; DROPEFFECT_SCROLL = dword($80000000); DATADIR_GET = 1; type //types from win unit Long = LongInt; WinBool = LongBool; Bool = WinBool; ULONG = cardinal; PULONG = ^ULONG; LONGLONG = int64; LPDWORD = ^DWORD; LPVOID = pointer; TCOLORREF = cardinal; TIID = TGUID; LARGE_INTEGER = record case byte of 0: (LowPart : DWORD; HighPart : LONG); 1: (QuadPart : LONGLONG); end; PLARGE_INTEGER = ^LARGE_INTEGER; _LARGE_INTEGER = LARGE_INTEGER; TLargeInteger = Int64; PLargeInteger = ^TLargeInteger; ULARGE_INTEGER = record case byte of 0: (LowPart : DWORD; HighPart : DWORD); 1: (QuadPart : LONGLONG); end; PULARGE_INTEGER = ^ULARGE_INTEGER; _ULARGE_INTEGER = ULARGE_INTEGER; HANDLE = System.THandle; HWND = HANDLE; //HRESULT = System.HResult; HBITMAP = HANDLE; HENHMETAFILE = HANDLE; //activex types IMoniker = Interface; WINOLEAPI = HResult; TLCID = DWORD; OleChar = WChar; LPOLESTR = ^OLECHAR; HMetaFilePict = Pointer; tagBIND_OPTS = Record cvStruct, // sizeof(BIND_OPTS) grfFlags, grfMode, dwTickCountDeadline : DWord; End; TBind_Opts = tagBIND_OPTS; TCLIPFORMAT = Word; tagDVTARGETDEVICE = Record tdSize : DWord; tdDriverNameOffset, tdDeviceNameOffset, tdPortNameOffset, tdExtDevmodeOffset : Word; Data : Record End; End; DVTARGETDEVICE = TagDVTARGETDEVICE; PDVTARGETDEVICE = ^tagDVTARGETDEVICE; tagFORMATETC = Record CfFormat : Word {TCLIPFORMAT}; Ptd : PDVTARGETDEVICE; dwAspect : DWORD; lindex : Long; tymed : DWORD; End; FORMATETC = TagFORMATETC; TFORMATETC = FORMATETC; LPFORMATETC = ^FORMATETC; PFormatEtc = LPFORMATETC; tagSTATDATA = Record // field used by: FORMATETC : Tformatetc; // EnumAdvise, EnumData (cache), EnumFormats advf : DWord; // EnumAdvise, EnumData (cache) padvSink : Pointer {IAdviseSink}; // EnumAdvise dwConnection: DWord; // EnumAdvise End; STATDATA = TagStatData; TagSTGMEDIUM = Record Tymed : DWord; Case Integer Of 0 : (HBITMAP : hBitmap; PUnkForRelease : Pointer {IUnknown}); 1 : (HMETAFILEPICT : hMetaFilePict ); 2 : (HENHMETAFILE : hEnhMetaFile ); 3 : (HGLOBAL : hGlobal ); 4 : (lpszFileName : LPOLESTR ); 5 : (pstm : Pointer{IStream} ); 6 : (pstg : Pointer{IStorage} ); End; USTGMEDIUM = TagSTGMEDIUM; STGMEDIUM = USTGMEDIUM; TStgMedium = TagSTGMEDIUM; PStgMedium = ^TStgMedium; LPSTGMEDIUM = ^STGMEDIUM; IEnumString = Interface (IUnknown) ['{00000101-0000-0000-C000-000000000046}'] Function Next(Celt:ULong;Out xcelt;Out Celtfetched:ULong):HResult; StdCall; // Function RemoteNext(Celt:ULong; Out celt;Out Celtfetched:ULong):HResult; StdCall; Function Skip (Celt:ULong):Hresult;StdCall; Function Reset:HResult;StdCall; Function Clone(Out penum:IEnumString):HResult;StdCall; End; IEnumMoniker = Interface (IUnknown) ['{00000102-0000-0000-C000-000000000046}'] Function Next(celt:ULong; out Elt;out celftfetched: ULong):HResult; StdCall; // Function RemoteNext(Celt:ULong; Out rgelt;out celtfetched :ULong):Hresult; StdCall; Function Skip(celt:Ulong):HResult; StdCall; Function Reset:HResult; StdCall; Function Close(out penum:IEnumMoniker):HResult;StdCall; End; IEnumSTATDATA = Interface (IUnknown) ['{00000105-0000-0000-C000-000000000046}'] Function Next (Celt:ULong;Out xcelt;pceltfetched : PUlong):HResult; StdCall; // Function RemoteNext(Celt:ULong;Out Rgelt:statdata;Out pceltFetched:ULong):HResult; StdCall; Function Skip(Celt:ULong):HResult;StdCall; Function Reset:HResult;StdCall; Function Clone(out penum:IEnumstatdata):HResult;StdCall; End; IEnumFORMATETC = Interface (IUnknown) ['{00000103-0000-0000-C000-000000000046}'] Function Next(Celt:ULong;Out Rgelt:FormatEtc;pceltFetched:pULong=nil):HResult; StdCall; // Function RemoteNext(Celt:ULong;Out Rgelt:FormatEtc;Out pceltFetched:ULong):HResult; StdCall; Function Skip(Celt:ULong):HResult;StdCall; Function Reset:HResult;StdCall; Function Clone(out penum:IEnumFORMATETC):HResult;StdCall; End; IPersist = Interface (IUnknown) ['{0000010c-0000-0000-C000-000000000046}'] Function GetClassId(clsid:TClsId):HResult; StdCall; End; IPersistStream = Interface(IPersist) ['{00000109-0000-0000-C000-000000000046}'] Function IsDirty:HResult; StdCall; Function Load(Const stm: IStream):HResult; StdCall; Function Save(Const stm: IStream;fClearDirty:Bool):HResult;StdCall; Function GetSizeMax(Out cbSize:ULarge_Integer):HResult; StdCall; End; IRunningObjectTable = Interface (IUnknown) ['{00000010-0000-0000-C000-000000000046}'] Function Register (grfFlags :DWord;const unkobject:IUnknown;Const mkObjectName:IMoniker;Out dwregister:DWord):HResult;StdCall; Function Revoke (dwRegister:DWord):HResult; StdCall; Function IsRunning (Const mkObjectName: IMoniker):HResult;StdCall; Function GetObject (Const mkObjectName: IMoniker; Out punkObject:IUnknown):HResult; StdCall; Function NoteChangeTime(dwRegister :DWord;Const FileTime: TFileTime):HResult;StdCall; Function GetTimeOfLastChange(Const mkObjectName:IMoniker;Out filetime:TFileTime):HResult; StdCall; Function EnumRunning (Out enumMoniker: IEnumMoniker):HResult; StdCall; End; IBindCtx = Interface (IUnknown) ['{0000000e-0000-0000-C000-000000000046}'] Function RegisterObjectBound(Const punk:IUnknown):HResult; stdCall; Function RevokeObjectBound (Const Punk:IUnknown):HResult; stdCall; Function ReleaseBoundObjects :HResult; StdCall; Function SetBindOptions(Const bindOpts:TBind_Opts):HResult; stdCall; // Function RemoteSetBindOptions(Const bind_opts: TBind_Opts2):HResult;StdCall; Function GetBindOptions(var BindOpts:TBind_Opts):HResult; stdCall; // Function RemoteGetBindOptions(Var bind_opts: TBind_Opts2):HResult;StdCall; Function GetRunningObjectTable(Out rot : IRunningObjectTable):Hresult; StdCall; Function RegisterObjectParam(Const pszkey:LPOleStr;const punk:IUnknown):HResult; Function GetObjectParam(Const pszkey:LPOleStr; out punk: IUnknown):HResult; StdCall; Function EnumObjectParam (out enum:IEnumString):Hresult;StdCall; Function RevokeObjectParam(pszKey:LPOleStr):HResult;StdCall; End; PIMoniker = ^IMoniker; IMoniker = Interface (IPersistStream) ['{0000000f-0000-0000-C000-000000000046}'] Function BindToObject (const pbc:IBindCtx;const mktoleft:IMoniker; RiidResult:TIID;Out vresult):HResult;StdCall; // Function RemoteBindToObject (const pbc:IBindCtx;const mktoleft:IMoniker;RiidResult:TIID;Out vresult):HResult;StdCall; Function BindToStorage(Const Pbc:IBindCtx;Const mktoLeft:IMoniker; Riid:TIID;Out vobj):HResult; StdCall; // Function RemoteBindToStorage(Const Pbc:IBindCtx;Const mktoLeft:IMoniker; Riid:TIID;Out vobj):HResult; StdCall; Function Reduce (const pbc:IBindCtx; dwReduceHowFar:DWord; mktoLeft: PIMoniker; Out mkReduced:IMoniker):HResult; StdCall; Function ComposeWith(Const MkRight:IMoniker;fOnlyIfNotGeneric:BOOL; OUT mkComposite:IMoniker):HResult; StdCall; Function Enum(fForward:Bool;Out enumMoniker:IEnumMoniker):HResult;StdCall; Function IsEqual(Const mkOtherMoniker:IMoniker):HResult;StdCall; Function Hash (Out dwHash:Dword):HResult;StdCall; Function IsRunning(Const bc:IBindCtx;Const MkToLeft:IMoniker;Const mknewlyRunning:IMoniker):HResult;StdCall; Function GetTimeOfLastChange(Const bc:IBindCtx;Const mkToLeft:IMoniker; out ft : FileTime):HResult; StdCall; Function Inverse(out mk : IMoniker):HResult; StdCall; Function CommonPrefixWith (Const mkOther:IMoniker):HResult; StdCall; Function RelativePathTo(Const mkother:IMoniker; Out mkRelPath : IMoniker):HResult;StdCall; Function GetDisplayName(Const bc:IMoniker;const mktoleft:IMoniker;Out szDisplayName: pOleStr):HResult; StdCall; Function ParseDisplayName(Const bc:IBindCtx;Const mkToLeft:IMoniker;szDisplayName:POleStr;out cheaten:ULong;out mkOut:IMoniker):HResult; StdCall; Function IsSystemMonitor(Out dwMkSys:DWord):HResult;StdCall; End; IAdviseSink = Interface (IUnknown) ['{0000010f-0000-0000-C000-000000000046}'] {$ifdef midl500} ['{00000150-0000-0000-C000-000000000046}'] {$endif} Procedure OnDataChange (Const pformatetc : Formatetc;const pstgmed : STGMEDIUM); StdCall; Procedure OnViewChange (dwAspect : DWord; lindex : Long); StdCall; Procedure OnRename (Const pmk : IMoniker); StdCall; Procedure OnSave; StdCall; Procedure OnClose; StdCall; End; //Fake interfaces IDataObject = Interface (IUnknown) ['{0000010e-0000-0000-C000-000000000046}'] Function GetData(Const formatetcIn : FORMATETC;Out medium : STGMEDIUM):HRESULT; STDCALL; Function GetDataHere(CONST pformatetc : FormatETC; Out medium : STGMEDIUM):HRESULT; STDCALL; Function QueryGetData(const pformatetc : FORMATETC):HRESULT; STDCALL; Function GetCanonicalFormatEtc(const pformatetcIn : FORMATETC;Out pformatetcOut : FORMATETC):HResult; STDCALl; Function SetData (Const pformatetc : FORMATETC;const medium:STGMEDIUM;FRelease : BOOL):HRESULT; StdCall; Function EnumFormatEtc(dwDirection : DWord; OUT enumformatetcpara : IENUMFORMATETC):HRESULT; StdCall; Function DAdvise(const formatetc : FORMATETC;advf :DWORD; CONST AdvSink : IAdviseSink;OUT dwConnection:DWORD):HRESULT;StdCall; Function DUnadvise(dwconnection :DWord) :HRESULT;StdCall; Function EnumDAdvise(Out enumAdvise : IEnumStatData):HResult;StdCall; End; IDropTarget = interface(IUnknown) ['{00000122-0000-0000-C000-000000000046}'] function DragEnter(const dataObj: IDataObject; grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD): HResult;StdCall; function DragOver(grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD): HResult;StdCall; function DragLeave: HResult;StdCall; function Drop(const dataObj: IDataObject; grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD):HResult;StdCall; end; IDropSource = interface(IUnknown) ['{00000121-0000-0000-C000-000000000046}'] function QueryContinueDrag(fEscapePressed: BOOL; grfKeyState: DWORD):HResult;StdCall; function GiveFeedback(dwEffect: DWORD): HResult;StdCall; end; IDataAdviseHolder = Interface (IUnknown) ['{00000110-0000-0000-C000-000000000046}'] Function Advise (CONST pdataObject : IDataObject;CONST fetc:FORMATETC;advf : DWORD;Const pAdvise:IAdviseSink;Out DwConnection:DWord):HResult; StdCall; Function Unadvise (dwConnection:Dword):HResult; StdCall; Function EnumAdvise(out penumAdvise : IEnumStatData):HResult;StdCall; Function SendOnDataChange(const pDataObject :IDataObject;DwReserved,advf : DWord):HResult; StdCall; End; //Ole helper functions function Succeeded(Status : HRESULT) : BOOLEAN; function Failed(Status : HRESULT) : BOOLEAN; //ActiveX functions that have wrong calling convention in fpc function RegisterDragDrop(hwnd:HWND; pDropTarget:IDropTarget):WINOLEAPI;stdcall; function RevokeDragDrop(hwnd:HWND):WINOLEAPI;stdcall; function DoDragDrop(pDataObj:IDataObject; pDropSource:IDropSource; dwOKEffects:DWORD; pdwEffect:LPDWORD):WINOLEAPI; function OleInitialize(pvReserved:LPVOID):WINOLEAPI;stdcall; procedure OleUninitialize;stdcall; procedure ReleaseStgMedium(_para1:LPSTGMEDIUM);stdcall; function OleSetClipboard(pDataObj:IDataObject):WINOLEAPI;stdcall; function OleGetClipboard(out ppDataObj:IDataObject):WINOLEAPI;stdcall; function OleFlushClipboard:WINOLEAPI;stdcall; function OleIsCurrentClipboard(pDataObj:IDataObject):WINOLEAPI;stdcall; function CreateStreamOnHGlobal(hGlobal:HGLOBAL; fDeleteOnRelease:BOOL;out stm:IStream):WINOLEAPI;stdcall; function CoCreateInstance(const _para1:TCLSID; _para2:IUnknown; _para3:DWORD;const _para4:TIID;out _para5):HRESULT;stdcall; implementation function Succeeded(Status : HRESULT) : BOOLEAN; begin Succeeded:=Status and HRESULT($80000000)=0; end; function Failed(Status : HRESULT) : BOOLEAN; begin Failed:=Status and HRESULT($80000000)<>0; end; function RegisterDragDrop(hwnd: HWND; pDropTarget: IDropTarget): WINOLEAPI; begin //Logger.SendError([lcOle],'Ole function called in Linux'); //Logger.SendCallStack([lcOle],'Stack'); end; function RevokeDragDrop(hwnd: HWND): WINOLEAPI; begin //Logger.SendError([lcOle],'Ole function called in Linux'); //Logger.SendCallStack([lcOle],'Stack'); end; function DoDragDrop(pDataObj: IDataObject; pDropSource: IDropSource; dwOKEffects: DWORD; pdwEffect: LPDWORD): WINOLEAPI; begin //Logger.SendError([lcOle],'Ole function called in Linux'); //Logger.SendCallStack([lcOle],'Stack'); end; function OleInitialize(pvReserved: LPVOID): WINOLEAPI; begin //Logger.SendError([lcOle],'Ole function called in Linux'); //Logger.SendCallStack([lcOle],'Stack'); end; procedure OleUninitialize; begin //Logger.SendError([lcOle],'Ole function called in Linux'); //Logger.SendCallStack([lcOle],'Stack'); end; procedure ReleaseStgMedium(_para1: LPSTGMEDIUM); begin //Logger.SendError([lcOle],'Ole function called in Linux'); //Logger.SendCallStack([lcOle],'Stack'); end; function OleSetClipboard(pDataObj: IDataObject): WINOLEAPI; begin //Logger.SendError([lcOle],'Ole function called in Linux'); //Logger.SendCallStack([lcOle],'Stack'); end; function OleGetClipboard(out ppDataObj: IDataObject): WINOLEAPI; begin //Logger.SendError([lcOle],'Ole function called in Linux'); //Logger.SendCallStack([lcOle],'Stack'); end; function OleFlushClipboard: WINOLEAPI; begin // Logger.SendError([lcOle],'Ole function called in Linux'); //Logger.SendCallStack([lcOle],'Stack'); end; function OleIsCurrentClipboard(pDataObj: IDataObject): WINOLEAPI; begin //Logger.SendError([lcOle],'Ole function called in Linux'); //Logger.SendCallStack([lcOle],'Stack'); end; function CreateStreamOnHGlobal(hGlobal: HGLOBAL; fDeleteOnRelease: BOOL; out stm: IStream): WINOLEAPI; begin //Logger.SendError([lcOle],'Ole function called in Linux'); //Logger.SendCallStack([lcOle],'Stack'); end; function CoCreateInstance(const _para1: TCLSID; _para2: IUnknown; _para3: DWORD; const _para4: TIID; out _para5): HRESULT; begin //Logger.SendError([lcOle],'Ole function called in Linux'); //Logger.SendCallStack([lcOle],'Stack'); end; end. doublecmd-0.5.8/components/virtualtreeview/units/gtk2/0000755000175000017500000000000012257501472022152 5ustar alexxalexxdoublecmd-0.5.8/components/virtualtreeview/units/gtk2/fakemmsystem.pas0000644000175000017500000000065012014201074025347 0ustar alexxalexxunit fakemmsystem; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Types, LCLIntf; function timeBeginPeriod(x1: DWord): DWord; function timeEndPeriod(x1: DWord): DWord; function timeGetTime: DWORD; implementation function timeBeginPeriod(x1: DWord): DWord; begin // end; function timeEndPeriod(x1: DWord): DWord; begin // end; function timeGetTime: DWORD; begin Result := GetTickCount; end; end. doublecmd-0.5.8/components/virtualtreeview/units/gtk2/virtualpanningwindow.pas0000644000175000017500000000201212014201074027125 0ustar alexxalexxunit virtualpanningwindow; {$mode objfpc}{$H+} interface uses LCLType, Graphics, Classes, SysUtils; type { TVirtualPanningWindow } TVirtualPanningWindow = class private FHandle: THandle; FOwnerHandle: THandle; FImage: TBitmap; procedure HandlePaintMessage; public procedure Start(OwnerHandle: THandle; const Position: TPoint); procedure Stop; procedure Show(ClipRegion: HRGN); property Image: TBitmap read FImage; property Handle: THandle read FHandle; end; implementation {$ifdef DEBUG_VTV} uses vtlogger; {$endif} { TVirtualPanningWindow } procedure TVirtualPanningWindow.HandlePaintMessage; begin end; procedure TVirtualPanningWindow.Start(OwnerHandle: THandle; const Position: TPoint); begin FImage := TBitmap.Create; end; procedure TVirtualPanningWindow.Stop; begin FImage.Free; FImage := nil; end; procedure TVirtualPanningWindow.Show(ClipRegion: HRGN); begin {$ifdef DEBUG_VTV}Logger.SendBitmap([lcPanning],'Panning Image',FImage);{$endif} end; end. doublecmd-0.5.8/components/virtualtreeview/units/gtk2/fakeactivex.pas0000644000175000017500000000005412014201074025132 0ustar alexxalexxunit FakeActiveX; {$i ../dummyactivex.inc} doublecmd-0.5.8/components/virtualtreeview/units/gtk2/virtualdragmanager.pas0000644000175000017500000017010612014201074026525 0ustar alexxalexxunit virtualdragmanager; {fake unit just to compile - not used under non windows} {$mode delphi} interface uses Classes, SysUtils, Types; const // Drag image helpers for Windows 2000 and up. IID_IDropTargetHelper: TGUID = (D1: $4657278B; D2: $411B; D3: $11D2; D4: ($83, $9A, $00, $C0, $4F, $D9, $18, $D0)); IID_IDragSourceHelper: TGUID = (D1: $DE5BF786; D2: $477A; D3: $11D2; D4: ($83, $9D, $00, $C0, $4F, $D9, $18, $D0)); IID_IDropTarget: TGUID = (D1: $00000122; D2: $0000; D3: $0000; D4: ($C0, $00, $00, $00, $00, $00, $00, $46)); CLSID_DragDropHelper: TGUID = (D1: $4657278A; D2: $411B; D3: $11D2; D4: ($83, $9A, $00, $C0, $4F, $D9, $18, $D0)); SID_IDropTargetHelper = '{4657278B-411B-11D2-839A-00C04FD918D0}'; SID_IDragSourceHelper = '{DE5BF786-477A-11D2-839D-00C04FD918D0}'; SID_IDropTarget = '{00000122-0000-0000-C000-000000000046}'; //Bridge to ActiveX constants TYMED_HGLOBAL = 1; TYMED_ISTREAM = 4; DVASPECT_CONTENT = 1; CLSCTX_INPROC_SERVER = $0010; DROPEFFECT_COPY = 1; DROPEFFECT_LINK = 4; DROPEFFECT_MOVE = 2; DROPEFFECT_NONE = 0; DROPEFFECT_SCROLL = dword($80000000); DATADIR_GET = 1; type //types from win unit Long = LongInt; WinBool= LongBool; Bool= WinBool; ULONG = cardinal; LONGLONG = int64; LPDWORD = ^DWORD; LPVOID = pointer; TCOLORREF = cardinal; TIID = TGUID; LARGE_INTEGER = record case byte of 0: (LowPart : DWORD; HighPart : LONG); 1: (QuadPart : LONGLONG); end; PLARGE_INTEGER = ^LARGE_INTEGER; _LARGE_INTEGER = LARGE_INTEGER; TLargeInteger = Int64; PLargeInteger = ^TLargeInteger; ULARGE_INTEGER = record case byte of 0: (LowPart : DWORD; HighPart : DWORD); 1: (QuadPart : LONGLONG); end; PULARGE_INTEGER = ^ULARGE_INTEGER; _ULARGE_INTEGER = ULARGE_INTEGER; HANDLE = System.THandle; HWND = HANDLE; //HRESULT = System.HResult; HBITMAP = HANDLE; HENHMETAFILE = HANDLE; //activex types IMoniker = Interface; WINOLEAPI = HResult; TLCID = DWORD; OleChar = WChar; LPOLESTR = ^OLECHAR; HMetaFilePict = Pointer; tagBIND_OPTS = Record cvStruct, // sizeof(BIND_OPTS) grfFlags, grfMode, dwTickCountDeadline : DWord; End; TBind_Opts = tagBIND_OPTS; TCLIPFORMAT = Word; tagDVTARGETDEVICE = Record tdSize : DWord; tdDriverNameOffset, tdDeviceNameOffset, tdPortNameOffset, tdExtDevmodeOffset : Word; Data : Record End; End; DVTARGETDEVICE = TagDVTARGETDEVICE; PDVTARGETDEVICE = ^tagDVTARGETDEVICE; tagFORMATETC = Record CfFormat : Word {TCLIPFORMAT}; Ptd : PDVTARGETDEVICE; dwAspect : DWORD; lindex : Long; tymed : DWORD; End; FORMATETC = TagFORMATETC; TFORMATETC = FORMATETC; LPFORMATETC = ^FORMATETC; PFormatEtc = LPFORMATETC; tagSTATDATA = Record // field used by: FORMATETC : Tformatetc; // EnumAdvise, EnumData (cache), EnumFormats advf : DWord; // EnumAdvise, EnumData (cache) padvSink : Pointer {IAdviseSink}; // EnumAdvise dwConnection: DWord; // EnumAdvise End; STATDATA = TagStatData; TagSTGMEDIUM = Record Tymed : DWord; Case Integer Of 0 : (HBITMAP : hBitmap; PUnkForRelease : Pointer {IUnknown}); 1 : (HMETAFILEPICT : hMetaFilePict ); 2 : (HENHMETAFILE : hEnhMetaFile ); 3 : (HGLOBAL : hGlobal ); 4 : (lpszFileName : LPOLESTR ); 5 : (pstm : Pointer{IStream} ); 6 : (pstg : Pointer{IStorage} ); End; USTGMEDIUM = TagSTGMEDIUM; STGMEDIUM = USTGMEDIUM; TStgMedium = TagSTGMEDIUM; PStgMedium = ^TStgMedium; LPSTGMEDIUM = ^STGMEDIUM; IEnumString = Interface (IUnknown) ['{00000101-0000-0000-C000-000000000046}'] Function Next(Celt:ULong;Out xcelt;Out Celtfetched:ULong):HResult; StdCall; // Function RemoteNext(Celt:ULong; Out celt;Out Celtfetched:ULong):HResult; StdCall; Function Skip (Celt:ULong):Hresult;StdCall; Function Reset:HResult;StdCall; Function Clone(Out penum:IEnumString):HResult;StdCall; End; IEnumMoniker = Interface (IUnknown) ['{00000102-0000-0000-C000-000000000046}'] Function Next(celt:ULong; out Elt;out celftfetched: ULong):HResult; StdCall; // Function RemoteNext(Celt:ULong; Out rgelt;out celtfetched :ULong):Hresult; StdCall; Function Skip(celt:Ulong):HResult; StdCall; Function Reset:HResult; StdCall; Function Close(out penum:IEnumMoniker):HResult;StdCall; End; IEnumSTATDATA = Interface (IUnknown) ['{00000105-0000-0000-C000-000000000046}'] Function Next(Celt:ULong;Out Rgelt:statdata;Out pceltFetched:ULong):HResult; StdCall; // Function RemoteNext(Celt:ULong;Out Rgelt:statdata;Out pceltFetched:ULong):HResult; StdCall; Function Skip(Celt:ULong):HResult;StdCall; Function Reset:HResult;StdCall; Function Clone(out penum:IEnumstatdata):HResult;StdCall; End; IEnumFORMATETC = Interface (IUnknown) ['{00000103-0000-0000-C000-000000000046}'] Function Next(Celt:ULong;Out Rgelt:FormatEtc;Out pceltFetched:ULong):HResult; StdCall; // Function RemoteNext(Celt:ULong;Out Rgelt:FormatEtc;Out pceltFetched:ULong):HResult; StdCall; Function Skip(Celt:ULong):HResult;StdCall; Function Reset:HResult;StdCall; Function Clone(out penum:IEnumFORMATETC):HResult;StdCall; End; IPersist = Interface (IUnknown) ['{0000010c-0000-0000-C000-000000000046}'] Function GetClassId(clsid:TClsId):HResult; StdCall; End; IPersistStream = Interface(IPersist) ['{00000109-0000-0000-C000-000000000046}'] Function IsDirty:HResult; StdCall; Function Load(Const stm: IStream):HResult; StdCall; Function Save(Const stm: IStream;fClearDirty:Bool):HResult;StdCall; Function GetSizeMax(Out cbSize:ULarge_Integer):HResult; StdCall; End; IRunningObjectTable = Interface (IUnknown) ['{00000010-0000-0000-C000-000000000046}'] Function Register (grfFlags :DWord;const unkobject:IUnknown;Const mkObjectName:IMoniker;Out dwregister:DWord):HResult;StdCall; Function Revoke (dwRegister:DWord):HResult; StdCall; Function IsRunning (Const mkObjectName: IMoniker):HResult;StdCall; Function GetObject (Const mkObjectName: IMoniker; Out punkObject:IUnknown):HResult; StdCall; Function NoteChangeTime(dwRegister :DWord;Const FileTime: TFileTime):HResult;StdCall; Function GetTimeOfLastChange(Const mkObjectName:IMoniker;Out filetime:TFileTime):HResult; StdCall; Function EnumRunning (Out enumMoniker: IEnumMoniker):HResult; StdCall; End; IBindCtx = Interface (IUnknown) ['{0000000e-0000-0000-C000-000000000046}'] Function RegisterObjectBound(Const punk:IUnknown):HResult; stdCall; Function RevokeObjectBound (Const Punk:IUnknown):HResult; stdCall; Function ReleaseBoundObjects :HResult; StdCall; Function SetBindOptions(Const bindOpts:TBind_Opts):HResult; stdCall; // Function RemoteSetBindOptions(Const bind_opts: TBind_Opts2):HResult;StdCall; Function GetBindOptions(var BindOpts:TBind_Opts):HResult; stdCall; // Function RemoteGetBindOptions(Var bind_opts: TBind_Opts2):HResult;StdCall; Function GetRunningObjectTable(Out rot : IRunningObjectTable):Hresult; StdCall; Function RegisterObjectParam(Const pszkey:LPOleStr;const punk:IUnknown):HResult; Function GetObjectParam(Const pszkey:LPOleStr; out punk: IUnknown):HResult; StdCall; Function EnumObjectParam (out enum:IEnumString):Hresult;StdCall; Function RevokeObjectParam(pszKey:LPOleStr):HResult;StdCall; End; PIMoniker = ^IMoniker; IMoniker = Interface (IPersistStream) ['{0000000f-0000-0000-C000-000000000046}'] Function BindToObject (const pbc:IBindCtx;const mktoleft:IMoniker; RiidResult:TIID;Out vresult):HResult;StdCall; // Function RemoteBindToObject (const pbc:IBindCtx;const mktoleft:IMoniker;RiidResult:TIID;Out vresult):HResult;StdCall; Function BindToStorage(Const Pbc:IBindCtx;Const mktoLeft:IMoniker; Riid:TIID;Out vobj):HResult; StdCall; // Function RemoteBindToStorage(Const Pbc:IBindCtx;Const mktoLeft:IMoniker; Riid:TIID;Out vobj):HResult; StdCall; Function Reduce (const pbc:IBindCtx; dwReduceHowFar:DWord; mktoLeft: PIMoniker; Out mkReduced:IMoniker):HResult; StdCall; Function ComposeWith(Const MkRight:IMoniker;fOnlyIfNotGeneric:BOOL; OUT mkComposite:IMoniker):HResult; StdCall; Function Enum(fForward:Bool;Out enumMoniker:IEnumMoniker):HResult;StdCall; Function IsEqual(Const mkOtherMoniker:IMoniker):HResult;StdCall; Function Hash (Out dwHash:Dword):HResult;StdCall; Function IsRunning(Const bc:IBindCtx;Const MkToLeft:IMoniker;Const mknewlyRunning:IMoniker):HResult;StdCall; Function GetTimeOfLastChange(Const bc:IBindCtx;Const mkToLeft:IMoniker; out ft : FileTime):HResult; StdCall; Function Inverse(out mk : IMoniker):HResult; StdCall; Function CommonPrefixWith (Const mkOther:IMoniker):HResult; StdCall; Function RelativePathTo(Const mkother:IMoniker; Out mkRelPath : IMoniker):HResult;StdCall; Function GetDisplayName(Const bc:IMoniker;const mktoleft:IMoniker;Out szDisplayName: pOleStr):HResult; StdCall; Function ParseDisplayName(Const bc:IBindCtx;Const mkToLeft:IMoniker;szDisplayName:POleStr;out cheaten:ULong;out mkOut:IMoniker):HResult; StdCall; Function IsSystemMonitor(Out dwMkSys:DWord):HResult;StdCall; End; IAdviseSink = Interface (IUnknown) ['{0000010f-0000-0000-C000-000000000046}'] {$ifdef midl500} ['{00000150-0000-0000-C000-000000000046}'] {$endif} Procedure OnDataChange (Const pformatetc : Formatetc;const pstgmed : STGMEDIUM); StdCall; Procedure OnViewChange (dwAspect : DWord; lindex : Long); StdCall; Procedure OnRename (Const pmk : IMoniker); StdCall; Procedure OnSave; StdCall; Procedure OnClose; StdCall; End; //Fake interfaces IDataObject = Interface (IUnknown) ['{0000010e-0000-0000-C000-000000000046}'] Function GetData(Const formatetcIn : FORMATETC;Out medium : STGMEDIUM):HRESULT; STDCALL; Function GetDataHere(CONST pformatetc : FormatETC; Out medium : STGMEDIUM):HRESULT; STDCALL; Function QueryGetData(const pformatetc : FORMATETC):HRESULT; STDCALL; Function GetCanonicalFormatTEtc(const pformatetcIn : FORMATETC;Out pformatetcOut : FORMATETC):HResult; STDCALl; Function SetData (Const pformatetc : FORMATETC;const medium:STGMEDIUM;FRelease : BOOL):HRESULT; StdCall; Function EnumFormatEtc(dwDirection : DWord; OUT enumformatetcpara : IENUMFORMATETC):HRESULT; StdCall; Function DAdvise(const formatetc : FORMATETC;advf :DWORD; CONST AdvSink : IAdviseSink;OUT dwConnection:DWORD):HRESULT;StdCall; Function DUnadvise(dwconnection :DWord) :HRESULT;StdCall; Function EnumDAvise(Out enumAdvise : IEnumStatData):HResult;StdCall; End; IDropTarget = interface(IUnknown) ['{00000122-0000-0000-C000-000000000046}'] function DragEnter(const dataObj: IDataObject; grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD): HResult;StdCall; function DragOver(grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD): HResult;StdCall; function DragLeave: HResult;StdCall; function Drop(const dataObj: IDataObject; grfKeyState: DWORD; pt: TPoint; var dwEffect: DWORD):HResult;StdCall; end; IDropSource = interface(IUnknown) ['{00000121-0000-0000-C000-000000000046}'] function QueryContinueDrag(fEscapePressed: BOOL; grfKeyState: LongWord):HResult;StdCall; function GiveFeedback(dwEffect: LongWord): HResult;StdCall; end; IDataAdviseHolder = Interface (IUnknown) ['{00000110-0000-0000-C000-000000000046}'] Function Advise (CONST pdataObject : IDataObject;CONST fetc:FORMATETC;advf : DWORD;Const pAdvise:IAdviseSink;Out DwConnection:DWord):HResult; StdCall; Function Unadvise (dwConnection:Dword):HResult; StdCall; Function EnumAdvise(out penumAdvise : IEnumStatData):HResult;StdCall; Function SendOnDataChange(const pDataObject :IDataObject;DwReserved,advf : DWord):HResult; StdCall; End; // OLE drag'n drop support TFormatEtcArray = array of TFormatEtc; TFormatArray = array of Word; // IDataObject.SetData support TInternalStgMedium = packed record Format: TClipFormat; Medium: TStgMedium; end; TInternalStgMediumArray = array of TInternalStgMedium; TEnumFormatEtc = class(TInterfacedObject, IEnumFormatEtc) private FTree: TObject; FFormatEtcArray: TFormatEtcArray; FCurrentIndex: Integer; public constructor Create(Tree: TObject; AFormatEtcArray: TFormatEtcArray); function Clone(out Enum: IEnumFormatEtc): HResult; stdcall; function Next(celt: LongWord; out elt: FormatEtc; out pceltFetched: LongWord): HResult; stdcall; function Reset: HResult; stdcall; function Skip(celt: LongWord): HResult; stdcall; end; IDropTargetHelper = interface(IUnknown) [SID_IDropTargetHelper] function DragEnter(hwndTarget: HWND; pDataObject: IDataObject; var ppt: TPoint; dwEffect: LongWord): HRESULT; stdcall; function DragLeave: HRESULT; stdcall; function DragOver(var ppt: TPoint; dwEffect: LongWord): HRESULT; stdcall; function Drop(pDataObject: IDataObject; var ppt: TPoint; dwEffect: LongWord): HRESULT; stdcall; function Show(fShow: Boolean): HRESULT; stdcall; end; PSHDragImage = ^TSHDragImage; TSHDragImage = packed record sizeDragImage: TSize; ptOffset: TPoint; hbmpDragImage: HBITMAP; ColorRef: TColorRef; end; IDragSourceHelper = interface(IUnknown) [SID_IDragSourceHelper] function InitializeFromBitmap(var SHDragImage: TSHDragImage; pDataObject: IDataObject): HRESULT; stdcall; function InitializeFromWindow(Window: HWND; var ppt: TPoint; pDataObject: IDataObject): HRESULT; stdcall; end; IVTDragManager = interface(IUnknown) ['{C4B25559-14DA-446B-8901-0C879000EB16}'] procedure ForceDragLeave; stdcall; function GetDataObject: IDataObject; stdcall; function GetDragSource: TObject; stdcall; function GetDropTargetHelperSupported: Boolean; stdcall; function GetIsDropTarget: Boolean; stdcall; property DataObject: IDataObject read GetDataObject; property DragSource: TObject read GetDragSource; property DropTargetHelperSupported: Boolean read GetDropTargetHelperSupported; property IsDropTarget: Boolean read GetIsDropTarget; end; // This data object is used in two different places. One is for clipboard operations and the other while dragging. TVTDataObject = class(TInterfacedObject, IDataObject) private //FOwner: TBaseVirtualTree; // The tree which provides clipboard or drag data. FOwner: TObject; // The tree which provides clipboard or drag data. FForClipboard: Boolean; // Determines which data to render with GetData. FFormatEtcArray: TFormatEtcArray; FInternalStgMediumArray: TInternalStgMediumArray; // The available formats in the DataObject FAdviseHolder: IDataAdviseHolder; // Reference to an OLE supplied implementation for advising. protected function CanonicalIUnknown(TestUnknown: IUnknown): IUnknown; function EqualFormatEtc(FormatEtc1, FormatEtc2: TFormatEtc): Boolean; function FindFormatEtc(TestFormatEtc: TFormatEtc; const FormatEtcArray: TFormatEtcArray): integer; function FindInternalStgMedium(Format: TClipFormat): PStgMedium; function HGlobalClone(HGlobal: THandle): THandle; function RenderInternalOLEData(const FormatEtcIn: TFormatEtc; var Medium: TStgMedium; var OLEResult: HResult): Boolean; function StgMediumIncRef(const InStgMedium: TStgMedium; var OutStgMedium: TStgMedium; CopyInMedium: Boolean; DataObject: IDataObject): HRESULT; property ForClipboard: Boolean read FForClipboard; property FormatEtcArray: TFormatEtcArray read FFormatEtcArray write FFormatEtcArray; property InternalStgMediumArray: TInternalStgMediumArray read FInternalStgMediumArray write FInternalStgMediumArray; property Owner: TObject read FOwner; public constructor Create(AOwner: TObject; ForClipboard: Boolean); virtual; destructor Destroy; override; function DAdvise(const FormatEtc: TFormatEtc; advf: DWord; const advSink: IAdviseSink; out dwConnection: DWord): HResult; virtual; stdcall; function DUnadvise(dwConnection: DWord): HResult; virtual; stdcall; Function EnumDAvise(Out enumAdvise : IEnumStatData):HResult;virtual;StdCall; function EnumFormatEtc(Direction: DWord; out EnumFormatEtc: IEnumFormatEtc): HResult; virtual; stdcall; Function GetCanonicalFormatTEtc(const pformatetcIn : FORMATETC;Out pformatetcOut : FORMATETC):HResult; virtual; STDCALl; function GetData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium): HResult; virtual; stdcall; function GetDataHere(const FormatEtc: TFormatEtc; out Medium: TStgMedium): HResult; virtual; stdcall; function QueryGetData(const FormatEtc: TFormatEtc): HResult; virtual; stdcall; function SetData(const FormatEtc: TFormatEtc;{$ifdef VER2_0}var{$else}const{$endif} Medium: TStgMedium; DoRelease: BOOL): HResult; virtual; stdcall; end; // TVTDragManager is a class to manage drag and drop in a Virtual Treeview. TVTDragManager = class(TInterfacedObject, IVTDragManager, IDropSource, IDropTarget) private FOwner, // The tree which is responsible for drag management. FDragSource: TObject; // Reference to the source tree if the source was a VT, might be different than // the owner tree. FIsDropTarget: Boolean; // True if the owner is currently the drop target. FDataObject: IDataObject; // A reference to the data object passed in by DragEnter (only used when the owner // tree is the current drop target). FDropTargetHelper: IDropTargetHelper; // Win2k > Drag image support FFullDragging: BOOL; // True, if full dragging is currently enabled in the system. function GetDataObject: IDataObject; stdcall; function GetDragSource: TObject; stdcall; function GetDropTargetHelperSupported: Boolean; stdcall; function GetIsDropTarget: Boolean; stdcall; public constructor Create(AOwner: TObject); virtual; destructor Destroy; override; function DragEnter(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; stdcall; function DragLeave: HResult; stdcall; function DragOver(KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; stdcall; function Drop(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; stdcall; procedure ForceDragLeave; stdcall; function GiveFeedback(Effect: LongWord): HResult; stdcall; function QueryContinueDrag(EscapePressed: BOOL; KeyState: LongWord): HResult; stdcall; end; //Ole helper functions function Succeeded(Status : HRESULT) : BOOLEAN; function Failed(Status : HRESULT) : BOOLEAN; //ActiveX functions that have wrong calling convention in fpc function RegisterDragDrop(hwnd:HWND; pDropTarget:IDropTarget):WINOLEAPI;stdcall; function RevokeDragDrop(hwnd:HWND):WINOLEAPI;stdcall; function DoDragDrop(pDataObj:IDataObject; pDropSource:IDropSource; dwOKEffects:DWORD; pdwEffect:LPDWORD):WINOLEAPI; function OleInitialize(pvReserved:LPVOID):WINOLEAPI;stdcall; procedure OleUninitialize;stdcall; procedure ReleaseStgMedium(_para1:LPSTGMEDIUM);stdcall; function OleSetClipboard(pDataObj:IDataObject):WINOLEAPI;stdcall; function OleGetClipboard(out ppDataObj:IDataObject):WINOLEAPI;stdcall; function OleFlushClipboard:WINOLEAPI;stdcall; function OleIsCurrentClipboard(pDataObj:IDataObject):WINOLEAPI;stdcall; function CreateStreamOnHGlobal(hGlobal:HGLOBAL; fDeleteOnRelease:BOOL;out stm:IStream):WINOLEAPI;stdcall; function CoCreateInstance(const _para1:TCLSID; _para2:IUnknown; _para3:DWORD;const _para4:TIID;out _para5):HRESULT;stdcall; //helper functions to isolate windows/OLE specific code function RenderOLEData(Tree: TObject; const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean): HResult; function GetStreamFromMedium(Medium:TStgMedium):TStream; procedure UnlockMediumData(Medium:TStgMedium); function GetTreeFromDataObject(const DataObject: IDataObject; var Format: TFormatEtc): TObject; function AllocateGlobal(Data: Pointer; DataSize:Cardinal): HGLOBAL; implementation uses VirtualTrees, Controls {$ifdef DEBUG_VTV}, vtlogger{$endif}; type TVirtualTreeAccess = class (TBaseVirtualTree) end; function Succeeded(Status : HRESULT) : BOOLEAN; begin Succeeded:=Status and HRESULT($80000000)=0; end; function Failed(Status : HRESULT) : BOOLEAN; begin Failed:=Status and HRESULT($80000000)<>0; end; function RegisterDragDrop(hwnd: HWND; pDropTarget: IDropTarget): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function RevokeDragDrop(hwnd: HWND): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function DoDragDrop(pDataObj: IDataObject; pDropSource: IDropSource; dwOKEffects: DWORD; pdwEffect: LPDWORD): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleInitialize(pvReserved: LPVOID): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; procedure OleUninitialize; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; procedure ReleaseStgMedium(_para1: LPSTGMEDIUM); begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleSetClipboard(pDataObj: IDataObject): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleGetClipboard(out ppDataObj: IDataObject): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleFlushClipboard: WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function OleIsCurrentClipboard(pDataObj: IDataObject): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function CreateStreamOnHGlobal(hGlobal: HGLOBAL; fDeleteOnRelease: BOOL; out stm: IStream): WINOLEAPI; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function CoCreateInstance(const _para1: TCLSID; _para2: IUnknown; _para3: DWORD; const _para4: TIID; out _para5): HRESULT; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} end; function RenderOLEData(Tree: TObject; const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean): HResult; { //--------------- local function -------------------------------------------- procedure WriteNodes(Stream: TStream); var Selection: TNodeArray; I: Integer; begin with TVirtualTreeAccess(Tree) do begin if ForClipboard then Selection := GetSortedCutCopySet(True) else Selection := GetSortedSelection(True); for I := 0 to High(Selection) do WriteNode(Stream, Selection[I]); end; end; //--------------- end local function ---------------------------------------- } var Data: PCardinal; ResPointer: Pointer; ResSize: Integer; OLEStream: IStream; VCLStream: TStream; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { VCLStream := nil; try Medium.PunkForRelease := nil; // Return data in one of the supported storage formats, prefer IStream. if FormatEtcIn.tymed and TYMED_ISTREAM <> 0 then begin // Create an IStream on a memory handle (here it is 0 which indicates to implicitely allocated a handle). // Do not use TStreamAdapter as it is not compatible with OLE (when flushing the clipboard OLE wants the HGlobal // back which is not supported by TStreamAdapater). CreateStreamOnHGlobal(0, True, OLEStream); VCLStream := TOLEStream.Create(OLEStream); WriteNodes(VCLStream); // Rewind stream. VCLStream.Position := 0; Medium.tymed := TYMED_ISTREAM; IUnknown(Medium.Pstm) := OLEStream; Result := S_OK; end else begin VCLStream := TMemoryStream.Create; WriteNodes(VCLStream); ResPointer := TMemoryStream(VCLStream).Memory; ResSize := VCLStream.Position; // Allocate memory to hold the string. if ResSize > 0 then begin Medium.hGlobal := GlobalAlloc(GHND or GMEM_SHARE, ResSize + SizeOf(Cardinal)); Data := GlobalLock(Medium.hGlobal); // Store the size of the data too, for easy retrival. Data^ := ResSize; Inc(Data); Move(ResPointer^, Data^, ResSize); GlobalUnlock(Medium.hGlobal); Medium.tymed := TYMED_HGLOBAL; Result := S_OK; end else Result := E_FAIL; end; finally // We can free the VCL stream here since it was either a pure memory stream or only a wrapper around // the OLEStream which exists independently. VCLStream.Free; end; } end; type // needed to handle OLE global memory objects TOLEMemoryStream = class(TCustomMemoryStream) public function Write(const Buffer; Count: Integer): Longint; override; end; //---------------------------------------------------------------------------------------------------------------------- function TOLEMemoryStream.Write(const Buffer; Count: Integer): Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} // raise EStreamError.CreateRes(PResStringRec(@SCantWriteResourceStreamError)); end; function GetStreamFromMedium(Medium: TStgMedium): TStream; var Data: Pointer; I: Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := nil; if Medium.tymed = TYMED_ISTREAM then Result := TOLEStream.Create(IUnknown(Medium.Pstm) as IStream) else begin Data := GlobalLock(Medium.hGlobal); if Assigned(Data) then begin // Get the total size of data to retrieve. I := PCardinal(Data)^; Inc(PCardinal(Data)); Result := TOLEMemoryStream.Create; TOLEMemoryStream(Result).SetPointer(Data, I); end; end; } end; procedure UnlockMediumData(Medium: TStgMedium); begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Medium.tymed = TYMED_HGLOBAL then GlobalUnlock(Medium.hGlobal); } end; function GetTreeFromDataObject(const DataObject: IDataObject; var Format: TFormatEtc): TObject; var Medium: TStgMedium; Data: PVTReference; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := nil; if Assigned(DataObject) then begin Format.cfFormat := CF_VTREFERENCE; if DataObject.GetData(Format, Medium) = S_OK then begin Data := GlobalLock(Medium.hGlobal); if Assigned(Data) then begin if Data.Process = GetCurrentProcessID then Result := Data.Tree; GlobalUnlock(Medium.hGlobal); end; ReleaseStgMedium(@Medium); end; end; } end; function AllocateGlobal(Data: Pointer; DataSize: Cardinal): HGLOBAL; var P:Pointer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := GlobalAlloc(GHND or GMEM_SHARE, DataSize); P := GlobalLock(Result); Move(Data^, P^, DataSize); GlobalUnlock(Result); } end; //---------------------------------------------------------------------------------------------------------------------- // OLE drag and drop support classes // This is quite heavy stuff (compared with the VCL implementation) but is much better suited to fit the needs // of DD'ing various kinds of virtual data and works also between applications. //----------------- TEnumFormatEtc ------------------------------------------------------------------------------------- constructor TEnumFormatEtc.Create(Tree: TObject; AFormatEtcArray: TFormatEtcArray); var I: Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { inherited Create; FTree := Tree; // Make a local copy of the format data. SetLength(FFormatEtcArray, Length(AFormatEtcArray)); for I := 0 to High(AFormatEtcArray) do FFormatEtcArray[I] := AFormatEtcArray[I]; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Clone(out Enum: IEnumFormatEtc): HResult; var AClone: TEnumFormatEtc; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := S_OK; try AClone := TEnumFormatEtc.Create(nil, FFormatEtcArray); AClone.FCurrentIndex := FCurrentIndex; Enum := AClone as IEnumFormatEtc; except Result := E_FAIL; end; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Next(celt: LongWord; out elt: FormatEtc; out pceltFetched: LongWord): HResult; var CopyCount: LongWord; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := S_FALSE; CopyCount := Length(FFormatEtcArray) - FCurrentIndex; if celt < CopyCount then CopyCount := celt; if CopyCount > 0 then begin Move(FFormatEtcArray[FCurrentIndex], elt, CopyCount * SizeOf(TFormatEtc)); Inc(FCurrentIndex, CopyCount); Result := S_OK; end; //todo_lcl_check Delphi treats pceltFetched an PInteger. Implemented like in fpc.activex. What heappens with // a C Program call with a NULL in pCeltFetcjed?? //Answer: Yes. Is necessary a check here if @pceltFetched <> nil then pceltFetched := CopyCount; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Reset: HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { FCurrentIndex := 0; Result := S_OK; } end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Skip(celt: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if FCurrentIndex + celt < High(FFormatEtcArray) then begin Inc(FCurrentIndex, celt); Result := S_Ok; end else Result := S_FALSE; } end; //----------------- TVTDataObject -------------------------------------------------------------------------------------- constructor TVTDataObject.Create(AOwner: TObject; ForClipboard: Boolean); begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { inherited Create; FOwner := AOwner; FForClipboard := ForClipboard; TVirtualTreeAccess(FOwner).GetNativeClipboardFormats(FFormatEtcArray); } end; //---------------------------------------------------------------------------------------------------------------------- destructor TVTDataObject.Destroy; var I: Integer; StgMedium: PStgMedium; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { // Cancel a pending clipboard operation if this data object was created for the clipboard and // is freed because something else is placed there. if FForClipboard and not (tsClipboardFlushing in TVirtualTreeAccess(FOwner).TreeStates) then TVirtualTreeAccess(FOwner).CancelCutOrCopy; // Release any internal clipboard formats for I := 0 to High(FormatEtcArray) do begin StgMedium := FindInternalStgMedium(FormatEtcArray[I].cfFormat); if Assigned(StgMedium) then ReleaseStgMedium(StgMedium); end; FormatEtcArray := nil; inherited; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.CanonicalIUnknown(TestUnknown: IUnknown): IUnknown; // Uses COM object identity: An explicit call to the IUnknown::QueryInterface method, requesting the IUnknown // interface, will always return the same pointer. begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(TestUnknown) then begin if TestUnknown.QueryInterface(IUnknown, Result) = 0 then Result._Release // Don't actually need it just need the pointer value else Result := TestUnknown end else Result := TestUnknown } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EqualFormatEtc(FormatEtc1, FormatEtc2: TFormatEtc): Boolean; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := (FormatEtc1.cfFormat = FormatEtc2.cfFormat) and (FormatEtc1.ptd = FormatEtc2.ptd) and (FormatEtc1.dwAspect = FormatEtc2.dwAspect) and (FormatEtc1.lindex = FormatEtc2.lindex) and (FormatEtc1.tymed and FormatEtc2.tymed <> 0); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.FindFormatEtc(TestFormatEtc: TFormatEtc; const FormatEtcArray: TFormatEtcArray): integer; var I: integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := -1; for I := 0 to High(FormatEtcArray) do begin if EqualFormatEtc(TestFormatEtc, FormatEtcArray[I]) then begin Result := I; Break; end end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.FindInternalStgMedium(Format: TClipFormat): PStgMedium; var I: integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := nil; for I := 0 to High(InternalStgMediumArray) do begin if Format = InternalStgMediumArray[I].Format then begin Result := @InternalStgMediumArray[I].Medium; Break; end end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.HGlobalClone(HGlobal: THandle): THandle; // Returns a global memory block that is a copy of the passed memory block. var Size: Cardinal; Data, NewData: PChar; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Size := GlobalSize(HGlobal); Result := GlobalAlloc(GPTR, Size); Data := GlobalLock(hGlobal); try NewData := GlobalLock(Result); try Move(Data^, NewData^, Size); finally GlobalUnLock(Result); end finally GlobalUnLock(hGlobal); end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.RenderInternalOLEData(const FormatEtcIn: TFormatEtc; var Medium: TStgMedium; var OLEResult: HResult): Boolean; // Tries to render one of the formats which have been stored via the SetData method. // Since this data is already there it is just copied or its reference count is increased (depending on storage medium). var InternalMedium: PStgMedium; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := True; InternalMedium := FindInternalStgMedium(FormatEtcIn.cfFormat); if Assigned(InternalMedium) then OLEResult := StgMediumIncRef(InternalMedium^, Medium, False, Self as IDataObject) else Result := False; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.StgMediumIncRef(const InStgMedium: TStgMedium; var OutStgMedium: TStgMedium; CopyInMedium: Boolean; DataObject: IDataObject): HRESULT; // InStgMedium is the data that is requested, OutStgMedium is the data that we are to return either a copy of or // increase the IDataObject's reference and send ourselves back as the data (unkForRelease). The InStgMedium is usually // the result of a call to find a particular FormatEtc that has been stored locally through a call to SetData. // If CopyInMedium is not true we already have a local copy of the data when the SetData function was called (during // that call the CopyInMedium must be true). Then as the caller asks for the data through GetData we do not have to make // copy of the data for the caller only to have them destroy it then need us to copy it again if necessary. // This way we increase the reference count to ourselves and pass the STGMEDIUM structure initially stored in SetData. // This way when the caller frees the structure it sees the unkForRelease is not nil and calls Release on the object // instead of destroying the actual data. var Len: Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := S_OK; // Simply copy all fields to start with. OutStgMedium := InStgMedium; // The data handled here always results from a call of SetData we got. This ensures only one storage format // is indicated and hence the case statement below is safe (IDataObject.GetData can optionally use several // storage formats). case InStgMedium.tymed of TYMED_HGLOBAL: begin if CopyInMedium then begin // Generate a unique copy of the data passed OutStgMedium.hGlobal := HGlobalClone(InStgMedium.hGlobal); if OutStgMedium.hGlobal = 0 then Result := E_OUTOFMEMORY end else // Don't generate a copy just use ourselves and the copy previously saved. OutStgMedium.PunkForRelease := Pointer(DataObject); // Does not increase RefCount. end; TYMED_FILE: begin //todo_lcl_check Len := Length(WideString(InStgMedium.lpszFileName)) + 1; // Don't forget the terminating null character. OutStgMedium.lpszFileName := CoTaskMemAlloc(2 * Len); Move(InStgMedium.lpszFileName^, OutStgMedium.lpszFileName^, 2 * Len); end; TYMED_ISTREAM: IUnknown(OutStgMedium.Pstm)._AddRef; TYMED_ISTORAGE: IUnknown(OutStgMedium.Pstg)._AddRef; TYMED_GDI: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy GDI objects right now. TYMED_MFPICT: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy MetaFile objects right now. TYMED_ENHMF: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy enhanced metafiles objects right now. else Result := DV_E_TYMED; end; if (Result = S_OK) and Assigned(OutStgMedium.PunkForRelease) then IUnknown(OutStgMedium.PunkForRelease)._AddRef; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.DAdvise(const FormatEtc: TFormatEtc; advf: DWord; const advSink: IAdviseSink; out dwConnection: DWord): HResult; // Advise sink management is greatly simplified by the IDataAdviseHolder interface. // We use this interface and forward all concerning calls to it. begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := S_OK; if FAdviseHolder = nil then Result := CreateDataAdviseHolder(FAdviseHolder); if Result = S_OK then Result := FAdviseHolder.Advise(Self as IDataObject, FormatEtc, advf, advSink, dwConnection); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.DUnadvise(dwConnection: DWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if FAdviseHolder = nil then Result := E_NOTIMPL else Result := FAdviseHolder.Unadvise(dwConnection); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EnumDAvise(Out enumAdvise : IEnumStatData):HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if FAdviseHolder = nil then Result := OLE_E_ADVISENOTSUPPORTED else Result := FAdviseHolder.EnumAdvise(enumAdvise); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EnumFormatEtc(Direction: DWord; out EnumFormatEtc: IEnumFormatEtc): HResult; var NewList: TEnumFormatEtc; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := E_FAIL; if Direction = DATADIR_GET then begin NewList := TEnumFormatEtc.Create(TVirtualTreeAccess(FOwner), FormatEtcArray); EnumFormatEtc := NewList as IEnumFormatEtc; Result := S_OK; end else EnumFormatEtc := nil; if EnumFormatEtc = nil then Result := OLE_S_USEREG; } end; //---------------------------------------------------------------------------------------------------------------------- Function TVTDataObject.GetCanonicalFormatTEtc(const pformatetcIn : FORMATETC;Out pformatetcOut : FORMATETC):HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := DATA_S_SAMEFORMATETC; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.GetData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium): HResult; // Data is requested by clipboard or drop target. This method dispatchs the call // depending on the data being requested. var I: Integer; Data: PVTReference; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} // The tree reference format is always supported and returned from here. { if FormatEtcIn.cfFormat = CF_VTREFERENCE then begin // Note: this format is not used while flushing the clipboard to avoid a dangling reference // when the owner tree is destroyed before the clipboard data is replaced with something else. if tsClipboardFlushing in TVirtualTreeAccess(FOwner).TreeStates then Result := E_FAIL else begin Medium.hGlobal := GlobalAlloc(GHND or GMEM_SHARE, SizeOf(TVTReference)); Data := GlobalLock(Medium.hGlobal); Data.Process := GetCurrentProcessID; Data.Tree := TBaseVirtualTree(FOwner); GlobalUnlock(Medium.hGlobal); Medium.tymed := TYMED_HGLOBAL; Medium.PunkForRelease := nil; Result := S_OK; end; end else begin try // See if we accept this type and if not get the correct return value. Result := QueryGetData(FormatEtcIn); if Result = S_OK then begin for I := 0 to High(FormatEtcArray) do begin if EqualFormatEtc(FormatEtcIn, FormatEtcArray[I]) then begin if not RenderInternalOLEData(FormatEtcIn, Medium, Result) then Result := TVirtualTreeAccess(FOwner).RenderOLEData(FormatEtcIn, Medium, FForClipboard); Break; end; end end except FillChar(Medium, SizeOf(Medium), #0); Result := E_FAIL; end; end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.GetDataHere(const FormatEtc: TFormatEtc; out Medium: TStgMedium): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := E_NOTIMPL; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.QueryGetData(const FormatEtc: TFormatEtc): HResult; var I: Integer; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { Result := DV_E_CLIPFORMAT; for I := 0 to High(FFormatEtcArray) do begin if FormatEtc.cfFormat = FFormatEtcArray[I].cfFormat then begin if (FormatEtc.tymed and FFormatEtcArray[I].tymed) <> 0 then begin if FormatEtc.dwAspect = FFormatEtcArray[I].dwAspect then begin if FormatEtc.lindex = FFormatEtcArray[I].lindex then begin Result := S_OK; Break; end else Result := DV_E_LINDEX; end else Result := DV_E_DVASPECT; end else Result := DV_E_TYMED; end; end } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.SetData(const FormatEtc: TFormatEtc;{$ifdef VER2_0}var{$else}const{$endif} Medium: TStgMedium; DoRelease: BOOL): HResult; // Allows dynamic adding to the IDataObject during its existance. Most noteably it is used to implement // IDropSourceHelper and allows to set a special format for optimized moves during a shell transfer. var Index: Integer; LocalStgMedium: PStgMedium; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { // See if we already have a format of that type available. Index := FindFormatEtc(FormatEtc, FormatEtcArray); if Index > - 1 then begin // Just use the TFormatEct in the array after releasing the data. LocalStgMedium := FindInternalStgMedium(FormatEtcArray[Index].cfFormat); if Assigned(LocalStgMedium) then begin ReleaseStgMedium(LocalStgMedium); FillChar(LocalStgMedium^, SizeOf(LocalStgMedium^), #0); end; end else begin // It is a new format so create a new TFormatCollectionItem, copy the // FormatEtc parameter into the new object and and put it in the list. SetLength(FFormatEtcArray, Length(FormatEtcArray) + 1); FormatEtcArray[High(FormatEtcArray)] := FormatEtc; // Create a new InternalStgMedium and initialize it and associate it with the format. SetLength(FInternalStgMediumArray, Length(InternalStgMediumArray) + 1); InternalStgMediumArray[High(InternalStgMediumArray)].Format := FormatEtc.cfFormat; LocalStgMedium := @InternalStgMediumArray[High(InternalStgMediumArray)].Medium; FillChar(LocalStgMedium^, SizeOf(LocalStgMedium^), #0); end; if DoRelease then begin // We are simply being given the data and we take control of it. LocalStgMedium^ := Medium; Result := S_OK end else begin // We need to reference count or copy the data and keep our own references to it. Result := StgMediumIncRef(Medium, LocalStgMedium^, True, Self as IDataObject); // Can get a circular reference if the client calls GetData then calls SetData with the same StgMedium. // Because the unkForRelease for the IDataObject can be marshalled it is necessary to get pointers that // can be correctly compared. See the IDragSourceHelper article by Raymond Chen at MSDN. if Assigned(LocalStgMedium.PunkForRelease) then begin if CanonicalIUnknown(Self) = CanonicalIUnknown(IUnknown(LocalStgMedium.PunkForRelease)) then IUnknown(LocalStgMedium.PunkForRelease) := nil; // release the interface end; end; // Tell all registered advice sinks about the data change. if Assigned(FAdviseHolder) then FAdviseHolder.SendOnDataChange(Self as IDataObject, 0, 0); } end; //----------------- TVTDragManager ------------------------------------------------------------------------------------- constructor TVTDragManager.Create(AOwner: TObject); begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { inherited Create; FOwner := AOwner; // Create an instance of the drop target helper interface. This will fail but not harm on systems which do // not support this interface (everything below Windows 2000); CoCreateInstance(CLSID_DragDropHelper, nil, CLSCTX_INPROC_SERVER, IID_IDropTargetHelper, FDropTargetHelper); } end; //---------------------------------------------------------------------------------------------------------------------- destructor TVTDragManager.Destroy; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { // Set the owner's reference to us to nil otherwise it will access an invalid pointer // after our desctruction is complete. TVirtualTreeAccess(FOwner).FreeDragManager; inherited; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDataObject: IDataObject; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { // When the owner tree starts a drag operation then it gets a data object here to pass it to the OLE subsystem. // In this case there is no local reference to a data object and one is created (but not stored). // If there is a local reference then the owner tree is currently the drop target and the stored interface is // that of the drag initiator. if Assigned(FDataObject) then Result := FDataObject else begin Result := TVirtualTreeAccess(FOwner).DoCreateDataObject; if Result = nil then Result := TVTDataObject.Create(FOwner, False) as IDataObject; end; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDragSource: TObject; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := FDragSource; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDropTargetHelperSupported: Boolean; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := Assigned(FDropTargetHelper); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetIsDropTarget: Boolean; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := FIsDropTarget; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragEnter(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { FDataObject := DataObject; FIsDropTarget := True; SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, @FFullDragging, 0); // If full dragging of window contents is disabled in the system then our tree windows will be locked // and cannot be updated during a drag operation. With the following call painting is again enabled. if not FFullDragging then LockWindowUpdate(0); if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragEnter(TBaseVirtualTree(FOwner).Handle, DataObject, Pt, Effect); FDragSource := TVirtualTreeAccess(FOwner).GetTreeFromDataObject(DataObject); Result := TVirtualTreeAccess(FOwner).DragEnter(KeyState, Pt, Effect); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragLeave: HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragLeave; TVirtualTreeAccess(FOwner).DragLeave; FIsDropTarget := False; FDragSource := nil; FDataObject := nil; Result := NOERROR; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragOver(KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragOver(Pt, Effect); Result := TVirtualTreeAccess(FOwner).DragOver(FDragSource, KeyState, dsDragMove, Pt, Effect); } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.Drop(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.Drop(DataObject, Pt, Effect); Result := TVirtualTreeAccess(FOwner).DragDrop(DataObject, KeyState, Pt, Effect); FIsDropTarget := False; FDataObject := nil; } end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTDragManager.ForceDragLeave; // Some drop targets, e.g. Internet Explorer leave a drag image on screen instead removing it when they receive // a drop action. This method calls the drop target helper's DragLeave method to ensure it removes the drag image from // screen. Unfortunately, sometimes not even this does help (e.g. when dragging text from VT to a text field in IE). begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragLeave; } end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GiveFeedback(Effect: LongWord): HResult; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} //Result := DRAGDROP_S_USEDEFAULTCURSORS; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.QueryContinueDrag(EscapePressed: BOOL; KeyState: LongWord): HResult; var RButton, LButton: Boolean; begin {$ifdef DEBUG_VTV}Logger.SendError([lcOle],'Ole function called in Linux');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcOle],'Stack');{$endif} { LButton := (KeyState and MK_LBUTTON) <> 0; RButton := (KeyState and MK_RBUTTON) <> 0; // Drag'n drop canceled by pressing both mouse buttons or Esc? if (LButton and RButton) or EscapePressed then Result := DRAGDROP_S_CANCEL else // Drag'n drop finished? if not (LButton or RButton) then Result := DRAGDROP_S_DROP else Result := S_OK; } end; end. doublecmd-0.5.8/components/virtualtreeview/units/win32/0000755000175000017500000000000012257501472022245 5ustar alexxalexxdoublecmd-0.5.8/components/virtualtreeview/units/win32/virtualpanningwindow.pas0000644000175000017500000000521212140233030027222 0ustar alexxalexxunit virtualpanningwindow; {Adapted from VirtualTrees by Luiz Amrico to work in LCL/Lazarus} {$mode objfpc}{$H+} interface uses Windows, Graphics, Classes, SysUtils; type { TVirtualPanningWindow } TVirtualPanningWindow = class private FHandle: THandle; FImage: TBitmap; procedure HandlePaintMessage; public procedure Start(OwnerHandle: THandle; const Position: TPoint); procedure Stop; procedure Show(ClipRegion: HRGN); property Image: TBitmap read FImage; property Handle: THandle read FHandle; end; implementation {$ifdef DEBUG_VTV} uses vtlogger; {$endif} function PanningWindowProc(Window: HWnd; Msg: UInt;WPara: WParam; LPara: LParam): LResult; stdcall; var PanningObject: TVirtualPanningWindow; begin if Msg = WM_PAINT then begin PanningObject:=TVirtualPanningWindow(GetWindowLongPtrW(Window,GWL_USERDATA)); if Assigned(PanningObject) then PanningObject.HandlePaintMessage; Result := 0; end else Result := DefWindowProc(Window,Msg,WPara,LPara); end; var PanningWindowClass: TWndClass = ( style: 0; lpfnWndProc: @PanningWindowProc; cbClsExtra: 0; cbWndExtra: 0; hInstance: 0; hIcon: 0; hCursor: 0; hbrBackground: 0; lpszMenuName: nil; lpszClassName: 'VTPanningWindow' ); { TVirtualPanningWindow } procedure TVirtualPanningWindow.HandlePaintMessage; var PS: PaintStruct; begin BeginPaint(FHandle, PS); BitBlt(PS.hdc,0,0,FImage.Width,FImage.Height,FImage.Canvas.Handle,0,0,SRCCOPY); EndPaint(FHandle, PS); end; procedure TVirtualPanningWindow.Start(OwnerHandle: THandle; const Position: TPoint); var TempClass: TWndClass; begin // Register the helper window class. if not GetClassInfo(HInstance, PanningWindowClass.lpszClassName, TempClass) then begin PanningWindowClass.hInstance := HInstance; Windows.RegisterClass(PanningWindowClass); end; // Create the helper window and show it at the given position without activating it. with Position do FHandle := CreateWindowEx(WS_EX_TOOLWINDOW, PanningWindowClass.lpszClassName, nil, WS_POPUP, X - 16, Y - 16, 32, 32, OwnerHandle, 0, HInstance, nil); SetWindowLongPtr(FHandle,GWL_USERDATA,LONG_PTR(Self)); FImage := TBitmap.Create; end; procedure TVirtualPanningWindow.Stop; begin // Destroy the helper window. DestroyWindow(FHandle); FImage.Free; FImage := nil; end; procedure TVirtualPanningWindow.Show(ClipRegion: HRGN); begin {$ifdef DEBUG_VTV}Logger.SendBitmap([lcPanning],'Panning Image',FImage);{$endif} //todo: move SetWindowRgn to DelphiCompat SetWindowRgn(FHandle, ClipRegion, False); ShowWindow(FHandle, SW_SHOWNOACTIVATE); end; end. doublecmd-0.5.8/components/virtualtreeview/units/win32/virtualdragmanager.pas0000644000175000017500000011656712014201074026633 0ustar alexxalexxunit virtualdragmanager; {$mode delphi} interface uses Windows, ActiveX, Classes, SysUtils; const // Drag image helpers for Windows 2000 and up. IID_IDropTargetHelper: TGUID = (D1: $4657278B; D2: $411B; D3: $11D2; D4: ($83, $9A, $00, $C0, $4F, $D9, $18, $D0)); IID_IDragSourceHelper: TGUID = (D1: $DE5BF786; D2: $477A; D3: $11D2; D4: ($83, $9D, $00, $C0, $4F, $D9, $18, $D0)); IID_IDropTarget: TGUID = (D1: $00000122; D2: $0000; D3: $0000; D4: ($C0, $00, $00, $00, $00, $00, $00, $46)); CLSID_DragDropHelper: TGUID = (D1: $4657278A; D2: $411B; D3: $11D2; D4: ($83, $9A, $00, $C0, $4F, $D9, $18, $D0)); SID_IDropTargetHelper = '{4657278B-411B-11D2-839A-00C04FD918D0}'; SID_IDragSourceHelper = '{DE5BF786-477A-11D2-839D-00C04FD918D0}'; SID_IDropTarget = '{00000122-0000-0000-C000-000000000046}'; //Bridge to ActiveX constants TYMED_HGLOBAL = ActiveX.TYMED_HGLOBAL; TYMED_ISTREAM = ActiveX.TYMED_ISTREAM; DVASPECT_CONTENT = ActiveX.DVASPECT_CONTENT; CLSCTX_INPROC_SERVER = ActiveX.CLSCTX_INPROC_SERVER; DROPEFFECT_COPY = ActiveX.DROPEFFECT_COPY; DROPEFFECT_LINK = ActiveX.DROPEFFECT_LINK; DROPEFFECT_MOVE = ActiveX.DROPEFFECT_MOVE; DROPEFFECT_NONE = ActiveX.DROPEFFECT_NONE; DROPEFFECT_SCROLL = ActiveX.DROPEFFECT_SCROLL; DATADIR_GET = ActiveX.DATADIR_GET; type //Bridge to ActiveX Types IDataObject = ActiveX.IDataObject; IDropTarget = ActiveX.IDropTarget; IDropSource = ActiveX.IDropSource; IEnumFormatEtc = ActiveX.IEnumFORMATETC; //WINOLEAPI = ActiveX.WINOLEAPI; TFormatEtc = ActiveX.TFORMATETC; TStgMedium = ActiveX.TStgMedium; PDVTargetDevice = ActiveX.PDVTARGETDEVICE; // OLE drag'n drop support TFormatEtcArray = array of TFormatEtc; TFormatArray = array of Word; // IDataObject.SetData support TInternalStgMedium = packed record Format: TClipFormat; Medium: TStgMedium; end; TInternalStgMediumArray = array of TInternalStgMedium; TEnumFormatEtc = class(TInterfacedObject, IEnumFormatEtc) private FTree: TObject; FFormatEtcArray: TFormatEtcArray; FCurrentIndex: Integer; public constructor Create(Tree: TObject; AFormatEtcArray: TFormatEtcArray); function Clone(out Enum: IEnumFormatEtc): HResult; stdcall; function Next(celt: LongWord; out elt: FormatEtc; out pceltFetched: LongWord): HResult; stdcall; function Reset: HResult; stdcall; function Skip(celt: LongWord): HResult; stdcall; end; IDropTargetHelper = interface(IUnknown) [SID_IDropTargetHelper] function DragEnter(hwndTarget: HWND; pDataObject: IDataObject; var ppt: TPoint; dwEffect: LongWord): HRESULT; stdcall; function DragLeave: HRESULT; stdcall; function DragOver(var ppt: TPoint; dwEffect: LongWord): HRESULT; stdcall; function Drop(pDataObject: IDataObject; var ppt: TPoint; dwEffect: LongWord): HRESULT; stdcall; function Show(fShow: Boolean): HRESULT; stdcall; end; PSHDragImage = ^TSHDragImage; TSHDragImage = packed record sizeDragImage: TSize; ptOffset: TPoint; hbmpDragImage: HBITMAP; ColorRef: TColorRef; end; IDragSourceHelper = interface(IUnknown) [SID_IDragSourceHelper] function InitializeFromBitmap(var SHDragImage: TSHDragImage; pDataObject: IDataObject): HRESULT; stdcall; function InitializeFromWindow(Window: HWND; var ppt: TPoint; pDataObject: IDataObject): HRESULT; stdcall; end; IVTDragManager = interface(IUnknown) ['{C4B25559-14DA-446B-8901-0C879000EB16}'] procedure ForceDragLeave; stdcall; function GetDataObject: IDataObject; stdcall; function GetDragSource: TObject; stdcall; function GetDropTargetHelperSupported: Boolean; stdcall; function GetIsDropTarget: Boolean; stdcall; property DataObject: IDataObject read GetDataObject; property DragSource: TObject read GetDragSource; property DropTargetHelperSupported: Boolean read GetDropTargetHelperSupported; property IsDropTarget: Boolean read GetIsDropTarget; end; // This data object is used in two different places. One is for clipboard operations and the other while dragging. TVTDataObject = class(TInterfacedObject, IDataObject) private //FOwner: TBaseVirtualTree; // The tree which provides clipboard or drag data. FOwner: TObject; // The tree which provides clipboard or drag data. FForClipboard: Boolean; // Determines which data to render with GetData. FFormatEtcArray: TFormatEtcArray; FInternalStgMediumArray: TInternalStgMediumArray; // The available formats in the DataObject FAdviseHolder: IDataAdviseHolder; // Reference to an OLE supplied implementation for advising. protected function CanonicalIUnknown(TestUnknown: IUnknown): IUnknown; function EqualFormatEtc(FormatEtc1, FormatEtc2: TFormatEtc): Boolean; function FindFormatEtc(TestFormatEtc: TFormatEtc; const FormatEtcArray: TFormatEtcArray): integer; function FindInternalStgMedium(Format: TClipFormat): PStgMedium; function HGlobalClone(HGlobal: THandle): THandle; function RenderInternalOLEData(const FormatEtcIn: TFormatEtc; var Medium: TStgMedium; var OLEResult: HResult): Boolean; function StgMediumIncRef(const InStgMedium: TStgMedium; var OutStgMedium: TStgMedium; CopyInMedium: Boolean; DataObject: IDataObject): HRESULT; property ForClipboard: Boolean read FForClipboard; property FormatEtcArray: TFormatEtcArray read FFormatEtcArray write FFormatEtcArray; property InternalStgMediumArray: TInternalStgMediumArray read FInternalStgMediumArray write FInternalStgMediumArray; property Owner: TObject read FOwner; public constructor Create(AOwner: TObject; ForClipboard: Boolean); virtual; destructor Destroy; override; function DAdvise(const FormatEtc: TFormatEtc; advf: DWord; const advSink: IAdviseSink; out dwConnection: DWord): HResult; virtual; stdcall; function DUnadvise(dwConnection: DWord): HResult; virtual; stdcall; Function EnumDAvise(Out enumAdvise : IEnumStatData):HResult;virtual;StdCall; function EnumFormatEtc(Direction: DWord; out EnumFormatEtc: IEnumFormatEtc): HResult; virtual; stdcall; Function GetCanonicalFormatTEtc(const pformatetcIn : FORMATETC;Out pformatetcOut : FORMATETC):HResult; virtual; STDCALl; function GetData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium): HResult; virtual; stdcall; function GetDataHere(const FormatEtc: TFormatEtc; out Medium: TStgMedium): HResult; virtual; stdcall; function QueryGetData(const FormatEtc: TFormatEtc): HResult; virtual; stdcall; function SetData(const FormatEtc: TFormatEtc; {$ifdef VER2_0}var{$else}const{$endif} Medium: TStgMedium; DoRelease: BOOL): HResult; virtual; stdcall; end; // TVTDragManager is a class to manage drag and drop in a Virtual Treeview. TVTDragManager = class(TInterfacedObject, IVTDragManager, IDropSource, IDropTarget) private FOwner, // The tree which is responsible for drag management. FDragSource: TObject; // Reference to the source tree if the source was a VT, might be different than // the owner tree. FIsDropTarget: Boolean; // True if the owner is currently the drop target. FDataObject: IDataObject; // A reference to the data object passed in by DragEnter (only used when the owner // tree is the current drop target). FDropTargetHelper: IDropTargetHelper; // Win2k > Drag image support FFullDragging: BOOL; // True, if full dragging is currently enabled in the system. function GetDataObject: IDataObject; stdcall; function GetDragSource: TObject; stdcall; function GetDropTargetHelperSupported: Boolean; stdcall; function GetIsDropTarget: Boolean; stdcall; public constructor Create(AOwner: TComponent); virtual; destructor Destroy; override; function DragEnter(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; stdcall; function DragLeave: HResult; stdcall; function DragOver(KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; stdcall; function Drop(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; stdcall; procedure ForceDragLeave; stdcall; function GiveFeedback(Effect: LongWord): HResult; stdcall; function QueryContinueDrag(EscapePressed: BOOL; KeyState: LongWord): HResult; stdcall; end; //Ole helper functions function Succeeded(Status : HRESULT) : BOOLEAN; function Failed(Status : HRESULT) : BOOLEAN; //ActiveX functions that have wrong calling convention in fpc function RegisterDragDrop(hwnd:HWND; pDropTarget:IDropTarget):WINOLEAPI;stdcall;external 'ole32.dll' name 'RegisterDragDrop'; function RevokeDragDrop(hwnd:HWND):WINOLEAPI;stdcall;external 'ole32.dll' name 'RevokeDragDrop'; function DoDragDrop(pDataObj:IDataObject; pDropSource:IDropSource; dwOKEffects:DWORD; pdwEffect:LPDWORD):WINOLEAPI;stdcall;external 'ole32.dll' name 'DoDragDrop'; function OleInitialize(pvReserved:LPVOID):WINOLEAPI;stdcall;external 'ole32.dll' name 'OleInitialize'; procedure OleUninitialize;stdcall;external 'ole32.dll' name 'OleUninitialize'; procedure ReleaseStgMedium(_para1:LPSTGMEDIUM);stdcall;external 'ole32.dll' name 'ReleaseStgMedium'; function OleSetClipboard(pDataObj:IDataObject):WINOLEAPI;stdcall;external 'ole32.dll' name 'OleSetClipboard'; function OleGetClipboard(out ppDataObj:IDataObject):WINOLEAPI;stdcall;external 'ole32.dll' name 'OleGetClipboard'; function OleFlushClipboard:WINOLEAPI;stdcall;external 'ole32.dll' name 'OleFlushClipboard'; function OleIsCurrentClipboard(pDataObj:IDataObject):WINOLEAPI;stdcall;external 'ole32.dll' name 'OleIsCurrentClipboard'; function CreateStreamOnHGlobal(hGlobal:HGLOBAL; fDeleteOnRelease:BOOL;out stm:IStream):WINOLEAPI;stdcall;external 'ole32.dll' name 'CreateStreamOnHGlobal'; function CoCreateInstance(const _para1:TCLSID; _para2:IUnknown; _para3:DWORD;const _para4:TIID;out _para5):HRESULT;stdcall; external 'ole32.dll' name 'CoCreateInstance'; //helper functions to isolate windows/OLE specific code function RenderOLEData(Tree: TObject; const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean): HResult; function GetStreamFromMedium(Medium:TStgMedium):TStream; procedure UnlockMediumData(Medium:TStgMedium); function GetTreeFromDataObject(const DataObject: IDataObject; var Format: TFormatEtc): TObject; function AllocateGlobal(Data: Pointer; DataSize:Cardinal): HGLOBAL; implementation uses VirtualTrees, Controls, oleutils; type TVirtualTreeAccess = class (TBaseVirtualTree) end; function Succeeded(Status : HRESULT) : BOOLEAN; begin Succeeded:=Status and HRESULT($80000000)=0; end; function Failed(Status : HRESULT) : BOOLEAN; begin Failed:=Status and HRESULT($80000000)<>0; end; function RenderOLEData(Tree: TObject; const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean): HResult; //--------------- local function -------------------------------------------- procedure WriteNodes(Stream: TStream); var Selection: TNodeArray; I: Integer; begin with TVirtualTreeAccess(Tree) do begin if ForClipboard then Selection := GetSortedCutCopySet(True) else Selection := GetSortedSelection(True); for I := 0 to High(Selection) do WriteNode(Stream, Selection[I]); end; end; //--------------- end local function ---------------------------------------- var Data: PCardinal; ResPointer: Pointer; ResSize: Integer; OLEStream: IStream; VCLStream: TStream; begin VCLStream := nil; try Medium.PunkForRelease := nil; // Return data in one of the supported storage formats, prefer IStream. if FormatEtcIn.tymed and TYMED_ISTREAM <> 0 then begin // Create an IStream on a memory handle (here it is 0 which indicates to implicitely allocated a handle). // Do not use TStreamAdapter as it is not compatible with OLE (when flushing the clipboard OLE wants the HGlobal // back which is not supported by TStreamAdapater). CreateStreamOnHGlobal(0, True, OLEStream); VCLStream := TOLEStream.Create(OLEStream); WriteNodes(VCLStream); // Rewind stream. VCLStream.Position := 0; Medium.tymed := TYMED_ISTREAM; IUnknown(Medium.Pstm) := OLEStream; Result := S_OK; end else begin VCLStream := TMemoryStream.Create; WriteNodes(VCLStream); ResPointer := TMemoryStream(VCLStream).Memory; ResSize := VCLStream.Position; // Allocate memory to hold the string. if ResSize > 0 then begin Medium.hGlobal := GlobalAlloc(GHND or GMEM_SHARE, ResSize + SizeOf(Cardinal)); Data := GlobalLock(Medium.hGlobal); // Store the size of the data too, for easy retrival. Data^ := ResSize; Inc(Data); Move(ResPointer^, Data^, ResSize); GlobalUnlock(Medium.hGlobal); Medium.tymed := TYMED_HGLOBAL; Result := S_OK; end else Result := E_FAIL; end; finally // We can free the VCL stream here since it was either a pure memory stream or only a wrapper around // the OLEStream which exists independently. VCLStream.Free; end; end; type // needed to handle OLE global memory objects TOLEMemoryStream = class(TCustomMemoryStream) public function Write(const Buffer; Count: Integer): Longint; override; end; //---------------------------------------------------------------------------------------------------------------------- function TOLEMemoryStream.Write(const Buffer; Count: Integer): Integer; begin {$ifdef COMPILER_5_UP} raise EStreamError.CreateRes(PResStringRec(@SCantWriteResourceStreamError)); {$else} raise EStreamError.Create(SCantWriteResourceStreamError); {$endif COMPILER_5_UP} end; function GetStreamFromMedium(Medium: TStgMedium): TStream; var Data: Pointer; I: Integer; begin Result := nil; if Medium.tymed = TYMED_ISTREAM then Result := TOLEStream.Create(IUnknown(Medium.Pstm) as IStream) else begin Data := GlobalLock(Medium.hGlobal); if Assigned(Data) then begin // Get the total size of data to retrieve. I := PCardinal(Data)^; Inc(PCardinal(Data)); Result := TOLEMemoryStream.Create; TOLEMemoryStream(Result).SetPointer(Data, I); end; end; end; procedure UnlockMediumData(Medium: TStgMedium); begin if Medium.tymed = TYMED_HGLOBAL then GlobalUnlock(Medium.hGlobal); end; function GetTreeFromDataObject(const DataObject: IDataObject; var Format: TFormatEtc): TObject; var Medium: TStgMedium; Data: PVTReference; begin Result := nil; if Assigned(DataObject) then begin Format.cfFormat := CF_VTREFERENCE; if DataObject.GetData(Format, Medium) = S_OK then begin Data := GlobalLock(Medium.hGlobal); if Assigned(Data) then begin if Data.Process = GetCurrentProcessID then Result := Data.Tree; GlobalUnlock(Medium.hGlobal); end; ReleaseStgMedium(@Medium); end; end; end; function AllocateGlobal(Data: Pointer; DataSize: Cardinal): HGLOBAL; var P:Pointer; begin Result := GlobalAlloc(GHND or GMEM_SHARE, DataSize); P := GlobalLock(Result); Move(Data^, P^, DataSize); GlobalUnlock(Result); end; //---------------------------------------------------------------------------------------------------------------------- // OLE drag and drop support classes // This is quite heavy stuff (compared with the VCL implementation) but is much better suited to fit the needs // of DD'ing various kinds of virtual data and works also between applications. //----------------- TEnumFormatEtc ------------------------------------------------------------------------------------- constructor TEnumFormatEtc.Create(Tree: TObject; AFormatEtcArray: TFormatEtcArray); var I: Integer; begin inherited Create; FTree := Tree; // Make a local copy of the format data. SetLength(FFormatEtcArray, Length(AFormatEtcArray)); for I := 0 to High(AFormatEtcArray) do FFormatEtcArray[I] := AFormatEtcArray[I]; end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Clone(out Enum: IEnumFormatEtc): HResult; var AClone: TEnumFormatEtc; begin Result := S_OK; try AClone := TEnumFormatEtc.Create(nil, FFormatEtcArray); AClone.FCurrentIndex := FCurrentIndex; Enum := AClone as IEnumFormatEtc; except Result := E_FAIL; end; end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Next(celt: LongWord; out elt: FormatEtc; out pceltFetched: LongWord): HResult; var CopyCount: LongWord; begin Result := S_FALSE; CopyCount := Length(FFormatEtcArray) - FCurrentIndex; if celt < CopyCount then CopyCount := celt; if CopyCount > 0 then begin Move(FFormatEtcArray[FCurrentIndex], elt, CopyCount * SizeOf(TFormatEtc)); Inc(FCurrentIndex, CopyCount); Result := S_OK; end; //todo_lcl_check Delphi treats pceltFetched an PInteger. Implemented like in fpc.activex. What heappens with // a C Program call with a NULL in pCeltFetcjed?? //Answer: Yes. Is necessary a check here if @pceltFetched <> nil then pceltFetched := CopyCount; end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Reset: HResult; begin FCurrentIndex := 0; Result := S_OK; end; //---------------------------------------------------------------------------------------------------------------------- function TEnumFormatEtc.Skip(celt: LongWord): HResult; begin if FCurrentIndex + celt < High(FFormatEtcArray) then begin Inc(FCurrentIndex, celt); Result := S_Ok; end else Result := S_FALSE; end; //----------------- TVTDataObject -------------------------------------------------------------------------------------- constructor TVTDataObject.Create(AOwner: TObject; ForClipboard: Boolean); begin inherited Create; FOwner := AOwner; FForClipboard := ForClipboard; TVirtualTreeAccess(FOwner).GetNativeClipboardFormats(FFormatEtcArray); end; //---------------------------------------------------------------------------------------------------------------------- destructor TVTDataObject.Destroy; var I: Integer; StgMedium: PStgMedium; begin // Cancel a pending clipboard operation if this data object was created for the clipboard and // is freed because something else is placed there. if FForClipboard and not (tsClipboardFlushing in TVirtualTreeAccess(FOwner).TreeStates) then TVirtualTreeAccess(FOwner).CancelCutOrCopy; // Release any internal clipboard formats for I := 0 to High(FormatEtcArray) do begin StgMedium := FindInternalStgMedium(FormatEtcArray[I].cfFormat); if Assigned(StgMedium) then ReleaseStgMedium(StgMedium); end; FormatEtcArray := nil; inherited; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.CanonicalIUnknown(TestUnknown: IUnknown): IUnknown; // Uses COM object identity: An explicit call to the IUnknown::QueryInterface method, requesting the IUnknown // interface, will always return the same pointer. begin if Assigned(TestUnknown) then begin if TestUnknown.QueryInterface(IUnknown, Result) = 0 then Result._Release // Don't actually need it just need the pointer value else Result := TestUnknown end else Result := TestUnknown end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EqualFormatEtc(FormatEtc1, FormatEtc2: TFormatEtc): Boolean; begin Result := (FormatEtc1.cfFormat = FormatEtc2.cfFormat) and (FormatEtc1.ptd = FormatEtc2.ptd) and (FormatEtc1.dwAspect = FormatEtc2.dwAspect) and (FormatEtc1.lindex = FormatEtc2.lindex) and (FormatEtc1.tymed and FormatEtc2.tymed <> 0); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.FindFormatEtc(TestFormatEtc: TFormatEtc; const FormatEtcArray: TFormatEtcArray): integer; var I: integer; begin Result := -1; for I := 0 to High(FormatEtcArray) do begin if EqualFormatEtc(TestFormatEtc, FormatEtcArray[I]) then begin Result := I; Break; end end; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.FindInternalStgMedium(Format: TClipFormat): PStgMedium; var I: integer; begin Result := nil; for I := 0 to High(InternalStgMediumArray) do begin if Format = InternalStgMediumArray[I].Format then begin Result := @InternalStgMediumArray[I].Medium; Break; end end; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.HGlobalClone(HGlobal: THandle): THandle; // Returns a global memory block that is a copy of the passed memory block. var Size: Cardinal; Data, NewData: PChar; begin Size := GlobalSize(HGlobal); Result := GlobalAlloc(GPTR, Size); Data := GlobalLock(hGlobal); try NewData := GlobalLock(Result); try Move(Data^, NewData^, Size); finally GlobalUnLock(Result); end finally GlobalUnLock(hGlobal); end; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.RenderInternalOLEData(const FormatEtcIn: TFormatEtc; var Medium: TStgMedium; var OLEResult: HResult): Boolean; // Tries to render one of the formats which have been stored via the SetData method. // Since this data is already there it is just copied or its reference count is increased (depending on storage medium). var InternalMedium: PStgMedium; begin Result := True; InternalMedium := FindInternalStgMedium(FormatEtcIn.cfFormat); if Assigned(InternalMedium) then OLEResult := StgMediumIncRef(InternalMedium^, Medium, False, Self as IDataObject) else Result := False; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.StgMediumIncRef(const InStgMedium: TStgMedium; var OutStgMedium: TStgMedium; CopyInMedium: Boolean; DataObject: IDataObject): HRESULT; // InStgMedium is the data that is requested, OutStgMedium is the data that we are to return either a copy of or // increase the IDataObject's reference and send ourselves back as the data (unkForRelease). The InStgMedium is usually // the result of a call to find a particular FormatEtc that has been stored locally through a call to SetData. // If CopyInMedium is not true we already have a local copy of the data when the SetData function was called (during // that call the CopyInMedium must be true). Then as the caller asks for the data through GetData we do not have to make // copy of the data for the caller only to have them destroy it then need us to copy it again if necessary. // This way we increase the reference count to ourselves and pass the STGMEDIUM structure initially stored in SetData. // This way when the caller frees the structure it sees the unkForRelease is not nil and calls Release on the object // instead of destroying the actual data. var Len: Integer; begin Result := S_OK; // Simply copy all fields to start with. OutStgMedium := InStgMedium; // The data handled here always results from a call of SetData we got. This ensures only one storage format // is indicated and hence the case statement below is safe (IDataObject.GetData can optionally use several // storage formats). case InStgMedium.tymed of TYMED_HGLOBAL: begin if CopyInMedium then begin // Generate a unique copy of the data passed OutStgMedium.hGlobal := HGlobalClone(InStgMedium.hGlobal); if OutStgMedium.hGlobal = 0 then Result := E_OUTOFMEMORY end else // Don't generate a copy just use ourselves and the copy previously saved. OutStgMedium.PunkForRelease := Pointer(DataObject); // Does not increase RefCount. end; TYMED_FILE: begin //todo_lcl_check Len := Length(WideString(InStgMedium.lpszFileName)) + 1; // Don't forget the terminating null character. OutStgMedium.lpszFileName := CoTaskMemAlloc(2 * Len); Move(InStgMedium.lpszFileName^, OutStgMedium.lpszFileName^, 2 * Len); end; TYMED_ISTREAM: IUnknown(OutStgMedium.Pstm)._AddRef; TYMED_ISTORAGE: IUnknown(OutStgMedium.Pstg)._AddRef; TYMED_GDI: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy GDI objects right now. TYMED_MFPICT: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy MetaFile objects right now. TYMED_ENHMF: if not CopyInMedium then // Don't generate a copy just use ourselves and the previously saved data. OutStgMedium.PunkForRelease := Pointer(DataObject) // Does not increase RefCount. else Result := DV_E_TYMED; // Don't know how to copy enhanced metafiles objects right now. else Result := DV_E_TYMED; end; if (Result = S_OK) and Assigned(OutStgMedium.PunkForRelease) then IUnknown(OutStgMedium.PunkForRelease)._AddRef; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.DAdvise(const FormatEtc: TFormatEtc; advf: DWord; const advSink: IAdviseSink; out dwConnection: DWord): HResult; // Advise sink management is greatly simplified by the IDataAdviseHolder interface. // We use this interface and forward all concerning calls to it. begin Result := S_OK; if FAdviseHolder = nil then Result := CreateDataAdviseHolder(FAdviseHolder); if Result = S_OK then Result := FAdviseHolder.Advise(Self as IDataObject, FormatEtc, advf, advSink, dwConnection); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.DUnadvise(dwConnection: DWord): HResult; begin if FAdviseHolder = nil then Result := E_NOTIMPL else Result := FAdviseHolder.Unadvise(dwConnection); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EnumDAvise(Out enumAdvise : IEnumStatData):HResult; begin if FAdviseHolder = nil then Result := OLE_E_ADVISENOTSUPPORTED else Result := FAdviseHolder.EnumAdvise(enumAdvise); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.EnumFormatEtc(Direction: DWord; out EnumFormatEtc: IEnumFormatEtc): HResult; var NewList: TEnumFormatEtc; begin Result := E_FAIL; if Direction = DATADIR_GET then begin NewList := TEnumFormatEtc.Create(TVirtualTreeAccess(FOwner), FormatEtcArray); EnumFormatEtc := NewList as IEnumFormatEtc; Result := S_OK; end else EnumFormatEtc := nil; if EnumFormatEtc = nil then Result := OLE_S_USEREG; end; //---------------------------------------------------------------------------------------------------------------------- Function TVTDataObject.GetCanonicalFormatTEtc(const pformatetcIn : FORMATETC;Out pformatetcOut : FORMATETC):HResult; begin Result := DATA_S_SAMEFORMATETC; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.GetData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium): HResult; // Data is requested by clipboard or drop target. This method dispatchs the call // depending on the data being requested. var I: Integer; Data: PVTReference; begin // The tree reference format is always supported and returned from here. if FormatEtcIn.cfFormat = CF_VTREFERENCE then begin // Note: this format is not used while flushing the clipboard to avoid a dangling reference // when the owner tree is destroyed before the clipboard data is replaced with something else. if tsClipboardFlushing in TVirtualTreeAccess(FOwner).TreeStates then Result := E_FAIL else begin Medium.hGlobal := GlobalAlloc(GHND or GMEM_SHARE, SizeOf(TVTReference)); Data := GlobalLock(Medium.hGlobal); Data.Process := GetCurrentProcessID; Data.Tree := TBaseVirtualTree(FOwner); GlobalUnlock(Medium.hGlobal); Medium.tymed := TYMED_HGLOBAL; Medium.PunkForRelease := nil; Result := S_OK; end; end else begin try // See if we accept this type and if not get the correct return value. Result := QueryGetData(FormatEtcIn); if Result = S_OK then begin for I := 0 to High(FormatEtcArray) do begin if EqualFormatEtc(FormatEtcIn, FormatEtcArray[I]) then begin if not RenderInternalOLEData(FormatEtcIn, Medium, Result) then Result := TVirtualTreeAccess(FOwner).RenderOLEData(FormatEtcIn, Medium, FForClipboard); Break; end; end end except FillChar(Medium, SizeOf(Medium), #0); Result := E_FAIL; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.GetDataHere(const FormatEtc: TFormatEtc; out Medium: TStgMedium): HResult; begin Result := E_NOTIMPL; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.QueryGetData(const FormatEtc: TFormatEtc): HResult; var I: Integer; begin Result := DV_E_CLIPFORMAT; for I := 0 to High(FFormatEtcArray) do begin if FormatEtc.cfFormat = FFormatEtcArray[I].cfFormat then begin if (FormatEtc.tymed and FFormatEtcArray[I].tymed) <> 0 then begin if FormatEtc.dwAspect = FFormatEtcArray[I].dwAspect then begin if FormatEtc.lindex = FFormatEtcArray[I].lindex then begin Result := S_OK; Break; end else Result := DV_E_LINDEX; end else Result := DV_E_DVASPECT; end else Result := DV_E_TYMED; end; end end; //---------------------------------------------------------------------------------------------------------------------- function TVTDataObject.SetData(const FormatEtc: TFormatEtc;{$ifdef VER2_0}var{$else}const{$endif} Medium: TStgMedium; DoRelease: BOOL): HResult; // Allows dynamic adding to the IDataObject during its existance. Most noteably it is used to implement // IDropSourceHelper and allows to set a special format for optimized moves during a shell transfer. var Index: Integer; LocalStgMedium: PStgMedium; begin // See if we already have a format of that type available. Index := FindFormatEtc(FormatEtc, FormatEtcArray); if Index > - 1 then begin // Just use the TFormatEct in the array after releasing the data. LocalStgMedium := FindInternalStgMedium(FormatEtcArray[Index].cfFormat); if Assigned(LocalStgMedium) then begin ReleaseStgMedium(LocalStgMedium); FillChar(LocalStgMedium^, SizeOf(LocalStgMedium^), #0); end; end else begin // It is a new format so create a new TFormatCollectionItem, copy the // FormatEtc parameter into the new object and and put it in the list. SetLength(FFormatEtcArray, Length(FormatEtcArray) + 1); FormatEtcArray[High(FormatEtcArray)] := FormatEtc; // Create a new InternalStgMedium and initialize it and associate it with the format. SetLength(FInternalStgMediumArray, Length(InternalStgMediumArray) + 1); InternalStgMediumArray[High(InternalStgMediumArray)].Format := FormatEtc.cfFormat; LocalStgMedium := @InternalStgMediumArray[High(InternalStgMediumArray)].Medium; FillChar(LocalStgMedium^, SizeOf(LocalStgMedium^), #0); end; if DoRelease then begin // We are simply being given the data and we take control of it. LocalStgMedium^ := Medium; Result := S_OK end else begin // We need to reference count or copy the data and keep our own references to it. Result := StgMediumIncRef(Medium, LocalStgMedium^, True, Self as IDataObject); // Can get a circular reference if the client calls GetData then calls SetData with the same StgMedium. // Because the unkForRelease for the IDataObject can be marshalled it is necessary to get pointers that // can be correctly compared. See the IDragSourceHelper article by Raymond Chen at MSDN. if Assigned(LocalStgMedium.PunkForRelease) then begin if CanonicalIUnknown(Self) = CanonicalIUnknown(IUnknown(LocalStgMedium.PunkForRelease)) then IUnknown(LocalStgMedium.PunkForRelease) := nil; // release the interface end; end; // Tell all registered advice sinks about the data change. if Assigned(FAdviseHolder) then FAdviseHolder.SendOnDataChange(Self as IDataObject, 0, 0); end; //----------------- TVTDragManager ------------------------------------------------------------------------------------- constructor TVTDragManager.Create(AOwner: TComponent); begin inherited Create; FOwner := AOwner; // Create an instance of the drop target helper interface. This will fail but not harm on systems which do // not support this interface (everything below Windows 2000); CoCreateInstance(CLSID_DragDropHelper, nil, CLSCTX_INPROC_SERVER, IID_IDropTargetHelper, FDropTargetHelper); end; //---------------------------------------------------------------------------------------------------------------------- destructor TVTDragManager.Destroy; begin // Set the owner's reference to us to nil otherwise it will access an invalid pointer // after our desctruction is complete. TVirtualTreeAccess(FOwner).FreeDragManager; inherited; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDataObject: IDataObject; begin // When the owner tree starts a drag operation then it gets a data object here to pass it to the OLE subsystem. // In this case there is no local reference to a data object and one is created (but not stored). // If there is a local reference then the owner tree is currently the drop target and the stored interface is // that of the drag initiator. if Assigned(FDataObject) then Result := FDataObject else begin Result := TVirtualTreeAccess(FOwner).DoCreateDataObject; if Result = nil then Result := TVTDataObject.Create(FOwner, False) as IDataObject; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDragSource: TObject; begin Result := FDragSource; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetDropTargetHelperSupported: Boolean; begin Result := Assigned(FDropTargetHelper); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GetIsDropTarget: Boolean; begin Result := FIsDropTarget; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragEnter(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin FDataObject := DataObject; FIsDropTarget := True; SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, @FFullDragging, 0); // If full dragging of window contents is disabled in the system then our tree windows will be locked // and cannot be updated during a drag operation. With the following call painting is again enabled. if not FFullDragging then LockWindowUpdate(0); if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragEnter(TBaseVirtualTree(FOwner).Handle, DataObject, Pt, Effect); FDragSource := TVirtualTreeAccess(FOwner).GetTreeFromDataObject(DataObject); Result := TVirtualTreeAccess(FOwner).DragEnter(KeyState, Pt, Effect); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragLeave: HResult; begin if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragLeave; TVirtualTreeAccess(FOwner).DragLeave; FIsDropTarget := False; FDragSource := nil; FDataObject := nil; Result := NOERROR; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.DragOver(KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragOver(Pt, Effect); Result := TVirtualTreeAccess(FOwner).DragOver(FDragSource, KeyState, dsDragMove, Pt, Effect); end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.Drop(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; begin if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.Drop(DataObject, Pt, Effect); Result := TVirtualTreeAccess(FOwner).DragDrop(DataObject, KeyState, Pt, Effect); FIsDropTarget := False; FDataObject := nil; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTDragManager.ForceDragLeave; // Some drop targets, e.g. Internet Explorer leave a drag image on screen instead removing it when they receive // a drop action. This method calls the drop target helper's DragLeave method to ensure it removes the drag image from // screen. Unfortunately, sometimes not even this does help (e.g. when dragging text from VT to a text field in IE). begin if Assigned(FDropTargetHelper) and FFullDragging then FDropTargetHelper.DragLeave; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.GiveFeedback(Effect: LongWord): HResult; begin Result := DRAGDROP_S_USEDEFAULTCURSORS; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragManager.QueryContinueDrag(EscapePressed: BOOL; KeyState: LongWord): HResult; var RButton, LButton: Boolean; begin LButton := (KeyState and MK_LBUTTON) <> 0; RButton := (KeyState and MK_RBUTTON) <> 0; // Drag'n drop canceled by pressing both mouse buttons or Esc? if (LButton and RButton) or EscapePressed then Result := DRAGDROP_S_CANCEL else // Drag'n drop finished? if not (LButton or RButton) then Result := DRAGDROP_S_DROP else Result := S_OK; end; end. doublecmd-0.5.8/components/virtualtreeview/VirtualTrees.pas0000644000175000017500000445764312140233030023305 0ustar alexxalexxunit VirtualTrees; {$mode delphi}{$H+} {$packset 1} // Version 4.8.7 // // The contents of this file are subject to the Mozilla Public License // Version 1.1 (the "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ // // Alternatively, you may redistribute this library, use and/or modify it under the terms of the // GNU Lesser General Public License as published by the Free Software Foundation; // either version 2.1 of the License, or (at your option) any later version. // You may obtain a copy of the LGPL at http://www.gnu.org/copyleft/. // // Software distributed under the License is distributed on an "AS IS" basis, // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the // specific language governing rights and limitations under the License. // // The original code is VirtualTrees.pas, released September 30, 2000. // // The initial developer of the original code is digital publishing AG (Munich, Germany, www.digitalpublishing.de), // written by Mike Lischke (public@soft-gems.net, www.soft-gems.net). // // Portions created by digital publishing AG are Copyright // (C) 1999-2001 digital publishing AG. All Rights Reserved. //---------------------------------------------------------------------------------------------------------------------- // // April 2010 // - Bug fix: Removed active column changing from TBaseVirtualTree.WMKeyDown to re-gain standard conforming // behaviour for VK_NEXT and VK_PRIOR // - Bug fix: Paint option toUseExplorerTheme works properly without defining columns // - Bug fix: TBaseVirtualTree.PrepareBitmaps now correctly closes the theme handle // January 2010 // - Bug fix: TBaseVirtualTree.AdjustTotalHeight now longer calculates wrong total heights if nodes have been // made invisible // - Bug fix: TCustomVirtualStringTree.OnMeasureTextWidth now works as intended // - Bug fix: Added missing $IFDEFs concerning theming support // - Bug fix: Removed default from properties TVirtualTreeColumn.Color and TVirtualTreeColumn.BiDiMode // July 2009 // - Bug fix: TWorkerThread will no longer reference the tree after it has been destroyed (Mantis issue #384) // - Bug fix: TBaseVirtualTree.InternalConnectNode checked the expanded state of the wrong node if Mode was // amAddChildFirst or amAddChildLast // June 2009 // - Bug fix: fixed some issues concerning the vista theme handling // - Improvement: removed hidden node handling in this branch // - Improvement: reverted header click handling to old version to keep compatibility in this branch // - Improvement: removed TVTPaintOption toHideTreeLinesIfThemed // May 2009 // - Improvement: new TVTMiscOption toEditOnClick, toEditOnDblClick to control if editing can be started with a single // click or a double click // - Bug fix: the internal pointers of TBufferedAnsiString are now PAnsiChar to work correctly with Delphi 2009 // April 2009 // - Bug fix: TBaseVirtualTree.GetVisibleParent no longer returns the given node in case it is fully visible // - Improvement: fixed a potential issue in TVirtualTreeColumns.TotalWidth in case it is called before // FPositionToIndex is initialized // - Bug fix: TBaseVirtualTree.CollectSelectedNodesLTR and TBaseVirtualTree.CollectSelectedNodesRTL handle straight // vertical selection rectangles no longer as empty // - Bug fix: TCheckImageKind.ckSystemDefault now works as intended // - Improvement: made the following methods of TBaseVirtualTree virtual: PrepareCell, AddChild, BeginUpdate, // EndUpdate and SortTree // - Improvement: made TBaseVirtualTree.PrepareCell protected // - Improvement: moved some members of TVTEdit and TStringEditLink from private to protected // - Improvement: re-designed header click handling // - Improvement: new TVTPaintOption toShowHiddenNodes to globally ignore the hidden state of nodes // - Improvement: individual nodes can now be hidden without affecting their children // - Improvement: re-designed Explorer theme drawing // - Bug fix: corrected allocation problems in TBufferedAnsiString and TWideBufferedString // March 2009 // - Bug fix: fixed an issue in TVirtualTreeColumns.HandleClick that could lead to a case where no header click event // is triggered // - Bug fix: fixed an issue in TBaseVirtualTree.HandleHotTrack that could lead to an endless loop under certain // conditions // - Improvement: removed unused variables in TVirtualTreeColumn.ComputeHeaderLayout // - Bug fix: corrected TBaseVirtualTree.GetVisibleParent // - Improvement: extended hot node tracking to track the hot column too // - Improvement: new THitPosition hiOnItemButtonExact used to draw hot buttons when using Windows Vista's Explorer // theme // - Improvement: new TVTPaintOption toHideTreeLinesIfThemed to consider toShowTreeLines only if running unthemed // - Improvement: new TVTPaintOption toUseExplorerTheme to draw the tree like Windows Vista's Explorer treeview // February 2009 // - Bug fix: reverted the implementation of DrawTextW back to the one prior to 4.8.1 as the line end detection // lead to a compiler warning under Delphi 2009 // - Bug fix: corrected implementation of GetStringDrawRect to match its declaration (UnicodeString vs WideString) // - Bug fix: the node focus will no longer change if a TVTMiscOption.toGridExtensions is set and one clicks right of // (or left of, if right-to-left reading) the last column // - Bug fix: fixed an issue with TVTHeader.Assign that could lead to an access violation if the header is created at // runtime // - Bug fix: one can no longer change a node's height with the right mouse button even if toNodeHeightResize and // toRightClickSelect are set // - Improvement: TVTAutoOption.toDisableAutoScrollOnFocus now works for nodes too // - Improvement: new property TBaseVirtualTree.SelectionLocked to disable changing the selection // - Improvement: made the dual-scroll effect in TBaseVirtualTree.ToggleNode much smoother // - Bug fix: removed off-by-1 errors in TBaseVirtualTree.ToggleNode // - Bug fix: added a check for FUpdateCount to TBaseVirtualTree.SetUpdateState as otherwise every call to // TBaseVirtualTree.DoBeforeCellPaint to get the cell content margin within an Begin/EndUpdate-block would // re-enable painting // - Bug fix: TVTHeader.HandleMessage could provide a wrong column index to OnBeforeColumnWidthTracking in some cases // - Improvement: new properties TBaseVirtualTree.OnBeforeAutoFitColumn, TBaseVirtualTree.OnAfterAutoFitColumn // - Improvement: new procedures TBaseVirtualTree.CancelOperation, TBaseVirtualTree.BeginOperation, // TBaseVirtualTree.EndOperation and new property TBaseVirtualTree.OperationCanceled to enable the // application to stop (possibly) long-running operations // - Improvement: integrated changes from Andreas Hausladen // - Improvement: integrated changes from Dmitry Zegebart where applicable // - Bug fix: removed off-by-1 error in TBaseVirtualTree.GetDisplayRect // - Bug fix: changed the size of the buffer used in TBaseVirtualTree.PaintTree to paint the area below the last node // as the bitmap was not completely erased using previous size under certain conditions // - Bug fix: fixed TBaseVirtualTree.GetPreviousLevel // January 2009 // - Bug fix: removed off-by-1 error in TBaseVirtualTree.GetBottomNode // - Improvement: improved speed of TBaseVirtualTree.GetMaxColumnWidth when using UseSmartColumnWidth // - Version is now 4.8.0 // December 2008 // - Bug fix: modified TBaseVirtualTree.UpdateHorizontalScrollbar and TBaseVirtualTree.UpdateVerticalScrollbar to // recalculate the tree's dimensions even if an update is in progress // - Improvement: renamed TVTHeaderState hsTracking and hsTrackPending to hsColumnWidthTracking and // hsColumnWidthTrackPending // - Improvement: modified TBaseVirtualTree.GetFirstVisible and TBaseVirtualTree.GetFirstVisibleNoInit to optionally // take a node to specify where to start // - Improvement: modified TVTAfterGetMaxColumnWidthEvent to make the result of TBaseVirtualTree.GetMaxColumnWidth // changable // - Bug fix: corrected TBaseVirtualTree.GetMaxColumnWidth to consider toFixedIndent and no longer take nodes into // account that are just above or below the visible area // - Improvement: new property TVirtualTreeColumns.DefaultWidth // - Improvement: new property TVTHeader.FixedAreaConstraints (new class TVTFixedAreaConstraints) to limit the // fixed area (header, fixed columns) to a percentage of the client area // November 2008 // - Improvement: new cursor added: crVertSplit used for height tracking // - Improvement: changed type of TVTHeader.Height from Cardinal to Integer to make boundary checks easier // - Improvement: new properties TVTHeader.MinHeight and TVTHeader.MaxHeight // - Improvement: new VirtualTreeStates tsNodeHeightTracking and tsNodeHeightTrackPending // - Improvement: new HeaderStates hsHeightTracking and hsHeightTrackPending // - Improvement: new TVTMiscOption toNodeHeightResize to allow changing node heights via mouse // - Improvement: new TVTHeaderOption hoHeightResize to allow changing header height via mouse // - Improvement: new properties TBaseVirtualTree.OnHeaderHeightTracking, TBaseVirtualTree.OnHeaderDblClickResize, // TBaseVirtualTree.OnColumnWidthTracking, TBaseVirtualTree.OnColumnWidthDblClickResize, // TBaseVirtualTree.OnNodeHeightTracking, TBaseVirtualTree.OnNodeHeightDblClickResize // - Improvement: new function TVTHeader.ResizeColumns to resize multiple columns at once // - Improvement: TVTHeader.DetermineSplitterIndex is no longer influenced by non-resizable columns // - Bug fix: TBaseVirtualTree.ToggleNode now uses DoStateChange to modify FStates // - Bug fix: TBaseVirtualTree.DoBeforeCellPaint now saves the update rect if CellPaintMode is cpmGetContentMargin // and restores it afterwards // - Improvement: modified TBaseVirtualTree.CmMouseWheel to handle mice with wheel delta < 120 correctly // - Improvement: modified TVTHeader.LoadFromStream and WriteToStream to save ParentFont // - Improvement: TVTHeader.Font is now only stored by Delphi if ParentFont is False (Mantis issue #217) // - Bug fix: corrected TVTHeader.Create to set TVTHeader.FOptions correctly to the default value (Mantis issue #333) // - Improvement: new TVTAnimationOption toAdvancedAnimatedToggle to scroll the node to be toggled animatedly instead // of just scroll its child nodes animatedly // - Improvement: added VirtualTreeState tsToggling to eliminate artefacts caused by TBaseVirtualTree.DoSetOffsetXY // while toggling // - Bug fix: corrected button handling when toFixedIndent is set // - Improvement: redesigned TBaseVirtualTree.ToggleNode to harmonize the visual toggle behaviour independent of // toChildrenAbove // - Improvement: made TBaseVirtualTree.CanEdit public // - Improvement: added parameter ConsiderChildrenAbove to TGetNextNodeProc // - Improvement: modified all variants of TBaseVirtualTree.GetFirst and TBaseVirtualTree.GetLast to optionally // consider toChildrenAbove // October 2008 // - Bugfix: removed 'FVisibleCount := 0' from TBaseVirtualTree.Clear as this would lead to incorrect VisibleCount in // read-only mode // - Bugfix: fixed a condition in TBaseVirtualTree.ToggleCallback that could lead to artefacts // - Improvement: changed the implementation of TBaseVirtualTree.GetNext/GetPrevious so that no penalties occur if // toChildrenAbove is not set // - Improvement: TBaseVirtualTree.ToggleNode will no longer leave nodes with state vsToggeling if an exception // occurs // - Improvement: improved behaviour of TBaseVirtualTree.ToggleNode in case toChildrenAbove is set // - Bug fix: corrected TBaseVirtualTree.ScrollIntoView to behave as expected when no fixed columns exist // - Bug fix: extended TBaseVirtualTree.InitializeLineImageAndSelectLevel to eliminate artifacts while scrolling with // toChildrenAbove set // - Bug fix: corrected CompareNodePositions to consider toChildrenAbove // - Bug fix: corrected ToggleNode to scroll correctly if toChildrenAbove and toAnimatedToggle are set // - Improvement: new TVTPaintOption toFixedIndent to draw the tree with a fixed ident (instead of node level // dependent indents) // - Improvement: new TVTPaintOption toChildrenAbove to draw children nodes above their parent // August 2008 // - Improvement: redesigned and overloaded TBaseVirtualTree.ScrollIntoView in order to use vertical scrolling // separately // - Improvement: optimized TBaseVirtualTree.ScrollIntoView for horizontal scrolling // - Improvement: in TBaseVirtualTree.WMKeyDown column navigation for VK_PRIOR and VK_NEXT is now handled in same way // as row navigation // - Improvement: new TVTHeaderOption hoDisableAnimatedResize to disable animated resize for all columns // - Improvement: new TVTColumnOption coDisableAnimatedResize to disable animated resize for a specific column // - Improvement: in TBaseVirtualTree.UpdateHorizontalScrollBar and TBaseVirtualTree.UpdateVerticalScrollBar scrollbar // updates now avoided for tsUpdating in FStates // July 2008 // - Improvement: in TBaseVirtualTree.WMHScroll the horizontal page scrolling now considers fixed columns // - Improvement: in TBaseVirtualTree.ScrollIntoView the case of FFocusedColumn being invalid is considered // - Improvement: in TBaseVirtualTree.HandleMouseDown DoFocusNode is not called if node focus did not change // - Improvement: in TBaseVirtualTree.SetFocusedColumn the focused node will only be invalidate if it was actually // scrolled into view // - Improvement: new TVTColumnOption coAllowFocus to affect column focus behaviour // - Improvement: new function TVTHeader.AllowFocus to check wether a column can be focused // - Improvement: in TBaseVirtualTree.SetFocusedColumn the old colunm and the new column are both invalidated // - Improvement: merged latest changes from Jim into current code base. // June 2008 // - Improvement: new property TVirtualTreeColumns.Count // - Bug fix: in TVirtualTreeColumns.AnimatedResize the column is validated (to avoid "List index out of bounds") // - Improvement: the content retangle of the cell can be modified via the OnBeforeCellPaint event, the cell paint // mode indicates wether OnBeforeCellPaint is called for painting the cell or just for getting the // cell content margin // - Improvement: new functions added: TBaseVirtualTree.DoGetCellContentMargins, // TCustomVirtualDrawTree.DoGetCellContentMargin // - Improvement: new property: TCustomVirtualDrawTree.OnGetCellContentMargin // - Improvement: in TBaseVirtualTree.GetMaxColumnWidth the cell content margin is considered // - Improvement: in TBaseVirtualTree.CMHintShow the cell content margin is considered for singleline tooltips // - Improvement: new function added: TVTHeader.DoGetPopupMenu (to query the application via TreeView.FOnGetPopupMenu // for a column specific header popup menu) // - Improvement: new property added: TBaseVirtualTree.OnCanSplitterResizeColumn, // new function added: TVirtualTreeColumns.GetScrollWidth // - Improvement: horizontal page scrolling now uses the average column width (of all visible, non-fixed columns) as // scroll amount // - Improvement: procedure TBaseVirtualTree.CMMouseWheel redesigned // - Bug fix: TVTHeader.DetermineSplitterIndex works correctly even when using fixed columns // - Bug fix: on right-to-left BiDiMode TVirtualTreeColumns.PaintHeader respects (left) scroll bar correctly // - Bug fix: for multiline tooltips also the column width is checked to determine the tooltip is needed or // unnecessary // - Improvement: the result value of GetUseSmartColumnWidth is initialized correctly // - Improvement: added hoFullRepaintOnResize to TVTHeaderOption to enable full header repainting (instead of // repainting all subsequent columns only) on resizing a column // - Bug fix: horizontal page scrolling via mouse wheel now works correctly, i.e. in TBaseVirtualTree.CMMouseWheel // ScrollCount includes GetVisibleFixedWidth and FIndent // - Improvement: new TVTColumnOption coSmartResize to avoid contradicting the virtual paradigm // - Improvement: horizontal scrolling via mouse wheel can be forced by holding the shift key // - Improvement: new parameter for function TBaseVirtualTree.GetMaxColumnWidth added: UseSmartColumnWidth (to // avoid contradicting the virtual paradigm, i.e. leave nodes out of consideration which are not in // view) // - Improvement: new parameters for TVTHeader.AutoFitColumns added: SmartAutoFitType, RangeStartCol and // RangeEndCol // - Improvement: new parameters for events FOUnknownnAfterAutoFitColumns, FOnBeforeAutoFitColumns, FOnAfterGetMaxColumnWidth // and FOnBeforeGetMaxColumnWidth added // - Version is now 4.6.0 // May 2008 // - Improvement: new properties: FOnAfterAutoFitColumns, FOnBeforeAutoFitColumns, FOnAfterGetMaxColumnWidth and // FOnBeforeGetMaxColumnWidth // - Bug fix: FDropTargetNode is considered in TBaseVirtualTree.DoFreeNode // August 2007 // - for accessibility, added an OnGetImageText event that can be used to give accessible text to images used in nodes. // - Implemented an ImageText property used by the VTAccessibility unit to retrieve text for a given node and its column. // - Switched loading of accessibility libraries to dynamic from static to avoid problems in Win95 // June 2007 // - Bug fix: Fixed a problem with potentially large amount of nodes (larger than 2 billion) in // TBaseVirtualTree.SetChildCount. // - Bug fix: remove hint if any in case the tree loses the focus. // - Improvement: TVirtualTreeColumns.HandleClick is now virtual, introduced TVTHeader.DoSetSortColumn. // - Bug fix: compiler error due to old variable reference when enabling flat scrollbars. // May 2007 // - Improvement: new functions: GetPreviousSelected, GetPreviousChecked, GetCheckedCount, // GetPreviousCutCopy, GetCutCopyCount, GetFirstLeaf, GetNextLeaf, // GetPreviousLeaf, GetFirstLevel, GetNextLevel, GetPreviousLevel // - Improvement: new properties: CheckedCount, CutCopyCount // - Improvement: DoFocusChanging for finding a valid column (TBaseVirtualTree.WMKeyDown) // March 2007 // - Improvement: adjusted accessibility implementation to compile with pre-BDS IDEs. // - If a column is not visible, MultiColumnAccessibility now will not include it. // January 2007 // - Improvement: added code donation from Marco Zehe (with help from Sebastian Modersohn) which implements the // MS accessibility interface for Virtual Treeview. // December 2006 // - Improvement: bidi mode implementation finished (toAutoBidiColumnOrdering introduced) // - Change: right-to-left flag removed from shorten string methods/events (not necessary) // - Version is now 4.5.0 // November 2006 // - Bug fix: Total height is wrong on reading from stream // September 2006 // - Bug fix: Mantis issue #326 // July 2006 // - Change: value for crHeaderSplit cursor conflicts with other resource IDs, so I changed it. // - Published OnStartDrag in VirtualDrawTree. // April 2006 // - Bug fix: check for MMX availabiltiy is missing in some places before calling MMX code // - Bug fix: flag for VCL dragging was removed too late causing all kind of problems with mouse up code in VCL drag mode. // - Bug fix: If the past mode in ProcessOLEData is amInsertAfter then nodes where inserted in the wrong order. // March 2006 // - Bug fix: total count and total height is wrong after loading from stream // - Bug fix: variable node height computation // - Bug fix: FLastChangedNode was not reset in DoFreeNode // February 2006 // - Improvement: GetFirstChecked now also has a default value for its state parameter. // - Improvement: avoid potential reentrancy problems in paint code by checking for the paint state there. // January 2006 // - Bug fix: disabled images are now drawn like enabled ones (with respect to position, indices etc.). // - Improvement: New property BottomSpace, allows to specify an additional area below the last node in the tree. // - Bug fix: VT.EndUpdate did not invalidate the cache so the cache was never used again after that. // - Improvement: tree states for double clicks (left, middle, right). // December 2005 // - Bug fix: check for column index for auto setting main column if the current one is deleted. // // For full document history see help file. // // Credits for their valuable assistance and code donations go to: // Freddy Ertl, Marian Aldenh?vel, Thomas Bogenrieder, Jim Kuenemann, Werner Lehmann, Jens Treichler, // Paul Gallagher (IBO tree), Ondrej Kelle, Ronaldo Melo Ferraz, Heri Bender, Roland Bed?rftig (BCB) // Anthony Mills, Alexander Egorushkin (BCB), Mathias Torell (BCB), Frank van den Bergh, Vadim Sedulin, Peter Evans, // Milan Vandrovec (BCB), Steve Moss, Joe White, David Clark, Anders Thomsen, Igor Afanasyev, Eugene Programmer, // Corbin Dunn, Richard Pringle, Uli Gerhardt, Azza, Igor Savkic, Daniel Bauten, Timo Tegtmeier, Dmitry Zegebart, // Andreas Hausladen // Beta testers: // Freddy Ertl, Hans-J?rgen Schnorrenberg, Werner Lehmann, Jim Kueneman, Vadim Sedulin, Moritz Franckenstein, // Wim van der Vegt, Franc v/d Westelaken // Indirect contribution (via publicly accessible work of those persons): // Alex Denissov, Hiroyuki Hori (MMXAsm expert) // Documentation: // Markus Spoettl and toolsfactory GbR (http://www.doc-o-matic.com/, sponsoring Soft Gems development // with a free copy of the Doc-O-Matic help authoring system), Sven H. (Step by step tutorial) // CLX: // Dmitri Dmitrienko (initial developer) // Source repository: // Subversion (server), TortoiseSVN (client tools), Fisheye (Web interface) // Accessability implementation: // Marco Zehe (with help from Sebastian Modersohn) // LCL Port: // Luiz Am?rico Pereira C?mara //---------------------------------------------------------------------------------------------------------------------- interface {$I VTConfig.inc} uses {$ifdef Windows} Windows, ActiveX, CommCtrl, {$else} FakeActiveX, {$endif} OleUtils, LCLIntf, {$ifdef USE_DELPHICOMPAT} DelphiCompat, LclExt, {$endif} virtualpanningwindow, VTGraphics, //alpha blend functions {$ifdef DEBUG_VTV} vtlogger, {$endif} LCLType, LResources, LMessages, Types, SysUtils, Classes, Graphics, Controls, Forms, ImgList, StdCtrls, Menus, Printers, SyncObjs, // Thread support Clipbrd // Clipboard support {$ifdef ThemeSupport} , Themes , TmSchema {$endif ThemeSupport} {$ifdef EnableAccessible} , oleacc // for MSAA IAccessible support {$endif}; const {$I lclconstants.inc} {$if defined(LCLGtk) or defined(LCLGtk2)} {$define Gtk} {$endif} {$if defined(Gtk)} {$define ManualClipNeeded} {$endif} {$if defined(LCLGtk2) or defined(LCLCarbon) or defined(LCLQt)} {$define ContextMenuBeforeMouseUp} {$endif} VTMajorVersion = 4; VTMinorVersion = 8; VTReleaseVersion = 7; VTTreeStreamVersion = 2; VTHeaderStreamVersion = 6; // The header needs an own stream version to indicate changes only relevant to the header. CacheThreshold = 2000; // Number of nodes a tree must at least have to start caching and at the same // time the maximum number of nodes between two cache entries. FadeAnimationStepCount = 255; // Number of animation steps for hint fading (0..255). ShadowSize = 5; // Size in pixels of the hint shadow. This value has no influence on Win2K and XP systems // as those OSes have native shadow support. // Special identifiers for columns. NoColumn = -1; InvalidColumn = -2; // Indices for check state images used for checking. ckEmpty = 0; // an empty image used as place holder // radio buttons ckRadioUncheckedNormal = 1; ckRadioUncheckedHot = 2; ckRadioUncheckedPressed = 3; ckRadioUncheckedDisabled = 4; ckRadioCheckedNormal = 5; ckRadioCheckedHot = 6; ckRadioCheckedPressed = 7; ckRadioCheckedDisabled = 8; // check boxes ckCheckUncheckedNormal = 9; ckCheckUncheckedHot = 10; ckCheckUncheckedPressed = 11; ckCheckUncheckedDisabled = 12; ckCheckCheckedNormal = 13; ckCheckCheckedHot = 14; ckCheckCheckedPressed = 15; ckCheckCheckedDisabled = 16; ckCheckMixedNormal = 17; ckCheckMixedHot = 18; ckCheckMixedPressed = 19; ckCheckMixedDisabled = 20; // simple button ckButtonNormal = 21; ckButtonHot = 22; ckButtonPressed = 23; ckButtonDisabled = 24; // Instead using a TTimer class for each of the various events I use Windows timers with messages // as this is more economical. ExpandTimer = 1; EditTimer = 2; ScrollTimer = 4; ChangeTimer = 5; StructureChangeTimer = 6; SearchTimer = 7; // Need to use this message to release the edit link interface asynchronously. WM_CHANGESTATE = WM_APP + 32; // Virtual Treeview does not need to be subclassed by an eventual Theme Manager instance as it handles // Windows XP theme painting itself. Hence the special message is used to prevent subclassing. CM_DENYSUBCLASSING = CM_BASE + 2000; // Decoupling message for auto-adjusting the internal edit window. CM_AUTOADJUST = CM_BASE + 2005; // VT's own clipboard formats, // Note: The reference format is used internally to allow to link to a tree reference // to implement optimized moves and other back references. CFSTR_VIRTUALTREE = 'Virtual Tree Data'; CFSTR_VTREFERENCE = 'Virtual Tree Reference'; CFSTR_HTML = 'HTML Format'; CFSTR_RTF = 'Rich Text Format'; CFSTR_RTFNOOBJS = 'Rich Text Format Without Objects'; CFSTR_CSV = 'CSV'; // Drag image helpers for Windows 2000 and up. IID_IDropTargetHelper: TGUID = (D1: $4657278B; D2: $411B; D3: $11D2; D4: ($83, $9A, $00, $C0, $4F, $D9, $18, $D0)); IID_IDragSourceHelper: TGUID = (D1: $DE5BF786; D2: $477A; D3: $11D2; D4: ($83, $9D, $00, $C0, $4F, $D9, $18, $D0)); IID_IDropTarget: TGUID = (D1: $00000122; D2: $0000; D3: $0000; D4: ($C0, $00, $00, $00, $00, $00, $00, $46)); CLSID_DragDropHelper: TGUID = (D1: $4657278A; D2: $411B; D3: $11D2; D4: ($83, $9A, $00, $C0, $4F, $D9, $18, $D0)); SID_IDropTargetHelper = '{4657278B-411B-11D2-839A-00C04FD918D0}'; SID_IDragSourceHelper = '{DE5BF786-477A-11D2-839D-00C04FD918D0}'; SID_IDropTarget = '{00000122-0000-0000-C000-000000000046}'; // Help identifiers for exceptions. Application developers are responsible to link them with actual help topics. hcTFEditLinkIsNil = 2000; hcTFWrongMoveError = 2001; hcTFWrongStreamFormat = 2002; hcTFWrongStreamVersion = 2003; hcTFStreamTooSmall = 2004; hcTFCorruptStream1 = 2005; hcTFCorruptStream2 = 2006; hcTFClipboardFailed = 2007; hcTFCannotSetUserData = 2008; // Header standard split cursor. crHeaderSplit = TCursor(63); // Height changing cursor. crVertSplit = TCursor(62); //Panning Cursors crVT_MOVEALL = TCursor(64); crVT_MOVEEW = TCursor(65); crVT_MOVENS = TCursor(66); crVT_MOVENW = TCursor(67); crVT_MOVESW = TCursor(68); crVT_MOVENE = TCursor(69); crVT_MOVESE = TCursor(70); crVT_MOVEW = TCursor(71); crVT_MOVEE = TCursor(72); crVT_MOVEN = TCursor(73); crVT_MOVES = TCursor(74); UtilityImageSize = 16; // Needed by descendants for hittests. {$if defined(LCLCarbon) or defined(LCLCocoa)} ssCtrlOS = ssMeta; // Mac OS X fix {$else} ssCtrlOS = ssCtrl; {$endif} var // Clipboard format IDs used in OLE drag'n drop and clipboard transfers. CF_VIRTUALTREE, CF_VTREFERENCE, CF_VRTF, CF_VRTFNOOBJS, // Unfortunately CF_RTF* is already defined as being // registration strings so I have to use different identifiers. CF_HTML, CF_CSV: Word; MMXAvailable: Boolean; // necessary to know because the blend code uses MMX instructions IsWinNT: Boolean; // Necessary to fix bugs in Win95/WinME (non-client area region intersection, edit resize) // and to allow for check of system dependent hint animation. IsWinVistaOrAbove: Boolean; type // The exception used by the trees. EVirtualTreeError = class(Exception); // Limits the speed interval which can be used for auto scrolling (milliseconds). TAutoScrollInterval = 1..1000; // Need to declare the correct WMNCPaint record as the VCL (D5-) doesn't. TRealWMNCPaint = packed record Msg: Cardinal; Rgn: HRGN; lParam: Integer; Result: Integer; end; // Be careful when adding new states as this might change the size of the type which in turn // changes the alignment in the node record as well as the stream chunks. // Do not reorder the states and always add new states at the end of this enumeration in order to avoid // breaking existing code. TVirtualNodeState = ( vsInitialized, // Set after the node has been initialized. vsChecking, // Node's check state is changing, avoid propagation. vsCutOrCopy, // Node is selected as cut or copy and paste source. vsDisabled, // Set if node is disabled. vsDeleting, // Set when the node is about to be freed. vsExpanded, // Set if the node is expanded. vsHasChildren, // Indicates the presence of child nodes without actually setting them. vsVisible, // Indicate whether the node is visible or not (independant of the expand states of its parents). vsSelected, // Set if the node is in the current selection. vsInitialUserData, // Set if (via AddChild or InsertNode) initial user data has been set which requires OnFreeNode. vsAllChildrenHidden, // Set if vsHasChildren is set and no child node has the vsVisible flag set. vsClearing, // A node's children are being deleted. Don't register structure change event. vsMultiline, // Node text is wrapped at the cell boundaries instead of being shorted. vsHeightMeasured, // Node height has been determined and does not need a recalculation. vsToggling // Set when a node is expanded/collapsed to prevent recursive calls. ); TVirtualNodeStates = set of TVirtualNodeState; // States used in InitNode to indicate states a node shall initially have. TVirtualNodeInitState = ( ivsDisabled, ivsExpanded, ivsHasChildren, ivsMultiline, ivsSelected ); TVirtualNodeInitStates = set of TVirtualNodeInitState; TVTScrollBarStyle = ( sbmRegular, sbmFlat, sbm3D ); // Options per column. TVTColumnOption = ( coAllowClick, // Column can be clicked (must be enabled too). coDraggable, // Column can be dragged. coEnabled, // Column is enabled. coParentBidiMode, // Column uses the parent's bidi mode. coParentColor, // Column uses the parent's background color. coResizable, // Column can be resized. coShowDropMark, // Column shows the drop mark if it is currently the drop target. coVisible, // Column is shown. coAutoSpring, // Column takes part in the auto spring feature of the header (must be resizable too). coFixed, // Column is fixed and can not be selected or scrolled etc. coSmartResize, // Column is resized to its largest entry which is in view (instead of its largest // visible entry). coAllowFocus, // Column can be focused. coDisableAnimatedResize, // Column resizing is not animated. coWrapCaption, // Caption could be wrapped across several header lines to fit columns width. coUseCaptionAlignment // Column's caption has its own aligment. ); TVTColumnOptions = set of TVTColumnOption; // These flags are used to indicate where a click in the header happened. TVTHeaderHitPosition = ( hhiNoWhere, // No column is involved (possible only if the tree is smaller than the client area). hhiOnColumn, // On a column. hhiOnIcon, // On the bitmap associated with a column. hhiOnCheckbox // On the checkbox if enabled. ); TVTHeaderHitPositions = set of TVTHeaderHitPosition; // These flags are returned by the hit test method. THitPosition = ( hiAbove, // above the client area (if relative) or the absolute tree area hiBelow, // below the client area (if relative) or the absolute tree area hiNowhere, // no node is involved (possible only if the tree is not as tall as the client area) hiOnItem, // on the bitmaps/buttons or label associated with an item hiOnItemButton, // on the button associated with an item hiOnItemButtonExact, // exactly on the button associated with an item hiOnItemCheckbox, // on the checkbox if enabled hiOnItemIndent, // in the indentation area in front of a node hiOnItemLabel, // on the normal text area associated with an item hiOnItemLeft, // in the area to the left of a node's text area (e.g. when right aligned or centered) hiOnItemRight, // in the area to the right of a node's text area (e.g. if left aligned or centered) hiOnNormalIcon, // on the "normal" image hiOnStateIcon, // on the state image hiToLeft, // to the left of the client area (if relative) or the absolute tree area hiToRight, // to the right of the client area (if relative) or the absolute tree area hiUpperSplitter, // in the upper splitter area of a node hiLowerSplitter // in the lower splitter area of a node ); THitPositions = set of THitPosition; TCheckType = ( ctNone, ctTriStateCheckBox, ctCheckBox, ctRadioButton, ctButton ); // The check states include both, transient and fluent (temporary) states. The only temporary state defined so // far is the pressed state. TCheckState = ( csUncheckedNormal, // unchecked and not pressed csUncheckedPressed, // unchecked and pressed csCheckedNormal, // checked and not pressed csCheckedPressed, // checked and pressed csMixedNormal, // 3-state check box and not pressed csMixedPressed // 3-state check box and pressed ); TCheckImageKind = ( ckLightCheck, // gray cross ckDarkCheck, // black cross ckLightTick, // gray tick mark ckDarkTick, // black tick mark ckFlat, // flat images (no 3D border) ckXP, // Windows XP style ckCustom, // application defined check images ckSystemFlat, // Flat system defined check images. ckSystemDefault // Uses the system check images, theme aware. ); // mode to describe a move action TVTNodeAttachMode = ( amNoWhere, // just for simplified tests, means to ignore the Add/Insert command amInsertBefore, // insert node just before destination (as sibling of destination) amInsertAfter, // insert node just after destionation (as sibling of destination) amAddChildFirst, // add node as first child of destination amAddChildLast // add node as last child of destination ); // modes to determine drop position further TDropMode = ( dmNowhere, dmAbove, dmOnNode, dmBelow ); // operations basically allowed during drag'n drop TDragOperation = ( doCopy, doMove, doLink ); TDragOperations = set of TDragOperation; TVTImageKind = ( ikNormal, ikSelected, ikState, ikOverlay ); TVTHintMode = ( hmDefault, // show the hint of the control hmHint, // show node specific hint string returned by the application hmHintAndDefault, // same as hmHint but show the control's hint if no node is concerned hmTooltip // show the text of the node if it isn't already fully shown ); // Indicates how to format a tooltip. TVTTooltipLineBreakStyle = ( hlbDefault, // Use multi-line style of the node. hlbForceSingleLine, // Use single line hint. hlbForceMultiLine // Use multi line hint. ); TMouseButtons = set of TMouseButton; // Used to describe the action to do when using the OnBeforeItemErase event. TItemEraseAction = ( eaColor, // Use the provided color to erase the background instead the one of the tree. eaDefault, // The tree should erase the item's background (bitmap or solid). eaNone // Do nothing. Let the application paint the background. ); // There is a heap of switchable behavior in the tree. Since published properties may never exceed 4 bytes, // which limits sets to at most 32 members, and because for better overview tree options are splitted // in various sub-options and are held in a commom options class. // // Options to customize tree appearance: TVTPaintOption = ( toHideFocusRect, // Avoid drawing the dotted rectangle around the currently focused node. toHideSelection, // Selected nodes are drawn as unselected nodes if the tree is unfocused. toHotTrack, // Track which node is under the mouse cursor. toPopupMode, // Paint tree as would it always have the focus (useful for tree combo boxes etc.) toShowBackground, // Use the background image if there's one. toShowButtons, // Display collapse/expand buttons left to a node. toShowDropmark, // Show the dropmark during drag'n drop operations. toShowHorzGridLines, // Display horizontal lines to simulate a grid. toShowRoot, // Show lines also at top level (does not show the hidden/internal root node). toShowTreeLines, // Display tree lines to show hierarchy of nodes. toShowVertGridLines, // Display vertical lines (depending on columns) to simulate a grid. toThemeAware, // Draw UI elements (header, tree buttons etc.) according to the current theme if // enabled (Windows XP+ only, application must be themed). toUseBlendedImages, // Enable alpha blending for ghosted nodes or those which are being cut/copied. toGhostedIfUnfocused, // Ghosted images are still shown as ghosted if unfocused (otherwise the become non-ghosted // images). toFullVertGridLines, // Display vertical lines over the full client area, not only the space occupied by nodes. // This option only has an effect if toShowVertGridLines is enabled too. toAlwaysHideSelection, // Do not draw node selection, regardless of focused state. toUseBlendedSelection, // Enable alpha blending for node selections. toStaticBackground, // Show simple static background instead of a tiled one. toChildrenAbove, // Display child nodes above their parent. toFixedIndent, // Draw the tree with a fixed indent. toUseExplorerTheme // Use the explorer theme if run under Windows Vista (or above). ); TVTPaintOptions = set of TVTPaintOption; // Options to toggle animation support: TVTAnimationOption = ( toAnimatedToggle, // Expanding and collapsing a node is animated (quick window scroll). toAdvancedAnimatedToggle // Do some advanced animation effects when toggling a node. ); TVTAnimationOptions = set of TVTAnimationOption; // Options which toggle automatic handling of certain situations: TVTAutoOption = ( toAutoDropExpand, // Expand node if it is the drop target for more than a certain time. toAutoExpand, // Nodes are expanded (collapsed) when getting (losing) the focus. toAutoScroll, // Scroll if mouse is near the border while dragging or selecting. toAutoScrollOnExpand, // Scroll as many child nodes in view as possible after expanding a node. toAutoSort, // Sort tree when Header.SortColumn or Header.SortDirection change or sort node if // child nodes are added. toAutoSpanColumns, // Large entries continue into next column(s) if there's no text in them (no clipping). toAutoTristateTracking, // Checkstates are automatically propagated for tri state check boxes. toAutoHideButtons, // Node buttons are hidden when there are child nodes, but all are invisible. toAutoDeleteMovedNodes, // Delete nodes which where moved in a drag operation (if not directed otherwise). toDisableAutoscrollOnFocus, // Disable scrolling a node or column into view if it gets focused. toDisableAutoscrollHorizontal, // Only autoscroll on focus vertically never horizontally toAutoChangeScale, // Change default node height automatically if the system's font scale is set to big fonts. toAutoFreeOnCollapse, // Frees any child node after a node has been collapsed (HasChildren flag stays there). toDisableAutoscrollOnEdit, // Do not center a node horizontally when it is edited. toAutoBidiColumnOrdering // When set then columns (if any exist) will be reordered from lowest index to highest index // and vice versa when the tree's bidi mode is changed. ); TVTAutoOptions = set of TVTAutoOption; // Options which determine the tree's behavior when selecting nodes: TVTSelectionOption = ( toDisableDrawSelection, // Prevent user from selecting with the selection rectangle in multiselect mode. toExtendedFocus, // Entries other than in the main column can be selected, edited etc. toFullRowSelect, // Hit test as well as selection highlight are not constrained to the text of a node. toLevelSelectConstraint, // Constrain selection to the same level as the selection anchor. toMiddleClickSelect, // Allow selection, dragging etc. with the middle mouse button. This and toWheelPanning // are mutual exclusive. toMultiSelect, // Allow more than one node to be selected. toRightClickSelect, // Allow selection, dragging etc. with the right mouse button. toSiblingSelectConstraint, // Constrain selection to nodes with same parent. toCenterScrollIntoView, // Center nodes vertically in the client area when scrolling into view. toSimpleDrawSelection // Simplifies draw selection, so a node's caption does not need to intersect with the // selection rectangle. ); TVTSelectionOptions = set of TVTSelectionOption; // Options which do not fit into any of the other groups: TVTMiscOption = ( toAcceptOLEDrop, // Register tree as OLE accepting drop target toCheckSupport, // Show checkboxes/radio buttons. toEditable, // Node captions can be edited. toFullRepaintOnResize, // Fully invalidate the tree when its window is resized (CS_HREDRAW/CS_VREDRAW). toGridExtensions, // Use some special enhancements to simulate and support grid behavior. toInitOnSave, // Initialize nodes when saving a tree to a stream. toReportMode, // Tree behaves like TListView in report mode. toToggleOnDblClick, // Toggle node expansion state when it is double clicked. toWheelPanning, // Support for mouse panning (wheel mice only). This option and toMiddleClickSelect are // mutal exclusive, where panning has precedence. toReadOnly, // The tree does not allow to be modified in any way. No action is executed and // node editing is not possible. toVariableNodeHeight, // When set then GetNodeHeight will trigger OnMeasureItem to allow variable node heights. toFullRowDrag, // Start node dragging by clicking anywhere in it instead only on the caption or image. // Must be used together with toDisableDrawSelection. toNodeHeightResize, // Allows changing a node's height via mouse. toNodeHeightDblClickResize, // Allows to reset a node's height to FDefaultNodeHeight via a double click. toEditOnClick, // Editing mode can be entered with a single click toEditOnDblClick // Editing mode can be entered with a double click ); TVTMiscOptions = set of TVTMiscOption; // Options to control data export TVTExportMode = ( emAll, // export all records (regardless checked state) emChecked, // export checked records only emUnchecked // export unchecked records only ); const DefaultPaintOptions = [toShowButtons, toShowDropmark, toShowTreeLines, toShowRoot, toThemeAware, toUseBlendedImages]; DefaultAnimationOptions = []; DefaultAutoOptions = [toAutoDropExpand, toAutoTristateTracking, toAutoScrollOnExpand, toAutoDeleteMovedNodes]; DefaultSelectionOptions = []; DefaultMiscOptions = [toAcceptOLEDrop, toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning, toEditOnClick]; DefaultColumnOptions = [coAllowClick, coDraggable, coEnabled, coParentColor, coParentBidiMode, coResizable, coShowDropmark, coVisible, coAllowFocus]; type TBaseVirtualTree = class; TVirtualTreeClass = class of TBaseVirtualTree; PVirtualNode = ^TVirtualNode; TColumnIndex = type Integer; TColumnPosition = type Cardinal; // This record must already be defined here and not later because otherwise BCB users will not be able // to compile (conversion done by BCB is wrong). TCacheEntry = record Node: PVirtualNode; AbsoluteTop: Cardinal; end; TCache = array of TCacheEntry; TNodeArray = array of PVirtualNode; TCustomVirtualTreeOptions = class(TPersistent) private FOwner: TBaseVirtualTree; FPaintOptions: TVTPaintOptions; FAnimationOptions: TVTAnimationOptions; FAutoOptions: TVTAutoOptions; FSelectionOptions: TVTSelectionOptions; FMiscOptions: TVTMiscOptions; FExportMode: TVTExportMode; procedure SetAnimationOptions(const Value: TVTAnimationOptions); procedure SetAutoOptions(const Value: TVTAutoOptions); procedure SetMiscOptions(const Value: TVTMiscOptions); procedure SetPaintOptions(const Value: TVTPaintOptions); procedure SetSelectionOptions(const Value: TVTSelectionOptions); protected property AnimationOptions: TVTAnimationOptions read FAnimationOptions write SetAnimationOptions default DefaultAnimationOptions; property AutoOptions: TVTAutoOptions read FAutoOptions write SetAutoOptions default DefaultAutoOptions; property ExportMode: TVTExportMode read FExportMode write FExportMode default emAll; property MiscOptions: TVTMiscOptions read FMiscOptions write SetMiscOptions default DefaultMiscOptions; property PaintOptions: TVTPaintOptions read FPaintOptions write SetPaintOptions default DefaultPaintOptions; property SelectionOptions: TVTSelectionOptions read FSelectionOptions write SetSelectionOptions default DefaultSelectionOptions; public constructor Create(AOwner: TBaseVirtualTree); virtual; procedure AssignTo(Dest: TPersistent); override; property Owner: TBaseVirtualTree read FOwner; end; TTreeOptionsClass = class of TCustomVirtualTreeOptions; TVirtualTreeOptions = class(TCustomVirtualTreeOptions) published property AnimationOptions; property AutoOptions; property ExportMode; property MiscOptions; property PaintOptions; property SelectionOptions; end; // Used in the CF_VTREFERENCE clipboard format. PVTReference = ^TVTReference; TVTReference = record Process: Cardinal; Tree: TBaseVirtualTree; end; TVirtualNode = record Index, // index of node with regard to its parent ChildCount: Cardinal; // number of child nodes NodeHeight: Word; // height in pixels States: TVirtualNodeStates; // states describing various properties of the node (expanded, initialized etc.) Align: Byte; // line/button alignment CheckState: TCheckState; // indicates the current check state (e.g. checked, pressed etc.) CheckType: TCheckType; // indicates which check type shall be used for this node Dummy: Byte; // dummy value to fill DWORD boundary TotalCount, // sum of this node, all of its child nodes and their child nodes etc. TotalHeight: Cardinal; // height in pixels this node covers on screen including the height of all of its // children // Note: Some copy routines require that all pointers (as well as the data area) in a node are // located at the end of the node! Hence if you want to add new member fields (except pointers to internal // data) then put them before field Parent. Parent, // reference to the node's parent (for the root this contains the treeview) PrevSibling, // link to the node's previous sibling or nil if it is the first node NextSibling, // link to the node's next sibling or nil if it is the last node FirstChild, // link to the node's first child... LastChild: PVirtualNode; // link to the node's last child... Data: record end; // this is a placeholder, each node gets extra data determined by NodeDataSize end; // Structure used when info about a certain position in the tree is needed. THitInfo = record HitNode: PVirtualNode; HitPositions: THitPositions; HitColumn: TColumnIndex; end; // auto scroll directions TScrollDirections = set of ( sdLeft, sdUp, sdRight, sdDown ); // OLE drag'n drop support TFormatEtcArray = array of TFormatEtc; TFormatArray = array of Word; // IDataObject.SetData support TInternalStgMedium = packed record Format: TClipFormat; Medium: TStgMedium; end; TInternalStgMediumArray = array of TInternalStgMedium; TEnumFormatEtc = class(TInterfacedObject, IEnumFormatEtc) private FTree: TBaseVirtualTree; FFormatEtcArray: TFormatEtcArray; FCurrentIndex: Integer; public constructor Create(Tree: TBaseVirtualTree; AFormatEtcArray: TFormatEtcArray); function Clone(out Enum: IEnumFormatEtc): HResult; stdcall; function Next(celt: LongWord; out elt: FormatEtc;pceltFetched:pULong=nil): HResult; stdcall; function Reset: HResult; stdcall; function Skip(celt: LongWord): HResult; stdcall; end; // ----- OLE drag'n drop handling IDropTargetHelper = interface(IUnknown) [SID_IDropTargetHelper] function DragEnter(hwndTarget: HWND; pDataObject: IDataObject; var ppt: TPoint; dwEffect: LongWord): HRESULT; stdcall; function DragLeave: HRESULT; stdcall; function DragOver(var ppt: TPoint; dwEffect: LongWord): HRESULT; stdcall; function Drop(pDataObject: IDataObject; var ppt: TPoint; dwEffect: LongWord): HRESULT; stdcall; function Show(fShow: Boolean): HRESULT; stdcall; end; PSHDragImage = ^TSHDragImage; TSHDragImage = packed record sizeDragImage: TSize; ptOffset: TPoint; hbmpDragImage: HBITMAP; ColorRef: TColorRef; end; IDragSourceHelper = interface(IUnknown) [SID_IDragSourceHelper] function InitializeFromBitmap(var SHDragImage: TSHDragImage; pDataObject: IDataObject): HRESULT; stdcall; function InitializeFromWindow(Window: HWND; var ppt: TPoint; pDataObject: IDataObject): HRESULT; stdcall; end; IVTDragManager = interface(IUnknown) ['{C4B25559-14DA-446B-8901-0C879000EB16}'] procedure ForceDragLeave; stdcall; function GetDataObject: IDataObject; stdcall; function GetDragSource: TBaseVirtualTree; stdcall; function GetDropTargetHelperSupported: Boolean; stdcall; function GetIsDropTarget: Boolean; stdcall; property DataObject: IDataObject read GetDataObject; property DragSource: TBaseVirtualTree read GetDragSource; property DropTargetHelperSupported: Boolean read GetDropTargetHelperSupported; property IsDropTarget: Boolean read GetIsDropTarget; end; // This data object is used in two different places. One is for clipboard operations and the other while dragging. TVTDataObject = class(TInterfacedObject, IDataObject) private FOwner: TBaseVirtualTree; // The tree which provides clipboard or drag data. FForClipboard: Boolean; // Determines which data to render with GetData. FFormatEtcArray: TFormatEtcArray; FInternalStgMediumArray: TInternalStgMediumArray; // The available formats in the DataObject FAdviseHolder: IDataAdviseHolder; // Reference to an OLE supplied implementation for advising. protected function CanonicalIUnknown(TestUnknown: IUnknown): IUnknown; function EqualFormatEtc(FormatEtc1, FormatEtc2: TFormatEtc): Boolean; function FindFormatEtc(TestFormatEtc: TFormatEtc; const FormatEtcArray: TFormatEtcArray): integer; function FindInternalStgMedium(Format: TClipFormat): PStgMedium; function HGlobalClone(HGlobal: THandle): THandle; function RenderInternalOLEData(const FormatEtcIn: TFormatEtc; var Medium: TStgMedium; var OLEResult: HResult): Boolean; function StgMediumIncRef(const InStgMedium: TStgMedium; var OutStgMedium: TStgMedium; CopyInMedium: Boolean; DataObject: IDataObject): HRESULT; property ForClipboard: Boolean read FForClipboard; property FormatEtcArray: TFormatEtcArray read FFormatEtcArray write FFormatEtcArray; property InternalStgMediumArray: TInternalStgMediumArray read FInternalStgMediumArray write FInternalStgMediumArray; property Owner: TBaseVirtualTree read FOwner; public constructor Create(AOwner: TBaseVirtualTree; ForClipboard: Boolean); virtual; destructor Destroy; override; function DAdvise(const FormatEtc: TFormatEtc; advf: DWord; const advSink: IAdviseSink; out dwConnection: DWord): HResult; virtual; stdcall; function DUnadvise(dwConnection: DWord): HResult; virtual; stdcall; Function EnumDAdvise(out enumAdvise : IEnumStatData):HResult;virtual;StdCall; function EnumFormatEtc(Direction: DWord; out EnumFormatEtc: IEnumFormatEtc): HResult; virtual; stdcall; function GetCanonicalFormatEtc(const pformatetcIn : FORMATETC;Out pformatetcOut : FORMATETC):HResult; virtual; STDCALl; function GetData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium): HResult; virtual; stdcall; function GetDataHere(const FormatEtc: TFormatEtc; out Medium: TStgMedium): HResult; virtual; stdcall; function QueryGetData(const FormatEtc: TFormatEtc): HResult; virtual; stdcall; function SetData(const FormatEtc: TFormatEtc; const Medium: TStgMedium; DoRelease: BOOL): HResult; virtual; stdcall; end; // TVTDragManager is a class to manage drag and drop in a Virtual Treeview. TVTDragManager = class(TInterfacedObject, IVTDragManager, IDropSource, IDropTarget) private FOwner, // The tree which is responsible for drag management. FDragSource: TBaseVirtualTree; // Reference to the source tree if the source was a VT, might be different than // the owner tree. FIsDropTarget: Boolean; // True if the owner is currently the drop target. FDataObject: IDataObject; // A reference to the data object passed in by DragEnter (only used when the owner // tree is the current drop target). FDropTargetHelper: IDropTargetHelper; // Win2k > Drag image support FFullDragging: BOOL; // True, if full dragging is currently enabled in the system. function GetDataObject: IDataObject; stdcall; function GetDragSource: TBaseVirtualTree; stdcall; function GetDropTargetHelperSupported: Boolean; stdcall; function GetIsDropTarget: Boolean; stdcall; public constructor Create(AOwner: TBaseVirtualTree); virtual; destructor Destroy; override; function DragEnter(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; stdcall; function DragLeave: HResult; stdcall; function DragOver(KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; stdcall; function Drop(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; stdcall; procedure ForceDragLeave; stdcall; {$IF (FPC_FULLVERSION < 020601) and DEFINED(LCLWin32)} function GiveFeedback(Effect: Longint): HResult; stdcall; function QueryContinueDrag(EscapePressed: BOOL; KeyState: Longint): HResult; stdcall; {$ELSE} function GiveFeedback(Effect: LongWord): HResult; stdcall; function QueryContinueDrag(EscapePressed: BOOL; KeyState: LongWord): HResult; stdcall; {$ENDIF} end; PVTHintData = ^TVTHintData; TVTHintData = record Tree: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; HintRect: TRect; // used for draw trees only, string trees get the size from the hint string DefaultHint: String; // used only if there is no node specific hint string available // or a header hint is about to appear HintText: String; // set when size of the hint window is calculated HintInfo: PHintInfo; end; // The trees need an own hint window class because of Unicode output and adjusted font. { TVirtualTreeHintWindow } TVirtualTreeHintWindow = class(THintWindow) private FHintData: TVTHintData; procedure WMShowWindow(var Message: TLMShowWindow); message LM_SHOWWINDOW; public function CalcHintRect(MaxWidth: Integer; const AHint: string; AData: Pointer): TRect; override; procedure Paint; override; end; // Drag image support for the tree. TVTTransparency = 0..255; TVTBias = -128..127; // Simple move limitation for the drag image. TVTDragMoveRestriction = ( dmrNone, dmrHorizontalOnly, dmrVerticalOnly ); TVTDragImageStates = set of ( disHidden, // Internal drag image is currently hidden (always hidden if drag image helper interfaces are used). disInDrag, // Drag image class is currently being used. disPrepared, // Drag image class is prepared. disSystemSupport // Running on Windows 2000 or higher. System supports drag images natively. ); // Class to manage header and tree drag image during a drag'n drop operation. TVTDragImage = class private FOwner: TBaseVirtualTree; FBackImage, // backup of overwritten screen area FAlphaImage, // target for alpha blending FDragImage: TBitmap; // the actual drag image to blend to screen FImagePosition, // position of image (upper left corner) in screen coordinates FLastPosition: TPoint; // last mouse position in screen coordinates FTransparency: TVTTransparency; // alpha value of the drag image (0 - fully transparent, 255 - fully opaque) FPreBlendBias, // value to darken or lighten the drag image before it is blended FPostBlendBias: TVTBias; // value to darken or lighten the alpha blend result FFade: Boolean; // determines whether to fade the drag image from center to borders or not FRestriction: TVTDragMoveRestriction; // determines in which directions the drag image can be moved FColorKey: TColor; // color to make fully transparent regardless of any other setting FStates: TVTDragImageStates; // Determines the states of the drag image class. function GetVisible: Boolean; // True if the drag image is currently hidden (used only when dragging) protected procedure InternalShowDragImage(ScreenDC: HDC); procedure MakeAlphaChannel(Source, Target: TBitmap); public constructor Create(AOwner: TBaseVirtualTree); destructor Destroy; override; function DragTo(const P: TPoint; ForceRepaint: Boolean): Boolean; procedure EndDrag; function GetDragImageRect: TRect; procedure HideDragImage; procedure PrepareDrag(DragImage: TBitmap; const ImagePosition, HotSpot: TPoint; const DataObject: IDataObject); procedure RecaptureBackground(Tree: TBaseVirtualTree; R: TRect; VisibleRegion: HRGN; CaptureNCArea, ReshowDragImage: Boolean); procedure ShowDragImage; function WillMove(const P: TPoint): Boolean; property ColorKey: TColor read FColorKey write FColorKey default clWindow; property Fade: Boolean read FFade write FFade default False; property MoveRestriction: TVTDragMoveRestriction read FRestriction write FRestriction default dmrNone; property PostBlendBias: TVTBias read FPostBlendBias write FPostBlendBias default 0; property PreBlendBias: TVTBias read FPreBlendBias write FPreBlendBias default 0; property Transparency: TVTTransparency read FTransparency write FTransparency default 128; property Visible: Boolean read GetVisible; end; // tree columns implementation TVirtualTreeColumns = class; TVTHeader = class; TVirtualTreeColumnStyle = ( vsText, vsOwnerDraw ); TVTHeaderColumnLayout = ( blGlyphLeft, blGlyphRight, blGlyphTop, blGlyphBottom ); TVirtualTreeColumn = class(TCollectionItem) private FText, FHint: String; FLeft, FWidth: Integer; FPosition: TColumnPosition; FMinWidth: Integer; FMaxWidth: Integer; FStyle: TVirtualTreeColumnStyle; FImageIndex: TImageIndex; FBiDiMode: TBiDiMode; FLayout: TVTHeaderColumnLayout; FMargin, FSpacing: Integer; FOptions: TVTColumnOptions; FTag: Integer; FAlignment: TAlignment; FCaptionAlignment: TAlignment; // Alignment of the caption. FLastWidth: Integer; FColor: TColor; FBonusPixel: Boolean; FSpringRest: Single; // Accumulator for width adjustment when auto spring option is enabled. FCaptionText: String; FCheckBox: Boolean; FCheckType: TCheckType; FCheckState: TCheckState; FImageRect: TRect; FHasImage: Boolean; function GetCaptionAlignment: TAlignment; function GetLeft: Integer; function IsBiDiModeStored: Boolean; function IsCaptionAlignmentStored: Boolean; function IsColorStored: Boolean; procedure SetAlignment(const Value: TAlignment); procedure SetBiDiMode(Value: TBiDiMode); procedure SetCaptionAlignment(const Value: TAlignment); procedure SetCheckBox(Value: Boolean); procedure SetCheckState(Value: TCheckState); procedure SetCheckType(Value: TCheckType); procedure SetColor(const Value: TColor); procedure SetImageIndex(Value: TImageIndex); procedure SetLayout(Value: TVTHeaderColumnLayout); procedure SetMargin(Value: Integer); procedure SetMaxWidth(Value: Integer); procedure SetMinWidth(Value: Integer); procedure SetOptions(Value: TVTColumnOptions); procedure SetPosition(Value: TColumnPosition); procedure SetSpacing(Value: Integer); procedure SetStyle(Value: TVirtualTreeColumnStyle); procedure SetText(const Value: String); procedure SetWidth(Value: Integer); protected procedure ComputeHeaderLayout(DC: HDC; const Client: TRect; UseHeaderGlyph, UseSortGlyph: Boolean; var HeaderGlyphPos, SortGlyphPos: TPoint; var TextBounds: TRect; DrawFormat: Cardinal; CalculateTextRect: Boolean = False); procedure GetAbsoluteBounds(var Left, Right: Integer); function GetDisplayName: string; override; function GetOwner: TVirtualTreeColumns; reintroduce; public constructor Create(Collection: TCollection); override; destructor Destroy; override; procedure Assign(Source: TPersistent); override; function Equals(OtherColumnObj: TObject): Boolean; virtual; function GetRect: TRect; virtual; procedure LoadFromStream(const Stream: TStream; Version: Integer); procedure ParentBiDiModeChanged; procedure ParentColorChanged; procedure RestoreLastWidth; procedure SaveToStream(const Stream: TStream); function UseRightToLeftReading: Boolean; property Left: Integer read GetLeft; property Owner: TVirtualTreeColumns read GetOwner; published property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify; property BiDiMode: TBiDiMode read FBiDiMode write SetBiDiMode stored IsBiDiModeStored default bdLeftToRight; property CaptionAlignment: TAlignment read GetCaptionAlignment write SetCaptionAlignment stored IsCaptionAlignmentStored default taLeftJustify; property CaptionText: String read FCaptionText stored False; property CheckType: TCheckType read FCheckType write SetCheckType default ctCheckBox; property CheckState: TCheckState read FCheckState write SetCheckState default csUncheckedNormal; property CheckBox: Boolean read FCheckBox write SetCheckBox default False; property Color: TColor read FColor write SetColor stored IsColorStored; property Hint: String read FHint write FHint; property ImageIndex: TImageIndex read FImageIndex write SetImageIndex default -1; property Layout: TVTHeaderColumnLayout read FLayout write SetLayout default blGlyphLeft; property Margin: Integer read FMargin write SetMargin default 4; property MaxWidth: Integer read FMaxWidth write SetMaxWidth default 10000; property MinWidth: Integer read FMinWidth write SetMinWidth default 10; property Options: TVTColumnOptions read FOptions write SetOptions default DefaultColumnOptions; property Position: TColumnPosition read FPosition write SetPosition; property Spacing: Integer read FSpacing write SetSpacing default 4; property Style: TVirtualTreeColumnStyle read FStyle write SetStyle default vsText; property Tag: Integer read FTag write FTag default 0; property Text: String read FText write SetText; property Width: Integer read FWidth write SetWidth default 50; end; TVirtualTreeColumnClass = class of TVirtualTreeColumn; TColumnsArray = array of TVirtualTreeColumn; TCardinalArray = array of Cardinal; TIndexArray = array of TColumnIndex; TVirtualTreeColumns = class(TCollection) private FHeader: TVTHeader; FHeaderBitmap: TBitmap; // backbuffer for drawing FHoverIndex, // currently "hot" column FDownIndex, // Column on which a mouse button is held down. FTrackIndex: TColumnIndex; // Index of column which is currently being resized FClickIndex: TColumnIndex; // last clicked column FPositionToIndex: TIndexArray; FDefaultWidth: Integer; // the width columns are created with FNeedPositionsFix: Boolean; // True if FixPositions must still be called after DFM loading or Bidi mode change. FClearing: Boolean; // True if columns are being deleted entirely. // drag support FDragIndex: TColumnIndex; // index of column currently being dragged FDropTarget: TColumnIndex; // current target column (index) while dragging FDropBefore: Boolean; // True if drop position is in the left half of a column, False for the right // side to drop the dragged column to function GetCount: Integer; function GetItem(Index: TColumnIndex): TVirtualTreeColumn; function GetNewIndex(P: TPoint; var OldIndex: TColumnIndex): Boolean; procedure SetDefaultWidth(Value: Integer); procedure SetItem(Index: TColumnIndex; Value: TVirtualTreeColumn); protected procedure AdjustAutoSize(CurrentIndex: TColumnIndex; Force: Boolean = False); function AdjustDownColumn(P: TPoint): TColumnIndex; function AdjustHoverColumn(const P: TPoint): Boolean; procedure AdjustPosition(Column: TVirtualTreeColumn; Position: Cardinal); function CanSplitterResize(P: TPoint; Column: TColumnIndex): Boolean; procedure DoCanSplitterResize(P: TPoint; Column: TColumnIndex; var Allowed: Boolean); procedure DrawButtonText(DC: HDC; Caption: String; Bounds: TRect; Enabled, Hot: Boolean; DrawFormat: Cardinal; WrapCaption: Boolean); procedure DrawXPButton(DC: HDC; const ButtonR: TRect; DrawSplitter, Down, Hover: Boolean); procedure FixPositions; function GetColumnAndBounds(const P: TPoint; var ColumnLeft, ColumnRight: Integer; Relative: Boolean = True): Integer; function GetOwner: TPersistent; override; procedure HandleClick(P: TPoint; Button: TMouseButton; Force, DblClick: Boolean); virtual; procedure IndexChanged(OldIndex, NewIndex: Integer); procedure InitializePositionArray; procedure ReorderColumns(RTL: Boolean); procedure Update(Item: TCollectionItem); override; procedure UpdatePositions(Force: Boolean = False); property HeaderBitmap: TBitmap read FHeaderBitmap; property PositionToIndex: TIndexArray read FPositionToIndex; public constructor Create(AOwner: TVTHeader); destructor Destroy; override; function Add: TVirtualTreeColumn; virtual; procedure AnimatedResize(Column: TColumnIndex; NewWidth: Integer); procedure Assign(Source: TPersistent); override; procedure Clear; virtual; function ColumnFromPosition(const P: TPoint; Relative: Boolean = True): TColumnIndex; overload; virtual; function ColumnFromPosition(PositionIndex: TColumnPosition): TColumnIndex; overload; virtual; function Equals(OtherColumnsObj: TObject): Boolean; procedure GetColumnBounds(Column: TColumnIndex; out Left, Right: Integer); function GetFirstVisibleColumn(ConsiderAllowFocus: Boolean = False): TColumnIndex; function GetLastVisibleColumn(ConsiderAllowFocus: Boolean = False): TColumnIndex; function GetNextColumn(Column: TColumnIndex): TColumnIndex; function GetNextVisibleColumn(Column: TColumnIndex; ConsiderAllowFocus: Boolean = False): TColumnIndex; function GetPreviousColumn(Column: TColumnIndex): TColumnIndex; function GetPreviousVisibleColumn(Column: TColumnIndex; ConsiderAllowFocus: Boolean = False): TColumnIndex; function GetScrollWidth: Integer; function GetVisibleColumns: TColumnsArray; function GetVisibleFixedWidth: Integer; function IsValidColumn(Column: TColumnIndex): Boolean; procedure LoadFromStream(const Stream: TStream; Version: Integer); procedure PaintHeader(DC: HDC; const R: TRect; HOffset: Integer); virtual; procedure SaveToStream(const Stream: TStream); function TotalWidth: Integer; property Count: Integer read GetCount; property ClickIndex: TColumnIndex read FClickIndex; property DefaultWidth: Integer read FDefaultWidth write SetDefaultWidth default 50; property Items[Index: TColumnIndex]: TVirtualTreeColumn read GetItem write SetItem; default; property Header: TVTHeader read FHeader; property TrackIndex: TColumnIndex read FTrackIndex; end; TVirtualTreeColumnsClass = class of TVirtualTreeColumns; TVTConstraintPercent = 0..100; TVTFixedAreaConstraints = class(TPersistent) private FHeader: TVTHeader; FMaxHeightPercent, FMaxWidthPercent, FMinHeightPercent, FMinWidthPercent: TVTConstraintPercent; FOnChange: TNotifyEvent; procedure SetConstraints(Index: Integer; Value: TVTConstraintPercent); protected procedure Change; property Header: TVTHeader read FHeader; public constructor Create(AOwner: TVTHeader); procedure Assign(Source: TPersistent); override; property OnChange: TNotifyEvent read FOnChange write FOnChange; published property MaxHeightPercent: TVTConstraintPercent index 0 read FMaxHeightPercent write SetConstraints default 0; property MaxWidthPercent: TVTConstraintPercent index 1 read FMaxWidthPercent write SetConstraints default 0; property MinHeightPercent: TVTConstraintPercent index 2 read FMinHeightPercent write SetConstraints default 0; property MinWidthPercent: TVTConstraintPercent index 3 read FMinWidthPercent write SetConstraints default 0; end; TVTHeaderStyle = ( hsThickButtons, // TButton look and feel hsFlatButtons, // flatter look than hsThickButton, like an always raised flat TToolButton hsPlates, // flat TToolButton look and feel (raise on hover etc.) hsXPStyle // Windows XP style ); TVTHeaderOption = ( hoAutoResize, // Adjust a column so that the header never exceeds the client width of the owner control. hoColumnResize, // Resizing columns with the mouse is allowed. hoDblClickResize, // Allows a column to resize itself to its largest entry. hoDrag, // Dragging columns is allowed. hoHotTrack, // Header captions are highlighted when mouse is over a particular column. hoOwnerDraw, // Header items with the owner draw style can be drawn by the application via event. hoRestrictDrag, // Header can only be dragged horizontally. hoShowHint, // Show application defined header hint. hoShowImages, // Show header images. hoShowSortGlyphs, // Allow visible sort glyphs. hoVisible, // Header is visible. hoAutoSpring, // Distribute size changes of the header to all columns, which are sizable and have the // coAutoSpring option enabled. hoAutoResize must be enabled too. hoFullRepaintOnResize, // Fully invalidate the header (instead of subsequent columns only) when a column is resized. hoDisableAnimatedResize, // Disable animated resize for all columns. hoHeightResize, // Allow resizing header height via mouse. hoHeightDblClickResize // Allow the header to resize itself to its default height. ); TVTHeaderOptions = set of TVTHeaderOption; THeaderState = ( hsAutoSizing, // auto size chain is in progess, do not trigger again on WM_SIZE hsDragging, // header dragging is in progress (only if enabled) hsDragPending, // left button is down, user might want to start dragging a column hsLoading, // The header currently loads from stream, so updates are not necessary. hsColumnWidthTracking, // column resizing is in progress hsColumnWidthTrackPending, // left button is down, user might want to start resize a column hsHeightTracking, // height resizing is in progress hsHeightTrackPending, // left button is down, user might want to start changing height hsResizing, // multi column resizing in progress hsScaling, // the header is scaled after a change of FixedAreaConstraints or client size hsNeedScaling // the header needs to be scaled ); THeaderStates = set of THeaderState; TSortDirection = ( sdAscending, sdDescending ); // describes the used column resize behaviour for AutoFitColumns TSmartAutoFitType = ( smaAllColumns, // consider nodes in view only for all columns smaNoColumn, // consider nodes in view only for no column smaUseColumnOption // use coSmartResize of the corresponding column ); // desribes what made a structure change event happen TChangeReason = ( crIgnore, // used as placeholder crAccumulated, // used for delayed changes crChildAdded, // one or more child nodes have been added crChildDeleted, // one or more child nodes have been deleted crNodeAdded, // a node has been added crNodeCopied, // a node has been duplicated crNodeMoved // a node has been moved to a new place ); TVTHeader = class(TPersistent) private FOwner: TBaseVirtualTree; FColumns: TVirtualTreeColumns; FHeight: Integer; FFont: TFont; FParentFont: Boolean; FOptions: TVTHeaderOptions; FStates: THeaderStates; // Used to keep track of internal states the header can enter. FTrackPoint: TPoint; // Client coordinate where the tracking started. FStyle: TVTHeaderStyle; // button style FBackground: TColor; FAutoSizeIndex: TColumnIndex; FPopupMenu: TPopupMenu; FMainColumn: TColumnIndex; // the column which holds the tree FMaxHeight: Integer; FMinHeight: Integer; FDefaultHeight: Integer; FFixedAreaConstraints: TVTFixedAreaConstraints; // Percentages for the fixed area (header, fixed columns). FImages: TCustomImageList; FImageChangeLink: TChangeLink; // connections to the image list to get notified about changes FSortColumn: TColumnIndex; FSortDirection: TSortDirection; FTrackStart: TPoint; // client coordinates of the tracking start point FDragStart: TPoint; // initial mouse drag position FDragImage: TVTDragImage; // drag image management during header drag FLastWidth: Integer; // Used to adjust spring columns. This is the width of all visible columns, // not the header rectangle. procedure FontChanged(Sender: TObject); function GetMainColumn: TColumnIndex; function GetUseColumns: Boolean; function IsFontStored: Boolean; procedure SetAutoSizeIndex(Value: TColumnIndex); procedure SetBackground(Value: TColor); procedure SetColumns(Value: TVirtualTreeColumns); procedure SetDefaultHeight(Value: Integer); procedure SetFont(const Value: TFont); procedure SetHeight(Value: Integer); procedure SetImages(const Value: TCustomImageList); procedure SetMainColumn(Value: TColumnIndex); procedure SetMaxHeight(Value: Integer); procedure SetMinHeight(Value: Integer); procedure SetOptions(Value: TVTHeaderOptions); procedure SetParentFont(Value: Boolean); procedure SetSortColumn(Value: TColumnIndex); procedure SetSortDirection(const Value: TSortDirection); procedure SetStyle(Value: TVTHeaderStyle); protected procedure ChangeScale(M, D: Integer); virtual; function DetermineSplitterIndex(const P: TPoint): Boolean; virtual; procedure DoAfterAutoFitColumn(Column: TColumnIndex); virtual; procedure DoAfterColumnWidthTracking(Column: TColumnIndex); virtual; procedure DoAfterHeightTracking; virtual; function DoBeforeAutoFitColumn(Column: TColumnIndex; SmartAutoFitType: TSmartAutoFitType): Boolean; virtual; procedure DoBeforeColumnWidthTracking(Column: TColumnIndex; Shift: TShiftState); virtual; procedure DoBeforeHeightTracking(Shift: TShiftState); virtual; function DoColumnWidthDblClickResize(Column: TColumnIndex; P: TPoint; Shift: TShiftState): Boolean; virtual; function DoColumnWidthTracking(Column: TColumnIndex; Shift: TShiftState; var TrackPoint: TPoint; P: TPoint): Boolean; virtual; function DoGetPopupMenu(Column: TColumnIndex; Position: TPoint): TPopupMenu; virtual; function DoHeightTracking(var P: TPoint; Shift: TShiftState): Boolean; virtual; function DoHeightDblClickResize(var P: TPoint; Shift: TShiftState): Boolean; virtual; procedure DoSetSortColumn(Value: TColumnIndex); virtual; procedure DragTo(const P: TPoint); procedure FixedAreaConstraintsChanged(Sender: TObject); function GetColumnsClass: TVirtualTreeColumnsClass; virtual; function GetOwner: TPersistent; override; function GetShiftState: TShiftState; function HandleHeaderMouseMove(var Message: TLMMouseMove): Boolean; function HandleMessage(var Message: TLMessage): Boolean; virtual; procedure ImageListChange(Sender: TObject); procedure PrepareDrag(P, Start: TPoint); procedure RecalculateHeader; virtual; procedure RescaleHeader; procedure UpdateMainColumn; procedure UpdateSpringColumns; public constructor Create(AOwner: TBaseVirtualTree); virtual; destructor Destroy; override; function AllowFocus(ColumnIndex: TColumnIndex): Boolean; procedure Assign(Source: TPersistent); override; procedure AutoFitColumns(Animated: Boolean = True; SmartAutoFitType: TSmartAutoFitType = smaUseColumnOption; RangeStartCol: Integer = NoColumn; RangeEndCol: Integer = NoColumn); function InHeader(const P: TPoint): Boolean; virtual; function InHeaderSplitterArea(P: TPoint): Boolean; virtual; procedure Invalidate(Column: TVirtualTreeColumn; ExpandToBorder: Boolean = False); procedure LoadFromStream(const Stream: TStream); virtual; function ResizeColumns(ChangeBy: Integer; RangeStartCol: TColumnIndex; RangeEndCol: TColumnIndex; Options: TVTColumnOptions = [coVisible]): Integer; procedure RestoreColumns; procedure SaveToStream(const Stream: TStream); virtual; property DragImage: TVTDragImage read FDragImage; property States: THeaderStates read FStates; property Treeview: TBaseVirtualTree read FOwner; property UseColumns: Boolean read GetUseColumns; published property AutoSizeIndex: TColumnIndex read FAutoSizeIndex write SetAutoSizeIndex; property Background: TColor read FBackground write SetBackground default clBtnFace; property Columns: TVirtualTreeColumns read FColumns write SetColumns; property DefaultHeight: Integer read FDefaultHeight write SetDefaultHeight; property Font: TFont read FFont write SetFont stored IsFontStored; property FixedAreaConstraints: TVTFixedAreaConstraints read FFixedAreaConstraints write FFixedAreaConstraints; property Height: Integer read FHeight write SetHeight default 17; property Images: TCustomImageList read FImages write SetImages; property MainColumn: TColumnIndex read GetMainColumn write SetMainColumn default 0; property MaxHeight: Integer read FMaxHeight write SetMaxHeight default 10000; property MinHeight: Integer read FMinHeight write SetMinHeight default 10; property Options: TVTHeaderOptions read FOptions write SetOptions default [hoColumnResize, hoDrag, hoShowSortGlyphs]; property ParentFont: Boolean read FParentFont write SetParentFont default False; property PopupMenu: TPopupMenu read FPopupMenu write FPopUpMenu; property SortColumn: TColumnIndex read FSortColumn write SetSortColumn default NoColumn; property SortDirection: TSortDirection read FSortDirection write SetSortDirection default sdAscending; property Style: TVTHeaderStyle read FStyle write SetStyle default hsThickButtons; end; TVTHeaderClass = class of TVTHeader; // Communication interface between a tree editor and the tree itself (declared as using stdcall in case it // is implemented in a (C/C++) DLL). The GUID is not nessecary in Delphi but important for BCB users // to allow QueryInterface and _uuidof calls. IVTEditLink = interface ['{2BE3EAFA-5ACB-45B4-9D9A-B58BCC496E17}'] function BeginEdit: Boolean; stdcall; // Called when editing actually starts. function CancelEdit: Boolean; stdcall; // Called when editing has been cancelled by the tree. function EndEdit: Boolean; stdcall; // Called when editing has been finished by the tree. function PrepareEdit(Tree: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex): Boolean; stdcall; // Called after creation to allow a setup. function GetBounds: TRect; stdcall; // Called to get the current size of the edit window // (only important if the edit resizes itself). procedure ProcessMessage(var Message: TLMessage); stdcall; // Used to forward messages to the edit window(s)- procedure SetBounds(R: TRect); stdcall; // Called to place the editor. end; // Indicates in the OnUpdating event what state the tree is currently in. TVTUpdateState = ( usBegin, // The tree just entered the update state (BeginUpdate call for the first time). usBeginSynch, // The tree just entered the synch update state (BeginSynch call for the first time). usSynch, // Begin/EndSynch has been called but the tree did not change the update state. usUpdate, // Begin/EndUpdate has been called but the tree did not change the update state. usEnd, // The tree just left the update state (EndUpdate called for the last level). usEndSynch // The tree just left the synch update state (EndSynch called for the last level). ); // Used during owner draw of the header to indicate which drop mark for the column must be drawn. TVTDropMarkMode = ( dmmNone, dmmLeft, dmmRight ); // This structure carries all important information about header painting and is used in the advanced header painting. THeaderPaintInfo = record TargetCanvas: TCanvas; Column: TVirtualTreeColumn; PaintRectangle: TRect; TextRectangle: TRect; IsHoverIndex, IsDownIndex, IsEnabled, ShowHeaderGlyph, ShowSortGlyph, ShowRightBorder: Boolean; DropMark: TVTDropMarkMode; GlyphPos, SortGlyphPos: TPoint; end; // These elements are used both to query the application, which of them it wants to draw itself and to tell it during // painting, which elements must be drawn during the advanced custom draw events. THeaderPaintElements = set of ( hpeBackground, hpeDropMark, hpeHeaderGlyph, hpeSortGlyph, hpeText ); // Various events must be handled at different places than they were initiated or need // a persistent storage until they are reset. TVirtualTreeStates = set of ( tsCancelHintAnimation, // Set when a new hint is about to show but an old hint is still being animated. tsChangePending, // A selection change is pending. tsCheckPropagation, // Set during automatic check state propagation. tsCollapsing, // A full collapse operation is in progress. tsToggleFocusedSelection, // Node selection was modifed using Ctrl-click. Change selection state on next mouse up. tsClearPending, // Need to clear the current selection on next mouse move. tsClipboardFlushing, // Set during flushing the clipboard to avoid freeing the content. tsCopyPending, // Indicates a pending copy operation which needs to be finished. tsCutPending, // Indicates a pending cut operation which needs to be finished. tsDrawSelPending, // Multiselection only. User held down the left mouse button on a free // area and might want to start draw selection. tsDrawSelecting, // Multiselection only. Draw selection has actually started. tsEditing, // Indicates that an edit operation is currently in progress. tsEditPending, // An mouse up start edit if dragging has not started. tsExpanding, // A full expand operation is in progress. tsNodeHeightTracking, // A node height changing operation is in progress. tsNodeHeightTrackPending, // left button is down, user might want to start changing a node's height. tsHint, // Set when our hint is visible or soon will be. tsInAnimation, // Set if the tree is currently in an animation loop. tsIncrementalSearching, // Set when the user starts incremental search. tsIncrementalSearchPending, // Set in WM_KEYDOWN to tell to use the char in WM_CHAR for incremental search. tsIterating, // Set when IterateSubtree is currently in progress. tsKeyCheckPending, // A check operation is under way, initiated by a key press (space key). Ignore mouse. tsLeftButtonDown, // Set when the left mouse button is down. tsLeftDblClick, // Set when the left mouse button was doubly clicked. tsMouseCheckPending, // A check operation is under way, initiated by a mouse click. Ignore space key. tsMiddleButtonDown, // Set when the middle mouse button is down. tsMiddleDblClick, // Set when the middle mouse button was doubly clicked. tsNeedScale, // On next ChangeScale scale the default node height. tsNeedRootCountUpdate, // Set if while loading a root node count is set. tsOLEDragging, // OLE dragging in progress. tsOLEDragPending, // User has requested to start delayed dragging. tsPainting, // The tree is currently painting itself. tsRightButtonDown, // Set when the right mouse button is down. tsRightDblClick, // Set when the right mouse button was doubly clicked. tsPopupMenuShown, // The user clicked the right mouse button, which might cause a popup menu to appear. tsScrolling, // Set when autoscrolling is active. tsScrollPending, // Set when waiting for the scroll delay time to elapse. tsSizing, // Set when the tree window is being resized. This is used to prevent recursive calls // due to setting the scrollbars when sizing. tsStopValidation, // Cache validation can be stopped (usually because a change has occured meanwhile). tsStructureChangePending, // The structure of the tree has been changed while the update was locked. tsSynchMode, // Set when the tree is in synch mode, where no timer events are triggered. tsThumbTracking, // Stop updating the horizontal scroll bar while dragging the vertical thumb and vice versa. tsToggling, // A toggle operation (for some node) is in progress. tsUpdateHiddenChildrenNeeded, // Pending update for the hidden children flag after massive visibility changes. tsUpdating, // The tree does currently not update its window because a BeginUpdate has not yet ended. tsUseCache, // The tree's node caches are validated and non-empty. tsUserDragObject, // Signals that the application created an own drag object in OnStartDrag. tsUseThemes, // The tree runs under WinXP+, is theme aware and themes are enabled. tsValidating, // The tree's node caches are currently validated. tsValidationNeeded, // Something in the structure of the tree has changed. The cache needs validation. tsVCLDragging, // VCL drag'n drop in progress. tsVCLDragPending, // One-shot flag to avoid clearing the current selection on implicit mouse up for VCL drag. tsWheelPanning, // Wheel mouse panning is active or soon will be. tsWheelScrolling, // Wheel mouse scrolling is active or soon will be. tsWindowCreating // Set during window handle creation to avoid frequent unnecessary updates. ); TChangeStates = set of ( csStopValidation, // Cache validation can be stopped (usually because a change has occured meanwhile). csUseCache, // The tree's node caches are validated and non-empty. csValidating, // The tree's node caches are currently validated. csValidationNeeded // Something in the structure of the tree has changed. The cache needs validation. ); // determines whether and how the drag image is to show TVTDragImageKind = ( diComplete, // show a complete drag image with all columns, only visible columns are shown diMainColumnOnly, // show only the main column (the tree column) diNoImage // don't show a drag image at all ); // Switch for OLE and VCL drag'n drop. Because it is not possible to have both simultanously. TVTDragType = ( dtOLE, dtVCL ); // options which determine what to draw in PaintTree TVTInternalPaintOption = ( poBackground, // draw background image if there is any and it is enabled poColumnColor, // erase node's background with the column's color poDrawFocusRect, // draw focus rectangle around the focused node poDrawSelection, // draw selected nodes with the normal selection color poDrawDropMark, // draw drop mark if a node is currently the drop target poGridLines, // draw grid lines if enabled poMainOnly, // draw only the main column poSelectedOnly // draw only selected nodes ); TVTInternalPaintOptions = set of TVTInternalPaintOption; // Determines the look of a tree's lines. TVTLineStyle = ( lsCustomStyle, // application provides a line pattern lsDotted, // usual dotted lines (default) lsSolid // simple solid lines ); // TVTLineType is used during painting a tree TVTLineType = ( ltNone, // no line at all ltBottomRight, // a line from bottom to the center and from there to the right ltTopDown, // a line from top to bottom ltTopDownRight, // a line from top to bottom and from center to the right ltRight, // a line from center to the right ltTopRight, // a line from bottom to center and from there to the right // special styles for alternative drawings of tree lines ltLeft, // a line from top to bottom at the left ltLeftBottom // a combination of ltLeft and a line at the bottom from left to right ); // Determines how to draw tree lines. TVTLineMode = ( lmNormal, // usual tree lines (as in TTreeview) lmBands // looks similar to a Nassi-Schneidermann diagram ); // A collection of line type IDs which is used while painting a node. TLineImage = array of TVTLineType; TVTScrollIncrement = 1..10000; // Export type TVTExportType = ( etRTF, // contentToRTF etHTML, // contentToHTML etText, // contentToText etExcel, // supported by external tools etWord, // supported by external tools etCustom // supported by external tools ); TVTNodeExportEvent = function (Sender: TBaseVirtualTree; aExportType: TVTExportType; Node: PVirtualNode): Boolean of object; TVTColumnExportEvent = procedure (Sender: TBaseVirtualTree; aExportType: TVTExportType; Column: TVirtualTreeColumn) of object; TVTTreeExportEvent = procedure(Sender: TBaseVirtualTree; aExportType: TVTExportType) of object; // A class to manage scroll bar aspects. TScrollBarOptions = class(TPersistent) private FAlwaysVisible: Boolean; FOwner: TBaseVirtualTree; FScrollBars: TScrollStyle; // used to hide or show vertical and/or horizontal scrollbar FScrollBarStyle: TVTScrollBarStyle; // kind of scrollbars to use FIncrementX, FIncrementY: TVTScrollIncrement; // number of pixels to scroll in one step (when auto scrolling) procedure SetAlwaysVisible(Value: Boolean); procedure SetScrollBars(Value: TScrollStyle); procedure SetScrollBarStyle(Value: TVTScrollBarStyle); protected function GetOwner: TPersistent; override; public constructor Create(AOwner: TBaseVirtualTree); procedure Assign(Source: TPersistent); override; published property AlwaysVisible: Boolean read FAlwaysVisible write SetAlwaysVisible default False; property HorizontalIncrement: TVTScrollIncrement read FIncrementX write FIncrementX default 20; property ScrollBars: TScrollStyle read FScrollbars write SetScrollBars default ssBoth; property ScrollBarStyle: TVTScrollBarStyle read FScrollBarStyle write SetScrollBarStyle default sbmRegular; property VerticalIncrement: TVTScrollIncrement read FIncrementY write FIncrementY default 20; end; // class to collect all switchable colors into one place TVTColors = class(TPersistent) private FOwner: TBaseVirtualTree; FColors: array[0..14] of TColor; function GetColor(const Index: Integer): TColor; procedure SetColor(const Index: Integer; const Value: TColor); public constructor Create(AOwner: TBaseVirtualTree); procedure Assign(Source: TPersistent); override; published property BorderColor: TColor index 7 read GetColor write SetColor default clBtnFace; property DisabledColor: TColor index 0 read GetColor write SetColor default clBtnShadow; property DropMarkColor: TColor index 1 read GetColor write SetColor default clHighlight; property DropTargetColor: TColor index 2 read GetColor write SetColor default clHighLight; property DropTargetBorderColor: TColor index 11 read GetColor write SetColor default clHighLight; property FocusedSelectionColor: TColor index 3 read GetColor write SetColor default clHighLight; property FocusedSelectionBorderColor: TColor index 9 read GetColor write SetColor default clHighLight; property GridLineColor: TColor index 4 read GetColor write SetColor default clBtnFace; property HeaderHotColor: TColor index 14 read GetColor write SetColor default clBtnShadow; property HotColor: TColor index 8 read GetColor write SetColor default clWindowText; property SelectionRectangleBlendColor: TColor index 12 read GetColor write SetColor default clHighlight; property SelectionRectangleBorderColor: TColor index 13 read GetColor write SetColor default clHighlight; property TreeLineColor: TColor index 5 read GetColor write SetColor default clBtnShadow; property UnfocusedSelectionColor: TColor index 6 read GetColor write SetColor default clBtnFace; property UnfocusedSelectionBorderColor: TColor index 10 read GetColor write SetColor default clBtnFace; end; // For painting a node and its columns/cells a lot of information must be passed frequently around. TVTImageInfo = record Index: Integer; // Index in the associated image list. XPos, // Horizontal position in the current target canvas. YPos: Integer; // Vertical position in the current target canvas. Ghosted: Boolean; // Flag to indicate that the image must be drawn slightly lighter. Images: TCustomImageList; // The image list to be used for painting. end; TVTImageInfoIndex = ( iiNormal, iiState, iiCheck, iiOverlay ); // Options which are used when modifying the scroll offsets. TScrollUpdateOptions = set of ( suoRepaintHeader, // if suoUpdateNCArea is also set then invalidate the header suoRepaintScrollbars, // if suoUpdateNCArea is also set then repaint both scrollbars after updating them suoScrollClientArea, // scroll and invalidate the proper part of the client area suoUpdateNCArea // update non-client area (scrollbars, header) ); // Determines the look of a tree's buttons. TVTButtonStyle = ( bsRectangle, // traditional Windows look (plus/minus buttons) bsTriangle // traditional Macintosh look ); // TButtonFillMode is only used when the button style is bsRectangle and determines how to fill the interior. TVTButtonFillMode = ( fmTreeColor, // solid color, uses the tree's background color fmWindowColor, // solid color, uses clWindow fmShaded, // color gradient, Windows XP style (legacy code, use toThemeAware on Windows XP instead) fmTransparent // transparent color, use the item's background color ); TVTPaintInfo = record Canvas: TCanvas; // the canvas to paint on PaintOptions: TVTInternalPaintOptions; // a copy of the paint options passed to PaintTree Node: PVirtualNode; // the node to paint Column: TColumnIndex; // the node's column index to paint Position: TColumnPosition; // the column position of the node CellRect, // the node cell ContentRect: TRect; // the area of the cell used for the node's content NodeWidth: Integer; // the actual node width Alignment: TAlignment; // how to align within the node rectangle CaptionAlignment: TAlignment; // how to align text within the caption rectangle BidiMode: TBidiMode; // directionality to be used for painting BrushOrigin: TPoint; // the alignment for the brush used to draw dotted lines ImageInfo: array[TVTImageInfoIndex] of TVTImageInfo; // info about each possible node image end; // Method called by the Animate routine for each animation step. TVTAnimationCallback = function(Step, StepSize: Integer; Data: Pointer): Boolean of object; TVTIncrementalSearch = ( isAll, // search every node in tree, initialize if necessary isNone, // disable incremental search isInitializedOnly, // search only initialized nodes, skip others isVisibleOnly // search only visible nodes, initialize if necessary ); // Determines which direction to use when advancing nodes during an incremental search. TVTSearchDirection = ( sdForward, sdBackward ); // Determines where to start incremental searching for each key press. TVTSearchStart = ( ssAlwaysStartOver, // always use the first/last node (depending on direction) to search from ssLastHit, // use the last found node ssFocusedNode // use the currently focused node ); // Determines how to use the align member of a node. TVTNodeAlignment = ( naFromBottom, // the align member specifies amount of units (usually pixels) from top border of the node naFromTop, // align is to be measured from bottom naProportional // align is to be measure in percent of the entire node height and relative to top ); // Determines how to draw the selection rectangle used for draw selection. TVTDrawSelectionMode = ( smDottedRectangle, // same as DrawFocusRect smBlendedRectangle // alpha blending, uses special colors (see TVTColors) ); // Determines for which purpose the cell paint event is called. TVTCellPaintMode = ( cpmPaint, // painting the cell cpmGetContentMargin // getting cell content margin ); // Determines which sides of the cell content margin should be considered. TVTCellContentMarginType = ( ccmtAllSides, // consider all sides ccmtTopLeftOnly, // consider top margin and left margin only ccmtBottomRightOnly // consider bottom margin and right margin only ); TClipboardFormats = class(TStringList) private FOwner: TBaseVirtualTree; public constructor Create(AOwner: TBaseVirtualTree); virtual; function Add(const S: string): Integer; override; procedure Insert(Index: Integer; const S: string); override; property Owner: TBaseVirtualTree read FOwner; end; // ----- Event prototypes: // node enumeration TVTGetNodeProc = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean) of object; // node events TVTChangingEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; var Allowed: Boolean) of object; TVTCheckChangingEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; var NewState: TCheckState; var Allowed: Boolean) of object; TVTChangeEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode) of object; TVTStructureChangeEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Reason: TChangeReason) of object; TVTEditCancelEvent = procedure(Sender: TBaseVirtualTree; Column: TColumnIndex) of object; TVTEditChangingEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; var Allowed: Boolean) of object; TVTEditChangeEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex) of object; TVTFreeNodeEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode) of object; TVTFocusChangingEvent = procedure(Sender: TBaseVirtualTree; OldNode, NewNode: PVirtualNode; OldColumn, NewColumn: TColumnIndex; var Allowed: Boolean) of object; TVTFocusChangeEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex) of object; TVTGetImageEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer) of object; TVTGetImageExEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer; var ImageList: TCustomImageList) of object; TVTGetImageTextEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var ImageText: String) of object; TVTHotNodeChangeEvent = procedure(Sender: TBaseVirtualTree; OldNode, NewNode: PVirtualNode) of object; TVTInitChildrenEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; var ChildCount: Cardinal) of object; TVTInitNodeEvent = procedure(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates) of object; TVTPopupEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; const P: TPoint; var AskParent: Boolean; var PopupMenu: TPopupMenu) of object; TVTHelpContextEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; var HelpContext: Integer) of object; TVTCreateEditorEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; out EditLink: IVTEditLink) of object; TVTSaveNodeEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream) of object; // header/column events TVTHeaderClickEvent = procedure(Sender: TVTHeader; Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object; TVTHeaderMouseEvent = procedure(Sender: TVTHeader; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object; TVTHeaderMouseMoveEvent = procedure(Sender: TVTHeader; Shift: TShiftState; X, Y: Integer) of object; TVTBeforeHeaderHeightTrackingEvent = procedure(Sender: TVTHeader; Shift: TShiftState) of object; TVTAfterHeaderHeightTrackingEvent = procedure(Sender: TVTHeader) of object; TVTHeaderHeightTrackingEvent = procedure(Sender: TVTHeader; var P: TPoint; Shift: TShiftState; var Allowed: Boolean) of object; TVTHeaderHeightDblClickResizeEvent = procedure(Sender: TVTHeader; var P: TPoint; Shift: TShiftState; var Allowed: Boolean) of object; TVTHeaderNotifyEvent = procedure(Sender: TVTHeader; Column: TColumnIndex) of object; TVTHeaderDraggingEvent = procedure(Sender: TVTHeader; Column: TColumnIndex; var Allowed: Boolean) of object; TVTHeaderDraggedEvent = procedure(Sender: TVTHeader; Column: TColumnIndex; OldPosition: Integer) of object; TVTHeaderDraggedOutEvent = procedure(Sender: TVTHeader; Column: TColumnIndex; const DropPosition: TPoint) of object; TVTHeaderPaintEvent = procedure(Sender: TVTHeader; HeaderCanvas: TCanvas; Column: TVirtualTreeColumn; const R: TRect; Hover, Pressed: Boolean; DropMark: TVTDropMarkMode) of object; TVTHeaderPaintQueryElementsEvent = procedure(Sender: TVTHeader; var PaintInfo: THeaderPaintInfo; var Elements: THeaderPaintElements) of object; TVTAdvancedHeaderPaintEvent = procedure(Sender: TVTHeader; var PaintInfo: THeaderPaintInfo; const Elements: THeaderPaintElements) of object; TVTBeforeAutoFitColumnsEvent = procedure(Sender: TVTHeader; var SmartAutoFitType: TSmartAutoFitType) of object; TVTBeforeAutoFitColumnEvent = procedure(Sender: TVTHeader; Column: TColumnIndex; var SmartAutoFitType: TSmartAutoFitType; var Allowed: Boolean) of object; TVTAfterAutoFitColumnEvent = procedure(Sender: TVTHeader; Column: TColumnIndex) of object; TVTAfterAutoFitColumnsEvent = procedure(Sender: TVTHeader) of object; TVTColumnClickEvent = procedure (Sender: TBaseVirtualTree; Column: TColumnIndex; Shift: TShiftState) of object; TVTColumnDblClickEvent = procedure (Sender: TBaseVirtualTree; Column: TColumnIndex; Shift: TShiftState) of object; TVTColumnWidthDblClickResizeEvent = procedure(Sender: TVTHeader; Column: TColumnIndex; Shift: TShiftState; P: TPoint; var Allowed: Boolean) of object; TVTBeforeColumnWidthTrackingEvent = procedure(Sender: TVTHeader; Column: TColumnIndex; Shift: TShiftState) of object; TVTAfterColumnWidthTrackingEvent = procedure(Sender: TVTHeader; Column: TColumnIndex) of object; TVTColumnWidthTrackingEvent = procedure(Sender: TVTHeader; Column: TColumnIndex; Shift: TShiftState; var TrackPoint: TPoint; P: TPoint; var Allowed: Boolean) of object; TVTGetHeaderCursorEvent = procedure(Sender: TVTHeader; var Cursor: HCURSOR) of object; TVTBeforeGetMaxColumnWidthEvent = procedure(Sender: TVTHeader; Column: TColumnIndex; var UseSmartColumnWidth: Boolean) of object; TVTAfterGetMaxColumnWidthEvent = procedure(Sender: TVTHeader; Column: TColumnIndex; var MaxWidth: Integer) of object; TVTCanSplitterResizeColumnEvent = procedure(Sender: TVTHeader; P: TPoint; Column: TColumnIndex; var Allowed: Boolean) of object; // move, copy and node tracking events TVTNodeMovedEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode) of object; TVTNodeMovingEvent = procedure(Sender: TBaseVirtualTree; Node, Target: PVirtualNode; var Allowed: Boolean) of object; TVTNodeCopiedEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode) of object; TVTNodeCopyingEvent = procedure(Sender: TBaseVirtualTree; Node, Target: PVirtualNode; var Allowed: Boolean) of object; TVTNodeHeightTrackingEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; Shift: TShiftState; var TrackPoint: TPoint; P: TPoint; var Allowed: Boolean) of object; TVTNodeHeightDblClickResizeEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; Shift: TShiftState; P: TPoint; var Allowed: Boolean) of object; // drag'n drop/OLE events TVTCreateDragManagerEvent = procedure(Sender: TBaseVirtualTree; out DragManager: IVTDragManager) of object; TVTCreateDataObjectEvent = procedure(Sender: TBaseVirtualTree; out IDataObject: IDataObject) of object; TVTDragAllowedEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; var Allowed: Boolean) of object; TVTDragOverEvent = procedure(Sender: TBaseVirtualTree; Source: TObject; Shift: TShiftState; State: TDragState; const Pt: TPoint; Mode: TDropMode; var Effect: LongWord; var Accept: Boolean) of object; TVTDragDropEvent = procedure(Sender: TBaseVirtualTree; Source: TObject; {DataObject: IDataObject;} Formats: TFormatArray; Shift: TShiftState; const Pt: TPoint; var Effect: LongWord; Mode: TDropMode) of object; TVTRenderOLEDataEvent = procedure(Sender: TBaseVirtualTree; const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean; var Result: HRESULT) of object; TVTGetUserClipboardFormatsEvent = procedure(Sender: TBaseVirtualTree; var Formats: TFormatEtcArray) of object; // paint events TVTBeforeItemEraseEvent = procedure(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; const ItemRect: TRect; var ItemColor: TColor; var EraseAction: TItemEraseAction) of object; TVTAfterItemEraseEvent = procedure(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; const ItemRect: TRect) of object; TVTBeforeItemPaintEvent = procedure(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; const ItemRect: TRect; var CustomDraw: Boolean) of object; TVTAfterItemPaintEvent = procedure(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; const ItemRect: TRect) of object; TVTBeforeCellPaintEvent = procedure(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect) of object; TVTAfterCellPaintEvent = procedure(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const CellRect: TRect) of object; TVTPaintEvent = procedure(Sender: TBaseVirtualTree; TargetCanvas: TCanvas) of object; TVTBackgroundPaintEvent = procedure(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; const R: TRect; var Handled: Boolean) of object; TVTGetLineStyleEvent = procedure(Sender: TBaseVirtualTree; var Bits: Pointer) of object; TVTMeasureItemEvent = procedure(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; var NodeHeight: Integer) of object; // search, sort TVTCompareEvent = procedure(Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer) of object; TVTIncrementalSearchEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; const SearchText: String; var Result: Integer) of object; // miscellaneous TVTGetNodeDataSizeEvent = procedure(Sender: TBaseVirtualTree; var NodeDataSize: Integer) of object; TVTKeyActionEvent = procedure(Sender: TBaseVirtualTree; var CharCode: Word; var Shift: TShiftState; var DoDefault: Boolean) of object; TVTScrollEvent = procedure(Sender: TBaseVirtualTree; DeltaX, DeltaY: Integer) of object; TVTUpdatingEvent = procedure(Sender: TBaseVirtualTree; State: TVTUpdateState) of object; TVTGetCursorEvent = procedure(Sender: TBaseVirtualTree; var Cursor: TCursor) of object; TVTStateChangeEvent = procedure(Sender: TBaseVirtualTree; Enter, Leave: TVirtualTreeStates) of object; TVTGetCellIsEmptyEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; var IsEmpty: Boolean) of object; TVTScrollbarShowEvent = procedure(Sender: TBaseVirtualTree; Bar: Integer; Show: Boolean) of object; // Helper types for node iterations. TGetFirstNodeProc = function: PVirtualNode of object; TGetNextNodeProc = function(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode of object; // ----- TBaseVirtualTree TBaseVirtualTree = class(TCustomControl) private //FBorderStyle: TBorderStyle; FHeader: TVTHeader; FRoot: PVirtualNode; FDefaultNodeHeight, FIndent: Cardinal; FOptions: TCustomVirtualTreeOptions; FUpdateCount: Cardinal; // update stopper, updates of the tree control are only done if = 0 FSynchUpdateCount: Cardinal; // synchronizer, causes all events which are usually done via timers // to happen immediately, regardless of the normal update state FNodeDataSize: Integer; // number of bytes to allocate with each node (in addition to its base // structure and the internal data), if -1 then do callback FStates: TVirtualTreeStates; // various active/pending states the tree needs to consider FLastSelected, FFocusedNode: PVirtualNode; FEditColumn, // column to be edited (focused node) FFocusedColumn: TColumnIndex; // NoColumn if no columns are active otherwise the last hit column of // the currently focused node FHeightTrackPoint: TPoint; // Starting point of a node's height changing operation. FHeightTrackNode: PVirtualNode; // Node which height is being changed. FHeightTrackColumn: TColumnIndex; // Initial column where the height changing operation takes place. FScrollDirections: TScrollDirections; // directions to scroll client area into depending on mouse position FLastStructureChangeReason: TChangeReason; // Used for delayed structure change event. FLastStructureChangeNode, // dito FLastChangedNode, // used for delayed change event FCurrentHotNode: PVirtualNode; // Node over which the mouse is hovering. FCurrentHotColumn: TColumnIndex; // Column over which the mouse is hovering. FHotNodeButtonHit: Boolean; // Indicates wether the mouse is hovering over the hot node's button. FLastSelRect, FNewSelRect: TRect; // used while doing draw selection FHotCursor: TCursor; // can be set to additionally indicate the current hot node FHintMode: TVTHintMode; // determines the kind of the hint window FHintData: TVTHintData; // used while preparing the hint window FChangeDelay: Cardinal; // used to delay OnChange event FEditDelay: Cardinal; // determines time to elapse before a node goes into edit mode FPositionCache: TCache; // array which stores node references ordered by vertical positions // (see also DoValidateCache for more information) FVisibleCount: Cardinal; // number of currently visible nodes FStartIndex: Cardinal; // index to start validating cache from FSelection: TNodeArray; // list of currently selected nodes FSelectionCount: Integer; // number of currently selected nodes (size of FSelection might differ) FSelectionLocked: Boolean; // prevents the tree from changing the selection FRangeAnchor: PVirtualNode; // anchor node for selection with the keyboard, determines start of a // selection range FCheckNode: PVirtualNode; // node which "captures" a check event FPendingCheckState: TCheckState; // the new state the check node will get if all went fine FCheckPropagationCount: Cardinal; // nesting level of check propagation (WL, 05.02.2004) FLastSelectionLevel: Integer; // keeps the last node level for constrained multiselection FDrawSelShiftState: TShiftState; // keeps the initial shift state when the user starts selection with // the mouse FEditLink: IVTEditLink; // used to comunicate with an application defined editor FTempNodeCache: TNodeArray; // used at various places to hold temporarily a bunch of node refs. FTempNodeCount: Cardinal; // number of nodes in FTempNodeCache FBackground: TPicture; // A background image loadable at design and runtime. FMargin: Integer; // horizontal border distance FTextMargin: Integer; // space between the node's text and its horizontal bounds FBackgroundOffsetX, FBackgroundOffsetY: Integer; // used to fine tune the position of the background image FAnimationDuration: Cardinal; // specifies how long an animation shall take (expanding, hint) FWantTabs: Boolean; // If True then the tree also consumes the tab key. FNodeAlignment: TVTNodeAlignment; // determines how to interpret the align member of a node FHeaderRect: TRect; // Space which the header currently uses in the control (window coords). FLastHintRect: TRect; // Area which the mouse must leave to reshow a hint. FUpdateRect: TRect; // paint support and images FPlusBM, FMinusBM, // small bitmaps used for tree buttons FHotPlusBM, FHotMinusBM: TBitmap; // small bitmaps used for hot tree buttons FImages, // normal images in the tree FStateImages: TCustomImageList; // state images in the tree FCustomCheckImages: TBitmap; // application defined check images FCheckImageKind: TCheckImageKind; // light or dark, cross marks or tick marks FCheckImages: TBitmap; // Reference to global image list to be used for the check images. FImageChangeLink, FStateChangeLink, FCustomCheckChangeLink: TChangeLink; // connections to the image lists FOldFontChange: TNotifyEvent; // helper method pointer for tracking font changes in the off screen buffer FFontChanged: Boolean; // flag for keeping informed about font changes in the off screen buffer FColors: TVTColors; // class comprising all customizable colors in the tree FButtonStyle: TVTButtonStyle; // style of the tree buttons FButtonFillMode: TVTButtonFillMode; // for rectangular tree buttons only: how to fill them FLineStyle: TVTLineStyle; // style of the tree lines FLineMode: TVTLineMode; // tree lines or bands etc. FDottedBrush: HBRUSH; // used to paint dotted lines without special pens FSelectionCurveRadius: Cardinal; // radius for rounded selection rectangles FSelectionBlendFactor: Byte; // Determines the factor by which the selection rectangle is to be // faded if enabled. FDrawSelectionMode: TVTDrawSelectionMode; // determines the paint mode for draw selection // alignment and directionality support FAlignment: TAlignment; // default alignment of the tree if no columns are shown // drag'n drop and clipboard support FDragImageKind: TVTDragImageKind; // determines whether or not and what to show in the drag image FDragOperations: TDragOperations; // determines which operations are allowed during drag'n drop FDragThreshold: Integer; // used to determine when to actually start a drag'n drop operation FDragManager: IVTDragManager; // drag'n drop, cut'n paste FDropTargetNode: PVirtualNode; // node currently selected as drop target FLastDropMode: TDropMode; // set while dragging and used to track changes FDragSelection: TNodeArray; // temporary copy of FSelection used during drag'n drop FDragType: TVTDragType; // used to switch between OLE and VCL drag'n drop FDragImage: TVTDragImage; // drag image management FDragWidth, FDragHeight: Integer; // size of the drag image, the larger the more CPU power is needed FClipboardFormats: TClipboardFormats; // a list of clipboard format descriptions enabled for this tree FLastVCLDragTarget: PVirtualNode; // A node cache for VCL drag'n drop (keywords: DragLeave on DragDrop). FVCLDragEffect: LongWord; // A cache for VCL drag'n drop to keep the current drop effect. // scroll support FScrollBarOptions: TScrollBarOptions; // common properties of horizontal and vertical scrollbar FAutoScrollInterval: TAutoScrollInterval; // determines speed of auto scrolling FAutoScrollDelay: Cardinal; // amount of milliseconds to wait until autoscrolling becomes active FAutoExpandDelay: Cardinal; // amount of milliseconds to wait until a node is expanded if it is the // drop target FOffsetX: Integer; FOffsetY: Integer; // Determines left and top scroll offset. FEffectiveOffsetX: Integer; // Actual position of the horizontal scroll bar (varies depending on bidi mode). FRangeX, FRangeY: Cardinal; // current virtual width and height of the tree FBottomSpace: Cardinal; // Extra space below the last node. FDefaultPasteMode: TVTNodeAttachMode; // Used to determine where to add pasted nodes to. FSingletonNodeArray: TNodeArray; // Contains only one element for quick addition of single nodes // to the selection. FDragScrollStart: Cardinal; // Contains the start time when a tree does auto scrolling as drop target. // search FIncrementalSearch: TVTIncrementalSearch; // Used to determine whether and how incremental search is to be used. FSearchTimeout: Cardinal; // Number of milliseconds after which to stop incremental searching. FSearchBuffer: String; // Collects a sequence of keypresses used to do incremental searching. FLastSearchNode: PVirtualNode; // Reference to node which was last found as search fit. FSearchDirection: TVTSearchDirection; // Direction to incrementally search the tree. FSearchStart: TVTSearchStart; // Where to start iteration on each key press. // miscellanous FTotalInternalDataSize: Cardinal; // Cache of the sum of the necessary internal data size for all tree // classes derived from this base class. FPanningWindow: TVirtualPanningWindow; // Helper window for wheel panning FLastClickPos: TPoint; // Used for retained drag start and wheel mouse scrolling. FOperationCount: Cardinal; // Counts how many nested long-running operations are in progress. FOperationCanceled: Boolean; // Used to indicate that a long-running operation should be canceled. {$ifdef EnableAccessible} // MSAA support FAccessible: IAccessible; // The IAccessible interface to the window itself. FAccessibleItem: IAccessible; // The IAccessible to the item that currently has focus. FAccessibleName: string; // The name the window is given for screen readers. {$endif} // export FOnBeforeNodeExport: TVTNodeExportEvent; // called before exporting a node FOnNodeExport: TVTNodeExportEvent; FOnAfterNodeExport: TVTNodeExportEvent; // called after exporting a node FOnBeforeColumnExport: TVTColumnExportEvent; // called before exporting a column FOnColumnExport: TVTColumnExportEvent; FOnAfterColumnExport: TVTColumnExportEvent; // called after exporting a column FOnBeforeTreeExport: TVTTreeExportEvent; // called before starting the export FOnAfterTreeExport: TVTTreeExportEvent; // called after finishing the export FOnBeforeHeaderExport: TVTTreeExportEvent; // called before exporting the header FOnAfterHeaderExport: TVTTreeExportEvent; // called after exporting the header // common events FOnChange: TVTChangeEvent; // selection change FOnStructureChange: TVTStructureChangeEvent; // structural change like adding nodes etc. FOnInitChildren: TVTInitChildrenEvent; // called when a node's children are needed (expanding etc.) FOnInitNode: TVTInitNodeEvent; // called when a node needs to be initialized (child count etc.) FOnFreeNode: TVTFreeNodeEvent; // called when a node is about to be destroyed, user data can and should // be freed in this event FOnGetImage: TVTGetImageEvent; // Used to retrieve the image index of a given node. FOnGetImageEx: TVTGetImageExEvent; // Used to retrieve the image index of a given node along with a custom // image list. FOnGetImageText: TVTGetImageTextEvent; // Used to retrieve the image alternative text of a given node. // Used by the accessibility interface to provide useful text for status images. FOnHotChange: TVTHotNodeChangeEvent; // called when the current "hot" node (that is, the node under the mouse) // changes and hot tracking is enabled FOnExpanding, // called just before a node is expanded FOnCollapsing: TVTChangingEvent; // called just before a node is collapsed FOnChecking: TVTCheckChangingEvent; // called just before a node's check state is changed FOnExpanded, // called after a node has been expanded FOnCollapsed, // called after a node has been collapsed FOnChecked: TVTChangeEvent; // called after a node's check state has been changed FOnResetNode: TVTChangeEvent; // called when a node is set to be uninitialized FOnNodeMoving: TVTNodeMovingEvent; // called just before a node is moved from one parent node to another // (this can be cancelled) FOnNodeMoved: TVTNodeMovedEvent; // called after a node and its children have been moved to another // parent node (probably another tree, but within the same application) FOnNodeCopying: TVTNodeCopyingEvent; // called when an node is copied to another parent node (probably in // another tree, but within the same application, can be cancelled) FOnNodeHeightTracking: TVTNodeHeightTrackingEvent; // called when a node's height is being changed via mouse FOnNodeHeightDblClickResize: TVTNodeHeightDblClickResizeEvent; // called when a node's vertical splitter is double clicked FOnNodeCopied: TVTNodeCopiedEvent; // call after a node has been copied FOnEditing: TVTEditChangingEvent; // called just before a node goes into edit mode FOnEditCancelled: TVTEditCancelEvent; // called when editing has been cancelled FOnEdited: TVTEditChangeEvent; // called when editing has successfully been finished FOnFocusChanging: TVTFocusChangingEvent; // called when the focus is about to go to a new node and/or column // (can be cancelled) FOnFocusChanged: TVTFocusChangeEvent; // called when the focus goes to a new node and/or column FOnGetPopupMenu: TVTPopupEvent; // called when the popup for a node or the header needs to be shown FOnGetHelpContext: TVTHelpContextEvent; // called when a node specific help theme should be called FOnCreateEditor: TVTCreateEditorEvent; // called when a node goes into edit mode, this allows applications // to supply their own editor FOnLoadNode, // called after a node has been loaded from a stream (file, clipboard, // OLE drag'n drop) to allow an application to load their own data // saved in OnSaveNode FOnSaveNode: TVTSaveNodeEvent; // called when a node needs to be serialized into a stream // (see OnLoadNode) to give the application the opportunity to save // their node specific, persistent data (note: never save memory // references) // header/column mouse events FOnAfterAutoFitColumn: TVTAfterAutoFitColumnEvent; FOnAfterAutoFitColumns: TVTAfterAutoFitColumnsEvent; FOnBeforeAutoFitColumns: TVTBeforeAutoFitColumnsEvent; FOnBeforeAutoFitColumn: TVTBeforeAutoFitColumnEvent; FOnHeaderClick, // mouse events for the header, just like those for a control FOnHeaderImageClick, FOnHeaderCheckBoxClick: TVTHeaderClickEvent; FOnHeaderDblClick: TVTHeaderClickEvent; FOnAfterHeaderHeightTracking: TVTAfterHeaderHeightTrackingEvent; FOnBeforeHeaderHeightTracking: TVTBeforeHeaderHeightTrackingEvent; FOnHeaderHeightTracking: TVTHeaderHeightTrackingEvent; FOnHeaderHeightDblClickResize: TVTHeaderHeightDblClickResizeEvent; FOnHeaderMouseDown, FOnHeaderMouseUp: TVTHeaderMouseEvent; FOnHeaderMouseMove: TVTHeaderMouseMoveEvent; FOnAfterGetMaxColumnWidth: TVTAfterGetMaxColumnWidthEvent; FOnBeforeGetMaxColumnWidth: TVTBeforeGetMaxColumnWidthEvent; FOnColumnClick: TVTColumnClickEvent; FOnColumnDblClick: TVTColumnDblClickEvent; FOnColumnResize: TVTHeaderNotifyEvent; FOnColumnWidthDblClickResize: TVTColumnWidthDblClickResizeEvent; FOnAfterColumnWidthTracking: TVTAfterColumnWidthTrackingEvent; FOnBeforeColumnWidthTracking: TVTBeforeColumnWidthTrackingEvent; FOnColumnWidthTracking: TVTColumnWidthTrackingEvent; FOnGetHeaderCursor: TVTGetHeaderCursorEvent; // triggered to allow the app. to use customized cursors for the header FOnCanSplitterResizeColumn: TVTCanSplitterResizeColumnEvent; // paint events FOnAfterPaint, // triggered when the tree has entirely been painted FOnBeforePaint: TVTPaintEvent; // triggered when the tree is about to be painted FOnAfterItemPaint: TVTAfterItemPaintEvent; // triggered after an item has been painted FOnBeforeItemPaint: TVTBeforeItemPaintEvent; // triggered when an item is about to be painted FOnBeforeItemErase: TVTBeforeItemEraseEvent; // triggered when an item's background is about to be erased FOnAfterItemErase: TVTAfterItemEraseEvent; // triggered after an item's background has been erased FOnAfterCellPaint: TVTAfterCellPaintEvent; // triggered after a column of an item has been painted FOnBeforeCellPaint: TVTBeforeCellPaintEvent; // triggered when a column of an item is about to be painted FOnHeaderDraw: TVTHeaderPaintEvent; // Used when owner draw is enabled for the header and a column is set // to owner draw mode. FOnHeaderDrawQueryElements: TVTHeaderPaintQueryElementsEvent; // Used for advanced header painting to query the // application for the elements, which are drawn by it and which should // be drawn by the tree. FOnAdvancedHeaderDraw: TVTAdvancedHeaderPaintEvent; // Used when owner draw is enabled for the header and a column // is set to owner draw mode. But only if OnHeaderDrawQueryElements // returns at least one element to be drawn by the application. // In this case OnHeaderDraw is not used. FOnGetLineStyle: TVTGetLineStyleEvent; // triggered when a custom line style is used and the pattern brush // needs to be build FOnPaintBackground: TVTBackgroundPaintEvent; // triggered if a part of the tree's background must be erased which is // not covered by any node FOnMeasureItem: TVTMeasureItemEvent; // Triggered when a node is about to be drawn and its height was not yet // determined by the application. // drag'n drop events FOnCreateDragManager: TVTCreateDragManagerEvent; // called to allow for app./descendant defined drag managers FOnCreateDataObject: TVTCreateDataObjectEvent; // called to allow for app./descendant defined data objects FOnDragAllowed: TVTDragAllowedEvent; // used to get permission for manual drag in mouse down FOnDragOver: TVTDragOverEvent; // called for every mouse move FOnDragDrop: TVTDragDropEvent; // called on release of mouse button (if drop was allowed) FOnHeaderDragged: TVTHeaderDraggedEvent; // header (column) drag'n drop FOnHeaderDraggedOut: TVTHeaderDraggedOutEvent; // header (column) drag'n drop, which did not result in a valid drop. FOnHeaderDragging: TVTHeaderDraggingEvent; // header (column) drag'n drop FOnRenderOLEData: TVTRenderOLEDataEvent; // application/descendant defined clipboard formats FOnGetUserClipboardFormats: TVTGetUserClipboardFormatsEvent; // gives application/descendants the opportunity to // add own clipboard formats on the fly // miscellanous events FOnGetNodeDataSize: TVTGetNodeDataSizeEvent; // Called if NodeDataSize is -1. FOnKeyAction: TVTKeyActionEvent; // Used to selectively prevent key actions (full expand on Ctrl+'+' etc.). FOnScroll: TVTScrollEvent; // Called when one or both paint offsets changed. FOnUpdating: TVTUpdatingEvent; // Called from BeginUpdate, EndUpdate, BeginSynch and EndSynch. FOnGetCursor: TVTGetCursorEvent; // Called to allow the app. to set individual cursors. FOnStateChange: TVTStateChangeEvent; // Called whenever a state in the tree changes. FOnGetCellIsEmpty: TVTGetCellIsEmptyEvent; // Called when the tree needs to know if a cell is empty. FOnShowScrollbar: TVTScrollbarShowEvent; // Called when a scrollbar is changed in its visibility. // search, sort FOnCompareNodes: TVTCompareEvent; // used during sort FOnIncrementalSearch: TVTIncrementalSearchEvent; // triggered on every key press (not key down) procedure AdjustCoordinatesByIndent(var PaintInfo: TVTPaintInfo; Indent: Integer); procedure AdjustImageBorder(ImageWidth, ImageHeight: Integer; BidiMode: TBidiMode; VAlign: Integer; var R: TRect; var ImageInfo: TVTImageInfo); procedure AdjustTotalCount(Node: PVirtualNode; Value: Integer; Relative: Boolean = False); procedure AdjustTotalHeight(Node: PVirtualNode; Value: Integer; Relative: Boolean = False); function CalculateCacheEntryCount: Integer; procedure CalculateVerticalAlignments(ShowImages, ShowStateImages: Boolean; Node: PVirtualNode; out VAlign, VButtonAlign: Integer); function ChangeCheckState(Node: PVirtualNode; Value: TCheckState): Boolean; function CollectSelectedNodesLTR(MainColumn, NodeLeft, NodeRight: Integer; Alignment: TAlignment; OldRect: TRect; const NewRect: TRect): Boolean; function CollectSelectedNodesRTL(MainColumn, NodeLeft, NodeRight: Integer; Alignment: TAlignment; OldRect: TRect; const NewRect: TRect): Boolean; procedure ClearNodeBackground(const PaintInfo: TVTPaintInfo; UseBackground, Floating: Boolean; R: TRect); function CompareNodePositions(Node1, Node2: PVirtualNode; ConsiderChildrenAbove: Boolean = False): Integer; function DetermineLineImageAndSelectLevel(Node: PVirtualNode; out LineImage: TLineImage): Integer; procedure DrawLineImage(const PaintInfo: TVTPaintInfo; X, Y, H, VAlign: Integer; Style: TVTLineType; Reverse: Boolean); function FindInPositionCache(Node: PVirtualNode; var CurrentPos: Cardinal): PVirtualNode; overload; function FindInPositionCache(Position: Cardinal; var CurrentPos: Cardinal): PVirtualNode; overload; procedure FixupTotalCount(Node: PVirtualNode); procedure FixupTotalHeight(Node: PVirtualNode); function GetBottomNode: PVirtualNode; function GetCheckedCount: Integer; function GetCheckState(Node: PVirtualNode): TCheckState; function GetCheckType(Node: PVirtualNode): TCheckType; function GetChildCount(Node: PVirtualNode): Cardinal; function GetChildrenInitialized(Node: PVirtualNode): Boolean; function GetCutCopyCount: Integer; function GetDisabled(Node: PVirtualNode): Boolean; function GetDragManager: IVTDragManager; function GetExpanded(Node: PVirtualNode): Boolean; function GetFullyVisible(Node: PVirtualNode): Boolean; function GetHasChildren(Node: PVirtualNode): Boolean; function GetMultiline(Node: PVirtualNode): Boolean; function GetNodeHeight(Node: PVirtualNode): Cardinal; function GetNodeParent(Node: PVirtualNode): PVirtualNode; function GetOffsetXY: TPoint; function GetRootNodeCount: Cardinal; function GetSelected(Node: PVirtualNode): Boolean; function GetTopNode: PVirtualNode; function GetTotalCount: Cardinal; function GetVerticalAlignment(Node: PVirtualNode): Byte; function GetVisible(Node: PVirtualNode): Boolean; function GetVisiblePath(Node: PVirtualNode): Boolean; procedure HandleClickSelection(LastFocused, NewNode: PVirtualNode; Shift: TShiftState; DragPending: Boolean); function HandleDrawSelection(X, Y: Integer): Boolean; function HasVisibleNextSibling(Node: PVirtualNode): Boolean; function HasVisiblePreviousSibling(Node: PVirtualNode): Boolean; procedure ImageListChange(Sender: TObject); procedure InitializeFirstColumnValues(var PaintInfo: TVTPaintInfo); procedure InitRootNode(OldSize: Cardinal = 0); procedure InterruptValidation; function IsFirstVisibleChild(Parent, Node: PVirtualNode): Boolean; function IsLastVisibleChild(Parent, Node: PVirtualNode): Boolean; procedure LimitPaintingToArea(Canvas: TCanvas; ClipRect: TRect; VisibleRegion: HRGN = 0); //lcl procedure LoadPanningCursors; function MakeNewNode: PVirtualNode; {$ifdef PACKARRAYPASCAL} function PackArray(const TheArray: TNodeArray; Count: Integer): Integer; {$else} function PackArray(TheArray: TNodeArray; Count: Integer): Integer; {$endif} procedure PrepareBitmaps(NeedButtons, NeedLines: Boolean); procedure SetAlignment(const Value: TAlignment); procedure SetAnimationDuration(const Value: Cardinal); procedure SetBackground(const Value: TPicture); procedure SetBackgroundOffset(const Index, Value: Integer); procedure SetBottomNode(Node: PVirtualNode); procedure SetBottomSpace(const Value: Cardinal); procedure SetButtonFillMode(const Value: TVTButtonFillMode); procedure SetButtonStyle(const Value: TVTButtonStyle); procedure SetCheckImageKind(Value: TCheckImageKind); procedure SetCheckState(Node: PVirtualNode; Value: TCheckState); procedure SetCheckType(Node: PVirtualNode; Value: TCheckType); procedure SetChildCount(Node: PVirtualNode; NewChildCount: Cardinal); procedure SetClipboardFormats(const Value: TClipboardFormats); procedure SetColors(const Value: TVTColors); procedure SetCustomCheckImages(const Value: TBitmap); procedure SetDefaultNodeHeight(Value: Cardinal); procedure SetDisabled(Node: PVirtualNode; Value: Boolean); procedure SetExpanded(Node: PVirtualNode; Value: Boolean); procedure SetFocusedColumn(Value: TColumnIndex); procedure SetFocusedNode(Value: PVirtualNode); procedure SetFullyVisible(Node: PVirtualNode; Value: Boolean); procedure SetHasChildren(Node: PVirtualNode; Value: Boolean); procedure SetHeader(const Value: TVTHeader); procedure SetImages(const Value: TCustomImageList); procedure SetIndent(Value: Cardinal); procedure SetLineMode(const Value: TVTLineMode); procedure SetLineStyle(const Value: TVTLineStyle); procedure SetMargin(Value: Integer); procedure SetMultiline(Node: PVirtualNode; const Value: Boolean); procedure SetNodeAlignment(const Value: TVTNodeAlignment); procedure SetNodeDataSize(Value: Integer); procedure SetNodeHeight(Node: PVirtualNode; Value: Cardinal); procedure SetNodeParent(Node: PVirtualNode; const Value: PVirtualNode); procedure SetOffsetX(const Value: Integer); procedure SetOffsetXY(const Value: TPoint); procedure SetOffsetY(const Value: Integer); procedure SetOptions(const Value: TCustomVirtualTreeOptions); procedure SetRootNodeCount(Value: Cardinal); procedure SetScrollBarOptions(Value: TScrollBarOptions); procedure SetSearchOption(const Value: TVTIncrementalSearch); procedure SetSelected(Node: PVirtualNode; Value: Boolean); procedure SetSelectionCurveRadius(const Value: Cardinal); procedure SetStateImages(const Value: TCustomImageList); procedure SetTextMargin(Value: Integer); procedure SetTopNode(Node: PVirtualNode); procedure SetUpdateState(Updating: Boolean); procedure SetVerticalAlignment(Node: PVirtualNode; Value: Byte); procedure SetVisible(Node: PVirtualNode; Value: Boolean); procedure SetVisiblePath(Node: PVirtualNode; Value: Boolean); procedure StaticBackground(Source: TBitmap; Target: TCanvas; const Offset: TPoint; const R: TRect); procedure TileBackground(Source: TBitmap; Target: TCanvas; const Offset: TPoint; R: TRect); function ToggleCallback(Step, StepSize: Integer; Data: Pointer): Boolean; protected procedure CMColorChange(var Message: TLMessage); message CM_COLORCHANGED; procedure CMBiDiModeChanged(var Message: TLMessage); message CM_BIDIMODECHANGED; procedure CMDenySubclassing(var Message: TLMessage); message CM_DENYSUBCLASSING; //procedure CMDrag(var Message: TCMDrag); message CM_DRAG; procedure CMFontChanged(var Message: TLMessage); message CM_FONTCHANGED; procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW; procedure CMMouseLeave(var Message: TLMessage); message CM_MOUSELEAVE; procedure CMMouseWheel(var Message: TLMMouseEvent); message LM_MOUSEWHEEL; {$ifdef EnableNativeTVM} procedure TVMGetItem(var Message: TLMessage); message TVM_GETITEM; procedure TVMGetItemRect(var Message: TLMessage); message TVM_GETITEMRECT; procedure TVMGetNextItem(var Message: TLMessage); message TVM_GETNEXTITEM; {$endif} procedure WMCancelMode(var Message: TLMNoParams); message LM_CANCELMODE; procedure WMChangeState(var Message: TLMessage); message WM_CHANGESTATE; procedure WMChar(var Message: TLMChar); message LM_CHAR; procedure WMContextMenu(var Message: TLMContextMenu); message LM_CONTEXTMENU; procedure WMCopy(var Message: TLMNoParams); message LM_COPY; procedure WMCut(var Message: TLMNoParams); message LM_CUT; procedure WMEnable(var Message: TLMNoParams); message LM_ENABLE; procedure WMEraseBkgnd(var Message: TLMEraseBkgnd); message LM_ERASEBKGND; procedure WMGetDlgCode(var Message: TLMNoParams); message LM_GETDLGCODE; {$ifdef EnableAccessible} procedure WMGetObject(var Message: TLMessage);{ message WM_GETOBJECT;} {$endif} procedure WMHScroll(var Message: TLMHScroll); message LM_HSCROLL; procedure WMKeyDown(var Message: TLMKeyDown); message LM_KEYDOWN; procedure WMKeyUp(var Message: TLMKeyUp); message LM_KEYUP; procedure WMKillFocus(var Msg: TLMKillFocus); message LM_KILLFOCUS; procedure WMLButtonDblClk(var Message: TLMLButtonDblClk); message LM_LBUTTONDBLCLK; procedure WMLButtonDown(var Message: TLMLButtonDown); message LM_LBUTTONDOWN; procedure WMLButtonUp(var Message: TLMLButtonUp); message LM_LBUTTONUP; procedure WMMButtonDblClk(var Message: TLMMButtonDblClk); message LM_MBUTTONDBLCLK; procedure WMMButtonDown(var Message: TLMMButtonDown); message LM_MBUTTONDOWN; procedure WMMButtonUp(var Message: TLMMButtonUp); message LM_MBUTTONUP; {$ifdef EnableNCFunctions} procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE; procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; procedure WMNCPaint(var Message: TRealWMNCPaint); message WM_NCPAINT; {$endif} procedure WMPaint(var Message: TLMPaint); message LM_PAINT; procedure WMPaste(var Message: TLMNoParams); message LM_PASTE; {$ifdef EnablePrintFunctions} procedure WMPrint(var Message: TWMPrint); message WM_PRINT; procedure WMPrintClient(var Message: TWMPrintClient); message WM_PRINTCLIENT; {$endif} procedure WMRButtonDblClk(var Message: TLMRButtonDblClk); message LM_RBUTTONDBLCLK; procedure WMRButtonDown(var Message: TLMRButtonDown); message LM_RBUTTONDOWN; procedure WMRButtonUp(var Message: TLMRButtonUp); message LM_RBUTTONUP; procedure WMSetFocus(var Msg: TLMSetFocus); message LM_SETFOCUS; procedure WMSize(var Message: TLMSize); message LM_SIZE; procedure WMTimer(var Message: TLMTimer); message LM_TIMER; {$ifdef ThemeSupport} {$ifdef Windows} procedure WMThemeChanged(var Message: TLMessage); message WM_THEMECHANGED; {$endif} {$endif ThemeSupport} procedure WMVScroll(var Message: TLMVScroll); message LM_VSCROLL; procedure AddToSelection(Node: PVirtualNode); overload; virtual; procedure AddToSelection(const NewItems: TNodeArray; NewLength: Integer; ForceInsert: Boolean = False); overload; virtual; procedure AdjustPaintCellRect(var PaintInfo: TVTPaintInfo; out NextNonEmpty: TColumnIndex); virtual; procedure AdjustPanningCursor(X, Y: Integer); virtual; procedure AdviseChangeEvent(StructureChange: Boolean; Node: PVirtualNode; Reason: TChangeReason); virtual; function AllocateInternalDataArea(Size: Cardinal): Cardinal; virtual; procedure Animate(Steps, Duration: Cardinal; Callback: TVTAnimationCallback; Data: Pointer); virtual; procedure BeginOperation; function CalculateSelectionRect(X, Y: Integer): Boolean; virtual; function CanAutoScroll: Boolean; virtual; function CanScroll(const ClientMousePos: TPoint): Boolean; virtual; function CanShowDragImage: Boolean; virtual; procedure Change(Node: PVirtualNode); virtual; procedure ChangeScale(M, D: Integer); override; //lcl procedure CheckImageListNeeded; function CheckParentCheckState(Node: PVirtualNode; NewCheckState: TCheckState): Boolean; virtual; procedure ClearTempCache; virtual; function ColumnIsEmpty(Node: PVirtualNode; Column: TColumnIndex): Boolean; virtual; function ComputeRTLOffset(ExcludeScrollbar: Boolean = False): Integer; virtual; function CountLevelDifference(Node1, Node2: PVirtualNode): Integer; virtual; function CountVisibleChildren(Node: PVirtualNode): Cardinal; virtual; procedure CreateParams(var Params: TCreateParams); override; procedure CreateWnd; override; procedure DestroyHandle; override; procedure DetermineHiddenChildrenFlag(Node: PVirtualNode); virtual; procedure DetermineHiddenChildrenFlagAllNodes; virtual; procedure DetermineHitPositionLTR(var HitInfo: THitInfo; Offset, Right: Integer; Alignment: TAlignment); virtual; procedure DetermineHitPositionRTL(var HitInfo: THitInfo; Offset, Right: Integer; Alignment: TAlignment); virtual; function DetermineNextCheckState(CheckType: TCheckType; CheckState: TCheckState): TCheckState; virtual; function DetermineScrollDirections(X, Y: Integer): TScrollDirections; virtual; procedure DoAdvancedHeaderDraw(var PaintInfo: THeaderPaintInfo; const Elements: THeaderPaintElements); virtual; procedure DoAfterCellPaint(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const CellRect: TRect); virtual; procedure DoAfterItemErase(Canvas: TCanvas; Node: PVirtualNode; const ItemRect: TRect); virtual; procedure DoAfterItemPaint(Canvas: TCanvas; Node: PVirtualNode; const ItemRect: TRect); virtual; procedure DoAfterPaint(Canvas: TCanvas); virtual; procedure DoAutoScroll(X, Y: Integer); virtual; procedure DoAutoSize; override; function DoBeforeDrag(Node: PVirtualNode; Column: TColumnIndex): Boolean; virtual; procedure DoBeforeCellPaint(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect); virtual; procedure DoBeforeItemErase(Canvas: TCanvas; Node: PVirtualNode; const ItemRect: TRect; var Color: TColor; var EraseAction: TItemEraseAction); virtual; function DoBeforeItemPaint(Canvas: TCanvas; Node: PVirtualNode; const ItemRect: TRect): Boolean; virtual; procedure DoBeforePaint(Canvas: TCanvas); virtual; function DoCancelEdit: Boolean; virtual; procedure DoCanEdit(Node: PVirtualNode; Column: TColumnIndex; var Allowed: Boolean); virtual; procedure DoChange(Node: PVirtualNode); virtual; procedure DoCheckClick(Node: PVirtualNode; NewCheckState: TCheckState); virtual; procedure DoChecked(Node: PVirtualNode); virtual; function DoChecking(Node: PVirtualNode; var NewCheckState: TCheckState): Boolean; virtual; procedure DoCollapsed(Node: PVirtualNode); virtual; function DoCollapsing(Node: PVirtualNode): Boolean; virtual; procedure DoColumnClick(Column: TColumnIndex; Shift: TShiftState); virtual; procedure DoColumnDblClick(Column: TColumnIndex; Shift: TShiftState); virtual; procedure DoColumnResize(Column: TColumnIndex); virtual; function DoCompare(Node1, Node2: PVirtualNode; Column: TColumnIndex): Integer; virtual; function DoCreateDataObject: IDataObject; virtual; function DoCreateDragManager: IVTDragManager; virtual; function DoCreateEditor(Node: PVirtualNode; Column: TColumnIndex): IVTEditLink; virtual; procedure DoDragging(P: TPoint); virtual; procedure DoDragExpand; virtual; function DoDragMsg(ADragMessage: TDragMessage; APosition: TPoint; ADragObject: TDragObject; ATarget: TControl; ADocking: Boolean): LRESULT; override; function DoDragOver(Source: TObject; Shift: TShiftState; State: TDragState; const Pt: TPoint; Mode: TDropMode; var Effect: LongWord): Boolean; virtual; procedure DoDragDrop(Source: TObject; DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState; const Pt: TPoint; var Effect: LongWord; Mode: TDropMode); virtual; procedure DoEdit; virtual; procedure DoEndDrag(Target: TObject; X, Y: Integer); override; function DoEndEdit: Boolean; virtual; procedure DoExpanded(Node: PVirtualNode); virtual; function DoExpanding(Node: PVirtualNode): Boolean; virtual; procedure DoFocusChange(Node: PVirtualNode; Column: TColumnIndex); virtual; function DoFocusChanging(OldNode, NewNode: PVirtualNode; OldColumn, NewColumn: TColumnIndex): Boolean; virtual; procedure DoFocusNode(Node: PVirtualNode; Ask: Boolean); virtual; procedure DoFreeNode(Node: PVirtualNode); virtual; function DoGetCellContentMargin(Node: PVirtualNode; Column: TColumnIndex; CellContentMarginType: TVTCellContentMarginType = ccmtAllSides; Canvas: TCanvas = nil): TPoint; virtual; procedure DoGetCursor(var Cursor: TCursor); virtual; procedure DoGetHeaderCursor(var Cursor: HCURSOR); virtual; function DoGetImageIndex(Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var Index: Integer): TCustomImageList; virtual; procedure DoGetImageText(Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var ImageText: String); virtual; procedure DoGetLineStyle(var Bits: Pointer); virtual; function DoGetNodeHint(Node: PVirtualNode; Column: TColumnIndex; var LineBreakStyle: TVTTooltipLineBreakStyle): String; virtual; function DoGetNodeTooltip(Node: PVirtualNode; Column: TColumnIndex; var LineBreakStyle: TVTTooltipLineBreakStyle): String; virtual; function DoGetNodeWidth(Node: PVirtualNode; Column: TColumnIndex; Canvas: TCanvas = nil): Integer; virtual; function DoGetPopupMenu(Node: PVirtualNode; Column: TColumnIndex; const Position: TPoint): TPopupMenu; virtual; procedure DoGetUserClipboardFormats(var Formats: TFormatEtcArray); virtual; procedure DoHeaderClick(Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); virtual; procedure DoHeaderDblClick(Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); virtual; procedure DoHeaderImageClick(Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); virtual; procedure DoHeaderCheckBoxClick(Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); virtual; procedure DoHeaderDragged(Column: TColumnIndex; OldPosition: TColumnPosition); virtual; procedure DoHeaderDraggedOut(Column: TColumnIndex; const DropPosition: TPoint); virtual; function DoHeaderDragging(Column: TColumnIndex): Boolean; virtual; procedure DoHeaderDraw(Canvas: TCanvas; Column: TVirtualTreeColumn; const R: TRect; Hover, Pressed: Boolean; DropMark: TVTDropMarkMode); virtual; procedure DoHeaderDrawQueryElements(var PaintInfo: THeaderPaintInfo; var Elements: THeaderPaintElements); virtual; procedure DoHeaderMouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); virtual; procedure DoHeaderMouseMove(Shift: TShiftState; X, Y: Integer); virtual; procedure DoHeaderMouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); virtual; procedure DoHotChange(Old, New: PVirtualNode); virtual; function DoIncrementalSearch(Node: PVirtualNode; const Text: String): Integer; virtual; procedure DoInitChildren(Node: PVirtualNode; var ChildCount: Cardinal); virtual; procedure DoInitNode(Parent, Node: PVirtualNode; var InitStates: TVirtualNodeInitStates); virtual; function DoKeyAction(var CharCode: Word; var Shift: TShiftState): Boolean; virtual; procedure DoLoadUserData(Node: PVirtualNode; Stream: TStream); virtual; procedure DoMeasureItem(TargetCanvas: TCanvas; Node: PVirtualNode; var NodeHeight: Integer); virtual; procedure DoNodeCopied(Node: PVirtualNode); virtual; function DoNodeCopying(Node, NewParent: PVirtualNode): Boolean; virtual; function DoNodeHeightDblClickResize(Node: PVirtualNode; Column: TColumnIndex; Shift: TShiftState; P: TPoint): Boolean; virtual; function DoNodeHeightTracking(Node: PVirtualNode; Column: TColumnIndex; Shift: TShiftState; var TrackPoint: TPoint; P: TPoint): Boolean; virtual; procedure DoNodeMoved(Node: PVirtualNode); virtual; function DoNodeMoving(Node, NewParent: PVirtualNode): Boolean; virtual; function DoPaintBackground(Canvas: TCanvas; const R: TRect): Boolean; virtual; procedure DoPaintDropMark(Canvas: TCanvas; Node: PVirtualNode; const R: TRect); virtual; procedure DoPaintNode(var PaintInfo: TVTPaintInfo); virtual; procedure DoPopupMenu(Node: PVirtualNode; Column: TColumnIndex; const Position: TPoint); virtual; function DoRenderOLEData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean): HRESULT; virtual; procedure DoReset(Node: PVirtualNode); virtual; procedure DoSaveUserData(Node: PVirtualNode; Stream: TStream); virtual; procedure DoScroll(DeltaX, DeltaY: Integer); virtual; function DoSetOffsetXY(Value: TPoint; Options: TScrollUpdateOptions; ClipRect: PRect = nil): Boolean; virtual; procedure DoShowScrollbar(Bar: Integer; Show: Boolean); virtual; procedure DoStartDrag(var DragObject: TDragObject); override; procedure DoStateChange(Enter: TVirtualTreeStates; Leave: TVirtualTreeStates = []); virtual; procedure DoStructureChange(Node: PVirtualNode; Reason: TChangeReason); virtual; procedure DoTimerScroll; virtual; procedure DoUpdating(State: TVTUpdateState); virtual; function DoValidateCache: Boolean; virtual; procedure DragAndDrop(AllowedEffects: LongWord; DataObject: IDataObject; DragEffect: LongWord); virtual; procedure DragCanceled; override; function DragDrop(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; reintroduce; virtual; function DragEnter(KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; virtual; procedure DragFinished; virtual; procedure DragLeave; virtual; function DragOver(Source: TObject; KeyState: LongWord; DragState: TDragState; Pt: TPoint; var Effect: LongWord): HResult; reintroduce; virtual; procedure DrawDottedHLine(const PaintInfo: TVTPaintInfo; Left, Right, Top: Integer); virtual; procedure DrawDottedVLine(const PaintInfo: TVTPaintInfo; Top, Bottom, Left: Integer); virtual; procedure EndOperation; function FindNodeInSelection(P: PVirtualNode; out Index: Integer; LowBound, HighBound: Integer): Boolean; virtual; procedure FinishChunkHeader(Stream: TStream; StartPos, EndPos: Integer); virtual; procedure FontChanged(AFont: TObject); virtual; function GetBorderDimensions: TSize; virtual; function GetCheckImage(Node: PVirtualNode; ImgCheckType: TCheckType = ctNone; ImgCheckState: TCheckState = csUncheckedNormal; ImgEnabled: Boolean = False): Integer; virtual; function GetClientRect: TRect; override; function GetColumnClass: TVirtualTreeColumnClass; virtual; function GetHeaderClass: TVTHeaderClass; virtual; function GetHintWindowClass: THintWindowClass; virtual; procedure GetImageIndex(var Info: TVTPaintInfo; Kind: TVTImageKind; InfoIndex: TVTImageInfoIndex; DefaultImages: TCustomImageList); virtual; function GetMaxRightExtend: Cardinal; virtual; procedure GetNativeClipboardFormats(var Formats: TFormatEtcArray); virtual; function GetOperationCanceled: Boolean; function GetOptionsClass: TTreeOptionsClass; virtual; function GetTreeFromDataObject(const DataObject: IDataObject): TBaseVirtualTree; virtual; procedure HandleHotTrack(X, Y: Integer); virtual; procedure HandleIncrementalSearch(CharCode: Word); virtual; procedure HandleMouseDblClick(var Message: TLMMouse; const HitInfo: THitInfo); virtual; procedure HandleMouseDown(var Message: TLMMouse; var HitInfo: THitInfo); virtual; procedure HandleMouseUp(Keys: PtrUInt; const HitInfo: THitInfo); virtual; function HasImage(Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex): Boolean; virtual; function HasPopupMenu(Node: PVirtualNode; Column: TColumnIndex; const Pos: TPoint): Boolean; virtual; procedure InitChildren(Node: PVirtualNode); virtual; procedure InitNode(Node: PVirtualNode); virtual; procedure InternalAddFromStream(Stream: TStream; Version: Integer; Node: PVirtualNode); virtual; function InternalAddToSelection(Node: PVirtualNode; ForceInsert: Boolean): Boolean; overload; function InternalAddToSelection(const NewItems: TNodeArray; NewLength: Integer; ForceInsert: Boolean): Boolean; overload; procedure InternalCacheNode(Node: PVirtualNode); virtual; procedure InternalClearSelection; virtual; procedure InternalConnectNode(Node, Destination: PVirtualNode; Target: TBaseVirtualTree; Mode: TVTNodeAttachMode); virtual; function InternalData(Node: PVirtualNode): Pointer; procedure InternalDisconnectNode(Node: PVirtualNode; KeepFocus: Boolean; Reindex: Boolean = True); virtual; function InternalGetNodeAt(X, Y: Integer): PVirtualNode; overload; function InternalGetNodeAt(X, Y: Integer; Relative: Boolean; var NodeTop: Integer): PVirtualNode; overload; procedure InternalRemoveFromSelection(Node: PVirtualNode); virtual; procedure InvalidateCache; procedure Loaded; override; procedure MainColumnChanged; virtual; procedure MarkCutCopyNodes; virtual; procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; procedure Notification(AComponent: TComponent; Operation: TOperation); override; {$ifdef EnableNCFunctions} procedure OriginalWMNCPaint(DC: HDC); virtual; {$endif} procedure Paint; override; procedure PaintCheckImage(const PaintInfo: TVTPaintInfo); virtual; procedure PaintImage(var PaintInfo: TVTPaintInfo; ImageInfoIndex: TVTImageInfoIndex; DoOverlay: Boolean); virtual; procedure PaintNodeButton(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const R: TRect; ButtonX, ButtonY: Integer; BidiMode: TBiDiMode); virtual; procedure PaintTreeLines(const PaintInfo: TVTPaintInfo; VAlignment, IndentSize: Integer; LineImage: TLineImage); virtual; procedure PaintSelectionRectangle(Target: TCanvas; WindowOrgX: Integer; const SelectionRect: TRect; TargetRect: TRect); virtual; procedure PrepareCell(var PaintInfo: TVTPaintInfo; WindowOrgX, MaxWidth: Integer); virtual; function ReadChunk(Stream: TStream; Version: Integer; Node: PVirtualNode; ChunkType, ChunkSize: Integer): Boolean; virtual; procedure ReadNode(Stream: TStream; Version: Integer; Node: PVirtualNode); virtual; procedure RedirectFontChangeEvent(Canvas: TCanvas); virtual; procedure RemoveFromSelection(Node: PVirtualNode); virtual; function RenderOLEData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean): HResult; virtual; procedure ResetRangeAnchor; virtual; procedure RestoreFontChangeEvent(Canvas: TCanvas); virtual; procedure SelectNodes(StartNode, EndNode: PVirtualNode; AddOnly: Boolean); virtual; procedure SetFocusedNodeAndColumn(Node: PVirtualNode; Column: TColumnIndex); virtual; procedure SkipNode(Stream: TStream); virtual; procedure StartWheelPanning(const Position: TPoint); virtual; procedure StopWheelPanning; virtual; procedure StructureChange(Node: PVirtualNode; Reason: TChangeReason); virtual; function SuggestDropEffect(Source: TObject; Shift: TShiftState; const Pt: TPoint; AllowedEffects: LongWord): LongWord; virtual; procedure ToggleSelection(StartNode, EndNode: PVirtualNode); virtual; procedure UnselectNodes(StartNode, EndNode: PVirtualNode); virtual; //lcl procedure UpdateCheckImageList; procedure UpdateColumnCheckState(Col: TVirtualTreeColumn); procedure UpdateDesigner; virtual; procedure UpdateEditBounds; virtual; procedure UpdateHeaderRect; virtual; procedure UpdateWindowAndDragImage(const Tree: TBaseVirtualTree; TreeRect: TRect; UpdateNCArea, ReshowDragImage: Boolean); virtual; procedure ValidateCache; virtual; procedure ValidateNodeDataSize(var Size: Integer); virtual; procedure WndProc(var Message: TLMessage); override; procedure WriteChunks(Stream: TStream; Node: PVirtualNode); virtual; procedure WriteNode(Stream: TStream; Node: PVirtualNode); virtual; property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify; property AnimationDuration: Cardinal read FAnimationDuration write SetAnimationDuration default 200; property AutoExpandDelay: Cardinal read FAutoExpandDelay write FAutoExpandDelay default 1000; property AutoScrollDelay: Cardinal read FAutoScrollDelay write FAutoScrollDelay default 1000; property AutoScrollInterval: TAutoScrollInterval read FAutoScrollInterval write FAutoScrollInterval default 1; property Background: TPicture read FBackground write SetBackground; property BackgroundOffsetX: Integer index 0 read FBackgroundOffsetX write SetBackgroundOffset default 0; property BackgroundOffsetY: Integer index 1 read FBackgroundOffsetY write SetBackgroundOffset default 0; //property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle; property BottomSpace: Cardinal read FBottomSpace write SetBottomSpace default 0; property ButtonFillMode: TVTButtonFillMode read FButtonFillMode write SetButtonFillMode default fmTreeColor; property ButtonStyle: TVTButtonStyle read FButtonStyle write SetButtonStyle default bsRectangle; property ChangeDelay: Cardinal read FChangeDelay write FChangeDelay default 0; property CheckImageKind: TCheckImageKind read FCheckImageKind write SetCheckImageKind default ckSystemDefault; property ClipboardFormats: TClipboardFormats read FClipboardFormats write SetClipboardFormats; property Colors: TVTColors read FColors write SetColors; property CustomCheckImages: TBitmap read FCustomCheckImages write SetCustomCheckImages; property DefaultNodeHeight: Cardinal read FDefaultNodeHeight write SetDefaultNodeHeight default 18; property DefaultPasteMode: TVTNodeAttachMode read FDefaultPasteMode write FDefaultPasteMode default amAddChildLast; property DragHeight: Integer read FDragHeight write FDragHeight default 350; property DragImageKind: TVTDragImageKind read FDragImageKind write FDragImageKind default diComplete; property DragOperations: TDragOperations read FDragOperations write FDragOperations default [doCopy, doMove]; property DragSelection: TNodeArray read FDragSelection; property DragType: TVTDragType read FDragType write FDragType default dtOLE; property DragWidth: Integer read FDragWidth write FDragWidth default 200; property DrawSelectionMode: TVTDrawSelectionMode read FDrawSelectionMode write FDrawSelectionMode default smDottedRectangle; property EditColumn: TColumnIndex read FEditColumn write FEditColumn; property EditDelay: Cardinal read FEditDelay write FEditDelay default 1000; property Header: TVTHeader read FHeader write SetHeader; property HeaderRect: TRect read FHeaderRect; property HintMode: TVTHintMode read FHintMode write FHintMode default hmDefault; property HotCursor: TCursor read FHotCursor write FHotCursor default crDefault; property Images: TCustomImageList read FImages write SetImages; property IncrementalSearch: TVTIncrementalSearch read FIncrementalSearch write SetSearchOption default isNone; property IncrementalSearchDirection: TVTSearchDirection read FSearchDirection write FSearchDirection default sdForward; property IncrementalSearchStart: TVTSearchStart read FSearchStart write FSearchStart default ssFocusedNode; property IncrementalSearchTimeout: Cardinal read FSearchTimeout write FSearchTimeout default 1000; property Indent: Cardinal read FIndent write SetIndent default 18; property LastClickPos: TPoint read FLastClickPos write FLastClickPos; property LastDropMode: TDropMode read FLastDropMode write FlastDropMode; property LineMode: TVTLineMode read FLineMode write SetLineMode default lmNormal; property LineStyle: TVTLineStyle read FLineStyle write SetLineStyle default lsDotted; property Margin: Integer read FMargin write SetMargin default 4; property NodeAlignment: TVTNodeAlignment read FNodeAlignment write SetNodeAlignment default naProportional; property NodeDataSize: Integer read FNodeDataSize write SetNodeDataSize default -1; property OperationCanceled: Boolean read GetOperationCanceled; property RootNodeCount: Cardinal read GetRootNodeCount write SetRootNodeCount default 0; property ScrollBarOptions: TScrollBarOptions read FScrollBarOptions write SetScrollBarOptions; property SelectionBlendFactor: Byte read FSelectionBlendFactor write FSelectionBlendFactor default 128; property SelectionCurveRadius: Cardinal read FSelectionCurveRadius write SetSelectionCurveRadius default 0; property StateImages: TCustomImageList read FStateImages write SetStateImages; property TextMargin: Integer read FTextMargin write SetTextMargin default 4; property TotalInternalDataSize: Cardinal read FTotalInternalDataSize; property TreeOptions: TCustomVirtualTreeOptions read FOptions write SetOptions; property WantTabs: Boolean read FWantTabs write FWantTabs default False; property OnAdvancedHeaderDraw: TVTAdvancedHeaderPaintEvent read FOnAdvancedHeaderDraw write FOnAdvancedHeaderDraw; property OnAfterAutoFitColumn: TVTAfterAutoFitColumnEvent read FOnAfterAutoFitColumn write FOnAfterAutoFitColumn; property OnAfterAutoFitColumns: TVTAfterAutoFitColumnsEvent read FOnAfterAutoFitColumns write FOnAfterAutoFitColumns; property OnAfterCellPaint: TVTAfterCellPaintEvent read FOnAfterCellPaint write FOnAfterCellPaint; property OnAfterColumnExport : TVTColumnExportEvent read FOnAfterColumnExport write FOnAfterColumnExport; property OnAfterColumnWidthTracking: TVTAfterColumnWidthTrackingEvent read FOnAfterColumnWidthTracking write FOnAfterColumnWidthTracking; property OnAfterGetMaxColumnWidth: TVTAfterGetMaxColumnWidthEvent read FOnAfterGetMaxColumnWidth write FOnAfterGetMaxColumnWidth; property OnAfterHeaderExport: TVTTreeExportEvent read FOnBeforeHeaderExport write FOnBeforeHeaderExport; property OnAfterHeaderHeightTracking: TVTAfterHeaderHeightTrackingEvent read FOnAfterHeaderHeightTracking write FOnAfterHeaderHeightTracking; property OnAfterItemErase: TVTAfterItemEraseEvent read FOnAfterItemErase write FOnAfterItemErase; property OnAfterItemPaint: TVTAfterItemPaintEvent read FOnAfterItemPaint write FOnAfterItemPaint; property OnAfterNodeExport: TVTNodeExportEvent read FOnAfterNodeExport write FOnAfterNodeExport; property OnAfterPaint: TVTPaintEvent read FOnAfterPaint write FOnAfterPaint; property OnAfterTreeExport: TVTTreeExportEvent read FOnAfterTreeExport write FOnAfterTreeExport; property OnBeforeAutoFitColumn: TVTBeforeAutoFitColumnEvent read FOnBeforeAutoFitColumn write FOnBeforeAutoFitColumn; property OnBeforeAutoFitColumns: TVTBeforeAutoFitColumnsEvent read FOnBeforeAutoFitColumns write FOnBeforeAutoFitColumns; property OnBeforeCellPaint: TVTBeforeCellPaintEvent read FOnBeforeCellPaint write FOnBeforeCellPaint; property OnBeforeColumnExport: TVTColumnExportEvent read FOnBeforeColumnExport write FOnBeforeColumnExport; property OnBeforeColumnWidthTracking: TVTBeforeColumnWidthTrackingEvent read FOnBeforeColumnWidthTracking write FOnBeforeColumnWidthTracking; property OnBeforeGetMaxColumnWidth: TVTBeforeGetMaxColumnWidthEvent read FOnBeforeGetMaxColumnWidth write FOnBeforeGetMaxColumnWidth; property OnBeforeHeaderExport: TVTTreeExportEvent read FOnBeforeHeaderExport write FOnBeforeHeaderExport; property OnBeforeHeaderHeightTracking: TVTBeforeHeaderHeightTrackingEvent read FOnBeforeHeaderHeightTracking write FOnBeforeHeaderHeightTracking; property OnBeforeItemErase: TVTBeforeItemEraseEvent read FOnBeforeItemErase write FOnBeforeItemErase; property OnBeforeItemPaint: TVTBeforeItemPaintEvent read FOnBeforeItemPaint write FOnBeforeItemPaint; property OnBeforeNodeExport: TVTNodeExportEvent read FOnBeforeNodeExport write FOnBeforeNodeExport; property OnBeforePaint: TVTPaintEvent read FOnBeforePaint write FOnBeforePaint; property OnBeforeTreeExport: TVTTreeExportEvent read FOnBeforeTreeExport write FOnBeforeTreeExport; property OnCanSplitterResizeColumn: TVTCanSplitterResizeColumnEvent read FOnCanSplitterResizeColumn write FOnCanSplitterResizeColumn; property OnChange: TVTChangeEvent read FOnChange write FOnChange; property OnChecked: TVTChangeEvent read FOnChecked write FOnChecked; property OnChecking: TVTCheckChangingEvent read FOnChecking write FOnChecking; property OnCollapsed: TVTChangeEvent read FOnCollapsed write FOnCollapsed; property OnCollapsing: TVTChangingEvent read FOnCollapsing write FOnCollapsing; property OnColumnClick: TVTColumnClickEvent read FOnColumnClick write FOnColumnClick; property OnColumnDblClick: TVTColumnDblClickEvent read FOnColumnDblClick write FOnColumnDblClick; property OnColumnExport : TVTColumnExportEvent read FOnColumnExport write FOnColumnExport; property OnColumnResize: TVTHeaderNotifyEvent read FOnColumnResize write FOnColumnResize; property OnColumnWidthDblClickResize: TVTColumnWidthDblClickResizeEvent read FOnColumnWidthDblClickResize write FOnColumnWidthDblClickResize; property OnColumnWidthTracking: TVTColumnWidthTrackingEvent read FOnColumnWidthTracking write FOnColumnWidthTracking; property OnCompareNodes: TVTCompareEvent read FOnCompareNodes write FOnCompareNodes; property OnCreateDataObject: TVTCreateDataObjectEvent read FOnCreateDataObject write FOnCreateDataObject; property OnCreateDragManager: TVTCreateDragManagerEvent read FOnCreateDragManager write FOnCreateDragManager; property OnCreateEditor: TVTCreateEditorEvent read FOnCreateEditor write FOnCreateEditor; property OnDragAllowed: TVTDragAllowedEvent read FOnDragAllowed write FOnDragAllowed; property OnDragOver: TVTDragOverEvent read FOnDragOver write FOnDragOver; property OnDragDrop: TVTDragDropEvent read FOnDragDrop write FOnDragDrop; property OnEditCancelled: TVTEditCancelEvent read FOnEditCancelled write FOnEditCancelled; property OnEditing: TVTEditChangingEvent read FOnEditing write FOnEditing; property OnEdited: TVTEditChangeEvent read FOnEdited write FOnEdited; property OnExpanded: TVTChangeEvent read FOnExpanded write FOnExpanded; property OnExpanding: TVTChangingEvent read FOnExpanding write FOnExpanding; property OnFocusChanged: TVTFocusChangeEvent read FOnFocusChanged write FOnFocusChanged; property OnFocusChanging: TVTFocusChangingEvent read FOnFocusChanging write FOnFocusChanging; property OnFreeNode: TVTFreeNodeEvent read FOnFreeNode write FOnFreeNode; property OnGetCellIsEmpty: TVTGetCellIsEmptyEvent read FOnGetCellIsEmpty write FOnGetCellIsEmpty; property OnGetCursor: TVTGetCursorEvent read FOnGetCursor write FOnGetCursor; property OnGetHeaderCursor: TVTGetHeaderCursorEvent read FOnGetHeaderCursor write FOnGetHeaderCursor; property OnGetHelpContext: TVTHelpContextEvent read FOnGetHelpContext write FOnGetHelpContext; property OnGetImageIndex: TVTGetImageEvent read FOnGetImage write FOnGetImage; property OnGetImageIndexEx: TVTGetImageExEvent read FOnGetImageEx write FOnGetImageEx; property OnGetImageText: TVTGetImageTextEvent read FOnGetImageText write FOnGetImageText; property OnGetLineStyle: TVTGetLineStyleEvent read FOnGetLineStyle write FOnGetLineStyle; property OnGetNodeDataSize: TVTGetNodeDataSizeEvent read FOnGetNodeDataSize write FOnGetNodeDataSize; property OnGetPopupMenu: TVTPopupEvent read FOnGetPopupMenu write FOnGetPopupMenu; property OnGetUserClipboardFormats: TVTGetUserClipboardFormatsEvent read FOnGetUserClipboardFormats write FOnGetUserClipboardFormats; property OnHeaderCheckBoxClick: TVTHeaderClickEvent read FOnHeaderCheckBoxClick write FOnHeaderCheckBoxClick; property OnHeaderClick: TVTHeaderClickEvent read FOnHeaderClick write FOnHeaderClick; property OnHeaderDblClick: TVTHeaderClickEvent read FOnHeaderDblClick write FOnHeaderDblClick; property OnHeaderDragged: TVTHeaderDraggedEvent read FOnHeaderDragged write FOnHeaderDragged; property OnHeaderDraggedOut: TVTHeaderDraggedOutEvent read FOnHeaderDraggedOut write FOnHeaderDraggedOut; property OnHeaderDragging: TVTHeaderDraggingEvent read FOnHeaderDragging write FOnHeaderDragging; property OnHeaderDraw: TVTHeaderPaintEvent read FOnHeaderDraw write FOnHeaderDraw; property OnHeaderDrawQueryElements: TVTHeaderPaintQueryElementsEvent read FOnHeaderDrawQueryElements write FOnHeaderDrawQueryElements; property OnHeaderHeightTracking: TVTHeaderHeightTrackingEvent read FOnHeaderHeightTracking write FOnHeaderHeightTracking; property OnHeaderHeightDblClickResize: TVTHeaderHeightDblClickResizeEvent read FOnHeaderHeightDblClickResize write FOnHeaderHeightDblClickResize; property OnHeaderImageClick: TVTHeaderClickEvent read FOnHeaderImageClick write FOnHeaderImageClick; property OnHeaderMouseDown: TVTHeaderMouseEvent read FOnHeaderMouseDown write FOnHeaderMouseDown; property OnHeaderMouseMove: TVTHeaderMouseMoveEvent read FOnHeaderMouseMove write FOnHeaderMouseMove; property OnHeaderMouseUp: TVTHeaderMouseEvent read FOnHeaderMouseUp write FOnHeaderMouseUp; property OnHotChange: TVTHotNodeChangeEvent read FOnHotChange write FOnHotChange; property OnIncrementalSearch: TVTIncrementalSearchEvent read FOnIncrementalSearch write FOnIncrementalSearch; property OnInitChildren: TVTInitChildrenEvent read FOnInitChildren write FOnInitChildren; property OnInitNode: TVTInitNodeEvent read FOnInitNode write FOnInitNode; property OnKeyAction: TVTKeyActionEvent read FOnKeyAction write FOnKeyAction; property OnLoadNode: TVTSaveNodeEvent read FOnLoadNode write FOnLoadNode; property OnMeasureItem: TVTMeasureItemEvent read FOnMeasureItem write FOnMeasureItem; property OnNodeCopied: TVTNodeCopiedEvent read FOnNodeCopied write FOnNodeCopied; property OnNodeCopying: TVTNodeCopyingEvent read FOnNodeCopying write FOnNodeCopying; property OnNodeExport: TVTNodeExportEvent read FOnNodeExport write FOnNodeExport; property OnNodeHeightTracking: TVTNodeHeightTrackingEvent read FOnNodeHeightTracking write FOnNodeHeightTracking; property OnNodeHeightDblClickResize: TVTNodeHeightDblClickResizeEvent read FOnNodeHeightDblClickResize write FOnNodeHeightDblClickResize; property OnNodeMoved: TVTNodeMovedEvent read FOnNodeMoved write FOnNodeMoved; property OnNodeMoving: TVTNodeMovingEvent read FOnNodeMoving write FOnNodeMoving; property OnPaintBackground: TVTBackgroundPaintEvent read FOnPaintBackground write FOnPaintBackground; property OnRenderOLEData: TVTRenderOLEDataEvent read FOnRenderOLEData write FOnRenderOLEData; property OnResetNode: TVTChangeEvent read FOnResetNode write FOnResetNode; property OnSaveNode: TVTSaveNodeEvent read FOnSaveNode write FOnSaveNode; property OnScroll: TVTScrollEvent read FOnScroll write FOnScroll; property OnShowScrollbar: TVTScrollbarShowEvent read FOnShowScrollbar write FOnShowScrollbar; property OnStateChange: TVTStateChangeEvent read FOnStateChange write FOnStateChange; property OnStructureChange: TVTStructureChangeEvent read FOnStructureChange write FOnStructureChange; property OnUpdating: TVTUpdatingEvent read FOnUpdating write FOnUpdating; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; function AbsoluteIndex(Node: PVirtualNode): Cardinal; function AddChild(Parent: PVirtualNode; UserData: Pointer = nil): PVirtualNode; virtual; procedure AddFromStream(Stream: TStream; TargetNode: PVirtualNode); procedure AfterConstruction; override; procedure Assign(Source: TPersistent); override; procedure BeginDrag(Immediate: Boolean; Threshold: Integer = -1); procedure BeginSynch; procedure BeginUpdate; virtual; procedure CancelCutOrCopy; function CancelEditNode: Boolean; procedure CancelOperation; function CanEdit(Node: PVirtualNode; Column: TColumnIndex): Boolean; virtual; procedure Clear; virtual; procedure ClearChecked; procedure ClearSelection; function CopyTo(Source: PVirtualNode; Tree: TBaseVirtualTree; Mode: TVTNodeAttachMode; ChildrenOnly: Boolean): PVirtualNode; overload; function CopyTo(Source, Target: PVirtualNode; Mode: TVTNodeAttachMode; ChildrenOnly: Boolean): PVirtualNode; overload; procedure CopyToClipBoard; virtual; procedure CutToClipBoard; virtual; procedure DefaultHandler(var AMessage); override; procedure DeleteChildren(Node: PVirtualNode; ResetHasChildren: Boolean = False); procedure DeleteNode(Node: PVirtualNode; Reindex: Boolean = True); procedure DeleteSelectedNodes; virtual; function Dragging: Boolean; function EditNode(Node: PVirtualNode; Column: TColumnIndex): Boolean; virtual; function EndEditNode: Boolean; procedure EndSynch; procedure EndUpdate; virtual; function ExecuteAction(Action: TBasicAction): Boolean; override; procedure FinishCutOrCopy; procedure FlushClipboard; procedure FullCollapse(Node: PVirtualNode = nil); virtual; procedure FullExpand(Node: PVirtualNode = nil); virtual; {$ifndef fpc} function GetControlsAlignment: TAlignment; override; {$endif} function GetDisplayRect(Node: PVirtualNode; Column: TColumnIndex; TextOnly: Boolean; Unclipped: Boolean = False; ApplyCellContentMargin: Boolean = False): TRect; function GetFirst(ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetFirstChecked(State: TCheckState = csCheckedNormal; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetFirstChild(Node: PVirtualNode): PVirtualNode; function GetFirstCutCopy(ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetFirstInitialized(ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetFirstLeaf: PVirtualNode; function GetFirstLevel(NodeLevel: Cardinal): PVirtualNode; function GetFirstNoInit(ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetFirstSelected(ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetFirstVisible(Node: PVirtualNode = nil; ConsiderChildrenAbove: Boolean = True): PVirtualNode; function GetFirstVisibleChild(Node: PVirtualNode): PVirtualNode; function GetFirstVisibleChildNoInit(Node: PVirtualNode): PVirtualNode; function GetFirstVisibleNoInit(Node: PVirtualNode = nil; ConsiderChildrenAbove: Boolean = True): PVirtualNode; procedure GetHitTestInfoAt(X, Y: Integer; Relative: Boolean; var HitInfo: THitInfo); virtual; function GetLast(Node: PVirtualNode = nil; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetLastInitialized(Node: PVirtualNode = nil; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetLastNoInit(Node: PVirtualNode = nil; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetLastChild(Node: PVirtualNode): PVirtualNode; function GetLastChildNoInit(Node: PVirtualNode): PVirtualNode; function GetLastVisible(Node: PVirtualNode = nil; ConsiderChildrenAbove: Boolean = True): PVirtualNode; function GetLastVisibleChild(Node: PVirtualNode): PVirtualNode; function GetLastVisibleChildNoInit(Node: PVirtualNode): PVirtualNode; function GetLastVisibleNoInit(Node: PVirtualNode = nil; ConsiderChildrenAbove: Boolean = True): PVirtualNode; function GetMaxColumnWidth(Column: TColumnIndex; UseSmartColumnWidth: Boolean = False): Integer; function GetNext(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetNextChecked(Node: PVirtualNode; State: TCheckState = csCheckedNormal; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetNextCutCopy(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetNextInitialized(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetNextLeaf(Node: PVirtualNode): PVirtualNode; function GetNextLevel(Node: PVirtualNode; NodeLevel: Cardinal): PVirtualNode; function GetNextNoInit(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetNextSelected(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetNextSibling(Node: PVirtualNode): PVirtualNode; function GetNextSiblingNoInit(Node: PVirtualNode): PVirtualNode; function GetNextVisible(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = True): PVirtualNode; function GetNextVisibleNoInit(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = True): PVirtualNode; function GetNextVisibleSibling(Node: PVirtualNode): PVirtualNode; function GetNextVisibleSiblingNoInit(Node: PVirtualNode): PVirtualNode; function GetNodeAt(X, Y: Integer): PVirtualNode; overload; function GetNodeAt(X, Y: Integer; Relative: Boolean; var NodeTop: Integer): PVirtualNode; overload; function GetNodeData(Node: PVirtualNode): Pointer; function GetNodeLevel(Node: PVirtualNode): Cardinal; function GetPrevious(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetPreviousChecked(Node: PVirtualNode; State: TCheckState = csCheckedNormal; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetPreviousCutCopy(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetPreviousInitialized(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetPreviousLeaf(Node: PVirtualNode): PVirtualNode; function GetPreviousLevel(Node: PVirtualNode; NodeLevel: Cardinal): PVirtualNode; function GetPreviousNoInit(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetPreviousSelected(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetPreviousSibling(Node: PVirtualNode): PVirtualNode; function GetPreviousSiblingNoInit(Node: PVirtualNode): PVirtualNode; function GetPreviousVisible(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = True): PVirtualNode; function GetPreviousVisibleNoInit(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = True): PVirtualNode; function GetPreviousVisibleSibling(Node: PVirtualNode): PVirtualNode; function GetPreviousVisibleSiblingNoInit(Node: PVirtualNode): PVirtualNode; function GetSortedCutCopySet(Resolve: Boolean): TNodeArray; function GetSortedSelection(Resolve: Boolean): TNodeArray; procedure GetTextInfo(Node: PVirtualNode; Column: TColumnIndex; const AFont: TFont; var R: TRect; out Text: String); virtual; function GetTreeRect: TRect; function GetVisibleParent(Node: PVirtualNode): PVirtualNode; function HasAsParent(Node, PotentialParent: PVirtualNode): Boolean; function InsertNode(Node: PVirtualNode; Mode: TVTNodeAttachMode; UserData: Pointer = nil): PVirtualNode; procedure InvalidateChildren(Node: PVirtualNode; Recursive: Boolean); procedure InvalidateColumn(Column: TColumnIndex); function InvalidateNode(Node: PVirtualNode): TRect; virtual; procedure InvalidateToBottom(Node: PVirtualNode); procedure InvertSelection(VisibleOnly: Boolean); function IsEditing: Boolean; function IsMouseSelecting: Boolean; function IterateSubtree(Node: PVirtualNode; Callback: TVTGetNodeProc; Data: Pointer; Filter: TVirtualNodeStates = []; DoInit: Boolean = False; ChildNodesOnly: Boolean = False): PVirtualNode; procedure LoadFromFile(const FileName: TFileName); virtual; procedure LoadFromStream(Stream: TStream); virtual; procedure MeasureItemHeight(const Canvas: TCanvas; Node: PVirtualNode); procedure MoveTo(Source, Target: PVirtualNode; Mode: TVTNodeAttachMode; ChildrenOnly: Boolean); overload; procedure MoveTo(Node: PVirtualNode; Tree: TBaseVirtualTree; Mode: TVTNodeAttachMode; ChildrenOnly: Boolean); overload; procedure PaintTree(TargetCanvas: TCanvas; const Window: TRect; Target: TPoint; PaintOptions: TVTInternalPaintOptions; PixelFormat: TPixelFormat = pfDevice); function PasteFromClipboard: Boolean; virtual; procedure PrepareDragImage(HotSpot: TPoint; const DataObject: IDataObject); {$ifdef EnablePrint} procedure Print(Printer: TPrinter; PrintHeader: Boolean); {$endif} function ProcessDrop(DataObject: IDataObject; TargetNode: PVirtualNode; var Effect: LongWord; Mode: TVTNodeAttachMode): Boolean; function ProcessOLEData(Source: TBaseVirtualTree; DataObject: IDataObject; TargetNode: PVirtualNode; Mode: TVTNodeAttachMode; Optimized: Boolean): Boolean; procedure RepaintNode(Node: PVirtualNode); procedure ReinitChildren(Node: PVirtualNode; Recursive: Boolean); virtual; procedure ReinitNode(Node: PVirtualNode; Recursive: Boolean); virtual; procedure ResetNode(Node: PVirtualNode); virtual; procedure SaveToFile(const FileName: TFileName); procedure SaveToStream(Stream: TStream; Node: PVirtualNode = nil); virtual; function ScrollIntoView(Node: PVirtualNode; Center: Boolean; Horizontally: Boolean = False): Boolean; overload; function ScrollIntoView(Column: TColumnIndex; Center: Boolean): Boolean; overload; procedure SelectAll(VisibleOnly: Boolean); procedure Sort(Node: PVirtualNode; Column: TColumnIndex; Direction: TSortDirection; DoInit: Boolean = True); virtual; procedure SortTree(Column: TColumnIndex; Direction: TSortDirection; DoInit: Boolean = True); virtual; procedure ToggleNode(Node: PVirtualNode); function UpdateAction(Action: TBasicAction): Boolean; override; procedure UpdateHorizontalScrollBar(DoRepaint: Boolean); procedure UpdateScrollBars(DoRepaint: Boolean); virtual; procedure UpdateVerticalScrollBar(DoRepaint: Boolean); //lcl: reenable in case TControl implementation change to match Delphi // function UseRightToLeftReading: Boolean; procedure ValidateChildren(Node: PVirtualNode; Recursive: Boolean); procedure ValidateNode(Node: PVirtualNode; Recursive: Boolean); {$ifdef EnableAccessible} property Accessible: IAccessible read FAccessible write FAccessible; property AccessibleItem: IAccessible read FAccessibleItem write FAccessibleItem; property AccessibleName: string read FAccessibleName write FAccessibleName; {$endif} property BottomNode: PVirtualNode read GetBottomNode write SetBottomNode; property CheckedCount: Integer read GetCheckedCount; property CheckImages: TBitmap read FCheckImages; property CheckState[Node: PVirtualNode]: TCheckState read GetCheckState write SetCheckState; property CheckType[Node: PVirtualNode]: TCheckType read GetCheckType write SetCheckType; property ChildCount[Node: PVirtualNode]: Cardinal read GetChildCount write SetChildCount; property ChildrenInitialized[Node: PVirtualNode]: Boolean read GetChildrenInitialized; property CutCopyCount: Integer read GetCutCopyCount; property DragImage: TVTDragImage read FDragImage; property VTVDragManager: IVTDragManager read GetDragManager; property DropTargetNode: PVirtualNode read FDropTargetNode; property EditLink: IVTEditLink read FEditLink; property Expanded[Node: PVirtualNode]: Boolean read GetExpanded write SetExpanded; property FocusedColumn: TColumnIndex read FFocusedColumn write SetFocusedColumn default InvalidColumn; property FocusedNode: PVirtualNode read FFocusedNode write SetFocusedNode; property Font; property FullyVisible[Node: PVirtualNode]: Boolean read GetFullyVisible write SetFullyVisible; property HasChildren[Node: PVirtualNode]: Boolean read GetHasChildren write SetHasChildren; property HotNode: PVirtualNode read FCurrentHotNode; property IsDisabled[Node: PVirtualNode]: Boolean read GetDisabled write SetDisabled; property IsVisible[Node: PVirtualNode]: Boolean read GetVisible write SetVisible; property MultiLine[Node: PVirtualNode]: Boolean read GetMultiline write SetMultiline; property NodeHeight[Node: PVirtualNode]: Cardinal read GetNodeHeight write SetNodeHeight; property NodeParent[Node: PVirtualNode]: PVirtualNode read GetNodeParent write SetNodeParent; property OffsetX: Integer read FOffsetX write SetOffsetX; property OffsetXY: TPoint read GetOffsetXY write SetOffsetXY; property OffsetY: Integer read FOffsetY write SetOffsetY; property RootNode: PVirtualNode read FRoot; property SearchBuffer: String read FSearchBuffer; property Selected[Node: PVirtualNode]: Boolean read GetSelected write SetSelected; property SelectionLocked: Boolean read FSelectionLocked write FSelectionLocked; property TotalCount: Cardinal read GetTotalCount; property TreeStates: TVirtualTreeStates read FStates write FStates; property SelectedCount: Integer read FSelectionCount; property TopNode: PVirtualNode read GetTopNode write SetTopNode; property VerticalAlignment[Node: PVirtualNode]: Byte read GetVerticalAlignment write SetVerticalAlignment; property VisibleCount: Cardinal read FVisibleCount; property VisiblePath[Node: PVirtualNode]: Boolean read GetVisiblePath write SetVisiblePath; property UpdateCount: Cardinal read FUpdateCount; end; // --------- TCustomVirtualStringTree // Options regarding strings (useful only for the string tree and descendants): TVTStringOption = ( toSaveCaptions, // If set then the caption is automatically saved with the tree node, regardless of what is // saved in the user data. toShowStaticText, // Show static text in a caption which can be differently formatted than the caption // but cannot be edited. toAutoAcceptEditChange // Automatically accept changes during edit if the user finishes editing other then // VK_RETURN or ESC. If not set then changes are cancelled. ); TVTStringOptions = set of TVTStringOption; const DefaultStringOptions = [toSaveCaptions, toAutoAcceptEditChange]; type TCustomStringTreeOptions = class(TCustomVirtualTreeOptions) private FStringOptions: TVTStringOptions; procedure SetStringOptions(const Value: TVTStringOptions); protected property StringOptions: TVTStringOptions read FStringOptions write SetStringOptions default DefaultStringOptions; public constructor Create(AOwner: TBaseVirtualTree); override; procedure AssignTo(Dest: TPersistent); override; end; TStringTreeOptions = class(TCustomStringTreeOptions) published property AnimationOptions; property AutoOptions; property ExportMode; property MiscOptions; property PaintOptions; property SelectionOptions; property StringOptions; end; TCustomVirtualStringTree = class; // Edit support classes. TStringEditLink = class; { TVTEdit } TVTEdit = class(TCustomEdit) private procedure CMAutoAdjust(var Message: TLMessage); message CM_AUTOADJUST; procedure CMExit(var Message: TLMessage); message CM_EXIT; procedure CNCommand(var Message: TLMCommand); message CN_COMMAND; procedure DoRelease(Data: PtrInt); procedure WMChar(var Message: TLMChar); message LM_CHAR; procedure WMDestroy(var Message: TLMDestroy); message LM_DESTROY; procedure WMGetDlgCode(var Message: TLMNoParams); message LM_GETDLGCODE; procedure WMKeyDown(var Message: TLMKeyDown); message LM_KEYDOWN; protected FRefLink: IVTEditLink; FLink: TStringEditLink; procedure AutoAdjustSize; virtual; procedure CreateParams(var Params: TCreateParams); override; public constructor Create(Link: TStringEditLink); reintroduce; procedure Release; property AutoSelect; property AutoSize; property BorderStyle; property CharCase; //property HideSelection; property MaxLength; //property OEMConvert; property PasswordChar; end; TStringEditLink = class(TInterfacedObject, IVTEditLink) private FEdit: TVTEdit; // A normal custom edit control. procedure SetEdit(const Value: TVTEdit); protected FTree: TCustomVirtualStringTree; // A back reference to the tree calling. FNode: PVirtualNode; // The node to be edited. FColumn: TColumnIndex; // The column of the node. FAlignment: TAlignment; FTextBounds: TRect; // Smallest rectangle around the text. FStopping: Boolean; // Set to True when the edit link requests stopping the edit action. public constructor Create; virtual; destructor Destroy; override; function BeginEdit: Boolean; virtual; stdcall; function CancelEdit: Boolean; virtual; stdcall; property Edit: TVTEdit read FEdit write SetEdit; function EndEdit: Boolean; virtual; stdcall; function GetBounds: TRect; virtual; stdcall; function PrepareEdit(Tree: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex): Boolean; virtual; stdcall; procedure ProcessMessage(var Message: TLMessage); virtual; stdcall; procedure SetBounds(R: TRect); virtual; stdcall; end; // Describes the type of text to return in the text and draw info retrival events. TVSTTextType = ( ttNormal, // normal label of the node, this is also the text which can be edited ttStatic // static (non-editable) text after the normal text ); // Describes the source to use when converting a string tree into a string for clipboard etc. TVSTTextSourceType = ( tstAll, // All nodes are rendered. Initialization is done on the fly. tstInitialized, // Only initialized nodes are rendered. tstSelected, // Only selected nodes are rendered. tstCutCopySet, // Only nodes currently marked as being in the cut/copy clipboard set are rendered. tstVisible // Only visible nodes are rendered. ); TVTPaintText = procedure(Sender: TBaseVirtualTree; const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType) of object; TVSTGetTextEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: String) of object; TVSTGetHintEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; var LineBreakStyle: TVTTooltipLineBreakStyle; var HintText: String) of object; // New text can only be set for variable caption. TVSTNewTextEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; const NewText: String) of object; TVSTShortenStringEvent = procedure(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const S: String; TextSpace: Integer; var Result: String; var Done: Boolean) of object; TVTMeasureTextWidthEvent = procedure(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const Text: String; var Width: Integer) of object; TVTDrawTextEvent = procedure(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const Text: String; const CellRect: TRect; var DefaultDraw: Boolean) of object; // Helper class to speed up rendering text formats for clipboard and drag'n drop transfers. { TBufferedUTF8String } TBufferedUTF8String = class private FStart, FPosition, FEnd: PChar; function GetAsAnsiString: AnsiString; function GetAsUTF16String: UnicodeString; function GetAsUTF8String: String; public destructor Destroy; override; procedure Add(const S: String); procedure AddNewLine; property AsAnsiString: AnsiString read GetAsAnsiString; property AsUTF8String: String read GetAsUTF8String; property AsUTF16String: UnicodeString read GetAsUTF16String; end; { TCustomVirtualStringTree } TCustomVirtualStringTree = class(TBaseVirtualTree) private FDefaultText: String; // text to show if there's no OnGetText event handler (e.g. at design time) FTextHeight: Integer; // true size of the font FEllipsisWidth: Integer; // width of '...' for the current font FInternalDataOffset: Cardinal; // offset to the internal data of the string tree FOnPaintText: TVTPaintText; // triggered before either normal or fixed text is painted to allow // even finer customization (kind of sub cell painting) FOnGetText: TVSTGetTextEvent; // used to retrieve the string to be displayed for a specific node FOnGetHint: TVSTGetHintEvent; // used to retrieve the hint to be displayed for a specific node FOnNewText: TVSTNewTextEvent; // used to notify the application about an edited node caption FOnShortenString: TVSTShortenStringEvent; // used to allow the application a customized string shortage FOnMeasureTextWidth: TVTMeasureTextWidthEvent; // used to adjust the width of the cells FOnDrawText: TVTDrawTextEvent; // used to custom draw the node text procedure AddContentToBuffer(Buffer: TBufferedUTF8String; Source: TVSTTextSourceType; const Separator: String); function GetImageText(Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex): String; procedure GetRenderStartValues(Source: TVSTTextSourceType; out Node: PVirtualNode; out NextNodeProc: TGetNextNodeProc); function GetOptions: TCustomStringTreeOptions; function GetText(Node: PVirtualNode; Column: TColumnIndex): String; procedure InitializeTextProperties(var PaintInfo: TVTPaintInfo); procedure PaintNormalText(var PaintInfo: TVTPaintInfo; TextOutFlags: Integer; Text: String); procedure PaintStaticText(const PaintInfo: TVTPaintInfo; TextOutFlags: Integer; const Text: String); procedure SetDefaultText(const Value: String); procedure SetOptions(const Value: TCustomStringTreeOptions); procedure SetText(Node: PVirtualNode; Column: TColumnIndex; const Value: String); procedure CMFontChanged(var Msg: TLMessage); message CM_FONTCHANGED; protected procedure AdjustPaintCellRect(var PaintInfo: TVTPaintInfo; out NextNonEmpty: TColumnIndex); override; function CanExportNode(Node: PVirtualNode): Boolean; function CalculateTextWidth(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const Text: String): Integer; virtual; function ColumnIsEmpty(Node: PVirtualNode; Column: TColumnIndex): Boolean; override; function DoCreateEditor(Node: PVirtualNode; Column: TColumnIndex): IVTEditLink; override; function DoGetNodeHint(Node: PVirtualNode; Column: TColumnIndex; var LineBreakStyle: TVTTooltipLineBreakStyle): String; override; function DoGetNodeTooltip(Node: PVirtualNode; Column: TColumnIndex; var LineBreakStyle: TVTTooltipLineBreakStyle): String; override; function DoGetNodeWidth(Node: PVirtualNode; Column: TColumnIndex; Canvas: TCanvas = nil): Integer; override; procedure DoGetText(Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var Text: String); virtual; function DoIncrementalSearch(Node: PVirtualNode; const Text: String): Integer; override; procedure DoNewText(Node: PVirtualNode; Column: TColumnIndex; const Text: String); virtual; procedure DoPaintNode(var PaintInfo: TVTPaintInfo); override; procedure DoPaintText(Node: PVirtualNode; const Canvas: TCanvas; Column: TColumnIndex; TextType: TVSTTextType); virtual; function DoShortenString(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const S: String; Width: Integer; EllipsisWidth: Integer = 0): String; virtual; procedure DoTextDrawing(var PaintInfo: TVTPaintInfo; const Text: String; CellRect: TRect; DrawFormat: Cardinal); virtual; function DoTextMeasuring(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const Text: String): Integer; virtual; function GetOptionsClass: TTreeOptionsClass; override; function InternalData(Node: PVirtualNode): Pointer; procedure MainColumnChanged; override; function ReadChunk(Stream: TStream; Version: Integer; Node: PVirtualNode; ChunkType, ChunkSize: Integer): Boolean; override; function RenderOLEData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean): HResult; override; procedure WriteChunks(Stream: TStream; Node: PVirtualNode); override; property DefaultText: String read FDefaultText write SetDefaultText; property EllipsisWidth: Integer read FEllipsisWidth; property TreeOptions: TCustomStringTreeOptions read GetOptions write SetOptions; property OnGetHint: TVSTGetHintEvent read FOnGetHint write FOnGetHint; property OnGetText: TVSTGetTextEvent read FOnGetText write FOnGetText; property OnNewText: TVSTNewTextEvent read FOnNewText write FOnNewText; property OnPaintText: TVTPaintText read FOnPaintText write FOnPaintText; property OnShortenString: TVSTShortenStringEvent read FOnShortenString write FOnShortenString; property OnMeasureTextWidth: TVTMeasureTextWidthEvent read FOnMeasureTextWidth write FOnMeasureTextWidth; property OnDrawText: TVTDrawTextEvent read FOnDrawText write FOnDrawText; public constructor Create(AOwner: TComponent); override; function ComputeNodeHeight(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; S: String = ''): Integer; virtual; function ContentToClipboard(Format: Word; Source: TVSTTextSourceType): HGLOBAL; procedure ContentToCustom(Source: TVSTTextSourceType); function ContentToHTML(Source: TVSTTextSourceType; const Caption: String = ''): String; function ContentToRTF(Source: TVSTTextSourceType): AnsiString; function ContentToAnsi(Source: TVSTTextSourceType; const Separator: String): AnsiString; function ContentToText(Source: TVSTTextSourceType; const Separator: String): AnsiString; inline; function ContentToUnicode(Source: TVSTTextSourceType; const Separator: String): UnicodeString; inline; function ContentToUTF16(Source: TVSTTextSourceType; const Separator: String): UnicodeString; function ContentToUTF8(Source: TVSTTextSourceType; const Separator: String): String; {$ifndef LCLWin32} procedure CopyToClipBoard; override; procedure CutToClipBoard; override; {$endif} procedure GetTextInfo(Node: PVirtualNode; Column: TColumnIndex; const AFont: TFont; var R: TRect; out Text: String); override; function InvalidateNode(Node: PVirtualNode): TRect; override; function Path(Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; Delimiter: Char): String; procedure ReinitNode(Node: PVirtualNode; Recursive: Boolean); override; property ImageText[Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex]: String read GetImageText; property Text[Node: PVirtualNode; Column: TColumnIndex]: String read GetText write SetText; end; TVirtualStringTree = class(TCustomVirtualStringTree) private function GetOptions: TStringTreeOptions; procedure SetOptions(const Value: TStringTreeOptions); protected function GetOptionsClass: TTreeOptionsClass; override; public property Canvas; published {$ifdef EnableAccessible} property AccessibleName; {$endif} property Action; property Align; property Alignment; property Anchors; property AnimationDuration; property AutoExpandDelay; property AutoScrollDelay; property AutoScrollInterval; property Background; property BackgroundOffsetX; property BackgroundOffsetY; property BiDiMode; //property BevelEdges; //property BevelInner; //property BevelOuter; //property BevelKind; //property BevelWidth; property BorderSpacing; property BorderStyle default bsSingle; property BottomSpace; property ButtonFillMode; property ButtonStyle; property BorderWidth; property ChangeDelay; property CheckImageKind; property ClipboardFormats; property Color; property Colors; property Constraints; //todo: see a way to set CustomCheckImages at design time //property CustomCheckImages; property DefaultNodeHeight; property DefaultPasteMode; property DefaultText; property DragCursor; property DragHeight; property DragKind; property DragImageKind; property DragMode; property DragOperations; property DragType; property DragWidth; property DrawSelectionMode; property EditDelay; property Enabled; property Font; property Header; property HintMode; property HotCursor; property Images; property IncrementalSearch; property IncrementalSearchDirection; property IncrementalSearchStart; property IncrementalSearchTimeout; property Indent; property LineMode; property LineStyle; property Margin; property NodeAlignment; property NodeDataSize; property OperationCanceled; property ParentBiDiMode; property ParentColor default False; property ParentFont; property ParentShowHint; property PopupMenu; property RootNodeCount; property ScrollBarOptions; property SelectionBlendFactor; property SelectionCurveRadius; property ShowHint; property StateImages; property TabOrder; property TabStop default True; property TextMargin; property TreeOptions: TStringTreeOptions read GetOptions write SetOptions; property Visible; property WantTabs; property OnAdvancedHeaderDraw; property OnAfterAutoFitColumn; property OnAfterAutoFitColumns; property OnAfterCellPaint; property OnAfterColumnExport; property OnAfterColumnWidthTracking; property OnAfterGetMaxColumnWidth; property OnAfterHeaderExport; property OnAfterHeaderHeightTracking; property OnAfterItemErase; property OnAfterItemPaint; property OnAfterNodeExport; property OnAfterPaint; property OnAfterTreeExport; property OnBeforeAutoFitColumn; property OnBeforeAutoFitColumns; property OnBeforeCellPaint; property OnBeforeColumnExport; property OnBeforeColumnWidthTracking; property OnBeforeGetMaxColumnWidth; property OnBeforeHeaderExport; property OnBeforeHeaderHeightTracking; property OnBeforeItemErase; property OnBeforeItemPaint; property OnBeforeNodeExport; property OnBeforePaint; property OnBeforeTreeExport; property OnCanSplitterResizeColumn; property OnChange; property OnChecked; property OnChecking; property OnClick; property OnCollapsed; property OnCollapsing; property OnColumnClick; property OnColumnDblClick; property OnColumnExport; property OnColumnResize; property OnColumnWidthDblClickResize; property OnColumnWidthTracking; property OnCompareNodes; property OnContextPopup; property OnCreateDataObject; property OnCreateDragManager; property OnCreateEditor; property OnDblClick; property OnDragAllowed; property OnDragOver; property OnDragDrop; property OnDrawText; property OnEditCancelled; property OnEdited; property OnEditing; property OnEndDock; property OnEndDrag; property OnEnter; property OnExit; property OnExpanded; property OnExpanding; property OnFocusChanged; property OnFocusChanging; property OnFreeNode; property OnGetCellIsEmpty; property OnGetCursor; property OnGetHeaderCursor; property OnGetText; property OnPaintText; property OnGetHelpContext; property OnGetImageIndex; property OnGetImageIndexEx; property OnGetImageText; property OnGetHint; property OnGetLineStyle; property OnGetNodeDataSize; property OnGetPopupMenu; property OnGetUserClipboardFormats; property OnHeaderCheckBoxClick; property OnHeaderClick; property OnHeaderDblClick; property OnHeaderDragged; property OnHeaderDraggedOut; property OnHeaderDragging; property OnHeaderDraw; property OnHeaderDrawQueryElements; property OnHeaderHeightDblClickResize; property OnHeaderHeightTracking; property OnHeaderImageClick; property OnHeaderMouseDown; property OnHeaderMouseMove; property OnHeaderMouseUp; property OnHotChange; property OnIncrementalSearch; property OnInitChildren; property OnInitNode; property OnKeyAction; property OnKeyDown; property OnKeyPress; property OnKeyUp; property OnLoadNode; property OnMeasureItem; property OnMeasureTextWidth; property OnMouseDown; property OnMouseMove; property OnMouseUp; property OnMouseWheel; property OnNewText; property OnNodeCopied; property OnNodeCopying; property OnNodeExport; property OnNodeHeightDblClickResize; property OnNodeHeightTracking; property OnNodeMoved; property OnNodeMoving; property OnPaintBackground; property OnRenderOLEData; property OnResetNode; property OnResize; property OnSaveNode; property OnScroll; property OnShortenString; property OnShowScrollbar; property OnStartDock; property OnStartDrag; property OnStateChange; property OnStructureChange; property OnUpdating; property OnUTF8KeyPress; end; TVTDrawHintEvent = procedure(Sender: TBaseVirtualTree; HintCanvas: TCanvas; Node: PVirtualNode; const R: TRect; Column: TColumnIndex) of object; TVTDrawNodeEvent = procedure(Sender: TBaseVirtualTree; const PaintInfo: TVTPaintInfo) of object; TVTGetCellContentMarginEvent = procedure(Sender: TBaseVirtualTree; HintCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; CellContentMarginType: TVTCellContentMarginType; var CellContentMargin: TPoint) of object; TVTGetNodeWidthEvent = procedure(Sender: TBaseVirtualTree; HintCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; var NodeWidth: Integer) of object; TVTGetHintSizeEvent = procedure(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; var R: TRect) of object; // Tree descendant to let an application draw its stuff itself. TCustomVirtualDrawTree = class(TBaseVirtualTree) private FOnDrawNode: TVTDrawNodeEvent; FOnGetCellContentMargin: TVTGetCellContentMarginEvent; FOnGetNodeWidth: TVTGetNodeWidthEvent; FOnGetHintSize: TVTGetHintSizeEvent; FOnDrawHint: TVTDrawHintEvent; protected procedure DoDrawHint(Canvas: TCanvas; Node: PVirtualNode; const R: TRect; Column: TColumnIndex); function DoGetCellContentMargin(Node: PVirtualNode; Column: TColumnIndex; CellContentMarginType: TVTCellContentMarginType = ccmtAllSides; Canvas: TCanvas = nil): TPoint; override; procedure DoGetHintSize(Node: PVirtualNode; Column: TColumnIndex; var R: TRect); virtual; function DoGetNodeWidth(Node: PVirtualNode; Column: TColumnIndex; Canvas: TCanvas = nil): Integer; override; procedure DoPaintNode(var PaintInfo: TVTPaintInfo); override; property OnDrawHint: TVTDrawHintEvent read FOnDrawHint write FOnDrawHint; property OnDrawNode: TVTDrawNodeEvent read FOnDrawNode write FOnDrawNode; property OnGetCellContentMargin: TVTGetCellContentMarginEvent read FOnGetCellContentMargin write FOnGetCellContentMargin; property OnGetHintSize: TVTGetHintSizeEvent read FOnGetHintSize write FOnGetHintSize; property OnGetNodeWidth: TVTGetNodeWidthEvent read FOnGetNodeWidth write FOnGetNodeWidth; end; TVirtualDrawTree = class(TCustomVirtualDrawTree) private function GetOptions: TVirtualTreeOptions; procedure SetOptions(const Value: TVirtualTreeOptions); protected function GetOptionsClass: TTreeOptionsClass; override; public property Canvas; published property Action; property Align; property Alignment; property Anchors; property AnimationDuration; property AutoExpandDelay; property AutoScrollDelay; property AutoScrollInterval; property Background; property BackgroundOffsetX; property BackgroundOffsetY; property BiDiMode; //property BevelEdges; //property BevelInner; //property BevelOuter; //property BevelKind; // property BevelWidth; property BorderSpacing; property BorderStyle default bsSingle; property BottomSpace; property ButtonFillMode; property ButtonStyle; property BorderWidth; property ChangeDelay; property CheckImageKind; property ClipboardFormats; property Color; property Colors; property Constraints; property CustomCheckImages; property DefaultNodeHeight; property DefaultPasteMode; property DragCursor; property DragHeight; property DragKind; property DragImageKind; property DragMode; property DragOperations; property DragType; property DragWidth; property DrawSelectionMode; property EditDelay; property Enabled; property Font; property Header; property HintMode; property HotCursor; property Images; property IncrementalSearch; property IncrementalSearchDirection; property IncrementalSearchStart; property IncrementalSearchTimeout; property Indent; property LineMode; property LineStyle; property Margin; property NodeAlignment; property NodeDataSize; property OperationCanceled; property ParentBiDiMode; property ParentColor default False; property ParentFont; property ParentShowHint; property PopupMenu; property RootNodeCount; property ScrollBarOptions; property SelectionBlendFactor; property SelectionCurveRadius; property ShowHint; property StateImages; property TabOrder; property TabStop default True; property TextMargin; property TreeOptions: TVirtualTreeOptions read GetOptions write SetOptions; property Visible; property WantTabs; property OnAdvancedHeaderDraw; property OnAfterAutoFitColumn; property OnAfterAutoFitColumns; property OnAfterCellPaint; property OnAfterColumnExport; property OnAfterColumnWidthTracking; property OnAfterGetMaxColumnWidth; property OnAfterHeaderExport; property OnAfterHeaderHeightTracking; property OnAfterItemErase; property OnAfterItemPaint; property OnAfterNodeExport; property OnAfterPaint; property OnAfterTreeExport; property OnBeforeAutoFitColumn; property OnBeforeAutoFitColumns; property OnBeforeCellPaint; property OnBeforeColumnExport; property OnBeforeColumnWidthTracking; property OnBeforeGetMaxColumnWidth; property OnBeforeHeaderExport; property OnBeforeHeaderHeightTracking; property OnBeforeItemErase; property OnBeforeItemPaint; property OnBeforeNodeExport; property OnBeforePaint; property OnBeforeTreeExport; property OnCanSplitterResizeColumn; property OnChange; property OnChecked; property OnChecking; property OnClick; property OnCollapsed; property OnCollapsing; property OnColumnClick; property OnColumnDblClick; property OnColumnExport; property OnColumnResize; property OnColumnWidthDblClickResize; property OnColumnWidthTracking; property OnCompareNodes; property OnContextPopup; property OnCreateDataObject; property OnCreateDragManager; property OnCreateEditor; property OnDblClick; property OnDragAllowed; property OnDragOver; property OnDragDrop; property OnDrawHint; property OnDrawNode; property OnEdited; property OnEditing; property OnEndDock; property OnEndDrag; property OnEnter; property OnExit; property OnExpanded; property OnExpanding; property OnFocusChanged; property OnFocusChanging; property OnFreeNode; property OnGetCellIsEmpty; property OnGetCursor; property OnGetHeaderCursor; property OnGetHelpContext; property OnGetHintSize; property OnGetImageIndex; property OnGetImageIndexEx; property OnGetLineStyle; property OnGetNodeDataSize; property OnGetNodeWidth; property OnGetPopupMenu; property OnGetUserClipboardFormats; property OnHeaderCheckBoxClick; property OnHeaderClick; property OnHeaderDblClick; property OnHeaderDragged; property OnHeaderDraggedOut; property OnHeaderDragging; property OnHeaderDraw; property OnHeaderDrawQueryElements; property OnHeaderHeightTracking; property OnHeaderHeightDblClickResize; property OnHeaderImageClick; property OnHeaderMouseDown; property OnHeaderMouseMove; property OnHeaderMouseUp; property OnHotChange; property OnIncrementalSearch; property OnInitChildren; property OnInitNode; property OnKeyAction; property OnKeyDown; property OnKeyPress; property OnKeyUp; property OnLoadNode; property OnMeasureItem; property OnMouseDown; property OnMouseMove; property OnMouseUp; property OnMouseWheel; property OnNodeCopied; property OnNodeCopying; property OnNodeExport; property OnNodeHeightTracking; property OnNodeHeightDblClickResize; property OnNodeMoved; property OnNodeMoving; property OnPaintBackground; property OnRenderOLEData; property OnResetNode; property OnResize; property OnSaveNode; property OnScroll; property OnShowScrollbar; property OnStartDock; property OnStartDrag; property OnStateChange; property OnStructureChange; property OnUpdating; property OnUTF8KeyPress; end; // OLE Clipboard and drag'n drop helper procedure EnumerateVTClipboardFormats(TreeClass: TVirtualTreeClass; const List: TStrings); overload; procedure EnumerateVTClipboardFormats(TreeClass: TVirtualTreeClass; var Formats: TFormatEtcArray); overload; function GetVTClipboardFormatDescription(AFormat: Word): string; procedure RegisterVTClipboardFormat(AFormat: Word; TreeClass: TVirtualTreeClass; Priority: Cardinal); overload; function RegisterVTClipboardFormat(Description: string; TreeClass: TVirtualTreeClass; Priority: Cardinal; tymed: Integer = TYMED_HGLOBAL; ptd: PDVTargetDevice = nil; dwAspect: Integer = DVASPECT_CONTENT; lindex: Integer = -1): Word; overload; // utility routines {$ifdef EnablePrint} procedure PrtStretchDrawDIB(Canvas: TCanvas; DestRect: TRect; ABitmap: TBitmap); {$endif} function ShortenString(DC: HDC; const S: String; Width: Integer; EllipsisWidth: Integer = 0): String; function TreeFromNode(Node: PVirtualNode): TBaseVirtualTree; procedure GetStringDrawRect(DC: HDC; const S: String; var Bounds: TRect; DrawFormat: Cardinal); function WrapString(DC: HDC; const S: String; const Bounds: TRect; RTL: Boolean; DrawFormat: Cardinal): String; //---------------------------------------------------------------------------------------------------------------------- implementation uses StrUtils, Math, {$ifdef EnableOLE} //AxCtrls, // TOLEStream {$endif} {$ifdef UseFlatScrollbars} FlatSB, // wrapper for systems without flat SB support {$endif UseFlatScrollbars} {$ifdef Windows} MMSystem, // for animation timer (does not include further resources) {$else} FakeMMSystem, {$endif} TypInfo, // for migration stuff ActnList, StdActns, // for standard action support GraphType, LCLProc {$ifdef EnableAccessible} ,VTAccessibilityFactory {$endif}; // accessibility helper class resourcestring // Localizable strings. SEditLinkIsNil = 'Edit link must not be nil.'; SWrongMoveError = 'Target node cannot be a child node of the node to be moved.'; SWrongStreamFormat = 'Unable to load tree structure, the format is wrong.'; SWrongStreamVersion = 'Unable to load tree structure, the version is unknown.'; SStreamTooSmall = 'Unable to load tree structure, not enough data available.'; SCorruptStream1 = 'Stream data corrupt. A node''s anchor chunk is missing.'; SCorruptStream2 = 'Stream data corrupt. Unexpected data after node''s end position.'; SClipboardFailed = 'Clipboard operation failed.'; SCannotSetUserData = 'Cannot set initial user data because there is not enough user data space allocated.'; const ClipboardStates = [tsCopyPending, tsCutPending]; DefaultScrollUpdateFlags = [suoRepaintHeader, suoRepaintScrollbars, suoScrollClientArea, suoUpdateNCArea]; MinimumTimerInterval = 1; // minimum resolution for timeGetTime TreeNodeSize = (SizeOf(TVirtualNode) + 3) and not 3; // used for node allocation and access to internal data // Lookup to quickly convert a specific check state into its pressed counterpart and vice versa. PressedState: array[TCheckState] of TCheckState = ( csUncheckedPressed, csUncheckedPressed, csCheckedPressed, csCheckedPressed, csMixedPressed, csMixedPressed ); UnpressedState: array[TCheckState] of TCheckState = ( csUncheckedNormal, csUncheckedNormal, csCheckedNormal, csCheckedNormal, csMixedNormal, csMixedNormal ); MouseButtonDown = [tsLeftButtonDown, tsMiddleButtonDown, tsRightButtonDown]; // Do not modify the copyright in any way! Usage of this unit is prohibited without the copyright notice // in the compiled binary file. Copyright: string = 'Virtual Treeview ? 1999, 2010 Mike Lischke'; var //Workaround to LCL bug 8553 {$ifndef LCLWin32} pf32bit: TPixelFormat = pfDevice; {$endif} StandardOLEFormat: TFormatEtc = ( // Format must later be set. cfFormat: 0; // No specific target device to render on. ptd: nil; // Normal content to render. dwAspect: DVASPECT_CONTENT; // No specific page of multipage data (we don't use multipage data by default). lindex: -1; // Acceptable storage formats are IStream and global memory. The first is preferred. tymed: TYMED_ISTREAM or TYMED_HGLOBAL; ); type // streaming support TMagicID = array[0..5] of Char; TChunkHeader = record ChunkType, ChunkSize: Integer; // contains the size of the chunk excluding the header end; // base information about a node TBaseChunkBody = packed record ChildCount, NodeHeight: Cardinal; States: TVirtualNodeStates; Align: Byte; CheckState: TCheckState; CheckType: TCheckType; Reserved: Cardinal; end; TBaseChunk = packed record Header: TChunkHeader; Body: TBaseChunkBody; end; // Toggle animation modes. TToggleAnimationMode = ( tamScrollUp, tamScrollDown, tamNoScroll ); // Internally used data for animations. TToggleAnimationData = record Window: HWND; // copy of the tree's window handle DC: HDC; // the DC of the window to erase uncovered parts Brush: HBRUSH; // the brush to be used to erase uncovered parts R1, R2: TRect; // animation rectangles Mode1, Mode2: TToggleAnimationMode; // animation modes ScaleFactor: Double; // the factor between the missing step size when doing two animations MissedSteps: Double; end; const CheckImagesStrings: array [TCheckImageKind] of String = ('VT_CHECK_LIGHT', 'VT_CHECK_DARK', 'VT_TICK_LIGHT', 'VT_TICK_DARK', 'VT_FLAT', 'VT_XP', '',//ckCustom, // Only the button images are used for ckSystem * // The check buttons are draw at fly as requested 'VT_FLAT',//ckSystemFlat 'VT_CHECK_DARK' //ckSystemDefault ); MagicID: TMagicID = (#$45, 'V', 'T', Char(VTTreeStreamVersion), ' ', #$46); // chunk IDs NodeChunk = 1; BaseChunk = 2; // chunk containing node state, check state, child node count etc. // this chunk is immediately followed by all child nodes CaptionChunk = 3; // used by the string tree to store a node's caption UserChunk = 4; // used for data supplied by the application {$ifdef UseFlatScrollbars} ScrollBarProp: array[TScrollBarStyle] of Integer = ( FSB_REGULAR_MODE, FSB_FLAT_MODE, FSB_ENCARTA_MODE ); {$endif} RTLFlag: array[Boolean] of Integer = (0, ETO_RTLREADING); AlignmentToDrawFlag: array[TAlignment] of Cardinal = (DT_LEFT, DT_RIGHT, DT_CENTER); WideCR = WideChar(#13); WideLF = WideChar(#10); type // internal worker thread TWorkerThread = class(TThread) private FCurrentTree: TBaseVirtualTree; FWaiterList: TThreadList; FRefCount: Cardinal; protected procedure CancelValidation(Tree: TBaseVirtualTree); procedure ChangeTreeStates(EnterStates, LeaveStates: TChangeStates); procedure Execute; override; public constructor Create(CreateSuspended: Boolean); destructor Destroy; override; procedure AddTree(Tree: TBaseVirtualTree); procedure RemoveTree(Tree: TBaseVirtualTree); property CurrentTree: TBaseVirtualTree read FCurrentTree; end; var WorkerThread: TWorkerThread; WorkEvent: TEvent; UtilityImages: TBitmap; // some small additional images (e.g for header dragging) Initialized: Boolean; // True if global structures have been initialized. NeedToUnitialize: Boolean; // True if the OLE subsystem could be initialized successfully. //----------------- TClipboardFormats ---------------------------------------------------------------------------------- type PClipboardFormatListEntry = ^TClipboardFormatListEntry; TClipboardFormatListEntry = record Description: string; // The string used to register the format with Windows. TreeClass: TVirtualTreeClass; // The tree class which supports rendering this format. Priority: Cardinal; // Number which determines the order of formats used in IDataObject. FormatEtc: TFormatEtc; // The definition of the format in the IDataObject. end; TClipboardFormatList = class private FList: TFpList; procedure Sort; public constructor Create; destructor Destroy; override; procedure Add(FormatString: string; AClass: TVirtualTreeClass; Priority: Cardinal; AFormatEtc: TFormatEtc); procedure Clear; procedure EnumerateFormats(TreeClass: TVirtualTreeClass; var Formats: TFormatEtcArray; const AllowedFormats: TClipboardFormats = nil); overload; procedure EnumerateFormats(TreeClass: TVirtualTreeClass; const Formats: TStrings); overload; function FindFormat(FormatString: string): PClipboardFormatListEntry; overload; function FindFormat(FormatString: string; var Fmt: Word): TVirtualTreeClass; overload; function FindFormat(Fmt: Word; out Description: string): TVirtualTreeClass; overload; end; var InternalClipboardFormats: TClipboardFormatList; //---------------------------------------------------------------------------------------------------------------------- constructor TClipboardFormatList.Create; begin FList := TFpList.Create; end; //---------------------------------------------------------------------------------------------------------------------- destructor TClipboardFormatList.Destroy; begin Clear; FList.Free; inherited; end; //---------------------------------------------------------------------------------------------------------------------- procedure TClipboardFormatList.Sort; // Sorts all entry for priority (increasing priority value). //--------------- local function -------------------------------------------- procedure QuickSort(L, R: Integer); var I, J: Integer; P, T: PClipboardFormatListEntry; begin repeat I := L; J := R; P := FList[(L + R) shr 1]; repeat while PClipboardFormatListEntry(FList[I]).Priority < P.Priority do Inc(I); while PClipboardFormatListEntry(Flist[J]).Priority > P.Priority do Dec(J); if I <= J then begin T := Flist[I]; FList[I] := FList[J]; FList[J] := T; Inc(I); Dec(J); end; until I > J; if L < J then QuickSort(L, J); L := I; until I >= R; end; //--------------- end local function ---------------------------------------- begin if FList.Count > 1 then QuickSort(0, FList.Count - 1); end; //---------------------------------------------------------------------------------------------------------------------- procedure TClipboardFormatList.Add(FormatString: string; AClass: TVirtualTreeClass; Priority: Cardinal; AFormatEtc: TFormatEtc); // Adds the given data to the internal list. The priority value is used to sort formats for importance. Larger priority // values mean less priority. var Entry: PClipboardFormatListEntry; begin New(Entry); Entry.Description := FormatString; Entry.TreeClass := AClass; Entry.Priority := Priority; Entry.FormatEtc := AFormatEtc; FList.Add(Entry); Sort; end; //---------------------------------------------------------------------------------------------------------------------- procedure TClipboardFormatList.Clear; var I: Integer; begin for I := 0 to FList.Count - 1 do Dispose(PClipboardFormatListEntry(FList[I])); FList.Clear; end; //---------------------------------------------------------------------------------------------------------------------- procedure TClipboardFormatList.EnumerateFormats(TreeClass: TVirtualTreeClass; var Formats: TFormatEtcArray; const AllowedFormats: TClipboardFormats = nil); // Returns a list of format records for the given class. If assigned the AllowedFormats is used to limit the // enumerated formats to those described in the list. var I, Count: Integer; Entry: PClipboardFormatListEntry; begin SetLength(Formats, FList.Count); Count := 0; for I := 0 to FList.Count - 1 do begin Entry := FList[I]; // Does the tree class support this clipboard format? if TreeClass.InheritsFrom(Entry.TreeClass) then begin // Is this format allowed to be included? if (AllowedFormats = nil) or (AllowedFormats.IndexOf(Entry.Description) > -1) then begin // The list could change before we use the FormatEtc so it is best not to pass a pointer to the true FormatEtc // structure. Instead make a copy and send that. Formats[Count] := Entry.FormatEtc; Inc(Count); end; end; end; SetLength(Formats, Count); end; //---------------------------------------------------------------------------------------------------------------------- procedure TClipboardFormatList.EnumerateFormats(TreeClass: TVirtualTreeClass; const Formats: TStrings); // Returns a list of format descriptions for the given class. var I: Integer; Entry: PClipboardFormatListEntry; begin for I := 0 to FList.Count - 1 do begin Entry := FList[I]; if TreeClass.InheritsFrom(Entry.TreeClass) then Formats.Add(Entry.Description); end; end; //---------------------------------------------------------------------------------------------------------------------- function TClipboardFormatList.FindFormat(FormatString: string): PClipboardFormatListEntry; var I: Integer; Entry: PClipboardFormatListEntry; begin Result := nil; for I := FList.Count - 1 downto 0 do begin Entry := FList[I]; if CompareText(Entry.Description, FormatString) = 0 then begin Result := Entry; Break; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TClipboardFormatList.FindFormat(FormatString: string; var Fmt: Word): TVirtualTreeClass; var I: Integer; Entry: PClipboardFormatListEntry; begin Result := nil; for I := FList.Count - 1 downto 0 do begin Entry := FList[I]; if CompareText(Entry.Description, FormatString) = 0 then begin Result := Entry.TreeClass; Fmt := Entry.FormatEtc.cfFormat; Break; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TClipboardFormatList.FindFormat(Fmt: Word; out Description: string): TVirtualTreeClass; var I: Integer; Entry: PClipboardFormatListEntry; begin Result := nil; for I := FList.Count - 1 downto 0 do begin Entry := FList[I]; if Entry.FormatEtc.cfFormat = Fmt then begin Result := Entry.TreeClass; Description := Entry.Description; Break; end; end; end; //---------------------------------------------------------------------------------------------------------------------- type TClipboardFormatEntry = record ID: Word; Description: string; end; var ClipboardDescriptions: array [1..CF_MAX - 1] of TClipboardFormatEntry = ( (ID: CF_TEXT; Description: 'Plain text'), // Do not localize (ID: CF_BITMAP; Description: 'Windows bitmap'), // Do not localize (ID: CF_METAFILEPICT; Description: 'Windows metafile'), // Do not localize (ID: CF_SYLK; Description: 'Symbolic link'), // Do not localize (ID: CF_DIF; Description: 'Data interchange format'), // Do not localize (ID: CF_TIFF; Description: 'Tiff image'), // Do not localize (ID: CF_OEMTEXT; Description: 'OEM text'), // Do not localize (ID: CF_DIB; Description: 'DIB image'), // Do not localize (ID: CF_PALETTE; Description: 'Palette data'), // Do not localize (ID: CF_PENDATA; Description: 'Pen data'), // Do not localize (ID: CF_RIFF; Description: 'Riff audio data'), // Do not localize (ID: CF_WAVE; Description: 'Wav audio data'), // Do not localize (ID: CF_UNICODETEXT; Description: 'Unicode text'), // Do not localize (ID: CF_ENHMETAFILE; Description: 'Enhanced metafile image'), // Do not localize (ID: CF_HDROP; Description: 'File name(s)'), // Do not localize (ID: CF_LOCALE; Description: 'Locale descriptor') // Do not localize ); //---------------------------------------------------------------------------------------------------------------------- procedure EnumerateVTClipboardFormats(TreeClass: TVirtualTreeClass; const List: TStrings); begin if InternalClipboardFormats = nil then InternalClipboardFormats := TClipboardFormatList.Create; InternalClipboardFormats.EnumerateFormats(TreeClass, List); end; //---------------------------------------------------------------------------------------------------------------------- procedure EnumerateVTClipboardFormats(TreeClass: TVirtualTreeClass; var Formats: TFormatEtcArray); begin if InternalClipboardFormats = nil then InternalClipboardFormats := TClipboardFormatList.Create; InternalClipboardFormats.EnumerateFormats(TreeClass, Formats); end; //---------------------------------------------------------------------------------------------------------------------- function GetVTClipboardFormatDescription(AFormat: Word): string; begin if InternalClipboardFormats = nil then InternalClipboardFormats := TClipboardFormatList.Create; if InternalClipboardFormats.FindFormat(AFormat, Result) = nil then Result := ''; end; //---------------------------------------------------------------------------------------------------------------------- procedure RegisterVTClipboardFormat(AFormat: Word; TreeClass: TVirtualTreeClass; Priority: Cardinal); // Registers the given clipboard format for the given TreeClass. var I: Integer; FormatEtc: TFormatEtc; begin if InternalClipboardFormats = nil then InternalClipboardFormats := TClipboardFormatList.Create; // Assumes a HGlobal format. FormatEtc.cfFormat := AFormat; FormatEtc.ptd := nil; FormatEtc.dwAspect := DVASPECT_CONTENT; FormatEtc.lindex := -1; FormatEtc.tymed := TYMED_HGLOBAL; // Determine description string of the given format. For predefined formats we need the lookup table because they // don't have a description string. For registered formats the description string is the string which was used // to register them. if AFormat < CF_MAX then begin for I := 1 to High(ClipboardDescriptions) do if ClipboardDescriptions[I].ID = AFormat then begin InternalClipboardFormats.Add(ClipboardDescriptions[I].Description, TreeClass, Priority, FormatEtc); Break; end; end else begin InternalClipboardFormats.Add(ClipboardFormatToMimeType(AFormat), TreeClass, Priority, FormatEtc); end; end; //---------------------------------------------------------------------------------------------------------------------- function RegisterVTClipboardFormat(Description: string; TreeClass: TVirtualTreeClass; Priority: Cardinal; tymed: Integer = TYMED_HGLOBAL; ptd: PDVTargetDevice = nil; dwAspect: Integer = DVASPECT_CONTENT; lindex: Integer = -1): Word; // Alternative method to register a certain clipboard format for a given tree class. Registration with the // clipboard is done here too and the assigned ID returned by the function. // tymed may contain or'ed TYMED constants which allows to register several storage formats for one clipboard format. var FormatEtc: TFormatEtc; begin if InternalClipboardFormats = nil then InternalClipboardFormats := TClipboardFormatList.Create; Result := ClipboardRegisterFormat(Description); FormatEtc.cfFormat := Result; FormatEtc.ptd := ptd; FormatEtc.dwAspect := dwAspect; FormatEtc.lindex := lindex; FormatEtc.tymed := tymed; InternalClipboardFormats.Add(Description, TreeClass, Priority, FormatEtc); end; //----------------- utility functions ---------------------------------------------------------------------------------- procedure ShowError(Msg: String; HelpContext: Integer); begin raise EVirtualTreeError.CreateHelp(Msg, HelpContext); end; //---------------------------------------------------------------------------------------------------------------------- function TreeFromNode(Node: PVirtualNode): TBaseVirtualTree; // Returns the tree the node currently belongs to or nil if the node is not attached to a tree. begin Assert(Assigned(Node), 'Node must not be nil.'); // The root node is marked by having its NextSibling (and PrevSibling) pointing to itself. while Assigned(Node) and (Node.NextSibling <> Node) do Node := Node.Parent; if Assigned(Node) then Result := TBaseVirtualTree(Node.Parent) else Result := nil; end; //---------------------------------------------------------------------------------------------------------------------- function OrderRect(const R: TRect): TRect; // Converts the incoming rectangle so that left and top are always less than or equal to right and bottom. begin if R.Left < R.Right then begin Result.Left := R.Left; Result.Right := R.Right; end else begin Result.Left := R.Right; Result.Right := R.Left; end; if R.Top < R.Bottom then begin Result.Top := R.Top; Result.Bottom := R.Bottom; end else begin Result.Top := R.Bottom; Result.Bottom := R.Top; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure QuickSort(const TheArray: TNodeArray; L, R: Integer); var I, J: Integer; P, T: Pointer; begin repeat I := L; J := R; P := TheArray[(L + R) shr 1]; repeat while TheArray[I] < P do Inc(I); while TheArray[J] > P do Dec(J); if I <= J then begin T := TheArray[I]; TheArray[I] := TheArray[J]; TheArray[J] := T; Inc(I); Dec(J); end; until I > J; if L < J then QuickSort(TheArray, L, J); L := I; until I >= R; end; //---------------------------------------------------------------------------------------------------------------------- //todo: Unify the procedure or change to widgetset specific // Currently the UTF-8 version is broken. // the unicode version is used when all winapi is available {$ifndef INCOMPLETE_WINAPI} function ShortenString(DC: HDC; const S: String; Width: Integer; EllipsisWidth: Integer = 0): String; // Adjusts the given string S so that it fits into the given width. EllipsisWidth gives the width of // the three points to be added to the shorted string. If this value is 0 then it will be determined implicitely. // For higher speed (and multiple entries to be shorted) specify this value explicitely. // Note: It is assumed that the string really needs shortage. Check this in advance. var Size: TSize; Len: Integer; L, H, N, W: Integer; WideStr: UnicodeString; begin WideStr := UTF8Decode(S); Len := Length(WideStr); if (Len = 0) or (Width <= 0) then Result := '' else begin // Determine width of triple point using the current DC settings (if not already done). if EllipsisWidth = 0 then begin GetTextExtentPoint32W(DC, '...', 3, Size); EllipsisWidth := Size.cx; end; if Width <= EllipsisWidth then Result := '' else begin // Do a binary search for the optimal string length which fits into the given width. L := 0; H := Len - 1; while L < H do begin N := (L + H + 1) shr 1; GetTextExtentPoint32W(DC, PWideChar(WideStr), N, Size); W := Size.cx + EllipsisWidth; if W <= Width then L := N else H := N - 1; end; Result := UTF8Encode(Copy(WideStr, 1, L) + '...'); end; end; end; {$else} function ShortenString(DC: HDC; const S: String; Width: Integer; EllipsisWidth: Integer = 0): String; // Adjusts the given string S so that it fits into the given width. EllipsisWidth gives the width of // the three points to be added to the shorted string. If this value is 0 then it will be determined implicitely. // For higher speed (and multiple entries to be shorted) specify this value explicitely. // Note: It is assumed that the string really needs shortage. Check this in advance. var Size: TSize; Len: Integer; L, H, N, W: Integer; begin Len := Length(S); if (Len = 0) or (Width <= 0) then Result := '' else begin // Determine width of triple point using the current DC settings (if not already done). if EllipsisWidth = 0 then begin GetTextExtentPoint32(DC, '...', 3, Size); EllipsisWidth := Size.cx; end; if Width <= EllipsisWidth then Result := '' else begin // Do a binary search for the optimal string length which fits into the given width. L := 0; H := Len - 1; while L < H do begin N := (L + H + 1) shr 1; GetTextExtentPoint32(DC, PAnsiChar(S), N, Size); W := Size.cx + EllipsisWidth; if W <= Width then L := N else H := N - 1; end; Result := Copy(S, 1, L) + '...'; end; end; end; {$endif} //---------------------------------------------------------------------------------------------------------------------- function WrapString(DC: HDC; const S: String; const Bounds: TRect; RTL: Boolean; DrawFormat: Cardinal): String; // Wrap the given string S so that it fits into a space of given width. // RTL determines if right-to-left reading is active. var Width, Len, WordCounter, WordsInLine, I, W: Integer; Buffer, Line: String; Words: Array of String; R: TRect; begin Result := ''; Width := Bounds.Right - Bounds.Left; R := Rect(0, 0, 0, 0); // Leading and trailing are ignored. Buffer := Trim(S); Len := Length(Buffer); if Len < 1 then Exit; // Count the words in the string. WordCounter := 1; for I := 1 to Len do if Buffer[I] = ' ' then Inc(WordCounter); SetLength(Words, WordCounter); if RTL then begin // At first we split the string into words with the last word being the // first element in Words. W := 0; for I := 1 to Len do if Buffer[I] = ' ' then Inc(W) else Words[W] := Words[W] + Buffer[I]; // Compose Result. while WordCounter > 0 do begin WordsInLine := 0; Line := ''; while WordCounter > 0 do begin GetStringDrawRect(DC, Line + IfThen(WordsInLine > 0, ' ', '') + Words[WordCounter - 1], R, DrawFormat); if R.Right > Width then begin // If at least one word fits into this line then continue with the next line. if WordsInLine > 0 then Break; Buffer := Words[WordCounter - 1]; if Len > 1 then begin for Len := Length(Buffer) - 1 downto 2 do begin GetStringDrawRect(DC, RightStr(Buffer, Len), R, DrawFormat); if R.Right <= Width then Break; end; end else Len := Length(Buffer); Line := Line + RightStr(Buffer, Max(Len, 1)); Words[WordCounter - 1] := LeftStr(Buffer, Length(Buffer) - Max(Len, 1)); if Words[WordCounter - 1] = '' then Dec(WordCounter); Break; end else begin Dec(WordCounter); Line := Words[WordCounter] + IfThen(WordsInLine > 0, ' ', '') + Line; Inc(WordsInLine); end; end; Result := Result + Line + LineEnding; end; end else begin // At first we split the string into words with the last word being the // first element in Words. W := WordCounter - 1; for I := 1 to Len do if Buffer[I] = ' ' then Dec(W) else Words[W] := Words[W] + Buffer[I]; // Compose Result. while WordCounter > 0 do begin WordsInLine := 0; Line := ''; while WordCounter > 0 do begin GetStringDrawRect(DC, Line + IfThen(WordsInLine > 0, ' ', '') + Words[WordCounter - 1], R, DrawFormat); if R.Right > Width then begin // If at least one word fits into this line then continue with the next line. if WordsInLine > 0 then Break; Buffer := Words[WordCounter - 1]; if Len > 1 then begin for Len := Length(Buffer) - 1 downto 2 do begin GetStringDrawRect(DC, LeftStr(Buffer, Len), R, DrawFormat); if R.Right <= Width then Break; end; end else Len := Length(Buffer); Line := Line + LeftStr(Buffer, Max(Len, 1)); Words[WordCounter - 1] := RightStr(Buffer, Length(Buffer) - Max(Len, 1)); if Words[WordCounter - 1] = '' then Dec(WordCounter); Break; end else begin Dec(WordCounter); Line := Line + IfThen(WordsInLine > 0, ' ', '') + Words[WordCounter]; Inc(WordsInLine); end; end; Result := Result + Line + LineEnding; end; end; Len := Length(Result) - Length(LineEnding); if CompareByte(Result[Len + 1], String(LineEnding)[1], Length(LineEnding)) = 0 then SetLength(Result, Len); end; //---------------------------------------------------------------------------------------------------------------------- // Calculates bounds of a drawing rectangle for the given string procedure GetStringDrawRect(DC: HDC; const S: String; var Bounds: TRect; DrawFormat: Cardinal); begin Bounds.Right := Bounds.Left + 1; Bounds.Bottom := Bounds.Top + 1; DrawText(DC, PChar(S), Length(S), Bounds, DrawFormat or DT_CALCRECT); end; //---------------------------------------------------------------------------------------------------------------------- procedure FillDragRectangles(DragWidth, DragHeight, DeltaX, DeltaY: Integer; out RClip, RScroll, RSamp1, RSamp2, RDraw1, RDraw2: TRect); // Fills the given rectangles with values which can be used while dragging around an image // (used in DragMove of the drag manager and DragTo of the header columns). begin // ScrollDC limits RClip := Rect(0, 0, DragWidth, DragHeight); if DeltaX > 0 then begin // move to the left if DeltaY = 0 then begin // move only to the left // background movement RScroll := Rect(0, 0, DragWidth - DeltaX, DragHeight); RSamp1 := Rect(0, 0, DeltaX, DragHeight); RDraw1 := Rect(DragWidth - DeltaX, 0, DeltaX, DragHeight); end else if DeltaY < 0 then begin // move to bottom left RScroll := Rect(0, -DeltaY, DragWidth - DeltaX, DragHeight); RSamp1 := Rect(0, 0, DeltaX, DragHeight); RSamp2 := Rect(DeltaX, DragHeight + DeltaY, DragWidth - DeltaX, -DeltaY); RDraw1 := Rect(0, 0, DragWidth - DeltaX, -DeltaY); RDraw2 := Rect(DragWidth - DeltaX, 0, DeltaX, DragHeight); end else begin // move to upper left RScroll := Rect(0, 0, DragWidth - DeltaX, DragHeight - DeltaY); RSamp1 := Rect(0, 0, DeltaX, DragHeight); RSamp2 := Rect(DeltaX, 0, DragWidth - DeltaX, DeltaY); RDraw1 := Rect(0, DragHeight - DeltaY, DragWidth - DeltaX, DeltaY); RDraw2 := Rect(DragWidth - DeltaX, 0, DeltaX, DragHeight); end; end else if DeltaX = 0 then begin // vertical movement only if DeltaY < 0 then begin // move downwards RScroll := Rect(0, -DeltaY, DragWidth, DragHeight); RSamp2 := Rect(0, DragHeight + DeltaY, DragWidth, -DeltaY); RDraw2 := Rect(0, 0, DragWidth, -DeltaY); end else begin // move upwards RScroll := Rect(0, 0, DragWidth, DragHeight - DeltaY); RSamp2 := Rect(0, 0, DragWidth, DeltaY); RDraw2 := Rect(0, DragHeight - DeltaY, DragWidth, DeltaY); end; end else begin // move to the right if DeltaY > 0 then begin // move up right RScroll := Rect(-DeltaX, 0, DragWidth, DragHeight); RSamp1 := Rect(0, 0, DragWidth + DeltaX, DeltaY); RSamp2 := Rect(DragWidth + DeltaX, 0, -DeltaX, DragHeight); RDraw1 := Rect(0, 0, -DeltaX, DragHeight); RDraw2 := Rect(-DeltaX, DragHeight - DeltaY, DragWidth + DeltaX, DeltaY); end else if DeltaY = 0 then begin // to the right only RScroll := Rect(-DeltaX, 0, DragWidth, DragHeight); RSamp1 := Rect(DragWidth + DeltaX, 0, -DeltaX, DragHeight); RDraw1 := Rect(0, 0, -DeltaX, DragHeight); end else begin // move down right RScroll := Rect(-DeltaX, -DeltaY, DragWidth, DragHeight); RSamp1 := Rect(0, DragHeight + DeltaY, DragWidth + DeltaX, -DeltaY); RSamp2 := Rect(DragWidth + DeltaX, 0, -DeltaX, DragHeight); RDraw1 := Rect(0, 0, -DeltaX, DragHeight); RDraw2 := Rect(-DeltaX, 0, DragWidth + DeltaX, -DeltaY); end; end; end; //---------------------------------------------------------------------------------------------------------------------- function GetRGBColor(Value: TColor): DWORD; // Little helper to convert a Delphi color to an image list color. begin Result := ColorToRGB(Value); case Result of clNone: Result := CLR_NONE; clDefault: Result := CLR_DEFAULT; end; end; //---------------------------------------------------------------------------------------------------------------------- {$ifdef CPU64} function HasMMX: Boolean; begin Result := True; end; {$else} function HasMMX: Boolean; // Helper method to determine whether the current processor supports MMX. asm PUSH EBX XOR EAX, EAX // Result := False PUSHFD // determine if the processor supports the CPUID command POP EDX MOV ECX, EDX XOR EDX, $200000 PUSH EDX POPFD PUSHFD POP EDX XOR ECX, EDX JZ @1 // no CPUID support so we can't even get to the feature information PUSH EDX POPFD MOV EAX, 1 DW $A20F // CPUID, EAX contains now version info and EDX feature information MOV EBX, EAX // free EAX to get the result value XOR EAX, EAX // Result := False CMP EBX, $50 JB @1 // if processor family is < 5 then it is not a Pentium class processor TEST EDX, $800000 JZ @1 // if the MMX bit is not set then we don't have MMX INC EAX // Result := True @1: POP EBX end; {$endif} //---------------------------------------------------------------------------------------------------------------------- {$ifdef EnablePrint} procedure PrtStretchDrawDIB(Canvas: TCanvas; DestRect: TRect; ABitmap: TBitmap); // Stretch draw on to the new canvas. var Header, Bits: Pointer; HeaderSize, BitsSize: Cardinal; begin GetDIBSizes(ABitmap.Handle, HeaderSize, BitsSize); GetMem(Header, HeaderSize); GetMem(Bits, BitsSize); try GetDIB(ABitmap.Handle, ABitmap.Palette, Header^, Bits^); StretchDIBits(Canvas.Handle, DestRect.Left, DestRect.Top, DestRect.Right - DestRect.Left, DestRect.Bottom - DestRect.Top, 0, 0, ABitmap.Width, ABitmap.Height, Bits, TBitmapInfo(Header^), DIB_RGB_COLORS, SRCCOPY); finally FreeMem(Header); FreeMem(Bits); end; end; {$endif} //---------------------------------------------------------------------------------------------------------------------- {$ifdef EnableAccessible} procedure GetAccessibilityFactory; // Accessibility helper function to create a singleton class that will create or return // the IAccessible interface for the tree and the focused node. begin // Check to see if the class has already been created. if VTAccessibleFactory = nil then VTAccessibleFactory := TVTAccessibilityFactory.Create; end; {$endif} //---------------------------------------------------------------------------------------------------------------------- procedure InitializeGlobalStructures; // initialization of stuff global to the unit begin Initialized := True; // For the drag image a fast MMX blend routine is used. We have to make sure MMX is available. MMXAvailable := HasMMX; // There is a bug in Win95 and WinME (and potentially in Win98 too) regarding GetDCEx which causes sometimes // serious trouble within GDI (see method WMNCPaint). //IsWinNT := (Win32Platform and VER_PLATFORM_WIN32_NT) <> 0; IsWinNT := True; {$ifdef EnableOLE} // Initialize OLE subsystem for drag'n drop and clipboard operations. //todo: replace by Suceeded (see in windows unit) NeedToUnitialize := OleInitialize(nil) in [S_FALSE,S_OK]; {$endif} // Register the tree reference clipboard format. Others will be handled in InternalClipboarFormats. CF_VTREFERENCE := ClipboardRegisterFormat(CFSTR_VTREFERENCE); UtilityImages := TBitmap.Create; UtilityImages.Transparent := True; UtilityImages.LoadFromLazarusResource('VT_UTILITIES'); // Specify an useful timer resolution for timeGetTime. timeBeginPeriod(MinimumTimerInterval); // Delphi (at least version 6 and lower) does not provide a standard split cursor. // Hence we have to load our own. Screen.Cursors[crHeaderSplit] := LoadCursorFromLazarusResource('VT_HEADERSPLIT'); Screen.Cursors[crVertSplit] := LoadCursorFromLazarusResource('VT_VERTSPLIT'); // Clipboard format registration. // Native clipboard format. Needs a new identifier and has an average priority to allow other formats to take over. // This format is supposed to use the IStream storage format but unfortunately this does not work when // OLEFlushClipboard is used. Hence it is disabled until somebody finds a solution. CF_VIRTUALTREE := RegisterVTClipboardFormat(CFSTR_VIRTUALTREE, TBaseVirtualTree, 50, TYMED_HGLOBAL {or TYMED_ISTREAM}); // Specialized string tree formats. CF_HTML := RegisterVTClipboardFormat(CFSTR_HTML, TCustomVirtualStringTree, 80); CF_VRTFNOOBJS := RegisterVTClipboardFormat(CFSTR_RTFNOOBJS, TCustomVirtualStringTree, 84); CF_VRTF := RegisterVTClipboardFormat(CFSTR_RTF, TCustomVirtualStringTree, 85); CF_CSV := RegisterVTClipboardFormat(CFSTR_CSV, TCustomVirtualStringTree, 90); // Predefined clipboard formats. Just add them to the internal list. RegisterVTClipboardFormat(CF_TEXT, TCustomVirtualStringTree, 100); RegisterVTClipboardFormat(CF_UNICODETEXT, TCustomVirtualStringTree, 95); end; //---------------------------------------------------------------------------------------------------------------------- procedure FinalizeGlobalStructures; begin timeEndPeriod(MinimumTimerInterval); FreeAndNil(UtilityImages); if NeedToUnitialize then OleUninitialize; end; //----------------- TWorkerThread -------------------------------------------------------------------------------------- procedure AddThreadReference; begin if WorkerThread = nil then begin // Create an event used to trigger our worker thread when something is to do. WorkEvent := TEvent.Create(nil, False, False, ''); //todo: see how to check if a event was succesfully created under linux since handle is allways 0 {$ifdef Windows} if WorkEvent.Handle = TEventHandle(0) then Raise Exception.Create('VirtualTreeView - Error creating TEvent instance'); {$endif} // Create worker thread, initialize it and send it to its wait loop. WorkerThread := TWorkerThread.Create(False); end; Inc(WorkerThread.FRefCount); end; //---------------------------------------------------------------------------------------------------------------------- procedure ReleaseThreadReference(Tree: TBaseVirtualTree); begin if Assigned(WorkerThread) then begin Dec(WorkerThread.FRefCount); // Make sure there is no reference remaining to the releasing tree. Tree.InterruptValidation; if WorkerThread.FRefCount = 0 then begin with WorkerThread do begin Terminate; WorkEvent.SetEvent; //lcl: probably not necessary under fpc. Remove later // The following work around is no longer necessary with Delphi 6 and up. {$ifndef fpc} // There is a problem when the thread is freed in the exit code of a DLL. This can happen when a tree is // destroyed on unload of a DLL (e.g. control panel applet). In this case only the main thread will get // CPU time, other threads will never awake again. The VCL however waits for a thread when freeing it // which will result in a deadlock (the WaitFor call does not return because the thread does not get CPU time). // If a thread is however suspended then the VCL does not wait and all is fine. if IsLibrary then Suspend; {$endif} WorkerThread.Free; end; WorkerThread := nil; WorkEvent.Free; end; end; end; //---------------------------------------------------------------------------------------------------------------------- constructor TWorkerThread.Create(CreateSuspended: Boolean); begin inherited Create(CreateSuspended); FWaiterList := TThreadList.Create; end; //---------------------------------------------------------------------------------------------------------------------- destructor TWorkerThread.Destroy; begin // First let the ancestor stop the thread before freeing our resources. inherited; FWaiterList.Free; end; //---------------------------------------------------------------------------------------------------------------------- procedure TWorkerThread.CancelValidation(Tree: TBaseVirtualTree); var Msg: TMsg; begin // Wait for any references to this tree to be released. // Pump WM_CHANGESTATE messages so the thread doesn't block on SendMessage calls. while FCurrentTree = Tree do begin if Tree.HandleAllocated and PeekMessage(Msg, Tree.Handle, WM_CHANGESTATE, WM_CHANGESTATE, PM_REMOVE) then begin //todo: see if is correct / will work Application.ProcessMessages; //TranslateMessage(Msg); //DispatchMessage(Msg); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TWorkerThread.ChangeTreeStates(EnterStates, LeaveStates: TChangeStates); begin if Assigned(FCurrentTree) and (FCurrentTree.HandleAllocated) then SendMessage(FCurrentTree.Handle, WM_CHANGESTATE, Byte(EnterStates), Byte(LeaveStates)); end; //---------------------------------------------------------------------------------------------------------------------- procedure TWorkerThread.Execute; // Does some background tasks, like validating tree caches. var EnterStates, LeaveStates: TChangeStates; begin while not Terminated do begin WorkEvent.WaitFor(INFINITE); if not Terminated then begin // Get the next waiting tree. with FWaiterList.LockList do try if Count > 0 then begin FCurrentTree := Items[0]; // Remove this tree from waiter list. Delete(0); // If there is yet another tree to work on then set the work event to keep looping. if Count > 0 then WorkEvent.SetEvent; end else FCurrentTree := nil; finally FWaiterList.UnlockList; end; // Something to do? if Assigned(FCurrentTree) then begin try ChangeTreeStates([csValidating], [csUseCache]); EnterStates := []; if not (tsStopValidation in FCurrentTree.FStates) and FCurrentTree.DoValidateCache then EnterStates := [csUseCache]; finally LeaveStates := [csValidating, csStopValidation]; if csUseCache in EnterStates then Include(LeaveStates, csValidationNeeded); ChangeTreeStates(EnterStates, LeaveStates); FCurrentTree := nil; end; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TWorkerThread.AddTree(Tree: TBaseVirtualTree); begin Assert(Assigned(Tree), 'Tree must not be nil.'); // Remove validation stop flag, just in case it is still set. Tree.DoStateChange([], [tsStopValidation]); with FWaiterList.LockList do try if IndexOf(Tree) = -1 then Add(Tree); finally FWaiterList.UnlockList; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TWorkerThread.RemoveTree(Tree: TBaseVirtualTree); begin Assert(Assigned(Tree), 'Tree must not be nil.'); with FWaiterList.LockList do try Remove(Tree); finally FWaiterList.UnlockList; end; CancelValidation(Tree); end; //----------------- TBufferedUTF8String -------------------------------------------------------------------------------- const AllocIncrement = 2 shl 11; // Must be a power of 2. destructor TBufferedUTF8String.Destroy; begin FreeMem(FStart); inherited; end; //---------------------------------------------------------------------------------------------------------------------- function TBufferedUTF8String.GetAsAnsiString: AnsiString; begin //an implicit conversion is done Result := AsUTF16String; end; //---------------------------------------------------------------------------------------------------------------------- function TBufferedUTF8String.GetAsUTF16String: UnicodeString; begin //todo: optimize Result := UTF8Decode(AsUTF8String); end; //---------------------------------------------------------------------------------------------------------------------- function TBufferedUTF8String.GetAsUTF8String: String; begin SetString(Result, FStart, FPosition - FStart); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBufferedUTF8String.Add(const S: String); var NewLen, LastOffset, Len: Integer; begin Len := Length(S); // Make room for the new string. if FEnd - FPosition <= Len then begin // Round up NewLen so it is always a multiple of AllocIncrement. NewLen := FEnd - FStart + (Len + AllocIncrement - 1) and not (AllocIncrement - 1); // Keep last offset to restore it correctly in the case that FStart gets a new memory block assigned. LastOffset := FPosition - FStart; ReallocMem(FStart, NewLen); FPosition := FStart + LastOffset; FEnd := FStart + NewLen; end; Move(PChar(S)^, FPosition^, Len); Inc(FPosition, Len); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBufferedUTF8String.AddNewLine; var NewLen, LastOffset: Integer; begin // Make room for the CR/LF characters. if FEnd - FPosition <= 4 then begin //todo: see in calculation of NewLen is correct for String // Round up NewLen so it is always a multiple of AllocIncrement. NewLen := FEnd - FStart + (2 + AllocIncrement - 1) and not (AllocIncrement - 1); // Keep last offset to restore it correctly in the case that FStart gets a new memory block assigned. LastOffset := FPosition - FStart; ReallocMem(FStart, NewLen); FPosition := FStart + LastOffset; FEnd := FStart + NewLen; end; FPosition^ := #13; Inc(FPosition); FPosition^ := #10; Inc(FPosition); end; //----------------- TCustomVirtualTreeOptions -------------------------------------------------------------------------- constructor TCustomVirtualTreeOptions.Create(AOwner: TBaseVirtualTree); begin FOwner := AOwner; FPaintOptions := DefaultPaintOptions; FAnimationOptions := DefaultAnimationOptions; FAutoOptions := DefaultAutoOptions; FSelectionOptions := DefaultSelectionOptions; FMiscOptions := DefaultMiscOptions; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualTreeOptions.SetAnimationOptions(const Value: TVTAnimationOptions); begin FAnimationOptions := Value; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualTreeOptions.SetAutoOptions(const Value: TVTAutoOptions); var ChangedOptions: TVTAutoOptions; begin if FAutoOptions <> Value then begin // Exclusive ORing to get all entries wich are in either set but not in both. ChangedOptions := FAutoOptions + Value - (FAutoOptions * Value); FAutoOptions := Value; with FOwner do if (toAutoSpanColumns in ChangedOptions) and not (csLoading in ComponentState) and HandleAllocated then Invalidate; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualTreeOptions.SetMiscOptions(const Value: TVTMiscOptions); var ToBeSet, ToBeCleared: TVTMiscOptions; begin if FMiscOptions <> Value then begin ToBeSet := Value - FMiscOptions; ToBeCleared := FMiscOptions - Value; FMiscOptions := Value; {$ifndef Windows} Exclude(FMiscOptions,toAcceptOLEDrop); Exclude(ToBeCleared,toAcceptOLEDrop); Exclude(ToBeSet,toAcceptOLEDrop); {$endif} with FOwner do if not (csLoading in ComponentState) and HandleAllocated then begin if toCheckSupport in ToBeSet + ToBeCleared then begin CheckImageListNeeded; Invalidate; end; if not (csDesigning in ComponentState) then begin if toFullRepaintOnResize in (TobeSet + ToBeCleared) then //todo_lcl_check RecreateWnd(FOwner); if toAcceptOLEDrop in ToBeSet then RegisterDragDrop(Handle, DragManager as IDropTarget); if toAcceptOLEDrop in ToBeCleared then RevokeDragDrop(Handle); end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualTreeOptions.SetPaintOptions(const Value: TVTPaintOptions); var ToBeSet, ToBeCleared: TVTPaintOptions; begin if FPaintOptions <> Value then begin ToBeSet := Value - FPaintOptions; ToBeCleared := FPaintOptions - Value; FPaintOptions := Value; with FOwner do if HandleAllocated then begin {$ifdef ThemeSupport} //todo // if (tsUseThemes in FStates) or (toThemeAware in ToBeSet) then // if (toUseExplorerTheme in ToBeSet) and IsWinVistaOrAbove then // SetWindowTheme(Handle, 'explorer', nil) // else // SetWindowTheme(Handle, '', nil); {$endif ThemeSupport} if not (csLoading in ComponentState) then begin {$ifdef ThemeSupport} if (toThemeAware in ToBeSet + ToBeCleared) or (toUseExplorerTheme in ToBeSet + ToBeCleared) then begin if (toThemeAware in ToBeSet) and ThemeServices.ThemesEnabled then DoStateChange([tsUseThemes]) else if (toThemeAware in ToBeCleared) then DoStateChange([], [tsUseThemes]); PrepareBitmaps(True, False); RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_VALIDATE or RDW_FRAME); end else {$endif ThemeSupport} Invalidate; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualTreeOptions.SetSelectionOptions(const Value: TVTSelectionOptions); var ToBeSet, ToBeCleared: TVTSelectionOptions; begin if FSelectionOptions <> Value then begin ToBeSet := Value - FSelectionOptions; ToBeCleared := FSelectionOptions - Value; FSelectionOptions := Value; with FOwner do begin if (toMultiSelect in (ToBeCleared + ToBeSet)) or ([toLevelSelectConstraint, toSiblingSelectConstraint] * ToBeSet <> []) then ClearSelection; if (toExtendedFocus in ToBeCleared) and (FFocusedColumn > 0) and HandleAllocated then begin FFocusedColumn := FHeader.MainColumn; Invalidate; end; if not (toExtendedFocus in FSelectionOptions) then FFocusedColumn := FHeader.MainColumn; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualTreeOptions.AssignTo(Dest: TPersistent); begin if Dest is TCustomVirtualTreeOptions then begin with TCustomVirtualTreeOptions(Dest) do begin PaintOptions := Self.PaintOptions; AnimationOptions := Self.AnimationOptions; AutoOptions := Self.AutoOptions; SelectionOptions := Self.SelectionOptions; MiscOptions := Self.MiscOptions; end; end else inherited; end; {$i vtvdragmanager.inc} //----------------- TVirtualTreeHintWindow ----------------------------------------------------------------------------- procedure TVirtualTreeHintWindow.WMShowWindow(var Message: TLMShowWindow); // Clear hint data when the window becomes hidden. begin if not Message.Show then begin // Don't touch the last hint rectangle stored in the associated tree to avoid flickering in certain situations. Finalize(FHintData); FillChar(FHintData, SizeOf(FHintData), 0); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeHintWindow.Paint; begin with FHintData do begin if Tree is TCustomVirtualDrawTree and Assigned(Node) then begin // The draw tree has by default no hint text so let it draw the hint itself. // HintBorderWidth is a private constant in hint code and is set to two TCustomVirtualDrawTree(Tree).DoDrawHint(Canvas, Node, Rect(0, 0, Width - 2, Height - 2), Column); end else inherited; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeHintWindow.CalcHintRect(MaxWidth: Integer; const AHint: string; AData: Pointer): TRect; var P: TPoint; begin if AData = nil then // Defensive approach, it *can* happen that AData is nil. Maybe when several user defined hint classes are used. Result := Rect(0, 0, 0, 0) else begin FHintData := PVTHintData(AData)^; with FHintData do begin // The draw tree gets its hint size by the application (but only if not a header hint is about to show). // This size has already been determined in CMHintShow. if (Tree is TCustomVirtualDrawTree) and Assigned(Node) then Result := HintRect else begin //todo remove this define as soon as 0.9.30 is released to avoid future problems if Column <= NoColumn then begin BidiMode := Tree.BidiMode; Alignment := Tree.Alignment; end else begin BidiMode := Tree.Header.Columns[Column].BidiMode; Alignment := Tree.Header.Columns[Column].Alignment; end; //select font according to the type of hint if (Node = nil) or (Tree.FHintMode <> hmToolTip) then Canvas.Font := Screen.HintFont else begin Canvas.Font := Tree.Font; //necessary to set customized fonts if Tree is TCustomVirtualStringTree then with TCustomVirtualStringTree(Tree) do DoPaintText(Node, Self.Canvas, Column, ttNormal); //force the default hint font color Canvas.Font.Color := Screen.HintFont.Color; end; //let THintWindow do the job Result := inherited CalcHintRect(MaxWidth, AHint, AData); //fix position taking into account bidimode and control bounds if (Tree.HintMode <> hmTooltip) or ((Result.Right - Result.Left) < Tree.Width) then begin if BiDiMode = bdLeftToRight then begin P := Tree.ClientToScreen(Point(0, 0)); HintInfo^.HintPos.X := Max(P.X, HintInfo^.HintPos.X); end else begin if (Tree.HintMode = hmTooltip) and (Node <> nil) then begin P := Tree.ClientToScreen(Point(Min(Tree.ClientWidth, HintInfo^.CursorRect.Right), 0)); Dec(P.X, Result.Right); HintInfo^.HintPos.X := Max(P.X, HintInfo^.HintPos.X); end else Dec(HintInfo^.HintPos.X, Result.Right - 20); end; end; end; end; end; end; //----------------- TVTDragImage --------------------------------------------------------------------------------------- constructor TVTDragImage.Create(AOwner: TBaseVirtualTree); begin FOwner := AOwner; FTransparency := 128; FPreBlendBias := 0; FPostBlendBias := 0; FFade := False; FRestriction := dmrNone; FColorKey := clNone; end; //---------------------------------------------------------------------------------------------------------------------- destructor TVTDragImage.Destroy; begin EndDrag; inherited; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragImage.GetVisible: Boolean; // Returns True if the internal drag image is used (i.e. the system does not natively support drag images) and // the internal image is currently visible on screen. begin Result := FStates * [disHidden, disInDrag, disPrepared, disSystemSupport] = [disInDrag, disPrepared]; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTDragImage.InternalShowDragImage(ScreenDC: HDC); // Frequently called helper routine to actually do the blend and put it onto the screen. // Only used if the system does not support drag images. var BlendMode: TBlendMode; begin with FAlphaImage do BitBlt(Canvas.Handle, 0, 0, Width, Height, FBackImage.Canvas.Handle, 0, 0, SRCCOPY); if not FFade and (FColorKey = clNone) then BlendMode := bmConstantAlpha else BlendMode := bmMasterAlpha; with FDragImage do AlphaBlend(Canvas.Handle, FAlphaImage.Canvas.Handle, Rect(0, 0, Width, Height), Point(0, 0), BlendMode, FTransparency, FPostBlendBias); with FAlphaImage do BitBlt(ScreenDC, FImagePosition.X, FImagePosition.Y, Width, Height, Canvas.Handle, 0, 0, SRCCOPY); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTDragImage.MakeAlphaChannel(Source, Target: TBitmap); // Helper method to create a proper alpha channel in Target (which must be in 32 bit pixel format), depending // on the settings for the drag image and the color values in Source. // Only used if the system does not support drag images. type PBGRA = ^TBGRA; TBGRA = packed record case Boolean of False: (Color: Cardinal); True: (BGR: array[0..2] of Byte; Alpha: Byte); end; var Color, ColorKeyRef: COLORREF; UseColorKey: Boolean; SourceRun, TargetRun: PBGRA; X, Y, MaxDimension, HalfWidth, HalfHeight: Integer; T: Extended; SourceBits, TargetBits: Pointer; begin {$ifdef EnableAdvancedGraphics} SourceBits := GetBitmapBitsFromBitmap(Source.Handle); TargetBits := GetBitmapBitsFromBitmap(Target.Handle); if (SourceBits = nil) or (TargetBits = nil) then Exit; UseColorKey := ColorKey <> clNone; ColorKeyRef := ColorToRGB(ColorKey) and $FFFFFF; // Color values are in the form BGR (red on LSB) while bitmap colors are in the form ARGB (blue on LSB) // hence we have to swap red and blue in the color key. with TBGRA(ColorKeyRef) do begin X := BGR[0]; BGR[0] := BGR[2]; BGR[2] := X; end; with Target do begin MaxDimension := Max(Width, Height); HalfWidth := Width div 2; HalfHeight := Height div 2; for Y := 0 to Height - 1 do begin TargetRun := CalculateScanline(TargetBits, Width, Height, Y); SourceRun := CalculateScanline(SourceBits, Source.Width, Source.Height, Y); for X := 0 to Width - 1 do begin Color := SourceRun.Color and $FFFFFF; if UseColorKey and (Color = ColorKeyRef) then TargetRun.Alpha := 0 else begin // If the color is not the given color key (or none is used) then do full calculation of a bell curve. T := exp(-8 * Sqrt(Sqr((X - HalfWidth) / MaxDimension) + Sqr((Y - HalfHeight) / MaxDimension))); TargetRun.Alpha := Round(255 * T); end; Inc(SourceRun); Inc(TargetRun); end; end; end; {$endif} end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragImage.DragTo(const P: TPoint; ForceRepaint: Boolean): Boolean; // Moves the drag image to a new position, which is determined from the passed point P and the previous // mouse position. // ForceRepaint is True if something on the screen changed and the back image must be refreshed. var ScreenDC: HDC; DeltaX, DeltaY: Integer; // optimized drag image move support RSamp1, RSamp2, // newly added parts from screen which will be overwritten RDraw1, RDraw2, // parts to be restored to screen RScroll, RClip: TRect; // ScrollDC of the existent background begin // Determine distances to move the drag image. Take care for restrictions. case FRestriction of dmrHorizontalOnly: begin DeltaX := FLastPosition.X - P.X; DeltaY := 0; end; dmrVerticalOnly: begin DeltaX := 0; DeltaY := FLastPosition.Y - P.Y; end; else // dmrNone DeltaX := FLastPosition.X - P.X; DeltaY := FLastPosition.Y - P.Y; end; Result := (DeltaX <> 0) or (DeltaY <> 0) or ForceRepaint; if Result then begin if Visible then begin // All this stuff is only called if we have to handle the drag image ourselves. If the system supports // drag image then this is all never executed. ScreenDC := GetDC(0); try if (Abs(DeltaX) >= FDragImage.Width) or (Abs(DeltaY) >= FDragImage.Height) or ForceRepaint then begin // If moved more than image size then just restore old screen and blit image to new position. BitBlt(ScreenDC, FImagePosition.X, FImagePosition.Y, FBackImage.Width, FBackImage.Height, FBackImage.Canvas.Handle, 0, 0, SRCCOPY); if ForceRepaint then UpdateWindow(FOwner.Handle); Inc(FImagePosition.X, -DeltaX); Inc(FImagePosition.Y, -DeltaY); BitBlt(FBackImage.Canvas.Handle, 0, 0, FBackImage.Width, FBackImage.Height, ScreenDC, FImagePosition.X, FImagePosition.Y, SRCCOPY); end else begin // overlapping copy FillDragRectangles(FDragImage.Width, FDragImage.Height, DeltaX, DeltaY, RClip, RScroll, RSamp1, RSamp2, RDraw1, RDraw2); with FBackImage.Canvas do begin // restore uncovered areas of the screen if DeltaX = 0 then begin with RDraw2 do BitBlt(ScreenDC, FImagePosition.X + Left, FImagePosition.Y + Top, Right, Bottom, Handle, Left, Top, SRCCOPY); end else begin if DeltaY = 0 then begin with RDraw1 do BitBlt(ScreenDC, FImagePosition.X + Left, FImagePosition.Y + Top, Right, Bottom, Handle, Left, Top, SRCCOPY); end else begin with RDraw1 do BitBlt(ScreenDC, FImagePosition.X + Left, FImagePosition.Y + Top, Right, Bottom, Handle, Left, Top, SRCCOPY); with RDraw2 do BitBlt(ScreenDC, FImagePosition.X + Left, FImagePosition.Y + Top, Right, Bottom, Handle, Left, Top, SRCCOPY); end; end; //todo: implement ScrollDC. Alternatively reimplement drag operations {$ifndef INCOMPLETE_WINAPI} // move existent background ScrollDC(Handle, DeltaX, DeltaY, RScroll, RClip, 0, nil); {$endif} Inc(FImagePosition.X, -DeltaX); Inc(FImagePosition.Y, -DeltaY); // Get first and second additional rectangle from screen. if DeltaX = 0 then begin with RSamp2 do BitBlt(Handle, Left, Top, Right, Bottom, ScreenDC, FImagePosition.X + Left, FImagePosition.Y + Top, SRCCOPY); end else if DeltaY = 0 then begin with RSamp1 do BitBlt(Handle, Left, Top, Right, Bottom, ScreenDC, FImagePosition.X + Left, FImagePosition.Y + Top, SRCCOPY); end else begin with RSamp1 do BitBlt(Handle, Left, Top, Right, Bottom, ScreenDC, FImagePosition.X + Left, FImagePosition.Y + Top, SRCCOPY); with RSamp2 do BitBlt(Handle, Left, Top, Right, Bottom, ScreenDC, FImagePosition.X + Left, FImagePosition.Y + Top, SRCCOPY); end; end; end; InternalShowDragImage(ScreenDC); finally ReleaseDC(0, ScreenDC); end; end; FLastPosition.X := P.X; FLastPosition.Y := P.Y; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTDragImage.EndDrag; begin HideDragImage; FStates := FStates - [disInDrag, disPrepared]; FBackImage.Free; FBackImage := nil; FDragImage.Free; FDragImage := nil; FAlphaImage.Free; FAlphaImage := nil; end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragImage.GetDragImageRect: TRect; // Returns the current size and position of the drag image (screen coordinates). begin if Visible then begin with FBackImage do Result := Rect(FImagePosition.X, FImagePosition.Y, FImagePosition.X + Width, FImagePosition.Y + Height); end else Result := Rect(0, 0, 0, 0); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTDragImage.HideDragImage; var ScreenDC: HDC; begin if Visible then begin Include(FStates, disHidden); ScreenDC := GetDC(0); try // restore screen with FBackImage do BitBlt(ScreenDC, FImagePosition.X, FImagePosition.Y, Width, Height, Canvas.Handle, 0, 0, SRCCOPY); finally ReleaseDC(0, ScreenDC); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTDragImage.PrepareDrag(DragImage: TBitmap; const ImagePosition, HotSpot: TPoint; const DataObject: IDataObject); // Creates all necessary structures to do alpha blended dragging using the given image. // ImagePostion and Hotspot are given in screen coordinates. The first determines where to place the drag image while // the second is the initial mouse position. // This method also determines whether the system supports drag images natively. If so then only minimal structures // are created. var Width, Height: Integer; DragSourceHelper: IDragSourceHelper; DragInfo: TSHDragImage; begin Width := DragImage.Width; Height := DragImage.Height; // Determine whether the system supports the drag helper interfaces. if Assigned(DataObject) and Succeeded(CoCreateInstance(CLSID_DragDropHelper, nil, CLSCTX_INPROC_SERVER, IID_IDragSourceHelper, DragSourceHelper)) then begin Include(FStates, disSystemSupport); // Supply the drag source helper with our drag image. DragInfo.sizeDragImage.cx := Width; DragInfo.sizeDragImage.cy := Height; DragInfo.ptOffset.x := Width div 2; DragInfo.ptOffset.y := Height div 2; //todo: replace CopyImage. Alternatively reimplement Drag support {$ifndef INCOMPLETE_WINAPI} DragInfo.hbmpDragImage := CopyImage(DragImage.Handle, IMAGE_BITMAP, Width, Height, LR_COPYRETURNORG); {$else} DragInfo.hbmpDragImage := 0; {$endif} DragInfo.ColorRef := ColorToRGB(FColorKey); if not Succeeded(DragSourceHelper.InitializeFromBitmap(DragInfo, DataObject)) then begin DeleteObject(DragInfo.hbmpDragImage); Exclude(FStates, disSystemSupport); end; end else Exclude(FStates, disSystemSupport); if MMXAvailable and not (disSystemSupport in FStates) then begin FLastPosition := HotSpot; FDragImage := TBitmap.Create; FDragImage.PixelFormat := pf32Bit; FDragImage.Width := Width; FDragImage.Height := Height; FAlphaImage := TBitmap.Create; FAlphaImage.PixelFormat := pf32Bit; FAlphaImage.Width := Width; FAlphaImage.Height := Height; FBackImage := TBitmap.Create; FBackImage.PixelFormat := pf32Bit; FBackImage.Width := Width; FBackImage.Height := Height; // Copy the given drag image and apply pre blend bias if required. if FPreBlendBias = 0 then with FDragImage do BitBlt(Canvas.Handle, 0, 0, Width, Height, DragImage.Canvas.Handle, 0, 0, SRCCOPY) else AlphaBlend(DragImage.Canvas.Handle, FDragImage.Canvas.Handle, Rect(0, 0, Width, Height), Point(0, 0), bmConstantAlpha, 255, FPreBlendBias); // Create a proper alpha channel also if no fading is required (transparent parts). MakeAlphaChannel(DragImage, FDragImage); FImagePosition := ImagePosition; // Initially the drag image is hidden and will be shown during the immediately following DragEnter event. FStates := FStates + [disInDrag, disHidden, disPrepared]; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTDragImage.RecaptureBackground(Tree: TBaseVirtualTree; R: TRect; VisibleRegion: HRGN; CaptureNCArea, ReshowDragImage: Boolean); // Notification by the drop target tree to update the background image because something in the tree has changed. // Note: The passed rectangle is given in client coordinates of the current drop target tree (given in Tree). // The caller does not check if the given rectangle is actually within the drag image. Hence this method must do // all the checks. // This method does nothing if the system manages the drag image. {$ifndef INCOMPLETE_WINAPI} var DragRect, ClipRect: TRect; PaintTarget: TPoint; PaintOptions: TVTInternalPaintOptions; ScreenDC: HDC; {$endif} begin //todo: reimplement {$ifndef INCOMPLETE_WINAPI} // Recapturing means we want the tree to paint the new part into our back bitmap instead to the screen. if Visible then begin // Create the minimum rectangle to be recaptured. MapWindowPoints(Tree.Handle, 0, R, 2); DragRect := GetDragImageRect; IntersectRect(R, R, DragRect); OffsetRgn(VisibleRegion, -DragRect.Left, -DragRect.Top); // The target position for painting in the drag image is relative and can be determined from screen coordinates too. PaintTarget.X := R.Left - DragRect.Left; PaintTarget.Y := R.Top - DragRect.Top; // The source rectangle is determined by the offsets in the tree. MapWindowPoints(0, Tree.Handle, R, 2); OffsetRect(R, -Tree.FOffsetX, -Tree.FOffsetY); // Finally let the tree paint the relevant part and upate the drag image on screen. PaintOptions := [poBackground, poColumnColor, poDrawFocusRect, poDrawDropMark, poDrawSelection, poGridLines]; with FBackImage do begin ClipRect.TopLeft := PaintTarget; ClipRect.Right := ClipRect.Left + R.Right - R.Left; ClipRect.Bottom := ClipRect.Top + R.Bottom - R.Top; Tree.LimitPaintingToArea(Canvas, ClipRect, VisibleRegion); Tree.PaintTree(Canvas, R, PaintTarget, PaintOptions); if CaptureNCArea then begin // For the non-client area we only need the visible region of the window as limit for painting. SelectClipRgn(Canvas.Handle, VisibleRegion); // Since WM_PRINT cannot be given a position where to draw we simply move the window origin and // get the same effect. GetWindowRect(Tree.Handle, ClipRect); SetWindowOrgEx(Canvas.Handle, DragRect.Left - ClipRect.Left, DragRect.Top - ClipRect.Top, nil); //todo: see what todo here //Tree.Perform(WM_PRINT, Integer(Canvas.Handle), PRF_NONCLIENT); SetWindowOrgEx(Canvas.Handle, 0, 0, nil); end; SelectClipRgn(Canvas.Handle, 0); if ReshowDragImage then begin GDIFlush; ScreenDC := GetDC(0); try InternalShowDragImage(ScreenDC); finally ReleaseDC(0, ScreenDC); end; end; end; end; {$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTDragImage.ShowDragImage; // Shows the drag image after it has been hidden by HideDragImage. // Note: there might be a new background now. // Also this method does nothing if the system manages the drag image. {$ifndef INCOMPLETE_WINAPI} var ScreenDC: HDC; {$endif} begin {$ifndef INCOMPLETE_WINAPI} if FStates * [disInDrag, disHidden, disPrepared, disSystemSupport] = [disInDrag, disHidden, disPrepared] then begin Exclude(FStates, disHidden); GDIFlush; ScreenDC := GetDC(0); try BitBlt(FBackImage.Canvas.Handle, 0, 0, FBackImage.Width, FBackImage.Height, ScreenDC, FImagePosition.X, FImagePosition.Y, SRCCOPY); InternalShowDragImage(ScreenDC); finally ReleaseDC(0, ScreenDC); end; end; {$endif} end; //---------------------------------------------------------------------------------------------------------------------- function TVTDragImage.WillMove(const P: TPoint): Boolean; // This method determines whether the drag image would "physically" move when DragTo would be called with the same // target point. // Always returns False if the system drag image support is available. var DeltaX, DeltaY: Integer; begin Result := Visible; if Result then begin // Determine distances to move the drag image. Take care for restrictions. case FRestriction of dmrHorizontalOnly: begin DeltaX := FLastPosition.X - P.X; DeltaY := 0; end; dmrVerticalOnly: begin DeltaX := 0; DeltaY := FLastPosition.Y - P.Y; end; else // dmrNone DeltaX := FLastPosition.X - P.X; DeltaY := FLastPosition.Y - P.Y; end; Result := (DeltaX <> 0) or (DeltaY <> 0); end; end; //----------------- TVirtualTreeColumn --------------------------------------------------------------------------------- constructor TVirtualTreeColumn.Create(Collection: TCollection); begin FMinWidth := 10; FMaxWidth := 10000; FImageIndex := -1; FMargin := 4; FSpacing := 4; FText := ''; FOptions := DefaultColumnOptions; FAlignment := taLeftJustify; FBidiMode := bdLeftToRight; FColor := clWindow; FLayout := blGlyphLeft; FBonusPixel := False; FCaptionAlignment := taLeftJustify; FCheckType := ctCheckBox; FCheckState := csUncheckedNormal; FCheckBox := False; FHasImage := False; inherited Create(Collection); FWidth := Owner.FDefaultWidth; FLastWidth := Owner.FDefaultWidth; //lcl: setting FPosition here will override the Design time value //FPosition := Owner.Count - 1; // Read parent bidi mode and color values as default values. ParentBiDiModeChanged; ParentColorChanged; end; //---------------------------------------------------------------------------------------------------------------------- destructor TVirtualTreeColumn.Destroy; var I: Integer; //--------------- local function --------------------------------------------- procedure AdjustColumnIndex(var ColumnIndex: TColumnIndex); begin if Index = ColumnIndex then ColumnIndex := NoColumn else if Index < ColumnIndex then Dec(ColumnIndex); end; //--------------- end local function ----------------------------------------- begin // Check if this column is somehow referenced by its collection parent or the header. with Owner do begin // If the columns collection object is currently deleting all columns // then we don't need to check the various cached indices individually. if not FClearing then begin IndexChanged(Index, -1); AdjustColumnIndex(FHoverIndex); AdjustColumnIndex(FDownIndex); AdjustColumnIndex(FTrackIndex); AdjustColumnIndex(FClickIndex); with Header do begin AdjustColumnIndex(FAutoSizeIndex); if Index = FMainColumn then begin // If the current main column is about to be destroyed then we have to find a new main column. FMainColumn := NoColumn; for I := 0 to Count - 1 do if I <> Index then begin FMainColumn := I; Break; end; end; AdjustColumnIndex(FSortColumn); end; end; end; inherited; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumn.GetCaptionAlignment: TAlignment; begin if coUseCaptionAlignment in FOptions then Result := FCaptionAlignment else Result := FAlignment; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumn.GetLeft: Integer; begin Result := FLeft; if [coVisible, coFixed] * FOptions <> [coVisible, coFixed] then Dec(Result, Owner.Header.Treeview.FEffectiveOffsetX); end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumn.IsBiDiModeStored: Boolean; begin Result := not (coParentBiDiMode in FOptions); end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumn.IsCaptionAlignmentStored: Boolean; begin Result := coUseCaptionAlignment in FOptions; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumn.IsColorStored: Boolean; begin Result := not (coParentColor in FOptions); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SetAlignment(const Value: TAlignment); begin if FAlignment <> Value then begin FAlignment := Value; Changed(False); // Setting the alignment affects also the tree, hence invalidate it too. Owner.Header.TreeView.Invalidate; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SetBiDiMode(Value: TBiDiMode); begin if Value <> FBiDiMode then begin FBiDiMode := Value; Exclude(FOptions, coParentBiDiMode); Changed(False); // Setting the alignment affects also the tree, hence invalidate it too. Owner.Header.TreeView.Invalidate; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SetCaptionAlignment(const Value: TAlignment); begin if not (coUseCaptionAlignment in FOptions) or (FCaptionAlignment <> Value) then begin FCaptionAlignment := Value; Exclude(FOptions, coUseCaptionAlignment); // Setting the alignment affects also the tree, hence invalidate it too. Owner.Header.Invalidate(Self); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SetColor(const Value: TColor); begin if FColor <> Value then begin FColor := Value; Exclude(FOptions, coParentColor); Changed(False); Owner.Header.TreeView.Invalidate; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SetCheckBox(Value: boolean); begin if Value <> FCheckBox then begin FCheckBox := Value; //lcl if FCheckBox then Owner.Header.Treeview.CheckImageListNeeded; Changed(False); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SetCheckState(Value: TCheckState); begin if Value <> FCheckState then begin FCheckState := Value; Changed(False); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SetCheckType(Value: TCheckType); begin if Value <> FCheckType then begin FCheckType := Value; Changed(False); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SetImageIndex(Value: TImageIndex); begin if Value <> FImageIndex then begin FImageIndex := Value; Changed(False); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SetLayout(Value: TVTHeaderColumnLayout); begin if FLayout <> Value then begin FLayout := Value; Changed(False); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SetMargin(Value: Integer); begin // Compatibility setting for -1. if Value < 0 then Value := 4; if FMargin <> Value then begin FMargin := Value; Changed(False); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SetMaxWidth(Value: Integer); begin if Value < FMinWidth then Value := FMinWidth; if not IsWinNT and (Value > 10000) then Value := 10000; FMaxWidth := Value; SetWidth(FWidth); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SetMinWidth(Value: Integer); begin if Value < 0 then Value := 0; if Value > FMaxWidth then Value := FMaxWidth; FMinWidth := Value; SetWidth(FWidth); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SetOptions(Value: TVTColumnOptions); var ToBeSet, ToBeCleared: TVTColumnOptions; AVisibleChanged, ColorChanged: Boolean; begin if FOptions <> Value then begin ToBeCleared := FOptions - Value; ToBeSet := Value - FOptions; FOptions := Value; AVisibleChanged := coVisible in (ToBeSet + ToBeCleared); ColorChanged := coParentColor in ToBeSet; if coParentBidiMode in ToBeSet then ParentBiDiModeChanged; if ColorChanged then ParentColorChanged; if coAutoSpring in ToBeSet then FSpringRest := 0; if ((coFixed in ToBeSet) or (coFixed in ToBeCleared)) and (coVisible in FOptions) then Owner.Header.RescaleHeader; Changed(False); // Need to repaint and adjust the owner tree too. //lcl: fpc refuses to compile the original code by no aparent reason. //Found: Was confounding TControl.VisibleChanged with Owner, Header.Treeview do if not (csLoading in ComponentState) and (AVisibleChanged or ColorChanged) and (UpdateCount = 0) and HandleAllocated then begin Invalidate; if AVisibleChanged then UpdateHorizontalScrollBar(False); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SetPosition(Value: TColumnPosition); var Temp: TColumnIndex; begin if csLoading in Owner.Header.Treeview.ComponentState then // Only cache the position for final fixup when loading from DFM. FPosition := Value else begin if Value >= TColumnPosition(Collection.Count) then Value := Collection.Count - 1; if FPosition <> Value then begin with Owner do begin InitializePositionArray; Header.Treeview.CancelEditNode; AdjustPosition(Self, Value); Self.Changed(False); // Need to repaint. with Header do begin if (UpdateCount = 0) and Treeview.HandleAllocated then begin Invalidate(Self); Treeview.Invalidate; end; end; end; // If the moved column is now within the fixed columns then we make it fixed as well. If it's not // we clear the fixed state (in case that fixed column is moved outside fixed area). if (coFixed in FOptions) and (FPosition > 0) then Temp := Owner.ColumnFromPosition(FPosition - 1) else Temp := Owner.ColumnFromPosition(FPosition + 1); if Temp <> NoColumn then begin if coFixed in Owner[Temp].Options then Options := Options + [coFixed] else Options := Options - [coFixed] end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SetSpacing(Value: Integer); begin if FSpacing <> Value then begin FSpacing := Value; Changed(False); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SetStyle(Value: TVirtualTreeColumnStyle); begin if FStyle <> Value then begin FStyle := Value; Changed(False); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SetText(const Value: String); begin if FText <> Value then begin FText := Value; Changed(False); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SetWidth(Value: Integer); var EffectiveMaxWidth, EffectiveMinWidth, TotalFixedMaxWidth, TotalFixedMinWidth: Integer; I: TColumnIndex; begin if not (hsScaling in Owner.FHeader.FStates) then if ([coVisible, coFixed] * FOptions = [coVisible, coFixed]) then begin with Owner, FHeader, FFixedAreaConstraints, TreeView do begin TotalFixedMinWidth := 0; TotalFixedMaxWidth := 0; for I := 0 to FColumns.Count - 1 do if ([coVisible, coFixed] * FColumns[I].FOptions = [coVisible, coFixed]) then begin Inc(TotalFixedMaxWidth, FColumns[I].FMaxWidth); Inc(TotalFixedMinWidth, FColumns[I].FMinWidth); end; // The percentage values have precedence over the pixel values. TotalFixedMinWidth := IfThen(FMaxWidthPercent > 0, Min((ClientWidth * FMaxWidthPercent) div 100, TotalFixedMinWidth), TotalFixedMinWidth); TotalFixedMaxWidth := IfThen(FMinWidthPercent > 0, Max((ClientWidth * FMinWidthPercent) div 100, TotalFixedMaxWidth), TotalFixedMaxWidth); EffectiveMaxWidth := Min(TotalFixedMaxWidth - (GetVisibleFixedWidth - Self.FWidth), FMaxWidth); EffectiveMinWidth := Max(TotalFixedMinWidth - (GetVisibleFixedWidth - Self.FWidth), FMinWidth); Value := Min(Max(Value, EffectiveMinWidth), EffectiveMaxWidth); if FMinWidthPercent > 0 then Value := Max((ClientWidth * FMinWidthPercent) div 100 - GetVisibleFixedWidth + Self.FWidth, Value); if FMaxWidthPercent > 0 then Value := Min((ClientWidth * FMaxWidthPercent) div 100 - GetVisibleFixedWidth + Self.FWidth, Value); end; end else Value := Min(Max(Value, FMinWidth), FMaxWidth); if FWidth <> Value then begin FLastWidth := FWidth; if not (hsResizing in Owner.Header.States) then FBonusPixel := False; with Owner, Header do begin if not (hoAutoResize in FOptions) or (Index <> FAutoSizeIndex) then begin FWidth := Value; UpdatePositions; end; if not (csLoading in Treeview.ComponentState) and (UpdateCount = 0) then begin if hoAutoResize in FOptions then AdjustAutoSize(Index); Treeview.DoColumnResize(Index); end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.ComputeHeaderLayout(DC: HDC; const Client: TRect; UseHeaderGlyph, UseSortGlyph: Boolean; var HeaderGlyphPos, SortGlyphPos: TPoint; var TextBounds: TRect; DrawFormat: Cardinal; CalculateTextRect: Boolean = False); // The layout of a column header is determined by a lot of factors. This method takes them all into account and // determines all necessary positions and bounds: // - for the header text // - the header glyph // - the sort glyph var TextSize: TSize; TextPos, ClientSize, HeaderGlyphSize, SortGlyphSize: TPoint; CurrentAlignment: TAlignment; MinLeft, MaxRight, TextSpacing: Integer; UseText: Boolean; R: TRect; begin UseText := Length(FText) > 0; // If nothing is to show then don't waste time with useless preparation. if not (UseText or UseHeaderGlyph or UseSortGlyph) then Exit; CurrentAlignment := CaptionAlignment; if FBidiMode <> bdLeftToRight then ChangeBiDiModeAlignment(CurrentAlignment); // Calculate sizes of the involved items. ClientSize := Point(Client.Right - Client.Left, Client.Bottom - Client.Top); with Owner, Header do begin if UseHeaderGlyph then if not FCheckBox then HeaderGlyphSize := Point(FImages.Width, FImages.Height) else HeaderGlyphSize := Point(Treeview.CheckImages.Width, Treeview.CheckImages.Height) else HeaderGlyphSize := Point(0, 0); if UseSortGlyph then begin SortGlyphSize := Point(UtilityImages.Height, UtilityImages.Height); // In any case, the sort glyph is vertically centered. SortGlyphPos.Y := (ClientSize.Y - SortGlyphSize.Y) div 2; end else SortGlyphSize := Point(0, 0); end; if UseText then begin if not (coWrapCaption in FOptions) then begin FCaptionText := FText; GetTextExtentPoint32(DC, PChar(FText), Length(FText), TextSize); Inc(TextSize.cx, 2); TextBounds := Rect(0, 0, TextSize.cx, TextSize.cy); end else begin R := Client; if FCaptionText = '' then FCaptionText := FText; GetStringDrawRect(DC, FCaptionText, R, DrawFormat); TextSize.cx := Client.Right - Client.Left; TextSize.cy := R.Bottom - R.Top; TextBounds := Rect(0, 0, TextSize.cx, TextSize.cy); end; TextSpacing := FSpacing; end else begin TextSpacing := 0; TextSize.cx := 0; TextSize.cy := 0; end; // Check first for the special case where nothing is shown except the sort glyph. if UseSortGlyph and not (UseText or UseHeaderGlyph) then begin // Center the sort glyph in the available area if nothing else is there. SortGlyphPos := Point((ClientSize.X - SortGlyphSize.X) div 2, (ClientSize.Y - SortGlyphSize.Y) div 2); end else begin // Determine extents of text and glyph and calculate positions which are clear from the layout. if (Layout in [blGlyphLeft, blGlyphRight]) or not UseHeaderGlyph then begin HeaderGlyphPos.Y := (ClientSize.Y - HeaderGlyphSize.Y) div 2; // If the text is taller than the given height, perform no vertical centration as this // would make the text even less readable. if TextSize.cy >= ClientSize.Y then TextPos.Y := 0 else TextPos.Y := (ClientSize.Y - TextSize.cy) div 2; end else begin if Layout = blGlyphTop then begin HeaderGlyphPos.Y := (ClientSize.Y - HeaderGlyphSize.Y - TextSize.cy - TextSpacing) div 2; TextPos.Y := HeaderGlyphPos.Y + HeaderGlyphSize.Y + TextSpacing; end else begin TextPos.Y := (ClientSize.Y - HeaderGlyphSize.Y - TextSize.cy - TextSpacing) div 2; HeaderGlyphPos.Y := TextPos.Y + TextSize.cy + TextSpacing; end; end; // Each alignment needs special consideration. case CurrentAlignment of taLeftJustify: begin MinLeft := FMargin; if UseSortGlyph and (FBidiMode <> bdLeftToRight) then begin // In RTL context is the sort glyph placed on the left hand side. SortGlyphPos.X := MinLeft; Inc(MinLeft, SortGlyphSize.X + FSpacing); end; if Layout in [blGlyphTop, blGlyphBottom] then begin // Header glyph is above or below text, so both must be considered when calculating // the left positition of the sort glyph (if it is on the right hand side). TextPos.X := MinLeft; if UseHeaderGlyph then begin HeaderGlyphPos.X := (ClientSize.X - HeaderGlyphSize.X) div 2; if HeaderGlyphPos.X < MinLeft then HeaderGlyphPos.X := MinLeft; MinLeft := Max(TextPos.X + TextSize.cx + TextSpacing, HeaderGlyphPos.X + HeaderGlyphSize.X + FSpacing); end else MinLeft := TextPos.X + TextSize.cx + TextSpacing; end else begin // Everything is lined up. TextSpacing might be 0 if there is no text. // This simplifies the calculation because no extra tests are necessary. if UseHeaderGlyph and (Layout = blGlyphLeft) then begin HeaderGlyphPos.X := MinLeft; Inc(MinLeft, HeaderGlyphSize.X + FSpacing); end; TextPos.X := MinLeft; Inc(MinLeft, TextSize.cx + TextSpacing); if UseHeaderGlyph and (Layout = blGlyphRight) then begin HeaderGlyphPos.X := MinLeft; Inc(MinLeft, HeaderGlyphSize.X + FSpacing); end; end; if UseSortGlyph and (FBidiMode = bdLeftToRight) then SortGlyphPos.X := MinLeft; end; taCenter: begin if Layout in [blGlyphTop, blGlyphBottom] then begin HeaderGlyphPos.X := (ClientSize.X - HeaderGlyphSize.X) div 2; TextPos.X := (ClientSize.X - TextSize.cx) div 2; if UseSortGlyph then Dec(TextPos.X, SortGlyphSize.X div 2); end else begin MinLeft := (ClientSize.X - HeaderGlyphSize.X - TextSpacing - TextSize.cx) div 2; if UseHeaderGlyph and (Layout = blGlyphLeft) then begin HeaderGlyphPos.X := MinLeft; Inc(MinLeft, HeaderGlyphSize.X + TextSpacing); end; TextPos.X := MinLeft; Inc(MinLeft, TextSize.cx + TextSpacing); if UseHeaderGlyph and (Layout = blGlyphRight) then HeaderGlyphPos.X := MinLeft; end; if UseHeaderGlyph then begin MinLeft := Min(HeaderGlyphPos.X, TextPos.X); MaxRight := Max(HeaderGlyphPos.X + HeaderGlyphSize.X, TextPos.X + TextSize.cx); end else begin MinLeft := TextPos.X; MaxRight := TextPos.X + TextSize.cx; end; // Place the sort glyph directly to the left or right of the larger item. if UseSortGlyph then if FBidiMode = bdLeftToRight then begin // Sort glyph on the right hand side. SortGlyphPos.X := MaxRight + FSpacing; end else begin // Sort glyph on the left hand side. SortGlyphPos.X := MinLeft - FSpacing - SortGlyphSize.X; end; end; else // taRightJustify MaxRight := ClientSize.X - FMargin; if UseSortGlyph and (FBidiMode = bdLeftToRight) then begin // In LTR context is the sort glyph placed on the right hand side. Dec(MaxRight, SortGlyphSize.X); SortGlyphPos.X := MaxRight; Dec(MaxRight, FSpacing); end; if Layout in [blGlyphTop, blGlyphBottom] then begin TextPos.X := MaxRight - TextSize.cx; if UseHeaderGlyph then begin HeaderGlyphPos.X := (ClientSize.X - HeaderGlyphSize.X) div 2; if HeaderGlyphPos.X + HeaderGlyphSize.X + FSpacing > MaxRight then HeaderGlyphPos.X := MaxRight - HeaderGlyphSize.X - FSpacing; MaxRight := Min(TextPos.X - TextSpacing, HeaderGlyphPos.X - FSpacing); end else MaxRight := TextPos.X - TextSpacing; end else begin // Everything is lined up. TextSpacing might be 0 if there is no text. // This simplifies the calculation because no extra tests are necessary. if UseHeaderGlyph and (Layout = blGlyphRight) then begin HeaderGlyphPos.X := MaxRight - HeaderGlyphSize.X; MaxRight := HeaderGlyphPos.X - FSpacing; end; TextPos.X := MaxRight - TextSize.cx; MaxRight := TextPos.X - TextSpacing; if UseHeaderGlyph and (Layout = blGlyphLeft) then begin HeaderGlyphPos.X := MaxRight - HeaderGlyphSize.X; MaxRight := HeaderGlyphPos.X - FSpacing; end; end; if UseSortGlyph and (FBidiMode <> bdLeftToRight) then SortGlyphPos.X := MaxRight - SortGlyphSize.X; end; end; // Once the position of each element is determined there remains only one but important step. // The horizontal positions of every element must be adjusted so that it always fits into the // given header area. This is accomplished by shorten the text appropriately. // These are the maximum bounds. Nothing goes beyond them. MinLeft := FMargin; MaxRight := ClientSize.X - FMargin; if UseSortGlyph then begin if FBidiMode = bdLeftToRight then begin // Sort glyph on the right hand side. if SortGlyphPos.X + SortGlyphSize.X > MaxRight then SortGlyphPos.X := MaxRight - SortGlyphSize.X; MaxRight := SortGlyphPos.X - FSpacing; end; // Consider also the left side of the sort glyph regardless of the bidi mode. if SortGlyphPos.X < MinLeft then SortGlyphPos.X := MinLeft; // Left border needs only adjustment if the sort glyph marks the left border. if FBidiMode <> bdLeftToRight then MinLeft := SortGlyphPos.X + SortGlyphSize.X + FSpacing; // Finally transform sort glyph to its actual position. with SortGlyphPos do begin Inc(X, Client.Left); Inc(Y, Client.Top); end; end; if UseHeaderGlyph then begin if HeaderGlyphPos.X + HeaderGlyphSize.X > MaxRight then HeaderGlyphPos.X := MaxRight - HeaderGlyphSize.X; if Layout = blGlyphRight then MaxRight := HeaderGlyphPos.X - FSpacing; if HeaderGlyphPos.X < MinLeft then HeaderGlyphPos.X := MinLeft; if Layout = blGlyphLeft then MinLeft := HeaderGlyphPos.X + HeaderGlyphSize.X + FSpacing; // Finally transform header glyph to its actual position. with HeaderGlyphPos do begin Inc(X, Client.Left); Inc(Y, Client.Top); end; end; if UseText then begin if TextPos.X < MinLeft then TextPos.X := MinLeft; OffsetRect(TextBounds, TextPos.X, TextPos.Y); if TextBounds.Right > MaxRight then TextBounds.Right := MaxRight; OffsetRect(TextBounds, Client.Left, Client.Top); if coWrapCaption in FOptions then begin // Wrap the column caption if necessary. R := TextBounds; FCaptionText := WrapString(DC, FText, R, DT_RTLREADING and DrawFormat <> 0, DrawFormat); GetStringDrawRect(DC, FCaptionText, R, DrawFormat); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.GetAbsoluteBounds(var Left, Right: Integer); // Returns the column's left and right bounds in header coordinates, that is, independant of the scrolling position. begin Left := FLeft; Right := FLeft + FWidth; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumn.GetDisplayName: string; // Returns the column text otherwise the column id is returned begin if Length(FText) > 0 then Result := FText else Result := Format('Column %d', [Index]); end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumn.GetOwner: TVirtualTreeColumns; begin Result := Collection as TVirtualTreeColumns; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.Assign(Source: TPersistent); var OldOptions: TVTColumnOptions; begin if Source is TVirtualTreeColumn then begin OldOptions := FOptions; FOptions := []; BiDiMode := TVirtualTreeColumn(Source).BiDiMode; ImageIndex := TVirtualTreeColumn(Source).ImageIndex; Layout := TVirtualTreeColumn(Source).Layout; Margin := TVirtualTreeColumn(Source).Margin; MaxWidth := TVirtualTreeColumn(Source).MaxWidth; MinWidth := TVirtualTreeColumn(Source).MinWidth; Position := TVirtualTreeColumn(Source).Position; Spacing := TVirtualTreeColumn(Source).Spacing; Style := TVirtualTreeColumn(Source).Style; Text := TVirtualTreeColumn(Source).Text; Hint := TVirtualTreeColumn(Source).Hint; Width := TVirtualTreeColumn(Source).Width; Alignment := TVirtualTreeColumn(Source).Alignment; CaptionAlignment := TVirtualTreeColumn(Source).CaptionAlignment; Color := TVirtualTreeColumn(Source).Color; Tag := TVirtualTreeColumn(Source).Tag; // Order is important. Assign options last. FOptions := OldOptions; Options := TVirtualTreeColumn(Source).Options; Changed(False); end else inherited Assign(Source); end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumn.Equals(OtherColumnObj: TObject): Boolean; var OtherColumn : TVirtualTreeColumn; begin if OtherColumnObj is TVirtualTreeColumn then begin OtherColumn := TVirtualTreeColumn (OtherColumnObj); Result := (BiDiMode = OtherColumn.BiDiMode) and (ImageIndex = OtherColumn.ImageIndex) and (Layout = OtherColumn.Layout) and (Margin = OtherColumn.Margin) and (MaxWidth = OtherColumn.MaxWidth) and (MinWidth = OtherColumn.MinWidth) and (Position = OtherColumn.Position) and (Spacing = OtherColumn.Spacing) and (Style = OtherColumn.Style) and (Text = OtherColumn.Text) and (Hint = OtherColumn.Hint) and (Width = OtherColumn.Width) and (Alignment = OtherColumn.Alignment) and (CaptionAlignment = OtherColumn.CaptionAlignment) and (Color = OtherColumn.Color) and (Tag = OtherColumn.Tag) and (Options = OtherColumn.Options) end else Result := False end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumn.GetRect: TRect; // Returns the rectangle this column occupies in the header (relative to (0, 0) of the non-client area). begin with TVirtualTreeColumns(GetOwner).FHeader do Result := Treeview.FHeaderRect; Inc(Result.Left, FLeft); Result.Right := Result.Left + FWidth; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.LoadFromStream(const Stream: TStream; Version: Integer); var Dummy: Integer; S: String; begin with Stream do begin ReadBuffer(Dummy, SizeOf(Dummy)); SetLength(S, Dummy); ReadBuffer(PChar(S)^, Dummy); Text := S; ReadBuffer(Dummy, SizeOf(Dummy)); SetLength(FHint, Dummy); ReadBuffer(PChar(FHint)^, Dummy); ReadBuffer(Dummy, SizeOf(Dummy)); Width := Dummy; ReadBuffer(Dummy, SizeOf(Dummy)); MinWidth := Dummy; ReadBuffer(Dummy, SizeOf(Dummy)); MaxWidth := Dummy; ReadBuffer(Dummy, SizeOf(Dummy)); Style := TVirtualTreeColumnStyle(Dummy); ReadBuffer(Dummy, SizeOf(Dummy)); ImageIndex := Dummy; ReadBuffer(Dummy, SizeOf(Dummy)); Layout := TVTHeaderColumnLayout(Dummy); ReadBuffer(Dummy, SizeOf(Dummy)); Margin := Dummy; ReadBuffer(Dummy, SizeOf(Dummy)); Spacing := Dummy; ReadBuffer(Dummy, SizeOf(Dummy)); BiDiMode := TBiDiMode(Dummy); ReadBuffer(Dummy, SizeOf(Dummy)); Options := TVTColumnOptions(Word(Dummy and $FFFF)); // Parts which have been introduced/changed with header stream version 1+. // LCL port started with header stream version 6 so no need to do the check here ReadBuffer(Dummy, SizeOf(Dummy)); Tag := Dummy; ReadBuffer(Dummy, SizeOf(Dummy)); Alignment := TAlignment(Dummy); ReadBuffer(Dummy, SizeOf(Dummy)); Color := TColor(Dummy); if coUseCaptionAlignment in FOptions then begin ReadBuffer(Dummy, SizeOf(Dummy)); CaptionAlignment := TAlignment(Dummy); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.ParentBiDiModeChanged; var Columns: TVirtualTreeColumns; begin if coParentBiDiMode in FOptions then begin Columns := GetOwner as TVirtualTreeColumns; if Assigned(Columns) and (FBidiMode <> Columns.FHeader.Treeview.BiDiMode) then begin FBiDiMode := Columns.FHeader.Treeview.BiDiMode; Changed(False); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.ParentColorChanged; var Columns: TVirtualTreeColumns; TreeViewColor: TColor; begin if coParentColor in FOptions then begin Columns := GetOwner as TVirtualTreeColumns; if Assigned(Columns) then begin TreeViewColor := Columns.FHeader.Treeview.Brush.Color; if FColor <> TreeViewColor then begin FColor := TreeViewColor; Changed(False); end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.RestoreLastWidth; begin TVirtualTreeColumns(GetOwner).AnimatedResize(Index, FLastWidth); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumn.SaveToStream(const Stream: TStream); var Dummy: Integer; begin with Stream do begin Dummy := Length(FText); WriteBuffer(Dummy, SizeOf(Dummy)); WriteBuffer(PChar(FText)^, Dummy); Dummy := Length(FHint); WriteBuffer(Dummy, SizeOf(Dummy)); WriteBuffer(PChar(FHint)^, Dummy); WriteBuffer(FWidth, SizeOf(FWidth)); WriteBuffer(FMinWidth, SizeOf(FMinWidth)); WriteBuffer(FMaxWidth, SizeOf(FMaxWidth)); Dummy := Ord(FStyle); WriteBuffer(Dummy, SizeOf(Dummy)); Dummy := FImageIndex; WriteBuffer(Dummy, SizeOf(Dummy)); Dummy := Ord(FLayout); WriteBuffer(Dummy, SizeOf(Dummy)); WriteBuffer(FMargin, SizeOf(FMargin)); WriteBuffer(FSpacing, SizeOf(FSpacing)); Dummy := Ord(FBiDiMode); WriteBuffer(Dummy, SizeOf(Dummy)); Dummy := Word(FOptions); WriteBuffer(Dummy, SizeOf(Dummy)); // parts introduced with stream version 1 WriteBuffer(FTag, SizeOf(Dummy)); Dummy := Cardinal(FAlignment); WriteBuffer(Dummy, SizeOf(Dummy)); // parts introduced with stream version 2 Dummy := Integer(FColor); WriteBuffer(Dummy, SizeOf(Dummy)); // parts introduced with stream version 6 if coUseCaptionAlignment in FOptions then begin Dummy := Cardinal(FCaptionAlignment); WriteBuffer(Dummy, SizeOf(Dummy)); end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumn.UseRightToLeftReading: Boolean; begin Result := FBiDiMode <> bdLeftToRight; end; //----------------- TVirtualTreeColumns -------------------------------------------------------------------------------- constructor TVirtualTreeColumns.Create(AOwner: TVTHeader); var ColumnClass: TVirtualTreeColumnClass; begin FHeader := AOwner; // Determine column class to be used in the header. ColumnClass := AOwner.FOwner.GetColumnClass; // The owner tree always returns the default tree column class if not changed by application/descendants. inherited Create(ColumnClass); FHeaderBitmap := TBitmap.Create; FHeaderBitmap.PixelFormat := pf32Bit; FHoverIndex := NoColumn; FDownIndex := NoColumn; FClickIndex := NoColumn; FDropTarget := NoColumn; FTrackIndex := NoColumn; FDefaultWidth := 50; end; //---------------------------------------------------------------------------------------------------------------------- destructor TVirtualTreeColumns.Destroy; begin FHeaderBitmap.Free; inherited; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.GetCount: Integer; begin Result := inherited Count; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.GetItem(Index: TColumnIndex): TVirtualTreeColumn; begin Result := TVirtualTreeColumn(inherited GetItem(Index)); end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.GetNewIndex(P: TPoint; var OldIndex: TColumnIndex): Boolean; var NewIndex: Integer; begin Result := False; // convert to local coordinates Inc(P.Y, FHeader.FHeight); NewIndex := ColumnFromPosition(P); if NewIndex <> OldIndex then begin if OldIndex > NoColumn then FHeader.Invalidate(Items[OldIndex]); OldIndex := NewIndex; if OldIndex > NoColumn then FHeader.Invalidate(Items[OldIndex]); Result := True; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.SetDefaultWidth(Value: Integer); begin FDefaultWidth := Value; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.SetItem(Index: TColumnIndex; Value: TVirtualTreeColumn); begin inherited SetItem(Index, Value); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.AdjustAutoSize(CurrentIndex: TColumnIndex; Force: Boolean = False); // Called only if the header is in auto-size mode which means a column needs to be so large // that it fills all the horizontal space not occupied by the other columns. // CurrentIndex (if not InvalidColumn) describes which column has just been resized. var NewValue, AutoIndex, Index, RestWidth: Integer; begin if Count > 0 then begin // Determine index to be used for auto resizing. This is usually given by the owner's AutoSizeIndex, but // could be different if the column whose resize caused the invokation here is either the auto column itself // or visually to the right of the auto size column. AutoIndex := FHeader.FAutoSizeIndex; if (AutoIndex < 0) or (AutoIndex >= Count) then AutoIndex := Count - 1; if AutoIndex >= 0 then begin with FHeader.Treeview do begin if HandleAllocated then RestWidth := ClientWidth else RestWidth := Width; end; // Go through all columns and calculate the rest space remaining. for Index := 0 to Count - 1 do if (Index <> AutoIndex) and (coVisible in Items[Index].FOptions) then Dec(RestWidth, Items[Index].Width); with Items[AutoIndex] do begin NewValue := Max(MinWidth, Min(MaxWidth, RestWidth)); if Force or (FWidth <> NewValue) then begin FWidth := NewValue; UpdatePositions; FHeader.Treeview.DoColumnResize(AutoIndex); end; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.AdjustDownColumn(P: TPoint): TColumnIndex; // Determines the column from the given position and returns it. If this column is allowed to be clicked then // it is also kept for later use. begin // Convert to local coordinates. Inc(P.Y, FHeader.FHeight); Result := ColumnFromPosition(P); if (Result > NoColumn) and (Result <> FDownIndex) and (coAllowClick in Items[Result].FOptions) and (coEnabled in Items[Result].FOptions) then begin if FDownIndex > NoColumn then FHeader.Invalidate(Items[FDownIndex]); FDownIndex := Result; FHeader.Invalidate(Items[FDownIndex]); end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.AdjustHoverColumn(const P: TPoint): Boolean; // Determines the new hover column index and returns True if the index actually changed else False. begin Result := GetNewIndex(P, FHoverIndex); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.AdjustPosition(Column: TVirtualTreeColumn; Position: Cardinal); // Reorders the column position array so that the given column gets the given position. var OldPosition: Cardinal; begin OldPosition := Column.Position; if OldPosition <> Position then begin if OldPosition < Position then begin // column will be moved up so move down other entries Move(FPositionToIndex[OldPosition + 1], FPositionToIndex[OldPosition], (Position - OldPosition) * SizeOf(Cardinal)); end else begin // column will be moved down so move up other entries Move(FPositionToIndex[Position], FPositionToIndex[Position + 1], (OldPosition - Position) * SizeOf(Cardinal)); end; FPositionToIndex[Position] := Column.Index; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.CanSplitterResize(P: TPoint; Column: TColumnIndex): Boolean; begin Result := (Column > NoColumn) and ([coResizable, coVisible] * Items[Column].FOptions = [coResizable, coVisible]); DoCanSplitterResize(P, Column, Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.DoCanSplitterResize(P: TPoint; Column: TColumnIndex; var Allowed: Boolean); begin if Assigned(FHeader.Treeview.FOnCanSplitterResizeColumn) then FHeader.Treeview.FOnCanSplitterResizeColumn(FHeader, P, Column, Allowed); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.DrawButtonText(DC: HDC; Caption: String; Bounds: TRect; Enabled, Hot: Boolean; DrawFormat: Cardinal; WrapCaption: Boolean); var TextSpace: Integer; Size: TSize; begin if not WrapCaption then begin // Do we need to shorten the caption due to limited space? GetTextExtentPoint32(DC, PChar(Caption), Length(Caption), Size); TextSpace := Bounds.Right - Bounds.Left; if TextSpace < Size.cx then Caption := ShortenString(DC, Caption, TextSpace); end; SetBkMode(DC, TRANSPARENT); if not Enabled then begin OffsetRect(Bounds, 1, 1); SetTextColor(DC, ColorToRGB(clBtnHighlight)); DrawText(DC, PChar(Caption), Length(Caption), Bounds, DrawFormat); OffsetRect(Bounds, -1, -1); SetTextColor(DC, ColorToRGB(clBtnShadow)); DrawText(DC, PChar(Caption), Length(Caption), Bounds, DrawFormat); end else begin if Hot then SetTextColor(DC, ColorToRGB(FHeader.Treeview.FColors.HeaderHotColor)) else SetTextColor(DC, ColorToRGB(FHeader.FFont.Color)); DrawText(DC, PChar(Caption), Length(Caption), Bounds, DrawFormat); end; end; //---------------------------------------------------------------------------------------------------------------------- // XP style header button legacy code. This procedure is only used on non-XP systems to simulate the themed // header style. // Note: the theme elements displayed here only correspond to the standard themes of Windows XP const XPMainHeaderColorUp = $DBEAEB; // Main background color of the header if drawn as being not pressed. XPMainHeaderColorDown = $D8DFDE; // Main background color of the header if drawn as being pressed. XPMainHeaderColorHover = $F3F8FA; // Main background color of the header if drawn as being under the mouse pointer. XPDarkSplitBarColor = $B2C5C7; // Dark color of the splitter bar. XPLightSplitBarColor = $FFFFFF; // Light color of the splitter bar. XPDarkGradientColor = $B8C7CB; // Darkest color in the bottom gradient. Other colors will be interpolated. XPDownOuterLineColor = $97A5A5; // Down state border color. XPDownMiddleLineColor = $B8C2C1; // Down state border color. XPDownInnerLineColor = $C9D1D0; // Down state border color. procedure TVirtualTreeColumns.DrawXPButton(DC: HDC; const ButtonR: TRect; DrawSplitter, Down, Hover: Boolean); // Helper procedure to draw an Windows XP like header button. var PaintBrush: HBRUSH; Pen, OldPen: HPEN; PenColor, FillColor: COLORREF; dRed, dGreen, dBlue: Single; Width, XPos: Integer; begin if Down then FillColor := XPMainHeaderColorDown else if Hover then FillColor := XPMainHeaderColorHover else FillColor := XPMainHeaderColorUp; PaintBrush := CreateSolidBrush(FillColor); FillRect(DC, ButtonR, PaintBrush); DeleteObject(PaintBrush); if DrawSplitter and not (Down or Hover) then begin // One solid pen for the dark line... Pen := CreatePen(PS_SOLID, 1, XPDarkSplitBarColor); OldPen := SelectObject(DC, Pen); MoveToEx(DC, ButtonR.Right - 2, ButtonR.Top + 3, nil); LineTo(DC, ButtonR.Right - 2, ButtonR.Bottom - 5); // ... and one solid pen for the light line. Pen := CreatePen(PS_SOLID, 1, XPLightSplitBarColor); DeleteObject(SelectObject(DC, Pen)); MoveToEx(DC, ButtonR.Right - 1, ButtonR.Top + 3, nil); LineTo(DC, ButtonR.Right - 1, ButtonR.Bottom - 5); SelectObject(DC, OldPen); DeleteObject(Pen); end; if Down then begin // Down state. Three lines to draw. // First one is the outer line, drawn at left, bottom and right. Pen := CreatePen(PS_SOLID, 1, XPDownOuterLineColor); OldPen := SelectObject(DC, Pen); MoveToEx(DC, ButtonR.Left, ButtonR.Top, nil); LineTo(DC, ButtonR.Left, ButtonR.Bottom - 1); LineTo(DC, ButtonR.Right - 1, ButtonR.Bottom - 1); LineTo(DC, ButtonR.Right - 1, ButtonR.Top - 1); // Second one is the middle line, which is a bit lighter. Pen := CreatePen(PS_SOLID, 1, XPDownMiddleLineColor); DeleteObject(SelectObject(DC, Pen)); MoveToEx(DC, ButtonR.Left + 1, ButtonR.Bottom - 2, nil); LineTo(DC, ButtonR.Left + 1, ButtonR.Top); LineTo(DC, ButtonR.Right - 1, ButtonR.Top); // Third line is the inner line, which is even lighter than the middle line. Pen := CreatePen(PS_SOLID, 1, XPDownInnerLineColor); DeleteObject(SelectObject(DC, Pen)); MoveToEx(DC, ButtonR.Left + 2, ButtonR.Bottom - 2, nil); LineTo(DC, ButtonR.Left + 2, ButtonR.Top + 1); LineTo(DC, ButtonR.Right - 1, ButtonR.Top + 1); // Housekeeping: SelectObject(DC, OldPen); DeleteObject(Pen); end else if Hover then begin // Hover state. There are three lines at the bottom border, but they are rendered in a way which // requires expensive construction. Width := ButtonR.Right - ButtonR.Left; if Width <= 32 then begin BitBlt(DC, ButtonR.Right - 16, ButtonR.Bottom - 3, UtilityImageSize, 3, UtilityImages.Canvas.Handle, 8 * UtilityImageSize, 0, SRCCOPY); //ImageList_DrawEx(UtilityImages.Handle, 8, DC, ButtonR.Right - 16, ButtonR.Bottom - 3, 16, 3, CLR_NONE, CLR_NONE, // ILD_NORMAL); BitBlt(DC, ButtonR.Left, ButtonR.Bottom - 3, Width div 2, 3, UtilityImages.Canvas.Handle, 6 * UtilityImageSize, 0, SRCCOPY); //ImageList_DrawEx(UtilityImages.Handle, 6, DC, ButtonR.Left, ButtonR.Bottom - 3, Width div 2, 3, CLR_NONE, // CLR_NONE, ILD_NORMAL); end else begin BitBlt(DC, ButtonR.Left, ButtonR.Bottom - 3, UtilityImageSize, 3, UtilityImages.Canvas.Handle, 6 * UtilityImageSize, 0, SRCCOPY); //ImageList_DrawEx(UtilityImages.Handle, 6, DC, ButtonR.Left, ButtonR.Bottom - 3, 16, 3, CLR_NONE, CLR_NONE, // ILD_NORMAL); // Replicate inner part as many times as need to fill up the button rectangle. XPos := ButtonR.Left + 16; repeat BitBlt(DC, XPos, ButtonR.Bottom - 3, UtilityImageSize, 3, UtilityImages.Canvas.Handle, 7 * UtilityImageSize, 0, SRCCOPY); //ImageList_DrawEx(UtilityImages.Handle, 7, DC, XPos, ButtonR.Bottom - 3, 16, 3, CLR_NONE, CLR_NONE, ILD_NORMAL); Inc(XPos, 16); until XPos + 16 >= ButtonR.Right; BitBlt(DC, ButtonR.Right - 16, ButtonR.Bottom - 3, UtilityImageSize, 3, UtilityImages.Canvas.Handle, 8 * UtilityImageSize, 0, SRCCOPY); //ImageList_DrawEx(UtilityImages.Handle, 8, DC, ButtonR.Right - 16, ButtonR.Bottom - 3, 16, 3, CLR_NONE, CLR_NONE, // ILD_NORMAL); end; end else begin // There is a three line gradient near the bottom border which transforms from the button color to a dark, // clBtnFace like color (here XPDarkGradientColor). PenColor := XPMainHeaderColorUp; dRed := ((PenColor and $FF) - (XPDarkGradientColor and $FF)) / 3; dGreen := (((PenColor shr 8) and $FF) - ((XPDarkGradientColor shr 8) and $FF)) / 3; dBlue := (((PenColor shr 16) and $FF) - ((XPDarkGradientColor shr 16) and $FF)) / 3; // First line: PenColor := PenColor - Round(dRed) - Round(dGreen) shl 8 - Round(dBlue) shl 16; Pen := CreatePen(PS_SOLID, 1, PenColor); OldPen := SelectObject(DC, Pen); MoveToEx(DC, ButtonR.Left, ButtonR.Bottom - 3, nil); LineTo(DC, ButtonR.Right, ButtonR.Bottom - 3); // Second line: PenColor := PenColor - Round(dRed) - Round(dGreen) shl 8 - Round(dBlue) shl 16; Pen := CreatePen(PS_SOLID, 1, PenColor); DeleteObject(SelectObject(DC, Pen)); MoveToEx(DC, ButtonR.Left, ButtonR.Bottom - 2, nil); LineTo(DC, ButtonR.Right, ButtonR.Bottom - 2); // Third line: Pen := CreatePen(PS_SOLID, 1, XPDarkGradientColor); DeleteObject(SelectObject(DC, Pen)); MoveToEx(DC, ButtonR.Left, ButtonR.Bottom - 1, nil); LineTo(DC, ButtonR.Right, ButtonR.Bottom - 1); // Housekeeping: DeleteObject(SelectObject(DC, OldPen)); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.FixPositions; // Fixes column positions after loading from DFM or Bidi mode change. var I: Integer; begin for I := 0 to Count - 1 do FPositionToIndex[Items[I].Position] := I; FNeedPositionsFix := False; UpdatePositions(True); end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.GetColumnAndBounds(const P: TPoint; var ColumnLeft, ColumnRight: Integer; Relative: Boolean = True): Integer; // Returns the column where the mouse is currently in as well as the left and right bound of // this column (Left and Right are undetermined if no column is involved). var I: Integer; begin Result := InvalidColumn; if Relative and (P.X > Header.Columns.GetVisibleFixedWidth) then ColumnLeft := -FHeader.Treeview.FEffectiveOffsetX else ColumnLeft := 0; if FHeader.Treeview.UseRightToLeftAlignment then Inc(ColumnLeft, FHeader.Treeview.ComputeRTLOffset(True)); for I := 0 to Count - 1 do with Items[FPositionToIndex[I]] do if coVisible in FOptions then begin ColumnRight := ColumnLeft + FWidth; if P.X < ColumnRight then begin Result := FPositionToIndex[I]; Exit; end; ColumnLeft := ColumnRight; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.GetOwner: TPersistent; begin Result := FHeader; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.HandleClick(P: TPoint; Button: TMouseButton; Force, DblClick: Boolean); // Generates a click event if the mouse button has been released over the same column it was pressed first. // Alternatively, Force might be set to True to indicate that the down index does not matter (right, middle and // double click). var NewClickIndex: Integer; Shift: TShiftState; begin // Convert vertical position to local coordinates. Inc(P.Y, FHeader.FHeight); NewClickIndex := ColumnFromPosition(P); if (NewClickIndex > NoColumn) and (coAllowClick in Items[NewClickIndex].FOptions) and ((NewClickIndex = FDownIndex) or Force) then begin FClickIndex := NewClickIndex; Shift := FHeader.GetShiftState; if DblClick then Shift := Shift + [ssDouble]; if Items[NewClickIndex].FHasImage and PtInRect(Items[NewClickIndex].FImageRect, P) then begin if Items[NewClickIndex].CheckBox then begin FHeader.Treeview.UpdateColumnCheckState(Items[NewClickIndex]); FHeader.Treeview.DoHeaderCheckBoxClick(NewClickIndex, Button, Shift, P.X, P.Y); end else FHeader.Treeview.DoHeaderImageClick(NewClickIndex, Button, Shift, P.X, P.Y) end else FHeader.Treeview.DoHeaderClick(NewClickIndex, Button, Shift, P.X, P.Y); FHeader.Invalidate(Items[NewClickIndex]); end else FClickIndex := NoColumn; if (FClickIndex > NoColumn) and (FClickIndex <> NewClickIndex) then FHeader.Invalidate(Items[FClickIndex]); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.IndexChanged(OldIndex, NewIndex: Integer); // Called by a column when its index in the collection changes. If NewIndex is -1 then the column is // about to be removed, otherwise it is moved to a new index. // The method will then update the position array to reflect the change. var I: Integer; Increment: Integer; Lower, Upper: Integer; begin if NewIndex = -1 then begin // Find position in the array with the old index. Upper := High(FPositionToIndex); for I := 0 to Upper do begin if FPositionToIndex[I] = OldIndex then begin // Index found. Move all higher entries one step down and remove the last entry. if I < Upper then Move(FPositionToIndex[I + 1], FPositionToIndex[I], (Upper - I) * SizeOf(Integer)); end; // Decrease all indices, which are greater than the index to be deleted. if FPositionToIndex[I] > OldIndex then Dec(FPositionToIndex[I]); end; SetLength(FPositionToIndex, High(FPositionToIndex)); end else begin if OldIndex < NewIndex then Increment := -1 else Increment := 1; Lower := Min(OldIndex, NewIndex); Upper := Max(OldIndex, NewIndex); for I := 0 to High(FPositionToIndex) do begin if (FPositionToIndex[I] >= Lower) and (FPositionToIndex[I] < Upper) then Inc(FPositionToIndex[I], Increment) else if FPositionToIndex[I] = OldIndex then FPositionToIndex[I] := NewIndex; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.InitializePositionArray; // Ensures that the column position array contains as many entries as columns are defined. // The array is resized and initialized with default values if needed. var I, OldSize: Integer; Changed: Boolean; begin if Count <> Length(FPositionToIndex) then begin OldSize := Length(FPositionToIndex); SetLength(FPositionToIndex, Count); if Count > OldSize then begin // New items have been added, just set their position to the same as their index. for I := OldSize to Count - 1 do FPositionToIndex[I] := I; end else begin // Items have been deleted, so reindex remaining entries by decrementing values larger than the highest // possible index until no entry is higher than this limit. repeat Changed := False; for I := 0 to Count - 1 do if FPositionToIndex[I] >= Count then begin Dec(FPositionToIndex[I]); Changed := True; end; until not Changed; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.ReorderColumns(RTL: Boolean); var I: Integer; begin if RTL then begin for I := 0 to Count - 1 do FPositionToIndex[I] := Count - I - 1; end else begin for I := 0 to Count - 1 do FPositionToIndex[I] := I; end; UpdatePositions(True); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.Update(Item: TCollectionItem); begin //lcl // Skip while Destroying if csDestroying in FHeader.TreeView.ComponentState then Exit; // This is the only place which gets notified when a new column has been added or removed // and we need this event to adjust the column position array. InitializePositionArray; if csLoading in Header.Treeview.ComponentState then FNeedPositionsFix := True else UpdatePositions; // The first column which is created is by definition also the main column. if (Count > 0) and (Header.FMainColumn < 0) then FHeader.FMainColumn := 0; if not (csLoading in Header.Treeview.ComponentState) and not (hsLoading in FHeader.FStates) then begin with FHeader do begin if hoAutoResize in FOptions then AdjustAutoSize(InvalidColumn); if Assigned(Item) then Invalidate(Item as TVirtualTreeColumn) else if Treeview.HandleAllocated then begin Treeview.UpdateHorizontalScrollBar(False); Invalidate(nil); Treeview.Invalidate; end; if not (tsUpdating in Treeview.FStates) then // This is mainly to let the designer know when a change occurs at design time which // doesn't involve the object inspector (like column resizing with the mouse). // This does NOT include design time code as the communication is done via an interface. Treeview.UpdateDesigner; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.UpdatePositions(Force: Boolean = False); // Recalculates the left border of every column and updates their position property according to the // PostionToIndex array which primarily determines where each column is placed visually. var I, RunningPos: Integer; begin if not FNeedPositionsFix and (Force or (UpdateCount = 0)) then begin RunningPos := 0; for I := 0 to High(FPositionToIndex) do with Items[FPositionToIndex[I]] do begin FPosition := I; FLeft := RunningPos; if coVisible in FOptions then Inc(RunningPos, FWidth); end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.Add: TVirtualTreeColumn; begin Result := TVirtualTreeColumn(inherited Add); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.AnimatedResize(Column: TColumnIndex; NewWidth: Integer); // Resizes the given column animated by scrolling the window DC. {$ifndef INCOMPLETE_WINAPI} var OldWidth: Integer; DC: HDC; I, Steps, DX: Integer; HeaderScrollRect, ScrollRect, R: TRect; NewBrush, LastBrush: HBRUSH; {$endif} begin //todo: reimplement {$ifndef INCOMPLETE_WINAPI} if not IsValidColumn(Column) then exit; // Just in case. // Make sure the width constrains are considered. if NewWidth < Items[Column].FMinWidth then NewWidth := Items[Column].FMinWidth; if NewWidth > Items[Column].FMaxWidth then NewWidth := Items[Column].FMaxWidth; OldWidth := Items[Column].Width; // Nothing to do if the width is the same. if OldWidth <> NewWidth then begin if not ( (hoDisableAnimatedResize in FHeader.Options) or (coDisableAnimatedResize in Items[Column].Options) ) then begin DC := GetWindowDC(FHeader.Treeview.Handle); with FHeader.Treeview do try Steps := 32; DX := (NewWidth - OldWidth) div Steps; // Determination of the scroll rectangle is a bit complicated since we neither want // to scroll the scrollbars nor the border of the treeview window. HeaderScrollRect := FHeaderRect; ScrollRect := HeaderScrollRect; // Exclude the header itself from scrolling. ScrollRect.Top := ScrollRect.Bottom; ScrollRect.Bottom := ScrollRect.Top + ClientHeight; ScrollRect.Right := ScrollRect.Left + ClientWidth; with Items[Column] do Inc(ScrollRect.Left, FLeft + FWidth); HeaderScrollRect.Left := ScrollRect.Left; HeaderScrollRect.Right := ScrollRect.Right; // When the new width is larger then avoid artefacts on the left hand side // by deleting a small stripe if NewWidth > OldWidth then begin R := ScrollRect; NewBrush := CreateSolidBrush(ColorToRGB(Brush.Color)); LastBrush := SelectObject(DC, NewBrush); R.Right := R.Left + DX; FillRect(DC, R, NewBrush); SelectObject(DC, LastBrush); DeleteObject(NewBrush); end else begin Inc(HeaderScrollRect.Left, DX); Inc(ScrollRect.Left, DX); end; for I := 0 to Steps - 1 do begin ScrollDC(DC, DX, 0, HeaderScrollRect, HeaderScrollRect, 0, nil); Inc(HeaderScrollRect.Left, DX); ScrollDC(DC, DX, 0, ScrollRect, ScrollRect, 0, nil); Inc(ScrollRect.Left, DX); Sleep(1); end; finally ReleaseDC(Handle, DC); end; end; Items[Column].Width := NewWidth; end; {$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.Assign(Source: TPersistent); begin // Let the collection class assign the items. inherited; if Source is TVirtualTreeColumns then begin // Copying the position array is the only needed task here. FPositionToIndex := Copy(TVirtualTreeColumns(Source).FPositionToIndex, 0, MaxInt); // Make sure the left edges are correct after assignment. FNeedPositionsFix := False; UpdatePositions(True); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.Clear; begin FClearing := True; try // Since we're freeing all columns, the following have to be true when we're done. FHoverIndex := NoColumn; FDownIndex := NoColumn; FTrackIndex := NoColumn; FClickIndex := NoColumn; with Header do if not (hsLoading in FStates) then begin FAutoSizeIndex := NoColumn; FMainColumn := NoColumn; FSortColumn := NoColumn; end; inherited Clear; finally FClearing := False; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.ColumnFromPosition(const P: TPoint; Relative: Boolean = True): TColumnIndex; // Determines the current column based on the position passed in P. var I, Sum: Integer; begin Result := InvalidColumn; // The position must be within the header area, but we extend the vertical bounds to the entire treeview area. if (P.X >= 0) and (P.Y >= 0) and (P.Y <= FHeader.TreeView.Height) then with FHeader, Treeview do begin if Relative and (P.X > GetVisibleFixedWidth) then Sum := -FEffectiveOffsetX else Sum := 0; if UseRightToLeftAlignment then Inc(Sum, ComputeRTLOffset(True)); for I := 0 to Count - 1 do if coVisible in Items[FPositionToIndex[I]].FOptions then begin Inc(Sum, Items[FPositionToIndex[I]].Width); if P.X < Sum then begin Result := FPositionToIndex[I]; Break; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.ColumnFromPosition(PositionIndex: TColumnPosition): TColumnIndex; // Returns the index of the column at the given position. begin if Integer(PositionIndex) < Length(FPositionToIndex) then Result := FPositionToIndex[PositionIndex] else Result := NoColumn; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.Equals(OtherColumnsObj: TObject): Boolean; // Compares itself with the given set of columns and returns True if all published properties are the same // (including column order), otherwise False is returned. var I: Integer; OtherColumns : TVirtualTreeColumns; begin if not (OtherColumnsObj is TVirtualTreeColumns) then begin Result := False; Exit end; OtherColumns := TVirtualTreeColumns (OtherColumnsObj); // Same number of columns? Result := OtherColumns.Count = Count; if Result then begin // Same order of columns? Result := CompareMem(Pointer(FPositionToIndex), Pointer(OtherColumns.FPositionToIndex), Length(FPositionToIndex) * SizeOf(TColumnIndex)); if Result then begin for I := 0 to Count - 1 do if not Items[I].Equals(OtherColumns[I]) then begin Result := False; Break; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.GetColumnBounds(Column: TColumnIndex; out Left, Right: Integer); // Returns the left and right bound of the given column. If Column is NoColumn then the entire client width is returned. begin if Column <= NoColumn then begin Left := 0; Right := FHeader.Treeview.ClientWidth; end else begin Left := Items[Column].Left; Right := Left + Items[Column].Width; if FHeader.Treeview.UseRightToLeftAlignment then begin Inc(Left, FHeader.Treeview.ComputeRTLOffset(True)); Inc(Right, FHeader.Treeview.ComputeRTLOffset(True)); end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.GetScrollWidth: Integer; // Returns the average width of all visible, non-fixed columns. If there is no such column the indent is returned. var I: Integer; ScrollColumnCount: Integer; begin Result := 0; ScrollColumnCount := 0; for I := 0 to FHeader.Columns.Count - 1 do begin if ([coVisible, coFixed] * FHeader.Columns[I].Options = [coVisible]) then begin Inc(Result, FHeader.Columns[I].Width); Inc(ScrollColumnCount); end; end; if ScrollColumnCount > 0 then // use average width Result := Round(Result / ScrollColumnCount) else // use indent Result := Integer(FHeader.Treeview.FIndent); end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.GetFirstVisibleColumn(ConsiderAllowFocus: Boolean = False): TColumnIndex; // Returns the index of the first visible column or "InvalidColumn" if either no columns are defined or // all columns are hidden. // If ConsiderAllowFocus is True then the column has not only to be visible but also focus has to be allowed. var I: Integer; begin Result := InvalidColumn; for I := 0 to Count - 1 do if (coVisible in Items[FPositionToIndex[I]].FOptions) and ( (not ConsiderAllowFocus) or (coAllowFocus in Items[FPositionToIndex[I]].FOptions) ) then begin Result := FPositionToIndex[I]; Break; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.GetLastVisibleColumn(ConsiderAllowFocus: Boolean = False): TColumnIndex; // Returns the index of the last visible column or "InvalidColumn" if either no columns are defined or // all columns are hidden. // If ConsiderAllowFocus is True then the column has not only to be visible but also focus has to be allowed. var I: Integer; begin Result := InvalidColumn; for I := Count - 1 downto 0 do if (coVisible in Items[FPositionToIndex[I]].FOptions) and ( (not ConsiderAllowFocus) or (coAllowFocus in Items[FPositionToIndex[I]].FOptions) ) then begin Result := FPositionToIndex[I]; Break; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.GetNextColumn(Column: TColumnIndex): TColumnIndex; // Returns the next column in display order. Column is the index of an item in the collection (a column). var Position: Integer; begin if Column < 0 then Result := InvalidColumn else begin Position := Items[Column].Position; if Position < Count - 1 then Result := FPositionToIndex[Position + 1] else Result := InvalidColumn; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.GetNextVisibleColumn(Column: TColumnIndex; ConsiderAllowFocus: Boolean = False): TColumnIndex; // Returns the next visible column in display order, Column is an index into the columns list. // If ConsiderAllowFocus is True then the column has not only to be visible but also focus has to be allowed. begin Result := Column; repeat Result := GetNextColumn(Result); until (Result = InvalidColumn) or ( (coVisible in Items[Result].FOptions) and ( (not ConsiderAllowFocus) or (coAllowFocus in Items[Result].FOptions) ) ); end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.GetPreviousColumn(Column: TColumnIndex): TColumnIndex; // Returns the previous column in display order, Column is an index into the columns list. var Position: Integer; begin if Column < 0 then Result := InvalidColumn else begin Position := Items[Column].Position; if Position > 0 then Result := FPositionToIndex[Position - 1] else Result := InvalidColumn; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.GetPreviousVisibleColumn(Column: TColumnIndex; ConsiderAllowFocus: Boolean = False): TColumnIndex; // Returns the previous visible column in display order, Column is an index into the columns list. // If ConsiderAllowFocus is True then the column has not only to be visible but also focus has to be allowed. begin Result := Column; repeat Result := GetPreviousColumn(Result); until (Result = InvalidColumn) or ( (coVisible in Items[Result].FOptions) and ( (not ConsiderAllowFocus) or (coAllowFocus in Items[Result].FOptions) ) ); end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.GetVisibleColumns: TColumnsArray; // Returns a list of all currently visible columns in actual order. var I, Counter: Integer; begin SetLength(Result, Count); Counter := 0; for I := 0 to Count - 1 do if coVisible in Items[FPositionToIndex[I]].FOptions then begin Result[Counter] := Items[FPositionToIndex[I]]; Inc(Counter); end; // Set result length to actual visible count. SetLength(Result, Counter); end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.GetVisibleFixedWidth: Integer; // Determines the horizontal space all visible and fixed columns occupy. var I: Integer; begin Result := 0; for I := 0 to Count - 1 do begin if Items[I].Options * [coVisible, coFixed] = [coVisible, coFixed] then Inc(Result, Items[I].Width); end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.IsValidColumn(Column: TColumnIndex): Boolean; // Determines whether the given column is valid or not, that is, whether it is one of the current columns. begin Result := (Column > NoColumn) and (Column < Count); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.LoadFromStream(const Stream: TStream; Version: Integer); var I, ItemCount: Integer; begin Clear; Stream.ReadBuffer(ItemCount, SizeOf(ItemCount)); // number of columns if ItemCount > 0 then begin BeginUpdate; try for I := 0 to ItemCount - 1 do Add.LoadFromStream(Stream, Version); SetLength(FPositionToIndex, ItemCount); Stream.ReadBuffer(FPositionToIndex[0], ItemCount * SizeOf(Cardinal)); UpdatePositions(True); finally EndUpdate; end; end; // Data introduced with header stream version 5 // LCL port started with header stream version 6 so no need to do the check here Stream.ReadBuffer(FDefaultWidth, SizeOf(FDefaultWidth)); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.PaintHeader(DC: HDC; const R: TRect; HOffset: Integer); // Main paint method to draw the header. const SortGlyphs: array[TSortDirection, Boolean] of Integer = ( // ascending/descending, normal/XP style (3, 5) {ascending}, (2, 4) {descending} ); var I, Y, SortIndex: Integer; Run: TRect; RightBorderFlag, NormalButtonStyle, NormalButtonFlags, PressedButtonStyle, PressedButtonFlags, RaisedButtonStyle, RaisedButtonFlags: Cardinal; DrawFormat: Cardinal; Images: TCustomImageList; ButtonRgn: HRGN; OwnerDraw, WrapCaption, AdvancedOwnerDraw: Boolean; {$ifdef ThemeSupport} Details: TThemedElementDetails; {$endif ThemeSupport} PaintInfo: THeaderPaintInfo; RequestedElements, ActualElements: THeaderPaintElements; Temp: TRect; ColCaptionText: String; ColImages: TCustomImageList; ColImageIndex: Integer; begin Run := FHeader.Treeview.FHeaderRect; FHeaderBitmap.Width := Max(Run.Right, R.Right - R.Left); FHeaderBitmap.Height := Run.Bottom; OwnerDraw := (hoOwnerDraw in FHeader.FOptions) and Assigned(FHeader.Treeview.FOnHeaderDraw) and not (csDesigning in FHeader.Treeview.ComponentState); AdvancedOwnerDraw := (hoOwnerDraw in FHeader.FOptions) and Assigned(FHeader.Treeview.FOnAdvancedHeaderDraw) and Assigned(FHeader.Treeview.FOnHeaderDrawQueryElements) and not (csDesigning in FHeader.Treeview.ComponentState); // If both draw posibillities are specified then prefer the advanced way. if AdvancedOwnerDraw then OwnerDraw := False; FillChar(PaintInfo, SizeOf(PaintInfo),#0); PaintInfo.TargetCanvas := FHeaderBitmap.Canvas; with PaintInfo, TargetCanvas do begin Font := FHeader.FFont; RaisedButtonStyle := 0; RaisedButtonFlags := 0; case FHeader.Style of hsThickButtons: begin NormalButtonStyle := BDR_RAISEDINNER or BDR_RAISEDOUTER; NormalButtonFlags := BF_LEFT or BF_TOP or BF_BOTTOM or BF_MIDDLE or BF_SOFT or BF_ADJUST; PressedButtonStyle := BDR_RAISEDINNER or BDR_RAISEDOUTER; PressedButtonFlags := NormalButtonFlags or BF_RIGHT or BF_FLAT or BF_ADJUST; end; hsFlatButtons: begin NormalButtonStyle := BDR_RAISEDINNER; NormalButtonFlags := BF_LEFT or BF_TOP or BF_BOTTOM or BF_MIDDLE or BF_ADJUST; PressedButtonStyle := BDR_SUNKENOUTER; PressedButtonFlags := BF_RECT or BF_MIDDLE or BF_ADJUST; end; else // hsPlates or hsXPStyle, values are not used in the latter case begin NormalButtonStyle := BDR_RAISEDINNER; NormalButtonFlags := BF_RECT or BF_MIDDLE or BF_SOFT or BF_ADJUST; PressedButtonStyle := BDR_SUNKENOUTER; PressedButtonFlags := BF_RECT or BF_MIDDLE or BF_ADJUST; RaisedButtonStyle := BDR_RAISEDINNER; RaisedButtonFlags := BF_LEFT or BF_TOP or BF_BOTTOM or BF_MIDDLE or BF_ADJUST; end; end; // Use shortcut for the images. Images := FHeader.FImages; // Erase background of the header. // See if the application wants to do that on its own. RequestedElements := []; if AdvancedOwnerDraw then begin PaintInfo.PaintRectangle := R; PaintInfo.Column := nil; FHeader.Treeview.DoHeaderDrawQueryElements(PaintInfo, RequestedElements); end; if hpeBackground in RequestedElements then begin FHeader.Treeview.DoAdvancedHeaderDraw(PaintInfo, [hpeBackground]); end else begin {$ifdef ThemeSupport} if tsUseThemes in FHeader.Treeview.FStates then begin Details := ThemeServices.GetElementDetails(thHeaderItemRightNormal); ThemeServices.DrawElement(Handle, Details, R, @R); end else {$endif ThemeSupport} if FHeader.Style = hsXPStyle then DrawXPButton(Handle, Run, False, False, False) else begin Brush.Color := FHeader.FBackground; FillRect(R); end; end; Run.Top := R.Top; Run.Right := R.Left; Run.Bottom := R.Bottom; // Run.Left is set in the loop // Consider right-to-left directionality. with FHeader.Treeview do if UseRightToLeftAlignment then Inc(Run.Right, ComputeRTLOffset); Temp := Run; //todo_lcl_check ShowRightBorder := (FHeader.Style = hsThickButtons) or not (hoAutoResize in FHeader.FOptions);// or //(FHeader.Treeview.BevelKind = bkNone); // Now go for each button. for I := 0 to Count - 1 do begin with Items[FPositionToIndex[I]] do if coVisible in FOptions then begin if not (coFixed in FOptions) then begin Inc(Run.Right, HOffset); HOffset := 0; end; Temp := Rect(Temp.Right, Run.Top, Max(Temp.Right, Run.Right + Width), Run.Bottom); Run.Left := Run.Right; Inc(Run.Right, Width); // Skip columns which are not visible at all. if (Run.Right > R.Left) and (Run.Right > Temp.Left) then begin // Stop painting if the rectangle is filled. if Run.Left > R.Right then Break; // Create a clip region to avoid overpainting any other area which does not belong to this column. if Temp.Right > R.Right then Temp.Right := R.Right; if Temp.Left < R.Left then Temp.Left := R.Left; ButtonRgn := CreateRectRgnIndirect(Temp); SelectClipRgn(Handle, ButtonRgn); DeleteObject(ButtonRgn); //lclheader //Under Delphi/VCL, unlike LCL, the hover index is not changed while dragging. //Here we check if dragging and not draw as hover IsHoverIndex := (Integer(FPositionToIndex[I]) = FHoverIndex) and (hoHotTrack in FHeader.FOptions) and (coEnabled in FOptions) and not (hsDragging in FHeader.States); IsDownIndex := Integer(FPositionToIndex[I]) = FDownIndex; if (coShowDropMark in FOptions) and (Integer(FPositionToIndex[I]) = FDropTarget) and (Integer(FPositionToIndex[I]) <> FDragIndex) then begin if FDropBefore then DropMark := dmmLeft else DropMark := dmmRight; end else DropMark := dmmNone; IsEnabled := (coEnabled in FOptions) and (FHeader.Treeview.Enabled); ShowHeaderGlyph := (hoShowImages in FHeader.FOptions) and Assigned(Images) and (FImageIndex > -1); ShowSortGlyph := (Integer(FPositionToIndex[I]) = FHeader.FSortColumn) and (hoShowSortGlyphs in FHeader.FOptions); WrapCaption := coWrapCaption in FOptions; PaintRectangle := Run; // This path for text columns or advanced owner draw. if (Style = vsText) or not OwnerDraw or AdvancedOwnerDraw then begin // See if the application wants to draw part of the header itself. RequestedElements := []; if AdvancedOwnerDraw then begin PaintInfo.Column := Items[FPositionToIndex[I]]; FHeader.Treeview.DoHeaderDrawQueryElements(PaintInfo, RequestedElements); end; if ShowRightBorder or (I < Count - 1) then RightBorderFlag := BF_RIGHT else RightBorderFlag := 0; if hpeBackground in RequestedElements then FHeader.Treeview.DoAdvancedHeaderDraw(PaintInfo, [hpeBackground]) else begin // Draw button first before setting the clip region. {$ifdef ThemeSupport} if tsUseThemes in FHeader.Treeview.FStates then begin if IsDownIndex then Details := ThemeServices.GetElementDetails(thHeaderItemPressed) else if IsHoverIndex then Details := ThemeServices.GetElementDetails(thHeaderItemHot) else Details := ThemeServices.GetElementDetails(thHeaderItemNormal); ThemeServices.DrawElement(Handle, Details, PaintRectangle, @PaintRectangle); end else {$endif ThemeSupport} begin if FHeader.Style = hsXPStyle then DrawXPButton(Handle, PaintRectangle, RightBorderFlag <> 0, IsDownIndex, IsHoverIndex) else if IsDownIndex then DrawEdge(Handle, PaintRectangle, PressedButtonStyle, PressedButtonFlags) else // Plates have the special case of raising on mouse over. if (FHeader.Style = hsPlates) and IsHoverIndex and (coAllowClick in FOptions) and (coEnabled in FOptions) then DrawEdge(Handle, PaintRectangle, RaisedButtonStyle, RaisedButtonFlags or RightBorderFlag) else DrawEdge(Handle, PaintRectangle, NormalButtonStyle, NormalButtonFlags or RightBorderFlag); end; end; end; PaintRectangle := Run; if (Style = vsText) or not OwnerDraw or AdvancedOwnerDraw then begin // calculate text and glyph position InflateRect(PaintRectangle, -2, -2); DrawFormat := DT_TOP or DT_NOPREFIX; case CaptionAlignment of taLeftJustify : DrawFormat := DrawFormat or DT_LEFT; taRightJustify : DrawFormat := DrawFormat or DT_RIGHT; taCenter : DrawFormat := DrawFormat or DT_CENTER; end; if UseRightToLeftReading then DrawFormat := DrawFormat + DT_RTLREADING; ComputeHeaderLayout(Handle, PaintRectangle, ShowHeaderGlyph, ShowSortGlyph, GlyphPos, SortGlyphPos, TextRectangle, DrawFormat); // Move glyph and text one pixel to the right and down to simulate a pressed button. if IsDownIndex then begin OffsetRect(TextRectangle, 1, 1); Inc(GlyphPos.X); Inc(GlyphPos.Y); Inc(SortGlyphPos.X); Inc(SortGlyphPos.Y); end; // Advanced owner draw allows to paint elements, which would normally not be painted (because of space // limitations, empty captions etc.). ActualElements := RequestedElements * [hpeHeaderGlyph, hpeSortGlyph, hpeDropMark, hpeText]; // main glyph FHasImage := False; if not (hpeHeaderGlyph in ActualElements) and ShowHeaderGlyph and (not ShowSortGlyph or (FBidiMode <> bdLeftToRight) or (GlyphPos.X + Images.Width <= SortGlyphPos.X) ) then begin if not FCheckBox then begin ColImages := Images; ColImageIndex := FImageIndex; ColImages.Draw(FHeaderBitmap.Canvas, GlyphPos.X, GlyphPos.Y, ColImageIndex, IsEnabled ); end else begin with Header.Treeview do begin CheckImageListNeeded; ColImageIndex := GetCheckImage(nil, FCheckType, FCheckState, IsEnabled); {$ifdef USE_DELPHICOMPAT} with FCheckImages do DirectMaskBlt(FHeaderBitmap.Canvas.Handle, GlyphPos.X, GlyphPos.Y, Height, Height, Canvas.Handle, ColImageIndex * Height, 0, MaskHandle); {$else} with FCheckImages do StretchMaskBlt(FHeaderBitmap.Canvas.Handle, GlyphPos.X, GlyphPos.Y, Height, Height, Canvas.Handle, ColImageIndex * Height, 0, Height, Height, MaskHandle, ColImageIndex * Height, 0, SRCCOPY); {$endif} end; end; FHasImage := True; with FImageRect do begin Left := GlyphPos.X; Top := GlyphPos.Y; Right := Left + ColImages.Width; Bottom := Top + ColImages.Height; end; end; // caption if WrapCaption then ColCaptionText := FCaptionText else ColCaptionText := Text; if not (hpeText in ActualElements) and (Length(Text) > 0) then DrawButtonText(Handle, ColCaptionText, TextRectangle, IsEnabled, IsHoverIndex and (hoHotTrack in FHeader.FOptions) and not (tsUseThemes in FHeader.Treeview.FStates), DrawFormat, WrapCaption ); // sort glyph if not (hpeSortGlyph in ActualElements) and ShowSortGlyph then begin SortIndex := SortGlyphs[FHeader.FSortDirection, tsUseThemes in FHeader.Treeview.FStates]; {$ifdef USE_DELPHICOMPAT} DirectMaskBlt(FHeaderBitmap.Canvas.Handle, SortGlyphPos.X, SortGlyphPos.Y, UtilityImageSize, UtilityImageSize, UtilityImages.Canvas.Handle, SortIndex * UtilityImageSize, 0, UtilityImages.MaskHandle); {$else} StretchMaskBlt(FHeaderBitmap.Canvas.Handle, SortGlyphPos.X, SortGlyphPos.Y, UtilityImageSize, UtilityImageSize, UtilityImages.Canvas.Handle, SortIndex * UtilityImageSize, 0, UtilityImageSize, UtilityImageSize, UtilityImages.MaskHandle,SortIndex * UtilityImageSize, 0, SRCCOPY); {$endif} end; // Show an indication if this column is the current drop target in a header drag operation. if not (hpeDropMark in ActualElements) and (DropMark <> dmmNone) then begin Y := (PaintRectangle.Top + PaintRectangle.Bottom - UtilityImages.Height) div 2; if DropMark = dmmLeft then {$ifdef USE_DELPHICOMPAT} DirectMaskBlt(FHeaderBitmap.Canvas.Handle, PaintRectangle.Left, Y, UtilityImageSize, UtilityImageSize, UtilityImages.Canvas.Handle, 0, 0, UtilityImages.MaskHandle) {$else} StretchMaskBlt(FHeaderBitmap.Canvas.Handle, PaintRectangle.Left, Y, UtilityImageSize, UtilityImageSize, UtilityImages.Canvas.Handle, 0, 0, UtilityImageSize, UtilityImageSize, UtilityImages.MaskHandle, 0, 0, SRCCOPY) {$endif} else {$ifdef USE_DELPHICOMPAT} DirectMaskBlt(FHeaderBitmap.Canvas.Handle, PaintRectangle.Right - 16, Y, UtilityImageSize, UtilityImageSize, UtilityImages.Canvas.Handle, UtilityImageSize, 0, UtilityImages.MaskHandle); {$else} StretchMaskBlt(FHeaderBitmap.Canvas.Handle, PaintRectangle.Right - 16, Y, UtilityImageSize, UtilityImageSize, UtilityImages.Canvas.Handle, UtilityImageSize, 0, UtilityImageSize, UtilityImageSize, UtilityImages.MaskHandle, UtilityImageSize, 0, SRCCOPY); {$endif} end; if ActualElements <> [] then begin SaveHandleState; FHeader.Treeview.DoAdvancedHeaderDraw(PaintInfo, ActualElements); RestoreHandleState; end; end else // Let application draw the header. FHeader.Treeview.DoHeaderDraw(FHeaderBitmap.Canvas, Items[FPositionToIndex[I]], PaintRectangle, IsHoverIndex, IsDownIndex, DropMark); SelectClipRgn(Handle, 0); end; end; end; // Blit the result to target. with R do BitBlt(DC, Left, Top, Right - Left, Bottom - Top, Handle, Left, Top, SRCCOPY); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualTreeColumns.SaveToStream(const Stream: TStream); var I: Integer; begin I := Count; Stream.WriteBuffer(I, SizeOf(I)); if I > 0 then begin for I := 0 to Count - 1 do TVirtualTreeColumn(Items[I]).SaveToStream(Stream); Stream.WriteBuffer(FPositionToIndex[0], Count * SizeOf(Cardinal)); end; // Data introduced with header stream version 5. Stream.WriteBuffer(DefaultWidth, SizeOf(DefaultWidth)); end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeColumns.TotalWidth: Integer; var LastColumn: TColumnIndex; begin Result := 0; if (Count > 0) and (Length(FPositionToIndex) > 0) then begin LastColumn := FPositionToIndex[Count - 1]; if not (coVisible in Items[LastColumn].FOptions) then LastColumn := GetPreviousVisibleColumn(LastColumn); if LastColumn > NoColumn then with Items[LastColumn] do Result := FLeft + FWidth end; end; //----------------- TVTFixedAreaConstraints ---------------------------------------------------------------------------- constructor TVTFixedAreaConstraints.Create(AOwner: TVTHeader); begin inherited Create; FHeader := AOwner; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTFixedAreaConstraints.SetConstraints(Index: Integer; Value: TVTConstraintPercent); begin case Index of 0: if Value <> FMaxHeightPercent then begin FMaxHeightPercent := Value; if (Value > 0) and (Value < FMinHeightPercent) then FMinHeightPercent := Value; Change; end; 1: if Value <> FMaxWidthPercent then begin FMaxWidthPercent := Value; if (Value > 0) and (Value < FMinWidthPercent) then FMinWidthPercent := Value; Change; end; 2: if Value <> FMinHeightPercent then begin FMinHeightPercent := Value; if (FMaxHeightPercent > 0) and (Value > FMaxHeightPercent) then FMaxHeightPercent := Value; Change; end; 3: if Value <> FMinWidthPercent then begin FMinWidthPercent := Value; if (FMaxWidthPercent > 0) and (Value > FMaxWidthPercent) then FMaxWidthPercent := Value; Change; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTFixedAreaConstraints.Change; begin if Assigned(FOnChange) then FOnChange(Self); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTFixedAreaConstraints.Assign(Source: TPersistent); begin if Source is TVTFixedAreaConstraints then begin FMaxHeightPercent := TVTFixedAreaConstraints(Source).FMaxHeightPercent; FMaxWidthPercent := TVTFixedAreaConstraints(Source).FMaxWidthPercent; FMinHeightPercent := TVTFixedAreaConstraints(Source).FMinHeightPercent; FMinWidthPercent := TVTFixedAreaConstraints(Source).FMinWidthPercent; Change; end else inherited; end; //----------------- TVTHeader ----------------------------------------------------------------------------------------- constructor TVTHeader.Create(AOwner: TBaseVirtualTree); begin inherited Create; FOwner := AOwner; FColumns := GetColumnsClass.Create(Self); FHeight := 17; FDefaultHeight := 17; FMinHeight := 10; FMaxHeight := 10000; FFont := TFont.Create; FFont.OnChange := FontChanged; FParentFont := False; FBackground := clBtnFace; FOptions := [hoColumnResize, hoDrag, hoShowSortGlyphs]; FImageChangeLink := TChangeLink.Create; FImageChangeLink.OnChange := ImageListChange; FSortColumn := NoColumn; FSortDirection := sdAscending; FMainColumn := NoColumn; FDragImage := TVTDragImage.Create(AOwner); with FDragImage do begin Fade := False; PostBlendBias := 0; PreBlendBias := -50; Transparency := 140; end; FFixedAreaConstraints := TVTFixedAreaConstraints.Create(Self); FFixedAreaConstraints.OnChange := FixedAreaConstraintsChanged; end; //---------------------------------------------------------------------------------------------------------------------- destructor TVTHeader.Destroy; begin FDragImage.Free; FFixedAreaConstraints.Free; FImageChangeLink.Free; FFont.Free; FColumns.Clear; // TCollection's Clear method is not virtual, so we have to call our own Clear method manually. FColumns.Free; inherited; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.FontChanged(Sender: TObject); begin Invalidate(nil); end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.GetMainColumn: TColumnIndex; begin if FColumns.Count > 0 then Result := FMainColumn else Result := NoColumn; end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.GetUseColumns: Boolean; begin Result := FColumns.Count > 0; end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.IsFontStored: Boolean; begin Result := not ParentFont; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.SetAutoSizeIndex(Value: TColumnIndex); begin if FAutoSizeIndex <> Value then begin FAutoSizeIndex := Value; if hoAutoResize in FOptions then Columns.AdjustAutoSize(InvalidColumn); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.SetBackground(Value: TColor); begin if FBackground <> Value then begin FBackground := Value; Invalidate(nil); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.SetColumns(Value: TVirtualTreeColumns); begin FColumns.Assign(Value); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.SetDefaultHeight(Value: Integer); begin if Value < FMinHeight then Value := FMinHeight; if Value > FMaxHeight then Value := FMaxHeight; if FHeight = FDefaultHeight then SetHeight(Value); FDefaultHeight := Value; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.SetFont(const Value: TFont); begin FFont.Assign(Value); FParentFont := False; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.SetHeight(Value: Integer); var RelativeMaxHeight, RelativeMinHeight, EffectiveMaxHeight, EffectiveMinHeight: Integer; begin if not TreeView.HandleAllocated then begin FHeight := Value; Include(FStates, hsNeedScaling); end else begin with FFixedAreaConstraints do begin RelativeMaxHeight := ((Treeview.ClientHeight + FHeight) * FMaxHeightPercent) div 100; RelativeMinHeight := ((Treeview.ClientHeight + FHeight) * FMinHeightPercent) div 100; EffectiveMinHeight := IfThen(FMaxHeightPercent > 0, Min(RelativeMaxHeight, FMinHeight), FMinHeight); EffectiveMaxHeight := IfThen(FMinHeightPercent > 0, Max(RelativeMinHeight, FMaxHeight), FMaxHeight); Value := Min(Max(Value, EffectiveMinHeight), EffectiveMaxHeight); if FMinHeightPercent > 0 then Value := Max(RelativeMinHeight, Value); if FMaxHeightPercent > 0 then Value := Min(RelativeMaxHeight, Value); end; if FHeight <> Value then begin FHeight := Value; if not (csLoading in Treeview.ComponentState) and not (hsScaling in FStates) then RecalculateHeader; Treeview.Invalidate; UpdateWindow(Treeview.Handle); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.SetImages(const Value: TCustomImageList); begin if FImages <> Value then begin if Assigned(FImages) then begin FImages.UnRegisterChanges(FImageChangeLink); FImages.RemoveFreeNotification(FOwner); end; FImages := Value; if Assigned(FImages) then begin FImages.RegisterChanges(FImageChangeLink); FImages.FreeNotification(FOwner); end; if not (csLoading in Treeview.ComponentState) then Invalidate(nil); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.SetMainColumn(Value: TColumnIndex); begin if csLoading in Treeview.ComponentState then FMainColumn := Value else begin if Value < 0 then Value := 0; if Value > FColumns.Count - 1 then Value := FColumns.Count - 1; if Value <> FMainColumn then begin FMainColumn := Value; if Treeview.HandleAllocated then begin Treeview.MainColumnChanged; if not (toExtendedFocus in Treeview.FOptions.FSelectionOptions) then Treeview.FocusedColumn := Value; Treeview.Invalidate; end else begin if not (toExtendedFocus in Treeview.FOptions.FSelectionOptions) then Treeview.FFocusedColumn := Value; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.SetMaxHeight(Value: Integer); begin if Value < FMinHeight then Value := FMinHeight; if not IsWinNT and (Value > 10000) then Value := 10000; FMaxHeight := Value; SetHeight(FHeight); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.SetMinHeight(Value: Integer); begin if Value < 0 then Value := 0; if Value > FMaxHeight then Value := FMaxHeight; FMinHeight := Value; SetHeight(FHeight); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.SetOptions(Value: TVTHeaderOptions); var ToBeSet, ToBeCleared: TVTHeaderOptions; begin ToBeSet := Value - FOptions; ToBeCleared := FOptions - Value; FOptions := Value; if (hoAutoResize in (ToBeSet + ToBeCleared)) and (FColumns.Count > 0) then begin FColumns.AdjustAutoSize(InvalidColumn); if Treeview.HandleAllocated then begin Treeview.UpdateHorizontalScrollBar(False); if hoAutoResize in ToBeSet then Treeview.Invalidate; end; end; if not (csLoading in Treeview.ComponentState) and Treeview.HandleAllocated then begin if hoVisible in (ToBeSet + ToBeCleared) then RecalculateHeader; Invalidate(nil); Treeview.Invalidate; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.SetParentFont(Value: Boolean); begin if FParentFont <> Value then begin FParentFont := Value; if FParentFont then FFont.Assign(FOwner.Font); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.SetSortColumn(Value: TColumnIndex); begin if csLoading in Treeview.ComponentState then FSortColumn := Value else DoSetSortColumn(Value); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.SetSortDirection(const Value: TSortDirection); begin if Value <> FSortDirection then begin FSortDirection := Value; Invalidate(nil); if (toAutoSort in Treeview.FOptions.FAutoOptions) and (Treeview.FUpdateCount = 0) then Treeview.SortTree(FSortColumn, FSortDirection, True); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.SetStyle(Value: TVTHeaderStyle); begin if FStyle <> Value then begin FStyle := Value; if not (csLoading in Treeview.ComponentState) then Invalidate(nil); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.ChangeScale(M, D: Integer); begin FFont.Size := MulDiv(FFont.Size, M, D); end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.DetermineSplitterIndex(const P: TPoint): Boolean; // Tries to find the index of that column whose right border corresponds to P. // Result is True if column border was hit (with -3..+5 pixels tolerance). // For continuous resizing the current track index and the column's left/right border are set. // Note: The hit test is checking from right to left (or left to right in RTL mode) to make enlarging of zero-sized // columns possible. var I, VisibleFixedWidth: Integer; SplitPoint: Integer; //--------------- local function -------------------------------------------- function IsNearBy(IsFixedCol: Boolean; LeftTolerance, RightTolerance: Integer): Boolean; begin if IsFixedCol then Result := (P.X < SplitPoint + Treeview.FEffectiveOffsetX + RightTolerance) and (P.X > SplitPoint + Treeview.FEffectiveOffsetX - LeftTolerance) else Result := (P.X > VisibleFixedWidth) and (P.X < SplitPoint + RightTolerance) and (P.X > SplitPoint - LeftTolerance); end; //--------------- end local function ---------------------------------------- begin Result := False; FColumns.FTrackIndex := NoColumn; VisibleFixedWidth := FColumns.GetVisibleFixedWidth; if FColumns.Count > 0 then begin if Treeview.UseRightToLeftAlignment then begin SplitPoint := -Treeview.FEffectiveOffsetX; if Integer(Treeview.FRangeX) < Treeview.ClientWidth then Inc(SplitPoint, Treeview.ClientWidth - Integer(Treeview.FRangeX)); for I := 0 to FColumns.Count - 1 do with FColumns, Items[FPositionToIndex[I]] do if coVisible in FOptions then begin if IsNearBy(coFixed in FOptions, 5, 3) then begin if CanSplitterResize(P, FPositionToIndex[I]) then begin Result := True; FTrackIndex := FPositionToIndex[I]; // Keep the right border of this column. This and the current mouse position // directly determine the current column width. FTrackPoint.X := SplitPoint + IfThen(coFixed in FOptions, Treeview.FEffectiveOffsetX) + FWidth; FTrackPoint.Y := P.Y; Break; end; end; Inc(SplitPoint, FWidth); end; end else begin SplitPoint := -Treeview.FEffectiveOffsetX + Integer(Treeview.FRangeX); for I := FColumns.Count - 1 downto 0 do with FColumns, Items[FPositionToIndex[I]] do if coVisible in FOptions then begin if IsNearBy(coFixed in FOptions, 3, 5) then begin if CanSplitterResize(P, FPositionToIndex[I]) then begin Result := True; FTrackIndex := FPositionToIndex[I]; // Keep the left border of this column. This and the current mouse position // directly determine the current column width. FTrackPoint.X := SplitPoint + IfThen(coFixed in FOptions, Treeview.FEffectiveOffsetX) - FWidth; FTrackPoint.Y := P.Y; Break; end; end; Dec(SplitPoint, FWidth); end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.DoAfterAutoFitColumn(Column: TColumnIndex); begin if Assigned(TreeView.FOnAfterAutoFitColumn) then TreeView.FOnAfterAutoFitColumn(Self, Column); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.DoAfterColumnWidthTracking(Column: TColumnIndex); // Tell the application that a column width tracking operation has been finished. begin if Assigned(TreeView.FOnAfterColumnWidthTracking) then TreeView.FOnAfterColumnWidthTracking(Self, Column); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.DoAfterHeightTracking; // Tell the application that a height tracking operation has been finished. begin if Assigned(TreeView.FOnAfterHeaderHeightTracking) then TreeView.FOnAfterHeaderHeightTracking(Self); end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.DoBeforeAutoFitColumn(Column: TColumnIndex; SmartAutoFitType: TSmartAutoFitType): Boolean; // Query the application if we may autofit a column. begin Result := True; if Assigned(TreeView.FOnBeforeAutoFitColumn) then TreeView.FOnBeforeAutoFitColumn(Self, Column, SmartAutoFitType, Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.DoBeforeColumnWidthTracking(Column: TColumnIndex; Shift: TShiftState); // Tell the a application that a column width tracking operation may begin. begin if Assigned(TreeView.FOnBeforeColumnWidthTracking) then TreeView.FOnBeforeColumnWidthTracking(Self, Column, Shift); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.DoBeforeHeightTracking(Shift: TShiftState); // Tell the application that a height tracking operation may begin. begin if Assigned(TreeView.FOnBeforeHeaderHeightTracking) then TreeView.FOnBeforeHeaderHeightTracking(Self, Shift); end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.DoColumnWidthDblClickResize(Column: TColumnIndex; P: TPoint; Shift: TShiftState): Boolean; // Queries the application whether a double click on the column splitter should resize the column. begin Result := True; if Assigned(TreeView.FOnColumnWidthDblClickResize) then TreeView.FOnColumnWidthDblClickResize(Self, Column, Shift, P, Result); end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.DoColumnWidthTracking(Column: TColumnIndex; Shift: TShiftState; var TrackPoint: TPoint; P: TPoint): Boolean; begin Result := True; if Assigned(TreeView.FOnColumnWidthTracking) then TreeView.FOnColumnWidthTracking(Self, Column, Shift, TrackPoint, P, Result); end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.DoGetPopupMenu(Column: TColumnIndex; Position: TPoint): TPopupMenu; // Queries the application whether there is a column specific header popup menu. var AskParent: Boolean; begin Result := nil; if Assigned(TreeView.FOnGetPopupMenu) then TreeView.FOnGetPopupMenu(TreeView, nil, Column, Position, AskParent, Result); end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.DoHeightTracking(var P: TPoint; Shift: TShiftState): Boolean; begin Result := True; if Assigned(TreeView.FOnHeaderHeightTracking) then TreeView.FOnHeaderHeightTracking(Self, P, Shift, Result); end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.DoHeightDblClickResize(var P: TPoint; Shift: TShiftState): Boolean; begin Result := True; if Assigned(TreeView.FOnHeaderHeightDblClickResize) then TreeView.FOnHeaderHeightDblClickResize(Self, P, Shift, Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.DoSetSortColumn(Value: TColumnIndex); begin if Value < NoColumn then Value := NoColumn; if Value > Columns.Count - 1 then Value := Columns.Count - 1; if FSortColumn <> Value then begin if FSortColumn > NoColumn then Invalidate(Columns[FSortColumn]); FSortColumn := Value; if FSortColumn > NoColumn then Invalidate(Columns[FSortColumn]); if (toAutoSort in Treeview.FOptions.FAutoOptions) and (Treeview.FUpdateCount = 0) then Treeview.SortTree(FSortColumn, FSortDirection, True); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.DragTo(const P: TPoint); // Moves the drag image to a new position, which is determined from the passed point P and the previous // mouse position. var I, NewTarget: Integer; // optimized drag image move support ClientP: TPoint; Left, Right: Integer; NeedRepaint: Boolean; // True if the screen needs an update (changed drop target or drop side) begin // Determine new drop target and which side of it is prefered. ClientP := Treeview.ScreenToClient(P); // Make coordinates relative to (0, 0) of the non-client area. Inc(ClientP.Y, FHeight); NewTarget := FColumns.ColumnFromPosition(ClientP); NeedRepaint := (NewTarget <> InvalidColumn) and (NewTarget <> FColumns.FDropTarget); if NewTarget >= 0 then begin FColumns.GetColumnBounds(NewTarget, Left, Right); if (ClientP.X < ((Left + Right) div 2)) <> FColumns.FDropBefore then begin NeedRepaint := True; FColumns.FDropBefore := not FColumns.FDropBefore; end; end; if NeedRepaint then begin // Invalidate columns which need a repaint. if FColumns.FDropTarget > NoColumn then begin I := FColumns.FDropTarget; FColumns.FDropTarget := NoColumn; Invalidate(FColumns.Items[I]); end; if (NewTarget > NoColumn) and (NewTarget <> FColumns.FDropTarget) then begin Invalidate(FColumns.Items[NewTarget]); FColumns.FDropTarget := NewTarget; end; end; FDragImage.DragTo(P, NeedRepaint); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.FixedAreaConstraintsChanged(Sender: TObject); // This method gets called when FFixedAreaConstraints is changed. begin Include(FStates, hsNeedScaling); if Treeview.HandleAllocated then RescaleHeader; end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.GetColumnsClass: TVirtualTreeColumnsClass; // Returns the class to be used for the actual column implementation. descendants may optionally override this and // return their own class. begin Result := TVirtualTreeColumns; end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.GetOwner: TPersistent; begin Result := FOwner; end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.GetShiftState: TShiftState; begin Result := []; if GetKeyState(VK_SHIFT) < 0 then Include(Result, ssShift); if GetKeyState(VK_LWIN) < 0 then // Mac OS X substitute of ssCtrl Include(Result, ssMeta); if GetKeyState(VK_CONTROL) < 0 then Include(Result, ssCtrl); if GetKeyState(VK_MENU) < 0 then Include(Result, ssAlt); end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.HandleHeaderMouseMove(var Message: TLMMouseMove): Boolean; var P: TPoint; I: TColumnIndex; begin Result := False; with Message do begin P := Point(XPos, YPos); if hsColumnWidthTrackPending in FStates then begin FStates := FStates - [hsColumnWidthTrackPending] + [hsColumnWidthTracking]; HandleHeaderMouseMove := True; Result := 0; end else if hsHeightTrackPending in FStates then begin FStates := FStates - [hsHeightTrackPending] + [hsHeightTracking]; HandleHeaderMouseMove := True; Result := 0; end else if hsColumnWidthTracking in FStates then begin if DoColumnWidthTracking(FColumns.FTrackIndex, GetShiftState, FTrackPoint, P) then if Treeview.UseRightToLeftAlignment then FColumns[FColumns.FTrackIndex].Width := FTrackPoint.X - XPos else FColumns[FColumns.FTrackIndex].Width := XPos - FTrackPoint.X; HandleHeaderMouseMove := True; Result := 0; end else if hsHeightTracking in FStates then begin //lclheader //fixes setting height Dec(P.Y, FHeight); if DoHeightTracking(P, GetShiftState) then SetHeight(Integer(FHeight) + P.Y); HandleHeaderMouseMove := True; Result := 0; end else begin if hsDragPending in FStates then begin P := Treeview.ClientToScreen(P); // start actual dragging if allowed if (hoDrag in FOptions) and Treeview.DoHeaderDragging(FColumns.FDownIndex) then begin if ((Abs(FDragStart.X - P.X) > DragManager.DragThreshold) or (Abs(FDragStart.Y - P.Y) > DragManager.DragThreshold)) then begin {$ifdef DEBUG_VTV}Logger.Send([lcDrag], 'HandleHeaderMouseMove - DragIndex: %d - DownIndex: %d', [FColumns.FDragIndex, FColumns.FDownIndex]);{$endif} I := FColumns.FDownIndex; FColumns.FDownIndex := NoColumn; FColumns.FHoverIndex := NoColumn; if I > NoColumn then Invalidate(FColumns[I]); //todo: implement drag image under gtk PrepareDrag(P, FDragStart); FStates := FStates - [hsDragPending] + [hsDragging]; HandleHeaderMouseMove := True; Result := 0; end; end; end else if hsDragging in FStates then begin DragTo(Treeview.ClientToScreen(P)); HandleHeaderMouseMove := True; Result := 0; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.HandleMessage(var Message: TLMessage): Boolean; // The header gets here the opportunity to handle certain messages before they reach the tree. This is important // because the tree needs to handle various non-client area messages for the header as well as some dragging/tracking // events. // By returning True the message will not be handled further, otherwise the message is then dispatched // to the proper message handlers. var P: TPoint; R: TRect; I: TColumnIndex; OldPosition: Integer; HitIndex: TColumnIndex; NewCursor: HCURSOR; Button: TMouseButton; Menu: TPopupMenu; IsInHeader, IsHSplitterHit, IsVSplitterHit: Boolean; //--------------- local function -------------------------------------------- function HSPlitterHit: Boolean; var NextCol: TColumnIndex; begin Result := (hoColumnResize in FOptions) and DetermineSplitterIndex(P); if Result and not InHeader(P) then begin NextCol := FColumns.GetNextVisibleColumn(FColumns.FTrackIndex); if not (coFixed in FColumns[FColumns.FTrackIndex].Options) or (NextCol <= NoColumn) or (coFixed in FColumns[NextCol].Options) or (P.Y > Integer(Treeview.FRangeY)) then Result := False; end; end; //--------------- end local function ---------------------------------------- begin Result := False; case Message.Msg of LM_SIZE: begin if not (tsWindowCreating in FOwner.FStates) then if (hoAutoResize in FOptions) and not (hsAutoSizing in FStates) then begin FColumns.AdjustAutoSize(InvalidColumn); Invalidate(nil); end else if not (hsScaling in FStates) then begin RescaleHeader; Invalidate(nil); end; end; CM_PARENTFONTCHANGED: if FParentFont then FFont.Assign(FOwner.Font); CM_BIDIMODECHANGED: for I := 0 to FColumns.Count - 1 do if coParentBiDiMode in FColumns[I].FOptions then FColumns[I].ParentBiDiModeChanged; LM_MBUTTONDOWN: begin //lclheader: NCMessages are given in screen coordinates unlike the ordinary with TLMMButtonDown(Message) do P:= Point(XPos, YPos); //P := Treeview.ScreenToClient(Point(XPos, YPos)); if InHeader(P) then FOwner.DoHeaderMouseDown(mbMiddle, GetShiftState, P.X, P.Y + Integer(FHeight)); end; LM_MBUTTONUP: begin with TLMMButtonUp(Message) do P:= Point(XPos, YPos); //P := FOwner.ScreenToClient(Point(XPos, YPos)); if InHeader(P) then begin FColumns.HandleClick(P, mbMiddle, True, False); FOwner.DoHeaderMouseUp(mbMiddle, GetShiftState, P.X, P.Y + Integer(FHeight)); FColumns.FDownIndex := NoColumn; end; end; LM_LBUTTONDBLCLK, LM_MBUTTONDBLCLK, LM_RBUTTONDBLCLK: begin with TLMLButtonDblClk(Message) do P := Point(XPos, YPos); if (hoHeightDblClickResize in FOptions) and InHeaderSplitterArea(P) and (FDefaultHeight > 0) then begin if DoHeightDblClickResize(P, GetShiftState) and (FDefaultHeight > 0) then SetHeight(FMinHeight); Result := True; end else if HSplitterHit and (Message.Msg = LM_LBUTTONDBLCLK) and (hoDblClickResize in FOptions) and (FColumns.FTrackIndex > NoColumn) then begin // If the click was on a splitter then resize column to smallest width. if DoColumnWidthDblClickResize(FColumns.FTrackIndex, P, GetShiftState) then AutoFitColumns(True, smaUseColumnOption, Columns.FTrackIndex, Columns.FTrackIndex); Message.Result := 0; Result := True; end else if InHeader(P) and (Message.Msg <> LM_LBUTTONDBLCLK) then begin case Message.Msg of LM_MBUTTONDBLCLK: Button := mbMiddle; LM_RBUTTONDBLCLK: Button := mbRight; else // WM_NCLBUTTONDBLCLK Button := mbLeft; end; FColumns.HandleClick(P, Button, True, True); end; end; // The "hot" area of the headers horizontal splitter is partly within the client area of the the tree, so we need // to handle WM_LBUTTONDOWN here, too. LM_LBUTTONDOWN: begin if csDesigning in Treeview.ComponentState then Exit; Application.CancelHint; // make sure no auto scrolling is active... KillTimer(Treeview.Handle, ScrollTimer); Treeview.DoStateChange([], [tsScrollPending, tsScrolling]); // ... pending editing is cancelled (actual editing remains active) KillTimer(Treeview.Handle, EditTimer); Treeview.DoStateChange([], [tsEditPending]); with TLMLButtonDown(Message) do begin // want the drag start point in screen coordinates P := Point(XPos, YPos); FDragStart := Treeview.ClientToScreen(P); //FDragStart := Point(XPos, YPos); //P := Treeview.ScreenToClient(FDragStart); end; IsInHeader := InHeader(P); IsVSplitterHit := (hoHeightResize in FOptions) and InHeaderSplitterArea(P); IsHSplitterHit := HSplitterHit; if IsVSplitterHit or IsHSplitterHit then begin FTrackStart := P; FColumns.FHoverIndex := NoColumn; if IsVSplitterHit then begin DoBeforeHeightTracking(GetShiftState); Include(FStates, hsHeightTrackPending) end else begin DoBeforeColumnWidthTracking(FColumns.FTrackIndex, GetShiftState); Include(FStates, hsColumnWidthTrackPending); end; SetCapture(Treeview.Handle); Result := True; Message.Result := 0; end else if IsInHeader then begin HitIndex := Columns.AdjustDownColumn(P); if (hoDrag in FOptions) and (HitIndex > NoColumn) and (coDraggable in FColumns[HitIndex].FOptions) then begin // Show potential drag operation. // Disabled columns do not start a drag operation because they can't be clicked. Include(FStates, hsDragPending); SetCapture(Treeview.Handle); Result := True; Message.Result := 0; end; end; // This is a good opportunity to notify the application. if IsInHeader then FOwner.DoHeaderMouseDown(mbLeft, GetShiftState, P.X, P.Y + Integer(FHeight)); end; LM_RBUTTONDOWN: begin with TLMRButtonDown(Message) do P:=Point(XPos,YPos); //P := FOwner.ScreenToClient(Point(XPos, YPos)); if InHeader(P) then FOwner.DoHeaderMouseDown(mbRight, GetShiftState, P.X, P.Y + Integer(FHeight)); end; LM_RBUTTONUP: if not (csDesigning in FOwner.ComponentState) then with TLMRButtonUp(Message) do begin Application.CancelHint; P := Point(XPos,YPos); //P := FOwner.ScreenToClient(Point(XPos, YPos)); if InHeader(P) then begin FColumns.HandleClick(P, mbRight, True, False); FOwner.DoHeaderMouseUp(mbRight, GetShiftState, P.X, P.Y + Integer(FHeight)); FColumns.FDownIndex := NoColumn; FColumns.FTrackIndex := NoColumn; Menu := FPopupMenu; if not Assigned(Menu) then Menu := DoGetPopupMenu(FColumns.ColumnFromPosition(Point(P.X, P.Y + Integer(FHeight))), P); // Trigger header popup if there's one. if Assigned(Menu) then begin KillTimer(Treeview.Handle, ScrollTimer); FColumns.FHoverIndex := NoColumn; Treeview.DoStateChange([], [tsScrollPending, tsScrolling]); Menu.PopupComponent := Treeview; P := Treeview.ClientToScreen(Point(XPos, YPos)); Menu.Popup(P.X, P.Y); HandleMessage := True; end; end; end; // When the tree window has an active mouse capture then we only get "client-area" messages. LM_LBUTTONUP: begin Application.CancelHint; if FStates <> [] then begin ReleaseCapture; //lcl if hsColumnWidthTracking in FStates then begin if not InHeader(SmallPointToPoint(TLMLButtonUp(Message).Pos)) then TreeView.Cursor := crDefault; end; if hsDragging in FStates then begin // successfull dragging moves columns with TLMLButtonUp(Message) do P := Treeview.ClientToScreen(Point(XPos, YPos)); GetWindowRect(Treeview.Handle, R); {$ifdef DEBUG_VTV}Logger.Send([lcDrag],'Header - EndDrag / R',R);{$endif} with FColumns do begin {$ifdef DEBUG_VTV}Logger.Send([lcDrag],'Header - EndDrag / FDropTarget: %d FDragIndex: %d FDragIndexPosition: %d', [FDropTarget, FDragIndex, FColumns[FDragIndex].Position]);{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcDrag],'Header - EndDrag / FDropBefore', FColumns.FDropBefore);{$endif} FDragImage.EndDrag; if (FDropTarget > -1) and (FDropTarget <> FDragIndex) and PtInRect(R, P) then begin {$ifdef DEBUG_VTV}Logger.Send([lcDrag],'Header - EndDrag / FDropTargetPosition', FColumns[FDropTarget].Position);{$endif} OldPosition := FColumns[FDragIndex].Position; if FColumns.FDropBefore then begin if FColumns[FDragIndex].Position < FColumns[FDropTarget].Position then FColumns[FDragIndex].Position := Max(0, FColumns[FDropTarget].Position - 1) else FColumns[FDragIndex].Position := FColumns[FDropTarget].Position; end else begin if FColumns[FDragIndex].Position < FColumns[FDropTarget].Position then FColumns[FDragIndex].Position := FColumns[FDropTarget].Position else FColumns[FDragIndex].Position := FColumns[FDropTarget].Position + 1; end; Treeview.DoHeaderDragged(FDragIndex, OldPosition); end else Treeview.DoHeaderDraggedOut(FDragIndex, P); FDropTarget := NoColumn; end; Invalidate(nil); end; Result := True; Message.Result := 0; end; case Message.Msg of LM_LBUTTONUP: with TLMLButtonUp(Message) do begin if FColumns.FDownIndex > NoColumn then FColumns.HandleClick(Point(XPos, YPos), mbLeft, False, False); if FStates <> [] then FOwner.DoHeaderMouseUp(mbLeft, KeysToShiftState(Keys), XPos, YPos); end; //todo: there's a difference here { LM_NCLBUTTONUP: with TLMLButtonUp(Message) do begin P := FOwner.ScreenToClient(Point(XPos, YPos)); FColumns.HandleClick(P, mbLeft, False, False); FOwner.DoHeaderMouseUp(mbLeft, GetShiftState, P.X, P.Y + Integer(FHeight)); end; } end; if FColumns.FTrackIndex > NoColumn then begin if hsColumnWidthTracking in FStates then DoAfterColumnWidthTracking(FColumns.FTrackIndex); Invalidate(Columns[FColumns.FTrackIndex]); FColumns.FTrackIndex := NoColumn; end; if FColumns.FDownIndex > NoColumn then begin Invalidate(Columns[FColumns.FDownIndex]); FColumns.FDownIndex := NoColumn; end; if hsHeightTracking in FStates then DoAfterHeightTracking; FStates := FStates - [hsDragging, hsDragPending, hsColumnWidthTracking, hsColumnWidthTrackPending, hsHeightTracking, hsHeightTrackPending]; end; // hovering, mouse leave detection CM_MOUSELEAVE: with FColumns do begin if FHoverIndex > NoColumn then Invalidate(Items[FHoverIndex]); FHoverIndex := NoColumn; FClickIndex := NoColumn; FDownIndex := NoColumn; end; //todo: see the difference to below LM_MOUSEMOVE: with TLMMouseMove(Message), FColumns do begin //lcl HandleMessage := HandleHeaderMouseMove(TLMMouseMove(Message)); P := Point(XPos,YPos); //P := Treeview.ScreenToClient(Point(XPos, YPos)); IsInHeader := InHeader(P); if IsInHeader then begin Treeview.DoHeaderMouseMove(GetShiftState, P.X, P.Y); if ((AdjustHoverColumn(P)) or ((FDownIndex > NoColumn) and (FHoverIndex <> FDownIndex))) then begin Invalidate(nil); // todo: under lcl, the hint is show even if HintMouseMessage is not implemented // Is it necessary here? // use Delphi's internal hint handling for header hints too if hoShowHint in FOptions then begin // client coordinates! XPos := P.x; YPos := P.y; Application.HintMouseMessage(Treeview, Message); end; end; end else begin if FHoverIndex > NoColumn then Invalidate(Items[FHoverIndex]); FHoverIndex := NoColumn; FClickIndex := NoColumn; FDownIndex := NoColumn; end; //Adjust Cursor if not (csDesigning in FOwner.ComponentState) and (FStates = []) then begin //todo: see a way to store the user defined cursor. IsHSplitterHit := IsInHeader and HSplitterHit; IsVSplitterHit := (hoHeightResize in FOptions) and InHeaderSplitterArea(P); if IsVSplitterHit or IsHSplitterHit then begin NewCursor := crDefault; if IsVSplitterHit and (hoHeightResize in FOptions) then NewCursor := crVertSplit else if IsHSplitterHit then NewCursor := crHeaderSplit; Treeview.DoGetHeaderCursor(NewCursor); if NewCursor <> crDefault then begin Treeview.Cursor := NewCursor; HandleMessage := True; Message.Result := 1; end; end; end else begin Message.Result := 1; HandleMessage := True; end; end; LM_KEYDOWN, LM_KILLFOCUS: if (Message.Msg = LM_KILLFOCUS) or (TLMKeyDown(Message).CharCode = VK_ESCAPE) then begin if hsDragging in FStates then begin ReleaseCapture; FDragImage.EndDrag; Exclude(FStates, hsDragging); FColumns.FDropTarget := NoColumn; Invalidate(nil); Result := True; Message.Result := 0; end else begin if [hsColumnWidthTracking, hsHeightTracking] * FStates <> [] then begin ReleaseCapture; if hsColumnWidthTracking in FStates then DoAfterColumnWidthTracking(FColumns.FTrackIndex); if hsHeightTracking in FStates then DoAfterHeightTracking; Result := True; Message.Result := 0; end; FStates := FStates - [hsColumnWidthTracking, hsColumnWidthTrackPending, hsHeightTracking, hsHeightTrackPending]; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.ImageListChange(Sender: TObject); begin if not (csDestroying in Treeview.ComponentState) then Invalidate(nil); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.PrepareDrag(P, Start: TPoint); // Initializes dragging of the header, P is the current mouse postion and Start the initial mouse position. var HeaderR: TRect; Image: TBitmap; ImagePos: TPoint; DragColumn: TVirtualTreeColumn; begin // Determine initial position of drag image (screen coordinates). FColumns.FDropTarget := NoColumn; Start := Treeview.ScreenToClient(Start); FColumns.FDragIndex := FColumns.ColumnFromPosition(Start); DragColumn := FColumns[FColumns.FDragIndex]; HeaderR := Treeview.FHeaderRect; // Set right border of the header rectangle to the maximum extent. // Adjust top border too, it is already covered elsewhere. HeaderR.Right := FColumns.TotalWidth; HeaderR.Top := 0; // Take out influence of border since we need a seamless drag image. OffsetRect(HeaderR, -Treeview.BorderWidth, -Treeview.BorderWidth); if Treeview.UseRightToLeftAlignment then Dec(HeaderR.Left, Treeview.ComputeRTLOffset); Image := TBitmap.Create; with Image do try PixelFormat := pf32Bit; Width := DragColumn.Width; Height := FHeight; // Erase the entire image with the color key value, for the case not everything // in the image is covered by the header image. Canvas.Brush.Color := clBtnFace; Canvas.FillRect(Rect(0, 0, Width, Height)); // Now move the window origin of bitmap DC so that although the entire header is painted // only the dragged column becomes visible. SetWindowOrgEx(Canvas.Handle, DragColumn.FLeft, 0, nil); FColumns.PaintHeader(Canvas.Handle, HeaderR, 0); SetWindowOrgEx(Canvas.Handle, 0, 0, nil); if Treeview.UseRightToLeftAlignment then ImagePos := Treeview.ClientToScreen(Point(DragColumn.Left + Treeview.ComputeRTLOffset(True), 0)) else ImagePos := Treeview.ClientToScreen(Point(DragColumn.Left, 0)); //lclheader // Column rectangles are given in local window coordinates not client coordinates. // The above statement is not valid under LCL //Dec(ImagePos.Y, FHeight); if hoRestrictDrag in FOptions then FDragImage.MoveRestriction := dmrHorizontalOnly else FDragImage.MoveRestriction := dmrNone; FDragImage.PrepareDrag(Image, ImagePos, P, nil); FDragImage.ShowDragImage; finally Image.Free; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.RecalculateHeader; // Initiate a recalculation of the non-client area of the owner tree. begin if Treeview.HandleAllocated then begin Treeview.UpdateHeaderRect; //lclheader //not necessary since header is draw inside client area //SetWindowPos(Treeview.Handle, 0, 0, 0, 0, 0, SWP_FRAMECHANGED or SWP_NOMOVE or SWP_NOACTIVATE or SWP_NOOWNERZORDER or // SWP_NOSENDCHANGING or SWP_NOSIZE or SWP_NOZORDER); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.RescaleHeader; // Rescale the fixed elements (fixed columns, header itself) to FixedAreaConstraints. var FixedWidth, MaxFixedWidth, MinFixedWidth: Integer; //--------------- local function -------------------------------------------- procedure ComputeConstraints; var I: TColumnIndex; begin with FColumns do begin I := GetFirstVisibleColumn; while I > NoColumn do begin if (coFixed in FColumns[I].Options) and (FColumns[I].Width < FColumns[I].MinWidth) then FColumns[I].FWidth := FColumns[I].FMinWidth; I := GetNextVisibleColumn(I); end; FixedWidth := GetVisibleFixedWidth; end; with FFixedAreaConstraints do begin MinFixedWidth := (TreeView.ClientWidth * FMinWidthPercent) div 100; MaxFixedWidth := (TreeView.ClientWidth * FMaxWidthPercent) div 100; end; end; //----------- end local function -------------------------------------------- begin if ([csLoading, csReading, csWriting, csDestroying] * Treeview.ComponentState = []) and not (hsLoading in FStates) and Treeview.HandleAllocated then begin Include(FStates, hsScaling); SetHeight(FHeight); RecalculateHeader; with FFixedAreaConstraints do if (FMinHeightPercent > 0) or (FMaxHeightPercent > 0) then begin ComputeConstraints; with FColumns do if (FMaxWidthPercent > 0) and (FixedWidth > MaxFixedWidth) then ResizeColumns(MaxFixedWidth - FixedWidth, 0, Count - 1, [coVisible, coFixed]) else if (FMinWidthPercent > 0) and (FixedWidth < MinFixedWidth) then ResizeColumns(MinFixedWidth - FixedWidth, 0, Count - 1, [coVisible, coFixed]); FColumns.UpdatePositions; end; Exclude(FStates, hsScaling); Exclude(FStates, hsNeedScaling); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.UpdateMainColumn; // Called once the load process of the owner tree is done. begin if FMainColumn < 0 then FMainColumn := 0; if FMainColumn > FColumns.Count - 1 then FMainColumn := FColumns.Count - 1; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.UpdateSpringColumns; var I: TColumnIndex; SpringCount: Integer; Sign: Integer; ChangeBy: Single; Difference: Single; NewAccumulator: Single; begin with TreeView do ChangeBy := FHeaderRect.Right - FHeaderRect.Left - FLastWidth; if (hoAutoSpring in FOptions) and (FLastWidth <> 0) and (ChangeBy <> 0) then begin // Stay positive if downsizing the control. if ChangeBy < 0 then Sign := -1 else Sign := 1; ChangeBy := Abs(ChangeBy); // Count how many columns have spring enabled. SpringCount := 0; for I := 0 to FColumns.Count-1 do if [coVisible, coAutoSpring] * FColumns[I].FOptions = [coVisible, coAutoSpring] then Inc(SpringCount); if SpringCount > 0 then begin // Calculate the size to add/sub to each columns. Difference := ChangeBy / SpringCount; // Adjust the column's size accumulators and resize if the result is >= 1. for I := 0 to FColumns.Count - 1 do if [coVisible, coAutoSpring] * FColumns[I].FOptions = [coVisible, coAutoSpring] then begin // Sum up rest changes from previous runs and the amount from this one and store it in the // column. If there is at least one pixel difference then do a resize and reset the accumulator. NewAccumulator := FColumns[I].FSpringRest + Difference; // Set new width if at least one pixel size difference is reached. if NewAccumulator >= 1 then FColumns[I].SetWidth(FColumns[I].FWidth + (Trunc(NewAccumulator) * Sign)); FColumns[I].FSpringRest := Frac(NewAccumulator); // Keep track of the size count. ChangeBy := ChangeBy - Difference; // Exit loop if resize count drops below freezing point. if ChangeBy < 0 then Break; end; end; end; with TreeView do FLastWidth := FHeaderRect.Right - FHeaderRect.Left; end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.AllowFocus(ColumnIndex: TColumnIndex): Boolean; begin Result := False; if not FColumns.IsValidColumn(ColumnIndex) then exit; // Just in case. Result := (coAllowFocus in FColumns[ColumnIndex].Options); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.Assign(Source: TPersistent); begin if Source is TVTHeader then begin AutoSizeIndex := TVTHeader(Source).AutoSizeIndex; Background := TVTHeader(Source).Background; Columns := TVTHeader(Source).Columns; Font := TVTHeader(Source).Font; FixedAreaConstraints.Assign(TVTHeader(Source).FixedAreaConstraints); Height := TVTHeader(Source).Height; Images := TVTHeader(Source).Images; MainColumn := TVTHeader(Source).MainColumn; Options := TVTHeader(Source).Options; ParentFont := TVTHeader(Source).ParentFont; PopupMenu := TVTHeader(Source).PopupMenu; SortColumn := TVTHeader(Source).SortColumn; SortDirection := TVTHeader(Source).SortDirection; Style := TVTHeader(Source).Style; RescaleHeader; end else inherited; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.AutoFitColumns(Animated: Boolean = True; SmartAutoFitType: TSmartAutoFitType = smaUseColumnOption; RangeStartCol: Integer = NoColumn; RangeEndCol: Integer = NoColumn); //--------------- local functions ------------------------------------------- function GetUseSmartColumnWidth(ColumnIndex: TColumnIndex): Boolean; begin Result := False; case SmartAutoFitType of smaAllColumns: Result := True; smaNoColumn: Result := False; smaUseColumnOption: Result := coSmartResize in FColumns.Items[ColumnIndex].FOptions; end; end; //---------------------------------------------------------------------------- procedure DoAutoFitColumn(Column: TColumnIndex); begin with FColumns do if ([coResizable, coVisible] * Items[FPositionToIndex[Column]].FOptions = [coResizable, coVisible]) and DoBeforeAutoFitColumn(FPositionToIndex[Column], SmartAutoFitType) and not TreeView.OperationCanceled then begin if Animated then AnimatedResize(FPositionToIndex[Column], Treeview.GetMaxColumnWidth(FPositionToIndex[Column], GetUseSmartColumnWidth(FPositionToIndex[Column]))) else FColumns[FPositionToIndex[Column]].Width := Treeview.GetMaxColumnWidth(FPositionToIndex[Column], GetUseSmartColumnWidth(FPositionToIndex[Column])); DoAfterAutoFitColumn(FPositionToIndex[Column]); end; end; //--------------- end local functions ---------------------------------------- var I: Integer; StartCol, EndCol: Integer; begin StartCol := Max(NoColumn + 1, RangeStartCol); if RangeEndCol <= NoColumn then EndCol := FColumns.Count - 1 else EndCol := Min(RangeEndCol, FColumns.Count - 1); if StartCol > EndCol then Exit; // nothing to do TreeView.BeginOperation; if Assigned(TreeView.FOnBeforeAutoFitColumns) then TreeView.FOnBeforeAutoFitColumns(Self, SmartAutoFitType); for I := StartCol to EndCol do DoAutoFitColumn(I); if Assigned(TreeView.FOnAfterAutoFitColumns) then TreeView.FOnAfterAutoFitColumns(Self); Treeview.EndOperation; end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.InHeader(const P: TPoint): Boolean; // Determines whether the given point (client coordinates!) is within the header rectangle (non-client coordinates). begin //lclheader //todo: remove this function and use PtInRect directly ?? Result := PtInRect(TreeView.FHeaderRect, P); end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.InHeaderSplitterArea(P: TPoint): Boolean; // Determines whether the given point (client coordinates!) hits the horizontal splitter area of the header. var R: TRect; begin Result := (hoVisible in FOptions); if Result then begin R := Treeview.FHeaderRect; R.Top := R.Bottom - 2; Inc(R.Bottom, 2); Result := PtInRect(R, P); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.Invalidate(Column: TVirtualTreeColumn; ExpandToBorder: Boolean = False); // Because the header is in the non-client area of the tree it needs some special handling in order to initiate its // repainting. // If ExpandToBorder is True then not only the given column but everything or (depending on hoFullRepaintOnResize) just // everything to its right (or left, in RTL mode) will be invalidated (useful for resizing). This makes only sense when // a column is given. var R: TRect; begin if (hoVisible in FOptions) and Treeview.HandleAllocated then with Treeview do begin if Column = nil then R := FHeaderRect else begin R := Column.GetRect; if not (coFixed in Column.Options) then OffsetRect(R, -FEffectiveOffsetX, 0); if UseRightToLeftAlignment then OffsetRect(R, ComputeRTLOffset, 0); if ExpandToBorder then begin if (hoFullRepaintOnResize in FHeader.FOptions) then begin R.Left := FHeaderRect.Left; R.Right := FHeaderRect.Right; end else begin if UseRightToLeftAlignment then R.Left := FHeaderRect.Left else R.Right := FHeaderRect.Right; end; end; end; //lclheader RedrawWindow(Handle, @R, 0, RDW_FRAME or RDW_INVALIDATE or RDW_VALIDATE or RDW_NOINTERNALPAINT or RDW_NOERASE or RDW_NOCHILDREN); { // Current position of the owner in screen coordinates. GetWindowRect(Handle, RW); // Consider the header within this rectangle. OffsetRect(R, RW.Left, RW.Top); // Expressed in client coordinates (because RedrawWindow wants them so, they will actually become negative). MapWindowPoints(0, Handle, R, 2); RedrawWindow(Handle, @R, 0, RDW_FRAME or RDW_INVALIDATE or RDW_VALIDATE or RDW_NOINTERNALPAINT or RDW_NOERASE or RDW_NOCHILDREN); } end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.LoadFromStream(const Stream: TStream); // restore the state of the header from the given stream var Dummy, Version: Integer; S: AnsiString; OldOptions: TVTHeaderOptions; begin Include(FStates, hsLoading); with Stream do try // Switch off all options which could influence loading the columns (they will be later set again). OldOptions := FOptions; FOptions := []; // Determine whether the stream contains data without a version number. ReadBuffer(Dummy, SizeOf(Dummy)); if Dummy > -1 then begin // Seek back to undo the read operation if this is an old stream format. Seek(-SizeOf(Dummy), soFromCurrent); Version := -1; end else // Read version number if this is a "versionized" format. ReadBuffer(Version, SizeOf(Version)); Columns.LoadFromStream(Stream, Version); ReadBuffer(Dummy, SizeOf(Dummy)); AutoSizeIndex := Dummy; ReadBuffer(Dummy, SizeOf(Dummy)); Background := Dummy; ReadBuffer(Dummy, SizeOf(Dummy)); Height := Dummy; ReadBuffer(Dummy, SizeOf(Dummy)); FOptions := OldOptions; Options := TVTHeaderOptions(Word(Dummy)); // PopupMenu is neither saved nor restored ReadBuffer(Dummy, SizeOf(Dummy)); Style := TVTHeaderStyle(Dummy); // TFont has no own save routine so we do it manually with Font do begin ReadBuffer(Dummy, SizeOf(Dummy)); Color := Dummy; ReadBuffer(Dummy, SizeOf(Dummy)); Height := Dummy; ReadBuffer(Dummy, SizeOf(Dummy)); SetLength(S, Dummy); ReadBuffer(PAnsiChar(S)^, Dummy); Name := S; ReadBuffer(Dummy, SizeOf(Dummy)); Pitch := TFontPitch(Dummy); ReadBuffer(Dummy, SizeOf(Dummy)); Style := TFontStyles(LongWord(Dummy)); end; // LCL port started with header stream version 6 so no need to do the check here // Read data introduced by stream version 1+. ReadBuffer(Dummy, SizeOf(Dummy)); MainColumn := Dummy; ReadBuffer(Dummy, SizeOf(Dummy)); SortColumn := Dummy; ReadBuffer(Dummy, SizeOf(Dummy)); SortDirection := TSortDirection(Byte(Dummy)); // Read data introduced by stream version 5+. ReadBuffer(Dummy, SizeOf(Dummy)); ParentFont := Boolean(Dummy); ReadBuffer(Dummy, SizeOf(Dummy)); FMaxHeight := Integer(Dummy); ReadBuffer(Dummy, SizeOf(Dummy)); FMinHeight := Integer(Dummy); ReadBuffer(Dummy, SizeOf(Dummy)); FDefaultHeight := Integer(Dummy); with FFixedAreaConstraints do begin ReadBuffer(Dummy, SizeOf(Dummy)); FMaxHeightPercent := TVTConstraintPercent(Dummy); ReadBuffer(Dummy, Sizeof(Dummy)); FMaxWidthPercent := TVTConstraintPercent(Dummy); ReadBuffer(Dummy, SizeOf(Dummy)); FMinHeightPercent := TVTConstraintPercent(Dummy); ReadBuffer(Dummy, Sizeof(Dummy)); FMinWidthPercent := TVTConstraintPercent(Dummy); end finally Exclude(FStates, hsLoading); Treeview.DoColumnResize(NoColumn); end; end; //---------------------------------------------------------------------------------------------------------------------- function TVTHeader.ResizeColumns(ChangeBy: Integer; RangeStartCol: TColumnIndex; RangeEndCol: TColumnIndex; Options: TVTColumnOptions = [coVisible]): Integer; // Distribute the given width change to a range of columns. A 'fair' way is used to distribute ChangeBy to the columns, // while ensuring that everything that can be distributed will be distributed. var Start, I: TColumnIndex; ColCount, ToGo, Sign, Rest, MaxDelta, Difference: Integer; Constraints, Widths: Array of Integer; BonusPixel: Boolean; //--------------- local functions ------------------------------------------- function IsResizable (Column: TColumnIndex): Boolean; begin if BonusPixel then Result := Widths[Column - RangeStartCol] < Constraints[Column - RangeStartCol] else Result := Widths[Column - RangeStartCol] > Constraints[Column - RangeStartCol]; end; //--------------------------------------------------------------------------- procedure IncDelta(Column: TColumnIndex); begin if BonusPixel then Inc(MaxDelta, FColumns[Column].MaxWidth - Widths[Column - RangeStartCol]) else Inc(MaxDelta, Widths[Column - RangeStartCol] - Constraints[Column - RangeStartCol]); end; //--------------------------------------------------------------------------- function ChangeWidth(Column: TColumnIndex; Delta: Integer): Integer; begin if Delta > 0 then Delta := Min(Delta, Constraints[Column - RangeStartCol] - Widths[Column - RangeStartCol]) else Delta := Max(Delta, Constraints[Column - RangeStartCol] - Widths[Column - RangeStartCol]); Inc(Widths[Column - RangeStartCol], Delta); Dec(ToGo, Abs(Delta)); Result := Abs(Delta); end; //--------------------------------------------------------------------------- function ReduceConstraints: Boolean; var MaxWidth, MaxReserveCol, Column: TColumnIndex; begin Result := True; if not (hsScaling in FStates) or BonusPixel then Exit; MaxWidth := 0; MaxReserveCol := NoColumn; for Column := RangeStartCol to RangeEndCol do if (Options * FColumns[Column].FOptions = Options) and (FColumns[Column].FWidth > MaxWidth) then begin MaxWidth := Widths[Column - RangeStartCol]; MaxReserveCol := Column; end; if (MaxReserveCol <= NoColumn) or (Constraints[MaxReserveCol - RangeStartCol] <= 10) then Result := False else Dec(Constraints[MaxReserveCol - RangeStartCol], Constraints[MaxReserveCol - RangeStartCol] div 10); end; //----------- end local functions ------------------------------------------- begin Result := 0; if ChangeBy <> 0 then begin // Do some initialization here BonusPixel := ChangeBy > 0; Sign := IfThen(BonusPixel, 1, -1); Start := IfThen(BonusPixel, RangeStartCol, RangeEndCol); ToGo := Abs(ChangeBy); SetLength(Widths, RangeEndCol - RangeStartCol + 1); SetLength(Constraints, RangeEndCol - RangeStartCol + 1); for I := RangeStartCol to RangeEndCol do begin Widths[I - RangeStartCol] := FColumns[I].FWidth; Constraints[I - RangeStartCol] := IfThen(BonusPixel, FColumns[I].MaxWidth, FColumns[I].MinWidth); end; repeat repeat MaxDelta := 0; ColCount := 0; for I := RangeStartCol to RangeEndCol do if (Options * FColumns[I].FOptions = Options) and IsResizable(I) then begin Inc(ColCount); IncDelta(I); end; if MaxDelta < Abs(ChangeBy) then if not ReduceConstraints then Break; until (MaxDelta >= Abs(ChangeBy)) or not (hsScaling in FStates); if ColCount = 0 then Break; ToGo := Min(ToGo, MaxDelta); Difference := ToGo div ColCount; Rest := ToGo mod ColCount; if Difference > 0 then for I := RangeStartCol to RangeEndCol do if (Options * FColumns[I].FOptions = Options) and IsResizable(I) then ChangeWidth(I, Difference * Sign); // Now distribute Rest. I := Start; while Rest > 0 do begin if (Options * FColumns[I].FOptions = Options) and IsResizable(I) then if FColumns[I].FBonusPixel <> BonusPixel then begin Dec(Rest, ChangeWidth(I, Sign)); FColumns[I].FBonusPixel := BonusPixel; end; Inc(I, Sign); if (BonusPixel and (I > RangeEndCol)) or (not BonusPixel and (I < RangeStartCol)) then begin for I := RangeStartCol to RangeEndCol do if Options * FColumns[I].FOptions = Options then FColumns[I].FBonusPixel := not FColumns[I].FBonusPixel; I := Start; end; end; until ToGo <= 0; // Now set the computed widths. We also compute the result here. Include(FStates, hsResizing); for I := RangeStartCol to RangeEndCol do if (Options * FColumns[I].FOptions = Options) then begin Inc(Result, Widths[I - RangeStartCol] - FColumns[I].FWidth); FColumns[I].SetWidth(Widths[I - RangeStartCol]); end; Exclude(FStates, hsResizing); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.RestoreColumns; // Restores all columns to their width which they had before they have been auto fitted. var I: TColumnIndex; begin with FColumns do for I := Count - 1 downto 0 do if [coResizable, coVisible] * Items[FPositionToIndex[I]].FOptions = [coResizable, coVisible] then Items[I].RestoreLastWidth; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeader.SaveToStream(const Stream: TStream); // Saves the complete state of the header into the provided stream. var Dummy: Integer; Tmp: AnsiString; begin with Stream do begin // In previous version of VT was no header stream version defined. // For feature enhancements it is necessary, however, to know which stream // format we are trying to load. // In order to distict from non-version streams an indicator is inserted. Dummy := -1; WriteBuffer(Dummy, SizeOf(Dummy)); // Write current stream version number, nothing more is required at the time being. Dummy := VTHeaderStreamVersion; WriteBuffer(Dummy, SizeOf(Dummy)); // Save columns in case they depend on certain options (like auto size). Columns.SaveToStream(Stream); Dummy := FAutoSizeIndex; WriteBuffer(Dummy, SizeOf(Dummy)); Dummy := FBackground; WriteBuffer(Dummy, SizeOf(Dummy)); Dummy := FHeight; WriteBuffer(Dummy, SizeOf(Dummy)); Dummy := Word(FOptions); WriteBuffer(Dummy, SizeOf(Dummy)); // PopupMenu is neither saved nor restored Dummy := Ord(FStyle); WriteBuffer(Dummy, SizeOf(Dummy)); // TFont has no own save routine so we do it manually with Font do begin Dummy := Color; WriteBuffer(Dummy, SizeOf(Dummy)); // Need only to write one: size or height, I decided to write height. Dummy := Height; WriteBuffer(Dummy, SizeOf(Dummy)); Tmp := Name; Dummy := Length(Tmp); WriteBuffer(Dummy, SizeOf(Dummy)); WriteBuffer(PAnsiChar(Tmp)^, Dummy); Dummy := Ord(Pitch); WriteBuffer(Dummy, SizeOf(Dummy)); Dummy := Integer(Style); WriteBuffer(Dummy, SizeOf(Dummy)); end; // Data introduced by stream version 1. Dummy := FMainColumn; WriteBuffer(Dummy, SizeOf(Dummy)); Dummy := FSortColumn; WriteBuffer(Dummy, SizeOf(Dummy)); Dummy := Byte(FSortDirection); WriteBuffer(Dummy, SizeOf(Dummy)); // Data introduced by stream version 5. Dummy := Integer(ParentFont); WriteBuffer(Dummy, SizeOf(Dummy)); Dummy := Integer(FMaxHeight); WriteBuffer(Dummy, SizeOf(Dummy)); Dummy := Integer(FMinHeight); WriteBuffer(Dummy, SizeOf(Dummy)); Dummy := Integer(FDefaultHeight); WriteBuffer(Dummy, SizeOf(Dummy)); with FFixedAreaConstraints do begin Dummy := Integer(FMaxHeightPercent); WriteBuffer(Dummy, SizeOf(Dummy)); Dummy := Integer(FMaxWidthPercent); WriteBuffer(Dummy, SizeOf(Dummy)); Dummy := Integer(FMinHeightPercent); WriteBuffer(Dummy, SizeOf(Dummy)); Dummy := Integer(FMinWidthPercent); WriteBuffer(Dummy, SizeOf(Dummy)); end end; end; //----------------- TScrollBarOptions ---------------------------------------------------------------------------------- constructor TScrollBarOptions.Create(AOwner: TBaseVirtualTree); begin inherited Create; FOwner := AOwner; FAlwaysVisible := False; FScrollBarStyle := sbmRegular; FScrollBars := ssBoth; FIncrementX := 20; FIncrementY := 20; end; //---------------------------------------------------------------------------------------------------------------------- procedure TScrollBarOptions.SetAlwaysVisible(Value: Boolean); begin if FAlwaysVisible <> Value then begin FAlwaysVisible := Value; //todo_lcl_check if not (csLoading in FOwner.ComponentState) and FOwner.HandleAllocated then RecreateWnd(FOwner); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TScrollBarOptions.SetScrollBars(Value: TScrollStyle); begin if FScrollbars <> Value then begin FScrollBars := Value; //todo_lcl_check if not (csLoading in FOwner.ComponentState) and FOwner.HandleAllocated then RecreateWnd(FOwner); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TScrollBarOptions.SetScrollBarStyle(Value: TVTScrollBarStyle); begin {$ifndef UseFlatScrollbars} Assert(Value = sbmRegular, 'Flat scrollbars styles are disabled. Enable UseFlatScrollbars in VTConfig.inc for' + 'flat scrollbar support.'); {$endif UseFlatScrollbars} if FScrollBarStyle <> Value then begin FScrollBarStyle := Value; {$ifdef UseFlatScrollbars} if FOwner.HandleAllocated then begin // If set to regular style then don't use the emulation mode of the FlatSB APIs but the original APIs. // This is necessary because the FlatSB APIs don't respect NC paint request with limited update region // (which is necessary for the transparent drag image). FOwner.RecreateWnd; end; {$endif UseFlatScrollbars} end; end; //---------------------------------------------------------------------------------------------------------------------- function TScrollBarOptions.GetOwner: TPersistent; begin Result := FOwner; end; //---------------------------------------------------------------------------------------------------------------------- procedure TScrollBarOptions.Assign(Source: TPersistent); begin if Source is TScrollBarOptions then begin AlwaysVisible := TScrollBarOptions(Source).AlwaysVisible; HorizontalIncrement := TScrollBarOptions(Source).HorizontalIncrement; ScrollBars := TScrollBarOptions(Source).ScrollBars; ScrollBarStyle := TScrollBarOptions(Source).ScrollBarStyle; VerticalIncrement := TScrollBarOptions(Source).VerticalIncrement; end else inherited; end; //----------------- TVTColors ------------------------------------------------------------------------------------------ constructor TVTColors.Create(AOwner: TBaseVirtualTree); begin FOwner := AOwner; FColors[0] := clBtnShadow; // DisabledColor FColors[1] := clHighlight; // DropMarkColor FColors[2] := clHighLight; // DropTargetColor FColors[3] := clHighLight; // FocusedSelectionColor FColors[4] := clBtnFace; // GridLineColor FColors[5] := clBtnShadow; // TreeLineColor FColors[6] := clBtnFace; // UnfocusedSelectionColor FColors[7] := clBtnFace; // BorderColor FColors[8] := clWindowText; // HotColor FColors[9] := clHighLight; // FocusedSelectionBorderColor FColors[10] := clBtnFace; // UnfocusedSelectionBorderColor FColors[11] := clHighlight; // DropTargetBorderColor FColors[12] := clHighlight; // SelectionRectangleBlendColor FColors[13] := clHighlight; // SelectionRectangleBorderColor FColors[14] := clBtnShadow; // HeaderHotColor end; //---------------------------------------------------------------------------------------------------------------------- function TVTColors.GetColor(const Index: Integer): TColor; begin Result := FColors[Index]; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTColors.SetColor(const Index: Integer; const Value: TColor); begin if FColors[Index] <> Value then begin FColors[Index] := Value; if not (csLoading in FOwner.ComponentState) and FOwner.HandleAllocated then begin // Cause helper bitmap rebuild if the button color changed. case Index of 5: begin FOwner.PrepareBitmaps(True, False); FOwner.Invalidate; end; 7: RedrawWindow(FOwner.Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE or RDW_NOERASE or RDW_NOCHILDREN) else FOwner.Invalidate; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTColors.Assign(Source: TPersistent); begin if Source is TVTColors then begin FColors := TVTColors(Source).FColors; if FOwner.FUpdateCount = 0 then FOwner.Invalidate; end else inherited; end; //----------------- TClipboardFormats ---------------------------------------------------------------------------------- constructor TClipboardFormats.Create(AOwner: TBaseVirtualTree); begin FOwner := AOwner; Sorted := True; Duplicates := dupIgnore; end; //---------------------------------------------------------------------------------------------------------------------- function TClipboardFormats.Add(const S: string): Integer; // Restrict additions to the clipbard formats to only those which are registered with the owner tree or one of its // ancestors. var Format: Word; RegisteredClass: TVirtualTreeClass; begin RegisteredClass := InternalClipboardFormats.FindFormat(S, Format); if Assigned(RegisteredClass) and FOwner.ClassType.InheritsFrom(RegisteredClass) then Result := inherited Add(S) else Result := -1; end; //---------------------------------------------------------------------------------------------------------------------- procedure TClipboardFormats.Insert(Index: Integer; const S: string); // Restrict additions to the clipbard formats to only those which are registered with the owner tree or one of its // ancestors. var Format: Word; RegisteredClass: TVirtualTreeClass; begin RegisteredClass := InternalClipboardFormats.FindFormat(S, Format); if Assigned(RegisteredClass) and FOwner.ClassType.InheritsFrom(RegisteredClass) then inherited Insert(Index, S); end; //----------------- TBaseVirtualTree ----------------------------------------------------------------------------------- constructor TBaseVirtualTree.Create(AOwner: TComponent); begin if not Initialized then InitializeGlobalStructures; inherited; ControlStyle := ControlStyle - [csSetCaption] + [csCaptureMouse, csOpaque, csReplicatable, csDisplayDragImage, csReflector]; FTotalInternalDataSize := 0; FNodeDataSize := -1; Width := 200; Height := 100; TabStop := True; ParentColor := False; FDefaultNodeHeight := 18; FDragOperations := [doCopy, doMove]; FHotCursor := crDefault; FScrollBarOptions := TScrollBarOptions.Create(Self); FFocusedColumn := NoColumn; FDragImageKind := diComplete; FLastSelectionLevel := -1; FSelectionBlendFactor := 128; FIndent := 18; FPlusBM := TBitmap.Create; FHotPlusBM := TBitmap.Create; FMinusBM := TBitmap.Create; FHotMinusBM := TBitmap.Create; BorderStyle := bsSingle; FButtonStyle := bsRectangle; FButtonFillMode := fmTreeColor; FHeader := GetHeaderClass.Create(Self); // we have an own double buffer handling DoubleBuffered := False; FCheckImageKind := ckSystemDefault; FImageChangeLink := TChangeLink.Create; FImageChangeLink.OnChange := ImageListChange; FStateChangeLink := TChangeLink.Create; FStateChangeLink.OnChange := ImageListChange; FCustomCheckChangeLink := TChangeLink.Create; FCustomCheckChangeLink.OnChange := ImageListChange; FAutoExpandDelay := 1000; FAutoScrollDelay := 1000; FAutoScrollInterval := 1; FBackground := TPicture.Create; FDefaultPasteMode := amAddChildLast; FMargin := 4; FTextMargin := 4; FDragType := dtOLE; FDragHeight := 350; FDragWidth := 200; FColors := TVTColors.Create(Self); FEditDelay := 1000; FDragImage := TVTDragImage.Create(Self); with FDragImage do begin Fade := True; PostBlendBias := 0; PreBlendBias := 0; Transparency := 200; end; SetLength(FSingletonNodeArray, 1); FAnimationDuration := 200; FSearchTimeout := 1000; FSearchStart := ssFocusedNode; FNodeAlignment := naProportional; FLineStyle := lsDotted; FIncrementalSearch := isNone; FClipboardFormats := TClipboardFormats.Create(Self); FOptions := GetOptionsClass.Create(Self); {$ifdef EnableThreadSupport} AddThreadReference; {$endif} end; //---------------------------------------------------------------------------------------------------------------------- destructor TBaseVirtualTree.Destroy; begin Exclude(FOptions.FMiscOptions, toReadOnly); {$ifdef EnableThreadSupport} ReleaseThreadReference(Self); {$endif} StopWheelPanning; //lcl FPanningWindow.Free; // Just in case it didn't happen already release the edit link. FEditLink := nil; FClipboardFormats.Free; // Clear will also free the drag manager if it is still alive. Clear; FDragImage.Free; FColors.Free; FBackground.Free; FImageChangeLink.Free; FStateChangeLink.Free; FCustomCheckChangeLink.Free; FScrollBarOptions.Free; FOptions.Free; // The window handle must be destroyed before the header is freed because it is needed in WM_NCDESTROY. //todo_lcl_check { if HandleAllocated then DestroyWindowHandle; } FreeAndNil(FHeader); if FCheckImages <> FCustomCheckImages then FCheckImages.Free; FreeMem(FRoot); FPlusBM.Free; FHotPlusBM.Free; FMinusBM.Free; FHotMinusBM.Free; inherited; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.AdjustCoordinatesByIndent(var PaintInfo: TVTPaintInfo; Indent: Integer); // During painting of the main column some coordinates must be adjusted due to the tree lines. // The offset resulting from the tree lines and indentation level is given in Indent. var Offset: Integer; begin with PaintInfo do begin Offset := Indent * Integer(FIndent); if BidiMode = bdLeftToRight then begin Inc(ContentRect.Left, Offset); Inc(ImageInfo[iiNormal].XPos, Offset); Inc(ImageInfo[iiState].XPos, Offset); Inc(ImageInfo[iiCheck].XPos, Offset); end else begin Dec(ContentRect.Right, Offset); Dec(ImageInfo[iiNormal].XPos, Offset); Dec(ImageInfo[iiState].XPos, Offset); Dec(ImageInfo[iiCheck].XPos, Offset); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.AdjustImageBorder(ImageWidth, ImageHeight: Integer; BidiMode: TBidiMode; VAlign: Integer; var R: TRect; var ImageInfo: TVTImageInfo); // Depending on the width of the image list as well as the given bidi mode R must be adjusted. begin if BidiMode = bdLeftToRight then begin ImageInfo.XPos := R.Left; Inc(R.Left, ImageWidth + 2); end else begin ImageInfo.XPos := R.Right - Images.Width; Dec(R.Right, ImageWidth + 2); end; ImageInfo.YPos := R.Top + VAlign - ImageHeight div 2; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.AdjustTotalCount(Node: PVirtualNode; Value: Integer; Relative: Boolean = False); // Sets a node's total count to the given value and recursively adjusts the parent's total count // (actually, the adjustment is done iteratively to avoid function call overheads). var Difference: Integer; Run: PVirtualNode; begin if Relative then Difference := Value else Difference := Integer(Value) - Integer(Node.TotalCount); if Difference <> 0 then begin Run := Node; // Root node has as parent the tree view. while Assigned(Run) and (Run <> Pointer(Self)) do begin Inc(Integer(Run.TotalCount), Difference); Run := Run.Parent; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.AdjustTotalHeight(Node: PVirtualNode; Value: Integer; Relative: Boolean = False); // Sets a node's total height to the given value and recursively adjusts the parent's total height. var Difference: Integer; Run: PVirtualNode; begin if Relative then Difference := Value else Difference := Integer(Value) - Integer(Node.TotalHeight); if Difference <> 0 then begin Run := Node; repeat Inc(Integer(Run.TotalHeight), Difference); // If the node is not visible or the parent node is not expanded or we are already at the top // then nothing more remains to do. if not (vsVisible in Run.States) or (Run = FRoot) or (Run.Parent = nil) or not (vsExpanded in Run.Parent.States) then Break; Run := Run.Parent; until False; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.CalculateCacheEntryCount: Integer; // Calculates the size of the position cache. begin if FVisibleCount > 1 then Result := Ceil(FVisibleCount / CacheThreshold) else Result := 0; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.CalculateVerticalAlignments(ShowImages, ShowStateImages: Boolean; Node: PVirtualNode; out VAlign, VButtonAlign: Integer); // Calculates the vertical alignment of the given node and its associated expand/collapse button during // a node paint cycle depending on the required node alignment style. begin // For absolute alignment the calculation is trivial. case FNodeAlignment of naFromTop: VAlign := Node.Align; naFromBottom: VAlign := NodeHeight[Node] - Node.Align; else // naProportional // Consider button and line alignment, but make sure neither the image nor the button (whichever is taller) // go out of the entire node height (100% means bottom alignment to the node's bounds). if ShowImages or ShowStateImages then begin if ShowImages then VAlign := FImages.Height else VAlign := FStateImages.Height; VAlign := MulDiv((Integer(NodeHeight[Node]) - VAlign), Node.Align, 100) + VAlign div 2; end else if toShowButtons in FOptions.FPaintOptions then VAlign := MulDiv((Integer(NodeHeight[Node]) - FPlusBM.Height), Node.Align, 100) + FPlusBM.Height div 2 else VAlign := MulDiv(Node.NodeHeight, Node.Align, 100); end; VButtonAlign := VAlign - FPlusBM.Height div 2; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.ChangeCheckState(Node: PVirtualNode; Value: TCheckState): Boolean; // Sets the check state of the node according to the given value and the node's check type. // If the check state must be propagated to the parent nodes and one of them refuses to change then // nothing happens and False is returned, otherwise True. var Run: PVirtualNode; UncheckedCount, MixedCheckCount, CheckedCount: Cardinal; begin Result := not (vsChecking in Node.States); with Node^ do if Result then begin Include(States, vsChecking); if not (vsInitialized in States) then InitNode(Node); // Indicate that we are going to propagate check states up and down the hierarchy. if FCheckPropagationCount = 0 then // WL, 05.02.2004: Do not enter tsCheckPropagation more than once DoStateChange([tsCheckPropagation]); Inc(FCheckPropagationCount); // WL, 05.02.2004 // Do actions which are associated with the given check state. case CheckType of // Check state change with additional consequences for check states of the children. ctTriStateCheckBox: begin // Propagate state down to the children. if toAutoTristateTracking in FOptions.FAutoOptions then case Value of csUncheckedNormal: if Node.ChildCount > 0 then begin Run := FirstChild; CheckedCount := 0; MixedCheckCount := 0; UncheckedCount := 0; while Assigned(Run) do begin if Run.CheckType in [ctCheckBox, ctTriStateCheckBox] then begin SetCheckState(Run, csUncheckedNormal); // Check if the new child state was set successfully, otherwise we have to adjust the // node's new check state accordingly. case Run.CheckState of csCheckedNormal: Inc(CheckedCount); csMixedNormal: Inc(MixedCheckCount); csUncheckedNormal: Inc(UncheckedCount); end; end; Run := Run.NextSibling; end; // If there is still a mixed state child node checkbox then this node must be mixed checked too. if MixedCheckCount > 0 then Value := csMixedNormal else // If nodes are normally checked child nodes then the unchecked count determines what // to set for the node itself. if CheckedCount > 0 then if UncheckedCount > 0 then Value := csMixedNormal else Value := csCheckedNormal; end; csCheckedNormal: if Node.ChildCount > 0 then begin Run := FirstChild; CheckedCount := 0; MixedCheckCount := 0; UncheckedCount := 0; while Assigned(Run) do begin if Run.CheckType in [ctCheckBox, ctTriStateCheckBox] then begin SetCheckState(Run, csCheckedNormal); // Check if the new child state was set successfully, otherwise we have to adjust the // node's new check state accordingly. case Run.CheckState of csCheckedNormal: Inc(CheckedCount); csMixedNormal: Inc(MixedCheckCount); csUncheckedNormal: Inc(UncheckedCount); end; end; Run := Run.NextSibling; end; // If there is still a mixed state child node checkbox then this node must be mixed checked too. if MixedCheckCount > 0 then Value := csMixedNormal else // If nodes are normally checked child nodes then the unchecked count determines what // to set for the node itself. if CheckedCount > 0 then if UncheckedCount > 0 then Value := csMixedNormal else Value := csCheckedNormal; end; end; end; // radio button check state change ctRadioButton: if Value = csCheckedNormal then begin // Make sure only this node is checked. Run := Parent.FirstChild; while Assigned(Run) do begin if Run.CheckType = ctRadioButton then Run.CheckState := csUncheckedNormal; Run := Run.NextSibling; end; Invalidate; end; end; if Result then CheckState := Value // Set new check state else CheckState := UnpressedState[CheckState]; // Reset dynamic check state. // Propagate state up to the parent. if not (vsInitialized in Parent.States) then InitNode(Parent); if (toAutoTristateTracking in FOptions.FAutoOptions) and ([vsChecking, vsDisabled] * Parent.States = []) and (CheckType in [ctCheckBox, ctTriStateCheckBox]) and (Parent <> FRoot) and (Parent.CheckType = ctTriStateCheckBox) then Result := CheckParentCheckState(Node, Value) else Result := True; InvalidateNode(Node); Exclude(States, vsChecking); Dec(FCheckPropagationCount); // WL, 05.02.2004 if FCheckPropagationCount = 0 then // WL, 05.02.2004: Allow state change event after all check operations finished DoStateChange([], [tsCheckPropagation]); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.CollectSelectedNodesLTR(MainColumn, NodeLeft, NodeRight: Integer; Alignment: TAlignment; OldRect: TRect; const NewRect: TRect): Boolean; // Helper routine used when a draw selection takes place. This version handles left-to-right directionality. // In the process of adding or removing nodes the current selection is modified which requires to pack it after // the function returns. Another side effect of this method is that a temporary list of nodes will be created // (see also InternalCacheNode) which must be inserted into the current selection by the caller. var Run, NextNode: PVirtualNode; TextRight, TextLeft, CheckOffset, CurrentTop, CurrentRight, NextTop, NextColumn, NodeWidth, Dummy: Integer; MinY, MaxY: Integer; ImageOffset, StateImageOffset: Integer; IsInOldRect, IsInNewRect: Boolean; // quick check variables for various parameters WithCheck, WithImages, WithStateImages, DoSwitch, AutoSpan: Boolean; SimpleSelection: Boolean; begin // A priori nothing changes. Result := False; // Determine minimum and maximum vertical coordinates to limit iteration to. MinY := Min(OldRect.Top, NewRect.Top); MaxY := Max(OldRect.Bottom, NewRect.Bottom); // Initialize short hand variables to speed up tests below. DoSwitch := ssCtrlOS in FDrawSelShiftState; WithCheck := (toCheckSupport in FOptions.FMiscOptions) and Assigned(FCheckImages); // Don't check the events here as descendant trees might have overriden the DoGetImageIndex method. WithImages := Assigned(FImages); if WithImages then ImageOffset := FImages.Width + 2 else ImageOffset := 0; WithStateImages := Assigned(FStateImages); if WithStateImages then StateImageOffset := FStateImages.Width + 2 else StateImageOffset := 0; if WithCheck then CheckOffset := FCheckImages.Height + 2 else CheckOffset := 0; AutoSpan := FHeader.UseColumns and (toAutoSpanColumns in FOptions.FAutoOptions); SimpleSelection := toSimpleDrawSelection in FOptions.FSelectionOptions; // This is the node to start with. Run := InternalGetNodeAt(0, MinY, False, CurrentTop); if Assigned(Run) then begin // The initial minimal left border is determined by the identation level of the node and is dynamically adjusted. if toShowRoot in FOptions.FPaintOptions then Inc(NodeLeft, Integer((GetNodeLevel(Run) + 1) * FIndent) + FMargin) else Inc(NodeLeft, Integer(GetNodeLevel(Run) * FIndent) + FMargin); // ----- main loop // Change selection depending on the node's rectangle being in the selection rectangle or not, but // touch only those nodes which overlap either the old selection rectangle or the new one but not both. repeat // Collect offsets for check, normal and state images. TextLeft := NodeLeft; if WithCheck and (Run.CheckType <> ctNone) then Inc(TextLeft, CheckOffset); if WithImages and HasImage(Run, ikNormal, MainColumn) then Inc(TextLeft, ImageOffset); if WithStateImages and HasImage(Run, ikState, MainColumn) then Inc(TextLeft, StateImageOffset); // Ensure the node's height is determined. MeasureItemHeight(Canvas, Run); NextTop := CurrentTop + Integer(NodeHeight[Run]); // Simple selection allows to draw the selection rectangle anywhere. No intersection with node captions is // required. Only top and bottom bounds of the rectangle matter. if SimpleSelection then begin IsInOldRect := (NextTop > OldRect.Top) and (CurrentTop < OldRect.Bottom); IsInNewRect := (NextTop > NewRect.Top) and (CurrentTop < NewRect.Bottom); end else begin // The right column border might be extended if column spanning is enabled. if AutoSpan then begin with FHeader.FColumns do begin NextColumn := MainColumn; repeat Dummy := GetNextVisibleColumn(NextColumn); if (Dummy = InvalidColumn) or not ColumnIsEmpty(Run, Dummy) or (Items[Dummy].BidiMode <> bdLeftToRight) then Break; NextColumn := Dummy; until False; if NextColumn = MainColumn then CurrentRight := NodeRight else GetColumnBounds(NextColumn, Dummy, CurrentRight); end; end else CurrentRight := NodeRight; // Check if we need the node's width. This is the case when the node is not left aligned or the // left border of the selection rectangle is to the right of the left node border. if (TextLeft < OldRect.Left) or (TextLeft < NewRect.Left) or (Alignment <> taLeftJustify) then begin NodeWidth := DoGetNodeWidth(Run, MainColumn); if NodeWidth >= (CurrentRight - TextLeft) then TextRight := CurrentRight else case Alignment of taLeftJustify: TextRight := TextLeft + NodeWidth; taCenter: begin TextLeft := (TextLeft + CurrentRight - NodeWidth) div 2; TextRight := TextLeft + NodeWidth; end; else // taRightJustify TextRight := CurrentRight; TextLeft := TextRight - NodeWidth; end; end else TextRight := CurrentRight; // Now determine whether we need to change the state. IsInOldRect := (OldRect.Left <= TextRight) and (OldRect.Right >= TextLeft) and (NextTop > OldRect.Top) and (CurrentTop < OldRect.Bottom); IsInNewRect := (NewRect.Left <= TextRight) and (NewRect.Right >= TextLeft) and (NextTop > NewRect.Top) and (CurrentTop < NewRect.Bottom); end; if IsInOldRect xor IsInNewRect then begin Result := True; if DoSwitch then begin if vsSelected in Run.States then InternalRemoveFromSelection(Run) else InternalCacheNode(Run); end else begin if IsInNewRect then InternalCacheNode(Run) else InternalRemoveFromSelection(Run); end; end; CurrentTop := NextTop; // Get next visible node and update left node position. NextNode := GetNextVisibleNoInit(Run, True); if NextNode = nil then Break; Inc(NodeLeft, CountLevelDifference(Run, NextNode) * Integer(FIndent)); Run := NextNode; until CurrentTop > MaxY; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.CollectSelectedNodesRTL(MainColumn, NodeLeft, NodeRight: Integer; Alignment: TAlignment; OldRect: TRect; const NewRect: TRect): Boolean; // Helper routine used when a draw selection takes place. This version handles right-to-left directionality. // See also comments in CollectSelectedNodesLTR. var Run, NextNode: PVirtualNode; TextRight, TextLeft, CheckOffset, CurrentTop, CurrentLeft, NextTop, NextColumn, NodeWidth, Dummy: Integer; MinY, MaxY: Integer; ImageOffset, StateImageOffset: Integer; IsInOldRect, IsInNewRect: Boolean; // quick check variables for various parameters WithCheck, WithImages, WithStateImages, DoSwitch, AutoSpan: Boolean; SimpleSelection: Boolean; begin // A priori nothing changes. Result := False; // Switch the alignment to the opposite value in RTL context. ChangeBiDiModeAlignment(Alignment); // Determine minimum and maximum vertical coordinates to limit iteration to. MinY := Min(OldRect.Top, NewRect.Top); MaxY := Max(OldRect.Bottom, NewRect.Bottom); // Initialize short hand variables to speed up tests below. DoSwitch := ssCtrlOS in FDrawSelShiftState; WithCheck := (toCheckSupport in FOptions.FMiscOptions) and Assigned(FCheckImages); // Don't check the events here as descendant trees might have overriden the DoGetImageIndex method. WithImages := Assigned(FImages); if WithImages then ImageOffset := FImages.Width + 2 else ImageOffset := 0; WithStateImages := Assigned(FStateImages); if WithStateImages then StateImageOffset := FStateImages.Width + 2 else StateImageOffset := 0; if WithCheck then CheckOffset := FCheckImages.Height + 2 else CheckOffset := 0; AutoSpan := FHeader.UseColumns and (toAutoSpanColumns in FOptions.FAutoOptions); SimpleSelection := toSimpleDrawSelection in FOptions.FSelectionOptions; // This is the node to start with. Run := InternalGetNodeAt(0, MinY, False, CurrentTop); if Assigned(Run) then begin // The initial minimal left border is determined by the identation level of the node and is dynamically adjusted. if toShowRoot in FOptions.FPaintOptions then Dec(NodeRight, Integer((GetNodeLevel(Run) + 1) * FIndent) + FMargin) else Dec(NodeRight, Integer(GetNodeLevel(Run) * FIndent) + FMargin); // ----- main loop // Change selection depending on the node's rectangle being in the selection rectangle or not, but // touch only those nodes which overlap either the old selection rectangle or the new one but not both. repeat // Collect offsets for check, normal and state images. TextRight := NodeRight; if WithCheck and (Run.CheckType <> ctNone) then Dec(TextRight, CheckOffset); if WithImages and HasImage(Run, ikNormal, MainColumn) then Dec(TextRight, ImageOffset); if WithStateImages and HasImage(Run, ikState, MainColumn) then Dec(TextRight, StateImageOffset); // Ensure the node's height is determined. MeasureItemHeight(Canvas, Run); NextTop := CurrentTop + Integer(NodeHeight[Run]); // Simple selection allows to draw the selection rectangle anywhere. No intersection with node captions is // required. Only top and bottom bounds of the rectangle matter. if SimpleSelection then begin IsInOldRect := (NextTop > OldRect.Top) and (CurrentTop < OldRect.Bottom); IsInNewRect := (NextTop > NewRect.Top) and (CurrentTop < NewRect.Bottom); end else begin // The left column border might be extended if column spanning is enabled. if AutoSpan then begin NextColumn := MainColumn; repeat Dummy := FHeader.FColumns.GetPreviousVisibleColumn(NextColumn); if (Dummy = InvalidColumn) or not ColumnIsEmpty(Run, Dummy) or (FHeader.FColumns[Dummy].BiDiMode = bdLeftToRight) then Break; NextColumn := Dummy; until False; if NextColumn = MainColumn then CurrentLeft := NodeLeft else FHeader.FColumns.GetColumnBounds(NextColumn, CurrentLeft, Dummy); end else CurrentLeft := NodeLeft; // Check if we need the node's width. This is the case when the node is not left aligned (in RTL context this // means actually right aligned) or the right border of the selection rectangle is to the left // of the right node border. if (TextRight > OldRect.Right) or (TextRight > NewRect.Right) or (Alignment <> taRightJustify) then begin NodeWidth := DoGetNodeWidth(Run, MainColumn); if NodeWidth >= (TextRight - CurrentLeft) then TextLeft := CurrentLeft else case Alignment of taLeftJustify: begin TextLeft := CurrentLeft; TextRight := TextLeft + NodeWidth; end; taCenter: begin TextLeft := (TextRight + CurrentLeft - NodeWidth) div 2; TextRight := TextLeft + NodeWidth; end; else // taRightJustify TextLeft := TextRight - NodeWidth; end; end else TextLeft := CurrentLeft; // Now determine whether we need to change the state. IsInOldRect := (OldRect.Right >= TextLeft) and (OldRect.Left <= TextRight) and (NextTop > OldRect.Top) and (CurrentTop < OldRect.Bottom); IsInNewRect := (NewRect.Right >= TextLeft) and (NewRect.Left <= TextRight) and (NextTop > NewRect.Top) and (CurrentTop < NewRect.Bottom); end; if IsInOldRect xor IsInNewRect then begin Result := True; if DoSwitch then begin if vsSelected in Run.States then InternalRemoveFromSelection(Run) else InternalCacheNode(Run); end else begin if IsInNewRect then InternalCacheNode(Run) else InternalRemoveFromSelection(Run); end; end; CurrentTop := NextTop; // Get next visible node and update left node position. NextNode := GetNextVisibleNoInit(Run, True); if NextNode = nil then Break; Dec(NodeRight, CountLevelDifference(Run, NextNode) * Integer(FIndent)); Run := NextNode; until CurrentTop > MaxY; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.ClearNodeBackground(const PaintInfo: TVTPaintInfo; UseBackground, Floating: Boolean; R: TRect); // Erases a node's background depending on what the application decides to do. // UseBackground determines whether or not to use the background picture, while Floating indicates // that R is given in coordinates of the small node bitmap or the superordinated target bitmap used in PaintTree. var BackColor: TColor; EraseAction: TItemEraseAction; Offset: TPoint; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcPaintDetails],'ClearNodeBackground');{$endif} with PaintInfo do begin EraseAction := eaDefault; BackColor := Brush.Color; if Floating then begin Offset := Point(-FEffectiveOffsetX, R.Top); OffsetRect(R, 0, -Offset.Y); end else Offset := Point(0, 0); DoBeforeItemErase(Canvas, Node, R, Backcolor, EraseAction); with Canvas do begin case EraseAction of eaNone: ; eaColor: begin // User has given a new background color. Brush.Color := BackColor; FillRect(R); end; else // eaDefault if UseBackground then begin if toStaticBackground in TreeOptions.PaintOptions then StaticBackground(FBackground.Bitmap, Canvas, Offset, R) else TileBackground(FBackground.Bitmap, Canvas, Offset, R); end else begin //clear the node background //note there's a bug in original VTV that can lead to wrong node paint //so, here the node is always cleared even if is selected Brush.Color := Self.Brush.Color; FillRect(R); {$ifdef DEBUG_VTV}Logger.SendColor([lcPaintDetails],'Clearing a node background - Brush.Color', Brush.Color);{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'Clearing Rectangle (R)', R);{$endif} if (poDrawSelection in PaintOptions) and (toFullRowSelect in FOptions.FSelectionOptions) and (vsSelected in Node.States) and not (toUseBlendedSelection in FOptions.PaintOptions) and not ((tsUseThemes in FStates) and (toUseExplorerTheme in FOptions.FPaintOptions) and IsWinVistaOrAbove) then begin {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails, lcDrag], 'Draw the background of a selected node');{$endif} if toShowHorzGridLines in FOptions.PaintOptions then Dec(R.Bottom); if Focused or (toPopupMode in FOptions.FPaintOptions) then begin Brush.Color := FColors.FocusedSelectionColor; Pen.Color := FColors.FocusedSelectionBorderColor; end else begin Brush.Color := FColors.UnfocusedSelectionColor; Pen.Color := FColors.UnfocusedSelectionBorderColor; end; with R do RoundRect(Left, Top, Right, Bottom, FSelectionCurveRadius, FSelectionCurveRadius); end; end; end; DoAfterItemErase(Canvas, Node, R); end; end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcPaintDetails],'ClearNodeBackground');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.CompareNodePositions(Node1, Node2: PVirtualNode; ConsiderChildrenAbove: Boolean = False): Integer; // Tries hard and smart to quickly determine whether Node1's structural position is before Node2's position. // If ConsiderChildrenAbove is True, the nodes will be compared with their visual order in mind. // Returns 0 if Node1 = Node2, < 0 if Node1 is located before Node2 else > 0. var Run1, Run2: PVirtualNode; Level1, Level2: Cardinal; begin Assert(Assigned(Node1) and Assigned(Node2), 'Nodes must never be nil.'); if Node1 = Node2 then Result := 0 else begin if HasAsParent(Node1, Node2) then Result := IfThen(ConsiderChildrenAbove and (toChildrenAbove in FOptions.FPaintOptions), -1, 1) else if HasAsParent(Node2, Node1) then Result := IfThen(ConsiderChildrenAbove and (toChildrenAbove in FOptions.FPaintOptions), 1, -1) else begin // the given nodes are neither equal nor are they parents of each other, so go up to FRoot // for each node and compare the child indices of the top level parents // Note: neither Node1 nor Node2 can be FRoot at this point as this (a bit strange) circumstance would // be caught by the previous code. // start lookup at the same level Level1 := GetNodeLevel(Node1); Level2 := GetNodeLevel(Node2); Run1 := Node1; while Level1 > Level2 do begin Run1 := Run1.Parent; Dec(Level1); end; Run2 := Node2; while Level2 > Level1 do begin Run2 := Run2.Parent; Dec(Level2); end; // now go up until we find a common parent node (loop will safely stop at FRoot if the nodes // don't share a common parent) while Run1.Parent <> Run2.Parent do begin Run1 := Run1.Parent; Run2 := Run2.Parent; end; Result := Integer(Run1.Index) - Integer(Run2.Index); end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DetermineLineImageAndSelectLevel(Node: PVirtualNode; out LineImage: TLineImage): Integer; // This method is used during paint cycles and initializes an array of line type IDs. These IDs are used to paint // the tree lines in front of the given node. // Additionally an initial count of selected parents is determined and returned which is used for specific painting. var X: Integer; Run: PVirtualNode; begin Result := 0; if toShowRoot in FOptions.FPaintOptions then X := 1 else X := 0; Run := Node; // Determine indentation level of top node. while Run.Parent <> FRoot do begin Inc(X); Run := Run.Parent; // Count selected nodes (FRoot is never selected). if vsSelected in Run.States then Inc(Result); end; // Set initial size of line index array, this will automatically initialized all entries to ltNone. SetLength(LineImage, X); // Only use lines if requested. if toShowTreeLines in FOptions.FPaintOptions then begin if toChildrenAbove in FOptions.FPaintOptions then begin Dec(X); if not HasVisiblePreviousSibling(Node) then begin if (Node.Parent <> FRoot) or HasVisibleNextSibling(Node) then LineImage[X] := ltBottomRight else LineImage[X] := ltRight; end else if (Node.Parent = FRoot) and (not HasVisibleNextSibling(Node)) then LineImage[X] := ltTopRight else LineImage[X] := ltTopDownRight; // Now go up to the root to determine the rest. Run := Node.Parent; while Run <> FRoot do begin Dec(X); if HasVisiblePreviousSibling(Run) then LineImage[X] := ltTopDown; Run := Run.Parent; end; end else begin // Start over parent traversal if necessary. Run := Node; if Run.Parent <> FRoot then begin // The very last image (the one immediately before the item label) is different. if HasVisibleNextSibling(Run) then LineImage[X - 1] := ltTopDownRight else LineImage[X - 1] := ltTopRight; Run := Run.Parent; // Now go up all parents. repeat if Run.Parent = FRoot then Break; Dec(X); if HasVisibleNextSibling(Run) then LineImage[X - 1] := ltTopDown else LineImage[X - 1] := ltNone; Run := Run.Parent; until False; end; // Prepare root level. Run points at this stage to a top level node. if (toShowRoot in FOptions.FPaintOptions) and (toShowTreeLines in FOptions.FPaintOptions) then begin // Is the top node a root node? if Run = Node then begin // First child gets the bottom-right bitmap if it isn't also the only child. if IsFirstVisibleChild(FRoot, Run) then // Is it the only child? if IsLastVisibleChild(FRoot, Run) then LineImage[0] := ltRight else LineImage[0] := ltBottomRight else // real last child if IsLastVisibleChild(FRoot, Run) then LineImage[0] := ltTopRight else LineImage[0] := ltTopDownRight; end else begin // No, top node is not a top level node. So we need different painting. if HasVisibleNextSibling(Run) then LineImage[0] := ltTopDown else LineImage[0] := ltNone; end; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DrawLineImage(const PaintInfo: TVTPaintInfo; X, Y, H, VAlign: Integer; Style: TVTLineType; Reverse: Boolean); // Draws (depending on Style) one of the 5 line types of the tree. // If Reverse is True then a right-to-left column is being drawn, hence horizontal lines must be mirrored. // X and Y describe the left upper corner of the line image rectangle, while H denotes its height (and width). var HalfWidth, TargetX: Integer; begin HalfWidth := Integer(FIndent) div 2; if Reverse then TargetX := 0 else TargetX := FIndent; with PaintInfo.Canvas do begin case Style of ltBottomRight: begin DrawDottedVLine(PaintInfo, Y + VAlign, Y + H, X + HalfWidth); DrawDottedHLine(PaintInfo, X + HalfWidth, X + TargetX, Y + VAlign); end; ltTopDown: DrawDottedVLine(PaintInfo, Y, Y + H, X + HalfWidth); ltTopDownRight: begin DrawDottedVLine(PaintInfo, Y, Y + H, X + HalfWidth); DrawDottedHLine(PaintInfo, X + HalfWidth, X + TargetX, Y + VAlign); end; ltRight: DrawDottedHLine(PaintInfo, X + HalfWidth, X + TargetX, Y + VAlign); ltTopRight: begin DrawDottedVLine(PaintInfo, Y, Y + VAlign, X + HalfWidth); DrawDottedHLine(PaintInfo, X + HalfWidth, X + TargetX, Y + VAlign); end; ltLeft: // left can also mean right for RTL context if Reverse then DrawDottedVLine(PaintInfo, Y, Y + H, X + Integer(FIndent)) else DrawDottedVLine(PaintInfo, Y, Y + H, X); ltLeftBottom: if Reverse then begin DrawDottedVLine(PaintInfo, Y, Y + H, X + Integer(FIndent)); DrawDottedHLine(PaintInfo, X, X + Integer(FIndent), Y + H); end else begin DrawDottedVLine(PaintInfo, Y, Y + H, X); DrawDottedHLine(PaintInfo, X, X + Integer(FIndent), Y + H); end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.FindInPositionCache(Node: PVirtualNode; var CurrentPos: Cardinal): PVirtualNode; // Looks through the position cache and returns the node whose top position is the largest one which is smaller or equal // to the position of the given node. var L, H, I: Integer; begin L := 0; H := High(FPositionCache); while L <= H do begin I := (L + H) shr 1; if CompareNodePositions(FPositionCache[I].Node, Node) <= 0 then L := I + 1 else H := I - 1; end; if L = 0 then // High(FPositionCache) = -1 begin Result := nil; CurrentPos := 0; end else begin Result := FPositionCache[L - 1].Node; CurrentPos := FPositionCache[L - 1].AbsoluteTop; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.FindInPositionCache(Position: Cardinal; var CurrentPos: Cardinal): PVirtualNode; // Looks through the position cache and returns the node whose top position is the largest one which is smaller or equal // to the given vertical position. // The returned node does not necessarily occupy the given position but is the nearest one to start // iterating from to approach the real node for a given position. CurrentPos receives the actual position of the found // node which is needed for further iteration. var L, H, I: Integer; begin L := 0; H := High(FPositionCache); while L <= H do begin I := (L + H) shr 1; if FPositionCache[I].AbsoluteTop <= Position then L := I + 1 else H := I - 1; end; if L = 0 then // High(FPositionCache) = -1 begin Result := nil; CurrentPos := 0; end else begin Result := FPositionCache[L - 1].Node; CurrentPos := FPositionCache[L - 1].AbsoluteTop; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.FixupTotalCount(Node: PVirtualNode); // Called after loading a subtree from stream. The child count in each node is already set but not // their total count. var Child: PVirtualNode; begin // Initial total count is set to one on node creation. Child := Node.FirstChild; while Assigned(Child) do begin FixupTotalCount(Child); Inc(Node.TotalCount, Child.TotalCount); Child := Child.NextSibling; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.FixupTotalHeight(Node: PVirtualNode); // Called after loading a subtree from stream. The individual height of each node is set already, // but their total height needs an adjustment depending on their visibility state. var Child: PVirtualNode; begin // Initial total height is set to the node height on load. Child := Node.FirstChild; if vsExpanded in Node.States then begin while Assigned(Child) do begin FixupTotalHeight(Child); if vsVisible in Child.States then Inc(Node.TotalHeight, Child.TotalHeight); Child := Child.NextSibling; end; end else begin // The node is collapsed, so just update the total height of its child nodes. while Assigned(Child) do begin FixupTotalHeight(Child); Child := Child.NextSibling; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetBottomNode: PVirtualNode; begin Result := InternalGetNodeAt(0, ClientHeight - 1); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetCheckedCount: Integer; var Node: PVirtualNode; begin Result := 0; Node := GetFirstChecked; while Assigned(Node) do begin Inc(Result); Node := GetNextChecked(Node); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetCheckState(Node: PVirtualNode): TCheckState; begin Result := Node.CheckState; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetCheckType(Node: PVirtualNode): TCheckType; begin Result := Node.CheckType; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetChildCount(Node: PVirtualNode): Cardinal; begin if (Node = nil) or (Node = FRoot) then Result := FRoot.ChildCount else Result := Node.ChildCount; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetChildrenInitialized(Node: PVirtualNode): Boolean; begin Result := not (vsHasChildren in Node.States) or (Node.ChildCount > 0); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetCutCopyCount: Integer; var Node: PVirtualNode; begin Result := 0; Node := GetFirstCutCopy; while Assigned(Node) do begin Inc(Result); Node := GetNextCutCopy(Node); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetDisabled(Node: PVirtualNode): Boolean; begin Result := Assigned(Node) and (vsDisabled in Node.States); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetDragManager: IVTDragManager; // Returns the internal drag manager interface. If this does not yet exist then it is created here. begin if FDragManager = nil then begin FDragManager := DoCreateDragManager; if FDragManager = nil then FDragManager := TVTDragManager.Create(Self); end; Result := FDragManager; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetExpanded(Node: PVirtualNode): Boolean; begin if Assigned(Node) then Result := vsExpanded in Node.States else Result := False; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetFullyVisible(Node: PVirtualNode): Boolean; // Determines whether the given node has the visibility flag set as well as all its parents are expanded. begin Assert(Assigned(Node), 'Invalid parameter.'); Result := vsVisible in Node.States; if Result and (Node <> FRoot) then Result := VisiblePath[Node]; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetHasChildren(Node: PVirtualNode): Boolean; begin if Assigned(Node) then Result := vsHasChildren in Node.States else Result := vsHasChildren in FRoot.States; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetMultiline(Node: PVirtualNode): Boolean; begin Result := Assigned(Node) and (Node <> FRoot) and (vsMultiline in Node.States); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNodeHeight(Node: PVirtualNode): Cardinal; begin if Assigned(Node) and (Node <> FRoot) then begin if toVariableNodeHeight in FOptions.FMiscOptions then begin if not (vsInitialized in Node.States) then InitNode(Node); // Ensure the node's height is determined. MeasureItemHeight(Canvas, Node); end; Result := Node.NodeHeight end else Result := 0; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNodeParent(Node: PVirtualNode): PVirtualNode; begin if Assigned(Node) and (Node.Parent <> FRoot) then Result := Node.Parent else Result := nil; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetOffsetXY: TPoint; begin Result := Point(FOffsetX, FOffsetY); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetRootNodeCount: Cardinal; begin Result := FRoot.ChildCount; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetSelected(Node: PVirtualNode): Boolean; begin Result := Assigned(Node) and (vsSelected in Node.States); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetTopNode: PVirtualNode; begin Result := InternalGetNodeAt(0, 0); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetTotalCount: Cardinal; begin Inc(FUpdateCount); try ValidateNode(FRoot, True); finally Dec(FUpdateCount); end; // The root node itself doesn't count as node. Result := FRoot.TotalCount - 1; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetVerticalAlignment(Node: PVirtualNode): Byte; begin Result := Node.Align; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetVisible(Node: PVirtualNode): Boolean; // Determines if the given node is marked as being visible. begin if Node = nil then Node := FRoot; if not (vsInitialized in Node.States) then InitNode(Node); Result := vsVisible in Node.States; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetVisiblePath(Node: PVirtualNode): Boolean; // Determines if all parents of the given node are expanded and have the visibility flag set. begin Assert(Assigned(Node) and (Node <> FRoot), 'Invalid parameters.'); // FRoot is always expanded repeat Node := Node.Parent; until (Node = FRoot) or not (vsExpanded in Node.States) or not (vsVisible in Node.States); Result := Node = FRoot; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.HandleClickSelection(LastFocused, NewNode: PVirtualNode; Shift: TShiftState; DragPending: Boolean); // Handles multi-selection with mouse click. begin // Ctrl key down if ssCtrlOS in Shift then begin if ssShift in Shift then begin SelectNodes(FRangeAnchor, NewNode, True); Invalidate; end else begin if not (toSiblingSelectConstraint in FOptions.SelectionOptions) then FRangeAnchor := NewNode; // Delay selection change if a drag operation is pending. // Otherwise switch selection state here. if DragPending then DoStateChange([tsToggleFocusedSelection]) else if vsSelected in NewNode.States then RemoveFromSelection(NewNode) else AddToSelection(NewNode); end; end else // Shift key down if ssShift in Shift then begin if FRangeAnchor = nil then FRangeAnchor := FRoot.FirstChild; // select node range if Assigned(FRangeAnchor) then begin SelectNodes(FRangeAnchor, NewNode, False); Invalidate; end; end else begin // any other case if not (vsSelected in NewNode.States) then begin AddToSelection(NewNode); InvalidateNode(NewNode); end; // assign new reference item FRangeAnchor := NewNode; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.HandleDrawSelection(X, Y: Integer): Boolean; // Handles multi-selection with a focus rectangle. // Result is True if something changed in selection. var OldRect, NewRect: TRect; MainColumn: TColumnIndex; MaxValue: Integer; // limits of a node and its text NodeLeft, NodeRight: Integer; // alignment and directionality CurrentBidiMode: TBidiMode; CurrentAlignment: TAlignment; begin Result := False; // Selection changes are only done if the user drew a selection rectangle large // enough to exceed the threshold. if (FRoot.TotalCount > 1) and (tsDrawSelecting in FStates) then begin // Effective handling of node selection is done by using two rectangles stored in FSelectRec. OldRect := OrderRect(FLastSelRect); NewRect := OrderRect(FNewSelRect); ClearTempCache; MainColumn := FHeader.MainColumn; // Alignment and bidi mode determine where the node text is located within a node. if MainColumn <= NoColumn then begin CurrentBidiMode := BidiMode; CurrentAlignment := Alignment; end else begin CurrentBidiMode := FHeader.FColumns[MainColumn].BidiMode; CurrentAlignment := FHeader.FColumns[MainColumn].Alignment; end; // Determine initial left border of first node (take column reordering into account). if FHeader.UseColumns then begin // The mouse coordinates don't include any horizontal scrolling hence take this also // out from the returned column position. NodeLeft := FHeader.FColumns[MainColumn].Left - FEffectiveOffsetX; NodeRight := NodeLeft + FHeader.FColumns[MainColumn].Width; end else begin NodeLeft := 0; NodeRight := ClientWidth; end; if CurrentBidiMode = bdLeftToRight then Result := CollectSelectedNodesLTR(MainColumn, NodeLeft, NodeRight, CurrentAlignment, OldRect, NewRect) else Result := CollectSelectedNodesRTL(MainColumn, NodeLeft, NodeRight, CurrentAlignment, OldRect, NewRect); end; if Result then begin // Do some housekeeping if there was a change. MaxValue := PackArray(FSelection, FSelectionCount); if MaxValue > -1 then begin FSelectionCount := MaxValue; SetLength(FSelection, FSelectionCount); end; if FTempNodeCount > 0 then begin AddToSelection(FTempNodeCache, FTempNodeCount); ClearTempCache; end; Change(nil); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.HasVisibleNextSibling(Node: PVirtualNode): Boolean; // Helper method to determine if the given node has a visible next sibling. This is needed to // draw correct tree lines. begin // Check if there is a sibling at all. Result := Assigned(Node.NextSibling); if Result then begin repeat Node := Node.NextSibling; Result := vsVisible in Node.States; until Result or (Node.NextSibling = nil); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.HasVisiblePreviousSibling(Node: PVirtualNode): Boolean; // Helper method to determine if the given node has a visible previous sibling. This is needed to // draw correct tree lines. begin // Check if there is a sibling at all. Result := Assigned(Node.PrevSibling); if Result then begin repeat Node := Node.PrevSibling; Result := vsVisible in Node.States; until Result or (Node.PrevSibling = nil); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.ImageListChange(Sender: TObject); begin if not (csDestroying in ComponentState) then Invalidate; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.InitializeFirstColumnValues(var PaintInfo: TVTPaintInfo); // Determines initial index, position and cell size of the first visible column. begin PaintInfo.Column := FHeader.FColumns.GetFirstVisibleColumn; with FHeader.FColumns, PaintInfo do begin if Column > NoColumn then begin CellRect.Right := CellRect.Left + Items[Column].Width; Position := Items[Column].Position; end else Position := 0; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.InitRootNode(OldSize: Cardinal = 0); // Reinitializes the root node. var NewSize: Cardinal; begin NewSize := TreeNodeSize + FTotalInternalDataSize; if FRoot = nil then FRoot := AllocMem(NewSize) else begin ReallocMem(FRoot, NewSize); FillChar(PAnsiChar(PAnsiChar(FRoot) + OldSize)^, NewSize - OldSize, 0); end; with FRoot^ do begin // Indication that this node is the root node. PrevSibling := FRoot; NextSibling := FRoot; Parent := Pointer(Self); States := [vsInitialized, vsExpanded, vsHasChildren, vsVisible]; TotalHeight := FDefaultNodeHeight; TotalCount := 1; TotalHeight := FDefaultNodeHeight; NodeHeight := FDefaultNodeHeight; Align := 50; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.InterruptValidation; var WasValidating: Boolean; begin DoStateChange([tsStopValidation], [tsUseCache]); {$ifdef EnableThreadSupport} // Check the worker thread existance. It might already be gone (usually on destruction of the last tree). if Assigned(WorkerThread) then begin WasValidating := (tsValidating in FStates); WorkerThread.RemoveTree(Self); if WasValidating then DoStateChange([tsValidationNeeded]); end; {$endif} end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.IsFirstVisibleChild(Parent, Node: PVirtualNode): Boolean; // Helper method to check if Node is the same as the first visible child of Parent. var Run: PVirtualNode; begin // Find first visible child. Run := Parent.FirstChild; while Assigned(Run) and not (vsVisible in Run.States) do Run := Run.NextSibling; Result := Assigned(Run) and (Run = Node); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.IsLastVisibleChild(Parent, Node: PVirtualNode): Boolean; // Helper method to check if Node is the same as the last visible child of Parent. var Run: PVirtualNode; begin // Find last visible child. Run := Parent.LastChild; while Assigned(Run) and not (vsVisible in Run.States) do Run := Run.PrevSibling; Result := Assigned(Run) and (Run = Node); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.LimitPaintingToArea(Canvas: TCanvas; ClipRect: TRect; VisibleRegion: HRGN = 0); // Limits further painting onto the given canvas to the given rectangle. // VisibleRegion is an optional region which can be used to limit drawing further. var ClipRegion: HRGN; begin // Regions expect their coordinates in device coordinates, hence we have to transform the region rectangle. LPtoDP(Canvas.Handle, ClipRect, 2); ClipRegion := CreateRectRgnIndirect(ClipRect); if VisibleRegion <> 0 then CombineRgn(ClipRegion, ClipRegion, VisibleRegion, RGN_AND); SelectClipRgn(Canvas.Handle, ClipRegion); DeleteObject(ClipRegion); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.LoadPanningCursors; begin with Screen do begin Cursors[crVT_MOVEALL]:=LoadCursorFromLazarusResource('VT_MOVEALL'); Cursors[crVT_MOVEEW]:=LoadCursorFromLazarusResource('VT_MOVEEW'); Cursors[crVT_MOVENS]:=LoadCursorFromLazarusResource('VT_MOVENS'); Cursors[crVT_MOVENW]:=LoadCursorFromLazarusResource('VT_MOVENW'); Cursors[crVT_MOVESW]:=LoadCursorFromLazarusResource('VT_MOVESW'); Cursors[crVT_MOVESE]:=LoadCursorFromLazarusResource('VT_MOVESE'); Cursors[crVT_MOVENE]:=LoadCursorFromLazarusResource('VT_MOVENE'); Cursors[crVT_MOVEW]:=LoadCursorFromLazarusResource('VT_MOVEW'); Cursors[crVT_MOVEE]:=LoadCursorFromLazarusResource('VT_MOVEE'); Cursors[crVT_MOVEN]:=LoadCursorFromLazarusResource('VT_MOVEN'); Cursors[crVT_MOVES]:=LoadCursorFromLazarusResource('VT_MOVES'); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.MakeNewNode: PVirtualNode; var Size: Cardinal; begin Size := TreeNodeSize; if not (csDesigning in ComponentState) then begin // Make sure FNodeDataSize is valid. if FNodeDataSize = -1 then ValidateNodeDataSize(FNodeDataSize); // Take record alignment into account. Inc(Size, FNodeDataSize); end; Result := AllocMem(Size + FTotalInternalDataSize); // Fill in some default values. with Result^ do begin TotalCount := 1; TotalHeight := FDefaultNodeHeight; NodeHeight := FDefaultNodeHeight; States := [vsVisible]; Align := 50; end; end; {$ifdef PACKARRAYPASCAL} function TBaseVirtualTree.PackArray(const TheArray: TNodeArray; Count: Integer): Integer; var Source, Dest: ^PVirtualNode; ConstOne: PtrInt; begin Source := Pointer(TheArray); ConstOne := 1; Result := 0; // Do the fastest scan possible to find the first entry while (Count <> 0) and {not Odd(NativeInt(Source^))} (PtrInt(Source^) and ConstOne = 0) do begin Inc(Result); Inc(Source); Dec(Count); end; if Count <> 0 then begin Dest := Source; repeat // Skip odd entries if {not Odd(NativeInt(Source^))} PtrInt(Source^) and ConstOne = 0 then begin Dest^ := Source^; Inc(Result); Inc(Dest); end; Inc(Source); // Point to the next entry Dec(Count); until Count = 0; end; end; {$else} //---------------------------------------------------------------------------------------------------------------------- {$IMPLICITEXCEPTIONS OFF} function TBaseVirtualTree.PackArray(TheArray: TNodeArray; Count: Integer): Integer; assembler; // Removes all entries from the selection array which are no longer in use. The selection array must be sorted for this // algo to work. Values which must be removed are marked with bit 0 (LSB) set. This little trick works because memory // is always allocated DWORD aligned. Since the selection array must be sorted while determining the entries to be // removed it is much more efficient to increment the entry in question instead of setting it to nil (which would break // the ordered appearance of the list). // // On enter EAX contains self reference, EDX the address to TheArray and ECX Count // The returned value is the number of remaining entries in the array, so the caller can reallocate (shorten) // the selection array if needed or -1 if nothing needs to be changed. asm PUSH EBX PUSH EDI PUSH ESI MOV ECX, EDX //fpc: count is in EDX. Move to ECX MOV ESI, [EBP+8] //fpc: TheArray is in EBP+8 MOV EDX, -1 JCXZ @@Finish // Empty list? INC EDX // init remaining entries counter MOV EDI, ESI // source and destination point to the list memory MOV EBX, 1 // use a register instead of immediate operant to check against @@PreScan: TEST [ESI], EBX // do the fastest scan possible to find the first entry // which must be removed JNZ @@DoMainLoop INC EDX ADD ESI, 4 DEC ECX JNZ @@PreScan JMP @@Finish @@DoMainLoop: MOV EDI, ESI @@MainLoop: TEST [ESI], EBX // odd entry? JNE @@Skip // yes, so skip this one MOVSD // else move the entry to new location INC EDX // count the moved entries DEC ECX JNZ @@MainLoop // do it until all entries are processed JMP @@Finish @@Skip: ADD ESI, 4 // point to the next entry DEC ECX JNZ @@MainLoop // do it until all entries are processed @@Finish: MOV EAX, EDX // prepare return value POP ESI POP EDI POP EBX end; {$IMPLICITEXCEPTIONS ON} {$endif} //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.PrepareBitmaps(NeedButtons, NeedLines: Boolean); // initializes the contents of the internal bitmaps const LineBitsDotted: array [0..8] of Word = ($55, $AA, $55, $AA, $55, $AA, $55, $AA, $55); LineBitsSolid: array [0..7] of Word = (0, 0, 0, 0, 0, 0, 0, 0); var PatternBitmap: HBITMAP; Bits: Pointer; Size: TSize; {$ifdef ThemeSupport} //Theme: HTHEME; R: TRect; const TVP_HOTGLYPH = 4; {$endif ThemeSupport} //--------------- local function -------------------------------------------- procedure FillBitmap (ABitmap: TBitmap); begin with ABitmap, Canvas do begin ABitmap.Width := Size.cx; ABitmap.Height := Size.cy; {$Ifdef ThemeSupport} if IsWinVistaOrAbove and (tsUseThemes in FStates) and (toUseExplorerTheme in FOptions.FPaintOptions) then begin if (FHeader.FMainColumn > NoColumn) and not (coParentColor in FHeader.FColumns[FHeader.FMainColumn].FOptions) then Brush.Color := FHeader.FColumns[FHeader.FMainColumn].Color else Brush.Color := Self.Brush.Color; end else begin {$EndIf ThemeSupport} MaskHandle := 0; Transparent := True; TransparentColor := clFuchsia; Brush.Color := clFuchsia; {$Ifdef ThemeSupport} end; {$EndIf ThemeSupport} FillRect(Rect(0, 0, ABitmap.Width, ABitmap.Height)); end; end; //--------------- end local function ---------------------------------------- begin Size.cx := 9; Size.cy := 9; {$ifdef ThemeSupport} //todo { if tsUseThemes in FStates then begin Theme := OpenThemeData(Handle, 'TREEVIEW'); if IsWinVistaOrAbove and (toUseExplorerTheme in FOptions.FPaintOptions) then begin R := Rect(0, 0, 100, 100); GetThemePartSize(Theme, FPlusBM.Canvas.Handle, TVP_GLYPH, GLPS_OPENED, @R, TS_TRUE, Size); end; end else Theme := 0; } {$endif ThemeSupport} if NeedButtons then begin with FMinusBM, Canvas do begin // box is always of odd size FillBitmap(FMinusBM); FillBitmap(FHotMinusBM); if not (IsWinVistaOrAbove and (tsUseThemes in FStates) and (toUseExplorerTheme in FOptions.FPaintOptions)) then begin if FButtonStyle = bsTriangle then begin Brush.Color := clBlack; Pen.Color := clBlack; Polygon([Point(0, 2), Point(8, 2), Point(4, 6)]); end else begin // Button style is rectangular. Now ButtonFillMode determines how to fill the interior. if FButtonFillMode in [fmTreeColor, fmWindowColor, fmTransparent] then begin case FButtonFillMode of fmTreeColor: Brush.Color := Self.Brush.Color; fmWindowColor: Brush.Color := clWindow; end; Pen.Color := FColors.TreeLineColor; Rectangle(0, 0, Width, Height); Pen.Color := Self.Font.Color; MoveTo(2, Width div 2); LineTo(Width - 2 , Width div 2); end else FMinusBM.LoadFromLazarusResource('VT_XPBUTTONMINUS'); FHotMinusBM.Canvas.Draw(0, 0, FMinusBM); end; end; end; with FPlusBM, Canvas do begin FillBitmap(FPlusBM); FillBitmap(FHotPlusBM); if not (IsWinVistaOrAbove and (tsUseThemes in FStates) and (toUseExplorerTheme in FOptions.FPaintOptions)) then begin if FButtonStyle = bsTriangle then begin Brush.Color := clBlack; Pen.Color := clBlack; Polygon([Point(2, 0), Point(6, 4), Point(2, 8)]); end else begin // Button style is rectangular. Now ButtonFillMode determines how to fill the interior. if FButtonFillMode in [fmTreeColor, fmWindowColor, fmTransparent] then begin case FButtonFillMode of fmTreeColor: Brush.Color := Self.Brush.Color; fmWindowColor: Brush.Color := clWindow; end; Pen.Color := FColors.TreeLineColor; Rectangle(0, 0, Width, Height); Pen.Color := Self.Font.Color; MoveTo(2, Width div 2); LineTo(Width - 2 , Width div 2); MoveTo(Width div 2, 2); LineTo(Width div 2, Width - 2); end else FPlusBM.LoadFromLazarusResource('VT_XPBUTTONPLUS'); FHotPlusBM.Canvas.Draw(0, 0, FPlusBM); end; end; end; {$ifdef ThemeSupport} //todo // Overwrite glyph images if theme is active. { if (tsUseThemes in FStates) and (Theme <> 0) then begin R := Rect(0, 0, Size.cx, Size.cy); DrawThemeBackground(Theme, FPlusBM.Canvas.Handle, TVP_GLYPH, GLPS_CLOSED, R, nil); DrawThemeBackground(Theme, FMinusBM.Canvas.Handle, TVP_GLYPH, GLPS_OPENED, R, nil); if IsWinVistaOrAbove and (toUseExplorerTheme in FOptions.FPaintOptions) then begin DrawThemeBackground(Theme, FHotPlusBM.Canvas.Handle, TVP_HOTGLYPH, GLPS_CLOSED, R, nil); DrawThemeBackground(Theme, FHotMinusBM.Canvas.Handle, TVP_HOTGLYPH, GLPS_OPENED, R, nil); end else begin FHotPlusBM.Canvas.Draw(0, 0, FPlusBM); FHotMinusBM.Canvas.Draw(0, 0, FMinusBM); end; end; } {$endif ThemeSupport} end; if NeedLines then begin if FDottedBrush <> 0 then DeleteObject(FDottedBrush); case FLineStyle of lsDotted: Bits := @LineBitsDotted; lsSolid: Bits := @LineBitsSolid; else // lsCustomStyle Bits := @LineBitsDotted; DoGetLineStyle(Bits); end; PatternBitmap := CreateBitmap(8, 8, 1, 1, Bits); FDottedBrush := CreatePatternBrush(PatternBitmap); DeleteObject(PatternBitmap); end; {$ifdef ThemeSupport} // if Theme <> 0 then // CloseThemeData(Theme); {$endif} end; //---------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetAlignment(const Value: TAlignment); begin if FAlignment <> Value then begin FAlignment := Value; if not (csLoading in ComponentState) then Invalidate; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetAnimationDuration(const Value: Cardinal); begin FAnimationDuration := Value; if FAnimationDuration = 0 then Exclude(FOptions.FAnimationOptions, toAnimatedToggle) else Include(FOptions.FAnimationOptions, toAnimatedToggle); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetBackground(const Value: TPicture); begin FBackground.Assign(Value); Invalidate; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetBackgroundOffset(const Index, Value: Integer); begin case Index of 0: if FBackgroundOffsetX <> Value then begin FBackgroundOffsetX := Value; Invalidate; end; 1: if FBackgroundOffsetY <> Value then begin FBackgroundOffsetY := Value; Invalidate; end; end; end; //---------------------------------------------------------------------------------------------------------------------- { procedure TBaseVirtualTree.SetBorderStyle(Value: TBorderStyle); begin if FBorderStyle <> Value then begin FBorderStyle := Value; RecreateWnd; end; end; } //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetBottomNode(Node: PVirtualNode); var Run: PVirtualNode; R: TRect; begin if Assigned(Node) then begin // make sure all parents of the node are expanded Run := Node.Parent; while Run <> FRoot do begin if not (vsExpanded in Run.States) then ToggleNode(Run); Run := Run.Parent; end; R := GetDisplayRect(Node, FHeader.MainColumn, True); DoSetOffsetXY(Point(FOffsetX, FOffsetY + ClientHeight - R.Top - Integer(NodeHeight[Node])), [suoRepaintScrollbars, suoUpdateNCArea]); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetBottomSpace(const Value: Cardinal); begin if FBottomSpace <> Value then begin FBottomSpace := Value; UpdateVerticalScrollbar(True); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetButtonFillMode(const Value: TVTButtonFillMode); begin if FButtonFillMode <> Value then begin FButtonFillMode := Value; if not (csLoading in ComponentState) then begin PrepareBitmaps(True, False); if HandleAllocated then Invalidate; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetButtonStyle(const Value: TVTButtonStyle); begin if FButtonStyle <> Value then begin FButtonStyle := Value; if not (csLoading in ComponentState) then begin PrepareBitmaps(True, False); if HandleAllocated then Invalidate; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetCheckImageKind(Value: TCheckImageKind); begin if FCheckImageKind <> Value then begin FCheckImageKind := Value; if toCheckSupport in FOptions.FMiscOptions then UpdateCheckImageList; if HandleAllocated and (FUpdateCount = 0) and not (csLoading in ComponentState) then InvalidateRect(Handle, nil, False); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetCheckState(Node: PVirtualNode; Value: TCheckState); begin if (Node.CheckState <> Value) and not (vsDisabled in Node.States) and DoChecking(Node, Value) then DoCheckClick(Node, Value); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetCheckType(Node: PVirtualNode; Value: TCheckType); begin if (Node.CheckType <> Value) and not (toReadOnly in FOptions.FMiscOptions) then begin Node.CheckType := Value; Node.CheckState := csUncheckedNormal; // For check boxes with tri-state check box parents we have to initialize differently. if (toAutoTriStateTracking in FOptions.FAutoOptions) and (Value in [ctCheckBox, ctTriStateCheckBox]) and (Node.Parent <> FRoot) then begin if not (vsInitialized in Node.Parent.States) then InitNode(Node.Parent); if (Node.Parent.CheckType = ctTriStateCheckBox) and (Node.Parent.CheckState in [csUncheckedNormal, csCheckedNormal]) then CheckState[Node] := Node.Parent.CheckState; end; InvalidateNode(Node); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetChildCount(Node: PVirtualNode; NewChildCount: Cardinal); // Changes a node's child structure to accomodate the new child count. This is used to add or delete // child nodes to/from the end of the node's child list. To insert or delete a specific node a separate // routine is used. var Remaining: Cardinal; Index: Cardinal; Child: PVirtualNode; Count: Integer; NewHeight: Integer; begin if not (toReadOnly in FOptions.FMiscOptions) then begin if Node = nil then Node := FRoot; if NewChildCount = 0 then DeleteChildren(Node) else begin // If nothing changed then do nothing. if NewChildCount <> Node.ChildCount then begin InterruptValidation; NewHeight := 0; if NewChildCount > Node.ChildCount then begin Remaining := NewChildCount - Node.ChildCount; Count := Remaining; // New nodes to add. if Assigned(Node.LastChild) then Index := Node.LastChild.Index + 1 else begin Index := 0; Include(Node.States, vsHasChildren); end; Node.States := Node.States - [vsAllChildrenHidden, vsHeightMeasured]; // New nodes are by default always visible, so we don't need to check the visibility. while Remaining > 0 do begin Child := MakeNewNode; Child.Index := Index; Child.PrevSibling := Node.LastChild; if Assigned(Node.LastChild) then Node.LastChild.NextSibling := Child; Child.Parent := Node; Node.LastChild := Child; if Node.FirstChild = nil then Node.FirstChild := Child; Dec(Remaining); Inc(Index); // The actual node height will later be computed once it is clear // whether this node has a variable node height or not. Inc(NewHeight, Child.NodeHeight); end; if vsExpanded in Node.States then begin AdjustTotalHeight(Node, NewHeight, True); if FullyVisible[Node] then Inc(Integer(FVisibleCount), Count); end; AdjustTotalCount(Node, Count, True); Node.ChildCount := NewChildCount; if (FUpdateCount = 0) and (toAutoSort in FOptions.FAutoOptions) and (FHeader.FSortColumn > InvalidColumn) then Sort(Node, FHeader.FSortColumn, FHeader.FSortDirection, True); InvalidateCache; end else begin // Nodes have to be deleted. Remaining := Node.ChildCount - NewChildCount; while Remaining > 0 do begin DeleteNode(Node.LastChild); Dec(Remaining); end; end; if FUpdateCount = 0 then begin ValidateCache; UpdateScrollBars(True); Invalidate; end; if Node = FRoot then StructureChange(nil, crChildAdded) else StructureChange(Node, crChildAdded); end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetClipboardFormats(const Value: TClipboardFormats); var I: Integer; begin // Add string by string instead doing an Assign or AddStrings because the list may return -1 for // invalid entries which cause trouble for the standard implementation. FClipboardFormats.Clear; for I := 0 to Value.Count - 1 do FClipboardFormats.Add(Value[I]); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetColors(const Value: TVTColors); begin FColors.Assign(Value); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetCustomCheckImages(const Value: TBitmap); begin if FCustomCheckImages <> Value then begin if Assigned(FCustomCheckImages) then begin // Reset the internal check image list reference too, if necessary. if FCheckImages = FCustomCheckImages then FCheckImages := nil; end; FCustomCheckImages := Value; // Check if currently custom check images are active. if FCheckImageKind = ckCustom then FCheckImages := Value; if not (csLoading in ComponentState) then Invalidate; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetDefaultNodeHeight(Value: Cardinal); begin if Value = 0 then Value := 18; if FDefaultNodeHeight <> Value then begin DoStateChange([tsNeedScale]); Inc(Integer(FRoot.TotalHeight), Integer(Value) - Integer(FDefaultNodeHeight)); Inc(SmallInt(FRoot.NodeHeight), Integer(Value) - Integer(FDefaultNodeHeight)); FDefaultNodeHeight := Value; InvalidateCache; if (FUpdateCount = 0) and HandleAllocated and not (csLoading in ComponentState) then begin ValidateCache; UpdateScrollBars(True); ScrollIntoView(FFocusedNode, toCenterScrollIntoView in FOptions.SelectionOptions, True); Invalidate; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetDisabled(Node: PVirtualNode; Value: Boolean); begin if Assigned(Node) and (Value xor (vsDisabled in Node.States)) then begin if Value then Include(Node.States, vsDisabled) else Exclude(Node.States, vsDisabled); if FUpdateCount = 0 then InvalidateNode(Node); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetExpanded(Node: PVirtualNode; Value: Boolean); begin if Assigned(Node) and (Node <> FRoot) and (Value xor (vsExpanded in Node.States)) then ToggleNode(Node); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetFocusedColumn(Value: TColumnIndex); begin if (FFocusedColumn <> Value) and DoFocusChanging(FFocusedNode, FFocusedNode, FFocusedColumn, Value) then begin CancelEditNode; InvalidateColumn(FFocusedColumn); InvalidateColumn(Value); FFocusedColumn := Value; if Assigned(FFocusedNode) and not (toDisableAutoscrollOnFocus in FOptions.FAutoOptions) then begin if ScrollIntoView(FFocusedNode, toCenterScrollIntoView in FOptions.SelectionOptions, not (toDisableAutoscrollHorizontal in FOptions.FAutoOptions)) then InvalidateNode(FFocusedNode); end; if Assigned(FDropTargetNode) then InvalidateNode(FDropTargetNode); DoFocusChange(FFocusedNode, FFocusedColumn); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetFocusedNode(Value: PVirtualNode); var WasDifferent: Boolean; begin WasDifferent := Value <> FFocusedNode; DoFocusNode(Value, True); // Do change event only if there was actually a change. if WasDifferent and (FFocusedNode = Value) then DoFocusChange(FFocusedNode, FFocusedColumn); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetFullyVisible(Node: PVirtualNode; Value: Boolean); // This method ensures that a node is visible and all its parent nodes are expanded and also visible // if Value is True. Otherwise the visibility flag of the node is reset but the expand state // of the parent nodes stays untouched. begin Assert(Assigned(Node) and (Node <> FRoot), 'Invalid parameter'); IsVisible[Node] := Value; if Value then begin repeat Node := Node.Parent; if Node = FRoot then Break; if not (vsExpanded in Node.States) then ToggleNode(Node); if not (vsVisible in Node.States) then IsVisible[Node] := True; until False; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetHasChildren(Node: PVirtualNode; Value: Boolean); begin if Assigned(Node) and not (toReadOnly in FOptions.FMiscOptions) then begin if Value then Include(Node.States, vsHasChildren) else begin Exclude(Node.States, vsHasChildren); DeleteChildren(Node); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetHeader(const Value: TVTHeader); begin FHeader.Assign(Value); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetImages(const Value: TCustomImageList); begin if FImages <> Value then begin if Assigned(FImages) then begin FImages.UnRegisterChanges(FImageChangeLink); FImages.RemoveFreeNotification(Self); end; FImages := Value; if Assigned(FImages) then begin FImages.RegisterChanges(FImageChangeLink); FImages.FreeNotification(Self); end; if not (csLoading in ComponentState) then Invalidate; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetIndent(Value: Cardinal); begin if FIndent <> Value then begin FIndent := Value; if not (csLoading in ComponentState) and (FUpdateCount = 0) and HandleAllocated then begin UpdateScrollBars(True); Invalidate; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetLineMode(const Value: TVTLineMode); begin if FLineMode <> Value then begin FLineMode := Value; if HandleAllocated and not (csLoading in ComponentState) then Invalidate; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetLineStyle(const Value: TVTLineStyle); begin if FLineStyle <> Value then begin FLineStyle := Value; if not (csLoading in ComponentState) then begin PrepareBitmaps(False, True); if HandleAllocated then Invalidate; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetMargin(Value: Integer); begin if FMargin <> Value then begin FMargin := Value; if HandleAllocated and not (csLoading in ComponentState) then Invalidate; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetMultiline(Node: PVirtualNode; const Value: Boolean); begin if Assigned(Node) and (Node <> FRoot) then if Value <> (vsMultiline in Node.States) then begin if Value then Include(Node.States, vsMultiline) else Exclude(Node.States, vsMultiline); if FUpdateCount = 0 then InvalidateNode(Node); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetNodeAlignment(const Value: TVTNodeAlignment); begin if FNodeAlignment <> Value then begin FNodeAlignment := Value; if HandleAllocated and not (csReading in ComponentState) then Invalidate; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetNodeDataSize(Value: Integer); var LastRootCount: Cardinal; begin if Value < -1 then Value := -1; if FNodeDataSize <> Value then begin FNodeDataSize := Value; if not (csLoading in ComponentState) and not (csDesigning in ComponentState) then begin LastRootCount := FRoot.ChildCount; Clear; SetRootNodeCount(LastRootCount); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetNodeHeight(Node: PVirtualNode; Value: Cardinal); var Difference: Integer; begin if Assigned(Node) and (Node <> FRoot) and (Node.NodeHeight <> Value) and not (toReadOnly in FOptions.FMiscOptions) then begin Difference := Integer(Value) - Integer(Node.NodeHeight); Node.NodeHeight := Value; AdjustTotalHeight(Node, Difference, True); // If an edit operation is currently active then update the editors boundaries as well. UpdateEditBounds; // Stay away from touching the node cache while it is being validated. if not (tsValidating in FStates) and FullyVisible[Node] then begin InvalidateCache; if FUpdateCount = 0 then begin ValidateCache; InvalidateToBottom(Node); UpdateScrollBars(True); end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetNodeParent(Node: PVirtualNode; const Value: PVirtualNode); begin if Assigned(Node) and Assigned(Value) and (Node.Parent <> Value) then MoveTo(Node, Value, amAddChildLast, False); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetOffsetX(const Value: Integer); begin DoSetOffsetXY(Point(Value, FOffsetY), DefaultScrollUpdateFlags); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetOffsetXY(const Value: TPoint); begin DoSetOffsetXY(Value, DefaultScrollUpdateFlags); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetOffsetY(const Value: Integer); begin DoSetOffsetXY(Point(FOffsetX, Value), DefaultScrollUpdateFlags); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetOptions(const Value: TCustomVirtualTreeOptions); begin FOptions.Assign(Value); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetRootNodeCount(Value: Cardinal); begin // Don't set the root node count until all other properties (in particular the OnInitNode event) have been set. if csLoading in ComponentState then begin FRoot.ChildCount := Value; DoStateChange([tsNeedRootCountUpdate]); end else if FRoot.ChildCount <> Value then begin BeginUpdate; InterruptValidation; SetChildCount(FRoot, Value); EndUpdate; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetScrollBarOptions(Value: TScrollBarOptions); begin FScrollBarOptions.Assign(Value); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetSearchOption(const Value: TVTIncrementalSearch); begin if FIncrementalSearch <> Value then begin FIncrementalSearch := Value; if FIncrementalSearch = isNone then begin KillTimer(Handle, SearchTimer); FSearchBuffer := ''; FLastSearchNode := nil; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetSelected(Node: PVirtualNode; Value: Boolean); begin if not FSelectionLocked and Assigned(Node) and (Node <> FRoot) and (Value xor (vsSelected in Node.States)) then begin if Value then begin if FSelectionCount = 0 then FRangeAnchor := Node else if not (toMultiSelect in FOptions.FSelectionOptions) then ClearSelection; AddToSelection(Node); // Make sure there is a valid column selected (if there are columns at all). if ((FFocusedColumn < 0) or not (coVisible in FHeader.Columns[FFocusedColumn].Options)) and (FHeader.MainColumn > NoColumn) then if ([coVisible, coAllowFocus] * FHeader.Columns[FHeader.MainColumn].Options = [coVisible, coAllowFocus]) then FFocusedColumn := FHeader.MainColumn else FFocusedColumn := FHeader.Columns.GetFirstVisibleColumn(True); if FRangeAnchor = nil then FRangeAnchor := Node; end else begin RemoveFromSelection(Node); if FSelectionCount = 0 then ResetRangeAnchor; end; if FullyVisible[Node] then InvalidateNode(Node); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetSelectionCurveRadius(const Value: Cardinal); begin if FSelectionCurveRadius <> Value then begin FSelectionCurveRadius := Value; if HandleAllocated and not (csLoading in ComponentState) then Invalidate; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetStateImages(const Value: TCustomImageList); begin if FStateImages <> Value then begin if Assigned(FStateImages) then begin FStateImages.UnRegisterChanges(FStateChangeLink); FStateImages.RemoveFreeNotification(Self); end; FStateImages := Value; if Assigned(FStateImages) then begin FStateImages.RegisterChanges(FStateChangeLink); FStateImages.FreeNotification(Self); end; if HandleAllocated and not (csLoading in ComponentState) then Invalidate; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetTextMargin(Value: Integer); begin if FTextMargin <> Value then begin FTextMargin := Value; if not (csLoading in ComponentState) then Invalidate; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetTopNode(Node: PVirtualNode); var R: TRect; Run: PVirtualNode; begin if Assigned(Node) then begin // make sure all parents of the node are expanded Run := Node.Parent; while Run <> FRoot do begin if not (vsExpanded in Run.States) then ToggleNode(Run); Run := Run.Parent; end; R := GetDisplayRect(Node, FHeader.MainColumn, True); //lclheader if hoVisible in FHeader.Options then Dec(R.Top, FHeader.Height); SetOffsetY(FOffsetY - R.Top); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetUpdateState(Updating: Boolean); begin // The check for visibility is necessary otherwise the tree is automatically shown when // updating is allowed. As this happens internally the VCL does not get notified and // still assumes the control is hidden. This results in weird "cannot focus invisible control" errors. //lcl todo if Visible and HandleAllocated and (FUpdateCount = 0) then SendMessage(Handle, WM_SETREDRAW, Ord(not Updating), 0); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetVerticalAlignment(Node: PVirtualNode; Value: Byte); begin if Value > 100 then Value := 100; if Node.Align <> Value then begin Node.Align := Value; if FullyVisible[Node] then InvalidateNode(Node); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetVisible(Node: PVirtualNode; Value: Boolean); // Sets the visibility style of the given node according to Value. var NeedUpdate: Boolean; begin Assert(Assigned(Node) and (Node <> FRoot), 'Invalid parameter.'); if Value <> (vsVisible in Node.States) then begin InterruptValidation; NeedUpdate := False; if Value then begin Include(Node.States, vsVisible); if vsExpanded in Node.Parent.States then AdjustTotalHeight(Node.Parent, Node.TotalHeight, True); if VisiblePath[Node] then begin Inc(FVisibleCount, 1 + CountVisibleChildren(Node)); NeedUpdate := True; end; // Update the hidden children flag of the parent. // Since this node is now visible we simply have to remove the flag. Exclude(Node.Parent.States, vsAllChildrenHidden); end else begin Exclude(Node.States, vsVisible); if vsExpanded in Node.Parent.States then AdjustTotalHeight(Node.Parent, -Integer(Node.TotalHeight), True); if VisiblePath[Node] then begin Dec(FVisibleCount, 1 + CountVisibleChildren(Node)); NeedUpdate := True; end; if FUpdateCount = 0 then DetermineHiddenChildrenFlag(Node.Parent) else Include(FStates, tsUpdateHiddenChildrenNeeded) end; InvalidateCache; if NeedUpdate and (FUpdateCount = 0) then begin ValidateCache; UpdateScrollBars(True); Invalidate; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetVisiblePath(Node: PVirtualNode; Value: Boolean); // If Value is True then all parent nodes of Node are expanded. begin Assert(Assigned(Node) and (Node <> FRoot), 'Invalid parameter.'); if Value then begin repeat Node := Node.Parent; if Node = FRoot then Break; if not (vsExpanded in Node.States) then ToggleNode(Node); until False; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.StaticBackground(Source: TBitmap; Target: TCanvas; const Offset: TPoint; const R: TRect); // Draws the given source graphic so that it stays static in the given rectangle which is relative to the target bitmap. // The graphic is aligned so that it always starts at the upper left corner of the target canvas. // Offset gives the position of the target window as a possible superordinated surface. const DST = $00AA0029; // Ternary Raster Operation - Destination unchanged var PicRect: TRect; AreaRect: TRect; DrawRect: TRect; begin // clear background Target.Brush.Color := Brush.Color; Target.FillRect(R); // Picture rect in relation to client viewscreen. PicRect := Rect(FBackgroundOffsetX, FBackgroundOffsetY, FBackgroundOffsetX + Source.Width, FBackgroundOffsetY + Source.Height); // Area to be draw in relation to client viewscreen. AreaRect := Rect(Offset.X + R.Left, Offset.Y + R.Top, Offset.X + R.Right, Offset.Y + R.Bottom); // If picture falls in AreaRect, return intersection (DrawRect). if IntersectRect(DrawRect, PicRect, AreaRect) then begin // Draw portion of image which falls in canvas area. if Source.Transparent then begin // Leave transparent area as destination unchanged (DST), copy non-transparent areas to canvas (SRCCOPY). with DrawRect do MaskBlt(Target.Handle, Left - Offset.X, Top - Offset.Y, (Right - Offset.X) - (Left - Offset.X), (Bottom - Offset.Y) - (Top - Offset.Y), Source.Canvas.Handle, Left - PicRect.Left, DrawRect.Top - PicRect.Top, Source.MaskHandle, Left - PicRect.Left, Top - PicRect.Top, MakeROP4(DST, SRCCOPY)); end else begin // copy image to destination with DrawRect do BitBlt(Target.Handle, Left - Offset.X, Top - Offset.Y, (Right - Offset.X) - (Left - Offset.X), (Bottom - Offset.Y) - (Top - Offset.Y) + R.Top, Source.Canvas.Handle, Left - PicRect.Left, DrawRect.Top - PicRect.Top, SRCCOPY); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.TileBackground(Source: TBitmap; Target: TCanvas; const Offset: TPoint; R: TRect); // Draws the given source graphic so that it tiles into the given rectangle which is relative to the target bitmap. // The graphic is aligned so that it always starts at the upper left corner of the target canvas. // Offset gives the position of the target window in an possible superordinated surface. var SourceX, SourceY, TargetX, DeltaY: Integer; begin with Target do begin SourceY := (R.Top + Offset.Y + FBackgroundOffsetY) mod Source.Height; // Always wrap the source coordinates into positive range. if SourceY < 0 then SourceY := Source.Height + SourceY; // Tile image vertically until target rect is filled. while R.Top < R.Bottom do begin SourceX := (R.Left + Offset.X + FBackgroundOffsetX) mod Source.Width; // always wrap the source coordinates into positive range if SourceX < 0 then SourceX := Source.Width + SourceX; TargetX := R.Left; // height of strip to draw DeltaY := Min(R.Bottom - R.Top, Source.Height - SourceY); // tile the image horizontally while TargetX < R.Right do begin BitBlt(Handle, TargetX, R.Top, Min(R.Right - TargetX, Source.Width - SourceX), DeltaY, Source.Canvas.Handle, SourceX, SourceY, SRCCOPY); Inc(TargetX, Source.Width - SourceX); SourceX := 0; end; Inc(R.Top, Source.Height - SourceY); SourceY := 0; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.ToggleCallback(Step, StepSize: Integer; Data: Pointer): Boolean; var Column: TColumnIndex; Run: TRect; SecondaryStepSize: Integer; //--------------- local functions ------------------------------------------- procedure EraseLine; var LocalBrush: HBRUSH; begin with TToggleAnimationData(Data^), FHeader.FColumns do begin // Iterate through all columns and erase background in their local color. // LocalBrush is a brush in the color of the particular column. Column := GetFirstVisibleColumn; while (Column > InvalidColumn) and (Run.Left < ClientWidth) do begin GetColumnBounds(Column, Run.Left, Run.Right); if coParentColor in Items[Column].FOptions then FillRect(DC, Run, Brush) else begin LocalBrush := CreateSolidBrush(ColorToRGB(Items[Column].Color)); FillRect(DC, Run, LocalBrush); DeleteObject(LocalBrush); end; Column := GetNextVisibleColumn(Column); end; end; end; //--------------------------------------------------------------------------- procedure DoScrollUp(DC: HDC; Brush: HBRUSH; Area: TRect; Steps: Integer); begin {$ifndef INCOMPLETE_WINAPI} ScrollDC(DC, 0, -Steps, Area, Area, 0, nil); {$endif} if Step = 0 then if not FHeader.UseColumns then FillRect(DC, Rect(Area.Left, Area.Bottom - Steps - 1, Area.Right, Area.Bottom), Brush) else begin Run := Rect(Area.Left, Area.Bottom - Steps - 1, Area.Right, Area.Bottom); EraseLine; end; end; //--------------------------------------------------------------------------- procedure DoScrollDown(DC: HDC; Brush: HBRUSH; Area: TRect; Steps: Integer); begin {$ifndef INCOMPLETE_WINAPI} ScrollDC(DC, 0, Steps, Area, Area, 0, nil); {$endif} if Step = 0 then if not FHeader.UseColumns then FillRect(DC, Rect(Area.Left, Area.Top, Area.Right, Area.Top + Steps + 1), Brush) else begin Run := Rect(Area.Left, Area.Top, Area.Right, Area.Top + Steps + 1); EraseLine; end; end; //--------------- end local functions --------------------------------------- begin Result := True; if StepSize > 0 then begin SecondaryStepSize := 0; with TToggleAnimationData(Data^) do begin if Mode1 <> tamNoScroll then begin if Mode1 = tamScrollUp then DoScrollUp(DC, Brush, R1, StepSize) else DoScrollDown(DC, Brush, R1, StepSize); if (Mode2 <> tamNoScroll) and (ScaleFactor > 0) then begin // As this routine is able to scroll two independent areas at once, the missing StepSize is // computed in that case. To ensure the maximal accuracy the rounding error is accumulated. SecondaryStepSize := Round((StepSize + MissedSteps) * ScaleFactor); MissedSteps := MissedSteps + StepSize * ScaleFactor - SecondaryStepSize; end; end else SecondaryStepSize := StepSize; if Mode2 <> tamNoScroll then if Mode2 = tamScrollUp then DoScrollUp(DC, Brush, R2, SecondaryStepSize) else DoScrollDown(DC, Brush, R2, SecondaryStepSize); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.CMColorChange(var Message: TLMessage); begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'CMColorChange');{$endif} if not (csLoading in ComponentState) then begin PrepareBitmaps(True, False); if HandleAllocated then Invalidate; end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'CMColorChange');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.CMBiDiModeChanged(var Message: TLMessage); begin inherited; if UseRightToLeftAlignment then FEffectiveOffsetX := Integer(FRangeX) - ClientWidth + FOffsetX else FEffectiveOffsetX := -FOffsetX; if FEffectiveOffsetX < 0 then FEffectiveOffsetX := 0; if toAutoBidiColumnOrdering in FOptions.FAutoOptions then FHeader.FColumns.ReorderColumns(UseRightToLeftAlignment); FHeader.Invalidate(nil); {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'FEffectiveOffsetX after CMBidiModeChanged',FEffectiveOffsetX);{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.CMDenySubclassing(var Message: TLMessage); // If a Windows XP Theme Manager component is used in the application it will try to subclass all controls which do not // explicitly deny this. Virtual Treeview knows how to handle XP themes so it does not need subclassing. begin Message.Result := 1; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoDragMsg(ADragMessage: TDragMessage; APosition: TPoint; ADragObject: TDragObject; ATarget: TControl; ADocking: Boolean): LRESULT; var S: TObject; KeyState: LongWord; P: TPoint; Formats: TFormatArray; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcDrag],'DoDragMsg');{$endif} S := ADragObject; Formats := nil; // Let the ancestor handle dock operations. if S is TDragDockObject then inherited else begin // We need an extra check for the control drag object as there might be other objects not derived from // this class (e.g. TActionDragObject). if not (tsUserDragObject in FStates) and (S is TDragControlObject) then S := (S as TDragControlObject).Control; case ADragMessage of dmDragEnter, dmDragLeave, dmDragMove: begin if ADragMessage = dmDragEnter then DoStateChange([tsVCLDragging]); if ADragMessage = dmDragLeave then DoStateChange([], [tsVCLDragging]); if ADragMessage = dmDragMove then with ScreenToClient(APosition) do DoAutoScroll(X, Y); KeyState := 0; // Alt key will be queried by the KeysToShiftState function in DragOver. if GetKeyState(VK_SHIFT) < 0 then KeyState := KeyState or MK_SHIFT; if GetKeyState(VK_CONTROL) < 0 then KeyState := KeyState or MK_CONTROL; // Allowed drop effects are simulated for VCL dd. FVCLDragEffect := DROPEFFECT_MOVE or DROPEFFECT_COPY; DragOver(S, KeyState, TDragState(ADragMessage), APosition, FVCLDragEffect); Result := LRESULT(FVCLDragEffect); FLastVCLDragTarget := FDropTargetNode; if (ADragMessage = dmDragLeave) and Assigned(FDropTargetNode) then begin InvalidateNode(FDropTargetNode); FDropTargetNode := nil; end; end; dmDragDrop: begin KeyState := 0; // Alt key will be queried by the KeysToShiftState function in DragOver if GetKeyState(VK_SHIFT) < 0 then KeyState := KeyState or MK_SHIFT; if GetKeyState(VK_CONTROL) < 0 then KeyState := KeyState or MK_CONTROL; // allowed drop effects are simulated for VCL dd, // replace target node with cached node from other VCL dd messages if Assigned(FDropTargetNode) then InvalidateNode(FDropTargetNode); FDropTargetNode := FLastVCLDragTarget; P := ScreenToClient(APosition); DoDragDrop(S, nil, Formats, KeysToShiftState(KeyState), P, FVCLDragEffect, FLastDropMode); if Assigned(FDropTargetNode) then begin InvalidateNode(FDropTargetNode); FDropTargetNode := nil; end; end; dmFindTarget: begin Result := LRESULT(ControlAtPos(ScreenToClient(APosition), False)); if Result = 0 then Result := LRESULT(Self); // This is a reliable place to check whether VCL drag has // really begun. if tsVCLDragPending in FStates then DoStateChange([tsVCLDragging], [tsVCLDragPending, tsEditPending, tsClearPending]); end; end; end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcDrag],'DoDragMsg');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.CMFontChanged(var Message: TLMessage); var HeaderMessage: TLMessage; begin inherited; if not (csLoading in ComponentState) then PrepareBitmaps(True, False); HeaderMessage.Msg := CM_PARENTFONTCHANGED; HeaderMessage.WParam := 0; HeaderMessage.LParam := 0; HeaderMessage.Result := 0; FHeader.HandleMessage(HeaderMessage); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.CMHintShow(var Message: TCMHintShow); // Determines hint message (tooltip) and out-of-hint rect. // Note: A special handling is needed here because we cannot pass wide strings back to the caller. // I had to introduce the hint data record anyway so we can use this to pass the hint string. // We still need to set a dummy hint string in the message to make the VCL showing the hint window. var NodeRect: TRect; SpanColumn, Dummy, ColLeft, ColRight: Integer; HitInfo: THitInfo; ShowOwnHint: Boolean; IsFocusedOrEditing: Boolean; ParentForm: TCustomForm; BottomRightCellContentMargin: TPoint; LineBreakStyle: TVTTooltipLineBreakStyle; begin with Message do begin Result := 1; if PtInRect(FLastHintRect, HintInfo.CursorPos) then Exit; // Determine node for which to show hint/tooltip. with HintInfo^ do GetHitTestInfoAt(CursorPos.X, CursorPos.Y, True, HitInfo); // Make sure a hint is only shown if the tree or at least its parent form is active. // Active editing is ok too as long as we don't want the hint for the current edit node. if IsEditing then IsFocusedOrEditing := HitInfo.HitNode <> FFocusedNode else begin IsFocusedOrEditing := Focused; ParentForm := GetParentForm(Self); if Assigned(ParentForm) then IsFocusedOrEditing := ParentForm.Focused or Application.Active; end; if (GetCapture = 0) and ShowHint and not (Dragging or IsMouseSelecting) and ([tsScrolling] * FStates = []) and (FHeader.States = []) and IsFocusedOrEditing then begin with HintInfo^ do begin Result := 0; ShowOwnHint := False; // First check whether there is a header hint to show. if FHeader.UseColumns and (hoShowHint in FHeader.FOptions) and FHeader.InHeader(CursorPos) then begin CursorRect := FHeaderRect; // Convert the cursor rectangle into real client coordinates. OffsetRect(CursorRect, 0, -Integer(FHeader.FHeight)); HitInfo.HitColumn := FHeader.FColumns.GetColumnAndBounds(CursorPos, CursorRect.Left, CursorRect.Right); // align the vertical hint position on the bottom bound of the header, but // avoid overlapping of mouse cursor and hint HintPos.Y := Max(HintPos.Y, ClientToScreen(Point(0, CursorRect.Bottom)).Y); // Note: the test for the left mouse button in ControlState might cause problems whenever the VCL does not // realize when the button is released. This, for instance, happens when doing OLE drag'n drop and // cancel this with ESC. if (HitInfo.HitColumn > -1) and not (csLButtonDown in ControlState) then begin FHintData.DefaultHint := FHeader.FColumns[HitInfo.HitColumn].FHint; if FHintData.DefaultHint <> '' then ShowOwnHint := True else Result := 1; end else Result := 1; end else begin // Default mode is handled as would the tree be a usual VCL control (no own hint window necessary). if FHintMode = hmDefault then HintStr := GetShortHint(Hint) else begin if Assigned(HitInfo.HitNode) and (HitInfo.HitColumn > InvalidColumn) then begin // A draw tree should only display a hint when at least its OnGetHintSize // event handler is assigned. if Self is TCustomVirtualDrawTree then begin FHintData.HintRect := Rect(0, 0, 0, 0); with Self as TCustomVirtualDrawTree do DoGetHintSize(HitInfo.HitNode, HitInfo.HitColumn, FHintData.HintRect); ShowOwnHint := not IsRectEmpty(FHintData.HintRect); end else // For string trees a decision about showing the hint or not is based // on the hint string (if it is empty then no hint is shown). ShowOwnHint := True; if ShowOwnHint then begin if HitInfo.HitColumn > NoColumn then begin FHeader.FColumns.GetColumnBounds(HitInfo.HitColumn, ColLeft, ColRight); // The right column border might be extended if column spanning is enabled. if toAutoSpanColumns in FOptions.FAutoOptions then begin SpanColumn := HitInfo.HitColumn; repeat Dummy := FHeader.FColumns.GetNextVisibleColumn(SpanColumn); if (Dummy = InvalidColumn) or not ColumnIsEmpty(HitInfo.HitNode, Dummy) then Break; SpanColumn := Dummy; until False; if SpanColumn <> HitInfo.HitColumn then FHeader.FColumns.GetColumnBounds(SpanColumn, Dummy, ColRight); end; end else begin ColLeft := 0; ColRight := ClientWidth; end; FHintData.DefaultHint := ''; if FHintMode <> hmTooltip then begin // Node specific hint text. CursorRect := GetDisplayRect(HitInfo.HitNode, HitInfo.HitColumn, False); CursorRect.Left := ColLeft; CursorRect.Right := ColRight; // Align the vertical hint position on the bottom bound of the node, but // avoid overlapping of mouse cursor and hint. HintPos.Y := Max(HintPos.Y, ClientToScreen(CursorRect.BottomRight).Y) + 2; end else begin // Tool tip to show. This means the full caption of the node must be displayed. if vsMultiline in HitInfo.HitNode.States then begin if hiOnItemLabel in HitInfo.HitPositions then begin ShowOwnHint := True; NodeRect := GetDisplayRect(HitInfo.HitNode, HitInfo.HitColumn, True, False); end; end else begin NodeRect := GetDisplayRect(HitInfo.HitNode, HitInfo.HitColumn, True, True, True); BottomRightCellContentMargin := DoGetCellContentMargin(HitInfo.HitNode, HitInfo.HitColumn, ccmtBottomRightOnly); ShowOwnHint := (HitInfo.HitColumn > InvalidColumn) and PtInRect(NodeRect, CursorPos) and (CursorPos.X <= ColRight) and (CursorPos.X >= ColLeft) and ( // Show hint also if the node text is partially out of the client area. // "ColRight - 1", since the right column border is not part of this cell. ( (NodeRect.Right + BottomRightCellContentMargin.X) > Min(ColRight - 1, ClientWidth) ) or (NodeRect.Left < Max(ColLeft, 0)) or ( (NodeRect.Bottom + BottomRightCellContentMargin.Y) > ClientHeight ) or (NodeRect.Top < 0) ); end; if ShowOwnHint then begin // Node specific hint text given will be retrieved when needed. FHintData.DefaultHint := ''; HintPos := ClientToScreen(Point(NodeRect.Left, NodeRect.Top)); CursorRect := NodeRect; end else // nothing to show Result := 1; end; end else Result := 1; // Avoid hint if this is a draw tree returning an empty hint rectangle. end else begin // No node so fall back to control's hint (if indicated) or show nothing. if FHintMode = hmHintAndDefault then HintStr := GetShortHint(Hint) else Result := 1; end; end; end; {$ifdef DEBUG_VTV}Logger.Send([lcHint], 'ShowOwnHint: %s Result: %d', [BoolToStr(ShowOwnHint, True), Result]);{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcHint], 'CursorRect', CursorRect);{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcHint], 'CursorPos', CursorPos);{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcHint], 'HintMaxWidth', HintMaxWidth);{$endif} // If hint must be show and is not the control's hint then get the hint // from the node or from the DefaultHint if ShowOwnHint and (Result = 0) then begin LineBreakStyle := hlbDefault; FLastHintRect := CursorRect; if Length(FHintData.DefaultHint) > 0 then HintStr := FHintData.DefaultHint else if FHintMode = hmToolTip then HintStr := DoGetNodeToolTip(HitInfo.HitNode, HitInfo.HitColumn, LineBreakStyle) else HintStr := DoGetNodeHint(HitInfo.HitNode, HitInfo.HitColumn, LineBreakStyle); // Determine actual line break style depending on what was returned by the methods and what's in the node. if (LineBreakStyle = hlbDefault) and Assigned(HitInfo.HitNode) and (vsMultiline in HitInfo.HitNode.States) then LineBreakStyle := hlbForceMultiLine; if LineBreakStyle = hlbForceMultiLine then begin // NodeRect is already calculated for ToolTip if FHintMode <> hmTooltip then NodeRect := GetDisplayRect(HitInfo.HitNode, HitInfo.HitColumn, True, False); HintMaxWidth := NodeRect.Right - NodeRect.Left; end; HintWindowClass := GetHintWindowClass; FHintData.Tree := Self; FHintData.Column := HitInfo.HitColumn; FHintData.Node := HitInfo.HitNode; FHintData.HintInfo := HintInfo; HintData := @FHintData; end else FLastHintRect := Rect(0, 0, 0, 0); end; // Remind that a hint is about to show. if Result = 0 then DoStateChange([tsHint]) else DoStateChange([], [tsHint]); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.CMMouseLeave(var Message: TLMessage); var LeaveStates: TVirtualTreeStates; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'CMMouseLeave');{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcMessages],'FCurrentHotNode',hexStr(FCurrentHotNode));{$endif} // Reset the last used hint rectangle in case the mouse enters the window within the bounds if Assigned(FHintData.Tree) then FHintData.Tree.FLastHintRect := Rect(0, 0, 0, 0); LeaveStates := [tsHint]; if [tsWheelPanning, tsWheelScrolling] * FStates = [] then begin if HandleAllocated then KillTimer(Handle, ScrollTimer); LeaveStates := LeaveStates + [tsScrollPending, tsScrolling]; end; DoStateChange([], LeaveStates); if Assigned(FCurrentHotNode) then begin DoHotChange(FCurrentHotNode, nil); if (toHotTrack in FOptions.PaintOptions) or (toCheckSupport in FOptions.FMiscOptions) then InvalidateNode(FCurrentHotNode); FCurrentHotNode := nil; end; Header.FColumns.FDownIndex := NoColumn; Header.FColumns.FHoverIndex := NoColumn; inherited CMMouseLeave(Message); {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'CMMouseLeave');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.CMMouseWheel(var Message: TLMMouseEvent); var ScrollAmount: Integer; ScrollLines: DWORD; RTLFactor: Integer; WheelFactor: Double; begin //todo: rename to WM* {$ifdef DEBUG_VTV}Logger.EnterMethod([lcScroll],'CMMouseWheel');{$endif} StopWheelPanning; inherited WMMouseWheel(Message); if Message.Result = 0 then begin with Message do begin Result := 1; WheelFactor := WheelDelta / WHEEL_DELTA; if (FRangeY > Cardinal(ClientHeight)) and (not (ssShift in State)) then begin {$ifdef DEBUG_VTV}Logger.Send([lcScroll],'Scroll Vertical - WheelDelta', WheelDelta);{$endif} // Scroll vertically if there's something to scroll... if ssCtrlOS in State then ScrollAmount := Trunc(WheelFactor * ClientHeight) else begin SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, @ScrollLines, 0); if ScrollLines = WHEEL_PAGESCROLL then ScrollAmount := Integer(Trunc(WheelFactor * ClientHeight)) else ScrollAmount := Integer(Trunc(WheelFactor * ScrollLines * FDefaultNodeHeight)); end; SetOffsetY(FOffsetY + ScrollAmount); end else begin // ...else scroll horizontally if there's something to scroll. if UseRightToLeftAlignment then RTLFactor := -1 else RTLFactor := 1; if ssCtrlOS in State then ScrollAmount := Trunc(WheelFactor * (ClientWidth - FHeader.Columns.GetVisibleFixedWidth)) else begin SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, @ScrollLines, 0); ScrollAmount := Trunc(WheelFactor * ScrollLines * FHeader.Columns.GetScrollWidth); end; SetOffsetX(FOffsetX + RTLFactor * ScrollAmount); end; end; end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcScroll],'CMMouseWheel');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- {$ifdef EnableNativeTVM} procedure TBaseVirtualTree.TVMGetItem(var Message: TLMessage); // Screen reader support function. The method returns information about a particular node. const StateMask = TVIS_STATEIMAGEMASK or TVIS_OVERLAYMASK or TVIS_EXPANDED or TVIS_DROPHILITED or TVIS_CUT or TVIS_SELECTED or TVIS_FOCUSED; var Item: PTVItemEx; Node: PVirtualNode; Ghosted: Boolean; ImageIndex: Integer; R: TRect; Text: String; {$ifndef UNICODE} ANSIText: ANSIString; {$endif} begin // We can only return valid data if a nodes reference is given. Item := Pointer(Message.LParam); Message.Result := Ord(((Item.mask and TVIF_HANDLE) <> 0) and Assigned(Item.hItem)); if Message.Result = 1 then begin Node := Pointer(Item.hItem); // Child count requested? if (Item.mask and TVIF_CHILDREN) <> 0 then Item.cChildren := Node.ChildCount; // Index for normal image requested? if (Item.mask and TVIF_IMAGE) <> 0 then begin Item.iImage := -1; DoGetImageIndex(Node, ikNormal, -1, Ghosted, Item.iImage); end; // Index for selected image requested? if (Item.mask and TVIF_SELECTEDIMAGE) <> 0 then begin Item.iSelectedImage := -1; DoGetImageIndex(Node, ikSelected, -1, Ghosted, Item.iSelectedImage); end; // State info requested? if (Item.mask and TVIF_STATE) <> 0 then begin // Everything, which is possible is returned. Item.stateMask := StateMask; Item.state := 0; if Node = FFocusedNode then Item.state := Item.state or TVIS_FOCUSED; if vsSelected in Node.States then Item.state := Item.state or TVIS_SELECTED; if vsCutOrCopy in Node.States then Item.state := Item.state or TVIS_CUT; if Node = FDropTargetNode then Item.state := Item.state or TVIS_DROPHILITED; if vsExpanded in Node.States then Item.state := Item.state or TVIS_EXPANDED; // Construct state image and overlay image indices. They are one based, btw. // and zero means there is no image. ImageIndex := -1; DoGetImageIndex(Node, ikState, -1, Ghosted, ImageIndex); Item.state := Item.state or Byte(IndexToStateImageMask(ImageIndex + 1)); ImageIndex := -1; DoGetImageIndex(Node, ikOverlay, -1, Ghosted, ImageIndex); Item.state := Item.state or Byte(IndexToOverlayMask(ImageIndex + 1)); end; // Node caption requested? if (Item.mask and TVIF_TEXT) <> 0 then begin GetTextInfo(Node, -1, Font, R, Text); {$ifdef UNICODE} StrLCopy(Item.pszText, PChar(Text), Item.cchTextMax - 1); Item.pszText[Length(Text)] := #0; {$else} // Convert the Unicode implicitely to ANSI using the current locale. ANSIText := Text; StrLCopy(Item.pszText, PChar(ANSIText), Item.cchTextMax - 1); Item.pszText[Length(ANSIText)] := #0; {$endif} end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.TVMGetItemRect(var Message: TLMessage); // Screen read support function. This method returns a node's display rectangle. var TextOnly: Boolean; Node: PVirtualNode; begin // The lparam member is used two-way. On enter it contains a pointer to the item (node). // On exit it is to be considered as pointer to a rectangle structure. Node := Pointer(Pointer(Message.LParam)^); Message.Result := Ord(IsVisible[Node]); if Message.Result <> 0 then begin TextOnly := Message.WParam <> 0; PRect(Message.LParam)^ := GetDisplayRect(Node, -1, TextOnly); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.TVMGetNextItem(var Message: TLMessage); // Screen read support function. This method returns a node depending on the requested case. var Node: PVirtualNode; begin // Start with a nil result. Message.Result := 0; Node := Pointer(Message.LParam); case Message.WParam of TVGN_CARET: Message.Result := Integer(FFocusedNode); TVGN_CHILD: if Assigned(Node) then Message.Result := Integer(GetFirstChild(Node)); TVGN_DROPHILITE: Message.Result := Integer(FDropTargetNode); TVGN_FIRSTVISIBLE: Message.Result := Integer(GetFirstVisible(nil, True)); TVGN_LASTVISIBLE: Message.Result := Integer(GetLastVisible(nil, True)); TVGN_NEXT: if Assigned(Node) then Message.Result := Integer(GetNextSibling(Node)); TVGN_NEXTVISIBLE: if Assigned(Node) then Message.Result := Integer(GetNextVisible(Node, True)); TVGN_PARENT: if Assigned(Node) and (Node <> FRoot) and (Node.Parent <> FRoot) then Message.Result := Integer(Node.Parent); TVGN_PREVIOUS: if Assigned(Node) then Message.Result := Integer(GetPreviousSibling(Node)); TVGN_PREVIOUSVISIBLE: if Assigned(Node) then Message.Result := Integer(GetPreviousVisible(Node, True)); TVGN_ROOT: Message.Result := Integer(GetFirst); end; end; {$endif} //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMCancelMode(var Message: TLMNoParams); begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMCancelMode');{$endif} // Clear any transient state. KillTimer(Handle, ExpandTimer); KillTimer(Handle, EditTimer); KillTimer(Handle, ScrollTimer); KillTimer(Handle, SearchTimer); FSearchBuffer := ''; FLastSearchNode := nil; DoStateChange([], [tsClearPending, tsEditPending, tsOLEDragPending, tsVCLDragPending, tsDrawSelecting, tsDrawSelPending, tsIncrementalSearching]); //lcl does not has a inherited procedure //inherited WMCancelMode(Message); {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMCancelMode');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMChangeState(var Message: TLMessage); var EnterStates, LeaveStates: TVirtualTreeStates; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMChangeState');{$endif} EnterStates := []; if csStopValidation in TChangeStates(Byte(Message.WParam)) then Include(EnterStates, tsStopValidation); if csUseCache in TChangeStates(Byte(Message.WParam)) then Include(EnterStates, tsUseCache); if csValidating in TChangeStates(Byte(Message.WParam)) then Include(EnterStates, tsValidating); if csValidationNeeded in TChangeStates(Byte(Message.WParam)) then Include(EnterStates, tsValidationNeeded); LeaveStates := []; if csStopValidation in TChangeStates(Byte(Message.LParam)) then Include(LeaveStates, tsStopValidation); if csUseCache in TChangeStates(Byte(Message.LParam)) then Include(LeaveStates, tsUseCache); if csValidating in TChangeStates(Byte(Message.LParam)) then Include(LeaveStates, tsValidating); if csValidationNeeded in TChangeStates(Byte(Message.LParam)) then Include(LeaveStates, tsValidationNeeded); DoStateChange(EnterStates, LeaveStates); {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMChangeState');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMChar(var Message: TLMChar); begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMChar');{$endif} if tsIncrementalSearchPending in FStates then begin HandleIncrementalSearch(Message.CharCode); DoStateChange([], [tsIncrementalSearchPending]); end; inherited WMChar(Message); {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMChar');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMContextMenu(var Message: TLMContextMenu); // This method is called when a popup menu is about to be displayed. // We have to cancel some pending states here to avoid interferences. //lcl: handle mouse up here because MouseUp is not called when popup is show var HitInfo: THitInfo; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMContextMenu');{$endif} DoStateChange([], [tsClearPending, tsEditPending, tsOLEDragPending, tsVCLDragPending]); {$ifdef ContextMenuBeforeMouseUp} if Assigned(PopupMenu) then begin if FHeader.FStates = [] then begin Application.CancelHint; if IsMouseSelecting then begin // Reset selection state already here, before the inherited handler opens the default menu. DoStateChange([], [tsDrawSelecting, tsDrawSelPending]); Invalidate; end; inherited WMContextMenu(Message); if (toRightClickSelect in FOptions.FSelectionOptions) then begin // get information about the hit GetHitTestInfoAt(Message.XPos, Message.YPos, True, HitInfo); HandleMouseUp(0, HitInfo); end; end; end else inherited WMContextMenu(Message); {$else} if not (tsPopupMenuShown in FStates) then inherited WMContextMenu(Message); {$endif} {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMContextMenu');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMCopy(var Message: TLMNoParams); begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMCopy');{$endif} CopyToClipboard; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMCopy');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMCut(var Message: TLMNoParams); begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMCut');{$endif} CutToClipboard; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMCut');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMEnable(var Message: TLMNoParams); begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMEnable');{$endif} //LCL does not has inherited WMEnable //inherited WMEnable(Message); RedrawWindow(Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE or RDW_NOERASE or RDW_NOCHILDREN); {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMEnable');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMEraseBkgnd(var Message: TLMEraseBkgnd); begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcEraseBkgnd],'WMEraseBkgnd');{$endif} Message.Result := 1; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcEraseBkgnd],'WMEraseBkgnd');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMGetDlgCode(var Message: TLMNoParams); begin {$ifdef DEBUG_VTV}Logger.Send([lcMessages],'WMGetDlgCode');{$endif} Message.Result := DLGC_WANTCHARS or DLGC_WANTARROWS; if FWantTabs then Message.Result := Message.Result or DLGC_WANTTAB; end; //---------------------------------------------------------------------------------------------------------------------- {$ifdef EnableAccessible} procedure TBaseVirtualTree.WMGetObject(var Message: TLMessage); begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMGetObject');{$endif} if GetAccessibilityFactory <> nil then begin // Create the IAccessibles for the tree view and tree view items, if necessary. if FAccessible = nil then FAccessible := GetAccessibilityFactory.CreateIAccessible(Self); if FAccessibleItem = nil then FAccessibleItem := GetAccessibilityFactory.CreateIAccessible(Self); if Cardinal(Message.LParam) = OBJID_CLIENT then if Assigned(Accessible) then Message.Result := LresultFromObject(IID_IAccessible, Message.WParam, FAccessible) else Message.Result := 0; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMGetObject');{$endif} end; {$endif} //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMHScroll(var Message: TLMHScroll); //--------------- local functions ------------------------------------------- function GetRealScrollPosition: Integer; var SI: TScrollInfo; Code: Integer; begin SI.cbSize := SizeOf(TScrollInfo); SI.fMask := SIF_TRACKPOS; Code := SB_HORZ; {$ifdef UseFlatScrollbars} FlatSB_GetScrollInfo(Handle, Code, SI); {$else} GetScrollInfo(Handle, Code, SI); {$endif UseFlatScrollbars} Result := SI.nTrackPos; end; //--------------- end local functions --------------------------------------- var RTLFactor: Integer; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMHScroll');{$endif} if UseRightToLeftAlignment then RTLFactor := -1 else RTLFactor := 1; case Message.ScrollCode of SB_BOTTOM: SetOffsetX(-Integer(FRangeX)); SB_ENDSCROLL: begin DoStateChange([], [tsThumbTracking]); // avoiding to adjust the vertical scroll position while tracking makes it much smoother // but we need to adjust the final position here then UpdateHorizontalScrollBar(False); end; SB_LINELEFT: SetOffsetX(FOffsetX + RTLFactor * FScrollBarOptions.FIncrementX); SB_LINERIGHT: SetOffsetX(FOffsetX - RTLFactor * FScrollBarOptions.FIncrementX); SB_PAGELEFT: SetOffsetX(FOffsetX + RTLFactor * (ClientWidth - FHeader.Columns.GetVisibleFixedWidth)); SB_PAGERIGHT: SetOffsetX(FOffsetX - RTLFactor * (ClientWidth - FHeader.Columns.GetVisibleFixedWidth)); SB_THUMBPOSITION, SB_THUMBTRACK: begin DoStateChange([tsThumbTracking]); {$if DEFINED(LCLQt) OR DEFINED(LCLCarbon)} if UseRightToLeftAlignment then SetOffsetX(-Integer(FRangeX) + ClientWidth + Message.Pos) else SetOffsetX(-Message.Pos); {$else} if UseRightToLeftAlignment then SetOffsetX(-Integer(FRangeX) + ClientWidth + GetRealScrollPosition) else SetOffsetX(-GetRealScrollPosition); {$endif} end; SB_TOP: SetOffsetX(0); end; Message.Result := 0; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMHScroll');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMKeyDown(var Message: TLMKeyDown); // Keyboard event handling for node focus, selection, node specific popup menus and help invokation. // For a detailed description of every action done here read the help. var Shift: TShiftState; Node, Temp, LastFocused: PVirtualNode; Offset: Integer; ClearPending, NeedInvalidate, DoRangeSelect, HandleMultiSelect: Boolean; Context: Integer; ParentControl: TWinControl; R: TRect; NewCheckState: TCheckState; TempColumn, NewColumn: TColumnIndex; ActAsGrid: Boolean; ForceSelection: Boolean; NewWidth, NewHeight: Integer; RTLFactor: Integer; // for tabulator handling GetStartColumn: function(ConsiderAllowFocus: Boolean = False): TColumnIndex of object; GetNextColumn: function(Column: TColumnIndex; ConsiderAllowFocus: Boolean = False): TColumnIndex of object; GetNextNode: TGetNextNodeProc; KeyState: TKeyboardState; Buffer: array[0..1] of Char; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMKeyDown');{$endif} // Make form key preview work and let application modify the key if it wants this. inherited WMKeyDown(Message); with Message do begin Shift := KeyDataToShiftState(KeyData); // Ask the application if the default key handling is desired. if DoKeyAction(CharCode, Shift) then begin if (tsKeyCheckPending in FStates) and (CharCode <> VK_SPACE) then begin DoStateChange([], [tskeyCheckPending]); FCheckNode.CheckState := UnpressedState[FCheckNode.CheckState]; RepaintNode(FCheckNode); FCheckNode := nil; end; if CharCode in [VK_HOME, VK_END, VK_PRIOR, VK_NEXT, VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_BACK, VK_TAB] then begin HandleMultiSelect := (ssShift in Shift) and (toMultiSelect in FOptions.FSelectionOptions) and not IsEditing; // Flag to avoid range selection in case of single node advance. DoRangeSelect := (CharCode in [VK_HOME, VK_END, VK_PRIOR, VK_NEXT]) and HandleMultiSelect and not IsEditing; NeedInvalidate := DoRangeSelect or (FSelectionCount > 1); ActAsGrid := toGridExtensions in FOptions.FMiscOptions; ClearPending := (Shift = []) or (ActAsGrid and not (ssShift in Shift)) or not (toMultiSelect in FOptions.FSelectionOptions) or (CharCode in [VK_TAB, VK_BACK]); // Keep old focused node for range selection. Use a default node if none was focused until now. LastFocused := FFocusedNode; if (LastFocused = nil) and (Shift <> []) then LastFocused := GetFirstVisible(nil, True); // Set an initial range anchor if there is not yet one. if FRangeAnchor = nil then FRangeAnchor := GetFirstSelected; if FRangeAnchor = nil then FRangeAnchor := GetFirst; if UseRightToLeftAlignment then RTLFactor := -1 else RTLFactor := 1; // Determine new focused node. case CharCode of VK_HOME, VK_END: begin if (CharCode = VK_END) xor UseRightToLeftAlignment then begin GetStartColumn := FHeader.FColumns.GetLastVisibleColumn; GetNextColumn := FHeader.FColumns.GetPreviousVisibleColumn; GetNextNode := GetPreviousVisible; Node := GetLastVisible(nil, True); end else begin GetStartColumn := FHeader.FColumns.GetFirstVisibleColumn; GetNextColumn := FHeader.FColumns.GetNextVisibleColumn; GetNextNode := GetNextVisible; Node := GetFirstVisible(nil, True); end; // Advance to next/previous visible column. if FHeader.UseColumns then NewColumn := GetStartColumn else NewColumn := NoColumn; // Find a column for the new/current node which can be focused. // Make the 'DoFocusChanging' for finding a valid column // identifiable from the 'DoFocusChanging' raised later on by // "FocusedNode := Node;" while (NewColumn > NoColumn) and not DoFocusChanging(FFocusedNode, FFocusedNode, FFocusedColumn, NewColumn) do NewColumn := GetNextColumn(NewColumn); if NewColumn > InvalidColumn then begin if (Shift = [ssCtrlOS]) and not ActAsGrid then begin ScrollIntoView(Node, toCenterScrollIntoView in FOptions.SelectionOptions, not (toDisableAutoscrollHorizontal in FOptions.FAutoOptions)); if (CharCode = VK_HOME) and not UseRightToLeftAlignment then SetOffsetX(0) else SetOffsetX(-MaxInt); end else begin if not ActAsGrid or (ssCtrlOS in Shift) then FocusedNode := Node; if ActAsGrid and not (toFullRowSelect in FOptions.FSelectionOptions) then FocusedColumn := NewColumn; end; end; end; VK_PRIOR: if ssCtrlOS in Shift then SetOffsetY(FOffsetY + ClientHeight) else begin Offset := 0; // If there's no focused node then just take the very first visible one. if FFocusedNode = nil then Node := GetFirstVisible(nil, True) else begin // Go up as many nodes as comprise together a size of ClientHeight. Node := FFocusedNode; while True do begin Temp := GetPreviousVisible(Node, True); NewHeight := NodeHeight[Node]; if (Temp = nil) or (Offset + NewHeight >= ClientHeight) then Break; Node := Temp; Inc(Offset, NodeHeight[Node]); end; end; FocusedNode := Node; end; VK_NEXT: if ssCtrlOS in Shift then SetOffsetY(FOffsetY - ClientHeight) else begin Offset := 0; // If there's no focused node then just take the very last one. if FFocusedNode = nil then Node := GetLastVisible(nil, True) else begin // Go up as many nodes as comprise together a size of ClientHeight. Node := FFocusedNode; while True do begin Temp := GetNextVisible(Node, True); NewHeight := NodeHeight[Node]; if (Temp = nil) or (Offset + NewHeight >= ClientHeight) then Break; Node := Temp; Inc(Offset, NewHeight); end; end; FocusedNode := Node; end; VK_UP: begin // scrolling without selection change if ssCtrlOS in Shift then SetOffsetY(FOffsetY + Integer(FDefaultNodeHeight)) else begin if FFocusedNode = nil then Node := GetLastVisible(nil, True) else Node := GetPreviousVisible(FFocusedNode, True); if Assigned(Node) then begin EndEditNode; if HandleMultiSelect and (CompareNodePositions(LastFocused, FRangeAnchor) > 0) and Assigned(FFocusedNode) then RemoveFromSelection(FFocusedNode); if FFocusedColumn <= NoColumn then FFocusedColumn := FHeader.MainColumn; FocusedNode := Node; end else if Assigned(FFocusedNode) then InvalidateNode(FFocusedNode); end; end; VK_DOWN: begin // scrolling without selection change if ssCtrlOS in Shift then SetOffsetY(FOffsetY - Integer(FDefaultNodeHeight)) else begin if FFocusedNode = nil then Node := GetFirstVisible(nil, True) else Node := GetNextVisible(FFocusedNode, True); if Assigned(Node) then begin EndEditNode; if HandleMultiSelect and (CompareNodePositions(LastFocused, FRangeAnchor) < 0) and Assigned(FFocusedNode) then RemoveFromSelection(FFocusedNode); if FFocusedColumn <= NoColumn then FFocusedColumn := FHeader.MainColumn; FocusedNode := Node; end else if Assigned(FFocusedNode) then InvalidateNode(FFocusedNode); end; end; VK_LEFT: begin // special handling if ssCtrlOS in Shift then SetOffsetX(FOffsetX + RTLFactor * FHeader.Columns.GetScrollWidth) else begin // other special cases Context := NoColumn; if (toExtendedFocus in FOptions.FSelectionOptions) and (toGridExtensions in FOptions.FMiscOptions) then begin Context := FHeader.Columns.GetPreviousVisibleColumn(FFocusedColumn, True); if Context > -1 then FocusedColumn := Context end else if Assigned(FFocusedNode) and (vsExpanded in FFocusedNode.States) and (Shift = []) and (vsHasChildren in FFocusedNode.States) then ToggleNode(FFocusedNode) else begin if FFocusedNode = nil then FocusedNode := GetFirstVisible(nil, True) else begin if FFocusedNode.Parent <> FRoot then Node := FFocusedNode.Parent else Node := nil; if Assigned(Node) then begin if HandleMultiSelect then begin // and a third special case if FFocusedNode.Index > 0 then DoRangeSelect := True else if CompareNodePositions(Node, FRangeAnchor) > 0 then RemoveFromSelection(FFocusedNode); end; FocusedNode := Node; end; end; end; end; end; VK_RIGHT: begin // special handling if ssCtrlOS in Shift then SetOffsetX(FOffsetX - RTLFactor * FHeader.Columns.GetScrollWidth) else begin // other special cases Context := NoColumn; if (toExtendedFocus in FOptions.FSelectionOptions) and (toGridExtensions in FOptions.FMiscOptions) then begin Context := FHeader.Columns.GetNextVisibleColumn(FFocusedColumn, True); if Context > -1 then FocusedColumn := Context; end else if Assigned(FFocusedNode) and not (vsExpanded in FFocusedNode.States) and (Shift = []) and (vsHasChildren in FFocusedNode.States) then ToggleNode(FFocusedNode) else begin if FFocusedNode = nil then FocusedNode := GetFirstVisible(nil, True) else begin Node := GetFirstVisibleChild(FFocusedNode); if Assigned(Node) then begin if HandleMultiSelect and (CompareNodePositions(Node, FRangeAnchor) < 0) then RemoveFromSelection(FFocusedNode); FocusedNode := Node; end; end; end; end; end; VK_BACK: if tsIncrementalSearching in FStates then DoStateChange([tsIncrementalSearchPending]) else if Assigned(FFocusedNode) and (FFocusedNode.Parent <> FRoot) then FocusedNode := FocusedNode.Parent; VK_TAB: if (toExtendedFocus in FOptions.FSelectionOptions) and FHeader.UseColumns then begin // In order to avoid duplicating source code just to change the direction // we use function variables. if ssShift in Shift then begin GetStartColumn := FHeader.FColumns.GetLastVisibleColumn; GetNextColumn := FHeader.FColumns.GetPreviousVisibleColumn; GetNextNode := GetPreviousVisible; end else begin GetStartColumn := FHeader.FColumns.GetFirstVisibleColumn; GetNextColumn := FHeader.FColumns.GetNextVisibleColumn; GetNextNode := GetNextVisible; end; // Advance to next/previous visible column/node. Node := FFocusedNode; NewColumn := GetNextColumn(FFocusedColumn, True); repeat // Find a column for the current node which can be focused. while (NewColumn > NoColumn) and not DoFocusChanging(FFocusedNode, Node, FFocusedColumn, NewColumn) do NewColumn := GetNextColumn(NewColumn, True); if NewColumn > NoColumn then begin // Set new node and column in one go. SetFocusedNodeAndColumn(Node, NewColumn); Break; end; // No next column was accepted for the current node. So advance to next node and try again. Node := GetNextNode(Node); NewColumn := GetStartColumn; until Node = nil; end; end; // Clear old selection if required but take care to select the new focused node if it was not selected before. ForceSelection := False; if ClearPending and ((LastFocused <> FFocusedNode) or (FSelectionCount <> 1)) then begin ClearSelection; ForceSelection := True; end; // Determine new selection anchor. if Shift = [] then begin FRangeAnchor := FFocusedNode; FLastSelectionLevel := GetNodeLevel(FFocusedNode); end; // Finally change the selection for a specific range of nodes. if DoRangeSelect then ToggleSelection(LastFocused, FFocusedNode); // Make sure the new focused node is also selected. if Assigned(FFocusedNode) and ((LastFocused <> FFocusedNode) or ForceSelection) then AddToSelection(FFocusedNode); // If a repaint is needed then paint the entire tree because of the ClearSelection call, if NeedInvalidate then Invalidate; {$ifdef LCLGtk2} //workaround for changing focus bug if CharCode <> VK_TAB then CharCode := 0; {$endif} end else begin // Second chance for keys not directly concerned with selection changes. // For +, -, /, * keys on the main keyboard (not numpad) there is no virtual key code defined. // We have to do special processing to get them working too. //todo: reimplement {$ifndef INCOMPLETE_WINAPI} GetKeyboardState(KeyState); // Avoid conversion to control characters. We have captured the control key state already in Shift. KeyState[VK_CONTROL] := 0; if ToASCII(Message.CharCode, (Message.KeyData shr 16) and 7, KeyState, @Buffer, 0) > 0 then begin case Buffer[0] of '*': CharCode := VK_MULTIPLY; '+': CharCode := VK_ADD; '/': CharCode := VK_DIVIDE; '-': CharCode := VK_SUBTRACT; end; end; // According to http://www.it-faq.pl/mskb/99/337.HTM there is a problem with ToASCII when used in conjunction // with dead chars. The article recommends to call ToASCII twice to restore a deleted flag in the key message // structure under certain circumstances. It turned out it is best to always call ToASCII twice. ToASCII(Message.CharCode, (Message.KeyData shr 16) and 7, KeyState, @Buffer, 0); {$endif} case CharCode of VK_F2: if (Shift = []) and Assigned(FFocusedNode) and CanEdit(FFocusedNode, FFocusedColumn) then begin FEditColumn := FFocusedColumn; DoEdit; end; VK_ADD: if not (tsIncrementalSearching in FStates) then begin if ssCtrlOS in Shift then if {$ifdef ReverseFullExpandHotKey} not {$endif ReverseFullExpandHotKey} (ssShift in Shift) then FullExpand else FHeader.AutoFitColumns else if Assigned(FFocusedNode) and not (vsExpanded in FFocusedNode.States) then ToggleNode(FFocusedNode); end else DoStateChange([tsIncrementalSearchPending]); VK_SUBTRACT: if not (tsIncrementalSearching in FStates) then begin if ssCtrlOS in Shift then if {$ifdef ReverseFullExpandHotKey} not {$endif ReverseFullExpandHotKey} (ssShift in Shift) then FullCollapse else FHeader.RestoreColumns else if Assigned(FFocusedNode) and (vsExpanded in FFocusedNode.States) then ToggleNode(FFocusedNode); end else DoStateChange([tsIncrementalSearchPending]); VK_MULTIPLY: if not (tsIncrementalSearching in FStates) then begin if Assigned(FFocusedNode) then FullExpand(FFocusedNode); end else DoStateChange([tsIncrementalSearchPending]); VK_DIVIDE: if not (tsIncrementalSearching in FStates) then begin if Assigned(FFocusedNode) then FullCollapse(FFocusedNode); end else DoStateChange([tsIncrementalSearchPending]); VK_ESCAPE: // cancel actions currently in progress begin if IsMouseSelecting then begin DoStateChange([], [tsDrawSelecting, tsDrawSelPending]); Invalidate; end //gtk1 does not like to free a component in KeyDown {$ifndef LCLGtk} else if IsEditing then CancelEditNode; {$endif} end; VK_SPACE: if (toCheckSupport in FOptions.FMiscOptions) and Assigned(FFocusedNode) and (FFocusedNode.CheckType <> ctNone) then begin if (FStates * [tsKeyCheckPending, tsMouseCheckPending] = []) and Assigned(FFocusedNode) and not (vsDisabled in FFocusedNode.States) then begin with FFocusedNode^ do NewCheckState := DetermineNextCheckState(CheckType, CheckState); if DoChecking(FFocusedNode, NewCheckState) then begin DoStateChange([tsKeyCheckPending]); FCheckNode := FFocusedNode; FPendingCheckState := NewCheckState; FCheckNode.CheckState := PressedState[FCheckNode.CheckState]; RepaintNode(FCheckNode); end; end; end else DoStateChange([tsIncrementalSearchPending]); VK_F1: if Assigned(FOnGetHelpContext) then begin Context := 0; if Assigned(FFocusedNode) then begin Node := FFocusedNode; // Traverse the tree structure up to the root. repeat FOnGetHelpContext(Self, Node, 0, Context); Node := Node.Parent; until (Node = FRoot) or (Context <> 0); end; // If no help context could be found try the tree's one or its parent's contexts. ParentControl := Self; while Assigned(ParentControl) and (Context = 0) do begin Context := ParentControl.HelpContext; ParentControl := ParentControl.Parent; end; if Context <> 0 then Application.HelpContext(Context); end; VK_APPS: if Assigned(FFocusedNode) then begin R := GetDisplayRect(FFocusedNode, FFocusedColumn, True); Offset := DoGetNodeWidth(FFocusedNode, FFocusedColumn); if FFocusedColumn >= 0 then begin if Offset > FHeader.Columns[FFocusedColumn].Width then Offset := FHeader.Columns[FFocusedColumn].Width; end else begin if Offset > ClientWidth then Offset := ClientWidth; end; DoPopupMenu(FFocusedNode, FFocusedColumn, Point(R.Left + Offset div 2, (R.Top + R.Bottom) div 2)); end; Ord('a'), Ord('A'): if ssCtrlOS in Shift then SelectAll(True) else DoStateChange([tsIncrementalSearchPending]); else begin // Use the key for incremental search. // Since we are dealing with Unicode all the time there should be a more sophisticated way // of checking for valid characters for incremental search. // This is available but would require to include a significant amount of Unicode character // properties, so we stick with the simple space check. if (Shift * [ssCtrlOS, ssAlt] = []) and (CharCode >= 32) then DoStateChange([tsIncrementalSearchPending]); end; end; end; end; end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMKeyDown');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMKeyUp(var Message: TLMKeyUp); begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMKeyUp');{$endif} inherited WMKeyUp(Message); case Message.CharCode of VK_SPACE: if tsKeyCheckPending in FStates then begin DoStateChange([], [tskeyCheckPending]); if FCheckNode = FFocusedNode then DoCheckClick(FCheckNode, FPendingCheckState); InvalidateNode(FCheckNode); FCheckNode := nil; end; end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMKeyUp');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMKillFocus(var Msg: TLMKillFocus); begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMKillFocus');{$endif} inherited WMKillFocus(Msg); // Remove hint if shown currently. Application.CancelHint; // Stop wheel panning if active. StopWheelPanning; // Don't let any timer continue if the tree is no longer the active control (except change timers). KillTimer(Handle, ExpandTimer); KillTimer(Handle, EditTimer); KillTimer(Handle, ScrollTimer); KillTimer(Handle, SearchTimer); FSearchBuffer := ''; FLastSearchNode := nil; DoStateChange([], [tsScrollPending, tsScrolling, tsEditPending, tsLeftButtonDown, tsRightButtonDown, tsMiddleButtonDown, tsOLEDragPending, tsVCLDragPending, tsIncrementalSearching, tsNodeHeightTrackPending, tsNodeHeightTracking]); if (FSelectionCount > 0) or not (toGhostedIfUnfocused in FOptions.FPaintOptions) then Invalidate else if Assigned(FFocusedNode) then InvalidateNode(FFocusedNode); {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMKillFocus');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMLButtonDblClk(var Message: TLMLButtonDblClk); var HitInfo: THitInfo; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMLButtonDblClk');{$endif} DoStateChange([tsLeftDblClick]); inherited WMLButtonDblClk(Message); // get information about the hit GetHitTestInfoAt(Message.XPos, Message.YPos, True, HitInfo); HandleMouseDblClick(Message, HitInfo); DoStateChange([], [tsLeftDblClick]); {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMLButtonDblClk');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMLButtonDown(var Message: TLMLButtonDown); var HitInfo: THitInfo; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMLButtonDown');{$endif} DoStateChange([tsLeftButtonDown]); inherited WMLButtonDown(Message); // get information about the hit GetHitTestInfoAt(Message.XPos, Message.YPos, True, HitInfo); {$ifdef DEBUG_VTV} if HitInfo.HitNode <> nil then Logger.Send([lcPaintHeader, lcMouseEvent],'WMLButtonDown - HitNode.Index', HitInfo.HitNode^.Index); {$endif} HandleMouseDown(Message, HitInfo); {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMLButtonDown');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMLButtonUp(var Message: TLMLButtonUp); var HitInfo: THitInfo; begin DoStateChange([], [tsLeftButtonDown, tsNodeHeightTracking, tsNodeHeightTrackPending]); // get information about the hit GetHitTestInfoAt(Message.XPos, Message.YPos, True, HitInfo); HandleMouseUp(Message.Keys, HitInfo); inherited WMLButtonUp(Message); {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMLButtonUp');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMMButtonDblClk(var Message: TLMMButtonDblClk); var HitInfo: THitInfo; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMMButtonDblClk');{$endif} DoStateChange([tsMiddleDblClick]); inherited WMMButtonDblClk(Message); // get information about the hit if toMiddleClickSelect in FOptions.FSelectionOptions then begin GetHitTestInfoAt(Message.XPos, Message.YPos, True, HitInfo); HandleMouseDblClick(Message, HitInfo); end; DoStateChange([], [tsMiddleDblClick]); {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMMButtonDblClk');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMMButtonDown(var Message: TLMMButtonDown); var HitInfo: THitInfo; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMMButtonDown');{$endif} DoStateChange([tsMiddleButtonDown]); if FHeader.FStates = [] then begin inherited WMMButtonDown(Message); // Start wheel panning or scrolling if not already active, allowed and scrolling is useful at all. if (toWheelPanning in FOptions.FMiscOptions) and ([tsWheelScrolling, tsWheelPanning] * FStates = []) and ((Integer(FRangeX) > ClientWidth) or (Integer(FRangeY) > ClientHeight)) then begin FLastClickPos := SmallPointToPoint(Message.Pos); StartWheelPanning(FLastClickPos); end else begin StopWheelPanning; // Get information about the hit. if toMiddleClickSelect in FOptions.FSelectionOptions then begin GetHitTestInfoAt(Message.XPos, Message.YPos, True, HitInfo); HandleMouseDown(Message, HitInfo); end; end; end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMMButtonDown');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMMButtonUp(var Message: TLMMButtonUp); var HitInfo: THitInfo; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMMButtonUp');{$endif} DoStateChange([], [tsMiddleButtonDown]); // If wheel panning/scrolling is active and the mouse has not yet been moved then the user starts wheel auto scrolling. // Indicate this by removing the panning flag. Otherwise (the mouse has moved meanwhile) stop panning. if [tsWheelPanning, tsWheelScrolling] * FStates <> [] then begin if tsWheelScrolling in FStates then DoStateChange([], [tsWheelPanning]) else StopWheelPanning; end else if FHeader.FStates = [] then begin inherited WMMButtonUp(Message); // get information about the hit if toMiddleClickSelect in FOptions.FSelectionOptions then begin GetHitTestInfoAt(Message.XPos, Message.YPos, True, HitInfo); HandleMouseUp(Message.Keys, HitInfo); end; end; {$ifdef DEBUG_VTV}Logger.ExitMethod('WMMButtonUp');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- {$ifdef EnableNCFunctions} procedure TBaseVirtualTree.WMNCCalcSize(var Message: TLMNCCalcSize); begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMNCCalcSize');{$endif} inherited WMNCCalcSize(Message); with FHeader do if hoVisible in FHeader.FOptions then with Message.CalcSize_Params^ do Inc(rgrc[0].Top, FHeight); {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMNCCalcSize');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMNCHitTest(var Message: TWMNCHitTest); begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMNCHitTest');{$endif} inherited WMNCHitTest(Message); if not (csDesigning in ComponentState) and (hoVisible in FHeader.FOptions) and FHeader.InHeader(ScreenToClient(SmallPointToPoint(Message.Pos))) then Message.Result := HTBORDER; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMNCHitTest');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMNCPaint(var Message: TRealWMNCPaint); var DC: HDC; R: TRect; Flags: DWORD; {$ifdef ThemeSupport} ExStyle: Integer; TempRgn: HRGN; BorderWidth, BorderHeight: Integer; {$endif ThemeSupport} begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMNCPaint');{$endif} {$ifdef ThemeSupport} if tsUseThemes in FStates then begin // If theming is enabled and the client edge border is set for the window then prevent the default window proc // from painting the old border to avoid flickering. ExStyle := GetWindowLong(Handle, GWL_EXSTYLE); if (ExStyle and WS_EX_CLIENTEDGE) <> 0 then begin GetWindowRect(Handle, R); // Determine width of the client edge. BorderWidth := GetSystemMetrics(SM_CXEDGE); BorderHeight := GetSystemMetrics(SM_CYEDGE); InflateRect(R, -BorderWidth, -BorderHeight); TempRgn := CreateRectRgnIndirect(R); // Exclude the border from the message region if there is one. Otherwise just use the inflated // window area region. if Message.Rgn <> 1 then CombineRgn(TempRgn, Message.Rgn, TempRgn, RGN_AND); DefWindowProc(Handle, Message.Msg, Integer(TempRgn), 0); DeleteObject(TempRgn); end else DefaultHandler(Message); end else {$endif ThemeSupport} DefaultHandler(Message); Flags := DCX_CACHE or DCX_CLIPSIBLINGS or DCX_WINDOW or DCX_VALIDATE; if (Message.Rgn = 1) or not IsWinNT then DC := GetDCEx(Handle, 0, Flags) else DC := GetDCEx(Handle, Message.Rgn, Flags or DCX_INTERSECTRGN); if DC <> 0 then begin if hoVisible in FHeader.FOptions then begin R := FHeaderRect; FHeader.FColumns.PaintHeader(DC, R, -FEffectiveOffsetX); end; OriginalWMNCPaint(DC); ReleaseDC(Handle, DC); end; {$ifdef ThemeSupport} if tsUseThemes in FStates then ThemeServices.PaintBorder(Self, False); {$endif ThemeSupport} {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMNCPaint');{$endif} end; {$endif} //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMPaint(var Message: TLMPaint); begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMPaint');{$endif} //todo: //Windows.GetUpdateRect is always empty because BeginPaint was called //see if PaintStruct has the same rect {$ifndef INCOMPLETE_WINAPI} if tsVCLDragging in FStates then ImageList_DragShowNolock(False); {$endif} if csPaintCopy in ControlState then FUpdateRect := ClientRect else FUpdateRect := Message.PaintStruct^.rcPaint; {$ifdef DEBUG_VTV}Logger.Send([lcPaint],'FUpdateRect', FUpdateRect);{$endif} inherited WMPaint(Message); {$ifndef INCOMPLETE_WINAPI} if tsVCLDragging in FStates then ImageList_DragShowNolock(True); {$endif} {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMPaint');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMPaste(var Message: TLMNoParams); begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMPaste');{$endif} PasteFromClipboard; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMPaste');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- {$ifdef EnablePrintFunctions} procedure TBaseVirtualTree.WMPrint(var Message: TWMPrint); // This message is sent to request that the tree draws itself to a given device context. This includes not only // the client area but also the non-client area (header!). begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMPrint');{$endif} // Draw only if the window is visible or visibility is not required. if ((Message.Flags and PRF_CHECKVISIBLE) = 0) or IsWindowVisible(Handle) then Header.Columns.PaintHeader(Message.DC, FHeaderRect, -FEffectiveOffsetX); inherited WMPrint(Message); {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMPrint');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMPrintClient(var Message: TWMPrintClient); var Window: TRect; Target: TPoint; Canvas: TCanvas; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMPrintClient');{$endif} // Draw only if the window is visible or visibility is not required. if ((Message.Flags and PRF_CHECKVISIBLE) = 0) or IsWindowVisible(Handle) then begin // Determine area of the entire tree to be displayed in the control. Window := ClientRect; Target := Window.TopLeft; // The Window rectangle is given in client coordinates. We have to convert it into // a sliding window of the tree image. OffsetRect(Window, FEffectiveOffsetX, -FOffsetY); Canvas := TCanvas.Create; try Canvas.Handle := Message.DC; PaintTree(Canvas, Window, Target, [poBackground, poDrawFocusRect, poDrawDropMark, poDrawSelection, poGridLines]); finally Canvas.Handle := 0; Canvas.Free; end; end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMPrintClient');{$endif} end; {$endif} //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMRButtonDblClk(var Message: TLMRButtonDblClk); var HitInfo: THitInfo; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMRButtonDblClk');{$endif} DoStateChange([tsRightDblClick]); inherited WMRButtonDblClk(Message); // get information about the hit if toMiddleClickSelect in FOptions.FSelectionOptions then begin GetHitTestInfoAt(Message.XPos, Message.YPos, True, HitInfo); HandleMouseDblClick(Message, HitInfo); end; DoStateChange([], [tsRightDblClick]); {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMRButtonDblClk');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMRButtonDown(var Message: TLMRButtonDown); var HitInfo: THitInfo; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMRButtonDown');{$endif} DoStateChange([tsRightButtonDown]); if FHeader.FStates = [] then begin inherited WMRButtonDown(Message); // get information about the hit if toRightClickSelect in FOptions.FSelectionOptions then begin GetHitTestInfoAt(Message.XPos, Message.YPos, True, HitInfo); HandleMouseDown(Message, HitInfo); end; end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMRButtonDown');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMRButtonUp(var Message: TLMRButtonUp); // handle right click selection and node specific popup menu var HitInfo: THitInfo; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMRButtonUp');{$endif} DoStateChange([], [tsPopupMenuShown, tsRightButtonDown]); if FHeader.FStates = [] then begin Application.CancelHint; if IsMouseSelecting and Assigned(PopupMenu) then begin // Reset selection state already here, before the inherited handler opens the default menu. DoStateChange([], [tsDrawSelecting, tsDrawSelPending]); Invalidate; end; inherited WMRButtonUp(Message); // get information about the hit GetHitTestInfoAt(Message.XPos, Message.YPos, True, HitInfo); if toRightClickSelect in FOptions.FSelectionOptions then HandleMouseUp(Message.Keys, HitInfo); if not Assigned(PopupMenu) then DoPopupMenu(HitInfo.HitNode, HitInfo.HitColumn, Point(Message.XPos, Message.YPos)); end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMRButtonUp');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMSetFocus(var Msg: TLMSetFocus); begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMSetFocus') ;{$endif} inherited WMSetFocus(Msg); if (FSelectionCount > 0) or not (toGhostedIfUnfocused in FOptions.FPaintOptions) then Invalidate; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMSetFocus');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMSize(var Message: TLMSize); begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'WMSize');{$endif} inherited WMSize(Message); // Need to update scroll bars here. This will cause a recursion because of the change of the client area // when changing a scrollbar. Usually this is no problem since with the second level recursion no change of the // window size happens (the same values for the scrollbars are set, which shouldn't cause a window size change). // Appearently, this applies not to all systems, however. if HandleAllocated and ([tsSizing, tsWindowCreating] * FStates = []) and (ClientHeight > 0) then try DoStateChange([tsSizing]); // This call will invalidate the entire non-client area which needs recalculation on resize. FHeader.RescaleHeader; FHeader.UpdateSpringColumns; UpdateScrollBars(True); if (tsEditing in FStates) and not FHeader.UseColumns then UpdateEditBounds; finally DoStateChange([], [tsSizing]); end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'WMSize');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- {$ifdef ThemeSupport} {$ifdef Windows} //todo procedure TBaseVirtualTree.WMThemeChanged(var Message: TLMessage); begin inherited; ThemeServices.UpdateThemes; if ThemeServices.ThemesEnabled and (toThemeAware in TreeOptions.PaintOptions) then DoStateChange([tsUseThemes]) else DoStateChange([], [tsUseThemes]); RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_VALIDATE or RDW_FRAME); end; {$endif} {$endif ThemeSupport} //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMTimer(var Message: TLMTimer); // centralized timer handling happens here begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages,lcTimer],'WMTimer');{$endif} with Message do begin {$ifdef DEBUG_VTV}Logger.Send([lcTimer],'TimerId',TimerId);{$endif} case TimerID of ExpandTimer: DoDragExpand; EditTimer: DoEdit; ScrollTimer: begin if tsScrollPending in FStates then begin Application.CancelHint; // Scroll delay has elapsed, set to normal scroll interval now. SetTimer(Handle, ScrollTimer, FAutoScrollInterval, nil); DoStateChange([tsScrolling], [tsScrollPending]); end; DoTimerScroll; end; ChangeTimer: DoChange(FLastChangedNode); StructureChangeTimer: DoStructureChange(FLastStructureChangeNode, FLastStructureChangeReason); SearchTimer: begin // When this event triggers then the user did not pressed any key for the specified timeout period. // Hence incremental searching is stopped. DoStateChange([], [tsIncrementalSearching]); KillTimer(Handle, SearchTimer); FSearchBuffer := ''; FLastSearchNode := nil; end; end; end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages,lcTimer],'WMTimer');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WMVScroll(var Message: TLMVScroll); //--------------- local functions ------------------------------------------- function GetRealScrollPosition: Integer; var SI: TScrollInfo; Code: Integer; begin SI.cbSize := SizeOf(TScrollInfo); SI.fMask := SIF_TRACKPOS; Code := SB_VERT; {$ifdef UseFlatScrollbars} FlatSB_GetScrollInfo(Handle, Code, SI); {$else} GetScrollInfo(Handle, Code, SI); {$endif UseFlatScrollbars} Result := SI.nTrackPos; {$ifdef DEBUG_VTV}Logger.Send([lcScroll],'GetRealScrollPosition',Result);{$endif} end; //--------------- end local functions --------------------------------------- begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcScroll],'WMVScroll');{$endif} //{$ifdef DEBUG_VTV}Logger.SendCallStack([lcScroll],'CallStack');{$endif} case Message.ScrollCode of SB_BOTTOM: SetOffsetY(-Integer(FRoot.TotalHeight)); SB_ENDSCROLL: begin DoStateChange([], [tsThumbTracking]); // Avoiding to adjust the horizontal scroll position while tracking makes scrolling much smoother // but we need to adjust the final position here then. UpdateScrollBars(True); // Really weird invalidation needed here (and I do it only because it happens so rarely), because // when showing the horizontal scrollbar while scrolling down using the down arrow button, // the button will be repainted on mouse up (at the wrong place in the far right lower corner)... RedrawWindow(Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE or RDW_NOERASE or RDW_NOCHILDREN); end; SB_LINEUP: SetOffsetY(FOffsetY + FScrollBarOptions.FIncrementY); SB_LINEDOWN: SetOffsetY(FOffsetY - FScrollBarOptions.FIncrementY); SB_PAGEUP: SetOffsetY(FOffsetY + ClientHeight); SB_PAGEDOWN: SetOffsetY(FOffsetY - ClientHeight); SB_THUMBPOSITION, SB_THUMBTRACK: begin DoStateChange([tsThumbTracking]); {$if DEFINED(LCLQt) OR DEFINED(LCLCarbon)} SetOffsetY(-Message.Pos); {$else} SetOffsetY(-GetRealScrollPosition); {$endif} end; SB_TOP: SetOffsetY(0); end; Message.Result := 0; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcScroll],'WMVScroll');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.AddToSelection(Node: PVirtualNode); var Changed: Boolean; begin if not FSelectionLocked then begin Assert(Assigned(Node), 'Node must not be nil!'); FSingletonNodeArray[0] := Node; Changed := InternalAddToSelection(FSingletonNodeArray, 1, False); if Changed then begin InvalidateNode(Node); Change(Node); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.AddToSelection(const NewItems: TNodeArray; NewLength: Integer; ForceInsert: Boolean = False); // Adds the given items all at once into the current selection array. NewLength is the amount of // nodes to add (necessary to allow NewItems to be larger than the actual used entries). // ForceInsert is True if nodes must be inserted without consideration of level select constraint or // already set selected flags (e.g. when loading from stream). // Note: In the case ForceInsert is True the caller is responsible for making sure the new nodes aren't already in the // selection array! var Changed: Boolean; begin Changed := InternalAddToSelection(NewItems, NewLength, ForceInsert); if Changed then begin if NewLength = 1 then begin InvalidateNode(NewItems[0]); Change(NewItems[0]); end else begin Invalidate; Change(nil); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.AdjustPaintCellRect(var PaintInfo: TVTPaintInfo; out NextNonEmpty: TColumnIndex); // Used in descendants to modify the paint rectangle of the current column while painting a certain node. begin // Since cells are always drawn from left to right the next column index is independent of the // bidi mode, but not the column borders, which might change depending on the cell's content. NextNonEmpty := FHeader.FColumns.GetNextVisibleColumn(PaintInfo.Column); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.AdjustPanningCursor(X, Y: Integer); // Triggered by a mouse move when wheel panning/scrolling is active. // Loads the proper cursor which indicates into which direction scrolling is done. var NewCursor: HCURSOR; ScrollHorizontal, ScrollVertical: Boolean; begin ScrollHorizontal := Integer(FRangeX) > ClientWidth; ScrollVertical := Integer(FRangeY) > ClientHeight; if (Abs(X - FLastClickPos.X) < 8) and (Abs(Y - FLastClickPos.Y) < 8) then begin // Mouse is in the neutral zone. if ScrollHorizontal then begin if ScrollVertical then NewCursor := crVT_MOVEALL else NewCursor := crVT_MOVEEW end else NewCursor := crVT_MOVENS; end else begin // One of 8 directions applies: north, north-east, east, south-east, south, south-west, west and north-west. // Check also if scrolling in the particular direction is possible. if ScrollVertical and ScrollHorizontal then begin // All directions allowed. if X - FlastClickPos.X < -8 then begin // Left hand side. if Y - FLastClickPos.Y < -8 then NewCursor := crVT_MOVENW else if Y - FLastClickPos.Y > 8 then NewCursor := crVT_MOVESW else NewCursor := crVT_MOVEW; end else if X - FLastClickPos.X > 8 then begin // Right hand side. if Y - FLastClickPos.Y < -8 then NewCursor := crVT_MOVENE else if Y - FLastClickPos.Y > 8 then NewCursor := crVT_MOVESE else NewCursor := crVT_MOVEE; end else begin // Up or down. if Y < FLastClickPos.Y then NewCursor := crVT_MOVEN else NewCursor := crVT_MOVES; end; end else if ScrollHorizontal then begin // Only horizontal movement allowed. if X < FlastClickPos.X then NewCursor := crVT_MOVEW else NewCursor := crVT_MOVEE; end else begin // Only vertical movement allowed. if Y < FlastClickPos.Y then NewCursor := crVT_MOVEN else NewCursor := crVT_MOVES; end; end; // Now load the cursor and apply it. {$ifdef Windows} LCLIntf.SetCursor(Screen.Cursors[NewCursor]); {$else} Cursor := NewCursor; {$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.AdviseChangeEvent(StructureChange: Boolean; Node: PVirtualNode; Reason: TChangeReason); // Used to register a delayed change event. If StructureChange is False then we have a selection change event (without // a specific reason) otherwise it is a structure change. begin if StructureChange then begin if tsStructureChangePending in FStates then begin if HandleAllocated then KillTimer(Handle,StructureChangeTimer); end else DoStateChange([tsStructureChangePending]); FLastStructureChangeNode := Node; if FLastStructureChangeReason = crIgnore then FLastStructureChangeReason := Reason else if Reason <> crIgnore then FLastStructureChangeReason := crAccumulated; end else begin if tsChangePending in FStates then KillTimer(Handle, ChangeTimer) else DoStateChange([tsChangePending]); FLastChangedNode := Node; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.AllocateInternalDataArea(Size: Cardinal): Cardinal; // Simple registration method to be called by each descendant to claim their internal data area. // Result is the offset from the begin of the node to the internal data area of the calling tree class. begin Assert((FRoot = nil) or (FRoot.ChildCount = 0), 'Internal data allocation must be done before any node is created.'); {$ifdef DEBUG_VTV}Logger.Send('FTotalInternalDataSize BEFORE',FTotalInternalDataSize);{$endif} {$ifdef DEBUG_VTV}Logger.Send('Size',Size);{$endif} {$ifdef DEBUG_VTV}Logger.Send('TreeNodeSize',TreeNodeSize);{$endif} Result := TreeNodeSize + FTotalInternalDataSize; {$ifdef DEBUG_VTV}Logger.Send('Result',Result);{$endif} Inc(FTotalInternalDataSize, (Size + 3) and not 3); {$ifdef DEBUG_VTV}Logger.Send('FTotalInternalDataSize AFTER', FTotalInternalDataSize);{$endif} InitRootNode(Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.Animate(Steps, Duration: Cardinal; Callback: TVTAnimationCallback; Data: Pointer); // This method does the calculation part of an animation as used for node toggling and hint animations. // Steps is the maximum amount of animation steps to do and Duration determines the milliseconds the animation // has to run. Callback is a task specific method which is called in the loop for every step and Data is simply // something to pass on to the callback. // The callback is called with the current step, the current step size and the Data parameter. Since the step amount // as well as the step size are possibly adjusted during the animation, it is impossible to determine if the current // step is the last step, even if the original step amount is known. To solve this problem the callback will be // called after the loop has finished with a step size of 0 indicating so to execute any post processing. var StepSize, RemainingTime, RemainingSteps, NextTimeStep, CurrentStep, StartTime, CurrentTime: Cardinal; begin {$ifndef Windows} //Is necessary to properly implement timeGetTime in non Windows Exit; {$endif} if not (tsInAnimation in FStates) and (Duration > 0) then begin DoStateChange([tsInAnimation]); try RemainingTime := Duration; RemainingSteps := Steps; // Determine the initial step size which is either 1 if the needed steps are less than the number of // steps possible given by the duration or > 1 otherwise. StepSize := Round(Max(1, RemainingSteps / Duration)); RemainingSteps := RemainingSteps div StepSize; CurrentStep := 0; while (RemainingSteps > 0) and (RemainingTime > 0) and not Application.Terminated do begin StartTime := timeGetTime; NextTimeStep := StartTime + RemainingTime div RemainingSteps; if not Callback(CurrentStep, StepSize, Data) then Break; // Keep duration for this step for rest calculation. CurrentTime := timeGetTime; // Wait until the calculated time has been reached. while CurrentTime < NextTimeStep do CurrentTime := timeGetTime; // Subtract the time this step really needed. if RemainingTime >= CurrentTime - StartTime then begin Dec(RemainingTime, CurrentTime - StartTime); Dec(RemainingSteps); end else begin RemainingTime := 0; RemainingSteps := 0; end; // If the remaining time per step is less than one time step then we have to decrease the // step count and increase the step size. if (RemainingSteps > 0) and ((RemainingTime div RemainingSteps) < 1) then begin repeat Inc(StepSize); RemainingSteps := RemainingTime div StepSize; until (RemainingSteps <= 0) or ((RemainingTime div RemainingSteps) >= 1); end; CurrentStep := Cardinal(Steps) - RemainingSteps; end; if not Application.Terminated then Callback(0, 0, Data); finally DoStateChange([], [tsCancelHintAnimation, tsInAnimation]); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.BeginOperation; // Called to indicate that a long-running operation has been started. begin Inc(FOperationCount); if FOperationCount = 1 then FOperationCanceled := False; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.CalculateSelectionRect(X, Y: Integer): Boolean; // Recalculates old and new selection rectangle given that X, Y are new mouse coordinates. // Returns True if there was a change since the last call. var MaxValue: Integer; begin //lclheader if hoVisible in FHeader.Options then Dec(Y, FHeader.Height); if tsDrawSelecting in FStates then FLastSelRect := FNewSelRect; FNewSelRect.BottomRight := Point(X + FEffectiveOffsetX, Y - FOffsetY); if FNewSelRect.Right < 0 then FNewSelRect.Right := 0; if FNewSelRect.Bottom < 0 then FNewSelRect.Bottom := 0; MaxValue := ClientWidth; if FRangeX > Cardinal(MaxValue) then MaxValue := FRangeX; if FNewSelRect.Right > MaxValue then FNewSelRect.Right := MaxValue; MaxValue := ClientHeight; if FRangeY > Cardinal(MaxValue) then MaxValue := FRangeY; if FNewSelRect.Bottom > MaxValue then FNewSelRect.Bottom := MaxValue; Result := not CompareMem(@FLastSelRect, @FNewSelRect, SizeOf(FNewSelRect)); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.CanAutoScroll: Boolean; // Determines if auto scrolling is currently allowed. var IsDropTarget: Boolean; IsDrawSelecting: Boolean; IsWheelPanning: Boolean; begin // Don't scroll the client area if the header is currently doing tracking or dragging. // Do auto scroll only if there is a draw selection in progress or the tree is the current drop target or // wheel panning/scrolling is active. IsDropTarget := Assigned(FDragManager) and VTVDragManager.IsDropTarget; IsDrawSelecting := [tsDrawSelPending, tsDrawSelecting] * FStates <> []; IsWheelPanning := [tsWheelPanning, tsWheelScrolling] * FStates <> []; Result := ((toAutoScroll in FOptions.FAutoOptions) or IsWheelPanning) and (FHeader.FStates = []) and (IsDrawSelecting or IsDropTarget or (tsVCLDragging in FStates) or IsWheelPanning); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.CanShowDragImage: Boolean; // Determines whether a drag image should be shown. begin Result := FDragImageKind <> diNoImage; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.Change(Node: PVirtualNode); begin AdviseChangeEvent(False, Node, crIgnore); if FUpdateCount = 0 then begin if (FChangeDelay > 0) and not (tsSynchMode in FStates) then SetTimer(Handle, ChangeTimer, FChangeDelay, nil) else DoChange(Node); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.ChangeScale(M, D: Integer); var DoScale: Boolean; begin inherited; if (M <> D) and (toAutoChangeScale in FOptions.FAutoOptions) then begin if (csLoading in ComponentState) then DoScale := tsNeedScale in FStates else DoScale := True; if DoScale then begin FDefaultNodeHeight := MulDiv(FDefaultNodeHeight, M, D); FHeader.ChangeScale(M, D); end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.CheckParentCheckState(Node: PVirtualNode; NewCheckState: TCheckState): Boolean; // Checks all siblings of node to determine which check state Node's parent must get. var CheckCount, BoxCount: Cardinal; PartialCheck: Boolean; Run: PVirtualNode; begin CheckCount := 0; BoxCount := 0; PartialCheck := False; Run := Node.Parent.FirstChild; while Assigned(Run) do begin if Run = Node then begin // The given node cannot be checked because it does not yet have its new check state (as this depends // on the outcome of this method). Instead NewCheckState is used as this contains the new state the node // will get if this method returns True. if Run.CheckType in [ctCheckBox, ctTriStateCheckBox] then begin Inc(BoxCount); if NewCheckState in [csCheckedNormal, csCheckedPressed] then Inc(CheckCount); PartialCheck := PartialCheck or (NewCheckState = csMixedNormal); end; end else if Run.CheckType in [ctCheckBox, ctTriStateCheckBox] then begin Inc(BoxCount); if Run.CheckState in [csCheckedNormal, csCheckedPressed] then Inc(CheckCount); PartialCheck := PartialCheck or (Run.CheckState = csMixedNormal); end; Run := Run.NextSibling; end; if (CheckCount = 0) and not PartialCheck then NewCheckState := csUncheckedNormal else if CheckCount < BoxCount then NewCheckState := csMixedNormal else NewCheckState := csCheckedNormal; Node := Node.Parent; Result := DoChecking(Node, NewCheckState); if Result then begin DoCheckClick(Node, NewCheckState); // Recursively adjust parent of parent. with Node^ do begin if not (vsInitialized in Parent.States) then InitNode(Parent); if ([vsChecking, vsDisabled] * Parent.States = []) and (Parent <> FRoot) and (Parent.CheckType = ctTriStateCheckBox) then Result := CheckParentCheckState(Node, NewCheckState); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.ClearTempCache; // make sure the temporary node cache is in a reliable state begin FTempNodeCache := nil; FTempNodeCount := 0; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.ColumnIsEmpty(Node: PVirtualNode; Column: TColumnIndex): Boolean; // Returns True if the given column is to be considered as being empty. This will usually be determined by // descendants as the base tree implementation has not enough information to decide. begin Result := True; if Assigned(FOnGetCellIsEmpty) then FOnGetCellIsEmpty(Self, Node, Column, Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.ComputeRTLOffset(ExcludeScrollbar: Boolean): Integer; // Computes the horizontal offset needed when all columns are automatically right aligned (in RTL bidi mode). // ExcludeScrollbar determines if the left-hand vertical scrollbar is to be included (if visible) or not. var HeaderWidth: Integer; ScrollbarVisible: Boolean; begin ScrollbarVisible := (Integer(FRangeY) > ClientHeight) and (ScrollbarOptions.Scrollbars in [ssVertical, ssBoth]); if ScrollbarVisible then Result := GetSystemMetrics(SM_CXVSCROLL) else Result := 0; // Make everything right aligned. HeaderWidth := FHeaderRect.Right - FHeaderRect.Left; if Integer(FRangeX) + Result <= HeaderWidth then Result := HeaderWidth - Integer(FRangeX); // Otherwise take only left-hand vertical scrollbar into account. if ScrollbarVisible and ExcludeScrollbar then Dec(Result, GetSystemMetrics(SM_CXVSCROLL)); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.CountLevelDifference(Node1, Node2: PVirtualNode): Integer; // This method counts how many indentation levels the given nodes are apart. If both nodes have the same parent then the // difference is 0 otherwise the result is basically GetNodeLevel(Node2) - GetNodeLevel(Node1), but with sign. // If the result is negative then Node2 is less intended than Node1. var Level1, Level2: Integer; begin Assert(Assigned(Node1) and Assigned(Node2), 'Both nodes must be Assigned.'); Level1 := 0; while Node1.Parent <> FRoot do begin Inc(Level1); Node1 := Node1.Parent; end; Level2 := 0; while Node2.Parent <> FRoot do begin Inc(Level2); Node2 := Node2.Parent; end; Result := Level2 - Level1; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.CountVisibleChildren(Node: PVirtualNode): Cardinal; // Returns the number of visible child nodes of the given node. begin Result := 0; // The node's direct children... if vsExpanded in Node.States then begin // ...and their children. Node := Node.FirstChild; while Assigned(Node) do begin if vsVisible in Node.States then Inc(Result, CountVisibleChildren(Node) + 1); Node := Node.NextSibling; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.CreateParams(var Params: TCreateParams); const ScrollBar: array[TScrollStyle] of Cardinal = (0, WS_HSCROLL, WS_VSCROLL, WS_HSCROLL or WS_VSCROLL, 0,0,0); begin //todo_lcl inherited CreateParams(Params); with Params do begin Style := Style or WS_CLIPCHILDREN or WS_CLIPSIBLINGS or ScrollBar[ScrollBarOptions.FScrollBars]; if toFullRepaintOnResize in FOptions.FMiscOptions then WindowClass.style := WindowClass.style or CS_HREDRAW or CS_VREDRAW else WindowClass.style := WindowClass.style and not (CS_HREDRAW or CS_VREDRAW); //lcl: Ctl3D is not used in LCL. Has the same meaning of BorderStyle = bsSingle { if BorderStyle = bsSingle then begin if Ctl3D then begin ExStyle := ExStyle or WS_EX_CLIENTEDGE; Style := Style and not WS_BORDER; end else Style := Style or WS_BORDER; end else Style := Style and not WS_BORDER; } //todo_lcl_low //AddBiDiModeExStyle(ExStyle); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.CreateWnd; // Initializes data which depends on a valid window handle. begin DoStateChange([tsWindowCreating]); inherited; {$ifdef DEBUG_VTV}Logger.Send([lcInfo],'Handle (CreateWnd)',Handle);{$endif} DoStateChange([], [tsWindowCreating]); {$ifdef ThemeSupport} if ThemeServices.ThemesEnabled and (toThemeAware in TreeOptions.PaintOptions) then begin DoStateChange([tsUseThemes]); //todo //if (toUseExplorerTheme in FOptions.FPaintOptions) and IsWinVistaOrAbove then // SetWindowTheme(Handle, 'explorer', nil); end else {$endif ThemeSupport} DoStateChange([], [tsUseThemes]); // Because of the special recursion and update stopper when creating the window (or resizing it) // we have to manually trigger the auto size calculation here. if hsNeedScaling in FHeader.FStates then FHeader.RescaleHeader; //lcl: Call with Force argument to true since AdjustAutoSize is not called in Loaded if hoAutoResize in FHeader.FOptions then FHeader.FColumns.AdjustAutoSize(InvalidColumn, True); // Initialize flat scroll bar library if required. {$ifdef UseFlatScrollbars} if FScrollBarOptions.FScrollBarStyle <> sbmRegular then begin InitializeFlatSB(Handle); FlatSB_SetScrollProp(Handle, WSB_PROP_HSTYLE, ScrollBarProp[FScrollBarOptions.ScrollBarStyle], False); FlatSB_SetScrollProp(Handle, WSB_PROP_VSTYLE, ScrollBarProp[FScrollBarOptions.ScrollBarStyle], False); end; {$endif UseFlatScrollbars} PrepareBitmaps(True, True); {$ifdef Windows} // Register tree as OLE drop target. if not (csDesigning in ComponentState) and (toAcceptOLEDrop in FOptions.FMiscOptions) then RegisterDragDrop(Handle, VTVDragManager as IDropTarget); {$endif} if toCheckSupport in FOptions.FMiscOptions then CheckImageListNeeded; UpdateScrollBars(True); UpdateHeaderRect; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DestroyHandle; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcMessages],'DestroyHandle');{$endif} //lcl: this code was originally called is response to WM_NCDESTROY // see if there will be issues calling here InterruptValidation; KillTimer(Handle, ChangeTimer); KillTimer(Handle, StructureChangeTimer); {$ifdef Windows} if not (csDesigning in ComponentState) and (toAcceptOLEDrop in FOptions.FMiscOptions) then RevokeDragDrop(Handle); {$endif} // Clean up other stuff. DeleteObject(FDottedBrush); FDottedBrush := 0; CancelEditNode; inherited; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'DestroyHandle');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DetermineHiddenChildrenFlag(Node: PVirtualNode); // Update the hidden children flag of the given node. var Run: PVirtualNode; begin if Node.ChildCount = 0 then begin if vsHasChildren in Node.States then Exclude(Node.States, vsAllChildrenHidden) else Include(Node.States, vsAllChildrenHidden); end else begin // Iterate through all siblings and stop when one visible is found. Run := Node.FirstChild; while Assigned(Run) do Run := Run.NextSibling; if Assigned(Run) then Exclude(Node.States, vsAllChildrenHidden) else Include(Node.States, vsAllChildrenHidden); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DetermineHiddenChildrenFlagAllNodes; var Run: PVirtualNode; begin Run := GetFirstNoInit(False); while Assigned(Run) do begin DetermineHiddenChildrenFlag(Run); Run := GetNextNoInit(Run); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DetermineHitPositionLTR(var HitInfo: THitInfo; Offset, Right: Integer; Alignment: TAlignment); // This method determines the hit position within a node with left-to-right orientation. var MainColumnHit: Boolean; Run: PVirtualNode; Indent, TextWidth, ImageOffset: Integer; begin MainColumnHit := HitInfo.HitColumn = FHeader.MainColumn; Indent := 0; // If columns are not used or the main column is hit then the tree indentation must be considered too. if MainColumnHit then begin if toFixedIndent in FOptions.FPaintOptions then Indent := FIndent else begin Run := HitInfo.HitNode; while (Run.Parent <> FRoot) do begin Inc(Indent, FIndent); Run := Run.Parent; end; if toShowRoot in FOptions.FPaintOptions then Inc(Indent, FIndent); end; end; if Offset < Indent then begin // Position is to the left of calculated indentation which can only happen for the main column. // Check whether it corresponds to a button/checkbox. if (toShowButtons in FOptions.FPaintOptions) and (vsHasChildren in HitInfo.HitNode.States) then begin // Position of button is interpreted very generously to avoid forcing the user // to click exactly into the 9x9 pixels area. The entire node height and one full // indentation level is accepted as button hit. if Offset >= Indent - Integer(FIndent) then Include(HitInfo.HitPositions, hiOnItemButton); if Offset >= Indent - FPlusBM.Width then Include(HitInfo.HitPositions, hiOnItemButtonExact); end; // no button hit so position is on indent if HitInfo.HitPositions = [] then Include(HitInfo.HitPositions, hiOnItemIndent); end else begin // The next hit positions can be: // - on the check box // - on the state image // - on the normal image // - to the left of the text area // - on the label or // - to the right of the text area // (in this order). // In report mode no hit other than in the main column is possible. if MainColumnHit or not (toReportMode in FOptions.FMiscOptions) then begin ImageOffset := Indent + FMargin; // Check support is only available for the main column. if MainColumnHit and (toCheckSupport in FOptions.FMiscOptions) and Assigned(FCheckImages) and (HitInfo.HitNode.CheckType <> ctNone) then Inc(ImageOffset, FCheckImages.Height + 2); if MainColumnHit and (Offset < ImageOffset) then begin HitInfo.HitPositions := [hiOnItem]; if (HitInfo.HitNode.CheckType <> ctNone) then Include(HitInfo.HitPositions, hiOnItemCheckBox); end else begin if Assigned(FStateImages) and HasImage(HitInfo.HitNode, ikState, HitInfo.HitColumn) then Inc(ImageOffset, FStateImages.Width + 2); if Offset < ImageOffset then Include(HitInfo.HitPositions, hiOnStateIcon) else begin if Assigned(FImages) and HasImage(HitInfo.HitNode, ikNormal, HitInfo.HitColumn) then Inc(ImageOffset, FImages.Width + 2); if Offset < ImageOffset then Include(HitInfo.HitPositions, hiOnNormalIcon) else begin // ImageOffset contains now the left border of the node label area. This is used to calculate the // correct alignment in the column. TextWidth := DoGetNodeWidth(HitInfo.HitNode, HitInfo.HitColumn); // Check if the text can be aligned at all. This is only possible if there is enough room // in the remaining text rectangle. if TextWidth > Right - ImageOffset then Include(HitInfo.HitPositions, hiOnItemLabel) else begin case Alignment of taCenter: begin Indent := (ImageOffset + Right - TextWidth) div 2; if Offset < Indent then Include(HitInfo.HitPositions, hiOnItemLeft) else if Offset < Indent + TextWidth then Include(HitInfo.HitPositions, hiOnItemLabel) else Include(HitInfo.HitPositions, hiOnItemRight) end; taRightJustify: begin Indent := Right - TextWidth; if Offset < Indent then Include(HitInfo.HitPositions, hiOnItemLeft) else Include(HitInfo.HitPositions, hiOnItemLabel); end; else // taLeftJustify if Offset < ImageOffset + TextWidth then Include(HitInfo.HitPositions, hiOnItemLabel) else Include(HitInfo.HitPositions, hiOnItemRight); end; end; end; end; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DetermineHitPositionRTL(var HitInfo: THitInfo; Offset, Right: Integer; Alignment: TAlignment); // This method determines the hit position within a node with right-to-left orientation. var MainColumnHit: Boolean; Run: PVirtualNode; Indent, TextWidth, ImageOffset: Integer; begin MainColumnHit := HitInfo.HitColumn = FHeader.MainColumn; // If columns are not used or the main column is hit then the tree indentation must be considered too. if MainColumnHit then begin if toFixedIndent in FOptions.FPaintOptions then Dec(Right, FIndent) else begin Run := HitInfo.HitNode; while (Run.Parent <> FRoot) do begin Dec(Right, FIndent); Run := Run.Parent; end; if toShowRoot in FOptions.FPaintOptions then Dec(Right, FIndent); end; end; if Offset >= Right then begin // Position is to the right of calculated indentation which can only happen for the main column. // Check whether it corresponds to a button/checkbox. if (toShowButtons in FOptions.FPaintOptions) and (vsHasChildren in HitInfo.HitNode.States) then begin // Position of button is interpreted very generously to avoid forcing the user // to click exactly into the 9x9 pixels area. The entire node height and one full // indentation level is accepted as button hit. if Offset <= Right + Integer(FIndent) then Include(HitInfo.HitPositions, hiOnItemButton); if Offset <= Right + FPlusBM.Width then Include(HitInfo.HitPositions, hiOnItemButtonExact); end; // no button hit so position is on indent if HitInfo.HitPositions = [] then Include(HitInfo.HitPositions, hiOnItemIndent); end else begin // The next hit positions can be: // - on the check box // - on the state image // - on the normal image // - to the left of the text area // - on the label or // - to the right of the text area // (in this order). // In report mode no hit other than in the main column is possible. if MainColumnHit or not (toReportMode in FOptions.FMiscOptions) then begin ImageOffset := Right - FMargin; // Check support is only available for the main column. if MainColumnHit and (toCheckSupport in FOptions.FMiscOptions) and Assigned(FCheckImages) and (HitInfo.HitNode.CheckType <> ctNone) then Dec(ImageOffset, FCheckImages.Height + 2); if MainColumnHit and (Offset > ImageOffset) then begin HitInfo.HitPositions := [hiOnItem]; if (HitInfo.HitNode.CheckType <> ctNone) then Include(HitInfo.HitPositions, hiOnItemCheckBox); end else begin if Assigned(FStateImages) and HasImage(HitInfo.HitNode, ikState, HitInfo.HitColumn) then Dec(ImageOffset, FStateImages.Width + 2); if Offset > ImageOffset then Include(HitInfo.HitPositions, hiOnStateIcon) else begin if Assigned(FImages) and HasImage(HitInfo.HitNode, ikNormal, HitInfo.HitColumn) then Dec(ImageOffset, FImages.Width + 2); if Offset > ImageOffset then Include(HitInfo.HitPositions, hiOnNormalIcon) else begin // ImageOffset contains now the right border of the node label area. This is used to calculate the // correct alignment in the column. TextWidth := DoGetNodeWidth(HitInfo.HitNode, HitInfo.HitColumn); // Check if the text can be aligned at all. This is only possible if there is enough room // in the remaining text rectangle. if TextWidth > ImageOffset then Include(HitInfo.HitPositions, hiOnItemLabel) else begin // Consider bidi mode here. In RTL context does left alignment actually mean right alignment // and vice versa. ChangeBiDiModeAlignment(Alignment); case Alignment of taCenter: begin Indent := (ImageOffset - TextWidth) div 2; if Offset < Indent then Include(HitInfo.HitPositions, hiOnItemLeft) else if Offset < Indent + TextWidth then Include(HitInfo.HitPositions, hiOnItemLabel) else Include(HitInfo.HitPositions, hiOnItemRight) end; taRightJustify: begin Indent := ImageOffset - TextWidth; if Offset < Indent then Include(HitInfo.HitPositions, hiOnItemLeft) else Include(HitInfo.HitPositions, hiOnItemLabel); end; else // taLeftJustify if Offset > TextWidth then Include(HitInfo.HitPositions, hiOnItemRight) else Include(HitInfo.HitPositions, hiOnItemLabel); end; end; end; end; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DetermineNextCheckState(CheckType: TCheckType; CheckState: TCheckState): TCheckState; // Determines the next check state in case the user click the check image or pressed the space key. begin case CheckType of ctTriStateCheckBox, ctCheckBox: if CheckState = csCheckedNormal then Result := csUncheckedNormal else Result := csCheckedNormal; ctRadioButton: Result := csCheckedNormal; ctButton: Result := csUncheckedNormal; else Result := csMixedNormal; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DetermineScrollDirections(X, Y: Integer): TScrollDirections; // Determines which direction the client area must be scrolled depending on the given position. begin Result:= []; if CanAutoScroll then begin // Calculation for wheel panning/scrolling is a bit different to normal auto scroll. if [tsWheelPanning, tsWheelScrolling] * FStates <> [] then begin if (X - FLastClickPos.X) < -8 then Include(Result, sdLeft); if (X - FLastClickPos.X) > 8 then Include(Result, sdRight); if (Y - FLastClickPos.Y) < -8 then Include(Result, sdUp); if (Y - FLastClickPos.Y) > 8 then Include(Result, sdDown); end else begin if (X < Integer(FDefaultNodeHeight)) and (FEffectiveOffsetX <> 0) then Include(Result, sdLeft); if (ClientWidth + FEffectiveOffsetX < Integer(FRangeX)) and (X > ClientWidth - Integer(FDefaultNodeHeight)) then Include(Result, sdRight); //lclheader if (ClientHeight - FOffsetY < Integer(FRangeY)) and (Y > inherited GetClientRect.Bottom - Integer(FDefaultNodeHeight)) then Include(Result, sdDown); if hoVisible in FHeader.FOptions then Dec(Y, FHeader.Height); if (Y < Integer(FDefaultNodeHeight)) and (FOffsetY <> 0) then Include(Result, sdUp); //todo: probably the code below is bug due to poor timeGetTime implementation // Since scrolling during dragging is not handled via the timer we do a check here whether the auto // scroll timeout already has elapsed or not. if (Result <> []) and ((Assigned(FDragManager) and VTVDragManager.IsDropTarget) or (FindDragTarget(Point(X, Y), False) = Self)) then begin if FDragScrollStart = 0 then FDragScrollStart := timeGetTime; // Reset any scroll direction to avoid scroll in the case the user is dragging and the auto scroll time has not // yet elapsed. if ((timeGetTime - FDragScrollStart) < FAutoScrollDelay) then Result := []; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoAdvancedHeaderDraw(var PaintInfo: THeaderPaintInfo; const Elements: THeaderPaintElements); begin if Assigned(FOnAdvancedHeaderDraw) then FOnAdvancedHeaderDraw(FHeader, PaintInfo, Elements); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoAfterCellPaint(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const CellRect: TRect); begin if Assigned(FOnAfterCellPaint) then FOnAfterCellPaint(Self, Canvas, Node, Column, CellRect); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoAfterItemErase(Canvas: TCanvas; Node: PVirtualNode; const ItemRect: TRect); begin if Assigned(FOnAfterItemErase) then FOnAfterItemErase(Self, Canvas, Node, ItemRect); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoAfterItemPaint(Canvas: TCanvas; Node: PVirtualNode; const ItemRect: TRect); begin if Assigned(FOnAfterItemPaint) then FOnAfterItemPaint(Self, Canvas, Node, ItemRect); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoAfterPaint(Canvas: TCanvas); begin if Assigned(FOnAfterPaint) then FOnAfterPaint(Self, Canvas); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoAutoScroll(X, Y: Integer); begin FScrollDirections := DetermineScrollDirections(X, Y); if FStates * [tsWheelPanning, tsWheelScrolling] = [] then begin if FScrollDirections = [] then begin if ((FStates * [tsScrollPending, tsScrolling]) <> []) then begin KillTimer(Handle, ScrollTimer); DoStateChange([], [tsScrollPending, tsScrolling]); end; end else begin // start auto scroll if not yet done if (FStates * [tsScrollPending, tsScrolling]) = [] then begin DoStateChange([tsScrollPending]); SetTimer(Handle, ScrollTimer, FAutoScrollDelay, nil); end; end; end; end; procedure TBaseVirtualTree.DoAutoSize; begin //The default DoAutoSize makes the editors be placed wrongly when scrolling end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoBeforeDrag(Node: PVirtualNode; Column: TColumnIndex): Boolean; begin Result := False; if Assigned(FOnDragAllowed) then FOnDragAllowed(Self, Node, Column, Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoBeforeCellPaint(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect); {$ifdef LCLWin32} var UpdateRect: TRect; {$endif} begin //todo: implement under non win32 if Assigned(FOnBeforeCellPaint) then begin {$ifdef LCLWin32} if CellPaintMode = cpmGetContentMargin then begin // Prevent drawing if we are only about to get the margin. As this also clears the update rect we need to save it. GetUpdateRect(Handle, UpdateRect, False); SetUpdateState(True); end; {$endif} FOnBeforeCellPaint(Self, Canvas, Node, Column, CellPaintMode, CellRect, ContentRect); {$ifdef LCLWin32} if CellPaintMode = cpmGetContentMargin then begin SetUpdateState(False); InvalidateRect(Handle, @UpdateRect, False); end; {$endif} end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoBeforeItemErase(Canvas: TCanvas; Node: PVirtualNode; const ItemRect: TRect; var Color: TColor; var EraseAction: TItemEraseAction); begin if Assigned(FOnBeforeItemErase) then FOnBeforeItemErase(Self, Canvas, Node, ItemRect, Color, EraseAction); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoBeforeItemPaint(Canvas: TCanvas; Node: PVirtualNode; const ItemRect: TRect): Boolean; begin // By default custom draw will not be used, so the tree handles drawing the node. Result := False; if Assigned(FOnBeforeItemPaint) then FOnBeforeItemPaint(Self, Canvas, Node, ItemRect, Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoBeforePaint(Canvas: TCanvas); begin if Assigned(FOnBeforePaint) then FOnBeforePaint(Self, Canvas); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoCancelEdit: Boolean; // Called when the current edit action or a pending edit must be cancelled. begin KillTimer(Handle, EditTimer); DoStateChange([], [tsEditPending]); Result := (tsEditing in FStates) and FEditLink.CancelEdit; if Result then begin DoStateChange([], [tsEditing]); if Assigned(FOnEditCancelled) then FOnEditCancelled(Self, FEditColumn); FEditLink := nil; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoCanEdit(Node: PVirtualNode; Column: TColumnIndex; var Allowed: Boolean); begin if Assigned(FOnEditing) then FOnEditing(Self, Node, Column, Allowed); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoChange(Node: PVirtualNode); begin KillTimer(Handle, ChangeTimer); if Assigned(FOnChange) then FOnChange(Self, Node); // This is a good place to reset the cached node. This is the same as the node passed in here. // This is necessary to allow descendants to override this method and get the node then. DoStateChange([], [tsChangePending]); FLastChangedNode := nil; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoCheckClick(Node: PVirtualNode; NewCheckState: TCheckState); begin if ChangeCheckState(Node, NewCheckState) then DoChecked(Node); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoChecked(Node: PVirtualNode); begin if Assigned(FOnChecked) then FOnChecked(Self, Node); {$ifdef EnableAccessible} NotifyWinEvent(EVENT_OBJECT_STATECHANGE, Handle, OBJID_CLIENT, CHILDID_SELF); {$endif} end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoChecking(Node: PVirtualNode; var NewCheckState: TCheckState): Boolean; // Determines if a node is allowed to change its check state to NewCheckState. begin if toReadOnly in FOptions.FMiscOptions then Result := False else begin Result := True; if Assigned(FOnChecking) then FOnChecking(Self, Node, NewCheckState, Result); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoCollapsed(Node: PVirtualNode); begin if Assigned(FOnCollapsed) then FOnCollapsed(Self, Node); {$ifdef EnableAccessible} NotifyWinEvent(EVENT_OBJECT_STATECHANGE, Handle, OBJID_CLIENT, CHILDID_SELF); {$endif} end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoCollapsing(Node: PVirtualNode): Boolean; begin Result := True; if Assigned(FOnCollapsing) then FOnCollapsing(Self, Node, Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoColumnClick(Column: TColumnIndex; Shift: TShiftState); begin if Assigned(FOnColumnClick) then FOnColumnClick(Self, Column, Shift); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoColumnDblClick(Column: TColumnIndex; Shift: TShiftState); begin if Assigned(FOnColumnDblClick) then FOnColumnDblClick(Self, Column, Shift); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoColumnResize(Column: TColumnIndex); var R: TRect; Run: PVirtualNode; begin if not (csLoading in ComponentState) and HandleAllocated then begin // Reset all vsHeightMeasured flags if we are in multiline mode. Run := GetFirstInitialized; while Assigned(Run) do begin if vsMultiline in Run.States then Exclude(Run.States, vsHeightMeasured); Run := GetNextInitialized(Run); end; UpdateHorizontalScrollBar(True); if Column > NoColumn then begin // Invalidate client area from the current column all to the right (or left in RTL mode). R := ClientRect; //lclheader if hoVisible in FHeader.FOptions then Inc(R.Bottom, FHeader.Height); if not (toAutoSpanColumns in FOptions.FAutoOptions) then if UseRightToLeftAlignment then R.Right := FHeader.Columns[Column].Left + FHeader.Columns[Column].Width + ComputeRTLOffset else R.Left := FHeader.Columns[Column].Left; InvalidateRect(Handle, @R, False); FHeader.Invalidate(FHeader.Columns[Column], True); end; if [hsColumnWidthTracking, hsResizing] * FHeader.States = [hsColumnWidthTracking] then UpdateWindow(Handle); if not (tsUpdating in FStates) then UpdateDesigner; // design time only if Assigned(FOnColumnResize) and not (hsResizing in FHeader.States) then FOnColumnResize(FHeader, Column); // If the tree is currently in edit state then notify edit link. if tsEditing in FStates then UpdateEditBounds; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoCompare(Node1, Node2: PVirtualNode; Column: TColumnIndex): Integer; begin Result := 0; if Assigned(FOnCompareNodes) then FOnCompareNodes(Self, Node1, Node2, Column, Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoCreateDataObject: IDataObject; begin Result := nil; if Assigned(FOnCreateDataObject) then FOnCreateDataObject(Self, Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoCreateDragManager: IVTDragManager; begin Result := nil; if Assigned(FOnCreateDragManager) then FOnCreateDragManager(Self, Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoCreateEditor(Node: PVirtualNode; Column: TColumnIndex): IVTEditLink; begin Result := nil; if Assigned(FOnCreateEditor) then begin FOnCreateEditor(Self, Node, Column, Result); if Result = nil then ShowError(SEditLinkIsNil, hcTFEditLinkIsNil); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoDragging(P: TPoint); // Initiates finally the drag'n drop operation and returns after DD is finished. //--------------- local function -------------------------------------------- function GetDragOperations: LongWord; begin if FDragOperations = [] then Result := DROPEFFECT_COPY or DROPEFFECT_MOVE or DROPEFFECT_LINK else begin Result := 0; if doCopy in FDragOperations then Result := Result or DROPEFFECT_COPY; if doLink in FDragOperations then Result := Result or DROPEFFECT_LINK; if doMove in FDragOperations then Result := Result or DROPEFFECT_MOVE; end; end; //--------------- end local function ---------------------------------------- var DragEffect, AllowedEffects: LongWord; I: Integer; DragObject: TDragObject; DataObject: IDataObject; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcDrag],'DoDragging');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcDrag],'Stack');{$endif} DataObject := nil; // Dragging is dragging, nothing else. DoCancelEdit; if Assigned(FCurrentHotNode) then begin InvalidateNode(FCurrentHotNode); FCurrentHotNode := nil; end; // Select the focused node if not already done. if Assigned(FFocusedNode) and not (vsSelected in FFocusedNode.States) then begin InternalAddToSelection(FFocusedNode, False); InvalidateNode(FFocusedNode); end; UpdateWindow(Handle); // Keep a list of all currently selected nodes as this list might change, // but we have probably to delete currently selected nodes. FDragSelection := GetSortedSelection(True); try DoStateChange([tsOLEDragging], [tsOLEDragPending, tsClearPending]); // An application might create a drag object like used during VCL dd. This is not required for OLE dd but // required as parameter. DragObject := nil; DoStartDrag(DragObject); DragObject.Free; DataObject := VTVDragManager.DataObject; PrepareDragImage(P, DataObject); FLastDropMode := dmOnNode; // Don't forget to initialize the result. It might never be touched. DragEffect := DROPEFFECT_NONE; AllowedEffects := GetDragOperations; try DragAndDrop(AllowedEffects, DataObject, DragEffect); VTVDragManager.ForceDragLeave; finally GetCursorPos(P); P := ScreenToClient(P); DoEndDrag(Self, P.X, P.Y); FDragImage.EndDrag; // Finish the operation. if (DragEffect = DROPEFFECT_MOVE) and (toAutoDeleteMovedNodes in TreeOptions.AutoOptions) then begin // The operation was a move so delete the previously selected nodes. BeginUpdate; try // The list of selected nodes was retrieved in resolved state. That means there can never be a node // in the list whose parent (or its parent etc.) is also selected. for I := 0 to High(FDragSelection) do DeleteNode(FDragSelection[I]); finally EndUpdate; end; end; DoStateChange([], [tsOLEDragging]); end; finally FDragSelection := nil; end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcDrag],'DoDragging');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoDragExpand; var SourceTree: TBaseVirtualTree; begin KillTimer(Handle, ExpandTimer); if Assigned(FDropTargetNode) and (vsHasChildren in FDropTargetNode.States) and not (vsExpanded in FDropTargetNode.States) then begin if Assigned(FDragManager) then SourceTree := TBaseVirtualTree(VTVDragManager.DragSource) else SourceTree := nil; if not VTVDragManager.DropTargetHelperSupported and Assigned(SourceTree) then SourceTree.FDragImage.HideDragImage; ToggleNode(FDropTargetNode); UpdateWindow(Handle); if not VTVDragManager.DropTargetHelperSupported and Assigned(SourceTree) then SourceTree.FDragImage.ShowDragImage; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoDragOver(Source: TObject; Shift: TShiftState; State: TDragState; const Pt: TPoint; Mode: TDropMode; var Effect: LongWord): Boolean; begin Result := False; if Assigned(FOnDragOver) then FOnDragOver(Self, Source, Shift, State, Pt, Mode, Effect, Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoDragDrop(Source: TObject; DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState; const Pt: TPoint; var Effect: LongWord; Mode: TDropMode); begin if Assigned(FOnDragDrop) then FOnDragDrop(Self, Source, {DataObject, }Formats, Shift, Pt, Effect, Mode); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoEdit; begin Application.CancelHint; KillTimer(Handle, ScrollTimer); KillTimer(Handle, EditTimer); DoStateChange([], [tsEditPending]); if Assigned(FFocusedNode) and not (vsDisabled in FFocusedNode.States) and not (toReadOnly in FOptions.FMiscOptions) and (FEditLink = nil) then begin FEditLink := DoCreateEditor(FFocusedNode, FEditColumn); if Assigned(FEditLink) then begin DoStateChange([tsEditing], [tsDrawSelecting, tsDrawSelPending, tsToggleFocusedSelection, tsOLEDragPending, tsOLEDragging, tsClearPending, tsScrollPending, tsScrolling, tsMouseCheckPending]); ScrollIntoView(FFocusedNode, toCenterScrollIntoView in FOptions.SelectionOptions, not (toDisableAutoscrollOnEdit in FOptions.AutoOptions)); if FEditLink.PrepareEdit(Self, FFocusedNode, FEditColumn) then begin UpdateEditBounds; // Node needs repaint because the selection rectangle and static text must disappear. InvalidateNode(FFocusedNode); if not FEditLink.BeginEdit then DoStateChange([], [tsEditing]); end else DoStateChange([], [tsEditing]); if not (tsEditing in FStates) then FEditLink := nil; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoEndDrag(Target: TObject; X, Y: Integer); // Does some housekeeping for VCL drag'n drop; begin inherited; DragFinished; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoEndEdit: Boolean; begin KillTimer(Handle, EditTimer); Result := (tsEditing in FStates) and FEditLink.EndEdit; if Result then begin DoStateChange([], [tsEditing]); FEditLink := nil; if Assigned(FOnEdited) then FOnEdited(Self, FFocusedNode, FEditColumn); end; DoStateChange([], [tsEditPending]); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoExpanded(Node: PVirtualNode); begin if Assigned(FOnExpanded) then FOnExpanded(Self, Node); {$ifdef EnableAccessible} NotifyWinEvent(EVENT_OBJECT_STATECHANGE, Handle, OBJID_CLIENT, CHILDID_SELF); {$endif} end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoExpanding(Node: PVirtualNode): Boolean; begin Result := True; if Assigned(FOnExpanding) then FOnExpanding(Self, Node, Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoFocusChange(Node: PVirtualNode; Column: TColumnIndex); begin if Assigned(FOnFocusChanged) then FOnFocusChanged(Self, Node, Column); {$ifdef EnableAccessible} NotifyWinEvent(EVENT_OBJECT_LOCATIONCHANGE, Handle, OBJID_CLIENT, CHILDID_SELF); NotifyWinEvent(EVENT_OBJECT_NAMECHANGE, Handle, OBJID_CLIENT, CHILDID_SELF); NotifyWinEvent(EVENT_OBJECT_VALUECHANGE, Handle, OBJID_CLIENT, CHILDID_SELF); NotifyWinEvent(EVENT_OBJECT_STATECHANGE, Handle, OBJID_CLIENT, CHILDID_SELF); NotifyWinEvent(EVENT_OBJECT_SELECTION, Handle, OBJID_CLIENT, CHILDID_SELF); NotifyWinEvent(EVENT_OBJECT_FOCUS, Handle, OBJID_CLIENT, CHILDID_SELF); {$endif} end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoFocusChanging(OldNode, NewNode: PVirtualNode; OldColumn, NewColumn: TColumnIndex): Boolean; begin Result := (OldColumn = NewColumn) or FHeader.AllowFocus(NewColumn); if Assigned(FOnFocusChanging) then FOnFocusChanging(Self, OldNode, NewNode, OldColumn, NewColumn, Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoFocusNode(Node: PVirtualNode; Ask: Boolean); begin if not (tsEditing in FStates) or EndEditNode then begin if Node = FRoot then Node := nil; if (FFocusedNode <> Node) and (not Ask or DoFocusChanging(FFocusedNode, Node, FFocusedColumn, FFocusedColumn)) then begin if Assigned(FFocusedNode) then begin // Do automatic collapsing of last focused node if enabled. This is however only done if // old and new focused node have a common parent node. if (toAutoExpand in FOptions.FAutoOptions) and Assigned(Node) and (Node.Parent = FFocusedNode.Parent) and (vsExpanded in FFocusedNode.States) then ToggleNode(FFocusedNode) else InvalidateNode(FFocusedNode); end; FFocusedNode := Node; end; // Have to scroll the node into view, even it is the same node as before. if Assigned(FFocusedNode) then begin // Make sure a valid column is set if columns are used and no column has currently the focus. if FHeader.UseColumns and (not FHeader.FColumns.IsValidColumn(FFocusedColumn)) then FFocusedColumn := FHeader.MainColumn; // Do automatic expansion of the newly focused node if enabled. if (toAutoExpand in FOptions.FAutoOptions) and not (vsExpanded in FFocusedNode.States) then ToggleNode(FFocusedNode); InvalidateNode(FFocusedNode); if (FUpdateCount = 0) and not (toDisableAutoscrollOnFocus in FOptions.FAutoOptions) then ScrollIntoView(FFocusedNode, (toCenterScrollIntoView in FOptions.SelectionOptions) and (MouseButtonDown * FStates = []), not (toDisableAutoscrollHorizontal in FOptions.FAutoOptions)); end; // Reset range anchor if necessary. if FSelectionCount = 0 then ResetRangeAnchor; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoFreeNode(Node: PVirtualNode); begin if Node = FLastChangedNode then FLastChangedNode := nil; if Node = FCurrentHotNode then FCurrentHotNode := nil; if Node = FDropTargetNode then FDropTargetNode := nil; if Assigned(FOnFreeNode) and ([vsInitialized, vsInitialUserData] * Node.States <> []) then FOnFreeNode(Self, Node); FreeMem(Node); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoGetCellContentMargin(Node: PVirtualNode; Column: TColumnIndex; CellContentMarginType: TVTCellContentMarginType = ccmtAllSides; Canvas: TCanvas = nil): TPoint; // Determines the margins of the content rectangle caused by DoBeforeCellPaint. // Note that shrinking the content rectangle results in positive margins whereas enlarging the content rectangle results // in negative margins. var CellRect, ContentRect: TRect; begin Result := Point(0, 0); if Assigned(FOnBeforeCellPaint) then // Otherwise DoBeforeCellPaint has no effect. begin if Canvas = nil then Canvas := Self.Canvas; // Determine then node's cell rectangle and content rectangle before calling DoBeforeCellPaint. CellRect := GetDisplayRect(Node, Column, True); ContentRect := CellRect; DoBeforeCellPaint(Canvas, Node, Column, cpmGetContentMargin, CellRect, ContentRect); // Calculate the changes caused by DoBeforeCellPaint. case CellContentMarginType of ccmtAllSides: // Calculate the width difference and high difference. Result := Point((CellRect.Right - CellRect.Left) - (ContentRect.Right - ContentRect.Left), (CellRect.Bottom - CellRect.Top) - (ContentRect.Bottom - ContentRect.Top)); ccmtTopLeftOnly: // Calculate the left margin and top margin only. Result := Point(ContentRect.Left - CellRect.Left, ContentRect.Top - CellRect.Top); ccmtBottomRightOnly: // Calculate the right margin and bottom margin only. Result := Point(CellRect.Right - ContentRect.Right, CellRect.Bottom - ContentRect.Bottom); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoGetCursor(var Cursor: TCursor); begin if Assigned(FOnGetCursor) then FOnGetCursor(Self, Cursor); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoGetHeaderCursor(var Cursor: HCURSOR); begin if Assigned(FOnGetHeaderCursor) then FOnGetHeaderCursor(FHeader, Cursor); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoGetImageIndex(Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var Index: Integer): TCustomImageList; // Queries the application/descendant about certain image properties for a node. // Returns a custom image list if given by the callee, otherwise nil. begin Result := nil; // First try the enhanced event to allow for custom image lists. if Assigned(FOnGetImageEx) then FOnGetImageEx(Self, Node, Kind, Column, Ghosted, Index, Result) else if Assigned(FOnGetImage) then FOnGetImage(Self, Node, Kind, Column, Ghosted, Index); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoGetImageText(Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var ImageText: String); // Queries the application/descendant about alternative image text for a node. begin if Assigned(FOnGetImageText) then FOnGetImageText(Self, Node, Kind, Column, ImageText); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoGetLineStyle(var Bits: Pointer); begin if Assigned(FOnGetLineStyle) then FOnGetLineStyle(Self, Bits); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoGetNodeHint(Node: PVirtualNode; Column: TColumnIndex; var LineBreakStyle: TVTTooltipLineBreakStyle): String; begin Result := Hint; LineBreakStyle := hlbDefault; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoGetNodeTooltip(Node: PVirtualNode; Column: TColumnIndex; var LineBreakStyle: TVTTooltipLineBreakStyle): String; begin Result := Hint; LineBreakStyle := hlbDefault; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoGetNodeWidth(Node: PVirtualNode; Column: TColumnIndex; Canvas: TCanvas = nil): Integer; begin Result := 0; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoGetPopupMenu(Node: PVirtualNode; Column: TColumnIndex; const Position: TPoint): TPopupMenu; // Queries the application whether there is a node specific popup menu. var Run: PVirtualNode; AskParent: Boolean; begin Result := nil; if Assigned(FOnGetPopupMenu) then begin Run := Node; if Assigned(Run) then begin AskParent := True; repeat FOnGetPopupMenu(Self, Run, Column, Position, AskParent, Result); Run := Run.Parent; until (Run = FRoot) or Assigned(Result) or not AskParent; end else FOnGetPopupMenu(Self, nil, -1, Position, AskParent, Result); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoGetUserClipboardFormats(var Formats: TFormatEtcArray); begin if Assigned(FOnGetUserClipboardFormats) then FOnGetUserClipboardFormats(Self, Formats); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoHeaderClick(Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Assigned(FOnHeaderClick) then FOnHeaderClick(FHeader, Column, Button, Shift, X, Y); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoHeaderDblClick(Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Assigned(FOnHeaderDblClick) then FOnHeaderDblClick(FHeader, Column, Button, Shift, X, Y); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoHeaderImageClick(Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Assigned(FOnHeaderImageClick) then FOnHeaderImageClick(FHeader, Column, Button, Shift, X, Y) else if Assigned(FOnHeaderClick) then FOnHeaderClick(FHeader, Column, Button, Shift, X, Y) end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoHeaderCheckBoxClick(Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Assigned(FOnHeaderCheckBoxClick) then FOnHeaderCheckBoxClick(FHeader, Column, Button, Shift, X, Y); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoHeaderDragged(Column: TColumnIndex; OldPosition: TColumnPosition); begin if Assigned(FOnHeaderDragged) then FOnHeaderDragged(FHeader, Column, OldPosition); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoHeaderDraggedOut(Column: TColumnIndex; const DropPosition: TPoint); begin if Assigned(FOnHeaderDraggedOut) then FOnHeaderDraggedOut(FHeader, Column, DropPosition); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoHeaderDragging(Column: TColumnIndex): Boolean; begin Result := True; if Assigned(FOnHeaderDragging) then FOnHeaderDragging(FHeader, Column, Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoHeaderDraw(Canvas: TCanvas; Column: TVirtualTreeColumn; const R: TRect; Hover, Pressed: Boolean; DropMark: TVTDropMarkMode); begin if Assigned(FOnHeaderDraw) then FOnHeaderDraw(FHeader, Canvas, Column, R, Hover, Pressed, DropMark); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoHeaderDrawQueryElements(var PaintInfo: THeaderPaintInfo; var Elements: THeaderPaintElements); begin if Assigned(FOnHeaderDrawQueryElements) then FOnHeaderDrawQueryElements(FHeader, PaintInfo, Elements); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoHeaderMouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Assigned(FOnHeaderMouseDown) then FOnHeaderMouseDown(FHeader, Button, Shift, X, Y); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoHeaderMouseMove(Shift: TShiftState; X, Y: Integer); begin if Assigned(FOnHeaderMouseMove) then FOnHeaderMouseMove(FHeader, Shift, X, Y); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoHeaderMouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Assigned(FOnHeaderMouseUp) then FOnHeaderMouseUp(FHeader, Button, Shift, X, Y); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoHotChange(Old, New: PVirtualNode); begin if Assigned(FOnHotChange) then FOnHotChange(Self, Old, New); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoIncrementalSearch(Node: PVirtualNode; const Text: String): Integer; begin Result := 0; if Assigned(FOnIncrementalSearch) then FOnIncrementalSearch(Self, Node, Text, Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoInitChildren(Node: PVirtualNode; var ChildCount: Cardinal); begin if Assigned(FOnInitChildren) then FOnInitChildren(Self, Node, ChildCount); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoInitNode(Parent, Node: PVirtualNode; var InitStates: TVirtualNodeInitStates); begin if Assigned(FOnInitNode) then FOnInitNode(Self, Parent, Node, InitStates); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoKeyAction(var CharCode: Word; var Shift: TShiftState): Boolean; begin Result := True; if Assigned(FOnKeyAction) then FOnKeyAction(Self, CharCode, Shift, Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoLoadUserData(Node: PVirtualNode; Stream: TStream); begin if Assigned(FOnLoadNode) then if Node = FRoot then FOnLoadNode(Self, nil, Stream) else FOnLoadNode(Self, Node, Stream); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoMeasureItem(TargetCanvas: TCanvas; Node: PVirtualNode; var NodeHeight: Integer); begin if Assigned(FOnMeasureItem) then FOnMeasureItem(Self, TargetCanvas, Node, NodeHeight); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoNodeCopied(Node: PVirtualNode); begin if Assigned(FOnNodeCopied) then FOnNodeCopied(Self, Node); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoNodeCopying(Node, NewParent: PVirtualNode): Boolean; begin Result := True; if Assigned(FOnNodeCopying) then FOnNodeCopying(Self, Node, NewParent, Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoNodeHeightDblClickResize(Node: PVirtualNode; Column: TColumnIndex; Shift: TShiftState; P: TPoint): Boolean; begin Result := True; if Assigned(FOnNodeHeightDblClickResize) then FOnNodeHeightDblClickResize(Self, Node, Column, Shift, P, Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoNodeHeightTracking(Node: PVirtualNode; Column: TColumnIndex; Shift: TShiftState; var TrackPoint: TPoint; P: TPoint): Boolean; begin Result := True; if Assigned(FOnNodeHeightTracking) then FOnNodeHeightTracking(Self, Node, Column, Shift, TrackPoint, P, Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoNodeMoved(Node: PVirtualNode); begin if Assigned(FOnNodeMoved) then FOnNodeMoved(Self, Node); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoNodeMoving(Node, NewParent: PVirtualNode): Boolean; begin Result := True; if Assigned(FOnNodeMoving) then FOnNodeMoving(Self, Node, NewParent, Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoPaintBackground(Canvas: TCanvas; const R: TRect): Boolean; begin Result := False; if Assigned(FOnPaintBackground) then FOnPaintBackground(Self, Canvas, R, Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoPaintDropMark(Canvas: TCanvas; Node: PVirtualNode; const R: TRect); // draws the drop mark into the given rectangle // Note: Changed properties of the given canvas should be reset to their previous values. var SaveBrushColor: TColor; SavePenStyle: TPenStyle; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcDrag],'DoPaintDropMark');{$endif} if FLastDropMode in [dmAbove, dmBelow] then with Canvas do begin {$ifdef DEBUG_VTV}Logger.Send([lcDrag],'DropMode in [dmAbove,dmBelow]');{$endif} SavePenStyle := Pen.Style; Pen.Style := psClear; SaveBrushColor := Brush.Color; Brush.Color := FColors.DropMarkColor; {$ifdef DEBUG_VTV}Logger.SendColor([lcDrag],'Brush.Color',Brush.Color);{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcDrag],'R',R);{$endif} if FLastDropMode = dmAbove then begin Polygon([Point(R.Left + 2, R.Top), Point(R.Right - 2, R.Top), Point(R.Right - 2, R.Top + 6), Point(R.Right - 6, R.Top + 2), Point(R.Left + 6 , R.Top + 2), Point(R.Left + 2, R.Top + 6) ]); end else Polygon([Point(R.Left + 2, R.Bottom - 1), Point(R.Right - 2, R.Bottom - 1), Point(R.Right - 2, R.Bottom - 8), Point(R.Right - 7, R.Bottom - 3), Point(R.Left + 7 , R.Bottom - 3), Point(R.Left + 2, R.Bottom - 8) ]); Brush.Color := SaveBrushColor; Pen.Style := SavePenStyle; end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcDrag],'DoPaintDropMark');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoPaintNode(var PaintInfo: TVTPaintInfo); begin end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoPopupMenu(Node: PVirtualNode; Column: TColumnIndex; const Position: TPoint); // Support for node dependent popup menus. var Menu: TPopupMenu; begin Menu := DoGetPopupMenu(Node, Column, Position); if Assigned(Menu) then begin DoStateChange([tsPopupMenuShown]); KillTimer(Handle, EditTimer); Menu.PopupComponent := Self; with ClientToScreen(Position) do Menu.Popup(X, Y); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoRenderOLEData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean): HRESULT; begin Result := E_FAIL; if Assigned(FOnRenderOLEData) then FOnRenderOLEData(Self, FormatEtcIn, Medium, ForClipboard, Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoReset(Node: PVirtualNode); begin if Assigned(FOnResetNode) then FOnResetNode(Self, Node); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoSaveUserData(Node: PVirtualNode; Stream: TStream); begin if Assigned(FOnSaveNode) then if Node = FRoot then FOnSaveNode(Self, nil, Stream) else FOnSaveNode(Self, Node, Stream); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoScroll(DeltaX, DeltaY: Integer); begin if Assigned(FOnScroll) then FOnScroll(Self, DeltaX, DeltaY); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoSetOffsetXY(Value: TPoint; Options: TScrollUpdateOptions; ClipRect: PRect = nil): Boolean; // Actual offset setter used to scroll the client area, update scroll bars and invalidating the header (all optional). // Returns True if the offset really changed otherwise False is returned. var DeltaX: Integer; DeltaY: Integer; DWPStructure: THandle;//HDWP; I: Integer; P: TPoint; R: TRect; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcScroll],'DoSetOffsetXY');{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcScroll],'Value',Value);{$endif} //{$ifdef DEBUG_VTV}Logger.SendCallStack([lcScroll],'CallStack');{$endif} // Range check, order is important here. if Value.X < (ClientWidth - Integer(FRangeX)) then Value.X := ClientWidth - Integer(FRangeX); if Value.X > 0 then Value.X := 0; DeltaX := Value.X - FOffsetX; if UseRightToLeftAlignment then DeltaX := -DeltaX; if Value.Y < (ClientHeight - Integer(FRangeY)) then Value.Y := ClientHeight - Integer(FRangeY); if Value.Y > 0 then Value.Y := 0; DeltaY := Value.Y - FOffsetY; {$ifdef DEBUG_VTV}Logger.Send([lcScroll],'FOffsetX: %d FOffsetY: %d',[FOffsetX,FOffsetY]);{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcScroll],'DeltaX: %d DeltaY: %d',[DeltaX,DeltaY]);{$endif} Result := (DeltaX <> 0) or (DeltaY <> 0); if Result then begin FOffsetX := Value.X; FOffsetY := Value.Y; Application.CancelHint; if FUpdateCount = 0 then begin // The drag image from VCL controls need special consideration. {$ifndef INCOMPLETE_WINAPI} if tsVCLDragging in FStates then ImageList_DragShowNolock(False); {$endif} if (suoScrollClientArea in Options) and not (tsToggling in FStates) then begin // Have to invalidate the entire window if there's a background. if (toShowBackground in FOptions.FPaintOptions) and (FBackground.Graphic is TBitmap) then begin //todo: reimplement {$ifndef INCOMPLETE_WINAPI} // Since we don't use ScrollWindow here we have to move all client windows ourselves. DWPStructure := BeginDeferWindowPos(ControlCount); for I := 0 to ControlCount - 1 do if Controls[I] is TWinControl then begin with Controls[I] as TWinControl do DWPStructure := DeferWindowPos(DWPStructure, Handle, 0, Left + DeltaX, Top + DeltaY, 0, 0, SWP_NOZORDER or SWP_NOACTIVATE or SWP_NOSIZE); if DWPStructure = 0 then Break; end; if DWPStructure <> 0 then EndDeferWindowPos(DWPStructure); InvalidateRect(Handle, nil, False); {$endif} end else begin if (DeltaX <> 0) and (Header.Columns.GetVisibleFixedWidth > 0) then begin // When fixed columns exists we have to scroll separately horizontally and vertically. // Horizontally is scroll only the client area not occupied by fixed columns and // vertically entire client area (or clipping area if one exists). R := ClientRect; R.Left := Header.Columns.GetVisibleFixedWidth; //lclheader if hoVisible in FHeader.FOptions then begin Inc(R.Top,FHeader.Height); Inc(R.Bottom,FHeader.Height); end; //scrollwindow implementation under gtk is broken {$ifdef Gtk} InvalidateRect(Handle, nil, True); {$else} ScrollWindow(Handle, DeltaX, 0, @R, @R); if DeltaY <> 0 then ScrollWindow(Handle, 0, DeltaY, @R, @R); {$endif} end else begin //lclheader if ClipRect <> nil then begin {$ifdef DEBUG_VTV}Logger.SendWarning([lcWarning], 'DoSetOffsetXY called with a non nil ClipRect');{$endif} R := ClipRect^; end else R := ClientRect; if hoVisible in FHeader.FOptions then begin Inc(R.Top, FHeader.Height); Inc(R.Bottom, FHeader.Height); end; {$ifdef DEBUG_VTV}Logger.Send([lcScroll], 'Rect to Scroll', R);{$endif} //todo: temporary hack to avoid some drawing problems. //Will be removed when scrollwindowex is properly implemented in all widgets {$ifdef LCLQt} ScrollWindow(Handle, DeltaX, DeltaY, @R, @R); {$else} {$ifdef Gtk} InvalidateRect(Handle, nil, True); {$else} ScrollWindowEx(Handle, DeltaX, DeltaY, @R, @R,0, nil, SW_INVALIDATE or SW_SCROLLCHILDREN); {$endif} {$endif} end; end; end; if suoUpdateNCArea in Options then begin if DeltaX <> 0 then begin if (suoRepaintHeader in Options) and (hoVisible in FHeader.FOptions) then FHeader.Invalidate(nil); if not (tsSizing in FStates) and (FScrollBarOptions.ScrollBars in [ssHorizontal, ssBoth]) then UpdateHorizontalScrollBar(suoRepaintScrollbars in Options); end; if (DeltaY <> 0) and ([tsThumbTracking, tsSizing] * FStates = []) then begin UpdateVerticalScrollBar(suoRepaintScrollbars in Options); if not (FHeader.UseColumns or IsMouseSelecting) and (FScrollBarOptions.ScrollBars in [ssHorizontal, ssBoth]) then UpdateHorizontalScrollBar(suoRepaintScrollbars in Options); end; end; {$ifndef INCOMPLETE_WINAPI} if tsVCLDragging in FStates then ImageList_DragShowNolock(True); {$endif} end; // Finally update "hot" node if hot tracking is activated GetCursorPos(P); P := ScreenToClient(P); if PtInRect(ClientRect, P) then HandleHotTrack(P.X, P.Y); DoScroll(DeltaX, DeltaY); end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcScroll],'DoSetOffsetXY');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoShowScrollbar(Bar: Integer; Show: Boolean); begin {$ifdef UseFlatScrollbars} FlatSB_ShowScrollBar(Handle, Bar, Show); {$else} ShowScrollBar(Handle, Bar, Show); {$endif UseFlatScrollbars}; if Assigned(FOnShowScrollbar) then FOnShowScrollbar(Self, Bar, Show); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoStartDrag(var DragObject: TDragObject); begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcDrag],'DoStartDrag');{$endif} {$ifdef DEBUG_VTV}Logger.SendCallStack([lcDrag],'Stack');{$endif} inherited; // Check if the application created an own drag object. This is needed to pass the correct source in // OnDragOver and OnDragDrop. if Assigned(DragObject) then DoStateChange([tsUserDragObject]); {$ifdef DEBUG_VTV}Logger.ExitMethod([lcDrag],'DoStartDrag');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoStateChange(Enter: TVirtualTreeStates; Leave: TVirtualTreeStates = []); var ActualEnter, ActualLeave: TVirtualTreeStates; begin if Assigned(FOnStateChange) then begin ActualEnter := Enter - FStates; ActualLeave := FStates * Leave; if (ActualEnter + ActualLeave) <> [] then FOnStateChange(Self, Enter, Leave); end; FStates := FStates + Enter - Leave; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoStructureChange(Node: PVirtualNode; Reason: TChangeReason); begin if HandleAllocated then KillTimer(Handle, StructureChangeTimer); if Assigned(FOnStructureChange) then FOnStructureChange(Self, Node, Reason); // This is a good place to reset the cached node and reason. These are the same as the values passed in here. // This is necessary to allow descendants to override this method and get them. DoStateChange([], [tsStructureChangePending]); FLastStructureChangeNode := nil; FLastStructureChangeReason := crIgnore; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoTimerScroll; var P, ClientP: TPoint; InRect, Panning: Boolean; R, ClipRect: TRect; DeltaX, DeltaY: Integer; begin GetCursorPos(P); //lclheader R := inherited GetClientRect; ClipRect := R; {$ifndef INCOMPLETE_WINAPI} MapWindowPoints(Handle, 0, R, 2); {$endif} InRect := PtInRect(R, P); ClientP := ScreenToClient(P); Panning := [tsWheelPanning, tsWheelScrolling] * FStates <> []; if IsMouseSelecting or InRect or Panning or CanScroll(ClientP) then begin DeltaX := 0; DeltaY := 0; if sdUp in FScrollDirections then begin if Panning then DeltaY := FLastClickPos.Y - ClientP.Y - 8 else if InRect then DeltaY := Min(FScrollBarOptions.FIncrementY, ClientHeight) else DeltaY := Min(FScrollBarOptions.FIncrementY, ClientHeight) * Abs(R.Top - P.Y); if FOffsetY = 0 then Exclude(FScrollDirections, sdUp); end; if sdDown in FScrollDirections then begin if Panning then DeltaY := FLastClickPos.Y - ClientP.Y + 8 else if InRect then DeltaY := -Min(FScrollBarOptions.FIncrementY, ClientHeight) else DeltaY := -Min(FScrollBarOptions.FIncrementY, ClientHeight) * Abs(P.Y - R.Bottom); if (ClientHeight - FOffsetY) = Integer(FRangeY) then Exclude(FScrollDirections, sdDown); end; if sdLeft in FScrollDirections then begin if Panning then DeltaX := FLastClickPos.X - ClientP.X - 8 else if InRect then DeltaX := FScrollBarOptions.FIncrementX else DeltaX := FScrollBarOptions.FIncrementX * Abs(R.Left - P.X); if FEffectiveOffsetX = 0 then Exclude(FScrollDirections, sdleft); end; if sdRight in FScrollDirections then begin if Panning then DeltaX := FLastClickPos.X - ClientP.X + 8 else if InRect then DeltaX := -FScrollBarOptions.FIncrementX else DeltaX := -FScrollBarOptions.FIncrementX * Abs(P.X - R.Right); if (ClientWidth + FEffectiveOffsetX) = Integer(FRangeX) then Exclude(FScrollDirections, sdRight); end; if UseRightToLeftAlignment then DeltaX := - DeltaX; if IsMouseSelecting then begin // In order to avoid scrolling the area which needs a repaint due to the changed selection rectangle // we limit the scroll area explicitely. OffsetRect(ClipRect, DeltaX, DeltaY); DoSetOffsetXY(Point(FOffsetX + DeltaX, FOffsetY + DeltaY), DefaultScrollUpdateFlags, @ClipRect); // When selecting with the mouse then either update only the parts of the window which have been uncovered // by the scroll operation if no change in the selection happend or invalidate and redraw the entire // client area otherwise (to avoid the time consuming task of determining the display rectangles of every // changed node). if CalculateSelectionRect(ClientP.X, ClientP.Y) and HandleDrawSelection(ClientP.X, ClientP.Y) then InvalidateRect(Handle, nil, False) else begin // The selection did not change so invalidate only the part of the window which really needs an update. // 1) Invalidate the parts uncovered by the scroll operation. Add another offset range, we have to // scroll only one stripe but have to update two. OffsetRect(ClipRect, DeltaX, DeltaY); SubtractRect(ClipRect, ClientRect, ClipRect); InvalidateRect(Handle, @ClipRect, False); // 2) Invalidate the selection rectangles. UnionRect(ClipRect, OrderRect(FNewSelRect), OrderRect(FLastSelRect)); OffsetRect(ClipRect, FOffsetX, FOffsetY); InvalidateRect(Handle, @ClipRect, False); end; end else begin // Scroll only if there is no drag'n drop in progress. Drag'n drop scrolling is handled in DragOver. if ((FDragManager = nil) or not VTVDragManager.IsDropTarget) and ((DeltaX <> 0) or (DeltaY <> 0)) then DoSetOffsetXY(Point(FOffsetX + DeltaX, FOffsetY + DeltaY), DefaultScrollUpdateFlags, nil); end; UpdateWindow(Handle); if (FScrollDirections = []) and ([tsWheelPanning, tsWheelScrolling] * FStates = []) then begin KillTimer(Handle, ScrollTimer); DoStateChange([], [tsScrollPending, tsScrolling]); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoUpdating(State: TVTUpdateState); begin if Assigned(FOnUpdating) then FOnUpdating(Self, State); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DoValidateCache: Boolean; // This method fills the cache, which is used to speed up searching for nodes. // The strategy is simple: Take the current number of visible nodes and distribute evenly a number of marks // (which are stored in FPositionCache) so that iterating through the tree doesn't cost too much time. // If there are less than 'CacheThreshold' nodes in the tree then the cache remains empty. // Result is True if the cache was filled without interruption, otherwise False. // Note: You can adjust the maximum number of nodes between two cache entries by changing CacheThreshold. var EntryCount, CurrentTop, Index: Cardinal; CurrentNode, Temp: PVirtualNode; begin EntryCount := 0; if not (tsStopValidation in FStates) then begin if FStartIndex = 0 then FPositionCache := nil; if FVisibleCount > CacheThreshold then begin EntryCount := CalculateCacheEntryCount; SetLength(FPositionCache, EntryCount); if FStartIndex > EntryCount then FStartIndex := EntryCount; // Optimize validation by starting with FStartIndex if set. if (FStartIndex > 0) and Assigned(FPositionCache[FStartIndex - 1].Node) then begin // Index is the current entry in FPositionCache. Index := FStartIndex - 1; // Running term for absolute top value. CurrentTop := FPositionCache[Index].AbsoluteTop; // Running node pointer. CurrentNode := FPositionCache[Index].Node; end else begin // Index is the current entry in FPositionCache. Index := 0; // Running term for absolute top value. CurrentTop := 0; // Running node pointer. CurrentNode := GetFirstVisibleNoInit(nil, True); end; // EntryCount serves as counter for processed nodes here. This value can always start at 0 as // the validation either starts also at index 0 or an index which is always a multiple of CacheThreshold // and EntryCount is only used with modulo CacheThreshold. EntryCount := 0; if Assigned(CurrentNode) then begin while not (tsStopValidation in FStates) do begin if (EntryCount mod CacheThreshold) = 0 then begin // New cache entry to set up. with FPositionCache[Index] do begin Node := CurrentNode; AbsoluteTop := CurrentTop; end; Inc(Index); end; Inc(CurrentTop, NodeHeight[CurrentNode]); // Advance to next visible node. Temp := GetNextVisibleNoInit(CurrentNode, True); // If there is no further node or the cache is full then stop the loop. if (Temp = nil) or (Integer(Index) = Length(FPositionCache)) then Break; CurrentNode := Temp; Inc(EntryCount); end; end; // Finalize the position cache so no nil entry remains there. if not (tsStopValidation in FStates) and (Integer(Index) <= High(FPositionCache)) then begin SetLength(FPositionCache, Index + 1); with FPositionCache[Index] do begin Node := CurrentNode; AbsoluteTop := CurrentTop; end; end; end; end; Result := (EntryCount > 0) and not (tsStopValidation in FStates); // In variable node height mode it might have happend that some or all of the nodes have been adjusted in their // height. During validation updates of the scrollbars is disabled so let's do this here. if Result and (toVariableNodeHeight in FOptions.FMiscOptions) then UpdateScrollbars(True); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DragAndDrop(AllowedEffects: LongWord; DataObject: IDataObject; DragEffect: LongWord); begin {$ifdef Windows} ActiveX.DoDragDrop(DataObject, VTVDragManager as IDropSource, AllowedEffects, @DragEffect); {$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DragCanceled; // Does some housekeeping for VCL drag'n drop; begin inherited; DragFinished; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DragDrop(const DataObject: IDataObject; KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; var Shift: TShiftState; EnumFormat: IEnumFormatEtc; Fetched: LongWord; OLEFormat: TFormatEtc; Formats: TFormatArray; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcDrag],'DragDrop');{$endif} KillTimer(Handle, ExpandTimer); KillTimer(Handle, ScrollTimer); DoStateChange([], [tsScrollPending, tsScrolling]); Formats := nil; // Ask explicitly again whether the action is allowed. Otherwise we may accept a drop which is intentionally not // allowed but cannot be prevented by the application because when the tree was scrolling while dropping // no DragOver event is created by the OLE subsystem. Result := DragOver(VTVDragManager.DragSource, KeyState, dsDragMove, Pt, Effect); try if (Result <> NOERROR) or ((Effect and not DROPEFFECT_SCROLL) = DROPEFFECT_NONE) then Result := E_FAIL else begin try Shift := KeysToShiftState(KeyState); if tsLeftButtonDown in FStates then Include(Shift, ssLeft); if tsMiddleButtonDown in FStates then Include(Shift, ssMiddle); if tsRightButtonDown in FStates then Include(Shift, ssRight); Pt := ScreenToClient(Pt); // Determine which formats we can get and pass them along with the data object to the drop handler. Result := DataObject.EnumFormatEtc(DATADIR_GET, EnumFormat); if Failed(Result) then Abort; Result := EnumFormat.Reset; if Failed(Result) then Abort; // create a list of available formats while EnumFormat.Next(1, OLEFormat, @Fetched) = S_OK do begin SetLength(Formats, Length(Formats) + 1); Formats[High(Formats)] := OLEFormat.cfFormat; end; DoDragDrop(VTVDragManager.DragSource, DataObject, Formats, Shift, Pt, Effect, FLastDropMode); except // An unhandled exception here leaks memory. Application.HandleException(Self); Result := E_UNEXPECTED; end; end; finally if Assigned(FDropTargetNode) then begin InvalidateNode(FDropTargetNode); FDropTargetNode := nil; end; end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcDrag],'DragDrop');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DragEnter(KeyState: LongWord; Pt: TPoint; var Effect: LongWord): HResult; // callback routine for the drop target interface var Shift: TShiftState; Accept: Boolean; R: TRect; HitInfo: THitInfo; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcDrag],'DragEnter');{$endif} try // Determine acceptance of drag operation and reset scroll start time. FDragScrollStart := 0; Shift := KeysToShiftState(KeyState); if tsLeftButtonDown in FStates then Include(Shift, ssLeft); if tsMiddleButtonDown in FStates then Include(Shift, ssMiddle); if tsRightButtonDown in FStates then Include(Shift, ssRight); Pt := ScreenToClient(Pt); Effect := SuggestDropEffect(VTVDragManager.DragSource, Shift, Pt, Effect); Accept := DoDragOver(VTVDragManager.DragSource, Shift, dsDragEnter, Pt, FLastDropMode, Effect); if not Accept then Effect := DROPEFFECT_NONE else begin // Set initial drop target node and drop mode. GetHitTestInfoAt(Pt.X, Pt.Y, True, HitInfo); if Assigned(HitInfo.HitNode) then begin FDropTargetNode := HitInfo.HitNode; R := GetDisplayRect(HitInfo.HitNode, FHeader.MainColumn, False); if hiOnItemLabel in HitInfo.HitPositions then FLastDropMode := dmOnNode else if ((R.Top + R.Bottom) div 2) > Pt.Y then FLastDropMode := dmAbove else FLastDropMode := dmBelow; end else FLastDropMode := dmNowhere; end; // If the drag source is a virtual tree then we know how to control the drag image // and can show it even if the source is not the target tree. // This is only necessary if we cannot use the drag image helper interfaces. if not VTVDragManager.DropTargetHelperSupported and Assigned(VTVDragManager.DragSource) then TBaseVirtualTree(VTVDragManager.DragSource).FDragImage.ShowDragImage; Result := NOERROR; except Result := E_UNEXPECTED; end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcDrag],'DragEnter');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DragFinished; // Called by DragCancelled or EndDrag to make up for the still missing mouse button up messages. // These are important for such important things like popup menus. var P: TPoint; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcDrag],'DragFinished');{$endif} DoStateChange([], [tsVCLDragPending, tsVCLDragging, tsUserDragObject]); GetCursorPos(P); P := ScreenToClient(P); if tsRightButtonDown in FStates then Perform(LM_RBUTTONUP, 0, Longint(PointToSmallPoint(P))) else if tsMiddleButtonDown in FStates then Perform(LM_MBUTTONUP, 0, Longint(PointToSmallPoint(P))) else Perform(LM_LBUTTONUP, 0, Longint(PointToSmallPoint(P))); {$ifdef DEBUG_VTV}Logger.ExitMethod([lcDrag],'DragFinished');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DragLeave; var Effect: LongWord; begin KillTimer(Handle, ExpandTimer); if not VTVDragManager.DropTargetHelperSupported and Assigned(VTVDragManager.DragSource) then TBaseVirtualTree(VTVDragManager.DragSource).FDragImage.HideDragImage; if Assigned(FDropTargetNode) then begin InvalidateNode(FDropTargetNode); FDropTargetNode := nil; end; UpdateWindow(Handle); Effect := 0; DoDragOver(nil, [], dsDragLeave, Point(0, 0), FLastDropMode, Effect); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.DragOver(Source: TObject; KeyState: LongWord; DragState: TDragState; Pt: TPoint; var Effect: LongWord): HResult; // callback routine for the drop target interface var Shift: TShiftState; Accept, DragImageWillMove, WindowScrolled: Boolean; OldR, R: TRect; NewDropMode: TDropMode; HitInfo: THitInfo; ImageHit: Boolean; LabelHit: Boolean; DragPos: TPoint; Tree: TBaseVirtualTree; LastNode: PVirtualNode; DeltaX, DeltaY: Integer; ScrollOptions: TScrollUpdateOptions; begin //{$ifdef DEBUG_VTV}Logger.EnterMethod([lcDrag],'DragOver');{$endif} //todo: the check to FDragManager disable drag images in non windows. //This should be reviewed as soon as drag image is implemented in non windows if Assigned(FDragManager) and not VTVDragManager.DropTargetHelperSupported and (Source is TBaseVirtualTree) then begin Tree := Source as TBaseVirtualTree; ScrollOptions := [suoUpdateNCArea]; end else begin Tree := nil; ScrollOptions := DefaultScrollUpdateFlags; end; try DragPos := Pt; Pt := ScreenToClient(Pt); //{$ifdef DEBUG_VTV}Logger.Send([lcDrag],'Pt',Pt);{$endif} // Check if we have to scroll the client area. FScrollDirections := DetermineScrollDirections(Pt.X, Pt.Y); DeltaX := 0; DeltaY := 0; if FScrollDirections <> [] then begin // Determine amount to scroll. if sdUp in FScrollDirections then begin DeltaY := Min(FScrollBarOptions.FIncrementY, ClientHeight); if FOffsetY = 0 then Exclude(FScrollDirections, sdUp); end; if sdDown in FScrollDirections then begin DeltaY := -Min(FScrollBarOptions.FIncrementY, ClientHeight); if (ClientHeight - FOffsetY) = Integer(FRangeY) then Exclude(FScrollDirections, sdDown); end; if sdLeft in FScrollDirections then begin DeltaX := FScrollBarOptions.FIncrementX; if FEffectiveOffsetX = 0 then Exclude(FScrollDirections, sdleft); end; if sdRight in FScrollDirections then begin DeltaX := -FScrollBarOptions.FIncrementX; if (ClientWidth + FEffectiveOffsetX) = Integer(FRangeX) then Exclude(FScrollDirections, sdRight); end; WindowScrolled := DoSetOffsetXY(Point(FOffsetX + DeltaX, FOffsetY + DeltaY), ScrollOptions, nil); end else WindowScrolled := False; // Determine acceptance of drag operation as well as drag target. Shift := KeysToShiftState(KeyState); if tsLeftButtonDown in FStates then Include(Shift, ssLeft); if tsMiddleButtonDown in FStates then Include(Shift, ssMiddle); if tsRightButtonDown in FStates then Include(Shift, ssRight); GetHitTestInfoAt(Pt.X, Pt.Y, True, HitInfo); ImageHit := HitInfo.HitPositions * [hiOnNormalIcon, hiOnStateIcon] <> []; LabelHit := hiOnItemLabel in HitInfo.HitPositions; // In report mode only direct hits of the node captions/images in the main column are accepted as hits. if (toReportMode in FOptions.FMiscOptions) and not ((LabelHit or ImageHit) and (HitInfo.HitColumn = FHeader.MainColumn)) then HitInfo.HitNode := nil; if Assigned(HitInfo.HitNode) then begin R := GetDisplayRect(HitInfo.HitNode, NoColumn, False); if LabelHit or ImageHit or not (toShowDropmark in FOptions.FPaintOptions) then NewDropMode := dmOnNode else if ((R.Top + R.Bottom) div 2) > Pt.Y then NewDropMode := dmAbove else NewDropMode := dmBelow; end else begin NewDropMode := dmNowhere; R := Rect(0, 0, 0, 0); end; if Assigned(Tree) then DragImageWillMove := Tree.FDragImage.WillMove(DragPos) else DragImageWillMove := False; if (HitInfo.HitNode <> FDropTargetNode) or (FLastDropMode <> NewDropMode) then begin // Something in the tree will change. This requires to update the screen and/or the drag image. FLastDropMode := NewDropMode; if HitInfo.HitNode <> FDropTargetNode then begin KillTimer(Handle, ExpandTimer); // The last target node is needed for the rectangle determination but must already be set for // the recapture call, hence it must be stored somewhere. LastNode := FDropTargetNode; FDropTargetNode := HitInfo.HitNode; // In order to show a selection rectangle a column must be focused. if FFocusedColumn <= NoColumn then FFocusedColumn := FHeader.MainColumn; if Assigned(LastNode) and Assigned(FDropTargetNode) then begin // Optimize the case that the selection moved between two nodes. OldR := GetDisplayRect(LastNode, NoColumn, False); UnionRect(R, R, OldR); if Assigned(Tree) then begin if WindowScrolled then UpdateWindowAndDragImage(Tree, ClientRect, True, not DragImageWillMove) else UpdateWindowAndDragImage(Tree, R, False, not DragImageWillMove); end else InvalidateRect(Handle, @R, False); end else begin if Assigned(LastNode) then begin // Repaint last target node. OldR := GetDisplayRect(LastNode, NoColumn, False); if Assigned(Tree) then begin if WindowScrolled then UpdateWindowAndDragImage(Tree, ClientRect, WindowScrolled, not DragImageWillMove) else UpdateWindowAndDragImage(Tree, OldR, False, not DragImageWillMove); end else InvalidateRect(Handle, @OldR, False); end else begin if Assigned(Tree) then begin if WindowScrolled then UpdateWindowAndDragImage(Tree, ClientRect, WindowScrolled, not DragImageWillMove) else UpdateWindowAndDragImage(Tree, R, False, not DragImageWillMove); end else InvalidateRect(Handle, @R, False); end; end; // Start auto expand timer if necessary. if (toAutoDropExpand in FOptions.FAutoOptions) and Assigned(FDropTargetNode) and (vsHasChildren in FDropTargetNode.States) then SetTimer(Handle, ExpandTimer, FAutoExpandDelay, nil); end else begin // Only the drop mark position changed so invalidate the current drop target node. if Assigned(Tree) then begin if WindowScrolled then UpdateWindowAndDragImage(Tree, ClientRect, WindowScrolled, not DragImageWillMove) else UpdateWindowAndDragImage(Tree, R, False, not DragImageWillMove); end else InvalidateRect(Handle, @R, False); end; end else begin // No change in the current drop target or drop mode. This might still mean horizontal or vertical scrolling. if Assigned(Tree) and ((DeltaX <> 0) or (DeltaY <> 0)) then UpdateWindowAndDragImage(Tree, ClientRect, WindowScrolled, not DragImageWillMove); end; Update; if Assigned(Tree) and DragImageWillMove then Tree.FDragImage.DragTo(DragPos, False); Effect := SuggestDropEffect(Source, Shift, Pt, Effect); Accept := DoDragOver(Source, Shift, DragState, Pt, FLastDropMode, Effect); if not Accept then Effect := DROPEFFECT_NONE; if WindowScrolled then Effect := Effect or LongWord(DROPEFFECT_SCROLL); Result := NOERROR; except Result := E_UNEXPECTED; end; //{$ifdef DEBUG_VTV}Logger.ExitMethod([lcDrag],'DragOver');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DrawDottedHLine(const PaintInfo: TVTPaintInfo; Left, Right, Top: Integer); // Draws a horizontal line with alternating pixels (this style is not supported for pens under Win9x). var R: TRect; begin with PaintInfo, Canvas do begin Brush.Color := Self.Brush.Color; R := Rect(Min(Left, Right), Top, Max(Left, Right) + 1, Top + 1); LCLIntf.FillRect(Handle, R, FDottedBrush); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DrawDottedVLine(const PaintInfo: TVTPaintInfo; Top, Bottom, Left: Integer); // Draws a vertical line with alternating pixels (this style is not supported for pens under Win9x). var R: TRect; begin with PaintInfo, Canvas do begin Brush.Color := Self.Brush.Color; R := Rect(Left, Min(Top, Bottom), Left + 1, Max(Top, Bottom) + 1); LCLIntf.FillRect(Handle, R, FDottedBrush); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.EndOperation; // Called to indicate that a long-running operation has finished. begin Assert(FOperationCount > 0, 'EndOperation must not be called when no operation in progress.'); Dec(FOperationCount); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.FindNodeInSelection(P: PVirtualNode; out Index: Integer; LowBound, HighBound: Integer): Boolean; // Search routine to find a specific node in the selection array. // LowBound and HighBound determine the range in which to search the node. // Either value can be -1 to denote the maximum range otherwise LowBound must be less or equal HighBound. var L, H, I, C: PtrInt; begin Result := False; L := 0; if LowBound >= 0 then L := LowBound; H := FSelectionCount - 1; if HighBound >= 0 then H := HighBound; while L <= H do begin I := (L + H) shr 1; C := PtrInt(FSelection[I]) - PtrInt(P); if C < 0 then L := I + 1 else begin H := I - 1; if C = 0 then begin Result := True; L := I; end; end; end; Index := L; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.FinishChunkHeader(Stream: TStream; StartPos, EndPos: Integer); // used while streaming out a node to finally write out the size of the chunk var Size: Integer; begin // seek back to the second entry in the chunk header Stream.Position := StartPos + SizeOf(Integer); // determine size of chunk without the chunk header Size := EndPos - StartPos - SizeOf(TChunkHeader); // write the size... Stream.Write(Size, SizeOf(Size)); // ... and seek to the last endposition Stream.Position := EndPos; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.FontChanged(AFont: TObject); // Little helper function for font changes (as they are not tracked in TBitmap/TCanvas.OnChange). begin FFontChanged := True; FOldFontChange(AFont); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetBorderDimensions: TSize; // Returns the overall width of the current window border, depending on border styles. // Note: these numbers represent the system's standards not special properties, which can be set for TWinControl // (e.g. bevels, border width). var Styles: Integer; begin Result.cx := 0; Result.cy := 0; Styles := GetWindowLong(Handle, GWL_STYLE); if (Styles and WS_BORDER) <> 0 then begin Dec(Result.cx); Dec(Result.cy); end; if (Styles and WS_THICKFRAME) <> 0 then begin Dec(Result.cx, GetSystemMetrics(SM_CXFIXEDFRAME)); Dec(Result.cy, GetSystemMetrics(SM_CYFIXEDFRAME)); end; Styles := GetWindowLong(Handle, GWL_EXSTYLE); if (Styles and WS_EX_CLIENTEDGE) <> 0 then begin Dec(Result.cx, GetSystemMetrics(SM_CXEDGE)); Dec(Result.cy, GetSystemMetrics(SM_CYEDGE)); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetCheckImage(Node: PVirtualNode; ImgCheckType: TCheckType = ctNone; ImgCheckState: TCheckState = csUncheckedNormal; ImgEnabled: Boolean = False): Integer; // Determines the index into the check image list for the given node depending on the check type // and enabled state. const // Four dimensional array consisting of image indices for the check type, the check state, the enabled state and the // hot state. CheckStateToCheckImage: array[ctCheckBox..ctButton, csUncheckedNormal..csMixedPressed, Boolean, Boolean] of Integer = ( // ctCheckBox, ctTriStateCheckBox ( // csUncheckedNormal (disabled [not hot, hot], enabled [not hot, hot]) ((ckCheckUncheckedDisabled, ckCheckUncheckedDisabled), (ckCheckUncheckedNormal, ckCheckUncheckedHot)), // csUncheckedPressed (disabled [not hot, hot], enabled [not hot, hot]) ((ckCheckUncheckedDisabled, ckCheckUncheckedDisabled), (ckCheckUncheckedPressed, ckCheckUncheckedPressed)), // csCheckedNormal ((ckCheckCheckedDisabled, ckCheckCheckedDisabled), (ckCheckCheckedNormal, ckCheckCheckedHot)), // csCheckedPressed ((ckCheckCheckedDisabled, ckCheckCheckedDisabled), (ckCheckCheckedPressed, ckCheckCheckedPressed)), // csMixedNormal ((ckCheckMixedDisabled, ckCheckMixedDisabled), (ckCheckMixedNormal, ckCheckMixedHot)), // csMixedPressed ((ckCheckMixedDisabled, ckCheckMixedDisabled), (ckCheckMixedPressed, ckCheckMixedPressed)) ), // ctRadioButton ( // csUncheckedNormal (disabled [not hot, hot], enabled [not hot, hot]) ((ckRadioUncheckedDisabled, ckRadioUncheckedDisabled), (ckRadioUncheckedNormal, ckRadioUncheckedHot)), // csUncheckedPressed (disabled [not hot, hot], enabled [not hot, hot]) ((ckRadioUncheckedDisabled, ckRadioUncheckedDisabled), (ckRadioUncheckedPressed, ckRadioUncheckedPressed)), // csCheckedNormal ((ckRadioCheckedDisabled, ckRadioCheckedDisabled), (ckRadioCheckedNormal, ckRadioCheckedHot)), // csCheckedPressed ((ckRadioCheckedDisabled, ckRadioCheckedDisabled), (ckRadioCheckedPressed, ckRadioCheckedPressed)), // csMixedNormal (should never appear with ctRadioButton) ((ckCheckMixedDisabled, ckCheckMixedDisabled), (ckCheckMixedNormal, ckCheckMixedHot)), // csMixedPressed (should never appear with ctRadioButton) ((ckCheckMixedDisabled, ckCheckMixedDisabled), (ckCheckMixedPressed, ckCheckMixedPressed)) ), // ctButton ( // csUncheckedNormal (disabled [not hot, hot], enabled [not hot, hot]) ((ckButtonDisabled, ckButtonDisabled), (ckButtonNormal, ckButtonHot)), // csUncheckedPressed (disabled [not hot, hot], enabled [not hot, hot]) ((ckButtonDisabled, ckButtonDisabled), (ckButtonPressed, ckButtonPressed)), // csCheckedNormal ((ckButtonDisabled, ckButtonDisabled), (ckButtonNormal, ckButtonHot)), // csCheckedPressed ((ckButtonDisabled, ckButtonDisabled), (ckButtonPressed, ckButtonPressed)), // csMixedNormal (should never appear with ctButton) ((ckCheckMixedDisabled, ckCheckMixedDisabled), (ckCheckMixedNormal, ckCheckMixedHot)), // csMixedPressed (should never appear with ctButton) ((ckCheckMixedDisabled, ckCheckMixedDisabled), (ckCheckMixedPressed, ckCheckMixedPressed)) ) ); var AType: TCheckType; begin if not Assigned(Node) then Result := CheckStateToCheckImage[ImgCheckType, ImgCheckState, ImgEnabled, False] else if Node.CheckType = ctNone then Result := -1 else begin AType := Node.CheckType; if AType = ctTriStateCheckBox then AType := ctCheckBox; Result := CheckStateToCheckImage[AType, Node.CheckState, not (vsDisabled in Node.States) and Enabled, Node = FCurrentHotNode]; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.CheckImageListNeeded; begin if FCheckImages <> nil then Exit; if FCheckImageKind = ckCustom then FCheckImages := FCustomCheckImages else begin FCheckImages := TBitmap.Create; FCheckImages.Transparent := True; FCheckImages.LoadFromLazarusResource(CheckImagesStrings[FCheckImageKind]); end; end; function TBaseVirtualTree.GetClientRect: TRect; begin Result := inherited; //lclheader if HandleAllocated and (hoVisible in FHeader.FOptions) then Dec(Result.Bottom, FHeader.Height); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetColumnClass: TVirtualTreeColumnClass; begin Result := TVirtualTreeColumn; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetHeaderClass: TVTHeaderClass; begin Result := TVTHeader; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetHintWindowClass: THintWindowClass; // Returns the default hint window class used for the tree. Descendants can override it to use their own classes. begin Result := TVirtualTreeHintWindow; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.GetImageIndex(var Info: TVTPaintInfo; Kind: TVTImageKind; InfoIndex: TVTImageInfoIndex; DefaultImages: TCustomImageList); // Retrieves the image index and an eventual customized image list for drawing. var CustomImages: TCustomImageList; begin with Info do begin ImageInfo[InfoIndex].Index := -1; ImageInfo[InfoIndex].Ghosted := False; CustomImages := DoGetImageIndex(Node, Kind, Column, ImageInfo[InfoIndex].Ghosted, ImageInfo[InfoIndex].Index); if Assigned(CustomImages) then ImageInfo[InfoIndex].Images := CustomImages else ImageInfo[InfoIndex].Images := DefaultImages; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetMaxRightExtend: Cardinal; // Determines the maximum with of the currently visible part of the tree, depending on the length // of the node texts. This method is used for determining the horizontal scroll range if no columns are used. var Node, NextNode: PVirtualNode; TopPosition: Integer; NodeLeft, CurrentWidth: Integer; WithCheck: Boolean; CheckOffset: Integer; begin Node := InternalGetNodeAt(0, 0, True, TopPosition); Result := 0; if toShowRoot in FOptions.FPaintOptions then NodeLeft := (GetNodeLevel(Node) + 1) * FIndent else NodeLeft := GetNodeLevel(Node) * FIndent; if Assigned(FStateImages) then Inc(NodeLeft, FStateImages.Width + 2); if Assigned(FImages) then Inc(NodeLeft, FImages.Width + 2); WithCheck := (toCheckSupport in FOptions.FMiscOptions) and Assigned(FCheckImages); if WithCheck then CheckOffset := FCheckImages.Height + 2 else CheckOffset := 0; while Assigned(Node) do begin if not (vsInitialized in Node.States) then InitNode(Node); if WithCheck and (Node.CheckType <> ctNone) then Inc(NodeLeft, CheckOffset); CurrentWidth := DoGetNodeWidth(Node, NoColumn); if Integer(Result) < (NodeLeft + CurrentWidth) then Result := NodeLeft + CurrentWidth; Inc(TopPosition, NodeHeight[Node]); //lclheader: Height -> ClientHeight if TopPosition > ClientHeight then Break; if WithCheck and (Node.CheckType <> ctNone) then Dec(NodeLeft, CheckOffset); // Get next visible node and update left node position. NextNode := GetNextVisible(Node, True); if NextNode = nil then Break; Inc(NodeLeft, CountLevelDifference(Node, NextNode) * Integer(FIndent)); Node := NextNode; end; Inc(Result, FMargin); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.GetNativeClipboardFormats(var Formats: TFormatEtcArray); // Returns the supported clipboard formats of the tree. begin InternalClipboardFormats.EnumerateFormats(TVirtualTreeClass(ClassType), Formats, FClipboardFormats); // Ask application/descendants for self defined formats. DoGetUserClipboardFormats(Formats); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetOperationCanceled; begin Result := FOperationCanceled and (FOperationCount > 0); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetOptionsClass: TTreeOptionsClass; begin Result := TCustomVirtualTreeOptions; end; //---------------------------------------------------------------------------------------------------------------------- {$i olemethods.inc} //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.HandleHotTrack(X, Y: Integer); // Updates the current "hot" node. var HitInfo: THitInfo; CheckPositions: THitPositions; ButtonIsHit, DoInvalidate: Boolean; begin DoInvalidate := False; // Get information about the hit. GetHitTestInfoAt(X, Y, True, HitInfo); // Only make the new node being "hot" if its label is hit or full row selection is enabled. CheckPositions := [hiOnItemLabel, hiOnItemCheckbox]; // If running under Windows Vista using the explorer theme hitting the buttons makes the node hot, too. if (IsWinVistaOrAbove and (tsUseThemes in FStates) and (toUseExplorerTheme in FOptions.FPaintOptions)) then Include(CheckPositions, hiOnItemButtonExact); if (CheckPositions * HitInfo.HitPositions = []) and not (toFullRowSelect in FOptions.FSelectionOptions) then HitInfo.HitNode := nil; if (HitInfo.HitNode <> FCurrentHotNode) or (HitInfo.HitColumn <> FCurrentHotColumn) then begin DoInvalidate := (toHotTrack in FOptions.PaintOptions) or (toCheckSupport in FOptions.FMiscOptions); DoHotChange(FCurrentHotNode, HitInfo.HitNode); if Assigned(FCurrentHotNode) and DoInvalidate then InvalidateNode(FCurrentHotNode); FCurrentHotNode := HitInfo.HitNode; FCurrentHotColumn := HitInfo.HitColumn; end; ButtonIsHit := (hiOnItemButtonExact in HitInfo.HitPositions) and (toHotTrack in FOptions.FPaintOptions); if Assigned(FCurrentHotNode) and ((FHotNodeButtonHit <> ButtonIsHit) or DoInvalidate) then begin FHotNodeButtonHit := ButtonIsHit and (toHotTrack in FOptions.FPaintOptions); InvalidateNode(FCurrentHotNode); end else if not Assigned(FCurrentHotNode) then FHotNodeButtonHit := False; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.HandleIncrementalSearch(CharCode: Word); var Run, Stop: PVirtualNode; GetNextNode: TGetNextNodeProc; NewSearchText: String; SingleLetter, PreviousSearch: Boolean; // True if VK_BACK was sent. SearchDirection: TVTSearchDirection; //--------------- local functions ------------------------------------------- procedure SetupNavigation; // If the search buffer is empty then we start searching with the next node after the last one, otherwise // we continue with the last one. Node navigation function is set up too here, to avoid frequent checks. var FindNextNode: Boolean; begin FindNextNode := (Length(FSearchBuffer) = 0) or (Run = nil) or SingleLetter or PreviousSearch; case FIncrementalSearch of isVisibleOnly: if SearchDirection = sdForward then begin GetNextNode := GetNextVisible; if FindNextNode then begin if Run = nil then Run := GetFirstVisible(nil, True) else begin Run := GetNextVisible(Run, True); // Do wrap around. if Run = nil then Run := GetFirstVisible(nil, True); end; end; end else begin GetNextNode := GetPreviousVisible; if FindNextNode then begin if Run = nil then Run := GetLastVisible(nil, True) else begin Run := GetPreviousVisible(Run, True); // Do wrap around. if Run = nil then Run := GetLastVisible(nil, True); end; end; end; isInitializedOnly: if SearchDirection = sdForward then begin GetNextNode := GetNextNoInit; if FindNextNode then begin if Run = nil then Run := GetFirstNoInit else begin Run := GetNextNoInit(Run); // Do wrap around. if Run = nil then Run := GetFirstNoInit; end; end; end else begin GetNextNode := GetPreviousNoInit; if FindNextNode then begin if Run = nil then Run := GetLastNoInit else begin Run := GetPreviousNoInit(Run); // Do wrap around. if Run = nil then Run := GetLastNoInit; end; end; end; else // isAll if SearchDirection = sdForward then begin GetNextNode := GetNext; if FindNextNode then begin if Run = nil then Run := GetFirst else begin Run := GetNext(Run); // Do wrap around. if Run = nil then Run := GetFirst; end; end; end else begin GetNextNode := GetPrevious; if FindNextNode then begin if Run = nil then Run := GetLast else begin Run := GetPrevious(Run); // Do wrap around. if Run = nil then Run := GetLast; end; end; end; end; end; //--------------------------------------------------------------------------- //todo: reimplement {$ifndef INCOMPLETE_WINAPI} function CodePageFromLocale(Language: DWord): Integer; // Determines the code page for a given locale. // Unfortunately there is no easier way than this, currently. var Buf: array[0..6] of Char; begin GetLocaleInfo(Language, LOCALE_IDEFAULTANSICODEPAGE, Buf, 6); Result := StrToIntDef(Buf, GetACP); end; //--------------------------------------------------------------------------- function KeyUnicode(C: Char): WideChar; // Converts the given character into its corresponding Unicode character // depending on the active keyboard layout. begin MultiByteToWideChar(CodePageFromLocale(GetKeyboardLayout(0) and $FFFF), MB_USEGLYPHCHARS, @C, 1, @Result, 1); end; {$endif} //--------------- end local functions --------------------------------------- var FoundMatch: Boolean; NewChar: WideChar; begin //todo: handle correctly unicode char after WideString -> String conversion KillTimer(Handle, SearchTimer); if FIncrementalSearch <> isNone then begin if CharCode <> 0 then begin DoStateChange([tsIncrementalSearching]); // Convert the given virtual key code into a Unicode character based on the current locale. //todo: reimplement {$ifndef INCOMPLETE_WINAPI} NewChar := KeyUnicode(Char(CharCode)); {$else} NewChar := Char(CharCode); {$endif} PreviousSearch := NewChar = WideChar(VK_BACK); // We cannot do a search with an empty search buffer. if not PreviousSearch or (FSearchBuffer <> '') then begin // Determine which method to use to advance nodes and the start node to search from. case FSearchStart of ssAlwaysStartOver: Run := nil; ssFocusedNode: Run := FFocusedNode; else // ssLastHit Run := FLastSearchNode; end; // Make sure the start node corresponds to the search criterion. if Assigned(Run) then begin case FIncrementalSearch of isInitializedOnly: if not (vsInitialized in Run.States) then Run := nil; isVisibleOnly: if not FullyVisible[Run] then Run := nil; end; end; Stop := Run; // VK_BACK temporarily changes search direction to opposite mode. if PreviousSearch then begin if SearchDirection = sdBackward then SearchDirection := sdForward else SearchDirection := sdBackward end else SearchDirection := FSearchDirection; // The "single letter mode" is used to advance quickly from node to node when pressing the same key several times. SingleLetter := (Length(FSearchBuffer) = 1) and not PreviousSearch and (FSearchBuffer[1] = NewChar); // However if the current hit (if there is one) would fit also with a repeated character then // don't use single letter mode. if SingleLetter and (DoIncrementalSearch(Run, FSearchBuffer + NewChar) = 0) then SingleLetter := False; SetupNavigation; FoundMatch := False; if Assigned(Run) then begin if SingleLetter then NewSearchText := FSearchBuffer else if PreviousSearch then begin SetLength(FSearchBuffer, Length(FSearchBuffer) - 1); NewSearchText := FSearchBuffer; end else NewSearchText := FSearchBuffer + NewChar; repeat if DoIncrementalSearch(Run, NewSearchText) = 0 then begin FoundMatch := True; Break; end; // Advance to next node if we have not found a match. Run := GetNextNode(Run); // Do wrap around start or end of tree. if (Run <> Stop) and (Run = nil) then SetupNavigation; until Run = Stop; end; if FoundMatch then begin ClearSelection; FSearchBuffer := NewSearchText; FLastSearchNode := Run; FocusedNode := Run; Selected[Run] := True; FLastSearchNode := Run; end else // Play an acoustic signal if nothing could be found but don't beep if only the currently // focused node matches. if Assigned(Run) and (DoIncrementalSearch(Run, NewSearchText) <> 0) then Beep; end; end; // Restart search timeout interval. SetTimer(Handle, SearchTimer, FSearchTimeout, nil); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.HandleMouseDblClick(var Message: TLMMouse; const HitInfo: THitInfo); var NewCheckState: TCheckState; Node: PVirtualNode; MayEdit: Boolean; begin MayEdit := not (tsEditing in FStates) and (toEditOnDblClick in FOptions.FMiscOptions); if tsEditPending in FStates then begin KillTimer(Handle, EditTimer); DoStateChange([], [tsEditPending]); end; if not (tsEditing in FStates) or DoEndEdit then begin if HitInfo.HitColumn = FHeader.FColumns.FClickIndex then DoColumnDblClick(HitInfo.HitColumn, KeysToShiftState(Message.Keys)); Node := nil; if (hiOnItem in HitInfo.HitPositions) and (hitInfo.HitColumn > NoColumn) and (coFixed in FHeader.FColumns[HitInfo.HitColumn].FOptions) then begin if hiUpperSplitter in HitInfo.HitPositions then Node := GetPreviousVisible(HitInfo.HitNode, True) else if hiLowerSplitter in HitInfo.HitPositions then Node := HitInfo.HitNode end; if Assigned(Node) and (Node <> FRoot) and (toNodeHeightDblClickResize in FOptions.FMiscOptions) then begin if DoNodeHeightDblClickResize(Node, HitInfo.HitColumn, KeysToShiftState(Message.Keys), Point(Message.XPos, Message.YPos)) then begin SetNodeHeight(Node, FDefaultNodeHeight); UpdateWindow(Handle); MayEdit := False; end; end else if hiOnItemCheckBox in HitInfo.HitPositions then begin if (FStates * [tsMouseCheckPending, tsKeyCheckPending] = []) and not (vsDisabled in HitInfo.HitNode.States) then begin with HitInfo.HitNode^ do NewCheckState := DetermineNextCheckState(CheckType, CheckState); if DoChecking(HitInfo.HitNode, NewCheckState) then begin DoStateChange([tsMouseCheckPending]); FCheckNode := HitInfo.HitNode; FPendingCheckState := NewCheckState; FCheckNode.CheckState := PressedState[FCheckNode.CheckState]; InvalidateNode(HitInfo.HitNode); MayEdit := False; end; end; end else begin if hiOnItemButton in HitInfo.HitPositions then begin ToggleNode(HitInfo.HitNode); MayEdit := False; end else begin if toToggleOnDblClick in FOptions.FMiscOptions then begin if ((([hiOnItemButton, hiOnItemLabel, hiOnNormalIcon, hiOnStateIcon] * HitInfo.HitPositions) <> []) or ((toFullRowSelect in FOptions.FSelectionOptions) and Assigned(HitInfo.HitNode))) then begin ToggleNode(HitInfo.HitNode); MayEdit := False; end; end; end; end; end; if MayEdit and Assigned(FFocusedNode) and (FFocusedNode = HitInfo.HitNode) and (FFocusedColumn = HitInfo.HitColumn) and CanEdit(FFocusedNode, HitInfo.HitColumn) then begin DoStateChange([tsEditPending]); FEditColumn := FFocusedcolumn; SetTimer(Handle, EditTimer, FEditDelay, nil); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.HandleMouseDown(var Message: TLMMouse; var HitInfo: THitInfo); // centralized mouse button down handling var LastFocused: PVirtualNode; Column: TColumnIndex; ShiftState: TShiftState; // helper variables to shorten boolean equations/expressions AutoDrag, // automatic (or allowed) drag start IsHit, // the node's caption or images are hit IsCellHit, // for grid extension or full row select (but not check box, button) IsAnyHit, // either IsHit or IsCellHit IsHeightTracking, // height tracking MultiSelect, // multiselection is enabled ShiftEmpty, // ShiftState = [] NodeSelected: Boolean; // the new node (if any) is selected NewColumn: Boolean; // column changed NewNode: Boolean; // Node changed. NeedChange: Boolean; // change event is required for selection change CanClear: Boolean; NewCheckState: TCheckState; AltPressed: Boolean; // Pressing the Alt key enables special processing for selection. FullRowDrag: Boolean; // Start dragging anywhere within a node's bound. NodeRect: TRect; FocusCanChange: Boolean; begin if [tsWheelPanning, tsWheelScrolling] * FStates <> [] then begin StopWheelPanning; Exit; end; if tsEditPending in FStates then begin KillTimer(Handle, EditTimer); DoStateChange([], [tsEditPending]); end; if not (tsEditing in FStates) or DoEndEdit then begin // Focus change. Don't use the SetFocus method as this does not work for MDI windows. if not Focused and CanFocus then begin LCLIntf.SetFocus(Handle); // Repeat the hit test as an OnExit event might got triggered that could modify the tree. GetHitTestInfoAt(Message.XPos, Message.YPos, True, HitInfo); end; // Keep clicked column in case the application needs it. FHeader.FColumns.FClickIndex := HitInfo.HitColumn; // Change column only if we have hit the node label. if (hiOnItemLabel in HitInfo.HitPositions) or (toFullRowSelect in FOptions.FSelectionOptions) or (toGridExtensions in FOptions.FMiscOptions) then begin NewColumn := FFocusedColumn <> HitInfo.HitColumn; if toExtendedFocus in FOptions.FSelectionOptions then Column := HitInfo.HitColumn else Column := FHeader.MainColumn; end else begin NewColumn := False; Column := FFocusedColumn; end; if NewColumn and (not FHeader.AllowFocus(Column)) then begin NewColumn := False; Column := FFocusedColumn; end; NewNode := FFocusedNode <> HitInfo.HitNode; // Translate keys and filter out shift and control key. ShiftState := KeysToShiftState(Message.Keys) * [ssShift, ssCtrlOS, ssAlt]; if ssAlt in ShiftState then begin AltPressed := True; // Remove the Alt key from the shift state. It is not meaningful there. Exclude(ShiftState, ssAlt); end else AltPressed := False; // Various combinations determine what states the tree enters now. // We initialize shorthand variables to avoid the following expressions getting too large // and to avoid repeative expensive checks. IsHit := not AltPressed and not (toSimpleDrawSelection in FOptions.FSelectionOptions) and ((hiOnItemLabel in HitInfo.HitPositions) or (hiOnNormalIcon in HitInfo.HitPositions)); IsCellHit := not AltPressed and not IsHit and Assigned(HitInfo.HitNode) and ([hiOnItemButton, hiOnItemCheckBox] * HitInfo.HitPositions = []) and ((toFullRowSelect in FOptions.FSelectionOptions) or ((toGridExtensions in FOptions.FMiscOptions) and (HitInfo.HitColumn > NoColumn))); IsAnyHit := IsHit or IsCellHit; MultiSelect := toMultiSelect in FOptions.FSelectionOptions; ShiftEmpty := ShiftState = []; NodeSelected := IsAnyHit and (vsSelected in HitInfo.HitNode.States); FullRowDrag := toFullRowDrag in FOptions.FMiscOptions; IsHeightTracking := (Message.Msg = LM_LBUTTONDOWN) and (toNodeHeightResize in FOptions.FMiscOptions) and (hiOnItem in HitInfo.HitPositions) and ([hiUpperSplitter, hiLowerSplitter] * HitInfo.HitPositions <> []) and ((HitInfo.HitColumn > NoColumn) and (coFixed in FHeader.FColumns[HitInfo.HitColumn].Options)); // Dragging might be started in the inherited handler manually (which is discouraged for stability reasons) // the test for manual mode is done below (after the focused node is set). AutoDrag := ((DragMode = dmAutomatic) or Dragging) and (not IsCellHit or FullRowDrag); // Query the application to learn if dragging may start now (if set to dmManual). if Assigned(HitInfo.HitNode) and not AutoDrag and (DragMode = dmManual) then AutoDrag := DoBeforeDrag(HitInfo.HitNode, Column) and (not IsCellHit or FullRowDrag); // handle node height tracking if IsHeightTracking then begin if hiUpperSplitter in HitInfo.HitPositions then FHeightTrackNode := GetPreviousVisible(HitInfo.HitNode, True) else FHeightTrackNode := HitInfo.HitNode; if Assigned(FHeightTrackNode) and (FHeightTrackNode <> FRoot) then begin FHeightTrackColumn := HitInfo.HitColumn; NodeRect := GetDisplayRect(FHeightTrackNode, FHeightTrackColumn, False); FHeightTrackPoint := Point(NodeRect.Left, NodeRect.Top); DoStateChange([tsNodeHeightTrackPending]); Exit; end; end; // handle button clicks if (hiOnItemButton in HitInfo.HitPositions) and (vsHasChildren in HitInfo.HitNode.States) then begin ToggleNode(HitInfo.HitNode); Exit; end; // check event if hiOnItemCheckBox in HitInfo.HitPositions then begin if (FStates * [tsMouseCheckPending, tsKeyCheckPending] = []) and not (vsDisabled in HitInfo.HitNode.States) then begin with HitInfo.HitNode^ do NewCheckState := DetermineNextCheckState(CheckType, CheckState); if DoChecking(HitInfo.HitNode, NewCheckState) then begin DoStateChange([tsMouseCheckPending]); FCheckNode := HitInfo.HitNode; FPendingCheckState := NewCheckState; FCheckNode.CheckState := PressedState[FCheckNode.CheckState]; InvalidateNode(HitInfo.HitNode); end; end; Exit; end; // Keep this node's level in case we need it for constraint selection. if (FRoot.ChildCount > 0) and ShiftEmpty or (FSelectionCount = 0) then if Assigned(HitInfo.HitNode) then FLastSelectionLevel := GetNodeLevel(HitInfo.HitNode) else FLastSelectionLevel := GetNodeLevel(GetLastVisibleNoInit(nil, True)); // pending clearance if MultiSelect and ShiftEmpty and not (hiOnItemCheckbox in HitInfo.HitPositions) and IsAnyHit and AutoDrag and NodeSelected and not FSelectionLocked then DoStateChange([tsClearPending]); // immediate clearance // Determine for the right mouse button if there is a popup menu. In this case and if drag'n drop is pending // the current selection has to stay as it is. with HitInfo, Message do CanClear := not AutoDrag and (not (tsRightButtonDown in FStates) or not HasPopupMenu(HitNode, HitColumn, Point(XPos, YPos))); //lcl FocusCanChange := DoFocusChanging(FFocusedNode, HitInfo.HitNode, FFocusedColumn, Column); if not FSelectionLocked and FocusCanChange and ((not (IsAnyHit or FullRowDrag) and MultiSelect and ShiftEmpty) or (IsAnyHit and (not NodeSelected or (NodeSelected and CanClear)) and (ShiftEmpty or not MultiSelect))) then begin Assert(not (tsClearPending in FStates), 'Pending and direct clearance are mutual exclusive!'); // If the currently hit node was already selected then we have to reselect it again after clearing the current // selection, but without a change event if it is the only selected node. // The same applies if the Alt key is pressed, which allows to start drawing the selection rectangle also // on node captions and images. Here the previous selection state does not matter, though. if NodeSelected or (AltPressed and Assigned(HitInfo.HitNode) and (HitInfo.HitColumn = FHeader.MainColumn)) then begin NeedChange := FSelectionCount > 1; InternalClearSelection; InternalAddToSelection(HitInfo.HitNode, True); if NeedChange then begin Invalidate; Change(nil); end; end else ClearSelection; end; // pending node edit if Focused and ((hiOnItemLabel in HitInfo.HitPositions) or ((toGridExtensions in FOptions.FMiscOptions) and (hiOnItem in HitInfo.HitPositions))) and NodeSelected and not NewColumn and ShiftEmpty then DoStateChange([tsEditPending]); // User starts a selection with a selection rectangle. if not (toDisableDrawSelection in FOptions.FSelectionOptions) and not (IsHit or FullRowDrag) and MultiSelect then begin SetCapture(Handle); DoStateChange([tsDrawSelPending]); FDrawSelShiftState := ShiftState; FNewSelRect := Rect(Message.XPos + FEffectiveOffsetX, Message.YPos - FOffsetY, Message.XPos + FEffectiveOffsetX, Message.YPos - FOffsetY); //lclheader if hoVisible in FHeader.Options then OffsetRect(FNewSelRect, 0, -FHeader.Height); {$ifdef DEBUG_VTV}Logger.Send([lcSelection],'FNewSelRect', FNewSelRect);{$endif} FLastSelRect := Rect(0, 0, 0, 0); if not IsCellHit then Exit; end; // Keep current mouse position. FLastClickPos := Point(Message.XPos, Message.YPos); // Handle selection and node focus change. if IsAnyHit and FocusCanChange then begin if NewColumn then begin InvalidateColumn(FFocusedColumn); InvalidateColumn(Column); FFocusedColumn := Column; end; if DragKind = dkDock then begin KillTimer(Handle, ScrollTimer); DoStateChange([], [tsScrollPending, tsScrolling]); end; // Get the currently focused node to make multiple multi-selection blocks possible. LastFocused := FFocusedNode; if NewNode then DoFocusNode(HitInfo.HitNode, False); if MultiSelect and not ShiftEmpty then HandleClickSelection(LastFocused, HitInfo.HitNode, ShiftState, AutoDrag) else begin if ShiftEmpty then FRangeAnchor := HitInfo.HitNode; // If the hit node is not yet selected then do it now. if not NodeSelected then AddToSelection(HitInfo.HitNode); end; if NewNode or NewColumn then begin ScrollIntoView(FFocusedNode, toCenterScrollIntoView in FOptions.SelectionOptions, not (toDisableAutoscrollHorizontal in FOptions.FAutoOptions)); DoFocusChange(FFocusedNode, FFocusedColumn); end; end; // Drag'n drop initiation // If we lost focus in the interim the button states would be cleared in WM_KILLFOCUS. if AutoDrag and IsAnyHit and (FStates * [tsLeftButtonDown, tsRightButtonDown, tsMiddleButtonDown] <> []) then BeginDrag(False); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.HandleMouseUp(Keys: PtrUInt; const HitInfo: THitInfo); // Counterpart to the mouse down handler. var ReselectFocusedNode: Boolean; begin ReleaseCapture; if not (tsVCLDragPending in FStates) then begin // reset pending or persistent states if IsMouseSelecting then begin DoStateChange([], [tsDrawSelecting, tsDrawSelPending, tsToggleFocusedSelection]); Invalidate; end; if tsClearPending in FStates then begin ReselectFocusedNode := Assigned(FFocusedNode) and (vsSelected in FFocusedNode.States); ClearSelection; if ReselectFocusedNode then AddToSelection(FFocusedNode); end; if (tsToggleFocusedSelection in FStates) and (HitInfo.HitNode = FFocusedNode) then begin if vsSelected in HitInfo.HitNode.States then RemoveFromSelection(HitInfo.HitNode) else AddToSelection(HitInfo.HitNode); InvalidateNode(HitInfo.HitNode); end; DoStateChange([], [tsOLEDragPending, tsOLEDragging, tsClearPending, tsDrawSelPending, tsToggleFocusedSelection, tsScrollPending, tsScrolling]); KillTimer(Handle, ScrollTimer); if tsMouseCheckPending in FStates then begin DoStateChange([], [tsMouseCheckPending]); // Is the mouse still over the same node? if (HitInfo.HitNode = FCheckNode) and (hiOnItem in HitInfo.HitPositions) then DoCheckClick(FCheckNode, FPendingCheckState) else FCheckNode.CheckState := UnpressedState[FCheckNode.CheckState]; InvalidateNode(FCheckNode); FCheckNode := nil; end; if (FHeader.FColumns.FClickIndex > NoColumn) and (FHeader.FColumns.FClickIndex = HitInfo.HitColumn) then DoColumnClick(HitInfo.HitColumn, KeysToShiftState(Keys)); // handle a pending edit event if tsEditPending in FStates then begin // Is the mouse still over the same node? if (HitInfo.HitNode = FFocusedNode) and (hiOnItem in HitInfo.HitPositions) and CanEdit(FFocusedNode, HitInfo.HitColumn) and (toEditOnClick in FOptions.FMiscOptions) then begin FEditColumn := FFocusedColumn; SetTimer(Handle, EditTimer, FEditDelay, nil); end else DoStateChange([], [tsEditPending]); end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.HasImage(Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex): Boolean; // Determines whether the given node has got an image of the given kind in the given column. // Returns True if so, otherwise False. var Ghosted: Boolean; Index: Integer; begin Index := -1; Ghosted := False; DoGetImageIndex(Node, Kind, Column, Ghosted, Index); Result := Index > -1; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.HasPopupMenu(Node: PVirtualNode; Column: TColumnIndex; const Pos: TPoint): Boolean; // Determines whether the tree got a popup menu, either in its PopupMenu property, via the OnGetPopupMenu event or // through inheritance. The latter case must be checked by the descendant which must override this method. begin Result := Assigned(PopupMenu) or Assigned(DoGetPopupMenu(Node, Column, Pos)); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.InitChildren(Node: PVirtualNode); // Initiates the initialization of the child number of the given node. var Count: Cardinal; begin if Assigned(Node) and (Node <> FRoot) and (vsHasChildren in Node.States) then begin Count := Node.ChildCount; DoInitChildren(Node, Count); if Count = 0 then begin // Remove any child node which is already there. DeleteChildren(Node); Exclude(Node.States, vsHasChildren); end else SetChildCount(Node, Count); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.InitNode(Node: PVirtualNode); // Initiates the initialization of the given node to allow the application to load needed data for it. var InitStates: TVirtualNodeInitStates; begin with Node^ do begin Include(States, vsInitialized); InitStates := []; if Parent = FRoot then DoInitNode(nil, Node, InitStates) else DoInitNode(Parent, Node, InitStates); if ivsDisabled in InitStates then Include(States, vsDisabled); if ivsHasChildren in InitStates then Include(States, vsHasChildren); if ivsSelected in InitStates then begin FSingletonNodeArray[0] := Node; InternalAddToSelection(FSingletonNodeArray, 1, False); end; if ivsMultiline in InitStates then Include(States, vsMultiline); // Expanded may already be set (when called from ReinitNode) or be set in DoInitNode, allow both. if (vsExpanded in Node.States) xor (ivsExpanded in InitStates) then begin // Expand node if not yet done (this will automatically initialize child nodes). if ivsExpanded in InitStates then ToggleNode(Node) else // If the node already was expanded then explicitly trigger child initialization. if vsHasChildren in Node.States then InitChildren(Node); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.InternalAddFromStream(Stream: TStream; Version: Integer; Node: PVirtualNode); // Loads all details for Node (including its children) from the given stream. // Because the new nodes might be selected this method also fixes the selection array. var Stop: PVirtualNode; Index: Integer; LastTotalHeight: Cardinal; WasFullyVisible: Boolean; begin Assert(Node <> FRoot, 'The root node cannot be loaded from stream.'); // Keep the current total height value of Node as it has already been applied // but might change in the load and fixup code. We have to adjust that afterwards. LastTotalHeight := Node.TotalHeight; WasFullyVisible := FullyVisible[Node]; // Read in the new nodes. ReadNode(Stream, Version, Node); // One time update of node-internal states and the global visibility counter. // This is located here to ease and speed up the loading process. FixupTotalCount(Node); AdjustTotalCount(Node.Parent, Node.TotalCount - 1, True); // -1 because Node itself was already set. FixupTotalHeight(Node); AdjustTotalHeight(Node.Parent, Node.TotalHeight - LastTotalHeight, True); // New nodes are always visible, so the visible node count has been increased already. // If Node is now invisible we have to take back this increment and don't need to add any visible child node. if not FullyVisible[Node] then begin if WasFullyVisible then Dec(FVisibleCount); end else // It can never happen that the node is now fully visible but was not before as this would require // that the visibility state of one of its parents has changed, which cannot happen during loading. Inc(FVisibleCount, CountVisibleChildren(Node)); // Fix selection array. ClearTempCache; if Node = FRoot then Stop := nil else Stop := Node.NextSibling; if toMultiSelect in FOptions.FSelectionOptions then begin // Add all nodes which were selected before to the current selection (unless they are already there). while Node <> Stop do begin if (vsSelected in Node.States) and not FindNodeInSelection(Node, Index, 0, High(FSelection)) then InternalCacheNode(Node); Node := GetNextNoInit(Node); end; if FTempNodeCount > 0 then AddToSelection(FTempNodeCache, FTempNodeCount, True); ClearTempCache; end else // No further selected nodes allowed so delete the corresponding flag in all new nodes. while Node <> Stop do begin Exclude(Node.States, vsSelected); Node := GetNextNoInit(Node); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.InternalAddToSelection(Node: PVirtualNode; ForceInsert: Boolean): Boolean; begin Assert(Assigned(Node), 'Node must not be nil!'); FSingletonNodeArray[0] := Node; Result := InternalAddToSelection(FSingletonNodeArray, 1, ForceInsert); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.InternalAddToSelection(const NewItems: TNodeArray; NewLength: Integer; ForceInsert: Boolean): Boolean; // Internal version of method AddToSelection which does not trigger OnChange events var I, J: Integer; CurrentEnd: Integer; Constrained, SiblingConstrained: Boolean; begin // The idea behind this code is to use a kind of reverse merge sort. QuickSort is quite fast // and would do the job here too but has a serious problem with already sorted lists like FSelection. // 1) Remove already selected items, mark all other as being selected. if ForceInsert then begin for I := 0 to NewLength - 1 do Include(NewItems[I].States, vsSelected); end else begin Constrained := toLevelSelectConstraint in FOptions.FSelectionOptions; if Constrained and (FLastSelectionLevel = -1) then FLastSelectionLevel := GetNodeLevel(NewItems[0]); SiblingConstrained := toSiblingSelectConstraint in FOptions.FSelectionOptions; if SiblingConstrained and (FRangeAnchor = nil) then FRangeAnchor := NewItems[0]; for I := 0 to NewLength - 1 do if ([vsSelected, vsDisabled] * NewItems[I].States <> []) or (Constrained and (Cardinal(FLastSelectionLevel) <> GetNodeLevel(NewItems[I]))) or (SiblingConstrained and (FRangeAnchor.Parent <> NewItems[I].Parent)) then Inc(PtrUInt(NewItems[I])) else Include(NewItems[I].States, vsSelected); end; I := PackArray(NewItems, NewLength); if I > -1 then NewLength := I; Result := NewLength > 0; if Result then begin // 2) Sort the new item list so we can easily traverse it. if NewLength > 1 then QuickSort(NewItems, 0, NewLength - 1); // 3) Make room in FSelection for the new items. if FSelectionCount + NewLength >= Length(FSelection) then SetLength(FSelection, FSelectionCount + NewLength); // 4) Merge in new items J := NewLength - 1; CurrentEnd := FSelectionCount - 1; while J >= 0 do begin // First insert all new entries which are greater than the greatest entry in the old list. // If the current end marker is < 0 then there's nothing more to move in the selection // array and only the remaining new items must be inserted. if CurrentEnd >= 0 then begin while (J >= 0) and (NewItems[J] > FSelection[CurrentEnd]) do begin FSelection[CurrentEnd + J + 1] := NewItems[J]; Dec(J); end; // early out if nothing more needs to be copied if J < 0 then Break; end else begin // insert remaining new entries at position 0 Move(NewItems[0], FSelection[0], (J + 1) * SizeOf(Pointer)); // nothing more to do so exit main loop Break; end; // find the last entry in the remaining selection list which is smaller then the largest // entry in the remaining new items list FindNodeInSelection(NewItems[J], I, 0, CurrentEnd); Dec(I); // move all entries which are greater than the greatest entry in the new items list up // so the remaining gap travels down to where new items must be inserted Move(FSelection[I + 1], FSelection[I + J + 2], (CurrentEnd - I) * SizeOf(Pointer)); CurrentEnd := I; end; Inc(FSelectionCount, NewLength); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.InternalCacheNode(Node: PVirtualNode); // Adds the given node to the temporary node cache (used when collecting possibly large amounts of nodes). var Len: Cardinal; begin Len := Length(FTempNodeCache); if FTempNodeCount = Len then begin if Len < 100 then Len := 100 else Len := Len + Len div 10; SetLength(FTempNodeCache, Len); end; FTempNodeCache[FTempNodeCount] := Node; Inc(FTempNodeCount); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.InternalClearSelection; var Count: Integer; begin // It is possible that there are invalid node references in the selection array // if the tree update is locked and changes in the structure were made. // Handle this potentially dangerous situation by packing the selection array explicitely. if FUpdateCount > 0 then begin Count := PackArray(FSelection, FSelectionCount); if Count > -1 then begin FSelectionCount := Count; SetLength(FSelection, FSelectionCount); end; end; while FSelectionCount > 0 do begin Dec(FSelectionCount); Exclude(FSelection[FSelectionCount].States, vsSelected); end; ResetRangeAnchor; FSelection := nil; DoStateChange([], [tsClearPending]); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.InternalConnectNode(Node, Destination: PVirtualNode; Target: TBaseVirtualTree; Mode: TVTNodeAttachMode); // Connects Node with Destination depending on Mode. // No error checking takes place. Node as well as Destination must be valid. Node must never be a root node and // Destination must not be a root node if Mode is amInsertBefore or amInsertAfter. var Run: PVirtualNode; begin // Keep in mind that the destination node might belong to another tree. with Target do begin case Mode of amInsertBefore: begin Node.PrevSibling := Destination.PrevSibling; Destination.PrevSibling := Node; Node.NextSibling := Destination; Node.Parent := Destination.Parent; Node.Index := Destination.Index; if Node.PrevSibling = nil then Node.Parent.FirstChild := Node else Node.PrevSibling.NextSibling := Node; // reindex all following nodes Run := Destination; while Assigned(Run) do begin Inc(Run.Index); Run := Run.NextSibling; end; Inc(Destination.Parent.ChildCount); Include(Destination.Parent.States, vsHasChildren); AdjustTotalCount(Destination.Parent, Node.TotalCount, True); // Add the new node's height only if its parent is expanded. if Destination.Parent.States * [vsExpanded, vsVisible] = [vsExpanded, vsVisible] then AdjustTotalHeight(Destination.Parent, Node.TotalHeight, True); if FullyVisible[Node] then Inc(FVisibleCount, CountVisibleChildren(Node) + 1); end; amInsertAfter: begin Node.NextSibling := Destination.NextSibling; Destination.NextSibling := Node; Node.PrevSibling := Destination; Node.Parent := Destination.Parent; if Node.NextSibling = nil then Node.Parent.LastChild := Node else Node.NextSibling.PrevSibling := Node; Node.Index := Destination.Index; // reindex all following nodes Run := Node; while Assigned(Run) do begin Inc(Run.Index); Run := Run.NextSibling; end; Inc(Destination.Parent.ChildCount); Include(Destination.Parent.States, vsHasChildren); AdjustTotalCount(Destination.Parent, Node.TotalCount, True); // Add the new node's height only if its parent is expanded. if Destination.Parent.States * [vsExpanded, vsVisible] = [vsExpanded, vsVisible] then AdjustTotalHeight(Destination.Parent, Node.TotalHeight, True); if FullyVisible[Node] then Inc(FVisibleCount, CountVisibleChildren(Node) + 1); end; amAddChildFirst: begin if Assigned(Destination.FirstChild) then begin // If there's a first child then there must also be a last child. Destination.FirstChild.PrevSibling := Node; Node.NextSibling := Destination.FirstChild; Destination.FirstChild := Node; end else begin // First child node at this location. Destination.FirstChild := Node; Destination.LastChild := Node; Node.NextSibling := nil; end; Node.PrevSibling := nil; Node.Parent := Destination; Node.Index := 0; // reindex all following nodes Run := Node.NextSibling; while Assigned(Run) do begin Inc(Run.Index); Run := Run.NextSibling; end; Inc(Destination.ChildCount); Include(Destination.States, vsHasChildren); AdjustTotalCount(Destination, Node.TotalCount, True); // Add the new node's height only if its parent is expanded. if Destination.States * [vsExpanded, vsVisible] = [vsExpanded, vsVisible] then AdjustTotalHeight(Destination, Node.TotalHeight, True); if FullyVisible[Node] then Inc(FVisibleCount, CountVisibleChildren(Node) + 1); end; amAddChildLast: begin if Assigned(Destination.LastChild) then begin // If there's a last child then there must also be a first child. Destination.LastChild.NextSibling := Node; Node.PrevSibling := Destination.LastChild; Destination.LastChild := Node; end else begin // first child node at this location Destination.FirstChild := Node; Destination.LastChild := Node; Node.PrevSibling := nil; end; Node.NextSibling := nil; Node.Parent := Destination; if Assigned(Node.PrevSibling) then Node.Index := Node.PrevSibling.Index + 1 else Node.Index := 0; Inc(Destination.ChildCount); Include(Destination.States, vsHasChildren); AdjustTotalCount(Destination, Node.TotalCount, True); // Add the new node's height only if its parent is expanded. if Destination.States * [vsExpanded, vsVisible] = [vsExpanded, vsVisible] then AdjustTotalHeight(Destination, Node.TotalHeight, True); if FullyVisible[Node] then Inc(FVisibleCount, CountVisibleChildren(Node) + 1); end; else // amNoWhere: do nothing end; // Remove temporary states. Node.States := Node.States - [vsChecking, vsCutOrCopy, vsDeleting, vsClearing]; // Update the hidden children flag of the parent. if (Mode <> amNoWhere) and (Node.Parent <> FRoot) then begin // If we have added a visible node then simply remove the all-children-hidden flag. if vsVisible in Node.States then Exclude(Node.Parent.States, vsAllChildrenHidden) else // If we have added an invisible node and this is the only child node then // make sure the all-children-hidden flag is in a determined state. // If there were child nodes before then no action is needed. if Node.Parent.ChildCount = 1 then Include(Node.Parent.States, vsAllChildrenHidden); end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.InternalData(Node: PVirtualNode): Pointer; begin Result := nil; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.InternalDisconnectNode(Node: PVirtualNode; KeepFocus: Boolean; Reindex: Boolean = True); // Disconnects the given node from its parent and siblings. The node's pointer are not reset so they can still be used // after return from this method (probably a very short time only!). // If KeepFocus is True then the focused node is not reset. This is useful if the given node is reconnected to the tree // immediately after return of this method and should stay being the focused node if it was it before. // Note: Node must not be nil or the root node. var Parent, Run: PVirtualNode; Index: Integer; AdjustHeight: Boolean; begin Assert(Assigned(Node) and (Node <> FRoot), 'Node must neither be nil nor the root node.'); if (Node = FFocusedNode) and not KeepFocus then begin DoFocusNode(nil, False); DoFocusChange(FFocusedNode, FFocusedColumn); end; if Node = FRangeAnchor then ResetRangeAnchor; // Update the hidden children flag of the parent. if (Node.Parent <> FRoot) and not (vsClearing in Node.Parent.States) then if FUpdateCount = 0 then DetermineHiddenChildrenFlag(Node.Parent) else Include(FStates, tsUpdateHiddenChildrenNeeded); if not (vsDeleting in Node.States) then begin // Some states are only temporary so take them out. Node.States := Node.States - [vsChecking]; Parent := Node.Parent; Dec(Parent.ChildCount); AdjustHeight := Parent.States * [vsExpanded, vsVisible] = [vsExpanded, vsVisible]; if Parent.ChildCount = 0 then begin Parent.States := Parent.States - [vsAllChildrenHidden, vsHasChildren]; if (Parent <> FRoot) and (vsExpanded in Parent.States) then Exclude(Parent.States, vsExpanded); end; AdjustTotalCount(Parent, -Integer(Node.TotalCount), True); if AdjustHeight then AdjustTotalHeight(Parent, -Integer(Node.TotalHeight), True); if FullyVisible[Node] then Dec(FVisibleCount, CountVisibleChildren(Node) + 1); if Assigned(Node.PrevSibling) then Node.PrevSibling.NextSibling := Node.NextSibling else Parent.FirstChild := Node.NextSibling; if Assigned(Node.NextSibling) then begin Node.NextSibling.PrevSibling := Node.PrevSibling; // Reindex all following nodes. if Reindex then begin Run := Node.NextSibling; Index := Node.Index; while Assigned(Run) do begin Run.Index := Index; Inc(Index); Run := Run.NextSibling; end; end; end else Parent.LastChild := Node.PrevSibling; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.InternalGetNodeAt(X, Y: Integer): PVirtualNode; var Dummy: Integer; begin Result := InternalGetNodeAt(X, Y, True, Dummy); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.InternalGetNodeAt(X, Y: Integer; Relative: Boolean; var NodeTop: Integer): PVirtualNode; //lclheader this is the original version of GetNodeAt used internally since expects coordinates // relative to the image tree. In LCL the image tree and control coordinates are different // when header is visible // This method returns the node that occupies the specified point, or nil if there's none. // If Relative is True then X and Y are given in client coordinates otherwise they are considered as being // absolute values into the virtual tree image (regardless of the current offsets in the tree window). // NodeTop gets the absolute or relative top position of the node returned or is untouched if no node // could be found. var AbsolutePos, CurrentPos: Cardinal; begin if Y < 0 then Exit(nil); AbsolutePos := Y; if Relative then Inc(AbsolutePos, -FOffsetY); // CurrentPos tracks a running term of the current position to test for. // It corresponds always to the top position of the currently considered node. CurrentPos := 0; // If the cache is available then use it. if tsUseCache in FStates then Result := FindInPositionCache(AbsolutePos, CurrentPos) else Result := GetFirstVisibleNoInit(nil, True); // Determine node, of which position and height corresponds to the scroll position most closely. while Assigned(Result) and (Result <> FRoot) do begin if AbsolutePos < (CurrentPos + NodeHeight[Result]) then Break; Inc(CurrentPos, NodeHeight[Result]); Result := GetNextVisibleNoInit(Result, True); end; if Result = FRoot then Result := nil; // Since the given vertical position is likely not the same as the top position // of the found node this top position is returned. if Assigned(Result) then begin NodeTop := CurrentPos; if Relative then Inc(NodeTop, FOffsetY); //{$ifdef DEBUG_VTV}Logger.Send([lcPaintHeader],'GetNodeAt Result: ',Result^.Index);{$endif} end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.InternalRemoveFromSelection(Node: PVirtualNode); // Special version to mark a node to be no longer in the current selection. PackArray must // be used to remove finally those entries. var Index: Integer; begin // Because pointers are always DWORD aligned we can simply increment all those // which we want to have removed (see also PackArray) and still have the // order in the list preserved. if FindNodeInSelection(Node, Index, -1, -1) then begin Exclude(Node.States, vsSelected); Inc(PtrUInt(FSelection[Index])); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.InvalidateCache; // Marks the cache as invalid. begin DoStateChange([tsValidationNeeded], [tsUseCache]); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.MarkCutCopyNodes; // Sets the vsCutOrCopy style in every currently selected but not disabled node to indicate it is // now part of a clipboard operation. var Nodes: TNodeArray; I: Integer; begin Nodes := nil; if FSelectionCount > 0 then begin // need the current selection sorted to exclude selected nodes which are children, grandchildren etc. of // already selected nodes Nodes := GetSortedSelection(False); for I := 0 to High(Nodes) do with Nodes[I]^ do if not (vsDisabled in States) then Include(States, vsCutOrCopy); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.Loaded; var LastRootCount: Cardinal; IsReadOnly: Boolean; begin inherited; // If a root node count has been set during load of the tree then update its child structure now // as this hasn't been done yet in this case. if (tsNeedRootCountUpdate in FStates) and (FRoot.ChildCount > 0) then begin DoStateChange([], [tsNeedRootCountUpdate]); IsReadOnly := toReadOnly in FOptions.FMiscOptions; Exclude(FOptions.FMiscOptions, toReadOnly); LastRootCount := FRoot.ChildCount; FRoot.ChildCount := 0; BeginUpdate; SetChildCount(FRoot, LastRootCount); EndUpdate; if IsReadOnly then Include(FOptions.FMiscOptions, toReadOnly); end; // Prevent the object inspector at design time from marking the header as being modified // when auto resize is enabled. Updating; try FHeader.UpdateMainColumn; FHeader.FColumns.FixPositions; if toAutoBidiColumnOrdering in FOptions.FAutoOptions then FHeader.FColumns.ReorderColumns(UseRightToLeftAlignment); FHeader.RecalculateHeader; //lclheader //AdjustAutoSize is called inside CreateWnd. Don't call here //Keep the commented code until we get sure of not being necessary //if hoAutoResize in FHeader.FOptions then // FHeader.FColumns.AdjustAutoSize(InvalidColumn, True); finally Updated; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.MainColumnChanged; begin DoCancelEdit; {$ifdef EnableAccessible} NotifyWinEvent(EVENT_OBJECT_NAMECHANGE, Handle, OBJID_CLIENT, CHILDID_SELF); {$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.MouseMove(Shift: TShiftState; X, Y: Integer); var R: TRect; NewCursor: TCursor; HitInfo: THitInfo; P: TPoint; Node: PVirtualNode; begin // lcl: Adjust cursor if ([tsWheelPanning, tsWheelScrolling] * FStates = []) then begin // Apply own cursors only if there is no global cursor set. if Screen.Cursor = crDefault then begin NewCursor := crDefault; if (toNodeHeightResize in FOptions.FMiscOptions) then begin GetCursorPos(P); P := ScreenToClient(P); GetHitTestInfoAt(P.X, P.Y, True, HitInfo); if (hiOnItem in HitInfo.HitPositions) and ([hiUpperSplitter, hiLowerSplitter] * HitInfo.HitPositions <> []) and ((hitInfo.HitColumn > NoColumn) and (coFixed in FHeader.FColumns[HitInfo.HitColumn].FOptions)) then begin if hiUpperSplitter in HitInfo.HitPositions then Node := GetPreviousVisible(HitInfo.HitNode, True) else Node := HitInfo.HitNode; if Assigned(Node) and (Node <> FRoot) then NewCursor := crVertSplit; end; end; if (NewCursor = crDefault) and (toHotTrack in FOptions.PaintOptions) and Assigned(FCurrentHotNode) then NewCursor := FHotCursor; DoGetCursor(NewCursor); Cursor := NewCursor; end; end; if tsNodeHeightTrackPending in FStates then begin // Remove hint if shown currently. Application.CancelHint; // Stop wheel panning if active. StopWheelPanning; // Stop timers KillTimer(Handle, ExpandTimer); KillTimer(Handle, EditTimer); KillTimer(Handle, ScrollTimer); KillTimer(Handle, SearchTimer); FSearchBuffer := ''; FLastSearchNode := nil; DoStateChange([tsNodeHeightTracking], [tsScrollPending, tsScrolling, tsEditPending, tsOLEDragPending, tsVCLDragPending, tsIncrementalSearching, tsNodeHeightTrackPending]); end; if tsDrawSelPending in FStates then begin // Remove current selection in case the user clicked somewhere in the window (but not a node) // and moved the mouse. if CalculateSelectionRect(X, Y) then begin //lclheader R := FNewSelRect; if hoVisible in FHeader.Options then OffsetRect(R, 0, FHeader.Height); InvalidateRect(Handle, @R, False); UpdateWindow(Handle); if (Abs(FNewSelRect.Right - FNewSelRect.Left) > DragManager.DragThreshold) or (Abs(FNewSelRect.Bottom - FNewSelRect.Top) > DragManager.DragThreshold) then begin if tsClearPending in FStates then begin DoStateChange([], [tsClearPending]); ClearSelection; end; DoStateChange([tsDrawSelecting], [tsDrawSelPending]); // Reset to main column for multiselection. FocusedColumn := FHeader.MainColumn; // The current rectangle may already include some node captions. Handle this. if HandleDrawSelection(X, Y) then InvalidateRect(Handle, nil, False); end; end; end else begin if tsNodeHeightTracking in FStates then begin // Handle height tracking. if DoNodeHeightTracking(FHeightTrackNode, FHeightTrackColumn, FHeader.GetShiftState, FHeightTrackPoint, Point(X, Y)) then begin // Avoid negative (or zero) node heights. if FHeightTrackPoint.Y >= Y then Y := FHeightTrackPoint.Y + 1; SetNodeHeight(FHeightTrackNode, Y - FHeightTrackPoint.Y); UpdateWindow(Handle); Exit; end; end; // If both wheel panning and auto scrolling are pending then the user moved the mouse while holding down the // middle mouse button. This means panning is being used, hence remove the wheel scroll flag. if [tsWheelPanning, tsWheelScrolling] * FStates = [tsWheelPanning, tsWheelScrolling] then begin if ((Abs(FLastClickPos.X - X) >= DragManager.DragThreshold) or (Abs(FLastClickPos.Y - Y) >= DragManager.DragThreshold)) then DoStateChange([], [tsWheelScrolling]); end; // Really start dragging if the mouse has been moved more than the threshold. if (tsOLEDragPending in FStates) and ((Abs(FLastClickPos.X - X) >= FDragThreshold) or (Abs(FLastClickPos.Y - Y) >= FDragThreshold)) then DoDragging(FLastClickPos) else begin if CanAutoScroll then DoAutoScroll(X, Y); if [tsWheelPanning, tsWheelScrolling] * FStates <> [] then AdjustPanningCursor(X, Y); if not IsMouseSelecting then begin HandleHotTrack(X, Y); inherited MouseMove(Shift, X, Y); end else begin // Handle draw selection if required, but don't do the work twice if the // auto scrolling code already cares about the selection. if not (tsScrolling in FStates) and CalculateSelectionRect(X, Y) then begin // If something in the selection changed then invalidate the entire // tree instead trying to figure out the display rects of all changed nodes. if HandleDrawSelection(X, Y) then InvalidateRect(Handle, nil, False) else begin UnionRect(R, OrderRect(FNewSelRect), OrderRect(FLastSelRect)); OffsetRect(R, -FEffectiveOffsetX, FOffsetY); if hoVisible in FHeader.Options then OffsetRect(R, 0, FHeader.Height); InvalidateRect(Handle, @R, False); end; UpdateWindow(Handle); end; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.Notification(AComponent: TComponent; Operation: TOperation); begin if (AComponent <> Self) and (Operation = opRemove) then begin // Check for components linked to the tree. if AComponent = FImages then begin Images := nil; if not (csDestroying in ComponentState) then Invalidate; end else if AComponent = FStateImages then begin StateImages := nil; if not (csDestroying in ComponentState) then Invalidate; end else if AComponent = PopupMenu then PopupMenu := nil else // Check for components linked to the header. if AComponent = FHeader.FImages then FHeader.Images := nil else if AComponent = FHeader.PopupMenu then FHeader.PopupMenu := nil; end; inherited; end; //---------------------------------------------------------------------------------------------------------------------- {$ifdef EnableNCFunctions} procedure TBaseVirtualTree.OriginalWMNCPaint(DC: HDC); // Unfortunately, the painting for the non-client area in TControl is not always correct and does also not consider // existing clipping regions, so it has been modified here to take this into account. const InnerStyles: array[TBevelCut] of Integer = (0, BDR_SUNKENINNER, BDR_RAISEDINNER, 0); OuterStyles: array[TBevelCut] of Integer = (0, BDR_SUNKENOUTER, BDR_RAISEDOUTER, 0); EdgeStyles: array[TBevelKind] of Integer = (0, 0, BF_SOFT, BF_FLAT); Ctl3DStyles: array[Boolean] of Integer = (BF_MONO, 0); var RC, RW: TRect; EdgeSize: Integer; Size: TSize; begin if (BevelKind <> bkNone) or (BorderWidth > 0) then begin RC := Rect(0, 0, Width, Height); Size := GetBorderDimensions; InflateRect(RC, Size.cx, Size.cy); RW := RC; if BevelKind <> bkNone then begin DrawEdge(DC, RC, InnerStyles[BevelInner] or OuterStyles[BevelOuter], Byte(BevelEdges) or EdgeStyles[BevelKind] or Ctl3DStyles[Ctl3D]); EdgeSize := 0; if BevelInner <> bvNone then Inc(EdgeSize, BevelWidth); if BevelOuter <> bvNone then Inc(EdgeSize, BevelWidth); with RC do begin if beLeft in BevelEdges then Inc(Left, EdgeSize); if beTop in BevelEdges then Inc(Top, EdgeSize); if beRight in BevelEdges then Dec(Right, EdgeSize); if beBottom in BevelEdges then Dec(Bottom, EdgeSize); end; end; // Repaint only the part in the original clipping region and not yet drawn parts. IntersectClipRect(DC, RC.Left, RC.Top, RC.Right, RC.Bottom); // Determine inner rectangle to exclude (RC corresponds then to the client area). InflateRect(RC, -BorderWidth, -BorderWidth); // Remove the inner rectangle. ExcludeClipRect(DC, RC.Left, RC.Top, RC.Right, RC.Bottom); // Erase parts not drawn. Brush.Color := FColors.BorderColor; Windows.FillRect(DC, RW, Brush.Handle); end; end; {$endif} //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.Paint; // Window paint routine. Used when the tree window needs to be updated. var Window: TRect; Target: TPoint; Temp: Integer; Options: TVTInternalPaintOptions; RTLOffset: Integer; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcPaint],'Paint');{$endif} Options := [poBackground, poColumnColor, poDrawFocusRect, poDrawDropMark, poDrawSelection, poGridLines]; if UseRightToLeftAlignment and FHeader.UseColumns then RTLOffset := ComputeRTLOffset(True) else RTLOffset := 0; // The update rect has already been filled in WMPaint, as it is the window's update rect, which gets // reset when BeginPaint is called (in the ancestor). // The difference to the DC's clipbox is that it is also valid with internal paint operations used // e.g. by the Explorer while dragging, but show window content while dragging is disabled. if not IsRectEmpty(FUpdateRect) then begin Temp := Header.Columns.GetVisibleFixedWidth; if Temp = 0 then begin Window := FUpdateRect; {$ifdef DEBUG_VTV}Logger.Send([lcHeaderOffset], 'FUpdateRect', FUpdateRect);{$endif} Target := Window.TopLeft; //lclheader if hoVisible in FHeader.FOptions then begin if Target.Y < FHeader.Height then begin Window.Top := 0; Target.Y := FHeader.Height; end else begin Dec(Window.Top, FHeader.Height); end; Dec(Window.Bottom, FHeader.Height); if RectVisible(Canvas.Handle, FHeaderRect) then begin {$ifdef DEBUG_VTV}Logger.Send([lcPaintHeader],'RectVisible = True');{$endif} FHeader.FColumns.PaintHeader(Canvas.Handle, FHeaderRect, -FEffectiveOffsetX); end; with FHeaderRect do ExcludeClipRect(Canvas.Handle, Left, Top, Right, Bottom); end; // The clipping rectangle is given in client coordinates of the window. We have to convert it into // a sliding window of the tree image. {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'FEffectiveOffsetX: %d, RTLOffset: %d, OffsetY: %d',[FEffectiveOffsetX,RTLOffset,FOffsetY]);{$endif} OffsetRect(Window, FEffectiveOffsetX - RTLOffset, -FOffsetY); //{$ifdef DEBUG_VTV}Logger.Active:=Logger.CalledBy('DoDragging');{$endif} PaintTree(Canvas, Window, Target, Options); //{$ifdef DEBUG_VTV}Logger.Active:=True;{$endif} end else begin {$ifdef DEBUG_VTV}Logger.Send([lcPaint],'VisibleFixedWidth > 0');{$endif} // First part, fixed columns Window := ClientRect; Window.Right := Temp; Target := Window.TopLeft; //lclheader if hoVisible in FHeader.FOptions then begin //Target is always (0,0) due to call to ClientRect, so no need set Top to 0 //also no need to decrease bottom because ClientRect already computes header Inc(Target.Y, FHeader.Height); if RectVisible(Canvas.Handle, FHeaderRect) then begin {$ifdef DEBUG_VTV}Logger.Send([lcPaintHeader], 'RectVisible = True');{$endif} FHeader.FColumns.PaintHeader(Canvas.Handle, FHeaderRect, -FEffectiveOffsetX); end; with FHeaderRect do ExcludeClipRect(Canvas.Handle,Left,Top,Right,Bottom); end; OffsetRect(Window, -RTLOffset, -FOffsetY); PaintTree(Canvas, Window, Target, Options); // Second part, other columns Window := GetClientRect; if Temp > Window.Right then begin {$ifdef DEBUG_VTV}Logger.ExitMethod([lcPaint],'Paint');{$endif} Exit; end; Window.Left := Temp; Target := Window.TopLeft; //lclheader if hoVisible in FHeader.FOptions then Inc(Target.Y, FHeader.Height); {$ifdef DEBUG_VTV}Logger.Send([lcDrag],'FEffectiveOffsetX: %d, RTLOffset: %d, OffsetY: %d',[FEffectiveOffsetX,RTLOffset,FOffsetY]);{$endif} OffsetRect(Window, FEffectiveOffsetX - RTLOffset, -FOffsetY); PaintTree(Canvas, Window, Target, Options); end; end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcPaint],'Paint');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.PaintCheckImage(const PaintInfo: TVTPaintInfo); procedure DrawCheckButton(Canvas: TCanvas; Index: Integer; const R: TRect; Flat: Boolean); var ButtonState: Cardinal; ButtonType: Cardinal; begin if Index < 8 then ButtonType := DFCS_BUTTONRADIO else ButtonType := DFCS_BUTTONCHECK; if Index >= 16 then ButtonType := ButtonType or DFCS_BUTTON3STATE; case Index mod 4 of 0: ButtonState := 0; 1: ButtonState := DFCS_HOT; 2: ButtonState := DFCS_PUSHED; else ButtonState := DFCS_INACTIVE; end; if Index in [4..7, 12..19] then ButtonState := ButtonState or DFCS_CHECKED; if Flat then ButtonState := ButtonState or DFCS_FLAT; DrawFrameControl(Canvas.Handle, R, DFC_BUTTON, ButtonType or ButtonState); end; var R: TRect; {$ifdef ThemeSupport} Details: TThemedElementDetails; {$endif} UseThemes: Boolean; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcCheck],'PaintCheckImage');{$endif} with PaintInfo, ImageInfo[iiCheck] do begin {$ifdef ThemeSupport} UseThemes := (tsUseThemes in FStates) and (FCheckImageKind = ckSystemDefault); {$else} UseThemes := False; {$endif} if UseThemes or ((FCheckImageKind in [ckSystemFlat, ckSystemDefault]) and not (Index in [21..24])) then begin {$ifdef ThemeSupport} if UseThemes then begin R := Rect(XPos - 1, YPos, XPos + 16, YPos + 16); Details.Element := teButton; case Index of 0..8: // radio buttons begin Details.Part := BP_RADIOBUTTON; Details.State := Index; end; 9..20: // check boxes begin Details.Part := BP_CHECKBOX; Details.State := Index - 8; end; 21..24: // buttons begin Details.Part := BP_PUSHBUTTON; Details.State := Index - 20; end; else Details.Part := 0; Details.State := 0; end; ThemeServices.DrawElement(Canvas.Handle, Details, R); {$ifdef USE_DELPHICOMPAT} if Index in [21..24] then with UtilityImages do DirectMaskBlt(PaintInfo.Canvas.Handle, XPos - 1, YPos, Height, Height, Canvas.Handle, 4 * Height, 0, MaskHandle); {$else} if Index in [21..24] then with UtilityImages do StretchMaskBlt(PaintInfo.Canvas.Handle, XPos - 1, YPos, Height, Height, Canvas.Handle, 4 * Height, 0, Height, Height, MaskHandle, 4 * Height, 0, SRCCOPY); {$endif} end else {$endif} begin R := Rect(XPos + 1, YPos + 1, XPos + 14, YPos + 14); DrawCheckButton(Canvas, Index - 1, R, FCheckImageKind = ckSystemFlat); end; end else with FCheckImages do begin {$ifdef USE_DELPHICOMPAT} DirectMaskBlt(PaintInfo.Canvas.Handle, XPos, YPos, Height, Height, Canvas.Handle, Index * Height, 0, MaskHandle); {$else} StretchMaskBlt(PaintInfo.Canvas.Handle, XPos, YPos, Height, Height, Canvas.Handle, Index * Height, 0, Height, Height, MaskHandle, Index * Height, 0, SRCCOPY); {$endif} end; end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcCheck],'PaintCheckImage');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.PaintImage(var PaintInfo: TVTPaintInfo; ImageInfoIndex: TVTImageInfoIndex; DoOverlay: Boolean); var CutNode: Boolean; PaintFocused: Boolean; DrawEffect: TGraphicsDrawEffect; begin with PaintInfo do begin CutNode := (vsCutOrCopy in Node.States) and (tsCutPending in FStates); PaintFocused := Focused or (toGhostedIfUnfocused in FOptions.FPaintOptions); // Since the overlay image must be specified together with the image to draw // it is meaningfull to retrieve it in advance. if DoOverlay then GetImageIndex(PaintInfo, ikOverlay, iiOverlay, Images) else PaintInfo.ImageInfo[iiOverlay].Index := -1; with ImageInfo[ImageInfoIndex] do begin if (vsSelected in Node.States) and not (Ghosted or CutNode) then begin if PaintFocused or (toPopupMode in FOptions.FPaintOptions) then Images.BlendColor := FColors.FocusedSelectionColor else Images.BlendColor := FColors.UnfocusedSelectionColor; end else Images.BlendColor := Color; if (vsDisabled in Node.States) or not Enabled then DrawEffect := gdeDisabled else // Blend image if enabled and the tree has the focus (or ghosted images must be drawn also if unfocused) ... if (toUseBlendedImages in FOptions.FPaintOptions) and PaintFocused // ... and the image is ghosted... and (Ghosted or // ... or it is not the check image and the node is selected (but selection is not for the entire row)... ((vsSelected in Node.States) and not (toFullRowSelect in FOptions.FSelectionOptions) and not (toGridExtensions in FOptions.FMiscOptions)) or // ... or the node must be shown in cut mode. CutNode) then DrawEffect := gdeShadowed else DrawEffect := gdeNormal; if (vsSelected in Node.States) and not Ghosted then Images.BlendColor := clDefault; Images.Draw(Canvas, XPos, YPos, Index, DrawEffect); // Now, draw the overlay. // Delphi version has the ability to use the built in overlay indices of windows system image lists // Since this is system dependent the LCL version will support only custom overlays // Note: XPos and YPos are those of the normal images. if PaintInfo.ImageInfo[iiOverlay].Index >= 0 then ImageInfo[iiOverlay].Images.Draw(Canvas, XPos, YPos, ImageInfo[iiOverlay].Index); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.PaintNodeButton(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const R: TRect; ButtonX, ButtonY: Integer; BidiMode: TBiDiMode); var Bitmap: TBitmap; XPos: Integer; IsHot: Boolean; begin IsHot := (toHotTrack in FOptions.FPaintOptions) and (FCurrentHotNode = Node) and FHotNodeButtonHit; if vsExpanded in Node.States then begin if IsHot then Bitmap := FHotMinusBM else Bitmap := FMinusBM; end else begin if IsHot then Bitmap := FHotPlusBM else Bitmap := FPlusBM; end; // Draw the node's plus/minus button according to the directionality. if BidiMode = bdLeftToRight then XPos := R.Left + ButtonX else XPos := R.Right - ButtonX - Bitmap.Width; // Need to draw this masked. Canvas.Draw(XPos, R.Top + ButtonY, Bitmap); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.PaintTreeLines(const PaintInfo: TVTPaintInfo; VAlignment, IndentSize: Integer; LineImage: TLineImage); var I: Integer; XPos, Offset: Integer; NewStyles: TLineImage; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcPaintDetails],'PaintTreeLines');{$endif} NewStyles := nil; with PaintInfo do begin if BidiMode = bdLeftToRight then begin XPos := CellRect.Left; Offset := FIndent; end else begin Offset := -Integer(FIndent); XPos := CellRect.Right + Offset; end; case FLineMode of lmBands: if poGridLines in PaintInfo.PaintOptions then begin // Convert the line images in correct bands. SetLength(NewStyles, Length(LineImage)); for I := IndentSize - 1 downto 0 do begin {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'FLineMode = lmBands');{$endif} if (vsExpanded in Node.States) and not (vsAllChildrenHidden in Node.States) then NewStyles[I] := ltLeft else case LineImage[I] of ltRight, ltBottomRight, ltTopDownRight, ltTopRight: NewStyles[I] := ltLeftBottom; ltNone: // Have to take over the image to the right of this one. A no line entry can never appear as // last entry so I don't need an end check here. if LineImage[I + 1] in [ltNone, ltTopRight] then NewStyles[I] := NewStyles[I + 1] else NewStyles[I] := ltLeft; ltTopDown: // Have to check the image to the right of this one. A top down line can never appear as // last entry so I don't need an end check here. if LineImage[I + 1] in [ltNone, ltTopRight] then NewStyles[I] := NewStyles[I + 1] else NewStyles[I] := ltLeft; end; end; PaintInfo.Canvas.Font.Color := FColors.GridLineColor; for I := 0 to IndentSize - 1 do begin DrawLineImage(PaintInfo, XPos, CellRect.Top, NodeHeight[Node] - 1, VAlignment, NewStyles[I], BidiMode <> bdLeftToRight); Inc(XPos, Offset); end; end; else // lmNormal {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'FLineMode = lmNormal');{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'Brush.Color',PaintInfo.Canvas.Brush.Color);{$endif} PaintInfo.Canvas.Font.Color := FColors.TreeLineColor; {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'Brush.Color',PaintInfo.Canvas.Font.Color);{$endif} for I := 0 to IndentSize - 1 do begin DrawLineImage(PaintInfo, XPos, CellRect.Top, NodeHeight[Node], VAlignment, LineImage[I], BidiMode <> bdLeftToRight); Inc(XPos, Offset); end; end; end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcPaintDetails],'PaintTreeLines');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.PaintSelectionRectangle(Target: TCanvas; WindowOrgX: Integer; const SelectionRect: TRect; TargetRect: TRect); // Helper routine to draw a selection rectangle in the mode determined by DrawSelectionMode. var BlendRect: TRect; TextColorBackup, BackColorBackup: COLORREF; // used to restore forground and background colors when drawing a selection rectangle begin {$ifdef DEBUG_VTV}Logger.Send([lcSelection], 'SelectionRect at PaintSelection', SelectionRect);{$endif} if ((FDrawSelectionMode = smDottedRectangle) and not (tsUseThemes in FStates)) or not MMXAvailable then begin // Classical selection rectangle using dotted borderlines. TextColorBackup := GetTextColor(Target.Handle); SetTextColor(Target.Handle, $FFFFFF); BackColorBackup := GetBkColor(Target.Handle); SetBkColor(Target.Handle, 0); Target.DrawFocusRect(SelectionRect); SetTextColor(Target.Handle, TextColorBackup); SetBkColor(Target.Handle, BackColorBackup); end else begin // Modern alpha blended style. OffsetRect(TargetRect, WindowOrgX, 0); if IntersectRect(BlendRect, OrderRect(SelectionRect), TargetRect) then begin OffsetRect(BlendRect, -WindowOrgX, 0); AlphaBlend(0, Target.Handle, BlendRect, Point(0, 0), bmConstantAlphaAndColor, FSelectionBlendFactor, ColorToRGB(FColors.SelectionRectangleBlendColor)); Target.Brush.Color := FColors.SelectionRectangleBorderColor; Target.FrameRect(SelectionRect); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.PrepareCell(var PaintInfo: TVTPaintInfo; WindowOrgX, MaxWidth: Integer); // This method is called immediately before a cell's content is drawn und is responsible to paint selection colors etc. var TextColorBackup, BackColorBackup: COLORREF; FocusRect, InnerRect: TRect; {$ifdef ThemeSupport} RowRect: TRect; //Theme: HTHEME; {$endif ThemeSupport} //--------------- local functions ------------------------------------------- procedure AlphaBlendSelection(Color: TColor); var R: TRect; begin // Take into account any window offset and size limitations in the target bitmap, as this is only as large // as necessary and might not cover the whole node. For normal painting this does not matter (because of // clipping) but for the MMX code there is no such check and it will crash badly when bitmap boundaries are // crossed. R := InnerRect; OffsetRect(R, -WindowOrgX, 0); if R.Left < 0 then R.Left := 0; if R.Right > MaxWidth then R.Right := MaxWidth; AlphaBlend(0, PaintInfo.Canvas.Handle, R, Point(0, 0), bmConstantAlphaAndColor, FSelectionBlendFactor, ColorToRGB(Color)); end; //--------------------------------------------------------------------------- {$ifdef ThemeSupport} //todo { procedure DrawBackground(State: Integer); begin with PaintInfo do if (toGridExtensions in FOptions.FMiscOptions) or (toFullRowSelect in FOptions.FSelectionOptions) then DrawThemeBackground(Theme, Canvas.Handle, TVP_TREEITEM, State, RowRect, @CellRect) else DrawThemeBackground(Theme, Canvas.Handle, TVP_TREEITEM, State, InnerRect, nil); end; } {$endif ThemeSupport} //--------------- end local functions --------------------------------------- begin {$ifdef ThemeSupport} //todo { if IsWinVistaOrAbove and (tsUseThemes in FStates) and (toUseExplorerTheme in FOptions.FPaintOptions) then begin RowRect := Rect(0, PaintInfo.CellRect.Top, FRangeX, PaintInfo.CellRect.Bottom); if toShowVertGridLines in FOptions.PaintOptions then Dec(RowRect.Right); Theme := OpenThemeData(Handle, 'TREEVIEW'); end else Theme := 0; } {$endif ThemeSupport} with PaintInfo, Canvas do begin // Fill cell background if its color differs from tree background. with FHeader.FColumns do if poColumnColor in PaintOptions then begin Brush.Color := Items[Column].Color; FillRect(CellRect); end; // Let the application customize the cell background and the content rectangle. DoBeforeCellPaint(Canvas, Node, Column, cpmPaint, CellRect, ContentRect); InnerRect := ContentRect; // The selection rectangle depends on alignment. if not (toGridExtensions in FOptions.FMiscOptions) then begin case Alignment of taLeftJustify: with InnerRect do if Left + NodeWidth < Right then Right := Left + NodeWidth; taCenter: with InnerRect do if (Right - Left) > NodeWidth then begin Left := (Left + Right - NodeWidth) div 2; Right := Left + NodeWidth; end; taRightJustify: with InnerRect do if (Right - Left) > NodeWidth then Left := Right - NodeWidth; end; end; if (Column = FFocusedColumn) or (toFullRowSelect in FOptions.FSelectionOptions) then begin // Fill the selection rectangle. if poDrawSelection in PaintOptions then begin if Node = FDropTargetNode then begin if (FLastDropMode = dmOnNode) or (vsSelected in Node.States) then begin Brush.Color := FColors.DropTargetColor; Pen.Color := FColors.DropTargetBorderColor; if (toGridExtensions in FOptions.FMiscOptions) or (toFullRowSelect in FOptions.FSelectionOptions) then InnerRect := CellRect; if not IsRectEmpty(InnerRect) then if MMXAvailable and (toUseBlendedSelection in FOptions.PaintOptions) then AlphaBlendSelection(Brush.Color) else with InnerRect do RoundRect(Left, Top, Right, Bottom, FSelectionCurveRadius, FSelectionCurveRadius); end else begin //lcl: Is not necessary to set the style here //Brush.Style := bsClear; end; end else if vsSelected in Node.States then begin if Focused or (toPopupMode in FOptions.FPaintOptions) then begin Brush.Color := FColors.FocusedSelectionColor; Pen.Color := FColors.FocusedSelectionBorderColor; end else begin Brush.Color := FColors.UnfocusedSelectionColor; Pen.Color := FColors.UnfocusedSelectionBorderColor; end; if (toGridExtensions in FOptions.FMiscOptions) or (toFullRowSelect in FOptions.FSelectionOptions) then InnerRect := CellRect; if not IsRectEmpty(InnerRect) then {$ifdef ThemeSupport} //todo { if Theme <> 0 then begin // If the node is also hot, its background will be drawn later. if not (toHotTrack in FOptions.FPaintOptions) or (Node <> FCurrentHotNode) or ((Column <> FCurrentHotColumn) and not (toFullRowSelect in FOptions.FSelectionOptions)) then DrawBackground(IfThen(Self.Focused, TREIS_SELECTED, TREIS_SELECTEDNOTFOCUS)); end else } {$endif ThemeSupport} if MMXAvailable and (toUseBlendedSelection in FOptions.PaintOptions) then AlphaBlendSelection(Brush.Color) else with InnerRect do RoundRect(Left, Top, Right, Bottom, FSelectionCurveRadius, FSelectionCurveRadius); end; end; end; {$ifdef ThemeSupport} //todo { if (Theme <> 0) and (toHotTrack in FOptions.FPaintOptions) and (Node = FCurrentHotNode) and ((Column = FCurrentHotColumn) or (toFullRowSelect in FOptions.FSelectionOptions)) then DrawBackground(IfThen((vsSelected in Node.States) and not (toAlwaysHideSelection in FOptions.FPaintOptions), TREIS_HOTSELECTED, TREIS_HOT)); } {$endif ThemeSupport} if (Column = FFocusedColumn) or (toFullRowSelect in FOptions.FSelectionOptions) then begin // draw focus rect if (poDrawFocusRect in PaintOptions) and (Focused or (toPopupMode in FOptions.FPaintOptions)) and (FFocusedNode = Node) and ( (Column = FFocusedColumn) {$ifdef ThemeSupport} //todo { or (not (toExtendedFocus in FOptions.FSelectionOptions) and (toFullRowSelect in FOptions.FSelectionOptions) and (Theme <> 0) ) } {$endif ThemeSupport} ) then begin TextColorBackup := GetTextColor(Handle); SetTextColor(Handle, $FFFFFF); BackColorBackup := GetBkColor(Handle); SetBkColor(Handle, 0); {$ifdef ThemeSupport} //todo { if not (toExtendedFocus in FOptions.FSelectionOptions) and (toFullRowSelect in FOptions.FSelectionOptions) and (Theme <> 0) then FocusRect := RowRect else } {$endif ThemeSupport} if toGridExtensions in FOptions.FMiscOptions then FocusRect := CellRect else FocusRect := InnerRect; {$ifdef ThemeSupport} //todo { if Theme <> 0 then InflateRect(FocusRect, -1, -1); } {$endif ThemeSupport} LCLIntf.DrawFocusRect(Handle, FocusRect); SetTextColor(Handle, TextColorBackup); SetBkColor(Handle, BackColorBackup); end; end; end; {$ifdef ThemeSupport} //todo { if Theme <> 0 then CloseThemeData(Theme); } {$endif ThemeSupport} end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.ReadChunk(Stream: TStream; Version: Integer; Node: PVirtualNode; ChunkType, ChunkSize: Integer): Boolean; // Called while loading a tree structure, Node is already valid (allocated) at this point. // The function handles the base and user chunks, any other chunk is marked as being unknown (result becomes False) // and skipped. descendants may handle them by overriding this method. // Returns True if the chunk could be handled, otherwise False. var ChunkBody: TBaseChunkBody; Run: PVirtualNode; LastPosition: Integer; begin case ChunkType of BaseChunk: begin // Load base chunk's body (chunk header has already been consumed). Stream.Read(ChunkBody, SizeOf(ChunkBody)); with Node^ do begin // Set states first, in case the node is invisible. States := ChunkBody.States; NodeHeight := ChunkBody.NodeHeight; TotalHeight := NodeHeight; Align := ChunkBody.Align; CheckState := ChunkBody.CheckState; CheckType := ChunkBody.CheckType; ChildCount := ChunkBody.ChildCount; // Create and read child nodes. while ChunkBody.ChildCount > 0 do begin Run := MakeNewNode; Run.PrevSibling := Node.LastChild; if Assigned(Run.PrevSibling) then Run.Index := Run.PrevSibling.Index + 1; if Assigned(Node.LastChild) then Node.LastChild.NextSibling := Run else Node.FirstChild := Run; Node.LastChild := Run; Run.Parent := Node; ReadNode(Stream, Version, Run); Dec(ChunkBody.ChildCount); end; end; Result := True; end; UserChunk: if ChunkSize > 0 then begin // need to know whether the data was read LastPosition := Stream.Position; DoLoadUserData(Node, Stream); // compare stream position to learn whether the data was read Result := Stream.Position > LastPosition; // Improve stability by advancing the stream to the chunk's real end if // the application did not read what has been written. if not Result or (Stream.Position <> (LastPosition + ChunkSize)) then Stream.Position := LastPosition + ChunkSize; end else Result := True; else // unknown chunk, skip it Stream.Position := Stream.Position + ChunkSize; Result := False; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.ReadNode(Stream: TStream; Version: Integer; Node: PVirtualNode); // Reads the anchor chunk of each node and initiates reading the sub chunks for this node var Header: TChunkHeader; EndPosition: Integer; begin with Stream do begin // Read anchor chunk of the node. Stream.Read(Header, SizeOf(Header)); if Header.ChunkType = NodeChunk then begin EndPosition := Stream.Position + Header.ChunkSize; // Read all subchunks until the indicated chunk end position is reached in the stream. while Position < EndPosition do begin // Read new chunk header. Stream.Read(Header, SizeOf(Header)); ReadChunk(Stream, Version, Node, Header.ChunkType, Header.ChunkSize); end; // If the last chunk does not end at the given end position then there is something wrong. if Position <> EndPosition then ShowError(SCorruptStream2, hcTFCorruptStream2); end else ShowError(SCorruptStream1, hcTFCorruptStream1); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.RedirectFontChangeEvent(Canvas: TCanvas); begin if @Canvas.Font.OnChange <> @FOldFontChange then begin FOldFontChange := Canvas.Font.OnChange; Canvas.Font.OnChange := FontChanged; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.RemoveFromSelection(Node: PVirtualNode); var Index: Integer; begin if not FSelectionLocked then begin Assert(Assigned(Node), 'Node must not be nil!'); if vsSelected in Node.States then begin Exclude(Node.States, vsSelected); if FindNodeInSelection(Node, Index, -1, -1) and (Index < FSelectionCount - 1) then Move(FSelection[Index + 1], FSelection[Index], (FSelectionCount - Index - 1) * 4); if FSelectionCount > 0 then Dec(FSelectionCount); SetLength(FSelection, FSelectionCount); if FSelectionCount = 0 then ResetRangeAnchor; Change(Node); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.ResetRangeAnchor; // Called when there is no selected node anymore and the selection range anchor needs a new value. begin FRangeAnchor := FFocusedNode; FLastSelectionLevel := -1; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.RestoreFontChangeEvent(Canvas: TCanvas); begin Canvas.Font.OnChange := FOldFontChange; FOldFontChange := nil; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SelectNodes(StartNode, EndNode: PVirtualNode; AddOnly: Boolean); // Selects a range of nodes and unselects all other eventually selected nodes which are not in this range if // AddOnly is False. // EndNode must be visible while StartNode does not necessarily as in the case where the last focused node is the start // node but it is a child of a node which has been collapsed previously. In this case the first visible parent node // is used as start node. StartNode can be nil in which case the very first node in the tree is used. var NodeFrom, NodeTo, LastAnchor: PVirtualNode; Index: Integer; begin Assert(Assigned(EndNode), 'EndNode must not be nil!'); if not FSelectionLocked then begin ClearTempCache; if StartNode = nil then StartNode := GetFirstVisibleNoInit(nil, True) else if not FullyVisible[StartNode] then begin StartNode := GetPreviousVisible(StartNode, True); if StartNode = nil then StartNode := GetFirstVisibleNoInit(nil, True) end; if CompareNodePositions(StartNode, EndNode, True) < 0 then begin NodeFrom := StartNode; NodeTo := EndNode; end else begin NodeFrom := EndNode; NodeTo := StartNode; end; // The range anchor will be reset by the following call. LastAnchor := FRangeAnchor; if not AddOnly then InternalClearSelection; while NodeFrom <> NodeTo do begin InternalCacheNode(NodeFrom); NodeFrom := GetNextVisible(NodeFrom, True); end; // select last node too InternalCacheNode(NodeFrom); // now add them all in "one" step AddToSelection(FTempNodeCache, FTempNodeCount); ClearTempCache; if Assigned(LastAnchor) and FindNodeInSelection(LastAnchor, Index, -1, -1) then FRangeAnchor := LastAnchor; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SetFocusedNodeAndColumn(Node: PVirtualNode; Column: TColumnIndex); var OldColumn: TColumnIndex; WasDifferent: Boolean; begin if not FHeader.AllowFocus(Column) then Column := FFocusedColumn; WasDifferent := (Node <> FFocusedNode) or (Column <> FFocusedColumn); OldColumn := FFocusedColumn; FFocusedColumn := Column; DoFocusNode(Node, True); // Check if the change was accepted. if FFocusedNode = Node then begin CancelEditNode; if WasDifferent then DoFocusChange(FFocusedNode, FFocusedColumn); end else // If the user did not accept the new cell to focus then set also the focused column back // to its original state. FFocusedColumn := OldColumn; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SkipNode(Stream: TStream); // Skips the data for the next node in the given stream (including the child nodes). var Header: TChunkHeader; begin with Stream do begin // read achor chunk of the node Stream.Read(Header, SizeOf(Header)); if Header.ChunkType = NodeChunk then Stream.Position := Stream.Position + Header.ChunkSize else ShowError(SCorruptStream1, hcTFCorruptStream1); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.StartWheelPanning(const Position: TPoint); // Called when wheel panning should start. A little helper window is created to indicate the reference position, // which determines in which direction and how far wheel panning/scrolling will happen. //--------------- local function -------------------------------------------- function CreateClipRegion: HRGN; // In order to avoid doing all the transparent drawing ourselves we use a // window region for the wheel window. // Since we only work on a very small image (32x32 pixels) this is acceptable. var Start, X, Y, ImageHeight, ImageWidth: Integer; Temp: HRGN; begin Assert(not FPanningWindow.Image.Empty, 'Invalid wheel panning image.'); ImageWidth := FPanningWindow.Image.Width; ImageHeight := FPanningWindow.Image.Height; // Create an initial region on which we operate. Result := CreateRectRgn(0, 0, 0, 0); with FPanningWindow.Image.Canvas do begin for Y := 0 to ImageHeight - 1 do begin Start := -1; for X := 0 to ImageWidth - 1 do begin // Start a new span if we found a non-transparent pixel and no span is currently started. if (Start = -1) and (Pixels[X, Y] <> clFuchsia) then Start := X else if (Start > -1) and (Pixels[X, Y] = clFuchsia) then begin // A non-transparent span is finished. Add it to the result region. Temp := CreateRectRgn(Start, Y, X, Y + 1); CombineRgn(Result, Result, Temp, RGN_OR); DeleteObject(Temp); Start := -1; end; end; // If there is an open span then add this also to the result region. if Start > -1 then begin Temp := CreateRectRgn(Start, Y, ImageWidth, Y + 1); CombineRgn(Result, Result, Temp, RGN_OR); DeleteObject(Temp); end; end; end; // The resulting region is used as window region so we must not delete it. // Windows will own it after the assignment below. end; //--------------- end local function ---------------------------------------- var ImageName: string; begin // Set both panning and scrolling flag. One will be removed shortly depending on whether the middle mouse button is // released before the mouse is moved or vice versa. The first case is referred to as wheel scrolling while the // latter is called wheel panning. KillTimer(Handle, ScrollTimer); DoStateChange([tsWheelPanning, tsWheelScrolling]); if FPanningWindow = nil then begin FPanningWindow := TVirtualPanningWindow.Create; LoadPanningCursors; end; FPanningWindow.Start(Handle, ClientToScreen(Position)); if Integer(FRangeX) > ClientWidth then begin if Integer(FRangeY) > ClientHeight then ImageName := 'VT_MOVEALL_BMP' else ImageName := 'VT_MOVEEW_BMP' end else ImageName := 'VT_MOVENS_BMP'; FPanningWindow.Image.LoadFromLazarusResource(ImageName); FPanningWindow.Show(CreateClipRegion); // Setup the panscroll timer and capture all mouse input. SetFocus; SetCapture(Handle); AdjustPanningCursor(Position.X, Position.Y); SetTimer(Handle, ScrollTimer, 20, nil); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.StopWheelPanning; // Stops panning if currently active and destroys the helper window. begin if [tsWheelPanning, tsWheelScrolling] * FStates <> [] then begin // Release the mouse capture and stop the panscroll timer. KillTimer(Handle, ScrollTimer); ReleaseCapture; DoStateChange([], [tsWheelPanning, tsWheelScrolling]); FPanningWindow.Stop; {$ifndef Windows} Cursor := crDefault; {$endif} end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.StructureChange(Node: PVirtualNode; Reason: TChangeReason); begin AdviseChangeEvent(True, Node, Reason); if FUpdateCount = 0 then begin if (FChangeDelay > 0) and not (tsSynchMode in FStates) then SetTimer(Handle, StructureChangeTimer, FChangeDelay, nil) else DoStructureChange(Node, Reason); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.SuggestDropEffect(Source: TObject; Shift: TShiftState; const Pt: TPoint; AllowedEffects: LongWord): LongWord; // determines the drop action to take if the drag'n drop operation ends on this tree // Note: Source can be any Delphi object not just a virtual tree begin Result := AllowedEffects; // prefer MOVE if source and target are the same control, otherwise whatever is allowed as initial value if Assigned(Source) and (Source = Self) then if (AllowedEffects and DROPEFFECT_MOVE) <> 0 then Result := DROPEFFECT_MOVE else // no change else // drag between different applicatons if (AllowedEffects and DROPEFFECT_COPY) <> 0 then Result := DROPEFFECT_COPY; // consider modifier keys and what is allowed at the moment, if none of the following conditions apply then // the initial value just set is used if ssCtrlOS in Shift then begin // copy or link if ssShift in Shift then begin // link if (AllowedEffects and DROPEFFECT_LINK) <> 0 then Result := DROPEFFECT_LINK; end else begin // copy if (AllowedEffects and DROPEFFECT_COPY) <> 0 then Result := DROPEFFECT_COPY; end; end else begin // move, link or default if ssShift in Shift then begin // move if (AllowedEffects and DROPEFFECT_MOVE) <> 0 then Result := DROPEFFECT_MOVE; end else begin // link or default if ssAlt in Shift then begin // link if (AllowedEffects and DROPEFFECT_LINK) <> 0 then Result := DROPEFFECT_LINK; end; // else default end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.ToggleSelection(StartNode, EndNode: PVirtualNode); // Switchs the selection state of a range of nodes. // Note: This method is specifically designed to help selecting ranges with the keyboard and considers therefore // the range anchor. var NodeFrom, NodeTo: PVirtualNode; NewSize: Integer; Position: Integer; begin if not FSelectionLocked then begin Assert(Assigned(EndNode), 'EndNode must not be nil!'); if StartNode = nil then StartNode := FRoot.FirstChild else if not FullyVisible[StartNode] then StartNode := GetPreviousVisible(StartNode, True); Position := CompareNodePositions(StartNode, EndNode); // nothing to do if start and end node are the same if Position <> 0 then begin if Position < 0 then begin NodeFrom := StartNode; NodeTo := EndNode; end else begin NodeFrom := EndNode; NodeTo := StartNode; end; ClearTempCache; // 1) toggle the start node if it is before the range anchor if CompareNodePositions(NodeFrom, FRangeAnchor) < 0 then if not (vsSelected in NodeFrom.States) then InternalCacheNode(NodeFrom) else InternalRemoveFromSelection(NodeFrom); // 2) toggle all nodes within the range NodeFrom := GetNextVisible(NodeFrom, True); while NodeFrom <> NodeTo do begin if not (vsSelected in NodeFrom.States) then InternalCacheNode(NodeFrom) else InternalRemoveFromSelection(NodeFrom); NodeFrom := GetNextVisible(NodeFrom, True); end; // 3) toggle end node if it is after the range anchor if CompareNodePositions(NodeFrom, FRangeAnchor) > 0 then if not (vsSelected in NodeFrom.States) then InternalCacheNode(NodeFrom) else InternalRemoveFromSelection(NodeFrom); // Do some housekeeping if there was a change. NewSize := PackArray(FSelection, FSelectionCount); if NewSize > -1 then begin FSelectionCount := NewSize; SetLength(FSelection, FSelectionCount); end; // If the range went over the anchor then we need to reselect it. if not (vsSelected in FRangeAnchor.States) then InternalCacheNode(FRangeAnchor); if FTempNodeCount > 0 then AddToSelection(FTempNodeCache, FTempNodeCount); ClearTempCache; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.UnselectNodes(StartNode, EndNode: PVirtualNode); // Deselects a range of nodes. // EndNode must be visible while StartNode must not as in the case where the last focused node is the start node // but it is a child of a node which has been collapsed previously. In this case the first visible parent node // is used as start node. StartNode can be nil in which case the very first node in the tree is used. var NodeFrom, NodeTo: PVirtualNode; NewSize: Integer; begin if not FSelectionLocked then begin Assert(Assigned(EndNode), 'EndNode must not be nil!'); if StartNode = nil then StartNode := FRoot.FirstChild else if not FullyVisible[StartNode] then begin StartNode := GetPreviousVisible(StartNode, True); if StartNode = nil then StartNode := FRoot.FirstChild end; if CompareNodePositions(StartNode, EndNode) < 0 then begin NodeFrom := StartNode; NodeTo := EndNode; end else begin NodeFrom := EndNode; NodeTo := StartNode; end; while NodeFrom <> NodeTo do begin InternalRemoveFromSelection(NodeFrom); NodeFrom := GetNextVisible(NodeFrom, True); end; // Deselect last node too. InternalRemoveFromSelection(NodeFrom); // Do some housekeeping. NewSize := PackArray(FSelection, FSelectionCount); if NewSize > -1 then begin FSelectionCount := NewSize; SetLength(FSelection, FSelectionCount); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.UpdateCheckImageList; begin if FCheckImages <> FCustomCheckImages then FCheckImages.Free; FCheckImages := nil; CheckImageListNeeded; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.UpdateColumnCheckState(Col: TVirtualTreeColumn); begin Col.CheckState := DetermineNextCheckState(Col.CheckType, Col.CheckState); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.UpdateDesigner; var ParentForm: TCustomForm; begin if (csDesigning in ComponentState) and not (csUpdating in ComponentState) then begin ParentForm := GetParentForm(Self); if Assigned(ParentForm) and Assigned(ParentForm.Designer) then ParentForm.Designer.Modified; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.UpdateHeaderRect; // Calculates the rectangle the header occupies in non-client area. // These coordinates are in window rectangle. var OffsetX, OffsetY: Integer; //EdgeSize: Integer; Size: TSize; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcPaintHeader],'UpdateHeaderRect');{$endif} FHeaderRect := Rect(0, 0, Width, Height); // Consider borders... Size := GetBorderDimensions; //lclheader //Adjust rect size Inc(FHeaderRect.Right,Size.cx*2); // ... and bevels. OffsetX := BorderWidth; OffsetY := BorderWidth; //todo_lcl { if BevelKind <> bkNone then begin EdgeSize := 0; if BevelInner <> bvNone then Inc(EdgeSize, BevelWidth); if BevelOuter <> bvNone then Inc(EdgeSize, BevelWidth); if beLeft in BevelEdges then Inc(OffsetX, EdgeSize); if beTop in BevelEdges then Inc(OffsetY, EdgeSize); end; } InflateRect(FHeaderRect, -OffsetX, -OffsetY); if hoVisible in FHeader.FOptions then begin if FHeaderRect.Left <= FHeaderRect.Right then FHeaderRect.Bottom := FHeaderRect.Top + Integer(FHeader.FHeight) else FHeaderRect := Rect(0, 0, 0, 0); end else FHeaderRect.Bottom := FHeaderRect.Top; {$ifdef DEBUG_VTV}Logger.Send([lcPaintHeader],'FHeaderRect',FHeaderRect);{$endif} {$ifdef DEBUG_VTV}Logger.ExitMethod([lcPaintHeader],'UpdateHeaderRect');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.UpdateEditBounds; // Used to update the bounds of the current node editor if editing is currently active. var R: TRect; Dummy: Integer; CurrentAlignment: TAlignment; CurrentBidiMode: TBidiMode; begin if tsEditing in FStates then begin if vsMultiline in FFocusedNode.States then R := GetDisplayRect(FFocusedNode, FEditColumn, True, False) else R := GetDisplayRect(FFocusedNode, FEditColumn, True, True); if (toGridExtensions in FOptions.FMiscOptions) then begin // Adjust edit bounds depending on alignment and bidi mode. if FEditColumn <= NoColumn then begin CurrentAlignment := Alignment; CurrentBidiMode := BiDiMode; end else begin CurrentAlignment := FHeader.Columns[FEditColumn].FAlignment; CurrentBidiMode := FHeader.Columns[FEditColumn].FBidiMode; end; // Consider bidi mode here. In RTL context does left alignment actually mean right alignment and vice versa. if CurrentBidiMode <> bdLeftToRight then ChangeBiDiModeAlignment(CurrentAlignment); if CurrentAlignment = taLeftJustify then FHeader.Columns.GetColumnBounds(FEditColumn, Dummy, R.Right) else FHeader.Columns.GetColumnBounds(FEditColumn, R.Left, Dummy); end; if toShowHorzGridLines in TreeOptions.PaintOptions then Dec(R.Bottom); FEditLink.SetBounds(R); end; end; //---------------------------------------------------------------------------------------------------------------------- const ScrollMasks: array[Boolean] of Cardinal = (0, SIF_DISABLENOSCROLL); const // Region identifiers for GetRandomRgn { CLIPRGN = 1; METARGN = 2; APIRGN = 3; } SYSRGN = 4; procedure TBaseVirtualTree.UpdateWindowAndDragImage(const Tree: TBaseVirtualTree; TreeRect: TRect; UpdateNCArea, ReshowDragImage: Boolean); // Method to repaint part of the window area which is not covered by the drag image and to initiate a recapture // of the drag image. // Note: This method must only be called during a drag operation and the tree passed in is the one managing the current // drag image (so it is the actual drag source). {$ifndef INCOMPLETE_WINAPI} var DragRegion, // the region representing the drag image UpdateRegion, // the unclipped region within the tree to be updated NCRegion: HRGN; // the region representing the non-client area of the tree DragRect, NCRect: TRect; RedrawFlags: Cardinal; VisibleTreeRegion: HRGN; DC: HDC; {$endif} begin //todo: reimplement {$ifndef INCOMPLETE_WINAPI} if IntersectRect(TreeRect, TreeRect, ClientRect) then begin // Retrieve the visible region of the window. This is important to avoid overpainting parts of other windows // which overlap this one. VisibleTreeRegion := CreateRectRgn(0, 0, 1, 1); DC := GetDCEx(Handle, 0, DCX_CACHE or DCX_WINDOW or DCX_CLIPSIBLINGS or DCX_CLIPCHILDREN); GetRandomRgn(DC, VisibleTreeRegion, SYSRGN); ReleaseDC(Handle, DC); // In Win9x the returned visible region is given in client coordinates. We need it in screen coordinates, though. if not IsWinNT then with ClientToScreen(Point(0, 0)) do OffsetRgn(VisibleTreeRegion, X, Y); // The drag image will figure out itself what part of the rectangle can be recaptured. // Recapturing is not done by taking a snapshot of the screen, but by letting the tree draw itself // into the back bitmap of the drag image. So the order here is unimportant. Tree.FDragImage.RecaptureBackground(Self, TreeRect, VisibleTreeRegion, UpdateNCArea, ReshowDragImage); // Calculate the screen area not covered by the drag image and which needs an update. DragRect := Tree.FDragImage.GetDragImageRect; MapWindowPoints(0, Handle, DragRect, 2); DragRegion := CreateRectRgnIndirect(DragRect); // Start with non-client area if requested. if UpdateNCArea then begin // Compute the part of the non-client area which must be updated. // Determine the outer rectangle of the entire tree window. GetWindowRect(Handle, NCRect); // Express the tree window rectangle in client coordinates (because RedrawWindow wants them so). MapWindowPoints(0, Handle, NCRect, 2); NCRegion := CreateRectRgnIndirect(NCRect); // Determine client rect in screen coordinates and create another region for it. UpdateRegion := CreateRectRgnIndirect(ClientRect); // Create a region which only contains the NC part by subtracting out the client area. CombineRgn(NCRegion, NCRegion, UpdateRegion, RGN_DIFF); // Subtract also out what is hidden by the drag image. CombineRgn(NCRegion, NCRegion, DragRegion, RGN_DIFF); RedrawWindow(Handle, nil, NCRegion, RDW_FRAME or RDW_NOERASE or RDW_NOCHILDREN or RDW_INVALIDATE or RDW_VALIDATE or RDW_UPDATENOW); DeleteObject(NCRegion); DeleteObject(UpdateRegion); end; UpdateRegion := CreateRectRgnIndirect(TreeRect); RedrawFlags := RDW_INVALIDATE or RDW_VALIDATE or RDW_UPDATENOW or RDW_NOERASE or RDW_NOCHILDREN; // Remove the part of the update region which is covered by the drag image. CombineRgn(UpdateRegion, UpdateRegion, DragRegion, RGN_DIFF); RedrawWindow(Handle, nil, UpdateRegion, RedrawFlags); DeleteObject(UpdateRegion); DeleteObject(DragRegion); DeleteObject(VisibleTreeRegion); end; {$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.ValidateCache; // Starts cache validation if not already done by adding this instance to the worker thread's waiter list // (if not already there) and signalling the thread it can start validating. begin // Wait for thread to stop validation if it is currently validating this tree's cache. InterruptValidation; FStartIndex := 0; {$ifdef EnableThreadSupport} if tsValidationNeeded in FStates then begin // Tell the thread this tree needs actually something to do. WorkerThread.AddTree(Self); WorkEvent.SetEvent; end; {$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.ValidateNodeDataSize(var Size: Integer); begin Size := 0; if Assigned(FOnGetNodeDataSize) then FOnGetNodeDataSize(Self, Size); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WndProc(var Message: TLMessage); var Handled: Boolean; begin Handled := False; // Try the header whether it needs to take this message. if Assigned(FHeader) and (FHeader.FStates <> []) then Handled := FHeader.HandleMessage(Message); if not Handled then begin // For auto drag mode, let tree handle itself, instead of TControl. if not (csDesigning in ComponentState) and ((Message.Msg = LM_LBUTTONDOWN) or (Message.Msg = LM_LBUTTONDBLCLK)) then begin Handled := (DragMode = dmAutomatic) and (DragKind = dkDrag); if Handled then begin if not IsControlMouseMsg(TLMMouse(Message)) then begin //lclheader //let the header handle the message here //otherwise no header click event will be fired FHeader.HandleMessage(Message); ControlState := ControlState + [csLButtonDown]; Dispatch(Message); // overrides TControl's BeginDrag end; end; end; if not Handled and Assigned(FHeader) then Handled := FHeader.HandleMessage(Message); if not Handled then inherited; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WriteChunks(Stream: TStream; Node: PVirtualNode); // Writes the core chunks for Node into the stream. // Note: descendants can optionally override this method to add other node specific chunks. // Keep in mind that this method is also called for the root node. Using this fact in descendants you can // create a kind of "global" chunks not directly bound to a specific node. var Header: TChunkHeader; LastPosition, ChunkSize: Integer; Chunk: TBaseChunk; Run: PVirtualNode; begin with Stream do begin // 1. The base chunk... LastPosition := Position; Chunk.Header.ChunkType := BaseChunk; with Node^, Chunk do begin Body.ChildCount := ChildCount; Body.NodeHeight := NodeHeight; // Some states are only temporary so take them out as they make no sense at the new location. Body.States := States - [vsChecking, vsCutOrCopy, vsDeleting, vsInitialUserData, vsHeightMeasured]; Body.Align := Align; Body.CheckState := CheckState; Body.CheckType := CheckType; Body.Reserved := 0; end; // write the base chunk Write(Chunk, SizeOf(Chunk)); // 2. ... directly followed by the child node chunks (actually they are child chunks of // the base chunk) if vsInitialized in Node.States then begin Run := Node.FirstChild; while Assigned(Run) do begin WriteNode(Stream, Run); Run := Run.NextSibling; end; end; FinishChunkHeader(Stream, LastPosition, Position); // 3. write user data LastPosition := Position; Header.ChunkType := UserChunk; Write(Header, SizeOf(Header)); DoSaveUserData(Node, Stream); // check if the application actually wrote data ChunkSize := Position - LastPosition - SizeOf(TChunkHeader); // seek back to start of chunk if nothing has been written if ChunkSize = 0 then begin Position := LastPosition; Size := Size - SizeOf(Header); end else FinishChunkHeader(Stream, LastPosition, Position); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.WriteNode(Stream: TStream; Node: PVirtualNode); // Writes the "cover" chunk for Node to Stream and initiates writing child nodes and chunks. var LastPosition: Integer; Header: TChunkHeader; begin // Initialize the node first if necessary and wanted. if toInitOnSave in FOptions.FMiscOptions then begin if not (vsInitialized in Node.States) then InitNode(Node); if (vsHasChildren in Node.States) and (Node.ChildCount = 0) then InitChildren(Node); end; with Stream do begin LastPosition := Position; // Emit the anchor chunk. Header.ChunkType := NodeChunk; Write(Header, SizeOf(Header)); // Write other chunks to stream taking their size into this chunk's size. WriteChunks(Stream, Node); // Update chunk size. FinishChunkHeader(Stream, LastPosition, Position); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.AbsoluteIndex(Node: PVirtualNode): Cardinal; begin Result := 0; while Assigned(Node) and (Node <> FRoot) do begin if not (vsInitialized in Node.States) then InitNode(Node); if Assigned(Node.PrevSibling) then begin // if there's a previous sibling then add its total count to the result Node := Node.PrevSibling; Inc(Result, Node.TotalCount); end else begin Node := Node.Parent; if Node <> FRoot then Inc(Result); end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.AddChild(Parent: PVirtualNode; UserData: Pointer = nil): PVirtualNode; // Adds a new node to the given parent node. This is simply done by increasing the child count of the // parent node. If Parent is nil then the new node is added as (last) top level node. // UserData can be used to set the first 4 bytes of the user data area to an initial value which can be used // in OnInitNode and will also cause to trigger the OnFreeNode event (if <> nil) even if the node is not yet // "officially" initialized. // AddChild is a compatibility method and will implicitly validate the parent node. This is however // against the virtual paradigm and hence I dissuade from its usage. var NodeData: ^Pointer; begin if not (toReadOnly in FOptions.FMiscOptions) then begin CancelEditNode; if Parent = nil then Parent := FRoot; if not (vsInitialized in Parent.States) then InitNode(Parent); // Locally stop updates of the tree in order to avoid usage of the new node before it is correctly set up. // If the update count was 0 on enter then there will be a correct update at the end of this method. Inc(FUpdateCount); try SetChildCount(Parent, Parent.ChildCount + 1); // Update the hidden children flag of the parent. Nodes are added as being visible by default. Exclude(Parent.States, vsAllChildrenHidden); finally Dec(FUpdateCount); end; Result := Parent.LastChild; // Check if there is initial user data and there is also enough user data space allocated. if Assigned(UserData) then if FNodeDataSize >= 4 then begin NodeData := Pointer(PByte(@Result.Data) + FTotalInternalDataSize); NodeData^ := UserData; Include(Result.States, vsInitialUserData); end else ShowError(SCannotSetUserData, hcTFCannotSetUserData); InvalidateCache; if FUpdateCount = 0 then begin ValidateCache; if tsStructureChangePending in FStates then begin if Parent = FRoot then StructureChange(nil, crChildAdded) else StructureChange(Parent, crChildAdded); end; if (toAutoSort in FOptions.FAutoOptions) and (FHeader.FSortColumn > InvalidColumn) then Sort(Parent, FHeader.FSortColumn, FHeader.FSortDirection, True); InvalidateToBottom(Parent); //lcl //Calling UpdateHorizontalScrollBar without a header leads to a //wrong NodeWidth because the node is not initialized at this time. //As result the horizontal scrollbar is not correctly //sized and the node can not be selected by a click. if HandleAllocated then UpdateVerticalScrollBar(True) end; end else Result := nil; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.AddFromStream(Stream: TStream; TargetNode: PVirtualNode); // loads nodes from the given stream and adds them to TargetNode // the current content is not cleared before the load process starts (see also LoadFromStream) var ThisID: TMagicID; Version, Count: Cardinal; Node: PVirtualNode; begin if not (toReadOnly in FOptions.FMiscOptions) then begin // check first whether this is a stream we can read Stream.ReadBuffer(ThisID, SizeOf(TMagicID)); if (ThisID[0] = MagicID[0]) and (ThisID[1] = MagicID[1]) and (ThisID[2] = MagicID[2]) and (ThisID[5] = MagicID[5]) then begin Version := Word(ThisID[3]); if Version <= VTTreeStreamVersion then begin BeginUpdate; try if Version < 2 then Count := MaxInt else Stream.ReadBuffer(Count, SizeOf(Count)); while (Stream.Position < Stream.Size) and (Count > 0) do begin Dec(Count); Node := MakeNewNode; InternalConnectNode(Node, TargetNode, Self, amAddChildLast); InternalAddFromStream(Stream, Version, Node); end; if TargetNode = FRoot then DoNodeCopied(nil) else DoNodeCopied(TargetNode); finally EndUpdate; end; end else ShowError(SWrongStreamVersion, hcTFWrongStreamVersion); end else ShowError(SWrongStreamVersion, hcTFWrongStreamVersion); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.AfterConstruction; begin inherited; if FRoot = nil then InitRootNode; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.Assign(Source: TPersistent); begin if (Source is TBaseVirtualTree) and not (toReadOnly in FOptions.FMiscOptions) then with Source as TBaseVirtualTree do begin Self.Align := Align; Self.Anchors := Anchors; Self.AutoScrollDelay := AutoScrollDelay; Self.AutoScrollInterval := AutoScrollInterval; Self.AutoSize := AutoSize; Self.Background := Background; //todo_lcl { Self.BevelEdges := BevelEdges; Self.BevelInner := BevelInner; Self.BevelKind := BevelKind; Self.BevelOuter := BevelOuter; Self.BevelWidth := BevelWidth; } Self.BiDiMode := BiDiMode; Self.BorderStyle := BorderStyle; Self.BorderWidth := BorderWidth; Self.ChangeDelay := ChangeDelay; Self.CheckImageKind := CheckImageKind; Self.Color := Color; Self.Colors.Assign(Colors); Self.Constraints.Assign(Constraints); Self.DefaultNodeHeight := DefaultNodeHeight; Self.DefaultPasteMode := DefaultPasteMode; Self.DragCursor := DragCursor; Self.DragImageKind := DragImageKind; Self.DragKind := DragKind; Self.DragMode := DragMode; Self.Enabled := Enabled; Self.Font := Font; Self.Header := Header; Self.HintMode := HintMode; Self.HotCursor := HotCursor; Self.Images := Images; //Self.ImeMode := ImeMode; //Self.ImeName := ImeName; Self.Indent := Indent; Self.Margin := Margin; Self.NodeAlignment := NodeAlignment; Self.NodeDataSize := NodeDataSize; Self.TreeOptions := TreeOptions; //Self.ParentBiDiMode := ParentBiDiMode; Self.ParentColor := ParentColor; Self.ParentFont := ParentFont; Self.ParentShowHint := ParentShowHint; Self.PopupMenu := PopupMenu; Self.RootNodeCount := RootNodeCount; Self.ScrollBarOptions := ScrollBarOptions; Self.ShowHint := ShowHint; Self.StateImages := StateImages; Self.TabOrder := TabOrder; Self.TabStop := TabStop; Self.Visible := Visible; Self.SelectionCurveRadius := SelectionCurveRadius; Self.SelectionBlendFactor := SelectionBlendFactor; end else inherited; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.BeginDrag(Immediate: Boolean; Threshold: Integer); // Reintroduced method to allow to start OLE drag'n drop as well as VCL drag'n drop. begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcDrag],'BeginDrag');{$endif} if FDragType = dtVCL then begin DoStateChange([tsVCLDragPending]); inherited; end else if (FStates * [tsOLEDragPending, tsOLEDragging]) = [] then begin // Drag start position has already been recorded in WMMouseDown. if Threshold < 0 then FDragThreshold := DragManager.DragThreshold else FDragThreshold := Threshold; if Immediate then DoDragging(FLastClickPos) else DoStateChange([tsOLEDragPending]); end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcDrag],'BeginDrag');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.BeginSynch; // Starts the synchronous update mode (if not already active). begin if not (csDestroying in ComponentState) then begin if FSynchUpdateCount = 0 then begin DoUpdating(usBeginSynch); // Stop all timers... KillTimer(Handle, ChangeTimer); KillTimer(Handle, StructureChangeTimer); KillTimer(Handle, ExpandTimer); KillTimer(Handle, EditTimer); KillTimer(Handle, ScrollTimer); KillTimer(Handle, SearchTimer); FSearchBuffer := ''; FLastSearchNode := nil; DoStateChange([], [tsEditPending, tsScrollPending, tsScrolling, tsIncrementalSearching]); // ...and trigger pending update states. if tsStructureChangePending in FStates then DoStructureChange(FLastStructureChangeNode, FLastStructureChangeReason); if tsChangePending in FStates then DoChange(FLastChangedNode); end else DoUpdating(usSynch); end; Inc(FSynchUpdateCount); DoStateChange([tsSynchMode]); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.BeginUpdate; begin if not (csDestroying in ComponentState) then begin if FUpdateCount = 0 then begin DoUpdating(usBegin); SetUpdateState(True); end else DoUpdating(usUpdate); end; Inc(FUpdateCount); DoStateChange([tsUpdating]); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.CancelCutOrCopy; // Resets nodes which are marked as being cut. var Run: PVirtualNode; begin if ([tsCutPending, tsCopyPending] * FStates) <> [] then begin Run := FRoot.FirstChild; while Assigned(Run) do begin if vsCutOrCopy in Run.States then Exclude(Run.States, vsCutOrCopy); Run := GetNextNoInit(Run); end; end; DoStateChange([], [tsCutPending, tsCopyPending]); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.CancelEditNode: Boolean; // Called by the application or the current edit link to cancel the edit action. begin if HandleAllocated and ([tsEditing, tsEditPending] * FStates <> []) then Result := DoCancelEdit else Result := True; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.CancelOperation; // Called by the application to cancel a long-running operation. begin if FOperationCount > 0 then FOperationCanceled := True; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.CanEdit(Node: PVirtualNode; Column: TColumnIndex): Boolean; // Returns True if the given node can be edited. begin Result := (toEditable in FOptions.FMiscOptions) and Enabled and not (toReadOnly in FOptions.FMiscOptions); DoCanEdit(Node, Column, Result); end; function TBaseVirtualTree.CanScroll(const ClientMousePos: TPoint): Boolean; // Determines whether auto scrolling can occur based on current mouse cursor position. begin Result := False; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.Clear; begin if not (toReadOnly in FOptions.FMiscOptions) or (csDestroying in ComponentState) then begin BeginUpdate; try InterruptValidation; if IsEditing then CancelEditNode; if ClipboardStates * FStates <> [] then begin OleSetClipBoard(nil); DoStateChange([], ClipboardStates); end; ClearSelection; FFocusedNode := nil; FLastSelected := nil; FCurrentHotNode := nil; FDropTargetNode := nil; FLastChangedNode := nil; FRangeAnchor := nil; FCheckNode := nil; FLastVCLDragTarget := nil; FLastSearchNode := nil; DeleteChildren(FRoot, True); FOffsetX := 0; FOffsetY := 0; finally EndUpdate; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.ClearChecked; var Node: PVirtualNode; begin Node := RootNode.FirstChild; while Assigned(Node) do begin if Node.CheckState <> csUncheckedNormal then CheckState[Node] := csUncheckedNormal; Node := GetNextNoInit(Node); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.ClearSelection; var Node: PVirtualNode; R: TRect; Counter: Integer; begin if not FSelectionLocked and (FSelectionCount > 0) and not (csDestroying in ComponentState) then begin if (FUpdateCount = 0) and HandleAllocated and (FVisibleCount > 0) then begin // Iterate through nodes currently visible in the client area and invalidate them. Node := TopNode; if Assigned(Node) then R := GetDisplayRect(Node, NoColumn, False); Counter := FSelectionCount; while Assigned(Node) do begin R.Bottom := R.Top + Integer(NodeHeight[Node]); if vsSelected in Node.States then begin InvalidateRect(Handle, @R, False); Dec(Counter); // Only try as many nodes as are selected. if Counter = 0 then Break; end; R.Top := R.Bottom; if R.Top > ClientHeight then Break; Node := GetNextVisibleNoInit(Node, True); end; end; InternalClearSelection; Change(nil); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.CopyTo(Source: PVirtualNode; Tree: TBaseVirtualTree; Mode: TVTNodeAttachMode; ChildrenOnly: Boolean): PVirtualNode; // A simplified CopyTo method to allow to copy nodes to the root of another tree. begin Result := CopyTo(Source, Tree.FRoot, Mode, ChildrenOnly); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.CopyTo(Source, Target: PVirtualNode; Mode: TVTNodeAttachMode; ChildrenOnly: Boolean): PVirtualNode; // Copies Source and all its child nodes to Target. // Mode is used to specify further where to add the new node actually (as sibling of Target or as child of Target). // Result is the newly created node to which source has been copied if ChildrenOnly is False or just contains Target // in the other case. // ChildrenOnly determines whether to copy also the source node or only its child nodes. var TargetTree: TBaseVirtualTree; Stream: TMemoryStream; begin Assert(TreeFromNode(Source) = Self, 'The source tree must contain the source node.'); Result := nil; if (Mode <> amNoWhere) and Assigned(Source) and (Source <> FRoot) then begin // Assume that an empty destination means the root in this (the source) tree. if Target = nil then begin TargetTree := Self; Target := FRoot; Mode := amAddChildFirst; end else TargetTree := TreeFromNode(Target); if not (toReadOnly in TargetTree.FOptions.FMiscOptions) then begin if Target = TargetTree.FRoot then begin case Mode of amInsertBefore: Mode := amAddChildFirst; amInsertAfter: Mode := amAddChildLast; end; end; Stream := TMemoryStream.Create; try // Write all nodes into a temprary stream depending on the ChildrenOnly flag. if not ChildrenOnly then WriteNode(Stream, Source) else begin Source := Source.FirstChild; while Assigned(Source) do begin WriteNode(Stream, Source); Source := Source.NextSibling; end; end; // Now load the serialized nodes into the target node (tree). TargetTree.BeginUpdate; try Stream.Position := 0; while Stream.Position < Stream.Size do begin Result := TargetTree.MakeNewNode; InternalConnectNode(Result, Target, TargetTree, Mode); TargetTree.InternalAddFromStream(Stream, VTTreeStreamVersion, Result); if not DoNodeCopying(Result, Target) then begin TargetTree.DeleteNode(Result); Result := nil; end else DoNodeCopied(Result); end; if ChildrenOnly then Result := Target; finally TargetTree.EndUpdate; end; finally Stream.Free; end; with TargetTree do begin InvalidateCache; if FUpdateCount = 0 then begin ValidateCache; UpdateScrollBars(True); Invalidate; end; StructureChange(Source, crNodeCopied); end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.CopyToClipBoard; var DataObject: IDataObject; begin if FSelectionCount > 0 then begin DataObject := TVTDataObject.Create(Self, True) as IDataObject; if OleSetClipBoard(DataObject) = S_OK then begin MarkCutCopyNodes; DoStateChange([tsCopyPending]); Invalidate; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.CutToClipBoard; var DataObject: IDataObject; begin if (FSelectionCount > 0) and not (toReadOnly in FOptions.FMiscOptions) then begin DataObject := TVTDataObject.Create(Self, True) as IDataObject; if OleSetClipBoard(DataObject) = S_OK then begin MarkCutCopyNodes; DoStateChange([tsCutPending], [tsCopyPending]); Invalidate; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DefaultHandler(var AMessage); begin //used to avoid default handler of LM_MOUSEWHEEL end; procedure TBaseVirtualTree.DeleteChildren(Node: PVirtualNode; ResetHasChildren: Boolean = False); // Removes all children and their children from memory without changing the vsHasChildren style by default. var Run, Mark: PVirtualNode; LastTop, LastLeft, NewSize: Integer; ParentVisible: Boolean; begin if (Node.ChildCount > 0) and not (toReadOnly in FOptions.FMiscOptions) then begin Assert(not (tsIterating in FStates), 'Deleting nodes during tree iteration leads to invalid pointers.'); // The code below uses some flags for speed improvements which may cause invalid pointers if updates of // the tree happen. Hence switch updates off until we have finished the operation. Inc(FUpdateCount); try InterruptValidation; LastLeft := -FEffectiveOffsetX; LastTop := FOffsetY; // Make a local copy of the visibility state of this node to speed up // adjusting the visible nodes count. ParentVisible := Node = FRoot; if not ParentVisible then ParentVisible := FullyVisible[Node] and (vsExpanded in Node.States); // Show that we are clearing the child list, to avoid registering structure change events. Include(Node.States, vsClearing); Run := Node.LastChild; while Assigned(Run) do begin if ParentVisible and (vsVisible in Run.States) then Dec(FVisibleCount); Include(Run.States, vsDeleting); Mark := Run; Run := Run.PrevSibling; // Important, to avoid exchange of invalid pointers while disconnecting the node. if Assigned(Run) then Run.NextSibling := nil; DeleteNode(Mark); end; Exclude(Node.States, vsClearing); if ResetHasChildren then Exclude(Node.States, vsHasChildren); if Node <> FRoot then Exclude(Node.States, vsExpanded); Node.ChildCount := 0; if (Node = FRoot) or (vsDeleting in Node.States) then begin Node.TotalHeight := FDefaultNodeHeight + NodeHeight[Node]; Node.TotalCount := 1; end else begin AdjustTotalHeight(Node, NodeHeight[Node]); AdjustTotalCount(Node, 1); end; Node.FirstChild := nil; Node.LastChild := nil; finally Dec(FUpdateCount); end; InvalidateCache; if FUpdateCount = 0 then begin NewSize := PackArray(FSelection, FSelectionCount); if NewSize > -1 then begin FSelectionCount := NewSize; SetLength(FSelection, FSelectionCount); end; ValidateCache; UpdateScrollbars(True); // Invalidate entire tree if it scrolled e.g. to make the last node also the // bottom node in the treeview. if (LastLeft <> FOffsetX) or (LastTop <> FOffsetY) then Invalidate else InvalidateToBottom(Node); end; StructureChange(Node, crChildDeleted); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DeleteNode(Node: PVirtualNode; Reindex: Boolean = True); var LastTop, LastLeft: Integer; LastParent: PVirtualNode; WasInSynchMode: Boolean; ParentClearing: Boolean; begin if Assigned(Node) and (Node <> FRoot) and not (toReadOnly in FOptions.FMiscOptions) then begin Assert(not (tsIterating in FStates), 'Deleting nodes during tree iteration leads to invalid pointers.'); // Determine parent node for structure change notification. ParentClearing := vsClearing in Node.Parent.States; LastParent := Node.Parent; if not ParentClearing then begin if LastParent = FRoot then StructureChange(nil, crChildDeleted) else StructureChange(LastParent, crChildDeleted); end; LastLeft := -FEffectiveOffsetX; LastTop := FOffsetY; if vsSelected in Node.States then begin if FUpdateCount = 0 then begin // Go temporarily into sync mode to avoid a delayed change event for the node // when unselecting. WasInSynchMode := tsSynchMode in FStates; Include(FStates, tsSynchMode); RemoveFromSelection(Node); if not WasInSynchMode then Exclude(FStates, tsSynchMode); InvalidateToBottom(LastParent); end else InternalRemoveFromSelection(Node); end else InvalidateToBottom(LastParent); if tsHint in FStates then begin Application.CancelHint; DoStateChange([], [tsHint]); end; DeleteChildren(Node); InternalDisconnectNode(Node, False, Reindex); DoFreeNode(Node); if not ParentClearing then begin DetermineHiddenChildrenFlag(LastParent); InvalidateCache; if FUpdateCount = 0 then begin ValidateCache; UpdateScrollbars(True); // Invalidate entire tree if it scrolled e.g. to make the last node also the // bottom node in the treeview. if (LastLeft <> FOffsetX) or (LastTop <> FOffsetY) then Invalidate; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DeleteSelectedNodes; // Deletes all currently selected nodes (including their child nodes). var Nodes: TNodeArray; I: Integer; LevelChange: Boolean; begin Nodes := nil; if (FSelectionCount > 0) and not (toReadOnly in FOptions.FMiscOptions) then begin BeginUpdate; try Nodes := GetSortedSelection(True); for I := High(Nodes) downto 1 do begin LevelChange := Nodes[I].Parent <> Nodes[I - 1].Parent; DeleteNode(Nodes[I], LevelChange); end; DeleteNode(Nodes[0]); finally EndUpdate; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.Dragging: Boolean; begin // Check for both OLE drag'n drop as well as VCL drag'n drop. Result := ([tsOLEDragPending, tsOLEDragging] * FStates <> []) or inherited Dragging; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.EditNode(Node: PVirtualNode; Column: TColumnIndex): Boolean; // Application triggered edit event for the given node. // Returns True if the tree started editing otherwise False. begin Assert(Assigned(Node), 'Node must not be nil.'); Assert((Column > InvalidColumn) and (Column < FHeader.Columns.Count), 'Column must be a valid column index (-1 if no header is shown).'); Result := tsEditing in FStates; // If the tree is already editing then we don't disrupt this. if not Result and not (toReadOnly in FOptions.FMiscOptions) then begin FocusedNode := Node; if Assigned(FFocusedNode) and (Node = FFocusedNode) and CanEdit(FFocusedNode, Column) then begin FEditColumn := Column; if not (vsInitialized in Node.States) then InitNode(Node); DoEdit; Result := tsEditing in FStates; end else Result := False; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.EndEditNode: Boolean; // Called to finish a current edit action or stop the edit timer if an edit operation is pending. begin if [tsEditing, tsEditPending] * FStates <> [] then Result := DoEndEdit else Result := True; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.EndSynch; begin if FSynchUpdateCount > 0 then Dec(FSynchUpdateCount); if not (csDestroying in ComponentState) then begin if FSynchUpdateCount = 0 then begin DoStateChange([], [tsSynchMode]); DoUpdating(usEndSynch); end else DoUpdating(usSynch); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.EndUpdate; var NewSize: Integer; begin if FUpdateCount > 0 then Dec(FUpdateCount); if not (csDestroying in ComponentState) then begin if (FUpdateCount = 0) and (tsUpdating in FStates) then begin if tsUpdateHiddenChildrenNeeded in FStates then begin DetermineHiddenChildrenFlagAllNodes; Exclude(FStates, tsUpdateHiddenChildrenNeeded); end; DoStateChange([], [tsUpdating]); NewSize := PackArray(FSelection, FSelectionCount); if NewSize > -1 then begin FSelectionCount := NewSize; SetLength(FSelection, FSelectionCount); end; InvalidateCache; ValidateCache; if HandleAllocated then UpdateScrollBars(False); if tsStructureChangePending in FStates then DoStructureChange(FLastStructureChangeNode, FLastStructureChangeReason); try if tsChangePending in FStates then DoChange(FLastChangedNode); finally if toAutoSort in FOptions.FAutoOptions then SortTree(FHeader.FSortColumn, FHeader.FSortDirection, True); SetUpdateState(False); if HandleAllocated then Invalidate; UpdateDesigner; end; end; if FUpdateCount = 0 then DoUpdating(usEnd) else DoUpdating(usUpdate); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.ExecuteAction(Action: TBasicAction): Boolean; // Some support for standard actions. begin Result := inherited ExecuteAction(Action); if not Result then begin Result := Action is TEditSelectAll; if Result then SelectAll(False) else begin Result := Action is TEditCopy; if Result then CopyToClipboard else if not (toReadOnly in FOptions.FMiscOptions) then begin Result := Action is TEditCut; if Result then CutToClipBoard else begin Result := Action is TEditPaste; if Result then PasteFromClipboard else begin Result := Action is TEditDelete; if Result then DeleteSelectedNodes end; end; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.FinishCutOrCopy; // Deletes nodes which are marked as being cutted. var Run, ToDelete: PVirtualNode; begin if tsCutPending in FStates then begin Run := FRoot.FirstChild; while Assigned(Run) do begin if vsCutOrCopy in Run.States then begin ToDelete := Run; Run := GetNextNoInit(Run); DeleteNode(ToDelete); end else Run := GetNextNoInit(Run); end; DoStateChange([], [tsCutPending]); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.FlushClipboard; // Used to render the data which is currently on the clipboard (finishes delayed rendering). begin if ClipboardStates * FStates <> [] then begin DoStateChange([tsClipboardFlushing]); OleFlushClipboard; CancelCutOrCopy; DoStateChange([], [tsClipboardFlushing]); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.FullCollapse(Node: PVirtualNode = nil); // This routine collapses all expanded nodes in the subtree given by Node or the whole tree if Node is FRoot or nil. // Only nodes which are expanded will be collapsed. This excludes uninitialized nodes but nodes marked as visible // will still be collapsed if they are expanded. var Stop: PVirtualNode; begin if FRoot.TotalCount > 1 then begin if Node = FRoot then Node := nil; DoStateChange([tsCollapsing]); BeginUpdate; try Stop := Node; Node := GetLastVisibleNoInit(Node, True); if Assigned(Node) then begin repeat if [vsHasChildren, vsExpanded] * Node.States = [vsHasChildren, vsExpanded] then ToggleNode(Node); Node := GetPreviousNoInit(Node); until Node = Stop; // Collapse the start node too. if Assigned(Node) and ([vsHasChildren, vsExpanded] * Node.States = [vsHasChildren, vsExpanded]) then ToggleNode(Node); end; finally EndUpdate; DoStateChange([], [tsCollapsing]); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.FullExpand(Node: PVirtualNode = nil); // This routine expands all collapsed nodes in the subtree given by Node or the whole tree if Node is FRoot or nil. // All nodes on the way down are initialized so this procedure might take a long time. // Since all nodes are validated, the tree cannot make use of optimatizations. Hence it is counter productive and you // should consider avoiding its use. var Stop: PVirtualNode; begin if FRoot.TotalCount > 1 then begin DoStateChange([tsExpanding]); BeginUpdate; try if Node = nil then begin Node := FRoot.FirstChild; Stop := nil; end else begin Stop := Node.NextSibling; if Stop = nil then begin Stop := Node; repeat Stop := Stop.Parent; until (Stop = FRoot) or Assigned(Stop.NextSibling); if Stop = FRoot then Stop := nil else Stop := Stop.NextSibling; end; end; // Initialize the start node. Others will be initialized in GetNext. if not (vsInitialized in Node.States) then InitNode(Node); repeat if not (vsExpanded in Node.States) then ToggleNode(Node); Node := GetNext(Node); until Node = Stop; finally EndUpdate; DoStateChange([], [tsExpanding]); end; end; end; //---------------------------------------------------------------------------------------------------------------------- {$ifndef fpc} function TBaseVirtualTree.GetControlsAlignment: TAlignment; begin Result := FAlignment; end; {$endif} //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetDisplayRect(Node: PVirtualNode; Column: TColumnIndex; TextOnly: Boolean; Unclipped: Boolean = False; ApplyCellContentMargin: Boolean = False): TRect; // Determines the client coordinates the given node covers, depending on scrolling, expand state etc. // If the given node cannot be found (because one of its parents is collapsed or it is invisible) then an empty // rectangle is returned. // If TextOnly is True then only the text bounds are returned, that is, the resulting rectangle's left and right border // are updated according to bidi mode, alignment and text width of the node. // If Unclipped is True (which only makes sense if also TextOnly is True) then the calculated text rectangle is // not clipped if the text does not entirely fit into the text space. This is special handling needed for hints. // If ApplyCellContentMargin is True (which only makes sense if also TextOnly is True) then the calculated text // rectangle respects the cell content margin. // If Column is -1 then the entire client width is used before determining the node's width otherwise the bounds of the // particular column are used. // Note: Column must be a valid column and is used independent of whether the header is visible or not. var Temp: PVirtualNode; Offset: Cardinal; Indent, TextWidth: Integer; MainColumnHit: Boolean; CurrentBidiMode: TBidiMode; CurrentAlignment: TAlignment; MaxUnclippedHeight: Integer; TM: TTextMetric; ExtraVerticalMargin: Integer; begin //{$ifdef DEBUG_VTV}Logger.EnterMethod([lcPaintHeader],'GetDisplayRect');{$endif} Assert(Assigned(Node), 'Node must not be nil.'); Assert(Node <> FRoot, 'Node must not be the hidden root node.'); MainColumnHit := (Column + 1) in [0, FHeader.MainColumn + 1]; if not (vsInitialized in Node.States) then InitNode(Node); Result := Rect(0, 0, 0, 0); // Check whether the node is visible (determine indentation level btw.). Temp := Node; if not (vsVisible in Temp.States) then Exit; Indent := 0; while Temp <> FRoot do begin if not (vsVisible in Temp.States) or not (vsExpanded in Temp.Parent.States) then Exit; Temp := Temp.Parent; if MainColumnHit and (Temp <> FRoot) then Inc(Indent, FIndent); end; // Here we know the node is visible. Offset := 0; if tsUseCache in FStates then begin // If we can use the position cache then do a binary search to find a cached node which is as close as possible // to the current node. Iterate then through all following and visible nodes and sum up their heights. Temp := FindInPositionCache(Node, Offset); while Assigned(Temp) and (Temp <> Node) do begin Inc(Offset, NodeHeight[Temp]); Temp := GetNextVisibleNoInit(Temp, True); end; end else begin // If the cache is not available then go straight through all nodes up to the root and sum up their heights. Temp := Node; repeat Temp := GetPreviousVisibleNoInit(Temp, True); if Temp = nil then Break; Inc(Offset, NodeHeight[Temp]); until False; end; Result := Rect(0, Offset, Max(FRangeX, ClientWidth), Offset + NodeHeight[Node]); // Limit left and right bounds to the given column (if any) and move bounds according to current scroll state. if Column > NoColumn then begin FHeader.FColumns.GetColumnBounds(Column, Result.Left, Result.Right); // The right column border is not part of this cell. Dec(Result.Right); OffsetRect(Result, 0, FOffsetY); end else OffsetRect(Result, -FEffectiveOffsetX, FOffsetY); // Limit left and right bounds further if only the text area is required. if TextOnly then begin // Start with the offset of the text in the column and consider the indentation level too. Offset := FMargin + Indent; // If the text of a node is involved then we have to consider directionality and alignment too. if Column <= NoColumn then begin CurrentBidiMode := BidiMode; CurrentAlignment := Alignment; end else begin CurrentBidiMode := FHeader.FColumns[Column].BidiMode; CurrentAlignment := FHeader.FColumns[Column].Alignment; end; if MainColumnHit then begin if toShowRoot in FOptions.FPaintOptions then Inc(Offset, FIndent); if (toCheckSupport in FOptions.FMiscOptions) and Assigned(FCheckImages) and (Node.CheckType <> ctNone) then Inc(Offset, FCheckImages.Height + 2); end; // Consider associated images. if Assigned(FStateImages) and HasImage(Node, ikState, Column) then Inc(Offset, FStateImages.Width + 2); if Assigned(FImages) and HasImage(Node, ikNormal, Column) then Inc(Offset, FImages.Width + 2); // Offset contains now the distance from the left or right border of the rectangle (depending on bidi mode). // Now consider the alignment too and calculate the final result. if CurrentBidiMode = bdLeftToRight then begin Inc(Result.Left, Offset); // Left-to-right reading does not need any special adjustment of the alignment. end else begin Dec(Result.Right, Offset); // Consider bidi mode here. In RTL context does left alignment actually mean right alignment and vice versa. ChangeBiDiModeAlignment(CurrentAlignment); end; TextWidth := DoGetNodeWidth(Node, Column); // Keep cell height before applying cell content margin in order to increase cell height if text does not fit // and Unclipped it true (see below). MaxUnclippedHeight := Result.Bottom - Result.Top; if ApplyCellContentMargin then DoBeforeCellPaint(Self.Canvas, Node, Column, cpmGetContentMargin, Result, Result); if Unclipped then begin // The caller requested the text coordinates unclipped. This means they must be calculated so as would // there be enough space, regardless of column bounds etc. // The layout still depends on the available space too, because this determines the position // of the unclipped text rectangle. if Result.Right - Result.Left < TextWidth - 1 then if CurrentBidiMode = bdLeftToRight then CurrentAlignment := taLeftJustify else CurrentAlignment := taRightJustify; // Increase cell height (up to MaxUnclippedHeight determined above) if text does not fit. GetTextMetrics(Self.Canvas.Handle, TM); ExtraVerticalMargin := Math.Min(TM.tmHeight, MaxUnclippedHeight) - (Result.Bottom - Result.Top); if ExtraVerticalMargin > 0 then InflateRect(Result, 0, (ExtraVerticalMargin + 1) div 2); case CurrentAlignment of taCenter: begin Result.Left := (Result.Left + Result.Right - TextWidth) div 2; Result.Right := Result.Left + TextWidth; end; taRightJustify: Result.Left := Result.Right - TextWidth; else // taLeftJustify Result.Right := Result.Left + TextWidth - 1; end; end else // Modify rectangle only if the text fits entirely into the given room. if Result.Right - Result.Left > TextWidth then case CurrentAlignment of taCenter: begin Result.Left := (Result.Left + Result.Right - TextWidth) div 2; Result.Right := Result.Left + TextWidth; end; taRightJustify: Result.Left := Result.Right - TextWidth; else // taLeftJustify Result.Right := Result.Left + TextWidth; end; end; //lclheader //todo: add a parameter to decide if the result must be returned as //a tree offset or a control offset if hoVisible in FHeader.FOptions then OffsetRect(Result, 0, FHeader.Height); //{$ifdef DEBUG_VTV}Logger.Send([lcPaintHeader],'DisplayRect for Node '+IntToStr(Node^.Index),Result);{$endif} //{$ifdef DEBUG_VTV}Logger.ExitMethod([lcPaintHeader],'GetDisplayRect');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetFirst(ConsiderChildrenAbove: Boolean = False): PVirtualNode; // Returns the first node in the tree while optionally considering toChildrenAbove. begin if ConsiderChildrenAbove and (toChildrenAbove in FOptions.FPaintOptions) then begin if vsHasChildren in FRoot.States then begin Result := FRoot; // Child nodes are the first choice if possible. if Assigned(Result.FirstChild) then begin while Assigned(Result.FirstChild) do begin Result := Result.FirstChild; if not (vsInitialized in Result.States) then InitNode(Result); if (vsHasChildren in Result.States) and (Result.ChildCount = 0) then InitChildren(Result); end; end else Result := nil; end else Result := nil; end else Result := FRoot.FirstChild; if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetFirstChecked(State: TCheckState = csCheckedNormal; ConsiderChildrenAbove: Boolean = False): PVirtualNode; // Returns the first node in the tree with the given check state. begin Result := GetNextChecked(nil, State, ConsiderChildrenAbove); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetFirstChild(Node: PVirtualNode): PVirtualNode; // Returns the first child of the given node. The result node is initialized before exit. begin if (Node = nil) or (Node = FRoot) then Result := FRoot.FirstChild else begin if not (vsInitialized in Node.States) then InitNode(Node); if vsHasChildren in Node.States then begin if Node.ChildCount = 0 then InitChildren(Node); Result := Node.FirstChild; end else Result := nil; end; if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetFirstCutCopy(ConsiderChildrenAbove: Boolean = False): PVirtualNode; // Returns the first node in the tree which is currently marked for a clipboard operation. // See also GetNextCutCopy for comments on initialization. begin Result := GetNextCutCopy(nil, ConsiderChildrenAbove); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetFirstInitialized(ConsiderChildrenAbove: Boolean = False): PVirtualNode; // Returns the first node which is already initialized. begin Result := GetFirstNoInit(ConsiderChildrenAbove); if Assigned(Result) and not (vsInitialized in Result.States) then Result := GetNextInitialized(Result, ConsiderChildrenAbove); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetFirstLeaf: PVirtualNode; // Returns the first node in the tree which has currently no children. // The result is initialized if necessary. begin Result := GetNextLeaf(nil); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetFirstLevel(NodeLevel: Cardinal): PVirtualNode; // Returns the first node in the tree on a specific level. // The result is initialized if necessary. begin Result := GetFirstNoInit(True); while Assigned(Result) and (GetNodeLevel(Result) <> NodeLevel) do Result := GetNextNoInit(Result, True); if Assigned(Result) and (GetNodeLevel(Result) <> NodeLevel) then // i.e. there is no node with the desired level in the tree Result := nil; if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetFirstNoInit(ConsiderChildrenAbove: Boolean = False): PVirtualNode; // Returns the first node in the tree while optionally considering toChildrenAbove. // No initialization is performed. begin if ConsiderChildrenAbove and (toChildrenAbove in FOptions.FPaintOptions) then begin if vsHasChildren in FRoot.States then begin Result := FRoot; // Child nodes are the first choice if possible. if Assigned(Result.FirstChild) then begin while Assigned(Result.FirstChild) do Result := Result.FirstChild; end else Result := nil; end else Result := nil; end else Result := FRoot.FirstChild; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetFirstSelected(ConsiderChildrenAbove: Boolean = False): PVirtualNode; // Returns the first node in the current selection while optionally considering toChildrenAbove. begin Result := GetNextSelected(nil, ConsiderChildrenAbove); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetFirstVisible(Node: PVirtualNode = nil; ConsiderChildrenAbove: Boolean = True): PVirtualNode; // Returns the first visible node in the tree while optionally considering toChildrenAbove. // If necessary nodes are initialized on demand. begin Result := Node; if not Assigned(Result) then Result := FRoot; if vsHasChildren in Result.States then begin if Result.ChildCount = 0 then InitChildren(Result); // Child nodes are the first choice if possible. if Assigned(Result.FirstChild) then begin Result := GetFirstChild(Result); if ConsiderChildrenAbove and (toChildrenAbove in FOptions.FPaintOptions) then begin repeat // Search the first visible sibling. while Assigned(Result.NextSibling) and not (vsVisible in Result.States) do begin Result := Result.NextSibling; // Init node on demand as this might change the visibility. if not (vsInitialized in Result.States) then InitNode(Result); end; // If there a no visible siblings take the parent. if not (vsVisible in Result.States) then begin Result := Result.Parent; if Result = FRoot then Result := nil; Break; end else begin if (vsHasChildren in Result.States) and (Result.ChildCount = 0) then InitChildren(Result); if (not Assigned(Result.FirstChild)) or (not (vsExpanded in Result.States)) then Break; end; Result := Result.FirstChild; if not (vsInitialized in Result.States) then InitNode(Result); until False; end else begin // If there are no children or the first child is not visible then search the sibling nodes or traverse parents. if not (vsVisible in Result.States) then begin repeat // Is there a next sibling? if Assigned(Result.NextSibling) then begin Result := Result.NextSibling; // The visible state can be removed during initialization so init the node first. if not (vsInitialized in Result.States) then InitNode(Result); if vsVisible in Result.States then Break; end else begin // No sibling anymore, so use the parent's next sibling. if Result.Parent <> FRoot then Result := Result.Parent else begin // There are no further nodes to examine, hence there is no further visible node. Result := nil; Break; end; end; until False; end; end; end else Result := nil; end else Result := nil; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetFirstVisibleChild(Node: PVirtualNode): PVirtualNode; // Returns the first visible child node of Node. If necessary nodes are initialized on demand. begin if Node = nil then Node := FRoot; Result := GetFirstChild(Node); if Assigned(Result) and not (vsVisible in Result.States) then Result := GetNextVisibleSibling(Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetFirstVisibleChildNoInit(Node: PVirtualNode): PVirtualNode; // Returns the first visible child node of Node. begin if Node = nil then Node := FRoot; Result := Node.FirstChild; if Assigned(Result) and not (vsVisible in Result.States) then Result := GetNextVisibleSiblingNoInit(ResulT); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetFirstVisibleNoInit(Node: PVirtualNode = nil; ConsiderChildrenAbove: Boolean = True): PVirtualNode; // Returns the first visible node in the tree or given subtree while optionally considering toChildrenAbove. // No initialization is performed. begin Result := Node; if not Assigned(Result) then Result := FRoot; if vsHasChildren in Result.States then begin // Child nodes are the first choice if possible. if Assigned(Result.FirstChild) then begin Result := Result.FirstChild; if ConsiderChildrenAbove and (toChildrenAbove in FOptions.FPaintOptions) then begin repeat // Search the first visible sibling. while Assigned(Result.NextSibling) and not (vsVisible in Result.States) do Result := Result.NextSibling; // If there a no visible siblings take the parent. if not (vsVisible in Result.States) then begin Result := Result.Parent; if Result = FRoot then Result := nil; Break; end else if (not Assigned(Result.FirstChild)) or (not (vsExpanded in Result.States))then Break; Result := Result.FirstChild; until False; end else begin // If there are no children or the first child is not visible then search the sibling nodes or traverse parents. if not (vsVisible in Result.States) then begin repeat // Is there a next sibling? if Assigned(Result.NextSibling) then begin Result := Result.NextSibling; if vsVisible in Result.States then Break; end else begin // No sibling anymore, so use the parent's next sibling. if Result.Parent <> FRoot then Result := Result.Parent else begin // There are no further nodes to examine, hence there is no further visible node. Result := nil; Break; end; end; until False; end; end; end else Result := nil; end else Result := nil; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.GetHitTestInfoAt(X, Y: Integer; Relative: Boolean; var HitInfo: THitInfo); // Determines the node that occupies the specified point or nil if there's none. The parameter Relative determines // whether to consider X and Y as being client coordinates (if True) or as being absolute tree coordinates. // HitInfo is filled with flags describing the hit further. var ColLeft, ColRight: Integer; NodeTop: Integer; InitialColumn, NextColumn: TColumnIndex; CurrentBidiMode: TBidiMode; CurrentAlignment: TAlignment; NodeRect: TRect; begin HitInfo.HitNode := nil; HitInfo.HitPositions := []; HitInfo.HitColumn := NoColumn; // Determine if point lies in the tree's client area. if X < 0 then Include(HitInfo.HitPositions, hiToLeft) else if X > Max(FRangeX, ClientWidth) then Include(HitInfo.HitPositions, hiToRight); //lclheader if Y < IfThen(hoVisible in FHeader.Options, FHeader.Height) then Include(HitInfo.HitPositions, hiAbove) else if Y > Max(FRangeY, inherited GetClientRect.Bottom) then Include(HitInfo.HitPositions, hiBelow); // If the point is in the tree area then check the nodes. if HitInfo.HitPositions = [] then begin // Convert position into absolute coordinate if necessary. if Relative then begin if X > Header.Columns.GetVisibleFixedWidth then Inc(X, FEffectiveOffsetX); //lclheader if hoVisible in FHeader.Options then Dec(Y, FHeader.Height); Dec(Y, FOffsetY); end; HitInfo.HitNode := InternalGetNodeAt(X, Y, False, NodeTop); if HitInfo.HitNode = nil then Include(HitInfo.HitPositions, hiNowhere) else begin // At this point we need some info about the node, so it must be initialized. if not (vsInitialized in HitInfo.HitNode.States) then InitNode(HitInfo.HitNode); if FHeader.UseColumns then begin HitInfo.HitColumn := FHeader.Columns.GetColumnAndBounds(Point(X, Y), ColLeft, ColRight, False); // If auto column spanning is enabled then look for the last non empty column. if toAutoSpanColumns in FOptions.FAutoOptions then begin InitialColumn := HitInfo.HitColumn; // Search to the left of the hit column for empty columns. while (HitInfo.HitColumn > NoColumn) and ColumnIsEmpty(HitInfo.HitNode, HitInfo.HitColumn) do begin NextColumn := FHeader.FColumns.GetPreviousVisibleColumn(HitInfo.HitColumn); if NextColumn = InvalidColumn then Break; HitInfo.HitColumn := NextColumn; Dec(ColLeft, FHeader.FColumns[NextColumn].Width); end; // Search to the right of the hit column for empty columns. repeat InitialColumn := FHeader.FColumns.GetNextVisibleColumn(InitialColumn); if (InitialColumn = InvalidColumn) or not ColumnIsEmpty(HitInfo.HitNode, InitialColumn) then Break; Inc(ColRight, FHeader.FColumns[InitialColumn].Width); until False; end; // Make the X position and the right border relative to the start of the column. Dec(X, ColLeft); Dec(ColRight, ColLeft); end else begin HitInfo.HitColumn := NoColumn; ColRight := Max(FRangeX, ClientWidth); end; ColLeft := 0; if HitInfo.HitColumn = InvalidColumn then Include(HitInfo.HitPositions, hiNowhere) else begin // From now on X is in "column" coordinates (relative to the left column border). HitInfo.HitPositions := [hiOnItem]; // Avoid getting the display rect if this is not necessary. if toNodeHeightResize in FOptions.FMiscOptions then begin NodeRect := GetDisplayRect(HitInfo.HitNode, HitInfo.HitColumn, False); if Y <= (NodeRect.Top - FOffsetY + 1) then Include(HitInfo.HitPositions, hiUpperSplitter) else if Y >= (NodeRect.Bottom - FOffsetY - 3) then Include(HitInfo.HitPositions, hiLowerSplitter); end; if HitInfo.HitColumn <= NoColumn then begin CurrentBidiMode := BidiMode; CurrentAlignment := Alignment; end else begin CurrentBidiMode := FHeader.FColumns[HitInfo.HitColumn].BidiMode; CurrentAlignment := FHeader.FColumns[HitInfo.HitColumn].Alignment; end; if CurrentBidiMode = bdLeftToRight then DetermineHitPositionLTR(HitInfo, X, ColRight, CurrentAlignment) else DetermineHitPositionRTL(HitInfo, X, ColRight, CurrentAlignment); end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetLast(Node: PVirtualNode = nil; ConsiderChildrenAbove: Boolean = False): PVirtualNode; // Returns the very last node in the tree branch given by Node and initializes the nodes all the way down including the // result. toChildrenAbove is optionally considered. By using Node = nil the very last node in the tree is returned. var Next: PVirtualNode; begin Result := GetLastChild(Node); if not ConsiderChildrenAbove or not (toChildrenAbove in FOptions.FPaintOptions) then while Assigned(Result) do begin // Test if there is a next last child. If not keep the node from the last run. // Otherwise use the next last child. Next := GetLastChild(Result); if Next = nil then Break; Result := Next; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetLastInitialized(Node: PVirtualNode = nil; ConsiderChildrenAbove: Boolean = False): PVirtualNode; // Returns the very last initialized child node in the tree branch given by Node. begin Result := GetLastNoInit(Node, ConsiderChildrenAbove); if Assigned(Result) and not (vsInitialized in Result.States) then Result := GetPreviousInitialized(Result, ConsiderChildrenAbove); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetLastNoInit(Node: PVirtualNode = nil; ConsiderChildrenAbove: Boolean = False): PVirtualNode; // Returns the very last node in the tree branch given by Node without initialization. var Next: PVirtualNode; begin Result := GetLastChildNoInit(Node); if not ConsiderChildrenAbove or not (toChildrenAbove in FOptions.FPaintOptions) then while Assigned(Result) do begin // Test if there is a next last child. If not keep the node from the last run. // Otherwise use the next last child. Next := GetLastChildNoInit(Result); if Next = nil then Break; Result := Next; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetLastChild(Node: PVirtualNode): PVirtualNode; // Determines the last child of the given node and initializes it if there is one. begin if (Node = nil) or (Node = FRoot) then Result := FRoot.LastChild else begin if not (vsInitialized in Node.States) then InitNode(Node); if vsHasChildren in Node.States then begin if Node.ChildCount = 0 then InitChildren(Node); Result := Node.LastChild; end else Result := nil; end; if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetLastChildNoInit(Node: PVirtualNode): PVirtualNode; // Determines the last child of the given node but does not initialize it. begin if (Node = nil) or (Node = FRoot) then Result := FRoot.LastChild else begin if vsHasChildren in Node.States then Result := Node.LastChild else Result := nil; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetLastVisible(Node: PVirtualNode = nil; ConsiderChildrenAbove: Boolean = True): PVirtualNode; // Returns the very last visible node in the tree while optionally considering toChildrenAbove. // The nodes are intialized all the way down including the result node. var Next: PVirtualNode; begin Result := GetLastVisibleChild(Node); if not ConsiderChildrenAbove or not (toChildrenAbove in FOptions.FPaintOptions) then while Assigned(Result) do begin // Test if there is a next last visible child. If not keep the node from the last run. // Otherwise use the next last visible child. Next := GetLastVisibleChild(Result); if Next = nil then Break; Result := Next; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetLastVisibleChild(Node: PVirtualNode): PVirtualNode; // Determines the last visible child of the given node and initializes it if necessary. begin if (Node = nil) or (Node = FRoot) then Result := GetLastChild(FRoot) else if FullyVisible[Node] and (vsExpanded in Node.States) then Result := GetLastChild(Node) else Result := nil; if Assigned(Result) and not (vsVisible in Result.States) then Result := GetPreviousVisibleSibling(Result); if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetLastVisibleChildNoInit(Node: PVirtualNode): PVirtualNode; // Determines the last visible child of the given node without initialization. begin if (Node = nil) or (Node = FRoot) then Result := GetLastChildNoInit(FRoot) else if FullyVisible[Node] and (vsExpanded in Node.States) then Result := GetLastChildNoInit(Node) else Result := nil; if Assigned(Result) and not (vsVisible in Result.States) then Result := GetPreviousVisibleSiblingNoInit(Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetLastVisibleNoInit(Node: PVirtualNode = nil; ConsiderChildrenAbove: Boolean = True): PVirtualNode; // Returns the very last visible node in the tree while optionally considering toChildrenAbove. // No initialization is performed. var Next: PVirtualNode; begin Result := GetLastVisibleChildNoInit(Node); if not ConsiderChildrenAbove or not (toChildrenAbove in FOptions.FPaintOptions) then while Assigned(Result) do begin // Test if there is a next last visible child. If not keep the node from the last run. // Otherwise use the next last visible child. Next := GetLastVisibleChildNoInit(Result); if Next = nil then Break; Result := Next; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetMaxColumnWidth(Column: TColumnIndex; UseSmartColumnWidth: Boolean = False): Integer; // This method determines the width of the largest node in the given column. // If UseSmartColumnWidth is True then only the visible nodes which are in view will be considered // Note: If UseSmartColumnWidth is False then every visible node in the tree will be initialized contradicting so // the virtual paradigm. var Run, LastNode, NextNode: PVirtualNode; NodeLeft, TextLeft, CurrentWidth: Integer; WithCheck, WithImages, WithStateImages: Boolean; CheckOffset, ImageOffset, StateImageOffset: Integer; begin if OperationCanceled then begin // Behave non-destructive. Result := FHeader.FColumns[Column].Width; Exit; end else Result := 0; BeginOperation; if Assigned(FOnBeforeGetMaxColumnWidth) then FOnBeforeGetMaxColumnWidth(FHeader, Column, UseSmartColumnWidth); // Don't check the event here as descendant trees might have overriden the DoGetImageIndex method. WithImages := Assigned(FImages); if WithImages then ImageOffset := FImages.Width + 2 else ImageOffset := 0; WithStateImages := Assigned(FStateImages); if WithStateImages then StateImageOffset := FStateImages.Width + 2 else StateImageOffset := 0; if Assigned(FCheckImages) then CheckOffset := FCheckImages.Height + 2 else CheckOffset := 0; if UseSmartColumnWidth then // Get first visible node which is in view. Run := GetTopNode else Run := GetFirstVisible(nil, True); if Column = FHeader.MainColumn then begin if toFixedIndent in FOptions.FPaintOptions then NodeLeft := FIndent else begin if toShowRoot in FOptions.FPaintOptions then NodeLeft := Integer((GetNodeLevel(Run) + 1) * FIndent) else NodeLeft := Integer(GetNodeLevel(Run) * FIndent); end; WithCheck := (toCheckSupport in FOptions.FMiscOptions) and Assigned(FCheckImages); end else begin NodeLeft := 0; WithCheck := False; end; // Consider node margin at the left of the nodes. Inc(NodeLeft, FMargin); // Decide where to stop. if UseSmartColumnWidth then LastNode := GetNextVisible(BottomNode) else LastNode := nil; while Assigned(Run) and not OperationCanceled do begin TextLeft := NodeLeft; if WithCheck and (Run.CheckType <> ctNone) then Inc(TextLeft, CheckOffset); if WithImages and HasImage(Run, ikNormal, Column) then Inc(TextLeft, ImageOffset); if WithStateImages and HasImage(Run, ikState, Column) then Inc(TextLeft, StateImageOffset); CurrentWidth := DoGetNodeWidth(Run, Column); Inc(CurrentWidth, DoGetCellContentMargin(Run, Column).X); if Result < (TextLeft + CurrentWidth) then Result := TextLeft + CurrentWidth; // Get next visible node and update left node position if needed. NextNode := GetNextVisible(Run, True); if NextNode = LastNode then Break; if (Column = Header.MainColumn) and not (toFixedIndent in FOptions.FPaintOptions) then Inc(NodeLeft, CountLevelDifference(Run, NextNode) * Integer(FIndent)); Run := NextNode; end; if toShowVertGridLines in FOptions.FPaintOptions then Inc(Result); if Assigned(FOnAfterGetMaxColumnWidth) then FOnAfterGetMaxColumnWidth(FHeader, Column, Result); EndOperation; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNext(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; // Returns next node in tree while optionally considering toChildrenAbove. The Result will be initialized if needed. begin Result := Node; if Assigned(Result) then begin Assert(Result <> FRoot, 'Node must not be the hidden root node.'); if ConsiderChildrenAbove and (toChildrenAbove in FOptions.FPaintOptions) then begin // If this node has no siblings use the parent. if not Assigned(Result.NextSibling) then begin Result := Result.Parent; if Result = FRoot then begin Result := nil; end; end else begin // There is at least one sibling so take it. Result := Result.NextSibling; // Has this node got children? Initialize them if necessary. if (vsHasChildren in Result.States) and (Result.ChildCount = 0) then InitChildren(Result); // Now take a look at the children. while Assigned(Result.FirstChild) do begin Result := Result.FirstChild; if (vsHasChildren in Result.States) and (Result.ChildCount = 0) then InitChildren(Result); end; end; end else begin // Has this node got children? if vsHasChildren in Result.States then begin // Yes, there are child nodes. Initialize them if necessary. if Result.ChildCount = 0 then InitChildren(Result); end; // if there is no child node try siblings if Assigned(Result.FirstChild) then Result := Result.FirstChild else begin repeat // Is there a next sibling? if Assigned(Result.NextSibling) then begin Result := Result.NextSibling; Break; end else begin // No sibling anymore, so use the parent's next sibling. if Result.Parent <> FRoot then Result := Result.Parent else begin // There are no further nodes to examine, hence there is no further visible node. Result := nil; Break; end; end; until False; end; end; end; if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNextChecked(Node: PVirtualNode; State: TCheckState = csCheckedNormal; ConsiderChildrenAbove: Boolean = False): PVirtualNode; begin if (Node = nil) or (Node = FRoot) then Result := GetFirstNoInit(ConsiderChildrenAbove) else Result := GetNextNoInit(Node, ConsiderChildrenAbove); while Assigned(Result) and (Result.CheckState <> State) do Result := GetNextNoInit(Result, ConsiderChildrenAbove); if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNextCutCopy(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; // Returns the next node in the tree which is currently marked for a clipboard operation. Since only visible nodes can // be marked (or they are hidden after they have been marked) it is not necessary to initialize nodes to check for // child nodes. The result, however, is initialized if necessary. begin if ClipboardStates * FStates <> [] then begin if (Node = nil) or (Node = FRoot) then Result := GetFirstNoInit(ConsiderChildrenAbove) else Result := GetNextNoInit(Node, ConsiderChildrenAbove); while Assigned(Result) and not (vsCutOrCopy in Result.States) do Result := GetNextNoInit(Result, ConsiderChildrenAbove); if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end else Result := nil; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNextInitialized(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; // Returns the next node in tree which is initialized. begin Result := Node; repeat Result := GetNextNoInit(Result, ConsiderChildrenAbove); until (Result = nil) or (vsInitialized in Result.States); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNextLeaf(Node: PVirtualNode): PVirtualNode; // Returns the next node in the tree which has currently no children. // The result is initialized if necessary. begin if (Node = nil) or (Node = FRoot) then Result := FRoot.FirstChild else Result := GetNext(Node); while Assigned(Result) and (vsHasChildren in Result.States) do Result := GetNext(Result); if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNextLevel(Node: PVirtualNode; NodeLevel: Cardinal): PVirtualNode; // Returns the next node in the tree on a specific level. // The result is initialized if necessary. var StartNodeLevel: Cardinal; begin Result := nil; if Assigned(Node) and (Node <> FRoot) then begin StartNodeLevel := GetNodeLevel(Node); if StartNodeLevel < NodeLevel then begin Result := GetNext(Node); if Assigned(Result) and (GetNodeLevel(Result) <> NodeLevel) then Result := GetNextLevel(Result, NodeLevel); end else if StartNodeLevel = NodeLevel then begin Result := Node.NextSibling; if not Assigned(Result) then // i.e. start node was a last sibling begin Result := Node.Parent; if Assigned(Result) then begin // go to next anchestor of the start node which has a next sibling (if exists) while Assigned(Result) and not Assigned(Result.NextSibling) do Result := Result.Parent; if Assigned(Result) then Result := GetNextLevel(Result.NextSibling, NodeLevel); end; end; end else // i.e. StartNodeLevel > NodeLevel Result := GetNextLevel(Node.Parent, NodeLevel); end; if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNextNoInit(Node: PVirtualNode; ConsiderChildrenAbove: Boolean): PVirtualNode; // Optimized version of GetNext performing no initialization, but optionally considering toChildrenAbove. begin Result := Node; if Assigned(Result) then begin Assert(Result <> FRoot, 'Node must not be the hidden root node.'); if ConsiderChildrenAbove and (toChildrenAbove in FOptions.FPaintOptions) then begin // If this node has no siblings use the parent. if not Assigned(Result.NextSibling) then begin Result := Result.Parent; if Result = FRoot then begin Result := nil; end; end else begin // There is at least one sibling so take it. Result := Result.NextSibling; // Now take a look at the children. while Assigned(Result.FirstChild) do begin Result := Result.FirstChild; end; end; end else begin // If there is no child node try siblings. if Assigned(Result.FirstChild) then Result := Result.FirstChild else begin repeat // Is there a next sibling? if Assigned(Result.NextSibling) then begin Result := Result.NextSibling; Break; end else begin // No sibling anymore, so use the parent's next sibling. if Result.Parent <> FRoot then Result := Result.Parent else begin // There are no further nodes to examine, hence there is no further visible node. Result := nil; Break; end; end; until False; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNextSelected(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; // Returns the next node in the tree which is currently selected. Since children of unitialized nodes cannot be // in the current selection (because they simply do not exist yet) it is not necessary to initialize nodes here. // The result however is initialized if necessary. begin if FSelectionCount > 0 then begin if (Node = nil) or (Node = FRoot) then Result := GetFirstNoInit(ConsiderChildrenAbove) else Result := GetNextNoInit(Node, ConsiderChildrenAbove); while Assigned(Result) and not (vsSelected in Result.States) do Result := GetNextNoInit(Result, ConsiderChildrenAbove); if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end else Result := nil; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNextSibling(Node: PVirtualNode): PVirtualNode; // Returns the next sibling of Node and initializes it if necessary. begin Result := Node; if Assigned(Result) then begin Assert(Result <> FRoot, 'Node must not be the hidden root node.'); Result := Result.NextSibling; if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNextSiblingNoInit(Node: PVirtualNode): PVirtualNode; // Returns the next sibling of Node performing no initialization. begin Result := Node; if Assigned(Result) then begin Assert(Result <> FRoot, 'Node must not be the hidden root node.'); Result := Result.NextSibling; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNextVisible(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = True): PVirtualNode; // Returns next node in tree, with regard to Node, which is visible. // Nodes which need an initialization (including the result) are initialized. // toChildrenAbove is optionally considered which is the default here. var ForceSearch: Boolean; begin Result := Node; if Assigned(Result) then begin Assert(Result <> FRoot, 'Node must not be the hidden root node.'); // If the given node is not visible then look for a parent node which is visible, otherwise we will // likely go unnecessarily through a whole bunch of invisible nodes. if not FullyVisible[Result] then Result := GetVisibleParent(Result); if ConsiderChildrenAbove and (toChildrenAbove in FOptions.FPaintOptions) then begin repeat // If there a no siblings anymore, go up one level. if not Assigned(Result.NextSibling) then begin Result := Result.Parent; if Result = FRoot then begin Result := nil; Break; end; if not (vsInitialized in Result.States) then InitNode(Result); if vsVisible in Result.States then Break; end else begin // There is at least one sibling so take it. Result := Result.NextSibling; if not (vsInitialized in Result.States) then InitNode(Result); if not (vsVisible in Result.States) then Continue; // Now take a look at the children. // As the children are initialized while toggling, we don't need to do this here. while (vsExpanded in Result.States) and Assigned(Result.FirstChild) do begin Result := Result.FirstChild; if not (vsInitialized in Result.States) then InitNode(Result); if not (vsVisible in Result.States) then Break; end; // If we found a visible node we don't need to search any longer. if vsVisible in Result.States then Break; end; until False; end else begin // Has this node got children? if [vsHasChildren, vsExpanded] * Result.States = [vsHasChildren, vsExpanded] then begin // Yes, there are child nodes. Initialize them if necessary. if Result.ChildCount = 0 then InitChildren(Result); end; // Child nodes are the first choice if possible. if (vsExpanded in Result.States) and Assigned(Result.FirstChild) then begin Result := GetFirstChild(Result); ForceSearch := False; end else ForceSearch := True; // If there are no children or the first child is not visible then search the sibling nodes or traverse parents. if Assigned(Result) and (ForceSearch or not (vsVisible in Result.States)) then begin repeat // Is there a next sibling? if Assigned(Result.NextSibling) then begin Result := Result.NextSibling; if not (vsInitialized in Result.States) then InitNode(Result); if vsVisible in Result.States then Break; end else begin // No sibling anymore, so use the parent's next sibling. if Result.Parent <> FRoot then Result := Result.Parent else begin // There are no further nodes to examine, hence there is no further visible node. Result := nil; Break; end; end; until False; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNextVisibleNoInit(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = True): PVirtualNode; // Returns the next node in tree, with regard to Node, which is visible. // toChildrenAbove is optionally considered (which is the default). No initialization is done. var ForceSearch: Boolean; begin Result := Node; if Assigned(Result) then begin Assert(Result <> FRoot, 'Node must not be the hidden root node.'); if ConsiderChildrenAbove and (toChildrenAbove in FOptions.FPaintOptions) then begin repeat // If there a no siblings anymore, go up one level. if not Assigned(Result.NextSibling) then begin Result := Result.Parent; if Result = FRoot then begin Result := nil; Break; end; if vsVisible in Result.States then Break; end else begin // There is at least one sibling so take it. Result := Result.NextSibling; if not (vsVisible in Result.States) then Continue; // Now take a look at the children. while (vsExpanded in Result.States) and Assigned(Result.FirstChild) do begin Result := Result.FirstChild; if not (vsVisible in Result.States) then Break; end; // If we found a visible node we don't need to search any longer. if vsVisible in Result.States then Break; end; until False; end else begin // If the given node is not visible then look for a parent node which is visible, otherwise we will // likely go unnecessarily through a whole bunch of invisible nodes. if not FullyVisible[Result] then Result := GetVisibleParent(Result); // Child nodes are the first choice if possible. if (vsExpanded in Result.States) and Assigned(Result.FirstChild) then begin Result := Result.FirstChild; ForceSearch := False; end else ForceSearch := True; // If there are no children or the first child is not visible then search the sibling nodes or traverse parents. if ForceSearch or not (vsVisible in Result.States) then begin repeat // Is there a next sibling? if Assigned(Result.NextSibling) then begin Result := Result.NextSibling; if vsVisible in Result.States then Break; end else begin // No sibling anymore, so use the parent's next sibling. if Result.Parent <> FRoot then Result := Result.Parent else begin // There are no further nodes to examine, hence there is no further visible node. Result := nil; Break; end; end; until False; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNextVisibleSibling(Node: PVirtualNode): PVirtualNode; // Returns the next visible sibling after Node. Initialization is done implicitly. begin Assert(Assigned(Node) and (Node <> FRoot), 'Invalid parameter.'); Result := Node; repeat Result := GetNextSibling(Result); until not Assigned(Result) or (vsVisible in Result.States); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNextVisibleSiblingNoInit(Node: PVirtualNode): PVirtualNode; // Returns the next visible sibling after Node. begin Assert(Assigned(Node) and (Node <> FRoot), 'Invalid parameter.'); Result := Node; repeat Result := Result.NextSibling; until not Assigned(Result) or (vsVisible in Result.States); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNodeAt(X, Y: Integer): PVirtualNode; // Overloaded variant of GetNodeAt to easy life of application developers which do not need to have the exact // top position returned and always use client coordinates. var Dummy: Integer; begin Result := GetNodeAt(X, Y, True, Dummy); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNodeAt(X, Y: Integer; Relative: Boolean; var NodeTop: Integer): PVirtualNode; var OffsetByHeader: Boolean; begin //lclheader OffsetByHeader := Relative and (hoVisible in FHeader.Options); if OffsetByHeader then Dec(Y, FHeader.Height); Result := InternalGetNodeAt(X, Y, Relative, NodeTop); //lclheader if OffsetByHeader then Inc(NodeTop, FHeader.Height); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNodeData(Node: PVirtualNode): Pointer; // Returns the address of the user defined data area in the node. begin Assert(FNodeDataSize > 0, 'NodeDataSize not initialized.'); if (FNodeDataSize <= 0) or (Node = nil) or (Node = FRoot) then Result := nil else Result := PByte(@Node.Data) + FTotalInternalDataSize; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetNodeLevel(Node: PVirtualNode): Cardinal; // returns the level of the given node var Run: PVirtualNode; begin Result := 0; if Assigned(Node) and (Node <> FRoot) then begin Run := Node.Parent; while Run <> FRoot do begin Run := Run.Parent; Inc(Result); end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetPrevious(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; // Returns previous node in tree. If ConsiderChildrenAbove is True the function considers // whether toChildrenAbove is currently set, otherwise the result will always be the previous // node in top-down order regardless of the current PaintOptions. // The Result will be initialized if needed. var Run: PVirtualNode; begin Result := Node; if Assigned(Result) then begin Assert(Result <> FRoot, 'Node must not be the hidden root node.'); if ConsiderChildrenAbove and (toChildrenAbove in FOptions.FPaintOptions) then begin // Has this node got children? Initialize them if necessary. if (vsHasChildren in Result.States) and (Result.ChildCount = 0) then InitChildren(Result); // If there is a last child, take it; if not try the previous sibling. if Assigned(Result.LastChild) then Result := Result.LastChild else if Assigned(Result.PrevSibling) then Result := Result.PrevSibling else begin // If neither a last child nor a previous sibling exist, go the tree upwards and // look, wether one of the parent nodes have a previous sibling. If not the result // will ne nil. repeat Result := Result.Parent; Run := nil; if Result <> FRoot then Run := Result.PrevSibling else Result := nil; until Assigned(Run) or (Result = nil); if Assigned(Run) then Result := Run; end; end else begin // Is there a previous sibling? if Assigned(Node.PrevSibling) then begin // Go down and find the last child node. Result := GetLast(Node.PrevSibling); if Result = nil then Result := Node.PrevSibling; end else // no previous sibling so the parent of the node is the previous visible node if Node.Parent <> FRoot then Result := Node.Parent else Result := nil; end; end; if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetPreviousChecked(Node: PVirtualNode; State: TCheckState = csCheckedNormal; ConsiderChildrenAbove: Boolean = False): PVirtualNode; begin if (Node = nil) or (Node = FRoot) then Result := GetLastNoInit(nil, ConsiderChildrenAbove) else Result := GetPreviousNoInit(Node, ConsiderChildrenAbove); while Assigned(Result) and (Result.CheckState <> State) do Result := GetPreviousNoInit(Result, ConsiderChildrenAbove); if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetPreviousCutCopy(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; // Returns the previous node in the tree which is currently marked for a clipboard operation. Since only visible nodes can // be marked (or they are hidden after they have been marked) it is not necessary to initialize nodes to check for // child nodes. The result, however, is initialized if necessary. begin if ClipboardStates * FStates <> [] then begin if (Node = nil) or (Node = FRoot) then Result := GetLastNoInit(nil, ConsiderChildrenAbove) else Result := GetPreviousNoInit(Node, ConsiderChildrenAbove); while Assigned(Result) and not (vsCutOrCopy in Result.States) do Result := GetPreviousNoInit(Result, ConsiderChildrenAbove); if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end else Result := nil; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetPreviousInitialized(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; // Returns the previous node in tree which is initialized. begin Result := Node; repeat Result := GetPreviousNoInit(Result, ConsiderChildrenAbove); until (Result = nil) or (vsInitialized in Result.States); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetPreviousLeaf(Node: PVirtualNode): PVirtualNode; // Returns the previous node in the tree which has currently no children. // The result is initialized if necessary. begin if (Node = nil) or (Node = FRoot) then Result := FRoot.LastChild else Result := GetPrevious(Node); while Assigned(Result) and (vsHasChildren in Result.States) do Result := GetPrevious(Result); if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetPreviousLevel(Node: PVirtualNode; NodeLevel: Cardinal): PVirtualNode; // Returns the previous node in the tree on a specific level. // The result is initialized if necessary. var StartNodeLevel: Cardinal; Run: PVirtualNode; begin Result := nil; if Assigned(Node) and (Node <> FRoot) then begin StartNodeLevel := GetNodeLevel(Node); if StartNodeLevel < NodeLevel then begin Result := Node.PrevSibling; if Assigned(Result) then begin // go to last descendant of previous sibling with desired node level (if exists) Run := Result; while Assigned(Run) and (GetNodeLevel(Run) < NodeLevel) do begin Result := Run; Run := GetLastChild(Run); end; if Assigned(Run) and (GetNodeLevel(Run) = NodeLevel) then Result := Run else begin if Assigned(Result.PrevSibling) then Result := GetPreviousLevel(Result, NodeLevel) else if Assigned(Result) and (Result.Parent <> FRoot) then Result := GetPreviousLevel(Result.Parent, NodeLevel) else Result := nil; end; end else Result := GetPreviousLevel(Node.Parent, NodeLevel); end else if StartNodeLevel = NodeLevel then begin Result := Node.PrevSibling; if not Assigned(Result) then // i.e. start node was a first sibling begin Result := Node.Parent; if Assigned(Result) then Result := GetPreviousLevel(Result, NodeLevel); end; end else // i.e. StartNodeLevel > NodeLevel Result := GetPreviousLevel(Node.Parent, NodeLevel); end; if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetPreviousNoInit(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; // Returns previous node in tree, optionally considering toChildrenAbove. No initialization is performed. var Run: PVirtualNode; begin Result := Node; if Assigned(Result) then begin Assert(Result <> FRoot, 'Node must not be the hidden root node.'); if ConsiderChildrenAbove and (toChildrenAbove in FOptions.FPaintOptions) then begin // If there is a last child, take it; if not try the previous sibling. if Assigned(Result.LastChild) then Result := Result.LastChild else if Assigned(Result.PrevSibling) then Result := Result.PrevSibling else begin // If neither a last child nor a previous sibling exist, go the tree upwards and // look, wether one of the parent nodes have a previous sibling. If not the result // will ne nil. repeat Result := Result.Parent; Run := nil; if Result <> FRoot then Run := Result.PrevSibling else Result := nil; until Assigned(Run) or (Result = nil); if Assigned(Run) then Result := Run; end; end else begin // Is there a previous sibling? if Assigned(Node.PrevSibling) then begin // Go down and find the last child node. Result := GetLastNoInit(Node.PrevSibling); if Result = nil then Result := Node.PrevSibling; end else // No previous sibling so the parent of the node is the previous node. if Node.Parent <> FRoot then Result := Node.Parent else Result := nil end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetPreviousSelected(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; // Returns the previous node in the tree which is currently selected. Since children of unitialized nodes cannot be // in the current selection (because they simply do not exist yet) it is not necessary to initialize nodes here. // The result however is initialized if necessary. begin if FSelectionCount > 0 then begin if (Node = nil) or (Node = FRoot) then Result := FRoot.LastChild else Result := GetPreviousNoInit(Node, ConsiderChildrenAbove); while Assigned(Result) and not (vsSelected in Result.States) do Result := GetPreviousNoInit(Result, ConsiderChildrenAbove); if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end else Result := nil; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetPreviousSibling(Node: PVirtualNode): PVirtualNode; // Get next sibling of Node, initialize it if necessary. begin Result := Node; if Assigned(Result) then begin Assert(Result <> FRoot, 'Node must not be the hidden root node.'); Result := Result.PrevSibling; if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetPreviousSiblingNoInit(Node: PVirtualNode): PVirtualNode; // Get next sibling of Node, performes no initialization. begin Result := Node; if Assigned(Result) then begin Assert(Result <> FRoot, 'Node must not be the hidden root node.'); Result := Result.PrevSibling; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetPreviousVisible(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = True): PVirtualNode; // Returns the previous node in tree, with regard to Node, which is visible. // Nodes which need an initialization (including the result) are initialized. // toChildrenAbove is optionally considered which is the default here. var Marker: PVirtualNode; begin Result := Node; if Assigned(Result) then begin Assert(Result <> FRoot, 'Node must not be the hidden root node.'); repeat // If the given node is not visible then look for a parent node which is visible and use its last visible // child or the parent node (if there is no visible child) as result. if not FullyVisible[Result] then begin Result := GetVisibleParent(Result); if Result = FRoot then Result := nil; Marker := GetLastVisible(Result, True); if Assigned(Marker) then Result := Marker; end else begin if ConsiderChildrenAbove and (toChildrenAbove in FOptions.FPaintOptions) then begin repeat if Assigned(Result.LastChild) and (vsExpanded in Result.States) then begin Result := Result.LastChild; if not (vsInitialized in Result.States) then InitNode(Result); if vsVisible in Result.States then Break; end else if Assigned(Result.PrevSibling) then begin if not (vsInitialized in Result.PrevSibling.States) then InitNode(Result.PrevSibling); if vsVisible in Result.PrevSibling.States then begin Result := Result.PrevSibling; Break; end; end else begin Marker := nil; repeat Result := Result.Parent; if Result <> FRoot then Marker := GetPreviousVisibleSibling(Result) else Result := nil; until Assigned(Marker) or (Result = nil); if Assigned(Marker) then Result := Marker; Break; end; until False; end else begin repeat // Is there a previous sibling node? if Assigned(Result.PrevSibling) then begin Result := Result.PrevSibling; // Initialize the new node and check its visibility. if not (vsInitialized in Result.States) then InitNode(Result); if vsVisible in Result.States then begin // If there are visible child nodes then use the last one. Marker := GetLastVisible(Result, True); if Assigned(Marker) then Result := Marker; Break; end; end else begin // No previous sibling there so the parent node is the nearest previous node. Result := Result.Parent; if Result = FRoot then Result := nil; Break; end; until False; end; if Assigned(Result) and not (vsInitialized in Result.States) then InitNode(Result); end; until not Assigned(Result) or (vsVisible in Result.States); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetPreviousVisibleNoInit(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = True): PVirtualNode; // Returns the previous node in tree, with regard to Node, which is visible. // toChildrenAbove is optionally considered which is the default here. var Marker: PVirtualNode; begin Result := Node; if Assigned(Result) then begin Assert(Result <> FRoot, 'Node must not be the hidden root node.'); repeat // If the given node is not visible then look for a parent node which is visible and use its last visible // child or the parent node (if there is no visible child) as result. if not FullyVisible[Result] then begin Result := GetVisibleParent(Result); if Result = FRoot then Result := nil; Marker := GetLastVisibleNoInit(Result, True); if Assigned(Marker) then Result := Marker; end else begin if ConsiderChildrenAbove and (toChildrenAbove in FOptions.FPaintOptions) then begin repeat // Is the current node expanded and has children? if (vsExpanded in Result.States) and Assigned(Result.LastChild) then begin Result := Result.LastChild; if vsVisible in Result.States then Break; end else if Assigned(Result.PrevSibling) then begin // No children anymore, so take the previous sibling. if vsVisible in Result.PrevSibling.States then begin Result := Result.PrevSibling; Break; end; end else begin // No children and no previous siblings, so walk up the tree and look wether // a parent has a previous visible sibling. If that is the case take it, // otherwise there is no previous visible node. Marker := nil; repeat Result := Result.Parent; if Result <> FRoot then Marker := GetPreviousVisibleSiblingNoInit(Result) else Result := nil; until Assigned(Marker) or (Result = nil); if Assigned(Marker) then Result := Marker; Break; end; until False; end else begin repeat // Is there a previous sibling node? if Assigned(Result.PrevSibling) then begin Result := Result.PrevSibling; if vsVisible in Result.States then begin // If there are visible child nodes then use the last one. Marker := GetLastVisibleNoInit(Result, True); if Assigned(Marker) then Result := Marker; Break; end; end else begin // No previous sibling there so the parent node is the nearest previous node. Result := Result.Parent; if Result = FRoot then Result := nil; Break; end; until False; end; end; until not Assigned(Result) or (vsVisible in Result.States); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetPreviousVisibleSibling(Node: PVirtualNode): PVirtualNode; // Returns the previous visible sibling before Node. Initialization is done implicitly. begin Assert(Assigned(Node) and (Node <> FRoot), 'Invalid parameter.'); Result := Node; repeat Result := GetPreviousSibling(Result); until not Assigned(Result) or (vsVisible in Result.States); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetPreviousVisibleSiblingNoInit(Node: PVirtualNode): PVirtualNode; // Returns the previous visible sibling before Node. begin Assert(Assigned(Node) and (Node <> FRoot), 'Invalid parameter.'); Result := Node; repeat Result := Result.PrevSibling; until not Assigned(Result) or (vsVisible in Result.States); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetSortedCutCopySet(Resolve: Boolean): TNodeArray; // Same as GetSortedSelection but with nodes marked as being part in the current cut/copy set (e.g. for clipboard). var Run: PVirtualNode; Counter: Cardinal; //--------------- local function -------------------------------------------- procedure IncludeThisNode(Node: PVirtualNode); // adds the given node to the result var Len: Cardinal; begin Len := Length(Result); if Counter = Len then begin if Len < 100 then Len := 100 else Len := Len + Len div 10; SetLength(Result, Len); end; Result[Counter] := Node; Inc(Counter); end; //--------------- end local function ---------------------------------------- begin Run := FRoot.FirstChild; Counter := 0; if Resolve then begin // Resolving is actually easy: just find the first cutted node in logical order // and then never go deeper in level than this node as long as there's a sibling node. // Restart the search for a cutted node (at any level) if there are no further siblings. while Assigned(Run) do begin if vsCutOrCopy in Run.States then begin IncludeThisNode(Run); if Assigned(Run.NextSibling) then Run := Run.NextSibling else begin // If there are no further siblings then go up one or more levels until a node is // found or all nodes have been processed. Although we consider here only initialized // nodes we don't need to make any special checks as only initialized nodes can also be selected. repeat Run := Run.Parent; until (Run = FRoot) or Assigned(Run.NextSibling); if Run = FRoot then Break else Run := Run.NextSibling; end; end else Run := GetNextNoInit(Run); end; end else while Assigned(Run) do begin if vsCutOrCopy in Run.States then IncludeThisNode(Run); Run := GetNextNoInit(Run); end; // set the resulting array to its real length SetLength(Result, Counter); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetSortedSelection(Resolve: Boolean): TNodeArray; // Returns a list of selected nodes sorted in logical order, that is, as they appear in the tree. // If Resolve is True then nodes which are children of other selected nodes are not put into the new array. // This feature is in particuar important when doing drag'n drop as in this case all selected node plus their children // need to be considered. A selected node which is child (grand child etc.) of another selected node is then // automatically included and doesn't need to be explicitely mentioned in the returned selection array. // // Note: The caller is responsible for freeing the array. Allocation is done here. Usually, though, freeing the array // doesn't need additional attention as it is automatically freed by Delphi when it gets out of scope. var Run: PVirtualNode; Counter: Cardinal; begin SetLength(Result, FSelectionCount); if FSelectionCount > 0 then begin Run := FRoot.FirstChild; Counter := 0; if Resolve then begin // Resolving is actually easy: just find the first selected node in logical order // and then never go deeper in level than this node as long as there's a sibling node. // Restart the search for a selected node (at any level) if there are no further siblings. while Assigned(Run) do begin if vsSelected in Run.States then begin Result[Counter] := Run; Inc(Counter); if Assigned(Run.NextSibling) then Run := Run.NextSibling else begin // If there are no further siblings then go up one or more levels until a node is // found or all nodes have been processed. Although we consider here only initialized // nodes we don't need to make any special checks as only initialized nodes can also be selected. repeat Run := Run.Parent; until (Run = FRoot) or Assigned(Run.NextSibling); if Run = FRoot then Break else Run := Run.NextSibling; end; end else Run := GetNextNoInit(Run); end; end else while Assigned(Run) do begin if vsSelected in Run.States then begin Result[Counter] := Run; Inc(Counter); end; Run := GetNextNoInit(Run); end; // Since we may have skipped some nodes the result array is likely to be smaller than the // selection array, hence shorten the result to true length. if Integer(Counter) < Length(Result) then SetLength(Result, Counter); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.GetTextInfo(Node: PVirtualNode; Column: TColumnIndex; const AFont: TFont; var R: TRect; out Text: String); // Generic base method for editors, hint windows etc. to get some info about a node. begin R := Rect(0, 0, 0, 0); Text := ''; AFont.Assign(Font); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetTreeRect: TRect; // Returns the true size of the tree in pixels. This size is at least ClientHeight x ClientWidth and depends on // the expand state, header size etc. // Note: if no columns are used then the width of the tree is determined by the largest node which is currently in the // client area. This might however not be the largest node in the entire tree. begin Result := Rect(0, 0, Max(FRangeX, ClientWidth), Max(FRangeY, ClientHeight)); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.GetVisibleParent(Node: PVirtualNode): PVirtualNode; // Returns the first (nearest) parent node of Node which is visible. // This method is one of the seldom cases where the hidden root node could be returned. begin Assert(Assigned(Node), 'Node must not be nil.'); Assert(Node <> FRoot, 'Node must not be the hidden root node.'); Result := Node.Parent; while (Result <> FRoot) and not FullyVisible[Result] do Result := Result.Parent; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.HasAsParent(Node, PotentialParent: PVirtualNode): Boolean; // Determines whether Node has got PotentialParent as one of its parents. var Run: PVirtualNode; begin Result := Assigned(Node) and Assigned(PotentialParent) and (Node <> PotentialParent); if Result then begin Run := Node; while (Run <> FRoot) and (Run <> PotentialParent) do Run := Run.Parent; Result := Run = PotentialParent; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.InsertNode(Node: PVirtualNode; Mode: TVTNodeAttachMode; UserData: Pointer = nil): PVirtualNode; // Adds a new node relative to Node. The final position is determined by Mode. // UserData can be used to set the first 4 bytes of the user data area to an initial value which can be used // in OnInitNode and will also cause to trigger the OnFreeNode event (if <> nil) even if the node is not yet // "officially" initialized. // InsertNode is a compatibility method and will implicitly validate the given node if the new node // is to be added as child node. This is however against the virtual paradigm and hence I dissuade from its usage. var NodeData: ^Pointer; begin if Mode <> amNoWhere then begin CancelEditNode; if Node = nil then Node := FRoot; // we need a new node... Result := MakeNewNode; // avoid erronous attach modes if Node = FRoot then begin case Mode of amInsertBefore: Mode := amAddChildFirst; amInsertAfter: Mode := amAddChildLast; end; end; // Validate given node in case the new node becomes its child. if (Mode in [amAddChildFirst, amAddChildLast]) and not (vsInitialized in Node.States) then InitNode(Node); InternalConnectNode(Result, Node, Self, Mode); // Check if there is initial user data and there is also enough user data space allocated. if Assigned(UserData) then if FNodeDataSize >= 4 then begin NodeData := Pointer(PByte(@Result.Data) + FTotalInternalDataSize); NodeData^ := UserData; Include(Result.States, vsInitialUserData); end else ShowError(SCannotSetUserData, hcTFCannotSetUserData); if FUpdateCount = 0 then begin // If auto sort is enabled then sort the node or its parent (depending on the insert mode). if (toAutoSort in FOptions.FAutoOptions) and (FHeader.FSortColumn > InvalidColumn) then case Mode of amInsertBefore, amInsertAfter: // Here no initialization is necessary because *if* a node has already got children then it // must also be initialized. // Note: Node can never be FRoot at this point. Sort(Node.Parent, FHeader.FSortColumn, FHeader.FSortDirection, True); amAddChildFirst, amAddChildLast: Sort(Node, FHeader.FSortColumn, FHeader.FSortDirection, True); end; UpdateScrollbars(True); if Mode = amInsertBefore then InvalidateToBottom(Result) else InvalidateToBottom(Node); end; StructureChange(Result, crNodeAdded); end else Result := nil; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.InvalidateChildren(Node: PVirtualNode; Recursive: Boolean); // Invalidates Node and its immediate children. // If Recursive is True then all grandchildren are invalidated as well. // The node itself is initialized if necessary and its child nodes are created (and initialized too if // Recursive is True). var Run: PVirtualNode; begin if Assigned(Node) then begin if not (vsInitialized in Node.States) then InitNode(Node); InvalidateNode(Node); if (vsHasChildren in Node.States) and (Node.ChildCount = 0) then InitChildren(Node); Run := Node.FirstChild; end else Run := FRoot.FirstChild; while Assigned(Run) do begin InvalidateNode(Run); if Recursive then InvalidateChildren(Run, True); Run := Run.NextSibling; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.InvalidateColumn(Column: TColumnIndex); // Invalidates the client area part of a column. var R: TRect; begin if (FUpdateCount = 0) and HandleAllocated and FHeader.FColumns.IsValidColumn(Column) then begin R := ClientRect; //lclheader if hoVisible in FHeader.FOptions then OffsetRect(R, 0, FHeader.Height); FHeader.Columns.GetColumnBounds(Column, R.Left, R.Right); InvalidateRect(Handle, @R, False); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.InvalidateNode(Node: PVirtualNode): TRect; // Initiates repaint of the given node and returns the just invalidated rectangle. begin if (FUpdateCount = 0) and HandleAllocated then begin Result := GetDisplayRect(Node, NoColumn, False); InvalidateRect(Handle, @Result, False); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.InvalidateToBottom(Node: PVirtualNode); // Initiates repaint of client area starting at given node. If this node is not visible or not yet initialized // then nothing happens. var R: TRect; begin if FUpdateCount = 0 then begin if (Node = nil) or (Node = FRoot) then Invalidate else if (vsInitialized in Node.States) and (vsVisible in Node.States) then begin R := GetDisplayRect(Node, -1, False); if R.Top < ClientHeight then begin if (toChildrenAbove in FOptions.FPaintOptions) and (vsExpanded in Node.States) then Dec(R.Top, Node.TotalHeight + NodeHeight[Node]); R.Bottom := ClientHeight; //lclheader if hoVisible in FHeader.FOptions then Inc(R.Bottom, FHeader.Height); InvalidateRect(Handle, @R, False); end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.InvertSelection(VisibleOnly: Boolean); // Inverts the current selection (so nodes which are selected become unselected and vice versa). // If VisibleOnly is True then only visible nodes are considered. var Run: PVirtualNode; NewSize: Integer; NextFunction: TGetNextNodeProc; TriggerChange: Boolean; begin if not FSelectionLocked and (toMultiSelect in FOptions.FSelectionOptions) then begin Run := FRoot.FirstChild; ClearTempCache; if VisibleOnly then NextFunction := GetNextVisibleNoInit else NextFunction := GetNextNoInit; while Assigned(Run) do begin if vsSelected in Run.States then InternalRemoveFromSelection(Run) else InternalCacheNode(Run); Run := NextFunction(Run); end; // do some housekeeping // Need to trigger the OnChange event from here if nodes were only deleted but not added. TriggerChange := False; NewSize := PackArray(FSelection, FSelectionCount); if NewSize > -1 then begin FSelectionCount := NewSize; SetLength(FSelection, FSelectionCount); TriggerChange := True; end; if FTempNodeCount > 0 then begin AddToSelection(FTempNodeCache, FTempNodeCount); ClearTempCache; TriggerChange := False; end; Invalidate; if TriggerChange then Change(nil); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.IsEditing: Boolean; begin Result := tsEditing in FStates; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.IsMouseSelecting: Boolean; begin Result := (tsDrawSelPending in FStates) or (tsDrawSelecting in FStates); end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.IterateSubtree(Node: PVirtualNode; Callback: TVTGetNodeProc; Data: Pointer; Filter: TVirtualNodeStates = []; DoInit: Boolean = False; ChildNodesOnly: Boolean = False): PVirtualNode; // Iterates through the all children and grandchildren etc. of Node (or the entire tree if Node = nil) // and calls for each node the provided callback method (which must not be empty). // Filter determines which nodes to consider (an empty set denotes all nodes). // If DoInit is True then nodes which aren't initialized yet will be initialized. // Note: During execution of the callback the application can set Abort to True. In this case the iteration is stopped // and the last accessed node (the one on which the callback set Abort to True) is returned to the caller. // Otherwise (no abort) nil is returned. var Stop: PVirtualNode; Abort: Boolean; GetNextNode: TGetNextNodeProc; WasIterating: Boolean; begin Assert(Node <> FRoot, 'Node must not be the hidden root node.'); WasIterating := tsIterating in FStates; DoStateChange([tsIterating]); try // prepare function to be used when advancing if DoInit then GetNextNode := GetNext else GetNextNode := GetNextNoInit; Abort := False; if Node = nil then Stop := nil else begin if not (vsInitialized in Node.States) and DoInit then InitNode(Node); // The stopper does not need to be initialized since it is not taken into the enumeration. Stop := Node.NextSibling; if Stop = nil then begin Stop := Node; repeat Stop := Stop.Parent; until (Stop = FRoot) or Assigned(Stop.NextSibling); if Stop = FRoot then Stop := nil else Stop := Stop.NextSibling; end; end; // Use first node if we start with the root. if Node = nil then Node := GetFirstNoInit; if Assigned(Node) then begin if not (vsInitialized in Node.States) and DoInit then InitNode(Node); // Skip given node if only the child nodes are requested. if ChildNodesOnly then begin if Node.ChildCount = 0 then Node := nil else Node := GetNextNode(Node); end; if Filter = [] then begin // unfiltered loop while Assigned(Node) and (Node <> Stop) do begin Callback(Self, Node, Data, Abort); if Abort then Break; Node := GetNextNode(Node); end; end else begin // filtered loop while Assigned(Node) and (Node <> Stop) do begin if Node.States * Filter = Filter then Callback(Self, Node, Data, Abort); if Abort then Break; Node := GetNextNode(Node) end; end; end; if Abort then Result := Node else Result := nil; finally if not WasIterating then DoStateChange([], [tsIterating]); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.LoadFromFile(const FileName: TFileName); var FileStream: TFileStream; begin FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try LoadFromStream(FileStream); finally FileStream.Free; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.LoadFromStream(Stream: TStream); // Clears the current content of the tree and loads a new structure from the given stream. var ThisID: TMagicID; Version, Count: Cardinal; Node: PVirtualNode; begin if not (toReadOnly in FOptions.FMiscOptions) then begin Clear; // Check first whether this is a stream we can read. if Stream.Read(ThisID, SizeOf(TMagicID)) < SizeOf(TMagicID) then ShowError(SStreamTooSmall, hcTFStreamTooSmall); if (ThisID[0] = MagicID[0]) and (ThisID[1] = MagicID[1]) and (ThisID[2] = MagicID[2]) and (ThisID[5] = MagicID[5]) then begin Version := Word(ThisID[3]); if Version <= VTTreeStreamVersion then begin BeginUpdate; try // LCL port started with tree stream version 2 so no need to do the check here Stream.ReadBuffer(Count, SizeOf(Count)); while (Stream.Position < Stream.Size) and (Count > 0) do begin Dec(Count); Node := MakeNewNode; InternalConnectNode(Node, FRoot, Self, amAddChildLast); InternalAddFromStream(Stream, Version, Node); end; DoNodeCopied(nil); finally EndUpdate; end; end else ShowError(SWrongStreamVersion, hcTFWrongStreamVersion); end else ShowError(SWrongStreamFormat, hcTFWrongStreamFormat); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.MeasureItemHeight(const Canvas: TCanvas; Node: PVirtualNode); // If the height of the given node has not yet been measured then do it now. var NewNodeHeight: Integer; begin if not (vsHeightMeasured in Node.States) then begin Include(Node.States, vsHeightMeasured); NewNodeHeight := Node.NodeHeight; DoMeasureItem(Canvas, Node, NewNodeHeight); if NewNodeHeight <> Node.NodeHeight then SetNodeHeight(Node, NewNodeHeight); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.MoveTo(Node: PVirtualNode; Tree: TBaseVirtualTree; Mode: TVTNodeAttachMode; ChildrenOnly: Boolean); // A simplified method to allow to move nodes to the root of another tree. begin MoveTo(Node, Tree.FRoot, Mode, ChildrenOnly); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.MoveTo(Source, Target: PVirtualNode; Mode: TVTNodeAttachMode; ChildrenOnly: Boolean); // Moves the given node (and all its children) to Target. Source must belong to the tree instance which calls this // MoveTo method. Mode determines how to connect Source to Target. // This method might involve a change of the tree if Target belongs to a different tree than Source. var TargetTree: TBaseVirtualTree; Allowed: Boolean; NewNode: PVirtualNode; Stream: TMemoryStream; begin Assert(TreeFromNode(Source) = Self, 'The source tree must contain the source node.'); // When moving nodes then source and target must not be the same node unless only the source's children are // moved and they are inserted before or after the node itself. Allowed := (Source <> Target) or ((Mode in [amInsertBefore, amInsertAfter]) and ChildrenOnly); if Allowed and (Mode <> amNoWhere) and Assigned(Source) and (Source <> FRoot) and not (toReadOnly in FOptions.FMiscOptions) then begin // Assume that an empty destination means the root in this (the source) tree. if Target = nil then begin TargetTree := Self; Target := FRoot; Mode := amAddChildFirst; end else TargetTree := TreeFromNode(Target); if Target = TargetTree.FRoot then begin case Mode of amInsertBefore: Mode := amAddChildFirst; amInsertAfter: Mode := amAddChildLast; end; end; // Make sure the target node is initialized. if not (vsInitialized in Target.States) then InitNode(Target) else if (vsHasChildren in Target.States) and (Target.ChildCount = 0) then InitChildren(Target); if TargetTree = Self then begin // Simple case: move node(s) within the same tree. if Target = FRoot then Allowed := DoNodeMoving(Source, nil) else Allowed := DoNodeMoving(Source, Target); if Allowed then begin // Check first that Source is not added as new child to a target node which // is already a child of Source. // Consider the case Source and Target are the same node, but only child nodes are moved. if (Source <> Target) and HasAsParent(Target, Source) then ShowError(SWrongMoveError, hcTFWrongMoveError); if not ChildrenOnly then begin // Disconnect from old location. InternalDisconnectNode(Source, True); // Connect to new location. InternalConnectNode(Source, Target, Self, Mode); DoNodeMoved(Source); end else begin // Only child nodes should be moved. Insertion order depends on move mode. if Mode = amAddChildFirst then begin Source := Source.LastChild; while Assigned(Source) do begin NewNode := Source.PrevSibling; // Disconnect from old location. InternalDisconnectNode(Source, True, False); // Connect to new location. InternalConnectNode(Source, Target, Self, Mode); DoNodeMoved(Source); Source := NewNode; end; end else begin Source := Source.FirstChild; while Assigned(Source) do begin NewNode := Source.NextSibling; // Disconnect from old location. InternalDisconnectNode(Source, True, False); // Connect to new location. InternalConnectNode(Source, Target, Self, Mode); DoNodeMoved(Source); Source := NewNode; end; end; end; end; end else begin // Difficult case: move node(s) to another tree. // In opposition to node copying we ask only once if moving is allowed because // we cannot take back a move once done. if Target = TargetTree.FRoot then Allowed := DoNodeMoving(Source, nil) else Allowed := DoNodeMoving(Source, Target); if Allowed then begin Stream := TMemoryStream.Create; try // Write all nodes into a temporary stream depending on the ChildrenOnly flag. if not ChildrenOnly then WriteNode(Stream, Source) else begin Source := Source.FirstChild; while Assigned(Source) do begin WriteNode(Stream, Source); Source := Source.NextSibling; end; end; // Now load the serialized nodes into the target node (tree). TargetTree.BeginUpdate; try Stream.Position := 0; while Stream.Position < Stream.Size do begin NewNode := TargetTree.MakeNewNode; InternalConnectNode(NewNode, Target, TargetTree, Mode); TargetTree.InternalAddFromStream(Stream, VTTreeStreamVersion, NewNode); DoNodeMoved(NewNode); end; finally TargetTree.EndUpdate; end; finally Stream.Free; end; // finally delete original nodes BeginUpdate; try if ChildrenOnly then DeleteChildren(Source) else DeleteNode(Source); finally EndUpdate; end; end; end; InvalidateCache; if (FUpdateCount = 0) and Allowed then begin ValidateCache; UpdateScrollBars(True); Invalidate; if TargetTree <> Self then TargetTree.Invalidate; end; StructureChange(Source, crNodeMoved); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.PaintTree(TargetCanvas: TCanvas; const Window: TRect; Target: TPoint; PaintOptions: TVTInternalPaintOptions; PixelFormat: TPixelFormat); // This is the core paint routine of the tree. It is responsible for maintaining the paint cycles per node as well // as coordinating drawing of the various parts of the tree image. // TargetCanvas is the canvas to which to draw the tree image. This is usually the tree window itself but could well // be a bitmap or printer canvas. // Window determines which part of the entire tree image to draw. The full size of the virtual image is determined // by GetTreeRect. // Target is the position in TargetCanvas where to draw the tree part specified by Window. // PaintOptions determines what of the tree to draw. For different tasks usually different parts need to be drawn, with // a full image in the window, selected only nodes for a drag image etc. const ImageKind: array[Boolean] of TVTImageKind = (ikNormal, ikSelected); var DrawSelectionRect, UseBackground, ShowImages, ShowStateImages, ShowCheckImages, UseColumns, IsMainColumn: Boolean; {$ifdef ManualClipNeeded} YCorrect, {$endif} VAlign, IndentSize, ButtonX, ButtonY: Integer; LineImage: TLineImage; PaintInfo: TVTPaintInfo; // all necessary information about a node to pass to the paint routines R, // the area of an entire node in its local coordinate TargetRect, // the area of a node (part) in the target canvas SelectionRect: TRect; // ordered rectangle used for drawing the selection focus rect NextColumn: TColumnIndex; BaseOffset: Integer; // top position of the top node to draw given in absolute tree coordinates NodeBitmap: TBitmap; // small buffer to draw flicker free MaximumRight, // maximum horizontal target position MaximumBottom: Integer; // maximum vertical target position SelectLevel: Integer; // > 0 if current node is selected or child/grandchild etc. of a selected node FirstColumn: TColumnIndex; // index of first column which is at least partially visible in the given window begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcPaint],'PaintTree');{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcPaint, lcHeaderOffset],'Window',Window);{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcPaint, lcHeaderOffset],'Target',Target);{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcPaintHeader],'ClientRect',ClientRect);{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcPaintHeader],'TreeRect',GetTreeRect);{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcPaintHeader],'OffsetX: %d OffsetY: %d',[OffsetX,OffsetY]);{$endif} //lcl changes to 24bit color depth when screen depth is 32 bit //todo: remove when this limitation is removed {$ifdef Windows} if (PixelFormat = pfDevice) and (ScreenInfo.ColorDepth = 32) then PixelFormat := pf32bit; {$endif} if not (tsPainting in FStates) then begin DoStateChange([tsPainting]); try DoBeforePaint(TargetCanvas); // Create small bitmaps and initialize default values. // The bitmaps are used to paint one node at a time and to draw the result to the target (e.g. screen) in one step, // to prevent flickering. NodeBitmap := TBitmap.Create; // For alpha blending we need the 32 bit pixel format. For other targets there might be a need for a certain // pixel format (e.g. printing). if MMXAvailable and ((FDrawSelectionMode = smBlendedRectangle) or (tsUseThemes in FStates) or (toUseBlendedSelection in FOptions.PaintOptions)) then NodeBitmap.PixelFormat := pf32Bit else NodeBitmap.PixelFormat := PixelFormat; // Prepare paint info structure and lock the back bitmap canvas to avoid that it gets freed on the way. FillChar(PaintInfo, SizeOf(PaintInfo), 0); PaintInfo.Canvas := NodeBitmap.Canvas; NodeBitmap.Canvas.Lock; try {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'FNewSelRect', FNewSelRect);{$endif} // Prepare the current selection rectangle once. The corner points are absolute tree coordinates. SelectionRect := OrderRect(FNewSelRect); {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails, lcSelection],'SelectionRect', SelectionRect);{$endif} DrawSelectionRect := IsMouseSelecting and not IsRectEmpty(SelectionRect); {$ifdef DEBUG_VTV}Logger.Watch([lcPaintDetails],'DrawSelectionRect',DrawSelectionRect);{$endif} // R represents an entire node (all columns), but is a bit unprecise when it comes to // trees without any column defined, because FRangeX only represents the maximum width of all // nodes in the client area (not all defined nodes). There might be, however, wider nodes somewhere. Without full // validation I cannot better determine the width, though. By using at least the control's width it is ensured // that the tree is fully displayed on screen. R := Rect(0, 0, Max(FRangeX, ClientWidth), 0); NodeBitmap.Width := Window.Right - Window.Left; // For quick checks some intermediate variables are used. UseBackground := (toShowBackground in FOptions.FPaintOptions) and (FBackground.Graphic is TBitmap) and (poBackground in PaintOptions); ShowImages := Assigned(FImages); ShowStateImages := Assigned(FStateImages); ShowCheckImages := Assigned(FCheckImages) and (toCheckSupport in FOptions.FMiscOptions); {$ifdef DEBUG_VTV}Logger.Send([lcCheck],'ShowCheckImages',ShowCheckImages);{$endif} UseColumns := FHeader.UseColumns; // Adjust paint options to tree settings. Hide selection if told so or the tree is unfocused. if (toAlwaysHideSelection in FOptions.FPaintOptions) or (not Focused and (toHideSelection in FOptions.FPaintOptions)) then Exclude(PaintOptions, poDrawSelection); if toHideFocusRect in FOptions.FPaintOptions then Exclude(PaintOptions, poDrawFocusRect); // Determine node to start drawing with. BaseOffset := 0; PaintInfo.Node := InternalGetNodeAt(0, Window.Top, False, BaseOffset); if PaintInfo.Node = nil then BaseOffset := Window.Top; {$ifdef DEBUG_VTV}Logger.Send([lcPaint, lcHeaderOffset],'BaseOffset',BaseOffset);{$endif} // Transform selection rectangle into node bitmap coordinates. if DrawSelectionRect then OffsetRect(SelectionRect, 0, -BaseOffset); {$ifdef DEBUG_VTV}Logger.Send([lcSelection], 'SelectionRect fixed by BaseOffset', SelectionRect);{$endif} // The target rectangle holds the coordinates of the exact area to blit in target canvas coordinates. // It is usually smaller than an entire node and wanders while the paint loop advances. MaximumRight := Target.X + (Window.Right - Window.Left); MaximumBottom := Target.Y + (Window.Bottom - Window.Top); {$ifdef DEBUG_VTV}Logger.Send([lcPaintHeader, lcHeaderOffset],'MaximumRight: %d MaximumBottom: %d',[MaximumRight,MaximumBottom]);{$endif} TargetRect := Rect(Target.X, Target.Y - (Window.Top - BaseOffset), MaximumRight, 0); TargetRect.Bottom := TargetRect.Top; // This marker gets the index of the first column which is visible in the given window. // This is needed for column based background colors. FirstColumn := InvalidColumn; if Assigned(PaintInfo.Node) then begin ButtonX := Round((Integer(FIndent) - FPlusBM.Width) / 2); // ----- main node paint loop while Assigned(PaintInfo.Node) do begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcPaintDetails],'PaintNode');{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'NodeIndex',PaintInfo.Node^.Index);{$endif} {$ifdef DEBUG_VTV}Logger.Watch([lcPaintDetails],'BaseOffset',BaseOffset);{$endif} {$ifdef DEBUG_VTV}Logger.Watch([lcPaintDetails],'Brush.Color',PaintInfo.Canvas.Brush.Color);{$endif} // Determine LineImage, SelectionLevel and IndentSize SelectLevel := DetermineLineImageAndSelectLevel(PaintInfo.Node, LineImage); IndentSize := Length(LineImage); if not (toFixedIndent in FOptions.FPaintOptions) then ButtonX := (IndentSize - 1) * FIndent + Round((FIndent - FPlusBM.Width) / 2); // Initialize node if not already done. if not (vsInitialized in PaintInfo.Node.States) then InitNode(PaintInfo.Node); if (vsSelected in PaintInfo.Node.States) and not (toChildrenAbove in FOptions.FPaintOptions) then Inc(SelectLevel); // Ensure the node's height is determined. MeasureItemHeight(PaintInfo.Canvas, PaintInfo.Node); // Adjust the brush origin for dotted lines depending on the current source position. // It is applied some lines later, as the canvas might get reallocated, when changing the node bitmap. PaintInfo.BrushOrigin := Point(Window.Left and 1, BaseOffset and 1); Inc(BaseOffset, PaintInfo.Node.NodeHeight); TargetRect.Bottom := TargetRect.Top + PaintInfo.Node.NodeHeight; {$ifdef DEBUG_VTV}Logger.Send([lcHeaderOffset], 'TargetRect for Node ' + IntToStr(PaintInfo.Node.Index), TargetRect);{$endif} // If poSelectedOnly is active then do the following stuff only for selected nodes or nodes // which are children of selected nodes. if (SelectLevel > 0) or not (poSelectedOnly in PaintOptions) then begin // Adjust height of temporary node bitmap. with NodeBitmap do begin if Height <> PaintInfo.Node.NodeHeight then begin {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'Setting the Node Height');{$endif} Height := PaintInfo.Node.NodeHeight; // Make sure the buffer bitmap and target bitmap use the same transformation mode. {$ifndef Gtk} SetMapMode(Canvas.Handle, GetMapMode(TargetCanvas.Handle)); {$endif} SetWindowOrgEx(Canvas.Handle, Window.Left, 0, nil); R.Bottom := PaintInfo.Node.NodeHeight; end; // Set the origin of the canvas' brush. This depends on the node heights. //todo: see if is necessary. According to docs is only necessary when HALFTONE is set {$ifndef INCOMPLETE_WINAPI} with PaintInfo do SetBrushOrgEx(Canvas.Handle, BrushOrigin.X, BrushOrigin.Y, nil); {$endif} end; CalculateVerticalAlignments(ShowImages, ShowStateImages, PaintInfo.Node, VAlign, ButtonY); // Let application decide whether the node should normally be drawn or by the application itself. if not DoBeforeItemPaint(PaintInfo.Canvas, PaintInfo.Node, R) then begin // Init paint options for the background painting. PaintInfo.PaintOptions := PaintOptions; {$ifdef DEBUG_VTV}Logger.Watch([lcPaintDetails],'Brush.Color',PaintInfo.Canvas.Brush.Color);{$endif} // The node background can contain a single color, a bitmap or can be drawn by the application. ClearNodeBackground(PaintInfo, UseBackground, True, Rect(Window.Left, TargetRect.Top, Window.Right, TargetRect.Bottom)); {$ifdef DEBUG_VTV}Logger.SendBitmap([lcPaintBitmap],'After Clear BackGround',NodeBitmap);{$endif} {$ifdef DEBUG_VTV}Logger.Watch([lcPaintDetails],'Brush.Color',PaintInfo.Canvas.Brush.Color);{$endif} // Prepare column, position and node clipping rectangle. PaintInfo.CellRect := R; {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'PaintInfo.CellRect',PaintInfo.CellRect);{$endif} if UseColumns then InitializeFirstColumnValues(PaintInfo); // Now go through all visible columns (there's still one run if columns aren't used). with FHeader.FColumns do begin while ((PaintInfo.Column > InvalidColumn) or not UseColumns) and (PaintInfo.CellRect.Left < Window.Right) do begin if UseColumns then begin PaintInfo.Column := FPositionToIndex[PaintInfo.Position]; if FirstColumn = InvalidColumn then FirstColumn := PaintInfo.Column; PaintInfo.BidiMode := Items[PaintInfo.Column].FBiDiMode; PaintInfo.Alignment := Items[PaintInfo.Column].FAlignment; end else begin PaintInfo.Column := NoColumn; PaintInfo.BidiMode := BidiMode; PaintInfo.Alignment := FAlignment; end; {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails], 'Column Paint - PaintInfo.Position: %d PaintInfo.Column: %d',[PaintInfo.Position,PaintInfo.Column]);{$endif} PaintInfo.PaintOptions := PaintOptions; with PaintInfo do begin if (tsEditing in FStates) and (Node = FFocusedNode) and ((Column = FEditColumn) or not UseColumns) then Exclude(PaintOptions, poDrawSelection); if not UseColumns or ((vsSelected in Node.States) and (toFullRowSelect in FOptions.FSelectionOptions) and (poDrawSelection in PaintOptions)) or (coParentColor in Items[PaintInfo.Column].Options) then Exclude(PaintOptions, poColumnColor); end; IsMainColumn := PaintInfo.Column = FHeader.MainColumn; // Consider bidi mode here. In RTL context means left alignment actually right alignment and vice versa. if PaintInfo.BidiMode <> bdLeftToRight then ChangeBiDiModeAlignment(PaintInfo.Alignment); // Paint the current cell if it is marked as being visible or columns aren't used and // if this cell belongs to the main column if only the main column should be drawn. if (not UseColumns or (coVisible in Items[PaintInfo.Column].FOptions)) and (not (poMainOnly in PaintOptions) or IsMainColumn) then begin AdjustPaintCellRect(PaintInfo, NextColumn); // Paint the cell only if it is in the current window. if PaintInfo.CellRect.Right > Window.Left then begin with PaintInfo do begin // Fill in remaining values in the paint info structure. NodeWidth := DoGetNodeWidth(Node, Column, Canvas); // Not the entire cell is covered by text. Hence we need a running rectangle to follow up. ContentRect := CellRect; // Set up the distance from column border (margin). if BidiMode <> bdLeftToRight then Dec(ContentRect.Right, FMargin) else Inc(ContentRect.Left, FMargin); if ShowCheckImages and IsMainColumn then begin ImageInfo[iiCheck].Index := GetCheckImage(Node); if ImageInfo[iiCheck].Index > -1 then begin AdjustImageBorder(FCheckImages.Height, FCheckImages.Height, BidiMode, VAlign, ContentRect, ImageInfo[iiCheck]); ImageInfo[iiCheck].Ghosted := False; end; end else ImageInfo[iiCheck].Index := -1; if ShowStateImages then begin GetImageIndex(PaintInfo, ikState, iiState, FStateImages); if ImageInfo[iiState].Index > -1 then AdjustImageBorder(FStateImages.Width, FStateImages.Height, BidiMode, VAlign, ContentRect, ImageInfo[iiState]); end else ImageInfo[iiState].Index := -1; if ShowImages then begin GetImageIndex(PaintInfo, ImageKind[vsSelected in Node.States], iiNormal, FImages); if ImageInfo[iiNormal].Index > -1 then AdjustImageBorder(FImages.Width, FImages.Height, BidiMode, VAlign, ContentRect, ImageInfo[iiNormal]); end else ImageInfo[iiNormal].Index := -1; // Take the space for the tree lines into account. if IsMainColumn then AdjustCoordinatesByIndent(PaintInfo, IfThen(toFixedIndent in FOptions.FPaintOptions, 1, IndentSize)); if UseColumns then LimitPaintingToArea(Canvas, CellRect); // Paint the horizontal grid line. if (poGridLines in PaintOptions) and (toShowHorzGridLines in FOptions.FPaintOptions) then begin Canvas.Font.Color := FColors.GridLineColor; if IsMainColumn and (FLineMode = lmBands) then begin if BidiMode = bdLeftToRight then begin DrawDottedHLine(PaintInfo, CellRect.Left + IfThen(toFixedIndent in FOptions.FPaintOptions, 1, IndentSize) * Integer(FIndent), CellRect.Right - 1, CellRect.Bottom - 1); end else begin DrawDottedHLine(PaintInfo, CellRect.Left, CellRect.Right - IfThen(toFixedIndent in FOptions.FPaintOptions, 1, IndentSize) * Integer(FIndent) - 1, CellRect.Bottom - 1); end; end else DrawDottedHLine(PaintInfo, CellRect.Left, CellRect.Right, CellRect.Bottom - 1); Dec(CellRect.Bottom); Dec(ContentRect.Bottom); end; if UseColumns then begin // Paint vertical grid line. // Don't draw if this is the last column and the header is in autosize mode. if (poGridLines in PaintOptions) and (toShowVertGridLines in FOptions.FPaintOptions) and (not (hoAutoResize in FHeader.FOptions) or (Position < TColumnPosition(Count - 1))) then begin if (BidiMode = bdLeftToRight) or not ColumnIsEmpty(Node, Column) then begin Canvas.Font.Color := FColors.GridLineColor; DrawDottedVLine(PaintInfo, CellRect.Top, CellRect.Bottom, CellRect.Right - 1); end; Dec(CellRect.Right); Dec(ContentRect.Right); end; end; // Prepare background and focus rect for the current cell. PrepareCell(PaintInfo, Window.Left, NodeBitmap.Width); {$ifdef DEBUG_VTV}Logger.Watch([lcPaintDetails],'Brush.Color',PaintInfo.Canvas.Brush.Color);{$endif} // Some parts are only drawn for the main column. if IsMainColumn then begin if toShowTreeLines in FOptions.FPaintOptions then PaintTreeLines(PaintInfo, VAlign, IfThen(toFixedIndent in FOptions.FPaintOptions, 1, IndentSize), LineImage); // Show node button if allowed, if there child nodes and at least one of the child // nodes is visible or auto button hiding is disabled. if (toShowButtons in FOptions.FPaintOptions) and (vsHasChildren in Node.States) and not ((vsAllChildrenHidden in Node.States) and (toAutoHideButtons in TreeOptions.FAutoOptions)) then PaintNodeButton(Canvas, Node, Column, CellRect, ButtonX, ButtonY, BidiMode); if ImageInfo[iiCheck].Index > -1 then PaintCheckImage(PaintInfo); end; {$ifdef DEBUG_VTV}Logger.Watch([lcPaintDetails],'Brush.Color',PaintInfo.Canvas.Brush.Color);{$endif} if ImageInfo[iiState].Index > -1 then PaintImage(PaintInfo, iiState, False); if ImageInfo[iiNormal].Index > -1 then PaintImage(PaintInfo, iiNormal, True); {$ifdef DEBUG_VTV}Logger.Watch([lcPaintDetails],'Brush.Color',PaintInfo.Canvas.Brush.Color);{$endif} // Now let descendants or applications draw whatever they want, // but don't draw the node if it is currently being edited. if not ((tsEditing in FStates) and (Node = FFocusedNode) and ((Column = FEditColumn) or not UseColumns)) then DoPaintNode(PaintInfo); {$ifdef DEBUG_VTV}Logger.Watch([lcPaintDetails],'Brush.Color',PaintInfo.Canvas.Brush.Color);{$endif} DoAfterCellPaint(Canvas, Node, Column, CellRect); end; end; // leave after first run if columns aren't used if not UseColumns then Break; end else NextColumn := GetNextVisibleColumn(PaintInfo.Column); SelectClipRgn(PaintInfo.Canvas.Handle, 0); // Stop column loop if there are no further columns in the given window. if (PaintInfo.CellRect.Left >= Window.Right) or (NextColumn = InvalidColumn) then Break; // Move on to next column which might not be the one immediately following the current one // because of auto span feature. PaintInfo.Position := Items[NextColumn].Position; // Move clip rectangle and continue. if coVisible in Items[NextColumn].FOptions then with PaintInfo do begin Items[NextColumn].GetAbsoluteBounds(CellRect.Left, CellRect.Right); CellRect.Bottom := Node.NodeHeight; ContentRect.Bottom := Node.NodeHeight; end; end; end; // This node is finished, notify descendants/application. with PaintInfo do begin DoAfterItemPaint(Canvas, Node, R); // Final touch for this node: mark it if it is the current drop target node. if (Node = FDropTargetNode) and (toShowDropmark in FOptions.FPaintOptions) and (poDrawDropMark in PaintOptions) then DoPaintDropMark(Canvas, Node, R); end; end; with PaintInfo.Canvas do begin if DrawSelectionRect then begin PaintSelectionRectangle(PaintInfo.Canvas, Window.Left, SelectionRect, Rect(0, 0, NodeBitmap.Width, NodeBitmap.Height)); end; {$ifdef DEBUG_VTV}Logger.SendBitmap([lcPaintBitmap],'NodeBitmap ' + IntToStr(PaintInfo.Node^.Index), NodeBitmap);{$endif} {$ifdef DEBUG_VTV}Logger.SendIf([lcPaintDetails, lcHeaderOffset],'TargetRect.Top < Target.Y '+ Logger.RectToStr(TargetRect) +' '+Logger.PointToStr(Target),TargetRect.Top < Target.Y);{$endif} {$ifdef Gtk} //lclheader // This is a brute force fix AKA hack to prevent the header being cleared // when the tree is scrolled (YOffset < 0) and the mouse is over the header // Other widgetsets are not affected because excludecliprect works different (better?) // this must be removed when/if the paint coordinate is modified to be header aware YCorrect := 0; if hoVisible in FHeader.Options then begin if TargetRect.Top < FHeader.Height then YCorrect := FHeader.Height - TargetRect.Top; end; {$ifdef DEBUG_VTV}Logger.SendIf([lcPaintDetails],'YCorrect ' + IntToStr(YCorrect), YCorrect > 0);{$endif} {$endif} // Put the constructed node image onto the target canvas. with TargetRect, NodeBitmap do BitBlt(TargetCanvas.Handle, Left, Top {$ifdef ManualClipNeeded} + YCorrect{$endif}, Width, Height, Canvas.Handle, Window.Left, {$ifdef ManualClipNeeded}YCorrect{$else}0{$endif}, SRCCOPY); end; end; Inc(TargetRect.Top, PaintInfo.Node.NodeHeight); {$ifdef DEBUG_VTV}Logger.SendIf([lcPaintHeader,lcDrag],'Last Node to be painted: '+ IntToStr(PaintInfo.Node^.Index) +' (TargetRect.Top >= MaximumBottom)',TargetRect.Top >= MaximumBottom);{$endif} if TargetRect.Top >= MaximumBottom then begin {$ifdef DEBUG_VTV}Logger.ExitMethod([lcPaintDetails],'PaintNode');{$endif} Break; end; // Keep selection rectangle coordinates in sync. if DrawSelectionRect then OffsetRect(SelectionRect, 0, -PaintInfo.Node.NodeHeight); // Advance to next visible node. PaintInfo.Node := GetNextVisible(PaintInfo.Node, True); {$ifdef DEBUG_VTV}Logger.ExitMethod([lcPaintDetails],'PaintNode');{$endif} end; end; // Erase rest of window not covered by a node. if TargetRect.Top < MaximumBottom then begin {$ifdef DEBUG_VTV}Logger.Watch([lcPaintDetails],'UseBackground',UseBackground);{$endif} {$ifdef DEBUG_VTV}Logger.Watch([lcPaintDetails],'UseColumns',UseColumns);{$endif} // Keep the horizontal target position to determine the selection rectangle offset later (if necessary). BaseOffset := Target.X; Target := TargetRect.TopLeft; R := Rect(TargetRect.Left, 0, TargetRect.Left, MaximumBottom - Target.Y); TargetRect := Rect(0, 0, MaximumRight - Target.X, MaximumBottom - Target.Y); {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'NodeBitmap.Handle',NodeBitmap.Handle);{$endif} NodeBitmap.PixelFormat := pf32Bit; NodeBitmap.Width := TargetRect.Right - TargetRect.Left; NodeBitmap.Height := TargetRect.Bottom - TargetRect.Top; // Make sure the buffer bitmap and target bitmap use the same transformation mode. {$ifndef Gtk} SetMapMode(NodeBitmap.Canvas.Handle, GetMapMode(TargetCanvas.Handle)); {$endif} {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'NodeBitmap.Handle after changing height to background',NodeBitmap.Handle);{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'TargetRect',TargetRect);{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'NodeBitmap Width: %d Height: %d',[NodeBitmap.Width,NodeBitmap.Height]);{$endif} // Call back application/descendants whether they want to erase this area. SetWindowOrgEx(NodeBitmap.Canvas.Handle, Target.X, 0, nil); if not DoPaintBackground(NodeBitmap.Canvas, TargetRect) then begin if UseBackground then begin SetWindowOrgEx(NodeBitmap.Canvas.Handle, 0, 0, nil); if toStaticBackground in TreeOptions.PaintOptions then StaticBackground(FBackground.Bitmap, NodeBitmap.Canvas, Target, TargetRect) else TileBackground(FBackground.Bitmap, NodeBitmap.Canvas, Target, TargetRect); end else begin // Consider here also colors of the columns. if UseColumns then begin with FHeader.FColumns do begin // If there is no content in the tree then the first column has not yet been determined. if FirstColumn = InvalidColumn then begin FirstColumn := GetFirstVisibleColumn; repeat if FirstColumn <> InvalidColumn then begin R.Left := Items[FirstColumn].Left; R.Right := R.Left + Items[FirstColumn].FWidth; if R.Right > TargetRect.Left then Break; FirstColumn := GetNextVisibleColumn(FirstColumn); end; until FirstColumn = InvalidColumn; end else begin R.Left := Items[FirstColumn].Left; R.Right := R.Left + Items[FirstColumn].FWidth; end; NodeBitmap.Canvas.Font.Color := FColors.GridLineColor; while (FirstColumn <> InvalidColumn) and (R.Left < TargetRect.Right + Target.X) do begin if (poGridLines in PaintOptions) and (toFullVertGridLines in FOptions.FPaintOptions) and (toShowVertGridLines in FOptions.FPaintOptions) and (not (hoAutoResize in FHeader.FOptions) or (Cardinal(FirstColumn) < TColumnPosition(Count - 1))) then begin DrawDottedVLine(PaintInfo, R.Top, R.Bottom, R.Right - 1); Dec(R.Right); end; if not (coParentColor in Items[FirstColumn].FOptions) then NodeBitmap.Canvas.Brush.Color := Items[FirstColumn].FColor else NodeBitmap.Canvas.Brush.Color := Brush.Color; NodeBitmap.Canvas.FillRect(R); FirstColumn := GetNextVisibleColumn(FirstColumn); if FirstColumn <> InvalidColumn then begin R.Left := Items[FirstColumn].Left; R.Right := R.Left + Items[FirstColumn].FWidth; end; end; // Erase also the part of the tree not covert by a column. if R.Right < TargetRect.Right + Target.X then begin R.Left := R.Right; R.Right := TargetRect.Right + Target.X; // Prevent erasing the last vertical grid line. if (poGridLines in PaintOptions) and (toFullVertGridLines in FOptions.FPaintOptions) and (toShowVertGridLines in FOptions.FPaintOptions) and (not (hoAutoResize in FHeader.FOptions)) then Inc(R.Left); NodeBitmap.Canvas.Brush.Color := Brush.Color; NodeBitmap.Canvas.FillRect(R); end; end; SetWindowOrgEx(NodeBitmap.Canvas.Handle, 0, 0, nil); end else begin {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'ErasingBackGround');{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'TargetRect',TargetRect);{$endif} // No columns nor bitmap background. Simply erase it with the tree color. SetWindowOrgEx(NodeBitmap.Canvas.Handle, 0, 0, nil); NodeBitmap.Canvas.Brush.Color := Brush.Color; NodeBitmap.Canvas.FillRect(TargetRect); end; end; end; SetWindowOrgEx(NodeBitmap.Canvas.Handle, 0, 0, nil); {$ifdef DEBUG_VTV}Logger.Watch([lcPaintDetails],'DrawSelectionRect',DrawSelectionRect);{$endif} if DrawSelectionRect then begin R := OrderRect(FNewSelRect); // Remap the selection rectangle to the current window of the tree. // Since Target has been used for other tasks BaseOffset got the left extent of the target position here. OffsetRect(R, -Target.X + BaseOffset - Window.Left, -Target.Y + FOffsetY); //todo: see if is necessary {$ifndef INCOMPLETE_WINAPI} SetBrushOrgEx(NodeBitmap.Canvas.Handle, 0, Target.X and 1, nil); {$endif} PaintSelectionRectangle(NodeBitmap.Canvas, 0, R, TargetRect); end; {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'NodeBitmap.Canvas.Height',NodeBitmap.Canvas.Height);{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'NodeBitmap.Canvas.ClipRect',NodeBitmap.Canvas.ClipRect);{$endif} {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'Target',Target);{$endif} {$ifdef DEBUG_VTV}Logger.SendBitmap([lcPaintBitmap],'BackGroundBitmap',NodeBitmap);{$endif} with Target, NodeBitmap do BitBlt(TargetCanvas.Handle, X, Y, Width, Height, Canvas.Handle, 0, 0, SRCCOPY); end; finally NodeBitmap.Canvas.Unlock; NodeBitmap.Free; end; DoAfterPaint(TargetCanvas); finally DoStateChange([], [tsPainting]); end; end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcPaint],'PaintTree');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.PasteFromClipboard: Boolean; // Reads what is currently on the clipboard into the tree (if the format is supported). // Note: If the application wants to have text or special formats to be inserted then it must implement // its own code (OLE). Here only the native tree format is accepted. var Data: IDataObject; Source: TBaseVirtualTree; begin Result := False; if not (toReadOnly in FOptions.FMiscOptions) then begin if OleGetClipboard(Data) <> S_OK then ShowError(SClipboardFailed, hcTFClipboardFailed) else try // Try to get the source tree of the operation to optimize the operation. Source := GetTreeFromDataObject(Data); Result := ProcessOLEData(Source, Data, FFocusedNode, FDefaultPasteMode, Assigned(Source) and (tsCutPending in Source.FStates)); if Assigned(Source) then if Source <> Self then Source.FinishCutOrCopy else DoStateChange([], [tsCutPending]); finally Data := nil; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.PrepareDragImage(Hotspot: TPoint; const DataObject: IDataObject); // Initiates an image drag operation. Hotspot is the position of the mouse in client coordinates. var PaintOptions: TVTInternalPaintOptions; TreeRect, PaintRect: TRect; LocalSpot, ImagePos, PaintTarget: TPoint; Image: TBitmap; begin if CanShowDragImage then begin // Determine the drag rectangle which is a square around the hot spot. Operate in virtual tree space. LocalSpot := HotSpot; Dec(LocalSpot.X, -FEffectiveOffsetX); Dec(LocalSpot.Y, FOffsetY); TreeRect := Rect(LocalSpot.X - FDragWidth div 2, LocalSpot.Y - FDragHeight div 2, LocalSpot.X + FDragWidth div 2, LocalSpot.Y + FDragHeight div 2); // Check that we have a valid rectangle. with TreeRect do begin PaintRect := TreeRect; //lclheader if hoVisible in FHeader.Options then OffsetRect(PaintRect, 0, -FHeader.Height); if Left < 0 then begin PaintTarget.X := -Left; PaintRect.Left := 0; end else PaintTarget.X := 0; if Top < 0 then begin PaintTarget.Y := -PaintRect.Top; PaintRect.Top := 0; end else PaintTarget.Y := 0; end; Image := TBitmap.Create; with Image do try PixelFormat := pf32Bit; Width := TreeRect.Right - TreeRect.Left; Height := TreeRect.Bottom - TreeRect.Top; // Erase the entire image with the color key value, for the case not everything // in the image is covered by the tree image. Canvas.Brush.Color := Brush.Color; Canvas.FillRect(Rect(0, 0, Width, Height)); PaintOptions := [poDrawSelection, poSelectedOnly]; if FDragImageKind = diMainColumnOnly then Include(PaintOptions, poMainOnly); PaintTree(Image.Canvas, PaintRect, PaintTarget, PaintOptions); // Once we have got the drag image we can convert all necessary coordinates into screen space. OffsetRect(TreeRect, -FEffectiveOffsetX, FOffsetY); ImagePos := ClientToScreen(TreeRect.TopLeft); HotSpot := ClientToScreen(HotSpot); FDragImage.ColorKey := Brush.Color; FDragImage.PrepareDrag(Image, ImagePos, HotSpot, DataObject); finally Image.Free; end; end; end; //---------------------------------------------------------------------------------------------------------------------- {$ifdef EnablePrint} procedure TBaseVirtualTree.Print(Printer: TPrinter; PrintHeader: Boolean); var SaveTreeFont: TFont; // Remembers the tree's current font. SaveHeaderFont: TFont; // Remembers the header's current font. ImgRect, // Describes the dimensions of Image. TreeRect, // The total VTree dimensions. DestRect, // Dimensions of PrinterImage. SrcRect: TRect; // Clip dimensions from Image -> PrinterImage P: TPoint; // Used by PaintTree. Options: TVTInternalPaintOptions; // Used by PaintTree. Image, // Complete Tree is drawn to this image. PrinterImage: TBitmap; // This is the image that gets printed. SaveColor: TColor; // Remembers the VTree Color. pTxtHeight, // Height of font in the TPrinter.Canvas vTxtHeight, // Height of font in the VTree Canvas vPageWidth, vPageHeight, // Printer height in VTree resolution xPageNum, yPageNum, // # of pages (except the occasional last one) xPage, yPage: Integer; // Loop counter Scale: Extended; // Scale factor between Printer Canvas and VTree Canvas LogFont: TLogFont; begin if Assigned(Printer) then begin BeginUpdate; // Grid lines are the only parts which are desirable when printing. Options := [poGridLines]; // Remember the tree font. SaveTreeFont := TFont.Create; SaveTreeFont.Assign(Font); // Create a new font for printing which does not use clear type output (but is antialiased, if possible) // and which has the highest possible quality. GetObject(Font.Handle, SizeOf(TLogFont), @LogFont); LogFont.lfQuality := ANTIALIASED_QUALITY; Font.Handle := CreateFontIndirect(LogFont); // Create an image that will hold the complete VTree Image := TBitmap.Create; Image.PixelFormat := pf32Bit; PrinterImage := nil; try TreeRect := GetTreeRect; Image.Width := TreeRect.Right - TreeRect.Left; P := Point(0, 0); if (hoVisible in FHeader.Options) and PrintHeader then begin Inc(TreeRect.Bottom, FHeader.Height); Inc(P.Y, FHeader.Height); end; Image.Height := TreeRect.Bottom - TreeRect.Top; ImgRect.Left := 0; ImgRect.Top := 0; ImgRect.Right := Image.Width; // Force the background to white color during the rendering. SaveColor := Color; Color := clWhite; // Print header if it is visible. if (hoVisible in FHeader.Options) and PrintHeader then begin SaveHeaderFont := TFont.Create; try SaveHeaderFont.Assign(FHeader.Font); // Create a new font for printing which does not use clear type output (but is antialiased, if possible) // and which has the highest possible quality. GetObject(FHeader.Font.Handle, SizeOf(TLogFont), @LogFont); LogFont.lfQuality := ANTIALIASED_QUALITY; FHeader.Font.Handle := CreateFontIndirect(LogFont); ImgRect.Bottom := FHeader.Height; FHeader.FColumns.PaintHeader(Image.Canvas.Handle, ImgRect, 0); FHeader.Font := SaveHeaderFont; finally SaveHeaderFont.Free; end; end; // The image's height is already adjusted for the header if it is visible. ImgRect.Bottom := Image.Height; PaintTree(Image.Canvas, ImgRect, P, Options, pf32Bit); Color := SaveColor; // Activate the printer Printer.BeginDoc; Printer.Canvas.Font := Font; // Now we can calculate the scaling : pTxtHeight := Printer.Canvas.TextHeight('Tj'); vTxtHeight := Canvas.TextHeight('Tj'); Scale := pTxtHeight / vTxtHeight; // Create an Image that has the same dimensions as the printer canvas but // scaled to the VTree resolution: PrinterImage := TBitmap.Create; vPageHeight := Round(Printer.PageHeight / Scale); vPageWidth := Round(Printer.PageWidth / Scale); // We do a minumum of one page. xPageNum := Trunc(Image.Width / vPageWidth); yPageNum := Trunc(Image.Height / vPageHeight); PrinterImage.Width := vPageWidth; PrinterImage.Height := vPageHeight; // Split vertically: for yPage := 0 to yPageNum do begin DestRect.Left := 0; DestRect.Top := 0; DestRect.Right := PrinterImage.Width; DestRect.Bottom := PrinterImage.Height; // Split horizontally: for xPage := 0 to xPageNum do begin SrcRect.Left := vPageWidth * xPage; SrcRect.Top := vPageHeight * yPage; SrcRect.Right := vPageWidth * xPage + PrinterImage.Width; SrcRect.Bottom := SrcRect.Top + vPageHeight; // Clear the image PrinterImage.Canvas.Brush.Color := clWhite; PrinterImage.Canvas.FillRect(Rect(0, 0, PrinterImage.Width, PrinterImage.Height)); PrinterImage.Canvas.CopyRect(DestRect, Image.Canvas, SrcRect); PrtStretchDrawDIB(Printer.Canvas, Rect(0, 0, Printer.PageWidth, Printer.PageHeight - 1), PrinterImage); if xPage <> xPageNum then Printer.NewPage; end; if yPage <> yPageNum then Printer.NewPage; end; // Restore tree font. Font := SaveTreeFont; SaveTreeFont.Free; Printer.EndDoc; finally PrinterImage.Free; Image.Free; EndUpdate; end; end; end; {$endif} //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.ProcessDrop(DataObject: IDataObject; TargetNode: PVirtualNode; var Effect: LongWord; Mode: TVTNodeAttachMode): Boolean; // Recreates the (sub) tree structure serialized into memory and provided by DataObject. The new nodes are attached to // the passed node or FRoot if TargetNode is nil. // Returns True on success, i.e. the CF_VIRTUALTREE format is supported by the data object and the structure could be // recreated, otherwise False. var Source: TBaseVirtualTree; begin Result := False; if Mode = amNoWhere then Effect := DROPEFFECT_NONE else begin BeginUpdate; // try to get the source tree of the operation Source := GetTreeFromDataObject(DataObject); if Assigned(Source) then Source.BeginUpdate; try try // Before adding the new nodes try to optimize the operation if source and target tree reside in // the same application and operation is a move. if ((Effect and DROPEFFECT_MOVE) <> 0) and Assigned(Source) then begin // If both copy and move are specified then prefer a copy because this is not destructing. Result := ProcessOLEData(Source, DataObject, TargetNode, Mode, (Effect and DROPEFFECT_COPY) = 0); // Since we made an optimized move or a copy there's no reason to act further after DoDragging returns. Effect := DROPEFFECT_NONE; end else // Act only if move or copy operation is requested. if (Effect and (DROPEFFECT_MOVE or DROPEFFECT_COPY)) <> 0 then Result := ProcessOLEData(Source, DataObject, TargetNode, Mode, False) else Result := False; except Effect := DROPEFFECT_NONE; end; finally if Assigned(Source) then Source.EndUpdate; EndUpdate; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.ReinitChildren(Node: PVirtualNode; Recursive: Boolean); // Forces all child nodes of Node to be reinitialized. // If Recursive is True then also the grandchildren are reinitialized. var Run: PVirtualNode; begin if Assigned(Node) then begin InitChildren(Node); Run := Node.FirstChild; end else begin InitChildren(FRoot); Run := FRoot.FirstChild; end; while Assigned(Run) do begin ReinitNode(Run, Recursive); Run := Run.NextSibling; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.ReinitNode(Node: PVirtualNode; Recursive: Boolean); // Forces the given node and all its children (if recursive is True) to be initialized again without // modifying any data in the nodes nor deleting children (unless the application requests a different amount). begin if Assigned(Node) and (Node <> FRoot) then begin // Remove dynamic styles. Node.States := Node.States - [vsChecking, vsCutOrCopy, vsDeleting, vsHeightMeasured]; InitNode(Node); end; if Recursive then ReinitChildren(Node, True); end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.RepaintNode(Node: PVirtualNode); // Causes an immediate repaint of the given node. var R: Trect; begin if Assigned(Node) and (Node <> FRoot) then begin R := GetDisplayRect(Node, -1, False); RedrawWindow(Handle, @R, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_NOERASE or RDW_VALIDATE or RDW_NOCHILDREN); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.ResetNode(Node: PVirtualNode); // Deletes all children of the given node and marks it as being uninitialized. begin DoCancelEdit; if (Node = nil) or (Node = FRoot) then Clear else begin DoReset(Node); DeleteChildren(Node); // Remove initialized and other dynamic styles, keep persistent styles. Node.States := Node.States - [vsInitialized, vsChecking, vsCutOrCopy, vsDeleting, vsHasChildren, vsExpanded, vsHeightMeasured]; InvalidateNode(Node); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SaveToFile(const FileName: TFileName); // Saves the entire content of the tree into a file (see further notes in SaveToStream). var FileStream: TFileStream; begin FileStream := TFileStream.Create(FileName, fmCreate); try SaveToStream(FileStream); finally FileStream.Free; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SaveToStream(Stream: TStream; Node: PVirtualNode = nil); // Saves Node and all its children to Stream. If Node is nil then all top level nodes will be stored. // Note: You should be careful about assuming what is actually saved. The problem here is that we are dealing with // virtual data. The tree can so not know what it has to save. The only fact we reliably know is the tree's // structure. To be flexible for future enhancements as well as unknown content (unknown to the tree class which // is saving/loading the stream) a chunk based approach is used here. Every tree class handles only those // chunks which are not handled by an anchestor class and are known by the class. // // The base tree class saves only the structure of the tree along with application provided data. descendants may // optionally add their own chunks to store additional information. See: WriteChunks. var Count: Cardinal; begin Stream.Write(MagicID, SizeOf(MagicID)); if Node = nil then begin // Keep number of top level nodes for easy restauration. Count := FRoot.ChildCount; Stream.WriteBuffer(Count, SizeOf(Count)); // Save entire tree here. Node := FRoot.FirstChild; while Assigned(Node) do begin WriteNode(Stream, Node); Node := Node.NextSibling; end; end else begin Count := 1; Stream.WriteBuffer(Count, SizeOf(Count)); WriteNode(Stream, Node); end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.ScrollIntoView(Node: PVirtualNode; Center: Boolean; Horizontally: Boolean = False): Boolean; // Scrolls the tree so that the given node is in the client area and returns True if the tree really has been // scrolled (e.g. to avoid further updates) else returns False. If extened focus is enabled then the tree will also // be horizontally scrolled if needed. // Note: All collapsed parents of the node are expanded. var R: TRect; Run: PVirtualNode; UseColumns, HScrollBarVisible: Boolean; ScrolledVertically, ScrolledHorizontally: Boolean; OffY, OffYM: Integer; begin //todo: minimize calls to ClientHeight and ClientWidth ScrolledVertically := False; ScrolledHorizontally := False; if Assigned(Node) and (Node <> FRoot) then begin // Make sure all parents of the node are expanded. Run := Node.Parent; while Run <> FRoot do begin if not (vsExpanded in Run.States) then ToggleNode(Run); Run := Run.Parent; end; UseColumns := FHeader.UseColumns; if UseColumns and FHeader.FColumns.IsValidColumn(FFocusedColumn) then R := GetDisplayRect(Node, FFocusedColumn, not (toGridExtensions in FOptions.FMiscOptions)) else R := GetDisplayRect(Node, NoColumn, not (toGridExtensions in FOptions.FMiscOptions)); // The returned rectangle can never be empty after the expand code above. // 1) scroll vertically //lclheader if hoVisible in FHeader.FOptions then OffsetRect(R, 0, -FHeader.Height); if R.Top < 0 then begin if Center then SetOffsetY(FOffsetY - R.Top + ClientHeight div 2) else SetOffsetY(FOffsetY - R.Top); ScrolledVertically := True; end else if (R.Bottom > ClientHeight) or Center then begin HScrollBarVisible := (ScrollBarOptions.ScrollBars in [ssBoth, ssHorizontal]) and (ScrollBarOptions.AlwaysVisible or (Integer(FRangeX) > ClientWidth)); if Center then SetOffsetY(FOffsetY - R.Bottom + ClientHeight div 2) else begin // Leave additional space at the bottom to have scrollrect start with full row. OffY := FOffsetY - R.Bottom + ClientHeight; OffYM := OffY mod DefaultNodeHeight; if OffYM <> 0 then OffY := OffY - (DefaultNodeHeight + OffYM); SetOffsetY(OffY); end; // When scrolling up and the horizontal scroll appears because of the operation // then we have to move up the node the horizontal scrollbar's height too // in order to avoid that the scroll bar hides the node which we wanted to have in view. if not UseColumns and not HScrollBarVisible and (Integer(FRangeX) > ClientWidth) then SetOffsetY(FOffsetY - GetSystemMetrics(SM_CYHSCROLL)); ScrolledVertically := True; end; if Horizontally then // 2) scroll horizontally ScrolledHorizontally := ScrollIntoView(FFocusedColumn, Center); end; Result := ScrolledVertically or ScrolledHorizontally; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.ScrollIntoView(Column: TColumnIndex; Center: Boolean): Boolean; // Scrolls the columns so that the given column is in the client area and returns True if the columns really have been // scrolled (e.g. to avoid further updates) else returns False. var ColumnLeft, ColumnRight: Integer; NewOffset: Integer; begin Result := False; if not FHeader.UseColumns then exit; if not FHeader.Columns.IsValidColumn(Column) then exit; // Just in case. ColumnLeft := Header.Columns.Items[Column].Left; ColumnRight := ColumnLeft + Header.Columns.Items[Column].Width; NewOffset := FEffectiveOffsetX; if Center then begin NewOffset := FEffectiveOffsetX + ColumnLeft - (Header.Columns.GetVisibleFixedWidth div 2) - (ClientWidth div 2) + ((ColumnRight - ColumnLeft) div 2); if NewOffset <> FEffectiveOffsetX then begin if UseRightToLeftAlignment then SetOffsetX(-Integer(FRangeX) + ClientWidth + NewOffset) else SetOffsetX(-NewOffset); end; Result := True; end else begin if FHeader.Columns.Count > 1 then begin if ColumnRight > ClientWidth then NewOffset := FEffectiveOffsetX + (ColumnRight - ClientWidth) else if ColumnLeft < Header.Columns.GetVisibleFixedWidth then NewOffset := FEffectiveOffsetX - (Header.Columns.GetVisibleFixedWidth - ColumnLeft); end; if NewOffset <> FEffectiveOffsetX then begin if UseRightToLeftAlignment then SetOffsetX(-Integer(FRangeX) + ClientWidth + NewOffset) else SetOffsetX(-NewOffset); end; Result := True; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SelectAll(VisibleOnly: Boolean); // Select all nodes in the tree. // If VisibleOnly is True then only visible nodes are selected. var Run: PVirtualNode; NextFunction: TGetNextNodeProc; begin if not FSelectionLocked and (toMultiSelect in FOptions.FSelectionOptions) then begin ClearTempCache; if VisibleOnly then begin Run := GetFirstVisible(nil, True); NextFunction := GetNextVisible; end else begin Run := GetFirst; NextFunction := GetNext; end; while Assigned(Run) do begin if not(vsSelected in Run.States) then InternalCacheNode(Run); Run := NextFunction(Run); end; if FTempNodeCount > 0 then AddToSelection(FTempNodeCache, FTempNodeCount); ClearTempCache; Invalidate; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.Sort(Node: PVirtualNode; Column: TColumnIndex; Direction: TSortDirection; DoInit: Boolean = True); // Sorts the given node. The application is queried about how to sort via the OnCompareNodes event. // Column is simply passed to the the compare function so the application can also sort in a particular column. // In order to free the application from taking care about the sort direction the parameter Direction is used. // This way the application can always sort in increasing order, while this method reorders nodes according to this flag. //--------------- local functions ------------------------------------------- function MergeAscending(A, B: PVirtualNode): PVirtualNode; // Merges A and B (which both must be sorted via Compare) into one list. var Dummy: TVirtualNode; begin // This avoids checking for Result = nil in the loops. Result := @Dummy; while Assigned(A) and Assigned(B) do begin if DoCompare(A, B, Column) <= 0 then begin Result.NextSibling := A; Result := A; A := A.NextSibling; end else begin Result.NextSibling := B; Result := B; B := B.NextSibling; end; end; // Just append the list which is not nil (or set end of result list to nil if both lists are nil). if Assigned(A) then Result.NextSibling := A else Result.NextSibling := B; // return start of the new merged list Result := Dummy.NextSibling; end; //--------------------------------------------------------------------------- function MergeDescending(A, B: PVirtualNode): PVirtualNode; // Merges A and B (which both must be sorted via Compare) into one list. var Dummy: TVirtualNode; begin // this avoids checking for Result = nil in the loops Result := @Dummy; while Assigned(A) and Assigned(B) do begin if DoCompare(A, B, Column) >= 0 then begin Result.NextSibling := A; Result := A; A := A.NextSibling; end else begin Result.NextSibling := B; Result := B; B := B.NextSibling; end; end; // Just append the list which is not nil (or set end of result list to nil if both lists are nil). if Assigned(A) then Result.NextSibling := A else Result.NextSibling := B; // Return start of the newly merged list. Result := Dummy.NextSibling; end; //--------------------------------------------------------------------------- function MergeSortAscending(var Node: PVirtualNode; N: Cardinal): PVirtualNode; // Sorts the list of nodes given by Node (which must not be nil). var A, B: PVirtualNode; begin if N > 1 then begin A := MergeSortAscending(Node, N div 2); B := MergeSortAscending(Node, (N + 1) div 2); Result := MergeAscending(A, B); end else begin Result := Node; Node := Node.NextSibling; Result.NextSibling := nil; end; end; //--------------------------------------------------------------------------- function MergeSortDescending(var Node: PVirtualNode; N: Cardinal): PVirtualNode; // Sorts the list of nodes given by Node (which must not be nil). var A, B: PVirtualNode; begin if N > 1 then begin A := MergeSortDescending(Node, N div 2); B := MergeSortDescending(Node, (N + 1) div 2); Result := MergeDescending(A, B); end else begin Result := Node; Node := Node.NextSibling; Result.NextSibling := nil; end; end; //--------------- end local functions --------------------------------------- var Run: PVirtualNode; Index: Cardinal; begin InterruptValidation; if tsEditPending in FStates then begin KillTimer(Handle, EditTimer); DoStateChange([], [tsEditPending]); end; if not (tsEditing in FStates) or DoEndEdit then begin if Node = nil then Node := FRoot; if vsHasChildren in Node.States then begin if (Node.ChildCount = 0) and DoInit then InitChildren(Node); // Make sure the children are valid, so they can be sorted at all. if DoInit and (Node.ChildCount > 0) then ValidateChildren(Node, False); // Child count might have changed. if Node.ChildCount > 1 then begin // Sort the linked list, check direction flag only once. if Direction = sdAscending then Node.FirstChild := MergeSortAscending(Node.FirstChild, Node.ChildCount) else Node.FirstChild := MergeSortDescending(Node.FirstChild, Node.ChildCount); // Consolidate the child list finally. Run := Node.FirstChild; Run.PrevSibling := nil; Index := 0; repeat Run.Index := Index; Inc(Index); if Run.NextSibling = nil then Break; Run.NextSibling.PrevSibling := Run; Run := Run.NextSibling; until False; Node.LastChild := Run; InvalidateCache; end; if FUpdateCount = 0 then begin ValidateCache; Invalidate; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.SortTree(Column: TColumnIndex; Direction: TSortDirection; DoInit: Boolean = True); //--------------- local function -------------------------------------------- procedure DoSort(Node: PVirtualNode); // Recursively sorts Node and its child nodes. var Run: PVirtualNode; begin Sort(Node, Column, Direction, DoInit); Run := Node.FirstChild; while Assigned(Run) do begin if DoInit and not (vsInitialized in Run.States) then InitNode(Run); if vsInitialized in Run.States then DoSort(Run); Run := Run.NextSibling; end; end; //--------------- end local function ---------------------------------------- begin // Instead of wrapping the sort using BeginUpdate/EndUpdate simply the update counter // is modified. Otherwise the EndUpdate call will recurse here. Inc(FUpdateCount); try if Column > InvalidColumn then DoSort(FRoot); InvalidateCache; finally if FUpdateCount > 0 then Dec(FUpdateCount); if FUpdateCount = 0 then begin ValidateCache; Invalidate; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.ToggleNode(Node: PVirtualNode); // Changes a node's expand state to the opposite state. var Child: PVirtualNode; HeightDelta, StepsR1, StepsR2, Steps: Integer; TogglingTree, ChildrenInView, NeedFullInvalidate, NeedUpdate, NodeInView, PosHoldable, TotalFit: Boolean; ToggleData: TToggleAnimationData; //--------------- local functions ------------------------------------------- procedure UpdateRanges; // This function is used to adjust FRangeX/FRangeY in order to correctly // reflect the tree's state after a toggle, because it is essential that // these values are correct if we need to scroll afterwards. To avoid a // useless call to UpdateScrollbars we do it right here. begin if FRoot.TotalHeight < FDefaultNodeHeight then FRoot.TotalHeight := FDefaultNodeHeight; FRangeY := FRoot.TotalHeight - FRoot.NodeHeight + FBottomSpace; if FHeader.UseColumns then FRangeX := FHeader.FColumns.TotalWidth else FRangeX := GetMaxRightExtend; end; //--------------------------------------------------------------------------- procedure PrepareAnimation; // Prepares ToggleData. var R: TRect; S: Integer; M: TToggleAnimationMode; begin with ToggleData do begin Window := Handle; DC := GetDC(Handle); //lcl: setting Color to Brush seems not necessary //Self.Brush.Color := Color; Brush := Self.Brush.Reference.Handle; if (Mode1 <> tamNoScroll) and (Mode2 <> tamNoScroll) then begin if StepsR1 < StepsR2 then begin // As the primary rectangle is always R1 we will get a much smoother // animation if R1 is the one that will be scrolled more. R := R2; R2 := R1; R1 := R; M := Mode2; Mode2 := Mode1; Mode1 := M; S := StepsR2; StepsR2 := StepsR1; StepsR1 := S; end; ScaleFactor := StepsR2 / StepsR1; MissedSteps := 0; end; if Mode1 <> tamNoScroll then Steps := StepsR1 else Steps := StepsR2; end; end; //--------------- end local functions --------------------------------------- begin Assert(Assigned(Node), 'Node must not be nil.'); TogglingTree := tsToggling in FStates; ChildrenInView := False; HeightDelta := 0; NeedFullInvalidate := False; NeedUpdate := False; NodeInView := False; PosHoldable := False; TotalFit := False; // We don't need to switch the expand state if the node is being deleted otherwise some // updates (e.g. visible node count) are done twice with disasterous results). if [vsDeleting, vsToggling] * Node.States = [] then begin try DoStateChange([tsToggling]); Include(Node.States, vsToggling); if vsExpanded in Node.States then begin if DoCollapsing(Node) then begin NeedUpdate := True; if (FUpdateCount = 0) and (toAnimatedToggle in FOptions.FAnimationOptions) and not (tsCollapsing in FStates) then begin Application.CancelHint; UpdateWindow(Handle); // animated collapsing with ToggleData do begin // Determine the animation behaviour and rectangle. If toChildrenAbove is set, the behaviour is depending // on the position of the node to be collapsed. R1 := GetDisplayRect(Node, NoColumn, False); Mode2 := tamNoScroll; HeightDelta := -Node.TotalHeight + NodeHeight[Node]; if toChildrenAbove in FOptions.FPaintOptions then begin PosHoldable := (FOffsetY + (Integer(Node.TotalHeight - NodeHeight[Node]))) <= 0; NodeInView := R1.Top < ClientHeight; StepsR1 := 0; if NodeInView then begin if PosHoldable or not (toAdvancedAnimatedToggle in FOptions.FAnimationOptions) then begin // Scroll the child nodes down. Mode1 := tamScrollDown; R1.Bottom := R1.Top; R1.Top := 0; StepsR1 := Min(R1.Bottom - R1.Top + 1, Node.TotalHeight - NodeHeight[Node]); end else begin // The position cannot be kept. So scroll the node up to its future position. Mode1 := tamScrollUp; R1.Top := Max(0, R1.Top + HeightDelta); R1.Bottom := ClientHeight; StepsR1 := FOffsetY - HeightDelta; end; end; end else begin if (Integer(FRangeY) + FOffsetY - R1.Bottom + HeightDelta >= ClientHeight - R1.Bottom) or (Integer(FRangeY) <= ClientHeight) or (FOffsetY = 0) or not (toAdvancedAnimatedToggle in FOptions.FAnimationOptions) then begin // Do a simple scroll up over the child nodes. Mode1 := tamScrollUp; Inc(R1.Top, NodeHeight[Node]); R1.Bottom := ClientHeight; StepsR1 := Min(R1.Bottom - R1.Top + 1, -HeightDelta); end else begin // Scroll the node down to its future position. As FOffsetY will change we need to invalidate the // whole tree. Mode1 := tamScrollDown; StepsR1 := Min(-FOffsetY, ClientHeight - Integer(FRangeY) -FOffsetY - HeightDelta); R1.Top := 0; R1.Bottom := Min(ClientHeight, R1.Bottom + Steps); NeedFullInvalidate := True; end; end; // No animation necessary if the node is below the current client height. if R1.Top < ClientHeight then begin PrepareAnimation; try Animate(Steps, FAnimationDuration, ToggleCallback, @ToggleData); finally ReleaseDC(Window, DC); end; end; end; end; // collapse the node AdjustTotalHeight(Node, NodeHeight[Node]); if FullyVisible[Node] then Dec(FVisibleCount, CountVisibleChildren(Node)); Exclude(Node.States, vsExpanded); DoCollapsed(Node); // Remove child nodes now, if enabled. if (toAutoFreeOnCollapse in FOptions.FAutoOptions) and (Node.ChildCount > 0) then begin DeleteChildren(Node); Include(Node.States, vsHasChildren); end; end; end else if DoExpanding(Node) then begin NeedUpdate := True; // expand the node, need to adjust the height if not (vsInitialized in Node.States) then InitNode(Node); if (vsHasChildren in Node.States) and (Node.ChildCount = 0) then InitChildren(Node); // Avoid setting the vsExpanded style if there are no child nodes. if Node.ChildCount > 0 then begin // Iterate through the child nodes without initializing them. We have to determine the entire height. Child := Node.FirstChild; repeat if vsVisible in Child.States then Inc(HeightDelta, Child.TotalHeight); Child := Child.NextSibling; until Child = nil; // Getting the display rectangle is already done here as it is needed for toChildrenAbove in any case. if (toChildrenAbove in FOptions.FPaintOptions) or (FUpdateCount = 0) then begin with ToggleData do begin R1 := GetDisplayRect(Node, NoColumn, False); Mode2 := tamNoScroll; TotalFit := HeightDelta + Integer(NodeHeight[Node]) <= ClientHeight; if toChildrenAbove in FOptions.FPaintOptions then begin // The main goal with toChildrenAbove being set is to keep the nodes visual position so the user does // not get confused. Therefore we need to scroll the view when the expanding is done. PosHoldable := TotalFit and (Integer(FRangeY) - ClientHeight >= 0) ; ChildrenInView := (R1.Top - HeightDelta) >= 0; NodeInView := R1.Bottom <= ClientHeight; end else begin PosHoldable := TotalFit; ChildrenInView := R1.Bottom + HeightDelta <= ClientHeight; end; R1.Bottom := ClientHeight; end; end; if FUpdateCount = 0 then begin // Do animated expanding if enabled. if (ToggleData.R1.Top < ClientHeight) and ([tsPainting, tsExpanding] * FStates = []) and (toAnimatedToggle in FOptions.FAnimationOptions)then begin Application.CancelHint; UpdateWindow(Handle); // animated expanding with ToggleData do begin if toChildrenAbove in FOptions.FPaintOptions then begin // At first check if we hold the position, which is the most common case. if not (toAdvancedAnimatedToggle in FOptions.FAnimationOptions) or (PosHoldable and ( (NodeInView and ChildrenInView) or not (toAutoScrollOnExpand in FOptions.FAutoOptions) )) then begin Mode1 := tamScrollUp; R1 := Rect(R1.Left, 0, R1.Right, R1.Top); StepsR1 := Min(HeightDelta, R1.Bottom); end else begin // If we will not hold the node's visual position we mostly scroll in both directions. Mode1 := tamScrollDown; Mode2 := tamScrollUp; R2 := Rect(R1.Left, 0, R1.Right, R1.Top); if not (toAutoScrollOnExpand in FOptions.FAutoOptions) then begin // If we shall not or cannot scroll to the desired extent we calculate the new position (with // max FOffsetY applied) and animate it that way. StepsR1 := -FOffsetY - Max(Integer(FRangeY) + HeightDelta - ClientHeight, 0) + HeightDelta; if (Integer(FRangeY) + HeightDelta - ClientHeight) <= 0 then Mode2 := tamNoScroll else StepsR2 := Min(Integer(FRangeY) + HeightDelta - ClientHeight, R2.Bottom); end else begin if TotalFit and NodeInView and (Integer(FRangeY) + HeightDelta > ClientHeight) then begin // If the whole subtree will fit into the client area and the node is currently fully visible, // the first child will be made the top node if possible. if HeightDelta >= R1.Top then StepsR1 := Abs(R1.Top - HeightDelta) else StepsR1 := ClientHeight - Integer(FRangeY); end else if Integer(FRangeY) + HeightDelta <= ClientHeight then begin // We cannot make the first child the top node as we cannot scroll to that extent, // so we do a simple scroll down. Mode2 := tamNoScroll; StepsR1 := HeightDelta; end else // If the subtree does not fit into the client area at once, the expanded node will // be made the bottom node. StepsR1 := ClientHeight - R1.Top - Integer(NodeHeight[Node]); if Mode2 <> tamNoScroll then begin if StepsR1 > 0 then StepsR2 := Min(R1.Top, HeightDelta - StepsR1) else begin // If the node is already at the bottom scrolling is needed. Mode1 := tamNoScroll; StepsR2 := Min(HeightDelta, R1.Bottom); end; end; end; end; end else begin // toChildrenAbove is not set. if (PosHoldable and ChildrenInView) or not (toAutoScrollOnExpand in FOptions.FAutoOptions) or not (toAdvancedAnimatedToggle in FOptions.FAnimationOptions) or (R1.Top <= 0) then begin // If the node will stay at its visual position, do a simple down-scroll. Mode1 := tamScrollDown; Inc(R1.Top, NodeHeight[Node]); StepsR1 := Min(R1.Bottom - R1.Top, HeightDelta); end else begin // We will not hold the nodes visual position so perform a double scroll. Mode1 := tamScrollUp; Mode2 := tamScrollDown; R1.Bottom := R1.Top + Integer(NodeHeight[Node]) + 1; R1.Top := 0; R2 := Rect(R1.Left, R1.Bottom, R1.Right, ClientHeight); StepsR1 := Min(HeightDelta - (ClientHeight - R2.Top), R1.Bottom - Integer(NodeHeight[Node])); StepsR2 := ClientHeight - R2.Top; end; end; if ClientHeight >= R1.Top then begin PrepareAnimation; try Animate(Steps, FAnimationDuration, ToggleCallback, @ToggleData); finally ReleaseDC(Window, DC); end; end; end; end; end; Include(Node.States, vsExpanded); AdjustTotalHeight(Node, HeightDelta, True); if FullyVisible[Node] then Inc(FVisibleCount, CountVisibleChildren(Node)); DoExpanded(Node); end; end; if NeedUpdate then begin InvalidateCache; if FUpdateCount = 0 then begin ValidateCache; if Node.ChildCount > 0 then begin UpdateRanges; if [tsPainting, tsExpanding] * FStates = [] then begin if (vsExpanded in Node.States) and ((toAutoScrollOnExpand in FOptions.FAutoOptions) or (toChildrenAbove in FOptions.FPaintOptions)) then begin if toChildrenAbove in FOptions.FPaintOptions then begin NeedFullInvalidate := True; if (PosHoldable and ChildrenInView and NodeInView) or not (toAutoScrollOnExpand in FOptions.FAutoOptions) then SetOffsetY(FOffsetY - Integer(HeightDelta)) else if TotalFit and NodeInView then SetOffsetY(FOffsetY - GetDisplayRect(GetFirstVisible(Node, True), NoColumn, False).Top) else BottomNode := Node; end else begin // Scroll as much child nodes into view as possible if the node has been expanded. if PosHoldable then NeedFullInvalidate := ScrollIntoView(GetLastVisible(Node, True), False) else begin TopNode := Node; NeedFullInvalidate := True; end; end; end else begin // If we have collapsed the node or toAutoScrollOnExpand is not set, we try to keep the nodes // visual position. if toChildrenAbove in FOptions.FPaintOptions then SetOffsetY(FOffsetY - Integer(HeightDelta)); NeedFullInvalidate := True; end; end; UpdateScrollbars(True); // Check for automatically scrolled tree. if NeedFullInvalidate then Invalidate else InvalidateToBottom(Node); end else InvalidateNode(Node); end else UpdateRanges; end; finally Exclude(Node.States, vsToggling); if not TogglingTree then DoStateChange([], [tsToggling]); end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TBaseVirtualTree.UpdateAction(Action: TBasicAction): Boolean; // Support for standard actions. begin if not Focused then Result := inherited UpdateAction(Action) else begin Result := (Action is TEditCut) or (Action is TEditCopy) or (Action is TEditDelete); if Result then TAction(Action).Enabled := (FSelectionCount > 0) and ((Action is TEditDelete) or (FClipboardFormats.Count > 0)) else begin Result := Action is TEditPaste; if Result then TAction(Action).Enabled := True else begin Result := Action is TEditSelectAll; if Result then TAction(Action).Enabled := (toMultiSelect in FOptions.FSelectionOptions) and (FVisibleCount > 0) else Result := inherited UpdateAction(Action); end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.UpdateHorizontalScrollBar(DoRepaint: Boolean); var ScrollInfo: TScrollInfo; begin if FHeader.UseColumns then FRangeX := FHeader.FColumns.TotalWidth else FRangeX := GetMaxRightExtend; if tsUpdating in FStates then exit; // Adjust effect scroll offset depending on bidi mode. if UseRightToLeftAlignment then FEffectiveOffsetX := Integer(FRangeX) - ClientWidth + FOffsetX else FEffectiveOffsetX := -FOffsetX; if FScrollBarOptions.ScrollBars in [ssHorizontal, ssBoth] then begin FillChar(ScrollInfo, SizeOf(ScrollInfo), 0); //LCL automatically set cbSize field //ScrollInfo.cbSize := SizeOf(ScrollInfo); ScrollInfo.fMask := SIF_ALL; {$ifdef UseFlatScrollbars} FlatSB_GetScrollInfo(Handle, SB_HORZ, ScrollInfo); {$else} GetScrollInfo(Handle, SB_HORZ, ScrollInfo); {$endif UseFlatScrollbars} if (Integer(FRangeX) > ClientWidth) or FScrollBarOptions.AlwaysVisible then begin DoShowScrollBar(SB_HORZ, True); ScrollInfo.nMin := 0; ScrollInfo.nMax := FRangeX; ScrollInfo.nPos := FEffectiveOffsetX; ScrollInfo.nPage := Max(0, ClientWidth); ScrollInfo.fMask := SIF_ALL or ScrollMasks[FScrollBarOptions.AlwaysVisible]; {$ifdef UseFlatScrollbars} FlatSB_SetScrollInfo(Handle, SB_HORZ, ScrollInfo, DoRepaint); {$else} SetScrollInfo(Handle, SB_HORZ, ScrollInfo, DoRepaint); {$endif UseFlatScrollbars} end else begin ScrollInfo.nMin := 0; ScrollInfo.nMax := 0; ScrollInfo.nPos := 0; ScrollInfo.nPage := 0; DoShowScrollBar(SB_HORZ, False); {$ifdef UseFlatScrollbars} FlatSB_SetScrollInfo(Handle, SB_HORZ, ScrollInfo, False); {$else} SetScrollInfo(Handle, SB_HORZ, ScrollInfo, False); {$endif UseFlatScrollbars} end; // Since the position is automatically changed if it doesn't meet the range // we better read the current position back to stay synchronized. {$ifdef UseFlatScrollbars} FEffectiveOffsetX := FlatSB_GetScrollPos(Handle, SB_HORZ); {$else} //todo: Use get scrollinfo instead of GetScrollPos?? FEffectiveOffsetX := GetScrollPos(Handle, SB_HORZ); {$endif UseFlatScrollbars} if UseRightToLeftAlignment then SetOffsetX(-Integer(FRangeX) + ClientWidth + FEffectiveOffsetX) else SetOffsetX(-FEffectiveOffsetX); end else begin DoShowScrollBar(SB_HORZ, False); // Reset the current horizontal offset to account for window resize etc. SetOffsetX(FOffsetX); end; {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'FEffectiveOffsetX after UpdateHScrollbar',FEffectiveOffsetX);{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.UpdateScrollBars(DoRepaint: Boolean); // adjusts scrollbars to reflect current size and paint offset of the tree begin if HandleAllocated then begin UpdateVerticalScrollBar(DoRepaint); UpdateHorizontalScrollBar(DoRepaint); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.UpdateVerticalScrollBar(DoRepaint: Boolean); var ScrollInfo: TScrollInfo; begin // Total node height includes the height of the invisible root node. if FRoot.TotalHeight < FDefaultNodeHeight then FRoot.TotalHeight := FDefaultNodeHeight; FRangeY := FRoot.TotalHeight - FRoot.NodeHeight + FBottomSpace; if tsUpdating in FStates then exit; if FScrollBarOptions.ScrollBars in [ssVertical, ssBoth] then begin //LCL automatically set cbSize field //ScrollInfo.cbSize := SizeOf(ScrollInfo); ScrollInfo.fMask := SIF_ALL; {$ifdef UseFlatScrollbars} FlatSB_GetScrollInfo(Handle, SB_VERT, ScrollInfo); {$else} GetScrollInfo(Handle, SB_VERT, ScrollInfo); {$endif UseFlatScrollbars} if (Integer(FRangeY) > ClientHeight) or FScrollBarOptions.AlwaysVisible then begin DoShowScrollBar(SB_VERT, True); ScrollInfo.nMin := 0; ScrollInfo.nMax := FRangeY; ScrollInfo.nPos := -FOffsetY; ScrollInfo.nPage := Max(0, ClientHeight); ScrollInfo.fMask := SIF_ALL or ScrollMasks[FScrollBarOptions.AlwaysVisible]; {$ifdef UseFlatScrollbars} FlatSB_SetScrollInfo(Handle, SB_VERT, ScrollInfo, DoRepaint); {$else} SetScrollInfo(Handle, SB_VERT, ScrollInfo, DoRepaint); {$endif UseFlatScrollbars} end else begin ScrollInfo.nMin := 0; ScrollInfo.nMax := 0; ScrollInfo.nPos := 0; ScrollInfo.nPage := 0; DoShowScrollBar(SB_VERT, False); {$ifdef UseFlatScrollbars} FlatSB_SetScrollInfo(Handle, SB_VERT, ScrollInfo, False); {$else} SetScrollInfo(Handle, SB_VERT, ScrollInfo, False); {$endif UseFlatScrollbars} end; // Since the position is automatically changed if it doesn't meet the range // we better read the current position back to stay synchronized. {$ifdef UseFlatScrollbars} SetOffsetY(-FlatSB_GetScrollPos(Handle, SB_VERT)); {$else} SetOffsetY(-GetScrollPos(Handle, SB_VERT)); {$endif UseFlatScrollBars} end else begin DoShowScrollbar(SB_VERT, False); // Reset the current vertical offset to account for window resize etc. SetOffsetY(FOffsetY); end; end; //---------------------------------------------------------------------------------------------------------------------- //lcl: the current implementation in TControl is exactly equal to this. // disable for now and reenable in the case the TControl implementation change { function TBaseVirtualTree.UseRightToLeftReading: Boolean; // The tree can handle right-to-left reading also on non-middle-east systems, so we cannot use the same function as // it is implemented in TControl. begin Result := BiDiMode <> bdLeftToRight; end; } //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.ValidateChildren(Node: PVirtualNode; Recursive: Boolean); // Ensures that the children of the given node (and all their children, if Recursive is True) are initialized. // Node must already be initialized var Child: PVirtualNode; begin if Node = nil then Node := FRoot; if (vsHasChildren in Node.States) and (Node.ChildCount = 0) then InitChildren(Node); Child := Node.FirstChild; while Assigned(Child) do begin ValidateNode(Child, Recursive); Child := Child.NextSibling; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.ValidateNode(Node: PVirtualNode; Recursive: Boolean); // Ensures that the given node (and all its children, if Recursive is True) are initialized. var Child: PVirtualNode; begin if Node = nil then Node := FRoot else if not (vsInitialized in Node.States) then InitNode(Node); if Recursive then begin if (vsHasChildren in Node.States) and (Node.ChildCount = 0) then InitChildren(Node); Child := Node.FirstChild; while Assigned(Child) do begin ValidateNode(Child, recursive); Child := Child.NextSibling; end; end; end; //----------------- TCustomStringTreeOptions --------------------------------------------------------------------------- constructor TCustomStringTreeOptions.Create(AOwner: TBaseVirtualTree); begin inherited; FStringOptions := DefaultStringOptions; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomStringTreeOptions.SetStringOptions(const Value: TVTStringOptions); var ChangedOptions: TVTStringOptions; begin if FStringOptions <> Value then begin // Exclusive ORing to get all entries wich are in either set but not in both. ChangedOptions := FStringOptions + Value - (FStringOptions * Value); FStringOptions := Value; with FOwner do if (toShowStaticText in ChangedOptions) and not (csLoading in ComponentState) and HandleAllocated then Invalidate; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomStringTreeOptions.AssignTo(Dest: TPersistent); begin if Dest is TCustomStringTreeOptions then begin with TCustomStringTreeOptions(Dest) do StringOptions := Self.StringOptions; end; // Let ancestors assign their options to the destination class. inherited; end; //----------------- TVTEdit -------------------------------------------------------------------------------------------- // Implementation of a generic node caption editor. constructor TVTEdit.Create(Link: TStringEditLink); begin inherited Create(nil); ShowHint := False; ParentShowHint := False; // This assignment increases the reference count for the interface. FRefLink := Link; // This reference is used to access the link. FLink := Link; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTEdit.CMAutoAdjust(var Message: TLMessage); begin AutoAdjustSize; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTEdit.CMExit(var Message: TLMessage); begin if Assigned(FLink) and not FLink.FStopping then with FLink, FTree do begin if (toAutoAcceptEditChange in TreeOptions.StringOptions) then DoEndEdit else DoCancelEdit; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTEdit.CNCommand(var Message: TLMCommand); begin if Assigned(FLink) and Assigned(FLink.FTree) and (Message.NotifyCode = EN_UPDATE) and not (toGridExtensions in FLink.FTree.FOptions.FMiscOptions) and not (vsMultiline in FLink.FNode.States) then // Instead directly calling AutoAdjustSize it is necessary on Win9x/Me to decouple this notification message // and eventual resizing. Hence we use a message to accomplish that. if IsWinNT then AutoAdjustSize else PostMessage(Handle, CM_AUTOADJUST, 0, 0); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTEdit.DoRelease(Data: PtrInt); begin Free; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTEdit.WMChar(var Message: TLMChar); begin if not (Message.CharCode in [VK_ESCAPE, VK_TAB]) then inherited; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTEdit.WMDestroy(var Message: TLMDestroy); begin // If editing stopped by other means than accept or cancel then we have to do default processing for // pending changes. if Assigned(FLink) and not FLink.FStopping then begin with FLink, FTree do begin if (toAutoAcceptEditChange in TreeOptions.StringOptions) and Modified then Text[FNode, FColumn] := FEdit.Text; end; FLink := nil; FRefLink := nil; end; inherited; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTEdit.WMGetDlgCode(var Message: TLMNoParams); begin inherited; Message.Result := Message.Result or DLGC_WANTALLKEYS or DLGC_WANTTAB or DLGC_WANTARROWS; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTEdit.WMKeyDown(var Message: TLMKeyDown); // Handles some control keys. var Shift: TShiftState; EndEdit: Boolean; Tree: TBaseVirtualTree; begin case Message.CharCode of VK_ESCAPE: begin Tree := FLink.FTree; FLink.FTree.DoCancelEdit; Tree.SetFocus; end; VK_RETURN: begin EndEdit := not (vsMultiline in FLink.FNode.States); if not EndEdit then begin // If a multiline node is being edited the finish editing only if Ctrl+Enter was pressed, // otherwise allow to insert line breaks into the text. Shift := KeyDataToShiftState(Message.KeyData); EndEdit := ssCtrlOS in Shift; end; if EndEdit then begin Tree := FLink.FTree; FLink.FTree.InvalidateNode(FLink.FNode); FLink.FTree.DoEndEdit; Tree.SetFocus; end; end; VK_UP: begin if not (vsMultiline in FLink.FNode.States) then Message.CharCode := VK_LEFT; inherited; end; VK_DOWN: begin if not (vsMultiline in FLink.FNode.States) then Message.CharCode := VK_RIGHT; inherited; end; else inherited; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTEdit.AutoAdjustSize; // Changes the size of the edit to accomodate as much as possible of its text within its container window. // NewChar describes the next character which will be added to the edit's text. var DC: HDC; Size: TSize; LastFont: THandle; begin if not (vsMultiline in FLink.FNode.States) then begin DC := GetDC(Handle); LastFont := SelectObject(DC, Font.Reference.Handle); try // Read needed space for the current text. GetTextExtentPoint32(DC, PChar(Text), Length(Text), Size); Inc(Size.cx, 2 * FLink.FTree.FTextMargin); // Repaint associated node if the edit becomes smaller. if Size.cx < Width then FLink.FTree.InvalidateNode(FLink.FNode); if FLink.FAlignment = taRightJustify then FLink.SetBounds(Rect(Left + Width - Size.cx, Top, Left + Width, Top + Height)) else FLink.SetBounds(Rect(Left, Top, Left + Size.cx, Top + Height)); finally SelectObject(DC, LastFont); ReleaseDC(Handle, DC); end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTEdit.CreateParams(var Params: TCreateParams); begin inherited; // Only with multiline style we can use the text formatting rectangle. // This does not harm formatting as single line control, if we don't use word wrapping. with Params do begin //todo: delphi uses Multiline for all //Style := Style or ES_MULTILINE; if vsMultiline in FLink.FNode.States then begin Style := Style and not (ES_AUTOHSCROLL or WS_HSCROLL) or WS_VSCROLL or ES_AUTOVSCROLL; Style := Style or ES_MULTILINE; end; if tsUseThemes in FLink.FTree.FStates then begin Style := Style and not WS_BORDER; ExStyle := ExStyle or WS_EX_CLIENTEDGE; end else begin Style := Style or WS_BORDER; ExStyle := ExStyle and not WS_EX_CLIENTEDGE; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTEdit.Release; begin if HandleAllocated then Application.QueueAsyncCall(DoRelease, 0); end; //----------------- TStringEditLink ------------------------------------------------------------------------------------ constructor TStringEditLink.Create; begin inherited; FEdit := TVTEdit.Create(Self); with FEdit do begin Visible := False; BorderStyle := bsSingle; AutoSize := False; end; end; //---------------------------------------------------------------------------------------------------------------------- destructor TStringEditLink.Destroy; begin FEdit.Release; inherited; end; //---------------------------------------------------------------------------------------------------------------------- function TStringEditLink.BeginEdit: Boolean; // Notifies the edit link that editing can start now. descendants may cancel node edit // by returning False. begin Result := not FStopping; if Result then begin FEdit.Show; FEdit.SelectAll; FEdit.SetFocus; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TStringEditLink.SetEdit(const Value: TVTEdit); begin if Assigned(FEdit) then FEdit.Free; FEdit := Value; end; //---------------------------------------------------------------------------------------------------------------------- function TStringEditLink.CancelEdit: Boolean; begin Result := not FStopping; if Result then begin FStopping := True; FEdit.Hide; FTree.CancelEditNode; FEdit.FLink := nil; FEdit.FRefLink := nil; end; end; //---------------------------------------------------------------------------------------------------------------------- function TStringEditLink.EndEdit: Boolean; begin Result := not FStopping; if Result then try FStopping := True; if FEdit.Modified then FTree.Text[FNode, FColumn] := FEdit.Text; FEdit.Hide; FEdit.FLink := nil; FEdit.FRefLink := nil; except FStopping := False; raise; end; end; //---------------------------------------------------------------------------------------------------------------------- function TStringEditLink.GetBounds: TRect; begin Result := FEdit.BoundsRect; end; //---------------------------------------------------------------------------------------------------------------------- function TStringEditLink.PrepareEdit(Tree: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex): Boolean; // Retrieves the true text bounds from the owner tree. var Text: String; begin Result := Tree is TCustomVirtualStringTree; if Result then begin FTree := Tree as TCustomVirtualStringTree; FNode := Node; FColumn := Column; // Initial size, font and text of the node. FTree.GetTextInfo(Node, Column, FEdit.Font, FTextBounds, Text); FEdit.Font.Color := clWindowText; FEdit.Parent := Tree; FEdit.HandleNeeded; FEdit.Text := Text; if Column <= NoColumn then begin FEdit.BidiMode := FTree.BidiMode; FAlignment := FTree.Alignment; end else begin FEdit.BidiMode := FTree.Header.Columns[Column].BidiMode; FAlignment := FTree.Header.Columns[Column].Alignment; end; if FEdit.BidiMode <> bdLeftToRight then ChangeBidiModeAlignment(FAlignment); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TStringEditLink.ProcessMessage(var Message: TLMessage); begin FEdit.WindowProc(Message); end; //---------------------------------------------------------------------------------------------------------------------- procedure TStringEditLink.SetBounds(R: TRect); // Sets the outer bounds of the edit control and the actual edit area in the control. var Offset: Integer; begin if not FStopping then begin with R do begin // Set the edit's bounds but make sure there's a minimum width and the right border does not // extend beyond the parent's left/right border. if Left < 0 then Left := 0; if Right - Left < 30 then begin if FAlignment = taRightJustify then Left := Right - 30 else Right := Left + 30; end; if Right > FTree.ClientWidth then Right := FTree.ClientWidth; FEdit.BoundsRect := R; // The selected text shall exclude the text margins and be centered vertically. // We have to take out the two pixel border of the edit control as well as a one pixel "edit border" the // control leaves around the (selected) text. R := FEdit.ClientRect; Offset := 2; if tsUseThemes in FTree.FStates then Inc(Offset); InflateRect(R, -FTree.FTextMargin + Offset, Offset); if not (vsMultiline in FNode.States) then OffsetRect(R, 0, FTextBounds.Top - FEdit.Top); SendMessage(FEdit.Handle, EM_SETRECTNP, 0, PtrUInt(@R)); end; end; end; //----------------- TCustomVirtualString ------------------------------------------------------------------------------- constructor TCustomVirtualStringTree.Create(AOwner: TComponent); begin inherited; if (Owner = nil) or (([csReading, csDesigning] * Owner.ComponentState) = [csDesigning]) then FDefaultText := 'Node'; FInternalDataOffset := AllocateInternalDataArea(SizeOf(Cardinal)); end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.GetRenderStartValues(Source: TVSTTextSourceType; out Node: PVirtualNode; out NextNodeProc: TGetNextNodeProc); begin case Source of tstInitialized: begin Node := GetFirstInitialized; NextNodeProc := GetNextInitialized; end; tstSelected: begin Node := GetFirstSelected; NextNodeProc := GetNextSelected; end; tstCutCopySet: begin Node := GetFirstCutCopy; NextNodeProc := GetNextCutCopy; end; tstVisible: begin Node := GetFirstVisible(nil, True); NextNodeProc := GetNextVisible; end; else // tstAll Node := GetFirst; NextNodeProc := GetNext; end; end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.GetImageText(Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex): String; begin Assert(Assigned(Node), 'Node must not be nil.'); if not (vsInitialized in Node.States) then InitNode(Node); Result := ''; DoGetImageText(Node, Kind, Column, Result); end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.GetOptions: TCustomStringTreeOptions; begin Result := FOptions as TCustomStringTreeOptions; end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.GetText(Node: PVirtualNode; Column: TColumnIndex): String; begin Assert(Assigned(Node), 'Node must not be nil.'); if not (vsInitialized in Node.States) then InitNode(Node); Result := FDefaultText; DoGetText(Node, Column, ttNormal, Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.InitializeTextProperties(var PaintInfo: TVTPaintInfo); // Initializes default values for customization in PaintNormalText. begin with PaintInfo do begin // Set default font values first. Canvas.Font := Font; if (toHotTrack in FOptions.FPaintOptions) and (Node = FCurrentHotNode) then begin if not IsWinVistaOrAbove or not (tsUseThemes in FStates) or not (toUseExplorerTheme in FOptions.FPaintOptions) then Canvas.Font.Style := Canvas.Font.Style + [fsUnderline]; Canvas.Font.Color := FColors.HotColor; end; // Change the font color only if the node also is drawn in selected style. if poDrawSelection in PaintOptions then begin if (Column = FFocusedColumn) or (toFullRowSelect in FOptions.FSelectionOptions) then begin if Node = FDropTargetNode then begin if (FLastDropMode = dmOnNode) or (vsSelected in Node.States) and (not IsWinVistaOrAbove or not (tsUseThemes in FStates) or not (toUseExplorerTheme in FOptions.FPaintOptions)) then Canvas.Font.Color := clHighlightText; end else if vsSelected in Node.States then begin if (Focused or (toPopupMode in FOptions.FPaintOptions)) and (not IsWinVistaOrAbove or not (tsUseThemes in FStates) or not (toUseExplorerTheme in FOptions.FPaintOptions)) then Canvas.Font.Color := clHighlightText; end; end; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.PaintNormalText(var PaintInfo: TVTPaintInfo; TextOutFlags: Integer; Text: String); // This method is responsible for painting the given text to target canvas (under consideration of the given rectangles). // The text drawn here is considered as the normal text in a node. // Note: NodeWidth is the actual width of the text to be drawn. This does not necessarily correspond to the width of // the node rectangle. The clipping rectangle comprises the entire node (including tree lines, buttons etc.). var TripleWidth: Integer; R: TRect; DrawFormat: Cardinal; Size: TSize; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcPaintDetails],'PaintNormalText') ;{$endif} InitializeTextProperties(PaintInfo); with PaintInfo do begin R := ContentRect; //todo_lcl See how TextStyle should be set //Canvas.TextFlags := 0; // Multiline nodes don't need special font handling or text manipulation. // Note: multiline support requires the Unicode version of DrawText, which is able to do word breaking. // The emulation in this unit does not support this so we have to use the OS version. However // DrawTextW is only available on NT/2000/XP and up. Hence there is only partial multiline support // for 9x/Me. if vsMultiline in Node.States then begin InflateRect(R, -FTextMargin, 0); DoPaintText(Node, Canvas, Column, ttNormal); // Disabled node color overrides all other variants. if (vsDisabled in Node.States) or not Enabled then Canvas.Font.Color := FColors.DisabledColor; // The edit control flag will ensure that no partial line is displayed, that is, only lines // which are (vertically) fully visible are drawn. DrawFormat := DT_NOPREFIX or DT_WORDBREAK or DT_END_ELLIPSIS or DT_EDITCONTROL or AlignmentToDrawFlag[Alignment]; if BidiMode <> bdLeftToRight then DrawFormat := DrawFormat or DT_RTLREADING; end else begin InflateRect(R, -FTextMargin, 0); FFontChanged := False; TripleWidth := FEllipsisWidth; DoPaintText(Node, Canvas, Column, ttNormal); if FFontChanged then begin // If the font has been changed then the ellipsis width must be recalculated. TripleWidth := 0; // Recalculate also the width of the normal text. GetTextExtentPoint32(Canvas.Handle, PChar(Text), Length(Text), Size); NodeWidth := Size.cx + 2 * FTextMargin; end; // Disabled node color overrides all other variants. if (vsDisabled in Node.States) or not Enabled then Canvas.Font.Color := FColors.DisabledColor; DrawFormat := DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE; if BidiMode <> bdLeftToRight then DrawFormat := DrawFormat or DT_RTLREADING; // Check if the text must be shortend. if (Column > -1) and ((NodeWidth - 2 * FTextMargin) > R.Right - R.Left) then begin Text := DoShortenString(Canvas, Node, Column, Text, R.Right - R.Left, TripleWidth); if Alignment = taRightJustify then DrawFormat := DrawFormat or DT_RIGHT else DrawFormat := DrawFormat or DT_LEFT; end else DrawFormat := DrawFormat or AlignmentToDrawFlag[Alignment]; end; //todo_lcl_check if not Canvas.TextStyle.Opaque then SetBkMode(Canvas.Handle, TRANSPARENT) else SetBkMode(Canvas.Handle, OPAQUE); {$ifdef DEBUG_VTV}Logger.Send([lcPaintDetails],'Canvas.Brush.Color',Canvas.Brush.Color);{$endif} DoTextDrawing(PaintInfo, Text, R, DrawFormat); end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcPaintDetails],'PaintNormalText');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.PaintStaticText(const PaintInfo: TVTPaintInfo; TextOutFlags: Integer; const Text: String); // This method retrives and draws the static text bound to a particular node. var R: TRect; DrawFormat: Cardinal; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcPaintDetails],'PaintStaticText');{$endif} with PaintInfo do begin Canvas.Font := Font; if toFullRowSelect in FOptions.FSelectionOptions then begin if Node = FDropTargetNode then begin if (FLastDropMode = dmOnNode) or (vsSelected in Node.States)then Canvas.Font.Color := clHighlightText else Canvas.Font.Color := Font.Color; end else if vsSelected in Node.States then begin if Focused or (toPopupMode in FOptions.FPaintOptions) then Canvas.Font.Color := clHighlightText else Canvas.Font.Color := Font.Color; end; end; DrawFormat := DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE; //todo_lcl See how Canvas.TextStyle should be //Canvas.TextFlags := 0; DoPaintText(Node, Canvas, Column, ttStatic); // Disabled node color overrides all other variants. if (vsDisabled in Node.States) or not Enabled then Canvas.Font.Color := FColors.DisabledColor; R := ContentRect; if Alignment = taRightJustify then Dec(R.Right, NodeWidth + FTextMargin) else Inc(R.Left, NodeWidth + FTextMargin); //todo_lcl_check if not Canvas.TextStyle.Opaque then SetBkMode(Canvas.Handle, TRANSPARENT) else SetBkMode(Canvas.Handle, OPAQUE); DrawText(Canvas.Handle, PChar(Text), Length(Text), R, DrawFormat) end; {$ifdef DEBUG_VTV}Logger.ExitMethod([lcPaintDetails],'PaintStaticText');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.SetDefaultText(const Value: String); begin if FDefaultText <> Value then begin FDefaultText := Value; if not (csLoading in ComponentState) then Invalidate; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.SetOptions(const Value: TCustomStringTreeOptions); begin FOptions.Assign(Value); end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.SetText(Node: PVirtualNode; Column: TColumnIndex; const Value: String); begin DoNewText(Node, Column, Value); InvalidateNode(Node); end; //---------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.CMFontChanged(var Msg: TLMessage); // Whenever a new font is applied to the tree some default values are determined to avoid frequent // determination of the same value. var MemDC: HDC; Run: PVirtualNode; TM: TTextMetric; Size: TSize; Data: PInteger; begin inherited; MemDC := CreateCompatibleDC(0); try SelectObject(MemDC, Font.Reference.Handle); GetTextMetrics(MemDC, TM); FTextHeight := TM.tmHeight; GetTextExtentPoint32(MemDC, '...', 3, Size); FEllipsisWidth := Size.cx; finally DeleteDC(MemDC); end; // Have to reset all node widths. Run := FRoot.FirstChild; while Assigned(Run) do begin Data := InternalData(Run); if Assigned(Data) then Data^ := 0; Run := GetNextNoInit(Run); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.AdjustPaintCellRect(var PaintInfo: TVTPaintInfo; out NextNonEmpty: TColumnIndex); // In the case a node spans several columns (if enabled) we need to determine how many columns. // Note: the autospan feature can only be used with left-to-right layout. begin if (toAutoSpanColumns in FOptions.FAutoOptions) and FHeader.UseColumns and (PaintInfo.BidiMode = bdLeftToRight) then with FHeader.FColumns, PaintInfo do begin // Start with the directly following column. NextNonEmpty := GetNextVisibleColumn(Column); // Auto spanning columns can only be used for left-to-right directionality because the tree is drawn // from left to right. For RTL directionality it would be necessary to draw it from right to left. // While this could be managed, it becomes impossible when directionality is mixed. repeat if (NextNonEmpty = InvalidColumn) or not ColumnIsEmpty(Node, NextNonEmpty) or (Items[NextNonEmpty].BidiMode <> bdLeftToRight) then Break; Inc(CellRect.Right, Items[NextNonEmpty].Width); NextNonEmpty := GetNextVisibleColumn(NextNonEmpty); until False; end else inherited; end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.CalculateTextWidth(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const Text: String): Integer; // Determines the width of the given text. begin Result := 2 * FTextMargin; if Length(Text) > 0 then begin Canvas.Font := Font; DoPaintText(Node, Canvas, Column, ttNormal); Inc(Result, DoTextMeasuring(Canvas, Node, Column, Text)); end; end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.ColumnIsEmpty(Node: PVirtualNode; Column: TColumnIndex): Boolean; // For hit tests it is necessary to consider cases where columns are empty and automatic column spanning is enabled. // This method simply checks the given column's text and if this is empty then the column is considered as being empty. begin Result := Length(Text[Node, Column]) = 0; // If there is no text then let the ancestor decide if the column is to be considered as being empty // (e.g. by asking the application). If there is text then the column is never be considered as being empty. if Result then Result := inherited ColumnIsEmpty(Node, Column); end; //---------------------------------------------------------------------------------------------------------------------- {$ifndef LCLWin32} procedure TCustomVirtualStringTree.CopyToClipBoard; begin if FSelectionCount > 0 then begin MarkCutCopyNodes; DoStateChange([tsCopyPending]); Clipboard.AsText := ContentToUTF8(tstCutCopySet, #9); DoStateChange([], [tsCopyPending]); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.CutToClipBoard; begin //todo: currently there's no way in LCL to know when the clipboard was used CopyToClipBoard; end; {$endif} //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.DoCreateEditor(Node: PVirtualNode; Column: TColumnIndex): IVTEditLink; begin Result := inherited DoCreateEditor(Node, Column); // Enable generic label editing support if the application does not have own editors. if Result = nil then Result := TStringEditLink.Create; end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.DoGetNodeHint(Node: PVirtualNode; Column: TColumnIndex; var LineBreakStyle: TVTTooltipLineBreakStyle): String; begin Result := inherited DoGetNodeHint(Node, Column, LineBreakStyle); if Assigned(FOnGetHint) then FOnGetHint(Self, Node, Column, LineBreakStyle, Result); end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.DoGetNodeTooltip(Node: PVirtualNode; Column: TColumnIndex; var LineBreakStyle: TVTTooltipLineBreakStyle): String; begin Result := inherited DoGetNodeToolTip(Node, Column, LineBreakStyle); if Assigned(FOnGetHint) then FOnGetHint(Self, Node, Column, LineBreakStyle, Result) else Result := Text[Node, Column]; end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.DoGetNodeWidth(Node: PVirtualNode; Column: TColumnIndex; Canvas: TCanvas = nil): Integer; // Returns the text width of the given node in pixels. // This width is stored in the node's data member to increase access speed. var Data: PInteger; begin if (Column > NoColumn) and (vsMultiline in Node.States) then Result := FHeader.Columns[Column].Width else begin if Canvas = nil then Canvas := Self.Canvas; if Column = FHeader.MainColumn then begin // Primary column or no columns. Data := InternalData(Node); if Assigned(Data) then begin Result := Data^; if Result = 0 then begin Data^ := CalculateTextWidth(Canvas, Node, Column, Text[Node, Column]); Result := Data^; end; end else Result := 0; end else // any other column Result := CalculateTextWidth(Canvas, Node, Column, Text[Node, Column]); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.DoGetText(Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var Text: String); begin if Assigned(FOnGetText) then FOnGetText(Self, Node, Column, TextType, Text); end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.DoIncrementalSearch(Node: PVirtualNode; const Text: String): Integer; // Since the string tree has access to node text it can do incremental search on its own. Use the event to // override the default behavior. begin Result := 0; if Assigned(FOnIncrementalSearch) then FOnIncrementalSearch(Self, Node, Text, Result) else // Default behavior is to match the search string with the start of the node text. if Pos(Text, GetText(Node, FocusedColumn)) <> 1 then Result := 1; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.DoNewText(Node: PVirtualNode; Column: TColumnIndex; const Text: String); begin if Assigned(FOnNewText) then FOnNewText(Self, Node, Column, Text); // The width might have changed, so update the scrollbar. if FUpdateCount = 0 then UpdateHorizontalScrollBar(True); end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.DoPaintNode(var PaintInfo: TVTPaintInfo); // Main output routine to print the text of the given node using the space provided in PaintInfo.ContentRect. var S: String; TextOutFlags: Integer; begin {$ifdef DEBUG_VTV}Logger.EnterMethod([lcPaintDetails],'TCustomVirtualStringTree.DoPaintNode');{$endif} // Set a new OnChange event for the canvas' font so we know if the application changes it in the callbacks. // This long winded procedure is necessary because font changes (as well as brush and pen changes) are // unfortunately not announced via the Canvas.OnChange event. RedirectFontChangeEvent(PaintInfo.Canvas); // Determine main text direction as well as other text properties. TextOutFlags := ETO_CLIPPED or RTLFlag[PaintInfo.BidiMode <> bdLeftToRight]; S := Text[PaintInfo.Node, PaintInfo.Column]; // Paint the normal text first... if Length(S) > 0 then PaintNormalText(PaintInfo, TextOutFlags, S); // ... and afterwards the static text if not centered and the node is not multiline enabled. if (Alignment <> taCenter) and not (vsMultiline in PaintInfo.Node.States) and (toShowStaticText in TreeOptions.FStringOptions) then begin S := ''; with PaintInfo do DoGetText(Node, Column, ttStatic, S); if Length(S) > 0 then PaintStaticText(PaintInfo, TextOutFlags, S); end; RestoreFontChangeEvent(PaintInfo.Canvas); {$ifdef DEBUG_VTV}Logger.ExitMethod([lcPaintDetails],'TCustomVirtualStringTree.DoPaintNode');{$endif} end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.DoPaintText(Node: PVirtualNode; const Canvas: TCanvas; Column: TColumnIndex; TextType: TVSTTextType); begin if Assigned(FOnPaintText) then FOnPaintText(Self, Canvas, Node, Column, TextType); end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.DoShortenString(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const S: String; Width: Integer; EllipsisWidth: Integer = 0): String; var Done: Boolean; begin Done := False; if Assigned(FOnShortenString) then FOnShortenString(Self, Canvas, Node, Column, S, Width, Result, Done); if not Done then Result := ShortenString(Canvas.Handle, S, Width, EllipsisWidth); end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.DoTextDrawing(var PaintInfo: TVTPaintInfo; const Text: String; CellRect: TRect; DrawFormat: Cardinal); var DefaultDraw: Boolean; begin DefaultDraw := True; if Assigned(FOnDrawText) then FOnDrawText(Self, PaintInfo.Canvas, PaintInfo.Node, PaintInfo.Column, Text, CellRect, DefaultDraw); if DefaultDraw then DrawText(PaintInfo.Canvas.Handle, PChar(Text), Length(Text), CellRect, DrawFormat); end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.DoTextMeasuring(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const Text: String): Integer; var Size: TSize; R: TRect; DrawFormat: Integer; begin GetTextExtentPoint32(Canvas.Handle, PChar(Text), Length(Text), Size); if vsMultiLine in Node.States then begin DrawFormat := DT_CALCRECT or DT_NOPREFIX or DT_WORDBREAK or DT_END_ELLIPSIS or DT_EDITCONTROL or AlignmentToDrawFlag[Alignment]; if BidiMode <> bdLeftToRight then DrawFormat := DrawFormat or DT_RTLREADING; R := Rect(0, 0, Size.cx, MaxInt); DrawText(Canvas.Handle, PChar(Text), Length(Text), R, DrawFormat); Size.cx := R.Right - R.Left; end; Result := Size.cx; if Assigned(FOnMeasureTextWidth) then FOnMeasureTextWidth(Self, Canvas, Node, Column, Text, Result); end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.GetOptionsClass: TTreeOptionsClass; begin Result := TCustomStringTreeOptions; end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.InternalData(Node: PVirtualNode): Pointer; begin if (Node = FRoot) or (Node = nil) then Result := nil else Result := PByte(Node) + FInternalDataOffset; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.MainColumnChanged; var Run: PVirtualNode; Data: PInteger; begin inherited; // Have to reset all node widths. Run := FRoot.FirstChild; while Assigned(Run) do begin Data := InternalData(Run); if Assigned(Data) then Data^ := 0; Run := GetNextNoInit(Run); end; end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.ReadChunk(Stream: TStream; Version: Integer; Node: PVirtualNode; ChunkType, ChunkSize: Integer): Boolean; // read in the caption chunk if there is one var NewText: String; begin case ChunkType of CaptionChunk: begin NewText := ''; if ChunkSize > 0 then begin SetLength(NewText, ChunkSize); Stream.Read(PChar(NewText)^, ChunkSize); end; // Do a new text event regardless of the caption content to allow removing the default string. Text[Node, FHeader.MainColumn] := NewText; Result := True; end; else Result := inherited ReadChunk(Stream, Version, Node, ChunkType, ChunkSize); end; end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.RenderOLEData(const FormatEtcIn: TFormatEtc; out Medium: TStgMedium; ForClipboard: Boolean): HResult; // Returns string expressions of all currently selected nodes in the Medium structure. begin Result := inherited RenderOLEData(FormatEtcIn, Medium, ForClipboard); if Failed(Result) then try if ForClipboard then Medium.hGlobal := ContentToClipboard(FormatEtcIn.cfFormat, tstCutCopySet) else Medium.hGlobal := ContentToClipboard(FormatEtcIn.cfFormat, tstSelected); // Fill rest of the Medium structure if rendering went fine. if Medium.hGlobal <> 0 then begin Medium.tymed := TYMED_HGLOBAL; Medium.PunkForRelease := nil; Result := S_OK; end; except Result := E_FAIL; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.WriteChunks(Stream: TStream; Node: PVirtualNode); // Adds another sibling chunk for Node storing the label if the node is initialized. // Note: If the application stores a node's caption in the node's data member (which will be quite common) and needs to // store more node specific data then it should use the OnSaveNode event rather than the caption autosave function // (take out soSaveCaption from StringOptions). Otherwise the caption is unnecessarily stored twice. var Header: TChunkHeader; S: String; Len: Integer; begin inherited; if (toSaveCaptions in TreeOptions.FStringOptions) and (Node <> FRoot) and (vsInitialized in Node.States) then with Stream do begin // Read the node's caption (primary column only). S := Text[Node, FHeader.MainColumn]; Len := Length(S); if Len > 0 then begin // Write a new sub chunk. Header.ChunkType := CaptionChunk; Header.ChunkSize := Len; Write(Header, SizeOf(Header)); Write(PChar(S)^, Len); end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.ComputeNodeHeight(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; S: String): Integer; // Default node height calculation for multi line nodes. This method can be used by the application to delegate the // computation to the string tree. // Canvas is used to compute that value by using its current font settings. // Node and Column describe the cell to be used for the computation. // S is the string for which the height must be computed. If this string is empty the cell text is used instead. var DrawFormat: Cardinal; BidiMode: TBidiMode; Alignment: TAlignment; PaintInfo: TVTPaintInfo; Dummy: TColumnIndex; LineImage: TLineImage; begin if Length(S) = 0 then S := Text[Node, Column]; DrawFormat := DT_TOP or DT_NOPREFIX or DT_CALCRECT or DT_WORDBREAK; if Column <= NoColumn then begin BidiMode := Self.BidiMode; Alignment := Self.Alignment; end else begin BidiMode := Header.Columns[Column].BidiMode; Alignment := Header.Columns[Column].Alignment; end; if BidiMode <> bdLeftToRight then ChangeBidiModeAlignment(Alignment); // Allow for autospanning. PaintInfo.Node := Node; PaintInfo.BidiMode := BidiMode; PaintInfo.Column := Column; PaintInfo.CellRect := Rect(0, 0, 0, 0); if Column > NoColumn then begin PaintInfo.CellRect.Right := FHeader.Columns[Column].Width - FTextMargin; PaintInfo.CellRect.Left := FTextMargin + FMargin; if Column = Header.MainColumn then begin if toFixedIndent in FOptions.FPaintOptions then SetLength(LineImage, 1) else DetermineLineImageAndSelectLevel(Node, LineImage); Inc(PaintInfo.CellRect.Left, Length(LineImage) * Integer(Indent)); end; end else PaintInfo.CellRect.Right := ClientWidth; AdjustPaintCellRect(PaintInfo, Dummy); if BidiMode <> bdLeftToRight then DrawFormat := DrawFormat or DT_RIGHT or DT_RTLREADING else DrawFormat := DrawFormat or DT_LEFT; DrawText(Canvas.Handle, PChar(S), Length(S), PaintInfo.CellRect, DrawFormat); Result := PaintInfo.CellRect.Bottom - PaintInfo.CellRect.Top; end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.ContentToHTML(Source: TVSTTextSourceType; const Caption: String = ''): String; // Renders the current tree content (depending on Source) as HTML text encoded in UTF-8. // If Caption is not empty then it is used to create and fill the header for the table built here. // Based on ideas and code from Frank van den Bergh and Andreas H?rstemeier. var Buffer: TBufferedUTF8String; //--------------------------------------------------------------------------- procedure WriteColorAsHex(Color: TColor); var WinColor: COLORREF; I: Integer; Component, Value: Byte; begin Buffer.Add('#'); WinColor := ColorToRGB(Color); I := 1; while I <= 6 do begin Component := WinColor and $FF; Value := 48 + (Component shr 4); if Value > $39 then Inc(Value, 7); Buffer.Add(AnsiChar(Value)); Inc(I); Value := 48 + (Component and $F); if Value > $39 then Inc(Value, 7); Buffer.Add(AnsiChar(Value)); Inc(I); WinColor := WinColor shr 8; end; end; //--------------------------------------------------------------------------- procedure WriteStyle(const Name: AnsiString; Font: TFont); // Creates a CSS style entry with the given name for the given font. // If Name is empty then the entry is created as inline style. begin if Length(Name) = 0 then Buffer.Add(' style="{font:') else begin Buffer.Add('.'); Buffer.Add(Name); Buffer.Add('{font:'); end; if fsUnderline in Font.Style then Buffer.Add(' underline'); if fsItalic in Font.Style then Buffer.Add(' italic'); if fsBold in Font.Style then Buffer.Add(' bold'); if Font.Size < 0 then Buffer.Add(Format(' %dpx "%s";', [Font.Height, Font.Name])) else Buffer.Add(Format(' %dpt "%s";', [Font.Size, Font.Name])); Buffer.Add('color:'); WriteColorAsHex(Font.Color); Buffer.Add(';}'); if Length(Name) = 0 then Buffer.Add('"'); end; //--------------- end local functions --------------------------------------- var I, J : Integer; Level, MaxLevel: Cardinal; AddHeader: String; Save, Run: PVirtualNode; GetNextNode: TGetNextNodeProc; Text: String; RenderColumns: Boolean; Columns: TColumnsArray; ColumnColors: array of String; Index: Integer; IndentWidth, LineStyleText: String; Alignment: TAlignment; BidiMode: TBidiMode; CellPadding: String; begin Buffer := TBufferedUTF8String.Create; try // For customization by the application or descendants we use again the redirected font change event. RedirectFontChangeEvent(Canvas); CellPadding := Format('padding-left:%dpx;padding-right:%0:dpx;', [FMargin]); IndentWidth := IntToStr(FIndent); AddHeader := ' '; // Add title if adviced so by giving a caption. if Length(Caption) > 0 then AddHeader := AddHeader + 'caption="' + Caption + '"'; if Borderstyle <> bsNone then AddHeader := AddHeader + Format(' border="%d" frame=box', [BorderWidth + 1]); Buffer.Add(''); // Create HTML table based on the tree structure. To simplify formatting we use styles defined in a small CSS area. Buffer.Add(''); Buffer.AddNewLine; // General table properties. Buffer.Add(''); Buffer.AddNewLine; Columns := nil; ColumnColors := nil; RenderColumns := FHeader.UseColumns; if RenderColumns then begin Columns := FHeader.FColumns.GetVisibleColumns; SetLength(ColumnColors, Length(Columns)); end; GetRenderStartValues(Source, Run, GetNextNode); Save := Run; MaxLevel := 0; // The table consists of visible columns and rows as used in the tree, but the main tree column is splitted // into several HTML columns to accomodate the indentation. while Assigned(Run) do begin if (CanExportNode(Run)) then begin Level := GetNodeLevel(Run); if Level > MaxLevel then MaxLevel := Level; end; Run := GetNextNode(Run); end; if RenderColumns then begin if Assigned(FOnBeforeHeaderExport) then FOnBeforeHeaderExport(Self, etHTML); Buffer.Add(''); Buffer.AddNewLine; // Make the first row in the HTML table an image of the tree header. for I := 0 to High(Columns) do begin if Assigned(FOnBeforeColumnExport) then FOnBeforeColumnExport(Self, etHTML, Columns[I]); Buffer.Add(''); if Assigned(FOnAfterColumnExport) then FOnAfterColumnExport(Self, etHTML, Columns[I]); end; Buffer.Add(''); Buffer.AddNewLine; if Assigned(FOnAfterHeaderExport) then FOnAfterHeaderExport(self, etHTML); end; // Now go through the tree. Run := Save; while Assigned(Run) do begin if ((not CanExportNode(Run)) or (Assigned(FonBeforeNodeExport) and (not FOnBeforeNodeExport(Self, etHTML, Run)))) then begin Run := GetNextNode(Run); Continue; end; Level := GetNodeLevel(Run); Buffer.Add(' '); Buffer.AddNewLine; I := 0; while (I < Length(Columns)) or not RenderColumns do begin if RenderColumns then Index := Columns[I].Index else Index := NoColumn; if not RenderColumns or (coVisible in Columns[I].FOptions) then begin // Call back the application to know about font customization. Canvas.Font := Font; FFontChanged := False; DoPaintText(Run, Canvas, Index, ttNormal); if Index = Header.MainColumn then begin // Create a cell for each indentation level. if RenderColumns and not (coParentColor in Columns[I].FOptions) then begin for J := 1 to Level do begin Buffer.Add(''); end; end else begin for J := 1 to Level do if J = 1 then begin Buffer.Add(' '); end else Buffer.Add(' '); end; end; if FFontChanged then begin Buffer.Add(' '); end; if not RenderColumns then Break; Inc(I); end; if Assigned(FOnAfterNodeExport) then FOnAfterNodeExport(Self, etHTML, Run); Run := GetNextNode(Run); Buffer.Add(' '); Buffer.AddNewLine; end; Buffer.Add('
bdLeftToRight then begin ChangeBidiModeAlignment(Alignment); Buffer.Add(' dir="rtl"'); end; // Consider aligment. case Alignment of taRightJustify: Buffer.Add(' align=right'); taCenter: Buffer.Add(' align=center'); else Buffer.Add(' align=left'); end; Index := Columns[I].Index; // Merge cells of the header emulation in the main column. if (MaxLevel > 0) and (Index = Header.MainColumn) then begin Buffer.Add(' colspan="'); Buffer.Add(IntToStr(MaxLevel + 1)); Buffer.Add('"'); end; // The color of the header is usually clBtnFace. Buffer.Add(' bgcolor='); WriteColorAsHex(clBtnFace); // Set column width in pixels. Buffer.Add(' width="'); Buffer.Add(IntToStr(Columns[I].Width)); Buffer.Add('px">'); if Length(Columns[I].Text) > 0 then Buffer.Add(Columns[I].Text); Buffer.Add('
    bdLeftToRight then begin ChangeBidiModeAlignment(Alignment); Buffer.Add(' dir="rtl"'); end; // Consider aligment. case Alignment of taRightJustify: Buffer.Add(' align=right'); taCenter: Buffer.Add(' align=center'); else Buffer.Add(' align=left'); end; // Merge cells in the main column. if (MaxLevel > 0) and (Index = FHeader.MainColumn) and (Level < MaxLevel) then begin Buffer.Add(' colspan="'); Buffer.Add(IntToStr(MaxLevel - Level + 1)); Buffer.Add('"'); end; if RenderColumns and not (coParentColor in Columns[I].FOptions) then begin Buffer.Add(' bgcolor='); WriteColorAsHex(Columns[I].Color); end; Buffer.Add('>'); Text := Self.Text[Run, Index]; if Length(Text) > 0 then Buffer.Add(Text); Buffer.Add('
'); RestoreFontChangeEvent(Canvas); Result := Buffer.AsUTF8String; finally Buffer.Free; end; end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.CanExportNode(Node: PVirtualNode ): Boolean; begin Result := True; case FOptions.ExportMode of emChecked: Result := Node.CheckState = csCheckedNormal; emUnchecked: Result := Node.CheckState = csUncheckedNormal; end; end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.ContentToRTF(Source: TVSTTextSourceType): AnsiString; // Renders the current tree content (depending on Source) as RTF (rich text). // Based on ideas and code from Frank van den Bergh and Andreas H?rstemeier. var Fonts: TStringList; Colors: TFpList; CurrentFontIndex, CurrentFontColor, CurrentFontSize: Integer; Buffer: TBufferedUTF8String; //--------------- local functions ------------------------------------------- procedure SelectFont(Font: string); var I: Integer; begin I := Fonts.IndexOf(Font); if I > -1 then begin // Font has already been used if I <> CurrentFontIndex then begin Buffer.Add('\f'); Buffer.Add(IntToStr(I)); CurrentFontIndex := I; end; end else begin I := Fonts.Add(Font); Buffer.Add('\f'); Buffer.Add(IntToStr(I)); CurrentFontIndex := I; end; end; //--------------------------------------------------------------------------- procedure SelectColor(Color: TColor); var I: Integer; begin I := Colors.IndexOf(Pointer(Color)); if I > -1 then begin // Color has already been used if I <> CurrentFontColor then begin Buffer.Add('\cf'); Buffer.Add(IntToStr(I + 1)); CurrentFontColor := I; end; end else begin I := Colors.Add(Pointer(Color)); Buffer.Add('\cf'); Buffer.Add(IntToStr(I + 1)); CurrentFontColor := I; end; end; //--------------------------------------------------------------------------- procedure TextPlusFont(const Text: String; Font: TFont); var UseUnderline, UseItalic, UseBold: Boolean; I: Integer; WText: UnicodeString; begin if Length(Text) > 0 then begin WText := UTF8Decode(Text); UseUnderline := fsUnderline in Font.Style; if UseUnderline then Buffer.Add('\ul'); UseItalic := fsItalic in Font.Style; if UseItalic then Buffer.Add('\i'); UseBold := fsBold in Font.Style; if UseBold then Buffer.Add('\b'); SelectFont(Font.Name); SelectColor(Font.Color); if Font.Size <> CurrentFontSize then begin // Font size must be given in half points. Buffer.Add('\fs'); Buffer.Add(IntToStr(2 * Font.Size)); CurrentFontSize := Font.Size; end; // Use escape sequences to note Unicode text. Buffer.Add(' '); // Note: Unicode values > 32767 must be expressed as negative numbers. This is implicitly done // by interpreting the wide chars (word values) as small integers. for I := 1 to Length(WText) do begin if (Text[I] = WideLF) then Buffer.Add( '{\par}' ) else if (Text[i] <> WideCR) then begin Buffer.Add(Format('\u%d\''3f', [SmallInt(WText[I])])); Continue; end; end; if UseUnderline then Buffer.Add('\ul0'); if UseItalic then Buffer.Add('\i0'); if UseBold then Buffer.Add('\b0'); end; end; //--------------- end local functions --------------------------------------- var Level, LastLevel: Integer; I, J: Integer; Save, Run: PVirtualNode; GetNextNode: TGetNextNodeProc; S, Tabs : String; Text: String; Twips: Integer; RenderColumns: Boolean; Columns: TColumnsArray; Index: Integer; Alignment: TAlignment; BidiMode: TBidiMode; begin Buffer := TBufferedUTF8String.Create; try // For customization by the application or descendants we use again the redirected font change event. RedirectFontChangeEvent(Canvas); Fonts := TStringList.Create; Colors := TFpList.Create; CurrentFontIndex := -1; CurrentFontColor := -1; CurrentFontSize := -1; Columns := nil; Tabs := ''; LastLevel := 0; RenderColumns := FHeader.UseColumns; if RenderColumns then Columns := FHeader.FColumns.GetVisibleColumns; GetRenderStartValues(Source, Run, GetNextNode); Save := Run; // First make a table structure. The \rtf and other header stuff is included // when the font and color tables are created. Buffer.Add('\uc1\trowd\trgaph70'); J := 0; if RenderColumns then begin for I := 0 to High(Columns) do begin Inc(J, Columns[I].Width); // This value must be expressed in twips (1 inch = 1440 twips). Twips := Round(1440 * J / Screen.PixelsPerInch); Buffer.Add('\cellx'); Buffer.Add(IntToStr(Twips)); end; end else begin Twips := Round(1440 * ClientWidth / Screen.PixelsPerInch); Buffer.Add('\cellx'); Buffer.Add(IntToStr(Twips)); end; // Fill table header. if RenderColumns then begin if Assigned(FOnBeforeHeaderExport) then FonBeforeHeaderExport(Self, etRTF); Buffer.Add('\pard\intbl'); for I := 0 to High(Columns) do begin if Assigned(FOnBeforeColumnExport) then FOnBeforeColumnExport(Self, etRTF, Columns[I]); Alignment := Columns[I].CaptionAlignment; BidiMode := Columns[I].BidiMode; // Alignment is not supported with older RTF formats, however it will be ignored. if BidiMode <> bdLeftToRight then ChangeBidiModeAlignment(Alignment); case Alignment of taRightJustify: Buffer.Add('\qr'); taCenter: Buffer.Add('\qc'); end; TextPlusFont(Columns[I].Text, Header.Font); Buffer.Add('\cell'); if Assigned(FOnAfterColumnExport) then FOnAfterColumnExport( self, etRTF, Columns[I] ); end; Buffer.Add('\row'); if Assigned(FOnAfterHeaderExport) then FOnAfterHeaderExport(Self, etRTF); end; // Now write the contents. Run := Save; while Assigned(Run) do begin if ((not CanExportNode(Run)) or (Assigned(FOnBeforeNodeExport) and (not FOnBeforeNodeExport(Self, etRTF, Run)))) then begin Run := GetNextNode(Run); Continue; end; I := 0; while not RenderColumns or (I < Length(Columns)) do begin if RenderColumns then begin Index := Columns[I].Index; Alignment := Columns[I].Alignment; BidiMode := Columns[I].BidiMode; end else begin Index := NoColumn; Alignment := FAlignment; BidiMode := Self.BidiMode; end; if not RenderColumns or (coVisible in Columns[I].Options) then begin Text := Self.Text[Run, Index]; Buffer.Add('\pard\intbl'); // Alignment is not supported with older RTF formats, however it will be ignored. if BidiMode <> bdLeftToRight then ChangeBidiModeAlignment(Alignment); case Alignment of taRightJustify: Buffer.Add('\qr'); taCenter: Buffer.Add('\qc'); end; // Call back the application to know about font customization. Canvas.Font := Font; FFontChanged := False; DoPaintText(Run, Canvas, Index, ttNormal); if Index = Header.MainColumn then begin Level := GetNodeLevel(Run); if Level <> LastLevel then begin LastLevel := Level; Tabs := ''; for J := 0 to Level - 1 do Tabs := Tabs + '\tab'; end; if Level > 0 then begin Buffer.Add(Tabs); Buffer.Add(' '); TextPlusFont(Text, Canvas.Font); Buffer.Add('\cell'); end else begin TextPlusFont(Text, Canvas.Font); Buffer.Add('\cell'); end; end else begin TextPlusFont(Text, Canvas.Font); Buffer.Add('\cell'); end; end; if not RenderColumns then Break; Inc(I); end; Buffer.Add('\row'); if (Assigned(FOnAfterNodeExport)) then FOnAfterNodeExport(Self, etRTF, Run); Run := GetNextNode(Run); end; Buffer.Add('\pard\par'); // Build lists with fonts and colors. They have to be at the start of the document. S := '{\rtf1\ansi\ansicpg1252\deff0\deflang1043{\fonttbl'; for I := 0 to Fonts.Count - 1 do S := S + Format('{\f%d %s;}', [I, Fonts[I]]); S := S + '}'; S := S + '{\colortbl;'; for I := 0 to Colors.Count - 1 do begin J := ColorToRGB(TColor(Colors[I])); S := S + Format('\red%d\green%d\blue%d;', [J and $FF, (J shr 8) and $FF, (J shr 16) and $FF]); end; S := S + '}'; Result := S + Buffer.AsAnsiString + '}'; Fonts.Free; Colors.Free; RestoreFontChangeEvent(Canvas); finally Buffer.Free; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.ContentToCustom(Source: TVSTTextSourceType); // Generic export procedure which polls the application at every stage of the export. var I: Integer; Save, Run: PVirtualNode; GetNextNode: TGetNextNodeProc; RenderColumns: Boolean; Columns: TColumnsArray; begin Columns := nil; GetRenderStartValues(Source, Run, GetNextNode); Save := Run; RenderColumns := FHeader.UseColumns and ( hoVisible in FHeader.Options ); if Assigned(FOnBeforeTreeExport) then FOnBeforeTreeExport(Self, etCustom); // Fill table header. if RenderColumns then begin if Assigned(FOnBeforeHeaderExport) then FOnBeforeHeaderExport(Self, etCustom); Columns := FHeader.FColumns.GetVisibleColumns; for I := 0 to High(Columns) do begin if Assigned(FOnBeforeColumnExport) then FOnBeforeColumnExport(Self, etCustom, Columns[I]); if Assigned(FOnColumnExport) then FOnColumnExport(Self, etCustom, Columns[I]); if Assigned(FOnAfterColumnExport) then FOnAfterColumnExport(Self, etCustom, Columns[I]); end; if Assigned(FOnAfterHeaderExport) then FOnAfterHeaderExport(Self, etCustom); end; // Now write the content. Run := Save; while Assigned(Run) do begin if CanExportNode(Run) then begin if Assigned(FOnBeforeNodeExport) then FOnBeforeNodeExport(Self, etCustom, Run); if Assigned(FOnNodeExport) then FOnNodeExport(Self, etCustom, Run); if Assigned(FOnAfterNodeExport) then FOnAfterNodeExport(Self, etCustom, Run); end; Run := GetNextNode(Run); end; if Assigned(FOnAfterTreeExport) then FOnAfterTreeExport(Self, etCustom); end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.ContentToAnsi(Source: TVSTTextSourceType; const Separator: String): AnsiString; var Buffer: TBufferedUTF8String; begin Buffer := TBufferedUTF8String.Create; try AddContentToBuffer(Buffer, Source, Separator); finally Result := Buffer.AsAnsiString; Buffer.Destroy; end; end; function TCustomVirtualStringTree.ContentToText(Source: TVSTTextSourceType; const Separator: String): AnsiString; begin Result := ContentToAnsi(Source, Separator); end; function TCustomVirtualStringTree.ContentToUnicode(Source: TVSTTextSourceType; const Separator: String): UnicodeString; begin Result := ContentToUTF16(Source, Separator); end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.AddContentToBuffer(Buffer: TBufferedUTF8String; Source: TVSTTextSourceType; const Separator: String); // Renders the current tree content (depending on Source) as UTF8 text. // If an entry contains the separator char or double quotes then it is wrapped with double quotes // and existing double quotes are duplicated. var RenderColumns: Boolean; Tabs: String; GetNextNode: TGetNextNodeProc; Run, Save: PVirtualNode; Level, MaxLevel: Cardinal; Columns: TColumnsArray; LastColumn: TVirtualTreeColumn; Index, I: Integer; Text: String; begin Columns := nil; RenderColumns := FHeader.UseColumns; if RenderColumns then Columns := FHeader.FColumns.GetVisibleColumns; GetRenderStartValues(Source, Run, GetNextNode); Save := Run; // The text consists of visible groups representing the columns, which are separated by one or more separator // characters. There are always MaxLevel separator chars in a line (main column only). Either before the caption // to ident it or after the caption to make the following column aligned. MaxLevel := 0; while Assigned(Run) do begin Level := GetNodeLevel(Run); If Level > MaxLevel then MaxLevel := Level; Run := GetNextNode(Run); end; Tabs := DupeString(Separator, MaxLevel); // First line is always the header if used. if RenderColumns then begin LastColumn := Columns[High(Columns)]; for I := 0 to High(Columns) do begin Buffer.Add(Columns[I].Text); if Columns[I] <> LastColumn then begin if Columns[I].Index = Header.MainColumn then begin Buffer.Add(Tabs); Buffer.Add(Separator); end else Buffer.Add(Separator); end; end; Buffer.AddNewLine; end else LastColumn := nil; Run := Save; if RenderColumns then begin while Assigned(Run) do begin if (not CanExportNode(Run) or (Assigned(FOnBeforeNodeExport) and (not FOnBeforeNodeExport(Self, etText, Run)))) then begin Run := GetNextNode(Run); Continue; end; for I := 0 to High(Columns) do begin if coVisible in Columns[I].Options then begin Index := Columns[I].Index; // This line implicitly converts the Unicode text to ANSI. Text := Self.Text[Run, Index]; if Index = Header.MainColumn then begin Level := GetNodeLevel(Run); Buffer.Add(Copy(Tabs, 1, Integer(Level) * Length(Separator))); // Wrap the text with quotation marks if it contains the separator character. if (Pos(Separator, Text) > 0) or (Pos('"', Text) > 0) then Buffer.Add(AnsiQuotedStr(Text, '"')) else Buffer.Add(Text); Buffer.Add(Copy(Tabs, 1, Integer(MaxLevel - Level) * Length(Separator))); end else if (Pos(Separator, Text) > 0) or (Pos('"', Text) > 0) then Buffer.Add(AnsiQuotedStr(Text, '"')) else Buffer.Add(Text); if Columns[I] <> LastColumn then Buffer.Add(Separator); end; end; if Assigned(FOnAfterNodeExport) then FOnAfterNodeExport(Self, etText, Run); Run := GetNextNode(Run); Buffer.AddNewLine; end; end else begin while Assigned(Run) do begin if ((not CanExportNode(Run)) or (Assigned(FOnBeforeNodeExport) and (not FOnBeforeNodeExport(Self, etText, Run)))) then begin Run := GetNextNode(Run); Continue; end; // This line implicitly converts the Unicode text to ANSI. Text := Self.Text[Run, NoColumn]; Level := GetNodeLevel(Run); Buffer.Add(Copy(Tabs, 1, Integer(Level) * Length(Separator))); Buffer.Add(Text); Buffer.AddNewLine; if Assigned(FOnAfterNodeExport) then FonAfterNodeExport(Self, etText, Run); Run := GetNextNode(Run); end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.ContentToUTF16(Source: TVSTTextSourceType; const Separator: String): UnicodeString; var Buffer: TBufferedUTF8String; begin Buffer := TBufferedUTF8String.Create; try AddContentToBuffer(Buffer, Source, Separator); finally Result := Buffer.AsUTF16String; Buffer.Destroy; end; end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.ContentToUTF8(Source: TVSTTextSourceType; const Separator: String): String; var Buffer: TBufferedUTF8String; begin Buffer := TBufferedUTF8String.Create; try AddContentToBuffer(Buffer, Source, Separator); finally Result := Buffer.AsUTF8String; Buffer.Destroy; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.GetTextInfo(Node: PVirtualNode; Column: TColumnIndex; const AFont: TFont; var R: TRect; out Text: String); // Returns the font, the text and its bounding rectangle to the caller. R is returned as the closest // bounding rectangle around Text. var NewHeight: Integer; TM: TTextMetric; begin // Get default font and initialize the other parameters. //inherited GetTextInfo(Node, Column, AFont, R, Text); Canvas.Font := AFont; FFontChanged := False; RedirectFontChangeEvent(Canvas); DoPaintText(Node, Canvas, Column, ttNormal); if FFontChanged then begin AFont.Assign(Canvas.Font); GetTextMetrics(Canvas.Handle, TM); NewHeight := TM.tmHeight; end else // Otherwise the correct font is already there and we only need to set the correct height. NewHeight := FTextHeight; RestoreFontChangeEvent(Canvas); // Alignment to the actual text. Text := Self.Text[Node, Column]; R := GetDisplayRect(Node, Column, True, not (vsMultiline in Node.States)); if toShowHorzGridLines in TreeOptions.PaintOptions then Dec(R.Bottom); InflateRect(R, 0, -(R.Bottom - R.Top - NewHeight) div 2); end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.InvalidateNode(Node: PVirtualNode): TRect; var Data: PInteger; begin Result := inherited InvalidateNode(Node); // Reset node width so changed text attributes are applied correctly. if Assigned(Node) then begin Data := InternalData(Node); if Assigned(Data) then Data^ := 0; // Reset height measured flag too to cause a re-issue of the OnMeasureItem event. Exclude(Node.States, vsHeightMeasured); end; end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualStringTree.Path(Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; Delimiter: Char): String; // Constructs a string containing the node and all its parents. The last character in the returned path is always the // given delimiter. var S: String; begin if (Node = nil) or (Node = FRoot) then Result := Delimiter else begin Result := ''; while Node <> FRoot do begin DoGetText(Node, Column, TextType, S); Result := S + Delimiter + Result; Node := Node.Parent; end; end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualStringTree.ReinitNode(Node: PVirtualNode; Recursive: Boolean); var Data: PInteger; begin inherited; // Reset node width so changed text attributes are applied correctly. if Assigned(Node) and (Node <> FRoot) then begin Data := InternalData(Node); if Assigned(Data) then Data^ := 0; // vsHeightMeasured is already removed in the base tree. end; end; //----------------- TVirtualStringTree --------------------------------------------------------------------------------- function TVirtualStringTree.GetOptions: TStringTreeOptions; begin Result := FOptions as TStringTreeOptions; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualStringTree.SetOptions(const Value: TStringTreeOptions); begin FOptions.Assign(Value); end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualStringTree.GetOptionsClass: TTreeOptionsClass; begin Result := TStringTreeOptions; end; //----------------- TCustomVirtualDrawTree ----------------------------------------------------------------------------- procedure TCustomVirtualDrawTree.DoDrawHint(Canvas: TCanvas; Node: PVirtualNode; const R: TRect; Column: TColumnIndex); begin if Assigned(FOnDrawHint) then FOnDrawHint(Self, Canvas, Node, R, Column); end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualDrawTree.DoGetCellContentMargin(Node: PVirtualNode; Column: TColumnIndex; CellContentMarginType: TVTCellContentMarginType = ccmtAllSides; Canvas: TCanvas = nil): TPoint; begin Result := Point(0, 0); if Canvas = nil then Canvas := Self.Canvas; if Assigned(FOnGetCellContentMargin) then FOnGetCellContentMargin(Self, Canvas, Node, Column, CellContentMarginType, Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualDrawTree.DoGetHintSize(Node: PVirtualNode; Column: TColumnIndex; var R: TRect); begin if Assigned(FOnGetHintSize) then FOnGetHintSize(Self, Node, Column, R); end; //---------------------------------------------------------------------------------------------------------------------- function TCustomVirtualDrawTree.DoGetNodeWidth(Node: PVirtualNode; Column: TColumnIndex; Canvas: TCanvas = nil): Integer; begin Result := 2 * FTextMargin; if Canvas = nil then Canvas := Self.Canvas; if Assigned(FOnGetNodeWidth) then FOnGetNodeWidth(Self, Canvas, Node, Column, Result); end; //---------------------------------------------------------------------------------------------------------------------- procedure TCustomVirtualDrawTree.DoPaintNode(var PaintInfo: TVTPaintInfo); begin if Assigned(FOnDrawNode) then FOnDrawNode(Self, PaintInfo); end; //----------------- TVirtualDrawTree ----------------------------------------------------------------------------------- function TVirtualDrawTree.GetOptions: TVirtualTreeOptions; begin Result := FOptions as TVirtualTreeOptions; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVirtualDrawTree.SetOptions(const Value: TVirtualTreeOptions); begin FOptions.Assign(Value); end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualDrawTree.GetOptionsClass: TTreeOptionsClass; begin Result := TVirtualTreeOptions; end; //---------------------------------------------------------------------------------------------------------------------- initialization {$I virtualtrees.lrs} // Necessary for dynamic package loading. Initialized := False; NeedToUnitialize := False; finalization if Initialized then FinalizeGlobalStructures; InternalClipboardFormats.Free; InternalClipboardFormats := nil; {$ifdef EnableAccessible} if VTAccessibleFactory <> nil then begin VTAccessibleFactory.Free; VTAccessibleFactory := nil; end; {$endif} end. doublecmd-0.5.8/components/virtualtreeview/lclconstants.inc0000644000175000017500000000750112014201074023330 0ustar alexxalexx// Message constants that are not defined in LCL WM_APP = $8000; // ExtTextOut Options ETO_RTLREADING = 128; //DrawText options DT_RTLREADING = 131072; // Clipboard constants CF_BITMAP = 2; CF_DIB = 8; CF_PALETTE = 9; CF_ENHMETAFILE = 14; CF_METAFILEPICT = 3; CF_OEMTEXT = 7; CF_TEXT = 1; CF_UNICODETEXT = 13; CF_DIF = 5; CF_DSPBITMAP = 130; CF_DSPENHMETAFILE = 142; CF_DSPMETAFILEPICT = 131; CF_DSPTEXT = 129; CF_GDIOBJFIRST = 768; CF_GDIOBJLAST = 1023; CF_HDROP = 15; CF_LOCALE = 16; CF_OWNERDISPLAY = 128; CF_PENDATA = 10; CF_PRIVATEFIRST = 512; CF_PRIVATELAST = 767; CF_RIFF = 11; CF_SYLK = 4; CF_WAVE = 12; CF_TIFF = 6; CF_MAX = 17; // Win32 colors CLR_NONE = $ffffffff; CLR_DEFAULT = $ff000000; //DrawFrameControl constants DFCS_HOT = $1000; //Thread support //This values is for win32, how about others?? INFINITE = $FFFFFFFF; //OLE Support E_OUTOFMEMORY = HRESULT($8007000E); E_INVALIDARG = HRESULT($80070057); E_NOINTERFACE = HRESULT($80004002); E_POINTER = HRESULT($80004003); E_HANDLE = HRESULT($80070006); E_ABORT = HRESULT($80004004); E_FAIL = HRESULT($80004005); E_ACCESSDENIED = HRESULT($80070005); DV_E_TYMED = HRESULT($80040069); DV_E_CLIPFORMAT = HRESULT($8004006A); DV_E_LINDEX = HRESULT($80040068); DV_E_DVASPECT = HRESULT($8004006B); OLE_E_ADVISENOTSUPPORTED = HRESULT($80040003); OLE_S_USEREG = HRESULT($00040000); DATA_S_SAMEFORMATETC = HRESULT($00040130); DRAGDROP_S_DROP = HRESULT($00040100); DRAGDROP_S_CANCEL = HRESULT($00040101); DRAGDROP_S_USEDEFAULTCURSORS = HRESULT($00040102); NOERROR = 0; SPI_GETDRAGFULLWINDOWS = 38; // windows management SWP_HIDEWINDOW = 128; SWP_SHOWWINDOW = 64; //Imagelists ILD_NORMAL = 0; // Set WindowPos SWP_FRAMECHANGED = 32; SWP_NOOWNERZORDER = 512; SWP_NOSENDCHANGING = 1024; { RedrawWindow } RDW_ERASE = 4; RDW_FRAME = 1024; RDW_INTERNALPAINT = 2; RDW_INVALIDATE = 1; RDW_NOERASE = 32; RDW_NOFRAME = 2048; RDW_NOINTERNALPAINT = 16; RDW_VALIDATE = 8; RDW_ERASENOW = 512; RDW_UPDATENOW = 256; RDW_ALLCHILDREN = 128; RDW_NOCHILDREN = 64; //SetRedraw WM_SETREDRAW = 11; //Dummy CM_PARENTFONTCHANGED = 1999; //Wheel WHEEL_DELTA = 120; WHEEL_PAGESCROLL = High(DWord); SPI_GETWHEELSCROLLLINES = 104; //MultiByte MB_USEGLYPHCHARS = 4; LOCALE_IDEFAULTANSICODEPAGE = 4100; //Image list ILD_TRANSPARENT = $00000001; ILD_MASK = $00000010; ILD_IMAGE = $00000020; ILD_ROP = $00000040; ILD_BLEND25 = $00000002; ILD_BLEND50 = $00000004; ILD_OVERLAYMASK = $00000F00; { GetDCEx } DCX_WINDOW = $1; DCX_CACHE = $2; DCX_PARENTCLIP = $20; DCX_CLIPSIBLINGS = $10; DCX_CLIPCHILDREN = $8; DCX_NORESETATTRS = $4; DCX_LOCKWINDOWUPDATE = $400; DCX_EXCLUDERGN = $40; DCX_INTERSECTRGN = $80; DCX_VALIDATE = $200000; SCantWriteResourceStreamError = 'CantWriteResourceStreamError'; //command EN_UPDATE = 1024; ES_AUTOHSCROLL = $80; ES_AUTOVSCROLL = $40; ES_CENTER = $1; ES_LEFT = 0; ES_LOWERCASE = $10; ES_MULTILINE = $4; ES_NOHIDESEL = $100; EM_SETRECTNP = 180; DT_END_ELLIPSIS = 32768; doublecmd-0.5.8/components/virtualtreeview/virtualtreeview_package_doublecmd.lpk0000644000175000017500000000517111751527542027613 0ustar alexxalexx doublecmd-0.5.8/components/virtualtreeview/VTGraphics.pas0000644000175000017500000000151612140233030022642 0ustar alexxalexxunit VTGraphics; {$mode delphi} interface uses DelphiCompat, Types, LCLIntf, LCLType; type // Describes the mode how to blend pixels. TBlendMode = ( bmConstantAlpha, // apply given constant alpha bmPerPixelAlpha, // use alpha value of the source pixel bmMasterAlpha, // use alpha value of source pixel and multiply it with the constant alpha value bmConstantAlphaAndColor // blend the destination color with the given constant color und the constant alpha value ); procedure AlphaBlend(Source, Destination: HDC; const R: TRect; const Target: TPoint; Mode: TBlendMode; ConstantAlpha, Bias: Integer); function CalculateScanline(Bits: Pointer; Width, Height, Row: Integer): Pointer; function GetBitmapBitsFromBitmap(Bitmap: HBITMAP): Pointer; implementation {$i vtgraphicsi.inc} end. doublecmd-0.5.8/components/virtualtreeview/VTAccessibilityFactory.pas0000644000175000017500000000755712014201074025237 0ustar alexxalexxunit VTAccessibilityFactory; // class to create IAccessibles for the tree passed into it. // If not already assigned, creates IAccessibles for the tree itself // and the focused item // the tree accessible is returned when the tree receives an WM_GETOBJECT message // the AccessibleItem is returned when the Accessible is being asked for the first child // To create your own IAccessibles, use the VTStandardAccessible unit as a reference, // and assign your Accessibles to the variables in tthe unit's initialization. // You only need to add the unit to your project, and voil, you have an accessible string tree! // // Written by Marco Zehe. (c) 2007 interface uses Classes, oleacc, VirtualTrees; type IVTAccessibleProvider = interface function CreateIAccessible(ATree: TBaseVirtualTree): IAccessible; end; TVTAccessibilityFactory = class(TObject) private FAccessibleProviders: TInterfaceList; public constructor Create; destructor Destroy; override; function CreateIAccessible(ATree: TBaseVirtualTree): IAccessible; procedure RegisterAccessibleProvider(AProvider: IVTAccessibleProvider); procedure UnRegisterAccessibleProvider(AProvider: IVTAccessibleProvider); end; var VTAccessibleFactory: TVTAccessibilityFactory; implementation { TVTAccessibilityFactory } constructor TVTAccessibilityFactory.Create; begin inherited; FAccessibleProviders := TInterfaceList.Create; FAccessibleProviders.Clear; end; function TVTAccessibilityFactory.CreateIAccessible( ATree: TBaseVirtualTree): IAccessible; var I: Integer; TmpIAccessible: IAccessible; // returns an IAccessible. // 1. If the Accessible property of the passed-in tree is nil, // the first registered element will be returned. // Usually, this is the IAccessible that provides information about the tree itself. // If it is not nil, we'll check whether the AccessibleItem is nil. // If it is, we'll look in the registered IAccessibles for the appropriate one. // Each IAccessibleProvider will check the tree for properties to determine whether it is responsible. // We'll work top to bottom, from the most complicated to the most simple. // The index for these should all be greater than 0, e g the IAccessible for the tree itself should always be registered first, then any IAccessible items. begin result := nil; if ATree <> nil then begin if ATree.Accessible = nil then begin if FAccessibleProviders.Count > 0 then begin result := IVTAccessibleProvider(FAccessibleProviders.Items[0]).CreateIAccessible(ATree); exit; end; end; if ATree.AccessibleItem = nil then begin if FAccessibleProviders.Count > 0 then begin for I := FAccessibleProviders.Count - 1 downto 1 do begin TmpIAccessible := IVTAccessibleProvider(FAccessibleProviders.Items[I]).CreateIAccessible(ATree); if TmpIAccessible <> nil then begin result := TmpIAccessible; break; end; end; if TmpIAccessible = nil then begin result := IVTAccessibleProvider(FAccessibleProviders.Items[0]).CreateIAccessible(ATree); end; end; end else begin result := ATree.AccessibleItem; end; end; end; destructor TVTAccessibilityFactory.Destroy; begin FAccessibleProviders.Free; FAccessibleProviders := nil; inherited; end; procedure TVTAccessibilityFactory.RegisterAccessibleProvider( AProvider: IVTAccessibleProvider); // Ads a provider if it is not already registered begin if FAccessibleProviders.IndexOf(AProvider) < 0 then FAccessibleProviders.Add(AProvider) end; procedure TVTAccessibilityFactory.UnRegisterAccessibleProvider( AProvider: IVTAccessibleProvider); // Unregisters/removes an IAccessible provider if it is present begin if FAccessibleProviders.IndexOf(AProvider) >= 0 then FAccessibleProviders.Remove(AProvider); end; end. doublecmd-0.5.8/components/virtualtreeview/vtlogger.pas0000644000175000017500000000335612014201074022470 0ustar alexxalexxunit vtlogger; {$mode objfpc}{$H+} interface uses multiloglcl, multilog; const //lc stands for LogClass //it's possible to define the constants to suit any need lcAll = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]; lcDebug = 0; lcError = 1; lcInfo = 2; lcWarning = 3; lcEvents = 4; lcPaint = 5; lcPaintHeader = 6; lcDummyFunctions = 7; lcMessages = 8; lcPaintSelection = 9; lcSetCursor = 10;//it generates a lot of messages. so it will be debugged alone lcPaintBitmap = 11; lcScroll = 12; lcPaintDetails = 13; lcCheck = 14; lcEditLink = 15; lcEraseBkgnd = 16; lcColumnPosition = 17; lcTimer = 18; lcDrag = 19; lcOle = 20; lcPanning = 21; lcHeaderOffset = 22; lcSelection = 23; lcAlphaBlend = 24; lcHint = 25; lcMouseEvent = 26; var Logger: TLCLLogger; function GetSelectedNodes(Sender: TLogger; Data: Pointer; var DoSend: Boolean): String; implementation uses VirtualTrees, sysutils; type TNodeData = record Title: String; end; PNodeData = ^TNodeData; function GetSelectedNodes(Sender: TLogger; Data: Pointer; var DoSend: Boolean): String; var i: Integer; TempNode: PVirtualNode; begin with TBaseVirtualTree(Data) do begin Result:='SelectedCount: '+IntToStr(SelectedCount)+LineEnding; TempNode:=GetFirstSelected; if TempNode = nil then exit; Result:=Result+PNodeData(GetNodeData(TempNode))^.Title+LineEnding; for i:= 1 to SelectedCount -1 do begin TempNode:=GetNextSelected(TempNode); Result:=Result+PNodeData(GetNodeData(TempNode))^.Title+LineEnding; end; end; end; initialization Logger:=TLCLLogger.Create; finalization Logger.Free; end. doublecmd-0.5.8/components/virtualtreeview/ideicons.lrs0000644000175000017500000000661711727533326022476 0ustar alexxalexxLazarusResources.Add('tvirtualdrawtree','XPM',[ '/* XPM */'#10'static char * tvirtualdrawtree_xpm[] = {'#10'"24 24 8 1",'#10 +'".'#9'c #000000",'#10'"+'#9'c None",'#10'"@'#9'c #808000",'#10'"#'#9'c #20A' +'080",'#10'"$'#9'c #808080",'#10'"%'#9'c #C0A000",'#10'"&'#9'c #C0C0C0",'#10 +'"*'#9'c #FFFFFF",'#10'"++++++..++++++++++++++++",'#10'"+++++.&&............' +'.+++",'#10'"++++.***&&&&&&&&&&$$@.++",'#10'"++++.************@$$$.++",'#10 +'"+++.************@$$$$.++",'#10'"++++...@********.$$$$.++",'#10'"+++++++...' +'......$$$$@+++",'#10'"+++++++.$$$$$$$$***$.+++",'#10'"+++++++.*******%***&.' +'+++",'#10'"+++++++.*.****%%%**$.+++",'#10'"+++++++.*...*%%%%%*.++++",'#10'"' +'+++++++.*.**%%%%%%%.++++",'#10'"++++++.**.***####**.++++",'#10'"+++++.$**.*' +'*######*.++++",'#10'"+++++.&**..*######*.++++",'#10'"+++++.******######*.++' +'++",'#10'"+++++.*******####**&.+++",'#10'"+...+.***.....******.+++",'#10'"+' +'.&&@....&&&&&.****$.+++",'#10'"+.&&&&&&&&&&&&&.**&.++++",'#10'"++.$&&&&&&&&' +'&&&.&&&.++++",'#10'"++.$$$$$$$$$$$$$.&.+++++",'#10'"+++...............+++++' +'+",'#10'"++++++++++++++++++++++++"};'#10 ]); LazarusResources.Add('tvirtualstringtree','XPM',[ '/* XPM */'#10'static char * tvirtualstringtree_xpm[] = {'#10'"24 24 8 1",'#10 +'".'#9'c #000000",'#10'"+'#9'c None",'#10'"@'#9'c #808000",'#10'"#'#9'c #20A' +'080",'#10'"$'#9'c #808080",'#10'"%'#9'c #C0A000",'#10'"&'#9'c #C0C0C0",'#10 +'"*'#9'c #FFFFFF",'#10'"++++++..++++++++++++++++",'#10'"+++++.&&............' +'.+++",'#10'"++++.***&&&&&&&&&&$$@.++",'#10'"++++.************@$$$.++",'#10 +'"+++.************@$$$$.++",'#10'"++++...@********.$$$$.++",'#10'"+++++++...' +'......$$$$@+++",'#10'"+++++++.$$$$$$$$***$.+++",'#10'"+++++++.***********&.' +'+++",'#10'"+++++++.*.**......*$.+++",'#10'"+++++++.*....%%%%.*.++++",'#10'"' +'+++++++.*.**......*.++++",'#10'"++++++.**.*********.++++",'#10'"+++++.$**.*' +'*......*.++++",'#10'"+++++.&**....####.*.++++",'#10'"+++++.******......*.++' +'++",'#10'"+++++.*************&.+++",'#10'"+...+.***.....******.+++",'#10'"+' +'.&&@....&&&&&.****$.+++",'#10'"+.&&&&&&&&&&&&&.**&.++++",'#10'"++.$&&&&&&&&' +'&&&.&&&.++++",'#10'"++.$$$$$$$$$$$$$.&.+++++",'#10'"+++...............+++++' +'+",'#10'"++++++++++++++++++++++++"};'#10 ]); LazarusResources.Add('tvtheaderpopupmenu','XPM',[ '/* XPM */'#10'static char * tvtheaderpopupmenu_xpm[] = {'#10'"24 24 7 1",'#10 +'".'#9'c #000000",'#10'"+'#9'c #000080",'#10'"@'#9'c None",'#10'"#'#9'c #808' +'000",'#10'"$'#9'c #808080",'#10'"%'#9'c #C0C0C0",'#10'"&'#9'c #FFFFFF",'#10 +'"@@@@@@..@@@@@@@@@@@@@@@@",'#10'"@@@@@.%%.............@@@",'#10'"@@@@.&&&%%' +'%%%%%%%%$$#.@@",'#10'"@@@@.&&&&&&&&&&&&#$$$.@@",'#10'"@@@.&&&&&&&&&&&&#$$$$' +'.@@",'#10'"@@@@...#&&&&&&&&.$$$$.@@",'#10'"@@@@@@@.........$$$$#@@@",'#10'"' +'@@@@@@@.$$$$$$$$&&&$.@@@",'#10'"@@@@@@@.$&&&&&&.&&&%.@@@",'#10'"@@@@@@@.$&+' +'++&&.&&&$.@@@",'#10'"@@@@@@@.$&&&&&&.&&&.@@@@",'#10'"@@@@@@@.$&+++++.&&&.@@' +'@@",'#10'"@@@@@@.&$+&&&+&+&&&.@@@@",'#10'"@@@@@.$&$&++++&&+&&.@@@@",'#10'"@' +'@@@@.%&$&&&&+&&&+&.@@@@",'#10'"@@@@@.&&$....+&&&&+.@@@@",'#10'"@@@@@.&&&&&&' +'&+&&&++++@@@",'#10'"@...@.&&&....+&&&&+&.@@@",'#10'"@.%%#....%%%%+&++&&+.@@' +'@",'#10'"@.%%%%%%%%%%%++$+&&+@@@@",'#10'"@@.$%%%%%%%%%+%.%+&&+@@@",'#10'"@@' +'.$$$$$$$$$$$$$.+&&+@@@",'#10'"@@@...............++@@@@",'#10'"@@@@@@@@@@@@@' +'@@@@@@@@@@@"};'#10 ]); doublecmd-0.5.8/components/virtualtreeview/VTConfig.inc0000644000175000017500000000334612140233030022300 0ustar alexxalexx// Configuration file for VirtualTrees.pas (see www.soft-gems.net). // // The content of this file is public domain. You may do with it whatever you like, provided the header stays fully intact // in all version and derivative work. // // The original code is VTConfig.inc, released October 5, 2004. // // The initial developer of the original code is Mike Lischke (public@soft-gems.net, www.soft-gems.net). //---------------------------------------------------------------------------------------------------------------------- {.$define UseFlatScrollbars} {.$define ReverseFullExpandHotKey} // Used to define Ctrl+'+' instead of Ctrl+Shift+'+' for full expand (and similar for collapsing). // Enable this switch for Windows XP theme support. If you compile with Delphi 6 or lower you must download and install // the Soft Gems Theme Manager package. {.$define ThemeSupport} // Virtual Treeview can use a tiny but very effective local memory manager for node allocation. // The local memory manager was implemented by David Clark from Caelo Software Inc. // See below for more info about it. {.$define UseLocalMemoryManager} //Lazarus port options {.$define EnableOLE} {.$define EnableNativeTVM} {.$define EnablePrint} {.$define EnableNCFunctions} {$define EnableAdvancedGraphics} {$define EnableAlphaBlend} {.$define EnableAccessible} {$define ThemeSupport} {$if defined(LCLWin32) or defined(LCLWinCE)} {$define LCLWin} {$endif} {.$define DEBUG_VTV} {$define USE_DELPHICOMPAT} //since {$if not defined(USE_DELPHICOMPAT) and not defined(LCLWin)} {$define INCOMPLETE_WINAPI} {$endif} //under linux the performance is poor with threading enabled {$ifdef Windows} {.$define EnableThreadSupport} {$endif} {$ifdef CPU64} {$define PACKARRAYPASCAL} {$endif} doublecmd-0.5.8/components/virtualtreeview/virtualtreeview_package_doublecmd.pas0000644000175000017500000000075412014201074027570 0ustar alexxalexx{ This file was automatically created by Lazarus. Do not edit! This source is only used to compile and install the package. } unit virtualtreeview_package_doublecmd; interface uses VirtualTrees, VTHeaderPopup, registervirtualtreeview, VTGraphics, LazarusPackageIntf; implementation procedure Register; begin RegisterUnit('registervirtualtreeview', @registervirtualtreeview.Register); end; initialization RegisterPackage('virtualtreeview_package_doublecmd', @Register); end. doublecmd-0.5.8/components/virtualtreeview/VTHeaderPopup.pas0000644000175000017500000002131212014201074023315 0ustar alexxalexxunit VTHeaderPopup; //---------------------------------------------------------------------------------------------------------------------- // The contents of this file are subject to the Mozilla Public License // Version 1.1 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at // http://www.mozilla.org/MPL/ // // Alternatively, you may redistribute this library, use and/or modify it under the terms of the // GNU Lesser General Public License as published by the Free Software Foundation; // either version 2.1 of the License, or (at your option) any later version. // You may obtain a copy of the LGPL at http://www.gnu.org/copyleft/. // // Software distributed under the License is distributed on an "AS IS" // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the // License for the specific language governing rights and limitations // under the License. // // The Original Code is VTHeaderPopup.pas. // // The Initial Developer of the Original Code is Ralf Junker . All Rights Reserved. // // September 2004: // - Bug fix: TVTHeaderPopupMenu.OnMenuItemClick used the wrong Tag member for the event. // // Modified 12 Dec 2003 by Ralf Junker . // - Added missing default storage specifier for Options property. // - To avoid mixing up image lists of different trees sharing the same header // popup, set the popup's image list to nil if hoShowImages is not in the // tree's header options. // - Added an additional check for the PopupComponent property before casting // it hardly to a Virtual Treeview in OnMenuItemClick. See entry 31 Mar 2003. // // Modified 14 Sep 2003 by Mike Lischke . // - Renamed event type name to be consistent with other event types (e.g. used in VT). // - Added event for hiding/showing columns. // - DoXXX method are now virtual. // - Conditional code rearrangement to get back Ctrl+Shift+Up/Down navigation. // // Modified 31 Mar 2003 by Mike Lischke . // - Added a check for the PopupComponent property before casting it hardly to // a Virtual Treeview. People might (accidentally) misuse the header popup. // // Modified 20 Oct 2002 by Borut Maricic . // - Added the possibility to use Troy Wolbrink's Unicode aware popup menu. // Define the compiler symbol TNT to enable it. You can get Troy's Unicode // controls collection from http://home.ccci.org/wolbrink/tnt/delphi_unicode_controls.htm. // // Modified 24 Feb 2002 by Ralf Junker . // - Fixed a bug where the OnAddHeaderPopupItem would interfere with // poAllowHideAll options. // - All column indexes now consistently use TColumnIndex (instead of Integer). // // Modified 23 Feb 2002 by Ralf Junker . // - Added option to show menu items in the same order as the columns or in // original order. // - Added option to prevent the user to hide all columns. // // Modified 17 Feb 2002 by Jim Kueneman . // - Added the event to filter the items as they are added to the menu. //---------------------------------------------------------------------------------------------------------------------- {$mode delphi} interface uses {$ifdef TNT} TntMenus, {$else} Menus, {$endif TNT} VirtualTrees; type TVTHeaderPopupOption = ( poOriginalOrder, // Show menu items in original column order as they were added to the tree. poAllowHideAll // Allows to hide all columns, including the last one. ); TVTHeaderPopupOptions = set of TVTHeaderPopupOption; TAddPopupItemType = ( apNormal, apDisabled, apHidden ); TAddHeaderPopupItemEvent = procedure(const Sender: TBaseVirtualTree; const Column: TColumnIndex; var Cmd: TAddPopupItemType) of object; TColumnChangeEvent = procedure(const Sender: TBaseVirtualTree; const Column: TColumnIndex; Visible: Boolean) of object; {$ifdef TNT} TVTMenuItem = TTntMenuItem; {$else} TVTMenuItem = TMenuItem; {$endif} {$ifdef TNT} TVTHeaderPopupMenu = class(TTntPopupMenu) {$else} TVTHeaderPopupMenu = class(TPopupMenu) {$endif} private FOptions: TVTHeaderPopupOptions; FOnAddHeaderPopupItem: TAddHeaderPopupItemEvent; FOnColumnChange: TColumnChangeEvent; protected procedure DoAddHeaderPopupItem(const Column: TColumnIndex; out Cmd: TAddPopupItemType); virtual; procedure DoColumnChange(Column: TColumnIndex; Visible: Boolean); virtual; procedure OnMenuItemClick(Sender: TObject); public procedure Popup(x, y: Integer); override; published property Options: TVTHeaderPopupOptions read FOptions write FOptions default []; property OnAddHeaderPopupItem: TAddHeaderPopupItemEvent read FOnAddHeaderPopupItem write FOnAddHeaderPopupItem; property OnColumnChange: TColumnChangeEvent read FOnColumnChange write FOnColumnChange; end; //---------------------------------------------------------------------------------------------------------------------- implementation uses {$ifdef TNT} TnTClasses {$else} Classes {$endif TNT}; type TVirtualTreeCast = class(TBaseVirtualTree); // Necessary to make the header accessible. //----------------- TVTHeaderPopupMenu --------------------------------------------------------------------------------- procedure TVTHeaderPopupMenu.DoAddHeaderPopupItem(const Column: TColumnIndex; out Cmd: TAddPopupItemType); begin Cmd := apNormal; if Assigned(FOnAddHeaderPopupItem) then FOnAddHeaderPopupItem(TVirtualTreeCast(PopupComponent), Column, Cmd); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeaderPopupMenu.DoColumnChange(Column: TColumnIndex; Visible: Boolean); begin if Assigned(FOnColumnChange) then FOnColumnChange(TVirtualTreeCast(PopupComponent), Column, Visible); end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeaderPopupMenu.OnMenuItemClick(Sender: TObject); begin if Assigned(PopupComponent) and (PopupComponent is TBaseVirtualTree) then with TVTMenuItem(Sender), TVirtualTreeCast(PopupComponent).Header.Columns.Items[Tag] do begin if Checked then Options := Options - [coVisible] else Options := Options + [coVisible]; DoColumnChange(TVTMenuItem(Sender).Tag, not Checked); end; end; //---------------------------------------------------------------------------------------------------------------------- procedure TVTHeaderPopupMenu.Popup(x, y: Integer); var I: Integer; ColPos: TColumnPosition; ColIdx: TColumnIndex; NewMenuItem: TVTMenuItem; Cmd: TAddPopupItemType; VisibleCounter: Cardinal; VisibleItem: TVTMenuItem; begin if Assigned(PopupComponent) and (PopupComponent is TBaseVirtualTree) then begin // Delete existing menu items. I := Items.Count; while I > 0 do begin Dec(I); Items[I].Free; end; // Add column menu items. with TVirtualTreeCast(PopupComponent).Header do begin if hoShowImages in Options then Self.Images := Images else // Remove a possible reference to image list of another tree previously assigned. Self.Images := nil; VisibleItem := nil; VisibleCounter := 0; for ColPos := 0 to Columns.Count - 1 do begin if poOriginalOrder in FOptions then ColIdx := ColPos else ColIdx := Columns.ColumnFromPosition(ColPos); with Columns[ColIdx] do begin if coVisible in Options then Inc(VisibleCounter); DoAddHeaderPopupItem(ColIdx, Cmd); if Cmd <> apHidden then begin NewMenuItem := TVTMenuItem.Create(Self); NewMenuItem.Tag := ColIdx; NewMenuItem.Caption := Text; NewMenuItem.Hint := Hint; NewMenuItem.ImageIndex := ImageIndex; NewMenuItem.Checked := coVisible in Options; NewMenuItem.OnClick := OnMenuItemClick; if Cmd = apDisabled then NewMenuItem.Enabled := False else if coVisible in Options then VisibleItem := NewMenuItem; Items.Add(NewMenuItem); end; end; end; // Conditionally disable menu item of last enabled column. if (VisibleCounter = 1) and (VisibleItem <> nil) and not (poAllowHideAll in FOptions) then VisibleItem.Enabled := False; end; end; inherited; end; //---------------------------------------------------------------------------------------------------------------------- end. doublecmd-0.5.8/components/virtualtreeview/VTAccessibility.pas0000644000175000017500000006344012014201074023700 0ustar alexxalexxunit VTAccessibility; // This unit implements iAccessible interfaces for the VirtualTree visual components // and the currently focused node. // // Written by Marco Zehe. (c) 2007 interface uses Windows, Classes, ActiveX, oleacc, VirtualTrees, VTAccessibilityFactory, Controls; type TVirtualTreeAccessibility = class(TInterfacedObject, IDispatch, IAccessible) private FVirtualTree: TVirtualStringTree; public { IAccessibility } function Get_accParent(out ppdispParent: IDispatch): HResult; stdcall; function Get_accChildCount(out pcountChildren: Integer): HResult; stdcall; function Get_accChild(varChild: OleVariant; out ppdispChild: IDispatch): HResult; stdcall; function Get_accName(varChild: OleVariant; out pszName: WideString): HResult; stdcall; function Get_accValue(varChild: OleVariant; out pszValue: WideString): HResult; stdcall; function Get_accDescription(varChild: OleVariant; out pszDescription: WideString): HResult; stdcall; function Get_accRole(varChild: OleVariant; out pvarRole: OleVariant): HResult; stdcall; function Get_accState(varChild: OleVariant; out pvarState: OleVariant): HResult; stdcall; function Get_accHelp(varChild: OleVariant; out pszHelp: WideString): HResult; stdcall; function Get_accHelpTopic(out pszHelpFile: WideString; varChild: OleVariant; out pidTopic: Integer): HResult; stdcall; function Get_accKeyboardShortcut(varChild: OleVariant; out pszKeyboardShortcut: WideString): HResult; stdcall; function Get_accFocus(out pvarChild: OleVariant): HResult; stdcall; function Get_accSelection(out pvarChildren: OleVariant): HResult; stdcall; function Get_accDefaultAction(varChild: OleVariant; out pszDefaultAction: WideString): HResult; stdcall; function accSelect(flagsSelect: Integer; varChild: OleVariant): HResult; stdcall; function accLocation(out pxLeft: Integer; out pyTop: Integer; out pcxWidth: Integer; out pcyHeight: Integer; varChild: OleVariant): HResult; stdcall; function accNavigate(navDir: Integer; varStart: OleVariant; out pvarEndUpAt: OleVariant): HResult; stdcall; function accHitTest(xLeft: Integer; yTop: Integer; out pvarChild: OleVariant): HResult; stdcall; function accDoDefaultAction(varChild: OleVariant): HResult; stdcall; function Set_accName(varChild: OleVariant; const pszName: WideString): HResult; stdcall; function Set_accValue(varChild: OleVariant; const pszValue: WideString): HResult; stdcall; {IDispatch} function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount: Integer; LocaleID: Integer; DispIDs: Pointer): HRESULT; stdcall; function GetTypeInfo(Index: Integer; LocaleID: Integer; out TypeInfo): HRESULT; stdcall; function GetTypeInfoCount(out Count: Integer): HRESULT; stdcall; function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult: Pointer; ExcepInfo: Pointer; ArgErr: Pointer): HRESULT; stdcall; constructor Create(VirtualTree: TVirtualStringTree); end; TVirtualTreeItemAccessibility = class(TVirtualTreeAccessibility, IAccessible) public { IAccessibility } function Get_accParent(out ppdispParent: IDispatch): HResult; stdcall; function Get_accChildCount(out pcountChildren: Integer): HResult; stdcall; function Get_accChild(varChild: OleVariant; out ppdispChild: IDispatch): HResult; stdcall; function Get_accName(varChild: OleVariant; out pszName: WideString): HResult; stdcall; function Get_accValue(varChild: OleVariant; out pszValue: WideString): HResult; stdcall; function Get_accDescription(varChild: OleVariant; out pszDescription: WideString): HResult; stdcall; function Get_accRole(varChild: OleVariant; out pvarRole: OleVariant): HResult; stdcall; function Get_accState(varChild: OleVariant; out pvarState: OleVariant): HResult; stdcall; function accLocation(out pxLeft: Integer; out pyTop: Integer; out pcxWidth: Integer; out pcyHeight: Integer; varChild: OleVariant): HResult; stdcall; constructor Create(VirtualTree: TVirtualStringTree); end; TVTMultiColumnItemAccessibility = class(TVirtualTreeItemAccessibility, IAccessible) private function GetItemDescription(varChild: OleVariant; out pszDescription: WideString; IncludeMainColumn: boolean): HResult; stdcall; public { IAccessibility } function Get_accName(varChild: OleVariant; out pszName: WideString): HResult; stdcall; function Get_accDescription(varChild: OleVariant; out pszDescription: WideString): HResult; stdcall; end; TVTDefaultAccessibleProvider = class(TInterfacedObject, IVTAccessibleProvider) function CreateIAccessible(ATree: TBaseVirtualTree): IAccessible; end; TVTDefaultAccessibleItemProvider = class(TInterfacedObject, IVTAccessibleProvider) function CreateIAccessible(ATree: TBaseVirtualTree): IAccessible; end; TVTMultiColumnAccessibleItemProvider = class(TInterfacedObject, IVTAccessibleProvider) function CreateIAccessible(ATree: TBaseVirtualTree): IAccessible; end; implementation uses Variants, SysUtils, Types, Forms; { TVirtualTreeAccessibility } //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.accDoDefaultAction(varChild: OleVariant): HResult; // a default action is not supported. begin Result := DISP_E_MEMBERNOTFOUND; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.accHitTest(xLeft: Integer; yTop: Integer; out pvarChild: OleVariant): HResult; // returns the iAccessible object at the given point, if applicable. var Pt: TPoint; HitInfo: THitInfo; begin Result := S_FALSE; if FVirtualTree <> nil then begin // VariantInit(pvarChild); // TVarData(pvarChild).VType := VT_I4; Pt := fVirtualTree.ScreenToClient(Point(xLeft, yTop)); if fVirtualTree.FocusedNode <> nil then begin fVirtualTree.GetHitTestInfoAt(xLeft, yTop, false, HitInfo); if FVirtualTree.FocusedNode = HitInfo.HitNode then begin pvarChild := FVirtualTree.AccessibleItem; Result := S_OK; exit; end; end; if PtInRect(FVirtualTree.BoundsRect, Pt) then begin pvarChild := CHILDID_SELF; Result := S_OK; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.accLocation(out pxLeft: Integer; out pyTop: Integer; out pcxWidth: Integer; out pcyHeight: Integer; varChild: OleVariant): HResult; // returns the location of the VirtualStringTree object. var P: TPoint; begin Result := S_FALSE; if varChild = CHILDID_SELF then begin if FVirtualTree <> nil then begin P := FVirtualTree.ClientToScreen(FVirtualTree.ClientRect.TopLeft); pxLeft := P.X; pyTop := P.Y; pcxWidth := FVirtualTree.Width; pcyHeight := FVirtualTree.Height; Result := S_OK; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.accNavigate(navDir: Integer; varStart: OleVariant; out pvarEndUpAt: OleVariant): HResult; // This is not supported. begin Result := DISP_E_MEMBERNOTFOUND; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.Get_accSelection(out pvarChildren: OleVariant): HResult; // returns the selected child ID, if any. begin Result := s_false; if FVirtualTree <> nil then if fVirtualTree.FocusedNode <> nil then begin pvarChildren := 1; result := s_OK; end; end; //---------------------------------------------------------------------------------------------------------------------- constructor TVirtualTreeAccessibility.Create(VirtualTree: TVirtualStringTree); // assigns the parent and current fields, and lets the control's iAccessible object know its address. begin fVirtualTree := VirtualTree; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HRESULT; // Not supported. begin Result := E_NOTIMPL; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HRESULT; // not supported. begin Result := E_NOTIMPL; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.GetTypeInfoCount( out Count: Integer): HRESULT; // not supported. begin Result := E_NOTIMPL; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.Get_accChild(varChild: OleVariant; out ppdispChild: IDispatch): HResult; // returns the iAccessible child, whicfh represents the focused item. begin if varChild = CHILDID_SELF then begin ppdispChild := FVirtualTree.AccessibleItem; Result := S_OK; end else Result := E_INVALIDARG end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.Get_accChildCount(out pcountChildren: Integer): HResult; // Returns the number 1 for the one child: The focused item. begin pcountChildren := 1; Result := S_OK; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.Get_accDefaultAction(varChild: OleVariant; out pszDefaultAction: WideString): HResult; // Not supported. begin Result := DISP_E_MEMBERNOTFOUND; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.Get_accDescription(varChild: OleVariant; out pszDescription: WideString): HResult; // returns the hint of the control, if assigned. begin pszDescription := ''; Result := S_FALSE; if varChild = CHILDID_SELF then begin if FVirtualTree <> nil then pszDescription := GetLongHint(fVirtualTree.Hint); end; if Length(pszDescription) > 0 then Result := S_OK; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.Get_accFocus(out pvarChild: OleVariant): HResult; // returns the child ID of 1, if assigned. begin Result := s_false; if fVirtualTree <> nil then begin if FVirtualTree.FocusedNode <> nil then begin pvarChild := fVirtualTree.AccessibleItem; result := s_OK; end else begin pvarChild := childid_self; result := S_OK; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.Get_accHelp(varChild: OleVariant; out pszHelp: WideString): HResult; // Not supported. begin Result := DISP_E_MEMBERNOTFOUND; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.Get_accHelpTopic(out pszHelpFile: WideString; varChild: OleVariant; out pidTopic: Integer): HResult; // Returns the HelpContext ID, if present. begin pszHelpFile := ''; pidTopic := 0; Result := S_OK; if varChild = CHILDID_SELF then if FVirtualTree <> nil then begin pszHelpFile := Application.HelpFile; pidTopic := FVirtualTree.HelpContext; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.Get_accKeyboardShortcut(varChild: OleVariant; out pszKeyboardShortcut: WideString): HResult; // Not supported. begin pszKeyboardShortcut := ''; Result := S_FALSE; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.Get_accName(varChild: OleVariant; out pszName: WideString): HResult; // if set, returns the new published AccessibleName property. // otherwise, returns the default text. begin pszName := ''; Result := S_FALSE; if varChild = CHILDID_SELF then begin if FVirtualTree <> nil then begin if FVirtualTree.AccessibleName <> '' then pszName := FVirtualTree.AccessibleName else PSZName := FVirtualTree.DefaultText; result := S_OK; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.Get_accParent(out ppdispParent: IDispatch): HResult; // Returns false, the tree itself does not have a parent. begin ppdispParent := nil; Result := S_FALSE; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.Get_accRole(varChild: OleVariant; out pvarRole: OleVariant): HResult; // tells MSAA that it is a TreeView. begin Result := S_OK; // VariantInit(pvarRole); // TVarData(pvarRole).VType := VT_I4; if varChild = CHILDID_SELF then begin if FVirtualTree <> nil then pvarRole := ROLE_SYSTEM_OUTLINE end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.accSelect(flagsSelect: Integer; varChild: OleVariant): HResult; // since we're not supporting more than one item, this is not supported currently. begin Result := DISP_E_MEMBERNOTFOUND; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.Get_accState(varChild: OleVariant; out pvarState: OleVariant): HResult; // returns the state of the control. const IsEnabled: array[Boolean] of Integer = (STATE_SYSTEM_UNAVAILABLE, 0); HasPopup: array[Boolean] of Integer = (0, STATE_SYSTEM_HASPOPUP); IsVisible: array[Boolean] of Integer = (STATE_SYSTEM_INVISIBLE, 0); begin Result := S_OK; // VariantInit(pvarState); // TVarData(pvarState).VType := VT_I4; if varChild = CHILDID_SELF then begin if FVirtualTree <> nil then begin pvarState := STATE_SYSTEM_FOCUSED or STATE_SYSTEM_FOCUSABLE or STATE_SYSTEM_HOTTRACKED; pvarState := pvarState or IsVisible[FVirtualTree.Visible]; pvarState := pvarState or IsEnabled[FVirtualTree.Enabled]; end else Result := E_INVALIDARG; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.Get_accValue(varChild: OleVariant; out pszValue: WideString): HResult; // the TreeView control itself does not have a value, returning false here. begin pszValue := ''; Result := S_FALSE;//DISP_E_MEMBERNOTFOUND; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HRESULT; // not supported. begin Result := E_NOTIMPL; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.Set_accName(varChild: OleVariant; const pszName: WideString): HResult; stdcall; // not supported. begin Result := DISP_E_MEMBERNOTFOUND end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeAccessibility.Set_accValue(varChild: OleVariant; const pszValue: WideString): HResult; // not supported. begin Result := DISP_E_MEMBERNOTFOUND end; { TVirtualTreeItemAccessibility } //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeItemAccessibility.accLocation(out pxLeft, pyTop, pcxWidth, pcyHeight: Integer; varChild: OleVariant): HResult; // returns the location of the current accessible item. var P: TPoint; DisplayRect: TRect; begin Result := S_FALSE; if varChild = CHILDID_SELF then begin if FVirtualTree.FocusedNode <> nil then begin DisplayRect := FVirtualTree.GetDisplayRect(FVirtualTree.FocusedNode, -1, TRUE, FALSE); P := FVirtualTree.ClientToScreen(DisplayRect.TopLeft); pxLeft := P.X; pyTop := P.Y; pcxWidth := DisplayRect.Right - DisplayRect.Left; pcyHeight := DisplayRect.Bottom - DisplayRect.Top; Result := S_OK; end; end; end; //---------------------------------------------------------------------------------------------------------------------- constructor TVirtualTreeItemAccessibility.Create(VirtualTree: TVirtualStringTree); // sets up the parent/child relationship. begin fVirtualTree := VirtualTree; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeItemAccessibility.Get_accChild(varChild: OleVariant; out ppdispChild: IDispatch): HResult; // the item does not have children. Returning false. begin ppdispChild := nil; Result := S_FALSE; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeItemAccessibility.Get_accChildCount(out pcountChildren: Integer): HResult; // the item itself does not have children, returning 0. begin pcountChildren := 0; Result := S_OK; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeItemAccessibility.Get_accDescription(varChild: OleVariant; out pszDescription: WideString): HResult; // not supported for an item. begin Result := DISP_E_MEMBERNOTFOUND; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeItemAccessibility.Get_accName(varChild: OleVariant; out pszName: WideString): HResult; // the name is the node's caption. begin pszName := ''; Result := S_FALSE; if varChild = childid_self then begin if FVirtualTree <> nil then if FVirtualTree.FocusedNode <> nil then begin pszName := FVirtualTree.Text[FVirtualTree.FocusedNode, FVirtualTree.Header.MainColumn]; result := S_OK; end else begin PSZName := FVirtualTree.DefaultText; result := S_OK; end; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeItemAccessibility.Get_accParent(out ppdispParent: IDispatch): HResult; // tells MSAA that the VritualStringTree is its parent. begin result := S_FALSE; if FVirtualTree <> nil then begin ppdispParent := FVirtualTree.Accessible; Result := S_OK; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeItemAccessibility.Get_accRole(varChild: OleVariant; out pvarRole: OleVariant): HResult; // tells MSAA that it is a TreeView item as opposed to the TreeView itself. begin Result := S_OK; // VariantInit(pvarRole); // TVarData(pvarRole).VType := VT_I4; if varChild = childid_self then begin if FVirtualTree <> nil then pvarRole := ROLE_SYSTEM_OUTLINEITEM end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeItemAccessibility.Get_accState(varChild: OleVariant; out pvarState: OleVariant): HResult; // Tells MSAA the state the item is in. const IsEnabled: array[Boolean] of Integer = (STATE_SYSTEM_UNAVAILABLE, 0); HasPopup: array[Boolean] of Integer = (0, STATE_SYSTEM_HASPOPUP); IsVisible: array[Boolean] of Integer = (STATE_SYSTEM_INVISIBLE, 0); IsChecked: array[Boolean] of Integer = (0, STATE_SYSTEM_CHECKED); IsExpanded: array[Boolean] of Integer = (0, STATE_SYSTEM_EXPANDED); IsCollapsed: array[Boolean] of Integer = (0, STATE_SYSTEM_COLLAPSED); begin Result := S_OK; // VariantInit(pvarState); // TVarData(pvarState).VType := VT_I4; if varChild = childid_self then begin if FVirtualTree <> nil then begin pvarState := STATE_SYSTEM_FOCUSED or STATE_SYSTEM_FOCUSABLE or STATE_SYSTEM_HOTTRACKED; pvarState := pvarState or IsVisible[FVirtualTree.Visible]; pvarState := pvarState or IsEnabled[FVirtualTree.Enabled]; if fVirtualTree.FocusedNode <> nil then begin pvarState := pvarState or IsChecked[csCheckedNormal = FVirtualTree.FocusedNode.CheckState]; pvarState := pvarState or IsExpanded[VSExpanded in FVirtualTree.FocusedNode.States]; if not (vsExpanded in FVirtualTree.FocusedNode.States) then pvarState:= PvarState or IsCollapsed[vsHasChildren in FVirtualTree.FocusedNode.States]; end; end else Result := E_INVALIDARG; end; end; //---------------------------------------------------------------------------------------------------------------------- function TVirtualTreeItemAccessibility.Get_accValue(varChild: OleVariant; out pszValue: WideString): HResult; // for a TreeView item, the value is the nesting level number, 0-based. begin pszValue := ''; Result := S_FALSE;//DISP_E_MEMBERNOTFOUND; if varChild = childid_self then if FVirtualTree <> nil then if FVirtualTree.FocusedNode <> nil then begin PSZValue := IntToStr(FVirtualTree.GetNodeLevel(FVirtualTree.FocusedNode)); result := S_OK; end; end; { TVTMultiColumnItemAccessibility } function TVTMultiColumnItemAccessibility.GetItemDescription( varChild: OleVariant; out pszDescription: WideString; IncludeMainColumn: boolean): HResult; var I: Integer; sTemp: WideString; begin pszDescription := ''; Result := S_FALSE; if varChild = childid_self then begin if FVirtualTree <> nil then if FVirtualTree.FocusedNode <> nil then begin if IncludeMainColumn then pszDescription := FVirtualTree.Text[FVirtualTree.FocusedNode, FVirtualTree.Header.MainColumn] +'; '; for I := 0 to FVirtualTree.Header.Columns.Count - 1 do if FVirtualTree.Header.MainColumn <> I then begin sTemp := FVirtualTree.Text[FVirtualTree.FocusedNode, I]; if sTemp <> '' then pszDescription := pszDescription +FVirtualTree.Header.Columns[I].Text +': ' +sTemp +'; '; end; if pszDescription <> '' then if pszDescription[Length(pszDescription)-1] = ';' then Delete(pszDescription, length(pszDescription)-1, 2); result := S_OK; end else begin PSZDescription := FVirtualTree.DefaultText; result := S_OK; end; end; end; function TVTMultiColumnItemAccessibility.Get_accDescription( varChild: OleVariant; out pszDescription: WideString): HResult; begin result := GetItemDescription(varChild, pszDescription, false) end; function TVTMultiColumnItemAccessibility.Get_accName(varChild: OleVariant; out pszName: WideString): HResult; begin result := GetItemDescription(varChild, pszName, true) end; { TVTDefaultAccessibleProvider } function TVTDefaultAccessibleProvider.CreateIAccessible( ATree: TBaseVirtualTree): IAccessible; begin result := TVirtualTreeAccessibility.Create(TVirtualStringTree(ATree)); end; { TVTDefaultAccessibleItemProvider } function TVTDefaultAccessibleItemProvider.CreateIAccessible( ATree: TBaseVirtualTree): IAccessible; begin result := TVirtualTreeItemAccessibility.Create(TVirtualStringTree(ATree)); end; { TVTMultiColumnAccessibleItemProvider } function TVTMultiColumnAccessibleItemProvider.CreateIAccessible( ATree: TBaseVirtualTree): IAccessible; begin result := nil; if TVirtualStringTree(ATree).Header.UseColumns then result := TVTMultiColumnItemAccessibility.Create(TVirtualStringTree(ATree)); end; var IDefaultAccessibleProvider: TVTDefaultAccessibleProvider; IDefaultAccessibleItemProvider: TVTDefaultAccessibleItemProvider; IMultiColumnAccessibleProvider: TVTMultiColumnAccessibleItemProvider; initialization if VTAccessibleFactory = nil then VTAccessibleFactory := TVTAccessibilityFactory.Create; if IDefaultAccessibleProvider = nil then begin IDefaultAccessibleProvider := TVTDefaultAccessibleProvider.Create; VTAccessibleFactory.RegisterAccessibleProvider(IDefaultAccessibleProvider); end; if IDefaultAccessibleItemProvider = nil then begin IDefaultAccessibleItemProvider := TVTDefaultAccessibleItemProvider.Create; VTAccessibleFactory.RegisterAccessibleProvider(IDefaultAccessibleItemProvider); end; if IMultiColumnAccessibleProvider = nil then begin IMultiColumnAccessibleProvider := TVTMultiColumnAccessibleItemProvider.Create; VTAccessibleFactory.RegisterAccessibleProvider(IMultiColumnAccessibleProvider); end; finalization if VTAccessibleFactory <> nil then begin VTAccessibleFactory.UnRegisterAccessibleProvider(IMultiColumnAccessibleProvider); IMultiColumnAccessibleProvider := nil; VTAccessibleFactory.UnRegisterAccessibleProvider(IDefaultAccessibleItemProvider); IDefaultAccessibleItemProvider := nil; VTAccessibleFactory.UnRegisterAccessibleProvider(IDefaultAccessibleProvider); IDefaultAccessibleProvider := nil; end; end. doublecmd-0.5.8/components/virtualtreeview/virtualtrees.lrs0000644000175000017500000050502111727533326023423 0ustar alexxalexxLazarusResources.Add('VT_VERTSPLIT','CUR',[ #0#0#2#0#1#0' '#2#0#14#0#15#0'0'#1#0#0#22#0#0#0'('#0#0#0' '#0#0#0'@'#0#0#0#1 +#0#1#0#0#0#0#0#0#1#0#0#0#0#0#0#0#0#0#0#2#0#0#0#2#0#0#0#0#0#0#0#255#255#255#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#6#0#0#0#9#0#0#0#16#128#0#0 +' @'#0#0#25#128#0#0#9#0#0#0#9#0#0#7#249#254#0#4#0#2#0#4#0#2#0#7#249#254#0#0#9 +#0#0#0#9#0#0#0#25#128#0#0' @'#0#0#16#128#0#0#9#0#0#0#6#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#249 +#255#255#255#240#255#255#255#224#127#255#255#192'?'#255#255#224#127#255#255 +#240#255#255#255#240#255#255#248#0#1#255#248#0#1#255#248#0#1#255#248#0#1#255 +#255#240#255#255#255#240#255#255#255#224#127#255#255#192'?'#255#255#224#127 +#255#255#240#255#255#255#249#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255 ]); LazarusResources.Add('VT_HEADERSPLIT','CUR',[ #0#0#2#0#1#0' '#0#0#15#0#14#0'0'#1#0#0#22#0#0#0'('#0#0#0' '#0#0#0'@'#0#0#0#1 +#0#1#0#0#0#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#7 +#128#0#0#4#128#0#0#4#128#0#0#4#128#0#0#4#128#0#0'D'#136#0#0#164#148#0#1'<' +#242#0#2#0#1#0#2#0#1#0#1'<'#242#0#0#164#148#0#0'D'#136#0#0#4#128#0#0#4#128#0 +#0#4#128#0#0#4#128#0#0#7#128#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#248#127 +#255#255#248#127#255#255#248#127#255#255#248#127#255#255#248#127#255#255#184 +'w'#255#255#24'c'#255#254#0#1#255#252#0#0#255#252#0#0#255#254#0#1#255#255#24 +'c'#255#255#184'w'#255#255#248#127#255#255#248#127#255#255#248#127#255#255 +#248#127#255#255#248#127#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255 ]); LazarusResources.Add('VT_MOVEALL','CUR',[ #0#0#2#0#1#0' '#0#0#16#0#16#0'0'#1#0#0#22#0#0#0'('#0#0#0' '#0#0#0'@'#0#0#0#1 +#0#1#0#0#0#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#128#0#0#2'@'#0#0#4' '#0#0#8#16#0#0#16#8 +#0#0' '#4#0#0#127#254#0#0#160#5#0#1' '#4#128#2'!'#132'@'#4'"D '#8'$$'#16#8'$' +'$'#16#4'"D '#2'!'#132'@'#1' '#4#128#0#160#5#0#0#127#254#0#0' '#4#0#0#16#8#0 +#0#8#16#0#0#4' '#0#0#2'@'#0#0#1#128#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#254#127#255#255 +#252'?'#255#255#248#31#255#255#240#15#255#255#224#7#255#255#192#3#255#255#128 +#1#255#255#31#248#255#254#31#248#127#252#30'x?'#248#28'8'#31#240#24#24#15#240 +#24#24#15#248#28'8'#31#252#30'x?'#254#31#248#127#255#31#248#255#255#128#1#255 +#255#192#3#255#255#224#7#255#255#240#15#255#255#248#31#255#255#252'?'#255#255 +#254#127#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 ]); LazarusResources.Add('VT_MOVEE','CUR',[ #0#0#2#0#1#0' '#0#0#16#0#16#0#232#2#0#0#22#0#0#0'('#0#0#0' '#0#0#0'@'#0#0#0#1 +#0#4#0#0#0#0#0#128#2#0#0#0#0#0#0#0#0#0#0#16#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0 +#128#0#0#0#128#128#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128 +#128#0#0#0#255#0#0#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255 +#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#240#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#15#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#0#240#0#0#0#0#0#0#0#0#0#0#15#240 +#0#15#0#15#0#0#0#0#0#0#0#0#0#0#240#15#0#15#0#0#240#0#0#0#0#0#0#0#0#15#0#0#240 +#15#0#0#15#0#0#0#0#0#0#0#0#15#0#0#240#15#0#0#15#0#0#0#0#0#0#0#0#0#240#15#0#15 +#0#0#240#0#0#0#0#0#0#0#0#0#15#240#0#15#0#15#0#0#0#0#0#0#0#0#0#0#0#0#0#15#0 +#240#0#0#0#0#0#0#0#0#0#0#0#0#0#15#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#240#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#251#255#255#255#249#255#255#255#248#255#255#255#248#127 +#255#254'x?'#255#252'8'#31#255#248#24#15#255#248#24#15#255#252'8'#31#255#254 +'x?'#255#255#248#127#255#255#248#255#255#255#249#255#255#255#251#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 ]); LazarusResources.Add('VT_MOVEEW','CUR',[ #0#0#2#0#1#0' '#0#0#16#0#16#0#232#2#0#0#22#0#0#0'('#0#0#0' '#0#0#0'@'#0#0#0#1 +#0#4#0#0#0#0#0#128#2#0#0#0#0#0#0#0#0#0#0#16#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0 +#128#0#0#0#128#128#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128 +#128#0#0#0#255#0#0#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255 +#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#240#0#0#0#0#15#0#0#0#0#0#0#0#0#0#15#240#0#0#0#0#15#240#0#0#0#0#0#0#0#0 +#240#240#0#0#0#0#15#15#0#0#0#0#0#0#0#15#0#240#0#0#0#0#15#0#240#0#0#0#0#0#0 +#240#0#240#0#15#240#0#15#0#15#0#0#0#0#0#15#0#0#240#0#240#15#0#15#0#0#240#0#0 +#0#0#240#0#0#240#15#0#0#240#15#0#0#15#0#0#0#0#240#0#0#240#15#0#0#240#15#0#0 +#15#0#0#0#0#15#0#0#240#0#240#15#0#15#0#0#240#0#0#0#0#0#240#0#240#0#15#240#0 +#15#0#15#0#0#0#0#0#0#15#0#240#0#0#0#0#15#0#240#0#0#0#0#0#0#0#240#240#0#0#0#0 +#15#15#0#0#0#0#0#0#0#0#15#240#0#0#0#0#15#240#0#0#0#0#0#0#0#0#0#240#0#0#0#0#15 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#223#251 +#255#255#159#249#255#255#31#248#255#254#31#248#127#252#30'x?'#248#28'8'#31 +#240#24#24#15#240#24#24#15#248#28'8'#31#252#30'x?'#254#31#248#127#255#31#248 +#255#255#159#249#255#255#223#251#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255 ]); LazarusResources.Add('VT_MOVEN','CUR',[ #0#0#2#0#1#0' '#0#0#16#0#16#0#232#2#0#0#22#0#0#0'('#0#0#0' '#0#0#0'@'#0#0#0#1 +#0#4#0#0#0#0#0#128#2#0#0#0#0#0#0#0#0#0#0#16#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0 +#128#0#0#0#128#128#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128 +#128#0#0#0#255#0#0#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255 +#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#240#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#240#15#0#0#0#0#0#0#0#0#0#0#0#0#0#15#0#0#240#0#0#0#0#0#0#0 +#0#0#0#0#0#15#0#0#240#0#0#0#0#0#0#0#0#0#0#0#0#0#240#15#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#15#240#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255 +#255#255#255#255#255#255#0#0#0#0#0#0#0#0#15#0#0#0#0#0#0#240#0#0#0#0#0#0#0#0#0 +#240#0#0#0#0#15#0#0#0#0#0#0#0#0#0#0#15#0#0#0#0#240#0#0#0#0#0#0#0#0#0#0#0#240 +#0#0#15#0#0#0#0#0#0#0#0#0#0#0#0#15#0#0#240#0#0#0#0#0#0#0#0#0#0#0#0#0#240#15#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#15#240#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#254#127#255#255#252'?'#255#255#248#31#255#255#248#31#255#255#252'?' +#255#255#254#127#255#255#255#255#255#255#0#0#255#255#128#1#255#255#192#3#255 +#255#224#7#255#255#240#15#255#255#248#31#255#255#252'?'#255#255#254#127#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 ]); LazarusResources.Add('VT_MOVENE','CUR',[ #0#0#2#0#1#0' '#0#0#16#0#16#0#232#2#0#0#22#0#0#0'('#0#0#0' '#0#0#0'@'#0#0#0#1 +#0#4#0#0#0#0#0#128#2#0#0#0#0#0#0#0#0#0#0#16#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0 +#128#0#0#0#128#128#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128 +#128#0#0#0#255#0#0#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255 +#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#240#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#240#15#0#0#0#240#0#0#0#0#0#0#0#0#0#15#0#0#240#0#15#240#0#0 +#0#0#0#0#0#0#0#15#0#0#240#0#240#240#0#0#0#0#0#0#0#0#0#0#240#15#0#15#0#240#0#0 +#0#0#0#0#0#0#0#0#15#240#0#240#0#240#0#0#0#0#0#0#0#0#0#0#0#0#15#0#0#240#0#0#0 +#0#0#0#0#0#0#0#0#0#240#0#0#240#0#0#0#0#0#0#0#0#0#0#0#15#0#0#0#240#0#0#0#0#0#0 +#0#0#0#0#0#240#0#0#0#240#0#0#0#0#0#0#0#0#0#0#15#0#0#0#0#240#0#0#0#0#0#0#0#0#0 +#0#255#255#255#255#255#240#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#254#127#255#255#252'?'#127#255#248#30#127#255#248#28#127#255#252 +'8'#127#255#254'p'#127#255#255#224#127#255#255#192#127#255#255#128#127#255 +#255#0#127#255#254#0#127#255#252#0#127#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 ]); LazarusResources.Add('VT_MOVENS','CUR',[ #0#0#2#0#1#0' '#0#0#16#0#16#0#232#2#0#0#22#0#0#0'('#0#0#0' '#0#0#0'@'#0#0#0#1 +#0#4#0#0#0#0#0#128#2#0#0#0#0#0#0#0#0#0#0#16#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0 +#128#0#0#0#128#128#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128 +#128#0#0#0#255#0#0#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255 +#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#15#240#0#0#0#0#0#0#0#0#0#0#0#0#0#0#240#15#0#0#0#0#0#0#0#0#0#0#0#0#0#15#0#0 +#240#0#0#0#0#0#0#0#0#0#0#0#0#240#0#0#15#0#0#0#0#0#0#0#0#0#0#0#15#0#0#0#0#240 +#0#0#0#0#0#0#0#0#0#0#240#0#0#0#0#15#0#0#0#0#0#0#0#0#0#15#255#255#255#255#255 +#255#240#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#15#240#0#0#0#0#0#0#0#0#0#0#0#0#0#0#240#15#0#0#0#0#0#0#0#0 +#0#0#0#0#0#15#0#0#240#0#0#0#0#0#0#0#0#0#0#0#0#15#0#0#240#0#0#0#0#0#0#0#0#0#0 +#0#0#0#240#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#240#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#255#255#255#255 +#255#255#240#0#0#0#0#0#0#0#0#0#240#0#0#0#0#15#0#0#0#0#0#0#0#0#0#0#15#0#0#0#0 +#240#0#0#0#0#0#0#0#0#0#0#0#240#0#0#15#0#0#0#0#0#0#0#0#0#0#0#0#15#0#0#240#0#0 +#0#0#0#0#0#0#0#0#0#0#0#240#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#240#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#254#127#255#255#252'?'#255 +#255#248#31#255#255#240#15#255#255#224#7#255#255#192#3#255#255#128#1#255#255 +#255#255#255#255#255#255#255#255#254#127#255#255#252'?'#255#255#248#31#255 +#255#248#31#255#255#252'?'#255#255#254#127#255#255#255#255#255#255#255#255 +#255#255#128#1#255#255#192#3#255#255#224#7#255#255#240#15#255#255#248#31#255 +#255#252'?'#255#255#254#127#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255 ]); LazarusResources.Add('VT_MOVENW','CUR',[ #0#0#2#0#1#0' '#0#0#16#0#16#0#232#2#0#0#22#0#0#0'('#0#0#0' '#0#0#0'@'#0#0#0#1 +#0#4#0#0#0#0#0#128#2#0#0#0#0#0#0#0#0#0#0#16#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0 +#128#0#0#0#128#128#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128 +#128#0#0#0#255#0#0#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255 +#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#240#0#0#0#0#0 +#0#0#0#0#0#15#0#0#0#240#15#0#0#0#0#0#0#0#0#0#0#15#240#0#15#0#0#240#0#0#0#0#0 +#0#0#0#0#15#15#0#15#0#0#240#0#0#0#0#0#0#0#0#0#15#0#240#0#240#15#0#0#0#0#0#0#0 +#0#0#0#15#0#15#0#15#240#0#0#0#0#0#0#0#0#0#0#15#0#0#240#0#0#0#0#0#0#0#0#0#0#0 +#0#15#0#0#15#0#0#0#0#0#0#0#0#0#0#0#0#15#0#0#0#240#0#0#0#0#0#0#0#0#0#0#0#15#0 +#0#0#15#0#0#0#0#0#0#0#0#0#0#0#15#0#0#0#0#240#0#0#0#0#0#0#0#0#0#0#15#255#255 +#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#254#127#255#254#252'?'#255#254'x'#31#255#254'8'#31#255#254#28'?'#255 +#254#14#127#255#254#7#255#255#254#3#255#255#254#1#255#255#254#0#255#255#254#0 +#127#255#254#0'?'#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255 ]); LazarusResources.Add('VT_MOVES','CUR',[ #0#0#2#0#1#0' '#0#0#16#0#16#0#232#2#0#0#22#0#0#0'('#0#0#0' '#0#0#0'@'#0#0#0#1 +#0#4#0#0#0#0#0#128#2#0#0#0#0#0#0#0#0#0#0#16#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0 +#128#0#0#0#128#128#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128 +#128#0#0#0#255#0#0#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255 +#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#15#240#0#0#0#0#0#0#0#0#0#0#0#0#0#0#240#15#0#0#0#0#0#0#0#0#0#0#0#0#0#15#0#0 +#240#0#0#0#0#0#0#0#0#0#0#0#0#240#0#0#15#0#0#0#0#0#0#0#0#0#0#0#15#0#0#0#0#240 +#0#0#0#0#0#0#0#0#0#0#240#0#0#0#0#15#0#0#0#0#0#0#0#0#0#15#0#0#0#0#0#0#240#0#0 +#0#0#0#0#0#0#255#255#255#255#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#15#240#0#0#0#0#0#0#0#0#0#0#0#0#0#0#240#15#0#0#0#0#0#0 +#0#0#0#0#0#0#0#15#0#0#240#0#0#0#0#0#0#0#0#0#0#0#0#15#0#0#240#0#0#0#0#0#0#0#0 +#0#0#0#0#0#240#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#240#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#254#127#255#255#252'?'#255#255#248#31#255#255#240#15#255 +#255#224#7#255#255#192#3#255#255#128#1#255#255#0#0#255#255#255#255#255#255 +#254#127#255#255#252'?'#255#255#248#31#255#255#248#31#255#255#252'?'#255#255 +#254#127#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 ]); LazarusResources.Add('VT_MOVESE','CUR',[ #0#0#2#0#1#0' '#0#0#16#0#16#0#232#2#0#0#22#0#0#0'('#0#0#0' '#0#0#0'@'#0#0#0#1 +#0#4#0#0#0#0#0#128#2#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0 +#128#0#0#0#128#128#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128 +#128#0#0#0#255#0#0#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255 +#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#255#255#255#255#255#240#0#0#0#0#0#0#0#0#0#0#15#0#0#0#0 +#240#0#0#0#0#0#0#0#0#0#0#0#240#0#0#0#240#0#0#0#0#0#0#0#0#0#0#0#15#0#0#0#240#0 +#0#0#0#0#0#0#0#0#0#0#0#240#0#0#240#0#0#0#0#0#0#0#0#0#0#0#0#15#0#0#240#0#0#0#0 +#0#0#0#0#0#0#15#240#0#240#0#240#0#0#0#0#0#0#0#0#0#0#240#15#0#15#0#240#0#0#0#0 +#0#0#0#0#0#15#0#0#240#0#240#240#0#0#0#0#0#0#0#0#0#15#0#0#240#0#15#240#0#0#0#0 +#0#0#0#0#0#0#240#15#0#0#0#240#0#0#0#0#0#0#0#0#0#0#15#240#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#252 +#0#127#255#254#0#127#255#255#0#127#255#255#128#127#255#255#192#127#255#255 +#224#127#255#254'p'#127#255#252'8'#127#255#248#28#127#255#248#30#127#255#252 +'?'#127#255#254#127#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('VT_MOVESW','CUR',[ #0#0#2#0#1#0' '#0#0#16#0#16#0#232#2#0#0#22#0#0#0'('#0#0#0' '#0#0#0'@'#0#0#0#1 +#0#4#0#0#0#0#0#128#2#0#0#0#0#0#0#0#0#0#0#16#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0 +#128#0#0#0#128#128#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128 +#128#0#0#0#255#0#0#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255 +#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#15#255#255#255#255#255#0#0#0#0#0#0#0#0#0#0#15#0#0#0#0#240#0#0#0 +#0#0#0#0#0#0#0#15#0#0#0#15#0#0#0#0#0#0#0#0#0#0#0#15#0#0#0#240#0#0#0#0#0#0#0#0 +#0#0#0#15#0#0#15#0#0#0#0#0#0#0#0#0#0#0#0#15#0#0#240#0#0#0#0#0#0#0#0#0#0#0#0 +#15#0#15#0#15#240#0#0#0#0#0#0#0#0#0#0#15#0#240#0#240#15#0#0#0#0#0#0#0#0#0#0 +#15#15#0#15#0#0#240#0#0#0#0#0#0#0#0#0#15#240#0#15#0#0#240#0#0#0#0#0#0#0#0#0 +#15#0#0#0#240#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#240#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#254#0'?'#255#254 +#0#127#255#254#0#255#255#254#1#255#255#254#3#255#255#254#7#255#255#254#14#127 +#255#254#28'?'#255#254'8'#31#255#254'x'#31#255#254#252'?'#255#255#254#127#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255 ]); LazarusResources.Add('VT_MOVEW','CUR',[ #0#0#2#0#1#0' '#0#0#16#0#16#0#232#2#0#0#22#0#0#0'('#0#0#0' '#0#0#0'@'#0#0#0#1 +#0#4#0#0#0#0#0#128#2#0#0#0#0#0#0#0#0#0#0#16#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0 +#128#0#0#0#128#128#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128 +#128#0#0#0#255#0#0#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255 +#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#240#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#240#0#0#0#0#0#0#0#0#0#0#0#0#0#0#240 +#240#0#0#0#0#0#0#0#0#0#0#0#0#0#15#0#240#0#0#0#0#0#0#0#0#0#0#0#0#0#240#0#240#0 +#15#240#0#0#0#0#0#0#0#0#0#15#0#0#240#0#240#15#0#0#0#0#0#0#0#0#0#240#0#0#240 +#15#0#0#240#0#0#0#0#0#0#0#0#240#0#0#240#15#0#0#240#0#0#0#0#0#0#0#0#15#0#0#240 +#0#240#15#0#0#0#0#0#0#0#0#0#0#240#0#240#0#15#240#0#0#0#0#0#0#0#0#0#0#15#0#240 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#240#240#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#240#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#240#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#223#255#255#255#159#255#255#255#31#255#255#254 +#31#255#255#252#30#127#255#248#28'?'#255#240#24#31#255#240#24#31#255#248#28 +'?'#255#252#30#127#255#254#31#255#255#255#31#255#255#255#159#255#255#255#223 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 ]); LazarusResources.Add('VT_XPBUTTONPLUS','BMP',[ 'BM4'#1#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#9#0#0#0#9#0#0#0#1#0#24#0#0#0#0#0#0#0#0#0 +#18#11#0#0#18#11#0#0#0#0#0#0#0#0#0#0#211#194#176#181#152'x'#181#152'x'#181 +#152'x'#181#152'x'#181#152'x'#181#152'x'#181#152'x'#211#194#176#0#181#152'x' +#191#204#210#174#190#198#168#184#194#167#184#193#167#184#193#166#183#192#170 +#186#195#181#152'x'#0#181#152'x'#217#225#228#207#216#220#201#211#216#0#0#0 +#198#209#214#192#204#210#187#200#207#181#152'x'#0#181#152'x'#238#242#242#236 +#240#240#231#237#237#0#0#0#227#233#234#217#224#227#204#214#219#181#152'x'#0 +#181#152'x'#241#245#245#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#210#219#223#181#152'x' +#0#181#152'x'#245#247#247#245#247#247#244#247#247#0#0#0#244#246#246#235#240 +#241#218#225#229#181#152'x'#0#181#152'x'#251#252#252#251#253#253#251#253#253 +#0#0#0#251#252#252#250#252#252#243#246#247#181#152'x'#0#181#152'x'#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#181#152'x'#0#211#194#176#181#152'x'#181#152'x'#181#152'x'#181#152'x'#181#152 +'x'#181#152'x'#181#152'x'#211#194#176#0#0#0 ]); LazarusResources.Add('VT_XPBUTTONMINUS','BMP',[ 'BM4'#1#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#9#0#0#0#9#0#0#0#1#0#24#0#0#0#0#0#0#0#0#0 +#18#11#0#0#18#11#0#0#0#0#0#0#0#0#0#0#211#194#176#181#152'x'#181#152'x'#181 +#152'x'#181#152'x'#181#152'x'#181#152'x'#181#152'x'#211#194#176#0#181#152'x' +#191#204#210#174#190#198#168#184#194#167#184#193#167#184#193#166#183#192#170 +#186#195#181#152'x'#0#181#152'x'#217#225#228#207#216#220#201#211#216#199#210 +#215#198#209#214#192#204#210#187#200#207#181#152'x'#0#181#152'x'#238#242#242 +#236#240#240#231#237#237#230#235#236#227#233#234#217#224#227#204#214#219#181 +#152'x'#0#181#152'x'#241#245#245#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#210#219#223 +#181#152'x'#0#181#152'x'#245#247#247#245#247#247#244#247#247#244#247#247#244 +#246#246#235#240#241#218#225#229#181#152'x'#0#181#152'x'#251#252#252#251#253 +#253#251#253#253#251#253#253#251#252#252#250#252#252#243#246#247#181#152'x'#0 +#181#152'x'#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#181#152'x'#0#211#194#176#181#152'x'#181#152'x'#181#152 +'x'#181#152'x'#181#152'x'#181#152'x'#181#152'x'#211#194#176#0#0#0 ]); LazarusResources.Add('VT_CHECK_LIGHT','BMP',[ 'BM'#246#12#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#144#1#0#0#16#0#0#0#1#0#4#0#0#0#0#0 +#128#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#0#255#0 +#192#192#192#0#128#128#128#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128 +#128#0#0#0#255#0#0#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255 +#255#255#0'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""332"""""332"""""332"""""332""' +'"""332"""""332"""""332"""""332"""#33332""#33332""#33332""#33332""#33332""#3' +'3332""#33332""#33332""#33332""#33332""#33332""#33332"!DDDDDDB!DDDDDDB$'#17 +#17#17#17#17#17#18'!DDDDDDB""""""""""3'#17#17#19'""""3'#17#17#19'""""3333"""' +'"3333""""3'#17#17#19'""""3'#17#17#19'""""3333""""3333"""4'#17#17#17#17#19'"' +'"4'#17#17#17#17#19'""433333""433333""4'#17#17#17#17#19'""4'#17#17#17#17#19 +'""433333""433333""4'#17#17#17#17#19'""4'#17#17#17#17#19'""433333""433333"!3' +'33333B!333333B$333333'#18'!333333B"""""""""#A'#17#17#17'2""#A'#17#17#17'2""' +'#C3332""#C3332""#A'#19'3'#17'2""#A'#19'3'#17'2""#C3332""#C3332""4'#17#17#17 +#17#19'""4'#17#17#17#17#19'""433333""433333""4'#20'A'#17'D'#19'""4'#20'A'#17 +'D'#19'""44C3D3""44C3D3""4'#20'DDD'#19'""4'#20'DDD'#19'""44DDD3""44DDD3"!333' +'333B!333333B$333333'#18'!333333B"""""""""$'#17#17#17#17#19'""$'#17#17#17#17 +#19'""$33333""$33333""$'#17'DDA'#19'""$'#17'DDA'#19'""$3DDC3""$3DDC3""4'#17 +#17#17#17#19'""4'#17#17#17#17#19'""433333""433333""4'#20'D'#20'D'#19'""4'#20 +'D'#20'D'#19'""44D4D3""44D4D3""4'#20'DDD'#19'""4'#20'DDD'#19'""44DDD3""44DDD' +'3"!333333B!333333B$333'#3'33'#18'!333333B"""""""""4'#17#17#17#17#19'""4'#17 +#17#17#17#19'""433333""433333""4'#19'DDC'#19'""4'#19'DDC'#19'""43DDC3""43DDC' +'3""4'#17#17#17#17#19'""4'#17#17#17#17#19'""433333""433333""4'#17'DDA'#19'""' +'4'#17'DDA'#19'""43DDC3""43DDC3""4'#20'DDD'#19'""4'#20'DDD'#19'""44DDD3""44D' +'DD3"!330333B!330333B$330'#0'33'#18'!334333B"""""""""4'#17#17#17#17#19'""4' +#17#17#17#17#19'""433333""433333""4'#19'DDC'#19'""4'#19'DDC'#19'""43DDC3""43' +'DDC3""4'#17#17#17#17#19'""4'#17#17#17#17#19'""433333""433333""4'#17#20'D'#17 +#19'""4'#17#20'D'#17#19'""434D33""434D33""4'#20'DDD'#19'""4'#20'DDD'#19'""44' +'DDD3""44DDD3"!33'#0#3'33B!33'#0#3'33B$33'#0#0#3'3'#18'!33DC33B"""""""""4'#17 +#17#17#17#19'""4'#17#17#17#17#19'""433333""433333""4'#19'DDC'#19'""4'#19'DDC' +#19'""43DDC3""43DDC3""4'#17#17#17#17#19'""4'#17#17#17#17#19'""433333""433333' +'""4'#17'DDA'#19'""4'#17'DDA'#19'""43DDC3""43DDC3""4'#20'DDD'#19'""4'#20'DDD' +#19'""44DDD3""44DDD3"!30'#0#0'33B!30'#0#0'33B$30'#0#0#0'3'#18'!34DD33B""""""' +'"""4'#17#17#17#17#19'""4'#17#17#17#17#19'""433333""433333""4'#17'DDA'#19'""' +'4'#17'DDA'#19'""43DDC3""43DDC3""4'#17#17#17#17#19'""4'#17#17#17#17#19'""433' +'333""433333""4'#20'D'#20'D'#19'""4'#20'D'#20'D'#19'""44D4D3""44D4D3""4'#20 +'DDD'#19'""4'#20'DDD'#19'""44DDD3""44DDD3"!3'#0#0#0#3'3B!3'#0#0#0#3'3B$33333' +'3'#18'!3DDDC3B"""""""""$1'#17#17#17'2""$1'#17#17#17'2""$33332""$33332""$1' +#19'3'#17'2""$1'#19'3'#17'2""$33332""$33332""4'#17#17#17#17#19'""4'#17#17#17 +#17#19'""433333""433333""4'#20'A'#17'D'#19'""4'#20'A'#17'D'#19'""44C3D3""44C' +'3D3""4'#20'DDD'#19'""4'#20'DDD'#19'""44DDD3""44DDD3"!333333B!333333B$333333' +#18'!333333B"""""""""#C'#17#17#20'2""#C'#17#17#20'2""#C3342""#C3342""#C'#17 +#17#20'2""#C'#17#17#20'2""#C3342""#C3342""4'#17#17#17#17#19'""4'#17#17#17#17 +#19'""433333""433333""4'#17#17#17#17#19'""4'#17#17#17#17#19'""433333""433333' +'""4'#17#17#17#17#19'""4'#17#17#17#17#19'""433333""433333"!333333B!333333B$3' +'33333'#18'!333333B""""""""""4DDC""""4DDC""""4DDC""""4DDC""""4DDC""""4DDC"""' +'"4DDC""""4DDC"""4DDDDC""4DDDDC""4DDDDC""4DDDDC""4DDDDC""4DDDDC""4DDDDC""4DD' +'DDC""4DDDDC""4DDDDC""4DDDDC""4DDDDC"!333333B!333333B$333333'#18'!333333B"""' +'""""""""33""""""33""""""33""""""33""""""33""""""33""""""33""""""33""""#3333' +'2""#33332""#33332""#33332""#33332""#33332""#33332""#33332""#33332""#33332""' +'#33332""#33332"!'#17#17#17#17#17#17#18'!'#17#17#17#17#17#17#18'$DDDDDDB!'#17 +#17#17#17#17#17#18'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""' ]); LazarusResources.Add('VT_CHECK_DARK','BMP',[ 'BM'#246#12#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#144#1#0#0#16#0#0#0#1#0#4#0#0#0#0#0 +#128#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#0#255#0 +#192#192#192#0#128#128#128#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128 +#128#0#0#0#255#0#0#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255 +#255#255#0'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""DDB"""""DDB"""""DDB"""""DDB""' +'"""DDB"""""DDB"""""DDB"""""DDB"""$DDDDB""$DDDDB""$DDDDB""$DDDDB""$DDDDB""$D' +'DDDB""$DDDDB""$DDDDB""$DDDDB""$DDDDB""$DDDDB""$DDDDB"!DDDDDDB!DDDDDDB$'#17 +#17#17#17#17#17#18'!DDDDDDB""""""""""D'#17#17#20'""""D'#17#17#20'""""D334"""' +'"D334""""D'#17#17#20'""""D'#17#17#20'""""D334""""D334"""@'#17#17#17#17#20'"' +'"@'#17#17#17#17#20'""@33334""@33334""@'#17#17#17#17#20'""@'#17#17#17#17#20 +'""@33334""@33334""@'#17#17#17#17#20'""@'#17#17#17#17#20'""@33334""@33334"!3' +'33333B!333333B$333333'#18'!333333B"""""""""$'#1#17#17#17'B""$'#1#17#17#17'B' +'""$'#3'333B""$'#3'333B""$'#1#20'D'#17'B""$'#1#20'D'#17'B""$'#3'4D3B""$'#3'4' +'D3B""@'#17#17#17#17#20'""@'#17#17#17#17#20'""@33334""@33334""@'#16#1#17#0#20 +'""@'#16#1#17#0#20'""@0'#3'3'#0'4""@0'#3'3'#0'4""@'#16#0#0#0#20'""@'#16#0#0#0 +#20'""@0'#0#0#0'4""@4DDD4"!333333B!333333B$333333'#18'!333333B""""""""" '#17 +#17#17#17#20'"" '#17#17#17#17#20'"" 33334"" 33334"" '#17#0#0#1#20'"" '#17#0#0 +#1#20'"" 3'#0#0#3'4"" 3'#0#0#3'4""@'#17#17#17#17#20'""@'#17#17#17#17#20'""@3' +'3334""@33334""@'#16#0#16#0#20'""@'#16#0#16#0#20'""@0'#0'0'#0'4""@0'#0'0'#0 +'4""@'#16#0#0#0#20'""@'#16#0#0#0#20'""@0'#0#0#0'4""@4DDD4"!333333B!333333B$3' +'33'#3'33'#18'!333333B"""""""""@'#17#17#17#17#20'""@'#17#17#17#17#20'""@3333' +'4""@33334""@'#20#0#0#4#20'""@'#20#0#0#4#20'""@4'#0#0#4'4""@4'#0#0#4'4""@'#17 +#17#17#17#20'""@'#17#17#17#17#20'""@33334""@33334""@'#17#0#0#1#20'""@'#17#0#0 +#1#20'""@3'#0#0#3'4""@3'#0#0#3'4""@'#16#0#0#0#20'""@'#16#0#0#0#20'""@0'#0#0#0 +'4""@4DDD4"!330333B!330333B$330'#0'33'#18'!334333B"""""""""@'#17#17#17#17#20 +'""@'#17#17#17#17#20'""@33334""@33334""@'#20#0#0#4#20'""@'#20#0#0#4#20'""@4' +#0#0#4'4""@4'#0#0#4'4""@'#17#17#17#17#20'""@'#17#17#17#17#20'""@33334""@3333' +'4""@'#17#16#0#17#20'""@'#17#16#0#17#20'""@30'#0'34""@30'#0'34""@'#16#0#0#0 +#20'""@'#16#0#0#0#20'""@0'#0#0#0'4""@4DDD4"!33'#0#3'33B!33'#0#3'33B$33'#0#0#3 +'3'#18'!33DC33B"""""""""@'#17#17#17#17#20'""@'#17#17#17#17#20'""@33334""@333' +'34""@'#20#0#0#4#20'""@'#20#0#0#4#20'""@4'#0#0#4'4""@4'#0#0#4'4""@'#17#17#17 +#17#20'""@'#17#17#17#17#20'""@33334""@33334""@'#17#0#0#1#20'""@'#17#0#0#1#20 +'""@3'#0#0#3'4""@3'#0#0#3'4""@'#16#0#0#0#20'""@'#16#0#0#0#20'""@0'#0#0#0'4""' +'@4DDD4"!30'#0#0'33B!30'#0#0'33B$30'#0#0#0'3'#18'!34DD33B"""""""""@'#17#17#17 +#17#20'""@'#17#17#17#17#20'""@33334""@33334""@'#17#0#0#1#20'""@'#17#0#0#1#20 +'""@3'#0#0#3'4""@3'#0#0#3'4""@'#17#17#17#17#20'""@'#17#17#17#17#20'""@33334"' +'"@33334""@'#16#0#16#0#20'""@'#16#0#16#0#20'""@0'#0'0'#0'4""@0'#0'0'#0'4""@' +#16#0#0#0#20'""@'#16#0#0#0#20'""@0'#0#0#0'4""@4DDD4"!3'#0#0#0#3'3B!3'#0#0#0#3 +'3B$333333'#18'!3DDDC3B""""""""" A'#17#17#17'B"" A'#17#17#17'B"" C333B"" C33' +'3B"" A'#20'D'#17'B"" A'#20'D'#17'B"" C4D3B"" C4D3B""@'#17#17#17#17#20'""@' +#17#17#17#17#20'""@33334""@33334""@'#16#1#17#0#20'""@'#16#1#17#0#20'""@0'#3 +'3'#0'4""@0'#3'3'#0'4""@'#16#0#0#0#20'""@'#16#0#0#0#20'""@0'#0#0#0'4""@4DDD4' +'"!333333B!333333B$333333'#18'!333333B"""""""""$'#4#17#17#16'B""$'#4#17#17#16 +'B""$'#4'330B""$'#4'330B""$'#4#17#17#16'B""$'#4#17#17#16'B""$'#4'330B""$'#4 +'330B""@'#17#17#17#17#20'""@'#17#17#17#17#20'""@33334""@33334""@'#17#17#17#17 +#20'""@'#17#17#17#17#20'""@33334""@33334""@'#17#17#17#17#20'""@'#17#17#17#17 +#20'""@33334""@33334"!333333B!333333B$333333'#18'!333333B""""""""""@'#0#0#4 +'""""@'#0#0#4'""""@'#0#0#4'""""@'#0#0#4'""""@'#0#0#4'""""@'#0#0#4'""""@'#0#0 +#4'""""@'#0#0#4'"""@'#0#0#0#0#4'""@'#0#0#0#0#4'""@'#0#0#0#0#4'""@'#0#0#0#0#4 +'""@'#0#0#0#0#4'""@'#0#0#0#0#4'""@'#0#0#0#0#4'""@'#0#0#0#0#4'""@'#0#0#0#0#4 +'""@'#0#0#0#0#4'""@'#0#0#0#0#4'""@'#0#0#0#0#4'"!333333B!333333B$333333'#18'!' +'333333B"""""""""""DD""""""DD""""""DD""""""DD""""""DD""""""DD""""""DD""""""D' +'D""""$DDDDB""$DDDDB""$DDDDB""$DDDDB""$DDDDB""$DDDDB""$DDDDB""$DDDDB""$DDDDB' +'""$DDDDB""$DDDDB""$DDDDB"!'#17#17#17#17#17#17#18'!'#17#17#17#17#17#17#18'$D' +'DDDDDB!'#17#17#17#17#17#17#18'"""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' ,'"""""""""""""""""""""""""""""""""""""""""""""""""""""""' ]); LazarusResources.Add('VT_FLAT','BMP',[ 'BM'#246#12#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#144#1#0#0#16#0#0#0#1#0#4#0#0#0#0#0 +#128#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#0#255#0 +#192#192#192#0#128#128#128#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128 +#128#0#0#0#255#0#0#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255 +#255#255#0'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""'#0#0'""""""'#0#0'""""""'#0#0 +'""""""'#0#0'""""""'#0#0'""""""'#0#0'""""""'#0#0'""""""'#0#0'""" '#0#0#0#0#0 +#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0 +#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0 +#0#0#0#0#0'" '#0#0#0#0#0#0'""'#0#0#0#0#0#0#2'"'#0#0#0#0#0#0#2'"'#0#0#0#0#0#0 +#2'"'#0#0#0#0#0#0#2'""""""""""'#0#0#0#0'""""'#0#0#0#0'""""'#0#0#0#0'""""'#0#0 +#0#0'""""'#0#0#0#0'""""'#0#0#0#0'""""'#0#0#0#0'""""'#0#0#0#0'"" '#0#0#0#0#0#0 +'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0 +#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0 +#0#0#0#0'" '#0#0#0#0#0#0'""'#0#0#0#0#0#0#2'"'#0#0#0#0#0#0#2'"'#0'33333'#2'"' +#0#0#0#0#0#0#2'""""""""" '#0#17#17#0#2'"" '#0#17#17#0#2'"" '#0'33'#0#2'"" '#0 +'33'#0#2'"" '#0#17#17#0#2'"" '#0#17#17#0#2'"" '#0'33'#0#2'"" '#0'33'#0#2'" ' +#1#17#17#17#17#0'" '#1#17#17#17#17#0'" '#3'3333'#0'" '#3'3333'#0'" '#1#17#17 +#17#17#0'" '#1#17#17#17#17#0'" '#3'3333'#0'" '#3'3333'#0'" '#1#17#17#17#17#0 +'" '#1#17#17#17#17#0'" '#3'3333'#0'" '#3'3333'#0'""'#0#17#17#17#17#16#2'"'#0 +#17#17#17#17#16#2'"'#0#17#17#17#17#19#2'"'#0'33330'#2'""""""""" '#1#17#17#16 +#2'"" '#1#17#17#16#2'"" '#3'330'#2'"" '#3'330'#2'"" '#1#17#17#16#2'"" '#1#17 +#17#16#2'"" '#3'330'#2'"" '#3'330'#2'" '#1#17#17#17#17#0'" '#1#17#17#17#17#0 +'" '#3'3333'#0'" '#3'3333'#0'" '#1#17#1#17#17#0'" '#1#17#1#17#17#0'" '#3'3'#3 +'33'#0'" '#3'3'#3'33'#0'" '#1#0#0#0#1#0'" '#1#0#0#0#1#0'" '#3#0#0#0#3#0'" '#3 +'DDDC'#0'""'#0#17#17#17#17#16#2'"'#0#17#17#17#17#16#2'"'#0#17#17#17#17#19#2 +'"'#0'33330'#2'"""""""""'#0#17#17#17#17#0'""'#0#17#17#17#17#0'""'#0'3333'#0 +'""'#0'3333'#0'""'#0#17#16#1#17#0'""'#0#17#16#1#17#0'""'#0'30'#3'3'#0'""'#0 +'30'#3'3'#0'" '#1#17#17#17#17#0'" '#1#17#17#17#17#0'" '#3'3333'#0'" '#3'3333' +#0'" '#1#16#0#17#17#0'" '#1#16#0#17#17#0'" '#3'0'#0'33'#0'" '#3'0'#0'33'#0'"' +' '#1#0#0#0#1#0'" '#1#0#0#0#1#0'" '#3#0#0#0#3#0'" '#3'DDDC'#0'""'#0#17#17#1 +#17#16#2'"'#0#17#17#1#17#16#2'"'#0#17#17#1#17#19#2'"'#0'33'#3'30'#2'""""""""' +'"'#0#17#17#17#17#0'""'#0#17#17#17#17#0'""'#0'3333'#0'""'#0'3333'#0'""'#0#17 +#0#0#17#0'""'#0#17#0#0#17#0'""'#0'3'#0#0'3'#0'""'#0'3'#0#0'3'#0'" '#1#17#17 +#17#17#0'" '#1#17#17#17#17#0'" '#3'3333'#0'" '#3'3333'#0'" '#1#0#0#1#17#0'" ' +#1#0#0#1#17#0'" '#3#0#0#3'3'#0'" '#3#0#0#3'3'#0'" '#1#0#0#0#1#0'" '#1#0#0#0#1 +#0'" '#3#0#0#0#3#0'" '#3'DDDC'#0'""'#0#17#16#0#17#16#2'"'#0#17#16#0#17#16#2 +'"'#0#17#16#0#17#19#2'"'#0'30'#0'30'#2'"""""""""'#0#17#17#17#17#0'""'#0#17#17 +#17#17#0'""'#0'3333'#0'""'#0'3333'#0'""'#0#17#0#0#17#0'""'#0#17#0#0#17#0'""' +#0'3'#0#0'3'#0'""'#0'3'#0#0'3'#0'" '#1#17#17#17#17#0'" '#1#17#17#17#17#0'" ' +#3'3333'#0'" '#3'3333'#0'" '#1#0#16#0#17#0'" '#1#0#16#0#17#0'" '#3#0'0'#0'3' +#0'" '#3#0'0'#0'3'#0'" '#1#0#0#0#1#0'" '#1#0#0#0#1#0'" '#3#0#0#0#3#0'" '#3'D' +'DDC'#0'""'#0#17#0#0#1#16#2'"'#0#17#0#0#1#16#2'"'#0#17#0#0#1#19#2'"'#0'3'#0#0 +#3'0'#2'"""""""""'#0#17#17#17#17#0'""'#0#17#17#17#17#0'""'#0'3333'#0'""'#0'3' +'333'#0'""'#0#17#16#1#17#0'""'#0#17#16#1#17#0'""'#0'30'#3'3'#0'""'#0'30'#3'3' +#0'" '#1#17#17#17#17#0'" '#1#17#17#17#17#0'" '#3'3333'#0'" '#3'3333'#0'" '#1 +#1#17#0#1#0'" '#1#1#17#0#1#0'" '#3#3'3'#0#3#0'" '#3#3'3'#0#3#0'" '#1#0#0#0#1 +#0'" '#1#0#0#0#1#0'" '#3#0#0#0#3#0'" '#3'DDDC'#0'""'#0#16#0#0#0#16#2'"'#0#16 +#0#0#0#16#2'"'#0#16#0#0#0#19#2'"'#0'0'#0#0#0'0'#2'""""""""" '#1#17#17#16#2'"' +'" '#1#17#17#16#2'"" '#3'330'#2'"" '#3'330'#2'"" '#1#17#17#16#2'"" '#1#17#17 +#16#2'"" '#3'330'#2'"" '#3'330'#2'" '#1#17#17#17#17#0'" '#1#17#17#17#17#0'" ' +#3'3333'#0'" '#3'3333'#0'" '#1#17#17#16#1#0'" '#1#17#17#16#1#0'" '#3'330'#3#0 +'" '#3'330'#3#0'" '#1#0#0#0#1#0'" '#1#0#0#0#1#0'" '#3#0#0#0#3#0'" '#3'DDDC'#0 +'""'#0#17#17#17#17#16#2'"'#0#17#17#17#17#16#2'"'#0#17#17#17#17#19#2'"'#0'333' +'30'#2'""""""""" '#0#17#17#0#2'"" '#0#17#17#0#2'"" '#0'33'#0#2'"" '#0'33'#0#2 +'"" '#0#17#17#0#2'"" '#0#17#17#0#2'"" '#0'33'#0#2'"" '#0'33'#0#2'" '#1#17#17 +#17#17#0'" '#1#17#17#17#17#0'" '#3'3333'#0'" '#3'3333'#0'" '#1#17#17#17#1#0 +'" '#1#17#17#17#1#0'" '#3'333'#3#0'" '#3'333'#3#0'" '#1#0#0#0#1#0'" '#1#0#0#0 +#1#0'" '#3#0#0#0#3#0'" '#3'DDDC'#0'""'#0#17#17#17#17#16#2'"'#0#17#17#17#17#16 +#2'"'#0#17#17#17#17#19#2'"'#0'33330'#2'""""""""""'#0#0#0#0'""""'#0#0#0#0'"""' ,'"'#0#0#0#0'""""'#0#0#0#0'""""'#0#0#0#0'""""'#0#0#0#0'""""'#0#0#0#0'""""'#0#0 +#0#0'"" '#1#17#17#17#17#0'" '#1#17#17#17#17#0'" '#3'3333'#0'" '#3'3333'#0'" ' +#1#17#17#17#17#0'" '#1#17#17#17#17#0'" '#3'3333'#0'" '#3'3333'#0'" '#1#17#17 +#17#17#0'" '#1#17#17#17#17#0'" '#3'3333'#0'" '#3'3333'#0'""'#0#17#17#17#17#16 +#2'"'#0#17#17#17#17#16#2'"'#0#17#17#17#17#19#2'"'#0'33330'#2'"""""""""""'#0#0 +'""""""'#0#0'""""""'#0#0'""""""'#0#0'""""""'#0#0'""""""'#0#0'""""""'#0#0'"""' +'"""'#0#0'""" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0 +'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0 +#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'""'#0#0#0#0#0#0#2'"'#0#0 +#0#0#0#0#2'"'#0#0#0#0#0#0#2'"'#0#0#0#0#0#0#2'"""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" ' +#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0 +'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0#0#0'" '#0#0#0#0 +#0#0'""'#0#0#0#0#0#0#2'"'#0#0#0#0#0#0#2'"'#0#0#0#0#0#0#2'"'#0#0#0#0#0#0#2'""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""' ]); LazarusResources.Add('VT_TICK_DARK','BMP',[ 'BM'#246#12#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#144#1#0#0#16#0#0#0#1#0#4#0#0#0#0#0 +#128#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#0#255#0 +#192#192#192#0#128#128#128#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128 +#128#0#0#0#255#0#0#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255 +#255#255#0'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""DDB"""""DDB"""""DDB"""""DDB""' +'"""DDB"""""DDB"""""DDB"""""DDB"""$DDDDB""$DDDDB""$DDDDB""$DDDDB""$DDDDB""$D' +'DDDB""$DDDDB""$DDDDB""$DDDDB""$DDDDB""$DDDDB""$DDDDB"!DDDDDDB!DDDDDDB$'#17 +#17#17#17#17#17#18'!DDDDDDB""""""""""D'#17#17#20'""""D'#17#17#20'""""D334"""' +'"D334""""D'#17#17#20'""""D'#17#17#20'""""D334""""D334"""@'#17#17#17#17#20'"' +'"@'#17#17#17#17#20'""@33334""@33334""@'#17#17#17#17#20'""@'#17#17#17#17#20 +'""@33334""@33334""@'#17#17#17#17#20'""@'#17#17#17#17#20'""@33334""@33334"!3' +'33333B!333333B$333333'#18'!333333B"""""""""$'#1#17#17#17'B""$'#1#17#17#17'B' +'""$'#3'333B""$'#3'333B""$'#1#20'D'#17'B""$'#1#20'D'#17'B""$'#3'4D3B""$'#3'4' +'D3B""@'#17#17#17#17#20'""@'#17#17#17#17#20'""@33334""@33334""@'#17#16#17#17 +#20'""@'#17#16#17#17#20'""@30334""@30334""@'#16#0#0#0#20'""@'#16#0#0#0#20'""' +'@0'#0#0#0'4""@4DDD4"!333333B!333333B$333333'#18'!333333B""""""""" '#17#17#17 +#17#20'"" '#17#17#17#17#20'"" 33334"" 33334"" '#17#0#0#1#20'"" '#17#0#0#1#20 +'"" 3'#0#0#3'4"" 3'#0#0#3'4""@'#17#17#17#17#20'""@'#17#17#17#17#20'""@33334"' +'"@33334""@'#17#0#1#17#20'""@'#17#0#1#17#20'""@3'#0#3'34""@3'#0#3'34""@'#16#0 +#0#0#20'""@'#16#0#0#0#20'""@0'#0#0#0'4""@4DDD4"!333333B!333333B$333'#3'33'#18 +'!333333B"""""""""@'#17#17#17#17#20'""@'#17#17#17#17#20'""@33334""@33334""@' +#20#0#0#4#20'""@'#20#0#0#4#20'""@4'#0#0#4'4""@4'#0#0#4'4""@'#17#17#17#17#20 +'""@'#17#17#17#17#20'""@33334""@33334""@'#16#0#0#17#20'""@'#16#0#0#17#20'""@' +'0'#0#0'34""@0'#0#0'34""@'#16#0#0#0#20'""@'#16#0#0#0#20'""@0'#0#0#0'4""@4DDD' +'4"!330333B!330333B$330'#0'33'#18'!334333B"""""""""@'#17#17#17#17#20'""@'#17 +#17#17#17#20'""@33334""@33334""@'#20#0#0#4#20'""@'#20#0#0#4#20'""@4'#0#0#4'4' +'""@4'#0#0#4'4""@'#17#17#17#17#20'""@'#17#17#17#17#20'""@33334""@33334""@'#16 +#1#0#1#20'""@'#16#1#0#1#20'""@0'#3#0#3'4""@0'#3#0#3'4""@'#16#0#0#0#20'""@'#16 +#0#0#0#20'""@0'#0#0#0'4""@4DDD4"!33'#0#3'33B!33'#0#3'33B$33'#0#0#3'3'#18'!33' +'DC33B"""""""""@'#17#17#17#17#20'""@'#17#17#17#17#20'""@33334""@33334""@'#20 +#0#0#4#20'""@'#20#0#0#4#20'""@4'#0#0#4'4""@4'#0#0#4'4""@'#17#17#17#17#20'""@' +#17#17#17#17#20'""@33334""@33334""@'#17#17#16#0#20'""@'#17#17#16#0#20'""@330' +#0'4""@330'#0'4""@'#16#0#0#0#20'""@'#16#0#0#0#20'""@0'#0#0#0'4""@4DDD4"!30'#0 +#0'33B!30'#0#0'33B$30'#0#0#0'3'#18'!34DD33B"""""""""@'#17#17#17#17#20'""@'#17 +#17#17#17#20'""@33334""@33334""@'#17#0#0#1#20'""@'#17#0#0#1#20'""@3'#0#0#3'4' +'""@3'#0#0#3'4""@'#17#17#17#17#20'""@'#17#17#17#17#20'""@33334""@33334""@'#17 +#17#17#0#20'""@'#17#17#17#0#20'""@333'#0'4""@333'#0'4""@'#16#0#0#0#20'""@'#16 +#0#0#0#20'""@0'#0#0#0'4""@4DDD4"!3'#0#0#0#3'3B!3'#0#0#0#3'3B$333333'#18'!3DD' +'DC3B""""""""" A'#17#17#17'B"" A'#17#17#17'B"" C333B"" C333B"" A'#20'D'#17'B' +'"" A'#20'D'#17'B"" C4D3B"" C4D3B""@'#17#17#17#17#20'""@'#17#17#17#17#20'""@' +'33334""@33334""@'#17#17#17#16#20'""@'#17#17#17#16#20'""@33304""@33304""@'#16 +#0#0#0#20'""@'#16#0#0#0#20'""@0'#0#0#0'4""@4DDD4"!333333B!333333B$333333'#18 +'!333333B"""""""""$'#4#17#17#16'B""$'#4#17#17#16'B""$'#4'330B""$'#4'330B""$' +#4#17#17#16'B""$'#4#17#17#16'B""$'#4'330B""$'#4'330B""@'#17#17#17#17#20'""@' +#17#17#17#17#20'""@33334""@33334""@'#17#17#17#17#20'""@'#17#17#17#17#20'""@3' +'3334""@33334""@'#17#17#17#17#20'""@'#17#17#17#17#20'""@33334""@33334"!33333' +'3B!333333B$333333'#18'!333333B""""""""""@'#0#0#4'""""@'#0#0#4'""""@'#0#0#4 +'""""@'#0#0#4'""""@'#0#0#4'""""@'#0#0#4'""""@'#0#0#4'""""@'#0#0#4'"""@'#0#0#0 +#0#4'""@'#0#0#0#0#4'""@'#0#0#0#0#4'""@'#0#0#0#0#4'""@'#0#0#0#0#4'""@'#0#0#0#0 +#4'""@'#0#0#0#0#4'""@'#0#0#0#0#4'""@'#0#0#0#0#4'""@'#0#0#0#0#4'""@'#0#0#0#0#4 +'""@'#0#0#0#0#4'"!333333B!333333B$333333'#18'!333333B"""""""""""DD""""""DD""' +'""""DD""""""DD""""""DD""""""DD""""""DD""""""DD""""$DDDDB""$DDDDB""$DDDDB""$' +'DDDDB""$DDDDB""$DDDDB""$DDDDB""$DDDDB""$DDDDB""$DDDDB""$DDDDB""$DDDDB"!'#17 +#17#17#17#17#17#18'!'#17#17#17#17#17#17#18'$DDDDDDB!'#17#17#17#17#17#17#18'"' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' ,'""""""""""""""""""""""""' ]); LazarusResources.Add('VT_TICK_LIGHT','BMP',[ 'BM'#246#12#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#144#1#0#0#16#0#0#0#1#0#4#0#0#0#0#0 +#128#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#0#255#0 +#192#192#192#0#128#128#128#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128 +#128#0#0#0#255#0#0#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255 +#255#255#0'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""332"""""332"""""332"""""332""' +'"""332"""""332"""""332"""""332"""#33332""#33332""#33332""#33332""#33332""#3' +'3332""#33332""#33332""#33332""#33332""#33332""#33332"!DDDDDDB!DDDDDDB$'#17 +#17#17#17#17#17#18'!DDDDDDB""""""""""3'#17#17#19'""""3'#17#17#19'""""3333"""' +'"3333""""3'#17#17#19'""""3'#17#17#19'""""3333""""3333"""4'#17#17#17#17#19'"' +'"4'#17#17#17#17#19'""433333""433333""4'#17#17#17#17#19'""4'#17#17#17#17#19 +'""433333""433333""4'#17#17#17#17#19'""4'#17#17#17#17#19'""433333""433333"!3' +'33333B!333333B$333333'#18'!333333B"""""""""#A'#17#17#17'2""#A'#17#17#17'2""' +'#C3332""#C3332""#A'#19'3'#17'2""#A'#19'3'#17'2""#C3332""#C3332""4'#17#17#17 +#17#19'""4'#17#17#17#17#19'""433333""433333""4'#17#20#17#17#19'""4'#17#20#17 +#17#19'""434333""434333""4'#20'DDD'#19'""4'#20'DDD'#19'""44DDD3""44DDD3"!333' +'333B!333333B$333333'#18'!333333B"""""""""$'#17#17#17#17#19'""$'#17#17#17#17 +#19'""$33333""$33333""$'#17'DDA'#19'""$'#17'DDA'#19'""$3DDC3""$3DDC3""4'#17 +#17#17#17#19'""4'#17#17#17#17#19'""433333""433333""4'#17'DA'#17#19'""4'#17'D' +'A'#17#19'""43DC33""43DC33""4'#20'DDD'#19'""4'#20'DDD'#19'""44DDD3""44DDD3"!' +'333333B!333333B$333'#3'33'#18'!333333B"""""""""4'#17#17#17#17#19'""4'#17#17 +#17#17#19'""433333""433333""4'#19'DDC'#19'""4'#19'DDC'#19'""43DDC3""43DDC3""' +'4'#17#17#17#17#19'""4'#17#17#17#17#19'""433333""433333""4'#20'DD'#17#19'""4' +#20'DD'#17#19'""44DD33""44DD33""4'#20'DDD'#19'""4'#20'DDD'#19'""44DDD3""44DD' +'D3"!330333B!330333B$330'#0'33'#18'!334333B"""""""""4'#17#17#17#17#19'""4'#17 +#17#17#17#19'""433333""433333""4'#19'DDC'#19'""4'#19'DDC'#19'""43DDC3""43DDC' +'3""4'#17#17#17#17#19'""4'#17#17#17#17#19'""433333""433333""4'#20'ADA'#19'""' +'4'#20'ADA'#19'""44CDC3""44CDC3""4'#20'DDD'#19'""4'#20'DDD'#19'""44DDD3""44D' +'DD3"!33'#0#3'33B!33'#0#3'33B$33'#0#0#3'3'#18'!33DC33B"""""""""4'#17#17#17#17 +#19'""4'#17#17#17#17#19'""433333""433333""4'#19'DDC'#19'""4'#19'DDC'#19'""43' +'DDC3""43DDC3""4'#17#17#17#17#19'""4'#17#17#17#17#19'""433333""433333""4'#17 +#17#20'D'#19'""4'#17#17#20'D'#19'""4334D3""4334D3""4'#20'DDD'#19'""4'#20'DDD' +#19'""44DDD3""44DDD3"!30'#0#0'33B!30'#0#0'33B$30'#0#0#0'3'#18'!34DD33B""""""' +'"""4'#17#17#17#17#19'""4'#17#17#17#17#19'""433333""433333""4'#17'DDA'#19'""' +'4'#17'DDA'#19'""43DDC3""43DDC3""4'#17#17#17#17#19'""4'#17#17#17#17#19'""433' +'333""433333""4'#17#17#17'D'#19'""4'#17#17#17'D'#19'""4333D3""4333D3""4'#20 +'DDD'#19'""4'#20'DDD'#19'""44DDD3""44DDD3"!3'#0#0#0#3'3B!3'#0#0#0#3'3B$33333' +'3'#18'!3DDDC3B"""""""""$1'#17#17#17'2""$1'#17#17#17'2""$33332""$33332""$1' +#19'3'#17'2""$1'#19'3'#17'2""$33332""$33332""4'#17#17#17#17#19'""4'#17#17#17 +#17#19'""433333""433333""4'#17#17#17#20#19'""4'#17#17#17#20#19'""433343""433' +'343""4'#20'DDD'#19'""4'#20'DDD'#19'""44DDD3""44DDD3"!333333B!333333B$333333' +#18'!333333B"""""""""#C'#17#17#20'2""#C'#17#17#20'2""#C3342""#C3342""#C'#17 +#17#20'2""#C'#17#17#20'2""#C3342""#C3342""4'#17#17#17#17#19'""4'#17#17#17#17 +#19'""433333""433333""4'#17#17#17#17#19'""4'#17#17#17#17#19'""433333""433333' +'""4'#17#17#17#17#19'""4'#17#17#17#17#19'""433333""433333"!333333B!333333B$3' +'33333'#18'!333333B""""""""""4DDC""""4DDC""""4DDC""""4DDC""""4DDC""""4DDC"""' +'"4DDC""""4DDC"""4DDDDC""4DDDDC""4DDDDC""4DDDDC""4DDDDC""4DDDDC""4DDDDC""4DD' +'DDC""4DDDDC""4DDDDC""4DDDDC""4DDDDC"!333333B!333333B$333333'#18'!333333B"""' +'""""""""33""""""33""""""33""""""33""""""33""""""33""""""33""""""33""""#3333' +'2""#33332""#33332""#33332""#33332""#33332""#33332""#33332""#33332""#33332""' +'#33332""#33332"!'#17#17#17#17#17#17#18'!'#17#17#17#17#17#17#18'$DDDDDDB!'#17 +#17#17#17#17#17#18'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""' ]); LazarusResources.Add('VT_UTILITIES','BMP',[ 'BM6'#13#0#0#0#0#0#0'6'#4#0#0'('#0#0#0#144#0#0#0#16#0#0#0#1#0#8#0#0#0#0#0#0#0 +#0#0#19#11#0#0#19#11#0#0#0#1#0#0#0#1#0#0'www'#255'%r'#207#255'*u'#208#255#255 +#0#255#255#246#24#248#255#225'V'#232#255'O'#145#227#255'X'#150#227#255#134 +#134#134#255#140#140#140#255#147#147#147#255#154#154#154#255#190#190#190#255 +#184#199#203#255#197#197#197#255#204#204#204#255#195#210#213#255#221#221#221 +#255#240#251#255#255#255#255#255#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255 +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0 +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0 +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0 +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0 +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0 +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0 +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0 +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0 +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0 +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0 +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0 +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0 +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0 +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0 +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0 +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0 +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0 +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0 +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0 +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0 +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0 +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0 +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0 +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0 +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0 +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0 +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0 +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0 +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0 +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0 +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#17#15#14#14#14#15#17#3#3#3#3#3 +#3#3#3#3#17#15#14#14#14#15#17#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#17#12#11#9#9#9#11#12#17#3#3#3#3#3#3 +#3#17#12#11#9#9#9#11#12#17#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#17#12#18#18#18#18#18#0#10#12#17#3#3#3#3#3 +#17#12#18#18#18#18#18#0#10#12#17#3#3#3#3#3#3#3#3#3#3#19#3#3#3#3#3#3#3#3#3#3#3 +#19#19#19#19#19#19#19#19#19#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#15#18#18#18#18#8#18#18#0#11#15 +#3#3#3#3#3#15#18#18#8#18#18#18#18#0#11#15#3#3#3#3#3#3#3#3#3#8#14#19#3#3#3#3#3 +#3#3#3#3#3#3#8#14#14#14#14#14#19#3#3#3#3#3#3#3#3#3#3#3#3#11#3#3#3#3#3#3#3#3#3 +#3#3#11#11#11#11#11#11#11#11#11#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#18#18#18#18#8 +#8#18#18#18#9#14#3#3#3#3#3#18#18#18#8#8#18#18#18#18#9#14#3#3#3#3#3#3#3#3#3#8 +#14#19#3#3#3#3#3#3#3#3#3#3#3#8#14#14#14#14#14#19#3#3#3#3#3#3#3#3#3#3#3#11#11 +#11#3#3#3#3#3#3#3#3#3#3#3#11#11#11#11#11#11#11#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 ,#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#18#18#18#8#8#8#18#18#18#9#14#3#3#3#3#3#18#18#18#8#8#8#18#18#18#9#14#3#3 +#3#3#3#3#3#3#8#14#14#14#19#3#3#3#3#3#3#3#3#3#3#3#8#14#14#14#19#3#3#3#3#3#3#3 +#3#3#3#3#11#11#11#11#11#3#3#3#3#3#3#3#3#3#3#3#11#11#11#11#11#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#18#18#8#8#8#8#18#18#18#9#14#3#3#3#3#3#18#18#18#8#8#8#8 +#18#18#9#14#3#3#3#3#3#3#3#3#8#14#14#14#19#3#3#3#3#3#3#3#3#3#3#3#8#14#14#14#19 +#3#3#3#3#3#3#3#3#3#3#11#11#11#11#11#11#11#3#3#3#3#3#3#3#3#3#3#3#11#11#11#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#18#18#18#8#8#8#18#18#18#11#15#3#3#3#3#3#18 +#18#18#8#8#8#18#18#18#11#15#3#3#3#3#3#3#3#8#14#14#14#14#14#19#3#3#3#3#3#3#3#3 +#3#3#3#8#14#19#3#3#3#3#3#3#3#3#3#3#11#11#11#11#11#11#11#11#11#3#3#3#3#3#3#3#3 +#3#3#3#11#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#18#18#18#18#8#8#18#18#18#12 +#17#3#3#3#3#3#18#18#18#8#8#18#18#18#18#12#17#3#3#3#3#3#3#3#8#14#14#14#14#14 +#19#3#3#3#3#3#3#3#3#3#3#3#8#14#19#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#18#18#18#18#8#18 +#18#12#17#3#3#3#3#3#3#3#18#18#8#18#18#18#18#12#17#3#3#3#3#3#3#3#8#8#8#8#8#8#8 +#8#19#3#3#3#3#3#3#3#3#3#3#3#19#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#18#18#18#18#18 +#15#17#3#3#3#3#3#3#3#3#3#18#18#18#18#18#15#17#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#4#5#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#13#13#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1 +#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#13#13#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#16#1#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6#6 +#6#6#6#6#6#6#6#6#2#16#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3 +#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#1#6#7#7#7#7#7#7 +#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7#7 +#6#1 ]); LazarusResources.Add('VT_XP','BMP',[ 'BM8K'#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#144#1#0#0#16#0#0#0#1#0#24#0#0#0#0#0#0#0#0 +#0#18#11#0#0#18#11#0#0#0#0#0#0#0#0#0#0#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#238#231#223#233#224#214#231#221#211 +#233#224#214#238#231#223#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#238#231#223#233 +#224#214#231#221#211#233#224#214#238#231#223#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#238#231#223#233#224#214#231#221#211#233#224#214#238#231#223#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 ,#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#238#231#223#233#224#214#231#221#211#233 +#224#214#238#231#223#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#238#231#223#233#224 +#214#231#221#211#233#224#214#238#231#223#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#238#231#223#233#224#214#231#221#211#233#224#214#238#231#223#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#225#217#237'_'#140'y#oL'#6'b7'#6 +'b7'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#24'iDX'#138't'#238#244#250#255 +#0#255#236#216#223'_'#140'y#oL'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#6 +'b7'#6'b7'#24'iDX'#138't'#248#241#243#255#0#255#225#217#237'_'#140'y#oL'#6'b' +'7'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#24'iDX'#138't'#238#244 +#250#255#0#255#255#255#255#184#196#202#184#196#202#184#196#202#184#196#202 +#184#196#202#184#196#202#184#196#202#184#196#202#184#196#202#184#196#202#184 +#196#202#184#196#202#184#196#202#255#255#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#226#214#201#220#206#191#217#202#186#216#201#184#217#202#186#220 +#206#191#226#214#201#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#224#212#198#217#201#185#213#196#178#211 +#194#175#213#196#178#217#201#185#224#212#198#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#226#214#201#220 +#206#191#217#202#186#216#201#184#217#202#186#220#206#191#226#214#201#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#226#214#201#220#206#191#217#202#186#216#201#184#217#202 +#186#220#206#191#226#214#201#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#226#214#201#220#206#191#217#202 +#186#216#201#184#217#202#186#220#206#191#226#214#201#255#0#255#255#0#255#255 +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#226#214 +#201#220#206#191#217#202#186#216#201#184#217#202#186#220#206#191#226#214#201 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 ,#255'V'#17#0'V'#17#0'U'#19#0'U'#16#0'V'#17#0'R'#14#1'W'#16#2'T'#18#0'U'#15#2 +'U'#16#0'W'#18#0'T'#18#0'V'#17#0#255#0#255#255#0#255#255#0#255'W'#19#0'W'#18 +#1'Y'#19#2'^'#18#0'W'#20#0'V'#18#0'W'#18#1'V'#17#0'W'#19#0'X'#17#3'U'#21#0'Z' +#21#2'X'#18#1#255#0#255#255#0#255#255#0#255'V'#19#0'T'#19#4'W'#18#1'W'#18#1 +'Z'#18#0'X'#19#0'W'#17#0'W'#18#0'Z'#18#1'X'#19#0'V'#22#0'W'#18#0'X'#20#1#255 +#0#255#255#0#255#255#0#255#168#183#185#170#183#185#171#184#186#169#184#186 +#168#183#185#170#183#185#169#182#184#168#183#185#169#184#187#170#183#185#171 +#184#186#168#183#185#168#183#185#255#0#255#255#0#255#255#0#255'W'#18#0'U'#18 +#3'R'#19#0'V'#18#0'U'#19#0'U'#15#0'U'#19#0'T'#18#0'S'#17#0'Y'#17#0'T'#18#0'U' +#16#1'V'#19#0#255#0#255#255#0#255#255#0#255'U'#17#4'Y'#20#0'W'#20#0'Y'#16#2 +'U'#17#0'Z'#17#3'V'#15#1'Z'#19#0'U'#19#1'U'#17#0'X'#18#1'X'#20#1'Y'#17#0#255 +#0#255#255#0#255#255#0#255'X'#19#0'U'#19#0'X'#18#1'W'#20#0'U'#16#1'X'#19#0'X' +#18#1'U'#19#0'Y'#17#0'X'#21#0'V'#18#0'U'#19#0'Y'#20#1#255#0#255#255#0#255#255 +#0#255#168#183#185#170#183#185#171#183#183#170#183#185#171#184#186#169#182 +#184#170#183#185#169#185#184#169#182#184#170#183#185#168#183#185#167#182#184 +#170#183#185#255#0#255#255#0#255#255#0#255'W'#18#0'U'#18#3'R'#19#0'V'#18#0'U' +#19#0'U'#15#0'U'#19#0'T'#18#0'S'#17#0'Y'#17#0'T'#18#0'U'#16#1'V'#19#0#255#0 +#255#255#0#255#255#0#255'U'#17#4'Y'#20#0'W'#20#0'Y'#16#2'U'#17#0'Z'#17#3'V' +#15#1'Z'#19#0'U'#19#1'U'#17#0'X'#18#1'X'#20#1'Y'#17#0#255#0#255#255#0#255#255 +#0#255'X'#19#0'U'#19#0'X'#18#1'W'#20#0'U'#16#1'X'#19#0'X'#18#1'U'#19#0'Y'#17 +#0'X'#21#0'V'#18#0'U'#19#0'Y'#20#1#255#0#255#255#0#255#255#0#255#168#183#185 +#170#183#185#171#183#183#170#183#185#171#184#186#169#182#184#170#183#185#169 +#185#184#169#182#184#170#183#185#168#183#185#167#182#184#170#183#185#255#0 +#255#255#0#255#255#0#255'N'#131'lD}c'#152#178#199#184#209#227#184#209#227#184 +#209#227#184#209#227#184#209#227#184#209#227#184#209#227#183#209#226#182#208 +#226#164#177#201'B|aU'#136'r'#255#0#255'N'#131'ludu%r'#207'%r'#207'%r'#207'%' +'r'#207'%r'#207'%r'#207'%r'#207'%r'#207'%r'#207'%r'#207'%r'#207'rbsU'#136'r' +#255#0#255'N'#131'lG'#130'f'#166#203#216#226#243#246#228#244#248#228#244#248 +#228#244#248#228#244#248#228#244#248#228#244#248#228#245#248#229#245#248#190 +#218#228'H'#132'iU'#136'r'#255#0#255#184#196#202#201#211#217#221#231#235#233 +#242#246#233#242#246#233#242#246#233#242#246#233#242#246#233#242#246#233#242 +#246#233#242#246#233#242#246#225#235#239#201#211#217#184#196#202#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#223#210#196#185#153#131#154'jN'#129'D#q,'#8#129'D#'#154 +'jN'#185#153#131#223#210#196#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#220#205#190#181#147'{'#151'eH'#127'A'#31'q,'#7#127 +'A'#31#151'eH'#181#147'{'#220#205#190#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#223#210#196#185#153#131#154'jN'#129'D#q,'#8 +#129'D#'#154'jN'#185#153#131#223#210#196#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#213#221#222#197#208 +#210#188#200#203#197#208#210#213#221#222#233#237#238#255#0#255#255#0#255#255 +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#223#210#196#185#153 +#131#154'jN'#129'D#q,'#8#129'D#'#154'jN'#185#153#131#223#210#196#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#223#210#196#185 +#153#131#154'jN'#129'D#q,'#8#129'D#'#154'jN'#185#153#131#223#210#196#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#223#210#196 +#185#153#131#154'jN'#129'D#q,'#8#129'D#'#154'jN'#185#153#131#223#210#196#255 +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#208#216#215#190#201#199#180#192#190#190#201#199#208#216#215#230 +#234#234#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255'V'#17#0#244#249#247#248#247#251#248#248#248#248#248#248#251#249#249#247 +#248#246#248#248#248#247#249#249#248#248#248#245#247#248#248#247#249'V'#17#0 +#255#0#255#255#0#255#255#0#255'U'#20#0#136#195#251#132#193#249#130#194#248 +#135#195#249#135#195#249#132#199#244#138#195#250#132#196#244#136#191#252#130 +#195#246#132#197#248'X'#20#0#255#0#255#255#0#255#255#0#255'Z'#18#0#201#210 +#213#197#211#210#198#210#210#198#210#214#196#208#208#198#212#211#198#209#213 +#199#211#213#198#209#213#197#211#210#200#213#211'V'#20#2#255#0#255#255#0#255 +#255#0#255#167#182#184#226#239#241#227#239#241#225#238#240#225#238#240#225 +#237#239#226#239#241#225#238#240#225#238#240#226#238#240#226#238#240#227#240 +#242#169#182#184#255#0#255#255#0#255#255#0#255'V'#17#0#251#249#248#250#248 +#247#245#247#247#244#250#245#248#249#247#250#248#248#248#247#249#247#249#250 +#247#246#248#250#248#247#249#247#246'V'#17#2#255#0#255#255#0#255#255#0#255'X' +#18#1#133#196#246#130#194#249#132#195#245#137#196#246#138#196#248#135#198#248 ,#132#197#248#136#196#250#133#192#248#136#196#250#132#195#246'Z'#20#0#255#0 +#255#255#0#255#255#0#255'W'#18#1#197#213#212#198#210#216#197#210#208#199#210 +#214#199#211#213#196#208#212#200#210#210#192#210#209#197#209#211#200#211#215 +#199#211#213'X'#18#1#255#0#255#255#0#255#255#0#255#170#183#185#227#239#239 +#227#237#237#226#238#238#226#238#240#227#239#241#225#237#239#226#240#239#227 +#239#241#227#239#241#225#238#240#226#239#241#171#184#186#255#0#255#255#0#255 +#255#0#255'V'#17#0#251#249#248#250#248#247#245#247#247#244#250#245#248#249 +#247#250#248#248#248#247#249#247#249#250#247#246#248#250#248#247#249#247#246 +'V'#17#2#255#0#255#255#0#255#255#0#255'X'#18#1#133#196#246#130#194#249#132 +#195#245#137#196#246#138#196#248#135#198#248#132#197#248#136#196#250#133#192 +#248#136#196#250#132#195#246'Z'#20#0#255#0#255#255#0#255#255#0#255'W'#18#1 +#197#213#212#198#210#216#197#210#208#199#210#214#199#211#213#196#208#212#200 +#210#210#192#210#209#197#209#211#200#211#215#199#211#213'X'#18#1#255#0#255 +#255#0#255#255#0#255#170#183#185#227#239#239#227#237#237#226#238#238#226#238 +#240#227#239#241#225#237#239#226#240#239#227#239#241#227#239#241#225#238#240 +#226#239#241#171#184#186#255#0#255#255#0#255#255#0#255#24'iD'#179#200#215#201 +#225#236#200#224#234#200#224#235#201#225#236#201#225#236#201#225#236#201#225 +#236#201#225#236#200#224#235#198#221#234#193#216#230#170#185#205#24'iD'#255#0 +#255#24'iDc'#153#221'O'#145#227'O'#145#227'N'#144#227'O'#145#227'O'#145#227 +'O'#145#227'O'#145#227'O'#145#227'O'#145#227'O'#145#227'O'#145#227'a'#152#219 +#24'iD'#255#0#255#24'iD'#176#196#212#211#233#238#216#236#242#217#237#242#217 +#237#242#216#236#242#216#236#242#216#236#242#217#237#242#217#237#242#219#238 +#243#221#238#244#183#208#222#24'iD'#255#0#255#184#196#202#225#235#239#233#242 +#246#233#242#246#233#242#246#233#242#246#233#242#246#233#242#246#233#242#246 +#233#242#246#233#242#246#233#242#246#233#242#246#225#235#239#184#196#202#255 +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#213#195#179#162'v['#150'dH'#192#162#143#228#215#207#249#247 +#245#228#215#207#192#162#143#150'dH'#162'v['#213#195#179#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#210#190#173#158'pT'#129'g`~'#147#176'q'#167 +#223'c'#171#243'q'#167#223'~'#147#176#129'g`'#158'pT'#210#190#173#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#213#195#179#162'v['#150'kR'#180#161 +#147#196#192#187#200#203#203#196#192#187#180#161#147#150'kR'#162'v['#213#195 +#179#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#217#224#226 +#208#217#219#228#233#234#244#246#247#254#254#254#244#246#247#228#233#234#208 +#217#219#217#224#226#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#213#195#179#162'v['#150'dH'#192#162#143#228#215#207#249#247#245#228#215 +#207#192#162#143#150'dH'#162'v['#213#195#179#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#213#195#179#162'v['#150'dH'#192#162#143#228#215#207#249 +#247#245#228#215#207#192#162#143#150'dH'#162'v['#213#195#179#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#213#195#179#162'v['#150'dH'#192#162#143 +#228#215#207#249#247#245#228#215#207#192#162#143#150'dH'#162'v['#213#195#179 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#213#220#219#203 +#212#210#225#230#229#243#245#245#253#254#254#243#245#245#225#230#229#203#212 +#210#213#220#219#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +'V'#17#0#246#248#249#248#248#248#246#249#247#248#248#248#249#247#247#249#248 +#250#246#248#249#250#248#248#246#248#248#248#249#247#249#249#249'V'#17#0#255 +#0#255#255#0#255#255#0#255'Y'#20#1#129#195#246#248#248#248#244#249#247#245 +#247#247#249#248#252#249#246#248#250#249#245#244#249#248#248#247#249#250#248 +#248#133#196#246'W'#18#3#255#0#255#255#0#255#255#0#255'W'#18#1#197#209#213 +#195#208#210#196#205#209#194#204#211#194#205#209#196#205#209#193#207#206#194 +#206#208#195#208#210#195#207#209#199#210#214'W'#18#1#255#0#255#255#0#255#255 +#0#255#170#183#185#224#237#239#225#237#239#225#237#239#224#236#238#225#237 +#239#224#236#238#223#236#238#225#237#239#224#236#238#224#236#236#226#238#238 +#170#183#185#255#0#255#255#0#255#255#0#255'T'#18#0#245#247#247#248#248#248 +#248#248#248#245#248#252#251#247#252#248#247#249#250#248#247#246#248#248#248 +#249#245#246#248#248#243#248#246'V'#17#0#255#0#255#255#0#255#255#0#255'X'#19 +#0#134#197#248#250#249#245#245#247#247#244#249#248#244#249#247#251#247#252 +#246#248#248#246#250#245#246#248#248#249#247#247#132#196#250'W'#19#0#255#0 +#255#255#0#255#255#0#255'X'#21#0#199#210#214#195#205#212#197#209#211#202#208 +#207#196#209#211#203#208#211#196#205#209#194#207#209#202#205#213#194#206#210 +#200#213#215'Z'#18#0#255#0#255#255#0#255#255#0#255#168#183#186#224#237#239 +#225#237#237#225#237#237#225#237#239#227#239#241#227#239#241#225#238#240#224 +#236#238#224#236#238#227#239#241#226#239#241#169#182#184#255#0#255#255#0#255 ,#255#0#255'T'#18#0#245#247#247#248#248#248#248#248#248#245#248#252#251#247 +#252#248#247#249#250#248#247#246#248#248#248#249#245#246#248#248#243#248#246 +'V'#17#0#255#0#255#255#0#255#255#0#255'X'#19#0#134#197#248#250#249#245#245 +#247#247#244#249#248#244#249#247#251#247#252#246#248#248#246#250#245#246#248 +#248#249#247#247#132#196#250'W'#19#0#255#0#255#255#0#255#255#0#255'X'#21#0 +#199#210#214#195#205#212#197#209#211#202#208#207#196#209#211#203#208#211#196 +#205#209#194#207#209#202#205#213#194#206#210#200#213#215'Z'#18#0#255#0#255 +#255#0#255#255#0#255#168#183#186#224#237#239#225#237#237#225#237#237#225#237 +#239#227#239#241#227#239#241#225#238#240#224#236#238#224#236#238#227#239#241 +#226#239#241#169#182#184#255#0#255#255#0#255#255#0#255#6'b7'#225#243#246#224 +#243#246#224#243#246#224#243#246#224#243#246#224#243#246#224#243#246#224#243 +#246#224#243#246#224#243#246#222#241#246#214#235#242#204#228#238#6'b7'#255#0 +#255#6'b7X'#150#227'X'#150#227#224#242#245#224#242#245#224#242#245#224#242 +#245#224#242#245#224#242#245#224#242#245#224#242#245#222#240#245'X'#150#227 +'V'#149#227#6'b7'#255#0#255#6'b7'#190#213#227#197#220#231#201#225#234#202#226 +#234#202#226#234#202#226#234#202#226#234#202#226#234#202#226#234#202#226#234 +#203#227#235#206#228#236#207#229#237#6'b7'#255#0#255#184#196#202#233#242#246 +#233#242#246#233#242#246#233#242#246#233#242#246#233#242#246#233#242#246#233 +#242#246#233#242#246#233#242#246#233#242#246#233#242#246#233#242#246#184#196 +#202#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#226#214#201#161'tY'#178#141'v'#249#248#245#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#249#248#245#178#141'v'#161'tY'#226 +#214#201#255#0#255#255#0#255#255#0#255#224#212#198#158'pT'#136#135#143'~'#180 +#234#179#210#240#223#235#247#250#250#251#223#235#247#179#210#240'~'#180#234 +#136#135#143#158'pT'#224#212#198#255#0#255#255#0#255#255#0#255#226#214#201 +#161'tY'#173#144'}'#207#210#209#202#206#207#202#206#207#202#206#207#202#206 +#207#202#206#207#207#210#209#173#144'}'#161'tY'#226#214#201#255#0#255#255#0 +#255#255#0#255#255#0#255#217#224#226#224#229#231#254#254#254#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#254#254#254#224#229#231#217#224 +#226#255#0#255#255#0#255#255#0#255#255#0#255#226#214#201#161'tY'#178#141'v' +#248#245#242#247#243#240#237#230#223#233#225#215#237#230#223#247#243#240#248 +#245#242#178#141'v'#161'tY'#226#214#201#255#0#255#255#0#255#255#0#255#226#214 +#201#161'tY'#178#141'v'#248#245#242#247#243#240#237#230#223#233#225#215#237 +#230#223#247#243#240#248#245#242#178#141'v'#161'tY'#226#214#201#255#0#255#255 +#0#255#255#0#255#226#214#201#161'tY'#178#141'v'#248#245#242#247#243#240#237 +#230#223#233#225#215#237#230#223#247#243#240#248#245#242#178#141'v'#161'tY' +#226#214#201#255#0#255#255#0#255#255#0#255#255#0#255#213#220#219#220#226#225 +#254#254#254#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#254 +#254#254#220#226#225#213#220#219#255#0#255#255#0#255#255#0#255#255#0#255#255 +#0#255'V'#17#0#246#248#249#248#249#247#250#247#249#249#248#250#250#246#245 +#246#248#249#250#248#247#246#248#248#250#247#249#249#249#249#249#248#250'V' +#17#0#255#0#255#255#0#255#255#0#255'X'#19#2#133#193#247#249#249#249#252#247 +#248#250#248#247#247#248#246#252#247#249#243#248#247#248#249#247#248#248#248 +#249#250#246#130#194#249'['#19#1#255#0#255#255#0#255#255#0#255'V'#17#0#195 +#210#213#195#207#207#194#204#204#193#206#204#195#206#203#197#205#204#193#204 +#208#194#205#209#192#204#208#196#208#208#198#209#213'Z'#19#0#255#0#255#255#0 +#255#255#0#255#168#183#185#224#237#239#226#238#240#224#236#238#224#236#238 +#224#236#238#225#237#239#223#236#238#224#236#238#225#237#239#225#237#237#225 +#237#239#171#184#186#255#0#255#255#0#255#255#0#255'U'#15#2#245#251#246#250 +#246#251#249#249#249#247#247#247#2#134#0#248#247#249#244#249#247#247#249#250 +#246#245#247#252#248#247#250#246#251'V'#18#0#255#0#255#255#0#255#255#0#255'X' +#20#1#135#191#250#248#247#249#250#246#251#246#248#248#0#135#0#247#247#247#249 +#246#248#247#250#248#248#247#249#247#248#246#129#195#248'X'#19#0#255#0#255 +#255#0#255#255#0#255'W'#18#3#196#210#209#200#208#208#203#210#207#200#208#215 +#0'e'#3#205#208#216#198#207#211#198#204#209#193#206#204#194#207#215#197#211 +#210'Y'#20#0#255#0#255#255#0#255#255#0#255#169#184#187#227#239#241#225#237 +#237#226#238#238#228#240#242#161#173#175#226#238#240#227#239#241#225#238#240 +#225#237#239#224#237#239#224#237#239#171#184#186#255#0#255#255#0#255#255#0 +#255'U'#15#2#245#251#246#250#246#251#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0 +#0#139#0#0#139#0#252#248#247#250#246#251'V'#18#0#255#0#255#255#0#255#255#0 +#255'X'#20#1#135#191#250#248#247#249#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0 +#0#139#0#0#139#0#247#248#246#129#195#248'X'#19#0#255#0#255#255#0#255#255#0 +#255'W'#18#3#196#210#209#200#208#208#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0 ,#0#139#0#0#139#0#194#207#215#197#211#210'Y'#20#0#255#0#255#255#0#255#255#0 +#255#169#184#187#227#239#241#225#237#237#163#176#178#163#176#178#163#176#178 +#163#176#178#163#176#178#163#176#178#163#176#178#224#237#239#224#237#239#171 +#184#186#255#0#255#255#0#255#255#0#255#6'b7'#226#244#247#226#244#247#225#243 +#246#225#243#246#225#243#246#225#243#246#154#154#154#225#243#246#225#243#246 +#225#243#246#223#242#246#216#237#242#207#228#238#6'b7'#255#0#255#6'b7\'#153 +#228']'#154#229#225#242#245#225#242#245#225#242#245#225#242#245#154#154#154 +#225#242#245#225#242#245#225#242#245#223#241#245'\'#153#228'\'#153#228#6'b7' +#255#0#255#6'b7'#189#212#226#196#219#230#201#225#234#202#226#234#202#226#234 +#202#226#234#154#154#154#202#226#234#202#226#234#202#226#234#203#226#234#204 +#228#236#206#228#236#6'b7'#255#0#255#184#196#202#233#242#246#233#242#246#233 +#242#246#233#242#246#233#242#246#233#242#246#154#154#154#233#242#246#233#242 +#246#233#242#246#233#242#246#233#242#246#233#242#246#184#196#202#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#185#153#131#147'_A'#241#236#229#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#241#236#229#147'_A'#185#153#131#255 +#0#255#255#0#255#255#0#255#183#150#127#128'f^{'#176#228#220#228#236#254#254 +#253#255#255#255#255#255#255#255#255#255#254#254#253#220#228#236'{'#176#228 +#128'f^'#183#150#127#255#0#255#255#0#255#255#0#255#185#153#131#147'fL'#202 +#203#199#202#206#207#202#206#207#202#206#207#202#206#207#202#206#207#202#206 +#207#202#206#207#202#203#199#147'fL'#185#153#131#255#0#255#255#0#255#255#0 +#255#233#237#238#208#217#219#254#254#254#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#254#254#254#208#217#219#255 +#0#255#255#0#255#255#0#255#255#0#255#185#153#131#147'_A'#241#236#229#247#243 +#240#227#216#204#214#198#181#211#194#175#214#198#181#227#216#204#247#243#240 +#241#236#229#147'_A'#185#153#131#255#0#255#255#0#255#255#0#255#185#153#131 +#147'_A'#241#236#229#247#243#240#227#216#204#214#198#181#211#194#175#214#198 +#181#227#216#204#247#243#240#241#236#229#147'_A'#185#153#131#255#0#255#255#0 +#255#255#0#255#185#153#131#147'_A'#241#236#229#247#243#240#227#216#204#214 +#198#181#211#194#175#214#198#181#227#216#204#247#243#240#241#236#229#147'_A' +#185#153#131#255#0#255#255#0#255#255#0#255#230#234#234#203#212#210#254#254 +#254#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#254#254#254#203#212#210#230#234#234#255#0#255#255#0#255#255#0 +#255#255#0#255'V'#17#0#246#248#248#248#249#247#246#248#248#250#248#247#249 +#250#246#246#248#249#250#248#248#245#248#246#248#249#247#248#249#247#249#247 +#247'V'#17#0#255#0#255#255#0#255#255#0#255'S'#16#1#130#196#245#244#246#246 +#252#249#245#248#248#248#244#249#247#250#248#248#248#247#249#248#248#248#250 +#248#247#246#248#248#131#197#246'X'#19#0#255#0#255#255#0#255#255#0#255'W'#18 +#0#198#209#213#195#208#210#201#206#207#199#204#205#195#204#207#197#205#204 +#193#205#205#196#204#204#197#204#207#197#206#209#197#209#213'X'#20#1#255#0 +#255#255#0#255#255#0#255#167#182#184#224#237#239#224#236#238#224#236#238#224 +#237#239#223#235#237#226#238#240#223#236#238#225#237#239#224#236#238#224#237 +#239#228#240#242#170#183#185#255#0#255#255#0#255#255#0#255'V'#15#1#245#250 +#248#248#248#248#249#247#246#1#137#1#0#141#2#0#135#0#246#248#249#251#248#243 +#249#249#249#250#247#249#246#247#251'W'#17#0#255#0#255#255#0#255#255#0#255'Y' +#17#0#130#194#248#252#247#248#251#250#246#0#135#0#1#135#0#3#134#0#248#249#247 +#245#247#247#245#247#248#247#249#249#134#193#249'Z'#18#0#255#0#255#255#0#255 +#255#0#255'Z'#19#0#198#211#213#198#208#215#202#209#212#2'e'#1#1'j'#3#2'f'#0 +#204#209#212#196#209#211#195#204#208#195#207#209#196#210#208'X'#18#1#255#0 +#255#255#0#255#255#0#255#169#184#186#224#237#239#226#238#238#227#239#239#163 +#175#177#165#177#179#164#176#178#227#239#241#225#238#240#226#238#240#224#236 +#238#227#239#241#170#183#185#255#0#255#255#0#255#255#0#255'V'#15#1#245#250 +#248#248#248#248#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#250 +#247#249#246#247#251'W'#17#0#255#0#255#255#0#255#255#0#255'Y'#17#0#130#194 +#248#252#247#248#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#247 +#249#249#134#193#249'Z'#18#0#255#0#255#255#0#255#255#0#255'Z'#19#0#198#211 +#213#198#208#215#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#195 +#207#209#196#210#208'X'#18#1#255#0#255#255#0#255#255#0#255#169#184#186#224 +#237#239#226#238#238#163#176#178#163#176#178#163#176#178#163#176#178#163#176 +#178#163#176#178#163#176#178#224#236#238#227#239#241#170#183#185#255#0#255 +#255#0#255#255#0#255#6'b7'#227#245#248#227#245#248#226#244#247#226#244#247 +#226#244#247#154#154#154#154#154#154#154#154#154#226#244#247#226#244#247#225 +#243#246#217#238#243#208#229#238#6'b7'#255#0#255#6'b7c'#158#229'c'#158#229 ,#226#243#246#226#243#246#226#243#246#154#154#154#154#154#154#154#154#154#226 +#243#246#226#243#246#225#242#245'c'#158#229'b'#157#229#6'b7'#255#0#255#6'b7' +#189#211#227#197#219#231#202#225#234#203#226#235#203#226#235#154#154#154#154 +#154#154#154#154#154#203#226#235#203#226#235#204#226#235#206#227#236#206#228 +#237#6'b7'#255#0#255#184#196#202#233#242#246#233#242#246#233#242#246#233#242 +#246#233#242#246#154#154#154#154#154#154#154#154#154#233#242#246#233#242#246 +#233#242#246#233#242#246#233#242#246#184#196#202#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#152'hK'#181#147 +'}'#250#247#245#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#250#247#245#181#147'}'#152'hK'#255#0#255#255#0#255 +#255#0#255#151'eHz'#143#170#170#196#223#250#248#246#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#250#248#246#170#196#223'z'#143#170#151 +'eH'#255#0#255#255#0#255#255#0#255#152'hK'#172#150#134#199#202#202#202#206 +#207#202#206#207#202#206#207#202#206#207#202#206#207#202#206#207#202#206#207 +#199#202#202#172#150#134#152'hK'#255#0#255#255#0#255#255#0#255#213#221#222 +#228#233#234#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#228#233#234#213#221#222#255#0 +#255#255#0#255#255#0#255#152'hK'#181#147'}'#250#247#245#237#230#223#170#187 +#145'V'#162'K'#24#148#28'V'#162'K'#170#187#145#237#230#223#250#247#245#181 +#147'}'#152'hK'#255#0#255#255#0#255#255#0#255#152'hK'#181#147'}'#250#247#245 +#237#230#223#170#187#145'V'#162'K'#24#148#28'V'#162'K'#170#187#145#237#230 +#223#250#247#245#181#147'}'#152'hK'#255#0#255#255#0#255#255#0#255#152'hK'#181 +#147'}'#250#247#245#237#230#223#170#187#145'V'#162'K'#24#148#28'V'#162'K'#170 +#187#145#237#230#223#250#247#245#181#147'}'#152'hK'#255#0#255#255#0#255#255#0 +#255#208#216#215#225#230#229#255#255#255#255#255#255#238#241#241#207#215#214 +#183#195#193#207#215#214#238#241#241#255#255#255#255#255#255#225#230#229#208 +#216#215#255#0#255#255#0#255#255#0#255#255#0#255'V'#17#0#245#244#246#244#243 +#245#246#244#244#241#245#246#251#246#247#248#248#248#248#247#249#248#248#248 +#247#246#248#250#248#248#246#249#247'V'#17#0#255#0#255#255#0#255#255#0#255'Z' +#18#0#129#193#248#247#246#248#244#246#246#246#245#249#249#249#249#243#248#247 +#253#248#250#246#248#249#252#247#248#247#249#249#133#194#250'V'#19#0#255#0 +#255#255#0#255#255#0#255'X'#18#1#195#209#208#193#205#205#194#203#206#193#205 +#205#194#204#204#193#206#204#196#203#206#193#206#204#195#204#208#195#206#210 +#198#210#212'X'#19#0#255#0#255#255#0#255#255#0#255#168#183#185#225#238#240 +#225#237#239#224#237#239#222#235#237#224#236#238#224#236#238#224#236#238#224 +#236#238#224#236#238#223#236#238#226#238#240#171#184#186#255#0#255#255#0#255 +#255#0#255'T'#17#2#246#248#249#254#246#246#3#136#2#0#139#0#0#137#0#0#140#0#4 +#136#0#247#248#246#249#248#250#251#249#249#245#249#244'W'#18#0#255#0#255#255 +#0#255#255#0#255'W'#18#1#132#194#248#246#250#245#0#136#1#3#138#0#0#137#0#0 +#141#0#0#135#0#249#247#247#251#251#245#249#246#248#134#197#248'['#20#0#255#0 +#255#255#0#255#255#0#255'W'#17#0#195#208#216#200#206#211#0'g'#0#0'i'#2#0'j'#0 +#3'k'#0#1'g'#2#203#208#217#200#206#211#197#207#207#198#207#216'X'#19#0#255#0 +#255#255#0#255#255#0#255#168#183#185#226#239#241#225#237#237#161#173#173#163 +#176#178#163#176#178#163#176#178#163#177#176#227#240#242#226#238#240#226#238 +#240#226#238#240#170#183#185#255#0#255#255#0#255#255#0#255'T'#17#2#246#248 +#249#254#246#246#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#251 +#249#249#245#249#244'W'#18#0#255#0#255#255#0#255#255#0#255'W'#18#1#132#194 +#248#246#250#245#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#249 +#246#248#134#197#248'['#20#0#255#0#255#255#0#255#255#0#255'W'#17#0#195#208 +#216#200#206#211#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#197 +#207#207#198#207#216'X'#19#0#255#0#255#255#0#255#255#0#255#168#183#185#226 +#239#241#225#237#237#163#176#178#163#176#178#163#176#178#163#176#178#163#176 +#178#163#176#178#163#176#178#226#238#240#226#238#240#170#183#185#255#0#255 +#255#0#255#255#0#255#6'b7'#228#245#248#228#245#248#227#244#247#227#244#247 +#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#227#244#247#226 +#243#246#218#238#243#210#229#238#6'b7'#255#0#255#6'b7j'#162#230'j'#162#230 +#227#243#246#227#243#246#154#154#154#154#154#154#154#154#154#154#154#154#154 +#154#154#227#243#246#226#242#245'j'#162#230'j'#162#230#6'b7'#255#0#255#6'b7' +#190#211#227#198#219#231#203#225#234#204#226#235#154#154#154#154#154#154#154 +#154#154#154#154#154#154#154#154#204#226#235#207#226#235#208#227#236#207#228 +#237#6'b7'#255#0#255#184#196#202#233#242#246#233#242#246#233#242#246#233#242 +#246#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#233#242#246 +#233#242#246#233#242#246#233#242#246#184#196#202#255#0#255#255#0#255#255#0 ,#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#127'B '#210#189 +#173#252#251#250#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#252#251#250#210#189#173#127'B '#255#0#255#255#0#255 +#255#0#255#127'A'#31'k'#159#213#207#213#218#253#252#251#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#253#252#251#207#213#218'k'#159#213 +#127'A'#31#255#0#255#255#0#255#255#0#255#127'B '#185#176#167#200#204#204#202 +#206#207#202#206#207#202#206#207#202#206#207#202#206#207#202#206#207#202#206 +#207#200#204#204#185#176#167#127'B '#255#0#255#255#0#255#255#0#255#197#208 +#210#244#246#247#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#244#246#247#197#208#210#255 +#0#255#255#0#255#255#0#255#127'B '#210#189#173#252#251#250#233#225#215'W'#164 +'M'#13#146#19#13#146#19#13#146#19'W'#164'M'#233#225#215#252#251#250#210#189 +#173#127'B '#255#0#255#255#0#255#255#0#255#127'B '#210#189#173#252#251#250 +#233#225#215'W'#164'M'#13#146#19#13#146#19#13#146#19'W'#164'M'#233#225#215 +#252#251#250#210#189#173#127'B '#255#0#255#255#0#255#255#0#255#127'B '#210 +#189#173#252#251#250#233#225#215'W'#164'M'#13#146#19#13#146#19#13#146#19'W' +#164'M'#233#225#215#252#251#250#210#189#173#127'B '#255#0#255#255#0#255#255#0 +#255#190#201#199#243#245#245#255#255#255#255#255#255#207#215#214#178#191#189 +#178#191#189#178#191#189#207#215#214#255#255#255#255#255#255#243#245#245#190 +#201#199#255#0#255#255#0#255#255#0#255#255#0#255'V'#17#0#242#242#242#239#241 +#241#241#240#244#238#244#243#244#244#244#245#246#244#245#244#246#247#246#248 +#248#247#249#245#248#246#248#247#249'V'#17#0#255#0#255#255#0#255#255#0#255'Z' +#18#1#132#189#250#236#240#241#239#241#241#244#242#242#244#244#244#245#244#246 +#239#246#243#251#248#250#252#247#246#242#249#244#135#197#251'W'#19#0#255#0 +#255#255#0#255#255#0#255'W'#19#0#191#206#209#191#204#206#193#204#202#194#205 +#203#196#203#206#191#205#203#197#204#207#193#205#207#193#205#207#196#206#206 +#202#208#213'W'#18#0#255#0#255#255#0#255#255#0#255#169#182#184#225#239#238 +#225#237#239#224#236#238#225#237#239#226#237#241#225#237#239#224#236#238#225 +#237#239#226#238#238#224#236#238#227#239#241#167#183#182#255#0#255#255#0#255 +#255#0#255'W'#18#0#240#243#247#240#243#248#1#135#0#2#135#1#254#249#248#0#137 +#0#0#137#0#0#137#0#247#248#246#246#247#251#247#249#249'V'#16#0#255#0#255#255 +#0#255#255#0#255'W'#18#0#129#188#250#246#245#249#0#137#0#2#136#0#248#249#247 +#1#133#3#1#137#1#0#137#0#244#247#251#246#249#247#137#199#247'U'#19#0#255#0 +#255#255#0#255#255#0#255'W'#18#1#192#205#213#203#208#209#2'e'#1#0'g'#0#208 +#210#218#4'g'#0#0'i'#2#2'e'#1#204#211#214#196#209#207#200#209#212'W'#20#0#255 +#0#255#255#0#255#255#0#255#171#183#187#226#238#240#229#239#239#161#173#175 +#163#175#177#229#241#243#163#175#177#163#175#177#162#175#177#227#239#241#226 +#238#240#225#238#240#170#183#185#255#0#255#255#0#255#255#0#255'W'#18#0#240 +#243#247#240#243#248#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0 +#246#247#251#247#249#249'V'#16#0#255#0#255#255#0#255#255#0#255'W'#18#0#129 +#188#250#246#245#249#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0 +#246#249#247#137#199#247'U'#19#0#255#0#255#255#0#255#255#0#255'W'#18#1#192 +#205#213#203#208#209#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0 +#196#209#207#200#209#212'W'#20#0#255#0#255#255#0#255#255#0#255#171#183#187 +#226#238#240#229#239#239#163#176#178#163#176#178#163#176#178#163#176#178#163 +#176#178#163#176#178#163#176#178#226#238#240#225#238#240#170#183#185#255#0 +#255#255#0#255#255#0#255#6'b7'#233#249#250#233#249#250#232#250#251#154#154 +#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154 +#231#249#251#224#243#247#214#235#242#6'b7'#255#0#255#6'b7'#146#187#236#139 +#184#235#232#249#250#154#154#154#154#154#154#154#154#154#154#154#154#154#154 +#154#154#154#154#154#154#154#231#248#250#139#184#235#145#186#235#6'b7'#255#0 +#255#6'b7'#193#215#228#200#222#234#207#228#237#154#154#154#154#154#154#154 +#154#154#154#154#154#154#154#154#154#154#154#154#154#154#210#229#238#211#230 +#238#211#231#238#6'b7'#255#0#255#184#196#202#233#242#246#233#242#246#233#242 +#246#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154 +#154#154#154#233#242#246#233#242#246#233#242#246#184#196#202#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'q,'#8 +#224#211#197#250#247#245#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#250#247#245#224#211#197'q,'#8#255#0#255#255 +#0#255#255#0#255'q,'#7'^'#164#234#226#217#208#250#248#246#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#250#248#246#226#217#208'^'#164#234 +'q,'#7#255#0#255#255#0#255#255#0#255'q,'#8#187#185#178#199#202#202#202#206 ,#207#202#206#207#202#206#207#202#206#207#202#206#207#202#206#207#202#206#207 +#199#202#202#187#185#178'q,'#8#255#0#255#255#0#255#255#0#255#188#200#203#254 +#254#254#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#254#254#254#188#200#203#255#0#255 +#255#0#255#255#0#255'q,'#8#224#211#197#250#247#245#237#230#223#25#149#29#13 +#146#19#13#146#19#13#146#19#25#149#29#237#230#223#250#247#245#224#211#197'q,' +#8#255#0#255#255#0#255#255#0#255'q,'#8#224#211#197#250#247#245#237#230#223#25 +#149#29#13#146#19#13#146#19#13#146#19#25#149#29#237#230#223#250#247#245#224 +#211#197'q,'#8#255#0#255#255#0#255#255#0#255'q,'#8#224#211#197#250#247#245 +#237#230#223#25#149#29#13#146#19#13#146#19#13#146#19#25#149#29#237#230#223 +#250#247#245#224#211#197'q,'#8#255#0#255#255#0#255#255#0#255#180#192#190#253 +#254#254#255#255#255#255#255#255#183#195#193#178#191#189#178#191#189#178#191 +#189#183#195#193#255#255#255#255#255#255#253#254#254#180#192#190#255#0#255 +#255#0#255#255#0#255#255#0#255'V'#17#0#233#235#236#230#235#234#231#236#235 +#235#238#236#237#239#240#237#239#240#242#242#242#246#244#243#240#246#245#247 +#247#247#250#248#248'V'#17#0#255#0#255#255#0#255#255#0#255'U'#19#1'w'#190#240 +#234#233#235#235#233#233#231#236#235#233#239#238#239#238#240#237#241#242#238 +#245#242#243#246#244#250#246#251#134#193#249'W'#20#0#255#0#255#255#0#255#255 +#0#255'X'#18#1#192#204#206#192#201#204#194#202#202#189#202#200#190#202#202 +#193#203#203#195#202#205#196#204#203#196#203#206#192#204#208#197#208#212'Y' +#20#1#255#0#255#255#0#255#255#0#255#170#183#185#224#238#237#225#237#239#224 +#236#238#225#237#239#223#235#237#227#239#239#224#236#238#224#236#238#224#235 +#239#225#237#239#225#237#237#170#183#185#255#0#255#255#0#255#255#0#255'P'#19 +#0#229#235#242#238#237#239#3#135#0#241#240#244#246#240#245#250#243#250#1#137 +#1#0#137#0#0#136#0#244#249#247#251#249#249'V'#16#0#255#0#255#255#0#255#255#0 +#255'W'#19#0#129#188#244#234#237#241#0#133#0#243#239#244#240#243#248#245#245 +#245#4#134#3#0#140#1#2#136#0#247#247#247#136#196#248'X'#19#0#255#0#255#255#0 +#255#255#0#255'Y'#20#0#192#205#207#193#205#205#0'f'#1#195#205#212#200#205#208 +#197#203#214#0'g'#0#1'h'#0#2'f'#0#201#208#211#197#208#212'Z'#19#0#255#0#255 +#255#0#255#255#0#255#168#183#185#225#238#240#226#238#240#161#173#175#227#239 +#241#226#239#241#227#238#242#163#174#178#163#175#177#160#173#175#225#238#240 +#227#239#241#170#183#185#255#0#255#255#0#255#255#0#255'P'#19#0#229#235#242 +#238#237#239#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#244#249 +#247#251#249#249'V'#16#0#255#0#255#255#0#255#255#0#255'W'#19#0#129#188#244 +#234#237#241#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#247#247 +#247#136#196#248'X'#19#0#255#0#255#255#0#255#255#0#255'Y'#20#0#192#205#207 +#193#205#205#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#201#208 +#211#197#208#212'Z'#19#0#255#0#255#255#0#255#255#0#255#168#183#185#225#238 +#240#226#238#240#163#176#178#163#176#178#163#176#178#163#176#178#163#176#178 +#163#176#178#163#176#178#225#238#240#227#239#241#170#183#185#255#0#255#255#0 +#255#255#0#255#6'b7'#235#249#250#235#249#250#154#154#154#154#154#154#154#154 +#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154 +#225#243#247#215#235#242#6'b7'#255#0#255#6'b7'#150#190#237#139#184#235#154 +#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154 +#154#154#154#154#154#154#154#139#184#235#150#190#237#6'b7'#255#0#255#6'b7' +#193#215#228#200#222#234#154#154#154#154#154#154#154#154#154#154#154#154#154 +#154#154#154#154#154#154#154#154#154#154#154#154#154#154#211#230#238#211#231 +#238#6'b7'#255#0#255#184#196#202#233#242#246#233#242#246#154#154#154#154#154 +#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154#154 +#154#154#154#233#242#246#233#242#246#184#196#202#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#128'C!'#205#183 +#165#243#238#232#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#243#238#232#205#183#165#128'C!'#255#0#255#255#0#255 +#255#0#255#128'B l'#160#214#199#201#203#243#238#233#254#254#253#255#255#255 +#255#255#255#255#255#255#254#254#253#243#238#233#199#201#203'l'#160#214#128 +'B '#255#0#255#255#0#255#255#0#255#128'C!'#182#173#163#196#198#195#202#206 +#207#202#206#207#202#206#207#202#206#207#202#206#207#202#206#207#202#206#207 +#196#198#195#182#173#163#128'C!'#255#0#255#255#0#255#255#0#255#197#208#210 +#244#246#247#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#244#246#247#197#208#210#255#0 +#255#255#0#255#255#0#255#128'C!'#205#183#165#243#238#232#247#243#240']'#172 +'X'#13#146#19#13#146#19#13#146#19']'#172'X'#247#243#240#243#238#232#205#183 +#165#128'C!'#255#0#255#255#0#255#255#0#255#128'C!'#205#183#165#243#238#232 ,#247#243#240']'#172'X'#13#146#19#13#146#19#13#146#19']'#172'X'#247#243#240 +#243#238#232#205#183#165#128'C!'#255#0#255#255#0#255#255#0#255#128'C!'#205 +#183#165#243#238#232#247#243#240']'#172'X'#13#146#19#13#146#19#13#146#19']' +#172'X'#247#243#240#243#238#232#205#183#165#128'C!'#255#0#255#255#0#255#255#0 +#255#190#201#199#243#245#245#255#255#255#255#255#255#207#215#214#178#191#189 +#178#191#189#178#191#189#207#215#214#255#255#255#255#255#255#243#245#245#190 +#201#199#255#0#255#255#0#255#255#0#255#255#0#255'V'#17#0#227#230#234#226#230 +#231#225#229#230#229#234#233#234#235#233#231#236#235#235#237#237#235#240#239 +#241#242#240#243#242#244#247#249#249'V'#17#0#255#0#255#255#0#255#255#0#255'W' +#18#0'|'#181#243#225#227#228#227#226#228#222#230#230#230#232#232#229#231#231 +#233#235#236#233#237#238#242#237#238#241#243#243#131#194#245'W'#18#1#255#0 +#255#255#0#255#255#0#255'W'#18#0#189#203#202#188#200#200#185#199#198#188#202 +#201#188#200#202#192#201#204#191#204#202#191#204#202#190#202#204#192#204#206 +#196#210#209'W'#19#0#255#0#255#255#0#255#255#0#255#170#183#185#225#238#240 +#224#236#238#223#235#237#223#235#237#225#237#239#225#237#237#224#236#238#223 +#236#238#223#235#239#224#236#238#225#237#237#171#184#186#255#0#255#255#0#255 +#255#0#255'Z'#18#1#224#227#231#224#228#229#226#229#233#228#233#232#233#233 +#233#238#236#236#245#239#244#5#137#0#0#137#2#250#247#249#246#246#246'V'#17#2 +#255#0#255#255#0#255#255#0#255'Y'#20#1'y'#181#241#229#230#228#231#229#229#231 +#230#232#229#234#232#234#235#239#245#239#244#1#134#0#0#138#0#246#248#248#133 +#192#248'['#20#0#255#0#255#255#0#255#255#0#255'V'#17#2#188#200#206#190#202 +#204#195#198#206#191#203#205#192#201#204#196#203#206#201#203#213#0'f'#1#0'f' +#1#195#206#210#196#209#211'W'#19#0#255#0#255#255#0#255#255#0#255#168#183#185 +#225#239#238#225#237#237#226#238#238#227#239#239#223#237#236#226#238#240#227 +#239#241#163#175#177#162#174#176#228#240#242#228#237#240#171#183#185#255#0 +#255#255#0#255#255#0#255'Z'#18#1#224#227#231#224#228#229#0#139#0#0#139#0#0 +#139#0#0#139#0#0#139#0#0#139#0#0#139#0#250#247#249#246#246#246'V'#17#2#255#0 +#255#255#0#255#255#0#255'Y'#20#1'y'#181#241#229#230#228#0#139#0#0#139#0#0#139 +#0#0#139#0#0#139#0#0#139#0#0#139#0#246#248#248#133#192#248'['#20#0#255#0#255 +#255#0#255#255#0#255'V'#17#2#188#200#206#190#202#204#0#139#0#0#139#0#0#139#0 +#0#139#0#0#139#0#0#139#0#0#139#0#195#206#210#196#209#211'W'#19#0#255#0#255 +#255#0#255#255#0#255#168#183#185#225#239#238#225#237#237#163#176#178#163#176 +#178#163#176#178#163#176#178#163#176#178#163#176#178#163#176#178#228#240#242 +#228#237#240#171#183#185#255#0#255#255#0#255#255#0#255#6'b7'#237#251#252#236 +#251#252#236#251#252#236#251#252#236#251#252#236#251#252#236#251#252#236#251 +#252#236#251#252#236#251#252#236#250#251#228#244#249#219#237#244#6'b7'#255#0 +#255#6'b7'#156#196#238#139#184#235#237#251#252#237#251#252#237#251#252#237 +#251#252#237#251#252#237#251#252#237#251#252#237#251#252#236#250#251#139#184 +#235#156#196#238#6'b7'#255#0#255#6'b7'#195#216#229#202#224#234#208#229#238 +#211#230#238#211#230#238#211#230#238#211#230#238#211#230#238#211#230#238#211 +#230#238#211#230#238#212#231#238#213#231#238#6'b7'#255#0#255#184#196#202#233 +#242#246#233#242#246#233#242#246#233#242#246#233#242#246#233#242#246#233#242 +#246#233#242#246#233#242#246#233#242#246#233#242#246#233#242#246#233#242#246 +#184#196#202#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255 +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#156'lP'#178#142'v'#233#224#214#251#250#248#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#251#250#248#233#224#214#178 +#142'v'#156'lP'#255#0#255#255#0#255#255#0#255#155'kO{'#143#171#161#185#208 +#229#218#207#243#238#233#250#248#246#253#252#251#250#248#246#243#238#233#229 +#218#207#161#185#208'{'#143#171#155'kO'#255#0#255#255#0#255#255#0#255#156'lP' +#170#146#129#191#191#186#200#204#203#202#206#207#202#206#207#202#206#207#202 +#206#207#202#206#207#200#204#203#191#191#186#170#146#129#156'lP'#255#0#255 +#255#0#255#255#0#255#213#221#222#228#233#234#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#228#233#234#213#221#222#255#0#255#255#0#255#255#0#255#156'lP'#178#142'v'#233 +#224#214#250#247#245#196#222#191'`'#177'_'#26#151#31'`'#177'_'#196#222#191 +#250#247#245#233#224#214#178#142'v'#156'lP'#255#0#255#255#0#255#255#0#255#156 +'lP'#178#142'v'#233#224#214#250#247#245#196#222#191'`'#177'_'#26#151#31'`' +#177'_'#196#222#191#250#247#245#233#224#214#178#142'v'#156'lP'#255#0#255#255 +#0#255#255#0#255#156'lP'#178#142'v'#233#224#214#250#247#245#196#222#191'`' +#177'_'#26#151#31'`'#177'_'#196#222#191#250#247#245#233#224#214#178#142'v' +#156'lP'#255#0#255#255#0#255#255#0#255#208#216#215#225#230#229#255#255#255 +#255#255#255#238#241#241#207#215#214#183#195#193#207#215#214#238#241#241#255 +#255#255#255#255#255#225#230#229#208#216#215#255#0#255#255#0#255#255#0#255 ,#255#0#255'V'#17#0#217#226#230#221#225#226#221#227#226#225#227#227#226#232 +#227#230#232#232#228#231#235#236#233#235#234#236#236#234#239#242#238#241#245 +'V'#17#0#255#0#255#255#0#255#255#0#255'['#19#1't'#177#241#217#225#218#216#222 +#221#220#223#221#217#225#224#226#228#228#224#229#227#233#233#227#235#234#236 +#234#240#239'}'#189#247'X'#18#1#255#0#255#255#0#255#255#0#255'V'#16#3#183#201 +#200#189#200#198#186#198#198#186#200#199#186#200#196#188#201#199#189#201#201 +#191#201#201#191#200#203#191#204#202#194#206#208'W'#18#0#255#0#255#255#0#255 +#255#0#255#170#182#186#224#237#239#226#237#241#225#237#239#224#236#238#224 +#235#239#224#236#238#225#237#239#224#236#238#223#237#236#225#238#240#225#238 +#240#168#184#183#255#0#255#255#0#255#255#0#255'Y'#17#0#212#221#224#216#220 +#221#215#220#221#219#224#223#218#226#225#224#229#228#227#230#234#233#234#238 +#1#133#2#236#240#241#240#242#242'W'#17#0#255#0#255#255#0#255#255#0#255'V'#21 +#0't'#178#242#217#222#221#216#221#222#217#222#223#220#225#223#224#231#228#227 +#231#232#236#235#239#0#133#3#237#238#242'~'#189#249'Z'#19#0#255#0#255#255#0 +#255#255#0#255'T'#18#0#184#203#200#189#198#201#189#198#202#186#199#201#190 +#198#197#189#201#201#189#201#203#200#205#208#2'f'#0#190#205#207#194#206#210 +'W'#18#0#255#0#255#255#0#255#255#0#255#168#181#183#225#238#240#225#237#239 +#223#235#237#225#237#239#225#237#239#224#236#238#226#238#240#228#240#242#159 +#172#174#226#238#238#225#237#239#171#184#186#255#0#255#255#0#255#255#0#255'Y' +#17#0#212#221#224#216#220#221#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0 +#0#139#0#236#240#241#240#242#242'W'#17#0#255#0#255#255#0#255#255#0#255'V'#21 +#0't'#178#242#217#222#221#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0 +#139#0#237#238#242'~'#189#249'Z'#19#0#255#0#255#255#0#255#255#0#255'T'#18#0 +#184#203#200#189#198#201#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0#139#0#0 +#139#0#190#205#207#194#206#210'W'#18#0#255#0#255#255#0#255#255#0#255#168#181 +#183#225#238#240#225#237#239#163#176#178#163#176#178#163#176#178#163#176#178 +#163#176#178#163#176#178#163#176#178#226#238#238#225#237#239#171#184#186#255 +#0#255#255#0#255#255#0#255#6'b7'#240#253#254#239#253#254#239#253#254#239#253 +#254#239#253#254#239#253#254#239#253#254#239#253#254#239#253#254#239#253#254 +#238#253#254#232#247#251#224#241#246#6'b7'#255#0#255#6'b7'#161#198#238#139 +#184#235#240#253#254#240#253#254#240#253#254#240#253#254#240#253#254#240#253 +#254#240#253#254#240#253#254#239#253#254#139#184#235#161#198#238#6'b7'#255#0 +#255#6'b7'#195#217#229#202#224#234#210#230#238#212#233#238#213#233#238#213 +#233#238#213#233#238#213#233#238#213#233#238#213#233#238#213#233#238#213#233 +#238#214#233#238#6'b7'#255#0#255#184#196#202#233#242#246#233#242#246#233#242 +#246#233#242#246#233#242#246#233#242#246#233#242#246#233#242#246#233#242#246 +#233#242#246#233#242#246#233#242#246#233#242#246#184#196#202#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#196 +#169#152#147'_B'#222#208#194#233#224#214#243#238#232#250#247#245#252#251#250 +#250#247#245#243#238#232#233#224#214#222#208#194#147'_B'#196#169#152#255#0 +#255#255#0#255#255#0#255#196#169#151#130'ibx'#171#222#197#195#192#222#209#195 +#229#218#207#232#222#212#229#218#207#222#209#195#197#195#192'x'#171#222#130 +'ib'#196#169#151#255#0#255#255#0#255#255#0#255#196#169#152#147'fM'#191#187 +#179#191#191#186#196#198#195#199#202#202#200#204#204#199#202#202#196#198#195 +#191#191#186#191#187#179#147'fM'#196#169#152#255#0#255#255#0#255#255#0#255 +#255#0#255#208#217#219#254#254#254#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#254#254#254#208#217#219#255#0 +#255#255#0#255#255#0#255#255#0#255#196#169#152#147'_B'#222#208#194#233#224 +#214#243#238#232#250#247#245#252#251#250#250#247#245#243#238#232#233#224#214 +#222#208#194#147'_B'#196#169#152#255#0#255#255#0#255#255#0#255#196#169#152 +#147'_B'#222#208#194#233#224#214#243#238#232#250#247#245#252#251#250#250#247 +#245#243#238#232#233#224#214#222#208#194#147'_B'#196#169#152#255#0#255#255#0 +#255#255#0#255#196#169#152#147'_B'#222#208#194#233#224#214#243#238#232#250 +#247#245#252#251#250#250#247#245#243#238#232#233#224#214#222#208#194#147'_B' +#196#169#152#255#0#255#255#0#255#255#0#255#255#0#255#203#212#210#254#254#254 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#254#254#254#203#212#210#255#0#255#255#0#255#255#0#255#255#0#255#255 +#0#255'V'#17#0#219#223#224#214#225#223#222#224#224#221#224#228#222#225#229 +#223#227#228#225#230#228#229#231#232#227#231#232#236#236#236#236#241#242'V' +#17#0#255#0#255#255#0#255#255#0#255'Y'#20#1'p'#173#235#214#217#215#213#218 +#217#217#219#220#219#221#221#218#223#222#223#226#224#221#224#228#224#229#227 +#234#232#231'}'#185#244'['#20#0#255#0#255#255#0#255#255#0#255'Y'#20#0#187#199 +#199#185#198#200#185#197#197#185#197#201#184#199#202#189#198#202#188#200#200 ,#188#200#202#183#200#203#192#204#206#189#204#207'Y'#19#2#255#0#255#255#0#255 +#255#0#255#173#185#187#226#238#240#226#237#241#225#237#239#224#236#238#225 +#237#239#225#237#237#224#236#238#225#237#239#224#236#236#225#237#239#226#238 +#240#170#184#183#255#0#255#255#0#255#255#0#255'Y'#19#2#211#216#219#204#218 +#217#214#216#216#213#218#221#215#221#220#215#221#226#219#224#222#225#227#228 +#226#229#234#228#233#231#231#236#237'V'#14#2#255#0#255#255#0#255#255#0#255'W' +#19#0'p'#175#235#207#218#216#213#218#217#220#220#220#221#221#221#224#221#223 +#221#226#225#226#228#229#230#230#230#235#236#234#128#185#246'['#19#2#255#0 +#255#255#0#255#255#0#255'Y'#20#1#188#200#200#185#199#198#185#198#200#186#199 +#201#187#197#197#184#196#200#188#200#204#193#201#201#190#199#208#194#203#206 +#195#204#207'T'#20#2#255#0#255#255#0#255#255#0#255#173#185#189#225#237#239 +#227#239#241#226#238#240#225#237#239#224#236#238#224#236#238#225#237#239#226 +#238#238#226#240#239#225#237#237#226#238#238#170#184#183#255#0#255#255#0#255 +#255#0#255'Y'#19#2#211#216#219#204#218#217#214#216#216#213#218#221#215#221 +#220#215#221#226#219#224#222#225#227#228#226#229#234#228#233#231#231#236#237 +'V'#14#2#255#0#255#255#0#255#255#0#255'W'#19#0'p'#175#235#207#218#216#213#218 +#217#220#220#220#221#221#221#224#221#223#221#226#225#226#228#229#230#230#230 +#235#236#234#128#185#246'['#19#2#255#0#255#255#0#255#255#0#255'Y'#20#1#188 +#200#200#185#199#198#185#198#200#186#199#201#187#197#197#184#196#200#188#200 +#204#193#201#201#190#199#208#194#203#206#195#204#207'T'#20#2#255#0#255#255#0 +#255#255#0#255#173#185#189#225#237#239#227#239#241#226#238#240#225#237#239 +#224#236#238#224#236#238#225#237#239#226#238#238#226#240#239#225#237#237#226 +#238#238#170#184#183#255#0#255#255#0#255#255#0#255'#oL'#180#221#228#245#255 +#255#245#255#255#245#255#255#245#255#255#245#255#255#245#255#255#245#255#255 +#245#255#255#245#255#255#245#255#255#244#255#255#180#221#228'#oL'#255#0#255 +'#oL'#149#197#252#139#184#235#150#190#237#150#190#237#150#190#237#150#190#237 +#150#190#237#150#190#237#150#190#237#150#190#237#150#190#237#139#184#235#149 +#197#252'#oL'#255#0#255'#oL'#149#175#196#185#208#227#191#212#228#194#216#230 +#195#217#231#195#217#231#195#217#231#195#217#231#195#217#231#195#217#231#194 +#216#230#196#218#231#158#189#206'#oL'#255#0#255#184#196#202#221#231#235#233 +#242#246#233#242#246#233#242#246#233#242#246#233#242#246#233#242#246#233#242 +#246#233#242#246#233#242#246#233#242#246#233#242#246#221#231#235#184#196#202 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#167'}e'#172#133'm'#219#204#189#222#209#195#226#214#201 +#228#217#205#226#214#201#222#209#195#219#204#189#172#133'm'#167'}e'#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#166'}d'#138#136#145'x'#171#222#159 +#182#204#191#190#189#209#194#178#191#190#189#159#182#204'x'#171#222#138#136 +#145#166'}d'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#167'}e'#168 +#138'v'#189#185#176#185#183#177#187#186#180#188#187#182#187#186#180#185#183 +#177#189#185#176#168#138'v'#167'}e'#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#217#224#226#224#229#231#254#254#254#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#254#254#254#224#229#231#217#224#226#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#167'}e'#172#133'm'#219#204#189 +#222#209#195#226#214#201#228#217#205#226#214#201#222#209#195#219#204#189#172 +#133'm'#167'}e'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#167'}e'#172 +#133'm'#219#204#189#222#209#195#226#214#201#228#217#205#226#214#201#222#209 +#195#219#204#189#172#133'm'#167'}e'#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#167'}e'#172#133'm'#219#204#189#222#209#195#226#214#201#228#217#205 +#226#214#201#222#209#195#219#204#189#172#133'm'#167'}e'#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#213#220#219#220#226#225#254#254#254#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#254#254#254#220#226#225 +#213#220#219#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'V'#17#0#214 +#226#226#218#222#227#220#223#227#221#226#229#221#227#226#223#229#228#224#230 +#229#222#231#228#229#232#237#230#233#237#232#238#237'V'#17#0#255#0#255#255#0 +#255#255#0#255'X'#19#0'l'#177#240'o'#172#236'm'#174#235'q'#176#236'r'#177#237 +'t'#177#239's'#182#239't'#181#236'u'#178#240'v'#181#241'y'#184#245'T'#18#0 +#255#0#255#255#0#255#255#0#255'V'#18#0#187#201#199#185#199#205#184#197#199 +#184#199#201#187#199#201#186#199#201#188#200#202#188#199#203#188#202#201#193 +#202#206#193#205#205'W'#19#0#255#0#255#255#0#255#255#0#255#170#182#184#227 +#239#239#225#237#239#227#239#239#226#238#238#225#237#239#226#238#238#226#238 +#240#226#238#238#225#237#239#225#237#239#227#239#239#170#182#186#255#0#255 +#255#0#255#255#0#255'T'#18#0#206#215#219#209#214#217#209#214#215#210#215#218 +#212#215#219#209#218#221#216#223#220#217#222#221#220#226#225#214#228#227#224 ,#230#235'T'#18#0#255#0#255#255#0#255#255#0#255'X'#19#0'n'#176#241'n'#171#235 +'p'#173#235'm'#179#232's'#179#237'r'#180#239'r'#180#239's'#181#240'v'#179#243 +'t'#183#240'u'#184#247'Y'#20#1#255#0#255#255#0#255#255#0#255'W'#19#0#188#201 +#203#187#199#205#183#198#200#184#198#197#186#199#201#188#201#203#189#199#199 +#189#200#204#189#198#208#183#201#202#192#203#211'X'#20#1#255#0#255#255#0#255 +#255#0#255#169#182#184#227#239#239#226#238#238#225#237#237#226#238#238#226 +#238#238#226#238#238#224#236#236#229#238#241#225#237#239#225#237#237#227#239 +#239#169#182#184#255#0#255#255#0#255#255#0#255'T'#18#0#206#215#219#209#214 +#217#209#214#215#210#215#218#212#215#219#209#218#221#216#223#220#217#222#221 +#220#226#225#214#228#227#224#230#235'T'#18#0#255#0#255#255#0#255#255#0#255'X' +#19#0'n'#176#241'n'#171#235'p'#173#235'm'#179#232's'#179#237'r'#180#239'r' +#180#239's'#181#240'v'#179#243't'#183#240'u'#184#247'Y'#20#1#255#0#255#255#0 +#255#255#0#255'W'#19#0#188#201#203#187#199#205#183#198#200#184#198#197#186 +#199#201#188#201#203#189#199#199#189#200#204#189#198#208#183#201#202#192#203 +#211'X'#20#1#255#0#255#255#0#255#255#0#255#169#182#184#227#239#239#226#238 +#238#225#237#237#226#238#238#226#238#238#226#238#238#224#236#236#229#238#241 +#225#237#239#225#237#237#227#239#239#169#182#184#255#0#255#255#0#255#255#0 +#255'['#137'uM'#138'm'#180#222#229#246#255#255#246#255#255#246#255#255#246 +#255#255#246#255#255#246#255#255#246#255#255#246#255#255#246#255#255#201#235 +#238'M'#138'm['#138'v'#255#0#255'['#137'u|'#140#137#149#197#252#149#197#252 +#149#197#252#149#197#252#149#197#252#149#197#252#149#197#252#149#197#252#149 +#197#252#149#197#252#149#197#252'|'#140#137'['#138'v'#255#0#255'['#137'u@z`' +#145#167#192#178#204#222#179#205#223#180#205#223#180#205#223#180#205#223#180 +#205#223#180#205#223#180#205#223#180#205#223#164#178#201'C|b['#138'v'#255#0 +#255#184#196#202#201#211#217#221#231#235#233#242#246#233#242#246#233#242#246 +#233#242#246#233#242#246#233#242#246#233#242#246#233#242#246#233#242#246#225 +#235#239#201#211#217#184#196#202#255#0#255#255#0#255#255#0#255#255#0#255#255 +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#168#127'g'#148 +'aC'#178#142'v'#200#177#157#214#198#180#200#177#157#178#142'v'#148'aC'#168 +#127'g'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#168#127'g'#131'jd|'#144#173'l'#160#214']'#164#233'l'#160#214'|'#144#173#131 +'jd'#168#127'g'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#168#127'g'#148'hN'#170#146#129#179#169#158#182#178#170#179#169#158 +#170#146#129#148'hN'#168#127'g'#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#217#224#226#208#217#219#228#233#234#244#246#247#254 +#254#254#244#246#247#228#233#234#208#217#219#217#224#226#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#168#127'g'#148'aC'#178#142 +'v'#200#177#157#214#198#180#200#177#157#178#142'v'#148'aC'#168#127'g'#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#168#127'g' +#148'aC'#178#142'v'#200#177#157#214#198#180#200#177#157#178#142'v'#148'aC' +#168#127'g'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#168#127'g'#148'aC'#178#142'v'#200#177#157#214#198#180#200#177#157#178 +#142'v'#148'aC'#168#127'g'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#213#220#219#203#212#210#225#230#229#243#245#245#253#254 +#254#243#245#245#225#230#229#203#212#210#213#220#219#255#0#255#255#0#255#255 +#0#255#255#0#255#255#0#255#255#0#255'V'#17#0'V'#17#0'V'#17#0'V'#17#0'V'#17#0 +'V'#17#0'V'#17#0'V'#17#0'V'#17#0'V'#17#0'V'#17#0'V'#17#0'V'#17#0#255#0#255 +#255#0#255#255#0#255'^'#17#1'W'#19#0'X'#20#1'Z'#19#0'X'#19#0'['#19#1'Y'#18#0 +'['#20#0'V'#21#0'X'#19#0'X'#21#0'V'#17#0'X'#21#0#255#0#255#255#0#255#255#0 +#255'W'#18#1'X'#20#1'V'#19#0'Y'#21#2'Z'#18#1'W'#19#0'X'#19#0'X'#19#0'Y'#17#0 +'V'#17#0'W'#16#2'W'#19#0'U'#19#0#255#0#255#255#0#255#255#0#255#168#183#185 +#170#184#183#170#183#185#170#183#185#168#183#185#169#184#186#169#185#184#170 +#183#185#171#184#186#168#183#186#169#184#186#169#182#184#171#183#187#255#0 +#255#255#0#255#255#0#255'T'#18#0'X'#19#2'S'#17#0'U'#19#1'W'#19#0'X'#19#0'Q' +#19#1'T'#15#0'W'#19#0'V'#18#0'S'#17#0'W'#18#0'W'#18#1#255#0#255#255#0#255#255 +#0#255'_'#19#1'X'#19#0'Z'#21#2'Z'#20#0'X'#19#0'X'#17#3'U'#19#0'Z'#18#1'X'#19 +#0'['#20#0'Q'#20#0'Y'#20#1'W'#18#0#255#0#255#255#0#255#255#0#255'X'#19#2'W' +#19#0'X'#20#1'Z'#18#0']'#18#4'X'#18#1'T'#21#0'Z'#18#0'S'#19#1'X'#19#0'U'#23#0 +'X'#18#1'W'#18#0#255#0#255#255#0#255#255#0#255#171#184#186#171#184#186#170 +#183#185#171#184#186#168#181#183#170#183#185#169#182#184#172#185#187#169#181 +#185#171#184#186#171#184#186#170#183#185#170#185#188#255#0#255#255#0#255#255 +#0#255'T'#18#0'X'#19#2'S'#17#0'U'#19#1'W'#19#0'X'#19#0'Q'#19#1'T'#15#0'W'#19 +#0'V'#18#0'S'#17#0'W'#18#0'W'#18#1#255#0#255#255#0#255#255#0#255'_'#19#1'X' ,#19#0'Z'#21#2'Z'#20#0'X'#19#0'X'#17#3'U'#19#0'Z'#18#1'X'#19#0'['#20#0'Q'#20#0 +'Y'#20#1'W'#18#0#255#0#255#255#0#255#255#0#255'X'#19#2'W'#19#0'X'#20#1'Z'#18 +#0']'#18#4'X'#18#1'T'#21#0'Z'#18#0'S'#19#1'X'#19#0'U'#23#0'X'#18#1'W'#18#0 +#255#0#255#255#0#255#255#0#255#171#184#186#171#184#186#170#183#185#171#184 +#186#168#181#183#170#183#185#169#182#184#172#185#187#169#181#185#171#184#186 +#171#184#186#170#183#185#170#185#188#255#0#255#255#0#255#255#0#255#209#196 +#219'['#137'u#oL'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#24'i' +'DO'#131'm'#213#201#223#255#0#255#222#196#200'['#137'u#oL'#6'b7'#6'b7'#6'b7' +#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#24'iDO'#131'm'#226#201#205#255#0#255#209 +#196#219'['#137'u#oL'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7'#6'b7' +#24'iDO'#131'm'#213#201#223#255#0#255#255#255#255#184#196#202#184#196#202#184 +#196#202#184#196#202#184#196#202#184#196#202#184#196#202#184#196#202#184#196 +#202#184#196#202#184#196#202#184#196#202#184#196#202#255#255#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#202#177#162#160'sY'#130'F%q-'#8#130'F%'#160's' +'Y'#202#177#162#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#202#177#162#160'sY'#130'F%q-'#8#130'F%'#160's' +'Y'#202#177#162#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#202#177#162#160'sY'#130'F%q-'#8#130'F%'#160's' +'Y'#202#177#162#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#233#237#238#213#221#222#197#208#210#188#200 +#203#197#208#210#213#221#222#233#237#238#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#202#177#162#160'sY' +#130'F%q-'#8#130'F%'#160'sY'#202#177#162#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#202#177#162#160'sY' +#130'F%q-'#8#130'F%'#160'sY'#202#177#162#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#202#177#162#160'sY' +#130'F%q-'#8#130'F%'#160'sY'#202#177#162#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#208#216#215 +#190#201#199#180#192#190#190#201#199#208#216#215#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 ,#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#0#0 ]); LazarusResources.Add('VT_MOVENS_BMP','BMP',[ 'BM6'#12#0#0#0#0#0#0'6'#0#0#0'('#0#0#0' '#0#0#0' '#0#0#0#1#0#24#0#0#0#0#0#0#12 +#0#0#18#11#0#0#18#11#0#0#0#0#0#0#0#0#0#0#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#255#255#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0 +#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255 +#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#255#255#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#255#255#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 ,#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#255#255 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0 +#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255 +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#255#255#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255 +#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#255#255#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#255#255#255#255#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 ,#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 ]); LazarusResources.Add('VT_MOVEEW_BMP','BMP',[ 'BM6'#12#0#0#0#0#0#0'6'#0#0#0'('#0#0#0' '#0#0#0' '#0#0#0#1#0#24#0#0#0#0#0#0#12 +#0#0#18#11#0#0#18#11#0#0#0#0#0#0#0#0#0#0#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255 +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#255#255#255#255#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#255#255#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#255 +#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#255#255#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255 +#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0 +#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255 +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255 +#255#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#255#255#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255 +#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255 +#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#255 +#255#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0 ,#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0 +#0#255#255#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255 +#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0 +#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255 +#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0 +#255#255#255#255#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255 +#255#255#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#255#255#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#255#255#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#255#255#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255 +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#255#255#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#255#255#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#255#255#0#0#0#255#255#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255 +#255#255#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#255#255#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#255#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255 +#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 ,#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 ]); LazarusResources.Add('VT_MOVEALL_BMP','BMP',[ 'BM6'#12#0#0#0#0#0#0'6'#0#0#0'('#0#0#0' '#0#0#0' '#0#0#0#1#0#24#0#0#0#0#0#0#12 +#0#0#18#11#0#0#18#11#0#0#0#0#0#0#0#0#0#0#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#255#255#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0 +#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255 +#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#255#255#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#255#255#0#0#0#255#255#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0 +#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255 +#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#255#255#255#255 +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0 +#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#255#255 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0 +#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255 +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0 +#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#255 +#255#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0 +#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255 ,#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255 +#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255 +#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255 +#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#255 +#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0 +#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#255#255#0 +#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0 +#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0 +#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255 +#255#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0 +#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255 +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#255#255#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0 +#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#255#255#0#0#0#255#255#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#255#255#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255 +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255 +#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#255 +#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#0#0#0#0#0 +#0#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#255#255#255#255#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 ,#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255 +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0 +#255#255#0#255#255#0#255#255#0#255 ]); doublecmd-0.5.8/components/virtualtreeview/lclfunctions.inc0000644000175000017500000000671312014201074023330 0ustar alexxalexx//Used in DrawTextW { function GetTextAlign(DC: HDC): UINT; begin Logger.AddCheckPoint(lcDummyFunctions,'GetTextAlign'); Result:=TA_TOP or TA_LEFT; end; } //Used in DrawTextW, ShortenString, TVirtualTreeColumn.ComputeHeaderLayout, TVirtualTreeColumns.DrawButtonText, // TVTEdit.AutoAdjustSize, TCustomVirtualStringTree.PaintNormalText, TCustomVirtualStringTree.WMSetFont // TCustomVirtualStringTree.DoTextMeasuring { function GetTextExtentPoint32W(DC: HDC; Str: PWideChar; Count: Integer; var Size: TSize): Boolean; var TempStr: String; begin Logger.AddCheckPoint(lcDummyFunctions,'GetTextExtentPoint32W'); TempStr:=WideCharToString(Str); Result:=GetTextExtentPoint(DC, PChar(TempStr), Length(TempStr), Size); end; } //Used in DrawTextW { function ExtTextOutW(DC: HDC; X, Y: Integer; Options: LongInt; Rect: PRect; Str: PWideChar; Count: LongInt; Dx: PInteger): Boolean; var TempStr: String; begin Logger.AddCheckPoint(lcDummyFunctions,'ExtTextOutW'); TempStr:=WideCharToString(Str); Result:= ExtTextOut(DC, X, Y, Options, Rect, PChar(TempStr), Length(TempStr), Dx); end; } //Used in TVirtualTreeHintWindow.CalcHintRect, TVirtualTreeColumn.ComputeHeaderLayout // TBaseVirtualTree.CollectSelectedNodesRTL, TBaseVirtualTree.DetermineHitPositionRTL // TBaseVirtualTree.UpdateEditBounds, TBaseVirtualTree.GetDisplayRect, PaintTree, // TStringEditLink.PrepareEdit, TCustomVirtualStringTree.ComputeNodeHeight etc function MapWindowPoints(hWndFrom, hWndTo: HWND; var lpPoints; cPoints: UINT): Integer; var I:Integer; XOffset, YOffset: SmallInt; FromRect,ToRect: TRect; begin GetWindowRect(hWndFrom,FromRect); GetWindowRect(hWndTo,ToRect); XOffset:=(FromRect.Left - ToRect.Left); YOffset:=(FromRect.Top - ToRect.Top); for i:=0 to cPoints - 1 do begin { Mode Delphi does not support treating a pointer as a array if ObjFpc is used than this syntax is preferred PPoint(@lpPoints)[i].x:= XOffset + PPoint(@lpPoints)[i].x; PPoint(@lpPoints)[i].y:= YOffset + PPoint(@lpPoints)[i].y; } PPoint(@lpPoints+i)^.x:= XOffset + PPoint(@lpPoints+i)^.x; PPoint(@lpPoints+i)^.y:= YOffset + PPoint(@lpPoints+i)^.y; end; Result:=MakeLong(XOffset,YOffset); end; {$ifndef UseExternalDragManager} function RegisterDragDrop(hwnd:HWND; pDropTarget:IDropTarget):WINOLEAPI;stdcall;external 'ole32.dll' name 'RegisterDragDrop'; function RevokeDragDrop(hwnd:HWND):WINOLEAPI;stdcall;external 'ole32.dll' name 'RevokeDragDrop'; function DoDragDrop(pDataObj:IDataObject; pDropSource:IDropSource; dwOKEffects:DWORD; pdwEffect:LPDWORD):WINOLEAPI;stdcall;external 'ole32.dll' name 'DoDragDrop'; function OleInitialize(pvReserved:LPVOID):WINOLEAPI;stdcall;external 'ole32.dll' name 'OleInitialize'; procedure OleUninitialize;stdcall;external 'ole32.dll' name 'OleUninitialize'; procedure ReleaseStgMedium(_para1:LPSTGMEDIUM);stdcall;external 'ole32.dll' name 'ReleaseStgMedium'; function OleSetClipboard(pDataObj:IDataObject):WINOLEAPI;stdcall;external 'ole32.dll' name 'OleSetClipboard'; function OleGetClipboard(out ppDataObj:IDataObject):WINOLEAPI;stdcall;external 'ole32.dll' name 'OleGetClipboard'; function OleFlushClipboard:WINOLEAPI;stdcall;external 'ole32.dll' name 'OleFlushClipboard'; function OleIsCurrentClipboard(pDataObj:IDataObject):WINOLEAPI;stdcall;external 'ole32.dll' name 'OleIsCurrentClipboard'; function CreateStreamOnHGlobal(hGlobal:HGLOBAL; fDeleteOnRelease:BOOL;out stm:IStream):WINOLEAPI;stdcall;external 'ole32.dll' name 'CreateStreamOnHGlobal'; {$endif} doublecmd-0.5.8/components/virtualtreeview/readme.txt0000644000175000017500000000033112014201074022116 0ustar alexxalexxVirtual Tree View from Lazarus CCR https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr/components/virtualtreeview-new/branches/4.8 Rev. 2200 Some modifications done for Double Commander (see doublecmd.diff). doublecmd-0.5.8/components/viewer/0000755000175000017500000000000012257501472016201 5ustar alexxalexxdoublecmd-0.5.8/components/viewer/viewercontrol.pas0000644000175000017500000025047212204103540021604 0ustar alexxalexx{ Component ViewerControl (Free Pascal) show file in text (wraped or not) or bin or hex mode This is part of Seksi Commander To searching use uFindMmap, to movement call Upxxxx, Downxxxx, or set Position Realised under GNU GPL 2 author Radek Cervinka (radek.cervinka@centrum.cz) changes: 5.7. (RC) - selecting text with mouse - CopyToclipBoard, SelectAll ?.6. - LoadFromStdIn and loading first 64Kb of files with size=0 :) (/proc fs ..) 17.6. (RC) - mapfile (in error set FMappedFile=nil) - writetext TABs fixed (tab is replaced by 9 spaces) - set correct position for modes hex, bin (SetPosition) 21.7 - wrap text on 80 character lines works better now (by Radek Polak) - problems with function UpLine for specific lines: (lines of 80(=cTextWidth) character ended with ENTER (=#10) 6.2. (RC) - ported to fpc for linux (CustomControl and gtk) 7.2. (RC) - use temp to new implementation of LoadFromStdIn (and mmap temp file) - faster drawing of text (I hope) contributors: Copyright (C) 2006-2013 Alexander Koblov (alexx2000@mail.ru) TODO: a) File mapping blocks writing into file by other processes. Either: + Open small text files by reading them all into memory (done). - Change file mapping to custom loading/caching portions of file in memory and only reading from file when neccessary. b) Searching in Unicode encodings and case-insensitive searching. c) Selecting text does not work well with composed Unicode characters (characters that are composed of multiple Unicode characters). d) Drawing/selecting text does not work correctly with RTL (right to left) text. e) FTextHeight is unreliable with complex unicode characters. It should be calculated based on currently displayed text (get max from each line's height). } unit ViewerControl; {$mode objfpc}{$H+} interface uses SysUtils, Classes, Controls, StdCtrls, fgl; const MaxMemSize = $400000; // 4 Mb type TViewerMode = (vmBin, vmHex, vmText, vmWrap, vmBook); TDataAccess = (dtMmap, dtNothing); TCharSide = (csBefore, csLeft, csRight, csAfter); TPtrIntList = specialize TFPGList; TGuessEncodingEvent = function(const s: string): string; type // If additional encodings are added they should be also supported by: // - GetNextCharAsAscii // - GetPrevCharAsAscii // - GetNextCharAsUtf8 // - ConvertToUTF8 // - UpdateSelection TViewerEncoding = (veAutoDetect, veUtf8, veUtf8bom, veAnsi, veCp1250, veCp1251, veCp1252, veCp1253, veCp1254, veCp1255, veCp1256, veCp1257, veCp1258, veCp437, veCp850, veCp852, veCp866, veCp874, veCp932, veCp936, veCp949, veCp950, veIso88591, veIso88592, veKoi8, veUcs2le, veUcs2be, veUtf16le, veUtf16be, veUtf32le, // = ucs4le veUtf32be); // = ucs4be const ViewerEncodingsNames: array [TViewerEncoding] of string = ('Auto-detect', 'UTF-8', 'UTF-8BOM', 'Ansi', 'CP1250', 'CP1251', 'CP1252', 'CP1253', 'CP1254', 'CP1255', 'CP1256', 'CP1257', 'CP1258', 'CP437', 'CP850', 'CP852', 'CP866', 'CP874', 'CP932', 'CP936', 'CP949', 'CP950', 'ISO-8859-1', 'ISO-8859-2', 'KOI-8', 'UCS-2LE', 'UCS-2BE', 'UTF-16LE', 'UTF-16BE', 'UTF-32LE', 'UTF-32BE'); type { TViewerControl } TViewerControl = class(TCustomControl) private FEncoding: TViewerEncoding; FViewerMode: TViewerMode; FFileName: UTF8String; FFileHandle: THandle; FFileSize: Int64; FMappingHandle: THandle; FMappedFile: Pointer; FPosition: PtrInt; FHPosition: Integer; // Tab for text during horizontal scroll FHLowEnd: Integer; // End for HPosition (string with max char) FVisibleOffset: PtrInt; // Offset in symbols for current line (see IsVisible and MakeVisible) FLowLimit: PtrInt; // Lowest possible value for Position FHighLimit: PtrInt; // Position cannot reach this value FBOMLength: Integer; FLineList: TPtrIntList; FBlockBeg: PtrInt; FBlockEnd: PtrInt; FMouseBlockBeg: PtrInt; FMouseBlockSide: TCharSide; FSelecting: Boolean; FTextWidth: Integer; // max char count or width in window FTextHeight: Integer; // measured values of font, rec calc at font changed FScrollBarVert: TScrollBar; FScrollBarHorz: TScrollBar; FOnPositionChanged: TNotifyEvent; FUpdateScrollBarPos: Boolean; // used to block updating of scrollbar FScrollBarPosition: Integer; // for updating vertical scrollbar based on Position FHScrollBarPosition: Integer; // for updating horizontal scrollbar based on HPosition FColCount: Integer; FOnGuessEncoding: TGuessEncodingEvent; function GetPercent: Integer; procedure SetPercent(const AValue: Integer); procedure SetBlockBegin(const AValue: PtrInt); procedure SetBlockEnd(const AValue: PtrInt); procedure SetPosition(Value: PtrInt); procedure SetHPosition(Value: Integer); procedure SetPosition(Value: PtrInt; Force: Boolean); overload; procedure SetHPosition(Value: Integer; Force: Boolean); overload; procedure SetEncoding(AEncoding: TViewerEncoding); function GetEncodingName: string; procedure SetEncodingName(AEncodingName: string); procedure SetViewerMode(Value: TViewerMode); procedure SetColCount(const AValue: Integer); {en Returns how many lines (given current FTextHeight) will fit into the window. } function GetClientHeightInLines: Integer; inline; {en Calculates how many lines can be displayed from given position. @param(FromPosition Position from which to check. It should point to a start of a line.) @param(LastLineReached If it is set to @true when the function returns, then the last line of text was reached when scanning. This means that there are no more lines to be displayed other than the ones scanned from FromPosition. In other words: SetPosition(GetStartOfNextLine(FromPosition)) will be one line too many and will be scrolled back.) } function GetLinesTillEnd(FromPosition: PtrInt; out LastLineReached: Boolean): Integer; function GetBomLength: Integer; procedure UpdateLimits; {en @param(iStartPos Should point to start of a line. It is increased by the amount of parsed data (with line endings).) @param(aLimit Position which cannot be reached while reading from file.) @param(DataLength It is length in bytes of parsed data without any line endings. iStartPos is moved beyond the line endings though.) } function CalcTextLineLength(var iStartPos: PtrInt; const aLimit: Int64; out DataLength: PtrInt): Integer; function GetStartOfLine(aPosition: PtrInt): PtrInt; function GetEndOfLine(aPosition: PtrInt): PtrInt; function GetStartOfPrevLine(aPosition: PtrInt): PtrInt; function GetStartOfNextLine(aPosition: PtrInt): PtrInt; {en Changes the value of aPosition to X lines back or forward. @param(aPosition File position to change.) @param(iLines Nr of lines to scroll. If positive the position is increased by iLines lines, if negative the position is decreased by -iLines lines.) } function ScrollPosition(var aPosition: PtrInt; iLines: Integer): Boolean; {en Calculates (x,y) cursor position to a position within file. @param(x Client X coordinate of mouse cursor.) @param(y Client Y coordinate of mouse cursor.) @param(CharSide To which side of a character at returned position the (x,y) points to. Only valid if returned position is not -1.) @returns(Position in file to which (x,y) points to, based on what is currently displayed. Returns -1 if (x,y) doesn't point to any position (outside of the text for example).) } function XYPos2Adr(x, y: Integer; out CharSide: TCharSide): PtrInt; procedure OutText(x, y: Integer; StartPos: PtrInt; DataLength: Integer); procedure OutHex(x, y: Integer; sText: string; StartPos: PtrInt; DataLength: Integer); procedure OutBin(x, y: Integer; sText: string; StartPos: PtrInt; DataLength: Integer); procedure WriteText; procedure WriteHex; procedure WriteBin; function TransformText(const sText: UTF8String; const Xoffset: Integer): UTF8String; function TransformHex(var aPosition: PtrInt; aLimit: PtrInt): AnsiString; function TransformBin(var aPosition: PtrInt; aLimit: PtrInt): AnsiString; procedure AddLineOffset(iOffset: PtrInt); inline; function MapFile(const sFileName: UTF8String): Boolean; procedure UnMapFile; procedure SetFileName(const sFileName: UTF8String); procedure UpdateScrollbars; procedure ViewerResize(Sender: TObject); {en Returns next unicode character from the file, depending on Encoding. It is a faster version, which does as little conversion as possible, but only Ascii values are guaranteed to be valid (0-127). Other unicode values may/may not be valid, so shouldn't be tested. This function is used for reading pure ascii characters such as line endings, tabs, white spaces, etc. } function GetNextCharAsAscii(const iPosition: PtrInt; out CharLenInBytes: Integer): Cardinal; function GetPrevCharAsAscii(const iPosition: PtrInt; out CharLenInBytes: Integer): Cardinal; {en Retrieve next character from the file depending on encoding and automatically convert it to UTF-8. If CharLenInBytes is greater than 0 but the result is an empty string then it's possible there was no appropriate UTF-8 character for the next character of the current encoding. } function GetNextCharAsUtf8(const iPosition: PtrInt; out CharLenInBytes: Integer): UTF8String; procedure ReReadFile; function IsFileOpen: Boolean; inline; {en Searches for an ASCII character. @param(aPosition Position from where the search starts.) @param(aMaxBytes How many bytes are available for reading.) @param(AsciiChars The function searches for any character that this string contains.) @param(bFindNotIn If @true searches for first character not included in AsciiChars. If @false searches for first character included in AsciiChars.) } function FindAsciiSetForward(aPosition, aMaxBytes: PtrInt; const AsciiChars: String; bFindNotIn: Boolean): PtrInt; {en Same as FindForward but it searches backwards from pAdr. aMaxBytes must be number of available bytes for reading backwards from pAdr. } function FindAsciiSetBackward(aPosition, aMaxBytes: PtrInt; const AsciiChars: String; bFindNotIn: Boolean): PtrInt; {en Checks if current selection is still valid given current viewer mode and encoding. For example checks if selection is not in the middle of a unicode character. } procedure UpdateSelection; procedure ScrollBarVertScroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); procedure ScrollBarHorzScroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); function GetText(const StartPos, Len: PtrInt; const Xoffset: Integer): string; protected procedure KeyDown(var Key: word; Shift: TShiftState); override; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; override; function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Paint; override; {en Scrolls the displayed text in the window. @param(iLines Nr of lines to scroll. If positive the text is scrolled downwards, if negative the text is scrolled upwards.) @returns(@true if the text was scrolled.) } function Scroll(iLines: Integer): Boolean; function HScroll(iSymbols: Integer): Boolean; procedure PageUp; procedure PageDown; procedure GoHome; procedure GoEnd; procedure HPageUp; procedure HPageDown; procedure HGoHome; procedure HGoEnd; function GetDataAdr: Pointer; procedure SelectAll; procedure SelectText(AStart, AEnd: PtrInt); procedure CopyToClipboard; function IsVisible(const aPosition: PtrInt): Boolean; overload; procedure MakeVisible(const aPosition: PtrInt); function ConvertToUTF8(const sText: AnsiString): UTF8String; function ConvertFromUTF8(const sText: UTF8String): AnsiString; function DetectEncoding: TViewerEncoding; procedure GetSupportedEncodings(List: TStrings); property Percent: Integer Read GetPercent Write SetPercent; property Position: PtrInt Read FPosition Write SetPosition; property FileSize: Int64 Read FFileSize; property SelectionStart: PtrInt Read FBlockBeg Write SetBlockBegin; property SelectionEnd: PtrInt Read FBlockEnd Write SetBlockEnd; property EncodingName: string Read GetEncodingName Write SetEncodingName; property ColCount: Integer Read FColCount Write SetColCount; property OnGuessEncoding: TGuessEncodingEvent Read FOnGuessEncoding Write FOnGuessEncoding; published property ViewerMode: TViewerMode Read FViewerMode Write SetViewerMode default vmWrap; property FileName: UTF8String Read FFileName Write SetFileName; property Encoding: TViewerEncoding Read FEncoding Write SetEncoding default veAutoDetect; property OnPositionChanged: TNotifyEvent Read FOnPositionChanged Write FOnPositionChanged; property OnClick; property OnMouseDown; property OnMouseMove; property OnMouseUp; property Align; property Color; property Cursor default crIBeam; property Font; property ParentColor default False; property TabStop default True; end; procedure Register; implementation uses LCLType, LCLVersion, Graphics, Forms, LCLProc, Clipbrd, LConvEncoding, UnicodeUtils, LCLIntf {$IF DEFINED(UNIX)} , BaseUnix, Unix {$ELSEIF DEFINED(WINDOWS)} , Windows {$ENDIF}; const //cTextWidth = 80; // wrap on 80 chars cBinWidth = 80; cMaxTextWidth = 65535; // maximum of chars on one line unwrapped text cHexWidth = 16; cTabSpaces = 8; // tab stop - allow to set in settings cHexOffsetWidth = 8; cHexStartHex = cHexOffsetWidth + 2; // ': ' cHexEndHex = cHexStartHex + (cHexWidth * 3); cHexStartAscii = cHexStartHex + (cHexWidth * 3) + 2; // ' ' // These strings must be Ascii only. sNonCharacter: string = ' !"#$%&''()*+,-./:;<=>?@[\]^`{|}~'#13#10#9; sWhiteSpace : string = ' '#13#10#9#8; // ---------------------------------------------------------------------------- constructor TViewerControl.Create(AOwner: TComponent); begin inherited Create(AOwner); Cursor := crIBeam; ParentColor := False; DoubleBuffered := True; ControlStyle := ControlStyle + [csTripleClicks, csOpaque]; TabStop := True; // so that it can get keyboard focus FEncoding := veAutoDetect; FViewerMode := vmText; FFileName := ''; FMappedFile := nil; FFileHandle := 0; FMappingHandle := 0; FPosition := 0; FHPosition := 0; FHLowEnd := 0; FLowLimit := 0; FHighLimit := 0; FBOMLength := 0; FTextHeight := 14; // dummy value FColCount := 1; FLineList := TPtrIntList.Create; FScrollBarVert := TScrollBar.Create(Self); FScrollBarVert.Parent := Self; FScrollBarVert.Kind := sbVertical; FScrollBarVert.Align := alRight; FScrollBarVert.OnScroll := @ScrollBarVertScroll; FScrollBarVert.TabStop := False; FScrollBarVert.PageSize := 0; FScrollBarHorz := TScrollBar.Create(Self); FScrollBarHorz.Parent := Self; FScrollBarHorz.Kind := sbHorizontal; FScrollBarHorz.Align := alBottom; FScrollBarHorz.OnScroll := @ScrollBarHorzScroll; FScrollBarHorz.TabStop := False; FScrollBarHorz.PageSize := 0; FUpdateScrollBarPos := True; FScrollBarPosition := 0; FHScrollBarPosition := 0; FOnPositionChanged := nil; FOnGuessEncoding := nil; OnResize := @ViewerResize; end; destructor TViewerControl.Destroy; begin UnMapFile; if Assigned(FLineList) then FreeAndNil(FLineList); inherited Destroy; end; procedure TViewerControl.Paint; begin if not IsFileOpen then Exit; Canvas.Font := Self.Font; Canvas.Brush.Color := Self.Color; {$IF DEFINED(LCLQT) and (LCL_FULLVERSION < 093100)} Canvas.Brush.Style := bsSolid; Canvas.FillRect(ClientRect); {$ENDIF} Canvas.Brush.Style := bsClear; FTextHeight := Canvas.TextHeight('Wg') + 2; if FViewerMode = vmBook then FTextWidth := ((ClientWidth - (Canvas.TextWidth('W') * FColCount)) div FColCount) else FTextWidth := ClientWidth div Canvas.TextWidth('W') - 2; FLineList.Clear; case FViewerMode of vmBin : WriteBin; vmHex : WriteHex; vmText: WriteText; vmWrap: WriteText; vmBook: WriteText; end; end; procedure TViewerControl.SetViewerMode(Value: TViewerMode); begin if not (csDesigning in ComponentState) then begin FLineList.Clear; // do not use cache from previous mode // Take limits into account for selection. FBlockBeg := FBlockBeg + (GetDataAdr - FMappedFile); FBlockEnd := FBlockEnd + (GetDataAdr - FMappedFile); FViewerMode := Value; FHPosition := 0; FBOMLength := GetBomLength; UpdateLimits; // Take limits into account for selection. FBlockBeg := FBlockBeg - (GetDataAdr - FMappedFile); FBlockEnd := FBlockEnd - (GetDataAdr - FMappedFile); UpdateSelection; // Force recalculating position. SetPosition(FPosition, True); SetHPosition(FHPosition, True); UpdateScrollbars; Invalidate; end else FViewerMode := Value; end; procedure TViewerControl.SetColCount(const AValue: Integer); begin if AValue > 0 then FColCount := AValue else FColCount := 1; end; function TViewerControl.ScrollPosition(var aPosition: PtrInt; iLines: Integer): Boolean; var i: Integer; NewPos: PtrInt; begin Result := False; NewPos := aPosition; if iLines < 0 then for i := 1 to -iLines do NewPos := GetStartOfPrevLine(NewPos) else for i := 1 to iLines do NewPos := GetStartOfNextLine(NewPos); Result := aPosition <> NewPos; aPosition := NewPos; end; function TViewerControl.Scroll(iLines: Integer): Boolean; var aPosition: PtrInt; begin aPosition := FPosition; Result := ScrollPosition(aPosition, iLines); if aPosition <> FPosition then SetPosition(aPosition); end; function TViewerControl.HScroll(iSymbols: Integer): Boolean; var newPos: integer; begin newPos := FHPosition; if (FHLowEnd - FTextWidth) > 0 then begin newPos := newPos+ iSymbols; if newPos < 0 then newPos := 0; if newPos > FHLowEnd-FTextWidth then newPos := FHLowEnd-FTextWidth; end; if newPos <> FHPosition then SetHPosition(newPos); end; function TViewerControl.GetText(const StartPos, Len: PtrInt; const Xoffset: Integer): string; begin SetString(Result, GetDataAdr + StartPos, Len); Result := TransformText(ConvertToUTF8(Result), Xoffset); end; function TViewerControl.CalcTextLineLength(var iStartPos: PtrInt; const aLimit: Int64; out DataLength: PtrInt): Integer; var MaxLineLength: Boolean; CharLenInBytes: Integer; OldPos, LastSpacePos: PtrInt; LastSpaceResult: Integer; begin Result := 0; DataLength := 0; LastSpacePos := -1; MaxLineLength := True; OldPos := iStartPos; while MaxLineLength and (iStartPos < aLimit) do begin case GetNextCharAsAscii(iStartPos, CharLenInBytes) of 9: // tab Inc(Result, cTabSpaces - Result mod cTabSpaces); 10: // stroka begin DataLength := iStartPos - OldPos; iStartPos := iStartPos + CharLenInBytes; Exit; end; 13: // karetka begin DataLength := iStartPos - OldPos; iStartPos := iStartPos + CharLenInBytes; // Move after possible #10. if (iStartPos < aLimit) and (GetNextCharAsAscii(iStartPos, CharLenInBytes) = 10) then Inc(iStartPos, CharLenInBytes); Exit; end; 32, 33, 40, 41, 44, 45, 46, 47, 92, 58, 59, 63, 91, 93: //probel begin Inc(Result, 1); LastSpacePos := iStartPos + CharLenInBytes; LastSpaceResult := Result; end; else Inc(Result, 1); end; if CharLenInBytes = 0 then // End of data or invalid character. break; iStartPos := iStartPos + CharLenInBytes; DataLength := iStartPos - OldPos; case FViewerMode of vmText: MaxLineLength := Result < cMaxTextWidth; vmWrap: MaxLineLength := Result < FTextWidth; vmBook: MaxLineLength := Canvas.TextWidth(GetText(OldPos, DataLength, 0)) < FTextWidth; else Exit; end; end; if (not MaxLineLength) and (LastSpacePos <> -1) then begin iStartPos := LastSpacePos; Result := LastSpaceResult; DataLength := iStartPos - OldPos; end; end; function TViewerControl.TransformText(const sText: UTF8String; const Xoffset: Integer): UTF8String; var c: AnsiChar; i: Integer; begin Result := ''; for i := 1 to Length(sText) do begin c := sText[i]; // Parse only ASCII chars. case c of #9: Result := Result + StringOfChar(' ', cTabSpaces - (UTF8Length(Result) + Xoffset) mod cTabSpaces); else begin {if c < ' ' then Result := Result + ' ' else} Result := Result + c; end; end; end; end; function TViewerControl.TransformHex(var aPosition: PtrInt; aLimit: PtrInt): AnsiString; function LineFormat(const sHex, sAscii: AnsiString; iOffset: PtrInt): AnsiString; begin Result := Format('%s: %s', [IntToHex(iOffset, cHexOffsetWidth), sHex]); if Length(sHex) < cHexWidth * 3 then Result := Result + StringOfChar(' ', cHexWidth * 3 - Length(sHex)); Result := Result + ' '; Result := Result + sAscii; end; var c: AnsiChar; i: Integer; sStr: string = ''; sHex: string = ''; aStartOffset: PtrInt; begin if aPosition >= aLimit then Exit(''); aStartOffset := aPosition; for i := 0 to cHexWidth - 1 do begin if aPosition >= aLimit then Break; c := PAnsiChar(GetDataAdr)[aPosition]; if c < ' ' then sStr := sStr + '.' else if c > #127 then sStr := sStr + '.' else sStr := sStr + c; sHex := sHex + IntToHex(Ord(c), 2); if ((i and 7) = 7) and (i <> cHexWidth - 1) then sHex := sHex + '|' else sHex := sHex + ' '; Inc(aPosition); end; Result := LineFormat(sHex, sStr, aStartOffset) end; function TViewerControl.TransformBin(var aPosition: PtrInt; aLimit: PtrInt): AnsiString; var c: AnsiChar; i: Integer; begin Result := ''; for i := 0 to cBinWidth - 1 do begin if aPosition >= aLimit then Break; c := PAnsiChar(GetDataAdr)[aPosition]; if c < ' ' then Result := Result + '.' else if c > #127 then Result := Result + '.' else Result := Result + c; Inc(aPosition); end; end; function TViewerControl.GetStartOfLine(aPosition: PtrInt): PtrInt; function GetStartOfLineText: PtrInt; var tmpPos, LineStartPos: PtrInt; DataLength: PtrInt; prevChar: Cardinal; CharLenInBytes: Integer; begin prevChar := GetPrevCharAsAscii(aPosition, CharLenInBytes); if CharLenInBytes = 0 then Exit(aPosition); // Check if this already is not a start of line (if previous char is #10). if prevChar = 10 then Exit(aPosition); tmpPos := aPosition - CharLenInBytes; if tmpPos <= FLowLimit then Exit(FLowLimit); // Check if we're not in the middle of line ending // (previous char is #13, current char is #10). if (prevChar = 13) and (GetNextCharAsAscii(aPosition, CharLenInBytes) = 10) then begin prevChar := GetPrevCharAsAscii(tmpPos, CharLenInBytes); if CharLenInBytes = 0 then Exit(aPosition); Dec(tmpPos, CharLenInBytes); end; if tmpPos <= FLowLimit then Exit(FLowLimit); // Search for real start of line. while (not (prevChar in [10, 13])) and (tmpPos > FLowLimit) do begin prevChar := GetPrevCharAsAscii(tmpPos, CharLenInBytes); if CharLenInBytes = 0 then Break; Dec(tmpPos, CharLenInBytes); end; // Move forward to first non-line ending character. Inc(tmpPos, CharLenInBytes); // Search for start of real line or wrapped line. while True do begin LineStartPos := tmpPos; CalcTextLineLength(tmpPos, FHighLimit, DataLength); if tmpPos = aPosition then begin if aPosition < FHighLimit then Exit(aPosition) // aPosition is already at start of a line else Exit(LineStartPos); // aPosition points to end of file so return start of this line end else if tmpPos > aPosition then Exit(LineStartPos); // Found start of line end; end; function GetStartOfLineFixed(aFixedWidth: Integer): PtrInt; begin Result := aPosition - (aPosition mod aFixedWidth); end; var i: Integer; begin if aPosition <= FLowLimit then Exit(FLowLimit) else if aPosition >= FHighLimit then aPosition := FHighLimit; // search from the end of the file // Speedup for currently displayed positions. if (FLineList.Count > 0) and (aPosition >= FLineList.Items[0]) and (aPosition <= FLineList.Items[FLineList.Count - 1]) then begin for i := FLineList.Count - 1 downto 0 do if FLineList.Items[i] <= aPosition then Exit(FLineList.Items[i]); end; case FViewerMode of vmBin: Result := GetStartOfLineFixed(cBinWidth); vmHex: Result := GetStartOfLineFixed(cHexWidth); vmText, vmWrap, vmBook: Result := GetStartOfLineText; else Result := aPosition; end; end; function TViewerControl.GetEndOfLine(aPosition: PtrInt): PtrInt; function GetEndOfLineText: PtrInt; var tmpPos: PtrInt; DataLength: PtrInt; begin Result := GetStartOfLine(aPosition); tmpPos := Result; CalcTextLineLength(tmpPos, FHighLimit, DataLength); Result := Result + DataLength; if Result < aPosition then Result := aPosition; end; function GetEndOfLineFixed(aFixedWidth: Integer): PtrInt; begin Result := aPosition - (aPosition mod aFixedWidth) + aFixedWidth; end; begin case FViewerMode of vmBin: Result := GetEndOfLineFixed(cBinWidth); vmHex: Result := GetEndOfLineFixed(cHexWidth); vmText, vmWrap, vmBook: Result := GetEndOfLineText; else Result := aPosition; end; end; function TViewerControl.GetStartOfPrevLine(aPosition: PtrInt): PtrInt; function GetPrevLineText: PtrInt; var tmpPos, LineStartPos: PtrInt; DataLength: PtrInt; prevChar: Cardinal; CharLenInBytes: Integer; begin prevChar := GetPrevCharAsAscii(aPosition, CharLenInBytes); if CharLenInBytes = 0 then Exit(aPosition); tmpPos := aPosition - CharLenInBytes; // start search from previous character if tmpPos <= FLowLimit then Exit(FLowLimit); // Check if we're not in the middle of line ending // (previous char is #13, current char is #10). if (prevChar = 13) and (GetNextCharAsAscii(aPosition, CharLenInBytes) = 10) then begin prevChar := GetPrevCharAsAscii(tmpPos, CharLenInBytes); if CharLenInBytes = 0 then Exit(aPosition); Dec(tmpPos, CharLenInBytes); end else begin // Bypass possible end of previous line. if prevChar = 10 then begin prevChar := GetPrevCharAsAscii(tmpPos, CharLenInBytes); if CharLenInBytes = 0 then Exit(aPosition); Dec(tmpPos, CharLenInBytes); end; if prevChar = 13 then begin prevChar := GetPrevCharAsAscii(tmpPos, CharLenInBytes); if CharLenInBytes = 0 then Exit(aPosition); Dec(tmpPos, CharLenInBytes); end; end; if tmpPos <= FLowLimit then Exit(FLowLimit); // Search for real start of line. while (not (prevChar in [10, 13])) and (tmpPos > FLowLimit) do begin prevChar := GetPrevCharAsAscii(tmpPos, CharLenInBytes); if CharLenInBytes = 0 then Break; Dec(tmpPos, CharLenInBytes); end; // Move forward to first non-line ending character. Inc(tmpPos, CharLenInBytes); // Search for start of real line or wrapped line. while True do begin LineStartPos := tmpPos; CalcTextLineLength(tmpPos, aPosition, DataLength); if tmpPos >= aPosition then Exit(LineStartPos); // Found start of line end; end; function GetPrevLineFixed(aFixedWidth: Integer): PtrInt; begin Result := aPosition - (aPosition mod aFixedWidth); if Result >= aFixedWidth then Result := Result - aFixedWidth; end; var i: Integer; begin if aPosition <= FLowLimit then Exit(FLowLimit) else if aPosition >= FHighLimit then aPosition := FHighLimit; // search from the end of the file // Speedup for currently displayed positions. if (FLineList.Count > 0) and (aPosition >= FLineList.Items[0]) and (aPosition <= FLineList.Items[FLineList.Count - 1]) then begin for i := FLineList.Count - 1 downto 0 do if FLineList.Items[i] < aPosition then Exit(FLineList.Items[i]); end; case FViewerMode of vmBin: Result := GetPrevLineFixed(cBinWidth); vmHex: Result := GetPrevLineFixed(cHexWidth); vmText, vmWrap, vmBook: Result := GetPrevLineText; else Result := aPosition; end; end; function TViewerControl.GetStartOfNextLine(aPosition: PtrInt): PtrInt; function GetNextLineText: PtrInt; var tmpPos: PtrInt; DataLength: PtrInt; prevChar: Cardinal; CharLenInBytes: Integer; begin tmpPos := aPosition; // This might not be a real start of line (it may be start of wrapped line). // Search for start of line. while (tmpPos > FLowLimit) do begin prevChar := GetPrevCharAsAscii(tmpPos, CharLenInBytes); if CharLenInBytes = 0 then Break; if (prevChar in [10, 13]) then Break else Dec(tmpPos, CharLenInBytes); end; // Now we know we are at the start of a line, search the start of next line. while True do begin CalcTextLineLength(tmpPos, FHighLimit, DataLength); if tmpPos >= aPosition then Exit(tmpPos); // Found start of line end; end; function GetNextLineFixed(aFixedWidth: Integer): PtrInt; begin Result := aPosition - (aPosition mod aFixedWidth); if Result + aFixedWidth < FHighLimit then Result := Result + aFixedWidth; end; var i: Integer; begin if aPosition < FLowLimit then aPosition := FLowLimit // search from the start of the file else if aPosition >= FHighLimit then aPosition := FHighLimit; // search from the end of the file // Speedup for currently displayed positions. if (FLineList.Count > 0) and (aPosition >= FLineList.Items[0]) and (aPosition <= FLineList.Items[FLineList.Count - 1]) then begin for i := 0 to FLineList.Count - 1 do if FLineList.Items[i] > aPosition then Exit(FLineList.Items[i]); end; case FViewerMode of vmBin: Result := GetNextLineFixed(cBinWidth); vmHex: Result := GetNextLineFixed(cHexWidth); vmText, vmWrap, vmBook: Result := GetNextLineText; else Result := aPosition; end; end; procedure TViewerControl.PageUp; var H: Integer; begin H := GetClientHeightInLines * FColCount - 1; if H <= 0 then H := 1; Scroll(-H); end; procedure TViewerControl.HPageUp; var H: Integer; begin H := FHPosition - FTextWidth; if H <= 0 then H := FHPosition else H:= FTextWidth; HScroll(-H); end; procedure TViewerControl.PageDown; var H: Integer; begin H := GetClientHeightInLines * FColCount - 1; if H <= 0 then H := 1; Scroll(H); end; procedure TViewerControl.HPageDown; var H: Integer; begin H := FHLowEnd - FHPosition; if H > FTextWidth then H := FTextWidth ; HScroll(H); end; procedure TViewerControl.GoHome; begin Position := FLowLimit; end; procedure TViewerControl.GoEnd; begin Position := FHighLimit; end; procedure TViewerControl.HGoHome; begin HScroll (-FHPosition); end; procedure TViewerControl.HGoEnd; begin HScroll (FHLowEnd-FHPosition); end; procedure TViewerControl.SetFileName(const sFileName: UTF8String); begin if not (csDesigning in ComponentState) then begin UnMapFile; if sFileName <> '' then begin if MapFile(sFileName) then begin FFileName := sFileName; // Detect encoding if needed. if FEncoding = veAutoDetect then FEncoding := DetectEncoding; ReReadFile; end; end; end else FFileName := sFileName; end; function TViewerControl.MapFile(const sFileName: UTF8String): Boolean; function ReadFile: Boolean; inline; begin FMappedFile := GetMem(FFileSize); Result := (FileRead(FFileHandle, FMappedFile^, FFileSize) = FFileSize); FileClose(FFileHandle); FFileHandle := 0; end; {$IFDEF MSWINDOWS} var wFileName: WideString; begin Result := False; if Assigned(FMappedFile) then UnMapFile; // if needed wFileName := UTF8Decode(sFileName); FFileHandle := CreateFileW(PWChar(wFileName), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if FFileHandle = INVALID_HANDLE_VALUE then begin FFileHandle := 0; Exit; end; FFileSize := GetFileSize(FFileHandle, nil); if (FFileSize < MaxMemSize) then begin Result := ReadFile; Exit; end; FMappingHandle := CreateFileMapping(FFileHandle, nil, PAGE_READONLY, 0, 0, nil); if FMappingHandle <> 0 then FMappedFile := MapViewOfFile(FMappingHandle, FILE_MAP_READ, 0, 0, 0) else begin FMappedFile := nil; FileClose(FFileHandle); FFileHandle := 0; Exit; end; Result := True; end; {$ELSE} var StatBuf: Stat; begin Result := False; if Assigned(FMappedFile) then UnMapFile; // if needed FFileHandle := fpOpen(PChar(sFileName), O_RDONLY); if FFileHandle = feInvalidHandle then begin FFileHandle := 0; Exit; end; if fpFStat(FFileHandle, StatBuf) <> 0 then begin fpClose(FFileHandle); FFileHandle := 0; Exit; end; FFileSize := StatBuf.st_size; if (FFileSize < MaxMemSize) then begin Result := ReadFile; Exit; end; FMappedFile := fpmmap(nil, FFileSize, PROT_READ, MAP_PRIVATE{SHARED}, FFileHandle, 0); if FMappedFile = MAP_FAILED then begin FMappedFile:= nil; fpClose(FFileHandle); FFileHandle := 0; Exit; end; Result:= True; end; {$ENDIF} procedure TViewerControl.UnMapFile; begin if (FFileSize < MaxMemSize) then begin if Assigned(FMappedFile) then begin FreeMem(FMappedFile); FMappedFile := nil; end; end; {$IFDEF MSWINDOWS} if Assigned(FMappedFile) then begin UnmapViewOfFile(FMappedFile); FMappedFile := nil; end; if FMappingHandle <> 0 then begin CloseHandle(FMappingHandle); FMappingHandle := 0; end; if FFileHandle <> 0 then begin FileClose(FFileHandle); FFileHandle := 0; end; {$ELSE} if Assigned(FMappedFile) then begin if fpmunmap(FMappedFile, FFileSize) = -1 then DebugLn('Error unmapping file: ', SysErrorMessage(fpgeterrno)); FMappedFile := nil; end; if FFileHandle <> 0 then begin fpClose(FFileHandle); FFileHandle := 0; end; {$ENDIF} FFileName := ''; FFileSize := 0; Position := 0; FLowLimit := 0; FHighLimit := 0; FBOMLength := 0; FBlockBeg := 0; FBlockEnd := 0; end; procedure TViewerControl.WriteText; var yIndex, xIndex, w, scrollTab, i: Integer; LineStart, iPos: PtrInt; DataLength: PtrInt; begin iPos := FPosition; if ViewerMode = vmBook then w := Width div FColCount else w := 0; if (ViewerMode = vmText) and (FHPosition>0) then scrollTab := -FHPosition * Canvas.TextWidth('W') else scrollTab :=0; for xIndex := 0 to FColCount-1 do begin for yIndex := 0 to GetClientHeightInLines - 1 do begin if iPos >= FHighLimit then Break; AddLineOffset(iPos); LineStart := iPos; i := CalcTextLineLength(iPos, FHighLimit, DataLength); if i > FHLowEnd then FHLowEnd:=i; if DataLength > 0 then OutText(scrollTab+xIndex*w, yIndex * FTextHeight, LineStart, DataLength) end; end; end; procedure TViewerControl.WriteHex; var yIndex: Integer; iPos, LineStart: PtrInt; s: string; begin iPos := FPosition; for yIndex := 0 to GetClientHeightInLines - 1 do begin if iPos >= FHighLimit then Break; LineStart := iPos; AddLineOffset(iPos); s := TransformHex(iPos, FHighLimit); if s <> '' then OutHex(0, yIndex * FTextHeight, s, LineStart, iPos - LineStart); end; end; procedure TViewerControl.WriteBin; var yIndex: Integer; iPos, LineStart: PtrInt; s: string; begin iPos := FPosition; for yIndex := 0 to GetClientHeightInLines - 1 do begin if iPos >= FHighLimit then Break; LineStart := iPos; AddLineOffset(iPos); s := TransformBin(iPos, FHighLimit); if s <> '' then OutBin(0, yIndex * FTextHeight, s, LineStart, iPos - LineStart); end; end; function TViewerControl.GetDataAdr: Pointer; begin case FViewerMode of vmText, vmWrap, vmBook: Result := FMappedFile + FBOMLength; else Result := FMappedFile; end; end; procedure TViewerControl.SetPosition(Value: PtrInt); begin SetPosition(Value, False); end; procedure TViewerControl.SetHPosition(Value: Integer); begin SetHPosition(Value, False); end; procedure TViewerControl.SetHPosition(Value: Integer; Force: Boolean); begin if not IsFileOpen then Exit; FHPosition := Value; // Set new scroll position. if (FHLowEnd - FTextWidth) > 0 then begin if FHPosition > 0 then FHScrollBarPosition := FHPosition * 100 div (FHLowEnd - FTextWidth) else FHScrollBarPosition := 0; end; // Update scrollbar position. if FUpdateScrollBarPos then begin if FScrollBarHorz.Position <> FHScrollBarPosition then begin // Workaround for bug: http://bugs.freepascal.org/view.php?id=23815 {$IF DEFINED(LCLQT) and (LCL_FULLVERSION < 1010000)} FScrollBarHorz.OnScroll := nil; FScrollBarHorz.Position := FHScrollBarPosition; Application.ProcessMessages; // Skip message FScrollBarHorz.OnScroll := @ScrollBarHorzScroll; {$ELSE} FScrollBarHorz.Position := FHScrollBarPosition; {$ENDIF} end; end; // else the scrollbar position will be updated in ScrollBarVertScroll Invalidate; end; procedure TViewerControl.SetPosition(Value: PtrInt; Force: Boolean); var LinesTooMany: Integer; LastLineReached: Boolean; begin if not IsFileOpen then Exit; // Speedup if total nr of lines is less then nr of lines that can be displayed. if (FPosition = FLowLimit) and // only if already at the top (FLineList.Count > 0) and (FLineList.Count < GetClientHeightInLines) then Value := FLowLimit else // Boundary checks are done in GetStartOfLine. Value := GetStartOfLine(Value); if (Value <> FPosition) or Force then begin // Don't allow empty lines at the bottom of the control. LinesTooMany := GetClientHeightInLines - GetLinesTillEnd(Value, LastLineReached); if LinesTooMany > 0 then ScrollPosition(Value, -LinesTooMany); // scroll back upwards FPosition := Value; if Assigned(FOnPositionChanged) then FOnPositionChanged(Self); Invalidate; // Set new scroll position. if LastLineReached then FScrollBarPosition := 100 else FScrollBarPosition := Percent; end; // Update scrollbar position. if FUpdateScrollBarPos then begin if FScrollBarVert.Position <> FScrollBarPosition then begin // Workaround for bug: http://bugs.freepascal.org/view.php?id=23815 {$IF DEFINED(LCLQT) and (LCL_FULLVERSION < 1010000)} FScrollBarVert.OnScroll := nil; FScrollBarVert.Position := FScrollBarPosition; Application.ProcessMessages; // Skip message FScrollBarVert.OnScroll := @ScrollBarVertScroll; {$ELSE} FScrollBarVert.Position := FScrollBarPosition; {$ENDIF} end; end; // else the scrollbar position will be updated in ScrollBarVertScroll end; procedure TViewerControl.SetEncoding(AEncoding: TViewerEncoding); begin if not (csDesigning in ComponentState) then begin if AEncoding = veAutoDetect then FEncoding := DetectEncoding else FEncoding := AEncoding; ReReadFile; end else FEncoding := AEncoding; end; function TViewerControl.GetEncodingName: string; begin Result := ViewerEncodingsNames[FEncoding]; end; procedure TViewerControl.SetEncodingName(AEncodingName: string); var i: TViewerEncoding; begin for i := Low(TViewerEncoding) to High(TViewerEncoding) do if NormalizeEncoding(ViewerEncodingsNames[i]) = NormalizeEncoding(AEncodingName) then begin SetEncoding(i); break; end; end; function TViewerControl.GetClientHeightInLines: Integer; begin if FViewerMode <> vmText then Result:= 0 else // Take horizontal scrollbar into account Result:= GetSystemMetrics(SM_CYHSCROLL); if FTextHeight > 0 then Result := (ClientRect.Bottom - ClientRect.Top - Result) div FTextHeight // or Self.Height div FTextHeight? else Result := 0; end; function TViewerControl.GetLinesTillEnd(FromPosition: PtrInt; out LastLineReached: Boolean): Integer; var yIndex: Integer; iPos: PtrInt; DataLength: PtrInt; begin Result := 0; iPos := FromPosition; for yIndex := 0 to GetClientHeightInLines - 1 do begin if iPos >= FHighLimit then Break; Inc(Result, 1); case ViewerMode of vmBin: iPos := iPos + cBinWidth; vmHex: iPos := iPos + cHexWidth; vmText, vmWrap, vmBook: CalcTextLineLength(iPos, FHighLimit, DataLength); end; end; LastLineReached := (iPos >= FHighLimit); end; function TViewerControl.GetPercent: Integer; begin if FHighLimit - FLowLimit > 0 then Result := (Int64(FPosition - FLowLimit) * 100) div Int64(FHighLimit - FLowLimit) else Result := 0; end; procedure TViewerControl.SetPercent(const AValue: Integer); begin if FHighLimit - FLowLimit > 0 then Position := Int64(AValue) * (Int64(FHighLimit - FLowLimit) div 100) + FLowLimit else Position := 0; end; procedure TViewerControl.SetBlockBegin(const AValue: PtrInt); begin if (AValue >= FLowLimit) and (AValue < FHighLimit) then begin if FBlockEnd < AValue then FBlockEnd := AValue; FBlockBeg := AValue; Invalidate; end; end; procedure TViewerControl.SetBlockEnd(const AValue: PtrInt); begin if (AValue >= FLowLimit) and (AValue < FHighLimit) then begin if FBlockBeg > AValue then FBlockBeg := AValue; FBlockEnd := AValue; Invalidate; end; end; procedure TViewerControl.OutText(x, y: Integer; StartPos: PtrInt; DataLength: Integer); var pBegLine, pEndLine: PtrInt; iBegDrawIndex, iEndDrawIndex: PtrInt; xOffset: Integer; sText: string; begin pBegLine := StartPos; pEndLine := pBegLine + DataLength; if ((FBlockEnd - FBlockBeg) = 0) or ((FBlockBeg < pBegLine) and (FBlockEnd < pBegLine)) or // before ((FBlockBeg > pEndLine) and (FBlockEnd > pEndLine)) then //after begin // out of selection, draw normal Canvas.Font.Color := Font.Color; Canvas.TextOut(x, y, GetText(StartPos, DataLength, 0)); Exit; end; // Get selection start/end. if (FBlockBeg <= pBegLine) then iBegDrawIndex := pBegLine else iBegDrawIndex := FBlockBeg; if (FBlockEnd < pEndLine) then iEndDrawIndex := FBlockEnd else iEndDrawIndex := pEndLine; xOffset := 0; // Text before selection. if iBegDrawIndex - pBegLine > 0 then begin sText := GetText(StartPos, iBegDrawIndex - pBegLine, xOffset); Canvas.Font.Color := Font.Color; Canvas.TextOut(x, y, sText); x := x + Canvas.TextWidth(sText); xOffset := xOffset + UTF8Length(sText); end; // Selected text. sText := GetText(StartPos + iBegDrawIndex - pBegLine, iEndDrawIndex - iBegDrawIndex, xOffset); Canvas.Brush.Color := clHighlight; Canvas.Font.Color := clHighlightText; // Cannot simply draw text with brush with TextOut // because it differs between widgetsets. Canvas.Brush.Style := bsSolid; Canvas.FillRect(Bounds(x, y, Canvas.TextWidth(sText), FTextHeight)); Canvas.Brush.Style := bsClear; // Or use TextRect instead of TextOut with Opaque = True. //ts := Canvas.TextStyle; //ts.Opaque := True; //ts.Clipping := True; //Canvas.TextRect(Bounds(X, Y, Canvas.TextWidth(sText), FTextHeight), X, Y, sText, ts); Canvas.TextOut(x, y, sText); x := x + Canvas.TextWidth(sText); xOffset := xOffset + UTF8Length(sText); // restore previous canvas settings Canvas.Brush.Color := Color; Canvas.Font.Color := Font.Color; // Text after selection. if pEndLine - iEndDrawIndex > 0 then begin sText := GetText(StartPos + iEndDrawIndex - pBegLine, pEndLine - iEndDrawIndex, xOffset); Canvas.TextOut(x, y, sText); end; end; procedure TViewerControl.OutHex(x, y: Integer; sText: string; StartPos: PtrInt; DataLength: Integer); var pBegLine, pEndLine: PtrInt; iBegDrawIndex, iEndDrawIndex: PtrInt; sNextText: String = ''; sTmpText: String; begin pBegLine := StartPos; pEndLine := pBegLine + DataLength; if ((FBlockEnd - FBlockBeg) = 0) or ((FBlockBeg < pBegLine) and (FBlockEnd <= pBegLine)) or // before ((FBlockBeg > pEndLine) and (FBlockEnd > pEndLine)) then //after begin // out of selection, draw normal Canvas.Font.Color := Font.Color; Canvas.TextOut(x, y, sText); Exit; end; // Get selection start/end. if (FBlockBeg <= pBegLine) then iBegDrawIndex := pBegLine else iBegDrawIndex := FBlockBeg; if (FBlockEnd < pEndLine) then iEndDrawIndex := FBlockEnd else iEndDrawIndex := pEndLine; // Text before selection (offset and hex part). sTmpText := Copy(sText, 1, cHexStartHex + (iBegDrawIndex - pBegLine) * 3); Canvas.Font.Color := Font.Color; Canvas.TextOut(x, y, sTmpText); x := x + Canvas.TextWidth(sTmpText); // Selected text (hex part). sTmpText := Copy(sText, 1 + cHexStartHex + (iBegDrawIndex - pBegLine) * 3, (iEndDrawIndex - iBegDrawIndex) * 3); // Move last character from selection to not selected text. sNextText := Copy(sTmpText, Length(sTmpText), 1); Delete(sTmpText, Length(sTmpText), 1); Canvas.Brush.Color := clHighlight; Canvas.Font.Color := clHighlightText; Canvas.Brush.Style := bsSolid; Canvas.FillRect(Bounds(x, y, Canvas.TextWidth(sTmpText), FTextHeight)); Canvas.Brush.Style := bsClear; Canvas.TextOut(x, y, sTmpText); x := x + Canvas.TextWidth(sTmpText); // restore previous canvas settings Canvas.Brush.Color := Color; Canvas.Font.Color := Font.Color; // Text after selection (hex part). if pEndLine - iEndDrawIndex > 0 then begin sTmpText := sNextText + Copy(sText, 1 + cHexStartHex + (iEndDrawIndex - pBegLine) * 3, (pEndLine - iEndDrawIndex) * 3); sNextText := ''; Canvas.TextOut(x, y, sTmpText); x := x + Canvas.TextWidth(sTmpText); end; // Space after hex if data doesn't span full line. if DataLength < cHexWidth then sNextText := sNextText + Copy(sText, 1 + cHexStartHex + DataLength * 3, (cHexWidth - DataLength) * 3); // Space between hex and ascii. sTmpText := sNextText + ' '; Canvas.TextOut(x, y, sTmpText); x := x + Canvas.TextWidth(sTmpText); // Text before selection (ascii part). if iBegDrawIndex - pBegLine > 0 then begin sTmpText := Copy(sText, 1 + cHexStartAscii, iBegDrawIndex - pBegLine); Canvas.TextOut(x, y, sTmpText); x := x + Canvas.TextWidth(sTmpText); end; // Selected text (ascii part). sTmpText := Copy(sText, 1 + cHexStartAscii + iBegDrawIndex - pBegLine, iEndDrawIndex - iBegDrawIndex); Canvas.Brush.Color := clHighlight; Canvas.Font.Color := clHighlightText; Canvas.Brush.Style := bsSolid; Canvas.FillRect(Bounds(x, y, Canvas.TextWidth(sTmpText), FTextHeight)); Canvas.Brush.Style := bsClear; Canvas.TextOut(x, y, sTmpText); x := x + Canvas.TextWidth(sTmpText); // restore background color Canvas.Brush.Color := Color; Canvas.Font.Color := Font.Color; // Text after selection. if pEndLine - iEndDrawIndex > 0 then begin sTmpText := Copy(sText, 1 + cHexStartAscii + iEndDrawIndex - pBegLine, pEndLine - iEndDrawIndex); Canvas.TextOut(x, y, sTmpText); end; end; procedure TViewerControl.OutBin(x, y: Integer; sText: string; StartPos: PtrInt; DataLength: Integer); var pBegLine, pEndLine: PtrInt; iBegDrawIndex, iEndDrawIndex: PtrInt; sTmpText: String; begin pBegLine := StartPos; pEndLine := pBegLine + DataLength; if ((FBlockEnd - FBlockBeg) = 0) or ((FBlockBeg < pBegLine) and (FBlockEnd < pBegLine)) or // before ((FBlockBeg > pEndLine) and (FBlockEnd > pEndLine)) then //after begin // out of selection, draw normal Canvas.Font.Color := Font.Color; Canvas.TextOut(x, y, sText); Exit; end; // Get selection start/end. if (FBlockBeg <= pBegLine) then iBegDrawIndex := pBegLine else iBegDrawIndex := FBlockBeg; if (FBlockEnd < pEndLine) then iEndDrawIndex := FBlockEnd else iEndDrawIndex := pEndLine; // Text before selection. if iBegDrawIndex - pBegLine > 0 then begin sTmpText := Copy(sText, 1, iBegDrawIndex - pBegLine); Canvas.Font.Color := Font.Color; Canvas.TextOut(x, y, sTmpText); x := x + Canvas.TextWidth(sTmpText); end; // Selected text. sTmpText := Copy(sText, 1 + iBegDrawIndex - pBegLine, iEndDrawIndex - iBegDrawIndex); Canvas.Brush.Color := clHighlight; Canvas.Font.Color := clHighlightText; Canvas.Brush.Style := bsSolid; Canvas.FillRect(Bounds(x, y, Canvas.TextWidth(sTmpText), FTextHeight)); Canvas.Brush.Style := bsClear; Canvas.TextOut(x, y, sTmpText); x := x + Canvas.TextWidth(sTmpText); // restore previous canvas settings Canvas.Brush.Color := Color; Canvas.Font.Color := Font.Color; // Text after selection. if pEndLine - iEndDrawIndex > 0 then begin sTmpText := Copy(sText, 1 + iEndDrawIndex - pBegLine, pEndLine - iEndDrawIndex); Canvas.TextOut(x, y, sTmpText); end; end; procedure TViewerControl.AddLineOffset(iOffset: PtrInt); begin FLineList.Add(iOffset); end; procedure TViewerControl.KeyDown(var Key: word; Shift: TShiftState); begin if Shift = [] then begin case Key of VK_DOWN: begin Key := 0; Scroll(1); end; VK_UP: begin Key := 0; Scroll(-1); end; VK_HOME: begin Key := 0; GoHome; end; VK_END: begin Key := 0; GoEnd; end; VK_PRIOR: begin Key := 0; PageUp; end; VK_NEXT: begin Key := 0; PageDown; end; else inherited KeyDown(Key, Shift); end; end else if Shift = [ssCtrl] then begin case Key of VK_HOME: begin Key := 0; GoHome; end; VK_END: begin Key := 0; GoEnd; end; else inherited KeyDown(Key, Shift); end; end else inherited KeyDown(Key, Shift); end; function TViewerControl.FindAsciiSetForward(aPosition, aMaxBytes: PtrInt; const AsciiChars: String; bFindNotIn: Boolean): PtrInt; var i: Integer; found: Boolean; u: Cardinal; CharLenInBytes: Integer; begin Result := -1; while aMaxBytes > 0 do begin u := GetNextCharAsAscii(aPosition, CharLenInBytes); if CharLenInBytes = 0 then Exit; if not bFindNotIn then begin for i := 1 to Length(AsciiChars) do if u = ord(AsciiChars[i]) then Exit(aPosition); end else begin found := False; for i := 1 to Length(AsciiChars) do if u = ord(AsciiChars[i]) then begin found := True; break; end; if not found then Exit(aPosition); end; Inc(aPosition, CharLenInBytes); Dec(aMaxBytes, CharLenInBytes); end; end; function TViewerControl.FindAsciiSetBackward(aPosition, aMaxBytes: PtrInt; const AsciiChars: String; bFindNotIn: Boolean): PtrInt; var i: Integer; found: Boolean; u: Cardinal; CharLenInBytes: Integer; begin Result := -1; while aMaxBytes > 0 do begin u := GetPrevCharAsAscii(aPosition, CharLenInBytes); if CharLenInBytes = 0 then Exit; if not bFindNotIn then begin for i := 1 to Length(AsciiChars) do if u = ord(AsciiChars[i]) then Exit(aPosition); end else begin found := False; for i := 1 to Length(AsciiChars) do if u = ord(AsciiChars[i]) then begin found := True; break; end; if not found then Exit(aPosition); end; Dec(aPosition, CharLenInBytes); Dec(aMaxBytes, CharLenInBytes); end; end; procedure TViewerControl.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var LineBegin, LineEnd: PtrInt; ClickPos: PtrInt; CharSide: TCharSide; begin inherited; SetFocus; if not IsFileOpen then Exit; case Button of mbLeft: begin if Shift * [ssDouble, ssTriple] = [] then begin // Single click. ClickPos := XYPos2Adr(x, y, CharSide); if ClickPos <> -1 then begin FBlockBeg := ClickPos; FBlockEnd := ClickPos; FMouseBlockBeg := ClickPos; FMouseBlockSide := CharSide; FSelecting := True; Invalidate; end else FSelecting := False; end else // if double click or triple click begin FSelecting := False; LineBegin := GetStartOfLine(FMouseBlockBeg); LineEnd := GetEndOfLine(FMouseBlockBeg); if ssDouble in Shift then begin // Select word with double-click. FBlockBeg := FindAsciiSetBackward(FMouseBlockBeg, FMouseBlockBeg - LineBegin, sNonCharacter, False); FBlockEnd := FindAsciiSetForward(FMouseBlockBeg, LineEnd - FMouseBlockBeg, sNonCharacter, False); end else if ssTriple in Shift then begin // Select line with triple-click. FBlockBeg := FindAsciiSetForward(LineBegin, LineEnd - LineBegin, sWhiteSpace, True); FBlockEnd := FindAsciiSetBackward(LineEnd, LineEnd - LineBegin, sWhiteSpace, True); end; if FBlockBeg = -1 then FBlockBeg := LineBegin; if FBlockEnd = -1 then FBlockEnd := LineEnd; if FBlockBeg > FBlockEnd then FBlockEnd := FBlockBeg; CopyToClipboard; Invalidate; end; end; // mbLeft end; // case end; procedure TViewerControl.MouseMove(Shift: TShiftState; X, Y: Integer); procedure MoveOneChar(var aPosition: PtrInt); var CharLenInBytes: Integer; begin GetNextCharAsAscii(aPosition, CharLenInBytes); aPosition := aPosition + CharLenInBytes; end; procedure MoveOneCharByMouseSide(var aPosition: PtrInt); begin if FMouseBlockSide in [csRight, csAfter] then MoveOneChar(aPosition); end; var ClickPos: PtrInt; CharSide: TCharSide; begin inherited; if FSelecting then begin if y < FTextHeight then Scroll(-3) else if y > ClientHeight - FTextHeight then Scroll(3); ClickPos := XYPos2Adr(x, y, CharSide); if ClickPos <> -1 then begin if ClickPos < FMouseBlockBeg then begin // Got a new beginning. FBlockBeg := ClickPos; FBlockEnd := FMouseBlockBeg; // Move end beyond last character. MoveOneCharByMouseSide(FBlockEnd); // When selecting from right to left, the current selected side must be // either csLeft or csBefore, otherwise current position is not included. if not (CharSide in [csLeft, csBefore]) then begin // Current position should not be included in selection. // Move beginning after first character. MoveOneChar(FBlockBeg); end; end else if ClickPos > FMouseBlockBeg then begin // Got a new end. FBlockBeg := FMouseBlockBeg; FBlockEnd := ClickPos; // Move beginning after first character. MoveOneCharByMouseSide(FBlockBeg); // When selecting from left to right, the current selected side must be // either csRight or csAfter, otherwise current position is not included. if CharSide in [csRight, csAfter] then begin // Current position should be included in selection. // Move end beyond last character. MoveOneChar(FBlockEnd); end; end else if FMouseBlockSide <> CharSide then begin // Same position but changed side of the character. FBlockBeg := FMouseBlockBeg; FBlockEnd := FMouseBlockBeg; if ((FMouseBlockSide in [csBefore, csLeft]) and (CharSide in [csRight, csAfter])) or ((FMouseBlockSide in [csRight, csAfter]) and (CharSide in [csBefore, csLeft])) then begin // Move end beyond last character. MoveOneChar(FBlockEnd); end; end else begin FBlockBeg := FMouseBlockBeg; FBlockEnd := FMouseBlockBeg; end; Invalidate; end; end; end; procedure TViewerControl.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited; if FSelecting and (Button = mbLeft) and (Shift * [ssDouble, ssTriple] = []) then begin CopyToClipboard; FSelecting := False; end; end; function TViewerControl.DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; begin Result := inherited; if not Result then Result := Scroll(Mouse.WheelScrollLines); end; function TViewerControl.DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; begin Result := inherited; if not Result then Result := Scroll(-Mouse.WheelScrollLines); end; function TViewerControl.XYPos2Adr(x, y: Integer; out CharSide: TCharSide): PtrInt; var yIndex: Integer; StartLine, EndLine: PtrInt; function XYPos2AdrBin: PtrInt; var i: Integer; px: Integer = 0; charWidth: Integer; sText: String; tmpPosition: PtrInt; begin tmpPosition := StartLine; sText := TransformBin(tmpPosition, EndLine); for i := 1 to Length(sText) do begin charWidth := Canvas.TextWidth(string(sText[i])); if px + charWidth > x then begin if px + charWidth div 2 > x then CharSide := csLeft else CharSide := csRight; Exit(StartLine + i - 1); // -1 because we count from 1 end; px := px + charWidth; end; CharSide := csBefore; Result := EndLine; end; function XYPos2AdrHex: PtrInt; var i: Integer; px: Integer = 0; charWidth: Integer; sText, sPartialText: String; tmpPosition: PtrInt; begin tmpPosition := StartLine; sText := TransformHex(tmpPosition, EndLine); // Clicked on offset. sPartialText := Copy(sText, 1, cHexStartHex); charWidth := Canvas.TextWidth(sPartialText); px := px + charWidth; if px > x then begin CharSide := csBefore; Exit(StartLine); end; // Clicked on hex part. for i := 0 to cHexWidth - 1 do begin sPartialText := Copy(sText, 1 + cHexStartHex + i * 3, 2); charWidth := Canvas.TextWidth(sPartialText); if px + charWidth > x then begin // Check if we're not after end of data. if StartLine + i >= EndLine then begin CharSide := csBefore; Exit(EndLine); end; if px + charWidth div 2 > x then CharSide := csLeft else CharSide := csRight; Exit(StartLine + i); end; // Space after hex number. charWidth := charWidth + Canvas.TextWidth(string(sText[1 + cHexStartHex + i * 3 + 2])); if px + charWidth > x then begin CharSide := csAfter; Exit(StartLine + i); end; px := px + charWidth; end; // Clicked between hex and ascii. sPartialText := Copy(sText, 1 + cHexEndHex, cHexStartAscii - cHexEndHex); charWidth := Canvas.TextWidth(sPartialText); if px + charWidth > x then begin Exit(-1); // No position. end; px := px + charWidth; // Clicked on ascii part. for i := 0 to cHexWidth - 1 do begin charWidth := Canvas.TextWidth(string(sText[1 + cHexStartAscii + i])); if px + charWidth > x then begin // Check if we're not after end of data. if StartLine + i >= EndLine then begin CharSide := csBefore; Exit(EndLine); end; if px + charWidth div 2 > x then CharSide := csLeft else CharSide := csRight; Exit(StartLine + i); end; px := px + charWidth; end; CharSide := csBefore; Result := EndLine; end; function XYPos2AdrText: PtrInt; var i: Integer; px: Integer = 0; charWidth: Integer; len: Integer = 0; CharLenInBytes: Integer; s: UTF8String; begin i := StartLine; while i < EndLine do begin s := GetNextCharAsUtf8(i, CharLenInBytes); if CharLenInBytes = 0 then Break; // Check if the conversion to UTF-8 was successful. if Length(s) > 0 then begin if s = #9 then begin s := StringOfChar(' ', cTabSpaces - len mod cTabSpaces); len := len + (cTabSpaces - len mod cTabSpaces); end else Inc(len); // Assume there is one character after conversion // (otherwise use Inc(len, UTF8Length(s))). if len <= FHPosition then begin i := i + CharLenInBytes; Continue; end; charWidth := Canvas.TextWidth(s); if px + charWidth > x then begin if px + charWidth div 2 > x then CharSide := csLeft else CharSide := csRight; Exit(i); end; px := px + charWidth; end; i := i + CharLenInBytes; end; CharSide := csBefore; Result := EndLine; end; begin if FLineList.Count = 0 then Exit(-1); yIndex := y div FTextHeight; if yIndex >= FLineList.Count then yIndex := FLineList.Count - 1; if yIndex < 0 then yIndex := 0; // Get position of first character of the line. StartLine := FLineList.Items[yIndex]; // Get position of last character of the line. EndLine := GetEndOfLine(StartLine); if x = 0 then begin CharSide := csBefore; Exit(StartLine); end; case ViewerMode of vmBin: Result := XYPos2AdrBin; vmHex: Result := XYPos2AdrHex; vmText, vmWrap, vmBook: Result := XYPos2AdrText; else raise Exception.Create('Invalid viewer mode'); end; end; procedure TViewerControl.SelectAll; begin SelectText(FLowLimit, FHighLimit); end; procedure TViewerControl.SelectText(AStart, AEnd: PtrInt); begin if AStart < FLowLimit then AStart := FLowLimit; if AEnd > FHighLimit then AEnd := FHighLimit; if AStart <= AEnd then begin FBlockBeg := AStart; FBlockEnd := AEnd; Invalidate; end; end; procedure TViewerControl.CopyToClipboard; var sText, utf8Text: string; begin if (FBlockEnd - FBlockBeg) <= 0 then Exit; if (FBlockEnd - FBlockBeg) > 1024 * 1024 then // Max 1 MB to clipboard Exit; SetString(sText, GetDataAdr + FBlockBeg, FBlockEnd - FBlockBeg); utf8Text := ConvertToUTF8(sText); {$IFDEF LCLGTK2} // Workaround for Lazarus bug #0021453. LCL adds trailing zero to clipboard in Clipboard.AsText. Clipboard.Clear; Clipboard.AddFormat(PredefinedClipboardFormat(pcfText), utf8Text[1], Length(utf8Text)); {$ELSE} Clipboard.AsText := utf8Text; {$ENDIF} end; function TViewerControl.GetNextCharAsAscii(const iPosition: PtrInt; out CharLenInBytes: Integer): Cardinal; var u1, u2: Word; InvalidCharLen: Integer; begin Result := 0; case FEncoding of veUtf8, veUtf8bom: begin if iPosition < FHighLimit then begin CharLenInBytes := SafeUTF8NextCharLen(GetDataAdr + iPosition, FHighLimit - iPosition, InvalidCharLen); // It's enough to only return Ascii. if CharLenInBytes = 1 then Result := PByte(GetDataAdr)[iPosition]; // Full conversion: // Result := UTF8CharacterToUnicode(PAnsiChar(GetDataAdr + iPosition), CharLenInBytes); end else CharLenInBytes := 0; end; veAnsi, veCp1250..veCp950, veIso88591, veIso88592, veKoi8: if iPosition < FHighLimit then begin Result := PByte(GetDataAdr)[iPosition]; CharLenInBytes := 1; end else CharLenInBytes := 0; veUcs2be: if iPosition + SizeOf(Word) - 1 < FHighLimit then begin Result := BEtoN(PWord(GetDataAdr + iPosition)[0]); CharLenInBytes := SizeOf(Word); end else CharLenInBytes := 0; veUcs2le: if iPosition + SizeOf(Word) - 1 < FHighLimit then begin Result := LEtoN(PWord(GetDataAdr + iPosition)[0]); CharLenInBytes := SizeOf(Word); end else CharLenInBytes := 0; veUtf16be: if iPosition + SizeOf(Word) - 1 < FHighLimit then begin u1 := BEtoN(PWord(GetDataAdr + iPosition)[0]); CharLenInBytes := UTF16CharacterLength(@u1); if CharLenInBytes = 1 then begin Result := u1; end else if iPosition + SizeOf(Word) * CharLenInBytes - 1 < FHighLimit then begin u2 := BEtoN(PWord(GetDataAdr + iPosition)[1]); Result := utf16PairToUnicode(u1, u2); end; CharLenInBytes := CharLenInBytes * SizeOf(Word); end else CharLenInBytes := 0; veUtf16le: if iPosition + SizeOf(Word) - 1 < FHighLimit then begin u1 := LEtoN(PWord(GetDataAdr + iPosition)[0]); CharLenInBytes := UTF16CharacterLength(@u1); if CharLenInBytes = 1 then begin Result := u1; end else if iPosition + SizeOf(Word) * CharLenInBytes - 1 < FHighLimit then begin u2 := LEtoN(PWord(GetDataAdr + iPosition)[1]); Result := utf16PairToUnicode(u1, u2); end else CharLenInBytes := 0; CharLenInBytes := CharLenInBytes * SizeOf(Word); end else CharLenInBytes := 0; veUtf32be: if iPosition + SizeOf(LongWord) - 1 < FHighLimit then begin Result := BEtoN(PLongWord(GetDataAdr + iPosition)[0]); CharLenInBytes := SizeOf(LongWord); end else CharLenInBytes := 0; veUtf32le: if iPosition + SizeOf(LongWord) - 1 < FHighLimit then begin Result := LEtoN(PLongWord(GetDataAdr + iPosition)[0]); CharLenInBytes := SizeOf(LongWord); end else CharLenInBytes := 0; else raise Exception.Create('Unsupported viewer encoding'); end; end; function TViewerControl.GetPrevCharAsAscii(const iPosition: PtrInt; out CharLenInBytes: Integer): Cardinal; var u1, u2: Word; InvalidCharLen: Integer; begin Result := 0; case FEncoding of veUtf8, veUtf8bom: begin if iPosition > FLowLimit then begin CharLenInBytes := SafeUTF8PrevCharLen(GetDataAdr + iPosition, iPosition - FLowLimit, InvalidCharLen); // It's enough to only return Ascii. if CharLenInBytes = 1 then Result := PByte(GetDataAdr)[iPosition - 1]; // Full conversion: // Result := UTF8CharacterToUnicode(PAnsiChar(GetDataAdr + iPosition - CharLenInBytes), CharLenInBytes); end else CharLenInBytes := 0; end; veAnsi, veCp1250..veCp950, veIso88591, veIso88592, veKoi8: if iPosition > FLowLimit then begin Result := PByte(GetDataAdr + iPosition)[-1]; CharLenInBytes := 1; end else CharLenInBytes := 0; veUcs2be: if iPosition >= FLowLimit + SizeOf(Word) then begin Result := BEtoN(PWord(GetDataAdr + iPosition)[-1]); CharLenInBytes := SizeOf(Word); end else CharLenInBytes := 0; veUcs2le: if iPosition >= FLowLimit + SizeOf(Word) then begin Result := LEtoN(PWord(GetDataAdr + iPosition)[-1]); CharLenInBytes := SizeOf(Word); end else CharLenInBytes := 0; veUtf16be: if iPosition >= FLowLimit + SizeOf(Word) then begin u1 := BEtoN(PWord(GetDataAdr + iPosition)[-1]); CharLenInBytes := UTF16CharacterLength(@u1); if CharLenInBytes = 1 then begin Result := u1; end else if iPosition >= FLowLimit + SizeOf(Word) * CharLenInBytes then begin u2 := BEtoN(PWord(GetDataAdr + iPosition)[-2]); // u2 is the first, u1 is the second value of the pair Result := utf16PairToUnicode(u2, u1); end; CharLenInBytes := CharLenInBytes * SizeOf(Word); end else CharLenInBytes := 0; veUtf16le: if iPosition >= FLowLimit + SizeOf(Word) then begin u1 := LEtoN(PWord(GetDataAdr + iPosition)[-1]); CharLenInBytes := UTF16CharacterLength(@u1); if CharLenInBytes = 1 then begin Result := u1; end else if iPosition >= FLowLimit + SizeOf(Word) * CharLenInBytes then begin u2 := LEtoN(PWord(GetDataAdr + iPosition)[-2]); // u2 is the first, u1 is the second value of the pair Result := utf16PairToUnicode(u2, u1); end; CharLenInBytes := CharLenInBytes * SizeOf(Word); end else CharLenInBytes := 0; veUtf32be: if iPosition >= FLowLimit + SizeOf(LongWord) then begin Result := BEtoN(PLongWord(GetDataAdr + iPosition)[-1]); CharLenInBytes := SizeOf(LongWord); end else CharLenInBytes := 0; veUtf32le: if iPosition >= FLowLimit + SizeOf(LongWord) then begin Result := LEtoN(PLongWord(GetDataAdr + iPosition)[-1]); CharLenInBytes := SizeOf(LongWord); end else CharLenInBytes := 0; else raise Exception.Create('Unsupported viewer encoding'); end; end; function TViewerControl.GetNextCharAsUtf8(const iPosition: PtrInt; out CharLenInBytes: Integer): UTF8String; var u1: Word; s: string; InvalidCharLen: Integer; begin Result := ''; case FEncoding of veUtf8, veUtf8bom: CharLenInBytes := SafeUTF8NextCharLen(GetDataAdr + iPosition, FHighLimit - iPosition, InvalidCharLen); veAnsi, veCp1250..veCp950, veIso88591, veIso88592, veKoi8: CharLenInBytes := 1; veUcs2be, veUcs2le: CharLenInBytes := 2; veUtf16be: if iPosition + SizeOf(Word) - 1 < FHighLimit then begin u1 := BEtoN(PWord(GetDataAdr + iPosition)[0]); CharLenInBytes := UTF16CharacterLength(@u1) * SizeOf(Word); end else CharLenInBytes := 0; veUtf16le: if iPosition + SizeOf(Word) - 1 < FHighLimit then begin u1 := LEtoN(PWord(GetDataAdr + iPosition)[0]); CharLenInBytes := UTF16CharacterLength(@u1) * SizeOf(Word); end else CharLenInBytes := 0; veUtf32be, veUtf32le: CharLenInBytes := 4; else raise Exception.Create('Unsupported viewer encoding'); end; if (CharLenInBytes > 0) and (iPosition + CharLenInBytes - 1 < FHighLimit) then begin SetString(s, GetDataAdr + iPosition, CharLenInBytes); Result := ConvertToUTF8(s); end else Result := ''; end; function TViewerControl.ConvertToUTF8(const sText: AnsiString): UTF8String; begin if FEncoding = veAutoDetect then FEncoding := DetectEncoding; // Force detect encoding. case FEncoding of veAutoDetect: ; veUtf8, veUtf8bom: Result := Utf8ReplaceBroken(sText); veUtf16be: Result := Utf16BEToUtf8(sText); veUtf16le: Result := Utf16LEToUtf8(sText); veUtf32be: Result := Utf32BEToUtf8(sText); veUtf32le: Result := Utf32LEToUtf8(sText); else Result := LConvEncoding.ConvertEncoding(sText, ViewerEncodingsNames[FEncoding], EncodingUTF8); end; end; function TViewerControl.ConvertFromUTF8(const sText: UTF8String): AnsiString; begin if FEncoding = veAutoDetect then FEncoding := DetectEncoding; // Force detect encoding. case FEncoding of veAutoDetect: ; veUtf8, veUtf8bom: Result := sText; veUtf16be: Result := Utf8ToUtf16BE(sText); veUtf16le: Result := Utf8ToUtf16LE(sText); veUtf32be: Result := '';//Utf8ToUtf32BE(sText); veUtf32le: Result := '';//Utf8ToUtf32LE(sText); else Result := LConvEncoding.ConvertEncoding(sText, EncodingUTF8, ViewerEncodingsNames[FEncoding]); end; end; function TViewerControl.IsVisible(const aPosition: PtrInt): Boolean; var StartPos: PtrInt; CharLenInBytes: Integer; begin if IsFileOpen and (FLineList.Count > 0) then begin FVisibleOffset:= 0; StartPos:= GetStartOfLine(aPosition); // Calculate horizontal offset in symbols while (StartPos < aPosition) do begin GetNextCharAsAscii(StartPos, CharLenInBytes); Inc(StartPos, CharLenInBytes); Inc(FVisibleOffset); end; Result := (aPosition >= FLineList.Items[0]) and (aPosition <= FLineList.Items[FLineList.Count - 1]) and (FVisibleOffset >= FHPosition) and (FVisibleOffset <= FHPosition + FTextWidth); end else Result := False; end; procedure TViewerControl.MakeVisible(const aPosition: PtrInt); begin if not IsVisible(aPosition) then begin SetPosition(aPosition); Scroll(-4); Update; if (FVisibleOffset < FHPosition) or (FVisibleOffset > FHPosition + FTextWidth) then begin SetHPosition(FVisibleOffset); HScroll(-1); end; end; end; procedure TViewerControl.ScrollBarVertScroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); begin FUpdateScrollBarPos := False; case ScrollCode of scLineUp: Scroll(-1); scLineDown: Scroll(1); scPageUp: PageUp; scPageDown: PageDown; scTop: GoHome; scBottom: GoEnd; scTrack, scPosition: begin // This check helps avoiding loops if changing ScrollPos below // triggers another scPosition message. if (ScrollCode = scTrack) or (ScrollPos <> FScrollBarPosition) then begin if ScrollPos = 0 then GoHome else if ScrollPos = 100 then GoEnd else Percent := ScrollPos; end; end; scEndScroll: begin end; end; ScrollPos := FScrollBarPosition; FUpdateScrollBarPos := True; end; procedure TViewerControl.ScrollBarHorzScroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); begin FUpdateScrollBarPos := False; case ScrollCode of scLineUp: HScroll(-1); scLineDown: HScroll(1); scPageUp: HPageUp; scPageDown: HPageDown; scTop: HGoHome; scBottom: HGoEnd; scTrack, scPosition: begin // This check helps avoiding loops if changing ScrollPos below // triggers another scPosition message. if (ScrollCode = scTrack) or (ScrollPos <> FHScrollBarPosition) then begin if ScrollPos = 0 then HGoHome else if ScrollPos = 100 then HGoEnd else HScroll((FHLowEnd - FTextWidth) * ScrollPos div 100 - FHPosition); end; end; scEndScroll: begin end; end; ScrollPos := FHScrollBarPosition; FUpdateScrollBarPos := True; end; procedure TViewerControl.UpdateScrollbars; begin FScrollBarVert.LargeChange := GetClientHeightInLines - 1; case ViewerMode of vmBin, vmHex: begin //FScrollBarVert.PageSize := // ((FHighLimit div cHexWidth - GetClientHeightInLines) div 100); end else FScrollBarVert.PageSize := 1; end; FScrollBarHorz.Visible:= (FViewerMode = vmText); end; procedure TViewerControl.ViewerResize(Sender: TObject); begin UpdateScrollbars; // Force recalculating position. SetPosition(FPosition); SetHPosition(FHPosition); end; procedure TViewerControl.ReReadFile; begin FBlockBeg := 0; FBlockEnd := 0; FBOMLength := GetBomLength; UpdateLimits; UpdateScrollbars; Invalidate; end; function TViewerControl.IsFileOpen: Boolean; begin Result := Assigned(FMappedFile); end; function TViewerControl.DetectEncoding: TViewerEncoding; var DetectStringLength: Integer = 2048; // take first 2kB of the file to detect encoding DetectString: String; DetectedEncodingName: String; Enc: TViewerEncoding; begin if IsFileOpen then begin // Default to Ansi in case encoding cannot be detected or is unsupported. Result := veAnsi; if FFileSize < DetectStringLength then DetectStringLength := FFileSize; SetString(DetectString, PAnsiChar(FMappedFile), DetectStringLength); if Assigned(FOnGuessEncoding) then DetectedEncodingName := FOnGuessEncoding(DetectString) else DetectedEncodingName := LConvEncoding.GuessEncoding(DetectString); if DetectedEncodingName <> '' then begin DetectedEncodingName := NormalizeEncoding(DetectedEncodingName); // Map UCS-2 to UTF-16. if DetectedEncodingName = 'ucs2le' then DetectedEncodingName := 'utf16le' else if DetectedEncodingName = 'ucs2be' then DetectedEncodingName := 'utf16be'; for Enc := Low(TViewerEncoding) to High(TViewerEncoding) do begin if NormalizeEncoding(ViewerEncodingsNames[Enc]) = DetectedEncodingName then begin Result := Enc; break; end; end; end; end else Result := veAutoDetect; end; procedure TViewerControl.GetSupportedEncodings(List: TStrings); var Enc: TViewerEncoding; begin for Enc := Low(TViewerEncoding) to High(TViewerEncoding) do List.Add(ViewerEncodingsNames[Enc]); end; function TViewerControl.GetBomLength: Integer; begin Result := 0; case FEncoding of veUtf8, veUtf8bom: if (FFileSize >= 3) and (PByte(FMappedFile)[0] = $EF) and (PByte(FMappedFile)[1] = $BB) and (PByte(FMappedFile)[2] = $BF) then begin Result := 3; end; veUcs2be, veUtf16be: if (FFileSize >= 2) and (PByte(FMappedFile)[0] = $FE) and (PByte(FMappedFile)[1] = $FF) then begin Result := 2; end; veUcs2le, veUtf16le: if (FFileSize >= 2) and (PByte(FMappedFile)[0] = $FF) and (PByte(FMappedFile)[1] = $FE) then begin Result := 2; end; veUtf32be: if (FFileSize >= 4) and (PByte(FMappedFile)[0] = $00) and (PByte(FMappedFile)[1] = $00) and (PByte(FMappedFile)[2] = $FE) and (PByte(FMappedFile)[3] = $FF) then begin Result := 4; end; veUtf32le: if (FFileSize >= 4) and (PByte(FMappedFile)[0] = $00) and (PByte(FMappedFile)[1] = $00) and (PByte(FMappedFile)[2] = $FF) and (PByte(FMappedFile)[3] = $FE) then begin Result := 4; end; end; end; procedure TViewerControl.UpdateLimits; begin if FEncoding = veAutoDetect then FEncoding := DetectEncoding; FBOMLength := GetBomLength; case FViewerMode of vmText, vmWrap, vmBook: begin FLowLimit := 0; FHighLimit := FFileSize - FBOMLength; end; else begin FLowLimit := 0; FHighLimit := FFileSize; end; end; end; procedure TViewerControl.UpdateSelection; procedure Check(var aPosition: PtrInt; Backwards: Boolean); var CharStart: Pointer; begin case FEncoding of veUtf8, veUtf8bom: begin if not Backwards then begin CharStart := SafeUTF8NextCharStart(GetDataAdr + aPosition, FHighLimit - aPosition); if Assigned(CharStart) then aPosition := CharStart - GetDataAdr else aPosition := 0; end else begin CharStart := SafeUTF8PrevCharEnd(GetDataAdr + aPosition, aPosition - FLowLimit); if Assigned(CharStart) then aPosition := CharStart - GetDataAdr else aPosition := 0; end; end; veAnsi, veCp1250..veCp950, veIso88591, veIso88592, veKoi8: ; // any position allowed veUcs2be, veUcs2le: aPosition := ((aPosition - FLowLimit) and not 1) + FLowLimit; veUtf16be, veUtf16le: // todo: check if not in the middle of utf-16 character aPosition := ((aPosition - FLowLimit) and not 1) + FLowLimit; veUtf32be, veUtf32le: aPosition := ((aPosition - FLowLimit) and not 3) + FLowLimit; else raise Exception.Create('Unsupported viewer encoding'); end; end; begin if (FBlockBeg < FLowLimit) or (FBlockBeg >= FHighLimit) or (FBlockEnd < FLowLimit) or (FBlockEnd >= FHighLimit) then begin FBlockBeg := FLowLimit; FBlockEnd := FLowLimit; end else begin case FViewerMode of vmText, vmWrap, vmBook: begin Check(FBlockBeg, False); Check(FBlockEnd, True); if (FBlockBeg < FLowLimit) or (FBlockBeg >= FHighLimit) or (FBlockEnd < FLowLimit) or (FBlockEnd >= FHighLimit) or (FBlockEnd < FBlockBeg) then begin FBlockBeg := FLowLimit; FBlockEnd := FLowLimit; end; end; // In non-text modes any selection is valid. end; end; end; procedure Register; begin RegisterComponents('SeksiCmd', [TViewerControl]); end; end. doublecmd-0.5.8/components/viewer/unicodeutils.pas0000644000175000017500000003146312204103540021406 0ustar alexxalexx{ Most of this code is based on similar functions from Lazarus LCLProc. } unit UnicodeUtils; {$mode objfpc}{$H+} interface uses Classes, SysUtils; {en Retrieves length in bytes of the next UTF-8 character. @param(P Pointer to the UTF-8 characters.) @param(aMaxBytes States how many bytes from P can be read.) @param(InvalidCharLen If an invalid UTF-8 character was found then InvalidCharLen has the number of bytes this character spans. If the character was valid InvalidCharLen is zero.) } function SafeUTF8NextCharLen(P: PByte; aMaxBytes: Integer; out InvalidCharLen: Integer): Integer; {en Retrieves length in bytes of the previous UTF-8 character. It does not read from P, but rather from memory locations before P. @param(P Pointer to the UTF-8 characters.) @param(aMaxBytes States how many bytes from P *backwards* can be read. So, to safely read 3 bytes backwards ([p-1], [p-2], [p-3]) this parameter should be at least 3.) @param(InvalidCharLen If an invalid UTF-8 character was found then InvalidCharLen has the number of bytes this character spans. If the character was valid InvalidCharLen is zero.) } function SafeUTF8PrevCharLen(P: PByte; aMaxBytes: Integer; out InvalidCharLen: Integer): Integer; function SafeUTF8NextCharStart(UTF8Str: PByte; Len: PtrInt): PByte; function SafeUTF8PrevCharEnd(UTF8Str: PByte; Len: PtrInt): PByte; {en Returns UTF-16 character length, which is either 1 or 2. @param(utf16char Any UTF-16 char or one of the surrogate pairs.) } function UTF16CharLen(utf16char: Word): Integer; {en Converts an UTF-16 surrogate pair into a unicode character. } function utf16PairToUnicode(u1, u2: Word): Cardinal; function Utf16LEToUtf8(const s: string): string; // UTF16-LE 2 or 4 byte little endian function Utf16BEToUtf8(const s: string): string; // UTF16-BE 2 or 4 byte big endian function Utf32LEToUtf8(const s: string): string; // UTF32-LE 4 byte little endian function Utf32BEToUtf8(const s: string): string; // UTF32-BE 4 byte big endian function Utf8ToUtf16LE(const s: string): string; // UTF16-LE 2 or 4 byte little endian function Utf8ToUtf16BE(const s: string): string; // UTF16-BE 2 or 4 byte big endian {en Replaces invalid UTF-8 characters with '?'. } function Utf8ReplaceBroken(const s: UTF8String): UTF8String; implementation uses LCLProc, LazUTF8; const maxUTF8Len = 7; // really is 4, but this includes any invalid characters up to length 7 function SafeUTF8NextCharLen(P: PByte; aMaxBytes: Integer; out InvalidCharLen: Integer): Integer; var BytesLen: Integer; i: Integer; begin if (p=nil) or (aMaxBytes = 0) then begin InvalidCharLen := 0; Result := 0; end else if p^<%10000000 then begin // regular single byte character InvalidCharLen := 0; Result := 1; end else if p^<%11000000 then begin // invalid single byte character InvalidCharLen := 1; Result := 1; end else begin // Read length of UTF-8 character in bytes. if ((p^ and %11100000) = %11000000) then BytesLen := 2 else if ((p^ and %11110000) = %11100000) then BytesLen := 3 else if ((p^ and %11111000) = %11110000) then BytesLen := 4 else if ((p^ and %11111100) = %11111000) then BytesLen := 5 else if ((p^ and %11111110) = %11111100) then BytesLen := 6 else if ((p^ and %11111111) = %11111110) then BytesLen := 7 else begin InvalidCharLen := 1; exit(1); end; // Check if the next bytes are from the middle of a character. for i := 1 to BytesLen - 1 do begin if (aMaxBytes < i) or ((p[i] and %11000000) <> %10000000) then begin InvalidCharLen := i; exit(1); end; end; InvalidCharLen := 0; Result := BytesLen; end; end; function SafeUTF8PrevCharLen(P: PByte; aMaxBytes: Integer; out InvalidCharLen: Integer): Integer; var BytesLen: Integer; signature: Byte; begin if (p=nil) or (aMaxBytes = 0) then begin InvalidCharLen := 0; Result := 0; end else if p[-1]<%10000000 then begin // regular single byte character InvalidCharLen := 0; Result := 1; end else begin for BytesLen := 1 to maxUTF8Len do begin if (aMaxBytes < BytesLen) then begin InvalidCharLen := aMaxBytes; exit(1); end; // Move past all the bytes in the middle of a character. if (p[-BytesLen] and %11000000) <> %10000000 then break; if BytesLen = maxUTF8Len then begin InvalidCharLen := BytesLen; exit(1); end; end; if p[-BytesLen]<%11000000 then begin // invalid first byte of a character InvalidCharLen := BytesLen; Result := 1; end else begin signature := Byte($FF shl (7 - BytesLen)); if (p[-BytesLen] and signature) = Byte(signature shl 1) then begin // Correct first byte of a character. InvalidCharLen := 0; Result := BytesLen; end else begin // Invalid first byte of a character, or p is in the middle of a character. InvalidCharLen := BytesLen; Result := 1; end; end; end; end; function SafeUTF8NextCharStart(UTF8Str: PByte; Len: PtrInt): PByte; var CharLen: LongInt; InvalidCharLen: Integer; begin Result:=UTF8Str; if Result<>nil then begin while (Len>0) do begin CharLen := SafeUTF8NextCharLen(Result, Len, InvalidCharLen); if InvalidCharLen > 0 then begin dec(Len,InvalidCharLen); inc(Result,InvalidCharLen); end else if CharLen = 0 then exit(nil) else exit(Result); end; Result:=nil; end; end; function SafeUTF8PrevCharEnd(UTF8Str: PByte; Len: PtrInt): PByte; var CharLen: LongInt; InvalidCharLen: Integer; begin Result:=UTF8Str; if Result<>nil then begin while (Len>0) do begin CharLen := SafeUTF8PrevCharLen(Result, Len, InvalidCharLen); if InvalidCharLen > 0 then begin dec(Len,InvalidCharLen); dec(Result,InvalidCharLen); end else if CharLen = 0 then exit(nil) else exit(Result); // Result is the character beginning end; Result:=nil; end; end; function UTF16CharLen(utf16char: Word): Integer; inline; begin if (utf16char < $D800) or (utf16char > $DFFF) then Result := 1 else Result := 2; end; function utf16PairToUnicode(u1, u2: Word): Cardinal; begin if (u1 >= $D800) and (u1 <= $DBFF) then begin if (u2 >= $DC00) and (u2 <= $DFFF) then Result := (Cardinal(u1 - $D800) shl 10) + Cardinal(u2 - $DC00) + $10000 else Result := 0; end else Result := u1; end; function Utf16LEToUtf8(const s: string): string; var len: Integer; Src, Limit: PWord; Dest: PAnsiChar; u: Cardinal; begin if Length(s) < 2 then begin Result:=''; exit; end; Src:=PWord(Pointer(s)); Limit := PWord(Pointer(Src) + Length(s)); SetLength(Result, length(s) * 2); Dest:=PAnsiChar(Result); while Src + 1 <= Limit do begin len := UTF16CharLen(Src^); if len = 1 then u := LEtoN(Src^) else begin if Src + 2 <= Limit then u := utf16PairToUnicode(LEtoN(Src[0]), LEtoN(Src[1])) else break; end; inc(Src, len); if u<128 then begin Dest^:=chr(u); inc(Dest); end else begin inc(Dest,UnicodeToUTF8SkipErrors(u,Dest)); end; end; len:=PtrUInt(Dest)-PtrUInt(Result); if len>length(Result) then RaiseGDBException(''); SetLength(Result,len); end; function Utf16BEToUtf8(const s: string): string; var len: Integer; Src, Limit: PWord; Dest: PAnsiChar; u: Cardinal; begin if Length(s) < 2 then begin Result:=''; exit; end; Src:=PWord(Pointer(s)); Limit := PWord(Pointer(Src) + Length(s)); SetLength(Result, length(s) * 2); Dest:=PAnsiChar(Result); while Src + 1 <= Limit do begin len := UTF16CharLen(Src^); if len = 1 then u := BEtoN(Src^) else begin if Src + 2 <= Limit then u := utf16PairToUnicode(BEtoN(Src[0]), BEtoN(Src[1])) else break; end; inc(Src, len); if u<128 then begin Dest^:=chr(u); inc(Dest); end else begin inc(Dest,UnicodeToUTF8SkipErrors(u,Dest)); end; end; len:=PtrUInt(Dest)-PtrUInt(Result); if len>length(Result) then RaiseGDBException(''); SetLength(Result,len); end; function Utf32LEToUtf8(const s: string): string; var len: Integer; Src: PLongWord; Dest: PAnsiChar; i: Integer; c: LongWord; begin if Length(s) < 4 then begin Result:=''; exit; end; len:=length(s) div 4; SetLength(Result,len*4); Src:=PLongWord(Pointer(s)); Dest:=PAnsiChar(Result); for i:=1 to len do begin c:=LEtoN(Src^); inc(Src); if c<128 then begin Dest^:=chr(c); inc(Dest); end else begin inc(Dest,UnicodeToUTF8SkipErrors(c,Dest)); end; end; len:=PtrUInt(Dest)-PtrUInt(Result); if len>length(Result) then RaiseGDBException(''); SetLength(Result,len); end; function Utf32BEToUtf8(const s: string): string; var len: Integer; Src: PLongWord; Dest: PAnsiChar; i: Integer; c: LongWord; begin if Length(s) < 4 then begin Result:=''; exit; end; len:=length(s) div 4; SetLength(Result,len*4); Src:=PLongWord(Pointer(s)); Dest:=PAnsiChar(Result); for i:=1 to len do begin c:=BEtoN(Src^); inc(Src); if c<128 then begin Dest^:=chr(c); inc(Dest); end else begin inc(Dest,UnicodeToUTF8SkipErrors(c,Dest)); end; end; len:=PtrUInt(Dest)-PtrUInt(Result); if len>length(Result) then RaiseGDBException(''); SetLength(Result,len); end; function Utf8ToUtf16LE(const s: string): string; var P: PWord; I, L: SizeUInt; begin if Length(S) = 0 then begin Result := ''; Exit; end; // Wide chars of UTF-16 <= bytes of UTF-8 string SetLength(Result, Length(S) * SizeOf(WideChar)); if ConvertUTF8ToUTF16(PWideChar(PAnsiChar(Result)), Length(Result) + SizeOf(WideChar), PAnsiChar(S), Length(S), [toInvalidCharToSymbol], L) <> trNoError then Result := '' else begin SetLength(Result, (L - 1) * SizeOf(WideChar)); // Swap endian if needed if (NtoLE($FFFE) <> $FFFE) then begin P := PWord(PAnsiChar(Result)); for I := 0 to L - 1 do begin P[I] := SwapEndian(P[I]); end; end; end; end; function Utf8ToUtf16BE(const s: string): string; var P: PWord; I, L: SizeUInt; begin if Length(S) = 0 then begin Result := ''; Exit; end; // Wide chars of UTF-16 <= bytes of UTF-8 string SetLength(Result, Length(S) * SizeOf(WideChar)); if ConvertUTF8ToUTF16(PWideChar(PAnsiChar(Result)), Length(Result) + SizeOf(WideChar), PAnsiChar(S), Length(S), [toInvalidCharToSymbol], L) <> trNoError then Result := '' else begin SetLength(Result, (L - 1) * SizeOf(WideChar)); // Swap endian if needed if (NtoBE($FEFF) <> $FEFF) then begin P := PWord(PAnsiChar(Result)); for I := 0 to L - 1 do begin P[I] := SwapEndian(P[I]); end; end; end; end; function Utf8ReplaceBroken(const s: UTF8String): UTF8String; var Src, Dst, LastGoodPos: PByte; BytesLeft: Integer; InvalidCharLen: Integer; CharLen: Integer; begin if Length(s) = 0 then Exit(s); BytesLeft := Length(s); SetLength(Result, BytesLeft); // at most the same length Src := PByte(s); Dst := PByte(Result); LastGoodPos := Src; while BytesLeft > 0 do begin CharLen := SafeUTF8NextCharLen(Src, BytesLeft, InvalidCharLen); if InvalidCharLen > 0 then begin if LastGoodPos < Src then begin System.Move(LastGoodPos^, Dst^, Src - LastGoodPos); Inc(Dst, Src - LastGoodPos); end; Inc(Src, InvalidCharLen); Dec(BytesLeft, InvalidCharLen); LastGoodPos := Src; Dst^ := ord('?'); Inc(Dst); end else begin Inc(Src, CharLen); Dec(BytesLeft, CharLen); end; end; if LastGoodPos = PByte(s) then Result := s // All characters are good. else begin if LastGoodPos < Src then begin System.Move(LastGoodPos^, Dst^, Src - LastGoodPos); Inc(Dst, Src - LastGoodPos); end; SetLength(Result, Dst - PByte(Result)); end; end; end. doublecmd-0.5.8/components/viewer/MappingFile.pas0000644000175000017500000002202512014201074021064 0ustar alexxalexx{ **************************************************** } { MappingFile unit v1.0 for Delphi } { Copyright (c) Razumikhin Dmitry, 2005 } { E-mail: razumikhin_d@mail.ru } { } { Use under terms LGPL license: } { http://www.gnu.org/copyleft/lesser.html } { **************************************************** } unit MappingFile; interface uses SysUtils, Windows, Classes, RTLConsts; type EFileMappingError = class(Exception); TMappingFile = class private fHandle: Integer; //file handle fFileName: string; //file name fMode: Word; //file open mode fMappingHandle: THandle; //handle of mapping file fBaseAddress: PChar; //address of file image in memory fPos: Integer; //current position fSize: Integer; //size of real data fCapacity: Integer; //size of allocated memory fExtraMem: Integer; function GetChar(Index: Integer): Char; procedure SetSize(const Value: Integer); procedure SetChar(Index: Integer; const Value: Char); procedure TryMount; procedure ReMount; procedure SetCapacity(const Value: Integer); procedure SetPos(const Value: Integer); public property BaseAddress: PChar read fBaseAddress; property Size: Integer read fSize write SetSize; property Capacity: Integer read fCapacity write SetCapacity; property ExtraMem: Integer read fExtraMem write fExtraMem; property Ch[Index: Integer]: Char read GetChar write SetChar; property Position: Integer read fPos write SetPos; function Seek(Offset, Origin: Integer): Integer; //read functions function ReadCh(out Ch: Char): Boolean; function ReadStr(out Str: string; Len: Integer): Boolean; overload; function ReadStr(const Index, Len: Integer): string; overload; function Find(Ch: Char; StartIndex: Integer = 0): Integer; //write functions procedure WriteCh(const Ch: Char); procedure WriteStr(const Str: string); overload; procedure WriteStr(const Str: string; Index: Integer); overload; procedure WriteBuffer(const Buf: PChar; Count: Integer); overload; procedure WriteBuffer(const Buf: PChar; Index, Count: Integer); overload; //insert functions (expand + write) procedure InsertBuffer(const Buf: PChar; Count: Integer); overload; procedure InsertBuffer(const Buf: PChar; Index, Count: Integer); overload; procedure InsertStr(const Str: string); overload; procedure InsertStr(const Str: string; Index: Integer); overload; constructor Create(const FileName: string; Mode: Word); destructor Destroy; override; end; function FileResize(Handle: THandle; Size: Integer): LongBool; function FileMount(var MappingHandle: THandle; const FileHandle: Integer; ReadOnly: Boolean = True): Pointer; procedure FileUmount(MappingHandle: THandle; BaseAddress: Pointer); implementation { TMappingFile } constructor TMappingFile.Create(const FileName: string; Mode: Word); begin inherited Create; fFileName:=FileName; fMode:=Mode; fPos:=0; fSize:=0; fCapacity:=0; fExtraMem:=1024; fBaseAddress:=nil; if Mode = fmCreate then begin fHandle:=FileCreate(FileName); if fHandle < 0 then raise EFCreateError.CreateResFmt(@SFCreateErrorEx, [ExpandFileName(FileName), SysErrorMessage(GetLastError)]); end else begin fHandle:=FileOpen(FileName, Mode); if fHandle < 0 then raise EFOpenError.CreateResFmt(@SFOpenErrorEx, [ExpandFileName(FileName), SysErrorMessage(GetLastError)]); end; fSize:=GetFileSize(fHandle, nil); fCapacity:=fSize; TryMount; end; destructor TMappingFile.Destroy; begin FileUmount(fMappingHandle, fBaseAddress); if fSize <> fCapacity then FileResize(fHandle, fSize); if fHandle >=0 then FileClose(fHandle); inherited; end; function TMappingFile.Find(Ch: Char; StartIndex: Integer): Integer; var i: Integer; begin for i:=StartIndex to fSize-1 do if Ch = PChar(fBaseAddress + i)^ then begin Result:=i; Exit; end; Result:=-1; end; function TMappingFile.GetChar(Index: Integer): Char; begin Result:=PChar(fBaseAddress + Index)^; //Not control the bounds end; procedure TMappingFile.InsertBuffer(const Buf: PChar; Count: Integer); begin InsertBuffer(Buf, fPos, Count); Inc(fPos, Count); end; procedure TMappingFile.InsertBuffer(const Buf: PChar; Index, Count: Integer); var MoveCount: Integer; begin if Count <> 0 then begin MoveCount:=fSize - Index; SetSize(fSize + Count); Move(PChar(fBaseAddress + Index)^, PChar(fBaseAddress + Index + Count)^, MoveCount); Move(Buf^, PChar(fBaseAddress + Index)^, Count); end; end; procedure TMappingFile.InsertStr(const Str: string); begin InsertBuffer(PChar(Str), Length(Str)); end; procedure TMappingFile.InsertStr(const Str: string; Index: Integer); begin InsertBuffer(PChar(Str), Index, Length(Str)); end; function TMappingFile.ReadCh(out Ch: Char): Boolean; begin Result:=fPos < fSize; if Result then begin Ch:=PChar(fBaseAddress + fPos)^; Inc(fPos, SizeOf(Char)); end else Ch:=#0; end; function TMappingFile.ReadStr(out Str: string; Len: Integer): Boolean; begin Result:=(fPos + Len) <= fSize; SetLength(Str, Len); Move(PChar(fBaseAddress + fPos)^, Str[1], Len); Inc(fPos, Len); end; function TMappingFile.ReadStr(const Index, Len: Integer): string; begin SetLength(Result, Len); Move(PChar(fBaseAddress + Index)^, Result[1], Len); end; procedure TMappingFile.Remount; begin if Assigned(fBaseAddress) then FileUmount(fMappingHandle, fBaseAddress); TryMount; end; function TMappingFile.Seek(Offset, Origin: Integer): Integer; var NewPos: Integer; begin Result:=-1; case Origin of 0: begin if Offset >= 0 then begin if (Offset > fSize) then SetSize(Offset); fPos:=Offset; Result:=Offset; end; end; 1: begin NewPos:= fPos + Offset; if NewPos >=0 then begin if (NewPos > fSize) then SetSize(NewPos); fPos:=NewPos; Result:=NewPos; end; end; 2: begin NewPos:=fSize - Offset - 1; if NewPos >=0 then begin if (NewPos > fSize) then SetSize(NewPos); fPos:=NewPos; Result:=NewPos; end; end; end; end; procedure TMappingFile.SetCapacity(const Value: Integer); begin if fCapacity <> Value then begin fCapacity := Value; FileResize(fHandle, fCapacity); Remount; end; end; procedure TMappingFile.SetChar(Index: Integer; const Value: Char); begin PChar(fBaseAddress + Index)^:=Value; //Not control the bounds end; procedure TMappingFile.SetPos(const Value: Integer); begin Seek(Value, 0); end; procedure TMappingFile.SetSize(const Value: Integer); begin if fSize <> Value then begin fSize := Value; if fPos >= fSize then fPos:=fSize - 1; if fSize > fCapacity then SetCapacity(fSize + fExtraMem); end; end; procedure TMappingFile.TryMount; begin if fSize > 0 then begin fBaseAddress:=FileMount(fMappingHandle, fHandle, fMode = fmOpenRead); if not Assigned(fBaseAddress) then raise EFileMappingError.CreateFmt('Could not mapped file ''%s''',[fFileName]); end; end; procedure TMappingFile.WriteBuffer(const Buf: PChar; Count: Integer); begin if (fPos + Count) > fSize then SetSize(fPos + Count); Move(Buf^, PChar(fBaseAddress + fPos)^, Count); fPos:=fPos + Count; end; procedure TMappingFile.WriteBuffer(const Buf: PChar; Index, Count: Integer); begin if (Index + Count) > fSize then SetSize(Index + Count); Move(Buf^, PChar(fBaseAddress + Index)^, Count); end; procedure TMappingFile.WriteCh(const Ch: Char); begin WriteBuffer(@Ch, SizeOf(Char)); end; procedure TMappingFile.WriteStr(const Str: string); begin WriteBuffer(PChar(Str), Length(Str)); end; procedure TMappingFile.WriteStr(const Str: string; Index: Integer); begin WriteBuffer(PChar(Str), Index, Length(Str)); end; //----------------------------------------------------------------------- function FileMount(var MappingHandle: THandle; const FileHandle: Integer; ReadOnly: Boolean = True): Pointer; var FileMappingMode, MapViewMode: DWORD; begin if ReadOnly then begin FileMappingMode:=PAGE_READONLY; MapViewMode:=FILE_MAP_READ; end else begin FileMappingMode:=PAGE_READWRITE; MapViewMode:=FILE_MAP_READ + FILE_MAP_WRITE; end; MappingHandle:=CreateFileMapping(FileHandle, nil, FileMappingMode, 0, 0, nil); if MappingHandle <> 0 then begin Result:=MapViewOfFile(MappingHandle, MapViewMode, 0, 0, 0); end else Result:=nil; end; procedure FileUmount(MappingHandle: THandle; BaseAddress: Pointer); begin if Assigned(BaseAddress) then UnmapViewOfFile(BaseAddress); if MappingHandle <> 0 then CloseHandle(MappingHandle); end; function FileResize(Handle: THandle; Size: Integer): LongBool; begin FileSeek(Handle, Size, 0); Result:=SetEndOfFile(Handle); end; end. doublecmd-0.5.8/components/viewer/viewerpackage.pas0000644000175000017500000000061712014201074021511 0ustar alexxalexx{ This file was automatically created by Lazarus. do not edit ! This source is only used to compile and install the package. } unit viewerpackage; interface uses ViewerControl, UnicodeUtils, LazarusPackageIntf; implementation procedure Register; begin RegisterUnit('ViewerControl', @ViewerControl.Register); end; initialization RegisterPackage('viewerpackage', @Register); end. doublecmd-0.5.8/components/viewer/viewerpackage.lpk0000644000175000017500000000333612154651644021536 0ustar alexxalexx doublecmd-0.5.8/components/dcpcrypt/0000755000175000017500000000000012257501472016530 5ustar alexxalexxdoublecmd-0.5.8/components/dcpcrypt/dcpcrypt.pas0000644000175000017500000000053012014201074021045 0ustar alexxalexx{ This file was automatically created by Lazarus. Do not edit! This source is only used to compile and install the package. } unit dcpcrypt; interface uses DCPbase64, DCPblockciphers, DCPconst, DCPcrypt2, DCPhaval, DCPmd4, DCPmd5, DCPripemd128, DCPripemd160, DCPsha1, DCPsha256, DCPsha512, DCPtiger, DCPsfv; implementation end. doublecmd-0.5.8/components/dcpcrypt/CHANGELOG.txt0000644000175000017500000000141512014201074020543 0ustar alexxalexx Change in v2.0.4.1 by Graeme Geldenhuys (2010) * Version number bumped to v2.0.4.1 * More fixes for 64-bit support * Removed a lot of compiler warnings - tested with FPC 2.4.1 Change in v2.0.4 by Graeme Geldenhuys (2009) * Version number bumped to v2.0.4 * Split the Lazarus package into two separate packages - one is runtime only package and GUI toolkit independent. - one is Lazarus design-time only package which installs components in component palette. * Updated code to be compilable with FPC 2.4.0-rc1 * Updated code to be compilable with 64-bit FPC 2.4.0-rc1. - Tested under 32-bit & 64-bit Linux on x86 systems. Changes since DCPCrypt v2 Beta 3: * Ported DCPCrypt to Lazarus by Barko in 2006 -=-=-=-=-=-=-=-=-=-=-=-=-=-=- doublecmd-0.5.8/components/dcpcrypt/dcpcrypt.lpk0000644000175000017500000000732312154651644021100 0ustar alexxalexx doublecmd-0.5.8/components/dcpcrypt/dcpbase64.pas0000644000175000017500000001263012014201074020774 0ustar alexxalexx{******************************************************************************} {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********} {******************************************************************************} {* A Base64 encoding/decoding unit ********************************************} {******************************************************************************} {* Copyright (c) 1999-2002 David Barton *} {* Permission is hereby granted, free of charge, to any person obtaining a *} {* copy of this software and associated documentation files (the "Software"), *} {* to deal in the Software without restriction, including without limitation *} {* the rights to use, copy, modify, merge, publish, distribute, sublicense, *} {* and/or sell copies of the Software, and to permit persons to whom the *} {* Software is furnished to do so, subject to the following conditions: *} {* *} {* The above copyright notice and this permission notice shall be included in *} {* all copies or substantial portions of the Software. *} {* *} {* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *} {* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *} {* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *} {* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *} {* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *} {* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *} {* DEALINGS IN THE SOFTWARE. *} {******************************************************************************} unit DCPbase64; interface uses Sysutils; function Base64EncodeStr(const Value: string): string; { Encode a string into Base64 format } function Base64DecodeStr(const Value: string): string; { Decode a Base64 format string } function Base64Encode(pInput: pointer; pOutput: pointer; Size: longint): longint; { Encode a lump of raw data (output is (4/3) times bigger than input) } function Base64Decode(pInput: pointer; pOutput: pointer; Size: longint): longint; { Decode a lump of raw data } {******************************************************************************} {******************************************************************************} implementation {$Q-}{$R-} const B64: array[0..63] of byte= (65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80, 81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108, 109,110,111,112,113,114,115,116,117,118,119,120,121,122,48,49,50,51,52,53, 54,55,56,57,43,47); function Base64Encode(pInput: pointer; pOutput: pointer; Size: longint): longint; var i, iptr, optr: integer; Input, Output: PByteArray; begin Input:= PByteArray(pInput); Output:= PByteArray(pOutput); iptr:= 0; optr:= 0; for i:= 1 to (Size div 3) do begin Output^[optr+0]:= B64[Input^[iptr] shr 2]; Output^[optr+1]:= B64[((Input^[iptr] and 3) shl 4) + (Input^[iptr+1] shr 4)]; Output^[optr+2]:= B64[((Input^[iptr+1] and 15) shl 2) + (Input^[iptr+2] shr 6)]; Output^[optr+3]:= B64[Input^[iptr+2] and 63]; Inc(optr,4); Inc(iptr,3); end; case (Size mod 3) of 1: begin Output^[optr+0]:= B64[Input^[iptr] shr 2]; Output^[optr+1]:= B64[(Input^[iptr] and 3) shl 4]; Output^[optr+2]:= byte('='); Output^[optr+3]:= byte('='); end; 2: begin Output^[optr+0]:= B64[Input^[iptr] shr 2]; Output^[optr+1]:= B64[((Input^[iptr] and 3) shl 4) + (Input^[iptr+1] shr 4)]; Output^[optr+2]:= B64[(Input^[iptr+1] and 15) shl 2]; Output^[optr+3]:= byte('='); end; end; Result:= ((Size+2) div 3) * 4; end; function Base64EncodeStr(const Value: string): string; begin SetLength(Result,((Length(Value)+2) div 3) * 4); Base64Encode(@Value[1],@Result[1],Length(Value)); end; function Base64Decode(pInput: pointer; pOutput: pointer; Size: longint): longint; var i, j, iptr, optr: integer; Temp: array[0..3] of byte; Input, Output: PByteArray; begin Input:= PByteArray(pInput); Output:= PByteArray(pOutput); iptr:= 0; optr:= 0; Result:= 0; for i:= 1 to (Size div 4) do begin for j:= 0 to 3 do begin case Input^[iptr] of 65..90 : Temp[j]:= Input^[iptr] - Ord('A'); 97..122: Temp[j]:= Input^[iptr] - Ord('a') + 26; 48..57 : Temp[j]:= Input^[iptr] - Ord('0') + 52; 43 : Temp[j]:= 62; 47 : Temp[j]:= 63; 61 : Temp[j]:= $FF; end; Inc(iptr); end; Output^[optr]:= (Temp[0] shl 2) or (Temp[1] shr 4); Result:= optr+1; if (Temp[2]<> $FF) and (Temp[3]= $FF) then begin Output^[optr+1]:= (Temp[1] shl 4) or (Temp[2] shr 2); Result:= optr+2; Inc(optr) end else if (Temp[2]<> $FF) then begin Output^[optr+1]:= (Temp[1] shl 4) or (Temp[2] shr 2); Output^[optr+2]:= (Temp[2] shl 6) or Temp[3]; Result:= optr+3; Inc(optr,2); end; Inc(optr); end; end; function Base64DecodeStr(const Value: string): string; begin SetLength(Result,(Length(Value) div 4) * 3); SetLength(Result,Base64Decode(@Value[1],@Result[1],Length(Value))); end; end. doublecmd-0.5.8/components/dcpcrypt/Docs/0000755000175000017500000000000012257501472017420 5ustar alexxalexxdoublecmd-0.5.8/components/dcpcrypt/Docs/MIT_license.txt0000644000175000017500000000210612014201074022275 0ustar alexxalexxThe MIT License Copyright (c) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/0000755000175000017500000000000012257501472021404 5ustar alexxalexxdoublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_RC5.bmp0000644000175000017500000000062611652036011023301 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_BLOWFISH.bmp0000644000175000017500000000062611652036011024125 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_MARS.bmp0000644000175000017500000000062611652036011023452 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_3DES.bmp0000644000175000017500000000062611652036011023406 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_DES.bmp0000644000175000017500000000062611652036011023323 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_GOST.bmp0000644000175000017500000000062611652036011023464 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_TEA.bmp0000644000175000017500000000062611652036011023321 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_ICE2.bmp0000644000175000017500000000062611652036011023372 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_CAST256.bmp0000644000175000017500000000062611652036011023677 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_IDEA.bmp0000644000175000017500000000062611652036011023412 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_SERPENT.bmp0000644000175000017500000000062611652036011024030 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_MISTY1.bmp0000644000175000017500000000062611652036011023676 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_CAST128.bmp0000644000175000017500000000062611652036011023675 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_ICE.bmp0000644000175000017500000000062611652036011023310 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_TWOFISH.bmp0000644000175000017500000000062611652036011024033 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_THINICE.bmp0000644000175000017500000000062611652036011023773 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_RC4.bmp0000644000175000017500000000062611652036011023300 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_RC2.bmp0000644000175000017500000000062611652036011023276 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_RIJNDAEL.bmp0000644000175000017500000000062611652036011024100 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPciphers/TDCP_RC6.bmp0000644000175000017500000000062611652036011023302 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/Hashes.html0000644000175000017500000001443211652036011021513 0ustar alexxalexx DCPcrypt v2: Users Guide - Hash Algorithms

DCPcrypt Cryptographic Component Library v2
Copyright © 1999-2002 David Barton
http://www.cityinthesky.co.uk/
crypto@cityinthesky.co.uk

Hash Algorithms - TDCP_hash

All hashes are derived from the TDCP_hash component. It provides a range of functions to allow the hashing of virtually every type of data.

Functions available are:

      property Initialized: boolean;
      property Id: integer;
      property Algorithm: string;
      property HashSize: integer;
  
      class function SelfTest: boolean; 
  
      procedure Init; 
      procedure Final(var Digest); 
      procedure Burn; 
  
      procedure Update(const Buffer; Size: longword); 
      procedure UpdateStream(Stream: TStream; Size: longword);
      procedure UpdateStr(const Str: string);
    

Example usage:


property Initialized: boolean;

This is set to true after Init has been called.

property Id: integer;

Every algorithm I implement gets given a unique ID number so that if I use several different algorithms within a program I can determine which one was used. This is a purely arbitrary numbering system.

property Algorithm: string;

This is the name of the algorithm implemented in the component.

property HashSize: integer;

This is the size of the output of the hash algorithm in BITS.

class function SelfTest: boolean;

In order to test whether the implementations have all been compiled correctly you can call the SelfTest function. This compares the results of several hash operations with known results for the algorithms (so called test vectors). If all the tests are passed then true is returned. If ANY of the tests are failed then false is returned. You may want to run this function for all the components when you first install the DCPcrypt package and again if you modify any of the source files, you don't need to run this everytime your program is run. Note: this only performs a selection of tests, it is not exhaustive.

procedure Init;

Call this procedure to initialize the hash algorithm, this must be called before using the Update procedure.

procedure Final(var Digest);

This procedure returns the final message digest (hash) in Digest. This variable must be the same size as the hash size. This procedure also calls Burn to clear any stored information.

procedure Burn;

Call this procedure if you want to abort the hashing operation (normally Final is used). This clears all information stored within the hash. Before the hash can be used again Init must be called.

procedure Update(const Buffer; Size: longword);

This procedure hashes Size bytes of Buffer. To get the hash result call Final.

Update example:

  procedure HashBuffer(const Buffer; Size: longint; var Output);
  var
    Hash: TDCP_ripemd160;
  begin
    Hash:= TDCP_ripemd160.Create(nil);
    Hash.Init;
    Hash.Update(Buffer,Size);
    Hash.Final(Output);
    Hash.Free;
  end;
    

procedure UpdateStream(Stream: TStream; Size: longword);

This procedure hashes Size bytes from Stream. To get the hash result call Final.

procedure UpdateStr(const Str: string);

This procedure hashes the string Str. To get the hash result call Final.


Example 1 - File hashing

This example shows how you can hash the contents of a file

  procedure TForm1.Button1Click(Sender: TObject);
  var
    Hash: TDCP_ripemd160;
    Digest: array[0..19] of byte;  // RipeMD-160 produces a 160bit digest (20bytes)
    Source: TFileStream;
    i: integer;
    s: string;
  begin
    Source:= nil;
    try
      Source:= TFileStream.Create(Edit1.Text,fmOpenRead);  // open the file specified by Edit1
    except
      MessageDlg('Unable to open file',mtError,[mbOK],0);
    end;
    if Source <> nil then
    begin
      Hash:= TDCP_ripemd160.Create(Self);          // create the hash
      Hash.Init;                                   // initialize it
      Hash.UpdateStream(Source,Source.Size);       // hash the stream contents
      Hash.Final(Digest);                          // produce the digest
      Source.Free;
      s:= '';
      for i:= 0 to 19 do
        s:= s + IntToHex(Digest[i],2);
      Edit2.Text:= s;                              // display the digest
    end;
  end;
    

 

Index, Ciphers, Block Ciphers

 

DCPcrypt is copyrighted © 1999-2002 David Barton.
All trademarks are property of their respective owners.
doublecmd-0.5.8/components/dcpcrypt/Docs/Ciphers.html0000644000175000017500000004207111652036011021675 0ustar alexxalexx DCPcrypt v2: Users Guide - Ciphers

DCPcrypt Cryptographic Component Library v2
Copyright © 1999-2002 David Barton
http://www.cityinthesky.co.uk/
crypto@cityinthesky.co.uk

Ciphers - TDCP_cipher

All ciphers are inherited from the TDCP_cipher component either directly for stream ciphers (such as RC4) or via the TDCP_blockcipher component.

The TDCP_cipher component implements key initialisation features and the basic encryption/decryption interface. Functions available are:

      property Initialized: boolean;
      property Id: integer;
      property Algorithm: string;
      property MaxKeySize: integer;
  
      class function SelfTest: boolean;
  
      procedure Init(const Key; Size: longword; InitVector: pointer); 
      procedure InitStr(const Key: string; HashType: TDCP_hashclass);
      procedure Burn; 
      procedure Reset;
      procedure Encrypt(const Indata; var Outdata; Size: longword); 
      procedure Decrypt(const Indata; var Outdata; Size: longword); 
      function EncryptStream(InStream, OutStream: TStream; Size: longword): longword;
      function DecryptStream(InStream, OutStream: TStream; Size: longword): longword;
      function EncryptString(const Str: string): string; 
      function DecryptString(const Str: string): string; 
    

Example usage:


Function descriptions

property Initialized: boolean;

Once key initialization has been performed this property is set to true, otherwise it is set to false. Calling Burn will immediately set this to false.

property Id: integer;

Every algorithm I implement gets given a unique ID number so that if I use several different algorithms within a program I can determine which one was used. This is a purely arbitrary numbering system.

property Algorithm: string;

This contains the name of the algorithm implemented within the component.

property MaxKeySize: integer;

This is the maximum size of key you can pass to the cipher (in bits!).

class function SelfTest: boolean;

In order to test whether the implementations have all been compiled correctly you can call the SelfTest function. This compares the results of several encryption/decryption operations with known results for the algorithms (so called test vectors). If all the tests are passed then true is returned. If ANY of the tests are failed then false is returned. You may want to run this function for all the components when you first install the DCPcrypt package and again if you modify any of the source files, you don't need to run this everytime your program is run. Note: this only performs a selection of tests, it is not exhaustive.

procedure Init(const Key; Size: longword; InitVector: pointer);

This procedure initializes the cipher with the keying material supplied in Key. The Size of the keying material is specified in BITS. The InitVector is a pointer to chaining information (only used for block ciphers). The variable that this points to should be equal to the block size of the algorithm. If nil is specified then (if necessary) an initialization vector is automatically generated from the key. Note: the method for generating automatic IVs is different from DCPcrypt v1.31, if this is a problem uncomment the DCPcrypt v1.31 compatibility mode line in DCPcrypt2.pas.

Init example: use the hash of a string to initialize the cipher

  procedure TForm1.Button1Click(Sender: TObject);
  var
    Cipher: TDCP_rc4;
    Hash: TDCP_sha1;
    Digest: array[0..19] of byte;  // SHA-1 produces a 160bit (20byte) output
  begin
    Hash:= TDCP_sha1.Create(Self);
    Hash.Init;                     // initialize the hash
    Hash.UpdateStr(Edit1.Text);    // generate a hash of Edit1.Text
    Hash.Final(Digest);            // save the hash in Digest
    Hash.Free;
    Cipher:= TDCP_rc4.Create(Self);
    Cipher.Init(Digest,Sizeof(Digest)*8,nil);  // remember size is in BITS (hence sizeof*8)
    ...
    

procedure InitStr(const Key: string; HashType: TDCP_hashclass);

This procedure initializes the cipher with a hash of the key string using the specified hash type (in a way similar to the example above). To replicate the behaviour from DCPcrypt v2 Beta 1 use Cipher.InitStr(KeyStr,TDCP_sha1).

InitStr example: prompt the user for a passphrase to initialize the cipher

  procedure TForm1.Button1Click(Sender: TObject);
  var
    Cipher: TDCP_rc4;
  begin
    Cipher:= TDCP_rc4.Create(Self);
    Cipher.InitStr(InputBox('Passphrase','Enter a passphrase',''),TDCP_sha1); // prompt for a passphrase
    ...
    

procedure Burn;

Once you have finished encrypting/decrypting all your data call Burn to erase all keying information. This is automatically called once the cipher is freed, however it is a good habit to call this procedure explicitly.

procedure Reset;

Stream ciphers (and block ciphers in chaining modes) generally store chaining information that is dependant on the information already encrypted. Consequently decrypting a block of information immediately after encrypting it won't result in the original information because when you called the decrypt procedure the chaining information was different from when you called the encrypt procedure. Hence use Reset to restore the chaining information to it's original state.

Remember that calling EncryptString, DecryptString, EncryptStream and DecryptStream will also affect the chaining information.

Reset example: encrypting and decrypting

  function TestCipher: boolean;
  const
    InData: array[0..9] of byte= ($01,$23,$45,$56,$67,$78,$89,$10,$AB,$FF);
  var
    Cipher: TDCP_rc4;
    Data: array[0..9] of byte;
  begin
    Cipher:= TDCP_rc4.Create(nil);
    Cipher.InitStr('Hello World',TDCP_sha1);   // initialize the cipher
    Cipher.Encrypt(InData,Data,Sizeof(Data));  // encrypt some known data
    Cipher.Decrypt(Data,Data,Sizeof(Data));    // now decrypt it
    Cipher.Burn;                               // clear keying information
    Cipher.Free;
    Result:= CompareMem(@InData,@Data,Sizeof(Data));  // compare input and output
  end;
    
The above will ALWAYS result in false due to the chaining information.
  function TestCipher: boolean;
  const
    InData: array[0..9] of byte= ($01,$23,$45,$56,$67,$78,$89,$10,$AB,$FF);
  var
    Cipher: TDCP_rc4;
    Data: array[0..9] of byte;
  begin
    Cipher:= TDCP_rc4.Create(nil);
    Cipher.InitStr('Hello World',TDCP_sha1);   // initialize the cipher
    Cipher.Encrypt(InData,Data,Sizeof(Data));  // encrypt some known data
    Cipher.Reset;                              // reset chaining information
    Cipher.Decrypt(Data,Data,Sizeof(Data));    // now decrypt it
    Cipher.Burn;                               // clear keying information
    Cipher.Free;
    Result:= CompareMem(@InData,@Data,Sizeof(Data));  // compare input and output
  end;
    
The above should always return true.

procedure Encrypt(const Indata; var Outdata; Size: longword);

Encrypt Size bytes from Indata and place it in Outdata. Block ciphers encrypt the data using the method specified by the CipherMode property. Also see the notes on Reset.

procedure Decrypt(const Indata; var Outdata; Size: longword);

Decrypt Size bytes from Indata and place it in Outdata. Block ciphers decrypt the data using the method specified by the CipherMode property. Also see the notes on Reset.

function EncryptStream(InStream, OutStream: TStream; Size: longword): longword;

Encrypt Size bytes from the InStream and place it in the OutStream, returns the number of bytes read from the InStream. Encryption is done by calling the Encrypt procedure. Also see the notes on Reset.

function DecryptStream(InStream, OutStream: TStream; Size: longword): longword;

Decrypt Size bytes from the InStream and place it in the OutStream, returns the number of bytes read from the InStream. Decryption is done by calling the Decrypt procedure. Also see the notes on Reset.

function EncryptString(const Str: string): string;

Encrypt the string Str then Base64 encode it and return the result. For stream ciphers the Encrypt procedure is called to do the encryption, for block ciphers the CFB8bit method is always used. Base64 encoding is used to ensure that the output string doesn't contain non-printing characters.

function DecryptString(const Str: string): string;

Base64 decode the string then decrypt it and return the result. For stream ciphers the Decrypt procedure is called to do the decryption, for block ciphers the CFB8bit method is always used.


Example 1: String encryption

This example shows how you can encrypt the contents of a TMemo and leave the contents printable.

  procedure TForm1.btnEncryptClick(Sender: TObject);
  var
    i: integer;
    Cipher: TDCP_rc4;
    KeyStr: string;
  begin
    KeyStr:= '';
    if InputQuery('Passphrase','Enter passphrase',KeyStr) then  // get the passphrase
    begin
      Cipher:= TDCP_rc4.Create(Self);
      Cipher.InitStr(KeyStr,TDCP_sha1);         // initialize the cipher with a hash of the passphrase
      for i:= 0 to Memo1.Lines.Count-1 do       // encrypt the contents of the memo
        Memo1.Lines[i]:= Cipher.EncryptString(Memo1.Lines[i]);
      Cipher.Burn;
      Cipher.Free;
    end;
  end;
  
  procedure TForm1.btnDecryptClick(Sender: TObject);
  var
    i: integer;
    Cipher: TDCP_rc4;
    KeyStr: string;
  begin
    KeyStr:= '';
    if InputQuery('Passphrase','Enter passphrase',KeyStr) then  // get the passphrase
    begin
      Cipher:= TDCP_rc4.Create(Self);
      Cipher.InitStr(KeyStr,TDCP_sha1);         // initialize the cipher with a hash of the passphrase
      for i:= 0 to Memo1.Lines.Count-1 do       // decrypt the contents of the memo
        Memo1.Lines[i]:= Cipher.DecryptString(Memo1.Lines[i]);
      Cipher.Burn;
      Cipher.Free;
    end;
  end;
    

Example 2: File encryption

This example shows how you can encrypt the contents of a file, takes the input and output file names from two edit boxes: boxInputFile and boxOutputFile.

  procedure TForm1.btnEncryptClick(Sender: TObject);
  var
    Cipher: TDCP_rc4;
    KeyStr: string;
    Source, Dest: TFileStream;
  begin
    KeyStr:= '';
    if InputQuery('Passphrase','Enter passphrase',KeyStr) then  // get the passphrase
    begin
      try
        Source:= TFileStream.Create(boxInputFile.Text,fmOpenRead);
        Dest:= TFileStream.Create(boxOutputFile.Text,fmCreate);
        Cipher:= TDCP_rc4.Create(Self);
        Cipher.InitStr(KeyStr,TDCP_sha1);              // initialize the cipher with a hash of the passphrase
        Cipher.EncryptStream(Source,Dest,Source.Size); // encrypt the contents of the file
        Cipher.Burn;
        Cipher.Free;
        Dest.Free;
        Source.Free;
        MessageDlg('File encrypted',mtInformation,[mbOK],0);
      except
        MessageDlg('File IO error',mtError,[mbOK],0);
      end;
    end;
  end;
  
  procedure TForm1.btnDecryptClick(Sender: TObject);
  var
    Cipher: TDCP_rc4;
    KeyStr: string;
    Source, Dest: TFileStream;
  begin
    KeyStr:= '';
    if InputQuery('Passphrase','Enter passphrase',KeyStr) then  // get the passphrase
    begin
      try
        Source:= TFileStream.Create(boxInputFile.Text,fmOpenRead);
        Dest:= TFileStream.Create(boxOutputFile.Text,fmCreate);
        Cipher:= TDCP_rc4.Create(Self);
        Cipher.InitStr(KeyStr,TDCP_sha1);              // initialize the cipher with a hash of the passphrase
        Cipher.DecryptStream(Source,Dest,Source.Size); // decrypt the contents of the file
        Cipher.Burn;
        Cipher.Free;
        Dest.Free;
        Source.Free;
        MessageDlg('File decrypted',mtInformation,[mbOK],0);
      except
        MessageDlg('File IO error',mtError,[mbOK],0);
      end;
    end;
  end;
    

Example 3: General encryption

This hypothetical example shows how you might encrypt a packet of information before transmission across a network.

  type
    TSomePacket= record
      Date: double;
      ToUserID: integer;
      FromUserID: integer;
      MsgLen: integer;
      Msg: string;
    end;
    
  procedure EncryptPacket(Cipher: TDCP_cipher; var Packet: TSomePacket);
  // encrypt the information packet with the cipher
  // if the cipher isn't initialized then prompt for passphrase
  begin
    if Cipher= nil then
      raise Exception.Create('Cipher hasn''t been created!')
    else
    begin
      if not Cipher.Initialized then        // check the cipher has been initialized
        Cipher.InitStr(InputBox('Passphrase','Enter passphrase',''),TDCP_sha1);
      if Cipher is TDCP_blockcipher then    // if a block cipher use CFB 8bit as encrypting small packets
        TDCP_blockcipher(Cipher).CipherMode:= cmCFB8bit; 
      // encrypt the record part by part, could do this in one go if it was a packed record
      Cipher.Encrypt(Packet.Date,Packet.Date,Sizeof(Packet.Date));  
      Cipher.Encrypt(Packet.ToUserID,Packet.ToUserID,Sizeof(Packet.ToUserID));
      Cipher.Encrypt(Packet.FromUserID,Packet.FromUserID,Sizeof(Packet.FromUserID));
      Cipher.Encrypt(Packet.MsgLen,Packet.MsgLen,Sizeof(Packet.MsgLen));
      Cipher.Encrypt(Packet.Msg[1],Packet.Msg[1],Length(Packet.Msg));  // slightly different for strings
      // don't bother resetting the cipher, instead keep the chaining information
    end;  
  end;
    

 

Index, Block Ciphers, Hashes

 

DCPcrypt is copyrighted © 1999-2002 David Barton.
All trademarks are property of their respective owners.
doublecmd-0.5.8/components/dcpcrypt/Docs/osi-certified-120x100.png0000644000175000017500000001551711652036011023564 0ustar alexxalexxPNG  IHDRxdcetIME,k59IDATx}ytwUwLϞd$@@E\P6]{W ЏEP,-ʚe!Lf魾?wM ΄Nt=US~ꩥk BG䁵[p(>Q}DG %m@PEY^^q WjJE)J%lo½KtLՙ_/WTT^^:nG$!!ajRm1Z-i]KKHq o^vSąreB '0! @! ȋ< @AJ?ўdw=Z"B?~hYmc-Z&*T (#q0KOX;:8oԛze|faQ$վ rʯNIi(R(u<+01R`BK#~_[>h D=O}ƦFN}@Kר$Đ@A!8D<}\=M!C<"[;؎D8.Ԕ!Moґ$A OTy]n;;s̬OLDZv*ۍl0^o041sr\vyO{|L"4{O߯Uʘ&¥kŷ!SI7vnYݖQ^f;ha<ڶZ}lI )6@k9RS>{Y="M+I4˱ӖLݾdKys#)!iݼG]G/%5n4TQb "WL\w9J$zW5z۬NT!>}Nb11]zW]^WԴG#R,=b5)TYD0KXS/QS luﮙsA) Jo$ 0tJ~ktFW^4br! "GdULW#^'z}lt1yF@{߁R Օ+6/-G>XΘWǑHh3e4͗?~_#0D:ЙCX%HR%tNsODh IkKxIQ+rBq)0bBiuGw:}We \:u?kmnX.H q5+ 0y$ Lj5GJ#:A;q'e'ݜ!F?}~%Q BVRf6MCPSaP!;.L5`)Y][E pġ藜\nKQTĎzjkKU6u.IHl%QRőTssniPU뮨 *B8hHT }wר5/Wn\qe^ʹ8Ka*dU8߰<}0rDG3`2 $!&xa IiLv9#Tx- l2lϮ-ɡ}0_#x)A#8A]Pa<(` 6TA""D'TJ "Bꔐz6AcVX?_cPj$$"'($sRHJGD6jɖd >T tfCن廃e83ExZTTzbzh YiY~9P,I@rV^;y!`c]~gLy0!R]NFm2L 7/z7fԥ\Sx1Ҿ.ё/Ӡ7l1u9$w Ceu֗GN)),i5ʅVtgQ!gyPa_T~C|nbXZp%nPG_[ik._}YlNWo"#2V^WrD ⑂!0a,e\1KOSj'\ CJIjKBG;0eL.1!>b1:wq~g 0㤂l8hdfXm$JU/'{$KZbM{t8ޗ`kXԌ>k^o6 oԺ?6aDJk05>/:}dQ1ĉ!?K< =X?kyzWI (guNwm t)^ U諌SR7iQk &]"DtSkZguލ+b8z]n=6 \Ԁ$IV3,B~[ygw)+,^wJ6s-4mr؝#\^wDA>J?PBe|5 |)!6! ' oz}ކc6/Tr>3ֶСWv/fZmHH@#4df.}m }^~`ۡ3$$y}޷?}r?UaUwDĐϽ9id~y.~ >Ⱦ0v@) 66]k|7?3jiߟX1,ze{Sʚmvk9~Q i5w9deO=룭G]. "|niPC վ}ڦ]x$BT;w4ɜu:ssn~ͣgA'x75s#ϭ?E@ (!p8hu493[K恅c3b[咕VN55c3p1륆Vy@`wFjTH@kqܴ'.-!쁵uCf=3m+l3o?Mܻg>PC ?[>uJV>15 3O;ֳZH;+]4MwLK<=d'TT\H*ɒ>] K{YU)Uշ~]ٺOgeu%)Z\E4^k߶zZ[W,t4*W=h4O|z٩ތ߮PZ띴Scjr7iZRA{aﰹ'cm]{7Z/i+ZNUmUG<^E 8DPqO-ږۊaئloŬ3?È^ßL߇F{h^WpgѶ 5Dj1;lsD?K %':J݀|ݺu߿?I%m6۞={Ν;G4ayyyEEE¢(8qcR B;wd'hjtT\xϟo6Geee-7lؐ&̜͛7M&a$Ij7l:tAرcV-;CaΜ9#_ϙ3'6!֨QJJJv8q /PWw^EQl4gϞSN_ɓnݺ3 zѵkמ={d21_ зo߽{߿eɓ'*++yJ5{lVf? qyWՁ/[,999L:!vcbb:ubŊӧO{< xh$I|Wv2p?rE 4H^lٲE$PyyyrrlF۷Bعs}\_~eРA8?hO?Եk6ߕ?}ߞh7o^~!4o<CT*0LLL AGm.@4AÆ EQ<}tZZZ+**|> }% gV\4iԺxg*z}-[555~_N~].rl6so555A*++baY)%%ѣyvn֬BðZ ϗݿR]] 0UUUr!BB;Wj4@^@bbbNNαcm|Z֛L)SL2a+W>}6mr8UV͞=bV7NQ@AB $P &_ 6iժU֭ -"Ir_"IB[ A,*I0-<m(k׮]v}ǎ;tPh#ѷ\780SSS}>CKL8QjJƴFKju$I6m*.2C>t{y9J8 t;/f*6EУG6~6U$)O/oNhsz-P*#F-XaǏ;Vv[Jrm۶ 8pǎ_-[&(ϝ;W|dTUU5 Y9ŋS;P(,KeeebbbΝk~f:TnZ{!ښTh/==y9sȒ.]j233͒zdX;&)++饗Bz(-YjBr5ɚW^,\PD,^>+++++8YyQ,$YZZ*/;v8p]~sssz0 *qĉ6id52=fqw H6oBkʯȑ# qɒ%!IN {l޽{7Kaaa2NSL :999)))@t<(7ѣG͜9SY`ѢE*j3f8-|g}699YP`222Fx_t]rrرcSSS 0L՚L{lɒ%'Nlyyy{G[;܁Ο?O#.]yGv/\@QԸqV\ٽ{w9uz0t>Sݻc!y_~y-zaŋm6-Z~~ 6eʔ Re6KJJYeYVcv=$r!3n_F %':JOtp(>QAHIENDB`doublecmd-0.5.8/components/dcpcrypt/Docs/BlockCiphers.html0000644000175000017500000001604711652036011022654 0ustar alexxalexx DCPcrypt v2: Users Guide - Block Ciphers

DCPcrypt Cryptographic Component Library v2
Copyright © 1999-2002 David Barton
http://www.cityinthesky.co.uk/
crypto@cityinthesky.co.uk

Block Ciphers - TDCP_blockcipher

All block ciphers are inherited from the TDCP_blockcipher component via either the TDCP_blockcipher64 and TDCP_blockcipher128 components (the latter implement the block size specific code).

The TDCP_blockcipher component extends the TDCP_cipher component to provide chaining mode functions. Functions available are:

      property Initialized: boolean;
      property Id: integer;
      property Algorithm: string;
      property MaxKeySize: integer;
      property BlockSize: integer;
      property CipherMode: TDCP_ciphermode;
  
      class function SelfTest: boolean;
 
      procedure SetIV(const Value);
      procedure GetIV(var Value);
 
      procedure Init(const Key; Size: longword; InitVector: pointer); 
      procedure InitStr(const Key: string; HashType: TDCP_hashclass);
      procedure Burn; 
      procedure Reset;
      procedure Encrypt(const Indata; var Outdata; Size: longword); 
      procedure Decrypt(const Indata; var Outdata; Size: longword); 
      function EncryptStream(InStream, OutStream: TStream; Size: longword): longword;
      function DecryptStream(InStream, OutStream: TStream; Size: longword): longword;
      function EncryptString(const Str: string): string; 
      function DecryptString(const Str: string): string; 
      procedure EncryptECB(const Indata; var Outdata);
      procedure DecryptECB(const Indata; var Outdata);
      procedure EncryptCBC(const Indata; var Outdata; Size: longword);
      procedure DecryptCBC(const Indata; var Outdata; Size: longword);
      procedure EncryptCFB8bit(const Indata; var Outdata; Size: longword);
      procedure DecryptCFB8bit(const Indata; var Outdata; Size: longword);
      procedure EncryptCFBblock(const Indata; var Outdata; Size: longword);
      procedure DecryptCFBblock(const Indata; var Outdata; Size: longword);
      procedure EncryptOFB(const Indata; var Outdata; Size: longword);
      procedure DecryptOFB(const Indata; var Outdata; Size: longword);
      procedure EncryptCTR(const Indata; var Outdata; Size: longword);
      procedure DecryptCTR(const Indata; var Outdata; Size: longword);
    

Function descriptions

property BlockSize: integer;

This contains the block size of the cipher in BITS.

property CipherMode: TDCP_ciphermode;

This is the current chaining mode used when Encrypt is called. The available modes are:

  • cmCBC - Cipher block chaining.
  • cmCFB8bit - 8bit cipher feedback.
  • cmCFBblock - Cipher feedback (using the block size of the algorithm).
  • cmOFB - Output feedback.
  • cmCTR - Counter.

Each chaining mode has it's own pro's and cons. See any good book on cryptography or the NIST publication SP800-38A for details on each.

procedure SetIV(const Value);

Use this procedure to set the current chaining mode information to Value. This variable should be the same size as the block size. When Reset is called subsequent to this, the chaining information will be set back to Value.

procedure GetIV(var Value);

This returns in Value the current chaining mode information, to get the initial chaining mode information you need to call Reset before calling GetIV. The variable passed in Value must be at least the same size as the block size otherwise you will get a buffer overflow.

procedure EncryptCBC(const Indata; var Outdata; Size: longword);
procedure DecryptCBC(const Indata; var Outdata; Size: longword);
procedure EncryptCFB8bit(const Indata; var Outdata; Size: longword);
procedure DecryptCFB8bit(const Indata; var Outdata; Size: longword);
procedure EncryptCFBblock(const Indata; var Outdata; Size: longword);
procedure DecryptCFBblock(const Indata; var Outdata; Size: longword);
procedure EncryptOFB(const Indata; var Outdata; Size: longword);
procedure DecryptOFB(const Indata; var Outdata; Size: longword);
procedure EncryptCTR(const Indata; var Outdata; Size: longword);
procedure DecryptCTR(const Indata; var Outdata; Size: longword);

These procedures encrypt/decrypt Size bytes of data from Indata and places the result in Outdata. These all employ chaining mode methods of encryption/decryption and so may need to be used inconjunction with Reset. The CBC method uses short block encryption as specified in Bruce Schneier's "Applied Cryptography" for data blocks that are not multiples of the block size.

 

Index, Ciphers, Hashes

 

DCPcrypt is copyrighted © 1999-2002 David Barton.
All trademarks are property of their respective owners.
doublecmd-0.5.8/components/dcpcrypt/Docs/DCPhashes/0000755000175000017500000000000012257501472021222 5ustar alexxalexxdoublecmd-0.5.8/components/dcpcrypt/Docs/DCPhashes/TDCP_SHA1.bmp0000644000175000017500000000062611652036011023222 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPhashes/TDCP_MD5.bmp0000644000175000017500000000062611652036011023113 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPhashes/TDCP_SHA512.bmp0000644000175000017500000000062611652036011023371 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPhashes/TDCP_SHA384.bmp0000644000175000017500000000062611652036011023400 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPhashes/TDCP_SHA256.bmp0000644000175000017500000000062611652036011023376 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPhashes/TDCP_RIPEMD160.bmp0000644000175000017500000000062611652036011023735 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPhashes/TDCP_MD4.bmp0000644000175000017500000000062611652036011023112 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPhashes/TDCP_RIPEMD128.bmp0000644000175000017500000000062611652036011023741 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPhashes/TDCP_TIGER.bmp0000644000175000017500000000062611652036011023400 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/DCPhashes/TDCP_HAVAL.bmp0000644000175000017500000000062611652036011023361 0ustar alexxalexxBMv( doublecmd-0.5.8/components/dcpcrypt/Docs/Index.html0000644000175000017500000002532411652036011021351 0ustar alexxalexx DCPcrypt v2: Users Guide - Index

DCPcrypt Cryptographic Component Library v2 Beta 3
Copyright © 1999-2002 David Barton
http://www.cityinthesky.co.uk/
crypto@cityinthesky.co.uk

Introduction

DCPcrypt is a collection of cryptographic components for the Borland Delphi(tm), C++ Builder(tm) and Kylix(tm) programming languages. The supported versions are Delphi 4, 5, 6 and 7, C++ Builder (3?), 4, 5, 6 and Kylix 1 (untested) and 2.

The idea behind DCPcrypt is that it should be possible to "drop in" any algorithm implementation to replace another with minimum or no code changes. To aid in this goal all cryptographic components are descended from one of several base classes, TDCP_cipher for encryption algorithms and TDCP_hash for message digest algorithms.

DCPcrypt is open source software (released under the MIT license) and as such there is no charge for inclusion in other software. However, I am currently a student and if you are making money from my software I would really appreciate a donation of some sort, whether financial or a license for the software you develop (or if anyone wants to sponsor a Mathematical Modelling (Masters) student for their final year...). Please note THIS IS NOT COMPULSORY IN ANY WAY. See http://www.cityinthesky.co.uk/cryptography.html for details on donations.

This software is OSI Certified Open Source Software. OSI Certified is a certification mark of the Open Source Initiative.

If you maintain a website then a link to my page at http://www.cityinthesky.co.uk/ would be great!

 

What's New

Changes since DCPcrypt v2 Beta 2:

  • Corrected C++ Builder compilation problem.

Changes since DCPcrypt v2 Beta 1:

  • Renamed source code files for hashes and ciphers to DCPxxx.pas
  • Change the format of Cipher.InitStr so that the hash algorithm used to generate the key is explicitly specified. In order to get the same functionality as before, use TDCP_sha1. e.g. Cipher.InitStr('Hello World',TDCP_sha1);
  • Block ciphers are now inherited from an intermediate component that implements the block size specific chaining mode encryption routines.
  • Remove the internal component registration, it was more hassle than it was worth. If there is a demand for this to be put back then I might...
  • Added the full range of operation modes for Haval. By changing the defines at the top of DCPhaval.pas you can specify the number of passes and the output hash size.
  • Added the Tiger hash algorithm (192bit digest).
  • Changed the name of the file containing TDCP_ripemd160 for consistency to DCPripemd160 from DCPrmd160.
  • GOST no longer appears on the component palette pending verifying what the actual standard is (the code is still included however).
  • Added the RipeMD-128 hash algorithm (128bit digest).
  • Added the Serpent block cipher (AES finalist).
  • Added the SHA-256,384,512 hash algorithms (256, 384, 512bit digest respectively).
  • Added CTR chaining mode to all block ciphers.

 

Installation

Delphi Open the appropriate package, DCPdelphiX.dpk where X is your version of Delphi (either 4, 5 or 6). Then press the install button.
C++ Builder Create a new design time package and add all the .pas files from the DCPcrypt2.zip archive including all those in the Ciphers and Hashes subdirectories. Then press the install button.
Kylix Open the DCPkylix.dpk package and then press the install button (note: Kylix 1 users may need to create a new package as with C++ Builder as this is a Kylix 2 package).

You may need to add the directory containing DCPcrypt (and the Ciphers and Hashes subdirectories) to your library search path (found under Environment Options).

Once installed you will find two extra pages of components on your component palette, namely DCPciphers and DCPhashes. You can now place these components onto the form of your application to start using the algorithms.

 

Usage

Please note that an appreciation of the basic principles of encryption/decryption and key management is needed to ensure the correct usage of the ciphers implemented within this package. A good introduction on this subject is provided by Bruce Schneier's "Applied Cryptography" (ISBN: 0-471-11709-9) also see the NIST publication SP800-38A for information on the block cipher chaining modes.

  • Ciphers - the basic building block of DCPcrypt, the TDCP_cipher component.
  • Block Ciphers - the base of all block ciphers, the TDCP_blockcipher component.
  • Hashes - the base of all hash algorithms, the TDCP_hash component.

DCPcrypt v2 contains the following ciphers and hash algorithms:

Ciphers
Name Patents Block Size Max Key Size*
Blowfish None 64 bits 448 bits
Cast-128 None 64 bits 128 bits
Cast-256 Patented? 128 bits 256 bits
DES None 64 bits** 64 bits
3DES None 64 bits 192 bits
Ice None? 64 bits 64 bits
Thin Ice None? 64 bits 64 bits
Ice 2 None? 64 bits 128 bits
IDEA Free for non-commercial use 64 bits 128 bits
MARS Patented? 128 bits 1248 bits
Misty1 Free for non-commercial use 64 bits 128 bits
RC2 None 64 bits 1024 bits
RC4 None N/A 2048 bits
RC5 Patented 64 bits 2048 bits
RC6 Patented 128 bits 2048 bits
Rijndael (AES) None 128 bits 256 bits
Serpent None 128 bits 256 bits
TEA None 64 bits 128 bits
Twofish None 128 bits 256 bits

* although the quoted maximum key size may extremely large it doen't mean that the algorithm is secure to the same level.
** a 64bit key is used for DES then every 8th bit is discarded (parity) so the effective size is 56 bits.

Hash Algorithms
Name Patents Digest Size
Haval None 128, 160, 192, 224, 256 bits*
MD4 None 128 bits
MD5 None 128 bits
RipeMD-128 None 128 bits
RipeMD-160 None 160 bits
SHA-1 None 160 bits
SHA-256 None 256 bits
SHA-384 None 384 bits
SHA-512 None 512 bits
Tiger None 192 bits

* The different digest sizes of Haval can be accessed by uncommenting the $defines at the start of DCPhaval.pas.

 

Contact

I appreciate knowing what DCPcrypt is being used for and also if you have any queries or bug reports please email me at crypto@cityinthesky.co.uk.

 

DCPcrypt is copyrighted © 1999-2003 David Barton.
All trademarks are property of their respective owners.
doublecmd-0.5.8/components/dcpcrypt/dcpconst.pas0000644000175000017500000000613612014201074021042 0ustar alexxalexx{******************************************************************************} {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********} {******************************************************************************} {* Constants for use with DCPcrypt ********************************************} {******************************************************************************} {* Copyright (c) 1999-2002 David Barton *} {* Permission is hereby granted, free of charge, to any person obtaining a *} {* copy of this software and associated documentation files (the "Software"), *} {* to deal in the Software without restriction, including without limitation *} {* the rights to use, copy, modify, merge, publish, distribute, sublicense, *} {* and/or sell copies of the Software, and to permit persons to whom the *} {* Software is furnished to do so, subject to the following conditions: *} {* *} {* The above copyright notice and this permission notice shall be included in *} {* all copies or substantial portions of the Software. *} {* *} {* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *} {* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *} {* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *} {* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *} {* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *} {* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *} {* DEALINGS IN THE SOFTWARE. *} {******************************************************************************} unit DCPconst; interface {******************************************************************************} const { Component registration } DCPcipherpage = 'DCPciphers'; DCPhashpage = 'DCPhashes'; { ID values } DCP_rc2 = 1; DCP_sha1 = 2; DCP_rc5 = 3; DCP_rc6 = 4; DCP_blowfish = 5; DCP_twofish = 6; DCP_cast128 = 7; DCP_gost = 8; DCP_rijndael = 9; DCP_ripemd160 = 10; DCP_misty1 = 11; DCP_idea = 12; DCP_mars = 13; DCP_haval = 14; DCP_cast256 = 15; DCP_md5 = 16; DCP_md4 = 17; DCP_tiger = 18; DCP_rc4 = 19; DCP_ice = 20; DCP_thinice = 21; DCP_ice2 = 22; DCP_des = 23; DCP_3des = 24; DCP_tea = 25; DCP_serpent = 26; DCP_ripemd128 = 27; DCP_sha256 = 28; DCP_sha384 = 29; DCP_sha512 = 30; DCP_sfv = 99; {******************************************************************************} {******************************************************************************} implementation end. doublecmd-0.5.8/components/dcpcrypt/Hashes/0000755000175000017500000000000012257501472017743 5ustar alexxalexxdoublecmd-0.5.8/components/dcpcrypt/Hashes/dcpmd5.pas0000644000175000017500000002372612014201074021620 0ustar alexxalexx{******************************************************************************} {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********} {******************************************************************************} {* A binary compatible implementation of MD5 **********************************} {******************************************************************************} {* Copyright (c) 1999-2002 David Barton *} {* Permission is hereby granted, free of charge, to any person obtaining a *} {* copy of this software and associated documentation files (the "Software"), *} {* to deal in the Software without restriction, including without limitation *} {* the rights to use, copy, modify, merge, publish, distribute, sublicense, *} {* and/or sell copies of the Software, and to permit persons to whom the *} {* Software is furnished to do so, subject to the following conditions: *} {* *} {* The above copyright notice and this permission notice shall be included in *} {* all copies or substantial portions of the Software. *} {* *} {* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *} {* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *} {* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *} {* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *} {* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *} {* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *} {* DEALINGS IN THE SOFTWARE. *} {******************************************************************************} unit DCPmd5; {$MODE Delphi} interface uses Classes, Sysutils, DCPcrypt2, DCPconst; type TDCP_md5= class(TDCP_hash) protected LenHi, LenLo: longword; Index: DWord; CurrentHash: array[0..3] of DWord; HashBuffer: array[0..63] of byte; procedure Compress; public class function GetId: integer; override; class function GetAlgorithm: string; override; class function GetHashSize: integer; override; class function SelfTest: boolean; override; procedure Init; override; procedure Burn; override; procedure Update(const Buffer; Size: longword); override; procedure Final(var Digest); override; end; {******************************************************************************} {******************************************************************************} implementation {$R-}{$Q-} function LRot32(a, b: longword): longword; begin Result:= (a shl b) or (a shr (32-b)); end; procedure TDCP_md5.Compress; var Data: array[0..15] of dword; A, B, C, D: dword; begin dcpFillChar(Data, SizeOf(Data), 0); Move(HashBuffer,Data,Sizeof(Data)); A:= CurrentHash[0]; B:= CurrentHash[1]; C:= CurrentHash[2]; D:= CurrentHash[3]; A:= B + LRot32(A + (D xor (B and (C xor D))) + Data[ 0] + $d76aa478,7); D:= A + LRot32(D + (C xor (A and (B xor C))) + Data[ 1] + $e8c7b756,12); C:= D + LRot32(C + (B xor (D and (A xor B))) + Data[ 2] + $242070db,17); B:= C + LRot32(B + (A xor (C and (D xor A))) + Data[ 3] + $c1bdceee,22); A:= B + LRot32(A + (D xor (B and (C xor D))) + Data[ 4] + $f57c0faf,7); D:= A + LRot32(D + (C xor (A and (B xor C))) + Data[ 5] + $4787c62a,12); C:= D + LRot32(C + (B xor (D and (A xor B))) + Data[ 6] + $a8304613,17); B:= C + LRot32(B + (A xor (C and (D xor A))) + Data[ 7] + $fd469501,22); A:= B + LRot32(A + (D xor (B and (C xor D))) + Data[ 8] + $698098d8,7); D:= A + LRot32(D + (C xor (A and (B xor C))) + Data[ 9] + $8b44f7af,12); C:= D + LRot32(C + (B xor (D and (A xor B))) + Data[10] + $ffff5bb1,17); B:= C + LRot32(B + (A xor (C and (D xor A))) + Data[11] + $895cd7be,22); A:= B + LRot32(A + (D xor (B and (C xor D))) + Data[12] + $6b901122,7); D:= A + LRot32(D + (C xor (A and (B xor C))) + Data[13] + $fd987193,12); C:= D + LRot32(C + (B xor (D and (A xor B))) + Data[14] + $a679438e,17); B:= C + LRot32(B + (A xor (C and (D xor A))) + Data[15] + $49b40821,22); A:= B + LRot32(A + (C xor (D and (B xor C))) + Data[ 1] + $f61e2562,5); D:= A + LRot32(D + (B xor (C and (A xor B))) + Data[ 6] + $c040b340,9); C:= D + LRot32(C + (A xor (B and (D xor A))) + Data[11] + $265e5a51,14); B:= C + LRot32(B + (D xor (A and (C xor D))) + Data[ 0] + $e9b6c7aa,20); A:= B + LRot32(A + (C xor (D and (B xor C))) + Data[ 5] + $d62f105d,5); D:= A + LRot32(D + (B xor (C and (A xor B))) + Data[10] + $02441453,9); C:= D + LRot32(C + (A xor (B and (D xor A))) + Data[15] + $d8a1e681,14); B:= C + LRot32(B + (D xor (A and (C xor D))) + Data[ 4] + $e7d3fbc8,20); A:= B + LRot32(A + (C xor (D and (B xor C))) + Data[ 9] + $21e1cde6,5); D:= A + LRot32(D + (B xor (C and (A xor B))) + Data[14] + $c33707d6,9); C:= D + LRot32(C + (A xor (B and (D xor A))) + Data[ 3] + $f4d50d87,14); B:= C + LRot32(B + (D xor (A and (C xor D))) + Data[ 8] + $455a14ed,20); A:= B + LRot32(A + (C xor (D and (B xor C))) + Data[13] + $a9e3e905,5); D:= A + LRot32(D + (B xor (C and (A xor B))) + Data[ 2] + $fcefa3f8,9); C:= D + LRot32(C + (A xor (B and (D xor A))) + Data[ 7] + $676f02d9,14); B:= C + LRot32(B + (D xor (A and (C xor D))) + Data[12] + $8d2a4c8a,20); A:= B + LRot32(A + (B xor C xor D) + Data[ 5] + $fffa3942,4); D:= A + LRot32(D + (A xor B xor C) + Data[ 8] + $8771f681,11); C:= D + LRot32(C + (D xor A xor B) + Data[11] + $6d9d6122,16); B:= C + LRot32(B + (C xor D xor A) + Data[14] + $fde5380c,23); A:= B + LRot32(A + (B xor C xor D) + Data[ 1] + $a4beea44,4); D:= A + LRot32(D + (A xor B xor C) + Data[ 4] + $4bdecfa9,11); C:= D + LRot32(C + (D xor A xor B) + Data[ 7] + $f6bb4b60,16); B:= C + LRot32(B + (C xor D xor A) + Data[10] + $bebfbc70,23); A:= B + LRot32(A + (B xor C xor D) + Data[13] + $289b7ec6,4); D:= A + LRot32(D + (A xor B xor C) + Data[ 0] + $eaa127fa,11); C:= D + LRot32(C + (D xor A xor B) + Data[ 3] + $d4ef3085,16); B:= C + LRot32(B + (C xor D xor A) + Data[ 6] + $04881d05,23); A:= B + LRot32(A + (B xor C xor D) + Data[ 9] + $d9d4d039,4); D:= A + LRot32(D + (A xor B xor C) + Data[12] + $e6db99e5,11); C:= D + LRot32(C + (D xor A xor B) + Data[15] + $1fa27cf8,16); B:= C + LRot32(B + (C xor D xor A) + Data[ 2] + $c4ac5665,23); A:= B + LRot32(A + (C xor (B or (not D))) + Data[ 0] + $f4292244,6); D:= A + LRot32(D + (B xor (A or (not C))) + Data[ 7] + $432aff97,10); C:= D + LRot32(C + (A xor (D or (not B))) + Data[14] + $ab9423a7,15); B:= C + LRot32(B + (D xor (C or (not A))) + Data[ 5] + $fc93a039,21); A:= B + LRot32(A + (C xor (B or (not D))) + Data[12] + $655b59c3,6); D:= A + LRot32(D + (B xor (A or (not C))) + Data[ 3] + $8f0ccc92,10); C:= D + LRot32(C + (A xor (D or (not B))) + Data[10] + $ffeff47d,15); B:= C + LRot32(B + (D xor (C or (not A))) + Data[ 1] + $85845dd1,21); A:= B + LRot32(A + (C xor (B or (not D))) + Data[ 8] + $6fa87e4f,6); D:= A + LRot32(D + (B xor (A or (not C))) + Data[15] + $fe2ce6e0,10); C:= D + LRot32(C + (A xor (D or (not B))) + Data[ 6] + $a3014314,15); B:= C + LRot32(B + (D xor (C or (not A))) + Data[13] + $4e0811a1,21); A:= B + LRot32(A + (C xor (B or (not D))) + Data[ 4] + $f7537e82,6); D:= A + LRot32(D + (B xor (A or (not C))) + Data[11] + $bd3af235,10); C:= D + LRot32(C + (A xor (D or (not B))) + Data[ 2] + $2ad7d2bb,15); B:= C + LRot32(B + (D xor (C or (not A))) + Data[ 9] + $eb86d391,21); Inc(CurrentHash[0],A); Inc(CurrentHash[1],B); Inc(CurrentHash[2],C); Inc(CurrentHash[3],D); Index:= 0; FillChar(HashBuffer,Sizeof(HashBuffer),0); end; class function TDCP_md5.GetHashSize: integer; begin Result:= 128; end; class function TDCP_md5.GetId: integer; begin Result:= DCP_md5; end; class function TDCP_md5.GetAlgorithm: string; begin Result:= 'MD5'; end; class function TDCP_md5.SelfTest: boolean; const Test1Out: array[0..15] of byte= ($90,$01,$50,$98,$3c,$d2,$4f,$b0,$d6,$96,$3f,$7d,$28,$e1,$7f,$72); Test2Out: array[0..15] of byte= ($c3,$fc,$d3,$d7,$61,$92,$e4,$00,$7d,$fb,$49,$6c,$ca,$67,$e1,$3b); var TestHash: TDCP_md5; TestOut: array[0..19] of byte; begin dcpFillChar(TestOut, SizeOf(TestOut), 0); TestHash:= TDCP_md5.Create(nil); TestHash.Init; TestHash.UpdateStr('abc'); TestHash.Final(TestOut); Result:= CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out)); TestHash.Init; TestHash.UpdateStr('abcdefghijklmnopqrstuvwxyz'); TestHash.Final(TestOut); Result:= CompareMem(@TestOut,@Test2Out,Sizeof(Test2Out)) and Result; TestHash.Free; end; procedure TDCP_md5.Init; begin Burn; CurrentHash[0]:= $67452301; CurrentHash[1]:= $efcdab89; CurrentHash[2]:= $98badcfe; CurrentHash[3]:= $10325476; fInitialized:= true; end; procedure TDCP_md5.Burn; begin LenHi:= 0; LenLo:= 0; Index:= 0; FillChar(HashBuffer,Sizeof(HashBuffer),0); FillChar(CurrentHash,Sizeof(CurrentHash),0); fInitialized:= false; end; procedure TDCP_md5.Update(const Buffer; Size: longword); var PBuf: ^byte; begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); Inc(LenHi,Size shr 29); Inc(LenLo,Size*8); if LenLo< (Size*8) then Inc(LenHi); PBuf:= @Buffer; while Size> 0 do begin if (Sizeof(HashBuffer)-Index)<= DWord(Size) then begin Move(PBuf^,HashBuffer[Index],Sizeof(HashBuffer)-Index); Dec(Size,Sizeof(HashBuffer)-Index); Inc(PBuf,Sizeof(HashBuffer)-Index); Compress; end else begin Move(PBuf^,HashBuffer[Index],Size); Inc(Index,Size); Size:= 0; end; end; end; procedure TDCP_md5.Final(var Digest); begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); HashBuffer[Index]:= $80; if Index>= 56 then Compress; PDWord(@HashBuffer[56])^:= LenLo; PDWord(@HashBuffer[60])^:= LenHi; Compress; Move(CurrentHash,Digest,Sizeof(CurrentHash)); Burn; end; end. doublecmd-0.5.8/components/dcpcrypt/Hashes/dcpmd4.pas0000644000175000017500000002121512014201074021606 0ustar alexxalexx{******************************************************************************} {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********} {******************************************************************************} {* A binary compatible implementation of MD4 **********************************} {******************************************************************************} {* Copyright (c) 1999-2002 David Barton *} {* Permission is hereby granted, free of charge, to any person obtaining a *} {* copy of this software and associated documentation files (the "Software"), *} {* to deal in the Software without restriction, including without limitation *} {* the rights to use, copy, modify, merge, publish, distribute, sublicense, *} {* and/or sell copies of the Software, and to permit persons to whom the *} {* Software is furnished to do so, subject to the following conditions: *} {* *} {* The above copyright notice and this permission notice shall be included in *} {* all copies or substantial portions of the Software. *} {* *} {* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *} {* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *} {* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *} {* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *} {* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *} {* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *} {* DEALINGS IN THE SOFTWARE. *} {******************************************************************************} unit DCPmd4; {$MODE Delphi} interface uses Classes, Sysutils, DCPcrypt2, DCPconst; type TDCP_md4= class(TDCP_hash) protected LenHi, LenLo: longword; Index: DWord; CurrentHash: array[0..3] of DWord; HashBuffer: array[0..63] of byte; procedure Compress; public class function GetId: integer; override; class function GetAlgorithm: string; override; class function GetHashSize: integer; override; class function SelfTest: boolean; override; procedure Init; override; procedure Burn; override; procedure Update(const Buffer; Size: longword); override; procedure Final(var Digest); override; end; {******************************************************************************} {******************************************************************************} implementation {$R-}{$Q-} function LRot32(a, b: longword): longword; begin Result:= (a shl b) or (a shr (32-b)); end; procedure TDCP_md4.Compress; var Data: array[0..15] of dword; A, B, C, D: dword; begin dcpFillChar(Data, SizeOf(Data), 0); Move(HashBuffer,Data,Sizeof(Data)); A:= CurrentHash[0]; B:= CurrentHash[1]; C:= CurrentHash[2]; D:= CurrentHash[3]; A:= LRot32(A + (D xor (B and (C xor D))) + Data[ 0],3); D:= LRot32(D + (C xor (A and (B xor C))) + Data[ 1],7); C:= LRot32(C + (B xor (D and (A xor B))) + Data[ 2],11); B:= LRot32(B + (A xor (C and (D xor A))) + Data[ 3],19); A:= LRot32(A + (D xor (B and (C xor D))) + Data[ 4],3); D:= LRot32(D + (C xor (A and (B xor C))) + Data[ 5],7); C:= LRot32(C + (B xor (D and (A xor B))) + Data[ 6],11); B:= LRot32(B + (A xor (C and (D xor A))) + Data[ 7],19); A:= LRot32(A + (D xor (B and (C xor D))) + Data[ 8],3); D:= LRot32(D + (C xor (A and (B xor C))) + Data[ 9],7); C:= LRot32(C + (B xor (D and (A xor B))) + Data[10],11); B:= LRot32(B + (A xor (C and (D xor A))) + Data[11],19); A:= LRot32(A + (D xor (B and (C xor D))) + Data[12],3); D:= LRot32(D + (C xor (A and (B xor C))) + Data[13],7); C:= LRot32(C + (B xor (D and (A xor B))) + Data[14],11); B:= LRot32(B + (A xor (C and (D xor A))) + Data[15],19); A:= LRot32(A + ((B and C) or (B and D) or (C and D)) + Data[ 0] + $5a827999,3); D:= LRot32(D + ((A and B) or (A and C) or (B and C)) + Data[ 4] + $5a827999,5); C:= LRot32(C + ((D and A) or (D and B) or (A and B)) + Data[ 8] + $5a827999,9); B:= LRot32(B + ((C and D) or (C and A) or (D and A)) + Data[12] + $5a827999,13); A:= LRot32(A + ((B and C) or (B and D) or (C and D)) + Data[ 1] + $5a827999,3); D:= LRot32(D + ((A and B) or (A and C) or (B and C)) + Data[ 5] + $5a827999,5); C:= LRot32(C + ((D and A) or (D and B) or (A and B)) + Data[ 9] + $5a827999,9); B:= LRot32(B + ((C and D) or (C and A) or (D and A)) + Data[13] + $5a827999,13); A:= LRot32(A + ((B and C) or (B and D) or (C and D)) + Data[ 2] + $5a827999,3); D:= LRot32(D + ((A and B) or (A and C) or (B and C)) + Data[ 6] + $5a827999,5); C:= LRot32(C + ((D and A) or (D and B) or (A and B)) + Data[10] + $5a827999,9); B:= LRot32(B + ((C and D) or (C and A) or (D and A)) + Data[14] + $5a827999,13); A:= LRot32(A + ((B and C) or (B and D) or (C and D)) + Data[ 3] + $5a827999,3); D:= LRot32(D + ((A and B) or (A and C) or (B and C)) + Data[ 7] + $5a827999,5); C:= LRot32(C + ((D and A) or (D and B) or (A and B)) + Data[11] + $5a827999,9); B:= LRot32(B + ((C and D) or (C and A) or (D and A)) + Data[15] + $5a827999,13); A:= LRot32(A + (B xor C xor D) + Data[ 0] + $6ed9eba1,3); D:= LRot32(D + (A xor B xor C) + Data[ 8] + $6ed9eba1,9); C:= LRot32(C + (D xor A xor B) + Data[ 4] + $6ed9eba1,11); B:= LRot32(B + (C xor D xor A) + Data[12] + $6ed9eba1,15); A:= LRot32(A + (B xor C xor D) + Data[ 2] + $6ed9eba1,3); D:= LRot32(D + (A xor B xor C) + Data[10] + $6ed9eba1,9); C:= LRot32(C + (D xor A xor B) + Data[ 6] + $6ed9eba1,11); B:= LRot32(B + (C xor D xor A) + Data[14] + $6ed9eba1,15); A:= LRot32(A + (B xor C xor D) + Data[ 1] + $6ed9eba1,3); D:= LRot32(D + (A xor B xor C) + Data[ 9] + $6ed9eba1,9); C:= LRot32(C + (D xor A xor B) + Data[ 5] + $6ed9eba1,11); B:= LRot32(B + (C xor D xor A) + Data[13] + $6ed9eba1,15); A:= LRot32(A + (B xor C xor D) + Data[ 3] + $6ed9eba1,3); D:= LRot32(D + (A xor B xor C) + Data[11] + $6ed9eba1,9); C:= LRot32(C + (D xor A xor B) + Data[ 7] + $6ed9eba1,11); B:= LRot32(B + (C xor D xor A) + Data[15] + $6ed9eba1,15); Inc(CurrentHash[0],A); Inc(CurrentHash[1],B); Inc(CurrentHash[2],C); Inc(CurrentHash[3],D); Index:= 0; FillChar(HashBuffer,Sizeof(HashBuffer),0); end; class function TDCP_md4.GetHashSize: integer; begin Result:= 128; end; class function TDCP_md4.GetId: integer; begin Result:= DCP_md4; end; class function TDCP_md4.GetAlgorithm: string; begin Result:= 'MD4'; end; class function TDCP_md4.SelfTest: boolean; const Test1Out: array[0..15] of byte= ($a4,$48,$01,$7a,$af,$21,$d8,$52,$5f,$c1,$0a,$e8,$7a,$a6,$72,$9d); Test2Out: array[0..15] of byte= ($d7,$9e,$1c,$30,$8a,$a5,$bb,$cd,$ee,$a8,$ed,$63,$df,$41,$2d,$a9); var TestHash: TDCP_md4; TestOut: array[0..19] of byte; begin dcpFillChar(TestOut, SizeOf(TestOut), 0); TestHash:= TDCP_md4.Create(nil); TestHash.Init; TestHash.UpdateStr('abc'); TestHash.Final(TestOut); Result:= CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out)); TestHash.Init; TestHash.UpdateStr('abcdefghijklmnopqrstuvwxyz'); TestHash.Final(TestOut); Result:= CompareMem(@TestOut,@Test2Out,Sizeof(Test2Out)) and Result; TestHash.Free; end; procedure TDCP_md4.Init; begin Burn; CurrentHash[0]:= $67452301; CurrentHash[1]:= $efcdab89; CurrentHash[2]:= $98badcfe; CurrentHash[3]:= $10325476; fInitialized:= true; end; procedure TDCP_md4.Burn; begin LenHi:= 0; LenLo:= 0; Index:= 0; FillChar(HashBuffer,Sizeof(HashBuffer),0); FillChar(CurrentHash,Sizeof(CurrentHash),0); fInitialized:= false; end; procedure TDCP_md4.Update(const Buffer; Size: longword); var PBuf: ^byte; begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); Inc(LenHi,Size shr 29); Inc(LenLo,Size*8); if LenLo< (Size*8) then Inc(LenHi); PBuf:= @Buffer; while Size> 0 do begin if (Sizeof(HashBuffer)-Index)<= DWord(Size) then begin Move(PBuf^,HashBuffer[Index],Sizeof(HashBuffer)-Index); Dec(Size,Sizeof(HashBuffer)-Index); Inc(PBuf,Sizeof(HashBuffer)-Index); Compress; end else begin Move(PBuf^,HashBuffer[Index],Size); Inc(Index,Size); Size:= 0; end; end; end; procedure TDCP_md4.Final(var Digest); begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); HashBuffer[Index]:= $80; if Index>= 56 then Compress; PDWord(@HashBuffer[56])^:= LenLo; PDWord(@HashBuffer[60])^:= LenHi; Compress; Move(CurrentHash,Digest,Sizeof(CurrentHash)); Burn; end; end. doublecmd-0.5.8/components/dcpcrypt/Hashes/DCPhaval5.inc0000644000175000017500000007033012014201074022132 0ustar alexxalexxtemp:= (t2 and (t6 xor t1) xor t5 and t4 xor t0 and t3 xor t6); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[ 0]; temp:= (t1 and (t5 xor t0) xor t4 and t3 xor t7 and t2 xor t5); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 1]; temp:= (t0 and (t4 xor t7) xor t3 and t2 xor t6 and t1 xor t4); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[ 2]; temp:= (t7 and (t3 xor t6) xor t2 and t1 xor t5 and t0 xor t3); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[ 3]; temp:= (t6 and (t2 xor t5) xor t1 and t0 xor t4 and t7 xor t2); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[ 4]; temp:= (t5 and (t1 xor t4) xor t0 and t7 xor t3 and t6 xor t1); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[ 5]; temp:= (t4 and (t0 xor t3) xor t7 and t6 xor t2 and t5 xor t0); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[ 6]; temp:= (t3 and (t7 xor t2) xor t6 and t5 xor t1 and t4 xor t7); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[ 7]; temp:= (t2 and (t6 xor t1) xor t5 and t4 xor t0 and t3 xor t6); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[ 8]; temp:= (t1 and (t5 xor t0) xor t4 and t3 xor t7 and t2 xor t5); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 9]; temp:= (t0 and (t4 xor t7) xor t3 and t2 xor t6 and t1 xor t4); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[10]; temp:= (t7 and (t3 xor t6) xor t2 and t1 xor t5 and t0 xor t3); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[11]; temp:= (t6 and (t2 xor t5) xor t1 and t0 xor t4 and t7 xor t2); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[12]; temp:= (t5 and (t1 xor t4) xor t0 and t7 xor t3 and t6 xor t1); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[13]; temp:= (t4 and (t0 xor t3) xor t7 and t6 xor t2 and t5 xor t0); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[14]; temp:= (t3 and (t7 xor t2) xor t6 and t5 xor t1 and t4 xor t7); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[15]; temp:= (t2 and (t6 xor t1) xor t5 and t4 xor t0 and t3 xor t6); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[16]; temp:= (t1 and (t5 xor t0) xor t4 and t3 xor t7 and t2 xor t5); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[17]; temp:= (t0 and (t4 xor t7) xor t3 and t2 xor t6 and t1 xor t4); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[18]; temp:= (t7 and (t3 xor t6) xor t2 and t1 xor t5 and t0 xor t3); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[19]; temp:= (t6 and (t2 xor t5) xor t1 and t0 xor t4 and t7 xor t2); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[20]; temp:= (t5 and (t1 xor t4) xor t0 and t7 xor t3 and t6 xor t1); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[21]; temp:= (t4 and (t0 xor t3) xor t7 and t6 xor t2 and t5 xor t0); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[22]; temp:= (t3 and (t7 xor t2) xor t6 and t5 xor t1 and t4 xor t7); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[23]; temp:= (t2 and (t6 xor t1) xor t5 and t4 xor t0 and t3 xor t6); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[24]; temp:= (t1 and (t5 xor t0) xor t4 and t3 xor t7 and t2 xor t5); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[25]; temp:= (t0 and (t4 xor t7) xor t3 and t2 xor t6 and t1 xor t4); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[26]; temp:= (t7 and (t3 xor t6) xor t2 and t1 xor t5 and t0 xor t3); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[27]; temp:= (t6 and (t2 xor t5) xor t1 and t0 xor t4 and t7 xor t2); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[28]; temp:= (t5 and (t1 xor t4) xor t0 and t7 xor t3 and t6 xor t1); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[29]; temp:= (t4 and (t0 xor t3) xor t7 and t6 xor t2 and t5 xor t0); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[30]; temp:= (t3 and (t7 xor t2) xor t6 and t5 xor t1 and t4 xor t7); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[31]; temp:= (t3 and (t4 and not t0 xor t1 and t2 xor t6 xor t5) xor t1 and (t4 xor t2) xor t0 and t2 xor t5); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[ 5] + $452821E6; temp:= (t2 and (t3 and not t7 xor t0 and t1 xor t5 xor t4) xor t0 and (t3 xor t1) xor t7 and t1 xor t4); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[14] + $38D01377; temp:= (t1 and (t2 and not t6 xor t7 and t0 xor t4 xor t3) xor t7 and (t2 xor t0) xor t6 and t0 xor t3); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[26] + $BE5466CF; temp:= (t0 and (t1 and not t5 xor t6 and t7 xor t3 xor t2) xor t6 and (t1 xor t7) xor t5 and t7 xor t2); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[18] + $34E90C6C; temp:= (t7 and (t0 and not t4 xor t5 and t6 xor t2 xor t1) xor t5 and (t0 xor t6) xor t4 and t6 xor t1); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[11] + $C0AC29B7; temp:= (t6 and (t7 and not t3 xor t4 and t5 xor t1 xor t0) xor t4 and (t7 xor t5) xor t3 and t5 xor t0); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[28] + $C97C50DD; temp:= (t5 and (t6 and not t2 xor t3 and t4 xor t0 xor t7) xor t3 and (t6 xor t4) xor t2 and t4 xor t7); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[ 7] + $3F84D5B5; temp:= (t4 and (t5 and not t1 xor t2 and t3 xor t7 xor t6) xor t2 and (t5 xor t3) xor t1 and t3 xor t6); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[16] + $B5470917; temp:= (t3 and (t4 and not t0 xor t1 and t2 xor t6 xor t5) xor t1 and (t4 xor t2) xor t0 and t2 xor t5); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[ 0] + $9216D5D9; temp:= (t2 and (t3 and not t7 xor t0 and t1 xor t5 xor t4) xor t0 and (t3 xor t1) xor t7 and t1 xor t4); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[23] + $8979FB1B; temp:= (t1 and (t2 and not t6 xor t7 and t0 xor t4 xor t3) xor t7 and (t2 xor t0) xor t6 and t0 xor t3); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[20] + $D1310BA6; temp:= (t0 and (t1 and not t5 xor t6 and t7 xor t3 xor t2) xor t6 and (t1 xor t7) xor t5 and t7 xor t2); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[22] + $98DFB5AC; temp:= (t7 and (t0 and not t4 xor t5 and t6 xor t2 xor t1) xor t5 and (t0 xor t6) xor t4 and t6 xor t1); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[ 1] + $2FFD72DB; temp:= (t6 and (t7 and not t3 xor t4 and t5 xor t1 xor t0) xor t4 and (t7 xor t5) xor t3 and t5 xor t0); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[10] + $D01ADFB7; temp:= (t5 and (t6 and not t2 xor t3 and t4 xor t0 xor t7) xor t3 and (t6 xor t4) xor t2 and t4 xor t7); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[ 4] + $B8E1AFED; temp:= (t4 and (t5 and not t1 xor t2 and t3 xor t7 xor t6) xor t2 and (t5 xor t3) xor t1 and t3 xor t6); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[ 8] + $6A267E96; temp:= (t3 and (t4 and not t0 xor t1 and t2 xor t6 xor t5) xor t1 and (t4 xor t2) xor t0 and t2 xor t5); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[30] + $BA7C9045; temp:= (t2 and (t3 and not t7 xor t0 and t1 xor t5 xor t4) xor t0 and (t3 xor t1) xor t7 and t1 xor t4); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 3] + $F12C7F99; temp:= (t1 and (t2 and not t6 xor t7 and t0 xor t4 xor t3) xor t7 and (t2 xor t0) xor t6 and t0 xor t3); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[21] + $24A19947; temp:= (t0 and (t1 and not t5 xor t6 and t7 xor t3 xor t2) xor t6 and (t1 xor t7) xor t5 and t7 xor t2); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[ 9] + $B3916CF7; temp:= (t7 and (t0 and not t4 xor t5 and t6 xor t2 xor t1) xor t5 and (t0 xor t6) xor t4 and t6 xor t1); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[17] + $0801F2E2; temp:= (t6 and (t7 and not t3 xor t4 and t5 xor t1 xor t0) xor t4 and (t7 xor t5) xor t3 and t5 xor t0); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[24] + $858EFC16; temp:= (t5 and (t6 and not t2 xor t3 and t4 xor t0 xor t7) xor t3 and (t6 xor t4) xor t2 and t4 xor t7); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[29] + $636920D8; temp:= (t4 and (t5 and not t1 xor t2 and t3 xor t7 xor t6) xor t2 and (t5 xor t3) xor t1 and t3 xor t6); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[ 6] + $71574E69; temp:= (t3 and (t4 and not t0 xor t1 and t2 xor t6 xor t5) xor t1 and (t4 xor t2) xor t0 and t2 xor t5); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[19] + $A458FEA3; temp:= (t2 and (t3 and not t7 xor t0 and t1 xor t5 xor t4) xor t0 and (t3 xor t1) xor t7 and t1 xor t4); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[12] + $F4933D7E; temp:= (t1 and (t2 and not t6 xor t7 and t0 xor t4 xor t3) xor t7 and (t2 xor t0) xor t6 and t0 xor t3); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[15] + $0D95748F; temp:= (t0 and (t1 and not t5 xor t6 and t7 xor t3 xor t2) xor t6 and (t1 xor t7) xor t5 and t7 xor t2); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[13] + $728EB658; temp:= (t7 and (t0 and not t4 xor t5 and t6 xor t2 xor t1) xor t5 and (t0 xor t6) xor t4 and t6 xor t1); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[ 2] + $718BCD58; temp:= (t6 and (t7 and not t3 xor t4 and t5 xor t1 xor t0) xor t4 and (t7 xor t5) xor t3 and t5 xor t0); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[25] + $82154AEE; temp:= (t5 and (t6 and not t2 xor t3 and t4 xor t0 xor t7) xor t3 and (t6 xor t4) xor t2 and t4 xor t7); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[31] + $7B54A41D; temp:= (t4 and (t5 and not t1 xor t2 and t3 xor t7 xor t6) xor t2 and (t5 xor t3) xor t1 and t3 xor t6); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[27] + $C25A59B5; temp:= (t4 and (t1 and t3 xor t2 xor t5) xor t1 and t0 xor t3 and t6 xor t5); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[19] + $9C30D539; temp:= (t3 and (t0 and t2 xor t1 xor t4) xor t0 and t7 xor t2 and t5 xor t4); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 9] + $2AF26013; temp:= (t2 and (t7 and t1 xor t0 xor t3) xor t7 and t6 xor t1 and t4 xor t3); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[ 4] + $C5D1B023; temp:= (t1 and (t6 and t0 xor t7 xor t2) xor t6 and t5 xor t0 and t3 xor t2); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[20] + $286085F0; temp:= (t0 and (t5 and t7 xor t6 xor t1) xor t5 and t4 xor t7 and t2 xor t1); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[28] + $CA417918; temp:= (t7 and (t4 and t6 xor t5 xor t0) xor t4 and t3 xor t6 and t1 xor t0); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[17] + $B8DB38EF; temp:= (t6 and (t3 and t5 xor t4 xor t7) xor t3 and t2 xor t5 and t0 xor t7); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[ 8] + $8E79DCB0; temp:= (t5 and (t2 and t4 xor t3 xor t6) xor t2 and t1 xor t4 and t7 xor t6); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[22] + $603A180E; temp:= (t4 and (t1 and t3 xor t2 xor t5) xor t1 and t0 xor t3 and t6 xor t5); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[29] + $6C9E0E8B; temp:= (t3 and (t0 and t2 xor t1 xor t4) xor t0 and t7 xor t2 and t5 xor t4); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[14] + $B01E8A3E; temp:= (t2 and (t7 and t1 xor t0 xor t3) xor t7 and t6 xor t1 and t4 xor t3); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[25] + $D71577C1; temp:= (t1 and (t6 and t0 xor t7 xor t2) xor t6 and t5 xor t0 and t3 xor t2); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[12] + $BD314B27; temp:= (t0 and (t5 and t7 xor t6 xor t1) xor t5 and t4 xor t7 and t2 xor t1); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[24] + $78AF2FDA; temp:= (t7 and (t4 and t6 xor t5 xor t0) xor t4 and t3 xor t6 and t1 xor t0); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[30] + $55605C60; temp:= (t6 and (t3 and t5 xor t4 xor t7) xor t3 and t2 xor t5 and t0 xor t7); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[16] + $E65525F3; temp:= (t5 and (t2 and t4 xor t3 xor t6) xor t2 and t1 xor t4 and t7 xor t6); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[26] + $AA55AB94; temp:= (t4 and (t1 and t3 xor t2 xor t5) xor t1 and t0 xor t3 and t6 xor t5); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[31] + $57489862; temp:= (t3 and (t0 and t2 xor t1 xor t4) xor t0 and t7 xor t2 and t5 xor t4); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[15] + $63E81440; temp:= (t2 and (t7 and t1 xor t0 xor t3) xor t7 and t6 xor t1 and t4 xor t3); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[ 7] + $55CA396A; temp:= (t1 and (t6 and t0 xor t7 xor t2) xor t6 and t5 xor t0 and t3 xor t2); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[ 3] + $2AAB10B6; temp:= (t0 and (t5 and t7 xor t6 xor t1) xor t5 and t4 xor t7 and t2 xor t1); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[ 1] + $B4CC5C34; temp:= (t7 and (t4 and t6 xor t5 xor t0) xor t4 and t3 xor t6 and t1 xor t0); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[ 0] + $1141E8CE; temp:= (t6 and (t3 and t5 xor t4 xor t7) xor t3 and t2 xor t5 and t0 xor t7); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[18] + $A15486AF; temp:= (t5 and (t2 and t4 xor t3 xor t6) xor t2 and t1 xor t4 and t7 xor t6); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[27] + $7C72E993; temp:= (t4 and (t1 and t3 xor t2 xor t5) xor t1 and t0 xor t3 and t6 xor t5); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[13] + $B3EE1411; temp:= (t3 and (t0 and t2 xor t1 xor t4) xor t0 and t7 xor t2 and t5 xor t4); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 6] + $636FBC2A; temp:= (t2 and (t7 and t1 xor t0 xor t3) xor t7 and t6 xor t1 and t4 xor t3); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[21] + $2BA9C55D; temp:= (t1 and (t6 and t0 xor t7 xor t2) xor t6 and t5 xor t0 and t3 xor t2); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[10] + $741831F6; temp:= (t0 and (t5 and t7 xor t6 xor t1) xor t5 and t4 xor t7 and t2 xor t1); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[23] + $CE5C3E16; temp:= (t7 and (t4 and t6 xor t5 xor t0) xor t4 and t3 xor t6 and t1 xor t0); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[11] + $9B87931E; temp:= (t6 and (t3 and t5 xor t4 xor t7) xor t3 and t2 xor t5 and t0 xor t7); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[ 5] + $AFD6BA33; temp:= (t5 and (t2 and t4 xor t3 xor t6) xor t2 and t1 xor t4 and t7 xor t6); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[ 2] + $6C24CF5C; temp:= (t3 and (t5 and not t0 xor t2 and not t1 xor t4 xor t1 xor t6) xor t2 and (t4 and t0 xor t5 xor t1) xor t0 and t1 xor t6); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[24] + $7A325381; temp:= (t2 and (t4 and not t7 xor t1 and not t0 xor t3 xor t0 xor t5) xor t1 and (t3 and t7 xor t4 xor t0) xor t7 and t0 xor t5); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 4] + $28958677; temp:= (t1 and (t3 and not t6 xor t0 and not t7 xor t2 xor t7 xor t4) xor t0 and (t2 and t6 xor t3 xor t7) xor t6 and t7 xor t4); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[ 0] + $3B8F4898; temp:= (t0 and (t2 and not t5 xor t7 and not t6 xor t1 xor t6 xor t3) xor t7 and (t1 and t5 xor t2 xor t6) xor t5 and t6 xor t3); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[14] + $6B4BB9AF; temp:= (t7 and (t1 and not t4 xor t6 and not t5 xor t0 xor t5 xor t2) xor t6 and (t0 and t4 xor t1 xor t5) xor t4 and t5 xor t2); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[ 2] + $C4BFE81B; temp:= (t6 and (t0 and not t3 xor t5 and not t4 xor t7 xor t4 xor t1) xor t5 and (t7 and t3 xor t0 xor t4) xor t3 and t4 xor t1); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[ 7] + $66282193; temp:= (t5 and (t7 and not t2 xor t4 and not t3 xor t6 xor t3 xor t0) xor t4 and (t6 and t2 xor t7 xor t3) xor t2 and t3 xor t0); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[28] + $61D809CC; temp:= (t4 and (t6 and not t1 xor t3 and not t2 xor t5 xor t2 xor t7) xor t3 and (t5 and t1 xor t6 xor t2) xor t1 and t2 xor t7); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[23] + $FB21A991; temp:= (t3 and (t5 and not t0 xor t2 and not t1 xor t4 xor t1 xor t6) xor t2 and (t4 and t0 xor t5 xor t1) xor t0 and t1 xor t6); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[26] + $487CAC60; temp:= (t2 and (t4 and not t7 xor t1 and not t0 xor t3 xor t0 xor t5) xor t1 and (t3 and t7 xor t4 xor t0) xor t7 and t0 xor t5); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 6] + $5DEC8032; temp:= (t1 and (t3 and not t6 xor t0 and not t7 xor t2 xor t7 xor t4) xor t0 and (t2 and t6 xor t3 xor t7) xor t6 and t7 xor t4); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[30] + $EF845D5D; temp:= (t0 and (t2 and not t5 xor t7 and not t6 xor t1 xor t6 xor t3) xor t7 and (t1 and t5 xor t2 xor t6) xor t5 and t6 xor t3); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[20] + $E98575B1; temp:= (t7 and (t1 and not t4 xor t6 and not t5 xor t0 xor t5 xor t2) xor t6 and (t0 and t4 xor t1 xor t5) xor t4 and t5 xor t2); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[18] + $DC262302; temp:= (t6 and (t0 and not t3 xor t5 and not t4 xor t7 xor t4 xor t1) xor t5 and (t7 and t3 xor t0 xor t4) xor t3 and t4 xor t1); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[25] + $EB651B88; temp:= (t5 and (t7 and not t2 xor t4 and not t3 xor t6 xor t3 xor t0) xor t4 and (t6 and t2 xor t7 xor t3) xor t2 and t3 xor t0); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[19] + $23893E81; temp:= (t4 and (t6 and not t1 xor t3 and not t2 xor t5 xor t2 xor t7) xor t3 and (t5 and t1 xor t6 xor t2) xor t1 and t2 xor t7); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[ 3] + $D396ACC5; temp:= (t3 and (t5 and not t0 xor t2 and not t1 xor t4 xor t1 xor t6) xor t2 and (t4 and t0 xor t5 xor t1) xor t0 and t1 xor t6); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[22] + $0F6D6FF3; temp:= (t2 and (t4 and not t7 xor t1 and not t0 xor t3 xor t0 xor t5) xor t1 and (t3 and t7 xor t4 xor t0) xor t7 and t0 xor t5); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[11] + $83F44239; temp:= (t1 and (t3 and not t6 xor t0 and not t7 xor t2 xor t7 xor t4) xor t0 and (t2 and t6 xor t3 xor t7) xor t6 and t7 xor t4); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[31] + $2E0B4482; temp:= (t0 and (t2 and not t5 xor t7 and not t6 xor t1 xor t6 xor t3) xor t7 and (t1 and t5 xor t2 xor t6) xor t5 and t6 xor t3); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[21] + $A4842004; temp:= (t7 and (t1 and not t4 xor t6 and not t5 xor t0 xor t5 xor t2) xor t6 and (t0 and t4 xor t1 xor t5) xor t4 and t5 xor t2); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[ 8] + $69C8F04A; temp:= (t6 and (t0 and not t3 xor t5 and not t4 xor t7 xor t4 xor t1) xor t5 and (t7 and t3 xor t0 xor t4) xor t3 and t4 xor t1); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[27] + $9E1F9B5E; temp:= (t5 and (t7 and not t2 xor t4 and not t3 xor t6 xor t3 xor t0) xor t4 and (t6 and t2 xor t7 xor t3) xor t2 and t3 xor t0); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[12] + $21C66842; temp:= (t4 and (t6 and not t1 xor t3 and not t2 xor t5 xor t2 xor t7) xor t3 and (t5 and t1 xor t6 xor t2) xor t1 and t2 xor t7); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[ 9] + $F6E96C9A; temp:= (t3 and (t5 and not t0 xor t2 and not t1 xor t4 xor t1 xor t6) xor t2 and (t4 and t0 xor t5 xor t1) xor t0 and t1 xor t6); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[ 1] + $670C9C61; temp:= (t2 and (t4 and not t7 xor t1 and not t0 xor t3 xor t0 xor t5) xor t1 and (t3 and t7 xor t4 xor t0) xor t7 and t0 xor t5); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[29] + $ABD388F0; temp:= (t1 and (t3 and not t6 xor t0 and not t7 xor t2 xor t7 xor t4) xor t0 and (t2 and t6 xor t3 xor t7) xor t6 and t7 xor t4); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[ 5] + $6A51A0D2; temp:= (t0 and (t2 and not t5 xor t7 and not t6 xor t1 xor t6 xor t3) xor t7 and (t1 and t5 xor t2 xor t6) xor t5 and t6 xor t3); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[15] + $D8542F68; temp:= (t7 and (t1 and not t4 xor t6 and not t5 xor t0 xor t5 xor t2) xor t6 and (t0 and t4 xor t1 xor t5) xor t4 and t5 xor t2); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[17] + $960FA728; temp:= (t6 and (t0 and not t3 xor t5 and not t4 xor t7 xor t4 xor t1) xor t5 and (t7 and t3 xor t0 xor t4) xor t3 and t4 xor t1); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[10] + $AB5133A3; temp:= (t5 and (t7 and not t2 xor t4 and not t3 xor t6 xor t3 xor t0) xor t4 and (t6 and t2 xor t7 xor t3) xor t2 and t3 xor t0); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[16] + $6EEF0B6C; temp:= (t4 and (t6 and not t1 xor t3 and not t2 xor t5 xor t2 xor t7) xor t3 and (t5 and t1 xor t6 xor t2) xor t1 and t2 xor t7); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[13] + $137A3BE4; temp:= (t1 and (t3 and t4 and t6 xor not t5) xor t3 and t0 xor t4 and t5 xor t6 and t2); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[27] + $BA3BF050; temp:= (t0 and (t2 and t3 and t5 xor not t4) xor t2 and t7 xor t3 and t4 xor t5 and t1); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 3] + $7EFB2A98; temp:= (t7 and (t1 and t2 and t4 xor not t3) xor t1 and t6 xor t2 and t3 xor t4 and t0); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[21] + $A1F1651D; temp:= (t6 and (t0 and t1 and t3 xor not t2) xor t0 and t5 xor t1 and t2 xor t3 and t7); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[26] + $39AF0176; temp:= (t5 and (t7 and t0 and t2 xor not t1) xor t7 and t4 xor t0 and t1 xor t2 and t6); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[17] + $66CA593E; temp:= (t4 and (t6 and t7 and t1 xor not t0) xor t6 and t3 xor t7 and t0 xor t1 and t5); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[11] + $82430E88; temp:= (t3 and (t5 and t6 and t0 xor not t7) xor t5 and t2 xor t6 and t7 xor t0 and t4); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[20] + $8CEE8619; temp:= (t2 and (t4 and t5 and t7 xor not t6) xor t4 and t1 xor t5 and t6 xor t7 and t3); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[29] + $456F9FB4; temp:= (t1 and (t3 and t4 and t6 xor not t5) xor t3 and t0 xor t4 and t5 xor t6 and t2); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[19] + $7D84A5C3; temp:= (t0 and (t2 and t3 and t5 xor not t4) xor t2 and t7 xor t3 and t4 xor t5 and t1); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 0] + $3B8B5EBE; temp:= (t7 and (t1 and t2 and t4 xor not t3) xor t1 and t6 xor t2 and t3 xor t4 and t0); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[12] + $E06F75D8; temp:= (t6 and (t0 and t1 and t3 xor not t2) xor t0 and t5 xor t1 and t2 xor t3 and t7); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[ 7] + $85C12073; temp:= (t5 and (t7 and t0 and t2 xor not t1) xor t7 and t4 xor t0 and t1 xor t2 and t6); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[13] + $401A449F; temp:= (t4 and (t6 and t7 and t1 xor not t0) xor t6 and t3 xor t7 and t0 xor t1 and t5); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[ 8] + $56C16AA6; temp:= (t3 and (t5 and t6 and t0 xor not t7) xor t5 and t2 xor t6 and t7 xor t0 and t4); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[31] + $4ED3AA62; temp:= (t2 and (t4 and t5 and t7 xor not t6) xor t4 and t1 xor t5 and t6 xor t7 and t3); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[10] + $363F7706; temp:= (t1 and (t3 and t4 and t6 xor not t5) xor t3 and t0 xor t4 and t5 xor t6 and t2); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[ 5] + $1BFEDF72; temp:= (t0 and (t2 and t3 and t5 xor not t4) xor t2 and t7 xor t3 and t4 xor t5 and t1); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 9] + $429B023D; temp:= (t7 and (t1 and t2 and t4 xor not t3) xor t1 and t6 xor t2 and t3 xor t4 and t0); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[14] + $37D0D724; temp:= (t6 and (t0 and t1 and t3 xor not t2) xor t0 and t5 xor t1 and t2 xor t3 and t7); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[30] + $D00A1248; temp:= (t5 and (t7 and t0 and t2 xor not t1) xor t7 and t4 xor t0 and t1 xor t2 and t6); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[18] + $DB0FEAD3; temp:= (t4 and (t6 and t7 and t1 xor not t0) xor t6 and t3 xor t7 and t0 xor t1 and t5); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[ 6] + $49F1C09B; temp:= (t3 and (t5 and t6 and t0 xor not t7) xor t5 and t2 xor t6 and t7 xor t0 and t4); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[28] + $075372C9; temp:= (t2 and (t4 and t5 and t7 xor not t6) xor t4 and t1 xor t5 and t6 xor t7 and t3); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[24] + $80991B7B; temp:= (t1 and (t3 and t4 and t6 xor not t5) xor t3 and t0 xor t4 and t5 xor t6 and t2); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[ 2] + $25D479D8; temp:= (t0 and (t2 and t3 and t5 xor not t4) xor t2 and t7 xor t3 and t4 xor t5 and t1); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[23] + $F6E8DEF7; temp:= (t7 and (t1 and t2 and t4 xor not t3) xor t1 and t6 xor t2 and t3 xor t4 and t0); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[16] + $E3FE501A; temp:= (t6 and (t0 and t1 and t3 xor not t2) xor t0 and t5 xor t1 and t2 xor t3 and t7); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[22] + $B6794C3B; temp:= (t5 and (t7 and t0 and t2 xor not t1) xor t7 and t4 xor t0 and t1 xor t2 and t6); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[ 4] + $976CE0BD; temp:= (t4 and (t6 and t7 and t1 xor not t0) xor t6 and t3 xor t7 and t0 xor t1 and t5); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[ 1] + $04C006BA; temp:= (t3 and (t5 and t6 and t0 xor not t7) xor t5 and t2 xor t6 and t7 xor t0 and t4); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[25] + $C1A94FB6; temp:= (t2 and (t4 and t5 and t7 xor not t6) xor t4 and t1 xor t5 and t6 xor t7 and t3); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[15] + $409F60C4; doublecmd-0.5.8/components/dcpcrypt/Hashes/DCPtiger.inc0000644000175000017500000005522112014201074022066 0ustar alexxalexxconst t1: array[0..255] of int64= ( $02AAB17CF7E90C5E, $AC424B03E243A8EC, $72CD5BE30DD5FCD3, $6D019B93F6F97F3A, $CD9978FFD21F9193, $7573A1C9708029E2, $B164326B922A83C3, $46883EEE04915870, $EAACE3057103ECE6, $C54169B808A3535C, $4CE754918DDEC47C, $0AA2F4DFDC0DF40C, $10B76F18A74DBEFA, $C6CCB6235AD1AB6A, $13726121572FE2FF, $1A488C6F199D921E, $4BC9F9F4DA0007CA, $26F5E6F6E85241C7, $859079DBEA5947B6, $4F1885C5C99E8C92, $D78E761EA96F864B, $8E36428C52B5C17D, $69CF6827373063C1, $B607C93D9BB4C56E, $7D820E760E76B5EA, $645C9CC6F07FDC42, $BF38A078243342E0, $5F6B343C9D2E7D04, $F2C28AEB600B0EC6, $6C0ED85F7254BCAC, $71592281A4DB4FE5, $1967FA69CE0FED9F, $FD5293F8B96545DB, $C879E9D7F2A7600B, $860248920193194E, $A4F9533B2D9CC0B3, $9053836C15957613, $DB6DCF8AFC357BF1, $18BEEA7A7A370F57, $037117CA50B99066, $6AB30A9774424A35, $F4E92F02E325249B, $7739DB07061CCAE1, $D8F3B49CECA42A05, $BD56BE3F51382F73, $45FAED5843B0BB28, $1C813D5C11BF1F83, $8AF0E4B6D75FA169, $33EE18A487AD9999, $3C26E8EAB1C94410, $B510102BC0A822F9, $141EEF310CE6123B, $FC65B90059DDB154, $E0158640C5E0E607, $884E079826C3A3CF, $930D0D9523C535FD, $35638D754E9A2B00, $4085FCCF40469DD5, $C4B17AD28BE23A4C, $CAB2F0FC6A3E6A2E, $2860971A6B943FCD, $3DDE6EE212E30446, $6222F32AE01765AE, $5D550BB5478308FE, $A9EFA98DA0EDA22A, $C351A71686C40DA7, $1105586D9C867C84, $DCFFEE85FDA22853, $CCFBD0262C5EEF76, $BAF294CB8990D201, $E69464F52AFAD975, $94B013AFDF133E14, $06A7D1A32823C958, $6F95FE5130F61119, $D92AB34E462C06C0, $ED7BDE33887C71D2, $79746D6E6518393E, $5BA419385D713329, $7C1BA6B948A97564, $31987C197BFDAC67, $DE6C23C44B053D02, $581C49FED002D64D, $DD474D6338261571, $AA4546C3E473D062, $928FCE349455F860, $48161BBACAAB94D9, $63912430770E6F68, $6EC8A5E602C6641C, $87282515337DDD2B, $2CDA6B42034B701B, $B03D37C181CB096D, $E108438266C71C6F, $2B3180C7EB51B255, $DF92B82F96C08BBC, $5C68C8C0A632F3BA, $5504CC861C3D0556, $ABBFA4E55FB26B8F, $41848B0AB3BACEB4, $B334A273AA445D32, $BCA696F0A85AD881, $24F6EC65B528D56C, $0CE1512E90F4524A, $4E9DD79D5506D35A, $258905FAC6CE9779, $2019295B3E109B33, $F8A9478B73A054CC, $2924F2F934417EB0, $3993357D536D1BC4, $38A81AC21DB6FF8B, $47C4FBF17D6016BF, $1E0FAADD7667E3F5, $7ABCFF62938BEB96, $A78DAD948FC179C9, $8F1F98B72911E50D, $61E48EAE27121A91, $4D62F7AD31859808, $ECEBA345EF5CEAEB, $F5CEB25EBC9684CE, $F633E20CB7F76221, $A32CDF06AB8293E4, $985A202CA5EE2CA4, $CF0B8447CC8A8FB1, $9F765244979859A3, $A8D516B1A1240017, $0BD7BA3EBB5DC726, $E54BCA55B86ADB39, $1D7A3AFD6C478063, $519EC608E7669EDD, $0E5715A2D149AA23, $177D4571848FF194, $EEB55F3241014C22, $0F5E5CA13A6E2EC2, $8029927B75F5C361, $AD139FABC3D6E436, $0D5DF1A94CCF402F, $3E8BD948BEA5DFC8, $A5A0D357BD3FF77E, $A2D12E251F74F645, $66FD9E525E81A082, $2E0C90CE7F687A49, $C2E8BCBEBA973BC5, $000001BCE509745F, $423777BBE6DAB3D6, $D1661C7EAEF06EB5, $A1781F354DAACFD8, $2D11284A2B16AFFC, $F1FC4F67FA891D1F, $73ECC25DCB920ADA, $AE610C22C2A12651, $96E0A810D356B78A, $5A9A381F2FE7870F, $D5AD62EDE94E5530, $D225E5E8368D1427, $65977B70C7AF4631, $99F889B2DE39D74F, $233F30BF54E1D143, $9A9675D3D9A63C97, $5470554FF334F9A8, $166ACB744A4F5688, $70C74CAAB2E4AEAD, $F0D091646F294D12, $57B82A89684031D1, $EFD95A5A61BE0B6B, $2FBD12E969F2F29A, $9BD37013FEFF9FE8, $3F9B0404D6085A06, $4940C1F3166CFE15, $09542C4DCDF3DEFB, $B4C5218385CD5CE3, $C935B7DC4462A641, $3417F8A68ED3B63F, $B80959295B215B40, $F99CDAEF3B8C8572, $018C0614F8FCB95D, $1B14ACCD1A3ACDF3, $84D471F200BB732D, $C1A3110E95E8DA16, $430A7220BF1A82B8, $B77E090D39DF210E, $5EF4BD9F3CD05E9D, $9D4FF6DA7E57A444, $DA1D60E183D4A5F8, $B287C38417998E47, $FE3EDC121BB31886, $C7FE3CCC980CCBEF, $E46FB590189BFD03, $3732FD469A4C57DC, $7EF700A07CF1AD65, $59C64468A31D8859, $762FB0B4D45B61F6, $155BAED099047718, $68755E4C3D50BAA6, $E9214E7F22D8B4DF, $2ADDBF532EAC95F4, $32AE3909B4BD0109, $834DF537B08E3450, $FA209DA84220728D, $9E691D9B9EFE23F7, $0446D288C4AE8D7F, $7B4CC524E169785B, $21D87F0135CA1385, $CEBB400F137B8AA5, $272E2B66580796BE, $3612264125C2B0DE, $057702BDAD1EFBB2, $D4BABB8EACF84BE9, $91583139641BC67B, $8BDC2DE08036E024, $603C8156F49F68ED, $F7D236F7DBEF5111, $9727C4598AD21E80, $A08A0896670A5FD7, $CB4A8F4309EBA9CB, $81AF564B0F7036A1, $C0B99AA778199ABD, $959F1EC83FC8E952, $8C505077794A81B9, $3ACAAF8F056338F0, $07B43F50627A6778, $4A44AB49F5ECCC77, $3BC3D6E4B679EE98, $9CC0D4D1CF14108C, $4406C00B206BC8A0, $82A18854C8D72D89, $67E366B35C3C432C, $B923DD61102B37F2, $56AB2779D884271D, $BE83E1B0FF1525AF, $FB7C65D4217E49A9, $6BDBE0E76D48E7D4, $08DF828745D9179E, $22EA6A9ADD53BD34, $E36E141C5622200A, $7F805D1B8CB750EE, $AFE5C7A59F58E837, $E27F996A4FB1C23C, $D3867DFB0775F0D0, $D0E673DE6E88891A, $123AEB9EAFB86C25, $30F1D5D5C145B895, $BB434A2DEE7269E7, $78CB67ECF931FA38, $F33B0372323BBF9C, $52D66336FB279C74, $505F33AC0AFB4EAA, $E8A5CD99A2CCE187, $534974801E2D30BB, $8D2D5711D5876D90, $1F1A412891BC038E, $D6E2E71D82E56648, $74036C3A497732B7, $89B67ED96361F5AB, $FFED95D8F1EA02A2, $E72B3BD61464D43D, $A6300F170BDC4820, $EBC18760ED78A77A); t2: array[0..255] of int64= ( $E6A6BE5A05A12138, $B5A122A5B4F87C98, $563C6089140B6990, $4C46CB2E391F5DD5, $D932ADDBC9B79434, $08EA70E42015AFF5, $D765A6673E478CF1, $C4FB757EAB278D99, $DF11C6862D6E0692, $DDEB84F10D7F3B16, $6F2EF604A665EA04, $4A8E0F0FF0E0DFB3, $A5EDEEF83DBCBA51, $FC4F0A2A0EA4371E, $E83E1DA85CB38429, $DC8FF882BA1B1CE2, $CD45505E8353E80D, $18D19A00D4DB0717, $34A0CFEDA5F38101, $0BE77E518887CAF2, $1E341438B3C45136, $E05797F49089CCF9, $FFD23F9DF2591D14, $543DDA228595C5CD, $661F81FD99052A33, $8736E641DB0F7B76, $15227725418E5307, $E25F7F46162EB2FA, $48A8B2126C13D9FE, $AFDC541792E76EEA, $03D912BFC6D1898F, $31B1AAFA1B83F51B, $F1AC2796E42AB7D9, $40A3A7D7FCD2EBAC, $1056136D0AFBBCC5, $7889E1DD9A6D0C85, $D33525782A7974AA, $A7E25D09078AC09B, $BD4138B3EAC6EDD0, $920ABFBE71EB9E70, $A2A5D0F54FC2625C, $C054E36B0B1290A3, $F6DD59FF62FE932B, $3537354511A8AC7D, $CA845E9172FADCD4, $84F82B60329D20DC, $79C62CE1CD672F18, $8B09A2ADD124642C, $D0C1E96A19D9E726, $5A786A9B4BA9500C, $0E020336634C43F3, $C17B474AEB66D822, $6A731AE3EC9BAAC2, $8226667AE0840258, $67D4567691CAECA5, $1D94155C4875ADB5, $6D00FD985B813FDF, $51286EFCB774CD06, $5E8834471FA744AF, $F72CA0AEE761AE2E, $BE40E4CDAEE8E09A, $E9970BBB5118F665, $726E4BEB33DF1964, $703B000729199762, $4631D816F5EF30A7, $B880B5B51504A6BE, $641793C37ED84B6C, $7B21ED77F6E97D96, $776306312EF96B73, $AE528948E86FF3F4, $53DBD7F286A3F8F8, $16CADCE74CFC1063, $005C19BDFA52C6DD, $68868F5D64D46AD3, $3A9D512CCF1E186A, $367E62C2385660AE, $E359E7EA77DCB1D7, $526C0773749ABE6E, $735AE5F9D09F734B, $493FC7CC8A558BA8, $B0B9C1533041AB45, $321958BA470A59BD, $852DB00B5F46C393, $91209B2BD336B0E5, $6E604F7D659EF19F, $B99A8AE2782CCB24, $CCF52AB6C814C4C7, $4727D9AFBE11727B, $7E950D0C0121B34D, $756F435670AD471F, $F5ADD442615A6849, $4E87E09980B9957A, $2ACFA1DF50AEE355, $D898263AFD2FD556, $C8F4924DD80C8FD6, $CF99CA3D754A173A, $FE477BACAF91BF3C, $ED5371F6D690C12D, $831A5C285E687094, $C5D3C90A3708A0A4, $0F7F903717D06580, $19F9BB13B8FDF27F, $B1BD6F1B4D502843, $1C761BA38FFF4012, $0D1530C4E2E21F3B, $8943CE69A7372C8A, $E5184E11FEB5CE66, $618BDB80BD736621, $7D29BAD68B574D0B, $81BB613E25E6FE5B, $071C9C10BC07913F, $C7BEEB7909AC2D97, $C3E58D353BC5D757, $EB017892F38F61E8, $D4EFFB9C9B1CC21A, $99727D26F494F7AB, $A3E063A2956B3E03, $9D4A8B9A4AA09C30, $3F6AB7D500090FB4, $9CC0F2A057268AC0, $3DEE9D2DEDBF42D1, $330F49C87960A972, $C6B2720287421B41, $0AC59EC07C00369C, $EF4EAC49CB353425, $F450244EEF0129D8, $8ACC46E5CAF4DEB6, $2FFEAB63989263F7, $8F7CB9FE5D7A4578, $5BD8F7644E634635, $427A7315BF2DC900, $17D0C4AA2125261C, $3992486C93518E50, $B4CBFEE0A2D7D4C3, $7C75D6202C5DDD8D, $DBC295D8E35B6C61, $60B369D302032B19, $CE42685FDCE44132, $06F3DDB9DDF65610, $8EA4D21DB5E148F0, $20B0FCE62FCD496F, $2C1B912358B0EE31, $B28317B818F5A308, $A89C1E189CA6D2CF, $0C6B18576AAADBC8, $B65DEAA91299FAE3, $FB2B794B7F1027E7, $04E4317F443B5BEB, $4B852D325939D0A6, $D5AE6BEEFB207FFC, $309682B281C7D374, $BAE309A194C3B475, $8CC3F97B13B49F05, $98A9422FF8293967, $244B16B01076FF7C, $F8BF571C663D67EE, $1F0D6758EEE30DA1, $C9B611D97ADEB9B7, $B7AFD5887B6C57A2, $6290AE846B984FE1, $94DF4CDEACC1A5FD, $058A5BD1C5483AFF, $63166CC142BA3C37, $8DB8526EB2F76F40, $E10880036F0D6D4E, $9E0523C9971D311D, $45EC2824CC7CD691, $575B8359E62382C9, $FA9E400DC4889995, $D1823ECB45721568, $DAFD983B8206082F, $AA7D29082386A8CB, $269FCD4403B87588, $1B91F5F728BDD1E0, $E4669F39040201F6, $7A1D7C218CF04ADE, $65623C29D79CE5CE, $2368449096C00BB1, $AB9BF1879DA503BA, $BC23ECB1A458058E, $9A58DF01BB401ECC, $A070E868A85F143D, $4FF188307DF2239E, $14D565B41A641183, $EE13337452701602, $950E3DCF3F285E09, $59930254B9C80953, $3BF299408930DA6D, $A955943F53691387, $A15EDECAA9CB8784, $29142127352BE9A0, $76F0371FFF4E7AFB, $0239F450274F2228, $BB073AF01D5E868B, $BFC80571C10E96C1, $D267088568222E23, $9671A3D48E80B5B0, $55B5D38AE193BB81, $693AE2D0A18B04B8, $5C48B4ECADD5335F, $FD743B194916A1CA, $2577018134BE98C4, $E77987E83C54A4AD, $28E11014DA33E1B9, $270CC59E226AA213, $71495F756D1A5F60, $9BE853FB60AFEF77, $ADC786A7F7443DBF, $0904456173B29A82, $58BC7A66C232BD5E, $F306558C673AC8B2, $41F639C6B6C9772A, $216DEFE99FDA35DA, $11640CC71C7BE615, $93C43694565C5527, $EA038E6246777839, $F9ABF3CE5A3E2469, $741E768D0FD312D2, $0144B883CED652C6, $C20B5A5BA33F8552, $1AE69633C3435A9D, $97A28CA4088CFDEC, $8824A43C1E96F420, $37612FA66EEEA746, $6B4CB165F9CF0E5A, $43AA1C06A0ABFB4A, $7F4DC26FF162796B, $6CBACC8E54ED9B0F, $A6B7FFEFD2BB253E, $2E25BC95B0A29D4F, $86D6A58BDEF1388C, $DED74AC576B6F054, $8030BDBC2B45805D, $3C81AF70E94D9289, $3EFF6DDA9E3100DB, $B38DC39FDFCC8847, $123885528D17B87E, $F2DA0ED240B1B642, $44CEFADCD54BF9A9, $1312200E433C7EE6, $9FFCC84F3A78C748, $F0CD1F72248576BB, $EC6974053638CFE4, $2BA7B67C0CEC4E4C, $AC2F4DF3E5CE32ED, $CB33D14326EA4C11, $A4E9044CC77E58BC, $5F513293D934FCEF, $5DC9645506E55444, $50DE418F317DE40A, $388CB31A69DDE259, $2DB4A83455820A86, $9010A91E84711AE9, $4DF7F0B7B1498371, $D62A2EABC0977179, $22FAC097AA8D5C0E); t3: array[0..255] of int64= ( $F49FCC2FF1DAF39B, $487FD5C66FF29281, $E8A30667FCDCA83F, $2C9B4BE3D2FCCE63, $DA3FF74B93FBBBC2, $2FA165D2FE70BA66, $A103E279970E93D4, $BECDEC77B0E45E71, $CFB41E723985E497, $B70AAA025EF75017, $D42309F03840B8E0, $8EFC1AD035898579, $96C6920BE2B2ABC5, $66AF4163375A9172, $2174ABDCCA7127FB, $B33CCEA64A72FF41, $F04A4933083066A5, $8D970ACDD7289AF5, $8F96E8E031C8C25E, $F3FEC02276875D47, $EC7BF310056190DD, $F5ADB0AEBB0F1491, $9B50F8850FD58892, $4975488358B74DE8, $A3354FF691531C61, $0702BBE481D2C6EE, $89FB24057DEDED98, $AC3075138596E902, $1D2D3580172772ED, $EB738FC28E6BC30D, $5854EF8F63044326, $9E5C52325ADD3BBE, $90AA53CF325C4623, $C1D24D51349DD067, $2051CFEEA69EA624, $13220F0A862E7E4F, $CE39399404E04864, $D9C42CA47086FCB7, $685AD2238A03E7CC, $066484B2AB2FF1DB, $FE9D5D70EFBF79EC, $5B13B9DD9C481854, $15F0D475ED1509AD, $0BEBCD060EC79851, $D58C6791183AB7F8, $D1187C5052F3EEE4, $C95D1192E54E82FF, $86EEA14CB9AC6CA2, $3485BEB153677D5D, $DD191D781F8C492A, $F60866BAA784EBF9, $518F643BA2D08C74, $8852E956E1087C22, $A768CB8DC410AE8D, $38047726BFEC8E1A, $A67738B4CD3B45AA, $AD16691CEC0DDE19, $C6D4319380462E07, $C5A5876D0BA61938, $16B9FA1FA58FD840, $188AB1173CA74F18, $ABDA2F98C99C021F, $3E0580AB134AE816, $5F3B05B773645ABB, $2501A2BE5575F2F6, $1B2F74004E7E8BA9, $1CD7580371E8D953, $7F6ED89562764E30, $B15926FF596F003D, $9F65293DA8C5D6B9, $6ECEF04DD690F84C, $4782275FFF33AF88, $E41433083F820801, $FD0DFE409A1AF9B5, $4325A3342CDB396B, $8AE77E62B301B252, $C36F9E9F6655615A, $85455A2D92D32C09, $F2C7DEA949477485, $63CFB4C133A39EBA, $83B040CC6EBC5462, $3B9454C8FDB326B0, $56F56A9E87FFD78C, $2DC2940D99F42BC6, $98F7DF096B096E2D, $19A6E01E3AD852BF, $42A99CCBDBD4B40B, $A59998AF45E9C559, $366295E807D93186, $6B48181BFAA1F773, $1FEC57E2157A0A1D, $4667446AF6201AD5, $E615EBCACFB0F075, $B8F31F4F68290778, $22713ED6CE22D11E, $3057C1A72EC3C93B, $CB46ACC37C3F1F2F, $DBB893FD02AAF50E, $331FD92E600B9FCF, $A498F96148EA3AD6, $A8D8426E8B6A83EA, $A089B274B7735CDC, $87F6B3731E524A11, $118808E5CBC96749, $9906E4C7B19BD394, $AFED7F7E9B24A20C, $6509EADEEB3644A7, $6C1EF1D3E8EF0EDE, $B9C97D43E9798FB4, $A2F2D784740C28A3, $7B8496476197566F, $7A5BE3E6B65F069D, $F96330ED78BE6F10, $EEE60DE77A076A15, $2B4BEE4AA08B9BD0, $6A56A63EC7B8894E, $02121359BA34FEF4, $4CBF99F8283703FC, $398071350CAF30C8, $D0A77A89F017687A, $F1C1A9EB9E423569, $8C7976282DEE8199, $5D1737A5DD1F7ABD, $4F53433C09A9FA80, $FA8B0C53DF7CA1D9, $3FD9DCBC886CCB77, $C040917CA91B4720, $7DD00142F9D1DCDF, $8476FC1D4F387B58, $23F8E7C5F3316503, $032A2244E7E37339, $5C87A5D750F5A74B, $082B4CC43698992E, $DF917BECB858F63C, $3270B8FC5BF86DDA, $10AE72BB29B5DD76, $576AC94E7700362B, $1AD112DAC61EFB8F, $691BC30EC5FAA427, $FF246311CC327143, $3142368E30E53206, $71380E31E02CA396, $958D5C960AAD76F1, $F8D6F430C16DA536, $C8FFD13F1BE7E1D2, $7578AE66004DDBE1, $05833F01067BE646, $BB34B5AD3BFE586D, $095F34C9A12B97F0, $247AB64525D60CA8, $DCDBC6F3017477D1, $4A2E14D4DECAD24D, $BDB5E6D9BE0A1EEB, $2A7E70F7794301AB, $DEF42D8A270540FD, $01078EC0A34C22C1, $E5DE511AF4C16387, $7EBB3A52BD9A330A, $77697857AA7D6435, $004E831603AE4C32, $E7A21020AD78E312, $9D41A70C6AB420F2, $28E06C18EA1141E6, $D2B28CBD984F6B28, $26B75F6C446E9D83, $BA47568C4D418D7F, $D80BADBFE6183D8E, $0E206D7F5F166044, $E258A43911CBCA3E, $723A1746B21DC0BC, $C7CAA854F5D7CDD3, $7CAC32883D261D9C, $7690C26423BA942C, $17E55524478042B8, $E0BE477656A2389F, $4D289B5E67AB2DA0, $44862B9C8FBBFD31, $B47CC8049D141365, $822C1B362B91C793, $4EB14655FB13DFD8, $1ECBBA0714E2A97B, $6143459D5CDE5F14, $53A8FBF1D5F0AC89, $97EA04D81C5E5B00, $622181A8D4FDB3F3, $E9BCD341572A1208, $1411258643CCE58A, $9144C5FEA4C6E0A4, $0D33D06565CF620F, $54A48D489F219CA1, $C43E5EAC6D63C821, $A9728B3A72770DAF, $D7934E7B20DF87EF, $E35503B61A3E86E5, $CAE321FBC819D504, $129A50B3AC60BFA6, $CD5E68EA7E9FB6C3, $B01C90199483B1C7, $3DE93CD5C295376C, $AED52EDF2AB9AD13, $2E60F512C0A07884, $BC3D86A3E36210C9, $35269D9B163951CE, $0C7D6E2AD0CDB5FA, $59E86297D87F5733, $298EF221898DB0E7, $55000029D1A5AA7E, $8BC08AE1B5061B45, $C2C31C2B6C92703A, $94CC596BAF25EF42, $0A1D73DB22540456, $04B6A0F9D9C4179A, $EFFDAFA2AE3D3C60, $F7C8075BB49496C4, $9CC5C7141D1CD4E3, $78BD1638218E5534, $B2F11568F850246A, $EDFABCFA9502BC29, $796CE5F2DA23051B, $AAE128B0DC93537C, $3A493DA0EE4B29AE, $B5DF6B2C416895D7, $FCABBD25122D7F37, $70810B58105DC4B1, $E10FDD37F7882A90, $524DCAB5518A3F5C, $3C9E85878451255B, $4029828119BD34E2, $74A05B6F5D3CECCB, $B610021542E13ECA, $0FF979D12F59E2AC, $6037DA27E4F9CC50, $5E92975A0DF1847D, $D66DE190D3E623FE, $5032D6B87B568048, $9A36B7CE8235216E, $80272A7A24F64B4A, $93EFED8B8C6916F7, $37DDBFF44CCE1555, $4B95DB5D4B99BD25, $92D3FDA169812FC0, $FB1A4A9A90660BB6, $730C196946A4B9B2, $81E289AA7F49DA68, $64669A0F83B1A05F, $27B3FF7D9644F48B, $CC6B615C8DB675B3, $674F20B9BCEBBE95, $6F31238275655982, $5AE488713E45CF05, $BF619F9954C21157, $EABAC46040A8EAE9, $454C6FE9F2C0C1CD, $419CF6496412691C, $D3DC3BEF265B0F70, $6D0E60F5C3578A9E); t4: array[0..255] of int64= ( $5B0E608526323C55, $1A46C1A9FA1B59F5, $A9E245A17C4C8FFA, $65CA5159DB2955D7, $05DB0A76CE35AFC2, $81EAC77EA9113D45, $528EF88AB6AC0A0D, $A09EA253597BE3FF, $430DDFB3AC48CD56, $C4B3A67AF45CE46F, $4ECECFD8FBE2D05E, $3EF56F10B39935F0, $0B22D6829CD619C6, $17FD460A74DF2069, $6CF8CC8E8510ED40, $D6C824BF3A6ECAA7, $61243D581A817049, $048BACB6BBC163A2, $D9A38AC27D44CC32, $7FDDFF5BAAF410AB, $AD6D495AA804824B, $E1A6A74F2D8C9F94, $D4F7851235DEE8E3, $FD4B7F886540D893, $247C20042AA4BFDA, $096EA1C517D1327C, $D56966B4361A6685, $277DA5C31221057D, $94D59893A43ACFF7, $64F0C51CCDC02281, $3D33BCC4FF6189DB, $E005CB184CE66AF1, $FF5CCD1D1DB99BEA, $B0B854A7FE42980F, $7BD46A6A718D4B9F, $D10FA8CC22A5FD8C, $D31484952BE4BD31, $C7FA975FCB243847, $4886ED1E5846C407, $28CDDB791EB70B04, $C2B00BE2F573417F, $5C9590452180F877, $7A6BDDFFF370EB00, $CE509E38D6D9D6A4, $EBEB0F00647FA702, $1DCC06CF76606F06, $E4D9F28BA286FF0A, $D85A305DC918C262, $475B1D8732225F54, $2D4FB51668CCB5FE, $A679B9D9D72BBA20, $53841C0D912D43A5, $3B7EAA48BF12A4E8, $781E0E47F22F1DDF, $EFF20CE60AB50973, $20D261D19DFFB742, $16A12B03062A2E39, $1960EB2239650495, $251C16FED50EB8B8, $9AC0C330F826016E, $ED152665953E7671, $02D63194A6369570, $5074F08394B1C987, $70BA598C90B25CE1, $794A15810B9742F6, $0D5925E9FCAF8C6C, $3067716CD868744E, $910AB077E8D7731B, $6A61BBDB5AC42F61, $93513EFBF0851567, $F494724B9E83E9D5, $E887E1985C09648D, $34B1D3C675370CFD, $DC35E433BC0D255D, $D0AAB84234131BE0, $08042A50B48B7EAF, $9997C4EE44A3AB35, $829A7B49201799D0, $263B8307B7C54441, $752F95F4FD6A6CA6, $927217402C08C6E5, $2A8AB754A795D9EE, $A442F7552F72943D, $2C31334E19781208, $4FA98D7CEAEE6291, $55C3862F665DB309, $BD0610175D53B1F3, $46FE6CB840413F27, $3FE03792DF0CFA59, $CFE700372EB85E8F, $A7BE29E7ADBCE118, $E544EE5CDE8431DD, $8A781B1B41F1873E, $A5C94C78A0D2F0E7, $39412E2877B60728, $A1265EF3AFC9A62C, $BCC2770C6A2506C5, $3AB66DD5DCE1CE12, $E65499D04A675B37, $7D8F523481BFD216, $0F6F64FCEC15F389, $74EFBE618B5B13C8, $ACDC82B714273E1D, $DD40BFE003199D17, $37E99257E7E061F8, $FA52626904775AAA, $8BBBF63A463D56F9, $F0013F1543A26E64, $A8307E9F879EC898, $CC4C27A4150177CC, $1B432F2CCA1D3348, $DE1D1F8F9F6FA013, $606602A047A7DDD6, $D237AB64CC1CB2C7, $9B938E7225FCD1D3, $EC4E03708E0FF476, $FEB2FBDA3D03C12D, $AE0BCED2EE43889A, $22CB8923EBFB4F43, $69360D013CF7396D, $855E3602D2D4E022, $073805BAD01F784C, $33E17A133852F546, $DF4874058AC7B638, $BA92B29C678AA14A, $0CE89FC76CFAADCD, $5F9D4E0908339E34, $F1AFE9291F5923B9, $6E3480F60F4A265F, $EEBF3A2AB29B841C, $E21938A88F91B4AD, $57DFEFF845C6D3C3, $2F006B0BF62CAAF2, $62F479EF6F75EE78, $11A55AD41C8916A9, $F229D29084FED453, $42F1C27B16B000E6, $2B1F76749823C074, $4B76ECA3C2745360, $8C98F463B91691BD, $14BCC93CF1ADE66A, $8885213E6D458397, $8E177DF0274D4711, $B49B73B5503F2951, $10168168C3F96B6B, $0E3D963B63CAB0AE, $8DFC4B5655A1DB14, $F789F1356E14DE5C, $683E68AF4E51DAC1, $C9A84F9D8D4B0FD9, $3691E03F52A0F9D1, $5ED86E46E1878E80, $3C711A0E99D07150, $5A0865B20C4E9310, $56FBFC1FE4F0682E, $EA8D5DE3105EDF9B, $71ABFDB12379187A, $2EB99DE1BEE77B9C, $21ECC0EA33CF4523, $59A4D7521805C7A1, $3896F5EB56AE7C72, $AA638F3DB18F75DC, $9F39358DABE9808E, $B7DEFA91C00B72AC, $6B5541FD62492D92, $6DC6DEE8F92E4D5B, $353F57ABC4BEEA7E, $735769D6DA5690CE, $0A234AA642391484, $F6F9508028F80D9D, $B8E319A27AB3F215, $31AD9C1151341A4D, $773C22A57BEF5805, $45C7561A07968633, $F913DA9E249DBE36, $DA652D9B78A64C68, $4C27A97F3BC334EF, $76621220E66B17F4, $967743899ACD7D0B, $F3EE5BCAE0ED6782, $409F753600C879FC, $06D09A39B5926DB6, $6F83AEB0317AC588, $01E6CA4A86381F21, $66FF3462D19F3025, $72207C24DDFD3BFB, $4AF6B6D3E2ECE2EB, $9C994DBEC7EA08DE, $49ACE597B09A8BC4, $B38C4766CF0797BA, $131B9373C57C2A75, $B1822CCE61931E58, $9D7555B909BA1C0C, $127FAFDD937D11D2, $29DA3BADC66D92E4, $A2C1D57154C2ECBC, $58C5134D82F6FE24, $1C3AE3515B62274F, $E907C82E01CB8126, $F8ED091913E37FCB, $3249D8F9C80046C9, $80CF9BEDE388FB63, $1881539A116CF19E, $5103F3F76BD52457, $15B7E6F5AE47F7A8, $DBD7C6DED47E9CCF, $44E55C410228BB1A, $B647D4255EDB4E99, $5D11882BB8AAFC30, $F5098BBB29D3212A, $8FB5EA14E90296B3, $677B942157DD025A, $FB58E7C0A390ACB5, $89D3674C83BD4A01, $9E2DA4DF4BF3B93B, $FCC41E328CAB4829, $03F38C96BA582C52, $CAD1BDBD7FD85DB2, $BBB442C16082AE83, $B95FE86BA5DA9AB0, $B22E04673771A93F, $845358C9493152D8, $BE2A488697B4541E, $95A2DC2DD38E6966, $C02C11AC923C852B, $2388B1990DF2A87B, $7C8008FA1B4F37BE, $1F70D0C84D54E503, $5490ADEC7ECE57D4, $002B3C27D9063A3A, $7EAEA3848030A2BF, $C602326DED2003C0, $83A7287D69A94086, $C57A5FCB30F57A8A, $B56844E479EBE779, $A373B40F05DCBCE9, $D71A786E88570EE2, $879CBACDBDE8F6A0, $976AD1BCC164A32F, $AB21E25E9666D78B, $901063AAE5E5C33C, $9818B34448698D90, $E36487AE3E1E8ABB, $AFBDF931893BDCB4, $6345A0DC5FBBD519, $8628FE269B9465CA, $1E5D01603F9C51EC, $4DE44006A15049B7, $BF6C70E5F776CBB1, $411218F2EF552BED, $CB0C0708705A36A3, $E74D14754F986044, $CD56D9430EA8280E, $C12591D7535F5065, $C83223F1720AEF96, $C3A0396F7363A51F); doublecmd-0.5.8/components/dcpcrypt/Hashes/DCPhaval3.inc0000644000175000017500000003731312014201074022134 0ustar alexxalexxtemp:= (t2 and (t4 xor t3) xor t6 and t0 xor t5 and t1 xor t4); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[ 0]; temp:= (t1 and (t3 xor t2) xor t5 and t7 xor t4 and t0 xor t3); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 1]; temp:= (t0 and (t2 xor t1) xor t4 and t6 xor t3 and t7 xor t2); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[ 2]; temp:= (t7 and (t1 xor t0) xor t3 and t5 xor t2 and t6 xor t1); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[ 3]; temp:= (t6 and (t0 xor t7) xor t2 and t4 xor t1 and t5 xor t0); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[ 4]; temp:= (t5 and (t7 xor t6) xor t1 and t3 xor t0 and t4 xor t7); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[ 5]; temp:= (t4 and (t6 xor t5) xor t0 and t2 xor t7 and t3 xor t6); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[ 6]; temp:= (t3 and (t5 xor t4) xor t7 and t1 xor t6 and t2 xor t5); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[ 7]; temp:= (t2 and (t4 xor t3) xor t6 and t0 xor t5 and t1 xor t4); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[ 8]; temp:= (t1 and (t3 xor t2) xor t5 and t7 xor t4 and t0 xor t3); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 9]; temp:= (t0 and (t2 xor t1) xor t4 and t6 xor t3 and t7 xor t2); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[10]; temp:= (t7 and (t1 xor t0) xor t3 and t5 xor t2 and t6 xor t1); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[11]; temp:= (t6 and (t0 xor t7) xor t2 and t4 xor t1 and t5 xor t0); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[12]; temp:= (t5 and (t7 xor t6) xor t1 and t3 xor t0 and t4 xor t7); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[13]; temp:= (t4 and (t6 xor t5) xor t0 and t2 xor t7 and t3 xor t6); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[14]; temp:= (t3 and (t5 xor t4) xor t7 and t1 xor t6 and t2 xor t5); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[15]; temp:= (t2 and (t4 xor t3) xor t6 and t0 xor t5 and t1 xor t4); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[16]; temp:= (t1 and (t3 xor t2) xor t5 and t7 xor t4 and t0 xor t3); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[17]; temp:= (t0 and (t2 xor t1) xor t4 and t6 xor t3 and t7 xor t2); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[18]; temp:= (t7 and (t1 xor t0) xor t3 and t5 xor t2 and t6 xor t1); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[19]; temp:= (t6 and (t0 xor t7) xor t2 and t4 xor t1 and t5 xor t0); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[20]; temp:= (t5 and (t7 xor t6) xor t1 and t3 xor t0 and t4 xor t7); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[21]; temp:= (t4 and (t6 xor t5) xor t0 and t2 xor t7 and t3 xor t6); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[22]; temp:= (t3 and (t5 xor t4) xor t7 and t1 xor t6 and t2 xor t5); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[23]; temp:= (t2 and (t4 xor t3) xor t6 and t0 xor t5 and t1 xor t4); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[24]; temp:= (t1 and (t3 xor t2) xor t5 and t7 xor t4 and t0 xor t3); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[25]; temp:= (t0 and (t2 xor t1) xor t4 and t6 xor t3 and t7 xor t2); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[26]; temp:= (t7 and (t1 xor t0) xor t3 and t5 xor t2 and t6 xor t1); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[27]; temp:= (t6 and (t0 xor t7) xor t2 and t4 xor t1 and t5 xor t0); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[28]; temp:= (t5 and (t7 xor t6) xor t1 and t3 xor t0 and t4 xor t7); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[29]; temp:= (t4 and (t6 xor t5) xor t0 and t2 xor t7 and t3 xor t6); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[30]; temp:= (t3 and (t5 xor t4) xor t7 and t1 xor t6 and t2 xor t5); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[31]; temp:= (t5 and (t3 and not t0 xor t1 and t2 xor t4 xor t6) xor t1 and (t3 xor t2) xor t0 and t2 xor t6); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[ 5] + $452821E6; temp:= (t4 and (t2 and not t7 xor t0 and t1 xor t3 xor t5) xor t0 and (t2 xor t1) xor t7 and t1 xor t5); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[14] + $38D01377; temp:= (t3 and (t1 and not t6 xor t7 and t0 xor t2 xor t4) xor t7 and (t1 xor t0) xor t6 and t0 xor t4); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[26] + $BE5466CF; temp:= (t2 and (t0 and not t5 xor t6 and t7 xor t1 xor t3) xor t6 and (t0 xor t7) xor t5 and t7 xor t3); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[18] + $34E90C6C; temp:= (t1 and (t7 and not t4 xor t5 and t6 xor t0 xor t2) xor t5 and (t7 xor t6) xor t4 and t6 xor t2); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[11] + $C0AC29B7; temp:= (t0 and (t6 and not t3 xor t4 and t5 xor t7 xor t1) xor t4 and (t6 xor t5) xor t3 and t5 xor t1); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[28] + $C97C50DD; temp:= (t7 and (t5 and not t2 xor t3 and t4 xor t6 xor t0) xor t3 and (t5 xor t4) xor t2 and t4 xor t0); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[ 7] + $3F84D5B5; temp:= (t6 and (t4 and not t1 xor t2 and t3 xor t5 xor t7) xor t2 and (t4 xor t3) xor t1 and t3 xor t7); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[16] + $B5470917; temp:= (t5 and (t3 and not t0 xor t1 and t2 xor t4 xor t6) xor t1 and (t3 xor t2) xor t0 and t2 xor t6); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[ 0] + $9216D5D9; temp:= (t4 and (t2 and not t7 xor t0 and t1 xor t3 xor t5) xor t0 and (t2 xor t1) xor t7 and t1 xor t5); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[23] + $8979FB1B; temp:= (t3 and (t1 and not t6 xor t7 and t0 xor t2 xor t4) xor t7 and (t1 xor t0) xor t6 and t0 xor t4); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[20] + $D1310BA6; temp:= (t2 and (t0 and not t5 xor t6 and t7 xor t1 xor t3) xor t6 and (t0 xor t7) xor t5 and t7 xor t3); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[22] + $98DFB5AC; temp:= (t1 and (t7 and not t4 xor t5 and t6 xor t0 xor t2) xor t5 and (t7 xor t6) xor t4 and t6 xor t2); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[ 1] + $2FFD72DB; temp:= (t0 and (t6 and not t3 xor t4 and t5 xor t7 xor t1) xor t4 and (t6 xor t5) xor t3 and t5 xor t1); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[10] + $D01ADFB7; temp:= (t7 and (t5 and not t2 xor t3 and t4 xor t6 xor t0) xor t3 and (t5 xor t4) xor t2 and t4 xor t0); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[ 4] + $B8E1AFED; temp:= (t6 and (t4 and not t1 xor t2 and t3 xor t5 xor t7) xor t2 and (t4 xor t3) xor t1 and t3 xor t7); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[ 8] + $6A267E96; temp:= (t5 and (t3 and not t0 xor t1 and t2 xor t4 xor t6) xor t1 and (t3 xor t2) xor t0 and t2 xor t6); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[30] + $BA7C9045; temp:= (t4 and (t2 and not t7 xor t0 and t1 xor t3 xor t5) xor t0 and (t2 xor t1) xor t7 and t1 xor t5); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 3] + $F12C7F99; temp:= (t3 and (t1 and not t6 xor t7 and t0 xor t2 xor t4) xor t7 and (t1 xor t0) xor t6 and t0 xor t4); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[21] + $24A19947; temp:= (t2 and (t0 and not t5 xor t6 and t7 xor t1 xor t3) xor t6 and (t0 xor t7) xor t5 and t7 xor t3); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[ 9] + $B3916CF7; temp:= (t1 and (t7 and not t4 xor t5 and t6 xor t0 xor t2) xor t5 and (t7 xor t6) xor t4 and t6 xor t2); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[17] + $0801F2E2; temp:= (t0 and (t6 and not t3 xor t4 and t5 xor t7 xor t1) xor t4 and (t6 xor t5) xor t3 and t5 xor t1); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[24] + $858EFC16; temp:= (t7 and (t5 and not t2 xor t3 and t4 xor t6 xor t0) xor t3 and (t5 xor t4) xor t2 and t4 xor t0); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[29] + $636920D8; temp:= (t6 and (t4 and not t1 xor t2 and t3 xor t5 xor t7) xor t2 and (t4 xor t3) xor t1 and t3 xor t7); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[ 6] + $71574E69; temp:= (t5 and (t3 and not t0 xor t1 and t2 xor t4 xor t6) xor t1 and (t3 xor t2) xor t0 and t2 xor t6); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[19] + $A458FEA3; temp:= (t4 and (t2 and not t7 xor t0 and t1 xor t3 xor t5) xor t0 and (t2 xor t1) xor t7 and t1 xor t5); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[12] + $F4933D7E; temp:= (t3 and (t1 and not t6 xor t7 and t0 xor t2 xor t4) xor t7 and (t1 xor t0) xor t6 and t0 xor t4); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[15] + $0D95748F; temp:= (t2 and (t0 and not t5 xor t6 and t7 xor t1 xor t3) xor t6 and (t0 xor t7) xor t5 and t7 xor t3); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[13] + $728EB658; temp:= (t1 and (t7 and not t4 xor t5 and t6 xor t0 xor t2) xor t5 and (t7 xor t6) xor t4 and t6 xor t2); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[ 2] + $718BCD58; temp:= (t0 and (t6 and not t3 xor t4 and t5 xor t7 xor t1) xor t4 and (t6 xor t5) xor t3 and t5 xor t1); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[25] + $82154AEE; temp:= (t7 and (t5 and not t2 xor t3 and t4 xor t6 xor t0) xor t3 and (t5 xor t4) xor t2 and t4 xor t0); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[31] + $7B54A41D; temp:= (t6 and (t4 and not t1 xor t2 and t3 xor t5 xor t7) xor t2 and (t4 xor t3) xor t1 and t3 xor t7); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[27] + $C25A59B5; temp:= (t3 and (t5 and t4 xor t6 xor t0) xor t5 and t2 xor t4 and t1 xor t0); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[19] + $9C30D539; temp:= (t2 and (t4 and t3 xor t5 xor t7) xor t4 and t1 xor t3 and t0 xor t7); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 9] + $2AF26013; temp:= (t1 and (t3 and t2 xor t4 xor t6) xor t3 and t0 xor t2 and t7 xor t6); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[ 4] + $C5D1B023; temp:= (t0 and (t2 and t1 xor t3 xor t5) xor t2 and t7 xor t1 and t6 xor t5); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[20] + $286085F0; temp:= (t7 and (t1 and t0 xor t2 xor t4) xor t1 and t6 xor t0 and t5 xor t4); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[28] + $CA417918; temp:= (t6 and (t0 and t7 xor t1 xor t3) xor t0 and t5 xor t7 and t4 xor t3); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[17] + $B8DB38EF; temp:= (t5 and (t7 and t6 xor t0 xor t2) xor t7 and t4 xor t6 and t3 xor t2); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[ 8] + $8E79DCB0; temp:= (t4 and (t6 and t5 xor t7 xor t1) xor t6 and t3 xor t5 and t2 xor t1); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[22] + $603A180E; temp:= (t3 and (t5 and t4 xor t6 xor t0) xor t5 and t2 xor t4 and t1 xor t0); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[29] + $6C9E0E8B; temp:= (t2 and (t4 and t3 xor t5 xor t7) xor t4 and t1 xor t3 and t0 xor t7); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[14] + $B01E8A3E; temp:= (t1 and (t3 and t2 xor t4 xor t6) xor t3 and t0 xor t2 and t7 xor t6); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[25] + $D71577C1; temp:= (t0 and (t2 and t1 xor t3 xor t5) xor t2 and t7 xor t1 and t6 xor t5); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[12] + $BD314B27; temp:= (t7 and (t1 and t0 xor t2 xor t4) xor t1 and t6 xor t0 and t5 xor t4); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[24] + $78AF2FDA; temp:= (t6 and (t0 and t7 xor t1 xor t3) xor t0 and t5 xor t7 and t4 xor t3); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[30] + $55605C60; temp:= (t5 and (t7 and t6 xor t0 xor t2) xor t7 and t4 xor t6 and t3 xor t2); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[16] + $E65525F3; temp:= (t4 and (t6 and t5 xor t7 xor t1) xor t6 and t3 xor t5 and t2 xor t1); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[26] + $AA55AB94; temp:= (t3 and (t5 and t4 xor t6 xor t0) xor t5 and t2 xor t4 and t1 xor t0); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[31] + $57489862; temp:= (t2 and (t4 and t3 xor t5 xor t7) xor t4 and t1 xor t3 and t0 xor t7); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[15] + $63E81440; temp:= (t1 and (t3 and t2 xor t4 xor t6) xor t3 and t0 xor t2 and t7 xor t6); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[ 7] + $55CA396A; temp:= (t0 and (t2 and t1 xor t3 xor t5) xor t2 and t7 xor t1 and t6 xor t5); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[ 3] + $2AAB10B6; temp:= (t7 and (t1 and t0 xor t2 xor t4) xor t1 and t6 xor t0 and t5 xor t4); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[ 1] + $B4CC5C34; temp:= (t6 and (t0 and t7 xor t1 xor t3) xor t0 and t5 xor t7 and t4 xor t3); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[ 0] + $1141E8CE; temp:= (t5 and (t7 and t6 xor t0 xor t2) xor t7 and t4 xor t6 and t3 xor t2); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[18] + $A15486AF; temp:= (t4 and (t6 and t5 xor t7 xor t1) xor t6 and t3 xor t5 and t2 xor t1); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[27] + $7C72E993; temp:= (t3 and (t5 and t4 xor t6 xor t0) xor t5 and t2 xor t4 and t1 xor t0); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[13] + $B3EE1411; temp:= (t2 and (t4 and t3 xor t5 xor t7) xor t4 and t1 xor t3 and t0 xor t7); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 6] + $636FBC2A; temp:= (t1 and (t3 and t2 xor t4 xor t6) xor t3 and t0 xor t2 and t7 xor t6); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[21] + $2BA9C55D; temp:= (t0 and (t2 and t1 xor t3 xor t5) xor t2 and t7 xor t1 and t6 xor t5); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[10] + $741831F6; temp:= (t7 and (t1 and t0 xor t2 xor t4) xor t1 and t6 xor t0 and t5 xor t4); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[23] + $CE5C3E16; temp:= (t6 and (t0 and t7 xor t1 xor t3) xor t0 and t5 xor t7 and t4 xor t3); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[11] + $9B87931E; temp:= (t5 and (t7 and t6 xor t0 xor t2) xor t7 and t4 xor t6 and t3 xor t2); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[ 5] + $AFD6BA33; temp:= (t4 and (t6 and t5 xor t7 xor t1) xor t6 and t3 xor t5 and t2 xor t1); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[ 2] + $6C24CF5C; doublecmd-0.5.8/components/dcpcrypt/Hashes/dcpripemd160.pas0000644000175000017500000007345012014201074022641 0ustar alexxalexx{******************************************************************************} {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********} {******************************************************************************} {* A binary compatible implementation of RipeMD-160 ***************************} {******************************************************************************} {* Copyright (c) 1999-2002 David Barton *} {* Permission is hereby granted, free of charge, to any person obtaining a *} {* copy of this software and associated documentation files (the "Software"), *} {* to deal in the Software without restriction, including without limitation *} {* the rights to use, copy, modify, merge, publish, distribute, sublicense, *} {* and/or sell copies of the Software, and to permit persons to whom the *} {* Software is furnished to do so, subject to the following conditions: *} {* *} {* The above copyright notice and this permission notice shall be included in *} {* all copies or substantial portions of the Software. *} {* *} {* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *} {* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *} {* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *} {* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *} {* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *} {* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *} {* DEALINGS IN THE SOFTWARE. *} {******************************************************************************} unit DCPripemd160; {$MODE Delphi} interface uses Classes, Sysutils, DCPcrypt2, DCPconst; type TDCP_ripemd160= class(TDCP_hash) protected LenHi, LenLo: longword; Index: DWord; CurrentHash: array[0..4] of DWord; HashBuffer: array[0..63] of byte; procedure Compress; public class function GetId: integer; override; class function GetAlgorithm: string; override; class function GetHashSize: integer; override; class function SelfTest: boolean; override; procedure Init; override; procedure Burn; override; procedure Update(const Buffer; Size: longword); override; procedure Final(var Digest); override; end; {******************************************************************************} {******************************************************************************} implementation {$R-}{$Q-} procedure TDCP_ripemd160.Compress; var aa, bb, cc, dd, ee, aaa, bbb, ccc, ddd, eee: DWord; X: array[0..15] of DWord; begin dcpFillChar(X, SizeOf(X), 0); Move(HashBuffer,X,Sizeof(X)); aa:= CurrentHash[0]; aaa:= CurrentHash[0]; bb:= CurrentHash[1]; bbb:= CurrentHash[1]; cc:= CurrentHash[2]; ccc:= CurrentHash[2]; dd:= CurrentHash[3]; ddd:= CurrentHash[3]; ee:= CurrentHash[4]; eee:= CurrentHash[4]; aa:= aa + (bb xor cc xor dd) + X[ 0]; aa:= ((aa shl 11) or (aa shr (32-11))) + ee; cc:= ((cc shl 10) or (cc shr (32-10))); ee:= ee + (aa xor bb xor cc) + X[ 1]; ee:= ((ee shl 14) or (ee shr (32-14))) + dd; bb:= ((bb shl 10) or (bb shr (32-10))); dd:= dd + (ee xor aa xor bb) + X[ 2]; dd:= ((dd shl 15) or (dd shr (32-15))) + cc; aa:= ((aa shl 10) or (aa shr (32-10))); cc:= cc + (dd xor ee xor aa) + X[ 3]; cc:= ((cc shl 12) or (cc shr (32-12))) + bb; ee:= ((ee shl 10) or (ee shr (32-10))); bb:= bb + (cc xor dd xor ee) + X[ 4]; bb:= ((bb shl 5) or (bb shr (32-5))) + aa; dd:= ((dd shl 10) or (dd shr (32-10))); aa:= aa + (bb xor cc xor dd) + X[ 5]; aa:= ((aa shl 8) or (aa shr (32-8))) + ee; cc:= ((cc shl 10) or (cc shr (32-10))); ee:= ee + (aa xor bb xor cc) + X[ 6]; ee:= ((ee shl 7) or (ee shr (32-7))) + dd; bb:= ((bb shl 10) or (bb shr (32-10))); dd:= dd + (ee xor aa xor bb) + X[ 7]; dd:= ((dd shl 9) or (dd shr (32-9))) + cc; aa:= ((aa shl 10) or (aa shr (32-10))); cc:= cc + (dd xor ee xor aa) + X[ 8]; cc:= ((cc shl 11) or (cc shr (32-11))) + bb; ee:= ((ee shl 10) or (ee shr (32-10))); bb:= bb + (cc xor dd xor ee) + X[ 9]; bb:= ((bb shl 13) or (bb shr (32-13))) + aa; dd:= ((dd shl 10) or (dd shr (32-10))); aa:= aa + (bb xor cc xor dd) + X[10]; aa:= ((aa shl 14) or (aa shr (32-14))) + ee; cc:= ((cc shl 10) or (cc shr (32-10))); ee:= ee + (aa xor bb xor cc) + X[11]; ee:= ((ee shl 15) or (ee shr (32-15))) + dd; bb:= ((bb shl 10) or (bb shr (32-10))); dd:= dd + (ee xor aa xor bb) + X[12]; dd:= ((dd shl 6) or (dd shr (32-6))) + cc; aa:= ((aa shl 10) or (aa shr (32-10))); cc:= cc + (dd xor ee xor aa) + X[13]; cc:= ((cc shl 7) or (cc shr (32-7))) + bb; ee:= ((ee shl 10) or (ee shr (32-10))); bb:= bb + (cc xor dd xor ee) + X[14]; bb:= ((bb shl 9) or (bb shr (32-9))) + aa; dd:= ((dd shl 10) or (dd shr (32-10))); aa:= aa + (bb xor cc xor dd) + X[15]; aa:= ((aa shl 8) or (aa shr (32-8))) + ee; cc:= ((cc shl 10) or (cc shr (32-10))); ee:= ee + ((aa and bb) or ((not aa) and cc)) + X[ 7] + $5a827999; ee:= ((ee shl 7) or (ee shr (32-7))) + dd; bb:= ((bb shl 10) or (bb shr (32-10))); dd:= dd + ((ee and aa) or ((not ee) and bb)) + X[ 4] + $5a827999; dd:= ((dd shl 6) or (dd shr (32-6))) + cc; aa:= ((aa shl 10) or (aa shr (32-10))); cc:= cc + ((dd and ee) or ((not dd) and aa)) + X[13] + $5a827999; cc:= ((cc shl 8) or (cc shr (32-8))) + bb; ee:= ((ee shl 10) or (ee shr (32-10))); bb:= bb + ((cc and dd) or ((not cc) and ee)) + X[ 1] + $5a827999; bb:= ((bb shl 13) or (bb shr (32-13))) + aa; dd:= ((dd shl 10) or (dd shr (32-10))); aa:= aa + ((bb and cc) or ((not bb) and dd)) + X[10] + $5a827999; aa:= ((aa shl 11) or (aa shr (32-11))) + ee; cc:= ((cc shl 10) or (cc shr (32-10))); ee:= ee + ((aa and bb) or ((not aa) and cc)) + X[ 6] + $5a827999; ee:= ((ee shl 9) or (ee shr (32-9))) + dd; bb:= ((bb shl 10) or (bb shr (32-10))); dd:= dd + ((ee and aa) or ((not ee) and bb)) + X[15] + $5a827999; dd:= ((dd shl 7) or (dd shr (32-7))) + cc; aa:= ((aa shl 10) or (aa shr (32-10))); cc:= cc + ((dd and ee) or ((not dd) and aa)) + X[ 3] + $5a827999; cc:= ((cc shl 15) or (cc shr (32-15))) + bb; ee:= ((ee shl 10) or (ee shr (32-10))); bb:= bb + ((cc and dd) or ((not cc) and ee)) + X[12] + $5a827999; bb:= ((bb shl 7) or (bb shr (32-7))) + aa; dd:= ((dd shl 10) or (dd shr (32-10))); aa:= aa + ((bb and cc) or ((not bb) and dd)) + X[ 0] + $5a827999; aa:= ((aa shl 12) or (aa shr (32-12))) + ee; cc:= ((cc shl 10) or (cc shr (32-10))); ee:= ee + ((aa and bb) or ((not aa) and cc)) + X[ 9] + $5a827999; ee:= ((ee shl 15) or (ee shr (32-15))) + dd; bb:= ((bb shl 10) or (bb shr (32-10))); dd:= dd + ((ee and aa) or ((not ee) and bb)) + X[ 5] + $5a827999; dd:= ((dd shl 9) or (dd shr (32-9))) + cc; aa:= ((aa shl 10) or (aa shr (32-10))); cc:= cc + ((dd and ee) or ((not dd) and aa)) + X[ 2] + $5a827999; cc:= ((cc shl 11) or (cc shr (32-11))) + bb; ee:= ((ee shl 10) or (ee shr (32-10))); bb:= bb + ((cc and dd) or ((not cc) and ee)) + X[14] + $5a827999; bb:= ((bb shl 7) or (bb shr (32-7))) + aa; dd:= ((dd shl 10) or (dd shr (32-10))); aa:= aa + ((bb and cc) or ((not bb) and dd)) + X[11] + $5a827999; aa:= ((aa shl 13) or (aa shr (32-13))) + ee; cc:= ((cc shl 10) or (cc shr (32-10))); ee:= ee + ((aa and bb) or ((not aa) and cc)) + X[ 8] + $5a827999; ee:= ((ee shl 12) or (ee shr (32-12))) + dd; bb:= ((bb shl 10) or (bb shr (32-10))); dd:= dd + ((ee or (not aa)) xor bb) + X[ 3] + $6ed9eba1; dd:= ((dd shl 11) or (dd shr (32-11))) + cc; aa:= ((aa shl 10) or (aa shr (32-10))); cc:= cc + ((dd or (not ee)) xor aa) + X[10] + $6ed9eba1; cc:= ((cc shl 13) or (cc shr (32-13))) + bb; ee:= ((ee shl 10) or (ee shr (32-10))); bb:= bb + ((cc or (not dd)) xor ee) + X[14] + $6ed9eba1; bb:= ((bb shl 6) or (bb shr (32-6))) + aa; dd:= ((dd shl 10) or (dd shr (32-10))); aa:= aa + ((bb or (not cc)) xor dd) + X[ 4] + $6ed9eba1; aa:= ((aa shl 7) or (aa shr (32-7))) + ee; cc:= ((cc shl 10) or (cc shr (32-10))); ee:= ee + ((aa or (not bb)) xor cc) + X[ 9] + $6ed9eba1; ee:= ((ee shl 14) or (ee shr (32-14))) + dd; bb:= ((bb shl 10) or (bb shr (32-10))); dd:= dd + ((ee or (not aa)) xor bb) + X[15] + $6ed9eba1; dd:= ((dd shl 9) or (dd shr (32-9))) + cc; aa:= ((aa shl 10) or (aa shr (32-10))); cc:= cc + ((dd or (not ee)) xor aa) + X[ 8] + $6ed9eba1; cc:= ((cc shl 13) or (cc shr (32-13))) + bb; ee:= ((ee shl 10) or (ee shr (32-10))); bb:= bb + ((cc or (not dd)) xor ee) + X[ 1] + $6ed9eba1; bb:= ((bb shl 15) or (bb shr (32-15))) + aa; dd:= ((dd shl 10) or (dd shr (32-10))); aa:= aa + ((bb or (not cc)) xor dd) + X[ 2] + $6ed9eba1; aa:= ((aa shl 14) or (aa shr (32-14))) + ee; cc:= ((cc shl 10) or (cc shr (32-10))); ee:= ee + ((aa or (not bb)) xor cc) + X[ 7] + $6ed9eba1; ee:= ((ee shl 8) or (ee shr (32-8))) + dd; bb:= ((bb shl 10) or (bb shr (32-10))); dd:= dd + ((ee or (not aa)) xor bb) + X[ 0] + $6ed9eba1; dd:= ((dd shl 13) or (dd shr (32-13))) + cc; aa:= ((aa shl 10) or (aa shr (32-10))); cc:= cc + ((dd or (not ee)) xor aa) + X[ 6] + $6ed9eba1; cc:= ((cc shl 6) or (cc shr (32-6))) + bb; ee:= ((ee shl 10) or (ee shr (32-10))); bb:= bb + ((cc or (not dd)) xor ee) + X[13] + $6ed9eba1; bb:= ((bb shl 5) or (bb shr (32-5))) + aa; dd:= ((dd shl 10) or (dd shr (32-10))); aa:= aa + ((bb or (not cc)) xor dd) + X[11] + $6ed9eba1; aa:= ((aa shl 12) or (aa shr (32-12))) + ee; cc:= ((cc shl 10) or (cc shr (32-10))); ee:= ee + ((aa or (not bb)) xor cc) + X[ 5] + $6ed9eba1; ee:= ((ee shl 7) or (ee shr (32-7))) + dd; bb:= ((bb shl 10) or (bb shr (32-10))); dd:= dd + ((ee or (not aa)) xor bb) + X[12] + $6ed9eba1; dd:= ((dd shl 5) or (dd shr (32-5))) + cc; aa:= ((aa shl 10) or (aa shr (32-10))); cc:= cc + ((dd and aa) or (ee and (not aa))) + X[ 1] + $8f1bbcdc; cc:= ((cc shl 11) or (cc shr (32-11))) + bb; ee:= ((ee shl 10) or (ee shr (32-10))); bb:= bb + ((cc and ee) or (dd and (not ee))) + X[ 9] + $8f1bbcdc; bb:= ((bb shl 12) or (bb shr (32-12))) + aa; dd:= ((dd shl 10) or (dd shr (32-10))); aa:= aa + ((bb and dd) or (cc and (not dd))) + X[11] + $8f1bbcdc; aa:= ((aa shl 14) or (aa shr (32-14))) + ee; cc:= ((cc shl 10) or (cc shr (32-10))); ee:= ee + ((aa and cc) or (bb and (not cc))) + X[10] + $8f1bbcdc; ee:= ((ee shl 15) or (ee shr (32-15))) + dd; bb:= ((bb shl 10) or (bb shr (32-10))); dd:= dd + ((ee and bb) or (aa and (not bb))) + X[ 0] + $8f1bbcdc; dd:= ((dd shl 14) or (dd shr (32-14))) + cc; aa:= ((aa shl 10) or (aa shr (32-10))); cc:= cc + ((dd and aa) or (ee and (not aa))) + X[ 8] + $8f1bbcdc; cc:= ((cc shl 15) or (cc shr (32-15))) + bb; ee:= ((ee shl 10) or (ee shr (32-10))); bb:= bb + ((cc and ee) or (dd and (not ee))) + X[12] + $8f1bbcdc; bb:= ((bb shl 9) or (bb shr (32-9))) + aa; dd:= ((dd shl 10) or (dd shr (32-10))); aa:= aa + ((bb and dd) or (cc and (not dd))) + X[ 4] + $8f1bbcdc; aa:= ((aa shl 8) or (aa shr (32-8))) + ee; cc:= ((cc shl 10) or (cc shr (32-10))); ee:= ee + ((aa and cc) or (bb and (not cc))) + X[13] + $8f1bbcdc; ee:= ((ee shl 9) or (ee shr (32-9))) + dd; bb:= ((bb shl 10) or (bb shr (32-10))); dd:= dd + ((ee and bb) or (aa and (not bb))) + X[ 3] + $8f1bbcdc; dd:= ((dd shl 14) or (dd shr (32-14))) + cc; aa:= ((aa shl 10) or (aa shr (32-10))); cc:= cc + ((dd and aa) or (ee and (not aa))) + X[ 7] + $8f1bbcdc; cc:= ((cc shl 5) or (cc shr (32-5))) + bb; ee:= ((ee shl 10) or (ee shr (32-10))); bb:= bb + ((cc and ee) or (dd and (not ee))) + X[15] + $8f1bbcdc; bb:= ((bb shl 6) or (bb shr (32-6))) + aa; dd:= ((dd shl 10) or (dd shr (32-10))); aa:= aa + ((bb and dd) or (cc and (not dd))) + X[14] + $8f1bbcdc; aa:= ((aa shl 8) or (aa shr (32-8))) + ee; cc:= ((cc shl 10) or (cc shr (32-10))); ee:= ee + ((aa and cc) or (bb and (not cc))) + X[ 5] + $8f1bbcdc; ee:= ((ee shl 6) or (ee shr (32-6))) + dd; bb:= ((bb shl 10) or (bb shr (32-10))); dd:= dd + ((ee and bb) or (aa and (not bb))) + X[ 6] + $8f1bbcdc; dd:= ((dd shl 5) or (dd shr (32-5))) + cc; aa:= ((aa shl 10) or (aa shr (32-10))); cc:= cc + ((dd and aa) or (ee and (not aa))) + X[ 2] + $8f1bbcdc; cc:= ((cc shl 12) or (cc shr (32-12))) + bb; ee:= ((ee shl 10) or (ee shr (32-10))); bb:= bb + (cc xor (dd or (not ee))) + X[ 4] + $a953fd4e; bb:= ((bb shl 9) or (bb shr (32-9))) + aa; dd:= ((dd shl 10) or (dd shr (32-10))); aa:= aa + (bb xor (cc or (not dd))) + X[ 0] + $a953fd4e; aa:= ((aa shl 15) or (aa shr (32-15))) + ee; cc:= ((cc shl 10) or (cc shr (32-10))); ee:= ee + (aa xor (bb or (not cc))) + X[ 5] + $a953fd4e; ee:= ((ee shl 5) or (ee shr (32-5))) + dd; bb:= ((bb shl 10) or (bb shr (32-10))); dd:= dd + (ee xor (aa or (not bb))) + X[ 9] + $a953fd4e; dd:= ((dd shl 11) or (dd shr (32-11))) + cc; aa:= ((aa shl 10) or (aa shr (32-10))); cc:= cc + (dd xor (ee or (not aa))) + X[ 7] + $a953fd4e; cc:= ((cc shl 6) or (cc shr (32-6))) + bb; ee:= ((ee shl 10) or (ee shr (32-10))); bb:= bb + (cc xor (dd or (not ee))) + X[12] + $a953fd4e; bb:= ((bb shl 8) or (bb shr (32-8))) + aa; dd:= ((dd shl 10) or (dd shr (32-10))); aa:= aa + (bb xor (cc or (not dd))) + X[ 2] + $a953fd4e; aa:= ((aa shl 13) or (aa shr (32-13))) + ee; cc:= ((cc shl 10) or (cc shr (32-10))); ee:= ee + (aa xor (bb or (not cc))) + X[10] + $a953fd4e; ee:= ((ee shl 12) or (ee shr (32-12))) + dd; bb:= ((bb shl 10) or (bb shr (32-10))); dd:= dd + (ee xor (aa or (not bb))) + X[14] + $a953fd4e; dd:= ((dd shl 5) or (dd shr (32-5))) + cc; aa:= ((aa shl 10) or (aa shr (32-10))); cc:= cc + (dd xor (ee or (not aa))) + X[ 1] + $a953fd4e; cc:= ((cc shl 12) or (cc shr (32-12))) + bb; ee:= ((ee shl 10) or (ee shr (32-10))); bb:= bb + (cc xor (dd or (not ee))) + X[ 3] + $a953fd4e; bb:= ((bb shl 13) or (bb shr (32-13))) + aa; dd:= ((dd shl 10) or (dd shr (32-10))); aa:= aa + (bb xor (cc or (not dd))) + X[ 8] + $a953fd4e; aa:= ((aa shl 14) or (aa shr (32-14))) + ee; cc:= ((cc shl 10) or (cc shr (32-10))); ee:= ee + (aa xor (bb or (not cc))) + X[11] + $a953fd4e; ee:= ((ee shl 11) or (ee shr (32-11))) + dd; bb:= ((bb shl 10) or (bb shr (32-10))); dd:= dd + (ee xor (aa or (not bb))) + X[ 6] + $a953fd4e; dd:= ((dd shl 8) or (dd shr (32-8))) + cc; aa:= ((aa shl 10) or (aa shr (32-10))); cc:= cc + (dd xor (ee or (not aa))) + X[15] + $a953fd4e; cc:= ((cc shl 5) or (cc shr (32-5))) + bb; ee:= ((ee shl 10) or (ee shr (32-10))); bb:= bb + (cc xor (dd or (not ee))) + X[13] + $a953fd4e; bb:= ((bb shl 6) or (bb shr (32-6))) + aa; dd:= ((dd shl 10) or (dd shr (32-10))); aaa:= aaa + (bbb xor (ccc or (not ddd))) + X[ 5] + $50a28be6; aaa:= ((aaa shl 8) or (aaa shr (32-8))) + eee; ccc:= ((ccc shl 10) or (ccc shr (32-10))); eee:= eee + (aaa xor (bbb or (not ccc))) + X[14] + $50a28be6; eee:= ((eee shl 9) or (eee shr (32-9))) + ddd; bbb:= ((bbb shl 10) or (bbb shr (32-10))); ddd:= ddd + (eee xor (aaa or (not bbb))) + X[ 7] + $50a28be6; ddd:= ((ddd shl 9) or (ddd shr (32-9))) + ccc; aaa:= ((aaa shl 10) or (aaa shr (32-10))); ccc:= ccc + (ddd xor (eee or (not aaa))) + X[ 0] + $50a28be6; ccc:= ((ccc shl 11) or (ccc shr (32-11))) + bbb; eee:= ((eee shl 10) or (eee shr (32-10))); bbb:= bbb + (ccc xor (ddd or (not eee))) + X[ 9] + $50a28be6; bbb:= ((bbb shl 13) or (bbb shr (32-13))) + aaa; ddd:= ((ddd shl 10) or (ddd shr (32-10))); aaa:= aaa + (bbb xor (ccc or (not ddd))) + X[ 2] + $50a28be6; aaa:= ((aaa shl 15) or (aaa shr (32-15))) + eee; ccc:= ((ccc shl 10) or (ccc shr (32-10))); eee:= eee + (aaa xor (bbb or (not ccc))) + X[11] + $50a28be6; eee:= ((eee shl 15) or (eee shr (32-15))) + ddd; bbb:= ((bbb shl 10) or (bbb shr (32-10))); ddd:= ddd + (eee xor (aaa or (not bbb))) + X[ 4] + $50a28be6; ddd:= ((ddd shl 5) or (ddd shr (32-5))) + ccc; aaa:= ((aaa shl 10) or (aaa shr (32-10))); ccc:= ccc + (ddd xor (eee or (not aaa))) + X[13] + $50a28be6; ccc:= ((ccc shl 7) or (ccc shr (32-7))) + bbb; eee:= ((eee shl 10) or (eee shr (32-10))); bbb:= bbb + (ccc xor (ddd or (not eee))) + X[ 6] + $50a28be6; bbb:= ((bbb shl 7) or (bbb shr (32-7))) + aaa; ddd:= ((ddd shl 10) or (ddd shr (32-10))); aaa:= aaa + (bbb xor (ccc or (not ddd))) + X[15] + $50a28be6; aaa:= ((aaa shl 8) or (aaa shr (32-8))) + eee; ccc:= ((ccc shl 10) or (ccc shr (32-10))); eee:= eee + (aaa xor (bbb or (not ccc))) + X[ 8] + $50a28be6; eee:= ((eee shl 11) or (eee shr (32-11))) + ddd; bbb:= ((bbb shl 10) or (bbb shr (32-10))); ddd:= ddd + (eee xor (aaa or (not bbb))) + X[ 1] + $50a28be6; ddd:= ((ddd shl 14) or (ddd shr (32-14))) + ccc; aaa:= ((aaa shl 10) or (aaa shr (32-10))); ccc:= ccc + (ddd xor (eee or (not aaa))) + X[10] + $50a28be6; ccc:= ((ccc shl 14) or (ccc shr (32-14))) + bbb; eee:= ((eee shl 10) or (eee shr (32-10))); bbb:= bbb + (ccc xor (ddd or (not eee))) + X[ 3] + $50a28be6; bbb:= ((bbb shl 12) or (bbb shr (32-12))) + aaa; ddd:= ((ddd shl 10) or (ddd shr (32-10))); aaa:= aaa + (bbb xor (ccc or (not ddd))) + X[12] + $50a28be6; aaa:= ((aaa shl 6) or (aaa shr (32-6))) + eee; ccc:= ((ccc shl 10) or (ccc shr (32-10))); eee:= eee + ((aaa and ccc) or (bbb and (not ccc))) + X[ 6] + $5c4dd124; eee:= ((eee shl 9) or (eee shr (32-9))) + ddd; bbb:= ((bbb shl 10) or (bbb shr (32-10))); ddd:= ddd + ((eee and bbb) or (aaa and (not bbb))) + X[11] + $5c4dd124; ddd:= ((ddd shl 13) or (ddd shr (32-13))) + ccc; aaa:= ((aaa shl 10) or (aaa shr (32-10))); ccc:= ccc + ((ddd and aaa) or (eee and (not aaa))) + X[ 3] + $5c4dd124; ccc:= ((ccc shl 15) or (ccc shr (32-15))) + bbb; eee:= ((eee shl 10) or (eee shr (32-10))); bbb:= bbb + ((ccc and eee) or (ddd and (not eee))) + X[ 7] + $5c4dd124; bbb:= ((bbb shl 7) or (bbb shr (32-7))) + aaa; ddd:= ((ddd shl 10) or (ddd shr (32-10))); aaa:= aaa + ((bbb and ddd) or (ccc and (not ddd))) + X[ 0] + $5c4dd124; aaa:= ((aaa shl 12) or (aaa shr (32-12))) + eee; ccc:= ((ccc shl 10) or (ccc shr (32-10))); eee:= eee + ((aaa and ccc) or (bbb and (not ccc))) + X[13] + $5c4dd124; eee:= ((eee shl 8) or (eee shr (32-8))) + ddd; bbb:= ((bbb shl 10) or (bbb shr (32-10))); ddd:= ddd + ((eee and bbb) or (aaa and (not bbb))) + X[ 5] + $5c4dd124; ddd:= ((ddd shl 9) or (ddd shr (32-9))) + ccc; aaa:= ((aaa shl 10) or (aaa shr (32-10))); ccc:= ccc + ((ddd and aaa) or (eee and (not aaa))) + X[10] + $5c4dd124; ccc:= ((ccc shl 11) or (ccc shr (32-11))) + bbb; eee:= ((eee shl 10) or (eee shr (32-10))); bbb:= bbb + ((ccc and eee) or (ddd and (not eee))) + X[14] + $5c4dd124; bbb:= ((bbb shl 7) or (bbb shr (32-7))) + aaa; ddd:= ((ddd shl 10) or (ddd shr (32-10))); aaa:= aaa + ((bbb and ddd) or (ccc and (not ddd))) + X[15] + $5c4dd124; aaa:= ((aaa shl 7) or (aaa shr (32-7))) + eee; ccc:= ((ccc shl 10) or (ccc shr (32-10))); eee:= eee + ((aaa and ccc) or (bbb and (not ccc))) + X[ 8] + $5c4dd124; eee:= ((eee shl 12) or (eee shr (32-12))) + ddd; bbb:= ((bbb shl 10) or (bbb shr (32-10))); ddd:= ddd + ((eee and bbb) or (aaa and (not bbb))) + X[12] + $5c4dd124; ddd:= ((ddd shl 7) or (ddd shr (32-7))) + ccc; aaa:= ((aaa shl 10) or (aaa shr (32-10))); ccc:= ccc + ((ddd and aaa) or (eee and (not aaa))) + X[ 4] + $5c4dd124; ccc:= ((ccc shl 6) or (ccc shr (32-6))) + bbb; eee:= ((eee shl 10) or (eee shr (32-10))); bbb:= bbb + ((ccc and eee) or (ddd and (not eee))) + X[ 9] + $5c4dd124; bbb:= ((bbb shl 15) or (bbb shr (32-15))) + aaa; ddd:= ((ddd shl 10) or (ddd shr (32-10))); aaa:= aaa + ((bbb and ddd) or (ccc and (not ddd))) + X[ 1] + $5c4dd124; aaa:= ((aaa shl 13) or (aaa shr (32-13))) + eee; ccc:= ((ccc shl 10) or (ccc shr (32-10))); eee:= eee + ((aaa and ccc) or (bbb and (not ccc))) + X[ 2] + $5c4dd124; eee:= ((eee shl 11) or (eee shr (32-11))) + ddd; bbb:= ((bbb shl 10) or (bbb shr (32-10))); ddd:= ddd + ((eee or (not aaa)) xor bbb) + X[15] + $6d703ef3; ddd:= ((ddd shl 9) or (ddd shr (32-9))) + ccc; aaa:= ((aaa shl 10) or (aaa shr (32-10))); ccc:= ccc + ((ddd or (not eee)) xor aaa) + X[ 5] + $6d703ef3; ccc:= ((ccc shl 7) or (ccc shr (32-7))) + bbb; eee:= ((eee shl 10) or (eee shr (32-10))); bbb:= bbb + ((ccc or (not ddd)) xor eee) + X[ 1] + $6d703ef3; bbb:= ((bbb shl 15) or (bbb shr (32-15))) + aaa; ddd:= ((ddd shl 10) or (ddd shr (32-10))); aaa:= aaa + ((bbb or (not ccc)) xor ddd) + X[ 3] + $6d703ef3; aaa:= ((aaa shl 11) or (aaa shr (32-11))) + eee; ccc:= ((ccc shl 10) or (ccc shr (32-10))); eee:= eee + ((aaa or (not bbb)) xor ccc) + X[ 7] + $6d703ef3; eee:= ((eee shl 8) or (eee shr (32-8))) + ddd; bbb:= ((bbb shl 10) or (bbb shr (32-10))); ddd:= ddd + ((eee or (not aaa)) xor bbb) + X[14] + $6d703ef3; ddd:= ((ddd shl 6) or (ddd shr (32-6))) + ccc; aaa:= ((aaa shl 10) or (aaa shr (32-10))); ccc:= ccc + ((ddd or (not eee)) xor aaa) + X[ 6] + $6d703ef3; ccc:= ((ccc shl 6) or (ccc shr (32-6))) + bbb; eee:= ((eee shl 10) or (eee shr (32-10))); bbb:= bbb + ((ccc or (not ddd)) xor eee) + X[ 9] + $6d703ef3; bbb:= ((bbb shl 14) or (bbb shr (32-14))) + aaa; ddd:= ((ddd shl 10) or (ddd shr (32-10))); aaa:= aaa + ((bbb or (not ccc)) xor ddd) + X[11] + $6d703ef3; aaa:= ((aaa shl 12) or (aaa shr (32-12))) + eee; ccc:= ((ccc shl 10) or (ccc shr (32-10))); eee:= eee + ((aaa or (not bbb)) xor ccc) + X[ 8] + $6d703ef3; eee:= ((eee shl 13) or (eee shr (32-13))) + ddd; bbb:= ((bbb shl 10) or (bbb shr (32-10))); ddd:= ddd + ((eee or (not aaa)) xor bbb) + X[12] + $6d703ef3; ddd:= ((ddd shl 5) or (ddd shr (32-5))) + ccc; aaa:= ((aaa shl 10) or (aaa shr (32-10))); ccc:= ccc + ((ddd or (not eee)) xor aaa) + X[ 2] + $6d703ef3; ccc:= ((ccc shl 14) or (ccc shr (32-14))) + bbb; eee:= ((eee shl 10) or (eee shr (32-10))); bbb:= bbb + ((ccc or (not ddd)) xor eee) + X[10] + $6d703ef3; bbb:= ((bbb shl 13) or (bbb shr (32-13))) + aaa; ddd:= ((ddd shl 10) or (ddd shr (32-10))); aaa:= aaa + ((bbb or (not ccc)) xor ddd) + X[ 0] + $6d703ef3; aaa:= ((aaa shl 13) or (aaa shr (32-13))) + eee; ccc:= ((ccc shl 10) or (ccc shr (32-10))); eee:= eee + ((aaa or (not bbb)) xor ccc) + X[ 4] + $6d703ef3; eee:= ((eee shl 7) or (eee shr (32-7))) + ddd; bbb:= ((bbb shl 10) or (bbb shr (32-10))); ddd:= ddd + ((eee or (not aaa)) xor bbb) + X[13] + $6d703ef3; ddd:= ((ddd shl 5) or (ddd shr (32-5))) + ccc; aaa:= ((aaa shl 10) or (aaa shr (32-10))); ccc:= ccc + ((ddd and eee) or ((not ddd) and aaa)) + X[ 8] + $7a6d76e9; ccc:= ((ccc shl 15) or (ccc shr (32-15))) + bbb; eee:= ((eee shl 10) or (eee shr (32-10))); bbb:= bbb + ((ccc and ddd) or ((not ccc) and eee)) + X[ 6] + $7a6d76e9; bbb:= ((bbb shl 5) or (bbb shr (32-5))) + aaa; ddd:= ((ddd shl 10) or (ddd shr (32-10))); aaa:= aaa + ((bbb and ccc) or ((not bbb) and ddd)) + X[ 4] + $7a6d76e9; aaa:= ((aaa shl 8) or (aaa shr (32-8))) + eee; ccc:= ((ccc shl 10) or (ccc shr (32-10))); eee:= eee + ((aaa and bbb) or ((not aaa) and ccc)) + X[ 1] + $7a6d76e9; eee:= ((eee shl 11) or (eee shr (32-11))) + ddd; bbb:= ((bbb shl 10) or (bbb shr (32-10))); ddd:= ddd + ((eee and aaa) or ((not eee) and bbb)) + X[ 3] + $7a6d76e9; ddd:= ((ddd shl 14) or (ddd shr (32-14))) + ccc; aaa:= ((aaa shl 10) or (aaa shr (32-10))); ccc:= ccc + ((ddd and eee) or ((not ddd) and aaa)) + X[11] + $7a6d76e9; ccc:= ((ccc shl 14) or (ccc shr (32-14))) + bbb; eee:= ((eee shl 10) or (eee shr (32-10))); bbb:= bbb + ((ccc and ddd) or ((not ccc) and eee)) + X[15] + $7a6d76e9; bbb:= ((bbb shl 6) or (bbb shr (32-6))) + aaa; ddd:= ((ddd shl 10) or (ddd shr (32-10))); aaa:= aaa + ((bbb and ccc) or ((not bbb) and ddd)) + X[ 0] + $7a6d76e9; aaa:= ((aaa shl 14) or (aaa shr (32-14))) + eee; ccc:= ((ccc shl 10) or (ccc shr (32-10))); eee:= eee + ((aaa and bbb) or ((not aaa) and ccc)) + X[ 5] + $7a6d76e9; eee:= ((eee shl 6) or (eee shr (32-6))) + ddd; bbb:= ((bbb shl 10) or (bbb shr (32-10))); ddd:= ddd + ((eee and aaa) or ((not eee) and bbb)) + X[12] + $7a6d76e9; ddd:= ((ddd shl 9) or (ddd shr (32-9))) + ccc; aaa:= ((aaa shl 10) or (aaa shr (32-10))); ccc:= ccc + ((ddd and eee) or ((not ddd) and aaa)) + X[ 2] + $7a6d76e9; ccc:= ((ccc shl 12) or (ccc shr (32-12))) + bbb; eee:= ((eee shl 10) or (eee shr (32-10))); bbb:= bbb + ((ccc and ddd) or ((not ccc) and eee)) + X[13] + $7a6d76e9; bbb:= ((bbb shl 9) or (bbb shr (32-9))) + aaa; ddd:= ((ddd shl 10) or (ddd shr (32-10))); aaa:= aaa + ((bbb and ccc) or ((not bbb) and ddd)) + X[ 9] + $7a6d76e9; aaa:= ((aaa shl 12) or (aaa shr (32-12))) + eee; ccc:= ((ccc shl 10) or (ccc shr (32-10))); eee:= eee + ((aaa and bbb) or ((not aaa) and ccc)) + X[ 7] + $7a6d76e9; eee:= ((eee shl 5) or (eee shr (32-5))) + ddd; bbb:= ((bbb shl 10) or (bbb shr (32-10))); ddd:= ddd + ((eee and aaa) or ((not eee) and bbb)) + X[10] + $7a6d76e9; ddd:= ((ddd shl 15) or (ddd shr (32-15))) + ccc; aaa:= ((aaa shl 10) or (aaa shr (32-10))); ccc:= ccc + ((ddd and eee) or ((not ddd) and aaa)) + X[14] + $7a6d76e9; ccc:= ((ccc shl 8) or (ccc shr (32-8))) + bbb; eee:= ((eee shl 10) or (eee shr (32-10))); bbb:= bbb + (ccc xor ddd xor eee) + X[12]; bbb:= ((bbb shl 8) or (bbb shr (32-8))) + aaa; ddd:= ((ddd shl 10) or (ddd shr (32-10))); aaa:= aaa + (bbb xor ccc xor ddd) + X[15]; aaa:= ((aaa shl 5) or (aaa shr (32-5))) + eee; ccc:= ((ccc shl 10) or (ccc shr (32-10))); eee:= eee + (aaa xor bbb xor ccc) + X[10]; eee:= ((eee shl 12) or (eee shr (32-12))) + ddd; bbb:= ((bbb shl 10) or (bbb shr (32-10))); ddd:= ddd + (eee xor aaa xor bbb) + X[ 4]; ddd:= ((ddd shl 9) or (ddd shr (32-9))) + ccc; aaa:= ((aaa shl 10) or (aaa shr (32-10))); ccc:= ccc + (ddd xor eee xor aaa) + X[ 1]; ccc:= ((ccc shl 12) or (ccc shr (32-12))) + bbb; eee:= ((eee shl 10) or (eee shr (32-10))); bbb:= bbb + (ccc xor ddd xor eee) + X[ 5]; bbb:= ((bbb shl 5) or (bbb shr (32-5))) + aaa; ddd:= ((ddd shl 10) or (ddd shr (32-10))); aaa:= aaa + (bbb xor ccc xor ddd) + X[ 8]; aaa:= ((aaa shl 14) or (aaa shr (32-14))) + eee; ccc:= ((ccc shl 10) or (ccc shr (32-10))); eee:= eee + (aaa xor bbb xor ccc) + X[ 7]; eee:= ((eee shl 6) or (eee shr (32-6))) + ddd; bbb:= ((bbb shl 10) or (bbb shr (32-10))); ddd:= ddd + (eee xor aaa xor bbb) + X[ 6]; ddd:= ((ddd shl 8) or (ddd shr (32-8))) + ccc; aaa:= ((aaa shl 10) or (aaa shr (32-10))); ccc:= ccc + (ddd xor eee xor aaa) + X[ 2]; ccc:= ((ccc shl 13) or (ccc shr (32-13))) + bbb; eee:= ((eee shl 10) or (eee shr (32-10))); bbb:= bbb + (ccc xor ddd xor eee) + X[13]; bbb:= ((bbb shl 6) or (bbb shr (32-6))) + aaa; ddd:= ((ddd shl 10) or (ddd shr (32-10))); aaa:= aaa + (bbb xor ccc xor ddd) + X[14]; aaa:= ((aaa shl 5) or (aaa shr (32-5))) + eee; ccc:= ((ccc shl 10) or (ccc shr (32-10))); eee:= eee + (aaa xor bbb xor ccc) + X[ 0]; eee:= ((eee shl 15) or (eee shr (32-15))) + ddd; bbb:= ((bbb shl 10) or (bbb shr (32-10))); ddd:= ddd + (eee xor aaa xor bbb) + X[ 3]; ddd:= ((ddd shl 13) or (ddd shr (32-13))) + ccc; aaa:= ((aaa shl 10) or (aaa shr (32-10))); ccc:= ccc + (ddd xor eee xor aaa) + X[ 9]; ccc:= ((ccc shl 11) or (ccc shr (32-11))) + bbb; eee:= ((eee shl 10) or (eee shr (32-10))); bbb:= bbb + (ccc xor ddd xor eee) + X[11]; bbb:= ((bbb shl 11) or (bbb shr (32-11))) + aaa; ddd:= ((ddd shl 10) or (ddd shr (32-10))); ddd:= ddd + cc + CurrentHash[1]; CurrentHash[1]:= CurrentHash[2] + dd + eee; CurrentHash[2]:= CurrentHash[3] + ee + aaa; CurrentHash[3]:= CurrentHash[4] + aa + bbb; CurrentHash[4]:= CurrentHash[0] + bb + ccc; CurrentHash[0]:= ddd; FillChar(X,Sizeof(X),0); Index:= 0; FillChar(HashBuffer,Sizeof(HashBuffer),0); end; class function TDCP_ripemd160.GetHashSize: integer; begin Result:= 160; end; class function TDCP_ripemd160.GetId: integer; begin Result:= DCP_ripemd160; end; class function TDCP_ripemd160.GetAlgorithm: string; begin Result:= 'RipeMD-160'; end; class function TDCP_ripemd160.SelfTest: boolean; const Test1Out: array[0..19] of byte= ($0B,$DC,$9D,$2D,$25,$6B,$3E,$E9,$DA,$AE,$34,$7B,$E6,$F4,$DC,$83,$5A,$46,$7F,$FE); Test2Out: array[0..19] of byte= ($F7,$1C,$27,$10,$9C,$69,$2C,$1B,$56,$BB,$DC,$EB,$5B,$9D,$28,$65,$B3,$70,$8D,$BC); var TestHash: TDCP_ripemd160; TestOut: array[0..19] of byte; begin dcpFillChar(TestOut, SizeOf(TestOut), 0); TestHash:= TDCP_ripemd160.Create(nil); TestHash.Init; TestHash.UpdateStr('a'); TestHash.Final(TestOut); Result:= CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out)); TestHash.Init; TestHash.UpdateStr('abcdefghijklmnopqrstuvwxyz'); TestHash.Final(TestOut); Result:= CompareMem(@TestOut,@Test2Out,Sizeof(Test2Out)) and Result; TestHash.Free; end; procedure TDCP_ripemd160.Init; begin Burn; CurrentHash[0]:= $67452301; CurrentHash[1]:= $efcdab89; CurrentHash[2]:= $98badcfe; CurrentHash[3]:= $10325476; CurrentHash[4]:= $c3d2e1f0; fInitialized:= true; end; procedure TDCP_ripemd160.Burn; begin LenHi:= 0; LenLo:= 0; Index:= 0; FillChar(HashBuffer,Sizeof(HashBuffer),0); FillChar(CurrentHash,Sizeof(CurrentHash),0); fInitialized:= false; end; procedure TDCP_ripemd160.Update(const Buffer; Size: longword); var PBuf: ^byte; begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); Inc(LenHi,Size shr 29); Inc(LenLo,Size*8); if LenLo< (Size*8) then Inc(LenHi); PBuf:= @Buffer; while Size> 0 do begin if (Sizeof(HashBuffer)-Index)<= DWord(Size) then begin Move(PBuf^,HashBuffer[Index],Sizeof(HashBuffer)-Index); Dec(Size,Sizeof(HashBuffer)-Index); Inc(PBuf,Sizeof(HashBuffer)-Index); Compress; end else begin Move(PBuf^,HashBuffer[Index],Size); Inc(Index,Size); Size:= 0; end; end; end; procedure TDCP_ripemd160.Final(var Digest); begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); HashBuffer[Index]:= $80; if Index>= 56 then Compress; PDWord(@HashBuffer[56])^:= LenLo; PDWord(@HashBuffer[60])^:= LenHi; Compress; Move(CurrentHash,Digest,Sizeof(CurrentHash)); Burn; end; end. doublecmd-0.5.8/components/dcpcrypt/Hashes/dcpsfv.pas0000644000175000017500000001606612014201074021730 0ustar alexxalexx{******************************************************************************} {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********} {******************************************************************************} {* A binary compatible (with Total Commander) implementation of SFV *} {******************************************************************************} {* Copyright (C) 2011 Alexander Koblov (alexx2000@mail.ru) *} {* Permission is hereby granted, free of charge, to any person obtaining a *} {* copy of this software and associated documentation files (the "Software"), *} {* to deal in the Software without restriction, including without limitation *} {* the rights to use, copy, modify, merge, publish, distribute, sublicense, *} {* and/or sell copies of the Software, and to permit persons to whom the *} {* Software is furnished to do so, subject to the following conditions: *} {* *} {* The above copyright notice and this permission notice shall be included in *} {* all copies or substantial portions of the Software. *} {* *} {* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *} {* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *} {* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *} {* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *} {* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *} {* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *} {* DEALINGS IN THE SOFTWARE. *} {******************************************************************************} unit DCPsfv; {$mode objfpc}{$h+} interface uses Classes, Sysutils, DCPcrypt2, DCPconst; type TDCP_sfv = class(TDCP_hash) protected CurrentHash: LongWord; public class function GetId: integer; override; class function GetAlgorithm: string; override; class function GetHashSize: integer; override; class function SelfTest: boolean; override; procedure Init; override; procedure Burn; override; procedure Update(const Buffer; Size: longword); override; procedure Final(var Digest); override; end; {******************************************************************************} {******************************************************************************} implementation {$R-}{$Q-} const sfv_table : array[Byte] of cardinal = ( $00000000, $77073096, $ee0e612c, $990951ba, $076dc419, $706af48f, $e963a535, $9e6495a3, $0edb8832, $79dcb8a4, $e0d5e91e, $97d2d988, $09b64c2b, $7eb17cbd, $e7b82d07, $90bf1d91, $1db71064, $6ab020f2, $f3b97148, $84be41de, $1adad47d, $6ddde4eb, $f4d4b551, $83d385c7, $136c9856, $646ba8c0, $fd62f97a, $8a65c9ec, $14015c4f, $63066cd9, $fa0f3d63, $8d080df5, $3b6e20c8, $4c69105e, $d56041e4, $a2677172, $3c03e4d1, $4b04d447, $d20d85fd, $a50ab56b, $35b5a8fa, $42b2986c, $dbbbc9d6, $acbcf940, $32d86ce3, $45df5c75, $dcd60dcf, $abd13d59, $26d930ac, $51de003a, $c8d75180, $bfd06116, $21b4f4b5, $56b3c423, $cfba9599, $b8bda50f, $2802b89e, $5f058808, $c60cd9b2, $b10be924, $2f6f7c87, $58684c11, $c1611dab, $b6662d3d, $76dc4190, $01db7106, $98d220bc, $efd5102a, $71b18589, $06b6b51f, $9fbfe4a5, $e8b8d433, $7807c9a2, $0f00f934, $9609a88e, $e10e9818, $7f6a0dbb, $086d3d2d, $91646c97, $e6635c01, $6b6b51f4, $1c6c6162, $856530d8, $f262004e, $6c0695ed, $1b01a57b, $8208f4c1, $f50fc457, $65b0d9c6, $12b7e950, $8bbeb8ea, $fcb9887c, $62dd1ddf, $15da2d49, $8cd37cf3, $fbd44c65, $4db26158, $3ab551ce, $a3bc0074, $d4bb30e2, $4adfa541, $3dd895d7, $a4d1c46d, $d3d6f4fb, $4369e96a, $346ed9fc, $ad678846, $da60b8d0, $44042d73, $33031de5, $aa0a4c5f, $dd0d7cc9, $5005713c, $270241aa, $be0b1010, $c90c2086, $5768b525, $206f85b3, $b966d409, $ce61e49f, $5edef90e, $29d9c998, $b0d09822, $c7d7a8b4, $59b33d17, $2eb40d81, $b7bd5c3b, $c0ba6cad, $edb88320, $9abfb3b6, $03b6e20c, $74b1d29a, $ead54739, $9dd277af, $04db2615, $73dc1683, $e3630b12, $94643b84, $0d6d6a3e, $7a6a5aa8, $e40ecf0b, $9309ff9d, $0a00ae27, $7d079eb1, $f00f9344, $8708a3d2, $1e01f268, $6906c2fe, $f762575d, $806567cb, $196c3671, $6e6b06e7, $fed41b76, $89d32be0, $10da7a5a, $67dd4acc, $f9b9df6f, $8ebeeff9, $17b7be43, $60b08ed5, $d6d6a3e8, $a1d1937e, $38d8c2c4, $4fdff252, $d1bb67f1, $a6bc5767, $3fb506dd, $48b2364b, $d80d2bda, $af0a1b4c, $36034af6, $41047a60, $df60efc3, $a867df55, $316e8eef, $4669be79, $cb61b38c, $bc66831a, $256fd2a0, $5268e236, $cc0c7795, $bb0b4703, $220216b9, $5505262f, $c5ba3bbe, $b2bd0b28, $2bb45a92, $5cb36a04, $c2d7ffa7, $b5d0cf31, $2cd99e8b, $5bdeae1d, $9b64c2b0, $ec63f226, $756aa39c, $026d930a, $9c0906a9, $eb0e363f, $72076785, $05005713, $95bf4a82, $e2b87a14, $7bb12bae, $0cb61b38, $92d28e9b, $e5d5be0d, $7cdcefb7, $0bdbdf21, $86d3d2d4, $f1d4e242, $68ddb3f8, $1fda836e, $81be16cd, $f6b9265b, $6fb077e1, $18b74777, $88085ae6, $ff0f6a70, $66063bca, $11010b5c, $8f659eff, $f862ae69, $616bffd3, $166ccf45, $a00ae278, $d70dd2ee, $4e048354, $3903b3c2, $a7672661, $d06016f7, $4969474d, $3e6e77db, $aed16a4a, $d9d65adc, $40df0b66, $37d83bf0, $a9bcae53, $debb9ec5, $47b2cf7f, $30b5ffe9, $bdbdf21c, $cabac28a, $53b39330, $24b4a3a6, $bad03605, $cdd70693, $54de5729, $23d967bf, $b3667a2e, $c4614ab8, $5d681b02, $2a6f2b94, $b40bbe37, $c30c8ea1, $5a05df1b, $2d02ef8d); class function TDCP_sfv.GetHashSize: integer; begin Result:= 32; end; class function TDCP_sfv.GetId: integer; begin Result:= DCP_sfv; end; class function TDCP_sfv.GetAlgorithm: string; begin Result:= 'SFV'; end; class function TDCP_sfv.SelfTest: boolean; const Test1Out: array[0..3] of byte=($35,$24,$41,$C2); Test2Out: array[0..3] of byte=($4C,$27,$50,$BD); var TestHash: TDCP_sfv; TestOut: array[0..3] of byte; begin dcpFillChar(TestOut, SizeOf(TestOut), 0); TestHash:= TDCP_sfv.Create(nil); TestHash.Init; TestHash.UpdateStr('abc'); TestHash.Final(TestOut); Result:= CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out)); TestHash.Init; TestHash.UpdateStr('abcdefghijklmnopqrstuvwxyz'); TestHash.Final(TestOut); Result:= CompareMem(@TestOut,@Test2Out,Sizeof(Test2Out)) and Result; TestHash.Free; end; procedure TDCP_sfv.Init; begin Burn; CurrentHash:= $FFFFFFFF; fInitialized:= true; end; procedure TDCP_sfv.Burn; begin CurrentHash:= 0; fInitialized:= false; end; procedure TDCP_sfv.Update(const Buffer; Size: longword); var I: LongWord; Bytes: PByte; begin Bytes:= @Buffer; for I:= 0 to Size - 1 do begin CurrentHash:= ((CurrentHash shr 8) and $00FFFFFF) xor (sfv_table[(CurrentHash xor Bytes[I]) and $000000FF]); end; end; procedure TDCP_sfv.Final(var Digest); begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); CurrentHash:= not CurrentHash; CurrentHash:= SwapEndian(CurrentHash); Move(CurrentHash,Digest,Sizeof(CurrentHash)); Burn; end; end. doublecmd-0.5.8/components/dcpcrypt/Hashes/dcpripemd128.pas0000644000175000017500000004101612014201074022636 0ustar alexxalexx{******************************************************************************} {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********} {******************************************************************************} {* A binary compatible implementation of RipeMD-128 ***************************} {******************************************************************************} {* Copyright (c) 2002 David Barton *} {* Permission is hereby granted, free of charge, to any person obtaining a *} {* copy of this software and associated documentation files (the "Software"), *} {* to deal in the Software without restriction, including without limitation *} {* the rights to use, copy, modify, merge, publish, distribute, sublicense, *} {* and/or sell copies of the Software, and to permit persons to whom the *} {* Software is furnished to do so, subject to the following conditions: *} {* *} {* The above copyright notice and this permission notice shall be included in *} {* all copies or substantial portions of the Software. *} {* *} {* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *} {* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *} {* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *} {* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *} {* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *} {* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *} {* DEALINGS IN THE SOFTWARE. *} {******************************************************************************} unit DCPripemd128; {$MODE Delphi} interface uses Classes, Sysutils, DCPcrypt2, DCPconst; type TDCP_ripemd128= class(TDCP_hash) protected LenHi, LenLo: longword; Index: DWord; CurrentHash: array[0..3] of DWord; HashBuffer: array[0..63] of byte; procedure Compress; public class function GetId: integer; override; class function GetAlgorithm: string; override; class function GetHashSize: integer; override; class function SelfTest: boolean; override; procedure Init; override; procedure Burn; override; procedure Update(const Buffer; Size: longword); override; procedure Final(var Digest); override; end; {******************************************************************************} {******************************************************************************} implementation {$R-}{$Q-} procedure TDCP_ripemd128.Compress; var X: array[0..15] of DWord; a, aa, b, bb, c, cc, d, dd, t: dword; begin dcpFillChar(X, SizeOf(X), 0); Move(HashBuffer,X,Sizeof(X)); a:= CurrentHash[0]; aa:= a; b:= CurrentHash[1]; bb:= b; c:= CurrentHash[2]; cc:= c; d:= CurrentHash[3]; dd:= d; t:= a + (b xor c xor d) + X[ 0]; a:= (t shl 11) or (t shr (32-11)); t:= d + (a xor b xor c) + X[ 1]; d:= (t shl 14) or (t shr (32-14)); t:= c + (d xor a xor b) + X[ 2]; c:= (t shl 15) or (t shr (32-15)); t:= b + (c xor d xor a) + X[ 3]; b:= (t shl 12) or (t shr (32-12)); t:= a + (b xor c xor d) + X[ 4]; a:= (t shl 5) or (t shr (32-5)); t:= d + (a xor b xor c) + X[ 5]; d:= (t shl 8) or (t shr (32-8)); t:= c + (d xor a xor b) + X[ 6]; c:= (t shl 7) or (t shr (32-7)); t:= b + (c xor d xor a) + X[ 7]; b:= (t shl 9) or (t shr (32-9)); t:= a + (b xor c xor d) + X[ 8]; a:= (t shl 11) or (t shr (32-11)); t:= d + (a xor b xor c) + X[ 9]; d:= (t shl 13) or (t shr (32-13)); t:= c + (d xor a xor b) + X[10]; c:= (t shl 14) or (t shr (32-14)); t:= b + (c xor d xor a) + X[11]; b:= (t shl 15) or (t shr (32-15)); t:= a + (b xor c xor d) + X[12]; a:= (t shl 6) or (t shr (32-6)); t:= d + (a xor b xor c) + X[13]; d:= (t shl 7) or (t shr (32-7)); t:= c + (d xor a xor b) + X[14]; c:= (t shl 9) or (t shr (32-9)); t:= b + (c xor d xor a) + X[15]; b:= (t shl 8) or (t shr (32-8)); t:= a + ((b and c) or (not b and d)) + X[ 7]+$5A827999; a:= (t shl 7) or (t shr (32-7)); t:= d + ((a and b) or (not a and c)) + X[ 4]+$5A827999; d:= (t shl 6) or (t shr (32-6)); t:= c + ((d and a) or (not d and b)) + X[13]+$5A827999; c:= (t shl 8) or (t shr (32-8)); t:= b + ((c and d) or (not c and a)) + X[ 1]+$5A827999; b:= (t shl 13) or (t shr (32-13)); t:= a + ((b and c) or (not b and d)) + X[10]+$5A827999; a:= (t shl 11) or (t shr (32-11)); t:= d + ((a and b) or (not a and c)) + X[ 6]+$5A827999; d:= (t shl 9) or (t shr (32-9)); t:= c + ((d and a) or (not d and b)) + X[15]+$5A827999; c:= (t shl 7) or (t shr (32-7)); t:= b + ((c and d) or (not c and a)) + X[ 3]+$5A827999; b:= (t shl 15) or (t shr (32-15)); t:= a + ((b and c) or (not b and d)) + X[12]+$5A827999; a:= (t shl 7) or (t shr (32-7)); t:= d + ((a and b) or (not a and c)) + X[ 0]+$5A827999; d:= (t shl 12) or (t shr (32-12)); t:= c + ((d and a) or (not d and b)) + X[ 9]+$5A827999; c:= (t shl 15) or (t shr (32-15)); t:= b + ((c and d) or (not c and a)) + X[ 5]+$5A827999; b:= (t shl 9) or (t shr (32-9)); t:= a + ((b and c) or (not b and d)) + X[ 2]+$5A827999; a:= (t shl 11) or (t shr (32-11)); t:= d + ((a and b) or (not a and c)) + X[14]+$5A827999; d:= (t shl 7) or (t shr (32-7)); t:= c + ((d and a) or (not d and b)) + X[11]+$5A827999; c:= (t shl 13) or (t shr (32-13)); t:= b + ((c and d) or (not c and a)) + X[ 8]+$5A827999; b:= (t shl 12) or (t shr (32-12)); t:= a + ((b or not c) xor d) + X[ 3]+$6ED9EBA1; a:= (t shl 11) or (t shr (32-11)); t:= d + ((a or not b) xor c) + X[10]+$6ED9EBA1; d:= (t shl 13) or (t shr (32-13)); t:= c + ((d or not a) xor b) + X[14]+$6ED9EBA1; c:= (t shl 6) or (t shr (32-6)); t:= b + ((c or not d) xor a) + X[ 4]+$6ED9EBA1; b:= (t shl 7) or (t shr (32-7)); t:= a + ((b or not c) xor d) + X[ 9]+$6ED9EBA1; a:= (t shl 14) or (t shr (32-14)); t:= d + ((a or not b) xor c) + X[15]+$6ED9EBA1; d:= (t shl 9) or (t shr (32-9)); t:= c + ((d or not a) xor b) + X[ 8]+$6ED9EBA1; c:= (t shl 13) or (t shr (32-13)); t:= b + ((c or not d) xor a) + X[ 1]+$6ED9EBA1; b:= (t shl 15) or (t shr (32-15)); t:= a + ((b or not c) xor d) + X[ 2]+$6ED9EBA1; a:= (t shl 14) or (t shr (32-14)); t:= d + ((a or not b) xor c) + X[ 7]+$6ED9EBA1; d:= (t shl 8) or (t shr (32-8)); t:= c + ((d or not a) xor b) + X[ 0]+$6ED9EBA1; c:= (t shl 13) or (t shr (32-13)); t:= b + ((c or not d) xor a) + X[ 6]+$6ED9EBA1; b:= (t shl 6) or (t shr (32-6)); t:= a + ((b or not c) xor d) + X[13]+$6ED9EBA1; a:= (t shl 5) or (t shr (32-5)); t:= d + ((a or not b) xor c) + X[11]+$6ED9EBA1; d:= (t shl 12) or (t shr (32-12)); t:= c + ((d or not a) xor b) + X[ 5]+$6ED9EBA1; c:= (t shl 7) or (t shr (32-7)); t:= b + ((c or not d) xor a) + X[12]+$6ED9EBA1; b:= (t shl 5) or (t shr (32-5)); t:= a + ((b and d) or (c and not d)) + X[ 1]+$8F1BBCDC; a:= (t shl 11) or (t shr (32-11)); t:= d + ((a and c) or (b and not c)) + X[ 9]+$8F1BBCDC; d:= (t shl 12) or (t shr (32-12)); t:= c + ((d and b) or (a and not b)) + X[11]+$8F1BBCDC; c:= (t shl 14) or (t shr (32-14)); t:= b + ((c and a) or (d and not a)) + X[10]+$8F1BBCDC; b:= (t shl 15) or (t shr (32-15)); t:= a + ((b and d) or (c and not d)) + X[ 0]+$8F1BBCDC; a:= (t shl 14) or (t shr (32-14)); t:= d + ((a and c) or (b and not c)) + X[ 8]+$8F1BBCDC; d:= (t shl 15) or (t shr (32-15)); t:= c + ((d and b) or (a and not b)) + X[12]+$8F1BBCDC; c:= (t shl 9) or (t shr (32-9)); t:= b + ((c and a) or (d and not a)) + X[ 4]+$8F1BBCDC; b:= (t shl 8) or (t shr (32-8)); t:= a + ((b and d) or (c and not d)) + X[13]+$8F1BBCDC; a:= (t shl 9) or (t shr (32-9)); t:= d + ((a and c) or (b and not c)) + X[ 3]+$8F1BBCDC; d:= (t shl 14) or (t shr (32-14)); t:= c + ((d and b) or (a and not b)) + X[ 7]+$8F1BBCDC; c:= (t shl 5) or (t shr (32-5)); t:= b + ((c and a) or (d and not a)) + X[15]+$8F1BBCDC; b:= (t shl 6) or (t shr (32-6)); t:= a + ((b and d) or (c and not d)) + X[14]+$8F1BBCDC; a:= (t shl 8) or (t shr (32-8)); t:= d + ((a and c) or (b and not c)) + X[ 5]+$8F1BBCDC; d:= (t shl 6) or (t shr (32-6)); t:= c + ((d and b) or (a and not b)) + X[ 6]+$8F1BBCDC; c:= (t shl 5) or (t shr (32-5)); t:= b + ((c and a) or (d and not a)) + X[ 2]+$8F1BBCDC; b:= (t shl 12) or (t shr (32-12)); t:= aa + ((bb and dd) or (cc and not dd)) + X[ 5]+$50A28BE6; aa:= (t shl 8) or (t shr (32-8)); t:= dd + ((aa and cc) or (bb and not cc)) + X[14]+$50A28BE6; dd:= (t shl 9) or (t shr (32-9)); t:= cc + ((dd and bb) or (aa and not bb)) + X[ 7]+$50A28BE6; cc:= (t shl 9) or (t shr (32-9)); t:= bb + ((cc and aa) or (dd and not aa)) + X[ 0]+$50A28BE6; bb:= (t shl 11) or (t shr (32-11)); t:= aa + ((bb and dd) or (cc and not dd)) + X[ 9]+$50A28BE6; aa:= (t shl 13) or (t shr (32-13)); t:= dd + ((aa and cc) or (bb and not cc)) + X[ 2]+$50A28BE6; dd:= (t shl 15) or (t shr (32-15)); t:= cc + ((dd and bb) or (aa and not bb)) + X[11]+$50A28BE6; cc:= (t shl 15) or (t shr (32-15)); t:= bb + ((cc and aa) or (dd and not aa)) + X[ 4]+$50A28BE6; bb:= (t shl 5) or (t shr (32-5)); t:= aa + ((bb and dd) or (cc and not dd)) + X[13]+$50A28BE6; aa:= (t shl 7) or (t shr (32-7)); t:= dd + ((aa and cc) or (bb and not cc)) + X[ 6]+$50A28BE6; dd:= (t shl 7) or (t shr (32-7)); t:= cc + ((dd and bb) or (aa and not bb)) + X[15]+$50A28BE6; cc:= (t shl 8) or (t shr (32-8)); t:= bb + ((cc and aa) or (dd and not aa)) + X[ 8]+$50A28BE6; bb:= (t shl 11) or (t shr (32-11)); t:= aa + ((bb and dd) or (cc and not dd)) + X[ 1]+$50A28BE6; aa:= (t shl 14) or (t shr (32-14)); t:= dd + ((aa and cc) or (bb and not cc)) + X[10]+$50A28BE6; dd:= (t shl 14) or (t shr (32-14)); t:= cc + ((dd and bb) or (aa and not bb)) + X[ 3]+$50A28BE6; cc:= (t shl 12) or (t shr (32-12)); t:= bb + ((cc and aa) or (dd and not aa)) + X[12]+$50A28BE6; bb:= (t shl 6) or (t shr (32-6)); t:= aa + ((bb or not cc) xor dd) + X[ 6]+$5C4DD124; aa:= (t shl 9) or (t shr (32-9)); t:= dd + ((aa or not bb) xor cc) + X[11]+$5C4DD124; dd:= (t shl 13) or (t shr (32-13)); t:= cc + ((dd or not aa) xor bb) + X[ 3]+$5C4DD124; cc:= (t shl 15) or (t shr (32-15)); t:= bb + ((cc or not dd) xor aa) + X[ 7]+$5C4DD124; bb:= (t shl 7) or (t shr (32-7)); t:= aa + ((bb or not cc) xor dd) + X[ 0]+$5C4DD124; aa:= (t shl 12) or (t shr (32-12)); t:= dd + ((aa or not bb) xor cc) + X[13]+$5C4DD124; dd:= (t shl 8) or (t shr (32-8)); t:= cc + ((dd or not aa) xor bb) + X[ 5]+$5C4DD124; cc:= (t shl 9) or (t shr (32-9)); t:= bb + ((cc or not dd) xor aa) + X[10]+$5C4DD124; bb:= (t shl 11) or (t shr (32-11)); t:= aa + ((bb or not cc) xor dd) + X[14]+$5C4DD124; aa:= (t shl 7) or (t shr (32-7)); t:= dd + ((aa or not bb) xor cc) + X[15]+$5C4DD124; dd:= (t shl 7) or (t shr (32-7)); t:= cc + ((dd or not aa) xor bb) + X[ 8]+$5C4DD124; cc:= (t shl 12) or (t shr (32-12)); t:= bb + ((cc or not dd) xor aa) + X[12]+$5C4DD124; bb:= (t shl 7) or (t shr (32-7)); t:= aa + ((bb or not cc) xor dd) + X[ 4]+$5C4DD124; aa:= (t shl 6) or (t shr (32-6)); t:= dd + ((aa or not bb) xor cc) + X[ 9]+$5C4DD124; dd:= (t shl 15) or (t shr (32-15)); t:= cc + ((dd or not aa) xor bb) + X[ 1]+$5C4DD124; cc:= (t shl 13) or (t shr (32-13)); t:= bb + ((cc or not dd) xor aa) + X[ 2]+$5C4DD124; bb:= (t shl 11) or (t shr (32-11)); t:= aa + ((bb and cc) or (not bb and dd)) + X[15]+$6D703EF3; aa:= (t shl 9) or (t shr (32-9)); t:= dd + ((aa and bb) or (not aa and cc)) + X[ 5]+$6D703EF3; dd:= (t shl 7) or (t shr (32-7)); t:= cc + ((dd and aa) or (not dd and bb)) + X[ 1]+$6D703EF3; cc:= (t shl 15) or (t shr (32-15)); t:= bb + ((cc and dd) or (not cc and aa)) + X[ 3]+$6D703EF3; bb:= (t shl 11) or (t shr (32-11)); t:= aa + ((bb and cc) or (not bb and dd)) + X[ 7]+$6D703EF3; aa:= (t shl 8) or (t shr (32-8)); t:= dd + ((aa and bb) or (not aa and cc)) + X[14]+$6D703EF3; dd:= (t shl 6) or (t shr (32-6)); t:= cc + ((dd and aa) or (not dd and bb)) + X[ 6]+$6D703EF3; cc:= (t shl 6) or (t shr (32-6)); t:= bb + ((cc and dd) or (not cc and aa)) + X[ 9]+$6D703EF3; bb:= (t shl 14) or (t shr (32-14)); t:= aa + ((bb and cc) or (not bb and dd)) + X[11]+$6D703EF3; aa:= (t shl 12) or (t shr (32-12)); t:= dd + ((aa and bb) or (not aa and cc)) + X[ 8]+$6D703EF3; dd:= (t shl 13) or (t shr (32-13)); t:= cc + ((dd and aa) or (not dd and bb)) + X[12]+$6D703EF3; cc:= (t shl 5) or (t shr (32-5)); t:= bb + ((cc and dd) or (not cc and aa)) + X[ 2]+$6D703EF3; bb:= (t shl 14) or (t shr (32-14)); t:= aa + ((bb and cc) or (not bb and dd)) + X[10]+$6D703EF3; aa:= (t shl 13) or (t shr (32-13)); t:= dd + ((aa and bb) or (not aa and cc)) + X[ 0]+$6D703EF3; dd:= (t shl 13) or (t shr (32-13)); t:= cc + ((dd and aa) or (not dd and bb)) + X[ 4]+$6D703EF3; cc:= (t shl 7) or (t shr (32-7)); t:= bb + ((cc and dd) or (not cc and aa)) + X[13]+$6D703EF3; bb:= (t shl 5) or (t shr (32-5)); t:= aa + (bb xor cc xor dd) + X[ 8]; aa:= (t shl 15) or (t shr (32-15)); t:= dd + (aa xor bb xor cc) + X[ 6]; dd:= (t shl 5) or (t shr (32-5)); t:= cc + (dd xor aa xor bb) + X[ 4]; cc:= (t shl 8) or (t shr (32-8)); t:= bb + (cc xor dd xor aa) + X[ 1]; bb:= (t shl 11) or (t shr (32-11)); t:= aa + (bb xor cc xor dd) + X[ 3]; aa:= (t shl 14) or (t shr (32-14)); t:= dd + (aa xor bb xor cc) + X[11]; dd:= (t shl 14) or (t shr (32-14)); t:= cc + (dd xor aa xor bb) + X[15]; cc:= (t shl 6) or (t shr (32-6)); t:= bb + (cc xor dd xor aa) + X[ 0]; bb:= (t shl 14) or (t shr (32-14)); t:= aa + (bb xor cc xor dd) + X[ 5]; aa:= (t shl 6) or (t shr (32-6)); t:= dd + (aa xor bb xor cc) + X[12]; dd:= (t shl 9) or (t shr (32-9)); t:= cc + (dd xor aa xor bb) + X[ 2]; cc:= (t shl 12) or (t shr (32-12)); t:= bb + (cc xor dd xor aa) + X[13]; bb:= (t shl 9) or (t shr (32-9)); t:= aa + (bb xor cc xor dd) + X[ 9]; aa:= (t shl 12) or (t shr (32-12)); t:= dd + (aa xor bb xor cc) + X[ 7]; dd:= (t shl 5) or (t shr (32-5)); t:= cc + (dd xor aa xor bb) + X[10]; cc:= (t shl 15) or (t shr (32-15)); t:= bb + (cc xor dd xor aa) + X[14]; bb:= (t shl 8) or (t shr (32-8)); Inc(dd,c + CurrentHash[1]); CurrentHash[1]:= CurrentHash[2] + d + aa; CurrentHash[2]:= CurrentHash[3] + a + bb; CurrentHash[3]:= CurrentHash[0] + b + cc; CurrentHash[0]:= dd; FillChar(X,Sizeof(X),0); Index:= 0; FillChar(HashBuffer,Sizeof(HashBuffer),0); end; class function TDCP_ripemd128.GetHashSize: integer; begin Result:= 128; end; class function TDCP_ripemd128.GetId: integer; begin Result:= DCP_ripemd128; end; class function TDCP_ripemd128.GetAlgorithm: string; begin Result:= 'RipeMD-128'; end; class function TDCP_ripemd128.SelfTest: boolean; const Test1Out: array[0..15] of byte= ($86,$be,$7a,$fa,$33,$9d,$0f,$c7,$cf,$c7,$85,$e7,$2f,$57,$8d,$33); Test2Out: array[0..15] of byte= ($fd,$2a,$a6,$07,$f7,$1d,$c8,$f5,$10,$71,$49,$22,$b3,$71,$83,$4e); var TestHash: TDCP_ripemd128; TestOut: array[0..15] of byte; begin dcpFillChar(TestOut, SizeOf(TestOut), 0); TestHash:= TDCP_ripemd128.Create(nil); TestHash.Init; TestHash.UpdateStr('a'); TestHash.Final(TestOut); Result:= CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out)); TestHash.Init; TestHash.UpdateStr('abcdefghijklmnopqrstuvwxyz'); TestHash.Final(TestOut); Result:= CompareMem(@TestOut,@Test2Out,Sizeof(Test2Out)) and Result; TestHash.Free; end; procedure TDCP_ripemd128.Init; begin Burn; CurrentHash[0]:= $67452301; CurrentHash[1]:= $efcdab89; CurrentHash[2]:= $98badcfe; CurrentHash[3]:= $10325476; fInitialized:= true; end; procedure TDCP_ripemd128.Burn; begin LenHi:= 0; LenLo:= 0; Index:= 0; FillChar(HashBuffer,Sizeof(HashBuffer),0); FillChar(CurrentHash,Sizeof(CurrentHash),0); fInitialized:= false; end; procedure TDCP_ripemd128.Update(const Buffer; Size: longword); var PBuf: ^byte; begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); Inc(LenHi,Size shr 29); Inc(LenLo,Size*8); if LenLo< (Size*8) then Inc(LenHi); PBuf:= @Buffer; while Size> 0 do begin if (Sizeof(HashBuffer)-Index)<= DWord(Size) then begin Move(PBuf^,HashBuffer[Index],Sizeof(HashBuffer)-Index); Dec(Size,Sizeof(HashBuffer)-Index); Inc(PBuf,Sizeof(HashBuffer)-Index); Compress; end else begin Move(PBuf^,HashBuffer[Index],Size); Inc(Index,Size); Size:= 0; end; end; end; procedure TDCP_ripemd128.Final(var Digest); begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); HashBuffer[Index]:= $80; if Index>= 56 then Compress; PDWord(@HashBuffer[56])^:= LenLo; PDWord(@HashBuffer[60])^:= LenHi; Compress; Move(CurrentHash,Digest,Sizeof(CurrentHash)); Burn; end; end. doublecmd-0.5.8/components/dcpcrypt/Hashes/dcphaval.pas0000644000175000017500000003656612014201074022234 0ustar alexxalexx{******************************************************************************} {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********} {******************************************************************************} {* A binary compatible implementation of Haval ********************************} {******************************************************************************} {* Copyright (c) 1999-2002 David Barton *} {* Permission is hereby granted, free of charge, to any person obtaining a *} {* copy of this software and associated documentation files (the "Software"), *} {* to deal in the Software without restriction, including without limitation *} {* the rights to use, copy, modify, merge, publish, distribute, sublicense, *} {* and/or sell copies of the Software, and to permit persons to whom the *} {* Software is furnished to do so, subject to the following conditions: *} {* *} {* The above copyright notice and this permission notice shall be included in *} {* all copies or substantial portions of the Software. *} {* *} {* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *} {* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *} {* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *} {* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *} {* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *} {* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *} {* DEALINGS IN THE SOFTWARE. *} {******************************************************************************} unit DCPhaval; {$MODE Delphi} interface uses Classes, Sysutils, DCPcrypt2, DCPconst; type TDCP_haval= class(TDCP_hash) protected LenHi, LenLo: longword; Index: DWord; CurrentHash: array[0..7] of DWord; HashBuffer: array[0..127] of byte; procedure Compress; public class function GetId: integer; override; class function GetAlgorithm: string; override; class function GetHashSize: integer; override; class function SelfTest: boolean; override; procedure Init; override; procedure Burn; override; procedure Update(const Buffer; Size: longword); override; procedure Final(var Digest); override; end; { Choose how many passes (previous versions of DCPcrypt uses 5 passes) } { ONLY UNCOMMENT ONE! } //{$DEFINE PASS3} //{$DEFINE PASS4} {$DEFINE PASS5} { Choose digest length (previous versions of DCPcrypt uses 256bits) } { ONLY UNCOMMENT ONE! } //{$DEFINE DIGEST128} //{$DEFINE DIGEST160} //{$DEFINE DIGEST192} //{$DEFINE DIGEST224} {$DEFINE DIGEST256} {******************************************************************************} {******************************************************************************} implementation {$R-}{$Q-} procedure TDCP_haval.Compress; var t7, t6, t5, t4, t3, t2, t1, t0: DWord; W: array[0..31] of DWord; Temp: dword; begin dcpFillChar(W, SizeOf(W), 0); t0:= CurrentHash[0]; t1:= CurrentHash[1]; t2:= CurrentHash[2]; t3:= CurrentHash[3]; t4:= CurrentHash[4]; t5:= CurrentHash[5]; t6:= CurrentHash[6]; t7:= CurrentHash[7]; Move(HashBuffer,W,Sizeof(W)); {$IFDEF PASS3} {$INCLUDE DCPhaval3.inc} {$ELSE} {$IFDEF PASS4} {$INCLUDE DCPhaval4.inc} {$ELSE} {$INCLUDE DCPhaval5.inc} {$ENDIF} {$ENDIF} Inc(CurrentHash[0],t0); Inc(CurrentHash[1],t1); Inc(CurrentHash[2],t2); Inc(CurrentHash[3],t3); Inc(CurrentHash[4],t4); Inc(CurrentHash[5],t5); Inc(CurrentHash[6],t6); Inc(CurrentHash[7],t7); FillChar(W,Sizeof(W),0); Index:= 0; FillChar(HashBuffer,Sizeof(HashBuffer),0); end; class function TDCP_haval.GetHashSize: integer; begin {$IFDEF DIGEST128} Result:= 128; {$ELSE} {$IFDEF DIGEST160} Result:= 160; {$ELSE} {$IFDEF DIGEST192} Result:= 192; {$ELSE} {$IFDEF DIGEST224} Result:= 224; {$ELSE} Result:= 256; {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} end; class function TDCP_haval.GetId: integer; begin Result:= DCP_haval; end; class function TDCP_haval.GetAlgorithm: string; begin Result:= 'Haval ('; {$IFDEF DIGEST128} Result:= Result+'128bit, '; {$ELSE} {$IFDEF DIGEST160} Result:= Result+'160bit, '; {$ELSE} {$IFDEF DIGEST192} Result:= Result+'192bit, '; {$ELSE} {$IFDEF DIGEST224} Result:= Result+'224bit, '; {$ELSE} Result:= Result+'256bit, '; {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} {$IFDEF PASS3} Result:= Result+'3 passes)'; {$ELSE} {$IFDEF PASS4} Result:= Result+'4 passes)'; {$ELSE} Result:= Result+'5 passes)'; {$ENDIF} {$ENDIF} end; class function TDCP_haval.SelfTest: boolean; {$IFDEF PASS3} {$IFDEF DIGEST128} const Test1Out: array[0..15] of byte= ($1B,$DC,$55,$6B,$29,$AD,$02,$EC,$09,$AF,$8C,$66,$47,$7F,$2A,$87); var TestHash: TDCP_haval; TestOut: array[0..15] of byte; begin TestHash:= TDCP_haval.Create(nil); TestHash.Init; TestHash.UpdateStr(''); TestHash.Final(TestOut); Result:= CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out)); TestHash.Free; {$ELSE} {$IFDEF DIGEST160} const Test1Out: array[0..19] of byte= ($5E,$16,$10,$FC,$ED,$1D,$3A,$DB,$0B,$B1, $8E,$92,$AC,$2B,$11,$F0,$BD,$99,$D8,$ED); var TestHash: TDCP_haval; TestOut: array[0..19] of byte; begin TestHash:= TDCP_haval.Create(nil); TestHash.Init; TestHash.UpdateStr('a'); TestHash.Final(TestOut); Result:= CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out)); TestHash.Free; {$ELSE} begin Result:= true; {$ENDIF} {$ENDIF} {$ELSE} {$IFDEF PASS4} {$IFDEF DIGEST192} const Test1Out: array[0..23] of byte= ($74,$AA,$31,$18,$2F,$F0,$9B,$CC,$E4,$53,$A7,$F7, $1B,$5A,$7C,$5E,$80,$87,$2F,$A9,$0C,$D9,$3A,$E4); var TestHash: TDCP_haval; TestOut: array[0..23] of byte; begin TestHash:= TDCP_haval.Create(nil); TestHash.Init; TestHash.UpdateStr('HAVAL'); TestHash.Final(TestOut); Result:= CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out)); TestHash.Free; {$ELSE} {$IFDEF DIGEST224} const Test1Out: array[0..27] of byte= ($14,$4C,$B2,$DE,$11,$F0,$5D,$F7,$C3,$56,$28,$2A,$3B,$48, $57,$96,$DA,$65,$3F,$6B,$70,$28,$68,$C7,$DC,$F4,$AE,$76); var TestHash: TDCP_haval; TestOut: array[0..27] of byte; begin TestHash:= TDCP_haval.Create(nil); TestHash.Init; TestHash.UpdateStr('0123456789'); TestHash.Final(TestOut); Result:= CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out)); TestHash.Free; {$ELSE} begin Result:= true; {$ENDIF} {$ENDIF} {$ELSE} {$IFDEF DIGEST256} const Test1Out: array[0..31] of byte= ($1A,$1D,$C8,$09,$9B,$DA,$A7,$F3,$5B,$4D,$A4,$E8,$05,$F1,$A2,$8F, $EE,$90,$9D,$8D,$EE,$92,$01,$98,$18,$5C,$BC,$AE,$D8,$A1,$0A,$8D); Test2Out: array[0..31] of byte= ($C5,$64,$7F,$C6,$C1,$87,$7F,$FF,$96,$74,$2F,$27,$E9,$26,$6B,$68, $74,$89,$4F,$41,$A0,$8F,$59,$13,$03,$3D,$9D,$53,$2A,$ED,$DB,$39); var TestHash: TDCP_haval; TestOut: array[0..31] of byte; begin dcpFillChar(TestOut, SizeOf(TestOut), 0); TestHash:= TDCP_haval.Create(nil); TestHash.Init; TestHash.UpdateStr('abcdefghijklmnopqrstuvwxyz'); TestHash.Final(TestOut); Result:= CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out)); TestHash.Init; TestHash.UpdateStr('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'); TestHash.Final(TestOut); Result:= CompareMem(@TestOut,@Test2Out,Sizeof(Test2Out)) and Result; TestHash.Free; {$ELSE} begin Result:= true; {$ENDIF} {$ENDIF} {$ENDIF} end; procedure TDCP_haval.Init; begin Burn; CurrentHash[0]:= $243F6A88; CurrentHash[1]:= $85A308D3; CurrentHash[2]:= $13198A2E; CurrentHash[3]:= $03707344; CurrentHash[4]:= $A4093822; CurrentHash[5]:= $299F31D0; CurrentHash[6]:= $082EFA98; CurrentHash[7]:= $EC4E6C89; fInitialized:= true; end; procedure TDCP_haval.Burn; begin LenHi:= 0; LenLo:= 0; Index:= 0; FillChar(HashBuffer,Sizeof(HashBuffer),0); FillChar(CurrentHash,Sizeof(CurrentHash),0); fInitialized:= false; end; procedure TDCP_haval.Update(const Buffer; Size: longword); var PBuf: ^byte; begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); Inc(LenHi,Size shr 29); Inc(LenLo,Size*8); if LenLo< (Size*8) then Inc(LenHi); PBuf:= @Buffer; while Size> 0 do begin if (Sizeof(HashBuffer)-Index)<= DWord(Size) then begin Move(PBuf^,HashBuffer[Index],Sizeof(HashBuffer)-Index); Dec(Size,Sizeof(HashBuffer)-Index); Inc(PBuf,Sizeof(HashBuffer)-Index); Compress; end else begin Move(PBuf^,HashBuffer[Index],Size); Inc(Index,Size); Size:= 0; end; end; end; procedure TDCP_haval.Final(var Digest); {$IFNDEF DIGEST256} {$IFNDEF DIGEST224} var temp: dword; {$ENDIF} {$ENDIF} begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); HashBuffer[Index]:= $80; if Index>= 118 then Compress; {$IFDEF PASS3} {$IFDEF DIGEST128} HashBuffer[118]:= ((128 and 3) shl 6) or (3 shl 3) or 1; HashBuffer[119]:= (128 shr 2) and $FF; {$ELSE} {$IFDEF DIGEST160} HashBuffer[118]:= ((160 and 3) shl 6) or (3 shl 3) or 1; HashBuffer[119]:= (160 shr 2) and $FF; {$ELSE} {$IFDEF DIGEST192} HashBuffer[118]:= ((192 and 3) shl 6) or (3 shl 3) or 1; HashBuffer[119]:= (192 shr 2) and $FF; {$ELSE} {$IFDEF DIGEST224} HashBuffer[118]:= ((224 and 3) shl 6) or (3 shl 3) or 1; HashBuffer[119]:= (224 shr 2) and $FF; {$ELSE} HashBuffer[118]:= ((256 and 3) shl 6) or (3 shl 3) or 1; HashBuffer[119]:= (256 shr 2) and $FF; {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} {$ELSE} {$IFDEF PASS4} {$IFDEF DIGEST128} HashBuffer[118]:= ((128 and 3) shl 6) or (4 shl 3) or 1; HashBuffer[119]:= (128 shr 2) and $FF; {$ELSE} {$IFDEF DIGEST160} HashBuffer[118]:= ((160 and 3) shl 6) or (4 shl 3) or 1; HashBuffer[119]:= (160 shr 2) and $FF; {$ELSE} {$IFDEF DIGEST192} HashBuffer[118]:= ((192 and 3) shl 6) or (4 shl 3) or 1; HashBuffer[119]:= (192 shr 2) and $FF; {$ELSE} {$IFDEF DIGEST224} HashBuffer[118]:= ((224 and 3) shl 6) or (4 shl 3) or 1; HashBuffer[119]:= (224 shr 2) and $FF; {$ELSE} HashBuffer[118]:= ((256 and 3) shl 6) or (4 shl 3) or 1; HashBuffer[119]:= (256 shr 2) and $FF; {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} {$ELSE} {$IFDEF DIGEST128} HashBuffer[118]:= ((128 and 3) shl 6) or (5 shl 3) or 1; HashBuffer[119]:= (2128 shr 2) and $FF; {$ELSE} {$IFDEF DIGEST160} HashBuffer[118]:= ((160 and 3) shl 6) or (5 shl 3) or 1; HashBuffer[119]:= (160 shr 2) and $FF; {$ELSE} {$IFDEF DIGEST192} HashBuffer[118]:= ((192 and 3) shl 6) or (5 shl 3) or 1; HashBuffer[119]:= (192 shr 2) and $FF; {$ELSE} {$IFDEF DIGEST224} HashBuffer[118]:= ((224 and 3) shl 6) or (5 shl 3) or 1; HashBuffer[119]:= (224 shr 2) and $FF; {$ELSE} HashBuffer[118]:= ((256 and 3) shl 6) or (5 shl 3) or 1; HashBuffer[119]:= (256 shr 2) and $FF; {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} PDWord(@HashBuffer[120])^:= LenLo; PDWord(@HashBuffer[124])^:= LenHi; Compress; {$IFDEF DIGEST128} temp:= (CurrentHash[7] and $000000FF) or (CurrentHash[6] and $FF000000) or (CurrentHash[5] and $00FF0000) or (CurrentHash[4] and $0000FF00); Inc(CurrentHash[0],(temp shr 8) or (temp shl 24)); temp:= (CurrentHash[7] and $0000FF00) or (CurrentHash[6] and $000000FF) or (CurrentHash[5] and $FF000000) or (CurrentHash[4] and $00FF0000); Inc(CurrentHash[1],(temp shr 16) or (temp shl 16)); temp:= (CurrentHash[7] and $00FF0000) or (CurrentHash[6] and $0000FF00) or (CurrentHash[5] and $000000FF) or (CurrentHash[4] and $FF000000); Inc(CurrentHash[2],(temp shr 24) or (temp shl 8)); temp:= (CurrentHash[7] and $FF000000) or (CurrentHash[6] and $00FF0000) or (CurrentHash[5] and $0000FF00) or (CurrentHash[4] and $000000FF); Inc(CurrentHash[3],temp); Move(CurrentHash,Digest,128 div 8); {$ELSE} {$IFDEF DIGEST160} temp:= (CurrentHash[7] and $3F) or (CurrentHash[6] and ($7F shl 25)) or (CurrentHash[5] and ($3F shl 19)); Inc(CurrentHash[0],(temp shr 19) or (temp shl 13)); temp:= (CurrentHash[7] and ($3F shl 6)) or (CurrentHash[6] and $3F) or (CurrentHash[5] and ($7F shl 25)); Inc(CurrentHash[1],(temp shr 25) or (temp shl 7)); temp:= (CurrentHash[7] and ($7F shl 12)) or (CurrentHash[6] and ($3F shl 6)) or (CurrentHash[5] and $3F); Inc(CurrentHash[2],temp); temp:= (CurrentHash[7] and ($3F shl 19)) or (CurrentHash[6] and ($7F shl 12)) or (CurrentHash[5] and ($3F shl 6)); Inc(CurrentHash[3],temp shr 6); temp:= (CurrentHash[7] and ($7F shl 25)) or (CurrentHash[6] and ($3F shl 19)) or (CurrentHash[5] and ($7F shl 12)); Inc(CurrentHash[4],temp shr 12); Move(CurrentHash,Digest,160 div 8); {$ELSE} {$IFDEF DIGEST192} temp:= (CurrentHash[7] and $1F) or (CurrentHash[6] and ($3F shl 26)); Inc(CurrentHash[0],(temp shr 26) or (temp shl 6)); temp:= (CurrentHash[7] and ($1F shl 5)) or (CurrentHash[6] and $1F); Inc(CurrentHash[1],temp); temp:= (CurrentHash[7] and ($3F shl 10)) or (CurrentHash[6] and ($1F shl 5)); Inc(CurrentHash[2],temp shr 5); temp:= (CurrentHash[7] and ($1F shl 16)) or (CurrentHash[6] and ($3F shl 10)); Inc(CurrentHash[3],temp shr 10); temp:= (CurrentHash[7] and ($1F shl 21)) or (CurrentHash[6] and ($1F shl 16)); Inc(CurrentHash[4],temp shr 16); temp:= (CurrentHash[7] and ($3F shl 26)) or (CurrentHash[6] and ($1F shl 21)); Inc(CurrentHash[5],temp shr 21); Move(CurrentHash,Digest,192 div 8); {$ELSE} {$IFDEF DIGEST224} Inc(CurrentHash[0],(CurrentHash[7] shr 27) and $1F); Inc(CurrentHash[1],(CurrentHash[7] shr 22) and $1F); Inc(CurrentHash[2],(CurrentHash[7] shr 18) and $F); Inc(CurrentHash[3],(CurrentHash[7] shr 13) and $1F); Inc(CurrentHash[4],(CurrentHash[7] shr 9) and $F); Inc(CurrentHash[5],(CurrentHash[7] shr 4) and $1F); Inc(CurrentHash[6],CurrentHash[7] and $F); Move(CurrentHash,Digest,224 div 8); {$ELSE} Move(CurrentHash,Digest,256 div 8); {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} Burn; end; end. doublecmd-0.5.8/components/dcpcrypt/Hashes/dcpsha1.pas0000644000175000017500000003550112014201074021761 0ustar alexxalexx{******************************************************************************} {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********} {******************************************************************************} {* A binary compatible implementation of SHA1 *********************************} {******************************************************************************} {* Copyright (c) 1999-2002 David Barton *} {* Permission is hereby granted, free of charge, to any person obtaining a *} {* copy of this software and associated documentation files (the "Software"), *} {* to deal in the Software without restriction, including without limitation *} {* the rights to use, copy, modify, merge, publish, distribute, sublicense, *} {* and/or sell copies of the Software, and to permit persons to whom the *} {* Software is furnished to do so, subject to the following conditions: *} {* *} {* The above copyright notice and this permission notice shall be included in *} {* all copies or substantial portions of the Software. *} {* *} {* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *} {* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *} {* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *} {* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *} {* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *} {* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *} {* DEALINGS IN THE SOFTWARE. *} {******************************************************************************} unit DCPsha1; {$MODE Delphi} interface uses Classes, Sysutils, DCPcrypt2, DCPconst; type TDCP_sha1= class(TDCP_hash) protected LenHi, LenLo: longword; Index: DWord; CurrentHash: array[0..4] of DWord; HashBuffer: array[0..63] of byte; procedure Compress; public class function GetId: integer; override; class function GetAlgorithm: string; override; class function GetHashSize: integer; override; class function SelfTest: boolean; override; procedure Init; override; procedure Final(var Digest); override; procedure Burn; override; procedure Update(const Buffer; Size: longword); override; end; {******************************************************************************} {******************************************************************************} implementation {$R-}{$Q-} function SwapDWord(a: dword): dword; begin Result:= ((a and $FF) shl 24) or ((a and $FF00) shl 8) or ((a and $FF0000) shr 8) or ((a and $FF000000) shr 24); end; procedure TDCP_sha1.Compress; var A, B, C, D, E: DWord; W: array[0..79] of DWord; i: longword; begin Index:= 0; dcpFillChar(W, SizeOf(W), 0); Move(HashBuffer,W,Sizeof(HashBuffer)); for i:= 0 to 15 do W[i]:= SwapDWord(W[i]); for i:= 16 to 79 do W[i]:= ((W[i-3] xor W[i-8] xor W[i-14] xor W[i-16]) shl 1) or ((W[i-3] xor W[i-8] xor W[i-14] xor W[i-16]) shr 31); A:= CurrentHash[0]; B:= CurrentHash[1]; C:= CurrentHash[2]; D:= CurrentHash[3]; E:= CurrentHash[4]; Inc(E,((A shl 5) or (A shr 27)) + (D xor (B and (C xor D))) + $5A827999 + W[ 0]); B:= (B shl 30) or (B shr 2); Inc(D,((E shl 5) or (E shr 27)) + (C xor (A and (B xor C))) + $5A827999 + W[ 1]); A:= (A shl 30) or (A shr 2); Inc(C,((D shl 5) or (D shr 27)) + (B xor (E and (A xor B))) + $5A827999 + W[ 2]); E:= (E shl 30) or (E shr 2); Inc(B,((C shl 5) or (C shr 27)) + (A xor (D and (E xor A))) + $5A827999 + W[ 3]); D:= (D shl 30) or (D shr 2); Inc(A,((B shl 5) or (B shr 27)) + (E xor (C and (D xor E))) + $5A827999 + W[ 4]); C:= (C shl 30) or (C shr 2); Inc(E,((A shl 5) or (A shr 27)) + (D xor (B and (C xor D))) + $5A827999 + W[ 5]); B:= (B shl 30) or (B shr 2); Inc(D,((E shl 5) or (E shr 27)) + (C xor (A and (B xor C))) + $5A827999 + W[ 6]); A:= (A shl 30) or (A shr 2); Inc(C,((D shl 5) or (D shr 27)) + (B xor (E and (A xor B))) + $5A827999 + W[ 7]); E:= (E shl 30) or (E shr 2); Inc(B,((C shl 5) or (C shr 27)) + (A xor (D and (E xor A))) + $5A827999 + W[ 8]); D:= (D shl 30) or (D shr 2); Inc(A,((B shl 5) or (B shr 27)) + (E xor (C and (D xor E))) + $5A827999 + W[ 9]); C:= (C shl 30) or (C shr 2); Inc(E,((A shl 5) or (A shr 27)) + (D xor (B and (C xor D))) + $5A827999 + W[10]); B:= (B shl 30) or (B shr 2); Inc(D,((E shl 5) or (E shr 27)) + (C xor (A and (B xor C))) + $5A827999 + W[11]); A:= (A shl 30) or (A shr 2); Inc(C,((D shl 5) or (D shr 27)) + (B xor (E and (A xor B))) + $5A827999 + W[12]); E:= (E shl 30) or (E shr 2); Inc(B,((C shl 5) or (C shr 27)) + (A xor (D and (E xor A))) + $5A827999 + W[13]); D:= (D shl 30) or (D shr 2); Inc(A,((B shl 5) or (B shr 27)) + (E xor (C and (D xor E))) + $5A827999 + W[14]); C:= (C shl 30) or (C shr 2); Inc(E,((A shl 5) or (A shr 27)) + (D xor (B and (C xor D))) + $5A827999 + W[15]); B:= (B shl 30) or (B shr 2); Inc(D,((E shl 5) or (E shr 27)) + (C xor (A and (B xor C))) + $5A827999 + W[16]); A:= (A shl 30) or (A shr 2); Inc(C,((D shl 5) or (D shr 27)) + (B xor (E and (A xor B))) + $5A827999 + W[17]); E:= (E shl 30) or (E shr 2); Inc(B,((C shl 5) or (C shr 27)) + (A xor (D and (E xor A))) + $5A827999 + W[18]); D:= (D shl 30) or (D shr 2); Inc(A,((B shl 5) or (B shr 27)) + (E xor (C and (D xor E))) + $5A827999 + W[19]); C:= (C shl 30) or (C shr 2); Inc(E,((A shl 5) or (A shr 27)) + (B xor C xor D) + $6ED9EBA1 + W[20]); B:= (B shl 30) or (B shr 2); Inc(D,((E shl 5) or (E shr 27)) + (A xor B xor C) + $6ED9EBA1 + W[21]); A:= (A shl 30) or (A shr 2); Inc(C,((D shl 5) or (D shr 27)) + (E xor A xor B) + $6ED9EBA1 + W[22]); E:= (E shl 30) or (E shr 2); Inc(B,((C shl 5) or (C shr 27)) + (D xor E xor A) + $6ED9EBA1 + W[23]); D:= (D shl 30) or (D shr 2); Inc(A,((B shl 5) or (B shr 27)) + (C xor D xor E) + $6ED9EBA1 + W[24]); C:= (C shl 30) or (C shr 2); Inc(E,((A shl 5) or (A shr 27)) + (B xor C xor D) + $6ED9EBA1 + W[25]); B:= (B shl 30) or (B shr 2); Inc(D,((E shl 5) or (E shr 27)) + (A xor B xor C) + $6ED9EBA1 + W[26]); A:= (A shl 30) or (A shr 2); Inc(C,((D shl 5) or (D shr 27)) + (E xor A xor B) + $6ED9EBA1 + W[27]); E:= (E shl 30) or (E shr 2); Inc(B,((C shl 5) or (C shr 27)) + (D xor E xor A) + $6ED9EBA1 + W[28]); D:= (D shl 30) or (D shr 2); Inc(A,((B shl 5) or (B shr 27)) + (C xor D xor E) + $6ED9EBA1 + W[29]); C:= (C shl 30) or (C shr 2); Inc(E,((A shl 5) or (A shr 27)) + (B xor C xor D) + $6ED9EBA1 + W[30]); B:= (B shl 30) or (B shr 2); Inc(D,((E shl 5) or (E shr 27)) + (A xor B xor C) + $6ED9EBA1 + W[31]); A:= (A shl 30) or (A shr 2); Inc(C,((D shl 5) or (D shr 27)) + (E xor A xor B) + $6ED9EBA1 + W[32]); E:= (E shl 30) or (E shr 2); Inc(B,((C shl 5) or (C shr 27)) + (D xor E xor A) + $6ED9EBA1 + W[33]); D:= (D shl 30) or (D shr 2); Inc(A,((B shl 5) or (B shr 27)) + (C xor D xor E) + $6ED9EBA1 + W[34]); C:= (C shl 30) or (C shr 2); Inc(E,((A shl 5) or (A shr 27)) + (B xor C xor D) + $6ED9EBA1 + W[35]); B:= (B shl 30) or (B shr 2); Inc(D,((E shl 5) or (E shr 27)) + (A xor B xor C) + $6ED9EBA1 + W[36]); A:= (A shl 30) or (A shr 2); Inc(C,((D shl 5) or (D shr 27)) + (E xor A xor B) + $6ED9EBA1 + W[37]); E:= (E shl 30) or (E shr 2); Inc(B,((C shl 5) or (C shr 27)) + (D xor E xor A) + $6ED9EBA1 + W[38]); D:= (D shl 30) or (D shr 2); Inc(A,((B shl 5) or (B shr 27)) + (C xor D xor E) + $6ED9EBA1 + W[39]); C:= (C shl 30) or (C shr 2); Inc(E,((A shl 5) or (A shr 27)) + ((B and C) or (D and (B or C))) + $8F1BBCDC + W[40]); B:= (B shl 30) or (B shr 2); Inc(D,((E shl 5) or (E shr 27)) + ((A and B) or (C and (A or B))) + $8F1BBCDC + W[41]); A:= (A shl 30) or (A shr 2); Inc(C,((D shl 5) or (D shr 27)) + ((E and A) or (B and (E or A))) + $8F1BBCDC + W[42]); E:= (E shl 30) or (E shr 2); Inc(B,((C shl 5) or (C shr 27)) + ((D and E) or (A and (D or E))) + $8F1BBCDC + W[43]); D:= (D shl 30) or (D shr 2); Inc(A,((B shl 5) or (B shr 27)) + ((C and D) or (E and (C or D))) + $8F1BBCDC + W[44]); C:= (C shl 30) or (C shr 2); Inc(E,((A shl 5) or (A shr 27)) + ((B and C) or (D and (B or C))) + $8F1BBCDC + W[45]); B:= (B shl 30) or (B shr 2); Inc(D,((E shl 5) or (E shr 27)) + ((A and B) or (C and (A or B))) + $8F1BBCDC + W[46]); A:= (A shl 30) or (A shr 2); Inc(C,((D shl 5) or (D shr 27)) + ((E and A) or (B and (E or A))) + $8F1BBCDC + W[47]); E:= (E shl 30) or (E shr 2); Inc(B,((C shl 5) or (C shr 27)) + ((D and E) or (A and (D or E))) + $8F1BBCDC + W[48]); D:= (D shl 30) or (D shr 2); Inc(A,((B shl 5) or (B shr 27)) + ((C and D) or (E and (C or D))) + $8F1BBCDC + W[49]); C:= (C shl 30) or (C shr 2); Inc(E,((A shl 5) or (A shr 27)) + ((B and C) or (D and (B or C))) + $8F1BBCDC + W[50]); B:= (B shl 30) or (B shr 2); Inc(D,((E shl 5) or (E shr 27)) + ((A and B) or (C and (A or B))) + $8F1BBCDC + W[51]); A:= (A shl 30) or (A shr 2); Inc(C,((D shl 5) or (D shr 27)) + ((E and A) or (B and (E or A))) + $8F1BBCDC + W[52]); E:= (E shl 30) or (E shr 2); Inc(B,((C shl 5) or (C shr 27)) + ((D and E) or (A and (D or E))) + $8F1BBCDC + W[53]); D:= (D shl 30) or (D shr 2); Inc(A,((B shl 5) or (B shr 27)) + ((C and D) or (E and (C or D))) + $8F1BBCDC + W[54]); C:= (C shl 30) or (C shr 2); Inc(E,((A shl 5) or (A shr 27)) + ((B and C) or (D and (B or C))) + $8F1BBCDC + W[55]); B:= (B shl 30) or (B shr 2); Inc(D,((E shl 5) or (E shr 27)) + ((A and B) or (C and (A or B))) + $8F1BBCDC + W[56]); A:= (A shl 30) or (A shr 2); Inc(C,((D shl 5) or (D shr 27)) + ((E and A) or (B and (E or A))) + $8F1BBCDC + W[57]); E:= (E shl 30) or (E shr 2); Inc(B,((C shl 5) or (C shr 27)) + ((D and E) or (A and (D or E))) + $8F1BBCDC + W[58]); D:= (D shl 30) or (D shr 2); Inc(A,((B shl 5) or (B shr 27)) + ((C and D) or (E and (C or D))) + $8F1BBCDC + W[59]); C:= (C shl 30) or (C shr 2); Inc(E,((A shl 5) or (A shr 27)) + (B xor C xor D) + $CA62C1D6 + W[60]); B:= (B shl 30) or (B shr 2); Inc(D,((E shl 5) or (E shr 27)) + (A xor B xor C) + $CA62C1D6 + W[61]); A:= (A shl 30) or (A shr 2); Inc(C,((D shl 5) or (D shr 27)) + (E xor A xor B) + $CA62C1D6 + W[62]); E:= (E shl 30) or (E shr 2); Inc(B,((C shl 5) or (C shr 27)) + (D xor E xor A) + $CA62C1D6 + W[63]); D:= (D shl 30) or (D shr 2); Inc(A,((B shl 5) or (B shr 27)) + (C xor D xor E) + $CA62C1D6 + W[64]); C:= (C shl 30) or (C shr 2); Inc(E,((A shl 5) or (A shr 27)) + (B xor C xor D) + $CA62C1D6 + W[65]); B:= (B shl 30) or (B shr 2); Inc(D,((E shl 5) or (E shr 27)) + (A xor B xor C) + $CA62C1D6 + W[66]); A:= (A shl 30) or (A shr 2); Inc(C,((D shl 5) or (D shr 27)) + (E xor A xor B) + $CA62C1D6 + W[67]); E:= (E shl 30) or (E shr 2); Inc(B,((C shl 5) or (C shr 27)) + (D xor E xor A) + $CA62C1D6 + W[68]); D:= (D shl 30) or (D shr 2); Inc(A,((B shl 5) or (B shr 27)) + (C xor D xor E) + $CA62C1D6 + W[69]); C:= (C shl 30) or (C shr 2); Inc(E,((A shl 5) or (A shr 27)) + (B xor C xor D) + $CA62C1D6 + W[70]); B:= (B shl 30) or (B shr 2); Inc(D,((E shl 5) or (E shr 27)) + (A xor B xor C) + $CA62C1D6 + W[71]); A:= (A shl 30) or (A shr 2); Inc(C,((D shl 5) or (D shr 27)) + (E xor A xor B) + $CA62C1D6 + W[72]); E:= (E shl 30) or (E shr 2); Inc(B,((C shl 5) or (C shr 27)) + (D xor E xor A) + $CA62C1D6 + W[73]); D:= (D shl 30) or (D shr 2); Inc(A,((B shl 5) or (B shr 27)) + (C xor D xor E) + $CA62C1D6 + W[74]); C:= (C shl 30) or (C shr 2); Inc(E,((A shl 5) or (A shr 27)) + (B xor C xor D) + $CA62C1D6 + W[75]); B:= (B shl 30) or (B shr 2); Inc(D,((E shl 5) or (E shr 27)) + (A xor B xor C) + $CA62C1D6 + W[76]); A:= (A shl 30) or (A shr 2); Inc(C,((D shl 5) or (D shr 27)) + (E xor A xor B) + $CA62C1D6 + W[77]); E:= (E shl 30) or (E shr 2); Inc(B,((C shl 5) or (C shr 27)) + (D xor E xor A) + $CA62C1D6 + W[78]); D:= (D shl 30) or (D shr 2); Inc(A,((B shl 5) or (B shr 27)) + (C xor D xor E) + $CA62C1D6 + W[79]); C:= (C shl 30) or (C shr 2); CurrentHash[0]:= CurrentHash[0] + A; CurrentHash[1]:= CurrentHash[1] + B; CurrentHash[2]:= CurrentHash[2] + C; CurrentHash[3]:= CurrentHash[3] + D; CurrentHash[4]:= CurrentHash[4] + E; FillChar(W,Sizeof(W),0); FillChar(HashBuffer,Sizeof(HashBuffer),0); end; class function TDCP_sha1.GetAlgorithm: string; begin Result:= 'SHA1'; end; class function TDCP_sha1.GetId: integer; begin Result:= DCP_sha1; end; class function TDCP_sha1.GetHashSize: integer; begin Result:= 160; end; class function TDCP_sha1.SelfTest: boolean; const Test1Out: array[0..19] of byte= ($A9,$99,$3E,$36,$47,$06,$81,$6A,$BA,$3E,$25,$71,$78,$50,$C2,$6C,$9C,$D0,$D8,$9D); Test2Out: array[0..19] of byte= ($84,$98,$3E,$44,$1C,$3B,$D2,$6E,$BA,$AE,$4A,$A1,$F9,$51,$29,$E5,$E5,$46,$70,$F1); var TestHash: TDCP_sha1; TestOut: array[0..19] of byte; begin dcpFillChar(TestOut, SizeOf(TestOut), 0); TestHash:= TDCP_sha1.Create(nil); TestHash.Init; TestHash.UpdateStr('abc'); TestHash.Final(TestOut); Result:= boolean(CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out))); TestHash.Init; TestHash.UpdateStr('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'); TestHash.Final(TestOut); Result:= boolean(CompareMem(@TestOut,@Test2Out,Sizeof(Test2Out))) and Result; TestHash.Free; end; procedure TDCP_sha1.Init; begin Burn; CurrentHash[0]:= $67452301; CurrentHash[1]:= $EFCDAB89; CurrentHash[2]:= $98BADCFE; CurrentHash[3]:= $10325476; CurrentHash[4]:= $C3D2E1F0; fInitialized:= true; end; procedure TDCP_sha1.Burn; begin LenHi:= 0; LenLo:= 0; Index:= 0; FillChar(HashBuffer,Sizeof(HashBuffer),0); FillChar(CurrentHash,Sizeof(CurrentHash),0); fInitialized:= false; end; procedure TDCP_sha1.Update(const Buffer; Size: longword); var PBuf: ^byte; begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); Inc(LenHi,Size shr 29); Inc(LenLo,Size*8); if LenLo< (Size*8) then Inc(LenHi); PBuf:= @Buffer; while Size> 0 do begin if (Sizeof(HashBuffer)-Index)<= DWord(Size) then begin Move(PBuf^,HashBuffer[Index],Sizeof(HashBuffer)-Index); Dec(Size,Sizeof(HashBuffer)-Index); Inc(PBuf,Sizeof(HashBuffer)-Index); Compress; end else begin Move(PBuf^,HashBuffer[Index],Size); Inc(Index,Size); Size:= 0; end; end; end; procedure TDCP_sha1.Final(var Digest); begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); HashBuffer[Index]:= $80; if Index>= 56 then Compress; PDWord(@HashBuffer[56])^:= SwapDWord(LenHi); PDWord(@HashBuffer[60])^:= SwapDWord(LenLo); Compress; CurrentHash[0]:= SwapDWord(CurrentHash[0]); CurrentHash[1]:= SwapDWord(CurrentHash[1]); CurrentHash[2]:= SwapDWord(CurrentHash[2]); CurrentHash[3]:= SwapDWord(CurrentHash[3]); CurrentHash[4]:= SwapDWord(CurrentHash[4]); Move(CurrentHash,Digest,Sizeof(CurrentHash)); Burn; end; end. doublecmd-0.5.8/components/dcpcrypt/Hashes/dcpsha256.pas0000644000175000017500000006624312014201074022144 0ustar alexxalexx{******************************************************************************} {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********} {******************************************************************************} {* A binary compatible implementation of SHA256 *******************************} {******************************************************************************} {* Copyright (c) 1999-2002 David Barton *} {* Permission is hereby granted, free of charge, to any person obtaining a *} {* copy of this software and associated documentation files (the "Software"), *} {* to deal in the Software without restriction, including without limitation *} {* the rights to use, copy, modify, merge, publish, distribute, sublicense, *} {* and/or sell copies of the Software, and to permit persons to whom the *} {* Software is furnished to do so, subject to the following conditions: *} {* *} {* The above copyright notice and this permission notice shall be included in *} {* all copies or substantial portions of the Software. *} {* *} {* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *} {* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *} {* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *} {* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *} {* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *} {* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *} {* DEALINGS IN THE SOFTWARE. *} {******************************************************************************} unit DCPsha256; {$MODE Delphi} interface uses Classes, Sysutils, DCPcrypt2, DCPconst; type TDCP_sha256= class(TDCP_hash) protected LenHi, LenLo: longword; Index: DWord; CurrentHash: array[0..7] of DWord; HashBuffer: array[0..63] of byte; procedure Compress; public class function GetId: integer; override; class function GetAlgorithm: string; override; class function GetHashSize: integer; override; class function SelfTest: boolean; override; procedure Init; override; procedure Final(var Digest); override; procedure Burn; override; procedure Update(const Buffer; Size: longword); override; end; {******************************************************************************} {******************************************************************************} implementation {$R-}{$Q-} function SwapDWord(a: dword): dword; begin Result:= ((a and $FF) shl 24) or ((a and $FF00) shl 8) or ((a and $FF0000) shr 8) or ((a and $FF000000) shr 24); end; procedure TDCP_sha256.Compress; var a, b, c, d, e, f, g, h, t1, t2: DWord; W: array[0..63] of DWord; i: longword; begin Index:= 0; dcpFillChar(W, SizeOf(W), 0); a:= CurrentHash[0]; b:= CurrentHash[1]; c:= CurrentHash[2]; d:= CurrentHash[3]; e:= CurrentHash[4]; f:= CurrentHash[5]; g:= CurrentHash[6]; h:= CurrentHash[7]; Move(HashBuffer,W,Sizeof(HashBuffer)); for i:= 0 to 15 do W[i]:= SwapDWord(W[i]); for i:= 16 to 63 do W[i]:= (((W[i-2] shr 17) or (W[i-2] shl 15)) xor ((W[i-2] shr 19) or (W[i-2] shl 13)) xor (W[i-2] shr 10)) + W[i-7] + (((W[i-15] shr 7) or (W[i-15] shl 25)) xor ((W[i-15] shr 18) or (W[i-15] shl 14)) xor (W[i-15] shr 3)) + W[i-16]; { Non-optimised version for i:= 0 to 63 do begin t1:= h + (((e shr 6) or (e shl 26)) xor ((e shr 11) or (e shl 21)) xor ((e shr 25) or (e shl 7))) + ((e and f) xor (not e and g)) + K[i] + W[i]; t2:= (((a shr 2) or (a shl 30)) xor ((a shr 13) or (a shl 19)) xor ((a shr 22) xor (a shl 10))) + ((a and b) xor (a and c) xor (b and c)); h:= g; g:= f; f:= e; e:= d + t1; d:= c; c:= b; b:= a; a:= t1 + t2; end; } t1:= h + (((e shr 6) or (e shl 26)) xor ((e shr 11) or (e shl 21)) xor ((e shr 25) or (e shl 7))) + ((e and f) xor (not e and g)) + $428a2f98 + W[0]; t2:= (((a shr 2) or (a shl 30)) xor ((a shr 13) or (a shl 19)) xor ((a shr 22) xor (a shl 10))) + ((a and b) xor (a and c) xor (b and c)); h:= t1 + t2; d:= d + t1; t1:= g + (((d shr 6) or (d shl 26)) xor ((d shr 11) or (d shl 21)) xor ((d shr 25) or (d shl 7))) + ((d and e) xor (not d and f)) + $71374491 + W[1]; t2:= (((h shr 2) or (h shl 30)) xor ((h shr 13) or (h shl 19)) xor ((h shr 22) xor (h shl 10))) + ((h and a) xor (h and b) xor (a and b)); g:= t1 + t2; c:= c + t1; t1:= f + (((c shr 6) or (c shl 26)) xor ((c shr 11) or (c shl 21)) xor ((c shr 25) or (c shl 7))) + ((c and d) xor (not c and e)) + $b5c0fbcf + W[2]; t2:= (((g shr 2) or (g shl 30)) xor ((g shr 13) or (g shl 19)) xor ((g shr 22) xor (g shl 10))) + ((g and h) xor (g and a) xor (h and a)); f:= t1 + t2; b:= b + t1; t1:= e + (((b shr 6) or (b shl 26)) xor ((b shr 11) or (b shl 21)) xor ((b shr 25) or (b shl 7))) + ((b and c) xor (not b and d)) + $e9b5dba5 + W[3]; t2:= (((f shr 2) or (f shl 30)) xor ((f shr 13) or (f shl 19)) xor ((f shr 22) xor (f shl 10))) + ((f and g) xor (f and h) xor (g and h)); e:= t1 + t2; a:= a + t1; t1:= d + (((a shr 6) or (a shl 26)) xor ((a shr 11) or (a shl 21)) xor ((a shr 25) or (a shl 7))) + ((a and b) xor (not a and c)) + $3956c25b + W[4]; t2:= (((e shr 2) or (e shl 30)) xor ((e shr 13) or (e shl 19)) xor ((e shr 22) xor (e shl 10))) + ((e and f) xor (e and g) xor (f and g)); d:= t1 + t2; h:= h + t1; t1:= c + (((h shr 6) or (h shl 26)) xor ((h shr 11) or (h shl 21)) xor ((h shr 25) or (h shl 7))) + ((h and a) xor (not h and b)) + $59f111f1 + W[5]; t2:= (((d shr 2) or (d shl 30)) xor ((d shr 13) or (d shl 19)) xor ((d shr 22) xor (d shl 10))) + ((d and e) xor (d and f) xor (e and f)); c:= t1 + t2; g:= g + t1; t1:= b + (((g shr 6) or (g shl 26)) xor ((g shr 11) or (g shl 21)) xor ((g shr 25) or (g shl 7))) + ((g and h) xor (not g and a)) + $923f82a4 + W[6]; t2:= (((c shr 2) or (c shl 30)) xor ((c shr 13) or (c shl 19)) xor ((c shr 22) xor (c shl 10))) + ((c and d) xor (c and e) xor (d and e)); b:= t1 + t2; f:= f + t1; t1:= a + (((f shr 6) or (f shl 26)) xor ((f shr 11) or (f shl 21)) xor ((f shr 25) or (f shl 7))) + ((f and g) xor (not f and h)) + $ab1c5ed5 + W[7]; t2:= (((b shr 2) or (b shl 30)) xor ((b shr 13) or (b shl 19)) xor ((b shr 22) xor (b shl 10))) + ((b and c) xor (b and d) xor (c and d)); a:= t1 + t2; e:= e + t1; t1:= h + (((e shr 6) or (e shl 26)) xor ((e shr 11) or (e shl 21)) xor ((e shr 25) or (e shl 7))) + ((e and f) xor (not e and g)) + $d807aa98 + W[8]; t2:= (((a shr 2) or (a shl 30)) xor ((a shr 13) or (a shl 19)) xor ((a shr 22) xor (a shl 10))) + ((a and b) xor (a and c) xor (b and c)); h:= t1 + t2; d:= d + t1; t1:= g + (((d shr 6) or (d shl 26)) xor ((d shr 11) or (d shl 21)) xor ((d shr 25) or (d shl 7))) + ((d and e) xor (not d and f)) + $12835b01 + W[9]; t2:= (((h shr 2) or (h shl 30)) xor ((h shr 13) or (h shl 19)) xor ((h shr 22) xor (h shl 10))) + ((h and a) xor (h and b) xor (a and b)); g:= t1 + t2; c:= c + t1; t1:= f + (((c shr 6) or (c shl 26)) xor ((c shr 11) or (c shl 21)) xor ((c shr 25) or (c shl 7))) + ((c and d) xor (not c and e)) + $243185be + W[10]; t2:= (((g shr 2) or (g shl 30)) xor ((g shr 13) or (g shl 19)) xor ((g shr 22) xor (g shl 10))) + ((g and h) xor (g and a) xor (h and a)); f:= t1 + t2; b:= b + t1; t1:= e + (((b shr 6) or (b shl 26)) xor ((b shr 11) or (b shl 21)) xor ((b shr 25) or (b shl 7))) + ((b and c) xor (not b and d)) + $550c7dc3 + W[11]; t2:= (((f shr 2) or (f shl 30)) xor ((f shr 13) or (f shl 19)) xor ((f shr 22) xor (f shl 10))) + ((f and g) xor (f and h) xor (g and h)); e:= t1 + t2; a:= a + t1; t1:= d + (((a shr 6) or (a shl 26)) xor ((a shr 11) or (a shl 21)) xor ((a shr 25) or (a shl 7))) + ((a and b) xor (not a and c)) + $72be5d74 + W[12]; t2:= (((e shr 2) or (e shl 30)) xor ((e shr 13) or (e shl 19)) xor ((e shr 22) xor (e shl 10))) + ((e and f) xor (e and g) xor (f and g)); d:= t1 + t2; h:= h + t1; t1:= c + (((h shr 6) or (h shl 26)) xor ((h shr 11) or (h shl 21)) xor ((h shr 25) or (h shl 7))) + ((h and a) xor (not h and b)) + $80deb1fe + W[13]; t2:= (((d shr 2) or (d shl 30)) xor ((d shr 13) or (d shl 19)) xor ((d shr 22) xor (d shl 10))) + ((d and e) xor (d and f) xor (e and f)); c:= t1 + t2; g:= g + t1; t1:= b + (((g shr 6) or (g shl 26)) xor ((g shr 11) or (g shl 21)) xor ((g shr 25) or (g shl 7))) + ((g and h) xor (not g and a)) + $9bdc06a7 + W[14]; t2:= (((c shr 2) or (c shl 30)) xor ((c shr 13) or (c shl 19)) xor ((c shr 22) xor (c shl 10))) + ((c and d) xor (c and e) xor (d and e)); b:= t1 + t2; f:= f + t1; t1:= a + (((f shr 6) or (f shl 26)) xor ((f shr 11) or (f shl 21)) xor ((f shr 25) or (f shl 7))) + ((f and g) xor (not f and h)) + $c19bf174 + W[15]; t2:= (((b shr 2) or (b shl 30)) xor ((b shr 13) or (b shl 19)) xor ((b shr 22) xor (b shl 10))) + ((b and c) xor (b and d) xor (c and d)); a:= t1 + t2; e:= e + t1; t1:= h + (((e shr 6) or (e shl 26)) xor ((e shr 11) or (e shl 21)) xor ((e shr 25) or (e shl 7))) + ((e and f) xor (not e and g)) + $e49b69c1 + W[16]; t2:= (((a shr 2) or (a shl 30)) xor ((a shr 13) or (a shl 19)) xor ((a shr 22) xor (a shl 10))) + ((a and b) xor (a and c) xor (b and c)); h:= t1 + t2; d:= d + t1; t1:= g + (((d shr 6) or (d shl 26)) xor ((d shr 11) or (d shl 21)) xor ((d shr 25) or (d shl 7))) + ((d and e) xor (not d and f)) + $efbe4786 + W[17]; t2:= (((h shr 2) or (h shl 30)) xor ((h shr 13) or (h shl 19)) xor ((h shr 22) xor (h shl 10))) + ((h and a) xor (h and b) xor (a and b)); g:= t1 + t2; c:= c + t1; t1:= f + (((c shr 6) or (c shl 26)) xor ((c shr 11) or (c shl 21)) xor ((c shr 25) or (c shl 7))) + ((c and d) xor (not c and e)) + $0fc19dc6 + W[18]; t2:= (((g shr 2) or (g shl 30)) xor ((g shr 13) or (g shl 19)) xor ((g shr 22) xor (g shl 10))) + ((g and h) xor (g and a) xor (h and a)); f:= t1 + t2; b:= b + t1; t1:= e + (((b shr 6) or (b shl 26)) xor ((b shr 11) or (b shl 21)) xor ((b shr 25) or (b shl 7))) + ((b and c) xor (not b and d)) + $240ca1cc + W[19]; t2:= (((f shr 2) or (f shl 30)) xor ((f shr 13) or (f shl 19)) xor ((f shr 22) xor (f shl 10))) + ((f and g) xor (f and h) xor (g and h)); e:= t1 + t2; a:= a + t1; t1:= d + (((a shr 6) or (a shl 26)) xor ((a shr 11) or (a shl 21)) xor ((a shr 25) or (a shl 7))) + ((a and b) xor (not a and c)) + $2de92c6f + W[20]; t2:= (((e shr 2) or (e shl 30)) xor ((e shr 13) or (e shl 19)) xor ((e shr 22) xor (e shl 10))) + ((e and f) xor (e and g) xor (f and g)); d:= t1 + t2; h:= h + t1; t1:= c + (((h shr 6) or (h shl 26)) xor ((h shr 11) or (h shl 21)) xor ((h shr 25) or (h shl 7))) + ((h and a) xor (not h and b)) + $4a7484aa + W[21]; t2:= (((d shr 2) or (d shl 30)) xor ((d shr 13) or (d shl 19)) xor ((d shr 22) xor (d shl 10))) + ((d and e) xor (d and f) xor (e and f)); c:= t1 + t2; g:= g + t1; t1:= b + (((g shr 6) or (g shl 26)) xor ((g shr 11) or (g shl 21)) xor ((g shr 25) or (g shl 7))) + ((g and h) xor (not g and a)) + $5cb0a9dc + W[22]; t2:= (((c shr 2) or (c shl 30)) xor ((c shr 13) or (c shl 19)) xor ((c shr 22) xor (c shl 10))) + ((c and d) xor (c and e) xor (d and e)); b:= t1 + t2; f:= f + t1; t1:= a + (((f shr 6) or (f shl 26)) xor ((f shr 11) or (f shl 21)) xor ((f shr 25) or (f shl 7))) + ((f and g) xor (not f and h)) + $76f988da + W[23]; t2:= (((b shr 2) or (b shl 30)) xor ((b shr 13) or (b shl 19)) xor ((b shr 22) xor (b shl 10))) + ((b and c) xor (b and d) xor (c and d)); a:= t1 + t2; e:= e + t1; t1:= h + (((e shr 6) or (e shl 26)) xor ((e shr 11) or (e shl 21)) xor ((e shr 25) or (e shl 7))) + ((e and f) xor (not e and g)) + $983e5152 + W[24]; t2:= (((a shr 2) or (a shl 30)) xor ((a shr 13) or (a shl 19)) xor ((a shr 22) xor (a shl 10))) + ((a and b) xor (a and c) xor (b and c)); h:= t1 + t2; d:= d + t1; t1:= g + (((d shr 6) or (d shl 26)) xor ((d shr 11) or (d shl 21)) xor ((d shr 25) or (d shl 7))) + ((d and e) xor (not d and f)) + $a831c66d + W[25]; t2:= (((h shr 2) or (h shl 30)) xor ((h shr 13) or (h shl 19)) xor ((h shr 22) xor (h shl 10))) + ((h and a) xor (h and b) xor (a and b)); g:= t1 + t2; c:= c + t1; t1:= f + (((c shr 6) or (c shl 26)) xor ((c shr 11) or (c shl 21)) xor ((c shr 25) or (c shl 7))) + ((c and d) xor (not c and e)) + $b00327c8 + W[26]; t2:= (((g shr 2) or (g shl 30)) xor ((g shr 13) or (g shl 19)) xor ((g shr 22) xor (g shl 10))) + ((g and h) xor (g and a) xor (h and a)); f:= t1 + t2; b:= b + t1; t1:= e + (((b shr 6) or (b shl 26)) xor ((b shr 11) or (b shl 21)) xor ((b shr 25) or (b shl 7))) + ((b and c) xor (not b and d)) + $bf597fc7 + W[27]; t2:= (((f shr 2) or (f shl 30)) xor ((f shr 13) or (f shl 19)) xor ((f shr 22) xor (f shl 10))) + ((f and g) xor (f and h) xor (g and h)); e:= t1 + t2; a:= a + t1; t1:= d + (((a shr 6) or (a shl 26)) xor ((a shr 11) or (a shl 21)) xor ((a shr 25) or (a shl 7))) + ((a and b) xor (not a and c)) + $c6e00bf3 + W[28]; t2:= (((e shr 2) or (e shl 30)) xor ((e shr 13) or (e shl 19)) xor ((e shr 22) xor (e shl 10))) + ((e and f) xor (e and g) xor (f and g)); d:= t1 + t2; h:= h + t1; t1:= c + (((h shr 6) or (h shl 26)) xor ((h shr 11) or (h shl 21)) xor ((h shr 25) or (h shl 7))) + ((h and a) xor (not h and b)) + $d5a79147 + W[29]; t2:= (((d shr 2) or (d shl 30)) xor ((d shr 13) or (d shl 19)) xor ((d shr 22) xor (d shl 10))) + ((d and e) xor (d and f) xor (e and f)); c:= t1 + t2; g:= g + t1; t1:= b + (((g shr 6) or (g shl 26)) xor ((g shr 11) or (g shl 21)) xor ((g shr 25) or (g shl 7))) + ((g and h) xor (not g and a)) + $06ca6351 + W[30]; t2:= (((c shr 2) or (c shl 30)) xor ((c shr 13) or (c shl 19)) xor ((c shr 22) xor (c shl 10))) + ((c and d) xor (c and e) xor (d and e)); b:= t1 + t2; f:= f + t1; t1:= a + (((f shr 6) or (f shl 26)) xor ((f shr 11) or (f shl 21)) xor ((f shr 25) or (f shl 7))) + ((f and g) xor (not f and h)) + $14292967 + W[31]; t2:= (((b shr 2) or (b shl 30)) xor ((b shr 13) or (b shl 19)) xor ((b shr 22) xor (b shl 10))) + ((b and c) xor (b and d) xor (c and d)); a:= t1 + t2; e:= e + t1; t1:= h + (((e shr 6) or (e shl 26)) xor ((e shr 11) or (e shl 21)) xor ((e shr 25) or (e shl 7))) + ((e and f) xor (not e and g)) + $27b70a85 + W[32]; t2:= (((a shr 2) or (a shl 30)) xor ((a shr 13) or (a shl 19)) xor ((a shr 22) xor (a shl 10))) + ((a and b) xor (a and c) xor (b and c)); h:= t1 + t2; d:= d + t1; t1:= g + (((d shr 6) or (d shl 26)) xor ((d shr 11) or (d shl 21)) xor ((d shr 25) or (d shl 7))) + ((d and e) xor (not d and f)) + $2e1b2138 + W[33]; t2:= (((h shr 2) or (h shl 30)) xor ((h shr 13) or (h shl 19)) xor ((h shr 22) xor (h shl 10))) + ((h and a) xor (h and b) xor (a and b)); g:= t1 + t2; c:= c + t1; t1:= f + (((c shr 6) or (c shl 26)) xor ((c shr 11) or (c shl 21)) xor ((c shr 25) or (c shl 7))) + ((c and d) xor (not c and e)) + $4d2c6dfc + W[34]; t2:= (((g shr 2) or (g shl 30)) xor ((g shr 13) or (g shl 19)) xor ((g shr 22) xor (g shl 10))) + ((g and h) xor (g and a) xor (h and a)); f:= t1 + t2; b:= b + t1; t1:= e + (((b shr 6) or (b shl 26)) xor ((b shr 11) or (b shl 21)) xor ((b shr 25) or (b shl 7))) + ((b and c) xor (not b and d)) + $53380d13 + W[35]; t2:= (((f shr 2) or (f shl 30)) xor ((f shr 13) or (f shl 19)) xor ((f shr 22) xor (f shl 10))) + ((f and g) xor (f and h) xor (g and h)); e:= t1 + t2; a:= a + t1; t1:= d + (((a shr 6) or (a shl 26)) xor ((a shr 11) or (a shl 21)) xor ((a shr 25) or (a shl 7))) + ((a and b) xor (not a and c)) + $650a7354 + W[36]; t2:= (((e shr 2) or (e shl 30)) xor ((e shr 13) or (e shl 19)) xor ((e shr 22) xor (e shl 10))) + ((e and f) xor (e and g) xor (f and g)); d:= t1 + t2; h:= h + t1; t1:= c + (((h shr 6) or (h shl 26)) xor ((h shr 11) or (h shl 21)) xor ((h shr 25) or (h shl 7))) + ((h and a) xor (not h and b)) + $766a0abb + W[37]; t2:= (((d shr 2) or (d shl 30)) xor ((d shr 13) or (d shl 19)) xor ((d shr 22) xor (d shl 10))) + ((d and e) xor (d and f) xor (e and f)); c:= t1 + t2; g:= g + t1; t1:= b + (((g shr 6) or (g shl 26)) xor ((g shr 11) or (g shl 21)) xor ((g shr 25) or (g shl 7))) + ((g and h) xor (not g and a)) + $81c2c92e + W[38]; t2:= (((c shr 2) or (c shl 30)) xor ((c shr 13) or (c shl 19)) xor ((c shr 22) xor (c shl 10))) + ((c and d) xor (c and e) xor (d and e)); b:= t1 + t2; f:= f + t1; t1:= a + (((f shr 6) or (f shl 26)) xor ((f shr 11) or (f shl 21)) xor ((f shr 25) or (f shl 7))) + ((f and g) xor (not f and h)) + $92722c85 + W[39]; t2:= (((b shr 2) or (b shl 30)) xor ((b shr 13) or (b shl 19)) xor ((b shr 22) xor (b shl 10))) + ((b and c) xor (b and d) xor (c and d)); a:= t1 + t2; e:= e + t1; t1:= h + (((e shr 6) or (e shl 26)) xor ((e shr 11) or (e shl 21)) xor ((e shr 25) or (e shl 7))) + ((e and f) xor (not e and g)) + $a2bfe8a1 + W[40]; t2:= (((a shr 2) or (a shl 30)) xor ((a shr 13) or (a shl 19)) xor ((a shr 22) xor (a shl 10))) + ((a and b) xor (a and c) xor (b and c)); h:= t1 + t2; d:= d + t1; t1:= g + (((d shr 6) or (d shl 26)) xor ((d shr 11) or (d shl 21)) xor ((d shr 25) or (d shl 7))) + ((d and e) xor (not d and f)) + $a81a664b + W[41]; t2:= (((h shr 2) or (h shl 30)) xor ((h shr 13) or (h shl 19)) xor ((h shr 22) xor (h shl 10))) + ((h and a) xor (h and b) xor (a and b)); g:= t1 + t2; c:= c + t1; t1:= f + (((c shr 6) or (c shl 26)) xor ((c shr 11) or (c shl 21)) xor ((c shr 25) or (c shl 7))) + ((c and d) xor (not c and e)) + $c24b8b70 + W[42]; t2:= (((g shr 2) or (g shl 30)) xor ((g shr 13) or (g shl 19)) xor ((g shr 22) xor (g shl 10))) + ((g and h) xor (g and a) xor (h and a)); f:= t1 + t2; b:= b + t1; t1:= e + (((b shr 6) or (b shl 26)) xor ((b shr 11) or (b shl 21)) xor ((b shr 25) or (b shl 7))) + ((b and c) xor (not b and d)) + $c76c51a3 + W[43]; t2:= (((f shr 2) or (f shl 30)) xor ((f shr 13) or (f shl 19)) xor ((f shr 22) xor (f shl 10))) + ((f and g) xor (f and h) xor (g and h)); e:= t1 + t2; a:= a + t1; t1:= d + (((a shr 6) or (a shl 26)) xor ((a shr 11) or (a shl 21)) xor ((a shr 25) or (a shl 7))) + ((a and b) xor (not a and c)) + $d192e819 + W[44]; t2:= (((e shr 2) or (e shl 30)) xor ((e shr 13) or (e shl 19)) xor ((e shr 22) xor (e shl 10))) + ((e and f) xor (e and g) xor (f and g)); d:= t1 + t2; h:= h + t1; t1:= c + (((h shr 6) or (h shl 26)) xor ((h shr 11) or (h shl 21)) xor ((h shr 25) or (h shl 7))) + ((h and a) xor (not h and b)) + $d6990624 + W[45]; t2:= (((d shr 2) or (d shl 30)) xor ((d shr 13) or (d shl 19)) xor ((d shr 22) xor (d shl 10))) + ((d and e) xor (d and f) xor (e and f)); c:= t1 + t2; g:= g + t1; t1:= b + (((g shr 6) or (g shl 26)) xor ((g shr 11) or (g shl 21)) xor ((g shr 25) or (g shl 7))) + ((g and h) xor (not g and a)) + $f40e3585 + W[46]; t2:= (((c shr 2) or (c shl 30)) xor ((c shr 13) or (c shl 19)) xor ((c shr 22) xor (c shl 10))) + ((c and d) xor (c and e) xor (d and e)); b:= t1 + t2; f:= f + t1; t1:= a + (((f shr 6) or (f shl 26)) xor ((f shr 11) or (f shl 21)) xor ((f shr 25) or (f shl 7))) + ((f and g) xor (not f and h)) + $106aa070 + W[47]; t2:= (((b shr 2) or (b shl 30)) xor ((b shr 13) or (b shl 19)) xor ((b shr 22) xor (b shl 10))) + ((b and c) xor (b and d) xor (c and d)); a:= t1 + t2; e:= e + t1; t1:= h + (((e shr 6) or (e shl 26)) xor ((e shr 11) or (e shl 21)) xor ((e shr 25) or (e shl 7))) + ((e and f) xor (not e and g)) + $19a4c116 + W[48]; t2:= (((a shr 2) or (a shl 30)) xor ((a shr 13) or (a shl 19)) xor ((a shr 22) xor (a shl 10))) + ((a and b) xor (a and c) xor (b and c)); h:= t1 + t2; d:= d + t1; t1:= g + (((d shr 6) or (d shl 26)) xor ((d shr 11) or (d shl 21)) xor ((d shr 25) or (d shl 7))) + ((d and e) xor (not d and f)) + $1e376c08 + W[49]; t2:= (((h shr 2) or (h shl 30)) xor ((h shr 13) or (h shl 19)) xor ((h shr 22) xor (h shl 10))) + ((h and a) xor (h and b) xor (a and b)); g:= t1 + t2; c:= c + t1; t1:= f + (((c shr 6) or (c shl 26)) xor ((c shr 11) or (c shl 21)) xor ((c shr 25) or (c shl 7))) + ((c and d) xor (not c and e)) + $2748774c + W[50]; t2:= (((g shr 2) or (g shl 30)) xor ((g shr 13) or (g shl 19)) xor ((g shr 22) xor (g shl 10))) + ((g and h) xor (g and a) xor (h and a)); f:= t1 + t2; b:= b + t1; t1:= e + (((b shr 6) or (b shl 26)) xor ((b shr 11) or (b shl 21)) xor ((b shr 25) or (b shl 7))) + ((b and c) xor (not b and d)) + $34b0bcb5 + W[51]; t2:= (((f shr 2) or (f shl 30)) xor ((f shr 13) or (f shl 19)) xor ((f shr 22) xor (f shl 10))) + ((f and g) xor (f and h) xor (g and h)); e:= t1 + t2; a:= a + t1; t1:= d + (((a shr 6) or (a shl 26)) xor ((a shr 11) or (a shl 21)) xor ((a shr 25) or (a shl 7))) + ((a and b) xor (not a and c)) + $391c0cb3 + W[52]; t2:= (((e shr 2) or (e shl 30)) xor ((e shr 13) or (e shl 19)) xor ((e shr 22) xor (e shl 10))) + ((e and f) xor (e and g) xor (f and g)); d:= t1 + t2; h:= h + t1; t1:= c + (((h shr 6) or (h shl 26)) xor ((h shr 11) or (h shl 21)) xor ((h shr 25) or (h shl 7))) + ((h and a) xor (not h and b)) + $4ed8aa4a + W[53]; t2:= (((d shr 2) or (d shl 30)) xor ((d shr 13) or (d shl 19)) xor ((d shr 22) xor (d shl 10))) + ((d and e) xor (d and f) xor (e and f)); c:= t1 + t2; g:= g + t1; t1:= b + (((g shr 6) or (g shl 26)) xor ((g shr 11) or (g shl 21)) xor ((g shr 25) or (g shl 7))) + ((g and h) xor (not g and a)) + $5b9cca4f + W[54]; t2:= (((c shr 2) or (c shl 30)) xor ((c shr 13) or (c shl 19)) xor ((c shr 22) xor (c shl 10))) + ((c and d) xor (c and e) xor (d and e)); b:= t1 + t2; f:= f + t1; t1:= a + (((f shr 6) or (f shl 26)) xor ((f shr 11) or (f shl 21)) xor ((f shr 25) or (f shl 7))) + ((f and g) xor (not f and h)) + $682e6ff3 + W[55]; t2:= (((b shr 2) or (b shl 30)) xor ((b shr 13) or (b shl 19)) xor ((b shr 22) xor (b shl 10))) + ((b and c) xor (b and d) xor (c and d)); a:= t1 + t2; e:= e + t1; t1:= h + (((e shr 6) or (e shl 26)) xor ((e shr 11) or (e shl 21)) xor ((e shr 25) or (e shl 7))) + ((e and f) xor (not e and g)) + $748f82ee + W[56]; t2:= (((a shr 2) or (a shl 30)) xor ((a shr 13) or (a shl 19)) xor ((a shr 22) xor (a shl 10))) + ((a and b) xor (a and c) xor (b and c)); h:= t1 + t2; d:= d + t1; t1:= g + (((d shr 6) or (d shl 26)) xor ((d shr 11) or (d shl 21)) xor ((d shr 25) or (d shl 7))) + ((d and e) xor (not d and f)) + $78a5636f + W[57]; t2:= (((h shr 2) or (h shl 30)) xor ((h shr 13) or (h shl 19)) xor ((h shr 22) xor (h shl 10))) + ((h and a) xor (h and b) xor (a and b)); g:= t1 + t2; c:= c + t1; t1:= f + (((c shr 6) or (c shl 26)) xor ((c shr 11) or (c shl 21)) xor ((c shr 25) or (c shl 7))) + ((c and d) xor (not c and e)) + $84c87814 + W[58]; t2:= (((g shr 2) or (g shl 30)) xor ((g shr 13) or (g shl 19)) xor ((g shr 22) xor (g shl 10))) + ((g and h) xor (g and a) xor (h and a)); f:= t1 + t2; b:= b + t1; t1:= e + (((b shr 6) or (b shl 26)) xor ((b shr 11) or (b shl 21)) xor ((b shr 25) or (b shl 7))) + ((b and c) xor (not b and d)) + $8cc70208 + W[59]; t2:= (((f shr 2) or (f shl 30)) xor ((f shr 13) or (f shl 19)) xor ((f shr 22) xor (f shl 10))) + ((f and g) xor (f and h) xor (g and h)); e:= t1 + t2; a:= a + t1; t1:= d + (((a shr 6) or (a shl 26)) xor ((a shr 11) or (a shl 21)) xor ((a shr 25) or (a shl 7))) + ((a and b) xor (not a and c)) + $90befffa + W[60]; t2:= (((e shr 2) or (e shl 30)) xor ((e shr 13) or (e shl 19)) xor ((e shr 22) xor (e shl 10))) + ((e and f) xor (e and g) xor (f and g)); d:= t1 + t2; h:= h + t1; t1:= c + (((h shr 6) or (h shl 26)) xor ((h shr 11) or (h shl 21)) xor ((h shr 25) or (h shl 7))) + ((h and a) xor (not h and b)) + $a4506ceb + W[61]; t2:= (((d shr 2) or (d shl 30)) xor ((d shr 13) or (d shl 19)) xor ((d shr 22) xor (d shl 10))) + ((d and e) xor (d and f) xor (e and f)); c:= t1 + t2; g:= g + t1; t1:= b + (((g shr 6) or (g shl 26)) xor ((g shr 11) or (g shl 21)) xor ((g shr 25) or (g shl 7))) + ((g and h) xor (not g and a)) + $bef9a3f7 + W[62]; t2:= (((c shr 2) or (c shl 30)) xor ((c shr 13) or (c shl 19)) xor ((c shr 22) xor (c shl 10))) + ((c and d) xor (c and e) xor (d and e)); b:= t1 + t2; f:= f + t1; t1:= a + (((f shr 6) or (f shl 26)) xor ((f shr 11) or (f shl 21)) xor ((f shr 25) or (f shl 7))) + ((f and g) xor (not f and h)) + $c67178f2 + W[63]; t2:= (((b shr 2) or (b shl 30)) xor ((b shr 13) or (b shl 19)) xor ((b shr 22) xor (b shl 10))) + ((b and c) xor (b and d) xor (c and d)); a:= t1 + t2; e:= e + t1; CurrentHash[0]:= CurrentHash[0] + a; CurrentHash[1]:= CurrentHash[1] + b; CurrentHash[2]:= CurrentHash[2] + c; CurrentHash[3]:= CurrentHash[3] + d; CurrentHash[4]:= CurrentHash[4] + e; CurrentHash[5]:= CurrentHash[5] + f; CurrentHash[6]:= CurrentHash[6] + g; CurrentHash[7]:= CurrentHash[7] + h; FillChar(W,Sizeof(W),0); FillChar(HashBuffer,Sizeof(HashBuffer),0); end; class function TDCP_sha256.GetAlgorithm: string; begin Result:= 'SHA256'; end; class function TDCP_sha256.GetId: integer; begin Result:= DCP_sha256; end; class function TDCP_sha256.GetHashSize: integer; begin Result:= 256; end; class function TDCP_sha256.SelfTest: boolean; const Test1Out: array[0..31] of byte= ($ba,$78,$16,$bf,$8f,$01,$cf,$ea,$41,$41,$40,$de,$5d,$ae,$22,$23, $b0,$03,$61,$a3,$96,$17,$7a,$9c,$b4,$10,$ff,$61,$f2,$00,$15,$ad); Test2Out: array[0..31] of byte= ($24,$8d,$6a,$61,$d2,$06,$38,$b8,$e5,$c0,$26,$93,$0c,$3e,$60,$39, $a3,$3c,$e4,$59,$64,$ff,$21,$67,$f6,$ec,$ed,$d4,$19,$db,$06,$c1); var TestHash: TDCP_sha256; TestOut: array[0..31] of byte; begin dcpFillChar(TestOut, SizeOf(TestOut), 0); TestHash:= TDCP_sha256.Create(nil); TestHash.Init; TestHash.UpdateStr('abc'); TestHash.Final(TestOut); Result:= boolean(CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out))); TestHash.Init; TestHash.UpdateStr('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'); TestHash.Final(TestOut); Result:= boolean(CompareMem(@TestOut,@Test2Out,Sizeof(Test2Out))) and Result; TestHash.Free; end; procedure TDCP_sha256.Init; begin Burn; CurrentHash[0]:= $6a09e667; CurrentHash[1]:= $bb67ae85; CurrentHash[2]:= $3c6ef372; CurrentHash[3]:= $a54ff53a; CurrentHash[4]:= $510e527f; CurrentHash[5]:= $9b05688c; CurrentHash[6]:= $1f83d9ab; CurrentHash[7]:= $5be0cd19; fInitialized:= true; end; procedure TDCP_sha256.Burn; begin LenHi:= 0; LenLo:= 0; Index:= 0; FillChar(HashBuffer,Sizeof(HashBuffer),0); FillChar(CurrentHash,Sizeof(CurrentHash),0); fInitialized:= false; end; procedure TDCP_sha256.Update(const Buffer; Size: longword); var PBuf: ^byte; begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); Inc(LenHi,Size shr 29); Inc(LenLo,Size*8); if LenLo< (Size*8) then Inc(LenHi); PBuf:= @Buffer; while Size> 0 do begin if (Sizeof(HashBuffer)-Index)<= DWord(Size) then begin Move(PBuf^,HashBuffer[Index],Sizeof(HashBuffer)-Index); Dec(Size,Sizeof(HashBuffer)-Index); Inc(PBuf,Sizeof(HashBuffer)-Index); Compress; end else begin Move(PBuf^,HashBuffer[Index],Size); Inc(Index,Size); Size:= 0; end; end; end; procedure TDCP_sha256.Final(var Digest); begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); HashBuffer[Index]:= $80; if Index>= 56 then Compress; PDWord(@HashBuffer[56])^:= SwapDWord(LenHi); PDWord(@HashBuffer[60])^:= SwapDWord(LenLo); Compress; CurrentHash[0]:= SwapDWord(CurrentHash[0]); CurrentHash[1]:= SwapDWord(CurrentHash[1]); CurrentHash[2]:= SwapDWord(CurrentHash[2]); CurrentHash[3]:= SwapDWord(CurrentHash[3]); CurrentHash[4]:= SwapDWord(CurrentHash[4]); CurrentHash[5]:= SwapDWord(CurrentHash[5]); CurrentHash[6]:= SwapDWord(CurrentHash[6]); CurrentHash[7]:= SwapDWord(CurrentHash[7]); Move(CurrentHash,Digest,Sizeof(CurrentHash)); Burn; end; end. doublecmd-0.5.8/components/dcpcrypt/Hashes/dcpsha512.pas0000644000175000017500000011037212014201074022130 0ustar alexxalexx{******************************************************************************} {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********} {******************************************************************************} {* A binary compatible implementation of SHA512 *******************************} {******************************************************************************} {* Copyright (c) 1999-2002 David Barton *} {* Permission is hereby granted, free of charge, to any person obtaining a *} {* copy of this software and associated documentation files (the "Software"), *} {* to deal in the Software without restriction, including without limitation *} {* the rights to use, copy, modify, merge, publish, distribute, sublicense, *} {* and/or sell copies of the Software, and to permit persons to whom the *} {* Software is furnished to do so, subject to the following conditions: *} {* *} {* The above copyright notice and this permission notice shall be included in *} {* all copies or substantial portions of the Software. *} {* *} {* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *} {* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *} {* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *} {* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *} {* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *} {* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *} {* DEALINGS IN THE SOFTWARE. *} {******************************************************************************} unit DCPsha512; {$MODE Delphi} interface uses Classes, Sysutils, DCPcrypt2, DCPconst; type TDCP_sha512base= class(TDCP_hash) protected LenHi, LenLo: int64; Index: DWord; CurrentHash: array[0..7] of int64; HashBuffer: array[0..127] of byte; procedure Compress; public procedure Update(const Buffer; Size: longword); override; procedure Burn; override; end; TDCP_sha384= class(TDCP_sha512base) public class function GetId: integer; override; class function GetAlgorithm: string; override; class function GetHashSize: integer; override; class function SelfTest: boolean; override; procedure Init; override; procedure Final(var Digest); override; end; TDCP_sha512= class(TDCP_sha512base) public class function GetId: integer; override; class function GetAlgorithm: string; override; class function GetHashSize: integer; override; class function SelfTest: boolean; override; procedure Init; override; procedure Final(var Digest); override; end; {******************************************************************************} {******************************************************************************} implementation {$R-}{$Q-} function SwapDWord(a: int64): int64; begin Result:= ((a and $FF) shl 56) or ((a and $FF00) shl 40) or ((a and $FF0000) shl 24) or ((a and $FF000000) shl 8) or ((a and $FF00000000) shr 8) or ((a and $FF0000000000) shr 24) or ((a and $FF000000000000) shr 40) or ((a and $FF00000000000000) shr 56); end; procedure TDCP_sha512base.Compress; var a, b, c, d, e, f, g, h, t1, t2: int64; W: array[0..79] of int64; i: longword; begin Index:= 0; dcpFillChar(W, SizeOf(W), 0); a:= CurrentHash[0]; b:= CurrentHash[1]; c:= CurrentHash[2]; d:= CurrentHash[3]; e:= CurrentHash[4]; f:= CurrentHash[5]; g:= CurrentHash[6]; h:= CurrentHash[7]; Move(HashBuffer,W,Sizeof(HashBuffer)); for i:= 0 to 15 do W[i]:= SwapDWord(W[i]); for i:= 16 to 79 do W[i]:= (((W[i-2] shr 19) or (W[i-2] shl 45)) xor ((W[i-2] shr 61) or (W[i-2] shl 3)) xor (W[i-2] shr 6)) + W[i-7] + (((W[i-15] shr 1) or (W[i-15] shl 63)) xor ((W[i-15] shr 8) or (W[i-15] shl 56)) xor (W[i-15] shr 7)) + W[i-16]; { Non-optimised version for i:= 0 to 79 do begin t1:= h + (((e shr 14) or (e shl 50)) xor ((e shr 18) or (e shl 46)) xor ((e shr 41) or (e shl 23))) + ((e and f) xor (not e and g)) + K[i] + W[i]; t2:= (((a shr 28) or (a shl 36)) xor ((a shr 34) or (a shl 30)) xor ((a shr 39) or (a shl 25))) + ((a and b) xor (a and c) xor (b and c)); h:= g; g:= f; f:= e; e:= d + t1; d:= c; c:= b; b:= a; a:= t1 + t2; end; } t1:= h + (((e shr 14) or (e shl 50)) xor ((e shr 18) or (e shl 46)) xor ((e shr 41) or (e shl 23))) + ((e and f) xor (not e and g)) + $428a2f98d728ae22 + W[0]; t2:= (((a shr 28) or (a shl 36)) xor ((a shr 34) or (a shl 30)) xor ((a shr 39) or (a shl 25))) + ((a and b) xor (a and c) xor (b and c)); d:= d + t1; h:= t1 + t2; t1:= g + (((d shr 14) or (d shl 50)) xor ((d shr 18) or (d shl 46)) xor ((d shr 41) or (d shl 23))) + ((d and e) xor (not d and f)) + $7137449123ef65cd + W[1]; t2:= (((h shr 28) or (h shl 36)) xor ((h shr 34) or (h shl 30)) xor ((h shr 39) or (h shl 25))) + ((h and a) xor (h and b) xor (a and b)); c:= c + t1; g:= t1 + t2; t1:= f + (((c shr 14) or (c shl 50)) xor ((c shr 18) or (c shl 46)) xor ((c shr 41) or (c shl 23))) + ((c and d) xor (not c and e)) + $b5c0fbcfec4d3b2f + W[2]; t2:= (((g shr 28) or (g shl 36)) xor ((g shr 34) or (g shl 30)) xor ((g shr 39) or (g shl 25))) + ((g and h) xor (g and a) xor (h and a)); b:= b + t1; f:= t1 + t2; t1:= e + (((b shr 14) or (b shl 50)) xor ((b shr 18) or (b shl 46)) xor ((b shr 41) or (b shl 23))) + ((b and c) xor (not b and d)) + $e9b5dba58189dbbc + W[3]; t2:= (((f shr 28) or (f shl 36)) xor ((f shr 34) or (f shl 30)) xor ((f shr 39) or (f shl 25))) + ((f and g) xor (f and h) xor (g and h)); a:= a + t1; e:= t1 + t2; t1:= d + (((a shr 14) or (a shl 50)) xor ((a shr 18) or (a shl 46)) xor ((a shr 41) or (a shl 23))) + ((a and b) xor (not a and c)) + $3956c25bf348b538 + W[4]; t2:= (((e shr 28) or (e shl 36)) xor ((e shr 34) or (e shl 30)) xor ((e shr 39) or (e shl 25))) + ((e and f) xor (e and g) xor (f and g)); h:= h + t1; d:= t1 + t2; t1:= c + (((h shr 14) or (h shl 50)) xor ((h shr 18) or (h shl 46)) xor ((h shr 41) or (h shl 23))) + ((h and a) xor (not h and b)) + $59f111f1b605d019 + W[5]; t2:= (((d shr 28) or (d shl 36)) xor ((d shr 34) or (d shl 30)) xor ((d shr 39) or (d shl 25))) + ((d and e) xor (d and f) xor (e and f)); g:= g + t1; c:= t1 + t2; t1:= b + (((g shr 14) or (g shl 50)) xor ((g shr 18) or (g shl 46)) xor ((g shr 41) or (g shl 23))) + ((g and h) xor (not g and a)) + $923f82a4af194f9b + W[6]; t2:= (((c shr 28) or (c shl 36)) xor ((c shr 34) or (c shl 30)) xor ((c shr 39) or (c shl 25))) + ((c and d) xor (c and e) xor (d and e)); f:= f + t1; b:= t1 + t2; t1:= a + (((f shr 14) or (f shl 50)) xor ((f shr 18) or (f shl 46)) xor ((f shr 41) or (f shl 23))) + ((f and g) xor (not f and h)) + $ab1c5ed5da6d8118 + W[7]; t2:= (((b shr 28) or (b shl 36)) xor ((b shr 34) or (b shl 30)) xor ((b shr 39) or (b shl 25))) + ((b and c) xor (b and d) xor (c and d)); e:= e + t1; a:= t1 + t2; t1:= h + (((e shr 14) or (e shl 50)) xor ((e shr 18) or (e shl 46)) xor ((e shr 41) or (e shl 23))) + ((e and f) xor (not e and g)) + $d807aa98a3030242 + W[8]; t2:= (((a shr 28) or (a shl 36)) xor ((a shr 34) or (a shl 30)) xor ((a shr 39) or (a shl 25))) + ((a and b) xor (a and c) xor (b and c)); d:= d + t1; h:= t1 + t2; t1:= g + (((d shr 14) or (d shl 50)) xor ((d shr 18) or (d shl 46)) xor ((d shr 41) or (d shl 23))) + ((d and e) xor (not d and f)) + $12835b0145706fbe + W[9]; t2:= (((h shr 28) or (h shl 36)) xor ((h shr 34) or (h shl 30)) xor ((h shr 39) or (h shl 25))) + ((h and a) xor (h and b) xor (a and b)); c:= c + t1; g:= t1 + t2; t1:= f + (((c shr 14) or (c shl 50)) xor ((c shr 18) or (c shl 46)) xor ((c shr 41) or (c shl 23))) + ((c and d) xor (not c and e)) + $243185be4ee4b28c + W[10]; t2:= (((g shr 28) or (g shl 36)) xor ((g shr 34) or (g shl 30)) xor ((g shr 39) or (g shl 25))) + ((g and h) xor (g and a) xor (h and a)); b:= b + t1; f:= t1 + t2; t1:= e + (((b shr 14) or (b shl 50)) xor ((b shr 18) or (b shl 46)) xor ((b shr 41) or (b shl 23))) + ((b and c) xor (not b and d)) + $550c7dc3d5ffb4e2 + W[11]; t2:= (((f shr 28) or (f shl 36)) xor ((f shr 34) or (f shl 30)) xor ((f shr 39) or (f shl 25))) + ((f and g) xor (f and h) xor (g and h)); a:= a + t1; e:= t1 + t2; t1:= d + (((a shr 14) or (a shl 50)) xor ((a shr 18) or (a shl 46)) xor ((a shr 41) or (a shl 23))) + ((a and b) xor (not a and c)) + $72be5d74f27b896f + W[12]; t2:= (((e shr 28) or (e shl 36)) xor ((e shr 34) or (e shl 30)) xor ((e shr 39) or (e shl 25))) + ((e and f) xor (e and g) xor (f and g)); h:= h + t1; d:= t1 + t2; t1:= c + (((h shr 14) or (h shl 50)) xor ((h shr 18) or (h shl 46)) xor ((h shr 41) or (h shl 23))) + ((h and a) xor (not h and b)) + $80deb1fe3b1696b1 + W[13]; t2:= (((d shr 28) or (d shl 36)) xor ((d shr 34) or (d shl 30)) xor ((d shr 39) or (d shl 25))) + ((d and e) xor (d and f) xor (e and f)); g:= g + t1; c:= t1 + t2; t1:= b + (((g shr 14) or (g shl 50)) xor ((g shr 18) or (g shl 46)) xor ((g shr 41) or (g shl 23))) + ((g and h) xor (not g and a)) + $9bdc06a725c71235 + W[14]; t2:= (((c shr 28) or (c shl 36)) xor ((c shr 34) or (c shl 30)) xor ((c shr 39) or (c shl 25))) + ((c and d) xor (c and e) xor (d and e)); f:= f + t1; b:= t1 + t2; t1:= a + (((f shr 14) or (f shl 50)) xor ((f shr 18) or (f shl 46)) xor ((f shr 41) or (f shl 23))) + ((f and g) xor (not f and h)) + $c19bf174cf692694 + W[15]; t2:= (((b shr 28) or (b shl 36)) xor ((b shr 34) or (b shl 30)) xor ((b shr 39) or (b shl 25))) + ((b and c) xor (b and d) xor (c and d)); e:= e + t1; a:= t1 + t2; t1:= h + (((e shr 14) or (e shl 50)) xor ((e shr 18) or (e shl 46)) xor ((e shr 41) or (e shl 23))) + ((e and f) xor (not e and g)) + $e49b69c19ef14ad2 + W[16]; t2:= (((a shr 28) or (a shl 36)) xor ((a shr 34) or (a shl 30)) xor ((a shr 39) or (a shl 25))) + ((a and b) xor (a and c) xor (b and c)); d:= d + t1; h:= t1 + t2; t1:= g + (((d shr 14) or (d shl 50)) xor ((d shr 18) or (d shl 46)) xor ((d shr 41) or (d shl 23))) + ((d and e) xor (not d and f)) + $efbe4786384f25e3 + W[17]; t2:= (((h shr 28) or (h shl 36)) xor ((h shr 34) or (h shl 30)) xor ((h shr 39) or (h shl 25))) + ((h and a) xor (h and b) xor (a and b)); c:= c + t1; g:= t1 + t2; t1:= f + (((c shr 14) or (c shl 50)) xor ((c shr 18) or (c shl 46)) xor ((c shr 41) or (c shl 23))) + ((c and d) xor (not c and e)) + $0fc19dc68b8cd5b5 + W[18]; t2:= (((g shr 28) or (g shl 36)) xor ((g shr 34) or (g shl 30)) xor ((g shr 39) or (g shl 25))) + ((g and h) xor (g and a) xor (h and a)); b:= b + t1; f:= t1 + t2; t1:= e + (((b shr 14) or (b shl 50)) xor ((b shr 18) or (b shl 46)) xor ((b shr 41) or (b shl 23))) + ((b and c) xor (not b and d)) + $240ca1cc77ac9c65 + W[19]; t2:= (((f shr 28) or (f shl 36)) xor ((f shr 34) or (f shl 30)) xor ((f shr 39) or (f shl 25))) + ((f and g) xor (f and h) xor (g and h)); a:= a + t1; e:= t1 + t2; t1:= d + (((a shr 14) or (a shl 50)) xor ((a shr 18) or (a shl 46)) xor ((a shr 41) or (a shl 23))) + ((a and b) xor (not a and c)) + $2de92c6f592b0275 + W[20]; t2:= (((e shr 28) or (e shl 36)) xor ((e shr 34) or (e shl 30)) xor ((e shr 39) or (e shl 25))) + ((e and f) xor (e and g) xor (f and g)); h:= h + t1; d:= t1 + t2; t1:= c + (((h shr 14) or (h shl 50)) xor ((h shr 18) or (h shl 46)) xor ((h shr 41) or (h shl 23))) + ((h and a) xor (not h and b)) + $4a7484aa6ea6e483 + W[21]; t2:= (((d shr 28) or (d shl 36)) xor ((d shr 34) or (d shl 30)) xor ((d shr 39) or (d shl 25))) + ((d and e) xor (d and f) xor (e and f)); g:= g + t1; c:= t1 + t2; t1:= b + (((g shr 14) or (g shl 50)) xor ((g shr 18) or (g shl 46)) xor ((g shr 41) or (g shl 23))) + ((g and h) xor (not g and a)) + $5cb0a9dcbd41fbd4 + W[22]; t2:= (((c shr 28) or (c shl 36)) xor ((c shr 34) or (c shl 30)) xor ((c shr 39) or (c shl 25))) + ((c and d) xor (c and e) xor (d and e)); f:= f + t1; b:= t1 + t2; t1:= a + (((f shr 14) or (f shl 50)) xor ((f shr 18) or (f shl 46)) xor ((f shr 41) or (f shl 23))) + ((f and g) xor (not f and h)) + $76f988da831153b5 + W[23]; t2:= (((b shr 28) or (b shl 36)) xor ((b shr 34) or (b shl 30)) xor ((b shr 39) or (b shl 25))) + ((b and c) xor (b and d) xor (c and d)); e:= e + t1; a:= t1 + t2; t1:= h + (((e shr 14) or (e shl 50)) xor ((e shr 18) or (e shl 46)) xor ((e shr 41) or (e shl 23))) + ((e and f) xor (not e and g)) + $983e5152ee66dfab + W[24]; t2:= (((a shr 28) or (a shl 36)) xor ((a shr 34) or (a shl 30)) xor ((a shr 39) or (a shl 25))) + ((a and b) xor (a and c) xor (b and c)); d:= d + t1; h:= t1 + t2; t1:= g + (((d shr 14) or (d shl 50)) xor ((d shr 18) or (d shl 46)) xor ((d shr 41) or (d shl 23))) + ((d and e) xor (not d and f)) + $a831c66d2db43210 + W[25]; t2:= (((h shr 28) or (h shl 36)) xor ((h shr 34) or (h shl 30)) xor ((h shr 39) or (h shl 25))) + ((h and a) xor (h and b) xor (a and b)); c:= c + t1; g:= t1 + t2; t1:= f + (((c shr 14) or (c shl 50)) xor ((c shr 18) or (c shl 46)) xor ((c shr 41) or (c shl 23))) + ((c and d) xor (not c and e)) + $b00327c898fb213f + W[26]; t2:= (((g shr 28) or (g shl 36)) xor ((g shr 34) or (g shl 30)) xor ((g shr 39) or (g shl 25))) + ((g and h) xor (g and a) xor (h and a)); b:= b + t1; f:= t1 + t2; t1:= e + (((b shr 14) or (b shl 50)) xor ((b shr 18) or (b shl 46)) xor ((b shr 41) or (b shl 23))) + ((b and c) xor (not b and d)) + $bf597fc7beef0ee4 + W[27]; t2:= (((f shr 28) or (f shl 36)) xor ((f shr 34) or (f shl 30)) xor ((f shr 39) or (f shl 25))) + ((f and g) xor (f and h) xor (g and h)); a:= a + t1; e:= t1 + t2; t1:= d + (((a shr 14) or (a shl 50)) xor ((a shr 18) or (a shl 46)) xor ((a shr 41) or (a shl 23))) + ((a and b) xor (not a and c)) + $c6e00bf33da88fc2 + W[28]; t2:= (((e shr 28) or (e shl 36)) xor ((e shr 34) or (e shl 30)) xor ((e shr 39) or (e shl 25))) + ((e and f) xor (e and g) xor (f and g)); h:= h + t1; d:= t1 + t2; t1:= c + (((h shr 14) or (h shl 50)) xor ((h shr 18) or (h shl 46)) xor ((h shr 41) or (h shl 23))) + ((h and a) xor (not h and b)) + $d5a79147930aa725 + W[29]; t2:= (((d shr 28) or (d shl 36)) xor ((d shr 34) or (d shl 30)) xor ((d shr 39) or (d shl 25))) + ((d and e) xor (d and f) xor (e and f)); g:= g + t1; c:= t1 + t2; t1:= b + (((g shr 14) or (g shl 50)) xor ((g shr 18) or (g shl 46)) xor ((g shr 41) or (g shl 23))) + ((g and h) xor (not g and a)) + $06ca6351e003826f + W[30]; t2:= (((c shr 28) or (c shl 36)) xor ((c shr 34) or (c shl 30)) xor ((c shr 39) or (c shl 25))) + ((c and d) xor (c and e) xor (d and e)); f:= f + t1; b:= t1 + t2; t1:= a + (((f shr 14) or (f shl 50)) xor ((f shr 18) or (f shl 46)) xor ((f shr 41) or (f shl 23))) + ((f and g) xor (not f and h)) + $142929670a0e6e70 + W[31]; t2:= (((b shr 28) or (b shl 36)) xor ((b shr 34) or (b shl 30)) xor ((b shr 39) or (b shl 25))) + ((b and c) xor (b and d) xor (c and d)); e:= e + t1; a:= t1 + t2; t1:= h + (((e shr 14) or (e shl 50)) xor ((e shr 18) or (e shl 46)) xor ((e shr 41) or (e shl 23))) + ((e and f) xor (not e and g)) + $27b70a8546d22ffc + W[32]; t2:= (((a shr 28) or (a shl 36)) xor ((a shr 34) or (a shl 30)) xor ((a shr 39) or (a shl 25))) + ((a and b) xor (a and c) xor (b and c)); d:= d + t1; h:= t1 + t2; t1:= g + (((d shr 14) or (d shl 50)) xor ((d shr 18) or (d shl 46)) xor ((d shr 41) or (d shl 23))) + ((d and e) xor (not d and f)) + $2e1b21385c26c926 + W[33]; t2:= (((h shr 28) or (h shl 36)) xor ((h shr 34) or (h shl 30)) xor ((h shr 39) or (h shl 25))) + ((h and a) xor (h and b) xor (a and b)); c:= c + t1; g:= t1 + t2; t1:= f + (((c shr 14) or (c shl 50)) xor ((c shr 18) or (c shl 46)) xor ((c shr 41) or (c shl 23))) + ((c and d) xor (not c and e)) + $4d2c6dfc5ac42aed + W[34]; t2:= (((g shr 28) or (g shl 36)) xor ((g shr 34) or (g shl 30)) xor ((g shr 39) or (g shl 25))) + ((g and h) xor (g and a) xor (h and a)); b:= b + t1; f:= t1 + t2; t1:= e + (((b shr 14) or (b shl 50)) xor ((b shr 18) or (b shl 46)) xor ((b shr 41) or (b shl 23))) + ((b and c) xor (not b and d)) + $53380d139d95b3df + W[35]; t2:= (((f shr 28) or (f shl 36)) xor ((f shr 34) or (f shl 30)) xor ((f shr 39) or (f shl 25))) + ((f and g) xor (f and h) xor (g and h)); a:= a + t1; e:= t1 + t2; t1:= d + (((a shr 14) or (a shl 50)) xor ((a shr 18) or (a shl 46)) xor ((a shr 41) or (a shl 23))) + ((a and b) xor (not a and c)) + $650a73548baf63de + W[36]; t2:= (((e shr 28) or (e shl 36)) xor ((e shr 34) or (e shl 30)) xor ((e shr 39) or (e shl 25))) + ((e and f) xor (e and g) xor (f and g)); h:= h + t1; d:= t1 + t2; t1:= c + (((h shr 14) or (h shl 50)) xor ((h shr 18) or (h shl 46)) xor ((h shr 41) or (h shl 23))) + ((h and a) xor (not h and b)) + $766a0abb3c77b2a8 + W[37]; t2:= (((d shr 28) or (d shl 36)) xor ((d shr 34) or (d shl 30)) xor ((d shr 39) or (d shl 25))) + ((d and e) xor (d and f) xor (e and f)); g:= g + t1; c:= t1 + t2; t1:= b + (((g shr 14) or (g shl 50)) xor ((g shr 18) or (g shl 46)) xor ((g shr 41) or (g shl 23))) + ((g and h) xor (not g and a)) + $81c2c92e47edaee6 + W[38]; t2:= (((c shr 28) or (c shl 36)) xor ((c shr 34) or (c shl 30)) xor ((c shr 39) or (c shl 25))) + ((c and d) xor (c and e) xor (d and e)); f:= f + t1; b:= t1 + t2; t1:= a + (((f shr 14) or (f shl 50)) xor ((f shr 18) or (f shl 46)) xor ((f shr 41) or (f shl 23))) + ((f and g) xor (not f and h)) + $92722c851482353b + W[39]; t2:= (((b shr 28) or (b shl 36)) xor ((b shr 34) or (b shl 30)) xor ((b shr 39) or (b shl 25))) + ((b and c) xor (b and d) xor (c and d)); e:= e + t1; a:= t1 + t2; t1:= h + (((e shr 14) or (e shl 50)) xor ((e shr 18) or (e shl 46)) xor ((e shr 41) or (e shl 23))) + ((e and f) xor (not e and g)) + $a2bfe8a14cf10364 + W[40]; t2:= (((a shr 28) or (a shl 36)) xor ((a shr 34) or (a shl 30)) xor ((a shr 39) or (a shl 25))) + ((a and b) xor (a and c) xor (b and c)); d:= d + t1; h:= t1 + t2; t1:= g + (((d shr 14) or (d shl 50)) xor ((d shr 18) or (d shl 46)) xor ((d shr 41) or (d shl 23))) + ((d and e) xor (not d and f)) + $a81a664bbc423001 + W[41]; t2:= (((h shr 28) or (h shl 36)) xor ((h shr 34) or (h shl 30)) xor ((h shr 39) or (h shl 25))) + ((h and a) xor (h and b) xor (a and b)); c:= c + t1; g:= t1 + t2; t1:= f + (((c shr 14) or (c shl 50)) xor ((c shr 18) or (c shl 46)) xor ((c shr 41) or (c shl 23))) + ((c and d) xor (not c and e)) + $c24b8b70d0f89791 + W[42]; t2:= (((g shr 28) or (g shl 36)) xor ((g shr 34) or (g shl 30)) xor ((g shr 39) or (g shl 25))) + ((g and h) xor (g and a) xor (h and a)); b:= b + t1; f:= t1 + t2; t1:= e + (((b shr 14) or (b shl 50)) xor ((b shr 18) or (b shl 46)) xor ((b shr 41) or (b shl 23))) + ((b and c) xor (not b and d)) + $c76c51a30654be30 + W[43]; t2:= (((f shr 28) or (f shl 36)) xor ((f shr 34) or (f shl 30)) xor ((f shr 39) or (f shl 25))) + ((f and g) xor (f and h) xor (g and h)); a:= a + t1; e:= t1 + t2; t1:= d + (((a shr 14) or (a shl 50)) xor ((a shr 18) or (a shl 46)) xor ((a shr 41) or (a shl 23))) + ((a and b) xor (not a and c)) + $d192e819d6ef5218 + W[44]; t2:= (((e shr 28) or (e shl 36)) xor ((e shr 34) or (e shl 30)) xor ((e shr 39) or (e shl 25))) + ((e and f) xor (e and g) xor (f and g)); h:= h + t1; d:= t1 + t2; t1:= c + (((h shr 14) or (h shl 50)) xor ((h shr 18) or (h shl 46)) xor ((h shr 41) or (h shl 23))) + ((h and a) xor (not h and b)) + $d69906245565a910 + W[45]; t2:= (((d shr 28) or (d shl 36)) xor ((d shr 34) or (d shl 30)) xor ((d shr 39) or (d shl 25))) + ((d and e) xor (d and f) xor (e and f)); g:= g + t1; c:= t1 + t2; t1:= b + (((g shr 14) or (g shl 50)) xor ((g shr 18) or (g shl 46)) xor ((g shr 41) or (g shl 23))) + ((g and h) xor (not g and a)) + $f40e35855771202a + W[46]; t2:= (((c shr 28) or (c shl 36)) xor ((c shr 34) or (c shl 30)) xor ((c shr 39) or (c shl 25))) + ((c and d) xor (c and e) xor (d and e)); f:= f + t1; b:= t1 + t2; t1:= a + (((f shr 14) or (f shl 50)) xor ((f shr 18) or (f shl 46)) xor ((f shr 41) or (f shl 23))) + ((f and g) xor (not f and h)) + $106aa07032bbd1b8 + W[47]; t2:= (((b shr 28) or (b shl 36)) xor ((b shr 34) or (b shl 30)) xor ((b shr 39) or (b shl 25))) + ((b and c) xor (b and d) xor (c and d)); e:= e + t1; a:= t1 + t2; t1:= h + (((e shr 14) or (e shl 50)) xor ((e shr 18) or (e shl 46)) xor ((e shr 41) or (e shl 23))) + ((e and f) xor (not e and g)) + $19a4c116b8d2d0c8 + W[48]; t2:= (((a shr 28) or (a shl 36)) xor ((a shr 34) or (a shl 30)) xor ((a shr 39) or (a shl 25))) + ((a and b) xor (a and c) xor (b and c)); d:= d + t1; h:= t1 + t2; t1:= g + (((d shr 14) or (d shl 50)) xor ((d shr 18) or (d shl 46)) xor ((d shr 41) or (d shl 23))) + ((d and e) xor (not d and f)) + $1e376c085141ab53 + W[49]; t2:= (((h shr 28) or (h shl 36)) xor ((h shr 34) or (h shl 30)) xor ((h shr 39) or (h shl 25))) + ((h and a) xor (h and b) xor (a and b)); c:= c + t1; g:= t1 + t2; t1:= f + (((c shr 14) or (c shl 50)) xor ((c shr 18) or (c shl 46)) xor ((c shr 41) or (c shl 23))) + ((c and d) xor (not c and e)) + $2748774cdf8eeb99 + W[50]; t2:= (((g shr 28) or (g shl 36)) xor ((g shr 34) or (g shl 30)) xor ((g shr 39) or (g shl 25))) + ((g and h) xor (g and a) xor (h and a)); b:= b + t1; f:= t1 + t2; t1:= e + (((b shr 14) or (b shl 50)) xor ((b shr 18) or (b shl 46)) xor ((b shr 41) or (b shl 23))) + ((b and c) xor (not b and d)) + $34b0bcb5e19b48a8 + W[51]; t2:= (((f shr 28) or (f shl 36)) xor ((f shr 34) or (f shl 30)) xor ((f shr 39) or (f shl 25))) + ((f and g) xor (f and h) xor (g and h)); a:= a + t1; e:= t1 + t2; t1:= d + (((a shr 14) or (a shl 50)) xor ((a shr 18) or (a shl 46)) xor ((a shr 41) or (a shl 23))) + ((a and b) xor (not a and c)) + $391c0cb3c5c95a63 + W[52]; t2:= (((e shr 28) or (e shl 36)) xor ((e shr 34) or (e shl 30)) xor ((e shr 39) or (e shl 25))) + ((e and f) xor (e and g) xor (f and g)); h:= h + t1; d:= t1 + t2; t1:= c + (((h shr 14) or (h shl 50)) xor ((h shr 18) or (h shl 46)) xor ((h shr 41) or (h shl 23))) + ((h and a) xor (not h and b)) + $4ed8aa4ae3418acb + W[53]; t2:= (((d shr 28) or (d shl 36)) xor ((d shr 34) or (d shl 30)) xor ((d shr 39) or (d shl 25))) + ((d and e) xor (d and f) xor (e and f)); g:= g + t1; c:= t1 + t2; t1:= b + (((g shr 14) or (g shl 50)) xor ((g shr 18) or (g shl 46)) xor ((g shr 41) or (g shl 23))) + ((g and h) xor (not g and a)) + $5b9cca4f7763e373 + W[54]; t2:= (((c shr 28) or (c shl 36)) xor ((c shr 34) or (c shl 30)) xor ((c shr 39) or (c shl 25))) + ((c and d) xor (c and e) xor (d and e)); f:= f + t1; b:= t1 + t2; t1:= a + (((f shr 14) or (f shl 50)) xor ((f shr 18) or (f shl 46)) xor ((f shr 41) or (f shl 23))) + ((f and g) xor (not f and h)) + $682e6ff3d6b2b8a3 + W[55]; t2:= (((b shr 28) or (b shl 36)) xor ((b shr 34) or (b shl 30)) xor ((b shr 39) or (b shl 25))) + ((b and c) xor (b and d) xor (c and d)); e:= e + t1; a:= t1 + t2; t1:= h + (((e shr 14) or (e shl 50)) xor ((e shr 18) or (e shl 46)) xor ((e shr 41) or (e shl 23))) + ((e and f) xor (not e and g)) + $748f82ee5defb2fc + W[56]; t2:= (((a shr 28) or (a shl 36)) xor ((a shr 34) or (a shl 30)) xor ((a shr 39) or (a shl 25))) + ((a and b) xor (a and c) xor (b and c)); d:= d + t1; h:= t1 + t2; t1:= g + (((d shr 14) or (d shl 50)) xor ((d shr 18) or (d shl 46)) xor ((d shr 41) or (d shl 23))) + ((d and e) xor (not d and f)) + $78a5636f43172f60 + W[57]; t2:= (((h shr 28) or (h shl 36)) xor ((h shr 34) or (h shl 30)) xor ((h shr 39) or (h shl 25))) + ((h and a) xor (h and b) xor (a and b)); c:= c + t1; g:= t1 + t2; t1:= f + (((c shr 14) or (c shl 50)) xor ((c shr 18) or (c shl 46)) xor ((c shr 41) or (c shl 23))) + ((c and d) xor (not c and e)) + $84c87814a1f0ab72 + W[58]; t2:= (((g shr 28) or (g shl 36)) xor ((g shr 34) or (g shl 30)) xor ((g shr 39) or (g shl 25))) + ((g and h) xor (g and a) xor (h and a)); b:= b + t1; f:= t1 + t2; t1:= e + (((b shr 14) or (b shl 50)) xor ((b shr 18) or (b shl 46)) xor ((b shr 41) or (b shl 23))) + ((b and c) xor (not b and d)) + $8cc702081a6439ec + W[59]; t2:= (((f shr 28) or (f shl 36)) xor ((f shr 34) or (f shl 30)) xor ((f shr 39) or (f shl 25))) + ((f and g) xor (f and h) xor (g and h)); a:= a + t1; e:= t1 + t2; t1:= d + (((a shr 14) or (a shl 50)) xor ((a shr 18) or (a shl 46)) xor ((a shr 41) or (a shl 23))) + ((a and b) xor (not a and c)) + $90befffa23631e28 + W[60]; t2:= (((e shr 28) or (e shl 36)) xor ((e shr 34) or (e shl 30)) xor ((e shr 39) or (e shl 25))) + ((e and f) xor (e and g) xor (f and g)); h:= h + t1; d:= t1 + t2; t1:= c + (((h shr 14) or (h shl 50)) xor ((h shr 18) or (h shl 46)) xor ((h shr 41) or (h shl 23))) + ((h and a) xor (not h and b)) + $a4506cebde82bde9 + W[61]; t2:= (((d shr 28) or (d shl 36)) xor ((d shr 34) or (d shl 30)) xor ((d shr 39) or (d shl 25))) + ((d and e) xor (d and f) xor (e and f)); g:= g + t1; c:= t1 + t2; t1:= b + (((g shr 14) or (g shl 50)) xor ((g shr 18) or (g shl 46)) xor ((g shr 41) or (g shl 23))) + ((g and h) xor (not g and a)) + $bef9a3f7b2c67915 + W[62]; t2:= (((c shr 28) or (c shl 36)) xor ((c shr 34) or (c shl 30)) xor ((c shr 39) or (c shl 25))) + ((c and d) xor (c and e) xor (d and e)); f:= f + t1; b:= t1 + t2; t1:= a + (((f shr 14) or (f shl 50)) xor ((f shr 18) or (f shl 46)) xor ((f shr 41) or (f shl 23))) + ((f and g) xor (not f and h)) + $c67178f2e372532b + W[63]; t2:= (((b shr 28) or (b shl 36)) xor ((b shr 34) or (b shl 30)) xor ((b shr 39) or (b shl 25))) + ((b and c) xor (b and d) xor (c and d)); e:= e + t1; a:= t1 + t2; t1:= h + (((e shr 14) or (e shl 50)) xor ((e shr 18) or (e shl 46)) xor ((e shr 41) or (e shl 23))) + ((e and f) xor (not e and g)) + $ca273eceea26619c + W[64]; t2:= (((a shr 28) or (a shl 36)) xor ((a shr 34) or (a shl 30)) xor ((a shr 39) or (a shl 25))) + ((a and b) xor (a and c) xor (b and c)); d:= d + t1; h:= t1 + t2; t1:= g + (((d shr 14) or (d shl 50)) xor ((d shr 18) or (d shl 46)) xor ((d shr 41) or (d shl 23))) + ((d and e) xor (not d and f)) + $d186b8c721c0c207 + W[65]; t2:= (((h shr 28) or (h shl 36)) xor ((h shr 34) or (h shl 30)) xor ((h shr 39) or (h shl 25))) + ((h and a) xor (h and b) xor (a and b)); c:= c + t1; g:= t1 + t2; t1:= f + (((c shr 14) or (c shl 50)) xor ((c shr 18) or (c shl 46)) xor ((c shr 41) or (c shl 23))) + ((c and d) xor (not c and e)) + $eada7dd6cde0eb1e + W[66]; t2:= (((g shr 28) or (g shl 36)) xor ((g shr 34) or (g shl 30)) xor ((g shr 39) or (g shl 25))) + ((g and h) xor (g and a) xor (h and a)); b:= b + t1; f:= t1 + t2; t1:= e + (((b shr 14) or (b shl 50)) xor ((b shr 18) or (b shl 46)) xor ((b shr 41) or (b shl 23))) + ((b and c) xor (not b and d)) + $f57d4f7fee6ed178 + W[67]; t2:= (((f shr 28) or (f shl 36)) xor ((f shr 34) or (f shl 30)) xor ((f shr 39) or (f shl 25))) + ((f and g) xor (f and h) xor (g and h)); a:= a + t1; e:= t1 + t2; t1:= d + (((a shr 14) or (a shl 50)) xor ((a shr 18) or (a shl 46)) xor ((a shr 41) or (a shl 23))) + ((a and b) xor (not a and c)) + $06f067aa72176fba + W[68]; t2:= (((e shr 28) or (e shl 36)) xor ((e shr 34) or (e shl 30)) xor ((e shr 39) or (e shl 25))) + ((e and f) xor (e and g) xor (f and g)); h:= h + t1; d:= t1 + t2; t1:= c + (((h shr 14) or (h shl 50)) xor ((h shr 18) or (h shl 46)) xor ((h shr 41) or (h shl 23))) + ((h and a) xor (not h and b)) + $0a637dc5a2c898a6 + W[69]; t2:= (((d shr 28) or (d shl 36)) xor ((d shr 34) or (d shl 30)) xor ((d shr 39) or (d shl 25))) + ((d and e) xor (d and f) xor (e and f)); g:= g + t1; c:= t1 + t2; t1:= b + (((g shr 14) or (g shl 50)) xor ((g shr 18) or (g shl 46)) xor ((g shr 41) or (g shl 23))) + ((g and h) xor (not g and a)) + $113f9804bef90dae + W[70]; t2:= (((c shr 28) or (c shl 36)) xor ((c shr 34) or (c shl 30)) xor ((c shr 39) or (c shl 25))) + ((c and d) xor (c and e) xor (d and e)); f:= f + t1; b:= t1 + t2; t1:= a + (((f shr 14) or (f shl 50)) xor ((f shr 18) or (f shl 46)) xor ((f shr 41) or (f shl 23))) + ((f and g) xor (not f and h)) + $1b710b35131c471b + W[71]; t2:= (((b shr 28) or (b shl 36)) xor ((b shr 34) or (b shl 30)) xor ((b shr 39) or (b shl 25))) + ((b and c) xor (b and d) xor (c and d)); e:= e + t1; a:= t1 + t2; t1:= h + (((e shr 14) or (e shl 50)) xor ((e shr 18) or (e shl 46)) xor ((e shr 41) or (e shl 23))) + ((e and f) xor (not e and g)) + $28db77f523047d84 + W[72]; t2:= (((a shr 28) or (a shl 36)) xor ((a shr 34) or (a shl 30)) xor ((a shr 39) or (a shl 25))) + ((a and b) xor (a and c) xor (b and c)); d:= d + t1; h:= t1 + t2; t1:= g + (((d shr 14) or (d shl 50)) xor ((d shr 18) or (d shl 46)) xor ((d shr 41) or (d shl 23))) + ((d and e) xor (not d and f)) + $32caab7b40c72493 + W[73]; t2:= (((h shr 28) or (h shl 36)) xor ((h shr 34) or (h shl 30)) xor ((h shr 39) or (h shl 25))) + ((h and a) xor (h and b) xor (a and b)); c:= c + t1; g:= t1 + t2; t1:= f + (((c shr 14) or (c shl 50)) xor ((c shr 18) or (c shl 46)) xor ((c shr 41) or (c shl 23))) + ((c and d) xor (not c and e)) + $3c9ebe0a15c9bebc + W[74]; t2:= (((g shr 28) or (g shl 36)) xor ((g shr 34) or (g shl 30)) xor ((g shr 39) or (g shl 25))) + ((g and h) xor (g and a) xor (h and a)); b:= b + t1; f:= t1 + t2; t1:= e + (((b shr 14) or (b shl 50)) xor ((b shr 18) or (b shl 46)) xor ((b shr 41) or (b shl 23))) + ((b and c) xor (not b and d)) + $431d67c49c100d4c + W[75]; t2:= (((f shr 28) or (f shl 36)) xor ((f shr 34) or (f shl 30)) xor ((f shr 39) or (f shl 25))) + ((f and g) xor (f and h) xor (g and h)); a:= a + t1; e:= t1 + t2; t1:= d + (((a shr 14) or (a shl 50)) xor ((a shr 18) or (a shl 46)) xor ((a shr 41) or (a shl 23))) + ((a and b) xor (not a and c)) + $4cc5d4becb3e42b6 + W[76]; t2:= (((e shr 28) or (e shl 36)) xor ((e shr 34) or (e shl 30)) xor ((e shr 39) or (e shl 25))) + ((e and f) xor (e and g) xor (f and g)); h:= h + t1; d:= t1 + t2; t1:= c + (((h shr 14) or (h shl 50)) xor ((h shr 18) or (h shl 46)) xor ((h shr 41) or (h shl 23))) + ((h and a) xor (not h and b)) + $597f299cfc657e2a + W[77]; t2:= (((d shr 28) or (d shl 36)) xor ((d shr 34) or (d shl 30)) xor ((d shr 39) or (d shl 25))) + ((d and e) xor (d and f) xor (e and f)); g:= g + t1; c:= t1 + t2; t1:= b + (((g shr 14) or (g shl 50)) xor ((g shr 18) or (g shl 46)) xor ((g shr 41) or (g shl 23))) + ((g and h) xor (not g and a)) + $5fcb6fab3ad6faec + W[78]; t2:= (((c shr 28) or (c shl 36)) xor ((c shr 34) or (c shl 30)) xor ((c shr 39) or (c shl 25))) + ((c and d) xor (c and e) xor (d and e)); f:= f + t1; b:= t1 + t2; t1:= a + (((f shr 14) or (f shl 50)) xor ((f shr 18) or (f shl 46)) xor ((f shr 41) or (f shl 23))) + ((f and g) xor (not f and h)) + $6c44198c4a475817 + W[79]; t2:= (((b shr 28) or (b shl 36)) xor ((b shr 34) or (b shl 30)) xor ((b shr 39) or (b shl 25))) + ((b and c) xor (b and d) xor (c and d)); e:= e + t1; a:= t1 + t2; CurrentHash[0]:= CurrentHash[0] + a; CurrentHash[1]:= CurrentHash[1] + b; CurrentHash[2]:= CurrentHash[2] + c; CurrentHash[3]:= CurrentHash[3] + d; CurrentHash[4]:= CurrentHash[4] + e; CurrentHash[5]:= CurrentHash[5] + f; CurrentHash[6]:= CurrentHash[6] + g; CurrentHash[7]:= CurrentHash[7] + h; FillChar(W,Sizeof(W),0); FillChar(HashBuffer,Sizeof(HashBuffer),0); end; procedure TDCP_sha512base.Burn; begin LenHi:= 0; LenLo:= 0; Index:= 0; FillChar(HashBuffer,Sizeof(HashBuffer),0); FillChar(CurrentHash,Sizeof(CurrentHash),0); fInitialized:= false; end; procedure TDCP_sha512base.Update(const Buffer; Size: longword); var PBuf: ^byte; begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); Inc(LenLo,Size*8); if LenLo< (Size*8) then Inc(LenHi); PBuf:= @Buffer; while Size> 0 do begin if (Sizeof(HashBuffer)-Index)<= DWord(Size) then begin Move(PBuf^,HashBuffer[Index],Sizeof(HashBuffer)-Index); Dec(Size,Sizeof(HashBuffer)-Index); Inc(PBuf,Sizeof(HashBuffer)-Index); Compress; end else begin Move(PBuf^,HashBuffer[Index],Size); Inc(Index,Size); Size:= 0; end; end; end; {******************************************************************************} class function TDCP_sha384.GetAlgorithm: string; begin Result:= 'SHA384'; end; class function TDCP_sha384.GetId: integer; begin Result:= DCP_sha384; end; class function TDCP_sha384.GetHashSize: integer; begin Result:= 384; end; class function TDCP_sha384.SelfTest: boolean; const Test1Out: array[0..47] of byte= ($cb,$00,$75,$3f,$45,$a3,$5e,$8b,$b5,$a0,$3d,$69,$9a,$c6,$50,$07, $27,$2c,$32,$ab,$0e,$de,$d1,$63,$1a,$8b,$60,$5a,$43,$ff,$5b,$ed, $80,$86,$07,$2b,$a1,$e7,$cc,$23,$58,$ba,$ec,$a1,$34,$c8,$25,$a7); Test2Out: array[0..47] of byte= ($09,$33,$0c,$33,$f7,$11,$47,$e8,$3d,$19,$2f,$c7,$82,$cd,$1b,$47, $53,$11,$1b,$17,$3b,$3b,$05,$d2,$2f,$a0,$80,$86,$e3,$b0,$f7,$12, $fc,$c7,$c7,$1a,$55,$7e,$2d,$b9,$66,$c3,$e9,$fa,$91,$74,$60,$39); var TestHash: TDCP_sha384; TestOut: array[0..47] of byte; begin dcpFillChar(TestOut, SizeOf(TestOut), 0); TestHash:= TDCP_sha384.Create(nil); TestHash.Init; TestHash.UpdateStr('abc'); TestHash.Final(TestOut); Result:= boolean(CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out))); TestHash.Init; TestHash.UpdateStr('abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu'); TestHash.Final(TestOut); Result:= boolean(CompareMem(@TestOut,@Test2Out,Sizeof(Test2Out))) and Result; TestHash.Free; end; procedure TDCP_sha384.Init; begin Burn; CurrentHash[0]:= $cbbb9d5dc1059ed8; CurrentHash[1]:= $629a292a367cd507; CurrentHash[2]:= $9159015a3070dd17; CurrentHash[3]:= $152fecd8f70e5939; CurrentHash[4]:= $67332667ffc00b31; CurrentHash[5]:= $8eb44a8768581511; CurrentHash[6]:= $db0c2e0d64f98fa7; CurrentHash[7]:= $47b5481dbefa4fa4; fInitialized:= true; end; procedure TDCP_sha384.Final(var Digest); begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); HashBuffer[Index]:= $80; if Index>= 112 then Compress; Pint64(@HashBuffer[112])^:= SwapDWord(LenHi); Pint64(@HashBuffer[120])^:= SwapDWord(LenLo); Compress; CurrentHash[0]:= SwapDWord(CurrentHash[0]); CurrentHash[1]:= SwapDWord(CurrentHash[1]); CurrentHash[2]:= SwapDWord(CurrentHash[2]); CurrentHash[3]:= SwapDWord(CurrentHash[3]); CurrentHash[4]:= SwapDWord(CurrentHash[4]); CurrentHash[5]:= SwapDWord(CurrentHash[5]); Move(CurrentHash,Digest,384 div 8); Burn; end; {******************************************************************************} class function TDCP_sha512.GetAlgorithm: string; begin Result:= 'SHA512'; end; class function TDCP_sha512.GetId: integer; begin Result:= DCP_sha512; end; class function TDCP_sha512.GetHashSize: integer; begin Result:= 512; end; class function TDCP_sha512.SelfTest: boolean; const Test1Out: array[0..63] of byte= ($dd,$af,$35,$a1,$93,$61,$7a,$ba,$cc,$41,$73,$49,$ae,$20,$41,$31, $12,$e6,$fa,$4e,$89,$a9,$7e,$a2,$0a,$9e,$ee,$e6,$4b,$55,$d3,$9a, $21,$92,$99,$2a,$27,$4f,$c1,$a8,$36,$ba,$3c,$23,$a3,$fe,$eb,$bd, $45,$4d,$44,$23,$64,$3c,$e8,$0e,$2a,$9a,$c9,$4f,$a5,$4c,$a4,$9f); Test2Out: array[0..63] of byte= ($8e,$95,$9b,$75,$da,$e3,$13,$da,$8c,$f4,$f7,$28,$14,$fc,$14,$3f, $8f,$77,$79,$c6,$eb,$9f,$7f,$a1,$72,$99,$ae,$ad,$b6,$88,$90,$18, $50,$1d,$28,$9e,$49,$00,$f7,$e4,$33,$1b,$99,$de,$c4,$b5,$43,$3a, $c7,$d3,$29,$ee,$b6,$dd,$26,$54,$5e,$96,$e5,$5b,$87,$4b,$e9,$09); var TestHash: TDCP_sha512; TestOut: array[0..63] of byte; begin dcpFillChar(TestOut, SizeOf(TestOut), 0); TestHash:= TDCP_sha512.Create(nil); TestHash.Init; TestHash.UpdateStr('abc'); TestHash.Final(TestOut); Result:= boolean(CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out))); TestHash.Init; TestHash.UpdateStr('abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu'); TestHash.Final(TestOut); Result:= boolean(CompareMem(@TestOut,@Test2Out,Sizeof(Test2Out))) and Result; TestHash.Free; end; procedure TDCP_sha512.Init; begin Burn; CurrentHash[0]:= $6a09e667f3bcc908; CurrentHash[1]:= $bb67ae8584caa73b; CurrentHash[2]:= $3c6ef372fe94f82b; CurrentHash[3]:= $a54ff53a5f1d36f1; CurrentHash[4]:= $510e527fade682d1; CurrentHash[5]:= $9b05688c2b3e6c1f; CurrentHash[6]:= $1f83d9abfb41bd6b; CurrentHash[7]:= $5be0cd19137e2179; fInitialized:= true; end; procedure TDCP_sha512.Final(var Digest); begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); HashBuffer[Index]:= $80; if Index>= 112 then Compress; Pint64(@HashBuffer[112])^:= SwapDWord(LenHi); Pint64(@HashBuffer[120])^:= SwapDWord(LenLo); Compress; CurrentHash[0]:= SwapDWord(CurrentHash[0]); CurrentHash[1]:= SwapDWord(CurrentHash[1]); CurrentHash[2]:= SwapDWord(CurrentHash[2]); CurrentHash[3]:= SwapDWord(CurrentHash[3]); CurrentHash[4]:= SwapDWord(CurrentHash[4]); CurrentHash[5]:= SwapDWord(CurrentHash[5]); CurrentHash[6]:= SwapDWord(CurrentHash[6]); CurrentHash[7]:= SwapDWord(CurrentHash[7]); Move(CurrentHash,Digest,Sizeof(CurrentHash)); Burn; end; end. doublecmd-0.5.8/components/dcpcrypt/Hashes/DCPhaval4.inc0000644000175000017500000005506012014201074022134 0ustar alexxalexxtemp:= (t3 and (t0 xor t1) xor t5 and t6 xor t4 and t2 xor t0); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[ 0]; temp:= (t2 and (t7 xor t0) xor t4 and t5 xor t3 and t1 xor t7); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 1]; temp:= (t1 and (t6 xor t7) xor t3 and t4 xor t2 and t0 xor t6); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[ 2]; temp:= (t0 and (t5 xor t6) xor t2 and t3 xor t1 and t7 xor t5); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[ 3]; temp:= (t7 and (t4 xor t5) xor t1 and t2 xor t0 and t6 xor t4); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[ 4]; temp:= (t6 and (t3 xor t4) xor t0 and t1 xor t7 and t5 xor t3); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[ 5]; temp:= (t5 and (t2 xor t3) xor t7 and t0 xor t6 and t4 xor t2); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[ 6]; temp:= (t4 and (t1 xor t2) xor t6 and t7 xor t5 and t3 xor t1); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[ 7]; temp:= (t3 and (t0 xor t1) xor t5 and t6 xor t4 and t2 xor t0); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[ 8]; temp:= (t2 and (t7 xor t0) xor t4 and t5 xor t3 and t1 xor t7); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 9]; temp:= (t1 and (t6 xor t7) xor t3 and t4 xor t2 and t0 xor t6); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[10]; temp:= (t0 and (t5 xor t6) xor t2 and t3 xor t1 and t7 xor t5); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[11]; temp:= (t7 and (t4 xor t5) xor t1 and t2 xor t0 and t6 xor t4); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[12]; temp:= (t6 and (t3 xor t4) xor t0 and t1 xor t7 and t5 xor t3); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[13]; temp:= (t5 and (t2 xor t3) xor t7 and t0 xor t6 and t4 xor t2); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[14]; temp:= (t4 and (t1 xor t2) xor t6 and t7 xor t5 and t3 xor t1); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[15]; temp:= (t3 and (t0 xor t1) xor t5 and t6 xor t4 and t2 xor t0); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[16]; temp:= (t2 and (t7 xor t0) xor t4 and t5 xor t3 and t1 xor t7); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[17]; temp:= (t1 and (t6 xor t7) xor t3 and t4 xor t2 and t0 xor t6); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[18]; temp:= (t0 and (t5 xor t6) xor t2 and t3 xor t1 and t7 xor t5); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[19]; temp:= (t7 and (t4 xor t5) xor t1 and t2 xor t0 and t6 xor t4); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[20]; temp:= (t6 and (t3 xor t4) xor t0 and t1 xor t7 and t5 xor t3); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[21]; temp:= (t5 and (t2 xor t3) xor t7 and t0 xor t6 and t4 xor t2); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[22]; temp:= (t4 and (t1 xor t2) xor t6 and t7 xor t5 and t3 xor t1); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[23]; temp:= (t3 and (t0 xor t1) xor t5 and t6 xor t4 and t2 xor t0); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[24]; temp:= (t2 and (t7 xor t0) xor t4 and t5 xor t3 and t1 xor t7); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[25]; temp:= (t1 and (t6 xor t7) xor t3 and t4 xor t2 and t0 xor t6); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[26]; temp:= (t0 and (t5 xor t6) xor t2 and t3 xor t1 and t7 xor t5); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[27]; temp:= (t7 and (t4 xor t5) xor t1 and t2 xor t0 and t6 xor t4); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[28]; temp:= (t6 and (t3 xor t4) xor t0 and t1 xor t7 and t5 xor t3); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[29]; temp:= (t5 and (t2 xor t3) xor t7 and t0 xor t6 and t4 xor t2); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[30]; temp:= (t4 and (t1 xor t2) xor t6 and t7 xor t5 and t3 xor t1); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[31]; temp:= (t1 and (t6 and not t0 xor t2 and t5 xor t3 xor t4) xor t2 and (t6 xor t5) xor t0 and t5 xor t4); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[ 5] + $452821E6; temp:= (t0 and (t5 and not t7 xor t1 and t4 xor t2 xor t3) xor t1 and (t5 xor t4) xor t7 and t4 xor t3); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[14] + $38D01377; temp:= (t7 and (t4 and not t6 xor t0 and t3 xor t1 xor t2) xor t0 and (t4 xor t3) xor t6 and t3 xor t2); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[26] + $BE5466CF; temp:= (t6 and (t3 and not t5 xor t7 and t2 xor t0 xor t1) xor t7 and (t3 xor t2) xor t5 and t2 xor t1); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[18] + $34E90C6C; temp:= (t5 and (t2 and not t4 xor t6 and t1 xor t7 xor t0) xor t6 and (t2 xor t1) xor t4 and t1 xor t0); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[11] + $C0AC29B7; temp:= (t4 and (t1 and not t3 xor t5 and t0 xor t6 xor t7) xor t5 and (t1 xor t0) xor t3 and t0 xor t7); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[28] + $C97C50DD; temp:= (t3 and (t0 and not t2 xor t4 and t7 xor t5 xor t6) xor t4 and (t0 xor t7) xor t2 and t7 xor t6); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[ 7] + $3F84D5B5; temp:= (t2 and (t7 and not t1 xor t3 and t6 xor t4 xor t5) xor t3 and (t7 xor t6) xor t1 and t6 xor t5); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[16] + $B5470917; temp:= (t1 and (t6 and not t0 xor t2 and t5 xor t3 xor t4) xor t2 and (t6 xor t5) xor t0 and t5 xor t4); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[ 0] + $9216D5D9; temp:= (t0 and (t5 and not t7 xor t1 and t4 xor t2 xor t3) xor t1 and (t5 xor t4) xor t7 and t4 xor t3); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[23] + $8979FB1B; temp:= (t7 and (t4 and not t6 xor t0 and t3 xor t1 xor t2) xor t0 and (t4 xor t3) xor t6 and t3 xor t2); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[20] + $D1310BA6; temp:= (t6 and (t3 and not t5 xor t7 and t2 xor t0 xor t1) xor t7 and (t3 xor t2) xor t5 and t2 xor t1); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[22] + $98DFB5AC; temp:= (t5 and (t2 and not t4 xor t6 and t1 xor t7 xor t0) xor t6 and (t2 xor t1) xor t4 and t1 xor t0); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[ 1] + $2FFD72DB; temp:= (t4 and (t1 and not t3 xor t5 and t0 xor t6 xor t7) xor t5 and (t1 xor t0) xor t3 and t0 xor t7); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[10] + $D01ADFB7; temp:= (t3 and (t0 and not t2 xor t4 and t7 xor t5 xor t6) xor t4 and (t0 xor t7) xor t2 and t7 xor t6); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[ 4] + $B8E1AFED; temp:= (t2 and (t7 and not t1 xor t3 and t6 xor t4 xor t5) xor t3 and (t7 xor t6) xor t1 and t6 xor t5); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[ 8] + $6A267E96; temp:= (t1 and (t6 and not t0 xor t2 and t5 xor t3 xor t4) xor t2 and (t6 xor t5) xor t0 and t5 xor t4); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[30] + $BA7C9045; temp:= (t0 and (t5 and not t7 xor t1 and t4 xor t2 xor t3) xor t1 and (t5 xor t4) xor t7 and t4 xor t3); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 3] + $F12C7F99; temp:= (t7 and (t4 and not t6 xor t0 and t3 xor t1 xor t2) xor t0 and (t4 xor t3) xor t6 and t3 xor t2); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[21] + $24A19947; temp:= (t6 and (t3 and not t5 xor t7 and t2 xor t0 xor t1) xor t7 and (t3 xor t2) xor t5 and t2 xor t1); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[ 9] + $B3916CF7; temp:= (t5 and (t2 and not t4 xor t6 and t1 xor t7 xor t0) xor t6 and (t2 xor t1) xor t4 and t1 xor t0); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[17] + $0801F2E2; temp:= (t4 and (t1 and not t3 xor t5 and t0 xor t6 xor t7) xor t5 and (t1 xor t0) xor t3 and t0 xor t7); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[24] + $858EFC16; temp:= (t3 and (t0 and not t2 xor t4 and t7 xor t5 xor t6) xor t4 and (t0 xor t7) xor t2 and t7 xor t6); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[29] + $636920D8; temp:= (t2 and (t7 and not t1 xor t3 and t6 xor t4 xor t5) xor t3 and (t7 xor t6) xor t1 and t6 xor t5); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[ 6] + $71574E69; temp:= (t1 and (t6 and not t0 xor t2 and t5 xor t3 xor t4) xor t2 and (t6 xor t5) xor t0 and t5 xor t4); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[19] + $A458FEA3; temp:= (t0 and (t5 and not t7 xor t1 and t4 xor t2 xor t3) xor t1 and (t5 xor t4) xor t7 and t4 xor t3); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[12] + $F4933D7E; temp:= (t7 and (t4 and not t6 xor t0 and t3 xor t1 xor t2) xor t0 and (t4 xor t3) xor t6 and t3 xor t2); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[15] + $0D95748F; temp:= (t6 and (t3 and not t5 xor t7 and t2 xor t0 xor t1) xor t7 and (t3 xor t2) xor t5 and t2 xor t1); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[13] + $728EB658; temp:= (t5 and (t2 and not t4 xor t6 and t1 xor t7 xor t0) xor t6 and (t2 xor t1) xor t4 and t1 xor t0); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[ 2] + $718BCD58; temp:= (t4 and (t1 and not t3 xor t5 and t0 xor t6 xor t7) xor t5 and (t1 xor t0) xor t3 and t0 xor t7); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[25] + $82154AEE; temp:= (t3 and (t0 and not t2 xor t4 and t7 xor t5 xor t6) xor t4 and (t0 xor t7) xor t2 and t7 xor t6); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[31] + $7B54A41D; temp:= (t2 and (t7 and not t1 xor t3 and t6 xor t4 xor t5) xor t3 and (t7 xor t6) xor t1 and t6 xor t5); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[27] + $C25A59B5; temp:= (t6 and (t2 and t0 xor t1 xor t5) xor t2 and t3 xor t0 and t4 xor t5); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[19] + $9C30D539; temp:= (t5 and (t1 and t7 xor t0 xor t4) xor t1 and t2 xor t7 and t3 xor t4); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 9] + $2AF26013; temp:= (t4 and (t0 and t6 xor t7 xor t3) xor t0 and t1 xor t6 and t2 xor t3); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[ 4] + $C5D1B023; temp:= (t3 and (t7 and t5 xor t6 xor t2) xor t7 and t0 xor t5 and t1 xor t2); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[20] + $286085F0; temp:= (t2 and (t6 and t4 xor t5 xor t1) xor t6 and t7 xor t4 and t0 xor t1); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[28] + $CA417918; temp:= (t1 and (t5 and t3 xor t4 xor t0) xor t5 and t6 xor t3 and t7 xor t0); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[17] + $B8DB38EF; temp:= (t0 and (t4 and t2 xor t3 xor t7) xor t4 and t5 xor t2 and t6 xor t7); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[ 8] + $8E79DCB0; temp:= (t7 and (t3 and t1 xor t2 xor t6) xor t3 and t4 xor t1 and t5 xor t6); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[22] + $603A180E; temp:= (t6 and (t2 and t0 xor t1 xor t5) xor t2 and t3 xor t0 and t4 xor t5); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[29] + $6C9E0E8B; temp:= (t5 and (t1 and t7 xor t0 xor t4) xor t1 and t2 xor t7 and t3 xor t4); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[14] + $B01E8A3E; temp:= (t4 and (t0 and t6 xor t7 xor t3) xor t0 and t1 xor t6 and t2 xor t3); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[25] + $D71577C1; temp:= (t3 and (t7 and t5 xor t6 xor t2) xor t7 and t0 xor t5 and t1 xor t2); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[12] + $BD314B27; temp:= (t2 and (t6 and t4 xor t5 xor t1) xor t6 and t7 xor t4 and t0 xor t1); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[24] + $78AF2FDA; temp:= (t1 and (t5 and t3 xor t4 xor t0) xor t5 and t6 xor t3 and t7 xor t0); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[30] + $55605C60; temp:= (t0 and (t4 and t2 xor t3 xor t7) xor t4 and t5 xor t2 and t6 xor t7); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[16] + $E65525F3; temp:= (t7 and (t3 and t1 xor t2 xor t6) xor t3 and t4 xor t1 and t5 xor t6); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[26] + $AA55AB94; temp:= (t6 and (t2 and t0 xor t1 xor t5) xor t2 and t3 xor t0 and t4 xor t5); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[31] + $57489862; temp:= (t5 and (t1 and t7 xor t0 xor t4) xor t1 and t2 xor t7 and t3 xor t4); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[15] + $63E81440; temp:= (t4 and (t0 and t6 xor t7 xor t3) xor t0 and t1 xor t6 and t2 xor t3); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[ 7] + $55CA396A; temp:= (t3 and (t7 and t5 xor t6 xor t2) xor t7 and t0 xor t5 and t1 xor t2); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[ 3] + $2AAB10B6; temp:= (t2 and (t6 and t4 xor t5 xor t1) xor t6 and t7 xor t4 and t0 xor t1); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[ 1] + $B4CC5C34; temp:= (t1 and (t5 and t3 xor t4 xor t0) xor t5 and t6 xor t3 and t7 xor t0); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[ 0] + $1141E8CE; temp:= (t0 and (t4 and t2 xor t3 xor t7) xor t4 and t5 xor t2 and t6 xor t7); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[18] + $A15486AF; temp:= (t7 and (t3 and t1 xor t2 xor t6) xor t3 and t4 xor t1 and t5 xor t6); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[27] + $7C72E993; temp:= (t6 and (t2 and t0 xor t1 xor t5) xor t2 and t3 xor t0 and t4 xor t5); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[13] + $B3EE1411; temp:= (t5 and (t1 and t7 xor t0 xor t4) xor t1 and t2 xor t7 and t3 xor t4); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 6] + $636FBC2A; temp:= (t4 and (t0 and t6 xor t7 xor t3) xor t0 and t1 xor t6 and t2 xor t3); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[21] + $2BA9C55D; temp:= (t3 and (t7 and t5 xor t6 xor t2) xor t7 and t0 xor t5 and t1 xor t2); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[10] + $741831F6; temp:= (t2 and (t6 and t4 xor t5 xor t1) xor t6 and t7 xor t4 and t0 xor t1); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[23] + $CE5C3E16; temp:= (t1 and (t5 and t3 xor t4 xor t0) xor t5 and t6 xor t3 and t7 xor t0); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[11] + $9B87931E; temp:= (t0 and (t4 and t2 xor t3 xor t7) xor t4 and t5 xor t2 and t6 xor t7); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[ 5] + $AFD6BA33; temp:= (t7 and (t3 and t1 xor t2 xor t6) xor t3 and t4 xor t1 and t5 xor t6); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[ 2] + $6C24CF5C; temp:= (t0 and (t4 and not t2 xor t5 and not t6 xor t1 xor t6 xor t3) xor t5 and (t1 and t2 xor t4 xor t6) xor t2 and t6 xor t3); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[24] + $7A325381; temp:= (t7 and (t3 and not t1 xor t4 and not t5 xor t0 xor t5 xor t2) xor t4 and (t0 and t1 xor t3 xor t5) xor t1 and t5 xor t2); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 4] + $28958677; temp:= (t6 and (t2 and not t0 xor t3 and not t4 xor t7 xor t4 xor t1) xor t3 and (t7 and t0 xor t2 xor t4) xor t0 and t4 xor t1); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[ 0] + $3B8F4898; temp:= (t5 and (t1 and not t7 xor t2 and not t3 xor t6 xor t3 xor t0) xor t2 and (t6 and t7 xor t1 xor t3) xor t7 and t3 xor t0); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[14] + $6B4BB9AF; temp:= (t4 and (t0 and not t6 xor t1 and not t2 xor t5 xor t2 xor t7) xor t1 and (t5 and t6 xor t0 xor t2) xor t6 and t2 xor t7); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[ 2] + $C4BFE81B; temp:= (t3 and (t7 and not t5 xor t0 and not t1 xor t4 xor t1 xor t6) xor t0 and (t4 and t5 xor t7 xor t1) xor t5 and t1 xor t6); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[ 7] + $66282193; temp:= (t2 and (t6 and not t4 xor t7 and not t0 xor t3 xor t0 xor t5) xor t7 and (t3 and t4 xor t6 xor t0) xor t4 and t0 xor t5); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[28] + $61D809CC; temp:= (t1 and (t5 and not t3 xor t6 and not t7 xor t2 xor t7 xor t4) xor t6 and (t2 and t3 xor t5 xor t7) xor t3 and t7 xor t4); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[23] + $FB21A991; temp:= (t0 and (t4 and not t2 xor t5 and not t6 xor t1 xor t6 xor t3) xor t5 and (t1 and t2 xor t4 xor t6) xor t2 and t6 xor t3); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[26] + $487CAC60; temp:= (t7 and (t3 and not t1 xor t4 and not t5 xor t0 xor t5 xor t2) xor t4 and (t0 and t1 xor t3 xor t5) xor t1 and t5 xor t2); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[ 6] + $5DEC8032; temp:= (t6 and (t2 and not t0 xor t3 and not t4 xor t7 xor t4 xor t1) xor t3 and (t7 and t0 xor t2 xor t4) xor t0 and t4 xor t1); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[30] + $EF845D5D; temp:= (t5 and (t1 and not t7 xor t2 and not t3 xor t6 xor t3 xor t0) xor t2 and (t6 and t7 xor t1 xor t3) xor t7 and t3 xor t0); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[20] + $E98575B1; temp:= (t4 and (t0 and not t6 xor t1 and not t2 xor t5 xor t2 xor t7) xor t1 and (t5 and t6 xor t0 xor t2) xor t6 and t2 xor t7); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[18] + $DC262302; temp:= (t3 and (t7 and not t5 xor t0 and not t1 xor t4 xor t1 xor t6) xor t0 and (t4 and t5 xor t7 xor t1) xor t5 and t1 xor t6); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[25] + $EB651B88; temp:= (t2 and (t6 and not t4 xor t7 and not t0 xor t3 xor t0 xor t5) xor t7 and (t3 and t4 xor t6 xor t0) xor t4 and t0 xor t5); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[19] + $23893E81; temp:= (t1 and (t5 and not t3 xor t6 and not t7 xor t2 xor t7 xor t4) xor t6 and (t2 and t3 xor t5 xor t7) xor t3 and t7 xor t4); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[ 3] + $D396ACC5; temp:= (t0 and (t4 and not t2 xor t5 and not t6 xor t1 xor t6 xor t3) xor t5 and (t1 and t2 xor t4 xor t6) xor t2 and t6 xor t3); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[22] + $0F6D6FF3; temp:= (t7 and (t3 and not t1 xor t4 and not t5 xor t0 xor t5 xor t2) xor t4 and (t0 and t1 xor t3 xor t5) xor t1 and t5 xor t2); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[11] + $83F44239; temp:= (t6 and (t2 and not t0 xor t3 and not t4 xor t7 xor t4 xor t1) xor t3 and (t7 and t0 xor t2 xor t4) xor t0 and t4 xor t1); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[31] + $2E0B4482; temp:= (t5 and (t1 and not t7 xor t2 and not t3 xor t6 xor t3 xor t0) xor t2 and (t6 and t7 xor t1 xor t3) xor t7 and t3 xor t0); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[21] + $A4842004; temp:= (t4 and (t0 and not t6 xor t1 and not t2 xor t5 xor t2 xor t7) xor t1 and (t5 and t6 xor t0 xor t2) xor t6 and t2 xor t7); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[ 8] + $69C8F04A; temp:= (t3 and (t7 and not t5 xor t0 and not t1 xor t4 xor t1 xor t6) xor t0 and (t4 and t5 xor t7 xor t1) xor t5 and t1 xor t6); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[27] + $9E1F9B5E; temp:= (t2 and (t6 and not t4 xor t7 and not t0 xor t3 xor t0 xor t5) xor t7 and (t3 and t4 xor t6 xor t0) xor t4 and t0 xor t5); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[12] + $21C66842; temp:= (t1 and (t5 and not t3 xor t6 and not t7 xor t2 xor t7 xor t4) xor t6 and (t2 and t3 xor t5 xor t7) xor t3 and t7 xor t4); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[ 9] + $F6E96C9A; temp:= (t0 and (t4 and not t2 xor t5 and not t6 xor t1 xor t6 xor t3) xor t5 and (t1 and t2 xor t4 xor t6) xor t2 and t6 xor t3); t7:= ((temp shr 7) or (temp shl 25)) + ((t7 shr 11) or (t7 shl 21)) + w[ 1] + $670C9C61; temp:= (t7 and (t3 and not t1 xor t4 and not t5 xor t0 xor t5 xor t2) xor t4 and (t0 and t1 xor t3 xor t5) xor t1 and t5 xor t2); t6:= ((temp shr 7) or (temp shl 25)) + ((t6 shr 11) or (t6 shl 21)) + w[29] + $ABD388F0; temp:= (t6 and (t2 and not t0 xor t3 and not t4 xor t7 xor t4 xor t1) xor t3 and (t7 and t0 xor t2 xor t4) xor t0 and t4 xor t1); t5:= ((temp shr 7) or (temp shl 25)) + ((t5 shr 11) or (t5 shl 21)) + w[ 5] + $6A51A0D2; temp:= (t5 and (t1 and not t7 xor t2 and not t3 xor t6 xor t3 xor t0) xor t2 and (t6 and t7 xor t1 xor t3) xor t7 and t3 xor t0); t4:= ((temp shr 7) or (temp shl 25)) + ((t4 shr 11) or (t4 shl 21)) + w[15] + $D8542F68; temp:= (t4 and (t0 and not t6 xor t1 and not t2 xor t5 xor t2 xor t7) xor t1 and (t5 and t6 xor t0 xor t2) xor t6 and t2 xor t7); t3:= ((temp shr 7) or (temp shl 25)) + ((t3 shr 11) or (t3 shl 21)) + w[17] + $960FA728; temp:= (t3 and (t7 and not t5 xor t0 and not t1 xor t4 xor t1 xor t6) xor t0 and (t4 and t5 xor t7 xor t1) xor t5 and t1 xor t6); t2:= ((temp shr 7) or (temp shl 25)) + ((t2 shr 11) or (t2 shl 21)) + w[10] + $AB5133A3; temp:= (t2 and (t6 and not t4 xor t7 and not t0 xor t3 xor t0 xor t5) xor t7 and (t3 and t4 xor t6 xor t0) xor t4 and t0 xor t5); t1:= ((temp shr 7) or (temp shl 25)) + ((t1 shr 11) or (t1 shl 21)) + w[16] + $6EEF0B6C; temp:= (t1 and (t5 and not t3 xor t6 and not t7 xor t2 xor t7 xor t4) xor t6 and (t2 and t3 xor t5 xor t7) xor t3 and t7 xor t4); t0:= ((temp shr 7) or (temp shl 25)) + ((t0 shr 11) or (t0 shl 21)) + w[13] + $137A3BE4; doublecmd-0.5.8/components/dcpcrypt/Hashes/dcptiger.pas0000644000175000017500000003055012014201074022236 0ustar alexxalexx{******************************************************************************} {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********} {******************************************************************************} {* A binary compatible implementation of Tiger ********************************} {******************************************************************************} {* Copyright (c) 2002 David Barton *} {* Permission is hereby granted, free of charge, to any person obtaining a *} {* copy of this software and associated documentation files (the "Software"), *} {* to deal in the Software without restriction, including without limitation *} {* the rights to use, copy, modify, merge, publish, distribute, sublicense, *} {* and/or sell copies of the Software, and to permit persons to whom the *} {* Software is furnished to do so, subject to the following conditions: *} {* *} {* The above copyright notice and this permission notice shall be included in *} {* all copies or substantial portions of the Software. *} {* *} {* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *} {* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *} {* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *} {* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *} {* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *} {* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *} {* DEALINGS IN THE SOFTWARE. *} {******************************************************************************} unit DCPtiger; {$MODE Delphi} interface uses Classes, Sysutils, DCPcrypt2, DCPconst; type TDCP_tiger= class(TDCP_hash) protected Len: int64; Index: DWord; CurrentHash: array[0..2] of int64; HashBuffer: array[0..63] of byte; procedure Compress; public class function GetId: integer; override; class function GetAlgorithm: string; override; class function GetHashSize: integer; override; class function SelfTest: boolean; override; procedure Init; override; procedure Burn; override; procedure Update(const Buffer; Size: longword); override; procedure Final(var Digest); override; end; {******************************************************************************} {******************************************************************************} implementation {$R-}{$Q-} {$INCLUDE DCPtiger.inc} procedure TDCP_tiger.Compress; var a, b, c, aa, bb, cc: int64; x: array[0..7] of int64; begin dcpFillChar(x, SizeOf(x), 0); a:= CurrentHash[0]; aa:= a; b:= CurrentHash[1]; bb:= b; c:= CurrentHash[2]; cc:= c; Move(HashBuffer,x,Sizeof(x)); c:= c xor x[0]; a:= a - (t1[c and $FF] xor t2[(c shr 16) and $FF] xor t3[(c shr 32) and $FF] xor t4[(c shr 48) and $FF]); b:= b + (t4[(c shr 8) and $FF] xor t3[(c shr 24) and $FF] xor t2[(c shr 40) and $FF] xor t1[(c shr 56) and $FF]); b:= b * 5; a:= a xor x[1]; b:= b - (t1[a and $FF] xor t2[(a shr 16) and $FF] xor t3[(a shr 32) and $FF] xor t4[(a shr 48) and $FF]); c:= c + (t4[(a shr 8) and $FF] xor t3[(a shr 24) and $FF] xor t2[(a shr 40) and $FF] xor t1[(a shr 56) and $FF]); c:= c * 5; b:= b xor x[2]; c:= c - (t1[b and $FF] xor t2[(b shr 16) and $FF] xor t3[(b shr 32) and $FF] xor t4[(b shr 48) and $FF]); a:= a + (t4[(b shr 8) and $FF] xor t3[(b shr 24) and $FF] xor t2[(b shr 40) and $FF] xor t1[(b shr 56) and $FF]); a:= a * 5; c:= c xor x[3]; a:= a - (t1[c and $FF] xor t2[(c shr 16) and $FF] xor t3[(c shr 32) and $FF] xor t4[(c shr 48) and $FF]); b:= b + (t4[(c shr 8) and $FF] xor t3[(c shr 24) and $FF] xor t2[(c shr 40) and $FF] xor t1[(c shr 56) and $FF]); b:= b * 5; a:= a xor x[4]; b:= b - (t1[a and $FF] xor t2[(a shr 16) and $FF] xor t3[(a shr 32) and $FF] xor t4[(a shr 48) and $FF]); c:= c + (t4[(a shr 8) and $FF] xor t3[(a shr 24) and $FF] xor t2[(a shr 40) and $FF] xor t1[(a shr 56) and $FF]); c:= c * 5; b:= b xor x[5]; c:= c - (t1[b and $FF] xor t2[(b shr 16) and $FF] xor t3[(b shr 32) and $FF] xor t4[(b shr 48) and $FF]); a:= a + (t4[(b shr 8) and $FF] xor t3[(b shr 24) and $FF] xor t2[(b shr 40) and $FF] xor t1[(b shr 56) and $FF]); a:= a * 5; c:= c xor x[6]; a:= a - (t1[c and $FF] xor t2[(c shr 16) and $FF] xor t3[(c shr 32) and $FF] xor t4[(c shr 48) and $FF]); b:= b + (t4[(c shr 8) and $FF] xor t3[(c shr 24) and $FF] xor t2[(c shr 40) and $FF] xor t1[(c shr 56) and $FF]); b:= b * 5; a:= a xor x[7]; b:= b - (t1[a and $FF] xor t2[(a shr 16) and $FF] xor t3[(a shr 32) and $FF] xor t4[(a shr 48) and $FF]); c:= c + (t4[(a shr 8) and $FF] xor t3[(a shr 24) and $FF] xor t2[(a shr 40) and $FF] xor t1[(a shr 56) and $FF]); c:= c * 5; x[0]:= x[0] - (x[7] xor $A5A5A5A5A5A5A5A5); x[1]:= x[1] xor x[0]; x[2]:= x[2] + x[1]; x[3]:= x[3] - (x[2] xor ((not x[1]) shl 19)); x[4]:= x[4] xor x[3]; x[5]:= x[5] + x[4]; x[6]:= x[6] - (x[5] xor ((not x[4]) shr 23)); x[7]:= x[7] xor x[6]; x[0]:= x[0] + x[7]; x[1]:= x[1] - (x[0] xor ((not x[7]) shl 19)); x[2]:= x[2] xor x[1]; x[3]:= x[3] + x[2]; x[4]:= x[4] - (x[3] xor ((not x[2]) shr 23)); x[5]:= x[5] xor x[4]; x[6]:= x[6] + x[5]; x[7]:= x[7] - (x[6] xor $0123456789ABCDEF); b:= b xor x[0]; c:= c - (t1[b and $FF] xor t2[(b shr 16) and $FF] xor t3[(b shr 32) and $FF] xor t4[(b shr 48) and $FF]); a:= a + (t4[(b shr 8) and $FF] xor t3[(b shr 24) and $FF] xor t2[(b shr 40) and $FF] xor t1[(b shr 56) and $FF]); a:= a * 7; c:= c xor x[1]; a:= a - (t1[c and $FF] xor t2[(c shr 16) and $FF] xor t3[(c shr 32) and $FF] xor t4[(c shr 48) and $FF]); b:= b + (t4[(c shr 8) and $FF] xor t3[(c shr 24) and $FF] xor t2[(c shr 40) and $FF] xor t1[(c shr 56) and $FF]); b:= b * 7; a:= a xor x[2]; b:= b - (t1[a and $FF] xor t2[(a shr 16) and $FF] xor t3[(a shr 32) and $FF] xor t4[(a shr 48) and $FF]); c:= c + (t4[(a shr 8) and $FF] xor t3[(a shr 24) and $FF] xor t2[(a shr 40) and $FF] xor t1[(a shr 56) and $FF]); c:= c * 7; b:= b xor x[3]; c:= c - (t1[b and $FF] xor t2[(b shr 16) and $FF] xor t3[(b shr 32) and $FF] xor t4[(b shr 48) and $FF]); a:= a + (t4[(b shr 8) and $FF] xor t3[(b shr 24) and $FF] xor t2[(b shr 40) and $FF] xor t1[(b shr 56) and $FF]); a:= a * 7; c:= c xor x[4]; a:= a - (t1[c and $FF] xor t2[(c shr 16) and $FF] xor t3[(c shr 32) and $FF] xor t4[(c shr 48) and $FF]); b:= b + (t4[(c shr 8) and $FF] xor t3[(c shr 24) and $FF] xor t2[(c shr 40) and $FF] xor t1[(c shr 56) and $FF]); b:= b * 7; a:= a xor x[5]; b:= b - (t1[a and $FF] xor t2[(a shr 16) and $FF] xor t3[(a shr 32) and $FF] xor t4[(a shr 48) and $FF]); c:= c + (t4[(a shr 8) and $FF] xor t3[(a shr 24) and $FF] xor t2[(a shr 40) and $FF] xor t1[(a shr 56) and $FF]); c:= c * 7; b:= b xor x[6]; c:= c - (t1[b and $FF] xor t2[(b shr 16) and $FF] xor t3[(b shr 32) and $FF] xor t4[(b shr 48) and $FF]); a:= a + (t4[(b shr 8) and $FF] xor t3[(b shr 24) and $FF] xor t2[(b shr 40) and $FF] xor t1[(b shr 56) and $FF]); a:= a * 7; c:= c xor x[7]; a:= a - (t1[c and $FF] xor t2[(c shr 16) and $FF] xor t3[(c shr 32) and $FF] xor t4[(c shr 48) and $FF]); b:= b + (t4[(c shr 8) and $FF] xor t3[(c shr 24) and $FF] xor t2[(c shr 40) and $FF] xor t1[(c shr 56) and $FF]); b:= b * 7; x[0]:= x[0] - (x[7] xor $A5A5A5A5A5A5A5A5); x[1]:= x[1] xor x[0]; x[2]:= x[2] + x[1]; x[3]:= x[3] - (x[2] xor ((not x[1]) shl 19)); x[4]:= x[4] xor x[3]; x[5]:= x[5] + x[4]; x[6]:= x[6] - (x[5] xor ((not x[4]) shr 23)); x[7]:= x[7] xor x[6]; x[0]:= x[0] + x[7]; x[1]:= x[1] - (x[0] xor ((not x[7]) shl 19)); x[2]:= x[2] xor x[1]; x[3]:= x[3] + x[2]; x[4]:= x[4] - (x[3] xor ((not x[2]) shr 23)); x[5]:= x[5] xor x[4]; x[6]:= x[6] + x[5]; x[7]:= x[7] - (x[6] xor $0123456789ABCDEF); a:= a xor x[0]; b:= b - (t1[a and $FF] xor t2[(a shr 16) and $FF] xor t3[(a shr 32) and $FF] xor t4[(a shr 48) and $FF]); c:= c + (t4[(a shr 8) and $FF] xor t3[(a shr 24) and $FF] xor t2[(a shr 40) and $FF] xor t1[(a shr 56) and $FF]); c:= c * 9; b:= b xor x[1]; c:= c - (t1[b and $FF] xor t2[(b shr 16) and $FF] xor t3[(b shr 32) and $FF] xor t4[(b shr 48) and $FF]); a:= a + (t4[(b shr 8) and $FF] xor t3[(b shr 24) and $FF] xor t2[(b shr 40) and $FF] xor t1[(b shr 56) and $FF]); a:= a * 9; c:= c xor x[2]; a:= a - (t1[c and $FF] xor t2[(c shr 16) and $FF] xor t3[(c shr 32) and $FF] xor t4[(c shr 48) and $FF]); b:= b + (t4[(c shr 8) and $FF] xor t3[(c shr 24) and $FF] xor t2[(c shr 40) and $FF] xor t1[(c shr 56) and $FF]); b:= b * 9; a:= a xor x[3]; b:= b - (t1[a and $FF] xor t2[(a shr 16) and $FF] xor t3[(a shr 32) and $FF] xor t4[(a shr 48) and $FF]); c:= c + (t4[(a shr 8) and $FF] xor t3[(a shr 24) and $FF] xor t2[(a shr 40) and $FF] xor t1[(a shr 56) and $FF]); c:= c * 9; b:= b xor x[4]; c:= c - (t1[b and $FF] xor t2[(b shr 16) and $FF] xor t3[(b shr 32) and $FF] xor t4[(b shr 48) and $FF]); a:= a + (t4[(b shr 8) and $FF] xor t3[(b shr 24) and $FF] xor t2[(b shr 40) and $FF] xor t1[(b shr 56) and $FF]); a:= a * 9; c:= c xor x[5]; a:= a - (t1[c and $FF] xor t2[(c shr 16) and $FF] xor t3[(c shr 32) and $FF] xor t4[(c shr 48) and $FF]); b:= b + (t4[(c shr 8) and $FF] xor t3[(c shr 24) and $FF] xor t2[(c shr 40) and $FF] xor t1[(c shr 56) and $FF]); b:= b * 9; a:= a xor x[6]; b:= b - (t1[a and $FF] xor t2[(a shr 16) and $FF] xor t3[(a shr 32) and $FF] xor t4[(a shr 48) and $FF]); c:= c + (t4[(a shr 8) and $FF] xor t3[(a shr 24) and $FF] xor t2[(a shr 40) and $FF] xor t1[(a shr 56) and $FF]); c:= c * 9; b:= b xor x[7]; c:= c - (t1[b and $FF] xor t2[(b shr 16) and $FF] xor t3[(b shr 32) and $FF] xor t4[(b shr 48) and $FF]); a:= a + (t4[(b shr 8) and $FF] xor t3[(b shr 24) and $FF] xor t2[(b shr 40) and $FF] xor t1[(b shr 56) and $FF]); a:= a * 9; CurrentHash[0]:= a xor aa; CurrentHash[1]:= b - bb; CurrentHash[2]:= c + cc; Index:= 0; FillChar(HashBuffer,Sizeof(HashBuffer),0); end; class function TDCP_tiger.GetHashSize: integer; begin Result:= 192; end; class function TDCP_tiger.GetId: integer; begin Result:= DCP_tiger; end; class function TDCP_tiger.GetAlgorithm: string; begin Result:= 'Tiger'; end; class function TDCP_tiger.SelfTest: boolean; const Test1Out: array[0..2] of int64= ($87FB2A9083851CF7,$470D2CF810E6DF9E,$B586445034A5A386); Test2Out: array[0..2] of int64= ($0C410A042968868A,$1671DA5A3FD29A72,$5EC1E457D3CDB303); var TestHash: TDCP_tiger; TestOut: array[0..2] of int64; begin dcpFillChar(TestOut, SizeOf(TestOut), 0); TestHash:= TDCP_tiger.Create(nil); TestHash.Init; TestHash.UpdateStr('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-'); TestHash.Final(TestOut); Result:= CompareMem(@TestOut,@Test1Out,Sizeof(Test1Out)); TestHash.Init; TestHash.UpdateStr('Tiger - A Fast New Hash Function, by Ross Anderson and Eli Biham'); TestHash.Final(TestOut); Result:= CompareMem(@TestOut,@Test2Out,Sizeof(Test2Out)) and Result; TestHash.Free; end; procedure TDCP_tiger.Init; begin Burn; fInitialized:= true; CurrentHash[0]:= $0123456789ABCDEF; CurrentHash[1]:= $FEDCBA9876543210; CurrentHash[2]:= $F096A5B4C3B2E187; end; procedure TDCP_tiger.Burn; begin Len:= 0; Index:= 0; FillChar(HashBuffer,Sizeof(HashBuffer),0); FillChar(CurrentHash,Sizeof(CurrentHash),0); fInitialized:= false; end; procedure TDCP_tiger.Update(const Buffer; Size: longword); var PBuf: ^byte; begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); Inc(Len,Size*8); PBuf:= @Buffer; while Size> 0 do begin if (Sizeof(HashBuffer)-Index)<= DWord(Size) then begin Move(PBuf^,HashBuffer[Index],Sizeof(HashBuffer)-Index); Dec(Size,Sizeof(HashBuffer)-Index); Inc(PBuf,Sizeof(HashBuffer)-Index); Compress; end else begin Move(PBuf^,HashBuffer[Index],Size); Inc(Index,Size); Size:= 0; end; end; end; procedure TDCP_tiger.Final(var Digest); begin if not fInitialized then raise EDCP_hash.Create('Hash not initialized'); HashBuffer[Index]:= $01; if Index>= 56 then Compress; Pint64(@HashBuffer[56])^:= Len; Compress; Move(CurrentHash,Digest,Sizeof(CurrentHash)); Burn; end; end. doublecmd-0.5.8/components/dcpcrypt/Readme.txt0000644000175000017500000001125712014201074020456 0ustar alexxalexx =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= = DCPcrypt Cryptographic Component Library v2 Beta 3 = = Copyright (c) 1999-2003 David Barton = = http://www.cityinthesky.co.uk/ = = crypto@cityinthesky.co.uk = =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Introduction: DCPcrypt is a collection of cryptographic components for the Borland Delphi(tm), C++ Builder(tm) and Kylix(tm) programming languages. The supported versions are Delphi 4, 5, 6, 7, 2005, C++ Builder (3?), 4, 5, (6?) and Kylix 1 (untested), 2 and 3 (untested). Thanks to Manuel C. for the modifications to make DCPcrypt work under Delphi 2005! The idea behind DCPcrypt is that it should be possible to "drop in" any algorithm implementation to replace another with minimum or no code changes. To aid in this goal all cryptographic components are descended from one of several base classes, TDCP_cipher for encryption algorithms and TDCP_hash for message digest algorithms. DCPcrypt is open source software (released under the MIT license) and as such there is no charge for inclusion in other software. However, I am currently a student and if you are making money from my software I would really appreciate a donation of some sort, whether financial or a license for the software you develop (or if anyone wants to sponsor a Mathematical Modelling (Masters) student for their final year...). Please note THIS IS NOT COMPULSORY IN ANY WAY. See http://www.cityinthesky.co.uk/cryptography.html for details on financial donations. This software is OSI Certified Open Source Software. OSI Certified is a certification mark of the Open Source Initiative. If you maintain a website then a link to my page at http://www.cityinthesky.co.uk/ would be great! What's New: Changes since DCPcrypt v2 Beta 2 include * Corrected C++ Builder compilation problem. Changes since DCPcrypt v2 Beta 1 include * Renamed source code files for hashes and ciphers to DCPxxx.pas * Change the format of Cipher.InitStr so that the hash algorithm used to generate the key is explicitly specified. In order to get the same functionality as before, use TDCP_sha1. e.g. Cipher.InitStr('Hello World',TDCP_sha1); * Block ciphers are now inherited from an intermediate component that implements the block size specific chaining mode encryption routines. * Remove the internal component registration, it was more hassle than it was worth. If there is a demand for this to be put back then I might... * Added the full range of operation modes for Haval. By changing the defines at the top of DCPhaval.pas you can specify the number of passes and the output hash size. * Added the Tiger hash algorithm (192bit digest). * Changed the name of the file containing TDCP_ripemd160 for consistency to DCPripemd160 from DCPrmd160. * GOST no longer appears on the component palette pending verifying what the actual standard is (the code is still included however). * Added the RipeMD-128 hash algorithm (128bit digest). * Added the Serpent block cipher (AES finalist). * Added the SHA-256,384,512 hash algorithms (256, 384, 512bit digest respectively). * Added CTR chaining mode to all block ciphers. Installation: Delphi: Open the appropriate package, DCPdelphiX.dpk where X is your version of Delphi (either 4, 5 or 6). Then press the install button. C++ Builder: Create a new design time package and add all the .pas files from the DCPcrypt2.zip archive including all those in the Ciphers and Hashes subdirectories. Then press the install button. Kylix: Open the DCPkylix.dpk package and then press the install button (note: Kylix 1 users may need to create a new package as with C++ Builder as this is a Kylix 2 package). You may need to add the directory containing DCPcrypt (and the Ciphers and Hashes subdirectories) to your library search path (found under Environment Options). Once installed you will find two extra pages of components on your component palette, namely DCPciphers and DCPhashes. You can now place these components onto the form of your application to start using the algorithms. Usage: See the main html documentation in the Docs subdirectory. Contact: I appreciate knowing what DCPcrypt is being used for and also if you have any queries or bug reports please email me at crypto@cityinthesky.co.uk. DCPcrypt is copyrighted (c) 1999-2003 David Barton. All trademarks are property of their respective owners. doublecmd-0.5.8/components/dcpcrypt/dcpblockciphers.pas0000644000175000017500000005205412014201074022364 0ustar alexxalexx{******************************************************************************} {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********} {******************************************************************************} {* Block cipher component definitions *****************************************} {******************************************************************************} {* Copyright (c) 1999-2002 David Barton *} {* Permission is hereby granted, free of charge, to any person obtaining a *} {* copy of this software and associated documentation files (the "Software"), *} {* to deal in the Software without restriction, including without limitation *} {* the rights to use, copy, modify, merge, publish, distribute, sublicense, *} {* and/or sell copies of the Software, and to permit persons to whom the *} {* Software is furnished to do so, subject to the following conditions: *} {* *} {* The above copyright notice and this permission notice shall be included in *} {* all copies or substantial portions of the Software. *} {* *} {* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *} {* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *} {* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *} {* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *} {* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *} {* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *} {* DEALINGS IN THE SOFTWARE. *} {******************************************************************************} unit DCPblockciphers; {$MODE Delphi} interface uses Classes, Sysutils, DCPcrypt2; {******************************************************************************} { Base type definition for 64 bit block ciphers } type TDCP_blockcipher64= class(TDCP_blockcipher) private IV, CV: array[0..7] of byte; procedure IncCounter; public class function GetBlockSize: integer; override; { Get the block size of the cipher (in bits) } procedure Reset; override; { Reset any stored chaining information } procedure Burn; override; { Clear all stored key information and chaining information } procedure SetIV(const Value); override; { Sets the IV to Value and performs a reset } procedure GetIV(var Value); override; { Returns the current chaining information, not the actual IV } procedure Init(const Key; Size: longword; InitVector: pointer); override; { Do key setup based on the data in Key, size is in bits } procedure EncryptCBC(const Indata; var Outdata; Size: longword); override; { Encrypt size bytes of data using the CBC method of encryption } procedure DecryptCBC(const Indata; var Outdata; Size: longword); override; { Decrypt size bytes of data using the CBC method of decryption } procedure EncryptCFB8bit(const Indata; var Outdata; Size: longword); override; { Encrypt size bytes of data using the CFB (8 bit) method of encryption } procedure DecryptCFB8bit(const Indata; var Outdata; Size: longword); override; { Decrypt size bytes of data using the CFB (8 bit) method of decryption } procedure EncryptCFBblock(const Indata; var Outdata; Size: longword); override; { Encrypt size bytes of data using the CFB (block) method of encryption } procedure DecryptCFBblock(const Indata; var Outdata; Size: longword); override; { Decrypt size bytes of data using the CFB (block) method of decryption } procedure EncryptOFB(const Indata; var Outdata; Size: longword); override; { Encrypt size bytes of data using the OFB method of encryption } procedure DecryptOFB(const Indata; var Outdata; Size: longword); override; { Decrypt size bytes of data using the OFB method of decryption } procedure EncryptCTR(const Indata; var Outdata; Size: longword); override; { Encrypt size bytes of data using the CTR method of encryption } procedure DecryptCTR(const Indata; var Outdata; Size: longword); override; { Decrypt size bytes of data using the CTR method of decryption } end; {******************************************************************************} { Base type definition for 128 bit block ciphers } type TDCP_blockcipher128= class(TDCP_blockcipher) private IV, CV: array[0..15] of byte; procedure IncCounter; public class function GetBlockSize: integer; override; { Get the block size of the cipher (in bits) } procedure Reset; override; { Reset any stored chaining information } procedure Burn; override; { Clear all stored key information and chaining information } procedure SetIV(const Value); override; { Sets the IV to Value and performs a reset } procedure GetIV(var Value); override; { Returns the current chaining information, not the actual IV } procedure Init(const Key; Size: longword; InitVector: pointer); override; { Do key setup based on the data in Key, size is in bits } procedure EncryptCBC(const Indata; var Outdata; Size: longword); override; { Encrypt size bytes of data using the CBC method of encryption } procedure DecryptCBC(const Indata; var Outdata; Size: longword); override; { Decrypt size bytes of data using the CBC method of decryption } procedure EncryptCFB8bit(const Indata; var Outdata; Size: longword); override; { Encrypt size bytes of data using the CFB (8 bit) method of encryption } procedure DecryptCFB8bit(const Indata; var Outdata; Size: longword); override; { Decrypt size bytes of data using the CFB (8 bit) method of decryption } procedure EncryptCFBblock(const Indata; var Outdata; Size: longword); override; { Encrypt size bytes of data using the CFB (block) method of encryption } procedure DecryptCFBblock(const Indata; var Outdata; Size: longword); override; { Decrypt size bytes of data using the CFB (block) method of decryption } procedure EncryptOFB(const Indata; var Outdata; Size: longword); override; { Encrypt size bytes of data using the OFB method of encryption } procedure DecryptOFB(const Indata; var Outdata; Size: longword); override; { Decrypt size bytes of data using the OFB method of decryption } procedure EncryptCTR(const Indata; var Outdata; Size: longword); override; { Encrypt size bytes of data using the CTR method of encryption } procedure DecryptCTR(const Indata; var Outdata; Size: longword); override; { Decrypt size bytes of data using the CTR method of decryption } end; implementation {** TDCP_blockcipher64 ********************************************************} procedure TDCP_blockcipher64.IncCounter; var i: integer; begin Inc(CV[7]); i:= 7; while (i> 0) and (CV[i] = 0) do begin Inc(CV[i-1]); Dec(i); end; end; class function TDCP_blockcipher64.GetBlockSize: integer; begin Result:= 64; end; procedure TDCP_blockcipher64.Init(const Key; Size: longword; InitVector: pointer); begin inherited Init(Key,Size,InitVector); InitKey(Key,Size); if InitVector= nil then begin FillChar(IV,8,{$IFDEF DCP1COMPAT}$FF{$ELSE}0{$ENDIF}); EncryptECB(IV,IV); Reset; end else begin Move(InitVector^,IV,8); Reset; end; end; procedure TDCP_blockcipher64.SetIV(const Value); begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); Move(Value,IV,8); Reset; end; procedure TDCP_blockcipher64.GetIV(var Value); begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); Move(CV,Value,8); end; procedure TDCP_blockcipher64.Reset; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized') else Move(IV,CV,8); end; procedure TDCP_blockcipher64.Burn; begin FillChar(IV,8,$FF); FillChar(CV,8,$FF); inherited Burn; end; procedure TDCP_blockcipher64.EncryptCBC(const Indata; var Outdata; Size: longword); var i: longword; p1, p2: pointer; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; for i:= 1 to (Size div 8) do begin Move(p1^,p2^,8); XorBlock(p2^,CV,8); EncryptECB(p2^,p2^); Move(p2^,CV,8); p1:= pointer(p1 + 8); p2:= pointer(p2 + 8); end; if (Size mod 8)<> 0 then begin EncryptECB(CV,CV); Move(p1^,p2^,Size mod 8); XorBlock(p2^,CV,Size mod 8); end; end; procedure TDCP_blockcipher64.DecryptCBC(const Indata; var Outdata; Size: longword); var i: longword; p1, p2: pointer; Temp: array[0..7] of byte; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); dcpFillChar(Temp, SizeOf(Temp), 0); p1:= @Indata; p2:= @Outdata; for i:= 1 to (Size div 8) do begin Move(p1^,p2^,8); Move(p1^,Temp,8); DecryptECB(p2^,p2^); XorBlock(p2^,CV,8); Move(Temp,CV,8); p1:= pointer(p1 + 8); p2:= pointer(p2 + 8); end; if (Size mod 8)<> 0 then begin EncryptECB(CV,CV); Move(p1^,p2^,Size mod 8); XorBlock(p2^,CV,Size mod 8); end; end; procedure TDCP_blockcipher64.EncryptCFB8bit(const Indata; var Outdata; Size: longword); var i: longword; p1, p2: Pbyte; Temp: array[0..7] of byte; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; dcpFillChar(Temp, SizeOf(Temp), 0); for i:= 1 to Size do begin EncryptECB(CV,Temp); p2^:= p1^ xor Temp[0]; Move(CV[1],CV[0],8-1); CV[7]:= p2^; Inc(p1); Inc(p2); end; end; procedure TDCP_blockcipher64.DecryptCFB8bit(const Indata; var Outdata; Size: longword); var i: longword; p1, p2: Pbyte; TempByte: byte; Temp: array[0..7] of byte; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; dcpFillChar(Temp, SizeOf(Temp), 0); for i:= 1 to Size do begin TempByte:= p1^; EncryptECB(CV,Temp); p2^:= p1^ xor Temp[0]; Move(CV[1],CV[0],8-1); CV[7]:= TempByte; Inc(p1); Inc(p2); end; end; procedure TDCP_blockcipher64.EncryptCFBblock(const Indata; var Outdata; Size: longword); var i: longword; p1, p2: Pbyte; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; for i:= 1 to (Size div 8) do begin EncryptECB(CV,CV); Move(p1^,p2^,8); XorBlock(p2^,CV,8); Move(p2^,CV,8); p1:= pointer(pointer(p1) + 8); p2:= pointer(pointer(p2) + 8); end; if (Size mod 8)<> 0 then begin EncryptECB(CV,CV); Move(p1^,p2^,Size mod 8); XorBlock(p2^,CV,Size mod 8); end; end; procedure TDCP_blockcipher64.DecryptCFBblock(const Indata; var Outdata; Size: longword); var i: longword; p1, p2: Pbyte; Temp: array[0..7] of byte; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; dcpFillChar(Temp, SizeOf(Temp), 0); for i:= 1 to (Size div 8) do begin Move(p1^,Temp,8); EncryptECB(CV,CV); Move(p1^,p2^,8); XorBlock(p2^,CV,8); Move(Temp,CV,8); p1:= pointer(pointer(p1) + 8); p2:= pointer(pointer(p2) + 8); end; if (Size mod 8)<> 0 then begin EncryptECB(CV,CV); Move(p1^,p2^,Size mod 8); XorBlock(p2^,CV,Size mod 8); end; end; procedure TDCP_blockcipher64.EncryptOFB(const Indata; var Outdata; Size: longword); var i: longword; p1, p2: pointer; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; for i:= 1 to (Size div 8) do begin EncryptECB(CV,CV); Move(p1^,p2^,8); XorBlock(p2^,CV,8); p1:= pointer(p1 + 8); p2:= pointer(p2 + 8); end; if (Size mod 8)<> 0 then begin EncryptECB(CV,CV); Move(p1^,p2^,Size mod 8); XorBlock(p2^,CV,Size mod 8); end; end; procedure TDCP_blockcipher64.DecryptOFB(const Indata; var Outdata; Size: longword); var i: longword; p1, p2: pointer; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; for i:= 1 to (Size div 8) do begin EncryptECB(CV,CV); Move(p1^,p2^,8); XorBlock(p2^,CV,8); p1:= pointer(p1 + 8); p2:= pointer(p2 + 8); end; if (Size mod 8)<> 0 then begin EncryptECB(CV,CV); Move(p1^,p2^,Size mod 8); XorBlock(p2^,CV,Size mod 8); end; end; procedure TDCP_blockcipher64.EncryptCTR(const Indata; var Outdata; Size: longword); var temp: array[0..7] of byte; i: longword; p1, p2: pointer; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; dcpFillChar(Temp, SizeOf(Temp), 0); for i:= 1 to (Size div 8) do begin EncryptECB(CV,temp); IncCounter; Move(p1^,p2^,8); XorBlock(p2^,temp,8); p1:= pointer(p1 + 8); p2:= pointer(p2 + 8); end; if (Size mod 8)<> 0 then begin EncryptECB(CV,temp); IncCounter; Move(p1^,p2^,Size mod 8); XorBlock(p2^,temp,Size mod 8); end; end; procedure TDCP_blockcipher64.DecryptCTR(const Indata; var Outdata; Size: longword); var temp: array[0..7] of byte; i: longword; p1, p2: pointer; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; dcpFillChar(Temp, SizeOf(Temp), 0); for i:= 1 to (Size div 8) do begin EncryptECB(CV,temp); IncCounter; Move(p1^,p2^,8); XorBlock(p2^,temp,8); p1:= pointer(p1 + 8); p2:= pointer(p2 + 8); end; if (Size mod 8)<> 0 then begin EncryptECB(CV,temp); IncCounter; Move(p1^,p2^,Size mod 8); XorBlock(p2^,temp,Size mod 8); end; end; {** TDCP_blockcipher128 ********************************************************} procedure TDCP_blockcipher128.IncCounter; var i: integer; begin Inc(CV[15]); i:= 15; while (i> 0) and (CV[i] = 0) do begin Inc(CV[i-1]); Dec(i); end; end; class function TDCP_blockcipher128.GetBlockSize: integer; begin Result:= 128; end; procedure TDCP_blockcipher128.Init(const Key; Size: longword; InitVector: pointer); begin inherited Init(Key,Size,InitVector); InitKey(Key,Size); if InitVector= nil then begin FillChar(IV,16,{$IFDEF DCP1COMPAT}$FF{$ELSE}0{$ENDIF}); EncryptECB(IV,IV); Reset; end else begin Move(InitVector^,IV,16); Reset; end; end; procedure TDCP_blockcipher128.SetIV(const Value); begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); Move(Value,IV,16); Reset; end; procedure TDCP_blockcipher128.GetIV(var Value); begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); Move(CV,Value,16); end; procedure TDCP_blockcipher128.Reset; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized') else Move(IV,CV,16); end; procedure TDCP_blockcipher128.Burn; begin FillChar(IV,16,$FF); FillChar(CV,16,$FF); inherited Burn; end; procedure TDCP_blockcipher128.EncryptCBC(const Indata; var Outdata; Size: longword); var i: longword; p1, p2: pointer; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; for i:= 1 to (Size div 16) do begin Move(p1^,p2^,16); XorBlock(p2^,CV,16); EncryptECB(p2^,p2^); Move(p2^,CV,16); p1:= pointer(p1 + 16); p2:= pointer(p2 + 16); end; if (Size mod 16)<> 0 then begin EncryptECB(CV,CV); Move(p1^,p2^,Size mod 16); XorBlock(p2^,CV,Size mod 16); end; end; procedure TDCP_blockcipher128.DecryptCBC(const Indata; var Outdata; Size: longword); var i: longword; p1, p2: pointer; Temp: array[0..15] of byte; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; dcpFillChar(Temp, SizeOf(Temp), 0); for i:= 1 to (Size div 16) do begin Move(p1^,p2^,16); Move(p1^,Temp,16); DecryptECB(p2^,p2^); XorBlock(p2^,CV,16); Move(Temp,CV,16); p1:= pointer(p1 + 16); p2:= pointer(p2 + 16); end; if (Size mod 16)<> 0 then begin EncryptECB(CV,CV); Move(p1^,p2^,Size mod 16); XorBlock(p2^,CV,Size mod 16); end; end; procedure TDCP_blockcipher128.EncryptCFB8bit(const Indata; var Outdata; Size: longword); var i: longword; p1, p2: Pbyte; Temp: array[0..15] of byte; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; dcpFillChar(Temp, SizeOf(Temp), 0); for i:= 1 to Size do begin EncryptECB(CV,Temp); p2^:= p1^ xor Temp[0]; Move(CV[1],CV[0],15); CV[15]:= p2^; Inc(p1); Inc(p2); end; end; procedure TDCP_blockcipher128.DecryptCFB8bit(const Indata; var Outdata; Size: longword); var i: longword; p1, p2: Pbyte; TempByte: byte; Temp: array[0..15] of byte; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; dcpFillChar(Temp, SizeOf(Temp), 0); for i:= 1 to Size do begin TempByte:= p1^; EncryptECB(CV,Temp); p2^:= p1^ xor Temp[0]; Move(CV[1],CV[0],15); CV[15]:= TempByte; Inc(p1); Inc(p2); end; end; procedure TDCP_blockcipher128.EncryptCFBblock(const Indata; var Outdata; Size: longword); var i: longword; p1, p2: Pbyte; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; for i:= 1 to (Size div 16) do begin EncryptECB(CV,CV); Move(p1^,p2^,16); XorBlock(p2^,CV,16); Move(p2^,CV,16); p1:= pointer(pointer(p1) + 16); p2:= pointer(pointer(p2) + 16); end; if (Size mod 16)<> 0 then begin EncryptECB(CV,CV); Move(p1^,p2^,Size mod 16); XorBlock(p2^,CV,Size mod 16); end; end; procedure TDCP_blockcipher128.DecryptCFBblock(const Indata; var Outdata; Size: longword); var i: longword; p1, p2: Pbyte; Temp: array[0..15] of byte; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; dcpFillChar(Temp, SizeOf(Temp), 0); for i:= 1 to (Size div 16) do begin Move(p1^,Temp,16); EncryptECB(CV,CV); Move(p1^,p2^,16); XorBlock(p2^,CV,16); Move(Temp,CV,16); p1:= pointer(pointer(p1) + 16); p2:= pointer(pointer(p2) + 16); end; if (Size mod 16)<> 0 then begin EncryptECB(CV,CV); Move(p1^,p2^,Size mod 16); XorBlock(p2^,CV,Size mod 16); end; end; procedure TDCP_blockcipher128.EncryptOFB(const Indata; var Outdata; Size: longword); var i: longword; p1, p2: pointer; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; for i:= 1 to (Size div 16) do begin EncryptECB(CV,CV); Move(p1^,p2^,16); XorBlock(p2^,CV,16); p1:= pointer(p1 + 16); p2:= pointer(p2 + 16); end; if (Size mod 16)<> 0 then begin EncryptECB(CV,CV); Move(p1^,p2^,Size mod 16); XorBlock(p2^,CV,Size mod 16); end; end; procedure TDCP_blockcipher128.DecryptOFB(const Indata; var Outdata; Size: longword); var i: longword; p1, p2: pointer; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; for i:= 1 to (Size div 16) do begin EncryptECB(CV,CV); Move(p1^,p2^,16); XorBlock(p2^,CV,16); p1:= pointer(p1 + 16); p2:= pointer(p2 + 16); end; if (Size mod 16)<> 0 then begin EncryptECB(CV,CV); Move(p1^,p2^,Size mod 16); XorBlock(p2^,CV,Size mod 16); end; end; procedure TDCP_blockcipher128.EncryptCTR(const Indata; var Outdata; Size: longword); var temp: array[0..15] of byte; i: longword; p1, p2: pointer; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; dcpFillChar(Temp, SizeOf(Temp), 0); for i:= 1 to (Size div 16) do begin EncryptECB(CV,temp); IncCounter; Move(p1^,p2^,16); XorBlock(p2^,temp,16); p1:= pointer(p1 + 16); p2:= pointer(p2 + 16); end; if (Size mod 16)<> 0 then begin EncryptECB(CV,temp); IncCounter; Move(p1^,p2^,Size mod 16); XorBlock(p2^,temp,Size mod 16); end; end; procedure TDCP_blockcipher128.DecryptCTR(const Indata; var Outdata; Size: longword); var temp: array[0..15] of byte; i: longword; p1, p2: pointer; begin if not fInitialized then raise EDCP_blockcipher.Create('Cipher not initialized'); p1:= @Indata; p2:= @Outdata; dcpFillChar(Temp, SizeOf(Temp), 0); for i:= 1 to (Size div 16) do begin EncryptECB(CV,temp); IncCounter; Move(p1^,p2^,16); XorBlock(p2^,temp,16); p1:= pointer(p1 + 16); p2:= pointer(p2 + 16); end; if (Size mod 16)<> 0 then begin EncryptECB(CV,temp); IncCounter; Move(p1^,p2^,Size mod 16); XorBlock(p2^,temp,Size mod 16); end; end; end. doublecmd-0.5.8/components/dcpcrypt/DCPciphers.lrs0000644000175000017500000007536611652036011021245 0ustar alexxalexxLazarusResources.Add('TDCP_3DES','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#238#239 +#255#238#238#255#254#239#255#255#255#254#204#206#254#204#204#239#236#206#255 +#255#255#254#206#236#238#206#238#254#206#236#239#255#255#254#206#236#238#206 +#255#255#238#236#239#255#255#254#206#236#238#204#239#255#236#206#255#255#255 +#254#206#236#238#206#255#254#206#238#255#255#255#254#206#236#238#206#238#254 +#206#236#239#255#255#254#204#206#254#204#204#239#236#206#255#255#255#255#238 +#239#255#238#238#255#254#239#255#255#255#255#255#255#255#254#239#255#255#255 +#255#255#255#255#255#255#255#236#206#255#255#255#255#255#255#255#255#255#254 +#206#236#239#255#255#255#255#255#255#255#255#255#238#236#239#255#255#255#255 +#255#255#255#255#255#236#206#255#255#255#255#255#255#255#255#255#255#238#236 +#239#255#255#255#255#255#255#255#255#254#206#236#239#255#255#255#255#255#255 +#255#255#255#236#206#255#255#255#255#255#255#255#255#255#255#254#239#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_BLOWFISH','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#254#255#255#254 +#238#255#238#239#255#239#254#255#236#239#255#236#204#238#204#206#254#206#236 +#239#236#239#255#254#206#255#238#236#238#206#236#239#236#238#255#254#206#255 +#254#236#238#206#236#239#236#204#239#254#206#255#236#206#254#204#204#239#236 +#238#255#254#206#254#206#239#254#206#236#239#236#238#239#254#206#254#206#238 +#254#206#236#239#236#204#206#236#204#239#236#204#238#206#236#239#254#238#239 +#254#238#255#254#238#255#239#254#255#254#238#255#254#238#239#254#239#255#254 +#254#255#236#204#239#236#204#206#236#206#255#236#236#239#236#238#206#236#238 +#238#206#236#238#206#206#206#236#238#206#236#239#254#206#236#238#206#206#206 +#236#204#239#236#239#254#206#236#238#206#206#206#236#238#206#236#239#254#206 +#236#238#206#238#206#236#238#206#236#239#254#206#236#238#206#254#206#236#204 +#239#236#239#255#236#206#254#206#254#206#254#238#255#254#255#255#254#239#255 +#239#255#239#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_CAST128','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#238#239 +#254#238#239#255#238#255#255#255#255#254#204#206#236#204#206#254#204#239#255 +#255#255#255#236#239#236#238#239#236#238#206#255#255#255#255#236#239#254#206 +#255#236#238#206#255#255#255#255#236#239#255#236#239#254#204#239#255#255#255 +#255#236#239#254#254#206#236#238#206#255#255#255#254#204#239#236#238#206#236 +#238#206#255#255#255#255#236#239#254#204#239#254#204#239#255#255#255#255#254 +#255#255#238#255#255#238#255#255#255#255#238#239#254#255#239#254#238#255#255 +#239#255#254#204#206#236#238#206#236#204#239#254#206#255#236#238#239#236#238 +#206#254#238#206#254#206#255#236#239#255#236#238#206#255#238#206#254#206#255 +#236#239#255#236#204#206#254#204#239#254#206#255#236#239#255#236#238#206#236 +#238#255#254#206#255#236#238#239#236#238#206#236#238#239#254#206#255#254#204 +#206#254#204#239#254#204#206#236#204#239#255#238#239#255#238#255#255#238#239 +#254#238#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_CAST256','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#238#238 +#255#238#239#255#254#239#255#255#255#254#204#204#238#204#206#255#236#206#255 +#255#255#255#236#238#255#238#236#238#206#236#239#255#255#255#255#206#255#238 +#236#238#206#236#239#255#255#255#255#236#238#204#206#254#204#206#255#255#255 +#255#239#236#238#206#239#254#206#238#255#255#255#254#206#236#238#206#238#254 +#206#236#239#255#255#255#236#206#254#204#204#255#236#206#255#255#255#255#254 +#239#255#238#238#255#254#239#255#255#255#238#239#254#255#239#254#238#255#255 +#239#255#254#204#206#236#238#206#236#204#239#254#206#255#236#238#239#236#238 +#206#254#238#206#254#206#255#236#239#255#236#238#206#255#238#206#254#206#255 +#236#239#255#236#204#206#254#204#239#254#206#255#236#239#255#236#238#206#236 +#238#255#254#206#255#236#238#239#236#238#206#236#238#239#254#206#255#254#204 +#206#254#204#239#254#204#206#236#204#239#255#238#239#255#238#255#255#238#239 +#254#238#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_DES','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#238#239#255#238#238#255#254#239#255#255#255#254#204#206#254#204#204#239 +#236#206#255#255#255#254#206#236#238#206#238#254#206#236#239#255#255#254#206 +#236#238#206#255#255#238#236#239#255#255#254#206#236#238#204#239#255#236#206 +#255#255#255#254#206#236#238#206#255#254#206#238#255#255#255#254#206#236#238 +#206#238#254#206#236#239#255#255#254#204#206#254#204#204#239#236#206#255#255 +#255#255#238#239#255#238#238#255#254#239#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_GOST','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#254#239#255#254#239#255#238#239#255#254#255#255#236#206#255#236#206#254#204 +#206#255#236#239#254#206#236#238#206#236#239#238#236#239#236#239#254#206#204 +#238#206#236#239#254#236#239#236#239#254#206#238#254#206#236#239#236#206#255 +#236#239#254#206#254#254#206#236#238#206#239#255#236#239#254#206#236#238#206 +#236#238#206#238#255#236#239#255#236#206#255#236#206#255#236#204#238#204#206 +#255#254#239#255#254#239#255#254#238#255#238#239#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_ICE2','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#254#238#239#255#255#255#255#255#255#255#255#255#236#204#206#255#255#255#255 +#255#255#255#255#255#236#238#239#255#255#255#255#255#255#255#255#255#254#206 +#255#255#255#255#255#255#255#255#255#255#255#236#239#255#255#255#255#255#255 +#255#255#255#254#254#206#255#255#255#255#255#255#255#255#255#236#238#206#255 +#255#255#255#255#255#255#255#255#254#204#239#255#255#255#255#255#255#255#255 +#255#255#238#255#255#255#255#255#255#255#255#238#239#255#238#239#254#238#239 +#255#255#255#254#204#206#254#204#206#236#204#206#255#255#255#255#236#239#236 +#238#239#236#238#239#255#255#255#255#236#239#236#239#255#236#238#255#255#255 +#255#255#236#239#236#239#255#236#204#239#255#255#255#255#236#239#236#239#255 +#236#238#255#255#255#255#255#236#239#236#238#239#236#238#239#255#255#255#254 +#204#206#254#204#206#236#204#206#255#255#255#255#238#239#255#238#239#254#238 +#239#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_ICE','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#238#239#255#238#239#254#238#239#255#255#255#254#204#206#254#204#206#236 +#204#206#255#255#255#255#236#239#236#238#239#236#238#239#255#255#255#255#236 +#239#236#239#255#236#238#255#255#255#255#255#236#239#236#239#255#236#204#239 +#255#255#255#255#236#239#236#239#255#236#238#255#255#255#255#255#236#239#236 +#238#239#236#238#239#255#255#255#254#204#206#254#204#206#236#204#206#255#255 +#255#255#238#239#255#238#239#254#238#239#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_IDEA','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#238#239#254#238#255#254#238#239#254#255#239#254#204#206#236#204#239#236#204 +#206#236#238#206#255#236#239#236#238#206#236#238#239#236#238#206#255#236#239 +#236#238#206#236#238#255#236#238#206#255#236#239#236#238#206#236#204#239#236 +#204#206#255#236#239#236#238#206#236#238#255#236#238#206#255#236#239#236#238 +#206#236#238#239#236#238#206#254#204#206#236#204#239#236#204#206#254#204#239 +#255#238#239#254#238#255#254#238#239#255#238#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_MARS','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#239#255#239#239#254#254#255#239#238#239#255#254#206#254#206#206#236#236#238 +#206#204#206#255#254#206#238#206#206#236#236#238#206#238#236#239#254#206#206 +#206#206#236#236#238#206#254#236#239#254#206#206#206#204#204#236#204#239#236 +#206#255#254#204#236#206#206#236#236#238#206#206#239#255#254#204#236#206#206 +#236#236#238#206#206#238#255#254#206#254#206#236#206#236#204#239#236#204#239 +#255#239#255#239#254#239#254#238#255#254#238#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_MISTY1','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#238#239#255#255#255#255#255#255#255#255#255#254#204#206#255#255#255#255 +#255#255#255#255#255#255#236#239#255#255#255#255#255#255#255#255#255#255#236 +#239#255#255#255#255#255#255#255#255#255#255#236#239#255#255#255#255#255#255 +#255#255#255#255#236#239#255#255#255#255#255#255#255#255#255#254#204#239#255 +#255#255#255#255#255#255#255#255#255#236#239#255#255#255#255#255#255#255#255 +#255#255#254#255#255#255#255#255#255#254#255#254#254#238#254#238#255#254#255 +#238#255#236#239#236#236#204#236#204#239#236#238#204#239#236#238#236#238#206 +#254#238#206#236#239#238#206#236#236#236#238#206#255#238#206#236#239#254#206 +#236#236#236#238#206#254#204#239#236#239#236#206#236#206#204#238#206#236#238 +#255#236#238#206#206#236#206#204#238#206#236#238#239#236#238#206#206#236#239 +#236#236#204#238#204#206#204#206#206#206#254#255#254#254#238#255#238#239#238 +#239#239#239#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_RC2','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#239#254#255#254#238#255#238#238#255#255#255#254#206#236#239#236#204#238 +#204#204#239#255#255#254#206#236#238#206#238#254#206#238#255#255#255#254#206 +#236#238#206#255#255#236#239#255#255#255#254#204#206#254#206#255#255#254#206 +#255#255#255#254#206#236#238#206#255#255#239#236#239#255#255#254#206#236#238 +#206#238#254#206#236#239#255#255#254#204#206#255#236#204#239#236#206#255#255 +#255#255#238#239#255#254#238#255#254#239#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_RC4','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#239#254#255#254#238#255#255#239#255#255#255#254#206#236#239#236#204#239 +#254#206#255#255#255#254#206#236#238#206#238#255#238#206#255#255#255#254#206 +#236#238#206#255#254#204#204#239#255#255#254#204#206#254#206#255#254#206#206 +#255#255#255#254#206#236#238#206#255#254#206#239#255#255#255#254#206#236#238 +#206#238#254#206#255#255#255#255#254#204#206#255#236#204#238#206#255#255#255 +#255#255#238#239#255#254#238#255#239#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_RC5','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#239#254#255#254#238#255#238#239#255#255#255#254#206#236#239#236#204#238 +#204#206#255#255#255#254#206#236#238#206#238#255#238#236#239#255#255#254#206 +#236#238#206#255#255#238#236#239#255#255#254#204#206#254#206#255#254#204#206 +#255#255#255#254#206#236#238#206#255#254#206#239#255#255#255#254#206#236#238 +#206#238#254#206#238#255#255#255#254#204#206#255#236#204#238#204#204#239#255 +#255#255#238#239#255#254#238#255#238#238#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_RC6','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#239#254#255#254#238#255#254#239#255#255#255#254#206#236#239#236#204#239 +#236#206#255#255#255#254#206#236#238#206#238#254#206#236#239#255#255#254#206 +#236#238#206#255#254#206#236#239#255#255#254#204#206#254#206#255#254#204#206 +#255#255#255#254#206#236#238#206#255#254#206#238#255#255#255#254#206#236#238 +#206#238#254#206#236#239#255#255#254#204#206#255#236#204#239#236#206#255#255 +#255#255#238#239#255#254#238#255#254#239#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_RIJNDAEL','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#254#238#255#254 +#255#239#254#238#239#238#238#255#236#204#239#236#238#206#236#204#206#204#204 +#239#236#238#206#236#238#206#236#238#238#206#238#255#236#238#206#236#238#206 +#236#238#254#206#255#255#236#238#206#236#204#206#236#204#238#206#255#255#236 +#238#206#236#238#206#236#238#254#206#255#255#236#238#206#236#238#206#236#238 +#238#206#255#255#236#204#239#254#204#239#236#204#206#206#255#255#254#238#255 +#255#238#255#254#238#239#239#255#255#254#255#239#254#238#255#254#255#255#239 +#254#255#236#238#206#236#204#239#236#239#254#206#236#239#236#238#206#254#206 +#254#206#206#254#206#236#239#236#238#206#254#206#254#206#206#254#206#204#239 +#236#204#239#254#206#255#238#206#254#206#204#239#236#238#206#254#206#255#254 +#206#254#204#236#239#236#238#206#254#206#255#238#206#254#204#236#239#236#204 +#239#236#204#238#204#204#238#206#236#239#254#238#255#254#238#255#238#238#255 +#239#254#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_SERPENT','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#128#128#128#0#192#192#192#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#239#255#254 +#238#239#239#254#255#254#255#255#254#206#255#236#204#206#206#236#239#236#239 +#255#254#206#255#236#238#238#206#204#239#236#239#255#254#206#239#236#238#254 +#206#204#239#236#239#255#254#204#206#236#204#238#204#204#239#236#239#255#254 +#206#236#236#238#254#204#236#239#236#239#255#254#206#236#236#238#238#204#236 +#238#236#238#255#254#204#206#236#204#206#206#236#236#204#204#239#255#238#239 +#254#238#239#239#254#254#238#238#255#255#255#238#239#255#238#238#255#239#254 +#255#255#255#254#204#206#254#204#204#238#206#236#239#255#255#255#238#236#238 +#206#238#254#206#236#239#255#255#255#254#236#238#206#239#254#206#236#239#255 +#255#255#236#206#254#204#206#254#204#206#255#255#255#254#206#239#254#206#239 +#254#206#236#239#255#255#254#206#238#254#206#238#254#206#236#239#255#255#255 +#236#204#238#204#204#238#204#206#255#255#255#255#254#238#255#238#238#255#254 +#239#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_TEA','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#254#255#255#238#238#255#239#254#255#255#255#255#236#239#254#204#204#238 +#206#236#239#255#255#255#236#239#254#206#238#254#206#236#239#255#255#255#236 +#239#254#206#255#254#206#236#239#255#255#255#236#239#254#204#239#254#204#204 +#239#255#255#255#236#239#254#206#255#254#206#236#239#255#255#254#236#238#254 +#206#238#254#206#236#239#255#255#236#204#204#238#204#204#239#236#206#255#255 +#255#254#238#238#255#238#238#255#254#239#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_THINICE','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#238#239 +#255#238#239#254#238#239#255#255#255#254#204#206#254#204#206#236#204#206#255 +#255#255#255#236#239#236#238#239#236#238#239#255#255#255#255#236#239#236#239 +#255#236#238#255#255#255#255#255#236#239#236#239#255#236#204#239#255#255#255 +#255#236#239#236#239#255#236#238#255#255#255#255#255#236#239#236#238#239#236 +#238#239#255#255#255#254#204#206#254#204#206#236#204#206#255#255#255#255#238 +#239#255#238#239#254#238#239#255#255#255#254#255#254#255#239#254#238#255#239 +#254#255#255#236#239#236#238#206#236#204#238#206#236#239#255#236#239#236#238 +#206#254#206#254#206#236#239#255#236#239#236#238#206#254#206#254#206#204#239 +#255#236#239#236#204#206#254#206#254#206#204#239#255#236#239#236#238#206#254 +#206#254#204#236#239#255#236#239#236#238#206#254#206#254#204#236#239#254#204 +#206#236#238#206#236#204#238#206#236#239#255#238#239#254#255#239#254#238#255 +#239#254#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_TWOFISH','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#254#255#255#254 +#238#255#238#239#255#239#254#255#236#239#255#236#204#238#204#206#254#206#236 +#239#236#239#255#254#206#255#238#236#238#206#236#239#236#238#255#254#206#255 +#254#236#238#206#236#239#236#204#239#254#206#255#236#206#254#204#204#239#236 +#238#255#254#206#254#206#239#254#206#236#239#236#238#239#254#206#254#206#238 +#254#206#236#239#236#204#206#236#204#239#236#204#238#206#236#239#254#238#239 +#254#238#255#254#238#255#239#254#255#255#255#254#255#255#254#254#255#255#238 +#255#255#255#255#236#239#255#236#236#239#254#204#239#255#255#255#236#239#254 +#206#206#206#236#238#206#255#255#255#236#239#254#206#206#206#236#238#206#255 +#255#255#236#239#254#206#206#206#236#238#206#255#255#255#236#239#254#206#238 +#206#236#238#206#255#255#254#236#238#254#206#254#206#236#238#206#255#255#236 +#204#204#238#206#254#206#254#204#239#255#255#254#238#238#255#239#255#239#255 +#238#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); doublecmd-0.5.8/components/dcpcrypt/dcpcrypt2.pas0000644000175000017500000005206111652036011021141 0ustar alexxalexx{******************************************************************************} {* DCPcrypt v2.0 written by David Barton (crypto@cityinthesky.co.uk) **********} {******************************************************************************} {* Main component definitions *************************************************} {******************************************************************************} {* Copyright (c) 1999-2003 David Barton *} {* Permission is hereby granted, free of charge, to any person obtaining a *} {* copy of this software and associated documentation files (the "Software"), *} {* to deal in the Software without restriction, including without limitation *} {* the rights to use, copy, modify, merge, publish, distribute, sublicense, *} {* and/or sell copies of the Software, and to permit persons to whom the *} {* Software is furnished to do so, subject to the following conditions: *} {* *} {* The above copyright notice and this permission notice shall be included in *} {* all copies or substantial portions of the Software. *} {* *} {* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *} {* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *} {* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *} {* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *} {* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *} {* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *} {* DEALINGS IN THE SOFTWARE. *} {******************************************************************************} unit DCPcrypt2; {$MODE Delphi} interface uses Classes, Sysutils, DCPbase64; //{$DEFINE DCP1COMPAT} { DCPcrypt v1.31 compatiblity mode - see documentation } {******************************************************************************} { A few predefined types to help out } type {$IFNDEF FPC} Pbyte= ^byte; Pword= ^word; Pdword= ^dword; Pint64= ^int64; dword= longword; Pwordarray= ^Twordarray; Twordarray= array[0..19383] of word; {$ENDIF} Pdwordarray= ^Tdwordarray; Tdwordarray= array[0..8191] of dword; {******************************************************************************} { The base class from which all hash algorithms are to be derived } type EDCP_hash= class(Exception); TDCP_hash= class(TComponent) protected fInitialized: boolean; { Whether or not the algorithm has been initialized } procedure DeadInt(Value: integer); { Knudge to display vars in the object inspector } procedure DeadStr(Value: string); { Knudge to display vars in the object inspector } private function _GetId: integer; function _GetAlgorithm: string; function _GetHashSize: integer; public property Initialized: boolean read fInitialized; class function GetId: integer; virtual; { Get the algorithm id } class function GetAlgorithm: string; virtual; { Get the algorithm name } class function GetHashSize: integer; virtual; { Get the size of the digest produced - in bits } class function SelfTest: boolean; virtual; { Tests the implementation with several test vectors } procedure Init; virtual; { Initialize the hash algorithm } procedure Final(var Digest); virtual; { Create the final digest and clear the stored information. The size of the Digest var must be at least equal to the hash size } procedure Burn; virtual; { Clear any stored information with out creating the final digest } procedure Update(const Buffer; Size: longword); virtual; { Update the hash buffer with Size bytes of data from Buffer } procedure UpdateStream(Stream: TStream; Size: longword); { Update the hash buffer with Size bytes of data from the stream } procedure UpdateStr(const Str: string); { Update the hash buffer with the string } destructor Destroy; override; published property Id: integer read _GetId write DeadInt; property Algorithm: string read _GetAlgorithm write DeadStr; property HashSize: integer read _GetHashSize write DeadInt; end; TDCP_hashclass= class of TDCP_hash; {******************************************************************************} { The base class from which all encryption components will be derived. } { Stream ciphers will be derived directly from this class where as } { Block ciphers will have a further foundation class TDCP_blockcipher. } type EDCP_cipher= class(Exception); TDCP_cipher= class(TComponent) protected fInitialized: boolean; { Whether or not the key setup has been done yet } procedure DeadInt(Value: integer); { Knudge to display vars in the object inspector } procedure DeadStr(Value: string); { Knudge to display vars in the object inspector } private function _GetId: integer; function _GetAlgorithm: string; function _GetMaxKeySize: integer; public property Initialized: boolean read fInitialized; class function GetId: integer; virtual; { Get the algorithm id } class function GetAlgorithm: string; virtual; { Get the algorithm name } class function GetMaxKeySize: integer; virtual; { Get the maximum key size (in bits) } class function SelfTest: boolean; virtual; { Tests the implementation with several test vectors } procedure Init(const Key; Size: longword; InitVector: pointer); virtual; { Do key setup based on the data in Key, size is in bits } procedure InitStr(const Key: string; HashType: TDCP_hashclass); { Do key setup based on a hash of the key string } procedure Burn; virtual; { Clear all stored key information } procedure Reset; virtual; { Reset any stored chaining information } procedure Encrypt(const Indata; var Outdata; Size: longword); virtual; { Encrypt size bytes of data and place in Outdata } procedure Decrypt(const Indata; var Outdata; Size: longword); virtual; { Decrypt size bytes of data and place in Outdata } function EncryptStream(InStream, OutStream: TStream; Size: longword): longword; { Encrypt size bytes of data from InStream and place in OutStream } function DecryptStream(InStream, OutStream: TStream; Size: longword): longword; { Decrypt size bytes of data from InStream and place in OutStream } function EncryptString(const Str: string): string; virtual; { Encrypt a string and return Base64 encoded } function DecryptString(const Str: string): string; virtual; { Decrypt a Base64 encoded string } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property Id: integer read _GetId write DeadInt; property Algorithm: string read _GetAlgorithm write DeadStr; property MaxKeySize: integer read _GetMaxKeySize write DeadInt; end; TDCP_cipherclass= class of TDCP_cipher; {******************************************************************************} { The base class from which all block ciphers are to be derived, this } { extra class takes care of the different block encryption modes. } type TDCP_ciphermode= (cmCBC, cmCFB8bit, cmCFBblock, cmOFB, cmCTR); // cmCFB8bit is equal to DCPcrypt v1.xx's CFB mode EDCP_blockcipher= class(EDCP_cipher); TDCP_blockcipher= class(TDCP_cipher) protected fCipherMode: TDCP_ciphermode; { The cipher mode the encrypt method uses } procedure InitKey(const Key; Size: longword); virtual; private function _GetBlockSize: integer; public class function GetBlockSize: integer; virtual; { Get the block size of the cipher (in bits) } procedure SetIV(const Value); virtual; { Sets the IV to Value and performs a reset } procedure GetIV(var Value); virtual; { Returns the current chaining information, not the actual IV } procedure Encrypt(const Indata; var Outdata; Size: longword); override; { Encrypt size bytes of data and place in Outdata using CipherMode } procedure Decrypt(const Indata; var Outdata; Size: longword); override; { Decrypt size bytes of data and place in Outdata using CipherMode } function EncryptString(const Str: string): string; override; { Encrypt a string and return Base64 encoded } function DecryptString(const Str: string): string; override; { Decrypt a Base64 encoded string } procedure EncryptECB(const Indata; var Outdata); virtual; { Encrypt a block of data using the ECB method of encryption } procedure DecryptECB(const Indata; var Outdata); virtual; { Decrypt a block of data using the ECB method of decryption } procedure EncryptCBC(const Indata; var Outdata; Size: longword); virtual; { Encrypt size bytes of data using the CBC method of encryption } procedure DecryptCBC(const Indata; var Outdata; Size: longword); virtual; { Decrypt size bytes of data using the CBC method of decryption } procedure EncryptCFB8bit(const Indata; var Outdata; Size: longword); virtual; { Encrypt size bytes of data using the CFB (8 bit) method of encryption } procedure DecryptCFB8bit(const Indata; var Outdata; Size: longword); virtual; { Decrypt size bytes of data using the CFB (8 bit) method of decryption } procedure EncryptCFBblock(const Indata; var Outdata; Size: longword); virtual; { Encrypt size bytes of data using the CFB (block) method of encryption } procedure DecryptCFBblock(const Indata; var Outdata; Size: longword); virtual; { Decrypt size bytes of data using the CFB (block) method of decryption } procedure EncryptOFB(const Indata; var Outdata; Size: longword); virtual; { Encrypt size bytes of data using the OFB method of encryption } procedure DecryptOFB(const Indata; var Outdata; Size: longword); virtual; { Decrypt size bytes of data using the OFB method of decryption } procedure EncryptCTR(const Indata; var Outdata; Size: longword); virtual; { Encrypt size bytes of data using the CTR method of encryption } procedure DecryptCTR(const Indata; var Outdata; Size: longword); virtual; { Decrypt size bytes of data using the CTR method of decryption } constructor Create(AOwner: TComponent); override; published property BlockSize: integer read _GetBlockSize write DeadInt; property CipherMode: TDCP_ciphermode read fCipherMode write fCipherMode default cmCBC; end; TDCP_blockcipherclass= class of TDCP_blockcipher; {******************************************************************************} { Helper functions } procedure XorBlock(var InData1, InData2; Size: longword); // Supposed to be an optimized version of XorBlock() using 32-bit xor procedure XorBlockEx(var InData1, InData2; Size: longword); // removes the compiler hint due to first param being 'var' instead of 'out' procedure dcpFillChar(out x; count: SizeInt; Value: Byte); overload; procedure dcpFillChar(out x; count: SizeInt; Value: Char); overload; procedure ZeroMemory(Destination: Pointer; Length: PtrUInt); implementation {$Q-}{$R-} {** TDCP_hash *****************************************************************} procedure TDCP_hash.DeadInt(Value: integer); begin end; procedure TDCP_hash.DeadStr(Value: string); begin end; function TDCP_hash._GetId: integer; begin Result:= GetId; end; function TDCP_hash._GetAlgorithm: string; begin Result:= GetAlgorithm; end; function TDCP_hash._GetHashSize: integer; begin Result:= GetHashSize; end; class function TDCP_hash.GetId: integer; begin Result:= -1; end; class function TDCP_hash.GetAlgorithm: string; begin Result:= ''; end; class function TDCP_hash.GetHashSize: integer; begin Result:= -1; end; class function TDCP_hash.SelfTest: boolean; begin Result:= false; end; procedure TDCP_hash.Init; begin end; procedure TDCP_hash.Final(var Digest); begin end; procedure TDCP_hash.Burn; begin end; procedure TDCP_hash.Update(const Buffer; Size: longword); begin end; procedure TDCP_hash.UpdateStream(Stream: TStream; Size: longword); var Buffer: array[0..8191] of byte; i, read: integer; begin dcpFillChar(Buffer, SizeOf(Buffer), 0); for i:= 1 to (Size div Sizeof(Buffer)) do begin read:= Stream.Read(Buffer,Sizeof(Buffer)); Update(Buffer,read); end; if (Size mod Sizeof(Buffer))<> 0 then begin read:= Stream.Read(Buffer,Size mod Sizeof(Buffer)); Update(Buffer,read); end; end; procedure TDCP_hash.UpdateStr(const Str: string); begin Update(Str[1],Length(Str)); end; destructor TDCP_hash.Destroy; begin if fInitialized then Burn; inherited Destroy; end; {** TDCP_cipher ***************************************************************} procedure TDCP_cipher.DeadInt(Value: integer); begin end; procedure TDCP_cipher.DeadStr(Value: string); begin end; function TDCP_cipher._GetId: integer; begin Result:= GetId; end; function TDCP_cipher._GetAlgorithm: string; begin Result:= GetAlgorithm; end; function TDCP_cipher._GetMaxKeySize: integer; begin Result:= GetMaxKeySize; end; class function TDCP_cipher.GetId: integer; begin Result:= -1; end; class function TDCP_cipher.GetAlgorithm: string; begin Result:= ''; end; class function TDCP_cipher.GetMaxKeySize: integer; begin Result:= -1; end; class function TDCP_cipher.SelfTest: boolean; begin Result:= false; end; procedure TDCP_cipher.Init(const Key; Size: longword; InitVector: pointer); begin if fInitialized then Burn; if (Size <= 0) or ((Size and 3)<> 0) or (Size> longword(GetMaxKeySize)) then raise EDCP_cipher.Create('Invalid key size') else fInitialized:= true; end; procedure TDCP_cipher.InitStr(const Key: string; HashType: TDCP_hashclass); var Hash: TDCP_hash; Digest: pointer; begin if fInitialized then Burn; try GetMem(Digest,HashType.GetHashSize div 8); Hash:= HashType.Create(Self); Hash.Init; Hash.UpdateStr(Key); Hash.Final(Digest^); Hash.Free; if MaxKeySize< HashType.GetHashSize then begin Init(Digest^,MaxKeySize,nil); end else begin Init(Digest^,HashType.GetHashSize,nil); end; FillChar(Digest^,HashType.GetHashSize div 8,$FF); FreeMem(Digest); except raise EDCP_cipher.Create('Unable to allocate sufficient memory for hash digest'); end; end; procedure TDCP_cipher.Burn; begin fInitialized:= false; end; procedure TDCP_cipher.Reset; begin end; procedure TDCP_cipher.Encrypt(const Indata; var Outdata; Size: longword); begin end; procedure TDCP_cipher.Decrypt(const Indata; var Outdata; Size: longword); begin end; function TDCP_cipher.EncryptStream(InStream, OutStream: TStream; Size: longword): longword; var Buffer: array[0..8191] of byte; i, Read: longword; begin dcpFillChar(Buffer, SizeOf(Buffer), 0); Result:= 0; for i:= 1 to (Size div Sizeof(Buffer)) do begin Read:= InStream.Read(Buffer,Sizeof(Buffer)); Inc(Result,Read); Encrypt(Buffer,Buffer,Read); OutStream.Write(Buffer,Read); end; if (Size mod Sizeof(Buffer))<> 0 then begin Read:= InStream.Read(Buffer,Size mod Sizeof(Buffer)); Inc(Result,Read); Encrypt(Buffer,Buffer,Read); OutStream.Write(Buffer,Read); end; end; function TDCP_cipher.DecryptStream(InStream, OutStream: TStream; Size: longword): longword; var Buffer: array[0..8191] of byte; i, Read: longword; begin dcpFillChar(Buffer, SizeOf(Buffer), 0); Result:= 0; for i:= 1 to (Size div Sizeof(Buffer)) do begin Read:= InStream.Read(Buffer,Sizeof(Buffer)); Inc(Result,Read); Decrypt(Buffer,Buffer,Read); OutStream.Write(Buffer,Read); end; if (Size mod Sizeof(Buffer))<> 0 then begin Read:= InStream.Read(Buffer,Size mod Sizeof(Buffer)); Inc(Result,Read); Decrypt(Buffer,Buffer,Read); OutStream.Write(Buffer,Read); end; end; function TDCP_cipher.EncryptString(const Str: string): string; begin SetLength(Result,Length(Str)); Encrypt(Str[1],Result[1],Length(Str)); Result:= Base64EncodeStr(Result); end; function TDCP_cipher.DecryptString(const Str: string): string; begin Result:= Base64DecodeStr(Str); Decrypt(Result[1],Result[1],Length(Result)); end; constructor TDCP_cipher.Create(AOwner: TComponent); begin inherited Create(AOwner); Burn; end; destructor TDCP_cipher.Destroy; begin if fInitialized then Burn; inherited Destroy; end; {** TDCP_blockcipher **********************************************************} procedure TDCP_blockcipher.InitKey(const Key; Size: longword); begin end; function TDCP_blockcipher._GetBlockSize: integer; begin Result:= GetBlockSize; end; class function TDCP_blockcipher.GetBlockSize: integer; begin Result:= -1; end; procedure TDCP_blockcipher.SetIV(const Value); begin end; procedure TDCP_blockcipher.GetIV(var Value); begin end; procedure TDCP_blockcipher.Encrypt(const Indata; var Outdata; Size: longword); begin case fCipherMode of cmCBC: EncryptCBC(Indata,Outdata,Size); cmCFB8bit: EncryptCFB8bit(Indata,Outdata,Size); cmCFBblock: EncryptCFBblock(Indata,Outdata,Size); cmOFB: EncryptOFB(Indata,Outdata,Size); cmCTR: EncryptCTR(Indata,Outdata,Size); end; end; function TDCP_blockcipher.EncryptString(const Str: string): string; begin SetLength(Result,Length(Str)); EncryptCFB8bit(Str[1],Result[1],Length(Str)); Result:= Base64EncodeStr(Result); end; function TDCP_blockcipher.DecryptString(const Str: string): string; begin Result:= Base64DecodeStr(Str); DecryptCFB8bit(Result[1],Result[1],Length(Result)); end; procedure TDCP_blockcipher.Decrypt(const Indata; var Outdata; Size: longword); begin case fCipherMode of cmCBC: DecryptCBC(Indata,Outdata,Size); cmCFB8bit: DecryptCFB8bit(Indata,Outdata,Size); cmCFBblock: DecryptCFBblock(Indata,Outdata,Size); cmOFB: DecryptOFB(Indata,Outdata,Size); cmCTR: DecryptCTR(Indata,Outdata,Size); end; end; procedure TDCP_blockcipher.EncryptECB(const Indata; var Outdata); begin end; procedure TDCP_blockcipher.DecryptECB(const Indata; var Outdata); begin end; procedure TDCP_blockcipher.EncryptCBC(const Indata; var Outdata; Size: longword); begin end; procedure TDCP_blockcipher.DecryptCBC(const Indata; var Outdata; Size: longword); begin end; procedure TDCP_blockcipher.EncryptCFB8bit(const Indata; var Outdata; Size: longword); begin end; procedure TDCP_blockcipher.DecryptCFB8bit(const Indata; var Outdata; Size: longword); begin end; procedure TDCP_blockcipher.EncryptCFBblock(const Indata; var Outdata; Size: longword); begin end; procedure TDCP_blockcipher.DecryptCFBblock(const Indata; var Outdata; Size: longword); begin end; procedure TDCP_blockcipher.EncryptOFB(const Indata; var Outdata; Size: longword); begin end; procedure TDCP_blockcipher.DecryptOFB(const Indata; var Outdata; Size: longword); begin end; procedure TDCP_blockcipher.EncryptCTR(const Indata; var Outdata; Size: longword); begin end; procedure TDCP_blockcipher.DecryptCTR(const Indata; var Outdata; Size: longword); begin end; constructor TDCP_blockcipher.Create(AOwner: TComponent); begin inherited Create(AOwner); fCipherMode:= cmCBC; end; {** Helpher functions *********************************************************} procedure XorBlock(var InData1, InData2; Size: longword); var b1: PByteArray; b2: PByteArray; i: longword; begin b1 := @InData1; b2 := @InData2; for i := 0 to size-1 do b1[i] := b1[i] xor b2[i]; end; procedure dcpFillChar(out x; count: SizeInt; Value: Byte); begin {$HINTS OFF} FillChar(x, count, value); {$HINTS ON} end; procedure ZeroMemory(Destination: Pointer; Length: PtrUInt); begin FillChar(Destination^, Length, 0); end; procedure dcpFillChar(out x; count: SizeInt; Value: Char); begin {$HINTS OFF} FillChar(x, count, Value); {$HINTS ON} end; // Supposed to be an optimized version of XorBlock() using 32-bit xor procedure XorBlockEx(var InData1, InData2; Size: longword); var l1: PIntegerArray; l2: PIntegerArray; b1: PByteArray; b2: PByteArray; i: integer; c: integer; begin l1 := @inData1; l2 := @inData2; for i := 0 to size div sizeof(LongWord)-1 do l1[i] := l1[i] xor l2[i]; // the rest of the buffer (3 bytes) c := size mod sizeof(longWord); if c > 0 then begin b1 := @InData1; b2 := @InData2; for i := (size-c) to size-1 do b1[i] := b1[i] xor b2[i]; end; end; end. doublecmd-0.5.8/components/dcpcrypt/dcp.pas0000644000175000017500000000077212014201074017773 0ustar alexxalexx{ This file was automatically created by Lazarus. do not edit! This source is only used to compile and install the package. } unit dcp; interface uses DCPbase64, DCPblockciphers, DCPconst, DCPcrypt2, DCPblowfish, DCPcast128, DCPcast256, DCPdes, DCPgost, DCPice, DCPidea, DCPmars, DCPmisty1, DCPrc2, DCPrc4, DCPrc5, DCPrc6, DCPrijndael, DCPserpent, DCPtea, DCPtwofish, DCPhaval, DCPmd4, DCPmd5, DCPripemd128, DCPripemd160, DCPsha1, DCPsha256, DCPsha512, DCPtiger; implementation end. doublecmd-0.5.8/components/dcpcrypt/DCPhashes.lrs0000644000175000017500000003660211652036011021051 0ustar alexxalexxLazarusResources.Add('TDCP_HAVAL','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#254#254#254#254#255#239#254#254#254#238#255#255#236#236#236#236#238#206#236 +#236#236#204#239#255#236#236#236#236#236#236#236#236#236#238#255#255#236#236 +#236#236#236#236#236#236#236#239#255#255#236#204#236#204#236#236#236#204#236 +#239#255#255#236#236#236#236#236#236#236#236#236#239#255#255#236#236#236#236 +#236#236#236#236#236#239#255#255#236#236#238#206#236#236#238#206#236#239#255 +#255#254#254#255#239#254#254#255#239#254#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_MD4','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#254#255#254#255#238#239#255#255#239#255#255#255#236#239#236#238#204#206#255 +#254#206#255#255#255#236#239#236#238#206#236#239#238#206#255#255#255#236#238 +#236#238#206#236#238#204#204#239#255#255#236#236#236#238#206#236#238#206#206 +#255#255#255#236#236#236#238#206#236#238#206#239#255#255#255#236#206#204#238 +#206#236#238#206#255#255#255#255#236#239#236#238#204#206#254#206#255#255#255 +#255#254#255#254#255#238#239#255#239#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_MD5','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#254#255#254#255#238#239#255#238#239#255#255#255#236#239#236#238#204#206#254 +#204#206#255#255#255#236#239#236#238#206#236#239#238#236#239#255#255#236#238 +#236#238#206#236#239#254#236#239#255#255#236#236#236#238#206#236#239#236#204 +#239#255#255#236#236#236#238#206#236#238#206#238#255#255#255#236#206#204#238 +#206#236#238#206#238#255#255#255#236#239#236#238#204#206#254#204#204#239#255 +#255#254#255#254#255#238#239#255#238#238#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_RIPEMD128','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#128#128#128#0#192#192#192#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#238#239 +#254#238#239#255#238#255#255#255#255#254#204#206#236#204#206#254#204#239#255 +#255#255#255#236#239#254#206#239#236#238#206#255#255#255#255#236#239#255#236 +#239#236#238#206#255#255#255#255#236#239#254#254#206#254#204#239#255#255#255 +#255#236#239#236#238#206#236#238#206#255#255#255#254#204#239#236#238#206#236 +#238#206#255#255#255#255#236#239#254#204#239#254#204#239#255#255#255#255#254 +#255#255#238#255#255#238#255#255#255#255#254#255#239#254#255#254#255#238#239 +#255#255#255#236#238#206#236#239#236#238#204#206#255#255#255#236#238#206#236 +#239#236#238#206#236#239#255#255#236#238#206#236#238#236#238#206#236#239#255 +#255#236#204#239#236#236#236#238#206#236#239#255#255#236#238#206#236#236#236 +#238#206#236#239#255#255#236#238#206#236#206#204#238#206#236#239#255#255#236 +#204#239#236#239#236#238#204#206#255#255#255#254#238#255#254#255#254#255#238 +#239#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_RIPEMD160','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#238#239 +#255#238#255#255#238#255#255#255#255#254#204#206#254#204#239#254#204#239#255 +#255#255#255#236#239#236#238#206#236#238#206#255#255#255#255#236#239#236#238 +#206#236#238#206#255#255#255#255#236#239#236#204#239#236#238#206#255#255#255 +#255#236#239#236#238#239#236#238#206#255#255#255#254#204#239#236#238#206#236 +#238#206#255#255#255#255#236#239#254#204#239#254#204#239#255#255#255#255#254 +#255#255#238#255#255#238#255#255#255#255#254#255#239#254#255#254#255#238#239 +#255#255#255#236#238#206#236#239#236#238#204#206#255#255#255#236#238#206#236 +#239#236#238#206#236#239#255#255#236#238#206#236#238#236#238#206#236#239#255 +#255#236#204#239#236#236#236#238#206#236#239#255#255#236#238#206#236#236#236 +#238#206#236#239#255#255#236#238#206#236#206#204#238#206#236#239#255#255#236 +#204#239#236#239#236#238#204#206#255#255#255#254#238#255#254#255#254#255#238 +#239#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_SHA1','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#254 +#238#255#254#255#239#254#255#239#254#238#255#236#204#239#236#238#206#236#238 +#206#236#204#239#254#238#206#236#238#206#236#238#206#254#206#255#255#238#206 +#236#238#206#236#238#206#254#206#255#254#204#239#236#204#206#236#204#206#254 +#206#255#236#238#255#236#238#206#236#238#206#254#206#255#236#238#239#236#238 +#206#236#238#206#236#206#255#254#204#206#236#238#206#254#204#239#254#206#255 +#255#238#239#254#255#239#255#238#255#255#239#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_SHA256','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#128#128#128#0#192#192#192#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#238#238 +#255#238#239#255#254#239#255#255#255#254#204#204#238#204#206#255#236#206#255 +#255#255#255#236#238#255#238#236#238#206#236#239#255#255#255#254#206#255#254 +#236#238#206#236#239#255#255#255#239#236#239#236#206#254#204#206#255#255#255 +#254#206#236#238#206#239#254#206#239#255#255#255#254#206#236#238#206#238#254 +#206#238#255#255#255#255#236#206#254#204#204#239#236#204#239#255#255#255#254 +#239#255#238#238#255#254#238#255#255#255#255#238#239#255#239#254#255#239#254 +#255#255#255#254#204#206#254#206#236#238#206#236#239#255#255#255#238#236#238 +#206#236#238#206#236#239#255#255#255#254#236#238#206#236#238#206#236#239#255 +#255#255#236#206#254#204#204#238#204#204#239#255#255#254#206#239#254#206#236 +#238#206#236#239#255#255#254#206#238#254#206#236#238#206#236#239#255#255#255 +#236#204#238#206#236#239#236#206#255#255#255#255#254#238#255#239#254#255#254 +#239#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_SHA384','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#128#128#128#0#192#192#192#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#238#239 +#255#254#239#255#255#239#255#255#255#254#204#206#255#236#206#255#238#206#255 +#255#255#255#238#236#238#206#236#238#204#204#239#255#255#255#254#236#238#206 +#236#238#206#206#255#255#255#255#236#206#255#236#206#254#206#206#255#255#255 +#255#254#236#238#206#236#238#206#239#255#255#255#255#238#236#238#206#236#239 +#236#239#255#255#255#254#204#206#255#236#206#255#236#239#255#255#255#255#238 +#239#255#254#239#255#254#255#255#255#255#255#238#239#255#239#254#255#239#254 +#255#255#255#254#204#206#254#206#236#238#206#236#239#255#255#255#238#236#238 +#206#236#238#206#236#239#255#255#255#254#236#238#206#236#238#206#236#239#255 +#255#255#236#206#254#204#204#238#204#204#239#255#255#254#206#239#254#206#236 +#238#206#236#239#255#255#254#206#238#254#206#236#238#206#236#239#255#255#255 +#236#204#238#206#236#239#236#206#255#255#255#255#254#238#255#239#254#255#254 +#239#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_SHA512','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#128#128#128#0#192#192#192#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#238#239 +#255#254#238#255#238#238#255#255#255#254#204#206#255#236#204#238#204#204#239 +#255#255#255#238#236#239#254#206#255#236#238#255#255#255#255#254#236#239#254 +#206#255#254#206#255#255#255#255#236#206#255#254#206#255#239#236#239#255#255 +#254#206#239#255#254#206#254#206#236#239#255#255#254#206#238#255#236#206#254 +#206#236#239#255#255#254#204#204#239#254#206#255#236#206#255#255#255#255#238 +#238#255#255#239#255#254#239#255#255#255#255#238#239#255#239#254#255#239#254 +#255#255#255#254#204#206#254#206#236#238#206#236#239#255#255#255#238#236#238 +#206#236#238#206#236#239#255#255#255#254#236#238#206#236#238#206#236#239#255 +#255#255#236#206#254#204#204#238#204#204#239#255#255#254#206#239#254#206#236 +#238#206#236#239#255#255#254#206#238#254#206#236#238#206#236#239#255#255#255 +#236#204#238#206#236#239#236#206#255#255#255#255#254#238#255#239#254#255#254 +#239#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); LazarusResources.Add('TDCP_TIGER','BMP',[ 'BM'#150#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' ' +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128 +#0#128#0#0#0#128#0#128#0#128#128#0#0#128#128#128#0#192#192#192#0#0#0#255#0#0 +#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#254#255#238#239#238#239#238#239#238#239#255#255#236#238#204#206#204#206#204 +#206#206#206#255#255#236#239#236#238#206#206#206#238#206#206#255#255#236#239 +#236#238#206#206#206#238#206#206#255#255#236#239#236#238#204#238#204#206#204 +#239#255#255#236#239#236#238#206#238#206#238#206#206#255#255#236#239#236#238 +#206#206#206#238#206#206#255#254#204#206#204#206#204#206#204#206#204#239#255 +#255#238#239#238#239#238#239#238#239#238#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255 ]); doublecmd-0.5.8/components/dcpcrypt/Ciphers/0000755000175000017500000000000012257501472020125 5ustar alexxalexxdoublecmd-0.5.8/components/gifanim/0000755000175000017500000000000012257501472016312 5ustar alexxalexxdoublecmd-0.5.8/components/gifanim/pkg_gifanim.pas0000644000175000017500000000055012014201074021254 0ustar alexxalexx{ This file was automatically created by Lazarus. Do not edit! This source is only used to compile and install the package. } unit pkg_gifanim; interface uses GifAnim, LazarusPackageIntf; implementation procedure Register; begin RegisterUnit('GifAnim', @GifAnim.Register); end; initialization RegisterPackage('pkg_gifanim', @Register); end. doublecmd-0.5.8/components/gifanim/pkg_gifanim.lpk0000644000175000017500000000343112154651644021301 0ustar alexxalexx doublecmd-0.5.8/components/gifanim/gifanim.lrs0000644000175000017500000000351411376245253020454 0ustar alexxalexxLazarusResources.Add('tgifanim','XPM',[ '/* XPM */'#13#10'static char * gifanim_xpm[] = {'#13#10'"24 24 31 1",'#13#10 +'" '#9'c None",'#13#10'".'#9'c #959595",'#13#10'"+'#9'c #E1E1E1",'#13#10'"@' +#9'c #919191",'#13#10'"#'#9'c #848484",'#13#10'"$'#9'c #888888",'#13#10'"%'#9 +'c #EEEEEE",'#13#10'"&'#9'c #E6E9EC",'#13#10'"*'#9'c #D6DFE8",'#13#10'"='#9 +'c #FFFFFF",'#13#10'"-'#9'c #E7F0F9",'#13#10'";'#9'c #3783CE",'#13#10'">'#9 +'c #FFF7F7",'#13#10'",'#9'c #FFEFEF",'#13#10'"'''#9'c #F7F2F5",'#13#10'")'#9 +'c #F7FAFD",'#13#10'"!'#9'c #FF5757",'#13#10'"~'#9'c #FFDFDF",'#13#10'"{'#9 +'c #FF4F4F",'#13#10'"]'#9'c #FFD7D7",'#13#10'"^'#9'c #FF4747",'#13#10'"/'#9 +'c #FF3F3F",'#13#10'"('#9'c #8D8D8D",'#13#10'"_'#9'c #EEE6E6",'#13#10'":'#9 +'c #EED6D6",'#13#10'"<'#9'c #EECECE",'#13#10'"['#9'c #FAFAFA",'#13#10'"}'#9 +'c #F2F2F2",'#13#10'"|'#9'c #F6F6F6",'#13#10'"1'#9'c #A2A2A2",'#13#10'"2'#9 +'c #FAF2F2",'#13#10'" .++@ @++. ",'#13#10'" @@@##$$$$$$$$$$$$##' +'@@@ ",'#13#10'" .++$#$$$$$$$$$$$$#$++. ",'#13#10'" .++@+%%&**&&**&%%+@++. "' +','#13#10'" @@@@%==-;;--;;-==%@@@@ ",'#13#10'" .++.%==-;;--;;-==%.++. ",'#13 +#10'" .++.%>,''--))--'',>%.++. ",'#13#10'" @@@@%,!~>====>~!,%@@@@ ",'#13#10 +'" .++.%>~{]~~~~]{~>%.++. ",'#13#10'" .++.%=>~^////^~>=%.++. ",'#13#10'" @@@' +'(+%%_:<<<<:_%%+(@@@ ",'#13#10'" .++$#$$$$$$$$$$$$#$++. ",'#13#10'" .++$#$$$' +'$$$$$$$$$#$++. ",'#13#10'" @@@(+%%&**&%%%%%%+(@@@ ",'#13#10'" .++.%==-;;-[}' +'}[==%.++. ",'#13#10'" .++.%==-;;-|11|==%.++. ",'#13#10'" @@@@%>,''--)[}}2,>' +'%@@@@ ",'#13#10'" .++.%,!~>====>~!,%.++. ",'#13#10'" .++.%>~{]~~~~]{~>%.++.' +' ",'#13#10'" @@@@%=>~^////^~>=%@@@@ ",'#13#10'" .++@+%%_:<<<<:_%%+@++. ",' +#13#10'" .++$#$$$$$$$$$$$$#$++. ",'#13#10'" @@@##$$$$$$$$$$$$##@@@ ",'#13#10 +'" .++@ @++. "};'#13#10 ]); doublecmd-0.5.8/components/gifanim/doublecmd.diff0000644000175000017500000001301212162610121021062 0ustar alexxalexxIndex: gifanim.pas =================================================================== --- gifanim.pas (revision none) +++ gifanim.pas (working copy) @@ -26,7 +26,7 @@ uses Classes, LCLProc, Lresources, SysUtils, Controls, Graphics, ExtCtrls, - IntfGraphics, FPimage, Contnrs, GraphType, dialogs; + IntfGraphics, FPimage, Contnrs, GraphType, dialogs, types; const @@ -193,7 +193,7 @@ procedure DoAutoSize; override; procedure DoStartAnim; procedure DoStopAnim; - class function GetControlClassDefaultSize: TPoint; override; + class function GetControlClassDefaultSize: TSize; override; procedure GifChanged; procedure LoadFromFile(const Filename: string); virtual; procedure Paint; override; @@ -203,6 +203,8 @@ { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; + procedure NextFrame; + procedure PriorFrame; property Empty: boolean Read FEmpty; property GifBitmaps: TGifList Read FGifBitmaps; property GifIndex: integer Read FCurrentImage; @@ -268,7 +270,7 @@ inherited Create(AOwner); ControlStyle := [csCaptureMouse, csClickEvents, csDoubleClicks]; AutoSize := True; - SetInitialBounds(0, 0, GetControlClassDefaultSize.X, GetControlClassDefaultSize.Y); + SetInitialBounds(0, 0, GetControlClassDefaultSize.CX, GetControlClassDefaultSize.CY); FEmpty := True; FCurrentImage := 0; CurrentView := TBitmap.Create; @@ -295,6 +297,59 @@ CurrentView.Free; end; +procedure TGifAnim.NextFrame; +begin + if (not FEmpty) and Visible and (not FAnimate) then + begin + if FCurrentImage >= GifBitmaps.Count - 1 then + FCurrentImage := 0 + else + Inc(FCurrentImage); + if Assigned(FOnFrameChanged) then + FOnFrameChanged(Self); + Repaint; + end; +end; + +procedure TGifAnim.PriorFrame; +var + DesiredImage: Integer; +begin + if (not FEmpty) and Visible and (not FAnimate) then + begin + if FCurrentImage = 0 then + DesiredImage:= GifBitmaps.Count - 1 + else + DesiredImage:= FCurrentImage - 1; + // For proper display repaint image from first frame to desired frame + FCurrentImage:= 0; + while FCurrentImage < DesiredImage do + begin + with GifBitmaps.Items[FCurrentImage] do + begin + BufferImg.Canvas.Brush.Color := (Self.Color); + if FCurrentImage = 0 then + BufferImg.Canvas.FillRect(Rect(0, 0, Width, Height)); + if Delay <> 0 then + FWait.Interval := Delay * 10; + BufferImg.Canvas.Draw(PosX, PosY, Bitmap); + case Method of + //0 : Not specified... + //1 : No change Background + 2: BufferImg.Canvas.FillRect( + Rect(PosX, PosY, Bitmap.Width + PosX, Bitmap.Height + PosY)); + + 3: BufferImg.Canvas.FillRect(Rect(0, 0, Width, Height)); + end; + end; + Inc(FCurrentImage); + end; + if Assigned(FOnFrameChanged) then + FOnFrameChanged(Self); + Repaint; + end; +end; + function TGifAnim.LoadFromLazarusResource(const ResName: String): boolean; var GifLoader: TGifLoader; @@ -340,12 +395,13 @@ begin if (not Empty) and Visible then begin - if FCurrentImage > GifBitmaps.Count - 1 then - FCurrentImage := 0; - if assigned(FOnFrameChanged) then - FOnFrameChanged(self); - Paint; - Inc(FCurrentImage); + if FCurrentImage >= GifBitmaps.Count - 1 then + FCurrentImage := 0 + else + Inc(FCurrentImage); + if Assigned(FOnFrameChanged) then + FOnFrameChanged(Self); + Repaint; end; end; @@ -368,7 +424,6 @@ var fn: string; begin - if (FFileName = AValue) then exit; FFileName := AValue; @@ -441,10 +496,10 @@ end; end; -class function TGifAnim.GetControlClassDefaultSize: TPoint; +class function TGifAnim.GetControlClassDefaultSize: TSize; begin - Result.X := 90; - Result.Y := 90; + Result.CX := 90; + Result.CY := 90; end; procedure TGifAnim.GifChanged; Index: pkg_gifanim.lpk =================================================================== --- pkg_gifanim.lpk (revision none) +++ pkg_gifanim.lpk (working copy) @@ -1,15 +1,26 @@ - + + - + - + + + + + + + @@ -41,7 +52,7 @@ - + doublecmd-0.5.8/components/gifanim/ressource-file.txt0000644000175000017500000000075212014201074021770 0ustar alexxalexx 1) Gif in ressource file ------------------------- - Create ressource file with lazres ex : lazres mygif.lrs gif1.gif gif2.gif - Put TGifAnim on your form - In the FormCreate add (see down) [code] procedure TForm1.FormCreate(Sender: TObject); begin GifAnim1.LoadFromLazarusResource('gif1'); GifAnim2.LoadFromLazarusResource('gif2'); end; [/code] - And insert ressouce file in initialization section (see down) [code] initialization {$I unit1.lrs} {$I mesgif.lrs} [/code] doublecmd-0.5.8/components/gifanim/tgifanim.xpm0000644000175000017500000000234111376245253020641 0ustar alexxalexx/* XPM */ static char * gifanim_xpm[] = { "24 24 31 1", " c None", ". c #959595", "+ c #E1E1E1", "@ c #919191", "# c #848484", "$ c #888888", "% c #EEEEEE", "& c #E6E9EC", "* c #D6DFE8", "= c #FFFFFF", "- c #E7F0F9", "; c #3783CE", "> c #FFF7F7", ", c #FFEFEF", "' c #F7F2F5", ") c #F7FAFD", "! c #FF5757", "~ c #FFDFDF", "{ c #FF4F4F", "] c #FFD7D7", "^ c #FF4747", "/ c #FF3F3F", "( c #8D8D8D", "_ c #EEE6E6", ": c #EED6D6", "< c #EECECE", "[ c #FAFAFA", "} c #F2F2F2", "| c #F6F6F6", "1 c #A2A2A2", "2 c #FAF2F2", " .++@ @++. ", " @@@##$$$$$$$$$$$$##@@@ ", " .++$#$$$$$$$$$$$$#$++. ", " .++@+%%&**&&**&%%+@++. ", " @@@@%==-;;--;;-==%@@@@ ", " .++.%==-;;--;;-==%.++. ", " .++.%>,'--))--',>%.++. ", " @@@@%,!~>====>~!,%@@@@ ", " .++.%>~{]~~~~]{~>%.++. ", " .++.%=>~^////^~>=%.++. ", " @@@(+%%_:<<<<:_%%+(@@@ ", " .++$#$$$$$$$$$$$$#$++. ", " .++$#$$$$$$$$$$$$#$++. ", " @@@(+%%&**&%%%%%%+(@@@ ", " .++.%==-;;-[}}[==%.++. ", " .++.%==-;;-|11|==%.++. ", " @@@@%>,'--)[}}2,>%@@@@ ", " .++.%,!~>====>~!,%.++. ", " .++.%>~{]~~~~]{~>%.++. ", " @@@@%=>~^////^~>=%@@@@ ", " .++@+%%_:<<<<:_%%+@++. ", " .++$#$$$$$$$$$$$$#$++. ", " @@@##$$$$$$$$$$$$##@@@ ", " .++@ @++. "}; doublecmd-0.5.8/components/gifanim/gifanim.pas0000644000175000017500000007377012162610121020432 0ustar alexxalexx{ Copyright (C) 2009 Laurent Jacques This source is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. A copy of the GNU General Public License is available on the World Wide Web at . You can also obtain it by writing to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Version 1.4 } unit GifAnim; {$mode objfpc}{$H+} interface uses Classes, LCLProc, Lresources, SysUtils, Controls, Graphics, ExtCtrls, IntfGraphics, FPimage, Contnrs, GraphType, dialogs, types; const EXT_INTRODUCER = $21; EXT_GRAPHICS_CONTROL = $F9; EXT_PLAIN_TEXT = $01; EXT_APPLICATION = $FF; EXT_COMMENT = $FE; DSC_LOCAL_IMAGE = $2C; ID_TRANSPARENT = $01; ID_COLOR_TABLE_SIZE = $07; ID_SORT = $20; ID_INTERLACED = $40; ID_COLOR_TABLE = $80; ID_IMAGE_DESCRIPTOR = $2C; ID_TRAILER = $3B; CODE_TABLE_SIZE = 4096; type TRGB = packed record Red, Green, Blue: byte; end; TGIFHeader = packed record Signature: array[0..2] of char; //* Header Signature (always "GIF") */ Version: array[0..2] of char; //* GIF format version("87a" or "89a") */ ScreenWidth: word; //* Width of Display Screen in Pixels */ ScreenHeight: word; //* Height of Display Screen in Pixels */ Packedbit, //* Screen and Color Map Information */ BackgroundColor, //* Background Color Index */ AspectRatio: byte; //* Pixel Aspect Ratio */ end; TGifImageDescriptor = packed record Left, //* X position of image on the display */ Top, //* Y position of image on the display */ Width, //* Width of the image in pixels */ Height: word; //* Height of the image in pixels */ Packedbit: byte; //* Image and Color Table Data Information */ end; TGifGraphicsControlExtension = packed record BlockSize, //* Size of remaining fields (always 04h) */ Packedbit: byte; //* Method of graphics disposal to use */ DelayTime: word; //* Hundredths of seconds to wait */ ColorIndex, //* Transparent Color Index */ Terminator: byte; //* Block Terminator (always 0) */ end; TGifAnim = class; { TGifImage } TGifImage = class private FBitmap: TBitmap; FPosX: word; FPosY: word; FDelay: word; FMethod: byte; public constructor Create; destructor Destroy; override; property Bitmap: TBitmap Read FBitmap; property Delay: word Read FDelay; property Method: byte Read FMethod; property PosX: word Read FPosX; property PosY: word Read FPosY; end; { TGifList } TGifList = class(TObjectList) private protected function GetItems(Index: integer): TGifImage; procedure SetItems(Index: integer; AGifImage: TGifImage); public function Add(AGifImage: TGifImage): integer; function Extract(Item: TGifImage): TGifImage; function Remove(AGifImage: TGifImage): integer; function IndexOf(AGifImage: TGifImage): integer; function First: TGifImage; function Last: TGifImage; procedure Insert(Index: integer; AGifImage: TGifImage); property Items[Index: integer]: TGifImage Read GetItems Write SetItems; default; end; { TGifLoader } TGifLoader = class private FGifHeader: TGIFHeader; FGifDescriptor: TGifImageDescriptor; FGifGraphicsCtrlExt: TGifGraphicsControlExtension; FGifUseGraphCtrlExt: boolean; FGifBackgroundColor: byte; FInterlaced: boolean; FScanLine: PByte; FLineSize: integer; FDisposalMethod: byte; FEmpty: boolean; FFileName: string; FHeight: integer; FIsTransparent: boolean; FWidth: integer; FPalette: TFPPalette; FLocalHeight: integer; FLocalWidth: integer; procedure ReadPalette(Stream: TStream; Size: integer); procedure ReadScanLine(Stream: TStream); procedure ReadHeader(Stream: TStream); procedure ReadGlobalPalette(Stream: TStream); procedure ReadGraphCtrlExt; procedure SetInterlaced(const AValue: boolean); procedure SetTransparent(const AValue: boolean); function SkipBlock(Stream: TStream): byte; procedure WriteScanLine(Img: TFPCustomImage); procedure ReadGifBitmap(Stream: TStream); public constructor Create(const FileName: string); destructor Destroy; override; function LoadAllBitmap(var AGifList: TGifList): boolean; function LoadFromLazarusResource(const ResName: String; var AGifList: TGifList): boolean; function LoadFirstBitmap(var ABitmap: TBitmap): boolean; property Empty: boolean Read FEmpty; property Height: integer Read FHeight; property Width: integer Read FWidth; property IsTransparent: boolean Read FIsTransparent Write SetTransparent; property Interlaced: boolean Read FInterlaced Write SetInterlaced; end; { TGifAnim } TGifAnim = class(TGraphicControl) private { Private declarations } FAnimate: boolean; FEmpty: boolean; FFileName: string; FGifBitmaps: TGifList; FOnFrameChanged: TNotifyEvent; FOnStart: TNotifyEvent; FOnStop: TNotifyEvent; FWait: TTimer; FCurrentImage: integer; FGifHeight: integer; FGifWidth: integer; procedure OnTime(Sender: TObject); procedure SetAnimate(const AValue: boolean); procedure SetFileName(const AValue: string); procedure DefineSize(AWidth, AHeight: integer); protected { Protected declarations } BufferImg: TBitmap; CurrentView: TBitmap; procedure CalculatePreferredSize( var PreferredWidth, PreferredHeight: integer; WithThemeSpace: boolean); override; procedure DoAutoSize; override; procedure DoStartAnim; procedure DoStopAnim; class function GetControlClassDefaultSize: TSize; override; procedure GifChanged; procedure LoadFromFile(const Filename: string); virtual; procedure Paint; override; procedure ResetImage; procedure SetColor(Value: TColor); override; public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure NextFrame; procedure PriorFrame; property Empty: boolean Read FEmpty; property GifBitmaps: TGifList Read FGifBitmaps; property GifIndex: integer Read FCurrentImage; function LoadFromLazarusResource(const ResName: String): boolean; published { Published declarations } property Anchors; property AutoSize default True; property Animate: boolean Read FAnimate Write SetAnimate default True; property BorderSpacing; property Color default clBtnFace; property Constraints; property FileName: string Read FFileName Write SetFileName; property Height; property OnClick; property OnDblClick; property OnFrameChanged: TNotifyEvent Read FOnFrameChanged Write FOnFrameChanged; property OnMouseDown; property OnMouseEnter; property OnMouseLeave; property OnMouseMove; property OnMouseUp; property OnStartAnim: TNotifyEvent Read FOnStart Write FOnStart; property OnStopAnim: TNotifyEvent Read FOnStop Write FOnStop; property ParentShowHint; property ShowHint; property Visible; property Width; end; procedure Register; implementation uses LazIDEIntf, propedits; Type TGifFileNamePropertyEditor=class(TFileNamePropertyEditor) protected function GetFilter: String; override; function GetInitialDirectory: string; override; end; function TGifFileNamePropertyEditor.GetFilter: String; begin Result := 'GIF|*.gif'; end; function TGifFileNamePropertyEditor.GetInitialDirectory: string; begin Result:= ExtractFilePath(LazarusIDE.ActiveProject.ProjectInfoFile); end; procedure Register; begin RegisterComponents('Wile64', [TGifAnim]); RegisterPropertyEditor(TypeInfo(String), TGifAnim, 'FileName', TGifFileNamePropertyEditor); end; { TGifAnim } constructor TGifAnim.Create(AOwner: TComponent); begin inherited Create(AOwner); ControlStyle := [csCaptureMouse, csClickEvents, csDoubleClicks]; AutoSize := True; SetInitialBounds(0, 0, GetControlClassDefaultSize.CX, GetControlClassDefaultSize.CY); FEmpty := True; FCurrentImage := 0; CurrentView := TBitmap.Create; if not (csDesigning in ComponentState) then begin BufferImg := TBitmap.Create; FWait := TTimer.Create(Self); with FWait do begin Interval := 100; OnTimer := @OnTime; Enabled := False; end; end; Animate := True; end; destructor TGifAnim.Destroy; begin inherited Destroy; if assigned(FGifBitmaps) then FreeAndNil(FGifBitmaps); BufferImg.Free; CurrentView.Free; end; procedure TGifAnim.NextFrame; begin if (not FEmpty) and Visible and (not FAnimate) then begin if FCurrentImage >= GifBitmaps.Count - 1 then FCurrentImage := 0 else Inc(FCurrentImage); if Assigned(FOnFrameChanged) then FOnFrameChanged(Self); Repaint; end; end; procedure TGifAnim.PriorFrame; var DesiredImage: Integer; begin if (not FEmpty) and Visible and (not FAnimate) then begin if FCurrentImage = 0 then DesiredImage:= GifBitmaps.Count - 1 else DesiredImage:= FCurrentImage - 1; // For proper display repaint image from first frame to desired frame FCurrentImage:= 0; while FCurrentImage < DesiredImage do begin with GifBitmaps.Items[FCurrentImage] do begin BufferImg.Canvas.Brush.Color := (Self.Color); if FCurrentImage = 0 then BufferImg.Canvas.FillRect(Rect(0, 0, Width, Height)); if Delay <> 0 then FWait.Interval := Delay * 10; BufferImg.Canvas.Draw(PosX, PosY, Bitmap); case Method of //0 : Not specified... //1 : No change Background 2: BufferImg.Canvas.FillRect( Rect(PosX, PosY, Bitmap.Width + PosX, Bitmap.Height + PosY)); 3: BufferImg.Canvas.FillRect(Rect(0, 0, Width, Height)); end; end; Inc(FCurrentImage); end; if Assigned(FOnFrameChanged) then FOnFrameChanged(Self); Repaint; end; end; function TGifAnim.LoadFromLazarusResource(const ResName: String): boolean; var GifLoader: TGifLoader; StateAnimate: boolean; Resource: TLResource; begin Result:=false; StateAnimate:= Animate; FWait.Enabled:= false; ResetImage; Resource:=nil; Resource:=LazarusResources.Find(ResName); if Resource <> nil then if CompareText(LazarusResources.Find(ResName).ValueType, 'gif')=0 then begin GifLoader := TGifLoader.Create(Filename); FEmpty := not GifLoader.LoadFromLazarusResource(ResName, FGifBitmaps); DefineSize(GifLoader.Width, GifLoader.Height); GifLoader.Free; Result:= FEmpty; end; if not Empty then GifChanged; FWait.Enabled:= StateAnimate; end; procedure TGifAnim.LoadFromFile(const Filename: string); var GifLoader: TGifLoader; begin FEmpty := True; if not FileExists(Filename) then Exit; GifLoader := TGifLoader.Create(Filename); if (csDesigning in ComponentState) then FEmpty := not GifLoader.LoadFirstBitmap(CurrentView) else FEmpty := not GifLoader.LoadAllBitmap(FGifBitmaps); DefineSize(GifLoader.Width, GifLoader.Height); GifLoader.Free; end; procedure TGifAnim.OnTime(Sender: TObject); begin if (not Empty) and Visible then begin if FCurrentImage >= GifBitmaps.Count - 1 then FCurrentImage := 0 else Inc(FCurrentImage); if Assigned(FOnFrameChanged) then FOnFrameChanged(Self); Repaint; end; end; procedure TGifAnim.SetAnimate(const AValue: boolean); begin if FAnimate = AValue then exit; FAnimate := AValue; if not (csDesigning in ComponentState) then begin FWait.Enabled := Animate; if Animate then DoStartAnim else DoStopAnim; end; end; procedure TGifAnim.SetFileName(const AValue: string); var fn: string; begin if (FFileName = AValue) then exit; FFileName := AValue; ResetImage; if (FFileName = '') then exit; if (csDesigning in ComponentState) then begin fn:= ExtractFileName(AValue); FFileName:= ExtractFilePath(AValue); FFileName:= ExtractRelativepath(ExtractFilePath(LazarusIDE.ActiveProject.ProjectInfoFile) ,FFileName); FFileName:=FFileName+fn; LoadFromFile(FFileName+fn); end else begin FFileName := AValue; LoadFromFile(FFileName); end; if not Empty then GifChanged; end; procedure TGifAnim.DefineSize(AWidth, AHeight: integer); begin if (AWidth = FGifWidth) and (AHeight = FGifHeight) then Exit; FGifWidth := AWidth; FGifHeight := AHeight; Height := FGifHeight; Width := FGifWidth; if not (csDesigning in ComponentState) then begin BufferImg.Height := Height; BufferImg.Width := Width; end; end; procedure TGifAnim.CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: boolean); begin PreferredWidth := FGifWidth; PreferredHeight := FGifHeight; end; procedure TGifAnim.DoAutoSize; var ModifyWidth, ModifyHeight: boolean; NewWidth: integer; NewHeight: integer; begin if AutoSizing then Exit; // we shouldn't come here in the first place BeginAutoSizing; try GetPreferredSize(NewWidth, NewHeight); ModifyWidth := [akLeft, akRight] * (Anchors + AnchorAlign[Align]) <> [akLeft, akRight]; ModifyHeight := [akTop, akBottom] * (Anchors + AnchorAlign[Align]) <> [akTop, akBottom]; if not ModifyWidth then NewWidth := Width; if not ModifyHeight then NewHeight := Height; if (NewWidth <> Width) or (NewHeight <> Height) then begin SetBounds(Left, Top, NewWidth, NewHeight); end; finally EndAutoSizing; end; end; class function TGifAnim.GetControlClassDefaultSize: TSize; begin Result.CX := 90; Result.CY := 90; end; procedure TGifAnim.GifChanged; begin if not (csDesigning in ComponentState) then begin BufferImg.Canvas.Brush.Color := (self.Color); BufferImg.Canvas.FillRect(Rect(0, 0, Width, Height)); with GifBitmaps.Items[FCurrentImage] do BufferImg.Canvas.Draw(PosX, PosY, Bitmap); CurrentView.Assign(BufferImg); end; InvalidatePreferredSize; AdjustSize; end; procedure TGifAnim.Paint; begin if (not Empty) and Visible then begin if not (csDesigning in ComponentState) then begin if (FCurrentImage < GifBitmaps.Count) then with GifBitmaps.Items[FCurrentImage] do begin BufferImg.Canvas.Brush.Color := (self.Color); if FCurrentImage = 0 then BufferImg.Canvas.FillRect(Rect(0, 0, Width, Height)); if Delay <> 0 then FWait.Interval := Delay * 10; BufferImg.Canvas.Draw(PosX, PosY, Bitmap); CurrentView.Assign(BufferImg); case Method of //0 : Not specified... //1 : No change Background 2: BufferImg.Canvas.FillRect( Rect(PosX, PosY, Bitmap.Width + PosX, Bitmap.Height + PosY)); 3: BufferImg.Canvas.FillRect(Rect(0, 0, Width, Height)); end; end; end else begin Canvas.Brush.Color := (self.Color); Canvas.FillRect(Rect(0, 0, Width, Height)); end; Canvas.Draw(0, 0, CurrentView); end; inherited Paint; end; procedure TGifAnim.ResetImage; begin if assigned(FGifBitmaps) then FreeAndNil(FGifBitmaps); FCurrentImage:=0; with CurrentView do begin Canvas.Brush.Color := (self.Color); Canvas.FillRect(Rect(0, 0, Width, Height)); end; end; procedure TGifAnim.SetColor(Value: TColor); begin inherited SetColor(Value); end; procedure TGifAnim.DoStartAnim; begin if assigned(OnStartAnim) then OnStartAnim(Self); end; procedure TGifAnim.DoStopAnim; begin if assigned(OnStopAnim) then OnStartAnim(Self); end; { TGifLoader } constructor TGifLoader.Create(const FileName: string); begin FFileName := FileName; FGifUseGraphCtrlExt := False; FPalette := TFPPalette.Create(0); FHeight := 20; FWidth := 20; end; destructor TGifLoader.Destroy; begin inherited Destroy; FPalette.Free; end; function TGifLoader.LoadAllBitmap(var AGifList: TGifList): boolean; var GifStream: TMemoryStream; Introducer: byte; FPImage: TLazIntfImage; ImgFormatDescription: TRawImageDescription; GifBitmap: TGifImage; begin Result := False; if not FileExists(FFileName) then exit; if not assigned(AGifList) then AGifList := TGifList.Create(True); GifStream := TMemoryStream.Create; GifStream.LoadFromFile(FFileName); GifStream.Position := 0; ReadHeader(GifStream); if (FGifHeader.Version <> '89a') then Exit; // skip first block extention if exist repeat Introducer := SkipBlock(GifStream); until (Introducer = ID_IMAGE_DESCRIPTOR) or (Introducer = ID_TRAILER); repeat ReadGifBitmap(GifStream); // decode Gif bitmap in Scanline buffer ReadScanLine(GifStream); // Create temp Fp Image for put scanline pixel FPImage := TLazIntfImage.Create(FLocalWidth, FLocalHeight); ImgFormatDescription.Init_BPP32_B8G8R8A8_BIO_TTB(FLocalWidth, FLocalHeight); FPImage.DataDescription := ImgFormatDescription; WriteScanLine(FPImage); GifBitmap := TGifImage.Create; GifBitmap.FBitmap.LoadFromIntfImage(FPImage); GifBitmap.FPosX := FGifDescriptor.Left; GifBitmap.FPosY := FGifDescriptor.Top; GifBitmap.FMethod := FDisposalMethod; GifBitmap.FDelay := FGifGraphicsCtrlExt.DelayTime; AGifList.Add(GifBitmap); FPImage.Free; FreeMem(FScanLine, FLineSize); // reset FGifUseGraphCtrlExt flag FGifUseGraphCtrlExt := False; repeat Introducer := SkipBlock(GifStream); until (Introducer = ID_IMAGE_DESCRIPTOR) or (Introducer = ID_TRAILER); until (Introducer = ID_TRAILER); GifStream.Free; Result := True; end; function TGifLoader.LoadFromLazarusResource(const ResName: String; var AGifList: TGifList): boolean; var GifStream: TLazarusResourceStream; Introducer: byte; FPImage: TLazIntfImage; ImgFormatDescription: TRawImageDescription; GifBitmap: TGifImage; begin Result := False; if not assigned(AGifList) then AGifList := TGifList.Create(True); GifStream := TLazarusResourceStream.Create(ResName, nil); GifStream.Position := 0; ReadHeader(GifStream); if (FGifHeader.Version <> '89a') then Exit; // skip first block extention if exist repeat Introducer := SkipBlock(GifStream); until (Introducer = ID_IMAGE_DESCRIPTOR) or (Introducer = ID_TRAILER); repeat ReadGifBitmap(GifStream); // decode Gif bitmap in Scanline buffer ReadScanLine(GifStream); // Create temp Fp Image for put scanline pixel FPImage := TLazIntfImage.Create(FLocalWidth, FLocalHeight); ImgFormatDescription.Init_BPP32_B8G8R8A8_BIO_TTB(FLocalWidth, FLocalHeight); FPImage.DataDescription := ImgFormatDescription; WriteScanLine(FPImage); GifBitmap := TGifImage.Create; GifBitmap.FBitmap.LoadFromIntfImage(FPImage); GifBitmap.FPosX := FGifDescriptor.Left; GifBitmap.FPosY := FGifDescriptor.Top; GifBitmap.FMethod := FDisposalMethod; GifBitmap.FDelay := FGifGraphicsCtrlExt.DelayTime; AGifList.Add(GifBitmap); FPImage.Free; FreeMem(FScanLine, FLineSize); // reset FGifUseGraphCtrlExt flag FGifUseGraphCtrlExt := False; repeat Introducer := SkipBlock(GifStream); until (Introducer = ID_IMAGE_DESCRIPTOR) or (Introducer = ID_TRAILER); until (Introducer = ID_TRAILER); GifStream.Free; Result := True; end; function TGifLoader.LoadFirstBitmap(var ABitmap: TBitmap): boolean; var GifStream: TMemoryStream; Introducer: byte; FPImage: TLazIntfImage; ImgFormatDescription: TRawImageDescription; begin Result := False; if not FileExists(FFileName) then exit; if not assigned(ABitmap) then ABitmap := TBitmap.Create; GifStream := TMemoryStream.Create; GifStream.LoadFromFile(FFileName); GifStream.Position := 0; ReadHeader(GifStream); if (FGifHeader.Version <> '89a') then Exit; // skip first block extention if exist repeat Introducer := SkipBlock(GifStream); until (Introducer = ID_IMAGE_DESCRIPTOR) or (Introducer = ID_TRAILER); ReadGifBitmap(GifStream); // decode Gif bitmap in Scanline buffer ReadScanLine(GifStream); // Create temp Fp Image for put scanline pixel FPImage := TLazIntfImage.Create(FLocalWidth, FLocalHeight); ImgFormatDescription.Init_BPP32_B8G8R8A8_BIO_TTB(FLocalWidth, FLocalHeight); FPImage.DataDescription := ImgFormatDescription; WriteScanLine(FPImage); ABitmap.LoadFromIntfImage(FPImage); FPImage.Free; FreeMem(FScanLine, FLineSize); // reset FGifUseGraphCtrlExt flag FGifUseGraphCtrlExt := False; GifStream.Free; Result := True; end; procedure TGifLoader.SetTransparent(const AValue: boolean); begin if FIsTransparent = AValue then exit; FIsTransparent := AValue; end; function TGifLoader.SkipBlock(Stream: TStream): byte; var Introducer, Labels, SkipByte: byte; begin Introducer := 0; Labels := 0; SkipByte := 0; Stream.Read(Introducer, 1); if Introducer = EXT_INTRODUCER then begin Stream.Read(Labels, 1); case Labels of EXT_COMMENT, EXT_APPLICATION: while True do begin Stream.Read(SkipByte, 1); if SkipByte = 0 then Break; Stream.Seek(SkipByte, soFromCurrent); end; EXT_GRAPHICS_CONTROL: begin Stream.Read(FGifGraphicsCtrlExt, SizeOf(FGifGraphicsCtrlExt)); FGifUseGraphCtrlExt := True; end; EXT_PLAIN_TEXT: begin Stream.Read(SkipByte, 1); Stream.Seek(SkipByte, soFromCurrent); while True do begin Stream.Read(SkipByte, 1); if SkipByte = 0 then Break; Stream.Seek(SkipByte, soFromCurrent); end; end; end; end; Result := Introducer; end; procedure TGifLoader.ReadScanLine(Stream: TStream); var OldPos, UnpackedSize, PackedSize: longint; I: integer; Data, Bits, Code: cardinal; SourcePtr: PByte; InCode: cardinal; CodeSize: cardinal; CodeMask: cardinal; FreeCode: cardinal; OldCode: cardinal; Prefix: array[0..CODE_TABLE_SIZE - 1] of cardinal; Suffix, Stack: array [0..CODE_TABLE_SIZE - 1] of byte; StackPointer: PByte; DataComp, Target: PByte; B, FInitialCodeSize, FirstChar: byte; ClearCode, EOICode: word; begin FInitialCodeSize := 0; B := 0; DataComp := nil; // initialisation du dictionnaire de decompression Stream.Read(FInitialCodeSize, 1); // Recherche la taille des donnes compresser OldPos := Stream.Position; PackedSize := 0; repeat Stream.Read(B, 1); if B > 0 then begin Inc(PackedSize, B); Stream.Seek(B, soFromCurrent); end; until B = 0; Getmem(DataComp, PackedSize); // lecture des donnes conpresser SourcePtr := DataComp; Stream.Position := OldPos; repeat Stream.Read(B, 1); if B > 0 then begin Stream.ReadBuffer(SourcePtr^, B); Inc(SourcePtr, B); end; until B = 0; SourcePtr := DataComp; Target := FScanLine; CodeSize := FInitialCodeSize + 1; ClearCode := 1 shl FInitialCodeSize; EOICode := ClearCode + 1; FreeCode := ClearCode + 2; OldCode := CODE_TABLE_SIZE; CodeMask := (1 shl CodeSize) - 1; UnpackedSize := FLocalWidth * FLocalHeight; for I := 0 to ClearCode - 1 do begin Prefix[I] := CODE_TABLE_SIZE; Suffix[I] := I; end; StackPointer := @Stack; FirstChar := 0; Data := 0; Bits := 0; //Decompression LZW gif while (UnpackedSize > 0) and (PackedSize > 0) do begin Inc(Data, SourcePtr^ shl Bits); Inc(Bits, 8); while Bits >= CodeSize do begin Code := Data and CodeMask; Data := Data shr CodeSize; Dec(Bits, CodeSize); if Code = EOICode then Break; if Code = ClearCode then begin CodeSize := FInitialCodeSize + 1; CodeMask := (1 shl CodeSize) - 1; FreeCode := ClearCode + 2; OldCode := CODE_TABLE_SIZE; Continue; end; if Code > FreeCode then Break; if OldCode = CODE_TABLE_SIZE then begin FirstChar := Suffix[Code]; Target^ := FirstChar; Inc(Target); Dec(UnpackedSize); OldCode := Code; Continue; end; InCode := Code; if Code = FreeCode then begin StackPointer^ := FirstChar; Inc(StackPointer); Code := OldCode; end; while Code > ClearCode do begin StackPointer^ := Suffix[Code]; Inc(StackPointer); Code := Prefix[Code]; end; FirstChar := Suffix[Code]; StackPointer^ := FirstChar; Inc(StackPointer); Prefix[FreeCode] := OldCode; Suffix[FreeCode] := FirstChar; if (FreeCode = CodeMask) and (CodeSize < 12) then begin Inc(CodeSize); CodeMask := (1 shl CodeSize) - 1; end; if FreeCode < CODE_TABLE_SIZE - 1 then Inc(FreeCode); OldCode := InCode; repeat Dec(StackPointer); Target^ := StackPointer^; Inc(Target); Dec(UnpackedSize); until StackPointer = @Stack; end; Inc(SourcePtr); Dec(PackedSize); end; FreeMem(DataComp); end; procedure TGifLoader.ReadHeader(Stream: TStream); begin Stream.Read(FGifHeader, SizeOf(FGifHeader)); with FGifHeader do begin FGifBackgroundColor := BackgroundColor; FWidth := ScreenWidth; FHeight := ScreenHeight; FLocalWidth := ScreenWidth; FLocalHeight := ScreenHeight; IsTransparent := False; end; ReadGlobalPalette(Stream); end; procedure TGifLoader.ReadGlobalPalette(Stream: TStream); var ColorTableSize: integer; begin if (FGifHeader.Packedbit and ID_COLOR_TABLE) <> 0 then begin ColorTableSize := FGifHeader.Packedbit and ID_COLOR_TABLE_SIZE + 1; ReadPalette(Stream, 1 shl ColorTableSize); end; end; procedure TGifLoader.ReadGraphCtrlExt; var C: TFPColor; begin IsTransparent := (FGifGraphicsCtrlExt.Packedbit and ID_TRANSPARENT) <> 0; FDisposalMethod := (FGifGraphicsCtrlExt.Packedbit and $1C) shr 2; if IsTransparent then begin // if Transparent bitmap change alpha channel FGifBackgroundColor := FGifGraphicsCtrlExt.ColorIndex; C := FPalette[FGifBackgroundColor]; C.alpha := alphaTransparent; FPalette[FGifBackgroundColor] := C; end; end; procedure TGifLoader.SetInterlaced(const AValue: boolean); begin if FInterlaced = AValue then exit; FInterlaced := AValue; end; procedure TGifLoader.ReadPalette(Stream: TStream; Size: integer); var RGBEntry: TRGB; I: integer; C: TFPColor; begin FPalette.Clear; FPalette.Count := 0; Fillchar(RGBEntry, SizeOf(RGBEntry), 0); for I := 0 to Size - 1 do begin Stream.Read(RGBEntry, SizeOf(RGBEntry)); with C do begin Red := RGBEntry.Red or (RGBEntry.Red shl 8); Green := RGBEntry.Green or (RGBEntry.Green shl 8); Blue := RGBEntry.Blue or (RGBEntry.Blue shl 8); Alpha := alphaOpaque; end; FPalette.Add(C); end; end; procedure TGifLoader.WriteScanLine(Img: TFPCustomImage); var Row, Col: integer; Pass, Every: byte; P: PByte; begin P := FScanLine; if Interlaced then begin for Pass := 1 to 4 do begin case Pass of 1: begin Row := 0; Every := 8; end; 2: begin Row := 4; Every := 8; end; 3: begin Row := 2; Every := 4; end; 4: begin Row := 1; Every := 2; end; end; repeat for Col := 0 to FLocalWidth - 1 do begin Img.Colors[Col, Row] := FPalette[P^]; Inc(P); end; Inc(Row, Every); until Row >= FLocalHeight; end; end else begin for Row := 0 to FLocalHeight - 1 do for Col := 0 to FLocalWidth - 1 do begin Img.Colors[Col, Row] := FPalette[P^]; Inc(P); end; end; end; procedure TGifLoader.ReadGifBitmap(Stream: TStream); var ColorTableSize: integer; begin Stream.Read(FGifDescriptor, SizeOf(FGifDescriptor)); with FGifDescriptor do begin FLocalWidth := Width; FLocalHeight := Height; Interlaced := (Packedbit and ID_INTERLACED = ID_INTERLACED); end; FLineSize := FLocalWidth * (FLocalHeight + 1); GetMem(FScanLine, FLineSize); if (FGifDescriptor.Packedbit and ID_COLOR_TABLE) <> 0 then begin ColorTableSize := FGifDescriptor.Packedbit and ID_COLOR_TABLE_SIZE + 1; ReadPalette(Stream, 1 shl ColorTableSize); end; if FGifUseGraphCtrlExt then ReadGraphCtrlExt; end; { TGifImage } constructor TGifImage.Create; begin FBitmap := TBitmap.Create; FPosX := 0; FPosY := 0; FDelay := 0; FMethod := 0; end; destructor TGifImage.Destroy; begin inherited Destroy; FBitmap.Free; end; { TGifList } function TGifList.GetItems(Index: integer): TGifImage; begin Result := TGifImage(inherited Items[Index]); end; procedure TGifList.SetItems(Index: integer; AGifImage: TGifImage); begin Put(Index, AGifImage); end; function TGifList.Add(AGifImage: TGifImage): integer; begin Result := inherited Add(AGifImage); end; function TGifList.Extract(Item: TGifImage): TGifImage; begin Result := TGifImage(inherited Extract(Item)); end; function TGifList.Remove(AGifImage: TGifImage): integer; begin Result := inherited Remove(AGifImage); end; function TGifList.IndexOf(AGifImage: TGifImage): integer; begin Result := inherited IndexOf(AGifImage); end; function TGifList.First: TGifImage; begin Result := TGifImage(inherited First); end; function TGifList.Last: TGifImage; begin Result := TGifImage(inherited Last); end; procedure TGifList.Insert(Index: integer; AGifImage: TGifImage); begin inherited Insert(Index, AGifImage); end; initialization {$I gifanim.lrs} end. doublecmd-0.5.8/components/gifanim/readme.txt0000644000175000017500000000024712043464010020300 0ustar alexxalexxGifAnim http://wile64.perso.neuf.fr/download/download.php?cat=4&id=8 Version 1.4 (14/09/2009) Some modifications done for Double Commander (see doublecmd.diff). doublecmd-0.5.8/components/build.bat0000644000175000017500000000104512162610121016452 0ustar alexxalexx@echo off rem Compiling components rem This script is run from build.bat. rem If you run it directly set %lazpath% first rem or have lazbuild in your PATH. pushd components lazbuild chsdet\chsdet.lpk %DC_ARCH% lazbuild CmdLine\cmdbox.lpk %DC_ARCH% lazbuild dcpcrypt\dcpcrypt.lpk %DC_ARCH% lazbuild doublecmd\doublecmd_common.lpk %DC_ARCH% lazbuild KASToolBar\kascomp.lpk %DC_ARCH% lazbuild viewer\viewerpackage.lpk %DC_ARCH% lazbuild gifanim\pkg_gifanim.lpk %DC_ARCH% lazbuild ZVDateTimeCtrls\zvdatetimectrls.lpk %DC_ARCH% popd doublecmd-0.5.8/components/KASToolBar/0000755000175000017500000000000012257501472016601 5ustar alexxalexxdoublecmd-0.5.8/components/KASToolBar/kascomp.pas0000644000175000017500000000111011752430571020734 0ustar alexxalexx{ This file was automatically created by Lazarus. Do not edit! This source is only used to compile and install the package. } unit KASComp; interface uses KASToolBar, KASProgressBar, KASPathEdit, KASToolItems, KASComboBox, LazarusPackageIntf; implementation procedure Register; begin RegisterUnit('KASToolBar', @KASToolBar.Register); RegisterUnit('KASProgressBar', @KASProgressBar.Register); RegisterUnit('KASPathEdit', @KASPathEdit.Register); RegisterUnit('KASComboBox', @KASComboBox.Register); end; initialization RegisterPackage('KASComp', @Register); end. doublecmd-0.5.8/components/KASToolBar/dwtaskbarlist.pas0000644000175000017500000001446612014201074022161 0ustar alexxalexxunit dwTaskbarList; {$mode delphi}{$H+} interface uses Messages , Windows ; const CLSID_TaskbarList: TGUID = '{56FDF344-FD6D-11D0-958A-006097C9A090}'; CLSID_TaskbarList2: TGUID = '{602D4995-B13A-429B-A66E-1935E44F4317}'; CLSID_TaskbarList3: TGUID = '{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}'; const THBF_ENABLED = $0000; THBF_DISABLED = $0001; THBF_DISMISSONCLICK = $0002; THBF_NOBACKGROUND = $0004; THBF_HIDDEN = $0008; const THB_BITMAP = $0001; THB_ICON = $0002; THB_TOOLTIP = $0004; THB_FLAGS = $0008; const THBN_CLICKED = $1800; const TBPF_NOPROGRESS = $00; TBPF_INDETERMINATE = $01; TBPF_NORMAL = $02; TBPF_ERROR= $04; TBPF_PAUSED = $08; const TBATF_USEMDITHUMBNAIL: DWORD = $00000001; TBATF_USEMDILIVEPREVIEW: DWORD = $00000002; const WM_DWMSENDICONICTHUMBNAIL = $0323; WM_DWMSENDICONICLIVEPREVIEWBITMAP = $0326; type TTipString = array[0..259] of WideChar; PTipString = ^TTipString; tagTHUMBBUTTON = packed record dwMask : DWORD; iId , iBitmap : UINT; hIcon : HICON; szTip : TTipString; dwFlags : DWORD; end; THUMBBUTTON = tagTHUMBBUTTON; THUMBBUTTONLIST = ^THUMBBUTTON; TThumbButton = THUMBBUTTON; TThumbButtonList = array of TThumbButton; type ITaskbarList = interface ['{56FDF342-FD6D-11D0-958A-006097C9A090}'] procedure HrInit; safecall; procedure AddTab(hwnd: HWND); safecall; procedure DeleteTab(hwnd: HWND); safecall; procedure ActivateTab(hwnd: HWND); safecall; procedure SetActiveAlt(hwnd: HWND); safecall; end; ITaskbarList2 = interface(ITaskbarList) ['{602D4995-B13A-429B-A66E-1935E44F4317}'] procedure MarkFullscreenWindow(hwnd: HWND; fFullscreen: Bool); safecall; end; ITaskbarList3 = interface(ITaskbarList2) ['{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}'] procedure SetProgressValue(hwnd: HWND; ullCompleted, ullTotal: ULONGLONG); safecall; procedure SetProgressState(hwnd: HWND; tbpFlags: DWORD); safecall; procedure RegisterTab(hwndTab: HWND; hwndMDI: HWND); safecall; procedure UnregisterTab(hwndTab: HWND); safecall; procedure SetTabOrder(hwndTab: HWND; hwndInsertBefore: HWND); safecall; procedure SetTabActive(hwndTab: HWND; hwndMDI: HWND; tbatFlags: DWORD); safecall; procedure ThumbBarAddButtons(hwnd: HWND; cButtons: UINT; Button: THUMBBUTTONLIST); safecall; procedure ThumbBarUpdateButtons(hwnd: HWND; cButtons: UINT; pButton: THUMBBUTTONLIST); safecall; procedure ThumbBarSetImageList(hwnd: HWND; himl: HIMAGELIST); safecall; procedure SetOverlayIcon(hwnd: HWND; hIcon: HICON; pszDescription: LPCWSTR); safecall; procedure SetThumbnailTooltip(hwnd: HWND; pszTip: LPCWSTR); safecall; procedure SetThumbnailClip(hwnd: HWND; prcClip: PRect); safecall; end; const DWM_SIT_DISPLAYFRAME = $00000001; // Display a window frame around the provided bitmap DWMWA_FORCE_ICONIC_REPRESENTATION = 7; // [set] Force this window to display iconic thumbnails. DWMWA_HAS_ICONIC_BITMAP = 10; // [set] Indicates an available bitmap when there is no better thumbnail representation. DWMWA_DISALLOW_PEEK = 11; // [set] Don't invoke Peek on the window. type TWMDwmSendIconicLivePreviewBitmap = TWMNoParams; TWMDwmSendIconicThumbnail = packed record Msg : Cardinal; Unused : Integer; Height , Width : Word; Result : LongInt; end; function DwmInvalidateIconicBitmaps(hwnd: HWND): HRESULT; function DwmSetIconicLivePreviewBitmap(hwnd: HWND; hbmp: HBITMAP; pptClient: PPoint; dwSITFlags: DWORD): HRESULT; function DwmSetIconicThumbnail(hWnd: HWND; hBmp: HBITMAP; dwSITFlags: DWORD): HRESULT; function DwmSetWindowAttribute(hwnd: HWND; dwAttribute: DWORD; pvAttribute: Pointer; cbAttribute: DWORD): HRESULT; function PrintWindow(hwnd: HWND; hdcBlt: HDC; nFlags: UINT): BOOL; implementation var hDWMAPI: HMODULE; _DwmInvalidateIconicBitmaps: function(hwnd: HWND): HRESULT; stdcall; _DwmSetIconicThumbnail: function(hWnd: HWND; hBmp: HBITMAP; dwSITFlags: DWORD): HRESULT; stdcall; _DwmSetIconicLivePreviewBitmap: function(hwnd: HWND; hbmp: HBITMAP; pptClient: PPoint; dwSITFlags: DWORD): HRESULT; stdcall; _DwmSetWindowAttribute: function(hwnd: HWND; dwAttribute: DWORD; pvAttribute: Pointer; cbAttribute: DWORD): HRESULT; stdcall; _PrintWindow: function(hwnd: HWND; hdcBlt: HDC; nFlags: UINT): BOOL; stdcall; procedure InitDwmApi; begin if hDWMAPI = 0 then begin hDWMAPI := LoadLibrary('DWMAPI.DLL'); if hDWMAPI = 0 then begin hDWMAPI := THandle(-1); end else begin _DwmInvalidateIconicBitmaps := GetProcAddress(hDWMAPI, 'DwmInvalidateIconicBitmaps'); _DwmSetIconicLivePreviewBitmap := GetProcAddress(hDWMAPI, 'DwmSetIconicLivePreviewBitmap'); _DwmSetIconicThumbnail := GetProcAddress(hDWMAPI, 'DwmSetIconicThumbnail'); _DwmSetWindowAttribute := GetProcAddress(hDWMAPI, 'DwmSetWindowAttribute'); end; end; end; function DwmInvalidateIconicBitmaps(hwnd: HWND): HRESULT; begin InitDwmApi; if Assigned(_DwmInvalidateIconicBitmaps) then Result := _DwmInvalidateIconicBitmaps(hwnd) else Result := E_NOTIMPL; end; function DwmSetIconicLivePreviewBitmap(hwnd: HWND; hbmp: HBITMAP; pptClient: PPoint; dwSITFlags: DWORD): HRESULT; begin InitDwmApi; if Assigned(_DwmSetIconicLivePreviewBitmap) then Result := _DwmSetIconicLivePreviewBitmap(hwnd, hbmp, pptClient, dwSITFlags) else Result := E_NOTIMPL; end; function DwmSetIconicThumbnail(hWnd: HWND; hBmp: HBITMAP; dwSITFlags: DWORD): HRESULT; begin InitDwmApi; if Assigned(_DwmSetIconicThumbnail) then Result := _DwmSetIconicThumbnail(hWnd, hBmp, dwSITFlags) else Result := E_NOTIMPL; end; function DwmSetWindowAttribute(hwnd: HWND; dwAttribute: DWORD; pvAttribute: Pointer; cbAttribute: DWORD): HRESULT; begin InitDwmApi; if Assigned(_DwmSetWindowAttribute) then Result := _DwmSetWindowAttribute(hwnd, dwAttribute, pvAttribute, cbAttribute) else Result := E_NOTIMPL; end; {-----------------------------------------------} function PrintWindow(hwnd: HWND; hdcBlt: HDC; nFlags: UINT): BOOL; begin if Assigned(_PrintWindow) then begin Result := _PrintWindow(hwnd, hdcBlt, nFlags); end else begin _PrintWindow := GetProcAddress(GetModuleHandle('user32.dll'), 'PrintWindow'); Result := Assigned(_PrintWindow) and _PrintWindow(hwnd, hdcBlt, nFlags); end; end; end. doublecmd-0.5.8/components/KASToolBar/kastoolbar.pas0000644000175000017500000007576412213115233021456 0ustar alexxalexx{ Double Commander components ------------------------------------------------------------------------- Toolbar panel class Copyright (C) 2006-2010 Koblov Alexander (Alexx2000@mail.ru) contributors: 2012 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License in a file called COPYING along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. } unit KASToolBar; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, ComCtrls, Graphics, Dialogs, ExtCtrls, Buttons, FileUtil, Menus, DCXmlConfig, KASToolItems, LCLVersion; type TOnToolButtonClick = procedure (Sender: TObject) of object; TOnToolButtonMouseUpDown = procedure (Sender: TObject; Button: TMouseButton; Shift:TShiftState; X,Y:Integer) of object; TOnToolButtonMouseMove = procedure (Sender: TObject; Shift:TShiftState; X,Y:Integer; NumberOfButton: Integer) of object; TOnToolButtonDragOver = procedure(Sender, Source: TObject; X,Y: Integer; State: TDragState; var Accept: Boolean; NumberOfButton: Integer) of object; TOnToolButtonDragDrop = procedure(Sender, Source: TObject; X, Y: Integer) of object; TOnToolButtonEndDrag = procedure(Sender, Target: TObject; X,Y: Integer) of object; TOnLoadButtonGlyph = function (ToolItem: TKASToolItem; iIconSize: Integer; clBackColor: TColor): TBitmap of object; TOnToolItemExecute = procedure (ToolItem: TKASToolItem) of object; TOnConfigLoadItem = function (Config: TXmlConfig; Node: TXmlNode): TKASToolItem of object; TOnToolItemShortcutsHint = function (ToolItem: TKASNormalItem): String of object; TKASToolBar = class; { TKASToolButton } TKASToolButton = class(TSpeedButton) private FToolItem: TKASToolItem; function GetToolBar: TKASToolBar; protected procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); override; public constructor Create(AOwner: TComponent; Item: TKASToolItem); reintroduce; property ToolBar: TKASToolBar read GetToolBar; property ToolItem: TKASToolItem read FToolItem; end; { TKASToolDivider } TKASToolDivider = class(TKASToolButton) protected procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); override; procedure Paint; override; end; { TKASToolBar } TKASToolBar = class(TToolBar, IToolOwner) private FButtonHeight: Integer; FButtonWidth: Integer; FFlat: Boolean; FGlyphSize: Integer; FRadioToolBar: Boolean; FRowHeight: Integer; FShowDividerAsButton: Boolean; FToolItemExecutors: TFPList; FToolItems: TKASToolBarItems; FToolPopupMenu: TPopupMenu; FOwnsToolItems: Boolean; {$if lcl_fullversion < 1010000} FUpdateCount: Integer; {$endif} FOnToolButtonClick: TOnToolButtonClick; FOnToolButtonMouseDown: TOnToolButtonMouseUpDown; FOnToolButtonMouseUp: TOnToolButtonMouseUpDown; FOnToolButtonMouseMove: TOnToolButtonMouseMove; FOnToolButtonDragOver: TOnToolButtonDragOver; FOnToolButtonDragDrop: TOnToolButtonDragDrop; FOnToolButtonEndDrag: TOnToolButtonEndDrag; FOnLoadButtonGlyph: TOnLoadButtonGlyph; FOnToolItemExecute: TOnToolItemExecute; FOnToolItemShortcutsHint: TOnToolItemShortcutsHint; FKASToolBarFlags: TToolBarFlags; FResizeButtonsNeeded: Boolean; procedure AssignToolButtonProperties(ToolButton: TKASToolButton); procedure ClearExecutors; function CreateButton(Item: TKASToolItem): TKASToolButton; function ExecuteToolItem(Item: TKASToolItem): Boolean; function FindButton(Button: TKASToolButton): Integer; function GetChangePath: String; function GetEnvVar: String; function GetToolItemShortcutsHint(Item: TKASToolItem): String; function LoadBtnIcon(IconPath: String): TBitMap; procedure DrawLinkIcon(Image: TBitMap); function GetButton(Index: Integer): TKASToolButton; procedure InsertButton(InsertAt: Integer; ToolButton: TKASToolButton); procedure SetButtonHeight(const AValue: Integer); procedure SetButtonWidth(const AValue: Integer); procedure SetChangePath(const AValue: String); procedure SetEnvVar(const AValue: String); procedure SetFlat(const AValue: Boolean); procedure SetGlyphSize(const AValue: Integer); procedure ShowMenu(ToolButton: TKASToolButton); procedure ToolButtonClick(Sender: TObject); procedure ToolButtonMouseDown(Sender: TObject; Button: TMouseButton; Shift:TShiftState; X,Y:Integer); procedure ToolButtonMouseUp(Sender: TObject; Button: TMouseButton; Shift:TShiftState; X,Y:Integer); procedure ToolButtonMouseMove(Sender: TObject; Shift:TShiftState; X,Y:Integer); procedure ToolButtonDragOver(Sender, Source: TObject; X,Y: Integer; State: TDragState; var Accept: Boolean); procedure ToolButtonDragDrop(Sender, Source: TObject; X,Y: Integer); procedure ToolButtonEndDrag(Sender, Target: TObject; X, Y: Integer); procedure ToolItemLoaded(Item: TKASToolItem); procedure ToolMenuClicked(Sender: TObject); procedure UpdateButtonsTags; protected procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: Integer; WithThemeSpace: Boolean); override; procedure ControlsAligned; override; procedure FontChanged(Sender: TObject); override; function WrapButtons(UseWidth: integer; out NewWidth, NewHeight: Integer; Simulate: boolean): Boolean; procedure ResizeButtons; public constructor Create(TheOwner: TComponent); override; destructor Destroy; override; function AddButton(Item: TKASToolItem): TKASToolButton; procedure AddToolItemExecutor(ToolItemClass: TKASToolItemClass; ExecuteFunction: TOnToolItemExecute); procedure Clear; procedure ClickItem(ToolItemID: String); overload; function InsertButton(InsertAt: Integer; Item: TKASToolItem): TKASToolButton; function InsertButton(InsertAt: TKASToolButton; Item: TKASToolItem): TKASToolButton; procedure MoveButton(ButtonIndex, MovePosition: Integer); procedure MoveButton(SourceButton: TKASToolButton; TargetToolBar: TKASToolBar; InsertAt: TKASToolButton); procedure RemoveButton(Index: Integer); procedure RemoveButton(Button: TKASToolButton); procedure RemoveToolItemExecutor(ExecuteFunction: TOnToolItemExecute); procedure UncheckAllButtons; procedure UpdateIcon(ToolButton: TKASToolButton); procedure UseItems(AItems: TKASToolBarItems); procedure LoadConfiguration(Config: TXmlConfig; RootNode: TXmlNode; Loader: TKASToolBarLoader); procedure SaveConfiguration(Config: TXmlConfig; RootNode: TXmlNode); procedure BeginUpdate; override; procedure EndUpdate; override; procedure SetButtonSize(NewButtonWidth, NewButtonHeight: Integer); property Buttons[Index: Integer]: TKASToolButton read GetButton; property RowHeight: Integer read FRowHeight; published property OnLoadButtonGlyph : TOnLoadButtonGlyph read FOnLoadButtonGlyph write FOnLoadButtonGlyph; property OnToolButtonClick: TOnToolButtonClick read FOnToolButtonClick write FOnToolButtonClick; property OnToolButtonMouseDown: TOnToolButtonMouseUpDown read FOnToolButtonMouseDown write FOnToolButtonMouseDown; property OnToolButtonMouseUp: TOnToolButtonMouseUpDown read FOnToolButtonMouseUp write FOnToolButtonMouseUp; property OnToolButtonMouseMove: TOnToolButtonMouseMove read FOnToolButtonMouseMove write FOnToolButtonMouseMove; property OnToolButtonDragDrop: TOnToolButtonDragDrop read FOnToolButtonDragDrop write FOnToolButtonDragDrop; property OnToolButtonEndDrag: TOnToolButtonEndDrag read FOnToolButtonEndDrag write FOnToolButtonEndDrag; property OnToolButtonDragOver: TOnToolButtonDragOver read FOnToolButtonDragOver write FOnToolButtonDragOver; property OnToolItemExecute: TOnToolItemExecute read FOnToolItemExecute write FOnToolItemExecute; property OnToolItemShortcutsHint: TOnToolItemShortcutsHint read FOnToolItemShortcutsHint write FOnToolItemShortcutsHint; property RadioToolBar: Boolean read FRadioToolBar write FRadioToolBar default False; property Flat: Boolean read FFlat write SetFlat default False; property GlyphSize: Integer read FGlyphSize write SetGlyphSize; property ButtonHeight: Integer read FButtonHeight write SetButtonHeight default 22; property ButtonWidth: Integer read FButtonWidth write SetButtonWidth default 23; property ShowDividerAsButton: Boolean read FShowDividerAsButton write FShowDividerAsButton default False; property ChangePath: String read GetChangePath write SetChangePath; property EnvVar: String read GetEnvVar write SetEnvVar; end; procedure Register; implementation uses Themes, types, math, DCOSUtils; type PToolItemExecutor = ^TToolItemExecutor; TToolItemExecutor = record ToolItemClass: TKASToolItemClass; ToolItemExecute: TOnToolItemExecute; end; procedure Register; begin RegisterComponents('KASComponents',[TKASToolBar]); end; { TKASToolBar } procedure TKASToolBar.InsertButton(InsertAt: Integer; ToolButton: TKASToolButton); begin if InsertAt < 0 then InsertAt:= 0; if InsertAt > ButtonList.Count then InsertAt:= ButtonList.Count; ButtonList.Insert(InsertAt, ToolButton); FToolItems.Insert(InsertAt, ToolButton.ToolItem); UpdateButtonsTags; ResizeButtons; end; function TKASToolBar.InsertButton(InsertAt: TKASToolButton; Item: TKASToolItem): TKASToolButton; var Index: Integer; begin Index := ButtonList.IndexOf(InsertAt); if Index < 0 then Index := ButtonCount; Result := InsertButton(Index, Item); end; procedure TKASToolBar.CalculatePreferredSize(var PreferredWidth, PreferredHeight: Integer; WithThemeSpace: Boolean); begin WrapButtons(Width, PreferredWidth, PreferredHeight, True); end; procedure TKASToolBar.ControlsAligned; var NewWidth, NewHeight: integer; begin if tbfPlacingControls in FKASToolBarFlags then exit; Include(FKASToolBarFlags, tbfPlacingControls); try WrapButtons(Width, NewWidth, NewHeight, False); finally Exclude(FKASToolBarFlags, tbfPlacingControls); end; end; procedure TKASToolBar.FontChanged(Sender: TObject); begin inherited FontChanged(Sender); ResizeButtons; end; function TKASToolBar.WrapButtons(UseWidth: integer; out NewWidth, NewHeight: Integer; Simulate: boolean): Boolean; var ARect: TRect; x: Integer; y: Integer; CurControl: TControl; StartX: Integer; procedure CalculatePosition; var NewBounds: TRect; begin NewBounds := Bounds(x, y, CurControl.Width, RowHeight); repeat if (not Wrapable) or (NewBounds.Right <= ARect.Right) or (NewBounds.Left = StartX) then begin // control fits into the row x := NewBounds.Left; y := NewBounds.Top; break; end; // try next row NewBounds.Left := StartX; NewBounds.Right := NewBounds.Left + CurControl.Width; inc(NewBounds.Top, RowHeight); inc(NewBounds.Bottom, RowHeight); until false; end; var CurClientRect: TRect; AdjustClientFrame: TRect; i: Integer; w, h: Longint; begin Result := True; NewWidth := 0; NewHeight := 0; DisableAlign; BeginUpdate; try CurClientRect := ClientRect; inc(CurClientRect.Right, UseWidth - Width); ARect := CurClientRect; AdjustClientRect(ARect); AdjustClientFrame.Left := ARect.Left - CurClientRect.Left; AdjustClientFrame.Top := ARect.Top - CurClientRect.Top; AdjustClientFrame.Right := CurClientRect.Right - ARect.Right; AdjustClientFrame.Bottom := CurClientRect.Bottom - ARect.Bottom; //DebugLn(['TToolBar.WrapButtons ',DbgSName(Self),' ARect=',dbgs(ARect)]); // important: top, left button must start in the AdjustClientRect top, left // otherwise Toolbar.AutoSize=true will create an endless loop StartX := ARect.Left; x := StartX; y := ARect.Top; for i := 0 to ButtonList.Count - 1 do begin CurControl := TControl(ButtonList[i]); if not CurControl.IsControlVisible then Continue; CalculatePosition; w := CurControl.Width; h := CurControl.Height; if (not Simulate) and ((CurControl.Left <> x) or (CurControl.Top <> y)) then begin CurControl.SetBounds(x,y,w,h); // Note: do not use SetBoundsKeepBase end; // adjust NewWidth, NewHeight NewWidth := Max(NewWidth, x + w + AdjustClientFrame.Right); NewHeight := Max(NewHeight, y + h + AdjustClientFrame.Bottom); // step to next position inc(x,w); end; finally EndUpdate; EnableAlign; end; end; procedure TKASToolBar.ResizeButtons; var w, h: LongInt; i: Integer; CurControl: TControl; begin if FUpdateCount > 0 then begin FResizeButtonsNeeded := True; Exit; end; InvalidatePreferredChildSizes; FRowHeight := ButtonHeight; // Row height is at least initial button height // First recalculate RowHeight. for i := 0 to ButtonList.Count - 1 do begin CurControl := TControl(ButtonList[i]); w := ButtonWidth; h := ButtonHeight; CurControl.GetPreferredSize(w, h); if FRowHeight < h then FRowHeight := h; end; FResizeButtonsNeeded := False; // Now resize buttons. DisableAlign; BeginUpdate; try for i := 0 to ButtonList.Count - 1 do begin CurControl := TControl(ButtonList[i]); w := ButtonWidth; h := RowHeight; CurControl.GetPreferredSize(w, h); if (CurControl.Width <> w) or (CurControl.Height <> h) then CurControl.SetBounds(CurControl.Left, CurControl.Top, w, h); end; InvalidatePreferredSize; AdjustSize; finally EndUpdate; EnableAlign; end; end; procedure TKASToolBar.SaveConfiguration(Config: TXmlConfig; RootNode: TXmlNode); var Node: TXmlNode; Item: TKASToolItem; i: Integer; begin if ButtonCount > 0 then begin Node := Config.AddNode(RootNode, 'Row'); for i := 0 to ButtonCount - 1 do begin Item := TKASToolButton(Buttons[i]).ToolItem; Item.Save(Config, Node); end; end; end; procedure TKASToolBar.DrawLinkIcon(Image: TBitMap); var sizeLink : Integer; bmLinkIcon : TBitmap; {$IFDEF LCLGTK2} bmTempIcon : TBitmap; {$ENDIF} ToolItem: TKASNormalItem; begin if (Image = nil) or (FOnLoadButtonGlyph = nil) then Exit; sizeLink := FGlyphSize div 2; ToolItem := TKASNormalItem.Create; ToolItem.Icon := 'emblem-symbolic-link'; bmLinkIcon:= FOnLoadButtonGlyph(ToolItem, sizeLink, clBtnFace); ToolItem.Free; if Assigned(bmLinkIcon) then begin {$IFDEF LCLGTK2} // Under GTK2 can not draw over alpha transparent pixels bmTempIcon := TBitmap.Create; bmTempIcon.Assign(Image); Image.FreeImage; Image.SetSize(FGlyphSize, FGlyphSize); Image.Canvas.Brush.Color := clBtnFace; Image.Canvas.FillRect(0, 0, FGlyphSize, FGlyphSize); Image.Canvas.Draw(0, 0, bmTempIcon); bmTempIcon.Free; {$ENDIF} Image.Canvas.Draw(FGlyphSize-sizeLink+2,FGlyphSize-sizeLink+2, bmLinkIcon); Image.TransparentColor:= clBtnFace; Image.Transparent:= True; bmLinkIcon.Free; end; end; function TKASToolBar.LoadBtnIcon(IconPath: String): TBitMap; var picture: TPicture; begin if (IconPath = '') or (not mbFileExists(IconPath)) then Exit(nil); Picture := TPicture.Create; try Picture.LoadFromFile(IconPath); Result := TBitmap.Create; Result.Assign(Picture.Bitmap); finally FreeAndNil(Picture); end; end; procedure TKASToolBar.LoadConfiguration(Config: TXmlConfig; RootNode: TXmlNode; Loader: TKASToolBarLoader); var Node: TXmlNode; begin Clear; BeginUpdate; try Node := Config.FindNode(RootNode, 'Row', False); if Assigned(Node) then Loader.Load(Config, Node, @ToolItemLoaded); finally EndUpdate; end; end; procedure TKASToolBar.AssignToolButtonProperties(ToolButton: TKASToolButton); begin ToolButton.OnClick:= @ToolButtonClick; ToolButton.OnMouseDown:= @ToolButtonMouseDown; ToolButton.OnMouseUp:= @ToolButtonMouseUp; ToolButton.OnMouseMove:= @ToolButtonMouseMove; ToolButton.OnDragDrop:= @ToolButtonDragDrop; ToolButton.OnDragOver:= @ToolButtonDragOver; ToolButton.OnEndDrag:= @ToolButtonEndDrag; end; function TKASToolBar.GetChangePath: String; begin end; function TKASToolBar.GetEnvVar: String; begin end; function TKASToolBar.GetToolItemShortcutsHint(Item: TKASToolItem): String; begin Result := ''; if Assigned(FOnToolItemShortcutsHint) and (Item is TKASNormalItem) then Result := FOnToolItemShortcutsHint(TKASNormalItem(Item)); end; function TKASToolBar.GetButton(Index: Integer): TKASToolButton; begin Result:= TKASToolButton(ButtonList.Items[Index]); end; procedure TKASToolBar.SetChangePath(const AValue: String); begin end; procedure TKASToolBar.SetEnvVar(const AValue: String); begin end; procedure TKASToolBar.SetFlat(const AValue: Boolean); var I: Integer; begin FFlat:= AValue; for I:= 0 to ButtonList.Count - 1 do TKASToolButton(ButtonList.Items[I]).Flat:= FFlat; end; procedure TKASToolBar.SetGlyphSize(const AValue: Integer); var I: Integer; begin if FGlyphSize = AValue then Exit; FGlyphSize:= AValue; BeginUpdate; try for I := 0 to ButtonList.Count - 1 do UpdateIcon(TKASToolButton(ButtonList[i])); finally EndUpdate; end; end; procedure TKASToolBar.ShowMenu(ToolButton: TKASToolButton); var Depth: Integer = 0; procedure MakeMenu(PopupMenu: TMenuItem; MenuItem: TKASMenuItem); var I: Integer; Item: TKASToolItem; PopupMenuItem: TMenuItem; BitmapTmp: TBitmap = nil; sText: String; begin for I := 0 to MenuItem.SubItems.Count - 1 do begin Item := MenuItem.SubItems.Items[I]; if Item is TKASSeparatorItem then begin PopupMenu.AddSeparator; end else begin PopupMenuItem := TMenuItem.Create(PopupMenu); sText := Item.GetEffectiveText; if sText = '' then sText := Item.GetEffectiveHint; PopupMenuItem.Caption := sText; if Item is TKASNormalItem then begin if Assigned(FOnLoadButtonGlyph) then BitmapTmp := FOnLoadButtonGlyph(Item, 16, clMenu); if not Assigned(BitmapTmp) then BitmapTmp := LoadBtnIcon(TKASNormalItem(Item).Icon); PopupMenuItem.Bitmap := BitmapTmp; FreeAndNil(BitmapTmp); end; PopupMenuItem.Tag := PtrInt(Item); PopupMenuItem.OnClick := TNotifyEvent(@ToolMenuClicked); PopupMenu.Add(PopupMenuItem); if Item is TKASMenuItem then MakeMenu(PopupMenuItem, TKASMenuItem(Item)); end; end; end; var Point: TPoint; begin FToolPopupMenu.Free; FToolPopupMenu := TPopupMenu.Create(Self); MakeMenu(FToolPopupMenu.Items, ToolButton.ToolItem as TKASMenuItem); Point.x := ToolButton.Left; Point.y := ToolButton.Top + ToolButton.Height; Point := Self.ClientToScreen(Point); FToolPopupMenu.PopUp(Point.x, Point.y); end; procedure TKASToolBar.ToolButtonClick(Sender: TObject); var Button: TKASToolButton; begin Button := Sender as TKASToolButton; // Do not allow depressing down buttons. if FRadioToolBar and not Button.Down then Button.Down := True; if not ExecuteToolItem(Button.ToolItem) then begin if Assigned(FOnToolButtonClick) then FOnToolButtonClick(Button) else if Button.ToolItem is TKASMenuItem then begin ShowMenu(Button); end; end; end; procedure TKASToolBar.ToolButtonMouseDown(Sender: TObject; Button: TMouseButton; Shift:TShiftState; X,Y:Integer); begin if Assigned(FOnToolButtonMouseDown) then FOnToolButtonMouseDown(Sender, Button, Shift, X,Y); end; procedure TKASToolBar.ToolButtonMouseUp(Sender: TObject; Button: TMouseButton; Shift:TShiftState; X,Y:Integer); begin if Assigned(FOnToolButtonMouseUp) then FOnToolButtonMouseUp(Sender, Button, Shift, X,Y); end; procedure TKASToolBar.ToolItemLoaded(Item: TKASToolItem); begin AddButton(Item); end; procedure TKASToolBar.ToolMenuClicked(Sender: TObject); begin ExecuteToolItem(TKASToolItem((Sender as TMenuItem).Tag)); end; procedure TKASToolBar.ToolButtonMouseMove(Sender: TObject; Shift:TShiftState; X,Y:Integer); begin if Assigned(FOnToolButtonMouseMove) then FOnToolButtonMouseMove(Sender, Shift, X,Y, (Sender as TSpeedButton).Tag); end; procedure TKASToolBar.ToolButtonDragOver(Sender, Source: TObject; X,Y: Integer; State: TDragState; var Accept: Boolean); begin if Assigned(FOnToolButtonDragOver) then FOnToolButtonDragOver(Sender, Source, X,Y, State, Accept, (Sender as TSpeedButton).Tag); end; procedure TKASToolBar.ToolButtonDragDrop(Sender, Source: TObject; X,Y: Integer); begin if Assigned(FOnToolButtonDragDrop) then FOnToolButtonDragDrop(Sender, Source, X, Y); end; procedure TKASToolBar.ToolButtonEndDrag(Sender, Target: TObject; X, Y: Integer); begin if Assigned(FOnToolButtonEndDrag) then FOnToolButtonEndDrag(Sender, Target, X, Y); end; procedure TKASToolBar.MoveButton(ButtonIndex, MovePosition: Integer); begin ButtonList.Move(ButtonIndex, MovePosition); FToolItems.Move(ButtonIndex, MovePosition); UpdateButtonsTags; ResizeButtons; end; procedure TKASToolBar.MoveButton(SourceButton: TKASToolButton; TargetToolBar: TKASToolBar; InsertAt: TKASToolButton); var Index: Integer; ToolItem: TKASToolItem; begin Index := FindButton(SourceButton); if (Index <> -1) and (FToolItems[Index] = SourceButton.ToolItem) then begin SourceButton.FToolItem := nil; TargetToolBar.InsertButton(InsertAt, FToolItems.ReleaseItem(Index)); ButtonList.Delete(Index); Application.ReleaseComponent(SourceButton); // Free later UpdateButtonsTags; Resize; end; end; procedure TKASToolBar.UpdateButtonsTags; var I: Integer; begin for I:= 0 to ButtonList.Count - 1 do TKASToolButton(ButtonList.Items[I]).Tag:= I; end; procedure TKASToolBar.UpdateIcon(ToolButton: TKASToolButton); var Bitmap: TBitmap = nil; begin try if Assigned(FOnLoadButtonGlyph) then Bitmap := FOnLoadButtonGlyph(ToolButton.ToolItem, FGlyphSize, clBtnFace); if not Assigned(Bitmap) and (ToolButton.ToolItem is TKASNormalItem) then Bitmap := LoadBtnIcon(TKASNormalItem(ToolButton.ToolItem).Icon); try if (ToolButton.ToolItem is TKASMenuItem) and Assigned(Bitmap) then DrawLinkIcon(Bitmap); ToolButton.Glyph.Assign(Bitmap); finally Bitmap.Free; end; except // Ignore end; end; procedure TKASToolBar.UseItems(AItems: TKASToolBarItems); var i: Integer; Button: TKASToolButton; begin if Assigned(AItems) then begin BeginUpdate; Clear; if FOwnsToolItems then FToolItems.Free; FToolItems := AItems; FOwnsToolItems := False; // Insert the existing items as buttons. for i := 0 to FToolItems.Count - 1 do begin Button := CreateButton(FToolItems.Items[i]); if Assigned(Button) then ButtonList.Insert(ButtonCount, Button); end; UpdateButtonsTags; ResizeButtons; EndUpdate; end; end; procedure TKASToolBar.Clear; var I: Integer; begin BeginUpdate; for I := 0 to ButtonList.Count - 1 do TKASToolButton(ButtonList.Items[I]).Free; ButtonList.Clear; if Assigned(FToolItems) then FToolItems.Clear; EndUpdate; end; procedure TKASToolBar.ClearExecutors; var I: Integer; begin for I := 0 to FToolItemExecutors.Count - 1 do Dispose(PToolItemExecutor(FToolItemExecutors[I])); FToolItemExecutors.Clear; end; procedure TKASToolBar.ClickItem(ToolItemID: String); var I: Integer; Button: TKASToolButton; NormalItem: TKASNormalItem; begin for I := 0 to ButtonList.Count - 1 do begin Button := TKASToolButton(ButtonList.Items[I]); if Button.ToolItem is TKASNormalItem then begin NormalItem := TKASNormalItem(Button.ToolItem); if NormalItem.ID = ToolItemID then begin Button.Click; Break; end; if Button.ToolItem.CheckExecute(ToolItemID) then Break; end; end; end; procedure TKASToolBar.SetButtonHeight(const AValue: Integer); begin SetButtonSize(ButtonWidth, AValue); end; procedure TKASToolBar.SetButtonWidth(const AValue: Integer); begin SetButtonSize(AValue, ButtonHeight); end; constructor TKASToolBar.Create(TheOwner: TComponent); begin inherited Create(TheOwner); FGlyphSize:= 16; // by default FUpdateCount:= 0; FButtonWidth := 23; FButtonHeight := 22; FKASToolBarFlags := []; FToolItemExecutors := TFPList.Create; FToolItems := TKASToolBarItems.Create; FOwnsToolItems := True; end; function TKASToolBar.CreateButton(Item: TKASToolItem): TKASToolButton; begin if Assigned(Item) then begin if FOwnsToolItems then Item.SetToolOwner(Self); if Item is TKASSeparatorItem then begin Result := TKASToolDivider.Create(Self, Item); end else begin Result := TKASToolButton.Create(Self, Item); Result.ShowHint := True; Result.Caption := Item.GetEffectiveText; Result.Hint := Item.GetEffectiveHint; end; Result.Flat := FFlat; if FRadioToolBar then begin Result.GroupIndex := 1; Result.AllowAllUp := True; end; Result.ShowCaption := ShowCaptions; UpdateIcon(Result); AssignToolButtonProperties(Result); Result.Parent := Self; end else Result := nil; end; destructor TKASToolBar.Destroy; begin if not FOwnsToolItems then FToolItems := nil; // Unassign before Clear so that items are not cleared. Clear; inherited Destroy; ClearExecutors; FToolItemExecutors.Free; if FOwnsToolItems then FToolItems.Free; end; function TKASToolBar.ExecuteToolItem(Item: TKASToolItem): Boolean; var I: Integer; Executor: PToolItemExecutor; BestMatch: PToolItemExecutor = nil; begin for I := 0 to FToolItemExecutors.Count - 1 do begin Executor := PToolItemExecutor(FToolItemExecutors[I]); if Assigned(Executor^.ToolItemExecute) and Item.InheritsFrom(Executor^.ToolItemClass) and (not Assigned(BestMatch) or (Executor^.ToolItemClass.InheritsFrom(BestMatch^.ToolItemClass))) then begin BestMatch := Executor; end; end; Result := Assigned(BestMatch); if Result then BestMatch^.ToolItemExecute(Item); end; procedure TKASToolBar.BeginUpdate; begin {$if lcl_fullversion < 1010000} Inc(FUpdateCount); {$endif} inherited BeginUpdate; DisableAutoSizing; end; procedure TKASToolBar.EndUpdate; begin EnableAutoSizing; inherited EndUpdate; {$if lcl_fullversion < 1010000} Dec(FUpdateCount); {$endif} if (FUpdateCount = 0) and FResizeButtonsNeeded then ResizeButtons; end; function TKASToolBar.FindButton(Button: TKASToolButton): Integer; var I: Integer; begin for I := 0 to ButtonList.Count - 1 do if TKASToolButton(ButtonList[I]) = Button then Exit(I); Result := -1; end; procedure TKASToolBar.SetButtonSize(NewButtonWidth, NewButtonHeight: Integer); begin FButtonWidth := NewButtonWidth; FButtonHeight := NewButtonHeight; ResizeButtons; end; function TKASToolBar.AddButton(Item: TKASToolItem): TKASToolButton; begin Result := InsertButton(ButtonCount, Item); end; procedure TKASToolBar.AddToolItemExecutor(ToolItemClass: TKASToolItemClass; ExecuteFunction: TOnToolItemExecute); var Executor: PToolItemExecutor; begin New(Executor); FToolItemExecutors.Add(Executor); Executor^.ToolItemClass := ToolItemClass; Executor^.ToolItemExecute := ExecuteFunction; end; function TKASToolBar.InsertButton(InsertAt: Integer; Item: TKASToolItem): TKASToolButton; begin Result := CreateButton(Item); if Assigned(Result) then InsertButton(InsertAt, Result); end; procedure TKASToolBar.RemoveButton(Index: Integer); var Button: TKASToolButton; begin Button := TKASToolButton(ButtonList.Items[Index]); ButtonList.Delete(Index); Button.Free; FToolItems.Remove(Index); UpdateButtonsTags; Resize; end; procedure TKASToolBar.RemoveButton(Button: TKASToolButton); var Index: Integer; begin Index := FindButton(Button); if Index <> -1 then RemoveButton(Index); end; procedure TKASToolBar.RemoveToolItemExecutor(ExecuteFunction: TOnToolItemExecute); var Executor: PToolItemExecutor; I: Integer; begin for I := FToolItemExecutors.Count - 1 downto 0 do begin Executor := PToolItemExecutor(FToolItemExecutors[I]); if (TMethod(Executor^.ToolItemExecute).Code = TMethod(ExecuteFunction).Code) and (TMethod(Executor^.ToolItemExecute).Data = TMethod(ExecuteFunction).Data) then begin Dispose(Executor); FToolItemExecutors.Delete(I); end; end; end; procedure TKASToolBar.UncheckAllButtons; var I: Integer; begin for I:= 0 to ButtonCount - 1 do Buttons[I].Down:= False; end; { TKASToolButton } procedure TKASToolButton.CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); var TextSize: TSize; begin if Assigned(Parent) then begin if ShowCaption and (Caption <> EmptyStr) then begin // Size to extent of the icon + caption. // Minimum size is the ButtonWidth x RowHeight of the toolbar. TextSize := Canvas.TextExtent(Caption); PreferredWidth := Max(TextSize.cx + Glyph.Width + 16, ToolBar.ButtonWidth); PreferredHeight := Max(TextSize.cy + 4, ToolBar.RowHeight); end else begin PreferredWidth := ToolBar.ButtonWidth; PreferredHeight := ToolBar.RowHeight; end; end else inherited; end; constructor TKASToolButton.Create(AOwner: TComponent; Item: TKASToolItem); begin inherited Create(AOwner); FToolItem := Item; end; function TKASToolButton.GetToolBar: TKASToolBar; begin Result := Parent as TKASToolBar; end; { TKASToolDivider } procedure TKASToolDivider.CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); begin if Assigned(Parent) and (Parent is TKASToolBar) and not TKASToolBar(Parent).FShowDividerAsButton then begin PreferredWidth := 5; PreferredHeight := TKASToolBar(Parent).RowHeight; end else inherited; end; procedure TKASToolDivider.Paint; var DividerRect: TRect; Details: TThemedElementDetails; begin if Assigned(Parent) and (Parent is TKASToolBar) and not TKASToolBar(Parent).FShowDividerAsButton then begin DividerRect:= ClientRect; Details:= ThemeServices.GetElementDetails(ttbSeparatorNormal); // Theme services have no strict rule to draw divider in the center, // so we should calculate rectangle here // on windows 7 divider can't be less than 4 pixels if (DividerRect.Right - DividerRect.Left) > 5 then begin DividerRect.Left := (DividerRect.Left + DividerRect.Right) div 2 - 3; DividerRect.Right := DividerRect.Left + 5; end; ThemeServices.DrawElement(Canvas.GetUpdatedHandle([csBrushValid, csPenValid]), Details, DividerRect); end else inherited Paint; end; end. doublecmd-0.5.8/components/KASToolBar/kastoolitems.pas0000644000175000017500000003547112215301020022013 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Basic tool items types for KASToolBar Copyright (C) 2012 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit KASToolItems; {$mode objfpc}{$H+} interface uses Classes, SysUtils, DCXmlConfig, DCBasicTypes; type TKASToolBarItems = class; TKASToolItem = class; TOnLoadToolItem = procedure (Item: TKASToolItem) of object; {$interfaces corba} IToolOwner = interface ['{A7908D38-1E13-4E8D-8FA7-8830A2FF9290}'] function ExecuteToolItem(Item: TKASToolItem): Boolean; function GetToolItemShortcutsHint(Item: TKASToolItem): String; end; {$interfaces default} { TKASToolBarLoader } TKASToolBarLoader = class protected function CreateItem(Node: TXmlNode): TKASToolItem; virtual; public procedure Load(Config: TXmlConfig; RootNode: TXmlNode; OnLoadToolItem: TOnLoadToolItem); virtual; end; { TKASToolItem } TKASToolItem = class private FToolOwner: IToolOwner; FUserData: Pointer; protected property ToolOwner: IToolOwner read FToolOwner; public procedure Assign(OtherItem: TKASToolItem); virtual; function CheckExecute(ToolItemID: String): Boolean; virtual; function Clone: TKASToolItem; virtual; abstract; function ConfigNodeName: String; virtual; abstract; function GetEffectiveHint: String; virtual; abstract; function GetEffectiveText: String; virtual; abstract; procedure Load(Config: TXmlConfig; Node: TXmlNode; Loader: TKASToolBarLoader); virtual; abstract; procedure Save(Config: TXmlConfig; Node: TXmlNode); procedure SaveContents(Config: TXmlConfig; Node: TXmlNode); virtual; abstract; procedure SetToolOwner(AToolOwner: IToolOwner); virtual; property UserData: Pointer read FUserData write FUserData; end; TKASToolItemClass = class of TKASToolItem; { TKASSeparatorItem } TKASSeparatorItem = class(TKASToolItem) procedure Assign(OtherItem: TKASToolItem); override; function Clone: TKASToolItem; override; function ConfigNodeName: String; override; function GetEffectiveHint: String; override; function GetEffectiveText: String; override; procedure Load(Config: TXmlConfig; Node: TXmlNode; Loader: TKASToolBarLoader); override; procedure SaveContents(Config: TXmlConfig; Node: TXmlNode); override; end; { TKASNormalItem } TKASNormalItem = class(TKASToolItem) strict private FID: String; // Unique identificator of the button function GetID: String; strict protected procedure SaveHint(Config: TXmlConfig; Node: TXmlNode); virtual; procedure SaveIcon(Config: TXmlConfig; Node: TXmlNode); virtual; procedure SaveText(Config: TXmlConfig; Node: TXmlNode); virtual; public Icon: String; Text: String; Hint: String; procedure Assign(OtherItem: TKASToolItem); override; function CheckExecute(ToolItemID: String): Boolean; override; function Clone: TKASToolItem; override; function ConfigNodeName: String; override; function GetEffectiveHint: String; override; function GetEffectiveText: String; override; function GetShortcutsHint: String; procedure Load(Config: TXmlConfig; Node: TXmlNode; Loader: TKASToolBarLoader); override; procedure SaveContents(Config: TXmlConfig; Node: TXmlNode); override; property ID: String read GetID; end; { TKASMenuItem } TKASMenuItem = class(TKASNormalItem) procedure ToolItemLoaded(Item: TKASToolItem); private FItems: TKASToolBarItems; public constructor Create; reintroduce; destructor Destroy; override; procedure Assign(OtherItem: TKASToolItem); override; function CheckExecute(ToolItemID: String): Boolean; override; function Clone: TKASToolItem; override; function ConfigNodeName: String; override; procedure Load(Config: TXmlConfig; Node: TXmlNode; Loader: TKASToolBarLoader); override; procedure SaveContents(Config: TXmlConfig; Node: TXmlNode); override; procedure SetToolOwner(AToolOwner: IToolOwner); override; property SubItems: TKASToolBarItems read FItems; end; { TKASToolBarItems } TKASToolBarItems = class private FButtons: TFPList; function GetButton(Index: Integer): TKASToolItem; function GetButtonCount: Integer; procedure SetButton(Index: Integer; const AValue: TKASToolItem); public constructor Create; destructor Destroy; override; function Add(Item: TKASToolItem): Integer; procedure Clear; function Insert(InsertAt: Integer; Item: TKASToolItem): Integer; procedure Move(FromIndex, ToIndex: Integer); {en Returns the item at Index, removes it from the list but does not free it like Remove. } function ReleaseItem(Index: Integer): TKASToolItem; procedure Remove(Index: Integer); property Count: Integer read GetButtonCount; property Items[Index: Integer]: TKASToolItem read GetButton write SetButton; default; end; { TKASToolBarSerializer } TKASToolBarSerializer = class private FDeserializedItem: TKASToolItem; procedure SetDeserializedItem(Item: TKASToolItem); public function Deserialize(Stream: TStream; Loader: TKASToolBarLoader): TKASToolItem; procedure Serialize(Stream: TStream; Item: TKASToolItem); end; const MenuItemConfigNode = 'Menu'; NormalItemConfigNode = 'Normal'; SeparatorItemConfigNode = 'Separator'; implementation uses DCStrUtils; { TKASToolItem } procedure TKASToolItem.Assign(OtherItem: TKASToolItem); begin FUserData := OtherItem.FUserData; end; function TKASToolItem.CheckExecute(ToolItemID: String): Boolean; begin Result := False; end; procedure TKASToolItem.Save(Config: TXmlConfig; Node: TXmlNode); begin Node := Config.AddNode(Node, ConfigNodeName); SaveContents(Config, Node); end; procedure TKASToolItem.SetToolOwner(AToolOwner: IToolOwner); begin FToolOwner := AToolOwner; end; { TKASToolBarSerializer } function TKASToolBarSerializer.Deserialize(Stream: TStream; Loader: TKASToolBarLoader): TKASToolItem; var Config: TXmlConfig; begin Result := nil; FDeserializedItem := nil; Config := TXmlConfig.Create; try Config.ReadFromStream(Stream); Loader.Load(Config, Config.RootNode, @SetDeserializedItem); Result := FDeserializedItem; finally Config.Free; end; end; procedure TKASToolBarSerializer.Serialize(Stream: TStream; Item: TKASToolItem); var Config: TXmlConfig; begin Config := TXmlConfig.Create; try Item.Save(Config, Config.RootNode); Config.WriteToStream(Stream); finally Config.Free; end; end; procedure TKASToolBarSerializer.SetDeserializedItem(Item: TKASToolItem); begin FDeserializedItem := Item; end; { TKASToolBarLoader } function TKASToolBarLoader.CreateItem(Node: TXmlNode): TKASToolItem; begin if Node.CompareName(MenuItemConfigNode) = 0 then Result := TKASMenuItem.Create else if Node.CompareName(NormalItemConfigNode) = 0 then Result := TKASNormalItem.Create else if Node.CompareName(SeparatorItemConfigNode) = 0 then Result := TKASSeparatorItem.Create else Result := nil; end; procedure TKASToolBarLoader.Load(Config: TXmlConfig; RootNode: TXmlNode; OnLoadToolItem: TOnLoadToolItem); var Node: TXmlNode; Item: TKASToolItem; begin Node := RootNode.FirstChild; while Assigned(Node) do begin Item := CreateItem(Node); if Assigned(Item) then try Item.Load(Config, Node, Self); OnLoadToolItem(Item); Item := nil; finally FreeAndNil(Item); end; Node := Node.NextSibling; end; end; { TKASMenuItem } procedure TKASMenuItem.Assign(OtherItem: TKASToolItem); var MenuItem: TKASMenuItem; Item: TKASToolItem; I: Integer; begin inherited Assign(OtherItem); if OtherItem is TKASMenuItem then begin MenuItem := TKASMenuItem(OtherItem); FItems.Clear; for I := 0 to MenuItem.SubItems.Count - 1 do begin Item := MenuItem.SubItems.Items[I].Clone; Item.SetToolOwner(ToolOwner); FItems.Add(Item); end; end; end; function TKASMenuItem.CheckExecute(ToolItemID: String): Boolean; var I: Integer; begin Result := inherited CheckExecute(ToolItemID); if not Result then begin for I := 0 to SubItems.Count - 1 do begin if SubItems[I].CheckExecute(ToolItemID) then Exit(True); end; end; end; function TKASMenuItem.Clone: TKASToolItem; begin Result := TKASMenuItem.Create; Result.Assign(Self); end; function TKASMenuItem.ConfigNodeName: String; begin Result := MenuItemConfigNode; end; constructor TKASMenuItem.Create; begin FItems := TKASToolBarItems.Create; end; destructor TKASMenuItem.Destroy; begin inherited Destroy; FItems.Free; end; procedure TKASMenuItem.Load(Config: TXmlConfig; Node: TXmlNode; Loader: TKASToolBarLoader); begin inherited Load(Config, Node, Loader); SubItems.Clear; Node := Config.FindNode(Node, 'MenuItems', False); if Assigned(Node) then Loader.Load(Config, Node, @ToolItemLoaded); end; procedure TKASMenuItem.SaveContents(Config: TXmlConfig; Node: TXmlNode); var I: Integer; begin inherited SaveContents(Config, Node); if SubItems.Count > 0 then begin Node := Config.AddNode(Node, 'MenuItems'); for I := 0 to SubItems.Count - 1 do SubItems.Items[I].Save(Config, Node); end; end; procedure TKASMenuItem.SetToolOwner(AToolOwner: IToolOwner); var I: Integer; begin inherited SetToolOwner(AToolOwner); for I := 0 to SubItems.Count - 1 do SubItems.Items[I].SetToolOwner(ToolOwner); end; procedure TKASMenuItem.ToolItemLoaded(Item: TKASToolItem); begin Item.SetToolOwner(ToolOwner); SubItems.Add(Item); end; { TKASDividerItem } procedure TKASSeparatorItem.Assign(OtherItem: TKASToolItem); begin inherited Assign(OtherItem); end; function TKASSeparatorItem.Clone: TKASToolItem; begin Result := TKASSeparatorItem.Create; Result.Assign(Self); end; function TKASSeparatorItem.ConfigNodeName: String; begin Result := SeparatorItemConfigNode; end; function TKASSeparatorItem.GetEffectiveHint: String; begin Result := ''; end; function TKASSeparatorItem.GetEffectiveText: String; begin Result := ''; end; procedure TKASSeparatorItem.Load(Config: TXmlConfig; Node: TXmlNode; Loader: TKASToolBarLoader); begin // Empty. end; procedure TKASSeparatorItem.SaveContents(Config: TXmlConfig; Node: TXmlNode); begin // Empty. end; { TKASNormalItem } procedure TKASNormalItem.Assign(OtherItem: TKASToolItem); var NormalItem: TKASNormalItem; begin inherited Assign(OtherItem); if OtherItem is TKASNormalItem then begin // Don't copy ID. NormalItem := TKASNormalItem(OtherItem); Icon := NormalItem.Icon; Text := NormalItem.Text; Hint := NormalItem.Hint; end; end; function TKASNormalItem.CheckExecute(ToolItemID: String): Boolean; begin Result := (ID = ToolItemID); if Result and Assigned(FToolOwner) then FToolOwner.ExecuteToolItem(Self); end; function TKASNormalItem.Clone: TKASToolItem; begin Result := TKASNormalItem.Create; Result.Assign(Self); end; function TKASNormalItem.ConfigNodeName: String; begin Result := NormalItemConfigNode; end; function TKASNormalItem.GetEffectiveHint: String; var ShortcutsHint: String; begin Result := Hint; ShortcutsHint := GetShortcutsHint; if ShortcutsHint <> '' then AddStrWithSep(Result, '(' + ShortcutsHint + ')', ' '); end; function TKASNormalItem.GetEffectiveText: String; begin Result := Text; end; function TKASNormalItem.GetID: String; var Guid: TGuid; begin if FID = EmptyStr then begin if CreateGUID(Guid) = 0 then FID := GUIDToString(Guid) else FID := IntToStr(Random(MaxInt)); end; Result := FID; end; function TKASNormalItem.GetShortcutsHint: String; begin if Assigned(FToolOwner) then Result := FToolOwner.GetToolItemShortcutsHint(Self) else Result := ''; end; procedure TKASNormalItem.Load(Config: TXmlConfig; Node: TXmlNode; Loader: TKASToolBarLoader); begin Node := Node.FirstChild; while Assigned(Node) do begin if Node.CompareName('ID') = 0 then FID := Config.GetContent(Node) else if Node.CompareName('Text') = 0 then Text := Config.GetContent(Node) else if Node.CompareName('Icon') = 0 then Icon := Config.GetContent(Node) else if Node.CompareName('Hint') = 0 then Hint := Config.GetContent(Node); Node := Node.NextSibling; end; end; procedure TKASNormalItem.SaveContents(Config: TXmlConfig; Node: TXmlNode); begin Config.AddValue(Node, 'ID', ID); SaveText(Config, Node); SaveIcon(Config, Node); SaveHint(Config, Node); end; procedure TKASNormalItem.SaveHint(Config: TXmlConfig; Node: TXmlNode); begin Config.AddValueDef(Node, 'Hint', Hint, ''); end; procedure TKASNormalItem.SaveIcon(Config: TXmlConfig; Node: TXmlNode); begin Config.AddValueDef(Node, 'Icon', Icon, ''); end; procedure TKASNormalItem.SaveText(Config: TXmlConfig; Node: TXmlNode); begin Config.AddValueDef(Node, 'Text', Text, ''); end; { TKASToolBarItems } constructor TKASToolBarItems.Create; begin FButtons := TFPList.Create; end; destructor TKASToolBarItems.Destroy; begin Clear; inherited Destroy; FButtons.Free; end; function TKASToolBarItems.Insert(InsertAt: Integer; Item: TKASToolItem): Integer; begin FButtons.Insert(InsertAt, Item); Result := InsertAt; end; procedure TKASToolBarItems.Move(FromIndex, ToIndex: Integer); begin FButtons.Move(FromIndex, ToIndex); end; function TKASToolBarItems.ReleaseItem(Index: Integer): TKASToolItem; begin Result := TKASToolItem(FButtons[Index]); FButtons.Delete(Index); end; function TKASToolBarItems.Add(Item: TKASToolItem): Integer; begin Result := FButtons.Add(Item); end; procedure TKASToolBarItems.Remove(Index: Integer); begin TKASToolItem(FButtons[Index]).Free; FButtons.Delete(Index); end; procedure TKASToolBarItems.Clear; var i: Integer; begin for i := 0 to FButtons.Count - 1 do TKASToolItem(FButtons[i]).Free; FButtons.Clear; end; function TKASToolBarItems.GetButtonCount: Integer; begin Result := FButtons.Count; end; function TKASToolBarItems.GetButton(Index: Integer): TKASToolItem; begin Result := TKASToolItem(FButtons[Index]); end; procedure TKASToolBarItems.SetButton(Index: Integer; const AValue: TKASToolItem); begin TKASToolItem(FButtons[Index]).Free; FButtons[Index] := AValue; end; end. doublecmd-0.5.8/components/KASToolBar/kasprogressbar.pas0000644000175000017500000001131512014201074022321 0ustar alexxalexx{ Double Commander Components ------------------------------------------------------------------------- Extended ProgressBar class Copyright (C) 2010 Przemyslaw Nagay (cobines@gmail.com) Copyright (C) 2011-2012 Koblov Alexander (Alexx2000@mail.ru) Windows 7 implementation based on "Windows 7 Component Library" by Daniel Wischnewski (http://www.gumpi.com/blog) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License in a file called COPYING along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. } unit KASProgressBar; {$mode objfpc}{$H+} interface uses LCLType, Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ComCtrls {$IFDEF LCLWIN32} , InterfaceBase, ComObj, dwTaskbarList {$ENDIF} {$IFDEF LCLGTK2} , Gtk2 {$ENDIF} {$IFDEF LCLQT} , qt4, qtwidgets {$ENDIF} ; type { TKASProgressBar } TKASProgressBar = class(TProgressBar) private FShowInTaskbar: Boolean; {$IFDEF LCLWIN32} FTaskBarEntryHandle: HWND; FTaskbarList: ITaskbarList; FTaskbarList3: ITaskbarList3; {$ENDIF} protected {$IFDEF LCLWIN32} procedure InitializeWnd; override; {$ENDIF} procedure DoOnResize; override; public constructor Create(AOwner: TComponent); override; procedure SetProgress(CurrentValue: Int64; MaxValue: Int64; BarText: String = ''); published property ShowInTaskbar: Boolean read FShowInTaskbar write FShowInTaskbar default False; end; procedure Register; implementation procedure Register; begin RegisterComponents('KASComponents',[TKASProgressBar]); end; { TKASProgressBar } {$IFDEF LCLWIN32} procedure TKASProgressBar.InitializeWnd; var aOwnerForm: TWinControl; begin inherited InitializeWnd; if CheckWin32Version(6, 1) then begin aOwnerForm:= GetParentForm(Self); if Assigned(aOwnerForm) and (aOwnerForm <> Application.MainForm) then FTaskBarEntryHandle := aOwnerForm.Handle else FTaskBarEntryHandle := Widgetset.AppHandle; end; end; {$ENDIF} procedure TKASProgressBar.DoOnResize; begin inherited; Max := Width; end; constructor TKASProgressBar.Create(AOwner: TComponent); begin inherited Create(AOwner); {$IFDEF LCLWIN32} FTaskbarList3 := nil; FTaskBarEntryHandle := INVALID_HANDLE_VALUE; // Works only under Windows 7 and higher if CheckWin32Version(6, 1) then try FTaskbarList := ITaskbarList(CreateComObject(CLSID_TaskbarList)); FTaskbarList.HrInit; FTaskbarList.QueryInterface(CLSID_TaskbarList3, FTaskbarList3); except FTaskbarList3 := nil; end; {$ENDIF} {$IFDEF LCLGTK2} // Have to disable LCLGTK2 default progress bar text // set in TGtk2WSProgressBar.UpdateProgressBarText. BarShowText := False; {$ENDIF} end; procedure TKASProgressBar.SetProgress(CurrentValue: Int64; MaxValue: Int64; BarText: String); {$IFDEF LCLGTK2} var wText: String; {$ENDIF} {$IFDEF LCLQT} var wText: WideString; {$ENDIF} begin if MaxValue <> 0 then Position := Round(CurrentValue * Max / MaxValue) else Position := 0; {$IFDEF LCLWIN32} if FShowInTaskbar and (FTaskBarEntryHandle <> INVALID_HANDLE_VALUE) and Assigned(FTaskbarList3) then begin FTaskbarList3.SetProgressValue(FTaskBarEntryHandle, Position, Max); end; {$ENDIF} {$IFDEF LCLGTK2} { %v - the current progress value. %l - the lower bound for the progress value. %u - the upper bound for the progress value. %p - the current progress percentage. } if BarText <> '' then wText := BarText + ' (%p%%)' else wText := '%p%%'; gtk_progress_set_format_string(PGtkProgress(Self.Handle), PChar(wText)); // Have to reset 'show_text' every time because LCLGTK2 will set it according to BarShowText. gtk_progress_set_show_text(PGtkProgress(Self.Handle), True); {$ENDIF} {$IFDEF LCLQT} { %p - is replaced by the percentage completed. %v - is replaced by the current value. %m - is replaced by the total number of steps. } if BarText <> '' then wText := WideString(BarText) + ' (%p%)' else wText := '%p%'; QProgressBar_setFormat(QProgressBarH(TQtProgressBar(Self.Handle).Widget), @wText); //QProgressBar_setTextVisible(QProgressBarH(TQtProgressBar(Self.Handle).Widget), True); {$ENDIF} end; end. doublecmd-0.5.8/components/KASToolBar/kascombobox.pas0000644000175000017500000000350711752430571021622 0ustar alexxalexx{ Double Commander Components ------------------------------------------------------------------------- Extended ComboBox classes Copyright (C) 2012 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License in a file called COPYING along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. } unit KASComboBox; {$mode objfpc} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls; type { TComboBoxWithDelItems } {en Combo box that allows removing items with Shift+Delete. } TComboBoxWithDelItems = class(TComboBox) protected procedure KeyDown(var Key: Word; Shift: TShiftState); override; end; procedure Register; implementation uses LCLType; procedure Register; begin RegisterComponents('KASComponents',[TComboBoxWithDelItems]); end; { TComboBoxWithDelItems } procedure TComboBoxWithDelItems.KeyDown(var Key: Word; Shift: TShiftState); var Index: Integer; begin if DroppedDown and (Key = VK_DELETE) and (Shift = [ssShift]) then begin Index := ItemIndex; if (Index >= 0) and (Index < Items.Count) then begin Items.Delete(Index); ItemIndex := Index; Key := 0; end; end; inherited KeyDown(Key, Shift); end; end. doublecmd-0.5.8/components/KASToolBar/kaspathedit.pas0000644000175000017500000002040112014201074021566 0ustar alexxalexx{ Double Commander Components ------------------------------------------------------------------------- Path edit class with auto complete feature Copyright (C) 2012 Alexander Koblov (alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License in a file called COPYING along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. } unit KASPathEdit; {$mode delphi} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, ShellCtrls, LCLType; type { TKASPathEdit } TKASPathEdit = class(TEdit) private FPanel: THintWindow; FListBox: TListBox; FKeyDown: Word; FAutoComplete: Boolean; FObjectTypes: TObjectTypes; FFileSortType: TFileSortType; private procedure AutoComplete(const Path: UTF8String); procedure SetObjectTypes(const AValue: TObjectTypes); procedure FormChangeBoundsEvent(Sender: TObject); procedure ListBoxClick(Sender: TObject); procedure ListBoxMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); private procedure ShowListBox; procedure HideListBox; protected {$IF DEFINED(LCLWIN32)} procedure CreateWnd; override; {$ENDIF} procedure DoExit; override; procedure KeyDown(var Key: Word; Shift: TShiftState); override; procedure KeyUpAfterInterface(var Key: Word; Shift: TShiftState); override; public constructor Create(AOwner: TComponent); override; published property ObjectTypes: TObjectTypes read FObjectTypes write SetObjectTypes; property FileSortType: TFileSortType read FFileSortType write FFileSortType; end; procedure Register; implementation uses LCLProc, Math {$IF DEFINED(LCLWIN32)} , ComObj {$ENDIF} ; {$IF DEFINED(LCLWIN32)} const SHACF_AUTOAPPEND_FORCE_ON = $40000000; SHACF_AUTOSUGGEST_FORCE_ON = $10000000; SHACF_FILESYS_ONLY = $00000010; SHACF_FILESYS_DIRS = $00000020; function SHAutoComplete(hwndEdit: HWND; dwFlags: DWORD): HRESULT; stdcall; external 'shlwapi.dll'; function SHAutoCompleteX(hwndEdit: HWND; ObjectTypes: TObjectTypes): Boolean; var dwFlags: DWORD; begin if (ObjectTypes = []) then Exit(False); dwFlags := SHACF_AUTOAPPEND_FORCE_ON or SHACF_AUTOSUGGEST_FORCE_ON; if (otNonFolders in ObjectTypes) then dwFlags := dwFlags or SHACF_FILESYS_ONLY else if (otFolders in ObjectTypes) then dwFlags := dwFlags or SHACF_FILESYS_DIRS; Result:= (SHAutoComplete(hwndEdit, dwFlags) = 0); end; {$ENDIF} procedure Register; begin RegisterComponents('KASComponents', [TKASPathEdit]); end; { TKASPathEdit } procedure TKASPathEdit.AutoComplete(const Path: UTF8String); var I: LongWord; BasePath: UTF8String; begin FListBox.Clear; if Pos(PathDelim, Path) > 0 then begin BasePath:= ExtractFilePath(Path); TCustomShellTreeView.GetFilesInDir( BasePath, ExtractFileName(Path) + '*', FObjectTypes, FListBox.Items, FFileSortType ); if (FListBox.Items.Count > 0) then begin ShowListBox; // Make absolute file name for I:= 0 to FListBox.Items.Count - 1 do FListBox.Items[I]:= BasePath + FListBox.Items[I]; // Calculate ListBox height with FListBox.ItemRect(0) do I:= Bottom - Top; // TListBox.ItemHeight sometimes don't work under GTK2 with FListBox do begin if Items.Count = 1 then FPanel.ClientHeight:= Self.Height else FPanel.ClientHeight:= I * IfThen(Items.Count > 10, 11, Items.Count + 1); end; end; end; if (FListBox.Items.Count = 0) then HideListBox; end; procedure TKASPathEdit.SetObjectTypes(const AValue: TObjectTypes); begin if FObjectTypes = AValue then Exit; FObjectTypes:= AValue; {$IF DEFINED(LCLWIN32)} if HandleAllocated then RecreateWnd(Self); if FAutoComplete then {$ENDIF} FAutoComplete:= (FObjectTypes <> []); end; procedure TKASPathEdit.FormChangeBoundsEvent(Sender: TObject); begin HideListBox; end; procedure TKASPathEdit.ListBoxClick(Sender: TObject); begin if FListBox.ItemIndex >= 0 then begin Text:= FListBox.Items[FListBox.ItemIndex]; SelStart:= UTF8Length(Text); HideListBox; SetFocus; end; end; procedure TKASPathEdit.ListBoxMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin FListBox.ItemIndex:= FListBox.ItemAtPos(Classes.Point(X, Y), True); end; procedure TKASPathEdit.ShowListBox; begin if (FPanel = nil) then begin FPanel:= THintWindow.Create(Self); FPanel.Color:= clForm; FListBox.Parent:= FPanel; with Parent.ClientToScreen(CLasses.Point(Left, Top)) do begin FPanel.Left:= X; FPanel.Top:= Y + Height; end; FPanel.Width:= Width; FPanel.Visible:= True; GetParentForm(Self).AddHandlerOnChangeBounds(FormChangeBoundsEvent, True); end; end; procedure TKASPathEdit.HideListBox; begin if (FPanel <> nil) then begin FPanel.Visible:= False; FListBox.Parent:= nil; FreeAndNil(FPanel); GetParentForm(Self).RemoveHandlerOnChangeBounds(FormChangeBoundsEvent); end; end; {$IF DEFINED(LCLWIN32)} procedure TKASPathEdit.CreateWnd; begin inherited CreateWnd; FAutoComplete:= not SHAutoCompleteX(Handle, FObjectTypes); end; {$ENDIF} procedure TKASPathEdit.DoExit; begin HideListBox; inherited DoExit; end; procedure TKASPathEdit.KeyDown(var Key: Word; Shift: TShiftState); begin FKeyDown:= Key; case Key of VK_ESCAPE, VK_RETURN, VK_SELECT: begin HideListBox; end; VK_UP: if Assigned(FPanel) then begin Key:= 0; if FListBox.ItemIndex = -1 then FListBox.ItemIndex:= FListBox.Items.Count - 1 else if FListBox.ItemIndex - 1 < 0 then FListBox.ItemIndex:= - 1 else FListBox.ItemIndex:= FListBox.ItemIndex - 1; if FListBox.ItemIndex >= 0 then Text:= FListBox.Items[FListBox.ItemIndex] else Text:= ExtractFilePath(Text); SelStart:= UTF8Length(Text); end; VK_DOWN: if Assigned(FPanel) then begin Key:= 0; if FListBox.ItemIndex + 1 >= FListBox.Items.Count then FListBox.ItemIndex:= -1 else if FListBox.ItemIndex = -1 then FListBox.ItemIndex:= IfThen(FListBox.Items.Count > 0, 0, -1) else FListBox.ItemIndex:= FListBox.ItemIndex + 1; if FListBox.ItemIndex >= 0 then Text:= FListBox.Items[FListBox.ItemIndex] else Text:= ExtractFilePath(Text); SelStart:= UTF8Length(Text); end; end; inherited KeyDown(Key, Shift); {$IFDEF LCLGTK2} // Workaround for GTK2 - up and down arrows moving through controls. if Key in [VK_UP, VK_DOWN] then Key:= 0; {$ENDIF} end; procedure TKASPathEdit.KeyUpAfterInterface(var Key: Word; Shift: TShiftState); begin if (FKeyDown = Key) and FAutoComplete and not (Key in [VK_ESCAPE, VK_RETURN, VK_SELECT, VK_UP, VK_DOWN]) then AutoComplete(Text); inherited KeyUpAfterInterface(Key, Shift); {$IF DEFINED(LCLWIN32)} // Windows auto-completer eats the TAB so LCL doesn't get it and doesn't move to next control. if not FAutoComplete and (Key = VK_TAB) then GetParentForm(Self).SelectNext(Self, True, True); {$ENDIF} end; constructor TKASPathEdit.Create(AOwner: TComponent); begin inherited Create(AOwner); FListBox:= TListBox.Create(Self); FListBox.TabStop:= False; FListBox.Align:= alClient; FListBox.ClickOnSelChange:= False; FListBox.OnClick:= ListBoxClick; FListBox.OnMouseMove:= ListBoxMouseMove; FAutoComplete:= True; FFileSortType:= fstFoldersFirst; FObjectTypes:= [otNonFolders, otFolders]; end; end. doublecmd-0.5.8/components/KASToolBar/kasbarfiles.pas0000644000175000017500000002554411462716745021616 0ustar alexxalexx{ File name: kasbarfiles.pas Author: Dmitry Kolomiets (B4rr4cuda@rambler.ru) Class working with *.bar files. Based on KASToolBar functions Copyright (C) 2006-2007 Koblov Alexander (Alexx2000@mail.ru) contributors: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License in a file called COPYING along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. } unit KASBarFiles; {$mode objfpc}{$H+} interface uses Classes, SysUtils,IniFiles; type //Button property's type //------------------------------------------------------ TInfor=(ButtonX, CmdX, ParamX, PathX, MenuX, IconicX, MiskX ); //------------------------------------------------------ //Class of button //--------------------------------- TKButton=class ButtonX:string; //Icon CmdX:string; //Command or path ParamX:string; //parameters PathX:string; MenuX:string; //Description IconicX:Integer; //-1 0 1 full default minimized ( as TC use) MiskX:string; //Aditional info (shortCut or extention or something else) end; //--------------------------------- { TBarClass } TBarClass=class CurrentBar:string; private XButtons:Tlist; FEnvVar : String; FChangePath : String; function GetButton(Index: Integer): TKButton; function GetButtonCount: Integer; function GetCmdDirFromEnvVar(sPath: String): String; function SetCmdDirAsEnvVar(sPath: String): String; procedure SetButton(Index:Integer; const AValue: TKButton); //------------------------------------------------------ public Constructor Create; destructor Destroy; override; //--------------------- function GetButtonX(Index:integer; What:TInfor):string; function InsertButtonX(InsertAt: Integer; ButtonX, CmdX, ParamX, PathX, MenuX, MiskX: String): Integer; function AddButtonX(ButtonX, CmdX, ParamX, PathX, MenuX, MiskX: String): Integer; //--------------------- procedure RemoveButton(Index: Integer); procedure DeleteAllButtons; procedure SetButtonX(Index:integer; What:Tinfor;Value: string); procedure LoadFromIniFile(IniFile : TIniFile); procedure SaveToIniFile(IniFile : TIniFile); procedure LoadFromFile(FileName : String); procedure LoadFromStringList(List:TStringList); procedure SaveToFile(FileName : String); //--------------------- property ButtonCount: Integer read GetButtonCount; property Buttons[Index:Integer]: TKButton read GetButton write SetButton; property EnvVar : String read FEnvVar write FEnvVar; property ChangePath : String read FChangePath write FChangePath; //------------------------------------------------------ end; implementation { TBarClass } constructor TBarClass.Create; begin XButtons:=TList.Create; end; destructor TBarClass.Destroy; var i:integer; begin if Assigned(XButtons) then begin if XButtons.Count>0 then for I := 0 to XButtons.Count - 1 do TKButton(XButtons.Items[I]).Free; FreeAndNil(XButtons); end; inherited Destroy; end; procedure TBarClass.SetButtonX(Index: integer; What: Tinfor; Value: string); begin If Index>=XButtons.Count then XButtons.Add(TKButton.Create); case What of ButtonX: TKButton(XButtons.Items[Index]).ButtonX:=Value; cmdX: TKButton(XButtons.Items[Index]).cmdX:=Value; paramX: TKButton(XButtons.Items[Index]).paramX:=Value; pathX: TKButton(XButtons.Items[Index]).pathX:=Value; MenuX: TKButton(XButtons.Items[Index]).menuX:=Value; iconicX: begin if Value='' then TKButton(XButtons.Items[Index]).iconicX:=0 else TKButton(XButtons.Items[Index]).iconicX:=StrToInt(Value); end; MiskX: TKButton(XButtons.Items[Index]).MiskX:=Value; end; end; procedure TBarClass.LoadFromIniFile(IniFile: TIniFile); var BtnCount, I : Integer; begin BtnCount := IniFile.ReadInteger('Buttonbar', 'Buttoncount', 0); CurrentBar:= IniFile.FileName; for I := 1 to BtnCount do begin XButtons.Add(TKButton.Create); TKButton(XButtons[I-1]).ButtonX :=IniFile.ReadString('Buttonbar', 'button' + IntToStr(I), ''); TKButton(XButtons[I-1]).CmdX := IniFile.ReadString('Buttonbar', 'cmd' + IntToStr(I), ''); TKButton(XButtons[I-1]).ParamX := IniFile.ReadString('Buttonbar', 'param' + IntToStr(I), ''); TKButton(XButtons[I-1]).PathX := IniFile.ReadString('Buttonbar', 'path' + IntToStr(I), ''); TKButton(XButtons[I-1]).MenuX := IniFile.ReadString('Buttonbar', 'menu' + IntToStr(I), ''); TKButton(XButtons[I-1]).IconicX := IniFile.ReadInteger('Buttonbar', 'icon' + IntToStr(I),0); TKButton(XButtons[I-1]).MiskX := IniFile.ReadString('Buttonbar', 'misk' + IntToStr(I), ''); end; end; procedure TBarClass.SaveToIniFile(IniFile: TIniFile); var I : Integer; begin //For cleaning. Without this saved file will contain removed buttons IniFile.EraseSection('Buttonbar'); IniFile.WriteInteger('Buttonbar', 'Buttoncount', XButtons.Count); for I := 0 to XButtons.Count - 1 do begin IniFile.WriteString('Buttonbar', 'button' + IntToStr(I + 1), SetCmdDirAsEnvVar(GetButtonX(I,ButtonX))); IniFile.WriteString('Buttonbar', 'cmd' + IntToStr(I + 1), SetCmdDirAsEnvVar(GetButtonX(I,CmdX))); IniFile.WriteString('Buttonbar', 'param' + IntToStr(I + 1), GetButtonX(I,ParamX) ); IniFile.WriteString('Buttonbar', 'path' + IntToStr(I + 1), GetButtonX(I,PathX) ); IniFile.WriteString('Buttonbar', 'menu' + IntToStr(I + 1),GetButtonX(I,MenuX) ); IniFile.WriteString('Buttonbar', 'misk' + IntToStr(I + 1),GetButtonX(I,MiskX) ); end; end; function TBarClass.GetButtonX(Index: integer; What: TInfor): string; begin if (index>=XButtons.Count) or (Index<0) then Exit; case What of ButtonX: Result := TKButton(XButtons.Items[Index]).ButtonX; cmdX: Result := TKButton(XButtons.Items[Index]).CmdX; paramX: Result := TKButton(XButtons.Items[Index]).ParamX; pathX: Result := TKButton(XButtons.Items[Index]).PathX; menuX: Result := TKButton(XButtons.Items[Index]).MenuX; iconicX: Result := IntToStr(TKButton(XButtons.Items[Index]).IconicX); MiskX: Result := TKButton(XButtons.Items[Index]).MiskX; end; end; function TBarClass.InsertButtonX(InsertAt: Integer; ButtonX, CmdX, ParamX, PathX, MenuX, MiskX: String): Integer; begin if InsertAt < 0 then InsertAt:= 0; if InsertAt > XButtons.Count then InsertAt:= XButtons.Count; XButtons.Insert(InsertAt, TKButton.Create); TKButton(XButtons[InsertAt]).CmdX:= CmdX; TKButton(XButtons[InsertAt]).ButtonX:= ButtonX; TKButton(XButtons[InsertAt]).ParamX:= ParamX; TKButton(XButtons[InsertAt]).PathX:= PathX; TKButton(XButtons[InsertAt]).MenuX:= MenuX; TKButton(XButtons[InsertAt]).MiskX:= MiskX; Result:= InsertAt; end; function TBarClass.AddButtonX(ButtonX, CmdX, ParamX, PathX, MenuX, MiskX: String): Integer; begin Result := InsertButtonX(XButtons.Count, ButtonX, CmdX, ParamX, PathX, MenuX, MiskX); end; procedure TBarClass.LoadFromFile(FileName: String); var IniFile : Tinifile; begin DeleteAllButtons; IniFile := Tinifile.Create(FileName); LoadFromIniFile(IniFile); IniFile.Free; end; procedure TBarClass.LoadFromStringList(List: TStringList); function ItemOfList(Item:string):string; begin if (List.IndexOfName(Item)>0) then Result:=List.ValueFromIndex[List.IndexOfName(Item)] else Result:=''; end; var BtnCount, I : Integer; begin DeleteAllButtons; if (List.IndexOfName('Buttoncount')<>0) then exit; BtnCount:=StrToInt(List.ValueFromIndex[List.IndexOfName('Buttoncount')]); CurrentBar:='Virtual'; for I := 1 to BtnCount do begin XButtons.Add(TKButton.Create); TKButton(XButtons[I-1]).ButtonX :=ItemOfList('button' + IntToStr(I)); TKButton(XButtons[I-1]).CmdX := ItemOfList('cmd' + IntToStr(I)); TKButton(XButtons[I-1]).ParamX :=ItemOfList('param' + IntToStr(I)); TKButton(XButtons[I-1]).PathX := ItemOfList('path' + IntToStr(I)); TKButton(XButtons[I-1]).MenuX := ItemOfList('menu' + IntToStr(I)); if (ItemOfList('icon' + IntToStr(I))<>'') then TKButton(XButtons[I-1]).IconicX := StrToInt(ItemOfList('icon' + IntToStr(I))); TKButton(XButtons[I-1]).MiskX := ItemOfList('misk' + IntToStr(I)); end; end; procedure TBarClass.SaveToFile(FileName: String); var IniFile : Tinifile; begin IniFile := Tinifile.Create(FileName); SaveToIniFile(IniFile); IniFile.Free; end; procedure TBarClass.RemoveButton(Index: Integer); begin TKButton(XButtons[Index]).Free; XButtons.Delete(Index); end; procedure TBarClass.DeleteAllButtons; begin while XButtons.Count>0 do begin TKButton(XButtons[0]).Free; XButtons.Delete(0); end; end; function TBarClass.GetButtonCount: Integer; begin Result := XButtons.Count; end; function TBarClass.GetButton(Index:Integer): TKButton; begin Result:=TKButton(XButtons[Index]); end; function TBarClass.GetCmdDirFromEnvVar(sPath: String): String; begin DoDirSeparators(sPath); if Pos(FEnvVar, sPath) <> 0 then Result := StringReplace(sPath, FEnvVar, ExcludeTrailingPathDelimiter(FChangePath), [rfIgnoreCase]) else Result := sPath; end; procedure TBarClass.SetButton(Index:Integer; const AValue: TKButton); begin XButtons[Index]:=AValue; end; function TBarClass.SetCmdDirAsEnvVar(sPath: String): String; begin DoDirSeparators(sPath); if Pos(FChangePath, sPath) <> 0 then Result := StringReplace(sPath, ExcludeTrailingPathDelimiter(FChangePath), FEnvVar, [rfIgnoreCase]) else Result := sPath; end; end. doublecmd-0.5.8/components/KASToolBar/kasbarmenu.pas0000644000175000017500000001231712014201074021424 0ustar alexxalexx{ File name: kasbarmenu.pas KASBarMenu Copyright (C) 2008 Dmitry Kolomiets (B4rr4cuda@rambler.ru) Popup menu with *.bar's buttons as MenuItems Based on KASToolBar functions Copyright (C) 2006-2007 Koblov Alexander (Alexx2000@mail.ru) contributors: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License in a file called COPYING along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. } unit KASBarMenu; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Menus, KASBarFiles, FileUtil, IniFiles; type TOnLoadButtonGlyph = function (sIconFileName : String; iIconSize : Integer; clBackColor : TColor) : TBitmap of object; TOnMenuButtonClick = procedure (Sender: TObject; NumberOfButton : Integer) of object; { TKASBarMenu } TKASBarMenu = class(TPopupMenu) private FBar:TBarClass; FOnLoadButtonGlyph : TOnLoadButtonGlyph; FOnMenuButtonClick : TOnMenuButtonClick; //------------------------------------------------------ procedure MenuOnClick(Sender: TObject); function LoadBtnIcon(IconPath: String): TBitMap; //------------------------------------------------------ protected public constructor Create(TheOwner: TComponent); override; destructor Destroy; override; //--------------------- procedure Clear; procedure LoadFromStringList(List: TStringList); procedure LoadFromIniFile(IniFile : TIniFile); procedure SaveToIniFile(IniFile : TIniFile); procedure LoadBarFile(FileName:string); procedure SaveToFile(FileName : String); procedure MakeMenu; //------------------------------------------------------ published property BarFile: TBarClass read FBar write FBar; property OnLoadButtonGlyph : TOnLoadButtonGlyph read FOnLoadButtonGlyph write FOnLoadButtonGlyph; property OnMenuButtonClick: TOnMenuButtonClick read FOnMenuButtonClick write FOnMenuButtonClick; //------------------------------------------------------ end; procedure Register; implementation procedure Register; begin RegisterComponents('KASComponents',[TKASBarMenu]); end; { TKASBarMenu } function TKASBarMenu.LoadBtnIcon(IconPath: String): TBitMap; var PNG : TPortableNetworkGraphic; begin Result := Graphics.TBitmap.Create; if (IconPath <> '') and FileExists(IconPath) then begin if CompareFileExt(IconPath, 'png', false) = 0 then begin PNG := TPortableNetworkGraphic.Create; try PNG.LoadFromFile(IconPath); Result.Assign(PNG); finally FreeAndNil(PNG); end; end else begin Result.LoadFromFile(IconPath); end; end; end; procedure TKASBarMenu.MenuOnClick(Sender: TObject); begin if Assigned(FOnMenuButtonClick) then FOnMenuButtonClick(Self, (Sender as TMenuItem).Tag); end; constructor TKASBarMenu.Create(TheOwner: TComponent); begin FBar:=TBarClass.Create; inherited Create(TheOwner); end; destructor TKASBarMenu.Destroy; begin FBar.DeleteAllButtons; FreeAndNil(FBar); inherited Destroy; end; procedure TKASBarMenu.Clear; begin FBar.DeleteAllButtons; end; procedure TKASBarMenu.MakeMenu; var I:Integer; Item:TMenuItem; BitmapTmp: TBitmap; begin For I:=0 to Fbar.ButtonCount-1 do begin Item:=TMenuItem.Create(Self); if Fbar.GetButtonX(I,MiskX) <> '' then Item.Caption:=Fbar.GetButtonX(I,MenuX)+' ('+Fbar.GetButtonX(I,MiskX)+')' else Item.Caption:=Fbar.GetButtonX(I,MenuX); //------------------------------------------------------ if Assigned(FOnLoadButtonGlyph) then BitmapTmp := FOnLoadButtonGlyph(FBar.GetButtonX(I,ButtonX), 16, clMenu) else BitmapTmp := LoadBtnIcon(FBar.GetButtonX(I,ButtonX)); Item.Bitmap := BitmapTmp; if Assigned(BitmapTmp) then FreeAndNil(BitmapTmp); //------------------------------------------------------ Item.Tag:=I; Item.OnClick:=TNotifyEvent(@MenuOnClick); Self.Items.Insert(I,Item); end; end; procedure TKASBarMenu.LoadBarFile(FileName: string); begin FBar.DeleteAllButtons; Self.Items.Clear; FBar.LoadFromFile(FileName); MakeMenu; end; procedure TKASBarMenu.LoadFromStringList(List: TStringList); begin FBar.DeleteAllButtons; Self.Items.Clear; FBar.LoadFromStringList(List); MakeMenu; end; procedure TKASBarMenu.LoadFromIniFile(IniFile: TIniFile); begin FBar.DeleteAllButtons; Self.Items.Clear; FBar.LoadFromIniFile(IniFile); MakeMenu; end; procedure TKASBarMenu.SaveToIniFile(IniFile: TIniFile); begin FBar.SaveToIniFile(IniFile); end; procedure TKASBarMenu.SaveToFile(FileName: String); begin FBar.SaveToFile(FileName); end; end. doublecmd-0.5.8/components/KASToolBar/kascomp.lpk0000644000175000017500000000440112154651644020750 0ustar alexxalexx doublecmd-0.5.8/components/ZVDateTimeCtrls/0000755000175000017500000000000012257501472017664 5ustar alexxalexxdoublecmd-0.5.8/components/ZVDateTimeCtrls/dbzvdatetimepicker.pas0000644000175000017500000001520212014201074024233 0ustar alexxalexx{ TDBZVDateTimePicker control for Lazarus - - - - - - - - - - - - - - - - - - - - Author: Zoran Vučenović, January and February 2010 Зоран Вученовић, јануар и фебруар 2010. Last change: April 2011 This unit is part of ZVDateTimeCtrls package for Lazarus. TDBZVDateTimePicker is data-aware version of TZVDateTimePicker control. ----------------------------------------------------------- LICENCE - - - - Modified LGPL -- see COPYING.TXT. ----------------------------------------------------------- NO WARRANTY - - - - - - There is no warranty whatsoever. ----------------------------------------------------------- BEST REGARDS TO LAZARUS COMMUNITY! - - - - - - - - - - - - - - - - - - I do hope this control will be useful. } unit DBZVDateTimePicker; {$mode objfpc}{$H+} interface uses Classes, SysUtils, ZVDateTimePicker, db, DBCtrls; type { TDBZVDateTimePicker } TDBZVDateTimePicker = class(TCustomZVDateTimePicker) private { Private declarations } FDataLink: TFieldDataLink; FReadOnly: Boolean; FDataChanging: Boolean; function GetDataField: string; function GetDataSource: TDataSource; procedure SetDataField(const AValue: string); procedure SetDataSource(const AValue: TDataSource); procedure DataChange(Sender: TObject); procedure SetReadOnly(const AValue: Boolean); procedure UpdateData(Sender: TObject); procedure ActiveChange(Sender: TObject); function GetField: TField; procedure CheckField; protected { Protected declarations } procedure Change; override; public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; property Field: TField read GetField; procedure EditingDone; override; published { Published declarations } property DataField: string read GetDataField write SetDataField; property DataSource: TDataSource read GetDataSource write SetDataSource; property ReadOnly: Boolean read FReadOnly write SetReadOnly; property ArrowShape; property ShowCheckBox; property Checked; property CenturyFrom; property DateDisplayOrder; property MaxDate; property MinDate; property AutoSize; property Font; property ParentFont; property TabOrder; property TabStop; property BorderStyle; property BorderSpacing; property Enabled; property Color; property ParentColor; property DateSeparator; property TrailingSeparator; property TextForNullDate; property LeadingZeros; property ShowHint; property ParentShowHint; property Align; property Anchors; property Constraints; property Cursor; property PopupMenu; property Visible; property NullInputAllowed; property Kind; property TimeSeparator; property TimeFormat; property TimeDisplay; { property Time; This property should NOT be published here, it was accidentally added in first release. } property DateMode; property UseDefaultSeparators; //events: property OnChange; property OnDropDown; property OnCloseUp; property OnChangeBounds; property OnClick; property OnContextPopup; property OnDblClick; property OnEditingDone; property OnEnter; property OnExit; property OnKeyDown; property OnKeyPress; property OnKeyUp; property OnMouseDown; property OnMouseEnter; property OnMouseMove; property OnMouseUp; property OnMouseLeave; property OnResize; property OnUTF8KeyPress; end; implementation { TDBZVDateTimePicker } function TDBZVDateTimePicker.GetDataField: string; begin Result := FDataLink.FieldName; end; function TDBZVDateTimePicker.GetDataSource: TDataSource; begin Result := FDataLink.DataSource; end; procedure TDBZVDateTimePicker.SetDataField(const AValue: string); begin FDataLink.FieldName := AValue; CheckField; end; procedure TDBZVDateTimePicker.SetDataSource(const AValue: TDataSource); begin ChangeDataSource(Self, FDataLink, AValue); CheckField; end; procedure TDBZVDateTimePicker.DataChange(Sender: TObject); begin FDataChanging := True; try if Assigned(FDataLink.Field) then begin if FDataLink.Field.IsNull then begin DateTime := NullDate; end else begin // Using the SetTheDateJumpMinMax procedure, instead of property SetDateTimeJumpMinMax(FDataLink.Field.AsDateTime); // assignment allows // this control to display dates from database whose value falls // outside of MinDate and MaxDate interval. // Note that user still cannot enter such values in the control. end; end else begin DateTime := NullDate; end; finally FDataChanging := False; end; end; procedure TDBZVDateTimePicker.SetReadOnly(const AValue: Boolean); begin if FReadOnly <> AValue then begin FReadOnly := AValue; CheckField; end; end; procedure TDBZVDateTimePicker.UpdateData(Sender: TObject); begin if Assigned(FDataLink.Field) then begin if DateIsNull then FDataLink.Field.AsVariant := Null else FDataLink.Field.AsDateTime := DateTime; end; end; procedure TDBZVDateTimePicker.ActiveChange(Sender: TObject); begin CheckField; end; function TDBZVDateTimePicker.GetField: TField; begin Result := FDataLink.Field; end; procedure TDBZVDateTimePicker.CheckField; var FieldOK: Boolean; begin FieldOK := (FDataLink.Active) and Assigned(FDataLink.Field); if FieldOK then inherited ReadOnly := FReadOnly or (not FDataLink.CanModify) else begin inherited ReadOnly := True; DateTime := NullDate; end; end; procedure TDBZVDateTimePicker.Change; begin if (not FDataChanging) and Assigned(FDataLink) then begin if FDataLink.Edit then begin FDataLink.Modified; inherited Change; // calls OnChange event handler end else FDataLink.Reset; // reverts user changes end; end; constructor TDBZVDateTimePicker.Create(AOwner: TComponent); begin inherited Create(AOwner); FDataChanging := False; FDataLink := TFieldDataLink.Create; FDataLink.Control := Self; DateTime := NullDate; FDataLink.OnActiveChange := @ActiveChange; FDataLink.OnDataChange := @DataChange; FDataLink.OnUpdateData := @UpdateData; CheckField; end; destructor TDBZVDateTimePicker.Destroy; begin FDataLink.OnUpdateData := nil; FDataLink.OnDataChange := nil; FDataLink.OnActiveChange := nil; FreeAndNil(FDataLink); inherited Destroy; end; procedure TDBZVDateTimePicker.EditingDone; begin inherited EditingDone; if Assigned(FDataLink) then try FDataLink.UpdateRecord; except SetFocus; raise; end; end; end. doublecmd-0.5.8/components/ZVDateTimeCtrls/zvdatetimectrls.lpk0000644000175000017500000000464512154651644023634 0ustar alexxalexx doublecmd-0.5.8/components/ZVDateTimeCtrls/zvdatetimepickerpropedit.pas0000644000175000017500000003472312014201074025505 0ustar alexxalexx{ ZVDateTimePickerPropEdit - - - - - - - - - - - - - - - - - Author: Zoran Vučenović, January and February 2010 Зоран Вученовић, јануар и фебруар 2010. Last change: April 2011 This unit is part of ZVDateTimeCtrls package for Lazarus. It contains component and property editors for TZVDateTimePicker control. ----------------------------------------------------------- LICENCE - - - - Modified LGPL -- see COPYING.TXT. ----------------------------------------------------------- NO WARRANTY - - - - - - There is no warranty whatsoever. ----------------------------------------------------------- BEST REGARDS TO LAZARUS COMMUNITY! - - - - - - - - - - - - - - - - - - I do hope the ZVDateTimeCtrls package will be useful. } unit ZVDateTimePickerPropEdit; {$mode objfpc}{$H+} interface // Nothing needs to be in interface section! implementation uses Classes, SysUtils, Forms, Controls, ButtonPanel, ZVDateTimePicker, DBZVDateTimePicker, StdCtrls, Math, Menus, ComponentEditors, PropEdits; type { TFormZVDateTimePickerEditor } TFormZVDateTimePickerEditor = class(TForm) private CallerZVDateTimePicker: TZVDateTimePicker; Prop: String; Modified: Boolean; ButtonPanel: TButtonPanel; ZVDateTimePickerMin: TZVDateTimePicker; ZVDateTimePicker1: TZVDateTimePicker; ZVDateTimePickerMax: TZVDateTimePicker; Label1: TLabel; LabelMin: TLabel; LabelMax: TLabel; LabelNull: TLabel; procedure ZVDateTimePickerMaxExit(Sender: TObject); procedure ZVDateTimePickerMinExit(Sender: TObject); procedure ZVDateTimePickersChange(Sender: TObject); procedure ZVDateTimePicker1Enter(Sender: TObject); procedure ZVDateTimePicker1Exit(Sender: TObject); procedure FormActivate(Sender: TObject); procedure Initialize(const Caller: TZVDateTimePicker; const PropertyName, PropertyType: String); procedure UpdateMinMaxBounds; public constructor CreateNew(AOwner: TComponent; Num: Integer = 0); override; destructor Destroy; override; end; { TZVDateTimePickerComponentEditor } TZVDateTimePickerComponentEditor = class(TComponentEditor) public procedure ExecuteVerb(Index: Integer); override; function GetVerb(Index: Integer): string; override; function GetVerbCount: Integer; override; end; { TZVDateTimePickerDateTimePropEditor } TZVDateTimePickerDateTimePropEditor = class(TDateTimePropertyEditor) public function GetAttributes: TPropertyAttributes; override; function AllEqual: Boolean; override; function GetValue: string; override; procedure SetValue(const Value: string); override; procedure Edit; override; end; { TSimpleDatePropEditor } TSimpleDatePropEditor = class(TDatePropertyEditor) public function GetValue: string; override; procedure SetValue(const Value: string); override; end; procedure RegPropEdits; begin RegisterPropertyEditor(TypeInfo(TTime), TZVDateTimePicker, 'Time', TZVDateTimePickerDateTimePropEditor); RegisterPropertyEditor(TypeInfo(TDate), TZVDateTimePicker, 'Date', TZVDateTimePickerDateTimePropEditor); RegisterPropertyEditor(TypeInfo(TDate), TZVDateTimePicker, 'MaxDate', TZVDateTimePickerDateTimePropEditor); RegisterPropertyEditor(TypeInfo(TDate), TZVDateTimePicker, 'MinDate', TZVDateTimePickerDateTimePropEditor); RegisterPropertyEditor(TypeInfo(TDate), TDBZVDateTimePicker, 'MaxDate', TSimpleDatePropEditor); RegisterPropertyEditor(TypeInfo(TDate), TDBZVDateTimePicker, 'MinDate', TSimpleDatePropEditor); end; { TZVDateTimePickerComponentEditor } procedure TZVDateTimePickerComponentEditor.ExecuteVerb(Index: Integer); var F: TFormZVDateTimePickerEditor; DTPicker: TZVDateTimePicker; begin if Index = 0 then begin if GetComponent is TZVDateTimePicker then begin F := TFormZVDateTimePickerEditor.CreateNew(nil, 0); try DTPicker := TZVDateTimePicker(GetComponent); if DTPicker.Kind = dtkTime then F.Initialize(DTPicker, '', 'TTime') else F.Initialize(DTPicker, '', ''); if F.ShowModal = mrOK then begin if F.Modified then begin DTPicker.MinDate := TheSmallestDate; DTPicker.MaxDate := F.ZVDateTimePickerMax.DateTime; DTPicker.MinDate := F.ZVDateTimePickerMin.DateTime; DTPicker.DateTime := F.ZVDateTimePicker1.DateTime; Modified; GlobalDesignHook.RefreshPropertyValues; end; end; finally F.Free; end; end else raise Exception.Create('Unknown ZVDateTimePicker object to edit.'); end; end; function TZVDateTimePickerComponentEditor.GetVerb(Index: Integer): string; begin if Index = 0 then Result := '&Date/Time Editor...'; end; function TZVDateTimePickerComponentEditor.GetVerbCount: Integer; begin Result := 1; end; { TFormZVDateTimePickerEditor } procedure TFormZVDateTimePickerEditor.ZVDateTimePickerMaxExit(Sender: TObject); begin if ZVDateTimePickerMin.Date > ZVDateTimePickerMax.Date then ZVDateTimePickerMin.Date := ZVDateTimePickerMax.Date; UpdateMinMaxBounds; end; procedure TFormZVDateTimePickerEditor.ZVDateTimePickerMinExit(Sender: TObject); begin if ZVDateTimePickerMax.Date < ZVDateTimePickerMin.Date then ZVDateTimePickerMax.Date := ZVDateTimePickerMin.Date; UpdateMinMaxBounds; end; procedure TFormZVDateTimePickerEditor.ZVDateTimePickersChange(Sender: TObject); begin Modified := True; end; procedure TFormZVDateTimePickerEditor.ZVDateTimePicker1Enter(Sender: TObject); begin if ZVDateTimePicker1.NullInputAllowed then LabelNull.Show; end; procedure TFormZVDateTimePickerEditor.ZVDateTimePicker1Exit(Sender: TObject); begin LabelNull.Hide; end; procedure TFormZVDateTimePickerEditor.FormActivate(Sender: TObject); var B: Boolean; begin OnActivate := nil; B := False; if Prop = 'MAXDATE' then ZVDateTimePickerMax.SetFocus else if Prop = 'MINDATE' then ZVDateTimePickerMin.SetFocus else begin ZVDateTimePicker1.SetFocus; B := ZVDateTimePicker1.NullInputAllowed; end; LabelNull.Visible := B; LabelNull.BringToFront; end; procedure TFormZVDateTimePickerEditor.Initialize(const Caller: TZVDateTimePicker; const PropertyName, PropertyType: String); var I: Integer; DTP: array[1..3] of TZVDateTimePicker; L, T, W, H: Integer; R: TRect; begin if Assigned(Caller) then begin CallerZVDateTimePicker := Caller; Prop := UpperCase(PropertyName); Modified := False; ZVDateTimePicker1.Kind := dtkDateTime; if UpperCase(PropertyType) = 'TTIME' then ZVDateTimePicker1.SelectTime else ZVDateTimePicker1.SelectDate; Label1.Caption := 'Date / Time:'; LabelMax.Caption := 'MaxDate:'; LabelMin.Caption := 'MinDate:'; LabelNull.Caption := '(Press N to set to NULL)'; ZVDateTimePickerMin.DateTime := CallerZVDateTimePicker.MinDate; ZVDateTimePickerMax.DateTime := CallerZVDateTimePicker.MaxDate; ZVDateTimePicker1.MinDate := CallerZVDateTimePicker.MinDate; ZVDateTimePicker1.MaxDate := CallerZVDateTimePicker.MaxDate; ZVDateTimePicker1.DateTime := CallerZVDateTimePicker.DateTime; DTP[1] := ZVDateTimePickerMin; DTP[2] := ZVDateTimePickerMax; DTP[3] := ZVDateTimePicker1; for I := 1 to 3 do begin DTP[I].NullInputAllowed := I = 3; DTP[I].CenturyFrom := CallerZVDateTimePicker.CenturyFrom; DTP[I].DateDisplayOrder := CallerZVDateTimePicker.DateDisplayOrder; DTP[I].LeadingZeros := CallerZVDateTimePicker.LeadingZeros; DTP[I].DateSeparator := CallerZVDateTimePicker.DateSeparator; DTP[I].TrailingSeparator := CallerZVDateTimePicker.TrailingSeparator; end; ZVDateTimePicker1.TextForNullDate := CallerZVDateTimePicker.TextForNullDate; ZVDateTimePicker1.TimeSeparator := CallerZVDateTimePicker.TimeSeparator; ZVDateTimePicker1.TimeDisplay := tdHMSMs; ZVDateTimePicker1.TimeFormat := CallerZVDateTimePicker.TimeFormat; ZVDateTimePickerMax.AnchorParallel(akTop, 20, Self); ZVDateTimePickerMax.AnchorParallel(akRight, 20, Self); LabelMax.AnchorVerticalCenterTo(ZVDateTimePickerMax); LabelMax.AnchorToNeighbour(akRight, 2, ZVDateTimePickerMax); ZVDateTimePickerMin.AnchorParallel(akTop, 20, Self); ZVDateTimePickerMin.AnchorToNeighbour(akRight, 20, LabelMax); LabelMin.AnchorToNeighbour(akRight, 2, ZVDateTimePickerMin); LabelMin.AnchorVerticalCenterTo(ZVDateTimePickerMin); ZVDateTimePicker1.AnchorParallel(akLeft, 0, ZVDateTimePickerMin); ZVDateTimePicker1.AnchorToNeighbour(akTop, 20, ZVDateTimePickerMin); Label1.AnchorToNeighbour(akRight, 2, ZVDateTimePicker1); Label1.AnchorVerticalCenterTo(ZVDateTimePicker1); LabelNull.AnchorToNeighbour(akTop, 2, ZVDateTimePicker1); LabelNull.AnchorHorizontalCenterTo(ZVDateTimePicker1); ButtonPanel.Spacing := 10; ButtonPanel.BorderSpacing.Around := 10; W := Max(Label1.Width, LabelMin.Width); W := ZVDateTimePickerMax.Width + ZVDateTimePickerMin.Width + LabelMax.Width + W + 80; H := 2 * ZVDateTimePickerMax.Height + LabelNull.Height + ButtonPanel.Height + 58; R := Screen.MonitorFromWindow(CallerZVDateTimePicker.Handle).WorkareaRect; L := (R.Left + R.Right - W) div 2; T := (R.Top + R.Bottom - H) div 2; if L < R.Left then L := R.Left; if T < R.Top then T := R.Top; SetBounds(L, T, W, H); end; end; procedure TFormZVDateTimePickerEditor.UpdateMinMaxBounds; begin ZVDateTimePicker1.MinDate := TheSmallestDate; ZVDateTimePicker1.MaxDate := ZVDateTimePickerMax.Date; ZVDateTimePicker1.MinDate := ZVDateTimePickerMin.Date; end; constructor TFormZVDateTimePickerEditor.CreateNew(AOwner: TComponent; Num: Integer); var I: Integer; begin inherited CreateNew(AOwner, Num); Hide; if Font.Size > 10 then Font.Size := 10; SetBounds(-8000, -8000, 4, 5); BorderStyle := bsDialog; BorderIcons := [biSystemMenu]; Caption := 'ZVDateTimePicker Editor'; ZVDateTimePickerMax := TZVDateTimePicker.Create(Self); ZVDateTimePickerMin := TZVDateTimePicker.Create(Self); ZVDateTimePicker1 := TZVDateTimePicker.Create(Self); Label1 := TLabel.Create(Self); LabelMin := TLabel.Create(Self); LabelMax := TLabel.Create(Self); LabelNull := TLabel.Create(Self); ButtonPanel := TButtonPanel.Create(Self); ButtonPanel.ShowButtons := [pbOK, pbCancel]; ButtonPanel.OKButton.GlyphShowMode := gsmAlways; ButtonPanel.CancelButton.GlyphShowMode := gsmAlways; ButtonPanel.ShowBevel := False; ZVDateTimePickerMax.Parent := Self; ZVDateTimePickerMin.Parent := Self; ZVDateTimePicker1.Parent := Self; Label1.Parent := Self; LabelMin.Parent := Self; LabelMax.Parent := Self; LabelNull.Parent := Self; ButtonPanel.Parent := Self; ButtonPanel.TabOrder := 0; ZVDateTimePickerMin.TabOrder := 1; ZVDateTimePickerMax.TabOrder := 2; ZVDateTimePicker1.TabOrder := 3; for I := 0 to ControlCount - 1 do begin Controls[I].Anchors := []; Controls[I].AutoSize := True; end; ZVDateTimePickerMax.OnExit := @ZVDateTimePickerMaxExit; ZVDateTimePickerMin.OnExit := @ZVDateTimePickerMinExit; ZVDateTimePicker1.OnExit := @ZVDateTimePicker1Exit; ZVDateTimePicker1.OnEnter := @ZVDateTimePicker1Enter; ZVDateTimePickerMin.OnChange := @ZVDateTimePickersChange; ZVDateTimePickerMax.OnChange := @ZVDateTimePickersChange; ZVDateTimePicker1.OnChange := @ZVDateTimePickersChange; OnActivate := @FormActivate; end; destructor TFormZVDateTimePickerEditor.Destroy; begin OnActivate := nil; OnShow := nil; ZVDateTimePicker1.OnChange := nil; ZVDateTimePickerMax.OnChange := nil; ZVDateTimePickerMin.OnChange := nil; ZVDateTimePicker1.OnEnter := nil; ZVDateTimePicker1.OnExit := nil; ZVDateTimePickerMin.OnExit := nil; ZVDateTimePickerMax.OnExit := nil; ButtonPanel.Free; LabelNull.Free; LabelMax.Free; LabelMin.Free; Label1.Free; ZVDateTimePicker1.Free; ZVDateTimePickerMin.Free; ZVDateTimePickerMax.Free; inherited Destroy; end; { TZVDateTimePickerDateTimePropEditor } function TZVDateTimePickerDateTimePropEditor.GetAttributes: TPropertyAttributes; begin Result := inherited GetAttributes + [paDialog]; end; function TZVDateTimePickerDateTimePropEditor.AllEqual: Boolean; var DT: TDateTime; N: Integer; begin Result := True; N := PropCount; if N > 1 then begin DT := TDateTime(GetFloatValue); repeat Dec(N); Result := EqualDateTime(DT, TDateTime(GetFloatValueAt(N))); until not(Result and (N > 1)); end; end; function TZVDateTimePickerDateTimePropEditor.GetValue: string; var DT: TDateTime; S: String; begin DT := TDateTime(GetFloatValue); if IsNullDate(DT) then Result := 'NULL' else begin S := UpperCase(GetPropType^.Name); if S = 'TDATE' then Result := DateToStr(DT) else if S = 'TTIME' then Result := TimeToStr(DT) else Result := DateTimeToStr(DT); end; end; procedure TZVDateTimePickerDateTimePropEditor.SetValue(const Value: string); var S: String; begin S := Trim(Value); if (S > '') and (UpCase(S[1]) <> 'N') then begin S := UpperCase(GetPropType^.Name); if S = 'TDATE' then SetFloatValue(StrToDate(Value)) else if S = 'TTIME' then SetFloatValue(StrToTime(Value)) else inherited SetValue(Value); end else SetFloatValue(NullDate); end; procedure TZVDateTimePickerDateTimePropEditor.Edit; var F: TFormZVDateTimePickerEditor; I: Integer; DT: TZVDateTimePicker; begin for I := 0 to PropCount - 1 do if not (GetComponent(I) is TZVDateTimePicker) then Exit; F := TFormZVDateTimePickerEditor.CreateNew(nil, 0); try F.Initialize(TZVDateTimePicker(GetComponent(0)), GetName, GetPropType^.Name); if F.ShowModal = mrOK then begin if F.Modified then begin for I := 0 to PropCount - 1 do begin DT := TZVDateTimePicker(GetComponent(I)); DT.MinDate := TheSmallestDate; DT.MaxDate := F.ZVDateTimePickerMax.Date; DT.MinDate := F.ZVDateTimePickerMin.Date; DT.DateTime := F.ZVDateTimePicker1.DateTime; end; Modified; GlobalDesignHook.RefreshPropertyValues; end; end; finally F.Free; end; end; { TSimpleDatePropEditor } function TSimpleDatePropEditor.GetValue: string; begin Result := DateToStr(GetFloatValue); end; procedure TSimpleDatePropEditor.SetValue(const Value: string); var S: String; begin S := Trim(Value); if (S > '') and (UpCase(S[1]) <> 'N') then inherited SetValue(S); end; initialization RegPropEdits; RegisterComponentEditor(TZVDateTimePicker, TZVDateTimePickerComponentEditor); end. doublecmd-0.5.8/components/ZVDateTimeCtrls/zvdatetimepicker.pas0000644000175000017500000024347212014201074023741 0ustar alexxalexx{ TZVDateTimePicker control for Lazarus - - - - - - - - - - - - - - - - - - - Author: Zoran Vučenović, January and February 2010 Зоран Вученовић, јануар и фебруар 2010. Last change: April 2011 This unit is part of ZVDateTimeCtrls package for Lazarus. Delphi's Visual Component Library (VCL) has a control named TDateTimePicker, which I find very useful for editing dates. Lazarus Component Library (LCL), however, does not have this control, because VCL wraps native Windows control and it seems that such control does not exist on other platforms. Given that LCL is designed to be platform independent, it could not use native Win control. Instead, for editing dates LCL has a control named TDateEdit, but I prefer the VCL's TDateTimePicker. Therefore, I tried to create a custom control which would resemble VCL's TDateTimePicker as much as possible, but not to rely on native Windows control. This TZVDateTimePicker control does not use native Win control. It has been written and initially tested on Windows XP with win widgetset, but then tested and adjusted on Ubuntu Linux 9.10 with gtk2 widgetset. Additionaly, tests were made on Qt widgetset too, on both Windows and Linux. ----------------------------------------------------------- LICENCE - - - - Modified LGPL -- see COPYING.TXT. ----------------------------------------------------------- NO WARRANTY - - - - - - There is no warranty whatsoever. ----------------------------------------------------------- BEST REGARDS TO LAZARUS COMMUNITY! - - - - - - - - - - - - - - - - - - I do hope this control will be useful. } unit ZVDateTimePicker; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LCLProc, Controls, LCLType, Graphics, Math, StdCtrls, Buttons, ExtCtrls, Forms, Calendar, ComCtrls, Types, LCLVersion; const { We will deal with the NullDate value the special way. It will be especially useful for dealing with null values from database. } NullDate = TDateTime(Math.MaxDouble); TheBiggestDate = TDateTime(2958465.0); // 31. dec. 9999. //{$IFDEF WINDOWS} // TCalendar does not accept smaller dates then 14. sep. 1752 on Windows // platform (see TCustomCalendar.SetDateTime). // In Delphi help it is documented that Windows controls act weird with dates // older than 24. sep. 1752. Actually, TCalendar control has problems to show // dates before 1. okt. 1752. (try putting one calendar on the form, run the // application and see what september 1752. looks like). So, this will be the // down limit: TheSmallestDate = TDateTime(-53780.0); // 1. okt. 1752. //{$ELSE} -- I just commented this out. Let's behave uniformely as much as // possible -- I won't allow dates before 1. okt. 1752. on any platform (who // cares about those). // TheSmallestDate = TDateTime(-693593.0); // 1. jan. 0001. //{$ENDIF} {$IF (lcl_major > 0) OR (lcl_minor > 9) OR ((lcl_minor = 9) AND (lcl_release >= 29))} {$DEFINE LCL_0_9_29_OR_AFTER} {$ELSE} {$IFDEF LCLQt} {$DEFINE QT_BEFORE_0_9_29} {$ENDIF} {$IFEND} type TYMD = record Year, Month, Day: Word; end; THMSMs = record Hour, Minute, Second, MiliSec: Word; end; { Used by DateDisplayOrder property to determine the order to display date parts d-m-y, m-d-y or y-m-d. When ddoTryDefault } TDateDisplayOrder = (ddoDMY, ddoMDY, ddoYMD, ddoTryDefault); TDateTextPart = (dtpDay, dtpMonth, dtpYear, dtpTime); TTimeDisplay = (tdHM, // hour and minute tdHMS, // hour, minute and second tdHMSMs // hour, minute, second and milisecond ); TTimeFormat = (tf12, // 12 hours format, with am/pm string tf24 // 24 hours format ); TDateTimeKind = (dtkDate, dtkTime, dtkDateTime); // Determines if we should // display date, time or both. TTimeTextPart = (ttpHour, ttpMinute, ttpSecond, ttpMiliSec, ttpAMPM); TArrowShape = (asClassicSmaller, asClassicLarger, asModernSmaller, asModernLarger, asYetAnotherShape); TDTDateMode = (dmComboBox, dmUpDown, dmNone); { TCustomZVDateTimePicker } TCustomZVDateTimePicker = class(TCustomControl) private FCenturyFrom, FEffectiveCenturyFrom: Word; FDateDisplayOrder: TDateDisplayOrder; FKind: TDateTimeKind; FLeadingZeros: Boolean; FNullInputAllowed: Boolean; FDateTime: TDateTime; FConfirmedDate: TDateTime; FDateSeparator: UTF8String; FReadOnly: Boolean; FMaxDate, FMinDate: TDate; FTextForNullDate: UTF8String; FTimeSeparator: UTF8String; FTimeDisplay: TTimeDisplay; FTimeFormat: TTimeFormat; FTrailingSeparator: Boolean; FUseDefaultSeparators: Boolean; FUserChangedText: Boolean; FTextPart: array[1..3] of UTF8String; FTimeText: array[TTimeTextPart] of UTF8String; FStoredLockCount: Integer; FDigitWidth: Integer; FTextHeight: Integer; FSeparatorWidth: Integer; FSepNoSpaceWidth: Integer; FTimeSeparatorWidth: Integer; FSelectedTextPart: 1..8; FRecalculatingTextSizesNeeded: Boolean; FJumpMinMax: Boolean; FAMPMWidth: Integer; FDateWidth: Integer; FTimeWidth: Integer; FTextWidth: Integer; FArrowShape: TArrowShape; FDateMode: TDTDateMode; FTextEnabled: Boolean; FCheckBox: TCheckBox; FUpDown: TCustomUpDown; FOnChange: TNotifyEvent; FOnDropDown: TNotifyEvent; FOnCloseUp: TNotifyEvent; FArrowButton: TSpeedButton; FCalendarForm: TForm; FCal: TCalendar; FShape: TShape; FRememberedCalendarFormOrigin: TPoint; FDoNotArrangeControls: Boolean; FClosingCalendarForm: Boolean; FCloseCalendarOnChange: Boolean; FForceShowCalendar: Boolean; function AreSeparatorsStored: Boolean; function GetChecked: Boolean; function GetDate: TDate; function GetDateTime: TDateTime; function GetShowCheckBox: Boolean; function GetTime: TTime; procedure SetArrowShape(const AValue: TArrowShape); procedure SetCenturyFrom(const AValue: Word); procedure SetChecked(const AValue: Boolean); procedure CheckTextEnabled; procedure SetDateDisplayOrder(const AValue: TDateDisplayOrder); procedure SetDateMode(const AValue: TDTDateMode); procedure SetKind(const AValue: TDateTimeKind); procedure SetLeadingZeros(const AValue: Boolean); procedure SetNullInputAllowed(const AValue: Boolean); procedure SetDate(const AValue: TDate); procedure SetDateTime(const AValue: TDateTime); procedure SetDateSeparator(const AValue: UTF8String); procedure SetMaxDate(const AValue: TDate); procedure SetMinDate(const AValue: TDate); procedure SetReadOnly(const AValue: Boolean); procedure SetShowCheckBox(const AValue: Boolean); procedure SetTextForNullDate(const AValue: UTF8String); procedure SetTime(const AValue: TTime); procedure SetTimeSeparator(const AValue: UTF8String); procedure SetTimeDisplay(const AValue: TTimeDisplay); procedure SetTimeFormat(const AValue: TTimeFormat); procedure SetTrailingSeparator(const AValue: Boolean); procedure SetUseDefaultSeparators(const AValue: Boolean); function GetHour: Word; function GetMiliSec: Word; function GetMinute: Word; function GetSecond: Word; procedure RecalculateTextSizesIfNeeded; function GetDay: Word; function GetMonth: Word; function GetYear: Word; function GetHMSMs(const NowIfNull: Boolean = False): THMSMs; function GetYYYYMMDD(const TodayIfNull: Boolean = False): TYMD; procedure SetHour(const AValue: Word); procedure SetMiliSec(const AValue: Word); procedure SetMinute(const AValue: Word); procedure SetSecond(const AValue: Word); procedure SetSeparators(const DateSep, TimeSep: UTF8String); procedure SetDay(const AValue: Word); procedure SetMonth(const AValue: Word); procedure SetYear(const AValue: Word); procedure SetYYYYMMDD(const AValue: TYMD); procedure SetHMSMs(const AValue: THMSMs); procedure UpdateIfUserChangedText; function GetSelectedText: UTF8String; procedure AdjustEffectiveCenturyFrom; procedure SelectDateTextPart(const DateTextPart: TDateTextPart); procedure SelectTimeTextPart(const TimeTextPart: TTimeTextPart); procedure DestroyTheCalendar; procedure AdjustCalendarFormSize; procedure AdjustCalendarFormScreenPosition; procedure CreateCalendarForm; procedure DestroyCalendarForm; procedure CloseCalendarForm(AndSetTheDate: Boolean = False); procedure DropDownCalendarForm; procedure UpdateShowArrowButton(NewDateMode: TDTDateMode; NewKind: TDateTimeKind); procedure DestroyUpDown; procedure DestroyArrowBtn; procedure ArrowMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure UpDownClick(Sender: TObject; Button: TUDBtnType); procedure CheckBoxChange(Sender: TObject); procedure CalendarKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure CalendarResize(Sender: TObject); procedure CalendarMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure CalendarChange(Sender: TObject); procedure CalendarFormDeactivate(Sender: TObject); procedure CalendarFormShow(Sender: TObject); procedure CalendarFormClose(Sender: TObject; var CloseAction: TCloseAction); procedure CalendarFormDestroy(Sender: TObject); protected // In older Lazarus versions, GetControlClassDefaultSize is of type TPoint, // since 0.9.29, svn rev. 25204, it's TSize. {$IFDEF LCL_0_9_29_OR_AFTER} class function GetControlClassDefaultSize: TSize; override; {$ELSE} class function GetControlClassDefaultSize: TPoint; override; {$ENDIF} procedure ConfirmChanges; procedure UndoChanges; procedure ChangeDateTimeInternally(const AValue: TDateTime); function GetEffectiveDateDisplayOrder: TDateDisplayOrder; virtual; function GetCurrentDateTextPart: TDateTextPart; function GetCurrentTimeTextPart: TTimeTextPart; procedure FontChanged(Sender: TObject); override; function GetTextOrigin: TPoint; procedure KeyDown(var Key: Word; Shift: TShiftState); override; procedure KeyPress(var Key: char); override; procedure SelectTextPartUnderMouse(XMouse: Integer); procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override; procedure UpdateDate; virtual; procedure DoEnter; override; procedure DoExit; override; procedure Click; override; procedure DblClick; override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure KeyUp(var Key: Word; Shift: TShiftState); override; procedure UTF8KeyPress(var UTF8Key: TUTF8Char); override; procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); override; procedure IncreaseCurrentTextPart; procedure DecreaseCurrentTextPart; procedure IncreaseMonth; procedure IncreaseYear; procedure IncreaseDay; procedure DecreaseMonth; procedure DecreaseYear; procedure DecreaseDay; procedure IncreaseHour; procedure IncreaseMinute; procedure IncreaseSecond; procedure IncreaseMiliSec; procedure DecreaseHour; procedure DecreaseMinute; procedure DecreaseSecond; procedure DecreaseMiliSec; procedure ChangeAMPM; procedure SelectDay; procedure SelectMonth; procedure SelectYear; procedure SelectHour; procedure SelectMinute; procedure SelectSecond; procedure SelectMiliSec; procedure SelectAMPM; procedure SetEnabled(Value: Boolean); override; procedure CreateWnd; override; procedure SetDateTimeJumpMinMax(const AValue: TDateTime); procedure ArrangeCtrls; virtual; procedure Change; virtual; procedure DoDropDown; virtual; procedure DoCloseUp; virtual; procedure DrawArrowButtonGlyph; virtual; property BorderStyle default bsSingle; property AutoSize default True; property TabStop default True; property ParentColor default False; property CenturyFrom: Word read FCenturyFrom write SetCenturyFrom; property DateDisplayOrder: TDateDisplayOrder read FDateDisplayOrder write SetDateDisplayOrder default ddoTryDefault; property MaxDate: TDate read FMaxDate write SetMaxDate; property MinDate: TDate read FMinDate write SetMinDate; property DateTime: TDateTime read GetDateTime write SetDateTime; property TrailingSeparator: Boolean read FTrailingSeparator write SetTrailingSeparator; property ReadOnly: Boolean read FReadOnly write SetReadOnly default False; property LeadingZeros: Boolean read FLeadingZeros write SetLeadingZeros; property TextForNullDate: UTF8String read FTextForNullDate write SetTextForNullDate; property NullInputAllowed: Boolean read FNullInputAllowed write SetNullInputAllowed default True; property OnChange: TNotifyEvent read FOnChange write FOnChange; property OnDropDown: TNotifyEvent read FOnDropDown write FOnDropDown; property OnCloseUp: TNotifyEvent read FOnCloseUp write FOnCloseUp; property ShowCheckBox: Boolean read GetShowCheckBox write SetShowCheckBox default False; property Checked: Boolean read GetChecked write SetChecked default True; property ArrowShape: TArrowShape read FArrowShape write SetArrowShape default asModernSmaller; property Kind: TDateTimeKind read FKind write SetKind; property DateSeparator: UTF8String read FDateSeparator write SetDateSeparator stored AreSeparatorsStored; property TimeSeparator: UTF8String read FTimeSeparator write SetTimeSeparator stored AreSeparatorsStored; property UseDefaultSeparators: Boolean read FUseDefaultSeparators write SetUseDefaultSeparators; property TimeFormat: TTimeFormat read FTimeFormat write SetTimeFormat; property TimeDisplay: TTimeDisplay read FTimeDisplay write SetTimeDisplay; property Time: TTime read GetTime write SetTime; property Date: TDate read GetDate write SetDate; property DateMode: TDTDateMode read FDateMode write SetDateMode; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; function DateIsNull: Boolean; procedure SelectDate; procedure SelectTime; procedure Paint; override; procedure EditingDone; override; published // end; {TZVDateTimePicker} TZVDateTimePicker = class(TCustomZVDateTimePicker) public property DateTime; published property ArrowShape; property ShowCheckBox; property Checked; property CenturyFrom; property DateDisplayOrder; property MaxDate; property MinDate; property ReadOnly; property AutoSize; property Font; property ParentFont; property TabOrder; property TabStop; property BorderStyle; property BorderSpacing; property Enabled; property Color; property ParentColor; property DateSeparator; property TrailingSeparator; property TextForNullDate; property LeadingZeros; property ShowHint; property ParentShowHint; property Align; property Anchors; property Constraints; property Cursor; property PopupMenu; property Visible; property NullInputAllowed; property Kind; property TimeSeparator; property TimeFormat; property TimeDisplay; property DateMode; property Date; property Time; property UseDefaultSeparators; // events: property OnChange; property OnDropDown; property OnCloseUp; property OnChangeBounds; property OnClick; property OnContextPopup; property OnDblClick; property OnEditingDone; property OnEnter; property OnExit; property OnKeyDown; property OnKeyPress; property OnKeyUp; property OnMouseDown; property OnMouseEnter; property OnMouseMove; property OnMouseUp; property OnMouseLeave; property OnResize; property OnUTF8KeyPress; end; function EqualDateTime(const A, B: TDateTime): Boolean; function IsNullDate(DT: TDateTime): Boolean; implementation function NumberOfDaysInMonth(const Month, Year: Word): Word; begin Result := 0; if Month in [1..12] then Result := MonthDays[IsLeapYear(Year), Month]; end; function EqualDateTime(const A, B: TDateTime): Boolean; begin if IsNullDate(A) then Result := IsNullDate(B) else Result := (not IsNullDate(B)) and (A = B); end; function IsNullDate(DT: TDateTime): Boolean; begin Result := IsNan(DT) or IsInfinite(DT) or (DT > SysUtils.MaxDateTime) or (DT < SysUtils.MinDateTime); end; procedure Exchange(var W1, W2: Word); var W: Word; begin W := W1; W1 := W2; W2 := W; end; { TCustomZVDateTimePicker } procedure TCustomZVDateTimePicker.SetChecked(const AValue: Boolean); begin if Assigned(FCheckBox) then FCheckBox.Checked := AValue; CheckTextEnabled; Invalidate; end; procedure TCustomZVDateTimePicker.CheckTextEnabled; begin FTextEnabled := Self.Enabled and GetChecked; if Assigned(FArrowButton) then FArrowButton.Enabled := FTextEnabled; if Assigned(FUpDown) then FUpDown.Enabled := FTextEnabled; if Assigned(FCheckBox) then FCheckBox.Enabled := Self.Enabled; end; procedure TCustomZVDateTimePicker.SetDateDisplayOrder(const AValue: TDateDisplayOrder); var PreviousEffectiveDDO: TDateDisplayOrder; begin if FDateDisplayOrder <> AValue then begin PreviousEffectiveDDO := GetEffectiveDateDisplayOrder; FDateDisplayOrder := AValue; if PreviousEffectiveDDO <> GetEffectiveDateDisplayOrder then UpdateDate; end; end; procedure TCustomZVDateTimePicker.SetDateMode(const AValue: TDTDateMode); begin UpdateShowArrowButton(AValue, Kind); FDateMode := AValue; end; procedure TCustomZVDateTimePicker.SetKind(const AValue: TDateTimeKind); begin if FKind <> AValue then begin UpdateShowArrowButton(FDateMode, AValue); FKind := AValue; FRecalculatingTextSizesNeeded := True; UpdateDate; end; end; procedure TCustomZVDateTimePicker.SetLeadingZeros(const AValue: Boolean); begin if FLeadingZeros = AValue then Exit; FLeadingZeros := AValue; UpdateDate; end; procedure TCustomZVDateTimePicker.SetNullInputAllowed(const AValue: Boolean); begin FNullInputAllowed := AValue; end; procedure TCustomZVDateTimePicker.SetDate(const AValue: TDate); begin if IsNullDate(AValue) then DateTime := NullDate else if DateIsNull then DateTime := Int(AValue) else DateTime := ComposeDateTime(AValue, FDateTime); end; procedure TCustomZVDateTimePicker.SetDateTime(const AValue: TDateTime); begin if not EqualDateTime(AValue, FDateTime) then begin if IsNullDate(AValue) then FDateTime := NullDate else FDateTime := AValue; Change; end; UpdateDate; end; procedure TCustomZVDateTimePicker.SetDateSeparator(const AValue: UTF8String); begin SetSeparators(AValue, FTimeSeparator); end; procedure TCustomZVDateTimePicker.SetMaxDate(const AValue: TDate); begin if not IsNullDate(AValue) then begin if AValue > TheBiggestDate then FMaxDate := TheBiggestDate else if AValue <= FMinDate then FMaxDate := FMinDate else FMaxDate := Int(AValue); if not DateIsNull then if FMaxDate < GetDate then SetDate(FMaxDate); AdjustEffectiveCenturyFrom; end; end; procedure TCustomZVDateTimePicker.SetMinDate(const AValue: TDate); begin if not IsNullDate(AValue) then begin if AValue < TheSmallestDate then FMinDate := TheSmallestDate else if AValue >= FMaxDate then FMinDate := FMaxDate else FMinDate := Int(AValue); if not DateIsNull then if FMinDate > GetDate then SetDate(FMinDate); AdjustEffectiveCenturyFrom; end; end; procedure TCustomZVDateTimePicker.SetReadOnly(const AValue: Boolean); begin if FReadOnly <> AValue then begin if AValue then begin ConfirmChanges; UpdateDate; end; FReadOnly := AValue; end; end; type TDTCheckBox = class(TCheckBox) protected procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); override; end; procedure TDTCheckBox.CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); begin inherited CalculatePreferredSize(PreferredWidth, PreferredHeight, WithThemeSpace); PreferredHeight := 1; end; procedure TCustomZVDateTimePicker.SetShowCheckBox(const AValue: Boolean); begin if GetShowCheckBox <> AValue then begin DisableAlign; try if AValue then begin FCheckBox := TDTCheckBox.Create(Self); {$IFNDEF WINDOWS} { On Windows, the following line seems to not have any effect, but I enclosed it in IFNDEF anyway. } FCheckBox.Color := clBtnFace; { This line is here because of CheckBox's strange behavior in Linux -- when parent's colour is white, which is the default in our case (actually, our default is clWindow, but it's usually white) and when the check box is on a form shown modally, if we close the form and then show it again, the check box refuses to paint it's "checker" shape. I spent a lot of time trying to solve this and this is the best I came up with -- setting the check box's colour to clBtnFace seems to be a workaround. Nice thing is that it seems not to really effect neither the checker's colour on the screen, nor the colour of check box's "box", so we didn't actually spoil the check box's default appearence on the screen. } {$ENDIF} FCheckBox.ControlStyle := FCheckBox.ControlStyle + [csNoFocus, csNoDesignSelectable]; FCheckBox.AllowGrayed := False; FCheckBox.TabStop := False; FCheckBox.Checked := True; FCheckBox.Enabled := Self.Enabled; FCheckBox.Parent := Self; end else begin FCheckBox.OnChange := nil; FreeAndNil(FCheckBox); end; ArrangeCtrls; finally EnableAlign; end; end; end; procedure TCustomZVDateTimePicker.SetTextForNullDate(const AValue: UTF8String); begin if FTextForNullDate = AValue then Exit; FTextForNullDate := AValue; if DateIsNull then Invalidate; end; procedure TCustomZVDateTimePicker.SetTime(const AValue: TTime); begin if IsNullDate(AValue) then DateTime := NullDate else if DateIsNull then DateTime := ComposeDateTime(Max(Min(SysUtils.Date, MaxDate), MinDate), AValue) else DateTime := ComposeDateTime(FDateTime, AValue); end; procedure TCustomZVDateTimePicker.SetTimeSeparator(const AValue: UTF8String); begin SetSeparators(FDateSeparator, AValue); end; procedure TCustomZVDateTimePicker.SetTimeDisplay(const AValue: TTimeDisplay); begin if FTimeDisplay = AValue then Exit; FTimeDisplay:=AValue; FRecalculatingTextSizesNeeded := True; UpdateDate; end; procedure TCustomZVDateTimePicker.SetTimeFormat(const AValue: TTimeFormat); begin if FTimeFormat <> AValue then begin FTimeFormat := AValue; FRecalculatingTextSizesNeeded := True; UpdateDate; end; end; procedure TCustomZVDateTimePicker.SetTrailingSeparator(const AValue: Boolean); begin if FTrailingSeparator = AValue then Exit; FTrailingSeparator := AValue; FRecalculatingTextSizesNeeded := True; UpdateIfUserChangedText; Invalidate; end; procedure TCustomZVDateTimePicker.SetUseDefaultSeparators(const AValue: Boolean); begin if FUseDefaultSeparators <> AValue then begin if AValue then begin SetSeparators(SysUtils.DateSeparator, SysUtils.TimeSeparator); // Note that here, in SetSeparators procedure, // the field FUseDefaultSeparators is set to False. end; // Therefore, the following line must NOT be moved above. FUseDefaultSeparators := AValue; end; end; function TCustomZVDateTimePicker.GetHour: Word; begin Result := GetHMSMs.Hour; end; function TCustomZVDateTimePicker.GetMiliSec: Word; begin Result := GetHMSMs.MiliSec; end; function TCustomZVDateTimePicker.GetMinute: Word; begin Result := GetHMSMs.Minute; end; function TCustomZVDateTimePicker.GetSecond: Word; begin Result := GetHMSMs.Second; end; { RecalculateTextSizesIfNeeded -------------------------------- In this procedure we measure text and store the values in the following fields: FDateWidth, FTimeWidth, FTextWidth, FTextHeigth, FDigitWidth, FSeparatorWidth, FTimeSeparatorWidth, FSepNoSpaceWidth. These fields are used in calculating our preffered size and when painting. The procedure is called internally when needed (when properties which influence the appearence change). } procedure TCustomZVDateTimePicker.RecalculateTextSizesIfNeeded; var C: Char; N: Integer; S: UTF8String; begin if FRecalculatingTextSizesNeeded then begin FRecalculatingTextSizesNeeded := False; FDigitWidth := 0; for C := '0' to '9' do begin N := Canvas.GetTextWidth(C); if N > FDigitWidth then FDigitWidth := N; end; if FKind in [dtkDate, dtkDateTime] then begin FSeparatorWidth := Canvas.GetTextWidth(FDateSeparator); FDateWidth := 8 * FDigitWidth + 2 * FSeparatorWidth; if FTrailingSeparator then begin FSepNoSpaceWidth := Canvas.GetTextWidth(TrimRight(FDateSeparator)); Inc(FDateWidth, FSepNoSpaceWidth); end else FSepNoSpaceWidth := 0; S := FDateSeparator; end else begin if FSelectedTextPart < 4 then FSelectedTextPart := 4; S := ''; FSeparatorWidth := 0; FSepNoSpaceWidth := 0; FDateWidth := 0; end; FAMPMWidth := 0; if FKind in [dtkTime, dtkDateTime] then begin S := S + FTimeSeparator; FTimeSeparatorWidth := Canvas.GetTextWidth(FTimeSeparator); case FTimeDisplay of tdHM: FTimeWidth := 4 * FDigitWidth + FTimeSeparatorWidth; tdHMS: FTimeWidth := 6 * FDigitWidth + 2 * FTimeSeparatorWidth; tdHMSMs: FTimeWidth := 9 * FDigitWidth + 3 * FTimeSeparatorWidth; end; if FTimeFormat = tf12 then begin S := S + 'APM'; FAMPMWidth := Max(Canvas.TextWidth('AM'), Canvas.TextWidth('PM')); FTimeWidth := FTimeWidth + FDigitWidth + FAMPMWidth; end; if Ord(FTimeDisplay) + 5 < FSelectedTextPart then if (FSelectedTextPart < 8) or (FTimeFormat = tf24) then FSelectedTextPart := 4; end else begin if FSelectedTextPart > 3 then FSelectedTextPart := 1; FTimeSeparatorWidth := 0; FTimeWidth := 0; end; if FKind = dtkDateTime then FTextWidth := FDateWidth + FTimeWidth + 2 * FDigitWidth else FTextWidth := FDateWidth + FTimeWidth; FTextHeight := Canvas.GetTextHeight('0123456789' + S); end; end; function TCustomZVDateTimePicker.GetDay: Word; begin Result := GetYYYYMMDD.Day; end; function TCustomZVDateTimePicker.GetMonth: Word; begin Result := GetYYYYMMDD.Month; end; function TCustomZVDateTimePicker.GetYear: Word; begin Result := GetYYYYMMDD.Year; end; function TCustomZVDateTimePicker.GetHMSMs(const NowIfNull: Boolean): THMSMs; begin if DateIsNull then begin if NowIfNull then DecodeTime(SysUtils.Time, Result.Hour, Result.Minute, Result.Second, Result.MiliSec) else with Result do begin Hour := 0; Minute := 0; Second := 0; MiliSec := 0; end; end else DecodeTime(FDateTime, Result.Hour, Result.Minute, Result.Second, Result.MiliSec); end; function TCustomZVDateTimePicker.GetYYYYMMDD(const TodayIfNull: Boolean): TYMD; begin if DateIsNull then begin if TodayIfNull then DecodeDate(SysUtils.Date, Result.Year, Result.Month, Result.Day) else with Result do begin Day := 0; Month := 0; Year := 0; end; end else DecodeDate(FDateTime, Result.Year, Result.Month, Result.Day); end; procedure TCustomZVDateTimePicker.SetHour(const AValue: Word); var HMSMs: THMSMs; begin SelectHour; HMSMs := GetHMSMs(True); HMSMs.Hour := AValue; SetHMSMs(HMSMs); end; procedure TCustomZVDateTimePicker.SetMiliSec(const AValue: Word); var HMSMs: THMSMs; begin SelectMiliSec; HMSMs := GetHMSMs(True); HMSMs.MiliSec := AValue; SetHMSMs(HMSMs); end; procedure TCustomZVDateTimePicker.SetMinute(const AValue: Word); var HMSMs: THMSMs; begin SelectMinute; HMSMs := GetHMSMs(True); HMSMs.Minute := AValue; SetHMSMs(HMSMs); end; procedure TCustomZVDateTimePicker.SetSecond(const AValue: Word); var HMSMs: THMSMs; begin SelectSecond; HMSMs := GetHMSMs(True); HMSMs.Second := AValue; SetHMSMs(HMSMs); end; procedure TCustomZVDateTimePicker.SetSeparators(const DateSep, TimeSep: UTF8String); var SeparatorsChanged: Boolean; begin FUseDefaultSeparators := False; SeparatorsChanged := False; if FDateSeparator <> DateSep then begin FDateSeparator := DateSep; SeparatorsChanged := True; end; if FTimeSeparator <> TimeSep then begin FTimeSeparator := TimeSep; SeparatorsChanged := True; end; if SeparatorsChanged then begin FRecalculatingTextSizesNeeded := True; Invalidate; end; end; procedure TCustomZVDateTimePicker.SetDay(const AValue: Word); var YMD: TYMD; begin SelectDay; YMD := GetYYYYMMDD(True); YMD.Day := AValue; SetYYYYMMDD(YMD); end; procedure TCustomZVDateTimePicker.SetMonth(const AValue: Word); var YMD: TYMD; N: Word; begin SelectMonth; YMD := GetYYYYMMDD(True); YMD.Month := AValue; N := NumberOfDaysInMonth(YMD.Month, YMD.Year); if YMD.Day > N then YMD.Day := N; SetYYYYMMDD(YMD); end; procedure TCustomZVDateTimePicker.SetYear(const AValue: Word); var YMD: TYMD; begin SelectYear; YMD := GetYYYYMMDD(True); YMD.Year := AValue; if (YMD.Month = 2) and (YMD.Day > 28) and (not IsLeapYear(YMD.Year)) then YMD.Day := 28; SetYYYYMMDD(YMD); end; procedure TCustomZVDateTimePicker.SetYYYYMMDD(const AValue: TYMD); var D: TDateTime; begin if TryEncodeDate(AValue.Year, AValue.Month, AValue.Day, D) then SetDate(D) else UpdateDate; end; procedure TCustomZVDateTimePicker.SetHMSMs(const AValue: THMSMs); var T: TDateTime; begin if TryEncodeTime(AValue.Hour, AValue.Minute, AValue.Second, AValue.MiliSec, T) then begin SetTime(T); end else UpdateDate; end; procedure TCustomZVDateTimePicker.UpdateIfUserChangedText; var W: Word; S: UTF8String; begin if FUserChangedText then begin Inc(FStoredLockCount); try FUserChangedText := False; S := Trim(GetSelectedText); if FSelectedTextPart = 8 then begin S := UTF8UpperCase(UTF8Copy(S, 1, 1)); W := GetHour; if S = 'A' then begin if W >= 12 then Dec(W, 12); end else begin if W < 12 then Inc(W, 12); end; SetHour(W); FSelectedTextPart := 8; end else begin W := StrToInt(S); case GetCurrentDateTextPart of dtpYear: begin if Length(S) <= 2 then begin // If user entered the year in two digit format (or even only one // digit), we will set the year according to the CenturyFrom property // (We actually use FEffectiveCenturyFrom field, which is adjusted to // take care of MinDate and MaxDate besides CenturyFrom properties). if W >= (FEffectiveCenturyFrom mod 100) then W := W + 100 * (FEffectiveCenturyFrom div 100) else W := W + 100 * (FEffectiveCenturyFrom div 100 + 1); end; SetYear(W); end; dtpDay: SetDay(W); dtpMonth: SetMonth(W); else case GetCurrentTimeTextPart of ttpHour: begin if (FTimeFormat = tf12) then begin if GetHour < 12 then begin if W = 12 then SetHour(0) else SetHour(W); end else begin if W = 12 then SetHour(W) else SetHour(W + 12); end; end else SetHour(W); end; ttpMinute: SetMinute(W); ttpSecond: SetSecond(W); ttpMiliSec: SetMiliSec(W); end; end; end; finally Dec(FStoredLockCount); end; end; end; function TCustomZVDateTimePicker.GetSelectedText: UTF8String; begin if FSelectedTextPart <= 3 then Result := FTextPart[FSelectedTextPart] else Result := FTimeText[TTimeTextPart(FSelectedTextPart - 4)]; end; procedure TCustomZVDateTimePicker.AdjustEffectiveCenturyFrom; var Y1, Y2, M, D: Word; begin DecodeDate(FMinDate, Y1, M, D); if Y1 > FCenturyFrom then FEffectiveCenturyFrom := Y1 // If we use CenturyFrom which is set to value // below MinDate's year, then when user enters two digit year, the // DateTime would automatically be set to MinDate value, even though // we perhaps allow same two-digit year in following centuries. It // would be less user friendly. // This is therefore better. else begin DecodeDate(FMaxDate, Y2, M, D); if Y2 < 100 then Y2 := 0 else Dec(Y2, 99); // -- We should not use CenturyFrom if it is set to value // greater then MaxDate's year minus 100 years. // For example: // if CenturyFrom = 1941 and MaxDate = 31.12.2025, then if user enters // Year 33, we could not set the year to 2033 anyway, because of MaxDate // limit. Note that if we just leave CenturyFrom to effectively remain as // is, then in case of our example the DateTime would be automatically // reduced to MaxDate value. Setting the year to 1933 is rather expected // behaviour, so our internal field FEffectiveCenturyFrom should be 1926. // Therefore: if Y2 < FCenturyFrom then FEffectiveCenturyFrom := Max(Y1, Y2) else FEffectiveCenturyFrom := FCenturyFrom; // -- FCenturyFrom has passed all // our tests, so we'll really use it without any correction. end; end; procedure TCustomZVDateTimePicker.SelectDateTextPart( const DateTextPart: TDateTextPart); begin if FKind in [dtkDate, dtkDateTime] then begin case DateTextPart of dtpDay: //SelectDay; begin case GetEffectiveDateDisplayOrder of ddoDMY: FSelectedTextPart := 1; ddoMDY: FSelectedTextPart := 2; ddoYMD: FSelectedTextPart := 3; end; end; dtpMonth: //SelectMonth; begin if GetEffectiveDateDisplayOrder = ddoMDY then FSelectedTextPart := 1 else FSelectedTextPart := 2; end; dtpYear: //SelectYear; begin if GetEffectiveDateDisplayOrder = ddoYMD then FSelectedTextPart := 1 else FSelectedTextPart := 3; end; end; Invalidate; end; end; procedure TCustomZVDateTimePicker.SelectTimeTextPart( const TimeTextPart: TTimeTextPart); var B: Boolean; begin if FKind in [dtkTime, dtkDateTime] then begin if TimeTextPart = ttpAMPM then B := FTimeFormat = tf12 else B := Ord(FTimeDisplay) + 1 >= Ord(TimeTextPart); if B then FSelectedTextPart := 4 + Ord(TimeTextPart); end; Invalidate; end; procedure TCustomZVDateTimePicker.DestroyTheCalendar; begin if Assigned(FCal) then begin FCal.OnChange := nil; FCal.OnResize := nil; FCal.OnMouseUp := nil; FCal.OnKeyDown := nil; FreeAndNil(FCal); end; FreeAndNil(FShape); end; procedure TCustomZVDateTimePicker.AdjustCalendarFormSize; begin FCalendarForm.ClientWidth := FCal.Width + 2; FCalendarForm.ClientHeight := FCal.Height + 2; FShape.SetBounds(0, 0, FCalendarForm.ClientWidth, FCalendarForm.ClientHeight); AdjustCalendarFormScreenPosition; end; procedure TCustomZVDateTimePicker.CreateCalendarForm; var P: TPoint; begin if not (csDesigning in ComponentState) then begin DestroyCalendarForm; FCloseCalendarOnChange := False; P := Point(0, 0); FCal := TCalendar.Create(nil); FCal.AutoSize := True; FCal.GetPreferredSize(P.x, P.y); FCal.Align := alNone; FCal.SetBounds(1, 1, P.x, P.y); FCal.TabStop := True; FCalendarForm := TForm.CreateNew(nil); {$IFDEF LCL_0_9_29_OR_AFTER} // Nice new property! FCalendarForm.PopupMode := pmAuto; {$ENDIF} FCalendarForm.SetBounds(-8000, -8000, P.x + 2, P.y + 2); FRememberedCalendarFormOrigin := Point(-8000, -8000); FCalendarForm.ShowInTaskBar := stNever; FCalendarForm.BorderStyle := bsNone; FShape := TShape.Create(nil); FShape.Brush.Style := bsClear; FCal.Parent := FCalendarForm; FShape.Parent := FCalendarForm; FCal.OnResize := @CalendarResize; FCal.OnMouseUp := @CalendarMouseUp; FCal.OnKeyDown := @CalendarKeyDown; FCal.OnChange := @CalendarChange; FCalendarForm.OnDeactivate := @CalendarFormDeactivate; FCalendarForm.OnClose := @CalendarFormClose; FCalendarForm.OnShow := @CalendarFormShow; FCalendarForm.OnDestroy := @CalendarFormDestroy; end; end; procedure TCustomZVDateTimePicker.DestroyCalendarForm; begin if Assigned(FCalendarForm) then begin DestroyTheCalendar; FCalendarForm.Release; FCalendarForm := nil; end; end; procedure TCustomZVDateTimePicker.AdjustCalendarFormScreenPosition; var R: TRect; P: TPoint; H, W: Integer; begin H := FCalendarForm.Height; W := FCalendarForm.Width; P := ControlToScreen(Point(0, Height)); R := Screen.MonitorFromWindow(Self.Handle).WorkareaRect; if P.y > R.Bottom - H then P.y := P.y - H - Height; if P.y < R.Top then P.y := R.Top; if P.x > R.Right - W then P.x := R.Right - W; if P.x < R.Left then P.x := R.Left; if (P.x <> FRememberedCalendarFormOrigin.x) or (P.y <> FRememberedCalendarFormOrigin.y) then begin FCalendarForm.SetBounds(P.x, P.y, W, H); FRememberedCalendarFormOrigin := P; end; end; { In older Lazarus versions, GetControlClassDefaultSize is of type TPoint, since 0.9.29, svn rev. 25204, it's TSize. } {$IFDEF LCL_0_9_29_OR_AFTER} class function TCustomZVDateTimePicker.GetControlClassDefaultSize: TSize; begin Result.cx := 102; Result.cy := 23; end; {$ELSE} class function TCustomZVDateTimePicker.GetControlClassDefaultSize: TPoint; begin Result.x := 102; Result.y := 23; end; {$ENDIF} procedure TCustomZVDateTimePicker.ConfirmChanges; begin UpdateIfUserChangedText; FConfirmedDate := FDateTime; end; procedure TCustomZVDateTimePicker.UndoChanges; begin SetDateTime(FConfirmedDate); end; procedure TCustomZVDateTimePicker.ChangeDateTimeInternally( const AValue: TDateTime); begin Inc(FStoredLockCount); try SetDateTime(AValue); finally Dec(FStoredLockCount); end; end; { GetEffectiveDateDisplayOrder function ---------------------------------- If date display order ddoTryDefault is set, then we will decide which display order to use according to ShortDateFormat global variable. The function tries to achieve that by searching through short date format string, to see which letter comes first -- d, m or y. When it finds any of these characters, it assumes that date order should be d-m-y, m-d-y, or y-m-d respectively. If the search through ShortDateFormat is unsuccessful by any chance, we try the same with LongDateFormat global variable. If we don't succeed again, we'll assume y-m-d order. } function TCustomZVDateTimePicker.GetEffectiveDateDisplayOrder: TDateDisplayOrder; var S: String; I: Integer; begin if FDateDisplayOrder = ddoTryDefault then begin S := ShortDateFormat; Result := ddoTryDefault; repeat for I := 1 to Length(S) do begin case upCase(S[I]) of 'D': begin Result := ddoDMY; Break; end; 'M': begin Result := ddoMDY; Break; end; 'Y': begin Result := ddoYMD; Break; end; end; end; if Result = ddoTryDefault then begin S := LongDateFormat; { We couldn't decide with ShortDateFormat, let's try with LongDateFormat now. } Result := ddoYMD; { -- But now we must set something to be default. This ensures that the repeat loop breaks next time. If we don't find anything in LongDateFormat, we'll leave with y-m-d order. } end else Break; until False; end else Result := FDateDisplayOrder; end; { GetCurrentDateTextPart function ---------------------------------- Returns part of Date which is currently selected. If currently selected text part belongs to time, then this function returns dtpTime and GetCurrentTimeTextPart function should be used to determine which part of time is selected. } function TCustomZVDateTimePicker.GetCurrentDateTextPart: TDateTextPart; begin if FSelectedTextPart > 3 then Result := dtpTime else begin case FSelectedTextPart of 1: Result := dtpDay; 2: Result := dtpMonth; 3: Result := dtpYear; end; case GetEffectiveDateDisplayOrder of ddoMDY: if Result = dtpDay then Result := dtpMonth else if Result = dtpMonth then Result := dtpDay; ddoYMD: if Result = dtpDay then Result := dtpYear else if Result = dtpYear then Result := dtpDay; end; end; end; { GetCurrentTimeTextPart function ---------------------------------- Returns part of Time which is currently selected. Used when GetCurrentDateTextPart returns dtpTime. } function TCustomZVDateTimePicker.GetCurrentTimeTextPart: TTimeTextPart; begin if FSelectedTextPart > 4 then Result := TTimeTextPart(FSelectedTextPart - 4) else Result := ttpHour; end; procedure TCustomZVDateTimePicker.FontChanged(Sender: TObject); begin FRecalculatingTextSizesNeeded := True; inherited FontChanged(Sender); end; { GetTextOrigin --------------- Returns upper left corner of the rectangle where the text is written. Also used in calculating our preffered size. } function TCustomZVDateTimePicker.GetTextOrigin: TPoint; begin Result.y := BorderSpacing.InnerBorder + BorderWidth; if Assigned(FCheckBox) then Result.x := Result.y + FCheckBox.BorderSpacing.Left + FCheckBox.Width else Result.x := Result.y; end; procedure TCustomZVDateTimePicker.KeyDown(var Key: Word; Shift: TShiftState); var M, L, N: Integer; K: Word; begin Inc(FStoredLockCount); try if FTextEnabled then inherited KeyDown(Key, Shift); // calls OnKeyDown event if (Key = VK_SPACE) then begin if GetShowCheckBox then FCheckBox.Checked := not FCheckBox.Checked; end else if FTextEnabled then begin case Key of VK_LEFT, VK_RIGHT, VK_OEM_COMMA, VK_OEM_PERIOD, VK_DIVIDE, VK_OEM_MINUS, VK_SEPARATOR, VK_DECIMAL, VK_SUBTRACT: begin K := Key; Key := 0; UpdateIfUserChangedText; if FKind in [dtkDate, dtkDateTime] then M := 1 else M := 4; if FKind in [dtkTime, dtkDateTime] then begin L := Ord(FTimeDisplay) + 5; if FTimeFormat = tf12 then N := 8 else N := L; end else begin N := 3; L := 3; end; if K = VK_LEFT then begin if FSelectedTextPart = M then FSelectedTextPart := N else if (FSelectedTextPart = N) and (L < N) then FSelectedTextPart := L else Dec(FSelectedTextPart); end else begin if FSelectedTextPart = N then FSelectedTextPart := M else if (FSelectedTextPart = L) and (L < N) then FSelectedTextPart := N else Inc(FSelectedTextPart); end; Invalidate; end; VK_UP: begin Key := 0; UpdateIfUserChangedText; if not FReadOnly then IncreaseCurrentTextPart; end; VK_DOWN: begin Key := 0; UpdateIfUserChangedText; if not FReadOnly then DecreaseCurrentTextPart; end; VK_RETURN: if not FReadOnly then begin ConfirmChanges; EditingDone; end; VK_ESCAPE: if not FReadOnly then begin UndoChanges; EditingDone; end; VK_N: if (not FReadOnly) and FNullInputAllowed then SetDateTime(NullDate); end; end; finally Dec(FStoredLockCount); end; end; procedure TCustomZVDateTimePicker.KeyPress(var Key: char); var S: String; DTP: TDateTextPart; TTP: TTimeTextPart; N, L: Integer; YMD: TYMD; HMSMs: THMSMs; D, T: TDateTime; Finished: Boolean; begin if FTextEnabled then begin Inc(FStoredLockCount); try inherited KeyPress(Key); if (not FReadOnly) then begin Finished := False; if FSelectedTextPart = 8 then begin case upCase(Key) of 'A': S := 'AM'; 'P': S := 'PM'; else Finished := True; end; end else if Key in ['0'..'9'] then begin TTP := ttpAMPM; DTP := GetCurrentDateTextPart; if DTP = dtpYear then N := 4 else if DTP = dtpTime then begin TTP := GetCurrentTimeTextPart; if TTP = ttpMiliSec then N := 3 else N := 2; end else N := 2; S := Trim(GetSelectedText); if FUserChangedText and (UTF8Length(S) < N) then begin S := S + Key; if (not FLeadingZeros) and (FSelectedTextPart <= 4) then while (UTF8Length(S) > 1) and (UTF8Copy(S, 1, 1) = '0') do UTF8Delete(S, 1, 1); end else begin S := Key; end; if (UTF8Length(S) >= N) then begin L := StrToInt(S); if DTP <> dtpTime then begin YMD := GetYYYYMMDD(True); case DTP of dtpDay: YMD.Day := L; dtpMonth: YMD.Month := L; dtpYear: YMD.Year := L; end; if not TryEncodeDate(YMD.Year, YMD.Month, YMD.Day, D) then begin D := MinDate - 1; end; if (D < MinDate) or (D > MaxDate) then begin if N = 4 then begin UpdateDate; //Change; Finished := True; end else S := Key; end; end else begin if (TTP = ttpHour) and (FTimeFormat = tf12) then begin if not (L in [1..12]) then S := Key; end else begin HMSMs := GetHMSMs(True); case TTP of ttpHour: HMSMs.Hour := L; ttpMinute: HMSMs.Minute := L; ttpSecond: HMSMs.Second := L; ttpMiliSec: HMSMs.MiliSec := L; end; if not TryEncodeTime(HMSMs.Hour, HMSMs.Minute, HMSMs.Second, HMSMs.MiliSec, T) then S := Key; end; end; end; end else Finished := True; if (not Finished) and (GetSelectedText <> S) then begin if (not FUserChangedText) and DateIsNull then if FSelectedTextPart <= 3 then DateTime := SysUtils.Date else DateTime := SysUtils.Now; if FSelectedTextPart <= 3 then FTextPart[FSelectedTextPart] := S else FTimeText[TTimeTextPart(FSelectedTextPart - 4)] := S; FUserChangedText := True; Invalidate; end; end; finally Dec(FStoredLockCount); end; end; end; { SelectTextPartUnderMouse -------------------------- This procedure determines which text part (date or time part -- day, month, year, hour, minute...) should be selected in response to mouse message. Used in MouseDown and DoMouseWheel methods. } procedure TCustomZVDateTimePicker.SelectTextPartUnderMouse(XMouse: Integer); var M, NX: Integer; InTime: Boolean; begin UpdateIfUserChangedText; if CanFocus then SetFocus; if Focused then begin // Calculating mouse position inside text // in order to select date part under mouse cursor. FSelectedTextPart := 8; NX := XMouse - GetTextOrigin.x; if FKind = dtkDateTime then begin if NX >= FDateWidth + FDigitWidth then begin InTime := True; NX := NX - FDateWidth - 2 * FDigitWidth; end else InTime := False; end else InTime := FKind = dtkTime; if InTime then begin if (FTimeFormat = tf24) or (NX < FTimeWidth - FAMPMWidth - FDigitWidth div 2) then begin M := 2 * FDigitWidth + FTimeSeparatorWidth div 2; if M > NX then FSelectedTextPart := 4 else begin if FTimeDisplay = tdHM then FSelectedTextPart := 5 else begin M := M + FTimeSeparatorWidth + 2 * FDigitWidth; if M > NX then FSelectedTextPart := 5 else begin if FTimeDisplay = tdHMS then FSelectedTextPart := 6 else begin M := M + FTimeSeparatorWidth + 2 * FDigitWidth; if M > NX then FSelectedTextPart := 6 else FSelectedTextPart := 7; end; end; end; end; end; end else begin M := 2 * FDigitWidth; if GetEffectiveDateDisplayOrder = ddoYMD then M := 2 * M; Inc(M, FSeparatorWidth div 2); if M > NX then begin FSelectedTextPart := 1; end else begin M := M + FSeparatorWidth + 2 * FDigitWidth; if M > NX then begin FSelectedTextPart := 2; end else begin FSelectedTextPart := 3 end; end; end; Invalidate; //------------------------------------------------------- end; end; procedure TCustomZVDateTimePicker.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if FTextEnabled then begin SelectTextPartUnderMouse(X); inherited MouseDown(Button, Shift, X, Y); end; end; function TCustomZVDateTimePicker.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; begin if FTextEnabled then begin SelectTextPartUnderMouse(MousePos.x); if not FReadOnly then begin if WheelDelta < 0 then DecreaseCurrentTextPart else IncreaseCurrentTextPart; Result := True; end; end; end; procedure TCustomZVDateTimePicker.CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); var TextOrigin: TPoint; M: Integer; begin RecalculateTextSizesIfNeeded; TextOrigin := GetTextOrigin; PreferredWidth := TextOrigin.x + TextOrigin.y; if Assigned(FUpDown) then Inc(PreferredWidth, FUpDown.Width) else if Assigned(FArrowButton) then Inc(PreferredWidth, FArrowButton.Width); PreferredWidth := PreferredWidth + {W + 2 * TextOrigin.y +} FTextWidth; M := 0; if BorderStyle = bsSingle then begin { Only by experimenting, I came to conclusion that BorderStyle bsSingle needs two pixels on each side around. It has nothing to do with BorderWidth property, that's apparently separate thing. Is there some property which gives this value? For now, I just assume two pixels on each side. Therefore, I add 4 to width and height: This seems to work well on both Windows (win WS) and Linux (gtk2 WS). -- and on Qt - Windows and Linux -- } PreferredWidth := PreferredWidth + 4; M := 4; end; PreferredHeight := 2 * TextOrigin.y + FTextHeight + M; end; procedure TCustomZVDateTimePicker.IncreaseCurrentTextPart; begin if DateIsNull then begin if FSelectedTextPart <= 3 then SetDateTime(SysUtils.Date) else SetDateTime(SysUtils.Now); end else begin case GetCurrentDateTextPart of dtpDay: IncreaseDay; dtpMonth: IncreaseMonth; dtpYear: IncreaseYear; else case GetCurrentTimeTextPart of ttpHour: IncreaseHour; ttpMinute: IncreaseMinute; ttpSecond: IncreaseSecond; ttpMiliSec: IncreaseMiliSec; ttpAMPM: ChangeAMPM; end; end; end; end; procedure TCustomZVDateTimePicker.DecreaseCurrentTextPart; begin if DateIsNull then begin if FSelectedTextPart <= 3 then SetDateTime(SysUtils.Date) else SetDateTime(SysUtils.Now); end else begin case GetCurrentDateTextPart of dtpDay: DecreaseDay; dtpMonth: DecreaseMonth; dtpYear: DecreaseYear; else case GetCurrentTimeTextPart of ttpHour: DecreaseHour; ttpMinute: DecreaseMinute; ttpSecond: DecreaseSecond; ttpMiliSec: DecreaseMiliSec; ttpAMPM: ChangeAMPM; end; end; end; end; procedure TCustomZVDateTimePicker.IncreaseMonth; var YMD: TYMD; N: Word; begin SelectMonth; YMD := GetYYYYMMDD(True); if YMD.Month >= 12 then YMD.Month := 1 else Inc(YMD.Month); N := NumberOfDaysInMonth(YMD.Month, YMD.Year); if YMD.Day > N then YMD.Day := N; SetYYYYMMDD(YMD); end; procedure TCustomZVDateTimePicker.IncreaseYear; var YMD: TYMD; begin SelectYear; YMD := GetYYYYMMDD(True); Inc(YMD.Year); if (YMD.Month = 2) and (YMD.Day > 28) and (not IsLeapYear(YMD.Year)) then YMD.Day := 28; SetYYYYMMDD(YMD); end; procedure TCustomZVDateTimePicker.IncreaseDay; var YMD: TYMD; begin SelectDay; YMD := GetYYYYMMDD(True); if YMD.Day >= NumberOfDaysInMonth(YMD.Month, YMD.Year) then YMD.Day := 1 else Inc(YMD.Day); SetYYYYMMDD(YMD); end; procedure TCustomZVDateTimePicker.DecreaseMonth; var YMD: TYMD; N: Word; begin SelectMonth; YMD := GetYYYYMMDD(True); if YMD.Month <= 1 then YMD.Month := 12 else Dec(YMD.Month); N := NumberOfDaysInMonth(YMD.Month, YMD.Year); if YMD.Day > N then YMD.Day := N; SetYYYYMMDD(YMD); end; procedure TCustomZVDateTimePicker.DecreaseYear; var YMD: TYMD; begin SelectYear; YMD := GetYYYYMMDD(True); Dec(YMD.Year); if (YMD.Month = 2) and (YMD.Day > 28) and (not IsLeapYear(YMD.Year)) then YMD.Day := 28; SetYYYYMMDD(YMD); end; procedure TCustomZVDateTimePicker.DecreaseDay; var YMD: TYMD; begin SelectDay; YMD := GetYYYYMMDD(True); if YMD.Day <= 1 then YMD.Day := NumberOfDaysInMonth(YMD.Month, YMD.Year) else Dec(YMD.Day); SetYYYYMMDD(YMD); end; procedure TCustomZVDateTimePicker.IncreaseHour; var HMSMs: THMSMs; begin SelectHour; HMSMs := GetHMSMs(True); if HMSMs.Hour >= 23 then HMSMs.Hour := 0 else Inc(HMSMs.Hour); SetHMSMs(HMSMs); end; procedure TCustomZVDateTimePicker.IncreaseMinute; var HMSMs: THMSMs; begin SelectMinute; HMSMs := GetHMSMs(True); if HMSMs.Minute >= 59 then HMSMs.Minute := 0 else Inc(HMSMs.Minute); SetHMSMs(HMSMs); end; procedure TCustomZVDateTimePicker.IncreaseSecond; var HMSMs: THMSMs; begin SelectSecond; HMSMs := GetHMSMs(True); if HMSMs.Second >= 59 then HMSMs.Second := 0 else Inc(HMSMs.Second); SetHMSMs(HMSMs); end; procedure TCustomZVDateTimePicker.IncreaseMiliSec; var HMSMs: THMSMs; begin SelectMiliSec; HMSMs := GetHMSMs(True); if HMSMs.MiliSec >= 999 then HMSMs.MiliSec := 0 else Inc(HMSMs.MiliSec); SetHMSMs(HMSMs); end; procedure TCustomZVDateTimePicker.DecreaseHour; var HMSMs: THMSMs; begin SelectHour; HMSMs := GetHMSMs(True); if HMSMs.Hour <= 0 then HMSMS.Hour := 23 else Dec(HMSMs.Hour); SetHMSMs(HMSMs); end; procedure TCustomZVDateTimePicker.DecreaseMinute; var HMSMs: THMSMs; begin SelectMinute; HMSMs := GetHMSMs(True); if HMSMs.Minute <= 0 then HMSMs.Minute := 59 else Dec(HMSMs.Minute); SetHMSMs(HMSMs); end; procedure TCustomZVDateTimePicker.DecreaseSecond; var HMSMs: THMSMs; begin SelectSecond; HMSMs := GetHMSMs(True); if HMSMs.Second <= 0 then HMSMs.Second := 59 else Dec(HMSMs.Second); SetHMSMs(HMSMs); end; procedure TCustomZVDateTimePicker.DecreaseMiliSec; var HMSMs: THMSMs; begin SelectMiliSec; HMSMs := GetHMSMs(True); if HMSMs.MiliSec <= 0 then HMSMs.MiliSec := 999 else Dec(HMSMs.MiliSec); SetHMSMs(HMSMs); end; procedure TCustomZVDateTimePicker.ChangeAMPM; var HMSMs: THMSMs; begin SelectAMPM; HMSMs := GetHMSMs(True); if HMSMs.Hour >= 12 then Dec(HMSMS.Hour, 12) else Inc(HMSMS.Hour, 12); SetHMSMs(HMSMs); end; procedure TCustomZVDateTimePicker.UpdateDate; var W: Array[1..3] of Word; WT: Array[TTimeTextPart] of Word; YearPos, I: Integer; TTP, TTPEnd: TTimeTextPart; begin FUserChangedText := False; if not (DateIsNull or FJumpMinMax) then begin if Int(FDateTime) > FMaxDate then FDateTime := ComposeDateTime(FMaxDate, FDateTime); if FDateTime < FMinDate then FDateTime := ComposeDateTime(FMinDate, FDateTime); end; if FKind in [dtkTime, dtkDateTime] then begin if DateIsNull then begin FTimeText[ttpHour] := '99'; FTimeText[ttpMinute] := '99'; FTimeText[ttpMiliSec] := ''; if FTimeDisplay >= tdHMS then begin FTimeText[ttpSecond] := '99'; if FTimeDisplay >= tdHMSMs then FTimeText[ttpMiliSec] := '999'; end else FTimeText[ttpSecond] := ''; if FTimeFormat = tf12 then FTimeText[ttpAMPM] := 'XX' else FTimeText[ttpAMPM] := ''; end else begin case FTimeDisplay of tdHMSMs: TTPEnd := ttpMiliSec; tdHMS: TTPEnd := ttpSecond; else TTPEnd := ttpMinute; end; DecodeTime(FDateTime, WT[ttpHour], WT[ttpMinute], WT[ttpSecond], WT[ttpMiliSec]); if FTimeFormat = tf12 then begin if WT[ttpHour] < 12 then begin FTimeText[ttpAMPM] := 'AM'; if WT[ttpHour] = 0 then WT[ttpHour] := 12; end else begin FTimeText[ttpAMPM] := 'PM'; if WT[ttpHour] > 12 then Dec(WT[ttpHour], 12); end; end else FTimeText[ttpAMPM] := ''; if FLeadingZeros then FTimeText[ttpHour] := RightStr('0' + IntToStr(WT[ttpHour]), 2) else FTimeText[ttpHour] := IntToStr(WT[ttpHour]); for TTP := ttpMinute to ttpMiliSec do begin if TTP <= TTPEnd then begin if TTP = ttpMiliSec then FTimeText[TTP] := RightStr('00' + IntToStr(WT[TTP]), 3) else FTimeText[TTP] := RightStr('0' + IntToStr(WT[TTP]), 2); end else FTimeText[TTP] := ''; end; end; end else for TTP := Low(TTimeTextPart) to High(TTimeTextPart) do FTimeText[TTP] := ''; if FKind in [dtkDate, dtkDateTime] then begin if DateIsNull then begin if GetEffectiveDateDisplayOrder = ddoYMD then begin FTextPart[1] := '0000'; FTextPart[3] := '00'; end else begin FTextPart[1] := '00'; FTextPart[3] := '0000'; end; FTextPart[2] := '00'; end else begin DecodeDate(FDateTime, W[3], W[2], W[1]); YearPos := 3; case GetEffectiveDateDisplayOrder of ddoMDY: Exchange(W[1], W[2]); ddoYMD: begin Exchange(W[1], W[3]); YearPos := 1; end; end; for I := Low(FTextPart) to High(FTextPart) do begin if I = YearPos then FTextPart[I] := RightStr('000' + IntToStr(W[I]), 4) else if FLeadingZeros then FTextPart[I] := RightStr('0' + IntToStr(W[I]), 2) else FTextPart[I] := IntToStr(W[I]); end; end; end else for I := Low(FTextPart) to High(FTextPart) do FTextPart[I] := ''; if FStoredLockCount = 0 then ConfirmChanges; Invalidate; end; procedure TCustomZVDateTimePicker.DoEnter; begin inherited DoEnter; Invalidate; end; procedure TCustomZVDateTimePicker.DoExit; begin ConfirmChanges; inherited DoExit; Invalidate; end; procedure TCustomZVDateTimePicker.Click; begin if FTextEnabled then inherited Click; end; procedure TCustomZVDateTimePicker.DblClick; begin if FTextEnabled then inherited DblClick; end; procedure TCustomZVDateTimePicker.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if FTextEnabled then inherited MouseUp(Button, Shift, X, Y); end; procedure TCustomZVDateTimePicker.KeyUp(var Key: Word; Shift: TShiftState); begin if FTextEnabled then inherited KeyUp(Key, Shift); end; procedure TCustomZVDateTimePicker.UTF8KeyPress(var UTF8Key: TUTF8Char); begin if FTextEnabled then inherited UTF8KeyPress(UTF8Key); end; procedure TCustomZVDateTimePicker.SelectDay; begin SelectDateTextPart(dtpDay); end; procedure TCustomZVDateTimePicker.SelectMonth; begin SelectDateTextPart(dtpMonth); end; procedure TCustomZVDateTimePicker.SelectYear; begin SelectDateTextPart(dtpYear); end; procedure TCustomZVDateTimePicker.SelectHour; begin SelectTimeTextPart(ttpHour); end; procedure TCustomZVDateTimePicker.SelectMinute; begin SelectTimeTextPart(ttpMinute); end; procedure TCustomZVDateTimePicker.SelectSecond; begin SelectTimeTextPart(ttpSecond); end; procedure TCustomZVDateTimePicker.SelectMiliSec; begin SelectTimeTextPart(ttpMiliSec); end; procedure TCustomZVDateTimePicker.SelectAMPM; begin SelectTimeTextPart(ttpAMPM); end; procedure TCustomZVDateTimePicker.SetEnabled(Value: Boolean); begin if GetEnabled <> Value then begin inherited SetEnabled(Value); CheckTextEnabled; Invalidate; end; end; // I had to override CreateWnd, because in design time on Linux Lazarus crashes // if we try to do anchoring of child controls in constructor. // Therefore, I needed to ensure that controls anchoring does not take place // before CreateWnd has done. So, I moved all anchoring code to a procedure // ArrangeCtrls and introduced a boolean field FDoNotArrangeControls which // prevents that code from executing before CreateWnd. //!!! Later, I simplified the arranging procedure, so maybe it can be done now // before window creation is done. It's better to leave this delay system, // anyway -- we might change anchoring code again for some reason. procedure TCustomZVDateTimePicker.CreateWnd; begin inherited CreateWnd; if FDoNotArrangeControls then begin { This field is set to True in constructor. Its purpose is to prevent control anchoring until this point. That's because on Linux Lazarus crashes when control is dropped on form in designer if particular anchoring code executes before CreateWnd has done its job. } FDoNotArrangeControls := False; ArrangeCtrls; end; end; procedure TCustomZVDateTimePicker.SetDateTimeJumpMinMax(const AValue: TDateTime); begin FJumpMinMax := True; try SetDateTime(AValue); finally FJumpMinMax := False; end; end; procedure TCustomZVDateTimePicker.ArrangeCtrls; begin if not FDoNotArrangeControls then begin //Read the note above CreateWnd procedure. DisableAutoSizing; DisableAlign; try if GetShowCheckBox then begin FCheckBox.Align := alLeft; FCheckBox.BorderSpacing.Left := 2; FCheckBox.BringToFront; FCheckBox.OnChange := @CheckBoxChange; end; CheckTextEnabled; InvalidatePreferredSize; AdjustSize; Invalidate; finally EnableAlign; EnableAutoSizing; end; end; end; procedure TCustomZVDateTimePicker.Change; begin if Assigned(FOnChange) then FOnChange(Self); end; procedure TCustomZVDateTimePicker.SelectDate; begin if FSelectedTextPart > 3 then SelectDay; end; procedure TCustomZVDateTimePicker.SelectTime; begin if FSelectedTextPart < 4 then SelectHour; end; procedure TCustomZVDateTimePicker.Paint; var I, M, N, K: Integer; DD: Array[1..8] of Integer; R: TRect; SelectStep: 0..8; TextStyle: TTextStyle; begin if FRecalculatingTextSizesNeeded then begin if AutoSize then begin InvalidatePreferredSize; AdjustSize; end; RecalculateTextSizesIfNeeded; end; TextStyle := Canvas.TextStyle; Canvas.Brush.Style := bsSolid; Canvas.Brush.Color := Color; Canvas.FillRect(ClientRect); R.TopLeft := GetTextOrigin; M := 2 * R.Top + FTextHeight; M := (ClientHeight - M) div 2; Inc(R.Top, M); R.Bottom := R.Top + FTextHeight; TextStyle.Layout := tlCenter; TextStyle.Wordbreak := False; TextStyle.Opaque := False; if DateIsNull and (FTextForNullDate > '') and (not (FTextEnabled and Focused)) then begin R.Right := MaxInt; TextStyle.Alignment := taLeftJustify; if FTextEnabled then Canvas.Font.Color := Font.Color else Canvas.Font.Color := clGrayText; Canvas.TextRect(R, R.Left, R.Top, FTextForNullDate, TextStyle); end else begin TextStyle.Alignment := taRightJustify; SelectStep := 0; if FTextEnabled then begin Canvas.Font.Color := Font.Color; if Focused then SelectStep := FSelectedTextPart; end else begin Canvas.Font.Color := clGrayText; end; if FKind in [dtkDate, dtkDateTime] then begin DD[2] := 2 * FDigitWidth; if GetEffectiveDateDisplayOrder = ddoYMD then begin DD[1] := 4 * FDigitWidth; DD[3] := 2 * FDigitWidth; end else begin DD[1] := 2 * FDigitWidth; DD[3] := 4 * FDigitWidth; end; M := 1; end else begin M := 4; //for I := 1 to 3 do DD[I] := 0; end; if FKind in [dtkTime, dtkDateTime] then begin DD[4] := 2 * FDigitWidth; DD[5] := 2 * FDigitWidth; if FTimeDisplay = tdHMSMs then begin DD[7] := 3 * FDigitWidth; DD[6] := 2 * FDigitWidth; K := 7; end else begin DD[7] := 0; if FTimeDisplay = tdHM then begin DD[6] := 0; K := 5; end else begin DD[6] := 2 * FDigitWidth; K := 6; end; end; if FTimeFormat = tf12 then begin N := 8; DD[8] := FAMPMWidth; end else begin DD[8] := 0; N := K; end; end else begin N := 3; K := 3; end; for I := M to N do begin if DD[I] <> 0 then begin if SelectStep = I then begin TextStyle.Opaque := True; Canvas.Brush.Color := clHighlight; Canvas.Font.Color := clHighlightText; end; R.Right := R.Left + DD[I]; if I <= 3 then Canvas.TextRect(R, R.Left, R.Top, FTextPart[I], TextStyle) else Canvas.TextRect(R, R.Left, R.Top, FTimeText[TTimeTextPart(I - 4)], TextStyle); R.Left := R.Right; if SelectStep = I then begin TextStyle.Opaque := False; Canvas.Brush.Color := Color; Canvas.Font.Color := Self.Font.Color; end; if I < 3 then begin R.Right := R.Left + FSeparatorWidth; Canvas.TextRect(R, R.Left, R.Top, FDateSeparator, TextStyle); end else if I > 3 then begin if I = K then begin R.Right := R.Left + FDigitWidth; end else if I < K then begin R.Right := R.Left + FTimeSeparatorWidth; Canvas.TextRect(R, R.Left, R.Top, FTimeSeparator, TextStyle); end; end else begin if FTrailingSeparator then begin R.Right := R.Left + FSepNoSpaceWidth; Canvas.TextRect(R, R.Left, R.Top, TrimRight(FDateSeparator), TextStyle); end; if FKind = dtkDateTime then R.Right := R.Right + 2 * FDigitWidth; end; R.Left := R.Right; end; end; end; inherited Paint; end; procedure TCustomZVDateTimePicker.EditingDone; begin UpdateIfUserChangedText; inherited EditingDone; end; procedure TCustomZVDateTimePicker.ArrowMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin DropDownCalendarForm; end; procedure TCustomZVDateTimePicker.UpDownClick(Sender: TObject; Button: TUDBtnType); begin if CanFocus then SetFocus; if not FReadOnly then begin if Button = btNext then IncreaseCurrentTextPart else DecreaseCurrentTextPart; end; end; procedure TCustomZVDateTimePicker.DoDropDown; begin if Assigned(FOnDropDown) then FOnDropDown(Self); end; procedure TCustomZVDateTimePicker.DoCloseUp; begin if Assigned(FOnCloseUp) then FOnCloseUp(Self); end; function TCustomZVDateTimePicker.GetChecked: Boolean; begin Result := (not Assigned(FCheckBox)) or (FCheckBox.State = cbChecked); end; { DrawArrowButtonGlyph ---------------------- Draws the arrow shape on button (when DateMode dmComboBox is set). } procedure TCustomZVDateTimePicker.DrawArrowButtonGlyph; const ArrowColor = TColor($8D665A); begin // First I ment to put arrow images in a lrs file. In my opinion, however, that // wouldn't be an elegant option for so simple shapes. if Assigned(FArrowButton) then begin FArrowButton.Glyph.SetSize(9, 6); FArrowButton.Glyph.Canvas.Brush.Style := bsSolid; FArrowButton.Glyph.Canvas.Brush.Color := clSkyBlue; FArrowButton.Glyph.Canvas.FillRect(0, 0, 9, 6); FArrowButton.Glyph.Canvas.Pen.Color := ArrowColor; FArrowButton.Glyph.Canvas.Brush.Color := FArrowButton.Glyph.Canvas.Pen.Color; { Let's draw shape of the arrow on the button: } case FArrowShape of asClassicLarger: { triangle: } FArrowButton.Glyph.Canvas.Polygon([Point(0, 1), Point(8, 1), Point(4, 5)]); asClassicSmaller: { triangle -- smaller variant: } FArrowButton.Glyph.Canvas.Polygon([Point(1, 2), Point(7, 2), Point(4, 5)]); asModernLarger: { modern: } FArrowButton.Glyph.Canvas.Polygon([Point(0, 1), Point(1, 0), Point(4, 3), Point(7, 0), Point(8, 1), Point(4, 5)]); asModernSmaller: { modern -- smaller variant: } FArrowButton.Glyph.Canvas.Polygon([Point(1, 2), Point(2, 1), Point(4, 3), Point(6, 1), Point(7, 2), Point(4, 5)]); asYetAnotherShape: { something in between, not very pretty: } FArrowButton.Glyph.Canvas.Polygon([Point(0, 1), Point(1, 0), Point(2, 1), Point(6, 1),Point(7, 0), Point(8, 1), Point(4, 5)]); end; FArrowButton.Glyph.Mask(clSkyBlue); end; end; function TCustomZVDateTimePicker.AreSeparatorsStored: Boolean; begin Result := not FUseDefaultSeparators; end; function TCustomZVDateTimePicker.GetDate: TDate; begin if DateIsNull then Result := NullDate else Result := Int(FDateTime); end; function TCustomZVDateTimePicker.GetDateTime: TDateTime; begin if DateIsNull then Result := NullDate else Result := FDateTime; end; function TCustomZVDateTimePicker.GetShowCheckBox: Boolean; begin Result := Assigned(FCheckBox); end; function TCustomZVDateTimePicker.GetTime: TTime; begin if DateIsNull then Result := NullDate else Result := Abs(Frac(FDateTime)); end; procedure TCustomZVDateTimePicker.SetArrowShape(const AValue: TArrowShape); begin if FArrowShape = AValue then Exit; FArrowShape := AValue; DrawArrowButtonGlyph; end; procedure TCustomZVDateTimePicker.SetCenturyFrom(const AValue: Word); begin if FCenturyFrom = AValue then Exit; FCenturyFrom := AValue; AdjustEffectiveCenturyFrom; end; procedure TCustomZVDateTimePicker.CheckBoxChange(Sender: TObject); begin CheckTextEnabled; if CanFocus then SetFocus; Invalidate; end; procedure TCustomZVDateTimePicker.CalendarMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if FCal.HitTest(Point(X, Y)) in [cpDate, cpNoWhere] then begin // According to tests made by Željko Rikalo, // on Qt widgetset the calendar's DateTime field does not get updated if // we close the calendar form here, because on Qt change is not made until // after the OnMouseUp event. // Let's then try something else, as proposed by Željko: // Closing the calendar form is moved to Calendar.OnChange. {$IFDEF QT_BEFORE_0_9_29} // Željko changed the Qt behaviour since Lazarus 0.9.29, revision 23641. FCloseCalendarOnChange := True; // This is asked in // CalendarChange procedure. {$ELSE} // On the other hand, on other widgetsets, the previous wouldn't work // because OnChange gets called before OnMoueseUp event, so the OnChange // event is already executed when we are here, so it's too late to notify // it now. // But the calendar's date is already changed then and we can simply // call CloseCalendarForm immidiately. CloseCalendarForm(True); {$ENDIF} end; end; procedure TCustomZVDateTimePicker.CalendarChange(Sender: TObject); begin {$IFDEF QT_BEFORE_0_9_29} // See the coments in CalendarMouseUp procedure. if FCloseCalendarOnChange then CloseCalendarForm(True); {$ENDIF} end; procedure TCustomZVDateTimePicker.CalendarKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Key of VK_ESCAPE: CloseCalendarForm; VK_RETURN, VK_SPACE: CloseCalendarForm(True); end; end; procedure TCustomZVDateTimePicker.CalendarFormDeactivate(Sender: TObject); begin if not FClosingCalendarForm then CloseCalendarForm; end; procedure TCustomZVDateTimePicker.CalendarFormShow(Sender: TObject); begin FClosingCalendarForm := False; AdjustCalendarFormSize; DoDropDown; // calls OnDropDown event handler end; procedure TCustomZVDateTimePicker.CalendarFormClose(Sender: TObject; var CloseAction: TCloseAction); begin FClosingCalendarForm := True; CloseAction := caFree; end; procedure TCustomZVDateTimePicker.CalendarFormDestroy(Sender: TObject); begin DestroyTheCalendar; FCalendarForm := nil; end; procedure TCustomZVDateTimePicker.CloseCalendarForm(AndSetTheDate: Boolean); begin if Assigned(FCalendarForm) and (not FClosingCalendarForm) then begin FClosingCalendarForm := True; if AndSetTheDate then begin if DateIsNull then begin // we'll set the time to 0.0 (midnight): ChangeDateTimeInternally(Int(FCal.DateTime)); end else if not EqualDateTime(Int(DateTime), Int(FCal.DateTime)) then begin // we'll change the date, but keep the time: ChangeDateTimeInternally(ComposeDateTime(FCal.DateTime, DateTime)); end; end; if CanFocus then SetFocus; FCalendarForm.Close; DoCloseUp; end; end; procedure TCustomZVDateTimePicker.DropDownCalendarForm; {$IFNDEF LCLWin32} var F: TCustomForm; {$ENDIF} begin if CanFocus then SetFocus; if not (FReadOnly or Assigned(FCalendarForm)) then begin try CreateCalendarForm; if DateIsNull then FCal.DateTime := Max(MinDate, Min(SysUtils.Date, MaxDate)) else if DateTime < MinDate then // These "out of bounds" values can FCal.DateTime := MinDate // happen when DateTime was set with else if DateTime > MaxDate then // "SetDateTimeJumpMinMax" protected FCal.DateTime := MaxDate // procedure (used in TDBZVDateTimePicker control). else FCal.DateTime := DateTime; {$IFNDEF LCLWin32} // On Gtk2, it seems that if a non-modal form is shown on top // of a modal one, it can't get user interaction. So it is useless then. // Therefore, if our parent is shown modally, we must show the calendar // on a modal form too. // Seems that it applies to Qt also! F := GetParentForm(Self); if Assigned(F) and (fsModal in F.FormState) then FCalendarForm.ShowModal else {$ENDIF} FCalendarForm.Show; finally if Assigned(FCalendarForm) and (not FCalendarForm.Visible) then DestroyCalendarForm; end; end; end; type { TDTUpDown } { The two buttons contained by UpDown control are never disabled in original UpDown class. This class is defined here to override this behaviour. } TDTUpDown = class(TCustomUpDown) protected procedure SetEnabled(Value: Boolean); override; procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); override; end; { TDTSpeedButton } TDTSpeedButton = class(TSpeedButton) protected procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); override; end; { TDTUpDown } { When our UpDown control gets enabled/disabled, the two its buttons' Enabled property is set accordingly. } procedure TDTUpDown.SetEnabled(Value: Boolean); var I: Integer; begin inherited SetEnabled(Value); for I := 0 to ControlCount - 1 do begin Controls[I].Enabled := Value; end; end; { Our UpDown control is always alligned, but setting its PreferredHeight uncoditionally to 1 prevents the UpDown to mess with our PreferredHeight. The problem is that if we didn't do this, when our Height is greater than really preffered, UpDown prevents it to be set correctly when we set AutoSize to True. } procedure TDTUpDown.CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); begin inherited CalculatePreferredSize(PreferredWidth, PreferredHeight, WithThemeSpace); PreferredHeight := 1; end; { TDTSpeedButton } procedure TDTSpeedButton.CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); begin inherited CalculatePreferredSize(PreferredWidth, PreferredHeight, WithThemeSpace); PreferredHeight := 1; end; procedure TCustomZVDateTimePicker.UpdateShowArrowButton( NewDateMode: TDTDateMode; NewKind: TDateTimeKind); procedure CreateArrowBtn; begin if not Assigned(FArrowButton) then begin DestroyUpDown; FArrowButton := TDTSpeedButton.Create(Self); FArrowButton.ControlStyle := FArrowButton.ControlStyle + [csNoFocus, csNoDesignSelectable]; FArrowButton.SetBounds(0, 0, 17, 1); FArrowButton.Align := alRight; FArrowButton.BringToFront; DrawArrowButtonGlyph; FArrowButton.Parent := Self; FArrowButton.OnMouseDown := @ArrowMouseDown; end; end; procedure CreateUpDown; begin if not Assigned(FUpDown) then begin DestroyArrowBtn; FUpDown := TDTUpDown.Create(Self); FUpDown.ControlStyle := FUpDown.ControlStyle + [csNoFocus, csNoDesignSelectable]; FUpDown.SetBounds(0, 0, 15, 1); FUpDown.Parent := Self; FUpDown.Align := alRight; FUpDown.BringToFront; TDTUpDown(FUPDown).OnClick := @UpDownClick; end; end; var ReallyShowCalendar: Boolean; begin if NewDateMode = dmNone then begin DestroyArrowBtn; DestroyUpDown; end else begin ReallyShowCalendar := (NewDateMode = dmComboBox) and (NewKind <> dtkTime); if (ReallyShowCalendar <> Assigned(FArrowButton)) or (Assigned(FArrowButton) = Assigned(FUpDown)) then begin if ReallyShowCalendar then CreateArrowBtn else CreateUpDown; ArrangeCtrls; end; end; end; procedure TCustomZVDateTimePicker.DestroyUpDown; begin if Assigned(FUpDown) then begin TDTUpDown(FUPDown).OnClick := nil; FreeAndNil(FUpDown); end; end; procedure TCustomZVDateTimePicker.DestroyArrowBtn; begin if Assigned(FArrowButton) then begin FArrowButton.OnMouseDown := nil; DestroyCalendarForm; FreeAndNil(FArrowButton); end; end; procedure TCustomZVDateTimePicker.CalendarResize(Sender: TObject); begin AdjustCalendarFormSize; end; constructor TCustomZVDateTimePicker.Create(AOwner: TComponent); var I: Integer; TTP: TTimeTextPart; begin inherited Create(AOwner); with GetControlClassDefaultSize do begin {$IFDEF LCL_0_9_29_OR_AFTER} SetInitialBounds(0, 0, cx, cy); // TSize since 0.9.29, svn rev. 25204 {$ELSE} SetInitialBounds(0, 0, x, y); // TPoint in older Lazarus versions {$ENDIF} end; FArrowShape := asModernSmaller; FOnDropDown := nil; FOnCloseUp := nil; FOnChange := nil; FForceShowCalendar := False; ParentColor := False; FCheckBox := nil; FArrowButton := nil; FUpDown := nil; FKind := dtkDate; FNullInputAllowed := True; FTextForNullDate := 'NULL'; FCenturyFrom := 1941; FRecalculatingTextSizesNeeded := True; FOnChange := nil; FSeparatorWidth := 0; FSepNoSpaceWidth := 0; FDigitWidth := 0; FTimeSeparatorWidth := 0; FAMPMWidth := 0; FDateWidth := 0; FTimeWidth := 0; FTextWidth := 0; FTextHeight := 0; for I := Low(FTextPart) to High(FTextPart) do FTextPart[I] := ''; for TTP := Low(TTimeTextPart) to High(TTimeTextPart) do FTimeText[TTP] := ''; FTimeDisplay := tdHMS; FTimeFormat := tf24; FLeadingZeros := True; FStoredLockCount := 0; FReadOnly := False; FDateTime := SysUtils.Now; FConfirmedDate := FDateTime; FMinDate := TheSmallestDate; FMaxDate := TheBiggestDate; FTrailingSeparator := False; FDateDisplayOrder := ddoTryDefault; FSelectedTextPart := 1; FUseDefaultSeparators := True; FDateSeparator := SysUtils.DateSeparator; FTimeSeparator := SysUtils.TimeSeparator; FEffectiveCenturyFrom := FCenturyFrom; FJumpMinMax := False; ParentColor := False; TabStop := True; BorderWidth := 2; BorderStyle := bsSingle; ParentFont := True; AutoSize := True; UpdateDate; FTextEnabled := True; BorderStyle := bsSingle; AutoSize := True; TabStop := True; FShape := nil; FCal := nil; FCalendarForm := nil; FDoNotArrangeControls := True; DateMode := dmComboBox; end; destructor TCustomZVDateTimePicker.Destroy; begin FDoNotArrangeControls := True; DestroyUpDown; DestroyArrowBtn; SetShowCheckBox(False); inherited Destroy; end; function TCustomZVDateTimePicker.DateIsNull: Boolean; begin Result := IsNullDate(FDateTime); end; end. doublecmd-0.5.8/components/ZVDateTimeCtrls/zvdatetimectrls.pas0000644000175000017500000000074012014201074023600 0ustar alexxalexx{ This file was automatically created by Lazarus. Do not edit! This source is only used to compile and install the package. } unit ZVDateTimeCtrls; interface uses ZVDateTimePicker, DBZVDateTimePicker, ZVDateTimePickerPropEdit, ZVDateTimeControlsReg, LazarusPackageIntf; implementation procedure Register; begin RegisterUnit('ZVDateTimeControlsReg', @ZVDateTimeControlsReg.Register); end; initialization RegisterPackage('ZVDateTimeCtrls', @Register); end. doublecmd-0.5.8/components/ZVDateTimeCtrls/ReadMe.htm0000644000175000017500000005757411621410437021547 0ustar alexxalexx

ZVDateTimeControls Package for Lazarus


http://wiki.lazarus.freepascal.org/ZVDateTimeControls_Package



The ZVDateTimeControls package contains two controls:


TZVDateTimePicker


TDBZVDateTimePicker


Author

Zoran Vuenovi


License

Modified LGPL, same as Lazarus component library.


Introduction

Delphi's VCL has a control named TDateTimePicker, which I find very useful for editing dates. LCL, however, does not have this control. Instead, for editing dates LCL has a control named TDateEdit, but I prefer the VCL's TDateTimePicker.


Therefore, I tried to create a cross-platform Lazarus control which would resemble VCL's TDateTimePicker as much as possible.


The TZVDateTimePicker control does not use native Win control. It descends from LCL-s TCustomControl to be cross-platform. It has been written and initially tested on Windows XP with Win widget set, but then tested on Ubuntu Linux 9.10 with gtk2 widget set, where additional adjustments had been made.


Note that the TZVDateTimePicker control does not descend from TEdit, so it does not have unnecessary caret. The VCL's control doesn't have caret either.


Installation

To install the package in Lazarus IDE follow these steps:


    1. Open the package in Package Editor (in Lazarus' main menu click Package, then Open package file... locate the file zvdatetimecontrols.lpk and click Open).

    2. Compile the package (click Compile in Package Editor's tool bar).

    3. Install the package in the IDE (click Install – you will be asked if you want to rebuild Lazarus, click Yes. Wait until Lazarus rebuilds and restarts itself. The new tab “Date and Time Ctrs” appears on the component palette with TZVDateTimePicker and TDBZVDateTimePicker controls.


Change Log

For more details about changes, see ChangeLog.txt


Version 1.0 – 27. February 2010.

Version 1.1 – 17. April 2010.

Version 1.2 – 12. May 2010.

Version 1.3 – 1. April 2011.


TZVDateTimePicker

Properties:

I'll explain some properties of TZVDateTimePicker control:


DateTime: TDateTime (public)

The DateTime value displayed on the control. This property is not published in object inspector, but its value is actually the same as Date and Time properties composed in one value. This property is provided to allow setting or reading of both date and time value at once in program code. In design time, Date and Time can be set in object inspector. There is also component editor which provides easy way of setting this property in design time.


Date: TDate

The date displayed on the control which the user can edit.


Time: TTime

The time displayed on the control which the user can edit.


MinDate: TDate

The minimal date user can enter.


MaxDate: TDate

The maximal date user can enter.


NullInputAllowed: Boolean

When True, the user can set the date to NullDate constant by pressing N key.


CenturyFrom: Word

When user enters the year in two-digit format, then the CenturyFrom property is used to determine which century the year belongs to. The default is 1941, which means that when two digit years is entered, it falls in interval 1941 – 2040. Note that MinDate and MaxDate properties can also have influence on the decision – for example, if the CenturyFrom is set to 1941 and MaxDate to 31. 12. 2010, if user enters year 23, it will be set to 1923, because it can’t be 2033, due to MaxDate limit.


Kind: TDateTimeKind

type TDateTimeKind = (dtkDate, dtkTime, dtkDateTime);

The control displays only date, only time or both.


DateMode: TDTDateMode

type TDTDateMode = (dmComboBox, dmUpDown, dmNone);

When DateMode is set to dmComboBox, there is a button on the right side of the control. When user clicks the button, the calendar control is shown, allowing the user to pick the date. When set to dmUpDown, then UpDown buttons are shown.

In my opinion the UpDown buttons aren't really useful in this control, they are provided for compatibility with Delphi's TDateTimePicker. Up and down keys can always serve for same purpose, so can mouse wheel.

In the next picture the first control's DateMode is set to dmComboBox and the second control's to dmUpDown.

If DateMode is dmComboBox, when the user clicks on the button a calendar drops down, allowing the user to pick a date.


Note: if Kind property is set to dtkTime, the calendar control is pointless. Therefore, if DateMode is dmComboBox, the UpDown is shown instead.


ShowCheckBox: Boolean

When set, there is a check box on the left side of the control. When unchecked, the display appears grayed and user interaction with the date or time is not possible. (The control is still enabled, though, only in sense that the check box remains enabled).



Checked: Boolean

If ShowCheckBox is set to True, this property determines whether the check box is checked or not. If ShowCheckBox is False, this property has no purpose and is automatically set to True.


DateDisplayOrder: TDateDisplayOrder

type TDateDisplayOrder = (ddoDMY, ddoMDY, ddoYMD, ddoTryDefault);

Defines the order for displaying day, month and year part of the date. When ddoTryDefault is set, then the controls tries to determine the order from ShortDateFormat global variable.

This is similar to DateEdit's DateOrder property.


DateSeparator: UTF8String

Defines the string used to separate date, month and year date parts. Setting this property automatically sets the UseDefaultSeparators property to False. To ensure that date and time separators are set to user's system defaults, set UseDefaultSeparators property to True.


TimeSeparator: UTF8String

Defines the string used to separate hour, minute, second and millisecond time parts. Setting this property automatically sets the UseDefaultSeparators property to False. To ensure that date and time separators are set to user's system defaults, set UseDefaultSeparators property to True.


UseDefaultSeparators: Boolean

When this property is set to True, then the DateSeparator and TimeSeparator properties will be set to DateSeparator and TimeSeparator global variables, which are set to user system defaults when application initializes.


TrailingSeparator: Boolean

When set to True, then the DateSeparator is shown once more, after the last date part. This property exists because in some languages the correct date format is 31. 1. 2010. including the last point, after the year.


LeadingZeros: Boolean

Determines whether the date and time parts are displayed with or without leading zeros (this actually affects day, month and hour parts of date and time display).


TimeDisplay: TTimeDisplay

type TTimeDisplay = (tdHM, tdHMS, tdHMSMs);

If Kind is dtkTime or dtkDateTime, then TimeDisplay value of tdHM means that only hours and minutes are displayed, tdHMS adds displaying of seconds and value of tdHMSMs means that milliseconds are displayed too.


TimeFormat: TTimeFormat

type TTimeFormat = (tf12, tf24);

The value of tf12 sets the display of time to 12 hours format, with AM/PM string and tf24 sets to 24 hours format.


TextForNullDate: UTF8String

Text which appears when the null date is set and control does not have focus. When control is focused, the text changes to defined format, but displaying zeros for date, and nines for time (for example "00/00/0000 99:99:99"), which is appropriate to user input. User can set the date to NullDate by pressing N key, provided NullInputAllowed property is True.


TDBZVDateTimePicker

TDBZVDateTimePicker is a data-aware version of TZVDateTimePicker, with nice way of handling null database values.


Displaying null values

When the underlying DB field has null value, then:
    • If the control is not focused, then it displays the text defined in TextForNullDate property. The default is "NULL".
    • When the control gets focus, the text changes to defined format, but displaying zeros for date parts and nines for time parts (for example "00/00/0000 99:99:99"), which is appropriate to user input.

Setting the field value to null

If NullInputAllowed property is True, the user can set the date and time to null, by pressing N key.

ZVDateTimePicker Editor

ZVDateTimePicker Editor is a dialog which provides easy way to set Date, Time, MinDate and MaxDate properties in design time. It is invoked when ZVDateTimePicker control is double-clicked in form designer. It is also shown when the elipsis (…) button shown in Date, Time, MinDate and MaxDate properties in Object inspector gets clicked.


doublecmd-0.5.8/components/ZVDateTimeCtrls/ChangeLog.txt0000644000175000017500000000537212014201074022245 0ustar alexxalexx=================================================== Version 1.0 -- 27. Feb. 2010. Initial release =================================================== Version 1.1 -- 18. April 2010. The Data aware control's (DBZVDateTimePicker's) interacting with DataSource is slightly improved. There are also several fixes, these are some of them. The first three fixes apply to DBZVDateTimePicker control only, the fourth, fifth and sixth apply to both controls. 1. In runtime changing date/time in DBZVDateTimePicker was possible when not connected to database. When not connected to specific DB field, or when the Database connection is not active, now the control can only have NULL value, which is appropriate behaviour for a DB control. 2. The Time property was accidentaly published in DBZVDateTimePicker. Time property, as well as Date, cannot be used directly in DBZVDateTimePicker, it is tied to underlying DB field. The Time property is removed from published section of TDBZVDateTimePicker. 3. The DBZVDateTimePicker's properties MaxDate and MinDate were displayed as real numbers in Object inspector. They are now displayed as dates. 4. The Hint property didn't work -- the hint didn't appear. Now the Hint is shown when mouse pointer is over the control, of course only if ShowHint is set to True. 5. When calendar button is shown and AutoSize is False and the width is less than Text's width + SpeedButton's width, then the button gets hidden behind the text. Now, the button is shown in front of the text, which is more appropriate behaviour. 6. When UpDown is shown and AutoSize is False, if Heigth is set to more than it would be if AutoSized, then, setting AutoSize to True would not trigger shirnking the control's Height as it should. Fixed, now it does. =================================================== Version 1.2 -- 12. May 2010. Because of changes in LCL, some changes in code were needed, so that controls can compile with new Lazarus from svn trunk (since revision 25204). =================================================== Version 1.3 -- 1. April 2011. The changes of LCL, made after separating the 0.9.30 branch from the trunk, caused the crash of the control in new Lazarus 0.9.31 from trunk (see: http://wiki.freepascal.org/Lazarus_0.99.0_release_notes#Changes_affecting_compatibility), internal using of constructor TForm.Create had to be replaced by TForm.CreateNew (it was used twice -- for the drop-down form which carries the calendar and for design-time component editor form). There are also internal changes which improved autosizing of the control. The code is much simplified and the control is lighter now (there used to be an auxiliary control which is removed now and its code is simplified and unified in the main control).doublecmd-0.5.8/components/ZVDateTimeCtrls/pictures/0000755000175000017500000000000012257501472021522 5ustar alexxalexxdoublecmd-0.5.8/components/ZVDateTimeCtrls/pictures/ZVDateControls03.PNG0000644000175000017500000000272411534226204025113 0ustar alexxalexxPNG  IHDRL(TsRGBgAMA a cHRMz&u0`:pQ<RIDATx^\KkAQ<TBDЋQ 3Cf]&ApDO*XJ0#L&vґ ;z+-CWTTyZ胡cc\k^g{˔D[oi\rЉ+Its<>13c|bl6kD^oi;/' $Z(чd298Wٖ 뷛ЯEPoɊ<-LG- ZV.| f,XX*(ȣ MMn}iM< 7M{z2"wVE%rF(^zK,H{0So%\oVRڂPu;< f/>].-.YҮ:oEB (fH{A,@Z'O Vmծt6*i㍰o-ZZ^ 0q/^M5y? rWoE.ȣzt;:q%֥!Z4l_JK=5 ˋ)xv~#N3LWo3\4Ydvð -`)u.:p+om}eήȓ h᭹ 7-H9y/-˼Ŋ|#7Ύ!>Ӑ^["ũOY<4v7|N˔Poi<_ dY!r>5,ALFde"Sxmv³tF͕N #@ ~%3OjqXL)#/`ȉ8wQBE"g#"'`J}ɇEGEN<~,r9#@ߨݠm"IENDB`doublecmd-0.5.8/components/ZVDateTimeCtrls/pictures/TDBZVDateTimePicker.png0000644000175000017500000000067311534226204025674 0ustar alexxalexxPNG  IHDRw=tIME1Y:~tEXtSoftwareGLDPNG ver 3.4qtpNGGLD3J)gAMA a(IDATxc`'X~#X1H*_~?߀ >e4̾6d(ՋoS&_[B00b3&RK #d \+-[ ,,iYP^>"L0@ ϟ?cKCCc{{; "Wpee*# o9Q4PFdPRD b Wce!Mct7}n9q@]Kv~S=@"dY@*&x-úu0rNŅI l:IENDB`doublecmd-0.5.8/components/ZVDateTimeCtrls/pictures/ZVDateControls01.PNG0000644000175000017500000000300711534226204025104 0ustar alexxalexxPNG  IHDRHtsRGBgAMA a cHRMz&u0`:pQ<IDATx^KkA/"x$ xMEA< ! @L|elv6dW%M553Τ>Nt͑>t E)}}n*V(bP( /{)%d ?'P-tb@p~n5zQXkTAA{BPea404|̵} 7Q{kS(4M(7>['!T >NM8 j(.lK׫eEڨ^g8a yӊLyӛۭRPjmZ ѳZ^EQV0lGmʚ82U?LlfL=ōݲ칛f3n#ɚR$֩sphehBg?x)Frn{כF^Js+Mf̙Iѹs(U X UJ0>)!G/gfx}hjŠ*R}ףJ0"a&&Eڼ9v2+^QDZLZm%*/,O梘vfxӆJIȸYyJEqXWjR48#/EvhmMz$ЛՈ%(77 =_b%Z%(鯹(2ez\{??;k8TWfL~02: jMSc?Kw ?.ߌzȉo>#sջOizn7bfSPvdP(ŐOn8+}ئ ' z-W|Q|1pS___ aĜAðb+- 'X \V23L/tj)Aaݾ_d"$w9&W&D_L\BEW֢/fha;js1(X缯2s%:9w6bEz#'_,ŦN/]IKƄ?9cNؓ'gGe/q;wl 6P=5X1d R^k՛Ŏ/Zb[@AHM1؃'\nrݷd,I/%1__ c% *h.X_Am'UbIENDB`doublecmd-0.5.8/components/ZVDateTimeCtrls/pictures/ZVDateControls02.PNG0000644000175000017500000000176111534226204025112 0ustar alexxalexxPNG  IHDRt#s?sRGBgAMA a cHRMz&u0`:pQ<oIDAThCMkA?w?<?/HAڃ੠*HCEl4%I$Mn;d6?}`-nKYdvgNNi_#HJD`$q}K# !½T \O$h`f;LCc*J ރ5x *&>Y6>={wt͇3MSv1ឹ<EW}@E!AO3g 5LL [*IrR)nmiu]-!f"gr,"iql "ktG'X4Ȥp}Ɏ>vg])_ =QFᧀ-vVI\t . W7>1jɂ]o۶ CR@}mƉb 9k[дC2C(#DK4M%mfPZ1)\Z&V0Yp]J@g Yx  \l@mC/5cV|RTpb΂l;M [0m1TD}q0TMݬsIErp]tv-h"8u*J).gQpdqMZм ].z޼;@{ 鍚R+n~'KO Tu & +W^Ń<-8tq)NV ZU oE[:}6Iᆓ { _ k S>7?Hab>w x>`'/g߯,zYY܅Ƿ^Ň[ wNXO|+6ukKC[HcI~%6Oz'pd~['0қ\2seMoe8#I!IENDB`doublecmd-0.5.8/components/ZVDateTimeCtrls/pictures/ZVDateTimePickerEditor.PNG0000644000175000017500000002514011534226204026345 0ustar alexxalexxPNG  IHDR/gAMA a*IDATx^ |EǛ3ɾ۷qWW뵀M+@oBUQ@t]O|7r$$r${&s%;ԤRt4s$>OS]_u}_5==֓l_ _D;uL:I;I CNFpNQ(I皼4|C/b }Q ۍ SK߁]kuI@>.~IYK77 El *7v[ÓĮx:^ ~덐F3\ qWd ļС* 0QA"u] ݕ#:N:.$8Y.fQq@P`5*ݦ E 3HҰeXF0iR'K4Tw<;S:`c~0 Y"ݠ]DCڸCZEuvʨ4aO&N`LDmi6i/pqT\ll+ Y#{Ny~h* 8Ͳwe4,M2K3 Dm\ `R `'!? m?I}D%x;4J‚BĬ)@]s<2)#bU IfNuP6UQ֭tnˀR#\,m ðZ ^t:()H hlt+1ZƔh*`1[X]<s]I4/K3-J5juaνʦ+pq=S)tY]'s?SV~&]5+G^ ^ X$',d1!nD;'p#V  Z``qc_]^voyuٞɴͰo}|G[J7/`mfyWqZW|:Vן * f^tG^^$U`,[s"jVN, [8 ZtKV3@Xlr1xYsgwsrKk3,Ͳ<<Ͳ"ݴtqHÜ% Û~G Ye/l1mty:U>@ {$CHx(VFK#@[__c~EUs-L7?n^:޴d1c1c8Hμlny[/"/"/+H8!ի2/yjAPv#R)XK:^y@#K3R sf]6β!mi<1mw֜ `͋L5YW @fG5u\FH_ȵ5![vQ]gva q3TO*+m%z8$reSˊ1p";a?(·,۟ɴ?\l,50ct,t Ecog՚jdXY(T Lîi#˲r>[+33Z W3R,ţ;︘떓:`i nt]Ƿ« StK9dɣK XIcǟ ^p8%B~{WB  f. ޱ47I";n9A"8O|!Y鰦>63L$)uv3?l\mYz b ~^d bOJ dOF WzAJ{Y 4G3_AoSzoHXc07er Al/ ~sEAKK`s6DROMHꩨT=UX_oɌwy{rk!`~%tcakQg؁{PgU+O3#] 4K v,v|?c |Y:/DƂPcyF18Wo3/cY>/.hKnU]0x'^owqS/+uywҝ;O/6v{|x5 p# }0)3 ǔ>8"8I$:W8Nͪrg t/A'%퓬= ~ifmY'AH?P5ŦDRVt,NUbvNw½ o8BU^𩺗jS |f^7 vj{HY [B9%mT LQz~hdեhХn5̾Ǹ`#)cy},oM[_v^ו 0EE*|"s`&/TQG-$]'`<)hc%ͫO˖~_w[ vL*?^D-GlC$:ͳ️N<'^;GUBm+=+ZĆ2?#?]<ëZyRXhRB5G{DݴfeU@ـh6(kI=;࢒17]/߷!4oiݦ̳omz-JH|u诌R~WwivϾiX*s ^֥zʑ`jy)KhVM~)wN,9<:!42?FY +Զҳ!+N^;vUB+H UyRXh)~%lQImҼF*. f%{M0aF?>wfB"YA/Wpx>(b*r)EX_ d+` _ƣî9r{#/κ!=\5!W|yΠK]wO*[:k^&U}> hEhZ "ly0 E.$ @F7*ٻfu?>zڻ۶ݶΞ_!y]w^i_)m{-7k"&x}` [O ~V#x5T*Fmh1W k VTW)U'x7"*0eOdH׼`x[T#_%?(~Hf0>i!rV$zYX5 \Fz*l=cm/`6-tEd&[8f#SOS#O+Ʊ$6?鑉C0ph ;by` ӷ[=`47+TEChb,?w`^ 7V- ^zNvy׃觍I7șV? @W@sZۋ/D6* KjWB*В ^* /!%oX*6hW .'* ?n yyZ/6 6 B* ^{( rza=Q)Bx ]3* /* @3z{Q9XOT 4p= TH@gV/* Knӥ ݢ)^k}@LgUg?Bu꣚ %6NgefXhTTEٕ/Ws,^}qy[JX d8!'䇪Dy@x^ҕ/W/!˲=&M"uO]͕^{]m5+Uj +mջdjT"yV#VpJW6+t"\x+8ոIGNÑJWJ/kR2|"f,+JxTjC[v gL>ve(.Z+^zZ% GF:=tVI/63 5.IJByG2Lՠg|MMuMMU(gF]RXNW"tBvR$YUfe xxbI(xz+7/YY>_UU ) y=n;|CxvMuj+%VW*;%[+^13^#)v |tF^aJelMg<E<n)ixRߠ9ḅ+5B fVJue *bS?eܑ[v ۥ!m^!l:mDx](NJz+׶x1?:bv4 -0BQXK4X*@x!PT@H^Bv[[aPU8mD0 XOBx{QU%uuO,hk ^* /!]>@+ /|$N˫%@ /fc B*"Xၨ@(Bx 춄xbCP;^* /!- $/* KnK'6X @T?m"Xၨ@( /.Ha?:+6' h`O{YʖGE:EBx8sCCu;<.;ovK)K 'B6+^/@ bu \Uom1oR{oj^a<^ {@O{-!8OVMVF,g[;0 K.Ȁ Xּ’ 2$Dl b} ΅y5;vr6Q#/IKCJȥWG;K`XG^Wu;mg`&)A=0ғGO<2xL0V0މM(Ĺ ?:&z_d5R(jjkjBYu59m&QxivSNV*[ E Yn`3G-UdK?OW5?3OC ?:DzT/«2``Slzvb^J RBOQ.åxNE/Dm^0ehU ?v>-%/W|ł&C)&Ivbs=.س'r"giaxQք 4Jfj{ʽ| eʸF^^)cv;v#xKU}{TaKb'Oi+IRn=&x{@.5/;SYKO&%wFOARߴ1LJ6R,N3=>kZmUi'VbNQ~mjK ^1،ה&k ]|FP]JhKyq= #\O<j1tE5B-m)2bJO!^N[%e\lZQ[^C)Y㙇l[^n7lVBŅ/ 3oR-;p(ln< R r|={ '3aM1«-^ݴ}W~Jޟ>u[^z/W+Gͫxba*uu>K`0<|L S}61aBx%j6 (vDNLڅ^19 * /* KnRFb B*bxW7(c]yC[^^ʯvjPf!{Me|̢ ^xzPuh=eQF69xK#v3KJ'dnTwɊVe҉F\jIİ,+eBKA9^x l^eeBJ2ƛV%Fb G,j7J^{cȴ׹E 3űjK.K{GO1HY-ۅW4'[̏ExhKvNC-0~ͧ#%ū.pSIcSRaSW/xvŐ |ډE MtDHP\W>}O$=a#/U~UOW^ڥGF^B*bsϠ]} %q߱3zD@x 9t TUX)Ɨ'|_j /sHs]"mh*zD@x!TB8?ˮxe]]mBX}g]ngq ՑWmww;5Ji#B3GgEI/NAn)v}*ڷiqK_SSᮂC̮?xnrN?"Tx63^B Z$Uޝ?y*ao~Ϫ>}>ҖGȌIgUUU0ry+]@jyIi m[Jr҄vн퀧 c{35wю~عCϳ{qKDQr׬=fm\yhN 9W [O@K%I(DmvK^/!\ g|lo[ɜ:e[_(#XzmtCs&xy!T.i?_=+W/Z:3燚,?zl|Lu[SvYmb=" y^o|Z'f~wZ̹8TKx ^Ps)a= +3z3+ HqCx%:}39*zߕð~:Ͼga';b#3ؓESUs :h)&4˨\Gk+WYY=mkp ҃4doC4* "I_Q0 ѻa X+^{v]U3ߛxSwdadA5!^s{E)PW7}]TϦLѓAV:,7[EzD^m?*^ ?諅?rݱO慌m~d?9+%tAvkS&_=uit8ůa_n/aPZ흯 5%wǓ޳圿=}?kS}Gmwr i B+C{|e_]OA_YS3gՔiu2>_¿t 8~ڣl&k#ͬl UgYn#/ 7?Y,S=9=w]Cȥ$˶Z%V9z-m>vY\]_PU罃TXo쇿VzI*e Bh6^xj D/9fsط:Ï9 cb>;l6lĆu2 ^ҧ͙_jdAfv9s+~+U~ZOUD!OVC a_ M vY^)؀_C_{ڦI7U7"vn]0=Am>,iobzUErM73m~ecr8Me#/hCB6^4hl:rJކ=0lNs!".pO\ ,70\Qi:3TVGM v^n3>J3Nt.nQϸͧDSnO\ʜ/xh< Vf,=Gm<,j6mK3Is*HP Rb(=Wa^m3FX(qM4j)!!Tp`4vPz0W8HGx6u uRvR fЮ I_h8\Z_|6llnЊ3?t=" p(ƒlH]' cТE/뫴kË6W7mߕCbX^w~̗r .ŰVS.x[և g_\Yirjk͇"\:E@x!T~_~cWWj5qWsom*? n>0~ͧ#^x} t Vo2iQ B*Uk [ @T%dQl'!* @xa B*" /* @3gMkIϦaP* ߰7`/uNJlc} !w|iEۭV6ajC[ ͽUsxAOŀbFS MD s?߾E* EU{s'IENDB`doublecmd-0.5.8/components/ZVDateTimeCtrls/pictures/TZVDateTimePicker.png0000644000175000017500000000054111534226204025460 0ustar alexxalexxPNG  IHDRw=tIME$ntEXtSoftwareGLDPNG ver 3.4qtpNGGLD3J)gAMA aIDATxݔ1!E9g"PZx.` Xli{!d 0Bd 5M; i,fs|)hAJY P s`pN)Ƙ:aA NTCIyf{bA%! SSÝM%V`vr>= rN3trAAЗ-Egšh2efIENDB`doublecmd-0.5.8/components/ZVDateTimeCtrls/zvdatetimecontrolsreg.pas0000644000175000017500000000207312014201074025013 0ustar alexxalexx{ ZVDateTimeControlsReg - - - - - - - - - - - - - - - - - - Author: Zoran Vučenović, January and February 2010 Зоран Вученовић, јануар и фебруар 2010. This unit is part of ZVDateTimeCtrls package for Lazarus. ----------------------------------------------------------- LICENCE - - - - Modified LGPL -- see COPYING.TXT. ----------------------------------------------------------- NO WARRANTY - - - - - - There is no warranty whatsoever. ----------------------------------------------------------- BEST REGARDS TO LAZARUS COMMUNITY! - - - - - - - - - - - - - - - - - - I do hope the ZVDateTimeCtrls package will be useful. } unit ZVDateTimeControlsReg; {$mode objfpc}{$H+} interface procedure Register; implementation uses Classes, ZVDateTimePicker, DBZVDateTimePicker, LResources; procedure Register; begin RegisterComponents('Date and Time Ctrls', [ TZVDateTimePicker, TDBZVDateTimePicker ]); end; initialization {$i zvdatetimectrls.lrs} end. doublecmd-0.5.8/components/ZVDateTimeCtrls/COPYING.txt0000644000175000017500000000024712014201074021522 0ustar alexxalexxThis is the file COPYING. The files in ZVDateControls package are under the modified LGPL as described in COPYING.modifiedLGPL, which comes with Lazarus distribution.doublecmd-0.5.8/components/ZVDateTimeCtrls/zvdatetimectrls.lrs0000644000175000017500000000453511534226204023633 0ustar alexxalexxLazarusResources.Add('TZVDateTimePicker','PNG',[ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0 +#0#0#7'tIME'#7#218#3#23#8'$'#25'n'#143#152#193#0#0#0#23'tEXtSoftware'#0'GLDP' +'NG ver 3.4q'#133#164#225#0#0#0#8'tpNGGLD3'#0#0#0#0'J'#128')'#31#0#0#0#4'gAM' +'A'#0#0#177#143#11#252'a'#5#0#0#0#206'IDATx'#156#221#148'1'#14#2'!'#16'E9' +#150'g"'#246#155'P'#209#210'Zx'#6'.`'#236#12#198#214#27'Xli'#165'{'#132#209 +#193#176'!d 0B'#161#147#188#252'd'#19#230#207#31#194#10#241#23'5M;'#232#9'i' +#176','#143'f'#210's'#238'|)'#27'h'#173'AJY'#165#177#129#16#218#19#12'P'#179 +#9#156's`'#173#173#210'pN)'#5#198#152':'#131#214#21'a'#179#152#172'A'#12'NTC' +#238#146'I'#131'y'#190#193'f{bA%!'#13#184#144'SS'#6#251#195#157#165'M'#6'%' +#222#29'V'#226#239#221#18'`'#227#143#194#200#4#224#25#146#160#219#29#228'v' +#157'r'#188'>='#205#9'r'#187'N'#21#155'3'#19#0#185#235'tr'#150'A'#205#196'A' +#155#31#218#208#151#252'-E'#3#172#244'g'#197#161'h'#240#179#245#2'2'#16#136 +#27#211'e'#18'f'#0#0#0#0'IEND'#174'B`'#130 ]); LazarusResources.Add('TDBZVDateTimePicker','PNG',[ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0 +#0#0#7'tIME'#7#218#3#23#8'1'#25'Y:~'#213#0#0#0#23'tEXtSoftware'#0'GLDPNG ver' +' 3.4q'#133#164#225#0#0#0#8'tpNGGLD3'#0#0#0#0'J'#128')'#31#0#0#0#4'gAMA'#0#0 +#177#143#11#252'a'#5#0#0#1'(IDATx'#156'c`'#160'''X~'#232#217#127#167#178'#X1' +'H'#142'*'#6'_~'#248#249'?'#8#128#232#189#23#223#128#13#158#184#233'>e'#22 +#129'4'#22#204#190#6'6'#8'd('#186#225#213#139'o'#130#229'S&_'#2'[B'#178#5'0' +#141'0'#23'b3'#28'&'#15'RK'#150#5' '#131#144#131#2#29'#'#251#130'd'#11'\+' +#142#194'-'#0#185#30'['#28' '#251#132','#31#128','#1'i'#134'YP^>'#137'"L0' +#136'@'#138#136#5' '#181#207#159'?'#134'c'#16#127#253#134#237#8'K'#176#5#17 +#204#2'CCc'#188#24#217#2'{{;'#236#22#224#10'"'#170#249#0'W'#16#193'pee'#227 +#255#170#170'*'#156#184#162#162#3'#'#14#136#10#162#251#247'o'#255#159#182#245 +'9Q4'#204'P'#24'F'#137'dPR'#196#22'D '#205#196'b'#12'Wc'#3#200'e'#18'!'#31#0 +'M'#2'ct'#31#16#157'7'#8#249#0#217#2#162'}'#128'n'#1'9q@'#150#15#208']Kv'#28 +#224#242#1#204#2#154#249#0#31#222'~'#230#29#24'S='#14'@'#134'"'#211'dY@*&' +#201#2#16'x'#255#254'-'#195#186'u'#219#255#195'0rN'#197#133'I'#178#128#26#0#0 +#242#176#9'l'#161#206':'#16#0#0#0#0'IEND'#174'B`'#130 ]); doublecmd-0.5.8/components/CmdLine/0000755000175000017500000000000012257501472016213 5ustar alexxalexxdoublecmd-0.5.8/components/CmdLine/ucmdbox.pas0000644000175000017500000020420112014201074020342 0ustar alexxalexx{ Copyright (C) 2007 Julian Schutsch This source is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. A copy of the GNU Lesser General Public License is available on the World Wide Web at . You can also obtain it by writing to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Changelog: 9.27.2007 : Seperation from another Package, first Release under GPL Version 0.1 10.02.2007 : Licence Changed to LGPL Added : History Added : Password Input mode Fixed : Blank Screen when Resizing so that TopLine disappears. Added : Fixed Prompt Description infront of Input, moves along with it Etc : Functions, minor Bugs Missing : FreeLineWidth full support Version 0.2 10.08.2007 : Removed : Fixed Line Width Support, Source now less complex Added : Paste/Copy/Cut Ability, Select with Mouse and Shift/Keys Added : TRTLCriticalsection called FLock to make Writeln/Write Threadsafe Fixed : GTK 1/2 Linux support, several changes to make that work... Removed : LineWidth, can cause Property Loading Errors if used with old Apps ! Workarn : GTK Font height gets 2 added on all plattforms, means, win32 have two extra dots unecessarily, can't solve that ! Fixed : Pos 1/End Key changes Scrollbar (Different GTK behaviour !) Version 0.3 12.06.2008 : Optimized Color String output, still needs testing and PWD Strings are not changed yet. Improvement visible on Win32, but still to slow, any hacks? 17.06.2008 : TColorString changed completly, now using Arrays instead of linked lists 25.06.2008 : Fixed everything for Multispace support Added tabulator behaviour Caret type and Color now customizable Input Selection Colors published Speed improvement using precalculated Sum-Widths for TColorString Lots of minor UTF8 Bugs fixed 26.06.2008 : Escape Codes for some sort of Graphical output (Tables, lines, etc) Better moving Input Bug fixes in MakeInputVisible 27.06.2008 : Add FGraphicCharWidth 28.06.2008 : New Escape Code preprocessor Support for different modes (ANSI color, CmdBox, None(ignore)) 29.06.2008 : FStringBuffer added,Works without WakeMainThread now as well Fixed LineOutAndFill Added AutoFollow Todo : Input Masks Todo : Docu } unit uCmdBox; {$mode objfpc}{$H+} interface uses Classes, SysUtils, ExtCtrls, ComCtrls, Controls, Graphics, Forms, LCLType, LCLIntf, LMessages, LResources, ClipBrd, LCLProc; type TCaretType=(cartLine,cartSubBar,cartBigBar,cartUser); TEscapeCodeType=(esctCmdBox,esctAnsi,esctNone); TEscapeMode=(escmNone,escmOperation,escmData2,escmData1,escmAnsiOperation,escmAnsiSquare); type TCmdBox=class; type TColorstring=class; type EOnCmdBoxInput=Procedure(ACmdBox:TCmdBox;Input:String) of object; type EOnCmdBoxInputChange=Procedure(ACmdBox:TCmdBox;InputData:TColorstring) of object; type { TCmdBox } TCmdBox=class(TCustomControl) public constructor Create(AComponent:TComponent);override; destructor Destroy;override; protected procedure Paint;override; procedure Resize;override; procedure UTF8KeyPress(var Key:TUTF8Char);override; procedure KeyDown(var Key:Word;Shift:TShiftState);override; procedure CreateParams(var Params:TCreateParams);override; procedure CreateWnd;override; procedure WMVScroll(var message: TLMVScroll);message LM_VSCROLL; procedure MouseDown(Button:TMouseButton;Shift:TShiftState;x,y:Integer);override; procedure MouseUp(Button:TMouseButton;Shift:TShiftState;x,y:Integer);override; procedure MouseMove(Shift:TShiftState;x,y:Integer);override; procedure EraseBackground(DC:HDC);override; private FLock : System.TRTLCriticalSection; FCaretTimer : TTimer; FCaretVisible : Boolean; FLineCount : Integer; FLines : array of TColorstring; FLineHeights : array of Integer; FLineHeightSum : array of Integer; FTopLine : Integer; FPageHeight : Integer; FVisibleLines : Integer; FVSBVisible : Boolean; FVSBPos : Integer; FVSBWidth : Integer; FClientWidth : Integer; FClientHeight : Integer; FCaretX : Integer; FOutX,FOutY : Integer; FInputX,FInputY : Integer; FInputPos : Integer; FCharHeight : Integer; FLineOfTopLine : Integer; FVisibleLineCount : Integer; FInput : Boolean; FInputBuffer : TColorstring; FInputVisible : Boolean; FInputMinPos : Integer; FUTF8InputMinPos : Integer; FOnInput : EOnCmdBoxInput; FOnAny : EOnCmdBoxInputChange; FOnInputChange : EOnCmdBoxInputChange; FBackGroundColor : TColor; FCurrentColor : TColor; FCurrentBackGround : TColor; FFont : TFont; FPassWordChar : TUTF8Char; FInputIsPassWord : Boolean; FHistory : Array of TColorstring; FHistoryLength : Integer; FHistoryMax : Integer; FHistoryPos : Integer; FInputColor : TColor; FInputBackground : TColor; FInputSelColor : TColor; FInputSelBackGround : TColor; FMouseDown : Boolean; FSelStart,FSelEnd : Integer; FMouseDownInputPos : Integer; FCurrentString : String; FCaretColor : TColor; FCaretType : TCaretType; FCaretWidth : Integer; FCaretHeight : Integer; FCaretYShift : Integer; FTabWidth : Integer; FGraphicCharWidth : Integer; FEscapeCodeType : TEscapeCodeType; FEscapeMode : TEscapeMode; FEscapeData : String; FStringBuffer : TStringList; FAutoFollow : Boolean; procedure CaretTimerExecute(Sender:TObject); procedure SetLineCount(c:Integer); procedure SetTopLine(Nr:Integer); procedure AdjustScrollBars; function AdjustLineHeight(i:Integer):Integer; procedure MakeInputVisible; procedure MakeOutVisible; procedure SetFont(F:TFont); procedure SetBackGroundColor(c:Tcolor); function GetSystemMetricsGapSize(const Index:Integer):Integer; procedure ScrollBarRange(Which: Integer; aRange,aPage: Integer); procedure ScrollBarPosition(Which,Value:Integer); function UpdateLineHeights:Integer; procedure TranslateScrollBarPosition; procedure ScrollUp; procedure SetHistoryMax(v:Integer); procedure InsertHistory; procedure SetHistoryPos(v:Integer); function GetHistory(i:Integer):string; procedure DeleteHistoryEntry(i:Integer); procedure MakeFirstHistoryEntry(i:Integer); function MoveInputCaretTo(x,y:Integer;chl:Boolean):Boolean; procedure SetSelection(Start,Ende:Integer); procedure LeftSelection(Start,Ende:Integer); procedure RightSelection(Start,Ende:Integer); procedure DeleteSelected; procedure SetOutY(v:Integer); procedure IntWrite; procedure MultiWrite; procedure SetCaretType(ACaretType:TCaretType); procedure SetCaretWidth(AValue:Integer); procedure SetCaretHeight(AValue:Integer); procedure SetCaretYShift(AValue:Integer); procedure SetTabWidth(AValue:Integer); function GetCaretInterval:Integer; procedure SetCaretInterval(AValue:Integer); public function HistoryHas(s:string):Boolean; function HistoryIndexOf(s:string):Integer; procedure ClearHistory; procedure TextColor(C:TColor); procedure TextBackground(C:TColor); procedure TextColors(FC,BC:TColor); procedure Write(s:String); procedure Writeln(s:String); procedure WriteStream(Stream:TStream); procedure Clear; procedure StartRead(DFC,DBC:TColor;const Desc:String;IFC,IBC:TColor); procedure StartReadPassWord(DFC,DBC:TColor;const Desc:String;IFC,IBC:TColor); procedure StopRead; procedure CopyToClipBoard; procedure PasteFromClipBoard; procedure CutToClipBoard; procedure ClearLine; property OutX : Integer read FOutX write FOutX; property OutY : Integer read FOutY write SetOutY; property TopLine : Integer read FTopLine write SetTopLine; property History[i:Integer] : string read GetHistory; property InputPos : Integer read FInputPos write FInputPos; function HistoryCount : Integer; published property Align; property Anchors; property ShowHint; property CaretColor : TColor read FCaretColor write FCaretColor; property CaretType : TCaretType read FCaretType write SetCaretType; property CaretWidth : Integer read FCaretWidth write SetCaretWidth; property CaretHeight : Integer read FCaretHeight write SetCaretHeight; property CaretYShift : Integer read FCaretYShift write SetCaretYShift; property OnInput : EOnCmdBoxInput read FOnInput write FOnInput; property OnInputChange : EOnCmdBoxInputChange read FOnInputChange write FOnInputChange; property OnAny : EOnCmdBoxInputChange read FOnAny write FOnAny; property LineCount : Integer read FLineCount write SetLineCount; property Font : TFont read FFont write SetFont; property BackGroundColor : TColor read FBackgroundColor write SetBackGroundColor; property TabWidth : Integer read FTabWidth write SetTabWidth; property PassWordChar : TUTF8Char read FPassWordChar write FPassWordChar; property HistoryMax : Integer read FHistoryMax write SetHistoryMax; property InputSelColor : TColor read FInputSelColor write FInputSelColor; property InputSelBackGround : TColor read FInputSelBackGround write FInputSelBackGround; property CaretInterval : Integer read GetCaretInterval write SetCaretInterval; property EscapeCodeType : TEscapeCodeType read FEscapeCodeType write FEscapeCodeType; property GraphicalCharacterWidth : Integer read FGraphicCharWidth write FGraphicCharWidth; property AutoFollow : Boolean read FAutoFollow write FAutoFollow; property DoubleBuffered default true; end; type TColorChar=record FChar : TUTF8Char; FCharWidth : Integer; FSumWidth : Integer; FWordStart : Integer; FFrontColor : TColor; FBackColor : TColor; end; type TColorString=class private FChars : array of TColorChar; FSumWidth : Integer; FPassWordStart : Integer; FPassWordChar : TUTF8Char; FTabWidth : Integer; procedure MinimumLength(V:Integer;FC,BC:TColor); procedure MaximumLength(V:Integer); procedure UpdateSum; public constructor Create(AFont:TFont); destructor Destroy;override; procedure Clear; procedure OverWrite(S:String;Pos:Integer;FC,BC:TColor); procedure OverWriteChar(s:TUTF8Char;Pos,ADefWidth:Integer;FC,BC:TColor); procedure OverWrite(S:TColorstring;Pos:Integer); procedure OverWritePW(S:TColorstring;PWS,Pos:Integer;PWC:String); procedure PartOverWrite(S:TColorstring;Start,Ende,Pos:Integer); procedure LineOutAndFill(ACanvas:TCanvas;AX,AY,ALeftX,AWrapWidth,ACH,ACB,ACaretPos:Integer;ABC,ACC:TColor;ACaretHeight,ACaretWidth,ACaretYShift:Integer;ADrawCaret:Boolean); function Getstring:String; function GetPartstring(Start,Ende:Integer):String; procedure Delete(Index:Integer); procedure Delete(Index,Len:Integer); procedure Insert(Index:Integer;C:String;FC,BC:TColor); procedure BColorBlock(StartPos,EndPos:Integer;C:TColor); procedure ColorBlock(StartPos,EndPos:Integer;FC,BC:TColor); function LineCount(AWrapWidth,ACaretPos,ACaretWidth:Integer):Integer; function GetLength:Integer; function GetLineOfCaret(AWrapWidth,ACaretPos,ACaretWidth:Integer):Integer; function GetCharPosition(AWrapWidth,ALine,AXPos:Integer):Integer; private FFont : TFont; FDefaultBackGround : TColor; public property TabWidth : Integer read FTabWidth write FTabWidth; property PassWordChar : TUTF8Char read FPassWordChar write FPassWordChar; property PassWordStart : Integer read FPassWordStart write FPassWordStart; property Length : Integer read GetLength; property DefaultBackGround : TColor read FDefaultBackground write FDefaultBackground; property Font : TFont read FFont write FFont; end; procedure Register; implementation procedure TColorString.UpdateSum; var i : Integer; LastWordStart : Integer; SumWidth : Integer; begin LastWordStart := 0; SumWidth := 0; for i:=0 to High(FChars) do begin with FChars[i] do begin FWordStart := LastWordStart; case FChar[1] of #9: begin FCharWidth := (SumWidth div FTabWidth+1)*FTabWidth-SumWidth; LastWordStart := i+1; end; #27: begin case FChar[2] of #9: begin FCharWidth := (SumWidth div FTabWidth+1)*FTabWidth-SumWidth; LastWordStart := i+1; end; #10:LastWordStart:=i+1; #32,#46,#196,#205: begin FCharWidth := Ord(FChar[3]); LastWordStart := i+1; end; #33,#47,#197,#206: begin FCharWidth := (Ord(FChar[3])+Ord(FChar[4])*256)-SumWidth; if FCharWidth<0 then FCharWidth:=0; LastWordStart := i+1; end; end; end; else if FChar=' ' then LastWordStart:=i+1; end; SumWidth := SumWidth+FCharWidth; FSumWidth := SumWidth; end; end; FSumWidth:=SumWidth; end; function TColorString.GetLength:Integer; begin Result:=System.Length(FChars); end; procedure TCmdBox.SetTabWidth(AValue:Integer); var i:Integer; begin FTabWidth:=AValue; for i:=0 to FLineCount-1 do FLines[i].TabWidth:=AValue; UpdateLineHeights; Invalidate; end; procedure TCmdBox.SetCaretWidth(AValue:Integer); begin FCaretWidth := AValue; FCaretType := cartUser; end; procedure TCmdBox.SetCaretHeight(AValue:Integer); begin FCaretHeight := AValue; FCaretType := cartUser; end; procedure TCmdBox.SetCaretYShift(AValue:Integer); begin FCaretYShift := AValue; FCaretType := cartUser; end; procedure TCmdBox.SetCaretType(ACaretType:TCaretType); begin case ACaretType of cartLine: begin if HandleAllocated then FCaretHeight:=FFont.GetTextHeight('A')-3 else FCaretHeight:=-1; FCaretWidth := 1; FCaretYShift := 3; end; cartSubBar: begin FCaretWidth := -1; FCaretHeight := 3; FCaretYShift := 0; end; cartBigBar: begin if HandleAllocated then FCaretHeight:=FFont.GetTextHeight('A')-3 else FCaretHeight:=-1; FCaretWidth := -1; FCaretYShift := 3; end; end; Invalidate; FCaretType:=ACaretType; end; // TOdo : Use string buffer instead of string (speed improvement expected) procedure TColorString.LineOutAndFill(ACanvas:TCanvas;AX,AY,ALeftX,AWrapWidth,ACH,ACB,ACaretPos:Integer;ABC,ACC:TColor;ACaretHeight,ACaretWidth,ACaretYShift:Integer;ADrawCaret:Boolean); var LineStart : Integer; LineEnd : Integer; MidWidth : Integer; LineStartSumWidth : Integer; x : Integer; LastLineSumWidth : Integer; ACHH : Integer; ACBH : Integer; procedure DrawLine; var SameColor : String; SameForeColor : TColor; SameBackColor : TColor; SameColorX : Integer; SameColorWidth : Integer; LP : Integer; CaretX : Integer; CaretW : Integer; CW : Integer; xp : Integer; begin if (AY<=-ACH) and (AY>ACanvas.Height) then begin Inc(AY,ACH); Ax:=ALeftx; Exit; end; SameColor:=''; ACanvas.Brush.Style:=bsSolid; // TODO: Please try to reproduce this Ultra-Shit Error which couples GetTextWidth input to // TextOut Output. I can't solve this...i am not Stupid Enough for such errors! // (Is in bug report, should be fixed somewhere in the future!) ACanvas.Font.GetTextWidth('%%%_$%_Hallo\\\\\\\\\32489738'); // End of shit LP := LineStart; CaretX := -1; while LineStart<>LineEnd+1 do begin with FChars[LineStart] do begin CW:=FCharWidth; if FChar=#9 then begin if SameColor<>'' then begin ACanvas.Font.Color :=SameForeColor; ACanvas.Brush.Color :=SameBackColor; ACanvas.FillRect(SameColorX,AY,SameColorX+SameColorWidth,Ay+ACH); ACanvas.TextOut(SameColorX,AY,SameColor); Inc(SameColorX,SameColorWidth); SameColor:=''; end else SameColorX:=AX; ACanvas.Brush.Color:=FBackColor; ACanvas.Fillrect(SameColorX,AY,SameColorX+FCharWidth,AY+ACH); end else if FChar[1]=#27 then begin if SameColor<>'' then begin ACanvas.Font.Color :=SameForeColor; ACanvas.Brush.Color :=SameBackColor; ACanvas.FillRect(SameColorX,AY,SameColorX+SameColorWidth,Ay+ACH); ACanvas.TextOut(SameColorX,AY,SameColor); Inc(SameColorX,SameColorWidth); SameColor:=''; end else SameColorX:=AX; case FChar[2] of #9: begin case FChar[3] of #46: begin ACanvas.Pen.Color:=FFrontColor; ACanvas.Pen.Style:=psDash; ACanvas.Brush.Color:=FBackColor; ACanvas.Fillrect(SameColorX,AY,SameColorX+FCharWidth,AY+ACH); xp:=SameColorX; if xp mod 2<>0 then Inc(xp); while xp0 then Inc(xp); while xp=FPassWordStart) then begin SameColor := FPassWordChar; SameColorWidth := FFont.GetTextWidth(FPassWordChar); end else begin SameColor := FChar; SameColorWidth := FCharWidth; end; SameColorX := AX; SameForeColor := FFrontColor; SameBackColor := FBackColor; end else begin if (SameForeColor=FFrontColor) and (SameBackColor=FBackColor) then begin if (LP>=FPassWordStart) then begin SameColor:=SameColor+FPassWordChar; Inc(SameColorWidth,FFont.GetTextWidth(FPassWordChar)); end else begin SameColor:=SameColor+FChar; Inc(SameColorWidth,FCharWidth); end; end else begin ACanvas.Font.Color :=SameForeColor; ACanvas.Brush.Color :=SameBackColor; ACanvas.FillRect(SameColorX,Ay,SameColorX+SameColorWidth,Ay+ACH); ACanvas.TextOut(SameColorX,AY,SameColor); if (LP>=FPassWordStart) then begin SameColor := FPassWordChar; SameColorWidth := FFont.GetTextWidth(FPassWordChar); end else begin SameColor := FChar; SameColorWidth := FCharWidth; end; SameForeColor := FFrontColor; SameBackColor := FBackColor; SameColorX := AX; end; end; if LP=ACaretPos then begin CaretX:=AX; CaretW:=FCharWidth; end; Inc(AX,CW); Inc(LP); end; Inc(LineStart); end; if SameColor<>'' then begin ACanvas.Font.Color := SameForeColor; ACanvas.Brush.Color := SameBackColor; ACanvas.FillRect(SameColorX,Ay,SameColorX+SameColorWidth,Ay+ACH); ACanvas.TextOut(SameColorX,AY,SameColor); end; ACanvas.FillRect(AX,AY,AWrapWidth,AY+ACH); AX:=ALeftX; Inc(AY,ACH); if ADrawCaret and (CaretX>=0) then begin ACanvas.Brush.Color:=ACC; if ACaretWidth>=0 then CaretW:=ACaretWidth; ACanvas.FillRect(CaretX,AY-ACaretHeight-ACaretYShift,CaretX+CaretW,AY-ACaretYShift); end; end; begin if AWrapWidth<0 then AWrapWidth:=0; if System.Length(FChars)=0 then begin ACanvas.Brush.Style := bsSolid; ACanvas.Brush.Color := ABC; ACanvas.FillRect(AX,AY,AWrapWidth,AY+ACH); Exit; end; ACHH := ACH div 2; ACBH := ACB div 2; MidWidth := FSumWidth div System.Length(FChars); LineStart := 0; LineStartSumWidth := 0; LastLineSumWidth := 0; x := 0; while LineStartHigh(FChars) then x:=High(FChars); while (xLineStart) and (FChars[x].FSumWidth-LineStartSumWidth>=AWrapWidth) do with FChars[x] do if (FChar<>' ') and (FWordStart>LineStart) then x:=FWordStart-1 else Dec(x); LineEnd:=x; DrawLine; LastLineSumWidth := LineStartSumWidth; LineStartSumWidth := FChars[x].FSumWidth; LineStart := x+1; end; if ACaretPos>=LineStart then begin if ACaretWidth>=0 then x:=ACaretWidth else x:=FFont.GetTextWidth('A'); AX:=LineStartSumWidth-LastLineSumWidth+(ACaretPos-LineStart)*x; if Ax+x>AWrapWidth then begin Ax:=0; ACanvas.Brush.Color:=ABC; ACanvas.FillRect(0,AY,AWrapWidth,AY+ACH); Inc(Ay,ACH); end; if ADrawCaret then begin ACanvas.Brush.Color:=ACC; ACanvas.FillRect(AX,AY-ACaretHeight-ACaretYShift,AX+x,AY-ACaretYShift); end; end; end; function TColorString.GetCharPosition(AWrapWidth,ALine,AXPos:Integer):Integer; var x,MidWidth,LineStart,LineStartSumWidth,LastLineSumWidth,LastLineStart:Integer; begin if AWrapWidth<0 then AWrapWidth:=0; if System.Length(FChars)=0 then begin Result:=0; Exit; end; MidWidth := FSumWidth div System.Length(FChars); if MidWidth=0 then begin Result:=0; Exit; end; LineStart := 0; LineStartSumWidth := 0; LastLineSumWidth := 0; x:=0; while (LineStart=0) do begin x:=LineStart+AWrapWidth div MidWidth; if x>High(FChars) then x:=High(FChars); while (xLineStart) and (FChars[x].FSumWidth-LineStartSumWidth>=AWrapWidth) do with FChars[x] do if (FChar<>' ') and (FWordStart>LineStart) then x:=FWordStart-1 else Dec(x); LastLineSumWidth := LineStartSumWidth; LineStartSumWidth := FChars[x].FSumWidth; LastLineStart := LineStart; LineStart := x+1; Dec(ALine); end; Result:=LastLineStart; while (ResultHigh(FChars) then x:=High(FChars); while (xLineStart) and (FChars[x].FSumWidth-LineStartSumWidth>=AWrapWidth) do with FChars[x] do if (FChar<>' ') and (FWordStart>LineStart) then x:=FWordStart-1 else Dec(x); LastLineSumWidth := LineStartSumWidth; LineStartSumWidth := FChars[x].FSumWidth; LineStart := x+1; if ACaretPos=0 then x:=ACaretWidth else x:=FFont.GetTextWidth('A'); if (ACaretPos>LineStart) or (LineStartSumWidth-LastLineSumWidth+(ACaretPos-LineStart)*x+x<=AWrapWidth) then Dec(Result); end; function TColorString.LineCount(AWrapWidth,ACaretPos,ACaretWidth:Integer):Integer; var x : Integer; MidWidth : Integer; LineStart : Integer; LineStartSumWidth : Integer; LastLineSumWidth : Integer; begin if AWrapWidth<0 then AWrapWidth:=0; if System.Length(FChars)=0 then begin Result:=1; Exit; end; MidWidth := FSumWidth div System.Length(FChars); if MidWidth=0 then begin Result:=1; Exit; end; LineStart := 0; LineStartSumWidth := 0; LastLineSumWidth := 0; Result:=0; x:=0; while LineStartHigh(FChars) then x:=High(FChars); while (xLineStart) and (FChars[x].FSumWidth-LineStartSumWidth>=AWrapWidth) do with FChars[x] do if (FChar<>' ') and (FWordStart>LineStart) then x:=FWordStart-1 else Dec(x); LastLineSumWidth := LineStartSumWidth; LineStartSumWidth := FChars[x].FSumWidth; LineStart := x+1; Inc(Result); end; if ACaretWidth>=0 then x:=ACaretWidth else x:=FFont.GetTextWidth('A'); if (ACaretPos>=LineStart) and (LineStartSumWidth-LastLineSumWidth+(ACaretPos-LineStart)*x+x>AWrapWidth) then Inc(Result); end; constructor TColorString.Create(AFont:TFont); begin inherited Create; FTabWidth := 1; FFont := AFont; FPassWordStart := MaxInt; end; procedure TColorstring.BColorBlock(StartPos,EndPos:Integer;C:TColor); var i:Integer; begin if StartPos<0 then StartPos:=0; if EndPos>High(FChars) then EndPos:=High(FChars); for i:=StartPos to EndPos do FChars[i].FBackColor:=C; end; procedure TColorstring.ColorBlock(StartPos,EndPos:Integer;FC,BC:TColor); var i:Integer; begin if StartPos<0 then StartPos:=0; if EndPos>High(FChars) then EndPos:=High(FChars); for i:=StartPos to EndPos do begin FChars[i].FFrontColor := FC; FChars[i].FBackColor := BC; end; end; procedure TColorstring.Insert(Index:Integer;C:string;FC,BC:TColor); var i : Integer; l : Integer; Pp : Integer; OldLen : Integer; SLen : Integer; begin OldLen := System.Length(FChars); SLen := UTF8Length(C); if OldLen=FPassWordStart then FCharWidth:=FFont.GetTextWidth(FPassWordChar) else FCharWidth:=FFont.GetTextWidth(FChar); FFrontColor := FC; FBackColor := BC; end; Inc(pp,l); end; UpdateSum; end; procedure TColorstring.Delete(Index,Len:Integer); var i:Integer; begin if (Len=0) or (Index>=System.Length(FChars)) then Exit; if Index+Len>System.Length(FChars) then Len:=System.Length(FChars)-Index; for i:=Index to System.Length(FChars)-Len-1 do FChars[i]:=FChars[i+Len]; SetLength(FChars,System.Length(FChars)-Len); UpdateSum; end; procedure TColorstring.Delete(Index:Integer); var i:Integer; begin if (Index>=System.Length(FChars)) then Exit; for i:=Index to System.Length(FChars)-2 do FChars[i]:=FChars[i+1]; SetLength(FChars,System.Length(FChars)-1); UpdateSum; end; function TColorstring.GetPartstring(Start,Ende:Integer):string; var i,n : Integer; Len : Integer; begin if Start<0 then Start:=0; if Ende>High(FChars) then Ende:=High(FChars); Len:=0; for i:=Start to Ende do Inc(Len,System.Length(FChars[i].FChar)); SetLength(Result,Len); Len:=1; for i:=Start to Ende do begin with FChars[i] do begin for n:=1 to System.Length(FChar) do begin Result[Len]:=FChar[n]; Inc(Len); end; end; end; end; function TColorstring.Getstring:String; var i,n : Integer; Len : Integer; begin Len := 0; for i:=0 to High(FChars) do Inc(Len,System.Length(FChars[i].FChar)); SetLength(Result,Len); Len := 1; for i:=0 to High(FChars) do begin with FChars[i] do begin for n:=1 to System.Length(FChar) do begin Result[Len]:=FChar[n]; Inc(Len); end; end; end; end; procedure TColorstring.OverWritePW(S:TColorstring;PWS,Pos:Integer;PWC:String); var i : Integer; CPassWordStart:Integer; begin MinimumLength(Pos+S.Length,CLSilver,S.FDefaultBackGround); CPassWordStart:=PWS; for i:=0 to S.Length-1 do begin FChars[i+Pos]:=S.FChars[i]; if CPassWordStart<=0 then FChars[i+Pos].FChar:=PWC; Dec(CPassWordStart); end; UpdateSum; end; procedure TColorstring.OverWrite(S:TColorstring;Pos:Integer); var i : Integer; begin MinimumLength(Pos+S.Length,CLSilver,S.FDefaultBackGround); for i:=0 to S.Length-1 do FChars[i+Pos]:=S.FChars[i]; UpdateSum; end; procedure TColorstring.PartOverWrite(S:TColorstring;Start,Ende,Pos:Integer); var i : Integer; begin MinimumLength(Pos+Ende-Start,CLSilver,S.FDefaultBackGround); for i:=0 to Ende-Start-1 do FChars[i+Pos]:=S.FChars[i+Start]; UpdateSum; end; procedure TColorstring.OverWrite(s:String;Pos:Integer;FC,BC:TColor); var i,Pp,l : Integer; begin MinimumLength(Pos+UTF8Length(S),FC,BC); Pp:=1; for i:=0 to UTF8Length(S)-1 do begin l:=UTF8CharacterLength(@s[Pp]); with FChars[i+Pos] do begin FChar := Copy(S,Pp,l); FCharWidth := FFont.GetTextWidth(FChar); FFrontColor := FC; FBackColor := BC; end; Inc(Pp,l); end; UpdateSum; end; procedure TColorstring.OverWriteChar(s:TUTF8Char;Pos,ADefWidth:Integer;FC,BC:TColor); begin MinimumLength(Pos+1,FC,BC); with FChars[Pos] do begin FChar := s; FCharWidth := ADefWidth; FFrontColor := FC; FBackColor := BC; end; UpdateSum; end; procedure TColorstring.MinimumLength(V:Integer;FC,BC:TColor); var OldLen,i:Integer; begin if System.Length(FChars)V then SetLength(FChars,V); end; procedure TColorstring.Clear; begin FChars:=Nil; end; procedure TCmdBox.ClearLine; begin if FLines[FOutY].Length<>0 then begin FLines[FOutY].Clear; FOutX:=0; if FInput then FInputY:=FOutY; Invalidate; end; end; function TCmdBox.GetCaretInterval:Integer; begin Result:=FCaretTimer.Interval; end; procedure TCmdBox.SetCaretInterval(AValue:Integer); begin FCaretTimer.Interval:=AValue; end; procedure TCmdBox.MultiWrite; var DoWrite:Boolean; begin System.EnterCriticalSection(FLock); DoWrite:=FStringBuffer.Count<>0; if DoWrite then begin FCurrentString:=FStringBuffer[0]; FStringBuffer.Delete(0); end; System.LeaveCriticalSection(FLock); if DoWrite then IntWrite; end; procedure TCmdBox.Write(S:String); begin if ThreadID=MainThreadId then begin MultiWrite; FCurrentString:=S; IntWrite; end else begin System.EnterCriticalSection(FLock); FStringBuffer.Add(S); System.LeaveCriticalSection(FLock); if Assigned(WakeMainThread) then TThread.Synchronize(Nil,@MultiWrite); end; end; function TCmdBox.HistoryIndexOf(s:string):Integer; begin for Result:=0 to HistoryCount-1 do if History[Result]=s then Exit; Result:=-1; end; function TCmdBox.HistoryHas(s:string):Boolean; var i:Integer; begin Result := True; for i:=0 to HistoryCount-1 do if History[i]=s then Exit; Result := False; end; function TCmdBox.HistoryCount:Integer; begin HistoryCount:=FHistoryLength-Ord(FInput); end; function TCmdBox.GetHistory(i:Integer):string; begin Inc(i,Ord(FInput)); if (i>=0) and (iFHistoryMax then begin if FHistoryLength>v then FHistoryLength:=v; for i:=v to FHistoryMax-1 do FHistory[i].Free; SetLength(FHistory,v); for i:=FHistoryMax to v-1 do FHistory[i]:=TColorstring.Create(Canvas.Font); FHistoryMax:=v; end; end; procedure TCmdBox.WriteStream(Stream:TStream); var c:wideString; begin while Stream.Position-1 then FInputBuffer.ColorBlock(FSelStart,FSelEnd,FInputColor,FInputBackGround); if Start=Ende then FSelStart:=-1 else begin if Start-1 then FInputBuffer.ColorBlock(FSelStart,FSelEnd,FInputSelColor,FInputSelBackGround); end; procedure TCmdBox.CopyToClipBoard; begin if FSelStart<>-1 then begin ClipBoard.AsText:=FInputBuffer.GetPartstring(FSelStart,FSelEnd); end; end; procedure TCmdBox.PasteFromClipBoard; var s:widestring; l,Pp:Integer; begin if ClipBoard.HasFormat(CF_TEXT) then begin s := ClipBoard.AsText; Pp := 1; while pp<=Length(s) do begin l := UTF8CharacterLength(@S[Pp]); if (l=1) and (Byte(S[Pp])<32) then Delete(s,Pp,1) else inc(Pp,l); end; FInputBuffer.Insert(InputPos,s,FInputColor,FInputBackGround); InputPos := InputPos + UTF8Length(s); FCaretX:=FInputX+InputPos; AdjustScrollBars; MakeInputVisible; FHistoryPos:=0; if Assigned(FOnInputChange) then FOnInputChange(Self,FInputBuffer); if Assigned(FOnAny) then FOnAny(Self,FInputBuffer); end; end; procedure TCmdBox.DeleteSelected; begin if FSelStart<>-1 then begin FInputBuffer.Delete(FSelStart,FSelEnd-FSelStart+1); FInputPos := FSelStart; FCaretX := FInputX+FInputPos; FSelStart := -1; end; end; procedure TCmdBox.CutToClipBoard; begin if FSelStart<>-1 then begin ClipBoard.AsText:=FInputBuffer.GetPartstring(FSelStart,FSelEnd); DeleteSelected; end; end; procedure TCmdBox.MouseMove(Shift:TShiftState;x,y:Integer); begin if FMouseDown then begin if MoveInputCaretTo(x,y,false) then SetSelection(FMouseDownInputPos,FInputPos); end; end; function TCmdBox.MoveInputCaretTo(x,y:Integer;chl:Boolean):Boolean; var h,sl,q:Integer; begin if not FInput then Exit; y := y div FCharHeight; h := FLineHeightSum[FTopLine]+FLineOfTopLine+y; sl := FTopLine; while (slFInputBuffer.Length) then q:=FInputBuffer.Length-FInputX; FCaretX := q; FInputPos := FCaretX-FInputX; if Assigned(FOnAny) then FOnAny(Self,FInputBuffer); Invalidate; Result:=True; end else Result:=False; end; procedure TCmdBox.MouseDown(Button:TMouseButton;Shift:TShiftState;x,y:Integer); begin SetFocus; MoveInputCaretTo(x,y,True); FMouseDown:=True; SetSelection(-1,0); FMouseDownInputPos:=FInputPos; Invalidate; end; procedure TCmdBox.MouseUp(Button:TMouseButton;Shift:TShiftState;x,y:Integer); begin FMouseDown:=False; end; destructor TColorstring.Destroy; begin Clear; inherited Destroy; end; procedure TCmdBox.ScrollUp; var n:Integer; Firstwidestring : TColorstring; begin Firstwidestring:=FLines[0]; for n:=0 to Length(FLines)-2 do Flines[n] := FLines[n+1]; Firstwidestring.Clear; Firstwidestring.FDefaultBackGround := FBackGroundColor; Flines[High(Flines)]:=Firstwidestring; end; procedure TCmdBox.TextColors(FC,BC:TColor); begin FCurrentColor := FC; FCurrentBackGround := BC; end; procedure TCmdBox.TextColor(C:TColor); begin FCurrentColor:=C; end; procedure TCmdBox.TextBackGround(C:TColor); begin FCurrentBackGround:=C; end; procedure TCmdBox.TranslateScrollBarPosition; var GLine,Line : Integer; He :Integer; begin if (FLineOfTopLineFVisibleLineCount-FPageHeight then CurrentPos:=FVisibleLineCount-FPageHeight; {$IFNDEF LCLGTK} ScrollBarPosition(SB_VERT, CurrentPos); {$ENDIF} FVSBPos:=CurrentPos; TranslateScrollBarPosition; end; procedure TCmdBox.ScrollBarRange(Which: Integer; aRange,aPage: Integer); var ScrollInfo: TScrollInfo; begin if HandleAllocated then begin FillChar(ScrollInfo, SizeOf(ScrollInfo), 0); ScrollInfo.cbSize := SizeOf(ScrollInfo); ScrollInfo.fMask := SIF_RANGE or SIF_PAGE or SIF_DISABLENOSCROLL; // Dont't know, someone told me to kick it...so i did:P // {$ifdef Unix} { ScrollInfo.fMask := ScrollInfo.fMask or SIF_UPDATEPOLICY; if goThumbTracking in Options then ScrollInfo.ntrackPos := SB_POLICY_CONTINUOUS else ScrollInfo.ntrackPos := SB_POLICY_DISCONTINUOUS;} // {$endif}} ScrollInfo.nMin := 0; ScrollInfo.nMax := ARange; if APage<0 then APage := 0; ScrollInfo.nPage := APage; SetScrollInfo(Handle, Which, ScrollInfo, True); end; end; procedure TCmdBox.ScrollBarPosition(Which, Value: integer); var ScrollInfo : TScrollInfo; Vis : Boolean; begin if HandleAllocated then begin if Which = SB_VERT then Vis := FVSbVisible else FillChar(ScrollInfo, SizeOf(ScrollInfo), 0); ScrollInfo.cbSize := SizeOf(ScrollInfo); ScrollInfo.fMask := SIF_POS; ScrollInfo.nPos := Value; SetScrollInfo(Handle, Which, ScrollInfo, Vis); end; end; function TCmdBox.GetSystemMetricsGapSize(const Index:Integer):Integer; begin {$ifdef LCLWIN32} result:=0; {$else} result:=3; {$endif} end; procedure TCmdBox.SetBackGroundColor(c:TColor); begin if c<>FBackGroundColor then begin FBackGroundColor:=c; Invalidate; end; end; procedure TCmdBox.SetFont(F:TFont); var DC : HDC; Save : THandle; Metrics : TTextMetric; begin FFont.Assign(F); Canvas.Font := FFont; DC := GetDC(0); Save := SelectObject(DC,FFont.Handle); GetTextMetrics(DC, Metrics); SelectObject(DC, Save); ReleaseDC(0, DC); FCharHeight := Abs(Metrics.tmHeight)+2; Invalidate; end; // Still a Bug: Try having a cmdline with more lines than fit on screen : update doesn't work anymore... procedure TCmdBox.MakeInputVisible; var y : Integer; begin if not FAutoFollow then Exit; UpdateLineHeights; y:=FLineHeightSum[FInputY]+FInputBuffer.GetLineOfCaret(FClientWidth,FCaretX,FCaretWidth); if y>=FLineHeightSum[FTopLine]+FLineOfTopLine+FPageHeight then begin While y>=FLineHeightSum[FTopLine]+FLineHeights[FTopLine]+FPageHeight-1 do Inc(FTopLine); FLineOfTopLine:=y-(FLineHeightSum[FTopLine]+FPageHeight)+1; end else if yFVSBPos then begin FVSBPos:=y; if HandleAllocated then ScrollBarPosition(SB_Vert,y); end; end; procedure TCmdBox.MakeOutVisible; var y : Integer; begin if not FAutoFollow then Exit; UpdateLineHeights; y:=FLineHeightSum[FOutY]+FLines[FOutY].GetLineOfCaret(FClientWidth,FOutX,FCaretWidth); if y>=FLineHeightSum[FTopLine]+FLineOfTopLine+FPageHeight then begin While y>=FLineHeightSum[FTopLine]+FLineHeights[FTopLine]+FPageHeight-1 do Inc(FTopLine); FLineOfTopLine:=y-(FLineHeightSum[FTopLine]+FPageHeight)+1; end else if yFVSBPos then begin FVSBPos:=y; if HandleAllocated then ScrollBarPosition(SB_Vert,y); end; end; procedure TCmdBox.SetHistoryPos(v:Integer); begin if FInputIsPassWord then Exit; if v<0 then v:=FHistoryLength-1 else if v>=FHistoryLength then v:=0; if v<>FHistoryPos then begin if FHistoryPos=0 then begin FHistory[0].Clear; FHistory[0].PartOverWrite(FInputBuffer,FInputMinPos,FInputBuffer.Length,0); end; FInputBuffer.MaximumLength(FInputMinPos+FHistory[v].Length); FInputBuffer.OverWrite(FHistory[v],FInputMinPos); if FInputPos>FInputBuffer.Length then begin FInputPos:=FInputBuffer.Length; FCaretX:=FInputX+FInputPos; end; FHistoryPos:=v; end; if Assigned(FOnInputChange) then FOnInputChange(Self,FInputBuffer); MakeInputVisible; AdjustLineHeight(FInputY); AdjustScrollBars; Invalidate; end; procedure TCmdBox.UTF8KeyPress(var Key:TUTF8Char); begin if not FInput then Exit; if key>=#32 then begin if FSelStart<>-1 then DeleteSelected; FInputBuffer.Insert(FInputPos,key,FInputColor,FInputBackGround); Inc(FInputPos); FCaretX:=FInputX+FInputPos; FHistoryPos:=0; if assigned(FOnInputChange) then FOnInputChange(Self,FInputBuffer); end; if Assigned(OnAny) then OnAny(Self,FInputBuffer); AdjustScrollBars; MakeInputVisible; If FInputVisible then Invalidate; end; procedure TCmdBox.KeyDown(var Key:Word;Shift:TShiftState); var s : String; i : Integer; begin if not FInput then Exit; case Key of VK_END: begin key:=0; if (not (ssAlt in Shift)) and FInput and (FInputPos<>FInputBuffer.Length) then begin if not (ssShift in Shift) then SetSelection(-1,0) else RightSelection(FInputPos,FInputBuffer.Length); FInputPos:=FInputBuffer.Length; FCaretX:=FInputX+FInputPos; MakeInputVisible; Invalidate; end; end; VK_HOME: begin key:=0; if (not (ssAlt in Shift)) and FInput and (FInputPos<>FInputMinPos) then begin if not (ssShift in Shift) then SetSelection(-1,0) else LeftSelection(FInputMinPos,FInputPos); FInputPos:=FInputMinPos; FCaretX:=FInputX+FInputPos; MakeInputVisible; Invalidate; end; end; VK_LEFT: begin if (not (ssAlt in Shift)) and (FInput and (FInputPos>FInputMinPos)) then begin if not (ssShift in Shift) then SetSelection(-1,0) else LeftSelection(FInputPos-1,FInputPos); Dec(FInputPos); FCaretX:=FInputX+FInputPos; MakeInputVisible; Invalidate; end; end; VK_UP: begin if (not (ssAlt in Shift)) and FInput then begin SetSelection(-1,0); SetHistoryPos(FHistoryPos+1); end; end; VK_DOWN: begin if (not (ssAlt in Shift)) and FInput then begin SetSelection(-1,0); SetHistoryPos(FHistoryPos-1); end; end; VK_RIGHT: begin if (not (ssAlt in Shift)) and FInput and (FInputPos-1 then DeleteSelected else FInputBuffer.Delete(FInputPos); FHistoryPos:=0; if assigned(FOnInputChange) then FOnInputChange(Self,FInputBuffer); MakeInputVisible; AdjustLineHeight(FInputY); AdjustScrollBars; end; end; VK_RETURN: begin if FInput then begin s := FInputBuffer.GetString; s := Copy(s,FUTF8InputMinPos+1,Length(s)); if (FHistoryPos=0) then begin if (FInputBuffer.Length=FInputMinPos) or FInputIsPassWord then begin DeleteHistoryEntry(0); end else begin i:=HistoryIndexOf(s); if i>=0 then begin DeleteHistoryEntry(0); MakeFirstHistoryEntry(i); end else begin FHistory[0].Clear; FHistory[0].PartOverWrite(FInputBuffer,FInputMinPos,FInputBuffer.Length,0); end; end; end else begin DeleteHistoryEntry(0); MakeFirstHistoryEntry(FHistoryPos); end; FInput := False; if FLines[FOutY].Length<>0 then begin if FOutY>=FLineCount-1 then begin ScrollUp; Dec(FOutY); FInputY:=FOutY; AdjustLineHeight(FOutY); UpdateLineHeights; TranslateScrollBarPosition; end; FLines[FOutY+1].Clear; FLines[FOutY+1].OverWrite(FLines[FOutY],0); FLines[FOutY].Clear; if FInputIsPassWord then FLines[FOutY].OverWritePW(FInputBuffer,FInputMinPos,FInputX,FPassWordChar) else FLines[FOutY].OverWrite(FInputBuffer,FInputX); end else begin if FInputIsPassWord then FLines[FOutY].OverWritePW(FInputBuffer,FInputMinPos,FInputX,FPassWordChar) else FLines[FOutY].OverWrite(FInputBuffer,FInputX); end; Inc(FOutY); if FOutY>=FLineCount then begin ScrollUp; Dec(FOutY); FInputY:=FOutY; AdjustLineHeight(FOutY); UpdateLineHeights; TranslateScrollBarPosition; end; FOutX := 0; FCaretX := 0; FInputBuffer.Clear; if Assigned(OnInput) then OnInput(Self,s); if Assigned(OnAny) then OnAny(Self,FInputBuffer); AdjustScrollBars; Invalidate; end; end; VK_BACK: begin if FInput then begin if FSelStart<>-1 then DeleteSelected else begin If (FInputPos>FInputMinPos) then begin Dec(FInputPos); FInputBuffer.Delete(FInputPos); FCaretX:=FInputX+FInputPos; end; end; FHistoryPos:=0; if assigned(FOnInputChange) then FOnInputChange(Self,FInputBuffer); if Assigned(OnAny) then OnAny(Self,FInputBuffer); AdjustScrollBars; MakeInputVisible; If FInputVisible then Invalidate; end; end; VK_C: begin if (FInput) and (ssCtrl in Shift) then CopyToClipBoard; end; VK_V: begin if (FInput) and (ssCtrl in Shift) then PasteFromClipBoard; end; VK_X: begin if (FInput) and (ssCtrl in Shift) then CutToClipBoard; end; VK_A: begin if (FInput) and (ssCtrl in Shift) then begin SetSelection(FInputMinPos,FInputBuffer.Length); FInputPos:=FInputBuffer.Length; MakeInputVisible; if FInputVisible then Invalidate; end; end; end; if Assigned(OnAny) then OnAny(Self,FInputBuffer); end; procedure TCmdBox.InsertHistory; var i : Integer; t : TColorstring; begin t:=FHistory[FHistoryMax-1]; for i:=FHistoryMax-2 downto 0 do begin FHistory[i+1]:=FHistory[i]; end; FHistory[0] := t; FHistoryPos := 0; If FHistoryLengthLength(Desc) then Break; case Desc[Pp+1] of #9,#10,#32,#46,#196: begin if Pp+2>Length(Desc) then Break; //Incomplete Escape Seq...ignore l:=3; end; #33,#47,#197: begin if Pp+3>Length(Desc) then Break; //Incomplete Escape Seq...ignore l:=4; end; else begin l:=2; end; end; end else l:=UTF8CharacterLength(@Desc[PP]); FInputBuffer.OverWriteChar(Copy(Desc,Pp,l),i,FGraphicCharWidth,DFC,DBC); Inc(i); Inc(Pp,l); end; FInputPos := i; FInputMinPos := i; // FInputBuffer.OverWrite(Desc,0,DFC,DBC); FInputIsPassWord := False; FInputColor := IFC; FInputBackground := IBC; FInputBuffer.PassWordStart:=MaxInt; InsertHistory; MakeInputVisible; end; procedure TCmdBox.StartReadPassWord(DFC,DBC:TColor;const Desc:string;IFC,IBC:TColor); begin StartRead(DFC,DBC,Desc,IFC,IBC); FInputBuffer.PassWordStart := UTF8Length(Desc); FInputBuffer.PassWordChar := FPassWordChar; FInputIsPassWord := True; end; procedure TCmdBox.StopRead; begin FInput:=False; end; procedure TCmdBox.DeleteHistoryEntry(i:Integer); var j:Integer; Temp:TColorstring; begin Temp:=FHistory[i]; for j:=i to FHistoryLength-2 do FHistory[j]:=FHistory[j+1]; FHistory[FHistoryLength-1]:=Temp; Dec(FHistoryLength); if FHistoryPos>=i then Dec(FHistoryPos); end; procedure TCmdBox.MakeFirstHistoryEntry(i:Integer); var Temp:TColorstring; begin if FHistoryPos<>0 then begin Temp:=FHistory[i]; for i:=i-1 downto 0 do FHistory[i+1]:=FHistory[i]; FHistory[0]:=Temp; end; end; procedure TCmdBox.Clear; var i:Integer; begin for i:=0 to Length(FLines)-1 do Flines[i].Clear; FCaretX := 0; FInputY := 0; FOutX := 0; FOutY := 0; if FInput then FInputY:=0; Invalidate; end; procedure TCmdBox.Writeln(s:string); begin write(s+#13#10); end; const AnsiColors:array['0'..'7'] of TColor=(clBlack,clRed,clGreen,clYellow,clBlue,clFuchsia,clAqua,clWhite); procedure TCmdBox.IntWrite; var Pp : Integer; l : Integer; s : String; EscPos : Integer; EscSubMode : Integer; begin S := FCurrentString; Pp := 1; while Pp<=Length(S) do begin l:=1; case FEscapeMode of escmNone: begin if S[Pp]=#27 then begin case FEscapeCodeType of esctCmdBox: begin FEscapeMode := escmOperation; FEscapeData := ''; end; esctAnsi: begin FEscapeMode := escmAnsiOperation; FEscapeData := ''; end; esctNone: begin // Simply ignore it end; end; end else begin l:=UTF8CharacterLength(@S[Pp]); if l=1 then begin case s[Pp] of #13:FOutX:=0; #10: begin AdjustLineHeight(FOutY); if FLines[FOutY].Length=0 then FLines[FOutY].DefaultBackGround:=FCurrentBackGround; Inc(FOutY); if FOutY>=Length(FLines) then begin ScrollUp; Dec(FOutY); AdjustLineHeight(FOutY); UpdateLineHeights; TranslateScrollBarPosition; end; end; else begin FLines[FOutY].OverWrite(s[Pp],FOutX,FCurrentColor,FCurrentBackGround); Inc(FOutX); end; end; end else begin FLines[FOutY].OverWrite(Copy(s,Pp,l),FOutX,FCurrentColor,FCurrentBackGround); Inc(FOutX); end; end; end; escmOperation: begin case S[Pp] of #9,#10,#32,#46,#196: begin FEscapeData := S[Pp]; FEscapeMode := escmData1; end; #33,#47,#197: begin FEscapeData := S[Pp]; FEscapeMode := escmData2; end; else begin FLines[FOutY].OverWriteChar(#27+S[Pp],FOutX,FGraphicCharWidth,FCurrentColor,FCurrentBackGround); Inc(FOutX); FEscapeMode:=escmNone; end; end; end; escmData1: begin FLines[FOutY].OverWriteChar(#27+FEscapeData+S[Pp],FOutX,FGraphicCharWidth,FCurrentColor,FCurrentBackGround); Inc(FOutX); FEscapeMode:=escmNone; end; escmData2: begin FEscapeData := FEscapeData+S[Pp]; FEscapeMode := escmData1; end; escmAnsiOperation: begin case S[Pp] of '[':FEscapeMode:=escmAnsiSquare; else FEscapeMode:=escmNone; end; end; escmAnsiSquare: begin case S[Pp] of 'm': begin EscPos := 1; EscSubMode := 0; while EscPos<=Length(FEscapeData) do begin case EscSubMode of 0: begin case FEscapeData[EscPos] of '0': begin // No Reset Values know here...just assume FCurrentColor:=clSilver; FCurrentBackGround:=clBlack; end; '7': begin // Reverse? What now... end; '3':EscSubMode:=3; '4':EscSubMode:=4; end; end; 1: begin // Just collect the expected ";", not sure what to do if it isn't there... EscSubMode:=0; end; 3: begin if FEscapeData[EscPos] in ['0'..'7'] then FCurrentColor:=AnsiColors[FEscapeData[EscPos]]; EscSubMode:=1; end; 4: begin if FEscapeData[EscPos] in ['0'..'7'] then FCurrentBackGround:=AnsiColors[FEscapeData[EscPos]]; EscSubMode:=1; end; end; Inc(EscPos); end; FEscapeMode:=escmNone; end; else begin FEscapeData:=FEscapeData+S[Pp]; end; end; end; end; Inc(Pp,l); end; if FInput then begin if FLines[FOutY].Length=0 then begin if (FInputY<>FOutY) then FInputY:=FOutY; end else begin if FInputY<>FOutY+1 then FInputY:=FOutY+1; end; if FInputY>=FLineCount then begin ScrollUp; Dec(FOutY); Dec(FInputY); FInputY:=FOutY; AdjustLineHeight(FOutY); UpdateLineHeights; TranslateScrollBarPosition; end; MakeInputVisible; end else MakeOutVisible; AdjustLineHeight(FOutY); if not FInput then FCaretX:=FOutX; AdjustScrollBars; end; procedure TCmdBox.SetOutY(v:Integer); begin if v>FLineCount-1 then v:=FLineCount-1; FOutY:=v; end; procedure TCmdBox.Resize; begin inherited Resize; AdjustScrollBars; if FVSBPos>=FVisibleLineCount-FPageHeight then begin FVSBPos:=FVisibleLineCount-FPageHeight; if FVSBPos<0 then FVSBPos:=0; end; TranslateScrollBarPosition; end; function TCmdBox.AdjustLineHeight(i:Integer):Integer; var LineC : Integer; LineC2 : Integer; begin if (FInputY=i) then begin LineC := FLines[i].LineCount(FClientWidth,-1,FCaretWidth); LineC2 := FInputBuffer.LineCount(FClientWidth,FCaretX,FCaretWidth); if LineC2>LineC then LineC:=LineC2; end else LineC:=FLines[i].LineCount(FClientWidth,-1,FCaretWidth); Result := LineC; FLineHeights[i] := Result; end; function TCmdBox.UpdateLineHeights:integer; var i:integer; begin Result:=0; for i:=0 to FLineCount-1 do begin FLineHeightSum[i]:=Result; Inc(Result,AdjustLineHeight(i)); end; end; procedure TCmdBox.AdjustScrollBars; var LH : Integer; begin FClientWidth := Width-FVSBWidth; FClientHeight := Height; FPageHeight := FClientHeight div FCharHeight; FVisibleLines := FPageHeight+ord(FClientHeight mod FCharHeight<>0); LH := UpdateLineHeights; if LH<>FVisibleLineCount then begin FVisibleLineCount:=LH; if FVisibleLineCount<=FVSBPos+FPageHeight then begin FVSBPos:=FVisibleLineCount-FPageHeight; if FVSBPos<0 then FVSBPos:=0; if HandleAllocated then ScrollBarPosition(SB_Vert,FVSBPos); TranslateScrollBarPosition; end; end; if FVisibleLineCountFTopLine then begin FTopLine:=Nr; AdjustScrollBars; end; end; procedure TCmdBox.SetLineCount(c: Integer); var i:Integer; begin if c<1 then c:=1; if c<>FLineCount then begin for i:=0 to FLineCount-1 do FLines[i].Free; FLineCount:=c; SetLength(FLines,FLinecount); for i:=0 to FlineCount-1 do begin FLines[i]:=TColorstring.Create(Canvas.Font); FLines[i].DefaultBackGround:=FBackGroundColor; FLines[i].TabWidth:=FTabWidth; end; SetLength(FLineHeights,FLineCount); SetLength(FLineHeightSum,FLineCount); AdjustScrollBars; end; end; procedure TCmdBox.Paint; Var y,m : Integer; CurrentLine : Integer; begin inherited Paint; with canvas do begin if (csdesigning in componentstate) then begin Brush.Style := bsSolid; Brush.Color := clBlack; FillRect(0,0,FClientWidth,FClientHeight); exit; end; Font := FFont; Brush.Style := bsSolid; m := FVisibleLines-1; y := -FLineOfTopLine; CurrentLine := FTopLine; while (y<=m) and (CurrentLine doublecmd-0.5.8/components/CmdLine/tcmdbox.lrs0000644000175000017500000000252711077656332020410 0ustar alexxalexxLazarusResources.Add('TCmdBox','XPM',[ '/* XPM */'#13#10'static char *tcmdbox[] = {'#13#10'/* width height num_color' +'s chars_per_pixel */'#13#10'" 24 24 8 1",'#13#10'/*' +' colors */'#13#10'"` c #C0C0C0",'#13#10'". c #000000",'#13#10'"# c #000000"' +','#13#10'"a c #000000",'#13#10'"b c #000000",'#13#10'"c c #000000",'#13#10 +'"d c #000000",'#13#10'"e c #000000",'#13#10'/* pixels */'#13#10'"``````````' +'``````````````",'#13#10'"`......................`",'#13#10'"`..`...`....`..' +'``...``.`",'#13#10'"`.`..`.`....`..`.`.`...`",'#13#10'"`.`.....`..```.``..`' +'...`",'#13#10'"`.`..`..`..`.`.`.`.`...`",'#13#10'"`..`.....`.`.`.``...``.`"' +','#13#10'"`......................`",'#13#10'"`......................`",'#13 +#10'"`......................`",'#13#10'"`......................`",'#13#10'"`' +'......................`",'#13#10'"`.````.................`",'#13#10'"`.....' +'.................`",'#13#10'"`......................`",'#13#10'"`..........' +'............`",'#13#10'"`......................`",'#13#10'"`...............' +'.......`",'#13#10'"`......................`",'#13#10'"`....................' +'..`",'#13#10'"`......................`",'#13#10'"`......................`",' +#13#10'"`......................`",'#13#10'"````````````````````````"'#13#10 +'};'#13#10 ]); doublecmd-0.5.8/components/CmdLine/cmdbox.pas0000644000175000017500000000060212014201074020154 0ustar alexxalexx{ Diese Datei wurde automatisch von Lazarus erzeugt. Sie darf nicht bearbeitet werden! Dieser Quelltext dient nur dem bersetzen und Installieren des Packages. } unit cmdbox; interface uses uCmdBox, LazarusPackageIntf; implementation procedure Register; begin RegisterUnit('uCmdBox', @uCmdBox.Register); end; initialization RegisterPackage('cmdbox', @Register); end. doublecmd-0.5.8/components/CmdLine/tcmdbox.xpm0000644000175000017500000000172411077656332020412 0ustar alexxalexx/* XPM */ static char *tcmdbox[] = { /* width height num_colors chars_per_pixel */ " 24 24 8 1", /* colors */ "` c #C0C0C0", ". c #000000", "# c #000000", "a c #000000", "b c #000000", "c c #000000", "d c #000000", "e c #000000", /* pixels */ "````````````````````````", "`......................`", "`..`...`....`..``...``.`", "`.`..`.`....`..`.`.`...`", "`.`.....`..```.``..`...`", "`.`..`..`..`.`.`.`.`...`", "`..`.....`.`.`.``...``.`", "`......................`", "`......................`", "`......................`", "`......................`", "`......................`", "`.````.................`", "`......................`", "`......................`", "`......................`", "`......................`", "`......................`", "`......................`", "`......................`", "`......................`", "`......................`", "`......................`", "````````````````````````" }; doublecmd-0.5.8/components/CmdLine/wnmainform.pas0000644000175000017500000001511412014201074021061 0ustar alexxalexx{ Copyright (C) 2007 Julian Schutsch This source is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. A copy of the GNU General Public License is available on the World Wide Web at . You can also obtain it by writing to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. This Software is GPL, not LGPL as the libary it uses ! Changelog 10.8.2007 : Added "Buttons" Unit to avoid "TButton" missing error on 0.9.22 (Linux) } unit wnmainform; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Graphics, Dialogs, ExtCtrls,LCLType, ucmdbox, StdCtrls, Controls, Buttons; type { TWMainForm } TWMainForm = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; CmdBox: TCmdBox; CbSetCaret: TComboBox; Label1: TLabel; HistoryList: TListBox; RightPanel: TPanel; Splitter1: TSplitter; ReaderTimer: TTimer; ProcessTimer: TTimer; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure CmdBoxInput(ACmdBox: TCmdBox; Input: String); procedure CbSetCaretChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ProcessTimerTimer(Sender: TObject); procedure ReaderTimerTimer(Sender: TObject); private TextPosition : Integer; DText : TStringList; Rdpw : Boolean; FProcess : Integer; end; var WMainForm: TWMainForm; implementation { TWMainForm } procedure TWMainForm.ReaderTimerTimer(Sender: TObject); var i:Integer; begin CmdBox.TextColors(clRed,clNavy); for i:=0 to 0 do begin if TextPosition=DText.Count then begin CmdBox.ClearLine; CmdBox.TextColor(clYellow); CmdBox.Writeln(#27#10#196); TextPosition := 0; ReaderTimer.Enabled := False; end; end; end; procedure TWMainForm.FormCreate(Sender: TObject); begin DoubleBuffered := True; DText := TStringList.Create; if FileExists('demotext.txt') then DText.LoadFromFile('demotext.txt'); CmdBox.StartRead(clRed,clNavy,'>',clYellow,clNavy); CmdBox.TextColors(clWhite,clNavy); CmdBox.Writeln(#27#218#27#10#191); CmdBox.Writeln(#27#179'Type "help" to see a short list of available commands.'#27#10#179); CmdBox.Writeln(#27#217#27#10#217); end; procedure TWMainForm.CmdBoxInput(ACmdBox: TCmdBox; Input: String); var i:Integer; begin if rdpw then begin CmdBox.TextColors(clLime,clBlue); CmdBox.Writeln('Your Secret Password : '+Input); CmdBox.TextColors(clSilver,clNavy); rdpw:=false; end else begin rdpw:=false; Input:=LowerCase(Input); if Input='help' then begin CmdBox.TextColors(clLime,clNavy); CmdBox.Writeln(#27#218#27#197#128#0#27#194#27#10#191); CmdBox.Writeln(#27#179' Command'#27#33#128#0#27#179' Explanation'#27#10#179); CmdBox.Writeln(#27#195#27#197#128#0#27#198#27#10#180); CmdBox.Writeln(#27#179' help'#27#33#128#0#27#179' Gives this list of Commands'#27#10#179); CmdBox.Writeln(#27#179' clear'#27#33#128#0#27#179' Clears the Content of CmdBox'#27#10#179); CmdBox.Writeln(#27#179' start'#27#33#128#0#27#179' Outputs the Content of Demotext.txt from the beginning'#27#10#179); CmdBox.Writeln(#27#179' stop'#27#33#128#0#27#179' Stops output and resets to Start'#27#10#179); CmdBox.Writeln(#27#179' pause'#27#33#128#0#27#179' Interrupts output'#27#10#179); CmdBox.Writeln(#27#179' resume'#27#33#128#0#27#179' Resumes output from the last position'#27#10#179); CmdBox.Writeln(#27#179' clearhistory'#27#33#128#0#27#179' Clears all history entries'#27#10#179); CmdBox.Writeln(#27#179' readpwd'#27#33#128#0#27#179' Read a Password (just as a test)'#27#10#179); CmdBox.Writeln(#27#179' exit'#27#33#128#0#27#179' Exit program'#27#10#179); CmdBox.Writeln(#27#217#27#197#128#0#27#193#27#10#217); CmdBox.TextColor(clSilver); end else if Input='readpwd' then begin rdpw:=true; end else if Input='clearhistory' then begin CmdBox.TextColor(clYellow); CmdBox.Writeln('Clear History...'); CmdBox.TextColor(clSilver); CmdBox.ClearHistory; end else if Input='start' then begin TextPosition:=0; ReaderTimer.Enabled:=true; CmdBox.TextColors(clLime,clBlue); CmdBox.Writeln('Start...'); end else if Input='stop' then begin TextPosition:=0; ReaderTimer.Enabled:=false; CmdBox.TextColors(clRed,clBlue); CmdBox.Writeln('Stop...'); end else if Input='pause' then begin ReaderTimer.Enabled:=false; CmdBox.TextColors(clPurple,clBlue); CmdBox.Writeln('Pause...'); end else if Input='resume' then begin ReaderTimer.Enabled:=true; CmdBox.TextColors(clGreen,clBlue); CmdBox.Writeln('Continue...'); end else if Input='clear' then begin CmdBox.Clear; end else if Input='exit' then close else begin CmdBox.TextColors(clYellow,ClRed); CmdBox.Writeln('Invalid Command!'); end; end; if rdpw then CmdBox.StartReadPassWord(clYellow,clNavy,'Pwd:',clLime,clNavy) else CmdBox.StartRead(clRed,clNavy,'>',clYellow,clNavy); HistoryList.Clear; for i:=0 to CmdBox.HistoryCount-1 do HistoryList.Items.Add(CmdBox.History[i]); end; procedure TWMainForm.CbSetCaretChange(Sender: TObject); begin case cbSetCaret.ItemIndex of 0:CmdBox.CaretType := cartLine; 1:CmdBox.CaretType := cartSubBar; 2:CmdBox.CaretType := cartBigBar; end; CmdBox.SetFocus; end; procedure TWMainForm.Button2Click(Sender: TObject); begin CmdBox.ClearHistory; HistoryList.Clear; end; procedure TWMainForm.Button3Click(Sender: TObject); begin FProcess:=0; ProcessTimer.Enabled:=True; end; procedure TWMainForm.Button1Click(Sender: TObject); begin Close; end; procedure TWMainForm.FormDestroy(Sender: TObject); begin DText.Free; end; procedure TWMainForm.ProcessTimerTimer(Sender: TObject); begin if FProcess=100 then begin CmdBox.ClearLine; ProcessTimer.Enabled:=False; end else begin CmdBox.TextColors(clRed,clBlue); CmdBox.Write('Processing ['+IntToStr(FProcess)+'%]'#13); end; Inc(FProcess); end; initialization {$I wnmainform.lrs} end. doublecmd-0.5.8/components/CmdLine/COPYING.LESSER0000644000175000017500000001717211077656332020257 0ustar alexxalexx GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library.doublecmd-0.5.8/components/CmdLine/demotext.txt0000644000175000017500000000355712014201074020601 0ustar alexxalexxHello This is a little Demo for TCmdBox You can type commands while this text is written here ! Available commands : * help : Short list for all commands * stop : Stops me from reading this text... * pause : Interrupts me * resume : Continues at the last position pause was called... * start : Restarts reading this text.. * clear : Clears the output buffer * clearhistory : clears history buffer for previous input * exit : Exits the program A few details to TCmdBox... To put TCmdBox into Inputmode use (example) CmdBox.StartRead(clRed,clBlack,'>',clSilver,clBlack); If you give a string parameter to StartRead, it will be displayed directly before the input and will follow it. Input is received through an Event called OnInput. Changes can be watched by the programm by OnInputChange. To keep TCmdBox in Inputmode just call StartRead in OnInput again. If you resize the application or use splitter in the middle you notice lines are wrapped, there is no fixed or limited line width. Input is also saved in a history list with limited to HistoryMax entries including current input. Output content by using: CmdBox.Write('Text'); or CmdBox.Writeln('Text...'); These calls are supposed to be Threadsafe ! You can use all font and background colors possible on the Operating System, for example CmdBox.TextColor(clRed); CmdBox.TextBackGround(clSilver); or CmdBox.TextColors(clRed,clSilver); The background color of the last character in a line determines the background color of the rest of the line. The component should be able to show correct UTF8 codes of any kind (up to the whole 21 bits), therefore: €, ä, ö,ü should be correctly written as Euro, Ae, Oe, Ue (the last three are german) if you have selected a UTF8 capable Font and LCL-Interface. I hope you can use the component, if you find bugs or have suggestions contact me by email : kccmp@gmx.dedoublecmd-0.5.8/components/CmdLine/COPYING0000644000175000017500000010574111077656332017263 0ustar alexxalexx GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read .doublecmd-0.5.8/components/CmdLine/wnmainform.lrs0000644000175000017500000001436411077656332021127 0ustar alexxalexx{ Das ist eine automatisch erzeugte Lazarus-Ressourcendatei } LazarusResources.Add('TWMainForm','FORMDATA',[ 'TPF0'#10'TWMainForm'#9'WMainForm'#4'Left'#3'?'#1#6'Height'#3#224#1#3'Top'#3 +'Q'#1#5'Width'#3#208#2#13'ActiveControl'#7#6'CmdBox'#7'Caption'#6#27'TCmdBox' +' Example Application'#12'ClientHeight'#3#224#1#11'ClientWidth'#3#208#2#8'On' +'Create'#7#10'FormCreate'#9'OnDestroy'#7#11'FormDestroy'#8'Position'#7#14'po' +'ScreenCenter'#10'LCLVersion'#6#6'0.9.25'#0#6'TPanel'#10'RightPanel'#4'Left' +#3'C'#2#6'Height'#3#224#1#5'Width'#3#141#0#5'Align'#7#7'alRight'#12'ClientHe' +'ight'#3#224#1#11'ClientWidth'#3#141#0#8'TabOrder'#2#0#0#6'TLabel'#6'Label1' +#4'Left'#2#16#6'Height'#2#14#3'Top'#2#8#5'Width'#2'#'#7'Caption'#6#7'History' +#11'ParentColor'#8#0#0#7'TButton'#7'Button1'#4'Left'#2#16#6'Height'#2#25#3'T' +'op'#3#184#1#5'Width'#2'm'#7'Anchors'#11#6'akLeft'#7'akRight'#8'akBottom'#0 +#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#12'End Programm'#7'OnClick'#7 +#12'Button1Click'#8'TabOrder'#2#0#0#0#8'TListBox'#11'HistoryList'#4'Left'#2 +#16#6'Height'#3#29#1#3'Top'#2#24#5'Width'#2'm'#7'Anchors'#11#5'akTop'#6'akLe' +'ft'#7'akRight'#8'akBottom'#0#8'TabOrder'#2#1#0#0#7'TButton'#7'Button2'#4'Le' +'ft'#2#16#6'Height'#2#25#3'Top'#3';'#1#5'Width'#2'm'#7'Anchors'#11#6'akLeft' +#7'akRight'#8'akBottom'#0#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#5'C' +'lear'#7'OnClick'#7#12'Button2Click'#8'TabOrder'#2#2#0#0#9'TComboBox'#10'CbS' +'etCaret'#4'Left'#2#16#6'Height'#2#21#3'Top'#3#141#1#5'Width'#2'm'#7'Anchors' +#11#6'akLeft'#7'akRight'#8'akBottom'#0#16'AutoCompleteText'#11#22'cbactEndOf' +'LineComplete'#20'cbactSearchAscending'#0#10'ItemHeight'#2#13#9'ItemIndex'#2 +#0#13'Items.Strings'#1#6#10'Caret-Line'#6#13'Caret-Sub-Bar'#6#13'Caret-Big-B' +'ar'#0#8'OnChange'#7#16'CbSetCaretChange'#5'Style'#7#14'csDropDownList'#8'Ta' +'bOrder'#2#3#4'Text'#6#10'Caret-Line'#0#0#7'TButton'#7'Button3'#4'Left'#2#16 +#6'Height'#2#25#3'Top'#3'a'#1#5'Width'#2'm'#7'Anchors'#11#6'akLeft'#7'akRigh' +'t'#8'akBottom'#0#7'Caption'#6#7'Process'#7'OnClick'#7#12'Button3Click'#8'Ta' +'bOrder'#2#4#0#0#0#9'TSplitter'#9'Splitter1'#4'Left'#3'>'#2#6'Height'#3#224#1 +#5'Width'#2#5#5'Align'#7#7'alRight'#7'Beveled'#9#12'ResizeAnchor'#7#7'akRigh' +'t'#0#0#7'TCmdBox'#6'CmdBox'#6'Height'#3#224#1#5'Width'#3'>'#2#5'Align'#7#8 +'alClient'#10'CaretColor'#4#255#128#0#0#9'CaretType'#7#8'cartUser'#10'CaretW' +'idth'#2#1#11'CaretHeight'#2#13#11'CaretYShift'#2#3#7'OnInput'#7#11'CmdBoxIn' +'put'#9'LineCount'#3#232#3#12'Font.CharSet'#7#12'ANSI_CHARSET'#10'Font.Color' +#7#8'clSilver'#11'Font.Height'#2#240#9'Font.Name'#6#5'Arial'#10'Font.Pitch'#7 +#10'fpVariable'#15'BackGroundColor'#7#6'clNavy'#8'TabWidth'#2'<'#12'PassWord' +'Char'#6#1'*'#10'HistoryMax'#2#10#13'InputSelColor'#7#8'clPurple'#18'InputSe' +'lBackGround'#7#8'clSilver'#13'CaretInterval'#3#244#1#23'GraphicalCharacterW' +'idth'#2#10#10'AutoFollow'#9#0#0#6'TTimer'#11'ReaderTimer'#8'Interval'#3#188 +#2#7'OnTimer'#7#16'ReaderTimerTimer'#4'left'#2'B'#3'top'#2'K'#0#0#6'TTimer' +#12'ProcessTimer'#7'Enabled'#8#8'Interval'#2'd'#7'OnTimer'#7#17'ProcessTimer' +'Timer'#4'left'#2'h'#3'top'#2'K'#0#0#0#10'TWMainForm'#9'WMainForm'#4'Left'#3 +'?'#1#6'Height'#3#224#1#3'Top'#3'Q'#1#5'Width'#3#208#2#13'ActiveControl'#7#6 +'CmdBox'#7'Caption'#6#27'TCmdBox Example Application'#12'ClientHeight'#3#224 +#1#11'ClientWidth'#3#208#2#8'OnCreate'#7#10'FormCreate'#9'OnDestroy'#7#11'Fo' +'rmDestroy'#8'Position'#7#14'poScreenCenter'#10'LCLVersion'#6#6'0.9.25'#0#6 +'TPanel'#10'RightPanel'#4'Left'#3'C'#2#6'Height'#3#224#1#5'Width'#3#141#0#5 +'Align'#7#7'alRight'#12'ClientHeight'#3#224#1#11'ClientWidth'#3#141#0#8'TabO' +'rder'#2#0#0#6'TLabel'#6'Label1'#4'Left'#2#16#6'Height'#2#14#3'Top'#2#8#5'Wi' +'dth'#2'#'#7'Caption'#6#7'History'#11'ParentColor'#8#0#0#7'TButton'#7'Button' +'1'#4'Left'#2#16#6'Height'#2#25#3'Top'#3#184#1#5'Width'#2'm'#7'Anchors'#11#6 +'akLeft'#7'akRight'#8'akBottom'#0#25'BorderSpacing.InnerBorder'#2#4#7'Captio' +'n'#6#12'End Programm'#7'OnClick'#7#12'Button1Click'#8'TabOrder'#2#0#0#0#8'T' +'ListBox'#11'HistoryList'#4'Left'#2#16#6'Height'#3#29#1#3'Top'#2#24#5'Width' +#2'm'#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#8'akBottom'#0#8'TabOrder'#2 +#1#0#0#7'TButton'#7'Button2'#4'Left'#2#16#6'Height'#2#25#3'Top'#3';'#1#5'Wid' +'th'#2'm'#7'Anchors'#11#6'akLeft'#7'akRight'#8'akBottom'#0#25'BorderSpacing.' +'InnerBorder'#2#4#7'Caption'#6#5'Clear'#7'OnClick'#7#12'Button2Click'#8'TabO' +'rder'#2#2#0#0#9'TComboBox'#10'CbSetCaret'#4'Left'#2#16#6'Height'#2#21#3'Top' +#3#141#1#5'Width'#2'm'#7'Anchors'#11#6'akLeft'#7'akRight'#8'akBottom'#0#16'A' +'utoCompleteText'#11#22'cbactEndOfLineComplete'#20'cbactSearchAscending'#0#10 +'ItemHeight'#2#13#9'ItemIndex'#2#0#13'Items.Strings'#1#6#10'Caret-Line'#6#13 +'Caret-Sub-Bar'#6#13'Caret-Big-Bar'#0#8'OnChange'#7#16'CbSetCaretChange'#5'S' +'tyle'#7#14'csDropDownList'#8'TabOrder'#2#3#4'Text'#6#10'Caret-Line'#0#0#7'T' +'Button'#7'Button3'#4'Left'#2#16#6'Height'#2#25#3'Top'#3'a'#1#5'Width'#2'm'#7 +'Anchors'#11#6'akLeft'#7'akRight'#8'akBottom'#0#7'Caption'#6#7'Process'#7'On' +'Click'#7#12'Button3Click'#8'TabOrder'#2#4#0#0#0#9'TSplitter'#9'Splitter1'#4 ,'Left'#3'>'#2#6'Height'#3#224#1#5'Width'#2#5#5'Align'#7#7'alRight'#7'Beveled' +#9#12'ResizeAnchor'#7#7'akRight'#0#0#7'TCmdBox'#6'CmdBox'#6'Height'#3#224#1#5 +'Width'#3'>'#2#5'Align'#7#8'alClient'#10'CaretColor'#4#255#128#0#0#9'CaretTy' +'pe'#7#8'cartUser'#10'CaretWidth'#2#1#11'CaretHeight'#2#13#11'CaretYShift'#2 +#3#7'OnInput'#7#11'CmdBoxInput'#9'LineCount'#3#232#3#12'Font.CharSet'#7#12'A' +'NSI_CHARSET'#10'Font.Color'#7#8'clSilver'#11'Font.Height'#2#240#9'Font.Name' +#6#5'Arial'#10'Font.Pitch'#7#10'fpVariable'#15'BackGroundColor'#7#6'clNavy'#8 +'TabWidth'#2'<'#12'PassWordChar'#6#1'*'#10'HistoryMax'#2#10#13'InputSelColor' +#7#8'clPurple'#18'InputSelBackGround'#7#8'clSilver'#13'CaretInterval'#3#244#1 +#23'GraphicalCharacterWidth'#2#10#10'AutoFollow'#9#0#0#6'TTimer'#11'ReaderTi' +'mer'#8'Interval'#3#188#2#7'OnTimer'#7#16'ReaderTimerTimer'#4'left'#2'B'#3't' +'op'#2'K'#0#0#6'TTimer'#12'ProcessTimer'#7'Enabled'#8#8'Interval'#2'd'#7'OnT' +'imer'#7#17'ProcessTimerTimer'#4'left'#2'h'#3'top'#2'K'#0#0#0 ]); doublecmd-0.5.8/components/CmdLine/cmdbox.lpk0000644000175000017500000000242612154651644020206 0ustar alexxalexx doublecmd-0.5.8/components/CmdLine/CmdLineExample.lpr0000644000175000017500000000050112014201074021537 0ustar alexxalexxprogram CmdLineExample; {$mode objfpc}{$H+} uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Interfaces, // this includes the LCL widgetset Forms { add your units here }, wnmainform; begin Application.Initialize; Application.CreateForm(TWMainForm, WMainForm); Application.Run; end. doublecmd-0.5.8/components/CmdLine/wnmainform.lfm0000644000175000017500000000611011077656332021073 0ustar alexxalexxobject WMainForm: TWMainForm Left = 319 Height = 480 Top = 337 Width = 720 ActiveControl = CmdBox Caption = 'TCmdBox Example Application' ClientHeight = 480 ClientWidth = 720 OnCreate = FormCreate OnDestroy = FormDestroy Position = poScreenCenter LCLVersion = '0.9.25' object RightPanel: TPanel Left = 579 Height = 480 Width = 141 Align = alRight ClientHeight = 480 ClientWidth = 141 TabOrder = 0 object Label1: TLabel Left = 16 Height = 14 Top = 8 Width = 35 Caption = 'History' ParentColor = False end object Button1: TButton Left = 16 Height = 25 Top = 440 Width = 109 Anchors = [akLeft, akRight, akBottom] BorderSpacing.InnerBorder = 4 Caption = 'End Programm' OnClick = Button1Click TabOrder = 0 end object HistoryList: TListBox Left = 16 Height = 285 Top = 24 Width = 109 Anchors = [akTop, akLeft, akRight, akBottom] TabOrder = 1 end object Button2: TButton Left = 16 Height = 25 Top = 315 Width = 109 Anchors = [akLeft, akRight, akBottom] BorderSpacing.InnerBorder = 4 Caption = 'Clear' OnClick = Button2Click TabOrder = 2 end object CbSetCaret: TComboBox Left = 16 Height = 21 Top = 397 Width = 109 Anchors = [akLeft, akRight, akBottom] AutoCompleteText = [cbactEndOfLineComplete, cbactSearchAscending] ItemHeight = 13 ItemIndex = 0 Items.Strings = ( 'Caret-Line' 'Caret-Sub-Bar' 'Caret-Big-Bar' ) OnChange = CbSetCaretChange Style = csDropDownList TabOrder = 3 Text = 'Caret-Line' end object Button3: TButton Left = 16 Height = 25 Top = 353 Width = 109 Anchors = [akLeft, akRight, akBottom] Caption = 'Process' OnClick = Button3Click TabOrder = 4 end end object Splitter1: TSplitter Left = 574 Height = 480 Width = 5 Align = alRight Beveled = True ResizeAnchor = akRight end object CmdBox: TCmdBox Height = 480 Width = 574 Align = alClient CaretColor = 33023 CaretType = cartUser CaretWidth = 1 CaretHeight = 13 CaretYShift = 3 OnInput = CmdBoxInput LineCount = 1000 Font.CharSet = ANSI_CHARSET Font.Color = clSilver Font.Height = -16 Font.Name = 'Arial' Font.Pitch = fpVariable BackGroundColor = clNavy TabWidth = 60 PassWordChar = '*' HistoryMax = 10 InputSelColor = clPurple InputSelBackGround = clSilver CaretInterval = 500 GraphicalCharacterWidth = 10 AutoFollow = True end object ReaderTimer: TTimer Interval = 700 OnTimer = ReaderTimerTimer left = 66 top = 75 end object ProcessTimer: TTimer Enabled = False Interval = 100 OnTimer = ProcessTimerTimer left = 104 top = 75 end end doublecmd-0.5.8/components/chsdet/0000755000175000017500000000000012257501472016152 5ustar alexxalexxdoublecmd-0.5.8/components/chsdet/chsdet.lpk0000644000175000017500000001545112154651644020145 0ustar alexxalexx doublecmd-0.5.8/components/chsdet/Licence.txt0000644000175000017500000005750512014201074020253 0ustar alexxalexx GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS doublecmd-0.5.8/components/chsdet/chsd_dll_intf.pas0000644000175000017500000000610412014201074021436 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: chsd_dll_intf.pas,v 1.4 2009/07/12 15:13:56 ya_nick Exp $ unit chsd_dll_intf; interface const NS_OK = 0; NS_ERROR_OUT_OF_MEMORY = $8007000e; type rCharsetInfo = record Name: pChar; CodePage: integer; Language: pChar; end; prCharsetInfo = ^rCharsetInfo; rAboutHolder = record MajorVersionNr: Cardinal; MinorVersionNr: Cardinal; BuildVersionNr: Cardinal; About: pChar; end; eBOMKind =( BOM_Not_Found, BOM_UCS4_BE, // 00 00 FE FF UCS-4, big-endian machine (1234 order) BOM_UCS4_LE, // FF FE 00 00 UCS-4, little-endian machine (4321 order) BOM_UCS4_2143, // 00 00 FF FE UCS-4, unusual octet order (2143) BOM_UCS4_3412, // FE FF 00 00 UCS-4, unusual octet order (3412) BOM_UTF16_BE, // FE FF ## ## UTF-16, big-endian BOM_UTF16_LE, // FF FE ## ## UTF-16, little-endian BOM_UTF8 // EF BB BF UTF-8 ); const CharsetDetectorLibrary = 'chsdet.dll'; procedure csd_Reset; stdcall; external CharsetDetectorLibrary; function csd_HandleData(aBuf: PChar; aLen: integer): integer; stdcall; external CharsetDetectorLibrary; function csd_Done: Boolean; stdcall; external CharsetDetectorLibrary; procedure csd_DataEnd; stdcall; external CharsetDetectorLibrary; function csd_GetDetectedCharset: rCharsetInfo; stdcall; external CharsetDetectorLibrary; procedure csd_GetKnownCharsets(var KnownCharsets: pChar); stdcall; external CharsetDetectorLibrary; procedure csd_GetAbout(var About: rAboutHolder); stdcall; external CharsetDetectorLibrary; function csd_GetDetectedBOM: eBOMKind; stdcall; external CharsetDetectorLibrary; procedure csd_DisableCharsetCP(CodePage: integer); stdcall; external CharsetDetectorLibrary; implementation end. doublecmd-0.5.8/components/chsdet/ReadMe.txt0000644000175000017500000001374712014201074020046 0ustar alexxalexx-----------Summary Charset Detector - as the name says - is a stand alone executable module for automatic charset detection of a given text. It can be useful for internationalisation support in multilingual applications such as web-script editors or Unicode editors. Given input buffer will be analysed to guess used encoding. The result can be used as control parameter for charset conversation procedure. Charset Detector can be compiled (and hopefully used) for MS Windows (as dll - dynamic link library) or Linux. Based on Mozilla's i18n component - http://www.mozilla.org/projects/intl/. -----------State Version 0.2.6 stable. The latest version can be found at http://chsdet.sourceforge.net. -----------Requirements Charset Detector doesn't need any external components. -----------Output As result you will get guessed charset as MS Windows Code Page id and charset name. -----------Licence Charset Detector is open source project and distributed under Lesser GPL. See the GNU Lesser General Public License for more details - http://www.opensource.org/licenses/lgpl-license.php -----------Supported charsets +-----------+---------------------------+------------------------+ | Code pade | Name | Note | +-----------+---------------------------+------------------------+ | 0 | ASCII | Pseudo code page. | | 855 | IBM855 | | | 866 | IBM866 | | | 932 | Shift_JIS | | | 950 | Big5 | | | 1200 | UTF-16LE | | | 1201 | UTF-16BE | | | 1251 | windows-1251 | | | 1252 | windows-1252 | | | 1253 | windows-1253 | | | 1255 | windows-1255 | | | 10007 | x-mac-cyrillic | | | 12000 | X-ISO-10646-UCS-4-2143 | | | 12000 | UTF-32LE | MS Windows hasn't CP.| | | | Try to use USC-4. | | 12001 | X-ISO-10646-UCS-4-3412 | | | 12001 | UTF-32BE | MS Windows hasn't CP.| | | | Try to use USC-4. | | 20866 | KOI8-R | | | 28595 | ISO-8859-5 | | | 28595 | ISO-8859-5 | | | 28597 | ISO-8859-7 | | | 28598 | ISO-8859-8 | | | 50222 | ISO-2022-JP | | | 50225 | ISO-2022-KR | | | 50227 | ISO-2022-CN | | | 51932 | EUC-JP | | | 51936 | x-euc-tw | | | 51949 | EUC-KR | | | 52936 | HZ-GB-2312 | | | 54936 | GB18030 | | | 65001 | UTF-8 | | +-----------+---------------------------+------------------------+ -----------Types Return values NS_OK = 0; NS_ERROR_OUT_OF_MEMORY = $8007000e; Returned types rCharsetInfo = record Name: pChar; // charset GNU canonical name CodePage: integer; // MS Windows CodePage id Language: pChar; // end; rAboutHolder = record MajorVersionNr: Cardinal; // Library's Major Version # MinorVersionNr: Cardinal; // Library's Minor Version # BuildVersionNr: Cardinal; // Library's Build/Release Version # About: pChar; // Copyleft information; end; -----------Exported functions procedure chsd_Reset; stdcall; Reset Charset Detector state. Prepare to new analyse. function chsd_HandleData(aBuf: PChar; aLen: integer): integer; stdcall; Analyse given buffer. Parameters aBuf - pointer to buffer with text. sLen - buffer length; Return value NS_ERROR_OUT_OF_MEMORY - failure. Unable to create internal objects. NS_OK - success. Note Function can be called more that one time to continue guessing. Charset Detector remember last state until chsd_Reset called. function chsd_Done: Boolean; stdcall; Return value TRUE - Charset Detector is sure about text encoding. FALSE - Overwise. Note If input buffer is smaller then 1K Charset Detector returns anyway FALSE. procedure chsd_DataEnd; stdcall; Signalise data end. If Charset Detector hasn't sure result (Done = FALSE) the best guessed encoding will be set as result. function chsd_GetDetectedCharset: rCharsetInfo; stdcall; Returns guessed charset. procedure chsd_GetKnownCharsets(var KnownCharsets: pChar); Fills the parameter with all supported charsets in form "CodePage - Name LineFeed". procedure chsd_GetAbout(var About: rAboutHolder); stdcall; Fills the parameter with version and copyleft information. -----------Sample The definition file "chsd_dll_intf.pas" can be found in the same direcory. Bellow is small usage sample. // WS: WideString; // Wide string which can be used in Unicode controls. // Get encoding of some buffer chsd_Reset; chsd_HandleData(aBuf, aLen); if not chsd_Done then chsd_DataEnd; ChSInfo := chsd_GetDetectedCharset(); // convert buffer to WideString OutputLength := MultiByteToWideChar(ChSInfo.CodePage, 0, aBuf, aLen, nil, 0); SetLength(WS, OutputLength); MultiByteToWideChar(ChSInfo.CodePage, 0, aBuf, aLen, PWideChar(WS), OutputLength); // If you using Unicode SynEdit SynEdit.Lines.Text := WS; Nikolaj Yakowlew 2006-2008 doublecmd-0.5.8/components/chsdet/chsdet.pas0000644000175000017500000000114512014201074020114 0ustar alexxalexx{ This file was automatically created by Lazarus. Do not edit! This source is only used to compile and install the package. } unit chsdet; interface uses Big5Freq, CharDistribution, chsdIntf, CustomDetector, EUCKRFreq, EUCSampler, EUCTWFreq, GB2312Freq, JISFreq, JpCntx, MBUnicodeMultiProber, MultiModelProber, nsCodingStateMachine, nsCore, nsEscCharsetProber, nsGroupProber, nsHebrewProber, nsLatin1Prober, nsMBCSMultiProber, nsPkg, nsSBCharSetProber, nsSBCSGroupProber, nsUniversalDetector, LangBulgarianModel, LangCyrillicModel, LangGreekModel, LangHebrewModel; implementation end. doublecmd-0.5.8/components/chsdet/dcu/0000755000175000017500000000000012257501472016725 5ustar alexxalexxdoublecmd-0.5.8/components/chsdet/src/0000755000175000017500000000000012257501472016741 5ustar alexxalexxdoublecmd-0.5.8/components/chsdet/src/GB2312Freq.pas0000644000175000017500000010761112014201074021054 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: GB2312Freq.pas,v 1.2 2007/05/20 15:46:04 ya_nick Exp $ unit GB2312Freq; //GB2312 most frequently used character table //Char to FreqOrder table , from hz6763 (****************************************************************************** * 512 --> 0.79 -- 0.79 * 1024 --> 0.92 -- 0.13 * 2048 --> 0.98 -- 0.06 * 6768 --> 1.00 -- 0.02 * * Idea Distribution Ratio = 0.79135/(1-0.79135) = 3.79 * Random Distribution Ration = 512 / (3755 - 512) = 0.157 * * Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR *****************************************************************************) interface uses nsCore; const GB2312_TYPICAL_DISTRIBUTION_RATIO: float = 0.9; GB2312_TABLE_SIZE = 3760; GB2312CharToFreqOrder: array [0..GB2312_TABLE_SIZE-1] of PRInt16 = ( 1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, 2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, 2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, 1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, 1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, 1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, 2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, 3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, 1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, 2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, 2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, 1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, 3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, 1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, 2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, 1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, 3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, 1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, 2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, 1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, 3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, 3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, 3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, 1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, 3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, 2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, 1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, 1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, 4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, 3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, 3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, 1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, 2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, 1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, 1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, 3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, 3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, 4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, 3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, 1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, 1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, 4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, 3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, 1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, 1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, 2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, 3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, 4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, 3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, 2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, 2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, 2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, 2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, 3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, 2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, 2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, 1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, 2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, 1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, 1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, 1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, 2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, 3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, 2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, 2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, 2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, 3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, 1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, 1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, 2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, 1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, 3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, 1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, 1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, 3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, 2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, 1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, 4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, 1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, 1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, 3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, 1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, 1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, 1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, 1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, 3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, 4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, 3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, 2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, 2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, 1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, 3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, 2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, 1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, 1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, 2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, 2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, 3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, 4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, 3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, 3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, 2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, 1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, 3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, 4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, 2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, 1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, 1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, 1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, 3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, 1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, 1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, 2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, 2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, 2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, 1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, 1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, 2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, 1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, 1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, 2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, 2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, 3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, 1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, 4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, 3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, 1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, 3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, 1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, 4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, 1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, 2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, 1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, 1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, 3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, 2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, 1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, 1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, 1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, 3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, 2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, 3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, 3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, 3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, 2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, 2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, 1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, 1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, 3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, 3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, 1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, 1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, 3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, 2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, 2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, 1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, 3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, 4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, 1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, 2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, 3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, 3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, 1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, 2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, 1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, 1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, 1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, 1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, 1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, 1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483 //last 512 (*************************************************************************************** *Everything below is of no interest for detection purpose * *************************************************************************************** 5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636, 5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874, 5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278, 3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806, 4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827, 5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512, 5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578, 4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828, 4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105, 4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189, 4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561, 3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226, 6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778, 4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039, 6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404, 4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213, 4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739, 4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328, 5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592, 3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424, 4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270, 3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232, 4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456, 4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121, 6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971, 6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409, 5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519, 4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367, 6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834, 4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460, 5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464, 5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709, 5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906, 6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530, 3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262, 6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920, 4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190, 5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318, 6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538, 6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697, 4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544, 5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016, 4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638, 5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006, 5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071, 4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552, 4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556, 5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432, 4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632, 4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885, 5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336, 4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729, 4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854, 4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332, 5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004, 5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419, 4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293, 3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580, 4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339, 6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341, 5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493, 5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046, 4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904, 6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728, 5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350, 6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233, 4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944, 5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413, 5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700, 3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999, 5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694, 6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571, 4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359, 6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178, 4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421, 4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330, 6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855, 3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587, 6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803, 4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791, 3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304, 3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445, 3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506, 4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856, 2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057, 5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777, 4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369, 5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028, 5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914, 5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175, 4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681, 5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534, 4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912, 5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054, 1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336, 3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666, 4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375, 4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113, 6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614, 4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173, 5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197, 3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271, 5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423, 5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529, 5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921, 3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837, 5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922, 5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187, 3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382, 5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628, 5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683, 5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053, 6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928, 4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662, 6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663, 4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554, 3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191, 4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013, 5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932, 5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055, 5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829, 3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096, 3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660, 6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199, 6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748, 5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402, 6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957, 6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668, 6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763, 6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407, 6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051, 5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429, 6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791, 6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028, 3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305, 3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159, 4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683, 4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372, 3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514, 5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544, 5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472, 5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716, 5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905, 5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327, 4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030, 5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281, 6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224, 5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327, 4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062, 4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354, 6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065, 3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953, 4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681, 4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708, 5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442, 6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387, 6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237, 4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713, 6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547, 5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957, 5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337, 5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074, 5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685, 5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455, 4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722, 5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615, 5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093, 5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989, 5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094, 6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212, 4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967, 5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733, 4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260, 4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864, 6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353, 4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095, 6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287, 3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504, 5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539, 6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750, 6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864, 6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213, 5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573, 6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252, 6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970, 3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703, 5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978, 4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767, *******************************************************************************) ); implementation end. doublecmd-0.5.8/components/chsdet/src/JISFreq.pas0000644000175000017500000013667012014201074020710 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: JISFreq.pas,v 1.2 2007/05/20 15:46:04 ya_nick Exp $ unit JISFreq; //Sampling from about 20M text materials include literature and computer technology // Japanese frequency table, applied to both S-JIS and EUC-JP //They are sorted in order. (****************************************************************************** * 128 --> 0.77094 * 256 --> 0.85710 * 512 --> 0.92635 * 1024 --> 0.97130 * 2048 --> 0.99431 * * Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 * Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 * * Typical Distribution Ratio, 25% of IDR *****************************************************************************) interface uses nsCore; const JIS_TYPICAL_DISTRIBUTION_RATIO: double = 3.0; //Char to FreqOrder table , JIS_TABLE_SIZE = 4368; JISCharToFreqOrder: array [0..JIS_TABLE_SIZE-1] of PRInt16 = ( 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, // 16 3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, // 32 1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, // 48 2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, // 64 2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, // 80 5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, // 96 1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, // 112 5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, // 128 5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, // 144 5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, // 160 5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, // 176 5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, // 192 5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, // 208 1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, // 224 1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, // 240 1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, // 256 2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, // 272 3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, // 288 3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, // 304 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, // 320 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, // 336 1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, // 352 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, // 368 5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, // 384 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, // 400 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, // 416 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, // 432 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, // 448 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, // 464 5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, // 480 5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, // 496 5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, // 512 4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, // 528 5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, // 544 5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, // 560 5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, // 576 5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, // 592 5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, // 608 5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, // 624 5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, // 640 5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, // 656 5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, // 672 3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, // 688 5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, // 704 5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, // 720 5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, // 736 5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, // 752 5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, // 768 5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, // 784 5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, // 800 5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, // 816 5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, // 832 5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, // 848 5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, // 864 5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, // 880 5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, // 896 5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, // 912 5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, // 928 5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, // 944 5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, // 960 5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, // 976 5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, // 992 5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, // 1008 5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, // 1024 5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, // 1040 5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, // 1056 5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, // 1072 5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, // 1088 5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, // 1104 5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, // 1120 5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, // 1136 5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, // 1152 5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, // 1168 5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, // 1184 5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, // 1200 5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, // 1216 5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, // 1232 5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, // 1248 5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, // 1264 5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, // 1280 5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, // 1296 6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, // 1312 6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, // 1328 6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, // 1344 6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, // 1360 6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, // 1376 6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, // 1392 6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, // 1408 6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, // 1424 4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, // 1440 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, // 1456 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, // 1472 1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, // 1488 1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, // 1504 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, // 1520 3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, // 1536 3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, // 1552 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, // 1568 3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, // 1584 3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, // 1600 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, // 1616 2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, // 1632 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, // 1648 3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, // 1664 1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, // 1680 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, // 1696 1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, // 1712 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, // 1728 2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, // 1744 2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, // 1760 2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, // 1776 2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, // 1792 1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, // 1808 1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, // 1824 1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, // 1840 1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, // 1856 2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, // 1872 1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, // 1888 2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, // 1904 1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, // 1920 1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, // 1936 1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, // 1952 1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, // 1968 1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, // 1984 1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, // 2000 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, // 2016 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, // 2032 1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, // 2048 2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, // 2064 2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, // 2080 2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, // 2096 3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, // 2112 3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, // 2128 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, // 2144 3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, // 2160 1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, // 2176 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, // 2192 2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, // 2208 1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, // 2224 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, // 2240 3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, // 2256 4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, // 2272 2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, // 2288 1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, // 2304 2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, // 2320 1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, // 2336 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, // 2352 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, // 2368 1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, // 2384 2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, // 2400 2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, // 2416 2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, // 2432 3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, // 2448 1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, // 2464 2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, // 2480 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, // 2496 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, // 2512 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, // 2528 1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, // 2544 2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, // 2560 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, // 2576 1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, // 2592 1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, // 2608 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, // 2624 1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, // 2640 1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, // 2656 1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, // 2672 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, // 2688 2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, // 2704 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, // 2720 2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, // 2736 3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, // 2752 2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, // 2768 1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, // 2784 6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, // 2800 1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, // 2816 2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, // 2832 1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, // 2848 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, // 2864 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, // 2880 3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, // 2896 3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, // 2912 1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, // 2928 1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, // 2944 1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, // 2960 1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, // 2976 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, // 2992 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, // 3008 2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, // 3024 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, // 3040 3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, // 3056 2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, // 3072 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, // 3088 1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, // 3104 2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, // 3120 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, // 3136 1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, // 3152 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, // 3168 4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, // 3184 2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, // 3200 1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, // 3216 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, // 3232 1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, // 3248 2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, // 3264 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, // 3280 6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, // 3296 1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, // 3312 1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, // 3328 2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, // 3344 3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, // 3360 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, // 3376 3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, // 3392 1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, // 3408 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, // 3424 1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, // 3440 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, // 3456 3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, // 3472 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, // 3488 2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, // 3504 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, // 3520 4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, // 3536 2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, // 3552 1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, // 3568 1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, // 3584 1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, // 3600 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, // 3616 1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, // 3632 3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, // 3648 1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, // 3664 3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, // 3680 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, // 3696 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, // 3712 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, // 3728 2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, // 3744 1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, // 3760 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, // 3776 1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, // 3792 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, // 3808 1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, // 3824 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, // 3840 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, // 3856 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, // 3872 1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, // 3888 1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, // 3904 2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, // 3920 4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, // 3936 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, // 3952 1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, // 3968 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, // 3984 1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, // 4000 3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, // 4016 1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, // 4032 2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, // 4048 2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, // 4064 1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, // 4080 1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, // 4096 2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, // 4112 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, // 4128 2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, // 4144 1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, // 4160 1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, // 4176 1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, // 4192 1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, // 4208 3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, // 4224 2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, // 4240 2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, // 4256 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, // 4272 3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, // 4288 3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, // 4304 1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, // 4320 2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, // 4336 1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, // 4352 2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137 // 4368 //last 512 (*************************************************************************************** *Everything below is of no interest for detection purpose * *************************************************************************************** 2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, // 4384 6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, // 4400 6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, // 4416 6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, // 4432 6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, // 4448 4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, // 4464 4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, // 4480 3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, // 4496 3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, // 4512 4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, // 4528 3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, // 4544 6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, // 4560 4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, // 4576 6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, // 4592 6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, // 4608 6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, // 4624 6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, // 4640 6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, // 4656 6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, // 4672 3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, // 4688 3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, // 4704 6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, // 4720 2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, // 4736 4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, // 4752 4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, // 4768 4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, // 4784 6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, // 4800 3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, // 4816 4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, // 4832 4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, // 4848 6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, // 4864 4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, // 4880 6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, // 4896 3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, // 4912 2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, // 4928 4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, // 4944 2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, // 4960 6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, // 4976 4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, // 4992 6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, // 5008 6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, // 5024 6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, // 5040 4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, // 5056 6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, // 5072 2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, // 5088 6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, // 5104 4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, // 5120 6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, // 5136 4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, // 5152 4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, // 5168 6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, // 5184 6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, // 5200 6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, // 5216 3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, // 5232 1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, // 5248 3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, // 5264 3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, // 5280 4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, // 5296 6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, // 5312 3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, // 5328 6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, // 5344 3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, // 5360 3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, // 5376 2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, // 5392 6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, // 5408 6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, // 5424 3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, // 5440 6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, // 5456 3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, // 5472 6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, // 5488 6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, // 5504 6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, // 5520 4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, // 5536 6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, // 5552 4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, // 5568 3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, // 5584 3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, // 5600 6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, // 5616 6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, // 5632 4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, // 5648 6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, // 5664 6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, // 5680 6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, // 5696 6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, // 5712 6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, // 5728 6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, // 5744 4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, // 5760 4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, // 5776 3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, // 5792 6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, // 5808 4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, // 5824 2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, // 5840 6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, // 5856 6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, // 5872 4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, // 5888 2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, // 5904 4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, // 5920 2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, // 5936 4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, // 5952 4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, // 5968 4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, // 5984 6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, // 6000 3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, // 6016 6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, // 6032 3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, // 6048 6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, // 6064 2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, // 6080 3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, // 6096 7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, // 6112 2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, // 6128 3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, // 6144 3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, // 6160 3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, // 6176 3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, // 6192 7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, // 6208 7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, // 6224 7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, // 6240 7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, // 6256 7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, // 6272 4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, // 6288 3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, // 6304 3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, // 6320 4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, // 6336 3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, // 6352 3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, // 6368 7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, // 6384 4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, // 6400 7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, // 6416 7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, // 6432 7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, // 6448 7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, // 6464 7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, // 6480 4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, // 6496 4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, // 6512 7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, // 6528 3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, // 6544 4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, // 6560 7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, // 6576 7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, // 6592 4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, // 6608 3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, // 6624 3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, // 6640 7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, // 6656 4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, // 6672 4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, // 6688 4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, // 6704 4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, // 6720 4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, // 6736 4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, // 6752 7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, // 6768 7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, // 6784 7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, // 6800 7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, // 6816 7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, // 6832 2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, // 6848 3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, // 6864 7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, // 6880 7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, // 6896 3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, // 6912 4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, // 6928 3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, // 6944 3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, // 6960 2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, // 6976 7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, // 6992 7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, // 7008 4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, // 7024 3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, // 7040 3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, // 7056 7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, // 7072 7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, // 7088 7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, // 7104 4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, // 7120 7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, // 7136 2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, // 7152 3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, // 7168 4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, // 7184 7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, // 7200 4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, // 7216 4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, // 7232 7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, // 7248 7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, // 7264 5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, // 7280 7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, // 7296 7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, // 7312 7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, // 7328 7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, // 7344 7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, // 7360 5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, // 7376 5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, // 7392 7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, // 7408 3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, // 7424 7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, // 7440 7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, // 7456 3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, // 7472 7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, // 7488 7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, // 7504 1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, // 7520 3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, // 7536 4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, // 7552 2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, // 7568 3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, // 7584 2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, // 7600 5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, // 7616 4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, // 7632 4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, // 7648 5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, // 7664 7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, // 7680 7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, // 7696 7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, // 7712 7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, // 7728 3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, // 7744 7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, // 7760 3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, // 7776 7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, // 7792 4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, // 7808 7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, // 7824 7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, // 7840 7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, // 7856 7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, // 7872 7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, // 7888 7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, // 7904 7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, // 7920 7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, // 7936 7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, // 7952 7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, // 7968 7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, // 7984 7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, // 8000 8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, // 8016 8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, // 8032 8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, // 8048 8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, // 8064 8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, // 8080 8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, // 8096 8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, // 8112 8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, // 8128 8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, // 8144 8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, // 8160 8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, // 8176 8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, // 8192 8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, // 8208 8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, // 8224 8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, // 8240 8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, // 8256 8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, // 8272 ****************************************************************************************) ); implementation end. doublecmd-0.5.8/components/chsdet/src/nsCore.pas0000644000175000017500000002714112014201074020666 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: nsCore.pas,v 1.4 2008/06/22 09:04:20 ya_nick Exp $ unit nsCore; interface type PRInt16 = smallint; PRUint16 = word; PRInt32 = integer; PRUint32 = cardinal; pByteArray = array of Byte; pPRUint32 = ^PRUint32; aPRUint32 = array of PRUint32; pPRint16 = ^PRint16; aPRint16 = array of PRint16; const SURE_YES: double = 0.99; SURE_NO: double = 0.01; const ENOUGH_DATA_THRESHOLD: cardinal = 1024; SHORTCUT_THRESHOLD = 0.95; type eProbingState = ( psDetecting = 0, //We are still detecting, no sure answer yet, but caller can ask for confidence. psFoundIt = 1, //That's a positive answer psNotMe = 2 //Negative answer ); type nsResult = PRUint32; const NS_OK = 0; NS_ERROR_OUT_OF_MEMORY = $8007000e; type float = double; rAboutHolder = record MajorVersionNr: Cardinal; MinorVersionNr: Cardinal; BuildVersionNr: Cardinal; About: pChar; end; eBOMKind = ( BOM_Not_Found, BOM_UCS4_BE, // 00 00 FE FF UCS-4, big-endian machine (1234 order) BOM_UCS4_LE, // FF FE 00 00 UCS-4, little-endian machine (4321 order) BOM_UCS4_2143, // 00 00 FF FE UCS-4, unusual octet order (2143) BOM_UCS4_3412, // FE FF 00 00 UCS-4, unusual octet order (3412) BOM_UTF16_BE, // FE FF ## ## UTF-16, big-endian BOM_UTF16_LE, // FF FE ## ## UTF-16, little-endian BOM_UTF8 // EF BB BF UTF-8 ); const KnownBOM: array [eBOMKind] of array [0..4] of Char = ( // first element = byte count (#$00, #$00, #$00, #$00, #$00), (#$04, #$00, #$00, #$FE, #$FF), (#$04, #$FF, #$FE, #$00, #$00), (#$04, #$00, #$00, #$FF, #$FE), (#$04, #$FE, #$FF, #$00, #$00), (#$02, #$FE, #$FF, #$00, #$00), (#$02, #$FF, #$FE, #$00, #$00), (#$03, #$EF, #$BB, #$BF, #$00) ); // "extended" charset info type rCharsetInfo = record Name: pChar; CodePage: integer; Language: pChar; end; eInternalCharsetID = ( UNKNOWN_CHARSET = 000, PURE_ASCII_CHARSET = 001, UTF8_CHARSET = 002, UCS4_BE_CHARSET = 003, UTF16_BE_CHARSET = 004, UTF32_BE_CHARSET = 005, UCS4_LE_CHARSET = 006, UTF32_LE_CHARSET = 007, UTF16_LE_CHARSET = 008, LATIN5_BULGARIAN_CHARSET = 009, WINDOWS_BULGARIAN_CHARSET = 010, KOI8_R_CHARSET = 011, WINDOWS_1251_CHARSET = 012, ISO_8859_5_CHARSET = 013, X_MAC_CYRILLIC_CHARSET = 014, IBM866_CHARSET = 015, IBM855_CHARSET = 016, ISO_8859_7_CHARSET = 017, WINDOWS_1253_CHARSET = 018, ISO_8859_8_CHARSET = 019, WINDOWS_1255_CHARSET = 020, BIG5_CHARSET = 021, ISO_2022_CN_CHARSET = 022, ISO_2022_JP_CHARSET = 023, ISO_2022_KR_CHARSET = 024, EUC_JP_CHARSET = 025, EUC_KR_CHARSET = 026, X_EUC_TW_CHARSET = 027, SHIFT_JIS_CHARSET = 028, GB18030_CHARSET = 029, HZ_GB_2312_CHARSET = 030, WINDOWS_1252_CHARSET = 031 ); const KNOWN_CHARSETS: array [eInternalCharsetID] of rCharsetInfo = ( // UNKNOWN_CHARSET ( Name: 'Unknown'; CodePage: -1; Language: 'Unknown' ), // PURE_ASCII_CHARSET ( Name: 'ASCII'; CodePage: 0; Language: 'ASCII' ), // UTF8_CHARSET ( Name: 'UTF-8'; CodePage: 65001; Language: 'Unicode' ), // UCS4_BE_CHARSET ( Name: 'X-ISO-10646-UCS-4-3412'; CodePage: 12001; Language: 'Unicode' ), // UTF16_BE_CHARSET ( Name: 'UTF-16BE'; CodePage: 1201; Language: 'Unicode' ), // UTF32_BE_CHARSET ( Name: 'UTF-32BE'; CodePage: 12001; Language: 'Unicode' ), // UCS4_LE_CHARSET ( Name: 'X-ISO-10646-UCS-4-2143'; CodePage: 12000; Language: 'Unicode' ), // UTF32_LE_CHARSET ( Name: 'UTF-32LE'; CodePage: 12000; Language: 'Unicode' ), // UTF16_LE_CHARSET ( Name: 'UTF-16LE'; CodePage: 1200; Language: 'Unicode' ), // LATIN5_BULGARIAN_CHARSET ( Name: 'ISO-8859-5'; CodePage: 28595; Language: 'Bulgarian' ), // WINDOWS_BULGARIAN_CHARSET ( Name: 'windows-1251'; CodePage: 1251; Language: 'Bulgarian' ), // KOI8_R_CHARSET ( Name: 'KOI8-R'; CodePage: 20866; Language: 'russian' ), // WINDOWS_1251_CHARSET ( Name: 'windows-1251'; CodePage: 1251; Language: 'russian' ), // ISO_8859_5_CHARSET ( Name: 'ISO-8859-5'; CodePage: 28595; Language: 'russian' ), // X_MAC_CYRILLIC_CHARSET ( Name: 'x-mac-cyrillic'; CodePage: 10007; Language: 'russian' ), // IBM866_CHARSET ( Name: 'IBM866'; CodePage: 866; Language: 'russian' ), // IBM855_CHARSET ( Name: 'IBM855'; CodePage: 855; Language: 'russian' ), // ISO_8859_7_CHARSET ( Name: 'ISO-8859-7'; CodePage: 28597; Language: 'greek' ), // WINDOWS_1253_CHARSET ( Name: 'windows-1253'; CodePage: 1253; Language: 'greek' ), // ISO_8859_8_CHARSET ( Name: 'ISO-8859-8'; CodePage: 28598; Language: 'hebrew' ), // WINDOWS_1255_CHARSET ( Name: 'windows-1255'; CodePage: 1255; Language: 'hebrew' ), // BIG5_CHARSET ( Name: 'Big5'; CodePage: 950; Language: 'ch' ), // ISO_2022_CN_CHARSET ( Name: 'ISO-2022-CN'; CodePage: 50227; Language: 'ch'; ), // ISO_2022_JP_CHARSET ( Name: 'ISO-2022-JP'; CodePage: 50222; Language: 'japanese'; ), // ISO_2022_KR_CHARSET ( Name: 'ISO-2022-KR'; CodePage: 50225; Language: 'kr'; ), // EUC_JP_CHARSET ( Name: 'EUC-JP'; CodePage: 51932; Language: 'japanese'; ), // EUC_KR_CHARSET ( Name: 'EUC-KR'; CodePage: 51949; Language: 'kr'; ), // X_EUC_TW_CHARSET ( Name: 'x-euc-tw'; CodePage: 51936; Language: 'ch'; ), // SHIFT_JIS_CHARSET ( Name: 'Shift_JIS'; CodePage: 932; Language: 'japanese'; ), // GB18030_CHARSET ( Name: 'GB18030'; CodePage: 54936; Language: 'ch'; ), // HZ_GB_2312_CHARSET ( Name: 'HZ-GB-2312'; CodePage: 52936; Language: 'ch'; ), // WINDOWS_1252_CHARSET ( Name: 'windows-1252'; CodePage: 1252; Language: 'eu'; ) ); (* Helper functions used in the Latin1 and Group probers.*) (* both functions Allocate a new buffer for newBuf. This buffer should be *) (* freed by the caller using PR_FREEIF.*) (* Both functions return PR_FALSE in case of memory allocation failure.*) function FilterWithoutEnglishLetters(aBuf: PChar; aLen: integer; var newBuf: PChar; var newLen: integer): Boolean; function FilterWithEnglishLetters(aBuf: PChar; aLen: integer; var newBuf: PChar; var newLen: integer): Boolean; implementation function FilterWithEnglishLetters(aBuf: PChar; aLen: integer; var newBuf: PChar; var newLen: integer): Boolean; var newptr: pChar; prevPtr: pChar; curPtr: pChar; isInTag: Boolean; begin //do filtering to reduce load to probers isInTag := FALSE; newLen := 0; newptr := newBuf; if (newptr = nil) then begin Result := FALSE; exit; end; prevPtr := aBuf; curPtr := prevPtr; while (curPtr < aBuf+aLen) do begin if (curPtr^ = '>') then isInTag := FALSE else if (curPtr^ = '<') then isInTag := TRUE; if ((curPtr^ < #$80) and ((curPtr^ < 'A') or ((curPtr^ > 'Z') and (curPtr^ < 'a')) or (curPtr^ > 'z')) ) then begin if ((curPtr > prevPtr) and (not isInTag)) then // Current segment contains more than just a symbol // and it is not inside a tag, keep it. begin while (prevPtr < curPtr) do begin newptr^ := prevPtr^; inc(newptr); inc(prevPtr); end; inc(prevPtr); newptr^ := ' '; inc(newptr); end else prevPtr := curPtr+1; end; inc(curPtr); end; // If the current segment contains more than just a symbol // and it is not inside a tag then keep it. if ( not isInTag) then while (prevPtr < curPtr) do begin newptr^ := prevPtr^; inc(newptr); inc(prevPtr); end; newLen := newptr - newBuf; Result := TRUE; end; function FilterWithoutEnglishLetters(aBuf: PChar; aLen: integer; var newBuf: PChar; var newLen: integer): Boolean; var newPtr: pChar; prevPtr: pChar; curPtr: pChar; meetMSB: Boolean; begin (*This filter applies to all scripts which do not use English characters*) Result := FALSE; newLen := 0; meetMSB:= FALSE; if newBuf = nil then exit; newPtr := newBuf; curPtr := aBuf; prevPtr := curPtr; while curPtr < aBuf+aLen do begin if curPtr^ > #$80 then meetMSB := TRUE else if ((curPtr^ < 'A') or ((curPtr^ > 'Z') and (curPtr^ < 'a')) or (curPtr^ > 'z')) then begin //current char is a symbol, most likely a punctuation. we treat it as segment delimiter if (meetMSB and (curPtr > prevPtr)) then //this segment contains more than single symbol, and it has upper ASCII, we need to keep it begin while (prevPtr < curPtr) do begin newptr^ := prevPtr^; inc(newptr); inc(prevPtr); end; inc(prevPtr); newptr^ := ' '; inc(newptr); meetMSB := FALSE; end else //ignore current segment. (either because it is just a symbol or just an English word) prevPtr := curPtr+1; end; inc(curPtr); end; if (meetMSB and (curPtr > prevPtr)) then while (prevPtr < curPtr) do begin newptr^ := prevPtr^; inc(newptr); inc(prevPtr); end; newLen := newptr - newBuf; Result := TRUE; end; end. doublecmd-0.5.8/components/chsdet/src/nsMBCSMultiProber.pas0000644000175000017500000002153712014201074022712 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: nsMBCSMultiProber.pas,v 1.2 2007/05/26 13:09:38 ya_nick Exp $ unit nsMBCSMultiProber; interface uses {$I dbg.inc} nsCore, MultiModelProber, JpCntx, CharDistribution; type TnsMBCSMultiProber = class (TMultiModelProber) private mDistributionAnalysis: array of TCharDistributionAnalysis; mContextAnalysis: array of TJapaneseContextAnalysis; mBestGuess: integer; function RunStatAnalyse(aBuf: PChar; aLen: integer): eProbingState; function GetConfidenceFor(index: integer): double; reintroduce; public constructor Create; reintroduce; destructor Destroy; override; function HandleData(aBuf: PChar; aLen: integer): eProbingState; override; function GetConfidence: double; override; procedure Reset; override; {$ifdef DEBUG_chardet} procedure DumpStatus(Dump: string); override; {$endif} end; implementation uses SysUtils, nsCodingStateMachine {$ifdef DEBUG_chardet} ,TypInfo {$endif} ; {$I '.\mbclass\SJISLangModel.inc'} {$I '.\mbclass\EUCJPLangModel.inc'} {$I '.\mbclass\GB18030LangModel.inc'} {$I '.\mbclass\EUCKRLangModel.inc'} {$I '.\mbclass\Big5LangModel.inc'} {$I '.\mbclass\EUCTWLangModel.inc'} { TnsMBCSMultiProber } const NUM_OF_PROBERS = 6; constructor TnsMBCSMultiProber.Create; begin inherited Create; SetLength(mDistributionAnalysis, NUM_OF_PROBERS); SetLength(mContextAnalysis, NUM_OF_PROBERS); AddCharsetModel(SJISLangModel); mDistributionAnalysis[0] := TSJISDistributionAnalysis.Create; mContextAnalysis[0] := TSJISContextAnalysis.Create; AddCharsetModel(EUCJPLangModel); mDistributionAnalysis[1] := TEUCKRDistributionAnalysis.Create; mContextAnalysis[1] := nil; AddCharsetModel(GB18030LangModel); mDistributionAnalysis[2] := TGB2312DistributionAnalysis.Create; mContextAnalysis[2] := nil; AddCharsetModel(EUCKRLangModel); mDistributionAnalysis[3] := TEUCKRDistributionAnalysis.Create; mContextAnalysis[3] := nil; AddCharsetModel(Big5LangModel); mDistributionAnalysis[4] := TBig5DistributionAnalysis.Create; mContextAnalysis[4] := nil; AddCharsetModel(EUCTWLangModel); mDistributionAnalysis[5] := TEUCTWDistributionAnalysis.Create; mContextAnalysis[5] := nil; end; destructor TnsMBCSMultiProber.Destroy; var i: integer; begin inherited; for i := 0 to Pred(mCharsetsCount) do begin if mDistributionAnalysis[i] <> nil then mDistributionAnalysis[i].Free; if mContextAnalysis[i] <> nil then mContextAnalysis[i].Free; end; SetLength(mDistributionAnalysis, 0); SetLength(mContextAnalysis, 0); end; {$ifdef DEBUG_chardet} procedure TnsMBCSMultiProber.DumpStatus(Dump: string); var i: integer; begin AddDump(Dump + ' Current state ' + GetEnumName(TypeInfo(eProbingState), integer(mState))); AddDump(Format('%30s - %10s - %5s', ['Prober', 'State', 'Conf'])); for i := 0 to Pred(mCharsetsCount) do AddDump(Format('%30s - %10s - %1.5f', [GetEnumName(TypeInfo(eInternalCharsetID), integer(mCodingSM[i].GetCharsetID)), GetEnumName(TypeInfo(eProbingState), integer(mSMState[i])), GetConfidenceFor(i) ])); end; {$endif} function TnsMBCSMultiProber.HandleData(aBuf: PChar; aLen: integer): eProbingState; var i: integer; (*do filtering to reduce load to probers*) highbyteBuf: PChar; hptr: PChar; keepNext: Boolean; begin keepNext := TRUE; (*assume previous is not ascii, it will do no harm except add some noise*) highbyteBuf := AllocMem(aLen); try hptr:= highbyteBuf; if hptr = nil then begin Result := mState; exit; end; for i:=0 to Pred(aLen) do begin if (Byte(aBuf[i]) > $80) then begin inc(hptr); hptr^ := aBuf[i]; keepNext:= TRUE; end else begin (*if previous is highbyte, keep this even it is a ASCII*) if keepNext = TRUE then begin inc(hptr); hptr^ := aBuf[i]; keepNext:= FALSE; end; end; end; {$IFDEF DEBUG_chardet} AddDump('MultiByte - HandleData - start'); {$endif} inherited HandleData(highbyteBuf, hptr - highbyteBuf); {$IFDEF DEBUG_chardet} AddDump('MultiByte - HandleData - end'); {$endif} finally FreeMem(highbyteBuf, aLen); end; // if we have more when one candidat then // try statisic analyse if (mState <> psFoundIt) or (mState <> psNotMe) then RunStatAnalyse(aBuf, aLen); Result := mState; end; function TnsMBCSMultiProber.RunStatAnalyse(aBuf: PChar; aLen: integer): eProbingState; var i, c: integer; codingState: nsSMState; charLen: byte; mLastChar: array [0..1] of Char; begin {$IFDEF DEBUG_chardet} AddDump('MultiByte - Stat Analyse - start'); {$endif} for i := 0 to Pred(mCharsetsCount) do begin if (mSMState[i] = psFoundIt) or (mSMState[i] = psNotMe) then continue; if mDistributionAnalysis[i] = nil then continue; for c := 0 to Pred(aLen) do begin codingState := mCodingSM[i].NextState(aBuf[c]); if codingState = eStart then begin charLen := mCodingSM[i].GetCurrentCharLen; if c = 0 then begin mLastChar[1] := aBuf[0]; if mContextAnalysis[i] <> nil then mContextAnalysis[i].HandleOneChar(mLastChar,charLen); mDistributionAnalysis[i].HandleOneChar(mLastChar,charLen); end else begin if mContextAnalysis[i] <> nil then mContextAnalysis[i].HandleOneChar(aBuf+c-1,charLen); mDistributionAnalysis[i].HandleOneChar(aBuf+c-1,charLen); end; end; if (mContextAnalysis[i] <> nil) then if mContextAnalysis[i].GotEnoughData and (GetConfidenceFor(i) > SHORTCUT_THRESHOLD) then begin mState := psFoundIt; mDetectedCharset := mCodingSM[i].GetCharsetID; break; end; end; end; {$IFDEF DEBUG_chardet} AddDump('MultiByte - Stat Analyse - EXIT'); {$endif} Result := mState; end; function TnsMBCSMultiProber.GetConfidenceFor(index: integer): double; var contxtCf: double; distribCf: double; begin if mContextAnalysis[index] <> nil then contxtCf := mContextAnalysis[index].GetConfidence else contxtCf := -1; distribCf := mDistributionAnalysis[index].GetConfidence; if contxtCf > distribCf then Result := contxtCf else Result := distribCf; end; function TnsMBCSMultiProber.GetConfidence: double; var i: integer; conf, bestConf: double; begin mBestGuess := -1; bestConf := SURE_NO; for i := 0 to Pred(mCharsetsCount) do begin if (mSMState[i] = psFoundIt) or (mSMState[i] = psNotMe) then continue; if mDistributionAnalysis[i] = nil then continue; conf := GetConfidenceFor(i); if conf > bestConf then begin mBestGuess := i; bestConf := conf; end; end; Result := bestConf; if mBestGuess > -1 then mDetectedCharset := mCodingSM[mBestGuess].GetCharsetID else mDetectedCharset := UNKNOWN_CHARSET; end; procedure TnsMBCSMultiProber.Reset; var i: integer; begin inherited Reset; for i := 0 to Pred(mCharsetsCount) do begin if mDistributionAnalysis[i] <> nil then mDistributionAnalysis[i].Reset; if mContextAnalysis[i] <> nil then mContextAnalysis[i].Reset; end; end; end. doublecmd-0.5.8/components/chsdet/src/Dump.pas0000644000175000017500000000057412014201074020343 0ustar alexxalexxunit Dump; interface const nl = #13#10; var DumpStr: string; procedure AddDump(Dump: string); procedure ShowDump; implementation uses // Windows; UNIT1; procedure AddDump(Dump: string); begin UNIT1.Form1.Memo1.Lines.Add(Dump); // DumpStr := DumpStr + Dump + nl; end; procedure ShowDump; begin // OutputDebugString(pChar(DumpStr)); // DumpStr := ''; end; end. doublecmd-0.5.8/components/chsdet/src/EUCKRFreq.pas0000644000175000017500000013316512014201074021130 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: EUCKRFreq.pas,v 1.2 2007/05/20 15:46:03 ya_nick Exp $ unit EUCKRFreq; interface //Sampling from about 20M text materials include literature and computer technology (****************************************************************************** * 128 --> 0.79 * 256 --> 0.92 * 512 --> 0.986 * 1024 --> 0.99944 * 2048 --> 0.99999 * * Ideal Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 * Random Distribution Ration = 512 / (2350-512) = 0.279. * * Typical Distribution Ratio *****************************************************************************) uses nsCore; const EUCKR_TYPICAL_DISTRIBUTION_RATIO: float = 6.0; EUCKR_TABLE_SIZE = 2352; //Char to FreqOrder table , EUCKRCharToFreqOrder: array [0..EUCKR_TABLE_SIZE-1] of PRInt16 = ( 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, 1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, 1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, 1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, 1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, 1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, 1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, 1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, 1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, 1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, 1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, 1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, 1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, 1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, 1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, 1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, 1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, 1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, 1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, 1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, 1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, 1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, 1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, 1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, 1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, 1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, 1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, 1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, 1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, 2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, 2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, 2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, 2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, 2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, 1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, 2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, 1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, 2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, 2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, 1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, 2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, 2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, 2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, 1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, 2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, 2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, 2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, 2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, 2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, 2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, 1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, 2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, 2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, 2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, 2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, 2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, 1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, 1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, 2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, 1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, 2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, 1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, 2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, 2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, 2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, 2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, 2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, 1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, 1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, 2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, 1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, 2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, 2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, 1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, 2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, 1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, 2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, 1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, 2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, 2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, 1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, 1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, 2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, 2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, 2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, 2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, 2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, 2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, 1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, 2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, 2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, 2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, 2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, 2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, 2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, 1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, 2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642 //512, 256 (*************************************************************************************** *Everything below is of no interest for detection purpose * *************************************************************************************** 2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658, 2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674, 2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690, 2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704, 2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720, 2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734, 2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750, 2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765, 2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779, 2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793, 2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809, 2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824, 2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840, 2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856, 1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869, 2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883, 2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899, 2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915, 2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331, 2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945, 2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961, 2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976, 2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992, 2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008, 3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021, 3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037, 3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052, 3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066, 3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080, 3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095, 3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110, 3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124, 3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140, 3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156, 3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172, 3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187, 3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201, 3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217, 3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233, 3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248, 3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264, 3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279, 3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295, 3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311, 3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327, 3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343, 3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359, 3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374, 3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389, 3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405, 3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338, 3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432, 3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446, 3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191, 3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471, 3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486, 1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499, 1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513, 3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525, 3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541, 3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557, 3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573, 3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587, 3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603, 3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618, 3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632, 3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648, 3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663, 3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679, 3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695, 3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583, 1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722, 3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738, 3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753, 3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767, 3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782, 3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796, 3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810, 3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591, 1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836, 3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851, 3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866, 3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880, 3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895, 1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905, 3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921, 3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934, 3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603, 3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964, 3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978, 3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993, 3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009, 4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024, 4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040, 1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055, 4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069, 4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083, 4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098, 4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113, 4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610, 4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142, 4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157, 4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173, 4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189, 4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205, 4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220, 4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234, 4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249, 4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265, 4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279, 4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294, 4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310, 4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326, 4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341, 4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357, 4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371, 4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387, 4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403, 4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418, 4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432, 4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446, 4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461, 4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476, 4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491, 4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507, 4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623, 4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536, 4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551, 4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567, 4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581, 4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627, 4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611, 4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626, 4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642, 4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657, 4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672, 4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687, 1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700, 4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715, 4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731, 4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633, 4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758, 4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773, 4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788, 4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803, 4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817, 4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832, 4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847, 4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863, 4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879, 4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893, 4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909, 4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923, 4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938, 4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954, 4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970, 4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645, 4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999, 5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078, 5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028, 1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042, 5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056, 5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072, 5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087, 5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103, 5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118, 1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132, 5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148, 5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161, 5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177, 5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192, 5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206, 1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218, 5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234, 5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249, 5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262, 5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278, 5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293, 5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308, 5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323, 5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338, 5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353, 5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369, 5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385, 5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400, 5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415, 5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430, 5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445, 5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461, 5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477, 5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491, 5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507, 5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523, 5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539, 5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554, 5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570, 1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585, 5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600, 5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615, 5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631, 5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646, 5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660, 1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673, 5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688, 5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703, 5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716, 5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729, 5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744, 1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758, 5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773, 1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786, 5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801, 5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815, 5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831, 5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847, 5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862, 5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876, 5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889, 5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905, 5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, 5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687, 5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951, 5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963, 5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979, 5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993, 5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009, 6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025, 6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039, 6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055, 6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071, 6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086, 6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102, 6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118, 6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133, 6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147, 6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163, 6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179, 6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194, 6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210, 6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225, 6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241, 6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256, 6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271, //1024 6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287, 6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699, 6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317, 6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333, 6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347, 6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363, 6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379, 6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395, 6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411, 6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425, 6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440, 6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456, 6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472, 6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488, 6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266, 6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519, 6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535, 6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551, 1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565, 6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581, 6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597, 6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613, 6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629, 6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644, 1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659, 6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674, 1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689, 6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705, 6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721, 6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736, 1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748, 6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763, 6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779, 6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794, 6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711, 6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825, 6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840, 6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856, 6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872, 6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888, 6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903, 6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918, 6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934, 6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950, 6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966, 6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981, 6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996, 6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011, 7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027, 7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042, 7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058, 7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074, 7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090, 7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106, 7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122, 7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138, 7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154, 7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170, 7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186, 7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202, 7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216, 7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232, 7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248, 7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264, 7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280, 7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296, 7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312, 7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327, 7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343, 7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359, 7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375, 7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391, 7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407, 7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423, 7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439, 7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455, 7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471, 7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487, 7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503, 7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519, 7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535, 7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551, 7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, 7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583, 7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599, 7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615, 7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631, 7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647, 7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663, 7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679, 7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695, 7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711, 7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727, 7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743, 7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759, 7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775, 7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791, 7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807, 7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823, 7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839, 7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855, 7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871, 7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887, 7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903, 7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919, 7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, 7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, 7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, 7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, 7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, 8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, 8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, 8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, 8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, 8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, 8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, 8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, 8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, 8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, 8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, 8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, 8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, 8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, 8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, 8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, 8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, 8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, 8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287, 8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303, 8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319, 8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335, 8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351, 8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367, 8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383, 8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399, 8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415, 8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431, 8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447, 8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463, 8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479, 8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495, 8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511, 8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527, 8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543, 8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559, 8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575, 8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591, 8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607, 8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623, 8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639, 8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655, 8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671, 8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687, 8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, 8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719, 8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735, 8736,8737,8738,8739,8740,8741 ****************************************************************************************) ); implementation end. doublecmd-0.5.8/components/chsdet/src/CustomDetector.pas0000644000175000017500000000277412014201074022406 0ustar alexxalexxunit CustomDetector; interface uses {$I dbg.inc} nscore; type TCustomDetector = class(TObject) protected mState: eProbingState; mEnabled: Boolean; // procedure Init; virtual; abstract; procedure SetEnabled(NewValue: Boolean); virtual; function GetEnabled: Boolean; virtual; public constructor Create; virtual; function GetDetectedCharset: eInternalCharsetID; virtual; abstract; function HandleData(aBuf: PChar; aLen: integer): eProbingState; virtual; function GetState: eProbingState; virtual; function GetConfidence: float; virtual; abstract; procedure Reset; virtual; {$ifdef DEBUG_chardet} procedure DumpStatus(Dump: string); virtual; {$endif} property Enabled: Boolean read GetEnabled write SetEnabled; end; implementation { TCustomDetector } constructor TCustomDetector.Create; begin mEnabled := true; end; function TCustomDetector.GetEnabled: Boolean; begin Result := mEnabled; end; procedure TCustomDetector.SetEnabled(NewValue: Boolean); begin mEnabled := NewValue; end; function TCustomDetector.GetState: eProbingState; begin Result := mState; end; function TCustomDetector.HandleData(aBuf: PChar; aLen: integer): eProbingState; begin if not mEnabled then begin mState := psNotMe; end; Result := mState; end; procedure TCustomDetector.Reset; begin mState := psDetecting; end; {$ifdef DEBUG_chardet} procedure TCustomDetector.DumpStatus(Dump: string); begin addDump(Dump); end; {$endif} end. doublecmd-0.5.8/components/chsdet/src/nsUniversalDetector.pas0000644000175000017500000002756512014201074023452 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: nsUniversalDetector.pas,v 1.5 2008/06/22 09:04:20 ya_nick Exp $ unit nsUniversalDetector; interface uses {$I dbg.inc} nsCore, CustomDetector; const NUM_OF_CHARSET_PROBERS = 4; type nsInputState = ( ePureAscii = 0, eEscAscii = 1, eHighbyte = 2 ) ; TnsUniversalDetector = class (TObject) protected mInputState: nsInputState; mDone: Boolean; mStart: Boolean; mGotData: Boolean; mLastChar: Char; mDetectedCharset: eInternalCharsetID; mCharSetProbers: array [0..Pred(NUM_OF_CHARSET_PROBERS)] of TCustomDetector; mEscCharSetProber: TCustomDetector; mDetectedBOM: eBOMKind; procedure Report(aCharsetID: eInternalCharsetID); function CheckBOM(aBuf: pChar; aLen: integer): integer; function GetCharsetID(CodePage: integer): eInternalCharsetID; procedure DoEnableCharset(Charset: eInternalCharsetID; SetEnabledTo: Boolean); public constructor Create; destructor Destroy; override; procedure Reset; function HandleData(aBuf: PChar; aLen: integer): nsResult; procedure DataEnd; function GetDetectedCharsetInfo: nsCore.rCharsetInfo; function GetKnownCharset(out KnownCharsets: pChar): integer; procedure GetAbout(out About: rAboutHolder); procedure DisableCharset(CodePage: integer); property Done: Boolean read mDone; property BOMDetected: eBOMKind read mDetectedBOM; end; implementation uses SysUtils, nsGroupProber, nsMBCSMultiProber, nsSBCSGroupProber, nsEscCharsetProber, nsLatin1Prober, MBUnicodeMultiProber; const MINIMUM_THRESHOLD: float = 0.20; AboutInfo: rAboutHolder = ( MajorVersionNr: 0; MinorVersionNr: 2; BuildVersionNr: 6; About: 'Charset Detector Library. Copyright (C) 2006 - 2008, Nick Yakowlew. http://chsdet.sourceforge.net'; ); { TnsUniversalDetector } constructor TnsUniversalDetector.Create; begin inherited Create; mCharSetProbers[0] := TnsMBCSMultiProber.Create; mCharSetProbers[1] := TnsSBCSGroupProber.Create; mCharSetProbers[2] := TnsLatin1Prober.Create; mCharSetProbers[3] := TMBUnicodeMultiProber.Create; mEscCharSetProber := TnsEscCharSetProber.Create; Reset; end; destructor TnsUniversalDetector.Destroy; var i: integer; begin for i := 0 to Pred(NUM_OF_CHARSET_PROBERS) do mCharSetProbers[i].Free; mEscCharSetProber.Free; inherited; end; procedure TnsUniversalDetector.DataEnd; var proberConfidence: float; maxProberConfidence: float; maxProber: PRInt32; i: integer; begin if not mGotData then (* we haven't got any data yet, return immediately *) (* caller program sometimes call DataEnd before anything has been sent to detector*) exit; if mDetectedCharset <> UNKNOWN_CHARSET then begin mDone := TRUE; Report(mDetectedCharset); exit; end; case mInputState of eHighbyte: begin maxProberConfidence := 0.0; maxProber := 0; for i := 0 to Pred(NUM_OF_CHARSET_PROBERS) do begin proberConfidence := mCharSetProbers[i].GetConfidence; if proberConfidence > maxProberConfidence then begin maxProberConfidence := proberConfidence; maxProber := i; end; end; (*do not report anything because we are not confident of it, that's in fact a negative answer*) if maxProberConfidence > MINIMUM_THRESHOLD then Report(mCharSetProbers[maxProber].GetDetectedCharset); end; eEscAscii: begin mDetectedCharset := mEscCharSetProber.GetDetectedCharset; end; else begin mDetectedCharset := PURE_ASCII_CHARSET; end; end;{case} {$ifdef DEBUG_chardet} AddDump('Universal detector - DataEnd'); {$endif} end; function TnsUniversalDetector.HandleData(aBuf: PChar; aLen: integer): nsResult; var i: integer; st: eProbingState; // startAt: integer; //newBuf: pChar; //BufPtr: pChar; //b: integer; //tmpBOM: eBOMKind; begin // startAt := 0; if mDone then begin Result := NS_OK; exit; end; if aLen > 0 then mGotData := TRUE; (*If the data starts with BOM, we know it is Unicode*) if mStart then begin mStart := FALSE; // startAt := CheckBOM(aBuf, aLen); CheckBOM(aBuf, aLen); // case mDetectedBOM of // BOM_UCS4_BE: mDetectedCharset := UCS4_BE_CHARSET; // BOM_UCS4_LE: mDetectedCharset := UCS4_LE_CHARSET; // BOM_UTF16_BE: mDetectedCharset := UTF16_BE_CHARSET; // BOM_UTF16_LE: mDetectedCharset := UTF16_LE_CHARSET; // BOM_UTF8: mDetectedCharset := UTF8_CHARSET; // // BOM_UCS4_2143: mDetectedCharset := UCS4_BE_CHARSET; // BOM_UCS4_3412: mDetectedCharset := UCS4_LE_CHARSET; // end; // TODO - some stuppid ASCII text can starts with BOM. What to do? if mDetectedCharset <> UNKNOWN_CHARSET then begin // mDone := TRUE; // Result := NS_OK; // exit; end; end; {if mStart} for i := 0 to Pred(aLen) do (*other than 0xa0, if every othe character is ascii, the page is ascii*) if (aBuf[i] > #$80) and (aBuf[i] <> #$A0) then begin (*Since many Ascii only page contains NBSP *) (*we got a non-ascii byte (high-byte)*) if mInputState <> eHighbyte then begin (*adjust state*) mInputState := eHighbyte; end; end else begin (*ok, just pure ascii so *) if (mInputState = ePureAscii) and ((aBuf[i] = #$1B) or (aBuf[i] = '{') and (mLastChar = '~')) then (*found escape character or HZ "~{"*) mInputState := eEscAscii; mLastChar := aBuf[i]; end; case mInputState of eEscAscii: begin {$ifdef DEBUG_chardet} AddDump('Universal detector - Escape Detector started'); {$endif} st := mEscCharSetProber.HandleData(aBuf,aLen); if st = psFoundIt then begin mDone := TRUE; mDetectedCharset := mEscCharSetProber.GetDetectedCharset; end; end; eHighbyte: begin {$ifdef DEBUG_chardet} AddDump('Universal detector - HighByte Detector started'); {$endif} for i := 0 to Pred(NUM_OF_CHARSET_PROBERS) do begin //newBuf := AllocMem(aLen+StartAt); //BufPtr := newBuf; //try //tmpBOM := BOM_Not_Found; //if mDetectedBOM = BOM_Not_Found then //begin ////case mCharSetProbers[i].GetDetectedCharset of //// UTF16_BE_CHARSET: tmpBOM := BOM_UCS4_BE; //// UTF16_LE_CHARSET: tmpBOM := BOM_UCS4_LE; //// else //// tmpBOM := BOM_Not_Found; ////end; //tmpBOM := BOM_UTF16_BE; //end; //for b:=0 to integer(KnownBOM[tmpBOM][0])-1 do //begin //BufPtr^ := KnownBOM[tmpBOM][b+1]; //inc(BufPtr); //end; // //for b:=0 to aLen do //begin //BufPtr^ := aBuf[b]; //inc(BufPtr); //end; st := mCharSetProbers[i].HandleData(aBuf,aLen); // st := mCharSetProbers[i].HandleData(newBuf,aLen+startAt); if st = psFoundIt then begin mDone:= TRUE; mDetectedCharset := mCharSetProbers[i].GetDetectedCharset; // Result := NS_OK; break; end; //finally //FreeMem(newBuf, aLen); //end; end; end; else (*pure ascii*) begin (*do nothing here*) end; end;{case} Result := NS_OK; end; procedure TnsUniversalDetector.Report(aCharsetID: eInternalCharsetID); begin if (aCharsetID <> UNKNOWN_CHARSET) and (mDetectedCharset = UNKNOWN_CHARSET) then mDetectedCharset := aCharsetID; end; procedure TnsUniversalDetector.Reset; var i: integer; begin mDone := FALSE; mStart := TRUE; mDetectedCharset := UNKNOWN_CHARSET; mGotData := FALSE; mInputState := ePureAscii; mLastChar := #0; (*illegal value as signal*) mEscCharSetProber.Reset; for i := 0 to Pred(NUM_OF_CHARSET_PROBERS) do mCharSetProbers[i].Reset; mDetectedBOM := BOM_Not_Found; end; function TnsUniversalDetector.GetDetectedCharsetInfo: nsCore.rCharsetInfo; begin Result := KNOWN_CHARSETS[mDetectedCharset]; end; function TnsUniversalDetector.GetKnownCharset(out KnownCharsets: pChar): integer; var s: ANSIstring; i: integer; begin s := ''; for i := integer(low(KNOWN_CHARSETS)) to integer(High(KNOWN_CHARSETS)) do s := s + #10 + KNOWN_CHARSETS[eInternalCharsetID(i)].Name + ' - ' + inttostr(KNOWN_CHARSETS[eInternalCharsetID(i)].CodePage); KnownCharsets := pChar(s); Result := Length(s); end; procedure TnsUniversalDetector.GetAbout(out About: rAboutHolder); begin About := AboutInfo; end; function TnsUniversalDetector.CheckBOM(aBuf: pChar; aLen: integer): integer; function BOMLength(BOM: eBOMKind): integer; begin Result := integer(KnownBOM[BOM, 0]); end; var i, b: integer; Same: Boolean; begin Result := 0; for i := integer(low(KnownBOM))+1 to integer(high(KnownBOM)) do if aLen > BOMLength(eBOMKind(i)) then begin Same := true; for b := 0 to BOMLength(eBOMKind(i)) - 1 do if (aBuf[b] <> KnownBOM[eBOMKind(i), b+1]) then begin Same := false; break; end; if Same then begin mDetectedBOM := eBOMKind(i); Result := BOMLength(mDetectedBOM); exit; end; end; end; procedure TnsUniversalDetector.DisableCharset(CodePage: integer); begin DoEnableCharset(GetCharsetID(CodePage), false); end; function TnsUniversalDetector.GetCharsetID(CodePage: integer): eInternalCharsetID; var i: integer; begin for i := integer(low(KNOWN_CHARSETS))+1 to integer(high(KNOWN_CHARSETS)) do if (KNOWN_CHARSETS[eInternalCharsetID(i)].CodePage = CodePage) then begin Result := eInternalCharsetID(i); exit; end; Result := UNKNOWN_CHARSET; end; procedure TnsUniversalDetector.DoEnableCharset(Charset: eInternalCharsetID; SetEnabledTo: Boolean); var i: integer; begin if Charset = UNKNOWN_CHARSET then exit; for i := 0 to Pred(NUM_OF_CHARSET_PROBERS) do begin if (mCharSetProbers[i] is TnsGroupProber) then begin if TnsGroupProber(mCharSetProbers[i]).EnableCharset(Charset, SetEnabledTo) then exit; end; if (mCharSetProbers[i] is TnsEscCharSetProber) then begin TnsEscCharSetProber(mCharSetProbers[i]).Enabled := SetEnabledTo; end; if (mCharSetProbers[i] is TCustomDetector) then begin if TCustomDetector(mCharSetProbers[i]).GetDetectedCharset = Charset then TCustomDetector(mCharSetProbers[i]).Enabled := SetEnabledTo; end; end; end; end. doublecmd-0.5.8/components/chsdet/src/dbg.inc0000644000175000017500000000015012014201074020146 0ustar alexxalexx{.$DEFINE DEBUG_chardet} // Uncomment this for debug dump.*) {$ifdef DEBUG_chardet} Dump, {$endif} doublecmd-0.5.8/components/chsdet/src/stat/0000755000175000017500000000000012257501472017714 5ustar alexxalexxdoublecmd-0.5.8/components/chsdet/src/stat/Big5Statistics.inc0000644000175000017500000001207012014201074023232 0ustar alexxalexxconst Big5Stat: rEUCStatistics = ( mFirstByteFreq: ( 0.000000, // FreqH[a1] 0.000000, // FreqH[a2] 0.000000, // FreqH[a3] 0.114427, // FreqH[a4] 0.061058, // FreqH[a5] 0.075598, // FreqH[a6] 0.048386, // FreqH[a7] 0.063966, // FreqH[a8] 0.027094, // FreqH[a9] 0.095787, // FreqH[aa] 0.029525, // FreqH[ab] 0.031331, // FreqH[ac] 0.036915, // FreqH[ad] 0.021805, // FreqH[ae] 0.019349, // FreqH[af] 0.037496, // FreqH[b0] 0.018068, // FreqH[b1] 0.012760, // FreqH[b2] 0.030053, // FreqH[b3] 0.017339, // FreqH[b4] 0.016731, // FreqH[b5] 0.019501, // FreqH[b6] 0.011240, // FreqH[b7] 0.032973, // FreqH[b8] 0.016658, // FreqH[b9] 0.015872, // FreqH[ba] 0.021458, // FreqH[bb] 0.012378, // FreqH[bc] 0.017003, // FreqH[bd] 0.020802, // FreqH[be] 0.012454, // FreqH[bf] 0.009239, // FreqH[c0] 0.012829, // FreqH[c1] 0.007922, // FreqH[c2] 0.010079, // FreqH[c3] 0.009815, // FreqH[c4] 0.010104, // FreqH[c5] 0.000000, // FreqH[c6] 0.000000, // FreqH[c7] 0.000000, // FreqH[c8] 0.000053, // FreqH[c9] 0.000035, // FreqH[ca] 0.000105, // FreqH[cb] 0.000031, // FreqH[cc] 0.000088, // FreqH[cd] 0.000027, // FreqH[ce] 0.000027, // FreqH[cf] 0.000026, // FreqH[d0] 0.000035, // FreqH[d1] 0.000024, // FreqH[d2] 0.000034, // FreqH[d3] 0.000375, // FreqH[d4] 0.000025, // FreqH[d5] 0.000028, // FreqH[d6] 0.000020, // FreqH[d7] 0.000024, // FreqH[d8] 0.000028, // FreqH[d9] 0.000031, // FreqH[da] 0.000059, // FreqH[db] 0.000040, // FreqH[dc] 0.000030, // FreqH[dd] 0.000079, // FreqH[de] 0.000037, // FreqH[df] 0.000040, // FreqH[e0] 0.000023, // FreqH[e1] 0.000030, // FreqH[e2] 0.000027, // FreqH[e3] 0.000064, // FreqH[e4] 0.000020, // FreqH[e5] 0.000027, // FreqH[e6] 0.000025, // FreqH[e7] 0.000074, // FreqH[e8] 0.000019, // FreqH[e9] 0.000023, // FreqH[ea] 0.000021, // FreqH[eb] 0.000018, // FreqH[ec] 0.000017, // FreqH[ed] 0.000035, // FreqH[ee] 0.000021, // FreqH[ef] 0.000019, // FreqH[f0] 0.000025, // FreqH[f1] 0.000017, // FreqH[f2] 0.000037, // FreqH[f3] 0.000018, // FreqH[f4] 0.000018, // FreqH[f5] 0.000019, // FreqH[f6] 0.000022, // FreqH[f7] 0.000033, // FreqH[f8] 0.000032, // FreqH[f9] 0.000000, // FreqH[fa] 0.000000, // FreqH[fb] 0.000000, // FreqH[fc] 0.000000, // FreqH[fd] 0.000000 // FreqH[fe] ); mFirstByteStdDev: 0.020606; // Lead Byte StdDev mFirstByteMean: 0.010638; // Lead Byte Mean mFirstByteWeight: 0.675261; // Lead Byte Weight mSecoundByteFreq: ( 0.020256, // FreqL[a1] 0.003293, // FreqL[a2] 0.045811, // FreqL[a3] 0.016650, // FreqL[a4] 0.007066, // FreqL[a5] 0.004146, // FreqL[a6] 0.009229, // FreqL[a7] 0.007333, // FreqL[a8] 0.003296, // FreqL[a9] 0.005239, // FreqL[aa] 0.008282, // FreqL[ab] 0.003791, // FreqL[ac] 0.006116, // FreqL[ad] 0.003536, // FreqL[ae] 0.004024, // FreqL[af] 0.016654, // FreqL[b0] 0.009334, // FreqL[b1] 0.005429, // FreqL[b2] 0.033392, // FreqL[b3] 0.006121, // FreqL[b4] 0.008983, // FreqL[b5] 0.002801, // FreqL[b6] 0.004221, // FreqL[b7] 0.010357, // FreqL[b8] 0.014695, // FreqL[b9] 0.077937, // FreqL[ba] 0.006314, // FreqL[bb] 0.004020, // FreqL[bc] 0.007331, // FreqL[bd] 0.007150, // FreqL[be] 0.005341, // FreqL[bf] 0.009195, // FreqL[c0] 0.005350, // FreqL[c1] 0.005698, // FreqL[c2] 0.004472, // FreqL[c3] 0.007242, // FreqL[c4] 0.004039, // FreqL[c5] 0.011154, // FreqL[c6] 0.016184, // FreqL[c7] 0.004741, // FreqL[c8] 0.012814, // FreqL[c9] 0.007679, // FreqL[ca] 0.008045, // FreqL[cb] 0.016631, // FreqL[cc] 0.009451, // FreqL[cd] 0.016487, // FreqL[ce] 0.007287, // FreqL[cf] 0.012688, // FreqL[d0] 0.017421, // FreqL[d1] 0.013205, // FreqL[d2] 0.031480, // FreqL[d3] 0.003404, // FreqL[d4] 0.009149, // FreqL[d5] 0.008921, // FreqL[d6] 0.007514, // FreqL[d7] 0.008683, // FreqL[d8] 0.008203, // FreqL[d9] 0.031403, // FreqL[da] 0.011733, // FreqL[db] 0.015617, // FreqL[dc] 0.015306, // FreqL[dd] 0.004004, // FreqL[de] 0.010899, // FreqL[df] 0.009961, // FreqL[e0] 0.008388, // FreqL[e1] 0.010920, // FreqL[e2] 0.003925, // FreqL[e3] 0.008585, // FreqL[e4] 0.009108, // FreqL[e5] 0.015546, // FreqL[e6] 0.004659, // FreqL[e7] 0.006934, // FreqL[e8] 0.007023, // FreqL[e9] 0.020252, // FreqL[ea] 0.005387, // FreqL[eb] 0.024704, // FreqL[ec] 0.006963, // FreqL[ed] 0.002625, // FreqL[ee] 0.009512, // FreqL[ef] 0.002971, // FreqL[f0] 0.008233, // FreqL[f1] 0.010000, // FreqL[f2] 0.011973, // FreqL[f3] 0.010553, // FreqL[f4] 0.005945, // FreqL[f5] 0.006349, // FreqL[f6] 0.009401, // FreqL[f7] 0.008577, // FreqL[f8] 0.008186, // FreqL[f9] 0.008159, // FreqL[fa] 0.005033, // FreqL[fb] 0.008714, // FreqL[fc] 0.010614, // FreqL[fd] 0.006554 // FreqL[fe] ); mSecoundByteStdDev: 0.009909; // Trail Byte StdDev mSecoundByteMean: 0.010638; // Trail Byte Mean mSecoundByteWeight: 0.324739 // Trial Byte Weight ); doublecmd-0.5.8/components/chsdet/src/stat/EUCKRStatistics.inc0000644000175000017500000001207112014201074023316 0ustar alexxalexxconst EUCKRStat: rEUCStatistics = ( mFirstByteFreq: ( 0.000000, // FreqH[a1] 0.000000, // FreqH[a2] 0.000000, // FreqH[a3] 0.000000, // FreqH[a4] 0.000000, // FreqH[a5] 0.000000, // FreqH[a6] 0.000000, // FreqH[a7] 0.000412, // FreqH[a8] 0.000000, // FreqH[a9] 0.000000, // FreqH[aa] 0.000000, // FreqH[ab] 0.000000, // FreqH[ac] 0.000000, // FreqH[ad] 0.000000, // FreqH[ae] 0.000000, // FreqH[af] 0.057502, // FreqH[b0] 0.033182, // FreqH[b1] 0.002267, // FreqH[b2] 0.016076, // FreqH[b3] 0.014633, // FreqH[b4] 0.032976, // FreqH[b5] 0.004122, // FreqH[b6] 0.011336, // FreqH[b7] 0.058533, // FreqH[b8] 0.024526, // FreqH[b9] 0.025969, // FreqH[ba] 0.054411, // FreqH[bb] 0.019580, // FreqH[bc] 0.063273, // FreqH[bd] 0.113974, // FreqH[be] 0.029885, // FreqH[bf] 0.150041, // FreqH[c0] 0.059151, // FreqH[c1] 0.002679, // FreqH[c2] 0.009893, // FreqH[c3] 0.014839, // FreqH[c4] 0.026381, // FreqH[c5] 0.015045, // FreqH[c6] 0.069456, // FreqH[c7] 0.089860, // FreqH[c8] 0.000000, // FreqH[c9] 0.000000, // FreqH[ca] 0.000000, // FreqH[cb] 0.000000, // FreqH[cc] 0.000000, // FreqH[cd] 0.000000, // FreqH[ce] 0.000000, // FreqH[cf] 0.000000, // FreqH[d0] 0.000000, // FreqH[d1] 0.000000, // FreqH[d2] 0.000000, // FreqH[d3] 0.000000, // FreqH[d4] 0.000000, // FreqH[d5] 0.000000, // FreqH[d6] 0.000000, // FreqH[d7] 0.000000, // FreqH[d8] 0.000000, // FreqH[d9] 0.000000, // FreqH[da] 0.000000, // FreqH[db] 0.000000, // FreqH[dc] 0.000000, // FreqH[dd] 0.000000, // FreqH[de] 0.000000, // FreqH[df] 0.000000, // FreqH[e0] 0.000000, // FreqH[e1] 0.000000, // FreqH[e2] 0.000000, // FreqH[e3] 0.000000, // FreqH[e4] 0.000000, // FreqH[e5] 0.000000, // FreqH[e6] 0.000000, // FreqH[e7] 0.000000, // FreqH[e8] 0.000000, // FreqH[e9] 0.000000, // FreqH[ea] 0.000000, // FreqH[eb] 0.000000, // FreqH[ec] 0.000000, // FreqH[ed] 0.000000, // FreqH[ee] 0.000000, // FreqH[ef] 0.000000, // FreqH[f0] 0.000000, // FreqH[f1] 0.000000, // FreqH[f2] 0.000000, // FreqH[f3] 0.000000, // FreqH[f4] 0.000000, // FreqH[f5] 0.000000, // FreqH[f6] 0.000000, // FreqH[f7] 0.000000, // FreqH[f8] 0.000000, // FreqH[f9] 0.000000, // FreqH[fa] 0.000000, // FreqH[fb] 0.000000, // FreqH[fc] 0.000000, // FreqH[fd] 0.000000 // FreqH[fe] ); mFirstByteStdDev: 0.025593; // Lead Byte StdDev mFirstByteMean: 0.010638; // Lead Byte Mean mFirstByteWeight: 0.647437; // Lead Byte Weight mSecoundByteFreq: ( 0.016694, // FreqL[a1] 0.000000, // FreqL[a2] 0.012778, // FreqL[a3] 0.030091, // FreqL[a4] 0.002679, // FreqL[a5] 0.006595, // FreqL[a6] 0.001855, // FreqL[a7] 0.000824, // FreqL[a8] 0.005977, // FreqL[a9] 0.004740, // FreqL[aa] 0.003092, // FreqL[ab] 0.000824, // FreqL[ac] 0.019580, // FreqL[ad] 0.037304, // FreqL[ae] 0.008244, // FreqL[af] 0.014633, // FreqL[b0] 0.001031, // FreqL[b1] 0.000000, // FreqL[b2] 0.003298, // FreqL[b3] 0.002061, // FreqL[b4] 0.006183, // FreqL[b5] 0.005977, // FreqL[b6] 0.000824, // FreqL[b7] 0.021847, // FreqL[b8] 0.014839, // FreqL[b9] 0.052968, // FreqL[ba] 0.017312, // FreqL[bb] 0.007626, // FreqL[bc] 0.000412, // FreqL[bd] 0.000824, // FreqL[be] 0.011129, // FreqL[bf] 0.000000, // FreqL[c0] 0.000412, // FreqL[c1] 0.001649, // FreqL[c2] 0.005977, // FreqL[c3] 0.065746, // FreqL[c4] 0.020198, // FreqL[c5] 0.021434, // FreqL[c6] 0.014633, // FreqL[c7] 0.004122, // FreqL[c8] 0.001649, // FreqL[c9] 0.000824, // FreqL[ca] 0.000824, // FreqL[cb] 0.051937, // FreqL[cc] 0.019580, // FreqL[cd] 0.023289, // FreqL[ce] 0.026381, // FreqL[cf] 0.040396, // FreqL[d0] 0.009068, // FreqL[d1] 0.001443, // FreqL[d2] 0.003710, // FreqL[d3] 0.007420, // FreqL[d4] 0.001443, // FreqL[d5] 0.013190, // FreqL[d6] 0.002885, // FreqL[d7] 0.000412, // FreqL[d8] 0.003298, // FreqL[d9] 0.025969, // FreqL[da] 0.000412, // FreqL[db] 0.000412, // FreqL[dc] 0.006183, // FreqL[dd] 0.003298, // FreqL[de] 0.066983, // FreqL[df] 0.002679, // FreqL[e0] 0.002267, // FreqL[e1] 0.011129, // FreqL[e2] 0.000412, // FreqL[e3] 0.010099, // FreqL[e4] 0.015251, // FreqL[e5] 0.007626, // FreqL[e6] 0.043899, // FreqL[e7] 0.003710, // FreqL[e8] 0.002679, // FreqL[e9] 0.001443, // FreqL[ea] 0.010923, // FreqL[eb] 0.002885, // FreqL[ec] 0.009068, // FreqL[ed] 0.019992, // FreqL[ee] 0.000412, // FreqL[ef] 0.008450, // FreqL[f0] 0.005153, // FreqL[f1] 0.000000, // FreqL[f2] 0.010099, // FreqL[f3] 0.000000, // FreqL[f4] 0.001649, // FreqL[f5] 0.012160, // FreqL[f6] 0.011542, // FreqL[f7] 0.006595, // FreqL[f8] 0.001855, // FreqL[f9] 0.010923, // FreqL[fa] 0.000412, // FreqL[fb] 0.023702, // FreqL[fc] 0.003710, // FreqL[fd] 0.001855 // FreqL[fe] ); mSecoundByteStdDev: 0.013937; // Trail Byte StdDev mSecoundByteMean: 0.010638; // Trail Byte Mean mSecoundByteWeight: 0.352563 // Trial Byte Weight ); doublecmd-0.5.8/components/chsdet/src/stat/EUCJPStatistics.inc0000644000175000017500000001207112014201074023313 0ustar alexxalexxconst EUCJPStat: rEUCStatistics = ( mFirstByteFreq: ( 0.364808, // FreqH[a1] 0.000000, // FreqH[a2] 0.000000, // FreqH[a3] 0.145325, // FreqH[a4] 0.304891, // FreqH[a5] 0.000000, // FreqH[a6] 0.000000, // FreqH[a7] 0.000000, // FreqH[a8] 0.000000, // FreqH[a9] 0.000000, // FreqH[aa] 0.000000, // FreqH[ab] 0.000000, // FreqH[ac] 0.000000, // FreqH[ad] 0.000000, // FreqH[ae] 0.000000, // FreqH[af] 0.001835, // FreqH[b0] 0.010771, // FreqH[b1] 0.006462, // FreqH[b2] 0.001157, // FreqH[b3] 0.002114, // FreqH[b4] 0.003231, // FreqH[b5] 0.001356, // FreqH[b6] 0.007420, // FreqH[b7] 0.004189, // FreqH[b8] 0.003231, // FreqH[b9] 0.003032, // FreqH[ba] 0.033190, // FreqH[bb] 0.006303, // FreqH[bc] 0.006064, // FreqH[bd] 0.009973, // FreqH[be] 0.002354, // FreqH[bf] 0.003670, // FreqH[c0] 0.009135, // FreqH[c1] 0.001675, // FreqH[c2] 0.002792, // FreqH[c3] 0.002194, // FreqH[c4] 0.014720, // FreqH[c5] 0.011928, // FreqH[c6] 0.000878, // FreqH[c7] 0.013124, // FreqH[c8] 0.001077, // FreqH[c9] 0.009295, // FreqH[ca] 0.003471, // FreqH[cb] 0.002872, // FreqH[cc] 0.002433, // FreqH[cd] 0.000957, // FreqH[ce] 0.001636, // FreqH[cf] 0.000000, // FreqH[d0] 0.000000, // FreqH[d1] 0.000000, // FreqH[d2] 0.000000, // FreqH[d3] 0.000000, // FreqH[d4] 0.000000, // FreqH[d5] 0.000000, // FreqH[d6] 0.000000, // FreqH[d7] 0.000000, // FreqH[d8] 0.000000, // FreqH[d9] 0.000000, // FreqH[da] 0.000000, // FreqH[db] 0.000000, // FreqH[dc] 0.000000, // FreqH[dd] 0.000080, // FreqH[de] 0.000279, // FreqH[df] 0.000000, // FreqH[e0] 0.000000, // FreqH[e1] 0.000000, // FreqH[e2] 0.000000, // FreqH[e3] 0.000000, // FreqH[e4] 0.000000, // FreqH[e5] 0.000000, // FreqH[e6] 0.000000, // FreqH[e7] 0.000000, // FreqH[e8] 0.000000, // FreqH[e9] 0.000000, // FreqH[ea] 0.000000, // FreqH[eb] 0.000000, // FreqH[ec] 0.000000, // FreqH[ed] 0.000000, // FreqH[ee] 0.000000, // FreqH[ef] 0.000000, // FreqH[f0] 0.000000, // FreqH[f1] 0.000000, // FreqH[f2] 0.000000, // FreqH[f3] 0.000000, // FreqH[f4] 0.000000, // FreqH[f5] 0.000000, // FreqH[f6] 0.000000, // FreqH[f7] 0.000000, // FreqH[f8] 0.000000, // FreqH[f9] 0.000000, // FreqH[fa] 0.000000, // FreqH[fb] 0.000000, // FreqH[fc] 0.000080, // FreqH[fd] 0.000000 // FreqH[fe] ); mFirstByteStdDev: 0.050407; // Lead Byte StdDev mFirstByteMean: 0.010638; // Lead Byte Mean mFirstByteWeight: 0.640871; // Lead Byte Weight mSecoundByteFreq: ( 0.002473, // FreqL[a1] 0.039134, // FreqL[a2] 0.152745, // FreqL[a3] 0.009694, // FreqL[a4] 0.000359, // FreqL[a5] 0.022180, // FreqL[a6] 0.000758, // FreqL[a7] 0.004308, // FreqL[a8] 0.000160, // FreqL[a9] 0.002513, // FreqL[aa] 0.003072, // FreqL[ab] 0.001316, // FreqL[ac] 0.003830, // FreqL[ad] 0.001037, // FreqL[ae] 0.003590, // FreqL[af] 0.000957, // FreqL[b0] 0.000160, // FreqL[b1] 0.000239, // FreqL[b2] 0.006462, // FreqL[b3] 0.001596, // FreqL[b4] 0.031554, // FreqL[b5] 0.001316, // FreqL[b6] 0.002194, // FreqL[b7] 0.016555, // FreqL[b8] 0.003271, // FreqL[b9] 0.000678, // FreqL[ba] 0.000598, // FreqL[bb] 0.206438, // FreqL[bc] 0.000718, // FreqL[bd] 0.001077, // FreqL[be] 0.003710, // FreqL[bf] 0.001356, // FreqL[c0] 0.001356, // FreqL[c1] 0.000439, // FreqL[c2] 0.004388, // FreqL[c3] 0.005704, // FreqL[c4] 0.000878, // FreqL[c5] 0.010172, // FreqL[c6] 0.007061, // FreqL[c7] 0.014680, // FreqL[c8] 0.000638, // FreqL[c9] 0.025730, // FreqL[ca] 0.002792, // FreqL[cb] 0.000718, // FreqL[cc] 0.001795, // FreqL[cd] 0.091551, // FreqL[ce] 0.000758, // FreqL[cf] 0.003909, // FreqL[d0] 0.000558, // FreqL[d1] 0.031195, // FreqL[d2] 0.007061, // FreqL[d3] 0.001316, // FreqL[d4] 0.022579, // FreqL[d5] 0.006981, // FreqL[d6] 0.007260, // FreqL[d7] 0.001117, // FreqL[d8] 0.000239, // FreqL[d9] 0.012127, // FreqL[da] 0.000878, // FreqL[db] 0.003790, // FreqL[dc] 0.001077, // FreqL[dd] 0.000758, // FreqL[de] 0.002114, // FreqL[df] 0.002234, // FreqL[e0] 0.000678, // FreqL[e1] 0.002992, // FreqL[e2] 0.003311, // FreqL[e3] 0.023416, // FreqL[e4] 0.001237, // FreqL[e5] 0.002753, // FreqL[e6] 0.005146, // FreqL[e7] 0.002194, // FreqL[e8] 0.007021, // FreqL[e9] 0.008497, // FreqL[ea] 0.013763, // FreqL[eb] 0.011768, // FreqL[ec] 0.006303, // FreqL[ed] 0.001915, // FreqL[ee] 0.000638, // FreqL[ef] 0.008776, // FreqL[f0] 0.000918, // FreqL[f1] 0.003431, // FreqL[f2] 0.057603, // FreqL[f3] 0.000439, // FreqL[f4] 0.000439, // FreqL[f5] 0.000758, // FreqL[f6] 0.002872, // FreqL[f7] 0.001675, // FreqL[f8] 0.011050, // FreqL[f9] 0.000000, // FreqL[fa] 0.000279, // FreqL[fb] 0.012127, // FreqL[fc] 0.000718, // FreqL[fd] 0.007380 // FreqL[fe] ); mSecoundByteStdDev: 0.028247; // Trail Byte StdDev mSecoundByteMean: 0.010638; // Trail Byte Mean mSecoundByteWeight: 0.359129 // Trial Byte Weight ); doublecmd-0.5.8/components/chsdet/src/stat/EUCTWStatistics.inc0000644000175000017500000001207112014201074023334 0ustar alexxalexxconst EUCKTWtat: rEUCStatistics = ( mFirstByteFreq: ( 0.000000, // FreqH[a1] 0.000000, // FreqH[a2] 0.000000, // FreqH[a3] 0.000000, // FreqH[a4] 0.000000, // FreqH[a5] 0.000000, // FreqH[a6] 0.000000, // FreqH[a7] 0.000000, // FreqH[a8] 0.000000, // FreqH[a9] 0.000000, // FreqH[aa] 0.000000, // FreqH[ab] 0.000000, // FreqH[ac] 0.000000, // FreqH[ad] 0.000000, // FreqH[ae] 0.000000, // FreqH[af] 0.000000, // FreqH[b0] 0.000000, // FreqH[b1] 0.000000, // FreqH[b2] 0.000000, // FreqH[b3] 0.000000, // FreqH[b4] 0.000000, // FreqH[b5] 0.000000, // FreqH[b6] 0.000000, // FreqH[b7] 0.000000, // FreqH[b8] 0.000000, // FreqH[b9] 0.000000, // FreqH[ba] 0.000000, // FreqH[bb] 0.000000, // FreqH[bc] 0.000000, // FreqH[bd] 0.000000, // FreqH[be] 0.000000, // FreqH[bf] 0.000000, // FreqH[c0] 0.000000, // FreqH[c1] 0.000000, // FreqH[c2] 0.000000, // FreqH[c3] 0.119286, // FreqH[c4] 0.052233, // FreqH[c5] 0.044126, // FreqH[c6] 0.052494, // FreqH[c7] 0.045906, // FreqH[c8] 0.019038, // FreqH[c9] 0.032465, // FreqH[ca] 0.026252, // FreqH[cb] 0.025502, // FreqH[cc] 0.015963, // FreqH[cd] 0.052493, // FreqH[ce] 0.019256, // FreqH[cf] 0.015137, // FreqH[d0] 0.031782, // FreqH[d1] 0.017370, // FreqH[d2] 0.018494, // FreqH[d3] 0.015575, // FreqH[d4] 0.016621, // FreqH[d5] 0.007444, // FreqH[d6] 0.011642, // FreqH[d7] 0.013916, // FreqH[d8] 0.019159, // FreqH[d9] 0.016445, // FreqH[da] 0.007851, // FreqH[db] 0.011079, // FreqH[dc] 0.022842, // FreqH[dd] 0.015513, // FreqH[de] 0.010033, // FreqH[df] 0.009950, // FreqH[e0] 0.010347, // FreqH[e1] 0.013103, // FreqH[e2] 0.015371, // FreqH[e3] 0.012502, // FreqH[e4] 0.007436, // FreqH[e5] 0.018253, // FreqH[e6] 0.014134, // FreqH[e7] 0.008907, // FreqH[e8] 0.005411, // FreqH[e9] 0.009570, // FreqH[ea] 0.013598, // FreqH[eb] 0.006092, // FreqH[ec] 0.007409, // FreqH[ed] 0.008432, // FreqH[ee] 0.005816, // FreqH[ef] 0.009349, // FreqH[f0] 0.005472, // FreqH[f1] 0.007170, // FreqH[f2] 0.007420, // FreqH[f3] 0.003681, // FreqH[f4] 0.007523, // FreqH[f5] 0.004610, // FreqH[f6] 0.006154, // FreqH[f7] 0.003348, // FreqH[f8] 0.005074, // FreqH[f9] 0.005922, // FreqH[fa] 0.005254, // FreqH[fb] 0.004682, // FreqH[fc] 0.002093, // FreqH[fd] 0.000000 // FreqH[fe] ); mFirstByteStdDev: 0.016681; // Lead Byte StdDev mFirstByteMean: 0.010638; // Lead Byte Mean mFirstByteWeight: 0.715599; // Lead Byte Weight mSecoundByteFreq: ( 0.028933, // FreqL[a1] 0.011371, // FreqL[a2] 0.011053, // FreqL[a3] 0.007232, // FreqL[a4] 0.010192, // FreqL[a5] 0.004093, // FreqL[a6] 0.015043, // FreqL[a7] 0.011752, // FreqL[a8] 0.022387, // FreqL[a9] 0.008410, // FreqL[aa] 0.012448, // FreqL[ab] 0.007473, // FreqL[ac] 0.003594, // FreqL[ad] 0.007139, // FreqL[ae] 0.018912, // FreqL[af] 0.006083, // FreqL[b0] 0.003302, // FreqL[b1] 0.010215, // FreqL[b2] 0.008791, // FreqL[b3] 0.024236, // FreqL[b4] 0.014107, // FreqL[b5] 0.014108, // FreqL[b6] 0.010303, // FreqL[b7] 0.009728, // FreqL[b8] 0.007877, // FreqL[b9] 0.009719, // FreqL[ba] 0.007952, // FreqL[bb] 0.021028, // FreqL[bc] 0.005764, // FreqL[bd] 0.009341, // FreqL[be] 0.006591, // FreqL[bf] 0.012517, // FreqL[c0] 0.005921, // FreqL[c1] 0.008982, // FreqL[c2] 0.008771, // FreqL[c3] 0.012802, // FreqL[c4] 0.005926, // FreqL[c5] 0.008342, // FreqL[c6] 0.003086, // FreqL[c7] 0.006843, // FreqL[c8] 0.007576, // FreqL[c9] 0.004734, // FreqL[ca] 0.016404, // FreqL[cb] 0.008803, // FreqL[cc] 0.008071, // FreqL[cd] 0.005349, // FreqL[ce] 0.008566, // FreqL[cf] 0.010840, // FreqL[d0] 0.015401, // FreqL[d1] 0.031904, // FreqL[d2] 0.008670, // FreqL[d3] 0.011479, // FreqL[d4] 0.010936, // FreqL[d5] 0.007617, // FreqL[d6] 0.008995, // FreqL[d7] 0.008114, // FreqL[d8] 0.008658, // FreqL[d9] 0.005934, // FreqL[da] 0.010452, // FreqL[db] 0.009142, // FreqL[dc] 0.004519, // FreqL[dd] 0.008339, // FreqL[de] 0.007476, // FreqL[df] 0.007027, // FreqL[e0] 0.006025, // FreqL[e1] 0.021804, // FreqL[e2] 0.024248, // FreqL[e3] 0.015895, // FreqL[e4] 0.003768, // FreqL[e5] 0.010171, // FreqL[e6] 0.010007, // FreqL[e7] 0.010178, // FreqL[e8] 0.008316, // FreqL[e9] 0.006832, // FreqL[ea] 0.006364, // FreqL[eb] 0.009141, // FreqL[ec] 0.009148, // FreqL[ed] 0.012081, // FreqL[ee] 0.011914, // FreqL[ef] 0.004464, // FreqL[f0] 0.014257, // FreqL[f1] 0.006907, // FreqL[f2] 0.011292, // FreqL[f3] 0.018622, // FreqL[f4] 0.008149, // FreqL[f5] 0.004636, // FreqL[f6] 0.006612, // FreqL[f7] 0.013478, // FreqL[f8] 0.012614, // FreqL[f9] 0.005186, // FreqL[fa] 0.048285, // FreqL[fb] 0.006816, // FreqL[fc] 0.006743, // FreqL[fd] 0.008671 // FreqL[fe] ); mSecoundByteStdDev: 0.006630; // Trail Byte StdDev mSecoundByteMean: 0.010638; // Trail Byte Mean mSecoundByteWeight: 0.284401 // Trial Byte Weight ); doublecmd-0.5.8/components/chsdet/src/stat/GB2312Statistics.inc0000644000175000017500000001207212014201074023246 0ustar alexxalexxconst GB2312Stat: rEUCStatistics = ( mFirstByteFreq: ( 0.011628, // FreqH[a1] 0.000000, // FreqH[a2] 0.000000, // FreqH[a3] 0.000000, // FreqH[a4] 0.000000, // FreqH[a5] 0.000000, // FreqH[a6] 0.000000, // FreqH[a7] 0.000000, // FreqH[a8] 0.000000, // FreqH[a9] 0.000000, // FreqH[aa] 0.000000, // FreqH[ab] 0.000000, // FreqH[ac] 0.000000, // FreqH[ad] 0.000000, // FreqH[ae] 0.000000, // FreqH[af] 0.011628, // FreqH[b0] 0.012403, // FreqH[b1] 0.009302, // FreqH[b2] 0.003876, // FreqH[b3] 0.017829, // FreqH[b4] 0.037209, // FreqH[b5] 0.008527, // FreqH[b6] 0.010078, // FreqH[b7] 0.019380, // FreqH[b8] 0.054264, // FreqH[b9] 0.010078, // FreqH[ba] 0.041085, // FreqH[bb] 0.020930, // FreqH[bc] 0.018605, // FreqH[bd] 0.010078, // FreqH[be] 0.013178, // FreqH[bf] 0.016279, // FreqH[c0] 0.006202, // FreqH[c1] 0.009302, // FreqH[c2] 0.017054, // FreqH[c3] 0.011628, // FreqH[c4] 0.008527, // FreqH[c5] 0.004651, // FreqH[c6] 0.006202, // FreqH[c7] 0.017829, // FreqH[c8] 0.024806, // FreqH[c9] 0.020155, // FreqH[ca] 0.013953, // FreqH[cb] 0.032558, // FreqH[cc] 0.035659, // FreqH[cd] 0.068217, // FreqH[ce] 0.010853, // FreqH[cf] 0.036434, // FreqH[d0] 0.117054, // FreqH[d1] 0.027907, // FreqH[d2] 0.100775, // FreqH[d3] 0.010078, // FreqH[d4] 0.017829, // FreqH[d5] 0.062016, // FreqH[d6] 0.012403, // FreqH[d7] 0.000000, // FreqH[d8] 0.000000, // FreqH[d9] 0.000000, // FreqH[da] 0.000000, // FreqH[db] 0.000000, // FreqH[dc] 0.000000, // FreqH[dd] 0.000000, // FreqH[de] 0.000000, // FreqH[df] 0.000000, // FreqH[e0] 0.000000, // FreqH[e1] 0.000000, // FreqH[e2] 0.000000, // FreqH[e3] 0.000000, // FreqH[e4] 0.000000, // FreqH[e5] 0.000000, // FreqH[e6] 0.000000, // FreqH[e7] 0.000000, // FreqH[e8] 0.000000, // FreqH[e9] 0.001550, // FreqH[ea] 0.000000, // FreqH[eb] 0.000000, // FreqH[ec] 0.000000, // FreqH[ed] 0.000000, // FreqH[ee] 0.000000, // FreqH[ef] 0.000000, // FreqH[f0] 0.000000, // FreqH[f1] 0.000000, // FreqH[f2] 0.000000, // FreqH[f3] 0.000000, // FreqH[f4] 0.000000, // FreqH[f5] 0.000000, // FreqH[f6] 0.000000, // FreqH[f7] 0.000000, // FreqH[f8] 0.000000, // FreqH[f9] 0.000000, // FreqH[fa] 0.000000, // FreqH[fb] 0.000000, // FreqH[fc] 0.000000, // FreqH[fd] 0.000000 // FreqH[fe] ); mFirstByteStdDev: 0.020081; // Lead Byte StdDev mFirstByteMean: 0.010638; // Lead Byte Mean mFirstByteWeight: 0.586533; // Lead Byte Weight mSecoundByteFreq: ( 0.006202, // FreqL[a1] 0.031008, // FreqL[a2] 0.005426, // FreqL[a3] 0.003101, // FreqL[a4] 0.001550, // FreqL[a5] 0.003101, // FreqL[a6] 0.082171, // FreqL[a7] 0.014729, // FreqL[a8] 0.006977, // FreqL[a9] 0.001550, // FreqL[aa] 0.013953, // FreqL[ab] 0.000000, // FreqL[ac] 0.013953, // FreqL[ad] 0.010078, // FreqL[ae] 0.008527, // FreqL[af] 0.006977, // FreqL[b0] 0.004651, // FreqL[b1] 0.003101, // FreqL[b2] 0.003101, // FreqL[b3] 0.003101, // FreqL[b4] 0.008527, // FreqL[b5] 0.003101, // FreqL[b6] 0.005426, // FreqL[b7] 0.005426, // FreqL[b8] 0.005426, // FreqL[b9] 0.003101, // FreqL[ba] 0.001550, // FreqL[bb] 0.006202, // FreqL[bc] 0.014729, // FreqL[bd] 0.010853, // FreqL[be] 0.000000, // FreqL[bf] 0.011628, // FreqL[c0] 0.000000, // FreqL[c1] 0.031783, // FreqL[c2] 0.013953, // FreqL[c3] 0.030233, // FreqL[c4] 0.039535, // FreqL[c5] 0.008527, // FreqL[c6] 0.015504, // FreqL[c7] 0.000000, // FreqL[c8] 0.003101, // FreqL[c9] 0.008527, // FreqL[ca] 0.016279, // FreqL[cb] 0.005426, // FreqL[cc] 0.001550, // FreqL[cd] 0.013953, // FreqL[ce] 0.013953, // FreqL[cf] 0.044961, // FreqL[d0] 0.003101, // FreqL[d1] 0.004651, // FreqL[d2] 0.006977, // FreqL[d3] 0.001550, // FreqL[d4] 0.005426, // FreqL[d5] 0.012403, // FreqL[d6] 0.001550, // FreqL[d7] 0.015504, // FreqL[d8] 0.000000, // FreqL[d9] 0.006202, // FreqL[da] 0.001550, // FreqL[db] 0.000000, // FreqL[dc] 0.007752, // FreqL[dd] 0.006977, // FreqL[de] 0.001550, // FreqL[df] 0.009302, // FreqL[e0] 0.011628, // FreqL[e1] 0.004651, // FreqL[e2] 0.010853, // FreqL[e3] 0.012403, // FreqL[e4] 0.017829, // FreqL[e5] 0.005426, // FreqL[e6] 0.024806, // FreqL[e7] 0.000000, // FreqL[e8] 0.006202, // FreqL[e9] 0.000000, // FreqL[ea] 0.082171, // FreqL[eb] 0.015504, // FreqL[ec] 0.004651, // FreqL[ed] 0.000000, // FreqL[ee] 0.006977, // FreqL[ef] 0.004651, // FreqL[f0] 0.000000, // FreqL[f1] 0.008527, // FreqL[f2] 0.012403, // FreqL[f3] 0.004651, // FreqL[f4] 0.003876, // FreqL[f5] 0.003101, // FreqL[f6] 0.022481, // FreqL[f7] 0.024031, // FreqL[f8] 0.001550, // FreqL[f9] 0.047287, // FreqL[fa] 0.009302, // FreqL[fb] 0.001550, // FreqL[fc] 0.005426, // FreqL[fd] 0.017054 // FreqL[fe] ); mSecoundByteStdDev: 0.014156; // Trail Byte StdDev mSecoundByteMean: 0.010638; // Trail Byte Mean mSecoundByteWeight: 0.413467 // Trial Byte Weight ); doublecmd-0.5.8/components/chsdet/src/nsPkg.pas0000644000175000017500000000525412014201074020520 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: nsPkg.pas,v 1.2 2007/05/20 15:46:11 ya_nick Exp $ unit nsPkg; interface uses nsCore; type nsIdxSft = ( eIdxSft4bits = 3 // NOT used // eIdxSft8bits = 2, // eIdxSft16bits = 1 ); nsSftMsk = ( eSftMsk4bits = 7 // NOT used // eSftMsk8bits = 3, // eSftMsk16bits = 1 ); nsBitSft = ( eBitSft4bits = 2 // NOT used // eBitSft8bits = 3, // eBitSft16bits = 4 ); nsUnitMsk = ( eUnitMsk4bits = $0000000F // NOT used // eUnitMsk8bits = $000000FF, // eUnitMsk16bits = $0000FFFF ); nsPkgInt = record idxsft: nsIdxSft; sftmsk: nsSftMsk; bitsft: nsBitSft; unitmsk: nsUnitMsk; data: pPRUint32; end; pnsPkgInt = ^nsPkgInt; function PCK4BITS(a, b, c, d, e, f, g, h: integer): integer; function GETFROMPCK(i: integer; c: pnsPkgInt): integer; implementation function PCK16BITS(a: integer; b: integer): integer; begin Result:= ((b shl 16) or a); end; function PCK8BITS(a, b, c, d: integer): integer; begin Result:= PCK16BITS(((b shl 8) or a), ((d shl 8) or c)); end; function PCK4BITS(a, b, c, d, e, f, g, h: integer): integer; begin Result:= PCK8BITS(((b shl 4) or a), ((d shl 4) or c), ((f shl 4) or e), ((h shl 4) or g)); end; function GETFROMPCK(i: integer; c: pnsPkgInt): integer; begin Result:= (((aPRUint32(c^.data)[i shr integer(c^.idxsft)]) shr (i and integer(c^.sftmsk) shl integer(c^.bitsft))) and integer(c^.unitmsk)); end; end. doublecmd-0.5.8/components/chsdet/src/chsdet.lpi0000644000175000017500000001224311670731366020730 0ustar alexxalexx doublecmd-0.5.8/components/chsdet/src/nsLatin1Prober.pas0000644000175000017500000001537112014201074022302 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: nsLatin1Prober.pas,v 1.3 2007/05/26 13:09:38 ya_nick Exp $ unit nsLatin1Prober; interface uses nsCore, CustomDetector; type TnsLatin1Prober = class(TCustomDetector) private mLastCharClass: Char; mFreqCounter: array of PRUint32; public constructor Create; override; destructor Destroy; override; function HandleData(aBuf: PChar; aLen: integer): eProbingState; override; function GetDetectedCharset: eInternalCharsetID; override; procedure Reset; override; function GetConfidence: float; override; {$ifdef DEBUG_chardet} procedure DumpStatus; override; {$endif} end; implementation uses SysUtils; const FREQ_CAT_NUM = 4; UDF = 0; (* undefined*) OTH = 1; (*other*) ASC = 2; (* ascii capital letter*) ASS = 3; (* ascii small letter*) ACV = 4; (* accent capital vowel*) ACO = 5; (* accent capital other*) ASV = 6; (* accent small vowel*) ASO = 7; (* accent small other*) CLASS_NUM = 8; (* total classes*) Latin1_CharToClass: array [0..255] of byte = ( OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 00 - 07 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 08 - 0F OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 10 - 17 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 18 - 1F OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 20 - 27 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 28 - 2F OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 30 - 37 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 38 - 3F OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, // 40 - 47 ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, // 48 - 4F ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, // 50 - 57 ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, // 58 - 5F OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, // 60 - 67 ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, // 68 - 6F ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, // 70 - 77 ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, // 78 - 7F OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, // 80 - 87 OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, // 88 - 8F UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 90 - 97 OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, // 98 - 9F OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // A0 - A7 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // A8 - AF OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // B0 - B7 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // B8 - BF ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, // C0 - C7 ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, // C8 - CF ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, // D0 - D7 ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, // D8 - DF ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, // E0 - E7 ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, // E8 - EF ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, // F0 - F7 ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO // F8 - FF ); (* 0 : illegal 1 : very unlikely 2 : normal 3 : very likely *) Latin1ClassModel: array [0..63] of byte = ( (* UDF OTH ASC ASS ACV ACO ASV ASO *) (*UDF*) 0, 0, 0, 0, 0, 0, 0, 0, (*OTH*) 0, 3, 3, 3, 3, 3, 3, 3, (*ASC*) 0, 3, 3, 3, 3, 3, 3, 3, (*ASS*) 0, 3, 3, 3, 1, 1, 3, 3, (*ACV*) 0, 3, 3, 3, 1, 2, 1, 2, (*ACO*) 0, 3, 3, 3, 3, 3, 3, 3, (*ASV*) 0, 3, 1, 3, 1, 1, 1, 3, (*ASO*) 0, 3, 1, 3, 1, 1, 3, 3 ); { TnsLatin1Prober } constructor TnsLatin1Prober.Create; begin inherited Create; SetLength(mFreqCounter, FREQ_CAT_NUM); Reset; end; destructor TnsLatin1Prober.Destroy; begin SetLength(mFreqCounter, 0); inherited; end; {$ifdef DEBUG_chardet} procedure TnsLatin1Prober.DumpStatus; begin printf(' Latin1Prober: %1.3f [%s]r'#13#10'',GetConfidence,GetCharSetName); end; {$endif} function TnsLatin1Prober.GetDetectedCharset: eInternalCharsetID; begin Result := WINDOWS_1252_CHARSET; end; function TnsLatin1Prober.GetConfidence: float; var confidence: float; total: cardinal; i: integer; begin if mState = psNotMe then begin Result := SURE_NO; exit; end; total := 0; for i := 0 to Pred(FREQ_CAT_NUM) do total := total + mFreqCounter[i]; if total = 0 then confidence := 0.0 else begin confidence := mFreqCounter[3] * 1.0 / total; confidence := confidence - (mFreqCounter[1] * 20.0 /total); end; if confidence < 0.0 then confidence := 0.0; confidence := confidence * (0.50); (* lower the confidence of latin1 so that other more accurate detector *) (* can take priority.*) Result := confidence; end; function TnsLatin1Prober.HandleData(aBuf: PChar; aLen: integer): eProbingState; var newBuf1: PChar; newLen1: integer; charClass: char; freq: byte; i: integer; begin Result := inherited HandleData(aBuf, aLen); if Result = psNotMe then exit; newBuf1 := nil; newLen1 := 0; newBuf1 := AllocMem(aLen); try if not FilterWithEnglishLetters(aBuf,aLen,newBuf1,newLen1) then begin newBuf1 := aBuf; newLen1 := aLen; end; for i := 0 to Pred(newLen1) do begin charClass := char(Latin1_CharToClass[integer(newBuf1[i])]); freq := Latin1ClassModel[byte(mLastCharClass) * CLASS_NUM + byte(charClass)]; if freq = 0 then begin mState:= psNotMe; break; end; inc(mFreqCounter[freq]); mLastCharClass := charClass; end; finally FreeMem(newBuf1, aLen); end; Result := mState; end; procedure TnsLatin1Prober.Reset; var i: integer; begin mState := psDetecting; mLastCharClass := Char(OTH); for i := 0 to Pred(FREQ_CAT_NUM) do mFreqCounter[i] := 0; end; end. doublecmd-0.5.8/components/chsdet/src/chsdet.dof0000644000175000017500000001662111670731366020720 0ustar alexxalexx[FileVersion] Version=6.0 [Compiler] A=8 B=0 C=1 D=1 E=0 F=0 G=1 H=1 I=1 J=1 K=0 L=1 M=0 N=1 O=1 P=1 Q=0 R=0 S=0 T=0 U=1 V=1 W=0 X=1 Y=2 Z=1 ShowHints=1 ShowWarnings=1 UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; [Linker] MapFile=0 OutputObjs=0 ConsoleApp=1 DebugInfo=0 RemoteSymbols=0 MinStackSize=16384 MaxStackSize=1048576 ImageBase=4194304 ExeDescription= [Directories] OutputDir=..\ UnitOutputDir=..\dcu PackageDLLOutputDir= PackageDCPOutputDir= SearchPath=.\mbclass;.\sbseq;.\stat Packages=VCL50;VCLX50;VCLSMP50;QRPT50;VCLDB50;VCLIE50;INETDB50;INET50;NMFAST50;dclocx50;dclaxserver50;DJCL50;JVAPPFRMD5R;JVCORED5R;JVBANDSD5R;JVDLGSD5R;JVCMPD5R;JVCRYPTD5R;JVCTRLSD5R;JVCUSTOMD5R;JVDOCKINGD5R;JVDOTNETCTRLSD5R;JVEDID5R;JVGLOBUSD5R;JVHMID5R;JVINSPECTORD5R;JVINTERPRETERD5R;JVJANSD5R;JVMANAGEDTHREADSD5R;JVMMD5R;JVNETD5R;JVSTDCTRLSD5R;JVPAGECOMPSD5R;JVPLUGIND5R;JVPRINTPREVIEWD5R;JVSYSTEMD5R;JVTIMEFRAMEWORKD5R;JVUIBD5R;JVVALIDATORSD5R;JVWIZARDD5R;JVXPCTRLSD5R;vcl Conditionals= DebugSourceDirs= UsePackages=0 [Parameters] RunParams= HostApplication= Launcher= UseLauncher=0 DebugCWD= [Language] ActiveLang= ProjectLang=$00000407 [Version Info] IncludeVerInfo=1 AutoIncBuild=0 MajorVer=0 MinorVer=2 Release=6 Build=2 Debug=0 PreRelease=0 Special=0 Private=0 DLL=1 Locale=2057 CodePage=1252 [Version Info Keys] CompanyName= FileDescription=Charset detector FileVersion=0.2.6.2 InternalName= LegalCopyright=Nick Yakowlew, ya_nick@users.sourceforge.net LegalTrademarks= OriginalFilename=chsdet.dll ProductName=Charset detector ProductVersion=0.2 Comments=LGPL Licence [Excluded Packages] E:\Data\Yan\Delphi\log4delphi\bin\log4delphi_D6.bpl=Log4Delphi 0.5 c:\program files\borland\delphi6\Bin\DCLNMF60.bpl=NetMasters Fastnet Tools C:\PROGRAM FILES\BORLAND\DELPHI6\PROJECTS\BPL\TBX_D6.BPL=Toolbar2000 -- TBX Extensions (Alex Denisov) C:\PROGRAM FILES\BORLAND\DELPHI6\PROJECTS\BPL\TB2K_D6.BPL=Toolbar2000 Components (Jordan Russell) C:\PROGRAM FILES\BORLAND\DELPHI6\PROJECTS\BPL\TBXDSGN_D6.BPL=Toolbar2000 -- TBX Extensions Design Package (Alex Denisov) C:\PROGRAM FILES\BORLAND\DELPHI6\PROJECTS\BPL\TB2KDSGN_D6.BPL=Toolbar2000 Design Package (Jordan Russell) c:\program files\borland\delphi6\Projects\Bpl\IEDcomp.bpl=Internet EDiting components C:\PROGRAM FILES\BORLAND\DELPHI6\PROJECTS\BPL\TNTUNICODEVCL_D60.BPL=Tnt Unicode Controls c:\program files\borland\delphi6\Projects\Bpl\SmpltCP.bpl=(untitled) c:\program files\borland\delphi6\Projects\Bpl\devFileMonitorPkg.bpl=(untitled) c:\program files\borland\delphi6\Bin\dclsoap60.bpl=Borland SOAP Components c:\program files\borland\delphi6\Projects\Bpl\SpTBXLibDsgn_d6.bpl=Toolbar2000 -- SpTBXLib Design Package c:\program files\borland\delphi6\Projects\Bpl\LSFindReplaceDialogW_6.bpl=LS Find/Replace Dialog for Wide Strings c:\program files\borland\delphi6\Projects\Bpl\Unicode6.bpl=Unicode components c:\program files\borland\delphi6\Projects\Bpl\credit.bpl=(untitled) c:\program files\borland\delphi6\Projects\Bpl\pActivePorts.bpl=LGM ActivePorts Component c:\program files\borland\delphi6\Projects\Bpl\USE.bpl=Unicode Syntax Edit control C:\Program Files\Borland\Delphi6\Projects\Bpl\JvAppFrmD6D.bpl=JVCL Application and Form Components C:\PROGRAM FILES\BORLAND\DELPHI6\PROJECTS\BPL\JVCORED6D.BPL=JVCL Core Components C:\Program Files\Borland\Delphi6\Projects\Bpl\JvCmpD6D.bpl=JVCL Non-Visual Components C:\Program Files\Borland\Delphi6\Projects\Bpl\JvCryptD6D.bpl=JVCL Encryption and Compression Components C:\Program Files\Borland\Delphi6\Projects\Bpl\JvCtrlsD6D.bpl=JVCL Visual Controls C:\Program Files\Borland\Delphi6\Projects\Bpl\JvCustomD6D.bpl=JVCL Custom Controls C:\Program Files\Borland\Delphi6\Projects\Bpl\JvDlgsD6D.bpl=JVCL Dialog Components C:\Program Files\Borland\Delphi6\Projects\Bpl\JvDockingD6D.bpl=JVCL Docking Components C:\Program Files\Borland\Delphi6\Projects\Bpl\JvGlobusD6D.bpl=JVCL Globus Components C:\Program Files\Borland\Delphi6\Projects\Bpl\JvHMID6D.bpl=JVCL HMI Controls design time unit C:\Program Files\Borland\Delphi6\Projects\Bpl\JvJansD6D.bpl=JVCL Jans Components C:\Program Files\Borland\Delphi6\Projects\Bpl\JvManagedThreadsD6D.bpl=JVCL Managed Threads C:\Program Files\Borland\Delphi6\Projects\Bpl\JvMMD6D.bpl=JVCL Multimedia and Image Components C:\PROGRAM FILES\BORLAND\DELPHI6\PROJECTS\BPL\JVSTDCTRLSD6D.BPL=JVCL Standard Controls C:\Program Files\Borland\Delphi6\Projects\Bpl\JvPageCompsD6D.bpl=JVCL Page Style Components C:\Program Files\Borland\Delphi6\Projects\Bpl\JvPluginD6D.bpl=JVCL Plugin Components C:\Program Files\Borland\Delphi6\Projects\Bpl\JvSystemD6D.bpl=JVCL System Components C:\Program Files\Borland\Delphi6\Projects\Bpl\JvTimeFrameworkD6D.bpl=JVCL Time Framework C:\Program Files\Borland\Delphi6\Projects\Bpl\JvValidatorsD6D.bpl=JVCL Validators and Error Provider Components C:\Program Files\Borland\Delphi6\Projects\Bpl\JvXPCtrlsD6D.bpl=JVCL XP Controls C:\Program Files\Borland\Delphi6\Projects\Bpl\JvBandsD6D.bpl=JVCL Band Objects C:\Program Files\Borland\Delphi6\Projects\Bpl\JvBDED6D.bpl=JVCL BDE Components C:\PROGRAM FILES\BORLAND\DELPHI6\PROJECTS\BPL\JVDBD6D.BPL=JVCL Database Components C:\Program Files\Borland\Delphi6\Projects\Bpl\JvDotNetCtrlsD6D.bpl=JVCL DotNet Controls C:\Program Files\Borland\Delphi6\Projects\Bpl\JvEDID6D.bpl=JVCL EDI Components Designtime Package C:\Program Files\Borland\Delphi6\Projects\Bpl\JvInspectorD6D.bpl=JVCL Inspector Components C:\Program Files\Borland\Delphi6\Projects\Bpl\JvInterpreterD6D.bpl=JVCL Interpreter Components C:\Program Files\Borland\Delphi6\Projects\Bpl\JvNetD6D.bpl=JVCL Network Components C:\Program Files\Borland\Delphi6\Projects\Bpl\JvPrintPreviewD6D.bpl=JVCL Print Preview Components C:\Program Files\Borland\Delphi6\Projects\Bpl\JvUIBD6D.bpl=JVCL Unified Interbase Components C:\Program Files\Borland\Delphi6\Projects\Bpl\JvWizardD6D.bpl=JVCL Wizard Design Time Package c:\program files\borland\delphi6\Projects\Bpl\components.bpl=Components for tsWebEditor c:\program files\borland\delphi6\Projects\Bpl\CoolTrayIcon_D6plus.bpl=CoolTrayIcon and Friends C:\PROGRAM FILES\BORLAND\DELPHI6\BIN\DCLBDE60.BPL=Borland BDE DB Components C:\PROGRAM FILES\BORLAND\DELPHI6\BIN\DBX60.BPL=Borland SQL Explorer UI Package c:\program files\borland\delphi6\Projects\Bpl\ClassBrowsing.bpl=ClassBrowsing components c:\program files\borland\delphi6\Bin\dclqrt60.bpl=QuickReport Components c:\program files\borland\delphi6\Bin\dclcds60.bpl=Borland Base Cached ClientDataset Component C:\PROGRAM FILES\BORLAND\DELPHI6\BIN\DCLMID60.BPL=Borland MyBase DataAccess Components c:\program files\borland\delphi6\Bin\dclbdecds60.bpl=Borland Local BDE ClientDataset Components c:\program files\borland\delphi6\Bin\dcltee60.bpl=TeeChart Components c:\program files\borland\delphi6\Bin\dcltqr60.bpl=TeeChart for QuickReport Components c:\program files\borland\delphi6\Bin\dclib60.bpl=InterBase Data Access Components c:\program files\borland\delphi6\Bin\dcldbxcds60.bpl=Borland Local DBX ClientDataset Components c:\program files\borland\delphi6\Bin\DBWEBXPRT.BPL=Borland Web Wizard Package c:\program files\borland\delphi6\Projects\Bpl\prgInternet6.bpl=Progsan Internet Components c:\program files\borland\delphi6\Projects\Bpl\Comps_D6.bpl=(untitled) c:\program files\borland\delphi6\Projects\Bpl\SynEdit_D6.bpl=SynEdit component suite c:\program files\borland\delphi6\Projects\Bpl\DevCpp.bpl=Dev-c++ components doublecmd-0.5.8/components/chsdet/src/nsSBCharSetProber.pas0000644000175000017500000001622012014201074022722 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: nsSBCharSetProber.pas,v 1.3 2007/05/26 13:09:38 ya_nick Exp $ unit nsSBCharSetProber; interface uses {$I dbg.inc} nsCore, CustomDetector; const NUMBER_OF_SEQ_CAT = 4; type SequenceModel = record charToOrderMap: PChar; (* [256] table use to find a char's order*) precedenceMatrix: PChar; (* [SAMPLE_SIZE][SAMPLE_SIZE]; table to find a 2-char sequence's frequency*) mTypicalPositiveRatio: float; (* = freqSeqs / totalSeqs *) keepEnglishLetter: Boolean; (* says if this script contains English characters (not implemented)*) CharsetID: eInternalCharsetID; end; TnsSingleByteCharSetProber = class(TCustomDetector) protected mModel: SequenceModel; mReversed: Boolean; (* TRUE if we need to reverse every pair in the model lookup*) mLastOrder: byte; (*char order of last character*) mTotalSeqs: PRUint32; mSeqCounters: array [0..Pred(NUMBER_OF_SEQ_CAT)] of PRUint32; mTotalChar: PRUint32; (*characters that fall in our sampling range*) mFreqChar: PRUint32; (* Optional auxiliary prober for name decision. created and destroyed by the GroupProber*) mNameProber: TCustomDetector; public constructor Create(model: SequenceModel; reversed: Boolean = FALSE; nameProber: TCustomDetector = nil); reintroduce; destructor Destroy; override; function GetDetectedCharset: eInternalCharsetID; override; function HandleData(aBuf: PChar; aLen: integer): eProbingState; override; procedure Reset; override; function GetConfidence: float; override; (* This feature is not implemented yet. any current language model*) (* contain this parameter as PR_FALSE. No one is looking at this*) (* parameter or calling this method.*) (* Moreover, the nsSBCSGroupProber which calls the HandleData of this*) (* prober has a hard-coded call to FilterWithoutEnglishLetters which gets rid*) (* of the English letters.*) function KeepEnglishLetters: Boolean; virtual; (* (not implemented)*) end; implementation {$ifdef DEBUG_chardet} uses TypInfo, SysUtils; {$endif} const SAMPLE_SIZE: byte = 64; SB_ENOUGH_REL_THRESHOLD = 1024; POSITIVE_SHORTCUT_THRESHOLD = SHORTCUT_THRESHOLD; NEGATIVE_SHORTCUT_THRESHOLD = 1 - POSITIVE_SHORTCUT_THRESHOLD; SYMBOL_CAT_ORDER: byte = 250; POSITIVE_CAT = (NUMBER_OF_SEQ_CAT-1); (*#define NEGATIVE_APPROACH 1*) {$ifdef NEGATIVE_APPROACH} NEGATIVE_CAT = 0; {$endif} { TnsSingleByteCharSetProber } constructor TnsSingleByteCharSetProber.Create(model: SequenceModel; reversed: Boolean = FALSE; nameProber: TCustomDetector = nil); begin inherited Create; mModel := model; mReversed := reversed; mNameProber := nameProber; Reset; end; destructor TnsSingleByteCharSetProber.Destroy; begin inherited; end; function TnsSingleByteCharSetProber.GetDetectedCharset: eInternalCharsetID; begin if mNameProber = nil then begin Result := mModel.CharsetID; exit; end; Result := mNameProber.GetDetectedCharset; end; (*#define NEGATIVE_APPROACH 1*) function TnsSingleByteCharSetProber.GetConfidence: float; var r: float; begin {$ifdef NEGATIVE_APPROACH} if mTotalSeqs > 0 then if mTotalSeqs > mSeqCounters[NEGATIVE_CAT] * 10 then begin Result := (mTotalSeqs-mSeqCounters[NEGATIVE_CAT] * 10) / mTotalSeqs * mFreqChar / mTotalChar; exit; end; Result := SURE_NO; {$else} (*POSITIVE_APPROACH*) if mTotalSeqs > 0 then begin r := (1.0) * mSeqCounters[POSITIVE_CAT] / mTotalSeqs / mModel.mTypicalPositiveRatio; r := r * mFreqChar / mTotalChar; if r >= 1.0 then r := SURE_YES; Result := r; exit; end; Result := SURE_NO; {$endif} end; function TnsSingleByteCharSetProber.HandleData(aBuf: PChar; aLen: integer): eProbingState; var order: byte; i: integer; cf: float; begin Result := inherited HandleData(aBuf, aLen); if Result = psNotMe then exit; // TODO - move here call to FilterWithoutEnglishLetters from nsSBCSGroupProber.pas // if not mModel.keepEnglishLetter then ... for i := 0 to Pred(aLen) do begin order := byte(mModel.charToOrderMap[byte(aBuf[i])]); if order < SYMBOL_CAT_ORDER then inc(mTotalChar); if order < SAMPLE_SIZE then begin inc(mFreqChar); if mLastOrder < SAMPLE_SIZE then begin inc(mTotalSeqs); {$ifdef DEBUG_chardet} //if ((mLastOrder * SAMPLE_SIZE + order) >= 4096) then AddDump(Format('oredr %4d for byte %4d last order %4d'+#10#13+ 'array index %4d array high %8d'+#10#13+ 'LangModel %s', [order,byte(aBuf[i]),mLastOrder, (mLastOrder * SAMPLE_SIZE + order),4096, getEnumName(TypeInfo(eInternalCharsetID), integer(mModel.CharsetID))])); {$endif} if not mReversed then inc(mSeqCounters[cardinal(mModel.precedenceMatrix[mLastOrder * SAMPLE_SIZE + order])]) else inc(mSeqCounters[cardinal(mModel.precedenceMatrix[order * SAMPLE_SIZE + mLastOrder])]); (* reverse the order of the letters in the lookup*) end; end; mLastOrder:= order; end; if mState = psDetecting then if mTotalSeqs > SB_ENOUGH_REL_THRESHOLD then begin cf := GetConfidence; if cf > POSITIVE_SHORTCUT_THRESHOLD then mState:= psFoundIt else if cf < NEGATIVE_SHORTCUT_THRESHOLD then mState:= psNotMe; end; Result := mState; end; function TnsSingleByteCharSetProber.KeepEnglishLetters: Boolean; begin Result := mModel.keepEnglishLetter; end; procedure TnsSingleByteCharSetProber.Reset; var i: integer; begin if mEnabled then mState := psDetecting else mState := psNotMe; mLastOrder := 255; for i := 0 to Pred(NUMBER_OF_SEQ_CAT) do mSeqCounters[i] := 0; mTotalSeqs := 0; mTotalChar := 0; mFreqChar := 0; end; end. doublecmd-0.5.8/components/chsdet/src/chsdIntf.pas0000644000175000017500000000564512014201074021204 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: chsdIntf.pas,v 1.4 2008/06/22 09:04:20 ya_nick Exp $ unit chsdIntf; interface uses nsCore; procedure csd_Reset; stdcall; function csd_HandleData(aBuf: PChar; aLen: integer): integer; stdcall; function csd_Done: boolean; stdcall; procedure csd_DataEnd; stdcall; function csd_GetDetectedCharset: rCharsetInfo; stdcall; function csd_GetKnownCharsets(var KnownCharsets: pChar): integer; stdcall; procedure csd_GetAbout(var About: rAboutHolder); stdcall; function csd_GetDetectedBOM: eBOMKind; stdcall; procedure csd_DisableCharsetCP(CodePage: integer); stdcall; implementation uses nsUniversalDetector; var Detector: TnsUniversalDetector = nil; procedure csd_Reset; stdcall; begin Detector.Reset; end; function csd_HandleData(aBuf: PChar; aLen: integer): integer; stdcall; begin Result := Detector.HandleData(aBuf, aLen); end; function csd_Done: boolean; stdcall; begin Result := Detector.Done; end; procedure csd_DataEnd; stdcall; begin Detector.DataEnd; end; function csd_GetDetectedCharset: rCharsetInfo; stdcall; begin Result := Detector.GetDetectedCharsetInfo; end; function csd_GetKnownCharsets(var KnownCharsets: pChar): integer; stdcall; begin Result := Detector.GetKnownCharset(KnownCharsets); end; procedure csd_GetAbout(var About: rAboutHolder); stdcall; begin Detector.GetAbout(About); end; function csd_GetDetectedBOM: eBOMKind; stdcall; begin Result := Detector.BOMDetected; end; procedure csd_DisableCharsetCP(CodePage: integer); stdcall; begin Detector.DisableCharset(CodePage); end; initialization Detector := TnsUniversalDetector.Create; finalization if Detector <> nil then Detector.Free; end. doublecmd-0.5.8/components/chsdet/src/MBUnicodeMultiProber.pas0000644000175000017500000000765412014201074023436 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: MBUnicodeMultiProber.pas,v 1.2 2007/05/26 13:09:38 ya_nick Exp $ unit MBUnicodeMultiProber; interface uses {$I dbg.inc} nsCore, MultiModelProber; type TMBUnicodeMultiProber = class (TMultiModelProber) public constructor Create; reintroduce; destructor Destroy; override; function HandleData(aBuf: PChar; aLen: integer): eProbingState; override; // function GetConfidence: double; override; end; implementation uses SysUtils, nsCodingStateMachine; {$I '.\mbclass\UTF8LangModel.inc'} {$I '.\mbclass\UCS2BELangModel.inc'} {$I '.\mbclass\UCS2LELangModel.inc'} { TMBUnicodeMultiProber } const NUM_OF_PROBERS = 3; ONE_CHAR_PROB: float = 0.50; {$ifdef DEBUG_chardet} {$endif} constructor TMBUnicodeMultiProber.Create; begin inherited Create; AddCharsetModel(UTF8LangModel); AddCharsetModel(UCS2BELangModel); AddCharsetModel(UCS2LELangModel); end; destructor TMBUnicodeMultiProber.Destroy; begin inherited; end; function TMBUnicodeMultiProber.HandleData(aBuf: PChar; aLen: integer): eProbingState; var i: integer; (*do filtering to reduce load to probers*) highbyteBuf: PChar; hptr: PChar; keepNext: Boolean; begin keepNext := TRUE; (*assume previous is not ascii, it will do no harm except add some noise*) highbyteBuf := AllocMem(aLen); try hptr:= highbyteBuf; if hptr = nil then begin Result := mState; exit; end; for i:=0 to Pred(aLen) do begin if (Byte(aBuf[i]) > $80) then begin inc(hptr); hptr^ := aBuf[i]; keepNext:= TRUE; end else begin (*if previous is highbyte, keep this even it is a ASCII*) if keepNext = TRUE then begin inc(hptr); hptr^ := aBuf[i]; keepNext:= FALSE; end; end; end; // inherited HandleData(highbyteBuf, hptr - highbyteBuf); inherited HandleData(aBuf, aLen); finally FreeMem(highbyteBuf, aLen); end; Result := mState; end; //function TMBUnicodeMultiProber.GetConfidence: double; //var // i: integer; // conf, // bestConf: double; //begin // mBestGuess := -1; // bestConf := SURE_NO; // for i := 0 to Pred(mCharsetsCount) do // begin // if (mSMState[i] = psFoundIt) or // (mSMState[i] = psNotMe) then // continue; // // if conf > bestConf then // begin // mBestGuess := i; // bestConf := conf; // end; // end; // Result := bestConf; // if mBestGuess > 0 then // mDetectedCharset := mCodingSM[mBestGuess].GetCharsetID // else // mDetectedCharset := UNKNOWN_CHARSET; //end; end. doublecmd-0.5.8/components/chsdet/src/nsHebrewProber.pas0000644000175000017500000003543012014201074022364 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: nsHebrewProber.pas,v 1.3 2007/05/26 13:09:38 ya_nick Exp $ unit nsHebrewProber; interface uses nsCore, CustomDetector; (* This prober doesn't actually recognize a language or a charset.*) (* It is a helper prober for the use of the Hebrew model probers*) type TnsHebrewProber = class(TCustomDetector) protected mFinalCharLogicalScore: PRInt32; mFinalCharVisualScore: PRInt32; (* The two last characters seen in the previous buffer.*) mPrev: char; mBeforePrev: char; (* These probers are owned by the group prober.*) mLogicalProb: TCustomDetector; mVisualProb: TCustomDetector; public constructor Create; override; destructor Destroy; override; function HandleData(aBuf: PChar; aLen: integer): eProbingState; override; function GetDetectedCharset: eInternalCharsetID; override; procedure Reset; override; function GetState: eProbingState; override; procedure SetModelProbers(logicalPrb: TCustomDetector; visualPrb: TCustomDetector); {$ifdef DEBUG_chardet} procedure DumpStatus; override; {$endif} function isFinal(c: char): Boolean; function isNonFinal(c: char): Boolean; function GetConfidence: float; override; end; implementation (* windows-1255 / ISO-8859-8 code points of interest*) const FINAL_KAF = (#$ea); NORMAL_KAF = (#$eb); FINAL_MEM = (#$ed); NORMAL_MEM = (#$ee); FINAL_NUN = (#$ef); NORMAL_NUN = (#$f0); FINAL_PE = (#$f3); NORMAL_PE = (#$f4); FINAL_TSADI = (#$f5); // YaN - Not used // NORMAL_TSADI = (#$f6); (* Minimum Visual vs Logical final letter score difference.*) (* If the difference is below this, don't rely solely on the final letter score distance.*) MIN_FINAL_CHAR_DISTANCE = (5); (* Minimum Visual vs Logical model score difference.*) (* If the difference is below this, don't rely at all on the model score distance.*) MIN_MODEL_DISTANCE = (0.01); var VISUAL_HEBREW_CHARSET, LOGICAL_HEBREW_CHARSET: eInternalCharsetID; { TnsHebrewProber } constructor TnsHebrewProber.Create; begin inherited Create; mLogicalProb := nil; mVisualProb := nil; VISUAL_HEBREW_CHARSET := ISO_8859_8_CHARSET; LOGICAL_HEBREW_CHARSET := WINDOWS_1255_CHARSET; Reset; end; destructor TnsHebrewProber.Destroy; begin inherited; end; {$ifdef DEBUG_chardet} procedure TnsHebrewProber.DumpStatus; begin printf(' HEB: %d - %d [Logical-Visual score]r'#13#10'',mFinalCharLogicalScore,mFinalCharVisualScore); end; {$endif} (* Make the decision: is it Logical or Visual?*) function TnsHebrewProber.GetDetectedCharset: eInternalCharsetID; var finalsub: PRInt32; modelsub: float; begin (* If the final letter score distance is dominant enough, rely on it.*) finalsub := mFinalCharLogicalScore-mFinalCharVisualScore; if finalsub >= MIN_FINAL_CHAR_DISTANCE then begin Result := LOGICAL_HEBREW_CHARSET; exit; end; if finalsub <= -(MIN_FINAL_CHAR_DISTANCE) then begin Result:= VISUAL_HEBREW_CHARSET; exit; end; (* It's not dominant enough, try to rely on the model scores instead.*) modelsub := mLogicalProb.GetConfidence - mVisualProb.GetConfidence; if modelsub > MIN_MODEL_DISTANCE then begin Result := LOGICAL_HEBREW_CHARSET; exit; end; if modelsub < -(MIN_MODEL_DISTANCE) then begin Result := VISUAL_HEBREW_CHARSET; exit; end; (* Still no good, back to final letter distance, maybe it'll save the day.*) if finalsub < 0 then begin Result := VISUAL_HEBREW_CHARSET; exit; end; (* (finalsub > 0 - Logical) or (don't know what to do) default to Logical.*) Result:= LOGICAL_HEBREW_CHARSET; end; function TnsHebrewProber.GetConfidence: float; begin Result := 0.0; end; function TnsHebrewProber.GetState: eProbingState; begin (* Remain active as long as any of the model probers are active.*) if (mLogicalProb.GetState = psNotMe) and (mVisualProb.GetState = psNotMe) then begin Result := psNotMe; exit; end; Result := psDetecting; end; function TnsHebrewProber.HandleData(aBuf: PChar; aLen: integer): eProbingState; (* * Final letter analysis for logical-visual decision. * Look for evidence that the received buffer is either logical Hebrew or * visual Hebrew. * The following cases are checked: * 1) A word longer than 1 letter, ending with a final letter. This is an * indication that the text is laid out "naturally" since the final letter * really appears at the end. +1 for logical score. * 2) A word longer than 1 letter, ending with a Non-Final letter. In normal * Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, should not end with * the Non-Final form of that letter. Exceptions to this rule are mentioned * above in isNonFinal(). This is an indication that the text is laid out * backwards. +1 for visual score * 3) A word longer than 1 letter, starting with a final letter. Final letters * should not appear at the beginning of a word. This is an indication that * the text is laid out backwards. +1 for visual score. * * The visual score and logical score are accumulated throughout the text and * are finally checked against each other in GetCharSetName(). * No checking for final letters in the middle of words is done since that case * is not an indication for either Logical or Visual text. * * The input buffer should not contain any white spaces that are not (' ') * or any low-ascii punctuation marks. *) var curPtr: PChar; endPtr: PChar; cur: char; begin (* check prober enabled*) inherited HandleData(aBuf, aLen); (* Both model probers say it's not them. No reason to continue.*) if GetState = psNotMe then begin Result:= psNotMe; exit; end; endPtr := aBuf + aLen; curPtr := aBuf; while curPtr < endPtr do begin cur := curPtr^; if cur = ' ' then begin (* We stand on a space - a word just ended*) if mBeforePrev <> ' ' then begin (* *(curPtr-2) was not a space so prev is not a 1 letter word*) if isFinal(mPrev) then inc(mFinalCharLogicalScore) else (* case (1) [-2:not space][-1:final letter][cur:space]*) if isNonFinal(mPrev) then inc(mFinalCharVisualScore); (* case (2) [-2:not space][-1:Non-Final letter][cur:space]*) end; end else begin (* Not standing on a space*) if (mBeforePrev = ' ') and isFinal(mPrev) and (cur <> ' ') then inc(mFinalCharVisualScore); (* case (3) [-2:space][-1:final letter][cur:not space]*) end; mBeforePrev := mPrev; mPrev := cur; inc(curPtr); end; (* Forever detecting, till the end or until both model probers return psNotMe (handled above).*) Result := psDetecting; end; function TnsHebrewProber.isFinal(c: char): Boolean; begin Result := ((c=FINAL_KAF))or((c=FINAL_MEM))or((c=FINAL_NUN))or((c=FINAL_PE))or((c=FINAL_TSADI)); end; function TnsHebrewProber.isNonFinal(c: char): Boolean; begin Result:= ((c=NORMAL_KAF))or((c=NORMAL_MEM))or((c=NORMAL_NUN))or((c=NORMAL_PE)); (* The normal Tsadi is not a good Non-Final letter due to words like *) (* 'lechotet' (to chat) containing an apostrophe after the tsadi. This *) (* apostrophe is converted to a space in FilterWithoutEnglishLetters causing *) (* the Non-Final tsadi to appear at an end of a word even though this is not *) (* the case in the original text.*) (* The letters Pe and Kaf rarely display a related behavior of not being a *) (* good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' for *) (* example legally end with a Non-Final Pe or Kaf. However, the benefit of *) (* these letters as Non-Final letters outweighs the damage since these words *) (* are quite rare.*) end; procedure TnsHebrewProber.Reset; begin mFinalCharLogicalScore := 0; mFinalCharVisualScore := 0; mPrev := ' '; mBeforePrev := ' '; (* mPrev and mBeforePrev are initialized to space in order to simulate a word *) (* delimiter at the beginning of the data*) end; procedure TnsHebrewProber.SetModelProbers(logicalPrb, visualPrb: TCustomDetector); begin mLogicalProb := logicalPrb; mVisualProb := visualPrb; end; (** * ** General ideas of the Hebrew charset recognition ** * * Four main charsets exist in Hebrew: * "ISO-8859-8" - Visual Hebrew * "windows-1255" - Logical Hebrew * "ISO-8859-8-I" - Logical Hebrew * "x-mac-hebrew" - ?? Logical Hebrew ?? * * Both "ISO" charsets use a completely identical set of code points, whereas * "windows-1255" and "x-mac-hebrew" are two different proper supersets of * these code points. windows-1255 defines additional characters in the range * 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific * diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. * x-mac-hebrew defines similar additional code points but with a different * mapping. * * As as an average Hebrew text with no diacritics is concerned, all four * charsets are identical with respect to code points. Meaning that for the * main Hebrew alphabet, all four map the same values to all 27 Hebrew letters * (including final letters). * * The dominant difference between these charsets is their directionality. * "Visual" directionality means that the text is ordered as if the renderer is * not aware of a BIDI rendering algorithm. The renderer sees the text and * draws it from left to right. The text itself when ordered naturally is read * backwards. A buffer of Visual Hebrew generally looks like so: * "[last word of first line spelled backwards] [whole line ordered backwards * and spelled backwards] [first word of first line spelled backwards] * [end of line] [last word of second line] ... etc' " * adding punctuation marks, numbers and English text to visual text is * naturally also "visual" and from left to right. * * "Logical" directionality means the text is ordered "naturally" according to * the order it is read. It is the responsibility of the renderer to display * the text from right to left. A BIDI algorithm is used to place general * punctuation marks, numbers and English text in the text. * * Texts in x-mac-hebrew are almost impossible to find on the Internet. From * what little evidence I could find, it seems that its general directionality * is Logical. * * To sum up all of the above, the Hebrew probing mechanism knows about two * charsets: * Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are * backwards while line order is natural. For charset recognition purposes * the line order is unimportant (In fact, for this implementation, even * word order is unimportant). * Logical Hebrew - "windows-1255" - normal, naturally ordered text. * * "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be * specifically identified. * "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew * that contain special punctuation marks or diacritics is displayed with * some unconverted characters showing as question marks. This problem might * be corrected using another model prober for x-mac-hebrew. Due to the fact * that x-mac-hebrew texts are so rare, writing another model prober isn't * worth the effort and performance hit. * * *** The Prober *** * * The prober is divided between two nsSBCharSetProbers and an nsHebrewProber, * all of which are managed, created, fed data, inquired and deleted by the * nsSBCSGroupProber. The two nsSBCharSetProbers identify that the text is in * fact some kind of Hebrew, Logical or Visual. The final decision about which * one is it is made by the nsHebrewProber by combining final-letter scores * with the scores of the two nsSBCharSetProbers to produce a final answer. * * The nsSBCSGroupProber is responsible for stripping the original text of HTML * tags, English characters, numbers, low-ASCII punctuation characters, spaces * and new lines. It reduces any sequence of such characters to a single space. * The buffer fed to each prober in the SBCS group prober is pure text in * high-ASCII. * The two nsSBCharSetProbers (model probers) share the same language model: * Win1255Model. * The first nsSBCharSetProber uses the model normally as any other * nsSBCharSetProber does, to recognize windows-1255, upon which this model was * built. The second nsSBCharSetProber is told to make the pair-of-letter * lookup in the language model backwards. This in practice exactly simulates * a visual Hebrew model using the windows-1255 logical Hebrew model. * * The nsHebrewProber is not using any language model. All it does is look for * final-letter evidence suggesting the text is either logical Hebrew or visual * Hebrew. Disjointed from the model probers, the results of the nsHebrewProber * alone are meaningless. nsHebrewProber always returns 0.00 as confidence * since it never identifies a charset by itself. Instead, the pointer to the * nsHebrewProber is passed to the model probers as a helper "Name Prober". * When the Group prober receives a positive identification from any prober, * it asks for the name of the charset identified. If the prober queried is a * Hebrew model prober, the model prober forwards the call to the * nsHebrewProber to make the final decision. In the nsHebrewProber, the * decision is made according to the final-letters scores maintained and Both * model probers scores. The answer is returned in the form of the name of the * charset identified, either "windows-1255" or "ISO-8859-8". * *) end. doublecmd-0.5.8/components/chsdet/src/nsEscCharsetProber.pas0000644000175000017500000000444712014201074023200 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: nsEscCharsetProber.pas,v 1.3 2007/05/26 13:09:38 ya_nick Exp $ unit nsEscCharsetProber; interface uses nsCore, MultiModelProber; type TnsEscCharSetProber = class (TMultiModelProber) public constructor Create; override; function GetConfidence: float; override; end; implementation uses nsCodingStateMachine, CustomDetector; {$I '.\mbclass\ISO2022KRLangModel.inc'} {$I '.\mbclass\ISO2022JPLangModel.inc'} {$I '.\mbclass\ISO2022CNLangModel.inc'} {$I '.\mbclass\HZLangModel.inc'} { TnsEscCharSetProber } const NUM_OF_ESC_CHARSETS = 4; constructor TnsEscCharSetProber.Create; begin inherited; AddCharsetModel(HZSMModel); AddCharsetModel(ISO2022CNSMModel); AddCharsetModel(ISO2022JPSMModel); AddCharsetModel(ISO2022KRSMModel); Reset; end; function TnsEscCharSetProber.GetConfidence: float; begin case mState of psFoundIt: Result := SURE_YES; psNotMe: Result := SURE_NO; psDetecting: Result := (SURE_YES + SURE_NO) / 2; else Result := 1.1 * SURE_NO; end; end; end. doublecmd-0.5.8/components/chsdet/src/EUCTWFreq.pas0000644000175000017500000010627212014201074021145 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: EUCTWFreq.pas,v 1.2 2007/05/20 15:46:04 ya_nick Exp $ unit EUCTWFreq; // EUCTW frequency table // Converted from big5 work // by Taiwan's Mandarin Promotion Council // (****************************************************************************** * 128 --> 0.42261 * 256 --> 0.57851 * 512 --> 0.74851 * 1024 --> 0.89384 * 2048 --> 0.97583 * * Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 * Random Distribution Ration = 512/(5401-512)=0.105 * * Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR *****************************************************************************) interface uses nsCore; const EUCTW_TYPICAL_DISTRIBUTION_RATIO: float = 0.75; //Char to FreqOrder table , EUCTW_TABLE_SIZE = 8102-2742+16; EUCTWCharToFreqOrder: array [0..EUCTW_TABLE_SIZE-1] of PRInt16 = ( 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, // 2742 3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, // 2758 1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, // 2774 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, // 2790 3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, // 2806 4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, // 2822 7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, // 2838 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, // 2854 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, // 2870 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, // 2886 2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, // 2902 1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, // 2918 3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, // 2934 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, // 2950 1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, // 2966 3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, // 2982 2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, // 2998 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, // 3014 3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, // 3030 1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, // 3046 7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, // 3062 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, // 3078 7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, // 3094 1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, // 3110 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, // 3126 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, // 3142 3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, // 3158 3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, // 3174 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, // 3190 2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, // 3206 2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, // 3222 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, // 3238 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, // 3254 3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, // 3270 1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, // 3286 1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, // 3302 1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, // 3318 2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, // 3334 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, // 3350 4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, // 3366 1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, // 3382 7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, // 3398 2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, // 3414 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, // 3430 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, // 3446 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, // 3462 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, // 3478 7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, // 3494 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, // 3510 1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, // 3526 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, // 3542 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, // 3558 7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, // 3574 1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, // 3590 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, // 3606 3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, // 3622 4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, // 3638 3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, // 3654 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, // 3670 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, // 3686 1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, // 3702 4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, // 3718 3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, // 3734 3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, // 3750 2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, // 3766 7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, // 3782 3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, // 3798 7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, // 3814 1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, // 3830 2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, // 3846 1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, // 3862 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, // 3878 1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, // 3894 4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, // 3910 3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, // 3926 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, // 3942 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, // 3958 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, // 3974 2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, // 3990 7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, // 4006 1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, // 4022 2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, // 4038 1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, // 4054 1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, // 4070 7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, // 4086 7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, // 4102 7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, // 4118 3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, // 4134 4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, // 4150 1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, // 4166 7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, // 4182 2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, // 4198 7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, // 4214 3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, // 4230 3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, // 4246 7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, // 4262 2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, // 4278 7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, // 4294 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, // 4310 4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, // 4326 2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, // 4342 7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, // 4358 3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, // 4374 2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, // 4390 2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, // 4406 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, // 4422 2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, // 4438 1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, // 4454 1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, // 4470 2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, // 4486 1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, // 4502 7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, // 4518 7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, // 4534 2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, // 4550 4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, // 4566 1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, // 4582 7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, // 4598 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, // 4614 4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, // 4630 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, // 4646 2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, // 4662 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, // 4678 1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, // 4694 1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, // 4710 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, // 4726 3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, // 4742 3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, // 4758 1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, // 4774 3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, // 4790 7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, // 4806 7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, // 4822 1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, // 4838 2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, // 4854 1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, // 4870 3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, // 4886 2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, // 4902 3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, // 4918 2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, // 4934 4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, // 4950 4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, // 4966 3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, // 4982 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, // 4998 3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, // 5014 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, // 5030 3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, // 5046 3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, // 5062 3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, // 5078 1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, // 5094 7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, // 5110 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, // 5126 7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, // 5142 1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, // 5158 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, // 5174 4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, // 5190 3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, // 5206 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, // 5222 2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, // 5238 2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, // 5254 3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, // 5270 1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, // 5286 4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, // 5302 2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, // 5318 1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, // 5334 1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, // 5350 2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, // 5366 3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, // 5382 1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, // 5398 7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, // 5414 1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, // 5430 4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, // 5446 1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, // 5462 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, // 5478 1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, // 5494 3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, // 5510 3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, // 5526 2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, // 5542 1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, // 5558 4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, // 5574 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, // 5590 7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, // 5606 2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, // 5622 3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, // 5638 4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, // 5654 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, // 5670 7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, // 5686 7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, // 5702 1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, // 5718 4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, // 5734 3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, // 5750 2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, // 5766 3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, // 5782 3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, // 5798 2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, // 5814 1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, // 5830 4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, // 5846 3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, // 5862 3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, // 5878 2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, // 5894 4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, // 5910 7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, // 5926 3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, // 5942 2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, // 5958 3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, // 5974 1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, // 5990 2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, // 6006 3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, // 6022 4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, // 6038 2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, // 6054 2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, // 6070 7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, // 6086 1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, // 6102 2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, // 6118 1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, // 6134 3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, // 6150 4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, // 6166 2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, // 6182 3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, // 6198 3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, // 6214 2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, // 6230 4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, // 6246 2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, // 6262 3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, // 6278 4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, // 6294 7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, // 6310 3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, // 6326 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, // 6342 1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, // 6358 4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, // 6374 1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, // 6390 4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, // 6406 7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, // 6422 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, // 6438 7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, // 6454 2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, // 6470 1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, // 6486 1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, // 6502 3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, // 6518 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, // 6534 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, // 6550 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, // 6566 3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, // 6582 2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, // 6598 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, // 6614 7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, // 6630 1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, // 6646 3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, // 6662 7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, // 6678 1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, // 6694 7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, // 6710 4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, // 6726 1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, // 6742 2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, // 6758 2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, // 6774 4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, // 6790 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, // 6806 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, // 6822 3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, // 6838 3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, // 6854 1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, // 6870 2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, // 6886 7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, // 6902 1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, // 6918 1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, // 6934 3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, // 6950 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, // 6966 1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, // 6982 4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, // 6998 7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, // 7014 2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, // 7030 3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, // 7046 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, // 7062 1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, // 7078 2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, // 7094 2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, // 7110 7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, // 7126 7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, // 7142 7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, // 7158 2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, // 7174 2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, // 7190 1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, // 7206 4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, // 7222 3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, // 7238 3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, // 7254 4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, // 7270 4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, // 7286 2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, // 7302 2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, // 7318 7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, // 7334 4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, // 7350 7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, // 7366 2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, // 7382 1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, // 7398 3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, // 7414 4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, // 7430 2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, // 7446 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, // 7462 2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, // 7478 1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, // 7494 2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, // 7510 2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, // 7526 4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, // 7542 7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, // 7558 1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, // 7574 3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, // 7590 7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, // 7606 1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, // 7622 8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, // 7638 2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, // 7654 8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, // 7670 2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, // 7686 2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, // 7702 8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, // 7718 8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, // 7734 8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, // 7750 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, // 7766 8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, // 7782 4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, // 7798 3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, // 7814 8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, // 7830 1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, // 7846 8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, // 7862 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, // 7878 1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, // 7894 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, // 7910 4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, // 7926 1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, // 7942 4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, // 7958 1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, // 7974 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, // 7990 3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, // 8006 4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, // 8022 8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, // 8038 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, // 8054 3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, // 8070 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, // 8086 2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118 // 8102 (*************************************************************************************** *Everything below is of no interest for detection purpose * *************************************************************************************** 2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, // 8118 2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, // 8134 8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, // 8150 8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, // 8166 8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, // 8182 8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, // 8198 8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, // 8214 8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, // 8230 8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, // 8246 8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, // 8262 8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, // 8278 8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, // 8294 8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, // 8310 8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, // 8326 8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, // 8342 8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, // 8358 8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, // 8374 8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, // 8390 8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, // 8406 8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, // 8422 8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, // 8438 8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, // 8454 8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, // 8470 8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, // 8486 8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, // 8502 8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, // 8518 8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, // 8534 8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, // 8550 8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, // 8566 8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, // 8582 8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, // 8598 8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, // 8614 8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, // 8630 8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, // 8646 8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, // 8662 8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, // 8678 8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, // 8694 8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, // 8710 8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, // 8726 8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741, // 8742 //13973 ****************************************************************************************) ); implementation end. doublecmd-0.5.8/components/chsdet/src/chsdet.dpr0000644000175000017500000000303312014201074020703 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: chsdet.dpr,v 1.3 2007/05/26 13:07:21 ya_nick Exp $ library chsdet; uses chsdIntf in 'chsdIntf.pas'; exports csd_Reset, csd_HandleData, csd_Done, csd_DataEnd, csd_GetDetectedCharset, csd_GetKnownCharsets, csd_GetAbout; {$R *.res} begin end. doublecmd-0.5.8/components/chsdet/src/mbclass/0000755000175000017500000000000012257501472020365 5ustar alexxalexxdoublecmd-0.5.8/components/chsdet/src/mbclass/HZLangModel.inc0000644000175000017500000000367012014201074023154 0ustar alexxalexxconst HZCharLenTable: array [0..5] of PRUint32 = (0, 0, 0, 0, 0, 0); HZ_cls: array [0..255] of Byte = ( 1,0,0,0,0,0,0,0, // 00 - 07 0,0,0,0,0,0,0,0, // 08 - 0f 0,0,0,0,0,0,0,0, // 10 - 17 0,0,0,1,0,0,0,0, // 18 - 1f 0,0,0,0,0,0,0,0, // 20 - 27 0,0,0,0,0,0,0,0, // 28 - 2f 0,0,0,0,0,0,0,0, // 30 - 37 0,0,0,0,0,0,0,0, // 38 - 3f 0,0,0,0,0,0,0,0, // 40 - 47 0,0,0,0,0,0,0,0, // 48 - 4f 0,0,0,0,0,0,0,0, // 50 - 57 0,0,0,0,0,0,0,0, // 58 - 5f 0,0,0,0,0,0,0,0, // 60 - 67 0,0,0,0,0,0,0,0, // 68 - 6f 0,0,0,0,0,0,0,0, // 70 - 77 0,0,0,4,0,5,2,0, // 78 - 7f 1,1,1,1,1,1,1,1, // 80 - 87 1,1,1,1,1,1,1,1, // 88 - 8f 1,1,1,1,1,1,1,1, // 90 - 97 1,1,1,1,1,1,1,1, // 98 - 9f 1,1,1,1,1,1,1,1, // a0 - a7 1,1,1,1,1,1,1,1, // a8 - af 1,1,1,1,1,1,1,1, // b0 - b7 1,1,1,1,1,1,1,1, // b8 - bf 1,1,1,1,1,1,1,1, // c0 - c7 1,1,1,1,1,1,1,1, // c8 - cf 1,1,1,1,1,1,1,1, // d0 - d7 1,1,1,1,1,1,1,1, // d8 - df 1,1,1,1,1,1,1,1, // e0 - e7 1,1,1,1,1,1,1,1, // e8 - ef 1,1,1,1,1,1,1,1, // f0 - f7 1,1,1,1,1,1,1,1 // f8 - ff ); HZ_st: array [0..47] of Byte = ( Byte(eStart),Byte(eError), 3,Byte(eStart),Byte(eStart),Byte(eStart),Byte(eError),Byte(eError),//00-07 Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),//08-0f Byte(eItsMe),Byte(eItsMe),Byte(eError),Byte(eError),Byte(eStart),Byte(eStart), 4,Byte(eError),//10-17 5,Byte(eError), 6,Byte(eError), 5, 5, 4,Byte(eError),//18-1f 4,Byte(eError), 4, 4, 4,Byte(eError), 4,Byte(eError),//20-27 4,Byte(eItsMe),Byte(eStart),Byte(eStart),Byte(eStart),Byte(eStart),Byte(eStart),Byte(eStart)//28-2f ); HZSMModel: SMModel = ( classTable: @HZ_cls; classFactor: 6; stateTable: @HZ_st; charLenTable: @HZCharLenTable; CharsetID: HZ_GB_2312_CHARSET; );doublecmd-0.5.8/components/chsdet/src/mbclass/EUCKRLangModel.inc0000644000175000017500000000402612014201074023500 0ustar alexxalexxconst EUCKRCharLenTable: array [0..3] of byte = (0, 1, 2, 0); //PCK4BITS(0,1,1,1,1,1,1,1, // 00 - 07 EUCKR_cls: array [0..255] of byte = ( 1,1,1,1,1,1,1,1, // 00 - 07 1,1,1,1,1,1,0,0, // 08 - 0f 1,1,1,1,1,1,1,1, // 10 - 17 1,1,1,0,1,1,1,1, // 18 - 1f 1,1,1,1,1,1,1,1, // 20 - 27 1,1,1,1,1,1,1,1, // 28 - 2f 1,1,1,1,1,1,1,1, // 30 - 37 1,1,1,1,1,1,1,1, // 38 - 3f 1,1,1,1,1,1,1,1, // 40 - 47 1,1,1,1,1,1,1,1, // 48 - 4f 1,1,1,1,1,1,1,1, // 50 - 57 1,1,1,1,1,1,1,1, // 58 - 5f 1,1,1,1,1,1,1,1, // 60 - 67 1,1,1,1,1,1,1,1, // 68 - 6f 1,1,1,1,1,1,1,1, // 70 - 77 1,1,1,1,1,1,1,1, // 78 - 7f 0,0,0,0,0,0,0,0, // 80 - 87 0,0,0,0,0,0,0,0, // 88 - 8f 0,0,0,0,0,0,0,0, // 90 - 97 0,0,0,0,0,0,0,0, // 98 - 9f 0,2,2,2,2,2,2,2, // a0 - a7 2,2,2,2,2,3,3,3, // a8 - af 2,2,2,2,2,2,2,2, // b0 - b7 2,2,2,2,2,2,2,2, // b8 - bf 2,2,2,2,2,2,2,2, // c0 - c7 2,3,2,2,2,2,2,2, // c8 - cf 2,2,2,2,2,2,2,2, // d0 - d7 2,2,2,2,2,2,2,2, // d8 - df 2,2,2,2,2,2,2,2, // e0 - e7 2,2,2,2,2,2,2,2, // e8 - ef 2,2,2,2,2,2,2,2, // f0 - f7 2,2,2,2,2,2,2,0 // f8 - ff ); EUCKR_st: array [0..15] of byte = ( byte(eError),byte(eStart), 3,byte(eError),byte(eError),byte(eError),byte(eError),byte(eError), //00-07 byte(eItsMe),byte(eItsMe),byte(eItsMe),byte(eItsMe),byte(eError),byte(eError),byte(eStart),byte(eStart) //08-0f ); EUCKRLangModel: SMModel =( classTable: @EUCKR_cls; classFactor: 4; stateTable: @EUCKR_st; charLenTable: @EUCKRCharLenTable; CharsetID: EUC_KR_CHARSET; ); // EUCKRLangModel: SMModel =( // classTable: ( // idxsft: eIdxSft4bits; // sftmsk: eSftMsk4bits; // bitsft: eBitSft4bits; // unitmsk: eUnitMsk4bits; // data: @EUCKR_cls; // ); // classFactor: 4; // stateTable: ( // idxsft: eIdxSft4bits; // sftmsk: eSftMsk4bits; // bitsft: eBitSft4bits; // unitmsk: eUnitMsk4bits; // data: @EUCKR_st; // ); // charLenTable: @EUCKRCharLenTable; // CharsetID: EUC_KR_CHARSET; // ); doublecmd-0.5.8/components/chsdet/src/mbclass/SJISLangModel.inc0000644000175000017500000000443412014201074023402 0ustar alexxalexxconst SJIS_cls: array [0..255] of byte = ( 1,1,1,1,1,1,1,1, // 00 - 07 1,1,1,1,1,1,0,0, // 08 - 0f 1,1,1,1,1,1,1,1, // 10 - 17 1,1,1,0,1,1,1,1, // 18 - 1f 1,1,1,1,1,1,1,1, // 20 - 27 1,1,1,1,1,1,1,1, // 28 - 2f 1,1,1,1,1,1,1,1, // 30 - 37 1,1,1,1,1,1,1,1, // 38 - 3f 2,2,2,2,2,2,2,2, // 40 - 47 2,2,2,2,2,2,2,2, // 48 - 4f 2,2,2,2,2,2,2,2, // 50 - 57 2,2,2,2,2,2,2,2, // 58 - 5f 2,2,2,2,2,2,2,2, // 60 - 67 2,2,2,2,2,2,2,2, // 68 - 6f 2,2,2,2,2,2,2,2, // 70 - 77 2,2,2,2,2,2,2,1, // 78 - 7f 3,3,3,3,3,3,3,3, // 80 - 87 3,3,3,3,3,3,3,3, // 88 - 8f 3,3,3,3,3,3,3,3, // 90 - 97 3,3,3,3,3,3,3,3, // 98 - 9f //0xa0 is illegal in sjis encoding, but some pages does //contain such byte. We need to be more error forgiven. 2,2,2,2,2,2,2,2, // a0 - a7 2,2,2,2,2,2,2,2, // a8 - af 2,2,2,2,2,2,2,2, // b0 - b7 2,2,2,2,2,2,2,2, // b8 - bf 2,2,2,2,2,2,2,2, // c0 - c7 2,2,2,2,2,2,2,2, // c8 - cf 2,2,2,2,2,2,2,2, // d0 - d7 2,2,2,2,2,2,2,2, // d8 - df 3,3,3,3,3,3,3,3, // e0 - e7 3,3,3,3,3,4,4,4, // e8 - ef 4,4,4,4,4,4,4,4, // f0 - f7 4,4,4,4,4,0,0,0 // f8 - ff ); SJIS_st: array [0..23] of byte = ( byte(eError),byte(eStart),byte(eStart), 3,byte(eError),byte(eError),byte(eError),byte(eError),//00-07 byte(eError),byte(eError),byte(eError),byte(eError),byte(eItsMe),byte(eItsMe),byte(eItsMe),byte(eItsMe),//08-0f byte(eItsMe),byte(eItsMe),byte(eError),byte(eError),byte(eStart),byte(eStart),byte(eStart),byte(eStart) //10-17 ); SJISCharLenTable: array [0..5] of byte = (0, 1, 1, 2, 0, 0); SJISLangModel: SMModel = ( classTable: @SJIS_cls; classFactor: 6; stateTable: @SJIS_st; charLenTable: @SJISCharLenTable; CharsetID: SHIFT_JIS_CHARSET; ); // SJISLangModel: SMModel = ( // classTable: ( // idxsft: eIdxSft4bits; // sftmsk: eSftMsk4bits; // bitsft: eBitSft4bits; // unitmsk: eUnitMsk4bits; // data: @SJIS_cls; // ); // classFactor: 6; // stateTable: ( // idxsft: eIdxSft4bits; // sftmsk: eSftMsk4bits; // bitsft: eBitSft4bits; // unitmsk: eUnitMsk4bits; // data: @SJIS_st; // ); // charLenTable: @SJISCharLenTable; // CharsetID: SHIFT_JIS_CHARSET; // ); doublecmd-0.5.8/components/chsdet/src/mbclass/UTF8LangModel.inc0000644000175000017500000001015412014201074023354 0ustar alexxalexxconst UTF8_cls: array [0..255] of byte = ( 1,1,1,1,1,1,1,1, // 00 - 07 //allow 0x00 as a legal value 1,1,1,1,1,1,0,0, // 08 - 0f 1,1,1,1,1,1,1,1, // 10 - 17 1,1,1,0,1,1,1,1, // 18 - 1f 1,1,1,1,1,1,1,1, // 20 - 27 1,1,1,1,1,1,1,1, // 28 - 2f 1,1,1,1,1,1,1,1, // 30 - 37 1,1,1,1,1,1,1,1, // 38 - 3f 1,1,1,1,1,1,1,1, // 40 - 47 1,1,1,1,1,1,1,1, // 48 - 4f 1,1,1,1,1,1,1,1, // 50 - 57 1,1,1,1,1,1,1,1, // 58 - 5f 1,1,1,1,1,1,1,1, // 60 - 67 1,1,1,1,1,1,1,1, // 68 - 6f 1,1,1,1,1,1,1,1, // 70 - 77 1,1,1,1,1,1,1,1, // 78 - 7f 2,2,2,2,3,3,3,3, // 80 - 87 4,4,4,4,4,4,4,4, // 88 - 8f 4,4,4,4,4,4,4,4, // 90 - 97 4,4,4,4,4,4,4,4, // 98 - 9f 5,5,5,5,5,5,5,5, // a0 - a7 5,5,5,5,5,5,5,5, // a8 - af 5,5,5,5,5,5,5,5, // b0 - b7 5,5,5,5,5,5,5,5, // b8 - bf 0,0,6,6,6,6,6,6, // c0 - c7 6,6,6,6,6,6,6,6, // c8 - cf 6,6,6,6,6,6,6,6, // d0 - d7 6,6,6,6,6,6,6,6, // d8 - df 7,8,8,8,8,8,8,8, // e0 - e7 8,8,8,8,8,9,8,8, // e8 - ef 10,11,11,11,11,11,11,11, // f0 - f7 12,13,13,13,14,15,0,0 // f8 - ff ); UTF8CharLenTable: array [0..15] of byte = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6 ); UTF8_st: array [0..207] of byte = ( byte(eError),byte(eStart),byte(eError),byte(eError),byte(eError),byte(eError), 12, 10,//00-07 9, 11, 8, 7, 6, 5, 4, 3,//08-0f byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),//10-17 byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),//18-1f byte(eStart),byte(eStart),byte(eStart),byte(eStart),byte(eStart),byte(eStart),byte(eStart),byte(eStart),//20-27 byte(eStart),byte(eStart),byte(eStart),byte(eStart),byte(eStart),byte(eStart),byte(eStart),byte(eStart),//28-2f byte(eError),byte(eError), 5, 5, 5, 5,byte(eError),byte(eError),//30-37 byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),//38-3f byte(eError),byte(eError),byte(eError), 5, 5, 5,byte(eError),byte(eError),//40-47 byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),//48-4f byte(eError),byte(eError), 7, 7, 7, 7,byte(eError),byte(eError),//50-57 byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),//58-5f byte(eError),byte(eError),byte(eError),byte(eError), 7, 7,byte(eError),byte(eError),//60-67 byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),//68-6f byte(eError),byte(eError), 9, 9, 9, 9,byte(eError),byte(eError),//70-77 byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),//78-7f byte(eError),byte(eError),byte(eError),byte(eError),byte(eError), 9,byte(eError),byte(eError),//80-87 byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),//88-8f byte(eError),byte(eError), 12, 12, 12, 12,byte(eError),byte(eError),//90-97 byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),//98-9f byte(eError),byte(eError),byte(eError),byte(eError),byte(eError), 12,byte(eError),byte(eError),//a0-a7 byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),//a8-af byte(eError),byte(eError), 12, 12, 12,byte(eError),byte(eError),byte(eError),//b0-b7 byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),//b8-bf byte(eError),byte(eError),byte(eStart),byte(eStart),byte(eStart),byte(eStart),byte(eError),byte(eError),//c0-c7 byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError) //c8-cf ); UTF8LangModel: SMModel = ( classTable: @UTF8_cls; classFactor: 16; stateTable: @UTF8_st; charLenTable: @UTF8CharLenTable; CharsetID: UTF8_CHARSET; ); doublecmd-0.5.8/components/chsdet/src/mbclass/GB18030LangModel.inc0000644000175000017500000000471012014201074023513 0ustar alexxalexxconst GB18030CharLenTable: array [0..6] of byte = (0, 1, 1, 1, 1, 1, 2); GB18030_cls: array [0..255] of Byte = ( 1,1,1,1,1,1,1,1, // 00 - 07 1,1,1,1,1,1,0,0, // 08 - 0f 1,1,1,1,1,1,1,1, // 10 - 17 1,1,1,0,1,1,1,1, // 18 - 1f 1,1,1,1,1,1,1,1, // 20 - 27 1,1,1,1,1,1,1,1, // 28 - 2f 3,3,3,3,3,3,3,3, // 30 - 37 3,3,1,1,1,1,1,1, // 38 - 3f 2,2,2,2,2,2,2,2, // 40 - 47 2,2,2,2,2,2,2,2, // 48 - 4f 2,2,2,2,2,2,2,2, // 50 - 57 2,2,2,2,2,2,2,2, // 58 - 5f 2,2,2,2,2,2,2,2, // 60 - 67 2,2,2,2,2,2,2,2, // 68 - 6f 2,2,2,2,2,2,2,2, // 70 - 77 2,2,2,2,2,2,2,4, // 78 - 7f 5,6,6,6,6,6,6,6, // 80 - 87 6,6,6,6,6,6,6,6, // 88 - 8f 6,6,6,6,6,6,6,6, // 90 - 97 6,6,6,6,6,6,6,6, // 98 - 9f 6,6,6,6,6,6,6,6, // a0 - a7 6,6,6,6,6,6,6,6, // a8 - af 6,6,6,6,6,6,6,6, // b0 - b7 6,6,6,6,6,6,6,6, // b8 - bf 6,6,6,6,6,6,6,6, // c0 - c7 6,6,6,6,6,6,6,6, // c8 - cf 6,6,6,6,6,6,6,6, // d0 - d7 6,6,6,6,6,6,6,6, // d8 - df 6,6,6,6,6,6,6,6, // e0 - e7 6,6,6,6,6,6,6,6, // e8 - ef 6,6,6,6,6,6,6,6, // f0 - f7 6,6,6,6,6,6,6,0 // f8 - ff ); GB18030_st: array [0..47] of byte = ( byte(eError),byte(eStart),byte(eStart),byte(eStart),byte(eStart),byte(eStart), 3,byte(eError),//00-07 byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eError),byte(eItsMe),byte(eItsMe),//08-0f byte(eItsMe),byte(eItsMe),byte(eItsMe),byte(eItsMe),byte(eItsMe),byte(eError),byte(eError),byte(eStart),//10-17 4,byte(eError),byte(eStart),byte(eStart),byte(eError),byte(eError),byte(eError),byte(eError),//18-1f byte(eError),byte(eError), 5,byte(eError),byte(eError),byte(eError),byte(eItsMe),byte(eError),//20-27 byte(eError),byte(eError),byte(eStart),byte(eStart),byte(eStart),byte(eStart),byte(eStart),byte(eStart) //28-2f ); GB18030LangModel: SMModel = ( classTable: @GB18030_cls; classFactor: 7; stateTable: @GB18030_st; charLenTable: @GB18030CharLenTable; CharsetID: GB18030_CHARSET; ); // GB18030LangModel: SMModel = ( // classTable: ( // idxsft: eIdxSft4bits; // sftmsk: eSftMsk4bits; // bitsft: eBitSft4bits; // unitmsk: eUnitMsk4bits; // data: @GB18030_cls; // ); // classFactor: 7; // stateTable: ( // idxsft: eIdxSft4bits; // sftmsk: eSftMsk4bits; // bitsft: eBitSft4bits; // unitmsk: eUnitMsk4bits; // data: @GB18030_st; // ); // charLenTable: @GB18030CharLenTable; // CharsetID: GB18030_CHARSET; // ); doublecmd-0.5.8/components/chsdet/src/mbclass/UCS2BELangModel.inc0000644000175000017500000000410712014201074023552 0ustar alexxalexxconst UCS2BECharLenTable: array [0..5] of Byte = (2, 2, 2, 2, 2, 2); UCS2BE_cls: array [Char] of Byte = ( 0,0,0,0,0,0,0,0, // 00 - 07 //allow 0x00 as a legal value 0,0,1,0,0,2,0,0, // 08 - 0f 0,0,0,0,0,0,0,0, // 10 - 17 0,0,0,3,0,0,0,0, // 18 - 1f 0,0,0,0,0,0,0,0, // 20 - 27 0,3,3,3,3,3,0,0, // 28 - 2f 0,0,0,0,0,0,0,0, // 30 - 37 0,0,0,0,0,0,0,0, // 38 - 3f 0,0,0,0,0,0,0,0, // 40 - 47 0,0,0,0,0,0,0,0, // 48 - 4f 0,0,0,0,0,0,0,0, // 50 - 57 0,0,0,0,0,0,0,0, // 58 - 5f 0,0,0,0,0,0,0,0, // 60 - 67 0,0,0,0,0,0,0,0, // 68 - 6f 0,0,0,0,0,0,0,0, // 70 - 77 0,0,0,0,0,0,0,0, // 78 - 7f 0,0,0,0,0,0,0,0, // 80 - 87 0,0,0,0,0,0,0,0, // 88 - 8f 0,0,0,0,0,0,0,0, // 90 - 97 0,0,0,0,0,0,0,0, // 98 - 9f 0,0,0,0,0,0,0,0, // a0 - a7 0,0,0,0,0,0,0,0, // a8 - af 0,0,0,0,0,0,0,0, // b0 - b7 0,0,0,0,0,0,0,0, // b8 - bf 0,0,0,0,0,0,0,0, // c0 - c7 0,0,0,0,0,0,0,0, // c8 - cf 0,0,0,0,0,0,0,0, // d0 - d7 0,0,0,0,0,0,0,0, // d8 - df 0,0,0,0,0,0,0,0, // e0 - e7 0,0,0,0,0,0,0,0, // e8 - ef 0,0,0,0,0,0,0,0, // f0 - f7 0,0,0,0,0,0,4,5 // f8 - ff ); UCS2BE_st: array [0..55] of Byte = ( 5, 7, 7,integer(eError), 4, 3,integer(eError),integer(eError),//00-07 integer(eError),integer(eError),integer(eError),integer(eError),integer(eItsMe),integer(eItsMe),integer(eItsMe),integer(eItsMe),//08-0f integer(eItsMe),integer(eItsMe), 6, 6, 6, 6,integer(eError),integer(eError),//10-17 6, 6, 6, 6, 6,integer(eItsMe), 6, 6,//18-1f 6, 6, 6, 6, 5, 7, 7,integer(eError),//20-27 5, 8, 6, 6,integer(eError), 6, 6, 6,//28-2f 6, 6, 6, 6,integer(eError),integer(eError),integer(eStart),integer(eStart) //30-37 ); UCS2BELangModel: SMModel = ( classTable: @UCS2BE_cls; classFactor: 6; stateTable: @UCS2BE_st; charLenTable: @UCS2BECharLenTable; CharsetID: UTF16_BE_CHARSET; );doublecmd-0.5.8/components/chsdet/src/mbclass/Big5LangModel.inc0000644000175000017500000000421712014201074023417 0ustar alexxalexxconst Big5CharLenTable: array [0..4] of Byte = (0, 1, 1, 2, 0); BIG5_cls: array [0..255] of Byte = ( 1,1,1,1,1,1,1,1, // 00 - 07 //allow 0x00 as legal value 1,1,1,1,1,1,0,0, // 08 - 0f 1,1,1,1,1,1,1,1, // 10 - 17 1,1,1,0,1,1,1,1, // 18 - 1f 1,1,1,1,1,1,1,1, // 20 - 27 1,1,1,1,1,1,1,1, // 28 - 2f 1,1,1,1,1,1,1,1, // 30 - 37 1,1,1,1,1,1,1,1, // 38 - 3f 2,2,2,2,2,2,2,2, // 40 - 47 2,2,2,2,2,2,2,2, // 48 - 4f 2,2,2,2,2,2,2,2, // 50 - 57 2,2,2,2,2,2,2,2, // 58 - 5f 2,2,2,2,2,2,2,2, // 60 - 67 2,2,2,2,2,2,2,2, // 68 - 6f 2,2,2,2,2,2,2,2, // 70 - 77 2,2,2,2,2,2,2,1, // 78 - 7f 4,4,4,4,4,4,4,4, // 80 - 87 4,4,4,4,4,4,4,4, // 88 - 8f 4,4,4,4,4,4,4,4, // 90 - 97 4,4,4,4,4,4,4,4, // 98 - 9f 4,3,3,3,3,3,3,3, // a0 - a7 3,3,3,3,3,3,3,3, // a8 - af 3,3,3,3,3,3,3,3, // b0 - b7 3,3,3,3,3,3,3,3, // b8 - bf 3,3,3,3,3,3,3,3, // c0 - c7 3,3,3,3,3,3,3,3, // c8 - cf 3,3,3,3,3,3,3,3, // d0 - d7 3,3,3,3,3,3,3,3, // d8 - df 3,3,3,3,3,3,3,3, // e0 - e7 3,3,3,3,3,3,3,3, // e8 - ef 3,3,3,3,3,3,3,3, // f0 - f7 3,3,3,3,3,3,3,0 // f8 - ff ); BIG5_st: array [0..23] of Byte = ( Byte(eError),Byte(eStart),Byte(eStart), 3,Byte(eError),Byte(eError),Byte(eError),Byte(eError),//00-07 Byte(eError),Byte(eError),Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),Byte(eError),//08-0f Byte(eError),Byte(eStart),Byte(eStart),Byte(eStart),Byte(eStart),Byte(eStart),Byte(eStart),Byte(eStart) //10-17 ); Big5LangModel: SMModel = ( classTable: @BIG5_cls; classFactor: 5; stateTable: @BIG5_st; charLenTable: @Big5CharLenTable; CharsetID: BIG5_CHARSET; ); // Big5LangModel: SMModel = ( // classTable: ( // idxsft: eIdxSft4bits; // sftmsk: eSftMsk4bits; // bitsft: eBitSft4bits; // unitmsk: eUnitMsk4bits; // data: @BIG5_cls; // ); // classFactor: 5; // stateTable: ( // idxsft: eIdxSft4bits; // sftmsk: eSftMsk4bits; // bitsft: eBitSft4bits; // unitmsk: eUnitMsk4bits; // data: @BIG5_st; // ); // charLenTable: @Big5CharLenTable; // CharsetID: BIG5_CHARSET; // ); doublecmd-0.5.8/components/chsdet/src/mbclass/ISO2022KRLangModel.inc0000644000175000017500000000372612014201074024032 0ustar alexxalexxconst ISO2022KRCharLenTable: array [0..5] of PRUint32 = (0, 0, 0, 0, 0, 0); ISO2022KR_cls: array [Char] of Byte = ( 2,0,0,0,0,0,0,0, // 00 - 07 0,0,0,0,0,0,0,0, // 08 - 0f 0,0,0,0,0,0,0,0, // 10 - 17 0,0,0,1,0,0,0,0, // 18 - 1f 0,0,0,0,3,0,0,0, // 20 - 27 0,4,0,0,0,0,0,0, // 28 - 2f 0,0,0,0,0,0,0,0, // 30 - 37 0,0,0,0,0,0,0,0, // 38 - 3f 0,0,0,5,0,0,0,0, // 40 - 47 0,0,0,0,0,0,0,0, // 48 - 4f 0,0,0,0,0,0,0,0, // 50 - 57 0,0,0,0,0,0,0,0, // 58 - 5f 0,0,0,0,0,0,0,0, // 60 - 67 0,0,0,0,0,0,0,0, // 68 - 6f 0,0,0,0,0,0,0,0, // 70 - 77 0,0,0,0,0,0,0,0, // 78 - 7f 2,2,2,2,2,2,2,2, // 80 - 87 2,2,2,2,2,2,2,2, // 88 - 8f 2,2,2,2,2,2,2,2, // 90 - 97 2,2,2,2,2,2,2,2, // 98 - 9f 2,2,2,2,2,2,2,2, // a0 - a7 2,2,2,2,2,2,2,2, // a8 - af 2,2,2,2,2,2,2,2, // b0 - b7 2,2,2,2,2,2,2,2, // b8 - bf 2,2,2,2,2,2,2,2, // c0 - c7 2,2,2,2,2,2,2,2, // c8 - cf 2,2,2,2,2,2,2,2, // d0 - d7 2,2,2,2,2,2,2,2, // d8 - df 2,2,2,2,2,2,2,2, // e0 - e7 2,2,2,2,2,2,2,2, // e8 - ef 2,2,2,2,2,2,2,2, // f0 - f7 2,2,2,2,2,2,2,2 // f8 - ff ); ISO2022KR_st: array [0..39] of Byte = ( Byte(eStart), 3,Byte(eError),Byte(eStart),Byte(eStart),Byte(eStart),Byte(eError),Byte(eError),//00-07 Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),//08-0f Byte(eItsMe),Byte(eItsMe),Byte(eError),Byte(eError),Byte(eError), 4,Byte(eError),Byte(eError),//10-17 Byte(eError),Byte(eError),Byte(eError),Byte(eError), 5,Byte(eError),Byte(eError),Byte(eError),//18-1f Byte(eError),Byte(eError),Byte(eError),Byte(eItsMe),Byte(eStart),Byte(eStart),Byte(eStart),Byte(eStart) //20-27 ); ISO2022KRSMModel: SMModel = ( classTable: @ISO2022KR_cls; classFactor: 6; stateTable: @ISO2022KR_st; charLenTable: @ISO2022KRCharLenTable; CharsetID: ISO_2022_KR_CHARSET; ); doublecmd-0.5.8/components/chsdet/src/mbclass/EUCTWLangModel.inc0000644000175000017500000000473512014201074023525 0ustar alexxalexxconst EUCTWCharLenTable: array [0..6] of Byte = (0, 0, 1, 2, 2, 2, 3); //PCK4BITS(0,2,2,2,2,2,2,2, // 00 - 07 EUCTW_cls: array [0..255] of Byte = ( 2,2,2,2,2,2,2,2, // 00 - 07 2,2,2,2,2,2,0,0, // 08 - 0f 2,2,2,2,2,2,2,2, // 10 - 17 2,2,2,0,2,2,2,2, // 18 - 1f 2,2,2,2,2,2,2,2, // 20 - 27 2,2,2,2,2,2,2,2, // 28 - 2f 2,2,2,2,2,2,2,2, // 30 - 37 2,2,2,2,2,2,2,2, // 38 - 3f 2,2,2,2,2,2,2,2, // 40 - 47 2,2,2,2,2,2,2,2, // 48 - 4f 2,2,2,2,2,2,2,2, // 50 - 57 2,2,2,2,2,2,2,2, // 58 - 5f 2,2,2,2,2,2,2,2, // 60 - 67 2,2,2,2,2,2,2,2, // 68 - 6f 2,2,2,2,2,2,2,2, // 70 - 77 2,2,2,2,2,2,2,2, // 78 - 7f 0,0,0,0,0,0,0,0, // 80 - 87 0,0,0,0,0,0,6,0, // 88 - 8f 0,0,0,0,0,0,0,0, // 90 - 97 0,0,0,0,0,0,0,0, // 98 - 9f 0,3,4,4,4,4,4,4, // a0 - a7 5,5,1,1,1,1,1,1, // a8 - af 1,1,1,1,1,1,1,1, // b0 - b7 1,1,1,1,1,1,1,1, // b8 - bf 1,1,3,1,3,3,3,3, // c0 - c7 3,3,3,3,3,3,3,3, // c8 - cf 3,3,3,3,3,3,3,3, // d0 - d7 3,3,3,3,3,3,3,3, // d8 - df 3,3,3,3,3,3,3,3, // e0 - e7 3,3,3,3,3,3,3,3, // e8 - ef 3,3,3,3,3,3,3,3, // f0 - f7 3,3,3,3,3,3,3,0 // f8 - ff ); EUCTW_st: array [0..47] of Byte = ( Byte(eError),Byte(eError),Byte(eStart), 3, 3, 3, 4,Byte(eError),//00-07 Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eItsMe),Byte(eItsMe),//08-0f Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),Byte(eError),Byte(eStart),Byte(eError),//10-17 Byte(eStart),Byte(eStart),Byte(eStart),Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eError),//18-1f 5,Byte(eError),Byte(eError),Byte(eError),Byte(eStart),Byte(eError),Byte(eStart),Byte(eStart),//20-27 Byte(eStart),Byte(eError),Byte(eStart),Byte(eStart),Byte(eStart),Byte(eStart),Byte(eStart),Byte(eStart) //28-2f ); EUCTWLangModel: SMModel = ( classTable: @EUCTW_cls; classFactor: 7; stateTable: @EUCTW_st; charLenTable: @EUCTWCharLenTable; CharsetID: X_EUC_TW_CHARSET; ); // EUCTWLangModel: SMModel = ( // classTable: ( // idxsft: eIdxSft4bits; // sftmsk: eSftMsk4bits; // bitsft: eBitSft4bits; // unitmsk: eUnitMsk4bits; // data: @EUCTW_cls; // ); // classFactor: 7; // stateTable: ( // idxsft: eIdxSft4bits; // sftmsk: eSftMsk4bits; // bitsft: eBitSft4bits; // unitmsk: eUnitMsk4bits; // data: @EUCTW_st; // ); // charLenTable: @EUCTWCharLenTable; // CharsetID: X_EUC_TW_CHARSET; // ); doublecmd-0.5.8/components/chsdet/src/mbclass/ISO2022JPLangModel.inc0000644000175000017500000000464312014201074024026 0ustar alexxalexxconst ISO2022JPCharLenTable: array [0..7] of PRUint32 = (0, 0, 0, 0, 0, 0, 0, 0); ISO2022JP_cls: array [Char] of Byte = ( 2,0,0,0,0,0,0,0, // 00 - 07 0,0,0,0,0,0,2,2, // 08 - 0f 0,0,0,0,0,0,0,0, // 10 - 17 0,0,0,1,0,0,0,0, // 18 - 1f 0,0,0,0,7,0,0,0, // 20 - 27 3,0,0,0,0,0,0,0, // 28 - 2f 0,0,0,0,0,0,0,0, // 30 - 37 0,0,0,0,0,0,0,0, // 38 - 3f 6,0,4,0,8,0,0,0, // 40 - 47 0,9,5,0,0,0,0,0, // 48 - 4f 0,0,0,0,0,0,0,0, // 50 - 57 0,0,0,0,0,0,0,0, // 58 - 5f 0,0,0,0,0,0,0,0, // 60 - 67 0,0,0,0,0,0,0,0, // 68 - 6f 0,0,0,0,0,0,0,0, // 70 - 77 0,0,0,0,0,0,0,0, // 78 - 7f 2,2,2,2,2,2,2,2, // 80 - 87 2,2,2,2,2,2,2,2, // 88 - 8f 2,2,2,2,2,2,2,2, // 90 - 97 2,2,2,2,2,2,2,2, // 98 - 9f 2,2,2,2,2,2,2,2, // a0 - a7 2,2,2,2,2,2,2,2, // a8 - af 2,2,2,2,2,2,2,2, // b0 - b7 2,2,2,2,2,2,2,2, // b8 - bf 2,2,2,2,2,2,2,2, // c0 - c7 2,2,2,2,2,2,2,2, // c8 - cf 2,2,2,2,2,2,2,2, // d0 - d7 2,2,2,2,2,2,2,2, // d8 - df 2,2,2,2,2,2,2,2, // e0 - e7 2,2,2,2,2,2,2,2, // e8 - ef 2,2,2,2,2,2,2,2, // f0 - f7 2,2,2,2,2,2,2,2 // f8 - ff ); ISO2022JP_st: array [0..71] of Byte = ( Byte(eStart), 3,Byte(eError),Byte(eStart),Byte(eStart),Byte(eStart),Byte(eStart),Byte(eStart),//00-07 Byte(eStart),Byte(eStart),Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eError),//08-0f Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),//10-17 Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),Byte(eError),Byte(eError),//18-1f Byte(eError), 5,Byte(eError),Byte(eError),Byte(eError), 4,Byte(eError),Byte(eError),//20-27 Byte(eError),Byte(eError),Byte(eError), 6,Byte(eItsMe),Byte(eError),Byte(eItsMe),Byte(eError),//28-2f Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eItsMe),Byte(eItsMe),//30-37 Byte(eError),Byte(eError),Byte(eError),Byte(eItsMe),Byte(eError),Byte(eError),Byte(eError),Byte(eError),//38-3f Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eItsMe),Byte(eError),Byte(eStart),Byte(eStart)//40-47 ); ISO2022JPSMModel: SMModel = ( classTable: @ISO2022JP_cls; classFactor: 10; stateTable: @ISO2022JP_st; charLenTable: @ISO2022JPCharLenTable; CharsetID: ISO_2022_JP_CHARSET; ); doublecmd-0.5.8/components/chsdet/src/mbclass/UCS2LELangModel.inc0000644000175000017500000000402412014201074023562 0ustar alexxalexxconst UCS2LECharLenTable: array [0..5] of PRUint32 = (2, 2, 2, 2, 2, 2); UCS2LE_cls: array [Char] of Byte = ( 0,0,0,0,0,0,0,0, // 00 - 07 //allow 0x00 as a legal value 0,0,1,0,0,2,0,0, // 08 - 0f 0,0,0,0,0,0,0,0, // 10 - 17 0,0,0,3,0,0,0,0, // 18 - 1f 0,0,0,0,0,0,0,0, // 20 - 27 0,3,3,3,3,3,0,0, // 28 - 2f 0,0,0,0,0,0,0,0, // 30 - 37 0,0,0,0,0,0,0,0, // 38 - 3f 0,0,0,0,0,0,0,0, // 40 - 47 0,0,0,0,0,0,0,0, // 48 - 4f 0,0,0,0,0,0,0,0, // 50 - 57 0,0,0,0,0,0,0,0, // 58 - 5f 0,0,0,0,0,0,0,0, // 60 - 67 0,0,0,0,0,0,0,0, // 68 - 6f 0,0,0,0,0,0,0,0, // 70 - 77 0,0,0,0,0,0,0,0, // 78 - 7f 0,0,0,0,0,0,0,0, // 80 - 87 0,0,0,0,0,0,0,0, // 88 - 8f 0,0,0,0,0,0,0,0, // 90 - 97 0,0,0,0,0,0,0,0, // 98 - 9f 0,0,0,0,0,0,0,0, // a0 - a7 0,0,0,0,0,0,0,0, // a8 - af 0,0,0,0,0,0,0,0, // b0 - b7 0,0,0,0,0,0,0,0, // b8 - bf 0,0,0,0,0,0,0,0, // c0 - c7 0,0,0,0,0,0,0,0, // c8 - cf 0,0,0,0,0,0,0,0, // d0 - d7 0,0,0,0,0,0,0,0, // d8 - df 0,0,0,0,0,0,0,0, // e0 - e7 0,0,0,0,0,0,0,0, // e8 - ef 0,0,0,0,0,0,0,0, // f0 - f7 0,0,0,0,0,0,4,5 // f8 - ff ); UCS2LE_st: array [0..55] of Byte = ( 6, 6, 7, 6, 4, 3,integer(eError),integer(eError),//00-07 integer(eError),integer(eError),integer(eError),integer(eError),integer(eItsMe),integer(eItsMe),integer(eItsMe),integer(eItsMe),//08-0f integer(eItsMe),integer(eItsMe), 5, 5, 5,integer(eError),integer(eItsMe),integer(eError),//10-17 5, 5, 5,integer(eError), 5,integer(eError), 6, 6,//18-1f 7, 6, 8, 8, 5, 5, 5,integer(eError),//20-27 5, 5, 5,integer(eError),integer(eError),integer(eError), 5, 5,//28-2f 5, 5, 5,integer(eError), 5,integer(eError),integer(eStart),integer(eStart) //30-37 ); UCS2LELangModel: SMModel = ( classTable: @UCS2LE_cls; classFactor: 6; stateTable: @UCS2LE_st; charLenTable: @UCS2LECharLenTable; CharsetID: UTF16_LE_CHARSET; ); doublecmd-0.5.8/components/chsdet/src/mbclass/EUCJPLangModel.inc0000644000175000017500000000453312014201074023500 0ustar alexxalexxconst EUCJPCharLenTable: array [0..5] of byte = (2, 2, 2, 3, 1, 0); //PCK4BITS(5,4,4,4,4,4,4,4), // 00 - 07 EUCJP_cls: array [0..255] of byte = ( 4,4,4,4,4,4,4,4, // 00 - 07 4,4,4,4,4,4,5,5, // 08 - 0f 4,4,4,4,4,4,4,4, // 10 - 17 4,4,4,5,4,4,4,4, // 18 - 1f 4,4,4,4,4,4,4,4, // 20 - 27 4,4,4,4,4,4,4,4, // 28 - 2f 4,4,4,4,4,4,4,4, // 30 - 37 4,4,4,4,4,4,4,4, // 38 - 3f 4,4,4,4,4,4,4,4, // 40 - 47 4,4,4,4,4,4,4,4, // 48 - 4f 4,4,4,4,4,4,4,4, // 50 - 57 4,4,4,4,4,4,4,4, // 58 - 5f 4,4,4,4,4,4,4,4, // 60 - 67 4,4,4,4,4,4,4,4, // 68 - 6f 4,4,4,4,4,4,4,4, // 70 - 77 4,4,4,4,4,4,4,4, // 78 - 7f 5,5,5,5,5,5,5,5, // 80 - 87 5,5,5,5,5,5,1,3, // 88 - 8f 5,5,5,5,5,5,5,5, // 90 - 97 5,5,5,5,5,5,5,5, // 98 - 9f 5,2,2,2,2,2,2,2, // a0 - a7 2,2,2,2,2,2,2,2, // a8 - af 2,2,2,2,2,2,2,2, // b0 - b7 2,2,2,2,2,2,2,2, // b8 - bf 2,2,2,2,2,2,2,2, // c0 - c7 2,2,2,2,2,2,2,2, // c8 - cf 2,2,2,2,2,2,2,2, // d0 - d7 2,2,2,2,2,2,2,2, // d8 - df 0,0,0,0,0,0,0,0, // e0 - e7 0,0,0,0,0,0,0,0, // e8 - ef 0,0,0,0,0,0,0,0, // f0 - f7 0,0,0,0,0,0,0,5 // f8 - ff ); EUCJP_st: array [0..39] of byte = ( 3, 4, 3, 5,byte(eStart),byte(eError),byte(eError),byte(eError),//00-07 byte(eError),byte(eError),byte(eError),byte(eError),byte(eItsMe),byte(eItsMe),byte(eItsMe),byte(eItsMe),//08-0f byte(eItsMe),byte(eItsMe),byte(eStart),byte(eError),byte(eStart),byte(eError),byte(eError),byte(eError),//10-17 byte(eError),byte(eError),byte(eStart),byte(eError),byte(eError),byte(eError), 3,byte(eError),//18-1f 3,byte(eError),byte(eError),byte(eError),byte(eStart),byte(eStart),byte(eStart),byte(eStart) //20-27 ); EUCJPLangModel: SMModel = ( classTable: @EUCJP_cls; classFactor: 6; stateTable: @EUCJP_st; charLenTable: @EUCJPCharLenTable; CharsetID: EUC_JP_CHARSET; ); // EUCJPLangModel: SMModel = ( // classTable: ( // idxsft: eIdxSft4bits; // sftmsk: eSftMsk4bits; // bitsft: eBitSft4bits; // unitmsk: eUnitMsk4bits; // data: @EUCJP_cls; // ); // classFactor: 6; // stateTable: ( // idxsft: eIdxSft4bits; // sftmsk: eSftMsk4bits; // bitsft: eBitSft4bits; // unitmsk: eUnitMsk4bits; // data: @EUCJP_st; // ); // charLenTable: @EUCJPCharLenTable; // CharsetID: EUC_JP_CHARSET; // ); doublecmd-0.5.8/components/chsdet/src/mbclass/ISO2022CNLangModel.inc0000644000175000017500000000446012014201074024012 0ustar alexxalexxconst ISO2022CNCharLenTable: array [0..8] of PRUint32 = (0, 0, 0, 0, 0, 0, 0, 0, 0); ISO2022CN_cls: array [Char] of Byte = ( 2,0,0,0,0,0,0,0, // 00 - 07 0,0,0,0,0,0,0,0, // 08 - 0f 0,0,0,0,0,0,0,0, // 10 - 17 0,0,0,1,0,0,0,0, // 18 - 1f 0,0,0,0,0,0,0,0, // 20 - 27 0,3,0,0,0,0,0,0, // 28 - 2f 0,0,0,0,0,0,0,0, // 30 - 37 0,0,0,0,0,0,0,0, // 38 - 3f 0,0,0,4,0,0,0,0, // 40 - 47 0,0,0,0,0,0,0,0, // 48 - 4f 0,0,0,0,0,0,0,0, // 50 - 57 0,0,0,0,0,0,0,0, // 58 - 5f 0,0,0,0,0,0,0,0, // 60 - 67 0,0,0,0,0,0,0,0, // 68 - 6f 0,0,0,0,0,0,0,0, // 70 - 77 0,0,0,0,0,0,0,0, // 78 - 7f 2,2,2,2,2,2,2,2, // 80 - 87 2,2,2,2,2,2,2,2, // 88 - 8f 2,2,2,2,2,2,2,2, // 90 - 97 2,2,2,2,2,2,2,2, // 98 - 9f 2,2,2,2,2,2,2,2, // a0 - a7 2,2,2,2,2,2,2,2, // a8 - af 2,2,2,2,2,2,2,2, // b0 - b7 2,2,2,2,2,2,2,2, // b8 - bf 2,2,2,2,2,2,2,2, // c0 - c7 2,2,2,2,2,2,2,2, // c8 - cf 2,2,2,2,2,2,2,2, // d0 - d7 2,2,2,2,2,2,2,2, // d8 - df 2,2,2,2,2,2,2,2, // e0 - e7 2,2,2,2,2,2,2,2, // e8 - ef 2,2,2,2,2,2,2,2, // f0 - f7 2,2,2,2,2,2,2,2 // f8 - ff ); ISO2022CN_st: array [0..63] of Byte = ( Byte(eStart), 3,Byte(eError),Byte(eStart),Byte(eStart),Byte(eStart),Byte(eStart),Byte(eStart),//00-07 Byte(eStart),Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eError),//08-0f Byte(eError),Byte(eError),Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),//10-17 Byte(eItsMe),Byte(eItsMe),Byte(eItsMe),Byte(eError),Byte(eError),Byte(eError), 4,Byte(eError),//18-1f Byte(eError),Byte(eError),Byte(eError),Byte(eItsMe),Byte(eError),Byte(eError),Byte(eError),Byte(eError),//20-27 5, 6,Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eError),//28-2f Byte(eError),Byte(eError),Byte(eError),Byte(eItsMe),Byte(eError),Byte(eError),Byte(eError),Byte(eError),//30-37 Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eError),Byte(eItsMe),Byte(eError),Byte(eStart) //38-3f ); ISO2022CNSMModel: SMModel = ( classTable: @ISO2022CN_cls; classFactor: 9; stateTable: @ISO2022CN_st; charLenTable: @ISO2022CNCharLenTable; CharsetID: ISO_2022_CN_CHARSET; );doublecmd-0.5.8/components/chsdet/src/sbseq/0000755000175000017500000000000012257501472020056 5ustar alexxalexxdoublecmd-0.5.8/components/chsdet/src/sbseq/LangBulgarianModel.pas0000644000175000017500000003201312014201074024233 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: LangBulgarianModel.pas,v 1.1 2007/05/20 15:46:17 ya_nick Exp $ unit LangBulgarianModel; interface uses nsCore, nsSBCharSetProber; (**************************************************************** 255: Control characters that usually does not exist in any text 254: Carriage/Return 253: symbol (punctuation) that does not belong to word 252: 0 - 9 *****************************************************************) //Character Mapping Table: //this talbe is modified base on win1251BulgarianCharToOrderMap, so //only number <64 is sure valid const Latin5_BulgarianCharToOrderMap: array [0..255] of byte = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, //40 110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, //50 253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, //60 116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, //70 194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, //80 210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, //90 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, //a0 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, //b0 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, //c0 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, //d0 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, //e0 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253 //f0 ); win1251BulgarianCharToOrderMap: array [0..255] of byte = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, //40 110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, //50 253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, //60 116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, //70 206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, //80 221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, //90 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, //a0 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, //b0 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, //c0 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, //d0 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, //e0 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16 //f0 ); //Model Table: //total sequences: 100% //first 512 sequences: 96.9392% //first 1024 sequences:3.0618% //rest sequences: 0.2992% //negative sequences: 0.0020% BulgarianLangModel: array [0..Pred(32*128)] of byte = ( 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, 3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, 0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, 0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, 0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, 0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, 0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, 2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, 3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, 3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, 1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, 3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, 1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, 2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, 2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, 3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, 1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, 2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, 2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, 3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, 1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, 2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, 2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, 2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, 1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, 2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, 1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, 3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, 1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, 3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, 1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, 2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, 1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, 2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, 1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, 2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, 1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, 1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, 1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, 2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, 1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, 2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, 1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, 1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, 0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, 1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, 2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, 1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, 1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, 0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, 1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, 0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, 2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, 0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, 2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, 1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, 0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, 0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, 1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, 1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 ); Latin5BulgarianModel: SequenceModel = ( charToOrderMap: @Latin5_BulgarianCharToOrderMap; precedenceMatrix: @BulgarianLangModel; mTypicalPositiveRatio: 0.969392; keepEnglishLetter: FALSE; CharsetID: ISO_8859_5_CHARSET; ); Win1251BulgarianModel: SequenceModel = ( charToOrderMap: @win1251BulgarianCharToOrderMap; precedenceMatrix: @BulgarianLangModel; mTypicalPositiveRatio: 0.969392; keepEnglishLetter: FALSE; CharsetID: WINDOWS_BULGARIAN_CHARSET; ); implementation end. doublecmd-0.5.8/components/chsdet/src/sbseq/LangCyrillicModel.pas0000644000175000017500000004345412014201074024114 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: LangCyrillicModel.pas,v 1.1 2007/05/20 15:46:17 ya_nick Exp $ unit LangCyrillicModel; interface uses nsCore, nsSBCharSetProber; (*KOI8-R language model*) const KOI8R_CharToOrderMap: array [0..255] of byte = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, //80 207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, //90 223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, //a0 238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, //b0 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, //c0 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, //d0 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, //e0 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70 //f0 ); win1251_CharToOrderMap: array [0..255] of byte = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, 207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, 223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, 239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16 ); latin5_CharToOrderMap: array [0..255] of byte = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, 207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, 223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, 239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255 ); macCyrillic_CharToOrderMap: array [0..255] of byte = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, 207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, 223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, 239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255 ); IBM855_CharToOrderMap: array [0..255] of byte = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, 206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, 220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, 230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, 250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255 ); IBM866_CharToOrderMap: array [0..255] of byte = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, 207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, 223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, 239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255 ); //Model Table: //total sequences: 100% //first 512 sequences: 97.6601% //first 1024 sequences: 2.3389% //rest sequences: 0.1237% //negative sequences: 0.0009% RussianLangModel: array [0..Pred(32*128)] of byte = ( 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, 3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, 0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, 0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, 3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, 2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, 3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, 1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, 2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, 1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, 2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, 1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, 3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, 1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, 2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, 1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, 1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, 1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, 2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, 1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, 3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, 1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, 2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, 1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, 2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, 1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, 1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, 1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, 3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, 3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, 1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, 1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, 0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, 2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, 1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, 1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, 0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, 1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, 2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, 2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, 1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, 1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, 2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, 1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, 0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, 2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, 1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, 1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, 0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, 0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, 1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, 0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, 0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, 1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, 0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, 2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, 0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 ); Koi8rModel: SequenceModel = ( charToOrderMap: @KOI8R_CharToOrderMap; precedenceMatrix: @RussianLangModel; mTypicalPositiveRatio: 0.976601; keepEnglishLetter: FALSE; CharsetID: KOI8_R_CHARSET; ); Win1251Model: SequenceModel = ( charToOrderMap: @win1251_CharToOrderMap; precedenceMatrix: @RussianLangModel; mTypicalPositiveRatio: 0.976601; keepEnglishLetter: FALSE; CharsetID: WINDOWS_1251_CHARSET; ); Latin5Model: SequenceModel = ( charToOrderMap: @latin5_CharToOrderMap; precedenceMatrix: @RussianLangModel; mTypicalPositiveRatio: 0.976601; keepEnglishLetter: FALSE; CharsetID: ISO_8859_5_CHARSET; ); MacCyrillicModel: SequenceModel = ( charToOrderMap: @macCyrillic_CharToOrderMap; precedenceMatrix: @RussianLangModel; mTypicalPositiveRatio: 0.976601; keepEnglishLetter: FALSE; CharsetID: X_MAC_CYRILLIC_CHARSET; ); Ibm866Model: SequenceModel = ( charToOrderMap: @IBM866_CharToOrderMap; precedenceMatrix: @RussianLangModel; mTypicalPositiveRatio: 0.976601; keepEnglishLetter: FALSE; CharsetID: IBM866_CHARSET; ); Ibm855Model: SequenceModel = ( charToOrderMap: @IBM855_CharToOrderMap; precedenceMatrix: @RussianLangModel; mTypicalPositiveRatio: 0.976601; keepEnglishLetter: FALSE; CharsetID: IBM855_CHARSET; ); implementation end. doublecmd-0.5.8/components/chsdet/src/sbseq/LangGreekModel.pas0000644000175000017500000003161312014201074023371 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: LangGreekModel.pas,v 1.1 2007/05/20 15:46:17 ya_nick Exp $ unit LangGreekModel; interface uses nsCore, nsSBCharSetProber; (**************************************************************** 255: Control characters that usually does not exist in any text 254: Carriage/Return 253: symbol (punctuation) that does not belong to word 252: 0 - 9 *****************************************************************) const //Character Mapping Table: Latin7_CharToOrderMap: array [0..255] of byte = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, //40 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, //50 253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, //60 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, //70 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //80 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, //a0 253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, //b0 110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, //c0 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, //d0 124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, //e0 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253 //f0 ); win1253_CharToOrderMap: array [0..255] of byte = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, //40 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, //50 253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, //60 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, //70 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //80 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, //a0 253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, //b0 110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, //c0 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, //d0 124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, //e0 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253 //f0 ); //Model Table: //total sequences: 100% //first 512 sequences: 98.2851% //first 1024 sequences:1.7001% //rest sequences: 0.0359% //negative sequences: 0.0148% GreekLangModel: array [0..Pred(32*128)] of byte = ( 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, 3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, 0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, 2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, 0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, 2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, 0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, 2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, 0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, 2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, 0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, 3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, 3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, 2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, 2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, 0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, 0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, 0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, 0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, 0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, 0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, 0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, 0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, 0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, 0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, 0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, 0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, 0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, 0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, 0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, 0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, 0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, 0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, 0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, 0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, 0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, 0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, 0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, 0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, 0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, 0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, 0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, 0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, 0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, 0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, 0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, 0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, 0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, 0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, 0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ); Latin7Model: SequenceModel = ( charToOrderMap: @Latin7_CharToOrderMap; precedenceMatrix: @GreekLangModel; mTypicalPositiveRatio: 0.982851; keepEnglishLetter: FALSE; CharsetID: ISO_8859_7_CHARSET; ); Win1253Model: SequenceModel = ( charToOrderMap: @win1253_CharToOrderMap; precedenceMatrix: @GreekLangModel; mTypicalPositiveRatio: 0.982851; keepEnglishLetter: FALSE; CharsetID: WINDOWS_1253_CHARSET; ); implementation end. doublecmd-0.5.8/components/chsdet/src/sbseq/LangHebrewModel.pas0000644000175000017500000002670712014201074023560 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: LangHebrewModel.pas,v 1.1 2007/05/20 15:46:20 ya_nick Exp $ unit LangHebrewModel; interface uses nsCore, nsSBCharSetProber; (**************************************************************** 255: Control characters that usually does not exist in any text 254: Carriage/Return 253: symbol (punctuation) that does not belong to word 252: 0 - 9 *****************************************************************) //Windows-1255 language model //Character Mapping Table: const win1255_CharToOrderMap: array [0..255] of byte = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, //40 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, //50 253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, //60 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, //70 124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, 215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, 106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, 238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253 ); //Model Table: //total sequences: 100% //first 512 sequences: 98.4004% //first 1024 sequences: 1.5981% //rest sequences: 0.087% //negative sequences: 0.0015% HebrewLangModel: array [0..Pred(32*128)] of byte = ( 0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, 3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, 1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, 1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, 1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, 1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, 1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, 0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, 0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, 1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, 3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, 0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, 0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, 0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, 0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, 0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, 3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, 0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, 0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, 0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, 0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, 0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, 0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, 3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, 0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, 0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, 0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, 1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, 0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, 3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, 3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, 0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, 0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, 0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, 0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, 2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, 0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, 0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, 1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, 0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, 2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, 1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, 2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, 1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, 2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, 0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, 1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, 0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0 ); Win1255Model: SequenceModel = ( charToOrderMap: @win1255_CharToOrderMap; precedenceMatrix: @HebrewLangModel; mTypicalPositiveRatio: 0.984004; keepEnglishLetter: FALSE; CharsetID: WINDOWS_1255_CHARSET; ); implementation end. doublecmd-0.5.8/components/chsdet/src/chsdet.lpr0000644000175000017500000000341312014201074020715 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: chsdet.lpr,v 1.1 2009/03/20 17:40:22 ya_nick Exp $ library chsdet; uses chsdIntf in 'chsdIntf.pas', LangBulgarianModel in 'sbseq/LangBulgarianModel.pas', LangCyrillicModel in 'sbseq/LangCyrillicModel.pas', LangGreekModel in 'sbseq/LangGreekModel.pas', LangHebrewModel in 'sbseq/LangHebrewModel.pas' ; exports csd_Reset, csd_HandleData, csd_Done, csd_DataEnd, csd_GetDetectedCharset, csd_GetKnownCharsets, csd_GetAbout; {.chsdet$R *.res} {.chsdet$R chsdet.res} begin end. doublecmd-0.5.8/components/chsdet/src/nsSBCSGroupProber.pas0000644000175000017500000001230212014201074022710 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: nsSBCSGroupProber.pas,v 1.3 2007/05/26 13:09:38 ya_nick Exp $ unit nsSBCSGroupProber; interface uses nsCore, nsGroupProber; type TnsSBCSGroupProber = class(TnsGroupProber) public constructor Create; reintroduce; function HandleData(aBuf: PChar; aLen: integer): eProbingState; override; // {$ifdef DEBUG_chardet} // procedure DumpStatus; override; // {$endif} end; implementation uses SysUtils, nsHebrewProber, nsSBCharSetProber, LangCyrillicModel, LangGreekModel, LangBulgarianModel, LangHebrewModel; { TnsSBCSGroupProber } const NUM_OF_PROBERS = 13; constructor TnsSBCSGroupProber.Create; var hebprober: TnsHebrewProber; i: integer; begin mNumOfProbers := NUM_OF_PROBERS; SetLength(mProbers, NUM_OF_PROBERS); SetLength(mIsActive, NUM_OF_PROBERS); SetLength(mProberStates, NUM_OF_PROBERS); mProbers[0] := TnsSingleByteCharSetProber.Create(Win1251Model); mProbers[1] := TnsSingleByteCharSetProber.Create(Koi8rModel); mProbers[2] := TnsSingleByteCharSetProber.Create(Latin5Model); mProbers[3] := TnsSingleByteCharSetProber.Create(MacCyrillicModel); mProbers[4] := TnsSingleByteCharSetProber.Create(Ibm866Model); mProbers[5] := TnsSingleByteCharSetProber.Create(Ibm855Model); mProbers[6] := TnsSingleByteCharSetProber.Create(Latin7Model); mProbers[7] := TnsSingleByteCharSetProber.Create(Win1253Model); mProbers[8] := TnsSingleByteCharSetProber.Create(Latin5BulgarianModel); mProbers[9] := TnsSingleByteCharSetProber.Create(Win1251BulgarianModel); hebprober := TnsHebrewProber.Create; // Notice: Any change in these indexes - 10,11,12 must be reflected // in the code below as well. mProbers[10]:= hebprober; mProbers[11]:= TnsSingleByteCharSetProber.Create(Win1255Model,FALSE,hebprober);(* Logical Hebrew*) mProbers[12]:= TnsSingleByteCharSetProber.Create(Win1255Model,TRUE,hebprober); (* Visual Hebrew*) (* Tell the Hebrew prober about the logical and visual probers*) if (mProbers[10]<>nil)and(mProbers[11]<>nil)and(mProbers[12]<>nil) then (* all are not null*) hebprober.SetModelProbers(mProbers[11],mProbers[12]) else (* One or more is null. avoid any Hebrew probing, null them all*) for i := 10 to 12 do begin mProbers[i].Free; mProbers[i] := nil; end; inherited Create; (* disable latin2 before latin1 is available, otherwise all latin1 *) (* will be detected as latin2 because of their similarity.*) // mProbers[10] = new nsSingleByteCharSetProber(&Latin2HungarianModel); // mProbers[11] = new nsSingleByteCharSetProber(&Win1250HungarianModel); end; function TnsSBCSGroupProber.HandleData(aBuf: PChar; aLen: integer): eProbingState; var newBuf1: PChar; newLen1: integer; begin newBuf1 := AllocMem(aLen); newLen1 := 0; (*apply filter to original buffer, and we got new buffer back*) (*depend on what script it is, we will feed them the new buffer *) (*we got after applying proper filter*) (*this is done without any consideration to KeepEnglishLetters*) (*of each prober since as of now, there are no probers here which*) (*recognize languages with English characters.*) Result := mState; try if (not FilterWithoutEnglishLetters(aBuf,aLen,newBuf1,newLen1)) or (newLen1 = 0) then exit; (* Nothing to see here, move on.*) inherited HandleData(newBuf1, newLen1); finally FreeMem(newBuf1, aLen); end; Result:= mState; end; {$ifdef DEBUG_chardet} procedure TnsSBCSGroupProber.DumpStatus; var i: integer; cf: float; i: integer; begin cf := GetConfidence; printf(' SBCS Group Prober --------begin status r'#13#10''); for i := 0 to Pred(NUM_OF_SBCS_PROBERS) do begin if 0 = mIsActive[i] then printf(' inactive: [%s] (i.e. confidence is too low).r'#13#10'',mProbers[i].GetCharSetName) else mProbers[i].DumpStatus; end; printf(' SBCS Group found best match [%s] confidence %f.r'#13#10'',mProbers[mBestGuess].GetCharSetName,cf); end; {$endif} end. doublecmd-0.5.8/components/chsdet/src/Big5Freq.pas0000644000175000017500000024436212014201074021047 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: Big5Freq.pas,v 1.2 2007/05/20 15:46:02 ya_nick Exp $ unit Big5Freq; // Big5 frequency table // by Taiwan's Mandarin Promotion Council // (****************************************************************************** * 128 --> 0.42261 * 256 --> 0.57851 * 512 --> 0.74851 * 1024 --> 0.89384 * 2048 --> 0.97583 * * Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 * Random Distribution Ration = 512/(5401-512)=0.105 * * Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR *****************************************************************************) interface uses nsCore; const BIG5_TYPICAL_DISTRIBUTION_RATIO: float = 0.75; //Char to FreqOrder table , BIG5_TABLE_SIZE = 5376; Big5CharToFreqOrder: array [0..BIG5_TABLE_SIZE-1] of PRInt16 = ( 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, // 16 3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, // 32 1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, // 48 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, // 64 3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, // 80 4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, // 96 5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, // 112 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, // 128 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, // 144 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, // 160 2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, // 176 1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, // 192 3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, // 208 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, // 224 1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, // 240 3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, // 256 2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, // 272 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, // 288 3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, // 304 1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, // 320 5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, // 336 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, // 352 5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, // 368 1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, // 384 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, // 400 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, // 416 3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, // 432 3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, // 448 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, // 464 2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, // 480 2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, // 496 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, // 512 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, // 528 3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, // 544 1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, // 560 1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, // 576 1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, // 592 2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, // 608 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, // 624 4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, // 640 1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, // 656 5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, // 672 2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, // 688 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, // 704 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, // 720 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, // 736 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, // 752 5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, // 768 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, // 784 1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, // 800 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, // 816 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, // 832 5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, // 848 1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, // 864 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, // 880 3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, // 896 4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, // 912 3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, // 928 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, // 944 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, // 960 1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, // 976 4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, // 992 3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, // 1008 3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, // 1024 2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, // 1040 5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, // 1056 3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, // 1072 5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, // 1088 1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, // 1104 2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, // 1120 1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, // 1136 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, // 1152 1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, // 1168 4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, // 1184 3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, // 1200 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, // 1216 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, // 1232 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, // 1248 2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, // 1264 5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, // 1280 1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, // 1296 2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, // 1312 1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, // 1328 1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, // 1344 5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, // 1360 5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, // 1376 5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, // 1392 3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, // 1408 4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, // 1424 4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, // 1440 2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, // 1456 5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, // 1472 3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, // 1488 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, // 1504 5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, // 1520 5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, // 1536 1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, // 1552 2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, // 1568 3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, // 1584 4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, // 1600 5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, // 1616 3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, // 1632 4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, // 1648 1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, // 1664 1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, // 1680 4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, // 1696 1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, // 1712 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, // 1728 1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, // 1744 1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, // 1760 3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, // 1776 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, // 1792 5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, // 1808 2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, // 1824 1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, // 1840 1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, // 1856 5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, // 1872 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, // 1888 4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, // 1904 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, // 1920 2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, // 1936 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, // 1952 1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, // 1968 1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, // 1984 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, // 2000 4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, // 2016 4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, // 2032 1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, // 2048 3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, // 2064 5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, // 2080 5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, // 2096 1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, // 2112 2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, // 2128 1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, // 2144 3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, // 2160 2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, // 2176 3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, // 2192 2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, // 2208 4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, // 2224 4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, // 2240 3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, // 2256 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, // 2272 3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, // 2288 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, // 2304 3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, // 2320 4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, // 2336 3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, // 2352 1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, // 2368 5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, // 2384 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, // 2400 5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, // 2416 1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, // 2432 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, // 2448 4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, // 2464 4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, // 2480 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, // 2496 2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, // 2512 2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, // 2528 3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, // 2544 1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, // 2560 4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, // 2576 2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, // 2592 1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, // 2608 1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, // 2624 2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, // 2640 3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, // 2656 1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, // 2672 5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, // 2688 1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, // 2704 4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, // 2720 1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, // 2736 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, // 2752 1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, // 2768 4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, // 2784 4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, // 2800 2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, // 2816 1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, // 2832 4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, // 2848 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, // 2864 5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, // 2880 2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, // 2896 3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, // 2912 4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, // 2928 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, // 2944 5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, // 2960 5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, // 2976 1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, // 2992 4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, // 3008 4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, // 3024 2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, // 3040 3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, // 3056 3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, // 3072 2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, // 3088 1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, // 3104 4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, // 3120 3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, // 3136 3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, // 3152 2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, // 3168 4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, // 3184 5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, // 3200 3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, // 3216 2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, // 3232 3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, // 3248 1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, // 3264 2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, // 3280 3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, // 3296 4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, // 3312 2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, // 3328 2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, // 3344 5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, // 3360 1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, // 3376 2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, // 3392 1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, // 3408 3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, // 3424 4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, // 3440 2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, // 3456 3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, // 3472 3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, // 3488 2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, // 3504 4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, // 3520 2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, // 3536 3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, // 3552 4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, // 3568 5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, // 3584 3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, // 3600 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, // 3616 1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, // 3632 4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, // 3648 1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, // 3664 4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, // 3680 5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, // 3696 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, // 3712 5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, // 3728 5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, // 3744 2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, // 3760 3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, // 3776 2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, // 3792 2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, // 3808 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, // 3824 1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, // 3840 4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, // 3856 3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, // 3872 3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, // 3888 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, // 3904 2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, // 3920 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, // 3936 2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, // 3952 4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, // 3968 1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, // 3984 4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, // 4000 1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, // 4016 3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, // 4032 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, // 4048 3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, // 4064 5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, // 4080 5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, // 4096 3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, // 4112 3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, // 4128 1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, // 4144 2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, // 4160 5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, // 4176 1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, // 4192 1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, // 4208 3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, // 4224 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, // 4240 1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, // 4256 4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, // 4272 5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, // 4288 2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, // 4304 3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, // 4320 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, // 4336 1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, // 4352 2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, // 4368 2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, // 4384 5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, // 4400 5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, // 4416 5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, // 4432 2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, // 4448 2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, // 4464 1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, // 4480 4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, // 4496 3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, // 4512 3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, // 4528 4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, // 4544 4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, // 4560 2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, // 4576 2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, // 4592 5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, // 4608 4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, // 4624 5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, // 4640 4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, // 4656 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, // 4672 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, // 4688 1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, // 4704 3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, // 4720 4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, // 4736 1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, // 4752 5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, // 4768 2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, // 4784 2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, // 4800 3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, // 4816 5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, // 4832 1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, // 4848 3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, // 4864 5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, // 4880 1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, // 4896 5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, // 4912 2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, // 4928 3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, // 4944 2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, // 4960 3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, // 4976 3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, // 4992 3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, // 5008 4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, // 5024 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, // 5040 2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, // 5056 4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, // 5072 3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, // 5088 5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, // 5104 1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, // 5120 5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, // 5136 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, // 5152 1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, // 5168 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, // 5184 4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, // 5200 1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, // 5216 4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, // 5232 1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, // 5248 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, // 5264 3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, // 5280 4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, // 5296 5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, // 5312 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, // 5328 3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, // 5344 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, // 5360 2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798 // 5376 //last 512 (*************************************************************************************** *Everything below is of no interest for detection purpose * *************************************************************************************** 2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, // 5392 2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, // 5408 5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, // 5424 5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, // 5440 5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, // 5456 5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, // 5472 5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, // 5488 5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, // 5504 5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, // 5520 5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, // 5536 5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, // 5552 5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, // 5568 5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, // 5584 5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, // 5600 6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, // 5616 6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, // 5632 6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, // 5648 6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, // 5664 6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, // 5680 6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, // 5696 6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, // 5712 6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, // 5728 6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, // 5744 6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, // 5760 6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, // 5776 6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, // 5792 6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, // 5808 6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, // 5824 6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, // 5840 6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, // 5856 6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, // 5872 6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, // 5888 6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, // 5904 6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, // 5920 6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, // 5936 6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, // 5952 6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, // 5968 6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, // 5984 6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, // 6000 6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, // 6016 6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, // 6032 6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, // 6048 6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, // 6064 6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, // 6080 6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, // 6096 6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, // 6112 6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, // 6128 6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, // 6144 6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, // 6160 6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, // 6176 6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, // 6192 6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, // 6208 6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, // 6224 6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, // 6240 6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, // 6256 3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, // 6272 6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, // 6288 6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, // 6304 3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, // 6320 6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, // 6336 6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, // 6352 6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, // 6368 6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, // 6384 6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, // 6400 6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, // 6416 6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, // 6432 4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, // 6448 6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, // 6464 6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, // 6480 3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, // 6496 6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, // 6512 6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, // 6528 6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, // 6544 6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, // 6560 6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, // 6576 6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, // 6592 6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, // 6608 6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, // 6624 6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, // 6640 6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, // 6656 6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, // 6672 7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, // 6688 7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, // 6704 7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, // 6720 7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, // 6736 7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, // 6752 7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, // 6768 7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, // 6784 7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, // 6800 7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, // 6816 7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, // 6832 7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, // 6848 7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, // 6864 7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, // 6880 7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, // 6896 7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, // 6912 7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, // 6928 7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, // 6944 7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, // 6960 7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, // 6976 7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, // 6992 7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, // 7008 7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, // 7024 7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, // 7040 7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, // 7056 7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, // 7072 7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, // 7088 7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, // 7104 7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, // 7120 7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, // 7136 7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, // 7152 7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, // 7168 7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, // 7184 7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, // 7200 7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, // 7216 7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, // 7232 7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, // 7248 7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, // 7264 7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, // 7280 7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, // 7296 7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, // 7312 7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, // 7328 7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, // 7344 7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, // 7360 7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, // 7376 7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, // 7392 7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, // 7408 7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, // 7424 7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, // 7440 3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, // 7456 7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, // 7472 7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, // 7488 7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, // 7504 7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, // 7520 4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, // 7536 7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, // 7552 7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, // 7568 7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, // 7584 7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, // 7600 7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, // 7616 7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, // 7632 7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, // 7648 7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, // 7664 7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, // 7680 7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, // 7696 7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, // 7712 8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, // 7728 8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, // 7744 8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, // 7760 8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, // 7776 8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, // 7792 8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, // 7808 8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, // 7824 8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, // 7840 8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, // 7856 8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, // 7872 8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, // 7888 8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, // 7904 8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, // 7920 8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, // 7936 8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, // 7952 8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, // 7968 8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, // 7984 8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, // 8000 8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, // 8016 8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, // 8032 8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, // 8048 8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, // 8064 8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, // 8080 8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, // 8096 8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, // 8112 8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, // 8128 8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, // 8144 8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, // 8160 8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, // 8176 8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, // 8192 8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, // 8208 8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, // 8224 8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, // 8240 8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, // 8256 8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, // 8272 8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, // 8288 8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, // 8304 8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, // 8320 8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, // 8336 8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, // 8352 8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, // 8368 8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, // 8384 8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, // 8400 8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, // 8416 8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, // 8432 8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, // 8448 8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, // 8464 8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, // 8480 8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, // 8496 8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, // 8512 8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, // 8528 8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, // 8544 8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, // 8560 8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, // 8576 8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, // 8592 8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, // 8608 8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, // 8624 8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, // 8640 8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, // 8656 8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, // 8672 8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, // 8688 4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, // 8704 8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, // 8720 8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, // 8736 8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, // 8752 8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, // 8768 9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, // 8784 9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, // 8800 9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, // 8816 9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, // 8832 9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, // 8848 9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, // 8864 9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, // 8880 9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, // 8896 9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, // 8912 9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, // 8928 9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, // 8944 9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, // 8960 9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, // 8976 9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, // 8992 9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, // 9008 9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, // 9024 9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, // 9040 9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, // 9056 9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, // 9072 9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, // 9088 9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, // 9104 9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, // 9120 9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, // 9136 9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, // 9152 9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, // 9168 9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, // 9184 9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, // 9200 9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, // 9216 9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, // 9232 9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, // 9248 9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, // 9264 9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, // 9280 9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, // 9296 9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, // 9312 9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, // 9328 9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, // 9344 9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, // 9360 9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, // 9376 3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, // 9392 9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, // 9408 9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, // 9424 9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, // 9440 4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, // 9456 9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, // 9472 9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, // 9488 9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, // 9504 9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, // 9520 9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, // 9536 9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, // 9552 9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, // 9568 9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, // 9584 9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, // 9600 9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, // 9616 9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, // 9632 9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, // 9648 9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, // 9664 9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, // 9680 9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, // 9696 9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, // 9712 9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, // 9728 9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, // 9744 9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, // 9760 9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, // 9776 9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, // 9792 9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, // 9808 9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, // 9824 10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, // 9840 10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, // 9856 10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, // 9872 10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, // 9888 10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, // 9904 10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, // 9920 10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, // 9936 10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, // 9952 10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, // 9968 4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, // 9984 10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, //10000 10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, //10016 10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, //10032 10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, //10048 10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, //10064 10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, //10080 10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, //10096 10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, //10112 4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, //10128 10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, //10144 10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, //10160 10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, //10176 10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, //10192 10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, //10208 10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, //10224 10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, //10240 10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, //10256 10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, //10272 10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, //10288 10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, //10304 10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, //10320 10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, //10336 10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, //10352 10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, //10368 10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, //10384 10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, //10400 4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, //10416 10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, //10432 10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, //10448 10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, //10464 10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, //10480 10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, //10496 10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, //10512 10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, //10528 10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, //10544 10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, //10560 10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, //10576 10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, //10592 10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, //10608 10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, //10624 10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, //10640 10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, //10656 10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, //10672 10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, //10688 10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, //10704 10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, //10720 10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, //10736 10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, //10752 10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, //10768 10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, //10784 10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, //10800 10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, //10816 10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, //10832 10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, //10848 10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, //10864 10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, //10880 10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, //10896 11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, //10912 11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, //10928 11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, //10944 4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, //10960 11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, //10976 11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, //10992 11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, //11008 11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, //11024 11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, //11040 11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, //11056 11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, //11072 11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, //11088 11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, //11104 11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, //11120 11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, //11136 11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, //11152 11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, //11168 11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, //11184 11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, //11200 11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, //11216 11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, //11232 11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, //11248 11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, //11264 11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, //11280 11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, //11296 11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, //11312 11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, //11328 11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, //11344 11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, //11360 11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, //11376 11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, //11392 11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, //11408 11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, //11424 11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, //11440 11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, //11456 11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, //11472 4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, //11488 11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, //11504 11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, //11520 11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, //11536 11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, //11552 11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, //11568 11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, //11584 11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, //11600 11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, //11616 11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, //11632 11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, //11648 11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, //11664 11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, //11680 11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, //11696 11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, //11712 11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, //11728 11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, //11744 11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, //11760 11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, //11776 11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, //11792 11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, //11808 11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, //11824 11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, //11840 11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, //11856 11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, //11872 11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, //11888 11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, //11904 11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, //11920 11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, //11936 12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, //11952 12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, //11968 12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, //11984 12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, //12000 12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, //12016 12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, //12032 12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, //12048 12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, //12064 12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, //12080 12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, //12096 12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, //12112 12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, //12128 12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, //12144 12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, //12160 12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, //12176 4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, //12192 4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, //12208 4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, //12224 12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, //12240 12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, //12256 12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, //12272 12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, //12288 12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, //12304 12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, //12320 12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, //12336 12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, //12352 12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, //12368 12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, //12384 12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, //12400 12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, //12416 12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, //12432 12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, //12448 12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, //12464 12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, //12480 12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, //12496 12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, //12512 12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, //12528 12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, //12544 12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, //12560 12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, //12576 12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, //12592 12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, //12608 12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, //12624 12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, //12640 12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, //12656 12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, //12672 12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, //12688 12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, //12704 12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, //12720 12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, //12736 12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, //12752 12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, //12768 12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, //12784 12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, //12800 12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, //12816 12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, //12832 12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, //12848 12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, //12864 12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, //12880 12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, //12896 12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, //12912 12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, //12928 12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, //12944 12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, //12960 12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, //12976 4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, //12992 13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, //13008 13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, //13024 13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, //13040 13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, //13056 13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, //13072 13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, //13088 13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, //13104 4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, //13120 13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, //13136 13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, //13152 13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, //13168 13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, //13184 13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, //13200 13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, //13216 13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, //13232 13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, //13248 13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, //13264 13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, //13280 13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, //13296 13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, //13312 13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, //13328 13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, //13344 13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, //13360 5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, //13376 13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, //13392 13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, //13408 13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, //13424 13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, //13440 13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, //13456 13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, //13472 13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, //13488 13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, //13504 13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, //13520 13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, //13536 13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, //13552 13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, //13568 13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, //13584 13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, //13600 13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, //13616 13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, //13632 13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, //13648 13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, //13664 13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, //13680 13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, //13696 13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, //13712 13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, //13728 13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, //13744 13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, //13760 13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, //13776 13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, //13792 13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, //13808 13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, //13824 13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, //13840 13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, //13856 13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, //13872 13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, //13888 13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, //13904 13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, //13920 13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, //13936 13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, //13952 13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, //13968 13968,13969,13970,13971,13972, //13973 ****************************************************************************************) ); implementation end. doublecmd-0.5.8/components/chsdet/src/JpCntx.pas0000644000175000017500000005245512014201074020651 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: JpCntx.pas,v 1.2 2007/05/20 15:46:05 ya_nick Exp $ unit JpCntx; interface uses nsCore; const NUM_OF_CATEGORY = 6; type TJapaneseContextAnalysis = class (TObject) private (*category counters, each interger counts sequence in its category*) mRelSample: array [0..Pred(NUM_OF_CATEGORY)] of PRUint32; (*total sequence received*) mTotalRel: PRUint32; (*The order of previous char*) mLastCharOrder: integer; (*if last byte in current buffer is not the last byte of a character, we*) (*need to know how many byte to skip in next buffer.*) mNeedToSkipCharNum: integer; (*If this flag is set to PR_TRUE, detection is done and conclusion has been made*) mDone: Boolean; function GetOrder(str: PChar; charLen: pPRUint32): PRInt32; overload; virtual; abstract; function GetOrder(str: PChar): PRInt32; overload; virtual; abstract; public constructor Create; destructor Destroy; override; procedure Reset; procedure HandleData(const aBuf: PChar; aLen: integer); procedure HandleOneChar(aStr: PChar; aCharLen: integer); function GotEnoughData: Boolean; function GetConfidence: float; end; TSJISContextAnalysis = class (TJapaneseContextAnalysis) public function GetOrder(str: PChar; charLen: pPRUint32): PRInt32; overload; override; function GetOrder(str: PChar): PRInt32; overload; override; end; TEUCJPContextAnalysis = class (TJapaneseContextAnalysis) public function GetOrder(str: PChar; charLen: pPRUint32): PRInt32; overload; override; (*We only interested in Hiragana, so first byte is '\244'*) function GetOrder(str: PChar): PRInt32; overload; override; end; implementation const ENOUGH_REL_THRESHOLD = 100; MAX_REL_THRESHOLD = 1000; MINIMUM_DATA_THRESHOLD = 4; DONT_KNOW: float = -1; (*hiragana frequency category table*) //This is hiragana 2-char sequence table, the number in each cell represents its frequency category jp2CharContext: array [0..82, 0..82] of byte = ( ( 0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), ( 2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), ( 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), ( 0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), ( 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), ( 0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), ( 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), ( 0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), ( 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), ( 0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), ( 1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), ( 0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), ( 0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), ( 0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), ( 0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), ( 0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), ( 2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), ( 0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), ( 0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), ( 0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), ( 2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), ( 0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), ( 1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), ( 0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), ( 0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), ( 0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), ( 0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), ( 0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), ( 0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), ( 0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), ( 0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), ( 0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), ( 0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), ( 0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), ( 0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), ( 1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), ( 0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), ( 0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), ( 0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), ( 0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), ( 0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), ( 2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), ( 0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), ( 0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), ( 0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), ( 0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), ( 0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), ( 0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), ( 0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), ( 0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), ( 0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), ( 0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), ( 0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), ( 0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), ( 0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), ( 0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), ( 0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), ( 0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), ( 0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), ( 0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), ( 0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), ( 2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), ( 0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), ( 0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), ( 0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), ( 0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), ( 1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), ( 0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), ( 0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), ( 0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), ( 0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), ( 0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), ( 0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), ( 0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), ( 0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), ( 1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), ( 0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), ( 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), ( 0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), ( 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), ( 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), ( 0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), ( 0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1) ); constructor TJapaneseContextAnalysis.Create; begin inherited Create; Reset; end; destructor TJapaneseContextAnalysis.Destroy; begin inherited; end; procedure TJapaneseContextAnalysis.HandleOneChar(aStr: PChar; aCharLen: integer); var order: PRInt32; (*if we received enough data, stop here *) begin if mTotalRel > MAX_REL_THRESHOLD then mDone:= TRUE; if mDone then exit; (*Only 2-bytes characters are of our interest*) if (aCharLen=2) then order := GetOrder(aStr) else order := -1; if (order <> -1) and (mLastCharOrder <> -1) then begin inc(mTotalRel); inc(mRelSample[jp2CharContext[mLastCharOrder][order]]); (*count this sequence to its category counter*) end; mLastCharOrder:= order; end; function TJapaneseContextAnalysis.GotEnoughData: Boolean; begin Result := mTotalRel > ENOUGH_REL_THRESHOLD; end; function TJapaneseContextAnalysis.GetConfidence: float; begin (*This is just one way to calculate confidence. It works well for me.*) if mTotalRel > MINIMUM_DATA_THRESHOLD then Result := (mTotalRel - mRelSample[0]) div mTotalRel else Result := DONT_KNOW; end; procedure TJapaneseContextAnalysis.HandleData(const aBuf: PChar; aLen: integer); var charLen: PRUint32; order: PRInt32; i: integer; begin if mDone then exit; (*The buffer we got is byte oriented, and a character may span in more than one*) (*buffers. In case the last one or two byte in last buffer is not complete, we *) (*record how many byte needed to complete that character and skip these bytes here.*) (*We can choose to record those bytes as well and analyse the character once it *) (*is complete, but since a character will not make much difference, by simply skipping*) (*this character will simply our logic and improve performance.*) i := mNeedToSkipCharNum; while i < integer(aLen) do begin order := GetOrder(aBuf+i, @charLen); i := i + integer(charLen); if i > integer(aLen) then begin mNeedToSkipCharNum := i - aLen; mLastCharOrder := -1; end else begin if (order <> -1) and (mLastCharOrder <> -1) then begin inc(mTotalRel); if mTotalRel > MAX_REL_THRESHOLD then begin mDone:= TRUE; break; {<= !!!b possible in "switch" - then remove this line} end; inc(mRelSample[jp2CharContext[mLastCharOrder][order]]); end; mLastCharOrder:= order; end; end; end; procedure TJapaneseContextAnalysis.Reset; var i: integer; begin mTotalRel := 0; for i := 0 to Pred(NUM_OF_CATEGORY) do mRelSample[i] := 0; mNeedToSkipCharNum := 0; mLastCharOrder := -1; mDone := FALSE; end; { TSJISContextAnalysis } function TSJISContextAnalysis.GetOrder(str: PChar; charLen: pPRUint32): PRInt32; begin (*find out current char's byte length*) if (byte(str^) >= $81) and (byte(str^) <= $9f) or (byte(str^) >= $e0) and (byte(str^) <= $fc) then charLen^:=2 else charLen^:=1; (*return its order if it is hiragana*) if (str^ = #$82) and (byte((str+1)^) >= $9f) and (byte((str+1)^) <= $f1) then Result := byte((str+1)^) - $9f else Result:= -1; end; function TSJISContextAnalysis.GetOrder(str: PChar): PRInt32; begin (*We only interested in Hiragana, so first byte is '\202'*) if (str[0]=#$82) and (byte(str[1]) >= $9f) and (byte(str[1]) <= $f1) then Result := byte(str[1]) - $9f else Result := -1; end; { TEUCJPContextAnalysis } function TEUCJPContextAnalysis.GetOrder(str: PChar; charLen: pPRUint32): PRInt32; begin (*find out current char's byte length*) if (byte(str^) = $8e) or (byte(str^) >= $a1) and (byte(str^) <= $fe) then charLen^ := 2 else if byte(str^) = $8f then charLen^ := 3 else charLen^ := 1; (*return its order if it is hiragana*) if (byte(str^) = $a4) and (byte((str+1)^) >= $a1) and (byte((str+1)^) <= $f3) then Result := byte((str+1)^) - $a1 else Result:= -1; end; function TEUCJPContextAnalysis.GetOrder(str: PChar): PRInt32; begin if (str[0]=#$A4) and (byte(str[1]) >= $a1) and (byte(str[1]) <= $f3) then Result := byte(str[1]) - $a1 else Result := -1; end; end. doublecmd-0.5.8/components/chsdet/src/CharDistribution.pas0000644000175000017500000002353412014201074022714 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: CharDistribution.pas,v 1.3 2007/05/26 13:09:38 ya_nick Exp $ unit CharDistribution; {$R-} interface uses nsCore; type TCharDistributionAnalysis = class (TObject) protected //mDone: PRBool; (*If this flag is set to PR_TRUE, detection is done and conclusion has been made*) // YaN: nice idea. Unfortunately is not implemented :(( mFreqChars: PRUint32; (*The number of characters whose frequency order is less than 512*) mTotalChars: PRUint32; (*Total character encounted.*) mCharToFreqOrder: pPRInt16; (*Mapping table to get frequency order from char order (get from GetOrder())*) mTableSize: PRUint32; (*Size of above table*) mTypicalDistributionRatio: double;(*This is a constant value varies from language to language, it is used in calculating confidence. See my paper for further detail.*) //we do not handle character base on its original encoding string, but //convert this encoding string to a number, here called order. //This allow multiple encoding of a language to share one frequency table function GetOrder(str: PChar): PRInt32; virtual; abstract; (*feed a block of data and do distribution analysis*) // function HandleData(const aBuf: PChar; aLen: PRUint32): eProbingState; virtual; abstract; public destructor Destroy; override; (*This function is for future extension. Caller can use this function to control analyser's behavior*) // procedure SetOpion(); virtual; abstract; (*return confidence base on existing data*) function GetConfidence: float; virtual; (*Reset analyser, clear any state *) procedure Reset; virtual; (*It is not necessary to receive all data to draw conclusion. For charset detection, certain amount of data is enough*) function GotEnoughData: Boolean; (*Feed a character with known length*) procedure HandleOneChar(aStr: PChar; aCharLen: PRUint32); virtual; end; TEUCTWDistributionAnalysis = class (TCharDistributionAnalysis) (*for euc-TW encoding, we are interested *) (* first byte range: 0xc4 -- 0xfe*) (* second byte range: 0xa1 -- 0xfe*) (*no validation needed here. State machine has done that*) protected function GetOrder(str: PChar): PRInt32; override; public constructor Create; reintroduce; end; TEUCKRDistributionAnalysis = class (TCharDistributionAnalysis) (*for euc-KR encoding, we are interested *) (* first byte range: 0xb0 -- 0xfe*) (* second byte range: 0xa1 -- 0xfe*) (*no validation needed here. State machine has done that*) protected function GetOrder(str: PChar): PRInt32; override; public constructor Create; reintroduce; end; TGB2312DistributionAnalysis = class (TCharDistributionAnalysis) (*for GB2312 encoding, we are interested *) (* first byte range: 0xb0 -- 0xfe*) (* second byte range: 0xa1 -- 0xfe*) (*no validation needed here. State machine has done that*) protected function GetOrder(str: PChar): PRInt32; override; public constructor Create; reintroduce; end; TBig5DistributionAnalysis = class (TCharDistributionAnalysis) (*for big5 encoding, we are interested *) (* first byte range: 0xa4 -- 0xfe*) (* second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe*) (*no validation needed here. State machine has done that*) protected function GetOrder(str: PChar): PRInt32; override; public constructor Create; reintroduce; end; TSJISDistributionAnalysis = class (TCharDistributionAnalysis) (*for sjis encoding, we are interested *) (* first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe*) (* second byte range: 0x40 -- 0x7e, 0x81 -- oxfe*) (*no validation needed here. State machine has done that*) protected function GetOrder(str: PChar): PRInt32; override; public constructor Create; reintroduce; end; TEUCJPDistributionAnalysis = class (TCharDistributionAnalysis) (*for euc-JP encoding, we are interested *) (* first byte range: 0xa0 -- 0xfe*) (* second byte range: 0xa1 -- 0xfe*) (*no validation needed here. State machine has done that*) protected function GetOrder(str: PChar): PRInt32; override; public constructor Create; reintroduce; end; implementation uses JISFreq, Big5Freq, EUCKRFreq, EUCTWFreq, GB2312Freq; destructor TCharDistributionAnalysis.Destroy; begin mCharToFreqOrder := nil; inherited; end; procedure TCharDistributionAnalysis.HandleOneChar(aStr: PChar; aCharLen: PRUint32); var order: integer; begin (*we only care about 2-bytes character in our distribution analysis*) if (aCharLen=2) then order := GetOrder(aStr) else order := -1; if order >= 0 then begin inc(mTotalChars); (*order is valid*) if order < integer(mTableSize) then begin if 512 > aPRint16(mCharToFreqOrder)[order] then inc(mFreqChars); end; end; end; function TCharDistributionAnalysis.GetConfidence: float; var r: float; begin (*if we didn't receive any character in our consideration range, return negative answer*) if mTotalChars <= 0 then begin Result := SURE_NO; exit; end; if mTotalChars <> mFreqChars then begin r := mFreqChars / ((mTotalChars - mFreqChars) * mTypicalDistributionRatio); if r < SURE_YES then begin Result := r; exit; end; end; (*normalize confidence, (we don't want to be 100% sure)*) Result := SURE_YES; end; procedure TCharDistributionAnalysis.Reset; begin mTotalChars := 0; mFreqChars := 0; end; function TCharDistributionAnalysis.GotEnoughData: Boolean; begin Result := (mTotalChars > ENOUGH_DATA_THRESHOLD); end; constructor TEUCTWDistributionAnalysis.Create; begin inherited Create; mCharToFreqOrder := @EUCTWCharToFreqOrder; mTableSize := EUCTW_TABLE_SIZE; mTypicalDistributionRatio := EUCTW_TYPICAL_DISTRIBUTION_RATIO; end; function TEUCTWDistributionAnalysis.GetOrder(str: PChar): PRInt32; begin if byte(str^) >= $c4 then Result := 94 * (byte(str[0]) - $c4) + byte(str[1]) - byte($a1) else Result := -1; end; constructor TEUCKRDistributionAnalysis.Create; begin inherited Create; mCharToFreqOrder := @EUCKRCharToFreqOrder; mTableSize := EUCKR_TABLE_SIZE; mTypicalDistributionRatio := EUCKR_TYPICAL_DISTRIBUTION_RATIO; end; function TEUCKRDistributionAnalysis.GetOrder(str: PChar): PRInt32; begin if byte(str^) >= $b0 then Result := 94 * (byte(str[0]) - $b0) + byte(str[1]) - $a1 else Result := -1; end; constructor TGB2312DistributionAnalysis.Create; begin inherited; mCharToFreqOrder := @GB2312CharToFreqOrder; mTableSize := GB2312_TABLE_SIZE; mTypicalDistributionRatio := GB2312_TYPICAL_DISTRIBUTION_RATIO; end; function TGB2312DistributionAnalysis.GetOrder(str: PChar): PRInt32; begin if (byte(str[0]) >= $b0) and (byte(str[1]) >= $a1) then Result := 94 * (byte(str[0]) - $b0) + byte(str[1]) - $a1 else Result := -1; end; constructor TBig5DistributionAnalysis.Create; begin inherited; mCharToFreqOrder := @Big5CharToFreqOrder; mTableSize := BIG5_TABLE_SIZE; mTypicalDistributionRatio := BIG5_TYPICAL_DISTRIBUTION_RATIO; end; function TBig5DistributionAnalysis.GetOrder(str: PChar): PRInt32; begin if byte(str[0]) >= $a4 then begin if byte(str[1]) >= $a1 then Result := 157 * (byte(str[0]) - $a4) + byte(str[1]) - $a1 + 63 else Result := 157 * (byte(str[0]) - $a4) + byte(str[1]) - $40; end else Result:= -1; end; constructor TSJISDistributionAnalysis.Create; begin inherited Create; mCharToFreqOrder := @JISCharToFreqOrder; mTableSize := JIS_TABLE_SIZE; mTypicalDistributionRatio := JIS_TYPICAL_DISTRIBUTION_RATIO; end; function TSJISDistributionAnalysis.GetOrder(str: PChar): PRInt32; var order: PRInt32; begin if (byte(str[0]) >= $81) and (byte(str[0]) <= $9f) then order := 188 * (byte(str[0]) - $81) else if (byte(str[0]) >= $e0) and (byte(str[0]) <= $ef) then order := 188 * (byte(str[0]) - $e0 + 31) else begin Result:= -1; exit; end; order := order + (byte((str+1)^) - $40); if byte(str[1]) > $7f then dec(order); Result := order; end; constructor TEUCJPDistributionAnalysis.Create; begin inherited Create; mCharToFreqOrder := @JISCharToFreqOrder; mTableSize := JIS_TABLE_SIZE; mTypicalDistributionRatio := JIS_TYPICAL_DISTRIBUTION_RATIO; end; function TEUCJPDistributionAnalysis.GetOrder(str: PChar): PRInt32; begin if byte(str[0]) >= $a0 then Result := 94 * (byte(str[0]) - $a1) + byte(str[1]) - $a1 else Result:= -1; end; end. doublecmd-0.5.8/components/chsdet/src/nsGroupProber.pas0000644000175000017500000001410612014201074022241 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: nsGroupProber.pas,v 1.2 2007/05/26 13:09:38 ya_nick Exp $ unit nsGroupProber; interface uses {$I dbg.inc} nsCore, CustomDetector; type TnsGroupProber = class(TCustomDetector) protected mNumOfProbers: integer; mProbers: array of TCustomDetector; mIsActive: array of Boolean; mBestGuess: integer; mActiveNum: integer; mProberStates: array of eProbingState; public constructor Create; override; destructor Destroy; override; procedure Reset; override; function HandleData(aBuf: PChar; aLen: integer): eProbingState; override; function GetDetectedCharset: eInternalCharsetID; override; function GetConfidence: float; override; function EnableCharset(Charset: eInternalCharsetID; NewValue: Boolean): Boolean; {$ifdef DEBUG_chardet} procedure DumpStatus(Dump: string); override; {$endif} end; implementation uses SysUtils {$ifdef DEBUG_chardet} ,TypInfo {$endif} ; { TnsGroupProber } constructor TnsGroupProber.Create; begin inherited Create; Self.Reset; end; destructor TnsGroupProber.Destroy; var i: integer; begin for i := 0 to Pred(mNumOfProbers) do if mProbers[i] <> nil then mProbers[i].Free; SetLength(mProbers, 0); SetLength(mProberStates, 0); SetLength(mIsActive, 0); inherited; end; function TnsGroupProber.GetDetectedCharset: eInternalCharsetID; begin (*if we have no answer yet*) if mBestGuess = -1 then begin GetConfidence; (*no charset seems positive*) if mBestGuess = -1 then mBestGuess:= 0; (*we will use default.*) end; Result := mProbers[mBestGuess].GetDetectedCharset; end; function TnsGroupProber.HandleData(aBuf: PChar; aLen: integer): eProbingState; var i: integer; begin {$IFDEF DEBUG_chardet} AddDump('Group Prober - HandleData - start'); {$endif} for i:=0 to Pred(mNumOfProbers) do begin if (mProberStates[i] = psNotMe) or (mProberStates[i] = psFoundIt) then continue; mProberStates[i] := mProbers[i].HandleData(aBuf, aLen); if mProberStates[i] = psFoundIt then begin mBestGuess := i; mState := psFoundIt; break; end else if mProberStates[i] = psNotMe then begin mIsActive[i] := FALSE; dec(mActiveNum); if mActiveNum <= 0 then begin mState := psNotMe; break; end; end; end; Result := mState; {$IFDEF DEBUG_chardet} DumpStatus('Group Prober - HandleData - exit'); {$endif} end; procedure TnsGroupProber.Reset; var i: integer; begin mActiveNum := 0; for i := 0 to Pred(mNumOfProbers) do begin if mProbers[i] <> nil then begin mProbers[i].Reset; mIsActive[i] := mProbers[i].Enabled; if mProbers[i].Enabled then begin mProberStates[i] := psDetecting; inc(mActiveNum); end else mProberStates[i] := psNotMe; end else mIsActive[i] := FALSE; end; mBestGuess := -1; mEnabled := (mActiveNum > 0); if mEnabled then mState := psDetecting else mState := psNotMe; end; function TnsGroupProber.GetConfidence: float; var i: integer; bestConf: float; cf: float; begin bestConf := 0.0; case mState of psFoundIt: begin Result := SURE_YES; (*sure yes*) exit; end; psNotMe: begin Result := SURE_NO; (*sure no*) exit; end; else for i := 0 to Pred(mNumOfProbers) do begin if not mIsActive[i] then continue; cf := mProbers[i].GetConfidence; if bestConf < cf then begin bestConf := cf; mBestGuess := i; end; end; end;{case} {$IFDEF DEBUG_chardet} DumpStatus('Group Prober - GetConfidience'); {$endif} Result := bestConf; end; function TnsGroupProber.EnableCharset(Charset: eInternalCharsetID; NewValue: Boolean): Boolean; var i: integer; begin for i := 0 to Pred(mNumOfProbers) do if mProbers[i].GetDetectedCharset = Charset then begin Result := true; mProbers[i].Enabled := NewValue; exit; end; Result := false; end; {$ifdef DEBUG_chardet} procedure TnsGroupProber.DumpStatus(Dump: string); var i: integer; begin inherited DumpStatus(Dump); inherited DumpStatus(Format('%30s - %5s - %5s', ['Prober', 'Active', 'Conf'])); for i := 0 to Pred(mNumOfProbers) do inherited DumpStatus(Format('%30s - %5s - %1.5f', [GetEnumName(TypeInfo(eInternalCharsetID), integer(mProbers[i].GetDetectedCharset)), BoolToStr(mIsActive[i], True), mProbers[i].GetConfidence])); end; {$endif} end. doublecmd-0.5.8/components/chsdet/src/EUCSampler.pas0000644000175000017500000001002112014201074021362 0ustar alexxalexxunit EUCSampler; interface const FreqSize = 94; type rEUCStatistics = record mFirstByteFreq: array[0..Pred(FreqSize)] of Double; mFirstByteStdDev, mFirstByteMean, mFirstByteWeight: Double; mSecoundByteFreq: array [0..Pred(FreqSize)] of Double; mSecoundByteStdDev, mSecoundByteMean, mSecoundByteWeight: Double; end; prEUCStatistics = ^rEUCStatistics; type TEUCSampler = class (TObject) private mTotal, mThreshold, mState: integer; mFirstByteCnt: array [0..Pred(FreqSize)] of integer; mSecondByteCnt: array [0..Pred(FreqSize)] of integer; mFirstByteFreq: array [0..Pred(FreqSize)] of double; mSecondByteFreq: array [0..Pred(FreqSize)] of double; public constructor Create; destructor Destroy; override; function Sample(aIn: pChar; aLen: integer): Boolean; function GetSomeData: Boolean; function EnoughData: Boolean; procedure CalFreq; function GetScore(const aFirstByteFreq: array of Double; aFirstByteWeight: Double; const aSecondByteFreq: array of Double; aSecondByteWeight: Double): double; overload; virtual; function GetScore(const array1, array2: array of Double): double; overload; virtual; procedure Reset; end; implementation { TEUCSampler } procedure TEUCSampler.CalFreq; var i: integer; begin for i := 0 to Pred(FreqSize) do begin mFirstByteFreq[i] := mFirstByteCnt[i] / mTotal; mSecondByteFreq[i] := mSecondByteCnt[i] / mTotal; end; end; constructor TEUCSampler.Create; begin inherited; Reset; end; destructor TEUCSampler.Destroy; begin inherited; end; function TEUCSampler.EnoughData: Boolean; begin Result := mTotal > mThreshold; end; function TEUCSampler.GetScore(const aFirstByteFreq: array of Double; aFirstByteWeight: Double; const aSecondByteFreq: array of Double; aSecondByteWeight: Double): double; begin Result := aFirstByteWeight * GetScore(aFirstByteFreq, mFirstByteFreq) + aSecondByteWeight * GetScore(aSecondByteFreq, mSecondByteFreq); end; function TEUCSampler.GetScore(const array1, array2: array of Double): double; var s, sum: Double; i: integer; begin sum := 0.0; for i := 0 to Pred(FreqSize) do begin s := array1[i] - array2[i]; sum := sum + s * s; end; Result := sqrt(sum) / (FreqSize*1.0); end; function TEUCSampler.GetSomeData: Boolean; begin Result := mTotal > 1; end; procedure TEUCSampler.Reset; var i: integer; begin mTotal := 0; mThreshold := 200; mState := 0; for i := 0 to Pred(FreqSize) do begin mFirstByteCnt[i] := 0; mSecondByteCnt[i] := 0; end; end; function TEUCSampler.Sample(aIn: pChar; aLen: integer): Boolean; const MAX_LENGTH: integer = MaxInt;// $80000000; var i: integer; p: pChar; begin if (mState = 1) then begin Result := FALSE; exit; end; p := aIn; if (aLen + mTotal > MAX_LENGTH) then aLen := MAX_LENGTH - mTotal; i := 0; while (i < aLen) and (mState <> 1) do begin case mState of 0: if (byte(p^) and $0080) > 0 then begin if (byte(p^) = $00ff) or ( byte(p^) < $00a1) then mState := 1 else begin Inc(mTotal); Inc(mFirstByteCnt[byte(p^) - $00a1]); mState := 2; end; end; 1: begin end; 2: if ( byte(p^) and $0080) > 0 then begin if(byte(p^) = $00ff) or (byte(p^) < $00a1) then mState := 1 else begin Inc(mTotal); Inc(mSecondByteCnt[byte(p^) - $00a1]); mState := 0; end; end else mState := 1; else mState := 1; end; Inc(i); Inc(p); end; Result := ( mState <> 1 ); end; end. doublecmd-0.5.8/components/chsdet/src/nsCodingStateMachine.pas0000644000175000017500000000710512014201074023465 0ustar alexxalexx// +----------------------------------------------------------------------+ // | chsdet - Charset Detector Library | // +----------------------------------------------------------------------+ // | Copyright (C) 2006, Nick Yakowlew http://chsdet.sourceforge.net | // +----------------------------------------------------------------------+ // | Based on Mozilla sources http://www.mozilla.org/projects/intl/ | // +----------------------------------------------------------------------+ // | This library is free software; you can redistribute it and/or modify | // | it under the terms of the GNU General Public License as published by | // | the Free Software Foundation; either version 2 of the License, or | // | (at your option) any later version. | // | This library is distributed in the hope that it will be useful | // | but WITHOUT ANY WARRANTY; without even the implied warranty of | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | // | See the GNU Lesser General Public License for more details. | // | http://www.opensource.org/licenses/lgpl-license.php | // +----------------------------------------------------------------------+ // // $Id: nsCodingStateMachine.pas,v 1.3 2007/05/26 13:09:38 ya_nick Exp $ unit nsCodingStateMachine; {$R-} interface uses nsCore; type nsSMState = ( eStart = 0, eError = 1, eItsMe = 2 ); (*state machine model*) type SMModel = record classTable: Pointer; //nsPkgInt; classFactor: PRUint32; stateTable: Pointer; //nsPkgInt; charLenTable: Pointer; // pByteArray; // array of byte; // pPRUint32; CharsetID: eInternalCharsetID; end; pSMModel = ^SMModel; type TnsCodingStateMachine = class (TObject) protected mCurrentState: nsSMState; mCurrentCharLen: PRUint32; mCurrentBytePos: PRUint32; mModel: SMModel; public Enabled: Boolean; constructor Create(sm: SMModel); destructor Destroy; override; function NextState(c: char): nsSMState; function GetCurrentCharLen: PRUint32; procedure Reset; function GetCharsetID: eInternalCharsetID; property LangModel: SMModel read mModel; end; implementation { TnsCodingStateMachine } constructor TnsCodingStateMachine.Create(sm: SMModel); begin mCurrentState:= eStart; mModel := sm; Enabled := true; end; destructor TnsCodingStateMachine.Destroy; begin mModel.classTable := nil; mModel.stateTable := nil; mModel.charLenTable := nil; inherited; end; function TnsCodingStateMachine.NextState(c: char): nsSMState; var byteCls: PRUint32; begin if not Enabled then begin Result := eError; exit; end; (*for each byte we get its class , if it is first byte, we also get byte length*) byteCls := pByteArray(mModel.classTable)[integer(c)]; if mCurrentState = eStart then begin mCurrentBytePos := 0; mCurrentCharLen := pByteArray(mModel.charLenTable)[byteCls]; end; (*from byte's class and stateTable, we get its next state*) mCurrentState := nsSMState(pByteArray(mModel.stateTable)[cardinal(mCurrentState) * mModel.classFactor + byteCls]); inc(mCurrentBytePos); //if mCurrentBytePos > mCurrentCharLen then // mCurrentState := eError; Result:= mCurrentState; end; function TnsCodingStateMachine.GetCurrentCharLen: PRUint32; begin Result:= mCurrentCharLen; end; procedure TnsCodingStateMachine.Reset; begin mCurrentState:= eStart; end; function TnsCodingStateMachine.GetCharsetID: eInternalCharsetID; begin Result:= mModel.CharsetID; end; end. doublecmd-0.5.8/components/chsdet/src/MultiModelProber.pas0000644000175000017500000001331412014201074022657 0ustar alexxalexxunit MultiModelProber; interface uses {$I dbg.inc} nsCore, CustomDetector, nsCodingStateMachine; type TMultiModelProber = class (TCustomDetector) private protected mDetectedCharset: eInternalCharsetID; mActiveSM: integer; mCharsetsCount: integer; mSMState: array of eProbingState; mCodingSM: array of TnsCodingStateMachine; procedure AddCharsetModel(Model: SMModel); public constructor Create; override; destructor Destroy; override; function HandleData(aBuf: PChar; aLen: integer): eProbingState; override; function GetDetectedCharset: eInternalCharsetID; override; procedure Reset; override; function EnableCharset(Charset: eInternalCharsetID; NewValue: Boolean): Boolean; {$ifdef DEBUG_chardet} procedure DumpStatus(Dump: string); override; {$endif} function GetConfidence: float; override; end; implementation {$ifdef DEBUG_chardet} uses SysUtils, TypInfo; {$endif} { TMultiModelProber } constructor TMultiModelProber.Create; begin inherited; mCharsetsCount := 0; end; destructor TMultiModelProber.Destroy; var i: integer; begin for i := 0 to Pred(mCharsetsCount) do begin mCodingSM[i].Free; mCodingSM[i] := nil; end; SetLength(mCodingSM, 0); inherited; end; procedure TMultiModelProber.AddCharsetModel(Model: SMModel); begin inc(mCharsetsCount); SetLength(mCodingSM, mCharsetsCount); SetLength(mSMState, mCharsetsCount); mCodingSM[Pred(mCharsetsCount)] := TnsCodingStateMachine.Create(Model); mSMState[Pred(mCharsetsCount)] := psDetecting; Reset; end; function TMultiModelProber.GetDetectedCharset: eInternalCharsetID; begin Result := mDetectedCharset; end; function TMultiModelProber.HandleData(aBuf: PChar; aLen: integer): eProbingState; var codingState: nsSMState; j: integer; i: integer; begin {$IFDEF DEBUG_chardet} AddDump('Multi Model - HandleData - start'); {$endif} Result := mState; for i := 0 to Pred(aLen) do begin // if mState = psDetecting then // break; for j := mCharsetsCount - 1 downto 0 do begin // skip disabled if (not mCodingSM[j].Enabled) or (mSMState[j] = psNotMe) then continue; (*byte is feed to all active state machine *) codingState := mCodingSM[j].NextState(aBuf[i]); if codingState = eError then begin (*got negative answer for this state machine, make it inactive*) mSMState[j] := psNotMe; dec(mActiveSM); if mActiveSM = 0 then begin mState:= psNotMe; Result:= mState; {$IFDEF DEBUG_chardet} DumpStatus('Multi Model - HandleData - NOT ME!'); {$endif} exit; end; end else if codingState = eItsMe then begin {$IFDEF DEBUG_chardet} DumpStatus('Multi Model - HandleData - FOUND IT!'); {$endif} mSMState[j] := psFoundIt; mState := psFoundIt; mDetectedCharset := mCodingSM[j].GetCharsetID; Result:= mState; exit; end; end; // if codingState = eError end; if mActiveSM = 1 then begin for i := 0 to Pred(mCharsetsCount) do if (mSMState[i] <> psNotMe) then begin // TODO - set confidience ? or.... // signalised that it's not sure if GetConfidence > SURE_NO then begin mSMState[i] := psFoundIt; mState := psFoundIt; mDetectedCharset := mCodingSM[i].GetCharsetID; break; end; end; end else Result := mState; {$IFDEF DEBUG_chardet} DumpStatus('Multi Model - HandleData - EXIT.'); {$endif} end; procedure TMultiModelProber.Reset; var i: integer; begin mState:= psDetecting; for i := 0 to Pred(mCharsetsCount) do begin mCodingSM[i].Reset; if mCodingSM[i].Enabled then mSMState[i] := psDetecting else mSMState[i] := psNotMe; end; mActiveSM := mCharsetsCount; mDetectedCharset := UNKNOWN_CHARSET; end; function TMultiModelProber.EnableCharset(Charset: eInternalCharsetID; NewValue: Boolean): Boolean; var i: integer; begin for i := 0 to Pred(mCharsetsCount) do if mCodingSM[i].GetCharsetID = Charset then begin Result := true; mCodingSM[i].Enabled := NewValue; exit; end; Result := false; end; function TMultiModelProber.GetConfidence: float; var i: integer; begin Result := SURE_NO; case mState of psNotMe: begin Result := SURE_NO; mDetectedCharset := UNKNOWN_CHARSET; end; else for i := 0 to Pred(mCharsetsCount) do if (mSMState[i] = psFoundIt) or ((mSMState[i] = psDetecting) and (mActiveSM = 1)) then begin Result := SURE_YES; mDetectedCharset := mCodingSM[i].GetCharsetID; break; end; end;{case} end; {$ifdef DEBUG_chardet} procedure TMultiModelProber.DumpStatus(Dump: string); var i: integer; begin inherited DumpStatus(Dump + ' Current state ' + GetEnumName(TypeInfo(eProbingState), integer(mState))); inherited DumpStatus(Format('%30s - %5s', ['Prober', 'State' ])); for i := 0 to Pred(mCharsetsCount) do inherited DumpStatus(Format('%30s - %5s', [GetEnumName(TypeInfo(eInternalCharsetID), integer(mCodingSM[i].GetCharsetID)), GetEnumName(TypeInfo(eProbingState), integer(mSMState[i])) ])); end; {$endif} end. doublecmd-0.5.8/components/doublecmd/0000755000175000017500000000000012257501472016636 5ustar alexxalexxdoublecmd-0.5.8/components/doublecmd/dcxmlconfig.pas0000644000175000017500000006075712073434700021652 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Implementation of configuration file in XML. Based on XmlConf from fcl-xml package. Copyright (C) 2010 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit DCXmlConfig; {$mode objfpc}{$H+} interface uses Classes, SysUtils, DOM, XMLRead, XMLWrite; type // Define type aliases so we don't have to include DOM if we want to use config. TXmlNode = TDOMNode; TXmlPath = DOMString; { TXmlConfig } TXmlConfig = class private FFileName: UTF8String; FDoc: TXMLDocument; function GetRootNode: TXmlNode; procedure SplitPathToNodeAndAttr(const Path: DOMString; out NodePath: DOMString; out AttrName: DOMString); public constructor Create; virtual; constructor Create(const AFileName: UTF8String; AutoLoad: Boolean = False); virtual; destructor Destroy; override; procedure Clear; function AddNode(const RootNode: TDOMNode; const ValueName: DOMString): TDOMNode; procedure DeleteNode(const RootNode: TDOMNode; const Path: DOMString); procedure DeleteNode(const Node: TDOMNode); procedure ClearNode(const Node: TDOMNode); function FindNode(const RootNode: TDOMNode; const Path: DOMString; bCreate: Boolean = False): TDOMNode; function GetContent(const Node: TDOMNode): UTF8String; function IsEmpty: Boolean; procedure SetContent(const Node: TDOMNode; const AValue: UTF8String); // ------------------------------------------------------------------------ function GetAttr(const RootNode: TDOMNode; const Path: DOMString; const ADefault: UTF8String): UTF8String; function GetAttr(const RootNode: TDOMNode; const Path: DOMString; const ADefault: Boolean): Boolean; function GetAttr(const RootNode: TDOMNode; const Path: DOMString; const ADefault: Integer): Integer; function GetAttr(const RootNode: TDOMNode; const Path: DOMString; const ADefault: Int64): Int64; function GetAttr(const RootNode: TDOMNode; const Path: DOMString; const ADefault: Double): Double; function GetValue(const RootNode: TDOMNode; const Path: DOMString; const ADefault: UTF8String): UTF8String; function GetValue(const RootNode: TDOMNode; const Path: DOMString; const ADefault: Boolean): Boolean; function GetValue(const RootNode: TDOMNode; const Path: DOMString; const ADefault: Integer): Integer; function GetValue(const RootNode: TDOMNode; const Path: DOMString; const ADefault: Int64): Int64; function GetValue(const RootNode: TDOMNode; const Path: DOMString; const ADefault: Double): Double; // The Try... functions return True if the attribute/node was found and only then set AValue. function TryGetAttr(const RootNode: TDOMNode; const Path: DOMString; out AValue: UTF8String): Boolean; function TryGetAttr(const RootNode: TDOMNode; const Path: DOMString; out AValue: Boolean): Boolean; function TryGetAttr(const RootNode: TDOMNode; const Path: DOMString; out AValue: Integer): Boolean; function TryGetAttr(const RootNode: TDOMNode; const Path: DOMString; out AValue: Int64): Boolean; function TryGetAttr(const RootNode: TDOMNode; const Path: DOMString; out AValue: Double): Boolean; function TryGetValue(const RootNode: TDOMNode; const Path: DOMString; out AValue: UTF8String): Boolean; function TryGetValue(const RootNode: TDOMNode; const Path: DOMString; out AValue: Boolean): Boolean; function TryGetValue(const RootNode: TDOMNode; const Path: DOMString; out AValue: Integer): Boolean; function TryGetValue(const RootNode: TDOMNode; const Path: DOMString; out AValue: Int64): Boolean; function TryGetValue(const RootNode: TDOMNode; const Path: DOMString; out AValue: Double): Boolean; // ------------------------------------------------------------------------ // AddValue functions always add a new node. procedure AddValue(const RootNode: TDOMNode; const ValueName: DOMString; const AValue: String); procedure AddValue(const RootNode: TDOMNode; const ValueName: DOMString; const AValue: Boolean); procedure AddValue(const RootNode: TDOMNode; const ValueName: DOMString; const AValue: Integer); procedure AddValue(const RootNode: TDOMNode; const ValueName: DOMString; const AValue: Int64); procedure AddValue(const RootNode: TDOMNode; const ValueName: DOMString; const AValue: Double); procedure AddValueDef(const RootNode: TDOMNode; const ValueName: DOMString; const AValue, DefaultValue: String); procedure AddValueDef(const RootNode: TDOMNode; const ValueName: DOMString; const AValue, DefaultValue: Boolean); procedure AddValueDef(const RootNode: TDOMNode; const ValueName: DOMString; const AValue, DefaultValue: Integer); procedure AddValueDef(const RootNode: TDOMNode; const ValueName: DOMString; const AValue, DefaultValue: Int64); procedure AddValueDef(const RootNode: TDOMNode; const ValueName: DOMString; const AValue, DefaultValue: Double); // SetValue functions can only set values for unique paths. procedure SetAttr(const RootNode: TDOMNode; const Path: DOMString; const AValue: UTF8String); procedure SetAttr(const RootNode: TDOMNode; const Path: DOMString; const AValue: Boolean); procedure SetAttr(const RootNode: TDOMNode; const Path: DOMString; const AValue: Integer); procedure SetAttr(const RootNode: TDOMNode; const Path: DOMString; const AValue: Int64); procedure SetAttr(const RootNode: TDOMNode; const Path: DOMString; const AValue: Double); procedure SetValue(const RootNode: TDOMNode; const Path: DOMString; const AValue: String); procedure SetValue(const RootNode: TDOMNode; const Path: DOMString; const AValue: Boolean); procedure SetValue(const RootNode: TDOMNode; const Path: DOMString; const AValue: Integer); procedure SetValue(const RootNode: TDOMNode; const Path: DOMString; const AValue: Int64); procedure SetValue(const RootNode: TDOMNode; const Path: DOMString; const AValue: Double); // ------------------------------------------------------------------------ procedure GetFont(const aNode: TXmlNode; Path: TXmlPath; out Name: UTF8String; out Size: Integer; out Style: Integer; const DefName: UTF8String; const DefSize: Integer; const DefStyle: Integer); procedure SetFont(const aNode: TXmlNode; Path: TXmlPath; const Name: UTF8String; const Size: Integer; const Style: Integer); // ------------------------------------------------------------------------ procedure ReadFromFile(const AFilename: UTF8String); procedure ReadFromStream(AStream: TStream); procedure WriteToFile(const AFilename: UTF8String); procedure WriteToStream(AStream: TStream); function Load: Boolean; function LoadBypassingErrors: Boolean; function Save: Boolean; {en Get path of form "//...". } function GetPathFromNode(aNode: TDOMNode): String; property FileName: UTF8String read FFileName write FFileName; property RootNode: TXmlNode read GetRootNode; end; EXmlConfigEmpty = class(EFilerError); EXmlConfigNotFound = class(EFilerError); implementation uses LazUTF8, LazLogger, DCOSUtils, DCClassesUtf8, URIParser; const BoolStrings: array[Boolean] of DOMString = ('False', 'True'); constructor TXmlConfig.Create; begin Clear; end; constructor TXmlConfig.Create(const AFileName: UTF8String; AutoLoad: Boolean); begin FFileName := AFileName; if not (AutoLoad and LoadBypassingErrors) then Clear; end; destructor TXmlConfig.Destroy; begin FreeAndNil(FDoc); inherited Destroy; end; procedure TXmlConfig.Clear; begin FreeAndNil(FDoc); FDoc := TXMLDocument.Create; FDoc.AppendChild(FDoc.CreateElement(ApplicationName)); end; function TXmlConfig.GetRootNode: TXmlNode; begin Result := FDoc.DocumentElement; end; // ------------------------------------------------------------------------ function TXmlConfig.GetAttr(const RootNode: TDOMNode; const Path: DOMString; const ADefault: UTF8String): UTF8String; begin if not TryGetAttr(RootNode, Path, Result) then Result := ADefault; end; function TXmlConfig.GetAttr(const RootNode: TDOMNode; const Path: DOMString; const ADefault: Boolean): Boolean; begin if not TryGetAttr(RootNode, Path, Result) then Result := ADefault; end; function TXmlConfig.GetAttr(const RootNode: TDOMNode; const Path: DOMString; const ADefault: Integer): Integer; begin if not TryGetAttr(RootNode, Path, Result) then Result := ADefault; end; function TXmlConfig.GetAttr(const RootNode: TDOMNode; const Path: DOMString; const ADefault: Int64): Int64; begin if not TryGetAttr(RootNode, Path, Result) then Result := ADefault; end; function TXmlConfig.GetAttr(const RootNode: TDOMNode; const Path: DOMString; const ADefault: Double): Double; begin if not TryGetAttr(RootNode, Path, Result) then Result := ADefault; end; function TXmlConfig.TryGetAttr(const RootNode: TDOMNode; const Path: DOMString; out AValue: UTF8String): Boolean; var Node: TDOMNode; Attr: TDOMAttr; NodePath, AttrName: DOMString; begin SplitPathToNodeAndAttr(Path, NodePath, AttrName); if NodePath <> EmptyWideStr then begin Node := FindNode(RootNode, NodePath, False); if not Assigned(Node) then Exit(False); end else Node := RootNode; Attr := TDOMElement(Node).GetAttributeNode(AttrName); Result := Assigned(Attr); if Result then AValue := UTF16ToUTF8(Attr.Value); end; function TXmlConfig.TryGetAttr(const RootNode: TDOMNode; const Path: DOMString; out AValue: Boolean): Boolean; var sValue: UTF8String; begin Result := TryGetAttr(RootNode, Path, sValue); if Result then begin if SameText(sValue, 'TRUE') then AValue := True else if SameText(sValue, 'FALSE') then AValue := False else Result := False; // If other text then return not found. end; end; function TXmlConfig.TryGetAttr(const RootNode: TDOMNode; const Path: DOMString; out AValue: Integer): Boolean; var sValue: UTF8String; begin Result := TryGetAttr(RootNode, Path, sValue) and TryStrToInt(sValue, AValue); end; function TXmlConfig.TryGetAttr(const RootNode: TDOMNode; const Path: DOMString; out AValue: Int64): Boolean; var sValue: UTF8String; begin Result := TryGetAttr(RootNode, Path, sValue) and TryStrToInt64(sValue, AValue); end; function TXmlConfig.TryGetAttr(const RootNode: TDOMNode; const Path: DOMString; out AValue: Double): Boolean; var sValue: UTF8String; begin Result := TryGetAttr(RootNode, Path, sValue) and TryStrToFloat(sValue, AValue); end; function TXmlConfig.GetValue(const RootNode: TDOMNode; const Path: DOMString; const ADefault: UTF8String): UTF8String; var Node: TDOMNode; begin Node := FindNode(RootNode, Path, False); if Assigned(Node) then Result := UTF16ToUTF8(Node.TextContent) else Result := ADefault; end; function TXmlConfig.IsEmpty: Boolean; begin Result := RootNode.ChildNodes.Count = 0; end; function TXmlConfig.GetValue(const RootNode: TDOMNode; const Path: DOMString; const ADefault: Boolean): Boolean; var sValue: UTF8String; begin sValue := GetValue(RootNode, Path, ''); if SameText(sValue, 'TRUE') then Result := True else if SameText(sValue, 'FALSE') then Result := False else Result := ADefault; end; function TXmlConfig.GetValue(const RootNode: TDOMNode; const Path: DOMString; const ADefault: Integer): Integer; begin Result := StrToIntDef(GetValue(RootNode, Path, ''), ADefault); end; function TXmlConfig.GetValue(const RootNode: TDOMNode; const Path: DOMString; const ADefault: Int64): Int64; begin Result := StrToInt64Def(GetValue(RootNode, Path, ''), ADefault); end; function TXmlConfig.GetValue(const RootNode: TDOMNode; const Path: DOMString; const ADefault: Double): Double; begin Result := StrToFloatDef(GetValue(RootNode, Path, ''), ADefault); end; function TXmlConfig.TryGetValue(const RootNode: TDOMNode; const Path: DOMString; out AValue: UTF8String): Boolean; var Node: TDOMNode; begin Node := FindNode(RootNode, Path, False); Result := Assigned(Node); if Result then AValue := UTF16ToUTF8(Node.TextContent); end; function TXmlConfig.TryGetValue(const RootNode: TDOMNode; const Path: DOMString; out AValue: Boolean): Boolean; var sValue: UTF8String; begin Result := TryGetValue(RootNode, Path, sValue); if Result then begin if SameText(sValue, 'TRUE') then AValue := True else if SameText(sValue, 'FALSE') then AValue := False else Result := False; // If other text then return not found. end; end; function TXmlConfig.TryGetValue(const RootNode: TDOMNode; const Path: DOMString; out AValue: Integer): Boolean; var sValue: UTF8String; begin Result := TryGetValue(RootNode, Path, sValue) and TryStrToInt(sValue, AValue); end; function TXmlConfig.TryGetValue(const RootNode: TDOMNode; const Path: DOMString; out AValue: Int64): Boolean; var sValue: UTF8String; begin Result := TryGetValue(RootNode, Path, sValue) and TryStrToInt64(sValue, AValue); end; function TXmlConfig.TryGetValue(const RootNode: TDOMNode; const Path: DOMString; out AValue: Double): Boolean; var sValue: UTF8String; begin Result := TryGetValue(RootNode, Path, sValue) and TryStrToFloat(sValue, AValue); end; // ---------------------------------------------------------------------------- procedure TXmlConfig.AddValue(const RootNode: TDOMNode; const ValueName: DOMString; const AValue: String); var Node: TDOMNode; begin Node := RootNode.AppendChild(FDoc.CreateElement(ValueName)); Node.TextContent := UTF8ToUTF16(AValue); end; procedure TXmlConfig.AddValueDef(const RootNode: TDOMNode; const ValueName: DOMString; const AValue, DefaultValue: Boolean); begin if AValue <> DefaultValue then AddValue(RootNode, ValueName, AValue); end; procedure TXmlConfig.AddValueDef(const RootNode: TDOMNode; const ValueName: DOMString; const AValue, DefaultValue: Double); begin if AValue <> DefaultValue then AddValue(RootNode, ValueName, AValue); end; procedure TXmlConfig.AddValueDef(const RootNode: TDOMNode; const ValueName: DOMString; const AValue, DefaultValue: Int64); begin if AValue <> DefaultValue then AddValue(RootNode, ValueName, AValue); end; procedure TXmlConfig.AddValueDef(const RootNode: TDOMNode; const ValueName: DOMString; const AValue, DefaultValue: Integer); begin if AValue <> DefaultValue then AddValue(RootNode, ValueName, AValue); end; procedure TXmlConfig.AddValueDef(const RootNode: TDOMNode; const ValueName: DOMString; const AValue, DefaultValue: String); begin if AValue <> DefaultValue then AddValue(RootNode, ValueName, AValue); end; procedure TXmlConfig.AddValue(const RootNode: TDOMNode; const ValueName: DOMString; const AValue: Boolean); begin AddValue(RootNode, ValueName, BoolStrings[AValue]); end; procedure TXmlConfig.AddValue(const RootNode: TDOMNode; const ValueName: DOMString; const AValue: Integer); begin AddValue(RootNode, ValueName, IntToStr(AValue)); end; procedure TXmlConfig.AddValue(const RootNode: TDOMNode; const ValueName: DOMString; const AValue: Int64); begin AddValue(RootNode, ValueName, IntToStr(AValue)); end; procedure TXmlConfig.AddValue(const RootNode: TDOMNode; const ValueName: DOMString; const AValue: Double); begin AddValue(RootNode, ValueName, FloatToStr(AValue)); end; procedure TXmlConfig.SetAttr(const RootNode: TDOMNode; const Path: DOMString; const AValue: UTF8String); var Node: TDOMNode; NodePath, AttrName: DOMString; begin SplitPathToNodeAndAttr(Path, NodePath, AttrName); if NodePath <> EmptyWideStr then begin Node := FindNode(RootNode, NodePath, True); TDOMElement(Node)[AttrName] := UTF8ToUTF16(AValue); end else TDOMElement(RootNode)[AttrName] := UTF8ToUTF16(AValue); end; procedure TXmlConfig.SetAttr(const RootNode: TDOMNode; const Path: DOMString; const AValue: Boolean); begin SetAttr(RootNode, Path, BoolStrings[AValue]); end; procedure TXmlConfig.SetAttr(const RootNode: TDOMNode; const Path: DOMString; const AValue: Integer); begin SetAttr(RootNode, Path, IntToStr(AValue)); end; procedure TXmlConfig.SetAttr(const RootNode: TDOMNode; const Path: DOMString; const AValue: Int64); begin SetAttr(RootNode, Path, IntToStr(AValue)); end; procedure TXmlConfig.SetAttr(const RootNode: TDOMNode; const Path: DOMString; const AValue: Double); begin SetAttr(RootNode, Path, FloatToStr(AValue)); end; procedure TXmlConfig.SetValue(const RootNode: TDOMNode; const Path: DOMString; const AValue: String); var Node: TDOMNode; begin Node := FindNode(RootNode, Path, True); Node.TextContent := UTF8ToUTF16(AValue); end; procedure TXmlConfig.SetValue(const RootNode: TDOMNode; const Path: DOMString; const AValue: Boolean); begin SetValue(RootNode, Path, BoolStrings[AValue]); end; procedure TXmlConfig.SetValue(const RootNode: TDOMNode; const Path: DOMString; const AValue: Integer); begin SetValue(RootNode, Path, IntToStr(AValue)); end; procedure TXmlConfig.SetValue(const RootNode: TDOMNode; const Path: DOMString; const AValue: Int64); begin SetValue(RootNode, Path, IntToStr(AValue)); end; procedure TXmlConfig.SetValue(const RootNode: TDOMNode; const Path: DOMString; const AValue: Double); begin SetValue(RootNode, Path, FloatToStr(AValue)); end; // ---------------------------------------------------------------------------- procedure TXmlConfig.ReadFromFile(const AFilename: UTF8String); var FileStream: TStream; TmpDoc: TXMLDocument; begin FileStream := TFileStreamEx.Create(AFilename, fmOpenRead or fmShareDenyWrite); try if FileStream.Size = 0 then raise EXmlConfigEmpty.Create(''); ReadXMLFile(TmpDoc, FileStream, FilenameToURI(AFilename)); if TmpDoc.DocumentElement.NodeName <> ApplicationName then raise EXMLReadError.Create('Root element is not <' + ApplicationName + '>.'); FDoc.Free; FDoc := TmpDoc; finally FileStream.Free; end; end; procedure TXmlConfig.ReadFromStream(AStream: TStream); var TmpDoc: TXMLDocument; begin if AStream.Size = 0 then raise EXmlConfigEmpty.Create(''); ReadXMLFile(TmpDoc, AStream); FDoc.Free; FDoc := TmpDoc; end; procedure TXmlConfig.WriteToFile(const AFilename: UTF8String); var FileStream: TStream; begin FileStream := TFileStreamEx.Create(AFilename, fmCreate or fmShareDenyWrite); try WriteXMLFile(FDoc, FileStream); finally FileStream.Free; end; end; procedure TXmlConfig.WriteToStream(AStream: TStream); begin WriteXMLFile(FDoc, AStream); end; function TXmlConfig.Load: Boolean; begin Result := False; if FFileName = '' then Exit; if not mbFileExists(FileName) then raise EXmlConfigNotFound.Create(''); if not mbFileAccess(FileName, fmOpenRead or fmShareDenyWrite) then raise EFOpenError.Create(SysErrorMessage(GetLastOSError)); ReadFromFile(FileName); Result := True; end; function TXmlConfig.LoadBypassingErrors: Boolean; var ErrMsg: String; begin try Result := Load; except on e: Exception do begin ErrMsg := 'Error loading configuration file ' + FileName; if e.Message <> EmptyStr then ErrMsg := ErrMsg + ': ' + e.Message; DebugLogger.DebugLn(ErrMsg); Result := False; end; end; end; function TXmlConfig.Save: Boolean; var sTmpConfigFileName: String; begin Result := False; if FFileName = '' then Exit; // Write to temporary file and if successfully written rename to proper name. if (not mbFileExists(FileName)) or mbFileAccess(FileName, fmOpenWrite or fmShareDenyWrite) then begin sTmpConfigFileName := GetTempName(FileName); try WriteToFile(sTmpConfigFileName); if not mbRenameFile(sTmpConfigFileName, FileName) then begin mbDeleteFile(sTmpConfigFileName); DebugLogger.Debugln('Cannot save configuration file ', FileName); end else Result := True; except on e: EStreamError do begin mbDeleteFile(sTmpConfigFileName); DebugLogger.Debugln('Error saving configuration file ', FileName, ': ' + e.Message); end; end; end else begin DebugLogger.Debugln('Cannot save configuration file ', FileName, ' - check permissions'); end; end; procedure TXmlConfig.SplitPathToNodeAndAttr(const Path: DOMString; out NodePath: DOMString; out AttrName: DOMString); var AttrSepPos: Integer; begin // Last part of the path is the attr name. AttrSepPos := Length(Path); while (AttrSepPos > 0) and (Path[AttrSepPos] <> '/') do Dec(AttrSepPos); if (AttrSepPos = 0) or (AttrSepPos = Length(Path)) then begin NodePath := EmptyWideStr; AttrName := Path; end else begin NodePath := Copy(Path, 1, AttrSepPos - 1); AttrName := Copy(Path, AttrSepPos + 1, Length(Path) - AttrSepPos); end; end; function TXmlConfig.AddNode(const RootNode: TDOMNode; const ValueName: DOMString): TDOMNode; begin Result := RootNode.AppendChild(FDoc.CreateElement(ValueName)); end; procedure TXmlConfig.DeleteNode(const RootNode: TDOMNode; const Path: DOMString); begin DeleteNode(FindNode(RootNode, Path, False)); end; procedure TXmlConfig.DeleteNode(const Node: TDOMNode); begin if Assigned(Node) and Assigned(Node.ParentNode) then Node.ParentNode.DetachChild(Node); end; procedure TXmlConfig.ClearNode(const Node: TDOMNode); var Attr: TDOMAttr; begin while Assigned(Node.FirstChild) do Node.RemoveChild(Node.FirstChild); if Node.HasAttributes then begin Attr := TDOMAttr(Node.Attributes[0]); while Assigned(Attr) do begin TDOMElement(Node).RemoveAttributeNode(Attr); Attr := TDOMAttr(Attr.NextSibling); end; end; end; function TXmlConfig.FindNode(const RootNode: TDOMNode; const Path: DOMString; bCreate: Boolean = False): TDOMNode; var StartPos, EndPos: Integer; PathLen: Integer; Child: TDOMNode; function CompareDOMStrings(const s1, s2: DOMPChar; l1, l2: integer): integer; var i: integer; begin Result:=l1-l2; i:=0; while (i '/') do Inc(EndPos); Child := Result.FirstChild; while Assigned(Child) and not ((Child.NodeType = ELEMENT_NODE) and (0 = CompareDOMStrings(DOMPChar(Child.NodeName), @Path[StartPos], Length(Child.NodeName), EndPos-StartPos))) do Child := Child.NextSibling; if not Assigned(Child) and bCreate then begin Child := FDoc.CreateElementBuf(@Path[StartPos], EndPos-StartPos); Result.AppendChild(Child); end; Result := Child; StartPos := EndPos + 1; if StartPos > PathLen then Break; end; end; function TXmlConfig.GetContent(const Node: TDOMNode): UTF8String; begin Result := UTF16ToUTF8(Node.TextContent); end; procedure TXmlConfig.SetContent(const Node: TDOMNode; const AValue: UTF8String); begin Node.TextContent := UTF8ToUTF16(AValue); end; function TXmlConfig.GetPathFromNode(aNode: TDOMNode): String; begin Result := aNode.NodeName; aNode := aNode.ParentNode; while Assigned(aNode) and (aNode <> RootNode) do begin Result := aNode.NodeName + '/' + Result; aNode := aNode.ParentNode; end; end; procedure TXmlConfig.GetFont(const aNode: TXmlNode; Path: TXmlPath; out Name: UTF8String; out Size: Integer; out Style: Integer; const DefName: UTF8String; const DefSize: Integer; const DefStyle: Integer); begin if Path <> '' then Path := Path + '/'; Name := GetValue(aNode, Path + 'Name', DefName); Size := GetValue(aNode, Path + 'Size', DefSize); Style := GetValue(aNode, Path + 'Style', DefStyle); end; procedure TXmlConfig.SetFont(const aNode: TXmlNode; Path: TXmlPath; const Name: UTF8String; const Size: Integer; const Style: Integer); begin if Path <> '' then Path := Path + '/'; SetValue(aNode, Path + 'Name', Name); SetValue(aNode, Path + 'Size', Size); SetValue(aNode, Path + 'Style', Style); end; end. doublecmd-0.5.8/components/doublecmd/dcstrutils.pas0000644000175000017500000007237312215301020021534 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Useful functions dealing with strings. Copyright (C) 2006-2013 Alexander Koblov (alexx2000@mail.ru) Copyright (C) 2012 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit DCStrUtils; {$mode objfpc}{$H+} interface uses Classes, SysUtils, DCBasicTypes; type TPathType = (ptNone, ptRelative, ptAbsolute); {en Checks if StringToCheck contains any of the single characters in PossibleCharacters. Only ASCII can be searched. } function ContainsOneOf(StringToCheck: UTF8String; PossibleCharacters: String): Boolean; {en Convert known directory separators to the current directory separator. } function NormalizePathDelimiters(const Path: String): String; {en Get last directory name in path @returns(Last directory name in path) } function GetLastDir(Path : String) : String; {en Retrieves the root directory for a path. @param(sPath Absolute path to a directory or a file.) @returns(Root directory or an empty string if the path is not absolute.) } function GetRootDir(sPath : String) : String; {en Retrieves parent directory for a path (removes the last subdirectory in the path). @param(sPath Absolute or relative path to a directory or a file.) @returns(Parent directory or an empty string if the path does not have a parent directory.) } function GetParentDir(sPath : String) : String; {en Gets the deepest (longest) path that exist. } function GetDeepestExistingPath(const sPath : UTF8String) : UTF8String; function GetSplitFileName(var sFileName, sPath : String) : String; function MakeFileName(const sPath, sFileNameDef : String) : String; {en Split path into list of directories @param(DirName Path) @param(Dirs List of directories names) @returns(The function returns the number of directories found, or -1 if none were found.) } function GetDirs (DirName : String; var Dirs : TStringList) : Longint; {en Get absolute file name from relative file name @param(sPath Current path) @param(sRelativeFileName Relative file name) @returns(Absolute file name) } function GetAbsoluteFileName(const sPath, sRelativeFileName : String) : String; {en Checks if a path to a directory or file is absolute or relative. @returns(ptNone if a path is just a directory or file name (MyDir) ptRelative if a path is relative (MyDir/MySubDir) ptAbsolute if a path is absolute) (/root/MyDir) } function GetPathType(const sPath : String): TPathType; {en Get file name without path and extension @param(FileName File name) @returns(File name without path and extension) } function ExtractOnlyFileName(const FileName: string): string; {en Get file extension without the '.' at the front. } function ExtractOnlyFileExt(const FileName: string): string; {en Remove file extension with the '.' from file name. } function RemoveFileExt(const FileName: UTF8String): UTF8String; function ContainsWildcards(const Path: UTF8String): Boolean; {en Expands an absolute file path by removing all relative references. Processes '/../' and '/./'. Example: /home/user/files/../somedirectory/./file.txt = /home/user/somedirectory/file.txt @param(Path path to expand.) } function ExpandAbsolutePath(const Path: String): String; function HasPathInvalidCharacters(Path: UTF8String): Boolean; {en Checks if a file or directory belongs in the specified path. Only strings are compared, no file-system checks are done. @param(sBasePath Absolute path where the path to check should be in.) @param(sPathToCheck Absolute path to file or directory to check.) @param(AllowSubDirs If @true, allows the sPathToCheck to point to a file or directory in some subdirectory of sBasePath. If @false, only allows the sPathToCheck to point directly to a file or directory in sBasePath.) @param(AllowSame If @true, returns @true if sBasePath = sPathToCheck. If @false, returns @false if sBasePath = sPathToCheck.) @return(@true if sPathToCheck points to a directory or file in sBasePath. @false otherwise.) Examples: IsInPath('/home', '/home/somedir/somefile', True, False) = True IsInPath('/home', '/home/somedir/somefile', False, False) = False IsInPath('/home', '/home/somedir/', False, False) = True IsInPath('/home', '/home', False, False) = False IsInPath('/home', '/home', False, True) = True } function IsInPath(sBasePath : String; sPathToCheck : String; AllowSubDirs : Boolean; AllowSame : Boolean) : Boolean; {en Changes a path to be relative to some parent directory. @param(sPrefix Absolute path that is a parent of sPath.) @param(sPath Path to change. Must be a subpath of sPrefix, otherwise no change is made.) Examples: ExtractDirLevel('/home', '/home/somedir/somefile') = '/somedir/somefile' } function ExtractDirLevel(const sPrefix, sPath: String): String; {en Adds a path delimiter at the beginning of the string, if it not exists. } function IncludeFrontPathDelimiter(s: String): String; {en Removes a path delimiter at the beginning of the string, if it exists. } function ExcludeFrontPathDelimiter(s: String): String; {en Removes a path delimiter at the ending of the string, if it exists. Doesn't remove path delimiter if it is the only character in the path (root dir), so it is safer to use than ExcludeTrailingPathDelimiter, especially on Unix. } function ExcludeBackPathDelimiter(const Path: UTF8String): UTF8String; {en Return position of character in string begun from start position @param(C character) @param(S String) @param(StartPos Start position) @returns(Position of character in string) } function CharPos(C: Char; const S: string; StartPos: Integer = 1): Integer; {en Split file name on name and extension @param(sFileName File name) @param(n Name) @param(e Extension) } procedure DivFileName(const sFileName:String; out n,e:String); {en Split file mask on name mask and extension mask @param(DestMask File mask) @param(DestNameMask Name mask) @param(DestExtMask Extension mask) } procedure SplitFileMask(const DestMask: String; out DestNameMask: String; out DestExtMask: String); {en Apply name and extension mask to the file name @param(aFileName File name) @param(NameMask Name mask) @param(ExtMask Extension mask) } function ApplyRenameMask(aFileName: String; NameMask: String; ExtMask: String): String; {en Get count of character in string @param(Char Character) @param(S String) @returns(Count of character) } function NumCountChars(const Char: Char; const S: String): Integer; {en Remove last line ending in text @param(sText Text) @param(TextLineBreakStyle Text line break style) } function TrimRightLineEnding(const sText: UTF8String; TextLineBreakStyle: TTextLineBreakStyle): UTF8String; function mbCompareText(const s1, s2: UTF8String): PtrInt; function StrNewW(const mbString: UTF8String): PWideChar; procedure StrDisposeW(var pStr : PWideChar); function StrLCopyW(Dest, Source: PWideChar; MaxLen: SizeInt): PWideChar; function StrPCopyW(Dest: PWideChar; const Source: WideString): PWideChar; function StrPLCopyW(Dest: PWideChar; const Source: WideString; MaxLen: Cardinal): PWideChar; {en Checks if a string begins with another string. @returns(@true if StringToCheck begins with StringToMatch. StringToCheck may be longer than StringToMatch.) } function StrBegins(const StringToCheck, StringToMatch: String): Boolean; {en Checks if a string ends with another string. @returns(@true if StringToCheck ends with StringToMatch. StringToCheck may be longer than StringToMatch.) } function StrEnds(const StringToCheck, StringToMatch: String): Boolean; {en Adds a string to another string. If the source string is not empty adds a separator before adding the string. } procedure AddStrWithSep(var SourceString: String; const StringToAdd: String; const Separator: Char = ' '); procedure AddStrWithSep(var SourceString: String; const StringToAdd: String; const Separator: String); procedure ParseLineToList(sLine: String; ssItems: TStrings); {en Convert a number specified as an octal number to it's decimal value. @param(Value Octal number as string) @returns(Decimal number) } function OctToDec(Value: String): LongInt; {en Convert a number specified as an decimal number to it's octal value. @param(Value Decimal number) @returns(Octal number as string) } function DecToOct(Value: LongInt): String; procedure AddString(var anArray: TDynamicStringArray; const sToAdd: String); {en Splits a string into different parts delimited by the specified delimiter character. } function SplitString(const S: String; Delimiter: AnsiChar): TDynamicStringArray; {en Checks if the second array is the beginning of first. If BothWays is @true then also checks the other way around, if the first array is the beginning of second. For Array1=[1,2] Array2=[1,2] returns @true. For Array1=[1,2,...] Array2=[1,2] returns @true. For Array1=[1,3,...] Array2=[1,2] returns @false. If BothWays = True then also For Array1=[1] Array2=[1,2] returns @true. For Array1=[1] Array2=[2] returns @false. } function ArrBegins(const Array1, Array2: array of String; BothWays: Boolean): Boolean; function ArrayToString(const anArray: TDynamicStringArray; const Separator: Char = ' '): String; {en Compares length and contents of the arrays. If lengths differ or individual elements differ returns @false, otherwise @true. } function Compare(const Array1, Array2: array of String): Boolean; {en Copies open array to dynamic array. } function CopyArray(const anArray: array of String): TDynamicStringArray; function ContainsOneOf(const ArrayToSearch, StringsToSearch: array of String): Boolean; function Contains(const ArrayToSearch: array of String; const StringToSearch: String): Boolean; procedure DeleteString(var anArray: TDynamicStringArray; const Index: Integer); procedure DeleteString(var anArray: TDynamicStringArray; const sToDelete: String); function GetArrayFromStrings(Strings: TStrings): TDynamicStringArray; procedure SetStringsFromArray(Strings: TStrings; const anArray: TDynamicStringArray); {en Replaces old value of Key or adds a new Key=NewValue string to the array. } procedure SetValue(var anArray: TDynamicStringArray; Key, NewValue: String); procedure SetValue(var anArray: TDynamicStringArray; Key: String; NewValue: Boolean); function ShortcutsToText(const Shortcuts: TDynamicStringArray): String; implementation uses DCOSUtils; function NormalizePathDelimiters(const Path: String): String; {$IFDEF UNIX} begin Result:= Path; end; {$ELSE} const AllowPathDelimiters : set of char = ['\','/']; var I : LongInt; begin Result:= Path; for I:= 1 to Length(Path) do if Path[I] in AllowPathDelimiters then Result[I]:= DirectorySeparator; end; {$ENDIF} function GetLastDir(Path : String) : String; begin Result:= ExtractFileName(ExcludeTrailingPathDelimiter(Path)); if Result = '' then Result:= ExtractFileDrive(Path); if Result = '' then Result:= PathDelim; end; function GetRootDir(sPath : String) : String; begin {$IF DEFINED(MSWINDOWS)} Result := ExtractFileDrive(sPath); if Result <> '' then Result := Result + PathDelim; {$ELSEIF DEFINED(UNIX)} Result := PathDelim; // Hardcoded {$ELSE} Result := ''; {$ENDIF} end; function GetParentDir(sPath : String) : String; var i : Integer; begin Result := ''; sPath := ExcludeTrailingPathDelimiter(sPath); // Start from one character before last. for i := length(sPath) - 1 downto 1 do if sPath[i] = DirectorySeparator then begin Result := Copy(sPath, 1, i); Break; end; end; function GetDeepestExistingPath(const sPath : UTF8String) : UTF8String; begin Result := sPath; while Result <> EmptyStr do begin if not mbDirectoryExists(Result) then Result := GetParentDir(Result) else Break; end; end; function GetSplitFileName(var sFileName, sPath : String) : String; begin if Pos(PathDelim, sFileName) <> 0 then begin Result := sFileName; sPath := ExtractFilePath(sFileName); sFileName := ExtractFileName(sFileName); end else Result := sPath + sFileName; end; function MakeFileName(const sPath, sFileNameDef : String) : String; begin Result:= ExtractFileName(ExcludeTrailingBackslash(sPath)); if Result = EmptyStr then Result:= sFileNameDef; end; function GetDirs (DirName : String; var Dirs : TStringList) : Longint; var I : Longint; len : Integer; sDir : String; begin I:= 1; Result:= -1; len := Length(DirName); while I <= len do begin if DirName[I]=PathDelim then begin Inc(Result); sDir := Copy(DirName, 1, len - (len - I + 1)); if dirs.IndexOf(sDir) < 0 then dirs.Add(sDir); end; Inc(I); end; if Result > -1 then inc(Result); end; function GetAbsoluteFileName(const sPath, sRelativeFileName : String) : String; begin case GetPathType(sRelativeFileName) of ptNone: Result := sPath + sRelativeFileName; ptRelative: Result := ExpandAbsolutePath(sPath + sRelativeFileName); ptAbsolute: Result := sRelativeFileName; end; end; function GetPathType(const sPath : String): TPathType; begin if sPath <> EmptyStr then begin {$IFDEF MSWINDOWS} { Absolute path in Windows } if { X:\... [Disk] ":" is reserved otherwise } ( Pos( DriveDelim, sPath ) > 0 ) or { \\... [UNC] \... [Root of current drive] } ( sPath[1] = PathDelim ) then {$ENDIF MSWINDOWS} {$IFDEF UNIX} { UNIX absolute paths start with a slash } if (sPath[1] = PathDelim) then {$ENDIF UNIX} Result := ptAbsolute else if ( Pos( PathDelim, sPath ) > 0 ) then Result := ptRelative else Result := ptNone; end else Result := ptNone; end; function ExtractOnlyFileName(const FileName: string): string; var iDotIndex, I: longint; begin (* Find a dot index *) I := Length(FileName); while (I > 0) and not (FileName[I] in ['.', '/', '\', ':']) do Dec(I); if (I > 0) and (FileName[I] = '.') then iDotIndex := I else iDotIndex := MaxInt; (* Find file name index *) I := Length(FileName); while (I > 0) and not (FileName[I] in ['/', '\', ':']) do Dec(I); Result := Copy(FileName, I + 1, iDotIndex - I - 1); end; function ExtractOnlyFileExt(const FileName: string): string; var I : LongInt; EndSep : Set of Char; begin I := Length(FileName); EndSep:= AllowDirectorySeparators + AllowDriveSeparators + [ExtensionSeparator]; while (I > 0) and not (FileName[I] in EndSep) do Dec(I); if (I > 0) and (FileName[I] = ExtensionSeparator) then Result := Copy(FileName, I + 1, MaxInt) else Result := ''; end; function RemoveFileExt(const FileName: UTF8String): UTF8String; var I : LongInt; EndSep : Set of Char; begin I := Length(FileName); EndSep:= AllowDirectorySeparators + AllowDriveSeparators + [ExtensionSeparator]; while (I > 0) and not (FileName[I] in EndSep) do Dec(I); if (I > 0) and (FileName[I] = ExtensionSeparator) then Result := Copy(FileName, 1, I - 1) else Result := FileName; end; function ContainsWildcards(const Path: UTF8String): Boolean; begin Result := ContainsOneOf(Path, '*?'); end; function ExpandAbsolutePath(const Path: String): String; var I, J: Integer; begin Result := Path; {First remove all references to '\.\'} I := Pos (DirectorySeparator + '.' + DirectorySeparator, Result); while I <> 0 do begin Delete (Result, I, 2); I := Pos (DirectorySeparator + '.' + DirectorySeparator, Result); end; if StrEnds(Result, DirectorySeparator + '.') then Delete (Result, Length(Result) - 1, 2); {Then remove all references to '\..\'} I := Pos (DirectorySeparator + '..', Result); while (I <> 0) do begin J := Pred (I); while (J > 0) and (Result [J] <> DirectorySeparator) do Dec (J); if (J = 0) then Delete (Result, I, 3) else Delete (Result, J, I - J + 3); I := Pos (DirectorySeparator + '..', Result); end; end; function HasPathInvalidCharacters(Path: UTF8String): Boolean; begin Result := ContainsOneOf(Path, '*?'); end; function IsInPath(sBasePath : String; sPathToCheck : String; AllowSubDirs : Boolean; AllowSame : Boolean) : Boolean; var BasePathLength, PathToCheckLength: Integer; DelimiterPos: Integer; begin if sBasePath = '' then Exit(False); sBasePath := IncludeTrailingPathDelimiter(sBasePath); BasePathLength := Length(sBasePath); PathToCheckLength := Length(sPathToCheck); if PathToCheckLength > BasePathLength then begin if CompareStr(Copy(sPathToCheck, 1, BasePathLength), sBasePath) = 0 then begin if AllowSubDirs then Result := True else begin // Additionally check if the remaining path is a relative path. // Look for a path delimiter in the middle of the filepath. sPathToCheck := Copy(sPathToCheck, 1 + BasePathLength, PathToCheckLength - BasePathLength); DelimiterPos := Pos(DirectorySeparator, sPathToCheck); // If no delimiter was found or it was found at then end (directories // may end with it), then the 'sPathToCheck' is in 'sBasePath'. Result := (DelimiterPos = 0) or (DelimiterPos = PathToCheckLength - BasePathLength); end; end else Result := False; end else Result := AllowSame and (((PathToCheckLength = BasePathLength) and (CompareStr(sPathToCheck, sBasePath) = 0)) or ((PathToCheckLength = BasePathLength - 1) and (CompareStr(Copy(sBasePath, 1, PathToCheckLength), sPathToCheck) = 0))); end; function ExtractDirLevel(const sPrefix, sPath: String): String; var PrefixLength: Integer; begin if IsInPath(sPrefix, sPath, True, True) then begin PrefixLength := Length(sPrefix); Result := Copy(sPath, 1 + PrefixLength, Length(sPath) - PrefixLength) end else Result := sPath; end; function IncludeFrontPathDelimiter(s: String): String; begin if (Length(s) > 0) and (s[1] = PathDelim) then Result:= s else Result:= PathDelim + s; end; function ExcludeFrontPathDelimiter(s: String): String; begin if (Length(s) > 0) and (s[1] = PathDelim) then Result := Copy(s, 2, Length(s) - 1) else Result := s; end; function ExcludeBackPathDelimiter(const Path: UTF8String): UTF8String; var L: Integer; begin L:= Length(Path); if (L > 1) and (Path[L] in AllowDirectorySeparators) then Result:= Copy(Path, 1, L - 1) else Result:= Path; end; procedure DivFileName(const sFileName:String; out n,e:String); var i:Integer; begin for i:= length(sFileName) downto 1 do if sFileName[i]='.' then begin // if i>1 then // hidden files?? e:=Copy(sFileName,i,Length(sFileName)-i+1); n:=Copy(sFileName,1,i-1); Exit; end; e:=''; n:=sFileName; end; procedure SplitFileMask(const DestMask: String; out DestNameMask: String; out DestExtMask: String); var iPos: LongInt; begin // Special case for mask that contains '*.*' ('*.*.old' for example) iPos:= Pos('*.*', DestMask); if (iPos = 0) then DivFileName(DestMask, DestNameMask, DestExtMask) else begin DestNameMask := Copy(DestMask, 1, iPos); DestExtMask := Copy(DestMask, iPos + 1, MaxInt); end; // Treat empty mask as '*.*'. if (DestNameMask = '') and (DestExtMask = '') then begin DestNameMask := '*'; DestExtMask := '.*'; end; end; function ApplyRenameMask(aFileName: String; NameMask: String; ExtMask: String): String; function ApplyMask(const TargetString: String; Mask: String): String; var i:Integer; begin Result:=''; for i:=1 to Length(Mask) do begin if Mask[i]= '?' then Result:=Result + TargetString[i] else if Mask[i]= '*' then Result:=Result + Copy(TargetString, i, Length(TargetString) - i + 1) else Result:=Result + Mask[i]; end; end; var sDstExt: String; sDstName: String; begin if ((NameMask = '*') and (ExtMask = '.*')) then Result := aFileName else begin DivFileName(aFileName, sDstName, sDstExt); sDstName := ApplyMask(sDstName, NameMask); sDstExt := ApplyMask(sDstExt, ExtMask); Result := sDstName; if sDstExt <> '.' then Result := Result + sDstExt; end; end; function CharPos(C: Char; const S: string; StartPos: Integer = 1): Integer; var sNewStr : String; begin if StartPos <> 1 then begin sNewStr := Copy(S, StartPos, Length(S) - StartPos + 1); Result := Pos(C, sNewStr); if Result <> 0 then Result := Result + StartPos - 1; end else Result := Pos(C, S); end; function NumCountChars(const Char: char; const S: String): Integer; var I : Integer; begin Result := 0; if Length(S) > 0 then for I := 1 to Length(S) do if S[I] = Char then Inc(Result); end; function TrimRightLineEnding(const sText: UTF8String; TextLineBreakStyle: TTextLineBreakStyle): UTF8String; const TextLineBreakArray: array[TTextLineBreakStyle] of Integer = (1, 2, 1); var I, L: Integer; begin L:= Length(sText); I:= TextLineBreakArray[TextLineBreakStyle]; Result:= Copy(sText, 1, L - I); // Copy without last line ending end; function mbCompareText(const s1, s2: UTF8String): PtrInt; inline; begin // From 0.9.31 LazUtils can be used but this package does not exist in 0.9.30. // Result := LazUTF8.UTF8CompareText(s1, s2); Result := WideCompareText(UTF8Decode(s1), UTF8Decode(s2)); end; function StrNewW(const mbString: UTF8String): PWideChar; var wsString: WideString; iLength: PtrInt; begin Result:= nil; wsString:= UTF8Decode(mbString); iLength:= (Length(wsString) * SizeOf(WideChar)) + 1; Result:= GetMem(iLength); if Result <> nil then Move(PWideChar(wsString)^, Result^, iLength); end; procedure StrDisposeW(var pStr : PWideChar); begin FreeMem(pStr); pStr := nil; end; function StrLCopyW(Dest, Source: PWideChar; MaxLen: SizeInt): PWideChar; var I: SizeInt; begin Result := Dest; for I:= 0 to MaxLen - 1 do begin if Source^ = #0 then Break; Dest^ := Source^; Inc(Source); Inc(Dest); end; Dest^ := #0; end; function StrPCopyW(Dest: PWideChar; const Source: WideString): PWideChar; begin Result := StrLCopyW(Dest, PWideChar(Source), Length(Source)); end; function StrPLCopyW(Dest: PWideChar; const Source: WideString; MaxLen: Cardinal): PWideChar; begin Result := StrLCopyW(Dest, PWideChar(Source), MaxLen); end; function StrBegins(const StringToCheck, StringToMatch: String): Boolean; begin Result := (Length(StringToCheck) >= Length(StringToMatch)) and (CompareChar(StringToCheck[1], StringToMatch[1], Length(StringToMatch)) = 0); end; function StrEnds(const StringToCheck, StringToMatch: String): Boolean; begin Result := (Length(StringToCheck) >= Length(StringToMatch)) and (CompareChar(StringToCheck[1 + Length(StringToCheck) - Length(StringToMatch)], StringToMatch[1], Length(StringToMatch)) = 0); end; procedure AddStrWithSep(var SourceString: String; const StringToAdd: String; const Separator: Char); begin if (Length(SourceString) > 0) and (Length(StringToAdd) > 0) then SourceString := SourceString + Separator; SourceString := SourceString + StringToAdd; end; procedure AddStrWithSep(var SourceString: String; const StringToAdd: String; const Separator: String); begin if (Length(SourceString) > 0) and (Length(StringToAdd) > 0) then SourceString := SourceString + Separator; SourceString := SourceString + StringToAdd; end; procedure ParseLineToList(sLine: String; ssItems: TStrings); var xPos: Integer; begin ssItems.Clear; while sLine <> '' do begin xPos:= Pos(';', sLine); if xPos > 0 then begin ssItems.Add(Copy(sLine, 1, xPos - 1)); Delete(sLine, 1, xPos); end else begin ssItems.Add(sLine); Exit; end; end; end; function ContainsOneOf(StringToCheck: UTF8String; PossibleCharacters: String): Boolean; var i, j: SizeInt; pc : PChar; begin pc := @StringToCheck[1]; for i := 1 to Length(StringToCheck) do begin for j := 1 to Length(PossibleCharacters) do if pc^ = PossibleCharacters[j] then Exit(True); Inc(pc); end; Result := False; end; function OctToDec(Value: String): LongInt; var I: Integer; begin Result:= 0; for I:= 1 to Length(Value) do Result:= Result * 8 + StrToInt(Copy(Value, I, 1)); end; function DecToOct(Value: LongInt): String; var iMod: Integer; begin Result := ''; while Value >= 8 do begin iMod:= Value mod 8; Value:= Value div 8; Result:= IntToStr(iMod) + Result; end; Result:= IntToStr(Value) + Result; end; procedure AddString(var anArray: TDynamicStringArray; const sToAdd: String); var Len: Integer; begin Len := Length(anArray); SetLength(anArray, Len + 1); anArray[Len] := sToAdd; end; function SplitString(const S: String; Delimiter: AnsiChar): TDynamicStringArray; var Start: Integer = 1; Len, Finish: Integer; begin Len:= Length(S); for Finish:= 1 to Len - 1 do begin if S[Finish] = Delimiter then begin AddString(Result, Copy(S, Start, Finish - Start)); Start:= Finish + 1; end; end; if Start <= Len then begin AddString(Result, Copy(S, Start, Len - Start + 1)); end; end; function ArrBegins(const Array1, Array2: array of String; BothWays: Boolean): Boolean; var Len1, Len2: Integer; i: Integer; begin Len1 := Length(Array1); Len2 := Length(Array2); if not BothWays and (Len1 < Len2) then Result := False else begin if Len1 > Len2 then Len1 := Len2; for i := 0 to Len1 - 1 do if Array1[i] <> Array2[i] then Exit(False); Result := True; end; end; function ArrayToString(const anArray: TDynamicStringArray; const Separator: Char): String; var i: Integer; begin Result := ''; for i := Low(anArray) to High(anArray) do AddStrWithSep(Result, anArray[i], Separator); end; function Compare(const Array1, Array2: array of String): Boolean; var Len1, Len2: Integer; i: Integer; begin Len1 := Length(Array1); Len2 := Length(Array2); if Len1 <> Len2 then Result := False else begin for i := 0 to Len1 - 1 do if Array1[i] <> Array2[i] then Exit(False); Result := True; end; end; function CopyArray(const anArray: array of String): TDynamicStringArray; var i: Integer; begin SetLength(Result, Length(anArray)); for i := Low(anArray) to High(anArray) do Result[i] := anArray[i]; end; function ContainsOneOf(const ArrayToSearch, StringsToSearch: array of String): Boolean; var i: Integer; begin for i := Low(StringsToSearch) to High(StringsToSearch) do if Contains(ArrayToSearch, StringsToSearch[i]) then Exit(True); Result := False; end; function Contains(const ArrayToSearch: array of String; const StringToSearch: String): Boolean; var i: Integer; begin for i := Low(ArrayToSearch) to High(ArrayToSearch) do if ArrayToSearch[i] = StringToSearch then Exit(True); Result := False; end; procedure DeleteString(var anArray: TDynamicStringArray; const Index: Integer); var Len: Integer; i: Integer; begin Len := Length(anArray); for i := Index + 1 to Len - 1 do anArray[i - 1] := anArray[i]; SetLength(anArray, Len - 1); end; procedure DeleteString(var anArray: TDynamicStringArray; const sToDelete: String); var i: Integer; begin for i := Low(anArray) to High(anArray) do if anArray[i] = sToDelete then begin DeleteString(anArray, i); Exit; end; end; function GetArrayFromStrings(Strings: TStrings): TDynamicStringArray; var LinesCount: Integer; i: Integer; begin LinesCount := Strings.Count; if LinesCount > 0 then begin if Strings[LinesCount-1] = '' then Dec(LinesCount); SetLength(Result, LinesCount); for i := 0 to LinesCount - 1 do Result[i] := Strings[i]; end; end; procedure SetStringsFromArray(Strings: TStrings; const anArray: TDynamicStringArray); var s: String; begin Strings.Clear; for s in anArray do Strings.Add(s); end; procedure SetValue(var anArray: TDynamicStringArray; Key, NewValue: String); var i: Integer; begin Key := Key + '='; for i := Low(anArray) to High(anArray) do if StrBegins(anArray[i], Key) then begin anArray[i] := Key + NewValue; Exit; end; AddString(anArray, Key + NewValue); end; procedure SetValue(var anArray: TDynamicStringArray; Key: String; NewValue: Boolean); begin if NewValue then SetValue(anArray, Key, 'true') else SetValue(anArray, Key, 'false'); end; function ShortcutsToText(const Shortcuts: TDynamicStringArray): String; begin Result := ArrayToString(Shortcuts, ' '); end; end. doublecmd-0.5.8/components/doublecmd/dcosutils.pas0000644000175000017500000011047112205645056021360 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- This unit contains platform dependent functions dealing with operating system. Copyright (C) 2006-2012 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit DCOSUtils; {$mode objfpc}{$H+} interface uses SysUtils, Classes, DCClassesUtf8, DCBasicTypes; type TFileMapRec = record FileHandle : System.THandle; FileSize : Int64; {$IFDEF MSWINDOWS} MappingHandle : System.THandle; {$ENDIF} MappedFile : Pointer; end; TCopyAttributesOption = (caoCopyAttributes, caoCopyTime, caoCopyOwnership, caoRemoveReadOnlyAttr); TCopyAttributesOptions = set of TCopyAttributesOption; const faInvalidAttributes: TFileAttrs = TFileAttrs(-1); CopyAttributesOptionCopyAll = [caoCopyAttributes, caoCopyTime, caoCopyOwnership]; // From Lazarus LCL. // Once switched to Lazarus 1.0 we can use package LazUtils instead and remove those. function UTF8ToSys(const s: string): string;// as UTF8ToAnsi but more independent of widestringmanager function SysToUTF8(const s: string): string;// as AnsiToUTF8 but more independent of widestringmanager {en Is file a directory @param(iAttr File attributes) @returns(@true if file is a directory, @false otherwise) } function FPS_ISDIR(iAttr: TFileAttrs) : Boolean; {en Is file a symbolic link @param(iAttr File attributes) @returns(@true if file is a symbolic link, @false otherwise) } function FPS_ISLNK(iAttr: TFileAttrs) : Boolean; {en Is file executable @param(sFileName File name) @returns(@true if file is executable, @false otherwise) } function FileIsExeLib(const sFileName : String) : Boolean; {en Copies a file attributes (attributes, date/time, owner & group, permissions). @param(sSrc String expression that specifies the name of the file to be copied) @param(sDst String expression that specifies the target file name) @param(bDropReadOnlyFlag Drop read only attribute if @true) @returns(The function returns @true if successful, @false otherwise) } function FileIsReadOnly(iAttr: TFileAttrs): Boolean; {en Returns path to a temporary name. It ensures that returned path doesn't exist, i.e., there is no filesystem entry by that name. If it could not create a unique temporary name then it returns empty string. @param(PathPrefix This parameter is added at the beginning of each path that is tried. The directories in this path are not created if they don't exist. If it is empty then the system temporary directory is used. For example: If PathPrefix is '/tmp/myfile' then files '/tmp/myfileXXXXXX' are tried. The path '/tmp' must already exist.) } function GetTempName(PathPrefix: String): String; (* File mapping/unmapping routines *) {en Create memory map of a file @param(sFileName Name of file to mapping) @param(FileMapRec TFileMapRec structure) @returns(The function returns @true if successful, @false otherwise) } function MapFile(const sFileName : UTF8String; out FileMapRec : TFileMapRec) : Boolean; {en Unmap previously mapped file @param(FileMapRec TFileMapRec structure) } procedure UnMapFile(var FileMapRec : TFileMapRec); {en Convert from console to UTF8 encoding. } function ConsoleToUTF8(const Str: AnsiString): UTF8String; { File handling functions} function mbFileOpen(const FileName: UTF8String; Mode: Word): System.THandle; function mbFileCreate(const FileName: UTF8String): System.THandle; overload; function mbFileCreate(const FileName: UTF8String; ShareMode: Longint): System.THandle; overload; function mbFileCreate(const FileName: UTF8String; ShareMode: Longint; Rights: Longint): System.THandle; overload; function mbFileAge(const FileName: UTF8String): DCBasicTypes.TFileTime; // On success returns True. function mbFileGetTime(const FileName: UTF8String; var ModificationTime: DCBasicTypes.TFileTime; var CreationTime : DCBasicTypes.TFileTime; var LastAccessTime : DCBasicTypes.TFileTime): Boolean; // On success returns True. function mbFileSetTime(const FileName: UTF8String; ModificationTime: DCBasicTypes.TFileTime; CreationTime : DCBasicTypes.TFileTime = 0; LastAccessTime : DCBasicTypes.TFileTime = 0): Boolean; {en Checks if a given file exists - it can be a real file or a link to a file, but it can be opened and read from. Even if the result is @false, we can't be sure a file by that name can be created, because there may still exist a directory or link by that name. } function mbFileExists(const FileName: UTF8String): Boolean; function mbFileAccess(const FileName: UTF8String; Mode: Word): Boolean; function mbFileGetAttr(const FileName: UTF8String): TFileAttrs; function mbFileSetAttr (const FileName: UTF8String; Attr: TFileAttrs) : LongInt; {en If any operation in Options is performed and does not succeed it is included in the result set. If all performed operations succeed the function returns empty set. For example for Options=[caoCopyTime, caoCopyOwnership] setting ownership doesn't succeed then the function returns [caoCopyOwnership]. } function mbFileCopyAttr(const sSrc, sDst: UTF8String; Options: TCopyAttributesOptions): TCopyAttributesOptions; // Returns True on success. function mbFileSetReadOnly(const FileName: UTF8String; ReadOnly: Boolean): Boolean; function mbDeleteFile(const FileName: UTF8String): Boolean; function mbRenameFile(const OldName: UTF8String; NewName: UTF8String): Boolean; function mbFileSize(const FileName: UTF8String): Int64; function FileFlush(Handle: System.THandle): Boolean; { Directory handling functions} function mbGetCurrentDir: UTF8String; function mbSetCurrentDir(const NewDir: UTF8String): Boolean; {en Checks if a given directory exists - it may be a real directory or a link to directory. Even if the result is @false, we can't be sure a directory by that name can be created, because there may still exist a file or link by that name. } function mbDirectoryExists(const Directory : UTF8String) : Boolean; function mbCreateDir(const NewDir: UTF8String): Boolean; function mbRemoveDir(const Dir: UTF8String): Boolean; {en Checks if any file system entry exists at given path. It can be file, directory, link, etc. (links are not followed). } function mbFileSystemEntryExists(const Path: UTF8String): Boolean; function mbCompareFileNames(const FileName1, FileName2: UTF8String): Boolean; function mbSameFile(const FileName1, FileName2: String): Boolean; { Other functions } function mbGetEnvironmentString(Index : Integer) : UTF8String; function mbSysErrorMessage(ErrorCode: Integer): UTF8String; function mbLoadLibrary(const Name: UTF8String): TLibHandle; implementation {$IF DEFINED(MSWINDOWS)} uses Windows, JwaWinNetWk; {$ENDIF} {$IF DEFINED(UNIX)} {$IF DEFINED(BSD)} {$DEFINE FPC_USE_LIBC} {$ENDIF} uses {$IF (NOT DEFINED(FPC_USE_LIBC)) OR (DEFINED(BSD) AND NOT DEFINED(DARWIN))} SysCall, {$ENDIF} BaseUnix, Unix, dl, DCStrUtils; {$ENDIF} {$IFDEF UNIX} function SetModeReadOnly(mode: TMode; ReadOnly: Boolean): TMode; begin mode := mode and not (S_IWUSR or S_IWGRP or S_IWOTH); if ReadOnly = False then begin if (mode AND S_IRUSR) = S_IRUSR then mode := mode or S_IWUSR; if (mode AND S_IRGRP) = S_IRGRP then mode := mode or S_IWGRP; if (mode AND S_IROTH) = S_IROTH then mode := mode or S_IWOTH; end; Result := mode; end; {$ENDIF} {$IF DEFINED(MSWINDOWS)} const AccessModes: array[0..2] of DWORD = ( GENERIC_READ, GENERIC_WRITE, GENERIC_READ or GENERIC_WRITE); ShareModes: array[0..4] of DWORD = ( 0, 0, FILE_SHARE_READ, FILE_SHARE_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE); {$ELSEIF DEFINED(UNIX)} const AccessModes: array[0..2] of LongInt = ( O_RdOnly, O_WrOnly, O_RdWr); function fpLChown(path : pChar; owner : TUid; group : TGid): cInt; {$IFDEF FPC_USE_LIBC}cdecl; external 'c' name 'lchown';{$ENDIF} {$IFNDEF FPC_USE_LIBC} begin fpLChown:=do_syscall(syscall_nr_lchown,TSysParam(path),TSysParam(owner),TSysParam(group)); end; {$ENDIF} {$ENDIF} ////////// // From Lazarus, remove once switched to Lazarus 1.0, use LazUtils instead. var FNeedRTLAnsi: boolean = false; FNeedRTLAnsiValid: boolean = false; function NeedRTLAnsi: boolean; {$IFDEF WinCE} // CP_UTF8 is missing in the windows unit of the Windows CE RTL const CP_UTF8 = 65001; {$ENDIF} {$IFNDEF Windows} var Lang: String; i: LongInt; Encoding: String; {$ENDIF} begin if FNeedRTLAnsiValid then exit(FNeedRTLAnsi); {$IFDEF Windows} FNeedRTLAnsi:=GetACP<>CP_UTF8; {$ELSE} FNeedRTLAnsi:=false; Lang := SysUtils.GetEnvironmentVariable('LC_ALL'); if lang = '' then begin Lang := SysUtils.GetEnvironmentVariable('LC_MESSAGES'); if Lang = '' then begin Lang := SysUtils.GetEnvironmentVariable('LANG'); end; end; i:=System.Pos('.',Lang); if (i>0) then begin Encoding:=copy(Lang,i+1,length(Lang)-i); FNeedRTLAnsi:=(SysUtils.CompareText(Encoding,'UTF-8')<>0) and (SysUtils.CompareText(Encoding,'UTF8')<>0); end; {$ENDIF} FNeedRTLAnsiValid:=true; Result:=FNeedRTLAnsi; end; procedure SetNeedRTLAnsi(NewValue: boolean); begin FNeedRTLAnsi:=NewValue; FNeedRTLAnsiValid:=true; end; function IsASCII(const s: string): boolean; inline; var i: Integer; begin for i:=1 to length(s) do if ord(s[i])>127 then exit(false); Result:=true; end; function UTF8ToSys(const s: string): string; begin if NeedRTLAnsi and (not IsASCII(s)) then Result:=UTF8ToAnsi(s) else Result:=s; end; function SysToUTF8(const s: string): string; begin if NeedRTLAnsi and (not IsASCII(s)) then begin Result:=AnsiToUTF8(s); {$ifdef FPC_HAS_CPSTRING} // prevent UTF8 codepage appear in the strings - we don't need codepage // conversion magic in LCL code SetCodePage(RawByteString(Result), StringCodePage(s), False); {$endif} end else Result:=s; end; ////////// (*Is Directory*) function FPS_ISDIR(iAttr: TFileAttrs) : Boolean; inline; {$IFDEF MSWINDOWS} begin Result := (iAttr and FILE_ATTRIBUTE_DIRECTORY <> 0); end; {$ELSE} begin Result := BaseUnix.FPS_ISDIR(iAttr); end; {$ENDIF} (*Is Link*) function FPS_ISLNK(iAttr: TFileAttrs) : Boolean; inline; {$IFDEF MSWINDOWS} begin Result := (iAttr and FILE_ATTRIBUTE_REPARSE_POINT <> 0); end; {$ELSE} begin Result := BaseUnix.FPS_ISLNK(iAttr); end; {$ENDIF} function FileIsExeLib(const sFileName : String) : Boolean; var fsExeLib : TFileStreamEx; {$IFDEF MSWINDOWS} Sign : Word; {$ELSE} Sign : DWord; {$ENDIF} begin Result := False; if mbFileExists(sFileName) and (mbFileSize(sFileName) >= SizeOf(Sign)) then begin fsExeLib := TFileStreamEx.Create(sFileName, fmOpenRead or fmShareDenyNone); try {$IFDEF MSWINDOWS} Sign := fsExeLib.ReadWord; Result := (Sign = $5A4D); {$ELSE} Sign := fsExeLib.ReadDWord; Result := (Sign = $464C457F); {$ENDIF} finally fsExeLib.Free; end; end; end; function FileIsReadOnly(iAttr: TFileAttrs): Boolean; {$IFDEF MSWINDOWS} begin Result:= (iAttr and faReadOnly) <> 0; end; {$ELSE} begin Result:= (((iAttr AND S_IRUSR) = S_IRUSR) and ((iAttr AND S_IWUSR) <> S_IWUSR)); end; {$ENDIF} function mbFileCopyAttr(const sSrc, sDst: UTF8String; Options: TCopyAttributesOptions): TCopyAttributesOptions; {$IFDEF MSWINDOWS} var Attr : TFileAttrs; ModificationTime, CreationTime, LastAccessTime: DCBasicTypes.TFileTime; begin Result := []; if caoCopyAttributes in Options then begin Attr := mbFileGetAttr(sSrc); if Attr <> faInvalidAttributes then begin if (caoRemoveReadOnlyAttr in Options) and ((Attr and faReadOnly) <> 0) then Attr := (Attr and not faReadOnly); if mbFileSetAttr(sDst, Attr) <> 0 then Include(Result, caoCopyAttributes); end else Include(Result, caoCopyAttributes); end; if caoCopyTime in Options then begin if not (mbFileGetTime(sSrc, ModificationTime, CreationTime, LastAccessTime) and mbFileSetTime(sDst, ModificationTime, CreationTime, LastAccessTime)) then Include(Result, caoCopyTime); end; end; {$ELSE} // *nix var StatInfo : BaseUnix.Stat; utb : BaseUnix.TUTimBuf; mode : TMode; begin if fpLStat(PChar(UTF8ToSys(sSrc)), StatInfo) >= 0 then begin Result := []; if FPS_ISLNK(StatInfo.st_mode) then begin if caoCopyOwnership in Options then begin // Only group/owner can be set for links. if fpLChown(PChar(UTF8ToSys(sDst)), StatInfo.st_uid, StatInfo.st_gid) = -1 then begin Include(Result, caoCopyOwnership); end; end; end else begin if caoCopyTime in Options then begin utb.actime := StatInfo.st_atime; // last access time utb.modtime := StatInfo.st_mtime; // last modification time if fputime(PChar(UTF8ToSys(sDst)), @utb) <> 0 then Include(Result, caoCopyTime); end; if caoCopyOwnership in Options then begin if fpChown(PChar(UTF8ToSys(sDst)), StatInfo.st_uid, StatInfo.st_gid) = -1 then begin Include(Result, caoCopyOwnership); end; end; if caoCopyAttributes in Options then begin mode := StatInfo.st_mode; if caoRemoveReadOnlyAttr in Options then mode := SetModeReadOnly(mode, False); if fpChmod(PChar(UTF8ToSys(sDst)), mode) = -1 then begin Include(Result, caoCopyAttributes); end; end; end; end else Result := Options; end; {$ENDIF} function GetTempName(PathPrefix: String): String; const MaxTries = 100; var TryNumber: Integer = 0; begin if PathPrefix = '' then PathPrefix := GetTempDir; repeat Result := PathPrefix + IntToStr(System.Random(MaxInt)); // or use CreateGUID() Inc(TryNumber); if TryNumber = MaxTries then Exit(''); until not mbFileSystemEntryExists(Result); end; function MapFile(const sFileName : UTF8String; out FileMapRec : TFileMapRec) : Boolean; {$IFDEF MSWINDOWS} begin Result := False; with FileMapRec do begin MappedFile := nil; MappingHandle := 0; FileHandle := feInvalidHandle; FileSize := mbFileSize(sFileName); if FileSize = 0 then Exit; // Cannot map empty files FileHandle := mbFileOpen(sFileName, fmOpenRead); if FileHandle = feInvalidHandle then Exit; MappingHandle := CreateFileMapping(FileHandle, nil, PAGE_READONLY, 0, 0, nil); if MappingHandle <> 0 then begin MappedFile := MapViewOfFile(MappingHandle, FILE_MAP_READ, 0, 0, 0); if not Assigned(MappedFile) then begin UnMapFile(FileMapRec); Exit; end; end else begin UnMapFile(FileMapRec); Exit; end; end; Result := True; end; {$ELSE} var StatInfo: BaseUnix.Stat; begin Result:= False; with FileMapRec do begin MappedFile := nil; FileHandle:= fpOpen(PChar(UTF8ToSys(sFileName)), O_RDONLY); if FileHandle = feInvalidHandle then Exit; if fpfstat(FileHandle, StatInfo) <> 0 then begin UnMapFile(FileMapRec); Exit; end; FileSize := StatInfo.st_size; if FileSize = 0 then // Cannot map empty files begin UnMapFile(FileMapRec); Exit; end; MappedFile:= fpmmap(nil,FileSize,PROT_READ, MAP_PRIVATE{SHARED},FileHandle,0 ); if MappedFile = MAP_FAILED then begin MappedFile := nil; UnMapFile(FileMapRec); Exit; end; end; Result := True; end; {$ENDIF} procedure UnMapFile(var FileMapRec : TFileMapRec); {$IFDEF MSWINDOWS} begin with FileMapRec do begin if Assigned(MappedFile) then begin UnmapViewOfFile(MappedFile); MappedFile := nil; end; if MappingHandle <> 0 then begin CloseHandle(MappingHandle); MappingHandle := 0; end; if FileHandle <> feInvalidHandle then begin FileClose(FileHandle); FileHandle := feInvalidHandle; end; end; end; {$ELSE} begin with FileMapRec do begin if FileHandle <> feInvalidHandle then begin fpClose(FileHandle); FileHandle := feInvalidHandle; end; if Assigned(MappedFile) then begin fpmunmap(MappedFile,FileSize); MappedFile := nil; end; end; end; {$ENDIF} function ConsoleToUTF8(const Str: AnsiString): UTF8String; {$IFDEF MSWINDOWS} var Dst: PChar; {$ENDIF} begin Result:= Str; {$IFDEF MSWINDOWS} Dst:= AllocMem((Length(Result) + 1) * SizeOf(Char)); if OEMToChar(PChar(Result), Dst) then Result:= SysToUTF8(Dst); FreeMem(Dst); {$ENDIF} end; function mbFileOpen(const FileName: UTF8String; Mode: Word): System.THandle; {$IFDEF MSWINDOWS} begin Result:= CreateFileW(PWideChar(UTF8Decode(FileName)), AccessModes[Mode and 3], ShareModes[(Mode and $F0) shr 4], nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); end; {$ELSE} begin Result:= fpOpen(UTF8ToSys(FileName), AccessModes[Mode and 3]); end; {$ENDIF} function mbFileCreate(const FileName: UTF8String): System.THandle; {$IFDEF MSWINDOWS} begin Result := mbFileCreate(FileName, fmShareDenyWrite, 0); end; {$ELSE} begin Result:= fpOpen(UTF8ToSys(FileName), O_Creat or O_RdWr or O_Trunc); end; {$ENDIF} function mbFileCreate(const FileName: UTF8String; ShareMode: Longint): System.THandle; {$IFDEF MSWINDOWS} begin Result:= mbFileCreate(FileName, ShareMode, 0); end; {$ELSE} begin {$IF (FPC_VERSION > 2) or ((FPC_VERSION = 2) and (FPC_RELEASE >= 5))} Result:= FileCreate(UTF8ToSys(FileName), ShareMode, 438); // 438 = 666 octal {$ELSE} Result:= FileCreate(UTF8ToSys(FileName), 438); // 438 = 666 octal {$ENDIF} end; {$ENDIF} function mbFileCreate(const FileName: UTF8String; ShareMode: Longint; Rights: Longint): System.THandle; {$IFDEF MSWINDOWS} begin Result:= CreateFileW(PWideChar(UTF8Decode(FileName)), GENERIC_READ or GENERIC_WRITE, ShareModes[(ShareMode and $F0) shr 4], nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); end; {$ELSE} begin {$IF (FPC_VERSION > 2) or ((FPC_VERSION = 2) and (FPC_RELEASE >= 5))} Result:= FileCreate(UTF8ToSys(FileName), ShareMode, Rights); {$ELSE} Result:= FileCreate(UTF8ToSys(FileName), Rights); {$ENDIF} end; {$ENDIF} function mbFileAge(const FileName: UTF8String): DCBasicTypes.TFileTime; {$IFDEF MSWINDOWS} var Handle: System.THandle; FindData: TWin32FindDataW; wFileName: WideString; begin wFileName:= UTF8Decode(FileName); Handle := FindFirstFileW(PWChar(wFileName), FindData); if Handle <> INVALID_HANDLE_VALUE then begin Windows.FindClose(Handle); if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then Exit(DCBasicTypes.TWinFileTime(FindData.ftLastWriteTime)); end; Result:= DCBasicTypes.TFileTime(-1); end; {$ELSE} var Info: BaseUnix.Stat; begin Result:= DCBasicTypes.TFileTime(-1); if fpStat(UTF8ToSys(FileName), Info) >= 0 then {$PUSH}{$R-} Result := Info.st_mtime; {$POP} end; {$ENDIF} function mbFileGetTime(const FileName: UTF8String; var ModificationTime: DCBasicTypes.TFileTime; var CreationTime : DCBasicTypes.TFileTime; var LastAccessTime : DCBasicTypes.TFileTime): Boolean; {$IFDEF MSWINDOWS} var Handle: System.THandle; wFileName: WideString; begin wFileName:= UTF8Decode(FileName); Handle := CreateFileW(PWChar(wFileName), FILE_READ_ATTRIBUTES, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, // needed for opening directories 0); if Handle <> INVALID_HANDLE_VALUE then begin Result := Windows.GetFileTime(Handle, @CreationTime, @LastAccessTime, @ModificationTime); CloseHandle(Handle); end else Result := False; end; {$ELSE} var StatInfo : BaseUnix.Stat; begin Result := fpLStat(PChar(UTF8ToSys(FileName)), StatInfo) >= 0; if Result then begin LastAccessTime := StatInfo.st_atime; ModificationTime := StatInfo.st_mtime; CreationTime := StatInfo.st_ctime; end; end; {$ENDIF} function mbFileSetTime(const FileName: UTF8String; ModificationTime: DCBasicTypes.TFileTime; CreationTime : DCBasicTypes.TFileTime = 0; LastAccessTime : DCBasicTypes.TFileTime = 0): Boolean; {$IFDEF MSWINDOWS} var Handle: System.THandle; wFileName: WideString; PWinModificationTime: Windows.LPFILETIME = nil; PWinCreationTime: Windows.LPFILETIME = nil; PWinLastAccessTime: Windows.LPFILETIME = nil; begin wFileName:= UTF8Decode(FileName); Handle := CreateFileW(PWChar(wFileName), FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, // needed for opening directories 0); if Handle <> INVALID_HANDLE_VALUE then begin if ModificationTime <> 0 then begin PWinModificationTime := @ModificationTime; end; if CreationTime <> 0 then begin PWinCreationTime := @CreationTime; end; if LastAccessTime <> 0 then begin PWinLastAccessTime := @LastAccessTime; end; Result := Windows.SetFileTime(Handle, PWinCreationTime, PWinLastAccessTime, PWinModificationTime); CloseHandle(Handle); end else Result := False; end; {$ELSE} var t: TUTimBuf; begin t.actime := LastAccessTime; t.modtime := ModificationTime; Result := (fputime(PChar(UTF8ToSys(FileName)), @t) <> -1); end; {$ENDIF} function mbFileExists(const FileName: UTF8String) : Boolean; {$IFDEF MSWINDOWS} var Attr: Dword; wFileName: WideString; begin wFileName:= UTF8Decode(FileName); Attr:= GetFileAttributesW(PWChar(wFileName)); if Attr <> DWORD(-1) then Result:= (Attr and FILE_ATTRIBUTE_DIRECTORY) = 0 else Result:=False; end; {$ELSE} var Info: BaseUnix.Stat; begin // Can use fpStat, because link to an existing filename can be opened as if it were a real file. if fpStat(UTF8ToSys(FileName), Info) >= 0 then Result:= fpS_ISREG(Info.st_mode) else Result:= False; end; {$ENDIF} function mbFileAccess(const FileName: UTF8String; Mode: Word): Boolean; {$IFDEF MSWINDOWS} const AccessMode: array[0..2] of DWORD = ( GENERIC_READ, GENERIC_WRITE, GENERIC_READ or GENERIC_WRITE); var hFile: System.THandle; wFileName: WideString; dwDesiredAccess: DWORD; dwShareMode: DWORD = 0; begin wFileName:= UTF8Decode(FileName); dwDesiredAccess := AccessMode[Mode and 3]; if Mode = fmOpenRead then // If checking Read mode no sharing mode given Mode := Mode or fmShareDenyNone; dwShareMode := ShareModes[(Mode and $F0) shr 4]; hFile:= CreateFileW(PWChar(wFileName), dwDesiredAccess, dwShareMode, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); Result := hFile <> INVALID_HANDLE_VALUE; if Result then FileClose(hFile); end; {$ELSE} const AccessMode: array[0..2] of LongInt = ( R_OK, W_OK, R_OK or W_OK); begin Result:= fpAccess(UTF8ToSys(FileName), AccessMode[Mode and 3]) = 0; end; {$ENDIF} {$IFOPT R+} {$DEFINE uOSUtilsRangeCheckOn} {$R-} {$ENDIF} function mbFileGetAttr(const FileName: UTF8String): TFileAttrs; {$IFDEF MSWINDOWS} var wFileName: WideString; begin wFileName:= UTF8Decode(FileName); Result := GetFileAttributesW(PWChar(wFileName)); end; {$ELSE} var Info: BaseUnix.Stat; begin if fpLStat(UTF8ToSys(FileName), @Info) >= 0 then Result:= Info.st_mode else Result:= faInvalidAttributes; end; {$ENDIF} function mbFileSetAttr(const FileName: UTF8String; Attr: TFileAttrs): LongInt; {$IFDEF MSWINDOWS} var wFileName: WideString; begin wFileName:= UTF8Decode(FileName); if SetFileAttributesW(PWChar(wFileName), Attr) then Result:= 0 else Result:= GetLastError; end; {$ELSE} begin Result:= fpchmod(PChar(UTF8ToSys(FileName)), Attr); end; {$ENDIF} {$IFDEF uOSUtilsRangeCheckOn} {$R+} {$UNDEF uOSUtilsRangeCheckOn} {$ENDIF} function mbFileSetReadOnly(const FileName: UTF8String; ReadOnly: Boolean): Boolean; {$IFDEF MSWINDOWS} var iAttr: DWORD; wFileName: WideString; begin wFileName:= UTF8Decode(FileName); iAttr := GetFileAttributesW(PWChar(wFileName)); if iAttr = DWORD(-1) then Exit(False); if ReadOnly then iAttr:= iAttr or faReadOnly else iAttr:= iAttr and not faReadOnly; Result:= SetFileAttributesW(PWChar(wFileName), iAttr) = True; end; {$ELSE} var StatInfo: BaseUnix.Stat; mode: TMode; begin if fpStat(PChar(UTF8ToSys(FileName)), StatInfo) <> 0 then Exit(False); mode := SetModeReadOnly(StatInfo.st_mode, ReadOnly); Result:= fpchmod(PChar(UTF8ToSys(FileName)), mode) = 0; end; {$ENDIF} function mbDeleteFile(const FileName: UTF8String): Boolean; {$IFDEF MSWINDOWS} var wFileName: WideString; begin wFileName:= UTF8Decode(FileName); Result:= Windows.DeleteFileW(PWChar(wFileName)); end; {$ELSE} begin Result:= fpUnLink(UTF8ToSys(FileName)) = 0; end; {$ENDIF} function mbRenameFile(const OldName: UTF8String; NewName: UTF8String): Boolean; {$IFDEF MSWINDOWS} var wOldName, wNewName: WideString; begin wOldName:= UTF8Decode(OldName); wNewName:= UTF8Decode(NewName); Result:= MoveFileExW(PWChar(wOldName), PWChar(wNewName), MOVEFILE_REPLACE_EXISTING); end; {$ELSE} var tmpFileName: UTF8String; OldFileStat, NewFileStat: stat; begin if GetPathType(NewName) <> ptAbsolute then NewName := ExtractFilePath(OldName) + NewName; if OldName = NewName then Exit(True); if fpLstat(UTF8ToSys(OldName), OldFileStat) <> 0 then Exit(False); // Check if target file exists. if fpLstat(UTF8ToSys(NewName), NewFileStat) = 0 then begin // Check if source and target are the same files (same inode and same device). if (OldFileStat.st_ino = NewFileStat.st_ino) and (OldFileStat.st_dev = NewFileStat.st_dev) then begin // Check number of links. // If it is 1 then source and target names most probably differ only // by case on a case-insensitive filesystem. Direct rename() in such case // fails on Linux, so we use a temporary file name and rename in two stages. // If number of links is more than 1 then it's enough to simply unlink // the source file, since both files are technically identical. // (On Linux rename() returns success but doesn't do anything // if renaming a file to its hard link.) // We cannot use st_nlink for directories because it means "number of // subdirectories"; hard links to directories are not supported on Linux // or Windows anyway (on MacOSX they are). Therefore we always treat // directories as if they were a single link and rename them using temporary name. if (NewFileStat.st_nlink = 1) or BaseUnix.fpS_ISDIR(NewFileStat.st_mode) then begin tmpFileName := GetTempName(OldName); if FpRename(UTF8ToSys(OldName), UTF8ToSys(tmpFileName)) = 0 then begin if fpLstat(UTF8ToSys(NewName), NewFileStat) = 0 then begin // We have renamed the old file but the new file name still exists, // so this wasn't a single file on a case-insensitive filesystem // accessible by two names that differ by case. FpRename(UTF8ToSys(tmpFileName), UTF8ToSys(OldName)); // Restore old file. {$IFDEF DARWIN} // If it's a directory with multiple hard links then simply unlink the source. if BaseUnix.fpS_ISDIR(NewFileStat.st_mode) and (NewFileStat.st_nlink > 1) then Result := (fpUnLink(UTF8ToSys(OldName)) = 0) else {$ENDIF} Result := False; end else if FpRename(UTF8ToSys(tmpFileName), UTF8ToSys(NewName)) = 0 then begin Result := True; end else begin FpRename(UTF8ToSys(tmpFileName), UTF8ToSys(OldName)); // Restore old file. Result := False; end; end else Result := False; end else begin // Multiple links - simply unlink the source file. Result := (fpUnLink(UTF8ToSys(OldName)) = 0); end; Exit; end; end; Result := FpRename(UTF8ToSys(OldName), UTF8ToSys(NewName)) = 0; end; {$ENDIF} function mbFileSize(const FileName: UTF8String): Int64; {$IFDEF MSWINDOWS} var Handle: System.THandle; FindData: TWin32FindDataW; wFileName: WideString; begin Result:= 0; wFileName:= UTF8Decode(FileName); Handle := FindFirstFileW(PWideChar(wFileName), FindData); if Handle <> INVALID_HANDLE_VALUE then begin Windows.FindClose(Handle); if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then begin Int64Rec(Result).Lo:= FindData.nFileSizeLow; Int64Rec(Result).Hi:= FindData.nFileSizeHigh; end; end; end; {$ELSE} var Info: BaseUnix.Stat; begin Result:= 0; if fpStat(UTF8ToSys(FileName), Info) >= 0 then Result:= Info.st_size; end; {$ENDIF} function FileFlush(Handle: System.THandle): Boolean; {$IFDEF MSWINDOWS} begin Result:= FlushFileBuffers(Handle); end; {$ELSE} begin Result:= (fpfsync(Handle) = 0); end; {$ENDIF} function mbGetCurrentDir: UTF8String; {$IFDEF MSWINDOWS} var iSize: Integer; wsDir: WideString; begin Result:= ''; iSize:= GetCurrentDirectoryW(0, nil); if iSize > 0 then begin SetLength(wsDir, iSize); GetCurrentDirectoryW(iSize, PWideChar(wsDir)); wsDir:= PWideChar(wsDir); Result:= UTF8Encode(wsDir); end; end; {$ELSE} begin GetDir(0, Result); Result := SysToUTF8(Result); end; {$ENDIF} function mbSetCurrentDir(const NewDir: UTF8String): Boolean; {$IFDEF MSWINDOWS} var wsNewDir: WideString; NetResource: TNetResourceW; begin // Function WNetAddConnection2W works very slow // when the final character is a backslash ('\') wsNewDir:= UTF8Decode(ExcludeTrailingPathDelimiter(NewDir)); if Pos('\\', wsNewDir) = 1 then begin FillChar(NetResource, SizeOf(NetResource), #0); NetResource.dwType:= RESOURCETYPE_ANY; NetResource.lpRemoteName:= PWideChar(wsNewDir); WNetAddConnection2W(NetResource, nil, nil, CONNECT_INTERACTIVE); end; // MSDN says that the final character must be a backslash ('\'). wsNewDir:= wsNewDir + DirectorySeparator; Result:= SetCurrentDirectoryW(PWideChar(wsNewDir)); end; {$ELSE} begin Result:= fpChDir(PChar(UTF8ToSys(NewDir))) = 0; end; {$ENDIF} function mbDirectoryExists(const Directory: UTF8String) : Boolean; {$IFDEF MSWINDOWS} var Attr:Dword; wDirectory: WideString; begin wDirectory:= UTF8Decode(Directory); Attr:= GetFileAttributesW(PWChar(wDirectory)); if Attr <> DWORD(-1) then Result:= (Attr and FILE_ATTRIBUTE_DIRECTORY) > 0 else Result:= False; end; {$ELSE} var Info: BaseUnix.Stat; begin // We can use fpStat here instead of fpLstat, so that True is returned // when target is a directory or a link to an existing directory. // Note that same behaviour would be achieved by passing paths // that end with path delimiter to fpLstat. // Paths with links can be used the same way as if they were real directories. if fpStat(UTF8ToSys(Directory), Info) >= 0 then Result:= fpS_ISDIR(Info.st_mode) else Result:= False; end; {$ENDIF} function mbCreateDir(const NewDir: UTF8String): Boolean; {$IFDEF MSWINDOWS} var wNewDir: WideString; begin wNewDir:= UTF8Decode(NewDir); Result:= CreateDirectoryW(PWChar(wNewDir), nil); end; {$ELSE} begin Result:= fpMkDir(PChar(UTF8ToSys(NewDir)), $1FF) = 0; // $1FF = &0777 end; {$ENDIF} function mbRemoveDir(const Dir: UTF8String): Boolean; {$IFDEF MSWINDOWS} var wDir: WideString; begin wDir:= UTF8Decode(Dir); Result:= RemoveDirectoryW(PWChar(wDir)); end; {$ELSE} begin Result:= fpRmDir(PChar(UTF8ToSys(Dir))) = 0; end; {$ENDIF} function mbFileSystemEntryExists(const Path: UTF8String): Boolean; begin Result := mbFileGetAttr(Path) <> faInvalidAttributes; end; function mbCompareFileNames(const FileName1, FileName2: UTF8String): Boolean; inline; {$IF DEFINED(WINDOWS) OR DEFINED(DARWIN)} begin Result:= (WideCompareText(UTF8Decode(FileName1), UTF8Decode(FileName2)) = 0); end; {$ELSE} begin Result:= (WideCompareStr(UTF8Decode(FileName1), UTF8Decode(FileName2)) = 0); end; {$ENDIF} function mbSameFile(const FileName1, FileName2: String): Boolean; {$IF DEFINED(MSWINDOWS)} var FileHandle1, FileHandle2: System.THandle; FileInfo1, FileInfo2: BY_HANDLE_FILE_INFORMATION; begin Result := mbCompareFileNames(FileName1, FileName2); if not Result then begin FileHandle1 := CreateFileW(PWideChar(UTF8Decode(FileName1)), FILE_READ_ATTRIBUTES, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_EXISTING, 0, 0); if FileHandle1 <> INVALID_HANDLE_VALUE then begin FileHandle2 := CreateFileW(PWideChar(UTF8Decode(FileName2)), FILE_READ_ATTRIBUTES, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_EXISTING, 0, 0); if FileHandle2 <> INVALID_HANDLE_VALUE then begin if GetFileInformationByHandle(FileHandle1, FileInfo1) and GetFileInformationByHandle(FileHandle2, FileInfo2) then begin // Check if both files have the same index on the same volume. // This check is valid only while both files are open. Result := (FileInfo1.dwVolumeSerialNumber = FileInfo2.dwVolumeSerialNumber) and (FileInfo1.nFileIndexHigh = FileInfo2.nFileIndexHigh) and (FileInfo1.nFileIndexLow = FileInfo2.nFileIndexLow); end; CloseHandle(FileHandle2); end; CloseHandle(FileHandle1); end end; end; {$ELSEIF DEFINED(UNIX)} var File1Stat, File2Stat: stat; begin Result := mbCompareFileNames(FileName1, FileName2) or ( (fpLstat(UTF8ToSys(FileName1), File1Stat) = 0) and (fpLstat(UTF8ToSys(FileName2), File2Stat) = 0) and (File1Stat.st_ino = File2Stat.st_ino) and (File1Stat.st_dev = File2Stat.st_dev) ); end; {$ENDIF} function mbGetEnvironmentString(Index: Integer): UTF8String; {$IFDEF MSWINDOWS} var hp, p: PWideChar; begin Result:= ''; p:= GetEnvironmentStringsW; hp:= p; if (hp <> nil) then begin while (hp^ <> #0) and (Index > 1) do begin Dec(Index); hp:= hp + lstrlenW(hp) + 1; end; if (hp^ <> #0) then Result:= UTF8Encode(WideString(hp)); end; FreeEnvironmentStringsW(p); end; {$ELSE} begin Result:= SysToUTF8(GetEnvironmentString(Index)); end; {$ENDIF} function mbSysErrorMessage(ErrorCode: Integer): UTF8String; begin Result := {$IFDEF WINDOWS} UTF8Encode(SysErrorMessage(ErrorCode)); {$ELSE} SysToUTF8(SysErrorMessage(ErrorCode)); {$ENDIF} end; function mbLoadLibrary(const Name: UTF8String): TLibHandle; {$IFDEF MSWINDOWS} var wsName: WideString; begin wsName:= UTF8Decode(Name); Result:= LoadLibraryW(PWideChar(wsName)); end; {$ELSE} begin Result:= TLibHandle(dlopen(PChar(UTF8ToSys(Name)), RTLD_LAZY)); end; {$ENDIF} end. doublecmd-0.5.8/components/doublecmd/doublecmd_common.pas0000644000175000017500000000047412045277161022656 0ustar alexxalexx{ This file was automatically created by Lazarus. Do not edit! This source is only used to compile and install the package. } unit doublecmd_common; interface uses DCClassesUtf8, DCOSUtils, DCStrUtils, DCBasicTypes, DCFileAttributes, DCConvertEncoding, DCDateTimeUtils, DCXmlConfig; implementation end. doublecmd-0.5.8/components/doublecmd/dcfileattributes.pas0000644000175000017500000002337712014201074022676 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Functions handling file attributes. Copyright (C) 2012 Przemysław Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit DCFileAttributes; {$mode objfpc}{$H+} interface uses Classes, SysUtils, DCBasicTypes; const // Windows attributes FILE_ATTRIBUTE_READONLY = $0001; FILE_ATTRIBUTE_HIDDEN = $0002; FILE_ATTRIBUTE_SYSTEM = $0004; FILE_ATTRIBUTE_DIRECTORY = $0010; FILE_ATTRIBUTE_ARCHIVE = $0020; FILE_ATTRIBUTE_NORMAL = $0080; FILE_ATTRIBUTE_TEMPORARY = $0100; FILE_ATTRIBUTE_SPARSE_FILE = $0200; FILE_ATTRIBUTE_REPARSE_POINT = $0400; FILE_ATTRIBUTE_COMPRESSED = $0800; FILE_ATTRIBUTE_OFFLINE = $1000; FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = $2000; FILE_ATTRIBUTE_ENCRYPTED = $4000; FILE_ATTRIBUTE_VIRTUAL = $20000; // Unix attributes { attributes mask } S_IFMT = $F000; { first-in/first-out (FIFO/pipe) } S_IFIFO = $1000; { character-special file (tty/console) } S_IFCHR = $2000; { directory } S_IFDIR = $4000; { blocking device (unused) } S_IFBLK = $6000; { regular } S_IFREG = $8000; { symbolic link (unused) } S_IFLNK = $A000; { Berkeley socket } S_IFSOCK = $C000; { mode_t possible values } S_IRUSR = %0100000000; { Read permission for owner } S_IWUSR = %0010000000; { Write permission for owner } S_IXUSR = %0001000000; { Exec permission for owner } S_IRGRP = %0000100000; { Read permission for group } S_IWGRP = %0000010000; { Write permission for group } S_IXGRP = %0000001000; { Exec permission for group } S_IROTH = %0000000100; { Read permission for world } S_IWOTH = %0000000010; { Write permission for world } S_IXOTH = %0000000001; { Exec permission for world } S_IRWXU = S_IRUSR or S_IWUSR or S_IXUSR; S_IRWXG = S_IRGRP or S_IWGRP or S_IXGRP; S_IRWXO = S_IROTH or S_IWOTH or S_IXOTH; { POSIX setuid(), setgid(), and sticky bit } S_ISUID = $0800; S_ISGID = $0400; S_ISVTX = $0200; function WinToUnixFileAttr(Attr: TFileAttrs): TFileAttrs; function UnixToWinFileAttr(Attr: TFileAttrs): TFileAttrs; function UnixToWinFileAttr(const FileName: String; Attr: TFileAttrs): TFileAttrs; function SingleStrToFileAttr(sAttr: String): TFileAttrs; function WinSingleStrToFileAttr(sAttr: String): TFileAttrs; function UnixSingleStrToFileAttr(sAttr: String): TFileAttrs; {en Convert file attributes from string to number @param(Attributes File attributes as string) @returns(File attributes as number) } function StrToFileAttr(sAttr: String): TFileAttrs; {en Convert file attributes to string in the format of "attr1+attr2+attr3+". @param(Attributes File attributes) @returns(File attributes as string) } function FileAttrToStr(Attr: TFileAttrs): String; {en Convert Windows file attributes from string to number @param(Attributes File attributes as string) @returns(File attributes as number) } function WinStrToFileAttr(sAttr: String): TFileAttrs; {en Convert Unix file attributes from string to number @param(Attributes File attributes as string) @returns(File attributes as number) } function UnixStrToFileAttr(sAttr: String): TFileAttrs; implementation uses DCStrUtils; type TAttrStrToFileAttr = record Str: String; Attr: TFileAttrs; end; const WinAttrStrToFileAttr: array[0..9] of TAttrStrToFileAttr = ( (Str: 'r'; Attr: FILE_ATTRIBUTE_READONLY), (Str: 'h'; Attr: FILE_ATTRIBUTE_HIDDEN), (Str: 's'; Attr: FILE_ATTRIBUTE_SYSTEM), (Str: 'd'; Attr: FILE_ATTRIBUTE_DIRECTORY), (Str: 'a'; Attr: FILE_ATTRIBUTE_ARCHIVE), (Str: 't'; Attr: FILE_ATTRIBUTE_TEMPORARY), (Str: 'p'; Attr: FILE_ATTRIBUTE_SPARSE_FILE), (Str: 'l'; Attr: FILE_ATTRIBUTE_REPARSE_POINT), (Str: 'c'; Attr: FILE_ATTRIBUTE_COMPRESSED), (Str: 'e'; Attr: FILE_ATTRIBUTE_ENCRYPTED)); UnixAttrStrToFileAttr: array[0..18] of TAttrStrToFileAttr = ( // Permissions (Str: 'ur'; Attr: S_IRUSR), (Str: 'uw'; Attr: S_IWUSR), (Str: 'ux'; Attr: S_IXUSR), (Str: 'gr'; Attr: S_IRGRP), (Str: 'gw'; Attr: S_IWGRP), (Str: 'gx'; Attr: S_IXGRP), (Str: 'or'; Attr: S_IROTH), (Str: 'ow'; Attr: S_IWOTH), (Str: 'ox'; Attr: S_IXOTH), (Str: 'us'; Attr: S_ISUID), (Str: 'gs'; Attr: S_ISGID), (Str: 'sb'; Attr: S_ISVTX), // File types (Str: 'f'; Attr: S_IFIFO), (Str: 'c'; Attr: S_IFCHR), (Str: 'd'; Attr: S_IFDIR), (Str: 'b'; Attr: S_IFBLK), (Str: 'r'; Attr: S_IFREG), (Str: 'l'; Attr: S_IFLNK), (Str: 's'; Attr: S_IFSOCK)); function WinToUnixFileAttr(Attr: TFileAttrs): TFileAttrs; begin Result := S_IRUSR or S_IRGRP or S_IROTH; if (Attr and faReadOnly) = 0 then Result := Result or S_IWUSR; if (Attr and faDirectory) <> 0 then Result := Result or S_IFDIR else Result := Result or S_IFREG; end; function UnixToWinFileAttr(Attr: TFileAttrs): TFileAttrs; begin Result := 0; case (Attr and S_IFMT) of 0, S_IFREG: Result := faArchive; S_IFLNK: Result := Result or faSymLink; S_IFDIR: Result := Result or faDirectory; S_IFIFO, S_IFCHR, S_IFBLK, S_IFSOCK: Result := Result or faSysFile; end; if (Attr and S_IWUSR) = 0 then Result := Result or faReadOnly; end; function UnixToWinFileAttr(const FileName: String; Attr: TFileAttrs): TFileAttrs; begin Result := UnixToWinFileAttr(Attr); if (Length(FileName) > 1) and (FileName[1] = '.') and (FileName[2] <> '.') then Result := Result or faHidden; end; function SingleStrToFileAttr(sAttr: String): TFileAttrs; begin {$IF DEFINED(MSWINDOWS)} Result := WinSingleStrToFileAttr(sAttr); {$ELSEIF DEFINED(UNIX)} Result := UnixSingleStrToFileAttr(sAttr); {$ENDIF} end; function WinSingleStrToFileAttr(sAttr: String): TFileAttrs; var i: Integer; begin for i := Low(WinAttrStrToFileAttr) to High(WinAttrStrToFileAttr) do begin if sAttr = WinAttrStrToFileAttr[i].Str then Exit(WinAttrStrToFileAttr[i].Attr); end; Result := 0; end; function UnixSingleStrToFileAttr(sAttr: String): TFileAttrs; var i: Integer; begin if Length(sAttr) > 0 then begin if sAttr[1] in ['0'..'7'] then begin // Octal representation. Exit(TFileAttrs(OctToDec(sAttr))); end else begin for i := Low(UnixAttrStrToFileAttr) to High(UnixAttrStrToFileAttr) do begin if sAttr = UnixAttrStrToFileAttr[i].Str then Exit(UnixAttrStrToFileAttr[i].Attr); end; end; end; Result := 0; end; function StrToFileAttr(sAttr: String): TFileAttrs; inline; begin {$IF DEFINED(MSWINDOWS)} Result := WinStrToFileAttr(sAttr); {$ELSEIF DEFINED(UNIX)} Result := UnixStrToFileAttr(sAttr); {$ENDIF} end; function FileAttrToStr(Attr: TFileAttrs): String; var i: Integer; begin Result := ''; {$IF DEFINED(MSWINDOWS)} for i := Low(WinAttrStrToFileAttr) to High(WinAttrStrToFileAttr) do begin if Attr and WinAttrStrToFileAttr[i].Attr <> 0 then Result := Result + WinAttrStrToFileAttr[i].Str + '+'; end; {$ELSEIF DEFINED(UNIX)} for i := Low(UnixAttrStrToFileAttr) to High(UnixAttrStrToFileAttr) do begin if Attr and UnixAttrStrToFileAttr[i].Attr <> 0 then Result := Result + UnixAttrStrToFileAttr[i].Str + '+'; end; {$ENDIF} end; function WinStrToFileAttr(sAttr: String): TFileAttrs; var I: LongInt; begin Result:= 0; sAttr:= LowerCase(sAttr); for I:= 1 to Length(sAttr) do case sAttr[I] of 'd': Result := Result or FILE_ATTRIBUTE_DIRECTORY; 'l': Result := Result or FILE_ATTRIBUTE_REPARSE_POINT; 'r': Result := Result or FILE_ATTRIBUTE_READONLY; 'a': Result := Result or FILE_ATTRIBUTE_ARCHIVE; 'h': Result := Result or FILE_ATTRIBUTE_HIDDEN; 's': Result := Result or FILE_ATTRIBUTE_SYSTEM; end; end; function UnixStrToFileAttr(sAttr: String): TFileAttrs; begin Result:= 0; if Length(sAttr) < 10 then Exit; sAttr:= LowerCase(sAttr); if sAttr[1]='d' then Result:= Result or S_IFDIR; if sAttr[1]='l' then Result:= Result or S_IFLNK; if sAttr[1]='s' then Result:= Result or S_IFSOCK; if sAttr[1]='f' then Result:= Result or S_IFIFO; if sAttr[1]='b' then Result:= Result or S_IFBLK; if sAttr[1]='c' then Result:= Result or S_IFCHR; if sAttr[2]='r' then Result:= Result or S_IRUSR; if sAttr[3]='w' then Result:= Result or S_IWUSR; if sAttr[4]='x' then Result:= Result or S_IXUSR; if sAttr[5]='r' then Result:= Result or S_IRGRP; if sAttr[6]='w' then Result:= Result or S_IWGRP; if sAttr[7]='x' then Result:= Result or S_IXGRP; if sAttr[8]='r' then Result:= Result or S_IROTH; if sAttr[9]='w' then Result:= Result or S_IWOTH; if sAttr[10]='x' then Result:= Result or S_IXOTH; if sAttr[4]='s' then Result:= Result or S_ISUID; if sAttr[7]='s' then Result:= Result or S_ISGID; end; end. doublecmd-0.5.8/components/doublecmd/dcbasictypes.pas0000644000175000017500000000310211742264573022022 0ustar alexxalexx{ Double commander ------------------------------------------------------------------------- Definitions of basic types. Copyright (C) 2012 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit DCBasicTypes; interface type TLibHandle = PtrInt; TDynamicStringArray = array of String; TCharSet = set of Char; TFileAttrs = Cardinal; // file attributes type regardless of system TWinFileTime = QWord; // NTFS time (UTC) (2 x DWORD) TDosFileTime = LongInt; // MS-DOS time (local) {$IFDEF MSWINDOWS} TFileTime = TWinFileTime; {$ELSE} // Unix time (UTC). // Unix defines time_t as signed integer, // but we define it as unsigned because sign is not needed. {$IFDEF cpu64} TFileTime = QWord; {$ELSE} TFileTime = DWord; {$ENDIF} {$ENDIF} TUnixFileTime = TFileTime; PFileTime = ^TFileTime; PWinFileTime = ^TWinFileTime; implementation end. doublecmd-0.5.8/components/doublecmd/dcclassesutf8.pas0000644000175000017500000001420112045505045022107 0ustar alexxalexx{ Double commander ------------------------------------------------------------------------- This module contains classes with UTF8 file names support. Copyright (C) 2008-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit DCClassesUtf8; {$mode objfpc}{$H+} interface uses Classes, RtlConsts, SysUtils, IniFiles; {$IF (FPC_VERSION = 2) and (FPC_RELEASE < 5)} const { TFileStream create mode } fmCreate = $FF00; {$ENDIF} type { TFileStreamEx class } TFileStreamEx = class(THandleStream) private FHandle: THandle; FFileName: UTF8String; public constructor Create(const AFileName: UTF8String; Mode: Word); destructor Destroy; override; {$IF (FPC_VERSION <= 2) and (FPC_RELEASE <= 4) and (FPC_PATCH <= 0)} function ReadQWord: QWord; procedure WriteQWord(q: QWord); {$ENDIF} property FileName: UTF8String read FFileName; end; { TStringListEx } TStringListEx = class(TStringList) public function IndexOfValue(const Value: String): Integer; procedure LoadFromFile(const FileName: String); override; procedure SaveToFile(const FileName: String); override; end; { TIniFileEx } THackIniFile = class private FFileName: String; FSectionList: TIniFileSectionList; end; TIniFileEx = class(TIniFile) private FIniFileStream: TFileStreamEx; FReadOnly: Boolean; function GetFileName: UTF8String; procedure SetFileName(const AValue: UTF8String); public constructor Create(const AFileName: String; Mode: Word); virtual; constructor Create(const AFileName: string; AEscapeLineFeeds : Boolean = False); override; destructor Destroy; override; procedure UpdateFile; override; public procedure Clear; property FileName: UTF8String read GetFileName write SetFileName; property ReadOnly: Boolean read FReadOnly; end; implementation uses DCOSUtils; { TFileStreamEx } constructor TFileStreamEx.Create(const AFileName: UTF8String; Mode: Word); begin if (Mode and fmCreate) <> 0 then begin FHandle:= mbFileCreate(AFileName, Mode); if FHandle = feInvalidHandle then raise EFCreateError.CreateFmt(SFCreateError, [AFileName]) else inherited Create(FHandle); end else begin FHandle:= mbFileOpen(AFileName, Mode); if FHandle = feInvalidHandle then raise EFOpenError.CreateFmt(SFOpenError, [AFilename]) else inherited Create(FHandle); end; FFileName:= AFileName; end; destructor TFileStreamEx.Destroy; begin inherited Destroy; // Close handle after destroying the base object, because it may use Handle in Destroy. if FHandle >= 0 then FileClose(FHandle); end; {$IF (FPC_VERSION <= 2) and (FPC_RELEASE <= 4) and (FPC_PATCH <= 0)} function TFileStreamEx.ReadQWord: QWord; var q: QWord; begin ReadBuffer(q, SizeOf(QWord)); ReadQWord:= q; end; procedure TFileStreamEx.WriteQWord(q: QWord); begin WriteBuffer(q, SizeOf(QWord)); end; {$ENDIF} { TStringListEx } function TStringListEx.IndexOfValue(const Value: String): Integer; var iStart: LongInt; sTemp: String; begin CheckSpecialChars; Result:= 0; while (Result < Count) do begin sTemp:= Strings[Result]; iStart:= Pos(NameValueSeparator, sTemp) + 1; if (iStart > 0) and (DoCompareText(Value, Copy(sTemp, iStart, MaxInt)) = 0) then Exit; Inc(result); end; Result:= -1; end; procedure TStringListEx.LoadFromFile(const FileName: String); var fsFileStream: TFileStreamEx; begin fsFileStream:= TFileStreamEx.Create(FileName, fmOpenRead or fmShareDenyNone); LoadFromStream(fsFileStream); fsFileStream.Free; end; procedure TStringListEx.SaveToFile(const FileName: String); var fsFileStream: TFileStreamEx = nil; begin try if mbFileExists(FileName) then begin fsFileStream:= TFileStreamEx.Create(FileName, fmOpenWrite or fmShareDenyWrite); fsFileStream.Position:= 0; fsFileStream.Size:= 0; end else fsFileStream:= TFileStreamEx.Create(FileName, fmCreate); SaveToStream(fsFileStream); finally fsFileStream.Free; end; end; { TIniFileEx } function TIniFileEx.GetFileName: UTF8String; begin Result:= THackIniFile(Self).FFileName; end; procedure TIniFileEx.SetFileName(const AValue: UTF8String); begin THackIniFile(Self).FFileName:= AValue; end; constructor TIniFileEx.Create(const AFileName: String; Mode: Word); begin FReadOnly := ((Mode and $03) = fmOpenRead); if mbFileExists(AFileName) then begin if (Mode and $F0) = 0 then Mode := Mode or fmShareDenyWrite; end else begin Mode := fmCreate; end; FIniFileStream:= TFileStreamEx.Create(AFileName, Mode); inherited Create(FIniFileStream); FileName:= AFileName; end; constructor TIniFileEx.Create(const AFileName: string; AEscapeLineFeeds: Boolean); begin if mbFileAccess(AFileName, fmOpenReadWrite or fmShareDenyWrite) then Create(AFileName, fmOpenReadWrite or fmShareDenyWrite) else Create(AFileName, fmOpenRead or fmShareDenyNone); end; procedure TIniFileEx.UpdateFile; begin if not ReadOnly then begin Stream.Position:=0; Stream.Size:= 0; FileName:= EmptyStr; inherited UpdateFile; FileName:= FIniFileStream.FileName; end; end; procedure TIniFileEx.Clear; begin THackIniFile(Self).FSectionList.Clear; end; destructor TIniFileEx.Destroy; begin inherited Destroy; // Destroy stream after destroying the base object, because it may use the stream in Destroy. FreeAndNil(FIniFileStream); end; end. doublecmd-0.5.8/components/doublecmd/dcdatetimeutils.pas0000644000175000017500000004157311742350772022544 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Date and time functions. Copyright (C) 2009-2012 Przemysław Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit DCDateTimeUtils; {$mode objfpc}{$H+} interface uses Classes, SysUtils, DCBasicTypes {$IF DEFINED(MSWINDOWS)} , Windows {$ELSEIF DEFINED(UNIX)} , unixutil {$ENDIF} ; function FileTimeToDateTime(FileTime : DCBasicTypes.TFileTime) : TDateTime; function DateTimeToFileTime(DateTime : TDateTime) : DCBasicTypes.TFileTime; {en Converts system specific UTC time to local time. } function FileTimeToLocalFileTime(const FileTime: DCBasicTypes.TFileTime; out LocalFileTime: DCBasicTypes.TFileTime): LongBool; {en Converts system specific local time to UTC time. } function LocalFileTimeToFileTime(const LocalFileTime: DCBasicTypes.TFileTime; out FileTime: DCBasicTypes.TFileTime): LongBool; {en Converts Windows UTC file time to Windows local file time. @param(lpFileTime TWinFileTime structure containing the UTC-based file time) @param(lpLocalFileTime TWinFileTime structure to receive the converted local file time) @returns(The function returns @true if successful, @false otherwise) } function WinFileTimeToLocalFileTime(const FileTime: TWinFileTime; out LocalFileTime: TWinFileTime): LongBool; {en Converts Windows local file time to Windows UTC file time. @param(lpLocalFileTime TWinFileTime structure that specifies the local file time) @param(lpFileTime TWinFileTime structure to receive the converted UTC-based file time) @returns(The function returns @true if successful, @false otherwise) } function WinLocalFileTimeToFileTime(const LocalFileTime: TWinFileTime; out FileTime: TWinFileTime): LongBool; {en Converts Windows UTC file time to a file time in TDateTime format. @param(ft TWinFileTime structure containing the UTC-based file time) @returns(File time in TDateTime format) } function WinFileTimeToDateTime(ft : TWinFileTime) : TDateTime; {en Converts a file time in TDateTime format to Windows UTC file time. @param(dt File time in TDateTime format) @returns(Windows UTC-based file time) } function DateTimeToWinFileTime(dt : TDateTime) : TWinFileTime; function DosFileTimeToDateTime(const DosTime: TDosFileTime): TDateTime; function DateTimeToDosFileTime(const DateTime: TDateTime): TDosFileTime; {$IFDEF MSWINDOWS} function WinFileTimeToDateTime(ft : Windows.FILETIME) : TDateTime; inline; overload; function WinToDosTime(const WinTime: Windows.FILETIME; var DosTime: TDosFileTime): LongBool; overload; function DosToWinTime(const DosTime: TDosFileTime; var WinTime: Windows.FILETIME): LongBool; overload; function WinToDosTime(const WinTime: TWinFileTime; var DosTime: TDosFileTime): LongBool; function DosToWinTime(const DosTime: TDosFileTime; var WinTime: TWinFileTime): LongBool; {$ENDIF} function UnixFileTimeToDateTime(UnixTime: TUnixFileTime) : TDateTime; function DateTimeToUnixFileTime(DateTime: TDateTime) : TUnixFileTime; function UnixFileTimeToDosTime(UnixTime: TUnixFileTime): TDosFileTime; function UnixFileTimeToWinTime(UnixTime: TUnixFileTime): TWinFileTime; function GetTimeZoneBias: LongInt; {en Converts a month short name to month number. @param(ShortMonthName Month short name) @param(Default Default month number) @returns(Month number) } function MonthToNumberDef(const ShortMonthName: String; Default: Word): Word; {en Converts a year short record to year long record if need (10 -> 2010). @param(Year Year short record) @returns(Year long record) } function YearShortToLong(Year: Word): Word; function TwelveToTwentyFour(Hour: Word; Modifier: AnsiString): Word; type EDateOutOfRange = class(EConvertError) private FDateTime: TDateTime; public constructor Create(ADateTime: TDateTime); property DateTime: TDateTime read FDateTime; end; implementation uses DateUtils; const { Short names of months. } ShortMonthNames: TMonthNameArray = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec'); SecsPerHour = SecsPerMin * MinsPerHour; {$IF DEFINED(MSWINDOWS)} var WinTimeZoneBias: LongInt; {$ENDIF} function AdjustUnixFileTime(const FileTime: DCBasicTypes.TFileTime; out AdjustedFileTime: DCBasicTypes.TFileTime; AdjustValue: Int64): Boolean; begin if AdjustValue < 0 then begin if FileTime < DCBasicTypes.TFileTime(-AdjustValue) then begin AdjustedFileTime := 0; Result := False; end else begin AdjustedFileTime := FileTime - DCBasicTypes.TFileTime(-AdjustValue); Result := True; end; end else begin if High(FileTime) - FileTime < DCBasicTypes.TFileTime(AdjustValue) then begin AdjustedFileTime := High(FileTime); Result := False; end else begin AdjustedFileTime := FileTime + DCBasicTypes.TFileTime(AdjustValue); Result := True; end; end; end; function AdjustWinFileTime(const FileTime: TWinFileTime; out AdjustedFileTime: TWinFileTime; AdjustValue: Int64): Boolean; begin if AdjustValue < 0 then begin if FileTime < DCBasicTypes.TWinFileTime(-AdjustValue) then begin AdjustedFileTime := 0; Result := False; end else begin AdjustedFileTime := FileTime - DCBasicTypes.TWinFileTime(-AdjustValue); Result := True; end; end else begin if High(FileTime) - FileTime < DCBasicTypes.TWinFileTime(AdjustValue) then begin AdjustedFileTime := High(FileTime); Result := False; end else begin AdjustedFileTime := FileTime + DCBasicTypes.TWinFileTime(AdjustValue); Result := True; end; end; end; function FileTimeToDateTime(FileTime : DCBasicTypes.TFileTime) : TDateTime; {$IF DEFINED(MSWINDOWS)} begin Result := WinFileTimeToDateTime(FileTime); end; {$ELSEIF DEFINED(UNIX)} var Hrs, Mins, Secs : Word; TodaysSecs : DCBasicTypes.TFileTime; begin FileTimeToLocalFileTime(FileTime, FileTime); TodaysSecs := FileTime mod SecsPerDay; Hrs := Word(TodaysSecs div SecsPerHour); TodaysSecs := TodaysSecs - (Hrs * SecsPerHour); Mins := Word(TodaysSecs div SecsPerMin); Secs := Word(TodaysSecs - (Mins * SecsPerMin)); Result := UnixEpoch + // Epoch start + (FileTime div SecsPerDay) + // Number of days + EncodeTime(Hrs, Mins, Secs, 0); // Time end; {$ELSE} begin Result := 0; end; {$ENDIF} function DateTimeToFileTime(DateTime : TDateTime) : DCBasicTypes.TFileTime; {$IF DEFINED(MSWINDOWS)} begin Result := DateTimeToWinFileTime(DateTime); end; {$ELSEIF DEFINED(UNIX)} var Hrs, Mins, Secs, MSecs : Word; Dt, Tm : TDateTime; BigTime: QWord; begin Dt := Trunc(DateTime); Tm := DateTime - Dt; if Dt < UnixEpoch then raise EDateOutOfRange.Create(DateTime) else {$PUSH}{$Q-} BigTime := Trunc(Dt - UnixEpoch) * SecsPerDay; {$POP} DecodeTime(Tm, Hrs, Mins, Secs, MSecs); {$PUSH}{$Q-} BigTime := BigTime + QWord(Hrs * SecsPerHour) + QWord(Mins * SecsPerMin) + Secs; {$POP} {$IFDEF cpu32} if BigTime > High(DCBasicTypes.TFileTime) then raise EDateOutOfRange.Create(DateTime) else {$ENDIF} LocalFileTimeToFileTime(BigTime, Result); end; {$ELSE} begin Result := 0; end; {$ENDIF} function FileTimeToLocalFileTime(const FileTime: DCBasicTypes.TFileTime; out LocalFileTime: DCBasicTypes.TFileTime): LongBool; {$IFDEF MSWINDOWS} begin Result := Windows.FileTimeToLocalFileTime(@Windows.FILETIME(FileTime), @Windows.FILETIME(LocalFileTime)); end; {$ELSE} begin Result := AdjustUnixFileTime(FileTime, LocalFileTime, Tzseconds); end; {$ENDIF} function LocalFileTimeToFileTime(const LocalFileTime: DCBasicTypes.TFileTime; out FileTime: DCBasicTypes.TFileTime): LongBool; {$IFDEF MSWINDOWS} begin Result := Windows.LocalFileTimeToFileTime(@Windows.FILETIME(LocalFileTime), @Windows.FILETIME(FileTime)); end; {$ELSE} begin Result := AdjustUnixFileTime(LocalFileTime, FileTime, -Tzseconds); end; {$ENDIF} function WinFileTimeToLocalFileTime(const FileTime: TWinFileTime; out LocalFileTime: TWinFileTime): LongBool; {$IFDEF MSWINDOWS} begin Result := Windows.FileTimeToLocalFileTime(@Windows.FILETIME(FileTime), @Windows.FILETIME(LocalFileTime)); end; {$ELSE} begin Result := AdjustWinFileTime(FileTime, LocalFileTime, 10000000 * Int64(TZSeconds)); end; {$ENDIF} function WinLocalFileTimeToFileTime(const LocalFileTime: TWinFileTime; out FileTime: TWinFileTime): LongBool; {$IFDEF MSWINDOWS} begin Result := Windows.LocalFileTimeToFileTime(@Windows.FILETIME(LocalFileTime), @Windows.FILETIME(FileTime)); end; {$ELSE} begin Result := AdjustWinFileTime(LocalFileTime, FileTime, -10000000 * Int64(TZSeconds)); end; {$ENDIF} function WinFileTimeToDateTime(ft : TWinFileTime) : TDateTime; begin WinFileTimeToLocalFileTime(ft,ft); Result := (ft / 864000000000.0) - 109205.0; end; function DateTimeToWinFileTime(dt : TDateTime) : TWinFileTime; begin Result := Round((dt + 109205.0) * 864000000000.0); WinLocalFileTimeToFileTime(Result, Result); end; function DosFileTimeToDateTime(const DosTime: TDosFileTime): TDateTime; var Yr, Mo, Dy : Word; Hr, Mn, S : Word; FileDate, FileTime : Word; begin FileDate := LongRec(DosTime).Hi; FileTime := LongRec(DosTime).Lo; Yr := FileDate shr 9 + 1980; Mo := FileDate shr 5 and 15; if Mo < 1 then Mo := 1; if Mo > 12 then Mo := 12; Dy := FileDate and 31; if Dy < 1 then Dy := 1; if Dy > DaysInAMonth(Yr, Mo) then Dy := DaysInAMonth(Yr, Mo); Hr := FileTime shr 11; if Hr > 23 then Hr := 23; Mn := FileTime shr 5 and 63; if Mn > 59 then Mn := 59; S := FileTime and 31 shl 1; if S > 59 then S := 59; Result := ComposeDateTime(EncodeDate(Yr, Mo, Dy), EncodeTime(Hr, Mn, S, 0)); end; function DateTimeToDosFileTime(const DateTime: TDateTime): TDosFileTime; var Yr, Mo, Dy : Word; Hr, Mn, S, MS: Word; begin DecodeDate(DateTime, Yr, Mo, Dy); if (Yr < 1980) or (Yr > 2107) then // outside DOS file date year range Yr := 1980; DecodeTime(DateTime, Hr, Mn, S, MS); LongRec(Result).Lo := (S shr 1) or (Mn shl 5) or (Hr shl 11); LongRec(Result).Hi := Dy or (Mo shl 5) or (Word(Yr - 1980) shl 9); end; {$IFDEF MSWINDOWS} function WinFileTimeToDateTime(ft : Windows.FILETIME) : TDateTime; begin Result := WinFileTimeToDateTime(TWinFileTime(ft)); end; function WinToDosTime(const WinTime: Windows.FILETIME; var DosTime: TDosFileTime): LongBool; var lft : Windows.TFILETIME; begin Result:= Windows.FileTimeToLocalFileTime(@Windows.FILETIME(WinTime), @lft) and Windows.FileTimeToDosDateTime(@lft, @LongRec(Dostime).Hi, @LongRec(DosTime).Lo); end; function DosToWinTime(const DosTime: TDosFileTime; var WinTime: Windows.FILETIME): LongBool; var lft : Windows.TFILETIME; begin Result := Windows.DosDateTimeToFileTime(LongRec(DosTime).Hi, LongRec(DosTime).Lo, @lft) and Windows.LocalFileTimeToFileTime(@lft, @Windows.FILETIME(WinTime)); end; function WinToDosTime(const WinTime: TWinFileTime; var DosTime: TDosFileTime): LongBool; var lft : Windows.TFILETIME; begin Result:= Windows.FileTimeToLocalFileTime(@Windows.FILETIME(WinTime), @lft) and Windows.FileTimeToDosDateTime(@lft, @LongRec(Dostime).Hi, @LongRec(DosTime).Lo); end; function DosToWinTime(const DosTime: TDosFileTime; var WinTime: TWinFileTime): LongBool; var lft : Windows.TFILETIME; begin Result := Windows.DosDateTimeToFileTime(LongRec(DosTime).Hi, LongRec(DosTime).Lo, @lft) and Windows.LocalFileTimeToFileTime(@lft, @Windows.FILETIME(WinTime)); end; {$ENDIF} function UnixFileTimeToDateTime(UnixTime: TUnixFileTime) : TDateTime; var Hrs, Mins, Secs : Word; TodaysSecs : LongInt; {$IFDEF MSWINDOWS} LocalWinFileTime, WinFileTime: TWinFileTime; {$ENDIF} {$IFDEF UNIX} LocalUnixTime: TUnixFileTime; {$ENDIF} begin {$IFDEF UNIX} if FileTimeToLocalFileTime(UnixTime, LocalUnixTime) then UnixTime := LocalUnixTime; {$ENDIF} TodaysSecs := UnixTime mod SecsPerDay; Hrs := TodaysSecs div SecsPerHour; TodaysSecs := TodaysSecs - (Hrs * SecsPerHour); Mins := TodaysSecs div SecsPerMin; Secs := TodaysSecs - (Mins * SecsPerMin); Result := UnixDateDelta + (UnixTime div SecsPerDay) + EncodeTime(Hrs, Mins, Secs, 0); {$IFDEF MSWINDOWS} // Convert universal to local TDateTime. WinFileTime := DateTimeToWinFileTime(Result); if FileTimeToLocalFileTime(WinFileTime, LocalWinFileTime) then WinFileTime := LocalWinFileTime; Result := WinFileTimeToDateTime(WinFileTime); {$ENDIF} end; function DateTimeToUnixFileTime(DateTime : TDateTime): TUnixFileTime; var Hrs, Mins, Secs, MSecs : Word; Dt, Tm : TDateTime; {$IFDEF MSWINDOWS} LocalWinFileTime, WinFileTime: TWinFileTime; {$ENDIF} {$IFDEF UNIX} UnixTime: TUnixFileTime; {$ENDIF} begin {$IFDEF MSWINDOWS} // Convert local to universal TDateTime. LocalWinFileTime := DateTimeToWinFileTime(DateTime); if LocalFileTimeToFileTime(LocalWinFileTime, WinFileTime) then LocalWinFileTime := WinFileTime; DateTime := WinFileTimeToDateTime(LocalWinFileTime); {$ENDIF} Dt := Trunc(DateTime); Tm := DateTime - Dt; if Dt < UnixDateDelta then Result := 0 else Result := Trunc(Dt - UnixDateDelta) * SecsPerDay; DecodeTime(Tm, Hrs, Mins, Secs, MSecs); Result := Result + (Hrs * SecsPerHour) + (Mins * SecsPerMin) + Secs; {$IFDEF UNIX} if LocalFileTimeToFileTime(Result, UnixTime) then Result := UnixTime; {$ENDIF} end; function UnixFileTimeToDosTime(UnixTime: TUnixFileTime): TDosFileTime; begin Result := DateTimeToDosFileTime(UnixFileTimeToDateTime(UnixTime)); end; function UnixFileTimeToWinTime(UnixTime: TUnixFileTime): TWinFileTime; var WinFileTime: TWinFileTime; begin WinFileTime := $019DB1DED53E8000; // Unix epoch start if not AdjustWinFileTime(WinFileTime, Result, 10000000 * Int64(UnixTime)) then Result := WinFileTime; end; function GetTimeZoneBias: LongInt; begin {$IF DEFINED(MSWINDOWS)} Result := WinTimeZoneBias; {$ELSEIF DEFINED(UNIX)} Result := -Tzseconds div 60; {$ELSE} Result := 0; {$ENDIF} end; function MonthToNumberDef(const ShortMonthName: String; Default: Word): Word; var I: Word; begin Result:= Default; if ShortMonthName = EmptyStr then Exit; for I:= 1 to 12 do if SameText(ShortMonthName, ShortMonthNames[I]) then Exit(I); end; function YearShortToLong(Year: Word): Word; begin Result:= Year; if (Year < 100) then begin if (Year < 80) then Result:= Year + 2000 else Result:= Year + 1900; end; end; function TwelveToTwentyFour(Hour: Word; Modifier: AnsiString): Word; begin if Modifier = EmptyStr then Exit(Hour); case LowerCase(Modifier[1]) of 'a': begin if (Hour = 12) then Result:= 0; end; 'p': begin if (Hour < 12) then Result:= Hour + 12; end; end; end; { EDateOutOfRange } constructor EDateOutOfRange.Create(ADateTime: TDateTime); begin inherited Create(EmptyStr); FDateTime := ADateTime; end; {$IF DEFINED(MSWINDOWS)} procedure InitTimeZoneBias; var TZInfo: TTimeZoneInformation; begin case GetTimeZoneInformation(@TZInfo) of TIME_ZONE_ID_UNKNOWN: WinTimeZoneBias := TZInfo.Bias; TIME_ZONE_ID_STANDARD: WinTimeZoneBias := TZInfo.Bias + TZInfo.StandardBias; TIME_ZONE_ID_DAYLIGHT: WinTimeZoneBias := TZInfo.Bias + TZInfo.DaylightBias; else WinTimeZoneBias := 0; end; end; initialization InitTimeZoneBias; {$ENDIF} end. doublecmd-0.5.8/components/doublecmd/dcconvertencoding.pas0000644000175000017500000002412711753730233023046 0ustar alexxalexxunit DCConvertEncoding; {$mode objfpc}{$H+} interface uses Classes, SysUtils; var {en Convert from OEM to System encoding, if needed } CeOemToSys: function (const Source: String): String; CeSysToOem: function (const Source: String): String; {en Convert from OEM to UTF-8 encoding, if needed } CeOemToUtf8: function (const Source: String): String; CeUtf8ToOem: function (const Source: String): String; {en Convert from Ansi to System encoding, if needed } CeAnsiToSys: function (const Source: String): String; CeSysToAnsi: function (const Source: String): String; {en Convert from ANSI to UTF-8 encoding, if needed } CeAnsiToUtf8: function (const Source: String): String; CeUtf8ToAnsi: function (const Source: String): String; {en Convert from Utf8 to System encoding, if needed } CeUtf8ToSys: function (const Source: String): String; CeSysToUtf8: function (const Source: String): String; function CeRawToUtf8(const Source: String): String; {$IF DEFINED(MSWINDOWS)} function CeTryEncode(const aValue: UnicodeString; aCodePage: Cardinal; aAllowBestFit: Boolean; out aResult: AnsiString): Boolean; function CeTryDecode(const aValue: AnsiString; aCodePage: Cardinal; out aResult: UnicodeString): Boolean; {$ELSEIF DEFINED(UNIX)} var SystemEncodingUtf8: Boolean = False; SystemLanguage, SystemEncoding: String; {$ENDIF} implementation uses {$IF DEFINED(UNIX)} iconvenc_dyn {$IF DEFINED(DARWIN)} , MacOSAll {$ENDIF} {$ELSEIF DEFINED(MSWINDOWS)} Windows {$ENDIF} ; function UTF8CharacterStrictLength(P: PAnsiChar): integer; begin if p=nil then exit(0); if ord(p^)<%10000000 then begin // regular single byte character exit(1); end else if ord(p^)<%11000000 then begin // invalid single byte character exit(0); end else if ((ord(p^) and %11100000) = %11000000) then begin // should be 2 byte character if (ord(p[1]) and %11000000) = %10000000 then exit(2) else exit(0); end else if ((ord(p^) and %11110000) = %11100000) then begin // should be 3 byte character if ((ord(p[1]) and %11000000) = %10000000) and ((ord(p[2]) and %11000000) = %10000000) then exit(3) else exit(0); end else if ((ord(p^) and %11111000) = %11110000) then begin // should be 4 byte character if ((ord(p[1]) and %11000000) = %10000000) and ((ord(p[2]) and %11000000) = %10000000) and ((ord(p[3]) and %11000000) = %10000000) then exit(4) else exit(0); end else exit(0); end; function CeRawToUtf8(const Source: String): String; var P: PAnsiChar; I, L: LongInt; begin L:= Length(Source); // Try UTF-8 (this includes ASCII) P:= PAnsiChar(Source); repeat if Ord(P^) < 128 then begin // ASCII if (P^ = #0) and (P - PAnsiChar(Source) >= L) then begin Result:= Source; Exit; end; Inc(P); end else begin I:= UTF8CharacterStrictLength(P); if I = 0 then Break; Inc(P, I); end; until False; Result:= CeSysToUtf8(Source); end; function Dummy(const Source: String): String; begin Result:= Source; end; function Sys2UTF8(const Source: String): String; begin Result:= UTF8Encode(Source); end; function UTF82Sys(const Source: String): String; begin Result:= UTF8Decode(Source); end; {$IF DEFINED(MSWINDOWS)} function CeTryEncode(const aValue: UnicodeString; aCodePage: Cardinal; aAllowBestFit: Boolean; out aResult: AnsiString): Boolean; // Try to encode the given Unicode string as the requested codepage const WC_NO_BEST_FIT_CHARS = $00000400; Flags: array[Boolean] of DWORD = (WC_NO_BEST_FIT_CHARS, 0); var UsedDefault: BOOL; begin if not aAllowBestFit and not CheckWin32Version(4, 1) then Result := False else begin SetLength(aResult, WideCharToMultiByte(aCodePage, Flags[aAllowBestFit], PWideChar(aValue), Length(aValue), nil, 0, nil, @UsedDefault)); SetLength(aResult, WideCharToMultiByte(aCodePage, Flags[aAllowBestFit], PWideChar(aValue), Length(aValue), PAnsiChar(aResult), Length(aResult), nil, @UsedDefault)); Result := not UsedDefault; end; end; function CeTryDecode(const aValue: AnsiString; aCodePage: Cardinal; out aResult: UnicodeString): Boolean; begin SetLength(aResult, MultiByteToWideChar(aCodePage, MB_ERR_INVALID_CHARS, LPCSTR(aValue), Length(aValue), nil, 0) * SizeOf(UnicodeChar)); SetLength(aResult, MultiByteToWideChar(aCodePage, MB_ERR_INVALID_CHARS, LPCSTR(aValue), Length(aValue), PWideChar(aResult), Length(aResult))); Result := Length(aResult) > 0; end; function Oem2Utf8(const Source: String): String; var UnicodeResult: UnicodeString; begin if CeTryDecode(Source, CP_OEMCP, UnicodeResult) then Result:= UTF8Encode(UnicodeResult) else Result:= Source; end; function Utf82Oem(const Source: String): String; var AnsiResult: AnsiString; begin if CeTryEncode(UTF8Decode(Source), CP_OEMCP, False, AnsiResult) then Result:= AnsiResult else Result:= Source; end; function OEM2Ansi(const Source: String): String; var Dst: PAnsiChar; begin Result:= Source; Dst:= AllocMem((Length(Result) + 1) * SizeOf(AnsiChar)); if OEMToChar(PAnsiChar(Result), Dst) then Result:= StrPas(Dst); FreeMem(Dst); end; function Ansi2OEM(const Source: String): String; var Dst: PAnsiChar; begin Result := Source; Dst := AllocMem((Length(Result) + 1) * SizeOf(AnsiChar)); if CharToOEM(PAnsiChar(Result), Dst) then Result := StrPas(Dst); FreeMem(Dst); end; procedure Initialize; begin CeOemToSys:= @OEM2Ansi; CeSysToOem:= @Ansi2OEM; CeOemToUtf8:= @Oem2Utf8; CeUtf8ToOem:= @Utf82Oem; CeAnsiToSys:= @Dummy; CeSysToAnsi:= @Dummy; CeAnsiToUtf8:= @Sys2UTF8; CeUtf8ToAnsi:= @UTF82Sys; CeSysToUtf8:= @Sys2UTF8; CeUtf8ToSys:= @UTF82Sys; end; {$ELSEIF DEFINED(UNIX)} const EncodingUTF8 = 'UTF-8'; // UTF-8 Encoding var EncodingOEM, // OEM Encoding EncodingANSI: String; // ANSI Encoding function GetSystemEncoding(out Language, Encoding: String): Boolean; {$IF DEFINED(DARWIN)} var LanguageCFArray: CFArrayRef = nil; LanguageCFRef: CFStringRef = nil; begin LanguageCFArray:= CFLocaleCopyPreferredLanguages; try Result:= CFArrayGetCount(LanguageCFArray) > 0; if Result then begin LanguageCFRef:= CFArrayGetValueAtIndex(LanguageCFArray, 0); SetLength(Language, MAX_PATH); Result:= CFStringGetCString(LanguageCFRef, PAnsiChar(Language), MAX_PATH, kCFStringEncodingUTF8 ); if Result then begin Encoding:= EncodingUTF8; Language:= Copy(Language, 1, 2); end; end; finally CFRelease(LanguageCFArray); end; end; {$ELSE} var I: Integer; Lang: String; begin Result:= True; Lang:= SysUtils.GetEnvironmentVariable('LC_ALL'); if Length(Lang) = 0 then begin Lang:= SysUtils.GetEnvironmentVariable('LC_MESSAGES'); if Length(Lang) = 0 then begin Lang:= SysUtils.GetEnvironmentVariable('LANG'); if Length(Lang) = 0 then Exit(False); end; end; Language:= Copy(Lang, 1, 2); I:= System.Pos('.', Lang); if (I > 0) then Encoding:= Copy(Lang, I + 1, Length(Lang) - I); if Length(Encoding) = 0 then Encoding:= EncodingUTF8; end; {$ENDIF} function Oem2Utf8(const Source: String): String; begin Result:= Source; Iconvert(Source, Result, EncodingOEM, EncodingUTF8); end; function Utf82Oem(const Source: String): String; begin Result:= Source; Iconvert(Source, Result, EncodingUTF8, EncodingOEM); end; function OEM2Sys(const Source: String): String; begin Result:= Source; Iconvert(Source, Result, EncodingOEM, SystemEncoding); end; function Sys2OEM(const Source: String): String; begin Result:= Source; Iconvert(Source, Result, SystemEncoding, EncodingOEM); end; function Ansi2Sys(const Source: String): String; begin Result:= Source; Iconvert(Source, Result, EncodingANSI, SystemEncoding); end; function Sys2Ansi(const Source: String): String; begin Result:= Source; Iconvert(Source, Result, SystemEncoding, EncodingANSI); end; function Ansi2Utf8(const Source: String): String; begin Result:= Source; Iconvert(Source, Result, EncodingANSI, EncodingUTF8); end; function Utf82Ansi(const Source: String): String; begin Result:= Source; Iconvert(Source, Result, EncodingUTF8, EncodingANSI); end; procedure Initialize; var Error: String; begin CeOemToSys:= @Dummy; CeSysToOem:= @Dummy; CeOemToUtf8:= @Dummy; CeUtf8ToOem:= @Dummy; CeAnsiToSys:= @Dummy; CeSysToAnsi:= @Dummy; CeUtf8ToSys:= @Dummy; CeSysToUtf8:= @Dummy; CeAnsiToUtf8:= @Dummy; CeUtf8ToAnsi:= @Dummy; // Try to get system encoding and initialize Iconv library if not (GetSystemEncoding(SystemLanguage, SystemEncoding) and InitIconv(Error)) then WriteLn(Error) else begin SystemEncodingUtf8:= (SysUtils.CompareText(SystemEncoding, 'UTF-8') = 0) or (SysUtils.CompareText(SystemEncoding, 'UTF8') = 0); if (SystemLanguage = 'be') or (SystemLanguage = 'ru') or (SystemLanguage = 'uk') then begin EncodingOEM:= 'CP866'; CeOemToSys:= @OEM2Sys; CeSysToOem:= @Sys2OEM; CeOemToUtf8:= @Oem2Utf8; CeUtf8ToOem:= @Utf82Oem; end; if (SystemLanguage = 'be') or (SystemLanguage = 'bg') or (SystemLanguage = 'ru') or (SystemLanguage = 'uk') then begin EncodingANSI:= 'CP1251'; CeAnsiToSys:= @Ansi2Sys; CeSysToAnsi:= @Sys2Ansi; CeAnsiToUtf8:= @Ansi2Utf8; CeUtf8ToAnsi:= @Utf82Ansi; end; if not SystemEncodingUtf8 then begin CeUtf8ToSys:= @UTF82Sys; CeSysToUtf8:= @Sys2UTF8; end; end; end; {$ELSE} procedure Initialize; begin CeOemToSys:= @Dummy; CeSysToOem:= @Dummy; CeOemToUtf8:= @Dummy; CeUtf8ToOem:= @Dummy; CeAnsiToSys:= @Dummy; CeSysToAnsi:= @Dummy; CeUtf8ToSys:= @Dummy; CeSysToUtf8:= @Dummy; CeAnsiToUtf8:= @Dummy; CeUtf8ToAnsi:= @Dummy; end; {$ENDIF} initialization Initialize; end. doublecmd-0.5.8/components/doublecmd/doublecmd_common.lpk0000644000175000017500000000513712210604521022646 0ustar alexxalexx doublecmd-0.5.8/units-doc-win.txt0000644000175000017500000000042212014201074015734 0ustar alexxalexxsrc\ufilelist.pas src\udcutils.pas src\platform\uOSUtils.pas src\platform\uosforms.pas src\uvfs.pas src\uexts.pas src\ufileprocs.pas src\udescr.pas src\platform\win\umywindows.pas src\platform\unix\umyunix.pas src\platform\unix\inotify.pp src\uvfsutil.pas src\uwcxmodule.pasdoublecmd-0.5.8/tools/0000755000175000017500000000000012257501472013653 5ustar alexxalexxdoublecmd-0.5.8/tools/extractdwrflnfo.lpr0000755000175000017500000000440112045752321017604 0ustar alexxalexx{ This file is part of the chelinfo library. Copyright (c) 2008 by Anton Rzheshevski Dwarf LineInfo Extractor See the file COPYING.FPC, included in this distribution, for details about the copyright. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. **********************************************************************} { 2008, Anton Rzheshevski aka Cheb: Like dr. Frankenshtein I sewn this library together from the dead meat of the the FPC RTL modules lineinfo.pp and lnfodwrf.pp. These (as of Jan. 2008 / FPC 2.2.0) both didn't work and had several limitations (e.g. inability to be used from a DLL) } {note: DON'T FORGET to compile your program with the -gw key Lazarus: you must type it in Project -> Compiler Options -> Other -> User parameters } {$mode delphi} {$longstrings on} {$ifndef unix} {$apptype console} {$endif} //extracts the line info in the dwarf format from the executable program extractdwrflnfo; uses SysUtils, Classes, un_xtrctdwrflnfo, zstream; var _dwarf: pointer; DwarfSize, CompressedDwarfSize: QWord; base_addr: QWord; f: TFileStream; CS: TCompressionStream; dllname, iname: ansistring; begin if Paramcount = 0 then begin WriteLn('Usage: ' + ExtractFileName(GetModuleName(0)) + ' '); exit; end; dllname:= ParamStr(1); WriteLn('Extracting Dwarf line info from ', dllname); try iname:= DlnNameByExename(dllname); if ExtractDwarfLineInfo(dllname, _dwarf, DwarfSize, base_addr) then begin f:= TFileStream.Create(iname , fmCreate); CS:= TCompressionStream.Create(clMax, f); CS.Write(dwarfsize, sizeof(dwarfsize)); // 8 bytes (QWORD) CS.Write(base_addr, sizeof(base_addr)); // 8 bytes (QWORD) CS.Write(_dwarf^, dwarfsize); CS.Free; CompressedDwarfSize := f.Size; f.free; WriteLn('Ok, saved ', CompressedDwarfSize, ' bytes to ', iname); end else begin if FileExists(iname) then DeleteFile(iname); WriteLn('Error: ' + ExtractDwarfLineInfoError); end; except WriteLn((ExceptObject as Exception).Message); end; end. doublecmd-0.5.8/tools/fsgenerator/0000755000175000017500000000000012257501472016172 5ustar alexxalexxdoublecmd-0.5.8/tools/fsgenerator/fsgenerator.lpi0000644000175000017500000000363012046303231021206 0ustar alexxalexx doublecmd-0.5.8/tools/fsgenerator/fsgenerator.lpr0000644000175000017500000000637612046303231021231 0ustar alexxalexx{ Filesystem traffic generator ------------------------------------------------------------------------- Creates, modifies, removes files, quickly and in large quantities. Useful for testing how a program behaves when there's a lot of traffic happening on the file system. Copyright (C) 2010-2012 Przemysław Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } program fsgenerator; {$mode objfpc}{$H+} uses SysUtils, Classes, Windows; var Path: UTF8String; fs: TFileStream; filenames: TStringList; nr: Integer; buffer: array[0..16383] of byte; procedure GenNames; var i, j: Integer; name: String; begin for i := 0 to Random(1000) do begin name := ''; for j := 0 to random(100) do name := name + chr(random(ord('z') - ord('a')) + ord('a')); filenames.Add(name); end; end; function RandomName: String; begin Result := Path + filenames[Random(Filenames.Count)]; end; procedure Create(name: String); begin fs := TFileStream.Create(name, fmCreate); fs.Write(buffer, random(sizeof(buffer))); fs.Free; end; procedure Modify(name: String); var P: Int64; count: Int64; Mode: Word; size: int64; begin if not FileExists(name) then mode := fmCreate else mode := fmOpenReadWrite; fs := TFileStream.Create(Name, mode); if mode = fmCreate then begin fs.Write(buffer, random(sizeof(buffer))); fs.Seek(0, soBeginning); end; size := fs.size; p := random(size); fs.Seek(p, soBeginning); count := min(sizeof(buffer),random(size-p)); fs.Write(buffer, count); //writeln('writing ',count, ' p=',p,' size=',size); fs.Free; end; procedure Delete(name: String); begin if FileExists(Name) then Sysutils.DeleteFile(Name); end; begin if Paramcount = 0 then begin WriteLn('File system traffic generator.'); WriteLn('Creates, modifies, removes files, quickly and in large quantities.'); Writeln; WriteLn('Usage:'); WriteLn(ExtractFileName(ParamStr(0)) + ' '); Exit; end; FileNames := TStringList.Create; GenNames; Path := IncludeTrailingPathDelimiter(ParamStr(1)); ForceDirectories(Path); WriteLn('Starting changing ', Path); while True do begin case Random(6) of 0: Sleep(10); 1: Modify(RandomName); 2: Create(RandomName); 3: Modify(RandomName); 4: Delete(RandomName); 5: Modify(RandomName); end; Sleep(10); if (GetKeyState(VK_SPACE) < 0) or (GetKeyState(VK_SHIFT) < 0) or (GetKeyState(VK_ESCAPE) < 0) then Break; end; WriteLn('Finished changing'); Filenames.Free; end. doublecmd-0.5.8/tools/extractdwrflnfo.lpi0000644000175000017500000000351112045752321017571 0ustar alexxalexx doublecmd-0.5.8/units/0000755000175000017500000000000012257501472013655 5ustar alexxalexxdoublecmd-0.5.8/units/i386-linux-qt/0000755000175000017500000000000012257501472016125 5ustar alexxalexxdoublecmd-0.5.8/units/i386-linux-gtk2/0000755000175000017500000000000012257501472016350 5ustar alexxalexxdoublecmd-0.5.8/units/i386-win32-win32/0000755000175000017500000000000012257501472016246 5ustar alexxalexxdoublecmd-0.5.8/units/i386-darwin-carbon/0000755000175000017500000000000012257501472017072 5ustar alexxalexxdoublecmd-0.5.8/units/x86_64-darwin-qt/0000755000175000017500000000000012257501472016517 5ustar alexxalexxdoublecmd-0.5.8/units/x86_64-win64-win32/0000755000175000017500000000000012257501472016520 5ustar alexxalexxdoublecmd-0.5.8/units/x86_64-linux-gtk2/0000755000175000017500000000000012257501472016615 5ustar alexxalexxdoublecmd-0.5.8/units/x86_64-linux-qt/0000755000175000017500000000000012257501472016372 5ustar alexxalexxdoublecmd-0.5.8/libraries/0000755000175000017500000000000012257501472014467 5ustar alexxalexxdoublecmd-0.5.8/libraries/i386-win32/0000755000175000017500000000000012257501472016120 5ustar alexxalexxdoublecmd-0.5.8/libraries/x86_64-win64/0000755000175000017500000000000012257501472016372 5ustar alexxalexxdoublecmd-0.5.8/libraries/arm-linux/0000755000175000017500000000000012257501472016403 5ustar alexxalexxdoublecmd-0.5.8/libraries/arm-linux/libmime.a0000644000175000017500000006722012201664077020172 0ustar alexxalexx! / 1376214213 0 0 0 980 ` &"""""""""AAAAAAAAAAAAAAAAAAeesave_to_filegroup_desktopkey_mime_typemime_type_locate_desktop_filemime_type_get_actionsmime_type_get_default_actionmime_type_has_actionmime_type_add_actionmime_type_set_default_actionmime_cache_newmime_cache_loadmime_cache_freemime_cache_lookup_magicmime_cache_lookup_suffixmime_cache_lookup_aliasmime_cache_lookup_literalmime_cache_lookup_globmime_cache_lookup_parentsxdg_mime_type_unknownxdg_mime_type_directoryxdg_mime_type_executablexdg_mime_type_plain_textmime_cache_max_extentmime_type_get_by_filenamemime_type_get_by_filemime_type_get_descmime_type_finalizemime_type_initmime_cache_foreachmime_cache_reloadmime_type_is_text_filemime_type_is_subclassmime_type_is_executable_filemime_type_get_parentsmime_type_get_aliasmime_type_get_cachesdesktop_entry_namemime_get_desktop_entrymime-action.o/ 1376214196 0 0 100644 7788 ` ELF( 4( ``z`hOqF{a{i?O{hxihFF?xiOxiOFF``z`OaF{ahxihzhGFai+лiFaihhFhzhGFai+лi iaih+OF F@F{`{h+6FF@OF`O`OOOOOOOFOO{hFhFFx`9`{h+;h+{h`hhF9hF+h{hO h`hh+O3FF``z`O;bh@OFaFaiiOOF{ai{i+qO;aOi@hF;bO{bT{hh{jO9jhFFF?/{jO:jhhFFai+{jO:jxhFOi{jO:jhF{jO:jO`{jO:jhF{jO:jO`{j{b;izjB8jiOF(Fx`OOOO FaO;a@yhixhF;a;i+3ih;iFFFai?iFOi+ih{aiOzih`iiF iFO;iFi[h+##iFFF Fx`9`OcO{cO;c8h@Fbj+`F{bO9hF;b;j+Kxj9jOOF+@Oxj@@OFaiyhF?O;ci;k+xj@@OFcxj@@OF{c8jxj;hcxhFai+𔀻icj+ khF9hF+O;cqO{aObO;aF`khOFF;a;i+Oh9iOOF+Dh@@OFbk+2j+/иkjF+(ѻj+"h@@OF{a{k+ {i+ xkyiF+O;cxiO;c8ijhkc;k+kh+rij+иkxk;kF@Fx`9`O0O0OgO0O{fxh@F+sFgOyhF{g{o+ иoyoOOF+xoOxo;FOo@@o@@{ho@@@xhFxhFF{g@yoF0xodoFOF0oC@ FOUFFFxhF0O F;g;o+;oOp;h FzhF0F{f@F0FF@OFfnOqO0FgnoOFfnOF+ on00nn+ {nnFn,oFF``z`hhF+ {h+иhFF{h`hhF{a{h+{hzi`xiF``z`OaOah@zhOF{axhO-Fai+xiO-FaxiOF+Oai+iO/piFO-Fai+i+xiO{iF Fx`9`{h+xhO:hF @O:hIFFF``z`Oah@OFaF{axiiOOF;ai;i+ xi@hOFaxii+OiFai+иiiOaiF Fx`@yhOFFFx`9`O`OaFF@OFai@OF{aiOqiF;a8iyiOO8i@zh;h 8iFOFa8ihxiiFxii FDesktop EntryMimeTypeupdate-desktop-databaseapplicationsapplications/mimeinfo.cacheMIME Cache.desktopExecNameX-MimeType-DerivedNoDisplaytrue%s-usercustom-%%d.desktop%s-usercreated-%%d.desktop[Desktop Entry] Encoding=UTF-8 Name=%s Exec=%s MimeType=%s Icon=exec NoDisplay=true applications/defaults.listDefault Applicationsdefaults.listGCC: (Debian 4.6.3-14) 4.6.3A4aeabi*7-A A  ,.symtab.strtab.shstrtab.rel.text.data.bss.rodata.comment.note.GNU-stack.ARM.attributes4d  \ % + 0 80 A: Qp: 5o a " ]v&+40HiXSDX`]Hilnxsx}-\@\ t\  )=Tk| >  3E &bwR"2EL`g|\ mime-action.c$t$ddata_dir_foreach.LC0.LC1update_desktop_databasestrv_index.LC2.LC3get_actions.LC4.LC5.LC6.LC7.LC8.LC9.LC10.LC12.LC11make_custom_desktop_file_locate_desktop_file.LC13.LC14get_default_action.LC15save_to_filecreat64writeclosegroup_desktopkey_mime_typeg_get_user_data_dirg_get_system_data_dirsg_find_program_in_pathg_build_filenameg_spawn_syncg_freestrcmpg_key_file_newg_key_file_load_from_fileg_key_file_get_string_listmime_type_locate_desktop_fileg_array_append_valsg_key_file_freemime_type_get_actionsg_array_sized_newmime_type_get_default_actiong_array_prepend_valsg_array_remove_indexg_array_freemime_type_has_actiong_str_has_suffixg_strfreevg_key_file_get_stringg_key_file_set_string_listg_key_file_set_stringstrleng_strndupg_strdup_printfg_key_file_to_datamemcpyg_path_get_basenamestrchrg_mkdir_with_parentsg_file_testmime_type_add_actiong_strdupstrrchrmime_type_set_default_action #0 $> %J %n ( )/ 0 * (/ 0  +H ,P -X - ./ 0  + / 0 -"/&0, 1l 2 3 - - - - 4  6./20@ 7t 8 9 8 - :/0 <  / 24 0F/&J0&N/'R0'Z 1z =/&0&/0 >/&0&/0 > - 4 5 . /. 2H 0T/&X0&\/`0h > ./&0&/0 > . - - - 4 = - -\/`0d <n /| 2 0 - -/&0&/'0' ?/&0&/0 @/&0&/0/0 @ A B/"0( C4 -D DP 4V/Z0n Et F G C A/0 C - (/ 0  + H C$ +2 I> -D -Z -n "t - ; K -/  0 + G. L< Ih G - / 0 / 0 + / 0 -* /. 08 >B 4R 2b -j - / 0 ( / 0 + / 0 + H - / 0 / 0& @6 D@ 4L "R -X -mime-cache.o/ 1376214203 0 0 100644 7816 ` ELF(4( x`O`ODF`{h+hyhhFFx`9`{hh+{hhF{hhF;h+ {hFODFOFFx`xhOODyhFx`9`O30O0{hh;hB{hO`xhO8hFF{h`8hOOF00+OFF+O#FFF00+ #FFO300?O0O"O#Cg0O"O#Cgo+ػo+Oyo+ zhyCqzhyCq{h `#{h`0hOb0hCO#C0hO#C0hOcC{g{o {hZa {ohOb{ohCO#C{ohO#C{ohOcC{ha0hOb0hCO#C0hO#C0hOcC{g{o {ha {ohOb{ohCO#C{ohO#C{ohOcC{ha0 hOb0 hCO#C0 hO#C0 hOcC{g{o {hZb {ohOb{ohCO#C{ohO#C{ohOcC{hb0hOb0hCO#C0hO#C0hOcC{g{o {hb {ohOb{ohCO#C{ohO#C{ohOcC{hb0hOb0hCO#C0hO#C0hOcC{g{o hOb{ohCO#C{ohO#C{ohOcC {hZc {ohOb{ohCO#C{ohO#C{ohOcC{hc0hOb0hCO#C0hO#C0hOcC{g {ohOb{ohCO#C{ohO#C{ohOcC{hc{o hOb{ohCO#C{ohO#C{ohOcC{hc{o hOb{ohCO#C{ohO#C{ohOcC {hdOFF``z`;`O{dhhObhhCO#ChhO#ChhOcC;dhhObhhCO#ChhO#ChhOcC{c:l{k;ch hObh hCO#Ch hO#Ch hOcCbhhObhhCO#ChhO#ChhOcCbhhObhhCO#ChhO#ChhOcC{bhj;b{j++Och{jak;lzhxkix@ڲk9jxBkckjBkjBO{d zh;l8jFjF+O{d{l+fлhhObhhCO#ChhO#ChhOcCai+@лhhObhhCO#ChhO#ChhOcC{ah{i`Ochhzh;hF+O kch `kiBO;l;d:l;kB:lj;hBOFHF``z`;`hhObhhCO#ChhO#ChhOcC{ah hObh hCO#Ch hO#Ch hOcC;ah;iaOahizh;hCF+O iai ai{iBOF F``z`hl{ah+{h+{i+O@O;a5hhFyih{hqF+"hh{ihOa{ihCO#C{ihO#C{ihOc C;i;a{i{a:ihkBOFF``z`;`8hFFFb{h{cO;c{hOSbjOh{b{jhOb{jhCO#C{jhO#C{jhOcC;bj;jBj3{cj;jBj;c{jhOb{jhCO#C{jhO#C{jhOcCa@h;hxx:h;`i+aлj+O;h+;hx+){jhOb{jhCO#C{jhO#C{jhOcC{a{i+h{iOn{j hOb{j hCO#C{j hO#C{j hOcCahihFi;h'FC;h+;hx+){jhOb{jhCO#C{jhO#C{jhOcC;a;i+h;iOOzk;kOrOcbzk;kBOF8F``z`;`O{cO;al;cObl+иlFFFO{bObjFOCOh;b;jhOb;jhCO#C;jhO#C;jhOcCal;ai+ci{jBg;jhOb;jhCO#C;jhO#C;jhOcCa;jhOb;jhCO#C;jhO#C;jhOcC{ah{i8hlFh!Fi;h\Fbj+:i;kB һj{c;i;cl;kB;j{cl;cjbj{hBdl:k`{kF<F``z`h[k{dhkcObOcO3{ch+лhx+k+Ohy۲+MO3{ahFbjhhFF{bhhkyjFylFhF;b;j+Հhh;jhOa;jhCO#C;jhO#C;jhOc Cbzi{h`jcO;d{lhOb{lhCO#C{lhO#C{lhOcCaihFF;c;k+n{l hOb{l hCO#C{l hO#C{l hOcCa{lhOb{lhCO#C{lhO#C{lhOcCchhhhik@h;kxx %j )v #n +mime-type.o/ 1376214209 0 0 100644 9168 ` ELF(p4( x`9`ObO;aO3b;h+ ;hipCO@O{b+@h{jOhaiyhFbj+iyhFFai+:ijBһib;ib{j{bj+zj@hBj+7O;bO`O{b"@h{jOha iyhFF{a{i+h;jB{ibh;b{j{bj+zj@hBj+jx+j@F0F``z`h+лhipC O`hhF?@:hipCO@.{h+hO1O/F{`{h+{h{`h{`{h+xhhF0@F+0O0h #OOBq ۀO30hOOF00?̀h E@hFO"F+FBq F FFg@F+@h0oFF0oFFgo?@h B@O300?iO0@h0OhFoF0000+ @hB0+ hOF+@00+oOsFoF+@0@h B@@00+0x+0@FF``z`hh{fOfO;fOfhhF@Fem+Onh `m ehmF@Fem+OUmm;f{h+@FO@@{hF{em `znh`hhFFFfn+{mh`{mnfhnF@Fem+кmnfOfn+nnFm9nFFpF ```  hFOq@hFOOF11?OsFF?Oq#FFF1q#FFF?O311?OQO1h+/F11hFO.F|1|1+1h|1hFFF1!`!h`q#FhFx1x1FwFx`9`F`hhxhF:h%F`h+лhh`hh+FxhF:hF`hFF@%s/mime/%s.xml/mime/mime.cachetext/application/application/x-shellscriptGCC: (Debian 4.6.3-14) 4.6.3A4aeabi*7-A A  ,.symtab.strtab.shstrtab.rel.text.data.bss.rodata.comment.note.GNU-stack.ARM.attributes4 `p %+080AQp5aP`     /FIq VfTk`p 0 x=I,0H I_JyM *1IU[hs}`1 = .=MY N`n  U   2DMan }.mime-type.c$dcachesn_cachesmime_magic_bufg__mime_magic_buf_lock$tmime_type_is_data_plain_text.LC0.LC1parse_xml_descend_comment_tag.9336.LC2_mime_type_get_descmime_cache_free_allmime_cache_load_all.LC3.LC4.LC5.LC6xdg_mime_type_unknownxdg_mime_type_directoryxdg_mime_type_executablexdg_mime_type_plain_textmime_cache_max_extentmime_type_get_by_filenamemime_cache_lookup_literalmime_cache_lookup_suffixmime_cache_lookup_globmime_type_get_by_filestat64g_utf8_strrchrstrcmpopen64g_mutex_trylockg_mallocreadg_mutex_unlockg_freemime_cache_lookup_magicg_file_testcloseg_strstr_leng_snprintfg_strndupfstat64g_get_language_namesstrchrmime_type_get_descg_get_system_data_dirsg_get_user_data_dirmime_type_finalizemime_type_initg_strv_lengthg_slice_allocg_build_filenamemime_cache_newmime_cache_freemime_cache_foreachg_slice_free1mime_cache_reloadmime_cache_loadg_mutex_lockg_reallocmime_type_is_text_filemime_type_is_subclassg_str_has_prefixmime_type_is_executable_filemime_cache_lookup_parentsmime_type_get_parentsg_array_sized_newg_strdupg_array_append_valsg_array_freemime_type_get_aliasmime_cache_lookup_aliasmime_type_get_caches0/40B/F0\ #t $/ 0 /0 %/ 0 8/<0v '/0/0 ( "/0 )2 *N/!R0!r/ v0 z +/ 0  , -/ 0 / 0  . //0  0B/ F0 ^ 1h/l0/ 0 / 0 / 0  . / 2/ 0 /08/<0@ 3j/n0r 3/0 4 3/0 3  5, 5j/n0t 4 * 6 2 , - / 24 7J 8r 5 / / : ;N/R0b :l >v/ z0 / 0  ?/0 ; @/0 A //0/!0!/0/!0!* @2/60F AP /T/X0j/!n0!x/|0/!0!/ 0 /!0! ,/ 0 /B0B C/ 0 / 0 D /  0  / 0* /!. 0!8 / < 0 D /H / L 0 j /n 0 / 0 F / 0 /! 0! / 0 /! 0! /  0 $ / ( 0 , G0 / 4 0 : /!> 0!H HN / R 0 X / \ 0 ` . / 0 J / 0 K /$ 0( KR *p 6 - 2 & / 0 / 0 J / 0 J0 1h ) / 0 M ) / 0  O* /. 0B M\ Pp Q / 0 R O / 0 T P0 QN/ R0 l R/ 0 /0mime-util.o/ 1376214213 0 0 100644 2244 ` ELF(4( x`9`ObF{b8hF+ xj9hOOFb@9hOF;bOxj9jOOFb8jj+_Oxj@@OF`Oxj@@OF`xj@@OF;axj@@OF{axj@@OFaxj@@OFaxj{hFĕxh0FDesktop EntryapplicationsNameCommentExecIconTerminalNoDisplayGCC: (Debian 4.6.3-14) 4.6.3A4aeabi*7-A A  ,.symtab.strtab.shstrtab.rel.text.data.bss.rodata.comment.note.GNU-stack.ARM.attributes4\ 8 %+0X80AQp5;a|  \-  (0$8)@.L36IZ`omime-util.c$d.LC0.LC1.LC2.LC3.LC4.LC5.LC6$tdesktop_entry_namemime_get_desktop_entryg_key_file_newg_path_is_absoluteg_key_file_load_from_fileg_build_filenameg_key_file_load_from_data_dirsg_freeg_key_file_get_locale_stringg_key_file_get_stringg_key_file_get_booleang_key_file_free  0 :/>0H b l ~/0/0 /0/ 0 /0/ 0 /0/ 0 /0/ 0  /0"/ &0 . 8 doublecmd-0.5.8/libraries/x86_64-linux/0000755000175000017500000000000012257501472016562 5ustar alexxalexxdoublecmd-0.5.8/libraries/x86_64-linux/libmime.a0000644000175000017500000012221011632002070020322 0ustar alexxalexx! / 1315439605 0 0 0 980 ` &333333333^^^^^^^^^^^^^^^^^^save_to_filegroup_desktopkey_mime_typemime_type_locate_desktop_filemime_type_get_actionsmime_type_get_default_actionmime_type_has_actionmime_type_add_actionmime_type_set_default_actionmime_cache_newmime_cache_loadmime_cache_freemime_cache_lookup_magicmime_cache_lookup_suffixmime_cache_lookup_aliasmime_cache_lookup_literalmime_cache_lookup_globmime_cache_lookup_parentsxdg_mime_type_unknownxdg_mime_type_directoryxdg_mime_type_executablexdg_mime_type_plain_textmime_cache_max_extentmime_type_get_by_filenamemime_type_get_by_filemime_type_get_descmime_type_finalizemime_type_initmime_cache_foreachmime_cache_reloadmime_type_is_text_filemime_type_is_subclassmime_type_is_executable_filemime_type_get_parentsmime_type_get_aliasmime_type_get_cachesdesktop_entry_namemime_get_desktop_entrymime-action.o/ 1315439604 1000 1000 100640 12168 ` ELF>@@ UHH0H}HuUHE辤HE}u=EHcHMEHΉHuEEUHH@H}HuHUHEHEHUHMHELEHHAHEH}tHENHE2HEHHUHMLEHHAHEH}tHEHEHEHHu¸UHH@HEHEHHǸHEHEHEHD$HD$HD$H$AAHƿHEHHEHUHH H}HuH}tSH}tLHEHE6HEHHUHHuHUHEHH)HHHEHEHHuUHHPH}HuHUHEHEȺHǸHEHEHuHEHEHEH}%EHMHUHEAHHEEEHHEHHEHHHEHHEHHEHHHEH}t0EHHHMHEHHHEHEHHEHHEHHEH(EHHEHHEHHEHEE9EHEHHEHUHH@H}ȹ HEHEHUHEHƿIHEHHEHEHHUHEHHHgE}uHMHEHHZ}tHHEHHEEHHHEHHE؋UHEHHMHEHHHEHHE@HEHUHHĀH}HuHEHEEHEHEԃ}HEHEHƿHEH}HuHEȹHHEAHHEHUHEHHtEHEH}u>HEȹHHEHEȹHHEHEHHEHHEHEHEHHEH}HEHEi}t&HEHHUHHu E8HEHEHEHEHEHHƿHEH}HuHEHHEHHEH}H}t}HUHEHHuf}tYHEHHEH}t%H}tHUHEHHuEHEHEHEHHEHHEHHE}uHEHHHEH}tHEHHEHEUHHHHH@HEHEHEHEEHHHdHEHHHƿHEH}tHuHEйHuHEHeHEHH@HEAHѺHHHHEHѺHHEйHHHHDž8H¸H8HHHHPHHHHEHEHƿHEHEHHMHEкHHHEHEHqDžP[DesDžTktopDžX EntDž\ry] Dž`EncoDžddingDžh=UTFDžl-8 NDžpame=Džt%s EDžxxec=Dž|%s MEimeTEype=E%s IEcon=EexecE NoDEisplEay=tErue EHHHHEHE HHEH}tHEH@HHHuHPHǸHEHEHDž8H¸H8HHHHEHEHƿHEHEHHǸHEHEHEUHEHǸHEHMHEHHǸHEHEHtHEHHEHE뒐HEHH}t.EHMHEHHHEHHEUHH0H}HuHUHUHEHHtH}tQHEHHHEH9HUHEHHHEH}t HEHUHHEHUHH@H}HuHUHEEHUHEعHǸHEHEȾ-HHEH}tHE-HHEHEHt E0H}t(HE/HEH-HHE}t}uHEHHEUHHH}HuH}tHUHEHHEH¾UHH@H}HuHUHEHEغHǸHEHEHuHEHEHEH}tHUHEHHEHEHH}t>HEHƿHEH}tHEHHEHHEHEUHHH}HEHƿUHH@H}HuEHEHǸHEHEHǸHEHEHHEHHEHuHEHHMHUHEHHMHEHHHEHEHE܉HMHEHHHEHHEHDesktop EntryMimeTypeupdate-desktop-databaseapplicationsapplications/mimeinfo.cacheMIME Cache.desktopExecNameX-MimeType-DerivedtrueNoDisplay%s-usercustom-%%d.desktop%s-usercreated-%%d.desktopapplications/defaults.listDefault Applicationsdefaults.listGCC: (Debian 4.6.1-7) 4.6.1zRx sAC n <AC  \AC  |qAC l AC  AC  AC  AC  AC  <AC  \FAC A |AC  $AC _ AC   .symtab.strtab.shstrtab.rela.text.data.bss.rodata.comment.note.GNU-stack.rela.eh_frame @p &D,D1D 90OBlWpR8.P Hap  `as 8qC5Oh } s  -4;Jd F$0=Rcn4 3<Dmime-action.cdata_dir_foreachupdate_desktop_databasestrv_indexget_actionsmake_custom_desktop_file_locate_desktop_fileget_default_actionsave_to_filecreat64writeclosegroup_desktopkey_mime_typeg_get_user_data_dirg_get_system_data_dirsg_find_program_in_pathg_build_filenameg_spawn_syncg_freestrcmpg_key_file_newg_key_file_load_from_fileg_key_file_get_string_listmime_type_locate_desktop_fileg_array_append_valsg_key_file_freemime_type_get_actionsg_array_sized_newmime_type_get_default_actiong_array_prepend_valsg_array_remove_indexg_array_freemime_type_has_actiong_str_has_suffixg_strfreevg_key_file_get_stringg_key_file_set_string_listg_key_file_set_stringg_strndupg_strdup_printfg_key_file_to_datag_path_get_basenamestrchrg_mkdir_with_parentsg_file_testmime_type_add_actiong_strdupstrrchrmime_type_set_default_action GWh  6@ /M[ <hq X$ Q!]u"$! 52%z&'&(% c-*?T }  + l , q  ,%1"G#  l ,9Q qV ^,"+ ] ce*r   - v  .$ ) . 6 .z /  0  1 " 2 3 0( 2 0B G Q /^ s 4 0  5     W )n 7  /  3) 8> 5n 3     >Me m,}"    /'9 F[4gl .1" @s`5 4 @ `  mime-cache.o/ 1315439605 1000 1000 100640 10960 ` ELF>@@ UHH H}HExHEH}tHUHEHHHEUHHH}uHEH@HtHEH@HHEHH}HEH¾xHуHt HHуHt fHHуHt HHHHtHtfHtHUHHH}HEHHEHƿxUHHHHH@EHEHHHH;@uHHHHHHH@HHHHHH@HǸE}y HPEH։yEHEHEH}tHEHHMEHΉHEEH}u HEfEHEHfE}w}vHEHV}t"HHPPHHPPHHHUHPHEHHPHEHHEH% HEH% HEH ЉEEHHHUHHHP EHEEHE% ‹EHE% ‹EHE HHPHEHHEH% HEH% HEH ЉEEHHHUHHHP0EHEEHE% ‹EHE% ‹EHE HHP(HEH HEH % HEH % HEH  ЉEEHHHUHHHP@EHEEHE% ‹EHE% ‹EHE HHP8HEHHEH% HEH% HEH ЉEEHHHUHHHPPEHEEHE% ‹EHE% ‹EHE HHPHHEHHEH% HEH% HEH ЉEEHHEEHHE% ‹EHHE% ‹EHHE ЉHHUHHHP`EHEEHE% ‹EHE% ‹EHE HHPXHEHHEH% HEH% HEH ЉEEHEEHE% ‹EHE% ‹EHE HHPhEHHEEHHE% ‹EHHE% ‹EHHE HHPlEHHEEHHE% ‹EHHE% ‹EHHE ЉHHUHHHPpUHH`H}HuHUMEHEHE% HE% HE ЉEHEHHEH% HEH% HEH ЉEEUЉEHEH HEH % HEH % HEH  ЉE%HEHHEH% HEH% HEH ЉEHEHHEH% HEH% HEH ЉE܋EHEHEЃ}taEEHEHE1EEHEEHHE!‹EHHE8uEE;ErE;Er0E'UEHHMHEHHuE}HEHHEH% HEH% HEH ЉEă}HEHHEH% HEH% HEH ЉEEHEHEE+MHUHuHEH t>EHE E;Er$EE;EsEU‹E9UHH@H}HuHUȉMHEHHEH% HEH% HEH ЉEHEH HEH % HEH % HEH  ЉEEHEHEE+MHUHuHEHtEHE E;Er͸UHH0H}HuUHEH@pHEH}t }tH}u E}HEH@MHUHuHtUHEHPHEHHEH% HEH% HEH ȉH EHEUHE@h9qUHHPH}HuUHMHEHEEEEEEbEHHEHEHEHE% HE% HE ЉEE;EsEEE;EvEEHEHHEH% HEH% HEH ЉEHHEHHHE}}u |H}t HEubHEHHEH% HEH% HEH ЉE؃}t EHEHEH HEH % HEH % HEH  ЉE܋EHHuHMUHEHH}t HEu_HEHHEH% HEH% HEH ЉEԃ}t EHE,%EUЉEE;EUHHĀH}HuUHMLELMHEHEHEHHEHEH}tHEHEEUHHEHEHEЋHEЋ% HEЋ% HEЋ ЉEHEHE}E;EHEHHEH% HEH% HEH ЉEHEHHEH% HEH% HEH ЉEHUHEHHHNjEHHuLEHMUHEMIHQHEH}t6HEH;Es,HEHEHEHEHEH;EsHEHEHEHEEE;EsHEHUHHEUHHĀH}HuHUHEH@`HEHE@XEHEHEHEH}tHEt}u HE@HEHEHEH¸HMHHHHE̋EHHHUHEHHHEUHEH@LEH}HMHuMIHHEH}%HEHPHEHHEH% HEH% HEH ȉHHEHUHEHHEHEEHEHE% HE% HE ЉEUHEHHEH} HEH HEH % HEH % HEH  ЉEHEHHEH% HEH% HEH ЉEHHEHHHHM؋UHEHpEHHEH@HHEH}tHEH;EsHEHEHEHEEHUHHHEH}tEHEE;EqH}tHEHHUHHEUHHPH}HuUHMEEEEEH}#H}HE EHHEHEHEHPHEHE% HE% HE ȉHHEHUHEHHE܃}y EEf}~ EEUHEHPHEHHEH% HEH% HEH ȉH%EUЉEE;EUHHH}HuHE@HEHp HMHEHgUHHPH}HuHE@mHEH@@HEHE@8EEEEEEH})H}HEUHHEHEHEHPHE؋HE؋% HE؋% HE؋ ȉHHEHUHEHHẼ}y EEf}~ EEUHEHPHEHHEH% HEH% HEH ȉHHEUЉEE;E!HE@8HEHp@HMHEHUHHPH}HuHUHEH@PHEHEEHE@t HEEHEHPHEHE% HE% HE ȉHHEHMHEغHHHEHEH¸HMHHHHEԋE;E~]EԉEHEHPHEHHEH% HEH% HEH ȉHHEHEHEEUHEȋ@H9HEUHEUHH@H}HuHEȋ@(HEHp0HMHEHHEH}u HEHE% HE% HE ЉEHEEHEEEHEEHE% ‹EHE% ‹EHE ЉEHEHPEHHEЋEHHEHUHEE;EsEHHEHHEGCC: (Debian 4.6.1-7) 4.6.1zRx BAC } <AC  \0AC k |AC  @AC ; AC  AC  AC  AC   <+AC & \hAC c |3AC n AC  }AC x KAC F .symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @/& &p,p10p:OJh)h Y   $B @1N =! QmhBE0 E !1COe+~3g}Kmime-cache.cmime_cache_unloadmagic_rule_matchmagic_matchlookup_suffix_nodeslookup_reverse_suffix_nodeslookup_str_in_entriesmime_cache_newg_slice_alloc0mime_cache_loadg_freemime_cache_freeg_slice_free1g_strdupopen64fstat64closeg_mallocreadmemcmpmime_cache_lookup_magicg_utf8_get_charg_unichar_tolowerg_utf8_skipg_utf8_find_prev_charmime_cache_lookup_suffixstrchrstrcmpmime_cache_lookup_aliasmime_cache_lookup_literalmime_cache_lookup_globfnmatchmime_cache_lookup_parentsg_malloc_n8jy? "EY# @ G )/6^!W!""&v( @B`EN E ! @`gmime-type.o/ 1315439605 1000 1000 100640 14704 ` ELF>0@@ UHHPH}HuHEHEHEH}tHE@%=@u DEyHUHcHHHHEHUHEHHHEH}u%s/mime/%s.xmltext/application/application/x-shellscriptGCC: (Debian 4.6.1-7) 4.6.1zRx AC   <AC g `AC  AC  |AC w AC K AC K  AC e $kAC f DSAC N  d>AC Z RAC M )AC $ AC  AC  AC  (AC   HAC Z .symtab.strtab.shstrtab.rela.text.data.bss.rodata.comment.note.GNU-stack.rela.eh_frame @@% &,@ 190=BZW`hR7 apP    , C R`o m k  0I 6Pj!6T]bi: | * 9GUfu SA > )-4NWdv<!mime-type.ccachesn_cachesmime_magic_bufg__mime_magic_buf_lockmime_type_is_data_plain_textparse_xml_descend_comment_tag.8953_mime_type_get_descmime_cache_free_allmime_cache_load_allxdg_mime_type_unknownxdg_mime_type_directoryxdg_mime_type_executablexdg_mime_type_plain_textmime_cache_max_extentmime_type_get_by_filenamemime_cache_lookup_literalmime_cache_lookup_suffixmime_cache_lookup_globmime_type_get_by_filestat64g_utf8_strrchropen64g_threads_got_initializedg_thread_functions_for_glib_useg_thread_use_default_implg_atomic_pointer_getg_static_mutex_get_mutex_implg_mallocreadg_freemime_cache_lookup_magicg_file_testcloseg_strstr_leng_snprintfg_strndupfstat64g_get_language_namesstrchrmime_type_get_descg_get_system_data_dirsg_get_user_data_dirmime_type_finalizemime_type_initg_strv_lengthg_slice_allocg_build_filenamemime_cache_newmime_cache_freemime_cache_foreachg_slice_free1mime_cache_reloadmime_cache_loadg_reallocmime_type_is_text_filemime_type_is_subclassg_str_has_prefixmime_type_is_executable_filestrcmpmime_cache_lookup_parentsmime_type_get_parentsg_array_sized_newg_strdupg_array_append_valsg_array_freemime_type_get_aliasmime_cache_lookup_aliasmime_type_get_cachesC X 6k     H ,> I! O"X  ]#ip  u$| (%& !"  #  $ ($'Gi( )   !"   #$  )$0 (C'M*W t  T+ (+s ^,+  +Q-g- v,.*'%F&X'j*/0-$ '0 'K 2 3 2 6    ) 70 5 3N 8Y e 9t '{     8  9 ' + 6 O \  j q %x  : ;   <     '  7  ` >s       ! "  #   $ (  ! ?( .  9 !? "H  M #Y `  e $l (  A% -B= EB.&*#/ : BAO WAs)DEDH GEHI 6JeGyLHI J+ : @dm:    ( H hA    W,<L!mime-util.o/ 1315439605 1000 1000 100640 3000 ` ELF>@@ UHH`H}HuHEHEHEHtHuHEHENHEHƿHEHuHEAHEHEH}HEAHHEHEAHHEHEHHEHEHHEHEHEHEHEHEHHEHUHHUHPHUHPHUHPHUHP HEDesktop EntryapplicationsNameCommentExecIconTerminalNoDisplayGCC: (Debian 4.6.1-7) 4.6.1zRx AC  .symtab.strtab.shstrtab.rela.text.data.bss.rodata.comment.note.GNU-stack.rela.eh_frame @0 p &,1E901BNWP8R  a0  (  7FYsmime-util.cdesktop_entry_namemime_get_desktop_entryg_key_file_newg_path_is_absoluteg_key_file_load_from_fileg_build_filenameg_key_file_load_from_data_dirsg_freeg_key_file_get_locale_stringg_key_file_get_stringg_key_file_get_booleang_key_file_free ) G ] g     (  -  (: 2? GX ;] et doublecmd-0.5.8/libraries/src/0000755000175000017500000000000012257501472015256 5ustar alexxalexxdoublecmd-0.5.8/libraries/src/libmime/0000755000175000017500000000000012257501472016674 5ustar alexxalexxdoublecmd-0.5.8/libraries/src/libmime/mime-cache.h0000644000175000017500000000452411235110561021030 0ustar alexxalexx/* * mime-cache.h * * Copyright 2007 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef _MIME_CACHE_H_INCLUDED_ #define _MIME_CACHE_H_INCLUDED_ #include #include #include G_BEGIN_DECLS struct _MimeCache { char* file_path; gboolean has_reverse_suffix : 1; /* since mime.cache v1.1, shared mime info v0.4 */ gboolean has_str_weight : 1; /* since mime.cache v1.1, shared mime info v0.4 */ const char* buffer; guint size; guint32 n_alias; const char* alias; guint32 n_parents; const char* parents; guint32 n_literals; const char* literals; guint32 n_globs; const char* globs; guint32 n_suffix_roots; const char* suffix_roots; guint32 n_magics; guint32 magic_max_extent; const char* magics; }; typedef struct _MimeCache MimeCache; MimeCache* mime_cache_new( const char* file_path ); gboolean mime_cache_load( MimeCache* cache, const char* file_path ); gboolean mime_cache_reload( MimeCache* cache ); void mime_cache_free( MimeCache* cache ); const char* mime_cache_lookup_literal( MimeCache* cache, const char* filename ); const char* mime_cache_lookup_glob( MimeCache* cache, const char* filename, int *glob_len ); const char* mime_cache_lookup_suffix( MimeCache* cache, const char* filename, const char** suffix_pos ); const char* mime_cache_lookup_magic( MimeCache* cache, const char* data, int len ); const char** mime_cache_lookup_parents( MimeCache* cache, const char* mime_type ); const char* mime_cache_lookup_alias( MimeCache* cache, const char* mime_type ); G_END_DECLS #endif doublecmd-0.5.8/libraries/src/libmime/README0000644000175000017500000000052411235110561017543 0ustar alexxalexxSimple library that gives MIME for files and retrieves/sets applications assigned to those MIME as per Freedesktop.org specification. All code has been borrowed from: PCManFM v0.5.1 (http://pcmanfm.sourceforge.net/) Copyright 2007 Houng Jen Yee (PCMan) Licenced under GPLv2 or later Thank you for your hard work ;-) doublecmd-0.5.8/libraries/src/libmime/Makefile0000644000175000017500000000142712210604521020324 0ustar alexxalexx# Needs to be linked with GLib2. CPPFLAGS = `pkg-config glib-2.0 --cflags` `getconf LFS_CFLAGS` # -g3 OS_TARGET = linux ifndef CPU_TARGET CPU_TARGET = $(shell uname -i) ifeq ($(CPU_TARGET),unknown) CPU_TARGET = $(shell uname -m) endif endif ifeq ($(CPU_TARGET),x86_64) CPPFLAGS += -m64 else ifeq ($(CPU_TARGET),i386) CPPFLAGS += -m32 else ifeq ($(CPU_TARGET),armv7l) CPU_TARGET = arm else $(error Invalid target CPU) endif all: clean libmime clean: rm -f *.o *.a *.so.* libmime: mime-action.o mime-cache.o mime-type.o mime-util.o $(AR) rc libmime.a *.o mkdir -p ../../$(CPU_TARGET)-$(OS_TARGET) cp libmime.a ../../$(CPU_TARGET)-$(OS_TARGET) # shared library: # $(CC) -shared -Wl,-soname,libmime.so.1 -o libmime.so.1.0.1 libmime.a # ln -s libmime.so.1 libmime.so doublecmd-0.5.8/libraries/src/libmime/mime-type.c0000644000175000017500000004673311235110561020751 0ustar alexxalexx/* * mime-type.c * * Copyright 2007 Houng Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ /* Currently this library is NOT MT-safe */ #ifdef HAVE_CONFIG_H #include #endif #include "mime-type.h" #include "mime-cache.h" #include #include #include #include #include #include "glib-mem.h" /* * FIXME: * Currently, mmap cannot be used because of the limitation of mmap. * When a file is mapped for mime-type sniffing (checking file magic), * they could be deleted during the check and hence result in Bus error. * (Refer to the man page of mmap for detail) * So here I undef HAVE_MMAP to disable the implementation using mmap. */ #undef HAVE_MMAP #ifdef HAVE_MMAP #include #endif /* max extent used to checking text files */ #define TEXT_MAX_EXTENT 512 const char xdg_mime_type_unknown[] = "application/octet-stream"; const char xdg_mime_type_directory[] = "inode/directory"; const char xdg_mime_type_executable[] = "application/x-executable"; const char xdg_mime_type_plain_text[] = "text/plain"; static MimeCache** caches = NULL; static guint n_caches = 0; guint32 mime_cache_max_extent = 0; /* allocated buffer used for mime magic checking to prevent frequent memory allocation */ static char* mime_magic_buf = NULL; /* for MT safety, the buffer should be locked */ G_LOCK_DEFINE_STATIC(mime_magic_buf); /* load all mime.cache files on the system, * including /usr/share/mime/mime.cache, * /usr/local/share/mime/mime.cache, * and $HOME/.local/share/mime/mime.cache. */ static void mime_cache_load_all(); /* free all mime.cache files on the system */ static void mime_cache_free_all(); static gboolean mime_type_is_data_plain_text( const char* data, int len ); /* * Get mime-type of the specified file (quick, but less accurate): * Mime-type of the file is determined by cheking the filename only. * If statbuf != NULL, it will be used to determine if the file is a directory. */ const char* mime_type_get_by_filename( const char* filename, struct stat* statbuf ) { const char* type = NULL, *suffix_pos = NULL, *prev_suffix_pos = (const char*)-1; int i; MimeCache* cache; if( G_UNLIKELY( statbuf && S_ISDIR( statbuf->st_mode ) ) ) return XDG_MIME_TYPE_DIRECTORY; for( i = 0; ! type && i < n_caches; ++i ) { cache = caches[i]; type = mime_cache_lookup_literal( cache, filename ); if( G_LIKELY( ! type ) ) { const char* _type = mime_cache_lookup_suffix( cache, filename, &suffix_pos ); if( _type && suffix_pos < prev_suffix_pos ) { type = _type; prev_suffix_pos = suffix_pos; } } } if( G_UNLIKELY( ! type ) ) /* glob matching */ { int max_glob_len = 0, glob_len = 0; for( i = 0; ! type && i < n_caches; ++i ) { cache = caches[i]; const char* matched_type; matched_type = mime_cache_lookup_glob( cache, filename, &glob_len ); /* according to the mime.cache 1.0 spec, we should use the longest glob matched. */ if( matched_type && glob_len > max_glob_len ) { type = matched_type; max_glob_len = glob_len; } } } return type && *type ? type : XDG_MIME_TYPE_UNKNOWN; } /* * Get mime-type info of the specified file (slow, but more accurate): * To determine the mime-type of the file, mime_type_get_by_filename() is * tried first. If the mime-type couldn't be determined, the content of * the file will be checked, which is much more time-consuming. * If statbuf is not NULL, it will be used to determine if the file is a directory, * or if the file is an executable file; otherwise, the function will call stat() * to gather this info itself. So if you already have stat info of the file, * pass it to the function to prevent checking the file stat again. * If you have basename of the file, pass it to the function can improve the * efifciency, too. Otherwise, the function will try to get the basename of * the specified file again. */ const char* mime_type_get_by_file( const char* filepath, struct stat* statbuf, const char* basename ) { const char* type; struct stat _statbuf; if( statbuf == NULL || G_UNLIKELY( S_ISLNK(statbuf->st_mode) ) ) { statbuf = &_statbuf; if( stat ( filepath, statbuf ) == -1 ) return XDG_MIME_TYPE_UNKNOWN; } if( S_ISDIR( statbuf->st_mode ) ) return XDG_MIME_TYPE_DIRECTORY; if( basename == NULL ) { basename = g_utf8_strrchr( filepath, -1, '/' ); if( G_LIKELY( basename ) ) ++basename; else basename = filepath; } if( G_LIKELY(basename) ) { type = mime_type_get_by_filename( basename, statbuf ); if( G_LIKELY( strcmp( type, XDG_MIME_TYPE_UNKNOWN ) ) ) return type; type = NULL; } if( G_LIKELY(statbuf->st_size > 0) ) { int fd = -1; char* data; /* Open the file and map it into memory */ fd = open ( filepath, O_RDONLY, 0 ); if ( fd != -1 ) { int len = mime_cache_max_extent < statbuf->st_size ? mime_cache_max_extent : statbuf->st_size; #ifdef HAVE_MMAP data = (char*) mmap( NULL, len, PROT_READ, MAP_SHARED, fd, 0 ); #else /* * FIXME: Can g_alloca() be used here? It's very fast, but is it safe? * Actually, we can allocate a block of memory with the size of mime_cache_max_extent, * then we don't need to do dynamic allocation/free every time, but multi-threading * will be a nightmare, so... */ /* try to lock the common buffer */ if( G_LIKELY( G_TRYLOCK( mime_magic_buf ) ) ) data = mime_magic_buf; else /* the buffer is in use, allocate new one */ data = g_malloc( len ); len = read( fd, data, len ); if( G_UNLIKELY( len == -1 ) ) { if( G_LIKELY( data == mime_magic_buf ) ) G_UNLOCK( mime_magic_buf ); else g_free( data ); data = (void*)-1; } #endif if( data != (void*)-1 ) { int i; for( i = 0; ! type && i < n_caches; ++i ) type = mime_cache_lookup_magic( caches[i], data, len ); /* Check for executable file */ if( ! type && g_file_test( filepath, G_FILE_TEST_IS_EXECUTABLE ) ) type = XDG_MIME_TYPE_EXECUTABLE; /* fallback: check for plain text */ if( ! type ) { if( mime_type_is_data_plain_text( data, len > TEXT_MAX_EXTENT ? TEXT_MAX_EXTENT : len ) ) type = XDG_MIME_TYPE_PLAIN_TEXT; } #ifdef HAVE_MMAP munmap ( (char*)data, len ); #else if( G_LIKELY( data == mime_magic_buf ) ) G_UNLOCK( mime_magic_buf ); /* unlock the common buffer */ else /* we use our own buffer */ g_free( data ); #endif } close( fd ); } } else { /* empty file can be viewed as text file */ type = XDG_MIME_TYPE_PLAIN_TEXT; } return type && *type ? type : XDG_MIME_TYPE_UNKNOWN; } /* Get the name of mime-type */ /*const char* mime_type_get_type( MimeInfo* info ) { return info->type_name; } */ static char* parse_xml_desc( const char* buf, size_t len, const char* locale ) { const char *buf_end = buf + len; const char *comment = NULL, *comment_end, *eng_comment; size_t eng_comment_len = 0, comment_len = 0; char target[64]; static const char end_comment_tag[]=""; eng_comment = g_strstr_len( buf, len, "" ); /* default English comment */ if( G_UNLIKELY( ! eng_comment ) ) /* This xml file is invalid */ return NULL; len -= 9; eng_comment += 9; comment_end = g_strstr_len( eng_comment, len, end_comment_tag ); /* find */ if( G_UNLIKELY( ! comment_end ) ) return NULL; eng_comment_len = comment_end - eng_comment; if( G_LIKELY( locale ) ) { int target_len = g_snprintf( target, 64, "", locale); buf = comment_end + 10; len = (buf_end - buf); if( G_LIKELY( ( comment = g_strstr_len( buf, len, target ) ) ) ) { len -= target_len; comment += target_len; comment_end = g_strstr_len( comment, len, end_comment_tag ); /* find */ if( G_LIKELY( comment_end ) ) comment_len = (comment_end - comment); else comment = NULL; } } if( G_LIKELY( comment ) ) return g_strndup( comment, comment_len ); return g_strndup( eng_comment, eng_comment_len ); } static char* _mime_type_get_desc( const char* type, const char* data_dir, const char* locale ) { int fd; struct stat statbuf; char *buffer, *_locale, *desc; char file_path[ 256 ]; /* FIXME: This path shouldn't be hard-coded. */ g_snprintf( file_path, 256, "%s/mime/%s.xml", data_dir, type ); fd = open ( file_path, O_RDONLY, 0 ); if ( G_UNLIKELY( fd == -1 ) ) return NULL; if( G_UNLIKELY( fstat ( fd, &statbuf ) == -1 ) ) { close( fd ); return NULL; } #ifdef HAVE_MMAP buffer = (char*)mmap( NULL, statbuf.st_size, PROT_READ, MAP_SHARED, fd, 0 ); #else buffer = (char*)g_malloc( statbuf.st_size ); if( read( fd, buffer, statbuf.st_size ) == -1 ) { g_free( buffer ); buffer = (char*)-1; } #endif close( fd ); if ( G_UNLIKELY( buffer == (void*)-1 ) ) return NULL; _locale = NULL; if( ! locale ) { const char* const * langs = g_get_language_names(); char* dot = strchr( langs[0], '.' ); if( dot ) locale = _locale = g_strndup( langs[0], (size_t)(dot - langs[0]) ); else locale = langs[0]; } desc = parse_xml_desc( buffer, statbuf.st_size, locale ); g_free( _locale ); #ifdef HAVE_MMAP munmap ( buffer, statbuf.st_size ); #else g_free( buffer ); #endif return desc; } /* * Get human-readable description of the mime-type * If locale is NULL, current locale will be used. * The returned string should be freed when no longer used. */ char* mime_type_get_desc( const char* type, const char* locale ) { char* desc; const gchar* const * dir; dir = g_get_system_data_dirs(); for( ; *dir; ++dir ) { desc = _mime_type_get_desc( type, *dir, locale ); if( G_LIKELY(desc) ) return desc; } /* * FIXME: According to specs on freedesktop.org, user_data_dir has * higher priority than system_data_dirs, but in most cases, there was * no file, or very few files in user_data_dir, so checking it first will * result in many unnecessary open() system calls, yealding bad performance. * Since the spec really sucks, we don't follow it here. */ desc = _mime_type_get_desc( type, g_get_user_data_dir(), locale ); return desc; } void mime_type_finalize() { /* if( G_LIKELY( table ) ) { g_hash_table_destroy( table ); table = NULL; } */ mime_cache_free_all(); } #if 0 void test_parents(const char* type) { int i; const char** parents = NULL; const char** p; for( i = 0; i < n_caches; ++i ) { parents = mime_cache_lookup_parents( caches[i], type ); if( parents ) break; } if( parents ) for( p = parents; *p; ++p ) { g_debug( "%s is parent of %s", *p, type ); } else g_debug( "no parent found" ); } void test_alias( const char* type ) { int i; const char* alias = NULL; for( i = 0; i < n_caches; ++i ) { alias = mime_cache_lookup_alias( caches[i], type ); if( alias ) break; } g_debug("test:\nalias of %s is %s", type, alias ); } #endif void mime_type_init() { mime_cache_load_all(); // table = g_hash_table_new_full( g_str_hash, g_str_equal, g_free, (GDestroyNotify)mime_type_unref ); } /* load all mime.cache files on the system, * including /usr/share/mime/mime.cache, * /usr/local/share/mime/mime.cache, * and $HOME/.local/share/mime/mime.cache. */ void mime_cache_load_all() { const char* const * dirs; int i; const char filename[] = "/mime/mime.cache"; char* path; dirs = g_get_system_data_dirs(); n_caches = g_strv_length( (char**)dirs ) + 1; caches = (MimeCache**)g_slice_alloc( n_caches * sizeof(MimeCache*) ); path = g_build_filename( g_get_user_data_dir(), filename, NULL ); caches[0] = mime_cache_new( path ); g_free( path ); if( caches[0]->magic_max_extent > mime_cache_max_extent ) mime_cache_max_extent = caches[0]->magic_max_extent; for( i = 1; i < n_caches; ++i ) { path = g_build_filename( dirs[i - 1], filename, NULL ); caches[ i ] = mime_cache_new( path ); g_free( path ); if( caches[i]->magic_max_extent > mime_cache_max_extent ) mime_cache_max_extent = caches[i]->magic_max_extent; } mime_magic_buf = g_malloc( mime_cache_max_extent ); return ; } /* free all mime.cache files on the system */ void mime_cache_free_all() { mime_cache_foreach( (GFunc)mime_cache_free, NULL ); g_slice_free1( n_caches * sizeof(MimeCache*), caches ); n_caches = 0; caches = NULL; mime_cache_max_extent = 0; g_free( mime_magic_buf ); mime_magic_buf = NULL; } /* Iterate through all mime caches */ void mime_cache_foreach( GFunc func, gpointer user_data ) { int i; for( i = 0; i < n_caches; ++i ) func( caches[i], user_data ); } gboolean mime_cache_reload( MimeCache* cache ) { int i; gboolean ret = mime_cache_load( cache, cache->file_path ); /* recalculate max magic extent */ for( i = 0; i < n_caches; ++i ) { if( caches[i]->magic_max_extent > mime_cache_max_extent ) mime_cache_max_extent = caches[i]->magic_max_extent; } G_LOCK( mime_magic_buf ); mime_magic_buf = g_realloc( mime_magic_buf, mime_cache_max_extent ); G_UNLOCK( mime_magic_buf ); return ret; } gboolean mime_type_is_data_plain_text( const char* data, int len ) { int i; if ( G_LIKELY( len >= 0 && data ) ) { for ( i = 0; i < len; ++i ) { if ( data[ i ] == '\0' ) return FALSE; } return TRUE; } return FALSE; } gboolean mime_type_is_text_file( const char *file_path, const char* mime_type ) { int file; int rlen; gboolean ret = FALSE; if( mime_type ) { if( mime_type_is_subclass( mime_type, XDG_MIME_TYPE_PLAIN_TEXT ) ) return TRUE; if( ! g_str_has_prefix( mime_type, "text/" ) && ! g_str_has_prefix( mime_type, "application/" ) ) return FALSE; } if( !file_path ) return FALSE; file = open ( file_path, O_RDONLY ); if ( file != -1 ) { struct stat statbuf; if( fstat( file, &statbuf ) != -1 ) { if( S_ISREG( statbuf.st_mode ) ) { #ifdef HAVE_MMAP char* data; rlen = statbuf.st_size < TEXT_MAX_EXTENT ? statbuf.st_size : TEXT_MAX_EXTENT; data = (char*) mmap( NULL, rlen, PROT_READ, MAP_SHARED, file, 0 ); ret = mime_type_is_data_plain_text( data, rlen ); munmap ( (char*)data, rlen ); #else unsigned char data[ TEXT_MAX_EXTENT ]; rlen = read ( file, data, sizeof( data ) ); ret = mime_type_is_data_plain_text( (char*) data, rlen ); #endif } } close ( file ); } return ret; } gboolean mime_type_is_executable_file( const char *file_path, const char* mime_type ) { if ( !mime_type ) { mime_type = mime_type_get_by_file( file_path, NULL, NULL ); } /* * Only executable types can be executale. * Since some common types, such as application/x-shellscript, * are not in mime database, we have to add them ourselves. */ if ( mime_type != XDG_MIME_TYPE_UNKNOWN && (mime_type_is_subclass( mime_type, XDG_MIME_TYPE_EXECUTABLE ) || mime_type_is_subclass( mime_type, "application/x-shellscript" ) ) ) { if ( file_path ) { if ( ! g_file_test( file_path, G_FILE_TEST_IS_EXECUTABLE ) ) return FALSE; } return TRUE; } return FALSE; } /* Check if the specified mime_type is the subclass of the specified parent type */ gboolean mime_type_is_subclass( const char* type, const char* parent ) { int i; const char** parents = NULL; const char** p; /* special case, the type specified is identical to the parent type. */ if( G_UNLIKELY( 0 == strcmp(type, parent) ) ) return TRUE; for( i = 0; i < n_caches; ++i ) { parents = mime_cache_lookup_parents( caches[i], type ); if( parents ) { for( p = parents; *p; ++p ) { if( 0 == strcmp( parent, *p ) ) return TRUE; } } } return FALSE; } /* * Get all parent type of this mime_type * The returned string array should be freed with g_strfreev(). */ char** mime_type_get_parents( const char* type ) { int i; const char** parents = NULL; const char** p; GArray* ret = g_array_sized_new( TRUE, TRUE, sizeof(char*), 5 ); for( i = 0; i < n_caches; ++i ) { parents = mime_cache_lookup_parents( caches[i], type ); if( parents ) { for( p = parents; *p; ++p ) { char* parent = g_strdup( *p ); g_array_append_val( ret, parent ); } } } return (char**)g_array_free( ret, (0 == ret->len) ); } /* * Get all alias types of this mime_type * The returned string array should be freed with g_strfreev(). */ char** mime_type_get_alias( const char* type ) { int i; const char** alias = NULL; const char** p; GArray* ret = g_array_sized_new( TRUE, TRUE, sizeof(char*), 5 ); for( i = 0; i < n_caches; ++i ) { alias = (const char **) mime_cache_lookup_alias( caches[i], type ); if( alias ) { for( p = alias; *p; ++p ) { char* type = g_strdup( *p ); g_array_append_val( ret, type ); } } } return (char**)g_array_free( ret, (0 == ret->len) ); } /* * Get mime caches */ MimeCache** mime_type_get_caches( int* n ) { *n = n_caches; return caches; } doublecmd-0.5.8/libraries/src/libmime/mime-util.c0000644000175000017500000000412411334512314020733 0ustar alexxalexx// Based on code in vfs_app_desktop.c of PCManFM. #include #include "mime-type.h" const char desktop_entry_name[] = "Desktop Entry"; typedef struct _VFSAppDesktop VFSAppDesktop; struct _VFSAppDesktop { char* disp_name; char* comment; char* exec; char* icon_name; gboolean terminal; gboolean hidden; }; /* * If file_name is not a full path, this function searches default paths * for the desktop file. */ VFSAppDesktop mime_get_desktop_entry( const char* file_name ) { GKeyFile* file; gboolean load; char* relative_path; char* ret = NULL; VFSAppDesktop app; file = g_key_file_new(); if( g_path_is_absolute( file_name ) ) { load = g_key_file_load_from_file( file, file_name, G_KEY_FILE_NONE, NULL ); } else { relative_path = g_build_filename( "applications", file_name, NULL ); load = g_key_file_load_from_data_dirs( file, relative_path, NULL, G_KEY_FILE_NONE, NULL ); g_free( relative_path ); } if( load ) { app.disp_name = g_key_file_get_locale_string ( file, desktop_entry_name, "Name", NULL, NULL); app.comment = g_key_file_get_locale_string ( file, desktop_entry_name, "Comment", NULL, NULL); app.exec = g_key_file_get_string ( file, desktop_entry_name, "Exec", NULL); app.icon_name = g_key_file_get_string ( file, desktop_entry_name, "Icon", NULL); app.terminal = g_key_file_get_boolean( file, desktop_entry_name, "Terminal", NULL ); app.hidden = g_key_file_get_boolean( file, desktop_entry_name, "NoDisplay", NULL ); } g_key_file_free( file ); return app; } doublecmd-0.5.8/libraries/src/libmime/mime-cache.c0000644000175000017500000004060311302507346021027 0ustar alexxalexx/* * mime-cache.c * * Copyright 2007 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "mime-cache.h" #include #include "glib-mem.h" #include #include #include #ifdef HAVE_MMAP #include #endif #include #include #include #define LIB_MAJOR_VERSION 1 /* FIXME: since mime-cache 1.2, weight is splitted into three parts * only lower 8 bit contains weight, and higher bits are flags and case-sensitivity. * anyway, since we don't support weight at all, it'll be fixed later. * We claimed that we support 1.2 to cheat pcmanfm as a temporary quick dirty fix * for the broken file manager, but this should be correctly done in the future. * Weight and case-sensitivity are not handled now. */ #define LIB_MAX_MINOR_VERSION 2 #define LIB_MIN_MINOR_VERSION 0 /* handle byte order here */ #define VAL16(buffrer, idx) GUINT16_FROM_BE(*(guint16*)(buffer + idx)) #define VAL32(buffer, idx) GUINT32_FROM_BE(*(guint32*)(buffer + idx)) /* cache header */ #define MAJOR_VERSION 0 #define MINOR_VERSION 2 #define ALIAS_LIST 4 #define PARENT_LIST 8 #define LITERAL_LIST 12 #define SUFFIX_TREE 16 #define GLOB_LIST 20 #define MAGIC_LIST 24 #define NAMESPACE_LIST 28 MimeCache* mime_cache_new( const char* file_path ) { MimeCache* cache = NULL; cache = g_slice_new0( MimeCache ); if( G_LIKELY( file_path ) ) mime_cache_load( cache, file_path ); return cache; } static void mime_cache_unload( MimeCache* cache, gboolean clear ) { if( G_LIKELY(cache->buffer) ) { #ifdef HAVE_MMAP munmap( (char*)cache->buffer, cache->size ); #else g_free( cache->buffer ); #endif } g_free( cache->file_path ); if( clear ) memset( cache, 0, sizeof(MimeCache) ); } void mime_cache_free( MimeCache* cache ) { mime_cache_unload( cache, FALSE ); g_slice_free( MimeCache, cache ); } gboolean mime_cache_load( MimeCache* cache, const char* file_path ) { guint majv, minv; int fd = -1; struct stat statbuf; char* buffer = NULL; guint32 offset; /* Unload old cache first if needed */ if( file_path == cache->file_path ) cache->file_path = NULL; /* steal the string to prevent it from being freed during unload */ mime_cache_unload( cache, TRUE ); /* Store the file path */ cache->file_path = g_strdup( file_path ); /* Open the file and map it into memory */ fd = open ( file_path, O_RDONLY, 0 ); if ( fd < 0 ) return FALSE; if( fstat ( fd, &statbuf ) < 0 ) { close( fd ); return FALSE; } #ifdef HAVE_MMAP buffer = mmap( NULL, statbuf.st_size, PROT_READ, MAP_SHARED, fd, 0 ); #else buffer = g_malloc( statbuf.st_size ); if( buffer ) read( fd, buffer, statbuf.st_size ); else buffer = (void*)-1; #endif close( fd ); if ( buffer == (void*)-1 ) return FALSE; majv = VAL16( buffer, MAJOR_VERSION ); minv = VAL16( buffer, MINOR_VERSION); /* Check version */ if ( majv > LIB_MAJOR_VERSION || minv > LIB_MAX_MINOR_VERSION || minv < LIB_MIN_MINOR_VERSION ) { #ifdef HAVE_MMAP munmap ( buffer, statbuf.st_size ); #else g_free( buffer ); #endif return FALSE; } /* Since mime.cache v1.1, shared mime info v0.4 * suffix tree is replaced with reverse suffix tree, * and glob and literal strings are sorted by weight. */ if( minv >= 1 ) { cache->has_reverse_suffix = TRUE; cache->has_str_weight = TRUE; } cache->buffer = buffer; cache->size = statbuf.st_size; offset = VAL32(buffer, ALIAS_LIST); cache->alias = buffer + offset + 4; cache->n_alias = VAL32( buffer, offset ); offset = VAL32(buffer, PARENT_LIST); cache->parents = buffer + offset + 4; cache->n_parents = VAL32( buffer, offset ); offset = VAL32(buffer, LITERAL_LIST); cache->literals = buffer + offset + 4; cache->n_literals = VAL32( buffer, offset ); offset = VAL32(buffer, GLOB_LIST); cache->globs = buffer + offset + 4; cache->n_globs = VAL32( buffer, offset ); offset = VAL32(buffer, SUFFIX_TREE); cache->suffix_roots = buffer + VAL32( buffer + offset, 4 ); cache->n_suffix_roots = VAL32( buffer, offset ); offset = VAL32(buffer, MAGIC_LIST); cache->n_magics = VAL32( buffer, offset ); cache->magic_max_extent = VAL32( buffer + offset, 4 ); cache->magics = buffer + VAL32( buffer + offset, 8 ); return TRUE; } static gboolean magic_rule_match( const char* buf, const char* rule, const char* data, int len ) { gboolean match = FALSE; guint32 offset = VAL32( rule, 0 ); guint32 range = VAL32( rule, 4 ); guint32 max_offset = offset + range; guint32 val_len = VAL32( rule, 12 ); for( ; offset < max_offset && (offset + val_len) <= len ; ++offset ) { guint32 val_off = VAL32( rule, 16 ); guint32 mask_off = VAL32( rule, 20 ); const char* value = buf + val_off; /* FIXME: word_size and byte order are not supported! */ if( G_UNLIKELY( mask_off > 0 ) ) /* compare with mask applied */ { int i = 0; const char* mask = buf + mask_off; for( ; i < val_len; ++i ) { if( (data[offset + i] & mask[i]) != value[i] ) break; } if( i >= val_len ) match = TRUE; } else /* direct comparison */ { if( 0 == memcmp( value, data + offset, val_len ) ) match = TRUE; } if( match ) { guint32 n_children = VAL32( rule, 24 ); if( n_children > 0 ) { guint32 first_child_off = VAL32( rule, 28 ); guint i; rule = buf + first_child_off; for( i = 0; i < n_children; ++i, rule += 32 ) { if( magic_rule_match( buf, rule, data, len ) ) return TRUE; } } else return TRUE; } } return FALSE; } static gboolean magic_match( const char* buf, const char* magic, const char* data, int len ) { guint32 n_rules = VAL32( magic, 8 ); guint32 rules_off = VAL32( magic, 12 ); const char* rule = buf + rules_off; int i; for( i = 0; i < n_rules; ++i, rule += 32 ) if( magic_rule_match( buf, rule, data, len ) ) return TRUE; return FALSE; } const char* mime_cache_lookup_magic( MimeCache* cache, const char* data, int len ) { const char* magic = cache->magics; int i; if( G_UNLIKELY( ! data || (0 == len) || ! magic ) ) return NULL; for( i = 0; i < cache->n_magics; ++i, magic += 16 ) { if( magic_match( cache->buffer, magic, data, len ) ) { return cache->buffer + VAL32( magic, 4 ); } } return NULL; } static const char* lookup_suffix_nodes( const char* buf, const char* nodes, guint32 n, const char* name ) { gunichar uchar; uchar = g_unichar_tolower( g_utf8_get_char( name ) ); /* binary search */ int upper = n, lower = 0; int middle = n/2; while( upper >= lower ) { const char* node =nodes + middle * 16; guint32 ch = VAL32(node, 0); if( uchar < ch ) upper = middle - 1; else if( uchar > ch ) lower = middle + 1; else /* uchar == ch */ { guint32 n_children = VAL32(node, 8); name =g_utf8_next_char(name); if( n_children > 0 ) { guint32 first_child_off; if( uchar == 0 ) return NULL; if( ! name || 0 == name[0] ) { guint32 offset = VAL32(node, 4); return offset ? buf + offset : NULL; } first_child_off = VAL32(node, 12); return lookup_suffix_nodes( buf, (buf + first_child_off), n_children, name ); } else { if( ! name || 0 == name[0] ) { guint32 offset = VAL32(node, 4); return offset ? buf + offset : NULL; } return NULL; } } middle = (upper + lower) / 2; } return NULL; } /* Reverse suffix tree is used since mime.cache 1.1 (shared mime info 0.4) * Returns the address of the found "node", not mime-type. * FIXME: 1. Should be optimized with binary search * 2. Should consider weight of suffix nodes */ static const char* lookup_reverse_suffix_nodes( const char* buf, const char* nodes, guint32 n, const char* name, const char* suffix, const char** suffix_pos ) { const char *ret = NULL; const char *_suffix_pos = NULL, *cur_suffix_pos = (const char*)suffix + 1; const char* leaf_node = NULL; gunichar uchar; uchar = suffix ? g_unichar_tolower( g_utf8_get_char( suffix ) ) : 0; /* g_debug("%s: suffix= '%s'", name, suffix); */ int i; for( i = 0; i < n; ++i ) { const char* node =nodes + i * 12; guint32 ch = VAL32(node, 0); _suffix_pos = suffix; if( G_LIKELY( ch ) ) { if( ch == uchar ) { guint32 n_children = VAL32(node, 4); guint32 first_child_off = VAL32(node, 8); leaf_node = lookup_reverse_suffix_nodes( buf, buf + first_child_off, n_children, name, g_utf8_find_prev_char(name, suffix), &_suffix_pos ); if( leaf_node && _suffix_pos < cur_suffix_pos ) { ret = leaf_node; cur_suffix_pos = _suffix_pos; } } } else /* ch == 0 */ { /* guint32 weight = VAL32(node, 8); */ /* suffix is found in the tree! */ if( suffix < cur_suffix_pos ) { ret = node; cur_suffix_pos = suffix; } } } *suffix_pos = cur_suffix_pos; return ret; } const char* mime_cache_lookup_suffix( MimeCache* cache, const char* filename, const char** suffix_pos ) { const char* root = cache->suffix_roots; int i, n = cache->n_suffix_roots; const char* mime_type = NULL, *ret = NULL, *prev_suffix_pos = (const char*)-1; int fn_len, n_nodes; if( G_UNLIKELY( ! filename || ! *filename || 0 == n ) ) return NULL; if( cache->has_reverse_suffix ) /* since mime.cache ver: 1.1 */ { const char *suffix, *leaf_node, *_suffix_pos = (const char*)-1; fn_len = strlen( filename ); suffix = g_utf8_find_prev_char( filename, filename + fn_len ); leaf_node = lookup_reverse_suffix_nodes( cache->buffer, root, n, filename, suffix, &_suffix_pos ); if( leaf_node ) { mime_type = cache->buffer + VAL32( leaf_node, 4 ); /* g_debug( "found: %s", mime_type ); */ *suffix_pos = _suffix_pos; ret = mime_type; } } else /* before mime.cache ver: 1.1 */ { for( i = 0; i buffer, cache->buffer + first_child_off, n, g_utf8_next_char(suffix) ); if( mime_type && suffix < prev_suffix_pos ) /* we want the longest suffix matched. */ { ret = mime_type; prev_suffix_pos = suffix; } }while( (suffix = strchr( suffix + 1, ch )) ); } *suffix_pos = ret ? prev_suffix_pos : (const char*)-1; } return ret; } static const char* lookup_str_in_entries( MimeCache* cache, const char* entries, int n, const char* str ) { int upper = n, lower = 0; int middle = upper/2; if( G_LIKELY( entries && str && *str ) ) { /* binary search */ while( upper >= lower ) { const char* entry = entries + middle * 8; const char* str2 = cache->buffer + VAL32(entry, 0); int comp = strcmp( str, str2 ); if( comp < 0 ) upper = middle - 1; else if( comp > 0 ) lower = middle + 1; else /* comp == 0 */ return ( cache->buffer+ VAL32(entry, 4) ); middle = (upper + lower) / 2; } } return NULL; } const char* mime_cache_lookup_alias( MimeCache* cache, const char* mime_type ) { return lookup_str_in_entries( cache, cache->alias, cache->n_alias, mime_type ); } const char* mime_cache_lookup_literal( MimeCache* cache, const char* filename ) { /* FIXME: weight is used in literal lookup after mime.cache v1.1. * However, it's poorly documented. So I've no idea how to implement this. */ if( cache->has_str_weight ) { const char* entries = cache->literals; int n = cache->n_literals; int upper = n, lower = 0; int middle = upper/2; if( G_LIKELY( entries && filename && *filename ) ) { /* binary search */ while( upper >= lower ) { /* The entry size is different in v 1.1 */ const char* entry = entries + middle * 12; const char* str2 = cache->buffer + VAL32(entry, 0); int comp = strcmp( filename, str2 ); if( comp < 0 ) upper = middle - 1; else if( comp > 0 ) lower = middle + 1; else /* comp == 0 */ return ( cache->buffer+ VAL32(entry, 4) ); middle = (upper + lower) / 2; } } return NULL; } return lookup_str_in_entries( cache, cache->literals, cache->n_literals, filename ); } const char* mime_cache_lookup_glob( MimeCache* cache, const char* filename, int *glob_len ) { const char* entry = cache->globs, *type = NULL; int i; int max_glob_len = 0; /* entry size is changed in mime.cache 1.1 */ size_t entry_size = cache->has_str_weight ? 12 : 8; for( i = 0; i < cache->n_globs; ++i ) { const char* glob = cache->buffer + VAL32( entry, 0 ); int _glob_len; if( 0 == fnmatch( glob, filename, 0 ) && (_glob_len = strlen(glob)) > max_glob_len ) { max_glob_len = _glob_len; type = (cache->buffer + VAL32( entry, 4 )); } entry += entry_size; } *glob_len = max_glob_len; return type; } const char** mime_cache_lookup_parents( MimeCache* cache, const char* mime_type ) { guint32 n, i; const char** result; const char* parents; parents = lookup_str_in_entries( cache, cache->parents, cache->n_parents, mime_type ); if( ! parents ) return NULL; n = VAL32(parents, 0); parents += 4; result = (const char**)g_new( char*, n + 1 ); for( i = 0; i < n; ++i ) { guint32 parent_off = VAL32( parents, i * 4 ); const char* parent = cache->buffer + parent_off; result[i] = parent; } result[ n ] = NULL; return result; } doublecmd-0.5.8/libraries/src/libmime/mime-type.h0000644000175000017500000001124411235110561020743 0ustar alexxalexx/* * mime-type.h * * Copyright 2007 Houng Jen Yee (PCMan) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef _MIME_TYPE_H_INCLUDED_ #define _MIME_TYPE_H_INCLUDED_ #include #include #include #include "mime-action.h" #include "mime-cache.h" G_BEGIN_DECLS extern const char xdg_mime_type_unknown[]; #define XDG_MIME_TYPE_UNKNOWN xdg_mime_type_unknown extern const char xdg_mime_type_directory[]; #define XDG_MIME_TYPE_DIRECTORY xdg_mime_type_directory extern const char xdg_mime_type_executable[]; #define XDG_MIME_TYPE_EXECUTABLE xdg_mime_type_executable extern const char xdg_mime_type_plain_text[]; #define XDG_MIME_TYPE_PLAIN_TEXT xdg_mime_type_plain_text /* Opaque data structure storing information of recognized mime-types */ //typedef struct MimeInfo MimeInfo; /* Initialize the library */ void mime_type_init(); /* Reload the shared-mime-database */ gboolean mime_type_reload(); /* Finalize the library and free related resources */ void mime_type_finalize(); /* Get additional info of the specified mime-type */ //MimeInfo* mime_type_get_by_type( const char* type_name ); /* * Get mime-type info of the specified file (quick, but less accurate): * Mime-type of the file is determined by cheking the filename only. * If statbuf != NULL, it will be used to determine if the file is a directory, * or if the file is an executable file. */ const char* mime_type_get_by_filename( const char* filename, struct stat* statbuf ); /* * Get mime-type info of the specified file (slow, but more accurate): * To determine the mime-type of the file, mime_type_get_by_filename() is * tried first. If the mime-type couldn't be determined, the content of * the file will be checked, which is much more time-consuming. * If statbuf is not NULL, it will be used to determine if the file is a directory, * or if the file is an executable file; otherwise, the function will call stat() * to gather this info itself. So if you already have stat info of the file, * pass it to the function to prevent checking the file stat again. * If you have basename of the file, pass it to the function can improve the * efifciency, too. Otherwise, the function will try to get the basename of * the specified file again. */ const char* mime_type_get_by_file( const char* filepath, struct stat* statbuf, const char* basename ); gboolean mime_type_is_text_file( const char * file_path, const char * mime_type ); gboolean mime_type_is_executable_file( const char * file_path, const char * mime_type ); /* Check if the specified mime_type is the subclass of the specified parent type */ gboolean mime_type_is_subclass( const char* type, const char* parent ); /* * Get all parent type of this mime_type * The returned string array should be freed with g_strfreev(). */ char** mime_type_get_parents( const char* type ); /* * Get all alias types of this mime_type * The returned string array should be freed with g_strfreev(). */ char** mime_type_get_alias( const char* type ); /* Add reference to the MimeInfo */ //MimeInfo* mime_type_ref( MimeInfo* info ); /* * Decrease reference count of the MimeInfo: * When reference count of the MimeInfo struct is decreased to * zero, the data structure will be freed automatically. */ //void mime_type_unref( MimeInfo* info ); /* Get the name of mime-type */ //const char* mime_type_get_type( MimeInfo* info ); /* * Get human-readable description of the mime-type * If locale is NULL, current locale will be used. * The returned string should be freed when no longer used. */ char* mime_type_get_desc( const char* type, const char* locale ); /* * Iterate through all mime caches * Can be used to hook file alteration monitor for the cache files to handle reloading. */ void mime_cache_foreach( GFunc func, gpointer user_data ); /* * Get mime caches */ MimeCache** mime_type_get_caches( int* n ); /* max magic extent of all caches */ extern guint32 mime_cache_max_extent; G_END_DECLS #endif doublecmd-0.5.8/libraries/src/libmime/COPYING0000644000175000017500000004312211235110561017717 0ustar alexxalexx GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. doublecmd-0.5.8/libraries/src/libmime/mime-action.c0000644000175000017500000003716711235110561021246 0ustar alexxalexx/* * mime-action.c * * Copyright 2007 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "mime-action.h" //#include "glib-utils.h" #include #include #include #include #include gboolean save_to_file( const char* path, const char* data, gssize len ) { int fd = creat( path, 0644 ); if( fd == -1 ) return FALSE; if( write( fd, data, len ) == -1 ) { close( fd ); return FALSE; } close( fd ); return TRUE; } const char group_desktop[] = "Desktop Entry"; const char key_mime_type[] = "MimeType"; typedef char* (*DataDirFunc) ( const char* dir, const char* mime_type, gpointer user_data ); static char* data_dir_foreach( DataDirFunc func, const char* mime_type, gpointer user_data ) { char* ret = NULL; const gchar* const * dirs; const char* dir = g_get_user_data_dir(); if( (ret = func( dir, mime_type, user_data )) ) return ret; dirs = g_get_system_data_dirs(); for( ; *dirs; ++dirs ) { if( (ret = func( *dirs, mime_type, user_data )) ) return ret; } return NULL; } static void update_desktop_database() { char* argv[3]; argv[0] = g_find_program_in_path( "update-desktop-database" ); if( G_UNLIKELY( ! argv[0] ) ) return; argv[1] = g_build_filename( g_get_user_data_dir(), "applications", NULL ); argv[2] = NULL; g_spawn_sync( NULL, argv, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL); g_free( argv[0] ); g_free( argv[1] ); } static int strv_index( char** strv, const char* str ) { char**p; if( G_LIKELY( strv && str ) ) { for( p = strv; *p; ++p ) { if( 0 == strcmp( *p, str ) ) return (p - strv); } } return -1; } static char* get_actions( const char* dir, const char* type, GArray* actions ) { GKeyFile* file; gboolean opened; char** apps = NULL; char* path = g_build_filename( dir, "applications/mimeinfo.cache", NULL ); file = g_key_file_new(); opened = g_key_file_load_from_file( file, path, 0, NULL ); g_free( path ); if( G_LIKELY( opened ) ) { gsize n_apps = 0, i; apps = g_key_file_get_string_list( file, "MIME Cache", type, &n_apps, NULL ); for( i = 0; i < n_apps; ++i ) { if( -1 == strv_index( (char**)actions->data, apps[i] ) ) { /* check for existence */ path = mime_type_locate_desktop_file( dir, apps[i] ); if( G_LIKELY(path) ) { g_array_append_val( actions, apps[i] ); g_free( path ); } else g_free( apps[i] ); apps[i] = NULL; /* steal the string */ } else { g_free( apps[i] ); apps[i] = NULL; } } g_free( apps ); /* don't call g_strfreev since all strings in the array was stolen. */ } g_key_file_free( file ); return NULL; /* return NULL so the for_each operation doesn't stop. */ } /* * Get a list of applications supporting this mime-type * The returned string array was newly allocated, and should be * freed with g_strfreev() when no longer used. */ char** mime_type_get_actions( const char* type ) { GArray* actions = g_array_sized_new( TRUE, FALSE, sizeof(char*), 10 ); char* default_app = NULL; /* FIXME: actions of parent types should be added, too. */ /* get all actions for this file type */ data_dir_foreach( (DataDirFunc)get_actions, type, actions ); /* ensure default app is in the list */ if( G_LIKELY( ( default_app = mime_type_get_default_action( type ) ) ) ) { int i = strv_index( (char**)actions->data, default_app ); if( i == -1 ) /* default app is not in the list, add it! */ { g_array_prepend_val( actions, default_app ); } else /* default app is in the list, move it to the first. */ { if( i != 0 ) { char** pdata = (char**)actions->data; char* tmp = pdata[i]; g_array_remove_index( actions, i ); g_array_prepend_val( actions, tmp ); } g_free( default_app ); } } return (char**)g_array_free( actions, actions->len == 0 ); } /* * NOTE: * This API is very time consuming, but unfortunately, due to the damn poor design of * Freedesktop.org spec, all the insane checks here are necessary. Sigh... :-( */ gboolean mime_type_has_action( const char* type, const char* desktop_id ) { char** actions, **action; char *cmd = NULL, *name = NULL; gboolean found = FALSE; gboolean is_desktop = g_str_has_suffix( desktop_id, ".desktop" ); if( is_desktop ) { char** types; GKeyFile* kf = g_key_file_new(); char* filename = mime_type_locate_desktop_file( NULL, desktop_id ); if( filename && g_key_file_load_from_file( kf, filename, 0, NULL ) ) { types = g_key_file_get_string_list( kf, group_desktop, key_mime_type, NULL, NULL ); if( -1 != strv_index( types, type ) ) { /* our mime-type is already found in the desktop file. no further check is needed */ found = TRUE; } g_strfreev( types ); if( ! found ) /* get the content of desktop file for comparison */ { cmd = g_key_file_get_string( kf, group_desktop, "Exec", NULL ); name = g_key_file_get_string( kf, group_desktop, "Name", NULL ); } } g_free( filename ); g_key_file_free( kf ); } else { cmd = (char*)desktop_id; } actions = mime_type_get_actions( type ); if( actions ) { for( action = actions; ! found && *action; ++action ) { /* Try to match directly by desktop_id first */ if( is_desktop && 0 == strcmp( *action, desktop_id ) ) { found = TRUE; } else /* Then, try to match by "Exec" and "Name" keys */ { char *name2 = NULL, *cmd2 = NULL, *filename = NULL; GKeyFile* kf = g_key_file_new(); filename = mime_type_locate_desktop_file( NULL, *action ); if( filename && g_key_file_load_from_file( kf, filename, 0, NULL ) ) { cmd2 = g_key_file_get_string( kf, group_desktop, "Exec", NULL ); if( cmd && cmd2 && 0 == strcmp( cmd, cmd2 ) ) /* 2 desktop files have same "Exec" */ { if( is_desktop ) { name2 = g_key_file_get_string( kf, group_desktop, "Name", NULL ); /* Then, check if the "Name" keys of 2 desktop files are the same. */ if( name && name2 && 0 == strcmp( name, name2 ) ) { /* Both "Exec" and "Name" keys of the 2 desktop files are * totally the same. So, despite having different desktop id * They actually refer to the same application. */ found = TRUE; } g_free( name2 ); } else found = TRUE; } } g_free( filename ); g_free( cmd2 ); g_key_file_free( kf ); } } g_strfreev( actions ); } if( is_desktop ) { g_free( cmd ); g_free( name ); } return found; } #if 0 static gboolean is_custom_desktop_file( const char* desktop_id ) { char* path = g_build_filename( g_get_user_data_dir(), "applications", desktop_id, NULL ); gboolean ret = g_file_test( path, G_FILE_TEST_EXISTS ); g_free( path ); return ret; } #endif static char* make_custom_desktop_file( const char* desktop_id, const char* mime_type ) { char *name = NULL, *cust_template = NULL, *cust = NULL, *path, *dir; char* file_content = NULL; gsize len = 0; guint i; if( G_LIKELY( g_str_has_suffix(desktop_id, ".desktop") ) ) { GKeyFile *kf = g_key_file_new(); char* name = mime_type_locate_desktop_file( NULL, desktop_id ); if( G_UNLIKELY( ! name || ! g_key_file_load_from_file( kf, name, G_KEY_FILE_KEEP_TRANSLATIONS, NULL ) ) ) { g_free( name ); return NULL; /* not a valid desktop file */ } g_free( name ); /* FIXME: If the source desktop_id refers to a custom desktop file, and value of the MimeType key equals to our mime-type, there is no need to generate a new desktop file. if( G_UNLIKELY( is_custom_desktop_file( desktop_id ) ) ) { } */ /* set our mime-type */ g_key_file_set_string_list( kf, group_desktop, key_mime_type, &mime_type, 1 ); /* store id of original desktop file, for future use. */ g_key_file_set_string( kf, group_desktop, "X-MimeType-Derived", desktop_id ); g_key_file_set_string( kf, group_desktop, "NoDisplay", "true" ); name = g_strndup( desktop_id, strlen(desktop_id) - 8 ); cust_template = g_strdup_printf( "%s-usercustom-%%d.desktop", name ); g_free( name ); file_content = g_key_file_to_data( kf, &len, NULL ); g_key_file_free( kf ); } else /* it's not a desktop_id, but a command */ { char* p; const char file_templ[] = "[Desktop Entry]\n" "Encoding=UTF-8\n" "Name=%s\n" "Exec=%s\n" "MimeType=%s\n" "Icon=exec\n" "NoDisplay=true\n"; /* FIXME: Terminal? */ /* Make a user-created desktop file for the command */ name = g_path_get_basename( desktop_id ); if( (p = strchr(name, ' ')) ) /* FIXME: skip command line arguments. is this safe? */ *p = '\0'; file_content = g_strdup_printf( file_templ, name, desktop_id, mime_type ); len = strlen( file_content ); cust_template = g_strdup_printf( "%s-usercreated-%%d.desktop", name ); g_free( name ); } /* generate unique file name */ dir = g_build_filename( g_get_user_data_dir(), "applications", NULL ); g_mkdir_with_parents( dir, 0700 ); for( i = 0; ; ++i ) { /* generate the basename */ cust = g_strdup_printf( cust_template, i ); path = g_build_filename( dir, cust, NULL ); /* test if the filename already exists */ if( g_file_test( path, G_FILE_TEST_EXISTS ) ) { g_free( cust ); g_free( path ); } else /* this generated filename can be used */ break; } g_free( dir ); if( G_LIKELY( path ) ) { save_to_file( path, file_content, len ); g_free( path ); /* execute update-desktop-database" to update mimeinfo.cache */ update_desktop_database(); } return cust; } /* * Add an applications used to open this mime-type * desktop_id is the name of *.desktop file. * * custom_desktop: used to store name of the newly created user-custom desktop file, can be NULL. */ void mime_type_add_action( const char* type, const char* desktop_id, char** custom_desktop ) { char* cust; if( mime_type_has_action( type, desktop_id ) ) { if( custom_desktop ) *custom_desktop = g_strdup( desktop_id ); return; } cust = make_custom_desktop_file( desktop_id, type ); if( custom_desktop ) *custom_desktop = cust; else g_free( cust ); } static char* _locate_desktop_file( const char* dir, const char* unused, const gpointer desktop_id ) { char *path, *sep = NULL; gboolean found = FALSE; path = g_build_filename( dir, "applications", (const char*)desktop_id, NULL ); sep = strchr( (const char*)desktop_id, '-' ); if( sep ) sep = strrchr( path, '-' ); do{ if( g_file_test( path, G_FILE_TEST_IS_REGULAR ) ) { found = TRUE; break; } if( sep ) { *sep = '/'; sep = strchr( sep + 1, '-' ); } else break; }while( ! found ); if( ! found ) { g_free( path ); return NULL; } return path; } char* mime_type_locate_desktop_file( const char* dir, const char* desktop_id ) { if( dir ) return _locate_desktop_file( dir, NULL, (gpointer) desktop_id ); return data_dir_foreach( _locate_desktop_file, NULL, (gpointer) desktop_id ); } static char* get_default_action( const char* dir, const char* type, gpointer user_data ) { GKeyFile* file; gboolean opened; char* action = NULL; char* path = g_build_filename( dir, "applications/defaults.list", NULL ); file = g_key_file_new(); opened = g_key_file_load_from_file( file, path, 0, NULL ); g_free( path ); if( G_LIKELY( opened ) ) action = g_key_file_get_string( file, "Default Applications", type, NULL ); g_key_file_free( file ); /* check for existence */ if( action ) { path = mime_type_locate_desktop_file( NULL, action ); if( G_LIKELY( path ) ) g_free( path ); else { g_free( action ); action = NULL; } } return action; } /* * Get default applications used to open this mime-type * The returned string was newly allocated, and should be * freed when no longer used. * If NULL is returned, that means default app is not set for this mime-type. */ char* mime_type_get_default_action( const char* type ) { /* FIXME: need to check parent types if default action of current type is not set. */ return data_dir_foreach( (DataDirFunc)get_default_action, type, NULL ); } /* * Set default applications used to open this mime-type * desktop_id is the name of *.desktop file. */ void mime_type_set_default_action( const char* type, const char* desktop_id ) { GKeyFile* file; gsize len = 0; char* data = NULL; char* dir = g_build_filename( g_get_user_data_dir(), "applications", NULL ); char* path = g_build_filename( dir, "defaults.list", NULL ); g_mkdir_with_parents( dir, 0700 ); g_free( dir ); file = g_key_file_new(); /* Load old file content, if available */ g_key_file_load_from_file( file, path, 0, NULL ); g_key_file_set_string( file, "Default Applications", type, desktop_id ); data = g_key_file_to_data( file, &len, NULL ); g_key_file_free( file ); save_to_file( path, data, len ); g_free( path ); g_free( data ); } doublecmd-0.5.8/libraries/src/libmime/glib-mem.h0000644000175000017500000000130211235110561020520 0ustar alexxalexx/* * C++ Interface: glib-mem * * Description: Compatibility macros for older versions of glib * * * Author: Hong Jen Yee (PCMan) , (C) 2006 * * Copyright: See COPYING file that comes with this distribution * */ #ifndef _GLIB_MEM_H_ #define _GLIB_MEM_H_ #include #if ! GLIB_CHECK_VERSION(2, 10, 0) /* older versions of glib don't provde g_slice API */ #define g_slice_alloc(size) g_malloc(size) #define g_slice_alloc0(size) g_malloc0(size) #define g_slice_new(type) g_new(type, 1) #define g_slice_new0(type) g_new0(type, 1) #define g_slice_free(type, mem) g_free(mem) #define g_slice_free1(size, mem) g_free(mem) #endif #endif doublecmd-0.5.8/libraries/src/libmime/mime-action.h0000644000175000017500000000442211235110561021237 0ustar alexxalexx/* * mime-action.h * * Copyright 2007 PCMan * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef _MIME_ACTION_H_INCLUDED_ #define _MIME_ACTION_H_INCLUDED_ #include G_BEGIN_DECLS /* * Get a list of applications supporting this mime-type * The returned string array was newly allocated, and should be * freed with g_strfreev() when no longer used. */ char** mime_type_get_actions( const char* type ); /* * Add an applications used to open this mime-type * desktop_id is the name of *.desktop file. * * custom_desktop: used to store name of the newly created user-custom desktop file, can be NULL. */ void mime_type_add_action( const char* type, const char* desktop_id, char** custom_desktop ); /* * Check if an applications currently set to open this mime-type * desktop_id is the name of *.desktop file. */ gboolean mime_type_has_action( const char* type, const char* desktop_id ); /* * Get default applications used to open this mime-type * The returned string was newly allocated, and should be * freed when no longer used. * If NULL is returned, that means default app is not set for this mime-type. */ char* mime_type_get_default_action( const char* type ); /* * Set default applications used to open this mime-type * desktop_id is the name of *.desktop file. */ void mime_type_set_default_action( const char* type, const char* desktop_id ); /* Locate the file path of desktop file by desktop_id */ char* mime_type_locate_desktop_file( const char* dir, const char* desktop_id ); G_END_DECLS #endif doublecmd-0.5.8/libraries/i386-linux/0000755000175000017500000000000012257501472016315 5ustar alexxalexxdoublecmd-0.5.8/libraries/i386-linux/libmime.a0000644000175000017500000007361011632002070020066 0ustar alexxalexx! / 1315439587 0 0 0 980 ` &%%%%%%%%%HHHHHHHHHHHHHHHHHHoosave_to_filegroup_desktopkey_mime_typemime_type_locate_desktop_filemime_type_get_actionsmime_type_get_default_actionmime_type_has_actionmime_type_add_actionmime_type_set_default_actionmime_cache_newmime_cache_loadmime_cache_freemime_cache_lookup_magicmime_cache_lookup_suffixmime_cache_lookup_aliasmime_cache_lookup_literalmime_cache_lookup_globmime_cache_lookup_parentsxdg_mime_type_unknownxdg_mime_type_directoryxdg_mime_type_executablexdg_mime_type_plain_textmime_cache_max_extentmime_type_get_by_filenamemime_type_get_by_filemime_type_get_descmime_type_finalizemime_type_initmime_cache_foreachmime_cache_reloadmime_type_is_text_filemime_type_is_subclassmime_type_is_executable_filemime_type_get_parentsmime_type_get_aliasmime_type_get_cachesdesktop_entry_namemime_get_desktop_entrymime-action.o/ 1315439586 1000 1000 100640 8532 ` ELF4( U(D$E$E}u@ED$E D$E$uE$E$U(EEED$E D$E$EЉE}tEEE-EUT$U T$$EЉE}tEEEuʸUH$EED$D$/$EED$$D$ D$D$D$D$D$ D$ED$$E$E$U(}tD} t>EE-EU T$$uUE)EEuʸUHED$D$<E$EED$ D$ED$E$EE$}ED$ED$ E D$D$XE$EEEEET$$utEED$E$E}t-EED$D$E$E$EE$EE"EE$EEEE9E9E$E$U8D$ D$D$$EEED$ED$$E$EEUET$$E}uD$ED$E$S}tBEEEEEED$E$D$ED$E$E$E@D$E$UhEEED$cE $E}E܋E D$$E؃}D$ D$E؉D$E܉$D$D$ D$D$E܉$EԋED$Eԉ$:tEEԉ$}uLD$ D$lD$E܉$ED$ D$qD$E܉$EE؉$E܉$E EE$EЃ}EЉEm}t$EU T$$u E?EEEEċED$$Eȃ}D$ D$EȉD$Eĉ$D$ D$lD$Eĉ$E}}tED$E$ui}t\D$ D$qD$Eĉ$Ẽ}t#}tẺD$E$uEẺ$EEȉ$E$Eĉ$E}u EEЉ$}tE$E$EUWVSEEEEED$cE$aEЋED$$Ẽ}t&D$ D$ẺD$EЉ$uẺ$Ẻ$D$E D$ D$D$EЉ$ED$ D$vD$EЉ$D$ D$D$EЉ$EDžT¸TЃD$E$E̋ẺD$$EẺ$D$ED$EЉ$EEЉ$gUt t fljރt 4 f4t E$ED$ E؉$Eȃ}tEE D$ ED$E؉D$g$EEDžT¸TЃEE؉D$$EE؉$D$D$/$ED$Eĉ$EE܉D$E$ED$EԉD$Eĉ$ED$E$tEԉ$E$E뛐Eĉ$}t)ED$ED$E$E$Eԁ[^_]U(E D$E$t}tFE $‹E2ED$E $E}t EUE$U(EED$ ED$D$/E$ED$-E$E}tD$-E$ED$E$t E.}t'E/ED$-$E}t}uE$EU}tE D$D$E$E D$D$$ U(ED$D$%E$EED$ D$ED$E$EE$}t%D$ E D$D$@E$EE$}t;ED$$E}t E$E$EEUD$ED$$ U8EED$D$/$ED$D$UE$ED$E$E$ED$ D$ED$E$E D$ ED$D$@E$D$ED$E$EE$ED$ED$E$E$E$Desktop EntryMimeTypeupdate-desktop-databaseapplicationsapplications/mimeinfo.cacheMIME Cache.desktopExecNameX-MimeType-DerivedtrueNoDisplay%s-usercustom-%%d.desktop%s-usercreated-%%d.desktop[Desktop Entry] Encoding=UTF-8 Name=%s Exec=%s MimeType=%s Icon=exec NoDisplay=true applications/defaults.listDefault Applicationsdefaults.listGCC: (Debian 4.6.1-7) 4.6.1zR| kAB g <kAB  \AB  |WAB S AB  AB  #AB  ,AB zfAAA ,f kAB g L AB  l EAB A  AB   #AB _  AB  .symtab.strtab.shstrtab.rel.text.data.bss.rodata.comment.note.GNU-stack.rel.eh_frame4  %8+808c80AUQ p _  ak 8WCOh } k  -4;Jd E #0=#Rcnf k3<D mime-action.cdata_dir_foreachupdate_desktop_databasestrv_indexget_actionsmake_custom_desktop_file_locate_desktop_fileget_default_actionsave_to_filecreat64writeclosegroup_desktopkey_mime_typeg_get_user_data_dirg_get_system_data_dirsg_find_program_in_pathg_build_filenameg_spawn_syncg_freestrcmpg_key_file_newg_key_file_load_from_fileg_key_file_get_string_listmime_type_locate_desktop_fileg_array_append_valsg_key_file_freemime_type_get_actionsg_array_sized_newmime_type_get_default_actiong_array_prepend_valsg_array_remove_indexg_array_freemime_type_has_actiong_str_has_suffixg_strfreevg_key_file_get_stringg_key_file_set_string_listg_key_file_set_stringg_strndupg_strdup_printfg_key_file_to_datag_path_get_basenamestrchrg_mkdir_with_parentsg_file_testmime_type_add_actiong_strdupstrrchrmime_type_set_default_action>N`y'&KY !&Jt"$%$&T'n&y(* =EP|+,,"#)Sk , ,8Nbmx"+*   KZo-.. /& + 09 S 1a "q  2 3. 0g l 0z     4 0  5  % D O z ) 7    35 8K 5z 3     = K h s , "    .9O4Z_.1" @`0Ppmime-cache.o/ 1315439586 1000 1000 100640 8904 ` ELF4( U(E$DE}tED$E$EUWSE@tE@$E$} tZE»Dуtуt fكtfكt[_]UD$E$SED$$DUEEE;E u ED$E$E $‹ED$D$E $E}y ED$E$yE$oEU$E}tEUD$ED$E$EE$}u EfEEfE}w}vE$}tEPPEPPEUPEU‹EP EE% ‹E% ‹E ЉEEUEPEUЋEUЋ% EUЋ% EUЋ ‹EPEE% ‹E% ‹E ЉEEUEPEUЋEUЋ% EUЋ% EUЋ ‹EPE E % ‹E % ‹E  ЉEEUEP$EUЋEUЋ% EUЋ% EUЋ ‹EP EE% ‹E% ‹E ЉEEUEP,EUЋEUЋ% EUЋ% EUЋ ‹EP(EE% ‹E% ‹E ЉEEEEE% ‹EE% ‹EE ЉUEP4EUЋEUЋ% EUЋ% EUЋ ‹EP0EE% ‹E% ‹E ЉEEUЋEUЋ% EUЋ% EUЋ ‹EP8EEEE% ‹EE% ‹EE ‹EPu%$t $$Ӌ T$$ t> u%$t $$ӋE$[]U} x6}t0EEEuEE;E |UE} tYD$E $t D$~E $u!D$E $u }u D$E$E}tiED$E$tGE%=u8D$D$E$EED$$EE$EU} uD$D$E$E } tYD$E $uD$E $t+}tD$E$u U(EE D$E$uyE_UЋUT$$E}t4EE#ED$E $u"EEuԃEU9rU8ED$ D$D$$EEjUЋUT$$E}t?EE.E$ED$ED$E$EEuɃEU9rE@D$E$U8ED$ D$D$$EEjUЋUT$$E}t?EE.E$ED$ED$E$EEuɃEU9rE@D$E$U‹E]application/octet-streaminode/directoryapplication/x-executabletext/plain%s/mime/%s.xmltext/application/application/x-shellscriptGCC: (Debian 4.6.1-7) 4.6.1zR| VAB R ,<VAB OuAAA luAB q VAB  iAB e Q AB I ^ AB I $ knAB dEA 4 lAB h TE ?AB { $t AB SA  IAB E  AB   AB   AB  *AB  <AB  \AB R .symtab.strtab.shstrtab.rel.text.data.bss.rodata.comment.note.GNU-stack.rel.eh_frame4  %+,080AUxQ % d_    ,C I`uo V lkn)B  6VPjV!6T]biiQ *^ 9GUfuE ?    -4N*dvmime-type.ccachesn_cachesmime_magic_bufg__mime_magic_buf_lockmime_type_is_data_plain_textparse_xml_descend_comment_tag.8671_mime_type_get_descmime_cache_free_allmime_cache_load_allxdg_mime_type_unknownxdg_mime_type_directoryxdg_mime_type_executablexdg_mime_type_plain_textmime_cache_max_extentmime_type_get_by_filenamemime_cache_lookup_literalmime_cache_lookup_suffixmime_cache_lookup_globmime_type_get_by_filestat64g_utf8_strrchropen64g_threads_got_initializedg_thread_functions_for_glib_useg_thread_use_default_implg_atomic_pointer_getg_static_mutex_get_mutex_implg_mallocreadg_freemime_cache_lookup_magicg_file_testcloseg_strstr_leng_snprintfg_strndupfstat64g_get_language_namesstrchrmime_type_get_descg_get_system_data_dirsg_get_user_data_dirmime_type_finalizemime_type_initg_strv_lengthg_slice_allocg_build_filenamemime_cache_newmime_cache_freemime_cache_foreachg_slice_free1mime_cache_reloadmime_cache_loadg_reallocmime_type_is_text_filemime_type_is_subclassg_str_has_prefixmime_type_is_executable_filestrcmpmime_cache_lookup_parentsmime_type_get_parentsg_array_sized_newg_strdupg_array_append_valsg_array_freemime_type_get_aliasmime_cache_lookup_aliasmime_type_get_caches4Gf2P  !"#$%4&BL V!["fk#t}$'( )FKU _!d"ot#}$'*+CR+,++<-P-q,.*%&!'3*U/m0-''2/3267389'    N 8V j 9w '|       %  : ;   <  $ - 5 '; U z  >       ! "  #  $ $+ 6 ; G ?L Q  [ !` "k p #y   $   A$ / B; F Bw  . & *  ) 4 A@ K Ah ) D  E DWGhEHIJ)G:SLqHIJ @p8Xx @`mime-util.o/ 1315439586 1000 1000 100640 2108 ` ELF4( UXEEE $t'D$ D$E D$E$EVD$E D$$ED$D$ D$ED$E$EE$}D$D$ D$D$E$ED$D$ D$ D$E$ED$ D$(D$E$ED$ D$-D$E$ED$ D$2D$E$ED$ D$;D$E$EE$EUЉUԉPU؉PU܉P UPUPEDesktop EntryapplicationsNameCommentExecIconTerminalNoDisplayGCC: (Debian 4.6.1-7) 4.6.1zR| AB  .symtab.strtab.shstrtab.rel.text.data.bss.rodata.comment.note.GNU-stack.rel.eh_frame4 d % + 0 E80QAnUp8Q 4 _P  `  7FYsmime-util.cdesktop_entry_namemime_get_desktop_entryg_key_file_newg_path_is_absoluteg_key_file_load_from_fileg_build_filenameg_key_file_load_from_data_dirsg_freeg_key_file_get_locale_stringg_key_file_get_stringg_key_file_get_booleang_key_file_free  B ]b   &9A L_g r  doublecmd-0.5.8/doublecmd-noconsole.js0000644000175000017500000000145611525751770017017 0ustar alexxalexx// Use this script to run Double Commander without console debug window // run as logged-in user: // First get the path of this script var script_path = WScript.ScriptFullName; script_path = script_path.substring(0, script_path.lastIndexOf('\\')); var shell = WScript.CreateObject("WScript.Shell"); // Then launch dc(DoubleCommander directory is supposed to be placed besides this script) shell.run("\"" + script_path + "\\doublecmd.exe\"", 0, false); /* // or this one asks for the desired user: var script_path = WScript.ScriptFullName; script_path = script_path.substring(0, script_path.lastIndexOf('\\')); var shell = WScript.CreateObject("WScript.Shell"); var app = WScript.CreateObject("Shell.Application"); app.ShellExecute(script_path + "\\doublecmd.exe", "", "", "runas", 0); */doublecmd-0.5.8/docgen.bat0000644000175000017500000000017411740433676014452 0ustar alexxalexxREM http://pasdoc.sourceforge.net pasdoc --marker en --output doc\en\dev-help --define MSWINDOWS --source units-doc-win.txtdoublecmd-0.5.8/install/0000755000175000017500000000000012257501472014161 5ustar alexxalexxdoublecmd-0.5.8/install/windows/0000755000175000017500000000000012257501472015653 5ustar alexxalexxdoublecmd-0.5.8/install/windows/install.bat0000644000175000017500000000446411744550766020033 0ustar alexxalexxrem This script run from create_packages.bat rem If you run it direct, set up %BUILD_PACK_DIR% first rem Prepare all installation files set DC_INSTALL_DIR=%BUILD_PACK_DIR%\doublecmd mkdir %DC_INSTALL_DIR% mkdir %DC_INSTALL_DIR%\plugins rem WCX plugins directories mkdir %DC_INSTALL_DIR%\plugins\wcx mkdir %DC_INSTALL_DIR%\plugins\wcx\cpio mkdir %DC_INSTALL_DIR%\plugins\wcx\deb mkdir %DC_INSTALL_DIR%\plugins\wcx\lzma mkdir %DC_INSTALL_DIR%\plugins\wcx\rpm mkdir %DC_INSTALL_DIR%\plugins\wcx\unrar mkdir %DC_INSTALL_DIR%\plugins\wcx\zip rem WDX plugins directories mkdir %DC_INSTALL_DIR%\plugins\wdx mkdir %DC_INSTALL_DIR%\plugins\wdx\scripts mkdir %DC_INSTALL_DIR%\plugins\wdx\rpm_wdx mkdir %DC_INSTALL_DIR%\plugins\wdx\deb_wdx rem WFX plugins directories mkdir %DC_INSTALL_DIR%\plugins\wfx mkdir %DC_INSTALL_DIR%\plugins\wfx\ftp rem Copy directories xcopy /E language %DC_INSTALL_DIR%\language\ xcopy /E doc\en %DC_INSTALL_DIR%\doc\en\ xcopy /E pixmaps %DC_INSTALL_DIR%\pixmaps\ rem Copy files copy doc\*.txt %DC_INSTALL_DIR%\doc\ copy doublecmd.exe %DC_INSTALL_DIR%\ copy doublecmd.zdli %DC_INSTALL_DIR%\ copy install\windows\doublecmd.xml %DC_INSTALL_DIR%\ copy doublecmd.ext.example %DC_INSTALL_DIR%\ copy pixmaps.txt %DC_INSTALL_DIR%\ copy multiarc.ini %DC_INSTALL_DIR%\ rem Copy libraries copy *.dll %DC_INSTALL_DIR%\ rem copy plugins rem WCX copy plugins\wcx\cpio\lib\cpio.wcx %DC_INSTALL_DIR%\plugins\wcx\cpio\ copy plugins\wcx\deb\lib\deb.wcx %DC_INSTALL_DIR%\plugins\wcx\deb\ copy plugins\wcx\lzma\lib\lzma.wcx %DC_INSTALL_DIR%\plugins\wcx\lzma\ copy plugins\wcx\rpm\lib\rpm.wcx %DC_INSTALL_DIR%\plugins\wcx\rpm\ copy plugins\wcx\unrar\lib\unrar.wcx %DC_INSTALL_DIR%\plugins\wcx\unrar\ copy plugins\wcx\zip\lib\zip.wcx %DC_INSTALL_DIR%\plugins\wcx\zip\ rem WDX copy plugins\wdx\rpm_wdx\lib\rpm_wdx.wdx %DC_INSTALL_DIR%\plugins\wdx\rpm_wdx\ copy plugins\wdx\deb_wdx\lib\deb_wdx.wdx %DC_INSTALL_DIR%\plugins\wdx\deb_wdx\ copy plugins\wdx\scripts\* %DC_INSTALL_DIR%\plugins\wdx\scripts\ rem WFX copy plugins\wfx\ftp\lib\ftp.wfx %DC_INSTALL_DIR%\plugins\wfx\ftp\ doublecmd-0.5.8/install/windows/doublecmd.iss0000644000175000017500000001046312255271322020331 0ustar alexxalexx; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! [Setup] AppName=Double Commander AppVerName=Double Commander 0.5.8 beta AppPublisherURL=http://doublecmd.sourceforge.net AppSupportURL=http://doublecmd.sourceforge.net AppUpdatesURL=http://doublecmd.sourceforge.net DefaultDirName={pf}\Double Commander DefaultGroupName=Double Commander AllowNoIcons=yes LicenseFile=doublecmd\doc\COPYING.txt OutputDir=release Compression=lzma SolidCompression=yes ; "ArchitecturesInstallIn64BitMode=x64" requests that the install be ; done in "64-bit mode" on x64, meaning it should use the native ; 64-bit Program Files directory and the 64-bit view of the registry. ; On all other architectures it will install in "32-bit mode". ArchitecturesInstallIn64BitMode=x64 [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" Name: "brazilianportuguese"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl" Name: "catalan"; MessagesFile: "compiler:Languages\Catalan.isl" Name: "corsican"; MessagesFile: "compiler:Languages\Corsican.isl" Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl" Name: "danish"; MessagesFile: "compiler:Languages\Danish.isl" Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl" Name: "finnish"; MessagesFile: "compiler:Languages\Finnish.isl" Name: "french"; MessagesFile: "compiler:Languages\French.isl" Name: "german"; MessagesFile: "compiler:Languages\German.isl" Name: "greek"; MessagesFile: "compiler:Languages\Greek.isl" Name: "hebrew"; MessagesFile: "compiler:Languages\Hebrew.isl" Name: "hungarian"; MessagesFile: "compiler:Languages\Hungarian.isl" Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl" Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl" Name: "nepali"; MessagesFile: "compiler:Languages\Nepali.islu" Name: "norwegian"; MessagesFile: "compiler:Languages\Norwegian.isl" Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl" Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl" Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl" Name: "serbiancyrillic"; MessagesFile: "compiler:Languages\SerbianCyrillic.isl" Name: "serbianlatin"; MessagesFile: "compiler:Languages\SerbianLatin.isl" Name: "slovenian"; MessagesFile: "compiler:Languages\Slovenian.isl" Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl" Name: "ukrainian"; MessagesFile: "compiler:Languages\Ukrainian.isl" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] Source: "doublecmd\doublecmd.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "doublecmd\doublecmd.zdli"; DestDir: "{app}"; Flags: ignoreversion Source: "doublecmd\doublecmd.xml"; DestDir: "{app}"; Flags: onlyifdoesntexist Source: "doublecmd\pixmaps.txt"; DestDir: "{app}"; Flags: onlyifdoesntexist Source: "doublecmd\multiarc.ini"; DestDir: "{app}"; Flags: onlyifdoesntexist Source: "doublecmd\doc\*"; DestDir: "{app}\doc"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "doublecmd\language\*"; DestDir: "{app}\language"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "doublecmd\pixmaps\*"; DestDir: "{app}\pixmaps"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "doublecmd\plugins\*"; DestDir: "{app}\plugins"; Flags: ignoreversion recursesubdirs createallsubdirs ; NOTE: Don't use "Flags: ignoreversion" on any shared system files Source: "doublecmd\*.dll"; DestDir: "{app}"; Flags: skipifsourcedoesntexist [Icons] Name: "{group}\Double Commander"; Filename: "{app}\doublecmd.exe" Name: "{group}\{cm:ProgramOnTheWeb,Double Commander}"; Filename: "http://doublecmd.sourceforge.net" Name: "{group}\{cm:UninstallProgram,Double Commander}"; Filename: "{uninstallexe}" Name: "{commondesktop}\Double Commander"; Filename: "{app}\doublecmd.exe"; Tasks: desktopicon Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\Double Commander"; Filename: "{app}\doublecmd.exe"; Tasks: quicklaunchicon [Run] Filename: "{app}\doublecmd.exe"; Description: "{cm:LaunchProgram,Double Commander}"; Flags: nowait postinstall skipifsilent doublecmd-0.5.8/install/windows/portable.diff0000644000175000017500000000020111442624410020277 0ustar alexxalexx4c4 < False --- > True doublecmd-0.5.8/install/windows/install-help.bat0000644000175000017500000000056412163642420020737 0ustar alexxalexxrem This script run from create_packages.bat rem If you run it direct, set up %BUILD_PACK_DIR% first set DC_HELP_INSTALL_DIR=%BUILD_PACK_DIR%\doublecmd\doc rem Clean help directory rm -rf %DC_HELP_INSTALL_DIR%\ rem Copy Russian help files xcopy /E doc\ru %DC_HELP_INSTALL_DIR%\ru\ rem Copy Ukrainian help files xcopy /E doc\uk_UA %DC_HELP_INSTALL_DIR%\uk_UA\doublecmd-0.5.8/install/windows/release/0000755000175000017500000000000012257501472017273 5ustar alexxalexxdoublecmd-0.5.8/install/windows/doublecmd.xml0000644000175000017500000000643411740774733020352 0ustar alexxalexx False Pascal sources *.pas;*.pp 32768 Pascal binaries *.ppu;*.o;*.dcu 16711680 zip %commander_path%\plugins\wcx\zip\zip.wcx 607 lzma %commander_path%\plugins\wcx\lzma\lzma.wcx 1 tar %commander_path%\plugins\wcx\zip\zip.wcx 95 bz2 %commander_path%\plugins\wcx\zip\zip.wcx 91 tbz %commander_path%\plugins\wcx\zip\zip.wcx 95 gz %commander_path%\plugins\wcx\zip\zip.wcx 91 tgz %commander_path%\plugins\wcx\zip\zip.wcx 95 cpio %commander_path%\plugins\wcx\cpio\cpio.wcx 0 deb %commander_path%\plugins\wcx\deb\deb.wcx 4 rpm %commander_path%\plugins\wcx\rpm\rpm.wcx 4 rar %commander_path%\plugins\wcx\unrar\unrar.wcx 68 rpm_wdx %commander_path%\plugins\wdx\rpm_wdx\rpm_wdx.wdx EXT="RPM" deb_wdx %commander_path%\plugins\wdx\deb_wdx\deb_wdx.wdx EXT="DEB" FTP %commander_path%\plugins\wfx\ftp\ftp.wfx doublecmd-0.5.8/install/windows/lib/0000755000175000017500000000000012257501472016421 5ustar alexxalexxdoublecmd-0.5.8/install/windows/lib/x86_64/0000755000175000017500000000000012257501472017357 5ustar alexxalexxdoublecmd-0.5.8/install/windows/lib/i386/0000755000175000017500000000000012257501472017112 5ustar alexxalexxdoublecmd-0.5.8/install/windows/lib/readme.txt0000644000175000017500000000021312014201074020375 0ustar alexxalexxBefore create packages (before run create_packages.bat) copy in this directory third-party libraries: - unrar.dll - needed for unrar plugindoublecmd-0.5.8/install/create_packages.sh0000755000175000017500000001015312255271322017615 0ustar alexxalexx#!/bin/sh # Set Double Commander version DC_VER=0.5.8 # The new package will be saved here PACK_DIR=$(pwd)/linux/release # Temp dir for creating *.tar.bz2 package BUILD_PACK_DIR=/var/tmp/doublecmd-$(date +%y.%m.%d) # Create temp dir for building BUILD_DC_TMP_DIR=/var/tmp/doublecmd-$DC_VER help() { echo 'Usage: create_packages.sh [options]' echo echo "Options:" echo '-A: All packages (by default)' echo '-D: Debian package' echo '-R: RPM package' echo '-S: Slackware package' echo '-P: Portable package' echo '-H: Help package' echo '--cpu=: Target CPU' echo '--ws=: Target widgetset' echo exit 1 } # Parse input parameters CKNAME=$(basename "$0") args=$(getopt -n $CKNAME -o ADRSPHh -l cpu:,ws:,help,default -- "$@") eval set -- $args while [ "$1" != "--" ]; do case "$1" in -h|--help) help;; -A) shift;CK_DEBIAN=1;CK_REDHAT=1;CK_SLACKWARE=1;CK_PORTABLE=1;CK_HELP=1;; -D) shift;CK_DEBIAN=1;; -R) shift;CK_REDHAT=1;; -S) shift;CK_SLACKWARE=1;; -P) shift;CK_PORTABLE=1;; -H) shift;CK_HELP=1;; --cpu) shift;export CPU_TARGET=$(eval echo $1);shift;; --ws) shift;export lcl=$(eval echo $1);shift;; esac done if [ -z "$CK_DEBIAN" ] && [ -z "$CK_REDHAT" ] && [ -z "$CK_SLACKWARE" ] && [ -z "$CK_PORTABLE" ] && [ -z "$CK_HELP" ]; then CK_DEBIAN=1 CK_REDHAT=1 CK_SLACKWARE=1 CK_PORTABLE=1 CK_HELP=1 fi # Export from SVN rm -rf $BUILD_DC_TMP_DIR svn export ../ $BUILD_DC_TMP_DIR # Save revision number mkdir $BUILD_DC_TMP_DIR/.svn cp -a ../.svn/entries $BUILD_DC_TMP_DIR/.svn/ # Copy package description file cp linux/description-pak $BUILD_DC_TMP_DIR/ # Set widgetset if [ -z $lcl ]; then export lcl=gtk2 fi # Set processor architecture if [ -z $CPU_TARGET ]; then export CPU_TARGET=$(fpc -iTP) fi # Debian package architecture if [ "$CPU_TARGET" = "x86_64" ] then export DEB_ARCH="amd64" else export DEB_ARCH=$CPU_TARGET fi # Copy libraries cp -a linux/lib/$CPU_TARGET/*.so* $BUILD_DC_TMP_DIR/ cp -a linux/lib/$CPU_TARGET/$lcl/*.so* $BUILD_DC_TMP_DIR/ cd $BUILD_DC_TMP_DIR # Build all components of Double Commander ./build.sh beta # Export variables for checkinstall export MAINTAINER="Alexander Koblov " if [ "$CK_REDHAT" ]; then # Create *.rpm package checkinstall -R --default --pkgname=doublecmd --pkgversion=$DC_VER --pkgarch=$CPU_TARGET --pkgrelease=1.$lcl --pkglicense=GPL --pkggroup=Applications/File --nodoc --pakdir=$PACK_DIR $BUILD_DC_TMP_DIR/install/linux/install.sh fi if [ "$CK_DEBIAN" ]; then # Create *.deb package checkinstall -D --default --pkgname=doublecmd --pkgversion=$DC_VER --pkgarch=$DEB_ARCH --pkgrelease=1.$lcl --pkglicense=GPL --pkggroup=contrib/misc --requires=libx11-6 --nodoc --pakdir=$PACK_DIR $BUILD_DC_TMP_DIR/install/linux/install.sh fi if [ "$CK_SLACKWARE" ]; then # Create *.tgz package checkinstall -S --default --pkgname=doublecmd --pkgversion=$DC_VER --pkgarch=$CPU_TARGET --pkgrelease=1.$lcl --pkglicense=GPL --pkggroup=Applications/File --nodoc --pakdir=$PACK_DIR $BUILD_DC_TMP_DIR/install/linux/install.sh fi if [ "$CK_PORTABLE" ]; then # Create *.tar.bz2 package mkdir -p $BUILD_PACK_DIR install/linux/install.sh --portable-prefix=$BUILD_PACK_DIR cp -r doc/en $BUILD_PACK_DIR/doublecmd/doc cd $BUILD_PACK_DIR sed -i -e 's/False/True/' doublecmd/doublecmd.xml tar -cJvf $PACK_DIR/doublecmd-$DC_VER.$lcl.$CPU_TARGET.tar.xz doublecmd fi if [ "$CK_HELP" ]; then # Create help packages cd $BUILD_DC_TMP_DIR # Copy help files install/linux/install-help.sh --portable-prefix=$BUILD_PACK_DIR # Create help package for each language cd $BUILD_PACK_DIR/doublecmd/doc for HELP_LANG in `ls` do cd $BUILD_PACK_DIR/doublecmd tar -cJvf $PACK_DIR/doublecmd-help-$HELP_LANG-$DC_VER.noarch.tar.xz doc/$HELP_LANG done fi # Clean DC build dir rm -rf $BUILD_DC_TMP_DIR rm -rf $BUILD_PACK_DIR doublecmd-0.5.8/install/linux/0000755000175000017500000000000012257501472015320 5ustar alexxalexxdoublecmd-0.5.8/install/linux/rpm/0000755000175000017500000000000012257501472016116 5ustar alexxalexxdoublecmd-0.5.8/install/linux/rpm/libunrar.spec0000644000175000017500000001203511671316551020612 0ustar alexxalexxName: libunrar Version: 4.0.7 Release: 1 Summary: Library for extract *.rar format archives Source: http://www.rarlab.com/rar/unrarsrc-%{version}.tar.gz Url: http://www.rarlab.com/rar_add.htm License: Freeware Group: System/Libraries BuildRequires: gcc-c++ BuildRoot: %{_tmppath}/%{name}-%{version}-root %description This library can be used by software developers to extract *.rar format archives. %prep %setup -q -n unrar %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %build make lib -f makefile.unix CXXFLAGS+="-fPIC -DSILENT" STRIP=true %install install -d -m 755 %{buildroot}/%{_libdir} install -m 644 libunrar.so %{buildroot}/%{_libdir} %clean [ %{buildroot} != "/" ] && ( rm -rf %{buildroot} ) %files %defattr(-,root,root) %doc license.txt readme.txt %{_libdir}/libunrar.so %changelog * Sun Jan 23 2011 Alexander Koblov - Initial release of library * Sat Jul 10 2010 Götz Waschk 3.93-1mdv2011.0 + Revision: 550262 - new version * Mon Dec 21 2009 Funda Wang 3.91-1mdv2010.1 + Revision: 480547 - new version 3.91 * Thu Aug 20 2009 Götz Waschk 3.90-2mdv2010.0 + Revision: 418576 - rebuild for broken build system * Thu Aug 20 2009 Götz Waschk 3.90-1mdv2010.0 + Revision: 418546 - new version * Mon Jul 13 2009 Götz Waschk 3.90-0.beta4.1mdv2010.0 + Revision: 395466 - new version * Sat Jun 20 2009 Götz Waschk 3.90-0.beta3.1mdv2010.0 + Revision: 387518 - new version * Mon Jun 08 2009 Götz Waschk 3.90-0.beta2.1mdv2010.0 + Revision: 383871 - new version * Thu May 07 2009 Götz Waschk 3.90-0.beta1.1mdv2010.0 + Revision: 372937 - new version * Tue Feb 03 2009 Guillaume Rousse 3.80-2mdv2009.1 + Revision: 337120 - keep bash completion in its own package * Wed Jan 07 2009 Götz Waschk 3.80-1mdv2009.1 + Revision: 326892 - new version * Sun Oct 12 2008 Funda Wang 3.80-0.beta4.1mdv2009.1 + Revision: 292676 - 3.8.4 - New version 3.8 beta3 * Wed Jun 25 2008 Funda Wang 3.80-0.beta2.1mdv2009.0 + Revision: 228841 - New version 3.80 beta 2 * Tue Jun 10 2008 Götz Waschk 3.80-0.beta1.1mdv2009.0 + Revision: 217391 - new version + Funda Wang - Revert to actual version of program - fix real version * Fri Feb 01 2008 Anssi Hannula 3.71-0.beta1.2mdv2008.1 + Revision: 161265 - move to Mandriva non-free from PLF (license is no longer unclear, it now allows redistribution explicitely) - drop pre-MDK10.0 support - fix license tag capitalization - import unrar * Wed Dec 12 2007 Gtz Waschk 3.71-0.beta1.1plf2008.1 - new version * Tue Nov 6 2007 Gtz Waschk 3.70-1plf2008.1 - new version * Mon Apr 16 2007 Gtz Waschk 3.70-0.beta7.1plf2007.1 - new version * Tue Mar 6 2007 Gtz Waschk 3.70-0.beta4.1plf2007.1 - new version * Tue Feb 6 2007 Gtz Waschk 3.70-0.beta3.1plf2007.1 - drop patch - new version * Wed Jan 24 2007 Gtz Waschk 3.70-0.beta1.1plf2007.1 - don't strip the binary at build stage - new version * Thu Nov 2 2006 Gtz Waschk 3.60-1plf2007.1 - update description - new version * Mon Jul 24 2006 Gtz Waschk 3.60-0.beta7.1plf2007.0 - new version * Wed Jun 28 2006 Gtz Waschk 3.60-0.beta5.1plf2007.0 - new version * Tue Oct 11 2005 Gtz Waschk 3.51-1plf - new version * Tue Aug 9 2005 Gtz Waschk 3.50-1plf - new version * Tue Apr 19 2005 Gtz Waschk 3.50-0.beta1.1plf - mkrel - new version * Mon Sep 20 2004 Gtz Waschk 3.40-1plf - fix description - new version * Sun Jun 6 2004 Gtz Waschk 3.30-2plf - rebuild for new g++ * Wed Apr 21 2004 Gtz Waschk 3.30-1plf - new version * Tue Dec 30 2003 Gtz Waschk 3.20-2plf - add unrar bash-completion for Cooker builds * Fri Jun 20 2003 Gtz Waschk 3.20-1plf - small build patch for gcc 3.3 - new version * Sun Mar 30 2003 Gtz Waschk 3.20-0.beta2.1plf - arrgh, the displayed version is 3.20 beta 2 * Sat Mar 29 2003 Gtz Waschk 3.2.0-0.beta2.1plf - new version * Fri Feb 14 2003 Gtz Waschk 3.10-2plf - use default optimization flags (Francisco Javier Felix) * Wed Jan 8 2003 Gtz Waschk 3.10-1plf * Tue Dec 3 2002 Gtz Waschk 3.10-0.beta3.1plf - 3.10 beta 3 * Tue Oct 22 2002 Gtz Waschk 3.10-0.beta1.1plf - fix url - add some docs - drop patch - quiet tar - set version to 3.10 beta 1, that's the output of the program - new version * Mon Aug 26 2002 Guillaume Rousse 3.0-1plf - first PLF release, with patch from Pascal Terjan doublecmd-0.5.8/install/linux/rpm/doublecmd-qt.spec0000644000175000017500000000263412255271322021353 0ustar alexxalexx# norootforbuild %define doublecmd doublecmd Name: doublecmd-qt Summary: Twin-panel (commander-style) file manager (Qt4) Version: 0.5.8 Release: 1 URL: http://doublecmd.sourceforge.net Source0: %{doublecmd}-%{version}.tar.gz License: GPL Group: Applications/File BuildRequires: fpc >= 2.6.0 fpc-src glib2-devel libQt4Pas5-devel >= 2.1 lazarus >= 1.0.0 %if 0%{?mandriva_version} BuildRequires: libncurses-devel libdbus-1-devel libbzip2-devel %endif %if 0%{?fedora_version} >= 11 BuildRequires: xorg-x11-devel ncurses-devel dbus-devel bzip2-devel %endif %if 0%{?suse_version} >= 1110 BuildRequires: ncurses-devel dbus-1-devel libbz2-devel %endif Provides: doublecmd Conflicts: doublecmd-gtk BuildRoot: %{_tmppath}/%{doublecmd}-%{version}-build %description Double Commander is a cross platform open source file manager with two panels side by side. It is inspired by Total Commander and features some new ideas. %prep %setup -q -n %{doublecmd}-%{version} %build ./build.sh beta qt %install install/linux/install.sh --install-prefix=%{buildroot} %clean [ %{buildroot} != "/" ] && ( rm -rf %{buildroot} ) %files %defattr(-,root,root) %{_libdir}/%{doublecmd} %{_bindir}/%{doublecmd} %{_datadir}/%{doublecmd} %{_datadir}/man/man1/%{doublecmd}.* %{_datadir}/pixmaps/%{doublecmd}.* %{_datadir}/applications/%{doublecmd}.desktop %changelog * Fri Jun 11 2010 - Alexander Koblov - Initial package, version 0.4.6 doublecmd-0.5.8/install/linux/rpm/doublecmd-help.spec0000644000175000017500000000411012255271322021646 0ustar alexxalexx# norootforbuild %define doublecmd_help doublecmd-help Name: doublecmd-help-en Summary: Documentation for the Double Commander (English) Version: 0.5.8 Release: 1 Url: http://doublecmd.sourceforge.net/ License: GPL-2+ Source0: %{doublecmd_help}-%{version}.tar.gz Group: Documentation Requires: doublecmd BuildArch: noarch %description This package contains the documentation files for the Double Commander designed for use with the external web browsers. This package contains the documentation for the DC in English. %package -n doublecmd-help-ru Summary: Documentation for the Double Commander (Russian) Group: Documentation Requires: doublecmd BuildArch: noarch %description -n doublecmd-help-ru This package contains the documentation files for the Double Commander designed for use with the external web browsers. This package contains the documentation for the DC in Russian. %package -n doublecmd-help-uk Summary: Documentation for the Double Commander (Ukrainian) Group: Documentation Requires: doublecmd BuildArch: noarch %description -n doublecmd-help-uk This package contains the documentation files for the Double Commander designed for use with the external web browsers. This package contains the documentation for the DC in Ukrainian. %prep %setup -q -n %{doublecmd_help}-%{version} %build %install install -d %{buildroot}/%{_datadir}/doublecmd/doc cp -r en %{buildroot}/%{_datadir}/doublecmd/doc cp -r ru %{buildroot}/%{_datadir}/doublecmd/doc cp -r uk_UA %{buildroot}/%{_datadir}/doublecmd/doc %clean [ %{buildroot} != "/" ] && ( rm -rf %{buildroot} ) %files %defattr(-,root,root) %dir %{_datadir}/doublecmd %dir %{_datadir}/doublecmd/doc %doc %{_datadir}/doublecmd/doc/en %files -n doublecmd-help-ru %defattr(-,root,root) %dir %{_datadir}/doublecmd %dir %{_datadir}/doublecmd/doc %doc %{_datadir}/doublecmd/doc/ru %files -n doublecmd-help-uk %defattr(-,root,root) %dir %{_datadir}/doublecmd %dir %{_datadir}/doublecmd/doc %doc %{_datadir}/doublecmd/doc/uk_UA %changelog * Fri Jan 21 2011 - Alexander Koblov - Initial package, version 0.4.6 doublecmd-0.5.8/install/linux/rpm/doublecmd-gtk.spec0000644000175000017500000000262212255271322021511 0ustar alexxalexx# norootforbuild %define doublecmd doublecmd Name: doublecmd-gtk Summary: Twin-panel (commander-style) file manager (GTK2) Version: 0.5.8 Release: 1 URL: http://doublecmd.sourceforge.net Source0: %{doublecmd}-%{version}.tar.gz License: GPL Group: Applications/File BuildRequires: fpc >= 2.6.0 fpc-src glib2-devel gtk2-devel lazarus >= 1.0.0 %if 0%{?mandriva_version} BuildRequires: libncurses-devel libdbus-1-devel libbzip2-devel %endif %if 0%{?fedora_version} >= 16 BuildRequires: xorg-x11-devel ncurses-devel dbus-devel bzip2-devel %endif %if 0%{?suse_version} >= 1110 BuildRequires: ncurses-devel dbus-1-devel libbz2-devel %endif Provides: doublecmd Conflicts: doublecmd-qt BuildRoot: %{_tmppath}/%{doublecmd}-%{version}-build %description Double Commander is a cross platform open source file manager with two panels side by side. It is inspired by Total Commander and features some new ideas. %prep %setup -q -n %{doublecmd}-%{version} %build ./build.sh beta gtk2 %install install/linux/install.sh --install-prefix=%{buildroot} %clean [ %{buildroot} != "/" ] && ( rm -rf %{buildroot} ) %files %defattr(-,root,root) %{_libdir}/%{doublecmd} %{_bindir}/%{doublecmd} %{_datadir}/%{doublecmd} %{_datadir}/man/man1/%{doublecmd}.* %{_datadir}/pixmaps/%{doublecmd}.* %{_datadir}/applications/%{doublecmd}.desktop %changelog * Fri Jun 11 2010 - Alexander Koblov - Initial package, version 0.4.6 doublecmd-0.5.8/install/linux/install.sh0000755000175000017500000001237611744550766017350 0ustar alexxalexx#!/bin/bash # Set processor architecture if [ -z $CPU_TARGET ]; then export CPU_TARGET=$(fpc -iTP) fi # Determine library directory if [ "$CPU_TARGET" = "x86_64" ] && [ ! -f "/etc/debian_version" ] then LIB_SUFFIX=64 else LIB_SUFFIX= fi # Parse input parameters CKNAME=$(basename "$0") args=$(getopt -n $CKNAME -o P:,I: -l portable-prefix:,install-prefix:,default -- "$@") eval set -- $args for A do case "$A" in --) DC_INSTALL_DIR=/usr/lib$LIB_SUFFIX/doublecmd ;; -P|--portable-prefix) shift CK_PORTABLE=1 DC_INSTALL_DIR=$(eval echo $1/doublecmd) break ;; -I|--install-prefix) shift DC_INSTALL_PREFIX=$(eval echo $1) DC_INSTALL_DIR=$DC_INSTALL_PREFIX/usr/lib$LIB_SUFFIX/doublecmd break ;; esac shift done mkdir -p $DC_INSTALL_DIR mkdir -p $DC_INSTALL_DIR/plugins # WCX plugins directories mkdir -p $DC_INSTALL_DIR/plugins/wcx mkdir -p $DC_INSTALL_DIR/plugins/wcx/cpio mkdir -p $DC_INSTALL_DIR/plugins/wcx/deb mkdir -p $DC_INSTALL_DIR/plugins/wcx/lzma mkdir -p $DC_INSTALL_DIR/plugins/wcx/rpm mkdir -p $DC_INSTALL_DIR/plugins/wcx/unrar mkdir -p $DC_INSTALL_DIR/plugins/wcx/zip # WDX plugins directories mkdir -p $DC_INSTALL_DIR/plugins/wdx mkdir -p $DC_INSTALL_DIR/plugins/wdx/scripts mkdir -p $DC_INSTALL_DIR/plugins/wdx/rpm_wdx mkdir -p $DC_INSTALL_DIR/plugins/wdx/deb_wdx # WFX plugins directories mkdir -p $DC_INSTALL_DIR/plugins/wfx mkdir -p $DC_INSTALL_DIR/plugins/wfx/ftp mkdir -p $DC_INSTALL_DIR/plugins/wfx/samba # WLX plugins directories mkdir -p $DC_INSTALL_DIR/plugins/wlx mkdir -p $DC_INSTALL_DIR/plugins/wlx/wlxmplayer # DSX plugins directories mkdir -p $DC_INSTALL_DIR/plugins/dsx mkdir -p $DC_INSTALL_DIR/plugins/dsx/dsxlocate # Copy files cp -a doublecmd $DC_INSTALL_DIR/ cp -a doublecmd.zdli $DC_INSTALL_DIR/ cp -a install/linux/doublecmd.xml $DC_INSTALL_DIR/ cp -a doublecmd.ext.example $DC_INSTALL_DIR/ cp -a pixmaps.txt $DC_INSTALL_DIR/ cp -a multiarc.ini $DC_INSTALL_DIR/ # copy plugins # WCX install -m 644 plugins/wcx/cpio/lib/cpio.wcx $DC_INSTALL_DIR/plugins/wcx/cpio/ install -m 644 plugins/wcx/deb/lib/deb.wcx $DC_INSTALL_DIR/plugins/wcx/deb/ install -m 644 plugins/wcx/lzma/lib/lzma.wcx $DC_INSTALL_DIR/plugins/wcx/lzma/ install -m 644 plugins/wcx/rpm/lib/rpm.wcx $DC_INSTALL_DIR/plugins/wcx/rpm/ install -m 644 plugins/wcx/unrar/lib/unrar.wcx $DC_INSTALL_DIR/plugins/wcx/unrar/ install -m 644 plugins/wcx/zip/lib/zip.wcx $DC_INSTALL_DIR/plugins/wcx/zip/ # WDX install -m 644 plugins/wdx/rpm_wdx/lib/rpm_wdx.wdx $DC_INSTALL_DIR/plugins/wdx/rpm_wdx/ install -m 644 plugins/wdx/deb_wdx/lib/deb_wdx.wdx $DC_INSTALL_DIR/plugins/wdx/deb_wdx/ install -m 644 plugins/wdx/scripts/* $DC_INSTALL_DIR/plugins/wdx/scripts/ # WFX install -m 644 plugins/wfx/ftp/lib/ftp.wfx $DC_INSTALL_DIR/plugins/wfx/ftp/ install -m 644 plugins/wfx/samba/lib/samba.wfx $DC_INSTALL_DIR/plugins/wfx/samba/ # WLX install -m 644 plugins/wlx/WlxMplayer/lib/wlxmplayer.wlx $DC_INSTALL_DIR/plugins/wlx/wlxmplayer/ # DSX install -m 644 plugins/dsx/DSXLocate/lib/dsxlocate.dsx $DC_INSTALL_DIR/plugins/dsx/dsxlocate/ if [ -z $CK_PORTABLE ] then # Copy libraries install -d $DC_INSTALL_PREFIX/usr/lib$LIB_SUFFIX install -m 644 *.so* $DC_INSTALL_PREFIX/usr/lib$LIB_SUFFIX # Create directory for platform independed files install -d $DC_INSTALL_PREFIX/usr/share/doublecmd # Copy man files install -d -m 755 $DC_INSTALL_PREFIX/usr/share/man/man1 install -c -m 644 install/linux/*.1 $DC_INSTALL_PREFIX/usr/share/man/man1 # Copy documentation install -d $DC_INSTALL_PREFIX/usr/share/doublecmd/doc install -m 644 doc/*.txt $DC_INSTALL_PREFIX/usr/share/doublecmd/doc ln -sf ../../share/doublecmd/doc $DC_INSTALL_DIR/doc # Copy languages cp -r language $DC_INSTALL_PREFIX/usr/share/doublecmd ln -sf ../../share/doublecmd/language $DC_INSTALL_DIR/language # Copy pixmaps cp -r pixmaps $DC_INSTALL_PREFIX/usr/share/doublecmd ln -sf ../../share/doublecmd/pixmaps $DC_INSTALL_DIR/pixmaps # Create symlink and desktop files install -d $DC_INSTALL_PREFIX/usr/bin install -d $DC_INSTALL_PREFIX/usr/share/pixmaps install -d $DC_INSTALL_PREFIX/usr/share/applications ln -sf ../lib$LIB_SUFFIX/doublecmd/doublecmd $DC_INSTALL_PREFIX/usr/bin/doublecmd install -m 644 doublecmd.png $DC_INSTALL_PREFIX/usr/share/pixmaps/doublecmd.png install -m 644 install/linux/doublecmd.xpm $DC_INSTALL_PREFIX/usr/share/pixmaps/doublecmd.xpm install -m 644 install/linux/doublecmd.desktop $DC_INSTALL_PREFIX/usr/share/applications/doublecmd.desktop else # Copy documentation mkdir -p $DC_INSTALL_DIR/doc cp -a doc/*.txt $DC_INSTALL_DIR/doc/ # Copy script for execute portable version cp -a doublecmd.sh $DC_INSTALL_DIR/ # Copy directories cp -r language $DC_INSTALL_DIR/ cp -r pixmaps $DC_INSTALL_DIR/ # Copy libraries install -m 644 *.so* $DC_INSTALL_DIR/ # Copy DC icon cp -a doublecmd.png $DC_INSTALL_DIR/doublecmd.png fi doublecmd-0.5.8/install/linux/doublecmd.xpm0000644000175000017500000002351112047725231020004 0ustar alexxalexx/* XPM */ static char * doublecmd_xpm[] = { "32 32 489 2", " c None", ". c #AF858D", "+ c #CA847C", "@ c #C67468", "# c #C57468", "$ c #C4746A", "% c #C2756C", "& c #C2746C", "* c #BF736C", "= c #BE716B", "- c #BC6F6A", "; c #BB6E69", "> c #B96D69", ", c #B86B68", "' c #B66A67", ") c #B56966", "! c #B36766", "~ c #B26665", "{ c #B16464", "] c #AE6264", "^ c #AC6162", "/ c #A95A5C", "( c #A7585B", "_ c #A6575A", ": c #A4565B", "< c #A55E65", "[ c #AB767F", "} c #9C8195", "| c #AE7D83", "1 c #F79573", "2 c #EF8667", "3 c #EC8667", "4 c #EA8466", "5 c #E88165", "6 c #E57F64", "7 c #E37D63", "8 c #E07C62", "9 c #DE7961", "0 c #DC7760", "a c #DA745F", "b c #D8745E", "c c #D6715D", "d c #D36E5C", "e c #D16D5B", "f c #CE6A5B", "g c #CD6959", "h c #CB6758", "i c #C96457", "j c #C56256", "k c #C46157", "l c #C15F55", "m c #BF5C53", "n c #BD5B53", "o c #BA5751", "p c #B7534E", "q c #AD6265", "r c #D27967", "s c #F28563", "t c #F08564", "u c #ED8565", "v c #E88266", "w c #E37D64", "x c #DE7A62", "y c #D8745F", "z c #D36F5D", "A c #CF6B5C", "B c #CD695A", "C c #C96558", "D c #C56356", "E c #BD5A52", "F c #BA554F", "G c #B7514B", "H c #B74F49", "I c #8D4655", "J c #E1E1E1", "K c #E3E1E1", "L c #E0DFDE", "M c #E1D2CD", "N c #E2BFB5", "O c #E4A693", "P c #E3866C", "Q c #E67D62", "R c #E37E64", "S c #C46056", "T c #C05B51", "U c #C1726B", "V c #CA9894", "W c #D2BAB8", "X c #DAD1D1", "Y c #DFDFDE", "Z c #E2E1E1", "` c #DBDBDB", " . c #E7E7E7", ".. c #E8E8E8", "+. c #E6EAEA", "@. c #D8A89B", "#. c #E27E64", "$. c #C4685E", "%. c #D3C2C0", "&. c #EBECEC", "*. c #E3E3E3", "=. c #E6E6E6", "-. c #E7E9E9", ";. c #E0D6D3", ">. c #D8836D", ",. c #C96053", "'. c #C9928B", "). c #E8E9E9", "!. c #E2E2E2", "~. c #E6E8E8", "{. c #E7E7E8", "]. c #E6E7E7", "^. c #E7E6E6", "/. c #DA8570", "(. c #DC7660", "_. c #CB9992", ":. c #E8EEEE", "<. c #E7E8E8", "[. c #D6CFD2", "}. c #E0C0B5", "|. c #DCC8C2", "1. c #DFE0E0", "2. c #E5E6E6", "3. c #E5E5E5", "4. c #DFDFDF", "5. c #D87762", "6. c #CD6859", "7. c #C98176", "8. c #E4E5E5", "9. c #E6E6E5", "0. c #E8E9EA", "a. c #D7D3D2", "b. c #CFB7B6", "c. c #CEB0B0", "d. c #D4D4D5", "e. c #F68D6A", "f. c #F18665", "g. c #ED8465", "h. c #E49780", "i. c #DDC4BD", "j. c #E5EAEB", "k. c #DABAB3", "l. c #DB745F", "m. c #C97062", "n. c #DFE1E2", "o. c #E4E5E6", "p. c #C99692", "q. c #B8625D", "r. c #B6514B", "s. c #B44F4A", "t. c #B85B59", "u. c #F5906D", "v. c #F08969", "w. c #EF8869", "x. c #EB8061", "y. c #DCB0A4", "z. c #E6E5E5", "A. c #E3E6E7", "B. c #D77B68", "C. c #CF6A5B", "D. c #D1ACA6", "E. c #E1DEDD", "F. c #BA665E", "G. c #BD5951", "H. c #BA5852", "I. c #B95752", "J. c #B6544F", "K. c #BA615E", "L. c #E87F63", "M. c #D6BDB5", "N. c #D4BAB5", "O. c #D8715B", "P. c #CF695A", "Q. c #DBD8D7", "R. c #C27B73", "S. c #E38167", "T. c #DEDCDB", "U. c #DDDDDD", "V. c #D57561", "W. c #D16C5A", "X. c #C87E73", "Y. c #E1E5E5", "Z. c #E3E4E4", "`. c #CEB6B4", " + c #C0594E", ".+ c #E58065", "++ c #D9C0BA", "@+ c #D9D9D9", "#+ c #D38271", "$+ c #D26B59", "%+ c #C69E98", "&+ c #DADCDD", "*+ c #D9DCDD", "=+ c #C26F65", "-+ c #C25E54", ";+ c #D6A99E", ">+ c #D2D3D3", ",+ c #D2D2D2", "'+ c #D2D2D1", ")+ c #D18879", "!+ c #D5705C", "~+ c #D26B58", "{+ c #D06351", "]+ c #C5B0AD", "^+ c #D2D3D4", "/+ c #CFCCCB", "(+ c #C15C51", "_+ c #C05A50", ":+ c #BE5B52", "<+ c #BB5A53", "[+ c #B65450", "}+ c #D6A194", "|+ c #CACCCC", "1+ c #CACACA", "2+ c #CB7867", "3+ c #CC5038", "4+ c #C84A32", "5+ c #C43F29", "6+ c #C5B3B0", "7+ c #CBCBCC", "8+ c #C9C2C1", "9+ c #B4382A", "0+ c #B13529", "a+ c #B0362C", "b+ c #AF3930", "c+ c #AF3D35", "d+ c #B0443D", "e+ c #B14844", "f+ c #B75C59", "g+ c #E77E61", "h+ c #E37253", "i+ c #D39D90", "j+ c #C5604B", "k+ c #C53B21", "l+ c #C2371D", "m+ c #BF2E15", "n+ c #C19D97", "o+ c #CBCDCD", "p+ c #AC2616", "q+ c #A92012", "r+ c #A71F13", "s+ c #A51E14", "t+ c #A21F16", "u+ c #A22019", "v+ c #A1231D", "w+ c #A83936", "x+ c #F08A6A", "y+ c #EE8768", "z+ c #EA7E5D", "A+ c #E6714E", "B+ c #E26441", "C+ c #DD5A37", "D+ c #D0B0A7", "E+ c #CCCCCC", "F+ c #CDCDCD", "G+ c #CDCCCC", "H+ c #C34E36", "I+ c #C33317", "J+ c #C02F15", "K+ c #BD2910", "L+ c #BC756A", "M+ c #CED1D2", "N+ c #CED3D3", "O+ c #AF4E44", "P+ c #A61507", "Q+ c #A41509", "R+ c #A01409", "S+ c #9E1209", "T+ c #9B110A", "U+ c #99100A", "V+ c #A02622", "W+ c #F58F6D", "X+ c #EF8463", "Y+ c #EB7450", "Z+ c #E76842", "`+ c #E35D36", " @ c #E0552E", ".@ c #DA5632", "+@ c #CCC9C8", "@@ c #C6C4C4", "#@ c #C5391C", "$@ c #C33215", "%@ c #C02F14", "&@ c #BD2A11", "*@ c #B83B27", "=@ c #CDD3D4", "-@ c #CDCDCE", ";@ c #C6BBBA", ">@ c #A41204", ",@ c #A21407", "'@ c #9F1106", ")@ c #9C0E05", "!@ c #990C04", "~@ c #960803", "{@ c #9C1D19", "]@ c #F3845F", "^@ c #ED7149", "/@ c #E9653C", "(@ c #E55B32", "_@ c #E2542B", ":@ c #DE4920", "<@ c #CEBAB5", "[@ c #CECFD0", "}@ c #CECECE", "|@ c #CFD2D2", "1@ c #C18F84", "2@ c #C73011", "3@ c #C33114", "4@ c #C02E13", "5@ c #BD2B11", "6@ c #B9260F", "7@ c #CBB9B6", "8@ c #CFCFD0", "9@ c #B46760", "0@ c #A21104", "a@ c #9F1005", "b@ c #9C0D03", "c@ c #990B03", "d@ c #950701", "e@ c #9B1A17", "f@ c #F2754B", "g@ c #EC663B", "h@ c #E85C31", "i@ c #E65327", "j@ c #DE5027", "k@ c #D1A396", "l@ c #D0D1D1", "m@ c #D0D0D0", "n@ c #C74022", "o@ c #C63415", "p@ c #BA2710", "q@ c #C37E73", "r@ c #D1D3D3", "s@ c #D1D6D7", "t@ c #B36159", "u@ c #9D0B00", "v@ c #9C0C02", "w@ c #950600", "x@ c #9B1A16", "y@ c #F16D42", "z@ c #EB6134", "A@ c #E85A2E", "B@ c #D47458", "C@ c #D1CFCE", "D@ c #D2D2D3", "E@ c #CA9184", "F@ c #C93617", "G@ c #C63416", "H@ c #BA2811", "I@ c #B4210A", "J@ c #D2CFCE", "K@ c #C6ACAA", "L@ c #9F251D", "M@ c #9A0F07", "N@ c #960903", "O@ c #9C1B18", "P@ c #D0CFD1", "Q@ c #D9C3BB", "R@ c #D4C2BD", "S@ c #D1CDCC", "T@ c #D3D7D8", "U@ c #D3D3D4", "V@ c #D3D3D3", "W@ c #D4D5D5", "X@ c #CCB6B1", "Y@ c #CB3A19", "Z@ c #B6240D", "`@ c #B63F2E", " # c #D5D4D3", ".# c #D3D3D2", "+# c #D5D8D8", "@# c #CEC2C2", "## c #CAB5B4", "$# c #CAB7B6", "%# c #D4D4D4", "&# c #D4D7D8", "*# c #D2BFBB", "=# c #CF401F", "-# c #CD3A19", ";# c #B6250F", "># c #B3200B", ",# c #B96256", "'# c #D5D4D4", ")# c #D5D5D5", "!# c #D6D6D7", "~# c #D1A99F", "{# c #D3401B", "]# c #D03D1A", "^# c #CD3A18", "/# c #B3220D", "(# c #B01F0B", "_# c #B03B2D", ":# c #D9D8D7", "<# c #D5D6D6", "[# c #D7D7D7", "}# c #D7D8D8", "|# c #D8DBDC", "1# c #D5DEE1", "2# c #D4BAB3", "3# c #D67358", "4# c #D64019", "5# c #B01F0C", "6# c #AB1A08", "7# c #A81D0F", "8# c #BC7770", "9# c #D4CECE", "0# c #DBE2E2", "a# c #D8DADA", "b# c #D8C9C5", "c# c #D7C5C0", "d# c #D6BEB7", "e# c #D79885", "f# c #DC5D39", "g# c #DF4218", "h# c #DA451E", "i# c #D6431D", "j# c #AC1C0A", "k# c #A9190A", "l# c #A51506", "m# c #A00C00", "n# c #AC4B43", "o# c #C19593", "p# c #CAB8B7", "q# c #CFBEBD", "r# c #D1C6C7", "s# c #D6D6D6", "t# c #D16B54", "u# c #EB5A2C", "v# c #E85427", "w# c #E44F22", "x# c #E14B22", "y# c #DE4921", "z# c #A51608", "A# c #A21306", "B# c #9F0F04", "C# c #9B0A01", "D# c #980A02", "E# c #9D130B", "F# c #753045", "G# c #B18B94", "H# c #C16352", "I# c #E8663E", "J# c #EB5D31", "K# c #E7582C", "L# c #E4542B", "M# c #E1512A", "N# c #DD4E28", "O# c #DA4B26", "P# c #D74824", "Q# c #D44523", "R# c #D04222", "S# c #CD4021", "T# c #CA3D1F", "U# c #C7391E", "V# c #C4361C", "W# c #C1331B", "X# c #BE311A", "Y# c #BB2E19", "Z# c #B72B17", "`# c #B32715", " $ c #B12514", ".$ c #AE2213", "+$ c #AB1F12", "@$ c #A81C10", "#$ c #921A19", "$$ c #7F3545", "%$ c #6C4562", "&$ c #734258", "*$ c #744359", "=$ c #754158", "-$ c #733F56", ";$ c #723E56", ">$ c #713E55", ",$ c #703D54", "'$ c #703C54", ")$ c #6E3B54", "!$ c #6E3B53", "~$ c #6D3A53", "{$ c #6B3853", "]$ c #6B3952", "^$ c #6A3852", "/$ c #6A3752", "($ c #693651", "_$ c #6A3853", ":$ c #623251", "<$ c #613251", "[$ c #613150", "}$ c #633553", "|$ c #917289", " ", " ", " . + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } ", " | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q ", " r s t u 4 v 6 w 8 x 0 a y c z e A B h C D k l m E F G H I ", " J K L M N O P Q R 8 x 0 a y c z e A B h C D S T U V W X Y Z ` ", " ..... . ...+.@.#.8 x 0 a y c z e A B h C D $.%.&... .......*.", " =. . . . . . .-.;.>.9 0 a y c z e A B h ,.'.K ). . . . . . .!.", " =.~.{.].=.=.=.=.^.K /.(.a y c z e A B h _.:.=.=.=.=.=. .<.<.!.", " [.}.|.1.].2.=.3.3.=.4.5.a y c z e A 6.7.8.9.3.3.3.=.0.a.b.c.d.", " e.f.g.h.i.j.3.=.3.].k.l.y c z e A m.n.=.=.=.=.o.p.q.r.s.t. ", " u.v.w.3 x.y.2.z.=.=.A.B.b c z e C.D.].3.=.3.E.F.G.H.I.J.K. ", " u.v.w.3 4 L.M.<.=.=.<.N.O.c z e P.Q.=.=.3.0.R.m n H.I.J.K. ", " u.v.w.3 4 v S.T.!.!.!.U.V.c z W.X.Y.!.!.Z.`. +m n H.I.J.K. ", " u.v.w.3 4 v .+++@+@+@+@+#+c z $+%+&+@+@+*+=+-+m n H.I.J.K. ", " u.v.w.3 4 v 6 ;+>+,+,+'+)+!+~+{+]+^+,+,+/+(+_+:+n <+I.[+K. ", " u.v.w.3 4 v .+}+|+1+1+1+2+3+4+5+6+7+1+1+8+9+0+a+b+c+d+e+f+ ", " u.v.w.3 4 g+h+i+|+1+1+1+j+k+l+m+n+o+1+1+|+p+q+r+s+t+u+v+w+ ", " u.x+y+z+A+B+C+D+E+F+F+G+H+I+J+K+L+M+F+F+N+O+P+Q+R+S+T+U+V+ ", " W+X+Y+Z+`+ @.@+@F+F+F+@@#@$@%@&@*@=@F+F+-@;@>@,@'@)@!@~@{@ ", " ]@^@/@(@_@:@<@[@}@}@|@1@2@3@4@5@6@7@}@}@}@8@9@0@a@b@c@d@e@ ", " f@g@h@i@j@k@l@m@m@m@F+n@o@3@4@5@p@q@r@m@m@m@s@t@u@v@c@w@x@ ", " y@z@A@B@C@,+,+,+,+D@E@F@G@3@4@5@H@I@J@,+,+,+,+>+K@L@M@N@O@ ", " P@Q@R@S@T@U@V@V@V@W@X@Y@F@G@3@4@5@H@Z@`@ #.#V@V@V@W@+#@###$#>+", " V@%#%#%#%#%#%#%#&#*#=#-#F@G@3@4@5@H@;#>#,#'#%#%#%#%#%#%#%#%#,+", " )#)#)#)#)#)#)#!#~#{#]#^#F@G@3@4@5@H@;#/#(#_#:#<#)#)#)#)#)#)#V@", " [#[#[#}#|#1#2#3#4#{#]#^#F@G@3@4@5@H@;#/#5#6#7#8#9#0#a#}#[#[#%#", " ` b#c#d#e#f#g#h#i#{#]#^#F@G@3@4@5@H@;#/#5#j#k#l#m#n#o#p#q#r#s#", " t#u#v#w#x#y#h#i#{#]#^#F@G@3@4@5@H@;#/#5#j#k#z#A#B#C#D#E#F# ", " G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#Z#`# $.$+$@$s+#$$$ ", " %$&$*$=$-$;$>$,$'$)$!$~$~${$]$^$/$($_$:$:$<$[$}$|$ ", " "}; doublecmd-0.5.8/install/linux/doublecmd.10000644000175000017500000000105211646573261017344 0ustar alexxalexx.TH "doublecmd" "1" "16 October 2011" "Double Commander" .SH "NAME" doublecmd \- Twin-panel (commander-style) file manager. .SH "SYNOPSIS" .B doublecmd .I "[options]" .SH "DESCRIPTION" Double Commander is a cross platform open source file manager with two panels side by side. It is inspired by Total Commander and features some new ideas. .SH "OPTIONS" .TP .BI " \-\-config\-dir=" config directory, where Double Commander stores its config files. Default is $HOME/.config/doublecmd. .SH "Websites" .IP .BR http://doublecmd.sourceforge.net doublecmd-0.5.8/install/linux/install-help.sh0000644000175000017500000000157412163642420020252 0ustar alexxalexx#!/bin/sh # Parse input parameters CKNAME=$(basename "$0") args=$(getopt -n $CKNAME -o P:,I: -l portable-prefix:,install-prefix:,default -- "$@") eval set -- $args for A do case "$A" in --) DC_HELP_INSTALL_DIR=/usr/share/doublecmd/doc ;; -P|--portable-prefix) shift DC_HELP_INSTALL_DIR=$(eval echo $1/doublecmd/doc) break ;; -I|--install-prefix) shift DC_INSTALL_PREFIX=$(eval echo $1) DC_HELP_INSTALL_DIR=$DC_INSTALL_PREFIX/usr/share/doublecmd/doc break ;; esac shift done # Clean help directory rm -rf $DC_HELP_INSTALL_DIR/* # Copy English help files cp -r doc/en $DC_HELP_INSTALL_DIR/ # Copy Russian help files cp -r doc/ru $DC_HELP_INSTALL_DIR/ # Copy Ukrainian help files cp -r doc/uk_UA $DC_HELP_INSTALL_DIR/doublecmd-0.5.8/install/linux/description-pak0000755000175000017500000000023410774773057020355 0ustar alexxalexxDouble Commander is a cross platform open source file manager with two panels side by side. It is inspired by Total Commander and features some new ideas. doublecmd-0.5.8/install/linux/release/0000755000175000017500000000000012257501472016740 5ustar alexxalexxdoublecmd-0.5.8/install/linux/doublecmd.xml0000644000175000017500000000757611740774733020027 0ustar alexxalexx False Pascal sources *.pas;*.pp 32768 Pascal binaries *.ppu;*.o;*.dcu 16711680 Specified Executables * 55758 -rwxrwxr*x Executables * 32768 -*x* zip %commander_path%/plugins/wcx/zip/zip.wcx 607 lzma %commander_path%/plugins/wcx/lzma/lzma.wcx 1 tar %commander_path%/plugins/wcx/zip/zip.wcx 95 bz2 %commander_path%/plugins/wcx/zip/zip.wcx 91 tbz %commander_path%/plugins/wcx/zip/zip.wcx 95 gz %commander_path%/plugins/wcx/zip/zip.wcx 91 tgz %commander_path%/plugins/wcx/zip/zip.wcx 95 cpio %commander_path%/plugins/wcx/cpio/cpio.wcx 0 deb %commander_path%/plugins/wcx/deb/deb.wcx 4 rpm %commander_path%/plugins/wcx/rpm/rpm.wcx 4 rar %commander_path%/plugins/wcx/unrar/unrar.wcx 68 rpm_wdx %commander_path%/plugins/wdx/rpm_wdx/rpm_wdx.wdx EXT="RPM" deb_wdx %commander_path%/plugins/wdx/deb_wdx/deb_wdx.wdx EXT="DEB" FTP %commander_path%/plugins/wfx/ftp/ftp.wfx wlxMplayer %commander_path%/plugins/wlx/WlxMplayer/wlxMplayer.wlx (EXT="MPG")|(EXT="AVI")|(EXT="MPEG")|(EXT="FLV") doublecmd-0.5.8/install/linux/doublecmd.desktop0000755000175000017500000000036412054356474020664 0ustar alexxalexx[Desktop Entry] Name=Double Commander Comment=Double Commander is a cross platform open source file manager with two panels side by side. Terminal=false Icon=doublecmd Exec=doublecmd Type=Application Categories=Application;Utility;FileManager; doublecmd-0.5.8/install/linux/deb/0000755000175000017500000000000012257501472016052 5ustar alexxalexxdoublecmd-0.5.8/install/linux/deb/doublecmd-help/0000755000175000017500000000000012257501472020736 5ustar alexxalexxdoublecmd-0.5.8/install/linux/deb/doublecmd-help/doublecmd-help-uk.doc-base0000644000175000017500000000053512163642420025634 0ustar alexxalexxDocument: doublecmd-help-uk Title: Documentation for the Double Commander (Ukrainian) Author: Rustem Rakhimov , Максим aka Ma$terok Abstract: This manual describes how to use Double Commander. Section: File Management Format: HTML Index: /usr/share/doublecmd/doc/uk_UA/index.html Files: /usr/share/doublecmd/doc/uk_UA/*.html doublecmd-0.5.8/install/linux/deb/doublecmd-help/compat0000644000175000017500000000000211516300753022130 0ustar alexxalexx5 doublecmd-0.5.8/install/linux/deb/doublecmd-help/control0000644000175000017500000000240411610363331022331 0ustar alexxalexxSource: doublecmd-help Section: doc Priority: optional Maintainer: Alexander Koblov Build-Depends: debhelper (>= 7.0.0) Standards-Version: 3.8.4 Homepage: http://doublecmd.sourceforge.net/ Package: doublecmd-help-en Architecture: all Depends: doublecmd-gtk | doublecmd-qt Suggests: www-browser Description: Documentation for the Double Commander (English) This package contains the documentation files for the Double Commander designed for use with the external web browsers. . This package contains the documentation for the DC in English. Package: doublecmd-help-ru Architecture: all Depends: doublecmd-gtk | doublecmd-qt Suggests: www-browser Description: Documentation for the Double Commander (Russian) This package contains the documentation files for the Double Commander designed for use with the external web browsers. . This package contains the documentation for the DC in Russian. Package: doublecmd-help-uk Architecture: all Depends: doublecmd-gtk | doublecmd-qt Suggests: www-browser Description: Documentation for the Double Commander (Ukrainian) This package contains the documentation files for the Double Commander designed for use with the external web browsers. . This package contains the documentation for the DC in Ukrainian. doublecmd-0.5.8/install/linux/deb/doublecmd-help/doublecmd-help-en.doc-base0000644000175000017500000000053511516546640025627 0ustar alexxalexxDocument: doublecmd-help-en Title: Documentation for the Double Commander (English) Author: Rustem Rakhimov , Rod J Abstract: This manual describes how to use Double Commander. Section: File Management Format: HTML Index: /usr/share/doublecmd/doc/en/index.html Files: /usr/share/doublecmd/doc/en/*.html doublecmd-0.5.8/install/linux/deb/doublecmd-help/copyright0000644000175000017500000000213611516300753022667 0ustar alexxalexxFormat-Specification: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=135 Name: Double Commander Source: http://doublecmd.sourceforge.net/ Maintainer: Alexander Koblov Copyright: © 2006-2010 Alexander Koblov License: GPL-2+ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. . This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with this package; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA . On Debian systems, the full text of the GNU General Public License version 2 can be found in the file `/usr/share/common-licenses/GPL-2'. doublecmd-0.5.8/install/linux/deb/doublecmd-help/rules0000755000175000017500000000335612163642420022020 0ustar alexxalexx#!/usr/bin/make -f # -*- makefile -*- # Sample debian/rules that uses debhelper. # GNU copyright 1997 to 1999 by Joey Hess. # Uncomment this to turn on verbose mode. export DH_VERBOSE=1 configure: configure-stamp configure-stamp: dh_testdir # Add here commands to configure the package. touch configure-stamp build: build-stamp build-stamp: configure-stamp dh_testdir # Add here commands to compile the package. touch build-stamp clean: dh_testdir dh_testroot # Add here commands to clean up after the build process. rm -f build-stamp configure-stamp dh_clean install: build dh_testdir dh_testroot dh_prep dh_installdirs -A usr/share/doublecmd/doc # Add here commands to install the package. cp -r en $(CURDIR)/debian/doublecmd-help-en/usr/share/doublecmd/doc cp -r ru $(CURDIR)/debian/doublecmd-help-ru/usr/share/doublecmd/doc cp -r uk_UA $(CURDIR)/debian/doublecmd-help-uk/usr/share/doublecmd/doc for pkg in `dh_listpackages` ; do \ find $(CURDIR)/debian/$$pkg/usr/share/ -type f | xargs chmod a-x ; \ done # Build architecture-dependent files here. binary-arch: build install # We have nothing to do by default. # Build architecture-independent files here. binary-indep: build install dh_testdir dh_testroot # dh_movefiles dh_installchangelogs dh_link dh_installdocs dh_installexamples dh_install # dh_installmenu # dh_installdebconf # dh_installlogrotate # dh_installemacsen # dh_installpam # dh_installmime # dh_installinit # dh_installcron # dh_installinfo dh_installman dh_strip dh_compress dh_fixperms # dh_perl # dh_python # dh_makeshlibs dh_installdeb dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install doublecmd-0.5.8/install/linux/deb/doublecmd-help/doublecmd-help-ru.doc-base0000644000175000017500000000047211516546640025653 0ustar alexxalexxDocument: doublecmd-help-ru Title: Documentation for the Double Commander (Russian) Author: Rustem Rakhimov Abstract: This manual describes how to use Double Commander. Section: File Management Format: HTML Index: /usr/share/doublecmd/doc/ru/index.html Files: /usr/share/doublecmd/doc/ru/*.html doublecmd-0.5.8/install/linux/deb/doublecmd-help/changelog0000644000175000017500000000024611516546200022605 0ustar alexxalexxdoublecmd-help (0.4.6-3256~ppa) lucid; urgency=low * Initial release (Closes: #2931241) -- Alexander Koblov Thu, 30 May 2010 21:04:07 -0500 doublecmd-0.5.8/install/linux/deb/doublecmd-help/source/0000755000175000017500000000000012257501472022236 5ustar alexxalexxdoublecmd-0.5.8/install/linux/deb/doublecmd-help/source/format0000644000175000017500000000001411644070300023432 0ustar alexxalexx3.0 (quilt) doublecmd-0.5.8/install/linux/deb/libunrar/0000755000175000017500000000000012257501472017670 5ustar alexxalexxdoublecmd-0.5.8/install/linux/deb/libunrar/compat0000644000175000017500000000000211516774223021071 0ustar alexxalexx7 doublecmd-0.5.8/install/linux/deb/libunrar/control0000644000175000017500000000072011516774223021275 0ustar alexxalexxSource: libunrar-nonfree Section: non-free/libs Priority: optional Maintainer: Alexander Koblov Build-Depends: debhelper (>= 7) Standards-Version: 3.8.4 XS-Autobuild: yes Package: libunrar Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Homepage: http://www.rarlabs.com/ Description: Library for extract *.rar format archives (non-free version) This library can be used by software developers to extract *.rar format archives. doublecmd-0.5.8/install/linux/deb/libunrar/shlibs0000644000175000017500000000001411517020145021061 0ustar alexxalexxlibunrar 0 doublecmd-0.5.8/install/linux/deb/libunrar/watch0000644000175000017500000000015511516774223020725 0ustar alexxalexxversion=3 http://www.rarlab.com/rar_add.htm http://www.rarlab.com/rar/unrarsrc-(.*)\.tar\.gz debian uupdate doublecmd-0.5.8/install/linux/deb/libunrar/copyright0000644000175000017500000000460211516774223021630 0ustar alexxalexxThis package was debianized by Petr Cech on Thu, 16 Mar 2000 18:51:33 +0100. Further modifications have been made by Chris Anderson on Wed Aug 25 19:03:47 EDT 2004 It was downloaded from http://www.rarlabs.com/rar_add.htm Copyright: Copyright (c) 1993-2005 Alexander L. Roshal NOTE: this software is non-free, therefore carefully read this license before doing anything with it. In particular, this source code may not be used for recreating the rar compression algorithm. Full license follows: ****** ***** ****** UnRAR - free utility for RAR archives ** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ****** ******* ****** License for use and distribution of ** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ** ** ** ** ** ** FREE portable version ~~~~~~~~~~~~~~~~~~~~~ The source code of UnRAR utility is freeware. This means: 1. All copyrights to RAR and the utility UnRAR are exclusively owned by the author - Alexander Roshal. 2. The UnRAR sources may be used in any software to handle RAR archives without limitations free of charge, but cannot be used to re-create the RAR compression algorithm, which is proprietary. Distribution of modified UnRAR sources in separate form or as a part of other software is permitted, provided that it is clearly stated in the documentation and source comments that the code may not be used to develop a RAR (WinRAR) compatible archiver. 3. The UnRAR utility may be freely distributed. It is allowed to distribute UnRAR inside of other software packages. 4. THE RAR ARCHIVER AND THE UnRAR UTILITY ARE DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. YOU USE AT YOUR OWN RISK. THE AUTHOR WILL NOT BE LIABLE FOR DATA LOSS, DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS SOFTWARE. 5. Installing and using the UnRAR utility signifies acceptance of these terms and conditions of the license. 6. If you don't agree with terms of the license you must remove UnRAR files from your storage devices and cease to use the utility. Thank you for your interest in RAR and UnRAR. Alexander L. Roshal This package is auto-buildable doublecmd-0.5.8/install/linux/deb/libunrar/lintian/0000755000175000017500000000000012257501472021326 5ustar alexxalexxdoublecmd-0.5.8/install/linux/deb/libunrar/lintian/libunrar0000644000175000017500000000005411517020145023055 0ustar alexxalexxlibunrar: package-name-doesnt-match-sonames doublecmd-0.5.8/install/linux/deb/libunrar/postinst0000755000175000017500000000007611556027124021502 0ustar alexxalexx#!/bin/sh set -e ldconfig /usr/lib/libunrar.so #DEBHELPER# doublecmd-0.5.8/install/linux/deb/libunrar/rules0000755000175000017500000000203711517020145020741 0ustar alexxalexx#!/usr/bin/make -f # Made with the aid of dh_make, by Petr Cech. # Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. # Some lines taken from debmake, by Christoph Lameter. build: dh_testdir make lib -f makefile.unix CXXFLAGS+="-fPIC -DSILENT" LDFLAGS+="-Wl,-soname,libunrar.so.0" clean: dh_testdir dh_testroot make -f makefile.unix clean rm -f libunrar.so dh_clean # Build architecture-independent files here. binary-indep: build # We have nothing to do by default. # Build architecture-dependent files here. binary-arch: build dh_testdir dh_testroot dh_prep dh_installdirs install -o root -g root -s -m 0644 libunrar.so debian/libunrar/usr/lib install -m 0644 debian/lintian/libunrar debian/libunrar/usr/share/lintian/overrides dh_link usr/lib/libunrar.so usr/lib/libunrar.so.0 dh_installdocs dh_installchangelogs dh_strip dh_compress dh_fixperms dh_installdeb dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary doublecmd-0.5.8/install/linux/deb/libunrar/changelog0000644000175000017500000000023711617473424021550 0ustar alexxalexxlibunrar-nonfree (4.0.7-0~lucid) lucid; urgency=low * Initial release of library -- Alexander Koblov Sun, 23 Jan 2011 21:04:07 -0500 doublecmd-0.5.8/install/linux/deb/libunrar/postrm0000755000175000017500000000013711556027124021141 0ustar alexxalexx#!/bin/sh set -e if [ "$1" = "remove" ]; then ldconfig /usr/lib/libunrar.so fi #DEBHELPER# doublecmd-0.5.8/install/linux/deb/libunrar/source/0000755000175000017500000000000012257501472021170 5ustar alexxalexxdoublecmd-0.5.8/install/linux/deb/libunrar/source/format0000644000175000017500000000001411516774223022401 0ustar alexxalexx3.0 (quilt) doublecmd-0.5.8/install/linux/deb/libunrar/dirs0000644000175000017500000000004411517020145020541 0ustar alexxalexxusr/lib usr/share/lintian/overrides doublecmd-0.5.8/install/linux/deb/doublecmd/0000755000175000017500000000000012257501472020010 5ustar alexxalexxdoublecmd-0.5.8/install/linux/deb/doublecmd/compat0000644000175000017500000000000211671316551021207 0ustar alexxalexx7 doublecmd-0.5.8/install/linux/deb/doublecmd/control0000644000175000017500000000270112134754107021412 0ustar alexxalexxSource: doublecmd Section: contrib/misc Priority: extra Maintainer: Alexander Koblov Build-Depends: libbz2-dev, libdbus-1-dev, libglib2.0-dev, libgtk2.0-dev, debhelper (>= 5), libqt4pas-dev (>= 2.1), fpc (>= 2.6.0), fp-utils (>= 2.6.0), lcl (>= 1.0.1), lcl-qt4 (>= 1.0.1), lcl-gtk2 (>= 1.0.1), lcl-units (>= 1.0.1), lcl-utils (>= 1.0.1), lazarus-src (>= 1.0.1) Standards-Version: 3.9.3 Homepage: http://doublecmd.sourceforge.net/ Package: doublecmd-gtk Architecture: i386 amd64 Depends: ${shlibs:Depends}, ${misc:Depends} Provides: doublecmd Conflicts: doublecmd Replaces: doublecmd Suggests: www-browser, libunrar Description: twin-panel (commander-style) file manager (GTK2) Double Commander is a cross platform open source file manager with two panels side by side. It is inspired by Total Commander and features some new ideas. Package: doublecmd-qt Architecture: i386 amd64 Depends: ${shlibs:Depends}, ${misc:Depends} Provides: doublecmd Conflicts: doublecmd Replaces: doublecmd Suggests: www-browser, libunrar Description: twin-panel (commander-style) file manager (Qt4) Double Commander is a cross platform open source file manager with two panels side by side. It is inspired by Total Commander and features some new ideas. doublecmd-0.5.8/install/linux/deb/doublecmd/doublecmd-gtk.menu0000644000175000017500000000026111675341527023424 0ustar alexxalexx?package(doublecmd-gtk):needs="X11"\ section="Applications/File Management"\ icon="/usr/share/pixmaps/doublecmd.xpm"\ title="Double Commander"\ command="/usr/bin/doublecmd" doublecmd-0.5.8/install/linux/deb/doublecmd/copyright0000644000175000017500000000410011671316551021737 0ustar alexxalexxFormat-Specification: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=135 Name: Double Commander Source: http://doublecmd.sourceforge.net/ Maintainer: Alexander Koblov Copyright: 2006-2011, Alexander Koblov 2009-2011, Przemyslaw Nagay License: GPL-2+ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. . This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with this package; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA . On Debian systems, the full text of the GNU General Public License version 2 can be found in the file `/usr/share/common-licenses/GPL-2'. Files: libraries/src/libmime/* Copyright: 2007, Houng Jen Yee License: GPL-2+ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. . This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with this package; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA . On Debian systems, the full text of the GNU General Public License version 2 can be found in the file `/usr/share/common-licenses/GPL-2'.doublecmd-0.5.8/install/linux/deb/doublecmd/lintian/0000755000175000017500000000000012257501472021446 5ustar alexxalexxdoublecmd-0.5.8/install/linux/deb/doublecmd/lintian/doublecmd-qt0000644000175000017500000000026611671316551023756 0ustar alexxalexxdoublecmd-qt: shlib-with-non-pic-code doublecmd-qt: shlib-with-executable-stack doublecmd-qt: library-not-linked-against-libc doublecmd-qt: shared-lib-without-dependency-information doublecmd-0.5.8/install/linux/deb/doublecmd/lintian/doublecmd-gtk0000644000175000017500000000027211671316551024114 0ustar alexxalexxdoublecmd-gtk: shlib-with-non-pic-code doublecmd-gtk: shlib-with-executable-stack doublecmd-gtk: library-not-linked-against-libc doublecmd-gtk: shared-lib-without-dependency-information doublecmd-0.5.8/install/linux/deb/doublecmd/rules0000755000175000017500000000433011673534134021072 0ustar alexxalexx#!/usr/bin/make -f # -*- makefile -*- # As a special exception, when this file is copied by dh-make into a # dh-make output file, you may use that output file without restriction. # This special exception was added by Craig Small in version 0.37 of dh-make. # Uncomment this to turn on verbose mode. # export DH_VERBOSE=1 configure: configure-stamp configure-stamp: dh_testdir cd language ;\ if [ -f doublecmd.pb.po ] ; then mv doublecmd.pb.po doublecmd.pt_BR.po; fi ;\ if [ -f doublecmd.po ] ; then mv doublecmd.po doublecmd.en.po; fi ;\ if [ -f doublecmd.zh.po ] ; then mv doublecmd.zh.po doublecmd.zh_TW.po; fi touch configure-stamp build: build-arch build-indep build-arch: build-stamp build-indep: build-stamp build-stamp: configure-stamp dh_testdir # Build GTK2 version ./build.sh beta gtk2 ./install/linux/install.sh --install-prefix=$(CURDIR)/debian/doublecmd-gtk ./clean.sh # Build Qt4 version ./build.sh beta qt ./install/linux/install.sh --install-prefix=$(CURDIR)/debian/doublecmd-qt ./clean.sh touch $@ clean: dh_testdir dh_testroot rm -f build-stamp configure-stamp ./clean.sh cd language ;\ if [ -f doublecmd.pt_BR.po ] ; then mv doublecmd.pt_BR.po doublecmd.pb.po; fi ;\ if [ -f doublecmd.en.po ] ; then mv doublecmd.en.po doublecmd.po; fi ;\ if [ -f doublecmd.zh_TW.po ] ; then mv doublecmd.zh_TW.po doublecmd.zh.po; fi dh_clean install: build dh_testdir dh_testroot # Build architecture-independent files here. binary-indep: build install # Build architecture-dependent files here. binary-arch: build install dh_testdir dh_testroot dh_installmenu dh_installchangelogs -a dh_installdocs -a for pkg in `dh_listpackages` ; do \ install -d $(CURDIR)/debian/$$pkg/usr/share/lintian/overrides ; \ install -m 644 $(CURDIR)/debian/lintian/$$pkg $(CURDIR)/debian/$$pkg/usr/share/lintian/overrides ; \ rm -f $(CURDIR)/debian/$$pkg/usr/share/doublecmd/doc/COPYING*.txt ; \ find $(CURDIR)/debian/$$pkg/usr/share/ -type f | xargs chmod a-x ; \ done dh_strip dh_compress -a dh_fixperms -a dh_installdeb -a dh_shlibdeps -a dh_gencontrol -a dh_md5sums -a dh_builddeb -a binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install configure doublecmd-0.5.8/install/linux/deb/doublecmd/changelog0000644000175000017500000000023511704326263021661 0ustar alexxalexxdoublecmd (0.5.3-1) unstable; urgency=low * Initial release (Closes: #2931241) -- Alexander Koblov Wed, 14 Jan 2012 20:06:04 +0400 doublecmd-0.5.8/install/linux/deb/doublecmd/source/0000755000175000017500000000000012257501472021310 5ustar alexxalexxdoublecmd-0.5.8/install/linux/deb/doublecmd/source/format0000644000175000017500000000001411671316551022517 0ustar alexxalexx3.0 (quilt) doublecmd-0.5.8/install/linux/deb/doublecmd/doublecmd-qt.menu0000644000175000017500000000026011675341527023262 0ustar alexxalexx?package(doublecmd-qt):needs="X11"\ section="Applications/File Management"\ icon="/usr/share/pixmaps/doublecmd.xpm"\ title="Double Commander"\ command="/usr/bin/doublecmd" doublecmd-0.5.8/install/linux/lib/0000755000175000017500000000000012257501472016066 5ustar alexxalexxdoublecmd-0.5.8/install/linux/lib/x86_64/0000755000175000017500000000000012257501472017024 5ustar alexxalexxdoublecmd-0.5.8/install/linux/lib/x86_64/qt/0000755000175000017500000000000012257501472017450 5ustar alexxalexxdoublecmd-0.5.8/install/linux/lib/i386/0000755000175000017500000000000012257501472016557 5ustar alexxalexxdoublecmd-0.5.8/install/linux/lib/i386/qt/0000755000175000017500000000000012257501472017203 5ustar alexxalexxdoublecmd-0.5.8/install/linux/lib/readme.txt0000644000175000017500000000031112014201074020041 0ustar alexxalexxBefore create packages (before run create_packages.sh) copy in this directory third-party libraries: - libunrar.so - needed for unrar plugin - libqt4intf.so - needed for qt4 version of Double Commanderdoublecmd-0.5.8/install/linux/update-repo-obs.sh0000755000175000017500000001003212255271322020655 0ustar alexxalexx#!/bin/bash # This script updates Double Commander Open Build Service (OBS) repository # Set Double Commander version DC_VER=0.5.8 # Temp directory DC_TEMP_DIR=/var/tmp/doublecmd-$(date +%y.%m.%d) # Directory for DC source code DC_SOURCE_DIR=$DC_TEMP_DIR/doublecmd-$DC_VER # Directory for DC help DC_HELP_DIR=$DC_TEMP_DIR/doublecmd-help-$DC_VER # Directory for the openSUSE Build Service (OBS) DC_OBS_DIR=$HOME/.obs # OBS project home directory DC_OBS_WEB_DIR=home:Alexx2000 # OBS project directory DC_OBS_PRJ_DIR=$DC_OBS_DIR/$DC_OBS_WEB_DIR # DC revision number DC_REVISION=$(svnversion ../../ | sed -e 's/\([0-9]*\).*/\1/') # Recreate temp directory rm -rf $DC_TEMP_DIR mkdir -p $DC_TEMP_DIR update_revision() { # Update dcrevision.inc echo "// Created by Svn2RevisionInc" > $DC_SOURCE_DIR/src/dcrevision.inc echo "const dcRevision = '$DC_REVISION';" >> $DC_SOURCE_DIR/src/dcrevision.inc } update_doublecmd() { # Export from SVN svn export ../../ $DC_SOURCE_DIR # Save revision number update_revision # Remove help files rm -rf $DC_SOURCE_DIR/doc/en rm -rf $DC_SOURCE_DIR/doc/ru rm -rf $DC_SOURCE_DIR/doc/uk_UA # Prepare doublecmd-*.spec file cp -a rpm/doublecmd-*.spec $DC_TEMP_DIR # Create archive with source code pushd $DC_TEMP_DIR tar -cvzf doublecmd-$DC_VER.tar.gz doublecmd-$DC_VER if [ ! -d "$DC_OBS_DIR" ] then mkdir -p $DC_OBS_DIR cd $DC_OBS_DIR osc checkout $DC_OBS_WEB_DIR else pushd $DC_OBS_PRJ_DIR/doublecmd-gtk osc up popd pushd $DC_OBS_PRJ_DIR/doublecmd-qt osc up popd fi # Upload GTK2 archive to OBS rm -f $DC_OBS_PRJ_DIR/doublecmd-gtk/doublecmd-gtk.spec rm -f $DC_OBS_PRJ_DIR/doublecmd-gtk/doublecmd-$DC_VER.tar.gz mv doublecmd-gtk.spec $DC_OBS_PRJ_DIR/doublecmd-gtk/ cp -a doublecmd-$DC_VER.tar.gz $DC_OBS_PRJ_DIR/doublecmd-gtk/ pushd $DC_OBS_PRJ_DIR/doublecmd-gtk osc commit doublecmd-gtk.spec doublecmd-$DC_VER.tar.gz -m "Update to revision $DC_REVISION" popd # Upload Qt4 archive to OBS rm -f $DC_OBS_PRJ_DIR/doublecmd-qt/doublecmd-qt.spec rm -f $DC_OBS_PRJ_DIR/doublecmd-qt/doublecmd-$DC_VER.tar.gz mv doublecmd-qt.spec $DC_OBS_PRJ_DIR/doublecmd-qt/ cp -a doublecmd-$DC_VER.tar.gz $DC_OBS_PRJ_DIR/doublecmd-qt/ pushd $DC_OBS_PRJ_DIR/doublecmd-qt osc commit doublecmd-qt.spec doublecmd-$DC_VER.tar.gz -m "Update to revision $DC_REVISION" popd popd } update_doublecmd_svn() { trap "stty echo; echo; exit" INT TERM EXIT read -s -p "Enter password: " PASSWORD; echo echo "Update Double Commander (Qt)" curl -u Alexx2000:$PASSWORD -X POST https://api.opensuse.org/source/home:Alexx2000:doublecmd-svn/doublecmd-qt?cmd=runservice echo "Update Double Commander (Gtk)" curl -u Alexx2000:$PASSWORD -X POST https://api.opensuse.org/source/home:Alexx2000:doublecmd-svn/doublecmd-gtk?cmd=runservice exit 0 } update_doublecmd_help() { # Export from SVN svn export ../../doc $DC_HELP_DIR # Remove text files rm -f $DC_HELP_DIR/*.txt # Prepare doublecmd-help.spec file cp -a rpm/doublecmd-help.spec $DC_TEMP_DIR # Create archive with source code pushd $DC_TEMP_DIR tar -cvzf doublecmd-help-$DC_VER.tar.gz doublecmd-help-$DC_VER if [ ! -d "$DC_OBS_DIR" ] then mkdir -p $DC_OBS_DIR cd $DC_OBS_DIR osc checkout $DC_OBS_WEB_DIR else pushd $DC_OBS_PRJ_DIR/doublecmd-help osc up popd fi # Upload archive to OBS rm -f $DC_OBS_PRJ_DIR/doublecmd-help/doublecmd-help.spec rm -f $DC_OBS_PRJ_DIR/doublecmd-help/doublecmd-help-$DC_VER.tar.gz mv doublecmd-help.spec $DC_OBS_PRJ_DIR/doublecmd-help/ mv doublecmd-help-$DC_VER.tar.gz $DC_OBS_PRJ_DIR/doublecmd-help/ cd $DC_OBS_PRJ_DIR/doublecmd-help osc commit doublecmd-help.spec doublecmd-help-$DC_VER.tar.gz -m "Update to revision $DC_REVISION" popd } update_all() { update_doublecmd update_doublecmd_help } case $1 in doublecmd-help) update_doublecmd_help;; doublecmd-svn) update_doublecmd_svn;; doublecmd) update_doublecmd;; *) update_all;; esac # Clean rm -rf $DC_TEMP_DIR doublecmd-0.5.8/install/linux/update-repo-ppa.sh0000755000175000017500000000736612255271322020672 0ustar alexxalexx#!/bin/bash # This script updates Double Commander Personal Package Archive (PPA) repository # Set Double Commander version DC_VER=0.5.8 # Set Ubuntu series DISTRO=( precise quantal raring saucy ) # Temp directory DC_TEMP_DIR=/var/tmp/doublecmd-$(date +%y.%m.%d) # Directory for DC source code DC_SOURCE_DIR=$DC_TEMP_DIR/doublecmd-$DC_VER # Directory for DC help DC_HELP_DIR=$DC_TEMP_DIR/doublecmd-help-$DC_VER # DC revision number DC_REVISION=$(svnversion ../../ | sed -e 's/\([0-9]*\).*/\1/') # Recreate temp directory rm -rf $DC_TEMP_DIR mkdir -p $DC_TEMP_DIR update_revision() { # Update dcrevision.inc echo "// Created by Svn2RevisionInc" > $DC_SOURCE_DIR/src/dcrevision.inc echo "const dcRevision = '$DC_REVISION';" >> $DC_SOURCE_DIR/src/dcrevision.inc } update_doublecmd() { # Export from SVN svn export ../../ $DC_SOURCE_DIR # Save revision number update_revision # Remove help files rm -rf $DC_SOURCE_DIR/doc/en rm -rf $DC_SOURCE_DIR/doc/ru rm -rf $DC_SOURCE_DIR/doc/uk_UA # Create doublecmd-x.x.x.orig.tar.gz pushd $DC_SOURCE_DIR/.. tar -cvzf $DC_TEMP_DIR/doublecmd_$DC_VER.orig.tar.gz doublecmd-$DC_VER popd # Prepare debian directory mkdir -p $DC_SOURCE_DIR/debian cp -r $DC_SOURCE_DIR/install/linux/deb/doublecmd/* $DC_SOURCE_DIR/debian # Create source package for each distro for DIST in "${DISTRO[@]}" do # Update changelog file pushd $DC_SOURCE_DIR/debian dch -m -D $DIST -v $DC_VER-0+svn$DC_REVISION~$DIST "Update to revision $DC_REVISION" popd # Create archive with source code pushd $DC_SOURCE_DIR if [ $DIST = ${DISTRO[0]} ] then debuild -S -sa else debuild -S -sd fi popd done } update_doublecmd_svn() { # Export from SVN svn export ../../ $DC_SOURCE_DIR # Save revision number update_revision # Remove help files rm -rf $DC_SOURCE_DIR/doc/en rm -rf $DC_SOURCE_DIR/doc/ru rm -rf $DC_SOURCE_DIR/doc/uk_UA # Prepare debian directory mkdir -p $DC_SOURCE_DIR/debian cp -r $DC_SOURCE_DIR/install/linux/deb/doublecmd/* $DC_SOURCE_DIR/debian echo '1.0' > $DC_SOURCE_DIR/debian/source/format # Create source package for each distro for DIST in "${DISTRO[@]}" do # Update changelog file pushd $DC_SOURCE_DIR/debian dch -m -D $DIST -v $DC_VER-0+svn$DC_REVISION~$DIST "Update to revision $DC_REVISION" popd # Create archive with source code pushd $DC_SOURCE_DIR debuild -S -sa popd done # Upload archives to PPA cd $DC_TEMP_DIR dput -U ppa:alexx2000/doublecmd-svn $(ls -xrt --file-type *.changes) # Clean rm -rf $DC_TEMP_DIR # Exit exit 0 } update_doublecmd_help() { # Export from SVN svn export ../../doc $DC_HELP_DIR # Remove text files rm -f $DC_HELP_DIR/*.txt # Create doublecmd-help-x.x.x.orig.tar.gz pushd $DC_HELP_DIR/.. tar -cvzf $DC_TEMP_DIR/doublecmd-help_$DC_VER.orig.tar.gz doublecmd-help-$DC_VER popd # Prepare debian directory svn export deb/doublecmd-help $DC_HELP_DIR/debian # Create source package for each distro for DIST in "${DISTRO[@]}" do # Update changelog file pushd $DC_HELP_DIR/debian dch -m -D $DIST -v $DC_VER-$DC_REVISION~$DIST "Update to revision $DC_REVISION" popd # Create archive with source code pushd $DC_HELP_DIR if [ $DIST = ${DISTRO[0]} ] then debuild -S -sa else debuild -S -sd fi popd done } update_all() { update_doublecmd update_doublecmd_help } case $1 in doublecmd-help) update_doublecmd_help;; doublecmd-svn) update_doublecmd_svn;; doublecmd) update_doublecmd;; *) update_all;; esac # Upload archives to PPA cd $DC_TEMP_DIR dput -U ppa:alexx2000/doublecmd $(ls -xrt --file-type *.changes) # Clean rm -rf $DC_TEMP_DIR doublecmd-0.5.8/install/darwin/0000755000175000017500000000000012257501472015445 5ustar alexxalexxdoublecmd-0.5.8/install/darwin/install.sh0000755000175000017500000000455512163512735017463 0ustar alexxalexx#!/bin/bash # Set processor architecture if [ -z $CPU_TARGET ]; then export CPU_TARGET=$(fpc -iTP) fi export DC_APP_DIR=$1/doublecmd.app export DC_INSTALL_DIR=$DC_APP_DIR/Contents/MacOS mkdir -p $DC_INSTALL_DIR mkdir -p $DC_INSTALL_DIR/plugins # WCX plugins directories mkdir -p $DC_INSTALL_DIR/plugins/wcx mkdir -p $DC_INSTALL_DIR/plugins/wcx/cpio mkdir -p $DC_INSTALL_DIR/plugins/wcx/deb mkdir -p $DC_INSTALL_DIR/plugins/wcx/lzma mkdir -p $DC_INSTALL_DIR/plugins/wcx/rpm mkdir -p $DC_INSTALL_DIR/plugins/wcx/unrar mkdir -p $DC_INSTALL_DIR/plugins/wcx/zip # WDX plugins directories mkdir -p $DC_INSTALL_DIR/plugins/wdx mkdir -p $DC_INSTALL_DIR/plugins/wdx/scripts mkdir -p $DC_INSTALL_DIR/plugins/wdx/rpm_wdx mkdir -p $DC_INSTALL_DIR/plugins/wdx/deb_wdx # WFX plugins directories mkdir -p $DC_INSTALL_DIR/plugins/wfx mkdir -p $DC_INSTALL_DIR/plugins/wfx/ftp # Copy files cp -r doublecmd.app/* $DC_APP_DIR/ cp -a doublecmd $DC_INSTALL_DIR/ cp -a doublecmd.zdli $DC_INSTALL_DIR/ cp -a install/darwin/doublecmd.xml $DC_INSTALL_DIR/ cp -a doublecmd.ext.example $DC_INSTALL_DIR/ cp -a pixmaps.txt $DC_INSTALL_DIR/ cp -a multiarc.ini $DC_INSTALL_DIR/ # Copy plugins # WCX install -m 644 plugins/wcx/cpio/lib/cpio.wcx $DC_INSTALL_DIR/plugins/wcx/cpio/ install -m 644 plugins/wcx/deb/lib/deb.wcx $DC_INSTALL_DIR/plugins/wcx/deb/ install -m 644 plugins/wcx/lzma/lib/lzma.wcx $DC_INSTALL_DIR/plugins/wcx/lzma/ install -m 644 plugins/wcx/rpm/lib/rpm.wcx $DC_INSTALL_DIR/plugins/wcx/rpm/ install -m 644 plugins/wcx/unrar/lib/unrar.wcx $DC_INSTALL_DIR/plugins/wcx/unrar/ install -m 644 plugins/wcx/zip/lib/zip.wcx $DC_INSTALL_DIR/plugins/wcx/zip/ # WDX install -m 644 plugins/wdx/rpm_wdx/lib/rpm_wdx.wdx $DC_INSTALL_DIR/plugins/wdx/rpm_wdx/ install -m 644 plugins/wdx/deb_wdx/lib/deb_wdx.wdx $DC_INSTALL_DIR/plugins/wdx/deb_wdx/ install -m 644 plugins/wdx/scripts/* $DC_INSTALL_DIR/plugins/wdx/scripts/ # WFX install -m 644 plugins/wfx/ftp/lib/ftp.wfx $DC_INSTALL_DIR/plugins/wfx/ftp/ # Copy documentation mkdir -p $DC_INSTALL_DIR/doc cp -r doc/en $DC_INSTALL_DIR/doc/ cp -a doc/*.txt $DC_INSTALL_DIR/doc/ # Copy directories cp -r language $DC_INSTALL_DIR/ cp -r pixmaps $DC_INSTALL_DIR/ # Copy libraries cp -a *.dylib $DC_INSTALL_DIR/ doublecmd-0.5.8/install/darwin/release/0000755000175000017500000000000012257501472017065 5ustar alexxalexxdoublecmd-0.5.8/install/darwin/doublecmd.xml0000644000175000017500000000747511771672066020152 0ustar alexxalexx False False True Pascal sources *.pas;*.pp 32768 Pascal binaries *.ppu;*.o;*.dcu 16711680 Specified Executables * 55758 -rwxrwxr*x Executables * 32768 -*x* 32 True zip %commander_path%/plugins/wcx/zip/zip.wcx 607 lzma %commander_path%/plugins/wcx/lzma/lzma.wcx 1 tar %commander_path%/plugins/wcx/zip/zip.wcx 95 bz2 %commander_path%/plugins/wcx/zip/zip.wcx 91 tbz %commander_path%/plugins/wcx/zip/zip.wcx 95 gz %commander_path%/plugins/wcx/zip/zip.wcx 91 tgz %commander_path%/plugins/wcx/zip/zip.wcx 95 cpio %commander_path%/plugins/wcx/cpio/cpio.wcx 0 deb %commander_path%/plugins/wcx/deb/deb.wcx 4 rpm %commander_path%/plugins/wcx/rpm/rpm.wcx 4 rar %commander_path%/plugins/wcx/unrar/unrar.wcx 68 rpm_wdx %commander_path%/plugins/wdx/rpm_wdx/rpm_wdx.wdx EXT="RPM" deb_wdx %commander_path%/plugins/wdx/deb_wdx/deb_wdx.wdx EXT="DEB" FTP %commander_path%/plugins/wfx/ftp/ftp.wfx doublecmd-0.5.8/install/darwin/make-unrar.sh0000755000175000017500000000135012217353547020051 0ustar alexxalexx#!/bin/sh # Show help if [ -z $1 ]; then echo echo "Script for build unrar library" echo echo "Syntax:" echo echo "make-unrar.sh " echo exit 0 fi # Save destination directory DEST_DIR=$(pwd)/lib # Set minimal Mac OS X target version export MACOSX_DEPLOYMENT_TARGET=10.5 # Go to unrar source directory cd $1 # Build 32 bit library rm -f $DEST_DIR/i386/libunrar.dylib make clean lib CXXFLAGS+="-fPIC -DSILENT -m32" LDFLAGS+="-dylib -arch i386" STRIP=true mv libunrar.so $DEST_DIR/i386/libunrar.dylib # Build 64 bit library rm -f $DEST_DIR/x86_64/libunrar.dylib make clean lib CXXFLAGS+="-fPIC -DSILENT -m64" LDFLAGS+="-dylib -arch x86_64" STRIP=true mv libunrar.so $DEST_DIR/x86_64/libunrar.dylib doublecmd-0.5.8/install/darwin/lib/0000755000175000017500000000000012257501472016213 5ustar alexxalexxdoublecmd-0.5.8/install/darwin/lib/x86_64/0000755000175000017500000000000012257501472017151 5ustar alexxalexxdoublecmd-0.5.8/install/darwin/lib/i386/0000755000175000017500000000000012257501472016704 5ustar alexxalexxdoublecmd-0.5.8/install/darwin/lib/readme.txt0000644000175000017500000000022012014201074020165 0ustar alexxalexxBefore create packages (before run create_packages.mac) copy in this directory third-party libraries: - libunrar.dylib - needed for unrar plugindoublecmd-0.5.8/install/create_packages.bat0000644000175000017500000000413512255271322017751 0ustar alexxalexx rem Set Double Commander version set DC_VER=0.5.8 rem Path to subversion set SVN_EXE="c:\Program Files\SlikSvn\bin\svn.exe" rem Path to Inno Setup compiler set ISCC_EXE="c:\Program Files\Inno Setup 5\ISCC.exe" rem The new package will be created from here set BUILD_PACK_DIR=%TEMP%\doublecmd-%DATE: =% rem The new package will be saved here set PACK_DIR=%CD%\windows\release rem Create temp dir for building set BUILD_DC_TMP_DIR=%TEMP%\doublecmd-%DC_VER% rm -rf %BUILD_DC_TMP_DIR% %SVN_EXE% export ..\ %BUILD_DC_TMP_DIR% rem Save revision number mkdir %BUILD_DC_TMP_DIR%\.svn copy ..\.svn\entries %BUILD_DC_TMP_DIR%\.svn\ rem Prepare package build dir rm -rf %BUILD_PACK_DIR% mkdir %BUILD_PACK_DIR% mkdir %BUILD_PACK_DIR%\release rem Copy needed files copy windows\doublecmd.iss %BUILD_PACK_DIR%\ copy windows\portable.diff %BUILD_PACK_DIR%\ rem Get processor architecture if "%CPU_TARGET%" == "" ( if "%PROCESSOR_ARCHITECTURE%" == "x86" ( set CPU_TARGET=i386 set OS_TARGET=win32 ) else if "%PROCESSOR_ARCHITECTURE%" == "AMD64" ( set CPU_TARGET=x86_64 set OS_TARGET=win64 ) ) rem Copy libraries copy windows\lib\%CPU_TARGET%\*.dll %BUILD_DC_TMP_DIR%\ cd /D %BUILD_DC_TMP_DIR% rem Build all components of Double Commander call build.bat beta rem Prepare install files call %BUILD_DC_TMP_DIR%\install\windows\install.bat cd /D %BUILD_PACK_DIR% rem Create *.exe package %ISCC_EXE% /F"doublecmd-%DC_VER%.%CPU_TARGET%-%OS_TARGET%" doublecmd.iss rem Move created package move release\*.exe %PACK_DIR% rem Create *.zip package patch doublecmd/doublecmd.xml portable.diff zip -9 -Dr %PACK_DIR%\doublecmd-%DC_VER%.%CPU_TARGET%-%OS_TARGET%.zip doublecmd rem Create help packages cd /D %BUILD_DC_TMP_DIR% rem Copy help files call %BUILD_DC_TMP_DIR%\install\windows\install-help.bat rem Create help package for each language cd %BUILD_PACK_DIR%\doublecmd for /D %%f in (doc\*) do zip -9 -Dr %PACK_DIR%\doublecmd-help-%%~nf-%DC_VER%.noarch.zip %%f rem Clean temp directories cd \ rm -rf %BUILD_DC_TMP_DIR% rm -rf %BUILD_PACK_DIR% doublecmd-0.5.8/install/create_packages.mac0000755000175000017500000000346512255271322017753 0ustar alexxalexx#!/bin/sh # Set Double Commander version DC_VER=0.5.8 # The new package will be saved here PACK_DIR=$(pwd)/darwin/release # Temp dir for creating *.dmg package BUILD_PACK_DIR=/var/tmp/doublecmd-$(date +%y.%m.%d) # Create temp dir for building BUILD_DC_TMP_DIR=/var/tmp/doublecmd-$DC_VER # DC revision number DC_REVISION=$(svnversion ../ | sed -e 's/\([0-9]*\).*/\1/') # Export from SVN rm -rf $BUILD_DC_TMP_DIR svn export ../ $BUILD_DC_TMP_DIR # Save revision number mkdir $BUILD_DC_TMP_DIR/.svn cp -a ../.svn/entries $BUILD_DC_TMP_DIR/.svn/ # Set processor architecture if [ -z $CPU_TARGET ]; then export CPU_TARGET=$(fpc -iTP) fi # Set widgetset if [ -z $lcl ]; then # Use Qt4 when build 64 bit if [ "$CPU_TARGET" = "x86_64" ] then export lcl=qt else export lcl=carbon fi fi # Set minimal Mac OS X target version export MACOSX_DEPLOYMENT_TARGET=10.5 # Copy libraries cp -a darwin/lib/$CPU_TARGET/*.dylib $BUILD_DC_TMP_DIR/ cp -a darwin/lib/$CPU_TARGET/$lcl/*.dylib $BUILD_DC_TMP_DIR/ cd $BUILD_DC_TMP_DIR # Build all components of Double Commander ./build.sh beta # Update application bundle version defaults write $(pwd)/doublecmd.app/Contents/Info CFBundleVersion $DC_REVISION defaults write $(pwd)/doublecmd.app/Contents/Info CFBundleShortVersionString $DC_VER plutil -convert xml1 $(pwd)/doublecmd.app/Contents/Info.plist # Create *.dmg package mkdir -p $BUILD_PACK_DIR install/darwin/install.sh $BUILD_PACK_DIR cd $BUILD_PACK_DIR if [ "$lcl" = "qt" ]; then macdeployqt doublecmd.app fi mv doublecmd.app 'Double Commander.app' hdiutil create -anyowners -volname "Double Commander" -imagekey zlib-level=9 -format UDZO -srcfolder 'Double Commander.app' $PACK_DIR/doublecmd-$DC_VER-$DC_REVISION.$lcl.$CPU_TARGET.dmg # Clean DC build dir rm -rf $BUILD_DC_TMP_DIR rm -rf $BUILD_PACK_DIR doublecmd-0.5.8/language/0000755000175000017500000000000012257501472014276 5ustar alexxalexxdoublecmd-0.5.8/language/doublecmd.ru.po0000644000175000017500000066700112250633131017222 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.5 alpha\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2013-06-19 23:58+0400\n" "Last-Translator: Alexander Koblov \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Russian\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "Все" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "Все" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "Все" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "Все" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "Все" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "Все" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "Все" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "Отмена" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "" #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "Настройка набора колонок" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "Фон &1" #: tfcolumnssetconf.cbcursorborder.caption msgid "Cursor border" msgstr "Рамка вокруг курсора" #: tfcolumnssetconf.cbovercolor.caption msgid "Allow Overcolor" msgstr "Раскраска файлов (вкл/откл)" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "Использовать шрифт и цвета" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "&Текст:" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "Шрифт:" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "Размер:" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "Фон &2" #: tfcolumnssetconf.lblconfigviewnr.caption msgid "Configure view nr:" msgstr "Настройка набора номер:" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "&Курсор" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "Текст &под курсором" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "&Выделение" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "Имя:" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "Добавить колонку" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "Настроить колонку: " #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "Предварительный просмотр" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "Выбрать шаблон..." #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption msgid "C&heck free space" msgstr "Проверять свобо&дное место" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption msgid "Cop&y attributes" msgstr "&Копировать атрибуты" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption msgid "Copy o&wnership" msgstr "К&опировать владельца" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption msgid "Copy d&ate/time" msgstr "Копировать дат&у/время" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption msgid "Correct lin&ks" msgstr "Исп&равлять ссылки" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "С&бросить флаг \"Только для чтения\"" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption msgid "E&xclude empty directories" msgstr "&Исключить пустые каталоги" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption msgid "Fo&llow links" msgstr "С&ледовать ссылкам" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "Р&езервировать место" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "Что делать, когда не удается установить время файла, его атрибуты и т.д." #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "Использовать шаблон" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption msgid "When dir&ectory exists" msgstr "Если к&аталог существует" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "Если &файл существует" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption msgid "When ca&nnot set property" msgstr "Если &нельзя устан. свойство" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "<нет шаблона>" #: tfrmabout.btnclose.caption msgctxt "TFRMABOUT.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Закрыть" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "Копировать" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "О программе..." #: tfrmabout.lblbuild.caption msgid "Build" msgstr "Сборка" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "Free Pascal" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "Домашняя страница:" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "http://doublecmd.sourceforge.net" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "Lazarus" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "Ревизия" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption msgid "Version" msgstr "Версия" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "&Сбросить" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "Выбрать атрибуты" #: tfrmattributesedit.cbarchive.caption msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "&Архивный" #: tfrmattributesedit.cbcompressed.caption msgid "Co&mpressed" msgstr "С&жатый" #: tfrmattributesedit.cbdirectory.caption msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "&Каталог" #: tfrmattributesedit.cbencrypted.caption msgid "&Encrypted" msgstr "&Зашифрованный" #: tfrmattributesedit.cbhidden.caption msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "Ск&рытый" #: tfrmattributesedit.cbreadonly.caption msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "&Только для чтения" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "" #: tfrmattributesedit.cbsparse.caption msgid "S&parse" msgstr "Разрежённ&ый" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Закре&пляющий бит" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "" #: tfrmattributesedit.cbsymlink.caption msgid "&Symlink" msgstr "Ссы&лка" #: tfrmattributesedit.cbsystem.caption msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "С&истемный" #: tfrmattributesedit.cbtemporary.caption msgid "&Temporary" msgstr "Временны&й" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "Атрибуты NTFS" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "Основные атрибуты" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Биты:" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Группа" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Другие" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Владелец" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "Выполнение" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "Чтение" #: tfrmattributesedit.lbltextattrs.caption msgid "As te&xt:" msgstr "Как т&екст:" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "Запись" #: tfrmchecksumcalc.btncancel.caption msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmchecksumcalc.caption msgctxt "tfrmchecksumcalc.caption" msgid "Calculate check sum..." msgstr "Посчитать контрольные суммы..." #: tfrmchecksumcalc.cbseparatefile.caption msgid "C&reate separate checksum file for each file" msgstr "Д&ля каждого файла создать отдельный файл контрольной суммы" #: tfrmchecksumcalc.lblsaveto.caption msgid "&Save check sum file(s) to:" msgstr "&Сохранить файл(ы) контрольных сумм как:" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Закрыть" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "Проверить контрольные суммы..." #: tfrmconnectionmanager.btnadd.caption msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "&Добавить" #: tfrmconnectionmanager.btncancel.caption msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmconnectionmanager.btnconnect.caption msgid "C&onnect" msgstr "Со&единиться" #: tfrmconnectionmanager.btndelete.caption msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "&Удалить" #: tfrmconnectionmanager.btnedit.caption msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "&Редактировать" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "Сетевые соединения" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "Соединиться с:" #: tfrmcopydlg.btnaddtoqueue.caption msgid "A&dd To Queue" msgstr "&В очередь" #: tfrmcopydlg.btncancel.caption msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "tfrmcopydlg.btncreatespecialqueue.caption" msgid "..." msgstr "..." #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "О&пции" #: tfrmcopydlg.btnsaveoptions.caption msgid "Sa&ve these options as default" msgstr "Со&хранить по умолчанию" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "Копировать файл(ы)" #: tfrmdescredit.btncancel.caption msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "Комментарий к файлу/папке" #: tfrmdescredit.lbleditcommentfor.caption msgid "E&dit comment for:" msgstr "&Правка комментария к:" #: tfrmdescredit.lblencoding.caption msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "&Кодировка:" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "О программе" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "Автоматическое сравнение" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "Бинарный режим" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "Отмена" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "Отмена" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "Копировать блок направо" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "Копировать блок направо" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "Копировать блок налево" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "Копировать блок налево" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "&Копировать" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "В&ырезать" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Удалить" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "&Вставить" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Повторить" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "Выделить все" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Отменить" #: tfrmdiffer.actexit.caption msgctxt "tfrmdiffer.actexit.caption" msgid "E&xit" msgstr "Выход" #: tfrmdiffer.actfirstdifference.caption msgctxt "tfrmdiffer.actfirstdifference.caption" msgid "First Difference" msgstr "Первое отличие" #: tfrmdiffer.actfirstdifference.hint msgctxt "tfrmdiffer.actfirstdifference.hint" msgid "First Difference" msgstr "Первое отличие" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "Не учитывать регистр" #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "Не учитывать пробелы" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "Одновременная прокрутка" #: tfrmdiffer.actlastdifference.caption msgctxt "tfrmdiffer.actlastdifference.caption" msgid "Last Difference" msgstr "Последнее отличие" #: tfrmdiffer.actlastdifference.hint msgctxt "tfrmdiffer.actlastdifference.hint" msgid "Last Difference" msgstr "Последнее отличие" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "Разница строк" #: tfrmdiffer.actnextdifference.caption msgctxt "tfrmdiffer.actnextdifference.caption" msgid "Next Difference" msgstr "Следующее отличие" #: tfrmdiffer.actnextdifference.hint msgctxt "tfrmdiffer.actnextdifference.hint" msgid "Next Difference" msgstr "Следующее отличие" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "Открыть слева..." #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "Открыть справа..." #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "Подсвечивать фон" #: tfrmdiffer.actprevdifference.caption msgctxt "tfrmdiffer.actprevdifference.caption" msgid "Previous Difference" msgstr "Предыдущее отличие" #: tfrmdiffer.actprevdifference.hint msgctxt "tfrmdiffer.actprevdifference.hint" msgid "Previous Difference" msgstr "Предыдущее отличие" #: tfrmdiffer.actreload.caption msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "П&ерезагрузить" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "Перезагрузить" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "Сохранить" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "Сохранить" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "Сохранить как..." #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "Сохранить как..." #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "Сохранить слева" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "Сохранить слева" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "Сохранить слева как..." #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "Сохранить слева как..." #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "Сохранить справа" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "Сохранить справа" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "Сохранить справа как..." #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "Сохранить справа как..." #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "Сравнить" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "Сравнить" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "Кодировка" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "Кодировка" #: tfrmdiffer.caption msgctxt "TFRMDIFFER.CAPTION" msgid "Compare files" msgstr "Сравнить файлы" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.miencodingleft.caption msgid "&Left" msgstr "С&лева" #: tfrmdiffer.miencodingright.caption msgid "&Right" msgstr "С&права" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "Действия" #: tfrmdiffer.mnuedit.caption msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "&Правка" #: tfrmdiffer.mnuencoding.caption msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "&Кодировка" #: tfrmdiffer.mnufile.caption msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "&Файл" #: tfrmdiffer.mnuoptions.caption msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "&Настройка" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "Добавить новое сочетание клавиш к последовательности" #: tfrmedithotkey.btncancel.caption msgctxt "TFRMEDITHOTKEY.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmedithotkey.btnok.caption msgctxt "TFRMEDITHOTKEY.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "Удалить последнее сочетание клавиш из последовательности" #: tfrmedithotkey.cghkcontrols.caption msgctxt "tfrmedithotkey.cghkcontrols.caption" msgid "Only for these controls" msgstr "Только для этих элементов" #: tfrmedithotkey.lblparameters.caption msgid "&Parameters (each in a separate line):" msgstr "&Только для этих элементов" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "Сочетание клавиш:" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "О программе..." #: tfrmeditor.actabout.hint msgctxt "tfrmeditor.actabout.hint" msgid "About" msgstr "О программе..." #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "&Настройка" #: tfrmeditor.actconfhigh.hint msgctxt "tfrmeditor.actconfhigh.hint" msgid "Configuration" msgstr "Конфигурация" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "&Копировать" #: tfrmeditor.acteditcopy.hint msgctxt "tfrmeditor.acteditcopy.hint" msgid "Copy" msgstr "Копировать" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "&Вырезать" #: tfrmeditor.acteditcut.hint msgctxt "tfrmeditor.acteditcut.hint" msgid "Cut" msgstr "Вырезать" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "&Удалить" #: tfrmeditor.acteditdelete.hint msgctxt "tfrmeditor.acteditdelete.hint" msgid "Delete" msgstr "Удалить" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "&Найти..." #: tfrmeditor.acteditfind.hint msgctxt "tfrmeditor.acteditfind.hint" msgid "Find" msgstr "Найти" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "Найти далее" #: tfrmeditor.acteditfindnext.hint msgctxt "tfrmeditor.acteditfindnext.hint" msgid "Find next" msgstr "Найти далее" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "Mac (CR)" #: tfrmeditor.acteditlineendcr.hint msgctxt "tfrmeditor.acteditlineendcr.hint" msgid "Mac (CR)" msgstr "Mac (CR)" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "Windows (CRLF)" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "tfrmeditor.acteditlineendcrlf.hint" msgid "Windows (CRLF)" msgstr "Windows (CRLF)" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "Unix (LF)" #: tfrmeditor.acteditlineendlf.hint msgctxt "tfrmeditor.acteditlineendlf.hint" msgid "Unix (LF)" msgstr "Unix (LF)" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Вст&авить" #: tfrmeditor.acteditpaste.hint msgctxt "tfrmeditor.acteditpaste.hint" msgid "Paste" msgstr "Вставить" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "&Повторить" #: tfrmeditor.acteditredo.hint msgctxt "tfrmeditor.acteditredo.hint" msgid "Redo" msgstr "Повторить" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "&Заменить..." #: tfrmeditor.acteditrplc.hint msgctxt "tfrmeditor.acteditrplc.hint" msgid "Replace" msgstr "Заменить" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "В&ыделить всё" #: tfrmeditor.acteditselectall.hint msgctxt "tfrmeditor.acteditselectall.hint" msgid "Select All" msgstr "Выделить всё" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "&Отменить" #: tfrmeditor.acteditundo.hint msgctxt "tfrmeditor.acteditundo.hint" msgid "Undo" msgstr "Отменить" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "&Закрыть" #: tfrmeditor.actfileclose.hint msgctxt "tfrmeditor.actfileclose.hint" msgid "Close" msgstr "Закрыть" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "В&ыход" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "Выход" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "&Создать" #: tfrmeditor.actfilenew.hint msgctxt "tfrmeditor.actfilenew.hint" msgid "New" msgstr "Создать" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "&Открыть" #: tfrmeditor.actfileopen.hint msgctxt "tfrmeditor.actfileopen.hint" msgid "Open" msgstr "Открыть" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "Со&хранить" #: tfrmeditor.actfilesave.hint msgctxt "tfrmeditor.actfilesave.hint" msgid "Save" msgstr "Сохранить" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "Сохранить &как..." #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "Сохранить как..." #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "Сохранить &все" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "Сохранить все" #: tfrmeditor.caption msgctxt "tfrmeditor.caption" msgid "Editor" msgstr "Редактор" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "Помощ&ь" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Правка" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "&Кодировка" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "Открыть как" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "Сохранить как" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "&Файл" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "Подсветка &синтаксиса" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "Конец строки" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "" #: tfrmeditor.n5.caption msgctxt "TFRMEDITOR.N5.CAPTION" msgid "-" msgstr "" #: tfrmeditsearchreplace.btncancel.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "&Учитывать регистр" #: tfrmeditsearchreplace.cbsearchfromcursor.caption #| msgid "Search &from caret" msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "Искать от &курсора" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "&Регулярные выражения" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "В в&ыделенном тексте" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "Только слово &целиком" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "Опции" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "&Заменить:" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "Н&айти:" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "Направление" #: tfrmextractdlg.btncancel.caption #| msgid "Cancel" msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmextractdlg.btnhelp.caption #| msgid "Help" msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Помощ&ь" #: tfrmextractdlg.btnok.caption #| msgid "OK" msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmextractdlg.caption msgctxt "TFRMEXTRACTDLG.CAPTION" msgid "Unpack files" msgstr "Распаковать файлы" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "&Учитывать подкаталоги" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "Распаковать каждый &архив в отдельный каталог (с именем архива)" #: tfrmextractdlg.cboverwrite.caption #| msgid "&Overwrite existing files" msgid "O&verwrite existing files" msgstr "&Заменять существующие файлы" #: tfrmextractdlg.lblextractto.caption #| msgid "To the directory:" msgid "To the &directory:" msgstr "В &каталог:" #: tfrmextractdlg.lblfilemask.caption #| msgid "Extract files matching file mask:" msgid "&Extract files matching file mask:" msgstr "&Распаковать файлы согласно маске:" #: tfrmextractdlg.lblpassword.caption #| msgid "Password for encrypted files:" msgid "&Password for encrypted files:" msgstr "&Пароль (для зашифрованных файлов):" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "Добавить" #: tfrmfileassoc.btnaddext.caption msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "&Добавить" #: tfrmfileassoc.btnaddnewtype.caption msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "До&бавить" #: tfrmfileassoc.btncancel.caption msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmfileassoc.btndownact.caption msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "&Вниз" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmfileassoc.btnremoveact.caption msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "&Удалить" #: tfrmfileassoc.btnremoveext.caption msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "Уд&алить" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "X" #: tfrmfileassoc.btnremovetype.caption msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "Уда&лить" #: tfrmfileassoc.btnrenametype.caption msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "Пе&реименовать" #: tfrmfileassoc.btnupact.caption msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "Вв&ерх" #: tfrmfileassoc.caption msgid "File associations" msgstr "Файловые ассоциации" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "Команды" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "Расширения" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "Типы файлов" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "Значок" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "Действие:" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "&Команда:" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "Редактировать" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "Открыть в редакторе" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "Имя файла" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "Путь к файлу" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "Полный путь" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "Получить вывод команды" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "Открыть" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "Запустить в терминале" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "Открыть в VFS" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "Просмотреть" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "Открыть в просмотрщике" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Закрыть" #: tfrmfileexecuteyourself.caption msgctxt "TFRMFILEEXECUTEYOURSELF.CAPTION" msgid "Wait..." msgstr "Подождите..." #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "Имя файла:" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "Из:" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "Нажмите \"Закрыть\", когда временный файл можно будет удалить!" #: tfrmfileop.btncancel.caption #| msgid "Cancel" msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "&На панель" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "&Показать все" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "Текущая операция:" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "Из:" #: tfrmfileop.lblto.caption msgid "To:" msgstr "в:" #: tfrmfileproperties.btnclose.caption msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Закрыть" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "&Установить" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "У&становить для всех" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "&Пропустить" #: tfrmfileproperties.caption msgctxt "TFRMFILEPROPERTIES.CAPTION" msgid "Properties" msgstr "Свойства" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Закрепляющий бит" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "Владелец" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Биты:" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Группа" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Другие" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Владелец" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "" #: tfrmfileproperties.lblattrtextstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Текст:" #: tfrmfileproperties.lblcontains.caption msgctxt "tfrmfileproperties.lblcontains.caption" msgid "???" msgstr "" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "Содержит:" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Выполнение" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "Имя файла" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "Имя:" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "Имя файла" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "Путь:" #: tfrmfileproperties.lblgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "&Группа" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "Последний доступ:" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "Последнее изменение:" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "Последнее изменение статуса:" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Восьмеричный:" #: tfrmfileproperties.lblownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "&Владелец" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Чтение" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "Размер:" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "" #: tfrmfileproperties.lblsymlinkstr.caption #| msgid "Symlink:" msgid "Symlink to:" msgstr "Симв.ссылка" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "" #: tfrmfileproperties.lbltypestr.caption msgid "Type:" msgstr "Тип:" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Запись" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Атрибуты" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "Свойства" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "&Добавить" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "Помощ&ь" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Закрыть" #: tfrmfinddlg.btnedit.caption msgctxt "tfrmfinddlg.btnedit.caption" msgid "&Edit" msgstr "Пр&авка" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "Пере&йти к файлу" #: tfrmfinddlg.btnlastsearch.caption msgctxt "tfrmfinddlg.btnlastsearch.caption" msgid "&Last search" msgstr "&Предыдущий поиск" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "Н&овый поиск" #: tfrmfinddlg.btnsavetemplate.caption #| msgid "Save" msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "&Сохранить" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "&Удалить" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "З&агрузить" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "Со&хранить" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption msgid "Sa&ve with \"Start in directory\"" msgstr "Сох&ранить с \"Начинать с каталога\"" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "При нажатии сохраняется значение \"Начинать с каталога\". Используйте, если хотите начинать поиск только с определенного каталога" #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "&Старт" #: tfrmfinddlg.btnstop.caption msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "&Отмена" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "Использовать шаблон" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "П&росмотр" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "Фай&лы на панель" #: tfrmfinddlg.caption msgctxt "tfrmfinddlg.caption" msgid "Find files" msgstr "Поиск файлов" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "С &учетом регистра" #: tfrmfinddlg.cbdatefrom.caption msgid "&Date from:" msgstr "&Дата от:" #: tfrmfinddlg.cbdateto.caption msgid "Dat&e to:" msgstr "Да&та до:" #: tfrmfinddlg.cbfilesizefrom.caption msgid "S&ize from:" msgstr "Р&азмер от:" #: tfrmfinddlg.cbfilesizeto.caption msgid "Si&ze to:" msgstr "Раз&мер до:" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "Искать в файле &текст" #: tfrmfinddlg.cbfollowsymlinks.caption msgctxt "tfrmfinddlg.cbfollowsymlinks.caption" msgid "Follow s&ymlinks" msgstr "С&ледовать ссылкам" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "Файлы, &НЕ содержащие этот текст" #: tfrmfinddlg.cbnotolderthan.caption msgid "N&ot older than:" msgstr "Н&е старше чем:" #: tfrmfinddlg.cbpartialnamesearch.caption msgid "Searc&h for part of file name" msgstr "Поис&к по части имени" #: tfrmfinddlg.cbregexp.caption msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "&Регулярное выражение" #: tfrmfinddlg.cbreplacetext.caption msgid "Re&place by" msgstr "З&аменить текст" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "&Выбранные файлы и каталоги" #: tfrmfinddlg.cbtimefrom.caption msgid "&Time from:" msgstr "&Время от:" #: tfrmfinddlg.cbtimeto.caption msgid "Ti&me to:" msgstr "В&ремя до:" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "&Использовать поисковый плагин:" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "Введите имена каталогов, которые должны быть исключены из поиска, разделённых символом \";\"" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "Введите имена файлов, которые должны быть исключены из поиска, разделённых символом \";\"" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "Введите имена файлов, разделённых символом \";\"" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption msgctxt "tfrmfinddlg.gbdirectories.caption" msgid "Directories" msgstr "Каталоги" #: tfrmfinddlg.gbfiles.caption msgctxt "tfrmfinddlg.gbfiles.caption" msgid "Files" msgstr "Файлы" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "С текстом" #: tfrmfinddlg.lblattributes.caption msgctxt "tfrmfinddlg.lblattributes.caption" msgid "Attri&butes" msgstr "Атри&буты" #: tfrmfinddlg.lblencoding.caption msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "Ко&дировка:" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "Искл&ючать подкаталоги" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "&Исключать файлы:" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "Искать &файлы:" #: tfrmfinddlg.lblfindpathstart.caption msgid "Start in &directory" msgstr "Н&ачинать с каталога:" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "Глубина вло&женности подкаталогов:" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "Сохранённые &шаблоны поиска:" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "Убрать из списка" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "Показать все найденные элементы" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "Просмотр" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "Расширенный" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "Шаблоны поиска" #: tfrmfinddlg.tsplugins.caption msgctxt "tfrmfinddlg.tsplugins.caption" msgid "Plugins" msgstr "Плагины" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "Результаты" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "Стандартный" #: tfrmfindview.btnclose.caption msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmfindview.btnfind.caption msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "&Найти" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "Найти" #: tfrmfindview.cbcasesens.caption msgid "C&ase sensitive" msgstr "С учетом &регистра" #: tfrmhardlink.btncancel.caption msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmhardlink.caption #| msgid "Create hardlink" msgid "Create hard link" msgstr "Создать жёсткую ссылку" #: tfrmhardlink.lblexistingfile.caption msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "На &что указывает" #: tfrmhardlink.lbllinktocreate.caption msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "&Имя ссылки" #: tfrmhotdir.btnadd.caption msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "&Добавить" #: tfrmhotdir.btnaddman.caption msgid "Add &manually" msgstr "Добавить &вручную" #: tfrmhotdir.btncancel.caption msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmhotdir.btndelete.caption msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "&Удалить" #: tfrmhotdir.btnedit.caption msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "&Редактировать" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "Избранные каталоги" #: tfrmlinker.btnexit.caption msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmlinker.btnok.caption msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "" #: tfrmlinker.caption msgctxt "TFRMLINKER.CAPTION" msgid "Linker" msgstr "Сборка" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "Сохранить как..." #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "Элемент" #: tfrmlinker.lblfilename.caption msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "Имя &файла" #: tfrmlinker.spbtndel.caption msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "&Удалить" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "Удалить" #: tfrmlinker.spbtndown.caption msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "&Вниз" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "Вниз" #: tfrmlinker.spbtnup.caption msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "Вв&ерх" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "Вверх" #: tfrmmain.actabout.caption msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "&О программе..." #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "Добавить имя файла в командную строку" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "Добавить путь и имя файла в командную строку" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "Копировать путь в командную строку" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "Краткий" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "Краткий вид" #: tfrmmain.actcalculatespace.caption msgid "Calculate &Occupied Space" msgstr "Рассчитать &занимаемое место..." #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "Сменить каталог" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "Перейти в родительский каталог" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "Перейти в корневой каталог" #: tfrmmain.actchecksumcalc.caption msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "Посчитать &контрольные суммы..." #: tfrmmain.actchecksumverify.caption msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "Проверить ко&нтрольные суммы..." #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "Очистить лог файл" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "Очистить окно протокола" #: tfrmmain.actclosealltabs.caption #| msgid "Remove &All Tabs" msgctxt "tfrmmain.actclosealltabs.caption" msgid "Close &All Tabs" msgstr "Закрыть &все вкладки" #: tfrmmain.actclosetab.caption #| msgid "&Remove Tab" msgctxt "tfrmmain.actclosetab.caption" msgid "&Close Tab" msgstr "&Закрыть вкладку" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "Следующая командная строка" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "Выбрать следующую команду в истории командной строки" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "Предыдущая командная строка" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "Выбрать предыдущую команду в истории командной строки" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "Подробный" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "Колоночный вид" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "Сравнивать п&о содержимому" #: tfrmmain.actcomparedirectories.caption msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.CAPTION" msgid "Compare Directories" msgstr "Сравнить &каталоги" #: tfrmmain.actcomparedirectories.hint msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.HINT" msgid "Compare Directories" msgstr "Сравнить &каталоги" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "Показать контекстное меню" #: tfrmmain.actcopy.caption msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "Копировать" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "Копировать по&лные имена файлов" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "Копировать имена фа&йлов в буфер" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "Копирует файлы без запроса подтверждения" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "Копировать в ту же панель" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "&Копировать" #: tfrmmain.actcountdircontent.caption msgid "Sho&w Occupied Space" msgstr "Показать размеры все&х папок" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "&Вырезать" #: tfrmmain.actdelete.caption msgctxt "TFRMMAIN.ACTDELETE.CAPTION" msgid "Delete" msgstr "Удалить" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "История каталогов" #: tfrmmain.actdirhotlist.caption #| msgid "Directory &hotlist" msgid "Directory &Hotlist" msgstr "&Личный список каталогов" #: tfrmmain.actedit.caption msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "Правка" #: tfrmmain.acteditcomment.caption msgid "Edit Co&mment..." msgstr "Редактировать ко&мментарий..." #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "Редактировать новый" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "Редактировать путь в заголовке панели" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "П&оменять панели местами" #: tfrmmain.actexit.caption msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "В&ыход" #: tfrmmain.actextractfiles.caption msgid "&Extract Files..." msgstr "Р&аспаковать..." #: tfrmmain.actfileassoc.caption msgid "File &Associations..." msgstr "Файловые &ассоциации..." #: tfrmmain.actfilelinker.caption msgid "Com&bine Files..." msgstr "&Склеить файлы..." #: tfrmmain.actfileproperties.caption msgid "Show &File Properties" msgstr "С&войства..." #: tfrmmain.actfilespliter.caption msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "&Разрезать файл..." #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "Перейти к командной строке" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "Поместить курсор на первый файл в списке" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "Поместить курсор на последний файл в списке" #: tfrmmain.acthardlink.caption msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "Создать &жесткую ссылку..." #: tfrmmain.acthelpindex.caption msgid "&Contents" msgstr "&Содержание" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "&Панели одна над другой" #: tfrmmain.actkeyboard.caption msgid "&Keyboard" msgstr "&Горячие клавиши" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "Левая &= Правая" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "Открыть список дисков слева" #: tfrmmain.actloadselectionfromclip.caption msgid "Load Selection from Clip&board" msgstr "Загрузить выделение из &буфера" #: tfrmmain.actloadselectionfromfile.caption #| msgid "Load Selection From File" msgid "&Load Selection from File..." msgstr "Загрузить выделение из &файла..." #: tfrmmain.actmakedir.caption msgid "MakeDir" msgstr "Каталог" #: tfrmmain.actmarkcurrentextension.caption msgid "Select All with the Same E&xtension" msgstr "Выделить файлы по рас&ширению" #: tfrmmain.actmarkinvert.caption msgid "&Invert Selection" msgstr "&Инверсия выделения" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "&Выделить все" #: tfrmmain.actmarkminus.caption msgid "Unselect a Gro&up..." msgstr "&Снять выделение с группы..." #: tfrmmain.actmarkplus.caption msgid "Select a &Group..." msgstr "Выделить &группу..." #: tfrmmain.actmarkunmarkall.caption msgid "&Unselect All" msgstr "С&нять выделение со всех" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "Свернуть" #: tfrmmain.actmultirename.caption msgid "Multi &Rename Tool" msgstr "Множественное &переименование" #: tfrmmain.actnetworkconnect.caption msgid "Network &Connect..." msgstr "&Соединиться с сервером..." #: tfrmmain.actnetworkdisconnect.caption msgid "Network &Disconnect" msgstr "Ра&зорвать соединение" #: tfrmmain.actnetworkquickconnect.caption msgid "Network &Quick Connect..." msgstr "&Новое соединение..." #: tfrmmain.actnewtab.caption msgid "&New Tab" msgstr "Н&овая вкладка" #: tfrmmain.actnexttab.caption msgid "Switch to Nex&t Tab" msgstr "Переключиться на с&ледующую вкладку" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "Открыть" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "Попробовать открыть архив" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "Открыть bar файл" #: tfrmmain.actopendirinnewtab.caption msgid "Open &Folder in a New Tab" msgstr "Открыть &каталог в новой вкладке" #: tfrmmain.actopenvirtualfilesystemlist.caption msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "Откр&ыть список VFS" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "Фа&йловые операции" #: tfrmmain.actoptions.caption msgid "&Options..." msgstr "&Параметры..." #: tfrmmain.actpackfiles.caption msgid "&Pack Files..." msgstr "&Упаковать..." #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "Установить позицию разделителя" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "&Вставить" #: tfrmmain.actprevtab.caption msgid "Switch to &Previous Tab" msgstr "Переключиться на &предыдущую вкладку" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "Быстрый фильтр" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "Быстрый поиск" #: tfrmmain.actquickview.caption msgid "&Quick View Panel" msgstr "&Быстрый просмотр" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "&Обновить" #: tfrmmain.actrename.caption msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "Переместить" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "Перемещает файлы без запроса подтверждения" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "Переименовать" #: tfrmmain.actrenametab.caption #| msgid "Re&name Tab" msgid "&Rename Tab" msgstr "Переи&меновать вкладку" #: tfrmmain.actrestoreselection.caption msgid "&Restore Selection" msgstr "Восс&тановить выделение" #: tfrmmain.actreverseorder.caption msgid "Re&verse Order" msgstr "Обра&тный п&орядок" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "Правая &= Левая" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "Открыть список дисков справа" #: tfrmmain.actrunterm.caption msgid "Run &Terminal" msgstr "Пуск &терминала" #: tfrmmain.actsaveselection.caption msgid "Sa&ve Selection" msgstr "С&охранить выделение" #: tfrmmain.actsaveselectiontofile.caption msgid "Save S&election to File..." msgstr "Со&хранить выделение в файл..." #: tfrmmain.actsearch.caption msgid "&Search..." msgstr "&Поиск..." #: tfrmmain.actsetfileproperties.caption msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "Изменить атри&буты" #: tfrmmain.actsettaboptiondirsinnewtab.caption msgid "Locked with Directories Opened in New &Tabs" msgstr "О&ткрывать каталоги в новой вкладке" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "&Обычная" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "&Заблокированная" #: tfrmmain.actsettaboptionpathresets.caption msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "З&аблокировать с возможностью смены каталога" #: tfrmmain.actshellexecute.caption msgctxt "tfrmmain.actshellexecute.caption" msgid "Open" msgstr "Открыть" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "Открыть, используя системные ассоциации" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "Показать кнопочное меню" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "История командной строки" #: tfrmmain.actshowmainmenu.caption msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "Меню" #: tfrmmain.actshowsysfiles.caption msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "По&казывать системные файлы" #: tfrmmain.actsortbyattr.caption msgid "Sort by &Attributes" msgstr "&Атрибуты" #: tfrmmain.actsortbydate.caption msgid "Sort by &Date" msgstr "&Дата" #: tfrmmain.actsortbyext.caption msgid "Sort by &Extension" msgstr "Рас&ширение" #: tfrmmain.actsortbyname.caption msgid "Sort by &Name" msgstr "&Имя" #: tfrmmain.actsortbysize.caption msgid "Sort by &Size" msgstr "&Размер" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "Функция исключений файловых имён: вкл/выкл" #: tfrmmain.actsymlink.caption msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "Создать символ&ьную ссылку..." #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "&Две одинаковых панели" #: tfrmmain.acttestarchive.caption msgid "&Test Archive(s)" msgstr "Про&тестировать архив(ы)" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "Эскизы" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "Просмотр эскизов" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "Открыть каталог под курсором на левой панели" #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "Открыть каталог под курсором на правой панели" #: tfrmmain.actunmarkcurrentextension.caption msgid "Unselect All with the Same Ex&tension" msgstr "Снять выделение по расши&рению" #: tfrmmain.actview.caption msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "Просмотр" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "Показать историю каталогов для активной вкладки" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "Перейти к следующему элементу истории" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "Перейти к предыдущему элементу истории" #: tfrmmain.actvisithomepage.caption msgid "&Visit Double Commander Website" msgstr "&Посетить сайт Double Commander" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "Стереть" #: tfrmmain.btnf10.caption msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "Выход" #: tfrmmain.btnf8.caption msgctxt "TFRMMAIN.BTNF8.CAPTION" msgid "Delete" msgstr "Удалить" #: tfrmmain.btnf9.caption msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "Терминал" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint msgid "Directory hotlist" msgstr "Избранные каталоги" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "Открыть в левой панели текущий каталог правой" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "" #: tfrmmain.btnlefthome.hint msgid "Go to home directory" msgstr "Перейти в домашний каталог" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "" #: tfrmmain.btnleftroot.hint msgid "Go to root directory" msgstr "Перейти в корневой каталог" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr "" #: tfrmmain.btnleftup.hint msgid "Go to parent directory" msgstr "Перейти в вышестоящий каталог" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr "" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "Открыть в правой панели текущий каталог левой" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr "" #: tfrmmain.caption msgctxt "tfrmmain.caption" msgid "Double Commander" msgstr "Double Commander" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "Путь" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "Отмена" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "Копировать..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "Создать &ссылку..." #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline33.caption msgctxt "tfrmmain.miline33.caption" msgid "-" msgstr "" #: tfrmmain.miline37.caption msgctxt "TFRMMAIN.MILINE37.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "Очистить" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "&Копировать" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "Скрыть" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "Выделить &всё" #: tfrmmain.mimove.caption msgid "Move..." msgstr "Переместить..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "Создать символьную сс&ылку..." #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "Опции вкладки" #: tfrmmain.mitrayiconexit.caption msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "В&ыход" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "Восстановить" #: tfrmmain.mnualloperpause.caption msgctxt "tfrmmain.mnualloperpause.caption" msgid "||" msgstr "" #: tfrmmain.mnualloperstart.caption msgctxt "tfrmmain.mnualloperstart.caption" msgid "Start" msgstr "Старт" #: tfrmmain.mnualloperstop.caption msgctxt "tfrmmain.mnualloperstop.caption" msgid "Cancel" msgstr "Отмена" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "&Команды" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "&Настройка" #: tfrmmain.mnufiles.caption msgid "&Files" msgstr "&Файлы" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "Помощ&ь" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "&Выделение" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "Сеть" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "Ви&д" #: tfrmmain.mnutaboptions.caption msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "&Настройка" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "Вк&ладки" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "&Копировать" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "В&ырезать" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "Удалить" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "Редактировать" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "&Вставить" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "" #: tfrmmaskinputdlg.btncancel.caption msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmmaskinputdlg.btndefinetemplate.caption msgid "&Define..." msgstr "&Шаблон..." #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmmaskinputdlg.lblsearchtemplate.caption msgid "O&r select predefined selection type:" msgstr "&или выберите тип файлов по шаблону:" #: tfrmmkdir.btncancel.caption msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmmkdir.caption msgid "Create new directory" msgstr "Создать новый каталог" #: tfrmmkdir.lblmakedir.caption msgid "&Input new directory name:" msgstr "&Введите имя каталога:" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "" #: tfrmmodview.caption msgctxt "TFRMMODVIEW.CAPTION" msgid "New Size" msgstr "Новый размер" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "Высота:" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "" #: tfrmmodview.lblpath2.caption msgctxt "tfrmmodview.lblpath2.caption" msgid "2" msgstr "" #: tfrmmodview.lblpath3.caption msgctxt "tfrmmodview.lblpath3.caption" msgid "3" msgstr "" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "Качество сжатия JPEG" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "Ширина:" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "BMP" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "ICO" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "JPG" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "PNG" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "PNM" #: tfrmmodview.teheight.text msgid "Height" msgstr "Высота" #: tfrmmodview.tequality.text msgid "80" msgstr "" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "Ширина" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Закрыть" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "&Удалить" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "" #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "З&агрузить" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "" #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "&Переименовать" #: tfrmmultirename.btnrestore.caption msgid "Reset &all" msgstr "&Восстановить всё" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "&Сохранить" #: tfrmmultirename.caption msgctxt "tfrmmultirename.caption" msgid "MultiRename" msgstr "Групповое переименование" #: tfrmmultirename.cblog.caption msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "Вкл&ючено" #: tfrmmultirename.cbregexp.caption msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "&Регулярные выражения" #: tfrmmultirename.cbusesubs.caption msgid "&Use substitution" msgstr "Под&становка" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "" #: tfrmmultirename.extension.caption msgid "[E] Extension" msgstr "[E] Расширение" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "Счётчик" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "Найти и заменить" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "Результат" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "Маска" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "Шаблоны" #: tfrmmultirename.lbext.caption msgid "&Extension" msgstr "Рас&ширение" #: tfrmmultirename.lbfind.caption msgid "&Find..." msgstr "&Найти..." #: tfrmmultirename.lbinterval.caption msgid "&Interval" msgstr "&Интервал" #: tfrmmultirename.lbname.caption msgid "File &Name" msgstr "И&мя файла" #: tfrmmultirename.lbreplace.caption msgid "Re&place..." msgstr "Заменит&ь..." #: tfrmmultirename.lbstnb.caption msgid "S&tart Number" msgstr "На&ч. знач." #: tfrmmultirename.lbwidth.caption msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "Ши&рина" #: tfrmmultirename.micounter.caption msgid "[C] Counter" msgstr "[C] Счётчик" #: tfrmmultirename.miday.caption msgid "[D] Day" msgstr "[D] День" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "[DD] День (2 цифры)" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "[DDD] День недели (краткий, т.е., \"Пн\")" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "[DDDD] День недели (полный, т.е., \"понедельник\")" #: tfrmmultirename.miextensionx.caption msgid "[Ex] Character at position x" msgstr "[Ex] Символ с позиции x" #: tfrmmultirename.miextensionxx.caption msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:y] Символы с позиции x по y" #: tfrmmultirename.mihour.caption msgid "[h] Hour" msgstr "[h] Час" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "[hh] Час (2 цифры)" #: tfrmmultirename.miminute.caption msgid "[n] Minute" msgstr "[n] Минута" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "[nn] Минута (2 цифры)" #: tfrmmultirename.mimonth.caption msgid "[M] Month" msgstr "[M] Месяц" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "[MM] Месяц (2 цифры)" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "[MMM] Наименование месяца (краткий, т.е., \"янв\")" #: tfrmmultirename.mimonth3.caption msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "[MMMM] Наименование месяца (полный, т.е., \"Январь\")" #: tfrmmultirename.miname.caption msgid "[N] Name" msgstr "[N] Имя" #: tfrmmultirename.minamex.caption msgid "[Nx] Character at position x" msgstr "[Nx] Символ с позиции x" #: tfrmmultirename.minamexx.caption msgid "[Nx:y] Characters from position x to y" msgstr "[Nx:y] Символы с позиции x по y" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "Время..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "Расширение..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "Имя..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "Плагин" #: tfrmmultirename.misecond.caption msgid "[s] Second" msgstr "[s] Секунда" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "[ss] Секунда (2 цифры)" #: tfrmmultirename.miyear.caption msgid "[Y] Year (2 digits)" msgstr "[Y] Год (2 цифры)" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "[YYYY] Год (4 цифры)" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "tfrmmultirename.stringgrid.columns[0].title.caption" msgid "Old File Name" msgstr "Старое имя" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "tfrmmultirename.stringgrid.columns[1].title.caption" msgid "New File Name" msgstr "Новое имя" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "tfrmmultirename.stringgrid.columns[2].title.caption" msgid "File Path" msgstr "Путь файла" #: tfrmopenwith.caption msgid "Choose an application" msgstr "Выбор приложения" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "Пользовательская команда" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "Сохранить ассоциацию" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "Установить как приложение по умолчанию" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "Тип открываемого файла: %s" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "Список файлов" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "%F" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "Список URI" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "%U" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "Один файл" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "%f" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "Один URI" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "%u" #: tfrmoptions.btnapply.caption msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "&Применить" #: tfrmoptions.btncancel.caption msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmoptions.caption msgctxt "tfrmoptions.caption" msgid "Options" msgstr "Настройка" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "Выберите одну из подстраниц, эта страница не содержит никаких настроек" #: tfrmoptionsarchivers.btnautoconfig.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNAUTOCONFIG.CAPTION" msgid "A&uto Configure" msgstr "&Автонастройка" #: tfrmoptionsarchivers.btnmultiarcadd.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCADD.CAPTION" msgid "A&dd" msgstr "&Добавить" #: tfrmoptionsarchivers.btnmultiarcapply.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCAPPLY.CAPTION" msgid "A&pply" msgstr "П&рименить" #: tfrmoptionsarchivers.btnmultiarcdelete.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCDELETE.CAPTION" msgid "D&elete" msgstr "&Удалить" #: tfrmoptionsarchivers.btnmultiarcrename.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCRENAME.CAPTION" msgid "&Rename" msgstr "П&ереименовать" #: tfrmoptionsarchivers.chkmultiarcdebug.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCDEBUG.CAPTION" msgid "De&bug mode" msgstr "Ре&жим отладки" #: tfrmoptionsarchivers.chkmultiarcenabled.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCENABLED.CAPTION" msgid "E&nabled" msgstr "В&ключен" #: tfrmoptionsarchivers.chkmultiarcoutput.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCOUTPUT.CAPTION" msgid "S&how console output" msgstr "Пока&зывать консольный вывод" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "TFRMOPTIONSARCHIVERS.GBARCHIVEROPTIONS.CAPTION" msgid "Options" msgstr "Настройка" #: tfrmoptionsarchivers.lblarchiveadd.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEADD.CAPTION" msgid "Add&ing:" msgstr "До&бавить:" #: tfrmoptionsarchivers.lblarchiveextension.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTENSION.CAPTION" msgid "E&xtension:" msgstr "Рас&ширение:" #: tfrmoptionsarchivers.lblarchiveextract.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTRACT.CAPTION" msgid "Ex&tract:" msgstr "И&звлечь:" #: tfrmoptionsarchivers.lblarchivelist.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELIST.CAPTION" msgid "&List:" msgstr "Сп&исок:" #: tfrmoptionsarchivers.lblarchivelistend.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTEND.CAPTION" msgid "Listing &finish (optional):" msgstr "Коне&ц списка (необязательный):" #: tfrmoptionsarchivers.lblarchivelistformat.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTFORMAT.CAPTION" msgid "Listing for&mat:" msgstr "Фор&мат списка:" #: tfrmoptionsarchivers.lblarchiveliststart.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTSTART.CAPTION" msgid "Listin&g start (optional):" msgstr "На&чало списка (необязательный):" #: tfrmoptionsarchivers.lblarchiver.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVER.CAPTION" msgid "Arc&hiver:" msgstr "Ар&хиватор:" #: tfrmoptionsarchivers.lbldescription.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLDESCRIPTION.CAPTION" msgid "De&scription:" msgstr "Оп&исание:" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERADDITIONAL.CAPTION" msgid "Additional" msgstr "Дополнительные" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERGENERAL.CAPTION" msgid "General" msgstr "Основные" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHATTRIBUTESCHANGE.CAPTION" msgid "When &size, date or attributes change" msgstr "При изменении &размера, даты или атрибутов" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHEXCLUDEDIRS.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "&Для следующих каталогов и их подкаталогов:" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHFILENAMECHANGE.CAPTION" msgid "When &files are created, deleted or renamed" msgstr "При &создании, удалении и переименовании файлов" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHONLYFOREGROUND.CAPTION" msgid "When application is in the &background" msgstr "Не реаг&ировать на изменения, если окно DC неактивно" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHDISABLE.CAPTION" msgid "Disable auto-refresh" msgstr "Отключить автообновление" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHENABLE.CAPTION" msgid "Refresh file list" msgstr "Обновлять список файлов" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption #| msgid "Always show tray icon" msgctxt "TFRMOPTIONSBEHAVIOR.CBALWAYSSHOWTRAYICON.CAPTION" msgid "Al&ways show tray icon" msgstr "Вс&егда показывать иконку в трее" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption msgid "Automatically &hide unmounted devices" msgstr "С&крывать отмонтированные устройства" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBMINIMIZETOTRAY.CAPTION" msgid "Mo&ve icon to system tray when minimized" msgstr "С&ворачивать в системный трей" #: tfrmoptionsbehavior.cbonlyonce.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBONLYONCE.CAPTION" msgid "A&llow only one copy of DC at a time" msgstr "&Не запускать более одной копии DC" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "Введите один или несколько дисков, точек монтирования, разделяемые \";\"" #: tfrmoptionsbehavior.lbldrivesblacklist.caption msgid "Drives &blacklist" msgstr "&Черный список дисков" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBCUTTEXTTOCOLWIDTH.CAPTION" msgid "Cut &text to column width" msgstr "Обр&езать текст по ширине колонки" #: tfrmoptionscolumnsview.cbgridhorzline.caption msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDHORZLINE.CAPTION" msgid "&Horizontal lines" msgstr "&Горизонтальные линии" #: tfrmoptionscolumnsview.cbgridvertline.caption msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDVERTLINE.CAPTION" msgid "&Vertical lines" msgstr "&Вертикальные линии" #: tfrmoptionscolumnsview.chkautofillcolumns.caption msgctxt "TFRMOPTIONSCOLUMNSVIEW.CHKAUTOFILLCOLUMNS.CAPTION" msgid "A&uto fill columns" msgstr "&Растягивать колонки на всю ширину панели" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "Показывать сетку" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "Автоматически изменять размер колонок" #: tfrmoptionscolumnsview.lblautosizecolumn.caption msgctxt "TFRMOPTIONSCOLUMNSVIEW.LBLAUTOSIZECOLUMN.CAPTION" msgid "Auto si&ze column:" msgstr "И&зменять размер колонки:" #: tfrmoptionsconfiguration.btnconfigapply.caption msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGAPPLY.CAPTION" msgid "A&pply" msgstr "П&рименить" #: tfrmoptionsconfiguration.btnconfigedit.caption msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGEDIT.CAPTION" msgid "&Edit" msgstr "Р&едактировать" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption msgctxt "TFRMOPTIONSCONFIGURATION.CBCMDLINEHISTORY.CAPTION" msgid "Co&mmand line history" msgstr "&История командной строки" #: tfrmoptionsconfiguration.cbdirhistory.caption msgctxt "TFRMOPTIONSCONFIGURATION.CBDIRHISTORY.CAPTION" msgid "&Directory history" msgstr "И&стория каталогов" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption msgctxt "TFRMOPTIONSCONFIGURATION.CBFILEMASKHISTORY.CAPTION" msgid "&File mask history" msgstr "История &масок файлов" #: tfrmoptionsconfiguration.chksaveconfiguration.caption msgctxt "TFRMOPTIONSCONFIGURATION.CHKSAVECONFIGURATION.CAPTION" msgid "Sa&ve configuration" msgstr "Со&хранять конфигурацию" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption msgctxt "TFRMOPTIONSCONFIGURATION.CHKSEARCHREPLACEHISTORY.CAPTION" msgid "Searc&h/Replace history" msgstr "Истори&я поиска/замены" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBLOCCONFIGFILES.CAPTION" msgid "Location of configuration files" msgstr "Месторасположение файлов конфигурации" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBSAVEONEXIT.CAPTION" msgid "Save on exit" msgstr "Сохранять при выходе" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgctxt "TFRMOPTIONSCONFIGURATION.LBLCMDLINECONFIGDIR.CAPTION" msgid "Set on command line" msgstr "Задано через командную строку" #: tfrmoptionsconfiguration.rbprogramdir.caption msgctxt "TFRMOPTIONSCONFIGURATION.RBPROGRAMDIR.CAPTION" msgid "P&rogram directory (portable version)" msgstr "&Каталог программы (portable version)" #: tfrmoptionsconfiguration.rbuserhomedir.caption msgctxt "TFRMOPTIONSCONFIGURATION.RBUSERHOMEDIR.CAPTION" msgid "&User home directory" msgstr "&Домашний каталог пользователя" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNCOPYCOLUMNSSET.CAPTION" msgid "C&opy" msgstr "&Копировать" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNDELCOLUMNSSET.CAPTION" msgid "&Delete" msgstr "&Удалить" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNEDITCOLUMNSSET.CAPTION" msgid "&Edit" msgstr "&Редактировать" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNNEWCOLUMNSSET.CAPTION" msgid "&New" msgstr "&Создать" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.CBBFILESYSTEM.TEXT" msgid "General" msgstr "Основные" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.LBLCONFIGCOLUMNS.CAPTION" msgid "Con&figure columns for file system:" msgstr "&Настроить колонки для файловой системы:" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption msgid "&Show confirmation dialog after drop" msgstr "По&казать диалог подтверждения после окончания перетаскивания" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption msgid "Show &file system" msgstr "Тип &файловой системы" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption msgid "Show fr&ee space" msgstr "&Свободное место" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption msgid "Show &label" msgstr "&Метка" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "Список дисков" #: tfrmoptionseditorcolors.backgroundlabel.caption msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "Фо&н" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption" msgid "Bac&kground" msgstr "Фо&н" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "Атрибуты элементов" #: tfrmoptionseditorcolors.foregroundlabel.caption msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "&Цвет текста" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption" msgid "Fo®round" msgstr "&Цвет текста" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption msgid "&Text-mark" msgstr "О&тметка" #: tfrmoptionseditorcolors.tbtnglobal.caption msgid "Use (and edit) &global scheme settings" msgstr "Использовать (и менять) &глобальную схему" #: tfrmoptionseditorcolors.tbtnlocal.caption msgid "Use &local scheme settings" msgstr "Использовать &локальную схему" #: tfrmoptionseditorcolors.textboldcheckbox.caption msgid "&Bold" msgstr "&Жирный" #: tfrmoptionseditorcolors.textboldradioinvert.caption msgctxt "tfrmoptionseditorcolors.textboldradioinvert.caption" msgid "In&vert" msgstr "О&братить" #: tfrmoptionseditorcolors.textboldradiooff.caption msgctxt "tfrmoptionseditorcolors.textboldradiooff.caption" msgid "O&ff" msgstr "В&ыкл." #: tfrmoptionseditorcolors.textboldradioon.caption msgctxt "tfrmoptionseditorcolors.textboldradioon.caption" msgid "O&n" msgstr "&Вкл." #: tfrmoptionseditorcolors.textitaliccheckbox.caption msgid "&Italic" msgstr "К&урсив" #: tfrmoptionseditorcolors.textitalicradioinvert.caption msgctxt "tfrmoptionseditorcolors.textitalicradioinvert.caption" msgid "In&vert" msgstr "О&братить" #: tfrmoptionseditorcolors.textitalicradiooff.caption msgctxt "tfrmoptionseditorcolors.textitalicradiooff.caption" msgid "O&ff" msgstr "В&ыкл." #: tfrmoptionseditorcolors.textitalicradioon.caption msgctxt "tfrmoptionseditorcolors.textitalicradioon.caption" msgid "O&n" msgstr "&Вкл." #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption msgid "&Strike Out" msgstr "&Зачёркнутый" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioinvert.caption" msgid "In&vert" msgstr "О&братить" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradiooff.caption" msgid "O&ff" msgstr "В&ыкл." #: tfrmoptionseditorcolors.textstrikeoutradioon.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioon.caption" msgid "O&n" msgstr "&Вкл." #: tfrmoptionseditorcolors.textunderlinecheckbox.caption msgid "&Underline" msgstr "По&дчёркнутый" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "О&братить" #: tfrmoptionseditorcolors.textunderlineradiooff.caption msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "В&ыкл." #: tfrmoptionseditorcolors.textunderlineradioon.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "&Вкл." #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "&Копирования" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "&Удаления" #: tfrmoptionsfileoperations.cbdeletetotrash.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDELETETOTRASH.CAPTION" msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "Уд&аление в Корзину (с Shift - око&нчательно)" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "У&даления в корзину" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDROPREADONLYFLAG.CAPTION" msgid "D&rop readonly flag" msgstr "&Сбросить флаг \"Только для чтения\"" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "П&еремещения" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPARTIALNAMESEARCH.CAPTION" msgid "&Search for part of file name" msgstr "По&иск по части имени" #: tfrmoptionsfileoperations.cbprocesscomments.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPROCESSCOMMENTS.CAPTION" msgid "&Process comments with files/folders" msgstr "О&брабатывать комментарии с файлами/папками" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBRENAMESELONLYNAME.CAPTION" msgid "Select &file name without extension when renaming" msgstr "П&ри переименовании выделять имя файла без расширения" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSHOWCOPYTABSELECTPANEL.CAPTION" msgid "Sho&w tab select panel in copy/move dialog" msgstr "Показ&ывать панель выбора вкладок в диалоге копирования/перемещения" #: tfrmoptionsfileoperations.cbskipfileoperror.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSKIPFILEOPERROR.CAPTION" msgid "S&kip file operations errors and write them to log window" msgstr "Пропускать о&шибки при файловых операциях и выводить их в окно лога" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "Операции исполнения" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.GBFILESEARCH.CAPTION" msgid "File search" msgstr "Поиск файлов" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "Пользовательский интерфейс" #: tfrmoptionsfileoperations.lblbuffersize.caption msgid "&Buffer size for file operations (in KB):" msgstr "Ра&змер буфера для файловых операций (Кб):" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "Показывать окно подтверждения для следующих операций:" #: tfrmoptionsfileoperations.lblprogresskind.caption msgid "Show operations progress &initially in" msgstr "Показыват&ь прогресс операций в" #: tfrmoptionsfileoperations.lblwipepassnumber.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.LBLWIPEPASSNUMBER.CAPTION" msgid "&Number of wipe passes:" msgstr "Число перезаписе&й при стирании (Wipe):" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSEMMAPINSEARCH.CAPTION" msgid "Use memory mapping for search te&xt in files" msgstr "Использовать отобра&жение в память, при поиске текста в файлах" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSESTREAMINSEARCH.CAPTION" msgid "&Use stream for search text in files" msgstr "Использовать поток, при поиске текста в &файлах" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEFRAMECURSOR.CAPTION" msgid "Use &Frame Cursor" msgstr "К&урсор-рамка" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption msgid "Use &Gradient Indicator" msgstr "Использовать &градиентный индикатор" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEINVERTEDSELECTION.CAPTION" msgid "U&se Inverted Selection" msgstr "Инверсное в&ыделение" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.DBFREESPACEINDICATOR.CAPTION" msgid "Drive Free Space Indicator" msgstr "Индикатор свободного места" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.GBEXAMPLE.CAPTION" msgid "Example" msgstr "Пример" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR.CAPTION" msgid "Bac&kground:" msgstr "&Фон 1:" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR2.CAPTION" msgid "Backg&round 2:" msgstr "Фо&н 2" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORCOLOR.CAPTION" msgid "C&ursor Color:" msgstr "&Курсор" #: tfrmoptionsfilepanelscolors.lblcursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORTEXT.CAPTION" msgid "Cursor Te&xt:" msgstr "Т&екст под курсором" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLINACTIVEPANELBRIGHTNESS.CAPTION" msgid "&Brightness level of inactive panel" msgstr "Уровень &яркости неактивной панели" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption msgid "In&dicator Back Color:" msgstr "Цвет фона &индикатора" #: tfrmoptionsfilepanelscolors.lblindcolor.caption msgid "&Indicator Fore Color:" msgstr "&Цвет индикатора" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLMARKCOLOR.CAPTION" msgid "&Mark Color:" msgstr "&Выделение" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLTEXTCOLOR.CAPTION" msgid "T&ext Color:" msgstr "&Текст:" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption msgid "Do&n't load file list until a tab is activated" msgstr "&Не загружать список файлов, пока вкладка активируется" #: tfrmoptionsfilesviews.cbdirbrackets.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBDIRBRACKETS.CAPTION" msgid "S&how square brackets around directories" msgstr "Показыват&ь квадратные скобки вокруг имён папок" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption msgid "Hi&ghlight new and updated files" msgstr "По&дсвечивать новые и измененные файлы" #: tfrmoptionsfilesviews.cblistfilesinthread.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBLISTFILESINTHREAD.CAPTION" msgid "Load &file list in separate thread" msgstr "Загру&жать список файлов в отдельном потоке" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBLOADICONSSEPARATELY.CAPTION" msgid "Load icons af&ter file list" msgstr "За&гружать иконки после списка файлов" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption msgid "Show s&ystem and hidden files" msgstr "Показывать систе&мные файлы" #: tfrmoptionsfilesviews.cbspacemovesdown.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBSPACEMOVESDOWN.CAPTION" msgid "&When selecting files with , move down to next file (as with )" msgstr "При в&ыделении файлов пробелом перемещать курсор на следующий файл" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "Форматирование" #: tfrmoptionsfilesviews.gbsorting.caption msgctxt "TFRMOPTIONSFILESVIEWS.GBSORTING.CAPTION" msgid "Sorting" msgstr "Сортировка" #: tfrmoptionsfilesviews.lblcasesensitivity.caption msgid "Case s&ensitivity:" msgstr "&Чувствительность к регистру" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "Неверный формат" #: tfrmoptionsfilesviews.lbldatetimeformat.caption msgctxt "TFRMOPTIONSFILESVIEWS.LBLDATETIMEFORMAT.CAPTION" msgid "&Date and time format:" msgstr "&Формат даты и времени:" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "Формат ра&змера файла:" #: tfrmoptionsfilesviews.lblnewfilesposition.caption msgid "&Insert new files" msgstr "&Вставлять новые файлы" #: tfrmoptionsfilesviews.lblsortfoldermode.caption msgid "So&rting directories:" msgstr "Со&ртировка каталогов:" #: tfrmoptionsfilesviews.lblsortmethod.caption msgctxt "TFRMOPTIONSFILESVIEWS.LBLSORTMETHOD.CAPTION" msgid "&Sort method:" msgstr "Метод &сортировки:" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption msgid "&Move updated files" msgstr "П&еремещать измененные файлы" #: tfrmoptionsfiletypescolors.btnaddcategory.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNADDCATEGORY.CAPTION" msgid "A&dd" msgstr "&Добавить" #: tfrmoptionsfiletypescolors.btnapplycategory.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNAPPLYCATEGORY.CAPTION" msgid "A&pply" msgstr "П&рименить" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNCATEGORYCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNDELETECATEGORY.CAPTION" msgid "D&elete" msgstr "&Удалить" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Шаблон..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.GBFILETYPESCOLORS.CAPTION" msgid "File types colors (sort by drag&&drop)" msgstr "Цвета по типу (сортировка перетаскиванием)" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYATTR.CAPTION" msgid "Category a&ttributes:" msgstr "&Атрибуты" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYCOLOR.CAPTION" msgid "Category co&lor:" msgstr "&Цвет:" #: tfrmoptionsfiletypescolors.lblcategorymask.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYMASK.CAPTION" msgid "Category &mask:" msgstr "&Маска:" #: tfrmoptionsfiletypescolors.lblcategoryname.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYNAME.CAPTION" msgid "Category &name:" msgstr "&Наименование:" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELEDITFNT.CAPTION" msgid "..." msgstr "" #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELLOGFNT.CAPTION" msgid "..." msgstr "" #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELMAINFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWERBOOKFNT.CAPTION" msgid "..." msgstr "" #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWFNT.CAPTION" msgid "..." msgstr "" #: tfrmoptionsfonts.lbleditorfont.caption msgctxt "TFRMOPTIONSFONTS.LBLEDITORFONT.CAPTION" msgid "&Editor font" msgstr "&Редактора" #: tfrmoptionsfonts.lbllogfont.caption msgctxt "TFRMOPTIONSFONTS.LBLLOGFONT.CAPTION" msgid "&Log font" msgstr "Протоко&ла" #: tfrmoptionsfonts.lblmainfont.caption msgctxt "TFRMOPTIONSFONTS.LBLMAINFONT.CAPTION" msgid "Main &font" msgstr "О&сновной" #: tfrmoptionsfonts.lblviewerbookfont.caption msgctxt "TFRMOPTIONSFONTS.LBLVIEWERBOOKFONT.CAPTION" msgid "Viewer&Book Font" msgstr "Просмотрщика (режим \"&Книга\")" #: tfrmoptionsfonts.lblviewerfont.caption msgctxt "TFRMOPTIONSFONTS.LBLVIEWERFONT.CAPTION" msgid "&Viewer font" msgstr "Прос&мотрщика" #: tfrmoptionshotkeys.btnaddhotkey.caption msgid "Add &hotkey" msgstr "&Добавить" #: tfrmoptionshotkeys.btndeletehotkey.caption msgid "&Delete hotkey" msgstr "&Удалить" #: tfrmoptionshotkeys.btnedithotkey.caption msgctxt "tfrmoptionshotkeys.btnedithotkey.caption" msgid "&Edit hotkey" msgstr "&Редактировать" #: tfrmoptionshotkeys.lbfilter.caption msgctxt "TFRMOPTIONSHOTKEYS.LBFILTER.CAPTION" msgid "&Filter" msgstr "&Фильтр" #: tfrmoptionshotkeys.lblcategories.caption msgctxt "tfrmoptionshotkeys.lblcategories.caption" msgid "C&ategories:" msgstr "К&атегории:" #: tfrmoptionshotkeys.lblcommands.caption msgctxt "tfrmoptionshotkeys.lblcommands.caption" msgid "Co&mmands:" msgstr "Ко&манды:" #: tfrmoptionshotkeys.lblscfiles.caption msgctxt "TFRMOPTIONSHOTKEYS.LBLSCFILES.CAPTION" msgid "&Shortcut files:" msgstr "&Набор горячих клавиш:" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[0].TITLE.CAPTION" msgid "Hotkey" msgstr "Горячая клавиша" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[1].TITLE.CAPTION" msgid "Parameters" msgstr "Параметры" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[2].TITLE.CAPTION" msgid "Controls" msgstr "Элементы" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "Для следующих &каталогов и их подкаталогов:" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "Показывать значки для &команд в меню" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "tfrmoptionsicons.cbiconsinmenussize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption msgctxt "TFRMOPTIONSICONS.CBICONSSHOWOVERLAY.CAPTION" msgid "Show o&verlay icons, e.g. for links" msgstr "Показывать овер&лейные значки (например, для ярлыков)" #: tfrmoptionsicons.cbiconssize.text msgctxt "TFRMOPTIONSICONS.CBICONSSIZE.TEXT" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "Отключить загрузку специальных иконок" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "Значки в меню" #: tfrmoptionsicons.gbiconssize.caption msgctxt "TFRMOPTIONSICONS.GBICONSSIZE.CAPTION" msgid " Icon size " msgstr " Размер значков " #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "TFRMOPTIONSICONS.GBSHOWICONSMODE.CAPTION" msgid " Show icons to the left of the filename " msgstr " Показ значков, связанных с типом файлов " #: tfrmoptionsicons.rbiconsshowall.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALL.CAPTION" msgid "A&ll" msgstr "&Все" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALLANDEXE.CAPTION" msgid "All associated + &EXE/LNK (slow)" msgstr "Вс&е ассоциированные + EXE/LNK (медленно)" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWNONE.CAPTION" msgid "&No icons" msgstr "&Не показывать значки" #: tfrmoptionsicons.rbiconsshowstandard.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWSTANDARD.CAPTION" msgid "Only &standard icons" msgstr "Только &стандартные" #: tfrmoptionsignorelist.btnaddsel.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSEL.CAPTION" msgid "A&dd selected names" msgstr "&Добавить все выделенные" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSELWITHPATH.CAPTION" msgid "Add selected names with &full path" msgstr "До&бавить все выделенные с путями" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "TFRMOPTIONSIGNORELIST.CHKIGNOREENABLE.CAPTION" msgid "&Ignore (don't show) the following files and folders:" msgstr "&Исключить (не показывать) следующие файлы и каталоги:" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "TFRMOPTIONSIGNORELIST.LBLSAVEIN.CAPTION" msgid "&Save in:" msgstr "&Сохранить в:" #: tfrmoptionskeyboard.cblynxlike.caption msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "П&равая и левая стрелки изменяют каталог (Lynx-поведение)" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "Ввод" #: tfrmoptionskeyboard.lblalt.caption msgctxt "TFRMOPTIONSKEYBOARD.LBLALT.CAPTION" msgid "Alt+L&etters" msgstr "Alt+Б&уква" #: tfrmoptionskeyboard.lblctrlalt.caption msgctxt "TFRMOPTIONSKEYBOARD.LBLCTRLALT.CAPTION" msgid "Ctrl+Alt+Le&tters" msgstr "Ctrl+Alt+Бу&ква" #: tfrmoptionskeyboard.lblnomodifier.caption msgctxt "TFRMOPTIONSKEYBOARD.LBLNOMODIFIER.CAPTION" msgid "&Letters" msgstr "&Буквы" #: tfrmoptionslayout.cbflatdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBFLATDISKPANEL.CAPTION" msgid "&Flat buttons" msgstr "П&лоские" #: tfrmoptionslayout.cbflatinterface.caption msgctxt "TFRMOPTIONSLAYOUT.CBFLATINTERFACE.CAPTION" msgid "Flat i&nterface" msgstr "Плоский инт&ерфейс" #: tfrmoptionslayout.cbflattoolbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBFLATTOOLBAR.CAPTION" msgid "Flat b&uttons" msgstr "Пло&ские" #: tfrmoptionslayout.cbfreespaceind.caption msgctxt "TFRMOPTIONSLAYOUT.CBFREESPACEIND.CAPTION" msgid "Show fr&ee space indicator on drive label" msgstr "&Индикатор свободного места на диске" #: tfrmoptionslayout.cblogwindow.caption msgctxt "TFRMOPTIONSLAYOUT.CBLOGWINDOW.CAPTION" msgid "Show lo&g window" msgstr "Окно протокола" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "TFRMOPTIONSLAYOUT.CBPANELOFOPERATIONS.CAPTION" msgid "Show panel of operation in background" msgstr "Панель фонов&ых операций" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "TFRMOPTIONSLAYOUT.CBPROGINMENUBAR.CAPTION" msgid "Show common progress in menu bar" msgstr "Об&щий прогресс в меню" #: tfrmoptionslayout.cbshowcmdline.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCMDLINE.CAPTION" msgid "Show command l&ine" msgstr "Ко&мандная строка" #: tfrmoptionslayout.cbshowcurdir.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCURDIR.CAPTION" msgid "Show current director&y" msgstr "Имя тек&ущего каталога" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDISKPANEL.CAPTION" msgid "Show &drive buttons" msgstr "Кнопки &дисков" #: tfrmoptionslayout.cbshowdrivefreespace.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDRIVEFREESPACE.CAPTION" msgid "Show free s&pace label" msgstr "Строка сво&бодного места на диске" #: tfrmoptionslayout.cbshowdriveslistbutton.caption msgid "Show drives list bu&tton" msgstr "К&нопка списка дисков" #: tfrmoptionslayout.cbshowkeyspanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWKEYSPANEL.CAPTION" msgid "Show function &key buttons" msgstr "Кнопки &функциональных клавиш" #: tfrmoptionslayout.cbshowmainmenu.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINMENU.CAPTION" msgid "Show &main menu" msgstr "&Главное меню" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINTOOLBAR.CAPTION" msgid "Show &button bar" msgstr "П&анель инструментов" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption msgid "Show short free space &label" msgstr "К&ратко" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWSTATUSBAR.CAPTION" msgid "Show &status bar" msgstr "Строка состо&яния" #: tfrmoptionslayout.cbshowtabheader.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABHEADER.CAPTION" msgid "S&how tabstop header" msgstr "&Заголовки табуляторов" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABS.CAPTION" msgid "Sho&w folder tabs" msgstr "В&кладки папок" #: tfrmoptionslayout.cbtermwindow.caption msgctxt "TFRMOPTIONSLAYOUT.CBTERMWINDOW.CAPTION" msgid "Show te&rminal window" msgstr "Консол&ь" #: tfrmoptionslayout.cbtwodiskpanels.caption msgctxt "TFRMOPTIONSLAYOUT.CBTWODISKPANELS.CAPTION" msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "Д&ве панели кнопок дисков (над файловыми панелями)" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "TFRMOPTIONSLAYOUT.GBSCREENLAYOUT.CAPTION" msgid " Screen layout " msgstr " Компоненты основного окна " #: tfrmoptionslog.cblogarcop.caption msgctxt "TFRMOPTIONSLOG.CBLOGARCOP.CAPTION" msgid "&Pack/Unpack" msgstr "Уп&аковка / Распаковка" #: tfrmoptionslog.cblogcpmvln.caption msgctxt "TFRMOPTIONSLOG.CBLOGCPMVLN.CAPTION" msgid "Cop&y/Move/Create link/symlink" msgstr "&Копирование / Перемещение / Создание ссылок" #: tfrmoptionslog.cblogdelete.caption msgctxt "TFRMOPTIONSLOG.CBLOGDELETE.CAPTION" msgid "&Delete" msgstr "&Удалить" #: tfrmoptionslog.cblogdirop.caption msgctxt "TFRMOPTIONSLOG.CBLOGDIROP.CAPTION" msgid "Crea&te/Delete directories" msgstr "Со&здание / Удаление каталогов" #: tfrmoptionslog.cblogerrors.caption msgctxt "TFRMOPTIONSLOG.CBLOGERRORS.CAPTION" msgid "Log &errors" msgstr "О&шибки" #: tfrmoptionslog.cblogfile.caption msgctxt "TFRMOPTIONSLOG.CBLOGFILE.CAPTION" msgid "C&reate a log file:" msgstr "Соз&дать файл отчета:" #: tfrmoptionslog.cbloginfo.caption msgctxt "TFRMOPTIONSLOG.CBLOGINFO.CAPTION" msgid "Log &information messages" msgstr "&Информационные сообщения" #: tfrmoptionslog.cblogsuccess.caption msgctxt "TFRMOPTIONSLOG.CBLOGSUCCESS.CAPTION" msgid "Log &successful operations" msgstr "У&спешные операции" #: tfrmoptionslog.cblogvfs.caption msgctxt "TFRMOPTIONSLOG.CBLOGVFS.CAPTION" msgid "&File system plugins" msgstr "П&лагины файловой системы" #: tfrmoptionslog.gblogfile.caption msgctxt "TFRMOPTIONSLOG.GBLOGFILE.CAPTION" msgid "File operation log file" msgstr "Отчет о файловых операциях" #: tfrmoptionslog.gblogfileop.caption msgctxt "TFRMOPTIONSLOG.GBLOGFILEOP.CAPTION" msgid "Log operations" msgstr "Протоколируемые действия" #: tfrmoptionslog.gblogfilestatus.caption #| msgid "Operation status:" msgctxt "TFRMOPTIONSLOG.GBLOGFILESTATUS.CAPTION" msgid "Operation status" msgstr "Протоколировать операции со статусом" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "&Удалить эскизы для отсутствующих файлов" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "При смене диска всегда пере&ходить в корневой каталог" #: tfrmoptionsmisc.chkshowwarningmessages.caption msgctxt "tfrmoptionsmisc.chkshowwarningmessages.caption" msgid "Show &warning messages (\"OK\" button only)" msgstr "По&казывать не критические сообщения об ошибках (с одной кнопкой \"ОК\")" #: tfrmoptionsmisc.chkthumbsave.caption msgctxt "tfrmoptionsmisc.chkthumbsave.caption" msgid "&Save thumbnails in cache" msgstr "&Сохранять эскизы в кэш" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "tfrmoptionsmisc.dblthumbnails.caption" msgid "Thumbnails" msgstr "Эскизы" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "пикселей" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "tfrmoptionsmisc.lblthumbseparator.caption" msgid "X" msgstr "X" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "&Размер эскизов:" #: tfrmoptionsmouse.cbselectionbymouse.caption msgid "&Selection by mouse" msgstr "&Выбор с помощью мыши" #: tfrmoptionsmouse.gbscrolling.caption msgid "Scrolling" msgstr "Прокрутка" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "Выбор" #: tfrmoptionsmouse.lblmousemode.caption msgid "&Mode:" msgstr "Р&ежим" #: tfrmoptionsmouse.rbscrolllinebyline.caption msgid "&Line by line" msgstr "По&строчно" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption msgid "Line by line &with cursor movement" msgstr "Построчно с &движением курсора" #: tfrmoptionsmouse.rbscrollpagebypage.caption msgid "&Page by page" msgstr "Пост&ранично" #: tfrmoptionsplugins.btnaddplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "&Добавить" #: tfrmoptionsplugins.btnconfigplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "&Настроить" #: tfrmoptionsplugins.btnenableplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "&Включить" #: tfrmoptionsplugins.btnremoveplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "&Удалить" #: tfrmoptionsplugins.btntweakplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "Параметр&ы" #: tfrmoptionsplugins.lbldsxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "Поз&воляют использовать в поиске альтернативные алгоритмы или внешние инструменты (например \"locate\", и т.п.)" #: tfrmoptionsplugins.lblwcxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "Позволяют р&аботать с архивами." #: tfrmoptionsplugins.lblwdxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "Позвол&яют использовать расширенные сведения о файлах (теги mp3, атрибуты изображений и т.д.) в панелях или при поиске/переименовании." #: tfrmoptionsplugins.lblwfxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "Позволя&ют обращаться к дискам, недоступным из ОС или к внешним устройствам, типа Palm/PocketPC, и т.д." #: tfrmoptionsplugins.lblwlxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "Позволяют ото&бражать во внутреннем просмотрщике (F3, Ctrl+Q) файлы различных форматов, таких как рисунки, таблицы, базы данных и т.д." #: tfrmoptionsplugins.stgplugins.columns[0].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[0].TITLE.CAPTION" msgid "Active" msgstr "Состояние" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[1].TITLE.CAPTION" msgid "Plugin" msgstr "Плагин" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[2].TITLE.CAPTION" msgid "Registered for" msgstr "Ассоциация" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[3].TITLE.CAPTION" msgid "File name" msgstr "Имя файла" #: tfrmoptionsplugins.tsdsx.caption msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "По&исковые плагины (.DSX)" #: tfrmoptionsplugins.tswcx.caption msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "Ар&хиваторные плагины (.WCX)" #: tfrmoptionsplugins.tswdx.caption msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "&Контентные плагины (.WDX)" #: tfrmoptionsplugins.tswfx.caption msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "П&лагины файловой системы (.WFX)" #: tfrmoptionsplugins.tswlx.caption msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "Пла&гины просмотрщика (.WLX)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTBEGINNING.CAPTION" msgid "&Beginning (name must start with first typed character)" msgstr "&Начало (имя должно начинаться с набранных символов)" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTENDING.CAPTION" msgid "En&ding (last character before a typed dot . must match)" msgstr "&Конец (последние символы до набранной точки '.' должны совпадать)" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CGPOPTIONS.CAPTION" msgid "Options" msgstr "Настройка" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption #| msgid "Exact name match:" msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.GBEXACTNAMEMATCH.CAPTION" msgid "Exact name match" msgstr "Точное соответствие имени" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "Поисковый регистр" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "Искать" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "TFRMOPTIONSTABS.CBTABSACTIVATEONCLICK.CAPTION" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "Делат&ь панель активной при щелчке по одной из её вкладок" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "TFRMOPTIONSTABS.CBTABSALWAYSVISIBLE.CAPTION" msgid "&Show tab header also when there is only one tab" msgstr "Показ&ывать заголовок вкладки, даже если она одна" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption msgctxt "TFRMOPTIONSTABS.CBTABSCONFIRMCLOSEALL.CAPTION" msgid "Con&firm close all tabs" msgstr "По&дтверждать закрытие всех вкладок" #: tfrmoptionstabs.cbtabslimitoption.caption #| msgid "&Limit tab title length to:" msgctxt "TFRMOPTIONSTABS.CBTABSLIMITOPTION.CAPTION" msgid "&Limit tab title length to" msgstr "Ог&раничить размер заголовка до" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "TFRMOPTIONSTABS.CBTABSLOCKEDASTERISK.CAPTION" msgid "Show locked tabs &with an asterisk *" msgstr "Отмечать за&блокированные вкладки звёздочкой *" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "TFRMOPTIONSTABS.CBTABSMULTILINES.CAPTION" msgid "&Tabs on multiple lines" msgstr "Размещать вкладки в несколько рядов" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENFOREGROUND.CAPTION" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Ctrl+вверх делает &новую вкладку активной" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENNEARCURRENT.CAPTION" msgid "Open &new tabs near current tab" msgstr "От&крывать новую вкладку рядом с текущей" #: tfrmoptionstabs.cbtabsshowclosebutton.caption msgctxt "TFRMOPTIONSTABS.CBTABSSHOWCLOSEBUTTON.CAPTION" msgid "Show ta&b close button" msgstr "Кнопка &закрытия вкладки" #: tfrmoptionstabs.gbtabs.caption msgctxt "TFRMOPTIONSTABS.GBTABS.CAPTION" msgid "Folder tabs headers" msgstr "За&головки вкладок" #: tfrmoptionstabs.lblchar.caption msgctxt "TFRMOPTIONSTABS.LBLCHAR.CAPTION" msgid "characters" msgstr "символов" #: tfrmoptionstabs.lbltabsposition.caption #| msgid "&Tabs position" msgctxt "TFRMOPTIONSTABS.LBLTABSPOSITION.CAPTION" msgid "Ta&bs position" msgstr "Положение &вкладок:" #: tfrmoptionsterminal.lblruninterm.caption msgid "Run in &terminal:" msgstr "Запуск в т&ерминале" #: tfrmoptionsterminal.lblrunterm.caption msgid "Run t&erminal:" msgstr "Запуск &терминала" #: tfrmoptionstoolbar.btnclonebutton.caption msgctxt "tfrmoptionstoolbar.btnclonebutton.caption" msgid "C&lone button" msgstr "&Дублировать" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "tfrmoptionstoolbar.btndeletebutton.caption" msgid "&Delete" msgstr "&Удалить" #: tfrmoptionstoolbar.btnedithotkey.caption msgctxt "tfrmoptionstoolbar.btnedithotkey.caption" msgid "Edit hot&key" msgstr "&Редактировать" #: tfrmoptionstoolbar.btninsertbutton.caption msgctxt "tfrmoptionstoolbar.btninsertbutton.caption" msgid "&Insert new button" msgstr "&Вставить" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "tfrmoptionstoolbar.btnopenfile.caption" msgid ">>" msgstr "" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "tfrmoptionstoolbar.btnopenicon.caption" msgid ">>" msgstr "" #: tfrmoptionstoolbar.btnremovehotkey.caption #| msgid "Remove hotkey" msgctxt "tfrmoptionstoolbar.btnremovehotkey.caption" msgid "Remove hotke&y" msgstr "У&далить" #: tfrmoptionstoolbar.cbflatbuttons.caption msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "&Плоские кнопки" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "Параметры команды находятся каждая на отдельной строке. F1 - помощь" #: tfrmoptionstoolbar.gbgroupbox.caption msgctxt "tfrmoptionstoolbar.gbgroupbox.caption" msgid "Appearance" msgstr "Вид кнопок" #: tfrmoptionstoolbar.lblbarsize.caption msgctxt "tfrmoptionstoolbar.lblbarsize.caption" msgid "&Bar size:" msgstr "Р&азмер панели:" #: tfrmoptionstoolbar.lblexternalcommand.caption msgctxt "tfrmoptionstoolbar.lblexternalcommand.caption" msgid "Comman&d:" msgstr "Команда" #: tfrmoptionstoolbar.lblexternalparameters.caption msgctxt "tfrmoptionstoolbar.lblexternalparameters.caption" msgid "Parameter&s:" msgstr "Параметры" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "Горячая клавиша" #: tfrmoptionstoolbar.lbliconfile.caption msgctxt "tfrmoptionstoolbar.lbliconfile.caption" msgid "Ico&n:" msgstr "&Файл значка:" #: tfrmoptionstoolbar.lbliconsize.caption msgctxt "tfrmoptionstoolbar.lbliconsize.caption" msgid "Icon si&ze:" msgstr "Ра&змер значков:" #: tfrmoptionstoolbar.lblinternalcommand.caption msgctxt "tfrmoptionstoolbar.lblinternalcommand.caption" msgid "Co&mmand:" msgstr "Кома&нда" #: tfrmoptionstoolbar.lblinternalparameters.caption msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "Пара&метры" #: tfrmoptionstoolbar.lblstartpath.caption msgctxt "tfrmoptionstoolbar.lblstartpath.caption" msgid "Start pat&h:" msgstr "П&уть запуска:" #: tfrmoptionstoolbar.lbltooltip.caption msgctxt "tfrmoptionstoolbar.lbltooltip.caption" msgid "&Tooltip:" msgstr "Подс&казка:" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "Тип кнопки" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSKEEPTERMINALOPEN.CAPTION" msgid "&Keep terminal window open after executing program" msgstr "&Не закрывать окно терминала после запуска программы" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSRUNINTERMINAL.CAPTION" msgid "&Execute in terminal" msgstr "&Запускать в терминале" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSUSEEXTERNALPROGRAM.CAPTION" msgid "&Use external program" msgstr "&Использовать внешнюю программу" #: tfrmoptionstoolbase.lbltoolsparameters.caption msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPARAMETERS.CAPTION" msgid "A&dditional parameters" msgstr "&Дополнительные параметры" #: tfrmoptionstoolbase.lbltoolspath.caption msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPATH.CAPTION" msgid "&Path to program to execute" msgstr "П&уть к программе" #: tfrmoptionstooltips.btnaddfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "&Добавить" #: tfrmoptionstooltips.btnapplyfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "П&рименить" #: tfrmoptionstooltips.btndeletefields.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "&Удалить" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr "" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Шаблон..." #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "Дополнительные поля по типам файлов" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "Показывать всплывающие подсказки" #: tfrmoptionstooltips.lblfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "Под&сказка:" #: tfrmoptionstooltips.lblfieldsmask.caption msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "&Маска:" #: tfrmoptionstooltips.lblfieldsname.caption msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "&Наименование:" #: tfrmoptionstooltips.rbtooltipallfiles.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "Д&ля всех файлов в файловой панели" #: tfrmoptionstooltips.rbtooltipnone.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "Н&е показывать" #: tfrmoptionstooltips.rbtooltiponlylarge.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "Дл&я файлов с именами не помещающимися на панели" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNBACKVIEWERCOLOR.CAPTION" msgid ">>" msgstr "" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNFONTVIEWERCOLOR.CAPTION" msgid ">>" msgstr "" #: tfrmoptionsviewer.gbviewerbookmode.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWERBOOKMODE.CAPTION" msgid "Viewer Book Mode" msgstr "Режим просмотра \"Книга\"" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWEREXAMPLE.CAPTION" msgid "Example" msgstr "Пример" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption msgctxt "TFRMOPTIONSVIEWER.LBLBACKGROUNDCOLORVIEWERBOOK.CAPTION" msgid "&Background color in book viewer" msgstr "&Цвет в фона " #: tfrmoptionsviewer.lblfontcolorviewerbook.caption msgctxt "TFRMOPTIONSVIEWER.LBLFONTCOLORVIEWERBOOK.CAPTION" msgid "&Font color in book viewer" msgstr "&Шрифт" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption msgctxt "TFRMOPTIONSVIEWER.LBLNUMBERCOLUMNSVIEWER.CAPTION" msgid "&Number of columns in book viewer" msgstr "&Кол-во колонок" #: tfrmpackdlg.btncancel.caption msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmpackdlg.btnconfig.caption msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "&Настроить" #: tfrmpackdlg.btnhelp.caption msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Помощ&ь" #: tfrmpackdlg.btnok.caption msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmpackdlg.caption msgctxt "TFRMPACKDLG.CAPTION" msgid "Pack files" msgstr "Упаковка файлов" #: tfrmpackdlg.cbcreateseparatearchives.caption msgid "C&reate separate archives, one per selected file/dir" msgstr "Отде&льные архивы для кажд&ого выбранного файла/каталога" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "Само&распаковывающийся архив" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "&Шифровать" #: tfrmpackdlg.cbmovetoarchive.caption msgid "Mo&ve to archive" msgstr "У&далить исходные файлы после упаковки" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "&Многотомный архив" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "" #: tfrmpackdlg.cbputintarfirst.caption msgid "P&ut in the TAR archive first" msgstr "Пр&едварительно упаковать в TAR архив" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "&Сохранять пути" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "Имя архива:" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr " Архиватор " #: tfrmpackinfodlg.btnclose.caption msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Закрыть" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "&Выполнить, распаковав все" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "Р&аспаковать и выполнить" #: tfrmpackinfodlg.caption msgctxt "TFRMPACKINFODLG.CAPTION" msgid "Properties of packed file" msgstr "Свойства упакованного файла" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "Атрибуты:" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "Коэффициент сжатия:" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "Дата:" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "Метод:" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "Исходный размер:" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "Файл:" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "Размер после сжатия:" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "Архиватор:" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "Время:" #: tfrmquicksearch.btncancel.caption msgctxt "tfrmquicksearch.btncancel.caption" msgid "X" msgstr "X" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "Закрыть панель фильтра" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "Текст для поиска или для фильтрации" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "Аа" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "Регистрозависимый" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "К" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "Каталоги" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "Ф" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "Файлы" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "{" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "Начало" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "}" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "Конец" #: tfrmquicksearch.tglfilter.caption msgctxt "tfrmquicksearch.tglfilter.caption" msgid "Filter" msgstr "Фильтр" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "Поиск или фильтр" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CANCELBUTTON.CAPTION" msgid "Cancel" msgstr "Отмена" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CLOSEBUTTON.CAPTION" msgid "&Close" msgstr "&Закрыть" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.HELPBUTTON.CAPTION" msgid "&Help" msgstr "Помощ&ь" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "tfrmselecttextrange.btppanel.okbutton.caption" msgid "&OK" msgstr "&ОК" #: tfrmselecttextrange.lblselecttext.caption msgid "&Select the characters to insert:" msgstr "Си&мволы для вставки" #: tfrmsetfileproperties.btncancel.caption msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmsetfileproperties.caption msgctxt "TFRMSETFILEPROPERTIES.CAPTION" msgid "Change attributes" msgstr "Изменить атрибуты" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Закрепляющий бит" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "Архивный" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "Создан:" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "Скрытый" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "Открыт:" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "Изменен:" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "Только для чтения" #: tfrmsetfileproperties.chkrecursive.caption msgid "Including subfolders" msgstr "Рекурсивно" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "Системный" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "Дата и время" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Атрибуты" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Атрибуты" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Биты:" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Группа" #: tfrmsetfileproperties.lblattrinfo.caption msgid "(gray field means unchanged value)" msgstr "(серое поле означает неизменяемое значение)" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Другие" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Владелец" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Текст:" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Выполнение" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Восьмеричный:" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Чтение" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Запись" #: tfrmsplitter.btncancel.caption msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "" #: tfrmsplitter.btnok.caption msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmsplitter.caption msgctxt "TFRMSPLITTER.CAPTION" msgid "Splitter" msgstr "Разбиение" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664B - 3.5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "Имя файла" #: tfrmsplitter.grbxsize.caption msgid "Size and number of parts" msgstr "Размер и кол-во частей" #: tfrmsplitter.lbdirtarget.caption msgid "Directory &target" msgstr "&Каталог назначения" #: tfrmsplitter.lbfilesource.caption msgid "File &source" msgstr "&Исходный файл" #: tfrmsplitter.lblnumberparts.caption msgid "&Number of parts" msgstr "Ко&л-во частей" #: tfrmsplitter.rbtngigab.caption msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "&Гигабайт" #: tfrmsplitter.rbtnkilob.caption msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "К&илобайт" #: tfrmsplitter.rbtnmegab.caption msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "&Мегабайт" #: tfrmsymlink.btncancel.caption msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmsymlink.caption msgid "Create symbolic link" msgstr "Создать симв. ссылку" #: tfrmsymlink.lblexistingfile.caption msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "&На что указывает" #: tfrmsymlink.lbllinktocreate.caption msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "&Имя ссылки" #: tfrmtweakplugin.btnadd.caption msgid "A&dd new" msgstr "&Добавить" #: tfrmtweakplugin.btncancel.caption msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "О&тмена" #: tfrmtweakplugin.btnchange.caption msgid "C&hange" msgstr "&Изменить" #: tfrmtweakplugin.btndefault.caption msgid "De&fault" msgstr "По умол&чанию" #: tfrmtweakplugin.btnok.caption msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmtweakplugin.btnremove.caption msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "&Удалить" #: tfrmtweakplugin.caption msgctxt "TFRMTWEAKPLUGIN.CAPTION" msgid "Tweak plugin" msgstr "Настройка плагина" #: tfrmtweakplugin.cbpk_caps_by_content.caption msgid "De&tect archive type by content" msgstr "Определяет тип ар&хива по содержимому" #: tfrmtweakplugin.cbpk_caps_delete.caption msgid "Can de&lete files" msgstr "Мо&жет удалять из архива" #: tfrmtweakplugin.cbpk_caps_encrypt.caption msgid "Supports e&ncryption" msgstr "Поддерживает &шифрование" #: tfrmtweakplugin.cbpk_caps_hide.caption msgid "Sho&w as normal files (hide packer icon)" msgstr "Пока&зывать как нормальные файлы (скрывать иконку архива)" #: tfrmtweakplugin.cbpk_caps_mempack.caption msgid "Supports pac&king in memory" msgstr "Поддерживает упа&ковку в памяти" #: tfrmtweakplugin.cbpk_caps_modify.caption msgid "Can &modify exisiting archives" msgstr "Может &модифицировать архивы" #: tfrmtweakplugin.cbpk_caps_multiple.caption msgid "&Archive can contain multiple files" msgstr "&Архив может содержать несколько файлов" #: tfrmtweakplugin.cbpk_caps_new.caption msgid "Can create new archi&ves" msgstr "Может &создавать архивы" #: tfrmtweakplugin.cbpk_caps_options.caption msgid "S&upports the options dialogbox" msgstr "Им&еет диалог настроек" #: tfrmtweakplugin.cbpk_caps_searchtext.caption msgid "Allow searchin&g for text in archives" msgstr "Поз&воляет искать в архивах" #: tfrmtweakplugin.lbldescription.caption msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "Опис&ание:" #: tfrmtweakplugin.lbldetectstr.caption msgid "D&etect string:" msgstr "Дете&кт строка:" #: tfrmtweakplugin.lblextension.caption msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "&Расширение:" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "Флаги:" #: tfrmtweakplugin.lblname.caption msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "&Имя:" #: tfrmtweakplugin.lblplugin.caption msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "&Плагин:" #: tfrmtweakplugin.lblplugin1.caption msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "&Плагин:" #: tfrmviewer.actabout.caption msgctxt "TFRMVIEWER.ACTABOUT.CAPTION" msgid "About Viewer..." msgstr "О просмотрщике..." #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "Показывает сообщение о..." #: tfrmviewer.actcopyfile.caption msgctxt "TFRMVIEWER.ACTCOPYFILE.CAPTION" msgid "Copy File" msgstr "Копировать файл" #: tfrmviewer.actcopyfile.hint msgctxt "TFRMVIEWER.ACTCOPYFILE.HINT" msgid "Copy File" msgstr "Копировать файл" #: tfrmviewer.actdeletefile.caption msgctxt "TFRMVIEWER.ACTDELETEFILE.CAPTION" msgid "Delete File" msgstr "Удалить файл" #: tfrmviewer.actdeletefile.hint msgctxt "TFRMVIEWER.ACTDELETEFILE.HINT" msgid "Delete File" msgstr "Удалить файл" #: tfrmviewer.actloadnextfile.caption msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.CAPTION" msgid "&Next" msgstr "&Следующий" #: tfrmviewer.actloadnextfile.hint msgid "Load Next File" msgstr "Загрузить следующий файл" #: tfrmviewer.actloadprevfile.caption msgctxt "TFRMVIEWER.ACTLOADPREVFILE.CAPTION" msgid "&Previous" msgstr "&Предыдущий" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "Загрузить предыдущий файл" #: tfrmviewer.actmirror.caption msgctxt "TFRMVIEWER.ACTMIRROR.CAPTION" msgid "Mirror" msgstr "Зеркально" #: tfrmviewer.actmirror.hint msgctxt "TFRMVIEWER.ACTMIRROR.HINT" msgid "Mirror" msgstr "Зеркально" #: tfrmviewer.actmovefile.caption msgctxt "TFRMVIEWER.ACTMOVEFILE.CAPTION" msgid "Move File" msgstr "Переместить файл" #: tfrmviewer.actmovefile.hint msgctxt "TFRMVIEWER.ACTMOVEFILE.HINT" msgid "Move File" msgstr "Переместить файл" #: tfrmviewer.actreload.caption msgctxt "TFRMVIEWER.ACTRELOAD.CAPTION" msgid "Reload" msgstr "Перезагрузить" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "Перезагрузить текущий файл" #: tfrmviewer.actrotate180.caption msgctxt "TFRMVIEWER.ACTROTATE180.CAPTION" msgid "Rotate 180" msgstr "Повернуть на 180" #: tfrmviewer.actrotate180.hint msgctxt "TFRMVIEWER.ACTROTATE180.HINT" msgid "Rotate 180" msgstr "Повернуть на 180" #: tfrmviewer.actrotate270.caption msgctxt "TFRMVIEWER.ACTROTATE270.CAPTION" msgid "Rotate 270" msgstr "Повернуть на 270" #: tfrmviewer.actrotate270.hint msgctxt "TFRMVIEWER.ACTROTATE270.HINT" msgid "Rotate 270" msgstr "Повернуть на 270" #: tfrmviewer.actrotate90.caption msgctxt "TFRMVIEWER.ACTROTATE90.CAPTION" msgid "Rotate 90" msgstr "Повернуть на 90" #: tfrmviewer.actrotate90.hint msgctxt "TFRMVIEWER.ACTROTATE90.HINT" msgid "Rotate 90" msgstr "Повернуть на 90" #: tfrmviewer.actsaveas.caption msgctxt "TFRMVIEWER.ACTSAVEAS.CAPTION" msgid "Save As..." msgstr "Сохранить как..." #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "Сохранить файл как..." #: tfrmviewer.actstretchimage.caption msgctxt "TFRMVIEWER.ACTSTRETCHIMAGE.CAPTION" msgid "Stretch" msgstr "Растянуть" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "Растянуть изображение" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "Копировать" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "Копировать" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "Обрезать" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "Удалить" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "Удалить" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "Развернуть на весь экран" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "Выделение" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "Зеркально" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "Переместить" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "Переместить" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "Рисование" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "Красные глаза" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "Изменить размер" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "Отменить" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "Увеличить" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "Уменьшить" #: tfrmviewer.caption msgctxt "tfrmviewer.caption" msgid "Viewer" msgstr "Внутренняя программа просмотра" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Слайд шоу" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "Карандаш" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "Выделение" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "Рисование" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Слайд шоу" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "Просмотреть" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "0x0" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "О программе..." #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "В &двоичном виде (фиксированная длина строки)" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "&Копировать в буфер" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Правка" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "&Кодировка" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "Вы&ход" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "&Файл" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "На весь экран" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "&Графика" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "В &шестнадцатеричном виде" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "&Рисунок" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "В виде &текста с колонками" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "Зеркально" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "Плагины" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "Предварительный просмотр" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "Печать..." #: tfrmviewer.mirotate.caption msgid "Rotate" msgstr "Повернуть" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "Сохранить" #: tfrmviewer.misaveas.caption msgctxt "TFRMVIEWER.MISAVEAS.CAPTION" msgid "Save As..." msgstr "Сохранить как..." #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "Скриншот" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "&Найти..." #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "Найти далее" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "Найти предыдущий" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "Выделить &всё" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "" #: tfrmviewer.mistretch.caption msgctxt "TFRMVIEWER.MISTRETCH.CAPTION" msgid "Stretch" msgstr "&Растянуть" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "В виде &текста" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "&Вид" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "В виде текста с &разрывами строк" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "Увеличить" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "Уменьшить" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "&Копировать в буфер" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "Выделить &всё" #: tfrmviewoperations.btnstartpause.caption msgctxt "tfrmviewoperations.btnstartpause.caption" msgid "&Start" msgstr "&Старт" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "Сто&п" #: tfrmviewoperations.caption msgctxt "TFRMVIEWOPERATIONS.CAPTION" msgid "File operations" msgstr "Файловые операции" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "Всегда сверху" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "\"drag && drop\" для перемещения операций между потоками" #: tfrmviewoperations.mnucanceloperation.caption msgctxt "tfrmviewoperations.mnucanceloperation.caption" msgid "Cancel" msgstr "Отмена" #: tfrmviewoperations.mnucancelqueue.caption msgctxt "tfrmviewoperations.mnucancelqueue.caption" msgid "Cancel" msgstr "Отмена" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "Новая очередь" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "tfrmviewoperations.mnuoperationshowdetached.caption" msgid "Show in detached window" msgstr "Показать в отдельном окне" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "В начало очереди" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "В конец очереди" #: tfrmviewoperations.mnuqueue.caption msgctxt "tfrmviewoperations.mnuqueue.caption" msgid "Queue" msgstr "Очередь" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "Убрать из очереди" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "Очередь 1" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "Очередь 2" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "Очередь 3" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "Очередь 4" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "Очередь 5" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "tfrmviewoperations.mnuqueueshowdetached.caption" msgid "Show in detached window" msgstr "Показать в отдельном окне" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "&Пауза (для всех)" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "tmultiarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Если файл существует" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "twcxarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Если файл существует" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "Работать в фоне (отдельное соединение)" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Если файл существует" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "Отменить быстрый фильтр" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "Отменить текущую операцию" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "Буфер омена не содержит данных панели инструментов" #: ulng.rscolattr msgid "Attr" msgstr "Атриб" #: ulng.rscoldate msgid "Date" msgstr "Дата" #: ulng.rscolext msgid "Ext" msgstr "Тип" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "Имя" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "Размер" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "Число изменений:" #: ulng.rsconfcolalign msgid "Align" msgstr "Выравн." #: ulng.rsconfcolcaption msgid "Caption" msgstr "Заголовок" #: ulng.rsconfcolconfig msgid "Config" msgstr "Настройка" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "Удалить" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "Содержимое поля данных" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "Переместить" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "Ширина" #: ulng.rsconfcustheader msgid "Customize column" msgstr "Настроить колонку: " #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "Копия (%d) %s" #: ulng.rsdlgallopcomplete msgid "All operations completed" msgstr "Все операции завершены" #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "Прогресс выполнения %d %%" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "Пр&ервать" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "&Все" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "&Добавить" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "О&тмена" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "&Продолжить" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "&Копировать в" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "К&опировать в (для всех)" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "&Выйти из программы" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "И&гнорировать всех" #: ulng.rsdlgbuttonno msgid "&No" msgstr "&Нет" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "&Ни одного" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "&OK" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "&Переписать" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "Переписать &все" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "Заменить более &старые" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "П&родолжить" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "Пов&торить" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "&Пропустить" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "Проп&устить Все" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "&Да" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "Посчитать файлы и каталоги" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "Посчитать контрольные суммы..." #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "Проверить контрольные суммы..." #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "Копировать файл(ы)" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "Удалить файл(ы)" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "Переместить файл(ы)" #: ulng.rsdlgoppause msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "Па&уза" #: ulng.rsdlgopstart msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "&Старт" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "Очередь" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "Скорость %s/с" #: ulng.rsdlgspeedtime msgid "Speed %s/s, time remaining %s" msgstr "Скорость %s/с, осталось времени %s" #: ulng.rsdlgsplit msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "Разбиение" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "Стереть файл(ы)" #: ulng.rsdrivenolabel msgid "" msgstr "<нет метки>" #: ulng.rsdrivenomedia msgid "" msgstr "<нет носителя>" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Встроенный редактор Double Commander." #: ulng.rseditnewfile msgid "new.txt" msgstr "новый.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "Имя файла:" #: ulng.rseditnewopen msgid "Open file" msgstr "Открыть файл" #: ulng.rseditsearchback msgid "&Backward" msgstr "&Назад" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "Найти..." #: ulng.rseditsearchfrw msgid "&Forward" msgstr "&Вперед" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "Заменить" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "Спрашивать;Перезаписывать;Копировать в;Пропускать" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "Спрашивать;Перезаписывать;Перезаписывать более старые;Пропускать" #: ulng.rsfileopsetpropertyerroroptions msgctxt "ulng.rsfileopsetpropertyerroroptions" msgid "Ask;Don't set anymore;Ignore errors" msgstr "Спрашивать;Никогда не устанавливать;Игнорировать" #: ulng.rsfilterstatus msgid "FILTER" msgstr "ФИЛЬТР" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "Задать шаблон" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "Число уровней: %s" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "Все (неограниченная)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "Только текущий" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "Каталог %s не существует!" #: ulng.rsfindfound msgid "Found: %d" msgstr "Найдено: %d" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "Сохранить поисковый шаблон" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "Наименование шаблона:" #: ulng.rsfindscanned msgid "Scanned: %d" msgstr "Просмотрено: %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "Сканирование" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "Поиск файлов" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "Начинать у" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr "Свободно %s из %s байт" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "%s байт свободно" #: ulng.rsfuncatime msgid "Access date/time" msgstr "Дата/время последнего доступа" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "Атрибуты" #: ulng.rsfunccomment msgctxt "ulng.rsfunccomment" msgid "Comment" msgstr "Комментарий" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "Сжатый размер" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "Дата/время создания" #: ulng.rsfuncext msgid "Extension" msgstr "Расширение" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "Группа" #: ulng.rsfunclinkto msgid "Link to" msgstr "Ссылка на" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "Дата/время модификации" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "Имя" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "Имя без расширения" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "Владелец" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "Путь" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "Размер" #: ulng.rsfunctype msgid "Type" msgstr "Тип" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "Ошибка создания жёсткой ссылки." #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "Диалог копир./перем." #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "Поиск различий" #: ulng.rshotkeycategorymain msgid "Main" msgstr "Основной" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "Внутренняя программа просмотра" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "Сборка завершена" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "Маска снятия выбора" #: ulng.rsmarkplus msgid "Select mask" msgstr "Маска выбора" #: ulng.rsmaskinput msgid "Input mask:" msgstr "Укажите маску файлов (разделитель - ';'):" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "Настроить наборы колонок" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "Настроить текущий набор колонок" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "Команды" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "Редактировать" #: ulng.rsmnueject msgid "Eject" msgstr "Извлечь" #: ulng.rsmnumount msgid "Mount" msgstr "Смонтировать" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "Создать" #: ulng.rsmnunomedia msgid "No media available" msgstr "Недоступно устройство" #: ulng.rsmnuopenwith #| msgid "Open with ..." msgid "Open with" msgstr "Открыть с помощью" #: ulng.rsmnuopenwithother msgid "Other..." msgstr "Другое..." #: ulng.rsmnusortby msgid "Sort by" msgstr "Упор&ядочить по" #: ulng.rsmnuumount msgid "Unmount" msgstr "Отмонтировать" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "Просмотреть" #: ulng.rsmsgaccount msgid "Account:" msgstr "Учетная запись:" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "Дополнительные параметры командной строки архиватора:" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "Нельзя скопировать/переместить файл \"%s\" сам в себя!" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "Нельзя удалить каталог %s" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "Переход в каталог [%s] не удался!" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "Закрыть все неактивные вкладки?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "Вкладка (%s) заблокирована! Закрыть?" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "Вы уверены что хотите выйти?" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "Копировать %d выбранных файлов/каталогов?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "Копировать выделенное \"%s\"?" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "Удалить частично скопированный файл?" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "Удалить %d выбранных файлов/каталогов?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "Удалить %d выбранных файлов/каталогов в корзину?" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "Удалить выбранный \"%s\"?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "Удалить выбранный \"%s\" в корзину?" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "Не могу удалить \"%s\" в корзину! Удалить совсем?" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "Диск недоступен" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "Введите расширение:" #: ulng.rsmsgentername msgid "Enter name:" msgstr "Введите имя:" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "Контрольная сумма не совпадает, архив повреждён." #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "Данные повреждены" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "Не могу соединиться с сервером: \"%s\"" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "Не могу копировать файл из %s в %s" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "Уже существует каталог с именем \"%s\"." #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "Дата %s не поддерживается" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "Каталог %s существует!" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "Прервано пользователем." #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "Не могу закрыть файл" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "Не могу создать файл" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "В архиве нет больше файлов" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "Не могу открыть файл" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "Ошибка чтения из файла" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "Ошибка записи в файл" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "Не могу создать каталог %s!" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "Некорректная ссылка" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "Файлы не найдены" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "Недостаточно памяти" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "Функция не поддерживается!" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "Ошибка в команде контекстного меню" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "Ошибка при загрузке конфигурации" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "Ошибка синтаксиса в регулярном выражении!" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "Невозможно переименовать файл %s в %s" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "Не могу сохранить ассоциацию!" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "Невозможно сохранить файл" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "Невозможно установить атрибуты для \"%s\"" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "Невозможно установить дату/время для \"%s\"" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "Не могу установить владельца/группу для \"%s\"" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "Буфер слишком маленький" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "Слишком много файлов" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "Архив повреждён или имеет неизвестный формат." #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "Файл %s изменён, сохранить?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "Файл %s существует, переписать?" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "Активные файловые операции" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "Некоторые операции еще не завершены. Закрытие Double Commander может привести к потере данных." #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "Файл %s помечен как доступный только для чтения. Удалить?" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "Размер файла \"%s\" слишком большой для файловой системы получателя!" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "Каталог %s существует, переписать?" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "Следовать ссылке \"%s\"?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "Ошибка в командной строке" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "Некорректное имя файла" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "Неверный формат файла конфигурации" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "Некорректный путь" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "Путь %s содержит запрещенные симаолы" #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "Этот файл не является корректным плагином!" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "Этот плагин собран для Double Commander для %s.%sОн не может работать с Double Commander для %s!" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "Неверное цитирование" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "Некорректное выделение." #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "Загрузка списка файлов..." #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "Копирование файла %s" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "Удаление файла %s" #: ulng.rsmsglogerror msgid "Error: " msgstr "Ошибка: " #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "Распаковка файла %s" #: ulng.rsmsgloginfo msgid "Info: " msgstr "Информация: " #: ulng.rsmsgloglink msgid "Create link %s" msgstr "Создание ссылки %s" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "Создание каталога %s" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "Перемещение файла %s" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "Упаковка в файл %s" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "Удаление каталога %s" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "Выполнено: " #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "Создание символьной ссылки %s" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "Проверка целостности файла %s" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "Добавить избранный каталог" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "Редактировать избранный каталог" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "Введите имя и путь (формат имя=путь):" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "Мастер пароль:" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "Введите мастер пароль:" #: ulng.rsmsgnewfile msgid "New file" msgstr "Новый файл" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "Следующий том будет распакован" #: ulng.rsmsgnofiles msgid "No files" msgstr "Нет файлов" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "Нет выделенных файлов." #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "Недостаточно места на получателе. Продолжить?" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "Недостаточно места на получателе. Повторить?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "Не могу удалить файл %s" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "Не реализовано." #: ulng.rsmsgpassword msgid "Password:" msgstr "Пароль:" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "Пароли отличаются!" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "Введите пароль:" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "Пароль (Firewall):" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "Повторите ввод пароля:" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "&Добавить %s" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "&Настроить" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "&Удалить %s" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "Шаблон \"%s\" существует. Перезаписать?" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "Переименовать/переместить %d выбранных файлов/каталогов?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "Переименовать/переместить выбранный \"%s\"?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "Перезапустите Double Commander для применения изменений" #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "Выделено: %s из %s, файлов: %d из %d, каталогов: %d из %d" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "Необходимо выбрать только файлы контрольных сумм!" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "Укажите путь к следующему тому" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "Изменение метки диска" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "Переименовать вкладку" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "Новое имя вкладки:" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "Путь назначения:" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "Название нового элемента меню:" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "Выделено слишком много файлов" #: ulng.rsmsgurl msgid "URL:" msgstr "URL:" #: ulng.rsmsgusername msgid "User name:" msgstr "Имя пользователя:" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "Имя пользователя (Firewall):" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "Метка диска:" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "Введите размер тома:" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "Стереть %d выбранных файлов/каталогов?" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "Стереть выбранный \"%s\"?" #: ulng.rsmulrenfilenamestylelist #| msgid "No change;UPPERCASE;lowercase;First Char Big;" msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "Без изменений;ПРОПИСНЫЕ;строчные;С прописной;Каждое Слово С Прописной;" #: ulng.rsoperaborted msgid "Aborted" msgstr "Прервано" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "Вычисление контрольной суммы" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "Вычисление контрольной суммы \"%s\"" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "Вычисление контрольной суммы \"%s\"" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "Подсчет" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "Вычисление \"%s\"" #: ulng.rsopercombining msgid "Joining" msgstr "Объединение" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "Объединение файлов \"%s\" в \"%s\"" #: ulng.rsopercopying msgid "Copying" msgstr "Копирование" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "Копирование из \"%s\" в \"%s\"" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "Копирование \"%s\" в \"%s\"" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "Создание каталога" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "Создание каталога \"%s\"" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "Удаление" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "Удаление в \"%s\"" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "Удаление \"%s\"" #: ulng.rsoperexecuting msgid "Executing" msgstr "Выполнение" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "Выполнение \"%s\"" #: ulng.rsoperextracting msgid "Extracting" msgstr "Распаковка" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "Распаковка из \"%s\" в \"%s\"" #: ulng.rsoperfinished msgid "Finished" msgstr "Завершено" #: ulng.rsoperlisting msgid "Listing" msgstr "Список" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "Список \"%s\"" #: ulng.rsopermoving msgid "Moving" msgstr "Перемещение" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "Перемещение из \"%s\" в \"%s\"" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "Перемещение \"%s' в \"%s\"" #: ulng.rsopernotstarted msgid "Not started" msgstr "Не запущено" #: ulng.rsoperpacking msgid "Packing" msgstr "Упаковка" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "Упаковка из \"%s\" в \"%s\"" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "Упаковка \"%s\" в \"%s\"" #: ulng.rsoperpaused msgid "Paused" msgstr "На паузе" #: ulng.rsoperpausing msgid "Pausing" msgstr "Установка на паузу" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "В очереди" #: ulng.rsoperrunning msgid "Running" msgstr "Выполняется" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "Установка свойства" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "" #: ulng.rsopersplitting msgid "Splitting" msgstr "Разрезка" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "Разрезка \"%s\" в \"%s\"" #: ulng.rsoperstarting msgid "Starting" msgstr "Запускается" #: ulng.rsoperstopped msgid "Stopped" msgstr "Остановлено" #: ulng.rsoperstopping msgid "Stopping" msgstr "Останавливается" #: ulng.rsopertesting msgid "Testing" msgstr "Проверка" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "Проверка в \"%s\"" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "Проверка \"%s\"" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "Проверка контрольной суммы" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "Проверка контрольной суммы в \"%s'" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "Проверка контрольной суммы из \"%s\"" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "Ожидание ответа источника" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "Ожидание ответа от пользователя" #: ulng.rsoperwiping msgid "Wiping" msgstr "Стирание" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "Стирание в \"%s\"" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "Стирание \"%s\"" #: ulng.rsoperworking msgid "Working" msgstr "Работа" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "Удалить:" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "Распаковать не учитывая пути:" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "Режим разбора формата:" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "ID:" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "ID Position:" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "ID Seek Range:" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "Параметр" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "Строка запроса пароля:" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "Создать самораспаковывающийся архив:" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "Проверить:" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "Наименование типа архива:" #: ulng.rsoptarchivevalue msgid "Value" msgstr "Значение" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "Связать плагин \"%s\" с расширением:" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "Первой;Последней;" #: ulng.rsoptdisable msgid "Disable" msgstr "Отключить" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "Включить" #: ulng.rsoptenterext msgid "Enter extension" msgstr "Введите расширение" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "Курсор" #: ulng.rsoptexamplemark msgid "Mark" msgstr "Выделение" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "Выделение + Курсор" #: ulng.rsoptexampletext msgid "Text" msgstr "Текст" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "отдельное окно;минимизировать отдельное окно;панель операций" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "плавающий;B;K;M;G" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "" #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "Добавить горячую клавишу для %s" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "Добавить сочетание" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "Невозможно установить сочетание" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "Изменить сочетание" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "Команда" #: ulng.rsopthotkeysdeletetrashcanoverrides msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "Описание" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "Редактировать горячую клавишу для %s" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "Горячая клавиша" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "Горячие клавиши" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "<нет>" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "Параметры" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "Установить сочетание для удаления файла" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "" #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "Горячая клавиша уже используется" #: ulng.rsopthotkeysshortcutusedtext1 msgid "Shortcut %s is already used." msgstr "Горячая клавиша %s уже используется." #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "Изменить на %s?" #: ulng.rsopthotkeysusedby msgid "used for %s in %s" msgstr "используется для %s в %s" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "Архиваторы" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "Автообновление" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "Поведение" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "Цвета" #: ulng.rsoptionseditorcolumnsview msgctxt "ulng.rsoptionseditorcolumnsview" msgid "Columns" msgstr "Колонки" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "Конфигурация" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "Настраиваемые столбцы" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "Перетаскивание" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "Кнопка списка дисков" #: ulng.rsoptionseditorfileoperations msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "Файловые операции" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "Файловые панели" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "Просмотр файлов" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "Типы файлов" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "Вкладки каталогов" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "Шрифты" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "Подсветка" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "Горячие клавиши" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "Значки" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "Список исключений" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "Клавиши" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "Язык" #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "Вид окна" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "Протокол" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "Разное" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "Мышь" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "Плагины" #: ulng.rsoptionseditorquicksearch msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "Быстрый поиск/фильтр" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "Терминал" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "Панель инструментов" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "Инструменты" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "Подсказки" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "Нет;Командная строка;Быстрый поиск;Быстрый фильтр" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "Левая клавиша;Правая клавиша;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "сверху списка файлов;после каталогов (если каталоги отсортированы перед файлами);в отсортированной позиции;внизу списка файлов" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "Плагин %s уже назначен для следующих расширений:" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "Состояние" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "Имя файла" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "Имя" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "Ассоциация" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "&Чувствителен;Н&е чувствителен" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "&Файлы;Катало&ги;Ф&айлы и каталоги" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "Ск&рывать панель фильтра, когда она не в фокусе" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "не чувствителен к регистру;соответственно локальным установкам (аАбБгГ);сначала верхний регистр, потом нижний (АБВабв)" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "сортировать по имени и показывать первым;сортировать как файлы и показывать первым;сортировать как файлы" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "Алфавитная, с учётом особенностей языка;Естественная сортировка: алфавитно-числовая" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "Вверху;Внизу;" #: ulng.rsopttoolbarbuttontype msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "Разд&елитель;Внутрення&я команда;Вне&шняя команда;Мен&ю" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "не менять позицию;использовать те же установки, как для новых файлов;в отсортированной позиции" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "Файлов: %d, папок: %d" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "Не могу изменить права доступа для \"%s\"" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "Не могу изменить владельца для \"%s\"" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "Файл" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "Каталог" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "Именованный канал" #: ulng.rspropsno msgid "No" msgstr "Нет" #: ulng.rspropssocket msgid "Socket" msgstr "Сокет" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "Особое блочное устройство" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "Особое символьное устройство" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "Символьная ссылка" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "Неизвестный тип" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "Да (%s)" #: ulng.rssearchresult msgid "Search result" msgstr "Результаты поиска" #: ulng.rssearchtemplateunnamed msgid "" msgstr "<безымянный шаблон>" #: ulng.rsselectdir msgid "Select a directory" msgstr "Выберите каталог" #: ulng.rsshowhelpfor msgid "&Show help for %s" msgstr "Показать помощ&ь для %s" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "Байт" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "Гигабайт" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "Килобайт" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "Мегабайт" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "Терабайт" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "Файлов: %d, Каталогов: %d, Размер: %s (%s байт)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "Не могу создать каталог назначения!" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "Неправильный размер файла" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "Не могу разрезать файл!" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "Количество частей больше 100! Продолжить?" #: ulng.rssplitseldir msgid "Select directory:" msgstr "Выберите каталог:" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "Ошибка создания симв. ссылки." #: ulng.rssyndefaulttext msgctxt "ulng.rssyndefaulttext" msgid "Default text" msgstr "Текст по умолчанию" #: ulng.rssynlangplaintext msgctxt "ulng.rssynlangplaintext" msgid "Plain text" msgstr "Простой текст" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "Дня (дней)" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "Часа(ов)" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "Минуты (минут)" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "Месяца(ев)" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "Секунды (секунд)" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "Недели (недель)" #: ulng.rstimeunityear msgid "Year(s)" msgstr "Года (лет)" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "Поиск различий" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "Редактор" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "Терминал" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "Внутренняя программа просмотра" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "Пожалуйста сообщите о данной ошибке на багтрекер с описанием того что вы делали и следующим файлом:%sНажмите %s для продолжения работы или %s для выхода из программы." #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "Сеть" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "Внутренняя программа просмотра Double Commander" #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "Кодировка" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "%s не найден!" doublecmd-0.5.8/language/doublecmd.po0000644000175000017500000052620412250633131016574 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.5 alpha\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-01-17 23:08+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Full Name \n" "Language-Team: Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: English\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "" #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "" #: tfcolumnssetconf.cbcursorborder.caption msgid "Cursor border" msgstr "" #: tfcolumnssetconf.cbovercolor.caption msgid "Allow Overcolor" msgstr "" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "" #: tfcolumnssetconf.lblconfigviewnr.caption msgid "Configure view nr:" msgstr "" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption msgid "C&heck free space" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption msgid "Cop&y attributes" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption msgid "Copy o&wnership" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption msgid "Copy d&ate/time" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption msgid "Correct lin&ks" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption msgid "E&xclude empty directories" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption msgid "Fo&llow links" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "" #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption msgid "When dir&ectory exists" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption msgid "When ca&nnot set property" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "" #: tfrmabout.btnclose.caption msgctxt "TFRMABOUT.BTNCLOSE.CAPTION" msgid "&Close" msgstr "" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "" #: tfrmabout.lblbuild.caption msgid "Build" msgstr "" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "" #: tfrmabout.lblversion.caption msgid "Version" msgstr "" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "" #: tfrmattributesedit.cbarchive.caption msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "" #: tfrmattributesedit.cbcompressed.caption msgid "Co&mpressed" msgstr "" #: tfrmattributesedit.cbdirectory.caption msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "" #: tfrmattributesedit.cbencrypted.caption msgid "&Encrypted" msgstr "" #: tfrmattributesedit.cbhidden.caption msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "" #: tfrmattributesedit.cbreadonly.caption msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "" #: tfrmattributesedit.cbsparse.caption msgid "S&parse" msgstr "" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "" #: tfrmattributesedit.cbsymlink.caption msgid "&Symlink" msgstr "" #: tfrmattributesedit.cbsystem.caption msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "" #: tfrmattributesedit.cbtemporary.caption msgid "&Temporary" msgstr "" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "" #: tfrmattributesedit.lbltextattrs.caption msgid "As te&xt:" msgstr "" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "" #: tfrmchecksumcalc.btncancel.caption msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfrmchecksumcalc.caption msgctxt "TFRMCHECKSUMCALC.CAPTION" msgid "Calculate check sum..." msgstr "" #: tfrmchecksumcalc.cbseparatefile.caption msgid "C&reate separate checksum file for each file" msgstr "" #: tfrmchecksumcalc.lblsaveto.caption msgid "&Save check sum file(s) to:" msgstr "" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "" #: tfrmconnectionmanager.btnadd.caption msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "" #: tfrmconnectionmanager.btncancel.caption msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmconnectionmanager.btnconnect.caption msgid "C&onnect" msgstr "" #: tfrmconnectionmanager.btndelete.caption msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "" #: tfrmconnectionmanager.btnedit.caption msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "" #: tfrmcopydlg.btnaddtoqueue.caption msgid "A&dd To Queue" msgstr "" #: tfrmcopydlg.btncancel.caption msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "TFRMCOPYDLG.BTNCREATESPECIALQUEUE.CAPTION" msgid "..." msgstr "" #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "" #: tfrmcopydlg.btnsaveoptions.caption msgid "Sa&ve these options as default" msgstr "" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "" #: tfrmdescredit.btncancel.caption msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "" #: tfrmdescredit.lbleditcommentfor.caption msgid "E&dit comment for:" msgstr "" #: tfrmdescredit.lblencoding.caption msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "" #: tfrmdiffer.actexit.caption msgctxt "TFRMDIFFER.ACTEXIT.CAPTION" msgid "E&xit" msgstr "" #: tfrmdiffer.actfirstdifference.caption msgctxt "TFRMDIFFER.ACTFIRSTDIFFERENCE.CAPTION" msgid "First Difference" msgstr "" #: tfrmdiffer.actfirstdifference.hint msgctxt "TFRMDIFFER.ACTFIRSTDIFFERENCE.HINT" msgid "First Difference" msgstr "" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "" #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "" #: tfrmdiffer.actlastdifference.caption msgctxt "TFRMDIFFER.ACTLASTDIFFERENCE.CAPTION" msgid "Last Difference" msgstr "" #: tfrmdiffer.actlastdifference.hint msgctxt "TFRMDIFFER.ACTLASTDIFFERENCE.HINT" msgid "Last Difference" msgstr "" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "" #: tfrmdiffer.actnextdifference.caption msgctxt "TFRMDIFFER.ACTNEXTDIFFERENCE.CAPTION" msgid "Next Difference" msgstr "" #: tfrmdiffer.actnextdifference.hint msgctxt "TFRMDIFFER.ACTNEXTDIFFERENCE.HINT" msgid "Next Difference" msgstr "" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "" #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "" #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "" #: tfrmdiffer.actprevdifference.caption msgctxt "TFRMDIFFER.ACTPREVDIFFERENCE.CAPTION" msgid "Previous Difference" msgstr "" #: tfrmdiffer.actprevdifference.hint msgctxt "TFRMDIFFER.ACTPREVDIFFERENCE.HINT" msgid "Previous Difference" msgstr "" #: tfrmdiffer.actreload.caption msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "" #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "" #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "" #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "" #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "" #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "" #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "" #: tfrmdiffer.caption msgctxt "TFRMDIFFER.CAPTION" msgid "Compare files" msgstr "" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.miencodingleft.caption msgid "&Left" msgstr "" #: tfrmdiffer.miencodingright.caption msgid "&Right" msgstr "" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "" #: tfrmdiffer.mnuedit.caption msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "" #: tfrmdiffer.mnuencoding.caption msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "" #: tfrmdiffer.mnufile.caption msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "" #: tfrmdiffer.mnuoptions.caption msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "" #: tfrmedithotkey.btncancel.caption msgctxt "TFRMEDITHOTKEY.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmedithotkey.btnok.caption msgctxt "TFRMEDITHOTKEY.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "" #: tfrmedithotkey.cghkcontrols.caption msgctxt "TFRMEDITHOTKEY.CGHKCONTROLS.CAPTION" msgid "Only for these controls" msgstr "" #: tfrmedithotkey.lblparameters.caption msgid "&Parameters (each in a separate line):" msgstr "" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "" #: tfrmeditor.actabout.hint msgctxt "TFRMEDITOR.ACTABOUT.HINT" msgid "About" msgstr "" #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "" #: tfrmeditor.actconfhigh.hint msgctxt "TFRMEDITOR.ACTCONFHIGH.HINT" msgid "Configuration" msgstr "" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "" #: tfrmeditor.acteditcopy.hint msgctxt "TFRMEDITOR.ACTEDITCOPY.HINT" msgid "Copy" msgstr "" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "" #: tfrmeditor.acteditcut.hint msgctxt "TFRMEDITOR.ACTEDITCUT.HINT" msgid "Cut" msgstr "" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "" #: tfrmeditor.acteditdelete.hint msgctxt "TFRMEDITOR.ACTEDITDELETE.HINT" msgid "Delete" msgstr "" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "" #: tfrmeditor.acteditfind.hint msgctxt "TFRMEDITOR.ACTEDITFIND.HINT" msgid "Find" msgstr "" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "" #: tfrmeditor.acteditfindnext.hint msgctxt "TFRMEDITOR.ACTEDITFINDNEXT.HINT" msgid "Find next" msgstr "" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcr.hint msgctxt "TFRMEDITOR.ACTEDITLINEENDCR.HINT" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "TFRMEDITOR.ACTEDITLINEENDCRLF.HINT" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditlineendlf.hint msgctxt "TFRMEDITOR.ACTEDITLINEENDLF.HINT" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "" #: tfrmeditor.acteditpaste.hint msgctxt "TFRMEDITOR.ACTEDITPASTE.HINT" msgid "Paste" msgstr "" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "" #: tfrmeditor.acteditredo.hint msgctxt "TFRMEDITOR.ACTEDITREDO.HINT" msgid "Redo" msgstr "" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "" #: tfrmeditor.acteditrplc.hint msgctxt "TFRMEDITOR.ACTEDITRPLC.HINT" msgid "Replace" msgstr "" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "" #: tfrmeditor.acteditselectall.hint msgctxt "TFRMEDITOR.ACTEDITSELECTALL.HINT" msgid "Select All" msgstr "" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "" #: tfrmeditor.acteditundo.hint msgctxt "TFRMEDITOR.ACTEDITUNDO.HINT" msgid "Undo" msgstr "" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "" #: tfrmeditor.actfileclose.hint msgctxt "TFRMEDITOR.ACTFILECLOSE.HINT" msgid "Close" msgstr "" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "" #: tfrmeditor.actfilenew.hint msgctxt "TFRMEDITOR.ACTFILENEW.HINT" msgid "New" msgstr "" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "" #: tfrmeditor.actfileopen.hint msgctxt "TFRMEDITOR.ACTFILEOPEN.HINT" msgid "Open" msgstr "" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "" #: tfrmeditor.actfilesave.hint msgctxt "TFRMEDITOR.ACTFILESAVE.HINT" msgid "Save" msgstr "" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "" #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "" #: tfrmeditor.caption msgctxt "TFRMEDITOR.CAPTION" msgid "Editor" msgstr "" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "" #: tfrmeditor.n5.caption msgctxt "TFRMEDITOR.N5.CAPTION" msgid "-" msgstr "" #: tfrmeditsearchreplace.btncancel.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "" #: tfrmeditsearchreplace.cbsearchfromcursor.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "" #: tfrmextractdlg.btncancel.caption msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmextractdlg.btnhelp.caption msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "" #: tfrmextractdlg.btnok.caption msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfrmextractdlg.caption msgctxt "TFRMEXTRACTDLG.CAPTION" msgid "Unpack files" msgstr "" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "" #: tfrmextractdlg.cboverwrite.caption msgid "O&verwrite existing files" msgstr "" #: tfrmextractdlg.lblextractto.caption msgid "To the &directory:" msgstr "" #: tfrmextractdlg.lblfilemask.caption msgid "&Extract files matching file mask:" msgstr "" #: tfrmextractdlg.lblpassword.caption msgid "&Password for encrypted files:" msgstr "" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "" #: tfrmfileassoc.btnaddext.caption msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "" #: tfrmfileassoc.btnaddnewtype.caption msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "" #: tfrmfileassoc.btncancel.caption msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmfileassoc.btndownact.caption msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfrmfileassoc.btnremoveact.caption msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "" #: tfrmfileassoc.btnremoveext.caption msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "" #: tfrmfileassoc.btnremovetype.caption msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "" #: tfrmfileassoc.btnrenametype.caption msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "" #: tfrmfileassoc.btnupact.caption msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "" #: tfrmfileassoc.caption msgid "File associations" msgstr "" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "" #: tfrmfileexecuteyourself.caption msgctxt "TFRMFILEEXECUTEYOURSELF.CAPTION" msgid "Wait..." msgstr "" #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "" #: tfrmfileop.btncancel.caption msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "" #: tfrmfileop.lblto.caption msgid "To:" msgstr "" #: tfrmfileproperties.btnclose.caption msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "" #: tfrmfileproperties.caption msgctxt "TFRMFILEPROPERTIES.CAPTION" msgid "Properties" msgstr "" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "" #: tfrmfileproperties.lblattrtextstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "" #: tfrmfileproperties.lblcontains.caption msgctxt "TFRMFILEPROPERTIES.LBLCONTAINS.CAPTION" msgid "???" msgstr "" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "" #: tfrmfileproperties.lblgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "" #: tfrmfileproperties.lblownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "" #: tfrmfileproperties.lblsymlinkstr.caption msgid "Symlink to:" msgstr "" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "" #: tfrmfileproperties.lbltypestr.caption msgid "Type:" msgstr "" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "" #: tfrmfinddlg.btnedit.caption msgctxt "TFRMFINDDLG.BTNEDIT.CAPTION" msgid "&Edit" msgstr "" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "" #: tfrmfinddlg.btnlastsearch.caption msgctxt "TFRMFINDDLG.BTNLASTSEARCH.CAPTION" msgid "&Last search" msgstr "" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "" #: tfrmfinddlg.btnsavetemplate.caption msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption msgid "Sa&ve with \"Start in directory\"" msgstr "" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "" #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "" #: tfrmfinddlg.btnstop.caption msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "" #: tfrmfinddlg.caption msgctxt "TFRMFINDDLG.CAPTION" msgid "Find files" msgstr "" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "" #: tfrmfinddlg.cbdatefrom.caption msgid "&Date from:" msgstr "" #: tfrmfinddlg.cbdateto.caption msgid "Dat&e to:" msgstr "" #: tfrmfinddlg.cbfilesizefrom.caption msgid "S&ize from:" msgstr "" #: tfrmfinddlg.cbfilesizeto.caption msgid "Si&ze to:" msgstr "" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "" #: tfrmfinddlg.cbfollowsymlinks.caption msgctxt "TFRMFINDDLG.CBFOLLOWSYMLINKS.CAPTION" msgid "Follow s&ymlinks" msgstr "" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "" #: tfrmfinddlg.cbnotolderthan.caption msgid "N&ot older than:" msgstr "" #: tfrmfinddlg.cbpartialnamesearch.caption msgid "Searc&h for part of file name" msgstr "" #: tfrmfinddlg.cbregexp.caption msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "" #: tfrmfinddlg.cbreplacetext.caption msgid "Re&place by" msgstr "" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "" #: tfrmfinddlg.cbtimefrom.caption msgid "&Time from:" msgstr "" #: tfrmfinddlg.cbtimeto.caption msgid "Ti&me to:" msgstr "" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "" #: tfrmfinddlg.gbdirectories.caption msgctxt "TFRMFINDDLG.GBDIRECTORIES.CAPTION" msgid "Directories" msgstr "" #: tfrmfinddlg.gbfiles.caption msgctxt "TFRMFINDDLG.GBFILES.CAPTION" msgid "Files" msgstr "" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "" #: tfrmfinddlg.lblattributes.caption msgctxt "TFRMFINDDLG.LBLATTRIBUTES.CAPTION" msgid "Attri&butes" msgstr "" #: tfrmfinddlg.lblencoding.caption msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "" #: tfrmfinddlg.lblfindpathstart.caption msgid "Start in &directory" msgstr "" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "" #: tfrmfinddlg.tsplugins.caption msgctxt "TFRMFINDDLG.TSPLUGINS.CAPTION" msgid "Plugins" msgstr "" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "" #: tfrmfindview.btnclose.caption msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "" #: tfrmfindview.btnfind.caption msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "" #: tfrmfindview.cbcasesens.caption msgid "C&ase sensitive" msgstr "" #: tfrmhardlink.btncancel.caption msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfrmhardlink.caption msgid "Create hard link" msgstr "" #: tfrmhardlink.lblexistingfile.caption msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "" #: tfrmhardlink.lbllinktocreate.caption msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "" #: tfrmhotdir.btnadd.caption msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "" #: tfrmhotdir.btnaddman.caption msgid "Add &manually" msgstr "" #: tfrmhotdir.btncancel.caption msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmhotdir.btndelete.caption msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "" #: tfrmhotdir.btnedit.caption msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "" #: tfrmlinker.btnexit.caption msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "" #: tfrmlinker.btnok.caption msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "" #: tfrmlinker.caption msgctxt "TFRMLINKER.CAPTION" msgid "Linker" msgstr "" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "" #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "" #: tfrmlinker.lblfilename.caption msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "" #: tfrmlinker.spbtndel.caption msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "" #: tfrmlinker.spbtndown.caption msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "" #: tfrmlinker.spbtnup.caption msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "" #: tfrmmain.actabout.caption msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "" #: tfrmmain.actcalculatespace.caption msgid "Calculate &Occupied Space" msgstr "" #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "" #: tfrmmain.actchecksumcalc.caption msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "" #: tfrmmain.actchecksumverify.caption msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "" #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "" #: tfrmmain.actclosealltabs.caption msgctxt "TFRMMAIN.ACTCLOSEALLTABS.CAPTION" msgid "Close &All Tabs" msgstr "" #: tfrmmain.actclosetab.caption msgctxt "TFRMMAIN.ACTCLOSETAB.CAPTION" msgid "&Close Tab" msgstr "" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "" #: tfrmmain.actcomparedirectories.caption msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.CAPTION" msgid "Compare Directories" msgstr "" #: tfrmmain.actcomparedirectories.hint msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.HINT" msgid "Compare Directories" msgstr "" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "" #: tfrmmain.actcopy.caption msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "" #: tfrmmain.actcountdircontent.caption msgid "Sho&w Occupied Space" msgstr "" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "" #: tfrmmain.actdelete.caption msgctxt "TFRMMAIN.ACTDELETE.CAPTION" msgid "Delete" msgstr "" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "" #: tfrmmain.actdirhotlist.caption msgid "Directory &Hotlist" msgstr "" #: tfrmmain.actedit.caption msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "" #: tfrmmain.acteditcomment.caption msgid "Edit Co&mment..." msgstr "" #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "" #: tfrmmain.actexit.caption msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "" #: tfrmmain.actextractfiles.caption msgid "&Extract Files..." msgstr "" #: tfrmmain.actfileassoc.caption msgid "File &Associations..." msgstr "" #: tfrmmain.actfilelinker.caption msgid "Com&bine Files..." msgstr "" #: tfrmmain.actfileproperties.caption msgid "Show &File Properties" msgstr "" #: tfrmmain.actfilespliter.caption msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "" #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "" #: tfrmmain.acthardlink.caption msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "" #: tfrmmain.acthelpindex.caption msgid "&Contents" msgstr "" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "" #: tfrmmain.actkeyboard.caption msgid "&Keyboard" msgstr "" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "" #: tfrmmain.actloadselectionfromclip.caption msgid "Load Selection from Clip&board" msgstr "" #: tfrmmain.actloadselectionfromfile.caption msgid "&Load Selection from File..." msgstr "" #: tfrmmain.actmakedir.caption msgid "MakeDir" msgstr "" #: tfrmmain.actmarkcurrentextension.caption msgid "Select All with the Same E&xtension" msgstr "" #: tfrmmain.actmarkinvert.caption msgid "&Invert Selection" msgstr "" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "" #: tfrmmain.actmarkminus.caption msgid "Unselect a Gro&up..." msgstr "" #: tfrmmain.actmarkplus.caption msgid "Select a &Group..." msgstr "" #: tfrmmain.actmarkunmarkall.caption msgid "&Unselect All" msgstr "" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "" #: tfrmmain.actmultirename.caption msgid "Multi &Rename Tool" msgstr "" #: tfrmmain.actnetworkconnect.caption msgid "Network &Connect..." msgstr "" #: tfrmmain.actnetworkdisconnect.caption msgid "Network &Disconnect" msgstr "" #: tfrmmain.actnetworkquickconnect.caption msgid "Network &Quick Connect..." msgstr "" #: tfrmmain.actnewtab.caption msgid "&New Tab" msgstr "" #: tfrmmain.actnexttab.caption msgid "Switch to Nex&t Tab" msgstr "" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "" #: tfrmmain.actopendirinnewtab.caption msgid "Open &Folder in a New Tab" msgstr "" #: tfrmmain.actopenvirtualfilesystemlist.caption msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "" #: tfrmmain.actoptions.caption msgid "&Options..." msgstr "" #: tfrmmain.actpackfiles.caption msgid "&Pack Files..." msgstr "" #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "" #: tfrmmain.actprevtab.caption msgid "Switch to &Previous Tab" msgstr "" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "" #: tfrmmain.actquickview.caption msgid "&Quick View Panel" msgstr "" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "" #: tfrmmain.actrename.caption msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "" #: tfrmmain.actrenametab.caption msgid "&Rename Tab" msgstr "" #: tfrmmain.actrestoreselection.caption msgid "&Restore Selection" msgstr "" #: tfrmmain.actreverseorder.caption msgid "Re&verse Order" msgstr "" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "" #: tfrmmain.actrunterm.caption msgid "Run &Terminal" msgstr "" #: tfrmmain.actsaveselection.caption msgid "Sa&ve Selection" msgstr "" #: tfrmmain.actsaveselectiontofile.caption msgid "Save S&election to File..." msgstr "" #: tfrmmain.actsearch.caption msgid "&Search..." msgstr "" #: tfrmmain.actsetfileproperties.caption msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "" #: tfrmmain.actsettaboptiondirsinnewtab.caption msgid "Locked with Directories Opened in New &Tabs" msgstr "" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "" #: tfrmmain.actsettaboptionpathresets.caption msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "" #: tfrmmain.actshellexecute.caption msgctxt "TFRMMAIN.ACTSHELLEXECUTE.CAPTION" msgid "Open" msgstr "" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "" #: tfrmmain.actshowmainmenu.caption msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "" #: tfrmmain.actshowsysfiles.caption msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "" #: tfrmmain.actsortbyattr.caption msgid "Sort by &Attributes" msgstr "" #: tfrmmain.actsortbydate.caption msgid "Sort by &Date" msgstr "" #: tfrmmain.actsortbyext.caption msgid "Sort by &Extension" msgstr "" #: tfrmmain.actsortbyname.caption msgid "Sort by &Name" msgstr "" #: tfrmmain.actsortbysize.caption msgid "Sort by &Size" msgstr "" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "" #: tfrmmain.actsymlink.caption msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "" #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "" #: tfrmmain.acttestarchive.caption msgid "&Test Archive(s)" msgstr "" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "" #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "" #: tfrmmain.actunmarkcurrentextension.caption msgid "Unselect All with the Same Ex&tension" msgstr "" #: tfrmmain.actview.caption msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "" #: tfrmmain.actvisithomepage.caption msgid "&Visit Double Commander Website" msgstr "" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "" #: tfrmmain.btnf10.caption msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "" #: tfrmmain.btnf8.caption msgctxt "TFRMMAIN.BTNF8.CAPTION" msgid "Delete" msgstr "" #: tfrmmain.btnf9.caption msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "" #: tfrmmain.btnleftdirectoryhotlist.hint msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.HINT" msgid "Directory hotlist" msgstr "" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "" #: tfrmmain.btnlefthome.hint msgctxt "TFRMMAIN.BTNLEFTHOME.HINT" msgid "Go to home directory" msgstr "" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "" #: tfrmmain.btnleftroot.hint msgctxt "TFRMMAIN.BTNLEFTROOT.HINT" msgid "Go to root directory" msgstr "" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr "" #: tfrmmain.btnleftup.hint msgctxt "TFRMMAIN.BTNLEFTUP.HINT" msgid "Go to parent directory" msgstr "" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr "" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr "" #: tfrmmain.caption msgctxt "TFRMMAIN.CAPTION" msgid "Double Commander" msgstr "" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "" #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "" #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline33.caption msgctxt "TFRMMAIN.MILINE33.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline37.caption msgctxt "TFRMMAIN.MILINE37.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "" #: tfrmmain.mimove.caption msgid "Move..." msgstr "" #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "" #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "" #: tfrmmain.mitrayiconexit.caption msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "" #: tfrmmain.mnualloperpause.caption msgctxt "TFRMMAIN.MNUALLOPERPAUSE.CAPTION" msgid "||" msgstr "" #: tfrmmain.mnualloperstart.caption msgctxt "TFRMMAIN.MNUALLOPERSTART.CAPTION" msgid "Start" msgstr "" #: tfrmmain.mnualloperstop.caption msgctxt "TFRMMAIN.MNUALLOPERSTOP.CAPTION" msgid "Cancel" msgstr "" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "" #: tfrmmain.mnufiles.caption msgid "&Files" msgstr "" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "" #: tfrmmain.mnutaboptions.caption msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "" #: tfrmmaskinputdlg.btncancel.caption msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmmaskinputdlg.btndefinetemplate.caption msgid "&Define..." msgstr "" #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfrmmaskinputdlg.lblsearchtemplate.caption msgid "O&r select predefined selection type:" msgstr "" #: tfrmmkdir.btncancel.caption msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfrmmkdir.caption msgid "Create new directory" msgstr "" #: tfrmmkdir.lblmakedir.caption msgid "&Input new directory name:" msgstr "" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "" #: tfrmmodview.caption msgctxt "TFRMMODVIEW.CAPTION" msgid "New Size" msgstr "" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "" #: tfrmmodview.lblpath2.caption msgctxt "tfrmmodview.lblpath2.caption" msgid "2" msgstr "" #: tfrmmodview.lblpath3.caption msgctxt "tfrmmodview.lblpath3.caption" msgid "3" msgstr "" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "" #: tfrmmodview.teheight.text msgid "Height" msgstr "" #: tfrmmodview.tequality.text msgid "80" msgstr "" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "" #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "" #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "" #: tfrmmultirename.btnrestore.caption msgid "Reset &all" msgstr "" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "" #: tfrmmultirename.caption msgctxt "TFRMMULTIRENAME.CAPTION" msgid "MultiRename" msgstr "" #: tfrmmultirename.cblog.caption msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "" #: tfrmmultirename.cbregexp.caption msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "" #: tfrmmultirename.cbusesubs.caption msgid "&Use substitution" msgstr "" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "" #: tfrmmultirename.extension.caption msgid "[E] Extension" msgstr "" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "" #: tfrmmultirename.lbext.caption msgid "&Extension" msgstr "" #: tfrmmultirename.lbfind.caption msgid "&Find..." msgstr "" #: tfrmmultirename.lbinterval.caption msgid "&Interval" msgstr "" #: tfrmmultirename.lbname.caption msgid "File &Name" msgstr "" #: tfrmmultirename.lbreplace.caption msgid "Re&place..." msgstr "" #: tfrmmultirename.lbstnb.caption msgid "S&tart Number" msgstr "" #: tfrmmultirename.lbwidth.caption msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "" #: tfrmmultirename.micounter.caption msgid "[C] Counter" msgstr "" #: tfrmmultirename.miday.caption msgid "[D] Day" msgstr "" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "" #: tfrmmultirename.miextensionx.caption msgid "[Ex] Character at position x" msgstr "" #: tfrmmultirename.miextensionxx.caption msgid "[Ex:y] Characters from position x to y" msgstr "" #: tfrmmultirename.mihour.caption msgid "[h] Hour" msgstr "" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "" #: tfrmmultirename.miminute.caption msgid "[n] Minute" msgstr "" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "" #: tfrmmultirename.mimonth.caption msgid "[M] Month" msgstr "" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "" #: tfrmmultirename.mimonth3.caption msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "" #: tfrmmultirename.miname.caption msgid "[N] Name" msgstr "" #: tfrmmultirename.minamex.caption msgid "[Nx] Character at position x" msgstr "" #: tfrmmultirename.minamexx.caption msgid "[Nx:y] Characters from position x to y" msgstr "" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "" #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "" #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "" #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "" #: tfrmmultirename.misecond.caption msgid "[s] Second" msgstr "" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "" #: tfrmmultirename.miyear.caption msgid "[Y] Year (2 digits)" msgstr "" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "TFRMMULTIRENAME.STRINGGRID.COLUMNS[0].TITLE.CAPTION" msgid "Old File Name" msgstr "" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "TFRMMULTIRENAME.STRINGGRID.COLUMNS[1].TITLE.CAPTION" msgid "New File Name" msgstr "" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "TFRMMULTIRENAME.STRINGGRID.COLUMNS[2].TITLE.CAPTION" msgid "File Path" msgstr "" #: tfrmopenwith.caption msgid "Choose an application" msgstr "" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "" #: tfrmoptions.btnapply.caption msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "" #: tfrmoptions.btncancel.caption msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfrmoptions.caption msgctxt "TFRMOPTIONS.CAPTION" msgid "Options" msgstr "" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "" #: tfrmoptionsarchivers.btnautoconfig.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNAUTOCONFIG.CAPTION" msgid "A&uto Configure" msgstr "" #: tfrmoptionsarchivers.btnmultiarcadd.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCADD.CAPTION" msgid "A&dd" msgstr "" #: tfrmoptionsarchivers.btnmultiarcapply.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCAPPLY.CAPTION" msgid "A&pply" msgstr "" #: tfrmoptionsarchivers.btnmultiarcdelete.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCDELETE.CAPTION" msgid "D&elete" msgstr "" #: tfrmoptionsarchivers.btnmultiarcrename.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCRENAME.CAPTION" msgid "&Rename" msgstr "" #: tfrmoptionsarchivers.chkmultiarcdebug.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCDEBUG.CAPTION" msgid "De&bug mode" msgstr "" #: tfrmoptionsarchivers.chkmultiarcenabled.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCENABLED.CAPTION" msgid "E&nabled" msgstr "" #: tfrmoptionsarchivers.chkmultiarcoutput.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCOUTPUT.CAPTION" msgid "S&how console output" msgstr "" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "TFRMOPTIONSARCHIVERS.GBARCHIVEROPTIONS.CAPTION" msgid "Options" msgstr "" #: tfrmoptionsarchivers.lblarchiveadd.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEADD.CAPTION" msgid "Add&ing:" msgstr "" #: tfrmoptionsarchivers.lblarchiveextension.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTENSION.CAPTION" msgid "E&xtension:" msgstr "" #: tfrmoptionsarchivers.lblarchiveextract.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTRACT.CAPTION" msgid "Ex&tract:" msgstr "" #: tfrmoptionsarchivers.lblarchivelist.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELIST.CAPTION" msgid "&List:" msgstr "" #: tfrmoptionsarchivers.lblarchivelistend.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTEND.CAPTION" msgid "Listing &finish (optional):" msgstr "" #: tfrmoptionsarchivers.lblarchivelistformat.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTFORMAT.CAPTION" msgid "Listing for&mat:" msgstr "" #: tfrmoptionsarchivers.lblarchiveliststart.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTSTART.CAPTION" msgid "Listin&g start (optional):" msgstr "" #: tfrmoptionsarchivers.lblarchiver.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVER.CAPTION" msgid "Arc&hiver:" msgstr "" #: tfrmoptionsarchivers.lbldescription.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLDESCRIPTION.CAPTION" msgid "De&scription:" msgstr "" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERADDITIONAL.CAPTION" msgid "Additional" msgstr "" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERGENERAL.CAPTION" msgid "General" msgstr "" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHATTRIBUTESCHANGE.CAPTION" msgid "When &size, date or attributes change" msgstr "" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHEXCLUDEDIRS.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHFILENAMECHANGE.CAPTION" msgid "When &files are created, deleted or renamed" msgstr "" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHONLYFOREGROUND.CAPTION" msgid "When application is in the &background" msgstr "" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHDISABLE.CAPTION" msgid "Disable auto-refresh" msgstr "" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHENABLE.CAPTION" msgid "Refresh file list" msgstr "" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBALWAYSSHOWTRAYICON.CAPTION" msgid "Al&ways show tray icon" msgstr "" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption msgid "Automatically &hide unmounted devices" msgstr "" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBMINIMIZETOTRAY.CAPTION" msgid "Mo&ve icon to system tray when minimized" msgstr "" #: tfrmoptionsbehavior.cbonlyonce.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBONLYONCE.CAPTION" msgid "A&llow only one copy of DC at a time" msgstr "" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "" #: tfrmoptionsbehavior.lbldrivesblacklist.caption msgid "Drives &blacklist" msgstr "" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption msgid "Cut &text to column width" msgstr "" #: tfrmoptionscolumnsview.cbgridhorzline.caption msgid "&Horizontal lines" msgstr "" #: tfrmoptionscolumnsview.cbgridvertline.caption msgid "&Vertical lines" msgstr "" #: tfrmoptionscolumnsview.chkautofillcolumns.caption msgid "A&uto fill columns" msgstr "" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "" #: tfrmoptionscolumnsview.lblautosizecolumn.caption msgid "Auto si&ze column:" msgstr "" #: tfrmoptionsconfiguration.btnconfigapply.caption msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGAPPLY.CAPTION" msgid "A&pply" msgstr "" #: tfrmoptionsconfiguration.btnconfigedit.caption msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGEDIT.CAPTION" msgid "&Edit" msgstr "" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption msgid "Co&mmand line history" msgstr "" #: tfrmoptionsconfiguration.cbdirhistory.caption msgctxt "TFRMOPTIONSCONFIGURATION.CBDIRHISTORY.CAPTION" msgid "&Directory history" msgstr "" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption msgid "&File mask history" msgstr "" #: tfrmoptionsconfiguration.chksaveconfiguration.caption msgid "Sa&ve configuration" msgstr "" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption msgid "Searc&h/Replace history" msgstr "" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgid "Location of configuration files" msgstr "" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgid "Save on exit" msgstr "" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgid "Set on command line" msgstr "" #: tfrmoptionsconfiguration.rbprogramdir.caption msgid "P&rogram directory (portable version)" msgstr "" #: tfrmoptionsconfiguration.rbuserhomedir.caption msgid "&User home directory" msgstr "" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNCOPYCOLUMNSSET.CAPTION" msgid "C&opy" msgstr "" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNDELCOLUMNSSET.CAPTION" msgid "&Delete" msgstr "" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNEDITCOLUMNSSET.CAPTION" msgid "&Edit" msgstr "" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNNEWCOLUMNSSET.CAPTION" msgid "&New" msgstr "" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.CBBFILESYSTEM.TEXT" msgid "General" msgstr "" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption msgid "Con&figure columns for file system:" msgstr "" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption msgid "&Show confirmation dialog after drop" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption msgid "Show &file system" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption msgid "Show fr&ee space" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption msgid "Show &label" msgstr "" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "" #: tfrmoptionseditorcolors.backgroundlabel.caption msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption msgctxt "TFRMOPTIONSEDITORCOLORS.BACKGROUNDUSEDEFAULTCHECKBOX.CAPTION" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "" #: tfrmoptionseditorcolors.foregroundlabel.caption msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption msgctxt "TFRMOPTIONSEDITORCOLORS.FOREGROUNDUSEDEFAULTCHECKBOX.CAPTION" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption msgid "&Text-mark" msgstr "" #: tfrmoptionseditorcolors.tbtnglobal.caption msgid "Use (and edit) &global scheme settings" msgstr "" #: tfrmoptionseditorcolors.tbtnlocal.caption msgid "Use &local scheme settings" msgstr "" #: tfrmoptionseditorcolors.textboldcheckbox.caption msgid "&Bold" msgstr "" #: tfrmoptionseditorcolors.textboldradioinvert.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTBOLDRADIOINVERT.CAPTION" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textboldradiooff.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTBOLDRADIOOFF.CAPTION" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textboldradioon.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTBOLDRADIOON.CAPTION" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textitaliccheckbox.caption msgid "&Italic" msgstr "" #: tfrmoptionseditorcolors.textitalicradioinvert.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTITALICRADIOINVERT.CAPTION" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textitalicradiooff.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTITALICRADIOOFF.CAPTION" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textitalicradioon.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTITALICRADIOON.CAPTION" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption msgid "&Strike Out" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTRADIOINVERT.CAPTION" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTRADIOOFF.CAPTION" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTRADIOON.CAPTION" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption msgid "&Underline" msgstr "" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textunderlineradiooff.caption msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textunderlineradioon.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "" #: tfrmoptionsfileoperations.cbdeletetotrash.caption msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDROPREADONLYFLAG.CAPTION" msgid "D&rop readonly flag" msgstr "" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption msgid "&Search for part of file name" msgstr "" #: tfrmoptionsfileoperations.cbprocesscomments.caption msgid "&Process comments with files/folders" msgstr "" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption msgid "Select &file name without extension when renaming" msgstr "" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption msgid "Sho&w tab select panel in copy/move dialog" msgstr "" #: tfrmoptionsfileoperations.cbskipfileoperror.caption msgid "S&kip file operations errors and write them to log window" msgstr "" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "tfrmoptionsfileoperations.gbfilesearch.caption" msgid "File search" msgstr "" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "" #: tfrmoptionsfileoperations.lblbuffersize.caption msgid "&Buffer size for file operations (in KB):" msgstr "" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "" #: tfrmoptionsfileoperations.lblprogresskind.caption msgid "Show operations progress &initially in" msgstr "" #: tfrmoptionsfileoperations.lblwipepassnumber.caption msgid "&Number of wipe passes:" msgstr "" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption msgid "Use memory mapping for search te&xt in files" msgstr "" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption msgid "&Use stream for search text in files" msgstr "" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr "" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr "" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr "" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr "" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNFORECOLOR.CAPTION" msgid ">>" msgstr "" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDBACKCOLOR.CAPTION" msgid ">>" msgstr "" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDCOLOR.CAPTION" msgid ">>" msgstr "" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr "" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption msgid "Use &Frame Cursor" msgstr "" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption msgid "Use &Gradient Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption msgid "U&se Inverted Selection" msgstr "" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.DBFREESPACEINDICATOR.CAPTION" msgid "Drive Free Space Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.GBEXAMPLE.CAPTION" msgid "Example" msgstr "" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption msgid "Bac&kground:" msgstr "" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR2.CAPTION" msgid "Backg&round 2:" msgstr "" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORCOLOR.CAPTION" msgid "C&ursor Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblcursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORTEXT.CAPTION" msgid "Cursor Te&xt:" msgstr "" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption msgid "&Brightness level of inactive panel" msgstr "" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption msgid "In&dicator Back Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblindcolor.caption msgid "&Indicator Fore Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLMARKCOLOR.CAPTION" msgid "&Mark Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLTEXTCOLOR.CAPTION" msgid "T&ext Color:" msgstr "" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption msgid "Do&n't load file list until a tab is activated" msgstr "" #: tfrmoptionsfilesviews.cbdirbrackets.caption msgid "S&how square brackets around directories" msgstr "" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption msgid "Hi&ghlight new and updated files" msgstr "" #: tfrmoptionsfilesviews.cblistfilesinthread.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBLISTFILESINTHREAD.CAPTION" msgid "Load &file list in separate thread" msgstr "" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBLOADICONSSEPARATELY.CAPTION" msgid "Load icons af&ter file list" msgstr "" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBSHOWSYSTEMFILES.CAPTION" msgid "Show s&ystem and hidden files" msgstr "" #: tfrmoptionsfilesviews.cbspacemovesdown.caption msgid "&When selecting files with , move down to next file (as with )" msgstr "" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "" #: tfrmoptionsfilesviews.gbsorting.caption msgid "Sorting" msgstr "" #: tfrmoptionsfilesviews.lblcasesensitivity.caption msgid "Case s&ensitivity:" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeformat.caption msgid "&Date and time format:" msgstr "" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "" #: tfrmoptionsfilesviews.lblnewfilesposition.caption msgid "&Insert new files" msgstr "" #: tfrmoptionsfilesviews.lblsortfoldermode.caption msgid "So&rting directories:" msgstr "" #: tfrmoptionsfilesviews.lblsortmethod.caption msgid "&Sort method:" msgstr "" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption msgid "&Move updated files" msgstr "" #: tfrmoptionsfiletypescolors.btnaddcategory.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNADDCATEGORY.CAPTION" msgid "A&dd" msgstr "" #: tfrmoptionsfiletypescolors.btnapplycategory.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNAPPLYCATEGORY.CAPTION" msgid "A&pply" msgstr "" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNCATEGORYCOLOR.CAPTION" msgid ">>" msgstr "" #: tfrmoptionsfiletypescolors.btndeletecategory.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNDELETECATEGORY.CAPTION" msgid "D&elete" msgstr "" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "" #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption msgid "File types colors (sort by drag&&drop)" msgstr "" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption msgid "Category a&ttributes:" msgstr "" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption msgid "Category co&lor:" msgstr "" #: tfrmoptionsfiletypescolors.lblcategorymask.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYMASK.CAPTION" msgid "Category &mask:" msgstr "" #: tfrmoptionsfiletypescolors.lblcategoryname.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYNAME.CAPTION" msgid "Category &name:" msgstr "" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELEDITFNT.CAPTION" msgid "..." msgstr "" #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELLOGFNT.CAPTION" msgid "..." msgstr "" #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELMAINFNT.CAPTION" msgid "..." msgstr "" #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWERBOOKFNT.CAPTION" msgid "..." msgstr "" #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWFNT.CAPTION" msgid "..." msgstr "" #: tfrmoptionsfonts.lbleditorfont.caption msgctxt "TFRMOPTIONSFONTS.LBLEDITORFONT.CAPTION" msgid "&Editor font" msgstr "" #: tfrmoptionsfonts.lbllogfont.caption msgctxt "TFRMOPTIONSFONTS.LBLLOGFONT.CAPTION" msgid "&Log font" msgstr "" #: tfrmoptionsfonts.lblmainfont.caption msgctxt "TFRMOPTIONSFONTS.LBLMAINFONT.CAPTION" msgid "Main &font" msgstr "" #: tfrmoptionsfonts.lblviewerbookfont.caption msgctxt "TFRMOPTIONSFONTS.LBLVIEWERBOOKFONT.CAPTION" msgid "Viewer&Book Font" msgstr "" #: tfrmoptionsfonts.lblviewerfont.caption msgctxt "TFRMOPTIONSFONTS.LBLVIEWERFONT.CAPTION" msgid "&Viewer font" msgstr "" #: tfrmoptionshotkeys.btnaddhotkey.caption msgid "Add &hotkey" msgstr "" #: tfrmoptionshotkeys.btndeletehotkey.caption msgid "&Delete hotkey" msgstr "" #: tfrmoptionshotkeys.btnedithotkey.caption msgctxt "TFRMOPTIONSHOTKEYS.BTNEDITHOTKEY.CAPTION" msgid "&Edit hotkey" msgstr "" #: tfrmoptionshotkeys.lbfilter.caption msgctxt "TFRMOPTIONSHOTKEYS.LBFILTER.CAPTION" msgid "&Filter" msgstr "" #: tfrmoptionshotkeys.lblcategories.caption msgctxt "TFRMOPTIONSHOTKEYS.LBLCATEGORIES.CAPTION" msgid "C&ategories:" msgstr "" #: tfrmoptionshotkeys.lblcommands.caption msgctxt "TFRMOPTIONSHOTKEYS.LBLCOMMANDS.CAPTION" msgid "Co&mmands:" msgstr "" #: tfrmoptionshotkeys.lblscfiles.caption msgctxt "TFRMOPTIONSHOTKEYS.LBLSCFILES.CAPTION" msgid "&Shortcut files:" msgstr "" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[0].TITLE.CAPTION" msgid "Hotkey" msgstr "" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[1].TITLE.CAPTION" msgid "Parameters" msgstr "" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[2].TITLE.CAPTION" msgid "Controls" msgstr "" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "TFRMOPTIONSICONS.CBICONSINMENUSSIZE.TEXT" msgid "16x16" msgstr "" #: tfrmoptionsicons.cbiconsshowoverlay.caption msgctxt "TFRMOPTIONSICONS.CBICONSSHOWOVERLAY.CAPTION" msgid "Show o&verlay icons, e.g. for links" msgstr "" #: tfrmoptionsicons.cbiconssize.text msgctxt "TFRMOPTIONSICONS.CBICONSSIZE.TEXT" msgid "16x16" msgstr "" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "" #: tfrmoptionsicons.gbiconssize.caption msgctxt "TFRMOPTIONSICONS.GBICONSSIZE.CAPTION" msgid " Icon size " msgstr "" #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "TFRMOPTIONSICONS.GBSHOWICONSMODE.CAPTION" msgid " Show icons to the left of the filename " msgstr "" #: tfrmoptionsicons.rbiconsshowall.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALL.CAPTION" msgid "A&ll" msgstr "" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALLANDEXE.CAPTION" msgid "All associated + &EXE/LNK (slow)" msgstr "" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWNONE.CAPTION" msgid "&No icons" msgstr "" #: tfrmoptionsicons.rbiconsshowstandard.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWSTANDARD.CAPTION" msgid "Only &standard icons" msgstr "" #: tfrmoptionsignorelist.btnaddsel.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSEL.CAPTION" msgid "A&dd selected names" msgstr "" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSELWITHPATH.CAPTION" msgid "Add selected names with &full path" msgstr "" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "TFRMOPTIONSIGNORELIST.CHKIGNOREENABLE.CAPTION" msgid "&Ignore (don't show) the following files and folders:" msgstr "" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "TFRMOPTIONSIGNORELIST.LBLSAVEIN.CAPTION" msgid "&Save in:" msgstr "" #: tfrmoptionskeyboard.cblynxlike.caption msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "" #: tfrmoptionskeyboard.lblalt.caption msgctxt "TFRMOPTIONSKEYBOARD.LBLALT.CAPTION" msgid "Alt+L&etters" msgstr "" #: tfrmoptionskeyboard.lblctrlalt.caption msgctxt "TFRMOPTIONSKEYBOARD.LBLCTRLALT.CAPTION" msgid "Ctrl+Alt+Le&tters" msgstr "" #: tfrmoptionskeyboard.lblnomodifier.caption msgctxt "TFRMOPTIONSKEYBOARD.LBLNOMODIFIER.CAPTION" msgid "&Letters" msgstr "" #: tfrmoptionslayout.cbflatdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBFLATDISKPANEL.CAPTION" msgid "&Flat buttons" msgstr "" #: tfrmoptionslayout.cbflatinterface.caption msgctxt "TFRMOPTIONSLAYOUT.CBFLATINTERFACE.CAPTION" msgid "Flat i&nterface" msgstr "" #: tfrmoptionslayout.cbflattoolbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBFLATTOOLBAR.CAPTION" msgid "Flat b&uttons" msgstr "" #: tfrmoptionslayout.cbfreespaceind.caption msgctxt "TFRMOPTIONSLAYOUT.CBFREESPACEIND.CAPTION" msgid "Show fr&ee space indicator on drive label" msgstr "" #: tfrmoptionslayout.cblogwindow.caption msgctxt "TFRMOPTIONSLAYOUT.CBLOGWINDOW.CAPTION" msgid "Show lo&g window" msgstr "" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "TFRMOPTIONSLAYOUT.CBPANELOFOPERATIONS.CAPTION" msgid "Show panel of operation in background" msgstr "" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "TFRMOPTIONSLAYOUT.CBPROGINMENUBAR.CAPTION" msgid "Show common progress in menu bar" msgstr "" #: tfrmoptionslayout.cbshowcmdline.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCMDLINE.CAPTION" msgid "Show command l&ine" msgstr "" #: tfrmoptionslayout.cbshowcurdir.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCURDIR.CAPTION" msgid "Show current director&y" msgstr "" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDISKPANEL.CAPTION" msgid "Show &drive buttons" msgstr "" #: tfrmoptionslayout.cbshowdrivefreespace.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDRIVEFREESPACE.CAPTION" msgid "Show free s&pace label" msgstr "" #: tfrmoptionslayout.cbshowdriveslistbutton.caption msgid "Show drives list bu&tton" msgstr "" #: tfrmoptionslayout.cbshowkeyspanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWKEYSPANEL.CAPTION" msgid "Show function &key buttons" msgstr "" #: tfrmoptionslayout.cbshowmainmenu.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINMENU.CAPTION" msgid "Show &main menu" msgstr "" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINTOOLBAR.CAPTION" msgid "Show &button bar" msgstr "" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption msgid "Show short free space &label" msgstr "" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWSTATUSBAR.CAPTION" msgid "Show &status bar" msgstr "" #: tfrmoptionslayout.cbshowtabheader.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABHEADER.CAPTION" msgid "S&how tabstop header" msgstr "" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABS.CAPTION" msgid "Sho&w folder tabs" msgstr "" #: tfrmoptionslayout.cbtermwindow.caption msgctxt "TFRMOPTIONSLAYOUT.CBTERMWINDOW.CAPTION" msgid "Show te&rminal window" msgstr "" #: tfrmoptionslayout.cbtwodiskpanels.caption msgctxt "TFRMOPTIONSLAYOUT.CBTWODISKPANELS.CAPTION" msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "TFRMOPTIONSLAYOUT.GBSCREENLAYOUT.CAPTION" msgid " Screen layout " msgstr "" #: tfrmoptionslog.cblogarcop.caption msgctxt "TFRMOPTIONSLOG.CBLOGARCOP.CAPTION" msgid "&Pack/Unpack" msgstr "" #: tfrmoptionslog.cblogcpmvln.caption msgctxt "TFRMOPTIONSLOG.CBLOGCPMVLN.CAPTION" msgid "Cop&y/Move/Create link/symlink" msgstr "" #: tfrmoptionslog.cblogdelete.caption msgctxt "TFRMOPTIONSLOG.CBLOGDELETE.CAPTION" msgid "&Delete" msgstr "" #: tfrmoptionslog.cblogdirop.caption msgctxt "TFRMOPTIONSLOG.CBLOGDIROP.CAPTION" msgid "Crea&te/Delete directories" msgstr "" #: tfrmoptionslog.cblogerrors.caption msgctxt "TFRMOPTIONSLOG.CBLOGERRORS.CAPTION" msgid "Log &errors" msgstr "" #: tfrmoptionslog.cblogfile.caption msgctxt "TFRMOPTIONSLOG.CBLOGFILE.CAPTION" msgid "C&reate a log file:" msgstr "" #: tfrmoptionslog.cbloginfo.caption msgctxt "TFRMOPTIONSLOG.CBLOGINFO.CAPTION" msgid "Log &information messages" msgstr "" #: tfrmoptionslog.cblogsuccess.caption msgctxt "TFRMOPTIONSLOG.CBLOGSUCCESS.CAPTION" msgid "Log &successful operations" msgstr "" #: tfrmoptionslog.cblogvfs.caption msgctxt "TFRMOPTIONSLOG.CBLOGVFS.CAPTION" msgid "&File system plugins" msgstr "" #: tfrmoptionslog.gblogfile.caption msgctxt "TFRMOPTIONSLOG.GBLOGFILE.CAPTION" msgid "File operation log file" msgstr "" #: tfrmoptionslog.gblogfileop.caption msgid "Log operations" msgstr "" #: tfrmoptionslog.gblogfilestatus.caption msgid "Operation status" msgstr "" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "" #: tfrmoptionsmisc.chkshowwarningmessages.caption msgctxt "TFRMOPTIONSMISC.CHKSHOWWARNINGMESSAGES.CAPTION" msgid "Show &warning messages (\"OK\" button only)" msgstr "" #: tfrmoptionsmisc.chkthumbsave.caption msgctxt "TFRMOPTIONSMISC.CHKTHUMBSAVE.CAPTION" msgid "&Save thumbnails in cache" msgstr "" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "TFRMOPTIONSMISC.DBLTHUMBNAILS.CAPTION" msgid "Thumbnails" msgstr "" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "TFRMOPTIONSMISC.LBLTHUMBSEPARATOR.CAPTION" msgid "X" msgstr "" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "" #: tfrmoptionsmouse.cbselectionbymouse.caption msgid "&Selection by mouse" msgstr "" #: tfrmoptionsmouse.gbscrolling.caption msgid "Scrolling" msgstr "" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "" #: tfrmoptionsmouse.lblmousemode.caption msgid "&Mode:" msgstr "" #: tfrmoptionsmouse.rbscrolllinebyline.caption msgid "&Line by line" msgstr "" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption msgid "Line by line &with cursor movement" msgstr "" #: tfrmoptionsmouse.rbscrollpagebypage.caption msgid "&Page by page" msgstr "" #: tfrmoptionsplugins.btnaddplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "" #: tfrmoptionsplugins.btnconfigplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "" #: tfrmoptionsplugins.btnenableplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "" #: tfrmoptionsplugins.btnremoveplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "" #: tfrmoptionsplugins.btntweakplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "" #: tfrmoptionsplugins.lbldsxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "" #: tfrmoptionsplugins.lblwcxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "" #: tfrmoptionsplugins.lblwdxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "" #: tfrmoptionsplugins.lblwfxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "" #: tfrmoptionsplugins.lblwlxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "" #: tfrmoptionsplugins.stgplugins.columns[0].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[0].TITLE.CAPTION" msgid "Active" msgstr "" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[1].TITLE.CAPTION" msgid "Plugin" msgstr "" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[2].TITLE.CAPTION" msgid "Registered for" msgstr "" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[3].TITLE.CAPTION" msgid "File name" msgstr "" #: tfrmoptionsplugins.tsdsx.caption msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "" #: tfrmoptionsplugins.tswcx.caption msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "" #: tfrmoptionsplugins.tswdx.caption msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "" #: tfrmoptionsplugins.tswfx.caption msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "" #: tfrmoptionsplugins.tswlx.caption msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTBEGINNING.CAPTION" msgid "&Beginning (name must start with first typed character)" msgstr "" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTENDING.CAPTION" msgid "En&ding (last character before a typed dot . must match)" msgstr "" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CGPOPTIONS.CAPTION" msgid "Options" msgstr "" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption msgid "Exact name match" msgstr "" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "TFRMOPTIONSTABS.CBTABSACTIVATEONCLICK.CAPTION" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "TFRMOPTIONSTABS.CBTABSALWAYSVISIBLE.CAPTION" msgid "&Show tab header also when there is only one tab" msgstr "" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption msgctxt "TFRMOPTIONSTABS.CBTABSCONFIRMCLOSEALL.CAPTION" msgid "Con&firm close all tabs" msgstr "" #: tfrmoptionstabs.cbtabslimitoption.caption msgctxt "TFRMOPTIONSTABS.CBTABSLIMITOPTION.CAPTION" msgid "&Limit tab title length to" msgstr "" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "TFRMOPTIONSTABS.CBTABSLOCKEDASTERISK.CAPTION" msgid "Show locked tabs &with an asterisk *" msgstr "" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "TFRMOPTIONSTABS.CBTABSMULTILINES.CAPTION" msgid "&Tabs on multiple lines" msgstr "" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENFOREGROUND.CAPTION" msgid "Ctrl+&Up opens new tab in foreground" msgstr "" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENNEARCURRENT.CAPTION" msgid "Open &new tabs near current tab" msgstr "" #: tfrmoptionstabs.cbtabsshowclosebutton.caption msgctxt "TFRMOPTIONSTABS.CBTABSSHOWCLOSEBUTTON.CAPTION" msgid "Show ta&b close button" msgstr "" #: tfrmoptionstabs.gbtabs.caption msgctxt "TFRMOPTIONSTABS.GBTABS.CAPTION" msgid "Folder tabs headers" msgstr "" #: tfrmoptionstabs.lblchar.caption msgctxt "TFRMOPTIONSTABS.LBLCHAR.CAPTION" msgid "characters" msgstr "" #: tfrmoptionstabs.lbltabsposition.caption msgctxt "TFRMOPTIONSTABS.LBLTABSPOSITION.CAPTION" msgid "Ta&bs position" msgstr "" #: tfrmoptionsterminal.lblruninterm.caption msgid "Run in &terminal:" msgstr "" #: tfrmoptionsterminal.lblrunterm.caption msgid "Run t&erminal:" msgstr "" #: tfrmoptionstoolbar.btnclonebutton.caption msgid "C&lone button" msgstr "" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNDELETEBUTTON.CAPTION" msgid "&Delete" msgstr "" #: tfrmoptionstoolbar.btnedithotkey.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNEDITHOTKEY.CAPTION" msgid "Edit hot&key" msgstr "" #: tfrmoptionstoolbar.btninsertbutton.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNINSERTBUTTON.CAPTION" msgid "&Insert new button" msgstr "" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNOPENFILE.CAPTION" msgid ">>" msgstr "" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNOPENICON.CAPTION" msgid ">>" msgstr "" #: tfrmoptionstoolbar.btnremovehotkey.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNREMOVEHOTKEY.CAPTION" msgid "Remove hotke&y" msgstr "" #: tfrmoptionstoolbar.cbflatbuttons.caption msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "" #: tfrmoptionstoolbar.gbgroupbox.caption msgid "Appearance" msgstr "" #: tfrmoptionstoolbar.lblbarsize.caption msgid "&Bar size:" msgstr "" #: tfrmoptionstoolbar.lblexternalcommand.caption msgctxt "TFRMOPTIONSTOOLBAR.LBLEXTERNALCOMMAND.CAPTION" msgid "Comman&d:" msgstr "" #: tfrmoptionstoolbar.lblexternalparameters.caption msgctxt "TFRMOPTIONSTOOLBAR.LBLEXTERNALPARAMETERS.CAPTION" msgid "Parameter&s:" msgstr "" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "" #: tfrmoptionstoolbar.lbliconfile.caption msgid "Ico&n:" msgstr "" #: tfrmoptionstoolbar.lbliconsize.caption msgid "Icon si&ze:" msgstr "" #: tfrmoptionstoolbar.lblinternalcommand.caption msgctxt "tfrmoptionstoolbar.lblinternalcommand.caption" msgid "Co&mmand:" msgstr "" #: tfrmoptionstoolbar.lblinternalparameters.caption msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "" #: tfrmoptionstoolbar.lblstartpath.caption msgid "Start pat&h:" msgstr "" #: tfrmoptionstoolbar.lbltooltip.caption msgid "&Tooltip:" msgstr "" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption msgid "&Keep terminal window open after executing program" msgstr "" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption msgid "&Execute in terminal" msgstr "" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption msgid "&Use external program" msgstr "" #: tfrmoptionstoolbase.lbltoolsparameters.caption msgid "A&dditional parameters" msgstr "" #: tfrmoptionstoolbase.lbltoolspath.caption msgid "&Path to program to execute" msgstr "" #: tfrmoptionstooltips.btnaddfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "" #: tfrmoptionstooltips.btnapplyfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "" #: tfrmoptionstooltips.btndeletefields.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr "" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "" #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "" #: tfrmoptionstooltips.lblfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "" #: tfrmoptionstooltips.lblfieldsmask.caption msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "" #: tfrmoptionstooltips.lblfieldsname.caption msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "" #: tfrmoptionstooltips.rbtooltipallfiles.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "" #: tfrmoptionstooltips.rbtooltipnone.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "" #: tfrmoptionstooltips.rbtooltiponlylarge.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNBACKVIEWERCOLOR.CAPTION" msgid ">>" msgstr "" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNFONTVIEWERCOLOR.CAPTION" msgid ">>" msgstr "" #: tfrmoptionsviewer.gbviewerbookmode.caption msgid "Viewer Book Mode" msgstr "" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWEREXAMPLE.CAPTION" msgid "Example" msgstr "" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption msgid "&Background color in book viewer" msgstr "" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption msgid "&Font color in book viewer" msgstr "" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption msgid "&Number of columns in book viewer" msgstr "" #: tfrmpackdlg.btncancel.caption msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmpackdlg.btnconfig.caption msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "" #: tfrmpackdlg.btnhelp.caption msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "" #: tfrmpackdlg.btnok.caption msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfrmpackdlg.caption msgctxt "TFRMPACKDLG.CAPTION" msgid "Pack files" msgstr "" #: tfrmpackdlg.cbcreateseparatearchives.caption msgid "C&reate separate archives, one per selected file/dir" msgstr "" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "" #: tfrmpackdlg.cbmovetoarchive.caption msgid "Mo&ve to archive" msgstr "" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "" #: tfrmpackdlg.cbputintarfirst.caption msgid "P&ut in the TAR archive first" msgstr "" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "" #: tfrmpackinfodlg.btnclose.caption msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "" #: tfrmpackinfodlg.caption msgctxt "TFRMPACKINFODLG.CAPTION" msgid "Properties of packed file" msgstr "" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "" #: tfrmquicksearch.btncancel.caption msgctxt "TFRMQUICKSEARCH.BTNCANCEL.CAPTION" msgid "X" msgstr "" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "" #: tfrmquicksearch.tglfilter.caption msgctxt "TFRMQUICKSEARCH.TGLFILTER.CAPTION" msgid "Filter" msgstr "" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CANCELBUTTON.CAPTION" msgid "Cancel" msgstr "" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CLOSEBUTTON.CAPTION" msgid "&Close" msgstr "" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.HELPBUTTON.CAPTION" msgid "&Help" msgstr "" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.OKBUTTON.CAPTION" msgid "&OK" msgstr "" #: tfrmselecttextrange.lblselecttext.caption msgid "&Select the characters to insert:" msgstr "" #: tfrmsetfileproperties.btncancel.caption msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfrmsetfileproperties.caption msgctxt "TFRMSETFILEPROPERTIES.CAPTION" msgid "Change attributes" msgstr "" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "" #: tfrmsetfileproperties.chkrecursive.caption msgid "Including subfolders" msgstr "" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "" #: tfrmsetfileproperties.lblattrinfo.caption msgid "(gray field means unchanged value)" msgstr "" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "" #: tfrmsplitter.btncancel.caption msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "" #: tfrmsplitter.btnok.caption msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfrmsplitter.caption msgctxt "TFRMSPLITTER.CAPTION" msgid "Splitter" msgstr "" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "" #: tfrmsplitter.grbxsize.caption msgid "Size and number of parts" msgstr "" #: tfrmsplitter.lbdirtarget.caption msgid "Directory &target" msgstr "" #: tfrmsplitter.lbfilesource.caption msgid "File &source" msgstr "" #: tfrmsplitter.lblnumberparts.caption msgid "&Number of parts" msgstr "" #: tfrmsplitter.rbtngigab.caption msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "" #: tfrmsplitter.rbtnkilob.caption msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "" #: tfrmsplitter.rbtnmegab.caption msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "" #: tfrmsymlink.btncancel.caption msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfrmsymlink.caption msgid "Create symbolic link" msgstr "" #: tfrmsymlink.lblexistingfile.caption msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "" #: tfrmsymlink.lbllinktocreate.caption msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "" #: tfrmtweakplugin.btnadd.caption msgid "A&dd new" msgstr "" #: tfrmtweakplugin.btncancel.caption msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmtweakplugin.btnchange.caption msgid "C&hange" msgstr "" #: tfrmtweakplugin.btndefault.caption msgid "De&fault" msgstr "" #: tfrmtweakplugin.btnok.caption msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "" #: tfrmtweakplugin.btnremove.caption msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "" #: tfrmtweakplugin.caption msgctxt "TFRMTWEAKPLUGIN.CAPTION" msgid "Tweak plugin" msgstr "" #: tfrmtweakplugin.cbpk_caps_by_content.caption msgid "De&tect archive type by content" msgstr "" #: tfrmtweakplugin.cbpk_caps_delete.caption msgid "Can de&lete files" msgstr "" #: tfrmtweakplugin.cbpk_caps_encrypt.caption msgid "Supports e&ncryption" msgstr "" #: tfrmtweakplugin.cbpk_caps_hide.caption msgid "Sho&w as normal files (hide packer icon)" msgstr "" #: tfrmtweakplugin.cbpk_caps_mempack.caption msgid "Supports pac&king in memory" msgstr "" #: tfrmtweakplugin.cbpk_caps_modify.caption msgid "Can &modify exisiting archives" msgstr "" #: tfrmtweakplugin.cbpk_caps_multiple.caption msgid "&Archive can contain multiple files" msgstr "" #: tfrmtweakplugin.cbpk_caps_new.caption msgid "Can create new archi&ves" msgstr "" #: tfrmtweakplugin.cbpk_caps_options.caption msgid "S&upports the options dialogbox" msgstr "" #: tfrmtweakplugin.cbpk_caps_searchtext.caption msgid "Allow searchin&g for text in archives" msgstr "" #: tfrmtweakplugin.lbldescription.caption msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "" #: tfrmtweakplugin.lbldetectstr.caption msgid "D&etect string:" msgstr "" #: tfrmtweakplugin.lblextension.caption msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "" #: tfrmtweakplugin.lblname.caption msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "" #: tfrmtweakplugin.lblplugin.caption msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "" #: tfrmtweakplugin.lblplugin1.caption msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "" #: tfrmviewer.actabout.caption msgctxt "TFRMVIEWER.ACTABOUT.CAPTION" msgid "About Viewer..." msgstr "" #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "" #: tfrmviewer.actcopyfile.caption msgctxt "TFRMVIEWER.ACTCOPYFILE.CAPTION" msgid "Copy File" msgstr "" #: tfrmviewer.actcopyfile.hint msgctxt "TFRMVIEWER.ACTCOPYFILE.HINT" msgid "Copy File" msgstr "" #: tfrmviewer.actdeletefile.caption msgctxt "TFRMVIEWER.ACTDELETEFILE.CAPTION" msgid "Delete File" msgstr "" #: tfrmviewer.actdeletefile.hint msgctxt "TFRMVIEWER.ACTDELETEFILE.HINT" msgid "Delete File" msgstr "" #: tfrmviewer.actloadnextfile.caption msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.CAPTION" msgid "&Next" msgstr "" #: tfrmviewer.actloadnextfile.hint msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.HINT" msgid "Load Next File" msgstr "" #: tfrmviewer.actloadprevfile.caption msgctxt "TFRMVIEWER.ACTLOADPREVFILE.CAPTION" msgid "&Previous" msgstr "" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "" #: tfrmviewer.actmirror.caption msgctxt "TFRMVIEWER.ACTMIRROR.CAPTION" msgid "Mirror" msgstr "" #: tfrmviewer.actmirror.hint msgctxt "TFRMVIEWER.ACTMIRROR.HINT" msgid "Mirror" msgstr "" #: tfrmviewer.actmovefile.caption msgctxt "TFRMVIEWER.ACTMOVEFILE.CAPTION" msgid "Move File" msgstr "" #: tfrmviewer.actmovefile.hint msgctxt "TFRMVIEWER.ACTMOVEFILE.HINT" msgid "Move File" msgstr "" #: tfrmviewer.actreload.caption msgctxt "TFRMVIEWER.ACTRELOAD.CAPTION" msgid "Reload" msgstr "" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "" #: tfrmviewer.actrotate180.caption msgctxt "TFRMVIEWER.ACTROTATE180.CAPTION" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate180.hint msgctxt "TFRMVIEWER.ACTROTATE180.HINT" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate270.caption msgctxt "TFRMVIEWER.ACTROTATE270.CAPTION" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate270.hint msgctxt "TFRMVIEWER.ACTROTATE270.HINT" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate90.caption msgctxt "TFRMVIEWER.ACTROTATE90.CAPTION" msgid "Rotate 90" msgstr "" #: tfrmviewer.actrotate90.hint msgctxt "TFRMVIEWER.ACTROTATE90.HINT" msgid "Rotate 90" msgstr "" #: tfrmviewer.actsaveas.caption msgctxt "TFRMVIEWER.ACTSAVEAS.CAPTION" msgid "Save As..." msgstr "" #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "" #: tfrmviewer.actstretchimage.caption msgctxt "TFRMVIEWER.ACTSTRETCHIMAGE.CAPTION" msgid "Stretch" msgstr "" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "" #: tfrmviewer.caption msgctxt "TFRMVIEWER.CAPTION" msgid "Viewer" msgstr "" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "" #: tfrmviewer.mirotate.caption msgctxt "TFRMVIEWER.MIROTATE.CAPTION" msgid "Rotate" msgstr "" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "" #: tfrmviewer.misaveas.caption msgctxt "TFRMVIEWER.MISAVEAS.CAPTION" msgid "Save As..." msgstr "" #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "" #: tfrmviewer.mistretch.caption msgctxt "TFRMVIEWER.MISTRETCH.CAPTION" msgid "Stretch" msgstr "" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "" #: tfrmviewoperations.btnstartpause.caption msgctxt "TFRMVIEWOPERATIONS.BTNSTARTPAUSE.CAPTION" msgid "&Start" msgstr "" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "" #: tfrmviewoperations.caption msgctxt "TFRMVIEWOPERATIONS.CAPTION" msgid "File operations" msgstr "" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "" #: tfrmviewoperations.mnucanceloperation.caption msgctxt "TFRMVIEWOPERATIONS.MNUCANCELOPERATION.CAPTION" msgid "Cancel" msgstr "" #: tfrmviewoperations.mnucancelqueue.caption msgctxt "TFRMVIEWOPERATIONS.MNUCANCELQUEUE.CAPTION" msgid "Cancel" msgstr "" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "TFRMVIEWOPERATIONS.MNUOPERATIONSHOWDETACHED.CAPTION" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "" #: tfrmviewoperations.mnuqueue.caption msgctxt "TFRMVIEWOPERATIONS.MNUQUEUE.CAPTION" msgid "Queue" msgstr "" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "TFRMVIEWOPERATIONS.MNUQUEUESHOWDETACHED.CAPTION" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "TMULTIARCHIVECOPYOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "TWCXARCHIVECOPYOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "" #: ulng.rscolattr msgid "Attr" msgstr "" #: ulng.rscoldate msgid "Date" msgstr "" #: ulng.rscolext msgid "Ext" msgstr "" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "" #: ulng.rsconfcolalign msgid "Align" msgstr "" #: ulng.rsconfcolcaption msgid "Caption" msgstr "" #: ulng.rsconfcolconfig msgid "Config" msgstr "" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "" #: ulng.rsconfcustheader msgid "Customize column" msgstr "" #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "" #: ulng.rsdlgallopcomplete msgid "All operations completed" msgstr "" #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "" #: ulng.rsdlgbuttonno msgid "&No" msgstr "" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "" #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "" #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "" #: ulng.rsdlgoppause msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "" #: ulng.rsdlgopstart msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "" #: ulng.rsdlgspeedtime msgid "Speed %s/s, time remaining %s" msgstr "" #: ulng.rsdlgsplit msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "" #: ulng.rsdrivenolabel msgid "" msgstr "" #: ulng.rsdrivenomedia msgid "" msgstr "" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "" #: ulng.rseditnewfile msgid "new.txt" msgstr "" #: ulng.rseditnewfilename msgid "Filename:" msgstr "" #: ulng.rseditnewopen msgid "Open file" msgstr "" #: ulng.rseditsearchback msgid "&Backward" msgstr "" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "" #: ulng.rsfileopsetpropertyerroroptions msgctxt "ulng.rsfileopsetpropertyerroroptions" msgid "Ask;Don't set anymore;Ignore errors" msgstr "" #: ulng.rsfilterstatus msgid "FILTER" msgstr "" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "" #: ulng.rsfindfound msgctxt "ulng.rsfindfound" msgid "Found: %d" msgstr "" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "" #: ulng.rsfindscanned msgctxt "ulng.rsfindscanned" msgid "Scanned: %d" msgstr "" #: ulng.rsfindscanning msgid "Scanning" msgstr "" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr "" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "" #: ulng.rsfuncatime msgid "Access date/time" msgstr "" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "" #: ulng.rsfunccomment msgctxt "ulng.rsfunccomment" msgid "Comment" msgstr "" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "" #: ulng.rsfuncext msgid "Extension" msgstr "" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "" #: ulng.rsfunclinkto msgid "Link to" msgstr "" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "" #: ulng.rsfunctype msgid "Type" msgstr "" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "" #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "" #: ulng.rshotkeycategorymain msgid "Main" msgstr "" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "" #: ulng.rsmarkplus msgid "Select mask" msgstr "" #: ulng.rsmaskinput msgid "Input mask:" msgstr "" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "" #: ulng.rsmnueject msgid "Eject" msgstr "" #: ulng.rsmnumount msgid "Mount" msgstr "" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "" #: ulng.rsmnunomedia msgid "No media available" msgstr "" #: ulng.rsmnuopenwith msgid "Open with" msgstr "" #: ulng.rsmnuopenwithother msgid "Other..." msgstr "" #: ulng.rsmnusortby msgid "Sort by" msgstr "" #: ulng.rsmnuumount msgid "Unmount" msgstr "" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "" #: ulng.rsmsgaccount msgid "Account:" msgstr "" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "" #: ulng.rsmsgentername msgid "Enter name:" msgstr "" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "" #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "" #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "" #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "" #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "" #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "" #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "" #: ulng.rsmsglogerror msgid "Error: " msgstr "" #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "" #: ulng.rsmsgloginfo msgid "Info: " msgstr "" #: ulng.rsmsgloglink msgid "Create link %s" msgstr "" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "" #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "" #: ulng.rsmsgnewfile msgid "New file" msgstr "" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "" #: ulng.rsmsgnofiles msgid "No files" msgstr "" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "" #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "" #: ulng.rsmsgpassword msgid "Password:" msgstr "" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "" #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "" #: ulng.rsmsgurl msgid "URL:" msgstr "" #: ulng.rsmsgusername msgid "User name:" msgstr "" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "" #: ulng.rsmulrenfilenamestylelist msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "" #: ulng.rsoperaborted msgid "Aborted" msgstr "" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "" #: ulng.rsopercombining msgid "Joining" msgstr "" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopying msgid "Copying" msgstr "" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "" #: ulng.rsoperexecuting msgid "Executing" msgstr "" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "" #: ulng.rsoperextracting msgid "Extracting" msgstr "" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperfinished msgid "Finished" msgstr "" #: ulng.rsoperlisting msgid "Listing" msgstr "" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "" #: ulng.rsopermoving msgid "Moving" msgstr "" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "" #: ulng.rsopernotstarted msgid "Not started" msgstr "" #: ulng.rsoperpacking msgid "Packing" msgstr "" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpaused msgid "Paused" msgstr "" #: ulng.rsoperpausing msgid "Pausing" msgstr "" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "" #: ulng.rsoperrunning msgid "Running" msgstr "" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "" #: ulng.rsopersplitting msgid "Splitting" msgstr "" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperstarting msgid "Starting" msgstr "" #: ulng.rsoperstopped msgid "Stopped" msgstr "" #: ulng.rsoperstopping msgid "Stopping" msgstr "" #: ulng.rsopertesting msgid "Testing" msgstr "" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "" #: ulng.rsoperwiping msgid "Wiping" msgstr "" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "" #: ulng.rsoperworking msgid "Working" msgstr "" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "" #: ulng.rsoptarchivevalue msgid "Value" msgstr "" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "" #: ulng.rsoptdisable msgid "Disable" msgstr "" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "" #: ulng.rsoptenterext msgid "Enter extension" msgstr "" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "" #: ulng.rsoptexamplemark msgid "Mark" msgstr "" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "" #: ulng.rsoptexampletext msgid "Text" msgstr "" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "" #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "" #: ulng.rsopthotkeysdeletetrashcanoverrides msgctxt "ulng.rsopthotkeysdeletetrashcanoverrides" msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgctxt "ulng.rsopthotkeysdeletetrashcanparameterexists" msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "" #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "" #: ulng.rsopthotkeysshortcutusedtext1 msgid "Shortcut %s is already used." msgstr "" #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "" #: ulng.rsopthotkeysusedby msgid "used for %s in %s" msgstr "" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "" #: ulng.rsoptionseditorcolumnsview msgid "Columns" msgstr "" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "" #: ulng.rsoptionseditorfileoperations msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "" #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "" #: ulng.rsoptionseditorquicksearch msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "" #: ulng.rsopttoolbarbuttontype msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "" #: ulng.rspropsno msgid "No" msgstr "" #: ulng.rspropssocket msgid "Socket" msgstr "" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "" #: ulng.rssearchresult msgid "Search result" msgstr "" #: ulng.rssearchtemplateunnamed msgid "" msgstr "" #: ulng.rsselectdir msgid "Select a directory" msgstr "" #: ulng.rsshowhelpfor msgid "&Show help for %s" msgstr "" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "" #: ulng.rssplitseldir msgid "Select directory:" msgstr "" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "" #: ulng.rssyndefaulttext msgctxt "ulng.rssyndefaulttext" msgid "Default text" msgstr "" #: ulng.rssynlangplaintext msgctxt "ulng.rssynlangplaintext" msgid "Plain text" msgstr "" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "" #: ulng.rstimeunityear msgid "Year(s)" msgstr "" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "" #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "" #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "" doublecmd-0.5.8/language/doublecmd.sl.po0000644000175000017500000060755512255263151017230 0ustar alexxalexx# Slovenian translations for double-commander. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. # This file is distributed under the same license as the double-commander package. # # Matej Urbančič , 2011 - 2013. msgid "" msgstr "" "Project-Id-Version: double-commander 0.5.5 alpha\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-01-17 23:08+0300\n" "PO-Revision-Date: 2013-04-14 22:21+0100\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenian GNOME Translation Team \n" "Language: sl_SI\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 1.5.4\n" "X-Poedit-Language: Slovenian\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "Vse" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "Vse" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "Vse" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "Vse" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "Vse" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "Vse" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "Vse" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "Prekliči" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "..." #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "->" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "V &redu" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "<-" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "Nastavitev pogleda stolpcev po meri" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "Ozadje:" #: tfcolumnssetconf.cbcursorborder.caption msgid "Cursor border" msgstr "Okvir kazalke" #: tfcolumnssetconf.cbovercolor.caption msgid "Allow Overcolor" msgstr "Dovoli nadbarvo" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "Uporabi barvo in pisavo po meri" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "Barva besedila:" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "Pisava:" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "Velikost:" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "Ozadje 2:" #: tfcolumnssetconf.lblconfigviewnr.caption msgid "Configure view nr:" msgstr "Nastavitev pogleda:" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "Barva kazalke:" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "Besedilo kazalke:" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "Barva oznake:" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "Ime:" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "Dodaj stolpec" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "Prilagajanje stolpcev" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "Predogled" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "R" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "Izbor predloge ..." #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption msgid "C&heck free space" msgstr "Preveri &zasedenost prostora" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption msgid "Cop&y attributes" msgstr "&Kopiraj atribute" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption msgid "Copy o&wnership" msgstr "Kopiraj &lastništvo" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption msgid "Copy d&ate/time" msgstr "Kopiraj &datum in čas" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption msgid "Correct lin&ks" msgstr "Popravi &povezave" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "Odstrani zastavico le za &branje" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption msgid "E&xclude empty directories" msgstr "Ne &upoštevaj praznih map" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption msgid "Fo&llow links" msgstr "Sledi &povezavam" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "&Zadrži prostor" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "Kaj storiti, ko ni mogoče nastaviti časa datoteke, atributov ..." #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "Uporabi predlogo datotek" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption msgid "When dir&ectory exists" msgstr "Če mapa že obstaja" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "Če datoteka že obstaj" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption msgid "When ca&nnot set property" msgstr "Ko &lastnosti ni mogoče nastaviti" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "" #: tfrmabout.btnclose.caption msgctxt "TFRMABOUT.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zapri" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "Kopiraj v odložišče" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "O programu" #: tfrmabout.lblbuild.caption msgid "Build" msgstr "Izgradnja" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "Free Pascal" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "Domača stran:" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "http://doublecmd.sourceforge.net" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "Lazarus" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "Predelava" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption msgid "Version" msgstr "Različica" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "V &redu" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "&Ponastavi" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "Izbor atributov" #: tfrmattributesedit.cbarchive.caption msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "&Arhiv" #: tfrmattributesedit.cbcompressed.caption msgid "Co&mpressed" msgstr "&Stisnjeno" #: tfrmattributesedit.cbdirectory.caption msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "&Mapa" #: tfrmattributesedit.cbencrypted.caption msgid "&Encrypted" msgstr "&Šifrirano" #: tfrmattributesedit.cbhidden.caption msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "&Skrito" #: tfrmattributesedit.cbreadonly.caption msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "Le za &branje" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmattributesedit.cbsparse.caption msgid "S&parse" msgstr "&Redko" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Lepljivo" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmattributesedit.cbsymlink.caption msgid "&Symlink" msgstr "&Simbolna povezava" #: tfrmattributesedit.cbsystem.caption msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "S&istem" #: tfrmattributesedit.cbtemporary.caption msgid "&Temporary" msgstr "&Začasno" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "Atributi NTFS" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "Splošni atributi" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Biti:" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Skupina" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Drugo" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Lastnik" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "Izvedi" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "Preberi" #: tfrmattributesedit.lbltextattrs.caption msgid "As te&xt:" msgstr "Kot &besedilo:" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "Zapiši" #: tfrmchecksumcalc.btncancel.caption msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "&V redu" #: tfrmchecksumcalc.caption msgctxt "TFRMCHECKSUMCALC.CAPTION" msgid "Calculate check sum..." msgstr "Izračunaj nadzorno vsoto ..." #: tfrmchecksumcalc.cbseparatefile.caption msgid "C&reate separate checksum file for each file" msgstr "&Ustvari ločeno datoteko nadzorne vsote za vsako datoteko" #: tfrmchecksumcalc.lblsaveto.caption msgid "&Save check sum file(s) to:" msgstr "&Shrani datoteke nadzornih vsot v:" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zapri" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "Preveri nadzorne vsote ..." #: tfrmconnectionmanager.btnadd.caption msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "&Dodaj" #: tfrmconnectionmanager.btncancel.caption msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmconnectionmanager.btnconnect.caption msgid "C&onnect" msgstr "&Povezava" #: tfrmconnectionmanager.btndelete.caption msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "&Izbriši" #: tfrmconnectionmanager.btnedit.caption msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "&Uredi" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "Upravljalnik povezav" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "Povezava s strežnikom:" #: tfrmcopydlg.btnaddtoqueue.caption msgid "A&dd To Queue" msgstr "&Dodaj v vrsto" #: tfrmcopydlg.btncancel.caption msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "TFRMCOPYDLG.BTNCREATESPECIALQUEUE.CAPTION" msgid "..." msgstr "..." #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "&Možnosti" #: tfrmcopydlg.btnsaveoptions.caption msgid "Sa&ve these options as default" msgstr "&Shrani trenutne možnosti kot privzete" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "Kopiraj datoteke" #: tfrmdescredit.btncancel.caption msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&V redu" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "Opomba datoteke ali mape" #: tfrmdescredit.lbleditcommentfor.caption msgid "E&dit comment for:" msgstr "&Uredi opombo za:" #: tfrmdescredit.lblencoding.caption msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "&Kodiranje" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "O programu" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "Samodejna primerjava" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "Dvojiški način" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "Prekliči" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "Prekliči" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "Kopiraj blok na desno" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "Kopiraj blok na desno" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "Kopiraj blok na levo" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "Kopiraj blok na levo" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Kopiraj" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Izreži" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Izbriši" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Prilepi" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Ponovno uveljavi" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "Izberi &vse" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Razveljavi" #: tfrmdiffer.actexit.caption msgctxt "TFRMDIFFER.ACTEXIT.CAPTION" msgid "E&xit" msgstr "&Končaj" #: tfrmdiffer.actfirstdifference.caption msgctxt "TFRMDIFFER.ACTFIRSTDIFFERENCE.CAPTION" msgid "First Difference" msgstr "Prva razlika" #: tfrmdiffer.actfirstdifference.hint msgctxt "TFRMDIFFER.ACTFIRSTDIFFERENCE.HINT" msgid "First Difference" msgstr "Prva razlika" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "Prezri velikost črk" #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "Prezri prazne" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "Nadaljuj drsenje" #: tfrmdiffer.actlastdifference.caption msgctxt "TFRMDIFFER.ACTLASTDIFFERENCE.CAPTION" msgid "Last Difference" msgstr "Zadnja razlika" #: tfrmdiffer.actlastdifference.hint msgctxt "TFRMDIFFER.ACTLASTDIFFERENCE.HINT" msgid "Last Difference" msgstr "Zadnja razlika" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "Vrstične razlike" #: tfrmdiffer.actnextdifference.caption msgctxt "TFRMDIFFER.ACTNEXTDIFFERENCE.CAPTION" msgid "Next Difference" msgstr "Naslednja razlika" #: tfrmdiffer.actnextdifference.hint msgctxt "TFRMDIFFER.ACTNEXTDIFFERENCE.HINT" msgid "Next Difference" msgstr "Naslednja razlika" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "Odpri levo ..." #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "Odpri desno ..." #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "Obarvaj ozadje" #: tfrmdiffer.actprevdifference.caption msgctxt "TFRMDIFFER.ACTPREVDIFFERENCE.CAPTION" msgid "Previous Difference" msgstr "Predhodna razlika" #: tfrmdiffer.actprevdifference.hint msgctxt "TFRMDIFFER.ACTPREVDIFFERENCE.HINT" msgid "Previous Difference" msgstr "Predhodna razlika" #: tfrmdiffer.actreload.caption msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "&Ponovno naloži" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "Ponovno naloži" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "Shrani" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "Shrani" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "Shrani kot ..." #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "Shrani kot ..." #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "Shrani levo" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "Shrani levo" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "Shrani levo kot ..." #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "Shrani levo kot ..." #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "Shrani desno" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "Shrani desno" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "Shrani desno kot ..." #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "Shrani desno kot ..." #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "Primerjava" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "Primerjava" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "Nabor znakov" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "Nabor znakov" #: tfrmdiffer.caption msgctxt "TFRMDIFFER.CAPTION" msgid "Compare files" msgstr "Primerjava datotek" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miencodingleft.caption msgid "&Left" msgstr "&Levo" #: tfrmdiffer.miencodingright.caption msgid "&Right" msgstr "&Desno" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "&Dejanja" #: tfrmdiffer.mnuedit.caption msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "&&Uredi" #: tfrmdiffer.mnuencoding.caption msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "Nabor &znakov" #: tfrmdiffer.mnufile.caption msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "&Datoteka" #: tfrmdiffer.mnuoptions.caption msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "&Možnosti" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "Dodaj novo tipkovno bližnjico v zaporedje" #: tfrmedithotkey.btncancel.caption msgctxt "TFRMEDITHOTKEY.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmedithotkey.btnok.caption msgctxt "TFRMEDITHOTKEY.BTNOK.CAPTION" msgid "&OK" msgstr "V &redu" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "Odstrani zadnjo tipkovno bližnjico iz zaporedja" #: tfrmedithotkey.cghkcontrols.caption msgctxt "TFRMEDITHOTKEY.CGHKCONTROLS.CAPTION" msgid "Only for these controls" msgstr "Le za navedene tipke" #: tfrmedithotkey.lblparameters.caption msgid "&Parameters (each in a separate line):" msgstr "&Parametri (vsak ločeno v svoji vrstici):" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "Tipkovne bližnjice:" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "O programu" #: tfrmeditor.actabout.hint msgctxt "TFRMEDITOR.ACTABOUT.HINT" msgid "About" msgstr "O programu" #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "&Nastavitve" #: tfrmeditor.actconfhigh.hint msgctxt "TFRMEDITOR.ACTCONFHIGH.HINT" msgid "Configuration" msgstr "Nastavitve" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Kopiraj" #: tfrmeditor.acteditcopy.hint msgctxt "TFRMEDITOR.ACTEDITCOPY.HINT" msgid "Copy" msgstr "Kopiraj" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Izreži" #: tfrmeditor.acteditcut.hint msgctxt "TFRMEDITOR.ACTEDITCUT.HINT" msgid "Cut" msgstr "Izreži" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Izbriši" #: tfrmeditor.acteditdelete.hint msgctxt "TFRMEDITOR.ACTEDITDELETE.HINT" msgid "Delete" msgstr "Izbriši" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "&Najdi" #: tfrmeditor.acteditfind.hint msgctxt "TFRMEDITOR.ACTEDITFIND.HINT" msgid "Find" msgstr "Najdi" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "Najdi naslednje" #: tfrmeditor.acteditfindnext.hint msgctxt "TFRMEDITOR.ACTEDITFINDNEXT.HINT" msgid "Find next" msgstr "Najdi naslednje" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "Mac (CR)" #: tfrmeditor.acteditlineendcr.hint msgctxt "TFRMEDITOR.ACTEDITLINEENDCR.HINT" msgid "Mac (CR)" msgstr "Mac (CR)" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "Windows (CRLF)" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "TFRMEDITOR.ACTEDITLINEENDCRLF.HINT" msgid "Windows (CRLF)" msgstr "Windows (CRLF)" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "Unix (LF)" #: tfrmeditor.acteditlineendlf.hint msgctxt "TFRMEDITOR.ACTEDITLINEENDLF.HINT" msgid "Unix (LF)" msgstr "Unix (LF)" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Prilepi" #: tfrmeditor.acteditpaste.hint msgctxt "TFRMEDITOR.ACTEDITPASTE.HINT" msgid "Paste" msgstr "Prilepi" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Ponovi" #: tfrmeditor.acteditredo.hint msgctxt "TFRMEDITOR.ACTEDITREDO.HINT" msgid "Redo" msgstr "Ponovno uveljavi" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "&Zamenjaj" #: tfrmeditor.acteditrplc.hint msgctxt "TFRMEDITOR.ACTEDITRPLC.HINT" msgid "Replace" msgstr "Zamenjaj" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "Izberi &vse" #: tfrmeditor.acteditselectall.hint msgctxt "TFRMEDITOR.ACTEDITSELECTALL.HINT" msgid "Select All" msgstr "Izberi vse" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Razveljavi" #: tfrmeditor.acteditundo.hint msgctxt "TFRMEDITOR.ACTEDITUNDO.HINT" msgid "Undo" msgstr "Razveljavi" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "&Zapri" #: tfrmeditor.actfileclose.hint msgctxt "TFRMEDITOR.ACTFILECLOSE.HINT" msgid "Close" msgstr "Zapri" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "&Končaj" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "Končaj" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "&Novo" #: tfrmeditor.actfilenew.hint msgctxt "TFRMEDITOR.ACTFILENEW.HINT" msgid "New" msgstr "Novo" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "&Odpri" #: tfrmeditor.actfileopen.hint msgctxt "TFRMEDITOR.ACTFILEOPEN.HINT" msgid "Open" msgstr "Odpri" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "&Shrani" #: tfrmeditor.actfilesave.hint msgctxt "TFRMEDITOR.ACTFILESAVE.HINT" msgid "Save" msgstr "Shrani" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "Shrani &kot ..." #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "Shrani kot" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "Shra&ni vse" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "Shrani vse" #: tfrmeditor.caption msgctxt "TFRMEDITOR.CAPTION" msgid "Editor" msgstr "Urejevalnik" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "Pomo&č" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Uredi" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "Nabor &znakov" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "Odpri kot" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "Shrani kot" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "&Datoteka" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "Poudarjanje skladnje" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "Konec vrstice" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n5.caption msgctxt "TFRMEDITOR.N5.CAPTION" msgid "-" msgstr "-" #: tfrmeditsearchreplace.btncancel.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "&V redu" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "Upoštevanje &velikosti črk" #: tfrmeditsearchreplace.cbsearchfromcursor.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "Išči od &kazalke naprej" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "&Logični izraz" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "Le izbrano &besedilo" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "Le &cele besede" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "Možnost" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "Zamenjaj &z:" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "&Poišči:" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "Smer" #: tfrmextractdlg.btncancel.caption msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmextractdlg.btnhelp.caption msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Pomo&č" #: tfrmextractdlg.btnok.caption msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "V &redu" #: tfrmextractdlg.caption msgctxt "TFRMEXTRACTDLG.CAPTION" msgid "Unpack files" msgstr "Odpakiraj datoteke" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "&Odpakiraj poti datotek, če to se shranjene v arhivu" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*.*" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "Odpakiraj vsak arhiv v &ločeno podrejeno mapo (z imenom vsakega arhiva)" #: tfrmextractdlg.cboverwrite.caption msgid "O&verwrite existing files" msgstr "&Prepiši obstoječe datoteke" #: tfrmextractdlg.lblextractto.caption msgid "To the &directory:" msgstr "V &mapo:" #: tfrmextractdlg.lblfilemask.caption msgid "&Extract files matching file mask:" msgstr "&Odpakiraj datoteke z masko:" #: tfrmextractdlg.lblpassword.caption msgid "&Password for encrypted files:" msgstr "&Geslo šifriranih datotek:" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "Dodaj" #: tfrmfileassoc.btnaddext.caption msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "&Dodaj" #: tfrmfileassoc.btnaddnewtype.caption msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "&Dodaj" #: tfrmfileassoc.btncancel.caption msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmfileassoc.btndownact.caption msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "&Dol" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "&V redu" #: tfrmfileassoc.btnremoveact.caption msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "O&dstrani" #: tfrmfileassoc.btnremoveext.caption msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "&Odstrani" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "X" #: tfrmfileassoc.btnremovetype.caption msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "&Odstrani" #: tfrmfileassoc.btnrenametype.caption msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "&Preimenuj" #: tfrmfileassoc.btnupact.caption msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "&Gor" #: tfrmfileassoc.caption msgid "File associations" msgstr "Programske vezi" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "Dejanja" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "Pripone" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "Vrste datotek" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "Ikona" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "Dejanje:" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "&Ukaz:" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "Uredi" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "Odpri v urejevalniku" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "Ime datoteke" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "Pot datoteke" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "Polna pot" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "Pridobi odvod ukaza" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "Odpri" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "Zaženi v terminalu" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "Odpri v VFS" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "Pogled" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "Odpri v pregledovalniku" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zapri" #: tfrmfileexecuteyourself.caption msgctxt "TFRMFILEEXECUTEYOURSELF.CAPTION" msgid "Wait..." msgstr "Počakaj ..." #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "Ime datoteke:" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "Iz:" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "Kliknite na gumb za zapiranje, ko se začasno datoteko lahko izbriše!" #: tfrmfileop.btncancel.caption msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "Na &okno" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "Poglej &vse" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "Trenutno opravilo:" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "Iz:" #: tfrmfileop.lblto.caption msgid "To:" msgstr "V:" #: tfrmfileproperties.btnclose.caption msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zapri" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "&Nastavi lastnosti" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "Nastavi &vsem" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "Pres&koči datoteko" #: tfrmfileproperties.caption msgctxt "TFRMFILEPROPERTIES.CAPTION" msgid "Properties" msgstr "Lastnosti" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Lepljivo" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "Lastnik" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Biti:" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Skupina" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Ostalo" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Lastnik" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmfileproperties.lblattrtextstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Besedilno:" #: tfrmfileproperties.lblcontains.caption msgctxt "TFRMFILEPROPERTIES.LBLCONTAINS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "Vsebuje:" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Izvedi" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "Ime datoteke" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "Ime:" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "Ime datoteke" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "Pot:" #: tfrmfileproperties.lblgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "&Skupina" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "Zadnji dostop:" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "Zadnja sprememba:" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "Zadnja sprememba stanja:" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Osmiško:" #: tfrmfileproperties.lblownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "&Lastnik" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Prebrano" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "Velikost:" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption msgid "Symlink to:" msgstr "Simbolna povezava na:" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption msgid "Type:" msgstr "Vrsta:" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Zapiši" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atributi" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "Lastnosti" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "&Dodaj" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "Pomo&č" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zapri" #: tfrmfinddlg.btnedit.caption msgctxt "TFRMFINDDLG.BTNEDIT.CAPTION" msgid "&Edit" msgstr "&Uredi" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "&Skoči na datoteko" #: tfrmfinddlg.btnlastsearch.caption msgctxt "TFRMFINDDLG.BTNLASTSEARCH.CAPTION" msgid "&Last search" msgstr "&Zadnje iskanje" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "&Novo iskanje" #: tfrmfinddlg.btnsavetemplate.caption msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "&Shrani" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "&Izbriši" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "&Naloži" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "&Shrani" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption msgid "Sa&ve with \"Start in directory\"" msgstr "Sh&rani z možnostjo \"Začni v mapi\"" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "V kolikor je možnost \"Začni v mapi\" shranjena, bo mesto obnovljeno med nalaganjem predloge. Možnost je uporabna pri iskanju v določeni mapi." #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "&Začni" #: tfrmfinddlg.btnstop.caption msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "&Prekliči" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "Uporabi predlogo" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "&Pogled" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "Izpiši v &seznam" #: tfrmfinddlg.caption msgctxt "TFRMFINDDLG.CAPTION" msgid "Find files" msgstr "Najdi datoteke" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "Upoštevaj &velikost črk" #: tfrmfinddlg.cbdatefrom.caption msgid "&Date from:" msgstr "&Od datuma:" #: tfrmfinddlg.cbdateto.caption msgid "Dat&e to:" msgstr "&Do datuma:" #: tfrmfinddlg.cbfilesizefrom.caption msgid "S&ize from:" msgstr "&Od velikosti:" #: tfrmfinddlg.cbfilesizeto.caption msgid "Si&ze to:" msgstr "&Do velikosti:" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "Najdi &besedilo" #: tfrmfinddlg.cbfollowsymlinks.caption msgctxt "TFRMFINDDLG.CBFOLLOWSYMLINKS.CAPTION" msgid "Follow s&ymlinks" msgstr "Sledi &simbolnim povezavam" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "Najdi datoteke, ki &ne vsebujejo besedila" #: tfrmfinddlg.cbnotolderthan.caption msgid "N&ot older than:" msgstr "Ni &starejše kot:" #: tfrmfinddlg.cbpartialnamesearch.caption msgid "Searc&h for part of file name" msgstr "Poišči &del imena datoteke" #: tfrmfinddlg.cbregexp.caption msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "&Logični izraz" #: tfrmfinddlg.cbreplacetext.caption msgid "Re&place by" msgstr "&Zamenjaj besedilo z" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "Izbrane &datoteke in mape" #: tfrmfinddlg.cbtimefrom.caption msgid "&Time from:" msgstr "&Od časa:" #: tfrmfinddlg.cbtimeto.caption msgid "Ti&me to:" msgstr "&do časa:" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "Uporabi vstavek &iskanja:" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "Vpis imen map, ki naj ne bodo upoštevana v iskanju; imena morajo biti ločena z znakom \";\"" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "Vpis imen datotek, ki naj ne bodo upoštevana v iskanju; imena morajo biti ločena z znakom \";\"" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "Vpis imen datotek, ločenih z \";\"" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption msgctxt "TFRMFINDDLG.GBDIRECTORIES.CAPTION" msgid "Directories" msgstr "Mape" #: tfrmfinddlg.gbfiles.caption msgctxt "TFRMFINDDLG.GBFILES.CAPTION" msgid "Files" msgstr "Datoteke" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "Najdi podatke" #: tfrmfinddlg.lblattributes.caption msgctxt "TFRMFINDDLG.LBLATTRIBUTES.CAPTION" msgid "Attri&butes" msgstr "&Atributi" #: tfrmfinddlg.lblencoding.caption msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "&Kodiranje:" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "Ne upoštevaj &podmap:" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "Ne upoštevaj &datotek" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "Poišči datoteke z &masko:" #: tfrmfinddlg.lblfindpathstart.caption msgid "Start in &directory" msgstr "Začni v &mapi" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "Poišči tudi po &podrejenih mapah:" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "&Shranjena iskanja:" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "Odstrani s seznama" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "Pokaži vse najdene predmete" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "Pokaži v pregledovalniku" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "Napredno" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "Naloži/Shrani" #: tfrmfinddlg.tsplugins.caption msgctxt "TFRMFINDDLG.TSPLUGINS.CAPTION" msgid "Plugins" msgstr "Vstavki" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "Rezultati" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "Običajno" #: tfrmfindview.btnclose.caption msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmfindview.btnfind.caption msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "&Najdi" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "Najdi" #: tfrmfindview.cbcasesens.caption msgid "C&ase sensitive" msgstr "&Razlikovanje velikosti črk" #: tfrmhardlink.btncancel.caption msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&V redu" #: tfrmhardlink.caption msgid "Create hard link" msgstr "Ustvari trdo povezavo" #: tfrmhardlink.lblexistingfile.caption msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "&Cilj, do katerega kaže povezava" #: tfrmhardlink.lbllinktocreate.caption msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Ime &povezave" #: tfrmhotdir.btnadd.caption msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "&Dodaj" #: tfrmhotdir.btnaddman.caption msgid "Add &manually" msgstr "&Ročno dodajanje" #: tfrmhotdir.btncancel.caption msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmhotdir.btndelete.caption msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "&Izbriši" #: tfrmhotdir.btnedit.caption msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "&Uredi" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&V redu" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "Seznam hitrih map" #: tfrmlinker.btnexit.caption msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmlinker.btnok.caption msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "V &redu" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "..." #: tfrmlinker.caption msgctxt "TFRMLINKER.CAPTION" msgid "Linker" msgstr "Povezovalnik" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "Shrani v ..." #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "Predmet" #: tfrmlinker.lblfilename.caption msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "&Ime datoteke" #: tfrmlinker.spbtndel.caption msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "&Izbriši" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "Izbriši" #: tfrmlinker.spbtndown.caption msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "&Dol" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "Navzdol" #: tfrmlinker.spbtnup.caption msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "&Gor" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "Navzgor" #: tfrmmain.actabout.caption msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "&O programu" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "Doda ime datoteke v ukazno vrstico" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "Doda pot in ime datoteke v ukazno vrstico" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "Kopira pot v ukazno vrstico" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "Datotečni pogled" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "Pogled le imen datotek" #: tfrmmain.actcalculatespace.caption msgid "Calculate &Occupied Space" msgstr "Preračunaj &zasedenost prostora" #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "Zamenjaj mapo" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "Zamenjaj mapo v nadrejeno" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "Zamenjaj mapo v korensko" #: tfrmmain.actchecksumcalc.caption msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "Izračunaj &nadzorno vsoto ..." #: tfrmmain.actchecksumverify.caption msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "Preveri nadzo&rne vsote ..." #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "Počisti dnevniško datoteko" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "Počisti dnevniško okno" #: tfrmmain.actclosealltabs.caption msgctxt "TFRMMAIN.ACTCLOSEALLTABS.CAPTION" msgid "Close &All Tabs" msgstr "Zapri &vse zavihke" #: tfrmmain.actclosetab.caption msgctxt "TFRMMAIN.ACTCLOSETAB.CAPTION" msgid "&Close Tab" msgstr "&Zapri zavihek" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "Naslednji ukaz" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "Izberi naslednji ukaz v zgodovini izvedenih ukazov." #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "Predhodni ukaz" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "Izberi predhodni ukaz v zgodovini izvedenih ukazov." #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "Podrobni pogled" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "Stolpčni pogled" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "Primerjaj po &vsebini" #: tfrmmain.actcomparedirectories.caption msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.CAPTION" msgid "Compare Directories" msgstr "Primerjava map" #: tfrmmain.actcomparedirectories.hint msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.HINT" msgid "Compare Directories" msgstr "Primerjava map" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "Pokaži vsebinski meni" #: tfrmmain.actcopy.caption msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "Kopiraj" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "Kopiraj imena datotek s polno &potjo" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "Kopiraj i&mena datotek v odložišče" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "Kopiraj datoteke brez zahteve po potrditvi" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "Kopiraj v isto okno" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "&Kopiraj" #: tfrmmain.actcountdircontent.caption msgid "Sho&w Occupied Space" msgstr "Pokaži &zasedenost prostora" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "I&zreži" #: tfrmmain.actdelete.caption msgctxt "TFRMMAIN.ACTDELETE.CAPTION" msgid "Delete" msgstr "Izbriši" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "Zgodovina mape" #: tfrmmain.actdirhotlist.caption msgid "Directory &Hotlist" msgstr "Seznam &hitrih map" #: tfrmmain.actedit.caption msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "Uredi" #: tfrmmain.acteditcomment.caption msgid "Edit Co&mment..." msgstr "Uredi &opombe datotek ..." #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "Uredi novo datoteko" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "Uredi polje poti nad seznamom datotek" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "Zamenjaj &okni" #: tfrmmain.actexit.caption msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "&Končaj" #: tfrmmain.actextractfiles.caption msgid "&Extract Files..." msgstr "Odpa&kiraj datoteke ..." #: tfrmmain.actfileassoc.caption msgid "File &Associations..." msgstr "Programske &vezi ..." #: tfrmmain.actfilelinker.caption msgid "Com&bine Files..." msgstr "Zdr&uži razdeljeno datoteko ..." #: tfrmmain.actfileproperties.caption msgid "Show &File Properties" msgstr "Pokaži &lastnosti datoteke" #: tfrmmain.actfilespliter.caption msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "Raz&deli datoteko ..." #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "Postavi ukazno vrstico v žarišče" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "Postavi kazalko na prvo datoteko seznama" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "Postavi kazalko na zadnjo datoteko seznama" #: tfrmmain.acthardlink.caption msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "Ustvari &trdo povezavo ..." #: tfrmmain.acthelpindex.caption msgid "&Contents" msgstr "&Vsebina" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "Vodo&ravna postavitev oken" #: tfrmmain.actkeyboard.caption msgid "&Keyboard" msgstr "&Tipkovnica" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "Levo &= Desno" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "Odpri seznam levega pogona" #: tfrmmain.actloadselectionfromclip.caption msgid "Load Selection from Clip&board" msgstr "Naloži izbor iz o&dložišča" #: tfrmmain.actloadselectionfromfile.caption msgid "&Load Selection from File..." msgstr "&Naloži izbor iz datoteke ..." #: tfrmmain.actmakedir.caption msgid "MakeDir" msgstr "Nova mapa" #: tfrmmain.actmarkcurrentextension.caption msgid "Select All with the Same E&xtension" msgstr "Izberi vse datoteke z &enako pripono" #: tfrmmain.actmarkinvert.caption msgid "&Invert Selection" msgstr "Obrni iz&bor" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "Izberi &vse" #: tfrmmain.actmarkminus.caption msgid "Unselect a Gro&up..." msgstr "Počisti i&zbor po meri ..." #: tfrmmain.actmarkplus.caption msgid "Select a &Group..." msgstr "&Izberi po meri ..." #: tfrmmain.actmarkunmarkall.caption msgid "&Unselect All" msgstr "Počisti &izbor" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "Skrči okno" #: tfrmmain.actmultirename.caption msgid "Multi &Rename Tool" msgstr "Napredno &preimenovanje ..." #: tfrmmain.actnetworkconnect.caption msgid "Network &Connect..." msgstr "Omrežna &povezava ..." #: tfrmmain.actnetworkdisconnect.caption msgid "Network &Disconnect" msgstr "&Prekinitev omrežne povezave" #: tfrmmain.actnetworkquickconnect.caption msgid "Network &Quick Connect..." msgstr "&Hitra povezava z omrežjem ..." #: tfrmmain.actnewtab.caption msgid "&New Tab" msgstr "Nov &zavihek" #: tfrmmain.actnexttab.caption msgid "Switch to Nex&t Tab" msgstr "Preklopi na &naslednji zavihek" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "Odpri" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "Poskusi odpreti arhiv" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "Odpri datoteko orodne vrstice" #: tfrmmain.actopendirinnewtab.caption msgid "Open &Folder in a New Tab" msgstr "O&dpri mapo v novem zavihku" #: tfrmmain.actopenvirtualfilesystemlist.caption msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "Odpri seznam &VFS" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "Pre&gledovalnik opravil" #: tfrmmain.actoptions.caption msgid "&Options..." msgstr "&Možnosti ..." #: tfrmmain.actpackfiles.caption msgid "&Pack Files..." msgstr "Zapakira&j datoteke ..." #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "Določi položaj razdelilnika" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "&Prilepi" #: tfrmmain.actprevtab.caption msgid "Switch to &Previous Tab" msgstr "Preklopi na &predhodni zavihek" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "Hitri filter" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "Hitro iskanje" #: tfrmmain.actquickview.caption msgid "&Quick View Panel" msgstr "Okno &hitrega pogleda" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "&Osveži" #: tfrmmain.actrename.caption msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "Premakni" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "Premakni/Preimenuj datoteke brez zahteve po potrditvi" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "Preimenuj" #: tfrmmain.actrenametab.caption msgid "&Rename Tab" msgstr "Pr&eimenuj zavihek" #: tfrmmain.actrestoreselection.caption msgid "&Restore Selection" msgstr "Pov&rni izbor" #: tfrmmain.actreverseorder.caption msgid "Re&verse Order" msgstr "O&brnjen vrstni red" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "Desno &= Levo" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "Odpri seznam desnega pogona" #: tfrmmain.actrunterm.caption msgid "Run &Terminal" msgstr "Zaženi &terminal" #: tfrmmain.actsaveselection.caption msgid "Sa&ve Selection" msgstr "Shrani izb&or" #: tfrmmain.actsaveselectiontofile.caption msgid "Save S&election to File..." msgstr "Shrani &izbor v datoteko ..." #: tfrmmain.actsearch.caption msgid "&Search..." msgstr "I&skanje ..." #: tfrmmain.actsetfileproperties.caption msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "Spremeni &atribute ..." #: tfrmmain.actsettaboptiondirsinnewtab.caption msgid "Locked with Directories Opened in New &Tabs" msgstr "Zaklenjen zavihek z o&dpiranjem map v novih zavihkih" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "&Običajni zavihek" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "&Zaklenjen zavihek" #: tfrmmain.actsettaboptionpathresets.caption msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "Zaklenjen zavihek z dovoljenimi &spremembami map" #: tfrmmain.actshellexecute.caption msgctxt "TFRMMAIN.ACTSHELLEXECUTE.CAPTION" msgid "Open" msgstr "Odpri" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "Odpri z uporabo sistemskih programskih vezi" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "Pokaži meni gumbov" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "Pokaži zgodovino ukazne vrstice" #: tfrmmain.actshowmainmenu.caption msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "Meni" #: tfrmmain.actshowsysfiles.caption msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "Pokaži &skrite in sistemske datoteke" #: tfrmmain.actsortbyattr.caption msgid "Sort by &Attributes" msgstr "Razvrsti po &atributih" #: tfrmmain.actsortbydate.caption msgid "Sort by &Date" msgstr "Razvrsti po &datumu" #: tfrmmain.actsortbyext.caption msgid "Sort by &Extension" msgstr "Razvrsti po &priponi" #: tfrmmain.actsortbyname.caption msgid "Sort by &Name" msgstr "Razvrsti po &imenu" #: tfrmmain.actsortbysize.caption msgid "Sort by &Size" msgstr "Razvrsti po &velikost" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "Omogoči/Onemogoči seznam prezrtih datotek pri prikazovanju" #: tfrmmain.actsymlink.caption msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "Ustvari &simbolno povezavo ..." #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "Izenači z &dejavnim zavihkom" #: tfrmmain.acttestarchive.caption msgid "&Test Archive(s)" msgstr "Preizkusi &celovitost arhivov" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "Pogled sličic" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "Pogled sličic" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "Odpri označeno mapo desnega okna v levem oknu." #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "Odpri označeno mapo levega okna v desnem oknu." #: tfrmmain.actunmarkcurrentextension.caption msgid "Unselect All with the Same Ex&tension" msgstr "Odstrani izbor vse&h datotek z enako pripono" #: tfrmmain.actview.caption msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "Pogled" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "Pokaži zgodovino obiskanih poti dejavnega pogleda" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "Pojdi na naslednji vnos zgodovine" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "Pojdi na predhodni vnos zgodovine" #: tfrmmain.actvisithomepage.caption msgid "&Visit Double Commander Website" msgstr "Obišči &spletno stran programa" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "Neobnovljivo izbriši" #: tfrmmain.btnf10.caption msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "Končaj" #: tfrmmain.btnf8.caption msgctxt "TFRMMAIN.BTNF8.CAPTION" msgid "Delete" msgstr "Izbriši" #: tfrmmain.btnf9.caption msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "Terminal" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.HINT" msgid "Directory hotlist" msgstr "Seznam hitrih map" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "<" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "Pokaži trenutno mapo desnega okna v levem oknu." #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnlefthome.hint msgctxt "TFRMMAIN.BTNLEFTHOME.HINT" msgid "Go to home directory" msgstr "Pojdi v domačo mapo" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgctxt "TFRMMAIN.BTNLEFTROOT.HINT" msgid "Go to root directory" msgstr "Pojdi v korensko mapo" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgctxt "TFRMMAIN.BTNLEFTUP.HINT" msgid "Go to parent directory" msgstr "Pojdi v mapo višje" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr ">" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "Pokaži trenutno mapo levega okna v desnem oknu." #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "TFRMMAIN.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "Pot" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "&20/80" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "&30/70" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "&40/60" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "&50/50" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "&60/40" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "&70/30" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "&80/20" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "Prekliči" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "Kopiraj ..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "Ustvari povezavo ..." #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline33.caption msgctxt "TFRMMAIN.MILINE33.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline37.caption msgctxt "TFRMMAIN.MILINE37.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "-" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "Počisti" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "Kopiraj" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "Skrij" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "Izberi vse" #: tfrmmain.mimove.caption msgid "Move..." msgstr "Premakni ..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "Ustvari simbolno povezavo ..." #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "Možnosti zavihkov" #: tfrmmain.mitrayiconexit.caption msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "&Končaj" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "Obnovi" #: tfrmmain.mnualloperpause.caption msgctxt "TFRMMAIN.MNUALLOPERPAUSE.CAPTION" msgid "||" msgstr "||" #: tfrmmain.mnualloperstart.caption msgctxt "TFRMMAIN.MNUALLOPERSTART.CAPTION" msgid "Start" msgstr "Začni" #: tfrmmain.mnualloperstop.caption msgctxt "TFRMMAIN.MNUALLOPERSTOP.CAPTION" msgid "Cancel" msgstr "Prekliči" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "&Ukazi" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "&Nastavitve" #: tfrmmain.mnufiles.caption msgid "&Files" msgstr "&Datoteke" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "Pomo&č" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "&Izbor" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "Omrežje" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "&Pokaži" #: tfrmmain.mnutaboptions.caption msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "&Možnosti" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "&Zavihki" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "CD" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "Kopiraj" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "Izreži" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "Izbriši" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "Uredi" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "Prilepi" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmmaskinputdlg.btncancel.caption msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmmaskinputdlg.btndefinetemplate.caption msgid "&Define..." msgstr "&Določi ..." #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&V redu" #: tfrmmaskinputdlg.lblsearchtemplate.caption msgid "O&r select predefined selection type:" msgstr "Ali pa izberi &shranjeno masko izbire:" #: tfrmmkdir.btncancel.caption msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&V redu" #: tfrmmkdir.caption msgid "Create new directory" msgstr "Ustvari novo mapo" #: tfrmmkdir.lblmakedir.caption msgid "&Input new directory name:" msgstr "Vpis imena &nove mape:" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "V razmerju" #: tfrmmodview.caption msgctxt "TFRMMODVIEW.CAPTION" msgid "New Size" msgstr "Nova velikost" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "Višina :" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgctxt "tfrmmodview.lblpath2.caption" msgid "2" msgstr "2" #: tfrmmodview.lblpath3.caption msgctxt "tfrmmodview.lblpath3.caption" msgid "3" msgstr "3" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "4" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "5" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "Kakovost stiskanja zapisa JPG" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "Širina :" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "BMP" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "ICO" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "JPG" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "PNG" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "PNM" #: tfrmmodview.teheight.text msgid "Height" msgstr "Višina" #: tfrmmodview.tequality.text msgid "80" msgstr "80" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "Širina" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zapri" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "&Izbriši" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "&Naloži" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "&Preimenuj" #: tfrmmultirename.btnrestore.caption msgid "Reset &all" msgstr "Ponastavi &vse" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "&Shrani" #: tfrmmultirename.caption msgctxt "TFRMMULTIRENAME.CAPTION" msgid "MultiRename" msgstr "Napredno preimenovanje" #: tfrmmultirename.cblog.caption msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "&Omogoči" #: tfrmmultirename.cbregexp.caption msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "Logični &izrazi" #: tfrmmultirename.cbusesubs.caption msgid "&Use substitution" msgstr "Uporabi &zamenjave" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption msgid "[E] Extension" msgstr "[E] Pripona" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "Števec" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "Najdi in zamenjaj" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "Rezultat beleženja" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "Maska" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "Shranjena preimenovanja" #: tfrmmultirename.lbext.caption msgid "&Extension" msgstr "&Pripona" #: tfrmmultirename.lbfind.caption msgid "&Find..." msgstr "&Najdi ..." #: tfrmmultirename.lbinterval.caption msgid "&Interval" msgstr "&Razmik" #: tfrmmultirename.lbname.caption msgid "File &Name" msgstr "Ime &datoteke" #: tfrmmultirename.lbreplace.caption msgid "Re&place..." msgstr "&Zamenjaj ..." #: tfrmmultirename.lbstnb.caption msgid "S&tart Number" msgstr "&Začetna vrednost" #: tfrmmultirename.lbwidth.caption msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "&Širina" #: tfrmmultirename.micounter.caption msgid "[C] Counter" msgstr "[C] Števec" #: tfrmmultirename.miday.caption msgid "[D] Day" msgstr "[D] Dan" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "[DD] Dan (2 številki)" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "[DDD] Dan v tednu (kratko, npr.: \"pon\")" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "[DDDD] Dan v tednu (dolgo, npr.: \"ponedeljek\")" #: tfrmmultirename.miextensionx.caption msgid "[Ex] Character at position x" msgstr "[Ex] Znak pripone na mestu (x)" #: tfrmmultirename.miextensionxx.caption msgid "[Ex:y] Characters from position x to y" msgstr "[Ex] Znaki pripone med mestoma (x) in (y)" #: tfrmmultirename.mihour.caption msgid "[h] Hour" msgstr "[h] Ure" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "[hh] Ure (2 številki)" #: tfrmmultirename.miminute.caption msgid "[n] Minute" msgstr "[n] Minute" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "[nn] Minute (2 številki)" #: tfrmmultirename.mimonth.caption msgid "[M] Month" msgstr "[M] Mesec" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "[MM] Mesec (2 številki)" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "[MMM] Ime meseca (kratko, npr.: \"jan\")" #: tfrmmultirename.mimonth3.caption msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "[MMMM] Ime meseca (dolgo, npr.: \"januar\")" #: tfrmmultirename.miname.caption msgid "[N] Name" msgstr "[N] Ime" #: tfrmmultirename.minamex.caption msgid "[Nx] Character at position x" msgstr "[Nx] Znak imena na mestu (x)" #: tfrmmultirename.minamexx.caption msgid "[Nx:y] Characters from position x to y" msgstr "[Nx:y] Znaki imena med mestoma (x) in (y)" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "Čas ..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "Pripona ..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "Ime ..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "Vstavek" #: tfrmmultirename.misecond.caption msgid "[s] Second" msgstr "[s] Sekunde" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "[ss] Sekunde (2 številki)" #: tfrmmultirename.miyear.caption msgid "[Y] Year (2 digits)" msgstr "[Y] Leto (2 številki)" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "[YYYY] Leto (4 številke)" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "TFRMMULTIRENAME.STRINGGRID.COLUMNS[0].TITLE.CAPTION" msgid "Old File Name" msgstr "Staro ime datoteke" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "TFRMMULTIRENAME.STRINGGRID.COLUMNS[1].TITLE.CAPTION" msgid "New File Name" msgstr "Novo ime datoteke" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "TFRMMULTIRENAME.STRINGGRID.COLUMNS[2].TITLE.CAPTION" msgid "File Path" msgstr "Pot datoteke" #: tfrmopenwith.caption msgid "Choose an application" msgstr "Izbor programa" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "Ukaz po meri" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "Shrani programsko vez" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "Nastavi izbrani program za privzeto dejanje" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "Vrsta datoteke za odpiranje: %s" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "Imena več datotek" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "%F" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "Več naslovov URI" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "%U" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "Ime ene datoteke" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "%f" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "En naslov URI" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "%u" #: tfrmoptions.btnapply.caption msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "&Uveljavi" #: tfrmoptions.btncancel.caption msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "&V redu" #: tfrmoptions.caption msgctxt "TFRMOPTIONS.CAPTION" msgid "Options" msgstr "Možnosti" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "Nastavitve sklopa so urejene na straneh podrejenih kategorij." #: tfrmoptionsarchivers.btnautoconfig.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNAUTOCONFIG.CAPTION" msgid "A&uto Configure" msgstr "&Samodejno nastavi" #: tfrmoptionsarchivers.btnmultiarcadd.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCADD.CAPTION" msgid "A&dd" msgstr "&Dodaj" #: tfrmoptionsarchivers.btnmultiarcapply.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCAPPLY.CAPTION" msgid "A&pply" msgstr "&Uveljavi" #: tfrmoptionsarchivers.btnmultiarcdelete.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCDELETE.CAPTION" msgid "D&elete" msgstr "&Izbriši" #: tfrmoptionsarchivers.btnmultiarcrename.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCRENAME.CAPTION" msgid "&Rename" msgstr "&Preimenuj" #: tfrmoptionsarchivers.chkmultiarcdebug.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCDEBUG.CAPTION" msgid "De&bug mode" msgstr "Način &razhroščevanja" #: tfrmoptionsarchivers.chkmultiarcenabled.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCENABLED.CAPTION" msgid "E&nabled" msgstr "O&mogočeno" #: tfrmoptionsarchivers.chkmultiarcoutput.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCOUTPUT.CAPTION" msgid "S&how console output" msgstr "Pokaži &odvod konzole" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "TFRMOPTIONSARCHIVERS.GBARCHIVEROPTIONS.CAPTION" msgid "Options" msgstr "Možnosti" #: tfrmoptionsarchivers.lblarchiveadd.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEADD.CAPTION" msgid "Add&ing:" msgstr "Doda&janje:" #: tfrmoptionsarchivers.lblarchiveextension.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTENSION.CAPTION" msgid "E&xtension:" msgstr "&Razširitev:" #: tfrmoptionsarchivers.lblarchiveextract.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTRACT.CAPTION" msgid "Ex&tract:" msgstr "Raz&širi:" #: tfrmoptionsarchivers.lblarchivelist.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELIST.CAPTION" msgid "&List:" msgstr "&Seznam:" #: tfrmoptionsarchivers.lblarchivelistend.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTEND.CAPTION" msgid "Listing &finish (optional):" msgstr "&Konec seznama (izbirno):" #: tfrmoptionsarchivers.lblarchivelistformat.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTFORMAT.CAPTION" msgid "Listing for&mat:" msgstr "&Oblika seznama:" #: tfrmoptionsarchivers.lblarchiveliststart.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTSTART.CAPTION" msgid "Listin&g start (optional):" msgstr "&Začetek seznama (izbirno):" #: tfrmoptionsarchivers.lblarchiver.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVER.CAPTION" msgid "Arc&hiver:" msgstr "Ar&hivirnik:" #: tfrmoptionsarchivers.lbldescription.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLDESCRIPTION.CAPTION" msgid "De&scription:" msgstr "&Opis:" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERADDITIONAL.CAPTION" msgid "Additional" msgstr "Dodatno" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERGENERAL.CAPTION" msgid "General" msgstr "Splošno" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHATTRIBUTESCHANGE.CAPTION" msgid "When &size, date or attributes change" msgstr "če se spremeni &velikost, datum ali atributi." #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHEXCLUDEDIRS.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "za naslednje &poti in podrejene mape:" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHFILENAMECHANGE.CAPTION" msgid "When &files are created, deleted or renamed" msgstr "Ko je datoteka &ustvarjena, izbrisana ali preimenovana" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHONLYFOREGROUND.CAPTION" msgid "When application is in the &background" msgstr "če je program zagnan v &ozadju." #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHDISABLE.CAPTION" msgid "Disable auto-refresh" msgstr "Onemogoči samodejno osveževanje:" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHENABLE.CAPTION" msgid "Refresh file list" msgstr "Osveži seznam datotek:" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBALWAYSSHOWTRAYICON.CAPTION" msgid "Al&ways show tray icon" msgstr "Vedno &pokaži ikono v sistemski vrstici" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption msgid "Automatically &hide unmounted devices" msgstr "Samodejno &skrij odklopljene naprave" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBMINIMIZETOTRAY.CAPTION" msgid "Mo&ve icon to system tray when minimized" msgstr "Pri pomanjšanju okna programa pokaži ikono v sistemski vrstici" #: tfrmoptionsbehavior.cbonlyonce.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBONLYONCE.CAPTION" msgid "A&llow only one copy of DC at a time" msgstr "Dovoli le &en zagnan primerek programa" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "Več pogonov ali priklopnih točk je mogoča vpisati ločeno s podpičjem \";\"." #: tfrmoptionsbehavior.lbldrivesblacklist.caption msgid "Drives &blacklist" msgstr "Črni seznam &pogonov" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption msgid "Cut &text to column width" msgstr "&Okrajšaj besedilo na širino stolpca" #: tfrmoptionscolumnsview.cbgridhorzline.caption msgid "&Horizontal lines" msgstr "&Vodoravne črte" #: tfrmoptionscolumnsview.cbgridvertline.caption msgid "&Vertical lines" msgstr "&Navpične črte" #: tfrmoptionscolumnsview.chkautofillcolumns.caption msgid "A&uto fill columns" msgstr "Samodejno &zapolni stolpce" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "Izriši mrežo okna" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "Samodejno prilagodi velikost stolpcev" #: tfrmoptionscolumnsview.lblautosizecolumn.caption msgid "Auto si&ze column:" msgstr "Samodejno prilagodi &velikost:" #: tfrmoptionsconfiguration.btnconfigapply.caption msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGAPPLY.CAPTION" msgid "A&pply" msgstr "&Uveljavi" #: tfrmoptionsconfiguration.btnconfigedit.caption msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGEDIT.CAPTION" msgid "&Edit" msgstr "&Uredi" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption msgid "Co&mmand line history" msgstr "Zgodovina &ukazne vrstice" #: tfrmoptionsconfiguration.cbdirhistory.caption msgctxt "TFRMOPTIONSCONFIGURATION.CBDIRHISTORY.CAPTION" msgid "&Directory history" msgstr "Zgodovina &map" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption msgid "&File mask history" msgstr "Zgodovina mask &imen datotek" #: tfrmoptionsconfiguration.chksaveconfiguration.caption msgid "Sa&ve configuration" msgstr "Shra&ni nastavitve" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption msgid "Searc&h/Replace history" msgstr "Zgodovina iskanj in zamenjav" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgid "Location of configuration files" msgstr "Privzeto mesto nastavitvenih datotek je:" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgid "Save on exit" msgstr "Pred končanjem programa shrani:" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgid "Set on command line" msgstr "Nastavi v ukazni vrstici" #: tfrmoptionsconfiguration.rbprogramdir.caption msgid "P&rogram directory (portable version)" msgstr "Mapa &programa (prenosna različica)" #: tfrmoptionsconfiguration.rbuserhomedir.caption msgid "&User home directory" msgstr "Domača mapa &uporabnika" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNCOPYCOLUMNSSET.CAPTION" msgid "C&opy" msgstr "K&opiraj" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNDELCOLUMNSSET.CAPTION" msgid "&Delete" msgstr "&Izbriši" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNEDITCOLUMNSSET.CAPTION" msgid "&Edit" msgstr "&Uredi" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNNEWCOLUMNSSET.CAPTION" msgid "&New" msgstr "&Novo" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.CBBFILESYSTEM.TEXT" msgid "General" msgstr "Splošno" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption msgid "Con&figure columns for file system:" msgstr "Nastavi &stolpce za datotečni sistem:" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption msgid "&Show confirmation dialog after drop" msgstr "Pokaži &potrditveno okno po spuščanju datotek" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption msgid "Show &file system" msgstr "Pokaži &datotečni sistem" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption msgid "Show fr&ee space" msgstr "Pokaži &zasedenost prostora" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption msgid "Show &label" msgstr "Pokaži &oznako" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "Seznam pogonov" #: tfrmoptionseditorcolors.backgroundlabel.caption msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "O&zadje" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption msgctxt "TFRMOPTIONSEDITORCOLORS.BACKGROUNDUSEDEFAULTCHECKBOX.CAPTION" msgid "Bac&kground" msgstr "O&zadje" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "Atributi predmeta" #: tfrmoptionseditorcolors.foregroundlabel.caption msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "Pi&sava" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption msgctxt "TFRMOPTIONSEDITORCOLORS.FOREGROUNDUSEDEFAULTCHECKBOX.CAPTION" msgid "Fo®round" msgstr "Pi&sava" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption msgid "&Text-mark" msgstr "&Označba besedila" #: tfrmoptionseditorcolors.tbtnglobal.caption msgid "Use (and edit) &global scheme settings" msgstr "Uporabi (in uredi) nastavitve &splošne sheme" #: tfrmoptionseditorcolors.tbtnlocal.caption msgid "Use &local scheme settings" msgstr "Uporabi nastavitve &krajevne sheme" #: tfrmoptionseditorcolors.textboldcheckbox.caption msgid "&Bold" msgstr "&Krepko" #: tfrmoptionseditorcolors.textboldradioinvert.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTBOLDRADIOINVERT.CAPTION" msgid "In&vert" msgstr "O&brni" #: tfrmoptionseditorcolors.textboldradiooff.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTBOLDRADIOOFF.CAPTION" msgid "O&ff" msgstr "O&nemogočeno" #: tfrmoptionseditorcolors.textboldradioon.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTBOLDRADIOON.CAPTION" msgid "O&n" msgstr "&Omogočeno" #: tfrmoptionseditorcolors.textitaliccheckbox.caption msgid "&Italic" msgstr "&Ležeče" #: tfrmoptionseditorcolors.textitalicradioinvert.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTITALICRADIOINVERT.CAPTION" msgid "In&vert" msgstr "O&brni" #: tfrmoptionseditorcolors.textitalicradiooff.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTITALICRADIOOFF.CAPTION" msgid "O&ff" msgstr "O&nemogočeno" #: tfrmoptionseditorcolors.textitalicradioon.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTITALICRADIOON.CAPTION" msgid "O&n" msgstr "&Omogočeno" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption msgid "&Strike Out" msgstr "&Prečrtano" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTRADIOINVERT.CAPTION" msgid "In&vert" msgstr "O&brni" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTRADIOOFF.CAPTION" msgid "O&ff" msgstr "O&nemogočeno" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTRADIOON.CAPTION" msgid "O&n" msgstr "&Omogočeno" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption msgid "&Underline" msgstr "&Podčrtano" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "O&brni" #: tfrmoptionseditorcolors.textunderlineradiooff.caption msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "O&nemogočeno" #: tfrmoptionseditorcolors.textunderlineradioon.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "&Omogočeno" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "Opravila &kopiranja" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "Opravila &brisanja" #: tfrmoptionsfileoperations.cbdeletetotrash.caption msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "Izbriši v &smeti (S sočasnim pritiskom dvigalke, se izbriše trajno)" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "Opravila brisanja v smeti" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDROPREADONLYFLAG.CAPTION" msgid "D&rop readonly flag" msgstr "Odstrani &zastavico le za branje" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "Opravila &premikanja" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption msgid "&Search for part of file name" msgstr "&Poišči del imena datoteke" #: tfrmoptionsfileoperations.cbprocesscomments.caption msgid "&Process comments with files/folders" msgstr "&Obravnavaj opombe skupaj z datotekami in mapami" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption msgid "Select &file name without extension when renaming" msgstr "Med preimenovanjem izberi le &ime datoteke brez pripone" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption msgid "Sho&w tab select panel in copy/move dialog" msgstr "Pokaži polje izbire &zavihka v pogovornem oknu kopiranja in premikanja" #: tfrmoptionsfileoperations.cbskipfileoperror.caption msgid "S&kip file operations errors and write them to log window" msgstr "&Preskoči napake datotečnih opravil in jih zapiši v dnevnik" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "Izvajanje opravil" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "tfrmoptionsfileoperations.gbfilesearch.caption" msgid "File search" msgstr "Iskanje datotek" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "Uporabniški vmesnik" #: tfrmoptionsfileoperations.lblbuffersize.caption msgid "&Buffer size for file operations (in KB):" msgstr "Velikost &medpomnilnika opravila (v KB):" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "Zahtevaj potrdila za:" #: tfrmoptionsfileoperations.lblprogresskind.caption msgid "Show operations progress &initially in" msgstr "Pokaži splošni napredek &dejavnosti v" #: tfrmoptionsfileoperations.lblwipepassnumber.caption msgid "&Number of wipe passes:" msgstr "Število prehodov &neobnovljivega brisanja:" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption msgid "Use memory mapping for search te&xt in files" msgstr "Uporabi preslikavo pomnilnika za iskanje &besedila v datotekah" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption msgid "&Use stream for search text in files" msgstr "&Uporabi pretok za iskanje besedila v datotekah" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption msgid "Use &Frame Cursor" msgstr "Uporabi kazalko z &okvirjem" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption msgid "Use &Gradient Indicator" msgstr "Uporabi kazalnik &preliva" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption msgid "U&se Inverted Selection" msgstr "Uporabi &obrnjen izbor" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.DBFREESPACEINDICATOR.CAPTION" msgid "Drive Free Space Indicator" msgstr "Kazalnik zasedenosti prostora na pogonu" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.GBEXAMPLE.CAPTION" msgid "Example" msgstr "Primer" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption msgid "Bac&kground:" msgstr "O&zadje:" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR2.CAPTION" msgid "Backg&round 2:" msgstr "&Drugo o&zadje:" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORCOLOR.CAPTION" msgid "C&ursor Color:" msgstr "Barva &kazalke:" #: tfrmoptionsfilepanelscolors.lblcursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORTEXT.CAPTION" msgid "Cursor Te&xt:" msgstr "Besedilo ka&zalke:" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption msgid "&Brightness level of inactive panel" msgstr "Raven &svetlosti nedejavnega okna" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption msgid "In&dicator Back Color:" msgstr "Barva &ozadja v bralnem pregledovalniku" #: tfrmoptionsfilepanelscolors.lblindcolor.caption msgid "&Indicator Fore Color:" msgstr "Barva &pisave kazalnika:" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLMARKCOLOR.CAPTION" msgid "&Mark Color:" msgstr "Barva &oznake:" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLTEXTCOLOR.CAPTION" msgid "T&ext Color:" msgstr "Barva &besedila:" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption msgid "Do&n't load file list until a tab is activated" msgstr "&Ne naloži datoteke, dokler zavihek ni omogočen" #: tfrmoptionsfilesviews.cbdirbrackets.caption msgid "S&how square brackets around directories" msgstr "&Izpiši oglate oklepaje okoli imena mape v seznamu okna" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption msgid "Hi&ghlight new and updated files" msgstr "&Poudari nove in posodobljene datoteke" #: tfrmoptionsfilesviews.cblistfilesinthread.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBLISTFILESINTHREAD.CAPTION" msgid "Load &file list in separate thread" msgstr "Naloži &seznam datotek v ločeni niti" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBLOADICONSSEPARATELY.CAPTION" msgid "Load icons af&ter file list" msgstr "Naloži ikone &za seznamom datotek" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBSHOWSYSTEMFILES.CAPTION" msgid "Show s&ystem and hidden files" msgstr "Pokaže skrite in &sistemske datoteke" #: tfrmoptionsfilesviews.cbspacemovesdown.caption msgid "&When selecting files with , move down to next file (as with )" msgstr "&Med izbiranjem datotek s preslednico, se premakni na naslednjo datoteko v seznamu (kot z vstavljalko)" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "Oblikovanje" #: tfrmoptionsfilesviews.gbsorting.caption msgid "Sorting" msgstr "Razvrščanje" #: tfrmoptionsfilesviews.lblcasesensitivity.caption msgid "Case s&ensitivity:" msgstr "Razlikovanje velikosti &črk:" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "Napačen zapis" #: tfrmoptionsfilesviews.lbldatetimeformat.caption msgid "&Date and time format:" msgstr "&Zapis datuma in časa:" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "Zapis velikosti datoteke:" #: tfrmoptionsfilesviews.lblnewfilesposition.caption msgid "&Insert new files" msgstr "Vstavi &nove datoteke" #: tfrmoptionsfilesviews.lblsortfoldermode.caption msgid "So&rting directories:" msgstr "Razvrščanje map:" #: tfrmoptionsfilesviews.lblsortmethod.caption msgid "&Sort method:" msgstr "&Način razvrščanja:" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption msgid "&Move updated files" msgstr "&Premakni posodobljene datoteke" #: tfrmoptionsfiletypescolors.btnaddcategory.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNADDCATEGORY.CAPTION" msgid "A&dd" msgstr "&Dodaj" #: tfrmoptionsfiletypescolors.btnapplycategory.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNAPPLYCATEGORY.CAPTION" msgid "A&pply" msgstr "&Uveljavi" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNCATEGORYCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNDELETECATEGORY.CAPTION" msgid "D&elete" msgstr "&Izbriši" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Predloga ..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption msgid "File types colors (sort by drag&&drop)" msgstr "Barve vrst datotek (razvrščanje z vlečenjem)" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption msgid "Category a&ttributes:" msgstr "&Atributi kategorije:" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption msgid "Category co&lor:" msgstr "&Barva kategorije:" #: tfrmoptionsfiletypescolors.lblcategorymask.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYMASK.CAPTION" msgid "Category &mask:" msgstr "&Maska kategorije:" #: tfrmoptionsfiletypescolors.lblcategoryname.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYNAME.CAPTION" msgid "Category &name:" msgstr "&Ime kategorije:" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELEDITFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELLOGFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELMAINFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWERBOOKFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.lbleditorfont.caption msgctxt "TFRMOPTIONSFONTS.LBLEDITORFONT.CAPTION" msgid "&Editor font" msgstr "Pisava &urejevalnika" #: tfrmoptionsfonts.lbllogfont.caption msgctxt "TFRMOPTIONSFONTS.LBLLOGFONT.CAPTION" msgid "&Log font" msgstr "Pisava &dnevnika" #: tfrmoptionsfonts.lblmainfont.caption msgctxt "TFRMOPTIONSFONTS.LBLMAINFONT.CAPTION" msgid "Main &font" msgstr "&Glavna pisava" #: tfrmoptionsfonts.lblviewerbookfont.caption msgctxt "TFRMOPTIONSFONTS.LBLVIEWERBOOKFONT.CAPTION" msgid "Viewer&Book Font" msgstr "Pisava &bralnega pregledovalnika" #: tfrmoptionsfonts.lblviewerfont.caption msgctxt "TFRMOPTIONSFONTS.LBLVIEWERFONT.CAPTION" msgid "&Viewer font" msgstr "Pisava &pregledovalnika" #: tfrmoptionshotkeys.btnaddhotkey.caption msgid "Add &hotkey" msgstr "&Dodaj hitro tipko" #: tfrmoptionshotkeys.btndeletehotkey.caption msgid "&Delete hotkey" msgstr "&Izbriši hitro tipko" #: tfrmoptionshotkeys.btnedithotkey.caption msgctxt "TFRMOPTIONSHOTKEYS.BTNEDITHOTKEY.CAPTION" msgid "&Edit hotkey" msgstr "Uredi &hitro tipko" #: tfrmoptionshotkeys.lbfilter.caption msgctxt "TFRMOPTIONSHOTKEYS.LBFILTER.CAPTION" msgid "&Filter" msgstr "&Filter" #: tfrmoptionshotkeys.lblcategories.caption msgctxt "TFRMOPTIONSHOTKEYS.LBLCATEGORIES.CAPTION" msgid "C&ategories:" msgstr "&Kategorije:" #: tfrmoptionshotkeys.lblcommands.caption msgctxt "TFRMOPTIONSHOTKEYS.LBLCOMMANDS.CAPTION" msgid "Co&mmands:" msgstr "&Ukazi:" #: tfrmoptionshotkeys.lblscfiles.caption msgctxt "TFRMOPTIONSHOTKEYS.LBLSCFILES.CAPTION" msgid "&Shortcut files:" msgstr "Datoteke &tipkovnih bližnjic:" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[0].TITLE.CAPTION" msgid "Hotkey" msgstr "Hitra tipka" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[1].TITLE.CAPTION" msgid "Parameters" msgstr "Parametri" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[2].TITLE.CAPTION" msgid "Controls" msgstr "Tipke" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "Za navedene &poti in podrejene mape:" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "Pokaži ikone za dejanja v &meniju" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "TFRMOPTIONSICONS.CBICONSINMENUSSIZE.TEXT" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption msgctxt "TFRMOPTIONSICONS.CBICONSSHOWOVERLAY.CAPTION" msgid "Show o&verlay icons, e.g. for links" msgstr "Pokaži prekrivne i&kone za npr. povezave" #: tfrmoptionsicons.cbiconssize.text msgctxt "TFRMOPTIONSICONS.CBICONSSIZE.TEXT" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "Onemogoči posebne ikone" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "Ikone v meniju" #: tfrmoptionsicons.gbiconssize.caption msgctxt "TFRMOPTIONSICONS.GBICONSSIZE.CAPTION" msgid " Icon size " msgstr "Velikost ikon" #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "TFRMOPTIONSICONS.GBSHOWICONSMODE.CAPTION" msgid " Show icons to the left of the filename " msgstr "Pokaži ikone na levi od imena datoteke" #: tfrmoptionsicons.rbiconsshowall.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALL.CAPTION" msgid "A&ll" msgstr "&Vse" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALLANDEXE.CAPTION" msgid "All associated + &EXE/LNK (slow)" msgstr "Vse programske vezi in &EXE/LNK (počasi)" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWNONE.CAPTION" msgid "&No icons" msgstr "Brez &ikon" #: tfrmoptionsicons.rbiconsshowstandard.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWSTANDARD.CAPTION" msgid "Only &standard icons" msgstr "Le &običajne ikone" #: tfrmoptionsignorelist.btnaddsel.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSEL.CAPTION" msgid "A&dd selected names" msgstr "&Dodaj izbrana imena" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSELWITHPATH.CAPTION" msgid "Add selected names with &full path" msgstr "Dodaj izbrana imena s polno &potjo." #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "TFRMOPTIONSIGNORELIST.CHKIGNOREENABLE.CAPTION" msgid "&Ignore (don't show) the following files and folders:" msgstr "&Prezri in ne pokaži naslednjih datotek in map:" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "TFRMOPTIONSIGNORELIST.LBLSAVEIN.CAPTION" msgid "&Save in:" msgstr "&Shrani v:" #: tfrmoptionskeyboard.cblynxlike.caption msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "&Tipki levo in desno zamenjata mapo (način Lynx)" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "Dejanja pritiskov tip na tipkovnici" #: tfrmoptionskeyboard.lblalt.caption msgctxt "TFRMOPTIONSKEYBOARD.LBLALT.CAPTION" msgid "Alt+L&etters" msgstr "Alt+Č&rke" #: tfrmoptionskeyboard.lblctrlalt.caption msgctxt "TFRMOPTIONSKEYBOARD.LBLCTRLALT.CAPTION" msgid "Ctrl+Alt+Le&tters" msgstr "Ctrl+Alt+Čr&ke" #: tfrmoptionskeyboard.lblnomodifier.caption msgctxt "TFRMOPTIONSKEYBOARD.LBLNOMODIFIER.CAPTION" msgid "&Letters" msgstr "&Črke" #: tfrmoptionslayout.cbflatdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBFLATDISKPANEL.CAPTION" msgid "&Flat buttons" msgstr "&Ploski gumbi" #: tfrmoptionslayout.cbflatinterface.caption msgctxt "TFRMOPTIONSLAYOUT.CBFLATINTERFACE.CAPTION" msgid "Flat i&nterface" msgstr "&Ploski vmesnik" #: tfrmoptionslayout.cbflattoolbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBFLATTOOLBAR.CAPTION" msgid "Flat b&uttons" msgstr "Ploski &gumbi" #: tfrmoptionslayout.cbfreespaceind.caption msgctxt "TFRMOPTIONSLAYOUT.CBFREESPACEIND.CAPTION" msgid "Show fr&ee space indicator on drive label" msgstr "Pokaži vrstico &zasedenosti prostora" #: tfrmoptionslayout.cblogwindow.caption msgctxt "TFRMOPTIONSLAYOUT.CBLOGWINDOW.CAPTION" msgid "Show lo&g window" msgstr "Pokaži okno &dnevniškega izpisa" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "TFRMOPTIONSLAYOUT.CBPANELOFOPERATIONS.CAPTION" msgid "Show panel of operation in background" msgstr "Pokaži okno opravil, zagnanih v ozadju" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "TFRMOPTIONSLAYOUT.CBPROGINMENUBAR.CAPTION" msgid "Show common progress in menu bar" msgstr "Pokaži splošni napredek dejavnosti v menijski vrstici" #: tfrmoptionslayout.cbshowcmdline.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCMDLINE.CAPTION" msgid "Show command l&ine" msgstr "Pokaži &ukazno vrstico" #: tfrmoptionslayout.cbshowcurdir.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCURDIR.CAPTION" msgid "Show current director&y" msgstr "Pokaži &trenutno mapo" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDISKPANEL.CAPTION" msgid "Show &drive buttons" msgstr "Pokaže gumbe &pogonov" #: tfrmoptionslayout.cbshowdrivefreespace.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDRIVEFREESPACE.CAPTION" msgid "Show free s&pace label" msgstr "Pokaži vrednost &zasedenosti prostora" #: tfrmoptionslayout.cbshowdriveslistbutton.caption msgid "Show drives list bu&tton" msgstr "Pokaži gumb seznama &pogonov" #: tfrmoptionslayout.cbshowkeyspanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWKEYSPANEL.CAPTION" msgid "Show function &key buttons" msgstr "Pokaži &funkcijske gumbe" #: tfrmoptionslayout.cbshowmainmenu.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINMENU.CAPTION" msgid "Show &main menu" msgstr "Pokaži &glavni meni" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINTOOLBAR.CAPTION" msgid "Show &button bar" msgstr "Pokaži vrstico &gumbov" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption msgid "Show short free space &label" msgstr "Pokaži kratko oznako &zasedenosti prostora" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWSTATUSBAR.CAPTION" msgid "Show &status bar" msgstr "Pokaži vrstico &stanja" #: tfrmoptionslayout.cbshowtabheader.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABHEADER.CAPTION" msgid "S&how tabstop header" msgstr "Pokaži glave &stolpcev" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABS.CAPTION" msgid "Sho&w folder tabs" msgstr "Pokaži z&avihke map" #: tfrmoptionslayout.cbtermwindow.caption msgctxt "TFRMOPTIONSLAYOUT.CBTERMWINDOW.CAPTION" msgid "Show te&rminal window" msgstr "Pokaži okno &terminala" #: tfrmoptionslayout.cbtwodiskpanels.caption msgctxt "TFRMOPTIONSLAYOUT.CBTWODISKPANELS.CAPTION" msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "Pokaži dve orodni vrstici gumbov pogonov (&določene širine nad okni)" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "TFRMOPTIONSLAYOUT.GBSCREENLAYOUT.CAPTION" msgid " Screen layout " msgstr "Zaslonska razporeditev" #: tfrmoptionslog.cblogarcop.caption msgctxt "TFRMOPTIONSLOG.CBLOGARCOP.CAPTION" msgid "&Pack/Unpack" msgstr "&Zapakiraj/Odpakiraj" #: tfrmoptionslog.cblogcpmvln.caption msgctxt "TFRMOPTIONSLOG.CBLOGCPMVLN.CAPTION" msgid "Cop&y/Move/Create link/symlink" msgstr "Ko&piraj/Premakni/Ustvari povezavo/Ustvari simbolno povezavo" #: tfrmoptionslog.cblogdelete.caption msgctxt "TFRMOPTIONSLOG.CBLOGDELETE.CAPTION" msgid "&Delete" msgstr "&Izbriši" #: tfrmoptionslog.cblogdirop.caption msgctxt "TFRMOPTIONSLOG.CBLOGDIROP.CAPTION" msgid "Crea&te/Delete directories" msgstr "Us&tvari/Izbriši mape" #: tfrmoptionslog.cblogerrors.caption msgctxt "TFRMOPTIONSLOG.CBLOGERRORS.CAPTION" msgid "Log &errors" msgstr "Beleži &napake opravil" #: tfrmoptionslog.cblogfile.caption msgctxt "TFRMOPTIONSLOG.CBLOGFILE.CAPTION" msgid "C&reate a log file:" msgstr "Ustvari &dnevniško datoteko:" #: tfrmoptionslog.cbloginfo.caption msgctxt "TFRMOPTIONSLOG.CBLOGINFO.CAPTION" msgid "Log &information messages" msgstr "&Beleži sporočila podrobnosti" #: tfrmoptionslog.cblogsuccess.caption msgctxt "TFRMOPTIONSLOG.CBLOGSUCCESS.CAPTION" msgid "Log &successful operations" msgstr "Beleži &uspešno končana opravila" #: tfrmoptionslog.cblogvfs.caption msgctxt "TFRMOPTIONSLOG.CBLOGVFS.CAPTION" msgid "&File system plugins" msgstr "&Sistemsko-datotečni vstavki" #: tfrmoptionslog.gblogfile.caption msgctxt "TFRMOPTIONSLOG.GBLOGFILE.CAPTION" msgid "File operation log file" msgstr "Dnevniška datoteka datotečnih opravil" #: tfrmoptionslog.gblogfileop.caption msgid "Log operations" msgstr "Beleži opravila" #: tfrmoptionslog.gblogfilestatus.caption msgid "Operation status" msgstr "Stanje opravila" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "&Odstrani sličice neobstoječih datotek" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "Med menjanjem pogonov vedno začni na &korenski mapi" #: tfrmoptionsmisc.chkshowwarningmessages.caption msgctxt "TFRMOPTIONSMISC.CHKSHOWWARNINGMESSAGES.CAPTION" msgid "Show &warning messages (\"OK\" button only)" msgstr "Pokaži &opozorila (Okna le z gumbom \"V redu\")" #: tfrmoptionsmisc.chkthumbsave.caption msgctxt "TFRMOPTIONSMISC.CHKTHUMBSAVE.CAPTION" msgid "&Save thumbnails in cache" msgstr "&Shrani sličice v predpomnilnik" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "TFRMOPTIONSMISC.DBLTHUMBNAILS.CAPTION" msgid "Thumbnails" msgstr "Sličice" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "točke" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "TFRMOPTIONSMISC.LBLTHUMBSEPARATOR.CAPTION" msgid "X" msgstr "X" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "&Velikost sličic:" #: tfrmoptionsmouse.cbselectionbymouse.caption msgid "&Selection by mouse" msgstr "&Izbiranje datotek z miško" #: tfrmoptionsmouse.gbscrolling.caption msgid "Scrolling" msgstr "Drsenje" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "Izbor" #: tfrmoptionsmouse.lblmousemode.caption msgid "&Mode:" msgstr "&Način:" #: tfrmoptionsmouse.rbscrolllinebyline.caption msgid "&Line by line" msgstr "&Vrstica po vrstico" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption msgid "Line by line &with cursor movement" msgstr "Premik kazalke &vrstico po vrstico" #: tfrmoptionsmouse.rbscrollpagebypage.caption msgid "&Page by page" msgstr "&Stran po stran" #: tfrmoptionsplugins.btnaddplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "&Dodaj" #: tfrmoptionsplugins.btnconfigplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "&Nastavitve" #: tfrmoptionsplugins.btnenableplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "&Omogoči" #: tfrmoptionsplugins.btnremoveplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "&Odstrani" #: tfrmoptionsplugins.btntweakplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "&Prilagodi" #: tfrmoptionsplugins.lbldsxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "Vstavki &iskalnikov omogočajo uporabo dodatnih načinov iskanja oziroma uporabo zunanjih orodij (ukaz \"locate\" in podobno)" #: tfrmoptionsplugins.lblwcxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "Vstavki &pakirnikov so uporabljeni za delo z arhivi." #: tfrmoptionsplugins.lblwdxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "Vsebinski vsta&vki omogočajo prikaz razširjenih podrobnosti datotek, kot so podatkovne oznake datotek mp3 ali pa podatki slik in jih je mogoče uporabiti pri iskanju in pri uporabi na primer naprednega preimenovanja." #: tfrmoptionsplugins.lblwfxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "Sistemsko-datotečni vstavki omogočajo dostop do naprav, kot so dlančniki in PocketPC." #: tfrmoptionsplugins.lblwlxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "Vstavki &pregledovalnikov omogočajo prikaz različnih datotek dokumentov, kot so slike, preglednice, podatkovne zbirke in podobno (F3, Ctrl+Q)." #: tfrmoptionsplugins.stgplugins.columns[0].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[0].TITLE.CAPTION" msgid "Active" msgstr "Dejavno" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[1].TITLE.CAPTION" msgid "Plugin" msgstr "Vstavek" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[2].TITLE.CAPTION" msgid "Registered for" msgstr "Vpisano za" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[3].TITLE.CAPTION" msgid "File name" msgstr "Ime datoteke" #: tfrmoptionsplugins.tsdsx.caption msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "Vstavki &iskanja (.dsx)" #: tfrmoptionsplugins.tswcx.caption msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "Vstavki &pakiranja (.wcx)" #: tfrmoptionsplugins.tswdx.caption msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "&Vsebinski vstavki (.wdx)" #: tfrmoptionsplugins.tswfx.caption msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "Sistemsko-&datotečni vstavki (.wfx)" #: tfrmoptionsplugins.tswlx.caption msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "Vstavki &pregledovanja (.wlx)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTBEGINNING.CAPTION" msgid "&Beginning (name must start with first typed character)" msgstr "na &začetku (ime se mora začeti s prvim vpisanim znakom)." #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTENDING.CAPTION" msgid "En&ding (last character before a typed dot . must match)" msgstr "na &koncu (ime se mora končati s prvim vpisanim znakom pred piko (.) in pripono)." #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CGPOPTIONS.CAPTION" msgid "Options" msgstr "Možnosti" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption msgid "Exact name match" msgstr "Natančno ujemanje imena datoteke:" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "Upoštevanje velikosti črk med iskanjem je:" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "Iskanje predmetov" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "TFRMOPTIONSTABS.CBTABSACTIVATEONCLICK.CAPTION" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "Postavi okno v &žarišče s klikom na izbran zavihek" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "TFRMOPTIONSTABS.CBTABSALWAYSVISIBLE.CAPTION" msgid "&Show tab header also when there is only one tab" msgstr "Pokaži &glavo zavihka tudi, ko je odprt le en zavihek" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption msgctxt "TFRMOPTIONSTABS.CBTABSCONFIRMCLOSEALL.CAPTION" msgid "Con&firm close all tabs" msgstr "&Potrdi zapiranje vseh zavihkov" #: tfrmoptionstabs.cbtabslimitoption.caption msgctxt "TFRMOPTIONSTABS.CBTABSLIMITOPTION.CAPTION" msgid "&Limit tab title length to" msgstr "Omeji dolžino naslova zavihka na" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "TFRMOPTIONSTABS.CBTABSLOCKEDASTERISK.CAPTION" msgid "Show locked tabs &with an asterisk *" msgstr "Zaklenjene zavihke označi z zvezdico *" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "TFRMOPTIONSTABS.CBTABSMULTILINES.CAPTION" msgid "&Tabs on multiple lines" msgstr "&Zavihki so lahko v več vrsticah" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENFOREGROUND.CAPTION" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Tipki CTRL+navzgor odpreta nov zavihek v ospredju" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENNEARCURRENT.CAPTION" msgid "Open &new tabs near current tab" msgstr "Odpri &nov zavihek ob trenutnem" #: tfrmoptionstabs.cbtabsshowclosebutton.caption msgctxt "TFRMOPTIONSTABS.CBTABSSHOWCLOSEBUTTON.CAPTION" msgid "Show ta&b close button" msgstr "Pokaži gumb za &zapiranje zavihka" #: tfrmoptionstabs.gbtabs.caption msgctxt "TFRMOPTIONSTABS.GBTABS.CAPTION" msgid "Folder tabs headers" msgstr "Glave zavihkov map" #: tfrmoptionstabs.lblchar.caption msgctxt "TFRMOPTIONSTABS.LBLCHAR.CAPTION" msgid "characters" msgstr "znakov." #: tfrmoptionstabs.lbltabsposition.caption msgctxt "TFRMOPTIONSTABS.LBLTABSPOSITION.CAPTION" msgid "Ta&bs position" msgstr "Položaj &zavihkov" #: tfrmoptionsterminal.lblruninterm.caption msgid "Run in &terminal:" msgstr "Zaženi v &terminalu:" #: tfrmoptionsterminal.lblrunterm.caption msgid "Run t&erminal:" msgstr "Odpri &terminal:" #: tfrmoptionstoolbar.btnclonebutton.caption msgid "C&lone button" msgstr "Gumb za &kloniranje" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNDELETEBUTTON.CAPTION" msgid "&Delete" msgstr "&Izbriši" #: tfrmoptionstoolbar.btnedithotkey.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNEDITHOTKEY.CAPTION" msgid "Edit hot&key" msgstr "Uredi hitro &tipko" #: tfrmoptionstoolbar.btninsertbutton.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNINSERTBUTTON.CAPTION" msgid "&Insert new button" msgstr "&Vstavi nov gumb" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNOPENFILE.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNOPENICON.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnremovehotkey.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNREMOVEHOTKEY.CAPTION" msgid "Remove hotke&y" msgstr "Odstrani &hitre tipke" #: tfrmoptionstoolbar.cbflatbuttons.caption msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "&Ploski gumbi" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "Vnos parametrov ukaza, ki so podani vsak v svoji vrstici. Pritisnite tipko F1 za več pomoči o parametrih." #: tfrmoptionstoolbar.gbgroupbox.caption msgid "Appearance" msgstr "Videz" #: tfrmoptionstoolbar.lblbarsize.caption msgid "&Bar size:" msgstr "Velikost orodne &vrstice:" #: tfrmoptionstoolbar.lblexternalcommand.caption msgctxt "TFRMOPTIONSTOOLBAR.LBLEXTERNALCOMMAND.CAPTION" msgid "Comman&d:" msgstr "&Ukaz:" #: tfrmoptionstoolbar.lblexternalparameters.caption msgctxt "TFRMOPTIONSTOOLBAR.LBLEXTERNALPARAMETERS.CAPTION" msgid "Parameter&s:" msgstr "Parametr&i:" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "Hitra tipka:" #: tfrmoptionstoolbar.lbliconfile.caption msgid "Ico&n:" msgstr "Iko&na:" #: tfrmoptionstoolbar.lbliconsize.caption msgid "Icon si&ze:" msgstr "Veli&kost ikone:" #: tfrmoptionstoolbar.lblinternalcommand.caption msgctxt "tfrmoptionstoolbar.lblinternalcommand.caption" msgid "Co&mmand:" msgstr "&Ukaz:" #: tfrmoptionstoolbar.lblinternalparameters.caption msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "&Parametri:" #: tfrmoptionstoolbar.lblstartpath.caption msgid "Start pat&h:" msgstr "Začetna &pot:" #: tfrmoptionstoolbar.lbltooltip.caption msgid "&Tooltip:" msgstr "&Orodni namig:" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "Vrsta gumba" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption msgid "&Keep terminal window open after executing program" msgstr "Ohrani okno terminala &odprto po končani izvedbi programa" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption msgid "&Execute in terminal" msgstr "Izvedi v &terminalu" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption msgid "&Use external program" msgstr "Uporabi &zunanji program" #: tfrmoptionstoolbase.lbltoolsparameters.caption msgid "A&dditional parameters" msgstr "&Dodatni parametri" #: tfrmoptionstoolbase.lbltoolspath.caption msgid "&Path to program to execute" msgstr "&Pot do programa za izvedbo" #: tfrmoptionstooltips.btnaddfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "&Dodaj" #: tfrmoptionstooltips.btnapplyfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "&Uveljavi" #: tfrmoptionstooltips.btndeletefields.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "&Izbriši" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Predloga ..." #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "Polja po meri glede na vrsto datoteke" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "Prikaz orodnih namigov" #: tfrmoptionstooltips.lblfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "&Namig kategorije:" #: tfrmoptionstooltips.lblfieldsmask.caption msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "&Maska kategorije:" #: tfrmoptionstooltips.lblfieldsname.caption msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "Ime &kategorije:" #: tfrmoptionstooltips.rbtooltipallfiles.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "Pokaži &orodne namige za vse datoteke v oknu" #: tfrmoptionstooltips.rbtooltipnone.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "&Ne pokaži" #: tfrmoptionstooltips.rbtooltiponlylarge.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "Pokaži orodne &namige za datoteke v oknu, če je vrednost prirezana" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNBACKVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNFONTVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.gbviewerbookmode.caption msgid "Viewer Book Mode" msgstr "Način bralnega pregledovalnika" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWEREXAMPLE.CAPTION" msgid "Example" msgstr "Primer" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption msgid "&Background color in book viewer" msgstr "Barva &ozadja v bralnem pregledovalniku" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption msgid "&Font color in book viewer" msgstr "&Barva pisave v bralnem pregledovalniku" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption msgid "&Number of columns in book viewer" msgstr "&Število stolpcev v bralnem pregledovalniku" #: tfrmpackdlg.btncancel.caption msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmpackdlg.btnconfig.caption msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "&Nastavitve" #: tfrmpackdlg.btnhelp.caption msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Pomo&č" #: tfrmpackdlg.btnok.caption msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "V &redu" #: tfrmpackdlg.caption msgctxt "TFRMPACKDLG.CAPTION" msgid "Pack files" msgstr "Zapakiraj datoteke" #: tfrmpackdlg.cbcreateseparatearchives.caption msgid "C&reate separate archives, one per selected file/dir" msgstr "&Ustvari ločen arhiv za vsako izbrano datoteko oziroma mapo" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "Ustvari arhiv za samodejno odpakiranje" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "&Šifriraj arhiv z geslom" #: tfrmpackdlg.cbmovetoarchive.caption msgid "Mo&ve to archive" msgstr "Pre&makni v arhiv" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "Ustvari arhiv v več &delih" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "=>" #: tfrmpackdlg.cbputintarfirst.caption msgid "P&ut in the TAR archive first" msgstr "Najprej &vstavi v arhiv TAR" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "Zapakiraj tudi imena &poti (le pri več ravneh map)" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "Zapakiraj datoteke v arhiv:" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "Pakirnik" #: tfrmpackinfodlg.btnclose.caption msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zapri" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "Odpakiraj &vse in izvedi" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "Odpakiraj &in izvedi" #: tfrmpackinfodlg.caption msgctxt "TFRMPACKINFODLG.CAPTION" msgid "Properties of packed file" msgstr "Lastnosti arhiva" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "Atributi:" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "Raven stiskanja:" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "Datum:" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "Način:" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "Izvorna velikost:" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "Datoteka:" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "Arhivirana velikost:" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "Pakirnik:" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "Čas:" #: tfrmquicksearch.btncancel.caption msgctxt "TFRMQUICKSEARCH.BTNCANCEL.CAPTION" msgid "X" msgstr "X" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "Zapri okno filtra" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "Vnos besedila za iskanje ali filtriranje" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "Aa" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "Razlikuj velikosti črk" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "M" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "Mape" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "D" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "Datoteke" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "{" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "Poišči na začetku imena" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "}" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "Poišči na koncu imena" #: tfrmquicksearch.tglfilter.caption msgctxt "TFRMQUICKSEARCH.TGLFILTER.CAPTION" msgid "Filter" msgstr "Filter" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "Preklop med iskalnim in filtrirnim načinom" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CANCELBUTTON.CAPTION" msgid "Cancel" msgstr "Prekliči" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CLOSEBUTTON.CAPTION" msgid "&Close" msgstr "&Zapri" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.HELPBUTTON.CAPTION" msgid "&Help" msgstr "Pomo&č" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.OKBUTTON.CAPTION" msgid "&OK" msgstr "V &redu" #: tfrmselecttextrange.lblselecttext.caption msgid "&Select the characters to insert:" msgstr "Izbor znakov za &vstavljanje:" #: tfrmsetfileproperties.btncancel.caption msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "&V redu" #: tfrmsetfileproperties.caption msgctxt "TFRMSETFILEPROPERTIES.CAPTION" msgid "Change attributes" msgstr "Spremeni atribute" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Lepljivo" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "Arhiv" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "Ustvarjeno:" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "Skrita datoteka" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "Zadnji dostop:" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "Spremenjeno:" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "Le za branje" #: tfrmsetfileproperties.chkrecursive.caption msgid "Including subfolders" msgstr "Vključi podrejene mape" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "Sistemska datoteka" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "Časovni podatki datotek in map" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atributi" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atributi" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Biti:" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Skupina" #: tfrmsetfileproperties.lblattrinfo.caption msgid "(gray field means unchanged value)" msgstr "(sivo polje pomeni nespremenjeno vrednost)" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Drugo" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Lastnik" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Besedilo:" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Izvedi" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Osmiško:" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Preberi" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Zapiši" #: tfrmsplitter.btncancel.caption msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "V &redu" #: tfrmsplitter.caption msgctxt "TFRMSPLITTER.CAPTION" msgid "Splitter" msgstr "Razdelilnik" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664B - 3.5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "Ime datoteke" #: tfrmsplitter.grbxsize.caption msgid "Size and number of parts" msgstr "Velikost in število delov" #: tfrmsplitter.lbdirtarget.caption msgid "Directory &target" msgstr "&Ciljna mapa" #: tfrmsplitter.lbfilesource.caption msgid "File &source" msgstr "&Vir datoteke" #: tfrmsplitter.lblnumberparts.caption msgid "&Number of parts" msgstr "&Število delov" #: tfrmsplitter.rbtngigab.caption msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "&Gigabajti" #: tfrmsplitter.rbtnkilob.caption msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "&Kilobajti" #: tfrmsplitter.rbtnmegab.caption msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "&Megabajti" #: tfrmsymlink.btncancel.caption msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&V redu" #: tfrmsymlink.caption msgid "Create symbolic link" msgstr "Ustvarjanje simbolne povezave" #: tfrmsymlink.lblexistingfile.caption msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Pot do &ciljnega mesta za povezavo" #: tfrmsymlink.lbllinktocreate.caption msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Ime &povezave" #: tfrmtweakplugin.btnadd.caption msgid "A&dd new" msgstr "Dodaj n&ovo" #: tfrmtweakplugin.btncancel.caption msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Prekliči" #: tfrmtweakplugin.btnchange.caption msgid "C&hange" msgstr "S&premeni" #: tfrmtweakplugin.btndefault.caption msgid "De&fault" msgstr "Pri&vzeto" #: tfrmtweakplugin.btnok.caption msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "V &redu" #: tfrmtweakplugin.btnremove.caption msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "&Odstrani" #: tfrmtweakplugin.caption msgctxt "TFRMTWEAKPLUGIN.CAPTION" msgid "Tweak plugin" msgstr "Prilagodi vstavek" #: tfrmtweakplugin.cbpk_caps_by_content.caption msgid "De&tect archive type by content" msgstr "Določi vrsto arhiva po &vsebini" #: tfrmtweakplugin.cbpk_caps_delete.caption msgid "Can de&lete files" msgstr "Dovoljeno je &izbrisati datoteke" #: tfrmtweakplugin.cbpk_caps_encrypt.caption msgid "Supports e&ncryption" msgstr "Podpira &šifriranje" #: tfrmtweakplugin.cbpk_caps_hide.caption msgid "Sho&w as normal files (hide packer icon)" msgstr "Pokaži kot &običajne datoteke (skrij ikono arhiva)" #: tfrmtweakplugin.cbpk_caps_mempack.caption msgid "Supports pac&king in memory" msgstr "Podpira pakiranje datotek v &pomnilniku" #: tfrmtweakplugin.cbpk_caps_modify.caption msgid "Can &modify exisiting archives" msgstr "Dovoljeno je spreminjati &obstoječe arhive" #: tfrmtweakplugin.cbpk_caps_multiple.caption msgid "&Archive can contain multiple files" msgstr "Arhiv lahko vsebuje &več datotek" #: tfrmtweakplugin.cbpk_caps_new.caption msgid "Can create new archi&ves" msgstr "Dovoljeno je ustvariti nove ar&hive" #: tfrmtweakplugin.cbpk_caps_options.caption msgid "S&upports the options dialogbox" msgstr "Podpira &pogovorno okno možnosti" #: tfrmtweakplugin.cbpk_caps_searchtext.caption msgid "Allow searchin&g for text in archives" msgstr "Dovoli iskanje &besedila v arhivih" #: tfrmtweakplugin.lbldescription.caption msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "&Opis:" #: tfrmtweakplugin.lbldetectstr.caption msgid "D&etect string:" msgstr "Zaznava &nizov:" #: tfrmtweakplugin.lblextension.caption msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "Ra&zširitev:" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "Zastavice:" #: tfrmtweakplugin.lblname.caption msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "&Ime:" #: tfrmtweakplugin.lblplugin.caption msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "&Vstavek:" #: tfrmtweakplugin.lblplugin1.caption msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "&Vstavek:" #: tfrmviewer.actabout.caption msgctxt "TFRMVIEWER.ACTABOUT.CAPTION" msgid "About Viewer..." msgstr "O pregledovalniku ..." #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "Prikaže pogovorno okno podrobnosti" #: tfrmviewer.actcopyfile.caption msgctxt "TFRMVIEWER.ACTCOPYFILE.CAPTION" msgid "Copy File" msgstr "Kopiraj datoteko" #: tfrmviewer.actcopyfile.hint msgctxt "TFRMVIEWER.ACTCOPYFILE.HINT" msgid "Copy File" msgstr "Kopiranje datoteke" #: tfrmviewer.actdeletefile.caption msgctxt "TFRMVIEWER.ACTDELETEFILE.CAPTION" msgid "Delete File" msgstr "Izbriši datoteko" #: tfrmviewer.actdeletefile.hint msgctxt "TFRMVIEWER.ACTDELETEFILE.HINT" msgid "Delete File" msgstr "Brisanje datoteke" #: tfrmviewer.actloadnextfile.caption msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.CAPTION" msgid "&Next" msgstr "&Naslednja" #: tfrmviewer.actloadnextfile.hint msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.HINT" msgid "Load Next File" msgstr "Naloži naslednjo datoteko" #: tfrmviewer.actloadprevfile.caption msgctxt "TFRMVIEWER.ACTLOADPREVFILE.CAPTION" msgid "&Previous" msgstr "&Predhodna" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "Naloži predhodno datoteko" #: tfrmviewer.actmirror.caption msgctxt "TFRMVIEWER.ACTMIRROR.CAPTION" msgid "Mirror" msgstr "Zrcaljenje" #: tfrmviewer.actmirror.hint msgctxt "TFRMVIEWER.ACTMIRROR.HINT" msgid "Mirror" msgstr "Zrcaljenje" #: tfrmviewer.actmovefile.caption msgctxt "TFRMVIEWER.ACTMOVEFILE.CAPTION" msgid "Move File" msgstr "Premakni datoteko" #: tfrmviewer.actmovefile.hint msgctxt "TFRMVIEWER.ACTMOVEFILE.HINT" msgid "Move File" msgstr "Premakni datoteko" #: tfrmviewer.actreload.caption msgctxt "TFRMVIEWER.ACTRELOAD.CAPTION" msgid "Reload" msgstr "Ponovno naloži" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "Ponovno naloži trenutno datoteko" #: tfrmviewer.actrotate180.caption msgctxt "TFRMVIEWER.ACTROTATE180.CAPTION" msgid "Rotate 180" msgstr "Zavrti 180" #: tfrmviewer.actrotate180.hint msgctxt "TFRMVIEWER.ACTROTATE180.HINT" msgid "Rotate 180" msgstr "Zavrti za 180" #: tfrmviewer.actrotate270.caption msgctxt "TFRMVIEWER.ACTROTATE270.CAPTION" msgid "Rotate 270" msgstr "Zavrti 270" #: tfrmviewer.actrotate270.hint msgctxt "TFRMVIEWER.ACTROTATE270.HINT" msgid "Rotate 270" msgstr "Zavrti za 270" #: tfrmviewer.actrotate90.caption msgctxt "TFRMVIEWER.ACTROTATE90.CAPTION" msgid "Rotate 90" msgstr "Zavrti 90" #: tfrmviewer.actrotate90.hint msgctxt "TFRMVIEWER.ACTROTATE90.HINT" msgid "Rotate 90" msgstr "Zavrti za 90" #: tfrmviewer.actsaveas.caption msgctxt "TFRMVIEWER.ACTSAVEAS.CAPTION" msgid "Save As..." msgstr "Shrani kot ..." #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "Shrani datoteko kot ..." #: tfrmviewer.actstretchimage.caption msgctxt "TFRMVIEWER.ACTSTRETCHIMAGE.CAPTION" msgid "Stretch" msgstr "Raztegni" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "Raztegni sliko" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "- 90" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "Kopiraj" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "Kopiraj" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "Obreži" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "Izbriši" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "Izbriši" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "Celozaslonski način" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "||" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "S" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "Poudari" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "Zrcaljenje" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "Premakni" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "Premakni" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "||>" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "Risanje" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "<||" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "Rdeče oči" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "Spremeni velikost" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "Razveljavi" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "Približaj" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "Oddalji" #: tfrmviewer.caption msgctxt "TFRMVIEWER.CAPTION" msgid "Viewer" msgstr "Pregledovalnik" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Predstavitev" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "Pisalo" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "Poudari" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "Risanje" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Predstavitev" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "Pogled" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "0x0" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "+ 180" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "- 90" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "O programu" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "Pokaži &dvojiško" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "Kopiraj v odložišče" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Uredi" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "Nabor &znakov" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "&Končaj" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "&Datoteka" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "Celozaslonski način" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "Grafika" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "Pokaži &šestnajstiško" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "&Slika" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "Pokaži v &bralnem pogledu" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "Zrcaljenje" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "Vstavki" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "Predogled" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "Natisni ..." #: tfrmviewer.mirotate.caption msgctxt "TFRMVIEWER.MIROTATE.CAPTION" msgid "Rotate" msgstr "Zavrti" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "Shrani" #: tfrmviewer.misaveas.caption msgctxt "TFRMVIEWER.MISAVEAS.CAPTION" msgid "Save As..." msgstr "Shrani kot ..." #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "Zaslonski posnetek" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "Iskanje" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "Poišči naslednje" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "Poišči predhodno" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "Izberi vse" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.mistretch.caption msgctxt "TFRMVIEWER.MISTRETCH.CAPTION" msgid "Stretch" msgstr "Raztegni" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "Pokaži kot &besedilo" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "&Pogled" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "Pokaži kot besedilo v &prelomu" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "Približaj" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "Oddalji" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "Kopira v odložišče" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "Izberi vse" #: tfrmviewoperations.btnstartpause.caption msgctxt "TFRMVIEWOPERATIONS.BTNSTARTPAUSE.CAPTION" msgid "&Start" msgstr "&Začni" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "Za&ustavi" #: tfrmviewoperations.caption msgctxt "TFRMVIEWOPERATIONS.CAPTION" msgid "File operations" msgstr "Opravila datotek" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "Vedno na vrhu" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "Uporabi način \"potegni in spusti\" za premikanje med opravili v vrsti" #: tfrmviewoperations.mnucanceloperation.caption msgctxt "TFRMVIEWOPERATIONS.MNUCANCELOPERATION.CAPTION" msgid "Cancel" msgstr "Prekliči" #: tfrmviewoperations.mnucancelqueue.caption msgctxt "TFRMVIEWOPERATIONS.MNUCANCELQUEUE.CAPTION" msgid "Cancel" msgstr "Prekliči" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "Nova čakalna vrsta" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "TFRMVIEWOPERATIONS.MNUOPERATIONSHOWDETACHED.CAPTION" msgid "Show in detached window" msgstr "Pokaži v odklopljenem oknu" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "Postavi na začetek vrste" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "Postavi na konec vrste" #: tfrmviewoperations.mnuqueue.caption msgctxt "TFRMVIEWOPERATIONS.MNUQUEUE.CAPTION" msgid "Queue" msgstr "V vrsto" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "Izven vrste" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "Vrsta 1" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "Vrsta 2" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "Vrsta 3" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "Vrsta 4" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "Vrsta 5" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "TFRMVIEWOPERATIONS.MNUQUEUESHOWDETACHED.CAPTION" msgid "Show in detached window" msgstr "Pokaži v odklopljenem oknu" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "Premor &vsega" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "TMULTIARCHIVECOPYOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Če datoteka obstaja" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "TWCXARCHIVECOPYOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Če datoteka obstaja" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "Pošlji v ozadje (ločena povezava)" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Če datoteka že obstaja," #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "Prekliči hitri filter" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "Prekliči trenutno opravilo" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "V odložišču ni veljavnih podatkov orodne vrstice." #: ulng.rscolattr msgid "Attr" msgstr "Atrib" #: ulng.rscoldate msgid "Date" msgstr "Datum" #: ulng.rscolext msgid "Ext" msgstr "Pri" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "Ime" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "Velikost" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "Število sprememb:" #: ulng.rsconfcolalign msgid "Align" msgstr "Poravnava" #: ulng.rsconfcolcaption msgid "Caption" msgstr "Naslov" #: ulng.rsconfcolconfig msgid "Config" msgstr "Nastavitev" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "Izbriši" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "Vsebina stolpca" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "Premakni" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "Širina" #: ulng.rsconfcustheader msgid "Customize column" msgstr "Prilagodi stolpec" #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "Kopiraj (%d) %s" #: ulng.rsdlgallopcomplete msgid "All operations completed" msgstr "Vsa opravila so končana." #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "Napredek vseh opravil %d %%" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "&Prekini" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "&Vse" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "&Pripni" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "&Prekliči" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "&Nadaljuj" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "Kopiraj &v" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "Kopiraj v &vse" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "&končaj program" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "Izberi &vse" #: ulng.rsdlgbuttonno msgid "&No" msgstr "&Ne" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "&Brez" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "&V redu" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "&Prepiši" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "Prepiši &vse" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "Prepiši vse &starejše" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "&Nadaljuj" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "Poskusi &znova" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "&Preskoči" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "Pres&koči vse" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "&Da" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "Preračunaj velikost datotek in map" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "Izračunavanje nadzorne vsote ..." #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "Preveri nadzorno vsoto ..." #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "Kopiraj datoteke" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "Izbriši datoteke" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "Premakni datoteke" #: ulng.rsdlgoppause msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "Pre&mor" #: ulng.rsdlgopstart msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "&Začni" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "V vrsto" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "Hitrost %s/s" #: ulng.rsdlgspeedtime msgid "Speed %s/s, time remaining %s" msgstr "Pri hitrosti %s/s bo opravilo trajalo še %s" #: ulng.rsdlgsplit msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "Razdeli" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "Neobnovljivo izbriši datoteke" #: ulng.rsdrivenolabel msgid "" msgstr "" #: ulng.rsdrivenomedia msgid "" msgstr "" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Notranji urejevalnik programa Double Commander" #: ulng.rseditnewfile msgid "new.txt" msgstr "nova_datoteka.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "Ime datoteke:" #: ulng.rseditnewopen msgid "Open file" msgstr "Odpri datoteko" #: ulng.rseditsearchback msgid "&Backward" msgstr "&Nazaj" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "Poišči" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "&Naprej" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "Zamenjaj" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "Vprašaj;Prepiši;Kopiraj v;Preskoči" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "Vprašaj;Prepiši;Prepiši starejše;Preskoči" #: ulng.rsfileopsetpropertyerroroptions msgctxt "ulng.rsfileopsetpropertyerroroptions" msgid "Ask;Don't set anymore;Ignore errors" msgstr "Vprašaj;Ne nastavljaj več;Prezri napake" #: ulng.rsfilterstatus msgid "FILTER" msgstr "Filter" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "Določitev predloge" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "do %s. ravni map" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "vse ravni (neomejena globina)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "le trenutno raven" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "Mapa %s ne obstaja!" #: ulng.rsfindfound msgctxt "ulng.rsfindfound" msgid "Found: %d" msgstr "Najdeno: %d" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "Shrani predlogo iskanja" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "Ime predloge:" #: ulng.rsfindscanned msgctxt "ulng.rsfindscanned" msgid "Scanned: %d" msgstr "Preiskano: %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "Preiskovanje" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "Najdi datoteke" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "Začni pri" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr "Sprosti %s od %s bajtov" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "%sB prostora" #: ulng.rsfuncatime msgid "Access date/time" msgstr "Datum in čas zadnjega dostopa" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "Atributi" #: ulng.rsfunccomment msgctxt "ulng.rsfunccomment" msgid "Comment" msgstr "Opomba" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "Stisnjena velikost" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "Datum in čas ustvarjanja" #: ulng.rsfuncext msgid "Extension" msgstr "Pripona" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "Skupina" #: ulng.rsfunclinkto msgid "Link to" msgstr "Povezava do" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "Datum in čas spremembe" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "Ime" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "Ime brez pripone" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "Lastnik" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "Pot" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "Velikost" #: ulng.rsfunctype msgid "Type" msgstr "Vrsta" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "Napaka med ustvarjanjem trde povezave." #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "Pogovorno okno kopiranja in premikanja" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "Primerjalnik" #: ulng.rshotkeycategorymain msgid "Main" msgstr "Glavno" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "Pregledovalnik" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "Povezovalnik je končan" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "Maska odstranitve izbire" #: ulng.rsmarkplus msgid "Select mask" msgstr "Maska izbire" #: ulng.rsmaskinput msgid "Input mask:" msgstr "Maska izbire:" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "Nastavitev stolpcev po meri" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "Prilagodi pogled stolpcev po meri" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "Dejanja" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "Uredi" #: ulng.rsmnueject msgid "Eject" msgstr "Izvrzi" #: ulng.rsmnumount msgid "Mount" msgstr "Priklopi" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "Novo" #: ulng.rsmnunomedia msgid "No media available" msgstr "Nosilec ni na voljo" #: ulng.rsmnuopenwith msgid "Open with" msgstr "Odpri s programom" #: ulng.rsmnuopenwithother msgid "Other..." msgstr "Drugo ..." #: ulng.rsmnusortby msgid "Sort by" msgstr "Razvrsti po" #: ulng.rsmnuumount msgid "Unmount" msgstr "Odklopi" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "Poglej" #: ulng.rsmsgaccount msgid "Account:" msgstr "Račun:" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "Dodatni parametri arhiva v ukazni vrstici:" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "Datoteke \"%s\" ni mogoče kopirati oziroma premakniti samo vase!" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "Ni mogoče izbrisati mape %s" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "Ukaz chdir v [%s] je spodletel!" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "Ali naj se odstranijo vsi nedejavni zavihke?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "Zavihek (%s) je zaklenjen! Ali naj se vseeno zapre?" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "Ali ste prepričani, da želite končati?" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "Ali naj se kopira %d izbranih datotek ali map?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "Ali naj se \"%s\" kopira v:" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "Ali naj se delno kopirana datoteka izbriše?" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "Ali naj se izbrani predmeti izbrišejo (%d predmetov)?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "Ali naj se izbrani predmeti premaknejo v smeti (%d predmetov)?" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "Ali naj se \"%s\" izbriše?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "Ali naj se \"%s\" premakne v smeti?" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "Predmeta \"%s\" ni mogoče premakniti v smeti. Ali naj se izbriše trajno?" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "Disk ni na voljo" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "Vpis pripone datoteke:" #: ulng.rsmsgentername msgid "Enter name:" msgstr "Vnos imena:" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "Napaka CRC v podatkih arhiva" #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "Slabi podatki" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "Ni se mogoče povezati s strežnikom: \"%s\"" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "Ni mogoče kopirati datoteke %s v %s" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "Mapa z imenom \"%s\" že obstaja." #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "Datum %s ni podprt!" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "Mapa %s že obstaja!" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "Ukaz je prekinjen na zahtevo uporabnika" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "Napaka med zapiranjem datoteke" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "Ni mogoče ustvariti datoteke" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "V arhivu ni več datotek" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "Ni mogoče odpreti obstoječe datoteke" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "Napaka med branjem iz datoteke" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "Napaka med pisanjem v datoteko" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "Ni mogoče ustvariti mape %s!" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "Neveljavna povezava" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "Ni najdenih datotek" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "Ni dovolj pomnilnika" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "Funkcija ni podprta!" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "Napaka v ukazu vsebinskega menija" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "Napaka med nalaganjem nastavitev" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "Napaka skladnje logičnega izraza!" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "Ni mogoče preimenovati datoteke %s v %s" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "Vezi ni mogoče shraniti!" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "Ni mogoče shraniti datoteke" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "Ni mogoče določiti atributov za \"%s\"" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "Datuma in časa za datoteko \"%s\" ni mogoče določiti." #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "Ni mogoče določiti lastništva in skupine za \"%s\"" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "Medpomnilnik je premajhen" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "Izbranih je preveč datotek za pakiranje" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "Vrsta arhiva ni znana" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "Datoteka %s je spremenjena. Ali naj se spremembe shranijo?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "Datoteka %s že obstaja. Ali naj bo prepisana?" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "Zaznana so dejavna datotečna opravila" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "Nekatera opravila datotek še niso končana. S predčasnim končanjem programa lahko pride do izgube podatkov." #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "Datoteka %s je označena kot le za branje. Ali naj se vseeno izbriše?" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "Datoteka velikosti \"%s\" je prevelika za ciljni datotečni sistem!" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "Mapa %s že obstaja. Ali naj se prepiše?" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "Ali naj se sledi simbolni povezavi \"%s\"?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "Napaka v ukazni vrstici" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "Neveljavno ime datoteke" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "Neveljaven zapis nastavitvene datoteke" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "Neveljavna pot" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "Pot %s vsebuje nedovoljene znake." #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "Ta vstavek ni veljaven vstavek!" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "Ta vstavek je izgrajen za program Double Commander različice %s.s% Z različico %s ne deluje!" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "Neveljavno navajanje" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "Neveljaven izbor." #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "Nalaganje seznama datotek ..." #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "Kopiraj datoteko %s" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "Izbriši datoteko %s" #: ulng.rsmsglogerror msgid "Error: " msgstr "Napaka:" #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "Razširi datoteko %s" #: ulng.rsmsgloginfo msgid "Info: " msgstr "Podrobnosti:" #: ulng.rsmsgloglink msgid "Create link %s" msgstr "Ustvari povezavo %s" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "Ustvari mapo %s" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "Premakni datoteko %s" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "Zapakiraj v datoteko %s" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "Odstrani mapo %s" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "Končano:" #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "Ustvari simbolno povezavo %s" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "Preizkusi celovitost datoteke %s" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "Ročno dodajanje hitre, pogosto uporabljene poti" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "Ročno urejanje hitre, pogosto uporabljene poti" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "Vnos imena in poti (zapis v obliki ime=pot)" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "Glavno geslo" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "Vnesite glavno geslo:" #: ulng.rsmsgnewfile msgid "New file" msgstr "Nova datoteka" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "Odpakiran bo naslednji del arhiva" #: ulng.rsmsgnofiles msgid "No files" msgstr "Ni datotek" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "Ni izbranih datotek." #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "Ni dovolj prostora na ciljnem pogonu. Ali naj se opravilo vseeno nadaljuje?" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "Ni dovolj prostora na ciljnem pogonu. Ali naj se prostor ponovno izračuna?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "Ni mogoče izbrisati datoteke %s" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "Ni podprto." #: ulng.rsmsgpassword msgid "Password:" msgstr "Geslo:" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "Gesli sta različni!" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "Vnesite geslo:" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "Geslo (požarni zid):" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "Ponovno vnesite geslo za overitev:" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "&Dodaj %s" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "&Nastavitve" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "&Izbriši %s" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "Shranjen predmet \"%s\" že obstaja. Ali naj se prepiše?" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "Ali naj se izbrani predmeti preimenujejo oziroma premaknejo (%d predmetov)?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "Ali naj se predmet \"%s\" preimenuje oziroma premakne?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "Za uveljavitev sprememb je treba program ponovno zagnati." #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "Izbranih: %s od %s, datoteke: %d od %d, mape: %d od %d" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "Izbrati je treba datoteko nadzorne vsote!" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "Izberite mesto za naslednji del arhiva" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "Določi oznako dela arhiva" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "Preimenuj zavihek" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "Novo ime zavihka:" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "Ciljna pot:" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "Nov naziv vnosa menija:" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "Izbranih je preveč datotek." #: ulng.rsmsgurl msgid "URL:" msgstr "Naslov URL:" #: ulng.rsmsgusername msgid "User name:" msgstr "Uporabniško ime:" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "Uporabniško ime (požarni zid):" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "Oznaka dela arhiva:" # This should be multiple plural !!!! #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "Velikost dela arhiva:" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "Ali naj se izbrane datoteke oziroma mape neobnovljivo izbrišejo (%d)?" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "Ali naj se \"%s\" neobnovljivo izbriše?" #: ulng.rsmulrenfilenamestylelist msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "Brez spremembe;VELIKE ČRKE;male črke;Prva črka je velika;Prva Črka Vsake Besede Je Velika;" #: ulng.rsoperaborted msgid "Aborted" msgstr "Preklicano" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "Izračunavanje nadzorne vsote" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "Izračunavanje nadzorne vsote v \"%s\"" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "Izračunavanje nadzorne vsote \"%s\"" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "Preračunavanje" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "Preračunavanje \"%s\"" #: ulng.rsopercombining msgid "Joining" msgstr "Združevanje" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "Združevanje datotek iz \"%s\" v \"%s\"" #: ulng.rsopercopying msgid "Copying" msgstr "Kopiranje" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "Kopiranje iz \"%s\" v \"%s\"" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "Kopiranje \"%s\" v \"%s\"" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "Ustvarjanje mape" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "Ustvarjanje mape \"%s\"" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "Brisanje" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "Brisanje v \"%s\"" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "Brisanje \"%s\"" #: ulng.rsoperexecuting msgid "Executing" msgstr "Izvajanje" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "Izvajanje \"%s\"" #: ulng.rsoperextracting msgid "Extracting" msgstr "Poteka odpakiranje" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "Odpakitanje iz \"%s\" v \"%s\"" #: ulng.rsoperfinished msgid "Finished" msgstr "Končano" #: ulng.rsoperlisting msgid "Listing" msgstr "Izpisovanje" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "Izpisovanje seznama \"%s\"" #: ulng.rsopermoving msgid "Moving" msgstr "Premikanje" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "Premikanje iz \"%s\" v \"%s\"" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "Premikanje \"%s\" v \"%s\"" #: ulng.rsopernotstarted msgid "Not started" msgstr "Ni začeto" #: ulng.rsoperpacking msgid "Packing" msgstr "Pakiranje" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "Pakiranje iz \"%s\" v \"%s\"" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "Pakiranje \"%s\" v \"%s\"" #: ulng.rsoperpaused msgid "Paused" msgstr "V premoru" #: ulng.rsoperpausing msgid "Pausing" msgstr "V premoru" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "V vrsti" #: ulng.rsoperrunning msgid "Running" msgstr "Zagnano" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "Nastavljanje lastnosti" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "Nastavljanje lastnosti v \"%s\"" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "Nastavljanje lastnosti \"%s\"" #: ulng.rsopersplitting msgid "Splitting" msgstr "Razdeljevanje" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "Razdeljevanje \"%s\" v \"%s\"" #: ulng.rsoperstarting msgid "Starting" msgstr "Začenjanje" #: ulng.rsoperstopped msgid "Stopped" msgstr "Zaustavljeno" #: ulng.rsoperstopping msgid "Stopping" msgstr "Zaustavljanje" #: ulng.rsopertesting msgid "Testing" msgstr "Preizkušanje" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "Preizkušanje v \"%s\"" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "Preizkušanje \"%s\"" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "Preverjanje nadzorne vsote" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "Preizkušanje veljavnosti nadzorne vsote v \"%s\"" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "Preizkušanje veljavnosti nadzorne vsote \"%s\"" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "Čakanje na dostop do vira datoteke." #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "Čakanje na odziv uporabnika" #: ulng.rsoperwiping msgid "Wiping" msgstr "Neobnovljivo brisanje" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "Neobnovljivo brisanje v \"%s\"" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "Neobnovljivo brisanje \"%s\"" #: ulng.rsoperworking msgid "Working" msgstr "Izvajanje opravila" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "Izbriši:" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "Odpakiraj brez navedbe poti:" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "Način razčlenjevanja oblike:" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "ID:" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "Položaj ID:" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "ID obsega iskanja:" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "Parameter" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "Niz poizvedbe gesla:" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "Ustvari arhiv za samodejno odpakiranje:" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "Preizkus:" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "Ime vrste arhiva:" #: ulng.rsoptarchivevalue msgid "Value" msgstr "Vrednost" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "Vzpostavi programsko vez vstavka \"%s\" z:" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "prvega stolpca;zadnjega stolpca;" #: ulng.rsoptdisable msgid "Disable" msgstr "Onemogoči" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "Omogoči" #: ulng.rsoptenterext msgid "Enter extension" msgstr "Vnos pripone" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "Kazalka" #: ulng.rsoptexamplemark msgid "Mark" msgstr "Označeno" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "Označeno in v žarišču" #: ulng.rsoptexampletext msgid "Text" msgstr "Besedilo" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "ločenem oknu;pomanjšanem ločenem oknu;oknu opravil" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "plavajoče;B;K;M;G" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "Bližnjica %s za ukaz cm_Delete bo vpisana, zato jo bo mogoče uporabiti za povrnitev te nastavitve." #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "Dodaj hitro tipko za %s" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "Dodaj bližnjico" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "Ni mogoče nastaviti tipkovne bližnjice" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "Spremeni tipkovno bližnjico" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "Ukaz" #: ulng.rsopthotkeysdeletetrashcanoverrides msgctxt "ulng.rsopthotkeysdeletetrashcanoverrides" msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "Tipkovna bližnjica %s za ukaz cm_Delete ima določen parametre, ki prekliče nastavitev. Ali želite spremeniti ta parameter za uporabo splošnih nastavitev?" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgctxt "ulng.rsopthotkeysdeletetrashcanparameterexists" msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "Tipkovna bližnjica %s za cm_Delete mora imeti parameter spremenjen tako, da ustreza tipkovni bližnjici %s. Ali jo želite spremeniti?" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "Opis" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "Uredi hitro tipko za %s" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "Popravi parameter" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "Hitra tipka" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "Hitre tipke" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "Parametri" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "Dodaj bližnjico za brisanje datotek" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "Za povezavo te možnosti s tipkovno bližnjico %s, mora biti ta določena za cm_Delete, vendar je povezana z možnostjo %s. Ali jo želite spremeniti." #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "Tipkovna bližnjica %s za cm_Delete je tipkovna bližnjica zaporedja ukazov za katerega obratnega ukaza ni mogoče določiti. Nastavitev najverjetneje ne bo delovala." #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "Tipkovna bližnjica v uporabi" #: ulng.rsopthotkeysshortcutusedtext1 msgid "Shortcut %s is already used." msgstr "Tipkovna bližnjica %s je že v uporabi." #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "Ali naj se zamenja v %s?" #: ulng.rsopthotkeysusedby msgid "used for %s in %s" msgstr "uporabljeno za %s v %s" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "uporabljeno za ta ukaz, vendar z drugačnimi parametri" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "Pakirniki" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "Samodejno osveževanje" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "Obnašanje" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "Barve" #: ulng.rsoptionseditorcolumnsview msgid "Columns" msgstr "Stolpci" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "Nastavitve" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "Stolpci po meri" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "Povleci in spusti" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "Gumb seznama pogonov" #: ulng.rsoptionseditorfileoperations msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "Opravila datotek" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "Okna datotek" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "Pogled datotek" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "Vrste datotek" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "Zavihki map" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "Pisave" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "Poudarjalniki" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "Hitre tipke" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "Ikone" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "Seznam prezrtih datotek in map" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "Tipke" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "Jezik" #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "Razporeditev" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "Dnevnik" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "Različne možnosti" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "Miška" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "Vstavki" #: ulng.rsoptionseditorquicksearch msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "Hitro iskanje/Filtriranje" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "Terminal" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "Orodna vrstica" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "Orodja" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "Orodni namigi" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "Brez;Ukazna vrstica;Hitro iskanje;Hitri filter" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "Levi gumb;Desni gumb;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "na vrhu seznama datotek;za mapami (če so mape razvrščene pred datotekami);na mestu razvrščanja;na dnu seznama datotek" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "Vstavek %s je že vezan na naslednje pripone datotek:" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "Dejavno" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "Ime datoteke" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "Ime" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "Vpisano za" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "&občutljivo;&neobčutljivo" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "&Datoteke;&Mape;Datoteke &in Mape" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "&Skrij filter, ko okno ni v žarišču" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "ne upošteva velikosti črk;upošteva glede na jezikovno nastavitev sistema (aAbBcC);najprej velike, nato male črke (ABCabc)" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "razvrsti po imenu in najprej pokaži; razvrsti kot datoteke in najprej pokaži; razvrsti kot datoteke" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "abecedno, upoštevajoč znakovne naglase;naravno, številčno in abecedno" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "zgoraj;spodaj;" #: ulng.rsopttoolbarbuttontype msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "&Ločilnik;&Notranji ukaz;&Zunanji ukaz;&Meni" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "ne spremeni mesta;uporabi enake nastavitve kot za nove datoteke;na razvrščeno mesto" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "Datoteke: %d; Mape: %d" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "Ni mogoče spremeniti dovoljenj dostopa za \"%s\"" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "Lastnika \"%s\" ni mogoče spremeniti." #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "Datoteka" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "Mapa" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "Imenovan cevovod" #: ulng.rspropsno msgid "No" msgstr "Ne" #: ulng.rspropssocket msgid "Socket" msgstr "Vtič" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "Posebna bločna naprava" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "Posebna znakovna naprava" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "Simbolna povezava" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "Neznana vrsta" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "Da (%s)" #: ulng.rssearchresult msgid "Search result" msgstr "Rezultati iskanja" #: ulng.rssearchtemplateunnamed msgid "" msgstr "" #: ulng.rsselectdir msgid "Select a directory" msgstr "Izbor mape" #: ulng.rsshowhelpfor msgid "&Show help for %s" msgstr "&Pokaži pomoč za %s" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "Bajti" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "Gigabajti" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "Kilobajti" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "Megabajti" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "Terabajti" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "Datoteke: %d, Mape: %d, Velikost: %s (%s bajtov)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "Ciljne mape ni mogoče ustvariti!" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "Nepravilen zapis velikosti datoteke!" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "Ni mogoče razdeliti datoteke!" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "Število delov presega vrednost 100! Ali naj se opravilo veeno izvede?" #: ulng.rssplitseldir msgid "Select directory:" msgstr "Izbor mape:" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "Napaka med ustvarjanjem simbolne povezave." #: ulng.rssyndefaulttext msgctxt "ulng.rssyndefaulttext" msgid "Default text" msgstr "Privzeto besedilo" #: ulng.rssynlangplaintext msgctxt "ulng.rssynlangplaintext" msgid "Plain text" msgstr "Običajno besedilo" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "dni" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "ure" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "minute" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "meseci" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "sekunde" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "tedni" #: ulng.rstimeunityear msgid "Year(s)" msgstr "leta" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "Primerjalnik" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "Urejevalnik" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "Napaka med odpiranjem primerjalnika" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "Napaka odpiranja urejevalnika" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "Napaka odpiranja terminala" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "Napaka odpiranja pregledovalnika" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "Terminal" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "Pregledovalnik" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "Pošljite poročilo napake s podrobnim opisom in datoteko: %s. Pritisnite %s za nadaljevanje ali pa %s za končanje programa." #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "Omrežje" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "Notranji pregledovalnik programa Double Commander." #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "Nabor znakov" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "%s ni mogoče najti!" doublecmd-0.5.8/language/lcl/0000755000175000017500000000000012257501472015050 5ustar alexxalexxdoublecmd-0.5.8/language/lcl/lclstrconsts.fr.po0000644000175000017500000012330612250635657020566 0ustar alexxalexxmsgid "" msgstr "" "Last-Translator: Zebulon Tourneboulle \n" "PO-Revision-Date: 2011-12-14 14:37+0100\n" "Language-Team: Zebulon Tourneboulle \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "MIME-Version: 1.0\n" "POT-Creation-Date: \n" "Project-Id-Version: Double Commander 0.5.1 beta\n" "X-Poedit-Bookmarks: -1,190,-1,-1,-1,-1,-1,-1,-1,-1\n" "X-Poedit-Language: French\n" "X-Poedit-Country: BELGIUM\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "Navigateur %s%s%s non exécutable." #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "Navigateur %s%s%s non trouvé." #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "Erreur en exécutant %s%s%s : %s%s" #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "Impossible de trouver un navigateur HTML." #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "La base de données d'aide %s%s%s ne trouve pas le fichier %s%s%s." #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "La macro %s dans BrowserParams sera remplacée par l'URL." #: lclstrconsts.ifsalt msgid "Alt" msgstr "Alt" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "Ctrl" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "Accepter" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "touche application" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "Retour arrière" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "Annuler" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "Majuscule" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "Effacer" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "Contrôle" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "Convertir" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "Supprimer" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "Bas" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "Fin" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "Echappement" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "Exécuter" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "Final" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "Hanja" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "Aide" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "Origine" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "Insérer" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "Junja" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "Kana" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "Bouton gauche de la souris" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "Gauche" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "Touche Windows gauche" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "Bouton central de la souris" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "Menu" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "Changement de mode" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "Suivant" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "Non converti" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "Verr num." #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "%d pav num." #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "Touche pause" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "Imprimer" #: lclstrconsts.ifsvk_prior #, fuzzy msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "Prioritaire" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "Bouton droit de la souris" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "Retour" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "Droite" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "Touche Windows droite" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "Défilement" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "Sélectionner" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "Maj." #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "Capture d'écran" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "Barre d'espace" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "Étiquette" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "Inconnu" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "Haut" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "impossible d'exécuter %s" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "Ressource %s non trouvée" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "fichier du programme non trouvé %s" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "3D Dark Shadow" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "3D Light" #: lclstrconsts.rsacontrolcannothaveitselfasparent #, fuzzy #| msgid "A control can't have itself as parent" msgid "A control can't have itself as a parent" msgstr "Un contrôle ne peut pas être son propre parent" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "Bordure active" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "Champ actif" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "Tous les fichiers (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "Espace de travail de l'application" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "Aqua" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "Bureau" #: lclstrconsts.rsbackward msgid "Backward" msgstr "Arrière" #: lclstrconsts.rsbitmaps #, fuzzy msgid "Bitmaps" msgstr "Images" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "Noir" #: lclstrconsts.rsblank msgid "Blank" msgstr "Blanc" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "Bleu" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "Face du bouton" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "Bouton en surbrillance" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "Ombre du bouton" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "Texte du bouton" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "Calculateur" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "Anuler" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "Impossible de focaliser" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "Dessin sur le canevas non autorisé" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "Texte du champ" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "Respecter la casse" #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "Le contrôle de la classe '%s' ne peut pas avoir le contrôle sur la classe '%s' comme enfant" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "Le contrôle '%s' n'a pas de fenêtre parente" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "Crême" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "Créer une erreur d'arrêt de gdb :" #: lclstrconsts.rscursor msgid "Cursor" msgstr "Curseur" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "Personnaliser..." #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "Défaut" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "permission utilisateur groupe taille date heure" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "Supprimer l'enregistrement ?" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "Supprimer" #: lclstrconsts.rsdirection msgid "Direction" msgstr "Direction" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "&Dossier" #: lclstrconsts.rsdocking msgid "Docking" msgstr "Amarrage" #: lclstrconsts.rsduplicateiconformat #, fuzzy msgid "Duplicate icon format." msgstr "Dupliquer le format d'icône." #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "Editer" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "Rechercher dans tout le fichier" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "Erreur" #: lclstrconsts.rserrorcreatingdevicecontext #, fuzzy msgid "Error creating device context for %s.%s" msgstr "Erreur en créant le contexte du périphérique pour %s.%s" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "Erreur dans LCL :" #: lclstrconsts.rserroroccurredinataddressframe #, fuzzy msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "Une erreur s'est produite dans %s à l'adresse %s%s de la page %s" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "Erreur de lecture %s%s%s : %s" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "Erreur en sauvegardant l'image." #: lclstrconsts.rsexception msgid "Exception" msgstr "Exception" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "Le dossier doit exister" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "Le dossier \"%s\" n'existe pas." #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "Le fichier \"%s\" existe déjà. L'écraser ?" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "Le fichier doit exister" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "Le fichier \"%s\" n'existe pas." #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "Le fichier \"%s\" est en lecture seule." #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "Fichier protégé en écriture" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "Enregistrer le fichier sous" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "Ouvrir un fichier existant" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "Ecraser le fichier ?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "Le chemin doit exister" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "Le chemin \"%s\" n'existe pas." #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "Choisir un dossier" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(Fichier \"%s\" non trouvé)" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "Informations sur le fichier" #: lclstrconsts.rsfind msgid "Find" msgstr "Chercher" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "Chercher encore" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "Premier" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "\"FixedCols\" ne peut pas être supérieur \"ColCount\"" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "\"FixedRows\" ne peut pas être supérieur \"RowCount\"" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "Formulaire" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror #, fuzzy msgid "Form streaming \"%s\" error: %s" msgstr "Dans le flux de fiche \"%s\" : erreur %s" #: lclstrconsts.rsforward msgid "Forward" msgstr "Avant" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "Fuchsia" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "--gdk-debug flags Activer les messages spécifique GDK+ trace/debug." #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "--gdk-no-debug flags Arrêter les messages spécifique GDK+ trace/debug." #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "Graphics Interchange Format" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "--g-fatal-warnings Les avertissements et les erreurs produits par Gtk+/GDK stopperont l'application." #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "Gradient du champ inactif" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "Gradient du champ inactif" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "Graphique" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "Gris" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "Texte gris" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "Vert" #: lclstrconsts.rsgridfiledoesnotexists #, fuzzy msgid "Grid file doesn't exists" msgstr "Le fichier \"Grid\" n'existe pas" #: lclstrconsts.rsgridindexoutofrange #, fuzzy msgid "Grid index out of range." msgstr "Index de grille hors limite." #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "\"GroupIndex\" ne peut pas être inférieur au \"GroupIndex\" des éléments précédents" #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "Filtre :" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "Historique" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "--class classname Suivre la convention Xt, la classe d'un programme est le nom de programme avec le caractère initial en majuscule. Par exemple, le nom de classe pour gimp est \"Gimp\". Si --class est indiquée, la classe du programme sera réglé sur \"classname\"." #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "--gtk-debug flags Activer les messages spécifique Gtk+ trace/debug." #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "--display h:s:d Se connecter à X serveur, où \"h\" est le nom d'hôte, \"s\" est le nombre de serveur (habituellement 0), et \"d\" est le nombre d'affichage (typiquement omis). Si --l'affichage n'est pas indiqué, la variable d'environnement DISPLAY est employé." #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "--gtk-module module Charger le module indiqué au démarrage." #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "--name programme Ensemble pour le nom du programme \"progname\". Si non spécifiée, le nom du programme sera fixée à ParamStrUTF8 (0)." #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "--gtk-no-debug flags Arrêter les messages spécifique Gtk+ trace/debug." #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "--lcl-no-transient Ne mettez pas d'ordre transitoire pour les formes modales" #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "--no-xshm Désactive l'utilisation de la mémoire étendu partagée par X." #: lclstrconsts.rsgtkoptionsync #, fuzzy #| msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediatey after the protocol request that generated the error has been processed by the X server." msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "--sync Appel XSynchronize (affichage, Vrai) après que le raccordement au serveur X ait été établi. Ceci rend le déboguage des erreurs du protocole X plus faciles, parce que les demandes de buffer par X sont désactivé et les erreurs de X seront reçu immédiatement après la demande de protocole qui a produit l'erreur traité par le serveur X." #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "%s : Déjà enregistré" #: lclstrconsts.rshelpcontextnotfound #, fuzzy #| msgid "Help Context not found" msgid "A help database was found for this topic, but this topic was not found" msgstr "Contexte d'aide non trouvé" #: lclstrconsts.rshelpdatabasenotfound #, fuzzy #| msgid "Help Database not found" msgid "There is no help database installed for this topic" msgstr "Base de données d'aide non trouvée" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "Erreur d'aide" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "Contexte d'aide %s non trouvé." #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "Contexte d'aide %s non trouvé dans la base de données %s%s%s." #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "La base de données d'aide %s%s%s n'a pas trouvé une visionneuse pour une page d'aide du type %s" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "Base de données d'aide %s%s%s non trouvée" #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "Mot-clé d'aide %s%s%s non trouvé." #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "Mot-clé d'aide %s%s%s non trouvé dans la base de données %s%s%s." #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "Le nœud d'aide %s%s%s n'a aucune base de données" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "Aucune aide trouvée pour la ligne %d, colonne %d de %s." #: lclstrconsts.rshelpnohelpnodesavailable #, fuzzy #| msgid "No help nodes available" msgid "No help entries available for this topic" msgstr "Aucuns nœuds d'aide disponibles" #: lclstrconsts.rshelpnotfound #, fuzzy #| msgid "Help not found" msgid "No help found for this topic" msgstr "Aide non trouvée" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "%s : Non enregistré" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "Erreur de sélecteur d'aide" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "Il n'y a aucune visionneuse pour ce type d'aide %s%s%s" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "Erreur de la visionneuse d'aide" #: lclstrconsts.rshelpviewernotfound #, fuzzy #| msgid "Help Viewer not found" msgid "No viewer was found for this type of help content" msgstr "Visionneuse d'aide non trouvée" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "Surbrillance" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "Texte en surbrillance" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "\"Lumière chaude\"" #: lclstrconsts.rsicns #, fuzzy #| msgid "OSX Icon Resource" msgid "Mac OS X Icon" msgstr "Ressource d'icône OSX" #: lclstrconsts.rsicon msgid "Icon" msgstr "Icône" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "L'image de l'icône ne peut pas être vide" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "L'image de l'icône doit avoir le même format" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "Impossible de modifier le format de l'image de l'icône" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "L'image de l'icône doit avoir la même taille" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "Impossible de modifier la taille de l'image de l'icône" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "L'icône n'a pas d'image" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "Bordure innactive" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "Champ inactif" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "Champ inactif" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "%s Index %d hors des limites 0 .. %d " #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "Index hors limites Cell[Col=%d Row=%d]" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "Arrière-plan de l'info" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "Texte d'information" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "Insérer" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "Date invalide : %s" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "Date invalide : %s. Doit être entre %s et %s" #: lclstrconsts.rsinvalidformobjectstream #, fuzzy msgid "invalid Form object stream" msgstr "Flux d'objet fiche invalide" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "Valeur de propriété incorrecte" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "Format de flux incorrect" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "%s est déjà associé avec %s" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "Joint Picture Expert Group" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "Dernier" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "Citron" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "Index de liste hors limites (%d)" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "La liste doit être vide" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "Maron" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "Abandonner" #: lclstrconsts.rsmball msgid "&All" msgstr "&Tout" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "Annuler" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "&Fermer" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "&Aide" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "&Ignorer" #: lclstrconsts.rsmbno msgid "&No" msgstr "&Non" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "Non pour tout" #: lclstrconsts.rsmbok msgid "&OK" msgstr "&OK" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "&Ouvrir" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "&Réessayer" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "&Enregistrer" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "&Déverouiller" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "&Oui" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "Oui pour &tout" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "Gris moyen" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "Barre du menu" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "Menu" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "Menu en surbrillance" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "Texte des menu" #: lclstrconsts.rsmodified msgid " modified " msgstr " modifié " #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "Vert de gris" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "Authentification" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "Confirmation" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "Personnalisé" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "Erreur" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "Information" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "Avertissement" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "Navy" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "Suivant" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "Aucune" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "N'est pas un fichier de grille correct" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "Aucun objet \"widgetset\". Vérifier si l'unité \"interfaces\" a bien été ajoutée à la clause \"uses\" du programme." #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "Olive" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "Choisir une date" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "Pixmap" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "Portable BitMap" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "Portable GrayMap" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "Portable Network Graphic" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "Portable PixMap" #: lclstrconsts.rspostrecordhint #, fuzzy msgid "Post" msgstr "Message" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok #, fuzzy #| msgid "%s%sPress Ok to ignore and risk data corruption.%sPress Cancel to kill the program." msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "%s%s Pressez OK pour ignorer et risquer des données corruption.%s Pressez Annuler pour fermer le programme. " #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "Précédent" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "La propriété %s n'existe pas" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "Pourpre" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "" #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "" #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "" #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "" #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "" #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "" #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "" #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "" #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "" #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "" #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "" #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "" #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "" #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "" #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "" #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "" #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "" #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "" #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "" #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "" #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "Impossible de sauvegarder l'image pendant la mise à jour" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "Impossible de démarrer la mise à jour compète pendant la mise à jour du canevas" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "Rouge" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "Rafraichir" #: lclstrconsts.rsreplace msgid "Replace" msgstr "Remplacer" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "Tout remplacer" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "Ressource %s non trouvée" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "Barre de défilement" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "Propriété \"ScrollBar\" hors limites" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "Choisir une couleur" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "Choisir une police" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "Argent" #: lclstrconsts.rssize msgid " size " msgstr " taille " #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "Bleu ciel" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "Sarcelle" #: lclstrconsts.rstext msgid "Text" msgstr "Texte" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "Tagged Image File Format" #: lclstrconsts.rstpanelaccessibilitydescription msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "Impossible de charger la police par défaut" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "Erreur inconnue, merci de rapporter ce bogue svp" #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "Type d'image inconnu" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "Format d'image inconnu" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "Format bitmap non supporté." #: lclstrconsts.rsunsupportedclipboardformat #, fuzzy msgid "Unsupported clipboard format: %s" msgstr "Format %s de presse-papiers non supporté" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr " ATTENTION : Il y a %d DCs non libres, en voici le détail : " #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr " ATTENTION : Il y a %d GDIObjects non libres, en voici le détail : " #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr " ATTENTION : il y a %d messages en file d'attente ! Ils seront supprimés." #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr " ATTENTION : Il y a %d structures TimerInfo, elles seront supprimées." #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr " ATTENTION : Il y a %s liens de message LM_PAINT/LM_GtkPAINT non enlevés." #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "Blanc" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "Mots entiers seulement" #: lclstrconsts.rswin32error msgid "Error:" msgstr "Erreur :" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "Attention :" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "Fenêtre" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "Cadre de la fenêtre" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "Texte de la fenêtre" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "Jaune" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "Impossible de focaliser une fenêtre invisible ou désactivée" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "Doublons dans les menus" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "Création d'action non valide" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "Enumration d'action non valide" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "Référencement d'action non valide" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "Déréférencement d'action non valide" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "Le caractère placé dans le masque \"%s\" n'est pas valide !" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "Taille d'image non valide" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "Index de liste d'images non valide" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "Index de menu hors limites" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "\"MenuItem\" n'est pas assigné (nil)" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "Le sous-menu n'est pas dans le menu" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "Alt+" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "Retour arrière" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "Ctrl+" #: lclstrconsts.smkcdel msgid "Del" msgstr "Sup." #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "Bas" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "Fin" #: lclstrconsts.smkcenter msgid "Enter" msgstr "Entrée" #: lclstrconsts.smkcesc msgid "Esc" msgstr "Esc" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "Origine" #: lclstrconsts.smkcins msgid "Ins" msgstr "Ins" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "Gauche" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "Meta+" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "PgDn" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "PgUp" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "Droite" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "Shift+" #: lclstrconsts.smkcspace msgid "Space" msgstr "Espace" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "Étiquette" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "Haut" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "Aucune fiche MDI présente" #: lclstrconsts.snotimers msgid "No timers available" msgstr "Aucun temporisateur disponible" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "Mauvais type de jeton : %s attendu" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "Nombre à virgule flottante non valide : %s" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "Nombre entier non valide : %s" #: lclstrconsts.sparlocinfo #, fuzzy #| msgid " (at %d,%d, stream offset %.8x)" msgid " (at %d,%d, stream offset %d)" msgstr " (à %d,%d, stream offset %.8x)" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "Valeur d'octet non terminée" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "Chaîne non terminée" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "Mauvais symbole de jeton : %s attendu mais %s trouvé" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "Mauvais type de jeton : %s attendu mais %s trouvé" doublecmd-0.5.8/language/lcl/lclstrconsts.ca.po0000644000175000017500000011664612250635657020553 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" "PO-Revision-Date: 2008-11-26 11:49+0100\n" "Last-Translator: Antoni Clavell \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "Navegador %s%s%s no executable." #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "Navegador %s%s%s no trobat." #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "Error en executar %s%s%s:%s%s" #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "No puc trobar un navegador HTML" #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "La base de dades de l'ajuda %s%s%s no ha pogut trobar el fitxer %s%s%s." #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "La macro %s en BrowserParams (paràmetres navegador) serà substituïda per la URL." #: lclstrconsts.ifsalt msgid "Alt" msgstr "Alt" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "Ctrl" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "Accepta" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "tecla d'aplicació" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "Espai enrere" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "Majúscula" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "Neteja" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "Control" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "Converteix" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "Esborra" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "Avall" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "Fi" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "Escapa" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "Executa" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "Final" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "Hanja" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "Ajuda" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "Inici" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "Insereix" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "Junja" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "Kana" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "Botó esquerre del ratolí" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "Esquerra" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "tecla windows esquerra" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "Butó del mig del ratolí" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "Menú" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "Canvi de mode" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "Pròxim" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "No convertible" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "Teclat numèric" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "Teclat numèric %d" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "Tecla de pausa" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "Imprimeix" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "Previ" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "Botó dret del ratolí" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "Retorn" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "Dreta" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "tecla windows dreta" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "Explora" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "Selecciona" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "Majúsc." #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "Captura" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "Espaiador" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "Tab" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "Desconegut" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "Amunt" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "Recurs %s no trobat" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "" #: lclstrconsts.rsacontrolcannothaveitselfasparent #, fuzzy #| msgid "A control can't have itself as parent" msgid "A control can't have itself as a parent" msgstr "Un control no pot cridar-se a ell mateix" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "Tots els fitxers (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "" #: lclstrconsts.rsbackward msgid "Backward" msgstr "Enrere" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "Mapes de bits" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "" #: lclstrconsts.rsblank msgid "Blank" msgstr "En blanc" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "Calculadora" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "No es pot focalitzar" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "El marc no permet el dibuix" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "Sensible a majúsc-minúsc." #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "Creant un error gdb capturable:" #: lclstrconsts.rscursor msgid "Cursor" msgstr "" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "" #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "permisos usuari grup mida dia hora" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "Esborra" #: lclstrconsts.rsdirection msgid "Direction" msgstr "Direcció" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "&Directori" #: lclstrconsts.rsdocking msgid "Docking" msgstr "Fixa" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "" #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "Error en crear dispositiu de context per a %s.%s" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "ERROR en LCL" #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "Error ocorregut en %s a l'%sAdreça %s%s Estructura %s" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "Error en llegir %s%s%s: %s" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "Error en desar el mapa de bits" #: lclstrconsts.rsexception msgid "Exception" msgstr "Excepció" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "Cal que el directori existeixi" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "El directori \"%s\" no existeix." #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "El fitxer \"%s\" ja existeix. El sobrescric ?" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "El fitxer ha d'existir" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "El fitxer \"%s\" no existeix." #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "El fitxer \"%s\" no és d'escriptura." #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "No es pot escriure aquest fitxer" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "Anomena i desa el fitxer" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "Obre fitxer existent" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "Sobrescric el fitxer?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "El camí ha d'existir" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "El camí \"%s\" no existeix." #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "Selecciona directori" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(fitxer no trobat: \"%s\")" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "Informació del fitxer" #: lclstrconsts.rsfind msgid "Find" msgstr "Busca" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "Busca més" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "FixedCols (columnes fixades) no poden ser>= ColCount (recompte de columnes)" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "FixedRows (files fixades) no poden ser >= RowCount (recompte de files)" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "Formació del corrent \"%s\" amb error: %s" #: lclstrconsts.rsforward msgid "Forward" msgstr "Endavant" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "--gdk-debug flags Engega missatges específics de GDK de traça/depuració." #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "--gdk-no-debug flags Tanca els missatges específics GDK de traça/depuració." #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "--g-fatal-warnings Els errors i advertències generats per Gtk+/GDK aturaran l'aplicació." #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "No existeix fitxer de la graella" #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "Índex de la graella fora de rang" #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "GroupIndex no pot ser menor que un ítem de menú GroupIndex anterior." #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "Filtre:" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "Historial:" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "--class classname Seguint les convencions Xt, la classe d'un programa és el nom del programa amb el caràcter inicial en majúscula. Per exemple, el nom de classe (classname) per al gimp és \"Gimp\". Si --class s'especifica, la classe del programa serà posada com \"classname\"." #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "--gtk-debug flags Mostra missatges Gtk+ específics de traça/depuració." #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "--display h:s:d Connecta al servidor X especificat, on \"h\" és el nom del host, \"s\" és el número del servidor (usualment 0), i \"d\" és el número a mostrar (típicament omès). Si --display no s'ha especificat,s'usarà l'entorn variable DISPLAY." #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "--gtk-module module Carrega el mòdul especificat a l'engegar." #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "--name programe Posa el nom del programa a \"progname\". Si no s'ha especificat, el nom serà posat a ParamStr(0)." #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "--gtk-no-debug flags Tanca els missatges Gtk+ específics de traça/depuració." #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "--lcl-no-transient No posis ordre transient per a formes modals." #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "--no-xshm Desactiva l'ús de l'extensió X de memòria compartida." #: lclstrconsts.rsgtkoptionsync #, fuzzy #| msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediatey after the protocol request that generated the error has been processed by the X server." msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "--sync Crida XSynchronize (display, True) un cop la connexió al Xserver ha estat establerta. Això facilita que la depuració d'errors del protocol X sigui més senzilla, perquè la demanda de memòria cau X serà desactivad i els errors X seran rebuts immediatament després que la demanda del protocol que ha generat l'error ha estat processat pel servidor X." #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "Ja enregistrat" #: lclstrconsts.rshelpcontextnotfound #, fuzzy #| msgid "Help Context not found" msgid "A help database was found for this topic, but this topic was not found" msgstr "No trobo ajuda contextual" #: lclstrconsts.rshelpdatabasenotfound #, fuzzy #| msgid "Help Database not found" msgid "There is no help database installed for this topic" msgstr "Base de dades de l'ajuda no trobada" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "Error d'ajuda" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "Context d'ajuda %s no trobat." #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "Context d'ajuda %s no trobat en la base de dades %s%s%s." #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "La base de dades de l'ajuda %s%s%s no ha trobat un visor per una pàgina d'ajuda del tipus %s" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "Base de dades de l'ajuda %s%s%s no trobada" #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "Paraula clau d'ajuda %s%s%s no trobada" #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "Paraula clau d'ajuda %s%s%s no trobada en la base de dades %s%s%s." #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "El node d'ajuda %s%s%s no té base de dades d'ajuda" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "No s'ha trobat cap ajuda per a la línia %d, columna %d de %s." #: lclstrconsts.rshelpnohelpnodesavailable #, fuzzy #| msgid "No help nodes available" msgid "No help entries available for this topic" msgstr "No hi ha nodes d'ajuda disponibles" #: lclstrconsts.rshelpnotfound #, fuzzy #| msgid "Help not found" msgid "No help found for this topic" msgstr "Ajuda no trobada" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "No enregistrat" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "Error del selector d'ajuda" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "No hi ha cap visor per al tipus d'ajuda %s%s%s" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "Error del visor d'ajuda" #: lclstrconsts.rshelpviewernotfound #, fuzzy #| msgid "Help Viewer not found" msgid "No viewer was found for this type of help content" msgstr "Visor d'ajuda no trobat" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "" #: lclstrconsts.rsicns msgid "Mac OS X Icon" msgstr "" #: lclstrconsts.rsicon msgid "Icon" msgstr "Icona" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "%s índex %d fora de límits 0-%d" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "Índex fora de rang Cel·lal[Col=%d Fila=%d]" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "Insereix" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "Data no vàlida: %s" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "Data no vàlida: %s. Cal que estigui entre %s i %s" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "Corrent d'objecte de forma no vàlid" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "Valor de la propietat no vàlid" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "Corrent amb format invàlid" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "%s ja està associat amb %s" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "L'índex de la llista excedeix els límits (%d)" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "Cal que la llista sigui buida" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "Cancel·la" #: lclstrconsts.rsmball msgid "&All" msgstr "&Tot" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "Cancel·la" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "Tan&ca" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "&Ajuda" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "&Ignora" #: lclstrconsts.rsmbno msgid "&No" msgstr "&No" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "No a tot" #: lclstrconsts.rsmbok msgid "&OK" msgstr "D'&acord" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "&Torna-ho a provar" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "&Sí" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "Sí a &tot" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "Menú" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "" #: lclstrconsts.rsmodified msgid " modified " msgstr " modificat " #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "Confirmació" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "Personalitza" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "Error" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "Informació" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "Avís" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "Pròxim" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "Fitxer de graella no vàlid" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "No hi és com a objecte o dispositiu. Sisplau, comproveu si la unitat \"interfaces\" (interfícies) fou afegida a la clàusula d'usos del programa." #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "Selecciona una data" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "Mapa de píxels" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "PNG (Portable Network Graphic)" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok #, fuzzy #| msgid "%s%sPress Ok to ignore and risk data corruption.%sPress Cancel to kill the program." msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "%s%s%sPolseu Ok per ignorar, tot arriscant de corrompre les dades.%sPolseu Cancel per interrompre el programa" #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "Previ" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "La propietat %s no existeix" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "" #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "" #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "" #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "" #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "" #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "" #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "" #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "" #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "" #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "" #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "" #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "" #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "" #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "" #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "" #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "" #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "" #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "" #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "" #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "" #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "" #: lclstrconsts.rsreplace msgid "Replace" msgstr "Substitueix" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "Substitueix-ho tot" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "Recurs %s no trobat" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "Propietat de la barra de desplaçament fora de mida" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "Tria color" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "Selecciona tipus de lletra" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "" #: lclstrconsts.rssize msgid " size " msgstr " mida " #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "" #: lclstrconsts.rstext msgid "Text" msgstr "Text" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "" #: lclstrconsts.rstpanelaccessibilitydescription msgctxt "lclstrconsts.rstpanelaccessibilitydescription" msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgctxt "lclstrconsts.rstsplitteraccessibilitydescription" msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgctxt "lclstrconsts.rsttreeviewaccessibilitydescription" msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "No puc carregar la font per defecte" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "Error desconegut. Sisplau reporteu-lo" #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "Extensió d'imatge desconeguda" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "Format de mapa de bits no suportat" #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "Format del portaretalls no suportat: %s" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr " Avís: hi ha %d DCs no llançats, tot seguit es mostra informació detallada:" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr " Avís: Hi ha %d Objectes-GDI no llançats, tot seguit es mostra informació detallada:" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr " Avís: Hi ha %d missatges perduts a la cua!, els allibero" #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr " Avís: s'han perdut %d estructures TimerInfo, les allibero" #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr "Avís: S'han deixat %s enllaços a missatge LM_PAINT/LM_GtkPAINT, sense eliminar" #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "Només mots sencers" #: lclstrconsts.rswin32error msgid "Error:" msgstr "Error:" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "Avís:" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "No puc accedir a una finestra invisible o tancada" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "Menús duplicats" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "Creació d'acció no vàlida" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "Enumeració d'acció no vàlida" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "Enregistrament d'acció no vàlid" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "Acció de desenregistrar invàlida" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "El caràcter de la màscara \"%s\" no és vàlid!" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "Mida de la imatge no vàlida" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "Índex de llista d'imatges no vàlid" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "Índex de menú fora de rang" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "L'opció no hi és al menú" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "El submenú no és al menú" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "" #: lclstrconsts.smkcdel msgid "Del" msgstr "" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "Avall" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "Fi" #: lclstrconsts.smkcenter msgid "Enter" msgstr "" #: lclstrconsts.smkcesc msgid "Esc" msgstr "" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "Inici" #: lclstrconsts.smkcins msgid "Ins" msgstr "" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "Esquerra" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "Dreta" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "" #: lclstrconsts.smkcspace msgid "Space" msgstr "" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "Tab" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "Amunt" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "No hi ha cap forma MDI present" #: lclstrconsts.snotimers msgid "No timers available" msgstr "No hi ha rellotges disponibles" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "" #: lclstrconsts.sparlocinfo msgid " (at %d,%d, stream offset %d)" msgstr "" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "" doublecmd-0.5.8/language/lcl/lclstrconsts.zh_CN.po0000644000175000017500000011375212250635657021164 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: 0.9.27 beta\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2009-04-24 19:20+0800\n" "Last-Translator: XY.Chen 、Liu Sizhuang (2008-06-15)\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Chinese\n" "X-Poedit-Country: CHINA\n" "X-Poedit-SourceCharset: utf-8\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "浏览 %s%s%s 不是可执行程序." #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "浏览 %s%s%s 未找到." #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "当执行 %s%s%s 时发生错误:%s%s " #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "无法找到 HTML 浏览器" #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "帮助数据库 %s%s%s 无法找到文件 %s%s%s." #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "浏览框里的宏 %s 将被 URL 所替代." #: lclstrconsts.ifsalt msgid "Alt" msgstr "" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "接受" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "应用程序快捷键" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "退格" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "取消" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "大写" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "清除" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "控件" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "转换" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "删除" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "执行" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "帮助" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "鼠标左键" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "左" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "左 Win 键" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "鼠标中键" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "菜单" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "模式更改" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "不转换" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "数字锁定" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "数字键盘 %d" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "暂停键" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "打印" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "鼠标右键" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "返回" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "右" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "右 Win 键" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "滚动" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "选择" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "" #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "快照" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "空格键" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "未知" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "上" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "未找到资源 %s" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "3D阴影" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "3D光线" #: lclstrconsts.rsacontrolcannothaveitselfasparent #, fuzzy #| msgid "A control can't have itself as parent" msgid "A control can't have itself as a parent" msgstr "控件不能把自己设为父节点" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "活动边线" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "活动标题" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "所有文件 (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "引用程序工作区" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "桌面" #: lclstrconsts.rsbackward msgid "Backward" msgstr "后退" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "黑白位图" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "黑" #: lclstrconsts.rsblank msgid "Blank" msgstr "空白" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "蓝" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "按钮表面" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "按钮高亮" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "按钮阴影" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "按钮文本" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "计算器" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "取消" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "无法聚焦" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "Canvas 不允许画图" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "标题文本" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "大小写敏感" #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "创建 GDB 可以捕捉的错误" #: lclstrconsts.rscursor msgid "Cursor" msgstr "光标" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "自定义..." #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "默认" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "权限 用户 组 大小 日期 时间" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "删除记录?" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "删除" #: lclstrconsts.rsdirection msgid "Direction" msgstr "方向" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "目录(&D)" #: lclstrconsts.rsdocking msgid "Docking" msgstr "停靠" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "同样的图标格式." #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "编辑" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "错误" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "" #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "在 %s %s地址 %s%s 框架 %s" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "读取 %s%s%s 错误: %s" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "保存位图时出错。" #: lclstrconsts.rsexception msgid "Exception" msgstr "异常" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "目录必须存在" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "目录 \"%s\" 不存在." #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "文件 \"%s\" 已经存在.%s替换吗?" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "文件必须存在" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "文件 \"%s\" 不存在." #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "文件 \"%s\" 为只读." #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "文件为只读" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "另存为" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "打开文件" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "覆盖文件?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "路径不存在" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "路径 \"%s\" 不存在." #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "选择目录" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(未找到文件: \"%s\")" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "文件信息" #: lclstrconsts.rsfind msgid "Find" msgstr "查找" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "查找更多" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "FixedCols 不能 >= ColCount" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "FixedRows 不能 >= RowCount" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "窗体" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "窗体流 \"%s\" 错误: %s" #: lclstrconsts.rsforward msgid "Forward" msgstr "向前" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "紫红" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "--gdk-debug flags 打开 GDK 跟踪/调试信息." #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "--gdk-no-debug flags 关闭 GDK 跟踪/调试信息." #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "--g-fatal-warnings 使 Gtk+/GDK 产生的警告和错误终止应用程序。" #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "活动标题颜色渐变" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "非活动标题颜色渐变" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "灰" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "灰色文本" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "绿" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "网格文件不存在" #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "网格索引越界。" #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "GroupIndex 不能比之前的菜单项目的 GroupIndex 少" #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "过滤器:" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "历史:" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "--class classname 按照 Xt 转换规则, 一个程序的类别是第一个字母大写的程序名称。比如,gimp 的类别是 \"Gimp\"。如果指定了 --class,程序的类别会被设为 \"classname\"。" #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "--gtk-debug flags 打开 Gtk+ 跟踪/调试信息." #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "--display h:s:d 连接到指定的 X 服务器,其中 \"h\"是主机名,\"s\"是服务器编号(通常是0),\"d\" 是显示编号(一般省略)。如果没有指定 --display ,将会使用 DISPLAY 环境变量。" #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "--gtk-module module 启动时载入指定模块" #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "" #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "--gtk-no-debug flags 关闭 Gtk+ 跟踪/调试信息." #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "--lcl-no-transient 不要为形式上的窗体设定临时顺序" #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "--no-xshm 禁止使用 X 共享内存扩展。" #: lclstrconsts.rsgtkoptionsync msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "" #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "%s: 已经注册" #: lclstrconsts.rshelpcontextnotfound #, fuzzy #| msgid "Help Context not found" msgid "A help database was found for this topic, but this topic was not found" msgstr "未找到帮助内容" #: lclstrconsts.rshelpdatabasenotfound #, fuzzy #| msgid "Help Database not found" msgid "There is no help database installed for this topic" msgstr "未找到帮助数据库" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "帮助错误" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "未找到帮助上下文 %s." #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "没有找到 %s 的帮助内容在数据库 %s%s%s 中." #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "帮助数据库 %s%s%s 未找到浏览器可以阅读帮助页 %s 的类型" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "未找到帮助数据库 %s%s%s" #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "关键字 %s%s%s 未找到帮助." #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "关键字 %s 的帮助在数据库 %s%s%s 中没有找到." #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "帮助节点 %s%s%s 没有帮助数据库" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "没有找到 %s 的行 %d, 列 %d 的 %s 的相关帮助." #: lclstrconsts.rshelpnohelpnodesavailable #, fuzzy #| msgid "No help nodes available" msgid "No help entries available for this topic" msgstr "没有有效的帮助节点" #: lclstrconsts.rshelpnotfound #, fuzzy #| msgid "Help not found" msgid "No help found for this topic" msgstr "未找到帮助" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "%s: 没有注册" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "帮助选择器错误" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "帮助类型 %s%s%s 没有查看器" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "帮助查看器错误" #: lclstrconsts.rshelpviewernotfound #, fuzzy #| msgid "Help Viewer not found" msgid "No viewer was found for this type of help content" msgstr "未找到帮助查看器" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "高亮" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "高亮文本" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "" #: lclstrconsts.rsicns #, fuzzy #| msgid "OSX Icon Resource" msgid "Mac OS X Icon" msgstr "OSX 图标资源" #: lclstrconsts.rsicon msgid "Icon" msgstr "图标" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "图标图像不能为空" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "图标图像必须有相同的格式" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "不能改变图标图像的格式" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "图标图像必须有同样的大小" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "不能改变图标图像的大小" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "图标有不正确的图像" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "非活动边框" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "非活动标题" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "非活动标题" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "%s 索引 %d 超出范围 0 .. %d" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "单元格索引超过范围[列=%d 行=%d]" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "info底色" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "info文本" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "插入" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "无效日期: %s" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "无效日期: %s。 必须在 %s 和 %s 之间" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "无效窗体流对象" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "无效属性值" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "无效流格式" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "%s 已经与 %s 相关联" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "橙" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "list 索引超过限制 (%d)" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "列表必须为空" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "栗" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "中止" #: lclstrconsts.rsmball msgid "&All" msgstr "所有(&A)" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "取消" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "关闭(&C)" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "帮助(&H)" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "忽略(&I)" #: lclstrconsts.rsmbno msgid "&No" msgstr "否(&N)" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "全部选否" #: lclstrconsts.rsmbok msgid "&OK" msgstr "确定(&O)" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "重试(&R)" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "是(&Y)" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "全部选是(&A)" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "中灰" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "菜单条" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "菜单" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "菜单高亮" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "菜单文本" #: lclstrconsts.rsmodified msgid " modified " msgstr "已更改" #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "钱青" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "确认" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "自定义" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "错误" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "信息" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "警告" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "深蓝" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "下一个" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "无" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "不是有效的网格文件" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "没有窗口部件集合对象,请检查单元 \"interfaces\" 是否已添加到程序的uses语句中。" #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "橄榄" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "选择日期" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "位图" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "便携黑白位图" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "便携灰度位图" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "便携网络图片(PNG)" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "便携位图" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "提交" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok #, fuzzy #| msgid "%s%sPress Ok to ignore and risk data corruption.%sPress Cancel to kill the program." msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "%s%s确定忽略但数据有遗失的风险。%s取消则终止程序." #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "优先" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "属性 %s 不存在" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "紫" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "" #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "" #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "" #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "" #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "" #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "" #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "" #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "" #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "" #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "" #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "" #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "" #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "" #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "" #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "" #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "" #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "" #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "" #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "" #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "" #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "处理更新时候不能保存图片" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "红" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "刷新" #: lclstrconsts.rsreplace msgid "Replace" msgstr "替换" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "替换所有" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "未找到资源 %s" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "滚动条" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "滚动条属性超出范围" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "选择颜色" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "选择字体" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "银" #: lclstrconsts.rssize msgid " size " msgstr "大小" #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "天蓝" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "青" #: lclstrconsts.rstext msgid "Text" msgstr "文本" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "" #: lclstrconsts.rstpanelaccessibilitydescription msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "无法装载默认字体" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "未知错误, 请报告这个错误" #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "未知图形文件后缀" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "未支持的位图格式" #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "未支持的剪贴板格式: %s" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr "" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr "" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr "" #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr "" #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr "" #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "白" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "仅整个单词" #: lclstrconsts.rswin32error msgid "Error:" msgstr "错误:" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "警告:" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "窗口" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "窗口框架" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "窗口文本" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "黄" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "不能聚焦于无法聚焦或者不可见的窗口" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "重复的菜单" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "无效创建行为" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "无效列举行为" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "无效的注册行为" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "无效的取消注册行为" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "\"%s\" 指定的字符集无效!" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "无效图像大小" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "无效 ImageList 索引" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "菜单索引超过范围" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "MenuItem 为 nil" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "子菜单不在菜单中" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "" #: lclstrconsts.smkcdel msgid "Del" msgstr "" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "" #: lclstrconsts.smkcenter msgid "Enter" msgstr "" #: lclstrconsts.smkcesc msgid "Esc" msgstr "" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "" #: lclstrconsts.smkcins msgid "Ins" msgstr "" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "左" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "右" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "" #: lclstrconsts.smkcspace msgid "Space" msgstr "" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "上" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "没有 MDI 窗体出现" #: lclstrconsts.snotimers msgid "No timers available" msgstr "无有效计时器" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "错误的标识符类型:期望 %s" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "无效的浮点数:%s" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "无效的整数:%s" #: lclstrconsts.sparlocinfo #, fuzzy #| msgid " (at %d,%d, stream offset %.8x)" msgid " (at %d,%d, stream offset %d)" msgstr "(在 %d,%d, 流偏移 %.8x)" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "未结束的字节值" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "未结束的字符串" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "错误的标识符:期望 %s 但是找到了 %s" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "错误的标识符类型:期望 %s 但是找到了 %s" doublecmd-0.5.8/language/lcl/lclstrconsts.pb.po0000644000175000017500000013031712250635657020560 0ustar alexxalexxmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Project-Id-Version: \n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" "Last-Translator: Marcelo Borges de Paula\n" "Language-Team: \n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "Navegador %s%s%s não é executável" #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "Navegador %s%s%s não encontrado" #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "Erro ao executar %s%s%s:%s%s" #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "Impossível encontrar um navegador \"HTML\"." #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "O banco de dados de ajuda %s%s%s não pôde encontrar o arquivo %s%s%s." #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "A macro %s em \"BrowseParams\" será substituída pela URL." #: lclstrconsts.ifsalt msgid "Alt" msgstr "Alt" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "Ctl" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "Aceitar" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "tecla da aplicação" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "\"Backspace\"" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "Cancelar" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "Maiúscula" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "Limpar" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "Control" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "Converter" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "Excluir" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "Abaixo" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "End" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "Escape" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "Executar" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "Final" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "Hanja" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "Ajuda" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "Home" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "Inserir" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "Junja" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "Kana" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "Botão Esquerdo do Mouse" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "Esquerda" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "tecla windows esquerda" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "Botão Central do Mouse" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "Menu" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "Modo Alterar" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "Próximo" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "Não converter" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "Numlock" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "Numpad %d" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "Tecla Pause" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "Imprimir" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "Anterior" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "Botão Direito do Mouse" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "Retorno" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "Direita" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "tecla windows direita" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "Rolar" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "Selecionar" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "Shift" #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "Instantâneo" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "Tecla espaço" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "Tabulação" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "Desconhecido" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "Acima" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "impossível executar %s" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "Recurso %s não encontrado" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "arquivo programa não encontrado %s" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "Sombra escura 3D" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "Luz 3D" #: lclstrconsts.rsacontrolcannothaveitselfasparent #, fuzzy #| msgid "A control can't have itself as parent" msgid "A control can't have itself as a parent" msgstr "Um controle não pode ter ele mesmo como pai" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "Borda Ativa" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "Rótulo Ativo" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "Todos os arquivos (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "Espaço de trabalho Aplicação" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "Ciano" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "Área de trabalho" #: lclstrconsts.rsbackward msgid "Backward" msgstr "Atrás" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "Bitmaps" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "Preto" #: lclstrconsts.rsblank msgid "Blank" msgstr "Em Branco" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "Azul" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "Face Botão" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "Realce Botão" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "Sombra Botão" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "Texto Botão" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "Calculadora" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "Cancelar" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "Impossível focar" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "Canvas não permite desenho" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "Texto Rótulo" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "Diferenciar maiúsc./minúsc." #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "Controle de classe '%s' não pode ter controle de classe '%s' como filho" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "Controle '%s' não possui janela pai" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "Creme" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "Criando erro \"gdb\" capturável:" #: lclstrconsts.rscursor msgid "Cursor" msgstr "Cursor" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "Personalizado ..." #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "Padrão" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "permissões grupo usuário, tamanho, data, hora" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "Excluir registro?" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "Excluir" #: lclstrconsts.rsdirection msgid "Direction" msgstr "Direção" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "&Diretório" #: lclstrconsts.rsdocking msgid "Docking" msgstr "Aportar" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "Duplicar formato ícone." #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "Editar" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "Localizar em todo o arquivo" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "Erro" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "Erro na criação do dispositivo de contexto para %s.%s" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "ERRO na LCL: " #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "Erro ocorrido em %s no %sEndereço %s%s Quadro %s" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "Erro na leitura %s%s%s: %s" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "Erro ao salvar \"bitmap\"." #: lclstrconsts.rsexception msgid "Exception" msgstr "Exceção" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "Diretório deve existir" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "O diretório \"%s\" não existe." #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "O arquivo \"%s\" já existe. Sobrescrever?" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "Arquivo deve existir" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "O arquivo \"%s\" não existe." #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "O arquivo \"%s\" não é gravável." #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "Arquivo não é gravável" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "Salvar arquivo como" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "Abrir arquivo existente" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "Sobrescrever arquivo?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "Caminho deve existir" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "O caminho \"%s\" não existe." #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "Selecionar Diretório" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(arquivo não encontrado: \"%s\")" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "Informação arquivo" #: lclstrconsts.rsfind msgid "Find" msgstr "Localizar" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "Localizar mais" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "Primeiro" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "\"FixedCols\" não pode ser >= \"ColCount\"" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "\"FixedRows\" não pode ser >= \"RowCount\"" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "Formulário" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "Fluxo formulário \"%s\" com erro: %s" #: lclstrconsts.rsforward msgid "Forward" msgstr "Adiante" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "Lilás" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "--gdk-debug flags Ativa mensagens GDK específicas rastreamento/depuração." #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "--gdk-no-debug flags Desativa mensagens GDK específicas rastreamento/depuração." #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "Graphics Interchange Format" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "--g-fatar-warnings Avisos e erros gerados por Gkt+/GDK interromperá a aplicação." #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "Rótulo Gradiente Ativo" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "Rótulo Gradiente Inativo" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "Gráfico" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "Cinza" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "Texto Cinza" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "Verde" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "Arquivo de grade não existe" #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "Índice grade fora de faixa." #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "\"GroupIndex\" não pode ser menor que um \"GroupIndex\" anterior dos itens de menu" #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "Filtro:" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "Histórico:" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "--class classname Seguindo convenções Xt, a classe do programa é o nome do programa com o caractere inicial em maiúsculo. Por exemplo, o nome de classe para gimp é \"Gimp\". Se \"--class\" for especificado, a classe do programa será definida para \"classname\"." #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "--gtk-debug flags Ativa mensagens Gtk+ específicas rastreamento/depuração." #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "--display h:s:d Conecta com o servidor X especificado, onde \"h\" é o nome do servidor, \"s\" é o número do servidor (normalmente 0), e \"d\" é o número da tela (tipicamente omitido). Se \"--display\" não for especificado, a variável de ambiente \"DISPLAY\" é usada." #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "--gtk-module módulo Carregar o módulo especificado na inicialização." #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "--name nomeprograma Define nome do programa para \"nomeprograma\". Se não especificado, nome do programa será definido para \"ParamStrUTF8(0)\"." #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "--gtk-no-debug flags Desativa mensagens Gtk+ específicas rastreamento/depuração." #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "--lcl-no-transient Não defina ordenação transiente para formulários modais" #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "--no-xshm Desativa uso da Extensão Compartilhada de Memória do X." #: lclstrconsts.rsgtkoptionsync #| msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediatey after the protocol request that generated the error has been processed by the X server." msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "--sync Chama XSynchronize (display, True) após ser estabelecida a conexão com Xserver. Isto torna fácil a depuração de erros de protocolo do X, porque as solicitações de armazenamento do X serão desativadas e erros do X serão recebidos imediatamente, após as solicitações de protocolo que geraram os erros, tenham sido processadas pelo servidor X." #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "%s: já registrado" #: lclstrconsts.rshelpcontextnotfound #, fuzzy #| msgid "Help Context not found" msgid "A help database was found for this topic, but this topic was not found" msgstr "Ajuda contextual não encontrada" #: lclstrconsts.rshelpdatabasenotfound #, fuzzy #| msgid "Help Database not found" msgid "There is no help database installed for this topic" msgstr "Banco de dados de ajuda não encontrado" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "Erro na ajuda" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "Ajuda contextual %s não encontrada." #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "Ajuda contextual %s não encontrada no banco de dados %s%s%s." #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "Banco de dados Ajuda %s%s%s não encontra visualizador para página de ajuda do tipo %s" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "Banco de dados de ajuda %s%s%s não encontrado" #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "Palavra-chave Ajuda %s%s%s não encontrada." #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "Palavra-chave Ajuda %s%s%s não encontrada no banco de dados %s%s%s." #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "Nó ajuda %s%s%s não tem banco de dados ajuda" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "Nenhuma ajuda encontrada para a linha %d, coluna %d de %s." #: lclstrconsts.rshelpnohelpnodesavailable #, fuzzy #| msgid "No help nodes available" msgid "No help entries available for this topic" msgstr "Nenhum nó de ajuda disponível" #: lclstrconsts.rshelpnotfound #, fuzzy #| msgid "Help not found" msgid "No help found for this topic" msgstr "Ajuda não encontrada" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "%s: não registrado" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "Erro no seletor de ajuda" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "Não ha visualizador para tipo ajuda %s%s%s" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "Erro no visualizador de ajuda" #: lclstrconsts.rshelpviewernotfound #, fuzzy #| msgid "Help Viewer not found" msgid "No viewer was found for this type of help content" msgstr "Visualizador de ajuda não encontrado" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "Realçar" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "Texto realçado" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "Luz Quente" #: lclstrconsts.rsicns #, fuzzy #| msgid "OSX Icon Resource" msgid "Mac OS X Icon" msgstr "Recurso de ícone OSX" #: lclstrconsts.rsicon msgid "Icon" msgstr "Ícone" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "Imagem ícone não pode estar vazia" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "Imagem ícone deve ter o mesmo formato" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "Impossível alterar formato da imagem do ícone" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "Imagem ícone deve ter o mesmo tamanho" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "Impossível alterar tamanho da imagem do ícone" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "Ícone não tem imagem atual" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "Borda Inativa" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "Rótulo Inativo" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "Rótulo Inativo" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "%s Índice %s fora dos limites 0 .. %d" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "Índice fora de faixa Célula[Col=%d Lin=%d]" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "Informações plano de fundo" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "Informações Texto" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "Inserir" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "Data Inválida : %s" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "Data Inválida: %s. Deve estar entre %s e %s" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "fluxo de objeto de Formulário inválido" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "Valor de propriedade inválido" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "Formato fluxo inválido" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "%s já está associado com %s" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "\"Joint Picture Expert Group\"" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "Último" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "Limão" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "Índice lista excede o limite (%d)" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "Lista deve estar vazia" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "Marrom" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "Abortar" #: lclstrconsts.rsmball msgid "&All" msgstr "&Todos" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "Cancelar" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "&Fechar" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "&Ajuda" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "&Ignorar" #: lclstrconsts.rsmbno msgid "&No" msgstr "&Não" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "Não para todos" #: lclstrconsts.rsmbok msgid "&OK" msgstr "&OK" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "&Abrir" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "&Tentar novamente" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "&Salvar" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "&Destravar" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "&Sim" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "Sim para &todos" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "Cinza Médio" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "Barra Menu" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "Menu" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "Realce Menu" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "Texto Menu" #: lclstrconsts.rsmodified msgid " modified " msgstr " modificado " #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "Verde dinheiro" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "Autenticação" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "Confirmação" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "Personalizado" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "Erro" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "Informação" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "Aviso" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "Azul marinho" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "Próximo" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "Nenhum" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "Não é um arquivo de grade válido" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "Nenhum objeto \"widgetset\". Favor verificar se a unidade \"interfaces\" foi adicionada à cláusula \"uses\" do programa." #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "Oliva" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "Selecionar uma data" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "\"Pixmap\"" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "\"BitMap\" portátil" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "\"GrayMap\" portátil" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "Gráfico Rede Portátil (PNG)" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "\"PixMap\" portátil" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "Postar" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok #| msgid "%s%sPress Ok to ignore and risk data corruption.%sPress Cancel to kill the program." msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "%s%sPressione Ok para ignorar e correr o risco de corrupção de dados.%sCancelar para finalizar o programa." #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "Anterior" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "Propriedade %s inexistente" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "Roxo" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "-dograb (apenas sob X11), executando sob um depurador pode causar um -nograb implícito, use -dograb para subrepor. Necessita QT_DEBUG." #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "parâmetro -graphicssystem, define a retaguarda para ser usada com \"widgest\" de tela e QPixmaps. Opções disponíveis são: \"native\",\"raster\" e \"opengl\". OpenGL ainda está instável." #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "-nograb, diz ao QT para nunca capturar o mouse ou teclado. Necessário QT_DEBUG." #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "-reverse, define a direção do \"layout\" da aplicação para Qt::RightToLeft (Direita para esquerda)." #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "-session sessão, restaura a aplicação de uma sessão anterior." #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "-style estilo ou -style=estilo, define o estilo do GUI da aplicação. Valores possíveis são \"motif\", \"windows\" e \"platinum\". Se você compilou o QT com estilos adicionais ou tem \"plugins\" de estilo adicionais, estes estarão disponíveis para a opção em linha do comando -style. NOTA: Nem todos os estilos estão disponíveis em todas plataformas. Se o parâmetro estilo não existir, QT iniciará a aplicação com um estilo comum padrão (\"windows\")." #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "-stylesheet folha-de-estilo ou -stylesheet=folha-de-estilo, define a Folha de Estilo da aplicação. O valor deve ser um caminho para o arquivo que contenha a folha de estilo. Nota: URLs relativas no arquivo de folha de estilo, são relativas para o caminho do arquivo de folha de estilo." #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "-sync (apenas sob X11), alterna para o modo síncrono para depuração." #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "-widgetcount, imprime mensagem de depuração no final sobre o número de \"widgets\" que sobraram sem ser destruídos e o número máximo de \"widgets\" co-existentes ao mesmo tempo." #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "-bg ou -background color, define a cor de fundo padrão e a paleta da aplicação (sombreamento claro e escuro são calculados)." #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "-btn ou -button color, define a cor padrão de botões." #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "-cmap, provoca a instalação de um mapa de cores reservado em uma tela de 8-bits." #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "-display tela, define a tela do X (padrão é $DISPLAY)." #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "-fg ou -foreground color, define a cor padrão do primeiro plano." #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "-fn ou -font fonte, define a fonte da aplicação. A fonte deve ser informada usando uma descrição lógica de fonte X." #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "-geometry geometria, define a geometria do cliente da primeira janela a ser mostrada." #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "-im, define o servidor de métodos de entrada (equivale a configurar a variável de ambiente XMODIFIERS)." #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "-inputstyle, define como as entradas são inseridas em um dado \"widget\", ex. \"onTheSpot\" faz a entrada aparecer diretamente no \"widget\", ao passo que \"overTheSpot\" faz a entrada aparecer em uma caixa flutuante sobre o \"widget\" e não é inserido até o término da edição." #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "-name nome, define o nome da aplicação." #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "-ncols contador, limita o número de cores alocadas no cubo de cores de uma tela 8-bits, se a aplicação estiver usando a especificação QApplication::ManyColor. Se o contador for 216 então um cubo de cor de 6x6x6 é usado (ou seja 6 níveis de vermelho, 6 de verde e 6 de azul); para outros valores, um cubo aproximadamente de 2x3x1 será usado." #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "-title título, define o título da aplicação." #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "-visual TrueColor, força a aplicação a usar um visual TrueColor em uma tela de 8-bits." #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "\"Endupdate\" sem nenhuma atualização em andamento" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "Impossível salvar imagem durante atualização" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "Impossível iniciar \"atualizar tudo\" durante atualização \"somente canvas\"" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "Vermelho" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "Atualizar" #: lclstrconsts.rsreplace msgid "Replace" msgstr "Substituir" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "Substituir todos" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "Recurso %s não encontrado" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "Barra de rolagem" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "Propriedade da Barra de rolagem fora de faixa" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "Selecionar cor" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "Selecionar uma fonte" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "Prata" #: lclstrconsts.rssize msgid " size " msgstr " tamanho " #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "Azul Celeste" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "Verde Musgo" #: lclstrconsts.rstext msgid "Text" msgstr "Texto" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "Formato Arquivo Imagem \"Tagged\"" #: lclstrconsts.rstpanelaccessibilitydescription msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "Impossível carregar fonte padrão" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "Erro desconhecido, favor relatar esta falha" #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "Extensão da imagem desconhecida" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "Formato imagem desconhecido" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "Formato \"bitmap\" não suportado." #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "Formato aréa de transferência não suportado: %s" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr " AVISO: Há %d \"DCs\" não liberados, segue um despejo detalhado:" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr " AVISO: Há %d \"GDIObjects\" não liberados, segue um despejo detalhado:" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr " AVISO: Há %d mensagens restantes na fila! Liberando." #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr " AVISO: Há %d estruturas \"TimerInfo\" restantes. Liberando" #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr " AVISO: Há %d, vínculos de mensagem \"LM_PAINT/LM_GtkPAINT\" não removidos, restantes." #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "Branco" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "Somente palavras inteiras" #: lclstrconsts.rswin32error msgid "Error:" msgstr "Erro:" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "Aviso:" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "Janela" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "Quadro Janela" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "Texto Janela" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "Amarelo" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "Impossível focar uma janela inativa ou invisível" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "Duplicar menus" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "Criação de ação inválida" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "Enumeração de ação inválida" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "Registro de ação inválida" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "Desregistro de ação inválida" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "O conjunto de caracteres na máscara \"%s\" não é válido!" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "Tamanho de imagem inválido" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "Índice \"ImageList\" inválido" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "Índice Menu fora de faixa" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "\"MenuItem\" é nulo (nil)" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "Submenu não está no menu" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "Alt+" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "BkSp" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "Ctrl+" #: lclstrconsts.smkcdel msgid "Del" msgstr "Del" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "Abaixo" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "End" #: lclstrconsts.smkcenter msgid "Enter" msgstr "Enter" #: lclstrconsts.smkcesc msgid "Esc" msgstr "Esc" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "Home" #: lclstrconsts.smkcins msgid "Ins" msgstr "Ins" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "Esquerda" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "Meta+" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "PgDn" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "PgUp" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "Direita" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "Shift+" #: lclstrconsts.smkcspace msgid "Space" msgstr "Espaço" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "Tabulação" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "Acima" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "Nenhum formulário MDI presente." #: lclstrconsts.snotimers msgid "No timers available" msgstr "Nenhum temporizador disponível" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "Tipo sílaba incorreta: %s esperado" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "Número de ponto flutuante inválido: %s" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "Número inteiro inválido: %s" #: lclstrconsts.sparlocinfo #, fuzzy #| msgid " (at %d,%d, stream offset %.8x)" msgid " (at %d,%d, stream offset %d)" msgstr "(em %s,%s, deslocamento fluxo %.8x)" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "Valor \"byte\" em aberto" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "Sequência de caracteres em aberto" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "Símbolo sílaba incorreto: %s esperado mas %s encontrado" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "Tipo sílaba incorreto: %s esperado mas %s encontrado" doublecmd-0.5.8/language/lcl/lclstrconsts.de.po0000644000175000017500000012170012250635657020543 0ustar alexxalexxmsgid "" msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Project-Id-Version: \n" "POT-Creation-Date: \n" "PO-Revision-Date: 2010-08-25 23:51+0100\n" "Last-Translator: Swen Heinig \n" "Language-Team: Deutsch \n" "MIME-Version: 1.0\n" "X-Poedit-Language: German\n" "X-Poedit-Country: GERMANY\n" "X-Poedit-SourceCharset: utf-8\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "Browser %s%s%s nicht ausführbar." #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "Browser %s%s%s nicht gefunden." #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "Fehler beim Ausführen von %s%s%s:%s%s" #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "Kann den HTML-Browser nicht finden." #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "Die Hilfedatenbank %s%s%s konnte die Datei %s%s%s nicht finden." #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "Das Makro %s in BrowserParams wird durch den URL ersetzt." #: lclstrconsts.ifsalt msgid "Alt" msgstr "Alt" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "Strg" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "Übernehmen" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "Programmtaste" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "Rückschritt" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "Abbrechen" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "Großbuchstabe" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "Löschen" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "Steuerelement" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "Konvertiert" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "Löschen" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "Hinunter" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "Ende" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "Escape" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "Ausführen" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "Schluß" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "Hanja" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "Hilfe" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "Pos1" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "Einfügen" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "Junja" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "Kana" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "Linke Maustaste" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "Links" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "Linke Windows-Taste" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "Mittlere Maustaste" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "Menü" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "Modusänderung" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "Weiter" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "Nichtkonvertiert" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "NumLock" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "Zahlenblock %s" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "Pause-Taste" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "Druck" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "Zurück" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "Rechte Maustaste" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "Eingabe" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "Rechts" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "Rechte Windows-Taste" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "Rollen" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "Auswählen" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "Umsch" #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "Auszug" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "Leertaste" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "Tabulator" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "Unbekannt" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "Hoch" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "Kann %s nicht ausführen" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "Ressource %s nicht gefunden" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "Programmdatei nicht gefunden %s" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "Dunkl. 3D-Schatten" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "3D-Licht" #: lclstrconsts.rsacontrolcannothaveitselfasparent #, fuzzy #| msgid "A control can't have itself as parent" msgid "A control can't have itself as a parent" msgstr "Ein Control kann nicht sein eigener Vorfahr sein" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "Aktiver Rand" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "Aktive Titelleiste" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "Alle Dateien (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "Arbeitsbereich" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "Aquamarin" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "Desktop" #: lclstrconsts.rsbackward msgid "Backward" msgstr "Rückwärts" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "Bitmaps" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "Schwarz" #: lclstrconsts.rsblank msgid "Blank" msgstr "Leer" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "Blau" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "Schalterfläche" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "Schalter-Hervorheb." #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "Schalter-Schatten" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "Schalter-Text" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "Rechner" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "Abbrechen" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "Kann nicht fokussieren" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "Canvas erlaubt kein Zeichnen" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "Titelleistentext" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "Schreibweisenabhängig" #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "Cremefarbig" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "Erzeuge GDB-fangbaren Fehler:" #: lclstrconsts.rscursor msgid "Cursor" msgstr "Zeiger" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "Eigene ..." #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "Voreingestellt" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "Genehmigung User GruppeGröße DatumZeit" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "Datensatz löschen?" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "Löschen" #: lclstrconsts.rsdirection msgid "Direction" msgstr "Richtung" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "&Verzeichnis" #: lclstrconsts.rsdocking msgid "Docking" msgstr "Andocken" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "Doppeltes Icon-Format" #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "Bearbeiten" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "Gesamte Datei durchsuchen" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "Fehler" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "Fehler beim Erzeugen des Gerätekontexts für %s.%s" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "FEHLER in der LCL:" #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "Fehler aufgetreten in %s bei %sAdresse %s%s Frame %s" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "Fehler beim Lesen %s%s%s: %s" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "Fehler beim Speichern der Bitmap." #: lclstrconsts.rsexception msgid "Exception" msgstr "Exception" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "Verzeichnis muß vorhanden sein" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "Das Verzeichnis \"%s\" ist nicht vorhanden." #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "Die Datei \"%s\" ist bereits vorhanden. Überschreiben?" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "Datei muß vorhanden sein" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "Die Datei \"%s\" ist nicht vorhanden." #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "Die Datei \"%s\" ist schreibgeschützt." #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "Datei ist nicht beschreibbar" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "Datei sichern als" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "Vorhandene Datei öffnen" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "Datei überschreiben?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "Pfad muß angelegt sein" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "Der Pfad \"%s\" ist nicht vorhanden." #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "Verzeichnis auswählen" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(Datei nicht gefunden: \"%s\")" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "Dateiinformation" #: lclstrconsts.rsfind msgid "Find" msgstr "Suchen" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "Weitersuchen" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "Erster" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "FixedCols kann nicht größer/gleich ColCount sein" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "FixedRows kann nicht größer/gleich RowCount sein" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "Form" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "Form-Streaming \"%s\" Fehler: %s" #: lclstrconsts.rsforward msgid "Forward" msgstr "Vorwärts" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "Purpur" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "--gdk-debug flags Besondere GDK-Trace/Debug-Meldungen anschalten." #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "--gdk-no-debug flags Besondere GDK-Trace/Debug-Meldungen abschalten." #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "--g-fatal-warnings Von Gtk+/GDK generierte Warnungen und Fehler halten das Programm an." #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "Gradient der aktiven Titelleiste" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "Gradient der inaktiven Titelleiste" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "Grafik" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "Grau" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "Ausgegrauter Text" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "Grün" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "Grid-Datei fehlt" #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "Gitterindex außerhalb des Bereichs." #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "GroupIndex darf nicht kleiner als der GroupIndex eines vorherigen Menüeintrags sein" #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "Filter:" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "Verlauf:" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "--class classname Den Xt-Konventionen folgend, entspricht der Klassenname dem Programmnamen mit dem ersten Buchstaben in Großschreibung. Beispielsweise ist der Klassenname von gimp \"Gimp\". Wenn --class angegeben ist, wird die Klasse des Programme auf \"classname\" gesetzt." #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "--gtk-debug flags Anschalten spezifischer Trace-/Debug-Meldungen des Gtk+." #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "--display h:s:d Anbinden an den angegebenen X-Server wobei \"h\" für den Hostnamen steht, \"s\" die Nummer des Server ist (normalerweise 0) und \"d\" die Nummer des Displays (typischerweise weggelassen). Ist --display nicht angegeben, gilt der Wert der Umgebungsvariable DISPLAY." #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "--gtk-module module Das abgegebene Modul beim Starten laden." #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "--name programe Setzen des Programmnamens auf \"progname\". Ist nichts angegeben, wird der Name auf ParamStrUTF8(0) gesetzt." #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "--gtk-no-debug flags Besondere Gtk+-Trace-/Debug-Meldungen abschalten." #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "--lcl-no-transient Transiente Reihenfolge für modale Formulare nicht setzen." #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "--no-xshm Abschalten der Verwendung der Shared-Memory-Erweiterung von X" #: lclstrconsts.rsgtkoptionsync #, fuzzy #| msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediatey after the protocol request that generated the error has been processed by the X server." msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "--sync Aufruf von XSynchronize (Display, True) nachdem die XServer-Verbindung zustandegekommen ist. Dies erleichtert das Debugging des X-Protokolls, weil die X-Anfragepufferung abgeschaltet ist und X-Fehler sofort ankommen, nachdem die Anfrage, die den Fehler erzeugt hat, beim X-Server angekommen ist." #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "%s: Bereits registriert" #: lclstrconsts.rshelpcontextnotfound #, fuzzy #| msgid "Help Context not found" msgid "A help database was found for this topic, but this topic was not found" msgstr "Hilfekontext nicht gefunden" #: lclstrconsts.rshelpdatabasenotfound #, fuzzy #| msgid "Help Database not found" msgid "There is no help database installed for this topic" msgstr "Hilfedatenbank nicht gefunden" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "Hilfefehler" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "Hilfekontext %s nicht gefunden." #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "Hilfekontext %s nicht in der Datenbank %s%s%s gefunden." #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "Die Hilfedatenbank %s%s%s fand keinen Betrachter für eine Hilfeseite des Typs %s" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "Hilfedatenbank %s%s%s nicht gefunden" #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "Hilfeschlüsselwort %s%s%s nciht gefunden." #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "Hilfeschlüsselwort %s nicht in der Datenbank %s%s%s gefunden." #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "Hilfeknoten %s%s%s besitzt keine Hilfedatenbank" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "Keine Hilfe für Zeile %d, Spalte %d von %s gefunden." #: lclstrconsts.rshelpnohelpnodesavailable #, fuzzy #| msgid "No help nodes available" msgid "No help entries available for this topic" msgstr "Keine Hilfeknoten verfügbar" #: lclstrconsts.rshelpnotfound #, fuzzy #| msgid "Help not found" msgid "No help found for this topic" msgstr "Hilfe nicht gefunden" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "%s: Nicht registriert" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "Hilfeauswahlfehler" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "Es gibt keinen Viewer für den Hilfetyp %s%s%s" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "Hilfebetrachterfehler" #: lclstrconsts.rshelpviewernotfound #, fuzzy #| msgid "Help Viewer not found" msgid "No viewer was found for this type of help content" msgstr "Hilfebetrachter nicht gefunden" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "Hervorhebung" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "Hervorgehob. Text" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "Kräftig hervorgehoben" #: lclstrconsts.rsicns #, fuzzy #| msgid "OSX Icon Resource" msgid "Mac OS X Icon" msgstr "OSX-Icon-Ressource" #: lclstrconsts.rsicon msgid "Icon" msgstr "Symbol" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "Icon-Bild darf nicht leer sein" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "Icon-Bild muß das gleiche Format haben" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "Kann Format des Icon-Bilds nicht ändern" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "Icon-Bild muß die gleiche Größe haben" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "Kann Größe des Icon-Bilds nicht ädnern" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "Icon besitzt kein gültiges Bild" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "Inaktiver Rand" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "Inaktive Titelleiste" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "Inaktive Titelleiste" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "%s Index %s außerhalb des Bereichs 0 .. %d" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "Index außerhalb des Bereichs Zelle[Spalte=%s Reihe=%d]" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "Info-Hintergrund" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "Infotext" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "Einfg" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "Ungültiges Datum: %s" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "Ungültiges Datum: %s. Es muß zwischen %s und %s sein" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "ungültiger Formularobjekt-Stream" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "Ungültiger Eigenschaftenwert" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "Ungültiges Streamformat" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "%s ist bereits mit %s verbunden" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "Jpint Picture Expert Group" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "Letzter" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "Hellgrün" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "Listenindex überschreitet Grenzen (%d)" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "Zeile muß leer sein" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "Kastanienbraun" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "Abbruch" #: lclstrconsts.rsmball msgid "&All" msgstr "&Alle" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "Abbrechen" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "&Schließen" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "&Hilfe" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "&Übergehen" #: lclstrconsts.rsmbno msgid "&No" msgstr "&Nein" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "Immer Nein" #: lclstrconsts.rsmbok msgid "&OK" msgstr "&Ok" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "&Öffnen" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "&Wiederholen" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "&Speichern" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "&Freigeben" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "&Ja" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "&Alles bestätigen" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "Mittelgrau" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "Menübalken" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "Menü" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "Menühervorhebung" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "Menütext" #: lclstrconsts.rsmodified msgid " modified " msgstr " geändert " #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "\"Geldgrün\"" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "Authentifikation" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "Bestätigung" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "Spezial" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "Fehler" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "Information" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "Warnung" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "Marineblau" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "Nächster" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "Keine" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "Keine gültige Grid-Datei" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "Kein Widgetset-Objekt. Bitte überprüfen Sie, ob die Unit \"Interfaces\" in der Uses-Anweisung des Programms enthalten ist." #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "Oliv" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "Datum auswählen" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "Pixmap" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "Portable Bitmap" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "Portable Graymap" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "PNG-Grafik" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "Portable Pixmap" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "Übertragen" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok #| msgid "%s%sPress Ok to ignore and risk data corruption.%sPress Cancel to kill the program." msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "%s%sOk übergeht und riskiert Dateninkonsistenz.%sMit Abbrechen wird das Programm abgebrochen." #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "Vorher" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "Eigenschaft %s fehlt" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "Purpur" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "" #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "" #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "" #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "" #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "" #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "" #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "" #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "" #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "" #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "" #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "" #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "" #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "" #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "" #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "" #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "" #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "" #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "" #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "" #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "" #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "Endupdate wenn kein Update läuft" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "Kann Bild während des Updates nicht sichern" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "Kann nicht mit dem kompletten Aktualisieren beginnen wenn ein Canvas-Update durchgeführt wird" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "Rot" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "Auffrischen" #: lclstrconsts.rsreplace msgid "Replace" msgstr "Ersetzen" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "Alle ersetzen" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "Ressource %s nicht gefunden" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "Scrollbalken" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "Scrollbar-Eigenschaft außerhalb des Bereichs" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "Farbe auswählen" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "Schriftart auswählen" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "Silber" #: lclstrconsts.rssize msgid " size " msgstr " Größe " #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "Himmelblau" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "Türkiss" #: lclstrconsts.rstext msgid "Text" msgstr "Text" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "" #: lclstrconsts.rstpanelaccessibilitydescription msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "Kann Default-Schriftart nicht laden" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "Unbekannter Fehler, bitte melden Sie diesen Bug." #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "Unbekannte Bilddateiendung" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "Unbekanntes Bildformat" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "Nicht unterstütztes Bitmap-Format" #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "Nicht unterstütztes Clipboard-Format: %s" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr "WARNUNG: Es gibt %d nicht freigegebene DCs. Es folgt ein detaillierter Dump:" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr "WARNUNG: Es gibt %d nicht freigegebene GDI-Objekte. Es folgt ein detaillierter Dump:" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr "WARNUNG: Es sind %d Meldungen in der Queue übrig. Sie werden freigegeben" #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr "WARNUNG: Es sind %d Timerinfo-Strukturen übrig, sie werden freigegeben" #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr "WARNUNG: Es sind %s nicht entfernte LM_PAINT/LM_GtkPAINT-Meldungs-Links übrig." #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "Weiß" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "Nur ganze Worte" #: lclstrconsts.rswin32error msgid "Error:" msgstr "Fehler:" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "Warnung:" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "Fenster" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "Fensterrahmen" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "Fenstertext" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "Gelb" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "Kann abgeschaltetes oder unsichtbares Fenster nicht fokussieren" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "Doppelte Menüs" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "Ungültige Action-Erzeugung" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "Ungültige Action-Numerierung" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "Ungültige Action-Registrierung" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "Ungültige Action-Registierungsaufhebung" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "Der Zeichensatz in der Maske \"%s\" ist ungültig!" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "Ungültige Bildgröße" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "Ungültiger Bildlistenindex" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "Menüindex außerhalb des Bereichs" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "Menüeintrag ist NIL" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "Untermenü ist nicht im Menü" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "Alt+" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "Strg+" #: lclstrconsts.smkcdel msgid "Del" msgstr "Entf" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "Hinunter" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "Ende" #: lclstrconsts.smkcenter msgid "Enter" msgstr "Enter" #: lclstrconsts.smkcesc msgid "Esc" msgstr "Esc" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "Pos1" #: lclstrconsts.smkcins msgid "Ins" msgstr "Einfg" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "Links" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "Rechts" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "" #: lclstrconsts.smkcspace msgid "Space" msgstr "" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "Tabulator" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "Hoch" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "Kein MDI-Formular vorhanden" #: lclstrconsts.snotimers msgid "No timers available" msgstr "Keine Timer verfügbar" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "Falscher Token-Typ: %s erwartet" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "Ungültige Gleitkommazahl: %s" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "Ungültiger Integerzahl: %s" #: lclstrconsts.sparlocinfo #, fuzzy #| msgid " (at %d,%d, stream offset %.8x)" msgid " (at %d,%d, stream offset %d)" msgstr " (bei %d,%d, Stream-Offset %.8x)" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "Nicht abgeschlossener Byte-Wert" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "Nicht abgeschlossene Zeichenkette " #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "Falscher Token: %s erwartet, %s gefunden" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "Falscher Token-Typ: %s erwartet, %s gefunden" doublecmd-0.5.8/language/lcl/lclstrconsts.po0000644000175000017500000010041712250635657020156 0ustar alexxalexxmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "" #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "" #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "" #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "" #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "" #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "" #: lclstrconsts.ifsalt msgid "Alt" msgstr "" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "" #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "" #: lclstrconsts.rsacontrolcannothaveitselfasparent msgid "A control can't have itself as a parent" msgstr "" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "" #: lclstrconsts.rsbackward msgid "Backward" msgstr "" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "" #: lclstrconsts.rsblank msgid "Blank" msgstr "" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "" #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "" #: lclstrconsts.rscursor msgid "Cursor" msgstr "" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "" #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "" #: lclstrconsts.rsdirection msgid "Direction" msgstr "" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "" #: lclstrconsts.rsdocking msgid "Docking" msgstr "" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "" #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "" #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "" #: lclstrconsts.rsexception msgid "Exception" msgstr "" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "" #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "" #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "" #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "" #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "" #: lclstrconsts.rsfind msgid "Find" msgstr "" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "" #: lclstrconsts.rsforward msgid "Forward" msgstr "" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "" #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "" #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "" #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "" #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "" #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "" #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "" #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "" #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "" #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "" #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "" #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "" #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "" #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "" #: lclstrconsts.rsgtkoptionsync msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "" #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "" #: lclstrconsts.rshelpcontextnotfound msgid "A help database was found for this topic, but this topic was not found" msgstr "" #: lclstrconsts.rshelpdatabasenotfound msgid "There is no help database installed for this topic" msgstr "" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "" #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "" #: lclstrconsts.rshelpnohelpnodesavailable msgid "No help entries available for this topic" msgstr "" #: lclstrconsts.rshelpnotfound msgid "No help found for this topic" msgstr "" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "" #: lclstrconsts.rshelpviewernotfound msgid "No viewer was found for this type of help content" msgstr "" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "" #: lclstrconsts.rsicns msgid "Mac OS X Icon" msgstr "" #: lclstrconsts.rsicon msgid "Icon" msgstr "" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "" #: lclstrconsts.rsmball msgid "&All" msgstr "" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "" #: lclstrconsts.rsmbno msgid "&No" msgstr "" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "" #: lclstrconsts.rsmbok msgid "&OK" msgstr "" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "" #: lclstrconsts.rsmodified msgid " modified " msgstr "" #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "" #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "" #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "" #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "" #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "" #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "" #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "" #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "" #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "" #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "" #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "" #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "" #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "" #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "" #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "" #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "" #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "" #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "" #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "" #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "" #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "" #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "" #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "" #: lclstrconsts.rsreplace msgid "Replace" msgstr "" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "" #: lclstrconsts.rssize msgid " size " msgstr "" #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "" #: lclstrconsts.rstext msgid "Text" msgstr "" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "" #: lclstrconsts.rstpanelaccessibilitydescription msgctxt "lclstrconsts.rstpanelaccessibilitydescription" msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgctxt "lclstrconsts.rstsplitteraccessibilitydescription" msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgctxt "lclstrconsts.rsttreeviewaccessibilitydescription" msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "" #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "" #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr "" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr "" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr "" #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr "" #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr "" #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "" #: lclstrconsts.rswin32error msgid "Error:" msgstr "" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "" #: lclstrconsts.smkcdel msgid "Del" msgstr "" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "" #: lclstrconsts.smkcenter msgid "Enter" msgstr "" #: lclstrconsts.smkcesc msgid "Esc" msgstr "" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "" #: lclstrconsts.smkcins msgid "Ins" msgstr "" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "" #: lclstrconsts.smkcspace msgid "Space" msgstr "" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "" #: lclstrconsts.snotimers msgid "No timers available" msgstr "" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "" #: lclstrconsts.sparlocinfo msgid " (at %d,%d, stream offset %d)" msgstr "" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "" doublecmd-0.5.8/language/lcl/lclstrconsts.es.po0000644000175000017500000012205112250635657020562 0ustar alexxalexxmsgid "" msgstr "" "Last-Translator: Lucas Martín \n" "PO-Revision-Date: 2010-05-03 20:19+0100\n" "Language-Team: \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Project-Id-Version: lcl\n" "POT-Creation-Date: \n" "MIME-Version: 1.0\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "Navegador %s%s%s no ejecutable." #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "Navegador %s%s%s no encontrado." #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "Error al ejecutar %s%s%s:%s%s" #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "No puedo encontrar un visor HTML" #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "La base de datos de ayuda %s%s%s no pudo encontrar el archivo %s%s%s." #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "La macro %s en BrowserParams será reemplazada por la URL." #: lclstrconsts.ifsalt msgid "Alt" msgstr "Alt" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "Ctrl" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "Aceptar" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "clave de la aplicación" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "Retroceso" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "Cancelar" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "Mayúscula" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "Limpiar" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "Control" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "Convertir" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "Borrar" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "Abajo" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "Fin" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "Escape" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "Ejecutar" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "Final" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "Hanja" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "Ayuda" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "Inicio" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "Insertar" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "Junja" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "Kana" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "Botón Izquierdo del Ratón" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "Izquierdo" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "Tecla izquierda de las ventanas" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "Botón del Medio del Ratón" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "Menú" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "Modo Cambio" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "Siguiente" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "Sin convertir" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "BloqNum" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "TeclaNum %d" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "Tecla Pausa" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "Imprimir" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "Anterior" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "Botón Derecho del Ratón" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "Enter" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "Derecha" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "tecla derecha de las ventanas" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "Desplazar" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "Seleccionar" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "Shift" #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "Capturar pantalla" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "Tecla espaciadora" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "Tabulador" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "Desconocido" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "Arriba" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "Recurso %s no encontrado" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "3D sombra oscura" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "3D Luz" #: lclstrconsts.rsacontrolcannothaveitselfasparent #, fuzzy #| msgid "A control can't have itself as parent" msgid "A control can't have itself as a parent" msgstr "Un control no puede tenerse a si mismo como pariente" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "Borde Activo" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "Título activo" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "Todos los archivos (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "Espacio de trabajo de la Aplicación" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "Agua" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "Escritorio" #: lclstrconsts.rsbackward msgid "Backward" msgstr "Retrasado" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "Bitmaps" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "Negro" #: lclstrconsts.rsblank msgid "Blank" msgstr "Vacío" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "Azul" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "Cara de Boton" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "Botón Resaltado" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "Sombra boton" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "Texto boton" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "Calculadora" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "Cancelar" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "No se puede establecer el foco" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "El lienzo no permite dibujar" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "Texto de título" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "Sensible a MAY/min" #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "Crema" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "Creando un error capturable por gdb" #: lclstrconsts.rscursor msgid "Cursor" msgstr "Cursor" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "Personalizado ..." #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "Predeterminado" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "permisos usuario grupo tamaño fecha hora" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "¿Borrar registro?" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "Suprimir" #: lclstrconsts.rsdirection msgid "Direction" msgstr "Dirección" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "&Directorio" #: lclstrconsts.rsdocking msgid "Docking" msgstr "Anclado" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "Duplicar formato de icono." #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "Editar" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "Buscar en todo el archivo" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "Error" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "Error creando contexto de dispositivo para %s.%s" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "ERROR en LCL" #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "Ocurrió un error en %s en %s Dirección %s%s Marco %s" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "Error leyendo %s%s%s: %s" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "Error al salvar el bitmap." #: lclstrconsts.rsexception msgid "Exception" msgstr "Excepción" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "Directorio debe de existir" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "El directorio \"%s\" no existe." #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "El archivo \"%s\" ya existe. Sobreescribirlo ?" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "El archivo debe existir" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "No existe el archivo \"%s\"" #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "No se puede escribir en el archivo \"%s\"" #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "El archivo no se puede escribir" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "Guardar archivo como" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "Abrir un archivo existente" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "¿Sobreescribir archivo?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "La ruta debe existir" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "No existe la ruta \"%s\"" #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "Escoja Directorio" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(archivo no encontrado: \"%s\")" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "Información de archivo" #: lclstrconsts.rsfind msgid "Find" msgstr "Buscar" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "Buscar más" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "Primero" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "FixedCols no puede ser >= ColCount" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "FixedRows no puede ser >= RowCount" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "Formulario" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "Flujo de Formulario \"%s\" error: %s" #: lclstrconsts.rsforward msgid "Forward" msgstr "Adelante" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "Fucsia" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "--gdk-debug-flags Activa los mensajes de traza/depurado específicos de GDK" #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "--gdk-no-debug-flags Desactiva los mensajes de traza/depurado específicos de GDK" #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "--g-fatal-warnings Alertas y errores generados por Gtk+/GDK con interrupción de la aplicación" #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "Degradado título activo" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "Gradiente título inactivo" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "Gris" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "Texto Gris" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "Verde" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "No existe el archivo de rejilla" #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "Índice de rejilla fuera de rango." #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "GroupIndex no puede ser menor que un elemento de menú de GroupIndex" #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "Filtro:" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "Historial:" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "--class nombre de clase Siguiendo las convenciones Xt, la clase de un programa es el nombre del programa con el caracter inicial en mayúsculas. Por ejemplo, el nombre de clase para gimp es \"Gimp\". Si se especifica --class, la clase del programá se establecerá a \"nombre de clase\"." #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "--gtk-debug-flags Activa los mensajes de traza/depurado específicos de Gtk+" #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "--display h:s:d Conecta al servidor X especificado, donde \"h\" es el nombre del host, \"s\" el número de servidor (normalmente 0), y \"d\" el número de display (normalmente omitido). Si no se especifica --display, se usará el variable de entorno DISPLAY" #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "--gtk-module modulo Carga el módulo especificado en al inicio." #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "-name progname Pon el nombre del programa en \"progname\". Si no se especifica el nombre del programa se establecerá en ParamStrUTF8 (0)." #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "--gtk-no-debug-flags Desactiva los mensajes de traza/depurado específicos de Gtk+" #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "--lcl-no-transient No establecer el orden transitorio para los formularios modal." #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "--no-xshm Desactivar el uso de Extensión de Memoria Extendida de X" #: lclstrconsts.rsgtkoptionsync #, fuzzy #| msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediatey after the protocol request that generated the error has been processed by the X server." msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "--sync Llama a XSynchronize (display, True) después que se haya establecido la conexión el servidor X. Esto hace más fácil depurar los errores de protocolo de X, porque se desactivará la solicitud de buffer y los errores de X serán recibidos inmediatamente después que el protocolo solicite ese error generado que ha sido procesado por el servidor X" #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "%s: Ya está registrado" #: lclstrconsts.rshelpcontextnotfound #, fuzzy #| msgid "Help Context not found" msgid "A help database was found for this topic, but this topic was not found" msgstr "Contexto de ayuda no encontrado" #: lclstrconsts.rshelpdatabasenotfound #, fuzzy #| msgid "Help Database not found" msgid "There is no help database installed for this topic" msgstr "Base de datos de ayuda no encontrada" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "Error de la ayuda" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "Contexto de ayuda %s no encontrado." #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "Contexto de ayuda %s no encontrado en la base de datos %s%s%s." #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "La base de datos de ayuda %s%s%s no encontró un visor para el tipo de página de ayuda %s" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "Base de datos de ayuda %s%s%s no encotrada" #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "Clave de ayuda %s%s%s no encontrada" #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "Clave de ayuda %s%s%s no encontrada en la base de datos %s%s%s." #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "El nodo de ayuda %s%s%s no tiene base de datos de ayuda" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "No se ha encontrado ayuda para la línea %d, columna %d de %s." #: lclstrconsts.rshelpnohelpnodesavailable #, fuzzy #| msgid "No help nodes available" msgid "No help entries available for this topic" msgstr "No hay nodos de ayuda disponibles" #: lclstrconsts.rshelpnotfound #, fuzzy #| msgid "Help not found" msgid "No help found for this topic" msgstr "Ayuda no encontrada" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "%s: No registrado" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "Error del selector de ayuda" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "No hay visor de ayuda para el tipo de ayuda %s%s%s" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "Error en el visor de ayuda" #: lclstrconsts.rshelpviewernotfound #, fuzzy #| msgid "Help Viewer not found" msgid "No viewer was found for this type of help content" msgstr "Visor de ayuda no encontrado" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "Resaltar" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "Resaltar texto" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "Luz caliente" #: lclstrconsts.rsicns #, fuzzy #| msgid "OSX Icon Resource" msgid "Mac OS X Icon" msgstr "OSX recurso de icono" #: lclstrconsts.rsicon msgid "Icon" msgstr "Icono" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "La imagen del Icono no puede estar vacia" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "La imagen del Icono debe tener el mismo formato" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "No se puede cambiar el formato del icono" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "La imagen del Icono debe tener el mismo tamaño" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "No se puede cambiar el tamaño del icono" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "El Icono no tiene imagen actual" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "Borde Inactivo" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "Título inactivo" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "Título inactivo" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "%s Índice %d fuera de límites 0 .. %d" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "Índice fuera de rango Celda[Col=%s Línea=%d]" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "información de fondo" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "Texto informativo" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "Insertar" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "Fecha Inválida : %s" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "Fecha Inválida: %s. Debe estar entre %s y %s" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "Flujo de objeto formulario inválido" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "Valor de propiedad inválido" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "Formato de flujo inválido" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "%s ya está asociado con %s" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "Joint Picture Expert Group" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "Ultimo" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "Lima" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "El índice de lista excede los límites (%d)" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "La lista debe estar vacía" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "Marron" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "Abortar" #: lclstrconsts.rsmball msgid "&All" msgstr "Todo" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "Cancelar" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "&Cerrar" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "Ayuda" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "&Ignorar" #: lclstrconsts.rsmbno msgid "&No" msgstr "&No" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "No a todo" #: lclstrconsts.rsmbok msgid "&OK" msgstr "Aceptar" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "Abrir" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "&Reintentar" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "Guardar" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "Desbloquear" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "&Si" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "Sí &a todo" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "Gris medio" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "Barra de Menu" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "Menú" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "Menú Resaltado" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "Texto de Menu" #: lclstrconsts.rsmodified msgid " modified " msgstr " modificado " #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "Dinero Verde" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "Autenticación" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "Confirmación" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "Personalizado" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "Error" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "Información" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "Advertencia" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "Azul Marino" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "Siguiente" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "Ninguno" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "No es un archivo de rejilla válido" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "No existe un objeto widgetset. Por favor, compruebe que la unidad \"interfaces\" ha sido añadida a la cláusula uses del programa" #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "Oliva" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "Escoja una fecha" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "Pixmap" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "Portable BitMap" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "Portable GrayMap" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "Portable Network Graphic" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "Portable PixMap" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "Enviar" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok #, fuzzy #| msgid "%s%sPress Ok to ignore and risk data corruption.%sPress Cancel to kill the program." msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "%s%sPulse Aceptar para ignorar y correr el riesgo de corromper datos.%sPulse cancelar para terminar el programa." #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "Prioridad" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "La propiedad %s no existe" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "Purpura" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "" #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "" #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "" #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "" #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "" #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "" #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "" #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "" #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "" #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "" #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "" #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "" #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "" #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "" #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "" #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "" #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "" #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "" #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "" #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "" #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "Fin actualización mientras ninguna actualización en curso" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "No se puede guardar la imagen mientras la actualizacion esta en progreso" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "No puede comenzar la actualización todo cuando la lona sólo pone al día en curso" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "Rojo" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "Refrescar" #: lclstrconsts.rsreplace msgid "Replace" msgstr "Reemplazar" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "Reemplazar todo" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "Recurso %s no encontrado" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "Barra de Desplazamiento" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "Propiedad ScrollBar fuera de rango" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "Escoja color" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "Escoja una fuente" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "Plateado" #: lclstrconsts.rssize msgid " size " msgstr " tamaño " #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "Cielo azul" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "turquesa" #: lclstrconsts.rstext msgid "Text" msgstr "Texto" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "Etiquetas de formato de archivo de la imagen" #: lclstrconsts.rstpanelaccessibilitydescription msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "No se ha podido cargar la fuente predeterminada" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "Error desconocido. Por favor, informe de este fallo" #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "Extensión de imagen inválida" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "Formato de imagen desconocida" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "Formato de mapa de bits no soportado" #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "Formato de portapapeles no soportado: %s" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr " ADVERTENCIA: Hay %d DCs sin liberar, sigue un volcado detallado:" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr " ADVERTENCIA: Hay %d GDIObjects sin liberar, sigue un volcado detallado:" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr " ADVERTENCIA: ¡Quedan %d mensajes! Se liberarán" #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr " ADVERTENCIA: Quedan %d estructuras TimerInfo, se liberarán." #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr " ADVERTENCIA: Hay %s mensajes de enlaces LM_PAINT/LM_GtkPAINT sin eliminar" #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "Blanco" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "Sólo palabras completas" #: lclstrconsts.rswin32error msgid "Error:" msgstr "Error:" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "Advertencia:" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "Ventana" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "Marco de ventana" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "Texto de Ventana" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "Amarillo" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "No se puede establecer el foco en una ventana desactivada o invisible" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "Duplicar menús" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "Creación de acción inválida" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "Enumeración de acción inválida" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "Registro de acción inválida" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "Desregistro de información inválida" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "¡La máscara \"%s\" no es válida!" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "Tamaño de imagen inválido" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "Índice de ImageList Inválido" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "Índice de menú fuera de rango" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "MenuItem es nulo" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "Sub-menu no está en el menú" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "" #: lclstrconsts.smkcdel msgid "Del" msgstr "" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "Abajo" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "Fin" #: lclstrconsts.smkcenter msgid "Enter" msgstr "" #: lclstrconsts.smkcesc msgid "Esc" msgstr "" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "Inicio" #: lclstrconsts.smkcins msgid "Ins" msgstr "" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "Izquierdo" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "Derecha" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "" #: lclstrconsts.smkcspace msgid "Space" msgstr "" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "Tabulador" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "Arriba" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "No hay formulario MDI presente" #: lclstrconsts.snotimers msgid "No timers available" msgstr "No hay temporizadores disponibles" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "Tipo de token incorrecto: %s esperado" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "Número de coma flotante no válido : %s" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "Número entero no válido: %s" #: lclstrconsts.sparlocinfo #, fuzzy #| msgid " (at %d,%d, stream offset %.8x)" msgid " (at %d,%d, stream offset %d)" msgstr " (en %d,%d, flujo de desplazamiento %.8x)" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "Valor byte no finalizado" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "Cadena de texto no finalizada" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "Simbolo de token incorrecto: %s esperado pero %s encontrado" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "Tipo de token incorrecto: %s esperado pero %s encontrado" doublecmd-0.5.8/language/lcl/lclstrconsts.ru.po0000644000175000017500000015116512250635657020611 0ustar alexxalexxmsgid "" msgstr "" "Last-Translator: Maxim Ganetsky \n" "Project-Id-Version: lazaruside\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2010-07-23 03:03+0300\n" "Language-Team: \n" "MIME-Version: 1.0\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "Браузер %s%s%s не является исполнимым файлом." #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "Браузер %s%s%s не найден." #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "Ошибка при выполнении %s%s%s:%s%s" #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "Невозможно найти браузер HTML." #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "База данных справки %s%s%s не смогла найти файл %s%s%s." #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "Макрос %s в BrowserParams будет заменён на URL." #: lclstrconsts.ifsalt msgid "Alt" msgstr "Alt" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "Ctrl" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "Accept" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "Клавиша Application" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "Забой" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "Cancel" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "CapsLock" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "Clear" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "Control" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "Convert" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "Delete" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "Стрелка вниз" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "End" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "Escape" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "Execute" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "Final" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "Ханчча" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "Справка" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "Home" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "Insert" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "Джанджа" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "Кана" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "Левая клавиша мыши" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "Стрелка влево" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "Левая клавиша Windows" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "Средняя клавиша мыши" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "Menu" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "Изменение режима" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "Next" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "Nonconvert" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "NumLock" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "%d цифровой клавиатуры" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "Клавиша Pause" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "Print" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "Page Up" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "Правая клавиша мыши" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "Ввод" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "Стрелка вправо" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "Правая клавиша Windows" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "ScrollLock" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "Select" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "Shift" #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "Snapshot" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "Пробел" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "Tab" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "Неизвестная" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "Стрелка вверх" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "Запустить %s невозможно" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "Ресурс %s не найден" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "Файл программы %s не найден" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "Затенённая часть объекта 3D" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "Освещённая часть объекта 3D" #: lclstrconsts.rsacontrolcannothaveitselfasparent #| msgid "A control can't have itself as parent" msgid "A control can't have itself as a parent" msgstr "Элемент управления не может быть родителем сам себе" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "Граница активного окна" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "Заголовок активного окна" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "Все файлы (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "Рабочая область приложения" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "Морской волны" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "Рабочий стол" #: lclstrconsts.rsbackward msgid "Backward" msgstr "Назад" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "Точечные рисунки" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "Чёрный" #: lclstrconsts.rsblank msgid "Blank" msgstr "Пустой" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "Синий" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "Лицевая часть кнопки" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "Освещаемая сторона кнопки" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "Затенённая сторона кнопки" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "Текст кнопки" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "Калькулятор" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "Отмена" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "Не могу принять фокус" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "Канва не поддерживает рисования" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "Текст заголовка" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "С учётом регистра" #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "Элемент управления класса '%s' не может иметь потомком элемент управления класса '%s'" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "Элемент управления '%s' не имеет родительского окна" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "Кремовый" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "Создание ошибки, захватываемой GDB:" #: lclstrconsts.rscursor msgid "Cursor" msgstr "Курсор" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "Пользовательский ..." #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "По умолчанию" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "права пользователь группа размер дата время" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "Удалить запись?" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "Удалить" #: lclstrconsts.rsdirection msgid "Direction" msgstr "Направление" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "&Каталог" #: lclstrconsts.rsdocking msgid "Docking" msgstr "Стыковка" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "Формат значков дублируется." #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "Редактировать" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "Во всём файле" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "Ошибка" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "Ошибка создания контекста устройства для %s.%s" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "ОШИБКА в LCL:" #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "Произошла ошибка в %s по %s адресу %s%s фрейм %s" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "Ошибка чтения %s%s%s: %s" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "Ошибка при сохранении точечного рисунка (bitmap)." #: lclstrconsts.rsexception msgid "Exception" msgstr "Исключение" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "Каталог должен существовать" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "Каталог \"%s\" не существует." #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "Файл \"%s\" уже существует. Перезаписать?" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "Файл должен существовать" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "Файл \"%s\" не существует" #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "Файл \"%s\" не доступен для записи." #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "Файл не доступен для записи" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "Сохранить файл как" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "Открыть существующий файл" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "Перезаписать файл?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "Путь должен существовать" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "Путь \"%s\" не существует." #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "Выберите каталог" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(файл не найден: \"%s\")" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "Информация о файле" #: lclstrconsts.rsfind msgid "Find" msgstr "Найти" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "Найти далее" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "Первая" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "FixedCols не может быть >= ColCount" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "FixedRows не может быть >= RowCount" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "Форма" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "Ошибка потоков \"%s\" форм: %s" #: lclstrconsts.rsforward msgid "Forward" msgstr "Вперёд" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "Розовый" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "--gdk-debug flags Включить указанные отладочные сообщения GDK." #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "--gdk-no-debug flags Выключить указанные отладочные сообщения GDK." #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "Формат Graphics Interchange Format" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "--g-fatal-warnings Замечания и ошибки, выдаваемые Gtk+/GDK, остановят приложение." #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "Градиент активного заголовка" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "Градиент неактивного заголовка" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "Графические файлы" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "Тёмно-серый" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "Серый текст" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "Тёмно-зелёный" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "Файл сетки не существует" #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "Индекс Grid'а вне диапазона допустимых значений." #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "GroupIndex не может быть меньше GroupIndex для предыдущего элемента меню" #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "Фильтр:" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "История:" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "--class classname Следуя соглашениям Xt, класс программы - это имя программы с прописным первым символом. Например, имя класса для gimp - \"Gimp\". Если задан --class, класс программы будет установлен в \"classname\"." #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "--gtk-debug flags Включить указанные отладочные сообщения Gtk+." #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "--display h:s:d Связаться с указанным сервером X, где \"h\" - имя хост-машины, \"s\" - номер сервера (обычно 0), и \"d\" - номер дисплея (обычно опускается). Если не задан --display, используется переменная окружения DISPLAY." #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "--gtk-module модуль Загрузить указанный модуль при запуске." #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "--name имяпрог Установить имя программы в \"имяпрог\". Если не задано, имя программы будет установлено в ParamStrUTF8(0)." #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "--gtk-no-debug flags Выключить указанные отладочные сообщения Gtk+." #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "--lcl-no-transient Не устанавливать временный порядок модальных форм" #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "--no-xshm Запрет использования расширений X по разделяемой памяти." #: lclstrconsts.rsgtkoptionsync #| msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediatey after the protocol request that generated the error has been processed by the X server." msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "--sync Вызвать XSynchronize (display, True) после установления соединения с сервером X. Это облегчает отладку ошибок протокола X, так как запросы буферизации X будут отключены, и ошибки X будут получаться сразу после обработки сервером X запроса протокола, который вызвал ошибку." #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "%s: уже зарегистрирован" #: lclstrconsts.rshelpcontextnotfound #, fuzzy #| msgid "Help Context not found" msgid "A help database was found for this topic, but this topic was not found" msgstr "Контекст справки не найден" #: lclstrconsts.rshelpdatabasenotfound #, fuzzy #| msgid "Help Database not found" msgid "There is no help database installed for this topic" msgstr "База данных справки не найдена" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "Ошибка справки" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "Контекст справки %s не найден." #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "Контекст справки %s не найден в базе данных %s%s%s." #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "База данных справки %s%s%s не нашла программу просмотра для страницы справки типа %s" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "База данных справки %s%s%s не найдена" #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "Ключевое слово справки %s%s%s не найдено." #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "Ключевое слово справки %s%s%s не найдено в базе данных %s%s%s." #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "Узел справки %s%s%s не имеет соответствующей базы данных" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "Не найдено справки для строки %d, столбца %d из %s." #: lclstrconsts.rshelpnohelpnodesavailable #, fuzzy #| msgid "No help nodes available" msgid "No help entries available for this topic" msgstr "Доступные узлы справки отсутствуют" #: lclstrconsts.rshelpnotfound #, fuzzy #| msgid "Help not found" msgid "No help found for this topic" msgstr "Справка не найдена" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "%s: Не зарегистрирован" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "Ошибка переключателя справки" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "Отсутствует программа просмотра для типа справки %s%s%s" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "Ошибка программы просмотра справки" #: lclstrconsts.rshelpviewernotfound #, fuzzy #| msgid "Help Viewer not found" msgid "No viewer was found for this type of help content" msgstr "Программа просмотра справки не найдена" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "Выделенное" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "Текст выделенного" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "Выделение" #: lclstrconsts.rsicns #, fuzzy #| msgid "OSX Icon Resource" msgid "Mac OS X Icon" msgstr "Ресурс значков OSX" #: lclstrconsts.rsicon msgid "Icon" msgstr "Значок" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "Изображение значка не может быть пустым" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "Изображение значка должно иметь тот же формат" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "Невозможно изменить формат изображения значка" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "Изображение значка должно иметь тот же размер" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "Невозможно изменить размер изображения значка" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "Значок не имеет текущего изображения" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "Граница неактивного окна" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "Заголовок неактивного окна" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "Заголовок неактивного окна" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "%s Индекс %d вне диапазона 0 .. %d" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "Индекс вне диапазона Cell[Col=%d Row=%d]" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "Фон сообщения" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "Текст сообщения" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "Вставить" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "Неверная дата: %s" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "Неверная дата: %s. Должна быть между %s and %s" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "неправильный поток объекта формы" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "Неправильное значение свойства" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "Неправильный формат потока" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "%s уже сопоставлено с %s" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "Joint Picture Expert Group" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "Последняя" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "Зелёный" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "Индекс списка вне диапазона (%d)" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "Список должен быть пуст" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "Малиновый" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "Прервать" #: lclstrconsts.rsmball msgid "&All" msgstr "&Все" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "Отмена" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "&Закрыть" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "&Справка" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "&Пропуск" #: lclstrconsts.rsmbno msgid "&No" msgstr "&Нет" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "Нет для всех" #: lclstrconsts.rsmbok msgid "&OK" msgstr "&ОК" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "&Открыть" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "&Повтор" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "&Сохранить" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "&Разблокировать" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "&Да" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "Да для &всех" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "Серый" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "Панель меню" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "Меню" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "Выделенный пункт меню" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "Текст меню" #: lclstrconsts.rsmodified msgid " modified " msgstr " изменён " #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "Светло-зелёный" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "Проверка подлинности" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "Подтверждение" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "Пользовательский" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "Ошибка" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "Сведения" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "Предупреждение" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "Тёмно-синий" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "Следующая" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "Нет" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "Неверный файл сетки" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "Отсутствует объект библиотеки виджетов. Проверьте, что модуль \"interfaces\" был добавлен в выражение uses программы." #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "Оливковый" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "Выберите дату" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "Pixmap" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "Portable BitMap" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "Portable GrayMap" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "Portable Network Graphic" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "Portable PixMap" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "Отправить" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok #| msgid "%s%sPress Ok to ignore and risk data corruption.%sPress Cancel to kill the program." msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "%s%sНажмите 'OK' чтобы игнорировать и подвергнуться риску повреждения данных.%sНажмите 'Отмена' для закрытия программы." #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "Предыдущая" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "Свойство %s не существует" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "Лиловый" #: lclstrconsts.rsqtoptiondograb #| msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override.Need QT_DEBUG." msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "-dograb (только в X11), запуск в отладчике может повлечь неявный -nograb, используйте -dograb для отмены. Требуется QT_DEBUG." #: lclstrconsts.rsqtoptiongraphicsstyle #| msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps.Available options are native,raster and opengl.OpenGL is still unstable." msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "-graphicssystem param, устанавливает используемый механизм отрисовки экранных виджетов и QPixmaps. Доступные варианты: native, raster и opengl. OpenGL всё ещё нестабилен." #: lclstrconsts.rsqtoptionnograb #| msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard.Need QT_DEBUG." msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "-nograb, запрещает Qt захват мыши или клавиатуры. Требует QT_DEBUG." #: lclstrconsts.rsqtoptionreverse #| msgid "-reverse, sets the application's layout direction to Qt::RightToLeft" msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "-reverse, устанавливает направление размещения виджетов приложения в Qt::RightToLeft." #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "-session session, восстанавливает приложение из более ранней сессии." #: lclstrconsts.rsqtoptionstyle #| msgid "-style style or -style=style, sets the application GUI style.Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "-style style или -style=style, устанавливает стиль виджетов интерфейса приложения. Возможные значения: motif, windows, и platinum. Если Qt собран с дополнительными стилями или они имеются в виде модулей, эти стили будут доступны в команде -style. ПРИМЕЧАНИЕ: не все стили доступны на всех платформах. Если стиль отсутствует, Qt запустит приложение со стилем по умолчанию (windows)." #: lclstrconsts.rsqtoptionstylesheet #| msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application styleSheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "-stylesheet stylesheet или -stylesheet=stylesheet, устанавливает таблицу стилей приложения (Style Sheet). Значение должно являться путём к файлу с таблицей стилей. Примечание: относительные URL'ы в таблице стилей даются относительно пути к файлу таблицы стилей." #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "-sync (только в X11), устанавливает синхронный режим отладки." #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "-widgetcount, выводит отладочное сообщение в конце о количестве неуничтоженных, а также максимальном количестве существовавших в один момент времени виджетов." #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "-bg или -background color, устанавливает цвет фона по умолчанию и палитру приложения (вычисляются светлые и тёмные оттенки)." #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "-btn или -button color, устанавливает цвет кнопки по умолчанию." #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "-cmap, вызывает установку собственной цветовой карты приложением на 8-разрядном дисплее." #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "-display display, устанавливает дисплей X (по умолчанию - $DISPLAY)." #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "-fg или -foreground color, устанавливает цвет текста по умолчанию." #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "-fn или -font font, задаёт шрифт приложения. Он должен быть указан с использованием логического описания шрифтов X." #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "-geometry geometry, устанавливает клиентскую геометрию первого показанного окна." #: lclstrconsts.rsqtoptionx11im #| msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)" msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "-im, устанавливает сервер методов ввода (эквивалентно установке значения переменной окружения XMODIFIERS)." #: lclstrconsts.rsqtoptionx11inputstyle #| msgid "-inputstyle, defines how the input is inserted into the given widget, e.g., onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "-inputstyle, задаёт, как вводимая информация вносится в данный виджет. Например, onTheSpot приводит к прямому появлению вводимой информации в виджете, тогда как overTheSpot вызывает появление информации в поле, находящемся над виджетом, и не вставляется до окончания редактирования." #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "-name name, устанавливает имя приложения." #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "-ncols count, ограничивает число цветов в цветовом кубе 8-разрядного дисплея, если приложение использует перечень цветов QApplication::ManyColor. Если количество равно 216, используется цветовой куб 6x6x6 (то есть, 6 уровней красного, 6 зелёного и 6 синего); для других значений используется куб, примерно пропорциональный кубу 2x3x1." #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "-title title, устанавливает заголовок приложения." #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "-visual TrueColor, вынуждает приложение использовать TrueColor на 8-разрядном дисплее." #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "Команда Endupdate, хотя обновления не производилось" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "Невозможно сохранить изображение во время обновления" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "Невозможно начать обновление всех во время обновления канвы" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "Красный" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "Обновить" #: lclstrconsts.rsreplace msgid "Replace" msgstr "Заменить" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "Заменить всё" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "Ресурс %s не найден" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "Полоса прокрутки" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "свойство ScrollBar вне диапазона" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "Выбрать цвет" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "Выбрать шрифт" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "Серебристый" #: lclstrconsts.rssize msgid " size " msgstr " размер " #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "Голубой" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "Бирюзовый" #: lclstrconsts.rstext msgid "Text" msgstr "Текст" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "Формат Tagged Image File" #: lclstrconsts.rstpanelaccessibilitydescription msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "Не могу загрузить шрифт по умолчанию" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "Неизвестная ошибка, сообщите о ней разработчикам" #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "Неизвестное расширение файла изображения" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "Неизвестный формат изображения" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "Неподдерживаемый тип точечного рисунка." #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "Неподдерживаемый формат буфера обмена: %s" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr " ВНИМАНИЕ: Найдено %d неосвобождённых контекстов устройств, список см. ниже:" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr " ВНИМАНИЕ: Найдено %d неосвобождённых GDIObject, список см. ниже:" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr " ВНИМАНИЕ: В очереди осталось %d сообщений! Они будут удалены" #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr " ВНИМАНИЕ: Осталось %d структур TimerInfo, они будут освобождены" #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr " ВНИМАНИЕ: Найдено %s неудалённых ссылок на сообщение LM_PAINT/LM_GtkPAINT." #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "Белый" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "Только целые слова" #: lclstrconsts.rswin32error msgid "Error:" msgstr "Ошибка:" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "Предупреждение:" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "Окно" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "Граница окна" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "Текст окна" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "Жёлтый" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "Невозможно перевести фокус в отключённое или невидимое окно" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "Дублирующиеся меню" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "Неверное создание действия" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "Неверное перечисление действий" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "Неверная регистрация действия" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "Неверная разрегистрация действия" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "Набор символов в маске \"%s\" неверен!" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "Неверный размер рисунка" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "Неверный индекс ImageList" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "Индекс меню вне диапазона" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "MenuItem указывает на нуль" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "Подменю не в меню" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "Alt+" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "Забой" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "Ctrl+" #: lclstrconsts.smkcdel msgid "Del" msgstr "Del" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "Вниз" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "End" #: lclstrconsts.smkcenter msgid "Enter" msgstr "Ввод" #: lclstrconsts.smkcesc msgid "Esc" msgstr "Esc" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "Home" #: lclstrconsts.smkcins msgid "Ins" msgstr "Ins" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "Влево" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "Meta+" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "PgDn" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "PgUp" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "Вправо" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "Shift+" #: lclstrconsts.smkcspace msgid "Space" msgstr "Пробел" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "Таб" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "Вверх" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "Отсутствует форма MDI." #: lclstrconsts.snotimers msgid "No timers available" msgstr "Таймеры недоступны" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "Неверный тип лексемы: ожидался %s" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "Неверное число с плавающей точкой: %s" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "Неверное целое число: %s" #: lclstrconsts.sparlocinfo #, fuzzy #| msgid " (at %d,%d, stream offset %.8x)" msgid " (at %d,%d, stream offset %d)" msgstr " (на %d,%d, смещение потока %.8x)" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "Незавершённое значение байта" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "Незавершённая строка" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "Неверный символ лексемы: ожидался %s, но найден %s" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "Неверный тип лексемы: ожидался %s, но найден %s" doublecmd-0.5.8/language/lcl/lclstrconsts.it.po0000644000175000017500000012777412250635657020610 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: 0.9.2\n" "POT-Creation-Date: 2009-11-29 13:59+0200\n" "PO-Revision-Date: 2013-11-03 13:34+0100\n" "Last-Translator: Krypton \n" "Language-Team: Krypton \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "Il browser %s%s%s non è eseguibile." #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "Il browser %s%s%s non è stato trovato." #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "Errore eseguendo %s%s%s:%s%s" #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "Impossibile trovare un browser HTML" #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "Il database d'aiuto %s%s%s non riesce a trovare il file %s%s%s." #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "La macro %s nei BrowserParams verrà sostituita dall'URL." #: lclstrconsts.ifsalt msgid "Alt" msgstr "Alt" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "Ctrl" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "Accetta" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "Tasto dell'applicazione" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "Backspace" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "Cancella" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "Maiuscolo" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "Azzera" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "Control" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "Converti" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "Elimina" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "Giù" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "Fine" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "Escape" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "Esegui" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "Finale" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "Hanja" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "Aiuto" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "Home" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "Inserisci" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "Junja" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "Kana" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "Tasto sinistro del mouse" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "Sinistra" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "tasto windows sinistro" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "Tasto centrale del mouse" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "Menu" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "Cambiamento di modalità" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "Successivo" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "Non convertire" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "BlocNum" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "TastNum %d" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "Tasto pausa" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "Stampa" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "Precedente" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "Tasto destro del mouse" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "Invio" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "Destra" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "tasto windows destro" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "Scorrimento" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "Selezione" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "Shift" #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "Istantanea" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "Tasto spazio" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "Tab" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "Sconosciuto" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "Su" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "Non posso eseguire %s" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "Risorsa %s non trovata" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "Programma non trovato %s" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "Ombra scura 3D" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "Luce 3D" #: lclstrconsts.rsacontrolcannothaveitselfasparent msgid "A control can't have itself as a parent" msgstr "Un controllo non può avere se stesso come genitore" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "Bordo attivo" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "Caption attivo" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "Tutti i file (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "Area di lavoro dell'applicazione" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "Acqua" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "Scrivania" #: lclstrconsts.rsbackward msgid "Backward" msgstr "Indietro" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "Bitmap" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "Nero" #: lclstrconsts.rsblank msgid "Blank" msgstr "Vuoto" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "Blu" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "Superfice pulsante" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "Evidendiazione pulsante" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "Ombra pulsante" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "Testo pulsante" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "Calcolatore" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "Cancella" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "Impossibile spostare il focus" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "Le canvas non permettono il disegno" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "Testo caption" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "Distingui maiusc./minusc." #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "Il controllo della classe '%s' non può avere il controllo della classe '%s' come processo figlio" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "Il controllo '%s' non ha finestre genitore" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "Crema" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "Creazione di errore gdb intercettabile:" #: lclstrconsts.rscursor msgid "Cursor" msgstr "Cursore" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "Personalizzato ..." #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "Predefinito" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "permessi del gruppo utente in formato data ora" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "Eliminare un record?" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "Elimina" #: lclstrconsts.rsdirection msgid "Direction" msgstr "Direzione" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "&Cartella" #: lclstrconsts.rsdocking msgid "Docking" msgstr "Aggancia" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "Duplicare formato icona." #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "Modifica" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "Cerca il file intero" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "Errore" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "Errore nella creazione del contesto dispositivo per %s.%s" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "Errore nell'LCL:" #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "Errore occorso in %s all' %sIndirizzo %s%s Frame %s" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "Errore nella lettura di %s%s%s: %s" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "Errore durante il salvataggio del bitmap." #: lclstrconsts.rsexception msgid "Exception" msgstr "Eccezione" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "La cartella deve esistere" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "La cartellla \"%s\" non esiste." #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "Il file \"%s\" Esiste già. Sovrascriverlo?" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "Il file deve esistere" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "Il file \"%s\" non esiste." #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "Il file \"%s\" non è scrivibile." #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "Il file non è scrivibile" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "Salva con nome" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "Apri file esistente" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "Sovrascrivere il file?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "Il percorso deve esistere" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "Il percorso \"%s\" non esiste." #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "Selezionare una directory" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(file non trovato: \"%s\")" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "Informazioni sul file" #: lclstrconsts.rsfind msgid "Find" msgstr "Trova" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "Trova successivo" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "Primo" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "FixedCol non può essere >= ColCount" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "FixedRows non può essere >= RowCount" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "Form" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "Form streaming \"%s\" errore: %s" #: lclstrconsts.rsforward msgid "Forward" msgstr "Avanti" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "Fucsia" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "--gdk-debug-flags Abilita specifici messaggi di trace/debug GDK." #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "--gdk-no-debug flags Disabilita messaggi specifici di trace/debug di GDK." #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "Graphics Interchange Format" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "--g-fatal-warnings Avvertimenti ed errori generati da Gtk/GDK bloccheranno l'applicazione." #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "Gradient Caption attivo" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "Gradient Caption disattivo" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "Grafica" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "Grigio" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "Testo in grigio" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "Verde" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "Il file di griglia non esiste" #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "Indice della griglia fuori dal range." #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "GroupIndex non può essere minore del GroupIndex della precedente voce di menu" #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "Filtro:" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "Cronologia:" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "--class nomeclasse Secondo le convenzioni Xt, la classe di un programma è il nome del programma con il carattere iniziale maiuscolo. Per esempio il nome della classe per gimp è \"Gimp\". Se --class viene specificata, la classe del programma verrà impostata a \"classname\"." #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "--gtk-debug flags Abilita messaggi specifici di trace/debug Gtk+." #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "--display h:s:d Connessione al server X specificato, dove \"h\" è il nome host, \"s\" è il numero di server (solitamente 0), e \"d\" è il numero di display (normalmente viene omesso). Se --display non è specificato, verrà utilizzata la variabile di ambiente DISPLAY." #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "--gtk-module module Carica il modulo specificato all'avvio del programma." #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "--name programe Imposta il nome del programma a \"progname\". Se non specificato, il nome del programma sarà impostato a ParamStrUTF8(0)." #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "--gtk-no-debug-flags Disabilita messaggi specifici di trace/debug Gtk+." #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "--lcl-no-transient Non impostare l'ordine temporaneo per i form modali" #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "--no-xshm Disabilita l'uso dell'estensione della memoria condivisa di X." #: lclstrconsts.rsgtkoptionsync msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "--sync Chiama XSynchronize (display, True) dopo che è stata stabilita la connessione al server X. Ciò rende più semplice la correzione degli errori del protocollo X, poiché la richiesta di bufferizzazione di X sarà disabilitata e quindi gli errori di X saranno ricevuti immediatamente dopo che la richiesta di protocollo che ha generato l'errore è stata elaborata dal server X." #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "%s: Già registrato" #: lclstrconsts.rshelpcontextnotfound #, fuzzy #| msgid "Help Context not found" msgid "A help database was found for this topic, but this topic was not found" msgstr "Aiuto contestuale non trovato" #: lclstrconsts.rshelpdatabasenotfound #, fuzzy #| msgid "Help Database not found" msgid "There is no help database installed for this topic" msgstr "Database di aiuto non trovato" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "Errore nell'aiuto" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "Aiuto contestuale %s non trovato." #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "Aiuto contestuale %s non trovato nel Database %s%s%s." #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "Il Database di aiuto %s%s%s non trova un visualizzatore per le pagine di aiuto di tipo %s" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "Database di aiuto %s%s%s non trovato" #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "Aiuto sulla parola chiave %s%s%s non trovato." #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "Aiuto sulla parola chiave %s%s%s non trovato nel Database %s%s%s." #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "Il nodo di aiuto %s%s%s non ha un Database di aiuto" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "Nessun aiuto trovato per la linea %d, colonna %d di %s." #: lclstrconsts.rshelpnohelpnodesavailable #, fuzzy #| msgid "No help nodes available" msgid "No help entries available for this topic" msgstr "Nessun aiuto disponibile" #: lclstrconsts.rshelpnotfound #, fuzzy #| msgid "Help not found" msgid "No help found for this topic" msgstr "Aiuto non trovato" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "%s: Non registrato" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "Errore nella selezione dell'aiuto" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "Non c'è nessun visualizzatore per aiuti di tipo %s%s%s" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "Errore nel visualizzatore dell'aiuto" #: lclstrconsts.rshelpviewernotfound #, fuzzy #| msgid "Help Viewer not found" msgid "No viewer was found for this type of help content" msgstr "Visualizzatore dell'aiuto non trovato" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "Evidenzia" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "Evidenzia testo" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "Luce calda" #: lclstrconsts.rsicns #, fuzzy #| msgid "OSX Icon Resource" msgid "Mac OS X Icon" msgstr "isorsa di icone OSX" #: lclstrconsts.rsicon msgid "Icon" msgstr "Icona" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "L'immagine dell'icona non può essere vuota" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "L'immagine dell'icona deve avere lo stesso formato" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "Impossibile cambiare il formato dell'immagine dell'icona" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "L'immagine dell'icona deve avere le stesse dimensioni" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "Impossibile cambiare le dimensioni dell'immagine dell'icona" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "L'icona non ha nessuna immagine" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "Bordo inattivo" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "Caption inattiva" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "Caption inattiva" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "%s indice %d fuori dai limiti 0 .. %d" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "Indice fuori dal range della Cella[Col=%d Row=%d]" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "Informazioni sfondo" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "Informazioni testo" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "Inserimento" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "Data non valida: %s" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "Data non valida: %s. Deve essere compresa tra %s e %s" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "Form object stream non valido" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "Valore della proprietà non valido" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "Formato stream non valido" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "%s è già associato con %s" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "Joint Picture Expert Group" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "Ultimo" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "Lime" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "L'elenco dell'indice eccede i limiti (%d)" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "L'elenco deve essere vuoto" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "Maroon" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "Interrompi" #: lclstrconsts.rsmball msgid "&All" msgstr "&Tutti" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "Annulla" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "&Chiudi" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "&Aiuto" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "&Ignora" #: lclstrconsts.rsmbno msgid "&No" msgstr "&No" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "No a tutto" #: lclstrconsts.rsmbok msgid "&OK" msgstr "&OK" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "&Apri" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "&Riprova" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "&Salva" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "&Sblocca" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "&Si" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "Si a &tutti" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "Grigio medio" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "Barra Menu" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "Menu" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "Evidenziare Menu" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "Testo Menu" #: lclstrconsts.rsmodified msgid " modified " msgstr " modificato " #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "Denaro Verde" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "Autenticazione" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "Conferma" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "Personalizza" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "Errore" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "Informazioni" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "Avviso" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "Marina" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "Successivo" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "Nessuno" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "Non è un file di griglia valido" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "Nessun oggetto widgetset. Verifica se l'unità \"interfaces\" was added to the programs uses clause." #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "Oliva" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "Seleziona una data" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "Pixmap" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "Portable BitMap" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "Portable GrayMap" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "Portable Network Graphic" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "Portable PixMap" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "Post" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "%s%sPremi Ok per ignorare il messaggio e rischiare di corrompere i dati.%sPremi Annulla per terminare l'esecuzione del programma." #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "Precedente" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "La proprietà %s non esiste" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "Viola" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "-dograb (solo sotto ambiente X11), l'esecuzione di un debugger può causare un implicito -nograb, usare -dograb per bypassare. Necessita di QT_DEBUG." #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "-graphicssystem param, imposta il backend da usare per widget su schermo e QPixmaps. Le opzioni disponibili sono native, raster e opengl. OpenGL è ancora instabile." #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "-nograb, dice a Qt che non deve mai acquisire input dal mouse o dalla tastiera. Necessita di QT_DEBUG." #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "-reverse, imposta la direzione del layout dell'applicazione su Qt::RightToLeft." #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "-session sessione, ripristina l'applicazione da una sessione precedente." #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "-style stile oppure -style=stile, imposta lo stile dell'interfaccia grafica (GUI) dell'applicazione. I valori possibili sono motif, windows, e platinum. Se hai compilato Qt con stili aggiuntivi o ne hai aggiunti sotto forma plugin, essi saranno disponibili come opzioni per il comando -style. NOTA: Non tutti gli stili sono disponibili su tutte le piattaforme. Se un parametro di stile non esiste, Qt avvierà l'applicazione con lo stile predefinito (windows)." #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "-stylesheet foglio di stile oppure -stylesheet=foglio di stile, imposta l'applicazione foglio di stile. Il valore deve essere un percorso che punta a un file contenente il foglio di stile. Nota: Gli indirizzi relativi (URL) all'interno del foglio di stile sono relativi a un percorso di file." #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "-sync (solo sotto ambiente X11), commuta nel modo sincrono per operazioni di debugging." #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "-widgetcount, stampa alla fine un messaggio riguardo al numero di widget che non sono stati distrutti e al numero massimo di widget che sono esistiti nello stesso tempo." #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "-bg oppure -background colore, imposta il colore di background predefinito e una applicazione tavolozza (le tonalità chiare e scure saranno calcolate)." #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "-btn oppure -button color, imposta il colore del pulsante predefinito" #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "cmpa, causa che l'applicazione installi una mappa di colore privata su un display a 8-bit." #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "-display display, imposta il display X (il predefinito è $DISPLAY)." #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "-fg oppure -foreground colore, imposta il colore di primo piano predefinito." #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "-fn oppure -font font, definisce il font dell'applicazione. Il font dovrebbe essere specificato usando una X logical font description." #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "-geometry geometria, imposta la geometria del client della prima finestra che viene visualizzata." #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "-im, imposta il metodo di input server (equivalente all'impostazione della variabile d'ambiente XMODIFIERS." #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "-inputstyle, definisce come l'input è inserito in un dato widget, ad esempio onTheSpot fa in modo che l'input appaia direttamente nel widget, mentre overTheSpot fa in modo che l'input appaia in una casella flottante sul widget e non sia inserito finché la fase di modifica non è conclusa." #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "-name nome, imposta il nome dell'applicazione" #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "-ncols conteggio, limita il numero di colori allocati nel cubo di colori di un display a 8-bit, se l'applicazione sta usando la specifica di colore di QApplication::ManyColor. Se il conteggio è 216 allora il cubo di colori 6x6x6 sarà usato (cioè 6 levelli di rosso, 6 di verde, e 6 di blu); per altri valori, sarà usato un cubo approsimativamente proporzionale a 2x3x1" #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "-title titolo, imposta il titolo dell'applicazione" #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "-visual TrueColor, forza l'applicazione a usare TrueColor visual su un display a 8-bit." #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "Endupdate mentre nessun aggiornamento era in corso" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "Non posso salvare l'immagine mentre l'aggiornamento è in corso" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "Non è possibile iniziare l'aggiornamento quando l'aggiornamento delle canvas è in corso" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "Rosso" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "Aggiorna" #: lclstrconsts.rsreplace msgid "Replace" msgstr "Sostituisci" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "Sostituisci tutto" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "Risorsa %s non trovata" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "Barra di scorrimento" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "Proprietà della barra di scorrimento fuori dal range" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "Selezionare un colore" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "Selezionare un font" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "Argento" #: lclstrconsts.rssize msgid " size " msgstr " dimensione " #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "Cielo blu" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "Teal" #: lclstrconsts.rstext msgid "Text" msgstr "Testo" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "Tagged Image File Format" #: lclstrconsts.rstpanelaccessibilitydescription msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "Impossibile caricare il font predefinito" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "Errore sconosciuto. Per favore, riporta questo errore al team di sviluppo" #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "Estensione immagine sconosciuta" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "Formato di immagine sconosciuto" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "ormato bitmap non supportato." #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "Formato degli appunti non supportato %s" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr "AVVISO: esistono %s DC non rilasciati, segue un dump dettagliato:" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr "AVVISO: ci sono %d GDIObjects non rilasciati, segue un dump dettagliato:" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr "AVVISO: ci sono %d messaggi lasciati in coda! Li sto liberando" #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr "AVVISO: Ci sono ancora %d strutture TimerInfo, le sto liberando" #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr "AVVISO: Ci sono ancora %s collegamenti a messaggi M_PAINT/LM_GtkPAINT non rimossi." #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "Bianco" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "Solo parole intere" #: lclstrconsts.rswin32error msgid "Error:" msgstr "Errore:" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "Avviso:" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "Finestra" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "Frame della finestra" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "Testo della finestra" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "Giallo" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "Impossibile spostare il focus su una finestra disabilitata o invisibile" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "Menu dupicati" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "Creazione dell'azione non valida" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "Enumerazione dell'azione non valida" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "Registrazione dell'azione non valida" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "Deregistrazione dell'azione non valida" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "Il set di caratteri nella maschera \"%s\" non è valido!" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "Dimensione dell'immagine non valida" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "Indice ImageList non valido" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "Indice del menu fuori dal range" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "La voce del menu è nulla" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "Il sottomenu non è nel menu" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "Alt+" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "BkSp" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "Ctrl+" #: lclstrconsts.smkcdel msgid "Del" msgstr "Canc" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "Giù" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "Fine" #: lclstrconsts.smkcenter msgid "Enter" msgstr "Invio" #: lclstrconsts.smkcesc msgid "Esc" msgstr "Esc" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "Home" #: lclstrconsts.smkcins msgid "Ins" msgstr "Ins" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "Sinistra" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "Meta+" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "PagGiù" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "PagSu" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "Destra" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "Shift+" #: lclstrconsts.smkcspace msgid "Space" msgstr "Spazio" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "Tab" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "Su" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "Nessun form MDI presente" #: lclstrconsts.snotimers msgid "No timers available" msgstr "Nessun temporizzatore disponibile" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "Tipo di token sbagliato: %s previsto" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "Numero in virgola mobile non valido: %s" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "Numero intero non valido: %s" #: lclstrconsts.sparlocinfo #, fuzzy #| msgid " (at %d,%d, stream offset %.8x)" msgid " (at %d,%d, stream offset %d)" msgstr "(at %d,%d, stream offset %.8x)" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "Valore in byte incompleto" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "Stringa incompleta" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "Simbolo token sbagliato: %s previsto ma %s trovato" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "Tipo di token sbagliato: %s previsto ma %s trovato" doublecmd-0.5.8/language/lcl/lclstrconsts.uk_UA.po0000644000175000017500000014511212250635657021162 0ustar alexxalexxmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "Браузер %s%s%s не є виконуваним." #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "Браузер %s%s%s не знайдено." #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "Помилка при виконанні %s%s%s:%s%s" #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "Не вдається знайти браузер HTML." #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "База даних довідки %s%s%s не змогла знайти файл %s%s%s." #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "Макрос %s в BrowserParams буде замінений на URL." #: lclstrconsts.ifsalt msgid "Alt" msgstr "Alt" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "Ctrl" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "Прийняти" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "кнопка програми" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "Backspace" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "Скасувати" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "Великі літери" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "Очистити" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "Керування" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "Перетворити" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "Видалити" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "Вниз" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "Кінець" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "Вихід" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "Виконати" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "Кінцевий" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "Китайська" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "Допомога" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "Дім" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "Вставити" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "Кенійська" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "Японська" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "Ліва клавіша миші" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "Вліво" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "ліва клавіша Win" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "Середня клавіша миші" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "Меню" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "Зміна режиму" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "Наступний" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "Неконвертоване" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "Numlock" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "Numpad %d" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "Клавіша Pause" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "Друкувати" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "Попередній" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "Права клавіша миші" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "Enter" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "Вправо" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "права клавіша Win" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "Scroll" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "Вибрати" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "Shift" #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "Скріншот" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "Пробіл" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "Tab" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "Невідомий" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "Вверх" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "неможливо виконати %s" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "Ресурс %s не знайдено" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "програмний файл %s не знайдено" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "Об'ємна тінь" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "Об'ємне світло" #: lclstrconsts.rsacontrolcannothaveitselfasparent #, fuzzy #| msgid "A control can't have itself as parent" msgid "A control can't have itself as a parent" msgstr "Елемент управління не може бути сам собі предком" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "Активні границі" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "Активні заголовки" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "Всі файли (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "Робоча область програми" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "Колір морської хвилі" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "Робочий стіл" #: lclstrconsts.rsbackward msgid "Backward" msgstr "Навпаки" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "Піктограмки" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "Чорний" #: lclstrconsts.rsblank msgid "Blank" msgstr "Порожній" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "Синій" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "Вигляд кнопки" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "Підсвітка кнопки" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "Тінь кнопки" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "Текст кнопки" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "Калькулятор" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "Скасувати" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "Не можу сфокусуватися" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "Полотно не підтримує малювання" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "Текст заголовка" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "Врахування регістру" #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "Елемент управління класу '%s' не може мати наслідником елемент класу '%s'" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "Елемент управління '%s' не має батьківського вінка" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "Кремовий" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "Створення помилки кешування gdb:" #: lclstrconsts.rscursor msgid "Cursor" msgstr "Курсор" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "Власний..." #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "За замовчуванням" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "дозволи користувач група розмір дата час" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "Видалити запис?" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "Видалити" #: lclstrconsts.rsdirection msgid "Direction" msgstr "Напрямок" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "&Каталог" #: lclstrconsts.rsdocking msgid "Docking" msgstr "Стикування" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "Дублювати формат іконок." #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "Редагувати" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "Шукати по усьому файлу" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "Помилка" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "Помилка створення контексту пристроїв для %s.%s" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "ПОМИЛКА в LCL:" #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "Сталась помилка в %s за %s адресою %s%s Кадр %s" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "Помилка читання %s%s%s: %s" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "Помилка збереження растрового зображення." #: lclstrconsts.rsexception msgid "Exception" msgstr "Виняток" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "Тека повинна існувати" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "Теки \"%s\" не існує." #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "Такий файл \"%s\" вже існує. Переписати його ?" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "Файл має існувати" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "Файл \"%s\" не існує." #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "Файл \"%s\" не може бути записаний." #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "Файл тільки для читання" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "Зберегти файл як" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "Відкрити існуючий файл" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "Перезаписати файл ?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "Шлях має існувати" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "Шлях \"%s\" не існує." #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "Виберіть каталог" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(файл не знайдений: \"%s\")" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "Інформація про файл" #: lclstrconsts.rsfind msgid "Find" msgstr "Знайти" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "Знайти ще" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "Перший" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "FixedCols не може бути >= ColCount" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "FixedRows не може бути >= RowCount" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "Форма" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "Помилка потоків форм \"%s\": %s" #: lclstrconsts.rsforward msgid "Forward" msgstr "Вперед" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "Фуксія" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "--gdk-debug flags Ввімкнути вказані налагоджувальні повідомлення GDK." #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "--gdk-no-debug flags Вимкнути вказані налагоджувальні повідомлення GDK." #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "Формат обміну графічними даними" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "--g-fatal-warnings Попередження і помилки програми, згенеровані Gtk+/GDK, зупинятимуть програму." #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "Заголовок активного градієнта" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "Заголовок неактивного градієнта" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "Графічний" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "Сірий" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "Сірий текст" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "Пастельно-зелений" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "Файла сітки не існує" #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "Індекс сітки поза межею допустимих значень." #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "GroupIndex не може бути менше GroupIndex для попереднього елемента меню" #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "Фільтр:" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "Історія:" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "--class classname Відповідно до домовленостей Xt, класом програмим є її назва з великої літери. Напр., назвою класу для gimp є \"Gimp\". Якщо вказано --class, клас програми буде встановлено в \"classname\"." #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "--gtk-debug flags Ввімкнути вказані налагоджувальні повідомлення Gtk+." #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "--display h:s:d Зв'язатись із вказаним X-сервером, де \"h\" - назва хоста, \"s\" - номер сервера (звичайно 0) і \"d\" - номер дисплея (звичайно нехтують). Якщо --display не вказаний, використовується змінна оточення DISPLAY." #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "--gtk-module модуль Завантажити вказаний модуль при запуску." #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "--name ім'япрог Встановити ім'я програми в \"progname\". Якщо не вказано, ім'я програми буде встановлено в ParamStrUTF8(0)." #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "--gtk-no-debug flags Вимкнути вказані налагоджувальні повідомлення Gtk+." #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "--lcl-no-transient Не встановлювати тимчасовий порядок модальних форм" #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "--no-xshm Заборонити використання спільних розширень Х-пам'яті." #: lclstrconsts.rsgtkoptionsync #, fuzzy #| msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediatey after the protocol request that generated the error has been processed by the X server." msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "--sync Виклик XSynchronize (display, True) після встановлення з'єднання з X-сервером. Це полегшує налагодження помилок протоколу X через те, що запити буферування X будуть вимкнені і помилки X будуть одержані одразу після запиту протоколу, який викликав цю помилку, яка була оброблена X-сервером." #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "%s: Вже зареєстрований" #: lclstrconsts.rshelpcontextnotfound #, fuzzy #| msgid "Help Context not found" msgid "A help database was found for this topic, but this topic was not found" msgstr "Контекст довідки не знайдено" #: lclstrconsts.rshelpdatabasenotfound #, fuzzy #| msgid "Help Database not found" msgid "There is no help database installed for this topic" msgstr "База даних довідки не знайдена" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "Помилка довідки" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "Контекст довідки %s не знайдено" #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "Контекст довідки %s не знайдено в базі %s%s%s." #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "База даних довідки %s%s%s не знайшла програму перегляду для сторінки довідки типу %s" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "Базу даних довідки %s%s%s не знайдено" #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "Ключове слово довідки %s%s%s не знайдено." #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "Ключове слово довідки %s%s%s не знайдено в базі даних %s%s%s." #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "Вузол довідки %s%s%s не має відповідної бази даних" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "Не знайдено довідки для рядка %d, колонки %d з %s." #: lclstrconsts.rshelpnohelpnodesavailable #, fuzzy #| msgid "No help nodes available" msgid "No help entries available for this topic" msgstr "Відсутні доступні вузли довідки" #: lclstrconsts.rshelpnotfound #, fuzzy #| msgid "Help not found" msgid "No help found for this topic" msgstr "Довідку не знайдено" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "%s: Не зареєстрований" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "Помилка відбірника довідки" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "Відсутня програма для перегляду такого типу довідки %s%s%s" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "Помилка переглядача довідки" #: lclstrconsts.rshelpviewernotfound #, fuzzy #| msgid "Help Viewer not found" msgid "No viewer was found for this type of help content" msgstr "Не знайдено переглядач довідки" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "Підсвічений" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "Підсвічений текст" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "Гаряче світло" #: lclstrconsts.rsicns #, fuzzy #| msgid "OSX Icon Resource" msgid "Mac OS X Icon" msgstr "Ресурс значків OSX" #: lclstrconsts.rsicon msgid "Icon" msgstr "Іконка" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "Зображення іконки не може бути порожнім" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "Зображення іконки має бути того самого формату" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "Не вдалося змінити формат зображення іконки" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "Зображення іконки має бути того самого розміру" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "Не вдалося змінити розмір іконки" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "Іконка не має поточного зображення" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "Межа неактивного вікна" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "Заголовок неактивного вікна" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "Заголовок неактивного вікна" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "%s Індекс %d поза діапазоном 0 .. %d" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "Індекс поза діапазоном Cell[Col=%d Row=%d]" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "Фон повідомлення" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "Текст повідомлення" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "Вставка" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "Неправильна Дата : %s" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "Неправильна Дата: %s. Має бути між %s та %s" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "неправильний потік об'єкту Форми" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "Неправильне значення властивості" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "Неправильний формат потоку" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "%s вже зіставлено з %s" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "Joint Picture Expert Group" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "Остання" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "Зелений" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "Індекс списку поза діапазоном (%d)" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "Список має бути порожнім" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "Коричнево-малиновий" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "Перервати" #: lclstrconsts.rsmball msgid "&All" msgstr "&Всі" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "Скасувати" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "&Закрити" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "&Довідка" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "&Знехтувати" #: lclstrconsts.rsmbno msgid "&No" msgstr "&Ні" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "Ні для всіх" #: lclstrconsts.rsmbok msgid "&OK" msgstr "&ОК" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "&Відкрити" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "&Повтор" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "&Зберегти" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "&Розблокувати" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "&Так" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "Так для &Всіх" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "Світло-сірий" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "Панель меню" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "Меню" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "Підсічене меню" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "Текст меню" #: lclstrconsts.rsmodified msgid " modified " msgstr " змінений" #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "Сиваво-зелений" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "Ідентифікація" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "Підтвердження" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "Спеціальний" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "Помилка" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "Відомості" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "Попередження" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "Темно-синій" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "Наступний" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "Жоден" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "Неправильний файл сітки" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "Об'єкт не є widgetset. Перевірте, чи був доданий модуль \"interfaces\" до програмних частин uses." #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "Оливковий" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "Виберіть дату" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "Растрове зображення" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "Чорно-біле зображення (PBM)" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "Напівтонове зображення (PGM)" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "Переносна мережева графіка (PNG)" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "Кольорове зображення (PPM)" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "Відправити" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "%s%sНатисніть 'OK' щоб проігнорувати і ризикнути втратити дані.%sНатисніть 'Скасувати' для закриття програми." #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "Попередній" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "Властивості %s не існує" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "Пурпуровий" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "-dograb (лише під X11), запуск під налаголжувачем може спричинити неявний -nograb, використайте -dograb щоб перевизначити. Потрібен QT_DEBUG." #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "-graphicssystem param, задає бекенд, який буде використовуватись для екранних віджетів та QPixmaps. Доступні опції: native, raster та opengl. OpenGL все ще нестабільний." #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "-nograb, вказує Qt щоб він ніколи не захоплював мишку чи клавіатуру. Потрібен QT_DEBUG." #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "-reverse, виставляє напрямок макету програми на Qt::RightToLeft." #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "-session session, відновлює програму з попереднього сеансу." #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "-style style або -style=style, задає стиль GUI програми. Можливі значення: motif, windows, та platinum. Якщо ви зібрали Qt з додатковими стилями ябо маєте додаткові стилі як плагіни вони будуть доступні для опцій командного рядка -style. ПРИМІТКА: Не всі стилі доступні на всіх платформах. Якщо параметр style не існує Qt запустить програму з типовим стилем (windows)." #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "-stylesheet stylesheet або -stylesheet=stylesheet, задає програмі Список Стилів. Значення повинне бути шляхом до файлу що містить Список Стилів. Note: Відносні URLs в файлі Списку Стилів сприймаються відносно шляху до файлу Списку Стилів." #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "-sync (лише під X11), перемикає в снхронний режим налагодження." #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "-widgetcount, друкує налагоджувальне повідомлення в кінці про кількість незнищених віджетів та максимальну кількість віджетів, що існували в той же час." #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "-bg or -background color, задає типовий колір фону та палітру програми (обчислюються світлі на темні відтінки)." #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "-btn або -button color, задає типовий колір кнопок." #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "-cmap, змушує програму встановити карту приватних кольорів на 8-бітний дисплей." #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "-display display, задає дисплей Іксів (типовим є $DISPLAY)." #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "-fg або -foreground color, задає типовий колір переднього плану." #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "-fn або -font font, визначає шрифт для програми. Шрифт повинен бути вказаний використовуючи X-логічний опис шрифту." #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "-geometry geometry, задає клієнтську геометрію першого показаного вікна." #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "-im, задає сервер методу вводу (аналогічно до задання змінної оточення XMODIFIERS)." #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "-inputstyle, визначає як ввід вставляється в заданий віджет, наприклад onTheSpot вносить ввід прямо в віджет, тоді як overTheSpot робить так, що ввід з'являється в вікні, що плаває над віджетом і не вставляється поки редагування не завершено." #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "-name name, задає назву програми." #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "-ncols count, обмежує кількість кольорів, розміщних в кольоровому кубі на 8-бітному дисплеї, якщо програма використовує специфікацію кольору QApplication::ManyColor. Якщо кількість рівна 216 тоді використовується кольоровий куб 6x6x6 (тобто 6 рівнів червоного, 6 зеленого, та 6 синього); для інших значень використовується куб приблизно пропорційний до 2x3x1." #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "-title title, задає заголовок програми." #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "-visual TrueColor, змушує програму використовувати TrueColor visual на 8-бітному дисплеї." #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "Команда Endupdate, хоча ніякого оновлення не проводиться" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "Неможливо зберегти зображення під час оновлення" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "Неможливо почати оновлення під час оновлення полотна" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "Червоний" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "Оновити" #: lclstrconsts.rsreplace msgid "Replace" msgstr "Замінити" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "Замінити все" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "Ресурс %s не знайдено" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "Смуга прокрутки" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "Властивості смуги прокручування виходять поза діапазон" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "Вибрати колір" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "Вибрати шрифт" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "Срібний" #: lclstrconsts.rssize msgid " size " msgstr " розмір " #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "Небесно-синій" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "Синьо-зелений" #: lclstrconsts.rstext msgid "Text" msgstr "Текст" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "Тегований формат файлу зображення" #: lclstrconsts.rstpanelaccessibilitydescription msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "Не можу завантажити шрифт за замовчуванням" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "Невідома помилка, повідомте розробників" #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "Невідоме розширення файлу зображення" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "Невідомий формат зображення" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "Непідтримуваний тип растрового малюнку." #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "Непідтримуваний формат буферу обміну: %s" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr " УВАГА: Знайдено %d не звільнених контекстів пристроїв, список див. нижче:" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr " УВАГА: Знайдено %d не звільнених GDIObject, список див. нижче:" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr " УВАГА: В черзі залишилось %d повідомлень! Я їх видаляю" #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr " УВАГА: Залишилось %d структур TimerInfo, я їх звільняю" #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr " УВАГА: Знайдено %s не видалених LM_PAINT/LM_GtkPAINT посилань на повідомлення." #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "Білий" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "Тільки цілі слова" #: lclstrconsts.rswin32error msgid "Error:" msgstr "Помилка:" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "Попередження:" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "Вікно" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "Межі вікна" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "Текст вікна" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "Жовтий" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "Не можна дати фокус вимкненому або невидимому вікну" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "Дублювати меню" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "Неправильне створення дії" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "Неправильне перерахування дій" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "Неправильна реєстрація дії" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "Скасування реєстрації невірної дії" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "Невірний набір символів по масці \"%s\"!" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "Невірний розмір зображення" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "Невірний індекс ImageList" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "Індекс меню поза діапазоном" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "MenuItem вказує на nil" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "Підменю не в меню" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "Alt+" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "BkSp" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "Ctrl+" #: lclstrconsts.smkcdel msgid "Del" msgstr "Del" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "Вниз" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "End" #: lclstrconsts.smkcenter msgid "Enter" msgstr "Enter" #: lclstrconsts.smkcesc msgid "Esc" msgstr "Esc" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "Home" #: lclstrconsts.smkcins msgid "Ins" msgstr "Ins" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "Вліво" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "Meta+" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "PgDn" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "PgUp" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "Вправо" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "Shift+" #: lclstrconsts.smkcspace msgid "Space" msgstr "Пробіл" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "Tab" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "Вгору" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "Немає MDI форми." #: lclstrconsts.snotimers msgid "No timers available" msgstr "Немає доступних таймерів" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "Невірний тип маркера: очікується %s" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "Невірне число з плаваючою крапкою: %s" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "Невірне ціле число: %s" #: lclstrconsts.sparlocinfo #, fuzzy #| msgid " (at %d,%d, stream offset %.8x)" msgid " (at %d,%d, stream offset %d)" msgstr " (на %d,%d, зміщення потоку %.8x)" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "Значення байта незавершене" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "Незавершений рядок" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "Невірний символ маркера: очікувався %s, але знайдений %s" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "Невірний тип маркера: очікувався %s, але знайдений %s" doublecmd-0.5.8/language/lcl/lclstrconsts.sk.po0000644000175000017500000011345512250635657020600 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: lclstrconsts\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-02 16:22+0100\n" "PO-Revision-Date: 2008-11-16 19:50+0100\n" "Last-Translator: Slavko \n" "Language-Team: Slovenský \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: KBabel 1.11.4\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "Prehliadač %s%s%s nie je spustiteľný." #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "Prehliadač %s%s%s nenájdený." #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "Chyba·pri·vykonávaní·%s%s%s:%s%s" #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "nemožno nájsť prehliadač HTML." #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "Databáza pomocníka %s%s%s nemohla nájsť súbor %s%s%s." #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "Makro %s v BrowserParams bude nahradené URL." #: lclstrconsts.ifsalt msgid "Alt" msgstr "Alt" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "Ctrl" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "Backspace" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "Zrušiť" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "Veľkým" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "Vyčistiť" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "Prvok" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "Konvertovať" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "Zmazať" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "Dole" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "End" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "Escape" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "Spustiť" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "Hanja" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "Pomoc" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "Home" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "Insert" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "Junja" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "Kana" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "Ľavé tlačítko myši" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "ľavý Win kláves" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "Stredné tlačítko·myši" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "Menu" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "Ďalej" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "Numlock" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "Numerická klávesnica %d" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "Kláves Pause" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "Tlačiť" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "Pred" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "Pravé tlačítko·myši" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "pravý Win kláves" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "Vybrať" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "Shift" #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "Snímka" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "Medzerník" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "Tab" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "Neznámy" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "Zdroj %s nenájdený" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "" #: lclstrconsts.rsacontrolcannothaveitselfasparent #, fuzzy #| msgid "A control can't have itself as parent" msgid "A control can't have itself as a parent" msgstr "Prvok nemôže mať sám seba za rodiča" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "Všetky súbory (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "" #: lclstrconsts.rsbackward msgid "Backward" msgstr "Spätný" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "Bitmapy" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "" #: lclstrconsts.rsblank msgid "Blank" msgstr "Prázdne" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "Kalkulačka" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "Zrušiť" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "Nemožno zamerať" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "Plátno nedovoľuje kreslenie" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "Citlivé na veľkosť" #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "" #: lclstrconsts.rscursor msgid "Cursor" msgstr "Kurzor" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "Vlastné ..." #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "povolenia používateľ skupina veľkosť dátum čas" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "Zmazať záznam?" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "Delete" #: lclstrconsts.rsdirection msgid "Direction" msgstr "Smer" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "A&dresár" #: lclstrconsts.rsdocking msgid "Docking" msgstr "Dokovanie" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "Zdvojený formát ikony." #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "Upraviť" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "Chyba" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "Chyba vytvárania kontextu zariadenie pre %s.%s" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "Chyba v LCL:" #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "Nastala chyba v %s na %sAdresa %s%s Rámec %s" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "Chyba čítania %s%s%s: %s" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "Chyba pri ukladaní bitmapy." #: lclstrconsts.rsexception msgid "Exception" msgstr "Výnimka" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "Adresár musí existovať" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "Adresár \"%s\" neexistuje." #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "Súbor \"%s\" už existuje. Prepísať?" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "Súbor musí existovať" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "Súbor \"%s\" neexistuje." #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "Súbor \"%s\" nie·je·zapisovateľný." #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "Súbor nie je zapisovateľný" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "Uložiť súbor ako" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "Otvoriť existujúci súbor" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "Prepísať súbor?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "Cesta musí existovať" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "Cesta \"%s\" neexistuje." #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "Výber adresára" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(súbor nenájdený: \"%s\")" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "Súborové informácie" #: lclstrconsts.rsfind msgid "Find" msgstr "Hľadať" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "Hľadať ďalej" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "Prvý" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "FixedCols nemôže byť >= ColCount" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "FixedRows nemôže byť >= RowCount" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "Chyba streamovania formulára \"%s\": %s" #: lclstrconsts.rsforward msgid "Forward" msgstr "" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "" #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "" #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "" #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "Súbor mriežky neexistuje" #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "Index mriežky mimo rozsahu." #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "GroupIndex nemmôže byť menší ako GroupIndex predchádzajúcej položky menu" #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "Filter:" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "História:" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "" #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "" #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "" #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "" #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "" #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "" #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "" #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "" #: lclstrconsts.rsgtkoptionsync msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "" #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "%s: Už je registrovaný" #: lclstrconsts.rshelpcontextnotfound #, fuzzy #| msgid "Help Context not found" msgid "A help database was found for this topic, but this topic was not found" msgstr "Kontextová pomoc nenájdená" #: lclstrconsts.rshelpdatabasenotfound #, fuzzy #| msgid "Help Database not found" msgid "There is no help database installed for this topic" msgstr "Databáza·pomoci nenájdená" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "Chyba pomoci" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "Kontextová pomoc %s nenájdená." #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "Kontextová pomoc %s nenájdená v databáze %s%s%s." #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "Databáza pomoci %s%s%s nenašla zobrazovač pre stránku pomocníka typu %s" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "Databáza pomoci %s%s%s nenájdená" #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "Kľúčové slovo pomoci %s%s%s nenájdené." #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "Kľúčové·slovo·pomoci·%s%s%s nenájdené v databáze %s%s%s." #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "Uzol pomocníka %s%s%s nemá databázu pomocníka" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "Nenájdený pomocník pre riadok %d, stĺpec %d %s." #: lclstrconsts.rshelpnohelpnodesavailable #, fuzzy #| msgid "No help nodes available" msgid "No help entries available for this topic" msgstr "Nie sú dostupné žiadne uzly pomoci" #: lclstrconsts.rshelpnotfound #, fuzzy #| msgid "Help not found" msgid "No help found for this topic" msgstr "Pomoc nenájdená" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "%s: Neregistrovaný" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "Chyba selektora pomoci" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "Nie je zobrazovač pre pomoc typu %s%s%s" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "Chyba zobrazovača pomoci" #: lclstrconsts.rshelpviewernotfound #, fuzzy #| msgid "Help Viewer not found" msgid "No viewer was found for this type of help content" msgstr "Zobrazovač pomoci nenájdený" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "" #: lclstrconsts.rsicns msgid "Mac OS X Icon" msgstr "" #: lclstrconsts.rsicon msgid "Icon" msgstr "Ikona" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "Obrázok ikony nemôže byť prázdny" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "Obrázok ikony musí mať rovnaký formát" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "Nemožno zmeniť formát obrázka ikony" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "Obrázok ikony musí mať rovnakú veľkosť" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "Nemožno zmeniť veľkosť obrázka ikony" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "Ikona nemá aktuálny obrázok" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "%s Index %d presahuje hranicu 0 .. %d" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "Index mimo rozsahu Bunka[Col=%d Row=%d]" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "Insert" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "Neplatný dátum: %s" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "Neplatný dátum: %s. Musí byť medzi %s a %s" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "neplatný prúd objektu Form" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "Neplatná hodnota vlastnosti" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "Neplatný formát streamu" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "%s už je priradený k %s" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "Posledný" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "Index zoznamu prekračuje hranice (%d)" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "Zoznam musí byť prázdny" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "Prerušiť" #: lclstrconsts.rsmball msgid "&All" msgstr "&Všetko" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "Zrušiť" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "&Zatvoriť" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "&Pomoc" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "&Ignorovať" #: lclstrconsts.rsmbno msgid "&No" msgstr "&Nie" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "Nie pre všetky" #: lclstrconsts.rsmbok msgid "&OK" msgstr "&OK" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "&Opakovať" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "Án&o" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "Án&o pre všetky" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "Menu" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "" #: lclstrconsts.rsmodified msgid " modified " msgstr ".. zmenené" #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "Potvrdenie" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "Vlastné" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "Chyba" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "Informácia" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "Upozornenie" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "Ďalší" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "Neplatný súbor mriežky" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "Neexistuje objekt widgetsetu. Prosím skontrolujte, či je jednotka \"interfaces\" pridaná do klauzuly uses programu." #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "Výber dátumu" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "Pixmap" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "Portable BitMap" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "Portable GrayMap" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "Portable Network Graphic" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "Portable PixMap" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "za" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok #, fuzzy #| msgid "%s%sPress Ok to ignore and risk data corruption.%sPress Cancel to kill the program." msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "%s%sStlačte OK pre ignorovanie a risk porušenia dát.%sStlačte Zrušiť pre zabitie programu." #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "Pred" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "Vlastnosť %s neexistuje" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "" #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "" #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "" #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "" #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "" #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "" #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "" #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "" #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "" #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "" #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "" #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "" #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "" #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "" #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "" #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "" #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "" #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "" #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "" #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "" #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "Koniec aktualizácie, ale aktualizácia nie je vykonávaná" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "Nemožno uložiť obrázok počas aktualizácie" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "Nemožno začať aktualizáciu všetkého, počas aktualizácie len plátna" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "Obnoviť" #: lclstrconsts.rsreplace msgid "Replace" msgstr "Nahradiť" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "Nahradiť všetko" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "Zdroj %s nenájdený" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "Vlastnosť ScrollBar mimo rozsahu" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "Výber farby" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "Výber fontu" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "" #: lclstrconsts.rssize msgid " size " msgstr "..veľkosť " #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "" #: lclstrconsts.rstext msgid "Text" msgstr "Text" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "" #: lclstrconsts.rstpanelaccessibilitydescription msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "Nemožno načítať predvolený font" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "Neznáma chyba, prosím ohláste túto chybu" #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "Neznáma prípona obrázku" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "Nepodporovaný formát bitmapy" #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "Nepodporovaný formát schránky: %s" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr " UPOZORNENIE: Existuje %d neuvoľnených DCs, detailný výpis nasleduje:" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr " UPOZORNENIE: Existuje %d neuvoľnených GDIObjects, detailný výpis nasleduje:" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr " UPOZORNENIE: Vo fronte ostáva %d správ! Uvoľním ich" #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr " UPOZORNENIE: Ostáva %d štruktúr TimerInfo, uvoľním ich" #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr " UPOZORNENIE: Ostáva %s neodstránených správ LM_PAINT/LM_GtkPAINT." #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "Len celé slová" #: lclstrconsts.rswin32error msgid "Error:" msgstr "Chyba:" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "Upozornenie:" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "Nemôžem zamerať vypnuté alebo neviditeľné okno" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "Duplikované menu" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "Neplatné akcia vytvorenia" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "Neplatné·akcia vymenovania" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "Neplatné·akcia registrácie" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "Neplatné·akcia odregistrovania" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "Množina znakov v maske \"%s\" nei je platná!" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "Neplatná veľkosť obrázku" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "Neplatný index ImageList" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "Index menu mimo rozsahu" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "MenuItem je nil" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "Podmenu nie je v menu" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "" #: lclstrconsts.smkcdel msgid "Del" msgstr "" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "Dole" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "End" #: lclstrconsts.smkcenter msgid "Enter" msgstr "" #: lclstrconsts.smkcesc msgid "Esc" msgstr "" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "Home" #: lclstrconsts.smkcins msgid "Ins" msgstr "" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "" #: lclstrconsts.smkcspace msgid "Space" msgstr "" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "Tab" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "Nie je MIDI formulár" #: lclstrconsts.snotimers msgid "No timers available" msgstr "Nie sú dostupné žiadne časovače" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "Zlý typ tokenu: očakávaný %s" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "Neplatné číslo s pohyblivou rádovou čiarkou: %s" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "Neplatné celé číslo: %s" #: lclstrconsts.sparlocinfo msgid " (at %d,%d, stream offset %d)" msgstr "" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "Neukončená bytová hodnota" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "Neukončený reťazec" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "Zlý symbol tokenu: očakávaný bol %s, ale nájdený bol %s" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "Zlý typ tokenu: očakávaný bol %s , ale nájdený bol %s" doublecmd-0.5.8/language/lcl/lclstrconsts.tr.po0000644000175000017500000013077112250635657020610 0ustar alexxalexxmsgid "" msgstr "" "Last-Translator:Ahmet Çağlar \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Project-Id-Version: \n" "POT-Creation-Date: \n" "PO-Revision-Date: 2013-08-11 00:06+0200\n" "Language-Team: \n" "MIME-Version: 1.0\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "Tarayıcı %s%s%s çalıştırılabilir değil." #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "Tarayıcısı %s%s%s bulunamadı." #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "Yürütülürken hata oluştu %s%s%s:%s%s" #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "HTML tarayıcı bulunamıyor." #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "Yardım veritabanı %s%s%s dosyası bulamadı %s%s%s." #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "TarayıcıDeğişkenleri içindeki %s makro(komut dizisi) URL ile değiştirilecek." #: lclstrconsts.ifsalt msgid "Alt" msgstr "Alt" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "Ctrl" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "Kabul et" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "uygulama tuşu" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "Geri Al" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "İptal" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "Büyük harf" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "Temizle" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "Denetim" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "Dönüştür" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "Sil" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "Aşağı" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "Bitiş" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "Çık" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "Çalıştır" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "Son" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "Hanja" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "Yardım" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "Başa git" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "Ekle" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "Junja" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "Kana" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "Sol fare düğmesi" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "Sol" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "Sol pencere tuşu" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "fare orta düğmesi" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "Menü" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "Modu Değiştir" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "Sonraki" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "Dönüştürülmez" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "Numlock" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "Sayısal tuş takımı %d" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "Durdurma tuşu" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "Yazdır" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "Önceki" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "Sağ fare düğmesi" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "Giriş" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "Sağ" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "sağ pencere tuşu" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "Kaydırma" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "Seçim" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "Üstkarakter" #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "Anlık görüntü" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "Boşluk tuşu" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "Sekme" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "Bilinmeyen" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "Yukarı" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "yürütemez" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "Kaynak %s bulunamadı" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "program dosyası bulunamadı %s" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "3D Koyu gölge" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "3D ışık" #: lclstrconsts.rsacontrolcannothaveitselfasparent #, fuzzy #| msgid "A control can't have itself as parent" msgid "A control can't have itself as a parent" msgstr "Bir denetim, kendikendini üstdenetim(parent) olarak gösteremez" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "Etkin kenarlık" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "Etkin resim yazısı" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "Tüm dosyalar (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "Uygulama Çalışma Alanı" #: lclstrconsts.rsaquacolorcaption #, fuzzy #| msgid "White" msgctxt "lclstrconsts.rsaquacolorcaption" msgid "Aqua" msgstr "Beyaz" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "Masaüstü" #: lclstrconsts.rsbackward msgid "Backward" msgstr "Geriye" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "Bitmap resimleri" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "Siyah" #: lclstrconsts.rsblank msgid "Blank" msgstr "Boş" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "Mavi" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "Düğme yüzü" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "Düğme Vurgusu" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "Düğme Gölgesi" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "Düğme metni" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "Hesap makinesi" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "İptal" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "Odaklanamıyor" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "Tuval(canvas) çizmeye izin vermiyor" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "Resim yazısı metni" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "Büyük/küçük harfe duyarlı" #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "Sınıfın denetimini '%s' bir alt sınıf '%s' kontrol edemez" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "Hiçbir üst pencere '%s' denetimi yok" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "Krem rengi" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "gdb (hata ayıklama) yakalanabilir yaratma hatası:" #: lclstrconsts.rscursor msgid "Cursor" msgstr "İmleç" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "Özel" #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "Varsayılan" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "kullanıcı grup boyut tarih zaman izinleri" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "Kayıt silinsin mi?" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "Sil" #: lclstrconsts.rsdirection msgid "Direction" msgstr "Yön" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "&Dizin" #: lclstrconsts.rsdocking msgid "Docking" msgstr "Yerleştir" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "Çift simge biçimi" #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "Düzenle" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "Tüm dosya ara" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "Hata" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "için aygıt içerik oluşturma hatası %s.%s" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "LCL'de HATA:" #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "Adres Çerçeve %s de %s Hata %s%s oluştu %s" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "Okunurken hata %s%s%s: %s" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "Bitmap verisini kaydederken hata." #: lclstrconsts.rsexception msgid "Exception" msgstr "İstisna" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "Dizin mevcut olmalıdır" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "Dizin \"% s\" mevcut değil." #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "Bu dosya \"%s\" zaten var. Üzerine yazılsın mı?" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "Dosya mevcut olmalıdır" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "Bu dosya \"%s\" mevcut değil." #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "Bu dosya \"%s\" yazılabilir değil." #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "Dosya yazılabilir değil" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "Dosyayı farklı kaydet" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "Var olan dosyayı aç" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "Dosyanın üzerine yazılsın mı?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "Yol var olmak zorunda" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "Bu yol \"%s\" mevcut değil." #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "Dizin seç" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(dosya bulunamadı: \"%s\")" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "Dosya bilgisi" #: lclstrconsts.rsfind msgid "Find" msgstr "Bul" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "Daha fazla bul" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "İlk" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "Sabit Sütunlar olamaz >= Sütun sayısı" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "Sabit satır olamaz >= Satır sayısı" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "Biçim" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "Biçim akışı \"%s\" hatası: %s" #: lclstrconsts.rsforward msgid "Forward" msgstr "İleri doğru" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "Fuşya(eflatun)" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "--gdk-hata ayıklama göstergeleri GDK'ya özgü izleme/hata ayıklama iletilerini açar." #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "-gdk-hata ayıklama göstergelerini gösterme GDK'ya özgü izleme/hata ayıklama iletilerini kapatır." #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "Grafik Değişim Biçimi" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "--g-Önemli-uyarılar Gtk+/GDK tarafından üretilen hatalar ve uyarılar uygulamayı sonlandıracak." #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "Etkin Alt başlık geçişi" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "Etkin olmayan Alt başlık geçişi" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "Grafik" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "Gri" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "Gri metin" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "Yeşil" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "Izgara dosyası mevcut değil" #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "Izgara dizini sınırın dışında." #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "Grupdizin değeri, önceki menü bileşeninin Grupdizin değerinden az olamaz" #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "Süzgeç:" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "Geçmiş:" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "--sınıf sınıfadı Bir programın sınıfı büyük harfle başlayan program adıyla aynı ise, Xt geleneklerini izler. Örneğin, gimp için sınıf adı \"Gimp\". Eğer --sınıf belirtilmişse, program sınıfı \"sınıfadı\" olacak şekilde ayarlanacaktır." #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "--gtk-hata ayıklama göstergeleri Gtk+'a özgü izleme/hata ayıklama iletilerini açar." #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "--gösterici h:s:d Belirtilen X sunucusuna bağlanır, \"h\" bilgisayar adı, \"s\" sunucu numarası (genellikle 0), ve \"d\" ekran numarasıdır (genellikle yazılmaz). Eğer --gösterici belirtilmezse, GÖSTERİCİ ortam değişkeni kullanılır." #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "--gtk-Modül modül Belirtilen modülü başlangıçta yükler." #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "--Program adı Program adı olarak ayarlayın \"progname\".Eğer belirtilmezse,Program adı StrUTF8(0) değişkenine ayarlanır." #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "--gtk-hayır-hata ayıklama işaretleri Gtk+'a özgü izleme/hata ayıklama iletilerini kapatır." #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "--lcl-hayır-geçici Kalıcı formlar için geçici komut ayarlı değil" #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "--hayır-xshm X paylaşımlı bellek genişletmesini kullanmayı kapatır." #: lclstrconsts.rsgtkoptionsync #, fuzzy #| msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediatey after the protocol request that generated the error has been processed by the X server." msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "--sync Xserver bağlantısı sağlandıktan sonra Xeşzamanlama (Gerçek,görüntü) işlevini çağırır. Bu X protokol hatalarını ayıklamayı kolaylaştırır, çünkü X istek tamponlama kapalı olacaktır ve X hataları hata oluşturan protokol isteği X sunucu tarafından işlendikten hemen sonra alınacaktır." #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "%s: Zaten kaydedilmiş" #: lclstrconsts.rshelpcontextnotfound #, fuzzy #| msgid "Help Context not found" msgid "A help database was found for this topic, but this topic was not found" msgstr "Yardım bağlamı bulunamadı" #: lclstrconsts.rshelpdatabasenotfound #, fuzzy #| msgid "Help Database not found" msgid "There is no help database installed for this topic" msgstr "Yardım veritabanı bulunamadı" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "Yardım hatası" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "Yardım bağlamı %s bulunamadı." #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "Yardım bağlamı %s veritabanı içinde bulunamadı %s%s%s." #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr " Yardım veritabanı %s%s%s türündeki yardım sayfası için bir görüntüleyici bulamadı %s" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "%s%s%s Yardım veritabanı bulunamadı" #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "%s%s%s yardım anahtar sözcüğü bulunamadı." #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "%s%s%s Yardım anahtar sözcüğü %s%s%s veritabanı içinde bulunamadı." #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "%s%s%s yardım düğümü yardım veritabanına sahip değil" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "%s'nin satır %d, sütun %d için yardım bulunamadı." #: lclstrconsts.rshelpnohelpnodesavailable #, fuzzy #| msgid "No help nodes available" msgid "No help entries available for this topic" msgstr "Kullanılabilir yardım düğümü yok" #: lclstrconsts.rshelpnotfound #, fuzzy #| msgid "Help not found" msgid "No help found for this topic" msgstr "Yardım bulunamadı" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "%s: kaydedilmemiş" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "Yardım seçici hatası" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "%s%s%s yardım türü için bir görüntüleyici yok" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "Yardım görüntüleyici hatası" #: lclstrconsts.rshelpviewernotfound #, fuzzy #| msgid "Help Viewer not found" msgid "No viewer was found for this type of help content" msgstr "Yardım görüntüleyici bulunamadı" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "Vurgula" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "Metni vurgula" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "Güçlü Vurgula" #: lclstrconsts.rsicns #, fuzzy #| msgid "OSX Icon Resource" msgid "Mac OS X Icon" msgstr "OSX Simge Kaynağı" #: lclstrconsts.rsicon msgid "Icon" msgstr "Simge" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "Simge görüntüsünü boş olamaz" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "Simge görüntüsü aynı biçimde olmalıdır" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "Simge görüntüsünün biçimini değiştiremezsiniz" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "Simge görüntüsü aynı boyutta olmalıdır" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "Simge resminin boyutunu değiştiremezsiniz" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "Hiçbir geçerli görüntü simgesi yok" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "Etkin olmayan kenarlık" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "Etkin olmayan renk resim yazısı" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "Etkin olmayan resim yazısı" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "%s Dizin %d sınırların dışında 0.. %d" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "Dizin hücre aralıği dışında Cell[Col=%d Row=%d]" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "Arkapalan bilgisi" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "Metin bilgisi" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "Ekle" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "Geçersiz tarih : %s" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "Geçersiz tarih : %s. %s ve %s arasında olmalı" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "Geçersiz Biçim nesnesi akışı" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "Geçersiz özellik değeri" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "Geçersiz akış biçimi" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "%s zaten %s ile birleştirilmiş durumda" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "Ortak resim uzman grubu" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "Sonuncu" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "Açık yeşil" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "Liste dizini sınırları aşıyor (%d)" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "Liste boş olmak zorunda" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "Kestane rengi" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "Vazgeç" #: lclstrconsts.rsmball msgid "&All" msgstr "Tümü" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "İptal" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "Kapat" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "&Yardım" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "&Yoksay" #: lclstrconsts.rsmbno msgid "&No" msgstr "&Hayır" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "Tümüne hayır" #: lclstrconsts.rsmbok msgid "&OK" msgstr "&Tamam" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "Aç" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "&Tekrar dene" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "Kaydet" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "Kilidi aç" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "&Evet" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "Tümüne evet" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "Orta gri" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "Menü çubuğu" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "Menü" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "Menüyü Vurgula" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "Menü metni" #: lclstrconsts.rsmodified msgid " modified " msgstr " değiştirilmiş " #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "Para yeşili" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "Kimlik Doğrula" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "Onayla" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "Özel" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "Hata" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "Bilgi" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "Uyarı" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "Lacivert" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "Sonraki" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "Hiçbiri" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "Geçerli bir ızgara dosyası değil" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "Parçacık nesnesi yok. Lütfen \"arayüzleri\" biriminin programın kullanır bölümüne eklenip eklenmediğini denetleyin." #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "Zeytin yeşili" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "Bir tarih seç" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "Piksel haritası" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "Taşınabilir BitMap" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "Taşınabilir GrayMap" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "Taşınabilir ağ grafiği" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "Taşınabilir PixMap" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "Postala" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok #, fuzzy #| msgid "%s%sPress Ok to ignore and risk data corruption.%sPress Cancel to kill the program." msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "%s%s Yoksaymak ve verinin bozulması riskiyle devam etmek için Tamam'a basın. %s Programı sonlandırmak için İptal'e basın." #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "Önceki" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "Özelliği %s mevcut değil" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "Mor(erguvan)" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "-yakalama (Sadece altında X11),yakalayamamaya bir hata ayıklayıcı altında çalışan örtülü içerik neden olabilir,kullanın - geçersiz kılmak için yakala.onarmak için (QT_DEBUG)ihtiyaç var." #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "-grafiksistemdeğişkenleri,ekranda kullanılmak üzere arka uç ayar grafik bileşenleri ve QPixmaps.Yerel kullanılabilir seçenekler,tarama örüntüsü ve opengl.OpenGL hala kararsız." #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "-yakalama yok,QT bunu asla yakalayamadığını fare veya klavye gerektiğini söyler. QT_DEBUG lazım." #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "-tersine, Qt::RightToLeft için uygulamanın düzeni yönünü ayarlar" #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "-Oturum oturum, uygulamayı bir önceki oturumdan yükler." #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "-Tarzı tarzı veya -tarzı=tarzı,uygulama grafik stilini ayarlar.Olası değerler motifi mümkündür,pencere,ve platin.eğer ek tarzla ile Qt derlenmiş ise veya ek olarak tarz eklentileri varsa bunlar tarzlar komut satırı seçeneğinde sunulacak.NOT:Tüm tarzlar tüm platformlarda mevcut.Tarz değişkenleri(parametreler) yoksa Qt bir uygulama başlatacak Varsayılan ortak stil ile (pencereler)." #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "-tarzsayfası tarzsayfası veya -tarzsayfası=tarzsayfası, tarzsayfası uygulama ayarları.Bu değer için bir yol, Stil sayfasını içeren dosya yolu olmalıdır. Not: Bağıntılı Stil sayfası URL'leri dosya şuna bağlıdır Stil sayfası dosyasının yoluna" #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "-senkronize (Sadece altında X11), hata ayıklama için eşzamanlı moduna geçer" #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "-grafikbileşen sayısı hata ayıklama iletisi sonunda yazdırır, bozulmamış grafik bileşen sonu hakkında ve en fazla sayıda grafik bileşen aynı anda var." #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "-bg veya arka plan rengi,varsayılan arka plan rengini ayarlar ve bir uygulama paleti (açık ve koyu tonları hesaplanır)." #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "-btn veya -buton rengi, varsayılan düğme rengini ayarlar." #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "-cmap, uygulama 8-bitlik bir ekranda özel bir renk haritası yüklemeye neden olur." #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "-ekran ekran,x ekran ayarları ($EKRAN varsayılandır)." #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "-fg veya -ön plan rengi, Varsayılan ön plan rengini ayarlar." #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "-fn veya -yazı tipi yazı tipi, Uygulama yazı tipini tanımlar.Yazı tipi bir X mantıksal bir yazı tipi açıklaması kullanılarak belirtilmelidir." #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "-geometri geometri,gösterilen ilk pencerenin geometrisini istemci ayarlar." #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "-im, sunucuya giriş yöntemi ayarları\"(X DEĞİŞTİRİCİLER ortam değişkeni ayarına eşdeğerdir" #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "-giriştarzı,nasıl girileceğini tanımlar verilen grafik bileşen içine eklenir,Örneğin Nokta üzerindeki giriş grafik bileşenin doğrudan görünmesini sağlar,Nokta üzerinde giriş görünmesini sağlar iken grafik bileşen üzerinde kayan bir kutu ve düzenleme bitene kadar eklenmez." #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "adı adı, Uygulama adı ayarları" #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "-nsutunları sayısı,Ayrılmış renklerin sayısını sınırlar 8-bitlik ekranda bir renkli küp, eğer uygulama Q Uygulama kullanıyorsa:Birçok renk renk belirtimi.eğer 216 sayısı daha sonra ise, 6x6x6 bir renk küpün kullanıldığı(Yani 6 seviye kırmızı, 6 yeşil ve 6 mavi);diğer değerler için,bir küp yaklaşık 2 x 3 x 1 küp ile orantılı kullanılır." #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "-başlık başlık, Uygulama başlığı ayarlar." #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "-görsel GerçekRenk, gerçekrenkli görüntü 8 bit görüntü üzerinde kullanmak için uygulamayı zorlar." #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "Güncelleştirme yapılırken sonlandı, devam etmeyen bir güncelleştirme" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "Güncelleştirme devam ederken görüntü kaydedemezsiniz" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "Tümünü güncelle,tuval(canvas) güncellemesi devam ettiğinden başlayamaz" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "Kırmızı" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "Yenile" #: lclstrconsts.rsreplace msgid "Replace" msgstr "Değiştir" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "Tümünü değiştir" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "adlı kaynak %s bulunamadı" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "Kaydırma çubuğu" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "Kaydırma çubuğu özelliği sınırın dışında" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "Renk seç" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "Yazıtipi seç" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "Gümüş" #: lclstrconsts.rssize msgid " size " msgstr " boyut " #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "Gök mavisi" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "Deniz mavisi" #: lclstrconsts.rstext msgid "Text" msgstr "Metin" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "Etiketli Resim dosyası biçimi" #: lclstrconsts.rstpanelaccessibilitydescription msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "Varsayılan yazıtipi yüklenemiyor" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "Bilinmeyen hata, lütfen bu hatayı bildirin" #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "Bilinmeyen resim genişletmesi" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "Bilinmeyen resim biçimi" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "Desteklenmeyen bitmap biçimi." #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "Desteklenmeyen pano biçimi: %s" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr " UYARI: serbest %d bırakılmamış DCs var, ayrıntılı döküm aşağıda:" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr " UYARI: serbest %d bırakılmamış GDINesne var, ayrıntılı döküm aşağıda:" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr " UYARI: Kuyrukta %d mesaj kaldı! Onları serbest bırak" #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr " UYARI: Saat Bilgisi %d yapısı kaldı, onları serbest bırak" #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr " UYARI: kaldırılmamış %s LM_PAINT/LM_GtkBOYA mesaj bağlantısı kaldı." #: lclstrconsts.rswhitecolorcaption msgctxt "lclstrconsts.rswhitecolorcaption" msgid "White" msgstr "Beyaz" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "Yalnızca tam sözcükler" #: lclstrconsts.rswin32error msgid "Error:" msgstr "Hata:" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "Uyarı:" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "Pencere" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "Pencere çerçevesi" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "Pencere metni" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "Sarı" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "Etkisizleştirilmiş ya da görünmez pencerelere odaklanılamaz" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "Birbirinin aynı menüler" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "Geçersiz eylem yaratma" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "Geçersiz eylem sayımı" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "Geçersiz eylem kaydı" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "Geçersiz eylem kayıt silme işlemi" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "maskede \"%s\" ile gösterilen karakter geçerli değil!" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "Geçersiz görüntü boyutu" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "Geçersiz GörüntüListesi dizini" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "Menü dizini sınırın dışında" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "Menüöğesi yok" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "Alt-menü, menü içinde değil" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "Alt+" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "" #: lclstrconsts.smkcdel msgid "Del" msgstr "" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "Aşağı" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "Bitiş" #: lclstrconsts.smkcenter msgid "Enter" msgstr "" #: lclstrconsts.smkcesc msgid "Esc" msgstr "" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "Başa git" #: lclstrconsts.smkcins msgid "Ins" msgstr "" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "Sol" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "Sağ" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "" #: lclstrconsts.smkcspace msgid "Space" msgstr "" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "Sekme" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "Yukarı" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "MDI Pencere mevcut değil." #: lclstrconsts.snotimers msgid "No timers available" msgstr "Kullanılabilir zamanlayıcı yok" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "Yanlış belirteç tipi: % s bekleniyor" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "Geçersiz kayan nokta sayısı: %s" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "Geçersiz tamsayı: %s" #: lclstrconsts.sparlocinfo #, fuzzy #| msgid " (at %d,%d, stream offset %.8x)" msgid " (at %d,%d, stream offset %d)" msgstr " (at %d,%d, Akış uzaklığı %.8x)" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "Sonlandırılmamış bayt değeri" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "Sonlandırılmamış dizgi" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "Yanlış simge sembolü: %s bekleniyor ama %s bulundu" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "Yanlış tip sembolü: %s bekleniyor ama %s bulundu" doublecmd-0.5.8/language/lcl/lclstrconsts.cs.po0000644000175000017500000011575312250635657020573 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" "PO-Revision-Date: 2010-07-27 17:12+0100\n" "Last-Translator: Chronos \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Czech\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "Prohlížeč %s%s%s není spustitelný." #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "Prohlížeč %s%s%s nenalezen." #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "Chyba během spouštění %s%s%s:%s%s" #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "Nepodařilo se nalézt HTML prohlížeč." #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "Databáze nápovědy %s%s%s nemůže najít soubor %s%s%s." #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "Makro %s v BrowserParams bude nahrazeno URL." #: lclstrconsts.ifsalt msgid "Alt" msgstr "Alt" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "Ctrl" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "Přijmout" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "aplikační klávesa" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "Backspace" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "Zrušit" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "Velké písmena" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "Vyčistit" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "Ovládání" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "Převést" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "Smazat" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "Dolů" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "Konec" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "Escape" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "Vykonat" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "Konečný" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "Hanja" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "Nápověda" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "Domů" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "Vložit" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "Junja" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "Kana" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "Levé tlačítko myši" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "Doleva" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "levá klávesa windows" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "Prostřední tlačítko myši" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "Nabídka" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "Změna režimu" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "Další" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "Nepřevedeitelné" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "Numlock" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "Numerická klávesa %d" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "Klávesa pouza" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "Tisknout" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "Předchozí" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "Pravé tlačítko myši" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "Návrat" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "Doprava" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "pravá klávesa windows" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "Posouvat" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "Vybrat" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "Shift" #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "Snímek" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "Mezerník" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "Tab" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "Neznámé" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "Nahoru" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "nelze spustit %s" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "Zdroj %s nenalezen" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "soubor programu %s nenalezen " #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "3D tmavě stínová" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "3D světlo" #: lclstrconsts.rsacontrolcannothaveitselfasparent #| msgid "A control can't have itself as parent" msgid "A control can't have itself as a parent" msgstr "Prvek nemůže mít sebe jako rodiče" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "Aktivní okraj" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "Aktivní titulek" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "Všechny soubory (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "Pracovní prostředí aplikace" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "Vodní" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "Plocha" #: lclstrconsts.rsbackward msgid "Backward" msgstr "Nazpět" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "Bitové mapy" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "Černá" #: lclstrconsts.rsblank msgid "Blank" msgstr "Prázdné" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "Modrá" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "Povrch tlačítka" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "Zvýraznění tlačítka" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "Stín tlačítka" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "Text tlačítka" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "Kalkulačka" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "Zrušit" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "Nelze zaměřit" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "Plátno neumožňuje kreslení" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "Text titulku" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "Rozlišovat velká/malá" #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "Prvek třídy '%s' nemůže mít prvek třídy '%s' jako dítě" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "Prvek '%s' nemá rodičovské okno" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "Krémová" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "Vytvářím chytatelnou chybu gdb:" #: lclstrconsts.rscursor msgid "Cursor" msgstr "Ukazatel" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "Vlastní..." #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "Výchozí" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "oprávnění uživatel skupina velikost datum čas" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "Smazat záznam?" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "Smazat" #: lclstrconsts.rsdirection msgid "Direction" msgstr "Adresář" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "&Adresář" #: lclstrconsts.rsdocking msgid "Docking" msgstr "Ukotvení" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "Zdvojený formát ikony." #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "Upravit" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "Prohledat celý soubor" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "Chyba" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "Chyba vytváření kontextu zařízení %s.%s" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "CHYBA v LCL:" #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "Nastala chyba v %s na %sAdresa %s%s Rámec %s" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "Chyba čtení %s%s%s: %s" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "Chyba během ukládání bitmapy." #: lclstrconsts.rsexception msgid "Exception" msgstr "Vyjímka" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "Adresář musí existovat" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "Adresář \"%s\" neexistuje." #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "Soubor \"%s\" již existuje. Přepsat ?" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "Soubor musí existovat" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "Soubor \"%s\" neexistuje." #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "Soubor \"%s\" není zapisovatelný." #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "Soubor není zapisovatelný" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "Uložit soubor jako" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "Otevřít existující soubor" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "Přepsat soubor?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "Cesta musí existovat" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "Cesta \"%s\" neexistuje." #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "Vybrat adresář" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(soubor nenalezen: \"%s\")" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "Informace o souboru" #: lclstrconsts.rsfind msgid "Find" msgstr "Najít" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "Najít další" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "První" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "FixedCols nemůže být >= ColCount" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "FixedRows nemůže být >= RowCount" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "Formulář" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "Chyba zřetězení \"%s\" chyba: %s" #: lclstrconsts.rsforward msgid "Forward" msgstr "Vpřed" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "Fuksiová" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "" #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "" #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "Graphics Interchange Format" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "" #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "Grafika" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "Šedá" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "Šedý text" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "Zelená" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "Soubor mřížky neexistuje" #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "Index mřížky mimo rozsah." #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "GroupIndex nemůže být menší než předchozí GroupIndex položky menu" #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "Filtr:" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "Historie:" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "" #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "" #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "" #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "" #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "" #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "" #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "" #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "" #: lclstrconsts.rsgtkoptionsync msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "" #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "%s: Již zaregistrováno" #: lclstrconsts.rshelpcontextnotfound #, fuzzy #| msgid "Help Context not found" msgid "A help database was found for this topic, but this topic was not found" msgstr "Kontext nápovědy nenalezen" #: lclstrconsts.rshelpdatabasenotfound #, fuzzy #| msgid "Help Database not found" msgid "There is no help database installed for this topic" msgstr "Databáze nápovědy nenalezena" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "Chyba nápovědy" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "Kontext nápovědy %s nenalezen." #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "Kontext nápovědy %s nenalezen v databázi %s%s%s." #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "Databáze nápovědy %s%s%s nenalezla prohlížeč pro stránku nápovědy typu %s" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "Databáze nápovědy %s%s%s nenalezena" #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "Klíčové slovo %s%s%s nenalezeno." #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "Klíčové slovo %s%s%s nebylo nalezeno v Databázi %s%s%s" #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "Uzel nápovědy %s%s%s nemá Databázi nápovědy" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "Nápověda nenalezena pro řádek %d, sloupce %d pro %s." #: lclstrconsts.rshelpnohelpnodesavailable #, fuzzy #| msgid "No help nodes available" msgid "No help entries available for this topic" msgstr "Uzly nápovědy nejsou dostupné" #: lclstrconsts.rshelpnotfound #, fuzzy #| msgid "Help not found" msgid "No help found for this topic" msgstr "Nápověda nenalezena" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "%s: Neregistrováno" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "Chyba výběru nápovědy" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "Pro typ %s%s%s není prohlížeč" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "Chyba prohlížeče nápovědy" #: lclstrconsts.rshelpviewernotfound #, fuzzy #| msgid "Help Viewer not found" msgid "No viewer was found for this type of help content" msgstr "Prohlížeč nápovědy nenalezen" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "Zvýraznění" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "Zvýrazněný text" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "" #: lclstrconsts.rsicns #, fuzzy #| msgid "OSX Icon Resource" msgid "Mac OS X Icon" msgstr "Zdroj ikony OSX" #: lclstrconsts.rsicon msgid "Icon" msgstr "Ikona" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "Obrázek ikony nemůže být prázdný" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "Obrázek ikony musí mít stejný formát" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "Nelze změnit formát obrázku ikony" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "Obrázek ikony musí mít stejnou velikost" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "Nelze změnit velikost obrázku ikony" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "Ikona nemá aktuálně obrázek" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "Neaktivní okraj" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "Neaktivní titulek" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "Neaktivní titulek" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "%s Index %d mimo rozsahy 0 .. %d" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "Index mimo rozsah Buňka[Sloupec=%d Řádek=%d]" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "Informační pozadí" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "Informační text" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "Vložit" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "Neplatný Datum: %s" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "Neplatný datum: %s. Musí být mezi %s a %s" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "neplatný proud objektu formuláře" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "Neplatná hodnota vlastnosti" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "Neplatný formát proudu" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "%s již je přidružen k %s" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "Joint Picture Expert Group" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "Poslední" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "Citrusová" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "Index seznamu překročil meze (%d)" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "Seznam musí být prázdný" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "Kaštanová" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "Přerušit" #: lclstrconsts.rsmball msgid "&All" msgstr "&Všechno" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "Zrušit" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "&Zavřít" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "&Nápověda" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "&Ignorovat" #: lclstrconsts.rsmbno msgid "&No" msgstr "&Ne" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "Ne všem" #: lclstrconsts.rsmbok msgid "&OK" msgstr "&OK" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "&Otevřít" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "&Znovu" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "&Uložit" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "&Udemknout" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "&Ano" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "Ano všem" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "Středně šedá" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "Lišta menu" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "Nabídka" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "Zvýraznění menu" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "Text menu" #: lclstrconsts.rsmodified msgid " modified " msgstr " upravený" #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "Peněžní zelená" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "Autentizace" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "Potvrzení" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "Volitelné" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "Chyba" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "Informace" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "Varování" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "Námořnická modř" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "Další" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "Žádné" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "Žádný platný soubor mřížky" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "Žádný objekt widgetsetu. Prosíme zkontrolujte, zda jednotka \"interfaces\" byla přidána do sekce uses programu." #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "Olivová" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "Vybrat datum" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "Pixmapa" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "Přenosná BitMapa" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "Přenositelná MapaŠedi" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "Portable Network Graphic" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "Přenositelná PixMapa" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "Odeslat" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "%s%sStiskněte OK k ignorování a riskování poškození dat.%sStiskněte Zrušit k zabití programu." #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "Předchozí" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "Vlastnost %s neexistuje" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "Fialová" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "" #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "" #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "" #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "" #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "" #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "" #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "" #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "" #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "" #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "" #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "" #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "" #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "" #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "" #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "" #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "" #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "" #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "" #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "" #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "" #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "Konec aktualizace zatímco žádná aktualizace nebyla v běhu" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "Nelze uložit obrázek zatímco běží aktualizace" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "Nelze začít vše aktualizovat, když se aktualizuje plátno" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "Červená" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "Obnovit" #: lclstrconsts.rsreplace msgid "Replace" msgstr "Nahradit" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "Nahradit vše" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "Zdroj %s nenalezen" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "Posuvník" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "Vlastnost posuvníku mimo rozsah" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "Zvolte barvu" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "Zvolte písmo" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "Stříbrná" #: lclstrconsts.rssize msgid " size " msgstr " velikost " #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "Nebeská modrá" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "Hluboká zelenomodrá" #: lclstrconsts.rstext msgid "Text" msgstr "Text" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "Označkovaný obrazový formát souboru" #: lclstrconsts.rstpanelaccessibilitydescription msgctxt "lclstrconsts.rstpanelaccessibilitydescription" msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgctxt "lclstrconsts.rstsplitteraccessibilitydescription" msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgctxt "lclstrconsts.rsttreeviewaccessibilitydescription" msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "Nelze načíst výchozí písmo" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "Neznámá chyba, prosíme nahlašte tuto chybu" #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "Neznámá přípona obrázku" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "Neznámý formát obrázku" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "Nepodporovaný formát bitmapy." #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "Nepodporovaný formát schránky: %s" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr "VAROVÁNÍ: Existuje %d neuvolněných DC, následuje podrobný popis:" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr "VAROVÁNÍ: Existuje %d neuvolněných GDIObjects, následuje podrobný popis:" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr " VAROVÁNÍ: Ve frontě zbývá %d zpráv! Vyprázdním je." #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr "VAROVÁNÍ: Zbývá %d TimerInfo struktur, Uvolním je" #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr "VAROVÁNÍ: Zbývá %s neodstraněných LM_PAINT/LM_GtkPAINT odkazů zpráv." #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "Bílá" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "Pouze celá slova" #: lclstrconsts.rswin32error msgid "Error:" msgstr "Chyba:" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "Varování:" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "Okno" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "Rámeček okna" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "Text okna" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "Žlutá" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "Nelze zaktivnit zakázané nebo neviditelné okno" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "Zdvojené menu" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "Neplatná vytvářecí akce" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "Neplatná výčtová akce" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "Neplatná registrační akce" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "Neplatná odregistrační akce" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "Znaková sada v masce \"%s\" není platná!" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "Neplatná velikost obrázku" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "Neplatný index ImageList" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "Index menu mimo rozsah" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "Položka menu je nil" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "Podmenu není v menu" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "Alt+" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "BkSp" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "Ctrl+" #: lclstrconsts.smkcdel msgid "Del" msgstr "Smazat" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "Dolů" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "Konec" #: lclstrconsts.smkcenter msgid "Enter" msgstr "Enter" #: lclstrconsts.smkcesc msgid "Esc" msgstr "Esc" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "Domů" #: lclstrconsts.smkcins msgid "Ins" msgstr "Vložit" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "Doleva" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "Meta+" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "PgDn" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "PgUp" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "Doprava" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "Shift+" #: lclstrconsts.smkcspace msgid "Space" msgstr "Mezerník" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "Tab" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "Nahoru" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "Nepřítomno žádné MDI okno." #: lclstrconsts.snotimers msgid "No timers available" msgstr "Nedostupné žádné časovače" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "Nesprávný typ symbolu: očekáváno %s" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "Neplatné desetinné číslo: %s" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "Neplatné celé číslo: %s" #: lclstrconsts.sparlocinfo #, fuzzy #| msgid " (at %d,%d, stream offset %.8x)" msgid " (at %d,%d, stream offset %d)" msgstr " (u %d,%d, posun proudu %.8x)" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "Nepřerušená bajtová hodnoty" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "Neukončený řetězec" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "Nesprávný symbol: Očekáváno %s, ale nalezeno %s" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "Nesprávný typ symbolu: Očekáváno %s, ale nalezeno %s" doublecmd-0.5.8/language/lcl/lclstrconsts.nl.po0000644000175000017500000011520412250635657020566 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" "PO-Revision-Date: 2007-10-03 22:04+0100\n" "Last-Translator: Marc Fokker \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "Browser %s%s%s niet uitvoerbaar" #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "Browser %s%s%s niet gevonden" #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "Fout tijdens uitvoeren van %s%s%s:%s%s" #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "Geen HTML browser kunnen vinden." #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "De help database %s%s%s heeft bestand %s%s%s niet kunnen vinden." #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "De macro %s in BrowserParams zal worden vervangen door de URL." #: lclstrconsts.ifsalt msgid "Alt" msgstr "Alt" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "Ctrl" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "Accepteer" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "toepassing sleutel" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "Backspace" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "Hoofdletter" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "Wissen" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "Controleer" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "Converteer" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "Neer" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "Eind" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "Escape" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "Uitvoeren" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "Laatste" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "Hanja" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "Help" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "Home" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "Junja" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "Kana" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "Muisknop Links" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "Links" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "linker windows toets" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "Muisknop Midden" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "Menu" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "Mode wijziging" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "Niet converteren" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "Numlock" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "Nummeriek deel %d" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "Pause toets" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "Druk af" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "Muisknop Rechts" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "Return" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "Rechts" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "rechter windows toets" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "Schuif" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "Selecteer" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "Shift" #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "Snapshot" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "Spatiebar" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "Tab" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "Onbekend" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "Omhoog" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "Resource %s is niet gevonden" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "" #: lclstrconsts.rsacontrolcannothaveitselfasparent #, fuzzy #| msgid "A control can't have itself as parent" msgid "A control can't have itself as a parent" msgstr "Een control kan niet zijn eigen ouder zijn" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "Alle bestanden (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "" #: lclstrconsts.rsbackward msgid "Backward" msgstr "Achteruit" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "Bitmaps" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "" #: lclstrconsts.rsblank msgid "Blank" msgstr "Spatie" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "Rekenmachine" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "Kan geen focus geven" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "Er kan op het canvas niet getekend worden" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "Hoofdletter gevoelig" #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "Maak een fout die door gdb opgevangen kan worden" #: lclstrconsts.rscursor msgid "Cursor" msgstr "" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "" #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "permissies gebruiker groep grootte datum tijd" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "Verwijder" #: lclstrconsts.rsdirection msgid "Direction" msgstr "Richting" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "&Map" #: lclstrconsts.rsdocking msgid "Docking" msgstr "Docking" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "" #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "Fout tijdens het maken van een DC voor %s.%s" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "FOUT in LCL" #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "Er is een fout opgetreden in %s op %sAdres %s%s Frame %s" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "Fout tijdens het lezen %s%s%s: %s" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "Fout tijdens opslaan van bitmap." #: lclstrconsts.rsexception msgid "Exception" msgstr "Fout" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "Directory moet bestaan" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "De map \"%s\" bestaat niet." #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "Het bestand \"%s\" bestaat al. Overschrijven?" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "Bestand moet bestaan" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "Het bestand \"%s\" bestaat niet." #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "Het bestand \"%s\" kan niet geschreven worden." #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "Kan bestand niet schrijven" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "Bestand opslaan als" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "Open een bestaand bestand" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "Bestand overschrijven?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "Het pad moet bestaan" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "Het pad \"%s\" bestaat niet." #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "Kies map" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(bestand niet gevonden: \"%s\")" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "Bestandsinformatie" #: lclstrconsts.rsfind msgid "Find" msgstr "Zoek" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "Zoek meer" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "FixedCols kan niet >= ColCount" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "FixedRows kan niet >= RowCount" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "\"%s\" fout: %s bij het streamen van form." #: lclstrconsts.rsforward msgid "Forward" msgstr "Vooruit" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "--gdk-debug flags Zet bepaalde GDK trace/debug berichten aan." #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "--gdk-no-debug flags Zet bepaalde GDK trace/debug berichten uit." #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "--g-fatal-warnings De applicatie stop bij waarschuwingen en fouten gegenereerd door GtK+/GDK." #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "Grid bestand bestaat niet" #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "Rooster index buiten bereik" #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "De GroupIndex kan niet minder zijn dan de GroupIndex van een vorig item." #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "Filter:" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "Historie:" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "--class klassenaam Volgens de Xt conventies, is de klasse van een prograam de naam van dat programma met de eerste letter als kapitaal. Bijv. the klassenaam voor gimp is \"Gimp\". Als de --class optie is meegegeven, wordt de klasse van het programma gezet op \"klassenaam\"." #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "--gtk-debug flags Zet bepaalde GtK+ trace/debug berichten aan." #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "--display h:s:d Start het programma op de genoemde X server, waarbij \"h\" de hostnaam is, \"s\" het nummer van de server (meestal 0), en \"d\" is het display nummer (vaak weggelaten). Als --display niet is meegegeven, wordt de DISPLAY omgevings variabele gebruikt." #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "--gtk-module module Laad de betreffende module tijdens het starten." #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "" #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "--gtk-no-debug flags Zet bepaalde GtK+ trace/debug berichten uit." #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "--lcl-no-transient Zet geen overdraagbare volgorde voor modale schermen" #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "--no-xshm Maak geen gebruik van de X Shared Memory Extensie." #: lclstrconsts.rsgtkoptionsync #, fuzzy #| msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediatey after the protocol request that generated the error has been processed by the X server." msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "--sync Roep XSynchronize (display, True) aan na verbinding met de Xserver. Dit maakt het debuggen van X protocol fouten eenvoudiger, doordat X aanvragen buffering uitstaat en X fouten direct ontvangen worden nadat de aanvraag door de Xserver is behandeld." #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "%s: Al vastgelegd" #: lclstrconsts.rshelpcontextnotfound #, fuzzy #| msgid "Help Context not found" msgid "A help database was found for this topic, but this topic was not found" msgstr "Help Context niet gevonden" #: lclstrconsts.rshelpdatabasenotfound #, fuzzy #| msgid "Help Database not found" msgid "There is no help database installed for this topic" msgstr "Help Database niet gevonden" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "Help Fout" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "Help context %s niet gevonden." #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "Help context %s niet gevonden in Database %s%s%s." #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "Help Database %s%s%s heeft geen viewer gevonden voor help pagina van type %s" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "Help Database %s%s%s niet gevonden" #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "Help sleutelwoord %s%s%s niet gevonden." #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "Help sleutelwoord %s%s%s niet gevonden in Database %s%s%s." #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "Help node %s%s%s heeft geen Help Database" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "Geen help gevonden voor regel %d, kolom %d van %s. " #: lclstrconsts.rshelpnohelpnodesavailable #, fuzzy #| msgid "No help nodes available" msgid "No help entries available for this topic" msgstr "Geen help nodes beschikbaar" #: lclstrconsts.rshelpnotfound #, fuzzy #| msgid "Help not found" msgid "No help found for this topic" msgstr "Help niet gevonden" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "%s: Niet vastgelegd" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "Help Selectie fout" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "Er is geen viewer voor help type %s%s%s" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "Help Viewer Fout" #: lclstrconsts.rshelpviewernotfound #, fuzzy #| msgid "Help Viewer not found" msgid "No viewer was found for this type of help content" msgstr "Help Viewer niet gevonden" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "" #: lclstrconsts.rsicns msgid "Mac OS X Icon" msgstr "" #: lclstrconsts.rsicon msgid "Icon" msgstr "Icon" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "%s Index %d valt buiten de grenzen 0 .. %d" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "Index buiten de grenzen Cell[Col=%d Ro=%d]" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "Invoegen" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "Ongeldige datum: %s" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "Ongeldige datum: %s. Het moet liggen tussen %s en %s" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "Ongeldige form objectstream" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "Ongeldige eigenschap waarde" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "Omgeldig stream format" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "%s is al verbonden met %s" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "Lijst index overschreidt grenzen (%d)" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "Lijst moet leeg zijn" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "Afbreken" #: lclstrconsts.rsmball msgid "&All" msgstr "&Alles" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "Annuleer" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "&Sluiten" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "&Help" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "&Negeer" #: lclstrconsts.rsmbno msgid "&No" msgstr "&Nee" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "Nee op alles" #: lclstrconsts.rsmbok msgid "&OK" msgstr "&OK" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "&Opnieuw" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "&Ja" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "Ja op &Alles" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "Menu" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "" #: lclstrconsts.rsmodified msgid " modified " msgstr " gewijzigd " #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "Bevestiging" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "Eigen" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "Fout" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "Informatie" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "Waarschuwing" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "Volgende" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "Geen geldig grid bestand" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "Geen widgetset object. Controleer of the unit \"interface\" is toegevoegd aan de \"uses\" van het programma." #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "Kies een datum" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "Pixmap" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "Portable Network Graphic" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok #, fuzzy #| msgid "%s%sPress Ok to ignore and risk data corruption.%sPress Cancel to kill the program." msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "%s%sDruk op Ok om te negeren, hierbij kunnen gegevens verloren gaan.%sDruk op Cancel om het programma te annuleren." #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "Vorige" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "Eigenschap %s bestaat niet" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "" #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "" #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "" #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "" #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "" #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "" #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "" #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "" #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "" #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "" #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "" #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "" #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "" #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "" #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "" #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "" #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "" #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "" #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "" #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "" #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "" #: lclstrconsts.rsreplace msgid "Replace" msgstr "Vervang" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "Vervang alles" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "Resource %s is niet gevonden" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "Schuifbalk eigenschap buiten bereik" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "Kies een kleur" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "Kies een font" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "" #: lclstrconsts.rssize msgid " size " msgstr " afmeting " #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "" #: lclstrconsts.rstext msgid "Text" msgstr "Tekst" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "" #: lclstrconsts.rstpanelaccessibilitydescription msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "Kan het standaard font niet laden" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "Onbekende Fout, rapporteer alstublieft deze fout" #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "Onbekende extensie voor plaatje" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "Niet ondersteund bitmap formaat." #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "Niet ondersteund klembord formaat: %s" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr " WAARSCHUWING: Er zijn nog %d DCs niet vrijgegeven, een gedetailleerde dump volgt:" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr " WAARSCHUWING: Er zijn nog %d GDIObject niet vrijgegeven, een gedetailleerde dump volgt:" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr " WAARSCHUWING: Er staan nog %d berichten in de queue! Deze worden nu vrijgegeven" #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr " WAARSCHUWING: Er zijn %d TimerInfo structuren overgebleven. Deze worden nu vrijgegeven" #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr " WAARSCHUWING: Er zijn %s LM_PAINT/LM_GtkPAINT berichten niet verwijderd." #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "Alleen hele woorden" #: lclstrconsts.rswin32error msgid "Error:" msgstr "Fout:" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "Waarschuwing:" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "Kan geen focus geven aan een onzichtbaar of disabled scherm" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "Dubbele menus" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "Ongeldige aktie aangemaakt" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "Ongeldige aktie opsomming" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "Ongeldige aktie registratie" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "Ongeldige aktie de-registratie" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "De characterset in mask \"%s\" is niet geldig!" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "Ongeldig formaat voor afbeelding " #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "Ongeldige index van ImageList" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "Index van menu buiten de grenzen" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "MenuItem is nil" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "Submenu niet in menu" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "" #: lclstrconsts.smkcdel msgid "Del" msgstr "" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "Neer" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "Eind" #: lclstrconsts.smkcenter msgid "Enter" msgstr "" #: lclstrconsts.smkcesc msgid "Esc" msgstr "" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "Home" #: lclstrconsts.smkcins msgid "Ins" msgstr "" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "Links" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "Rechts" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "" #: lclstrconsts.smkcspace msgid "Space" msgstr "" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "Tab" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "Omhoog" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "Geen MDI formulier aanwezig" #: lclstrconsts.snotimers msgid "No timers available" msgstr "Geen timers beschikbaar" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "" #: lclstrconsts.sparlocinfo msgid " (at %d,%d, stream offset %d)" msgstr "" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "" doublecmd-0.5.8/language/lcl/lclstrconsts.pl.po0000644000175000017500000011137512250635657020575 0ustar alexxalexxmsgid "" msgstr "" "Last-Translator: AlbercikCD\n" "PO-Revision-Date: 2007-01-14 00:01+0100\n" "Project-Id-Version: lclstrconsts\n" "Language-Team: \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.3\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "POT-Creation-Date: \n" "MIME-Version: 1.0\n" "X-Poedit-Language: Polish\n" "X-Poedit-Country: POLAND\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "" #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "" #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "" #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "" #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "" #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "" #: lclstrconsts.ifsalt msgid "Alt" msgstr "" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "Anuluj" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "Konwertuj" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "Pomoc" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "Lewy przycisk myszy" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "Środkowy przycisk myszy" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "Prawy przycisk myszy" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "" #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "Nie znaleziono zasobu: %s" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "" #: lclstrconsts.rsacontrolcannothaveitselfasparent #, fuzzy #| msgid "A control can't have itself as parent" msgid "A control can't have itself as a parent" msgstr "Kontrolka nie może być sama swoim rodzicem" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "Wszystkie pliki (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "" #: lclstrconsts.rsbackward msgid "Backward" msgstr "" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "" #: lclstrconsts.rsblank msgid "Blank" msgstr "Pusty" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "Kalkulator" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "Anuluj" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "Nie można ustawić ogniska." #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "Canvas nie pozwala na rysowanie" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "" #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "Błąd przy tworzeniu \"gdb catchable\":" #: lclstrconsts.rscursor msgid "Cursor" msgstr "" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "" #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "uprawnienia użytkownik grupa rozmiar data czas" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "" #: lclstrconsts.rsdirection msgid "Direction" msgstr "" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "" #: lclstrconsts.rsdocking msgid "Docking" msgstr "" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "" #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "Błąd" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "Błąd przy tworzeniu \"device context\" dla %s.%s" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "BŁĄD w LCL: " #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "Błąd w %s przy %sAdres %s%s Ramka %s" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "Błąd odczytu %s%s%s: %s" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "" #: lclstrconsts.rsexception msgid "Exception" msgstr "Wyjątek" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "Katalog musi istnieć" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "Katalog \"%s\" nie istnieje." #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "Plik \"%s\" już istnieje. Nadpisać ?" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "Plik musi istnieć" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "Plik \"%s\" nie istnieje." #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "Plik \"%s\" nie jest zapisywalny." #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "Plik nie jest zapisywalny" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "Zapisz plik jako" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "Otwórz istniejący plik" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "Chcesz nadpisać plik?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "Ścieżka musi istnieć" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "Ścieżka \"%s\" nie istnieje." #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "Wybierz katalog" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(nie znaleziono pliku: \"%s\")" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "Informacja o pliku" #: lclstrconsts.rsfind msgid "Find" msgstr "" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "FixedCols nie może być >= ColCount" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "FixedRows nie może być >= RowCount" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "Błąd przy zapisie formularza do strumienia \"%s\": %s" #: lclstrconsts.rsforward msgid "Forward" msgstr "" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "--gdk-debug flags Włącz specificzne dla GDK komunikaty śledzenia/odpluskwiania." #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "--gdk-no-debug flags Wyłącz specificzne dla GDK komunikaty śledzenia/odpluskwiania." #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "--g-fatal-warnings Ostrzerzenia i błędy Gtk+/GDK zatrzymają aplikację." #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "Plik siatki nie istnieje" #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "" #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "GroupIndex nie może być mniejszy niż poprzedniego elementu menu" #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "Filtr:" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "Historia:" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "--class classname Zgodnie z konwencją Xt klasę programu tworzy jego nazwa z pierwszą wielką literą. Np. nazwą klasy dla programu gimp jest \"Gimp\". Jeśli --class jest podane, klasa programu będzie ustawiona na \"classname\"." #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "--gtk-debug flags Włącz specyficzne dla Gtk+ komunikaty śledzenia/odpluskwiania." #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "--display h:s:d Połącz z podany mserwerem X; \"h\" jest nazwą hosta, \"s\" jest numerem serwera (zwykle 0), a \"d\" jest numerem ekranu (zwyle pomijanym). Jeśli --display nie jet podane, użyję zmienna środowiaka DISPLAY." #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "--gtk-module module Ładuje podany moduł przy starcie." #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "" #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "--gtk-no-debug flags Wyłącz specyficzne dla Gtk+ komunikaty śledzenia/odpluskwiania." #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "--lcl-no-transient Nie ustawiaj nietrwałej kolejności dla modalnych formularzy" #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "--no-xshm Wyłącz używanie X Shared Memory Extension." #: lclstrconsts.rsgtkoptionsync #, fuzzy #| msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediatey after the protocol request that generated the error has been processed by the X server." msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "--sync Wywołaj XSynchronize (display, True) Po połączeniu z serwerem X. To ułatwia odpluskwianie protokołu X, ponieważ buforowanie żądań X będzie wyłączonei błędy X będą odbierane natychmiast po przetworzeniu przez serwer X żądania, które spowodowało błąd." #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "" #: lclstrconsts.rshelpcontextnotfound msgid "A help database was found for this topic, but this topic was not found" msgstr "" #: lclstrconsts.rshelpdatabasenotfound msgid "There is no help database installed for this topic" msgstr "" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "" #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "" #: lclstrconsts.rshelpnohelpnodesavailable msgid "No help entries available for this topic" msgstr "" #: lclstrconsts.rshelpnotfound #, fuzzy #| msgid "Help not found" msgid "No help found for this topic" msgstr "Nie znaleziono pomocy" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "" #: lclstrconsts.rshelpviewernotfound msgid "No viewer was found for this type of help content" msgstr "" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "" #: lclstrconsts.rsicns msgid "Mac OS X Icon" msgstr "" #: lclstrconsts.rsicon msgid "Icon" msgstr "" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "%s Indeks %d przekracza zakres 0 .. %d" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "Indeks poza zakresem Cell[Col=%d Row=%d]" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "błędny strumień obiektu formularza" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "Błędna wartość właściwości" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "Błędny format strumienia" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "%s jest już skojarzony z %s" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "Indeks listy poza zakresem (%d)" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "Lista musi być pusta" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "Porzuć" #: lclstrconsts.rsmball msgid "&All" msgstr "&Wszystkie" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "Anuluj" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "Z&amknij" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "P&omoc" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "&Zignoruj" #: lclstrconsts.rsmbno msgid "&No" msgstr "&Nie" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "Nie na wszystkie" #: lclstrconsts.rsmbok msgid "&OK" msgstr "&OK" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "&Ponów próbę" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "&Tak" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "Tak na &wszystkie" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "" #: lclstrconsts.rsmodified msgid " modified " msgstr " zmodyfikowany" #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "Potwierdzenie" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "Inny" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "Błąd" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "Informacja" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "Ostrzeżenie" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "Nieprawidłowy plik siatki" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "" #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "Wybierz datę" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "" #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "Właściwość %s nie istnieje" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "" #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "" #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "" #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "" #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "" #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "" #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "" #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "" #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "" #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "" #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "" #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "" #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "" #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "" #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "" #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "" #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "" #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "" #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "" #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "" #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "Odśwież" #: lclstrconsts.rsreplace msgid "Replace" msgstr "Zamień" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "Zamień wszystko" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "Nie znaleziono zasobu: %s" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "Właściwość ScrollBar'u poza zakresem" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "Wybierz kolor" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "Wybierz czcionkę" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "" #: lclstrconsts.rssize msgid " size " msgstr " rozmiar " #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "" #: lclstrconsts.rstext msgid "Text" msgstr "" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "" #: lclstrconsts.rstpanelaccessibilitydescription msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "Nie można załadować domyślnej czcionki" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "" #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "Nieznane rozszerzenie pliku obrazka" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "Nieobsługiwany format bitmapy." #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "Nieobsługiwany format schowka: %s" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr " UWAGA: Pozostały %d niezwolnione DC, szczegółowy zrzut poniżej:" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr " UWAGA: Pozostało %d niezwolnionych GDIObject, szczegółowy zrzut poniżej:" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr " UWAGA: Pozostało %d komunikatów w kolejce! Zostaną usunięte." #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr " UWAGA: Pozostało %d struktur TimerInfo zostaną usunięte" #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr " UWAGA: Pozostały %s nieusunięte dowiązania do LM_PAINT/LM_GtkPAINT." #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "" #: lclstrconsts.rswin32error msgid "Error:" msgstr "Błąd:" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "Ostrzeżenie:" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "Nie można ustawić ogniska na wyłączone lub niewidzialne okno" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "Zdublowane menu" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "Błędne tworzenie akcji" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "Błędna enumeracja akcji" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "Błędna rejestracja akcji" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "Błędne wyrejestrowanie akcji" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "Błędny rozmiar obrazka" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "Błędny indeks ImageList" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "Indeks menu poza zakresem" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "Element menu ma wartość nil" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "Podmenu nie jest w menu" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "" #: lclstrconsts.smkcdel msgid "Del" msgstr "" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "" #: lclstrconsts.smkcenter msgid "Enter" msgstr "" #: lclstrconsts.smkcesc msgid "Esc" msgstr "" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "" #: lclstrconsts.smkcins msgid "Ins" msgstr "" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "" #: lclstrconsts.smkcspace msgid "Space" msgstr "" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "" #: lclstrconsts.snotimers msgid "No timers available" msgstr "Brak dostępnych timerów" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "" #: lclstrconsts.sparlocinfo msgid " (at %d,%d, stream offset %d)" msgstr "" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "" doublecmd-0.5.8/language/lcl/lclstrconsts.lt.po0000644000175000017500000012222612250635657020576 0ustar alexxalexxmsgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2010-05-23 21:32+0300\n" "Project-Id-Version: lclstrconsts\n" "Language-Team: Lietuvių \n" "X-Generator: Lokalize 1.0\n" "MIME-Version: 1.0\n" "Last-Translator: Valdas Jankūnas \n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "Naršyklė %s%s%s nėra vykdomasis failas." #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "Naršyklė %s%s%s nerasta." #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "Įvyko klaida startuojant %s%s%s:%s%s" #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "Nepavyko rasti HTML naršyklės." #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "Žinyno duomenų bazė %s%s%s neranda failo %s%s%s." #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "Makrokomanda %s naršyklės parametruose bus pakeista URL reikšme." #: lclstrconsts.ifsalt msgid "Alt" msgstr "Alt" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "Ctrl" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "Accept" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "Programos klavišas" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "Backspace" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "Cancel" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "Caps Lock" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "Clear" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "Ctrl" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "Convert" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "Delete" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "Down" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "End" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "Esc" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "Execute" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "Final" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "Hanja" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "Help" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "Home" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "Insert" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "Junja" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "Kana" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "Kairys peles klavišas" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "Left" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "Kairysis windows klavišas" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "Vidurinis pelės klavišas" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "Menu" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "Mode Change" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "Next" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "Nonconvert" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "Numlock" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "Numpad %d" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "Pause" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "Print" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "Prior" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "Dešinys pelės klavišas" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "Return" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "Right" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "Dešinysis windows klavišas" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "Scroll" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "Select" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "Shift" #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "Snapshot" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "Space" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "Tab" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "Nežinomas" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "Up" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "Resursas %s nerastas" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "3D tamsumos šešėlis" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "3D šviesuma" #: lclstrconsts.rsacontrolcannothaveitselfasparent #, fuzzy #| msgid "A control can't have itself as parent" msgid "A control can't have itself as a parent" msgstr "Valdiklio tėvas negali būti pats valdiklis" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "Aktyvus rėmelis" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "Veikiamoji antraštė" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "Visi failai (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "Programos darbo laukas" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "Žydra" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "Darbalaukis" #: lclstrconsts.rsbackward msgid "Backward" msgstr "Atgal" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "Bitmap" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "Juoda" #: lclstrconsts.rsblank msgid "Blank" msgstr "Tuščias" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "Mėlyna" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "Mygtuko paviršius" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "Mygtuko paryškinimas" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "Mygtuko šešėlis" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "Mygtuko tekstas" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "Skaičiuotuvas" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "Atsisakyti" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "Suaktyvinti negalima" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "Į „Canvas“ negalima piešti" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "Antraštės tekstas" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "Paisyti raidžių lygio" #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "Kreminė" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "Kuriama GDB aptinkama klaida:" #: lclstrconsts.rscursor msgid "Cursor" msgstr "Žymeklis" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "Naudotojo…" #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "Numatytasis" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "leidimai naudotojas grupė dydis data laikas" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "Ištrinti įrašą?" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "Delete" #: lclstrconsts.rsdirection msgid "Direction" msgstr "Kryptis" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "&Aplankas" #: lclstrconsts.rsdocking msgid "Docking" msgstr "Pritvirtinimas" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "Piktogramos formatai dubliuojasi." #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "Keisti" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "Ieškoti visame faile" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "Klaida" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "Įvyko klaida kuriant įrenginio turinį, skirtą %s.%s" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "LCL klaida:" #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "%s įvyko klaida:%sadresas %s%s, kadras %s" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "Įvyko klaida skaitant %s%s%s: %s" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "Įrašant rastrinį paveikslą įvyko klaida." #: lclstrconsts.rsexception msgid "Exception" msgstr "Išimtinė situacija" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "Aplankas turi egzistuoti" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "Aplankas „%s“ neegzistuoja." #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "Toks failas „%s“ jau yra. Rašyti ant viršaus?" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "Failas turi egzistuoti" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "Failas „%s“ neegzistuoja." #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "Failas „%s“ nėra skirtas rašymui." #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "Failas ne rašymui" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "Įrašyti failą kaip" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "Atverti egzistuojanti failą" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "Perrašyti failą?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "Kelias turi egzistuoti" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "Kelias „%s“ neegzistuoja." #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "Nurodykit aplanką" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(failas nerastas: „%s“)" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "Informacija apie failą" #: lclstrconsts.rsfind msgid "Find" msgstr "Ieškoti" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "Ieškoti toliau" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "Pirmasis" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "„FixedCols“ reikšmė negali būti lygi ar didesnė nei „ColCount“" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "„FixedRows“ reikšmė negali būti lygi ar didesnė nei „RowCount“" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "Forma" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "Formą siunčiant srautu „%s“ įvyko klaida: %s" #: lclstrconsts.rsforward msgid "Forward" msgstr "Pirmyn" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "Purpurinė" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "--gdk-debug žymės Įjungiami nurodyti GDK sekimo/derinimo pranešimai." #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "--gdk-no-debug žymės Išjungiami nurodyti GDK sekimo/derinimo pranešimai." #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "--g-fatal-warnings GTK+ ar GDK sugeneravus perspėjimą arba klaidą, programa bus sustabdyta." #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "Veikiamosios antraštės gradientas" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "Įprastos antraštės gradientas" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "Pilka" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "Neveiksnus tekstas" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "Žalia" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "Tinklelio failas neegzistuoja" #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "Tinklelio indeksas peržengia ribas" #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "„GroupIndex“ negali būti mažesnis už ankstesnių menių punktų „GroupIndex“" #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "Filtras:" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "Istorija:" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "--class klasės_pavadinimas Pagal Xt susitarimą, programos klasė yra programos pavadinimas, kuriame pirmoji raidė yra didžioji. Pavyzdžiui: GIMP programos klasė yra „Gimp“. Jei --class nurodytas, tai klasės pavadinimas bus priskirtas „classname“." #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "--gtk-debug žymės Įjungiami nurodyti GTK+ sekimo/derinimo pranešimai." #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "--display h:s:d Prisijungti prie nurodyto X serverio, čia „h“ yra hostname, „s“ - serverio numeris (paprastai 0), ir „d“ - ekrano numeris (dažniausia praleidžiamas). Jei --display nenurodytas, tada naudojamas DISPLAY aplinkos kintamasis." #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "--gtk-module modulis Starto metu įkelti nurodytą modulį." #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "--name programa Programos pavadinimą nustatyti į „programa“. Jei nenurodyta, tai programos pavadinimas bus nustatytas į ParamStrUTF8(0)." #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "--gtk-no-debug žymės Išjungiami nurodyti GTK+ sekimo/derinimo pranešimai." #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "--lcl-no-transient Modalinių formų eilę nedaryti trumpalaikę." #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "--no-xshm Nenaudoti „X Shared Memory“ plėtinio." #: lclstrconsts.rsgtkoptionsync #| msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediatey after the protocol request that generated the error has been processed by the X server." msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "--sync Kai XServer ryšys sukurtas, vykdyti „XSynchronize (display, True)“. Tai padarys lengvesnį X protokolo klaidų derinimą, nes bus išjungtas X kreipinių buferis ir X serveriui apdorojant protokolo kreipinį įvykusi klaida bus gauta iškart." #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "%s: jau yra registruotas" #: lclstrconsts.rshelpcontextnotfound #, fuzzy #| msgid "Help Context not found" msgid "A help database was found for this topic, but this topic was not found" msgstr "Žinyno turinys nerastas" #: lclstrconsts.rshelpdatabasenotfound #, fuzzy #| msgid "Help Database not found" msgid "There is no help database installed for this topic" msgstr "Žinyno duomenų bazė nerasta" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "Žinyno klaida" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "Žinyno turinys %s nerastas." #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "Žinyno turinys %s duomenų bazėje %s%s%s nerastas." #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "Žinyno duomenų bazė %s%s%s nerado žiūryklės %s tipo žinyno lapui." #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "Žinyno duomenų bazė %s%s%s nerasta." #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "Žinyno raktažodis %s%s%s nerastas." #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "Žinyno raktažodis %s%s%s duomenų bazėje %s%s%s nerastas." #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "Žinyno mazgas %s%s%s neturi žinyno duomenų bazės." #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "Žinyne nėra duomenų eilutei %d, stulpeliui %d šio %s." #: lclstrconsts.rshelpnohelpnodesavailable #, fuzzy #| msgid "No help nodes available" msgid "No help entries available for this topic" msgstr "Žinyno nėra" #: lclstrconsts.rshelpnotfound #, fuzzy #| msgid "Help not found" msgid "No help found for this topic" msgstr "Žinynas nerastas" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "%s: neregistruotas" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "Žinyno išrinkėjo klaida" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "Nerasta žiūryklė %s%s%s žinyno tipui." #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "Žinyno žiūryklės klaida" #: lclstrconsts.rshelpviewernotfound #, fuzzy #| msgid "Help Viewer not found" msgid "No viewer was found for this type of help content" msgstr "Žinyno žiūryklė nerasta" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "Paryškinimas" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "Paryškintas tekstas" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "Indikatorius" #: lclstrconsts.rsicns #, fuzzy #| msgid "OSX Icon Resource" msgid "Mac OS X Icon" msgstr "OSX piktogramos resursas" #: lclstrconsts.rsicon msgid "Icon" msgstr "Piktograma" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "Piktogramos paveikslėlis neturi būti tuščias" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "Piktogramos ir naujasis paveikslėliai turi būti to paties formato" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "Neina pakeisti piktogramos paveikslo formato" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "Piktogramos ir naujasis paveikslėliai turi būti to paties dydžio" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "Neina pakeisti piktogramos paveikslo dydžio" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "Veikiamoji piktograma neturi paveikslėlio" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "Neaktyvus rėmelis" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "Neaktyvi antraštė" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "Neaktyvi antraštė" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "%s indeksas %d peržengia ribas 0 .. %d" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "Langelio [stulpelis = %d, eilutė = %d] indeksas peržengia ribas" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "Fonas informacijai" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "Informacijos tekstas" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "Insert" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "Klaidinga data: %s" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "Klaidinga data: %s. Ji turi būti tarp %s ir %s" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "klaidingas formos objekto srautas" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "Klaidinga savybės reikšmė" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "Klaidingas srauto formatas" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "%s jau yra asocijuotas su %s" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "Joint Picture Expert Group" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "Paskutinysis" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "Citrininė" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "Sąrašo indeksas peržengė ribas (%d)" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "Sąrašas turi būti tuščias" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "Kaštoninė" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "Nutraukti" #: lclstrconsts.rsmball msgid "&All" msgstr "&Visi" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "Atsisakyti" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "&Užverti" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "Žin&ynas" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "&Ignoruoti" #: lclstrconsts.rsmbno msgid "&No" msgstr "&Ne" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "Visada ne" #: lclstrconsts.rsmbok msgid "&OK" msgstr "&Tinka" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "At&verti" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "Ka&rtoti" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "Į&rašyti" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "&Atsklęsti" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "&Taip" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "Vis&ada taip" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "Vidutiniškai pilka" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "Meniu juosta" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "Menu" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "Paryškintas meniu" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "Menu tekstas" #: lclstrconsts.rsmodified msgid " modified " msgstr " pakeista " #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "Žalsva" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "Tapatumo nustatymas" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "Patvirtinimas" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "Naudotojo" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "Klaida" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "Informacija" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "Perspėjimas" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "Tamsiai mėlyna" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "Kitas" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "Jokia" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "Klaidingas tinklelio failas" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "Ne valdiklio objektas. Patikrinkite ar modulis „interfaces“ yra paminėtas programos naudojamų modulių sąraše." #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "Alyvuogių" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "Nurodykite datą" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "Pixmap" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "Portatyvus BitMap" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "Portatyvus GreyMap" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "Portable Network Graphic" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "Portatyvus PixMap" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "Tolesnis" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok #| msgid "%s%sPress Ok to ignore and risk data corruption.%sPress Cancel to kill the program." msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "%s%sPaspaudę „Tinka“ ignoruosite, tačiau rizikuosite duomenimis.%sPaspaudę „Atsisakyti“ sustabdysite programą." #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "Ankstesnis" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "Savybė %s neegzistuoja" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "Purpurinė" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "" #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "" #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "" #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "" #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "" #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "" #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "" #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "" #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "" #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "" #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "" #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "" #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "" #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "" #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "" #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "" #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "" #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "" #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "" #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "" #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "„Endupdate“, tačiau niekas neatnaujinama" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "Neina įrašyti paveikslo, nes jis atnaujinamas" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "Visko atnaujinti negalima kai atnaujinamas tik „Canvas“" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "Raudona" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "Atnaujinti" #: lclstrconsts.rsreplace msgid "Replace" msgstr "Pakeisti" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "Pakeisti visus" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "Resursas %s nerastas" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "Slinkties juosta" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "Savybės „ScrollBar“ vertė peržengia ribas" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "Nurodykit spalvą" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "Nurodykit šriftą" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "Sidabrinė" #: lclstrconsts.rssize msgid " size " msgstr " dydis " #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "Dangaus žydrumo" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "Tamsiai žydra" #: lclstrconsts.rstext msgid "Text" msgstr "Tekstas" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "„Tagged Image File Format“" #: lclstrconsts.rstpanelaccessibilitydescription msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "Nepavyko įkelti numatytą šriftą" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "Nežinoma klaida, prašau praneškite kūrėjams apie šią klaidą." #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "Nežinomas paveikslo plėtinys" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "Nežinomas paveikslo formatas" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "Nepalaikomas rastrinio paveikslo formatas." #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "Nepalaikomas iškarpinės formatas: %s" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr " Perspėjimas: liko %d neatlaisvinti „DC“, išsamiau:" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr " Perspėjimas: liko %d neatlaisvinti „GDIObject“, išsamiau:" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr " Perspėjimas: eilėje dar yra %d pranešimų, jie bus pašalinti." #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr " Perspėjimas: dar liko %d „TimerInfo“ struktūrų, jos bus sunaikintos." #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr " Perspėjimas: liko %s nepašalintos nuorodos į LM_PAINT/LM_GtkPAINT pranešimus." #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "Balta" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "Tik visų žodžių" #: lclstrconsts.rswin32error msgid "Error:" msgstr "Klaida:" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "Perspėjimas:" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "Langas" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "Lango rėmelis" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "Lango tekstas" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "Geltona" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "Neįgalintą arba nematomą langą suaktyvinti negalima" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "Meniu dubliuojasi" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "Klaidingas veiksmo kūrimas" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "Klaidinga veiksmo enumeracija" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "Klaidingas veiksmo registravimas" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "Klaidingas veiksmo išregistravimas" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "Klaidinga kaukės „%s“ koduotė!" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "Klaidingas paveikslo dydis" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "Klaidingas„ImageList“ indeksas" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "Meniu indeksas peržengia ribas" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "„MenuItem“ reikšmė yra nil" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "Pomeniu nėra įdėtas į menių" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "Alt+" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "BkSp" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "Vald+" #: lclstrconsts.smkcdel msgid "Del" msgstr "Šal" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "Žemyn" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "Pab" #: lclstrconsts.smkcenter msgid "Enter" msgstr "Įvesti" #: lclstrconsts.smkcesc msgid "Esc" msgstr "Gr" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "Prad" #: lclstrconsts.smkcins msgid "Ins" msgstr "Įterpti" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "Kairėn" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "Meta+" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "Psl. žemyn" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "Psl. aukštyn" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "Dešinėn" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "Lyg2+" #: lclstrconsts.smkcspace msgid "Space" msgstr "Tarpas" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "Tab" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "Aukštyn" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "MDI formos nėra." #: lclstrconsts.snotimers msgid "No timers available" msgstr "Nėra laikmačių" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "Klaidingas leksemos tipas: tikėtasi %s" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "Klaidingas slankaus kablelio skaičius: %s" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "Klaidingas sveikasis skaičius: %s" #: lclstrconsts.sparlocinfo #, fuzzy #| msgid " (at %d,%d, stream offset %.8x)" msgid " (at %d,%d, stream offset %d)" msgstr " (ties %d,%d, srauto poslinkis %.8x)" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "Neužbaigta bitų vertė" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "Neužbaigta eilutė" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "Klaidingas leksemos simbolis: tikėtasi %s, tačiau rasta %s" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "Klaidingas leksemos tipas: tikėtasi %s, tačiau rasta %s" doublecmd-0.5.8/language/lcl/lclstrconsts.zh_TW.po0000644000175000017500000011406612250635657021215 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: 0.9.27 beta\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2011-10-17 14:44+0800\n" "Last-Translator: Lance \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Chinese\n" "X-Poedit-Country: TAIWAN\n" "X-Poedit-SourceCharset: utf-8\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "瀏覽 %s%s%s 不是可執行程式." #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "瀏覽 %s%s%s 未找到." #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "當執行 %s%s%s 時發生錯誤:%s%s " #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "無法找到 HTML 瀏覽器" #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "幫助資料庫 %s%s%s 無法找到檔案 %s%s%s." #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "瀏覽框裏的巨集 %s 將被 URL 所替代." #: lclstrconsts.ifsalt msgid "Alt" msgstr "" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "接受" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "應用程式快捷鍵" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "後退" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "取消" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "大寫" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "清除" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "控制" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "轉換" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "刪除" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "下" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "執行" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "幫助" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "插入" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "滑鼠左鍵" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "左" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "左 Win 鍵" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "滑鼠中鍵" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "目錄" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "模式更改" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "下一個" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "不轉換" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "數字鎖定" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "數字鍵盤 %d" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "暫停鍵" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "列印" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "優先" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "滑鼠右鍵" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "返回" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "右" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "右 Win 鍵" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "滾動" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "選擇" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "" #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "快照" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "空格鍵" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "未知" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "上" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "未找到資源 %s" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "3D陰影" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "3D光線" #: lclstrconsts.rsacontrolcannothaveitselfasparent #, fuzzy #| msgid "A control can't have itself as parent" msgid "A control can't have itself as a parent" msgstr "控制點不能把自己設為父節點" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "作用中邊線" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "作用中標題" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "所有檔案 (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "程式工作區" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "桌面" #: lclstrconsts.rsbackward msgid "Backward" msgstr "後退" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "黑白位圖" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "黑色" #: lclstrconsts.rsblank msgid "Blank" msgstr "空白" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "藍色" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "按鈕表面" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "按鈕高亮" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "按鈕陰影" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "按鈕文字" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "計算機" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "取消" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "無法聚焦" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "Canvas 不允許畫圖" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "標題文字" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "大小寫敏感" #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "建立 GDB 可以捕捉的錯誤" #: lclstrconsts.rscursor msgid "Cursor" msgstr "光標" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "自定義..." #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "預設值" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "權限 用戶 群組 大小 日期 時間" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "刪除記錄?" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "刪除" #: lclstrconsts.rsdirection msgid "Direction" msgstr "方向" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "目錄 &D" #: lclstrconsts.rsdocking msgid "Docking" msgstr "停靠" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "同樣的圖示格式." #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "編輯" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "尋找整個檔案" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "錯誤" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "" #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "在 %s %s地址 %s%s 框架 %s" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "讀取 %s%s%s 錯誤: %s" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "儲存位圖時出錯。" #: lclstrconsts.rsexception msgid "Exception" msgstr "異常" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "目錄必須存在" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "目錄 \"%s\" 不存在." #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "檔案 \"%s\" 已經存在.%s替換嗎?" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "檔案必須存在" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "檔案 \"%s\" 不存在." #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "檔案 \"%s\" 為只讀." #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "檔案為只讀" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "另存為" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "打開檔案" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "覆蓋檔案?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "路徑不存在" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "路徑 \"%s\" 不存在." #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "選擇目錄" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(未找到檔案: \"%s\")" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "檔案資訊" #: lclstrconsts.rsfind msgid "Find" msgstr "尋找" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "尋找更多" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "第一個" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "FixedCols 不能 >= ColCount" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "FixedRows 不能 >= RowCount" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "" #: lclstrconsts.rsforward msgid "Forward" msgstr "向前" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "紫紅" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "--gdk-debug flags 打開 GDK 跟蹤/調試訊息." #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "--gdk-no-debug flags 關閉 GDK 跟蹤/調試訊息." #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "--g-fatal-warnings 使 Gtk+/GDK 產生的警告和錯誤終止應用程式。" #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "作用中標題顏色漸變" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "非作用中標題顏色漸變" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "灰色" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "灰色文字" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "綠色" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "網格檔案不存在" #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "網格索引越界。" #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "GroupIndex 不能比之前的目錄項目的 GroupIndex 少" #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "過濾器:" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "歷史:" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "--class classname 按照 Xt 轉換規則, 一個程式的類別是第一個字母大寫的程式名稱。比如,gimp 的類別是 \"Gimp\"。如果指定了 --class,程式的類別會被設為 \"classname\"。" #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "--gtk-debug flags 打開 Gtk+ 跟蹤/調試資訊." #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "--display h:s:d 連接到指定的 X 伺服器,其中 \"h\"是主機名,\"s\"是伺服器編號(通常是0),\"d\" 是顯示編號(一般省略)。如果沒有指定 --display ,將會使用 DISPLAY 環境變量。" #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "--gtk-module module 啟動時載入指定模組" #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "" #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "--gtk-no-debug flags 關閉 Gtk+ 跟蹤/調試訊息." #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "--lcl-no-transient 不要為形式上的窗體設定臨時順序" #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "--no-xshm 禁止使用 X 共享延伸記憶體。" #: lclstrconsts.rsgtkoptionsync msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "" #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "%s: 已經註冊" #: lclstrconsts.rshelpcontextnotfound #, fuzzy #| msgid "Help Context not found" msgid "A help database was found for this topic, but this topic was not found" msgstr "未找到幫助內容" #: lclstrconsts.rshelpdatabasenotfound #, fuzzy #| msgid "Help Database not found" msgid "There is no help database installed for this topic" msgstr "未找到幫助資料庫" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "幫助錯誤" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "未找到幫助上下文 %s." #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "沒有找到 %s 的幫助內容在資料庫 %s%s%s 中." #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "幫助資料庫 %s%s%s 未找到瀏覽器可以閱讀幫助頁 %s 的類型" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "未找到幫助資料庫 %s%s%s" #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "關鍵字 %s%s%s 未找到幫助." #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "關鍵字 %s 的幫助在資料庫 %s%s%s 中沒有找到." #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "幫助節點 %s%s%s 沒有幫助資料庫" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "沒有找到 %s 的行 %d, 列 %d 的 %s 的相關幫助." #: lclstrconsts.rshelpnohelpnodesavailable #, fuzzy #| msgid "No help nodes available" msgid "No help entries available for this topic" msgstr "沒有有效的幫助節點" #: lclstrconsts.rshelpnotfound #, fuzzy #| msgid "Help not found" msgid "No help found for this topic" msgstr "未找到幫助" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "%s: 沒有註冊" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "幫助選擇器錯誤" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "幫助類型 %s%s%s 沒有檢視器" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "幫助檢視器錯誤" #: lclstrconsts.rshelpviewernotfound #, fuzzy #| msgid "Help Viewer not found" msgid "No viewer was found for this type of help content" msgstr "未找到幫助檢視器" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "高亮" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "高亮文字" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "" #: lclstrconsts.rsicns #, fuzzy #| msgid "OSX Icon Resource" msgid "Mac OS X Icon" msgstr "OSX 圖示資源" #: lclstrconsts.rsicon msgid "Icon" msgstr "圖示" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "圖示圖像不能為空" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "圖示圖像必須有相同的格式" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "不能改變圖示圖像的格式" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "圖示圖像必須有同樣的大小" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "不能改變圖示圖像的大小" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "圖示有不正確的圖像" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "非作用中邊框" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "非作用中標題" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "非作用中標題" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "%s 索引 %d 超出範圍 0 .. %d" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "單元格索引超過範圍[列=%d 行=%d]" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "資訊底色" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "資訊文字" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "插入" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "無效日期: %s" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "無效日期: %s。 必須在 %s 和 %s 之間" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "無效窗體流對象" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "無效屬性值" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "無效流格式" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "%s 已經與 %s 相關聯" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "橙" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "list 索引超過限制 (%d)" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "列表必須為空" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "中止" #: lclstrconsts.rsmball msgid "&All" msgstr "所有 &A" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "取消" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "關閉 &C" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "幫助 &H" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "忽略 &I" #: lclstrconsts.rsmbno msgid "&No" msgstr "否 &N" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "全部選否" #: lclstrconsts.rsmbok msgid "&OK" msgstr "確定 &O" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "打開 &O" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "重試 &R" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "儲存 &S" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "解開/不鎖定 &U" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "是 &Y" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "全部選是 &A" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "中灰色" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "目錄欄" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "目錄" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "目錄高亮" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "目錄文字" #: lclstrconsts.rsmodified msgid " modified " msgstr "已更改" #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "錢青色" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "確認" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "自定義" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "錯誤" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "資訊" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "警告" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "深藍色" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "下一個" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "無" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "不是有效的網格檔案" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "沒有視窗部件集合對象,請檢查單元 \"interfaces\" 是否已添加到程式的uses語句中。" #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "橄欖色" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "選擇日期" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "位圖" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "便攜黑白位圖" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "便攜灰度位圖" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "便攜網絡圖片(PNG)" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "便攜位圖" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "張貼" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok #, fuzzy #| msgid "%s%sPress Ok to ignore and risk data corruption.%sPress Cancel to kill the program." msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "%s%s確定忽略但資料有遺失的風險。%s取消則終止程式." #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "優先" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "屬性 %s 不存在" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "紫色" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "" #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "" #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "" #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "" #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "" #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "" #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "" #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "" #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "" #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "" #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "" #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "" #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "" #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "" #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "" #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "" #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "" #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "" #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "" #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "" #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "處理更新時候不能儲存圖片" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "紅色" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "更新" #: lclstrconsts.rsreplace msgid "Replace" msgstr "替換" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "替換所有" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "未找到資源 %s" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "滾動欄" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "滾動欄屬性超出範圍" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "選擇顏色" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "選擇字體" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "銀色" #: lclstrconsts.rssize msgid " size " msgstr "大小" #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "天藍色" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "青色" #: lclstrconsts.rstext msgid "Text" msgstr "文字" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "" #: lclstrconsts.rstpanelaccessibilitydescription msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "無法裝載預設值字體" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "未知錯誤, 請報告這個錯誤" #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "未知圖形檔案副檔名" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "未支援的圖檔格式" #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "未支援的剪貼格式: %s" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr "" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr "" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr "" #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr "" #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr "" #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "白色" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "僅整個單詞" #: lclstrconsts.rswin32error msgid "Error:" msgstr "錯誤:" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "警告:" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "視窗" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "視窗框架" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "視窗文字" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "黃色" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "不能聚焦於無法聚焦或者不可見的視窗" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "重複的目錄" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "無效的建立動作" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "無效列舉行為" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "無效的註冊行為" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "無效的取消註冊行為" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "\"%s\" 指定的字符集無效!" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "無效圖像大小" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "無效 ImageList 索引" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "目錄索引超過範圍" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "MenuItem 為 nil" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "子目錄不在目錄中" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "" #: lclstrconsts.smkcdel msgid "Del" msgstr "" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "下" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "" #: lclstrconsts.smkcenter msgid "Enter" msgstr "" #: lclstrconsts.smkcesc msgid "Esc" msgstr "" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "" #: lclstrconsts.smkcins msgid "Ins" msgstr "" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "左" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "右" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "" #: lclstrconsts.smkcspace msgid "Space" msgstr "" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "上" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "沒有 MDI 窗體出現" #: lclstrconsts.snotimers msgid "No timers available" msgstr "無有效計時器" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "錯誤的標識符類型:期望 %s" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "無效的浮點數:%s" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "無效的整數:%s" #: lclstrconsts.sparlocinfo #, fuzzy #| msgid " (at %d,%d, stream offset %.8x)" msgid " (at %d,%d, stream offset %d)" msgstr "(在 %d,%d, 流偏移 %.8x)" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "未結束的字節值" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "未結束的字符串" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "錯誤的標識符:期望 %s 但是找到了 %s" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "錯誤的標識符類型:期望 %s 但是找到了 %s" doublecmd-0.5.8/language/lcl/lclstrconsts.sl.po0000644000175000017500000012717712250635657020607 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: double-commander - lclstrconsts\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: \n" "PO-Revision-Date: 2013-03-24 14:34+0100\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenian GNOME Translation Team \n" "Language: sl_SI\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 1.5.4\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "Brskalnik %s%s%s ni izvedljiv." #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "Brskalnika %s%s%s ni mogoče najti." #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "Napaka med zaganjanjem %s%s%s:%s%s" #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "Ni mogoče najti brskalnika HTML." #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "Podatkovni zbirki %s%s%s manjka datoteka %s%s%s." #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "Makro %s v predmetu BrowserParams bo zamenjan z naslovom URL." #: lclstrconsts.ifsalt msgid "Alt" msgstr "Alt" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "Ctrl" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "Sprejmi" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "ključ programa" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "Povratna tipka" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "Prekliči" #: lclstrconsts.ifsvk_capital #, fuzzy msgid "Capital" msgstr "Avstralski zvezni teritorij" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "Počisti" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "Tipka" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "Pretvori" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "Izbriši" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "Navzdol" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "Konec" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "Ubežna tipka" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "Izvedi" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "Končna različica" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "Hanja" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "Pomoč" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "Domov" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "Vstavi" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "Junja" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "Kana" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "Levi gumb miške" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "Levo" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "Leva tipka Win" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "Srednji gumb miške" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "Meni" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "Sprememba načina" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "Naslednji" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "Nepretvorjeno" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "Zaklep številčnice" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "Številčnica %d" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "Tipka za premor" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "Natisni" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "Predhodni" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "Desni gumb miške" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "Vnosna tipka" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "Desno" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "Desna tipka Win" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "Drsnik" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "Izbor" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "Dvigalka" #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "Zaslonske slike" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "Preslednica" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "Tabulator" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "Neznano" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "Navzgor" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "ni mogoče izvesti ukaza %s" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "Vira %s ni mogoče najti" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "datoteke programa ni mogoče najti %s" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "3D temna senca" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "3D svetla senca" #: lclstrconsts.rsacontrolcannothaveitselfasparent msgid "A control can't have itself as a parent" msgstr "Nadzorni predmet ne more biti sam sebi nadrejen" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "Dejavni okvir" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "Dejavni naslov" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "Vse datoteke (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "Delovna površina programa" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "Vodna" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "Namizje" #: lclstrconsts.rsbackward msgid "Backward" msgstr "Nazaj" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "Slike" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "Črna" #: lclstrconsts.rsblank msgid "Blank" msgstr "Prazno" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "Modra" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "Neizbran gumb" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "Poudarjen gumb" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "Senca gumba" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "Besedilo gumba" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "Računalo" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "Prekliči" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "Ni mogoče postaviti v žarišče" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "Na platno ni mogoče risati" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "Besedilo naslova" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "Razlikovanje velikosti črk" #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "Predmet razreda '%s' ne more imet hkrati tudi podrejenega predmeta razreda '%s'." #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "Nadzorno okno '%s' je brez nadrejenega okna" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "Kremna" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "Ustvarjanje napake predpomnjenja gdb:" #: lclstrconsts.rscursor msgid "Cursor" msgstr "Kazalka" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "Po meri ..." #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "Privzeto" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "dovoljenja uporabnik skupina velikost datum čas" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "Ali naj se vpis izbriše?" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "Izbriši" #: lclstrconsts.rsdirection msgid "Direction" msgstr "Smer" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "&Mapa" #: lclstrconsts.rsdocking msgid "Docking" msgstr "Sidrišče" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "Podvojen zapis ikone." #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "Uredi" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "Preišči celotno datoteko" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "Napaka" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "Napaka med ustvarjanjem vsebine naprave za %s.%s" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "Napaka v LCL:" #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "Prišlo je do napake v %s pri %s na naslovu %s%s v okvirju %s" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "Napaka med branjem %s%s%s: %s" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "Napaka med shranjevanjem bitne slike." #: lclstrconsts.rsexception msgid "Exception" msgstr "Izjema" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "Mapa mora obstajati" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "Mapa \"%s\" ne obstaja!" #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "Datoteka \"%s\" že obstaja. Ali naj bo prepisana?" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "Datoteka mora obstajati" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "Datoteka \"%s\" ne obstaja." #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "Datoteka \"%s\" ni zapisljiva." #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "Datoteka ni zapisljiva" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "Shrani datoteko kot" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "Odpri obstoječo datoteko" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "Ali naj bo datoteka prepisana?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "Pot mora obstajati" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "Pot \"%s\" ne obstaja." #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "Izbor mape" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(datoteke ni mogoče najti: \"%s\")" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "Podrobnosti datoteke" #: lclstrconsts.rsfind msgid "Find" msgstr "Najdi" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "Najdi več" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "Prvi" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "Predmet stalnega števila stolpcev ne more bi >= števcu stolpcev" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "Predmet stalnega števila vrstic ne more bi >= števca vrstic" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "Obrazec" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "Napaka pretakanja obrazca \"%s\": %s" #: lclstrconsts.rsforward msgid "Forward" msgstr "Posreduj" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "Fuksija" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "--gdk-debug flags Prikaži posebna sporočila sledenja in razhroščevanja GDK." #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "--gdk-no-debug flags Skrij posebna sporočila sledenja in razhroščevanja GDK." #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "Slikovni zapis GIF" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "--g-fatal-warnings Opozorila in napake s strani Gtk+/GDK zaustavijo delovanje programa." #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "Preliv naziva dejavnega okna" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "Preliv naziva nedejavnega okna" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "Grafika" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "Siva" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "Sivo besedilo" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "Zelena" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "Datoteka mreže ne obstaja." #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "Določilo mreže je izven veljavnega obsega." #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "Vrednost predmeta GroupIndex ne more biti manjše od predhodne vrednosti istega predmeta" #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "Filter:" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "Zgodovina:" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "--class Imerazreda Po določilih Xt je razred programa ime programa z veliko začetnico. \"Gimp\" (pisan z veliko) je na primer ime razreda programa gimp. Če je navedena zastavica --class, bo razred programa nastavljen na \"Imerazreda\"." #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "--gtk-debug zastavice Omogoči posebna sporočila sledenja in razhroščevanja Gtk+." #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "--display h:s:d Povezava z določenim strežnikom X, kjer je \"h\" ime gostitelja, \"s\" številka strežnika (običajno 0) in \"d\" številka zaslona (ta je običajno izpuščena). Če zastavica --display ni določena, je uporabljena spremenljivka okolja DISPLAY." #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "--gtk-module modul Naloži določen modul ob zagonu." #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "--name imeprograma Nastavi ime programa na \"imeprograma\". V kolikor to ime ni navedeno, je ime določeno kot ParamStrUTF8(0)." #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "--gtk-no-debug flags Onemogoči posebna sporočila sledenja in razhroščevanja Gtk+." #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "--lcl-no-transient : ne nastavi razvrstitve pogovornih oken modalnih obrazcev" #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "--no-xshm Onemogoči uporabo razširitve souporabe pomnilnika X." #: lclstrconsts.rsgtkoptionsync msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "--sync Zastavica izvede priklic programa XSynchronize (zaslon, PRAV) po vzpostavitvi povezave s strežnikom Xserver. S tem postane razhroščevanje protokolov X enostavnejše, saj je medpomnjenje zahtev strežnika X onemogočeno. Napake strežnika X so prejete ob dogodku ali zahtevi protokola, ki je napako sprožilo." #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "%s: že vpisano" #: lclstrconsts.rshelpcontextnotfound #, fuzzy #| msgid "Help Context not found" msgid "A help database was found for this topic, but this topic was not found" msgstr "Pomoči vsebine ni mogoče najti" #: lclstrconsts.rshelpdatabasenotfound #, fuzzy #| msgid "Help Database not found" msgid "There is no help database installed for this topic" msgstr "Podatkovne zbirke pomoči ni mogoče najti" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "Napaka prikazovanja pomoči" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "Pomoči vsebine %s ni mogoče najti." #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "Pomoči vsebine %s v podatkovni zbirki %s%s%s ni mogoče najti." #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "Podatkovni zbirki %s%s%s ni mogoče pripisati pregledovalnika za pomoč vrste %s" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "Podatkovne zbirke %s%s%s ni mogoče najti." #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "Ključne besede pomoči %s%s%s ni mogoče najti." #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "Ključne besede pomoči %s%s%s v podatkovni zbirki %s%s%s ni mogoče najti." #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "Vozlišče pomoči %s%s%s je brez pripadajoče podatkovne zbirke pomoči" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "Pomoči za vrsto %d in stolpec %d od %s ni mogoče najti." #: lclstrconsts.rshelpnohelpnodesavailable #, fuzzy #| msgid "No help nodes available" msgid "No help entries available for this topic" msgstr "Na voljo ni vozlišč pomoči" #: lclstrconsts.rshelpnotfound #, fuzzy #| msgid "Help not found" msgid "No help found for this topic" msgstr "Pomoči ni mogoče najti" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "%s: ni vpisano" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "Napaka izbirnika pomoči" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "Ni pregledovalnika za vrsto pomoči %s%s%s" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "Napaka pregledovalnika pomoči" #: lclstrconsts.rshelpviewernotfound #, fuzzy #| msgid "Help Viewer not found" msgid "No viewer was found for this type of help content" msgstr "Pregledovalnika pomoči ni mogoče najti" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "Poudarjeno" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "Poudarjeno besedilo" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "Vroča svetloba" #: lclstrconsts.rsicns #, fuzzy #| msgid "OSX Icon Resource" msgid "Mac OS X Icon" msgstr "Vir ikon OSX" #: lclstrconsts.rsicon msgid "Icon" msgstr "Ikona" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "Vrednost slike ikone ne more biti prazna" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "Ikona mora biti v enakem zapisu" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "Ni mogoče spremeniti zapisa ikone" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "Ikona mora biti enako velikost" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "Ni mogoče spremeniti velikosti ikone" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "Ikona nima trenutne slike" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "Nedejavni okvir" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "Nedejaven napis" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "Nedejaven napis" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "%s. Določilo %d je izven veljavnih meja 0 - %d" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "Kazalo je izven obsega celice [Stolpec=%d Vrstica=%d]" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "Ozadje okna podrobnosti" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "Besedilo podrobnosti" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "Vstavi" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "Neveljaven datum: %s" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "Neveljaven datum: %s. Vrednost mora biti med %s in %s" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "Neveljaven pretok obrazca predmeta" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "Neveljavna vrednost lastnosti" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "Neveljaven zapis pretoka" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "Pripona %s je že programsko povezana z programom %s" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "Slikovni zapis JPEG" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "Zadnji" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "Rumeno-zelena" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "Določilo seznama presega dovoljene meje (%d)" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "Seznam mora biti prazen" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "Kostanjeva" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "Prekini" #: lclstrconsts.rsmball msgid "&All" msgstr "&Vse" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "Prekliči" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "&Zapri" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "Pomo&č" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "&Prezri" #: lclstrconsts.rsmbno msgid "&No" msgstr "&Ne" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "Ne za vse" #: lclstrconsts.rsmbok msgid "&OK" msgstr "V &redu" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "&Odpri" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "Poskusi &znova" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "&Shrani" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "&Odkleni" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "&Da" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "Da za &vse" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "Svetlosiva" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "Menijska vrstica" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "Meni" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "Poudarek v meniju" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "Besedilo menija" #: lclstrconsts.rsmodified msgid " modified " msgstr " spremenjeno" #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "Zelena" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "Overitev" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "Potrditev" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "Po meri" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "Napaka" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "Podrobnosti" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "Opozorilo" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "Mornarsko modra" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "Naslednji" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "Brez" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "Neveljavna datoteka mreže" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "Ni naveden predmet nabora gradnikov. Preveriti je treba ali so enote \"vmesnikov\" dodane zahtevam programa." #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "Olivna" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "Izbor datuma" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "Sličica" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "Portable BitMap" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "Portable GrayMap" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "Portable Network Graphic" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "Portable PixMap" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "Po" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "%s%sPritisnite gumb V redu, če želite napako prezreti in posledično morda izgubiti podatke..%sPritisnite gumb Prekliči za uničenje programa." #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "Pred" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "Lastnost %s ne obstaja" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "Škrlatna" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "-dograb : (le v okolju X11), zagon z razhroščevanjem lahko povroči izrecno uporabo atributa -nograb. Z uporabo -dograb se možnost prepiše. Možnost zahteva nameščen paket QT_DEBUG." #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "-graphicssystem parameter : nastavi ozadnji program za uporabo z zaslonskimi gradniki in predmeti QPixmaps. Na voljo so možnosti native (programsko), raster (rastersko) in opengl (OpenGL). OpenGL je še vedno v razvoju in ni povsem stabilen." #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "-nograb : pove Qt, da ne sme prevzeti nadzora nad miško ali tipkovnico; zahteva QT_DEBUG." #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "-reverse : nastavi usmerjenost pisave programa na obratno vrednost Qt::RightToLeft." #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "-session : obnovi program predhodne seje." #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "-style ali -style= nastavi slog uporabniškega vmesnika programa. Mogoče vrednosti so motif, windows in platinum. Pri izgradnji s Qt so na voljo tudi drugi slogi ali slogi kot vstavki. OPOMBA: vsi slogi niso na voljo v vseh okoljih. Kadar parametri sloga niso poseben določeni, se program zažene v slogu oken (Windows)." #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "-stylesheet ali pa -stylesheet= : nastavi slogovno predlogo programa. Vrednost mora biti pot do datoteke s predlogo. Opomba: relativni naslovi URL v datoteki predloge so relativni na pot datoteke predloge." #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "-sync (le pod X11) : preklopi na usklajevalni način za razhroščevanje." #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "-widgetcount : na koncu odvoda izpiše sporočilo razhroščevanja o številu neuničenih gradnikov in največje število sočasno zagnanih gradnikov." #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "-bg ali -background : nastavi privzeto barvo ozadja in paleto programa (na osnovi barve so preračunane svetlejšie in temnejši odtenki)." #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "-btn ali -button : nastavi privzeto barvno gumba." #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "-cmap : vsili namestitev zasebne barvne palete na 8-bitnih zaslonih." #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "-display : nastavi zaslon X (default is $DISPLAY)." #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "-fg ali -foreground : nastavi privzeto barvo pisave." #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "-fn ali -font : določa pisavo programa. Ta mora biti naveden kot logični opis pisave za X." #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "-geometry : nastavi geometrijo okna odjemalca prvega prikazanega okna." #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "-im : nastavi strežnik načina vhoda (možnost je enaka nastavitve okoljske spremenljivke XMODIFIERS)." #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "" #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "-name : nastavi ime programa." #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "-ncols <števec> : omeji število barv, ki so dodeljene barvni kocki 8-bitnega zaslona, kadar program uporablja določilo QApplication::ManyColor. Če je števec enak 216, je uporabljena barvna kocka 6x6x6 (to je 6 ravni rdeče, 6 zelene in 6 modre); za druge vrednosti je uporabljena kocka približnih vrednosti razmerja 2x3x1." #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "-title : nastavi naziv programa" #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "-visual : vsili uporabo predočenja TrueColor tudi na 8-bitnih zaslonih." #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "Prejeta je zahteva konca posodobitve, čeprav posodobitev sploh ni zagnana" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "Ni mogoče shraniti slike med izvajanjem posodabljanja" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "Ni mogoče začeti posodabljanja vseh predmetov, ko je v teku posodabljanje platna. " #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "Rdeča" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "Osveži" #: lclstrconsts.rsreplace msgid "Replace" msgstr "Zamenjaj" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "Zamenjaj vse" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "Vira %s ni mogoče najti" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "Drsnik" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "Lastnost drsnika je izven dovoljenega območja" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "Izbor barve" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "Izbor pisave" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "Srebrna" #: lclstrconsts.rssize msgid " size " msgstr " velikost" #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "Nebesno modra" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "Modrozelena" #: lclstrconsts.rstext msgid "Text" msgstr "Besedilo" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "Tagged Image File Format" #: lclstrconsts.rstpanelaccessibilitydescription msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "Ni mogoče naložiti privzete pisave" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "Prišlo je do neznane napake. Pošljite sporočilo." #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "Neznana pripona slike" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "Neznan zapis slike" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "Nepodprt zapis bitne slike" #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "Nepodprta oblika odložišča: %s" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr " Opozorilo: obstaja neobljavljenih primerkov programa DCs; sledi podroben izpis dnevnika:" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr " Opozorilo: obstaja %d neobjavljenih predmetov GDIObjects; sledi podroben izpis dnevnika:" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr " Opozorilo: obstaja %d preostalih sporočil v vrsti, ki bodo nemudoma sproščena" #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr " Opozorilo: obstaja %d predmetov TimerInfo, ki bodo nemudoma sproščeni" #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr " Opozorilo: obstaja %s neodstranjenih povezav sporočil LM_PAINT/LM_GtkPAINT." #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "Bela" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "Le cele besede" #: lclstrconsts.rswin32error msgid "Error:" msgstr "Napaka:" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "Opozorilo:" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "Okno" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "Okvir okna" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "Besedilo okna" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "Rumena" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "Onemogočenega ali nevidnega okna ni mogoče postaviti v žarišče" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "Podvojen meni" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "Neveljavno ustvarjanje dejanja" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "Neveljavno oštevilčenje dejanja" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "Neveljaven vpis dejanja" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "Neveljavno izpisovanje dejanja" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "Znakovni nabor v maski \"%s\" ni veljaven!" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "Neveljavna velikost slike" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "Neveljavno kazalo seznama slik" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "Kazalo menija je izven veljavnega obsega" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "Predmet menija je prazno polje" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "Podrejeni meni ni meni" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "Alt+" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "Povratnica" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "Ctrl+" #: lclstrconsts.smkcdel msgid "Del" msgstr "Del" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "Navzdol" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "End" #: lclstrconsts.smkcenter msgid "Enter" msgstr "Vnosna tipka" #: lclstrconsts.smkcesc msgid "Esc" msgstr "Esc" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "Domov" #: lclstrconsts.smkcins msgid "Ins" msgstr "Vrivalka" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "Levo" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "Meta+" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "Stran dol" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "Stran gor" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "Desno" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "Dvigalka+" #: lclstrconsts.smkcspace msgid "Space" msgstr "Preslednica" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "Tabulator" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "Gor" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "Ni veljavne oblike MDI." #: lclstrconsts.snotimers msgid "No timers available" msgstr "Na voljo ni nobenega časomera." #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "Neznana vrsta žetona: pričakovana je vrsta %s" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "Neveljavno število s plavajočo vejico: %s" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "Neveljavna celoštevilčna vrednost: %s" #: lclstrconsts.sparlocinfo #, fuzzy #| msgid " (at %d,%d, stream offset %.8x)" msgid " (at %d,%d, stream offset %d)" msgstr " (pri %d,%d, zamik pretoka %.8x)" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "Nekončana bitna vrednost" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "Nekončan niz" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "Napačen simbol žetona: pričakovan je %s, prejet pa %s" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "Neznana vrsta žetona: pričakovana je vrsta %s; vrnjena pa je %s" doublecmd-0.5.8/language/lcl/lclstrconsts.fi.po0000644000175000017500000010226712250635657020560 0ustar alexxalexxmsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "" #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "" #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "" #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "" #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "" #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "" #: lclstrconsts.ifsalt msgid "Alt" msgstr "" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "Hyväksy" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "" #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "" #: lclstrconsts.rsacontrolcannothaveitselfasparent msgid "A control can't have itself as a parent" msgstr "" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "Kaikki tiedostot (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "" #: lclstrconsts.rsbackward msgid "Backward" msgstr "Taaksepäin" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "" #: lclstrconsts.rsblank msgid "Blank" msgstr "" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "Laskin" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "Sama kirjainkoko" #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "" #: lclstrconsts.rscursor msgid "Cursor" msgstr "" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "" #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "oikeudet käyttäjä ryhmä koko päivä aika" #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "" #: lclstrconsts.rsdirection msgid "Direction" msgstr "Suunta" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "" #: lclstrconsts.rsdocking msgid "Docking" msgstr "" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "" #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "" #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "" #: lclstrconsts.rsexception msgid "Exception" msgstr "" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "" #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "Tiedosto täytyy olla olemassa" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "Tiedostoa \"%s\" ei ole olemassa." #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "" #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "Tallenna nimellä" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "Avaa tiedosto" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "Tallennetaanko vanhan päälle ?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "" #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "Valitse kansio" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(tiedostoa ei löytynyt: \"%s\")" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "Tiedoston tietoja" #: lclstrconsts.rsfind msgid "Find" msgstr "Etsi" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "FixedCols ei voi olla suurempi kuin kaikkien sarakkeiden määrä (ColCount)" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "FixedRows ei voi olla suurempi kuin kaikkien rivien määrä (RowCount)" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "" #: lclstrconsts.rsforward msgid "Forward" msgstr "Eteenpäin" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "" #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "" #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "" #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "" #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "" #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "" #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "Suodatus:" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "Historia:" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "" #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "" #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "" #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "" #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "" #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "" #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "" #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "" #: lclstrconsts.rsgtkoptionsync msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "" #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "" #: lclstrconsts.rshelpcontextnotfound msgid "A help database was found for this topic, but this topic was not found" msgstr "" #: lclstrconsts.rshelpdatabasenotfound msgid "There is no help database installed for this topic" msgstr "" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "" #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "" #: lclstrconsts.rshelpnohelpnodesavailable msgid "No help entries available for this topic" msgstr "" #: lclstrconsts.rshelpnotfound msgid "No help found for this topic" msgstr "" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "" #: lclstrconsts.rshelpviewernotfound msgid "No viewer was found for this type of help content" msgstr "" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "" #: lclstrconsts.rsicns msgid "Mac OS X Icon" msgstr "" #: lclstrconsts.rsicon msgid "Icon" msgstr "" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "Ideksi osoittaa taulukon ulkopuolella olevaa solua [saraketta(col)=%d ja riviä(row)=%d]" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "Laiton päivämäärä: %s" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "Keskeytä" #: lclstrconsts.rsmball msgid "&All" msgstr "Kaikki" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "Peru" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "&Sulje" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "&Ohje" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "Ohita" #: lclstrconsts.rsmbno msgid "&No" msgstr "&Ei" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "Ei kaikkiin" #: lclstrconsts.rsmbok msgid "&OK" msgstr "&OK" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "Uudelleen" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "&Kyllä" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "Kyllä, kaikki" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "" #: lclstrconsts.rsmodified msgid " modified " msgstr " muokattu " #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "Vahvistus" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "Virhe" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "Informaatio" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "Varoitus" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "" #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "Valitse päivä" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok #, fuzzy #| msgid "%s%sPress Ok to ignore and risk data corruption.%sPress Cancel to kill the program." msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "%s%sPaina 'Ok'-näppäintä jos haluat ohittaa varoituksen ja ottaa riskin tietojen (datan) sekoamisesta.%sPaina 'Peru'-näppäintä poistuaksesi ohjelmasta." #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "" #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "" #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "" #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "" #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "" #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "" #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "" #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "" #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "" #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "" #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "" #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "" #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "" #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "" #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "" #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "" #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "" #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "" #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "" #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "" #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "" #: lclstrconsts.rsreplace msgid "Replace" msgstr "Etsi ja korvaa" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "Korvaa kaikki" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "Valitse väri" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "Valitse fontti" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "" #: lclstrconsts.rssize msgid " size " msgstr " koko " #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "" #: lclstrconsts.rstext msgid "Text" msgstr "Teksti" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "" #: lclstrconsts.rstpanelaccessibilitydescription msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "" #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "" #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr "" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr "" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr "" #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr "" #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr "" #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "Etsi vain kokonaisia sanoja" #: lclstrconsts.rswin32error msgid "Error:" msgstr "Virhe:" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "Varoitus:" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "" #: lclstrconsts.smkcdel msgid "Del" msgstr "" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "" #: lclstrconsts.smkcenter msgid "Enter" msgstr "" #: lclstrconsts.smkcesc msgid "Esc" msgstr "" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "" #: lclstrconsts.smkcins msgid "Ins" msgstr "" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "" #: lclstrconsts.smkcspace msgid "Space" msgstr "" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "" #: lclstrconsts.snotimers msgid "No timers available" msgstr "" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "" #: lclstrconsts.sparlocinfo msgid " (at %d,%d, stream offset %d)" msgstr "" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "" doublecmd-0.5.8/language/lcl/lclstrconsts.id.po0000644000175000017500000011507012250635657020552 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Lazarus LCL v1.x\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2007-01-30 02:21+0700\n" "Last-Translator: Zaenal Mutaqin \n" "Language-Team: Zaenal Mutaqin \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Country: INDONESIA\n" #: lclstrconsts.hhshelpbrowsernotexecutable msgid "Browser %s%s%s not executable." msgstr "Browser %s%s%s bukan eksekutabel." #: lclstrconsts.hhshelpbrowsernotfound msgid "Browser %s%s%s not found." msgstr "Browser %s%s%s tidak ditemukan." #: lclstrconsts.hhshelperrorwhileexecuting msgid "Error while executing %s%s%s:%s%s" msgstr "Kesalahan saat mengeksekusi %s%s%s:%s%s" #: lclstrconsts.hhshelpnohtmlbrowserfound msgid "Unable to find a HTML browser." msgstr "Tidak bisa menemukan HTML browser" #: lclstrconsts.hhshelpnohtmlbrowserfoundpleasedefineone msgid "No HTML Browser found.%sPlease define one in Tools -> Options -> Help -> Help Options" msgstr "" #: lclstrconsts.hhshelpthehelpdatabasewasunabletofindfile msgid "The help database %s%s%s was unable to find file %s%s%s." msgstr "Database bantuan %s%s%s tidak bisa menemukan file %s%s%s." #: lclstrconsts.hhshelpthemacrosinbrowserparamswillbereplacedbytheurl msgid "The macro %s in BrowserParams will be replaced by the URL." msgstr "Makro %s dalam BrowserParams akan diganti dengan URL." #: lclstrconsts.ifsalt msgid "Alt" msgstr "Alt" #: lclstrconsts.ifsctrl msgid "Ctrl" msgstr "Ctrl" #: lclstrconsts.ifsvk_accept msgid "Accept" msgstr "Terima" #: lclstrconsts.ifsvk_apps msgid "application key" msgstr "tombol aplikasi" #: lclstrconsts.ifsvk_back msgid "Backspace" msgstr "Backspace" #: lclstrconsts.ifsvk_cancel msgctxt "lclstrconsts.ifsvk_cancel" msgid "Cancel" msgstr "" #: lclstrconsts.ifsvk_capital msgid "Capital" msgstr "Kapital" #: lclstrconsts.ifsvk_clear msgid "Clear" msgstr "Clear" #: lclstrconsts.ifsvk_cmd msgid "Cmd" msgstr "" #: lclstrconsts.ifsvk_control msgid "Control" msgstr "Kontrol" #: lclstrconsts.ifsvk_convert msgid "Convert" msgstr "Konversi" #: lclstrconsts.ifsvk_delete msgctxt "lclstrconsts.ifsvk_delete" msgid "Delete" msgstr "" #: lclstrconsts.ifsvk_down msgctxt "lclstrconsts.ifsvk_down" msgid "Down" msgstr "Turun" #: lclstrconsts.ifsvk_end msgctxt "lclstrconsts.ifsvk_end" msgid "End" msgstr "End" #: lclstrconsts.ifsvk_escape msgid "Escape" msgstr "Escape" #: lclstrconsts.ifsvk_execute msgid "Execute" msgstr "Jalankan" #: lclstrconsts.ifsvk_final msgid "Final" msgstr "Final" #: lclstrconsts.ifsvk_hanja msgid "Hanja" msgstr "Hanja" #: lclstrconsts.ifsvk_help msgid "Help" msgstr "Panduan" #: lclstrconsts.ifsvk_home msgctxt "lclstrconsts.ifsvk_home" msgid "Home" msgstr "Home" #: lclstrconsts.ifsvk_insert msgctxt "lclstrconsts.ifsvk_insert" msgid "Insert" msgstr "" #: lclstrconsts.ifsvk_junja msgid "Junja" msgstr "Junja" #: lclstrconsts.ifsvk_kana msgid "Kana" msgstr "Kana" #: lclstrconsts.ifsvk_lbutton msgid "Mouse Button Left" msgstr "Tombol Mouse Kiri" #: lclstrconsts.ifsvk_left msgctxt "lclstrconsts.ifsvk_left" msgid "Left" msgstr "Left" #: lclstrconsts.ifsvk_lwin msgid "left windows key" msgstr "tombol kiri windows" #: lclstrconsts.ifsvk_mbutton msgid "Mouse Button Middle" msgstr "Tombol Mouse Tengah" #: lclstrconsts.ifsvk_menu msgctxt "lclstrconsts.ifsvk_menu" msgid "Menu" msgstr "Menu" #: lclstrconsts.ifsvk_meta msgid "Meta" msgstr "" #: lclstrconsts.ifsvk_modechange msgid "Mode Change" msgstr "Ubah Mode" #: lclstrconsts.ifsvk_next msgctxt "lclstrconsts.ifsvk_next" msgid "Next" msgstr "" #: lclstrconsts.ifsvk_nonconvert msgid "Nonconvert" msgstr "Nonkonversi" #: lclstrconsts.ifsvk_numlock msgid "Numlock" msgstr "Numlock" #: lclstrconsts.ifsvk_numpad msgid "Numpad %d" msgstr "Numpad %d" #: lclstrconsts.ifsvk_pause msgid "Pause key" msgstr "Tombol pause" #: lclstrconsts.ifsvk_print msgid "Print" msgstr "Cetak" #: lclstrconsts.ifsvk_prior msgctxt "lclstrconsts.ifsvk_prior" msgid "Prior" msgstr "" #: lclstrconsts.ifsvk_rbutton msgid "Mouse Button Right" msgstr "Tombol Mouse Kanan" #: lclstrconsts.ifsvk_return msgid "Return" msgstr "Return" #: lclstrconsts.ifsvk_right msgctxt "lclstrconsts.ifsvk_right" msgid "Right" msgstr "Right" #: lclstrconsts.ifsvk_rwin msgid "right windows key" msgstr "tombol kanan windows" #: lclstrconsts.ifsvk_scroll msgid "Scroll" msgstr "Scroll" #: lclstrconsts.ifsvk_select msgid "Select" msgstr "Pilih" #: lclstrconsts.ifsvk_shift msgid "Shift" msgstr "Shift" #: lclstrconsts.ifsvk_snapshot msgid "Snapshot" msgstr "Snapshot" #: lclstrconsts.ifsvk_space msgid "Space key" msgstr "Tombol Spasi" #: lclstrconsts.ifsvk_super msgid "Super" msgstr "" #: lclstrconsts.ifsvk_tab msgctxt "lclstrconsts.ifsvk_tab" msgid "Tab" msgstr "Tab" #: lclstrconsts.ifsvk_unknown msgid "Unknown" msgstr "Tidak dikenal" #: lclstrconsts.ifsvk_up msgctxt "lclstrconsts.ifsvk_up" msgid "Up" msgstr "Up" #: lclstrconsts.liscannotexecute msgid "can not execute %s" msgstr "" #: lclstrconsts.liscefilter msgid "(filter)" msgstr "" #: lclstrconsts.lislclresourcesnotfound msgctxt "lclstrconsts.lislclresourcesnotfound" msgid "Resource %s not found" msgstr "Sumber %s tidak ditemukan" #: lclstrconsts.lisprogramfilenotfound msgid "program file not found %s" msgstr "" #: lclstrconsts.rs3ddkshadowcolorcaption msgid "3D Dark Shadow" msgstr "" #: lclstrconsts.rs3dlightcolorcaption msgid "3D Light" msgstr "" #: lclstrconsts.rsacontrolcannothaveitselfasparent #, fuzzy #| msgid "A control can't have itself as parent" msgid "A control can't have itself as a parent" msgstr "Kontrol tidak bisa menjadikan dirinya sebagai induk" #: lclstrconsts.rsactivebordercolorcaption msgid "Active Border" msgstr "" #: lclstrconsts.rsactivecaptioncolorcaption msgid "Active Caption" msgstr "" #: lclstrconsts.rsallfiles msgid "All files (%s)|%s|%s" msgstr "Semua file (%s)|%s|%s" #: lclstrconsts.rsappworkspacecolorcaption msgid "Application Workspace" msgstr "" #: lclstrconsts.rsaquacolorcaption msgid "Aqua" msgstr "" #: lclstrconsts.rsbackgroundcolorcaption msgid "Desktop" msgstr "" #: lclstrconsts.rsbackward msgid "Backward" msgstr "Mundur" #: lclstrconsts.rsbitmaps msgid "Bitmaps" msgstr "Bitmaps" #: lclstrconsts.rsblackcolorcaption msgid "Black" msgstr "" #: lclstrconsts.rsblank msgid "Blank" msgstr "Kosong" #: lclstrconsts.rsbluecolorcaption msgid "Blue" msgstr "" #: lclstrconsts.rsbtnfacecolorcaption msgid "Button Face" msgstr "" #: lclstrconsts.rsbtnhighlightcolorcaption msgid "Button Highlight" msgstr "" #: lclstrconsts.rsbtnshadowcolorcaption msgid "Button Shadow" msgstr "" #: lclstrconsts.rsbtntextcolorcaption msgid "Button Text" msgstr "" #: lclstrconsts.rscalculator msgid "Calculator" msgstr "Kalkulator" #: lclstrconsts.rscancelrecordhint msgctxt "lclstrconsts.rscancelrecordhint" msgid "Cancel" msgstr "" #: lclstrconsts.rscannotfocus msgid "Can not focus" msgstr "Tidak bisa memfokuskan" #: lclstrconsts.rscanvasdoesnotallowdrawing msgid "Canvas does not allow drawing" msgstr "Kanvas tidak membolehkan penggambaran" #: lclstrconsts.rscaptiontextcolorcaption msgid "Caption Text" msgstr "" #: lclstrconsts.rscasesensitive msgid "Case sensitive" msgstr "Sensitif huruf" #: lclstrconsts.rscontrolclasscantcontainchildclass msgid "Control of class '%s' can't have control of class '%s' as a child" msgstr "" #: lclstrconsts.rscontrolhasnoparentwindow msgid "Control '%s' has no parent window" msgstr "" #: lclstrconsts.rscontrolisnotaparent msgid "'%s' is not a parent of '%s'" msgstr "" #: lclstrconsts.rscreamcolorcaption msgid "Cream" msgstr "" #: lclstrconsts.rscreatinggdbcatchableerror msgid "Creating gdb catchable error:" msgstr "Pembuatan cachable salah: " #: lclstrconsts.rscursor msgid "Cursor" msgstr "" #: lclstrconsts.rscustomcolorcaption msgid "Custom ..." msgstr "" #: lclstrconsts.rsdefaultcolorcaption msgid "Default" msgstr "" #: lclstrconsts.rsdefaultfileinfovalue msgid "permissions user group size date time" msgstr "ukuran waktu tanggal perijinan grup pemakai " #: lclstrconsts.rsdeleterecord msgid "Delete record?" msgstr "" #: lclstrconsts.rsdeleterecordhint msgctxt "lclstrconsts.rsdeleterecordhint" msgid "Delete" msgstr "Delete" #: lclstrconsts.rsdirection msgid "Direction" msgstr "Arah" #: lclstrconsts.rsdirectory msgid "&Directory" msgstr "&Direktori" #: lclstrconsts.rsdocking msgid "Docking" msgstr "Docking" #: lclstrconsts.rsduplicateiconformat msgid "Duplicate icon format." msgstr "" #: lclstrconsts.rseditrecordhint msgid "Edit" msgstr "" #: lclstrconsts.rsentirescope msgid "Search entire file" msgstr "" #: lclstrconsts.rserror msgctxt "lclstrconsts.rserror" msgid "Error" msgstr "" #: lclstrconsts.rserrorcreatingdevicecontext msgid "Error creating device context for %s.%s" msgstr "Kesalahan pembuatan konteks device untuk %s.%s" #: lclstrconsts.rserrorinlcl msgid "ERROR in LCL: " msgstr "KESALAHAN dalam LCL: " #: lclstrconsts.rserroroccurredinataddressframe msgid "Error occurred in %s at %sAddress %s%s Frame %s" msgstr "Kesalahan terjadi dalam %s at %sAlamat %s%s Frame %s" #: lclstrconsts.rserrorreadingproperty msgid "Error reading %s%s%s: %s" msgstr "Kesalahan pembacaan %s%s%s: %s" #: lclstrconsts.rserrorwhilesavingbitmap msgid "Error while saving bitmap." msgstr "Kesalahan ketika menyimpan bitmap" #: lclstrconsts.rsexception msgid "Exception" msgstr "Kekecualian" #: lclstrconsts.rsfddirectorymustexist msgid "Directory must exist" msgstr "Direktori harus ada" #: lclstrconsts.rsfddirectorynotexist msgid "The directory \"%s\" does not exist." msgstr "Directori \"%s\" tidak ada." #: lclstrconsts.rsfdfilealreadyexists msgid "The file \"%s\" already exists. Overwrite ?" msgstr "File \"%s\" sudah ada. Timpa saja ?" #: lclstrconsts.rsfdfilemustexist msgid "File must exist" msgstr "File harus ada" #: lclstrconsts.rsfdfilenotexist msgid "The file \"%s\" does not exist." msgstr "File \"%s\" tidak ada." #: lclstrconsts.rsfdfilereadonly msgid "The file \"%s\" is not writable." msgstr "File \"%s\" tidak bisa ditulisi." #: lclstrconsts.rsfdfilereadonlytitle msgid "File is not writable" msgstr "File tidak bisa ditulisi" #: lclstrconsts.rsfdfilesaveas msgid "Save file as" msgstr "Simpan file sebagai" #: lclstrconsts.rsfdopenfile msgid "Open existing file" msgstr "Buka file yang ada" #: lclstrconsts.rsfdoverwritefile msgid "Overwrite file ?" msgstr "Timpa file ?" #: lclstrconsts.rsfdpathmustexist msgid "Path must exist" msgstr "Path harus ada" #: lclstrconsts.rsfdpathnoexist msgid "The path \"%s\" does not exist." msgstr "Path \"%s\" tidak ada." #: lclstrconsts.rsfdselectdirectory msgid "Select Directory" msgstr "Pilih Direktori" #: lclstrconsts.rsfileinfofilenotfound msgid "(file not found: \"%s\")" msgstr "(file tidak ditemukan: \"%s\")" #: lclstrconsts.rsfileinformation msgid "File information" msgstr "Informasi file" #: lclstrconsts.rsfind msgid "Find" msgstr "Cari" #: lclstrconsts.rsfindmore msgid "Find more" msgstr "Cari lagi" #: lclstrconsts.rsfirstrecordhint msgid "First" msgstr "" #: lclstrconsts.rsfixedcolstoobig msgid "FixedCols can't be >= ColCount" msgstr "FixedCols tidak bisa >= ColCount" #: lclstrconsts.rsfixedrowstoobig msgid "FixedRows can't be >= RowCount" msgstr "FixedRows tidak bisa >= RowCount" #: lclstrconsts.rsformcolorcaption msgid "Form" msgstr "" #: lclstrconsts.rsformresourcesnotfoundforresourcelessformscreatenew msgid "Form resource %s not found. For resourceless forms CreateNew constructor must be used. See the global variable RequireDerivedFormResource." msgstr "" #: lclstrconsts.rsformstreamingerror msgid "Form streaming \"%s\" error: %s" msgstr "Pengaliran form \"%s\" salah: %s" #: lclstrconsts.rsforward msgid "Forward" msgstr "Maju" #: lclstrconsts.rsfuchsiacolorcaption msgid "Fuchsia" msgstr "" #: lclstrconsts.rsgdkoptiondebug msgid "--gdk-debug flags Turn on specific GDK trace/debug messages." msgstr "--gdk-debug flags Hidupkan pesan khusus GDK trace/debug." #: lclstrconsts.rsgdkoptionnodebug msgid "--gdk-no-debug flags Turn off specific GDK trace/debug messages." msgstr "--gdk-no-debug flags Matikan pesan khusus GDK trace/debug." #: lclstrconsts.rsgif msgid "Graphics Interchange Format" msgstr "" #: lclstrconsts.rsgoptionfatalwarnings msgid "--g-fatal-warnings Warnings and errors generated by Gtk+/GDK will halt the application." msgstr "--g-fatal-warnings Peringatan dan kesalahan dihasilkan oleh Gtk+/GDK akan menghentikan aplikasi." #: lclstrconsts.rsgradientactivecaptioncolorcaption msgid "Gradient Active Caption" msgstr "" #: lclstrconsts.rsgradientinactivecaptioncolorcaption msgid "Gradient Inactive Caption" msgstr "" #: lclstrconsts.rsgraphic msgid "Graphic" msgstr "" #: lclstrconsts.rsgraycolorcaption msgid "Gray" msgstr "" #: lclstrconsts.rsgraytextcolorcaption msgid "Gray Text" msgstr "" #: lclstrconsts.rsgreencolorcaption msgid "Green" msgstr "" #: lclstrconsts.rsgridfiledoesnotexists msgid "Grid file doesn't exists" msgstr "File grid tidak ada" #: lclstrconsts.rsgridindexoutofrange msgid "Grid index out of range." msgstr "Indeks grid di luar jangkauan" #: lclstrconsts.rsgroupindexcannotbelessthanprevious msgid "GroupIndex cannot be less than a previous menu item's GroupIndex" msgstr "GroupIndex tidak bisa kurang dari item GroupIndex menu sebelumnya" #: lclstrconsts.rsgtkfilter msgid "Filter:" msgstr "Filter:" #: lclstrconsts.rsgtkhistory msgid "History:" msgstr "Histori:" #: lclstrconsts.rsgtkoptionclass msgid "--class classname Following Xt conventions, the class of a program is the program name with the initial character capitalized. For example, the classname for gimp is \"Gimp\". If --class is specified, the class of the program will be set to \"classname\"." msgstr "--class classname Mengikuti konvensi Xt, class dari sebuah program dalam nama program dengan inisial karakter dibesarkan. Sebagai contoh, classname untuk gimp adalah \"Gimp\". Jika --class ditetapkan, class dari program akan di set ke \"classname\"." #: lclstrconsts.rsgtkoptiondebug msgid "--gtk-debug flags Turn on specific Gtk+ trace/debug messages." msgstr "--gtk-debug flags Hidupkan pesan khusus Gtk+ trace/debug." #: lclstrconsts.rsgtkoptiondisplay msgid "--display h:s:d Connect to the specified X server, where \"h\" is the hostname, \"s\" is the server number (usually 0), and \"d\" is the display number (typically omitted). If --display is not specified, the DISPLAY environment variable is used." msgstr "--display h:s:d Sambungkan ke X server tertentu, dimana \"h\" adalah nama host, \"s\" adalah nomor server (biasanya 0), dan \"d\" adalah nomor layar (biasanya diabaikan). Jika --display tidak ditetapkan, variabel lingkungan DISPLAY yang digunakan." #: lclstrconsts.rsgtkoptionmodule msgid "--gtk-module module Load the specified module at startup." msgstr "--gtk-module module Ambil modul yang ditetapkan saat startup." #: lclstrconsts.rsgtkoptionname msgid "--name programe Set program name to \"progname\". If not specified, program name will be set to ParamStrUTF8(0)." msgstr "" #: lclstrconsts.rsgtkoptionnodebug msgid "--gtk-no-debug flags Turn off specific Gtk+ trace/debug messages." msgstr "--gtk-no-debug flags Matikan pesan khusus Gtk+ trace/debug." #: lclstrconsts.rsgtkoptionnotransient msgid "--lcl-no-transient Do not set transient order for modal forms" msgstr "--lcl-no-transient Jangan set urutan sementara untuk form modal" #: lclstrconsts.rsgtkoptionnoxshm msgid "--no-xshm Disable use of the X Shared Memory Extension." msgstr "--no-xshm Matikan penggunaan X Shared Memory Extension." #: lclstrconsts.rsgtkoptionsync #, fuzzy #| msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediatey after the protocol request that generated the error has been processed by the X server." msgid "--sync Call XSynchronize (display, True) after the Xserver connection has been established. This makes debugging X protocol errors easier, because X request buffering will be disabled and X errors will be received immediately after the protocol request that generated the error has been processed by the X server." msgstr "--sync Panggil XSynchronize (layar, Benar) setelah sambungan Xserver terlaksana. Ini membuat debugging kesalahan protokol X lebih mudah, karena permintaan penyanggaan X akan dimatikan dan kesalahan X akan diterima segera setelah permintaan protokol yang kesalahannya telah dibuat sudah diproses oleh X server." #: lclstrconsts.rshelpalreadyregistered msgid "%s: Already registered" msgstr "%s: Sudah teregistrasi" #: lclstrconsts.rshelpcontextnotfound #, fuzzy #| msgid "Help Context not found" msgid "A help database was found for this topic, but this topic was not found" msgstr "Konteks Bantuan tidak ditemukan" #: lclstrconsts.rshelpdatabasenotfound #, fuzzy #| msgid "Help Database not found" msgid "There is no help database installed for this topic" msgstr "Database Bantuan tidak ditemukan" #: lclstrconsts.rshelperror msgid "Help Error" msgstr "Bantuan Salah" #: lclstrconsts.rshelphelpcontextnotfound msgid "Help context %s not found." msgstr "Konteks Bantuan %s tidak ditemukan." #: lclstrconsts.rshelphelpcontextnotfoundindatabase msgid "Help context %s not found in Database %s%s%s." msgstr "Konteks Bantuan %s tidak ditemukan dalam Database %s%s%s." #: lclstrconsts.rshelphelpdatabasedidnotfoundaviewerforahelppageoftype msgid "Help Database %s%s%s did not found a viewer for a help page of type %s" msgstr "Database Bantuan %s%s%s tidak ditemukan peninjau untuk halaman bantuan dari tipe %s" #: lclstrconsts.rshelphelpdatabasenotfound msgid "Help Database %s%s%s not found" msgstr "Database Bantuan %s%s%s tidak ditemukan" #: lclstrconsts.rshelphelpfordirectivenotfound msgid "Help for directive %s%s%s not found." msgstr "" #: lclstrconsts.rshelphelpfordirectivenotfoundindatabase msgid "Help for directive %s%s%s not found in Database %s%s%s." msgstr "" #: lclstrconsts.rshelphelpkeywordnotfound msgid "Help keyword %s%s%s not found." msgstr "Kata kunci Bantuan %s%s%s tidak ditemukan." #: lclstrconsts.rshelphelpkeywordnotfoundindatabase msgid "Help keyword %s%s%s not found in Database %s%s%s." msgstr "Kata kunci Bantuan %s%s%s tidak ditemukan dalam Database %s%s%s." #: lclstrconsts.rshelphelpnodehasnohelpdatabase msgid "Help node %s%s%s has no Help Database" msgstr "Node Bantuan %s%s%s tidak mempunyai Database Bantuan" #: lclstrconsts.rshelpnohelpfoundforsource msgid "No help found for line %d, column %d of %s." msgstr "Tidak ada bantuan ditemukan untuk baris %d, column %d of %s." #: lclstrconsts.rshelpnohelpnodesavailable #, fuzzy #| msgid "No help nodes available" msgid "No help entries available for this topic" msgstr "Node bantuan tidak tersedia" #: lclstrconsts.rshelpnotfound #, fuzzy #| msgid "Help not found" msgid "No help found for this topic" msgstr "Bantuan tidak ditemukan" #: lclstrconsts.rshelpnotregistered msgid "%s: Not registered" msgstr "%s: Tidak teregistrasi" #: lclstrconsts.rshelpselectorerror msgid "Help Selector Error" msgstr "Selektor Bantuan Salah" #: lclstrconsts.rshelpthereisnoviewerforhelptype msgid "There is no viewer for help type %s%s%s" msgstr "Tidak ada peninjau untuk tipe bantuan %s%s%s" #: lclstrconsts.rshelpviewererror msgid "Help Viewer Error" msgstr "Peninjau Bantuan Salah" #: lclstrconsts.rshelpviewernotfound #, fuzzy #| msgid "Help Viewer not found" msgid "No viewer was found for this type of help content" msgstr "Peninjau Bantuian tidak ditemukan" #: lclstrconsts.rshighlightcolorcaption msgid "Highlight" msgstr "" #: lclstrconsts.rshighlighttextcolorcaption msgid "Highlight Text" msgstr "" #: lclstrconsts.rshotlightcolorcaption msgid "Hot Light" msgstr "" #: lclstrconsts.rsicns msgid "Mac OS X Icon" msgstr "" #: lclstrconsts.rsicon msgid "Icon" msgstr "Ikon" #: lclstrconsts.rsiconimageempty msgid "Icon image cannot be empty" msgstr "" #: lclstrconsts.rsiconimageformat msgid "Icon image must have the same format" msgstr "" #: lclstrconsts.rsiconimageformatchange msgid "Cannot change format of icon image" msgstr "" #: lclstrconsts.rsiconimagesize msgid "Icon image must have the same size" msgstr "" #: lclstrconsts.rsiconimagesizechange msgid "Cannot change size of icon image" msgstr "" #: lclstrconsts.rsiconnocurrent msgid "Icon has no current image" msgstr "" #: lclstrconsts.rsinactivebordercolorcaption msgid "Inactive Border" msgstr "" #: lclstrconsts.rsinactivecaptioncolorcaption msgctxt "lclstrconsts.rsinactivecaptioncolorcaption" msgid "Inactive Caption" msgstr "" #: lclstrconsts.rsinactivecaptiontext msgctxt "lclstrconsts.rsinactivecaptiontext" msgid "Inactive Caption" msgstr "" #: lclstrconsts.rsindexoutofbounds msgid "%s Index %d out of bounds 0 .. %d" msgstr "%s Indeks %d di luar jangkauan 0 .. %d" #: lclstrconsts.rsindexoutofrange msgid "Index Out of range Cell[Col=%d Row=%d]" msgstr "Indeks Diluar jangkauan Cell[Kolom=%d Baris=%d]" #: lclstrconsts.rsinfobkcolorcaption msgid "Info Background" msgstr "" #: lclstrconsts.rsinfotextcolorcaption msgid "Info Text" msgstr "" #: lclstrconsts.rsinsertrecordhint msgctxt "lclstrconsts.rsinsertrecordhint" msgid "Insert" msgstr "Insert" #: lclstrconsts.rsinvaliddate msgid "Invalid Date : %s" msgstr "Tanggal tidak benar : %s" #: lclstrconsts.rsinvaliddaterangehint msgid "Invalid Date: %s. Must be between %s and %s" msgstr "Tanggal tidak benar: %s. Harus ada diantara %s dan %s" #: lclstrconsts.rsinvalidformobjectstream msgid "invalid Form object stream" msgstr "Aliran Objek Form tidak benar" #: lclstrconsts.rsinvalidpropertyvalue msgid "Invalid property value" msgstr "Nilai properti tidak benar" #: lclstrconsts.rsinvalidstreamformat msgid "Invalid stream format" msgstr "Format stream tidak benar" #: lclstrconsts.rsisalreadyassociatedwith msgid "%s is already associated with %s" msgstr "%s sudah dikaitkan dengan %s" #: lclstrconsts.rsjpeg msgid "Joint Picture Expert Group" msgstr "" #: lclstrconsts.rslastrecordhint msgid "Last" msgstr "" #: lclstrconsts.rslimecolorcaption msgid "Lime" msgstr "" #: lclstrconsts.rslistindexexceedsbounds msgid "List index exceeds bounds (%d)" msgstr "Indeks List melebihi jangkauan (%d)" #: lclstrconsts.rslistmustbeempty msgid "List must be empty" msgstr "List harus kosong" #: lclstrconsts.rsmarooncolorcaption msgid "Maroon" msgstr "" #: lclstrconsts.rsmbabort msgid "Abort" msgstr "Batal" #: lclstrconsts.rsmball msgid "&All" msgstr "&Semua" #: lclstrconsts.rsmbcancel msgctxt "lclstrconsts.rsmbcancel" msgid "Cancel" msgstr "Batal" #: lclstrconsts.rsmbclose msgid "&Close" msgstr "&Tutup" #: lclstrconsts.rsmbhelp msgid "&Help" msgstr "&Panduan" #: lclstrconsts.rsmbignore msgid "&Ignore" msgstr "&Abaikan" #: lclstrconsts.rsmbno msgid "&No" msgstr "&Tidak" #: lclstrconsts.rsmbnotoall msgid "No to all" msgstr "Tidak untuk semua" #: lclstrconsts.rsmbok msgid "&OK" msgstr "&OK" #: lclstrconsts.rsmbopen msgid "&Open" msgstr "" #: lclstrconsts.rsmbretry msgid "&Retry" msgstr "&Coba lagi" #: lclstrconsts.rsmbsave msgid "&Save" msgstr "" #: lclstrconsts.rsmbunlock msgid "&Unlock" msgstr "" #: lclstrconsts.rsmbyes msgid "&Yes" msgstr "&Ya" #: lclstrconsts.rsmbyestoall msgid "Yes to &All" msgstr "Ya untuk &Semua" #: lclstrconsts.rsmedgraycolorcaption msgid "Medium Gray" msgstr "" #: lclstrconsts.rsmenubarcolorcaption msgid "Menu Bar" msgstr "" #: lclstrconsts.rsmenucolorcaption msgctxt "lclstrconsts.rsmenucolorcaption" msgid "Menu" msgstr "Menu" #: lclstrconsts.rsmenuhighlightcolorcaption msgid "Menu Highlight" msgstr "" #: lclstrconsts.rsmenutextcolorcaption msgid "Menu Text" msgstr "" #: lclstrconsts.rsmodified msgid " modified " msgstr " diubah " #: lclstrconsts.rsmoneygreencolorcaption msgid "Money Green" msgstr "" #: lclstrconsts.rsmtauthentication msgid "Authentication" msgstr "" #: lclstrconsts.rsmtconfirmation msgid "Confirmation" msgstr "Konfirmasi" #: lclstrconsts.rsmtcustom msgid "Custom" msgstr "Kustom" #: lclstrconsts.rsmterror msgctxt "lclstrconsts.rsmterror" msgid "Error" msgstr "Salah" #: lclstrconsts.rsmtinformation msgid "Information" msgstr "Informasi" #: lclstrconsts.rsmtwarning msgid "Warning" msgstr "Peringatan" #: lclstrconsts.rsnavycolorcaption msgid "Navy" msgstr "" #: lclstrconsts.rsnextrecordhint msgctxt "lclstrconsts.rsnextrecordhint" msgid "Next" msgstr "Berikutnya" #: lclstrconsts.rsnonecolorcaption msgid "None" msgstr "" #: lclstrconsts.rsnotavalidgridfile msgid "Not a valid grid file" msgstr "Bukan file grid yang benar" #: lclstrconsts.rsnowidgetset msgid "No widgetset object. Please check if the unit \"interfaces\" was added to the programs uses clause." msgstr "Objek widgetset todal ada. Tolong periksa apakah unit \"interfaces\" sudah ditambahkan ke klausul uses program." #: lclstrconsts.rsolivecolorcaption msgid "Olive" msgstr "" #: lclstrconsts.rspickdate msgid "Select a date" msgstr "Pilih tanggal" #: lclstrconsts.rspixmap msgid "Pixmap" msgstr "Pixmap" #: lclstrconsts.rsportablebitmap msgid "Portable BitMap" msgstr "" #: lclstrconsts.rsportablegraymap msgid "Portable GrayMap" msgstr "" #: lclstrconsts.rsportablenetworkgraphic msgid "Portable Network Graphic" msgstr "Portable Network Graphic" #: lclstrconsts.rsportablepixmap msgid "Portable PixMap" msgstr "" #: lclstrconsts.rspostrecordhint msgid "Post" msgstr "" #: lclstrconsts.rspressoktoignoreandriskdatacorruptionpresscanceltok #, fuzzy #| msgid "%s%sPress Ok to ignore and risk data corruption.%sPress Cancel to kill the program." msgid "%s%sPress OK to ignore and risk data corruption.%sPress Cancel to kill the program." msgstr "%s%sTekan Ok untuk mengabaikan dan resiko kerusakan data.%sTekan Batal untuk mematikan program" #: lclstrconsts.rspriorrecordhint msgctxt "lclstrconsts.rspriorrecordhint" msgid "Prior" msgstr "Sebelumnya" #: lclstrconsts.rspromptonreplace msgid "Prompt on replace" msgstr "" #: lclstrconsts.rspropertydoesnotexist msgid "Property %s does not exist" msgstr "Properti %s tidak ada" #: lclstrconsts.rspurplecolorcaption msgid "Purple" msgstr "" #: lclstrconsts.rsqtoptiondograb msgid "-dograb (only under X11), running under a debugger can cause an implicit -nograb, use -dograb to override. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptiongraphicsstyle msgid "-graphicssystem param, sets the backend to be used for on-screen widgets and QPixmaps. Available options are native, raster and opengl. OpenGL is still unstable." msgstr "" #: lclstrconsts.rsqtoptionnograb msgid "-nograb, tells Qt that it must never grab the mouse or the keyboard. Need QT_DEBUG." msgstr "" #: lclstrconsts.rsqtoptionreverse msgid "-reverse, sets the application's layout direction to Qt::RightToLeft." msgstr "" #: lclstrconsts.rsqtoptionsession msgid "-session session, restores the application from an earlier session." msgstr "" #: lclstrconsts.rsqtoptionstyle msgid "-style style or -style=style, sets the application GUI style. Possible values are motif, windows, and platinum. If you compiled Qt with additional styles or have additional styles as plugins these will be available to the -style command line option. NOTE: Not all styles are available on all platforms. If style param does not exist Qt will start an application with default common style (windows)." msgstr "" #: lclstrconsts.rsqtoptionstylesheet msgid "-stylesheet stylesheet or -stylesheet=stylesheet, sets the application Style Sheet. The value must be a path to a file that contains the Style Sheet. Note: Relative URLs in the Style Sheet file are relative to the Style Sheet file's path." msgstr "" #: lclstrconsts.rsqtoptionsync msgid "-sync (only under X11), switches to synchronous mode for debugging." msgstr "" #: lclstrconsts.rsqtoptionwidgetcount msgid "-widgetcount, prints debug message at the end about number of widgets left undestroyed and maximum number of widgets existed at the same time." msgstr "" #: lclstrconsts.rsqtoptionx11bgcolor msgid "-bg or -background color, sets the default background color and an application palette (light and dark shades are calculated)." msgstr "" #: lclstrconsts.rsqtoptionx11btncolor msgid "-btn or -button color, sets the default button color." msgstr "" #: lclstrconsts.rsqtoptionx11cmap msgid "-cmap, causes the application to install a private color map on an 8-bit display." msgstr "" #: lclstrconsts.rsqtoptionx11display msgid "-display display, sets the X display (default is $DISPLAY)." msgstr "" #: lclstrconsts.rsqtoptionx11fgcolor msgid "-fg or -foreground color, sets the default foreground color." msgstr "" #: lclstrconsts.rsqtoptionx11font msgid "-fn or -font font, defines the application font. The font should be specified using an X logical font description." msgstr "" #: lclstrconsts.rsqtoptionx11geometry msgid "-geometry geometry, sets the client geometry of the first window that is shown." msgstr "" #: lclstrconsts.rsqtoptionx11im msgid "-im, sets the input method server (equivalent to setting the XMODIFIERS environment variable)." msgstr "" #: lclstrconsts.rsqtoptionx11inputstyle msgid "-inputstyle, defines how the input is inserted into the given widget, e.g. onTheSpot makes the input appear directly in the widget, while overTheSpot makes the input appear in a box floating over the widget and is not inserted until the editing is done." msgstr "" #: lclstrconsts.rsqtoptionx11name msgid "-name name, sets the application name." msgstr "" #: lclstrconsts.rsqtoptionx11ncols msgid "-ncols count, limits the number of colors allocated in the color cube on an 8-bit display, if the application is using the QApplication::ManyColor color specification. If count is 216 then a 6x6x6 color cube is used (i.e. 6 levels of red, 6 of green, and 6 of blue); for other values, a cube approximately proportional to a 2x3x1 cube is used." msgstr "" #: lclstrconsts.rsqtoptionx11title msgid "-title title, sets the application title." msgstr "" #: lclstrconsts.rsqtoptionx11visual msgid "-visual TrueColor, forces the application to use a TrueColor visual on an 8-bit display." msgstr "" #: lclstrconsts.rsrasterimageendupdate msgid "Endupdate while no update in progress" msgstr "" #: lclstrconsts.rsrasterimagesaveinupdate msgid "Cannot save image while update in progress" msgstr "" #: lclstrconsts.rsrasterimageupdateall msgid "Cannot begin update all when canvas only update in progress" msgstr "" #: lclstrconsts.rsredcolorcaption msgid "Red" msgstr "" #: lclstrconsts.rsrefreshrecordshint msgid "Refresh" msgstr "" #: lclstrconsts.rsreplace msgid "Replace" msgstr "Ganti" #: lclstrconsts.rsreplaceall msgid "Replace all" msgstr "Ganti semua" #: lclstrconsts.rsresourcenotfound msgctxt "lclstrconsts.rsresourcenotfound" msgid "Resource %s not found" msgstr "Sumber %s tidak ditemukan" #: lclstrconsts.rsscrollbarcolorcaption msgid "ScrollBar" msgstr "" #: lclstrconsts.rsscrollbaroutofrange msgid "ScrollBar property out of range" msgstr "Properti ScrollBar diluar jangkauan" #: lclstrconsts.rsselectcolortitle msgid "Select color" msgstr "Pilih warna" #: lclstrconsts.rsselectfonttitle msgid "Select a font" msgstr "Pilih font" #: lclstrconsts.rssilvercolorcaption msgid "Silver" msgstr "" #: lclstrconsts.rssize msgid " size " msgstr " ukuran " #: lclstrconsts.rsskybluecolorcaption msgid "Sky Blue" msgstr "" #: lclstrconsts.rstcustomtabcontrolaccessibilitydescription msgid "A control with tabs" msgstr "" #: lclstrconsts.rstealcolorcaption msgid "Teal" msgstr "" #: lclstrconsts.rstext msgid "Text" msgstr "Teks" #: lclstrconsts.rstiff msgid "Tagged Image File Format" msgstr "" #: lclstrconsts.rstpanelaccessibilitydescription msgid "Panel" msgstr "" #: lclstrconsts.rstsplitteraccessibilitydescription msgid "A grip to control how much size to give two parts of an area" msgstr "" #: lclstrconsts.rsttreeviewaccessibilitydescription msgid "A tree of items" msgstr "" #: lclstrconsts.rsunabletoloaddefaultfont msgid "Unable to load default font" msgstr "Tidak bisa mengambil font default" #: lclstrconsts.rsunknownerrorpleasereportthisbug msgid "Unknown Error, please report this bug" msgstr "Kesalahan Tidak Dikenal, silahkan laporkan bug ini" #: lclstrconsts.rsunknownpictureextension msgid "Unknown picture extension" msgstr "Ekstensi gambar tidak dikenal" #: lclstrconsts.rsunknownpictureformat msgid "Unknown picture format" msgstr "" #: lclstrconsts.rsunsupportedbitmapformat msgid "Unsupported bitmap format." msgstr "Format bitmap tidak didukung." #: lclstrconsts.rsunsupportedclipboardformat msgid "Unsupported clipboard format: %s" msgstr "Format clipboard tidak didukung: %s" #: lclstrconsts.rswarningunreleaseddcsdump msgid " WARNING: There are %d unreleased DCs, a detailed dump follows:" msgstr " PERINGATAN: Ada %d DCs tidak dilepas, dump detil sebagai berikut:" #: lclstrconsts.rswarningunreleasedgdiobjectsdump msgid " WARNING: There are %d unreleased GDIObjects, a detailed dump follows:" msgstr " PERINGATAN: Ada %d GDIObjects tidak dilepas, detil dump sebagai berikut:" #: lclstrconsts.rswarningunreleasedmessagesinqueue msgid " WARNING: There are %d messages left in the queue! I'll free them" msgstr " PERINGATAN: Ada %d pesan tersisa dalam antrian! Saya akan membebaskannya" #: lclstrconsts.rswarningunreleasedtimerinfos msgid " WARNING: There are %d TimerInfo structures left, I'll free them" msgstr " PERINGATAN: Ada %d struktur TimerInfo tersisa, Saya akan membebaskannya" #: lclstrconsts.rswarningunremovedpaintmessages msgid " WARNING: There are %s unremoved LM_PAINT/LM_GtkPAINT message links left." msgstr " PERINGATAN: ada %s tersisa link pesan LM_PAINT/LM_GtkPAINT tidak dihapus." #: lclstrconsts.rswhitecolorcaption msgid "White" msgstr "" #: lclstrconsts.rswholewordsonly msgid "Whole words only" msgstr "Hanya seluruh kata" #: lclstrconsts.rswin32error msgid "Error:" msgstr "Kesalahan:" #: lclstrconsts.rswin32warning msgid "Warning:" msgstr "Peringatan:" #: lclstrconsts.rswindowcolorcaption msgid "Window" msgstr "" #: lclstrconsts.rswindowframecolorcaption msgid "Window Frame" msgstr "" #: lclstrconsts.rswindowtextcolorcaption msgid "Window Text" msgstr "" #: lclstrconsts.rsyellowcolorcaption msgid "Yellow" msgstr "" #: lclstrconsts.scannotfocus msgid "Cannot focus a disabled or invisible window" msgstr "Tidak bisa memberikan fokus ke jendela yang dimatikan atau tidak nampak" #: lclstrconsts.sduplicatemenus msgid "Duplicate menus" msgstr "Duplikasi menu" #: lclstrconsts.sinvalidactioncreation msgid "Invalid action creation" msgstr "Pembuatan action tidak benar" #: lclstrconsts.sinvalidactionenumeration msgid "Invalid action enumeration" msgstr "Enumerasi action tidak benar" #: lclstrconsts.sinvalidactionregistration msgid "Invalid action registration" msgstr "Registrasi action tidak benar" #: lclstrconsts.sinvalidactionunregistration msgid "Invalid action unregistration" msgstr "Pembatalan registrasi action tidak benar" #: lclstrconsts.sinvalidcharset msgid "The char set in mask \"%s\" is not valid!" msgstr "set karakter dalam mask \"%s\" tidak benar!" #: lclstrconsts.sinvalidimagesize msgid "Invalid image size" msgstr "Ukuran gambar tidak benar" #: lclstrconsts.sinvalidindex msgid "Invalid ImageList Index" msgstr "Indeks ImageList tidak benar" #: lclstrconsts.smaskeditnomatch msgid "The current text does not match the specified mask." msgstr "" #: lclstrconsts.smenuindexerror msgid "Menu index out of range" msgstr "Indeks Menu diluar jangkauan" #: lclstrconsts.smenuitemisnil msgid "MenuItem is nil" msgstr "MenuItem kosong" #: lclstrconsts.smenunotfound msgid "Sub-menu is not in menu" msgstr "Sub-menu tidak dalam menu" #: lclstrconsts.smkcalt msgid "Alt+" msgstr "" #: lclstrconsts.smkcbksp msgid "BkSp" msgstr "" #: lclstrconsts.smkcctrl msgid "Ctrl+" msgstr "" #: lclstrconsts.smkcdel msgid "Del" msgstr "" #: lclstrconsts.smkcdown msgctxt "lclstrconsts.smkcdown" msgid "Down" msgstr "Turun" #: lclstrconsts.smkcend msgctxt "lclstrconsts.smkcend" msgid "End" msgstr "End" #: lclstrconsts.smkcenter msgid "Enter" msgstr "" #: lclstrconsts.smkcesc msgid "Esc" msgstr "" #: lclstrconsts.smkchome msgctxt "lclstrconsts.smkchome" msgid "Home" msgstr "Home" #: lclstrconsts.smkcins msgid "Ins" msgstr "" #: lclstrconsts.smkcleft msgctxt "lclstrconsts.smkcleft" msgid "Left" msgstr "Left" #: lclstrconsts.smkcmeta msgid "Meta+" msgstr "" #: lclstrconsts.smkcpgdn msgid "PgDn" msgstr "" #: lclstrconsts.smkcpgup msgid "PgUp" msgstr "" #: lclstrconsts.smkcright msgctxt "lclstrconsts.smkcright" msgid "Right" msgstr "Right" #: lclstrconsts.smkcshift msgid "Shift+" msgstr "" #: lclstrconsts.smkcspace msgid "Space" msgstr "" #: lclstrconsts.smkctab msgctxt "lclstrconsts.smkctab" msgid "Tab" msgstr "Tab" #: lclstrconsts.smkcup msgctxt "lclstrconsts.smkcup" msgid "Up" msgstr "Up" #: lclstrconsts.snomdiform msgid "No MDI form present." msgstr "Tidak ada form MDI" #: lclstrconsts.snotimers msgid "No timers available" msgstr "Tidak tersedia timer" #: lclstrconsts.sparexpected msgid "Wrong token type: %s expected" msgstr "" #: lclstrconsts.sparinvalidfloat msgid "Invalid floating point number: %s" msgstr "" #: lclstrconsts.sparinvalidinteger msgid "Invalid integer number: %s" msgstr "" #: lclstrconsts.sparlocinfo msgid " (at %d,%d, stream offset %d)" msgstr "" #: lclstrconsts.sparunterminatedbinvalue msgid "Unterminated byte value" msgstr "" #: lclstrconsts.sparunterminatedstring msgid "Unterminated string" msgstr "" #: lclstrconsts.sparwrongtokensymbol msgid "Wrong token symbol: %s expected but %s found" msgstr "" #: lclstrconsts.sparwrongtokentype msgid "Wrong token type: %s expected but %s found" msgstr "" doublecmd-0.5.8/language/doublecmd.cs.po0000644000175000017500000066542612250633131017212 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.5 alpha\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-01-17 23:08+0300\n" "PO-Revision-Date: 2013-08-23 09:48+0100\n" "Last-Translator: Petr Šimáček \n" "Language-Team: pestasoft.com \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Czech\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "Vše" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "Vše" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "Vše" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "Vše" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "Vše" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "Vše" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "Vše" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "Zrušit" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "..." #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "->" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "<-" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "Nastavit vlastní pohled sloupců" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "Pozadí:" #: tfcolumnssetconf.cbcursorborder.caption msgid "Cursor border" msgstr "Okraj ukazatele" #: tfcolumnssetconf.cbovercolor.caption msgid "Allow Overcolor" msgstr "Povolit barvu přes" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "Použít vlastní písmo a barvu" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "Barva písma:" #: tfcolumnssetconf.label3.caption #| msgid "Configure view nr:" msgctxt "TFCOLUMNSSETCONF.LABEL3.CAPTION" msgid "Font:" msgstr "Písmo:" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "Velikost:" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "Pozadí 2:" #: tfcolumnssetconf.lblconfigviewnr.caption #| msgid "Configure view nr:" msgctxt "TFCOLUMNSSETCONF.LBLCONFIGVIEWNR.CAPTION" msgid "Configure view nr:" msgstr "Nastavení pohledu č.:" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "Barva kursoru:" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "Text kursoru:" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "Barva označených:" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "Jméno:" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "Přidat sloupec" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "Nastavení sloupců:" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "Náhled" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "R" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "Vybrat šablonu..." #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption #| msgid "Check free space" msgid "C&heck free space" msgstr "Z&kontrolovat volné místo" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption msgid "Cop&y attributes" msgstr "Kopírova&t atributy" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption msgid "Copy o&wnership" msgstr "Kopírovat v&lastnictví" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption msgid "Copy d&ate/time" msgstr "Kopírovat d&atum/čas" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption #| msgid "Correct links" msgid "Correct lin&ks" msgstr "Opravit odka&zy" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption #| msgid "Drop readonly flag" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "Zrušit pří&znak jen pro čtení" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption msgid "E&xclude empty directories" msgstr "V&yloučit prázdné adresáře" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption #| msgid "Follow links" msgid "Fo&llow links" msgstr "Ná&sledovat odkazy" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "&Rezervní prostor" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "Co dělat, když nelze nastavit čas souboru, atributy, atd." #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "Použít šablonu souboru" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption #| msgid "When directory exists" msgid "When dir&ectory exists" msgstr "Pokud adr&esář existuje" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption #| msgid "When file exists" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "Pokud &soubor existuje" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption msgid "When ca&nnot set property" msgstr "Pokud ne&lze nastavit vlastnost" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "<žádná šablona>" #: tfrmabout.btnclose.caption msgctxt "TFRMABOUT.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zavřít" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "Kopírovat do schránky" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "O programu" #: tfrmabout.lblbuild.caption msgid "Build" msgstr "Sestavení" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "Free Pascal" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "Domovská stránka:" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "http://doublecmd.sourceforge.net" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "Lazarus" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "Revize" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption msgid "Version" msgstr "Verze" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "&Nulovat" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "Vyberte atributy" #: tfrmattributesedit.cbarchive.caption #| msgid "Archive" msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "&Archív" #: tfrmattributesedit.cbcompressed.caption #| msgid "Compressed" msgid "Co&mpressed" msgstr "Ko&mprimováno" #: tfrmattributesedit.cbdirectory.caption #| msgid "Directory" msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "&Adresář" #: tfrmattributesedit.cbencrypted.caption #| msgid "Encrypted" msgid "&Encrypted" msgstr "&Kódováno" #: tfrmattributesedit.cbhidden.caption #| msgid "Hidden" msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "&Skryté" #: tfrmattributesedit.cbreadonly.caption #| msgid "Read only" msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "Pouze pro č&tení" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmattributesedit.cbsparse.caption #| msgid "Sparse" msgid "S&parse" msgstr "Ř&ídké" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Sticky" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmattributesedit.cbsymlink.caption #| msgid "Symlink" msgid "&Symlink" msgstr "&Symbolický odkaz" #: tfrmattributesedit.cbsystem.caption #| msgid "System" msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "S&ystém" #: tfrmattributesedit.cbtemporary.caption #| msgid "Temporary" msgid "&Temporary" msgstr "&Dočasné" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "Atributy NTFS" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "Obecné atributy" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bitů:" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Skupina" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Ostatní" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Vlastník" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "Spustit" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "Čtení" #: tfrmattributesedit.lbltextattrs.caption #| msgid "As text:" msgid "As te&xt:" msgstr "Jako te&xt:" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "Zápis" #: tfrmchecksumcalc.btncancel.caption #| msgid "Cancel" msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmchecksumcalc.caption msgctxt "tfrmchecksumcalc.caption" msgid "Calculate check sum..." msgstr "Výpočet kontrolního součtu..." #: tfrmchecksumcalc.cbseparatefile.caption #| msgid "Create separate checksum file for each file" msgid "C&reate separate checksum file for each file" msgstr "V&ytvořit samostatný kontrolní součet pro každý soubor" #: tfrmchecksumcalc.lblsaveto.caption #| msgid "Save check sum file(s) to:" msgid "&Save check sum file(s) to:" msgstr "&Uložit soubor(y) s kontrolním součtem do:" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zavřít" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "Kontrola kontrolního součtu..." #: tfrmconnectionmanager.btnadd.caption #| msgid "Add" msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "P&řidat" #: tfrmconnectionmanager.btncancel.caption #| msgid "Cancel" msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmconnectionmanager.btnconnect.caption #| msgid "Connect" msgid "C&onnect" msgstr "P&řipojit" #: tfrmconnectionmanager.btndelete.caption #| msgid "Delete" msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "&Vymazat" #: tfrmconnectionmanager.btnedit.caption #| msgid "Edit" msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "&Upravit" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "Správce připojení" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "Připojit k:" #: tfrmcopydlg.btnaddtoqueue.caption msgid "A&dd To Queue" msgstr "Při&dat do fronty" #: tfrmcopydlg.btncancel.caption #| msgid "Cancel" msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "tfrmcopydlg.btncreatespecialqueue.caption" msgid "..." msgstr "..." #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "N&astavení" #: tfrmcopydlg.btnsaveoptions.caption #| msgid "Save these options as default" msgid "Sa&ve these options as default" msgstr "Ul&ožit tyto předvolby jako výchozí" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "Kopírovat soubor(y)" #: tfrmdescredit.btncancel.caption #| msgid "Cancel" msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "Komentář souboru/adresáře" #: tfrmdescredit.lbleditcommentfor.caption #| msgid "Edit comment for:" msgid "E&dit comment for:" msgstr "U&pravit komentář pro:" #: tfrmdescredit.lblencoding.caption #| msgid "Encoding:" msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "&Kódování:" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "O programu" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "Automaticky porovnat" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "Binární režim" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "Zrušit" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "Zrušit" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "Kopírovat blok pravý" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "Kopírovat blok pravý" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "Kopírovat blok levý" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "Kopírovat blok levý" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Kopírovat" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Vyjmout" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Vymazat" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Vložit" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Opakovat" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "Vybrat &vše" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Zpět" #: tfrmdiffer.actexit.caption msgctxt "tfrmdiffer.actexit.caption" msgid "E&xit" msgstr "&Konec" #: tfrmdiffer.actfirstdifference.caption msgctxt "tfrmdiffer.actfirstdifference.caption" msgid "First Difference" msgstr "První rozdíl" #: tfrmdiffer.actfirstdifference.hint msgctxt "tfrmdiffer.actfirstdifference.hint" msgid "First Difference" msgstr "První rozdíl" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "Ignorovat velikost znaků" #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "Ignorovat mezery" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "Udržovat rolování" #: tfrmdiffer.actlastdifference.caption msgctxt "tfrmdiffer.actlastdifference.caption" msgid "Last Difference" msgstr "Poslední rozdíl" #: tfrmdiffer.actlastdifference.hint msgctxt "tfrmdiffer.actlastdifference.hint" msgid "Last Difference" msgstr "Poslední rozdíl" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "Rozdíly řádky" #: tfrmdiffer.actnextdifference.caption msgctxt "tfrmdiffer.actnextdifference.caption" msgid "Next Difference" msgstr "Další rozdíl" #: tfrmdiffer.actnextdifference.hint msgctxt "tfrmdiffer.actnextdifference.hint" msgid "Next Difference" msgstr "Další rozdíl" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "Otevřít levý..." #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "Otevřít pravý..." #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "Kreslit pozadí" #: tfrmdiffer.actprevdifference.caption msgctxt "tfrmdiffer.actprevdifference.caption" msgid "Previous Difference" msgstr "Předchozí rozdíl" #: tfrmdiffer.actprevdifference.hint msgctxt "tfrmdiffer.actprevdifference.hint" msgid "Previous Difference" msgstr "Předchozí rozdíl" #: tfrmdiffer.actreload.caption #| msgid "Reload" msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "&Znovu načíst" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "Znovu načíst" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "Uložit" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "Uložit" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "Uložit jako..." #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "Uložit jako..." #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "Uložit levý" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "Uložit levý" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "Uložit levý jako..." #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "Uložit levý jako..." #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "Uložit pravý" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "Uložit pravý" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "Uložit pravý jako..." #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "Uložit pravý jako..." #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "Porovnat" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "Porovnat" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "Kódování" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "Kódování" #: tfrmdiffer.caption msgctxt "TFRMDIFFER.CAPTION" msgid "Compare files" msgstr "Porovnat soubory" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miencodingleft.caption #| msgid "Left" msgid "&Left" msgstr "&Vlevo" #: tfrmdiffer.miencodingright.caption #| msgid "Right" msgid "&Right" msgstr "&Vpravo" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "&Akce" #: tfrmdiffer.mnuedit.caption #| msgid "Edit" msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "&Upravit" #: tfrmdiffer.mnuencoding.caption #| msgid "Encoding" msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "Kó&dování" #: tfrmdiffer.mnufile.caption #| msgid "File" msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "&Soubor" #: tfrmdiffer.mnuoptions.caption #| msgid "Options" msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "&Předvolby" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "Přidat novou zkratku do sekvence" #: tfrmedithotkey.btncancel.caption msgctxt "TFRMEDITHOTKEY.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmedithotkey.btnok.caption msgctxt "TFRMEDITHOTKEY.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "Odstranit poslední zkratku ze sekvence" #: tfrmedithotkey.cghkcontrols.caption msgctxt "tfrmedithotkey.cghkcontrols.caption" msgid "Only for these controls" msgstr "Pouze pro tyto prvky" #: tfrmedithotkey.lblparameters.caption msgid "&Parameters (each in a separate line):" msgstr "&Parametry (každý na zvláštní řádce):" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "Zkratky:" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "O programu" #: tfrmeditor.actabout.hint msgctxt "tfrmeditor.actabout.hint" msgid "About" msgstr "O programu" #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "&Nastavení" #: tfrmeditor.actconfhigh.hint msgctxt "tfrmeditor.actconfhigh.hint" msgid "Configuration" msgstr "Nastavení" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Kopírovat" #: tfrmeditor.acteditcopy.hint msgctxt "tfrmeditor.acteditcopy.hint" msgid "Copy" msgstr "Kopírovat" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Vyjmout" #: tfrmeditor.acteditcut.hint msgctxt "tfrmeditor.acteditcut.hint" msgid "Cut" msgstr "Vyjmout" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Vymazat" #: tfrmeditor.acteditdelete.hint msgctxt "tfrmeditor.acteditdelete.hint" msgid "Delete" msgstr "Vymazat" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "&Hledat" #: tfrmeditor.acteditfind.hint msgctxt "tfrmeditor.acteditfind.hint" msgid "Find" msgstr "Hledat" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "Hledat další" #: tfrmeditor.acteditfindnext.hint msgctxt "tfrmeditor.acteditfindnext.hint" msgid "Find next" msgstr "Hledat další" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "Mac (CR)" #: tfrmeditor.acteditlineendcr.hint msgctxt "tfrmeditor.acteditlineendcr.hint" msgid "Mac (CR)" msgstr "Mac (CR)" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "Windows (CRLF)" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "tfrmeditor.acteditlineendcrlf.hint" msgid "Windows (CRLF)" msgstr "Windows (CRLF)" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "Unix (LF)" #: tfrmeditor.acteditlineendlf.hint msgctxt "tfrmeditor.acteditlineendlf.hint" msgid "Unix (LF)" msgstr "Unix (LF)" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Vložit" #: tfrmeditor.acteditpaste.hint msgctxt "tfrmeditor.acteditpaste.hint" msgid "Paste" msgstr "Vložit" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Opakovat" #: tfrmeditor.acteditredo.hint msgctxt "tfrmeditor.acteditredo.hint" msgid "Redo" msgstr "Opakovat" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "&Nahradit" #: tfrmeditor.acteditrplc.hint msgctxt "tfrmeditor.acteditrplc.hint" msgid "Replace" msgstr "Nahradit" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "Vybrat &vše" #: tfrmeditor.acteditselectall.hint msgctxt "tfrmeditor.acteditselectall.hint" msgid "Select All" msgstr "Vybrat vše" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Zpět" #: tfrmeditor.acteditundo.hint msgctxt "tfrmeditor.acteditundo.hint" msgid "Undo" msgstr "Zpět" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "&Zavřít" #: tfrmeditor.actfileclose.hint msgctxt "tfrmeditor.actfileclose.hint" msgid "Close" msgstr "Zavřít" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "&Konec" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "Ukončit" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "&Nový" #: tfrmeditor.actfilenew.hint msgctxt "tfrmeditor.actfilenew.hint" msgid "New" msgstr "Nový" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "&Otevřít" #: tfrmeditor.actfileopen.hint msgctxt "tfrmeditor.actfileopen.hint" msgid "Open" msgstr "Otevřít" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "&Uložit" #: tfrmeditor.actfilesave.hint msgctxt "tfrmeditor.actfilesave.hint" msgid "Save" msgstr "Uložit" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "Uložit &jako.." #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "Uložit jako" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "&Uložit vše" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "Uložit vše" #: tfrmeditor.caption msgctxt "tfrmeditor.caption" msgid "Editor" msgstr "Editor" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "&Nápověda" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Upravit" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "Kó&dování" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "Otevřít jako" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "Uložit jako" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "&Soubor" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "Zvýrazňování syntaxe" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "Konec řádky" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n5.caption msgctxt "TFRMEDITOR.N5.CAPTION" msgid "-" msgstr "-" #: tfrmeditsearchreplace.btncancel.caption #| msgid "Cancel" msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "&Rozlišovat velikost" #: tfrmeditsearchreplace.cbsearchfromcursor.caption #| msgid "Search from &caret" msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "H&ledat od ukazatele" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "&Regulární výrazy" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "Pouze vybraný &text" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "&Pouze celá slova" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "Předvolba" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "&Nahradit čím:" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "&Vyhledat:" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "Směr" #: tfrmextractdlg.btncancel.caption #| msgid "Cancel" msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmextractdlg.btnhelp.caption #| msgid "Help" msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "&Nápověda" #: tfrmextractdlg.btnok.caption #| msgid "OK" msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmextractdlg.caption msgctxt "TFRMEXTRACTDLG.CAPTION" msgid "Unpack files" msgstr "Dekomprese souborů" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "&Rozbalit i s cestou, pokud je uložena" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*.*" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "Rozbalit do oddělených po&dadresářů (podle názvu archívu)" #: tfrmextractdlg.cboverwrite.caption #| msgid "&Overwrite existing files" msgid "O&verwrite existing files" msgstr "P&řepsat existující soubory" #: tfrmextractdlg.lblextractto.caption #| msgid "To the directory:" msgid "To the &directory:" msgstr "Do &adresáře:" #: tfrmextractdlg.lblfilemask.caption #| msgid "Extract files matching file mask:" msgid "&Extract files matching file mask:" msgstr "&Extrahovat soubory odpovídající masce souborů:" #: tfrmextractdlg.lblpassword.caption #| msgid "Password for encrypted files:" msgid "&Password for encrypted files:" msgstr "&Heslo pro šifrované soubory:" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "Přidat" #: tfrmfileassoc.btnaddext.caption #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "&Přidat" #: tfrmfileassoc.btnaddnewtype.caption #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "P&řidat" #: tfrmfileassoc.btncancel.caption #| msgid "Cancel" msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmfileassoc.btndownact.caption #| msgid "Down" msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "&Dolů" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmfileassoc.btnremoveact.caption #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "Sma&zat" #: tfrmfileassoc.btnremoveext.caption #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "Sm&azat" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "X" #: tfrmfileassoc.btnremovetype.caption #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "&Smazat" #: tfrmfileassoc.btnrenametype.caption #| msgid "Rename" msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "S&mazat" #: tfrmfileassoc.btnupact.caption #| msgid "Up" msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "&Nahoru" #: tfrmfileassoc.caption msgid "File associations" msgstr "Asociace souborů" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "Akce" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "Přípony" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "Typy souborů" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "Ikona" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "Akce:" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "&Příkaz:" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "Edit" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "Otevřít v editoru" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "Název souboru" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "Cesta k souboru" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "Úplná cesta" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "Získat výstup příkazu" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "Otevřít" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "Spustit v terminálu" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "Otevřít v VFS" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "Zobrazit" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "Otevřít v prohlížeči" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zavřít" #: tfrmfileexecuteyourself.caption msgctxt "TFRMFILEEXECUTEYOURSELF.CAPTION" msgid "Wait..." msgstr "Čekejte..." #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "Jméno souboru:" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "Od:" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "Klikněte na Zavřít, až bude moc být odstraněn dočasný soubor!" #: tfrmfileop.btncancel.caption #| msgid "Cancel" msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "&Na panel" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "&Zobrazit vše" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "Současná operace:" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "Od:" #: tfrmfileop.lblto.caption msgid "To:" msgstr "Komu:" #: tfrmfileproperties.btnclose.caption #| msgid "Close" msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zavřít" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "&Nastavení vlastností" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "Nastavit na &všech vybraných souborech" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "Pře&skočit tento soubor" #: tfrmfileproperties.caption msgctxt "TFRMFILEPROPERTIES.CAPTION" msgid "Properties" msgstr "Vlastnosti" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Sticky" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "Vlastník" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bitů:" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Skupina" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Ostatní" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Vlastník" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmfileproperties.lblattrtextstr.caption #| msgid "Representation in text:" msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Text:" #: tfrmfileproperties.lblcontains.caption msgctxt "tfrmfileproperties.lblcontains.caption" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "Obsahuje:" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Spustit" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "Název souboru" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "Jméno:" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "Název souboru" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "Cesta:" #: tfrmfileproperties.lblgroupstr.caption #| msgid "Group" msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "&Skupina" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "Poslední přístup:" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "Poslední změna:" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "Poslední změna stavu:" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Osmičkově:" #: tfrmfileproperties.lblownerstr.caption #| msgid "Owner" msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "V&lastník" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Čtení" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "Velikost:" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption #| msgid "Symlink:" msgid "Symlink to:" msgstr "Sym. odkaz na:" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption msgid "Type:" msgstr "Typ:" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Zápis" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atributy" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "Vlastnosti" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "&Přidat" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "&Nápověda" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zavřít" #: tfrmfinddlg.btnedit.caption #| msgid "Edit" msgctxt "tfrmfinddlg.btnedit.caption" msgid "&Edit" msgstr "&Upravit" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "&Jdi k souboru" #: tfrmfinddlg.btnlastsearch.caption msgctxt "tfrmfinddlg.btnlastsearch.caption" msgid "&Last search" msgstr "&Poslední hledání" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "&Nové hledání" #: tfrmfinddlg.btnsavetemplate.caption #| msgid "Save" msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "&Uložit" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "&Vymazat" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "&Načíst" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "&Uložit" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption msgid "Sa&ve with \"Start in directory\"" msgstr "Ulo&žit s \"Začátek v adresáři\"" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "Pokud je uloženo, pak \"Začátek v adresáři \" se obnoví při načítání šablony. Použijte, pokud chcete opravit hledání v určitém adresáři" #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "&Start" #: tfrmfinddlg.btnstop.caption #| msgid "Cancel" msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "Z&rušit" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "Použít šablonu" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "&Zobrazit" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "Výsledek do &okna" #: tfrmfinddlg.caption msgctxt "tfrmfinddlg.caption" msgid "Find files" msgstr "Hledat soubory" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "Rozlišovat velikost" #: tfrmfinddlg.cbdatefrom.caption #| msgid "Date From:" msgid "&Date from:" msgstr "&Datum od:" #: tfrmfinddlg.cbdateto.caption #| msgid "Date To:" msgid "Dat&e to:" msgstr "Dat&um do:" #: tfrmfinddlg.cbfilesizefrom.caption #| msgid "Size from:" msgid "S&ize from:" msgstr "V&elikost od:" #: tfrmfinddlg.cbfilesizeto.caption #| msgid "Size to:" msgid "Si&ze to:" msgstr "Ve&likost do:" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "Vyhledat &text" #: tfrmfinddlg.cbfollowsymlinks.caption #| msgid "Follow symlinks" msgctxt "tfrmfinddlg.cbfollowsymlinks.caption" msgid "Follow s&ymlinks" msgstr "Následovat s&ymbolické odkazy" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "Hledat soubory NEobsahující text" #: tfrmfinddlg.cbnotolderthan.caption #| msgid "Not older than:" msgid "N&ot older than:" msgstr "N&ení starší, než:" #: tfrmfinddlg.cbpartialnamesearch.caption #| msgid "Search for part of file name " msgid "Searc&h for part of file name" msgstr "Hled&at části jména souboru" #: tfrmfinddlg.cbregexp.caption #| msgid "&Regular expressions" msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "&Regulární výrazy" #: tfrmfinddlg.cbreplacetext.caption #| msgid "Re&place text" msgid "Re&place by" msgstr "Nahradit pomocí" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "Vybrané adresáře a &soubory" #: tfrmfinddlg.cbtimefrom.caption #| msgid "Time from:" msgid "&Time from:" msgstr "&Čas od:" #: tfrmfinddlg.cbtimeto.caption #| msgid "Time to:" msgid "Ti&me to:" msgstr "Ča&s do:" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "Použit vyhledávací doplněk:" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "Zadejte názvy adresářů, které mají být vyloučeny z hledání, oddělených \";\"" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "Zadejte názvy souborů, které mají být vyloučeny z hledání, oddělených \";\"" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "Zadejte názvy souborů oddělených s \";\"" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption msgctxt "tfrmfinddlg.gbdirectories.caption" msgid "Directories" msgstr "Adresáře" #: tfrmfinddlg.gbfiles.caption msgctxt "tfrmfinddlg.gbfiles.caption" msgid "Files" msgstr "Soubory" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "Vyhledávat v obsahu" #: tfrmfinddlg.lblattributes.caption msgid "Attri&butes" msgstr "Atri&buty" #: tfrmfinddlg.lblencoding.caption #| msgid "Encoding:" msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "Kódován&í:" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "V&yloučené podadresáře" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "&Vyloučené soubory" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "Souborová maska" #: tfrmfinddlg.lblfindpathstart.caption #| msgid "&Start in directory" msgid "Start in &directory" msgstr "Adresářová &maska" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "Prohledat po&dadresáře:" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "&Předchozí hledání:" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "Odebrat ze seznamu" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "Zobrazit všechny nalezené položky" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "Zobrazit v prohlížeči" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "Rozšířené" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "Načíst/uložit" #: tfrmfinddlg.tsplugins.caption msgctxt "tfrmfinddlg.tsplugins.caption" msgid "Plugins" msgstr "Doplňky" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "Výsledky" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "Standard" #: tfrmfindview.btnclose.caption #| msgid "Cancel" msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmfindview.btnfind.caption #| msgid "Find" msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "&Hledat" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "Hledat" #: tfrmfindview.cbcasesens.caption #| msgid "Case sensitive" msgid "C&ase sensitive" msgstr "C&itlivé na velikost znaků" #: tfrmhardlink.btncancel.caption #| msgid "Cancel" msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmhardlink.caption #| msgid "Create hardlink" msgid "Create hard link" msgstr "Vytvořit hardlink" #: tfrmhardlink.lblexistingfile.caption #| msgid "Destination that the link will point to" msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "&Cíl, na který bude odkaz ukazovat" #: tfrmhardlink.lbllinktocreate.caption #| msgid "Link name" msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "&Název odkazu" #: tfrmhotdir.btnadd.caption #| msgid "Add" msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "&Přidat" #: tfrmhotdir.btnaddman.caption #| msgid "Add manually" msgid "Add &manually" msgstr "Přidat &ručně" #: tfrmhotdir.btncancel.caption #| msgid "Cancel" msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmhotdir.btndelete.caption #| msgid "Delete" msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "&Vymazat" #: tfrmhotdir.btnedit.caption #| msgid "Edit" msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "&Upravit" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "Rychlé adresáře" #: tfrmlinker.btnexit.caption #| msgid "Cancel" msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmlinker.btnok.caption #| msgid "OK" msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "..." #: tfrmlinker.caption msgctxt "TFRMLINKER.CAPTION" msgid "Linker" msgstr "Spojování souborů" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "Uložit do..." #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "Položka" #: tfrmlinker.lblfilename.caption #| msgid "File name" msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "&Název souboru" #: tfrmlinker.spbtndel.caption #| msgid "Delete" msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "&Vymazat" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "Vymazat" #: tfrmlinker.spbtndown.caption #| msgid "Down" msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "Do&lů" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "Dolů" #: tfrmlinker.spbtnup.caption #| msgid "Up" msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "&Nahoru" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "Nahoru" #: tfrmmain.actabout.caption #| msgid "About" msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "&O programu" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "Přidat název souboru do příkazového řádku" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "Uložit cestu a název souboru do příkazového řádku" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "Kopírovat cestu do příkazového řádku" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "Stručný" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "Stručný pohled" #: tfrmmain.actcalculatespace.caption #| msgid "Calculate &Occupied Space..." msgid "Calculate &Occupied Space" msgstr "Spočítat &obsazené místo..." #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "Změnit adresář" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "Změnit adresář na nadřazený" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "Jít do kořenového adresáře disku" #: tfrmmain.actchecksumcalc.caption #| msgid "Calculate check sum..." msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "Spočítat kontrolní &součet..." #: tfrmmain.actchecksumverify.caption #| msgid "Verify check sum..." msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "&Ověřit kontrolní součet..." #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "Vyčistit soubor záznamu" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "Vymazat okno záznamu" #: tfrmmain.actclosealltabs.caption #| msgid "Remove &All Tabs" msgctxt "tfrmmain.actclosealltabs.caption" msgid "Close &All Tabs" msgstr "Odstranit &všechny záložky" #: tfrmmain.actclosetab.caption #| msgid "&Remove Tab" msgctxt "tfrmmain.actclosetab.caption" msgid "&Close Tab" msgstr "&Odstranit záložku" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "Další příkazová řádka" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "Nastavení příkazového řádku na následující příkaz v historii" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "Předchozí příkazová řádka" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "Nastavení příkazového řádku na předchozí příkaz v historii" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "Plný" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "Sloupcové zobrazení" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "Porovnat pod&le obsahu" #: tfrmmain.actcomparedirectories.caption msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.CAPTION" msgid "Compare Directories" msgstr "Porovnat adresáře" #: tfrmmain.actcomparedirectories.hint msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.HINT" msgid "Compare Directories" msgstr "Porovnat adresáře" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "Zobrazit kontextovou nabídku" #: tfrmmain.actcopy.caption #| msgid "Copy" msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "Kopírovat" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "Kopírovat název(y) souboru(ů) s úplnou &cestou" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "Kopírovat název(y) souboru(ů) do schránky" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "Kopírovat soubory bez dotazu na potvrzení" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "Kopírovat do stejného panelu" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "Kopírovat" #: tfrmmain.actcountdircontent.caption #| msgid "Sho&w occupied space" msgid "Sho&w Occupied Space" msgstr "Zo&brazit obsazené místo" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "Vyjmout" #: tfrmmain.actdelete.caption #| msgid "Delete" msgctxt "TFRMMAIN.ACTDELETE.CAPTION" msgid "Delete" msgstr "Vymazat" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "Historie adresářů" #: tfrmmain.actdirhotlist.caption #| msgid "Directory &hotlist" msgid "Directory &Hotlist" msgstr "&Rychlé adresáře" #: tfrmmain.actedit.caption #| msgid "Edit" msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "Upravit" #: tfrmmain.acteditcomment.caption #| msgid "Edit comment..." msgid "Edit Co&mment..." msgstr "Upravit ko&mentář..." #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "Editovat nový soubor" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "Upravit cestu pole nad souborem seznamu" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "Zaměnit &panely" #: tfrmmain.actexit.caption #| msgid "Exit" msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "&Konec" #: tfrmmain.actextractfiles.caption #| msgid "Extract files..." msgid "&Extract Files..." msgstr "&Rozbalit soubory..." #: tfrmmain.actfileassoc.caption #| msgid "File &associations..." msgid "File &Associations..." msgstr "&Asociace souborů..." #: tfrmmain.actfilelinker.caption #| msgid "Link files" msgid "Com&bine Files..." msgstr "Spojit sou&bory..." #: tfrmmain.actfileproperties.caption #| msgid "Show file properties" msgid "Show &File Properties" msgstr "Zobrazit &vlastnosti souboru" #: tfrmmain.actfilespliter.caption #| msgid "Split file" msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "Rozděl&it soubor..." #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "Zaměřit příkazový řádek" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "Umístit kurzor na první soubor v seznamu" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "Umístit kurzor na poslední soubor v seznamu" #: tfrmmain.acthardlink.caption #| msgid "Create hard link..." msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "Vytvořit &hardlink..." #: tfrmmain.acthelpindex.caption #| msgid "Contents" msgid "&Contents" msgstr "&Obsah" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "&Vodorovný režim panelů" #: tfrmmain.actkeyboard.caption #| msgid "Keyboard" msgid "&Keyboard" msgstr "&Klávesnice" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "Levý &= Pravý" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "Otevřít levý seznam disků" #: tfrmmain.actloadselectionfromclip.caption msgid "Load Selection from Clip&board" msgstr "Načíst výběr ze schrán&ky" #: tfrmmain.actloadselectionfromfile.caption msgid "&Load Selection from File..." msgstr "&Načíst výběr ze souboru..." #: tfrmmain.actmakedir.caption #| msgid "MakeDir" msgid "MakeDir" msgstr "Nový adresář" #: tfrmmain.actmarkcurrentextension.caption #| msgid "Select all with same extension" msgid "Select All with the Same E&xtension" msgstr "Vybrat vše se stejnou &příponou" #: tfrmmain.actmarkinvert.caption #| msgid "Invert Selections" msgid "&Invert Selection" msgstr "Převrát&it výběr" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "&Vybrat vše" #: tfrmmain.actmarkminus.caption #| msgid "Unselect a group" msgid "Unselect a Gro&up..." msgstr "Zrušit výběr sk&upiny..." #: tfrmmain.actmarkplus.caption #| msgid "Select a group" msgid "Select a &Group..." msgstr "Výběr &skupiny..." #: tfrmmain.actmarkunmarkall.caption #| msgid "Unselect All" msgid "&Unselect All" msgstr "&Zrušit výběr všeho" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "Minimalizovat okno" #: tfrmmain.actmultirename.caption #| msgid "Multi Rename Tool" msgid "Multi &Rename Tool" msgstr "Nástroj pro h&romadné přejmenování" #: tfrmmain.actnetworkconnect.caption msgid "Network &Connect..." msgstr "Síť &připojit..." #: tfrmmain.actnetworkdisconnect.caption msgid "Network &Disconnect" msgstr "Síť &odpojit" #: tfrmmain.actnetworkquickconnect.caption msgid "Network &Quick Connect..." msgstr "Síť &rychlé připojit..." #: tfrmmain.actnewtab.caption #| msgid "&New tab" msgid "&New Tab" msgstr "&Nová záložka" #: tfrmmain.actnexttab.caption #| msgid "Switch to nex&t tab" msgid "Switch to Nex&t Tab" msgstr "Přepnout do nové &záložky" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "Otevřít" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "Zkusit otevřít archív" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "Otevřít bar soubor" #: tfrmmain.actopendirinnewtab.caption #| msgid "Open &folder in new tab" msgid "Open &Folder in a New Tab" msgstr "Otevřít &adresář v nové záložce" #: tfrmmain.actopenvirtualfilesystemlist.caption #| msgid "Open VFS List" msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "Otevřít &VFS seznam" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "&Prohlížeč operací" #: tfrmmain.actoptions.caption #| msgid "Options..." msgid "&Options..." msgstr "&Předvolby..." #: tfrmmain.actpackfiles.caption #| msgid "Pack files..." msgid "&Pack Files..." msgstr "Zabalit soubory..." #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "Nastavit pozici dělící čáry" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "Vložit" #: tfrmmain.actprevtab.caption #| msgid "Switch to &previous tab" msgid "Switch to &Previous Tab" msgstr "Přepnout do &předešlé záložky" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "Rychlý filtr" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "Rychlé hledání" #: tfrmmain.actquickview.caption msgid "&Quick View Panel" msgstr "&Panel rychlého prohlížení" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "&Obnovit" #: tfrmmain.actrename.caption #| msgid "Move" msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "Přesunout" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "Přesunout/přejmenovat soubory bez dotazu na potvrzení" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "Přejmenovat" #: tfrmmain.actrenametab.caption #| msgid "Re&name Tab" msgid "&Rename Tab" msgstr "&Přejmenovat záložku" #: tfrmmain.actrestoreselection.caption msgid "&Restore Selection" msgstr "&Obnovit výběr" #: tfrmmain.actreverseorder.caption #| msgid "Reverse order" msgid "Re&verse Order" msgstr "Obrácené &pořadí" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "Pravý &= Levý" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "Otevřít pravý seznam disků" #: tfrmmain.actrunterm.caption #| msgid "Run Term" msgid "Run &Terminal" msgstr "Spustit &terminál" #: tfrmmain.actsaveselection.caption msgid "Sa&ve Selection" msgstr "Uložit &výběr" #: tfrmmain.actsaveselectiontofile.caption msgid "Save S&election to File..." msgstr "Uložit vý&běr do souboru..." #: tfrmmain.actsearch.caption #| msgid "&Search" msgid "&Search..." msgstr "&Hledat..." #: tfrmmain.actsetfileproperties.caption msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "Změnit &atributy..." #: tfrmmain.actsettaboptiondirsinnewtab.caption msgid "Locked with Directories Opened in New &Tabs" msgstr "Uzamčeno s otevřenými adresáři v nové &záložce" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "&Normální" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "&Uzamčeno" #: tfrmmain.actsettaboptionpathresets.caption #| msgid "Locked, but &directory changes allowed" msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "Uzamčeno s povolenou změnou a&dresáře" #: tfrmmain.actshellexecute.caption msgctxt "tfrmmain.actshellexecute.caption" msgid "Open" msgstr "Otevřít" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "Otevřít pomocí asociací nastavených v systému" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "Zobrazit tlačítkovou nabídku" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "Zobrazit historii příkazového řádku" #: tfrmmain.actshowmainmenu.caption #| msgid "Menu" msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "Nabídka" #: tfrmmain.actshowsysfiles.caption #| msgid "Show hidden/system files" msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "Zobrazit &skryté/systémové soubory" #: tfrmmain.actsortbyattr.caption #| msgid "Sort by attrib" msgid "Sort by &Attributes" msgstr "Řadit podle &atributů" #: tfrmmain.actsortbydate.caption #| msgid "Sort by date" msgid "Sort by &Date" msgstr "Řadit podle &data" #: tfrmmain.actsortbyext.caption #| msgid "Sort by extension" msgid "Sort by &Extension" msgstr "Řadit podl&e přípony" #: tfrmmain.actsortbyname.caption #| msgid "Sort by name" msgid "Sort by &Name" msgstr "Řadit podle &názvu" #: tfrmmain.actsortbysize.caption #| msgid "Sort by size" msgid "Sort by &Size" msgstr "Řadit podle veliko&sti" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "Povolit/zakázat seznam ignorování souborů, aby nezobrazoval jména souborů" #: tfrmmain.actsymlink.caption #| msgid "Create symbolic link..." msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "Vytvořit symbolický o&dkaz..." #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "Cíl &= Zdroj" #: tfrmmain.acttestarchive.caption msgid "&Test Archive(s)" msgstr "&Testovat archív(y)" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "Náhledy" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "Pohled s náhledy" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "Přenést adresář pod kursorem do levého okna" #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "Přenést adresář pod kursorem do pravého okna" #: tfrmmain.actunmarkcurrentextension.caption #| msgid "Unselect all with same extension" msgid "Unselect All with the Same Ex&tension" msgstr "Zrušit označení všech se stejnou &příponou" #: tfrmmain.actview.caption #| msgid "View" msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "Zobrazit" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "Zobrazit historii navštívených cest pro aktivní pohled" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "Jít na další položku v historii" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "Jít na předchozí položku v historii" #: tfrmmain.actvisithomepage.caption #| msgid "&Visit Double Commander Web Site" msgid "&Visit Double Commander Website" msgstr "Na&vštívit domovskou stránku" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "Otřete" #: tfrmmain.btnf10.caption #| msgid "Exit" msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "Ukončit" #: tfrmmain.btnf8.caption #| msgid "Delete" msgctxt "TFRMMAIN.BTNF8.CAPTION" msgid "Delete" msgstr "Vymazat" #: tfrmmain.btnf9.caption #| msgid "Terminal" msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "Terminál" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint msgid "Directory hotlist" msgstr "Rychlé adresáře" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "<" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "Zobrazit aktuální adresář pravého panelu na levém panelu" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnlefthome.hint msgid "Go to home directory" msgstr "Jít do domovského adresáře" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgid "Go to root directory" msgstr "Jít do kořenového adresáře" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgid "Go to parent directory" msgstr "Jít do nadřízeného adresáře" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr ">" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "Zobrazit aktuální adresář levého panelu na pravém panelu" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "tfrmmain.caption" msgid "Double Commander" msgstr "Double Commander" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "Cesta" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "&20/80" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "&30/70" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "&40/60" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "&50/50" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "&60/40" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "&70/30" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "&80/20" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "Zrušit" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "Kopírovat..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "Vytvořit odkaz..." #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline33.caption msgctxt "tfrmmain.miline33.caption" msgid "-" msgstr "-" #: tfrmmain.miline37.caption msgctxt "TFRMMAIN.MILINE37.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "-" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "Vymazat" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "Kopírovat" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "Skrýt" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "Vybrat vše" #: tfrmmain.mimove.caption msgid "Move..." msgstr "Přesunout..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "Vytvořit symbolický odkaz..." #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "Předvolby záložky" #: tfrmmain.mitrayiconexit.caption #| msgid "Exit" msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "&Konec" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "Obnovit" #: tfrmmain.mnualloperpause.caption msgctxt "tfrmmain.mnualloperpause.caption" msgid "||" msgstr "||" #: tfrmmain.mnualloperstart.caption msgctxt "tfrmmain.mnualloperstart.caption" msgid "Start" msgstr "Začátek" #: tfrmmain.mnualloperstop.caption msgctxt "tfrmmain.mnualloperstop.caption" msgid "Cancel" msgstr "Zrušit" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "&Příkazy" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "N&astavení" #: tfrmmain.mnufiles.caption #| msgid "Files" msgid "&Files" msgstr "&Soubory" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "&Nápověda" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "&Označit" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "Síť" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "&Zobrazit" #: tfrmmain.mnutaboptions.caption #| msgid "Options" msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "&Předvolby" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "&Záložky" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "CD" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "Kopírovat" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "Vyjmout" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "Vymazat" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "Upravit" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "Vložit" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmmaskinputdlg.btncancel.caption #| msgid "Cancel" msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmmaskinputdlg.btndefinetemplate.caption #| msgid "Define..." msgid "&Define..." msgstr "&Určit..." #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmmaskinputdlg.lblsearchtemplate.caption #| msgid "Or select predefined selection type:" msgid "O&r select predefined selection type:" msgstr "Ne&bo vyberte předdefinovaný typ výběru:" #: tfrmmkdir.btncancel.caption #| msgid "Cancel" msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmmkdir.caption msgid "Create new directory" msgstr "Vytvořit nový adresář" #: tfrmmkdir.lblmakedir.caption #| msgid "Input new directory name:" msgid "&Input new directory name:" msgstr "&Zadejte nový název adresáře:" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "Pr" #: tfrmmodview.caption msgctxt "TFRMMODVIEW.CAPTION" msgid "New Size" msgstr "Nová velikost" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "Výška :" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgctxt "tfrmmodview.lblpath2.caption" msgid "2" msgstr "2" #: tfrmmodview.lblpath3.caption msgctxt "tfrmmodview.lblpath3.caption" msgid "3" msgstr "3" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "4" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "5" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "Kvalita komprese Jpg" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "Šířka :" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "BMP" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "ICO" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "JPG" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "PNG" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "PNM" #: tfrmmodview.teheight.text msgid "Height" msgstr "Výška" #: tfrmmodview.tequality.text msgid "80" msgstr "80" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "Šířka" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zavřít" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "&Vymazat" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "&Načíst" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "&Přejmenovat" #: tfrmmultirename.btnrestore.caption #| msgid "Reset all" msgid "Reset &all" msgstr "Obnovit &vše" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "&Uložit" #: tfrmmultirename.caption msgctxt "tfrmmultirename.caption" msgid "MultiRename" msgstr "Hromadné přejmenování" #: tfrmmultirename.cblog.caption #| msgid "Enable" msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "Povo&lit" #: tfrmmultirename.cbregexp.caption #| msgid "&Regular expressions" msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "&Regulární výrazy" #: tfrmmultirename.cbusesubs.caption #| msgid "Use substitution" msgid "&Use substitution" msgstr "Použití náhradu" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption #| msgid "[E]xtension" msgid "[E] Extension" msgstr "[E] Přípona" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "Počítadlo" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "Vyhledat && Nahradit" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "Výsledek záznamu" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "Maska" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "Předvolby" #: tfrmmultirename.lbext.caption #| msgid "Extension" msgid "&Extension" msgstr "&Přípona" #: tfrmmultirename.lbfind.caption #| msgid "Find..." msgid "&Find..." msgstr "&Hledat..." #: tfrmmultirename.lbinterval.caption #| msgid "Interval" msgid "&Interval" msgstr "&Interval" #: tfrmmultirename.lbname.caption #| msgid "File Name" msgid "File &Name" msgstr "&Název souboru" #: tfrmmultirename.lbreplace.caption #| msgid "Replace..." msgid "Re&place..." msgstr "Nah&radit..." #: tfrmmultirename.lbstnb.caption #| msgid "Start Number" msgid "S&tart Number" msgstr "Č&íslovat od" #: tfrmmultirename.lbwidth.caption #| msgid "Width" msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "&Šířka" #: tfrmmultirename.micounter.caption #| msgid "[C]ounter" msgid "[C] Counter" msgstr "[C] Počítadlo" #: tfrmmultirename.miday.caption #| msgid "[D]ay" msgid "[D] Day" msgstr "[D] Den" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "[DD] Den (2 cifry)" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "[DDD] Den v týdnu (krátký, např. \"pon\")" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "[DDDD] Den v týdnu (dlouhý, např.\"pondělí\")" #: tfrmmultirename.miextensionx.caption #| msgid "[Ex]xtension" msgid "[Ex] Character at position x" msgstr "[Ex] Znak na pozici x" #: tfrmmultirename.miextensionxx.caption #| msgid "[Ex:x]xtension" msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:y] Znaky od pozice x do y" #: tfrmmultirename.mihour.caption #| msgid "[h]our" msgid "[h] Hour" msgstr "[H] Hodina" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "[hh] Hodin (2 cifry)" #: tfrmmultirename.miminute.caption #| msgid "Mi[n]ute" msgid "[n] Minute" msgstr "[Mi] Minuta" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "[nn] Minut (2 cifry)" #: tfrmmultirename.mimonth.caption #| msgid "[M]onth" msgid "[M] Month" msgstr "[Mo] Měsíc" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "[MM] Měsíc (2 cifry)" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "[MMM] Jméno měsíce (krátké, např. \"led\")" #: tfrmmultirename.mimonth3.caption msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "[MMMM] Jméno měsíce (dlouhé, např. \"leden\")" #: tfrmmultirename.miname.caption #| msgid "[N]ame" msgid "[N] Name" msgstr "[N] Název" #: tfrmmultirename.minamex.caption #| msgid "[Nx]ame" msgid "[Nx] Character at position x" msgstr "[Nx] Znak na pozici x" #: tfrmmultirename.minamexx.caption #| msgid "[Nx:x]ame" msgid "[Nx:y] Characters from position x to y" msgstr "[Nx:y] Znaky od pozice x do y" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "Čas..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "Přípona..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "Název..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "Doplněk" #: tfrmmultirename.misecond.caption #| msgid "[s]econd" msgid "[s] Second" msgstr "[S] Sekund" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "[ss] Sekund (2 cifry)" #: tfrmmultirename.miyear.caption #| msgid "[Y] Year" msgid "[Y] Year (2 digits)" msgstr "[Y] Rok (2 cifry)" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "[YYYY] Rok (4 cifry)" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "tfrmmultirename.stringgrid.columns[0].title.caption" msgid "Old File Name" msgstr "Staré jméno souboru" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "tfrmmultirename.stringgrid.columns[1].title.caption" msgid "New File Name" msgstr "Nové jméno souboru" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "tfrmmultirename.stringgrid.columns[2].title.caption" msgid "File Path" msgstr "Cesta k souboru" #: tfrmopenwith.caption msgid "Choose an application" msgstr "Vybrat aplikaci" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "Vlastní příkaz" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "Uložit asociaci" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "Nastavit zvolenou aplikaci jako výchozí akci" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "Typ souboru, který se má otevřít: %s" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "Několik názvů souborů" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "%F" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "Více URI" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "%U" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "Jedno jméno souboru" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "%f" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "Jeden URI" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "%u" #: tfrmoptions.btnapply.caption #| msgid "Apply" msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "&Použít" #: tfrmoptions.btncancel.caption #| msgid "Cancel" msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmoptions.caption msgctxt "tfrmoptions.caption" msgid "Options" msgstr "Předvolby" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "Prosím, zvolte jednu z podstránek, tato stránka neobsahuje žádné nastavení." #: tfrmoptionsarchivers.btnautoconfig.caption #| msgid "Auto Configure" msgctxt "TFRMOPTIONSARCHIVERS.BTNAUTOCONFIG.CAPTION" msgid "A&uto Configure" msgstr "N&astavit automaticky" #: tfrmoptionsarchivers.btnmultiarcadd.caption #| msgid "Add" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCADD.CAPTION" msgid "A&dd" msgstr "P&řidat" #: tfrmoptionsarchivers.btnmultiarcapply.caption #| msgid "Apply" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCAPPLY.CAPTION" msgid "A&pply" msgstr "P&oužít" #: tfrmoptionsarchivers.btnmultiarcdelete.caption #| msgid "Delete" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCDELETE.CAPTION" msgid "D&elete" msgstr "V&ymazat" #: tfrmoptionsarchivers.btnmultiarcrename.caption #| msgid "Rename" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCRENAME.CAPTION" msgid "&Rename" msgstr "&Smazat" #: tfrmoptionsarchivers.chkmultiarcdebug.caption #| msgid "Debug mode" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCDEBUG.CAPTION" msgid "De&bug mode" msgstr "La&dící režim" #: tfrmoptionsarchivers.chkmultiarcenabled.caption #| msgid "Enabled" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCENABLED.CAPTION" msgid "E&nabled" msgstr "P&ovoleno" #: tfrmoptionsarchivers.chkmultiarcoutput.caption #| msgid "Show console output" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCOUTPUT.CAPTION" msgid "S&how console output" msgstr "U&kázat výstup konzoly" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "TFRMOPTIONSARCHIVERS.GBARCHIVEROPTIONS.CAPTION" msgid "Options" msgstr "Předvolby" #: tfrmoptionsarchivers.lblarchiveadd.caption #| msgid "Add:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEADD.CAPTION" msgid "Add&ing:" msgstr "Př&idat:" #: tfrmoptionsarchivers.lblarchiveextension.caption #| msgid "Extension:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTENSION.CAPTION" msgid "E&xtension:" msgstr "P&řípona:" #: tfrmoptionsarchivers.lblarchiveextract.caption #| msgid "Extract:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTRACT.CAPTION" msgid "Ex&tract:" msgstr "Ex&trahovat:" #: tfrmoptionsarchivers.lblarchivelist.caption #| msgid "List:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELIST.CAPTION" msgid "&List:" msgstr "&Seznam:" #: tfrmoptionsarchivers.lblarchivelistend.caption #| msgid "Listing finish (optional):" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTEND.CAPTION" msgid "Listing &finish (optional):" msgstr "Konec &výpisu (volitelné):" #: tfrmoptionsarchivers.lblarchivelistformat.caption #| msgid "Listing format:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTFORMAT.CAPTION" msgid "Listing for&mat:" msgstr "Form&át výpisu:" #: tfrmoptionsarchivers.lblarchiveliststart.caption #| msgid "Listing start (optional):" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTSTART.CAPTION" msgid "Listin&g start (optional):" msgstr "Začáte&k výpisu (volitelné):" #: tfrmoptionsarchivers.lblarchiver.caption #| msgid "Archiver:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVER.CAPTION" msgid "Arc&hiver:" msgstr "Arch&ivátor:" #: tfrmoptionsarchivers.lbldescription.caption #| msgid "Description:" msgctxt "TFRMOPTIONSARCHIVERS.LBLDESCRIPTION.CAPTION" msgid "De&scription:" msgstr "Po&pis:" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERADDITIONAL.CAPTION" msgid "Additional" msgstr "Přídavné" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERGENERAL.CAPTION" msgid "General" msgstr "Hlavní" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption #| msgid "Also when &size, date, or attributes change" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHATTRIBUTESCHANGE.CAPTION" msgid "When &size, date or attributes change" msgstr "Při změně &velikosti, data, nebo atributů" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHEXCLUDEDIRS.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "Pro následující &cesty a jejich podadresáře:" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption #| msgid "When files are &created, deleted or renamed" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHFILENAMECHANGE.CAPTION" msgid "When &files are created, deleted or renamed" msgstr "Při vytvoření, smazání, nebo přejmenování &souborů" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption #| msgid "Don't &react to updates while in the background" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHONLYFOREGROUND.CAPTION" msgid "When application is in the &background" msgstr "Když je aplikace na &pozadí" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHDISABLE.CAPTION" msgid "Disable auto-refresh" msgstr "Zakázat automatické obnovení" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHENABLE.CAPTION" msgid "Refresh file list" msgstr "Obnovit seznam souborů" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption #| msgid "Always show tray icon" msgctxt "TFRMOPTIONSBEHAVIOR.CBALWAYSSHOWTRAYICON.CAPTION" msgid "Al&ways show tray icon" msgstr "Vž&dy zobrazit ikonu v oznam. oblasti" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption msgid "Automatically &hide unmounted devices" msgstr "Automaticky &skrýt nepřipojená zařízení" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBMINIMIZETOTRAY.CAPTION" msgid "Mo&ve icon to system tray when minimized" msgstr "Přesunout do oznamo&vací oblasti pokud je minimalizováno" #: tfrmoptionsbehavior.cbonlyonce.caption #| msgid "Allow only one copy of DC at a time" msgctxt "TFRMOPTIONSBEHAVIOR.CBONLYONCE.CAPTION" msgid "A&llow only one copy of DC at a time" msgstr "P&ovolit pouze jednu kopii DC ve stejný čas" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "Zde můžete zadat jednu nebo více jednotek nebo připojovacích bodů oddělených \";\"." #: tfrmoptionsbehavior.lbldrivesblacklist.caption #| msgid "Drives blacklist" msgid "Drives &blacklist" msgstr "&Blacklist disků" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption #| msgid "Cut text to column width" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBCUTTEXTTOCOLWIDTH.CAPTION" msgid "Cut &text to column width" msgstr "Oříznout &text na šířku sloupce" #: tfrmoptionscolumnsview.cbgridhorzline.caption #| msgid "Horizontal lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDHORZLINE.CAPTION" msgid "&Horizontal lines" msgstr "&Vodorovné čáry" #: tfrmoptionscolumnsview.cbgridvertline.caption #| msgid "Vertical lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDVERTLINE.CAPTION" msgid "&Vertical lines" msgstr "&Svislé čáry" #: tfrmoptionscolumnsview.chkautofillcolumns.caption #| msgid "Auto fill columns" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CHKAUTOFILLCOLUMNS.CAPTION" msgid "A&uto fill columns" msgstr "A&utomaticky naplnit sloupce" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "Zobrazit mřížku" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "Automatická velikost sloupců" #: tfrmoptionscolumnsview.lblautosizecolumn.caption #| msgid "Auto size column:" msgctxt "TFRMOPTIONSCOLUMNSVIEW.LBLAUTOSIZECOLUMN.CAPTION" msgid "Auto si&ze column:" msgstr "Automatická ve&likost sloupce:" #: tfrmoptionsconfiguration.btnconfigapply.caption #| msgid "Apply" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGAPPLY.CAPTION" msgid "A&pply" msgstr "P&oužít" #: tfrmoptionsconfiguration.btnconfigedit.caption #| msgid "Edit" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGEDIT.CAPTION" msgid "&Edit" msgstr "&Upravit" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption #| msgid "Command line history" msgctxt "TFRMOPTIONSCONFIGURATION.CBCMDLINEHISTORY.CAPTION" msgid "Co&mmand line history" msgstr "Hi&storie příkazového řádku" #: tfrmoptionsconfiguration.cbdirhistory.caption #| msgid "Directory history" msgctxt "TFRMOPTIONSCONFIGURATION.CBDIRHISTORY.CAPTION" msgid "&Directory history" msgstr "&Historie adresářů" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption #| msgid "File mask history" msgctxt "TFRMOPTIONSCONFIGURATION.CBFILEMASKHISTORY.CAPTION" msgid "&File mask history" msgstr "&Historie použitých masek" #: tfrmoptionsconfiguration.chksaveconfiguration.caption #| msgid "Save configuration" msgctxt "TFRMOPTIONSCONFIGURATION.CHKSAVECONFIGURATION.CAPTION" msgid "Sa&ve configuration" msgstr "Ul&ožit nastavení" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption #| msgid "Search/Replace history" msgctxt "TFRMOPTIONSCONFIGURATION.CHKSEARCHREPLACEHISTORY.CAPTION" msgid "Searc&h/Replace history" msgstr "Historie hle&dání/nahrazení" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBLOCCONFIGFILES.CAPTION" msgid "Location of configuration files" msgstr "Umístění konfiguračních souborů" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBSAVEONEXIT.CAPTION" msgid "Save on exit" msgstr "Uložit při ukončení" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgctxt "TFRMOPTIONSCONFIGURATION.LBLCMDLINECONFIGDIR.CAPTION" msgid "Set on command line" msgstr "Nastavit na příkazové řádce" #: tfrmoptionsconfiguration.rbprogramdir.caption #| msgid "Program directory (portable version)" msgctxt "TFRMOPTIONSCONFIGURATION.RBPROGRAMDIR.CAPTION" msgid "P&rogram directory (portable version)" msgstr "Adresář p&rogramu (přenosná verze)" #: tfrmoptionsconfiguration.rbuserhomedir.caption #| msgid "User home directory" msgctxt "TFRMOPTIONSCONFIGURATION.RBUSERHOMEDIR.CAPTION" msgid "&User home directory" msgstr "&Domovský adresář uživatele" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption #| msgid "Copy" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNCOPYCOLUMNSSET.CAPTION" msgid "C&opy" msgstr "K&opírovat" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption #| msgid "Delete" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNDELCOLUMNSSET.CAPTION" msgid "&Delete" msgstr "&Vymazat" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption #| msgid "Edit" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNEDITCOLUMNSSET.CAPTION" msgid "&Edit" msgstr "&Upravit" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNNEWCOLUMNSSET.CAPTION" msgid "&New" msgstr "&Nový" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.CBBFILESYSTEM.TEXT" msgid "General" msgstr "Hlavní" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption #| msgid "Configure columns for file system:" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.LBLCONFIGCOLUMNS.CAPTION" msgid "Con&figure columns for file system:" msgstr "Kon&figurace sloupců pro systém souborů:" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption #| msgid "Show confirmation dialog after drop" msgid "&Show confirmation dialog after drop" msgstr "&Zobrazit potvrzovací dialog po upuštění " #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption msgid "Show &file system" msgstr "Zobrazit &souborový systém" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption msgid "Show fr&ee space" msgstr "Zobrazit vol&né místo" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption msgid "Show &label" msgstr "Zobrazit &štítek" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "Seznam disků" #: tfrmoptionseditorcolors.backgroundlabel.caption msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "Po&zadí" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption" msgid "Bac&kground" msgstr "Po&zadí" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "Atributy prvku" #: tfrmoptionseditorcolors.foregroundlabel.caption msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "Po&předí" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption" msgid "Fo®round" msgstr "Po&předí" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption msgid "&Text-mark" msgstr "&Text-značka" #: tfrmoptionseditorcolors.tbtnglobal.caption msgid "Use (and edit) &global scheme settings" msgstr "Použít (a upravit) &globální systém nastavení" #: tfrmoptionseditorcolors.tbtnlocal.caption msgid "Use &local scheme settings" msgstr "Použít &místní systém nastavení" #: tfrmoptionseditorcolors.textboldcheckbox.caption msgid "&Bold" msgstr "&Tučný" #: tfrmoptionseditorcolors.textboldradioinvert.caption msgctxt "tfrmoptionseditorcolors.textboldradioinvert.caption" msgid "In&vert" msgstr "Pře&vrátit" #: tfrmoptionseditorcolors.textboldradiooff.caption msgctxt "tfrmoptionseditorcolors.textboldradiooff.caption" msgid "O&ff" msgstr "Vy&pnout" #: tfrmoptionseditorcolors.textboldradioon.caption msgctxt "tfrmoptionseditorcolors.textboldradioon.caption" msgid "O&n" msgstr "Za&pnout" #: tfrmoptionseditorcolors.textitaliccheckbox.caption msgid "&Italic" msgstr "&Kurzíva" #: tfrmoptionseditorcolors.textitalicradioinvert.caption msgctxt "tfrmoptionseditorcolors.textitalicradioinvert.caption" msgid "In&vert" msgstr "Pře&vrátit" #: tfrmoptionseditorcolors.textitalicradiooff.caption msgctxt "tfrmoptionseditorcolors.textitalicradiooff.caption" msgid "O&ff" msgstr "Vy&pnout" #: tfrmoptionseditorcolors.textitalicradioon.caption msgctxt "tfrmoptionseditorcolors.textitalicradioon.caption" msgid "O&n" msgstr "Za&pnout" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption msgid "&Strike Out" msgstr "&Vyškrtnout" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioinvert.caption" msgid "In&vert" msgstr "Pře&vrátit" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradiooff.caption" msgid "O&ff" msgstr "Vy&pnout" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioon.caption" msgid "O&n" msgstr "Za&pnout" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption msgid "&Underline" msgstr "&Podtrhnout" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "Pře&vrátit" #: tfrmoptionseditorcolors.textunderlineradiooff.caption msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "Vy&pnout" #: tfrmoptionseditorcolors.textunderlineradioon.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "Za&pnout" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "Kopí&rovat operaci" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "&Smazat operaci" #: tfrmoptionsfileoperations.cbdeletetotrash.caption #| msgid "Delete to recycle bin (Shift key reverses this setting)" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDELETETOTRASH.CAPTION" msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "Odstra&nit do koše (klávesa Shift převrací toto nastavení)" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "V&yhodit operaci do koše" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption #| msgid "Drop readonly flag" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDROPREADONLYFLAG.CAPTION" msgid "D&rop readonly flag" msgstr "Z&rušit příznak jen pro čtení" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "&Přesunout operaci" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption #| msgid "Search for part of file name" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPARTIALNAMESEARCH.CAPTION" msgid "&Search for part of file name" msgstr "&Hledat část jména souboru" #: tfrmoptionsfileoperations.cbprocesscomments.caption #| msgid "Process comments with files/folders" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPROCESSCOMMENTS.CAPTION" msgid "&Process comments with files/folders" msgstr "&Zpracovat komentáře složek/souborů" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption #| msgid "Select file name without extension when renaming" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBRENAMESELONLYNAME.CAPTION" msgid "Select &file name without extension when renaming" msgstr "Při přejmenování vybrat pouze název &souboru (bez přípony)" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption #| msgid "Show tab select panel in copy/move dialog" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSHOWCOPYTABSELECTPANEL.CAPTION" msgid "Sho&w tab select panel in copy/move dialog" msgstr "Zobra&zit výběr záložky v dialogu kopírovat/přesunout" #: tfrmoptionsfileoperations.cbskipfileoperror.caption #| msgid "Skip file operations errors and write them to log window" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSKIPFILEOPERROR.CAPTION" msgid "S&kip file operations errors and write them to log window" msgstr "P&řeskočit chyby a zapsat je do okna záznamu" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "Provádění operací" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.GBFILESEARCH.CAPTION" msgid "File search" msgstr "Hledání souborů" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "Uživatelské rozhraní" #: tfrmoptionsfileoperations.lblbuffersize.caption msgid "&Buffer size for file operations (in KB):" msgstr "&Velikost vyrovnávací paměti pro operace se soubory (v KB):" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "Zobrazit potvrzovací okno pro:" #: tfrmoptionsfileoperations.lblprogresskind.caption msgid "Show operations progress &initially in" msgstr "Zobrazit pokrok v operacích &zpočátku v" #: tfrmoptionsfileoperations.lblwipepassnumber.caption #| msgid "Number of wipe passes:" msgctxt "TFRMOPTIONSFILEOPERATIONS.LBLWIPEPASSNUMBER.CAPTION" msgid "&Number of wipe passes:" msgstr "&Počet mazacích průchodů:" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption #| msgid "Use memory mapping for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSEMMAPINSEARCH.CAPTION" msgid "Use memory mapping for search te&xt in files" msgstr "Použít mapování paměti pro hledání te&xtu v souborech" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption #| msgid "Use stream for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSESTREAMINSEARCH.CAPTION" msgid "&Use stream for search text in files" msgstr "&Použit proud pro hledání textu v souborech" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption #| msgid "Use Frame Cursor" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEFRAMECURSOR.CAPTION" msgid "Use &Frame Cursor" msgstr "Použít &rámce kurzoru" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption msgid "Use &Gradient Indicator" msgstr "Použít &Gradient indikátor" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption #| msgid "Use Inverted Selection" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEINVERTEDSELECTION.CAPTION" msgid "U&se Inverted Selection" msgstr "P&oužít obrácený výběr" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.DBFREESPACEINDICATOR.CAPTION" msgid "Drive Free Space Indicator" msgstr "Indikátor volného místa na disku " #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.GBEXAMPLE.CAPTION" msgid "Example" msgstr "Ukázka" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption #| msgid "Background:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR.CAPTION" msgid "Bac&kground:" msgstr "Poz&adí:" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption #| msgid "Background 2:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR2.CAPTION" msgid "Backg&round 2:" msgstr "Poz&adí 2:" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption #| msgid "Cursor Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORCOLOR.CAPTION" msgid "C&ursor Color:" msgstr "B&arva kursoru:" #: tfrmoptionsfilepanelscolors.lblcursortext.caption #| msgid "Cursor Text:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORTEXT.CAPTION" msgid "Cursor Te&xt:" msgstr "Te&xt kursoru:" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption #| msgid "Brightness level of inactive panel" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLINACTIVEPANELBRIGHTNESS.CAPTION" msgid "&Brightness level of inactive panel" msgstr "&Úroveň jasu neaktivního panelu" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption msgid "In&dicator Back Color:" msgstr "In&dikátor barvy pozadí:" #: tfrmoptionsfilepanelscolors.lblindcolor.caption msgid "&Indicator Fore Color:" msgstr "&Idikátor barvy popředí:" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption #| msgid "Mark Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLMARKCOLOR.CAPTION" msgid "&Mark Color:" msgstr "&Barva označených:" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption #| msgid "Text Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLTEXTCOLOR.CAPTION" msgid "T&ext Color:" msgstr "B&arva písma:" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption msgid "Do&n't load file list until a tab is activated" msgstr "Nevklá&dat seznam souborů, dokud se karta neaktivuje" #: tfrmoptionsfilesviews.cbdirbrackets.caption #| msgid "Show square brackets around directories" msgctxt "TFRMOPTIONSFILESVIEWS.CBDIRBRACKETS.CAPTION" msgid "S&how square brackets around directories" msgstr "N&ázvy adresářů v hranatých závorkách" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption msgid "Hi&ghlight new and updated files" msgstr "Zvý&raznit nové a aktualizované soubory" #: tfrmoptionsfilesviews.cblistfilesinthread.caption #| msgid "Load file list in separate thread" msgctxt "TFRMOPTIONSFILESVIEWS.CBLISTFILESINTHREAD.CAPTION" msgid "Load &file list in separate thread" msgstr "Načíst &seznam soubor v odděleném vlákně" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption #| msgid "Load icons after file list" msgctxt "TFRMOPTIONSFILESVIEWS.CBLOADICONSSEPARATELY.CAPTION" msgid "Load icons af&ter file list" msgstr "Načíst ikony p&o seznam souborů" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption #| msgid "Show system and hidden files" msgctxt "TFRMOPTIONSFILESVIEWS.CBSHOWSYSTEMFILES.CAPTION" msgid "Show s&ystem and hidden files" msgstr "Zobrazit s&ystémové a skryté soubory" #: tfrmoptionsfilesviews.cbspacemovesdown.caption #| msgid "When selecting files with , move down to next file (as with )" msgctxt "TFRMOPTIONSFILESVIEWS.CBSPACEMOVESDOWN.CAPTION" msgid "&When selecting files with , move down to next file (as with )" msgstr "&Při výběru mezerníkem posunout kursor dolů, jako při výběru klávesou Insert" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "Formátování" #: tfrmoptionsfilesviews.gbsorting.caption msgctxt "TFRMOPTIONSFILESVIEWS.GBSORTING.CAPTION" msgid "Sorting" msgstr "Řazení" #: tfrmoptionsfilesviews.lblcasesensitivity.caption msgid "Case s&ensitivity:" msgstr "R&ozlišovat velikost:" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "Nesprávný formát" #: tfrmoptionsfilesviews.lbldatetimeformat.caption #| msgid "Date and time format:" msgctxt "TFRMOPTIONSFILESVIEWS.LBLDATETIMEFORMAT.CAPTION" msgid "&Date and time format:" msgstr "&Formát data a času:" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "Formát veli&kosti souboru:" #: tfrmoptionsfilesviews.lblnewfilesposition.caption msgid "&Insert new files" msgstr "&Vložit nové soubory" #: tfrmoptionsfilesviews.lblsortfoldermode.caption msgid "So&rting directories:" msgstr "Tří&dění adresářů:" #: tfrmoptionsfilesviews.lblsortmethod.caption #| msgid "Sort &method:" msgctxt "TFRMOPTIONSFILESVIEWS.LBLSORTMETHOD.CAPTION" msgid "&Sort method:" msgstr "&&Metoda řazení" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption msgid "&Move updated files" msgstr "&Přesun aktualizovaných souborů" #: tfrmoptionsfiletypescolors.btnaddcategory.caption #| msgid "Add" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNADDCATEGORY.CAPTION" msgid "A&dd" msgstr "P&řidat" #: tfrmoptionsfiletypescolors.btnapplycategory.caption #| msgid "Apply" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNAPPLYCATEGORY.CAPTION" msgid "A&pply" msgstr "P&oužít" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNCATEGORYCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption #| msgid "Delete" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNDELETECATEGORY.CAPTION" msgid "D&elete" msgstr "V&ymazat" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Šablony..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption #| msgid "File types colors" msgctxt "TFRMOPTIONSFILETYPESCOLORS.GBFILETYPESCOLORS.CAPTION" msgid "File types colors (sort by drag&&drop)" msgstr "Barvy typů souborů (řadit podle uchop&&táhni)" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption #| msgid "Category attributes:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYATTR.CAPTION" msgid "Category a&ttributes:" msgstr "A&tributy kategorií:" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption #| msgid "Category color:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYCOLOR.CAPTION" msgid "Category co&lor:" msgstr "Ba&rva kategorie:" #: tfrmoptionsfiletypescolors.lblcategorymask.caption #| msgid "Category mask:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYMASK.CAPTION" msgid "Category &mask:" msgstr "&Maska kategorie:" #: tfrmoptionsfiletypescolors.lblcategoryname.caption #| msgid "Category name:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYNAME.CAPTION" msgid "Category &name:" msgstr "&Název kategorie:" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELEDITFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELLOGFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELMAINFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWERBOOKFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.lbleditorfont.caption #| msgid "Editor font" msgctxt "TFRMOPTIONSFONTS.LBLEDITORFONT.CAPTION" msgid "&Editor font" msgstr "Písmo &editoru" #: tfrmoptionsfonts.lbllogfont.caption #| msgid "Log font" msgctxt "TFRMOPTIONSFONTS.LBLLOGFONT.CAPTION" msgid "&Log font" msgstr "&Písmo záznamu" #: tfrmoptionsfonts.lblmainfont.caption #| msgid "Main font" msgctxt "TFRMOPTIONSFONTS.LBLMAINFONT.CAPTION" msgid "Main &font" msgstr "Hlavní &písmo" #: tfrmoptionsfonts.lblviewerbookfont.caption #| msgid "Viewer Book Font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERBOOKFONT.CAPTION" msgid "Viewer&Book Font" msgstr "&Knižní písmo prohlížeče" #: tfrmoptionsfonts.lblviewerfont.caption #| msgid "Viewer font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERFONT.CAPTION" msgid "&Viewer font" msgstr "&Písmo prohlížeče" #: tfrmoptionshotkeys.btnaddhotkey.caption msgid "Add &hotkey" msgstr "Přidat &klávesovou zkratku" #: tfrmoptionshotkeys.btndeletehotkey.caption msgid "&Delete hotkey" msgstr "&Vymazat klávesovou zkratku" #: tfrmoptionshotkeys.btnedithotkey.caption msgctxt "tfrmoptionshotkeys.btnedithotkey.caption" msgid "&Edit hotkey" msgstr "&Upravit klávesovou zkratku" #: tfrmoptionshotkeys.lbfilter.caption #| msgid "Filter" msgctxt "TFRMOPTIONSHOTKEYS.LBFILTER.CAPTION" msgid "&Filter" msgstr "&Filtr" #: tfrmoptionshotkeys.lblcategories.caption #| msgid "Categories:" msgctxt "tfrmoptionshotkeys.lblcategories.caption" msgid "C&ategories:" msgstr "K&ategorie:" #: tfrmoptionshotkeys.lblcommands.caption #| msgid "Commands:" msgctxt "tfrmoptionshotkeys.lblcommands.caption" msgid "Co&mmands:" msgstr "Př&íkazy:" #: tfrmoptionshotkeys.lblscfiles.caption #| msgid "Shortcut files:" msgctxt "TFRMOPTIONSHOTKEYS.LBLSCFILES.CAPTION" msgid "&Shortcut files:" msgstr "&Soubory zástupců:" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[0].TITLE.CAPTION" msgid "Hotkey" msgstr "Horká klávesa" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[1].TITLE.CAPTION" msgid "Parameters" msgstr "Parametry" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[2].TITLE.CAPTION" msgid "Controls" msgstr "Ovládací prvky" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "Pro následující &cesty a jejich podadresáře:" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "Zobrazit ikony pro akce v &nabídkách" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "tfrmoptionsicons.cbiconsinmenussize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption #| msgid "Show overlay i&cons, e.g. for links" msgctxt "TFRMOPTIONSICONS.CBICONSSHOWOVERLAY.CAPTION" msgid "Show o&verlay icons, e.g. for links" msgstr "Zobrazit p&řekryvné i&kony, např. pro odkazy" #: tfrmoptionsicons.cbiconssize.text msgctxt "TFRMOPTIONSICONS.CBICONSSIZE.TEXT" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "Zakázat speciální ikony" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "Ikony v nabídkách" #: tfrmoptionsicons.gbiconssize.caption #| msgid " Icon &size " msgctxt "TFRMOPTIONSICONS.GBICONSSIZE.CAPTION" msgid " Icon size " msgstr "Velikost ikon" #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "TFRMOPTIONSICONS.GBSHOWICONSMODE.CAPTION" msgid " Show icons to the left of the filename " msgstr "Zobrazit ikony nalevo od názvu souboru" #: tfrmoptionsicons.rbiconsshowall.caption #| msgid "&All" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALL.CAPTION" msgid "A&ll" msgstr "V&še" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALLANDEXE.CAPTION" msgid "All associated + &EXE/LNK (slow)" msgstr "Všechny přidružení + &EXE/LNK (pomalé)" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWNONE.CAPTION" msgid "&No icons" msgstr "Bez &ikon" #: tfrmoptionsicons.rbiconsshowstandard.caption #| msgid "&Only standard icons" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWSTANDARD.CAPTION" msgid "Only &standard icons" msgstr "Pouze &standardní ikony" #: tfrmoptionsignorelist.btnaddsel.caption #| msgid "&Add selected names" msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSEL.CAPTION" msgid "A&dd selected names" msgstr "P&řidat vybrané jména" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSELWITHPATH.CAPTION" msgid "Add selected names with &full path" msgstr "Přidat označené jména s &plnou cestou" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "TFRMOPTIONSIGNORELIST.CHKIGNOREENABLE.CAPTION" msgid "&Ignore (don't show) the following files and folders:" msgstr "&Ignorovat (nezobrazovat) následující soubory a složky:" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "TFRMOPTIONSIGNORELIST.LBLSAVEIN.CAPTION" msgid "&Save in:" msgstr "&Uložit v:" #: tfrmoptionskeyboard.cblynxlike.caption #| msgid "Left, Right arrows change directory (Lynx-like movement)" msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "Šip&ky vlevo a vpravo mění adresář (jako pohyb v Lynxu)" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "Psaní" #: tfrmoptionskeyboard.lblalt.caption #| msgid "Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLALT.CAPTION" msgid "Alt+L&etters" msgstr "Alt+P&ísmena" #: tfrmoptionskeyboard.lblctrlalt.caption #| msgid "Ctrl+Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLCTRLALT.CAPTION" msgid "Ctrl+Alt+Le&tters" msgstr "Ctrl+Alt+Pís&mena" #: tfrmoptionskeyboard.lblnomodifier.caption #| msgid "Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLNOMODIFIER.CAPTION" msgid "&Letters" msgstr "&Písmena" #: tfrmoptionslayout.cbflatdiskpanel.caption #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATDISKPANEL.CAPTION" msgid "&Flat buttons" msgstr "&Plochá tlačítka" #: tfrmoptionslayout.cbflatinterface.caption #| msgid "Flat interface" msgctxt "TFRMOPTIONSLAYOUT.CBFLATINTERFACE.CAPTION" msgid "Flat i&nterface" msgstr "Ploché &rozhraní" #: tfrmoptionslayout.cbflattoolbar.caption #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATTOOLBAR.CAPTION" msgid "Flat b&uttons" msgstr "Plochá t&lačítka" #: tfrmoptionslayout.cbfreespaceind.caption #| msgid "Show free space indicator on drive label" msgctxt "TFRMOPTIONSLAYOUT.CBFREESPACEIND.CAPTION" msgid "Show fr&ee space indicator on drive label" msgstr "Zobrazovat indikátor vol&ného místa v označení disku" #: tfrmoptionslayout.cblogwindow.caption #| msgid "Show log window" msgctxt "TFRMOPTIONSLAYOUT.CBLOGWINDOW.CAPTION" msgid "Show lo&g window" msgstr "Zobrazit okno zázna&mu" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "TFRMOPTIONSLAYOUT.CBPANELOFOPERATIONS.CAPTION" msgid "Show panel of operation in background" msgstr "Zobrazovat panel operací na pozadí" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "TFRMOPTIONSLAYOUT.CBPROGINMENUBAR.CAPTION" msgid "Show common progress in menu bar" msgstr "Zobrazovat běžný průběh v panelu nabídky" #: tfrmoptionslayout.cbshowcmdline.caption #| msgid "Show command &line" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCMDLINE.CAPTION" msgid "Show command l&ine" msgstr "Zobrazit příkazový řá&dek" #: tfrmoptionslayout.cbshowcurdir.caption #| msgid "Show ¤t directory" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCURDIR.CAPTION" msgid "Show current director&y" msgstr "Zobrazit aktuální adresá&ř" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDISKPANEL.CAPTION" msgid "Show &drive buttons" msgstr "Zobrazit &tlačítka disků" #: tfrmoptionslayout.cbshowdrivefreespace.caption #| msgid "Show free space label" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDRIVEFREESPACE.CAPTION" msgid "Show free s&pace label" msgstr "Zobrazit štítek vol&ného místa" #: tfrmoptionslayout.cbshowdriveslistbutton.caption #| msgid "Show d&rives list button" msgid "Show drives list bu&tton" msgstr "Zobrazit tlačí&tko seznamu disků" #: tfrmoptionslayout.cbshowkeyspanel.caption #| msgid "Show &function key buttons" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWKEYSPANEL.CAPTION" msgid "Show function &key buttons" msgstr "Zobrazit funkční &tlačítka" #: tfrmoptionslayout.cbshowmainmenu.caption #| msgid "Show main menu" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINMENU.CAPTION" msgid "Show &main menu" msgstr "Zobrazit &hlavní nabídku" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINTOOLBAR.CAPTION" msgid "Show &button bar" msgstr "Zobrazit &tlačítkovou lištu" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption msgid "Show short free space &label" msgstr "Krátce vypsat &štítek volného místa " #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWSTATUSBAR.CAPTION" msgid "Show &status bar" msgstr "Zobrazit &stavový řádek" #: tfrmoptionslayout.cbshowtabheader.caption #| msgid "Show &tabstop header" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABHEADER.CAPTION" msgid "S&how tabstop header" msgstr "Z&obrazit záhlaví tabulátoru" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABS.CAPTION" msgid "Sho&w folder tabs" msgstr "Zobrazit &záložky adresářů" #: tfrmoptionslayout.cbtermwindow.caption #| msgid "Show terminal window" msgctxt "TFRMOPTIONSLAYOUT.CBTERMWINDOW.CAPTION" msgid "Show te&rminal window" msgstr "Zobrazit okno te&rminálu" #: tfrmoptionslayout.cbtwodiskpanels.caption #| msgid "Show two drive button bars (fixed width, above file windows)" msgctxt "TFRMOPTIONSLAYOUT.CBTWODISKPANELS.CAPTION" msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "Zobrazit 2 seznamy disků (pe&vná šířka, nad souborovými okny)" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "TFRMOPTIONSLAYOUT.GBSCREENLAYOUT.CAPTION" msgid " Screen layout " msgstr "Vzhled obrazovky" #: tfrmoptionslog.cblogarcop.caption #| msgid "Pack/Unpack" msgctxt "TFRMOPTIONSLOG.CBLOGARCOP.CAPTION" msgid "&Pack/Unpack" msgstr "&Komprese/Dekomprese" #: tfrmoptionslog.cblogcpmvln.caption #| msgid "Copy/Move/Create link/symlink" msgctxt "TFRMOPTIONSLOG.CBLOGCPMVLN.CAPTION" msgid "Cop&y/Move/Create link/symlink" msgstr "Kopírování&/přesun/vytvořit odkaz/sym.odkaz" #: tfrmoptionslog.cblogdelete.caption #| msgid "Delete" msgctxt "TFRMOPTIONSLOG.CBLOGDELETE.CAPTION" msgid "&Delete" msgstr "&Vymazat" #: tfrmoptionslog.cblogdirop.caption #| msgid "Create/Delete directories" msgctxt "TFRMOPTIONSLOG.CBLOGDIROP.CAPTION" msgid "Crea&te/Delete directories" msgstr "Tvor&ba/Mazání adresářů" #: tfrmoptionslog.cblogerrors.caption msgctxt "TFRMOPTIONSLOG.CBLOGERRORS.CAPTION" msgid "Log &errors" msgstr "Zaznamenávat &chyby" #: tfrmoptionslog.cblogfile.caption #| msgid "&Create a log file:" msgctxt "TFRMOPTIONSLOG.CBLOGFILE.CAPTION" msgid "C&reate a log file:" msgstr "V&ytvořit soubor záznamu:" #: tfrmoptionslog.cbloginfo.caption #| msgid "Log information messages" msgctxt "TFRMOPTIONSLOG.CBLOGINFO.CAPTION" msgid "Log &information messages" msgstr "Záznam &informačních zpráv" #: tfrmoptionslog.cblogsuccess.caption msgctxt "TFRMOPTIONSLOG.CBLOGSUCCESS.CAPTION" msgid "Log &successful operations" msgstr "Záznam &dokončených operací" #: tfrmoptionslog.cblogvfs.caption #| msgid "File system plugins" msgctxt "TFRMOPTIONSLOG.CBLOGVFS.CAPTION" msgid "&File system plugins" msgstr "&Doplňky souborového systému" #: tfrmoptionslog.gblogfile.caption msgctxt "TFRMOPTIONSLOG.GBLOGFILE.CAPTION" msgid "File operation log file" msgstr "Záznam souborových operací" #: tfrmoptionslog.gblogfileop.caption #| msgid "Log operations:" msgctxt "TFRMOPTIONSLOG.GBLOGFILEOP.CAPTION" msgid "Log operations" msgstr "Záznam operací:" #: tfrmoptionslog.gblogfilestatus.caption #| msgid "Operation status:" msgctxt "TFRMOPTIONSLOG.GBLOGFILESTATUS.CAPTION" msgid "Operation status" msgstr "Stav operace:" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "&Odstranit miniatury už existujících souborů" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "Vždy &jít do kořenového adresáře při výměně disků" #: tfrmoptionsmisc.chkshowwarningmessages.caption #| msgid "Show warning messages (\"OK\" button only)" msgctxt "tfrmoptionsmisc.chkshowwarningmessages.caption" msgid "Show &warning messages (\"OK\" button only)" msgstr "Zobrazit &varovné zprávy (pouze tlačítko \"OK\")" #: tfrmoptionsmisc.chkthumbsave.caption #| msgid "Save thumbnails in cache" msgctxt "tfrmoptionsmisc.chkthumbsave.caption" msgid "&Save thumbnails in cache" msgstr "&Uložit miniatury ve vyrovnávací paměti" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "tfrmoptionsmisc.dblthumbnails.caption" msgid "Thumbnails" msgstr "Náhledy" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "pixelů" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "tfrmoptionsmisc.lblthumbseparator.caption" msgid "X" msgstr "X" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "&Velikost náhledů" #: tfrmoptionsmouse.cbselectionbymouse.caption #| msgid "Selection by mouse" msgid "&Selection by mouse" msgstr "&Výběr myší" #: tfrmoptionsmouse.gbscrolling.caption msgid "Scrolling" msgstr "Rolování" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "Výběr" #: tfrmoptionsmouse.lblmousemode.caption #| msgid "Mode:" msgid "&Mode:" msgstr "&Režim:" #: tfrmoptionsmouse.rbscrolllinebyline.caption #| msgid "Line by line" msgid "&Line by line" msgstr "&Řádek po řádku" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption #| msgid "Line by line with cursor movement" msgid "Line by line &with cursor movement" msgstr "Řádek po řádku &s posunem kurzoru" #: tfrmoptionsmouse.rbscrollpagebypage.caption #| msgid "Page by page" msgid "&Page by page" msgstr "&Stránka po stránce" #: tfrmoptionsplugins.btnaddplugin.caption #| msgid "Add" msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "P&řidat" #: tfrmoptionsplugins.btnconfigplugin.caption #| msgid "Configure" msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "Kon&figurovat" #: tfrmoptionsplugins.btnenableplugin.caption #| msgid "Enable" msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "P&ovolit" #: tfrmoptionsplugins.btnremoveplugin.caption #| msgid "Remove" msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "&Smazat" #: tfrmoptionsplugins.btntweakplugin.caption #| msgid "Tweak" msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "&Vylepšení" #: tfrmoptionsplugins.lbldsxdescription.caption #| msgid "Search plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "Vyhle&dávací doplňky umožňují použití při hledání alternativních vyhledávacích algoritmů nebo externích nástrojů (např. \"najít \", atd.)" #: tfrmoptionsplugins.lblwcxdescription.caption #| msgid "Packer plugins are used to work with archives." msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "Komp&rimační doplňky pro práci s archívy." #: tfrmoptionsplugins.lblwdxdescription.caption #| msgid "Content plugins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "Obsahové dop&lňky umožňují zobrazit rozšířené informace jako jsou MP3 značky nebo atributy obrázků v seznamu souborů, nebo je používat při vyhledávání a s nástrojem hromadné přejmenování" #: tfrmoptionsplugins.lblwfxdescription.caption #| msgid "File system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "Doplňky sou&borových systémů umožní přístup na běžně nedostupná média jako jsou například externí zařízení (Palm/PocketPC)." #: tfrmoptionsplugins.lblwlxdescription.caption #| msgid "Viewer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "Zobra&zovací doplňky umožňují prohlížení souborů jako jsou například obrázky, databáze a podobně v prohlížeči (F3, nebo Ctrl+Q)" #: tfrmoptionsplugins.stgplugins.columns[0].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[0].TITLE.CAPTION" msgid "Active" msgstr "Aktivní" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[1].TITLE.CAPTION" msgid "Plugin" msgstr "Doplněk" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[2].TITLE.CAPTION" msgid "Registered for" msgstr "Registrováno pro" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[3].TITLE.CAPTION" msgid "File name" msgstr "Název souboru" #: tfrmoptionsplugins.tsdsx.caption #| msgid "Search plugins (.DSX)" msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "&Vyhledávací doplňky (.DSX)" #: tfrmoptionsplugins.tswcx.caption #| msgid "Packer plugins (.WCX)" msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "Kom&primační doplňky (.WCX)" #: tfrmoptionsplugins.tswdx.caption #| msgid "Content plugins (.WDX)" msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "Obsahové do&plňky (.WDX)" #: tfrmoptionsplugins.tswfx.caption #| msgid "File system plugins (.WFX)" msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "D&oplňky souborových systémů (.WFX)" #: tfrmoptionsplugins.tswlx.caption #| msgid "Viewer plugins (.WLX)" msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "&Zobrazovací doplňky (.WLX)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTBEGINNING.CAPTION" msgid "&Beginning (name must start with first typed character)" msgstr "&Začátek (jméno musí začínat zadaným znakem)" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTENDING.CAPTION" msgid "En&ding (last character before a typed dot . must match)" msgstr "&Konec (poslední znak před . musí odpovídat zadanému)" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CGPOPTIONS.CAPTION" msgid "Options" msgstr "Předvolby" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption #| msgid "Exact name match:" msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.GBEXACTNAMEMATCH.CAPTION" msgid "Exact name match" msgstr "Odpovídá přesně jménu" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "Hledat znaky" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "Hledání těchto položek" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "TFRMOPTIONSTABS.CBTABSACTIVATEONCLICK.CAPTION" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "Aktivovat cílový &panel při kliknutí na jeho libovolnou záložku" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "TFRMOPTIONSTABS.CBTABSALWAYSVISIBLE.CAPTION" msgid "&Show tab header also when there is only one tab" msgstr "&Zobrazit záložku, i když bude pouze 1" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption #| msgid "&Confirm close all tabs" msgctxt "TFRMOPTIONSTABS.CBTABSCONFIRMCLOSEALL.CAPTION" msgid "Con&firm close all tabs" msgstr "Potv&rdit uzavření všech záložek" #: tfrmoptionstabs.cbtabslimitoption.caption #| msgid "&Limit tab title length to:" msgctxt "TFRMOPTIONSTABS.CBTABSLIMITOPTION.CAPTION" msgid "&Limit tab title length to" msgstr "&Omezit šířku záložky na" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "TFRMOPTIONSTABS.CBTABSLOCKEDASTERISK.CAPTION" msgid "Show locked tabs &with an asterisk *" msgstr "Zobrazit uzamčené záložky se znakem *" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "TFRMOPTIONSTABS.CBTABSMULTILINES.CAPTION" msgid "&Tabs on multiple lines" msgstr "&Záložky na více řádků" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENFOREGROUND.CAPTION" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Ctrl+&Nahoru otevře novou záložku na pozadí" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENNEARCURRENT.CAPTION" msgid "Open &new tabs near current tab" msgstr "Otevřít &novou záložku vedle aktuální záložky" #: tfrmoptionstabs.cbtabsshowclosebutton.caption #| msgid "Show tab close button" msgctxt "TFRMOPTIONSTABS.CBTABSSHOWCLOSEBUTTON.CAPTION" msgid "Show ta&b close button" msgstr "Na zálož&kách i tlačítko zavřít" #: tfrmoptionstabs.gbtabs.caption msgctxt "TFRMOPTIONSTABS.GBTABS.CAPTION" msgid "Folder tabs headers" msgstr "Záhlaví záložek" #: tfrmoptionstabs.lblchar.caption msgctxt "TFRMOPTIONSTABS.LBLCHAR.CAPTION" msgid "characters" msgstr "znaky" #: tfrmoptionstabs.lbltabsposition.caption #| msgid "Tabs position" msgctxt "TFRMOPTIONSTABS.LBLTABSPOSITION.CAPTION" msgid "Ta&bs position" msgstr "Pozice zá&ložek" #: tfrmoptionsterminal.lblruninterm.caption #| msgid "Run in terminal:" msgid "Run in &terminal:" msgstr "Spustit v &terminálu" #: tfrmoptionsterminal.lblrunterm.caption #| msgid "Run terminal:" msgid "Run t&erminal:" msgstr "Spustit t&erminál:" #: tfrmoptionstoolbar.btnclonebutton.caption #| msgid "&Clone button" msgctxt "tfrmoptionstoolbar.btnclonebutton.caption" msgid "C&lone button" msgstr "K&lonovat tlačítko" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "tfrmoptionstoolbar.btndeletebutton.caption" msgid "&Delete" msgstr "&Vymazat" #: tfrmoptionstoolbar.btnedithotkey.caption #| msgid "Edit hotkey" msgctxt "tfrmoptionstoolbar.btnedithotkey.caption" msgid "Edit hot&key" msgstr "Upravit kláveso&vou zkratku" #: tfrmoptionstoolbar.btninsertbutton.caption #| msgid "&Insert new buttonX" msgctxt "tfrmoptionstoolbar.btninsertbutton.caption" msgid "&Insert new button" msgstr "&Vložit nové tlačítko" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "tfrmoptionstoolbar.btnopenfile.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "tfrmoptionstoolbar.btnopenicon.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnremovehotkey.caption #| msgid "Remove hotkey" msgctxt "tfrmoptionstoolbar.btnremovehotkey.caption" msgid "Remove hotke&y" msgstr "Odstranit kláveso&vou zkratku" #: tfrmoptionstoolbar.cbflatbuttons.caption #| msgid "Flat b&uttons" msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "&Plochá tlačítka" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "Zadejte parametry příkazů, každý na samostatném řádku. Stisknutím klávesy F1 zobrazíte nápovědu k parametrům." #: tfrmoptionstoolbar.gbgroupbox.caption msgctxt "tfrmoptionstoolbar.gbgroupbox.caption" msgid "Appearance" msgstr "Vzhled" #: tfrmoptionstoolbar.lblbarsize.caption #| msgid "Ba&r size:" msgctxt "tfrmoptionstoolbar.lblbarsize.caption" msgid "&Bar size:" msgstr "&Velikost panelu:" #: tfrmoptionstoolbar.lblexternalcommand.caption msgctxt "tfrmoptionstoolbar.lblexternalcommand.caption" msgid "Comman&d:" msgstr "Příka&z" #: tfrmoptionstoolbar.lblexternalparameters.caption msgctxt "tfrmoptionstoolbar.lblexternalparameters.caption" msgid "Parameter&s:" msgstr "Parametr&y" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "Klávesová zkratka" #: tfrmoptionstoolbar.lbliconfile.caption #| msgid "Icon:" msgctxt "tfrmoptionstoolbar.lbliconfile.caption" msgid "Ico&n:" msgstr "Iko&na:" #: tfrmoptionstoolbar.lbliconsize.caption #| msgid "Ic&on size:" msgctxt "tfrmoptionstoolbar.lbliconsize.caption" msgid "Icon si&ze:" msgstr "Ve&likost ikony:" #: tfrmoptionstoolbar.lblinternalcommand.caption msgctxt "tfrmoptionstoolbar.lblinternalcommand.caption" msgid "Co&mmand:" msgstr "Pří&kaz:" #: tfrmoptionstoolbar.lblinternalparameters.caption msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "&Parametry" #: tfrmoptionstoolbar.lblstartpath.caption #| msgid "Start path:" msgctxt "tfrmoptionstoolbar.lblstartpath.caption" msgid "Start pat&h:" msgstr "Výchozí cest&a:" #: tfrmoptionstoolbar.lbltooltip.caption #| msgid "Tooltip:" msgctxt "tfrmoptionstoolbar.lbltooltip.caption" msgid "&Tooltip:" msgstr "&Nástrojový tip:" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "Typ tlačítka" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption #| msgid "Keep terminal window open after executing program" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSKEEPTERMINALOPEN.CAPTION" msgid "&Keep terminal window open after executing program" msgstr "&Po vykonání programu udržovat okno terminálu otevřené" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption #| msgid "Execute in terminal" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSRUNINTERMINAL.CAPTION" msgid "&Execute in terminal" msgstr "&Vykonat v terminálu" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption #| msgid "Use external program" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSUSEEXTERNALPROGRAM.CAPTION" msgid "&Use external program" msgstr "&Použít externí program" #: tfrmoptionstoolbase.lbltoolsparameters.caption #| msgid "Additional parameters" msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPARAMETERS.CAPTION" msgid "A&dditional parameters" msgstr "D&oplňující parametry" #: tfrmoptionstoolbase.lbltoolspath.caption #| msgid "Path to program to execute" msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPATH.CAPTION" msgid "&Path to program to execute" msgstr "&Cesta programu k vykonání" #: tfrmoptionstooltips.btnaddfields.caption #| msgid "Add" msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "P&řidat" #: tfrmoptionstooltips.btnapplyfields.caption #| msgid "Apply" msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "P&oužít" #: tfrmoptionstooltips.btndeletefields.caption #| msgid "Delete" msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "V&ymazat" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Šablona..." #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "Vlastní pole podle typu soubor" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "Zobrazit nástrojový tip" #: tfrmoptionstooltips.lblfieldslist.caption #| msgid "Category hint:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "Pokyn &kategorie:" #: tfrmoptionstooltips.lblfieldsmask.caption #| msgid "Category mask:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "Maska &kategorie:" #: tfrmoptionstooltips.lblfieldsname.caption #| msgid "Category name:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "&Název kategorie:" #: tfrmoptionstooltips.rbtooltipallfiles.caption #| msgid "Show tool tip for all files in file panel" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "Uká&zat nástrojový tip pro všechny soubor v panelu souborů" #: tfrmoptionstooltips.rbtooltipnone.caption #| msgid "Don't show" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "Neu&kazovat" #: tfrmoptionstooltips.rbtooltiponlylarge.caption #| msgid "Show tool tip for files in file panel if truncated" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "Zobrazit &nástrojový tip u souborů v panelu souborů pokud jsou ořezány" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNBACKVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNFONTVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.gbviewerbookmode.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWERBOOKMODE.CAPTION" msgid "Viewer Book Mode" msgstr "Režim knihy prohlížeče" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWEREXAMPLE.CAPTION" msgid "Example" msgstr "Ukázka" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption #| msgid "Background color in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLBACKGROUNDCOLORVIEWERBOOK.CAPTION" msgid "&Background color in book viewer" msgstr "&Barva pozadí v prohlížeči knih" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption #| msgid "Font color in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLFONTCOLORVIEWERBOOK.CAPTION" msgid "&Font color in book viewer" msgstr "&Barva písma v prohlížeči knih" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption #| msgid "Number of columns in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLNUMBERCOLUMNSVIEWER.CAPTION" msgid "&Number of columns in book viewer" msgstr "&Počet sloupců v prohlížeči knih" #: tfrmpackdlg.btncancel.caption #| msgid "Cancel" msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmpackdlg.btnconfig.caption #| msgid "&Configure" msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "Konfi&gurovat" #: tfrmpackdlg.btnhelp.caption #| msgid "Help" msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "&Nápověda" #: tfrmpackdlg.btnok.caption #| msgid "OK" msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmpackdlg.caption msgctxt "TFRMPACKDLG.CAPTION" msgid "Pack files" msgstr "Komprimovat soubory" #: tfrmpackdlg.cbcreateseparatearchives.caption #| msgid "Create separate archives, o&ne per selected file/dir" msgid "C&reate separate archives, one per selected file/dir" msgstr "V&ytvořit oddělené archív, jede&n na vybraný soubor/adresář" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "Sa&morozbalovací archív" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "&Zakódovat" #: tfrmpackdlg.cbmovetoarchive.caption #| msgid "M&ove to archive" msgid "Mo&ve to archive" msgstr "Pře&sunout do archívu" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "&Vícesvazkový archív" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "=>" #: tfrmpackdlg.cbputintarfirst.caption #| msgid "Put in the TAR archive first" msgid "P&ut in the TAR archive first" msgstr "N&ejdříve vložit do TAR archívu" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "Také kom&primovat se jmény cest (pouze rekurzivně)" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "Komprimovat soubor(y) do souboru:" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "Komprimátor" #: tfrmpackinfodlg.btnclose.caption #| msgid "Close" msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zavřít" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "Rozbalit &vše a spustit" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "&Rozbalit a spustit" #: tfrmpackinfodlg.caption msgctxt "TFRMPACKINFODLG.CAPTION" msgid "Properties of packed file" msgstr "Vlastnosti komprimovaného souboru" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "Atributy:" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "Kompresní poměr:" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "Datum:" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "Metoda:" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "Původní velikost:" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "Soubor:" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "Zkomprimovaná velikost:" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "Komprimátor:" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "Čas:" #: tfrmquicksearch.btncancel.caption msgctxt "tfrmquicksearch.btncancel.caption" msgid "X" msgstr "X" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "Zavřít panel filtru" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "Zadejte text, který chcete vyhledat nebo filtrovat podle" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "Aa" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "Rozlišovat velikost znaků" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "D" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "Adresáře" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "F" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "Soubory" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "{" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "Srovnání začíná" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "}" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "Srovnání končí" #: tfrmquicksearch.tglfilter.caption msgctxt "tfrmquicksearch.tglfilter.caption" msgid "Filter" msgstr "Filtr" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "Přepnout mezi hledaním nebo filtrováním" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CANCELBUTTON.CAPTION" msgid "Cancel" msgstr "Zrušit" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CLOSEBUTTON.CAPTION" msgid "&Close" msgstr "&Zavřít" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.HELPBUTTON.CAPTION" msgid "&Help" msgstr "&Nápověda" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "tfrmselecttextrange.btppanel.okbutton.caption" msgid "&OK" msgstr "&OK" #: tfrmselecttextrange.lblselecttext.caption #| msgid "Select the characters to insert:" msgid "&Select the characters to insert:" msgstr "&Vyberte znaky k vložení:" #: tfrmsetfileproperties.btncancel.caption #| msgid "Cancel" msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsetfileproperties.caption msgctxt "TFRMSETFILEPROPERTIES.CAPTION" msgid "Change attributes" msgstr "Změnit atributy" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Sticky" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "Archív" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "Vytvořeno:" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "Skryté" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "Zpřístupněno:" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "Změněno:" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "Pouze pro čtení" #: tfrmsetfileproperties.chkrecursive.caption msgid "Including subfolders" msgstr "Včetně podsložek" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "Systém" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "Vlastnosti časové známky" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atributy" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atributy" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bitů:" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Skupina" #: tfrmsetfileproperties.lblattrinfo.caption msgid "(gray field means unchanged value)" msgstr "(šedá pole znamenají nezměněné hodnoty)" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Ostatní" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Vlastník" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Text:" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Spustit" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Osmičkově:" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Čtení" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Zápis" #: tfrmsplitter.btncancel.caption #| msgid "Cancel" msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption #| msgid "OK" msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsplitter.caption msgctxt "TFRMSPLITTER.CAPTION" msgid "Splitter" msgstr "Dělení souborů" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664B - 3.5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "Název souboru" #: tfrmsplitter.grbxsize.caption #| msgid "File size" msgid "Size and number of parts" msgstr "Velikost a počet částí" #: tfrmsplitter.lbdirtarget.caption #| msgid "Directory target" msgid "Directory &target" msgstr "&Cílový adresář" #: tfrmsplitter.lbfilesource.caption #| msgid "File source" msgid "File &source" msgstr "Zdroj &souboru" #: tfrmsplitter.lblnumberparts.caption #| msgid "Number of parts" msgid "&Number of parts" msgstr "&Počet částí" #: tfrmsplitter.rbtngigab.caption #| msgid "Gigabytes" msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "&Gigabajtů" #: tfrmsplitter.rbtnkilob.caption #| msgid "Kilobytes" msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "&Kilobajtů" #: tfrmsplitter.rbtnmegab.caption #| msgid "Megabytes" msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "&Megabajtů" #: tfrmsymlink.btncancel.caption #| msgid "Cancel" msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsymlink.caption #| msgid "Create symlink" msgid "Create symbolic link" msgstr "Vytvořit symbolický odkaz" #: tfrmsymlink.lblexistingfile.caption #| msgid "Destination that the link will point to" msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "&Cíl, na který bude odkaz ukazovat" #: tfrmsymlink.lbllinktocreate.caption #| msgid "Link name" msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "&Název odkazu" #: tfrmtweakplugin.btnadd.caption #| msgid "Add new" msgid "A&dd new" msgstr "P&řidat nový" #: tfrmtweakplugin.btncancel.caption #| msgid "Cancel" msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Zrušit" #: tfrmtweakplugin.btnchange.caption #| msgid "Change" msgid "C&hange" msgstr "Z&měnit" #: tfrmtweakplugin.btndefault.caption #| msgid "Default" msgid "De&fault" msgstr "Vý&chozí" #: tfrmtweakplugin.btnok.caption #| msgid "OK" msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmtweakplugin.btnremove.caption #| msgid "Remove" msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "&Odstranit" #: tfrmtweakplugin.caption msgctxt "TFRMTWEAKPLUGIN.CAPTION" msgid "Tweak plugin" msgstr "Vylepšovací doplněk" #: tfrmtweakplugin.cbpk_caps_by_content.caption #| msgid "Detect archive type by content" msgid "De&tect archive type by content" msgstr "Zj&išťuje typ archívu podle obsahu" #: tfrmtweakplugin.cbpk_caps_delete.caption #| msgid "Can delete files" msgid "Can de&lete files" msgstr "Může ma&zat soubory" #: tfrmtweakplugin.cbpk_caps_encrypt.caption #| msgid "Supports encryption" msgid "Supports e&ncryption" msgstr "Podporuje kó&dování" #: tfrmtweakplugin.cbpk_caps_hide.caption #| msgid "Show as normal files (hide packer icon)" msgid "Sho&w as normal files (hide packer icon)" msgstr "Zobra&zen jako normální soubory (skrýt ikonu komprimátoru)" #: tfrmtweakplugin.cbpk_caps_mempack.caption #| msgid "Supports packing in memory" msgid "Supports pac&king in memory" msgstr "Podporuje kom&primaci v paměti" #: tfrmtweakplugin.cbpk_caps_modify.caption #| msgid "Can modify exisiting archives" msgid "Can &modify exisiting archives" msgstr "Může &měnit stávající archívy" #: tfrmtweakplugin.cbpk_caps_multiple.caption #| msgid "Archive can contain multiple files" msgid "&Archive can contain multiple files" msgstr "&Archiv může obsahovat více souborů" #: tfrmtweakplugin.cbpk_caps_new.caption #| msgid "Can create new archives" msgid "Can create new archi&ves" msgstr "Může vytvářet nové arch&ívy" #: tfrmtweakplugin.cbpk_caps_options.caption #| msgid "Supports the options dialogbox" msgid "S&upports the options dialogbox" msgstr "P&odporuje dialog s nastavením" #: tfrmtweakplugin.cbpk_caps_searchtext.caption #| msgid "Allow searching for text in archives" msgid "Allow searchin&g for text in archives" msgstr "Umožňuje vyhledáván&í textu v archívu" #: tfrmtweakplugin.lbldescription.caption #| msgid "Description:" msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "&Popis:" #: tfrmtweakplugin.lbldetectstr.caption #| msgid "Detect string:" msgid "D&etect string:" msgstr "D&etekovaný text:" #: tfrmtweakplugin.lblextension.caption #| msgid "Extension:" msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "&Přípona:" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "Příznaky:" #: tfrmtweakplugin.lblname.caption #| msgid "Name:" msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "&Jméno:" #: tfrmtweakplugin.lblplugin.caption #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "&Doplněk:" #: tfrmtweakplugin.lblplugin1.caption #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "&Doplněk:" #: tfrmviewer.actabout.caption msgctxt "TFRMVIEWER.ACTABOUT.CAPTION" msgid "About Viewer..." msgstr "O prohlížeči..." #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "Zobrazit zprávu o programu" #: tfrmviewer.actcopyfile.caption msgctxt "TFRMVIEWER.ACTCOPYFILE.CAPTION" msgid "Copy File" msgstr "Kopírovat soubor" #: tfrmviewer.actcopyfile.hint msgctxt "TFRMVIEWER.ACTCOPYFILE.HINT" msgid "Copy File" msgstr "Kopírovat soubor" #: tfrmviewer.actdeletefile.caption msgctxt "TFRMVIEWER.ACTDELETEFILE.CAPTION" msgid "Delete File" msgstr "Vymazat soubor" #: tfrmviewer.actdeletefile.hint msgctxt "TFRMVIEWER.ACTDELETEFILE.HINT" msgid "Delete File" msgstr "Vymazat soubor" #: tfrmviewer.actloadnextfile.caption msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.CAPTION" msgid "&Next" msgstr "&Další" #: tfrmviewer.actloadnextfile.hint msgid "Load Next File" msgstr "Načíst další soubor" #: tfrmviewer.actloadprevfile.caption msgctxt "TFRMVIEWER.ACTLOADPREVFILE.CAPTION" msgid "&Previous" msgstr "&Předešlý" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "Načíst předchozí soubor" #: tfrmviewer.actmirror.caption msgctxt "TFRMVIEWER.ACTMIRROR.CAPTION" msgid "Mirror" msgstr "Zrcadlit" #: tfrmviewer.actmirror.hint msgctxt "TFRMVIEWER.ACTMIRROR.HINT" msgid "Mirror" msgstr "Zrcadlit" #: tfrmviewer.actmovefile.caption msgctxt "TFRMVIEWER.ACTMOVEFILE.CAPTION" msgid "Move File" msgstr "Přesunout soubor" #: tfrmviewer.actmovefile.hint msgctxt "TFRMVIEWER.ACTMOVEFILE.HINT" msgid "Move File" msgstr "Přesunout soubor" #: tfrmviewer.actreload.caption msgctxt "TFRMVIEWER.ACTRELOAD.CAPTION" msgid "Reload" msgstr "Obnovit" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "Znovu načíst aktuální soubor" #: tfrmviewer.actrotate180.caption msgctxt "TFRMVIEWER.ACTROTATE180.CAPTION" msgid "Rotate 180" msgstr "Otočit 180" #: tfrmviewer.actrotate180.hint msgctxt "TFRMVIEWER.ACTROTATE180.HINT" msgid "Rotate 180" msgstr "Otočit 180" #: tfrmviewer.actrotate270.caption msgctxt "TFRMVIEWER.ACTROTATE270.CAPTION" msgid "Rotate 270" msgstr "Otočit 270" #: tfrmviewer.actrotate270.hint msgctxt "TFRMVIEWER.ACTROTATE270.HINT" msgid "Rotate 270" msgstr "Otočit 270" #: tfrmviewer.actrotate90.caption msgctxt "TFRMVIEWER.ACTROTATE90.CAPTION" msgid "Rotate 90" msgstr "Otočit 90" #: tfrmviewer.actrotate90.hint msgctxt "TFRMVIEWER.ACTROTATE90.HINT" msgid "Rotate 90" msgstr "Otočit 90" #: tfrmviewer.actsaveas.caption msgctxt "TFRMVIEWER.ACTSAVEAS.CAPTION" msgid "Save As..." msgstr "Uložit jako..." #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "Uložit soubor jako..." #: tfrmviewer.actstretchimage.caption msgctxt "TFRMVIEWER.ACTSTRETCHIMAGE.CAPTION" msgid "Stretch" msgstr "Přizpůsobit" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "Roztáhnout obrázek" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "- 90" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "Kopírovat" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "Kopírovat" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "Oříznout" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "Vymazat" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "Vymazat" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "Celá obrazovka" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "||" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "S" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "Zvýraznění" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "Zrcadlit" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "Přesunout" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "Přesunout" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "||>" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "Kreslit" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "<||" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "Červené oči" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "Změnit velikost" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "Zpět" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "Přiblížit" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "Oddálit" #: tfrmviewer.caption msgctxt "tfrmviewer.caption" msgid "Viewer" msgstr "Prohlížeč" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Prohlídka" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "Pero" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "Zvýraznění" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "Kreslit" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Prohlídka" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "Zobrazit" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "0x0" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "+ 180" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "- 90" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "O programu" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "Zobrazit &binárně" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "Kopírovat do schránky" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Edit" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "Kó&dování" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "&Konec" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "&Soubor" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "Celá obrazovka" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "Grafika" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "Zobrazit &hexadecimálně" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "&Obrázek" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "Zobrazit jako &knížku" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "Zrcadlit" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "Doplňky" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "Náhled" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "Tisk..." #: tfrmviewer.mirotate.caption msgid "Rotate" msgstr "Otočit" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "Uložit" #: tfrmviewer.misaveas.caption msgctxt "TFRMVIEWER.MISAVEAS.CAPTION" msgid "Save As..." msgstr "Uložit jako..." #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "Snímek obrazovky" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "Hledání" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "Hledat další" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "Hledat předchozí" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "Vybrat vše" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.mistretch.caption msgctxt "TFRMVIEWER.MISTRETCH.CAPTION" msgid "Stretch" msgstr "Přizpůsobit" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "Zobrazit jako &text" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "&Zobrazit" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "Zobrazit &jako zalamovaný text" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "Přiblížit" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "Oddálit" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "Kopírovat do schránky" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "Vybrat vše" #: tfrmviewoperations.btnstartpause.caption #| msgid "Start" msgctxt "tfrmviewoperations.btnstartpause.caption" msgid "&Start" msgstr "&Začít" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "S&top" #: tfrmviewoperations.caption msgctxt "TFRMVIEWOPERATIONS.CAPTION" msgid "File operations" msgstr "Souborové operace" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "Vždy navrchu" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "Použijte \"táhni && pusť \" pro přesunutí operací mezi frontami" #: tfrmviewoperations.mnucanceloperation.caption msgctxt "tfrmviewoperations.mnucanceloperation.caption" msgid "Cancel" msgstr "Zrušit" #: tfrmviewoperations.mnucancelqueue.caption msgctxt "tfrmviewoperations.mnucancelqueue.caption" msgid "Cancel" msgstr "Zrušit" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "Nová fronta" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "tfrmviewoperations.mnuoperationshowdetached.caption" msgid "Show in detached window" msgstr "Zobrazit v samostatném okně" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "Vložit první ve frontě" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "Vložit poslední ve frontě" #: tfrmviewoperations.mnuqueue.caption msgctxt "tfrmviewoperations.mnuqueue.caption" msgid "Queue" msgstr "Fronta" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "Mimo frontu" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "Fronta 1" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "Fronta 2" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "Fronta 3" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "Fronta 4" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "Fronta 5" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "tfrmviewoperations.mnuqueueshowdetached.caption" msgid "Show in detached window" msgstr "Zobrazit v samostatném okně" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "&Pozastavit vše" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "tmultiarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Pokud soubor existuje" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "twcxarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Pokud soubor existuje" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "Práce v pozadí (samostatné přípojení)" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Pokud soubor existuje" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "Zrušit rychlý filtr" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "Zrušit aktuální operaci" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "Schránka neobsahuje žádné platné údaje z panelu nástrojů." #: ulng.rscolattr msgid "Attr" msgstr "Atr." #: ulng.rscoldate msgid "Date" msgstr "Datum" #: ulng.rscolext msgid "Ext" msgstr "Přípona" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "Jméno" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "Velikost" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "Počet změn:" #: ulng.rsconfcolalign msgid "Align" msgstr "Zarovnat" #: ulng.rsconfcolcaption msgid "Caption" msgstr "Nadpis" #: ulng.rsconfcolconfig msgid "Config" msgstr "Nastavit" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "Vymazat" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "Detaily položky" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "Přesunout" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "Šířka" #: ulng.rsconfcustheader msgid "Customize column" msgstr "Nastavení sloupců" #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "Kopírovat (%d) %s" #: ulng.rsdlgallopcomplete #| msgid "All operations is complete" msgid "All operations completed" msgstr "Všechny operace dokončeny" #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "Průběh všech operací %d %%" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "Př&erušit" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "Vše" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "&Připojit" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "&Zrušit" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "&Pokračovat" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "Kopírovat &do" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "Kopírovat do &Vše" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "U&končit program" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "I&gnorovat vše" #: ulng.rsdlgbuttonno msgid "&No" msgstr "&Ne" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "&Není" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "&OK" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "&Přepsat" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "Přepsat &Vše" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "Přepsat Vše s&tarší" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "&Znovu začít" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "O&pakovat" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "Pře&skočit" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "Přes&kočit vše" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "&Ano" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "Spočítat soubory a adresáře" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "Výpočet kontrolního součtu..." #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "Kontrola kontrolního součtu..." #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "Kopírovat soubor(y)" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "Smazat soubor(y)" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "Přesunout soubor(y)" #: ulng.rsdlgoppause #| msgid "Pause" msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "Poza&stavit" #: ulng.rsdlgopstart #| msgid "Start" msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "&Začít" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "Fronta" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "Rychlost %s/s" #: ulng.rsdlgspeedtime #| msgid "Speed %s/s, remaining time %s" msgid "Speed %s/s, time remaining %s" msgstr "Rychlost %s/s, zbývající čas %s" #: ulng.rsdlgsplit #| msgid "Split file" msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "Dělení" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "Vyčistit soubor(y)" #: ulng.rsdrivenolabel msgid "" msgstr "" #: ulng.rsdrivenomedia msgid "" msgstr "<žádné médium>" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Vnitřní editor Double Commanderu." #: ulng.rseditnewfile msgid "new.txt" msgstr "nový.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "Jméno souboru:" #: ulng.rseditnewopen msgid "Open file" msgstr "Otevřít soubor" #: ulng.rseditsearchback msgid "&Backward" msgstr "&Vzad" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "Hledat" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "V&před" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "Nahradit" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "Zeptat se;Přepsat;Kopírovat do;Přeskočit" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "Zeptat se;Přepsat;Přepsat starší;Přeskočit" #: ulng.rsfileopsetpropertyerroroptions msgctxt "ulng.rsfileopsetpropertyerroroptions" msgid "Ask;Don't set anymore;Ignore errors" msgstr "Zeptat se;Už nenastavovat;Ignorovat chyby" #: ulng.rsfilterstatus msgid "FILTER" msgstr "FILTR" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "Určit šablonu" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "%s úrovní" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "vše (neomezená hloubka)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "pouze aktuální adresář" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "Adresář %s neexistuje!" #: ulng.rsfindfound msgid "Found: %d" msgstr "Nalezeno: %d" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "Uložit vyhledávací šablonu" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "Název šablony:" #: ulng.rsfindscanned msgid "Scanned: %d" msgstr "Prohledáno: %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "Prohledávám" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "Hledat soubory" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "Začít v" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr "Volno %s z %s bytů" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "%s bajtů volných" #: ulng.rsfuncatime msgid "Access date/time" msgstr "Datum/čas přístup" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "Atributy" #: ulng.rsfunccomment msgctxt "ulng.rsfunccomment" msgid "Comment" msgstr "Komentář" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "Stlačená velikost" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "Datum/čas vytvoření" #: ulng.rsfuncext msgid "Extension" msgstr "Rozšíření" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "Skupina" #: ulng.rsfunclinkto msgid "Link to" msgstr "Napojit na" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "Datum/čas úpravy" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "Jméno" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "Jméno bez přípony" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "Vlastník" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "Cesta" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "Velikost" #: ulng.rsfunctype msgid "Type" msgstr "Typ" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "Chyba při vytváření hardlinku." #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "Kopírovat/Přesunout dialog" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "Rozdílné" #: ulng.rshotkeycategorymain msgid "Main" msgstr "Hlavní" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "Prohlížeč" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "Spojování dokončeno" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "Maska zrušení výběru" #: ulng.rsmarkplus msgid "Select mask" msgstr "Maska výběru" #: ulng.rsmaskinput msgid "Input mask:" msgstr "Vstupní maska:" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "Nastavit uživatelské sloupce" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "Nastavit tento vlastní pohled" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "Akce" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "Upravit" #: ulng.rsmnueject msgid "Eject" msgstr "Vysunout" #: ulng.rsmnumount msgid "Mount" msgstr "Připojit" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "Nový" #: ulng.rsmnunomedia msgid "No media available" msgstr "Žádné dostupné médium" #: ulng.rsmnuopenwith #| msgid "Open with ..." msgid "Open with" msgstr "Otevřít s ..." #: ulng.rsmnuopenwithother msgid "Other..." msgstr "Ostatní..." #: ulng.rsmnusortby msgid "Sort by" msgstr "Řadit podle" #: ulng.rsmnuumount #| msgid "Umount" msgid "Unmount" msgstr "Odpojit" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "Zobrazit" #: ulng.rsmsgaccount msgid "Account:" msgstr "Účet:" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "Doplňující parametry pro archivátor příkazové řádky:" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "Nemůžete kopírovat/přesunout soubor \"%s\" do sebe!" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "Nelze odstranit adresář %s" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "Změna adresáře na [%s] selhala!" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "Odstranit všechny neaktivní záložky?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "Záložka (%s) je uzamčena! Přesto zavřít?" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "Opravdu chcete skončit?" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "Kopírovat %d vybraných souborů/adresářů?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "Kopírovat vybrané \"%s\"?" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "Odstranit částečně zkopírovaný soubor ?" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "Vymazat %d vybrané soubory / adresáře?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "Vymazat %d vybraných souborů/adresářů do koše?" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "Vymazat vybrané \"%s\"?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "Přesunout vybrané \"%s\" do koše?" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "Nelze odstranit \"%s\" do koše! Odstranit přímo?" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "Disk není dostupný" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "Zadej příponu souboru:" #: ulng.rsmsgentername msgid "Enter name:" msgstr "Zadejte název:" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "CRC chyba v datech archívu" #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "Špatná data" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "Nelze se připojit k serveru: \"%s\"" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "Nelze zkopírovat soubor %s do %s" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "Již existuje adresář jménem \"%s\"." #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "Datum %s není podporován" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "Adresář %s existuje!" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "Operace přerušena uživatelem" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "Chyba při uzavírání souboru" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "Nelze vytvořit soubor" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "V archívu nejsou žádné další soubory" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "Nelze otevřít existující soubor" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "Chyba při čtení ze souboru" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "Chyba při zápisu do souboru" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "Nelze vytvořit adresář %s!" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "Nesprávný odkaz" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "Soubory neexistují" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "Nedostatek paměti" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "Funkce není podporována!" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "Chyba v příkazu kontextové nabídky" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "Chyba při načítání nastavení" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "Chyba syntaxe v regulárním výrazu!" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "Nelze přejmenovat soubor %s na %s" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "Nelze uložit asociace!" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "Nelze uložit soubor" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "Nelze nastavit atributy pro \"%s\"" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "Nelze nastavit datum/čas pro \"%s\"" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "Nelze nastavit vlastníka/skupinu pro \"%s \"" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "Vyrovnávací paměť je příliš malá" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "Příliš mnoho souborů pro kompresi" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "Neznámý formát archívu" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "Soubor %s byl změněn, uložit?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "Soubor %s existuje, přepsat?" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "Aktivní souborové operace)" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "Některé souborové operace nejsou dokončeny. Uzavření Double Commanderu může vést ke ztrátě dat." #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "Soubor %s je pouze ke čtení! Přesto vymazat?" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "Velikost souboru \"%s\" je příliš velká pro cílový souborový systém!" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "Složka %s existuje, přepsat?" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "Následovat symbolický odkaz \"%s\"?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "Chyba v příkazovém řádku" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "Nesprávné jméno souboru" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "Neplatný formát konfiguračního souboru" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "Neplatná cesta" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "Cesta %s obsahuje nepovolené znaky." #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "Toto není platný zásuvný modul!" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "Tento plugin je vyvinut pro Double Commander pro %s.%s Nemůže pracovat s Double Commander pro %s!" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "Neplatná citace" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "Nesprávný výběr." #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "Načítání seznamu souborů..." #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "Kopírovat soubor %s" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "Smazat soubor %s" #: ulng.rsmsglogerror msgid "Error: " msgstr "Chyba:" #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "Rozbalit soubor %s" #: ulng.rsmsgloginfo msgid "Info: " msgstr "Info: " #: ulng.rsmsgloglink msgid "Create link %s" msgstr "Vytvořit odkaz %s" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "Vytvořit adresář %s" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "Přesunout soubor %s" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "Komprimovat do souboru %s" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "Odstranit adresář %s" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "Hotovo:" #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "Vytvořit symbolický odkaz %s" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "Testovat integritu souboru %s" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "Ručně přidat horkou cestu" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "Ručně upravit horkou cestu" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "Zadejte jméno a cestu (formát jméno=cesta):" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "Hlavní heslo" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "Prosíme zadejte hlavní heslo:" #: ulng.rsmsgnewfile msgid "New file" msgstr "Nový soubor" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "Další část bude rozbalena" #: ulng.rsmsgnofiles msgid "No files" msgstr "Žádné soubory" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "Nejsou vybrány žádné soubory." #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "Není dostatek volného místa na cílovém disku! Pokračovat?" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "Není dostatek volného místa na cílovém disku! Opakovat?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "Nelze vymazat soubor %s" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "Není implementováno." #: ulng.rsmsgpassword msgid "Password:" msgstr "Heslo:" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "Hesla jsou rozdílná!" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "Prosíme zadejte heslo" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "Heslo (Firewall):" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "Prosíme zopakujte heslo pro ověření:" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "&Přidat %s" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "&Nastavit" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "&Vymazat %s" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "Předvolba \"%s\" již existuje. Nahradit?" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "Přejmenovat/přesunout %d vybraných souborů/adresářů?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "Přejmenovat/přesunout vybrané \"%s\"?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "Pro provedení změn prosím restartujte Double Commander" #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "Zvoleno: %s z %s, soubory: %d z %d, složky: %d z %d" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "Prosím vyberte pouze soubory s kontrolním součtem!" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "Prosím vyberte umístění další části" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "Nastavit název disku" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "Přejmenovat záložku" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "Jméno nové záložky:" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "Cílová cesta:" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "Nový název pro položku nabídky:" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "Vybráno příliš mnoho souborů." #: ulng.rsmsgurl msgid "URL:" msgstr "URL:" #: ulng.rsmsgusername msgid "User name:" msgstr "Jméno uživatele:" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "Uživatelské jméno (firewall):" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "Název disku:" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "Prosím zadejte velikost disku:" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "Pročistit %d vybraných souborů/adresářů?" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "Očistit vybrané \"%s\"?" #: ulng.rsmulrenfilenamestylelist #| msgid "No change;UPPERCASE;lowercase;First Char Big;" msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "Neměnit;VELKÁ;malá;1. znak velký;První znak každého slov velký" #: ulng.rsoperaborted msgid "Aborted" msgstr "Přerušeno" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "Přepočítává se kontrolní součet" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "Přepočítává se kontrolní součet v \"%s\"" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "Probíhá výpočet kontrolního součtu \"%s\"" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "Počítání" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "Probíhá výpočet \"%s\"" #: ulng.rsopercombining msgid "Joining" msgstr "Spojování" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "Spojení obrázků v \"%s \" do \"%s \"" #: ulng.rsopercopying msgid "Copying" msgstr "Kopírování" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "Kopírování z \"%s\" do \"%s\"" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "Kopírování \"%s\" do \"%s\"" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "Vytváření adresáře" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "Vytváření adresáře \"%s\"" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "Mazání" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "Mazání v \"%s\"" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "Mazání \"%s\"" #: ulng.rsoperexecuting msgid "Executing" msgstr "Provádění" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "Provádění \"%s\"" #: ulng.rsoperextracting msgid "Extracting" msgstr "Extrahování" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "Načtení z \"%s\" do \"%s\"" #: ulng.rsoperfinished msgid "Finished" msgstr "Hotovo" #: ulng.rsoperlisting msgid "Listing" msgstr "Vypisování" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "Vypisování \"%s\"" #: ulng.rsopermoving msgid "Moving" msgstr "Přesunování" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "Přesunování z \"%s\" do \"%s\"" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "Přesunování \"%s\" do \"%s\"" #: ulng.rsopernotstarted msgid "Not started" msgstr "Nespuštěno" #: ulng.rsoperpacking msgid "Packing" msgstr "Zabalení" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "Zabalení z \"%s\" do \"%s\"" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "Zabalení \"%s\" do \"%s\"" #: ulng.rsoperpaused msgid "Paused" msgstr "Pozastaveno" #: ulng.rsoperpausing msgid "Pausing" msgstr "Pozastavuji" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "Ve frontě" #: ulng.rsoperrunning msgid "Running" msgstr "Běží" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "Nastavení vlastnosti" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "Nastavení vlastnosti v \"%s\"" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "Nastavení vlastnosti z \"%s\"" #: ulng.rsopersplitting msgid "Splitting" msgstr "Rozdělení" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "Rozdělení \"%s\" do \"%s\"" #: ulng.rsoperstarting msgid "Starting" msgstr "Spouštím" #: ulng.rsoperstopped msgid "Stopped" msgstr "Zastaveno" #: ulng.rsoperstopping msgid "Stopping" msgstr "Zastavuji" #: ulng.rsopertesting msgid "Testing" msgstr "Testování" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "Testování v \"%s\"" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "Testování \"%s\"" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "Ověření kontrolního součtu" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "Ověření kontrolního součtu v \"%s\"" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "Ověření kontrolního součtu z \"%s\"" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "Čekání pro přístup k zdroji souboru" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "Čekám na reakci uživatele" #: ulng.rsoperwiping msgid "Wiping" msgstr "Otírání " #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "Otírání v \"%s\"" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "Otírání \"%s\"" #: ulng.rsoperworking msgid "Working" msgstr "Práce" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "Smazat:" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "Extrahovat bez cesty:" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "Režim rozboru formátu:" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "ID:" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "Pozice ID:" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "Rozsah hledání ID:" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "Parametr" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "Dotazovací řetězec hesla:" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "Vytvořit samorozbalovací archív:" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "Test?" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "Jméno typu archívu:" #: ulng.rsoptarchivevalue msgid "Value" msgstr "Hodnota" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "Asociovat doplněk \"%s\" s:" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "První;Poslední;" #: ulng.rsoptdisable msgid "Disable" msgstr "Zakázat" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "Povolit" #: ulng.rsoptenterext msgid "Enter extension" msgstr "Zadejte příponu" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "Kurzor" #: ulng.rsoptexamplemark msgid "Mark" msgstr "Označit" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "Značka + Kurzor" #: ulng.rsoptexampletext msgid "Text" msgstr "Text" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "samostatné okno;minimalizované samostatné okno;operace panel" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "plovoucí;B;K;M;G" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "Zkratka %s pro cm_Delete budou registrovány, takže jej lze použít ke obrácení tohoto nastavení." #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "Přidat klávesovou zkratku pro %s" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "Přidat zástupce" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "Nelze nastavit zástupce" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "Změnit zástupce" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "Příkaz" #: ulng.rsopthotkeysdeletetrashcanoverrides msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "Zástupce %s pro cm_Delete má parametr, který přepíše toto nastavení. Chcete změnit tento parametr a použít globální nastavení?" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "Zástupce %s pro cm_Delete potřebuje mít parametr změněný, aby odpovídal zástupci %s. Chcete ho změnit?" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "Popis" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "Změnit klávesovou zkratku pro %s" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "Opravit parametr" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "Horká klávesa" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "Horké klávesy" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "<žádný>" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "Parametry" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "Nastavit zástupce ke smazání souboru" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "Pro toto nastavení, aby pracoval zástupce %s, musí zástupce %s být přiřazen cm_Delete, ale už byl přiřazen k %s. Chcete to změnit?" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "Zástupce %s pro cm_Delete je sekvence zkratek pro které nesmí být přidělena obrácená zkratka Shift. Toto nastavení nemusí fungovat." #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "Zástupci v použití" #: ulng.rsopthotkeysshortcutusedtext1 msgid "Shortcut %s is already used." msgstr "Zástupce %s je již použit." #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "Změnit toto na %s?" #: ulng.rsopthotkeysusedby msgid "used for %s in %s" msgstr "použito pro %s v %s" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "použito pro tento příkaz, ale s různými parametry" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "Archivátory" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "Automatická obnova" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "Chování" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "Barvy" #: ulng.rsoptionseditorcolumnsview msgctxt "ulng.rsoptionseditorcolumnsview" msgid "Columns" msgstr "Sloupce" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "Nastavení" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "Vlastní sloupce" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "Uchop & táhni" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "Tlačítko seznamu disků" #: ulng.rsoptionseditorfileoperations msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "Souborové operace" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "Panely souborů" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "Zobrazení souborů" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "Typy souborů" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "Záložky adresářů" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "Písma" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "Zvýrazňovače" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "Horké klávesy" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "Ikony" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "Seznam ignorování" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "Klávesy" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "Jazyk" #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "Rozvržení" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "Záznam" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "Různé" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "Myš" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "Doplňky" #: ulng.rsoptionseditorquicksearch #| msgid "Quick search" msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "Rychlé hledání/filtr" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "Terminál" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "Panel nástrojů" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "Nástroje" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "Nástrojové tipy" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "Žádný;Příkazová řádka;Rychlé hledání;Rychlý filtr" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "Levé tlačítko;Pravé tlačítko;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "nahoře v seznamu souborů;po adresářích (pokud jsou adresáře řazeny před soubory);na tříděné pozici;v dolní části seznamu souborů" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "Doplněk %s již je přiřazen pro následující rozšíření:" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "Aktivní" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "Název souboru" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "Jméno" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "Registrováno pro" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "&Citlivý;&Necitlivý" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "&Soubory;Ad&resáře;Soubory a& adresáře" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "&Skrýt panel filtru, když není zaměřen" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "nezáleží na velikosti znaků;podle místního nastavení(aAbBcC);první velká, poté malá písmena (ABCabc)" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "seřadit podle jména a zobrazit první;seřadit jako soubory a zobrazit první;seřadit jako sobory" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "Abecedně, s ohledem na diakritiku; Přirozené řazení: abecedně a čísla" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "Nahoře;Dole;" #: ulng.rsopttoolbarbuttontype msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "O&ddělovač;Vni&třní příkaz;V&nější příkaz;Nabíd&ka" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "neměnit pozici;použít stejné nastavení pro nové soubory;do tříděné pozice" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "Soubory: %d, složky: %d" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "Nelze změnit přístupová práva pro \"%s\"" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "Nelze změnit vlastníka pro \"%s\"" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "Soubor" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "Adresář" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "Pojmenované roury" #: ulng.rspropsno msgid "No" msgstr "Ne" #: ulng.rspropssocket msgid "Socket" msgstr "Zásuvka" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "Zvláštní blokové zařízení" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "Zvláštní znakové zařízení" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "Symbolický odkaz" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "Neznámý typ" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "Ano (%s)" #: ulng.rssearchresult msgid "Search result" msgstr "Výsledky hledání" #: ulng.rssearchtemplateunnamed msgid "" msgstr "" #: ulng.rsselectdir msgid "Select a directory" msgstr "Vybrat adresář" #: ulng.rsshowhelpfor msgid "&Show help for %s" msgstr "&Zobrazit nápovědu pro %s" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "Bajtů" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "Gigabajtů" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "Kilobajtů" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "Megabajtů" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "Terabajtů" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "Souborů: %d, Adresářů: %d, Velikost: %s (%s bytů)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "Nelze vytvořit cílový adresář!" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "Neplatný formát velikosti souboru!" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "Nelze rozdělit soubor!" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "Počet částí je větší než 100! Pokračovat?" #: ulng.rssplitseldir msgid "Select directory:" msgstr "Výběr adresáře:" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "Chyba při vytváření zástupce." #: ulng.rssyndefaulttext msgctxt "ulng.rssyndefaulttext" msgid "Default text" msgstr "Původní text" #: ulng.rssynlangplaintext msgctxt "ulng.rssynlangplaintext" msgid "Plain text" msgstr "Prostý text" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "Dnů(í)" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "Hodin(y)" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "Minut(y)" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "Měsíc(e)" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "Sekund(y)" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "Týden(y)" #: ulng.rstimeunityear msgid "Year(s)" msgstr "Rok(y)" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "Rozdílné" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "Editor" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "Chyba otevření rozdílných" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "Chyba otevření editoru" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "Chyba otevření terminálu" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "Chyba otevření prohlížeče" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "Terminál" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "Prohlížeč" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "Prosíme nahlašte tuto chybu do sledovače chyb a popište, co jste dělali a následující soubor:%sStiskněte %s pro pokračování nebo %s pro přerušení programu." #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "Síť" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "Vnitřní prohlížeč Double Commanderu." #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "Kódování" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "%s nenalezeno!" doublecmd-0.5.8/language/doublecmd.chs.po0000644000175000017500000061422012250633131017344 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.5 alpha\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2009-09-07 10:38+0800\n" "Last-Translator: wwfifi \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Chinese\n" "X-Poedit-SourceCharset: utf-8\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "所有" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "所有" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "所有" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "所有" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "所有" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "所有" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "所有" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "取消" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "..." #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "->" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "确定(&O)" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "<-" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "配置自定义列视图" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "背景色:" #: tfcolumnssetconf.cbcursorborder.caption msgid "Cursor border" msgstr "" #: tfcolumnssetconf.cbovercolor.caption msgid "Allow Overcolor" msgstr "允许着色过浓" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "文本颜色:" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "字体:" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "大小:" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "背景色2:" #: tfcolumnssetconf.lblconfigviewnr.caption msgid "Configure view nr:" msgstr "配置视图:" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "当前行背景颜色:" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "当前行文本颜色:" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "标记颜色:" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "名称:" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "添加列" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "自定义列:" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "预览" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "R" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption msgid "C&heck free space" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption msgid "Cop&y attributes" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption msgid "Copy o&wnership" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption msgid "Copy d&ate/time" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption msgid "Correct lin&ks" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "丢弃只读标志" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption msgid "E&xclude empty directories" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption msgid "Fo&llow links" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "" #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption msgid "When dir&ectory exists" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption msgid "When ca&nnot set property" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "" #: tfrmabout.btnclose.caption msgctxt "TFRMABOUT.BTNCLOSE.CAPTION" msgid "&Close" msgstr "关闭(&C)" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "关于" #: tfrmabout.lblbuild.caption msgid "Build" msgstr "构建" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "Free Pascal" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "主页:" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "http://doublecmd.sourceforge.net" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "Lazarus" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "修订本" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption msgid "Version" msgstr "版本" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "确定(&O)" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "" #: tfrmattributesedit.cbarchive.caption msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "" #: tfrmattributesedit.cbcompressed.caption msgid "Co&mpressed" msgstr "" #: tfrmattributesedit.cbdirectory.caption #, fuzzy #| msgid "Directory" msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "目录" #: tfrmattributesedit.cbencrypted.caption msgid "&Encrypted" msgstr "" #: tfrmattributesedit.cbhidden.caption msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "" #: tfrmattributesedit.cbreadonly.caption msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmattributesedit.cbsparse.caption msgid "S&parse" msgstr "" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "固定" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmattributesedit.cbsymlink.caption msgid "&Symlink" msgstr "" #: tfrmattributesedit.cbsystem.caption msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "" #: tfrmattributesedit.cbtemporary.caption msgid "&Temporary" msgstr "" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "组" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "其他" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "所有者" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "执行" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "读" #: tfrmattributesedit.lbltextattrs.caption msgid "As te&xt:" msgstr "" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "写" #: tfrmchecksumcalc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "确定(&O)" #: tfrmchecksumcalc.caption msgctxt "tfrmchecksumcalc.caption" msgid "Calculate check sum..." msgstr "产生校验..." #: tfrmchecksumcalc.cbseparatefile.caption #, fuzzy #| msgid "Create separate checksum file for each file" msgid "C&reate separate checksum file for each file" msgstr "为每个文件分别创建MD5/SHA1文件" #: tfrmchecksumcalc.lblsaveto.caption #, fuzzy #| msgid "Save check sum file(s) to:" msgid "&Save check sum file(s) to:" msgstr "保存校验数据到文件:" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "关闭(&C)" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "验证校验..." #: tfrmconnectionmanager.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "添加" #: tfrmconnectionmanager.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消" #: tfrmconnectionmanager.btnconnect.caption msgid "C&onnect" msgstr "" #: tfrmconnectionmanager.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "删除" #: tfrmconnectionmanager.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "编辑" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "" #: tfrmcopydlg.btnaddtoqueue.caption msgid "A&dd To Queue" msgstr "" #: tfrmcopydlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "tfrmcopydlg.btncreatespecialqueue.caption" msgid "..." msgstr "..." #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "" #: tfrmcopydlg.btnsaveoptions.caption msgid "Sa&ve these options as default" msgstr "" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "复制文件" #: tfrmdescredit.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "确定(&O)" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "文件/文件夹注释" #: tfrmdescredit.lbleditcommentfor.caption #, fuzzy #| msgid "Edit comment for:" msgid "E&dit comment for:" msgstr "编辑注释:" #: tfrmdescredit.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "编码:" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "关于" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "取消" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "取消" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "复制" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "剪切" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "删除" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "粘贴" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "重做" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "撤销" #: tfrmdiffer.actexit.caption #, fuzzy #| msgid "Exit" msgctxt "tfrmdiffer.actexit.caption" msgid "E&xit" msgstr "退出" #: tfrmdiffer.actfirstdifference.caption msgctxt "tfrmdiffer.actfirstdifference.caption" msgid "First Difference" msgstr "" #: tfrmdiffer.actfirstdifference.hint msgctxt "tfrmdiffer.actfirstdifference.hint" msgid "First Difference" msgstr "" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "" #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "" #: tfrmdiffer.actlastdifference.caption msgctxt "tfrmdiffer.actlastdifference.caption" msgid "Last Difference" msgstr "" #: tfrmdiffer.actlastdifference.hint msgctxt "tfrmdiffer.actlastdifference.hint" msgid "Last Difference" msgstr "" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "" #: tfrmdiffer.actnextdifference.caption msgctxt "tfrmdiffer.actnextdifference.caption" msgid "Next Difference" msgstr "" #: tfrmdiffer.actnextdifference.hint msgctxt "tfrmdiffer.actnextdifference.hint" msgid "Next Difference" msgstr "" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "" #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "" #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "" #: tfrmdiffer.actprevdifference.caption msgctxt "tfrmdiffer.actprevdifference.caption" msgid "Previous Difference" msgstr "" #: tfrmdiffer.actprevdifference.hint msgctxt "tfrmdiffer.actprevdifference.hint" msgid "Previous Difference" msgstr "" #: tfrmdiffer.actreload.caption msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "" #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "" #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "" #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "" #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "" #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "" #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "" #: tfrmdiffer.caption msgctxt "TFRMDIFFER.CAPTION" msgid "Compare files" msgstr "比较文件" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miencodingleft.caption msgid "&Left" msgstr "" #: tfrmdiffer.miencodingright.caption msgid "&Right" msgstr "" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "" #: tfrmdiffer.mnuedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "编辑" #: tfrmdiffer.mnuencoding.caption msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "" #: tfrmdiffer.mnufile.caption #, fuzzy #| msgid "File" msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "文件" #: tfrmdiffer.mnuoptions.caption #, fuzzy #| msgid "Options" msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "选项" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "" #: tfrmedithotkey.btncancel.caption msgctxt "TFRMEDITHOTKEY.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消(&C)" #: tfrmedithotkey.btnok.caption msgctxt "TFRMEDITHOTKEY.BTNOK.CAPTION" msgid "&OK" msgstr "确定(&O)" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "" #: tfrmedithotkey.cghkcontrols.caption msgctxt "tfrmedithotkey.cghkcontrols.caption" msgid "Only for these controls" msgstr "" #: tfrmedithotkey.lblparameters.caption msgid "&Parameters (each in a separate line):" msgstr "" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "关于" #: tfrmeditor.actabout.hint msgctxt "tfrmeditor.actabout.hint" msgid "About" msgstr "关于" #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "配置(&C)" #: tfrmeditor.actconfhigh.hint msgctxt "tfrmeditor.actconfhigh.hint" msgid "Configuration" msgstr "配置" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "复制" #: tfrmeditor.acteditcopy.hint msgctxt "tfrmeditor.acteditcopy.hint" msgid "Copy" msgstr "复制" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "剪切" #: tfrmeditor.acteditcut.hint msgctxt "tfrmeditor.acteditcut.hint" msgid "Cut" msgstr "剪切" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "删除" #: tfrmeditor.acteditdelete.hint msgctxt "tfrmeditor.acteditdelete.hint" msgid "Delete" msgstr "删除" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "查找(&F)" #: tfrmeditor.acteditfind.hint msgctxt "tfrmeditor.acteditfind.hint" msgid "Find" msgstr "查找" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "查找下一个" #: tfrmeditor.acteditfindnext.hint msgctxt "tfrmeditor.acteditfindnext.hint" msgid "Find next" msgstr "查找下一个" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcr.hint msgctxt "tfrmeditor.acteditlineendcr.hint" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "tfrmeditor.acteditlineendcrlf.hint" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditlineendlf.hint msgctxt "tfrmeditor.acteditlineendlf.hint" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "粘贴" #: tfrmeditor.acteditpaste.hint msgctxt "tfrmeditor.acteditpaste.hint" msgid "Paste" msgstr "粘贴" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "重做" #: tfrmeditor.acteditredo.hint msgctxt "tfrmeditor.acteditredo.hint" msgid "Redo" msgstr "重做" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "替换(&R)" #: tfrmeditor.acteditrplc.hint msgctxt "tfrmeditor.acteditrplc.hint" msgid "Replace" msgstr "替换" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "取消(&A)" #: tfrmeditor.acteditselectall.hint msgctxt "tfrmeditor.acteditselectall.hint" msgid "Select All" msgstr "全选" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "撤销" #: tfrmeditor.acteditundo.hint msgctxt "tfrmeditor.acteditundo.hint" msgid "Undo" msgstr "撤销" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "关闭(&C)" #: tfrmeditor.actfileclose.hint msgctxt "tfrmeditor.actfileclose.hint" msgid "Close" msgstr "关闭" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "退出(&X)" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "新建(&N)" #: tfrmeditor.actfilenew.hint msgctxt "tfrmeditor.actfilenew.hint" msgid "New" msgstr "" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "打开(&O)" #: tfrmeditor.actfileopen.hint msgctxt "tfrmeditor.actfileopen.hint" msgid "Open" msgstr "打开" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "保存(&S)" #: tfrmeditor.actfilesave.hint msgctxt "tfrmeditor.actfilesave.hint" msgid "Save" msgstr "" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "另存为(A)..." #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "全部保存(&V)" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "" #: tfrmeditor.caption msgctxt "tfrmeditor.caption" msgid "Editor" msgstr "编辑器" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "帮助(&H)" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "编辑(&E)" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "编码(&C)" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "文件(&F)" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "语法高亮" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n5.caption msgctxt "TFRMEDITOR.N5.CAPTION" msgid "-" msgstr "-" #: tfrmeditsearchreplace.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "确定(&O)" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "大小写敏感(&A)" #: tfrmeditsearchreplace.cbsearchfromcursor.caption #, fuzzy #| msgid "Search from &caret" msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "从托字符找起(&C)" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "正则表达式(&R)" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "仅选择文本(&T)" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "仅整个词(&W)" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "选项" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "替换(&R):" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "查找(&S):" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "方向" #: tfrmextractdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消" #: tfrmextractdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "帮助" #: tfrmextractdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "确定" #: tfrmextractdlg.caption msgctxt "TFRMEXTRACTDLG.CAPTION" msgid "Unpack files" msgstr "打包文件" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "如果目录包含文件就解包文件路径" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*.*" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "解包每个文件到子目录(名称用包文件名)" #: tfrmextractdlg.cboverwrite.caption #, fuzzy #| msgid "&Overwrite existing files" msgid "O&verwrite existing files" msgstr "覆盖已存在文件(&O)" #: tfrmextractdlg.lblextractto.caption #, fuzzy #| msgid "To the directory:" msgid "To the &directory:" msgstr "解包到" #: tfrmextractdlg.lblfilemask.caption #, fuzzy #| msgid "Extract files matching file mask:" msgid "&Extract files matching file mask:" msgstr "解包(&F)" #: tfrmextractdlg.lblpassword.caption msgid "&Password for encrypted files:" msgstr "" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "添加" #: tfrmfileassoc.btnaddext.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "添加" #: tfrmfileassoc.btnaddnewtype.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "添加" #: tfrmfileassoc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消" #: tfrmfileassoc.btndownact.caption #, fuzzy #| msgid "Down" msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "向下" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "确定(&O)" #: tfrmfileassoc.btnremoveact.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "移除" #: tfrmfileassoc.btnremoveext.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "移除" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "" #: tfrmfileassoc.btnremovetype.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "移除" #: tfrmfileassoc.btnrenametype.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "改名" #: tfrmfileassoc.btnupact.caption #, fuzzy #| msgid "Up" msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "向上" #: tfrmfileassoc.caption msgid "File associations" msgstr "文件关联" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "动作" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "扩展名" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "文件类型" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "图标" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "动作:" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "命令(&C)" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "编辑" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "编辑器中编辑" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "文件名" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "文件路径" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "完整路径" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "从命令行获得输出" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "打开" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "在终端运行" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "在VFS中打开" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "视图" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "在查看器中打开" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "关闭(&C)" #: tfrmfileexecuteyourself.caption msgctxt "TFRMFILEEXECUTEYOURSELF.CAPTION" msgid "Wait..." msgstr "" #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "从:" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "" #: tfrmfileop.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "从:" #: tfrmfileop.lblto.caption msgid "To:" msgstr "到" #: tfrmfileproperties.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "关闭" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "" #: tfrmfileproperties.caption msgctxt "TFRMFILEPROPERTIES.CAPTION" msgid "Properties" msgstr "属性" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "固定" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "所有者" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "组" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "其他" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "所有者" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmfileproperties.lblattrtextstr.caption #, fuzzy #| msgid "Representation in text:" msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "文本中再现:" #: tfrmfileproperties.lblcontains.caption msgctxt "tfrmfileproperties.lblcontains.caption" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "执行" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "文件名" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "名称:" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "文件名" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "路径:" #: tfrmfileproperties.lblgroupstr.caption #, fuzzy #| msgid "Group" msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "组" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "上次访问:" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "上次修改:" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "上次修改状态:" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "八进制:" #: tfrmfileproperties.lblownerstr.caption #, fuzzy #| msgid "Owner" msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "所有者" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "读" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "大小:" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption #, fuzzy #| msgid "Symlink:" msgid "Symlink to:" msgstr "符号链接:" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption #, fuzzy msgid "Type:" msgstr "类型:" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "写" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "属性" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "属性" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "添加" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "帮助(&H)" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "关闭(&C)" #: tfrmfinddlg.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmfinddlg.btnedit.caption" msgid "&Edit" msgstr "编辑" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "转到文件(&G)" #: tfrmfinddlg.btnlastsearch.caption msgctxt "tfrmfinddlg.btnlastsearch.caption" msgid "&Last search" msgstr "" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "搜索(&N)" #: tfrmfinddlg.btnsavetemplate.caption msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "保存(&S)" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "删除(&D)" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "载入(&O)" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "保存(&A)" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption msgid "Sa&ve with \"Start in directory\"" msgstr "" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "" #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "开始(&S)" #: tfrmfinddlg.btnstop.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "取消" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "视图(&V)" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "发给列表框(&L)" #: tfrmfinddlg.caption msgctxt "tfrmfinddlg.caption" msgid "Find files" msgstr "查找文件" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "区分大小写" #: tfrmfinddlg.cbdatefrom.caption #, fuzzy #| msgid "Date From:" msgid "&Date from:" msgstr "开始日期:" #: tfrmfinddlg.cbdateto.caption #, fuzzy #| msgid "Date To:" msgid "Dat&e to:" msgstr "结束日期:" #: tfrmfinddlg.cbfilesizefrom.caption #, fuzzy #| msgid "Size from:" msgid "S&ize from:" msgstr "最小:" #: tfrmfinddlg.cbfilesizeto.caption #, fuzzy #| msgid "Size to:" msgid "Si&ze to:" msgstr "最大:" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "在文件中查找" #: tfrmfinddlg.cbfollowsymlinks.caption msgctxt "tfrmfinddlg.cbfollowsymlinks.caption" msgid "Follow s&ymlinks" msgstr "" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "查找不包含这些文本的文件" #: tfrmfinddlg.cbnotolderthan.caption #, fuzzy #| msgid "Not older than:" msgid "N&ot older than:" msgstr "不早于:" #: tfrmfinddlg.cbpartialnamesearch.caption msgid "Searc&h for part of file name" msgstr "" #: tfrmfinddlg.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "正则表达式(&R)" #: tfrmfinddlg.cbreplacetext.caption #, fuzzy #| msgid "Re&place text" msgid "Re&place by" msgstr "替换文本" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "" #: tfrmfinddlg.cbtimefrom.caption #, fuzzy #| msgid "Time from:" msgid "&Time from:" msgstr "开始时间:" #: tfrmfinddlg.cbtimeto.caption #, fuzzy #| msgid "Time to:" msgid "Ti&me to:" msgstr "结束时间" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "使用搜索插件:" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption msgctxt "tfrmfinddlg.gbdirectories.caption" msgid "Directories" msgstr "" #: tfrmfinddlg.gbfiles.caption msgctxt "tfrmfinddlg.gbfiles.caption" msgid "Files" msgstr "" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "查找数据" #: tfrmfinddlg.lblattributes.caption msgid "Attri&butes" msgstr "" #: tfrmfinddlg.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "编码:" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "文件名掩码" #: tfrmfinddlg.lblfindpathstart.caption #, fuzzy #| msgid "&Start in directory" msgid "Start in &directory" msgstr "文件所在目录" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "搜索子目录:" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "最近搜索(&P):" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "查看" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "高级" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "载入/保存" #: tfrmfinddlg.tsplugins.caption msgctxt "tfrmfinddlg.tsplugins.caption" msgid "Plugins" msgstr "插件" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "标准" #: tfrmfindview.btnclose.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "取消" #: tfrmfindview.btnfind.caption #, fuzzy #| msgid "Find" msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "查找" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "查找" #: tfrmfindview.cbcasesens.caption msgid "C&ase sensitive" msgstr "" #: tfrmhardlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "确定(&O)" #: tfrmhardlink.caption #, fuzzy #| msgid "Create hardlink" msgid "Create hard link" msgstr "创建硬链接" #: tfrmhardlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "目标已存在(链接点所在)" #: tfrmhardlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "链接名" #: tfrmhotdir.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "添加" #: tfrmhotdir.btnaddman.caption #, fuzzy #| msgid "Add manually" msgid "Add &manually" msgstr "手动添加" #: tfrmhotdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消" #: tfrmhotdir.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "删除" #: tfrmhotdir.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "编辑" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "确定(&O)" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "常用目录列表" #: tfrmlinker.btnexit.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "退出" #: tfrmlinker.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "确定" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "..." #: tfrmlinker.caption msgctxt "TFRMLINKER.CAPTION" msgid "Linker" msgstr "链接程序" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "保存到..." #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "条目" #: tfrmlinker.lblfilename.caption #, fuzzy #| msgid "File name" msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "文件名" #: tfrmlinker.spbtndel.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "删除" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "删除" #: tfrmlinker.spbtndown.caption #, fuzzy #| msgid "Down" msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "下" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "下" #: tfrmlinker.spbtnup.caption #, fuzzy #| msgid "Up" msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "上" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "上" #: tfrmmain.actabout.caption #, fuzzy #| msgid "About" msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "关于" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "添加文件名到命令行" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "添加路径和文件名到命令行" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "复制路径到命令行" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "" #: tfrmmain.actcalculatespace.caption #, fuzzy #| msgid "Calculate &Occupied Space..." msgid "Calculate &Occupied Space" msgstr "计算已用空间..." #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "切换目录" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "切换到根目录" #: tfrmmain.actchecksumcalc.caption #, fuzzy #| msgid "Calculate check sum..." msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "产生校验..." #: tfrmmain.actchecksumverify.caption #, fuzzy #| msgid "Verify check sum..." msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "验证校验..." #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "清除日志文件" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "清除日志窗口" #: tfrmmain.actclosealltabs.caption #, fuzzy #| msgid "Remove &All Tabs" msgctxt "tfrmmain.actclosealltabs.caption" msgid "Close &All Tabs" msgstr "移除所有标签" #: tfrmmain.actclosetab.caption #, fuzzy #| msgid "&Remove Tab" msgctxt "tfrmmain.actclosetab.caption" msgid "&Close Tab" msgstr "删除标签页" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "比较内容" #: tfrmmain.actcomparedirectories.caption msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.CAPTION" msgid "Compare Directories" msgstr "" #: tfrmmain.actcomparedirectories.hint msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.HINT" msgid "Compare Directories" msgstr "" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "上下文菜单" #: tfrmmain.actcopy.caption #, fuzzy #| msgid "Copy" msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "复制" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "复制包含完整路径的文件名" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "复制文件名到剪贴板" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "复制到同面板下" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "复制" #: tfrmmain.actcountdircontent.caption #, fuzzy #| msgid "Sho&w occupied space" msgid "Sho&w Occupied Space" msgstr "显示文件夹容量(&W)" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "剪切" #: tfrmmain.actdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMMAIN.ACTDELETE.CAPTION" msgid "Delete" msgstr "删除" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "历史浏览目录" #: tfrmmain.actdirhotlist.caption #, fuzzy #| msgid "Directory &hotlist" msgid "Directory &Hotlist" msgstr "常用目录列表" #: tfrmmain.actedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "编辑" #: tfrmmain.acteditcomment.caption #, fuzzy #| msgid "Edit comment..." msgid "Edit Co&mment..." msgstr "编辑注释..." #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "编辑新文件" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "交换面板(&P)" #: tfrmmain.actexit.caption #, fuzzy #| msgid "Exit" msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "退出" #: tfrmmain.actextractfiles.caption #, fuzzy #| msgid "Extract files..." msgid "&Extract Files..." msgstr "解压缩文件" #: tfrmmain.actfileassoc.caption #, fuzzy #| msgid "File &associations..." msgid "File &Associations..." msgstr "文件关联..." #: tfrmmain.actfilelinker.caption #, fuzzy #| msgid "Link files" msgid "Com&bine Files..." msgstr "链接文件" #: tfrmmain.actfileproperties.caption #, fuzzy #| msgid "Show file properties" msgid "Show &File Properties" msgstr "显示文件属性" #: tfrmmain.actfilespliter.caption #, fuzzy #| msgid "Split file" msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "分割文件" #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "转到命令行" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "" #: tfrmmain.acthardlink.caption #, fuzzy #| msgid "Create hard link..." msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "创建硬链接" #: tfrmmain.acthelpindex.caption #, fuzzy #| msgid "Contents" msgid "&Contents" msgstr "内容" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "" #: tfrmmain.actkeyboard.caption #, fuzzy #| msgid "Keyboard" msgid "&Keyboard" msgstr "热键列表" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "左 &= 右" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "左驱动器列表" #: tfrmmain.actloadselectionfromclip.caption msgid "Load Selection from Clip&board" msgstr "" #: tfrmmain.actloadselectionfromfile.caption msgid "&Load Selection from File..." msgstr "" #: tfrmmain.actmakedir.caption #, fuzzy #| msgid "MakeDir" msgid "MakeDir" msgstr "创建目录" #: tfrmmain.actmarkcurrentextension.caption #, fuzzy #| msgid "Select all with same extension" msgid "Select All with the Same E&xtension" msgstr "选择所有相同扩展" #: tfrmmain.actmarkinvert.caption #, fuzzy #| msgid "Invert Selections" msgid "&Invert Selection" msgstr "反向选择" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "全部选中(&S)" #: tfrmmain.actmarkminus.caption #, fuzzy #| msgid "Unselect a group" msgid "Unselect a Gro&up..." msgstr "取消选择组" #: tfrmmain.actmarkplus.caption #, fuzzy #| msgid "Select a group" msgid "Select a &Group..." msgstr "选择一组" #: tfrmmain.actmarkunmarkall.caption #, fuzzy #| msgid "Unselect All" msgid "&Unselect All" msgstr "全部不选" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "最小化窗口" #: tfrmmain.actmultirename.caption #, fuzzy #| msgid "Multi Rename Tool" msgid "Multi &Rename Tool" msgstr "多文件改名工具" #: tfrmmain.actnetworkconnect.caption msgid "Network &Connect..." msgstr "" #: tfrmmain.actnetworkdisconnect.caption msgid "Network &Disconnect" msgstr "" #: tfrmmain.actnetworkquickconnect.caption msgid "Network &Quick Connect..." msgstr "" #: tfrmmain.actnewtab.caption #, fuzzy #| msgid "&New tab" msgid "&New Tab" msgstr "新建标签页" #: tfrmmain.actnexttab.caption #, fuzzy #| msgid "Switch to nex&t tab" msgid "Switch to Nex&t Tab" msgstr "切换到下一标签" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "打开" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "尝试打开归档" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "" #: tfrmmain.actopendirinnewtab.caption #, fuzzy #| msgid "Open &folder in new tab" msgid "Open &Folder in a New Tab" msgstr "新标签页打开文件夹" #: tfrmmain.actopenvirtualfilesystemlist.caption #, fuzzy #| msgid "Open VFS List" msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "打开VFS列表" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "" #: tfrmmain.actoptions.caption #, fuzzy #| msgid "Options..." msgid "&Options..." msgstr "选项..." #: tfrmmain.actpackfiles.caption #, fuzzy #| msgid "Pack files..." msgid "&Pack Files..." msgstr "打包文件" #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "设置分隔符位置" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "粘贴" #: tfrmmain.actprevtab.caption #, fuzzy #| msgid "Switch to &previous tab" msgid "Switch to &Previous Tab" msgstr "切换到上一标签" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "快速搜索" #: tfrmmain.actquickview.caption msgid "&Quick View Panel" msgstr "" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "刷新(&R)" #: tfrmmain.actrename.caption #, fuzzy #| msgid "Move" msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "改名" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "改名" #: tfrmmain.actrenametab.caption msgid "&Rename Tab" msgstr "" #: tfrmmain.actrestoreselection.caption msgid "&Restore Selection" msgstr "" #: tfrmmain.actreverseorder.caption #, fuzzy #| msgid "Reverse order" msgid "Re&verse Order" msgstr "反序排列" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "右 &= 左" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "右驱动器列表" #: tfrmmain.actrunterm.caption #, fuzzy #| msgid "Run Term" msgid "Run &Terminal" msgstr "运行终端" #: tfrmmain.actsaveselection.caption msgid "Sa&ve Selection" msgstr "" #: tfrmmain.actsaveselectiontofile.caption msgid "Save S&election to File..." msgstr "" #: tfrmmain.actsearch.caption #, fuzzy #| msgid "&Search" msgid "&Search..." msgstr "搜索(&S)" #: tfrmmain.actsetfileproperties.caption msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "" #: tfrmmain.actsettaboptiondirsinnewtab.caption msgid "Locked with Directories Opened in New &Tabs" msgstr "" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "" #: tfrmmain.actsettaboptionpathresets.caption #, fuzzy #| msgid "Locked, but &directory changes allowed" msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "锁定,但目录允许修改" #: tfrmmain.actshellexecute.caption msgctxt "tfrmmain.actshellexecute.caption" msgid "Open" msgstr "打开" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "显示底部按钮" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "显示历史命令" #: tfrmmain.actshowmainmenu.caption #, fuzzy #| msgid "Menu" msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "菜单" #: tfrmmain.actshowsysfiles.caption #, fuzzy #| msgid "Show hidden/system files" msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "显示隐藏/系统文件" #: tfrmmain.actsortbyattr.caption #, fuzzy #| msgid "Sort by attrib" msgid "Sort by &Attributes" msgstr "属性" #: tfrmmain.actsortbydate.caption #, fuzzy #| msgid "Sort by date" msgid "Sort by &Date" msgstr "按日期" #: tfrmmain.actsortbyext.caption #, fuzzy #| msgid "Sort by extension" msgid "Sort by &Extension" msgstr "按扩展名" #: tfrmmain.actsortbyname.caption #, fuzzy #| msgid "Sort by name" msgid "Sort by &Name" msgstr "按文件名" #: tfrmmain.actsortbysize.caption #, fuzzy #| msgid "Sort by size" msgid "Sort by &Size" msgstr "按大小" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "" #: tfrmmain.actsymlink.caption #, fuzzy #| msgid "Create symbolic link..." msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "创建符号链接" #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "目标 &= 源" #: tfrmmain.acttestarchive.caption msgid "&Test Archive(s)" msgstr "" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "传输当前行到左窗口" #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "传输当前行到右窗口" #: tfrmmain.actunmarkcurrentextension.caption #, fuzzy #| msgid "Unselect all with same extension" msgid "Unselect All with the Same Ex&tension" msgstr "取消选择所有相同扩展" #: tfrmmain.actview.caption #, fuzzy #| msgid "View" msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "查看" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "" #: tfrmmain.actvisithomepage.caption #, fuzzy #| msgid "&Visit Double Commander Web Site" msgid "&Visit Double Commander Website" msgstr "访问 Double Commander 网站" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "擦去" #: tfrmmain.btnf10.caption msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "" #: tfrmmain.btnf8.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMMAIN.BTNF8.CAPTION" msgid "Delete" msgstr "删除" #: tfrmmain.btnf9.caption #, fuzzy #| msgid "Terminal" msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "终端" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint msgid "Directory hotlist" msgstr "常用目录列表" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnlefthome.hint msgid "Go to home directory" msgstr "转到用户主目录" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgid "Go to root directory" msgstr "转到根目录" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgid "Go to parent directory" msgstr "转到父目录" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr "" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "tfrmmain.caption" msgid "Double Commander" msgstr "Double Commander" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "路径" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "&20/80" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "&30/70" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "&40/60" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "&50/50" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "&60/40" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "&70/30" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "&80/20" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "取消" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "Copy..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "创建硬链接" #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline33.caption msgctxt "tfrmmain.miline33.caption" msgid "-" msgstr "-" #: tfrmmain.miline37.caption msgctxt "TFRMMAIN.MILINE37.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "-" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "清除" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "复制" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "隐藏" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "全选" #: tfrmmain.mimove.caption msgid "Move..." msgstr "移动..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "创建符号链接" #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "" #: tfrmmain.mitrayiconexit.caption #, fuzzy #| msgid "Exit" msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "退出" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "还原" #: tfrmmain.mnualloperpause.caption msgctxt "tfrmmain.mnualloperpause.caption" msgid "||" msgstr "" #: tfrmmain.mnualloperstart.caption msgctxt "tfrmmain.mnualloperstart.caption" msgid "Start" msgstr "" #: tfrmmain.mnualloperstop.caption msgctxt "tfrmmain.mnualloperstop.caption" msgid "Cancel" msgstr "取消" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "命令(&C)" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "配置(&O)" #: tfrmmain.mnufiles.caption #, fuzzy #| msgid "Files" msgid "&Files" msgstr "文件(&F)" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "帮助(&H)" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "标记(&M)" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "显示(&S)" #: tfrmmain.mnutaboptions.caption #, fuzzy #| msgid "Options" msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "选项" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "标签(&T)" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "复制" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "剪切" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "删除" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "编辑" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "粘贴" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmmaskinputdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消" #: tfrmmaskinputdlg.btndefinetemplate.caption msgid "&Define..." msgstr "" #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "确定(&O)" #: tfrmmaskinputdlg.lblsearchtemplate.caption msgid "O&r select predefined selection type:" msgstr "" #: tfrmmkdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "确定(&O)" #: tfrmmkdir.caption msgid "Create new directory" msgstr "创建新目录" #: tfrmmkdir.lblmakedir.caption #, fuzzy #| msgid "Input new directory name:" msgid "&Input new directory name:" msgstr "熟路新目录名:" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "" #: tfrmmodview.caption msgctxt "TFRMMODVIEW.CAPTION" msgid "New Size" msgstr "" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgctxt "tfrmmodview.lblpath2.caption" msgid "2" msgstr "" #: tfrmmodview.lblpath3.caption msgctxt "tfrmmodview.lblpath3.caption" msgid "3" msgstr "" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "" #: tfrmmodview.teheight.text msgid "Height" msgstr "" #: tfrmmodview.tequality.text msgid "80" msgstr "" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "宽度" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "关闭(&C)" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "删除(&D)" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "" #: tfrmmultirename.btnrestore.caption #, fuzzy #| msgid "Reset all" msgid "Reset &all" msgstr "全部回滚" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "保存(&S)" #: tfrmmultirename.caption msgctxt "tfrmmultirename.caption" msgid "MultiRename" msgstr "多文件改名" #: tfrmmultirename.cblog.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "日志" #: tfrmmultirename.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "正则表达式(&R)" #: tfrmmultirename.cbusesubs.caption #, fuzzy #| msgid "Use substitution" msgid "&Use substitution" msgstr "使用替代" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption #, fuzzy #| msgid "[E]xtension" msgid "[E] Extension" msgstr "[E]xtension" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "数量" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "查找 && 替换" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "记录结果" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "掩码" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "" #: tfrmmultirename.lbext.caption #, fuzzy #| msgid "Extension" msgid "&Extension" msgstr "扩展名" #: tfrmmultirename.lbfind.caption #, fuzzy #| msgid "Find..." msgid "&Find..." msgstr "查找..." #: tfrmmultirename.lbinterval.caption #, fuzzy #| msgid "Interval" msgid "&Interval" msgstr "间隔" #: tfrmmultirename.lbname.caption #, fuzzy #| msgid "File Name" msgid "File &Name" msgstr "文件主名" #: tfrmmultirename.lbreplace.caption #, fuzzy #| msgid "Replace..." msgid "Re&place..." msgstr "替换..." #: tfrmmultirename.lbstnb.caption #, fuzzy #| msgid "Start Number" msgid "S&tart Number" msgstr "起始数" #: tfrmmultirename.lbwidth.caption #, fuzzy #| msgid "Width" msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "宽度" #: tfrmmultirename.micounter.caption #, fuzzy #| msgid "[C]ounter" msgid "[C] Counter" msgstr "[C]ounter" #: tfrmmultirename.miday.caption #, fuzzy #| msgid "[D]ay" msgid "[D] Day" msgstr "[D]ay" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "" #: tfrmmultirename.miextensionx.caption #, fuzzy #| msgid "[Ex]xtension" msgid "[Ex] Character at position x" msgstr "[Ex]xtension" #: tfrmmultirename.miextensionxx.caption #, fuzzy #| msgid "[Ex:x]xtension" msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:x]xtension" #: tfrmmultirename.mihour.caption #, fuzzy #| msgid "[h]our" msgid "[h] Hour" msgstr "[H]our" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "" #: tfrmmultirename.miminute.caption #, fuzzy #| msgid "Mi[n]ute" msgid "[n] Minute" msgstr "[Mi]nute" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "" #: tfrmmultirename.mimonth.caption #, fuzzy #| msgid "[M]onth" msgid "[M] Month" msgstr "[Mo]nth" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "" #: tfrmmultirename.mimonth3.caption msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "" #: tfrmmultirename.miname.caption #, fuzzy #| msgid "[N]ame" msgid "[N] Name" msgstr "[N]ame" #: tfrmmultirename.minamex.caption #, fuzzy #| msgid "[Nx]ame" msgid "[Nx] Character at position x" msgstr "[Nx]ame" #: tfrmmultirename.minamexx.caption #, fuzzy #| msgid "[Nx:x]ame" msgid "[Nx:y] Characters from position x to y" msgstr "[Nx:x]ame" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "时间..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "扩展名..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "名称..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "" #: tfrmmultirename.misecond.caption #, fuzzy #| msgid "[s]econd" msgid "[s] Second" msgstr "[S]econd" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "" #: tfrmmultirename.miyear.caption #, fuzzy #| msgid "[Y] Year" msgid "[Y] Year (2 digits)" msgstr "[Y]ear" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "tfrmmultirename.stringgrid.columns[0].title.caption" msgid "Old File Name" msgstr "" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "tfrmmultirename.stringgrid.columns[1].title.caption" msgid "New File Name" msgstr "" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "tfrmmultirename.stringgrid.columns[2].title.caption" msgid "File Path" msgstr "文件路径" #: tfrmopenwith.caption msgid "Choose an application" msgstr "" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "" #: tfrmoptions.btnapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "应用" #: tfrmoptions.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "确定(&O)" #: tfrmoptions.caption msgctxt "tfrmoptions.caption" msgid "Options" msgstr "选项" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "" #: tfrmoptionsarchivers.btnautoconfig.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNAUTOCONFIG.CAPTION" msgid "A&uto Configure" msgstr "" #: tfrmoptionsarchivers.btnmultiarcadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCADD.CAPTION" msgid "A&dd" msgstr "添加" #: tfrmoptionsarchivers.btnmultiarcapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCAPPLY.CAPTION" msgid "A&pply" msgstr "应用" #: tfrmoptionsarchivers.btnmultiarcdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCDELETE.CAPTION" msgid "D&elete" msgstr "删除" #: tfrmoptionsarchivers.btnmultiarcrename.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCRENAME.CAPTION" msgid "&Rename" msgstr "改名" #: tfrmoptionsarchivers.chkmultiarcdebug.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCDEBUG.CAPTION" msgid "De&bug mode" msgstr "" #: tfrmoptionsarchivers.chkmultiarcenabled.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCENABLED.CAPTION" msgid "E&nabled" msgstr "" #: tfrmoptionsarchivers.chkmultiarcoutput.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCOUTPUT.CAPTION" msgid "S&how console output" msgstr "" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "TFRMOPTIONSARCHIVERS.GBARCHIVEROPTIONS.CAPTION" msgid "Options" msgstr "选项" #: tfrmoptionsarchivers.lblarchiveadd.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEADD.CAPTION" msgid "Add&ing:" msgstr "" #: tfrmoptionsarchivers.lblarchiveextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTENSION.CAPTION" msgid "E&xtension:" msgstr "扩展名:" #: tfrmoptionsarchivers.lblarchiveextract.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTRACT.CAPTION" msgid "Ex&tract:" msgstr "" #: tfrmoptionsarchivers.lblarchivelist.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELIST.CAPTION" msgid "&List:" msgstr "" #: tfrmoptionsarchivers.lblarchivelistend.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTEND.CAPTION" msgid "Listing &finish (optional):" msgstr "" #: tfrmoptionsarchivers.lblarchivelistformat.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTFORMAT.CAPTION" msgid "Listing for&mat:" msgstr "" #: tfrmoptionsarchivers.lblarchiveliststart.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTSTART.CAPTION" msgid "Listin&g start (optional):" msgstr "" #: tfrmoptionsarchivers.lblarchiver.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVER.CAPTION" msgid "Arc&hiver:" msgstr "" #: tfrmoptionsarchivers.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMOPTIONSARCHIVERS.LBLDESCRIPTION.CAPTION" msgid "De&scription:" msgstr "注释:" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERADDITIONAL.CAPTION" msgid "Additional" msgstr "" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERGENERAL.CAPTION" msgid "General" msgstr "一般" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption #, fuzzy #| msgid "Also when &size, date, or attributes change" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHATTRIBUTESCHANGE.CAPTION" msgid "When &size, date or attributes change" msgstr "当大小、日期、其他属性修改时" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHEXCLUDEDIRS.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption #, fuzzy #| msgid "When files are &created, deleted or renamed" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHFILENAMECHANGE.CAPTION" msgid "When &files are created, deleted or renamed" msgstr "当文件创建、删除,改名时刷新(&C)" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption #, fuzzy #| msgid "Don't &react to updates while in the background" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHONLYFOREGROUND.CAPTION" msgid "When application is in the &background" msgstr "后台时不激活刷新" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHDISABLE.CAPTION" msgid "Disable auto-refresh" msgstr "" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHENABLE.CAPTION" msgid "Refresh file list" msgstr "" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption #, fuzzy #| msgid "Always show tray icon" msgctxt "TFRMOPTIONSBEHAVIOR.CBALWAYSSHOWTRAYICON.CAPTION" msgid "Al&ways show tray icon" msgstr "总是显示托盘图标" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption msgid "Automatically &hide unmounted devices" msgstr "" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBMINIMIZETOTRAY.CAPTION" msgid "Mo&ve icon to system tray when minimized" msgstr "最小化到系统栏图标(&V)" #: tfrmoptionsbehavior.cbonlyonce.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBONLYONCE.CAPTION" msgid "A&llow only one copy of DC at a time" msgstr "" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "" #: tfrmoptionsbehavior.lbldrivesblacklist.caption msgid "Drives &blacklist" msgstr "" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption #, fuzzy #| msgid "Cut text to column width" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBCUTTEXTTOCOLWIDTH.CAPTION" msgid "Cut &text to column width" msgstr "按列宽裁剪文本" #: tfrmoptionscolumnsview.cbgridhorzline.caption #, fuzzy #| msgid "Horizontal lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDHORZLINE.CAPTION" msgid "&Horizontal lines" msgstr "水平行" #: tfrmoptionscolumnsview.cbgridvertline.caption #, fuzzy #| msgid "Vertical lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDVERTLINE.CAPTION" msgid "&Vertical lines" msgstr "垂直列" #: tfrmoptionscolumnsview.chkautofillcolumns.caption msgctxt "TFRMOPTIONSCOLUMNSVIEW.CHKAUTOFILLCOLUMNS.CAPTION" msgid "A&uto fill columns" msgstr "" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "" #: tfrmoptionscolumnsview.lblautosizecolumn.caption msgctxt "TFRMOPTIONSCOLUMNSVIEW.LBLAUTOSIZECOLUMN.CAPTION" msgid "Auto si&ze column:" msgstr "" #: tfrmoptionsconfiguration.btnconfigapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGAPPLY.CAPTION" msgid "A&pply" msgstr "应用" #: tfrmoptionsconfiguration.btnconfigedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGEDIT.CAPTION" msgid "&Edit" msgstr "编辑" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption #, fuzzy #| msgid "Command line history" msgctxt "TFRMOPTIONSCONFIGURATION.CBCMDLINEHISTORY.CAPTION" msgid "Co&mmand line history" msgstr "命令行历史" #: tfrmoptionsconfiguration.cbdirhistory.caption #, fuzzy #| msgid "Directory history" msgctxt "TFRMOPTIONSCONFIGURATION.CBDIRHISTORY.CAPTION" msgid "&Directory history" msgstr "历史浏览目录" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption #, fuzzy #| msgid "File mask history" msgctxt "TFRMOPTIONSCONFIGURATION.CBFILEMASKHISTORY.CAPTION" msgid "&File mask history" msgstr "文件掩码历史" #: tfrmoptionsconfiguration.chksaveconfiguration.caption msgctxt "TFRMOPTIONSCONFIGURATION.CHKSAVECONFIGURATION.CAPTION" msgid "Sa&ve configuration" msgstr "" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption msgctxt "TFRMOPTIONSCONFIGURATION.CHKSEARCHREPLACEHISTORY.CAPTION" msgid "Searc&h/Replace history" msgstr "" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBLOCCONFIGFILES.CAPTION" msgid "Location of configuration files" msgstr "本地化配置文件" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBSAVEONEXIT.CAPTION" msgid "Save on exit" msgstr "保存并退出" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgctxt "TFRMOPTIONSCONFIGURATION.LBLCMDLINECONFIGDIR.CAPTION" msgid "Set on command line" msgstr "" #: tfrmoptionsconfiguration.rbprogramdir.caption #, fuzzy #| msgid "Program directory (portable version)" msgctxt "TFRMOPTIONSCONFIGURATION.RBPROGRAMDIR.CAPTION" msgid "P&rogram directory (portable version)" msgstr "程序目录(便携版)" #: tfrmoptionsconfiguration.rbuserhomedir.caption #, fuzzy #| msgid "User home directory" msgctxt "TFRMOPTIONSCONFIGURATION.RBUSERHOMEDIR.CAPTION" msgid "&User home directory" msgstr "用户主目录" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption #, fuzzy #| msgid "Copy" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNCOPYCOLUMNSSET.CAPTION" msgid "C&opy" msgstr "复制" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNDELCOLUMNSSET.CAPTION" msgid "&Delete" msgstr "删除" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNEDITCOLUMNSSET.CAPTION" msgid "&Edit" msgstr "编辑" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNNEWCOLUMNSSET.CAPTION" msgid "&New" msgstr "新建(&N)" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.CBBFILESYSTEM.TEXT" msgid "General" msgstr "一般" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption #, fuzzy #| msgid "Configure columns for file system:" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.LBLCONFIGCOLUMNS.CAPTION" msgid "Con&figure columns for file system:" msgstr "为文件系统配置列" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption msgid "&Show confirmation dialog after drop" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption msgid "Show &file system" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption msgid "Show fr&ee space" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption msgid "Show &label" msgstr "" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "" #: tfrmoptionseditorcolors.backgroundlabel.caption msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "" #: tfrmoptionseditorcolors.foregroundlabel.caption msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption msgid "&Text-mark" msgstr "" #: tfrmoptionseditorcolors.tbtnglobal.caption msgid "Use (and edit) &global scheme settings" msgstr "" #: tfrmoptionseditorcolors.tbtnlocal.caption msgid "Use &local scheme settings" msgstr "" #: tfrmoptionseditorcolors.textboldcheckbox.caption msgid "&Bold" msgstr "" #: tfrmoptionseditorcolors.textboldradioinvert.caption msgctxt "tfrmoptionseditorcolors.textboldradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textboldradiooff.caption msgctxt "tfrmoptionseditorcolors.textboldradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textboldradioon.caption msgctxt "tfrmoptionseditorcolors.textboldradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textitaliccheckbox.caption msgid "&Italic" msgstr "" #: tfrmoptionseditorcolors.textitalicradioinvert.caption msgctxt "tfrmoptionseditorcolors.textitalicradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textitalicradiooff.caption msgctxt "tfrmoptionseditorcolors.textitalicradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textitalicradioon.caption msgctxt "tfrmoptionseditorcolors.textitalicradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption msgid "&Strike Out" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption msgid "&Underline" msgstr "" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textunderlineradiooff.caption msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textunderlineradioon.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "" #: tfrmoptionsfileoperations.cbdeletetotrash.caption #, fuzzy #| msgid "Delete to recycle bin (Shift key reverses this setting)" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDELETETOTRASH.CAPTION" msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "&F8/Del 删除文件到回收站 (Shift=彻底删除)" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDROPREADONLYFLAG.CAPTION" msgid "D&rop readonly flag" msgstr "丢弃只读标志" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPARTIALNAMESEARCH.CAPTION" msgid "&Search for part of file name" msgstr "" #: tfrmoptionsfileoperations.cbprocesscomments.caption #, fuzzy #| msgid "Process comments with files/folders" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPROCESSCOMMENTS.CAPTION" msgid "&Process comments with files/folders" msgstr "文件/文件夹的注释一起处理" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption #, fuzzy #| msgid "Select file name without extension when renaming" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBRENAMESELONLYNAME.CAPTION" msgid "Select &file name without extension when renaming" msgstr "仅选择文件名然后改名(不包含扩展名)" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption #, fuzzy #| msgid "Show tab select panel in copy/move dialog" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSHOWCOPYTABSELECTPANEL.CAPTION" msgid "Sho&w tab select panel in copy/move dialog" msgstr "在复制/移动对话框显示标签页" #: tfrmoptionsfileoperations.cbskipfileoperror.caption #, fuzzy #| msgid "Skip file operations errors and write them to log window" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSKIPFILEOPERROR.CAPTION" msgid "S&kip file operations errors and write them to log window" msgstr "忽略文件操作错误,并记录到日志窗口" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.GBFILESEARCH.CAPTION" msgid "File search" msgstr "搜索文件" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "" #: tfrmoptionsfileoperations.lblbuffersize.caption msgid "&Buffer size for file operations (in KB):" msgstr "" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "" #: tfrmoptionsfileoperations.lblprogresskind.caption msgid "Show operations progress &initially in" msgstr "" #: tfrmoptionsfileoperations.lblwipepassnumber.caption #, fuzzy #| msgid "Number of wipe passes:" msgctxt "TFRMOPTIONSFILEOPERATIONS.LBLWIPEPASSNUMBER.CAPTION" msgid "&Number of wipe passes:" msgstr "擦去数:" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption #, fuzzy #| msgid "Use memory mapping for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSEMMAPINSEARCH.CAPTION" msgid "Use memory mapping for search te&xt in files" msgstr "使用内存映像搜索文本" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption #, fuzzy #| msgid "Use stream for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSESTREAMINSEARCH.CAPTION" msgid "&Use stream for search text in files" msgstr "使用流搜索文本" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEFRAMECURSOR.CAPTION" msgid "Use &Frame Cursor" msgstr "" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption msgid "Use &Gradient Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption #, fuzzy #| msgid "Use Inverted Selection" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEINVERTEDSELECTION.CAPTION" msgid "U&se Inverted Selection" msgstr "使用反选" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.DBFREESPACEINDICATOR.CAPTION" msgid "Drive Free Space Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.GBEXAMPLE.CAPTION" msgid "Example" msgstr "例如" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption #, fuzzy #| msgid "Background:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR.CAPTION" msgid "Bac&kground:" msgstr "背景色:" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption #, fuzzy #| msgid "Background 2:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR2.CAPTION" msgid "Backg&round 2:" msgstr "背景色2:" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption #, fuzzy #| msgid "Cursor Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORCOLOR.CAPTION" msgid "C&ursor Color:" msgstr "当前行背景颜色:" #: tfrmoptionsfilepanelscolors.lblcursortext.caption #, fuzzy #| msgid "Cursor Text:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORTEXT.CAPTION" msgid "Cursor Te&xt:" msgstr "当前行文本颜色:" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLINACTIVEPANELBRIGHTNESS.CAPTION" msgid "&Brightness level of inactive panel" msgstr "" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption msgid "In&dicator Back Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblindcolor.caption msgid "&Indicator Fore Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption #, fuzzy #| msgid "Mark Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLMARKCOLOR.CAPTION" msgid "&Mark Color:" msgstr "标记颜色:" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption #, fuzzy #| msgid "Text Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLTEXTCOLOR.CAPTION" msgid "T&ext Color:" msgstr "文本颜色:" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption msgid "Do&n't load file list until a tab is activated" msgstr "" #: tfrmoptionsfilesviews.cbdirbrackets.caption #, fuzzy #| msgid "Show square brackets around directories" msgctxt "TFRMOPTIONSFILESVIEWS.CBDIRBRACKETS.CAPTION" msgid "S&how square brackets around directories" msgstr "目录用方括号包含" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption msgid "Hi&ghlight new and updated files" msgstr "" #: tfrmoptionsfilesviews.cblistfilesinthread.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBLISTFILESINTHREAD.CAPTION" msgid "Load &file list in separate thread" msgstr "" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBLOADICONSSEPARATELY.CAPTION" msgid "Load icons af&ter file list" msgstr "" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption #, fuzzy #| msgid "Show system and hidden files" msgctxt "TFRMOPTIONSFILESVIEWS.CBSHOWSYSTEMFILES.CAPTION" msgid "Show s&ystem and hidden files" msgstr "显示隐藏/系统文件" #: tfrmoptionsfilesviews.cbspacemovesdown.caption #, fuzzy #| msgid "When selecting files with , move down to next file (as with )" msgctxt "TFRMOPTIONSFILESVIEWS.CBSPACEMOVESDOWN.CAPTION" msgid "&When selecting files with , move down to next file (as with )" msgstr "当用空格键 选文件时, 自动移动到下一文件 (相当于执行插入键)" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "" #: tfrmoptionsfilesviews.gbsorting.caption msgctxt "TFRMOPTIONSFILESVIEWS.GBSORTING.CAPTION" msgid "Sorting" msgstr "" #: tfrmoptionsfilesviews.lblcasesensitivity.caption msgid "Case s&ensitivity:" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeformat.caption #, fuzzy #| msgid "Date and time format:" msgctxt "TFRMOPTIONSFILESVIEWS.LBLDATETIMEFORMAT.CAPTION" msgid "&Date and time format:" msgstr "日期时间格式:" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "" #: tfrmoptionsfilesviews.lblnewfilesposition.caption msgid "&Insert new files" msgstr "" #: tfrmoptionsfilesviews.lblsortfoldermode.caption msgid "So&rting directories:" msgstr "" #: tfrmoptionsfilesviews.lblsortmethod.caption msgctxt "TFRMOPTIONSFILESVIEWS.LBLSORTMETHOD.CAPTION" msgid "&Sort method:" msgstr "" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption msgid "&Move updated files" msgstr "" #: tfrmoptionsfiletypescolors.btnaddcategory.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNADDCATEGORY.CAPTION" msgid "A&dd" msgstr "添加" #: tfrmoptionsfiletypescolors.btnapplycategory.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNAPPLYCATEGORY.CAPTION" msgid "A&pply" msgstr "应用" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNCATEGORYCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNDELETECATEGORY.CAPTION" msgid "D&elete" msgstr "删除" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "模板..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption #, fuzzy #| msgid "File types colors" msgctxt "TFRMOPTIONSFILETYPESCOLORS.GBFILETYPESCOLORS.CAPTION" msgid "File types colors (sort by drag&&drop)" msgstr "文件类型颜色" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption #, fuzzy #| msgid "Category attributes:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYATTR.CAPTION" msgid "Category a&ttributes:" msgstr "分类属性:" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption #, fuzzy #| msgid "Category color:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYCOLOR.CAPTION" msgid "Category co&lor:" msgstr "类别颜色:" #: tfrmoptionsfiletypescolors.lblcategorymask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYMASK.CAPTION" msgid "Category &mask:" msgstr "类别掩码:" #: tfrmoptionsfiletypescolors.lblcategoryname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYNAME.CAPTION" msgid "Category &name:" msgstr "类别名:" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELEDITFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELLOGFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELMAINFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWERBOOKFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.lbleditorfont.caption #, fuzzy #| msgid "Editor font" msgctxt "TFRMOPTIONSFONTS.LBLEDITORFONT.CAPTION" msgid "&Editor font" msgstr "编辑器字体" #: tfrmoptionsfonts.lbllogfont.caption msgctxt "TFRMOPTIONSFONTS.LBLLOGFONT.CAPTION" msgid "&Log font" msgstr "" #: tfrmoptionsfonts.lblmainfont.caption #, fuzzy #| msgid "Main font" msgctxt "TFRMOPTIONSFONTS.LBLMAINFONT.CAPTION" msgid "Main &font" msgstr "主字体" #: tfrmoptionsfonts.lblviewerbookfont.caption msgctxt "TFRMOPTIONSFONTS.LBLVIEWERBOOKFONT.CAPTION" msgid "Viewer&Book Font" msgstr "" #: tfrmoptionsfonts.lblviewerfont.caption #, fuzzy #| msgid "Viewer font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERFONT.CAPTION" msgid "&Viewer font" msgstr "查看器字体" #: tfrmoptionshotkeys.btnaddhotkey.caption msgid "Add &hotkey" msgstr "" #: tfrmoptionshotkeys.btndeletehotkey.caption msgid "&Delete hotkey" msgstr "" #: tfrmoptionshotkeys.btnedithotkey.caption msgctxt "tfrmoptionshotkeys.btnedithotkey.caption" msgid "&Edit hotkey" msgstr "" #: tfrmoptionshotkeys.lbfilter.caption #, fuzzy #| msgid "Filter" msgctxt "TFRMOPTIONSHOTKEYS.LBFILTER.CAPTION" msgid "&Filter" msgstr "过滤" #: tfrmoptionshotkeys.lblcategories.caption #, fuzzy #| msgid "Categories:" msgctxt "tfrmoptionshotkeys.lblcategories.caption" msgid "C&ategories:" msgstr "类别" #: tfrmoptionshotkeys.lblcommands.caption #, fuzzy #| msgid "Commands:" msgctxt "tfrmoptionshotkeys.lblcommands.caption" msgid "Co&mmands:" msgstr "命令:" #: tfrmoptionshotkeys.lblscfiles.caption msgctxt "TFRMOPTIONSHOTKEYS.LBLSCFILES.CAPTION" msgid "&Shortcut files:" msgstr "" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[0].TITLE.CAPTION" msgid "Hotkey" msgstr "" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[1].TITLE.CAPTION" msgid "Parameters" msgstr "" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[2].TITLE.CAPTION" msgid "Controls" msgstr "" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "tfrmoptionsicons.cbiconsinmenussize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption #, fuzzy #| msgid "Show overlay i&cons, e.g. for links" msgctxt "TFRMOPTIONSICONS.CBICONSSHOWOVERLAY.CAPTION" msgid "Show o&verlay icons, e.g. for links" msgstr "显示覆盖图标,比如链接" #: tfrmoptionsicons.cbiconssize.text msgctxt "TFRMOPTIONSICONS.CBICONSSIZE.TEXT" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "" #: tfrmoptionsicons.gbiconssize.caption #, fuzzy #| msgid " Icon &size " msgctxt "TFRMOPTIONSICONS.GBICONSSIZE.CAPTION" msgid " Icon size " msgstr "图标大小(&S)" #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "TFRMOPTIONSICONS.GBSHOWICONSMODE.CAPTION" msgid " Show icons to the left of the filename " msgstr "在文件名左侧显示图标" #: tfrmoptionsicons.rbiconsshowall.caption #, fuzzy #| msgid "&All" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALL.CAPTION" msgid "A&ll" msgstr "全部(&A)" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALLANDEXE.CAPTION" msgid "All associated + &EXE/LNK (slow)" msgstr "所有关联+&EXE/LNK (慢)" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWNONE.CAPTION" msgid "&No icons" msgstr "无图标(&N)" #: tfrmoptionsicons.rbiconsshowstandard.caption #, fuzzy #| msgid "&Only standard icons" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWSTANDARD.CAPTION" msgid "Only &standard icons" msgstr "仅标准图标(&O)" #: tfrmoptionsignorelist.btnaddsel.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSEL.CAPTION" msgid "A&dd selected names" msgstr "" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSELWITHPATH.CAPTION" msgid "Add selected names with &full path" msgstr "" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "TFRMOPTIONSIGNORELIST.CHKIGNOREENABLE.CAPTION" msgid "&Ignore (don't show) the following files and folders:" msgstr "" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "TFRMOPTIONSIGNORELIST.LBLSAVEIN.CAPTION" msgid "&Save in:" msgstr "" #: tfrmoptionskeyboard.cblynxlike.caption msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "" #: tfrmoptionskeyboard.lblalt.caption #, fuzzy #| msgid "Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLALT.CAPTION" msgid "Alt+L&etters" msgstr "Alt+字母(&T)" #: tfrmoptionskeyboard.lblctrlalt.caption #, fuzzy #| msgid "Ctrl+Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLCTRLALT.CAPTION" msgid "Ctrl+Alt+Le&tters" msgstr "Ctrl+Alt+字母(&C)" #: tfrmoptionskeyboard.lblnomodifier.caption msgctxt "TFRMOPTIONSKEYBOARD.LBLNOMODIFIER.CAPTION" msgid "&Letters" msgstr "" #: tfrmoptionslayout.cbflatdiskpanel.caption #, fuzzy #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATDISKPANEL.CAPTION" msgid "&Flat buttons" msgstr "扁平按钮" #: tfrmoptionslayout.cbflatinterface.caption #, fuzzy #| msgid "Flat interface" msgctxt "TFRMOPTIONSLAYOUT.CBFLATINTERFACE.CAPTION" msgid "Flat i&nterface" msgstr "扁平界面" #: tfrmoptionslayout.cbflattoolbar.caption #, fuzzy #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATTOOLBAR.CAPTION" msgid "Flat b&uttons" msgstr "扁平按钮" #: tfrmoptionslayout.cbfreespaceind.caption msgctxt "TFRMOPTIONSLAYOUT.CBFREESPACEIND.CAPTION" msgid "Show fr&ee space indicator on drive label" msgstr "" #: tfrmoptionslayout.cblogwindow.caption #, fuzzy #| msgid "Show log window" msgctxt "TFRMOPTIONSLAYOUT.CBLOGWINDOW.CAPTION" msgid "Show lo&g window" msgstr "日志窗" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "TFRMOPTIONSLAYOUT.CBPANELOFOPERATIONS.CAPTION" msgid "Show panel of operation in background" msgstr "" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "TFRMOPTIONSLAYOUT.CBPROGINMENUBAR.CAPTION" msgid "Show common progress in menu bar" msgstr "" #: tfrmoptionslayout.cbshowcmdline.caption #, fuzzy #| msgid "Show command &line" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCMDLINE.CAPTION" msgid "Show command l&ine" msgstr "显示命令行(&L)" #: tfrmoptionslayout.cbshowcurdir.caption #, fuzzy #| msgid "Show ¤t directory" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCURDIR.CAPTION" msgid "Show current director&y" msgstr "显示当前目录(&C)" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDISKPANEL.CAPTION" msgid "Show &drive buttons" msgstr "显示驱动器栏(&D)" #: tfrmoptionslayout.cbshowdrivefreespace.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDRIVEFREESPACE.CAPTION" msgid "Show free s&pace label" msgstr "" #: tfrmoptionslayout.cbshowdriveslistbutton.caption msgid "Show drives list bu&tton" msgstr "" #: tfrmoptionslayout.cbshowkeyspanel.caption #, fuzzy #| msgid "Show &function key buttons" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWKEYSPANEL.CAPTION" msgid "Show function &key buttons" msgstr "显示功能键按钮(&F)" #: tfrmoptionslayout.cbshowmainmenu.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINMENU.CAPTION" msgid "Show &main menu" msgstr "" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINTOOLBAR.CAPTION" msgid "Show &button bar" msgstr "显示按钮栏(&B)" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption msgid "Show short free space &label" msgstr "" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWSTATUSBAR.CAPTION" msgid "Show &status bar" msgstr "显示状态栏(&S)" #: tfrmoptionslayout.cbshowtabheader.caption #, fuzzy #| msgid "Show &tabstop header" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABHEADER.CAPTION" msgid "S&how tabstop header" msgstr "显示标签页头" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABS.CAPTION" msgid "Sho&w folder tabs" msgstr "显示文件夹标签页(&W)" #: tfrmoptionslayout.cbtermwindow.caption #, fuzzy #| msgid "Show terminal window" msgctxt "TFRMOPTIONSLAYOUT.CBTERMWINDOW.CAPTION" msgid "Show te&rminal window" msgstr "显示终端窗口" #: tfrmoptionslayout.cbtwodiskpanels.caption #, fuzzy #| msgid "Show two drive button bars (fixed width, above file windows)" msgctxt "TFRMOPTIONSLAYOUT.CBTWODISKPANELS.CAPTION" msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "显示2个驱动按钮栏" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "TFRMOPTIONSLAYOUT.GBSCREENLAYOUT.CAPTION" msgid " Screen layout " msgstr "屏幕布局" #: tfrmoptionslog.cblogarcop.caption #, fuzzy #| msgid "Pack/Unpack" msgctxt "TFRMOPTIONSLOG.CBLOGARCOP.CAPTION" msgid "&Pack/Unpack" msgstr "打包/解包" #: tfrmoptionslog.cblogcpmvln.caption #, fuzzy #| msgid "Copy/Move/Create link/symlink" msgctxt "TFRMOPTIONSLOG.CBLOGCPMVLN.CAPTION" msgid "Cop&y/Move/Create link/symlink" msgstr "复制/移动/创建 硬/符号链接" #: tfrmoptionslog.cblogdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSLOG.CBLOGDELETE.CAPTION" msgid "&Delete" msgstr "删除" #: tfrmoptionslog.cblogdirop.caption #, fuzzy #| msgid "Create/Delete directories" msgctxt "TFRMOPTIONSLOG.CBLOGDIROP.CAPTION" msgid "Crea&te/Delete directories" msgstr "创建/删除目录" #: tfrmoptionslog.cblogerrors.caption msgctxt "TFRMOPTIONSLOG.CBLOGERRORS.CAPTION" msgid "Log &errors" msgstr "错误日志" #: tfrmoptionslog.cblogfile.caption #, fuzzy #| msgid "&Create a log file:" msgctxt "TFRMOPTIONSLOG.CBLOGFILE.CAPTION" msgid "C&reate a log file:" msgstr "创建日志文件(&C):" #: tfrmoptionslog.cbloginfo.caption #, fuzzy #| msgid "Log information messages" msgctxt "TFRMOPTIONSLOG.CBLOGINFO.CAPTION" msgid "Log &information messages" msgstr "日志信息" #: tfrmoptionslog.cblogsuccess.caption msgctxt "TFRMOPTIONSLOG.CBLOGSUCCESS.CAPTION" msgid "Log &successful operations" msgstr "操作成功日志" #: tfrmoptionslog.cblogvfs.caption #, fuzzy #| msgid "File system plugins" msgctxt "TFRMOPTIONSLOG.CBLOGVFS.CAPTION" msgid "&File system plugins" msgstr "文件系统插件" #: tfrmoptionslog.gblogfile.caption msgctxt "TFRMOPTIONSLOG.GBLOGFILE.CAPTION" msgid "File operation log file" msgstr "文件操作日志" #: tfrmoptionslog.gblogfileop.caption #, fuzzy #| msgid "Log operations:" msgctxt "TFRMOPTIONSLOG.GBLOGFILEOP.CAPTION" msgid "Log operations" msgstr "操作日志:" #: tfrmoptionslog.gblogfilestatus.caption #, fuzzy #| msgid "Operation status:" msgctxt "TFRMOPTIONSLOG.GBLOGFILESTATUS.CAPTION" msgid "Operation status" msgstr "操作状态" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "" #: tfrmoptionsmisc.chkshowwarningmessages.caption #, fuzzy #| msgid "Show warning messages (\"OK\" button only)" msgctxt "tfrmoptionsmisc.chkshowwarningmessages.caption" msgid "Show &warning messages (\"OK\" button only)" msgstr "显示所有警告信息(仅有“确定”按钮)" #: tfrmoptionsmisc.chkthumbsave.caption msgctxt "tfrmoptionsmisc.chkthumbsave.caption" msgid "&Save thumbnails in cache" msgstr "" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "tfrmoptionsmisc.dblthumbnails.caption" msgid "Thumbnails" msgstr "" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "tfrmoptionsmisc.lblthumbseparator.caption" msgid "X" msgstr "" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "" #: tfrmoptionsmouse.cbselectionbymouse.caption msgid "&Selection by mouse" msgstr "" #: tfrmoptionsmouse.gbscrolling.caption msgid "Scrolling" msgstr "" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "" #: tfrmoptionsmouse.lblmousemode.caption msgid "&Mode:" msgstr "" #: tfrmoptionsmouse.rbscrolllinebyline.caption msgid "&Line by line" msgstr "" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption msgid "Line by line &with cursor movement" msgstr "" #: tfrmoptionsmouse.rbscrollpagebypage.caption msgid "&Page by page" msgstr "" #: tfrmoptionsplugins.btnaddplugin.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "添加" #: tfrmoptionsplugins.btnconfigplugin.caption #, fuzzy #| msgid "Configure" msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "配置" #: tfrmoptionsplugins.btnenableplugin.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "允许" #: tfrmoptionsplugins.btnremoveplugin.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "移除" #: tfrmoptionsplugins.btntweakplugin.caption #, fuzzy #| msgid "Tweak" msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "调整" #: tfrmoptionsplugins.lbldsxdescription.caption #, fuzzy #| msgid "Search plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "搜索插件可以在其他搜索算法下或扩展工具下搜索(像本地搜索等)" #: tfrmoptionsplugins.lblwcxdescription.caption #, fuzzy #| msgid "Packer plugins are used to work with archives." msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "打包工具插件可以处理压缩文件" #: tfrmoptionsplugins.lblwdxdescription.caption #, fuzzy #| msgid "Content plugins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "内容插件可以显示文件扩展信息——像mp3 tags或图片属性,或者在搜索和改名工具中使用" #: tfrmoptionsplugins.lblwfxdescription.caption #, fuzzy #| msgid "File system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "文件系统插件允许访问操作系统能访问的磁盘或像Palm/PocketPC这样的扩展设备." #: tfrmoptionsplugins.lblwlxdescription.caption #, fuzzy #| msgid "Viewer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "查看器插件允许查看图片,电子表格,数据库等格式(F3, Ctrl+Q)" #: tfrmoptionsplugins.stgplugins.columns[0].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[0].TITLE.CAPTION" msgid "Active" msgstr "激活" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[1].TITLE.CAPTION" msgid "Plugin" msgstr "" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[2].TITLE.CAPTION" msgid "Registered for" msgstr "注册给" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[3].TITLE.CAPTION" msgid "File name" msgstr "文件名" #: tfrmoptionsplugins.tsdsx.caption #, fuzzy #| msgid "Search plugins (.DSX)" msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "搜索插件 (.DSX)" #: tfrmoptionsplugins.tswcx.caption #, fuzzy #| msgid "Packer plugins (.WCX)" msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "打包工具插件(.WCX)" #: tfrmoptionsplugins.tswdx.caption #, fuzzy #| msgid "Content plugins (.WDX)" msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "内容插件(.WDX)" #: tfrmoptionsplugins.tswfx.caption #, fuzzy #| msgid "File system plugins (.WFX)" msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "文件系统插件(.WFX)" #: tfrmoptionsplugins.tswlx.caption #, fuzzy #| msgid "Viewer plugins (.WLX)" msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "查看器插件 (.WLX)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTBEGINNING.CAPTION" msgid "&Beginning (name must start with first typed character)" msgstr "开始(&B)(名称必须是首次输入的字符)" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTENDING.CAPTION" msgid "En&ding (last character before a typed dot . must match)" msgstr "结束(&D)(匹配句点号前一字母)" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CGPOPTIONS.CAPTION" msgid "Options" msgstr "选项" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption #, fuzzy #| msgid "Exact name match:" msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.GBEXACTNAMEMATCH.CAPTION" msgid "Exact name match" msgstr "扩展名匹配(&N)" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "TFRMOPTIONSTABS.CBTABSACTIVATEONCLICK.CAPTION" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "点击标签页后激活目标面板" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "TFRMOPTIONSTABS.CBTABSALWAYSVISIBLE.CAPTION" msgid "&Show tab header also when there is only one tab" msgstr "总是显示标签页" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption #, fuzzy #| msgid "&Confirm close all tabs" msgctxt "TFRMOPTIONSTABS.CBTABSCONFIRMCLOSEALL.CAPTION" msgid "Con&firm close all tabs" msgstr "关闭所有标签时需确认" #: tfrmoptionstabs.cbtabslimitoption.caption #, fuzzy #| msgid "&Limit tab title length to:" msgctxt "TFRMOPTIONSTABS.CBTABSLIMITOPTION.CAPTION" msgid "&Limit tab title length to" msgstr "限制标签页标题长度为:" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "TFRMOPTIONSTABS.CBTABSLOCKEDASTERISK.CAPTION" msgid "Show locked tabs &with an asterisk *" msgstr "锁定的标签页显示星号 *" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "TFRMOPTIONSTABS.CBTABSMULTILINES.CAPTION" msgid "&Tabs on multiple lines" msgstr "在多行上显示标签页(&T)" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENFOREGROUND.CAPTION" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Ctrl+&Up 前台打开新标签页" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENNEARCURRENT.CAPTION" msgid "Open &new tabs near current tab" msgstr "" #: tfrmoptionstabs.cbtabsshowclosebutton.caption #, fuzzy #| msgid "Show tab close button" msgctxt "TFRMOPTIONSTABS.CBTABSSHOWCLOSEBUTTON.CAPTION" msgid "Show ta&b close button" msgstr "标签页显示关闭" #: tfrmoptionstabs.gbtabs.caption msgctxt "TFRMOPTIONSTABS.GBTABS.CAPTION" msgid "Folder tabs headers" msgstr "文件夹标签页头" #: tfrmoptionstabs.lblchar.caption msgctxt "TFRMOPTIONSTABS.LBLCHAR.CAPTION" msgid "characters" msgstr "字符" #: tfrmoptionstabs.lbltabsposition.caption #, fuzzy #| msgid "Tabs position" msgctxt "TFRMOPTIONSTABS.LBLTABSPOSITION.CAPTION" msgid "Ta&bs position" msgstr "标签页位置:" #: tfrmoptionsterminal.lblruninterm.caption msgid "Run in &terminal:" msgstr "" #: tfrmoptionsterminal.lblrunterm.caption msgid "Run t&erminal:" msgstr "" #: tfrmoptionstoolbar.btnclonebutton.caption msgctxt "tfrmoptionstoolbar.btnclonebutton.caption" msgid "C&lone button" msgstr "" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "tfrmoptionstoolbar.btndeletebutton.caption" msgid "&Delete" msgstr "删除(&D)" #: tfrmoptionstoolbar.btnedithotkey.caption #, fuzzy #| msgid "Edit hotkey" msgctxt "tfrmoptionstoolbar.btnedithotkey.caption" msgid "Edit hot&key" msgstr "编辑" #: tfrmoptionstoolbar.btninsertbutton.caption msgctxt "tfrmoptionstoolbar.btninsertbutton.caption" msgid "&Insert new button" msgstr "" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "tfrmoptionstoolbar.btnopenfile.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "tfrmoptionstoolbar.btnopenicon.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnremovehotkey.caption msgctxt "tfrmoptionstoolbar.btnremovehotkey.caption" msgid "Remove hotke&y" msgstr "" #: tfrmoptionstoolbar.cbflatbuttons.caption msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "扁平按钮" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "" #: tfrmoptionstoolbar.gbgroupbox.caption msgctxt "tfrmoptionstoolbar.gbgroupbox.caption" msgid "Appearance" msgstr "外观" #: tfrmoptionstoolbar.lblbarsize.caption msgctxt "tfrmoptionstoolbar.lblbarsize.caption" msgid "&Bar size:" msgstr "" #: tfrmoptionstoolbar.lblexternalcommand.caption msgctxt "tfrmoptionstoolbar.lblexternalcommand.caption" msgid "Comman&d:" msgstr "" #: tfrmoptionstoolbar.lblexternalparameters.caption msgctxt "tfrmoptionstoolbar.lblexternalparameters.caption" msgid "Parameter&s:" msgstr "" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "" #: tfrmoptionstoolbar.lbliconfile.caption #, fuzzy #| msgid "Icon:" msgctxt "tfrmoptionstoolbar.lbliconfile.caption" msgid "Ico&n:" msgstr "图标文件(&F)" #: tfrmoptionstoolbar.lbliconsize.caption msgctxt "tfrmoptionstoolbar.lbliconsize.caption" msgid "Icon si&ze:" msgstr "" #: tfrmoptionstoolbar.lblinternalcommand.caption msgctxt "tfrmoptionstoolbar.lblinternalcommand.caption" msgid "Co&mmand:" msgstr "" #: tfrmoptionstoolbar.lblinternalparameters.caption msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "" #: tfrmoptionstoolbar.lblstartpath.caption #, fuzzy #| msgid "Start path:" msgctxt "tfrmoptionstoolbar.lblstartpath.caption" msgid "Start pat&h:" msgstr "开始路径(&S)" #: tfrmoptionstoolbar.lbltooltip.caption #, fuzzy #| msgid "Tooltip:" msgctxt "tfrmoptionstoolbar.lbltooltip.caption" msgid "&Tooltip:" msgstr "工具提示(&T)" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSKEEPTERMINALOPEN.CAPTION" msgid "&Keep terminal window open after executing program" msgstr "" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSRUNINTERMINAL.CAPTION" msgid "&Execute in terminal" msgstr "" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSUSEEXTERNALPROGRAM.CAPTION" msgid "&Use external program" msgstr "" #: tfrmoptionstoolbase.lbltoolsparameters.caption msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPARAMETERS.CAPTION" msgid "A&dditional parameters" msgstr "" #: tfrmoptionstoolbase.lbltoolspath.caption msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPATH.CAPTION" msgid "&Path to program to execute" msgstr "" #: tfrmoptionstooltips.btnaddfields.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "添加" #: tfrmoptionstooltips.btnapplyfields.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "应用" #: tfrmoptionstooltips.btndeletefields.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "删除" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "模板..." #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "" #: tfrmoptionstooltips.lblfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "" #: tfrmoptionstooltips.lblfieldsmask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "类别掩码:" #: tfrmoptionstooltips.lblfieldsname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "类别名:" #: tfrmoptionstooltips.rbtooltipallfiles.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "" #: tfrmoptionstooltips.rbtooltipnone.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "" #: tfrmoptionstooltips.rbtooltiponlylarge.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNBACKVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNFONTVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.gbviewerbookmode.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWERBOOKMODE.CAPTION" msgid "Viewer Book Mode" msgstr "" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWEREXAMPLE.CAPTION" msgid "Example" msgstr "例如" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption msgctxt "TFRMOPTIONSVIEWER.LBLBACKGROUNDCOLORVIEWERBOOK.CAPTION" msgid "&Background color in book viewer" msgstr "" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption msgctxt "TFRMOPTIONSVIEWER.LBLFONTCOLORVIEWERBOOK.CAPTION" msgid "&Font color in book viewer" msgstr "" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption msgctxt "TFRMOPTIONSVIEWER.LBLNUMBERCOLUMNSVIEWER.CAPTION" msgid "&Number of columns in book viewer" msgstr "" #: tfrmpackdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消" #: tfrmpackdlg.btnconfig.caption #, fuzzy #| msgid "&Configure" msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "配置(&C)" #: tfrmpackdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "帮助" #: tfrmpackdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "确定" #: tfrmpackdlg.caption msgctxt "TFRMPACKDLG.CAPTION" msgid "Pack files" msgstr "打包文件" #: tfrmpackdlg.cbcreateseparatearchives.caption #, fuzzy #| msgid "Create separate archives, o&ne per selected file/dir" msgid "C&reate separate archives, one per selected file/dir" msgstr "为选择的每个文件/目录创建单独的包文件" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "创建自解压文件(&X)" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "加密(&Y)" #: tfrmpackdlg.cbmovetoarchive.caption #, fuzzy #| msgid "M&ove to archive" msgid "Mo&ve to archive" msgstr "移动到文件包(&O)" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "多磁盘打包" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "=>" #: tfrmpackdlg.cbputintarfirst.caption msgid "P&ut in the TAR archive first" msgstr "" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "打包路径名(仅有依赖时)(&P)" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "打包到一个文件" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "打包程序" #: tfrmpackinfodlg.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "关闭" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "解开所有包并执行(&A)" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "解包并执行(&U)" #: tfrmpackinfodlg.caption msgctxt "TFRMPACKINFODLG.CAPTION" msgid "Properties of packed file" msgstr "压缩包属性" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "属性:" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "压缩率:" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "日期:" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "事件:" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "原始大小:" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "文件:" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "包大小:" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "打包者:" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "时间:" #: tfrmquicksearch.btncancel.caption msgctxt "tfrmquicksearch.btncancel.caption" msgid "X" msgstr "" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "" #: tfrmquicksearch.tglfilter.caption msgctxt "tfrmquicksearch.tglfilter.caption" msgid "Filter" msgstr "过滤" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CANCELBUTTON.CAPTION" msgid "Cancel" msgstr "取消" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CLOSEBUTTON.CAPTION" msgid "&Close" msgstr "关闭(&C)" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.HELPBUTTON.CAPTION" msgid "&Help" msgstr "帮助(&H)" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "tfrmselecttextrange.btppanel.okbutton.caption" msgid "&OK" msgstr "确定(&O)" #: tfrmselecttextrange.lblselecttext.caption msgid "&Select the characters to insert:" msgstr "" #: tfrmsetfileproperties.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "确定(&O)" #: tfrmsetfileproperties.caption msgctxt "TFRMSETFILEPROPERTIES.CAPTION" msgid "Change attributes" msgstr "" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "固定" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "创建日期:" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "" #: tfrmsetfileproperties.chkrecursive.caption msgid "Including subfolders" msgstr "" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "属性" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "属性" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "组" #: tfrmsetfileproperties.lblattrinfo.caption msgid "(gray field means unchanged value)" msgstr "" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "其他" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "所有者" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "文本中再现:" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "执行" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "八进制:" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "读" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "写" #: tfrmsplitter.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "退出" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "确定" #: tfrmsplitter.caption msgctxt "TFRMSPLITTER.CAPTION" msgid "Splitter" msgstr "分割" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664B - 3.5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "文件名" #: tfrmsplitter.grbxsize.caption #, fuzzy #| msgid "File size" msgid "Size and number of parts" msgstr "文件大小" #: tfrmsplitter.lbdirtarget.caption #, fuzzy #| msgid "Directory target" msgid "Directory &target" msgstr "目标目录" #: tfrmsplitter.lbfilesource.caption #, fuzzy #| msgid "File source" msgid "File &source" msgstr "源文件" #: tfrmsplitter.lblnumberparts.caption msgid "&Number of parts" msgstr "" #: tfrmsplitter.rbtngigab.caption msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "" #: tfrmsplitter.rbtnkilob.caption msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "" #: tfrmsplitter.rbtnmegab.caption msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "" #: tfrmsymlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "确定(&O)" #: tfrmsymlink.caption #, fuzzy #| msgid "Create symlink" msgid "Create symbolic link" msgstr "创建符号链接" #: tfrmsymlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "目标已存在(链接点所在)" #: tfrmsymlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "链接名" #: tfrmtweakplugin.btnadd.caption #, fuzzy #| msgid "Add new" msgid "A&dd new" msgstr "添加" #: tfrmtweakplugin.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消" #: tfrmtweakplugin.btnchange.caption #, fuzzy #| msgid "Change" msgid "C&hange" msgstr "修改" #: tfrmtweakplugin.btndefault.caption #, fuzzy #| msgid "Default" msgid "De&fault" msgstr "默认" #: tfrmtweakplugin.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "确定" #: tfrmtweakplugin.btnremove.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "移除" #: tfrmtweakplugin.caption msgctxt "TFRMTWEAKPLUGIN.CAPTION" msgid "Tweak plugin" msgstr "Tweak插件" #: tfrmtweakplugin.cbpk_caps_by_content.caption #, fuzzy #| msgid "Detect archive type by content" msgid "De&tect archive type by content" msgstr "按内容检测压缩包类型" #: tfrmtweakplugin.cbpk_caps_delete.caption #, fuzzy #| msgid "Can delete files" msgid "Can de&lete files" msgstr "可以删除文件" #: tfrmtweakplugin.cbpk_caps_encrypt.caption #, fuzzy #| msgid "Supports encryption" msgid "Supports e&ncryption" msgstr "支持加密" #: tfrmtweakplugin.cbpk_caps_hide.caption #, fuzzy #| msgid "Show as normal files (hide packer icon)" msgid "Sho&w as normal files (hide packer icon)" msgstr "显示为普通文件(隐藏包图标)" #: tfrmtweakplugin.cbpk_caps_mempack.caption #, fuzzy #| msgid "Supports packing in memory" msgid "Supports pac&king in memory" msgstr "支持在内存中打包" #: tfrmtweakplugin.cbpk_caps_modify.caption #, fuzzy #| msgid "Can modify exisiting archives" msgid "Can &modify exisiting archives" msgstr "允许修改已有压缩包" #: tfrmtweakplugin.cbpk_caps_multiple.caption #, fuzzy #| msgid "Archive can contain multiple files" msgid "&Archive can contain multiple files" msgstr "压缩包可包含多个文件" #: tfrmtweakplugin.cbpk_caps_new.caption #, fuzzy #| msgid "Can create new archives" msgid "Can create new archi&ves" msgstr "创建新压缩包" #: tfrmtweakplugin.cbpk_caps_options.caption #, fuzzy #| msgid "Supports the options dialogbox" msgid "S&upports the options dialogbox" msgstr "支持选项对话框" #: tfrmtweakplugin.cbpk_caps_searchtext.caption #, fuzzy #| msgid "Allow searching for text in archives" msgid "Allow searchin&g for text in archives" msgstr "允许在压缩包中搜索文本" #: tfrmtweakplugin.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "注释:" #: tfrmtweakplugin.lbldetectstr.caption #, fuzzy #| msgid "Detect string:" msgid "D&etect string:" msgstr "检测字符串:" #: tfrmtweakplugin.lblextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "扩展名:" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "标志:" #: tfrmtweakplugin.lblname.caption #, fuzzy #| msgid "Name:" msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "名称:" #: tfrmtweakplugin.lblplugin.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "插件:" #: tfrmtweakplugin.lblplugin1.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "插件:" #: tfrmviewer.actabout.caption msgctxt "TFRMVIEWER.ACTABOUT.CAPTION" msgid "About Viewer..." msgstr "关于查看器" #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "" #: tfrmviewer.actcopyfile.caption msgctxt "TFRMVIEWER.ACTCOPYFILE.CAPTION" msgid "Copy File" msgstr "" #: tfrmviewer.actcopyfile.hint msgctxt "TFRMVIEWER.ACTCOPYFILE.HINT" msgid "Copy File" msgstr "" #: tfrmviewer.actdeletefile.caption msgctxt "TFRMVIEWER.ACTDELETEFILE.CAPTION" msgid "Delete File" msgstr "" #: tfrmviewer.actdeletefile.hint msgctxt "TFRMVIEWER.ACTDELETEFILE.HINT" msgid "Delete File" msgstr "" #: tfrmviewer.actloadnextfile.caption msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.CAPTION" msgid "&Next" msgstr "向后(&N)" #: tfrmviewer.actloadnextfile.hint msgid "Load Next File" msgstr "" #: tfrmviewer.actloadprevfile.caption msgctxt "TFRMVIEWER.ACTLOADPREVFILE.CAPTION" msgid "&Previous" msgstr "向前(&P)" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "" #: tfrmviewer.actmirror.caption msgctxt "TFRMVIEWER.ACTMIRROR.CAPTION" msgid "Mirror" msgstr "" #: tfrmviewer.actmirror.hint msgctxt "TFRMVIEWER.ACTMIRROR.HINT" msgid "Mirror" msgstr "" #: tfrmviewer.actmovefile.caption msgctxt "TFRMVIEWER.ACTMOVEFILE.CAPTION" msgid "Move File" msgstr "" #: tfrmviewer.actmovefile.hint msgctxt "TFRMVIEWER.ACTMOVEFILE.HINT" msgid "Move File" msgstr "" #: tfrmviewer.actreload.caption msgctxt "TFRMVIEWER.ACTRELOAD.CAPTION" msgid "Reload" msgstr "" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "" #: tfrmviewer.actrotate180.caption msgctxt "TFRMVIEWER.ACTROTATE180.CAPTION" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate180.hint msgctxt "TFRMVIEWER.ACTROTATE180.HINT" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate270.caption msgctxt "TFRMVIEWER.ACTROTATE270.CAPTION" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate270.hint msgctxt "TFRMVIEWER.ACTROTATE270.HINT" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate90.caption msgctxt "TFRMVIEWER.ACTROTATE90.CAPTION" msgid "Rotate 90" msgstr "" #: tfrmviewer.actrotate90.hint msgctxt "TFRMVIEWER.ACTROTATE90.HINT" msgid "Rotate 90" msgstr "" #: tfrmviewer.actsaveas.caption msgctxt "TFRMVIEWER.ACTSAVEAS.CAPTION" msgid "Save As..." msgstr "" #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "" #: tfrmviewer.actstretchimage.caption msgctxt "TFRMVIEWER.ACTSTRETCHIMAGE.CAPTION" msgid "Stretch" msgstr "展开" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "复制" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "复制" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "删除" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "删除" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "移动" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "移动" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "撤销" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "" #: tfrmviewer.caption msgctxt "tfrmviewer.caption" msgid "Viewer" msgstr "查看器" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "视图" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "关于" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "显示为二进制" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "复制到剪贴板" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "编辑(&E)" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "编码(&C)" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "退出(&X)" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "文件(&F)" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "图形" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "显示为十六进制" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "图片(&I)" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "插件" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "预览" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "" #: tfrmviewer.mirotate.caption msgid "Rotate" msgstr "" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "" #: tfrmviewer.misaveas.caption msgctxt "TFRMVIEWER.MISAVEAS.CAPTION" msgid "Save As..." msgstr "" #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "搜索" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "全选" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.mistretch.caption msgctxt "TFRMVIEWER.MISTRETCH.CAPTION" msgid "Stretch" msgstr "展开" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "显示为文本" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "视图(&V)" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "显示为换行文本" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "复制到剪贴板" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "全选" #: tfrmviewoperations.btnstartpause.caption msgctxt "tfrmviewoperations.btnstartpause.caption" msgid "&Start" msgstr "开始(&S)" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "" #: tfrmviewoperations.caption msgctxt "TFRMVIEWOPERATIONS.CAPTION" msgid "File operations" msgstr "文件操作" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "" #: tfrmviewoperations.mnucanceloperation.caption msgctxt "tfrmviewoperations.mnucanceloperation.caption" msgid "Cancel" msgstr "取消" #: tfrmviewoperations.mnucancelqueue.caption msgctxt "tfrmviewoperations.mnucancelqueue.caption" msgid "Cancel" msgstr "取消" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "tfrmviewoperations.mnuoperationshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "" #: tfrmviewoperations.mnuqueue.caption msgctxt "tfrmviewoperations.mnuqueue.caption" msgid "Queue" msgstr "" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "tfrmviewoperations.mnuqueueshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "tmultiarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "twcxarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "" #: ulng.rscolattr msgid "Attr" msgstr "属性" #: ulng.rscoldate msgid "Date" msgstr "日期" #: ulng.rscolext msgid "Ext" msgstr "扩展名" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "名称" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "大小" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "修改数目:" #: ulng.rsconfcolalign msgid "Align" msgstr "对齐" #: ulng.rsconfcolcaption msgid "Caption" msgstr "标题" #: ulng.rsconfcolconfig msgid "Config" msgstr "配置" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "删除" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "域内容" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "移动" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "宽度" #: ulng.rsconfcustheader msgid "Customize column" msgstr "自定义列" #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "" #: ulng.rsdlgallopcomplete msgid "All operations completed" msgstr "" #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "全部" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "添加(&A)" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "取消(&C)" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "" #: ulng.rsdlgbuttonno msgid "&No" msgstr "否(&N)" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "无(&N)" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "确定(&O)" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "覆盖(&R)" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "覆盖全部(&A)" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "略过(&S)" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "略过全部(&K)" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "是(&Y)" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "产生校验..." #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "验证校验..." #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "复制文件" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "删除文件" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "移动文件" #: ulng.rsdlgoppause msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "" #: ulng.rsdlgopstart msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "开始(&S)" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "" #: ulng.rsdlgspeedtime #, fuzzy #| msgid "Speed %s/s, remaining time %s" msgid "Speed %s/s, time remaining %s" msgstr "速度 %s/秒, 剩余时间 %s" #: ulng.rsdlgsplit #, fuzzy #| msgid "Split file" msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "分割文件" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "擦除文件" #: ulng.rsdrivenolabel msgid "" msgstr "" #: ulng.rsdrivenomedia msgid "" msgstr "" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Double Commander内部编辑器。" #: ulng.rseditnewfile msgid "new.txt" msgstr "new.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "文件名:" #: ulng.rseditnewopen msgid "Open file" msgstr "打开文件" #: ulng.rseditsearchback msgid "&Backward" msgstr "后退(&B)" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "搜索" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "往前(&F)" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "替换" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "" #: ulng.rsfileopsetpropertyerroroptions msgctxt "ulng.rsfileopsetpropertyerroroptions" msgid "Ask;Don't set anymore;Ignore errors" msgstr "" #: ulng.rsfilterstatus msgid "FILTER" msgstr "" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "%s级" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "所有(不限深度)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "仅当前目录" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "目录 %s 不存在!" #: ulng.rsfindfound msgid "Found: %d" msgstr "找到: %d" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "保存搜索模板" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "模板名:" #: ulng.rsfindscanned msgid "Scanned: %d" msgstr "已扫描: %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "扫描" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "查找文件" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "开始" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr "可用 %s 总容量 %s bytes" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "" #: ulng.rsfuncatime msgid "Access date/time" msgstr "" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "属性" #: ulng.rsfunccomment msgctxt "ulng.rsfunccomment" msgid "Comment" msgstr "" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "" #: ulng.rsfuncext msgid "Extension" msgstr "" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "组" #: ulng.rsfunclinkto msgid "Link to" msgstr "" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "名称" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "所有者" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "路径" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "大小" #: ulng.rsfunctype msgid "Type" msgstr "" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "创建硬链接出现错误." #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "" #: ulng.rshotkeycategorymain msgid "Main" msgstr "" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "查看器" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "连接完成" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "不选择掩码" #: ulng.rsmarkplus msgid "Select mask" msgstr "选择掩码" #: ulng.rsmaskinput msgid "Input mask:" msgstr "输入掩码" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "配置自定义列" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "配置这个自定义列视图" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "动作" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "编辑" #: ulng.rsmnueject msgid "Eject" msgstr "弹出" #: ulng.rsmnumount msgid "Mount" msgstr "解挂" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "" #: ulng.rsmnunomedia msgid "No media available" msgstr "" #: ulng.rsmnuopenwith #, fuzzy #| msgid "Open with ..." msgid "Open with" msgstr "打开..." #: ulng.rsmnuopenwithother msgid "Other..." msgstr "" #: ulng.rsmnusortby msgid "Sort by" msgstr "" #: ulng.rsmnuumount #, fuzzy #| msgid "Umount" msgid "Unmount" msgstr "挂载" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "视图" #: ulng.rsmsgaccount msgid "Account:" msgstr "" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "无法转到目录 [%s]!" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "移除所有非活动标签吗?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "这个标签页 (%s) 已锁定! 仍旧关闭吗?" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "复制 %d 选中的文件/目录吗?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "复制选中的 \"%s\" 吗?" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "删除 %d 选中的文件/目录吗?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "删除 %d 个选择的文件/目录到回收站?" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "删除选中的 \"%s\"?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "删除选中的文件\"%s\"到回收站?" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "无效的磁盘" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "输入文件扩展名:" #: ulng.rsmsgentername msgid "Enter name:" msgstr "输入名称:" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "压缩文件CRC错误" #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "数据损坏" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "" #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "目录 %s 已存在!" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "用户中止执行" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "关闭文件出错." #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "不能创建文件" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "压缩包中没有文件" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "不能打开已存在的文件" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "读取文件出错" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "写文件出错" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "不能创建目录 %s!" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "无效的链接" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "未找到文件" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "内存不足" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "不支持的功能!" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "正则表达式语法错误!" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "不能重命名文件 %s 为 %s" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "缓冲区太小" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "要打包的文件太多" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "位置的压缩格式" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "文件 %s 已修改, 是否保存?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "文件 %s 已存在, 是否覆盖?" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "" #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "文件 %s 只读. 删除吗?" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "文件夹%s已存在, 覆盖吗?" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "允许符号链接\"%s\"吗?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "无效的文件名" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "" #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "无效的选择" #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "" #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "复制文件 %s" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "删除文件 %s" #: ulng.rsmsglogerror msgid "Error: " msgstr "错误:" #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "解开文件 %s" #: ulng.rsmsgloginfo msgid "Info: " msgstr "信息:" #: ulng.rsmsgloglink msgid "Create link %s" msgstr "创建硬链接 %s" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "创建目录 %s" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "移动文件 %s" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "打包到 %s" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "移除目录 %s" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "完成:" #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "创建符号链接 %s" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "" #: ulng.rsmsgnewfile msgid "New file" msgstr "新建文件" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "将解包下一卷" #: ulng.rsmsgnofiles msgid "No files" msgstr "" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "没有选中文件" #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "目标磁盘空间不足,继续?" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "目标磁盘空间不足, 重试?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "不能删除文件 %s" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "没有实现。" #: ulng.rsmsgpassword msgid "Password:" msgstr "" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "添加(&A) %s" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "配置(&C)" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "删除(&D) %s" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "\"%s\" 已存在. 覆盖吗?" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "重命名/移动 %d 选中的文件/目录吗?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "重命名/移动选中的 \"%s\" 吗?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "请重启Double Commander,使修改生效" #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "只能选择校验文件!" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "选择下一卷位置" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "设置卷标" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "选择了太多文件" #: ulng.rsmsgurl msgid "URL:" msgstr "" #: ulng.rsmsgusername msgid "User name:" msgstr "" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "卷标:" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "擦除 %d 个选择的文件/目录?" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "擦除选中的文件 \"%s\"?" #: ulng.rsmulrenfilenamestylelist #, fuzzy #| msgid "No change;UPPERCASE;lowercase;First Char Big;" msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "不修改;大写;小写;首字大写;" #: ulng.rsoperaborted msgid "Aborted" msgstr "终止" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "" #: ulng.rsopercombining msgid "Joining" msgstr "" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopying msgid "Copying" msgstr "" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "删除中" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "" #: ulng.rsoperexecuting msgid "Executing" msgstr "" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "" #: ulng.rsoperextracting msgid "Extracting" msgstr "" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperfinished msgid "Finished" msgstr "已结束" #: ulng.rsoperlisting msgid "Listing" msgstr "" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "" #: ulng.rsopermoving msgid "Moving" msgstr "" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "" #: ulng.rsopernotstarted msgid "Not started" msgstr "未开始" #: ulng.rsoperpacking msgid "Packing" msgstr "" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpaused msgid "Paused" msgstr "暂停" #: ulng.rsoperpausing msgid "Pausing" msgstr "暂停中" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "队列" #: ulng.rsoperrunning msgid "Running" msgstr "运行中" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "" #: ulng.rsopersplitting msgid "Splitting" msgstr "" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperstarting msgid "Starting" msgstr "正开始" #: ulng.rsoperstopped msgid "Stopped" msgstr "已停止" #: ulng.rsoperstopping msgid "Stopping" msgstr "正停止" #: ulng.rsopertesting msgid "Testing" msgstr "" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "等待用户响应" #: ulng.rsoperwiping msgid "Wiping" msgstr "" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "" #: ulng.rsoperworking msgid "Working" msgstr "" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "" #: ulng.rsoptarchivevalue msgid "Value" msgstr "" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr " \"%s\" 相关插件:" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "" #: ulng.rsoptdisable msgid "Disable" msgstr "禁止" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "允许" #: ulng.rsoptenterext msgid "Enter extension" msgstr "输入扩张名" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "" #: ulng.rsoptexamplemark msgid "Mark" msgstr "" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "" #: ulng.rsoptexampletext msgid "Text" msgstr "" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "" #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "" #: ulng.rsopthotkeysdeletetrashcanoverrides msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "" #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "" #: ulng.rsopthotkeysshortcutusedtext1 msgid "Shortcut %s is already used." msgstr "" #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "" #: ulng.rsopthotkeysusedby msgid "used for %s in %s" msgstr "" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "自动刷新" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "行为" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "颜色" #: ulng.rsoptionseditorcolumnsview msgctxt "ulng.rsoptionseditorcolumnsview" msgid "Columns" msgstr "列" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "配置" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "" #: ulng.rsoptionseditorfileoperations msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "文件操作" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "文件面板" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "文件类型" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "文件夹列表" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "字体" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "快捷键" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "图标" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "语言" #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "布局" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "日志" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "杂项" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "插件" #: ulng.rsoptionseditorquicksearch #, fuzzy #| msgid "Quick search" msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "快速搜索" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "终端" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "工具栏" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "左按钮;右按钮;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "激活" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "文件名" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "名称" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "注册给" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "" #: ulng.rsopttoolbarbuttontype msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "文件" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "目录" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "命名管道" #: ulng.rspropsno msgid "No" msgstr "否" #: ulng.rspropssocket msgid "Socket" msgstr "Socket" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "特殊块设备" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "特殊字符设备" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "符号链接" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "未知类型" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "是 (%s)" #: ulng.rssearchresult msgid "Search result" msgstr "" #: ulng.rssearchtemplateunnamed msgid "" msgstr "" #: ulng.rsselectdir msgid "Select a directory" msgstr "选择目录" #: ulng.rsshowhelpfor msgid "&Show help for %s" msgstr "" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "文件: %d, 目录: %d, 大小: %s (%s bytes)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "无法创建目标目录!" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "无效的文件大小格式!" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "不能分割文件!" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "" #: ulng.rssplitseldir msgid "Select directory:" msgstr "选中的目录:" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "创建符号链接出现错误." #: ulng.rssyndefaulttext msgctxt "ulng.rssyndefaulttext" msgid "Default text" msgstr "" #: ulng.rssynlangplaintext msgctxt "ulng.rssynlangplaintext" msgid "Plain text" msgstr "" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "天" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "" #: ulng.rstimeunityear msgid "Year(s)" msgstr "" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "编辑器" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "终端" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "查看器" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "" #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "Double Commander查看器" #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "" doublecmd-0.5.8/language/doublecmd.ca.po0000644000175000017500000064110312250633131017152 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.5 alpha\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-01-17 23:08+0300\n" "PO-Revision-Date: 2012-04-13\n" "Last-Translator: Jordi Casas \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Catalan\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "Tot" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "Tot" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "Tot" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "Tot" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "Tot" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "Tot" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "Tot" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "Cancel.lar" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "" #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "&Acceptar" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "Configurar vista de columnes a mida" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "Fons:" #: tfcolumnssetconf.cbcursorborder.caption #, fuzzy #| msgid "Cursor Límitr" msgid "Cursor border" msgstr "Límit del cursor" #: tfcolumnssetconf.cbovercolor.caption msgid "Allow Overcolor" msgstr "Permetre sobreexposició" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "Usar font i color personal" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "Color de text:" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "Font:" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "Mida:" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "Fons 2:" #: tfcolumnssetconf.lblconfigviewnr.caption msgid "Configure view nr:" msgstr "Configurar vista no.:" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "Color de cursor:" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "Text de cursor:" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "Color de la selecció:" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "Nom:" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "Afegir columna" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "Ajustar columna:" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "Vista previa" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption #, fuzzy #| msgid "Check free space" msgid "C&heck free space" msgstr "Examinar espai lliure" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption msgid "Cop&y attributes" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption msgid "Copy o&wnership" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption msgid "Copy d&ate/time" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption #, fuzzy #| msgid "Correct links" msgid "Correct lin&ks" msgstr "Corregir enllaços" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "Treure marca de només-lectura" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption msgid "E&xclude empty directories" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption #, fuzzy #| msgid "Follow links" msgid "Fo&llow links" msgstr "Seguir enllaços" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "" #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption #, fuzzy #| msgid "When directory exists" msgid "When dir&ectory exists" msgstr "Quan la carpeta existeixi" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption #, fuzzy #| msgid "When file exists" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "Quan l'arxiu existeixi" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption msgid "When ca&nnot set property" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "" #: tfrmabout.btnclose.caption msgctxt "tfrmabout.btnclose.caption" msgid "&Close" msgstr "&Tancar" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "Quant a" #: tfrmabout.lblbuild.caption msgid "Build" msgstr "Fet" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "Pàgina Web:" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "Lazarus" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "Revisió" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption msgid "Version" msgstr "Versió" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Cancel.lar" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&Acceptar" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "&Reiniciar" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "Escollir atributs" #: tfrmattributesedit.cbarchive.caption #, fuzzy #| msgid "Archive" msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "Arxiu" #: tfrmattributesedit.cbcompressed.caption #, fuzzy #| msgid "Compressed" msgid "Co&mpressed" msgstr "Comprimit" #: tfrmattributesedit.cbdirectory.caption #, fuzzy #| msgid "Directory" msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "Carpeta" #: tfrmattributesedit.cbencrypted.caption #, fuzzy #| msgid "Encrypted" msgid "&Encrypted" msgstr "Encriptat" #: tfrmattributesedit.cbhidden.caption #, fuzzy #| msgid "Hidden" msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "Ocult" #: tfrmattributesedit.cbreadonly.caption #, fuzzy #| msgid "Read only" msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "Només lectura" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmattributesedit.cbsparse.caption #, fuzzy #| msgid "Sparse" msgid "S&parse" msgstr "Escàs" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Enganxós" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmattributesedit.cbsymlink.caption #, fuzzy #| msgid "Symlink" msgid "&Symlink" msgstr "Enllaç Simbòlic" #: tfrmattributesedit.cbsystem.caption #, fuzzy #| msgid "System" msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "Sistema" #: tfrmattributesedit.cbtemporary.caption #, fuzzy #| msgid "Temporary" msgid "&Temporary" msgstr "Temporal" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "Atributs NTFS" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "Atributs generals" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Grup" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Altres" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Propietari" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "Ejecució" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "Lectura" #: tfrmattributesedit.lbltextattrs.caption #, fuzzy #| msgid "As text:" msgid "As te&xt:" msgstr "Como a text:" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "Escriptura" #: tfrmchecksumcalc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancel.lar" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "&Acceptar" #: tfrmchecksumcalc.caption msgctxt "tfrmchecksumcalc.caption" msgid "Calculate check sum..." msgstr "Calcular suma de comprovació" #: tfrmchecksumcalc.cbseparatefile.caption #, fuzzy #| msgid "Create separate checksum file for each file" msgid "C&reate separate checksum file for each file" msgstr "Crear un Arxiu por cada comprobació" #: tfrmchecksumcalc.lblsaveto.caption #, fuzzy #| msgid "Save check sum file(s) to:" msgid "&Save check sum file(s) to:" msgstr "Desar Arxiu de comprobació en:" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Tancar" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "Verificar comprobació..." #: tfrmconnectionmanager.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "Afegir" #: tfrmconnectionmanager.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancel.lar" #: tfrmconnectionmanager.btnconnect.caption #, fuzzy #| msgid "Connect" msgid "C&onnect" msgstr "Connectar" #: tfrmconnectionmanager.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Esborrar" #: tfrmconnectionmanager.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Editar" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "Connexió" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "Connectar a:" #: tfrmcopydlg.btnaddtoqueue.caption msgid "A&dd To Queue" msgstr "" #: tfrmcopydlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancel.lar" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "tfrmcopydlg.btncreatespecialqueue.caption" msgid "..." msgstr "" #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "O&pcions" #: tfrmcopydlg.btnsaveoptions.caption #, fuzzy #| msgid "Save these options as default" msgid "Sa&ve these options as default" msgstr "Desar opcions per defecte" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "Copiar Arxiu(s)" #: tfrmdescredit.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancel.lar" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&Acceptar" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "Comentari Arxiu/Carpeta" #: tfrmdescredit.lbleditcommentfor.caption #, fuzzy #| msgid "Edit comment for:" msgid "E&dit comment for:" msgstr "Editar comentari per:" #: tfrmdescredit.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "Codificació:" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "Quant a" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "Comparació auto." #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "Mode Binari" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "Cancel.lar" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "Cancel.lar" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "Copiar bloc dret" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "Copiar bloc dret" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "Copiar bloc esquerra" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "Copiar bloc esquerra" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Copiar" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Tallar" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Esborrar" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Enganxar" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Refer" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "Seleccionar &Tot" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Desfer" #: tfrmdiffer.actexit.caption msgctxt "tfrmdiffer.actexit.caption" msgid "E&xit" msgstr "&Sortir" #: tfrmdiffer.actfirstdifference.caption msgctxt "tfrmdiffer.actfirstdifference.caption" msgid "First Difference" msgstr "Primera diferència" #: tfrmdiffer.actfirstdifference.hint msgctxt "tfrmdiffer.actfirstdifference.hint" msgid "First Difference" msgstr "Primera diferència" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "Ignorar maj./min." #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "Ignorar espais blancs" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "Mantenir desplaçament" #: tfrmdiffer.actlastdifference.caption msgctxt "tfrmdiffer.actlastdifference.caption" msgid "Last Difference" msgstr "Última diferència" #: tfrmdiffer.actlastdifference.hint msgctxt "tfrmdiffer.actlastdifference.hint" msgid "Last Difference" msgstr "Última diferència" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "Diferències de línia" #: tfrmdiffer.actnextdifference.caption msgctxt "tfrmdiffer.actnextdifference.caption" msgid "Next Difference" msgstr "Següent diferència" #: tfrmdiffer.actnextdifference.hint msgctxt "tfrmdiffer.actnextdifference.hint" msgid "Next Difference" msgstr "Següent diferència" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "Obrir esquerra..." #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "Obrir dreta..." #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "Dibuixar Fons" #: tfrmdiffer.actprevdifference.caption msgctxt "tfrmdiffer.actprevdifference.caption" msgid "Previous Difference" msgstr "Diferència prèvia" #: tfrmdiffer.actprevdifference.hint msgctxt "tfrmdiffer.actprevdifference.hint" msgid "Previous Difference" msgstr "Diferència prèvia" #: tfrmdiffer.actreload.caption #, fuzzy #| msgid "Reload" msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "Recarregar" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "Recarregar" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "Desar" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "Desar" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "Desar com..." #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "Desar com..." #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "Desar esquerra" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "Desar esquerra" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "Desar esquerra com..." #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "Desar esquerra com..." #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "Desar dreta" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "Desar dreta" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "Desar dreta com..." #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "Desar dreta com..." #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "Comparar" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "Comparar" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "Codificació" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "Codificació" #: tfrmdiffer.caption msgctxt "tfrmdiffer.caption" msgid "Compare files" msgstr "Comparar Arxius" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.miencodingleft.caption #, fuzzy #| msgid "Left" msgid "&Left" msgstr "esquerra" #: tfrmdiffer.miencodingright.caption #, fuzzy #| msgid "Right" msgid "&Right" msgstr "dreta" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "&Accions" #: tfrmdiffer.mnuedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "Editar" #: tfrmdiffer.mnuencoding.caption #, fuzzy #| msgid "Encoding" msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "Codificació" #: tfrmdiffer.mnufile.caption #, fuzzy #| msgid "File" msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "Arxiu" #: tfrmdiffer.mnuoptions.caption #, fuzzy #| msgid "Options" msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "&Opcions" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "" #: tfrmedithotkey.btncancel.caption msgctxt "tfrmedithotkey.btncancel.caption" msgid "&Cancel" msgstr "&Cancel.lar" #: tfrmedithotkey.btnok.caption msgctxt "tfrmedithotkey.btnok.caption" msgid "&OK" msgstr "&Acceptar" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "" #: tfrmedithotkey.cghkcontrols.caption msgid "Only for these controls" msgstr "" #: tfrmedithotkey.lblparameters.caption msgid "&Parameters (each in a separate line):" msgstr "" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "Quant a" #: tfrmeditor.actabout.hint msgctxt "tfrmeditor.actabout.hint" msgid "About" msgstr "Quant a" #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "&Configuració" #: tfrmeditor.actconfhigh.hint msgctxt "tfrmeditor.actconfhigh.hint" msgid "Configuration" msgstr "Configuració" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Copiar" #: tfrmeditor.acteditcopy.hint msgctxt "tfrmeditor.acteditcopy.hint" msgid "Copy" msgstr "Copiar" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Tallar" #: tfrmeditor.acteditcut.hint msgctxt "tfrmeditor.acteditcut.hint" msgid "Cut" msgstr "Tallar" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Esborrar" #: tfrmeditor.acteditdelete.hint msgctxt "tfrmeditor.acteditdelete.hint" msgid "Delete" msgstr "Esborrar" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "&Cercar" #: tfrmeditor.acteditfind.hint msgctxt "tfrmeditor.acteditfind.hint" msgid "Find" msgstr "Cercar" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "Cercar següent" #: tfrmeditor.acteditfindnext.hint msgctxt "tfrmeditor.acteditfindnext.hint" msgid "Find next" msgstr "Cercar següent" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcr.hint msgctxt "tfrmeditor.acteditlineendcr.hint" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "tfrmeditor.acteditlineendcrlf.hint" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditlineendlf.hint msgctxt "tfrmeditor.acteditlineendlf.hint" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Enganxar" #: tfrmeditor.acteditpaste.hint msgctxt "tfrmeditor.acteditpaste.hint" msgid "Paste" msgstr "Enganxar" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Refer" #: tfrmeditor.acteditredo.hint msgctxt "tfrmeditor.acteditredo.hint" msgid "Redo" msgstr "Refer" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "&Reemplaçar" #: tfrmeditor.acteditrplc.hint msgctxt "tfrmeditor.acteditrplc.hint" msgid "Replace" msgstr "Reemplaçar" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "Seleccionar &Tot" #: tfrmeditor.acteditselectall.hint msgctxt "tfrmeditor.acteditselectall.hint" msgid "Select All" msgstr "Seleccionar Tot" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Desfer" #: tfrmeditor.acteditundo.hint msgctxt "tfrmeditor.acteditundo.hint" msgid "Undo" msgstr "Desfer" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "Tancar" #: tfrmeditor.actfileclose.hint msgctxt "tfrmeditor.actfileclose.hint" msgid "Close" msgstr "Tancar" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "&Sortir" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "&Nou" #: tfrmeditor.actfilenew.hint msgctxt "tfrmeditor.actfilenew.hint" msgid "New" msgstr "Nou" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "&Obrir" #: tfrmeditor.actfileopen.hint msgctxt "tfrmeditor.actfileopen.hint" msgid "Open" msgstr "Obrir" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "&Desar" #: tfrmeditor.actfilesave.hint msgctxt "tfrmeditor.actfilesave.hint" msgid "Save" msgstr "Desar" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "Desar &Com..." #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "De&sar-ho Tot" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "" #: tfrmeditor.caption msgctxt "tfrmeditor.caption" msgid "Editor" msgstr "Editor" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "A&juda" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Editar" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "&Codificació" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "Obrir com" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "Desar com" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "&Arxiu" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "LLenguatge de codificació" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "" #: tfrmeditor.n5.caption msgctxt "tfrmeditor.n5.caption" msgid "-" msgstr "" #: tfrmeditsearchreplace.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancel.lar" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "&Acceptar" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "Sensible a may./min." #: tfrmeditsearchreplace.cbsearchfromcursor.caption #, fuzzy #| msgid "Search from &caret" msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "Cercar desde la posició actual" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "Expresions ®ulars" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "Només seleccionar &text" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "Només paraules completes" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "Opció" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "&Reemplaçar amb:" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "&Cercar:" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "Direcció" #: tfrmextractdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancel.lar" #: tfrmextractdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "A&juda" #: tfrmextractdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "Acceptar" #: tfrmextractdlg.caption msgctxt "tfrmextractdlg.caption" msgid "Unpack files" msgstr "Descomprimir Arxius" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "&Descomprimir carpetes si es guardaren" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*.*" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "Descomprimir cada Arxiu en una carpeta &separada" #: tfrmextractdlg.cboverwrite.caption #, fuzzy #| msgid "&Overwrite existing files" msgid "O&verwrite existing files" msgstr "&Sobreescriure Arxius existents" #: tfrmextractdlg.lblextractto.caption #, fuzzy #| msgid "To the directory:" msgid "To the &directory:" msgstr "A la carpeta:" #: tfrmextractdlg.lblfilemask.caption #, fuzzy #| msgid "Extract files matching file mask:" msgid "&Extract files matching file mask:" msgstr "Extreure Arxius:" #: tfrmextractdlg.lblpassword.caption #, fuzzy #| msgid "Password for encrypted files:" msgid "&Password for encrypted files:" msgstr "Contrasenya:" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "Afegir" #: tfrmfileassoc.btnaddext.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "Afegir" #: tfrmfileassoc.btnaddnewtype.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "Afegir" #: tfrmfileassoc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancel.lar" #: tfrmfileassoc.btndownact.caption #, fuzzy #| msgid "Down" msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "Avall" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "&Acceptar" #: tfrmfileassoc.btnremoveact.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "Eliminar" #: tfrmfileassoc.btnremoveext.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "Eliminar" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "" #: tfrmfileassoc.btnremovetype.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "Eliminar" #: tfrmfileassoc.btnrenametype.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "Reanomenar" #: tfrmfileassoc.btnupact.caption #, fuzzy #| msgid "Up" msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "Amunt" #: tfrmfileassoc.caption msgid "File associations" msgstr "Asociacions d'arxius" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "Accions" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "Extensions" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "Tipus de Arxiu" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "Icon" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "Acció:" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "&Commanda:" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "Editar" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "Obrir en Editor" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "Nom" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "Ruta de l'Arxiu" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "Ruta completa" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "Obtindre sortida de commanda" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "Obrir" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "Executar en terminal" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "Obrir en VFS" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "Veure" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "Obrir en Visor" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Tancar" #: tfrmfileexecuteyourself.caption msgctxt "tfrmfileexecuteyourself.caption" msgid "Wait..." msgstr "Esperar..." #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "Nom:" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "De:" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "¡Picar en Tancar cuando el Arxiu temporal se pueda borrar!" #: tfrmfileop.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancel.lar" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "De:" #: tfrmfileop.lblto.caption msgid "To:" msgstr "Per:" #: tfrmfileproperties.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Tancar" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "" #: tfrmfileproperties.caption msgctxt "tfrmfileproperties.caption" msgid "Properties" msgstr "Propietats" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Enganxós" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "Propietari" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Grup" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Altres" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Propietari" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmfileproperties.lblattrtextstr.caption #, fuzzy #| msgid "Representation in text:" msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Text:" #: tfrmfileproperties.lblcontains.caption msgctxt "tfrmfileproperties.lblcontains.caption" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Executar" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "Nom" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "Nom:" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "Nom" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "Ruta:" #: tfrmfileproperties.lblgroupstr.caption #, fuzzy #| msgid "Group" msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "Grup" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "Últim accès:" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "Última modificació" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "Últim canvi d'estat:" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "" #: tfrmfileproperties.lblownerstr.caption #, fuzzy #| msgid "Owner" msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "Propietari" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Lectura" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "Mida:" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption #, fuzzy #| msgid "Symlink:" msgid "Symlink to:" msgstr "Enllaç simb.:" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption #, fuzzy msgid "Type:" msgstr "Tipus:" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Escriptura" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atributs" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "Propietats" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "Afegir" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "A&juda" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Tancar" #: tfrmfinddlg.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmfinddlg.btnedit.caption" msgid "&Edit" msgstr "Editar" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "&Anar al Arxiu" #: tfrmfinddlg.btnlastsearch.caption msgctxt "tfrmfinddlg.btnlastsearch.caption" msgid "&Last search" msgstr "" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "&Nova cerca" #: tfrmfinddlg.btnsavetemplate.caption #, fuzzy #| msgid "Save" msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "Desar" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "&Esborrar" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "Carregar" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "Desar" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption msgid "Sa&ve with \"Start in directory\"" msgstr "" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "" #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "Començar" #: tfrmfinddlg.btnstop.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "Cancel.lar" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "&Veure" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "Incloure a la llista" #: tfrmfinddlg.caption msgctxt "tfrmfinddlg.caption" msgid "Find files" msgstr "Cercar Arxius" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "Sensible a mays/mins" #: tfrmfinddlg.cbdatefrom.caption #, fuzzy #| msgid "Date From:" msgid "&Date from:" msgstr "Data inicial:" #: tfrmfinddlg.cbdateto.caption #, fuzzy #| msgid "Date To:" msgid "Dat&e to:" msgstr "Data final:" #: tfrmfinddlg.cbfilesizefrom.caption #, fuzzy #| msgid "Size from:" msgid "S&ize from:" msgstr "Mida desde:" #: tfrmfinddlg.cbfilesizeto.caption #, fuzzy #| msgid "Size to:" msgid "Si&ze to:" msgstr "Mida fins:" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "Cercar en Arxiu" #: tfrmfinddlg.cbfollowsymlinks.caption #, fuzzy #| msgid "Follow symlinks" msgctxt "tfrmfinddlg.cbfollowsymlinks.caption" msgid "Follow s&ymlinks" msgstr "Seguir l'Enllaç Simbòlic" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "Cercar Arxius que NO continguin el text" #: tfrmfinddlg.cbnotolderthan.caption #, fuzzy #| msgid "Not older than:" msgid "N&ot older than:" msgstr "No més de:" #: tfrmfinddlg.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name " msgid "Searc&h for part of file name" msgstr "Cercar parts del nom de l'Arxiu" #: tfrmfinddlg.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "Expresions regulars" #: tfrmfinddlg.cbreplacetext.caption #, fuzzy #| msgid "Re&place text" msgid "Re&place by" msgstr "Reemplaçar text" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "" #: tfrmfinddlg.cbtimefrom.caption #, fuzzy #| msgid "Time from:" msgid "&Time from:" msgstr "Hora inicial:" #: tfrmfinddlg.cbtimeto.caption #, fuzzy #| msgid "Time to:" msgid "Ti&me to:" msgstr "Hora final:" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "Usar complement de cerca:" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption msgctxt "tfrmfinddlg.gbdirectories.caption" msgid "Directories" msgstr "" #: tfrmfinddlg.gbfiles.caption msgctxt "tfrmfinddlg.gbfiles.caption" msgid "Files" msgstr "" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "Cercar dades" #: tfrmfinddlg.lblattributes.caption msgid "Attri&butes" msgstr "" #: tfrmfinddlg.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "Codificació:" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "Màscara d'Arxius" #: tfrmfinddlg.lblfindpathstart.caption #, fuzzy #| msgid "&Start in directory" msgid "Start in &directory" msgstr "Carpeta d'Arxiu" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "Cercar subcarpetes:" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "Cerques previes:" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "Eliminar de la lista" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "Mostrar Tots els ítems trobats" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "Mostrar en Visor" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "Avançat" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "Carregar/Desar" #: tfrmfinddlg.tsplugins.caption msgctxt "tfrmfinddlg.tsplugins.caption" msgid "Plugins" msgstr "Complements" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "Resultats" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "Estàndar" #: tfrmfindview.btnclose.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "Cancel.lar" #: tfrmfindview.btnfind.caption #, fuzzy #| msgid "Find" msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "Cercar" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "Cercar" #: tfrmfindview.cbcasesens.caption #, fuzzy #| msgid "Case sensitive" msgid "C&ase sensitive" msgstr "Sensible majúscules/minúscules" #: tfrmhardlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancel.lar" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&Acceptar" #: tfrmhardlink.caption #, fuzzy #| msgid "Create hardlink" msgid "Create hard link" msgstr "Crear Enllaç fort" #: tfrmhardlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Ruta on s'enllaçarà" #: tfrmhardlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Nom de l'Enllaç" #: tfrmhotdir.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "Afegir" #: tfrmhotdir.btnaddman.caption #, fuzzy #| msgid "Add manually" msgid "Add &manually" msgstr "Afegir manualment" #: tfrmhotdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancel.lar" #: tfrmhotdir.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Esborrar" #: tfrmhotdir.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Editar" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&Acceptar" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "Carpetes freqüents" #: tfrmlinker.btnexit.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "Sortir" #: tfrmlinker.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "Acceptar" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "" #: tfrmlinker.caption msgctxt "tfrmlinker.caption" msgid "Linker" msgstr "Enllaçador" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "Desar a..." #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "Element" #: tfrmlinker.lblfilename.caption #, fuzzy #| msgid "File name" msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "Nom" #: tfrmlinker.spbtndel.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "Esborrar" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "Esborrar" #: tfrmlinker.spbtndown.caption #, fuzzy #| msgid "Down" msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "Avall" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "Avall" #: tfrmlinker.spbtnup.caption #, fuzzy #| msgid "Up" msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "Amunt" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "Amunt" #: tfrmmain.actabout.caption #, fuzzy #| msgid "About" msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "Quant a" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "Afegir nom d'Arxiu a la linia de commandes" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "Afegir ruta i nom d'Arxiu a la linia de commandes" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "Copiar ruta a linia de commandes" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "" #: tfrmmain.actcalculatespace.caption #, fuzzy #| msgid "Calculate &Occupied Space..." msgid "Calculate &Occupied Space" msgstr "Calcular espai &ocupat" #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "Canviar de Carpeta" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "Canviar a la carpeta superior" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "Canviar a la carpeta arrel" #: tfrmmain.actchecksumcalc.caption msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "Calcular suma de comprovació" #: tfrmmain.actchecksumverify.caption msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "Verificar suma de comprovació" #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "Esborrar Arxiu log" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "Esborrar finestra log" #: tfrmmain.actclosealltabs.caption #, fuzzy #| msgid "Remove &All Tabs" msgctxt "tfrmmain.actclosealltabs.caption" msgid "Close &All Tabs" msgstr "Tancar tot&es les pestanyes" #: tfrmmain.actclosetab.caption #, fuzzy #| msgid "&Remove Tab" msgctxt "tfrmmain.actclosetab.caption" msgid "&Close Tab" msgstr "Tanca&r pestanya" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "Comparar por &continguts" #: tfrmmain.actcomparedirectories.caption msgctxt "tfrmmain.actcomparedirectories.caption" msgid "Compare Directories" msgstr "" #: tfrmmain.actcomparedirectories.hint msgctxt "tfrmmain.actcomparedirectories.hint" msgid "Compare Directories" msgstr "" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "Mostrar menú contextual" #: tfrmmain.actcopy.caption #, fuzzy #| msgid "Copy" msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "Copiar" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "Copiar nom(s) d'Arxiu(s) amb ruta completa" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "Copiar nom(s) d'Arxiu(s) al portapapers" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "Copiar Arxius sense demanar confirmació" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "Copiar al mateix panel" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "Copiar" #: tfrmmain.actcountdircontent.caption msgid "Sho&w Occupied Space" msgstr "Mostrar espai ocupat" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "Tallar" #: tfrmmain.actdelete.caption #, fuzzy #| msgid "Delete" msgctxt "tfrmmain.actdelete.caption" msgid "Delete" msgstr "Esborrar" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "Història de carpetes" #: tfrmmain.actdirhotlist.caption #, fuzzy #| msgid "Directory &hotlist" msgid "Directory &Hotlist" msgstr "Marcadors" #: tfrmmain.actedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "Editar" #: tfrmmain.acteditcomment.caption msgid "Edit Co&mment..." msgstr "Editar comentari..." #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "Editar nou Arxiu" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "Editar camp de ruta sobre la llista d'Arxius" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "Intercanviar panells" #: tfrmmain.actexit.caption msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "&Sortir" #: tfrmmain.actextractfiles.caption #, fuzzy #| msgid "Extract files..." msgid "&Extract Files..." msgstr "&Extreure..." #: tfrmmain.actfileassoc.caption #, fuzzy #| msgid "File &associations..." msgid "File &Associations..." msgstr "Asociacions d'Arxius..." #: tfrmmain.actfilelinker.caption #, fuzzy #| msgid "Link files" msgid "Com&bine Files..." msgstr "Com&binar..." #: tfrmmain.actfileproperties.caption #, fuzzy #| msgid "Show file properties" msgid "Show &File Properties" msgstr "Mostrar propietats" #: tfrmmain.actfilespliter.caption #, fuzzy #| msgid "Split file" msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "Dividir..." #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "Focus en linia de commandes" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "Col·locar el cursor sobre el primer Arxiu" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "Col·locar el cursor sobre l'últim Arxiu" #: tfrmmain.acthardlink.caption #, fuzzy #| msgid "Create hard link..." msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "Crear Enllaç &fort..." #: tfrmmain.acthelpindex.caption msgid "&Contents" msgstr "Continguts" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "Panells en horitzontal" #: tfrmmain.actkeyboard.caption msgid "&Keyboard" msgstr "Teclat" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "esquerra &= dreta" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "Llista de discs oberts en l'esquerra" #: tfrmmain.actloadselectionfromclip.caption msgid "Load Selection from Clip&board" msgstr "Carregar selecció del portapapers" #: tfrmmain.actloadselectionfromfile.caption msgid "&Load Selection from File..." msgstr "Carregar se&lecció des d'Arxiu..." #: tfrmmain.actmakedir.caption #, fuzzy #| msgid "MakeDir" msgid "MakeDir" msgstr "CrearDir" #: tfrmmain.actmarkcurrentextension.caption msgid "Select All with the Same E&xtension" msgstr "Seleccionar amb la mateixa extensió" #: tfrmmain.actmarkinvert.caption #, fuzzy #| msgid "Invert Selections" msgid "&Invert Selection" msgstr "&Invertir selecció" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "&Seleccionar Tot" #: tfrmmain.actmarkminus.caption #, fuzzy #| msgid "Unselect a group" msgid "Unselect a Gro&up..." msgstr "Deseleccionar gr&up..." #: tfrmmain.actmarkplus.caption #, fuzzy #| msgid "Select a group" msgid "Select a &Group..." msgstr "Seleccionar &grup..." #: tfrmmain.actmarkunmarkall.caption #, fuzzy #| msgid "Unselect All" msgid "&Unselect All" msgstr "&Deseleccionar Tot" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "Minimitzar finestra" #: tfrmmain.actmultirename.caption #, fuzzy #| msgid "Multi Rename Tool" msgid "Multi &Rename Tool" msgstr "&Reanomenat múltiple" #: tfrmmain.actnetworkconnect.caption msgid "Network &Connect..." msgstr "&Connectant xarxa..." #: tfrmmain.actnetworkdisconnect.caption msgid "Network &Disconnect" msgstr "&Desconnectant xarxa..." #: tfrmmain.actnetworkquickconnect.caption msgid "Network &Quick Connect..." msgstr "Connexió &ràpida de xarxa..." #: tfrmmain.actnewtab.caption #, fuzzy #| msgid "&New tab" msgid "&New Tab" msgstr "&Nova pestanya" #: tfrmmain.actnexttab.caption msgid "Switch to Nex&t Tab" msgstr "Canviar a la swgüen&t pestanya" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "Obrir" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "Intentar obrir Arxiu" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "Obrir Arxiu de barra" #: tfrmmain.actopendirinnewtab.caption msgid "Open &Folder in a New Tab" msgstr "Obrir carpeta a nova pestanya" #: tfrmmain.actopenvirtualfilesystemlist.caption #, fuzzy #| msgid "Open VFS List" msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "Veure unitats de xarxa" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "&Visor d'operacions" #: tfrmmain.actoptions.caption #, fuzzy #| msgid "Options..." msgid "&Options..." msgstr "&Opcions..." #: tfrmmain.actpackfiles.caption #, fuzzy #| msgid "Pack files..." msgid "&Pack Files..." msgstr "Comprimir..." #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "Fixar posició de separació" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "&Enganxar" #: tfrmmain.actprevtab.caption msgid "Switch to &Previous Tab" msgstr "Canviar a la pestanya &prèvia" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "Filtre ràpid" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "Cerca ràpida" #: tfrmmain.actquickview.caption msgid "&Quick View Panel" msgstr "Panell de vista ràpida" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "&Actualitzar" #: tfrmmain.actrename.caption #, fuzzy #| msgid "Move" msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "Moure" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "Moure/Eliminar sin confirmación" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "Reanomenar" #: tfrmmain.actrenametab.caption #, fuzzy #| msgid "Re&name Tab" msgid "&Rename Tab" msgstr "Re&anomenar pestanya" #: tfrmmain.actrestoreselection.caption msgid "&Restore Selection" msgstr "&Restaurar Selecció" #: tfrmmain.actreverseorder.caption #, fuzzy #| msgid "Reverse order" msgid "Re&verse Order" msgstr "Ordre in&vers" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "Dret &= Esquerra" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "Llista de discs oberts a la dreta" #: tfrmmain.actrunterm.caption #, fuzzy #| msgid "Run Term" msgid "Run &Terminal" msgstr "Terminal" #: tfrmmain.actsaveselection.caption msgid "Sa&ve Selection" msgstr "Desar selecció" #: tfrmmain.actsaveselectiontofile.caption msgid "Save S&election to File..." msgstr "Desar sel&ecció a Arxiu..." #: tfrmmain.actsearch.caption #, fuzzy #| msgid "&Search" msgid "&Search..." msgstr "&Cercar" #: tfrmmain.actsetfileproperties.caption msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "Canviar atributs..." #: tfrmmain.actsettaboptiondirsinnewtab.caption msgid "Locked with Directories Opened in New &Tabs" msgstr "Bloquejar carpetes obertes a pestanyes noves" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "B&loquejar" #: tfrmmain.actsettaboptionpathresets.caption msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "Bloquejar amb canvis de carpeta permessos" #: tfrmmain.actshellexecute.caption msgctxt "tfrmmain.actshellexecute.caption" msgid "Open" msgstr "Obrir" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "Mostrar menú de botons" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "Històrial de linia de commandes" #: tfrmmain.actshowmainmenu.caption #, fuzzy #| msgid "Menu" msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "Menú" #: tfrmmain.actshowsysfiles.caption #, fuzzy #| msgid "Show hidden/system files" msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "Mostrar Ocults/sistema" #: tfrmmain.actsortbyattr.caption #, fuzzy #| msgid "Sort by attrib" msgid "Sort by &Attributes" msgstr "Ordenar per atributs" #: tfrmmain.actsortbydate.caption #, fuzzy #| msgid "Sort by date" msgid "Sort by &Date" msgstr "Or&denar per data" #: tfrmmain.actsortbyext.caption #, fuzzy #| msgid "Sort by extension" msgid "Sort by &Extension" msgstr "Ordenar per extensió" #: tfrmmain.actsortbyname.caption #, fuzzy #| msgid "Sort by name" msgid "Sort by &Name" msgstr "Ordenar per nom" #: tfrmmain.actsortbysize.caption #, fuzzy #| msgid "Sort by size" msgid "Sort by &Size" msgstr "Ordenar per Mida" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "Habilitar/deshabilitar ignorar llista per no mostrar noms d'Arxiu" #: tfrmmain.actsymlink.caption #, fuzzy #| msgid "Create symbolic link..." msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "Crear e&nlaç Simbòlic..." #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "Objectiu = Origen" #: tfrmmain.acttestarchive.caption msgid "&Test Archive(s)" msgstr "Comprovar Arxiu(s)" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "Carpeta sota el cursor a l'esquerra" #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "Carpeta sota el cursor a la dreta" #: tfrmmain.actunmarkcurrentextension.caption msgid "Unselect All with the Same Ex&tension" msgstr "Deseleccionar Tot amb la mateixa extensió" #: tfrmmain.actview.caption #, fuzzy #| msgid "View" msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "Veure" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "Mostrar hstòria de las direccions visitades per vista activa" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "Anar a l'entrada següent" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "Anar a la entrada prèvia" #: tfrmmain.actvisithomepage.caption msgid "&Visit Double Commander Website" msgstr "Visitar el lloc web de Double Commander" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "Destruir" #: tfrmmain.btnf10.caption #, fuzzy #| msgid "Exit" msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "Sortir" #: tfrmmain.btnf8.caption #, fuzzy #| msgid "Delete" msgctxt "tfrmmain.btnf8.caption" msgid "Delete" msgstr "Esborrar" #: tfrmmain.btnf9.caption msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint msgid "Directory hotlist" msgstr "" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "Mostrar carpeta actual del panell dret al esquerra" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnlefthome.hint msgid "Go to home directory" msgstr "Anar a la carpeta d'usuari" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgid "Go to root directory" msgstr "Anar a la carpeta arrel" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgid "Go to parent directory" msgstr "Anar a la carpeta superior" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr "" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "Mostrar la carpeta actual del panell esquerra al dret" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "tfrmmain.caption" msgid "Double Commander" msgstr "Double Commander" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "Ruta" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "Cancel.lar" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "Copiar..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "Crear Enllaç" #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline33.caption msgctxt "tfrmmain.miline33.caption" msgid "-" msgstr "" #: tfrmmain.miline37.caption msgctxt "tfrmmain.miline37.caption" msgid "-" msgstr "" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "Limpiar" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "Copiar" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "Ocultar" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "Seleccionar Tot" #: tfrmmain.mimove.caption msgid "Move..." msgstr "Moure..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "Crear Enllaç Simbòlic" #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "Opcions de pestanya" #: tfrmmain.mitrayiconexit.caption msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "&Sortir" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "Restaurar" #: tfrmmain.mnualloperpause.caption msgctxt "tfrmmain.mnualloperpause.caption" msgid "||" msgstr "" #: tfrmmain.mnualloperstart.caption msgctxt "tfrmmain.mnualloperstart.caption" msgid "Start" msgstr "Començar" #: tfrmmain.mnualloperstop.caption msgctxt "tfrmmain.mnualloperstop.caption" msgid "Cancel" msgstr "Cancel.lar" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "&Commandes" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "C&onfiguració" #: tfrmmain.mnufiles.caption #, fuzzy #| msgid "Files" msgid "&Files" msgstr "&Arxiu" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "A&juda" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "&Seleccionar" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "Xarxa" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "&Veure" #: tfrmmain.mnutaboptions.caption #, fuzzy #| msgid "Options" msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "Opcions" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "&Pestanyes" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "Copiar" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "Tallar" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "Esborrar" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "Editar" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "Enganxar" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "" #: tfrmmaskinputdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancel.lar" #: tfrmmaskinputdlg.btndefinetemplate.caption #, fuzzy #| msgid "Define..." msgid "&Define..." msgstr "Definir..." #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&Acceptar" #: tfrmmaskinputdlg.lblsearchtemplate.caption #, fuzzy #| msgid "Or select predefined selection type:" msgid "O&r select predefined selection type:" msgstr "O esculli tipus de selecció predefinida:" #: tfrmmkdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancel.lar" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&Acceptar" #: tfrmmkdir.caption msgid "Create new directory" msgstr "Crear nova carpeta" #: tfrmmkdir.lblmakedir.caption #, fuzzy #| msgid "Input new directory name:" msgid "&Input new directory name:" msgstr "Nom de la nova carpeta:" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "" #: tfrmmodview.caption msgctxt "tfrmmodview.caption" msgid "New Size" msgstr "Nova Mida" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "Alt :" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgid "2" msgstr "" #: tfrmmodview.lblpath3.caption msgid "3" msgstr "" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "Qualitat de compresió jpg" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "Ample:" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "" #: tfrmmodview.teheight.text msgid "Height" msgstr "Alt" #: tfrmmodview.tequality.text msgid "80" msgstr "" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "Ample" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Tancar" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "&Esborrar" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "" #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "Carregar" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "" #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "Reanomenar" #: tfrmmultirename.btnrestore.caption #, fuzzy #| msgid "Reset all" msgid "Reset &all" msgstr "Restaurar" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "&Desar" #: tfrmmultirename.caption msgctxt "tfrmmultirename.caption" msgid "MultiRename" msgstr "Reanomenat múltiple" #: tfrmmultirename.cblog.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "Registre" #: tfrmmultirename.cbregexp.caption msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "Expresions regulars" #: tfrmmultirename.cbusesubs.caption msgid "&Use substitution" msgstr "Substituir" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption #, fuzzy #| msgid "[E]xtension" msgid "[E] Extension" msgstr "[E]xtensió" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "Comptador" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "Cercar i Reemplaçar" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "Registre de resultat" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "Màscara" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "Configuració" #: tfrmmultirename.lbext.caption #, fuzzy #| msgid "Extension" msgid "&Extension" msgstr "Extensió" #: tfrmmultirename.lbfind.caption #, fuzzy #| msgid "Find..." msgid "&Find..." msgstr "Cercar..." #: tfrmmultirename.lbinterval.caption #, fuzzy #| msgid "Interval" msgid "&Interval" msgstr "Intervalo" #: tfrmmultirename.lbname.caption #, fuzzy #| msgid "File Name" msgid "File &Name" msgstr "Nom" #: tfrmmultirename.lbreplace.caption #, fuzzy #| msgid "Replace..." msgid "Re&place..." msgstr "Reemplaçar..." #: tfrmmultirename.lbstnb.caption #, fuzzy #| msgid "Start Number" msgid "S&tart Number" msgstr "Número inicial" #: tfrmmultirename.lbwidth.caption #, fuzzy #| msgid "Width" msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "Anchura" #: tfrmmultirename.micounter.caption #, fuzzy #| msgid "[C]ounter" msgid "[C] Counter" msgstr "[C]omptador" #: tfrmmultirename.miday.caption #, fuzzy #| msgid "[D]ay" msgid "[D] Day" msgstr "[D]ia" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "" #: tfrmmultirename.miextensionx.caption #, fuzzy #| msgid "[Ex]xtension" msgid "[Ex] Character at position x" msgstr "[Ex]xtensió" #: tfrmmultirename.miextensionxx.caption #, fuzzy #| msgid "[Ex:x]xtension" msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:x]xtensió" #: tfrmmultirename.mihour.caption #, fuzzy #| msgid "[h]our" msgid "[h] Hour" msgstr "[H]ora" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "" #: tfrmmultirename.miminute.caption #, fuzzy #| msgid "Mi[n]ute" msgid "[n] Minute" msgstr "[Mi]nut" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "" #: tfrmmultirename.mimonth.caption #, fuzzy #| msgid "[M]onth" msgid "[M] Month" msgstr "[Mo]->Mes" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "" #: tfrmmultirename.mimonth3.caption msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "" #: tfrmmultirename.miname.caption #, fuzzy #| msgid "[N]ame" msgid "[N] Name" msgstr "[N]om" #: tfrmmultirename.minamex.caption #, fuzzy #| msgid "[Nx]ame" msgid "[Nx] Character at position x" msgstr "[Nx]om" #: tfrmmultirename.minamexx.caption #, fuzzy #| msgid "[Nx:x]ame" msgid "[Nx:y] Characters from position x to y" msgstr "[Nx:x]om" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "Hora..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "Extensión..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "Nom..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "Complement" #: tfrmmultirename.misecond.caption #, fuzzy #| msgid "[s]econd" msgid "[s] Second" msgstr "[S]egon" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "" #: tfrmmultirename.miyear.caption #, fuzzy #| msgid "[Y] Year" msgid "[Y] Year (2 digits)" msgstr "[Y]->Any" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "tfrmmultirename.stringgrid.columns[0].title.caption" msgid "Old File Name" msgstr "Nom antic" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "tfrmmultirename.stringgrid.columns[1].title.caption" msgid "New File Name" msgstr "Nom nou" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "tfrmmultirename.stringgrid.columns[2].title.caption" msgid "File Path" msgstr "Ruta" #: tfrmopenwith.caption msgid "Choose an application" msgstr "" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "" #: tfrmoptions.btnapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "Aplicar" #: tfrmoptions.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancel.lar" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "&Acceptar" #: tfrmoptions.caption msgctxt "tfrmoptions.caption" msgid "Options" msgstr "Opcions" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "" #: tfrmoptionsarchivers.btnautoconfig.caption #, fuzzy #| msgid "Auto Configure" msgctxt "tfrmoptionsarchivers.btnautoconfig.caption" msgid "A&uto Configure" msgstr "Configuració auto." #: tfrmoptionsarchivers.btnmultiarcadd.caption #, fuzzy #| msgid "Add" msgctxt "tfrmoptionsarchivers.btnmultiarcadd.caption" msgid "A&dd" msgstr "Afegir" #: tfrmoptionsarchivers.btnmultiarcapply.caption #, fuzzy #| msgid "Apply" msgctxt "tfrmoptionsarchivers.btnmultiarcapply.caption" msgid "A&pply" msgstr "Aplicar" #: tfrmoptionsarchivers.btnmultiarcdelete.caption #, fuzzy #| msgid "Delete" msgctxt "tfrmoptionsarchivers.btnmultiarcdelete.caption" msgid "D&elete" msgstr "Esborrar" #: tfrmoptionsarchivers.btnmultiarcrename.caption #, fuzzy #| msgid "Rename" msgctxt "tfrmoptionsarchivers.btnmultiarcrename.caption" msgid "&Rename" msgstr "Reanomenar" #: tfrmoptionsarchivers.chkmultiarcdebug.caption #, fuzzy #| msgid "Debug mode" msgctxt "tfrmoptionsarchivers.chkmultiarcdebug.caption" msgid "De&bug mode" msgstr "Mode de depuració" #: tfrmoptionsarchivers.chkmultiarcenabled.caption #, fuzzy #| msgid "Enabled" msgctxt "tfrmoptionsarchivers.chkmultiarcenabled.caption" msgid "E&nabled" msgstr "Habilitar" #: tfrmoptionsarchivers.chkmultiarcoutput.caption #, fuzzy #| msgid "Show console output" msgctxt "tfrmoptionsarchivers.chkmultiarcoutput.caption" msgid "S&how console output" msgstr "Mostrar sortida de consola" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "tfrmoptionsarchivers.gbarchiveroptions.caption" msgid "Options" msgstr "Opcions" #: tfrmoptionsarchivers.lblarchiveadd.caption #, fuzzy #| msgid "Add:" msgctxt "tfrmoptionsarchivers.lblarchiveadd.caption" msgid "Add&ing:" msgstr "Afegir:" #: tfrmoptionsarchivers.lblarchiveextension.caption #, fuzzy #| msgid "Extension:" msgctxt "tfrmoptionsarchivers.lblarchiveextension.caption" msgid "E&xtension:" msgstr "Extensió:" #: tfrmoptionsarchivers.lblarchiveextract.caption #, fuzzy #| msgid "Extract:" msgctxt "tfrmoptionsarchivers.lblarchiveextract.caption" msgid "Ex&tract:" msgstr "Extreure:" #: tfrmoptionsarchivers.lblarchivelist.caption #, fuzzy #| msgid "List:" msgctxt "tfrmoptionsarchivers.lblarchivelist.caption" msgid "&List:" msgstr "Llistar:" #: tfrmoptionsarchivers.lblarchivelistend.caption #, fuzzy #| msgid "Listing finish (optional):" msgctxt "tfrmoptionsarchivers.lblarchivelistend.caption" msgid "Listing &finish (optional):" msgstr "Acabar llistat (opcional):" #: tfrmoptionsarchivers.lblarchivelistformat.caption #, fuzzy #| msgid "Listing format:" msgctxt "tfrmoptionsarchivers.lblarchivelistformat.caption" msgid "Listing for&mat:" msgstr "Format de llista:" #: tfrmoptionsarchivers.lblarchiveliststart.caption #, fuzzy #| msgid "Listing start (optional):" msgctxt "tfrmoptionsarchivers.lblarchiveliststart.caption" msgid "Listin&g start (optional):" msgstr "Començar llistat (opcional):" #: tfrmoptionsarchivers.lblarchiver.caption #, fuzzy #| msgid "Archiver:" msgctxt "tfrmoptionsarchivers.lblarchiver.caption" msgid "Arc&hiver:" msgstr "Arxivador:" #: tfrmoptionsarchivers.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "tfrmoptionsarchivers.lbldescription.caption" msgid "De&scription:" msgstr "Descripció:" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "tfrmoptionsarchivers.tbarchiveradditional.caption" msgid "Additional" msgstr "Addicional" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "tfrmoptionsarchivers.tbarchivergeneral.caption" msgid "General" msgstr "General" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption msgctxt "tfrmoptionsautorefresh.cbwatchattributeschange.caption" msgid "When &size, date or attributes change" msgstr "Quan canvia la mida, la data o els atributs" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "tfrmoptionsautorefresh.cbwatchexcludedirs.caption" msgid "For the following &paths and their subdirectories:" msgstr "Per les rutes següents i les seves subcarpetes:" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption #, fuzzy #| msgid "When files are &created, deleted or renamed" msgctxt "tfrmoptionsautorefresh.cbwatchfilenamechange.caption" msgid "When &files are created, deleted or renamed" msgstr "Quan es crean Arxius, s'esborren o es reanomenen" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption msgctxt "tfrmoptionsautorefresh.cbwatchonlyforeground.caption" msgid "When application is in the &background" msgstr "Quan l'aplicació està en segon pla" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "tfrmoptionsautorefresh.gbautorefreshdisable.caption" msgid "Disable auto-refresh" msgstr "Deshabilitar actualizació automàtica" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "tfrmoptionsautorefresh.gbautorefreshenable.caption" msgid "Refresh file list" msgstr "Actualitzar la lista d'Arxius" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption #, fuzzy #| msgid "Always show tray icon" msgctxt "tfrmoptionsbehavior.cbalwaysshowtrayicon.caption" msgid "Al&ways show tray icon" msgstr "Icon sempre a safata" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption msgid "Automatically &hide unmounted devices" msgstr "" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "tfrmoptionsbehavior.cbminimizetotray.caption" msgid "Mo&ve icon to system tray when minimized" msgstr "Al minimitzar, icon a safata" #: tfrmoptionsbehavior.cbonlyonce.caption #, fuzzy #| msgid "Allow only one copy of DC at a time" msgctxt "tfrmoptionsbehavior.cbonlyonce.caption" msgid "A&llow only one copy of DC at a time" msgstr "Només una còpia de Double Commander oberta" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "" #: tfrmoptionsbehavior.lbldrivesblacklist.caption msgid "Drives &blacklist" msgstr "" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption #, fuzzy #| msgid "Cut text to column width" msgctxt "tfrmoptionscolumnsview.cbcuttexttocolwidth.caption" msgid "Cut &text to column width" msgstr "Ajustar text a ample de columna" #: tfrmoptionscolumnsview.cbgridhorzline.caption #, fuzzy #| msgid "Horizontal lines" msgctxt "tfrmoptionscolumnsview.cbgridhorzline.caption" msgid "&Horizontal lines" msgstr "Línies horizontales" #: tfrmoptionscolumnsview.cbgridvertline.caption #, fuzzy #| msgid "Vertical lines" msgctxt "tfrmoptionscolumnsview.cbgridvertline.caption" msgid "&Vertical lines" msgstr "Línies verticals" #: tfrmoptionscolumnsview.chkautofillcolumns.caption #, fuzzy #| msgid "Auto fill columns" msgctxt "tfrmoptionscolumnsview.chkautofillcolumns.caption" msgid "A&uto fill columns" msgstr "Omplerta automàtica de columnes" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "" #: tfrmoptionscolumnsview.lblautosizecolumn.caption #, fuzzy #| msgid "Auto size column:" msgctxt "tfrmoptionscolumnsview.lblautosizecolumn.caption" msgid "Auto si&ze column:" msgstr "Mida automàtica de columna:" #: tfrmoptionsconfiguration.btnconfigapply.caption #, fuzzy #| msgid "Apply" msgctxt "tfrmoptionsconfiguration.btnconfigapply.caption" msgid "A&pply" msgstr "Aplicar" #: tfrmoptionsconfiguration.btnconfigedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmoptionsconfiguration.btnconfigedit.caption" msgid "&Edit" msgstr "Editar" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption #, fuzzy #| msgid "Command line history" msgctxt "tfrmoptionsconfiguration.cbcmdlinehistory.caption" msgid "Co&mmand line history" msgstr "Història de commandes" #: tfrmoptionsconfiguration.cbdirhistory.caption #, fuzzy #| msgid "Directory history" msgctxt "tfrmoptionsconfiguration.cbdirhistory.caption" msgid "&Directory history" msgstr "Història de carpetes" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption #, fuzzy #| msgid "File mask history" msgctxt "tfrmoptionsconfiguration.cbfilemaskhistory.caption" msgid "&File mask history" msgstr "Història de màscares" #: tfrmoptionsconfiguration.chksaveconfiguration.caption #, fuzzy #| msgid "Save configuration" msgctxt "tfrmoptionsconfiguration.chksaveconfiguration.caption" msgid "Sa&ve configuration" msgstr "Desar configuració" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption #, fuzzy #| msgid "Search/Replace history" msgctxt "tfrmoptionsconfiguration.chksearchreplacehistory.caption" msgid "Searc&h/Replace history" msgstr "Història de Cercar/Reemplaçar" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgctxt "tfrmoptionsconfiguration.gblocconfigfiles.caption" msgid "Location of configuration files" msgstr "Situació dels Arxius de configuració" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgctxt "tfrmoptionsconfiguration.gbsaveonexit.caption" msgid "Save on exit" msgstr "Desar al sortir" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgctxt "tfrmoptionsconfiguration.lblcmdlineconfigdir.caption" msgid "Set on command line" msgstr "Fixar sobre linia de commandes" #: tfrmoptionsconfiguration.rbprogramdir.caption #, fuzzy #| msgid "Program directory (portable version)" msgctxt "tfrmoptionsconfiguration.rbprogramdir.caption" msgid "P&rogram directory (portable version)" msgstr "Carpeta del programa (versió portable)" #: tfrmoptionsconfiguration.rbuserhomedir.caption #, fuzzy #| msgid "User home directory" msgctxt "tfrmoptionsconfiguration.rbuserhomedir.caption" msgid "&User home directory" msgstr "Carpeta d'usuari" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption #, fuzzy #| msgid "Copy" msgctxt "tfrmoptionscustomcolumns.btncopycolumnsset.caption" msgid "C&opy" msgstr "Copiar" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption #, fuzzy #| msgid "Delete" msgctxt "tfrmoptionscustomcolumns.btndelcolumnsset.caption" msgid "&Delete" msgstr "Esborrar" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmoptionscustomcolumns.btneditcolumnsset.caption" msgid "&Edit" msgstr "Editar" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "tfrmoptionscustomcolumns.btnnewcolumnsset.caption" msgid "&New" msgstr "&Nou" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "tfrmoptionscustomcolumns.cbbfilesystem.text" msgid "General" msgstr "General" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption #, fuzzy #| msgid "Configure columns for file system:" msgctxt "tfrmoptionscustomcolumns.lblconfigcolumns.caption" msgid "Con&figure columns for file system:" msgstr "Configurar columnes per sistema d'arxius:" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption msgid "&Show confirmation dialog after drop" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption msgid "Show &file system" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption msgid "Show fr&ee space" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption msgid "Show &label" msgstr "" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "" #: tfrmoptionseditorcolors.backgroundlabel.caption msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "" #: tfrmoptionseditorcolors.foregroundlabel.caption msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption msgid "&Text-mark" msgstr "" #: tfrmoptionseditorcolors.tbtnglobal.caption msgid "Use (and edit) &global scheme settings" msgstr "" #: tfrmoptionseditorcolors.tbtnlocal.caption msgid "Use &local scheme settings" msgstr "" #: tfrmoptionseditorcolors.textboldcheckbox.caption msgid "&Bold" msgstr "" #: tfrmoptionseditorcolors.textboldradioinvert.caption msgctxt "tfrmoptionseditorcolors.textboldradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textboldradiooff.caption msgctxt "tfrmoptionseditorcolors.textboldradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textboldradioon.caption msgctxt "tfrmoptionseditorcolors.textboldradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textitaliccheckbox.caption msgid "&Italic" msgstr "" #: tfrmoptionseditorcolors.textitalicradioinvert.caption msgctxt "tfrmoptionseditorcolors.textitalicradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textitalicradiooff.caption msgctxt "tfrmoptionseditorcolors.textitalicradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textitalicradioon.caption msgctxt "tfrmoptionseditorcolors.textitalicradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption msgid "&Strike Out" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption msgid "&Underline" msgstr "" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textunderlineradiooff.caption msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textunderlineradioon.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "" #: tfrmoptionsfileoperations.cbdeletetotrash.caption #, fuzzy #| msgid "Delete to recycle bin (Shift key reverses this setting)" msgctxt "tfrmoptionsfileoperations.cbdeletetotrash.caption" msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "S'envia a la paperera (la tecla majúscula inverteix aquesta selecció)" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "tfrmoptionsfileoperations.cbdropreadonlyflag.caption" msgid "D&rop readonly flag" msgstr "Treure marca de només lectura" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name" msgctxt "tfrmoptionsfileoperations.cbpartialnamesearch.caption" msgid "&Search for part of file name" msgstr "Cercar part del nom de l'Arxiu" #: tfrmoptionsfileoperations.cbprocesscomments.caption #, fuzzy #| msgid "Process comments with files/folders" msgctxt "tfrmoptionsfileoperations.cbprocesscomments.caption" msgid "&Process comments with files/folders" msgstr "Processar comentaris amb Arxius/carpetes" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption msgid "Select &file name without extension when renaming" msgstr "" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption #, fuzzy #| msgid "Show tab select panel in copy/move dialog" msgctxt "tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption" msgid "Sho&w tab select panel in copy/move dialog" msgstr "Mostrar la pestanya del panell seleccionat en el diàleg de copiar/moure" #: tfrmoptionsfileoperations.cbskipfileoperror.caption #, fuzzy #| msgid "Skip file operations errors and write them to log window" msgctxt "tfrmoptionsfileoperations.cbskipfileoperror.caption" msgid "S&kip file operations errors and write them to log window" msgstr "Saltar errors d'operació amb Arxius i escriure'ls en una finestra de registre" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "tfrmoptionsfileoperations.gbfilesearch.caption" msgid "File search" msgstr "Cerca d'Arxius" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "" #: tfrmoptionsfileoperations.lblbuffersize.caption msgid "&Buffer size for file operations (in KB):" msgstr "" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "" #: tfrmoptionsfileoperations.lblprogresskind.caption msgid "Show operations progress &initially in" msgstr "" #: tfrmoptionsfileoperations.lblwipepassnumber.caption msgid "&Number of wipe passes:" msgstr "" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption #, fuzzy #| msgid "Use memory mapping for search text in files" msgctxt "tfrmoptionsfileoperations.rbusemmapinsearch.caption" msgid "Use memory mapping for search te&xt in files" msgstr "Usar mapatge en memòria per cercar text en arxius" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption #, fuzzy #| msgid "Use stream for search text in files" msgctxt "tfrmoptionsfileoperations.rbusestreaminsearch.caption" msgid "&Use stream for search text in files" msgstr "Usar disc per cercar text en Arxius" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnbackcolor.caption" msgid ">>" msgstr "" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "tfrmoptionsfilepanelscolors.btnbackcolor2.caption" msgid ">>" msgstr "" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btncursorcolor.caption" msgid ">>" msgstr "" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "tfrmoptionsfilepanelscolors.btncursortext.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnforecolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnindbackcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnindcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnmarkcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption #, fuzzy #| msgid "Use Frame Cursor" msgctxt "tfrmoptionsfilepanelscolors.cbbuseframecursor.caption" msgid "Use &Frame Cursor" msgstr "Usar cursor emmarcat" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption msgid "Use &Gradient Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption #, fuzzy #| msgid "Use Inverted Selection" msgctxt "tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption" msgid "U&se Inverted Selection" msgstr "Usar selecció invertida" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgid "Drive Free Space Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "tfrmoptionsfilepanelscolors.gbexample.caption" msgid "Example" msgstr "Exemple" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption msgid "Bac&kground:" msgstr "" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption #, fuzzy #| msgid "Background 2:" msgctxt "tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption" msgid "Backg&round 2:" msgstr "Fons 2:" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption #, fuzzy #| msgid "Cursor Color:" msgctxt "tfrmoptionsfilepanelscolors.lblcursorcolor.caption" msgid "C&ursor Color:" msgstr "Color de cursor:" #: tfrmoptionsfilepanelscolors.lblcursortext.caption #, fuzzy #| msgid "Cursor Text:" msgctxt "tfrmoptionsfilepanelscolors.lblcursortext.caption" msgid "Cursor Te&xt:" msgstr "Text de cursor:" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption #, fuzzy #| msgid "Brightness level of inactive panel" msgctxt "tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption" msgid "&Brightness level of inactive panel" msgstr "Nivell de brillantor del panell inactiu" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption msgid "In&dicator Back Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblindcolor.caption msgid "&Indicator Fore Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption #, fuzzy #| msgid "Mark Color:" msgctxt "tfrmoptionsfilepanelscolors.lblmarkcolor.caption" msgid "&Mark Color:" msgstr "Color de la selecció:" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption #, fuzzy #| msgid "Text Color:" msgctxt "tfrmoptionsfilepanelscolors.lbltextcolor.caption" msgid "T&ext Color:" msgstr "Color de text:" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption msgid "Do&n't load file list until a tab is activated" msgstr "" #: tfrmoptionsfilesviews.cbdirbrackets.caption #, fuzzy #| msgid "Show square brackets around directories" msgctxt "tfrmoptionsfilesviews.cbdirbrackets.caption" msgid "S&how square brackets around directories" msgstr "Mostrar claudàtors quadrats per les carpetes" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption msgid "Hi&ghlight new and updated files" msgstr "" #: tfrmoptionsfilesviews.cblistfilesinthread.caption #, fuzzy #| msgid "Load file list in separate thread" msgctxt "tfrmoptionsfilesviews.cblistfilesinthread.caption" msgid "Load &file list in separate thread" msgstr "Carregar llista d'Arxius en procesos separats" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption #, fuzzy #| msgid "Load icons after file list" msgctxt "tfrmoptionsfilesviews.cbloadiconsseparately.caption" msgid "Load icons af&ter file list" msgstr "Carregar els icons després de la llista d'Arxius" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption #, fuzzy #| msgid "Show system and hidden files" msgctxt "tfrmoptionsfilesviews.cbshowsystemfiles.caption" msgid "Show s&ystem and hidden files" msgstr "Mostrar Ocults/sistema" #: tfrmoptionsfilesviews.cbspacemovesdown.caption #, fuzzy #| msgid "When selecting files with , move down to next file (as with )" msgctxt "tfrmoptionsfilesviews.cbspacemovesdown.caption" msgid "&When selecting files with , move down to next file (as with )" msgstr "Quan es seleccioni arxius amb la barra d'espai, pasar al següent Arxiu (com amb )" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "" #: tfrmoptionsfilesviews.gbsorting.caption msgctxt "tfrmoptionsfilesviews.gbsorting.caption" msgid "Sorting" msgstr "Ordenant" #: tfrmoptionsfilesviews.lblcasesensitivity.caption msgid "Case s&ensitivity:" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeformat.caption #, fuzzy #| msgid "Date and time format:" msgctxt "tfrmoptionsfilesviews.lbldatetimeformat.caption" msgid "&Date and time format:" msgstr "Formato de data y hora:" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "" #: tfrmoptionsfilesviews.lblnewfilesposition.caption msgid "&Insert new files" msgstr "" #: tfrmoptionsfilesviews.lblsortfoldermode.caption msgid "So&rting directories:" msgstr "" #: tfrmoptionsfilesviews.lblsortmethod.caption #, fuzzy #| msgid "Sort &method:" msgctxt "tfrmoptionsfilesviews.lblsortmethod.caption" msgid "&Sort method:" msgstr "Métode d'ordenamient:" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption msgid "&Move updated files" msgstr "" #: tfrmoptionsfiletypescolors.btnaddcategory.caption #, fuzzy #| msgid "Add" msgctxt "tfrmoptionsfiletypescolors.btnaddcategory.caption" msgid "A&dd" msgstr "Afegir" #: tfrmoptionsfiletypescolors.btnapplycategory.caption #, fuzzy #| msgid "Apply" msgctxt "tfrmoptionsfiletypescolors.btnapplycategory.caption" msgid "A&pply" msgstr "Aplicar" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "tfrmoptionsfiletypescolors.btncategorycolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption #, fuzzy #| msgid "Delete" msgctxt "tfrmoptionsfiletypescolors.btndeletecategory.caption" msgid "D&elete" msgstr "Esborrar" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "tfrmoptionsfiletypescolors.btnsearchtemplate.hint" msgid "Template..." msgstr "Plantilla..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption msgid "File types colors (sort by drag&&drop)" msgstr "" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption #, fuzzy #| msgid "Category attributes:" msgctxt "tfrmoptionsfiletypescolors.lblcategoryattr.caption" msgid "Category a&ttributes:" msgstr "Atributs de categoria:" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption #, fuzzy #| msgid "Category color:" msgctxt "tfrmoptionsfiletypescolors.lblcategorycolor.caption" msgid "Category co&lor:" msgstr "Color de categoría:" #: tfrmoptionsfiletypescolors.lblcategorymask.caption #, fuzzy #| msgid "Category mask:" msgctxt "tfrmoptionsfiletypescolors.lblcategorymask.caption" msgid "Category &mask:" msgstr "Màscara de categoria:" #: tfrmoptionsfiletypescolors.lblcategoryname.caption #, fuzzy #| msgid "Category name:" msgctxt "tfrmoptionsfiletypescolors.lblcategoryname.caption" msgid "Category &name:" msgstr "Nom de categoria:" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "tfrmoptionsfonts.btnseleditfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "tfrmoptionsfonts.btnsellogfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "tfrmoptionsfonts.btnselmainfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "tfrmoptionsfonts.btnselviewerbookfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "tfrmoptionsfonts.btnselviewfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.lbleditorfont.caption #, fuzzy #| msgid "Editor font" msgctxt "tfrmoptionsfonts.lbleditorfont.caption" msgid "&Editor font" msgstr "Font del editor" #: tfrmoptionsfonts.lbllogfont.caption #, fuzzy #| msgid "Log font" msgctxt "tfrmoptionsfonts.lbllogfont.caption" msgid "&Log font" msgstr "Font de registre" #: tfrmoptionsfonts.lblmainfont.caption #, fuzzy #| msgid "Main font" msgctxt "tfrmoptionsfonts.lblmainfont.caption" msgid "Main &font" msgstr "Font principal" #: tfrmoptionsfonts.lblviewerbookfont.caption #, fuzzy #| msgid "Viewer Book Font" msgctxt "tfrmoptionsfonts.lblviewerbookfont.caption" msgid "Viewer&Book Font" msgstr "Font de Vista de Llibre" #: tfrmoptionsfonts.lblviewerfont.caption #, fuzzy #| msgid "Viewer font" msgctxt "tfrmoptionsfonts.lblviewerfont.caption" msgid "&Viewer font" msgstr "Font del visor" #: tfrmoptionshotkeys.btnaddhotkey.caption msgid "Add &hotkey" msgstr "" #: tfrmoptionshotkeys.btndeletehotkey.caption msgid "&Delete hotkey" msgstr "" #: tfrmoptionshotkeys.btnedithotkey.caption msgctxt "tfrmoptionshotkeys.btnedithotkey.caption" msgid "&Edit hotkey" msgstr "" #: tfrmoptionshotkeys.lbfilter.caption #, fuzzy #| msgid "Filter" msgctxt "tfrmoptionshotkeys.lbfilter.caption" msgid "&Filter" msgstr "Filtre" #: tfrmoptionshotkeys.lblcategories.caption #, fuzzy #| msgid "Categories:" msgctxt "tfrmoptionshotkeys.lblcategories.caption" msgid "C&ategories:" msgstr "Categoríes:" #: tfrmoptionshotkeys.lblcommands.caption #, fuzzy #| msgid "Commands:" msgctxt "tfrmoptionshotkeys.lblcommands.caption" msgid "Co&mmands:" msgstr "Commandes:" #: tfrmoptionshotkeys.lblscfiles.caption #, fuzzy #| msgid "Shortcut files:" msgctxt "tfrmoptionshotkeys.lblscfiles.caption" msgid "&Shortcut files:" msgstr "Arxius d'acció ràpida:" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "tfrmoptionshotkeys.stghotkeys.columns[0].title.caption" msgid "Hotkey" msgstr "Tecles ràpides" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "tfrmoptionshotkeys.stghotkeys.columns[1].title.caption" msgid "Parameters" msgstr "Paràmetres" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption msgid "Controls" msgstr "" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "Per les rutes següents i les seves subcarpetes:" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "tfrmoptionsicons.cbiconsinmenussize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption #, fuzzy #| msgid "Show overlay i&cons, e.g. for links" msgctxt "tfrmoptionsicons.cbiconsshowoverlay.caption" msgid "Show o&verlay icons, e.g. for links" msgstr "Mostrar icons superposats; per ex, per Enllaços" #: tfrmoptionsicons.cbiconssize.text msgctxt "tfrmoptionsicons.cbiconssize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "" #: tfrmoptionsicons.gbiconssize.caption #, fuzzy #| msgid " Icon &size " msgctxt "tfrmoptionsicons.gbiconssize.caption" msgid " Icon size " msgstr "Mida d'Icon" #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "tfrmoptionsicons.gbshowiconsmode.caption" msgid " Show icons to the left of the filename " msgstr " Mostrar icons a l'esquerra del nom" #: tfrmoptionsicons.rbiconsshowall.caption #, fuzzy #| msgid "&All" msgctxt "tfrmoptionsicons.rbiconsshowall.caption" msgid "A&ll" msgstr "&Tot" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "tfrmoptionsicons.rbiconsshowallandexe.caption" msgid "All associated + &EXE/LNK (slow)" msgstr "Tot lo asociado + &EXE/LNK (lento)" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "tfrmoptionsicons.rbiconsshownone.caption" msgid "&No icons" msgstr "Sense icons" #: tfrmoptionsicons.rbiconsshowstandard.caption #, fuzzy #| msgid "&Only standard icons" msgctxt "tfrmoptionsicons.rbiconsshowstandard.caption" msgid "Only &standard icons" msgstr "Només icons estàndar" #: tfrmoptionsignorelist.btnaddsel.caption #, fuzzy #| msgid "&Add selected names" msgctxt "tfrmoptionsignorelist.btnaddsel.caption" msgid "A&dd selected names" msgstr "Afegir noms seleccionats" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "tfrmoptionsignorelist.btnaddselwithpath.caption" msgid "Add selected names with &full path" msgstr "Afegir noms seleccionats amb la ruta completa" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "tfrmoptionsignorelist.chkignoreenable.caption" msgid "&Ignore (don't show) the following files and folders:" msgstr "&Ignorar (no mostrar) els següents Arxius i carpetes:" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "tfrmoptionsignorelist.lblsavein.caption" msgid "&Save in:" msgstr "Desar en:" #: tfrmoptionskeyboard.cblynxlike.caption msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "" #: tfrmoptionskeyboard.lblalt.caption #, fuzzy #| msgid "Alt+Letters" msgctxt "tfrmoptionskeyboard.lblalt.caption" msgid "Alt+L&etters" msgstr "Al&t+Lletres" #: tfrmoptionskeyboard.lblctrlalt.caption #, fuzzy #| msgid "Ctrl+Alt+Letters" msgctxt "tfrmoptionskeyboard.lblctrlalt.caption" msgid "Ctrl+Alt+Le&tters" msgstr "&Ctrl+Alt+Lletres" #: tfrmoptionskeyboard.lblnomodifier.caption msgid "&Letters" msgstr "" #: tfrmoptionslayout.cbflatdiskpanel.caption #, fuzzy #| msgid "Flat buttons" msgctxt "tfrmoptionslayout.cbflatdiskpanel.caption" msgid "&Flat buttons" msgstr "Botons plans" #: tfrmoptionslayout.cbflatinterface.caption #, fuzzy #| msgid "Flat interface" msgctxt "tfrmoptionslayout.cbflatinterface.caption" msgid "Flat i&nterface" msgstr "Interficie plana" #: tfrmoptionslayout.cbflattoolbar.caption #, fuzzy #| msgid "Flat buttons" msgctxt "tfrmoptionslayout.cbflattoolbar.caption" msgid "Flat b&uttons" msgstr "Botons plans" #: tfrmoptionslayout.cbfreespaceind.caption #, fuzzy #| msgid "Show free space indicator on drive label" msgctxt "tfrmoptionslayout.cbfreespaceind.caption" msgid "Show fr&ee space indicator on drive label" msgstr "Mostrar l'espai lliure a l'etiqueta del disc" #: tfrmoptionslayout.cblogwindow.caption #, fuzzy #| msgid "Show log window" msgctxt "tfrmoptionslayout.cblogwindow.caption" msgid "Show lo&g window" msgstr "Finestra de registre" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "tfrmoptionslayout.cbpanelofoperations.caption" msgid "Show panel of operation in background" msgstr "Panell d'operació en segon pla" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "tfrmoptionslayout.cbproginmenubar.caption" msgid "Show common progress in menu bar" msgstr "Progres en barra de menú" #: tfrmoptionslayout.cbshowcmdline.caption #, fuzzy #| msgid "Show command &line" msgctxt "tfrmoptionslayout.cbshowcmdline.caption" msgid "Show command l&ine" msgstr "Mostrar &línia de commandes" #: tfrmoptionslayout.cbshowcurdir.caption #, fuzzy #| msgid "Show ¤t directory" msgctxt "tfrmoptionslayout.cbshowcurdir.caption" msgid "Show current director&y" msgstr "Mostrar carpeta actual" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "tfrmoptionslayout.cbshowdiskpanel.caption" msgid "Show &drive buttons" msgstr "Mostrar barra de &discs" #: tfrmoptionslayout.cbshowdrivefreespace.caption #, fuzzy #| msgid "Show free space label" msgctxt "tfrmoptionslayout.cbshowdrivefreespace.caption" msgid "Show free s&pace label" msgstr "Mostrar la etiqueta de espai lliure" #: tfrmoptionslayout.cbshowdriveslistbutton.caption msgid "Show drives list bu&tton" msgstr "" #: tfrmoptionslayout.cbshowkeyspanel.caption #, fuzzy #| msgid "Show &function key buttons" msgctxt "tfrmoptionslayout.cbshowkeyspanel.caption" msgid "Show function &key buttons" msgstr "Mostrar botons de tecla de &funció" #: tfrmoptionslayout.cbshowmainmenu.caption #, fuzzy #| msgid "Show main menu" msgctxt "tfrmoptionslayout.cbshowmainmenu.caption" msgid "Show &main menu" msgstr "Mostrar menú principal" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "tfrmoptionslayout.cbshowmaintoolbar.caption" msgid "Show &button bar" msgstr "Mostrar barra de &botons" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption msgid "Show short free space &label" msgstr "" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "tfrmoptionslayout.cbshowstatusbar.caption" msgid "Show &status bar" msgstr "Mostrar barra de e&stat" #: tfrmoptionslayout.cbshowtabheader.caption #, fuzzy #| msgid "Show &tabstop header" msgctxt "tfrmoptionslayout.cbshowtabheader.caption" msgid "S&how tabstop header" msgstr "Mostrar salts de tabulació" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "tfrmoptionslayout.cbshowtabs.caption" msgid "Sho&w folder tabs" msgstr "Mostrar &pestanyes de carpetes" #: tfrmoptionslayout.cbtermwindow.caption #, fuzzy #| msgid "Show terminal window" msgctxt "tfrmoptionslayout.cbtermwindow.caption" msgid "Show te&rminal window" msgstr "Mostrar finestra de terminal" #: tfrmoptionslayout.cbtwodiskpanels.caption #, fuzzy #| msgid "Show two drive button bars (fixed width, above file windows)" msgctxt "tfrmoptionslayout.cbtwodiskpanels.caption" msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "Barra de &botons de discs (anchura fixa, sobre llista d'arxius)" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "tfrmoptionslayout.gbscreenlayout.caption" msgid " Screen layout " msgstr " Apariència de pantalla" #: tfrmoptionslog.cblogarcop.caption #, fuzzy #| msgid "Pack/Unpack" msgctxt "tfrmoptionslog.cblogarcop.caption" msgid "&Pack/Unpack" msgstr "Comprimir/Descomprimir" #: tfrmoptionslog.cblogcpmvln.caption #, fuzzy #| msgid "Copy/Move/Create link/symlink" msgctxt "tfrmoptionslog.cblogcpmvln.caption" msgid "Cop&y/Move/Create link/symlink" msgstr "Copiar/Moure/Crear Enllaç/enl. Simbòlic" #: tfrmoptionslog.cblogdelete.caption #, fuzzy #| msgid "Delete" msgctxt "tfrmoptionslog.cblogdelete.caption" msgid "&Delete" msgstr "Esborrar" #: tfrmoptionslog.cblogdirop.caption #, fuzzy #| msgid "Create/Delete directories" msgctxt "tfrmoptionslog.cblogdirop.caption" msgid "Crea&te/Delete directories" msgstr "Crear/Esborrar carpetes" #: tfrmoptionslog.cblogerrors.caption msgctxt "tfrmoptionslog.cblogerrors.caption" msgid "Log &errors" msgstr "Registrar &errors" #: tfrmoptionslog.cblogfile.caption #, fuzzy #| msgid "&Create a log file:" msgctxt "tfrmoptionslog.cblogfile.caption" msgid "C&reate a log file:" msgstr "Crear un Arxiu de registre:" #: tfrmoptionslog.cbloginfo.caption #, fuzzy #| msgid "Log information messages" msgctxt "tfrmoptionslog.cbloginfo.caption" msgid "Log &information messages" msgstr "Registrar missatges d'informació" #: tfrmoptionslog.cblogsuccess.caption msgctxt "tfrmoptionslog.cblogsuccess.caption" msgid "Log &successful operations" msgstr "Registrar operacions exito&ses" #: tfrmoptionslog.cblogvfs.caption #, fuzzy #| msgid "File system plugins" msgctxt "tfrmoptionslog.cblogvfs.caption" msgid "&File system plugins" msgstr "Complements de sistema d'Arxius" #: tfrmoptionslog.gblogfile.caption msgctxt "tfrmoptionslog.gblogfile.caption" msgid "File operation log file" msgstr "Registre de les operacions amb Arxius" #: tfrmoptionslog.gblogfileop.caption msgid "Log operations" msgstr "" #: tfrmoptionslog.gblogfilestatus.caption msgid "Operation status" msgstr "" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "" #: tfrmoptionsmisc.chkshowwarningmessages.caption #, fuzzy #| msgid "Show warning messages (\"OK\" button only)" msgctxt "tfrmoptionsmisc.chkshowwarningmessages.caption" msgid "Show &warning messages (\"OK\" button only)" msgstr "Mostrar missatges d'avís (només botó \"Acceptar\")" #: tfrmoptionsmisc.chkthumbsave.caption #, fuzzy #| msgid "Save thumbnails in cache" msgctxt "tfrmoptionsmisc.chkthumbsave.caption" msgid "&Save thumbnails in cache" msgstr "Desar miniatures en caché" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "tfrmoptionsmisc.dblthumbnails.caption" msgid "Thumbnails" msgstr "" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "tfrmoptionsmisc.lblthumbseparator.caption" msgid "X" msgstr "" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "" #: tfrmoptionsmouse.cbselectionbymouse.caption #, fuzzy #| msgid "Selection by mouse" msgctxt "tfrmoptionsmouse.cbselectionbymouse.caption" msgid "&Selection by mouse" msgstr "Selecció per ratolí" #: tfrmoptionsmouse.gbscrolling.caption msgctxt "tfrmoptionsmouse.gbscrolling.caption" msgid "Scrolling" msgstr "Desplaçament" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "" #: tfrmoptionsmouse.lblmousemode.caption #, fuzzy #| msgid "Mode:" msgctxt "tfrmoptionsmouse.lblmousemode.caption" msgid "&Mode:" msgstr "Mode:" #: tfrmoptionsmouse.rbscrolllinebyline.caption #, fuzzy #| msgid "Line by line" msgctxt "tfrmoptionsmouse.rbscrolllinebyline.caption" msgid "&Line by line" msgstr "Número de línies" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption #, fuzzy #| msgid "Line by line with cursor movement" msgctxt "tfrmoptionsmouse.rbscrolllinebylinecursor.caption" msgid "Line by line &with cursor movement" msgstr "Linia a linia amb moviment de cursor" #: tfrmoptionsmouse.rbscrollpagebypage.caption #, fuzzy #| msgid "Page by page" msgctxt "tfrmoptionsmouse.rbscrollpagebypage.caption" msgid "&Page by page" msgstr "Pàgina a pàgina" #: tfrmoptionsplugins.btnaddplugin.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "Afegir" #: tfrmoptionsplugins.btnconfigplugin.caption #, fuzzy #| msgid "Configure" msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "configurar" #: tfrmoptionsplugins.btnenableplugin.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "Registre" #: tfrmoptionsplugins.btnremoveplugin.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "Eliminar" #: tfrmoptionsplugins.btntweakplugin.caption #, fuzzy #| msgid "Tweak" msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "Trucar" #: tfrmoptionsplugins.lbldsxdescription.caption #, fuzzy #| msgid "Search plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "Permetre als complements de cerca el us d'algoritmes de cerca alternatius o eines externes (com \"locate\", etc.)" #: tfrmoptionsplugins.lblwcxdescription.caption #, fuzzy #| msgid "Packer plugins are used to work with archives." msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "Els complements de compresors són utilitzats per treballar amb Arxius." #: tfrmoptionsplugins.lblwdxdescription.caption #, fuzzy #| msgid "Content plugins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "Permetre als complements de contingut mostrar detalls extesos de l'Arxiu com les etiquetes mp3 o en llista d'Arxiu els atributs d'imatge, o usar-los amb les eines de cerca o de reanomenat múltiple" #: tfrmoptionsplugins.lblwfxdescription.caption #, fuzzy #| msgid "File system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "Permetre als complements de sistema d'Arxius accedir a discs inaccesibles por el sistema operatiu o a aparells externs com palm/PocketPC." #: tfrmoptionsplugins.lblwlxdescription.caption #, fuzzy #| msgid "Viewer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "Permetre als complements de visionat mostrar fomats d'arxiu com imatges, fulles de càlcul, bases de dades, etc. en Veure (F3, Ctrl+A)" #: tfrmoptionsplugins.stgplugins.columns[0].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[0].title.caption" msgid "Active" msgstr "Actiu" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[1].title.caption" msgid "Plugin" msgstr "Complement" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[2].title.caption" msgid "Registered for" msgstr "Registrat per" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[3].title.caption" msgid "File name" msgstr "Nom" #: tfrmoptionsplugins.tsdsx.caption #, fuzzy #| msgid "Search plugins (.DSX)" msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "Complements de cerca (.DSX)" #: tfrmoptionsplugins.tswcx.caption #, fuzzy #| msgid "Packer plugins (.WCX)" msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "Complements de compresors (.WCX)" #: tfrmoptionsplugins.tswdx.caption #, fuzzy #| msgid "Content plugins (.WDX)" msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "Complements de contingut(.WDX)" #: tfrmoptionsplugins.tswfx.caption #, fuzzy #| msgid "File system plugins (.WFX)" msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "Complements del sistema de Arxius (.WFX)" #: tfrmoptionsplugins.tswlx.caption #, fuzzy #| msgid "Viewer plugins (.WLX)" msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "Complements de visionat (.WLX)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "tfrmoptionsquicksearchfilter.cbexactbeginning.caption" msgid "&Beginning (name must start with first typed character)" msgstr "&Començament (el nom ha de començar amb el primer caràcter)" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "tfrmoptionsquicksearchfilter.cbexactending.caption" msgid "En&ding (last character before a typed dot . must match)" msgstr "Fi&nal (ha de coincidir el últim caràcter abans d'un punt . )" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "tfrmoptionsquicksearchfilter.cgpoptions.caption" msgid "Options" msgstr "Opcions" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption msgid "Exact name match" msgstr "" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "tfrmoptionstabs.cbtabsactivateonclick.caption" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "Activar &panell cuando es clica en una de les seves pestanyes" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "tfrmoptionstabs.cbtabsalwaysvisible.caption" msgid "&Show tab header also when there is only one tab" msgstr "&Mostrar pestanyes també si nhi ha només una" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption #, fuzzy #| msgid "&Confirm close all tabs" msgctxt "tfrmoptionstabs.cbtabsconfirmcloseall.caption" msgid "Con&firm close all tabs" msgstr "&Confirmar tancar totes les pestanyes" #: tfrmoptionstabs.cbtabslimitoption.caption msgid "&Limit tab title length to" msgstr "" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "tfrmoptionstabs.cbtabslockedasterisk.caption" msgid "Show locked tabs &with an asterisk *" msgstr "Mostrar les pestanyes bloquejades amb un asterisc *" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "tfrmoptionstabs.cbtabsmultilines.caption" msgid "&Tabs on multiple lines" msgstr "&Pestanyes en varies linies" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "tfrmoptionstabs.cbtabsopenforeground.caption" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Ctrl+&Up obre una nova pestanya en primer pla" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "tfrmoptionstabs.cbtabsopennearcurrent.caption" msgid "Open &new tabs near current tab" msgstr "Obre una &nova pestanya al costat de l'actual" #: tfrmoptionstabs.cbtabsshowclosebutton.caption #, fuzzy #| msgid "Show tab close button" msgctxt "tfrmoptionstabs.cbtabsshowclosebutton.caption" msgid "Show ta&b close button" msgstr "Mostrar botó de tancament en pestanya" #: tfrmoptionstabs.gbtabs.caption msgctxt "tfrmoptionstabs.gbtabs.caption" msgid "Folder tabs headers" msgstr "Capçaleres de les pestanyes de carpeta" #: tfrmoptionstabs.lblchar.caption msgctxt "tfrmoptionstabs.lblchar.caption" msgid "characters" msgstr "caràcters" #: tfrmoptionstabs.lbltabsposition.caption msgid "Ta&bs position" msgstr "" #: tfrmoptionsterminal.lblruninterm.caption #, fuzzy #| msgid "Run in terminal:" msgctxt "tfrmoptionsterminal.lblruninterm.caption" msgid "Run in &terminal:" msgstr "Córrer en terminal:" #: tfrmoptionsterminal.lblrunterm.caption #, fuzzy #| msgid "Run terminal:" msgctxt "tfrmoptionsterminal.lblrunterm.caption" msgid "Run t&erminal:" msgstr "Terminal:" #: tfrmoptionstoolbar.btnclonebutton.caption msgid "C&lone button" msgstr "" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "tfrmoptionstoolbar.btndeletebutton.caption" msgid "&Delete" msgstr "&Esborrar" #: tfrmoptionstoolbar.btnedithotkey.caption msgctxt "tfrmoptionstoolbar.btnedithotkey.caption" msgid "Edit hot&key" msgstr "" #: tfrmoptionstoolbar.btninsertbutton.caption msgctxt "tfrmoptionstoolbar.btninsertbutton.caption" msgid "&Insert new button" msgstr "&Insertar nou botó" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "tfrmoptionstoolbar.btnopenfile.caption" msgid ">>" msgstr "" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "tfrmoptionstoolbar.btnopenicon.caption" msgid ">>" msgstr "" #: tfrmoptionstoolbar.btnremovehotkey.caption msgid "Remove hotke&y" msgstr "" #: tfrmoptionstoolbar.cbflatbuttons.caption #, fuzzy #| msgid "Flat b&uttons" msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "Botons plans" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "" #: tfrmoptionstoolbar.gbgroupbox.caption msgctxt "tfrmoptionstoolbar.gbgroupbox.caption" msgid "Appearance" msgstr "Apariència" #: tfrmoptionstoolbar.lblbarsize.caption #, fuzzy #| msgid "Ba&r size:" msgctxt "tfrmoptionstoolbar.lblbarsize.caption" msgid "&Bar size:" msgstr "Mida de Ba&rra" #: tfrmoptionstoolbar.lblexternalcommand.caption msgctxt "tfrmoptionstoolbar.lblexternalcommand.caption" msgid "Comman&d:" msgstr "" #: tfrmoptionstoolbar.lblexternalparameters.caption msgctxt "tfrmoptionstoolbar.lblexternalparameters.caption" msgid "Parameter&s:" msgstr "" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "" #: tfrmoptionstoolbar.lbliconfile.caption msgid "Ico&n:" msgstr "" #: tfrmoptionstoolbar.lbliconsize.caption #, fuzzy #| msgid "Ic&on size:" msgctxt "tfrmoptionstoolbar.lbliconsize.caption" msgid "Icon si&ze:" msgstr "Mida ic&on" #: tfrmoptionstoolbar.lblinternalcommand.caption msgctxt "tfrmoptionstoolbar.lblinternalcommand.caption" msgid "Co&mmand:" msgstr "" #: tfrmoptionstoolbar.lblinternalparameters.caption msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "" #: tfrmoptionstoolbar.lblstartpath.caption msgid "Start pat&h:" msgstr "" #: tfrmoptionstoolbar.lbltooltip.caption msgid "&Tooltip:" msgstr "" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption #, fuzzy #| msgid "Keep terminal window open after executing program" msgctxt "tfrmoptionstoolbase.cbtoolskeepterminalopen.caption" msgid "&Keep terminal window open after executing program" msgstr "Mantenir oberta la finestra del terminal després d'executar el programa" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption #, fuzzy #| msgid "Execute in terminal" msgctxt "tfrmoptionstoolbase.cbtoolsruninterminal.caption" msgid "&Execute in terminal" msgstr "Executar en terminal" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption #, fuzzy #| msgid "Use external program" msgctxt "tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption" msgid "&Use external program" msgstr "Programa extern" #: tfrmoptionstoolbase.lbltoolsparameters.caption #, fuzzy #| msgid "Additional parameters" msgctxt "tfrmoptionstoolbase.lbltoolsparameters.caption" msgid "A&dditional parameters" msgstr "Paràmetres addicionals" #: tfrmoptionstoolbase.lbltoolspath.caption #, fuzzy #| msgid "Path to program to execute" msgctxt "tfrmoptionstoolbase.lbltoolspath.caption" msgid "&Path to program to execute" msgstr "Ruta del programa a executar" #: tfrmoptionstooltips.btnaddfields.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "Afegir" #: tfrmoptionstooltips.btnapplyfields.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "Aplicar" #: tfrmoptionstooltips.btndeletefields.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "Esborrar" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Plantilla..." #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "Camps d'usuari per tipus d'arxiu" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "Mostrar informació emergent" #: tfrmoptionstooltips.lblfieldslist.caption #, fuzzy #| msgid "Category hint:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "Atributs de categoria:" #: tfrmoptionstooltips.lblfieldsmask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "Màscara de categoria:" #: tfrmoptionstooltips.lblfieldsname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "Nom de categoria:" #: tfrmoptionstooltips.rbtooltipallfiles.caption #, fuzzy #| msgid "Show tool tip for all files in file panel" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "Mostrar informació emergent per tots els Arxius del panell" #: tfrmoptionstooltips.rbtooltipnone.caption #, fuzzy #| msgid "Don't show" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "No mostrar" #: tfrmoptionstooltips.rbtooltiponlylarge.caption #, fuzzy #| msgid "Show tool tip for files in file panel if truncated" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "Mostrar informació emergent per els Arxius si el panell es talla" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "tfrmoptionsviewer.btnbackviewercolor.caption" msgid ">>" msgstr "" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "tfrmoptionsviewer.btnfontviewercolor.caption" msgid ">>" msgstr "" #: tfrmoptionsviewer.gbviewerbookmode.caption msgctxt "tfrmoptionsviewer.gbviewerbookmode.caption" msgid "Viewer Book Mode" msgstr "Veure en mode llibre" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "tfrmoptionsviewer.gbviewerexample.caption" msgid "Example" msgstr "Exemple" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption #, fuzzy #| msgid "Background color in book viewer" msgctxt "tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption" msgid "&Background color in book viewer" msgstr "Color de segon pla en vista de llibre" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption #, fuzzy #| msgid "Font color in book viewer" msgctxt "tfrmoptionsviewer.lblfontcolorviewerbook.caption" msgid "&Font color in book viewer" msgstr "Color de Font en vista de llibre" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption #, fuzzy #| msgid "Number of columns in book viewer" msgctxt "tfrmoptionsviewer.lblnumbercolumnsviewer.caption" msgid "&Number of columns in book viewer" msgstr "Número de columnes en vista de llibre" #: tfrmpackdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancel.lar" #: tfrmpackdlg.btnconfig.caption #, fuzzy #| msgid "&Configure" msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "&Configurar" #: tfrmpackdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Ajuda" #: tfrmpackdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "Acceptar" #: tfrmpackdlg.caption msgctxt "tfrmpackdlg.caption" msgid "Pack files" msgstr "Comprimir" #: tfrmpackdlg.cbcreateseparatearchives.caption #, fuzzy #| msgid "Create separate archives, o&ne per selected file/dir" msgid "C&reate separate archives, one per selected file/dir" msgstr "Crear Arxius separats, u&n per Arxiu/carpeta" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "Crear Arxiu autoe&xtraible" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "Encr&iptar" #: tfrmpackdlg.cbmovetoarchive.caption #, fuzzy #| msgid "M&ove to archive" msgid "Mo&ve to archive" msgstr "Moure &original(s) a Arxiu Comprimit" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "Arxiu de disc &múltiple" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "=>" #: tfrmpackdlg.cbputintarfirst.caption #, fuzzy #| msgid "Put in the TAR archive first" msgid "P&ut in the TAR archive first" msgstr "Pre-comprimir en TAR primer" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "Incluir noms de car&petes (només recursiu)" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "Comprimir en el Arxiu:" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "Compressor" #: tfrmpackinfodlg.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Tancar" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "Descomprimir Tot i executar" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "Descomprimir i executar" #: tfrmpackinfodlg.caption msgctxt "tfrmpackinfodlg.caption" msgid "Properties of packed file" msgstr "Propietats de l'arxiu Comprimit" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "Atributs:" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "Rati de compressió:" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "Data:" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "Mètode:" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "Mida orginal:" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "Arxiu:" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "Mida Comprimit:" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "Compressor:" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "Temps:" #: tfrmquicksearch.btncancel.caption msgctxt "tfrmquicksearch.btncancel.caption" msgid "X" msgstr "" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "" #: tfrmquicksearch.tglfilter.caption msgctxt "tfrmquicksearch.tglfilter.caption" msgid "Filter" msgstr "Filtre" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "tfrmselecttextrange.btppanel.cancelbutton.caption" msgid "Cancel" msgstr "Cancel.lar" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "tfrmselecttextrange.btppanel.closebutton.caption" msgid "&Close" msgstr "&Tancar" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "tfrmselecttextrange.btppanel.helpbutton.caption" msgid "&Help" msgstr "A&juda" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "tfrmselecttextrange.btppanel.okbutton.caption" msgid "&OK" msgstr "&Acceptar" #: tfrmselecttextrange.lblselecttext.caption msgid "&Select the characters to insert:" msgstr "" #: tfrmsetfileproperties.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancel.lar" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "&Acceptar" #: tfrmsetfileproperties.caption msgctxt "tfrmsetfileproperties.caption" msgid "Change attributes" msgstr "Canviar atributs" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Enganxós" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "Arxiu" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "Creat:" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "Ocult" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "Accedit:" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "Modificat:" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "Només lectura" #: tfrmsetfileproperties.chkrecursive.caption #, fuzzy #| msgid "Recursive" msgid "Including subfolders" msgstr "Incloent subcarpetes" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "Sistema" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "Propietats de la data" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atributs" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atributs" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Grup" #: tfrmsetfileproperties.lblattrinfo.caption msgid "(gray field means unchanged value)" msgstr "(camp gris significa valor sense canvi)" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Altres" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Propietari" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Text:" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Execució" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Lectura" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Escriptura" #: tfrmsplitter.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Sortir" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "Acceptar" #: tfrmsplitter.caption msgctxt "tfrmsplitter.caption" msgid "Splitter" msgstr "Divisor" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664B - 3.5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "Nom de Arxiu" #: tfrmsplitter.grbxsize.caption #, fuzzy #| msgid "File size" msgid "Size and number of parts" msgstr "Mida" #: tfrmsplitter.lbdirtarget.caption #, fuzzy #| msgid "Directory target" msgid "Directory &target" msgstr "Ruta de desti" #: tfrmsplitter.lbfilesource.caption #, fuzzy #| msgid "File source" msgid "File &source" msgstr "Arxiu Font" #: tfrmsplitter.lblnumberparts.caption #, fuzzy #| msgid "Number of parts" msgid "&Number of parts" msgstr "Número de parts" #: tfrmsplitter.rbtngigab.caption msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "" #: tfrmsplitter.rbtnkilob.caption msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "" #: tfrmsplitter.rbtnmegab.caption msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "" #: tfrmsymlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancel.lar" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&Acceptar" #: tfrmsymlink.caption #, fuzzy #| msgid "Create symlink" msgid "Create symbolic link" msgstr "Crear Enllaç Simbòlic" #: tfrmsymlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Destí (on s'enlaçarà)" #: tfrmsymlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Nom de l'Enllaç" #: tfrmtweakplugin.btnadd.caption #, fuzzy #| msgid "Add new" msgid "A&dd new" msgstr "Afegir nou" #: tfrmtweakplugin.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancel.lar" #: tfrmtweakplugin.btnchange.caption #, fuzzy #| msgid "Change" msgid "C&hange" msgstr "Canviar" #: tfrmtweakplugin.btndefault.caption #, fuzzy #| msgid "Default" msgid "De&fault" msgstr "Per Defecte" #: tfrmtweakplugin.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "Acceptar" #: tfrmtweakplugin.btnremove.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "Eliminar" #: tfrmtweakplugin.caption msgctxt "tfrmtweakplugin.caption" msgid "Tweak plugin" msgstr "Trucar complement" #: tfrmtweakplugin.cbpk_caps_by_content.caption #, fuzzy #| msgid "Detect archive type by content" msgid "De&tect archive type by content" msgstr "Detectar tipus d'arxiu per contingut" #: tfrmtweakplugin.cbpk_caps_delete.caption #, fuzzy #| msgid "Can delete files" msgid "Can de&lete files" msgstr "Pot esborrar Arxius" #: tfrmtweakplugin.cbpk_caps_encrypt.caption #, fuzzy #| msgid "Supports encryption" msgid "Supports e&ncryption" msgstr "Suporta encriptat" #: tfrmtweakplugin.cbpk_caps_hide.caption #, fuzzy #| msgid "Show as normal files (hide packer icon)" msgid "Sho&w as normal files (hide packer icon)" msgstr "Mostrar com Arxius normals (ocultar icon Comprimit)" #: tfrmtweakplugin.cbpk_caps_mempack.caption #, fuzzy #| msgid "Supports packing in memory" msgid "Supports pac&king in memory" msgstr "Suporta compresió en memòria" #: tfrmtweakplugin.cbpk_caps_modify.caption #, fuzzy #| msgid "Can modify exisiting archives" msgid "Can &modify exisiting archives" msgstr "Pot modificar els Arxius existents" #: tfrmtweakplugin.cbpk_caps_multiple.caption #, fuzzy #| msgid "Archive can contain multiple files" msgid "&Archive can contain multiple files" msgstr "L'Arxiu pot contenir múltiples Arxius" #: tfrmtweakplugin.cbpk_caps_new.caption #, fuzzy #| msgid "Can create new archives" msgid "Can create new archi&ves" msgstr "Pot crear nous Arxius" #: tfrmtweakplugin.cbpk_caps_options.caption #, fuzzy #| msgid "Supports the options dialogbox" msgid "S&upports the options dialogbox" msgstr "Suporta la finestra de diàleg amb opcions" #: tfrmtweakplugin.cbpk_caps_searchtext.caption #, fuzzy #| msgid "Allow searching for text in archives" msgid "Allow searchin&g for text in archives" msgstr "Permet cercar text dins els arxius" #: tfrmtweakplugin.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "Descripció:" #: tfrmtweakplugin.lbldetectstr.caption #, fuzzy #| msgid "Detect string:" msgid "D&etect string:" msgstr "Detectar cadena:" #: tfrmtweakplugin.lblextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "Extensió:" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "Banderes:" #: tfrmtweakplugin.lblname.caption #, fuzzy #| msgid "Name:" msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "Nom:" #: tfrmtweakplugin.lblplugin.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "Complement:" #: tfrmtweakplugin.lblplugin1.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "Complement:" #: tfrmviewer.actabout.caption msgctxt "tfrmviewer.actabout.caption" msgid "About Viewer..." msgstr "Quant al visor..." #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "" #: tfrmviewer.actcopyfile.caption msgctxt "tfrmviewer.actcopyfile.caption" msgid "Copy File" msgstr "" #: tfrmviewer.actcopyfile.hint msgctxt "tfrmviewer.actcopyfile.hint" msgid "Copy File" msgstr "" #: tfrmviewer.actdeletefile.caption msgctxt "tfrmviewer.actdeletefile.caption" msgid "Delete File" msgstr "" #: tfrmviewer.actdeletefile.hint msgctxt "tfrmviewer.actdeletefile.hint" msgid "Delete File" msgstr "" #: tfrmviewer.actloadnextfile.caption msgctxt "tfrmviewer.actloadnextfile.caption" msgid "&Next" msgstr "&Següent" #: tfrmviewer.actloadnextfile.hint msgid "Load Next File" msgstr "" #: tfrmviewer.actloadprevfile.caption msgctxt "tfrmviewer.actloadprevfile.caption" msgid "&Previous" msgstr "&Anterior" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "" #: tfrmviewer.actmirror.caption msgctxt "tfrmviewer.actmirror.caption" msgid "Mirror" msgstr "Mirall" #: tfrmviewer.actmirror.hint msgctxt "tfrmviewer.actmirror.hint" msgid "Mirror" msgstr "Espill" #: tfrmviewer.actmovefile.caption msgctxt "tfrmviewer.actmovefile.caption" msgid "Move File" msgstr "" #: tfrmviewer.actmovefile.hint msgctxt "tfrmviewer.actmovefile.hint" msgid "Move File" msgstr "" #: tfrmviewer.actreload.caption msgctxt "tfrmviewer.actreload.caption" msgid "Reload" msgstr "Recarregar" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "" #: tfrmviewer.actrotate180.caption msgctxt "tfrmviewer.actrotate180.caption" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate180.hint msgctxt "tfrmviewer.actrotate180.hint" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate270.caption msgctxt "tfrmviewer.actrotate270.caption" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate270.hint msgctxt "tfrmviewer.actrotate270.hint" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate90.caption msgctxt "tfrmviewer.actrotate90.caption" msgid "Rotate 90" msgstr "" #: tfrmviewer.actrotate90.hint msgctxt "tfrmviewer.actrotate90.hint" msgid "Rotate 90" msgstr "" #: tfrmviewer.actsaveas.caption msgctxt "tfrmviewer.actsaveas.caption" msgid "Save As..." msgstr "Desar com..." #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "" #: tfrmviewer.actstretchimage.caption msgctxt "tfrmviewer.actstretchimage.caption" msgid "Stretch" msgstr "Aprimar" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "Copiar" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "Copiar" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "Esborrar" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "Esborrar" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "Pantalla completa" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "Realçar" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "Mirall" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "Moure" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "Moure" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "Dibuixar" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "Ulls Vermells" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "Canviar mida" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "Desfer" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "Apropar" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "Allunyar" #: tfrmviewer.caption msgctxt "tfrmviewer.caption" msgid "Viewer" msgstr "Visor" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Diapositives" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "Llapis" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "Destacar" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "Pintar" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Diapositives" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "Veure" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "Quant a" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "Mostrar com &Binari" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "Copiar al portapapers" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Editar" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "&Codificació" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "&Sortir" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "&Arxiu" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "Pantalla completa" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "Gràfics" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "Mostrar com &Hex" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "&Imatge" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "Veure com un llibre" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "Espill" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "Complements" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "Vista prèvia" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "Imprimir..." #: tfrmviewer.mirotate.caption msgid "Rotate" msgstr "Rotar" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "Desar" #: tfrmviewer.misaveas.caption msgctxt "tfrmviewer.misaveas.caption" msgid "Save As..." msgstr "Desar com..." #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "Captura" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "Cercar" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "Cercar següent" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "Cercar previ" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "Seleccionar Tot" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "" #: tfrmviewer.mistretch.caption msgctxt "tfrmviewer.mistretch.caption" msgid "Stretch" msgstr "Aprimar" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "Mostrar com &Text" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "&Veure" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "Ajustar linies" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "Apropar" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "Allunyar" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "Copiar al portapapers" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "Seleccionar Tot" #: tfrmviewoperations.btnstartpause.caption msgctxt "tfrmviewoperations.btnstartpause.caption" msgid "&Start" msgstr "Començar" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "" #: tfrmviewoperations.caption msgctxt "tfrmviewoperations.caption" msgid "File operations" msgstr "Operacions amb Arxius" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "" #: tfrmviewoperations.mnucanceloperation.caption msgctxt "tfrmviewoperations.mnucanceloperation.caption" msgid "Cancel" msgstr "Cancel.lar" #: tfrmviewoperations.mnucancelqueue.caption #, fuzzy #| msgid "Cancel" msgctxt "tfrmviewoperations.mnucancelqueue.caption" msgid "Cancel" msgstr "Cancel.lar" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "tfrmviewoperations.mnuoperationshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "" #: tfrmviewoperations.mnuqueue.caption msgctxt "tfrmviewoperations.mnuqueue.caption" msgid "Queue" msgstr "" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "tfrmviewoperations.mnuqueueshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "tmultiarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Quan l'arxiu existi" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "twcxarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Quan l'arxiu existi" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Quan l'arxiu existi" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "" #: ulng.rscolattr msgid "Attr" msgstr "Atrib" #: ulng.rscoldate msgid "Date" msgstr "Data" #: ulng.rscolext msgid "Ext" msgstr "Ext" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "Nom" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "Mida" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "Número de canvis" #: ulng.rsconfcolalign msgid "Align" msgstr "Aliniar" #: ulng.rsconfcolcaption msgid "Caption" msgstr "Text" #: ulng.rsconfcolconfig msgid "Config" msgstr "Config" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "Esborrar" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "Continguts de camps" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "Moure" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "Amplada" #: ulng.rsconfcustheader msgid "Customize column" msgstr "Columna personalitzada" #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "Copiar (%d) %s" #: ulng.rsdlgallopcomplete #, fuzzy #| msgid "All operations is complete" msgid "All operations completed" msgstr "S'han completat totes les operacions" #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "Progrès de totes les operacions %d %%" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "Ab&ortar" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "Tots" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "&Afegir" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "&Cancel.lar" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "Copiar dins" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "Copiar tot a dins" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "" #: ulng.rsdlgbuttonno msgid "&No" msgstr "&No" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "&Ningun" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "&Acceptar" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "Sobreescriure" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "Sobreescriure &Tot" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "Reintentar" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "&Saltar" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "Saltar Tots" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "&Sí" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "Calcular Arxius i carpetes" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "Calcular suma de comprovació" #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "Verificar suma de comprovació" #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "Copiar Arxiu(s)" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "Esborrar Arxiu(s)" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "Moure Arxiu(s)" #: ulng.rsdlgoppause #, fuzzy #| msgid "Pause" msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "Pausa" #: ulng.rsdlgopstart #, fuzzy #| msgid "Start" msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "Començar" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "Velocitat %s/s" #: ulng.rsdlgspeedtime #, fuzzy #| msgid "Speed %s/s, time remaining s%" msgid "Speed %s/s, time remaining %s" msgstr "Velocitat %s/s, temps restant %s" #: ulng.rsdlgsplit #, fuzzy #| msgid "Split file" msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "Dividir Arxiu" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "Destruir Arxiu(s)" #: ulng.rsdrivenolabel msgid "" msgstr "" #: ulng.rsdrivenomedia msgid "" msgstr "" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Editor intern de Double Commander." #: ulng.rseditnewfile msgid "new.txt" msgstr "nou.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "Nom d'Arxiu:" #: ulng.rseditnewopen msgid "Open file" msgstr "Obrir Arxiu" #: ulng.rseditsearchback msgid "&Backward" msgstr "Enrera" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "Cerca" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "Endavant" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "Reemplaçar" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "" #: ulng.rsfileopsetpropertyerroroptions msgctxt "ulng.rsfileopsetpropertyerroroptions" msgid "Ask;Don't set anymore;Ignore errors" msgstr "" #: ulng.rsfilterstatus msgid "FILTER" msgstr "" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "Definir plantilla" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "%s nivell(s)" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "Tot (profunditat sense límits)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "només carpeta actual" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "¡La carpeta %s no existeix!" #: ulng.rsfindfound msgid "Found: %d" msgstr "Trobat: %d" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "Desar platilla de cerca" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "Nom de plantilla:" #: ulng.rsfindscanned msgid "Scanned: %d" msgstr "Trobats: %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "Cercant" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "Cercar Arxius" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "Començar en" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr " %s de %s bytes lliures" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "%s bytes lliures" #: ulng.rsfuncatime msgid "Access date/time" msgstr "Data/temps d'acces" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "Atributs" #: ulng.rsfunccomment msgid "Comment" msgstr "Comentari" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "data/temps de creació" #: ulng.rsfuncext msgid "Extension" msgstr "Extensió" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "Grup" #: ulng.rsfunclinkto msgid "Link to" msgstr "Enllaçar a" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "Data/temps de modificació" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "Nom" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "Nom sense extensió" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "Propietari" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "Ruta" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "Mida" #: ulng.rsfunctype msgid "Type" msgstr "Tipus" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "Error creant l'Enllaç fort" #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "Differ(comparador)" #: ulng.rshotkeycategorymain msgid "Main" msgstr "" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "Visor" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "Enllaçat complet" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "Màscara a deseleccionar" #: ulng.rsmarkplus msgid "Select mask" msgstr "Màscara a seleccionar" #: ulng.rsmaskinput msgid "Input mask:" msgstr "Màscara d'entrada:" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "Configurar columnes a mida" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "Configurar aquesta vista de columnes a mida" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "Accions" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "Editar" #: ulng.rsmnueject msgid "Eject" msgstr "Explulsar" #: ulng.rsmnumount msgid "Mount" msgstr "Muntar" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "Nou" #: ulng.rsmnunomedia msgid "No media available" msgstr "No hi ha cap medi disponible" #: ulng.rsmnuopenwith #, fuzzy #| msgid "Open with ..." msgid "Open with" msgstr "Obrir amb ..." #: ulng.rsmnuopenwithother msgid "Other..." msgstr "" #: ulng.rsmnusortby msgid "Sort by" msgstr "Ordenar" #: ulng.rsmnuumount msgid "Unmount" msgstr "Desmuntar" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "Veure" #: ulng.rsmsgaccount msgid "Account:" msgstr "Compte:" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "Paràmetres adicionals par la linia de commandes:" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "No es pot copiar/moure un Arxiu \"%s\" dins d'ell mateix" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "Impossible canviar a [%s]!" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "¿Tancar totes les pestanyes inactives?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "Aquesta pestanya (%s) està blocada! La tanco? " #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "Està segur d'eixir?" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "Copiar %d Arxius/carpetes seleccionats?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "Copiar \"%s\"?" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "Esborrar %d Arxius/carpetes seleccionats?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "Enviar %d Arxius/carpetes seleccionats a la paperera?" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "Esborrar \"%s\"?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "Enviar \"%s\" a la paperera?" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "No puc enviar \"%s\" a la paperera!¿Ho esborro directament?" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "Disc no disponible" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "Introdueix l'extensió de l'arxiu:" #: ulng.rsmsgentername msgid "Enter name:" msgstr "Introdueix el nom:" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "Error de CRC en les dades" #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "Dades corruptes" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "No puc connectar amb el servidor: \"%s\"" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "No puc copiar l'Arxiu %s a %s" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "Ja existeix una carpeta anomenada \"%s\"." #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "La data %s no es suporta" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "La carpeta %s ja existeix!" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "Función abortada per l'usuari" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "Error tancant l'Arxiu" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "Impossible crear l'Arxiu" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "No hi ha més Arxius en l'Arxiu" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "Impossible obrir l'Arxiu existent" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "Error llegint del Arxiu" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "Error escrivint en el Arxiu" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "No es pot crear la carpeta %s!" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "Enllaç no vàlid" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "No s'han trobat Arxius" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "Memòria insuficient" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "Funció no suportada!" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "Error de sintaxi en expresió regular!" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "No es pot reanomenar l'Arxiu %s a %s" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "No es pot desar l'Arxiu" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "No es pot fixar atributs per \"%s" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "No es pot fixar data/temps per \"%s" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "Buffer massa petit" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "Massa Arxius per comprimir!" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "Format d'Arxiu desconegut" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "%s ha canviat, desar?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "%s existeix ¿sobreescriure" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "Operacions d'Arxiu actives" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "Algunes operacions d'Arxiu no han acabat encara. Si tanca Double Commander pot perdre dades." #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "L'Arxiu %s s'ha marcat com de només lectura, l'esborro?" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "La Mida de l'Arxiu de \"%s\" és massa gran per al seu destí!" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "La carpeta %s existeix, la sobreescric?" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "¿Segueixo l' Enllaç dur \"%s\"?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "Nom no vàlid" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "" #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "Selecció no vàlida" #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "Carregant la llista d'Arxius ..." #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "Copiar Arxiu %s" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "Esborrar Arxiu %s" #: ulng.rsmsglogerror msgid "Error: " msgstr "Error: " #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "Extreure Arxiu %s" #: ulng.rsmsgloginfo msgid "Info: " msgstr "Informació: " #: ulng.rsmsgloglink msgid "Create link %s" msgstr "Crear Enllaç %s" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "Crear carpeta %s" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "Moure Arxiu %s" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "Comprimir en Arxiu %s" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "Eliminar carpeta %s" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "Fet: " #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "Crear Enllaç Simbòlic %s" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "Examinar la integritat de l'Arxiu %s" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "Afegir manualment una ruta calenta" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "Editar manualment una ruta calenta" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "Introdueixi nom i ruta (format nom=ruta):" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "Contrasenya mestra" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "Per favor, introdueixi la contrasenya mestra:" #: ulng.rsmsgnewfile msgid "New file" msgstr "Nou Arxiu" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "Es descomprimirà el següent volum" #: ulng.rsmsgnofiles msgid "No files" msgstr "" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "Ningun Arxiu seleccionat." #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "Espai insuficient en disc de destí, Continuar?" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "Espai insuficient en disc de destí, Reintentar?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "Impossible esborrar %s" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "No implementat" #: ulng.rsmsgpassword msgid "Password:" msgstr "Contrasenya:" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "Per favor, introdueixi la contrasenya:" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "Contrasenya (Firewall):" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "&Afegir %s" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "&Configurar" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "&Esborrar %s" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "La configuració \"%s\" ja exiteix.¿Sobreescriure?" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "Reanomenar/moure %d Arxius/carpetes seleccionats?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "Reanomenar/moure \"%s\"?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "Per favor, reinicie Double Commander per aplicar canvis" #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "Per favor, seleccioni només Arxius de comprovació" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "Esculli localització del següent volum" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "Posar etiqueta al volumen" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "Reanomenar pestanya" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "Nom de la nova pestanya:" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "Ruta cercada:" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "Massa Arxius seleccionats." #: ulng.rsmsgurl msgid "URL:" msgstr "" #: ulng.rsmsgusername msgid "User name:" msgstr "Nom d'usuari:" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "Nom d'usuari (Firewall):" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "Etiqueta del Volum:" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "Per favor, introdueixi el nom del volum:" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "Destrueixo %d Arxius/carpetes seleccionats?" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "Destrueixo \"%s\"?" #: ulng.rsmulrenfilenamestylelist #, fuzzy #| msgid "No change;UPPERCASE;lowercase;First Char Big;" msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "Sense canvis;MAJÚSCULES;minúscules;Primera Majúscula;" #: ulng.rsoperaborted msgid "Aborted" msgstr "Interromput" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "Calculant" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "" #: ulng.rsopercombining msgid "Joining" msgstr "" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopying msgid "Copying" msgstr "" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "Esborrant" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "" #: ulng.rsoperexecuting msgid "Executing" msgstr "" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "" #: ulng.rsoperextracting msgid "Extracting" msgstr "" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperfinished msgid "Finished" msgstr "Finalitzat" #: ulng.rsoperlisting msgid "Listing" msgstr "" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "" #: ulng.rsopermoving msgid "Moving" msgstr "" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "" #: ulng.rsopernotstarted msgid "Not started" msgstr "No iniciat" #: ulng.rsoperpacking msgid "Packing" msgstr "" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpaused msgid "Paused" msgstr "Pausat" #: ulng.rsoperpausing msgid "Pausing" msgstr "Pausant" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "En cua" #: ulng.rsoperrunning msgid "Running" msgstr "Funcionant" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "" #: ulng.rsopersplitting msgid "Splitting" msgstr "" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperstarting msgid "Starting" msgstr "Iniciant" #: ulng.rsoperstopped msgid "Stopped" msgstr "Parat" #: ulng.rsoperstopping msgid "Stopping" msgstr "Parant" #: ulng.rsopertesting msgid "Testing" msgstr "" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "Esperant per accedir al Arxiu" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "Esperant per la resposta del usuario" #: ulng.rsoperwiping msgid "Wiping" msgstr "" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "" #: ulng.rsoperworking msgid "Working" msgstr "" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "Esborrar" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "Extreure sense ruta:" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "Format mode d'anàlisis" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "Posició ID:" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "Rang de cerca ID:" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "Paràmetre" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "Pregunta per la contrasenya:" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "Crear Arxiu autoextraible:" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "Prova:" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "Nom del tipus d'Arxiu:" #: ulng.rsoptarchivevalue msgid "Value" msgstr "Valor" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "Complement associat \"%s\" con:" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "Primer;Últim;" #: ulng.rsoptdisable msgid "Disable" msgstr "Deshabilitat" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "Registre" #: ulng.rsoptenterext msgid "Enter extension" msgstr "Introduir extensió" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "Cursor" #: ulng.rsoptexamplemark msgid "Mark" msgstr "Marca" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "Marca + Cursor" #: ulng.rsoptexampletext msgid "Text" msgstr "Text" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "" #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "" #: ulng.rsopthotkeysdeletetrashcanoverrides msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "Tecles ràpides" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "Tecles ràpides" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "Paràmetres" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "" #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "Dracera en us" #: ulng.rsopthotkeysshortcutusedtext1 #, fuzzy #| msgid "Shortcut %s is already used for %s." msgid "Shortcut %s is already used." msgstr "La Dracera %s ja el fa servir " #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "Canviar-lo a %s ?" #: ulng.rsopthotkeysusedby #, fuzzy #| msgid "used by" msgid "used for %s in %s" msgstr "Usat per %s %s" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "Compressors" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "Actualitzar" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "Comportament" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "Colors" #: ulng.rsoptionseditorcolumnsview msgctxt "ulng.rsoptionseditorcolumnsview" msgid "Columns" msgstr "Columnes" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "Configuració" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "" #: ulng.rsoptionseditorfileoperations msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "Operacions amb Arxius" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "Panells d'Arxius" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "Tipus d'Arxius" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "Pestanyes de carpeta" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "Fonts" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "Tecles ràpides" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "Icons" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "Ignorar llista" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "Idioma" #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "Apariència" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "Registre" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "Varis" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "Complements" #: ulng.rsoptionseditorquicksearch #, fuzzy #| msgid "Quick search" msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "Cerca ràpida" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "Eines" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "Informació emergent" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "Botó esquerra; Botó dret;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "El complement %s s'ha assignat ja a la següent extensió:" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "Actiu" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "Ruta del complement" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "Nom" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "Registrat per" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "Alfabèticament, considerant accents; Ordre natural: alfabètic i números" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "Amunt;Avall;" #: ulng.rsopttoolbarbuttontype msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "No es pot canviar els drets d'accés per \"%s\"" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "No es pot canviar el Propietari per \"%s\"" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "Arxiu" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "Carpeta" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "Pipe nom" #: ulng.rspropsno msgid "No" msgstr "No" #: ulng.rspropssocket msgid "Socket" msgstr "Socket" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "Arxiu de blocs especial" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "Arxiu de caràcter especial" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "Enllaç Simbòlic" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "Tipus desconegut" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "Sí" #: ulng.rssearchresult msgid "Search result" msgstr "Cercar resultat" #: ulng.rssearchtemplateunnamed msgid "" msgstr "" #: ulng.rsselectdir msgid "Select a directory" msgstr "Escull una carpeta" #: ulng.rsshowhelpfor msgid "&Show help for %s" msgstr "" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "Arxius: %d, Carpetas: %d, Mida: %s (%s bytes)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "No s'ha pogut crear carpeta al destí!" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "Format de Mida incorrecte!" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "Impossible dividir l'Arxiu!" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "Escoltim, el nombre de parts es major de 100! ¿continuar?" #: ulng.rssplitseldir msgid "Select directory:" msgstr "Escull carpeta:" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "Error creant l'Enllaç Simbòlic." #: ulng.rssyndefaulttext msgid "Default text" msgstr "" #: ulng.rssynlangplaintext msgid "Plain text" msgstr "" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "Dia(s)" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "Hora(s)" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "Minut(s)" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "Mes(es)" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "Segon(s)" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "Setmana(s)" #: ulng.rstimeunityear msgid "Year(s)" msgstr "Any(s)" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "Differ(comparador)" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "Editor" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "Visor" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "Per favor, informi d'aquest error al traçador de bugs amb una descripció del que estava fent: %sPresioni %s per continuar o %s per avortar el programa." #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "Xarxa" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "Visor intern de Double Commander." #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "Codificació" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "%s no trobat!" doublecmd-0.5.8/language/doublecmd.bg.po0000644000175000017500000067301612250633131017167 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.5 alpha\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-01-17 23:08+0300\n" "PO-Revision-Date: 2010-08-25 12:45+0200\n" "Last-Translator: \n" "Language-Team: Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Bulgarian\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "Всички" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "Всички" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "Всички" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "Всички" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "Всички" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "Всички" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "Всички" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "Отказ" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "..." #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "->" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "&Добре" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "<-" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "Настройка на изгледа на нагласените стълбове" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "Подцветка:" #: tfcolumnssetconf.cbcursorborder.caption msgid "Cursor border" msgstr "Обрамчване на показалеца" #: tfcolumnssetconf.cbovercolor.caption msgid "Allow Overcolor" msgstr "Позволяване на надцветка" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "Използване на нагласени шрифт и цвят" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "Цявят на текста:" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "Шрифт" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "Размер:" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "Подцвяетка 2:" #: tfcolumnssetconf.lblconfigviewnr.caption msgid "Configure view nr:" msgstr "Настройка на изглед №" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "Цвят на показалеца:" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "Текст на показалеца:" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "Цвят на отбелязване:" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "Име" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "Добавяне на стълб" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "Нагласяване на стълбове:" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "Преглед" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption msgid "C&heck free space" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption msgid "Cop&y attributes" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption msgid "Copy o&wnership" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption msgid "Copy d&ate/time" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption msgid "Correct lin&ks" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "Изоставяне на стяга „само за четене“" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption msgid "E&xclude empty directories" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption msgid "Fo&llow links" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "" #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption msgid "When dir&ectory exists" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption msgid "When ca&nnot set property" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "" #: tfrmabout.btnclose.caption msgctxt "TFRMABOUT.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Затваряне" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "За" #: tfrmabout.lblbuild.caption msgid "Build" msgstr "Постройка" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "Free Pascal" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "Домашна страница:" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "http://doublecmd.sourceforge.net" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "Lazarus" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "Преработка" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption msgid "Version" msgstr "Издание" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Отказ" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&Добре" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "О&чистване" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "Изберете принадлежности" #: tfrmattributesedit.cbarchive.caption #, fuzzy #| msgid "Archive" msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "Архив" #: tfrmattributesedit.cbcompressed.caption #, fuzzy #| msgid "Compressed" msgid "Co&mpressed" msgstr "Уплътнен" #: tfrmattributesedit.cbdirectory.caption #, fuzzy #| msgid "Directory" msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "Папка" #: tfrmattributesedit.cbencrypted.caption #, fuzzy #| msgid "Encrypted" msgid "&Encrypted" msgstr "Криптиран" #: tfrmattributesedit.cbhidden.caption #, fuzzy #| msgid "Hidden" msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "Скрит" #: tfrmattributesedit.cbreadonly.caption #, fuzzy #| msgid "Read only" msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "Само за четене" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "" #: tfrmattributesedit.cbsparse.caption msgid "S&parse" msgstr "" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Лешкав" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "" #: tfrmattributesedit.cbsymlink.caption #, fuzzy #| msgid "Symlink" msgid "&Symlink" msgstr "Мека връзка" #: tfrmattributesedit.cbsystem.caption #, fuzzy #| msgid "System" msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "Системен" #: tfrmattributesedit.cbtemporary.caption #, fuzzy #| msgid "Temporary" msgid "&Temporary" msgstr "Временен" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "Принадлежности по NTFS" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "Об щи принадлежности" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Разряда:" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Група" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Друго:" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Собственик" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "Изпълнение" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "Запис" #: tfrmattributesedit.lbltextattrs.caption #, fuzzy #| msgid "As text:" msgid "As te&xt:" msgstr "Като текст:" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "Четене" #: tfrmchecksumcalc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Отказ" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "&Добре" #: tfrmchecksumcalc.caption msgctxt "tfrmchecksumcalc.caption" msgid "Calculate check sum..." msgstr "Изчисляване на проверочен сбор..." #: tfrmchecksumcalc.cbseparatefile.caption #, fuzzy #| msgid "Create separate checksum file for each file" msgid "C&reate separate checksum file for each file" msgstr "Създаване на отделни проверчони сборове за всички файлове" #: tfrmchecksumcalc.lblsaveto.caption #, fuzzy #| msgid "Save check sum file(s) to:" msgid "&Save check sum file(s) to:" msgstr "Запис на файла/овете с проверочните сборове в:" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Затваряне" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "Сверяване на проверочен сбор..." #: tfrmconnectionmanager.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "Добавяне" #: tfrmconnectionmanager.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Отказ" #: tfrmconnectionmanager.btnconnect.caption #, fuzzy #| msgid "Connect" msgid "C&onnect" msgstr "Закачане" #: tfrmconnectionmanager.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Изтриване" #: tfrmconnectionmanager.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Обработка" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "Управител на свързванията" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "Закачане към:" #: tfrmcopydlg.btnaddtoqueue.caption msgid "A&dd To Queue" msgstr "" #: tfrmcopydlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Отказ" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "tfrmcopydlg.btncreatespecialqueue.caption" msgid "..." msgstr "..." #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "Въз&можности" #: tfrmcopydlg.btnsaveoptions.caption #, fuzzy #| msgid "Save these options as default" msgid "Sa&ve these options as default" msgstr "Запис на настройките като подразбирани" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "Презапис на файл(ове)" #: tfrmdescredit.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Отказ" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&Добре" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "Бележки за файл/папка" #: tfrmdescredit.lbleditcommentfor.caption #, fuzzy #| msgid "Edit comment for:" msgid "E&dit comment for:" msgstr "Промяна на бележката за:" #: tfrmdescredit.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "Знаков набор:" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "За" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "Отказ" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "Отказ" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Запомняне" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Изрязване" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Изтриване" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Поставяне" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Връщане" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Отмяна" #: tfrmdiffer.actexit.caption msgctxt "tfrmdiffer.actexit.caption" msgid "E&xit" msgstr "Из&ход" #: tfrmdiffer.actfirstdifference.caption msgctxt "tfrmdiffer.actfirstdifference.caption" msgid "First Difference" msgstr "" #: tfrmdiffer.actfirstdifference.hint msgctxt "tfrmdiffer.actfirstdifference.hint" msgid "First Difference" msgstr "" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "" #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "" #: tfrmdiffer.actlastdifference.caption msgctxt "tfrmdiffer.actlastdifference.caption" msgid "Last Difference" msgstr "" #: tfrmdiffer.actlastdifference.hint msgctxt "tfrmdiffer.actlastdifference.hint" msgid "Last Difference" msgstr "" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "" #: tfrmdiffer.actnextdifference.caption msgctxt "tfrmdiffer.actnextdifference.caption" msgid "Next Difference" msgstr "" #: tfrmdiffer.actnextdifference.hint msgctxt "tfrmdiffer.actnextdifference.hint" msgid "Next Difference" msgstr "" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "" #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "" #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "" #: tfrmdiffer.actprevdifference.caption msgctxt "tfrmdiffer.actprevdifference.caption" msgid "Previous Difference" msgstr "" #: tfrmdiffer.actprevdifference.hint msgctxt "tfrmdiffer.actprevdifference.hint" msgid "Previous Difference" msgstr "" #: tfrmdiffer.actreload.caption msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "" #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "" #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "" #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "" #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "" #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "" #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "Знаков набор" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "Знаков набор" #: tfrmdiffer.caption msgctxt "TFRMDIFFER.CAPTION" msgid "Compare files" msgstr "Сравняване на файлове" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miencodingleft.caption msgid "&Left" msgstr "" #: tfrmdiffer.miencodingright.caption msgid "&Right" msgstr "" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "" #: tfrmdiffer.mnuedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "Обработка" #: tfrmdiffer.mnuencoding.caption #, fuzzy #| msgid "Encoding" msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "Знаков набор" #: tfrmdiffer.mnufile.caption #, fuzzy #| msgid "File" msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "Файл" #: tfrmdiffer.mnuoptions.caption msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "Въз&можности" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "" #: tfrmedithotkey.btncancel.caption msgctxt "TFRMEDITHOTKEY.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Отказ" #: tfrmedithotkey.btnok.caption msgctxt "TFRMEDITHOTKEY.BTNOK.CAPTION" msgid "&OK" msgstr "&Добре" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "" #: tfrmedithotkey.cghkcontrols.caption msgctxt "tfrmedithotkey.cghkcontrols.caption" msgid "Only for these controls" msgstr "" #: tfrmedithotkey.lblparameters.caption msgid "&Parameters (each in a separate line):" msgstr "" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "За" #: tfrmeditor.actabout.hint msgctxt "tfrmeditor.actabout.hint" msgid "About" msgstr "За" #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "&Настройка" #: tfrmeditor.actconfhigh.hint msgctxt "tfrmeditor.actconfhigh.hint" msgid "Configuration" msgstr "Настройка" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Запомняне" #: tfrmeditor.acteditcopy.hint msgctxt "tfrmeditor.acteditcopy.hint" msgid "Copy" msgstr "Запомняне" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Изрязване" #: tfrmeditor.acteditcut.hint msgctxt "tfrmeditor.acteditcut.hint" msgid "Cut" msgstr "Изрязване" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Изтриване" #: tfrmeditor.acteditdelete.hint msgctxt "tfrmeditor.acteditdelete.hint" msgid "Delete" msgstr "Изтриване" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "&Търсене" #: tfrmeditor.acteditfind.hint msgctxt "tfrmeditor.acteditfind.hint" msgid "Find" msgstr "Търсене" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "Намиране на следващо:" #: tfrmeditor.acteditfindnext.hint msgctxt "tfrmeditor.acteditfindnext.hint" msgid "Find next" msgstr "Намиране на следващо:" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcr.hint msgctxt "tfrmeditor.acteditlineendcr.hint" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "tfrmeditor.acteditlineendcrlf.hint" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditlineendlf.hint msgctxt "tfrmeditor.acteditlineendlf.hint" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Поставяне" #: tfrmeditor.acteditpaste.hint msgctxt "tfrmeditor.acteditpaste.hint" msgid "Paste" msgstr "Поставяне" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Връщане" #: tfrmeditor.acteditredo.hint msgctxt "tfrmeditor.acteditredo.hint" msgid "Redo" msgstr "Връщане" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "&Замяна" #: tfrmeditor.acteditrplc.hint msgctxt "tfrmeditor.acteditrplc.hint" msgid "Replace" msgstr "Замяна" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "Избор на вси&чки" #: tfrmeditor.acteditselectall.hint msgctxt "tfrmeditor.acteditselectall.hint" msgid "Select All" msgstr "Избор на всички" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Отмяна" #: tfrmeditor.acteditundo.hint msgctxt "tfrmeditor.acteditundo.hint" msgid "Undo" msgstr "Отмяна" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "&Затваряне" #: tfrmeditor.actfileclose.hint msgctxt "tfrmeditor.actfileclose.hint" msgid "Close" msgstr "Затваряне" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "Из&ход" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "&Нов" #: tfrmeditor.actfilenew.hint msgctxt "tfrmeditor.actfilenew.hint" msgid "New" msgstr "" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "&Отваряне" #: tfrmeditor.actfileopen.hint msgctxt "tfrmeditor.actfileopen.hint" msgid "Open" msgstr "Отваряне" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "&Съхраняване" #: tfrmeditor.actfilesave.hint msgctxt "tfrmeditor.actfilesave.hint" msgid "Save" msgstr "" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "Съхраняване &като..." #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "Съ&храняване на всички" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "" #: tfrmeditor.caption msgctxt "tfrmeditor.caption" msgid "Editor" msgstr "Обработчик" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "Помо&щ" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Обработка" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "&Знаков набор" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "Отваряне като" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "Съхраняване като" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "&Файл" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "Синтактично подчертаване" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n5.caption msgctxt "TFRMEDITOR.N5.CAPTION" msgid "-" msgstr "-" #: tfrmeditsearchreplace.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Отказ" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "&Добре" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "Отчитане на &глаВноСТта" #: tfrmeditsearchreplace.cbsearchfromcursor.caption #, fuzzy #| msgid "Search from &caret" msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "Търсене на&долу" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "&Обичайни изрази" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "Само избрания &текст" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "&Само цели думи" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "Възможност" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "&Замяна с:" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "&Търсене от:" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "Подока" #: tfrmextractdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Отказ" #: tfrmextractdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Помощ" #: tfrmextractdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "Добре" #: tfrmextractdlg.caption msgctxt "TFRMEXTRACTDLG.CAPTION" msgid "Unpack files" msgstr "Извличане на файлове" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "&Разгъване на имената на пътищата, ако са съхранени във файловете" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*.*" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "Разгъване на всяка сбивка в отделна папка (според името на сбивката)" #: tfrmextractdlg.cboverwrite.caption #, fuzzy #| msgid "&Overwrite existing files" msgid "O&verwrite existing files" msgstr "&Замяна на съществуващите файлове" #: tfrmextractdlg.lblextractto.caption #, fuzzy #| msgid "To the directory:" msgid "To the &directory:" msgstr "Извличане на файл в:" #: tfrmextractdlg.lblfilemask.caption #, fuzzy #| msgid "Extract files matching file mask:" msgid "&Extract files matching file mask:" msgstr "&Файлове за разгъване:" #: tfrmextractdlg.lblpassword.caption msgid "&Password for encrypted files:" msgstr "" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "Добавяне" #: tfrmfileassoc.btnaddext.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "Добавяне" #: tfrmfileassoc.btnaddnewtype.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "Добавяне" #: tfrmfileassoc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Отказ" #: tfrmfileassoc.btndownact.caption #, fuzzy #| msgid "Down" msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "Надолу" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "&Добре" #: tfrmfileassoc.btnremoveact.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "Премахване" #: tfrmfileassoc.btnremoveext.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "Премахване" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "" #: tfrmfileassoc.btnremovetype.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "Премахване" #: tfrmfileassoc.btnrenametype.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "Премахване" #: tfrmfileassoc.btnupact.caption #, fuzzy #| msgid "Up" msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "Нагоре" #: tfrmfileassoc.caption msgid "File associations" msgstr "Файлови обвързвания" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "Действия" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "Разширения" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "Видове файлове" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "Значе" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "Действие:" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "&Заповед:" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "Обработка" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "Отваряне в обработчика" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "Файлово име" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "Файлов път" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "Цял път" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "Получаване на изхода от командата" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "Отваряне" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "Пускане в терминал" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "Отваряне във VFS" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "Преглед" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "Отваряне в прегледа" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Затваряне" #: tfrmfileexecuteyourself.caption msgctxt "TFRMFILEEXECUTEYOURSELF.CAPTION" msgid "Wait..." msgstr "" #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "От:" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "" #: tfrmfileop.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Отказ" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "От:" #: tfrmfileop.lblto.caption msgid "To:" msgstr "До:" #: tfrmfileproperties.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Затваряне" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "" #: tfrmfileproperties.caption msgctxt "TFRMFILEPROPERTIES.CAPTION" msgid "Properties" msgstr "Свойства" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Лешкав" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "Собственик" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Разряда:" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Група" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Друго:" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Собственик" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmfileproperties.lblattrtextstr.caption #| msgid "Representation in text:" msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Текст:" #: tfrmfileproperties.lblcontains.caption msgctxt "tfrmfileproperties.lblcontains.caption" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Изпълнение" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "Файлово име" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "Име" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "Файлово име" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "Път:" #: tfrmfileproperties.lblgroupstr.caption #, fuzzy #| msgid "Group" msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "Група" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "Последно използване:" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "Последна промяна:" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "Последна промяна на състоянието:" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Осмично:" #: tfrmfileproperties.lblownerstr.caption #, fuzzy #| msgid "Owner" msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "Собственик" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Запис" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "Размер:" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption #| msgid "Symlink:" msgid "Symlink to:" msgstr "Мека връзка към:" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption msgid "Type:" msgstr "Вид:" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Четене" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Принадлежности" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "Свойства" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "&Добавяне" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "Помо&щ" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Затваряне" #: tfrmfinddlg.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmfinddlg.btnedit.caption" msgid "&Edit" msgstr "Обработка" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "&Отиване до файл" #: tfrmfinddlg.btnlastsearch.caption msgctxt "tfrmfinddlg.btnlastsearch.caption" msgid "&Last search" msgstr "" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "&Ново търсене" #: tfrmfinddlg.btnsavetemplate.caption msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "&Съхраняване" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "Из&триване" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "За&реждане" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "&Съхраняване" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption msgid "Sa&ve with \"Start in directory\"" msgstr "" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "" #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "&Начало" #: tfrmfinddlg.btnstop.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "Отказ" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "&Преглед" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "Вкарване във файловия &списък" #: tfrmfinddlg.caption msgctxt "tfrmfinddlg.caption" msgid "Find files" msgstr "Търсене на файлове" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "Отчитане на глАВноСТта" #: tfrmfinddlg.cbdatefrom.caption #, fuzzy #| msgid "Date From:" msgid "&Date from:" msgstr "Дата от:" #: tfrmfinddlg.cbdateto.caption #, fuzzy #| msgid "Date To:" msgid "Dat&e to:" msgstr "Дата до:" #: tfrmfinddlg.cbfilesizefrom.caption #, fuzzy #| msgid "Size from:" msgid "S&ize from:" msgstr "Файлов размер от:" #: tfrmfinddlg.cbfilesizeto.caption #, fuzzy #| msgid "Size to:" msgid "Si&ze to:" msgstr "Файлов размер до:" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "Търсене във файл" #: tfrmfinddlg.cbfollowsymlinks.caption #, fuzzy #| msgid "Follow symlinks" msgctxt "tfrmfinddlg.cbfollowsymlinks.caption" msgid "Follow s&ymlinks" msgstr "Следване на меките връзки" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "Намиране на файлове НЕсъдържащи текста" #: tfrmfinddlg.cbnotolderthan.caption #, fuzzy #| msgid "Not older than:" msgid "N&ot older than:" msgstr "Не по- стар от:" #: tfrmfinddlg.cbpartialnamesearch.caption msgid "Searc&h for part of file name" msgstr "" #: tfrmfinddlg.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "&Обичайни изрази" #: tfrmfinddlg.cbreplacetext.caption #, fuzzy #| msgid "Re&place text" msgid "Re&place by" msgstr "Замяна на текст" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "" #: tfrmfinddlg.cbtimefrom.caption #, fuzzy #| msgid "Time from:" msgid "&Time from:" msgstr "Време от:" #: tfrmfinddlg.cbtimeto.caption #, fuzzy #| msgid "Time to:" msgid "Ti&me to:" msgstr "Време до:" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "Използване на приставка за търсене:" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption msgctxt "tfrmfinddlg.gbdirectories.caption" msgid "Directories" msgstr "" #: tfrmfinddlg.gbfiles.caption msgctxt "tfrmfinddlg.gbfiles.caption" msgid "Files" msgstr "" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "Търсене на данни" #: tfrmfinddlg.lblattributes.caption msgid "Attri&butes" msgstr "" #: tfrmfinddlg.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "Знаков набор:" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "Файл" #: tfrmfinddlg.lblfindpathstart.caption #, fuzzy #| msgid "&Start in directory" msgid "Start in &directory" msgstr "Папка" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "Търсене на по&дпапки:" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "Пре&дишни търсения:" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "Показване в прегледа" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "Разширени" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "Зареждане/ Съхраняване" #: tfrmfinddlg.tsplugins.caption msgctxt "tfrmfinddlg.tsplugins.caption" msgid "Plugins" msgstr "Приставки" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "Намерено" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "Обичайно" #: tfrmfindview.btnclose.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "Отказ" #: tfrmfindview.btnfind.caption #, fuzzy #| msgid "Find" msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "Търсене" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "Търсене" #: tfrmfindview.cbcasesens.caption #, fuzzy #| msgid "Case sensitive" msgid "C&ase sensitive" msgstr "Отчитане на глаВНостТА" #: tfrmhardlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Отказ" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&Добре" #: tfrmhardlink.caption #, fuzzy #| msgid "Create hardlink" msgid "Create hard link" msgstr "Създаване на твърда връзка" #: tfrmhardlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Съществуваща цел, към която да сочи връзката" #: tfrmhardlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Име на връзката" #: tfrmhotdir.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "Добавяне" #: tfrmhotdir.btnaddman.caption #, fuzzy #| msgid "Add manually" msgid "Add &manually" msgstr "Ръчно добавяне" #: tfrmhotdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Отказ" #: tfrmhotdir.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Изтриване" #: tfrmhotdir.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Обработка" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&Добре" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "Бързодостъпни папки" #: tfrmlinker.btnexit.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "Изход" #: tfrmlinker.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "Добре" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "..." #: tfrmlinker.caption msgctxt "TFRMLINKER.CAPTION" msgid "Linker" msgstr "Сглобяване на файл" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "Съхраняване в..." #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "Предмет" #: tfrmlinker.lblfilename.caption #, fuzzy #| msgid "File name" msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "Файлово име" #: tfrmlinker.spbtndel.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "Изтриване" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "Изтриване" #: tfrmlinker.spbtndown.caption #, fuzzy #| msgid "Down" msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "Надолу" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "Надолу" #: tfrmlinker.spbtnup.caption #, fuzzy #| msgid "Up" msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "Нагоре" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "Нагоре" #: tfrmmain.actabout.caption #| msgid "About" msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "&За" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "Добавяне името на файла в командния ред" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "Добавяне на пътя и файловото име в командния ред" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "Преписване на пътя в реда управление" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "" #: tfrmmain.actcalculatespace.caption #, fuzzy #| msgid "Calculate &Occupied Space..." msgid "Calculate &Occupied Space" msgstr "Изчисляване на &заетото място..." #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "Смяна на папката" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "Папка нагоре" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "В основната папка" #: tfrmmain.actchecksumcalc.caption #, fuzzy #| msgid "Calculate check sum..." msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "Изчисляване на проверочен сбор..." #: tfrmmain.actchecksumverify.caption #, fuzzy #| msgid "Verify check sum..." msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "Потвърждаване на проверочен сбор..." #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "Изчистване на дневника" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "Изчистване на прозореца на дневника" #: tfrmmain.actclosealltabs.caption #, fuzzy #| msgid "Remove &All Tabs" msgctxt "tfrmmain.actclosealltabs.caption" msgid "Close &All Tabs" msgstr "Премахване на вси&чки подпрозорци" #: tfrmmain.actclosetab.caption #, fuzzy #| msgid "&Remove Tab" msgctxt "tfrmmain.actclosetab.caption" msgid "&Close Tab" msgstr "Пре&махване на подпрозореца" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "Сравняване по &съдържание" #: tfrmmain.actcomparedirectories.caption msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.CAPTION" msgid "Compare Directories" msgstr "" #: tfrmmain.actcomparedirectories.hint msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.HINT" msgid "Compare Directories" msgstr "" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "Показване на изскачащ изборник" #: tfrmmain.actcopy.caption #, fuzzy #| msgid "Copy" msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "Презапис" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "Запомняне на файловото/ите име/на и пълния &път" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "Запомняне на &файловото/ите име/на в кошницата" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "Презапис на файловете без искане на потвърждение" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "Презапис в същото крило" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "Запомняне" #: tfrmmain.actcountdircontent.caption #, fuzzy #| msgid "Sho&w occupied space" msgid "Sho&w Occupied Space" msgstr "&Показване на заетото място" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "Изрязване" #: tfrmmain.actdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMMAIN.ACTDELETE.CAPTION" msgid "Delete" msgstr "Итриване" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "Дневник на папката" #: tfrmmain.actdirhotlist.caption #, fuzzy #| msgid "Directory &hotlist" msgid "Directory &Hotlist" msgstr "&Бързодостъпни папки" #: tfrmmain.actedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "Обработка" #: tfrmmain.acteditcomment.caption #, fuzzy #| msgid "Edit comment..." msgid "Edit Co&mment..." msgstr "Промяна на бележката..." #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "Обработка на нов файл" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "Обработка на полето за пътя над файловия списък" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "Размяна на &крилата" #: tfrmmain.actexit.caption #| msgid "Exit" msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "Из&ход" #: tfrmmain.actextractfiles.caption #, fuzzy #| msgid "Extract files..." msgid "&Extract Files..." msgstr "Извличане на файлове..." #: tfrmmain.actfileassoc.caption #, fuzzy #| msgid "File &associations..." msgid "File &Associations..." msgstr "Файлови об&вързвания..." #: tfrmmain.actfilelinker.caption #, fuzzy #| msgid "Link files" msgid "Com&bine Files..." msgstr "Свързване на файлове" #: tfrmmain.actfileproperties.caption #, fuzzy #| msgid "Show file properties" msgid "Show &File Properties" msgstr "Показване на файловите свойства" #: tfrmmain.actfilespliter.caption #, fuzzy #| msgid "Split file" msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "Раздробяване на файл" #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "Сочене на реда за управление" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "" #: tfrmmain.acthardlink.caption #, fuzzy #| msgid "Create hard link..." msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "Създаване на връзка..." #: tfrmmain.acthelpindex.caption #| msgid "Contents" msgid "&Contents" msgstr "Съ&държание" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "" #: tfrmmain.actkeyboard.caption #| msgid "Keyboard" msgid "&Keyboard" msgstr "&Клавиатура" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "Ляво &= дясно" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "Първо се отваря лявото крило" #: tfrmmain.actloadselectionfromclip.caption #, fuzzy #| msgid "Load Selection From Clipboard" msgid "Load Selection from Clip&board" msgstr "Зареждане на отбелязване" #: tfrmmain.actloadselectionfromfile.caption #, fuzzy #| msgid "Load Selection From File" msgid "&Load Selection from File..." msgstr "Зареждане на отбелязване от файл" #: tfrmmain.actmakedir.caption #, fuzzy #| msgid "MakeDir" msgid "MakeDir" msgstr "Нова папка" #: tfrmmain.actmarkcurrentextension.caption #, fuzzy #| msgid "Select all with same extension" msgid "Select All with the Same E&xtension" msgstr "Избор на всички със същото разширение" #: tfrmmain.actmarkinvert.caption #, fuzzy #| msgid "Invert Selections" msgid "&Invert Selection" msgstr "Обръщане на избора" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "Избор на вси&чки" #: tfrmmain.actmarkminus.caption #, fuzzy #| msgid "Unselect a group" msgid "Unselect a Gro&up..." msgstr "Снемане на избора от група" #: tfrmmain.actmarkplus.caption #, fuzzy #| msgid "Select a group" msgid "Select a &Group..." msgstr "Избор на група" #: tfrmmain.actmarkunmarkall.caption #, fuzzy #| msgid "Unselect All" msgid "&Unselect All" msgstr "Снемане на избора от всички" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "Смаляване на прозореца" #: tfrmmain.actmultirename.caption #, fuzzy #| msgid "Multi Rename Tool" msgid "Multi &Rename Tool" msgstr "Множествено преименуване" #: tfrmmain.actnetworkconnect.caption #, fuzzy #| msgid "Network Connect..." msgid "Network &Connect..." msgstr "Закачане към мрежа..." #: tfrmmain.actnetworkdisconnect.caption #, fuzzy #| msgid "Network Disconnect" msgid "Network &Disconnect" msgstr "Разкачане от мрежа" #: tfrmmain.actnetworkquickconnect.caption #, fuzzy #| msgid "Network Quick Connect..." msgid "Network &Quick Connect..." msgstr "Бързо закачане към мрежа..." #: tfrmmain.actnewtab.caption #, fuzzy #| msgid "&New tab" msgid "&New Tab" msgstr "&Нов подпрозорец" #: tfrmmain.actnexttab.caption #, fuzzy #| msgid "Switch to nex&t tab" msgid "Switch to Nex&t Tab" msgstr "Преминаване на следва&щия подпрозорец" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "Отваряне" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "Опит за отваряне на файл" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "" #: tfrmmain.actopendirinnewtab.caption #, fuzzy #| msgid "Open &folder in new tab" msgid "Open &Folder in a New Tab" msgstr "Отваряне на &папката в нов подпрозорец" #: tfrmmain.actopenvirtualfilesystemlist.caption #| msgid "Open VFS List" msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "Отваряне на &VFS списък" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "" #: tfrmmain.actoptions.caption #| msgid "Options..." msgid "&Options..." msgstr "Въз&можности..." #: tfrmmain.actpackfiles.caption #, fuzzy #| msgid "Pack files..." msgid "&Pack Files..." msgstr "Сбиване на файлове..." #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "Задаване на положението на разделителя" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "Поставяне" #: tfrmmain.actprevtab.caption #, fuzzy #| msgid "Switch to &previous tab" msgid "Switch to &Previous Tab" msgstr "Преминаване на пред&ходния подпрозорец" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "Бързо пресяване" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "Бързо търсене" #: tfrmmain.actquickview.caption #, fuzzy #| msgid "Quick View Panel" msgid "&Quick View Panel" msgstr "Крило за бърз преглед" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "О&пресняване" #: tfrmmain.actrename.caption #, fuzzy #| msgid "Move" msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "Местене" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "Местене/ преименуване без искане на потвърждение" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "Преименуване" #: tfrmmain.actrenametab.caption msgid "&Rename Tab" msgstr "" #: tfrmmain.actrestoreselection.caption #, fuzzy #| msgid "Restore Selection" msgid "&Restore Selection" msgstr "Възстановяване на отбелязването" #: tfrmmain.actreverseorder.caption #, fuzzy #| msgid "Reverse order" msgid "Re&verse Order" msgstr "Обръщане на реда" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "Десен &= Ляв" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "Първо се отваря дясното крило" #: tfrmmain.actrunterm.caption #, fuzzy #| msgid "Run Term" msgid "Run &Terminal" msgstr "Терминал" #: tfrmmain.actsaveselection.caption #, fuzzy #| msgid "Save Selection" msgid "Sa&ve Selection" msgstr "Съхраняване на отбелязването" #: tfrmmain.actsaveselectiontofile.caption #, fuzzy #| msgid "Save Selection To File" msgid "Save S&election to File..." msgstr "Съхраняване на отбелязването във файл" #: tfrmmain.actsearch.caption #, fuzzy #| msgid "&Search" msgid "&Search..." msgstr "&Търсене" #: tfrmmain.actsetfileproperties.caption #, fuzzy #| msgid "Change attributes" msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "Промяна на файловите свойства" #: tfrmmain.actsettaboptiondirsinnewtab.caption #, fuzzy #| msgid "Directories are opened in new &tabs" msgid "Locked with Directories Opened in New &Tabs" msgstr "Папките се отварят в нови подпрозор&ци" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "&Обикновен" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "&Заключен" #: tfrmmain.actsettaboptionpathresets.caption #, fuzzy #| msgid "Locked, but &directory changes allowed" msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "Заключен, с разрешена смяна на &папката" #: tfrmmain.actshellexecute.caption msgctxt "tfrmmain.actshellexecute.caption" msgid "Open" msgstr "Отваряне" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "Показване на изборници на копчетата" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "Показване на дневник на реда управление" #: tfrmmain.actshowmainmenu.caption #, fuzzy #| msgid "Menu" msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "Изборник" #: tfrmmain.actshowsysfiles.caption #, fuzzy #| msgid "Show hidden/system files" msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "Показване на скрити/ системни файлове" #: tfrmmain.actsortbyattr.caption #, fuzzy #| msgid "Sort by attrib" msgid "Sort by &Attributes" msgstr "Подреждане по принадлежности" #: tfrmmain.actsortbydate.caption #, fuzzy #| msgid "Sort by date" msgid "Sort by &Date" msgstr "Подреждане по дата" #: tfrmmain.actsortbyext.caption #, fuzzy #| msgid "Sort by extension" msgid "Sort by &Extension" msgstr "Подреждане по разширение" #: tfrmmain.actsortbyname.caption #, fuzzy #| msgid "Sort by name" msgid "Sort by &Name" msgstr "Подреждане по име" #: tfrmmain.actsortbysize.caption #, fuzzy #| msgid "Sort by size" msgid "Sort by &Size" msgstr "Подреждане по размер" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "Включване/ изключване на пренебрегването" #: tfrmmain.actsymlink.caption #, fuzzy #| msgid "Create symbolic link..." msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "Създаване на мека взръзка..." #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "Цел &= източник" #: tfrmmain.acttestarchive.caption #, fuzzy #| msgid "Test Archive(s)" msgid "&Test Archive(s)" msgstr "Проверка на архив(и)" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "Прехвърляне на папката под показалеца в левия прозорец" #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "Прехвърляне на папката под показалеца в десния прозорец" #: tfrmmain.actunmarkcurrentextension.caption #, fuzzy #| msgid "Unselect all with same extension" msgid "Unselect All with the Same Ex&tension" msgstr "Снемане на избора на всички със същото разширение" #: tfrmmain.actview.caption #, fuzzy #| msgid "View" msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "Преглед" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "Показване на списъка на посетените пътища в дейния преглед" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "Към следващата точка от дневника" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "Към предходната точка от дневника" #: tfrmmain.actvisithomepage.caption #, fuzzy #| msgid "&Visit Double Commander Web Site" msgid "&Visit Double Commander Website" msgstr "&Посещаване на мрежовото място на Double Commander" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "Унищожаване" #: tfrmmain.btnf10.caption #, fuzzy #| msgid "Exit" msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "Изход" #: tfrmmain.btnf8.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMMAIN.BTNF8.CAPTION" msgid "Delete" msgstr "Итриване" #: tfrmmain.btnf9.caption #, fuzzy #| msgid "Terminal" msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "Терминал" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint msgid "Directory hotlist" msgstr "" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "<" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnlefthome.hint msgid "Go to home directory" msgstr "Отиване в домашната папка" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgid "Go to root directory" msgstr "" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgid "Go to parent directory" msgstr "" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr ">" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "tfrmmain.caption" msgid "Double Commander" msgstr "Double Commander" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "Път" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "&20/80" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "&30/70" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "&40/60" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "&50/50" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "&60/40" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "&70/30" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "&80/20" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "Отказ" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "Презапис..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "Създаване на връзка..." #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline33.caption msgctxt "tfrmmain.miline33.caption" msgid "-" msgstr "-" #: tfrmmain.miline37.caption msgctxt "TFRMMAIN.MILINE37.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "-" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "Изчистване" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "Запомняне" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "Скриване" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "Избор на всички" #: tfrmmain.mimove.caption msgid "Move..." msgstr "Преместване..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "Създаване на мека взръзка..." #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "Възможности за подпрозорците" #: tfrmmain.mitrayiconexit.caption #| msgid "Exit" msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "Из&ход" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "" #: tfrmmain.mnualloperpause.caption msgctxt "tfrmmain.mnualloperpause.caption" msgid "||" msgstr "||" #: tfrmmain.mnualloperstart.caption msgctxt "tfrmmain.mnualloperstart.caption" msgid "Start" msgstr "Начало" #: tfrmmain.mnualloperstop.caption msgctxt "tfrmmain.mnualloperstop.caption" msgid "Cancel" msgstr "Отказ" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "&Заповеди" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "&Настройка" #: tfrmmain.mnufiles.caption #| msgid "Files" msgid "&Files" msgstr "&Файлове" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "Помо&щ" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "&Избор" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "Мрежа" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "&Изглед" #: tfrmmain.mnutaboptions.caption #| msgid "Options" msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "Въз&можности" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "&Подпрозорци" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "Запомняне" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "Изрязване" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "Изтриване" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "Обработка" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "Поставяне" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmmaskinputdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Отказ" #: tfrmmaskinputdlg.btndefinetemplate.caption msgid "&Define..." msgstr "" #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&Добре" #: tfrmmaskinputdlg.lblsearchtemplate.caption msgid "O&r select predefined selection type:" msgstr "" #: tfrmmkdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Отказ" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&Добре" #: tfrmmkdir.caption msgid "Create new directory" msgstr "Създаване на нова папка" #: tfrmmkdir.lblmakedir.caption #, fuzzy #| msgid "Input new directory name:" msgid "&Input new directory name:" msgstr "Напишете името на новата папка:" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "" #: tfrmmodview.caption msgctxt "TFRMMODVIEW.CAPTION" msgid "New Size" msgstr "" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgctxt "tfrmmodview.lblpath2.caption" msgid "2" msgstr "" #: tfrmmodview.lblpath3.caption msgctxt "tfrmmodview.lblpath3.caption" msgid "3" msgstr "" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "" #: tfrmmodview.teheight.text msgid "Height" msgstr "" #: tfrmmodview.tequality.text msgid "80" msgstr "" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "Ширина" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Затваряне" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "Из&триване" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "За&реждане" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "Пре&именуване" #: tfrmmultirename.btnrestore.caption #, fuzzy #| msgid "Reset all" msgid "Reset &all" msgstr "Очиства всички" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "&Съхраняване" #: tfrmmultirename.caption msgctxt "tfrmmultirename.caption" msgid "MultiRename" msgstr "Множествено преименуване" #: tfrmmultirename.cblog.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "Дневник" #: tfrmmultirename.cbregexp.caption #| msgid "&Regular expressions" msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "&Обичайни изрази" #: tfrmmultirename.cbusesubs.caption #| msgid "Use substitution" msgid "&Use substitution" msgstr "Използване на &заместване" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption #, fuzzy #| msgid "[E]xtension" msgid "[E] Extension" msgstr "[E] Разширение" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "Брояч" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "Търсене &и замяна" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "Име на дневника" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "Имена" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "Предустановки" #: tfrmmultirename.lbext.caption #| msgid "Extension" msgid "&Extension" msgstr "Раз&ширение" #: tfrmmultirename.lbfind.caption #| msgid "Find..." msgid "&Find..." msgstr "&Търсене..." #: tfrmmultirename.lbinterval.caption #, fuzzy #| msgid "Interval" msgid "&Interval" msgstr "Промеждутък" #: tfrmmultirename.lbname.caption #| msgid "File Name" msgid "File &Name" msgstr "Файлово &име" #: tfrmmultirename.lbreplace.caption #| msgid "Replace..." msgid "Re&place..." msgstr "За&мяна..." #: tfrmmultirename.lbstnb.caption #, fuzzy #| msgid "Start Number" msgid "S&tart Number" msgstr "Начална стойност" #: tfrmmultirename.lbwidth.caption #, fuzzy #| msgid "Width" msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "Ширина" #: tfrmmultirename.micounter.caption #, fuzzy #| msgid "[C]ounter" msgid "[C] Counter" msgstr "[C] Брояч" #: tfrmmultirename.miday.caption #, fuzzy #| msgid "[D]ay" msgid "[D] Day" msgstr "[D] Ден" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "" #: tfrmmultirename.miextensionx.caption #, fuzzy #| msgid "[Ex]xtension" msgid "[Ex] Character at position x" msgstr "[Ex] Разширение" #: tfrmmultirename.miextensionxx.caption #, fuzzy #| msgid "[Ex:x]xtension" msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:x] Разширение" #: tfrmmultirename.mihour.caption #, fuzzy #| msgid "[h]our" msgid "[h] Hour" msgstr "[H] Час" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "" #: tfrmmultirename.miminute.caption #, fuzzy #| msgid "Mi[n]ute" msgid "[n] Minute" msgstr "[Mi] Минута" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "" #: tfrmmultirename.mimonth.caption #, fuzzy #| msgid "[M]onth" msgid "[M] Month" msgstr "[Mo] Месец" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "" #: tfrmmultirename.mimonth3.caption msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "" #: tfrmmultirename.miname.caption #, fuzzy #| msgid "[N]ame" msgid "[N] Name" msgstr "[N] Име" #: tfrmmultirename.minamex.caption #, fuzzy #| msgid "[Nx]ame" msgid "[Nx] Character at position x" msgstr "[Nx] Име" #: tfrmmultirename.minamexx.caption #, fuzzy #| msgid "[Nx:x]ame" msgid "[Nx:y] Characters from position x to y" msgstr "[Nx:x] Име" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "Време..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "Разширение..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "Име..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "" #: tfrmmultirename.misecond.caption #, fuzzy #| msgid "[s]econd" msgid "[s] Second" msgstr "[S] Секунда" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "" #: tfrmmultirename.miyear.caption #, fuzzy #| msgid "[Y] Year" msgid "[Y] Year (2 digits)" msgstr "[Y] Година" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "tfrmmultirename.stringgrid.columns[0].title.caption" msgid "Old File Name" msgstr "" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "tfrmmultirename.stringgrid.columns[1].title.caption" msgid "New File Name" msgstr "" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "tfrmmultirename.stringgrid.columns[2].title.caption" msgid "File Path" msgstr "Път" #: tfrmopenwith.caption msgid "Choose an application" msgstr "" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "" #: tfrmoptions.btnapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "Прилагане" #: tfrmoptions.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Отказ" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "&Добре" #: tfrmoptions.caption msgctxt "tfrmoptions.caption" msgid "Options" msgstr "Възможности" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "" #: tfrmoptionsarchivers.btnautoconfig.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNAUTOCONFIG.CAPTION" msgid "A&uto Configure" msgstr "" #: tfrmoptionsarchivers.btnmultiarcadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCADD.CAPTION" msgid "A&dd" msgstr "Добавяне" #: tfrmoptionsarchivers.btnmultiarcapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCAPPLY.CAPTION" msgid "A&pply" msgstr "Прилагане" #: tfrmoptionsarchivers.btnmultiarcdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCDELETE.CAPTION" msgid "D&elete" msgstr "Изтриване" #: tfrmoptionsarchivers.btnmultiarcrename.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCRENAME.CAPTION" msgid "&Rename" msgstr "Премахване" #: tfrmoptionsarchivers.chkmultiarcdebug.caption #, fuzzy #| msgid "Debug mode" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCDEBUG.CAPTION" msgid "De&bug mode" msgstr "Режим за проследяване на недъзи" #: tfrmoptionsarchivers.chkmultiarcenabled.caption #, fuzzy #| msgid "Enabled" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCENABLED.CAPTION" msgid "E&nabled" msgstr "Включен" #: tfrmoptionsarchivers.chkmultiarcoutput.caption #, fuzzy #| msgid "Show console output" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCOUTPUT.CAPTION" msgid "S&how console output" msgstr "Показване на изхода към конзолата" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "TFRMOPTIONSARCHIVERS.GBARCHIVEROPTIONS.CAPTION" msgid "Options" msgstr "Възможности" #: tfrmoptionsarchivers.lblarchiveadd.caption #, fuzzy #| msgid "Add:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEADD.CAPTION" msgid "Add&ing:" msgstr "Добавяне:" #: tfrmoptionsarchivers.lblarchiveextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTENSION.CAPTION" msgid "E&xtension:" msgstr "Разширение:" #: tfrmoptionsarchivers.lblarchiveextract.caption #, fuzzy #| msgid "Extract:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTRACT.CAPTION" msgid "Ex&tract:" msgstr "Извличане:" #: tfrmoptionsarchivers.lblarchivelist.caption #, fuzzy #| msgid "List:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELIST.CAPTION" msgid "&List:" msgstr "Списък:" #: tfrmoptionsarchivers.lblarchivelistend.caption #, fuzzy #| msgid "Listing finish (optional):" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTEND.CAPTION" msgid "Listing &finish (optional):" msgstr "край на списъка (избираемо):" #: tfrmoptionsarchivers.lblarchivelistformat.caption #, fuzzy #| msgid "Listing format:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTFORMAT.CAPTION" msgid "Listing for&mat:" msgstr "Изписване на списъка:" #: tfrmoptionsarchivers.lblarchiveliststart.caption #, fuzzy #| msgid "Listing start (optional):" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTSTART.CAPTION" msgid "Listin&g start (optional):" msgstr "Начало на списъка (избираемо):" #: tfrmoptionsarchivers.lblarchiver.caption #, fuzzy #| msgid "Archiver:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVER.CAPTION" msgid "Arc&hiver:" msgstr "Архиватор:" #: tfrmoptionsarchivers.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMOPTIONSARCHIVERS.LBLDESCRIPTION.CAPTION" msgid "De&scription:" msgstr "Описание:" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERADDITIONAL.CAPTION" msgid "Additional" msgstr "Допълнителни" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERGENERAL.CAPTION" msgid "General" msgstr "Общи" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHATTRIBUTESCHANGE.CAPTION" msgid "When &size, date or attributes change" msgstr "При промяна на раз&мера, датата и принадлежностите" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHEXCLUDEDIRS.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "За следните &пътища и подпапките им:" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption #, fuzzy #| msgid "When files are &created, deleted or renamed" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHFILENAMECHANGE.CAPTION" msgid "When &files are created, deleted or renamed" msgstr "При съз&даване, изтриване или преименуване на файлове" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHONLYFOREGROUND.CAPTION" msgid "When application is in the &background" msgstr "Когато приложението е на &заден план" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHDISABLE.CAPTION" msgid "Disable auto-refresh" msgstr "Без самоопресняване" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHENABLE.CAPTION" msgid "Refresh file list" msgstr "Опресняване на файловия списък" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption #, fuzzy #| msgid "Always show tray icon" msgctxt "TFRMOPTIONSBEHAVIOR.CBALWAYSSHOWTRAYICON.CAPTION" msgid "Al&ways show tray icon" msgstr "Винаги да се показва значе в уведомителката" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption msgid "Automatically &hide unmounted devices" msgstr "" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBMINIMIZETOTRAY.CAPTION" msgid "Mo&ve icon to system tray when minimized" msgstr "Смаляване в уведомителката" #: tfrmoptionsbehavior.cbonlyonce.caption #, fuzzy #| msgid "Allow only one copy of DC at a time" msgctxt "TFRMOPTIONSBEHAVIOR.CBONLYONCE.CAPTION" msgid "A&llow only one copy of DC at a time" msgstr "Позволено е само едно пускане на DC наведнъж" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "" #: tfrmoptionsbehavior.lbldrivesblacklist.caption msgid "Drives &blacklist" msgstr "" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption #, fuzzy #| msgid "Cut text to column width" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBCUTTEXTTOCOLWIDTH.CAPTION" msgid "Cut &text to column width" msgstr "Подразване на ткеста до ширината на стълба" #: tfrmoptionscolumnsview.cbgridhorzline.caption #, fuzzy #| msgid "Horizontal lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDHORZLINE.CAPTION" msgid "&Horizontal lines" msgstr "Водоравни черти" #: tfrmoptionscolumnsview.cbgridvertline.caption #, fuzzy #| msgid "Vertical lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDVERTLINE.CAPTION" msgid "&Vertical lines" msgstr "Отвесни черти" #: tfrmoptionscolumnsview.chkautofillcolumns.caption #, fuzzy #| msgid "Auto fill columns" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CHKAUTOFILLCOLUMNS.CAPTION" msgid "A&uto fill columns" msgstr "Самопопълване на стълбовете" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "" #: tfrmoptionscolumnsview.lblautosizecolumn.caption #, fuzzy #| msgid "Auto size column:" msgctxt "TFRMOPTIONSCOLUMNSVIEW.LBLAUTOSIZECOLUMN.CAPTION" msgid "Auto si&ze column:" msgstr "Самооразмеряване на стълба:" #: tfrmoptionsconfiguration.btnconfigapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGAPPLY.CAPTION" msgid "A&pply" msgstr "Прилагане" #: tfrmoptionsconfiguration.btnconfigedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGEDIT.CAPTION" msgid "&Edit" msgstr "Обработка" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption #, fuzzy #| msgid "Command line history" msgctxt "TFRMOPTIONSCONFIGURATION.CBCMDLINEHISTORY.CAPTION" msgid "Co&mmand line history" msgstr "Дневник на реда управление" #: tfrmoptionsconfiguration.cbdirhistory.caption #, fuzzy #| msgid "Directory history" msgctxt "TFRMOPTIONSCONFIGURATION.CBDIRHISTORY.CAPTION" msgid "&Directory history" msgstr "Дневник на папката" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption #, fuzzy #| msgid "File mask history" msgctxt "TFRMOPTIONSCONFIGURATION.CBFILEMASKHISTORY.CAPTION" msgid "&File mask history" msgstr "Дневник на търсените файловете" #: tfrmoptionsconfiguration.chksaveconfiguration.caption #, fuzzy #| msgid "Save configuration" msgctxt "TFRMOPTIONSCONFIGURATION.CHKSAVECONFIGURATION.CAPTION" msgid "Sa&ve configuration" msgstr "Запис на настройките" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption #, fuzzy #| msgid "Search/Replace history" msgctxt "TFRMOPTIONSCONFIGURATION.CHKSEARCHREPLACEHISTORY.CAPTION" msgid "Searc&h/Replace history" msgstr "Дневник на търсенията/ замените" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBLOCCONFIGFILES.CAPTION" msgid "Location of configuration files" msgstr "Положение на настроечните файлове" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBSAVEONEXIT.CAPTION" msgid "Save on exit" msgstr "Запис при изход" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgctxt "TFRMOPTIONSCONFIGURATION.LBLCMDLINECONFIGDIR.CAPTION" msgid "Set on command line" msgstr "" #: tfrmoptionsconfiguration.rbprogramdir.caption #, fuzzy #| msgid "Program directory (portable version)" msgctxt "TFRMOPTIONSCONFIGURATION.RBPROGRAMDIR.CAPTION" msgid "P&rogram directory (portable version)" msgstr "Паката на приложението (преносима версия)" #: tfrmoptionsconfiguration.rbuserhomedir.caption #, fuzzy #| msgid "User home directory" msgctxt "TFRMOPTIONSCONFIGURATION.RBUSERHOMEDIR.CAPTION" msgid "&User home directory" msgstr "Домашна папка на потребителя" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption #, fuzzy #| msgid "Copy" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNCOPYCOLUMNSSET.CAPTION" msgid "C&opy" msgstr "Запомняне" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNDELCOLUMNSSET.CAPTION" msgid "&Delete" msgstr "Изтриване" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNEDITCOLUMNSSET.CAPTION" msgid "&Edit" msgstr "Обработка" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNNEWCOLUMNSSET.CAPTION" msgid "&New" msgstr "&Нов" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.CBBFILESYSTEM.TEXT" msgid "General" msgstr "Общи" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption #, fuzzy #| msgid "Configure columns for file system:" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.LBLCONFIGCOLUMNS.CAPTION" msgid "Con&figure columns for file system:" msgstr "Настройка на стълбовете за файлова уредба:" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption msgid "&Show confirmation dialog after drop" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption msgid "Show &file system" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption msgid "Show fr&ee space" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption msgid "Show &label" msgstr "" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "" #: tfrmoptionseditorcolors.backgroundlabel.caption msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "" #: tfrmoptionseditorcolors.foregroundlabel.caption msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption msgid "&Text-mark" msgstr "" #: tfrmoptionseditorcolors.tbtnglobal.caption msgid "Use (and edit) &global scheme settings" msgstr "" #: tfrmoptionseditorcolors.tbtnlocal.caption msgid "Use &local scheme settings" msgstr "" #: tfrmoptionseditorcolors.textboldcheckbox.caption msgid "&Bold" msgstr "" #: tfrmoptionseditorcolors.textboldradioinvert.caption msgctxt "tfrmoptionseditorcolors.textboldradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textboldradiooff.caption msgctxt "tfrmoptionseditorcolors.textboldradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textboldradioon.caption msgctxt "tfrmoptionseditorcolors.textboldradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textitaliccheckbox.caption msgid "&Italic" msgstr "" #: tfrmoptionseditorcolors.textitalicradioinvert.caption msgctxt "tfrmoptionseditorcolors.textitalicradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textitalicradiooff.caption msgctxt "tfrmoptionseditorcolors.textitalicradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textitalicradioon.caption msgctxt "tfrmoptionseditorcolors.textitalicradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption msgid "&Strike Out" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption msgid "&Underline" msgstr "" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textunderlineradiooff.caption msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textunderlineradioon.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "" #: tfrmoptionsfileoperations.cbdeletetotrash.caption #, fuzzy #| msgid "Delete to recycle bin (Shift key reverses this setting)" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDELETETOTRASH.CAPTION" msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "Изтриване в кошчето (Shift обръща настройката)" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDROPREADONLYFLAG.CAPTION" msgid "D&rop readonly flag" msgstr "Изоставяне на стяга „само за четене“" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPARTIALNAMESEARCH.CAPTION" msgid "&Search for part of file name" msgstr "" #: tfrmoptionsfileoperations.cbprocesscomments.caption #, fuzzy #| msgid "Process comments with files/folders" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPROCESSCOMMENTS.CAPTION" msgid "&Process comments with files/folders" msgstr "Опработка на бележките заедно с файловете/папките" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption #, fuzzy #| msgid "Select file name without extension when renaming" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBRENAMESELONLYNAME.CAPTION" msgid "Select &file name without extension when renaming" msgstr "Избор само на файловото име при преименуване (без разширението)" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption #, fuzzy #| msgid "Show tab select panel in copy/move dialog" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSHOWCOPYTABSELECTPANEL.CAPTION" msgid "Sho&w tab select panel in copy/move dialog" msgstr "Поазване на крило за избор на подпрозорци в прозореца за презапис/местене" #: tfrmoptionsfileoperations.cbskipfileoperror.caption #, fuzzy #| msgid "Skip file operations errors and write them to log window" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSKIPFILEOPERROR.CAPTION" msgid "S&kip file operations errors and write them to log window" msgstr "Грешките при работа с файлове се прескачат и се записват дневниковия прозорец" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.GBFILESEARCH.CAPTION" msgid "File search" msgstr "Файлово търсене" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "" #: tfrmoptionsfileoperations.lblbuffersize.caption msgid "&Buffer size for file operations (in KB):" msgstr "" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "" #: tfrmoptionsfileoperations.lblprogresskind.caption msgid "Show operations progress &initially in" msgstr "" #: tfrmoptionsfileoperations.lblwipepassnumber.caption #, fuzzy #| msgid "Number of wipe passes:" msgctxt "TFRMOPTIONSFILEOPERATIONS.LBLWIPEPASSNUMBER.CAPTION" msgid "&Number of wipe passes:" msgstr "Брой на повторенията:" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption #, fuzzy #| msgid "Use memory mapping for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSEMMAPINSEARCH.CAPTION" msgid "Use memory mapping for search te&xt in files" msgstr "Разпределено в паметта търсене на текст във файловете" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption #, fuzzy #| msgid "Use stream for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSESTREAMINSEARCH.CAPTION" msgid "&Use stream for search text in files" msgstr "Поточно търсене на текст във файловете" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEFRAMECURSOR.CAPTION" msgid "Use &Frame Cursor" msgstr "" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption msgid "Use &Gradient Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption #, fuzzy #| msgid "Use Inverted Selection" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEINVERTEDSELECTION.CAPTION" msgid "U&se Inverted Selection" msgstr "Използване на обърнато избиране" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.DBFREESPACEINDICATOR.CAPTION" msgid "Drive Free Space Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.GBEXAMPLE.CAPTION" msgid "Example" msgstr "Пример" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption #, fuzzy #| msgid "Background:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR.CAPTION" msgid "Bac&kground:" msgstr "Подцветка:" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption #, fuzzy #| msgid "Background 2:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR2.CAPTION" msgid "Backg&round 2:" msgstr "Подцвяетка 2:" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption #, fuzzy #| msgid "Cursor Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORCOLOR.CAPTION" msgid "C&ursor Color:" msgstr "Цвят на показалеца:" #: tfrmoptionsfilepanelscolors.lblcursortext.caption #, fuzzy #| msgid "Cursor Text:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORTEXT.CAPTION" msgid "Cursor Te&xt:" msgstr "Текст на показалеца:" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption #, fuzzy #| msgid "Brightness level of inactive panel" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLINACTIVEPANELBRIGHTNESS.CAPTION" msgid "&Brightness level of inactive panel" msgstr "Яркост на бездейното крило" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption msgid "In&dicator Back Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblindcolor.caption msgid "&Indicator Fore Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption #, fuzzy #| msgid "Mark Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLMARKCOLOR.CAPTION" msgid "&Mark Color:" msgstr "Цвят на отбелязване:" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption #, fuzzy #| msgid "Text Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLTEXTCOLOR.CAPTION" msgid "T&ext Color:" msgstr "Цявят на текста:" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption msgid "Do&n't load file list until a tab is activated" msgstr "" #: tfrmoptionsfilesviews.cbdirbrackets.caption #, fuzzy #| msgid "Show square brackets around directories" msgctxt "TFRMOPTIONSFILESVIEWS.CBDIRBRACKETS.CAPTION" msgid "S&how square brackets around directories" msgstr "Показване на средни скоби около папките" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption msgid "Hi&ghlight new and updated files" msgstr "" #: tfrmoptionsfilesviews.cblistfilesinthread.caption #, fuzzy #| msgid "Load file list in separate thread" msgctxt "TFRMOPTIONSFILESVIEWS.CBLISTFILESINTHREAD.CAPTION" msgid "Load &file list in separate thread" msgstr "Зареждане на файловите списъци в отделна нишка" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption #, fuzzy #| msgid "Load icons after file list" msgctxt "TFRMOPTIONSFILESVIEWS.CBLOADICONSSEPARATELY.CAPTION" msgid "Load icons af&ter file list" msgstr "Зареждане на значетата след файловия списък" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption #, fuzzy #| msgid "Show system and hidden files" msgctxt "TFRMOPTIONSFILESVIEWS.CBSHOWSYSTEMFILES.CAPTION" msgid "Show s&ystem and hidden files" msgstr "Показване на скрити/ системни файлове" #: tfrmoptionsfilesviews.cbspacemovesdown.caption #, fuzzy #| msgid "When selecting files with , move down to next file (as with )" msgctxt "TFRMOPTIONSFILESVIEWS.CBSPACEMOVESDOWN.CAPTION" msgid "&When selecting files with , move down to next file (as with )" msgstr "При избор на файлове с <Интервал> се преминава на следващия файл (като с )" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "" #: tfrmoptionsfilesviews.gbsorting.caption msgctxt "TFRMOPTIONSFILESVIEWS.GBSORTING.CAPTION" msgid "Sorting" msgstr "" #: tfrmoptionsfilesviews.lblcasesensitivity.caption msgid "Case s&ensitivity:" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeformat.caption #, fuzzy #| msgid "Date and time format:" msgctxt "TFRMOPTIONSFILESVIEWS.LBLDATETIMEFORMAT.CAPTION" msgid "&Date and time format:" msgstr "Изписване на датата и времето:" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "" #: tfrmoptionsfilesviews.lblnewfilesposition.caption msgid "&Insert new files" msgstr "" #: tfrmoptionsfilesviews.lblsortfoldermode.caption msgid "So&rting directories:" msgstr "" #: tfrmoptionsfilesviews.lblsortmethod.caption msgctxt "TFRMOPTIONSFILESVIEWS.LBLSORTMETHOD.CAPTION" msgid "&Sort method:" msgstr "" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption msgid "&Move updated files" msgstr "" #: tfrmoptionsfiletypescolors.btnaddcategory.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNADDCATEGORY.CAPTION" msgid "A&dd" msgstr "Добавяне" #: tfrmoptionsfiletypescolors.btnapplycategory.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNAPPLYCATEGORY.CAPTION" msgid "A&pply" msgstr "Прилагане" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNCATEGORYCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNDELETECATEGORY.CAPTION" msgid "D&elete" msgstr "Изтриване" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Шаблон..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption #, fuzzy #| msgid "File types colors" msgctxt "TFRMOPTIONSFILETYPESCOLORS.GBFILETYPESCOLORS.CAPTION" msgid "File types colors (sort by drag&&drop)" msgstr "Оцветяване на файловете според вида им" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption #, fuzzy #| msgid "Category attributes:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYATTR.CAPTION" msgid "Category a&ttributes:" msgstr "Принадлежности на раздела:" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption #, fuzzy #| msgid "Category color:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYCOLOR.CAPTION" msgid "Category co&lor:" msgstr "Цвят на раздела:" #: tfrmoptionsfiletypescolors.lblcategorymask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYMASK.CAPTION" msgid "Category &mask:" msgstr "Разширения на раздела:" #: tfrmoptionsfiletypescolors.lblcategoryname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYNAME.CAPTION" msgid "Category &name:" msgstr "Име на раздела:" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELEDITFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELLOGFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELMAINFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWERBOOKFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.lbleditorfont.caption #, fuzzy #| msgid "Editor font" msgctxt "TFRMOPTIONSFONTS.LBLEDITORFONT.CAPTION" msgid "&Editor font" msgstr "Шрифт на обработчика" #: tfrmoptionsfonts.lbllogfont.caption msgctxt "TFRMOPTIONSFONTS.LBLLOGFONT.CAPTION" msgid "&Log font" msgstr "" #: tfrmoptionsfonts.lblmainfont.caption #, fuzzy #| msgid "Main font" msgctxt "TFRMOPTIONSFONTS.LBLMAINFONT.CAPTION" msgid "Main &font" msgstr "Основен шрифт" #: tfrmoptionsfonts.lblviewerbookfont.caption msgctxt "TFRMOPTIONSFONTS.LBLVIEWERBOOKFONT.CAPTION" msgid "Viewer&Book Font" msgstr "" #: tfrmoptionsfonts.lblviewerfont.caption #, fuzzy #| msgid "Viewer font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERFONT.CAPTION" msgid "&Viewer font" msgstr "Шрифт на прегледа" #: tfrmoptionshotkeys.btnaddhotkey.caption msgid "Add &hotkey" msgstr "" #: tfrmoptionshotkeys.btndeletehotkey.caption msgid "&Delete hotkey" msgstr "" #: tfrmoptionshotkeys.btnedithotkey.caption msgctxt "tfrmoptionshotkeys.btnedithotkey.caption" msgid "&Edit hotkey" msgstr "" #: tfrmoptionshotkeys.lbfilter.caption #, fuzzy #| msgid "Filter" msgctxt "TFRMOPTIONSHOTKEYS.LBFILTER.CAPTION" msgid "&Filter" msgstr "Пресяване" #: tfrmoptionshotkeys.lblcategories.caption #, fuzzy #| msgid "Categories:" msgctxt "tfrmoptionshotkeys.lblcategories.caption" msgid "C&ategories:" msgstr "Раздели:" #: tfrmoptionshotkeys.lblcommands.caption #, fuzzy #| msgid "Commands:" msgctxt "tfrmoptionshotkeys.lblcommands.caption" msgid "Co&mmands:" msgstr "Заповеди:" #: tfrmoptionshotkeys.lblscfiles.caption msgctxt "TFRMOPTIONSHOTKEYS.LBLSCFILES.CAPTION" msgid "&Shortcut files:" msgstr "" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[0].TITLE.CAPTION" msgid "Hotkey" msgstr "" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[1].TITLE.CAPTION" msgid "Parameters" msgstr "" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[2].TITLE.CAPTION" msgid "Controls" msgstr "" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "За следните &пътища и подпапките им:" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "tfrmoptionsicons.cbiconsinmenussize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption #, fuzzy #| msgid "Show overlay i&cons, e.g. for links" msgctxt "TFRMOPTIONSICONS.CBICONSSHOWOVERLAY.CAPTION" msgid "Show o&verlay icons, e.g. for links" msgstr "Показване на наслоени значета, например за връзки" #: tfrmoptionsicons.cbiconssize.text msgctxt "TFRMOPTIONSICONS.CBICONSSIZE.TEXT" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "" #: tfrmoptionsicons.gbiconssize.caption #, fuzzy #| msgid " Icon &size " msgctxt "TFRMOPTIONSICONS.GBICONSSIZE.CAPTION" msgid " Icon size " msgstr "Раз&мер на значетата" #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "TFRMOPTIONSICONS.GBSHOWICONSMODE.CAPTION" msgid " Show icons to the left of the filename " msgstr "" #: tfrmoptionsicons.rbiconsshowall.caption #, fuzzy #| msgid "&All" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALL.CAPTION" msgid "A&ll" msgstr "&Всички" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALLANDEXE.CAPTION" msgid "All associated + &EXE/LNK (slow)" msgstr "Всички свързани + &EXE/LNK (бавно)" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWNONE.CAPTION" msgid "&No icons" msgstr "&Без значета" #: tfrmoptionsicons.rbiconsshowstandard.caption #, fuzzy #| msgid "&Only standard icons" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWSTANDARD.CAPTION" msgid "Only &standard icons" msgstr "&Само обичайните значета" #: tfrmoptionsignorelist.btnaddsel.caption #, fuzzy #| msgid "&Add selected names" msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSEL.CAPTION" msgid "A&dd selected names" msgstr "&Добавяне на избраните имена" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSELWITHPATH.CAPTION" msgid "Add selected names with &full path" msgstr "Добавяне на избраните имена с пълните пътища" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "TFRMOPTIONSIGNORELIST.CHKIGNOREENABLE.CAPTION" msgid "&Ignore (don't show) the following files and folders:" msgstr "&Пренебрегване (скриване) на следните файлове и папки:" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "TFRMOPTIONSIGNORELIST.LBLSAVEIN.CAPTION" msgid "&Save in:" msgstr "&Съхраняване в:" #: tfrmoptionskeyboard.cblynxlike.caption msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "" #: tfrmoptionskeyboard.lblalt.caption #, fuzzy #| msgid "Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLALT.CAPTION" msgid "Alt+L&etters" msgstr "Alt+букви" #: tfrmoptionskeyboard.lblctrlalt.caption #, fuzzy #| msgid "Ctrl+Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLCTRLALT.CAPTION" msgid "Ctrl+Alt+Le&tters" msgstr "Ctrl+Alt+букви" #: tfrmoptionskeyboard.lblnomodifier.caption msgctxt "TFRMOPTIONSKEYBOARD.LBLNOMODIFIER.CAPTION" msgid "&Letters" msgstr "" #: tfrmoptionslayout.cbflatdiskpanel.caption #, fuzzy #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATDISKPANEL.CAPTION" msgid "&Flat buttons" msgstr "Плоски бутони" #: tfrmoptionslayout.cbflatinterface.caption #, fuzzy #| msgid "Flat interface" msgctxt "TFRMOPTIONSLAYOUT.CBFLATINTERFACE.CAPTION" msgid "Flat i&nterface" msgstr "Плосък облик" #: tfrmoptionslayout.cbflattoolbar.caption #, fuzzy #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATTOOLBAR.CAPTION" msgid "Flat b&uttons" msgstr "Плоски бутони" #: tfrmoptionslayout.cbfreespaceind.caption #, fuzzy #| msgid "Show free space indicator on drive label" msgctxt "TFRMOPTIONSLAYOUT.CBFREESPACEIND.CAPTION" msgid "Show fr&ee space indicator on drive label" msgstr "Показване на указател за свободно място в етикета на устройството" #: tfrmoptionslayout.cblogwindow.caption #, fuzzy #| msgid "Show log window" msgctxt "TFRMOPTIONSLAYOUT.CBLOGWINDOW.CAPTION" msgid "Show lo&g window" msgstr "Прозорец на дневника" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "TFRMOPTIONSLAYOUT.CBPANELOFOPERATIONS.CAPTION" msgid "Show panel of operation in background" msgstr "Показване на крилото за действия на заден план" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "TFRMOPTIONSLAYOUT.CBPROGINMENUBAR.CAPTION" msgid "Show common progress in menu bar" msgstr "Показване на общия ход в лентата на изборника" #: tfrmoptionslayout.cbshowcmdline.caption #, fuzzy #| msgid "Show command &line" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCMDLINE.CAPTION" msgid "Show command l&ine" msgstr "Показване на &ред за управление" #: tfrmoptionslayout.cbshowcurdir.caption #, fuzzy #| msgid "Show ¤t directory" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCURDIR.CAPTION" msgid "Show current director&y" msgstr "Показване на &текущата папка" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDISKPANEL.CAPTION" msgid "Show &drive buttons" msgstr "Показване на &бутони за устройствата" #: tfrmoptionslayout.cbshowdrivefreespace.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDRIVEFREESPACE.CAPTION" msgid "Show free s&pace label" msgstr "" #: tfrmoptionslayout.cbshowdriveslistbutton.caption msgid "Show drives list bu&tton" msgstr "" #: tfrmoptionslayout.cbshowkeyspanel.caption #, fuzzy #| msgid "Show &function key buttons" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWKEYSPANEL.CAPTION" msgid "Show function &key buttons" msgstr "Показване на &служебни бутони" #: tfrmoptionslayout.cbshowmainmenu.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINMENU.CAPTION" msgid "Show &main menu" msgstr "" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINTOOLBAR.CAPTION" msgid "Show &button bar" msgstr "Показване на лента с &бутони" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption msgid "Show short free space &label" msgstr "" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWSTATUSBAR.CAPTION" msgid "Show &status bar" msgstr "Показване на лента на &състоянието" #: tfrmoptionslayout.cbshowtabheader.caption #, fuzzy #| msgid "Show &tabstop header" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABHEADER.CAPTION" msgid "S&how tabstop header" msgstr "Заглавия на &подпрозорците" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABS.CAPTION" msgid "Sho&w folder tabs" msgstr "Показване на &подстраници за папките" #: tfrmoptionslayout.cbtermwindow.caption #, fuzzy #| msgid "Show terminal window" msgctxt "TFRMOPTIONSLAYOUT.CBTERMWINDOW.CAPTION" msgid "Show te&rminal window" msgstr "Показване на терминален прозорец" #: tfrmoptionslayout.cbtwodiskpanels.caption #, fuzzy #| msgid "Show two drive button bars (fixed width, above file windows)" msgctxt "TFRMOPTIONSLAYOUT.CBTWODISKPANELS.CAPTION" msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "Показване на две ленти с устройствата (неизменна ширина, над файловите прозорци)" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "TFRMOPTIONSLAYOUT.GBSCREENLAYOUT.CAPTION" msgid " Screen layout " msgstr "Екранна подредба" #: tfrmoptionslog.cblogarcop.caption #, fuzzy #| msgid "Pack/Unpack" msgctxt "TFRMOPTIONSLOG.CBLOGARCOP.CAPTION" msgid "&Pack/Unpack" msgstr "Сгъване/ разгъване" #: tfrmoptionslog.cblogcpmvln.caption #, fuzzy #| msgid "Copy/Move/Create link/symlink" msgctxt "TFRMOPTIONSLOG.CBLOGCPMVLN.CAPTION" msgid "Cop&y/Move/Create link/symlink" msgstr "Презапис/Преместване/Създаване на връзка/мека връзка" #: tfrmoptionslog.cblogdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSLOG.CBLOGDELETE.CAPTION" msgid "&Delete" msgstr "Изтриване" #: tfrmoptionslog.cblogdirop.caption #, fuzzy #| msgid "Create/Delete directories" msgctxt "TFRMOPTIONSLOG.CBLOGDIROP.CAPTION" msgid "Crea&te/Delete directories" msgstr "Създаване/ изтриване на папки" #: tfrmoptionslog.cblogerrors.caption msgctxt "TFRMOPTIONSLOG.CBLOGERRORS.CAPTION" msgid "Log &errors" msgstr "Записване на &грешките" #: tfrmoptionslog.cblogfile.caption #, fuzzy #| msgid "&Create a log file:" msgctxt "TFRMOPTIONSLOG.CBLOGFILE.CAPTION" msgid "C&reate a log file:" msgstr "&Водене на дневник:" #: tfrmoptionslog.cbloginfo.caption #, fuzzy #| msgid "Log information messages" msgctxt "TFRMOPTIONSLOG.CBLOGINFO.CAPTION" msgid "Log &information messages" msgstr "Записване на осведомяващите съобщения" #: tfrmoptionslog.cblogsuccess.caption msgctxt "TFRMOPTIONSLOG.CBLOGSUCCESS.CAPTION" msgid "Log &successful operations" msgstr "Записване на &успешните действия" #: tfrmoptionslog.cblogvfs.caption #, fuzzy #| msgid "File system plugins" msgctxt "TFRMOPTIONSLOG.CBLOGVFS.CAPTION" msgid "&File system plugins" msgstr "Приставки за файлови уредби" #: tfrmoptionslog.gblogfile.caption msgctxt "TFRMOPTIONSLOG.GBLOGFILE.CAPTION" msgid "File operation log file" msgstr "Дневник на действията с файлове" #: tfrmoptionslog.gblogfileop.caption #, fuzzy #| msgid "Log operations:" msgctxt "TFRMOPTIONSLOG.GBLOGFILEOP.CAPTION" msgid "Log operations" msgstr "Запис на действията:" #: tfrmoptionslog.gblogfilestatus.caption #, fuzzy #| msgid "Operation status:" msgctxt "TFRMOPTIONSLOG.GBLOGFILESTATUS.CAPTION" msgid "Operation status" msgstr "Ход на действието:" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "" #: tfrmoptionsmisc.chkshowwarningmessages.caption #, fuzzy #| msgid "Show warning messages (\"OK\" button only)" msgctxt "tfrmoptionsmisc.chkshowwarningmessages.caption" msgid "Show &warning messages (\"OK\" button only)" msgstr "Показване на предупреждения (само с копче „Добре“)" #: tfrmoptionsmisc.chkthumbsave.caption msgctxt "tfrmoptionsmisc.chkthumbsave.caption" msgid "&Save thumbnails in cache" msgstr "" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "tfrmoptionsmisc.dblthumbnails.caption" msgid "Thumbnails" msgstr "" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "tfrmoptionsmisc.lblthumbseparator.caption" msgid "X" msgstr "" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "" #: tfrmoptionsmouse.cbselectionbymouse.caption msgid "&Selection by mouse" msgstr "" #: tfrmoptionsmouse.gbscrolling.caption msgid "Scrolling" msgstr "" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "" #: tfrmoptionsmouse.lblmousemode.caption msgid "&Mode:" msgstr "" #: tfrmoptionsmouse.rbscrolllinebyline.caption msgid "&Line by line" msgstr "" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption msgid "Line by line &with cursor movement" msgstr "" #: tfrmoptionsmouse.rbscrollpagebypage.caption msgid "&Page by page" msgstr "" #: tfrmoptionsplugins.btnaddplugin.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "Добавяне" #: tfrmoptionsplugins.btnconfigplugin.caption #, fuzzy #| msgid "Configure" msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "Настройка" #: tfrmoptionsplugins.btnenableplugin.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "Разрешаване" #: tfrmoptionsplugins.btnremoveplugin.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "Премахване" #: tfrmoptionsplugins.btntweakplugin.caption #, fuzzy #| msgid "Tweak" msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "Настройка" #: tfrmoptionsplugins.lbldsxdescription.caption #, fuzzy #| msgid "Search plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "Приставките за търсене позволяват изполването на заместващ алгоритъм за търсене или на въшни средства от рода на „locate“ и т.н." #: tfrmoptionsplugins.lblwcxdescription.caption #, fuzzy #| msgid "Packer plugins are used to work with archives." msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "Уплътняващите приставки се използват за работа със сбивки (архиви)." #: tfrmoptionsplugins.lblwdxdescription.caption #, fuzzy #| msgid "Content plugins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "Приставките за съдържание позволяват показването на допълнителни подробности за файловете, от рода на mp3 означители или свосйтв ана изображения във файловите списъци. Могат да се използват и при търсене и в средството за множествено преименуване." #: tfrmoptionsplugins.lblwfxdescription.caption #, fuzzy #| msgid "File system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "Приставките за файлови уредби позволяват достъп до дискове, недостъпни от работната уредба или до външи устройства като Palm и PocketPC." #: tfrmoptionsplugins.lblwlxdescription.caption #, fuzzy #| msgid "Viewer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "Приставките за преглед позволяват показването на файлови формати от рода на изображения, таблици, бази от данни и т.н. в прегеда (F3, Ctrl+Q)" #: tfrmoptionsplugins.stgplugins.columns[0].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[0].TITLE.CAPTION" msgid "Active" msgstr "Деен" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[1].TITLE.CAPTION" msgid "Plugin" msgstr "" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[2].TITLE.CAPTION" msgid "Registered for" msgstr "Записано на" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[3].TITLE.CAPTION" msgid "File name" msgstr "Файлово име" #: tfrmoptionsplugins.tsdsx.caption #, fuzzy #| msgid "Search plugins (.DSX)" msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "Приставки за търсене (.DSX)" #: tfrmoptionsplugins.tswcx.caption #, fuzzy #| msgid "Packer plugins (.WCX)" msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "Приставки за сбиване (.WCX)" #: tfrmoptionsplugins.tswdx.caption #, fuzzy #| msgid "Content plugins (.WDX)" msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "Приставки за съдържание (.WDX)" #: tfrmoptionsplugins.tswfx.caption #, fuzzy #| msgid "File system plugins (.WFX)" msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "Приставки за файлови уредби (.WFX)" #: tfrmoptionsplugins.tswlx.caption #, fuzzy #| msgid "Viewer plugins (.WLX)" msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "Приставки за преглед (.WLX)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTBEGINNING.CAPTION" msgid "&Beginning (name must start with first typed character)" msgstr "&Начало (името трябва да започва с първия набран знак)" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTENDING.CAPTION" msgid "En&ding (last character before a typed dot . must match)" msgstr "&Край (последният знак преди точката . трябва да съвпада)" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CGPOPTIONS.CAPTION" msgid "Options" msgstr "Възможности" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption #, fuzzy #| msgid "Exact name match:" msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.GBEXACTNAMEMATCH.CAPTION" msgid "Exact name match" msgstr "Точно съвпадение на имената:" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "TFRMOPTIONSTABS.CBTABSACTIVATEONCLICK.CAPTION" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "Задействане на целевото &крило при цъкане на някой от подпрозорците му" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "TFRMOPTIONSTABS.CBTABSALWAYSVISIBLE.CAPTION" msgid "&Show tab header also when there is only one tab" msgstr "Показване на &заглавки на подпрозорците, дори когато има само един" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption #, fuzzy #| msgid "&Confirm close all tabs" msgctxt "TFRMOPTIONSTABS.CBTABSCONFIRMCLOSEALL.CAPTION" msgid "Con&firm close all tabs" msgstr "&Искане на потвърждение при затваряне на всички подпрозорци" #: tfrmoptionstabs.cbtabslimitoption.caption #, fuzzy #| msgid "&Limit tab title length to:" msgctxt "TFRMOPTIONSTABS.CBTABSLIMITOPTION.CAPTION" msgid "&Limit tab title length to" msgstr "&Ширина на заглавията на подстранците:" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "TFRMOPTIONSTABS.CBTABSLOCKEDASTERISK.CAPTION" msgid "Show locked tabs &with an asterisk *" msgstr "Означаване на заключените подпрозорци със звездичка *" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "TFRMOPTIONSTABS.CBTABSMULTILINES.CAPTION" msgid "&Tabs on multiple lines" msgstr "Многоредово разположение на &подстраниците" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENFOREGROUND.CAPTION" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Ctrl+&Up отваря нов подпрозорец на преден план" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENNEARCURRENT.CAPTION" msgid "Open &new tabs near current tab" msgstr "Отваряне на &новите подпрозорци до текущия" #: tfrmoptionstabs.cbtabsshowclosebutton.caption msgctxt "TFRMOPTIONSTABS.CBTABSSHOWCLOSEBUTTON.CAPTION" msgid "Show ta&b close button" msgstr "" #: tfrmoptionstabs.gbtabs.caption msgctxt "TFRMOPTIONSTABS.GBTABS.CAPTION" msgid "Folder tabs headers" msgstr "Заглавки на подстраниците на папките" #: tfrmoptionstabs.lblchar.caption msgctxt "TFRMOPTIONSTABS.LBLCHAR.CAPTION" msgid "characters" msgstr "знака" #: tfrmoptionstabs.lbltabsposition.caption msgctxt "TFRMOPTIONSTABS.LBLTABSPOSITION.CAPTION" msgid "Ta&bs position" msgstr "" #: tfrmoptionsterminal.lblruninterm.caption msgid "Run in &terminal:" msgstr "" #: tfrmoptionsterminal.lblrunterm.caption msgid "Run t&erminal:" msgstr "" #: tfrmoptionstoolbar.btnclonebutton.caption msgctxt "tfrmoptionstoolbar.btnclonebutton.caption" msgid "C&lone button" msgstr "" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "tfrmoptionstoolbar.btndeletebutton.caption" msgid "&Delete" msgstr "Из&триване" #: tfrmoptionstoolbar.btnedithotkey.caption #, fuzzy #| msgid "Edit hotkey" msgctxt "tfrmoptionstoolbar.btnedithotkey.caption" msgid "Edit hot&key" msgstr "Обработка" #: tfrmoptionstoolbar.btninsertbutton.caption msgctxt "tfrmoptionstoolbar.btninsertbutton.caption" msgid "&Insert new button" msgstr "" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "tfrmoptionstoolbar.btnopenfile.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "tfrmoptionstoolbar.btnopenicon.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnremovehotkey.caption msgctxt "tfrmoptionstoolbar.btnremovehotkey.caption" msgid "Remove hotke&y" msgstr "" #: tfrmoptionstoolbar.cbflatbuttons.caption msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "Плоски бутони" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "" #: tfrmoptionstoolbar.gbgroupbox.caption msgctxt "tfrmoptionstoolbar.gbgroupbox.caption" msgid "Appearance" msgstr "Облик" #: tfrmoptionstoolbar.lblbarsize.caption msgctxt "tfrmoptionstoolbar.lblbarsize.caption" msgid "&Bar size:" msgstr "" #: tfrmoptionstoolbar.lblexternalcommand.caption msgctxt "tfrmoptionstoolbar.lblexternalcommand.caption" msgid "Comman&d:" msgstr "" #: tfrmoptionstoolbar.lblexternalparameters.caption msgctxt "tfrmoptionstoolbar.lblexternalparameters.caption" msgid "Parameter&s:" msgstr "" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "" #: tfrmoptionstoolbar.lbliconfile.caption #, fuzzy #| msgid "Icon:" msgctxt "tfrmoptionstoolbar.lbliconfile.caption" msgid "Ico&n:" msgstr "&Файл със значета:" #: tfrmoptionstoolbar.lbliconsize.caption msgctxt "tfrmoptionstoolbar.lbliconsize.caption" msgid "Icon si&ze:" msgstr "" #: tfrmoptionstoolbar.lblinternalcommand.caption msgctxt "tfrmoptionstoolbar.lblinternalcommand.caption" msgid "Co&mmand:" msgstr "" #: tfrmoptionstoolbar.lblinternalparameters.caption msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "" #: tfrmoptionstoolbar.lblstartpath.caption #, fuzzy #| msgid "Start path:" msgctxt "tfrmoptionstoolbar.lblstartpath.caption" msgid "Start pat&h:" msgstr "&Пусков път:" #: tfrmoptionstoolbar.lbltooltip.caption #, fuzzy #| msgid "Tooltip:" msgctxt "tfrmoptionstoolbar.lbltooltip.caption" msgid "&Tooltip:" msgstr "&Подсказка:" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption #, fuzzy #| msgid "Keep terminal window open after executing program" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSKEEPTERMINALOPEN.CAPTION" msgid "&Keep terminal window open after executing program" msgstr "Прозорецът на терминал остава отворен след изпълнение на приложението" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption #, fuzzy #| msgid "Execute in terminal" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSRUNINTERMINAL.CAPTION" msgid "&Execute in terminal" msgstr "Изпълняване в терминал" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption #, fuzzy #| msgid "Use external program" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSUSEEXTERNALPROGRAM.CAPTION" msgid "&Use external program" msgstr "Позлване на външно приложение" #: tfrmoptionstoolbase.lbltoolsparameters.caption #, fuzzy #| msgid "Additional parameters" msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPARAMETERS.CAPTION" msgid "A&dditional parameters" msgstr "Допълнителни ключове" #: tfrmoptionstoolbase.lbltoolspath.caption #, fuzzy #| msgid "Path to program to execute" msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPATH.CAPTION" msgid "&Path to program to execute" msgstr "Път към приложението" #: tfrmoptionstooltips.btnaddfields.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "Добавяне" #: tfrmoptionstooltips.btnapplyfields.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "Прилагане" #: tfrmoptionstooltips.btndeletefields.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "Изтриване" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Шаблон..." #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "Показване на подсказки" #: tfrmoptionstooltips.lblfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "" #: tfrmoptionstooltips.lblfieldsmask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "Разширения на раздела:" #: tfrmoptionstooltips.lblfieldsname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "Име на раздела:" #: tfrmoptionstooltips.rbtooltipallfiles.caption #, fuzzy #| msgid "Show tool tip for all files in file panel" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "Показване на подсказки за всички файлове в крилото" #: tfrmoptionstooltips.rbtooltipnone.caption #, fuzzy #| msgid "Don't show" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "Без подсказки" #: tfrmoptionstooltips.rbtooltiponlylarge.caption #, fuzzy #| msgid "Show tool tip for files in file panel if truncated" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "Без подсказки за файлове, които не се побират в крилото" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNBACKVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNFONTVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.gbviewerbookmode.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWERBOOKMODE.CAPTION" msgid "Viewer Book Mode" msgstr "" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWEREXAMPLE.CAPTION" msgid "Example" msgstr "Пример" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption msgctxt "TFRMOPTIONSVIEWER.LBLBACKGROUNDCOLORVIEWERBOOK.CAPTION" msgid "&Background color in book viewer" msgstr "" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption msgctxt "TFRMOPTIONSVIEWER.LBLFONTCOLORVIEWERBOOK.CAPTION" msgid "&Font color in book viewer" msgstr "" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption msgctxt "TFRMOPTIONSVIEWER.LBLNUMBERCOLUMNSVIEWER.CAPTION" msgid "&Number of columns in book viewer" msgstr "" #: tfrmpackdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Отказ" #: tfrmpackdlg.btnconfig.caption #, fuzzy #| msgid "&Configure" msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "&Настройка" #: tfrmpackdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Помощ" #: tfrmpackdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "Добре" #: tfrmpackdlg.caption msgctxt "TFRMPACKDLG.CAPTION" msgid "Pack files" msgstr "Сбиване на файлове" #: tfrmpackdlg.cbcreateseparatearchives.caption #, fuzzy #| msgid "Create separate archives, o&ne per selected file/dir" msgid "C&reate separate archives, one per selected file/dir" msgstr "Създаване на разделни сбивки, по &една на файл/папка" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "Създаване на саморазгъващ се файл" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "&Криптиране" #: tfrmpackdlg.cbmovetoarchive.caption #, fuzzy #| msgid "M&ove to archive" msgid "Mo&ve to archive" msgstr "Пре&местване в сбивка" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "&Многотомова сбивка" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "=>" #: tfrmpackdlg.cbputintarfirst.caption msgid "P&ut in the TAR archive first" msgstr "" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "&Сбиване и на имената на пътищата (само вложено)" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "Сбиване на фал(овете) във файл:" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "Сбивачка" #: tfrmpackinfodlg.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Затваряне" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "Разгъване на вси&чки и изпълняване" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "&Разгъване и изпълняване" #: tfrmpackinfodlg.caption msgctxt "TFRMPACKINFODLG.CAPTION" msgid "Properties of packed file" msgstr "Свойства на сбития файл" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "Принадлежности:" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "Степен на уплътняване:" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "Дата:" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "Способ:" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "Първоначален размер:" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "Файл:" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "Размер след сбиване:" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "Сбивачка:" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "Време:" #: tfrmquicksearch.btncancel.caption msgctxt "tfrmquicksearch.btncancel.caption" msgid "X" msgstr "" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "" #: tfrmquicksearch.tglfilter.caption msgctxt "tfrmquicksearch.tglfilter.caption" msgid "Filter" msgstr "Пресяване" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CANCELBUTTON.CAPTION" msgid "Cancel" msgstr "Отказ" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CLOSEBUTTON.CAPTION" msgid "&Close" msgstr "&Затваряне" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.HELPBUTTON.CAPTION" msgid "&Help" msgstr "Помо&щ" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "tfrmselecttextrange.btppanel.okbutton.caption" msgid "&OK" msgstr "&Добре" #: tfrmselecttextrange.lblselecttext.caption msgid "&Select the characters to insert:" msgstr "" #: tfrmsetfileproperties.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Отказ" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "&Добре" #: tfrmsetfileproperties.caption #, fuzzy #| msgid "Change file properties" msgctxt "TFRMSETFILEPROPERTIES.CAPTION" msgid "Change attributes" msgstr "Промяна на файловите свойства" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Лешкав" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "Сбивка" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "Саздаден:" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "Скрит" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "Ползван:" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "Променен:" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "Само за четен" #: tfrmsetfileproperties.chkrecursive.caption #, fuzzy #| msgid "Recursive" msgid "Including subfolders" msgstr "Вложено" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "Системен" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Принадлежности" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Принадлежности" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Разряда:" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Група" #: tfrmsetfileproperties.lblattrinfo.caption #, fuzzy #| msgid "(gray = unchanged, checked=set attribute)" msgid "(gray field means unchanged value)" msgstr "(сиво = непроменено, отметнато = включено)" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Друго:" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Собственик" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Словесно представяне:" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Изпълнение" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Осмично:" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Запис" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Четене" #: tfrmsplitter.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Изход" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "Добре" #: tfrmsplitter.caption msgctxt "TFRMSPLITTER.CAPTION" msgid "Splitter" msgstr "Разделител" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664B - 3.5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "Файлово име" #: tfrmsplitter.grbxsize.caption #, fuzzy #| msgid "File size" msgid "Size and number of parts" msgstr "Файлов размер" #: tfrmsplitter.lbdirtarget.caption #, fuzzy #| msgid "Directory target" msgid "Directory &target" msgstr "Целева папка" #: tfrmsplitter.lbfilesource.caption #, fuzzy #| msgid "File source" msgid "File &source" msgstr "Файлов източник" #: tfrmsplitter.lblnumberparts.caption msgid "&Number of parts" msgstr "" #: tfrmsplitter.rbtngigab.caption #, fuzzy #| msgid "Gigabytes" msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "гигабайта" #: tfrmsplitter.rbtnkilob.caption #, fuzzy #| msgid "Kilobytes" msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "килобайта" #: tfrmsplitter.rbtnmegab.caption #, fuzzy #| msgid "Megabytes" msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "мегабайта" #: tfrmsymlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Отказ" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&Добре" #: tfrmsymlink.caption #, fuzzy #| msgid "Create symlink" msgid "Create symbolic link" msgstr "Създаване на мека връзка" #: tfrmsymlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Съществуваща цел, към която да сочи връзката" #: tfrmsymlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Име на връзката" #: tfrmtweakplugin.btnadd.caption #, fuzzy #| msgid "Add new" msgid "A&dd new" msgstr "Добавяне на ново" #: tfrmtweakplugin.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Отказ" #: tfrmtweakplugin.btnchange.caption #, fuzzy #| msgid "Change" msgid "C&hange" msgstr "Промяна" #: tfrmtweakplugin.btndefault.caption #, fuzzy #| msgid "Default" msgid "De&fault" msgstr "Подразбирано" #: tfrmtweakplugin.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "Добре" #: tfrmtweakplugin.btnremove.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "Премахване" #: tfrmtweakplugin.caption msgctxt "TFRMTWEAKPLUGIN.CAPTION" msgid "Tweak plugin" msgstr "Настройка на приставката" #: tfrmtweakplugin.cbpk_caps_by_content.caption #, fuzzy #| msgid "Detect archive type by content" msgid "De&tect archive type by content" msgstr "Разпознаване на сбивките според съдържанието" #: tfrmtweakplugin.cbpk_caps_delete.caption #, fuzzy #| msgid "Can delete files" msgid "Can de&lete files" msgstr "Възможно е изтриването на файлове" #: tfrmtweakplugin.cbpk_caps_encrypt.caption #, fuzzy #| msgid "Supports encryption" msgid "Supports e&ncryption" msgstr "Нарочно входно устройство:" #: tfrmtweakplugin.cbpk_caps_hide.caption #, fuzzy #| msgid "Show as normal files (hide packer icon)" msgid "Sho&w as normal files (hide packer icon)" msgstr "Показване като обичайни файлове (скриване на значето на сбивачката)" #: tfrmtweakplugin.cbpk_caps_mempack.caption #, fuzzy #| msgid "Supports packing in memory" msgid "Supports pac&king in memory" msgstr "Поддръжка на сбиване в паметта" #: tfrmtweakplugin.cbpk_caps_modify.caption #, fuzzy #| msgid "Can modify exisiting archives" msgid "Can &modify exisiting archives" msgstr "Възможна промяната на съществуващи сбивки" #: tfrmtweakplugin.cbpk_caps_multiple.caption #, fuzzy #| msgid "Archive can contain multiple files" msgid "&Archive can contain multiple files" msgstr "Архивът може да съдържа много файлове" #: tfrmtweakplugin.cbpk_caps_new.caption #, fuzzy #| msgid "Can create new archives" msgid "Can create new archi&ves" msgstr "Възможно е създаването на нови файлове" #: tfrmtweakplugin.cbpk_caps_options.caption #, fuzzy #| msgid "Supports the options dialogbox" msgid "S&upports the options dialogbox" msgstr "Поддръжка на питащ прозорец с възможности" #: tfrmtweakplugin.cbpk_caps_searchtext.caption #, fuzzy #| msgid "Allow searching for text in archives" msgid "Allow searchin&g for text in archives" msgstr "Позволяване на търсене на текст в сбивки" #: tfrmtweakplugin.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "Описание:" #: tfrmtweakplugin.lbldetectstr.caption #, fuzzy #| msgid "Detect string:" msgid "D&etect string:" msgstr "Разпознавателен низ:" #: tfrmtweakplugin.lblextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "Разширение:" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "Знамена:" #: tfrmtweakplugin.lblname.caption #, fuzzy #| msgid "Name:" msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "Име" #: tfrmtweakplugin.lblplugin.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "Приставка:" #: tfrmtweakplugin.lblplugin1.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "Приставка:" #: tfrmviewer.actabout.caption msgctxt "TFRMVIEWER.ACTABOUT.CAPTION" msgid "About Viewer..." msgstr "За прегледа..." #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "" #: tfrmviewer.actcopyfile.caption msgctxt "TFRMVIEWER.ACTCOPYFILE.CAPTION" msgid "Copy File" msgstr "" #: tfrmviewer.actcopyfile.hint msgctxt "TFRMVIEWER.ACTCOPYFILE.HINT" msgid "Copy File" msgstr "" #: tfrmviewer.actdeletefile.caption msgctxt "TFRMVIEWER.ACTDELETEFILE.CAPTION" msgid "Delete File" msgstr "" #: tfrmviewer.actdeletefile.hint msgctxt "TFRMVIEWER.ACTDELETEFILE.HINT" msgid "Delete File" msgstr "" #: tfrmviewer.actloadnextfile.caption msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.CAPTION" msgid "&Next" msgstr "На&пред" #: tfrmviewer.actloadnextfile.hint msgid "Load Next File" msgstr "" #: tfrmviewer.actloadprevfile.caption msgctxt "TFRMVIEWER.ACTLOADPREVFILE.CAPTION" msgid "&Previous" msgstr "На&зад" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "" #: tfrmviewer.actmirror.caption msgctxt "TFRMVIEWER.ACTMIRROR.CAPTION" msgid "Mirror" msgstr "" #: tfrmviewer.actmirror.hint msgctxt "TFRMVIEWER.ACTMIRROR.HINT" msgid "Mirror" msgstr "" #: tfrmviewer.actmovefile.caption msgctxt "TFRMVIEWER.ACTMOVEFILE.CAPTION" msgid "Move File" msgstr "" #: tfrmviewer.actmovefile.hint msgctxt "TFRMVIEWER.ACTMOVEFILE.HINT" msgid "Move File" msgstr "" #: tfrmviewer.actreload.caption msgctxt "TFRMVIEWER.ACTRELOAD.CAPTION" msgid "Reload" msgstr "" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "" #: tfrmviewer.actrotate180.caption msgctxt "TFRMVIEWER.ACTROTATE180.CAPTION" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate180.hint msgctxt "TFRMVIEWER.ACTROTATE180.HINT" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate270.caption msgctxt "TFRMVIEWER.ACTROTATE270.CAPTION" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate270.hint msgctxt "TFRMVIEWER.ACTROTATE270.HINT" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate90.caption msgctxt "TFRMVIEWER.ACTROTATE90.CAPTION" msgid "Rotate 90" msgstr "" #: tfrmviewer.actrotate90.hint msgctxt "TFRMVIEWER.ACTROTATE90.HINT" msgid "Rotate 90" msgstr "" #: tfrmviewer.actsaveas.caption msgctxt "TFRMVIEWER.ACTSAVEAS.CAPTION" msgid "Save As..." msgstr "" #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "" #: tfrmviewer.actstretchimage.caption msgctxt "TFRMVIEWER.ACTSTRETCHIMAGE.CAPTION" msgid "Stretch" msgstr "Разпъване" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "- 90" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "Запомняне" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "Запомняне" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "Орязване" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "Изтриване" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "Изтриване" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "Цял екран" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "||" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "Изтъкване" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "Преместване" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "Преместване" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "Отмяна" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "" #: tfrmviewer.caption msgctxt "tfrmviewer.caption" msgid "Viewer" msgstr "Преглед" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "Изтъкване" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "Преглед" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "0x0" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "+ 180" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "- 90" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "За" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "&Двоично изобразяване" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "Запомняне в кошницата" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Обработка" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "&Знаков набор" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "Из&ход" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "&Файл" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "Цял екран" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "Графики" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "&Шестнадесетично изобразяване" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "Из&ображение" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "Приставки" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "Преглед" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "" #: tfrmviewer.mirotate.caption msgid "Rotate" msgstr "" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "" #: tfrmviewer.misaveas.caption msgctxt "TFRMVIEWER.MISAVEAS.CAPTION" msgid "Save As..." msgstr "" #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "Търсене" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "Избор на всички" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.mistretch.caption msgctxt "TFRMVIEWER.MISTRETCH.CAPTION" msgid "Stretch" msgstr "Разпъване" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "&Словесно изобразяване" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "&Преглед" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "Иобразяване като &редоделен текст" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "Запомняне в кошницата" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "Избор на всички" #: tfrmviewoperations.btnstartpause.caption #, fuzzy #| msgid "Start" msgctxt "tfrmviewoperations.btnstartpause.caption" msgid "&Start" msgstr "Начало" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "" #: tfrmviewoperations.caption msgctxt "TFRMVIEWOPERATIONS.CAPTION" msgid "File operations" msgstr "Действия с файлове" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "" #: tfrmviewoperations.mnucanceloperation.caption msgctxt "tfrmviewoperations.mnucanceloperation.caption" msgid "Cancel" msgstr "Отказ" #: tfrmviewoperations.mnucancelqueue.caption msgctxt "tfrmviewoperations.mnucancelqueue.caption" msgid "Cancel" msgstr "Отказ" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "tfrmviewoperations.mnuoperationshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "" #: tfrmviewoperations.mnuqueue.caption msgctxt "tfrmviewoperations.mnuqueue.caption" msgid "Queue" msgstr "" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "tfrmviewoperations.mnuqueueshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "tmultiarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "twcxarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "" #: ulng.rscolattr msgid "Attr" msgstr "Принад" #: ulng.rscoldate msgid "Date" msgstr "Дата" #: ulng.rscolext msgid "Ext" msgstr "Разш" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "Име" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "Размер" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "Брой промени:" #: ulng.rsconfcolalign msgid "Align" msgstr "Подравняване" #: ulng.rsconfcolcaption msgid "Caption" msgstr "Надпис" #: ulng.rsconfcolconfig msgid "Config" msgstr "Настр" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "Изтриване" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "Съдържание на полето" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "Преместване" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "Ширина" #: ulng.rsconfcustheader msgid "Customize column" msgstr "Нагласяване на стълбове:" #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "" #: ulng.rsdlgallopcomplete msgid "All operations completed" msgstr "" #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "Всички" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "&Довършване" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "&Отказ" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "" #: ulng.rsdlgbuttonno msgid "&No" msgstr "&Не" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "&Няма" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "&Добре" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "&Замяна" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "Замяна &Всички" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "&Пропускане" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "П&ропускане на всички" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "&Да" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "Изчисляване на проверочен сбор..." #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "Сверяване на проверочен сбор..." #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "Презапис на на файл(ове)" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "Изтриване на файл(ове)" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "Преместване на на файл(ове)" #: ulng.rsdlgoppause msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "" #: ulng.rsdlgopstart #, fuzzy #| msgid "Start" msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "Начало" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "" #: ulng.rsdlgspeedtime #, fuzzy #| msgid "Speed %s/s, remaining time %s" msgid "Speed %s/s, time remaining %s" msgstr "Скорост %s/s, оставащо време %s" #: ulng.rsdlgsplit #, fuzzy #| msgid "Split file" msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "Раздробяване на файл" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "" #: ulng.rsdrivenolabel msgid "" msgstr "" #: ulng.rsdrivenomedia msgid "" msgstr "" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Вътрешният преглед на Double Commander." #: ulng.rseditnewfile msgid "new.txt" msgstr "нов.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "Файлово име:" #: ulng.rseditnewopen msgid "Open file" msgstr "Отваряне на файл" #: ulng.rseditsearchback msgid "&Backward" msgstr "На&зад" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "Търсене" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "На&пред" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "Замяна" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "" #: ulng.rsfileopsetpropertyerroroptions msgctxt "ulng.rsfileopsetpropertyerroroptions" msgid "Ask;Don't set anymore;Ignore errors" msgstr "" #: ulng.rsfilterstatus msgid "FILTER" msgstr "" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "%s равнище/а" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "всички (неограничена дълбочина)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "само текущата папка" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "Не съществува папка %s!" #: ulng.rsfindfound msgid "Found: %d" msgstr "Found: %d" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "" #: ulng.rsfindscanned msgid "Scanned: %d" msgstr "Обходени: %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "Търсене на файлове" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "Начало" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr "Свободни %s от %s байта" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "" #: ulng.rsfuncatime msgid "Access date/time" msgstr "" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "Принадлежности" #: ulng.rsfunccomment msgctxt "ulng.rsfunccomment" msgid "Comment" msgstr "" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "" #: ulng.rsfuncext msgid "Extension" msgstr "" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "Група" #: ulng.rsfunclinkto msgid "Link to" msgstr "" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "Име" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "Собственик" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "Път" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "Размер" #: ulng.rsfunctype msgid "Type" msgstr "" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "Грешка при създаване на твърда връзка." #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "Срявнител" #: ulng.rshotkeycategorymain msgid "Main" msgstr "" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "Преглед" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "Сглобяването приключи" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "Признак за смяна на избора" #: ulng.rsmarkplus msgid "Select mask" msgstr "Избор на маска" #: ulng.rsmaskinput msgid "Input mask:" msgstr "Входна маска:" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "Настройка на нагласените стълбове" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "Настройка на нагласените стълбове на изгледа" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "Действия" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "Обработка" #: ulng.rsmnueject msgid "Eject" msgstr "Изваждане" #: ulng.rsmnumount msgid "Mount" msgstr "Прикачане" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "" #: ulng.rsmnunomedia msgid "No media available" msgstr "" #: ulng.rsmnuopenwith msgid "Open with" msgstr "" #: ulng.rsmnuopenwithother msgid "Other..." msgstr "" #: ulng.rsmnusortby msgid "Sort by" msgstr "" #: ulng.rsmnuumount #, fuzzy #| msgid "Umount" msgid "Unmount" msgstr "Разкачане" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "Преглед" #: ulng.rsmsgaccount msgid "Account:" msgstr "" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "Смяната на папката на [%s] бе неуспешно!" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "Премахване на бездейните подпрозорци?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "Презапис на %d избраните папки/файлове?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "Презаписване на избрания „%s“?" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "Изтриване на %d избраните папки/файлове?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "Изтриване на избрания \"%s\"?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "Дискът не е на разположение" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "Въведете разширение:" #: ulng.rsmsgentername msgid "Enter name:" msgstr "Въведете име:" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "Грешка CRC в данните на сбивката" #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "Данните са лоши" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "" #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "Папка %s съществува!" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "Действието е прекъснато от потребителя" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "Грешка при затваряне на файла" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "Създаването на файла е невъзможно" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "Файловете в сбивката свършиха" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "Отварянето на съществуващия файл е невъзможно" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "Грешка при четене оф файла" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "Грешка при запис във файла" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "Създаването на папка %s е невъзможно!" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "Не са намерени файлове" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "Недостатъчно памет" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "Действието не се поддържа!" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "Буферът е много малък" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "Твърде много файлове за сбиване" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "Форматът на сбивката е непознат" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "Фаълът %s е променен. Да бъде ли съхранен?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "Съществува файл %s. Да бъде ли заменен?" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "" #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "Вече съществува %s, замяна?" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "Следване на мека връзка \"%s\"?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "" #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "" #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "" #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "Презапис на файл %s" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "Изтриване на файл %s" #: ulng.rsmsglogerror msgid "Error: " msgstr "Грешка:" #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "Извличане на файл %s" #: ulng.rsmsgloginfo msgid "Info: " msgstr "Сведения:" #: ulng.rsmsgloglink msgid "Create link %s" msgstr "Създаване на връзка %s" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "Създаване на папка %s" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "Преместване на файл %s" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "Сбиване във файл %s" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "Изтриване на папка %s" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "Готово:" #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "Създаване на мека връзка %s" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "" #: ulng.rsmsgnewfile msgid "New file" msgstr "Нов файл" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "Ще бъде разгънат следвашия том" #: ulng.rsmsgnofiles msgid "No files" msgstr "" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "" #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "Недостатъчно място на целевата папка. Да продължа ли?" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "Недостатъчно място на целевата папка. Да опитам ли пак?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "Невъзможно е изтриването на %s" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "" #: ulng.rsmsgpassword msgid "Password:" msgstr "" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "&Добавяне на %s" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "&Настройка" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "&Изтриване на %s" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "Преименуване/местене на %d избраните папки/файлове?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "Преименуване/местене на избрания \"%s\"?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "Презапуснете Double Commander, за да влязат промените в сила" #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "Посочете местоположението на следващия том" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "Слагане име на тома" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "Избрани са прекалено много файлове" #: ulng.rsmsgurl msgid "URL:" msgstr "" #: ulng.rsmsgusername msgid "User name:" msgstr "" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "Етикет на тома:" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "" #: ulng.rsmulrenfilenamestylelist #| msgid "No change;UPPERCASE;lowercase;First Char Big;" msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "Без промяна; ВИСША; низша; Първият знак главен; Първият Знак На Всяка Дума Главен;" #: ulng.rsoperaborted msgid "Aborted" msgstr "" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "" #: ulng.rsopercombining msgid "Joining" msgstr "" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopying msgid "Copying" msgstr "" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "" #: ulng.rsoperexecuting msgid "Executing" msgstr "" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "" #: ulng.rsoperextracting msgid "Extracting" msgstr "" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperfinished msgid "Finished" msgstr "" #: ulng.rsoperlisting msgid "Listing" msgstr "" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "" #: ulng.rsopermoving msgid "Moving" msgstr "" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "" #: ulng.rsopernotstarted msgid "Not started" msgstr "" #: ulng.rsoperpacking msgid "Packing" msgstr "" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpaused msgid "Paused" msgstr "" #: ulng.rsoperpausing msgid "Pausing" msgstr "" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "" #: ulng.rsoperrunning msgid "Running" msgstr "" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "" #: ulng.rsopersplitting msgid "Splitting" msgstr "" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperstarting msgid "Starting" msgstr "" #: ulng.rsoperstopped msgid "Stopped" msgstr "" #: ulng.rsoperstopping msgid "Stopping" msgstr "" #: ulng.rsopertesting msgid "Testing" msgstr "" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "" #: ulng.rsoperwiping msgid "Wiping" msgstr "" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "" #: ulng.rsoperworking msgid "Working" msgstr "" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "Изтриване:" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "Създаване на саморазгъващ се архив:" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "Проверка:" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "Име на вида архив:" #: ulng.rsoptarchivevalue msgid "Value" msgstr "" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "Обвързване на приставка \"%s\" с:" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "" #: ulng.rsoptdisable msgid "Disable" msgstr "Забраняване" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "Разрешаване" #: ulng.rsoptenterext msgid "Enter extension" msgstr "Въведете разширение" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "" #: ulng.rsoptexamplemark msgid "Mark" msgstr "" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "" #: ulng.rsoptexampletext msgid "Text" msgstr "" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "" #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "" #: ulng.rsopthotkeysdeletetrashcanoverrides msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "" #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "" #: ulng.rsopthotkeysshortcutusedtext1 msgid "Shortcut %s is already used." msgstr "" #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "" #: ulng.rsopthotkeysusedby msgid "used for %s in %s" msgstr "" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "Архиватори" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "Самоопресняване" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "Поведения" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "Цветове" #: ulng.rsoptionseditorcolumnsview msgctxt "ulng.rsoptionseditorcolumnsview" msgid "Columns" msgstr "Стълбове" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "Настройка" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "" #: ulng.rsoptionseditorfileoperations msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "Действия с файлове" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "Файлови крила" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "Видове файлове" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "Папкови подпрозорци" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "Шрифтове" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "Клавишни съчетания" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "Значета" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "Пренебрегвания" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "Език" #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "Подредба" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "Дневник" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "Разни" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "Приставки" #: ulng.rsoptionseditorquicksearch msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "Бързо търсене/пресяване" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "Терминал" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "Средства" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "Ляво цъкало;Дясно цъкало;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "Приставката %s вече свързана със следното разширение:" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "Деен" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "Файлово име" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "Име" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "Записано на" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "" #: ulng.rsopttoolbarbuttontype msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "Файл" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "Папка" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "Наименована тръба" #: ulng.rspropsno msgid "No" msgstr "Не" #: ulng.rspropssocket msgid "Socket" msgstr "Гнездо" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "Нарочно блоково устройство" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "Нарочно знаково устройство" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "Мека връзка" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "Неизвестен вид" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "Да (%s)" #: ulng.rssearchresult msgid "Search result" msgstr "Намерени" #: ulng.rssearchtemplateunnamed msgid "" msgstr "" #: ulng.rsselectdir msgid "Select a directory" msgstr "Избор на папка" #: ulng.rsshowhelpfor msgid "&Show help for %s" msgstr "" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "байта" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "гигабайта" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "килобайта" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "мегабайта" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "терабайта" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "Файлове: %d, папки: %d, размер: %s (%s байта)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "Създаването на целевата папка е невъзможно!" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "Неправилно изписване на файловия размер!" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "Неуспешно раздробяване на файла!" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "" #: ulng.rssplitseldir msgid "Select directory:" msgstr "Изберете папка:" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "Грешка при създаване на мека връзка." #: ulng.rssyndefaulttext msgctxt "ulng.rssyndefaulttext" msgid "Default text" msgstr "" #: ulng.rssynlangplaintext msgctxt "ulng.rssynlangplaintext" msgid "Plain text" msgstr "" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "Ден/ дни" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "час(а)" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "минута/и" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "месец(а)" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "секунда/и" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "седмица/и" #: ulng.rstimeunityear msgid "Year(s)" msgstr "година/и" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "Срявнител" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "Обработчик" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "Терминал" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "Преглед" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "" #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "Мрежа" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "Вътрешен преглед на Double Commander" #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "Знаков набор" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "%s не е открит!" doublecmd-0.5.8/language/doublecmd.cht.po0000644000175000017500000066530612250633131017360 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.5 alpha\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: \n" "PO-Revision-Date: 2013-04-17 19:07+0800\n" "Last-Translator: Kne luo\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Chinese Traditional\n" "X-Poedit-SourceCharset: utf-8\n" "X-Poedit-Country: TAIWAN\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "全部" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "全部" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "全部" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "全部" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "全部" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "全部" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "全部" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "取消" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "..." #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "->" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "<-" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "設置自訂欄位檢視" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "背景色彩:" #: tfcolumnssetconf.cbcursorborder.caption msgid "Cursor border" msgstr "指標外框" #: tfcolumnssetconf.cbovercolor.caption msgid "Allow Overcolor" msgstr "允許顏色覆蓋" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "使用自訂字型和色彩" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "文字色彩:" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "字型:" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "大小:" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "背景色彩2:" #: tfcolumnssetconf.lblconfigviewnr.caption msgid "Configure view nr:" msgstr "設置檢視:" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "指標行背景色彩:" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "指標行文字色彩:" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "標記行色彩:" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "名稱:" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "新增欄位" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "自訂欄位:" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "預覽" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "R" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "選擇範本..." #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption #| msgid "Check free space" msgid "C&heck free space" msgstr "檢查可用空間 (&H)" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption msgid "Cop&y attributes" msgstr "複製屬性 (&Y)" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption msgid "Copy o&wnership" msgstr "複製擁有者 (&W)" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption msgid "Copy d&ate/time" msgstr "複製日期/時間 (&A)" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption #| msgid "Correct links" msgid "Correct lin&ks" msgstr "修正連結 (&K)" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption #| msgid "Drop readonly flag" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "丟棄唯讀屬性 (&G)" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption msgid "E&xclude empty directories" msgstr "排除空白資料夾 (&X)" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption #| msgid "Follow links" msgid "Fo&llow links" msgstr "允許連結 (&L)" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "預留空間 (&R)" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "當不能設定檔案時間、屬性及其它項目時要如何處理" #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "使用檔案範本" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption #| msgid "When directory exists" msgid "When dir&ectory exists" msgstr "當資料夾存在時 (&E)" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption #| msgid "When file exists" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "當檔案存在時 (&F)" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption msgid "When ca&nnot set property" msgstr "當不能設定檔案內容時 (&N)" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "<沒有範本>" #: tfrmabout.btnclose.caption msgctxt "TFRMABOUT.BTNCLOSE.CAPTION" msgid "&Close" msgstr "關閉 (&C)" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "複製到剪貼簿" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "關於" #: tfrmabout.lblbuild.caption msgid "Build" msgstr "構建" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "Free Pascal" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "首頁:" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "http://doublecmd.sourceforge.net" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "Lazarus" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "修訂" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption msgid "Version" msgstr "版本" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "重置 (&R)" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "選擇屬性" #: tfrmattributesedit.cbarchive.caption #| msgid "Archive" msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "封存 (&A)" #: tfrmattributesedit.cbcompressed.caption #| msgid "Compressed" msgid "Co&mpressed" msgstr "壓縮 (&M)" #: tfrmattributesedit.cbdirectory.caption #| msgid "Directory" msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "資料夾 (&D)" #: tfrmattributesedit.cbencrypted.caption #, fuzzy #| msgid "Encrypted" msgid "&Encrypted" msgstr "加密 (&E)" #: tfrmattributesedit.cbhidden.caption #, fuzzy #| msgid "Hidden" msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "隱藏 (&H)" #: tfrmattributesedit.cbreadonly.caption #, fuzzy #| msgid "Read only" msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "唯讀 (&N)" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmattributesedit.cbsparse.caption #, fuzzy #| msgid "Sparse" msgid "S&parse" msgstr "疏鬆 (&P)" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Sticky" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmattributesedit.cbsymlink.caption #, fuzzy #| msgid "Symlink" msgid "&Symlink" msgstr "符號連結 (&S)" #: tfrmattributesedit.cbsystem.caption #, fuzzy #| msgid "System" msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "系統 (&Y)" #: tfrmattributesedit.cbtemporary.caption #, fuzzy #| msgid "Temporary" msgid "&Temporary" msgstr "暫存 (&T)" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "NTFS 屬性" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "一般屬性" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "群組" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "其他" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "擁有者" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "執行" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "讀取" #: tfrmattributesedit.lbltextattrs.caption #, fuzzy #| msgid "As text:" msgid "As te&xt:" msgstr "當成文字檔 (&X):" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "寫入" #: tfrmchecksumcalc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfrmchecksumcalc.caption msgctxt "tfrmchecksumcalc.caption" msgid "Calculate check sum..." msgstr "計算驗證碼..." #: tfrmchecksumcalc.cbseparatefile.caption #, fuzzy #| msgid "Create separate checksum file for each file" msgid "C&reate separate checksum file for each file" msgstr "為每個檔案建立單獨的驗證碼檔案 (&R)" #: tfrmchecksumcalc.lblsaveto.caption #, fuzzy #| msgid "Save check sum file(s) to:" msgid "&Save check sum file(s) to:" msgstr "儲存驗證碼檔案到 (&S):" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "關閉 (&C)" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "校驗驗證碼..." #: tfrmconnectionmanager.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "加入 (&D)" #: tfrmconnectionmanager.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmconnectionmanager.btnconnect.caption #, fuzzy #| msgid "Connect" msgid "C&onnect" msgstr "連線 (&O)" #: tfrmconnectionmanager.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "刪除 (&D)" #: tfrmconnectionmanager.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "編輯 (&E)" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "連線管理" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "連線到:" #: tfrmcopydlg.btnaddtoqueue.caption #, fuzzy #| msgid "Add To Queue" msgid "A&dd To Queue" msgstr "加入佇列" #: tfrmcopydlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "tfrmcopydlg.btncreatespecialqueue.caption" msgid "..." msgstr "..." #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "選項 (&P)" #: tfrmcopydlg.btnsaveoptions.caption #, fuzzy #| msgid "Save these options as default" msgid "Sa&ve these options as default" msgstr "將目前設定儲存為預設值 (&V)" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "複製檔案" #: tfrmdescredit.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "檔案/資料夾註解" #: tfrmdescredit.lbleditcommentfor.caption #, fuzzy #| msgid "Edit comment for:" msgid "E&dit comment for:" msgstr "編輯註解 (&D):" #: tfrmdescredit.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "編碼 (&E):" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "關於" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "自動比較" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "二進制模式" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "取消" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "取消" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "複製區塊至右邊" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "複製區塊至右邊" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "複製區塊至左邊" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "複製區塊至左邊" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "複製" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "剪下" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "刪除" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "貼上" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "重做" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "全選 (&A)" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "復原" #: tfrmdiffer.actexit.caption msgctxt "tfrmdiffer.actexit.caption" msgid "E&xit" msgstr "離開 (&X)" #: tfrmdiffer.actfirstdifference.caption msgctxt "tfrmdiffer.actfirstdifference.caption" msgid "First Difference" msgstr "第一個不同點" #: tfrmdiffer.actfirstdifference.hint msgctxt "tfrmdiffer.actfirstdifference.hint" msgid "First Difference" msgstr "第一個不同點" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "忽略大小寫" #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "忽略空白" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "同步捲動" #: tfrmdiffer.actlastdifference.caption msgctxt "tfrmdiffer.actlastdifference.caption" msgid "Last Difference" msgstr "最後一個不同點" #: tfrmdiffer.actlastdifference.hint msgctxt "tfrmdiffer.actlastdifference.hint" msgid "Last Difference" msgstr "最後一個不同點" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "註明不同點" #: tfrmdiffer.actnextdifference.caption msgctxt "tfrmdiffer.actnextdifference.caption" msgid "Next Difference" msgstr "下一個不同點" #: tfrmdiffer.actnextdifference.hint msgctxt "tfrmdiffer.actnextdifference.hint" msgid "Next Difference" msgstr "下一個不同點" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "開啟左邊文件..." #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "開啟右邊文件..." #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "繪製背景色彩" #: tfrmdiffer.actprevdifference.caption msgctxt "tfrmdiffer.actprevdifference.caption" msgid "Previous Difference" msgstr "上一個不同點" #: tfrmdiffer.actprevdifference.hint msgctxt "tfrmdiffer.actprevdifference.hint" msgid "Previous Difference" msgstr "上一個不同點" #: tfrmdiffer.actreload.caption #, fuzzy #| msgid "Reload" msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "重新載入 (&R)" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "重新載入" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "儲存" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "儲存" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "另存新檔..." #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "另存新檔..." #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "儲存左邊文件" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "儲存左邊文件" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "左邊文件另存新檔..." #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "左邊文件另存新檔..." #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "儲存右邊文件" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "儲存右邊文件" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "右邊文件另存新檔..." #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "右邊文件另存新檔..." #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "比較" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "比較" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "編碼" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "編碼" #: tfrmdiffer.caption msgctxt "TFRMDIFFER.CAPTION" msgid "Compare files" msgstr "比較檔案" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miencodingleft.caption #, fuzzy #| msgid "Left" msgid "&Left" msgstr "左邊 (&L)" #: tfrmdiffer.miencodingright.caption #, fuzzy #| msgid "Right" msgid "&Right" msgstr "右邊 (&R)" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "動作 (&A)" #: tfrmdiffer.mnuedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "編輯 (&E)" #: tfrmdiffer.mnuencoding.caption #, fuzzy #| msgid "Encoding" msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "編碼 (&C)" #: tfrmdiffer.mnufile.caption #, fuzzy #| msgid "File" msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "檔案 (&F)" #: tfrmdiffer.mnuoptions.caption msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "選項 (&O)" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "新增新的快速鍵序列" #: tfrmedithotkey.btncancel.caption msgctxt "TFRMEDITHOTKEY.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmedithotkey.btnok.caption msgctxt "TFRMEDITHOTKEY.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "移除最後的快速鍵序列" #: tfrmedithotkey.cghkcontrols.caption msgctxt "tfrmedithotkey.cghkcontrols.caption" msgid "Only for these controls" msgstr "僅用於這些控制項" #: tfrmedithotkey.lblparameters.caption #, fuzzy #| msgid "Parameters (each in a separate line):" msgid "&Parameters (each in a separate line):" msgstr "參數(每參數一行) (&P):" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "快速鍵:" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "關於" #: tfrmeditor.actabout.hint msgctxt "tfrmeditor.actabout.hint" msgid "About" msgstr "關於" #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "設置 (&C)" #: tfrmeditor.actconfhigh.hint msgctxt "tfrmeditor.actconfhigh.hint" msgid "Configuration" msgstr "設置" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "複製" #: tfrmeditor.acteditcopy.hint msgctxt "tfrmeditor.acteditcopy.hint" msgid "Copy" msgstr "複製" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "剪下" #: tfrmeditor.acteditcut.hint msgctxt "tfrmeditor.acteditcut.hint" msgid "Cut" msgstr "剪下" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "刪除" #: tfrmeditor.acteditdelete.hint msgctxt "tfrmeditor.acteditdelete.hint" msgid "Delete" msgstr "刪除" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "尋找 (&F)" #: tfrmeditor.acteditfind.hint msgctxt "tfrmeditor.acteditfind.hint" msgid "Find" msgstr "尋找" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "找下一個" #: tfrmeditor.acteditfindnext.hint msgctxt "tfrmeditor.acteditfindnext.hint" msgid "Find next" msgstr "找下一個" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "Mac (CR)" #: tfrmeditor.acteditlineendcr.hint msgctxt "tfrmeditor.acteditlineendcr.hint" msgid "Mac (CR)" msgstr "Mac (CR)" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "Windows (CRLF)" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "tfrmeditor.acteditlineendcrlf.hint" msgid "Windows (CRLF)" msgstr "Windows (CRLF)" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "Unix (LF)" #: tfrmeditor.acteditlineendlf.hint msgctxt "tfrmeditor.acteditlineendlf.hint" msgid "Unix (LF)" msgstr "Unix (LF)" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "貼上" #: tfrmeditor.acteditpaste.hint msgctxt "tfrmeditor.acteditpaste.hint" msgid "Paste" msgstr "貼上" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "重做" #: tfrmeditor.acteditredo.hint msgctxt "tfrmeditor.acteditredo.hint" msgid "Redo" msgstr "重做" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "取代 (&R)" #: tfrmeditor.acteditrplc.hint msgctxt "tfrmeditor.acteditrplc.hint" msgid "Replace" msgstr "取代" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "全選 (&A)" #: tfrmeditor.acteditselectall.hint msgctxt "tfrmeditor.acteditselectall.hint" msgid "Select All" msgstr "全選" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "復原" #: tfrmeditor.acteditundo.hint msgctxt "tfrmeditor.acteditundo.hint" msgid "Undo" msgstr "復原" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "關閉 (&C)" #: tfrmeditor.actfileclose.hint msgctxt "tfrmeditor.actfileclose.hint" msgid "Close" msgstr "關閉" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "離開 (&X)" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "離開" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "新增 (&N)" #: tfrmeditor.actfilenew.hint #, fuzzy msgctxt "tfrmeditor.actfilenew.hint" msgid "New" msgstr "新增" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "開啟 (&O)" #: tfrmeditor.actfileopen.hint msgctxt "tfrmeditor.actfileopen.hint" msgid "Open" msgstr "開啟" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "儲存 (&S)" #: tfrmeditor.actfilesave.hint msgctxt "tfrmeditor.actfilesave.hint" msgid "Save" msgstr "儲存" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "另存新檔 (&A)..." #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "另存新檔" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "儲存所有檔案 (&V)" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "儲存所有檔案" #: tfrmeditor.caption msgctxt "tfrmeditor.caption" msgid "Editor" msgstr "編輯器" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "說明 (&H)" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "編輯 (&E)" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "編碼 (&C)" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "開啟為" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "儲存為" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "檔案 (&F)" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "語法高亮 (&S)" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "換行符號" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n5.caption msgctxt "TFRMEDITOR.N5.CAPTION" msgid "-" msgstr "-" #: tfrmeditsearchreplace.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "大小寫視為相異 (&A)" #: tfrmeditsearchreplace.cbsearchfromcursor.caption #, fuzzy #| msgid "Search from &caret" msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "從目前位置找起 (&E)" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "規則運算式 (&R)" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "僅選擇文字 (&T)" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "僅完整單字 (&W)" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "選項" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "取代 (&R):" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "搜尋 (&S):" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "方向" #: tfrmextractdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmextractdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "說明 (&H)" #: tfrmextractdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfrmextractdlg.caption msgctxt "TFRMEXTRACTDLG.CAPTION" msgid "Unpack files" msgstr "解壓縮檔案" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "解壓時包含完整的路徑名稱 (&U)" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*.*" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "將每個壓縮檔解壓到不同的子資料夾 (名稱用壓縮檔名稱) (&S)" #: tfrmextractdlg.cboverwrite.caption #, fuzzy #| msgid "&Overwrite existing files" msgid "O&verwrite existing files" msgstr "覆寫已存在檔案 (&V)" #: tfrmextractdlg.lblextractto.caption #, fuzzy #| msgid "To the directory:" msgid "To the &directory:" msgstr "解壓路徑 (&D):" #: tfrmextractdlg.lblfilemask.caption #, fuzzy #| msgid "Extract files matching file mask:" msgid "&Extract files matching file mask:" msgstr "解壓檔案遮罩 (&E):" #: tfrmextractdlg.lblpassword.caption #, fuzzy #| msgid "Password for encrypted files:" msgid "&Password for encrypted files:" msgstr "加密檔案的密碼 (&P):" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "新增" #: tfrmfileassoc.btnaddext.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "新增 (&A)" #: tfrmfileassoc.btnaddnewtype.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "新增 (&D)" #: tfrmfileassoc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmfileassoc.btndownact.caption #, fuzzy #| msgid "Down" msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "下移 (&D)" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfrmfileassoc.btnremoveact.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "移除 (&V)" #: tfrmfileassoc.btnremoveext.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "移除 (&M)" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "X" #: tfrmfileassoc.btnremovetype.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "移除 (&R)" #: tfrmfileassoc.btnrenametype.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "重新命名 (&E)" #: tfrmfileassoc.btnupact.caption #, fuzzy #| msgid "Up" msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "上移 (&U)" #: tfrmfileassoc.caption msgid "File associations" msgstr "檔案關聯" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "動作" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "副檔名" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "檔案類型" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "圖示" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "動作:" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "指令 (&C):" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "編輯" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "在編輯器開啟" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "檔案名稱" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "檔案路徑" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "完整路徑" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "從命令行取得輸出" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "開啟" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "使用終端機執行" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "在虛擬檔案系統開啟" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "檢視" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "在檢視器開啟" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "關閉 (&C)" #: tfrmfileexecuteyourself.caption msgctxt "TFRMFILEEXECUTEYOURSELF.CAPTION" msgid "Wait..." msgstr "等待..." #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "檔案名稱:" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "從:" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "關閉時暫存檔會被刪除!" #: tfrmfileop.btncancel.caption #| msgid "Cancel" msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "移到面板 (&T)" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "檢視全部 (&V)" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "現正操作:" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "從:" #: tfrmfileop.lblto.caption msgid "To:" msgstr "到:" #: tfrmfileproperties.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "關閉 (&C)" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "設定內容 (&S)" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "設置到所有已選取的檔案 (&A)" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "略過這個檔案 (&P)" #: tfrmfileproperties.caption msgctxt "TFRMFILEPROPERTIES.CAPTION" msgid "Properties" msgstr "內容" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Sticky" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "擁有者" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "群組" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "其他" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "擁有者" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmfileproperties.lblattrtextstr.caption #| msgid "Representation in text:" msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "文字:" #: tfrmfileproperties.lblcontains.caption msgctxt "tfrmfileproperties.lblcontains.caption" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "包含:" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "執行" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "檔案名稱" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "名稱:" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "檔案名稱" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "路徑:" #: tfrmfileproperties.lblgroupstr.caption #, fuzzy #| msgid "Group" msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "群組 (&G)" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "上次存取:" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "上次修改:" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "上次修改狀態:" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "8進制:" #: tfrmfileproperties.lblownerstr.caption #, fuzzy #| msgid "Owner" msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "擁有者 (&W)" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "讀取" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "大小:" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption #| msgid "Symlink:" msgid "Symlink to:" msgstr "符號連結:" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption #, fuzzy msgid "Type:" msgstr "類別:" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "寫入" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "屬性" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "內容" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "新增 (&A)" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "說明 (&H)" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "關閉 (&C)" #: tfrmfinddlg.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmfinddlg.btnedit.caption" msgid "&Edit" msgstr "編輯 (&E)" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "移到檔案 (&G)" #: tfrmfinddlg.btnlastsearch.caption msgctxt "tfrmfinddlg.btnlastsearch.caption" msgid "&Last search" msgstr "最近搜尋 (&L)" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "新的搜尋 (&N)" #: tfrmfinddlg.btnsavetemplate.caption #, fuzzy #| msgid "Save" msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "儲存 (&S)" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "刪除 (&D)" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "載入 (&O)" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "儲存 (&A)" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption msgid "Sa&ve with \"Start in directory\"" msgstr "儲存並保存\"開始位置\" (&V)" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "當載入範本時將會還原為目前設置的\"開始位置\"。如果你要固定搜尋一個特定的資料夾時就使用它" #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "開始 (&S)" #: tfrmfinddlg.btnstop.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "取消 (&A)" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "使用範本" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "檢視 (&V)" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "傳送到清單列表 (&L)" #: tfrmfinddlg.caption msgctxt "TFRMFINDDLG.CAPTION" msgid "Find files" msgstr "尋找檔案" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "大小寫視為相異 (&I)" #: tfrmfinddlg.cbdatefrom.caption #, fuzzy #| msgid "Date From:" msgid "&Date from:" msgstr "開始日期 (&D):" #: tfrmfinddlg.cbdateto.caption #, fuzzy #| msgid "Date To:" msgid "Dat&e to:" msgstr "結束日期 (&E):" #: tfrmfinddlg.cbfilesizefrom.caption #, fuzzy #| msgid "Size from:" msgid "S&ize from:" msgstr "最小容量 (&I):" #: tfrmfinddlg.cbfilesizeto.caption #, fuzzy #| msgid "Size to:" msgid "Si&ze to:" msgstr "最大容量 (&Z):" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "在檔案中尋找文字 (&T)" #: tfrmfinddlg.cbfollowsymlinks.caption #, fuzzy #| msgid "Follow symlinks" msgctxt "tfrmfinddlg.cbfollowsymlinks.caption" msgid "Follow s&ymlinks" msgstr "允許符號連結 (&Y)" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "尋找不包含這些文字的檔案 (&O)" #: tfrmfinddlg.cbnotolderthan.caption #, fuzzy #| msgid "Not older than:" msgid "N&ot older than:" msgstr "不早於 (&O):" #: tfrmfinddlg.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name " msgid "Searc&h for part of file name" msgstr "搜尋部分檔名 (&H)" #: tfrmfinddlg.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "規則運算式 (&R)" #: tfrmfinddlg.cbreplacetext.caption #| msgid "Re&place text" msgid "Re&place by" msgstr "取代文字 (&P)" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "選取的資料夾及檔案 (&F)" #: tfrmfinddlg.cbtimefrom.caption #, fuzzy #| msgid "Time from:" msgid "&Time from:" msgstr "開始時間 (&T):" #: tfrmfinddlg.cbtimeto.caption #, fuzzy #| msgid "Time to:" msgid "Ti&me to:" msgstr "結束時間 (&M):" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "使用搜尋插件 (&U):" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "輸入想要排除搜尋的資料夾名稱 (分隔符號\";\")" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "輸入想要排除搜尋的檔案名稱 (分隔符號\";\")" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "輸入檔案名稱 (分隔符號\";\")" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption msgctxt "tfrmfinddlg.gbdirectories.caption" msgid "Directories" msgstr "資料夾" #: tfrmfinddlg.gbfiles.caption msgctxt "tfrmfinddlg.gbfiles.caption" msgid "Files" msgstr "檔案" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "尋找數據" #: tfrmfinddlg.lblattributes.caption msgid "Attri&butes" msgstr "屬性 (&B)" #: tfrmfinddlg.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "編碼 (&G):" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "排除子目錄 (&X)" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "排除檔案 (&E)" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "檔案遮罩 (&F)" #: tfrmfinddlg.lblfindpathstart.caption #, fuzzy #| msgid "&Start in directory" msgid "Start in &directory" msgstr "開始位置 (&D)" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "搜尋子目錄 (&B):" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "歷史搜尋 (&P):" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "從清單移除" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "顯示找到的全部項目" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "在檢視器顯示" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "進階" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "載入/儲存" #: tfrmfinddlg.tsplugins.caption msgctxt "tfrmfinddlg.tsplugins.caption" msgid "Plugins" msgstr "插件" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "結果" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "標準" #: tfrmfindview.btnclose.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmfindview.btnfind.caption #, fuzzy #| msgid "Find" msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "尋找 (&F)" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "尋找" #: tfrmfindview.cbcasesens.caption #, fuzzy #| msgid "Case sensitive" msgid "C&ase sensitive" msgstr "大小寫視為相異 (&A)" #: tfrmhardlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfrmhardlink.caption #| msgid "Create hardlink" msgid "Create hard link" msgstr "建立硬式連結" #: tfrmhardlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "連結目標 (&D)" #: tfrmhardlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "連結名稱 (&L)" #: tfrmhotdir.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "新增 (&A)" #: tfrmhotdir.btnaddman.caption #, fuzzy #| msgid "Add manually" msgid "Add &manually" msgstr "手動新增 (&M)" #: tfrmhotdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmhotdir.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "刪除 (&D)" #: tfrmhotdir.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "編輯 (&E)" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "常用資料夾列表" #: tfrmlinker.btnexit.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmlinker.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "..." #: tfrmlinker.caption msgctxt "TFRMLINKER.CAPTION" msgid "Linker" msgstr "合併器" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "另存新檔..." #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "項目" #: tfrmlinker.lblfilename.caption #, fuzzy #| msgid "File name" msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "檔案名稱 (&F)" #: tfrmlinker.spbtndel.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "刪除 (&D)" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "刪除" #: tfrmlinker.spbtndown.caption #, fuzzy #| msgid "Down" msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "下移 (&W)" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "下移" #: tfrmlinker.spbtnup.caption #, fuzzy #| msgid "Up" msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "上移 (&U)" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "上移" #: tfrmmain.actabout.caption #| msgid "About" msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "關於 (&A)" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "加入檔案名稱到指令行" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "加入路徑和檔案名稱到指令行" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "複製路徑到指令行" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "簡要" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "簡要檢視" #: tfrmmain.actcalculatespace.caption #| msgid "Calculate &Occupied Space..." msgid "Calculate &Occupied Space" msgstr "計算佔用空間 (&O)" #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "變更資料夾" #: tfrmmain.actchangedirtoparent.caption #, fuzzy msgid "Change Directory To Parent" msgstr "回到上一層資料夾" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "變更到根資料夾" #: tfrmmain.actchecksumcalc.caption #| msgid "Calculate check sum..." msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "計算驗證碼... (&S)" #: tfrmmain.actchecksumverify.caption #| msgid "Verify check sum..." msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "校驗驗證碼... (&V)" #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "清除記錄檔案" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "清除記錄視窗" #: tfrmmain.actclosealltabs.caption msgid "Close &All Tabs" msgstr "關閉所有分頁 (&A)" #: tfrmmain.actclosetab.caption msgid "&Close Tab" msgstr "關閉分頁 (&C)" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "下一個指令" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "將歷史記錄中的下一個指令設置到指令行" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "上一個指令" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "將歷史記錄中的上一個指令設置到指令行" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "完整" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "欄位檢視" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "比較檔案內容 (&C)" #: tfrmmain.actcomparedirectories.caption msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.CAPTION" msgid "Compare Directories" msgstr "比較資料夾" #: tfrmmain.actcomparedirectories.hint msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.HINT" msgid "Compare Directories" msgstr "比較資料夾" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "顯示內文選單" #: tfrmmain.actcopy.caption #, fuzzy #| msgid "Copy" msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "複製" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "複製包含完整路徑的檔案名稱" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "複製檔案名稱到剪貼簿 (&F)" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "無需確認複製檔案" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "複製到同面板下" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "複製 (&C)" #: tfrmmain.actcountdircontent.caption #| msgid "Sho&w occupied space" msgid "Sho&w Occupied Space" msgstr "顯示佔用空間 (&W)" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "剪下 (&T)" #: tfrmmain.actdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMMAIN.ACTDELETE.CAPTION" msgid "Delete" msgstr "刪除" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "資料夾歷史記錄" #: tfrmmain.actdirhotlist.caption #| msgid "Directory &hotlist" msgid "Directory &Hotlist" msgstr "常用資料夾列表 (&H)" #: tfrmmain.actedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "編輯" #: tfrmmain.acteditcomment.caption #| msgid "Edit comment..." msgid "Edit Co&mment..." msgstr "編輯註解... (&M)" #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "編輯新檔案" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "變更路徑" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "交換面板 (&P)" #: tfrmmain.actexit.caption #| msgid "Exit" msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "離開 (&X)" #: tfrmmain.actextractfiles.caption #| msgid "Extract files..." msgid "&Extract Files..." msgstr "解壓縮檔案... (&E)" #: tfrmmain.actfileassoc.caption #| msgid "File &associations..." msgid "File &Associations..." msgstr "檔案關聯... (&A)" #: tfrmmain.actfilelinker.caption #| msgid "Link files" msgid "Com&bine Files..." msgstr "合併檔案... (&B)" #: tfrmmain.actfileproperties.caption #| msgid "Show file properties" msgid "Show &File Properties" msgstr "顯示檔案內容 (&F)" #: tfrmmain.actfilespliter.caption #| msgid "Split file" msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "分割檔案... (&I)" #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "切換到指令行" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "移到清單中第一個檔案" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "移到清單中最後一個檔案" #: tfrmmain.acthardlink.caption #| msgid "Create hard link..." msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "建立硬式連結... (&H)" #: tfrmmain.acthelpindex.caption #| msgid "Contents" msgid "&Contents" msgstr "內容 (&C)" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "水平面板模式 (&H)" #: tfrmmain.actkeyboard.caption #| msgid "Keyboard" msgid "&Keyboard" msgstr "鍵盤配置 (&K)" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "左面板 &= 右面板" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "開啟左面板磁碟清單" #: tfrmmain.actloadselectionfromclip.caption msgid "Load Selection from Clip&board" msgstr "從剪貼簿載入所選項目 (&B)" #: tfrmmain.actloadselectionfromfile.caption msgid "&Load Selection from File..." msgstr "從檔案載入所選項目 (&L)..." #: tfrmmain.actmakedir.caption #, fuzzy #| msgid "MakeDir" msgid "MakeDir" msgstr "建立資料夾" #: tfrmmain.actmarkcurrentextension.caption #, fuzzy #| msgid "Select all with same extension" msgid "Select All with the Same E&xtension" msgstr "選擇所有相同副檔名 (&X)" #: tfrmmain.actmarkinvert.caption #| msgid "Invert Selections" msgid "&Invert Selection" msgstr "反向選擇 (&I)" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "全選 (&S)" #: tfrmmain.actmarkminus.caption #| msgid "Unselect a group" msgid "Unselect a Gro&up..." msgstr "取消所選群組... (&U)" #: tfrmmain.actmarkplus.caption #| msgid "Select a group" msgid "Select a &Group..." msgstr "選擇群組 (&G)" #: tfrmmain.actmarkunmarkall.caption #| msgid "Unselect All" msgid "&Unselect All" msgstr "取消全選 (&U)" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "最小化視窗" #: tfrmmain.actmultirename.caption #| msgid "Multi Rename Tool" msgid "Multi &Rename Tool" msgstr "多重命名工具 (&R)" #: tfrmmain.actnetworkconnect.caption msgid "Network &Connect..." msgstr "連接網路... (&C)" #: tfrmmain.actnetworkdisconnect.caption msgid "Network &Disconnect" msgstr "中斷連接網路 (&D)" #: tfrmmain.actnetworkquickconnect.caption msgid "Network &Quick Connect..." msgstr "快速連接網路 (&Q)" #: tfrmmain.actnewtab.caption #| msgid "&New tab" msgid "&New Tab" msgstr "新增分頁 (&N)" #: tfrmmain.actnexttab.caption #| msgid "Switch to nex&t tab" msgid "Switch to Nex&t Tab" msgstr "切換到下一個分頁 (&T)" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "開啟" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "嘗試開啟壓縮檔" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "開啟 bar 檔案" #: tfrmmain.actopendirinnewtab.caption #| msgid "Open &folder in new tab" msgid "Open &Folder in a New Tab" msgstr "在新分頁開啟資料夾 (&F)" #: tfrmmain.actopenvirtualfilesystemlist.caption msgid "Open &VFS List" msgstr "開啟虛擬檔案系統清單 (&V)" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "操作檢視器 (&V)" #: tfrmmain.actoptions.caption #| msgid "Options..." msgid "&Options..." msgstr "選項... (&O)" #: tfrmmain.actpackfiles.caption #| msgid "Pack files..." msgid "&Pack Files..." msgstr "壓縮檔案... (&P)" #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "設置分隔位置" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "貼上 (&P)" #: tfrmmain.actprevtab.caption #| msgid "Switch to &previous tab" msgid "Switch to &Previous Tab" msgstr "切換到上一個分頁 (&P)" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "快速篩選" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "快速搜尋" #: tfrmmain.actquickview.caption msgid "&Quick View Panel" msgstr "快速檢視面板 (&Q)" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "重新整理 (&R)" #: tfrmmain.actrename.caption #, fuzzy #| msgid "Move" msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "移動" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "移動/重新命名時無需確認" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "重新命名" #: tfrmmain.actrenametab.caption #, fuzzy #| msgid "Re&name Tab" msgid "&Rename Tab" msgstr "重新命名分頁 (&R)" #: tfrmmain.actrestoreselection.caption msgid "&Restore Selection" msgstr "回復所選項目 (&R)" #: tfrmmain.actreverseorder.caption #| msgid "Reverse order" msgid "Re&verse Order" msgstr "反向排序 (&V)" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "右面板 &= 左面板" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "開啟右面板磁碟清單" #: tfrmmain.actrunterm.caption #| msgid "Run Term" msgid "Run &Terminal" msgstr "開啟終端機 (&T)" #: tfrmmain.actsaveselection.caption msgid "Sa&ve Selection" msgstr "儲存所選項目 (&V)" #: tfrmmain.actsaveselectiontofile.caption msgid "Save S&election to File..." msgstr "儲存所選項目到檔案... (&E)" #: tfrmmain.actsearch.caption #| msgid "&Search" msgid "&Search..." msgstr "搜尋... (&S)" #: tfrmmain.actsetfileproperties.caption msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "變更檔案屬性... (&A)" #: tfrmmain.actsettaboptiondirsinnewtab.caption msgid "Locked with Directories Opened in New &Tabs" msgstr "鎖定並可在新分頁開啟資料夾 (&T)" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "普通 (&N)" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "鎖定 (&L)" #: tfrmmain.actsettaboptionpathresets.caption msgid "Locked with &Directory Changes Allowed" msgstr "鎖定並允許在目前分頁變更資料夾 (&D)" #: tfrmmain.actshellexecute.caption msgctxt "tfrmmain.actshellexecute.caption" msgid "Open" msgstr "開啟" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "使用系統預設的檔案關聯開啟" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "顯示底部選單" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "顯示指令行歷史記錄" #: tfrmmain.actshowmainmenu.caption #, fuzzy #| msgid "Menu" msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "選單" #: tfrmmain.actshowsysfiles.caption #| msgid "Show hidden/system files" msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "顯示/隱藏系統檔案 (&H)" #: tfrmmain.actsortbyattr.caption #| msgid "Sort by attrib" msgid "Sort by &Attributes" msgstr "依屬性排序 (&A)" #: tfrmmain.actsortbydate.caption #| msgid "Sort by date" msgid "Sort by &Date" msgstr "依日期排序 (&D)" #: tfrmmain.actsortbyext.caption #| msgid "Sort by extension" msgid "Sort by &Extension" msgstr "依副檔名排序 (&E)" #: tfrmmain.actsortbyname.caption #| msgid "Sort by name" msgid "Sort by &Name" msgstr "依檔名排序 (&N)" #: tfrmmain.actsortbysize.caption #| msgid "Sort by size" msgid "Sort by &Size" msgstr "依大小排序 (&S)" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "啟用/停用不顯示在忽略清單下所設定的檔案或資料夾" #: tfrmmain.actsymlink.caption #| msgid "Create symbolic link..." msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "建立符號連結... (&L)" #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "目標面板 &= 來源面板" #: tfrmmain.acttestarchive.caption msgid "&Test Archive(s)" msgstr "測試壓縮檔 (&T)" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "縮圖" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "縮圖檢視" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "傳送指標行上的資料夾到左視窗" #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "傳送指標行上的資料夾到右視窗" #: tfrmmain.actunmarkcurrentextension.caption #, fuzzy #| msgid "Unselect all with same extension" msgid "Unselect All with the Same Ex&tension" msgstr "取消選擇所有相同副檔名 (&T)" #: tfrmmain.actview.caption #, fuzzy #| msgid "View" msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "檢視" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "顯示路徑歷史記錄" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "移到下一個歷史記錄" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "移到上一個歷史記錄" #: tfrmmain.actvisithomepage.caption #| msgid "&Visit Double Commander Web Site" msgid "&Visit Double Commander Website" msgstr "參觀 Double Commander 網站 (&V)" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "抹除檔案" #: tfrmmain.btnf10.caption #, fuzzy #| msgid "Exit" msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "離開" #: tfrmmain.btnf8.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMMAIN.BTNF8.CAPTION" msgid "Delete" msgstr "刪除" #: tfrmmain.btnf9.caption #, fuzzy #| msgid "Terminal" msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "終端機" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint msgid "Directory hotlist" msgstr "常用資料夾清單" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "<" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "在左面板顯示右面板目前的資料夾" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnlefthome.hint msgid "Go to home directory" msgstr "移到個人資料夾" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgid "Go to root directory" msgstr "移到根資料夾" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgid "Go to parent directory" msgstr "回到上一層資料夾" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr ">" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "在右面板顯示左面板目前的資料夾" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "tfrmmain.caption" msgid "Double Commander" msgstr "Double Commander" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "路徑" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "&20/80" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "&30/70" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "&40/60" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "&50/50" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "&60/40" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "&70/30" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "&80/20" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "取消" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "複製..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "建立連結..." #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline33.caption msgctxt "tfrmmain.miline33.caption" msgid "-" msgstr "-" #: tfrmmain.miline37.caption msgctxt "TFRMMAIN.MILINE37.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "-" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "清除" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "複製" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "隱藏" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "全選" #: tfrmmain.mimove.caption msgid "Move..." msgstr "移動..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "建立符號連結..." #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "分頁選項" #: tfrmmain.mitrayiconexit.caption #| msgid "Exit" msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "離開 (&X)" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "還原" #: tfrmmain.mnualloperpause.caption msgctxt "tfrmmain.mnualloperpause.caption" msgid "||" msgstr "||" #: tfrmmain.mnualloperstart.caption msgctxt "tfrmmain.mnualloperstart.caption" msgid "Start" msgstr "開始" #: tfrmmain.mnualloperstop.caption msgctxt "tfrmmain.mnualloperstop.caption" msgid "Cancel" msgstr "取消" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "指令 (&C)" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "設置 (&O)" #: tfrmmain.mnufiles.caption #| msgid "Files" msgid "&Files" msgstr "檔案 (&F)" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "說明 (&H)" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "標記 (&M)" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "網路" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "顯示 (&S)" #: tfrmmain.mnutaboptions.caption msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "選項 (&O)" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "分頁 (&T)" #: tfrmmain.tbchangedir.caption #, fuzzy msgid "CD" msgstr "CD" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "複製" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "剪下" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "刪除" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "編輯" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "貼上" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmmaskinputdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmmaskinputdlg.btndefinetemplate.caption #, fuzzy #| msgid "Define..." msgid "&Define..." msgstr "定義... (&D)" #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfrmmaskinputdlg.lblsearchtemplate.caption #, fuzzy #| msgid "Or select predefined selection type:" msgid "O&r select predefined selection type:" msgstr "選擇預先定義好的類型 (&R) :" #: tfrmmkdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfrmmkdir.caption msgid "Create new directory" msgstr "建立新資料夾" #: tfrmmkdir.lblmakedir.caption #, fuzzy #| msgid "Input new directory name:" msgid "&Input new directory name:" msgstr "輸入新資料夾名稱 (&I):" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "比" #: tfrmmodview.caption msgctxt "TFRMMODVIEW.CAPTION" msgid "New Size" msgstr "新的大小" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "高 :" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgctxt "tfrmmodview.lblpath2.caption" msgid "2" msgstr "2" #: tfrmmodview.lblpath3.caption msgctxt "tfrmmodview.lblpath3.caption" msgid "3" msgstr "3" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "4" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "5" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "JPG 壓縮品質" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "寬 :" #: tfrmmodview.rbbmp.caption #, fuzzy msgid "BMP" msgstr "BMP" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "ICO" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "JPG" #: tfrmmodview.rbpng.caption #, fuzzy msgid "PNG" msgstr "PNG" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "PNM" #: tfrmmodview.teheight.text #, fuzzy msgid "Height" msgstr "高度" #: tfrmmodview.tequality.text #, fuzzy msgid "80" msgstr "&20/80" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "寬度" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "關閉 (&C)" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "刪除 (&D)" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "載入 (&L)" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "重新命名 (&R)" #: tfrmmultirename.btnrestore.caption #, fuzzy #| msgid "Reset all" msgid "Reset &all" msgstr "全部重置 (&A)" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "儲存 (&S)" #: tfrmmultirename.caption msgctxt "tfrmmultirename.caption" msgid "MultiRename" msgstr "多重命名工具" #: tfrmmultirename.cblog.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "啟用 (&B)" #: tfrmmultirename.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "使用規則運算式 (&X)" #: tfrmmultirename.cbusesubs.caption #| msgid "Use substitution" msgid "&Use substitution" msgstr "使用替代 (&U)" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption #| msgid "[E]xtension" msgid "[E] Extension" msgstr "[E] 副檔名" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "計數器" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "尋找 && 取代" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "記錄結果" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "名稱遮罩" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "預先配置" #: tfrmmultirename.lbext.caption #| msgid "Extension" msgid "&Extension" msgstr "副檔名 (&E)" #: tfrmmultirename.lbfind.caption #| msgid "Find..." msgid "&Find..." msgstr "尋找 (&F)" #: tfrmmultirename.lbinterval.caption #, fuzzy #| msgid "Interval" msgid "&Interval" msgstr "間隔 (&I)" #: tfrmmultirename.lbname.caption #| msgid "File Name" msgid "File &Name" msgstr "檔案名稱 (&N)" #: tfrmmultirename.lbreplace.caption #| msgid "Replace..." msgid "Re&place..." msgstr "取代 (&P)" #: tfrmmultirename.lbstnb.caption #, fuzzy #| msgid "Start Number" msgid "S&tart Number" msgstr "初始編號 (&T)" #: tfrmmultirename.lbwidth.caption #, fuzzy #| msgid "Width" msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "寬度 (&W)" #: tfrmmultirename.micounter.caption #| msgid "[C]ounter" msgid "[C] Counter" msgstr "[C] 計數器" #: tfrmmultirename.miday.caption #| msgid "[D]ay" msgid "[D] Day" msgstr "[D] 日" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "[DD] 日 (2位數)" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "[DDD] 每週日數 (縮寫, 例: \"mon\")" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "[DDDD] 每週日數 (整字, 例: \"monday\")" #: tfrmmultirename.miextensionx.caption #| msgid "[Ex]xtension" msgid "[Ex] Character at position x" msgstr "[Ex] 位置 x 的字元" #: tfrmmultirename.miextensionxx.caption #| msgid "[Ex:x]xtension" msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:y] 從 x 到 y 位置的字元" #: tfrmmultirename.mihour.caption #| msgid "[h]our" msgid "[h] Hour" msgstr "[h] 小時" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "[hh] 小時 (2位數)" #: tfrmmultirename.miminute.caption #| msgid "Mi[n]ute" msgid "[n] Minute" msgstr "[n] 分" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "[nn] 分 (2位數)" #: tfrmmultirename.mimonth.caption #| msgid "[M]onth" msgid "[M] Month" msgstr "[M] 月" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "[MM] 月 (2位數)" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "[MMM] 月份名稱 (縮寫, 例: \"jan\")" #: tfrmmultirename.mimonth3.caption msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "[MMMM] 月份名稱 (整字, 例: \"january\")" #: tfrmmultirename.miname.caption #| msgid "[N]ame" msgid "[N] Name" msgstr "[N] 名稱" #: tfrmmultirename.minamex.caption #| msgid "[Nx]ame" msgid "[Nx] Character at position x" msgstr "[Nx] x 位置的字元" #: tfrmmultirename.minamexx.caption #| msgid "[Nx:x]ame" msgid "[Nx:y] Characters from position x to y" msgstr "[Nx:y] 從 x 到 y 位置的字元" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "時間..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "副檔名..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "名稱..." #: tfrmmultirename.miplugin.caption #, fuzzy msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "插件" #: tfrmmultirename.misecond.caption #| msgid "[s]econd" msgid "[s] Second" msgstr "[s] 秒" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "[ss] 秒 (2位數)" #: tfrmmultirename.miyear.caption #| msgid "[Y] Year" msgid "[Y] Year (2 digits)" msgstr "[Y] 年 (2位數)" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "[YYYY] 年 (4位數)" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "tfrmmultirename.stringgrid.columns[0].title.caption" msgid "Old File Name" msgstr "舊檔名" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "tfrmmultirename.stringgrid.columns[1].title.caption" msgid "New File Name" msgstr "新檔名" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "tfrmmultirename.stringgrid.columns[2].title.caption" msgid "File Path" msgstr "檔案路徑" #: tfrmopenwith.caption msgid "Choose an application" msgstr "請選擇一個應用程式" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "自訂指令" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "儲存檔案關聯" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "設置所選擇的應用程式為預設動作" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "檔案類型已開啟: %s" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "多重檔案名稱" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "%F" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "多重網址" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "%U" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "單一檔案名稱" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "%f" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "單一網址" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "%u" #: tfrmoptions.btnapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "套用 (&A)" #: tfrmoptions.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfrmoptions.caption msgctxt "tfrmoptions.caption" msgid "Options" msgstr "選項" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "請選擇一個子頁面,這個頁面不包含任何設定。" #: tfrmoptionsarchivers.btnautoconfig.caption #, fuzzy #| msgid "Auto Configure" msgctxt "TFRMOPTIONSARCHIVERS.BTNAUTOCONFIG.CAPTION" msgid "A&uto Configure" msgstr "自動設置 (&U)" #: tfrmoptionsarchivers.btnmultiarcadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCADD.CAPTION" msgid "A&dd" msgstr "新增 (&D)" #: tfrmoptionsarchivers.btnmultiarcapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCAPPLY.CAPTION" msgid "A&pply" msgstr "套用 (&P)" #: tfrmoptionsarchivers.btnmultiarcdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCDELETE.CAPTION" msgid "D&elete" msgstr "刪除 (&E)" #: tfrmoptionsarchivers.btnmultiarcrename.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCRENAME.CAPTION" msgid "&Rename" msgstr "重新命名 (&R)" #: tfrmoptionsarchivers.chkmultiarcdebug.caption #, fuzzy #| msgid "Debug mode" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCDEBUG.CAPTION" msgid "De&bug mode" msgstr "除錯模式 (&B)" #: tfrmoptionsarchivers.chkmultiarcenabled.caption #, fuzzy #| msgid "Enabled" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCENABLED.CAPTION" msgid "E&nabled" msgstr "啟用 (&N)" #: tfrmoptionsarchivers.chkmultiarcoutput.caption #, fuzzy #| msgid "Show console output" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCOUTPUT.CAPTION" msgid "S&how console output" msgstr "顯示終端機輸出結果 (&H)" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "TFRMOPTIONSARCHIVERS.GBARCHIVEROPTIONS.CAPTION" msgid "Options" msgstr "選項" #: tfrmoptionsarchivers.lblarchiveadd.caption #, fuzzy #| msgid "Add:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEADD.CAPTION" msgid "Add&ing:" msgstr "加入壓縮檔 (&I):" #: tfrmoptionsarchivers.lblarchiveextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTENSION.CAPTION" msgid "E&xtension:" msgstr "副檔名 (&X):" #: tfrmoptionsarchivers.lblarchiveextract.caption #, fuzzy #| msgid "Extract:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTRACT.CAPTION" msgid "Ex&tract:" msgstr "解壓縮 (&T):" #: tfrmoptionsarchivers.lblarchivelist.caption #, fuzzy #| msgid "List:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELIST.CAPTION" msgid "&List:" msgstr "清單 (&L):" #: tfrmoptionsarchivers.lblarchivelistend.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTEND.CAPTION" msgid "Listing &finish (optional):" msgstr "清單完成 (可選) (&F):" #: tfrmoptionsarchivers.lblarchivelistformat.caption #, fuzzy #| msgid "Listing format:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTFORMAT.CAPTION" msgid "Listing for&mat:" msgstr "清單格式 (&M):" #: tfrmoptionsarchivers.lblarchiveliststart.caption #, fuzzy #| msgid "Listing start (optional):" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTSTART.CAPTION" msgid "Listin&g start (optional):" msgstr "清單開始 (可選) (&G):" #: tfrmoptionsarchivers.lblarchiver.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVER.CAPTION" msgid "Arc&hiver:" msgstr "壓縮器 (&H):" #: tfrmoptionsarchivers.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMOPTIONSARCHIVERS.LBLDESCRIPTION.CAPTION" msgid "De&scription:" msgstr "描述 (&S):" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERADDITIONAL.CAPTION" msgid "Additional" msgstr "額外" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERGENERAL.CAPTION" msgid "General" msgstr "一般" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption #| msgid "Also when &size, date, or attributes change" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHATTRIBUTESCHANGE.CAPTION" msgid "When &size, date or attributes change" msgstr "當大小,日期或屬性改變時更新 (&S)" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHEXCLUDEDIRS.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "在下列路徑及子資料夾時停用更新 (&P):" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption #, fuzzy #| msgid "When files are &created, deleted or renamed" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHFILENAMECHANGE.CAPTION" msgid "When &files are created, deleted or renamed" msgstr "當檔案建立,刪除或重新命名時更新 (&F)" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption #| msgid "Don't &react to updates while in the background" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHONLYFOREGROUND.CAPTION" msgid "When application is in the &background" msgstr "當應用程式在背景模式下執行時停用更新 (&B)" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHDISABLE.CAPTION" msgid "Disable auto-refresh" msgstr "停用自動更新" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHENABLE.CAPTION" msgid "Refresh file list" msgstr "更新檔案清單" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption #, fuzzy #| msgid "Always show tray icon" msgctxt "TFRMOPTIONSBEHAVIOR.CBALWAYSSHOWTRAYICON.CAPTION" msgid "Al&ways show tray icon" msgstr "總是顯示通知區域圖示 (&W)" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption msgid "Automatically &hide unmounted devices" msgstr "自動隱蔵未掛載的裝置 (&H)" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBMINIMIZETOTRAY.CAPTION" msgid "Mo&ve icon to system tray when minimized" msgstr "當最小化時顯示通知區域圖示 (&V)" #: tfrmoptionsbehavior.cbonlyonce.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBONLYONCE.CAPTION" msgid "A&llow only one copy of DC at a time" msgstr "僅允許同時間執行一個 DC 程式 (&L)" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "你可以在這裡輸入一個或多個磁碟及掛載位置 (分隔符號\";\")" #: tfrmoptionsbehavior.lbldrivesblacklist.caption #, fuzzy #| msgid "Drives blacklist" msgid "Drives &blacklist" msgstr "磁碟黑名單 (&B) " #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption #, fuzzy #| msgid "Cut text to column width" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBCUTTEXTTOCOLWIDTH.CAPTION" msgid "Cut &text to column width" msgstr "依欄寬裁剪文字 (&T)" #: tfrmoptionscolumnsview.cbgridhorzline.caption #, fuzzy #| msgid "Horizontal lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDHORZLINE.CAPTION" msgid "&Horizontal lines" msgstr "水平列 (&H)" #: tfrmoptionscolumnsview.cbgridvertline.caption #, fuzzy #| msgid "Vertical lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDVERTLINE.CAPTION" msgid "&Vertical lines" msgstr "垂直列 (&V)" #: tfrmoptionscolumnsview.chkautofillcolumns.caption #, fuzzy #| msgid "Auto fill columns" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CHKAUTOFILLCOLUMNS.CAPTION" msgid "A&uto fill columns" msgstr "自動填滿欄位 (&U)" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "顯示格線" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "自動大小欄位" #: tfrmoptionscolumnsview.lblautosizecolumn.caption #, fuzzy #| msgid "Auto size column:" msgctxt "TFRMOPTIONSCOLUMNSVIEW.LBLAUTOSIZECOLUMN.CAPTION" msgid "Auto si&ze column:" msgstr "自動大小欄位 (&Z):" #: tfrmoptionsconfiguration.btnconfigapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGAPPLY.CAPTION" msgid "A&pply" msgstr "套用 (&P)" #: tfrmoptionsconfiguration.btnconfigedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGEDIT.CAPTION" msgid "&Edit" msgstr "編輯 (&E)" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption #, fuzzy #| msgid "Command line history" msgctxt "TFRMOPTIONSCONFIGURATION.CBCMDLINEHISTORY.CAPTION" msgid "Co&mmand line history" msgstr "指令行歷史記錄 (&M)" #: tfrmoptionsconfiguration.cbdirhistory.caption #, fuzzy #| msgid "Directory history" msgctxt "TFRMOPTIONSCONFIGURATION.CBDIRHISTORY.CAPTION" msgid "&Directory history" msgstr "資料夾歷史記錄 (&D)" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption #, fuzzy #| msgid "File mask history" msgctxt "TFRMOPTIONSCONFIGURATION.CBFILEMASKHISTORY.CAPTION" msgid "&File mask history" msgstr "檔案遮罩歷史記錄 (&F)" #: tfrmoptionsconfiguration.chksaveconfiguration.caption #, fuzzy #| msgid "Save configuration" msgctxt "TFRMOPTIONSCONFIGURATION.CHKSAVECONFIGURATION.CAPTION" msgid "Sa&ve configuration" msgstr "儲存設置 (&V)" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption #, fuzzy #| msgid "Search/Replace history" msgctxt "TFRMOPTIONSCONFIGURATION.CHKSEARCHREPLACEHISTORY.CAPTION" msgid "Searc&h/Replace history" msgstr "搜尋/取代歷史記錄 (&H)" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBLOCCONFIGFILES.CAPTION" msgid "Location of configuration files" msgstr "設定檔案儲存位置" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBSAVEONEXIT.CAPTION" msgid "Save on exit" msgstr "在離開程式時儲存" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgctxt "TFRMOPTIONSCONFIGURATION.LBLCMDLINECONFIGDIR.CAPTION" msgid "Set on command line" msgstr "在指令行設置" #: tfrmoptionsconfiguration.rbprogramdir.caption #, fuzzy #| msgid "Program directory (portable version)" msgctxt "TFRMOPTIONSCONFIGURATION.RBPROGRAMDIR.CAPTION" msgid "P&rogram directory (portable version)" msgstr "程式資料夾 (可攜版) (&R)" #: tfrmoptionsconfiguration.rbuserhomedir.caption #, fuzzy #| msgid "User home directory" msgctxt "TFRMOPTIONSCONFIGURATION.RBUSERHOMEDIR.CAPTION" msgid "&User home directory" msgstr "個人資料夾 (&U)" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption #, fuzzy #| msgid "Copy" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNCOPYCOLUMNSSET.CAPTION" msgid "C&opy" msgstr "複製 (&O)" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNDELCOLUMNSSET.CAPTION" msgid "&Delete" msgstr "刪除 (&D)" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNEDITCOLUMNSSET.CAPTION" msgid "&Edit" msgstr "編輯 (&E)" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNNEWCOLUMNSSET.CAPTION" msgid "&New" msgstr "新增 (&N)" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.CBBFILESYSTEM.TEXT" msgid "General" msgstr "一般" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption #, fuzzy #| msgid "Configure columns for file system:" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.LBLCONFIGCOLUMNS.CAPTION" msgid "Con&figure columns for file system:" msgstr "設置檔案系統欄位 (&F):" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption #, fuzzy #| msgid "Show confirmation dialog after drop" msgid "&Show confirmation dialog after drop" msgstr "顯示確認對話盒在拖曳操作後 (&S)" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption #, fuzzy #| msgid "Show file system" msgid "Show &file system" msgstr "顯示檔案系統 (&F)" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption #, fuzzy #| msgid "Show free space" msgid "Show fr&ee space" msgstr "顯示可用空間 (&E)" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption #, fuzzy #| msgid "Show label" msgid "Show &label" msgstr "顯示標籤 (&L)" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "磁碟清單" #: tfrmoptionseditorcolors.backgroundlabel.caption #, fuzzy #| msgid "Background" msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "背景色彩 (&K)" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption #, fuzzy #| msgid "Background" msgctxt "tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption" msgid "Bac&kground" msgstr "背景色彩 (&K)" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "元件屬性" #: tfrmoptionseditorcolors.foregroundlabel.caption msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "前景色彩 (&R)" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption" msgid "Fo®round" msgstr "前景色彩 (&R)" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption msgid "&Text-mark" msgstr "文字遮罩 (&T)" #: tfrmoptionseditorcolors.tbtnglobal.caption msgid "Use (and edit) &global scheme settings" msgstr "使用通用格式設定值 (&G)" #: tfrmoptionseditorcolors.tbtnlocal.caption msgid "Use &local scheme settings" msgstr "使用本處格式設定值 (&L)" #: tfrmoptionseditorcolors.textboldcheckbox.caption #, fuzzy #| msgid "Bold" msgid "&Bold" msgstr "粗體 (&B)" #: tfrmoptionseditorcolors.textboldradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textboldradioinvert.caption" msgid "In&vert" msgstr "反向 (&V)" #: tfrmoptionseditorcolors.textboldradiooff.caption #, fuzzy #| msgid "Off" msgctxt "tfrmoptionseditorcolors.textboldradiooff.caption" msgid "O&ff" msgstr "關 (&F)" #: tfrmoptionseditorcolors.textboldradioon.caption #, fuzzy #| msgid "On" msgctxt "tfrmoptionseditorcolors.textboldradioon.caption" msgid "O&n" msgstr "開 (&N)" #: tfrmoptionseditorcolors.textitaliccheckbox.caption #, fuzzy #| msgid "Italic" msgid "&Italic" msgstr "斜體 (&I)" #: tfrmoptionseditorcolors.textitalicradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textitalicradioinvert.caption" msgid "In&vert" msgstr "反向 (&V)" #: tfrmoptionseditorcolors.textitalicradiooff.caption #, fuzzy #| msgid "Off" msgctxt "tfrmoptionseditorcolors.textitalicradiooff.caption" msgid "O&ff" msgstr "關 (&F)" #: tfrmoptionseditorcolors.textitalicradioon.caption #, fuzzy #| msgid "On" msgctxt "tfrmoptionseditorcolors.textitalicradioon.caption" msgid "O&n" msgstr "開 (&N)" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption msgid "&Strike Out" msgstr "刪除線 (&S)" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textstrikeoutradioinvert.caption" msgid "In&vert" msgstr "反向 (&V)" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption #, fuzzy #| msgid "Off" msgctxt "tfrmoptionseditorcolors.textstrikeoutradiooff.caption" msgid "O&ff" msgstr "關 (&F)" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption #, fuzzy #| msgid "On" msgctxt "tfrmoptionseditorcolors.textstrikeoutradioon.caption" msgid "O&n" msgstr "開 (&N)" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption #, fuzzy #| msgid "Underline" msgid "&Underline" msgstr "底線 (&U)" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "反向 (&V)" #: tfrmoptionseditorcolors.textunderlineradiooff.caption #, fuzzy #| msgid "Off" msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "關 (&F)" #: tfrmoptionseditorcolors.textunderlineradioon.caption #, fuzzy #| msgid "On" msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "開 (&N)" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "複製操作 (&Y)" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "刪除操作 (&D)" #: tfrmoptionsfileoperations.cbdeletetotrash.caption #, fuzzy #| msgid "Delete to recycle bin (Shift key reverses this setting)" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDELETETOTRASH.CAPTION" msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "刪除到資源回收筒 (與 Shift 鍵同按為徹底刪除) (&T)" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "刪除到資源回收筒操作 (&E)" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDROPREADONLYFLAG.CAPTION" msgid "D&rop readonly flag" msgstr "丟棄唯讀屬性(&R)" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "移動操作 (&M)" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPARTIALNAMESEARCH.CAPTION" msgid "&Search for part of file name" msgstr "搜尋部分檔名 (&S)" #: tfrmoptionsfileoperations.cbprocesscomments.caption #, fuzzy #| msgid "Process comments with files/folders" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPROCESSCOMMENTS.CAPTION" msgid "&Process comments with files/folders" msgstr "處理檔案/資料夾的註解 (&P)" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption #, fuzzy #| msgid "Select file name without extension when renaming" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBRENAMESELONLYNAME.CAPTION" msgid "Select &file name without extension when renaming" msgstr "重新命名檔案名稱時不包含副檔名 (&F)" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption #, fuzzy #| msgid "Show tab select panel in copy/move dialog" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSHOWCOPYTABSELECTPANEL.CAPTION" msgid "Sho&w tab select panel in copy/move dialog" msgstr "顯示分頁選擇面板在複製/移動對話盒 (&W)" #: tfrmoptionsfileoperations.cbskipfileoperror.caption #, fuzzy #| msgid "Skip file operations errors and write them to log window" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSKIPFILEOPERROR.CAPTION" msgid "S&kip file operations errors and write them to log window" msgstr "略過操作有錯誤的檔案並將錯誤寫到記錄視窗 (&K)" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "執行操作" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.GBFILESEARCH.CAPTION" msgid "File search" msgstr "檔案搜尋" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "使用者介面" #: tfrmoptionsfileoperations.lblbuffersize.caption msgid "&Buffer size for file operations (in KB):" msgstr "檔案操作的緩衝區大小 (單位: KB) (&B):" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "顯示確認視窗在:" #: tfrmoptionsfileoperations.lblprogresskind.caption msgid "Show operations progress &initially in" msgstr "顯示操作處理進度在 (&I):" #: tfrmoptionsfileoperations.lblwipepassnumber.caption #, fuzzy #| msgid "Number of wipe passes:" msgctxt "TFRMOPTIONSFILEOPERATIONS.LBLWIPEPASSNUMBER.CAPTION" msgid "&Number of wipe passes:" msgstr "檔案抹除次數: (&N)" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption #, fuzzy #| msgid "Use memory mapping for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSEMMAPINSEARCH.CAPTION" msgid "Use memory mapping for search te&xt in files" msgstr "使用記憶體映射搜尋檔案中的文字 (&X)" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption #, fuzzy #| msgid "Use stream for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSESTREAMINSEARCH.CAPTION" msgid "&Use stream for search text in files" msgstr "使用檔案串流搜尋檔案中的文字 (&U)" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption #, fuzzy #| msgid "Use Frame Cursor" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEFRAMECURSOR.CAPTION" msgid "Use &Frame Cursor" msgstr "使用框架指標 (&F)" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption msgid "Use &Gradient Indicator" msgstr "使用漸層指示器 (&G)" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption #, fuzzy #| msgid "Use Inverted Selection" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEINVERTEDSELECTION.CAPTION" msgid "U&se Inverted Selection" msgstr "使用反白選取 (&S)" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.DBFREESPACEINDICATOR.CAPTION" msgid "Drive Free Space Indicator" msgstr "磁碟可用空間指示器" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.GBEXAMPLE.CAPTION" msgid "Example" msgstr "範例" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption #, fuzzy #| msgid "Background:" msgid "Bac&kground:" msgstr "背景色彩 (&K):" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption #, fuzzy #| msgid "Background 2:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR2.CAPTION" msgid "Backg&round 2:" msgstr "背景色彩2 (&R):" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption #, fuzzy #| msgid "Cursor Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORCOLOR.CAPTION" msgid "C&ursor Color:" msgstr "指標行背景色彩 (&U):" #: tfrmoptionsfilepanelscolors.lblcursortext.caption #, fuzzy #| msgid "Cursor Text:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORTEXT.CAPTION" msgid "Cursor Te&xt:" msgstr "指標行文字色彩 (&X):" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLINACTIVEPANELBRIGHTNESS.CAPTION" msgid "&Brightness level of inactive panel" msgstr "非現用面板的亮度級別 (&B):" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption msgid "In&dicator Back Color:" msgstr "指示器背景色彩 (&D):" #: tfrmoptionsfilepanelscolors.lblindcolor.caption msgid "&Indicator Fore Color:" msgstr "指示器前景色彩 (&I):" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption #, fuzzy #| msgid "Mark Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLMARKCOLOR.CAPTION" msgid "&Mark Color:" msgstr "標記色彩 (&M):" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption #, fuzzy #| msgid "Text Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLTEXTCOLOR.CAPTION" msgid "T&ext Color:" msgstr "文字色彩 (&E):" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption msgid "Do&n't load file list until a tab is activated" msgstr "不要載入檔案清單直到分頁已可用 (&N)" #: tfrmoptionsfilesviews.cbdirbrackets.caption #, fuzzy #| msgid "Show square brackets around directories" msgctxt "TFRMOPTIONSFILESVIEWS.CBDIRBRACKETS.CAPTION" msgid "S&how square brackets around directories" msgstr "顯示方括號在資料夾項目的兩端 (&H)" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption msgid "Hi&ghlight new and updated files" msgstr "高亮顯示新檔及更新檔案 (&G)" #: tfrmoptionsfilesviews.cblistfilesinthread.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBLISTFILESINTHREAD.CAPTION" msgid "Load &file list in separate thread" msgstr "載入檔案清單在獨立的執行緒 (&F)" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption #, fuzzy #| msgid "Load icons after file list" msgctxt "TFRMOPTIONSFILESVIEWS.CBLOADICONSSEPARATELY.CAPTION" msgid "Load icons af&ter file list" msgstr "載入檔案清單後再讀取圖示 (&T)" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption #, fuzzy #| msgid "Show system and hidden files" msgctxt "TFRMOPTIONSFILESVIEWS.CBSHOWSYSTEMFILES.CAPTION" msgid "Show s&ystem and hidden files" msgstr "顯示系統及隱藏檔案 (&Y)" #: tfrmoptionsfilesviews.cbspacemovesdown.caption #, fuzzy #| msgid "When selecting files with , move down to next file (as with )" msgctxt "TFRMOPTIONSFILESVIEWS.CBSPACEMOVESDOWN.CAPTION" msgid "&When selecting files with , move down to next file (as with )" msgstr "當按下 <空白鍵> 選擇檔案後, 移動到下一個檔案 (就像按下 ) (&W)" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "格式" #: tfrmoptionsfilesviews.gbsorting.caption #, fuzzy msgctxt "TFRMOPTIONSFILESVIEWS.GBSORTING.CAPTION" msgid "Sorting" msgstr "排序" #: tfrmoptionsfilesviews.lblcasesensitivity.caption #, fuzzy #| msgid "Case sensitivity:" msgid "Case s&ensitivity:" msgstr "區分大小寫 (&E):" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "格式不正確" #: tfrmoptionsfilesviews.lbldatetimeformat.caption #, fuzzy #| msgid "Date and time format:" msgctxt "TFRMOPTIONSFILESVIEWS.LBLDATETIMEFORMAT.CAPTION" msgid "&Date and time format:" msgstr "日期及時間格式 (&D):" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "檔案大小格式 (&Z):" #: tfrmoptionsfilesviews.lblnewfilesposition.caption #, fuzzy #| msgid "Insert new files" msgid "&Insert new files" msgstr "插入新檔案 (&I):" #: tfrmoptionsfilesviews.lblsortfoldermode.caption msgid "So&rting directories:" msgstr "排序資料夾 (&R):" #: tfrmoptionsfilesviews.lblsortmethod.caption #, fuzzy #| msgid "Sort &method:" msgctxt "TFRMOPTIONSFILESVIEWS.LBLSORTMETHOD.CAPTION" msgid "&Sort method:" msgstr "排序方式 (&S):" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption msgid "&Move updated files" msgstr "移動更新檔案 (&M):" #: tfrmoptionsfiletypescolors.btnaddcategory.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNADDCATEGORY.CAPTION" msgid "A&dd" msgstr "新增 (&D)" #: tfrmoptionsfiletypescolors.btnapplycategory.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNAPPLYCATEGORY.CAPTION" msgid "A&pply" msgstr "套用 (&P)" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNCATEGORYCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNDELETECATEGORY.CAPTION" msgid "D&elete" msgstr "刪除 (&E)" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "範本..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption #, fuzzy #| msgid "File types colors" msgctxt "TFRMOPTIONSFILETYPESCOLORS.GBFILETYPESCOLORS.CAPTION" msgid "File types colors (sort by drag&&drop)" msgstr "檔案類型色彩 (可用拖曳排序)" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption #, fuzzy #| msgid "Category attributes:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYATTR.CAPTION" msgid "Category a&ttributes:" msgstr "類別屬性 (&T):" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption #, fuzzy #| msgid "Category color:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYCOLOR.CAPTION" msgid "Category co&lor:" msgstr "類別色彩 (&L):" #: tfrmoptionsfiletypescolors.lblcategorymask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYMASK.CAPTION" msgid "Category &mask:" msgstr "類別遮罩 (&M):" #: tfrmoptionsfiletypescolors.lblcategoryname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYNAME.CAPTION" msgid "Category &name:" msgstr "類別名稱 (&N):" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELEDITFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELLOGFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELMAINFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWERBOOKFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.lbleditorfont.caption #, fuzzy #| msgid "Editor font" msgctxt "TFRMOPTIONSFONTS.LBLEDITORFONT.CAPTION" msgid "&Editor font" msgstr "編輯器字型 (&E)" #: tfrmoptionsfonts.lbllogfont.caption #, fuzzy #| msgid "Log font" msgctxt "TFRMOPTIONSFONTS.LBLLOGFONT.CAPTION" msgid "&Log font" msgstr "記錄器字型 (&L)" #: tfrmoptionsfonts.lblmainfont.caption #, fuzzy #| msgid "Main font" msgctxt "TFRMOPTIONSFONTS.LBLMAINFONT.CAPTION" msgid "Main &font" msgstr "主要字型 (&F)" #: tfrmoptionsfonts.lblviewerbookfont.caption #, fuzzy #| msgid "Viewer Book Font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERBOOKFONT.CAPTION" msgid "Viewer&Book Font" msgstr "檢視器閱讀模式字型 (&B)" #: tfrmoptionsfonts.lblviewerfont.caption #, fuzzy #| msgid "Viewer font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERFONT.CAPTION" msgid "&Viewer font" msgstr "檢視器字型 (&V)" #: tfrmoptionshotkeys.btnaddhotkey.caption #, fuzzy #| msgid "Add hotkey" msgid "Add &hotkey" msgstr "新增熱鍵 (&H)" #: tfrmoptionshotkeys.btndeletehotkey.caption #, fuzzy #| msgid "Delete hotkey" msgid "&Delete hotkey" msgstr "刪除熱鍵 (&D)" #: tfrmoptionshotkeys.btnedithotkey.caption #, fuzzy #| msgid "Edit hotkey" msgctxt "tfrmoptionshotkeys.btnedithotkey.caption" msgid "&Edit hotkey" msgstr "編輯熱鍵 (&E)" #: tfrmoptionshotkeys.lbfilter.caption #, fuzzy #| msgid "Filter" msgctxt "TFRMOPTIONSHOTKEYS.LBFILTER.CAPTION" msgid "&Filter" msgstr "篩選 (&F):" #: tfrmoptionshotkeys.lblcategories.caption #, fuzzy #| msgid "Categories:" msgctxt "tfrmoptionshotkeys.lblcategories.caption" msgid "C&ategories:" msgstr "類別 (&A):" #: tfrmoptionshotkeys.lblcommands.caption #, fuzzy #| msgid "Commands:" msgctxt "tfrmoptionshotkeys.lblcommands.caption" msgid "Co&mmands:" msgstr "指令 (&M):" #: tfrmoptionshotkeys.lblscfiles.caption #, fuzzy #| msgid "Shortcut files:" msgctxt "TFRMOPTIONSHOTKEYS.LBLSCFILES.CAPTION" msgid "&Shortcut files:" msgstr "快速鍵檔案 (&S):" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[0].TITLE.CAPTION" msgid "Hotkey" msgstr "熱鍵" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption #, fuzzy msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[1].TITLE.CAPTION" msgid "Parameters" msgstr "參數" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption #, fuzzy msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[2].TITLE.CAPTION" msgid "Controls" msgstr "控制項" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "在下列路徑及子資料夾時停用 (&P):" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "在選單項目顯示圖示 (&M)" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "tfrmoptionsicons.cbiconsinmenussize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption msgctxt "TFRMOPTIONSICONS.CBICONSSHOWOVERLAY.CAPTION" msgid "Show o&verlay icons, e.g. for links" msgstr "顯示覆蓋圖示,例如捷徑 (&V)" #: tfrmoptionsicons.cbiconssize.text msgctxt "TFRMOPTIONSICONS.CBICONSSIZE.TEXT" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "停用特定的圖示" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "選單圖示" #: tfrmoptionsicons.gbiconssize.caption #, fuzzy #| msgid " Icon &size " msgctxt "TFRMOPTIONSICONS.GBICONSSIZE.CAPTION" msgid " Icon size " msgstr "圖示大小" #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "TFRMOPTIONSICONS.GBSHOWICONSMODE.CAPTION" msgid " Show icons to the left of the filename " msgstr "顯示圖示在檔案名稱左邊" #: tfrmoptionsicons.rbiconsshowall.caption #, fuzzy #| msgid "&All" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALL.CAPTION" msgid "A&ll" msgstr "全部 (&L)" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALLANDEXE.CAPTION" msgid "All associated + &EXE/LNK (slow)" msgstr "所有已關聯的檔案 + 執行檔/捷徑 (較慢) (&E)" #: tfrmoptionsicons.rbiconsshownone.caption #, fuzzy msgctxt "TFRMOPTIONSICONS.RBICONSSHOWNONE.CAPTION" msgid "&No icons" msgstr "不顯示圖示 (&N)" #: tfrmoptionsicons.rbiconsshowstandard.caption #, fuzzy #| msgid "&Only standard icons" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWSTANDARD.CAPTION" msgid "Only &standard icons" msgstr "僅標準圖示 (&S)" #: tfrmoptionsignorelist.btnaddsel.caption #, fuzzy #| msgid "&Add selected names" msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSEL.CAPTION" msgid "A&dd selected names" msgstr "加入已選取項目的名稱 (&D)" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSELWITHPATH.CAPTION" msgid "Add selected names with &full path" msgstr "加入已選取項目的完整路徑名稱 (&F)" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "TFRMOPTIONSIGNORELIST.CHKIGNOREENABLE.CAPTION" msgid "&Ignore (don't show) the following files and folders:" msgstr "忽略/不顯示下列的檔案及資料夾 (&I):" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "TFRMOPTIONSIGNORELIST.LBLSAVEIN.CAPTION" msgid "&Save in:" msgstr "儲存位置 (&S):" #: tfrmoptionskeyboard.cblynxlike.caption msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "使用左鍵及右鍵變更資料夾 (類似 Lynx 操作) (&F)" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "輸入焦點" #: tfrmoptionskeyboard.lblalt.caption #, fuzzy #| msgid "Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLALT.CAPTION" msgid "Alt+L&etters" msgstr "Alt+字母 (&E)" #: tfrmoptionskeyboard.lblctrlalt.caption #, fuzzy #| msgid "Ctrl+Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLCTRLALT.CAPTION" msgid "Ctrl+Alt+Le&tters" msgstr "Ctrl+Alt+字母 (&T)" #: tfrmoptionskeyboard.lblnomodifier.caption msgid "&Letters" msgstr "字母 (&L)" #: tfrmoptionslayout.cbflatdiskpanel.caption #, fuzzy #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATDISKPANEL.CAPTION" msgid "&Flat buttons" msgstr "平面按鈕 (&F)" #: tfrmoptionslayout.cbflatinterface.caption #, fuzzy #| msgid "Flat interface" msgctxt "TFRMOPTIONSLAYOUT.CBFLATINTERFACE.CAPTION" msgid "Flat i&nterface" msgstr "平面介面 (&N)" #: tfrmoptionslayout.cbflattoolbar.caption #, fuzzy #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATTOOLBAR.CAPTION" msgid "Flat b&uttons" msgstr "平面按鈕 (&U)" #: tfrmoptionslayout.cbfreespaceind.caption msgctxt "TFRMOPTIONSLAYOUT.CBFREESPACEIND.CAPTION" msgid "Show fr&ee space indicator on drive label" msgstr "顯示可用空間指示器在磁碟標籤 (&E)" #: tfrmoptionslayout.cblogwindow.caption #, fuzzy #| msgid "Show log window" msgctxt "TFRMOPTIONSLAYOUT.CBLOGWINDOW.CAPTION" msgid "Show lo&g window" msgstr "顯示記錄視窗 (&G)" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "TFRMOPTIONSLAYOUT.CBPANELOFOPERATIONS.CAPTION" msgid "Show panel of operation in background" msgstr "顯示操作面板在背景模式" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "TFRMOPTIONSLAYOUT.CBPROGINMENUBAR.CAPTION" msgid "Show common progress in menu bar" msgstr "顯示處理進度在選單列" #: tfrmoptionslayout.cbshowcmdline.caption #, fuzzy #| msgid "Show command &line" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCMDLINE.CAPTION" msgid "Show command l&ine" msgstr "顯示指令行 (&I)" #: tfrmoptionslayout.cbshowcurdir.caption #, fuzzy #| msgid "Show ¤t directory" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCURDIR.CAPTION" msgid "Show current director&y" msgstr "顯示當前資料夾 (&Y)" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDISKPANEL.CAPTION" msgid "Show &drive buttons" msgstr "顯示磁碟按鈕 (&D)" #: tfrmoptionslayout.cbshowdrivefreespace.caption #, fuzzy #| msgid "Show free space label" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDRIVEFREESPACE.CAPTION" msgid "Show free s&pace label" msgstr "顯示可用空間標籤 (&P)" #: tfrmoptionslayout.cbshowdriveslistbutton.caption #, fuzzy #| msgid "Show d&rives list button" msgid "Show drives list bu&tton" msgstr "顯示碟磁清單按鈕 (&T)" #: tfrmoptionslayout.cbshowkeyspanel.caption #, fuzzy #| msgid "Show &function key buttons" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWKEYSPANEL.CAPTION" msgid "Show function &key buttons" msgstr "顯示功能鍵按鈕 (&K)" #: tfrmoptionslayout.cbshowmainmenu.caption #, fuzzy #| msgid "Show main menu" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINMENU.CAPTION" msgid "Show &main menu" msgstr "顯示主要選單 (&M)" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINTOOLBAR.CAPTION" msgid "Show &button bar" msgstr "顯示工具列 (&B)" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption msgid "Show short free space &label" msgstr "顯示簡短的可用空間標籤 (&L)" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWSTATUSBAR.CAPTION" msgid "Show &status bar" msgstr "顯示狀態列 (&S)" #: tfrmoptionslayout.cbshowtabheader.caption #, fuzzy #| msgid "Show &tabstop header" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABHEADER.CAPTION" msgid "S&how tabstop header" msgstr "顯示欄位名稱 (&H)" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABS.CAPTION" msgid "Sho&w folder tabs" msgstr "顯示資料夾分頁 (&W)" #: tfrmoptionslayout.cbtermwindow.caption #, fuzzy #| msgid "Show terminal window" msgctxt "TFRMOPTIONSLAYOUT.CBTERMWINDOW.CAPTION" msgid "Show te&rminal window" msgstr "顯示終端機視窗 (&R)" #: tfrmoptionslayout.cbtwodiskpanels.caption #, fuzzy #| msgid "Show two drive button bars (fixed width, above file windows)" msgctxt "TFRMOPTIONSLAYOUT.CBTWODISKPANELS.CAPTION" msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "顯示兩個磁碟按鈕列 (&X)" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "TFRMOPTIONSLAYOUT.GBSCREENLAYOUT.CAPTION" msgid " Screen layout " msgstr " 畫面佈置 " #: tfrmoptionslog.cblogarcop.caption #, fuzzy #| msgid "Pack/Unpack" msgctxt "TFRMOPTIONSLOG.CBLOGARCOP.CAPTION" msgid "&Pack/Unpack" msgstr "壓縮/解壓縮 (&P)" #: tfrmoptionslog.cblogcpmvln.caption #, fuzzy #| msgid "Copy/Move/Create link/symlink" msgctxt "TFRMOPTIONSLOG.CBLOGCPMVLN.CAPTION" msgid "Cop&y/Move/Create link/symlink" msgstr "複製/移動/建立硬式連結/建立符號連結 (&Y)" #: tfrmoptionslog.cblogdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSLOG.CBLOGDELETE.CAPTION" msgid "&Delete" msgstr "刪除 (&D)" #: tfrmoptionslog.cblogdirop.caption #, fuzzy #| msgid "Create/Delete directories" msgctxt "TFRMOPTIONSLOG.CBLOGDIROP.CAPTION" msgid "Crea&te/Delete directories" msgstr "建立/刪除資料夾 (&T)" #: tfrmoptionslog.cblogerrors.caption msgctxt "TFRMOPTIONSLOG.CBLOGERRORS.CAPTION" msgid "Log &errors" msgstr "記錄錯誤 (&E)" #: tfrmoptionslog.cblogfile.caption #, fuzzy #| msgid "&Create a log file:" msgctxt "TFRMOPTIONSLOG.CBLOGFILE.CAPTION" msgid "C&reate a log file:" msgstr "建立記錄檔案 (&R):" #: tfrmoptionslog.cbloginfo.caption #, fuzzy #| msgid "Log information messages" msgctxt "TFRMOPTIONSLOG.CBLOGINFO.CAPTION" msgid "Log &information messages" msgstr "記錄資訊 (&I)" #: tfrmoptionslog.cblogsuccess.caption msgctxt "TFRMOPTIONSLOG.CBLOGSUCCESS.CAPTION" msgid "Log &successful operations" msgstr "記錄操作成功 (&S)" #: tfrmoptionslog.cblogvfs.caption #, fuzzy #| msgid "File system plugins" msgctxt "TFRMOPTIONSLOG.CBLOGVFS.CAPTION" msgid "&File system plugins" msgstr "檔案系統插件 (&F)" #: tfrmoptionslog.gblogfile.caption msgctxt "TFRMOPTIONSLOG.GBLOGFILE.CAPTION" msgid "File operation log file" msgstr "檔案操作記錄檔案" #: tfrmoptionslog.gblogfileop.caption #| msgid "Log operations:" msgctxt "TFRMOPTIONSLOG.GBLOGFILEOP.CAPTION" msgid "Log operations" msgstr "操作記錄" #: tfrmoptionslog.gblogfilestatus.caption #, fuzzy #| msgid "Operation status:" msgctxt "TFRMOPTIONSLOG.GBLOGFILESTATUS.CAPTION" msgid "Operation status" msgstr "操作狀態" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "移除已不存在檔案的縮圖快取 (&R)" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "當切換磁碟時總是移到根目錄 (&G)" #: tfrmoptionsmisc.chkshowwarningmessages.caption #, fuzzy #| msgid "Show warning messages (\"OK\" button only)" msgctxt "tfrmoptionsmisc.chkshowwarningmessages.caption" msgid "Show &warning messages (\"OK\" button only)" msgstr "顯示警告訊息 (&W)" #: tfrmoptionsmisc.chkthumbsave.caption #, fuzzy #| msgid "Save thumbnails in cache" msgctxt "tfrmoptionsmisc.chkthumbsave.caption" msgid "&Save thumbnails in cache" msgstr "儲存縮圖快取 (&S)" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "tfrmoptionsmisc.dblthumbnails.caption" msgid "Thumbnails" msgstr "縮圖" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "像素" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "tfrmoptionsmisc.lblthumbseparator.caption" msgid "X" msgstr "X" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "縮圖大小 (&T):" #: tfrmoptionsmouse.cbselectionbymouse.caption #, fuzzy #| msgid "Selection by mouse" msgctxt "TFRMOPTIONSMOUSE.CBSELECTIONBYMOUSE.CAPTION" msgid "&Selection by mouse" msgstr "使用滑鼠選取項目 (&S)" #: tfrmoptionsmouse.gbscrolling.caption msgctxt "TFRMOPTIONSMOUSE.GBSCROLLING.CAPTION" msgid "Scrolling" msgstr "滾輪" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "選取項目" #: tfrmoptionsmouse.lblmousemode.caption #, fuzzy #| msgid "Mode:" msgctxt "TFRMOPTIONSMOUSE.LBLMOUSEMODE.CAPTION" msgid "&Mode:" msgstr "模式 (&M):" #: tfrmoptionsmouse.rbscrolllinebyline.caption #, fuzzy #| msgid "Line by line" msgctxt "TFRMOPTIONSMOUSE.RBSCROLLLINEBYLINE.CAPTION" msgid "&Line by line" msgstr "一次捲動行數 (&L)" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption #, fuzzy #| msgid "Line by line with cursor movement" msgctxt "TFRMOPTIONSMOUSE.RBSCROLLLINEBYLINECURSOR.CAPTION" msgid "Line by line &with cursor movement" msgstr "一次捲動一行 + 指標行跟隨移動 (&W)" #: tfrmoptionsmouse.rbscrollpagebypage.caption #, fuzzy #| msgid "Page by page" msgctxt "TFRMOPTIONSMOUSE.RBSCROLLPAGEBYPAGE.CAPTION" msgid "&Page by page" msgstr "一次捲動一頁 (&P)" #: tfrmoptionsplugins.btnaddplugin.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "新增 (&D)" #: tfrmoptionsplugins.btnconfigplugin.caption #, fuzzy #| msgid "Configure" msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "設置 (&F)" #: tfrmoptionsplugins.btnenableplugin.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "啟用 (&N)" #: tfrmoptionsplugins.btnremoveplugin.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "移除 (&R)" #: tfrmoptionsplugins.btntweakplugin.caption #, fuzzy #| msgid "Tweak" msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "調整 (&T)" #: tfrmoptionsplugins.lbldsxdescription.caption #, fuzzy #| msgid "Search plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "搜尋插件可允許使用其他替代搜尋演算法或外部工具搜尋 (像 \"locate\" 等)" #: tfrmoptionsplugins.lblwcxdescription.caption #, fuzzy #| msgid "Packer plugins are used to work with archives." msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "壓縮插件用於支援特定壓縮格式的處理" #: tfrmoptionsplugins.lblwdxdescription.caption #, fuzzy #| msgid "Content plugins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "內容插件可允許在檔案清單顯示 MP3 標籤或圖片屬性等延伸的檔案詳細資料, 或是在搜尋和多重命名工具中使用" #: tfrmoptionsplugins.lblwfxdescription.caption #, fuzzy #| msgid "File system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "檔案系統插件可允許存取一些作業系統上罕見的檔案系統, 或是像 Palm/PocketPC 等外部裝置" #: tfrmoptionsplugins.lblwlxdescription.caption #, fuzzy #| msgid "Viewer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "檢視器插件可允許顯示圖片,試算表,資料庫等檔案格式在檢視器" #: tfrmoptionsplugins.stgplugins.columns[0].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[0].TITLE.CAPTION" msgid "Active" msgstr "啟動" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[1].TITLE.CAPTION" msgid "Plugin" msgstr "插件" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[2].TITLE.CAPTION" msgid "Registered for" msgstr "登錄對象" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[3].TITLE.CAPTION" msgid "File name" msgstr "檔案名稱" #: tfrmoptionsplugins.tsdsx.caption #, fuzzy #| msgid "Search plugins (.DSX)" msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "搜尋插件 (.DSX)" #: tfrmoptionsplugins.tswcx.caption #, fuzzy #| msgid "Packer plugins (.WCX)" msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "壓縮插件 (.WCX)" #: tfrmoptionsplugins.tswdx.caption #, fuzzy #| msgid "Content plugins (.WDX)" msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "內容插件 (.WDX)" #: tfrmoptionsplugins.tswfx.caption #, fuzzy #| msgid "File system plugins (.WFX)" msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "檔案系統插件 (.WFX)" #: tfrmoptionsplugins.tswlx.caption #, fuzzy #| msgid "Viewer plugins (.WLX)" msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "檢視器插件 (.WLX)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTBEGINNING.CAPTION" msgid "&Beginning (name must start with first typed character)" msgstr "開頭 (名稱開頭必需符合第一個輸入的字元) (&B)" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTENDING.CAPTION" msgid "En&ding (last character before a typed dot . must match)" msgstr "結尾 (名稱結尾必需符合最後輸入的字元) (&D)" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CGPOPTIONS.CAPTION" msgid "Options" msgstr "選項" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption #, fuzzy #| msgid "Exact name match:" msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.GBEXACTNAMEMATCH.CAPTION" msgid "Exact name match" msgstr "精準名稱比對" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "區分大小寫" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "搜尋下列項目" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "TFRMOPTIONSTABS.CBTABSACTIVATEONCLICK.CAPTION" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "點擊分頁後立即啟動該分頁 (&P)" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "TFRMOPTIONSTABS.CBTABSALWAYSVISIBLE.CAPTION" msgid "&Show tab header also when there is only one tab" msgstr "總是顯示分頁 (&S)" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption #, fuzzy #| msgid "&Confirm close all tabs" msgctxt "TFRMOPTIONSTABS.CBTABSCONFIRMCLOSEALL.CAPTION" msgid "Con&firm close all tabs" msgstr "關閉所有分頁時需確認 (&F)" #: tfrmoptionstabs.cbtabslimitoption.caption #, fuzzy #| msgid "&Limit tab title length to:" msgctxt "TFRMOPTIONSTABS.CBTABSLIMITOPTION.CAPTION" msgid "&Limit tab title length to" msgstr "限制分頁標題長度為 (&L):" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "TFRMOPTIONSTABS.CBTABSLOCKEDASTERISK.CAPTION" msgid "Show locked tabs &with an asterisk *" msgstr "顯示星號在鎖定的分頁 (&W)" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "TFRMOPTIONSTABS.CBTABSMULTILINES.CAPTION" msgid "&Tabs on multiple lines" msgstr "允許分頁多行顯示 (&T)" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENFOREGROUND.CAPTION" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Ctrl+Up 開啟新分頁時切換到該分頁 (&U)" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENNEARCURRENT.CAPTION" msgid "Open &new tabs near current tab" msgstr "開啟新分頁於目前分頁旁邊 (&N)" #: tfrmoptionstabs.cbtabsshowclosebutton.caption #, fuzzy #| msgid "Show tab close button" msgctxt "TFRMOPTIONSTABS.CBTABSSHOWCLOSEBUTTON.CAPTION" msgid "Show ta&b close button" msgstr "顯示分頁關閉按鈕 (&B)" #: tfrmoptionstabs.gbtabs.caption msgctxt "TFRMOPTIONSTABS.GBTABS.CAPTION" msgid "Folder tabs headers" msgstr "資料夾分頁" #: tfrmoptionstabs.lblchar.caption msgctxt "TFRMOPTIONSTABS.LBLCHAR.CAPTION" msgid "characters" msgstr "字元" #: tfrmoptionstabs.lbltabsposition.caption #, fuzzy #| msgid "Tabs position" msgctxt "TFRMOPTIONSTABS.LBLTABSPOSITION.CAPTION" msgid "Ta&bs position" msgstr "分頁位置 (&B):" #: tfrmoptionsterminal.lblruninterm.caption #, fuzzy #| msgid "Run in terminal:" msgctxt "TFRMOPTIONSTERMINAL.LBLRUNINTERM.CAPTION" msgid "Run in &terminal:" msgstr "使用終端機執行 (&T):" #: tfrmoptionsterminal.lblrunterm.caption #, fuzzy #| msgid "Run terminal:" msgctxt "TFRMOPTIONSTERMINAL.LBLRUNTERM.CAPTION" msgid "Run t&erminal:" msgstr "開啟終端機 (&E):" #: tfrmoptionstoolbar.btnclonebutton.caption #, fuzzy #| msgid "&Clone button" msgctxt "tfrmoptionstoolbar.btnclonebutton.caption" msgid "C&lone button" msgstr "複製按鈕 (&L)" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "tfrmoptionstoolbar.btndeletebutton.caption" msgid "&Delete" msgstr "刪除 (&D)" #: tfrmoptionstoolbar.btnedithotkey.caption #, fuzzy #| msgid "Edit hotkey" msgctxt "tfrmoptionstoolbar.btnedithotkey.caption" msgid "Edit hot&key" msgstr "編輯熱鍵 (&K)" #: tfrmoptionstoolbar.btninsertbutton.caption #, fuzzy #| msgid "&Insert new buttonX" msgctxt "tfrmoptionstoolbar.btninsertbutton.caption" msgid "&Insert new button" msgstr "插入新按鈕 (&I)" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "tfrmoptionstoolbar.btnopenfile.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "tfrmoptionstoolbar.btnopenicon.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnremovehotkey.caption msgctxt "tfrmoptionstoolbar.btnremovehotkey.caption" msgid "Remove hotke&y" msgstr "移除熱鍵 (&Y)" #: tfrmoptionstoolbar.cbflatbuttons.caption #, fuzzy #| msgid "Flat b&uttons" msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "平面按鈕 (&F)" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "輸入指令參數 (每指令一行)" #: tfrmoptionstoolbar.gbgroupbox.caption msgctxt "tfrmoptionstoolbar.gbgroupbox.caption" msgid "Appearance" msgstr "外觀" #: tfrmoptionstoolbar.lblbarsize.caption #, fuzzy #| msgid "Ba&r size:" msgctxt "tfrmoptionstoolbar.lblbarsize.caption" msgid "&Bar size:" msgstr "工具列大小 (&B):" #: tfrmoptionstoolbar.lblexternalcommand.caption msgctxt "tfrmoptionstoolbar.lblexternalcommand.caption" msgid "Comman&d:" msgstr "指令 (&D):" #: tfrmoptionstoolbar.lblexternalparameters.caption msgctxt "tfrmoptionstoolbar.lblexternalparameters.caption" msgid "Parameter&s:" msgstr "參數 (&S):" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "熱鍵:" #: tfrmoptionstoolbar.lbliconfile.caption #, fuzzy #| msgid "Icon:" msgctxt "tfrmoptionstoolbar.lbliconfile.caption" msgid "Ico&n:" msgstr "圖示 (&N):" #: tfrmoptionstoolbar.lbliconsize.caption #, fuzzy #| msgid "Ic&on size:" msgctxt "tfrmoptionstoolbar.lbliconsize.caption" msgid "Icon si&ze:" msgstr "圖示大小 (&Z):" #: tfrmoptionstoolbar.lblinternalcommand.caption msgctxt "tfrmoptionstoolbar.lblinternalcommand.caption" msgid "Co&mmand:" msgstr "指令 (&M):" #: tfrmoptionstoolbar.lblinternalparameters.caption msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "參數 (&P):" #: tfrmoptionstoolbar.lblstartpath.caption #, fuzzy #| msgid "Start path:" msgctxt "tfrmoptionstoolbar.lblstartpath.caption" msgid "Start pat&h:" msgstr "開始路徑 (&H):" #: tfrmoptionstoolbar.lbltooltip.caption #, fuzzy #| msgid "Tooltip:" msgctxt "tfrmoptionstoolbar.lbltooltip.caption" msgid "&Tooltip:" msgstr "工具提示 (&T):" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "按鈕類型" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSKEEPTERMINALOPEN.CAPTION" msgid "&Keep terminal window open after executing program" msgstr "在執行程式後保持終端機視窗開啟 (&K)" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption #, fuzzy #| msgid "Execute in terminal" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSRUNINTERMINAL.CAPTION" msgid "&Execute in terminal" msgstr "使用終端機執行 (&E)" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption #, fuzzy #| msgid "Use external program" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSUSEEXTERNALPROGRAM.CAPTION" msgid "&Use external program" msgstr "使用外部程式 (&U)" #: tfrmoptionstoolbase.lbltoolsparameters.caption #, fuzzy #| msgid "Additional parameters" msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPARAMETERS.CAPTION" msgid "A&dditional parameters" msgstr "額外參數 (&D)" #: tfrmoptionstoolbase.lbltoolspath.caption #, fuzzy #| msgid "Path to program to execute" msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPATH.CAPTION" msgid "&Path to program to execute" msgstr "執行程式路徑 (&P)" #: tfrmoptionstooltips.btnaddfields.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "新增 (&D)" #: tfrmoptionstooltips.btnapplyfields.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "套用 (&P)" #: tfrmoptionstooltips.btndeletefields.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "刪除 (&E)" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "範本..." #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "檔案類型自訂提示" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "顯示工具提示" #: tfrmoptionstooltips.lblfieldslist.caption #, fuzzy #| msgid "Category hint:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "類別提示 (&H):" #: tfrmoptionstooltips.lblfieldsmask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "類別遮罩 (&M):" #: tfrmoptionstooltips.lblfieldsname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "類別名稱 (&N):" #: tfrmoptionstooltips.rbtooltipallfiles.caption #, fuzzy #| msgid "Show tool tip for all files in file panel" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "顯示工具提示在檔案面板裡的所有檔案 (&W)" #: tfrmoptionstooltips.rbtooltipnone.caption #, fuzzy #| msgid "Don't show" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "不要顯示 (&S)" #: tfrmoptionstooltips.rbtooltiponlylarge.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "顯示工具提示在檔案面板裡名稱有被截斷的檔案 (&T)" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNBACKVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNFONTVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.gbviewerbookmode.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWERBOOKMODE.CAPTION" msgid "Viewer Book Mode" msgstr "檢視器閱讀模式" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWEREXAMPLE.CAPTION" msgid "Example" msgstr "範例" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption #, fuzzy #| msgid "Background color in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLBACKGROUNDCOLORVIEWERBOOK.CAPTION" msgid "&Background color in book viewer" msgstr "閱讀模式背景色彩 (&B)" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption #, fuzzy #| msgid "Font color in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLFONTCOLORVIEWERBOOK.CAPTION" msgid "&Font color in book viewer" msgstr "閱讀模式字型色彩 (&F)" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption msgctxt "TFRMOPTIONSVIEWER.LBLNUMBERCOLUMNSVIEWER.CAPTION" msgid "&Number of columns in book viewer" msgstr "閱讀模式欄位數量 (&N)" #: tfrmpackdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmpackdlg.btnconfig.caption #, fuzzy #| msgid "&Configure" msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "設置 (&F)" #: tfrmpackdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "說明 (&H)" #: tfrmpackdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfrmpackdlg.caption msgctxt "TFRMPACKDLG.CAPTION" msgid "Pack files" msgstr "壓縮檔案" #: tfrmpackdlg.cbcreateseparatearchives.caption #, fuzzy #| msgid "Create separate archives, o&ne per selected file/dir" msgid "C&reate separate archives, one per selected file/dir" msgstr "替每個選取的檔案/資料夾建立各自的壓縮檔案 (&R)" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "建立自解壓檔案 (&X)" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "加密 (&Y)" #: tfrmpackdlg.cbmovetoarchive.caption #, fuzzy #| msgid "M&ove to archive" msgid "Mo&ve to archive" msgstr "移動到壓縮檔 (&V)" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "分片壓縮 (&M)" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "=>" #: tfrmpackdlg.cbputintarfirst.caption msgid "P&ut in the TAR archive first" msgstr "先用 TAR 打包檔案 (&U)" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "包含路徑名稱 (僅遞迴) (&P)" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "壓縮到這個檔案:" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "壓縮程式" #: tfrmpackinfodlg.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "關閉 (&C)" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "解壓所有檔案並執行 (&A)" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "解壓縮並執行 (&U)" #: tfrmpackinfodlg.caption msgctxt "TFRMPACKINFODLG.CAPTION" msgid "Properties of packed file" msgstr "壓縮檔案內容" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "屬性:" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "壓縮率:" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "日期:" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "方式:" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "原始大小:" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "檔案:" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "壓縮大小:" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "壓縮者:" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "時間:" #: tfrmquicksearch.btncancel.caption msgctxt "tfrmquicksearch.btncancel.caption" msgid "X" msgstr "X" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "關閉篩選面板" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "輸入要搜尋或篩選的文字" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "Aa" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "大小寫視為相異" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "D" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "資料夾" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "F" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "檔案" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "{" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "比對開頭" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "}" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "比對結尾" #: tfrmquicksearch.tglfilter.caption msgctxt "tfrmquicksearch.tglfilter.caption" msgid "Filter" msgstr "篩選" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "切換搜尋或篩選" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CANCELBUTTON.CAPTION" msgid "Cancel" msgstr "取消" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CLOSEBUTTON.CAPTION" msgid "&Close" msgstr "關閉 (&C)" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.HELPBUTTON.CAPTION" msgid "&Help" msgstr "說明 (&H)" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "tfrmselecttextrange.btppanel.okbutton.caption" msgid "&OK" msgstr "確定 (&O)" #: tfrmselecttextrange.lblselecttext.caption #, fuzzy #| msgid "Select the characters to insert:" msgid "&Select the characters to insert:" msgstr "選擇要插入的字元: (&S)" #: tfrmsetfileproperties.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfrmsetfileproperties.caption #, fuzzy msgctxt "TFRMSETFILEPROPERTIES.CAPTION" msgid "Change attributes" msgstr "變更屬性" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Sticky" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmsetfileproperties.chkarchive.caption #, fuzzy msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "封存" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "建立日期:" #: tfrmsetfileproperties.chkhidden.caption #, fuzzy msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "隱藏" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "存取日期:" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "修改日期:" #: tfrmsetfileproperties.chkreadonly.caption #, fuzzy msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "唯讀" #: tfrmsetfileproperties.chkrecursive.caption msgid "Including subfolders" msgstr "包含子資料夾" #: tfrmsetfileproperties.chksystem.caption #, fuzzy msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "系統" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "時間戳記內容" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "屬性" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "屬性" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "群組" #: tfrmsetfileproperties.lblattrinfo.caption msgid "(gray field means unchanged value)" msgstr "(灰色欄位代表不可改變的數值)" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "其他" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "擁有者" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "文字:" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "執行" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "8進制:" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "讀取" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "寫入" #: tfrmsplitter.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfrmsplitter.caption msgctxt "TFRMSPLITTER.CAPTION" msgid "Splitter" msgstr "分割" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664B - 3.5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "檔案名稱" #: tfrmsplitter.grbxsize.caption #| msgid "File size" msgid "Size and number of parts" msgstr "分割檔大小及數量" #: tfrmsplitter.lbdirtarget.caption #, fuzzy #| msgid "Directory target" msgid "Directory &target" msgstr "目標資料夾 (&T)" #: tfrmsplitter.lbfilesource.caption #, fuzzy #| msgid "File source" msgid "File &source" msgstr "來源檔案 (&S)" #: tfrmsplitter.lblnumberparts.caption msgid "&Number of parts" msgstr "分割檔數量 (&N)" #: tfrmsplitter.rbtngigab.caption msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "&Gigabytes" #: tfrmsplitter.rbtnkilob.caption msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "&Kilobytes" #: tfrmsplitter.rbtnmegab.caption msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "&Megabytes" #: tfrmsymlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfrmsymlink.caption #| msgid "Create symlink" msgid "Create symbolic link" msgstr "建立符號連結" #: tfrmsymlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "連結目標 (&D)" #: tfrmsymlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "連結名稱 (&L)" #: tfrmtweakplugin.btnadd.caption #, fuzzy #| msgid "Add new" msgid "A&dd new" msgstr "增加" #: tfrmtweakplugin.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "取消 (&C)" #: tfrmtweakplugin.btnchange.caption #, fuzzy #| msgid "Change" msgid "C&hange" msgstr "變更 (&H)" #: tfrmtweakplugin.btndefault.caption #, fuzzy #| msgid "Default" msgid "De&fault" msgstr "預設值 (&F)" #: tfrmtweakplugin.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "確定 (&O)" #: tfrmtweakplugin.btnremove.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "移除 (&R)" #: tfrmtweakplugin.caption msgctxt "TFRMTWEAKPLUGIN.CAPTION" msgid "Tweak plugin" msgstr "調整插件" #: tfrmtweakplugin.cbpk_caps_by_content.caption #, fuzzy #| msgid "Detect archive type by content" msgid "De&tect archive type by content" msgstr "依內容檢測壓縮類型 (&T)" #: tfrmtweakplugin.cbpk_caps_delete.caption #, fuzzy #| msgid "Can delete files" msgid "Can de&lete files" msgstr "可以刪除檔案 (&L)" #: tfrmtweakplugin.cbpk_caps_encrypt.caption #, fuzzy #| msgid "Supports encryption" msgid "Supports e&ncryption" msgstr "支持加密 (&N)" #: tfrmtweakplugin.cbpk_caps_hide.caption #, fuzzy #| msgid "Show as normal files (hide packer icon)" msgid "Sho&w as normal files (hide packer icon)" msgstr "顯示為普通檔案 (隱藏壓縮器圖示) (&W)" #: tfrmtweakplugin.cbpk_caps_mempack.caption #, fuzzy #| msgid "Supports packing in memory" msgid "Supports pac&king in memory" msgstr "支持在記憶體進行壓縮 (&K)" #: tfrmtweakplugin.cbpk_caps_modify.caption #, fuzzy #| msgid "Can modify exisiting archives" msgid "Can &modify exisiting archives" msgstr "可以修改已存在的壓縮檔 (&M)" #: tfrmtweakplugin.cbpk_caps_multiple.caption #, fuzzy #| msgid "Archive can contain multiple files" msgid "&Archive can contain multiple files" msgstr "壓縮檔可包含複數檔案 (&A)" #: tfrmtweakplugin.cbpk_caps_new.caption #, fuzzy #| msgid "Can create new archives" msgid "Can create new archi&ves" msgstr "可以建立新壓縮檔 (&V)" #: tfrmtweakplugin.cbpk_caps_options.caption #, fuzzy #| msgid "Supports the options dialogbox" msgid "S&upports the options dialogbox" msgstr "支持選項對話盒 (&U)" #: tfrmtweakplugin.cbpk_caps_searchtext.caption #, fuzzy #| msgid "Allow searching for text in archives" msgid "Allow searchin&g for text in archives" msgstr "允許在壓縮檔搜尋文字 (&G)" #: tfrmtweakplugin.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "描述 (&D):" #: tfrmtweakplugin.lbldetectstr.caption #, fuzzy #| msgid "Detect string:" msgid "D&etect string:" msgstr "檢測字串 (&E):" #: tfrmtweakplugin.lblextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "副檔名 (&E):" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "旗標:" #: tfrmtweakplugin.lblname.caption #, fuzzy #| msgid "Name:" msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "名稱 (&N):" #: tfrmtweakplugin.lblplugin.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "插件 (&P):" #: tfrmtweakplugin.lblplugin1.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "插件 (&P):" #: tfrmviewer.actabout.caption msgctxt "TFRMVIEWER.ACTABOUT.CAPTION" msgid "About Viewer..." msgstr "關於檢視器..." #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "顯示關於訊息" #: tfrmviewer.actcopyfile.caption msgctxt "TFRMVIEWER.ACTCOPYFILE.CAPTION" msgid "Copy File" msgstr "複製檔案" #: tfrmviewer.actcopyfile.hint msgctxt "TFRMVIEWER.ACTCOPYFILE.HINT" msgid "Copy File" msgstr "複製檔案" #: tfrmviewer.actdeletefile.caption msgctxt "TFRMVIEWER.ACTDELETEFILE.CAPTION" msgid "Delete File" msgstr "刪除檔案" #: tfrmviewer.actdeletefile.hint msgctxt "TFRMVIEWER.ACTDELETEFILE.HINT" msgid "Delete File" msgstr "刪除檔案" #: tfrmviewer.actloadnextfile.caption msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.CAPTION" msgid "&Next" msgstr "下一個 (&N)" #: tfrmviewer.actloadnextfile.hint msgid "Load Next File" msgstr "載入下一個檔案" #: tfrmviewer.actloadprevfile.caption msgctxt "TFRMVIEWER.ACTLOADPREVFILE.CAPTION" msgid "&Previous" msgstr "上一個 (&P)" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "載入上一個檔案" #: tfrmviewer.actmirror.caption msgctxt "TFRMVIEWER.ACTMIRROR.CAPTION" msgid "Mirror" msgstr "水平翻轉" #: tfrmviewer.actmirror.hint msgctxt "TFRMVIEWER.ACTMIRROR.HINT" msgid "Mirror" msgstr "水平翻轉" #: tfrmviewer.actmovefile.caption msgctxt "TFRMVIEWER.ACTMOVEFILE.CAPTION" msgid "Move File" msgstr "移動檔案" #: tfrmviewer.actmovefile.hint msgctxt "TFRMVIEWER.ACTMOVEFILE.HINT" msgid "Move File" msgstr "移動檔案" #: tfrmviewer.actreload.caption msgctxt "TFRMVIEWER.ACTRELOAD.CAPTION" msgid "Reload" msgstr "重新載入" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "重新載入目前檔案" #: tfrmviewer.actrotate180.caption msgctxt "TFRMVIEWER.ACTROTATE180.CAPTION" msgid "Rotate 180" msgstr "旋轉180度" #: tfrmviewer.actrotate180.hint msgctxt "TFRMVIEWER.ACTROTATE180.HINT" msgid "Rotate 180" msgstr "旋轉180度" #: tfrmviewer.actrotate270.caption msgctxt "TFRMVIEWER.ACTROTATE270.CAPTION" msgid "Rotate 270" msgstr "旋轉270度" #: tfrmviewer.actrotate270.hint msgctxt "TFRMVIEWER.ACTROTATE270.HINT" msgid "Rotate 270" msgstr "旋轉270度" #: tfrmviewer.actrotate90.caption msgctxt "TFRMVIEWER.ACTROTATE90.CAPTION" msgid "Rotate 90" msgstr "旋轉90度" #: tfrmviewer.actrotate90.hint msgctxt "TFRMVIEWER.ACTROTATE90.HINT" msgid "Rotate 90" msgstr "旋轉90度" #: tfrmviewer.actsaveas.caption msgctxt "TFRMVIEWER.ACTSAVEAS.CAPTION" msgid "Save As..." msgstr "另存新檔..." #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "另存新檔..." #: tfrmviewer.actstretchimage.caption msgctxt "TFRMVIEWER.ACTSTRETCHIMAGE.CAPTION" msgid "Stretch" msgstr "延展" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "延展圖片" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "- 90" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "複製" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "複製" #: tfrmviewer.btncuttuimage.hint #, fuzzy msgid "Crop" msgstr "裁剪" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "刪除" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "刪除" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "全螢幕" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "||" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "S" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "高亮" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "水平翻轉" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "移動" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "移動" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "||>" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "繪圖" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "<||" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "紅眼" #: tfrmviewer.btnresize.hint msgid "Resize" msgstr "調整大小" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "復原" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "放大" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "縮小" #: tfrmviewer.caption msgctxt "tfrmviewer.caption" msgid "Viewer" msgstr "檢視器" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "投影片放映" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "鉛筆" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption #, fuzzy msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "高亮" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "繪圖" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "投影片放映" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "檢視" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "0x0" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "+ 180" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "- 90" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "關於" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "顯示為二進制 (&B)" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "複製到剪貼簿" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "編輯 (&E)" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "編碼 (&C)" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "離開 (&X)" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "檔案 (&F)" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "全螢幕" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "圖像" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "顯示為十六進制 (&H)" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "圖片(&I)" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "顯示為閱讀模式 (&O)" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "水平翻轉" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "插件" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "預覽" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "列印..." #: tfrmviewer.mirotate.caption #, fuzzy msgid "Rotate" msgstr "旋轉" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "儲存" #: tfrmviewer.misaveas.caption msgctxt "TFRMVIEWER.MISAVEAS.CAPTION" msgid "Save As..." msgstr "另存新檔..." #: tfrmviewer.miscreenshot.caption msgid "Screenshot" msgstr "截圖" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "搜尋" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "搜尋下一個" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "搜尋上一個" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "全選" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.mistretch.caption msgctxt "TFRMVIEWER.MISTRETCH.CAPTION" msgid "Stretch" msgstr "延展" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "顯示為文字 (&T)" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "檢視 (&V)" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "顯示為自動換行文字 (&W)" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "放大" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "縮小" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "複製到剪貼簿" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "全選" #: tfrmviewoperations.btnstartpause.caption #| msgid "Start" msgctxt "tfrmviewoperations.btnstartpause.caption" msgid "&Start" msgstr "開始 (&S)" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "停止 (&T)" #: tfrmviewoperations.caption msgctxt "TFRMVIEWOPERATIONS.CAPTION" msgid "File operations" msgstr "檔案操作" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "總是顯示在最上層" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "可使用\"拖曳\"來改變操作的佇列順序" #: tfrmviewoperations.mnucanceloperation.caption msgctxt "tfrmviewoperations.mnucanceloperation.caption" msgid "Cancel" msgstr "取消" #: tfrmviewoperations.mnucancelqueue.caption msgctxt "tfrmviewoperations.mnucancelqueue.caption" msgid "Cancel" msgstr "取消" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "新增佇列" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "tfrmviewoperations.mnuoperationshowdetached.caption" msgid "Show in detached window" msgstr "顯示在分離視窗" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "移到佇列頂端" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "移到佇列底部" #: tfrmviewoperations.mnuqueue.caption msgctxt "tfrmviewoperations.mnuqueue.caption" msgid "Queue" msgstr "佇列" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "移出佇列" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "佇列 1" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "佇列 2" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "佇列 3" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "佇列 4" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "佇列 5" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "tfrmviewoperations.mnuqueueshowdetached.caption" msgid "Show in detached window" msgstr "顯示在分離視窗" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "暫停全部 (&P)" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "tmultiarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "當檔案存在時" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "twcxarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "當檔案存在時" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "執行在背景模式 (單獨連接)" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption #, fuzzy msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "當檔案存在時" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "取消快速篩選" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "取消目前操作" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "剪貼簿沒有包含任何可用的工具列資料。" #: ulng.rscolattr msgid "Attr" msgstr "屬性" #: ulng.rscoldate msgid "Date" msgstr "日期" #: ulng.rscolext msgid "Ext" msgstr "副檔名" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "名稱" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "大小" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "修改數目:" #: ulng.rsconfcolalign msgid "Align" msgstr "對齊" #: ulng.rsconfcolcaption msgid "Caption" msgstr "標題" #: ulng.rsconfcolconfig msgid "Config" msgstr "設置" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "刪除" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "欄位內容" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "移動" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "寬度" #: ulng.rsconfcustheader msgid "Customize column" msgstr "自訂欄位" #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "複製 (%d) %s" #: ulng.rsdlgallopcomplete msgid "All operations completed" msgstr "所有操作已完成" #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "所有操作進度 %d %%" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "放棄 (&O)" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "全部 (&L)" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "增加 (&P)" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "取消 (&C)" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "繼續 (&C)" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "複製進去 (&I)" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "全部複製進去 (&A)" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "離開程式 (&X)" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "忽略全部 (&G)" #: ulng.rsdlgbuttonno msgid "&No" msgstr "否 (&N)" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "無 (&E)" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "確定 (&O)" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "覆蓋 (&O)" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "覆蓋全部 (&A)" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "覆蓋全部舊檔 (&D)" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "回復 (&R)" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "重試 (&T)" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "略過 (&S)" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "略過全部 (&K)" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "是 (&Y)" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "計算檔案及資料夾" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "計算驗證碼..." #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "校驗驗證碼..." #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "複製檔案" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "刪除檔案" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "移動檔案" #: ulng.rsdlgoppause #| msgid "Pause" msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "暫停 (&S)" #: ulng.rsdlgopstart #| msgid "Start" msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "開始 (&S)" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "佇列" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "速度 %s/秒" #: ulng.rsdlgspeedtime #| msgid "Speed %s/s, remaining time %s" msgid "Speed %s/s, time remaining %s" msgstr "速度 %s/秒, 剩餘時間 %s" #: ulng.rsdlgsplit #| msgid "Split file" msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "分割" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "抹除檔案" #: ulng.rsdrivenolabel msgid "" msgstr "<沒有標籤>" #: ulng.rsdrivenomedia msgid "" msgstr "<沒有媒體>" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Double Commander 內部編輯器。" #: ulng.rseditnewfile msgid "new.txt" msgstr "new.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "檔案名稱:" #: ulng.rseditnewopen msgid "Open file" msgstr "開啟檔案" #: ulng.rseditsearchback msgid "&Backward" msgstr "前一個(&B)" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "搜尋" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "下一個 (&F)" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "取代" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "詢問;覆蓋;複製進去;略過" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "詢問;覆蓋;覆蓋舊檔;略過" #: ulng.rsfileopsetpropertyerroroptions msgctxt "ulng.rsfileopsetpropertyerroroptions" msgid "Ask;Don't set anymore;Ignore errors" msgstr "詢問;不要設置;忽略錯誤" #: ulng.rsfilterstatus msgid "FILTER" msgstr "篩選" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "定義範本" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "%s 級" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "全部 (不限層次)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "僅目前資料夾" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "資料夾 %s 不存在!" #: ulng.rsfindfound msgid "Found: %d" msgstr "找到: %d" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "儲存搜尋範本" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "範本名稱:" #: ulng.rsfindscanned msgid "Scanned: %d" msgstr "已掃描: %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "掃描" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "尋找檔案" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "開始" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr "可用 %sB,容量 %sB" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "%sB 可用" #: ulng.rsfuncatime msgid "Access date/time" msgstr "存取日期/時間" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "屬性" #: ulng.rsfunccomment msgctxt "ulng.rsfunccomment" msgid "Comment" msgstr "註解" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "壓縮大小" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "建立日期/時間" #: ulng.rsfuncext msgid "Extension" msgstr "副檔名" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "群組" #: ulng.rsfunclinkto msgid "Link to" msgstr "連結" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "修改日期/時間" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "名稱" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "名稱但不含副檔名" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "擁有者" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "路徑" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "大小" #: ulng.rsfunctype msgid "Type" msgstr "類型" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "建立硬式連結發生錯誤。" #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "複製/移動對話盒" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "比對器" #: ulng.rshotkeycategorymain msgid "Main" msgstr "主視窗" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "檢視器" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "連結完成" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "取消選擇遮罩" #: ulng.rsmarkplus msgid "Select mask" msgstr "選擇遮罩" #: ulng.rsmaskinput msgid "Input mask:" msgstr "輸入遮罩" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "設置自訂欄位" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "設置這個自訂欄位檢視" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "動作" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "編輯" #: ulng.rsmnueject msgid "Eject" msgstr "退出" #: ulng.rsmnumount msgid "Mount" msgstr "掛載" #: ulng.rsmnunew #, fuzzy msgctxt "ulng.rsmnunew" msgid "New" msgstr "新增" #: ulng.rsmnunomedia msgid "No media available" msgstr "沒有可用的媒體" #: ulng.rsmnuopenwith #, fuzzy #| msgid "Open with ..." msgid "Open with" msgstr "開啟..." #: ulng.rsmnuopenwithother msgid "Other..." msgstr "其它..." #: ulng.rsmnusortby msgid "Sort by" msgstr "排序方式" #: ulng.rsmnuumount #| msgid "Umount" msgid "Unmount" msgstr "卸載" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "檢視" #: ulng.rsmsgaccount msgid "Account:" msgstr "帳戶:" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "壓縮器命令行的額外參數" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "你不能複製/移動檔案【%s】到相同目錄" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "無法刪除資料夾【%s】" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "變更目錄到資料夾【%s】失敗!" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "你確定要關閉所有非現用的分頁嗎?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "這個分頁【%s】已鎖定! 仍要關閉嗎?" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "你確定要退出嗎?" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "你確定要複製這 %d 個被選擇的檔案/資料夾嗎?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "你確定要複製所選擇的【%s】嗎?" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "你確定要刪除這個部份複製的檔案嗎?" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "你確定要刪除這 %d 個被選擇的檔案/資料夾嗎?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "你確定要刪除這 %d 個被選擇的檔案/資料夾到資源回收筒嗎?" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "你確定要刪除所選擇的【%s】嗎?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "你確定要刪除所選擇的【%s】到資源回收筒嗎?" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "無法刪除【%s】到資源回收筒! 要直接刪除嗎?" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "磁碟不存在" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "輸入檔案副檔名:" #: ulng.rsmsgentername msgid "Enter name:" msgstr "輸入名稱:" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "壓縮檔資料 CRC 錯誤" #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "資料損壞" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "無法連接到伺服器:【%s】" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "無法複製檔案 %s 到 %s" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "目標已存在名稱為【%s】的資料夾。" #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "日期 %s 不被支援" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "資料夾 %s 已存在!" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "使用者中止執行" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "關閉檔案發生錯誤" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "無法建立檔案" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "壓縮檔裡沒有檔案" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "無法打開已存在的檔案" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "讀取檔案發生錯誤" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "寫入檔案發生錯誤" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "無法建立資料夾 %s!" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "無效的連結" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "未找到檔案" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "記憶體不足" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "不支持的功能!" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "內文選單指令發生錯誤" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "載入設置時發生錯誤" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "規則運算式語法錯誤!" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "無法重新命名檔案 %s 為 %s" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "無法儲存檔案關聯!" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "無法儲存檔案" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "無法替【%s】設置屬性" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "無法替【%s】設置日期/時間" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "無法替【%s】設置擁有者/群組" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "緩沖區太小" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "要壓縮的檔案太多" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "未知的壓縮格式" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "檔案 %s 已變更, 是否要儲存?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "檔案 %s 已存在, 是否要覆蓋?" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "檔案操作啟動" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "部份檔案操作尚未完成。關閉 Double Commander 可能會使資料遺失。" #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "檔案 %s 是唯讀檔。仍要刪除嗎?" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "這個檔案【%s】的容量對於目標檔案系統來說太大!" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "資料夾 %s 已存在, 是否要覆蓋?" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "你確定要允許符號連結【%s】嗎?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "指令行發生錯誤" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "無效的檔案名稱" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "無效的設定檔格式" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "無效的路徑" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "路徑 %s 包含禁用字元 " #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "這不是可用的插件!" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "這個插件是替 TotalDouble Commander 的 %s 所建立。%s不能正常運作在 Double Commander 的 %s!" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "無效的引用" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "無效的選擇" #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "載入檔案清單..." #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "複製檔案 %s" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "刪除檔案 %s" #: ulng.rsmsglogerror msgid "Error: " msgstr "錯誤:" #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "解壓縮檔案 %s" #: ulng.rsmsgloginfo msgid "Info: " msgstr "資訊: " #: ulng.rsmsgloglink msgid "Create link %s" msgstr "建立連結 %s" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "建立資料夾 %s" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "移動檔案 %s" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "壓縮檔案 %s" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "移除資料夾 %s" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "完成:" #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "建立符號連結 %s" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "測試檔案完整性 %s" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "手動加入常用路徑" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "手動編輯常用路徑" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "輸入名稱和路徑 (格式名稱=路徑):" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "主要密碼" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "請輸入主要密碼:" #: ulng.rsmsgnewfile msgid "New file" msgstr "新增檔案" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "將解壓縮下一個分卷檔" #: ulng.rsmsgnofiles msgid "No files" msgstr "沒有檔案" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "尚未選擇檔案" #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "目標磁碟沒有足夠的可用空間, 仍要繼續嗎?" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "目標磁碟沒有足夠的可用空間, 是否要重試?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "無法刪除檔案 %s" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "未實現" #: ulng.rsmsgpassword msgid "Password:" msgstr "密碼:" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "密碼不相同!" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "請輸入密碼:" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "密碼 (防火牆):" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "請再次輸入密碼來驗證" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "加入【%s】(&A)" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "設置 (&C)" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "移除【%s】(&D)" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "預先配置檔【%s】已存在。是否要覆蓋?" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "你確定要重新命名/移動這 %d 個被選擇的檔案/資料夾嗎?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "你確定要重新命名/移動所選擇的【%s】嗎?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "請重新啟動 Double Commander 以套用變更" #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "選擇: %s / %sB | 檔案: %d / %d | 資料夾: %d / %d" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "請僅選擇驗證碼檔案!" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "請選擇下一個分卷檔位置" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "設置磁碟標籤" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "重新命名分頁" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "新的分頁名稱:" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "目標路徑:" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "選單項目新標題:" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "選擇了太多檔案。" #: ulng.rsmsgurl #, fuzzy msgid "URL:" msgstr "網址:" #: ulng.rsmsgusername msgid "User name:" msgstr "使用者名稱:" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "使用者名稱 (防火牆):" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "磁碟標籤:" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "請輸入磁碟大小:" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "你確定要抹除這 %d 個被選擇的檔案/資料夾嗎?" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "你確定要抹除所選擇的【%s】嗎?" #: ulng.rsmulrenfilenamestylelist #, fuzzy #| msgid "No change;UPPERCASE;lowercase;First Char Big;" msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "不變更;大寫;小寫;首字大寫;每個單字首字大寫;" #: ulng.rsoperaborted msgid "Aborted" msgstr "已放棄" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "正在計算驗證碼" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "正在【%s】計算驗證碼" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "正在計算【%s】的驗證碼" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "正在計算" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "正在計算【%s】" #: ulng.rsopercombining msgid "Joining" msgstr "正在合併" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "正在【%s】合併檔案到【%s】" #: ulng.rsopercopying msgid "Copying" msgstr "正在複製" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "正在從【%s】複製到【%s】" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "正在複製【%s】到【%s】" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "正在建立資料夾" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "正在建立資料夾【%s】" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "正在刪除" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "正在【%s】刪除" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "正在刪除【%s】" #: ulng.rsoperexecuting msgid "Executing" msgstr "正在執行" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "正在執行【%s】" #: ulng.rsoperextracting msgid "Extracting" msgstr "正在解壓縮" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "正在從【%s】解壓縮到【%s】" #: ulng.rsoperfinished msgid "Finished" msgstr "已完成" #: ulng.rsoperlisting msgid "Listing" msgstr "正在列表" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "正在列表【%s】" #: ulng.rsopermoving msgid "Moving" msgstr "正在移動" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "正在從【%s】移動到【%s】" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "正在移動【%s】到【%s】" #: ulng.rsopernotstarted msgid "Not started" msgstr "尚未開始" #: ulng.rsoperpacking msgid "Packing" msgstr "正在壓縮" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "正在從【%s】壓縮到【%s】" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "正在壓縮【%s】到【%s】" #: ulng.rsoperpaused msgid "Paused" msgstr "已暫停" #: ulng.rsoperpausing msgid "Pausing" msgstr "正在暫停" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "已佇列" #: ulng.rsoperrunning msgid "Running" msgstr "正在執行" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "正在設置內容" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "正在【%s】設置內容" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "正在設置【%s】的內容" #: ulng.rsopersplitting msgid "Splitting" msgstr "正在分離" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "正在分離【%s】到【%s】" #: ulng.rsoperstarting msgid "Starting" msgstr "正在開始" #: ulng.rsoperstopped msgid "Stopped" msgstr "已停止" #: ulng.rsoperstopping msgid "Stopping" msgstr "正在停止" #: ulng.rsopertesting msgid "Testing" msgstr "正在測試" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "正在【%s】測試" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "正在測試【%s】" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "正在校驗驗證碼" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "正在【%s】校驗驗證碼" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "正在校驗【%s】的驗證碼" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "正在等待存取來源檔案" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "正在等待使用者回應" #: ulng.rsoperwiping msgid "Wiping" msgstr "正在抹除" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "正在【%s】抹除" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "正在抹除【%s】" #: ulng.rsoperworking msgid "Working" msgstr "正在處理" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "刪除:" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "解壓縮但不含路徑:" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "格式分析模式:" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "ID:" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "ID 位置 :" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "ID 搜尋範圍:" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "參數" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "密碼詢問字串:" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "建立自解壓縮檔:" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "測試:" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "壓縮類型名稱:" #: ulng.rsoptarchivevalue #, fuzzy msgid "Value" msgstr "值" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "【%s】插件關聯:" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "第一個;最後一個;" #: ulng.rsoptdisable msgid "Disable" msgstr "停用" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "啟用" #: ulng.rsoptenterext msgid "Enter extension" msgstr "輸入副檔名" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "指標" #: ulng.rsoptexamplemark msgid "Mark" msgstr "標記" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "反白 + 指標" #: ulng.rsoptexampletext msgid "Text" msgstr "文字" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "分離視窗;最小化分離視窗;操作面板" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "浮動;B;K;M;G" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "快速鍵 %s 將登錄給 cm_Delete 使用,它會視這個設定的狀態而執行相反的刪除動作。" #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "替 %s 加入熱鍵" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "加入快速鍵" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "無法設置快速鍵" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "變更快速鍵" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "指令" #: ulng.rsopthotkeysdeletetrashcanoverrides msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "cm_Delete 的快速鍵 %s 已有覆蓋此設定的參數。你要變更這個參數以使用這個通用設定嗎?" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "cm_Delete 的快速鍵 %s 需要變更參數來符合快速鍵 %s。你要變更它嗎?" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "描述" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "替 %s 編輯熱鍵" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "修正參數" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "熱鍵" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "熱鍵" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "<無>" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "參數" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "設置快速鍵以刪除檔案" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "要讓這個設定利用快速鍵 %s 執行運作, 快速鍵 %s 必需分配給 cm_Delete, 但是它已經分配給 %s 使用。你要變更它嗎?" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "cm_Delete 的快速鍵 %s 是序列快速鍵, 所以無法判斷要將哪個熱鍵用來分配使用。這個設定可能無法正常運作。" #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "快速鍵已使用" #: ulng.rsopthotkeysshortcutusedtext1 msgid "Shortcut %s is already used." msgstr "快速鍵 %s 已被使用。" #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "你要將它變更給 %s 使用嗎?" #: ulng.rsopthotkeysusedby msgid "used for %s in %s" msgstr "已被 %s 使用在 %s" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "已使用在這個指令但使用不同的參數" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "壓縮工具" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "自動更新" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "行為" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "顏色" #: ulng.rsoptionseditorcolumnsview msgctxt "ulng.rsoptionseditorcolumnsview" msgid "Columns" msgstr "欄位" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "設定檔" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "自訂欄位" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "拖曳" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "磁碟清單按鈕" #: ulng.rsoptionseditorfileoperations msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "檔案操作" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "檔案面板" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "檔案檢視" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "檔案類型" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "資料夾分頁" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "字型" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "語法高亮" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "熱鍵" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "圖示" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "忽略清單" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "按鍵" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "語言" #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "佈置" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "記錄" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "雜項" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "滑鼠" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "插件" #: ulng.rsoptionseditorquicksearch #| msgid "Quick search" msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "快速搜尋/篩選" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "終端機" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "工具列" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "工具" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "提示工具" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "無;指令行;快速搜尋;快速篩選" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "左鍵;右鍵;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "位於檔案清單頂端;位於資料夾後面 (若資料夾排序在檔案前);位於排序位置;位於檔案清單底部" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "插件 %s 已經分配給下列副檔名:" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "啟動" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "檔案名稱" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "名稱" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "登錄對象" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "大小寫視為相異 (&S);大小寫視為相同 (&I)" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "檔案 (&F);資料夾 (&R);檔案及資料夾 (&N)" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "當不在焦點時隱藏篩選面板 (&H)" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "不區分大小寫;根據區域設定 (aAbBcC);先大寫再小寫 (ABCabc)" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "依名稱排序並優先顯示;依類似檔案排序並優先顯示;依類似檔案排序" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "依字母順序排序, 考慮重音;依自然順序排序, 考慮字母和數字" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "頂端;底部;" #: ulng.rsopttoolbarbuttontype msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "分隔線 (&E);內部指令 (&R);外部指令 (&X);選單 (&U)" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "不要改變位置;使用和插入新檔案同樣的設定;移到排序位置" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "檔案: %d, 資料夾: %d" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "無法變更【%s】的存取權限" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "無法變更【%s】的擁有者" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "檔案" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "資料夾" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "命名管道" #: ulng.rspropsno msgid "No" msgstr "否" #: ulng.rspropssocket msgid "Socket" msgstr "Socket" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "特殊區塊裝置" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "特殊字元裝置" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "符號連結" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "未知類型" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "是 (%S)" #: ulng.rssearchresult msgid "Search result" msgstr "搜尋結果" #: ulng.rssearchtemplateunnamed msgid "" msgstr "<未命名範本>" #: ulng.rsselectdir msgid "Select a directory" msgstr "選擇資料夾" #: ulng.rsshowhelpfor msgid "&Show help for %s" msgstr "顯示 %s 的說明 (&S)" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "Bytes" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "Gigabytes" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "Kilobytes" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "Megabytes" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "Terabytes" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "檔案: %d, 資料夾: %d, 大小: %s (%s 位元組)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "無法建立目標資料夾!" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "無效的檔案大小格式!" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "無法分割這個檔案!" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "分割數量大於 100! 是否要繼續?" #: ulng.rssplitseldir msgid "Select directory:" msgstr "選擇資料夾:" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "建立符號連結發生錯誤。" #: ulng.rssyndefaulttext msgctxt "ulng.rssyndefaulttext" msgid "Default text" msgstr "預設文字" #: ulng.rssynlangplaintext msgctxt "ulng.rssynlangplaintext" msgid "Plain text" msgstr "純文字" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "天" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "小時" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "分" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "月" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "秒" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "週" #: ulng.rstimeunityear msgid "Year(s)" msgstr "年" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "比對器" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "編輯器" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "開啟比對器發生錯誤" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "開啟編輯器發生錯誤" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "開啟終端機發生錯誤" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "開啟檢視器發生錯誤" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "終端機" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "檢視器" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "請回報這個錯誤到問題追蹤系統並包含你對下面這個檔案所進行的操作描述:%s請按下 %s 繼續或 %s 放棄這個程式。" #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "網路" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "Double Commander 內部檢視器" #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "正在編碼" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "沒有找到 %s!" doublecmd-0.5.8/language/doublecmd.sk.po0000644000175000017500000065103312250633131017207 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.5 alpha\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-05-08 18:30+0300\n" "PO-Revision-Date: 2012-05-08 18:30+0100\n" "Last-Translator: Rastislav Vojtek \n" "Language-Team: Slovenský \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Slovak\n" "X-Poedit-Country: SLOVAKIA\n" "X-Poedit-Bookmarks: -1,-1,-1,-1,-1,-1,-1,444,-1,-1\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "Všetko" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "Všetko" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "Všetko" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "Všetko" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "Všetko" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "Všetko" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "Všetko" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "Zrušiť" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "..." #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "->" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfcolumnssetconf.btnprev.caption #, fuzzy msgid "<-" msgstr "<-" #: tfcolumnssetconf.caption #, fuzzy msgid "Configure custom columns view" msgstr "Konfigurovať vlastný pohľad (stĺpce)" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "Pozadie:" #: tfcolumnssetconf.cbcursorborder.caption msgid "Cursor border" msgstr "Rámček kurzoru" #: tfcolumnssetconf.cbovercolor.caption #, fuzzy msgid "Allow Overcolor" msgstr "Povoliť Overcolor" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "Použiť vlastný font a farbu" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "Farba písma:" #: tfcolumnssetconf.label3.caption #, fuzzy #| msgid "Configure view nr:" msgctxt "TFCOLUMNSSETCONF.LABEL3.CAPTION" msgid "Font:" msgstr "Konfigurácia pohľadu č.:" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "Veľkosť:" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "Pozadie 2:" #: tfcolumnssetconf.lblconfigviewnr.caption #, fuzzy #| msgid "Configure view nr:" msgctxt "TFCOLUMNSSETCONF.LBLCONFIGVIEWNR.CAPTION" msgid "Configure view nr:" msgstr "Konfigurácia pohľadu č.:" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "Farba kurzoru:" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "Text kurzoru:" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "Farba označených:" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "Meno:" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "Pridať stĺpec" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "Nastavenie stĺpcov:" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "Náhľad" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "R" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption #, fuzzy #| msgid "Check free space" msgid "C&heck free space" msgstr "Kontrolovať voľné miesto" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption msgid "Cop&y attributes" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption msgid "Copy o&wnership" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption msgid "Copy d&ate/time" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption #, fuzzy #| msgid "Correct links" msgid "Correct lin&ks" msgstr "Opraviť odkazy" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "Zahodiť znak len na čítanie" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption msgid "E&xclude empty directories" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption #, fuzzy #| msgid "Follow links" msgid "Fo&llow links" msgstr "Nasledovať odkazy" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "" #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption #, fuzzy #| msgid "When directory exists" msgid "When dir&ectory exists" msgstr "Ak zložka existuje" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption #, fuzzy #| msgid "When file exists" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "Ak súbor existuje" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption msgid "When ca&nnot set property" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "" #: tfrmabout.btnclose.caption msgctxt "tfrmabout.btnclose.caption" msgid "&Close" msgstr "&Zavrieť" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "O programe" #: tfrmabout.lblbuild.caption msgid "Build" msgstr "Build" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "Free Pascal" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "Domovská stránka:" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "http://doublecmd.sourceforge.net" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "Lazarus" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "Revízia" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption msgid "Version" msgstr "Verzia" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "Zvoľte atribúty" #: tfrmattributesedit.cbarchive.caption #, fuzzy #| msgid "Archive" msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "Archivovať" #: tfrmattributesedit.cbcompressed.caption #, fuzzy #| msgid "Compressed" msgid "Co&mpressed" msgstr "Komprimovaný" #: tfrmattributesedit.cbdirectory.caption #, fuzzy #| msgid "Directory" msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "Zložka" #: tfrmattributesedit.cbencrypted.caption #, fuzzy #| msgid "Encrypted" msgid "&Encrypted" msgstr "Šifrovaný" #: tfrmattributesedit.cbhidden.caption #, fuzzy #| msgid "Hidden" msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "Skrytý" #: tfrmattributesedit.cbreadonly.caption #, fuzzy #| msgid "Read only" msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "Len na čítanie" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmattributesedit.cbsparse.caption #, fuzzy #| msgid "Sparse" msgid "S&parse" msgstr "Riedky" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Sticky" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmattributesedit.cbsymlink.caption #, fuzzy #| msgid "Symlink" msgid "&Symlink" msgstr "Symbolický link" #: tfrmattributesedit.cbsystem.caption #, fuzzy #| msgid "System" msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "Systémový" #: tfrmattributesedit.cbtemporary.caption #, fuzzy #| msgid "Temporary" msgid "&Temporary" msgstr "Dočasný" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "NTFS atribúty" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "Všeobecné atribúty" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bitov:" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Skupina" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Ostatní" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Vlastník" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "Spustiť" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "Čítanie" #: tfrmattributesedit.lbltextattrs.caption #, fuzzy #| msgid "As text:" msgid "As te&xt:" msgstr "Ako text" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "Zápis" #: tfrmchecksumcalc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmchecksumcalc.caption msgctxt "tfrmchecksumcalc.caption" msgid "Calculate check sum..." msgstr "Výpočet kontrolného súčtu..." #: tfrmchecksumcalc.cbseparatefile.caption #, fuzzy #| msgid "Create separate checksum file for each file" msgid "C&reate separate checksum file for each file" msgstr "Vytvoriť samostatný MD5/SHA1 pre každý súbor" #: tfrmchecksumcalc.lblsaveto.caption #, fuzzy #| msgid "Save check sum file(s) to:" msgid "&Save check sum file(s) to:" msgstr "Uložiť súbor(y) s kontrolným súčtom do:" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zavrieť" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "Overiť kontrolný súčet..." #: tfrmconnectionmanager.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "Pridať" #: tfrmconnectionmanager.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmconnectionmanager.btnconnect.caption #, fuzzy #| msgid "Connect" msgid "C&onnect" msgstr "Pripojiť" #: tfrmconnectionmanager.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Vymazať" #: tfrmconnectionmanager.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Upraviť" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "Správca pripojení" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "Pripojiť k:" #: tfrmcopydlg.btnaddtoqueue.caption msgid "A&dd To Queue" msgstr "" #: tfrmcopydlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "tfrmcopydlg.btncreatespecialqueue.caption" msgid "..." msgstr "..." #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "Voľby" #: tfrmcopydlg.btnsaveoptions.caption #, fuzzy #| msgid "Save these options as default" msgid "Sa&ve these options as default" msgstr "Uložiť tieto voľby ako východzie" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "Kopírovať súbor(y)" #: tfrmdescredit.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "Komentár k súboru/zložke" #: tfrmdescredit.lbleditcommentfor.caption #, fuzzy #| msgid "Edit comment for:" msgid "E&dit comment for:" msgstr "Upraviť komentár k:" #: tfrmdescredit.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "Kódovanie:" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "O programe" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "Automaticky porovnať" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "Binárny mód" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "Zrušiť" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "Zrušiť" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "Kopírovať blok vpravo" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "Kopírovať blok vpravo" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "Kopírovať blok vľavo" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "Kopírovať blok vľavo" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Kopírovať" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Vystrihnúť" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Vymazať" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Vložiť" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Opakovať" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "Vybr&ať všetko" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Späť" #: tfrmdiffer.actexit.caption msgctxt "tfrmdiffer.actexit.caption" msgid "E&xit" msgstr "&Koniec" #: tfrmdiffer.actfirstdifference.caption msgctxt "tfrmdiffer.actfirstdifference.caption" msgid "First Difference" msgstr "Prvý rozdiel" #: tfrmdiffer.actfirstdifference.hint msgctxt "tfrmdiffer.actfirstdifference.hint" msgid "First Difference" msgstr "Prvý rozdiel" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "Ignorovať veľkosť písmien" #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "Ignorovať prázdne znaky" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "Skrolovať bez prerušenia" #: tfrmdiffer.actlastdifference.caption msgctxt "tfrmdiffer.actlastdifference.caption" msgid "Last Difference" msgstr "Posledný rozdiel" #: tfrmdiffer.actlastdifference.hint msgctxt "tfrmdiffer.actlastdifference.hint" msgid "Last Difference" msgstr "Posledný rozdiel" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "Rozdiely riadkov" #: tfrmdiffer.actnextdifference.caption msgctxt "tfrmdiffer.actnextdifference.caption" msgid "Next Difference" msgstr "Ďalší rozdiel" #: tfrmdiffer.actnextdifference.hint msgctxt "tfrmdiffer.actnextdifference.hint" msgid "Next Difference" msgstr "Ďalší rozdiel" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "Otvoriť ľavý" #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "Otvoriť pravý" #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "Vyfarbiť pozadie" #: tfrmdiffer.actprevdifference.caption msgctxt "tfrmdiffer.actprevdifference.caption" msgid "Previous Difference" msgstr "Predchádzajúci rozdiel" #: tfrmdiffer.actprevdifference.hint msgctxt "tfrmdiffer.actprevdifference.hint" msgid "Previous Difference" msgstr "Predchádzajúci rozdiel" #: tfrmdiffer.actreload.caption #, fuzzy #| msgid "Reload" msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "Obnoviť" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "Obnoviť" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "Uložiť" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "Uložiť" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "Uložiť ako" #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "Uložiť ako" #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "Uložiť ľavý" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "Uložiť ľavý" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "Uložiť ľavý ako..." #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "Uložiť ľavý ako..." #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "Uložiť pravý" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "Uložiť pravý" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "Uložiť pravý ako..." #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "Uložiť pravý ako..." #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "Porovnať" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "Porovnať" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "Kódovanie" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "Kódovanie" #: tfrmdiffer.caption msgctxt "tfrmdiffer.caption" msgid "Compare files" msgstr "Porovnať súbory" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miencodingleft.caption #, fuzzy #| msgid "Left" msgid "&Left" msgstr "Vľavo" #: tfrmdiffer.miencodingright.caption #, fuzzy #| msgid "Right" msgid "&Right" msgstr "Vpravo" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "&Akcie" #: tfrmdiffer.mnuedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "Upraviť" #: tfrmdiffer.mnuencoding.caption #, fuzzy #| msgid "Encoding" msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "Kódovanie" #: tfrmdiffer.mnufile.caption #, fuzzy #| msgid "File" msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "Súbor" #: tfrmdiffer.mnuoptions.caption #, fuzzy #| msgid "Options" msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "&Nastavenia" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "" #: tfrmedithotkey.btncancel.caption msgctxt "tfrmedithotkey.btncancel.caption" msgid "&Cancel" msgstr "&Zrušiť" #: tfrmedithotkey.btnok.caption msgctxt "tfrmedithotkey.btnok.caption" msgid "&OK" msgstr "&OK" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "" #: tfrmedithotkey.cghkcontrols.caption msgid "Only for these controls" msgstr "" #: tfrmedithotkey.lblparameters.caption msgid "&Parameters (each in a separate line):" msgstr "" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "O programe" #: tfrmeditor.actabout.hint msgctxt "tfrmeditor.actabout.hint" msgid "About" msgstr "O programe" #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "&Konfigurácia" #: tfrmeditor.actconfhigh.hint msgctxt "tfrmeditor.actconfhigh.hint" msgid "Configuration" msgstr "Umiestnenie konfigurácie" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Kopírovať" #: tfrmeditor.acteditcopy.hint msgctxt "tfrmeditor.acteditcopy.hint" msgid "Copy" msgstr "Kopírovať" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Vystrihnúť" #: tfrmeditor.acteditcut.hint msgctxt "tfrmeditor.acteditcut.hint" msgid "Cut" msgstr "Vystrihnúť" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Vymazať" #: tfrmeditor.acteditdelete.hint msgctxt "tfrmeditor.acteditdelete.hint" msgid "Delete" msgstr "Vymazať" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "&Hľadať" #: tfrmeditor.acteditfind.hint msgctxt "tfrmeditor.acteditfind.hint" msgid "Find" msgstr "Hľadať" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "Hľadať ďalší" #: tfrmeditor.acteditfindnext.hint msgctxt "tfrmeditor.acteditfindnext.hint" msgid "Find next" msgstr "Hľadať ďalší" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcr.hint msgctxt "tfrmeditor.acteditlineendcr.hint" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "tfrmeditor.acteditlineendcrlf.hint" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditlineendlf.hint msgctxt "tfrmeditor.acteditlineendlf.hint" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Vložiť" #: tfrmeditor.acteditpaste.hint msgctxt "tfrmeditor.acteditpaste.hint" msgid "Paste" msgstr "Vložiť" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Opakovať" #: tfrmeditor.acteditredo.hint msgctxt "tfrmeditor.acteditredo.hint" msgid "Redo" msgstr "Opakovať" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "&Nahradiť" #: tfrmeditor.acteditrplc.hint msgctxt "tfrmeditor.acteditrplc.hint" msgid "Replace" msgstr "Nahradiť" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "Vybrať &Všetko" #: tfrmeditor.acteditselectall.hint msgctxt "tfrmeditor.acteditselectall.hint" msgid "Select All" msgstr "Vybrať všetko" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Späť" #: tfrmeditor.acteditundo.hint msgctxt "tfrmeditor.acteditundo.hint" msgid "Undo" msgstr "Zpäť" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "&Zavrieť" #: tfrmeditor.actfileclose.hint msgctxt "tfrmeditor.actfileclose.hint" msgid "Close" msgstr "Zavrieť" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "&Koniec" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "&Nový" #: tfrmeditor.actfilenew.hint msgctxt "tfrmeditor.actfilenew.hint" msgid "New" msgstr "Nový" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "&Otvoriť" #: tfrmeditor.actfileopen.hint msgctxt "tfrmeditor.actfileopen.hint" msgid "Open" msgstr "Otvoriť" #: tfrmeditor.actfilesave.caption #, fuzzy msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "&Uložiť" #: tfrmeditor.actfilesave.hint msgctxt "tfrmeditor.actfilesave.hint" msgid "Save" msgstr "Uložiť" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "Uložiť &ako.." #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "&Uložiť Všetko" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "" #: tfrmeditor.caption msgctxt "TFRMEDITOR.CAPTION" msgid "Editor" msgstr "Editor" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "&Pomoc" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Editovať" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "Kó&dovanie" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "Otvoriť ako" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "Uložiť ako" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "&Súbor" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "Zvýrazňovanie syntaxu" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n5.caption msgctxt "tfrmeditor.n5.caption" msgid "-" msgstr "-" #: tfrmeditsearchreplace.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "&Rozlišovať veľkosť" #: tfrmeditsearchreplace.cbsearchfromcursor.caption #, fuzzy #| msgid "Search from &caret" msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "Hľadať od &striešky" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "&Regulárne výrazy" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "Len vybraný &text" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "&Len celé slová" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "Voľba" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "&Nahradiť týmto:" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "&Vyhľadať:" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "Smer" #: tfrmextractdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmextractdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Pomoc" #: tfrmextractdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmextractdlg.caption msgctxt "tfrmextractdlg.caption" msgid "Unpack files" msgstr "Rozbaliť súbory" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "&Rozbaliť aj s cestou, ak je uložená" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*.*" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "Rozbaliť do oddelených po&dzložiek (podľa názvu archívu)" #: tfrmextractdlg.cboverwrite.caption #, fuzzy #| msgid "&Overwrite existing files" msgid "O&verwrite existing files" msgstr "&Prepísať existujúca súbory" #: tfrmextractdlg.lblextractto.caption #, fuzzy #| msgid "To the directory:" msgid "To the &directory:" msgstr "Rozbaliť súbory do:" #: tfrmextractdlg.lblfilemask.caption #, fuzzy #| msgid "Extract files matching file mask:" msgid "&Extract files matching file mask:" msgstr "&Súbory na rozbalenie:" #: tfrmextractdlg.lblpassword.caption #, fuzzy #| msgid "Password for encrypted files:" msgid "&Password for encrypted files:" msgstr "Heslo pre šifrované súbory:" #: tfrmfileassoc.btnaddact.caption #, fuzzy msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "Pridať" #: tfrmfileassoc.btnaddext.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "Pridať" #: tfrmfileassoc.btnaddnewtype.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "Pridať" #: tfrmfileassoc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmfileassoc.btndownact.caption #, fuzzy #| msgid "Down" msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "Dolov" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmfileassoc.btnremoveact.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "Odstrániť" #: tfrmfileassoc.btnremoveext.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "Odstrániť" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "X" #: tfrmfileassoc.btnremovetype.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "Odstrániť" #: tfrmfileassoc.btnrenametype.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "Premenovať" #: tfrmfileassoc.btnupact.caption #, fuzzy #| msgid "Up" msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "Hore" #: tfrmfileassoc.caption msgid "File associations" msgstr "Asociácie súborov" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "Akcie" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "Prípony" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "Typy súborov" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "Ikona" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "Akcia:" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "&Príkaz:" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "Editovať" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "Otvoriť v editore" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "Názov súboru" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "Cesta k súboru" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "Úplná cesta" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "Získať výstup príkazu" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "Otvoriť" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "Spustiť v terminále" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "Otvoriť vo VFS" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "Zobraziť" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "Otvoriť v prezerači" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zavrieť" #: tfrmfileexecuteyourself.caption msgctxt "tfrmfileexecuteyourself.caption" msgid "Wait..." msgstr "Čakaj..." #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "Meno súboru" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "Od:" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "Kliknite na Zavrieť, až keď bude možné zmazať dočasné súbory." #: tfrmfileop.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "Od:" #: tfrmfileop.lblto.caption msgid "To:" msgstr "Do:" #: tfrmfileproperties.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Zavrieť" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "" #: tfrmfileproperties.caption msgctxt "tfrmfileproperties.caption" msgid "Properties" msgstr "Vlastnosti" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Sticky" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "Vlastník" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bitov:" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Skupina" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Ostatní" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Vlastník" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmfileproperties.lblattrtextstr.caption #, fuzzy #| msgid "Representation in text:" msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Textovo:" #: tfrmfileproperties.lblcontains.caption msgctxt "tfrmfileproperties.lblcontains.caption" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Spustiť" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "Názov súboru" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "Meno:" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "Názov súboru" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "Cesta:" #: tfrmfileproperties.lblgroupstr.caption #, fuzzy #| msgid "Group" msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "Skupina" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "Posledný prístup:" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "Posledná zmena:" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "Posledná zmena stavu:" #: tfrmfileproperties.lbloctal.caption #, fuzzy msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Číselne:" #: tfrmfileproperties.lblownerstr.caption #, fuzzy #| msgid "Owner" msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "Vlastník" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Čítanie" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "Veľkosť:" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption #, fuzzy #| msgid "Symlink:" msgid "Symlink to:" msgstr "Zástupca:" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption #, fuzzy msgid "Type:" msgstr "Typ:" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Zápis" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atribúty" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "Vlastnosti" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "Prid&ať" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "&Pomoc" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zavrieť" #: tfrmfinddlg.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmfinddlg.btnedit.caption" msgid "&Edit" msgstr "Upraviť" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "&Choď na súbor" #: tfrmfinddlg.btnlastsearch.caption msgid "&Last search" msgstr "" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "&Nové hľadanie" #: tfrmfinddlg.btnsavetemplate.caption #, fuzzy #| msgid "Save" msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "Uložiť" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "&Vymazať" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "&Načítať" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "&Uložiť" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption msgid "Sa&ve with \"Start in directory\"" msgstr "" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "" #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "&Start" #: tfrmfinddlg.btnstop.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "Zrušiť" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "&Zobraziť" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "Výsledok do &okna" #: tfrmfinddlg.caption msgctxt "tfrmfinddlg.caption" msgid "Find files" msgstr "Hľadať súbory" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "Rozlišovať veľkosť" #: tfrmfinddlg.cbdatefrom.caption #, fuzzy #| msgid "Date From:" msgid "&Date from:" msgstr "Dátum od:" #: tfrmfinddlg.cbdateto.caption #, fuzzy #| msgid "Date To:" msgid "Dat&e to:" msgstr "Dátum do:" #: tfrmfinddlg.cbfilesizefrom.caption #, fuzzy #| msgid "Size from:" msgid "S&ize from:" msgstr "Veľkosť od:" #: tfrmfinddlg.cbfilesizeto.caption #, fuzzy #| msgid "Size to:" msgid "Si&ze to:" msgstr "Veľkosť do:" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "Vyhľadať &text" #: tfrmfinddlg.cbfollowsymlinks.caption #, fuzzy #| msgid "Follow symlinks" msgctxt "tfrmfinddlg.cbfollowsymlinks.caption" msgid "Follow s&ymlinks" msgstr "Nasledovať symlinky" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "Hľadať súbory NE&obsahujúce text" #: tfrmfinddlg.cbnotolderthan.caption #, fuzzy #| msgid "Not older than:" msgid "N&ot older than:" msgstr "Nie staršie ako:" #: tfrmfinddlg.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name " msgid "Searc&h for part of file name" msgstr "Hľadať časť mena" #: tfrmfinddlg.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "&Regulárne výrazy" #: tfrmfinddlg.cbreplacetext.caption #, fuzzy #| msgid "Re&place text" msgid "Re&place by" msgstr "Nahradiť text" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "" #: tfrmfinddlg.cbtimefrom.caption #, fuzzy #| msgid "Time from:" msgid "&Time from:" msgstr "Čas od:" #: tfrmfinddlg.cbtimeto.caption #, fuzzy #| msgid "Time to:" msgid "Ti&me to:" msgstr "Čas do:" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "Použiť vyhľadávací zásuvný modul:" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption msgctxt "tfrmfinddlg.gbdirectories.caption" msgid "Directories" msgstr "" #: tfrmfinddlg.gbfiles.caption msgctxt "tfrmfinddlg.gbfiles.caption" msgid "Files" msgstr "" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "Vyhľadávať v obsahu" #: tfrmfinddlg.lblattributes.caption msgid "Attri&butes" msgstr "" #: tfrmfinddlg.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "Kódovanie:" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "&Súborová maska" #: tfrmfinddlg.lblfindpathstart.caption #, fuzzy #| msgid "&Start in directory" msgid "Start in &directory" msgstr "&Adresárová maska" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "Prehľadať po&dzložky:" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "&Predchádzajúce hľadania:" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "Odobrať zo zoznamu" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "Ukázať všetky nájdené položky" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "Zobraziť v prehliadači" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "Rozšírené" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "Načítať/Uložiť" #: tfrmfinddlg.tsplugins.caption msgctxt "tfrmfinddlg.tsplugins.caption" msgid "Plugins" msgstr "Zásuvné moduly" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "Výsledky" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "Normálne" #: tfrmfindview.btnclose.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmfindview.btnfind.caption #, fuzzy #| msgid "Find" msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "Hľadať" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "Hľadať" #: tfrmfindview.cbcasesens.caption #, fuzzy #| msgid "Case sensitive" msgid "C&ase sensitive" msgstr "Rozlišovat veľkosť" #: tfrmhardlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmhardlink.caption #, fuzzy #| msgid "Create hardlink" msgid "Create hard link" msgstr "Vytvoriť hardlink" #: tfrmhardlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Cieľ (kam bude odkaz ukazovať)" #: tfrmhardlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Názov odkazu" #: tfrmhotdir.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "Pridať" #: tfrmhotdir.btnaddman.caption #, fuzzy #| msgid "Add manually" msgid "Add &manually" msgstr "Pridať ručne" #: tfrmhotdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmhotdir.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Vymazať" #: tfrmhotdir.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Upraviť" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "Rýchle zložky" #: tfrmlinker.btnexit.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "Koniec" #: tfrmlinker.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "..." #: tfrmlinker.caption msgctxt "tfrmlinker.caption" msgid "Linker" msgstr "Spojovač súborov" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "Uložiť do..." #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "Položka" #: tfrmlinker.lblfilename.caption #, fuzzy #| msgid "File name" msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "Názov súboru" #: tfrmlinker.spbtndel.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "Vymazať" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "Vymazať" #: tfrmlinker.spbtndown.caption #, fuzzy #| msgid "Down" msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "Dolu" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "Dolu" #: tfrmlinker.spbtnup.caption #, fuzzy #| msgid "Up" msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "Hore" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "Hore" #: tfrmmain.actabout.caption #, fuzzy #| msgid "About" msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "O programe" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "Pridať názov súboru do príkazového riadku" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "Uložiť cestu a názov súboru do príkazového riadku" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "Kopírovať cestu do príkazového riadku" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "" #: tfrmmain.actcalculatespace.caption #, fuzzy #| msgid "Calculate &Occupied Space..." msgid "Calculate &Occupied Space" msgstr "Vypočítať &obsadené miesto..." #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "Zmeniť zložku" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "Ísť do nadradenej zložky" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "Ísť do koreňovej zložky" #: tfrmmain.actchecksumcalc.caption #, fuzzy #| msgid "Calculate check sum..." msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "Vytvoriť kontrolný súčet..." #: tfrmmain.actchecksumverify.caption #, fuzzy #| msgid "Verify check sum..." msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "Overiť kontrolný súčet..." #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "Vymazať log súbor" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "Vymazať okno logu" #: tfrmmain.actclosealltabs.caption #, fuzzy #| msgid "Remove &All Tabs" msgctxt "tfrmmain.actclosealltabs.caption" msgid "Close &All Tabs" msgstr "Vymazať záložky" #: tfrmmain.actclosetab.caption #, fuzzy #| msgid "&Remove Tab" msgctxt "tfrmmain.actclosetab.caption" msgid "&Close Tab" msgstr "Vymazať záložku" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "Porovnať po&dľa obsahu" #: tfrmmain.actcomparedirectories.caption msgctxt "tfrmmain.actcomparedirectories.caption" msgid "Compare Directories" msgstr "" #: tfrmmain.actcomparedirectories.hint msgctxt "tfrmmain.actcomparedirectories.hint" msgid "Compare Directories" msgstr "" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "Zobraziť kontextové menu" #: tfrmmain.actcopy.caption #, fuzzy #| msgid "Copy F5" msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "Kopírova" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "Kopírovať mená, vrátane cesty, do schránky" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "Kopírovať mená súborov do schránky" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "Kopírovať súbory bez potvrdzovania" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "Kopírovať do rovnakého panelu" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "Kopírovať" #: tfrmmain.actcountdircontent.caption #, fuzzy #| msgid "Sho&w occupied space" msgid "Sho&w Occupied Space" msgstr "Zo&braziť obsadené miesto" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "Vystrihnúť" #: tfrmmain.actdelete.caption #, fuzzy #| msgid "Delete F8" msgctxt "tfrmmain.actdelete.caption" msgid "Delete" msgstr "Vymazať" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "História zložiek" #: tfrmmain.actdirhotlist.caption #, fuzzy #| msgid "Directory &hotlist" msgid "Directory &Hotlist" msgstr "&Rýchle zložky" #: tfrmmain.actedit.caption #, fuzzy #| msgid "Edit F4" msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "Editova" #: tfrmmain.acteditcomment.caption #, fuzzy #| msgid "Edit comment..." msgid "Edit Co&mment..." msgstr "Upraviť komentár..." #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "Editovať nový súbor" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "Upraviť cestu nad zoznamom súborov" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "Zameniť &panely" #: tfrmmain.actexit.caption #, fuzzy #| msgid "Exit" msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "Koniec" #: tfrmmain.actextractfiles.caption #, fuzzy #| msgid "Extract files..." msgid "&Extract Files..." msgstr "Rozbaliť súbory..." #: tfrmmain.actfileassoc.caption #, fuzzy #| msgid "File &associations..." msgid "File &Associations..." msgstr "Asociácia súborov..." #: tfrmmain.actfilelinker.caption #, fuzzy #| msgid "Link files" msgid "Com&bine Files..." msgstr "Spojiť súbory" #: tfrmmain.actfileproperties.caption #, fuzzy #| msgid "Show file properties" msgid "Show &File Properties" msgstr "Zobraziť vlastnosti súboru" #: tfrmmain.actfilespliter.caption #, fuzzy #| msgid "Split file" msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "Rozdeliť súbor..." #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "Aktivovať príkazový riadok" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "Umiestniť kurzor na prvý súbor zoznamu" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "Umiestniť kurzor na posledný súbor zoznamu" #: tfrmmain.acthardlink.caption #, fuzzy #| msgid "Create hard link..." msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "Vytvoriť &HardLink..." #: tfrmmain.acthelpindex.caption #, fuzzy #| msgid "Contents" msgid "&Contents" msgstr "Obsah" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "Režim s horizontálnymi panelmi" #: tfrmmain.actkeyboard.caption #, fuzzy #| msgid "Keyboard" msgid "&Keyboard" msgstr "Klávesnica" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "Ľavý &= Pravý" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "Otvoriť ľavý zoznam diskov" #: tfrmmain.actloadselectionfromclip.caption msgid "Load Selection from Clip&board" msgstr "Nahrať vý&ber zo schránky" #: tfrmmain.actloadselectionfromfile.caption msgid "&Load Selection from File..." msgstr "Nahrať výber zo súboru..." #: tfrmmain.actmakedir.caption #, fuzzy #| msgid "MakeDir F7" msgid "MakeDir" msgstr "Nová zložka" #: tfrmmain.actmarkcurrentextension.caption #, fuzzy #| msgid "Select all with same extension" msgid "Select All with the Same E&xtension" msgstr "Vybrať všetko s rovnakou príponou" #: tfrmmain.actmarkinvert.caption #, fuzzy #| msgid "Invert Selections" msgid "&Invert Selection" msgstr "Invertovať výber" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "&Vybrať všetko" #: tfrmmain.actmarkminus.caption #, fuzzy #| msgid "Unselect a group" msgid "Unselect a Gro&up..." msgstr "Zrušiť výber skupiny" #: tfrmmain.actmarkplus.caption #, fuzzy #| msgid "Select a group" msgid "Select a &Group..." msgstr "Výber skupiny" #: tfrmmain.actmarkunmarkall.caption #, fuzzy #| msgid "Unselect All" msgid "&Unselect All" msgstr "Zrušiť výber" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "Minimalizovať okno" #: tfrmmain.actmultirename.caption #, fuzzy #| msgid "Multi Rename Tool" msgid "Multi &Rename Tool" msgstr "Nástroj pre hromadné premenovanie" #: tfrmmain.actnetworkconnect.caption msgid "Network &Connect..." msgstr "Pripojiť sieťovú zložku" #: tfrmmain.actnetworkdisconnect.caption msgid "Network &Disconnect" msgstr "Odpojiť sieťovú zložku" #: tfrmmain.actnetworkquickconnect.caption msgid "Network &Quick Connect..." msgstr "Rýchle pripojiť zo siete" #: tfrmmain.actnewtab.caption #, fuzzy #| msgid "&New tab" msgid "&New Tab" msgstr "Nová záložka" #: tfrmmain.actnexttab.caption #, fuzzy #| msgid "Switch to nex&t tab" msgid "Switch to Nex&t Tab" msgstr "Prepnúť do novej záložky" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "Otvoriť" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "Zkúsiť otvoriť archív" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "Otvoriť súbor lišty" #: tfrmmain.actopendirinnewtab.caption #, fuzzy #| msgid "Open &folder in new tab" msgid "Open &Folder in a New Tab" msgstr "Otvoriť zložku v novej záložke" #: tfrmmain.actopenvirtualfilesystemlist.caption #, fuzzy #| msgid "Open VFS List" msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "Otvoriť VFS zoznam" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "Konzola operácií" #: tfrmmain.actoptions.caption #, fuzzy #| msgid "Options..." msgid "&Options..." msgstr "Nastavenia..." #: tfrmmain.actpackfiles.caption #, fuzzy #| msgid "Pack files..." msgid "&Pack Files..." msgstr "Zabaliť súbory..." #: tfrmmain.actpanelssplitterperpos.caption #, fuzzy msgid "Set splitter position" msgstr "Nastaviť pozíciu deliacej čiary" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "Vložiť" #: tfrmmain.actprevtab.caption #, fuzzy #| msgid "Switch to &previous tab" msgid "Switch to &Previous Tab" msgstr "Prepnúť do predchádzajúcej záložky" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "Rýchly filter" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "Rýchle hľadanie" #: tfrmmain.actquickview.caption msgid "&Quick View Panel" msgstr "Panel rýchleho náhľadu" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "&Obnoviť" #: tfrmmain.actrename.caption #, fuzzy #| msgid "Move F6" msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "Presun" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "Presunúť/premenovať súbory bez potvrdzovania" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "Premenovať" #: tfrmmain.actrenametab.caption #, fuzzy #| msgid "Re&name Tab" msgid "&Rename Tab" msgstr "Preme&novať záložku" #: tfrmmain.actrestoreselection.caption msgid "&Restore Selection" msgstr "Obnoviť výbe&r" #: tfrmmain.actreverseorder.caption #, fuzzy #| msgid "Reverse order" msgid "Re&verse Order" msgstr "Obrátené poradie" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "Pravý &= Ľavý" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "Otvoriť pravý zoznam diskov" #: tfrmmain.actrunterm.caption #, fuzzy #| msgid "Run Term" msgid "Run &Terminal" msgstr "Spustiť terminál" #: tfrmmain.actsaveselection.caption msgid "Sa&ve Selection" msgstr "Uložiť výber" #: tfrmmain.actsaveselectiontofile.caption msgid "Save S&election to File..." msgstr "Uložiť výber do &súboru..." #: tfrmmain.actsearch.caption #, fuzzy #| msgid "&Search" msgid "&Search..." msgstr "&Hľadať" #: tfrmmain.actsetfileproperties.caption msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "Zmena atribútov" #: tfrmmain.actsettaboptiondirsinnewtab.caption msgid "Locked with Directories Opened in New &Tabs" msgstr "Uzamknuté; zložky otvárať v nových záložkách" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "&Normálne" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "Uzamknuté" #: tfrmmain.actsettaboptionpathresets.caption #, fuzzy #| msgid "Locked, but &directory changes allowed" msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "Uzamknuté; zmena zložky povolená" #: tfrmmain.actshellexecute.caption msgctxt "tfrmmain.actshellexecute.caption" msgid "Open" msgstr "Otvoriť" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "Zobraziť menu tlačítok" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "Zobraziť históriu príkazového riadku" #: tfrmmain.actshowmainmenu.caption #, fuzzy #| msgid "Menu F9" msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "Menu F9" #: tfrmmain.actshowsysfiles.caption #, fuzzy #| msgid "Show hidden/system files" msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "Zobraziť skryté/systémové súbory" #: tfrmmain.actsortbyattr.caption #, fuzzy #| msgid "Sort by attrib" msgid "Sort by &Attributes" msgstr "Triediť podľa atribútov" #: tfrmmain.actsortbydate.caption #, fuzzy #| msgid "Sort by date" msgid "Sort by &Date" msgstr "Triediť podľa dátumu" #: tfrmmain.actsortbyext.caption #, fuzzy #| msgid "Sort by extension" msgid "Sort by &Extension" msgstr "Triediť podľa prípony" #: tfrmmain.actsortbyname.caption #, fuzzy #| msgid "Sort by name" msgid "Sort by &Name" msgstr "Triediť podľa názvu" #: tfrmmain.actsortbysize.caption #, fuzzy #| msgid "Sort by size" msgid "Sort by &Size" msgstr "Triediť podľa veľkosti" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "Povoliť/zakázať zoznam súborov, ktoré sa nemajú zobrazovať" #: tfrmmain.actsymlink.caption #, fuzzy #| msgid "Create symbolic link..." msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "Vytvoriť Sym&Link..." #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "Cieľ &= Zdroj" #: tfrmmain.acttestarchive.caption msgid "&Test Archive(s)" msgstr "Testovať archív(y)" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "Preniesť zložku pod kurzorom do ľavého okna" #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "Preniesť zložku pod kurzorom do pravého okna" #: tfrmmain.actunmarkcurrentextension.caption #, fuzzy #| msgid "Unselect all with same extension" msgid "Unselect All with the Same Ex&tension" msgstr "Zrušiť výber súborov s rovnakou príponou" #: tfrmmain.actview.caption #, fuzzy #| msgid "View F3" msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "Zobrazi" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "Zobraziť históriu navštívených ciest" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "Ísť na ďalšiu položku v histórii" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "Ísť na predchádzajúcu položku v histórii" #: tfrmmain.actvisithomepage.caption #, fuzzy #| msgid "&Visit Double Commander Web Site" msgid "&Visit Double Commander Website" msgstr "Navštíviť domovskú stránku" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "Bezpečne zmazať" #: tfrmmain.btnf10.caption #, fuzzy #| msgid "Exit F10" msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "Koniec" #: tfrmmain.btnf8.caption msgctxt "tfrmmain.btnf8.caption" msgid "Delete" msgstr "Vymazať" #: tfrmmain.btnf9.caption #, fuzzy #| msgid "Terminal F9" msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "Terminál" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint #, fuzzy msgid "Directory hotlist" msgstr "Hotlist zložiek" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "<" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "Zobraziť aktuálnu zložku pravého panelu v ľavom panely" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnlefthome.hint msgid "Go to home directory" msgstr "Ísť do domovskej zložky" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgid "Go to root directory" msgstr "Ísť do koreňovej zložky" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgid "Go to parent directory" msgstr "Ísť do nadradenej zložky" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr ">" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "Zobraziť aktuálnu zložku ľavého panelu v pravom panely" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "tfrmmain.caption" msgid "Double Commander" msgstr "Double Commander" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "Cesta" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "&20/80" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "&30/70" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "&40/60" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "&50/50" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "&60/40" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "&70/30" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "&80/20" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "Zrušiť" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "Kopírovať..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "Vytvoriť odkaz..." #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline33.caption msgctxt "tfrmmain.miline33.caption" msgid "-" msgstr "-" #: tfrmmain.miline37.caption msgctxt "tfrmmain.miline37.caption" msgid "-" msgstr "-" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "-" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "Vyčistiť" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "Kopírovat" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "Skryť" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "Vybrať všetko" #: tfrmmain.mimove.caption #, fuzzy msgid "Move..." msgstr "Presunúť..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "Vytvoriť symlink..." #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "Možnosti záložiek" #: tfrmmain.mitrayiconexit.caption #, fuzzy #| msgid "Exit" msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "Koniec" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "Obnoviť" #: tfrmmain.mnualloperpause.caption msgctxt "tfrmmain.mnualloperpause.caption" msgid "||" msgstr "||" #: tfrmmain.mnualloperstart.caption msgctxt "tfrmmain.mnualloperstart.caption" msgid "Start" msgstr "Štart" #: tfrmmain.mnualloperstop.caption msgctxt "tfrmmain.mnualloperstop.caption" msgid "Cancel" msgstr "Zrušiť" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "&Príkazy" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "&Konfigurácia" #: tfrmmain.mnufiles.caption #, fuzzy #| msgid "Files" msgid "&Files" msgstr "&Súbory" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "&Pomoc" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "&Označiť" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "Sieť" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "&Zobraziť" #: tfrmmain.mnutaboptions.caption #, fuzzy #| msgid "Options" msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "&Nastavenia" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "&Záložky" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "CD" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "Kopírovať" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "Vystrihnúť" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "Vymazať" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "Upraviť" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "Vložiť" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmmaskinputdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmmaskinputdlg.btndefinetemplate.caption #, fuzzy #| msgid "Define..." msgid "&Define..." msgstr "Definovať..." #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmmaskinputdlg.lblsearchtemplate.caption #, fuzzy #| msgid "Or select predefined selection type:" msgid "O&r select predefined selection type:" msgstr "Alebo zvoľte preddefinovaný typ výberu:" #: tfrmmkdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmmkdir.caption msgid "Create new directory" msgstr "Vytvoriť novú zložku" #: tfrmmkdir.lblmakedir.caption #, fuzzy #| msgid "Input new directory name:" msgid "&Input new directory name:" msgstr "Zadajte nový názov zložky:" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "" #: tfrmmodview.caption msgctxt "tfrmmodview.caption" msgid "New Size" msgstr "Nová veľkosť" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "Výška" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgid "2" msgstr "2" #: tfrmmodview.lblpath3.caption msgid "3" msgstr "3" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "4" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "5" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "Kvalita JPG kompresie" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "Šírka" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "BMP" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "ICO" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "JPG" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "PNG" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "PNM" #: tfrmmodview.teheight.text msgid "Height" msgstr "Výška" #: tfrmmodview.tequality.text msgid "80" msgstr "80" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "Šírka" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zavrieť" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "&Vymazať" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "Nahrať (Ctrl+&L)" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "Premenovať (Ctrl+&R)" #: tfrmmultirename.btnrestore.caption #, fuzzy #| msgid "Reset all" msgid "Reset &all" msgstr "Obnoviť všetko" #: tfrmmultirename.btnsavepreset.caption #, fuzzy msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "Uložiť (Ctrl+&S)" #: tfrmmultirename.caption msgctxt "tfrmmultirename.caption" msgid "MultiRename" msgstr "Hromadné premenovanie" #: tfrmmultirename.cblog.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "Log" #: tfrmmultirename.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "&Regulárne výrazy" #: tfrmmultirename.cbusesubs.caption #, fuzzy #| msgid "Use substitution" msgid "&Use substitution" msgstr "Použiť substitúciu" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption #, fuzzy #| msgid "[E]xtension" msgid "[E] Extension" msgstr "[E]Prípona" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "Počítadlo" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "Vyhľadať && Nahradiť" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "Log výsledku" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "Maska" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "Predvoľby" #: tfrmmultirename.lbext.caption #, fuzzy #| msgid "Extension" msgid "&Extension" msgstr "Prípona" #: tfrmmultirename.lbfind.caption #, fuzzy #| msgid "Find..." msgid "&Find..." msgstr "Hľadať..." #: tfrmmultirename.lbinterval.caption #, fuzzy #| msgid "Interval" msgid "&Interval" msgstr "Interval" #: tfrmmultirename.lbname.caption #, fuzzy #| msgid "File Name" msgid "File &Name" msgstr "Názov súboru" #: tfrmmultirename.lbreplace.caption #, fuzzy #| msgid "Replace..." msgid "Re&place..." msgstr "Nahradiť..." #: tfrmmultirename.lbstnb.caption #, fuzzy #| msgid "Start Number" msgid "S&tart Number" msgstr "Číslovať od" #: tfrmmultirename.lbwidth.caption #, fuzzy #| msgid "Width" msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "Šírka" #: tfrmmultirename.micounter.caption #, fuzzy #| msgid "[C]ounter" msgid "[C] Counter" msgstr "[C] Počítadlo" #: tfrmmultirename.miday.caption #, fuzzy #| msgid "[D]ay" msgid "[D] Day" msgstr "[D] Deň" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "[DD] Deň (2 číslice)" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "[DDD] Deň týždňa (skrátene, t.j. \"pon\")" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "[DDD] Deň týždňa (celý, t.j. \"pondelok\")" #: tfrmmultirename.miextensionx.caption #, fuzzy #| msgid "[Ex]xtension" msgid "[Ex] Character at position x" msgstr "[Ex] Znak na pozícii x" #: tfrmmultirename.miextensionxx.caption #, fuzzy #| msgid "[Ex:x]xtension" msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:x] Znaky od pozície x do y" #: tfrmmultirename.mihour.caption #, fuzzy #| msgid "[h]our" msgid "[h] Hour" msgstr "[h] Hodina" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "[hh] Hodina (2 číslice)" #: tfrmmultirename.miminute.caption #, fuzzy #| msgid "Mi[n]ute" msgid "[n] Minute" msgstr "[n] Minúta" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "[nn] Minúta (2 číslice)" #: tfrmmultirename.mimonth.caption #, fuzzy #| msgid "[M]onth" msgid "[M] Month" msgstr "[M] Mesiac" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "[MM] Mesiac (2 číslice)" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "[MMM] Meno mesiaca (krátko, t.j. \"jan\")" #: tfrmmultirename.mimonth3.caption #, fuzzy #| msgid "[MMMM] Month name (long, e.g. \"january\")" msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "[MMMM] Meno mesiaca (celé, t.j. \"január\")" #: tfrmmultirename.miname.caption #, fuzzy #| msgid "[N]ame" msgid "[N] Name" msgstr "[N]Názov" #: tfrmmultirename.minamex.caption #, fuzzy #| msgid "[Nx]ame" msgid "[Nx] Character at position x" msgstr "[Nx] Znak na pozícii x" #: tfrmmultirename.minamexx.caption #, fuzzy #| msgid "[Nx:x]ame" msgid "[Nx:y] Characters from position x to y" msgstr "[Nx:y] Znaky od pozície x do y" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "Čas..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "Prípona..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "Názov..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "Zásuvný modul" #: tfrmmultirename.misecond.caption #, fuzzy #| msgid "[s]econd" msgid "[s] Second" msgstr "[s] Sekunda" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "[ss] Sekundy (2 číslice)" #: tfrmmultirename.miyear.caption #, fuzzy #| msgid "[Y] Year" msgid "[Y] Year (2 digits)" msgstr "[Y] Rok (2 číslice)" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "[YYYY] Rok (4 číslice)" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "tfrmmultirename.stringgrid.columns[0].title.caption" msgid "Old File Name" msgstr "Staré meno súboru" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "tfrmmultirename.stringgrid.columns[1].title.caption" msgid "New File Name" msgstr "Nové meno súboru" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "tfrmmultirename.stringgrid.columns[2].title.caption" msgid "File Path" msgstr "Cesta k súboru" #: tfrmopenwith.caption msgid "Choose an application" msgstr "" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "" #: tfrmoptions.btnapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "Použiť" #: tfrmoptions.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmoptions.caption msgctxt "tfrmoptions.caption" msgid "Options" msgstr "Nastavenia" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "" #: tfrmoptionsarchivers.btnautoconfig.caption #, fuzzy #| msgid "Auto Configure" msgctxt "tfrmoptionsarchivers.btnautoconfig.caption" msgid "A&uto Configure" msgstr "Automaticky" #: tfrmoptionsarchivers.btnmultiarcadd.caption #, fuzzy #| msgid "Add" msgctxt "tfrmoptionsarchivers.btnmultiarcadd.caption" msgid "A&dd" msgstr "Pridať" #: tfrmoptionsarchivers.btnmultiarcapply.caption #, fuzzy #| msgid "Apply" msgctxt "tfrmoptionsarchivers.btnmultiarcapply.caption" msgid "A&pply" msgstr "Použiť" #: tfrmoptionsarchivers.btnmultiarcdelete.caption #, fuzzy #| msgid "Delete" msgctxt "tfrmoptionsarchivers.btnmultiarcdelete.caption" msgid "D&elete" msgstr "Vymazať" #: tfrmoptionsarchivers.btnmultiarcrename.caption #, fuzzy #| msgid "Rename" msgctxt "tfrmoptionsarchivers.btnmultiarcrename.caption" msgid "&Rename" msgstr "Premenovať" #: tfrmoptionsarchivers.chkmultiarcdebug.caption #, fuzzy #| msgid "Debug mode" msgctxt "tfrmoptionsarchivers.chkmultiarcdebug.caption" msgid "De&bug mode" msgstr "Režim ladenia" #: tfrmoptionsarchivers.chkmultiarcenabled.caption #, fuzzy #| msgid "Enabled" msgctxt "tfrmoptionsarchivers.chkmultiarcenabled.caption" msgid "E&nabled" msgstr "Povolené" #: tfrmoptionsarchivers.chkmultiarcoutput.caption #, fuzzy #| msgid "Show console output" msgctxt "tfrmoptionsarchivers.chkmultiarcoutput.caption" msgid "S&how console output" msgstr "Ukázať výstup konzoly" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "tfrmoptionsarchivers.gbarchiveroptions.caption" msgid "Options" msgstr "Nastavenia" #: tfrmoptionsarchivers.lblarchiveadd.caption #, fuzzy #| msgid "Add:" msgctxt "tfrmoptionsarchivers.lblarchiveadd.caption" msgid "Add&ing:" msgstr "Pridať:" #: tfrmoptionsarchivers.lblarchiveextension.caption #, fuzzy #| msgid "Extension:" msgctxt "tfrmoptionsarchivers.lblarchiveextension.caption" msgid "E&xtension:" msgstr "Prípona:" #: tfrmoptionsarchivers.lblarchiveextract.caption #, fuzzy #| msgid "Extract:" msgctxt "tfrmoptionsarchivers.lblarchiveextract.caption" msgid "Ex&tract:" msgstr "Rozbaliť:" #: tfrmoptionsarchivers.lblarchivelist.caption #, fuzzy #| msgid "List:" msgctxt "tfrmoptionsarchivers.lblarchivelist.caption" msgid "&List:" msgstr "Zoznam:" #: tfrmoptionsarchivers.lblarchivelistend.caption #, fuzzy #| msgid "Listing finish (optional):" msgctxt "tfrmoptionsarchivers.lblarchivelistend.caption" msgid "Listing &finish (optional):" msgstr "Päta výpisu (nepovinné)" #: tfrmoptionsarchivers.lblarchivelistformat.caption #, fuzzy #| msgid "Listing format:" msgctxt "tfrmoptionsarchivers.lblarchivelistformat.caption" msgid "Listing for&mat:" msgstr "Formát výpisu" #: tfrmoptionsarchivers.lblarchiveliststart.caption #, fuzzy #| msgid "Listing start (optional):" msgctxt "tfrmoptionsarchivers.lblarchiveliststart.caption" msgid "Listin&g start (optional):" msgstr "Hlavička výpisu (nepovinné)" #: tfrmoptionsarchivers.lblarchiver.caption #, fuzzy #| msgid "Archiver:" msgctxt "tfrmoptionsarchivers.lblarchiver.caption" msgid "Arc&hiver:" msgstr "Archivátor:" #: tfrmoptionsarchivers.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "tfrmoptionsarchivers.lbldescription.caption" msgid "De&scription:" msgstr "Popis:" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "tfrmoptionsarchivers.tbarchiveradditional.caption" msgid "Additional" msgstr "Rozšírené" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "tfrmoptionsarchivers.tbarchivergeneral.caption" msgid "General" msgstr "Hlavné" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption #, fuzzy #| msgid "Also when &size, date, or attributes change" msgctxt "tfrmoptionsautorefresh.cbwatchattributeschange.caption" msgid "When &size, date or attributes change" msgstr "Tiež pri zmene &veľkosti, dátumu alebo atribútov" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "tfrmoptionsautorefresh.cbwatchexcludedirs.caption" msgid "For the following &paths and their subdirectories:" msgstr "Pre nasledujúce cesty a podzložky" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption #, fuzzy #| msgid "When files are &created, deleted or renamed" msgctxt "tfrmoptionsautorefresh.cbwatchfilenamechange.caption" msgid "When &files are created, deleted or renamed" msgstr "Aktualizovať zoznam pri vy&tvorení, zmazaní alebo premenovaní" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption #, fuzzy #| msgid "Don't &react to updates while in the background" msgctxt "tfrmoptionsautorefresh.cbwatchonlyforeground.caption" msgid "When application is in the &background" msgstr "Pokiaľ je aplikácia na pozadí" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "tfrmoptionsautorefresh.gbautorefreshdisable.caption" msgid "Disable auto-refresh" msgstr "Zakázať automatické obnovovanie" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "tfrmoptionsautorefresh.gbautorefreshenable.caption" msgid "Refresh file list" msgstr "Obnoviť zoznam súborov" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption #, fuzzy #| msgid "Always show tray icon" msgctxt "tfrmoptionsbehavior.cbalwaysshowtrayicon.caption" msgid "Al&ways show tray icon" msgstr "Vždy zobraziť ikonu v oznamovacej oblasti" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption msgid "Automatically &hide unmounted devices" msgstr "" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "tfrmoptionsbehavior.cbminimizetotray.caption" msgid "Mo&ve icon to system tray when minimized" msgstr "Minimalizovať do oznamovacej oblasti (System Tray)" #: tfrmoptionsbehavior.cbonlyonce.caption #, fuzzy #| msgid "Allow only one copy of DC at a time" msgctxt "tfrmoptionsbehavior.cbonlyonce.caption" msgid "A&llow only one copy of DC at a time" msgstr "Povoliť beh len jednej inštancie DC" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "" #: tfrmoptionsbehavior.lbldrivesblacklist.caption msgid "Drives &blacklist" msgstr "" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption #, fuzzy #| msgid "Cut text to column width" msgctxt "tfrmoptionscolumnsview.cbcuttexttocolwidth.caption" msgid "Cut &text to column width" msgstr "Orezať text na šírku stĺpca" #: tfrmoptionscolumnsview.cbgridhorzline.caption #, fuzzy #| msgid "Horizontal lines" msgctxt "tfrmoptionscolumnsview.cbgridhorzline.caption" msgid "&Horizontal lines" msgstr "Horizontálne čiary" #: tfrmoptionscolumnsview.cbgridvertline.caption #, fuzzy #| msgid "Vertical lines" msgctxt "tfrmoptionscolumnsview.cbgridvertline.caption" msgid "&Vertical lines" msgstr "Vertikálne čiary" #: tfrmoptionscolumnsview.chkautofillcolumns.caption #, fuzzy #| msgid "Auto fill columns" msgctxt "tfrmoptionscolumnsview.chkautofillcolumns.caption" msgid "A&uto fill columns" msgstr "Automaticky vyplniť stĺpce" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "" #: tfrmoptionscolumnsview.lblautosizecolumn.caption #, fuzzy #| msgid "Auto size column:" msgctxt "tfrmoptionscolumnsview.lblautosizecolumn.caption" msgid "Auto si&ze column:" msgstr "Automatická veľkosť stĺpcov" #: tfrmoptionsconfiguration.btnconfigapply.caption #, fuzzy #| msgid "Apply" msgctxt "tfrmoptionsconfiguration.btnconfigapply.caption" msgid "A&pply" msgstr "Použiť" #: tfrmoptionsconfiguration.btnconfigedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmoptionsconfiguration.btnconfigedit.caption" msgid "&Edit" msgstr "Upraviť" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption #, fuzzy #| msgid "Command line history" msgctxt "tfrmoptionsconfiguration.cbcmdlinehistory.caption" msgid "Co&mmand line history" msgstr "História príkazového riadku" #: tfrmoptionsconfiguration.cbdirhistory.caption #, fuzzy #| msgid "Directory history" msgctxt "tfrmoptionsconfiguration.cbdirhistory.caption" msgid "&Directory history" msgstr "História zložiek" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption #, fuzzy #| msgid "File mask history" msgctxt "tfrmoptionsconfiguration.cbfilemaskhistory.caption" msgid "&File mask history" msgstr "História použitých masiek" #: tfrmoptionsconfiguration.chksaveconfiguration.caption #, fuzzy #| msgid "Save configuration" msgctxt "tfrmoptionsconfiguration.chksaveconfiguration.caption" msgid "Sa&ve configuration" msgstr "Uložiť nastavenie" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption #, fuzzy #| msgid "Search/Replace history" msgctxt "tfrmoptionsconfiguration.chksearchreplacehistory.caption" msgid "Searc&h/Replace history" msgstr "Hľadať/nahradiť v histórii" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgctxt "tfrmoptionsconfiguration.gblocconfigfiles.caption" msgid "Location of configuration files" msgstr "Umiestnenie konfiguračných súborov" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgctxt "tfrmoptionsconfiguration.gbsaveonexit.caption" msgid "Save on exit" msgstr "Uložiť pri ukončení" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgctxt "tfrmoptionsconfiguration.lblcmdlineconfigdir.caption" msgid "Set on command line" msgstr "Nastaviť v príkazovom riadku" #: tfrmoptionsconfiguration.rbprogramdir.caption #, fuzzy #| msgid "Program directory (portable version)" msgctxt "tfrmoptionsconfiguration.rbprogramdir.caption" msgid "P&rogram directory (portable version)" msgstr "Zložka programu (\"portable\" verzia)" #: tfrmoptionsconfiguration.rbuserhomedir.caption #, fuzzy #| msgid "User home directory" msgctxt "tfrmoptionsconfiguration.rbuserhomedir.caption" msgid "&User home directory" msgstr "Domovská zložka užívateľa" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption #, fuzzy #| msgid "Copy" msgctxt "tfrmoptionscustomcolumns.btncopycolumnsset.caption" msgid "C&opy" msgstr "Kopírovať" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption #, fuzzy #| msgid "Delete" msgctxt "tfrmoptionscustomcolumns.btndelcolumnsset.caption" msgid "&Delete" msgstr "Vymazať" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmoptionscustomcolumns.btneditcolumnsset.caption" msgid "&Edit" msgstr "Upraviť" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "tfrmoptionscustomcolumns.btnnewcolumnsset.caption" msgid "&New" msgstr "&Nový" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "tfrmoptionscustomcolumns.cbbfilesystem.text" msgid "General" msgstr "Hlavné" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption #, fuzzy #| msgid "Configure columns for file system:" msgctxt "tfrmoptionscustomcolumns.lblconfigcolumns.caption" msgid "Con&figure columns for file system:" msgstr "Konfigurácia stĺpcov pre systém súborov:" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption msgid "&Show confirmation dialog after drop" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption msgid "Show &file system" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption msgid "Show fr&ee space" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption msgid "Show &label" msgstr "" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "" #: tfrmoptionseditorcolors.backgroundlabel.caption msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "" #: tfrmoptionseditorcolors.foregroundlabel.caption msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption msgid "&Text-mark" msgstr "" #: tfrmoptionseditorcolors.tbtnglobal.caption msgid "Use (and edit) &global scheme settings" msgstr "" #: tfrmoptionseditorcolors.tbtnlocal.caption msgid "Use &local scheme settings" msgstr "" #: tfrmoptionseditorcolors.textboldcheckbox.caption msgid "&Bold" msgstr "" #: tfrmoptionseditorcolors.textboldradioinvert.caption msgctxt "tfrmoptionseditorcolors.textboldradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textboldradiooff.caption msgctxt "tfrmoptionseditorcolors.textboldradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textboldradioon.caption msgctxt "tfrmoptionseditorcolors.textboldradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textitaliccheckbox.caption msgid "&Italic" msgstr "" #: tfrmoptionseditorcolors.textitalicradioinvert.caption msgctxt "tfrmoptionseditorcolors.textitalicradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textitalicradiooff.caption msgctxt "tfrmoptionseditorcolors.textitalicradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textitalicradioon.caption msgctxt "tfrmoptionseditorcolors.textitalicradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption msgid "&Strike Out" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption msgid "&Underline" msgstr "" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textunderlineradiooff.caption msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textunderlineradioon.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "" #: tfrmoptionsfileoperations.cbdeletetotrash.caption #, fuzzy #| msgid "Delete to recycle bin (Shift key reverses this setting)" msgctxt "tfrmoptionsfileoperations.cbdeletetotrash.caption" msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "&F8/Del presúva do koša (Shift=zmazať ihneď)" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "tfrmoptionsfileoperations.cbdropreadonlyflag.caption" msgid "D&rop readonly flag" msgstr "Zahodiť znak len na čítanie" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name" msgctxt "tfrmoptionsfileoperations.cbpartialnamesearch.caption" msgid "&Search for part of file name" msgstr "Hľadať časť mena súboru" #: tfrmoptionsfileoperations.cbprocesscomments.caption #, fuzzy #| msgid "Process comments with files/folders" msgctxt "tfrmoptionsfileoperations.cbprocesscomments.caption" msgid "&Process comments with files/folders" msgstr "Spracovať komentáre so zložkami/súbormi" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption msgid "Select &file name without extension when renaming" msgstr "" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption #, fuzzy #| msgid "Show tab select panel in copy/move dialog" msgctxt "tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption" msgid "Sho&w tab select panel in copy/move dialog" msgstr "Zobraziť výber záložky v dialógu \"kopírovať/presunúť\"" #: tfrmoptionsfileoperations.cbskipfileoperror.caption #, fuzzy #| msgid "Skip file operations errors and write them to log window" msgctxt "tfrmoptionsfileoperations.cbskipfileoperror.caption" msgid "S&kip file operations errors and write them to log window" msgstr "Preskočiť chyby súborových operácií a len ich zapísať do okna logov" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "tfrmoptionsfileoperations.gbfilesearch.caption" msgid "File search" msgstr "Hľadanie súborov" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "" #: tfrmoptionsfileoperations.lblbuffersize.caption msgid "&Buffer size for file operations (in KB):" msgstr "" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "" #: tfrmoptionsfileoperations.lblprogresskind.caption msgid "Show operations progress &initially in" msgstr "" #: tfrmoptionsfileoperations.lblwipepassnumber.caption msgid "&Number of wipe passes:" msgstr "" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption #, fuzzy #| msgid "Use memory mapping for search text in files" msgctxt "tfrmoptionsfileoperations.rbusemmapinsearch.caption" msgid "Use memory mapping for search te&xt in files" msgstr "Použíť mapovanie pamäte pre hľadanie textu v súboroch" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption #, fuzzy #| msgid "Use stream for search text in files" msgctxt "tfrmoptionsfileoperations.rbusestreaminsearch.caption" msgid "&Use stream for search text in files" msgstr "Použiť stream pre hľadanie textu v súboroch" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnbackcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "tfrmoptionsfilepanelscolors.btnbackcolor2.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btncursorcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "tfrmoptionsfilepanelscolors.btncursortext.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnforecolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnindbackcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnindcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnmarkcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption #, fuzzy #| msgid "Use Frame Cursor" msgctxt "tfrmoptionsfilepanelscolors.cbbuseframecursor.caption" msgid "Use &Frame Cursor" msgstr "Použiť rámčekový kurzor" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption msgid "Use &Gradient Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption #, fuzzy #| msgid "Use Inverted Selection" msgctxt "tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption" msgid "U&se Inverted Selection" msgstr "Použiť inverzný výber" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgid "Drive Free Space Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "tfrmoptionsfilepanelscolors.gbexample.caption" msgid "Example" msgstr "Vzorka" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption msgid "Bac&kground:" msgstr "" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption #, fuzzy #| msgid "Background 2:" msgctxt "tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption" msgid "Backg&round 2:" msgstr "Pozadie 2:" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption #, fuzzy #| msgid "Cursor Color:" msgctxt "tfrmoptionsfilepanelscolors.lblcursorcolor.caption" msgid "C&ursor Color:" msgstr "Farba kurzoru:" #: tfrmoptionsfilepanelscolors.lblcursortext.caption #, fuzzy #| msgid "Cursor Text:" msgctxt "tfrmoptionsfilepanelscolors.lblcursortext.caption" msgid "Cursor Te&xt:" msgstr "Text kurzoru:" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption #, fuzzy #| msgid "Brightness level of inactive panel" msgctxt "tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption" msgid "&Brightness level of inactive panel" msgstr "Úroveň jasu neaktívneho panela" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption msgid "In&dicator Back Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblindcolor.caption msgid "&Indicator Fore Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption #, fuzzy #| msgid "Mark Color:" msgctxt "tfrmoptionsfilepanelscolors.lblmarkcolor.caption" msgid "&Mark Color:" msgstr "Farba označenia:" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption #, fuzzy #| msgid "Text Color:" msgctxt "tfrmoptionsfilepanelscolors.lbltextcolor.caption" msgid "T&ext Color:" msgstr "Farba písma:" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption msgid "Do&n't load file list until a tab is activated" msgstr "" #: tfrmoptionsfilesviews.cbdirbrackets.caption #, fuzzy #| msgid "Show square brackets around directories" msgctxt "tfrmoptionsfilesviews.cbdirbrackets.caption" msgid "S&how square brackets around directories" msgstr "Názvy zložiek v hranatých zátvorkách" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption msgid "Hi&ghlight new and updated files" msgstr "" #: tfrmoptionsfilesviews.cblistfilesinthread.caption #, fuzzy #| msgid "Load file list in separate thread" msgctxt "tfrmoptionsfilesviews.cblistfilesinthread.caption" msgid "Load &file list in separate thread" msgstr "Nahrať zoznam súborov v samostatnom vlákne" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption #, fuzzy #| msgid "Load icons after file list" msgctxt "tfrmoptionsfilesviews.cbloadiconsseparately.caption" msgid "Load icons af&ter file list" msgstr "Nahrať ikony po zozname súborov" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption #, fuzzy #| msgid "Show system and hidden files" msgctxt "tfrmoptionsfilesviews.cbshowsystemfiles.caption" msgid "Show s&ystem and hidden files" msgstr "Zobraziť skryté/systémové súbory" #: tfrmoptionsfilesviews.cbspacemovesdown.caption #, fuzzy #| msgid "When selecting files with , move down to next file (as with )" msgctxt "tfrmoptionsfilesviews.cbspacemovesdown.caption" msgid "&When selecting files with , move down to next file (as with )" msgstr "Pri výbere medzerníkom posunúť kurzor dolu, ako pri výbere klávesou Insert" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "" #: tfrmoptionsfilesviews.gbsorting.caption msgctxt "tfrmoptionsfilesviews.gbsorting.caption" msgid "Sorting" msgstr "Triedenie" #: tfrmoptionsfilesviews.lblcasesensitivity.caption msgid "Case s&ensitivity:" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeformat.caption #, fuzzy #| msgid "Date and time format:" msgctxt "tfrmoptionsfilesviews.lbldatetimeformat.caption" msgid "&Date and time format:" msgstr "Formát dátumu a času:" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "" #: tfrmoptionsfilesviews.lblnewfilesposition.caption msgid "&Insert new files" msgstr "" #: tfrmoptionsfilesviews.lblsortfoldermode.caption msgid "So&rting directories:" msgstr "" #: tfrmoptionsfilesviews.lblsortmethod.caption #, fuzzy #| msgid "Sort &method:" msgctxt "tfrmoptionsfilesviews.lblsortmethod.caption" msgid "&Sort method:" msgstr "Metóda triedenia:" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption msgid "&Move updated files" msgstr "" #: tfrmoptionsfiletypescolors.btnaddcategory.caption #, fuzzy #| msgid "Add" msgctxt "tfrmoptionsfiletypescolors.btnaddcategory.caption" msgid "A&dd" msgstr "Pridať" #: tfrmoptionsfiletypescolors.btnapplycategory.caption #, fuzzy #| msgid "Apply" msgctxt "tfrmoptionsfiletypescolors.btnapplycategory.caption" msgid "A&pply" msgstr "Použiť" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "tfrmoptionsfiletypescolors.btncategorycolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption #, fuzzy #| msgid "Delete" msgctxt "tfrmoptionsfiletypescolors.btndeletecategory.caption" msgid "D&elete" msgstr "Vymazať" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "tfrmoptionsfiletypescolors.btnsearchtemplate.hint" msgid "Template..." msgstr "Šablóny..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption msgid "File types colors (sort by drag&&drop)" msgstr "" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption #, fuzzy #| msgid "Category attributes:" msgctxt "tfrmoptionsfiletypescolors.lblcategoryattr.caption" msgid "Category a&ttributes:" msgstr "Atribúty kategórií:" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption #, fuzzy #| msgid "Category color:" msgctxt "tfrmoptionsfiletypescolors.lblcategorycolor.caption" msgid "Category co&lor:" msgstr "Farba kategórie:" #: tfrmoptionsfiletypescolors.lblcategorymask.caption #, fuzzy #| msgid "Category mask:" msgctxt "tfrmoptionsfiletypescolors.lblcategorymask.caption" msgid "Category &mask:" msgstr "Maska kategórie:" #: tfrmoptionsfiletypescolors.lblcategoryname.caption #, fuzzy #| msgid "Category name:" msgctxt "tfrmoptionsfiletypescolors.lblcategoryname.caption" msgid "Category &name:" msgstr "Názov kategórie:" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "tfrmoptionsfonts.btnseleditfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "tfrmoptionsfonts.btnsellogfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "tfrmoptionsfonts.btnselmainfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "tfrmoptionsfonts.btnselviewerbookfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "tfrmoptionsfonts.btnselviewfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.lbleditorfont.caption #, fuzzy #| msgid "Editor font" msgctxt "tfrmoptionsfonts.lbleditorfont.caption" msgid "&Editor font" msgstr "Písmo editora" #: tfrmoptionsfonts.lbllogfont.caption #, fuzzy #| msgid "Log font" msgctxt "tfrmoptionsfonts.lbllogfont.caption" msgid "&Log font" msgstr "Písmo logu" #: tfrmoptionsfonts.lblmainfont.caption #, fuzzy #| msgid "Main font" msgctxt "tfrmoptionsfonts.lblmainfont.caption" msgid "Main &font" msgstr "Hlavné písmo" #: tfrmoptionsfonts.lblviewerbookfont.caption #, fuzzy #| msgid "Viewer Book Font" msgctxt "tfrmoptionsfonts.lblviewerbookfont.caption" msgid "Viewer&Book Font" msgstr "Písmo prezerača kníh" #: tfrmoptionsfonts.lblviewerfont.caption #, fuzzy #| msgid "Viewer font" msgctxt "tfrmoptionsfonts.lblviewerfont.caption" msgid "&Viewer font" msgstr "Písmo prezerača" #: tfrmoptionshotkeys.btnaddhotkey.caption msgid "Add &hotkey" msgstr "" #: tfrmoptionshotkeys.btndeletehotkey.caption msgid "&Delete hotkey" msgstr "" #: tfrmoptionshotkeys.btnedithotkey.caption msgctxt "tfrmoptionshotkeys.btnedithotkey.caption" msgid "&Edit hotkey" msgstr "" #: tfrmoptionshotkeys.lbfilter.caption #, fuzzy #| msgid "Filter" msgctxt "tfrmoptionshotkeys.lbfilter.caption" msgid "&Filter" msgstr "Filter" #: tfrmoptionshotkeys.lblcategories.caption #, fuzzy #| msgid "Categories:" msgctxt "tfrmoptionshotkeys.lblcategories.caption" msgid "C&ategories:" msgstr "Kategórie:" #: tfrmoptionshotkeys.lblcommands.caption #, fuzzy #| msgid "Commands:" msgctxt "tfrmoptionshotkeys.lblcommands.caption" msgid "Co&mmands:" msgstr "Príkazy:" #: tfrmoptionshotkeys.lblscfiles.caption #, fuzzy #| msgid "Shortcut files:" msgctxt "tfrmoptionshotkeys.lblscfiles.caption" msgid "&Shortcut files:" msgstr "Súbory zástupcov:" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "tfrmoptionshotkeys.stghotkeys.columns[0].title.caption" msgid "Hotkey" msgstr "Klávesa" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "tfrmoptionshotkeys.stghotkeys.columns[1].title.caption" msgid "Parameters" msgstr "Parametre" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption msgid "Controls" msgstr "" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "Pre nasledujúce cesty a podzložky" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "tfrmoptionsicons.cbiconsinmenussize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption #, fuzzy #| msgid "Show overlay i&cons, e.g. for links" msgctxt "tfrmoptionsicons.cbiconsshowoverlay.caption" msgid "Show o&verlay icons, e.g. for links" msgstr "Zobraziť prekladané i&kony (pre zástupcov)" #: tfrmoptionsicons.cbiconssize.text msgctxt "tfrmoptionsicons.cbiconssize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "" #: tfrmoptionsicons.gbiconssize.caption #, fuzzy #| msgid " Icon &size " msgctxt "tfrmoptionsicons.gbiconssize.caption" msgid " Icon size " msgstr "Veľkosť i&kon" #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "tfrmoptionsicons.gbshowiconsmode.caption" msgid " Show icons to the left of the filename " msgstr "Zobraziť ikony vľavo od názvu súboru" #: tfrmoptionsicons.rbiconsshowall.caption #, fuzzy #| msgid "&All" msgctxt "tfrmoptionsicons.rbiconsshowall.caption" msgid "A&ll" msgstr "&Všetko" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "tfrmoptionsicons.rbiconsshowallandexe.caption" msgid "All associated + &EXE/LNK (slow)" msgstr "Všetky asociácie + &EXE/LNK (pomaly)" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "tfrmoptionsicons.rbiconsshownone.caption" msgid "&No icons" msgstr "Bez &ikon" #: tfrmoptionsicons.rbiconsshowstandard.caption #, fuzzy #| msgid "&Only standard icons" msgctxt "tfrmoptionsicons.rbiconsshowstandard.caption" msgid "Only &standard icons" msgstr "L&en štandartné ikony" #: tfrmoptionsignorelist.btnaddsel.caption #, fuzzy #| msgid "&Add selected names" msgctxt "tfrmoptionsignorelist.btnaddsel.caption" msgid "A&dd selected names" msgstr "Prid&ať vybrané mená" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "tfrmoptionsignorelist.btnaddselwithpath.caption" msgid "Add selected names with &full path" msgstr "Pridať vybrané mená s celou cestou" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "tfrmoptionsignorelist.chkignoreenable.caption" msgid "&Ignore (don't show) the following files and folders:" msgstr "&Ignorovať (nezobrazovať) nasledujúce súbory a zložky:" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "tfrmoptionsignorelist.lblsavein.caption" msgid "&Save in:" msgstr "Uložiť do:" #: tfrmoptionskeyboard.cblynxlike.caption msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "" #: tfrmoptionskeyboard.lblalt.caption #, fuzzy #| msgid "Alt+Letters" msgctxt "tfrmoptionskeyboard.lblalt.caption" msgid "Alt+L&etters" msgstr "Al&t+Písmená" #: tfrmoptionskeyboard.lblctrlalt.caption #, fuzzy #| msgid "Ctrl+Alt+Letters" msgctxt "tfrmoptionskeyboard.lblctrlalt.caption" msgid "Ctrl+Alt+Le&tters" msgstr "&Ctrl+Alt+Písmená" #: tfrmoptionskeyboard.lblnomodifier.caption msgid "&Letters" msgstr "" #: tfrmoptionslayout.cbflatdiskpanel.caption #, fuzzy #| msgid "Flat buttons" msgctxt "tfrmoptionslayout.cbflatdiskpanel.caption" msgid "&Flat buttons" msgstr "Ploché tlačítka" #: tfrmoptionslayout.cbflatinterface.caption #, fuzzy #| msgid "Flat interface" msgctxt "tfrmoptionslayout.cbflatinterface.caption" msgid "Flat i&nterface" msgstr "Ploché rozhranie" #: tfrmoptionslayout.cbflattoolbar.caption #, fuzzy #| msgid "Flat buttons" msgctxt "tfrmoptionslayout.cbflattoolbar.caption" msgid "Flat b&uttons" msgstr "Ploché tlačítka" #: tfrmoptionslayout.cbfreespaceind.caption #, fuzzy #| msgid "Show free space indicator on drive label" msgctxt "tfrmoptionslayout.cbfreespaceind.caption" msgid "Show fr&ee space indicator on drive label" msgstr "Zobraziť indikátor voľného miesta na disku" #: tfrmoptionslayout.cblogwindow.caption #, fuzzy #| msgid "Show log window" msgctxt "tfrmoptionslayout.cblogwindow.caption" msgid "Show lo&g window" msgstr "Zobraz okno logu" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "tfrmoptionslayout.cbpanelofoperations.caption" msgid "Show panel of operation in background" msgstr "Zobraziť panel operácií na pozadí" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "tfrmoptionslayout.cbproginmenubar.caption" msgid "Show common progress in menu bar" msgstr "Zobraziť celkový postup v lište menu" #: tfrmoptionslayout.cbshowcmdline.caption #, fuzzy #| msgid "Show command &line" msgctxt "tfrmoptionslayout.cbshowcmdline.caption" msgid "Show command l&ine" msgstr "Zobraziť príkazový ria&dok" #: tfrmoptionslayout.cbshowcurdir.caption #, fuzzy #| msgid "Show ¤t directory" msgctxt "tfrmoptionslayout.cbshowcurdir.caption" msgid "Show current director&y" msgstr "Zobraziť &aktuálnu zložku" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "tfrmoptionslayout.cbshowdiskpanel.caption" msgid "Show &drive buttons" msgstr "Zobraziť &tlačítka diskov" #: tfrmoptionslayout.cbshowdrivefreespace.caption #, fuzzy #| msgid "Show free space label" msgctxt "tfrmoptionslayout.cbshowdrivefreespace.caption" msgid "Show free s&pace label" msgstr "V hlavičke panela zobraziť údaj o voľnom mieste" #: tfrmoptionslayout.cbshowdriveslistbutton.caption msgid "Show drives list bu&tton" msgstr "" #: tfrmoptionslayout.cbshowkeyspanel.caption #, fuzzy #| msgid "Show &function key buttons" msgctxt "tfrmoptionslayout.cbshowkeyspanel.caption" msgid "Show function &key buttons" msgstr "Zobraziť &funkčné tlačítka" #: tfrmoptionslayout.cbshowmainmenu.caption #, fuzzy #| msgid "Show main menu" msgctxt "tfrmoptionslayout.cbshowmainmenu.caption" msgid "Show &main menu" msgstr "Zobraziť hlavné menu" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "tfrmoptionslayout.cbshowmaintoolbar.caption" msgid "Show &button bar" msgstr "Zobraziť &tlačítkovú lištu" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption msgid "Show short free space &label" msgstr "" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "tfrmoptionslayout.cbshowstatusbar.caption" msgid "Show &status bar" msgstr "Zobraziť &stavový riadok" #: tfrmoptionslayout.cbshowtabheader.caption #, fuzzy #| msgid "Show &tabstop header" msgctxt "tfrmoptionslayout.cbshowtabheader.caption" msgid "S&how tabstop header" msgstr "Zobraziť &tabstop hlavičku" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "tfrmoptionslayout.cbshowtabs.caption" msgid "Sho&w folder tabs" msgstr "Zobraziť &záložky" #: tfrmoptionslayout.cbtermwindow.caption #, fuzzy #| msgid "Show terminal window" msgctxt "tfrmoptionslayout.cbtermwindow.caption" msgid "Show te&rminal window" msgstr "Zobraziť okno terminálu" #: tfrmoptionslayout.cbtwodiskpanels.caption #, fuzzy #| msgid "Show two drive button bars (fixed width, above file windows)" msgctxt "tfrmoptionslayout.cbtwodiskpanels.caption" msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "Zobraziť 2 zoznamy diskov (pevná šírka, nad oknami so súbormi)" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "tfrmoptionslayout.gbscreenlayout.caption" msgid " Screen layout " msgstr "Vzhľad obrazovky" #: tfrmoptionslog.cblogarcop.caption #, fuzzy #| msgid "Pack/Unpack" msgctxt "tfrmoptionslog.cblogarcop.caption" msgid "&Pack/Unpack" msgstr "Zbaliť/Rozbaliť" #: tfrmoptionslog.cblogcpmvln.caption #, fuzzy #| msgid "Copy/Move/Create link/symlink" msgctxt "tfrmoptionslog.cblogcpmvln.caption" msgid "Cop&y/Move/Create link/symlink" msgstr "Kopírovanie/Presun/Vytvorenie linku/symlinku" #: tfrmoptionslog.cblogdelete.caption #, fuzzy #| msgid "Delete" msgctxt "tfrmoptionslog.cblogdelete.caption" msgid "&Delete" msgstr "Vymazať" #: tfrmoptionslog.cblogdirop.caption #, fuzzy #| msgid "Create/Delete directories" msgctxt "tfrmoptionslog.cblogdirop.caption" msgid "Crea&te/Delete directories" msgstr "Tvorba/Mazanie zložiek" #: tfrmoptionslog.cblogerrors.caption msgctxt "tfrmoptionslog.cblogerrors.caption" msgid "Log &errors" msgstr "Log &chýb" #: tfrmoptionslog.cblogfile.caption #, fuzzy #| msgid "&Create a log file:" msgctxt "tfrmoptionslog.cblogfile.caption" msgid "C&reate a log file:" msgstr "&Vytvoriť log:" #: tfrmoptionslog.cbloginfo.caption #, fuzzy #| msgid "Log information messages" msgctxt "tfrmoptionslog.cbloginfo.caption" msgid "Log &information messages" msgstr "Log informačných správ" #: tfrmoptionslog.cblogsuccess.caption msgctxt "tfrmoptionslog.cblogsuccess.caption" msgid "Log &successful operations" msgstr "Log &dokončených operácií" #: tfrmoptionslog.cblogvfs.caption #, fuzzy #| msgid "File system plugins" msgctxt "tfrmoptionslog.cblogvfs.caption" msgid "&File system plugins" msgstr "Zásuvné moduly súborového systému" #: tfrmoptionslog.gblogfile.caption msgctxt "tfrmoptionslog.gblogfile.caption" msgid "File operation log file" msgstr "Log súborových operácií" #: tfrmoptionslog.gblogfileop.caption msgid "Log operations" msgstr "" #: tfrmoptionslog.gblogfilestatus.caption msgid "Operation status" msgstr "" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "" #: tfrmoptionsmisc.chkshowwarningmessages.caption #, fuzzy #| msgid "Show warning messages (\"OK\" button only)" msgctxt "tfrmoptionsmisc.chkshowwarningmessages.caption" msgid "Show &warning messages (\"OK\" button only)" msgstr "Zobraziť varovné správy (len tlačítko \"OK\")" #: tfrmoptionsmisc.chkthumbsave.caption #, fuzzy #| msgid "Save thumbnails in cache" msgctxt "tfrmoptionsmisc.chkthumbsave.caption" msgid "&Save thumbnails in cache" msgstr "Uložiť náhľady do cache" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "tfrmoptionsmisc.dblthumbnails.caption" msgid "Thumbnails" msgstr "" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "tfrmoptionsmisc.lblthumbseparator.caption" msgid "X" msgstr "X" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "" #: tfrmoptionsmouse.cbselectionbymouse.caption #, fuzzy #| msgid "Selection by mouse" msgctxt "tfrmoptionsmouse.cbselectionbymouse.caption" msgid "&Selection by mouse" msgstr "Výber myšou" #: tfrmoptionsmouse.gbscrolling.caption msgctxt "tfrmoptionsmouse.gbscrolling.caption" msgid "Scrolling" msgstr "Skrolovanie" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "" #: tfrmoptionsmouse.lblmousemode.caption #, fuzzy #| msgid "Mode:" msgctxt "tfrmoptionsmouse.lblmousemode.caption" msgid "&Mode:" msgstr "Mód:" #: tfrmoptionsmouse.rbscrolllinebyline.caption #, fuzzy #| msgid "Line by line" msgctxt "tfrmoptionsmouse.rbscrolllinebyline.caption" msgid "&Line by line" msgstr "Riadok po riadku" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption #, fuzzy #| msgid "Line by line with cursor movement" msgctxt "tfrmoptionsmouse.rbscrolllinebylinecursor.caption" msgid "Line by line &with cursor movement" msgstr "Riadok po riadku s posunom kurzoru" #: tfrmoptionsmouse.rbscrollpagebypage.caption #, fuzzy #| msgid "Page by page" msgctxt "tfrmoptionsmouse.rbscrollpagebypage.caption" msgid "&Page by page" msgstr "Stránka po stránke" #: tfrmoptionsplugins.btnaddplugin.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "Pridať" #: tfrmoptionsplugins.btnconfigplugin.caption #, fuzzy #| msgid "Configure" msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "Konfigurovať" #: tfrmoptionsplugins.btnenableplugin.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "Povoliť" #: tfrmoptionsplugins.btnremoveplugin.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "Odstrániť" #: tfrmoptionsplugins.btntweakplugin.caption #, fuzzy #| msgid "Tweak" msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "Ladenie" #: tfrmoptionsplugins.lbldsxdescription.caption #, fuzzy #| msgid "Search plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "Vyhľadávacie zásuvné moduly umožňujú použitie pri hľadaní alternatívnych vyhľadávacích algoritmov alebo externých nástrojov (napr. \"nájsť \", atď.)." #: tfrmoptionsplugins.lblwcxdescription.caption #, fuzzy #| msgid "Packer plugins are used to work with archives." msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "Komprimačné zásuvné moduly pre prácu s archívmi." #: tfrmoptionsplugins.lblwdxdescription.caption #, fuzzy #| msgid "Content plugins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "Obsahové zásuvné moduly umožňujú zobraziť rozšírené informácie ako sú MP3 tagy alebo atribúty obrázkov v zozname súborov, alebo ich používať na vyhľadávanie a \"multi-premenovanie\"." #: tfrmoptionsplugins.lblwfxdescription.caption #, fuzzy #| msgid "File system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "Zásuvné moduly súborových systémov umožnia prístup k bežne nedostupným médiám ako sú napr. externé zariadenia (Palm/PocketPC)." #: tfrmoptionsplugins.lblwlxdescription.caption #, fuzzy #| msgid "Viewer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "Zobrazovacie zásuvné moduly umožňujú prezeranie súborov ako sú napr. obrázky, databázy a pod. v prezerači (F3, alebo Ctrl+Q)." #: tfrmoptionsplugins.stgplugins.columns[0].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[0].title.caption" msgid "Active" msgstr "Aktívne" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[1].title.caption" msgid "Plugin" msgstr "Zásuvný modul" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[2].title.caption" msgid "Registered for" msgstr "Registrované pre" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[3].title.caption" msgid "File name" msgstr "Názov súboru" #: tfrmoptionsplugins.tsdsx.caption #, fuzzy #| msgid "Search plugins (.DSX)" msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "Vyhľadávacie zásuvné moduly (.DSX)" #: tfrmoptionsplugins.tswcx.caption #, fuzzy #| msgid "Packer plugins (.WCX)" msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "Komprimačné zásuvné moduly (.WCX)" #: tfrmoptionsplugins.tswdx.caption #, fuzzy #| msgid "Content plugins (.WDX)" msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "Zásuvné moduly obsahu (.WDX)" #: tfrmoptionsplugins.tswfx.caption #, fuzzy #| msgid "File system plugins (.WFX)" msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "Zásuvné moduly súborových systémov (.WFX)" #: tfrmoptionsplugins.tswlx.caption #, fuzzy #| msgid "Viewer plugins (.WLX)" msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "Zobrazovacie zásuvné moduly (.WLX)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "tfrmoptionsquicksearchfilter.cbexactbeginning.caption" msgid "&Beginning (name must start with first typed character)" msgstr "&Začiatok (meno musí začínať zadaným znakom)" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "tfrmoptionsquicksearchfilter.cbexactending.caption" msgid "En&ding (last character before a typed dot . must match)" msgstr "&Koniec (posledný znak pred . musí zodpovedať zadanému)" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "tfrmoptionsquicksearchfilter.cgpoptions.caption" msgid "Options" msgstr "Nastavenia" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption msgid "Exact name match" msgstr "" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "tfrmoptionstabs.cbtabsactivateonclick.caption" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "Aktivovať cieľový &panel pri kliknutí na jeho ľubovolnú záložku" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "tfrmoptionstabs.cbtabsalwaysvisible.caption" msgid "&Show tab header also when there is only one tab" msgstr "&Zobraziť záložku, aj keď existuje len jedna" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption #, fuzzy #| msgid "&Confirm close all tabs" msgctxt "tfrmoptionstabs.cbtabsconfirmcloseall.caption" msgid "Con&firm close all tabs" msgstr "&Potvrdiť uzatvorenie všetkých záložiek" #: tfrmoptionstabs.cbtabslimitoption.caption msgid "&Limit tab title length to" msgstr "" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "tfrmoptionstabs.cbtabslockedasterisk.caption" msgid "Show locked tabs &with an asterisk *" msgstr "Zobraziť uzamknuté záložky so znakom *" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "tfrmoptionstabs.cbtabsmultilines.caption" msgid "&Tabs on multiple lines" msgstr "&Záložky na viac riadkov" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "tfrmoptionstabs.cbtabsopenforeground.caption" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Ctrl+&Hore otvorí novú záložku na pozadí" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "tfrmoptionstabs.cbtabsopennearcurrent.caption" msgid "Open &new tabs near current tab" msgstr "Otvárať &nové záložky vedľa aktuálnej záložky" #: tfrmoptionstabs.cbtabsshowclosebutton.caption #, fuzzy #| msgid "Show tab close button" msgctxt "tfrmoptionstabs.cbtabsshowclosebutton.caption" msgid "Show ta&b close button" msgstr "Na záložkách aj tlačítko zavrieť" #: tfrmoptionstabs.gbtabs.caption msgctxt "tfrmoptionstabs.gbtabs.caption" msgid "Folder tabs headers" msgstr "Hlavičky záložiek" #: tfrmoptionstabs.lblchar.caption msgctxt "tfrmoptionstabs.lblchar.caption" msgid "characters" msgstr "znakov" #: tfrmoptionstabs.lbltabsposition.caption msgid "Ta&bs position" msgstr "" #: tfrmoptionsterminal.lblruninterm.caption #, fuzzy #| msgid "Run in terminal:" msgctxt "tfrmoptionsterminal.lblruninterm.caption" msgid "Run in &terminal:" msgstr "Spustiť v terminály:" #: tfrmoptionsterminal.lblrunterm.caption #, fuzzy #| msgid "Run terminal:" msgctxt "tfrmoptionsterminal.lblrunterm.caption" msgid "Run t&erminal:" msgstr "Spustiť terminál:" #: tfrmoptionstoolbar.btnclonebutton.caption msgid "C&lone button" msgstr "" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "tfrmoptionstoolbar.btndeletebutton.caption" msgid "&Delete" msgstr "&Vymazať" #: tfrmoptionstoolbar.btnedithotkey.caption msgctxt "tfrmoptionstoolbar.btnedithotkey.caption" msgid "Edit hot&key" msgstr "" #: tfrmoptionstoolbar.btninsertbutton.caption msgctxt "tfrmoptionstoolbar.btninsertbutton.caption" msgid "&Insert new button" msgstr "Vložte nové tlačítko" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "tfrmoptionstoolbar.btnopenfile.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "tfrmoptionstoolbar.btnopenicon.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnremovehotkey.caption msgid "Remove hotke&y" msgstr "" #: tfrmoptionstoolbar.cbflatbuttons.caption #, fuzzy #| msgid "Flat b&uttons" msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "Ploché tlačítka" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "" #: tfrmoptionstoolbar.gbgroupbox.caption msgctxt "tfrmoptionstoolbar.gbgroupbox.caption" msgid "Appearance" msgstr "Vzhľad" #: tfrmoptionstoolbar.lblbarsize.caption #, fuzzy #| msgid "Ba&r size:" msgctxt "tfrmoptionstoolbar.lblbarsize.caption" msgid "&Bar size:" msgstr "Veľkosť lišty:" #: tfrmoptionstoolbar.lblexternalcommand.caption msgctxt "tfrmoptionstoolbar.lblexternalcommand.caption" msgid "Comman&d:" msgstr "" #: tfrmoptionstoolbar.lblexternalparameters.caption msgctxt "tfrmoptionstoolbar.lblexternalparameters.caption" msgid "Parameter&s:" msgstr "" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "" #: tfrmoptionstoolbar.lbliconfile.caption msgid "Ico&n:" msgstr "" #: tfrmoptionstoolbar.lbliconsize.caption #, fuzzy #| msgid "Ic&on size:" msgctxt "tfrmoptionstoolbar.lbliconsize.caption" msgid "Icon si&ze:" msgstr "Veľkosť ikony" #: tfrmoptionstoolbar.lblinternalcommand.caption msgctxt "tfrmoptionstoolbar.lblinternalcommand.caption" msgid "Co&mmand:" msgstr "" #: tfrmoptionstoolbar.lblinternalparameters.caption msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "" #: tfrmoptionstoolbar.lblstartpath.caption msgid "Start pat&h:" msgstr "" #: tfrmoptionstoolbar.lbltooltip.caption msgid "&Tooltip:" msgstr "" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption #, fuzzy #| msgid "Keep terminal window open after executing program" msgctxt "tfrmoptionstoolbase.cbtoolskeepterminalopen.caption" msgid "&Keep terminal window open after executing program" msgstr "Ponechať okno terminálu otvorené aj po skončení programu" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption #, fuzzy #| msgid "Execute in terminal" msgctxt "tfrmoptionstoolbase.cbtoolsruninterminal.caption" msgid "&Execute in terminal" msgstr "Spustiť v terminály" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption #, fuzzy #| msgid "Use external program" msgctxt "tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption" msgid "&Use external program" msgstr "Použiť externý program" #: tfrmoptionstoolbase.lbltoolsparameters.caption #, fuzzy #| msgid "Additional parameters" msgctxt "tfrmoptionstoolbase.lbltoolsparameters.caption" msgid "A&dditional parameters" msgstr "Ďalšie parametre" #: tfrmoptionstoolbase.lbltoolspath.caption #, fuzzy #| msgid "Path to program to execute" msgctxt "tfrmoptionstoolbase.lbltoolspath.caption" msgid "&Path to program to execute" msgstr "Cesta k externému programu" #: tfrmoptionstooltips.btnaddfields.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "Pridať" #: tfrmoptionstooltips.btnapplyfields.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "Použiť" #: tfrmoptionstooltips.btndeletefields.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "Vymazať" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Šablóny..." #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "Užívateľské polia podľa typu súboru" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "Zobraziť bublinovú pomoc" #: tfrmoptionstooltips.lblfieldslist.caption #, fuzzy #| msgid "Category hint:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "Pomoc pre kategóriu:" #: tfrmoptionstooltips.lblfieldsmask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "Maska kategórie:" #: tfrmoptionstooltips.lblfieldsname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "Názov kategórie:" #: tfrmoptionstooltips.rbtooltipallfiles.caption #, fuzzy #| msgid "Show tool tip for all files in file panel" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "Zobraziť tipy pre všetky súbory v panely" #: tfrmoptionstooltips.rbtooltipnone.caption #, fuzzy #| msgid "Don't show" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "Nezobrazovať" #: tfrmoptionstooltips.rbtooltiponlylarge.caption #, fuzzy #| msgid "Show tool tip for files in file panel if truncated" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "Zobraziť tipy pre súbory, ktorých mená sú zobrazené orezané" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "tfrmoptionsviewer.btnbackviewercolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "tfrmoptionsviewer.btnfontviewercolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.gbviewerbookmode.caption msgctxt "tfrmoptionsviewer.gbviewerbookmode.caption" msgid "Viewer Book Mode" msgstr "Mód prezerania knihy" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "tfrmoptionsviewer.gbviewerexample.caption" msgid "Example" msgstr "Vzorka" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption #, fuzzy #| msgid "Background color in book viewer" msgctxt "tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption" msgid "&Background color in book viewer" msgstr "Farba pozadia v prezerači kníh" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption #, fuzzy #| msgid "Font color in book viewer" msgctxt "tfrmoptionsviewer.lblfontcolorviewerbook.caption" msgid "&Font color in book viewer" msgstr "Farba písma v prezerači kníh" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption #, fuzzy #| msgid "Number of columns in book viewer" msgctxt "tfrmoptionsviewer.lblnumbercolumnsviewer.caption" msgid "&Number of columns in book viewer" msgstr "Počet stĺpcov v prezerači kníh" #: tfrmpackdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmpackdlg.btnconfig.caption #, fuzzy #| msgid "&Configure" msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "&Konfigurovať" #: tfrmpackdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Pomoc" #: tfrmpackdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmpackdlg.caption msgctxt "tfrmpackdlg.caption" msgid "Pack files" msgstr "Komprimovať súbory" #: tfrmpackdlg.cbcreateseparatearchives.caption #, fuzzy #| msgid "Create separate archives, o&ne per selected file/dir" msgid "C&reate separate archives, one per selected file/dir" msgstr "Vytvoriť samostat&né archívne súbory pre každý vybratý súbor/zložku" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "Sa&morozbaľovací archív" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "&Zakódovať" #: tfrmpackdlg.cbmovetoarchive.caption #, fuzzy #| msgid "M&ove to archive" msgid "Mo&ve to archive" msgstr "Pre&sunúť do archívu" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "&Viaczväzkový archív" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "=>" #: tfrmpackdlg.cbputintarfirst.caption #, fuzzy #| msgid "Put in the TAR archive first" msgid "P&ut in the TAR archive first" msgstr "Najskôr vytvoriť archív TAR" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "Kom&primovať s cestou (only recursed)" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "Komprimovať súbor(y) do súboru:" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "Komprimátor" #: tfrmpackinfodlg.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Zavrieť" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "Rozbaliť &Všetko a spustiť" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "&Rozbaliť a spustiť" #: tfrmpackinfodlg.caption msgctxt "tfrmpackinfodlg.caption" msgid "Properties of packed file" msgstr "Vlastnosti komprimovaného súboru" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "Atribúty:" #: tfrmpackinfodlg.lblcompressionratio.caption #, fuzzy msgid "Compression ratio:" msgstr "Kompresný pomer:" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "Dátum:" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "Metóda:" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "Pôvodná veľkosť:" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "Súbor:" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "Skomprimovaná veľkosť:" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "Komprimátor:" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "Čas:" #: tfrmquicksearch.btncancel.caption msgctxt "tfrmquicksearch.btncancel.caption" msgid "X" msgstr "X" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "" #: tfrmquicksearch.tglfilter.caption msgctxt "tfrmquicksearch.tglfilter.caption" msgid "Filter" msgstr "Filter" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "tfrmselecttextrange.btppanel.cancelbutton.caption" msgid "Cancel" msgstr "Zrušiť" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "tfrmselecttextrange.btppanel.closebutton.caption" msgid "&Close" msgstr "&Zavrieť" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "tfrmselecttextrange.btppanel.helpbutton.caption" msgid "&Help" msgstr "&Pomoc" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "tfrmselecttextrange.btppanel.okbutton.caption" msgid "&OK" msgstr "&OK" #: tfrmselecttextrange.lblselecttext.caption msgid "&Select the characters to insert:" msgstr "" #: tfrmsetfileproperties.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsetfileproperties.caption msgctxt "tfrmsetfileproperties.caption" msgid "Change attributes" msgstr "Nastaviť atribúty" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Sticky" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "Archív" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "Vytvorený:" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "Skrytý" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "Naposledy otvorený" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "Zmenený" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "Len na čítanie" #: tfrmsetfileproperties.chkrecursive.caption #, fuzzy #| msgid "Recursive" msgid "Including subfolders" msgstr "Rekurzívne" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "Systémový" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "Časová značka" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atribúty" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atribúty" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bitov:" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Skupina" #: tfrmsetfileproperties.lblattrinfo.caption msgid "(gray field means unchanged value)" msgstr "(šedé pole znamená nezmenenú hodnotu)" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Ostatní" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Vlastník" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Textovo:" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Spustiť" #: tfrmsetfileproperties.lbloctal.caption #, fuzzy msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Číselne:" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Čítanie" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Zápis" #: tfrmsplitter.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmsplitter.caption msgctxt "tfrmsplitter.caption" msgid "Splitter" msgstr "Delenie súborov" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664B - 3.5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "Názov súboru" #: tfrmsplitter.grbxsize.caption #, fuzzy #| msgid "File size" msgid "Size and number of parts" msgstr "Veľkosť a počet častí" #: tfrmsplitter.lbdirtarget.caption #, fuzzy #| msgid "Directory target" msgid "Directory &target" msgstr "Cieľová zložka" #: tfrmsplitter.lbfilesource.caption #, fuzzy #| msgid "File source" msgid "File &source" msgstr "Zdroj súboru" #: tfrmsplitter.lblnumberparts.caption #, fuzzy #| msgid "Number of parts" msgid "&Number of parts" msgstr "Počet častí" #: tfrmsplitter.rbtngigab.caption #, fuzzy #| msgid "Gigabytes" msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "GB" #: tfrmsplitter.rbtnkilob.caption #, fuzzy #| msgid "Kilobytes" msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "KB" #: tfrmsplitter.rbtnmegab.caption #, fuzzy #| msgid "Megabytes" msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "MB" #: tfrmsymlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsymlink.caption #, fuzzy #| msgid "Create symlink" msgid "Create symbolic link" msgstr "Vytvoriť symbolický odkaz" #: tfrmsymlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Existujúci cieľ (kde link bude ukazovať)" #: tfrmsymlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Názov odkazu" #: tfrmtweakplugin.btnadd.caption #, fuzzy #| msgid "Add new" msgid "A&dd new" msgstr "Pridať nový" #: tfrmtweakplugin.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Zrušiť" #: tfrmtweakplugin.btnchange.caption #, fuzzy #| msgid "Change" msgid "C&hange" msgstr "Zmeniť" #: tfrmtweakplugin.btndefault.caption #, fuzzy #| msgid "Default" msgid "De&fault" msgstr "Východzí" #: tfrmtweakplugin.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmtweakplugin.btnremove.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "Odstrániť" #: tfrmtweakplugin.caption msgctxt "tfrmtweakplugin.caption" msgid "Tweak plugin" msgstr "Vylepšovací zásuvný modul" #: tfrmtweakplugin.cbpk_caps_by_content.caption #, fuzzy #| msgid "Detect archive type by content" msgid "De&tect archive type by content" msgstr "Detekovať typ archívu podľa obsahu" #: tfrmtweakplugin.cbpk_caps_delete.caption #, fuzzy #| msgid "Can delete files" msgid "Can de&lete files" msgstr "Môžete mazať súbory" #: tfrmtweakplugin.cbpk_caps_encrypt.caption #, fuzzy #| msgid "Supports encryption" msgid "Supports e&ncryption" msgstr "Podporuje šifrovanie" #: tfrmtweakplugin.cbpk_caps_hide.caption #, fuzzy #| msgid "Show as normal files (hide packer icon)" msgid "Sho&w as normal files (hide packer icon)" msgstr "Zobraziť ako normálne súbory (skryť ikonu komprimátora)" #: tfrmtweakplugin.cbpk_caps_mempack.caption #, fuzzy #| msgid "Supports packing in memory" msgid "Supports pac&king in memory" msgstr "Podporuje komprimáciu v pamäti" #: tfrmtweakplugin.cbpk_caps_modify.caption #, fuzzy #| msgid "Can modify exisiting archives" msgid "Can &modify exisiting archives" msgstr "Môžte meniť existujúce archívy" #: tfrmtweakplugin.cbpk_caps_multiple.caption #, fuzzy #| msgid "Archive can contain multiple files" msgid "&Archive can contain multiple files" msgstr "Archív môže obsahovať viac súborov" #: tfrmtweakplugin.cbpk_caps_new.caption #, fuzzy #| msgid "Can create new archives" msgid "Can create new archi&ves" msgstr "Môžte vytvárať nové archívy" #: tfrmtweakplugin.cbpk_caps_options.caption #, fuzzy #| msgid "Supports the options dialogbox" msgid "S&upports the options dialogbox" msgstr "Podporuje dialóg s nastavením" #: tfrmtweakplugin.cbpk_caps_searchtext.caption #, fuzzy #| msgid "Allow searching for text in archives" msgid "Allow searchin&g for text in archives" msgstr "Podporuje vyhľadávanie textu v archívoch" #: tfrmtweakplugin.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "Popis:" #: tfrmtweakplugin.lbldetectstr.caption #, fuzzy #| msgid "Detect string:" msgid "D&etect string:" msgstr "Detekovaný text:" #: tfrmtweakplugin.lblextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "Prípona:" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "Vlajky:" #: tfrmtweakplugin.lblname.caption #, fuzzy #| msgid "Name:" msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "Meno:" #: tfrmtweakplugin.lblplugin.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "Zásuvný modul:" #: tfrmtweakplugin.lblplugin1.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "Zásuvný modul:" #: tfrmviewer.actabout.caption msgctxt "tfrmviewer.actabout.caption" msgid "About Viewer..." msgstr "O prezerači..." #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "" #: tfrmviewer.actcopyfile.caption msgctxt "tfrmviewer.actcopyfile.caption" msgid "Copy File" msgstr "" #: tfrmviewer.actcopyfile.hint msgctxt "tfrmviewer.actcopyfile.hint" msgid "Copy File" msgstr "" #: tfrmviewer.actdeletefile.caption msgctxt "tfrmviewer.actdeletefile.caption" msgid "Delete File" msgstr "" #: tfrmviewer.actdeletefile.hint msgctxt "tfrmviewer.actdeletefile.hint" msgid "Delete File" msgstr "" #: tfrmviewer.actloadnextfile.caption msgctxt "tfrmviewer.actloadnextfile.caption" msgid "&Next" msgstr "&Další" #: tfrmviewer.actloadnextfile.hint msgid "Load Next File" msgstr "" #: tfrmviewer.actloadprevfile.caption msgctxt "tfrmviewer.actloadprevfile.caption" msgid "&Previous" msgstr "&Predchádzajúci" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "" #: tfrmviewer.actmirror.caption msgctxt "tfrmviewer.actmirror.caption" msgid "Mirror" msgstr "Zrkadliť" #: tfrmviewer.actmirror.hint msgctxt "tfrmviewer.actmirror.hint" msgid "Mirror" msgstr "Zrkadliť" #: tfrmviewer.actmovefile.caption msgctxt "tfrmviewer.actmovefile.caption" msgid "Move File" msgstr "" #: tfrmviewer.actmovefile.hint msgctxt "tfrmviewer.actmovefile.hint" msgid "Move File" msgstr "" #: tfrmviewer.actreload.caption msgctxt "tfrmviewer.actreload.caption" msgid "Reload" msgstr "Obnoviť" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "" #: tfrmviewer.actrotate180.caption msgctxt "tfrmviewer.actrotate180.caption" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate180.hint msgctxt "tfrmviewer.actrotate180.hint" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate270.caption msgctxt "tfrmviewer.actrotate270.caption" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate270.hint msgctxt "tfrmviewer.actrotate270.hint" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate90.caption msgctxt "tfrmviewer.actrotate90.caption" msgid "Rotate 90" msgstr "" #: tfrmviewer.actrotate90.hint msgctxt "tfrmviewer.actrotate90.hint" msgid "Rotate 90" msgstr "" #: tfrmviewer.actsaveas.caption msgctxt "tfrmviewer.actsaveas.caption" msgid "Save As..." msgstr "Uložiť ako..." #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "" #: tfrmviewer.actstretchimage.caption msgctxt "tfrmviewer.actstretchimage.caption" msgid "Stretch" msgstr "Roztiahnuť" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "- 90" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "Kopírovať" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "Kopírovať" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "Vystrihnúť" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "Vymazať" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "Vymazať" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "Celá obrazovka" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "||" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "S" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "Zvýrazniť" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "Zrkadliť" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "Presunúť" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "Presunúť" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "||>" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "Farba" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "<||" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "Červené oči" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "Zmeniť veľkosť/rozlíšenie" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "Zpäť" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "Priblížiť" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "Oddialiť" #: tfrmviewer.caption msgctxt "tfrmviewer.caption" msgid "Viewer" msgstr "Prezerač" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Prezentácia" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "Pero" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "Zvýrazniť" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "Farba" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Prezentácia" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "Zobraziť" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "0x0" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "+ 180" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "- 90" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "O programe" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "Zobraziť &binárne" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "Kopírovať do schránky" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Edit" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "Kó&dovanie" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "&Koniec" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "&Súbor" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "Celá obrazovka" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "Grafika" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "Zobraziť &hexadecimálne" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "&Obrázok" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "Zobraziť ako knihu" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "Zrkadliť" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "Zásuvné moduly" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "Náhľad" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "Tlač..." #: tfrmviewer.mirotate.caption msgid "Rotate" msgstr "Otočiť" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "Uložiť" #: tfrmviewer.misaveas.caption msgctxt "tfrmviewer.misaveas.caption" msgid "Save As..." msgstr "Uložiť ako..." #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "Okopírovať obrazovku" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "Hľadať" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "Hľadať ďalší" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "Hľadať predchádzajúci" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "Vybrat Všetko" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.mistretch.caption msgctxt "tfrmviewer.mistretch.caption" msgid "Stretch" msgstr "Roztiahnuť" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "Zobraziť ako &Text" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "&Zobraziť" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "Zobraziť &ako zalamovaný text" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "Priblížiť" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "Oddialiť" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "Kopírovať do schránky" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "Vybrať všetko" #: tfrmviewoperations.btnstartpause.caption msgctxt "tfrmviewoperations.btnstartpause.caption" msgid "&Start" msgstr "&Start" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "" #: tfrmviewoperations.caption #, fuzzy msgctxt "tfrmviewoperations.caption" msgid "File operations" msgstr "Súborové operácie" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "" #: tfrmviewoperations.mnucanceloperation.caption msgctxt "tfrmviewoperations.mnucanceloperation.caption" msgid "Cancel" msgstr "Zrušiť" #: tfrmviewoperations.mnucancelqueue.caption msgctxt "tfrmviewoperations.mnucancelqueue.caption" msgid "Cancel" msgstr "Zrušiť" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "tfrmviewoperations.mnuoperationshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "" #: tfrmviewoperations.mnuqueue.caption msgctxt "tfrmviewoperations.mnuqueue.caption" msgid "Queue" msgstr "" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "tfrmviewoperations.mnuqueueshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "tmultiarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Ak súbor existuje" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "twcxarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Ak súbor existuje" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Ak súbor existuje" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "" #: ulng.rscolattr msgid "Attr" msgstr "Atr." #: ulng.rscoldate msgid "Date" msgstr "Dátum" #: ulng.rscolext msgid "Ext" msgstr "Prípona" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "Meno" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "Veľkosť" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "Počet zmien:" #: ulng.rsconfcolalign msgid "Align" msgstr "Zarovnať" #: ulng.rsconfcolcaption msgid "Caption" msgstr "Nadpis" #: ulng.rsconfcolconfig msgid "Config" msgstr "Konfigurácia" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "Vymazať" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "Detaily položky" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "Presunúť" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "Šírka" #: ulng.rsconfcustheader msgid "Customize column" msgstr "Nastavenie stĺpcov:" #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "Kopírovanie (%d) %s" #: ulng.rsdlgallopcomplete #, fuzzy #| msgid "All operations is complete" msgid "All operations completed" msgstr "Všetky operácie boli dokončené" #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "Priebeh všetkých operácií %d %%" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "Zrušiť" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "Všetko" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "&Pripojiť" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "&Zrušiť" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "Kopírovať do" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "Kopírovať do &Všetko" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "" #: ulng.rsdlgbuttonno msgid "&No" msgstr "&Nie" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "&Nie je" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "&OK" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "&Prepísať" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "Prepísať &Všetko" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "Znovu" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "Pre&skočiť" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "Pres&kočiť Všetko" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "&Ano" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "Spočítať súbory a zložky" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "Výpočet kontrolného súčtu..." #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "Kontrola kontrolného súčtu..." #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "Kopírovať súbor(y)" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "Zmazať súbor(y)" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "Presunúť súbor(y)" #: ulng.rsdlgoppause #, fuzzy #| msgid "Pause" msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "Pauza" #: ulng.rsdlgopstart #, fuzzy #| msgid "Start" msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "Štart" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "Rýchlosť %s/s" #: ulng.rsdlgspeedtime #, fuzzy #| msgid "Speed %s/s, remaining time %s" msgid "Speed %s/s, time remaining %s" msgstr "Rýchlosť %s/s, ostávajúci čas %s" #: ulng.rsdlgsplit #, fuzzy #| msgid "Split file" msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "Delenie súborov" #: ulng.rsdlgwipe #, fuzzy msgid "Wipe file(s)" msgstr "Bezpečne zmazať súbor(y)" #: ulng.rsdrivenolabel msgid "" msgstr "" #: ulng.rsdrivenomedia msgid "" msgstr "" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Interný editor Double Commanderu." #: ulng.rseditnewfile msgid "new.txt" msgstr "nový.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "Meno súboru:" #: ulng.rseditnewopen msgid "Open file" msgstr "Otvoriť súbor" #: ulng.rseditsearchback msgid "&Backward" msgstr "&Vzad" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "Hľadanie" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "V&pred" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "Nahradiť" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "" #: ulng.rsfileopsetpropertyerroroptions msgid "Ask;Don't set anymore;Ignore errors" msgstr "" #: ulng.rsfilterstatus msgid "FILTER" msgstr "" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "Definovať vzor" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "%s úrovní" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "všetko (nelimitovaná hĺbka)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "len aktuálna zložka" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "Adresár %s neexistuje!" #: ulng.rsfindfound msgid "Found: %d" msgstr "Nájdené: %d" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "Uložiť vyhľadávaciu šablónu" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "Názov šablóny:" #: ulng.rsfindscanned msgid "Scanned: %d" msgstr "Prehľadané: %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "Prehľadávam" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "Hľadať súbory" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "Začať v" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr "Voľných %s z %s bytov" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "Voľné miesto %s bytov" #: ulng.rsfuncatime msgid "Access date/time" msgstr "Dátum/čas posledného prístupu" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "Atribúty" #: ulng.rsfunccomment msgid "Comment" msgstr "Komentár" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "Dátum/čas vytvoeenia" #: ulng.rsfuncext msgid "Extension" msgstr "Prípona" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "Skupina" #: ulng.rsfunclinkto msgid "Link to" msgstr "Odkaz na" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "Dátum/čas zmeny" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "Meno" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "Meno bez prípony" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "Vlastník" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "Cesta" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "Veľkosť" #: ulng.rsfunctype msgid "Type" msgstr "Typ" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "Chyba pri vytváraní hardlinku." #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "Porovnávač" #: ulng.rshotkeycategorymain msgid "Main" msgstr "" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "Prezerač" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "Linkovanie dokončené" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "Maska zrušenia výberu" #: ulng.rsmarkplus msgid "Select mask" msgstr "Maska výberu" #: ulng.rsmaskinput msgid "Input mask:" msgstr "Vstupná maska:" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "Konfigurovať užívateľské stĺpce" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "Konfigurovať tento vlastný pohľad" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "Akcie" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "Upraviť" #: ulng.rsmnueject msgid "Eject" msgstr "Vysunúť" #: ulng.rsmnumount msgid "Mount" msgstr "Pripojiť" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "Nový" #: ulng.rsmnunomedia msgid "No media available" msgstr "Nie je dostupné žiadne médium" #: ulng.rsmnuopenwith #, fuzzy #| msgid "Open with ..." msgid "Open with" msgstr "Otvoriť s ..." #: ulng.rsmnuopenwithother msgid "Other..." msgstr "" #: ulng.rsmnusortby msgid "Sort by" msgstr "Triediť podľa" #: ulng.rsmnuumount #, fuzzy #| msgid "Umount" msgid "Unmount" msgstr "Odpojiť" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "Zobraziť" #: ulng.rsmsgaccount msgid "Account:" msgstr "Účet:" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "Ďalšie parametre pre príkazový riadok archivátora:" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "Nedá sa kopírovať/presunúť súbor \"%s\" sám na seba!" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "Zmena zložky na [%s] zlyhala!" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "Odstrániť všetky neaktívne záložky?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "Záložka (%s) je uzamknutá! Aj tak zavrieť?" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "Skutočne chcete skončiť?" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "Kopírovať %d vybraných súborov/zložek?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "Kopírovať vybrané \"%s\"?" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "Vymazať %d vybrané súbory / zložky?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "Vymazať %d vybraných súborov/zložiek do koša?" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "Vymazať vybrané \"%s\"?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "Presunúť vybrané \"%s\" do koša?" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "\"%s\" nedá sa zmazať do koše! Vymazať priamo?" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "Disk nie je dostupný" #: ulng.rsmsgenterfileext #, fuzzy msgid "Enter file extension:" msgstr "Zadajte príponu súboru:" #: ulng.rsmsgentername msgid "Enter name:" msgstr "Zadajte názov:" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "CRC chyba (kontrolný súčet nesúhlasí)" #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "Dáta sú zlé" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "Nedá sa spojiť so serverom: \"%s\"" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "Nedá sa kopírovať súbor %s do %s" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "Už existuje zložka s menom \"%s\"." #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "Dátum %s nie je podporovaný!" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "Zložka %s existuje!" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "Operácia prerušená užívateľom" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "Chyba pri uzatváraní súboru" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "Nedá sa vytvoriť súbor" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "V archíve nie sú žiadne ďalšie súbory" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "Nedá sa otvoriť existujúci súbor" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "Chyba pri čítaní súboru" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "Chyba pri zápise do súboru" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "Nedá sa vytvoriť zložku %s!" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "Neplatný odkaz" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "Súbory neexistujú" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "Nedostatok pamäti" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "Funkcia nie je podporovaná!" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "Syntaktická chyba v regulárnom výraze!" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "Nedá sa premenovať súbor %s na %s" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "Súbor sa nedá uložiť" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "Nedajú sa nastaviť atribúty pre \"%s\"" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "Nedá sa nastaviť dátum/čas pre \"%s\"" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "Buffer je príliš malý" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "Príliš mnoho súborov pre kompresiu" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "Neznámy formát archívu" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "Súbor %s bol zmenený, uložiť?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "Súbor %s existuje, prepísať?" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "Sú aktívne súborové operácie" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "Niektoré súborové operácie ešte neboli dokončené. Ukončenie Double Commanderu môže spôsobiť stratu dát." #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "Súbor %s je len na čítanie! Aj tak Vymazať?" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "Veľkosť \"%s\" je príliš veľká pro cieľový súborový systém!" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "Zložka %s existuje, prepísať?" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "Následuj symbolický odkaz \"%s\"?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "Neplatné meno súboru" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "" #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "Neplatný výber." #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "Nahrávam zoznam súborov..." #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "Kopírovať súbor %s" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "Zmazať súbor %s" #: ulng.rsmsglogerror msgid "Error: " msgstr "Chyba:" #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "Rozbaliť súbor %s" #: ulng.rsmsgloginfo msgid "Info: " msgstr "Info: " #: ulng.rsmsgloglink msgid "Create link %s" msgstr "Vytvoriť odkaz %s" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "Vytvoriť zložku %s" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "Presunúť súbor %s" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "Komprimovať do súboru %s" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "Odstrániť zložku %s" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "Hotovo:" #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "Vytvoriť symlink %s" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "Testovať integritu súboru %s" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "Ručne zadať hot path" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "Ručne upraviť hot path" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "Zadajte meno a cestu (formát name=path):" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "Hlavné heslo" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "Prosím, zadejte hlavné heslo:" #: ulng.rsmsgnewfile msgid "New file" msgstr "Nový súbor" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "Ďalšia časť bude rozbalená" #: ulng.rsmsgnofiles msgid "No files" msgstr "" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "Nie sú vybrané žiadne súbory." #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "Nie je dostatok voľného miesta na cieľovom disku! Pokračovať?" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "Nie je dostatok voľného miesta na cieľovom disku! Opakovať?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "Nedá sa vymazať súbor %s" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "Nie je implementované." #: ulng.rsmsgpassword msgid "Password:" msgstr "Heslo:" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "Prosím, zadejte heslo:" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "Heslo (Firewall):" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "&Pridať %s" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "&Konfigurovať" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "&Vymazať %s" #: ulng.rsmsgpresetalreadyexists #, fuzzy msgid "Preset \"%s\" already exists. Overwrite?" msgstr "Predvoľba \"%s\" už existuje. Nahradiť?" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "Premenovať/presunúť %d vybraných súborov/zložek?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "Premenovať/presunúť vybrané \"%s\"?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "Prosím, na uplatnenie zmien reštartujte program" #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "Prosím, vyberte len súbory s kontrolným súčtom!" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "Prosím, vyberte umiestnenie ďalšej časti" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "Nastaviť názov disku" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "Premenovať záložku" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "Nové meno záložky:" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "Cieľová cesta:" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "Bolo vybraných príliš veľa súborov." #: ulng.rsmsgurl msgid "URL:" msgstr "URL:" #: ulng.rsmsgusername msgid "User name:" msgstr "Užívateľské meno:" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "Užívateľské meno (Firewall):" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "Názov disku:" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "Prosím, zadajte veľkosť zväzku:" #: ulng.rsmsgwipefldr #, fuzzy msgid "Wipe %d selected files/directories?" msgstr "Bezpečne zmazať %d vybraných súborov/zložek?" #: ulng.rsmsgwipesel #, fuzzy msgid "Wipe selected \"%s\"?" msgstr "Bezpečne zmazať vybrané \"%s\"?" #: ulng.rsmulrenfilenamestylelist #, fuzzy #| msgid "No change;UPPERCASE;lowercase;First Char Big;" msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "Nemeniť;VEĽKÝM;malým;Prvý znak veľkým;Prvý Znak Každého Slova Veľkým;" #: ulng.rsoperaborted msgid "Aborted" msgstr "Prerušené" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "Počíta sa" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "" #: ulng.rsopercombining msgid "Joining" msgstr "" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopying msgid "Copying" msgstr "" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "Mazanie" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "" #: ulng.rsoperexecuting msgid "Executing" msgstr "" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "" #: ulng.rsoperextracting msgid "Extracting" msgstr "" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperfinished msgid "Finished" msgstr "Ukončené" #: ulng.rsoperlisting msgid "Listing" msgstr "" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "" #: ulng.rsopermoving msgid "Moving" msgstr "" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "" #: ulng.rsopernotstarted msgid "Not started" msgstr "Nespustené" #: ulng.rsoperpacking msgid "Packing" msgstr "" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpaused msgid "Paused" msgstr "Pozastavené" #: ulng.rsoperpausing msgid "Pausing" msgstr "Pozastavujem" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "V rade" #: ulng.rsoperrunning msgid "Running" msgstr "Beží" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "" #: ulng.rsopersplitting msgid "Splitting" msgstr "" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperstarting msgid "Starting" msgstr "Spúšťam" #: ulng.rsoperstopped msgid "Stopped" msgstr "Zastavené" #: ulng.rsoperstopping msgid "Stopping" msgstr "Zastavujem" #: ulng.rsopertesting msgid "Testing" msgstr "" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "Čakám na prístup k zdroju súborov" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "Čakám na reakciu užívateľa" #: ulng.rsoperwiping msgid "Wiping" msgstr "" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "" #: ulng.rsoperworking msgid "Working" msgstr "" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "Zmazať:" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "Rozbaliť bez cesty:" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "Mód kontroly formátu:" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "ID:" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "Pozícia ID:" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "Rozsah hľadania ID:" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "Parameter" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "Výzva pre zadanie hesla:" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "Vytvoriť samorozbalovací archív:" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "Skúška:" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "Meno typu archívu:" #: ulng.rsoptarchivevalue msgid "Value" msgstr "Hodnota" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "Asociovať zásuvný modul \"%s\" s:" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "Prvý;Posledný" #: ulng.rsoptdisable #, fuzzy msgid "Disable" msgstr "Zakázať" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "Povoliť" #: ulng.rsoptenterext msgid "Enter extension" msgstr "Zadajte príponu" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "Kurzor" #: ulng.rsoptexamplemark msgid "Mark" msgstr "Označiť" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "Označiť + Kurzor" #: ulng.rsoptexampletext msgid "Text" msgstr "Text" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "" #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "" #: ulng.rsopthotkeysdeletetrashcanoverrides msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "Klávesa" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "Horúce klávesy" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "Parametre" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "" #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "Klávesa sa už používa" #: ulng.rsopthotkeysshortcutusedtext1 #, fuzzy #| msgid "Shortcut %s is already used for %s." msgid "Shortcut %s is already used." msgstr "Klávesa %s sa už používa pre" #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "Zmeniť na %s?" #: ulng.rsopthotkeysusedby #, fuzzy #| msgid "used by" msgid "used for %s in %s" msgstr "použité pre %s %s" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "Archivátory" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "Automatická obnova" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "Funkcie" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "Farby" #: ulng.rsoptionseditorcolumnsview msgctxt "ulng.rsoptionseditorcolumnsview" msgid "Columns" msgstr "Stĺpce" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "Umiestnenie konfigurácie" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "" #: ulng.rsoptionseditorfileoperations #, fuzzy msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "Súborové operácie" #: ulng.rsoptionseditorfilepanels #, fuzzy msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "Panely súborov" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "Typy súborov" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "Záložky zložiek" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "Písma" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "Horúce klávesy" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "Ikony" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "Zoznam ignorovaných" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "Jazyk" #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "Rozvrhnutie" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "Log" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "Rozličné" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "Zásuvné moduly" #: ulng.rsoptionseditorquicksearch #, fuzzy #| msgid "Quick search" msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "Rýchle hľadanie/filter" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "Terminál" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "Nástroje" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "Bublinová pomoc" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "Ľavé tlačítko;Pravé tlačítko;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "Zásuvný modul %s je už priradený nasledujúcim príponám:" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "Aktívne" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "Názov súboru" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "Meno" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "Registrované pre" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "Abecedne; Prirodzené triedenie: abecedne a číselne" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "Hore;Dole" #: ulng.rsopttoolbarbuttontype msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "Nedajú sa zmeniť prístupové práva pre \"%s\"" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "Nedá sa zmeniť vlastník pre \"%s\"" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "Súbor" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "Zložka" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "Pomenovaná rúra" #: ulng.rspropsno msgid "No" msgstr "Nie" #: ulng.rspropssocket msgid "Socket" msgstr "Socket" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "Špeciálne blokové zariadenie" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "Špeciálne znakové zariadenie" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "Zástupca" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "Neznámy typ" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "Ano (%s)" #: ulng.rssearchresult msgid "Search result" msgstr "Výsledok hľadania:" #: ulng.rssearchtemplateunnamed msgid "" msgstr "" #: ulng.rsselectdir msgid "Select a directory" msgstr "Vybrať zložku" #: ulng.rsshowhelpfor msgid "&Show help for %s" msgstr "" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "Bajtov" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "Gigabajtov" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "Kilobajtov" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "Megabajtov" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "Terabajtov" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "Súborov: %d, Zložiek: %d, Veľkosť: %s (%s bajtov)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "Nedá sa vytvoriť cieľovú zložku!" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "Nesprávný formát veľkosti súboru!" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "Nedá sa rozdeliť súbor!" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "Počet častí je väčší ako 100! Pokračovať?" #: ulng.rssplitseldir msgid "Select directory:" msgstr "Zvoľte zložku:" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "Chyba pri vytváraní zástupcu." #: ulng.rssyndefaulttext msgid "Default text" msgstr "" #: ulng.rssynlangplaintext msgid "Plain text" msgstr "" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "Dňov" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "Hodina(hodiny,hodín)" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "Minúta(ty,t)" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "Mesiac(e,ov)" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "Sekunda(sekundy,sekúnd)" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "Týždeň(ne,ňov)" #: ulng.rstimeunityear msgid "Year(s)" msgstr "Rok(y,ov)" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "Porovnávač" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "Editor" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "Terminál" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "Prezerač" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "Prosím, založte do bug trackeru správu o tejto chybe s popisom, čo ste robili, a s nasledujúcim súborom:%s. Stlačte %s pre pokračovanie, alebo %s pre ukončenie programu." #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "Sieť" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "Interný prezerač Double Commandera." #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "Kódovanie" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "%s nebol nájdený!" doublecmd-0.5.8/language/doublecmd.sr.po0000644000175000017500000060463012250633131017217 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.0 beta\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-01-17 23:08+0300\n" "PO-Revision-Date: 2012-08-31 16:41+0100\n" "Last-Translator: Stojan Jović \n" "Language-Team: EastSideSquad \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Serbian\n" "X-Poedit-Country: SERBIA\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "Sve" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "Sve" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "Sve" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "Sve" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "Sve" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "Sve" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "Sve" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "Odustani" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "..." #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "->" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "<-" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "Konfiguriši sopstveni prikaz kolona" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "Pozadina:" #: tfcolumnssetconf.cbcursorborder.caption msgid "Cursor border" msgstr "Okvir kursora" #: tfcolumnssetconf.cbovercolor.caption msgid "Allow Overcolor" msgstr "Dozvoli različite boje fajlova" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "Upotrebi sopstvene font i boju" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "Boja Teksta:" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "Font:" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "Veličina:" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "Pozadina 2:" #: tfcolumnssetconf.lblconfigviewnr.caption msgid "Configure view nr:" msgstr "Konfiguriši prikaz br.:" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "Boja Kursora:" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "Boja Teksta Kursora:" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "Boja Označavanja:" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "Naziv:" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "Dodaj kolonu" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "Prilagodi kolonu:" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "Pregled" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "R" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption #, fuzzy #| msgid "Check free space" msgid "C&heck free space" msgstr "Proveri slobodan prostor" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption msgid "Cop&y attributes" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption msgid "Copy o&wnership" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption msgid "Copy d&ate/time" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption #, fuzzy #| msgid "Correct links" msgid "Correct lin&ks" msgstr "Ispravi linkove" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "Poništi samo-za-čitanje status" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption msgid "E&xclude empty directories" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption #, fuzzy #| msgid "Follow links" msgid "Fo&llow links" msgstr "Sledi linkove" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "" #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption #, fuzzy #| msgid "When directory exists" msgid "When dir&ectory exists" msgstr "Kada direktorijum postoji" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption #, fuzzy #| msgid "When file exists" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "Kada fajl postoji" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption msgid "When ca&nnot set property" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "" #: tfrmabout.btnclose.caption msgctxt "tfrmabout.btnclose.caption" msgid "&Close" msgstr "&Zatvori" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "O Programu" #: tfrmabout.lblbuild.caption msgid "Build" msgstr "Build" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "Free Pascal" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "Početna Strana:" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "http://doublecmd.sourceforge.net" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "Lazarus" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "Revizija" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption #, fuzzy #| msgid "Version %s" msgid "Version" msgstr "Verzija %s" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Odustani" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "&Resetuj" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "Izaberi atribute" #: tfrmattributesedit.cbarchive.caption #, fuzzy #| msgid "Archive" msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "Arhiviran" #: tfrmattributesedit.cbcompressed.caption #, fuzzy #| msgid "Compressed" msgid "Co&mpressed" msgstr "Kompresovan" #: tfrmattributesedit.cbdirectory.caption #, fuzzy #| msgid "Directory" msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "Direktorijum" #: tfrmattributesedit.cbencrypted.caption #, fuzzy #| msgid "Encrypted" msgid "&Encrypted" msgstr "Enkriptovan" #: tfrmattributesedit.cbhidden.caption #, fuzzy #| msgid "Hidden" msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "Skriven" #: tfrmattributesedit.cbreadonly.caption #, fuzzy #| msgid "Read only" msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "Samo za čitanje" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmattributesedit.cbsparse.caption #, fuzzy #| msgid "Sparse" msgid "S&parse" msgstr "Proređen" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Zalepljeno" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmattributesedit.cbsymlink.caption #, fuzzy #| msgid "Symlink" msgid "&Symlink" msgstr "Simbolički Link" #: tfrmattributesedit.cbsystem.caption #, fuzzy #| msgid "System" msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "Sistemski" #: tfrmattributesedit.cbtemporary.caption #, fuzzy #| msgid "Temporary" msgid "&Temporary" msgstr "Privremeni" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "NTFS atributi" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "Opšti atributi" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Biti:" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Grupa" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Ostalo" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Vlasnik" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "Izvrši" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "Pročitaj" #: tfrmattributesedit.lbltextattrs.caption #, fuzzy #| msgid "As text:" msgid "As te&xt:" msgstr "Kao tekst:" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "Piši" #: tfrmchecksumcalc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmchecksumcalc.caption msgctxt "tfrmchecksumcalc.caption" msgid "Calculate check sum..." msgstr "Izračunavanje kontrolne sume..." #: tfrmchecksumcalc.cbseparatefile.caption #, fuzzy #| msgid "Create separate checksum file for each file" msgid "C&reate separate checksum file for each file" msgstr "Kreiraj odvojen fajl kontrolne sume za svaki fajl" #: tfrmchecksumcalc.lblsaveto.caption #, fuzzy #| msgid "Save check sum file(s) to:" msgid "&Save check sum file(s) to:" msgstr "Snimi fajl(ove) kontrolne sume u:" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zatvori" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "Proveravanje kontrolne sume..." #: tfrmconnectionmanager.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "Dodaj" #: tfrmconnectionmanager.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmconnectionmanager.btnconnect.caption #, fuzzy #| msgid "Connect" msgid "C&onnect" msgstr "Konektuj se" #: tfrmconnectionmanager.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Obriši" #: tfrmconnectionmanager.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Uređivanje" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "Rukovalac konekcijama" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "Konektuj se na:" #: tfrmcopydlg.btnaddtoqueue.caption msgid "A&dd To Queue" msgstr "" #: tfrmcopydlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "tfrmcopydlg.btncreatespecialqueue.caption" msgid "..." msgstr "..." #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "O&pcije" #: tfrmcopydlg.btnsaveoptions.caption #, fuzzy #| msgid "Save these options as default" msgid "Sa&ve these options as default" msgstr "Snimi ove opcije kao podrazumevane" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "Kopiraj fajl(ove)" #: tfrmdescredit.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "Komentar fajla/direktorijuma" #: tfrmdescredit.lbleditcommentfor.caption #, fuzzy #| msgid "Edit comment for:" msgid "E&dit comment for:" msgstr "Uredi komentar za:" #: tfrmdescredit.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "Enkodiranje:" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "O programu" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "Automatsko upoređivanje" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "Binarni Mod" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "Odustani" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "Odustani" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "Kopiraj Blok Desno" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "Kopiraj Blok Desno" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "Kopiraj Blok Levo" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "Kopiraj Blok Levo" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Kopiraj" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Iseci" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Obriši" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Zalepi" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Ponovi" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "Označi &Sve" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Poništi" #: tfrmdiffer.actexit.caption msgctxt "tfrmdiffer.actexit.caption" msgid "E&xit" msgstr "I&zađi" #: tfrmdiffer.actfirstdifference.caption msgctxt "tfrmdiffer.actfirstdifference.caption" msgid "First Difference" msgstr "Prva Razlika" #: tfrmdiffer.actfirstdifference.hint msgctxt "tfrmdiffer.actfirstdifference.hint" msgid "First Difference" msgstr "Prva Razlika" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "Ignoriši Veličinu Slova" #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "Ignoriši Praznine" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "Nastavi Skrolovati" #: tfrmdiffer.actlastdifference.caption msgctxt "tfrmdiffer.actlastdifference.caption" msgid "Last Difference" msgstr "Poslednja Razlika" #: tfrmdiffer.actlastdifference.hint msgctxt "tfrmdiffer.actlastdifference.hint" msgid "Last Difference" msgstr "Poslednja Razlika" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "Razlike Linija" #: tfrmdiffer.actnextdifference.caption msgctxt "tfrmdiffer.actnextdifference.caption" msgid "Next Difference" msgstr "Sledeća Razlika" #: tfrmdiffer.actnextdifference.hint msgctxt "tfrmdiffer.actnextdifference.hint" msgid "Next Difference" msgstr "Sledeća Razlika" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "Otvori Levo..." #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "Otvori Desno..." #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "Oboji Pozadinu" #: tfrmdiffer.actprevdifference.caption msgctxt "tfrmdiffer.actprevdifference.caption" msgid "Previous Difference" msgstr "Prethodna Razlika" #: tfrmdiffer.actprevdifference.hint msgctxt "tfrmdiffer.actprevdifference.hint" msgid "Previous Difference" msgstr "Prethodna Razlika" #: tfrmdiffer.actreload.caption #, fuzzy #| msgid "Reload" msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "Učitaj Ponovo" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "Učitaj Ponovo" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "Snimi" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "Snimi" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "Snimi kao..." #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "Snimi kao..." #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "Snimi Levo" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "Snimi Levo" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "Snimi Levo Kao..." #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "Snimi Levo Kao..." #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "Snimi Desno" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "Snimi Desno" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "Snimi Desno Kao..." #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "Snimi Desno Kao..." #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "Uporedi" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "Uporedi" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "Enkodovanje" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "Enkodovanje" #: tfrmdiffer.caption msgctxt "tfrmdiffer.caption" msgid "Compare files" msgstr "Uporedi fajlove" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "'" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "'" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "'" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "'" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "'" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "'" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "'" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "'" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "'" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "'" #: tfrmdiffer.miencodingleft.caption #, fuzzy #| msgid "Left" msgid "&Left" msgstr "Levo" #: tfrmdiffer.miencodingright.caption #, fuzzy #| msgid "Right" msgid "&Right" msgstr "Desno" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "'" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "'" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "&Akcije" #: tfrmdiffer.mnuedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "Uređivanje" #: tfrmdiffer.mnuencoding.caption #, fuzzy #| msgid "Encoding" msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "Enkodovanje" #: tfrmdiffer.mnufile.caption #, fuzzy #| msgid "File" msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "Fajl" #: tfrmdiffer.mnuoptions.caption msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "&Opcije" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "" #: tfrmedithotkey.btncancel.caption msgctxt "tfrmedithotkey.btncancel.caption" msgid "&Cancel" msgstr "Odus&tani" #: tfrmedithotkey.btnok.caption msgctxt "tfrmedithotkey.btnok.caption" msgid "&OK" msgstr "&OK" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "" #: tfrmedithotkey.cghkcontrols.caption msgid "Only for these controls" msgstr "" #: tfrmedithotkey.lblparameters.caption msgid "&Parameters (each in a separate line):" msgstr "" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "O Programu" #: tfrmeditor.actabout.hint msgctxt "tfrmeditor.actabout.hint" msgid "About" msgstr "O Programu" #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "&Konfiguracija" #: tfrmeditor.actconfhigh.hint msgctxt "tfrmeditor.actconfhigh.hint" msgid "Configuration" msgstr "Konfiguracija" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Kopiraj" #: tfrmeditor.acteditcopy.hint msgctxt "tfrmeditor.acteditcopy.hint" msgid "Copy" msgstr "Kopiraj" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Iseci" #: tfrmeditor.acteditcut.hint msgctxt "tfrmeditor.acteditcut.hint" msgid "Cut" msgstr "Iseci" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Obriši" #: tfrmeditor.acteditdelete.hint msgctxt "tfrmeditor.acteditdelete.hint" msgid "Delete" msgstr "Obriši" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "P&ronađi" #: tfrmeditor.acteditfind.hint msgctxt "tfrmeditor.acteditfind.hint" msgid "Find" msgstr "Pronađi" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "Pronađi sledeći" #: tfrmeditor.acteditfindnext.hint msgctxt "tfrmeditor.acteditfindnext.hint" msgid "Find next" msgstr "Pronađi sledeći" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcr.hint msgctxt "tfrmeditor.acteditlineendcr.hint" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "tfrmeditor.acteditlineendcrlf.hint" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditlineendlf.hint msgctxt "tfrmeditor.acteditlineendlf.hint" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Zalepi" #: tfrmeditor.acteditpaste.hint msgctxt "tfrmeditor.acteditpaste.hint" msgid "Paste" msgstr "Zalepi" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Ponovi" #: tfrmeditor.acteditredo.hint msgctxt "tfrmeditor.acteditredo.hint" msgid "Redo" msgstr "Ponovi" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "&Zameni" #: tfrmeditor.acteditrplc.hint msgctxt "tfrmeditor.acteditrplc.hint" msgid "Replace" msgstr "Zameni" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "Označi&Sve" #: tfrmeditor.acteditselectall.hint msgctxt "tfrmeditor.acteditselectall.hint" msgid "Select All" msgstr "Označi Sve" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Poništi" #: tfrmeditor.acteditundo.hint msgctxt "tfrmeditor.acteditundo.hint" msgid "Undo" msgstr "Poništi" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "Za&tvori" #: tfrmeditor.actfileclose.hint msgctxt "tfrmeditor.actfileclose.hint" msgid "Close" msgstr "Zatvori" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "Iz&laz" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "&Novi" #: tfrmeditor.actfilenew.hint msgctxt "tfrmeditor.actfilenew.hint" msgid "New" msgstr "Novi" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "&Otvori" #: tfrmeditor.actfileopen.hint msgctxt "tfrmeditor.actfileopen.hint" msgid "Open" msgstr "Otvori" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "Sni&mi" #: tfrmeditor.actfilesave.hint msgctxt "tfrmeditor.actfilesave.hint" msgid "Save" msgstr "Snimi" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "Sn&imi Kao..." #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "Snimi S&ve" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "" #: tfrmeditor.caption msgctxt "TFRMEDITOR.CAPTION" msgid "Editor" msgstr "Editor" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "&Pomoć" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "'" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Uređivanje" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "Enko&dovanje" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "Otvori kao" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "Snimi kao" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "&Fajl" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "Sintaksno označavanje" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "'" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "'" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "'" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "'" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "'" #: tfrmeditor.n5.caption msgctxt "tfrmeditor.n5.caption" msgid "-" msgstr "'" #: tfrmeditsearchreplace.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "O&setljiv na velika/mala slova" #: tfrmeditsearchreplace.cbsearchfromcursor.caption #, fuzzy #| msgid "Search from &caret" msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "Pretraži &od znaka za umetanje" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "&Regularni izrazi" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "Označeni &tekst samo" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "&Cele reči samo" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "Opcija" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "&Zameni sa:" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "&Pretraga za:" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "Smer" #: tfrmextractdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmextractdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Pomoć" #: tfrmextractdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmextractdlg.caption msgctxt "tfrmextractdlg.caption" msgid "Unpack files" msgstr "Otpakuj fajlove" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "&Otpakuj nazive putanja ukoliko su sa fajlovima" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*.*" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "Otpakuj &svaku arhivu u zaseban pod-direktorijum (naziv arhive)" #: tfrmextractdlg.cboverwrite.caption #, fuzzy #| msgid "&Overwrite existing files" msgid "O&verwrite existing files" msgstr "&Prepiši postojeće fajlove" #: tfrmextractdlg.lblextractto.caption #, fuzzy #| msgid "To the directory:" msgid "To the &directory:" msgstr "U direktorijum:" #: tfrmextractdlg.lblfilemask.caption #, fuzzy #| msgid "Extract files matching file mask:" msgid "&Extract files matching file mask:" msgstr "Raspakuj fajlove koji odgovaraju masci fajla:" #: tfrmextractdlg.lblpassword.caption #, fuzzy #| msgid "Password for encrypted files:" msgid "&Password for encrypted files:" msgstr "Lozinka za enkriptovane fajlove:" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "Dodaj" #: tfrmfileassoc.btnaddext.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "Dodaj" #: tfrmfileassoc.btnaddnewtype.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "Dodaj" #: tfrmfileassoc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmfileassoc.btndownact.caption #, fuzzy #| msgid "Down" msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "Dole" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmfileassoc.btnremoveact.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "Ukloni" #: tfrmfileassoc.btnremoveext.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "Ukloni" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "X" #: tfrmfileassoc.btnremovetype.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "Ukloni" #: tfrmfileassoc.btnrenametype.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "Preimenuj" #: tfrmfileassoc.btnupact.caption #, fuzzy #| msgid "Up" msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "Gore" #: tfrmfileassoc.caption msgid "File associations" msgstr "Asocijacije fajlova" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "Akcije" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "Ekstenzije" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "Tipovi fajla" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "Ikonica" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "Akcija:" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "&Komanda" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "Uređivanje" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "Otvori u editoru" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "Naziv fajla" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "Putanja fajla" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "Puna putanja" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "Preuzmi izlaz od komande" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "Otvori" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "Pokreni u terminalu" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "Otvori u VFS-u" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "Pregled" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "Otvori u Pregledniku" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zatvori" #: tfrmfileexecuteyourself.caption msgctxt "tfrmfileexecuteyourself.caption" msgid "Wait..." msgstr "Pričekaj..." #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "Naziv fajla:" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "Od:" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "Klikni na Zatvori kada privremeni fajl može biti obrisan!" #: tfrmfileop.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "Iz:" #: tfrmfileop.lblto.caption msgid "To:" msgstr "U:" #: tfrmfileproperties.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Zatvori" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "" #: tfrmfileproperties.caption msgctxt "tfrmfileproperties.caption" msgid "Properties" msgstr "Svojstva" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Zalepljeno" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "Vlasnik" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Biti:" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Grupa" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Ostali" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Vlasnik" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmfileproperties.lblattrtextstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Tekst:" #: tfrmfileproperties.lblcontains.caption msgctxt "tfrmfileproperties.lblcontains.caption" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Izvši" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "Naziv fajla" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "Naziv:" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "Naziv fajla" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "Putanja:" #: tfrmfileproperties.lblgroupstr.caption #, fuzzy #| msgid "Group" msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "Grupa" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "Poslednji pristup:" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "Poslednja modifikacija:" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "Poslednja promena statusa:" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Oktalni:" #: tfrmfileproperties.lblownerstr.caption #, fuzzy #| msgid "Owner" msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "Vlasnik" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Pročitaj" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "Veličina:" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption msgid "Symlink to:" msgstr "Simbolički link ka:" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption msgid "Type:" msgstr "Tip:" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Piši" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atributi" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "Svojstva" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "&Dodaj" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "&Pomoć" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zatvori" #: tfrmfinddlg.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmfinddlg.btnedit.caption" msgid "&Edit" msgstr "Uređivanje" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "&Idi na fajl" #: tfrmfinddlg.btnlastsearch.caption msgid "&Last search" msgstr "" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "&Nova pretraga" #: tfrmfinddlg.btnsavetemplate.caption #, fuzzy #| msgid "Save" msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "Snimi" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "&Obriši" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "&Učitaj" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "&Snimi" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption msgid "Sa&ve with \"Start in directory\"" msgstr "" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "" #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "Po&kreni" #: tfrmfinddlg.btnstop.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "Odustani" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "P®led" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "Dopuni &listu" #: tfrmfinddlg.caption msgctxt "tfrmfinddlg.caption" msgid "Find files" msgstr "Pronađi fajlove" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "Osetljiv na &veličinu slova" #: tfrmfinddlg.cbdatefrom.caption #, fuzzy #| msgid "Date From:" msgid "&Date from:" msgstr "Datum Od:" #: tfrmfinddlg.cbdateto.caption #, fuzzy #| msgid "Date To:" msgid "Dat&e to:" msgstr "Datum Do:" #: tfrmfinddlg.cbfilesizefrom.caption #, fuzzy #| msgid "Size from:" msgid "S&ize from:" msgstr "Veličina od:" #: tfrmfinddlg.cbfilesizeto.caption #, fuzzy #| msgid "Size to:" msgid "Si&ze to:" msgstr "Veličina do:" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "Pronađi &tekst u fajlu" #: tfrmfinddlg.cbfollowsymlinks.caption #, fuzzy #| msgid "Follow symlinks" msgctxt "tfrmfinddlg.cbfollowsymlinks.caption" msgid "Follow s&ymlinks" msgstr "Prati simboličke linkove" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "Pronađi fajlove koji N&E sadrže tekst" #: tfrmfinddlg.cbnotolderthan.caption #, fuzzy #| msgid "Not older than:" msgid "N&ot older than:" msgstr "Ne stariji od:" #: tfrmfinddlg.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name " msgid "Searc&h for part of file name" msgstr "Pretraga za delom naziva fajla" #: tfrmfinddlg.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "&Regularni izrazi" #: tfrmfinddlg.cbreplacetext.caption msgid "Re&place by" msgstr "Za&meni sa" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "" #: tfrmfinddlg.cbtimefrom.caption #, fuzzy #| msgid "Time from:" msgid "&Time from:" msgstr "Vreme od:" #: tfrmfinddlg.cbtimeto.caption #, fuzzy #| msgid "Time to:" msgid "Ti&me to:" msgstr "Vreme do:" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "&Upotrebi dodatak za pretragu" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption msgctxt "tfrmfinddlg.gbdirectories.caption" msgid "Directories" msgstr "" #: tfrmfinddlg.gbfiles.caption msgctxt "tfrmfinddlg.gbfiles.caption" msgid "Files" msgstr "" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "Pronađi Podatke" #: tfrmfinddlg.lblattributes.caption msgid "Attri&butes" msgstr "" #: tfrmfinddlg.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "Enkodiranje:" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "Maska &fajla" #: tfrmfinddlg.lblfindpathstart.caption #, fuzzy #| msgid "&Start in directory" msgid "Start in &directory" msgstr "&Direktorijum" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "P&retraži pod-direktorijume" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "&Prethodne pretrage" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "Ukloni iz liste" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "Prikaži sve pronađene stavke" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "Prikaži U Pregledniku" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "Napredno" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "Učitaj/Snimi" #: tfrmfinddlg.tsplugins.caption msgctxt "tfrmfinddlg.tsplugins.caption" msgid "Plugins" msgstr "Dodaci" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "Rezultati" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "Standardno" #: tfrmfindview.btnclose.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmfindview.btnfind.caption #, fuzzy #| msgid "Find" msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "Pronađi" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "Pronađi" #: tfrmfindview.cbcasesens.caption #, fuzzy #| msgid "Case sensitive" msgid "C&ase sensitive" msgstr "Osetljiv na veličinu slova" #: tfrmhardlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmhardlink.caption msgid "Create hard link" msgstr "Kreiraj hard-link" #: tfrmhardlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Odredište na koje će link da pokazuje" #: tfrmhardlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Naziv linka" #: tfrmhotdir.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "Dodaj" #: tfrmhotdir.btnaddman.caption #, fuzzy #| msgid "Add manually" msgid "Add &manually" msgstr "Dodaj ručno" #: tfrmhotdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmhotdir.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Obriši" #: tfrmhotdir.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Uređivanje" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "Omiljeni Direktorijumi" #: tfrmlinker.btnexit.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmlinker.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "..." #: tfrmlinker.caption msgctxt "tfrmlinker.caption" msgid "Linker" msgstr "Linker" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "Snimi u..." #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "Stavka" #: tfrmlinker.lblfilename.caption #, fuzzy #| msgid "File name" msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "Naziv fajla" #: tfrmlinker.spbtndel.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "Obriši" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "Obriši" #: tfrmlinker.spbtndown.caption #, fuzzy #| msgid "Down" msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "Dole" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "Dole" #: tfrmlinker.spbtnup.caption #, fuzzy #| msgid "Up" msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "Gore" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "Gore" #: tfrmmain.actabout.caption msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "&O Programu" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "Dodaj naziv fajla u komandnu liniju" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "Dodaj putanju i naziv fajla u komandnu liniju" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "Kopiraj putanju u komandnu liniju" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "" #: tfrmmain.actcalculatespace.caption msgid "Calculate &Occupied Space" msgstr "Proračunaj Zauzeti Prostor" #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "Promeni direktorijum" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "Promeni Direktorijum Na Prvi Iznad" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "Promeni direktorijum na korenski" #: tfrmmain.actchecksumcalc.caption msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "Proračunaj Kontrolnu &Sumu..." #: tfrmmain.actchecksumverify.caption msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "&Proveri Kontrolnu Sumu..." #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "Isprazni fajl za logovanje" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "Isprazni prozor za logovanje" #: tfrmmain.actclosealltabs.caption #, fuzzy #| msgid "Remove &All Tabs" msgctxt "tfrmmain.actclosealltabs.caption" msgid "Close &All Tabs" msgstr "Ukloni &Sve Tabove" #: tfrmmain.actclosetab.caption #, fuzzy #| msgid "&Remove Tab" msgctxt "tfrmmain.actclosetab.caption" msgid "&Close Tab" msgstr "&Ukloni Tab" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "&Uporedi po Sadržaju" #: tfrmmain.actcomparedirectories.caption msgctxt "tfrmmain.actcomparedirectories.caption" msgid "Compare Directories" msgstr "" #: tfrmmain.actcomparedirectories.hint msgctxt "tfrmmain.actcomparedirectories.hint" msgid "Compare Directories" msgstr "" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "Prikaži kontekst meni" #: tfrmmain.actcopy.caption #, fuzzy #| msgid "Copy F5" msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "Kopiraj F5" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "Kopiraj Naziv Fajla(ova) sa Punom &Putanjom" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "Kopiraj Naziv &Fajla(ova) u Privremeni Spremnik" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "Kopiraj fajlove bez traženja potvrde" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "Kopiraj u okviru iste radne površine" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "&Kopiraj" #: tfrmmain.actcountdircontent.caption msgid "Sho&w Occupied Space" msgstr "P&rikaži Zauzeti Prostor" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "I&seci" #: tfrmmain.actdelete.caption #, fuzzy #| msgid "Delete F8" msgctxt "tfrmmain.actdelete.caption" msgid "Delete" msgstr "Obriši F8" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "Istorija direktorijuma" #: tfrmmain.actdirhotlist.caption msgid "Directory &Hotlist" msgstr "Omiljeni &Direktorijumi" #: tfrmmain.actedit.caption #, fuzzy #| msgid "Edit F4" msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "Uređivanje F4" #: tfrmmain.acteditcomment.caption msgid "Edit Co&mment..." msgstr "Uredi Ko&mentar..." #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "Uredi novi fajl" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "Uredi polje putanje iznad liste fajla" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "Zameni Radne &Površine" #: tfrmmain.actexit.caption msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "I&zađi" #: tfrmmain.actextractfiles.caption msgid "&Extract Files..." msgstr "Raspaku&j Fajlove..." #: tfrmmain.actfileassoc.caption msgid "File &Associations..." msgstr "&Asocijacije Fajla..." #: tfrmmain.actfilelinker.caption msgid "Com&bine Files..." msgstr "Kom&binuj Fajlove..." #: tfrmmain.actfileproperties.caption msgid "Show &File Properties" msgstr "Prikaži Svojstva &Fajla" #: tfrmmain.actfilespliter.caption msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "Razdvoj&i Fajl..." #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "Fokusiraj komandnu liniju" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "Postavi kursor na prvi fajl u listi" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "Postavi kursor na poslednji fajl u listi" #: tfrmmain.acthardlink.caption msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "Kreiraj &Hard-link..." #: tfrmmain.acthelpindex.caption msgid "&Contents" msgstr "&Sadržaj" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "&Horizontalni Mod Radnih Površina" #: tfrmmain.actkeyboard.caption msgid "&Keyboard" msgstr "&Tastatura" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "Levo &= Desno" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "Otvori levu listu drajvova" #: tfrmmain.actloadselectionfromclip.caption msgid "Load Selection from Clip&board" msgstr "Učitaj Selekciju iz &Privremenog Spremnika" #: tfrmmain.actloadselectionfromfile.caption msgid "&Load Selection from File..." msgstr "Učitaj &Selekciju iz Fajla..." #: tfrmmain.actmakedir.caption #, fuzzy #| msgid "MakeDir F7" msgid "MakeDir" msgstr "KreirajDir F7" #: tfrmmain.actmarkcurrentextension.caption msgid "Select All with the Same E&xtension" msgstr "Označi Sve sa Istom E&kstenzijom" #: tfrmmain.actmarkinvert.caption msgid "&Invert Selection" msgstr "&Inverzna Selekcija" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "&Označi Sve" #: tfrmmain.actmarkminus.caption msgid "Unselect a Gro&up..." msgstr "Poništi Označavanje Gr&upe..." #: tfrmmain.actmarkplus.caption msgid "Select a &Group..." msgstr "Označi &Grupu..." #: tfrmmain.actmarkunmarkall.caption msgid "&Unselect All" msgstr "Poništi O&značavanje Svih" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "Minimiziraj prozor" #: tfrmmain.actmultirename.caption msgid "Multi &Rename Tool" msgstr "Alat za Višestruko P&reimenovavanje" #: tfrmmain.actnetworkconnect.caption msgid "Network &Connect..." msgstr "Povezivanje na &Mrežu..." #: tfrmmain.actnetworkdisconnect.caption msgid "Network &Disconnect" msgstr "Od&vajanje sa Mreže" #: tfrmmain.actnetworkquickconnect.caption msgid "Network &Quick Connect..." msgstr "&Brzo Povezivanje na Mrežu..." #: tfrmmain.actnewtab.caption msgid "&New Tab" msgstr "&Novi Tab" #: tfrmmain.actnexttab.caption msgid "Switch to Nex&t Tab" msgstr "Prebaci se &na Sledeći Tab" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "Otvori" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "Pokušaj otvoriti arhivu" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "?Otvori bar fajl" #: tfrmmain.actopendirinnewtab.caption msgid "Open &Folder in a New Tab" msgstr "Otvori &Direktorijum u Novom Tabu" #: tfrmmain.actopenvirtualfilesystemlist.caption msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "Otvori &VFS Listu" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "Pre&glednik Operacija" #: tfrmmain.actoptions.caption msgid "&Options..." msgstr "&Opcije..." #: tfrmmain.actpackfiles.caption msgid "&Pack Files..." msgstr "Za&pakuj Fajlove..." #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "Postavi poziciju razdelnika" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "&Zalepi" #: tfrmmain.actprevtab.caption msgid "Switch to &Previous Tab" msgstr "Prebaci se &na Prethodni Tab" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "Brzi filter" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "Brza pretraga" #: tfrmmain.actquickview.caption msgid "&Quick View Panel" msgstr "&Brzi Pregled Radne Površine" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "&Osveži" #: tfrmmain.actrename.caption #, fuzzy #| msgid "Move F6" msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "Premesti F6" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "Premesti/Preimenuj fajlove bez traženja potvrde" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "Preimenuj" #: tfrmmain.actrenametab.caption #, fuzzy #| msgid "Re&name Tab" msgid "&Rename Tab" msgstr "Preime&nuj Tab" #: tfrmmain.actrestoreselection.caption msgid "&Restore Selection" msgstr "Pov&rati Selekciju" #: tfrmmain.actreverseorder.caption msgid "Re&verse Order" msgstr "O&brtanje Redosleda" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "Desno &= Levo" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "Otvori desnu listu drajvova" #: tfrmmain.actrunterm.caption msgid "Run &Terminal" msgstr "Pokreni &Terminal" #: tfrmmain.actsaveselection.caption msgid "Sa&ve Selection" msgstr "Sni&mi Selekciju" #: tfrmmain.actsaveselectiontofile.caption msgid "Save S&election to File..." msgstr "Snimi S&elekciju u Fajl..." #: tfrmmain.actsearch.caption msgid "&Search..." msgstr "&Pretraga..." #: tfrmmain.actsetfileproperties.caption msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "Promeni &Atribute..." #: tfrmmain.actsettaboptiondirsinnewtab.caption msgid "Locked with Directories Opened in New &Tabs" msgstr "Zaključan uz Direktorijume Otvorene u Novim &Tabovima" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "&Normalan" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "&Zaključan" #: tfrmmain.actsettaboptionpathresets.caption msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "Zaključan uz &Dozvoljene Promene Direktorijuma" #: tfrmmain.actshellexecute.caption msgctxt "tfrmmain.actshellexecute.caption" msgid "Open" msgstr "Otvori" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "Prikaži meni sa dugmadima" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "Prikaži istoriju komandne linije" #: tfrmmain.actshowmainmenu.caption #, fuzzy #| msgid "Menu F9" msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "Meni F9" #: tfrmmain.actshowsysfiles.caption msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "Prikaži &Skrivene/Sistemske Fajlove" #: tfrmmain.actsortbyattr.caption msgid "Sort by &Attributes" msgstr "Sortiraj po &Atributima" #: tfrmmain.actsortbydate.caption msgid "Sort by &Date" msgstr "Sortiraj po &Datumu" #: tfrmmain.actsortbyext.caption msgid "Sort by &Extension" msgstr "Sortiraj po &Ekstenziji" #: tfrmmain.actsortbyname.caption msgid "Sort by &Name" msgstr "Sortiraj po &Nazivu" #: tfrmmain.actsortbysize.caption msgid "Sort by &Size" msgstr "Sortiraj po &Veličini" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "Omogući/onemogući fajl liste ignorisanja da ne prikazuje nazive fajlova" #: tfrmmain.actsymlink.caption msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "Kreiraj Simbolički &Link..." #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "Odredište &= Izvor" #: tfrmmain.acttestarchive.caption msgid "&Test Archive(s)" msgstr "&Testiraj Arhivu(e)" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "Prebaci dir ispod kursora u levi prozor" #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "Prebaci dir ispod kursora u desni prozor" #: tfrmmain.actunmarkcurrentextension.caption msgid "Unselect All with the Same Ex&tension" msgstr "Poništi Označavanje Svih sa Istom &Ekstenzijom" #: tfrmmain.actview.caption #, fuzzy #| msgid "View F3" msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "Pregled F3" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "Prikaži istoriju posećivanih putanja za aktivni pogled" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "Idi na sledeći unos u istoriji" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "Idi na prethodni unos u istoriji" #: tfrmmain.actvisithomepage.caption msgid "&Visit Double Commander Website" msgstr "&Poseti Double Commander-ovu WEB Stranicu" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "Briši" #: tfrmmain.btnf10.caption #, fuzzy #| msgid "Exit F10" msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "Izađi F9" #: tfrmmain.btnf8.caption msgctxt "tfrmmain.btnf8.caption" msgid "Delete" msgstr "Obriši" #: tfrmmain.btnf9.caption #, fuzzy #| msgid "Terminal F9" msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "Terminal F9" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.HINT" msgid "Directory hotlist" msgstr "Omiljeni direktorijumi" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "<" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "Prikaži tekući direktorijum desne radne površine u levoj radnoj površini" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnlefthome.hint msgctxt "TFRMMAIN.BTNLEFTHOME.HINT" msgid "Go to home directory" msgstr "Idi u matični direktorijum" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgctxt "TFRMMAIN.BTNLEFTROOT.HINT" msgid "Go to root directory" msgstr "Idi u korenski direktorijum" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgctxt "TFRMMAIN.BTNLEFTUP.HINT" msgid "Go to parent directory" msgstr "Idi u direktorijum iznad" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr ">" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "Prikaži tekući direktorijum leve radne površine u desnoj radnoj površini" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "tfrmmain.caption" msgid "Double Commander" msgstr "Double Commander" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "Putanja" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "&20/80" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "&30/70" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "&40/60" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "&50/50" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "&60/40" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "&70/30" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "&80/20" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "Odustani" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "Kopiraj..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "Kreiraj link..." #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline33.caption msgctxt "tfrmmain.miline33.caption" msgid "-" msgstr "'" #: tfrmmain.miline37.caption msgctxt "tfrmmain.miline37.caption" msgid "-" msgstr "'" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "-" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "Obriši" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "Kopiraj" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "Sakrij" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "Označi Sve" #: tfrmmain.mimove.caption msgid "Move..." msgstr "Premesti..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "Kreiraj simbolički link..." #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "Tab opcije" #: tfrmmain.mitrayiconexit.caption msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "I&zađi" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "Povrati Prethodno" #: tfrmmain.mnualloperpause.caption msgctxt "tfrmmain.mnualloperpause.caption" msgid "||" msgstr "||" #: tfrmmain.mnualloperstart.caption msgctxt "tfrmmain.mnualloperstart.caption" msgid "Start" msgstr "Pokreni" #: tfrmmain.mnualloperstop.caption msgctxt "tfrmmain.mnualloperstop.caption" msgid "Cancel" msgstr "Odustani" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "&Komande" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "K&onfiguracija" #: tfrmmain.mnufiles.caption msgid "&Files" msgstr "&Fajlovi" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "&Pomoć" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "Oz&načavanje" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "Mreža" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "P&rikaz" #: tfrmmain.mnutaboptions.caption msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "&Opcije" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "&Tabovi" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "CD" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "Kopiraj" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "Iseci" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "Obriši" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "Uređivanje" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "Zalepi" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmmaskinputdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmmaskinputdlg.btndefinetemplate.caption #, fuzzy #| msgid "Define..." msgid "&Define..." msgstr "Definiši..." #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmmaskinputdlg.lblsearchtemplate.caption #, fuzzy #| msgid "Or select predefined selection type:" msgid "O&r select predefined selection type:" msgstr "Ili označi predefinisani tip selekcije:" #: tfrmmkdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmmkdir.caption msgid "Create new directory" msgstr "Kreiraj novi direktorijum" #: tfrmmkdir.lblmakedir.caption #, fuzzy #| msgid "Input new directory name:" msgid "&Input new directory name:" msgstr "Unesi naziv novog direktorijuma:" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "Pr" #: tfrmmodview.caption msgctxt "tfrmmodview.caption" msgid "New Size" msgstr "Nova Veličina" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "Visina :" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgid "2" msgstr "2" #: tfrmmodview.lblpath3.caption msgid "3" msgstr "3" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "4" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "5" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "Kvalitet kompresije u JPG" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "Širina :" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "BMP" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "ICO" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "JPG" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "PNG" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "PNM" #: tfrmmodview.teheight.text msgid "Height" msgstr "Visina" #: tfrmmodview.tequality.text msgid "80" msgstr "80" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "Širina" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zatvori" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "&Obriši" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "&Učitaj" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "&Preimenuj" #: tfrmmultirename.btnrestore.caption #, fuzzy #| msgid "Reset all" msgid "Reset &all" msgstr "Poništi sve" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "&Snimi" #: tfrmmultirename.caption msgctxt "tfrmmultirename.caption" msgid "MultiRename" msgstr "VišestrukoPreimenovavanje" #: tfrmmultirename.cblog.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "Omogući" #: tfrmmultirename.cbregexp.caption msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "Re&gularni izrazi" #: tfrmmultirename.cbusesubs.caption msgid "&Use substitution" msgstr "Upo&trebi zamenu" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption msgid "[E] Extension" msgstr "[E] Ekstenzija" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "Brojač" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "Pronađi && Zameni" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "Rezultat Loga" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "Maska" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "Prepodešavanja" #: tfrmmultirename.lbext.caption msgid "&Extension" msgstr "&Ekstenzija" #: tfrmmultirename.lbfind.caption msgid "&Find..." msgstr "&Pronađi..." #: tfrmmultirename.lbinterval.caption #, fuzzy #| msgid "Interval" msgid "&Interval" msgstr "Interval" #: tfrmmultirename.lbname.caption msgid "File &Name" msgstr "&Naziv Fajla" #: tfrmmultirename.lbreplace.caption msgid "Re&place..." msgstr "Za&meni..." #: tfrmmultirename.lbstnb.caption #, fuzzy #| msgid "Start Number" msgid "S&tart Number" msgstr "Početni Broj" #: tfrmmultirename.lbwidth.caption #, fuzzy #| msgid "Width" msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "Širina" #: tfrmmultirename.micounter.caption msgid "[C] Counter" msgstr "[C] Brojač" #: tfrmmultirename.miday.caption msgid "[D] Day" msgstr "[D] Dan" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "[DD] Dan (2 cifre)" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "[DDD] Dan u nedelji (skraćeno, npr., \"mon\")" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "[DDDD] Dan u nedelji (puni naziv, npr., \"monday\")" #: tfrmmultirename.miextensionx.caption msgid "[Ex] Character at position x" msgstr "[Ex] Karakter na poziciji x" #: tfrmmultirename.miextensionxx.caption msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:y] Karakteri od pozicije x do y" #: tfrmmultirename.mihour.caption msgid "[h] Hour" msgstr "[h] Sat" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "[hh] Sat (2 cifre)" #: tfrmmultirename.miminute.caption msgid "[n] Minute" msgstr "[n] Minut" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "[nn] Minut (2 cifre)" #: tfrmmultirename.mimonth.caption msgid "[M] Month" msgstr "[M] Mesec" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "[MM] Mesec (2 cifre)" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "[MMM] Naziv meseca (skraćeno, npr., \"jan\")" #: tfrmmultirename.mimonth3.caption #, fuzzy #| msgid "[MMMM] Month name (long, e.g. \"january\")" msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "[MMMM] Naziv meseca (puni naziv, npr. \"january\")" #: tfrmmultirename.miname.caption msgid "[N] Name" msgstr "[N] Naziv" #: tfrmmultirename.minamex.caption msgid "[Nx] Character at position x" msgstr "[Nx] Karakter na poziciji x" #: tfrmmultirename.minamexx.caption msgid "[Nx:y] Characters from position x to y" msgstr "[Nx:y] Karakteri od pozicije x do y" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "Vreme..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "Ekstenzija..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "Naziv..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "Dodatak" #: tfrmmultirename.misecond.caption msgid "[s] Second" msgstr "[s] Sekunda" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "[ss] Sekunda (2 cifre)" #: tfrmmultirename.miyear.caption msgid "[Y] Year (2 digits)" msgstr "[Y] Godina (2 cifre)" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "[YYYY] Godina (4 cifre)" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "tfrmmultirename.stringgrid.columns[0].title.caption" msgid "Old File Name" msgstr "Stari Naziv Fajla" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "tfrmmultirename.stringgrid.columns[1].title.caption" msgid "New File Name" msgstr "Novi Naziv Fajla" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "tfrmmultirename.stringgrid.columns[2].title.caption" msgid "File Path" msgstr "Putanja Fajla" #: tfrmopenwith.caption msgid "Choose an application" msgstr "" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "" #: tfrmoptions.btnapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "Primeni" #: tfrmoptions.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmoptions.caption msgctxt "tfrmoptions.caption" msgid "Options" msgstr "Opcije" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "" #: tfrmoptionsarchivers.btnautoconfig.caption msgid "A&uto Configure" msgstr "" #: tfrmoptionsarchivers.btnmultiarcadd.caption msgctxt "tfrmoptionsarchivers.btnmultiarcadd.caption" msgid "A&dd" msgstr "Dodaj" #: tfrmoptionsarchivers.btnmultiarcapply.caption msgctxt "tfrmoptionsarchivers.btnmultiarcapply.caption" msgid "A&pply" msgstr "" #: tfrmoptionsarchivers.btnmultiarcdelete.caption msgctxt "tfrmoptionsarchivers.btnmultiarcdelete.caption" msgid "D&elete" msgstr "" #: tfrmoptionsarchivers.btnmultiarcrename.caption msgctxt "tfrmoptionsarchivers.btnmultiarcrename.caption" msgid "&Rename" msgstr "&Preimenuj" #: tfrmoptionsarchivers.chkmultiarcdebug.caption msgid "De&bug mode" msgstr "" #: tfrmoptionsarchivers.chkmultiarcenabled.caption msgid "E&nabled" msgstr "" #: tfrmoptionsarchivers.chkmultiarcoutput.caption msgid "S&how console output" msgstr "" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "tfrmoptionsarchivers.gbarchiveroptions.caption" msgid "Options" msgstr "Opcije" #: tfrmoptionsarchivers.lblarchiveadd.caption msgid "Add&ing:" msgstr "" #: tfrmoptionsarchivers.lblarchiveextension.caption msgid "E&xtension:" msgstr "" #: tfrmoptionsarchivers.lblarchiveextract.caption msgid "Ex&tract:" msgstr "" #: tfrmoptionsarchivers.lblarchivelist.caption msgid "&List:" msgstr "" #: tfrmoptionsarchivers.lblarchivelistend.caption msgid "Listing &finish (optional):" msgstr "" #: tfrmoptionsarchivers.lblarchivelistformat.caption msgid "Listing for&mat:" msgstr "" #: tfrmoptionsarchivers.lblarchiveliststart.caption msgid "Listin&g start (optional):" msgstr "" #: tfrmoptionsarchivers.lblarchiver.caption msgid "Arc&hiver:" msgstr "" #: tfrmoptionsarchivers.lbldescription.caption msgid "De&scription:" msgstr "" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "tfrmoptionsarchivers.tbarchiveradditional.caption" msgid "Additional" msgstr "Dodatni" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "tfrmoptionsarchivers.tbarchivergeneral.caption" msgid "General" msgstr "Opšti" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption msgctxt "tfrmoptionsautorefresh.cbwatchattributeschange.caption" msgid "When &size, date or attributes change" msgstr "Kada &se veličina, datum i atributi promene" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "tfrmoptionsautorefresh.cbwatchexcludedirs.caption" msgid "For the following &paths and their subdirectories:" msgstr "Za sledeće &putanje i njihove pod-direktorijume:" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption msgid "When &files are created, deleted or renamed" msgstr "" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption msgctxt "tfrmoptionsautorefresh.cbwatchonlyforeground.caption" msgid "When application is in the &background" msgstr "Kada je &aplikacija u pozadini" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "tfrmoptionsautorefresh.gbautorefreshdisable.caption" msgid "Disable auto-refresh" msgstr "Onemogući auto-osvežavanje" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "tfrmoptionsautorefresh.gbautorefreshenable.caption" msgid "Refresh file list" msgstr "Osveži listu fajlova" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption msgid "Al&ways show tray icon" msgstr "" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption msgid "Automatically &hide unmounted devices" msgstr "" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "tfrmoptionsbehavior.cbminimizetotray.caption" msgid "Mo&ve icon to system tray when minimized" msgstr "&Smesti ikonicu u sistem 'tray' kada je minimizovan" #: tfrmoptionsbehavior.cbonlyonce.caption msgid "A&llow only one copy of DC at a time" msgstr "" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "" #: tfrmoptionsbehavior.lbldrivesblacklist.caption msgid "Drives &blacklist" msgstr "" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption msgid "Cut &text to column width" msgstr "" #: tfrmoptionscolumnsview.cbgridhorzline.caption msgid "&Horizontal lines" msgstr "" #: tfrmoptionscolumnsview.cbgridvertline.caption msgid "&Vertical lines" msgstr "" #: tfrmoptionscolumnsview.chkautofillcolumns.caption msgid "A&uto fill columns" msgstr "" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "" #: tfrmoptionscolumnsview.lblautosizecolumn.caption msgid "Auto si&ze column:" msgstr "" #: tfrmoptionsconfiguration.btnconfigapply.caption msgctxt "tfrmoptionsconfiguration.btnconfigapply.caption" msgid "A&pply" msgstr "" #: tfrmoptionsconfiguration.btnconfigedit.caption msgctxt "tfrmoptionsconfiguration.btnconfigedit.caption" msgid "&Edit" msgstr "&Uređivanje" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption msgid "Co&mmand line history" msgstr "" #: tfrmoptionsconfiguration.cbdirhistory.caption msgid "&Directory history" msgstr "" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption msgid "&File mask history" msgstr "" #: tfrmoptionsconfiguration.chksaveconfiguration.caption msgid "Sa&ve configuration" msgstr "" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption msgid "Searc&h/Replace history" msgstr "" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgctxt "tfrmoptionsconfiguration.gblocconfigfiles.caption" msgid "Location of configuration files" msgstr "Lokacija kofiguracionih fajlova" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgctxt "tfrmoptionsconfiguration.gbsaveonexit.caption" msgid "Save on exit" msgstr "Snimi na izlazu" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgctxt "tfrmoptionsconfiguration.lblcmdlineconfigdir.caption" msgid "Set on command line" msgstr "Postavi na komandnu liniju" #: tfrmoptionsconfiguration.rbprogramdir.caption msgid "P&rogram directory (portable version)" msgstr "" #: tfrmoptionsconfiguration.rbuserhomedir.caption msgid "&User home directory" msgstr "" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption msgid "C&opy" msgstr "" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption msgctxt "tfrmoptionscustomcolumns.btndelcolumnsset.caption" msgid "&Delete" msgstr "O&briši" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption msgctxt "tfrmoptionscustomcolumns.btneditcolumnsset.caption" msgid "&Edit" msgstr "Ur&eđivanje" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "tfrmoptionscustomcolumns.btnnewcolumnsset.caption" msgid "&New" msgstr "&Novi" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "tfrmoptionscustomcolumns.cbbfilesystem.text" msgid "General" msgstr "Opšti" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption msgid "Con&figure columns for file system:" msgstr "" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption msgid "&Show confirmation dialog after drop" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption msgid "Show &file system" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption msgid "Show fr&ee space" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption msgid "Show &label" msgstr "" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "" #: tfrmoptionseditorcolors.backgroundlabel.caption msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "" #: tfrmoptionseditorcolors.foregroundlabel.caption msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption msgid "&Text-mark" msgstr "" #: tfrmoptionseditorcolors.tbtnglobal.caption msgid "Use (and edit) &global scheme settings" msgstr "" #: tfrmoptionseditorcolors.tbtnlocal.caption msgid "Use &local scheme settings" msgstr "" #: tfrmoptionseditorcolors.textboldcheckbox.caption msgctxt "tfrmoptionseditorcolors.textboldcheckbox.caption" msgid "&Bold" msgstr "&Podebljan" #: tfrmoptionseditorcolors.textboldradioinvert.caption msgctxt "tfrmoptionseditorcolors.textboldradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textboldradiooff.caption msgctxt "tfrmoptionseditorcolors.textboldradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textboldradioon.caption msgctxt "tfrmoptionseditorcolors.textboldradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textitaliccheckbox.caption msgctxt "tfrmoptionseditorcolors.textitaliccheckbox.caption" msgid "&Italic" msgstr "&Ukošen" #: tfrmoptionseditorcolors.textitalicradioinvert.caption msgctxt "tfrmoptionseditorcolors.textitalicradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textitalicradiooff.caption msgctxt "tfrmoptionseditorcolors.textitalicradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textitalicradioon.caption msgctxt "tfrmoptionseditorcolors.textitalicradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption msgid "&Strike Out" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption msgctxt "tfrmoptionseditorcolors.textunderlinecheckbox.caption" msgid "&Underline" msgstr "P&odvučen" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textunderlineradiooff.caption msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textunderlineradioon.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "" #: tfrmoptionsfileoperations.cbdeletetotrash.caption msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption msgid "D&rop readonly flag" msgstr "" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption msgid "&Search for part of file name" msgstr "" #: tfrmoptionsfileoperations.cbprocesscomments.caption msgid "&Process comments with files/folders" msgstr "" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption msgid "Select &file name without extension when renaming" msgstr "" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption msgid "Sho&w tab select panel in copy/move dialog" msgstr "" #: tfrmoptionsfileoperations.cbskipfileoperror.caption msgid "S&kip file operations errors and write them to log window" msgstr "" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "tfrmoptionsfileoperations.gbfilesearch.caption" msgid "File search" msgstr "Pretraga za fajlovima" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "" #: tfrmoptionsfileoperations.lblbuffersize.caption msgid "&Buffer size for file operations (in KB):" msgstr "" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "" #: tfrmoptionsfileoperations.lblprogresskind.caption msgid "Show operations progress &initially in" msgstr "" #: tfrmoptionsfileoperations.lblwipepassnumber.caption msgid "&Number of wipe passes:" msgstr "" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption msgid "Use memory mapping for search te&xt in files" msgstr "" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption msgid "&Use stream for search text in files" msgstr "" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnbackcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "tfrmoptionsfilepanelscolors.btnbackcolor2.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btncursorcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "tfrmoptionsfilepanelscolors.btncursortext.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnforecolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnindbackcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnindcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnmarkcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption msgid "Use &Frame Cursor" msgstr "" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption msgid "Use &Gradient Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption msgid "U&se Inverted Selection" msgstr "" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgid "Drive Free Space Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "tfrmoptionsfilepanelscolors.gbexample.caption" msgid "Example" msgstr "Primer" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption msgid "Bac&kground:" msgstr "" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption msgid "Backg&round 2:" msgstr "" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption msgid "C&ursor Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblcursortext.caption msgid "Cursor Te&xt:" msgstr "" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption msgid "&Brightness level of inactive panel" msgstr "" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption msgid "In&dicator Back Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblindcolor.caption msgid "&Indicator Fore Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption msgid "&Mark Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption msgid "T&ext Color:" msgstr "" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption msgid "Do&n't load file list until a tab is activated" msgstr "" #: tfrmoptionsfilesviews.cbdirbrackets.caption msgid "S&how square brackets around directories" msgstr "" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption msgid "Hi&ghlight new and updated files" msgstr "" #: tfrmoptionsfilesviews.cblistfilesinthread.caption msgid "Load &file list in separate thread" msgstr "" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption msgid "Load icons af&ter file list" msgstr "" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption msgid "Show s&ystem and hidden files" msgstr "" #: tfrmoptionsfilesviews.cbspacemovesdown.caption msgid "&When selecting files with , move down to next file (as with )" msgstr "" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "" #: tfrmoptionsfilesviews.gbsorting.caption msgctxt "tfrmoptionsfilesviews.gbsorting.caption" msgid "Sorting" msgstr "Sortiranje" #: tfrmoptionsfilesviews.lblcasesensitivity.caption msgid "Case s&ensitivity:" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeformat.caption msgid "&Date and time format:" msgstr "" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "" #: tfrmoptionsfilesviews.lblnewfilesposition.caption msgid "&Insert new files" msgstr "" #: tfrmoptionsfilesviews.lblsortfoldermode.caption msgid "So&rting directories:" msgstr "" #: tfrmoptionsfilesviews.lblsortmethod.caption msgid "&Sort method:" msgstr "" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption msgid "&Move updated files" msgstr "" #: tfrmoptionsfiletypescolors.btnaddcategory.caption msgctxt "tfrmoptionsfiletypescolors.btnaddcategory.caption" msgid "A&dd" msgstr "Dodaj" #: tfrmoptionsfiletypescolors.btnapplycategory.caption msgctxt "tfrmoptionsfiletypescolors.btnapplycategory.caption" msgid "A&pply" msgstr "" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "tfrmoptionsfiletypescolors.btncategorycolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption msgctxt "tfrmoptionsfiletypescolors.btndeletecategory.caption" msgid "D&elete" msgstr "" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "tfrmoptionsfiletypescolors.btnsearchtemplate.hint" msgid "Template..." msgstr "Šablon..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption msgid "File types colors (sort by drag&&drop)" msgstr "" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption msgid "Category a&ttributes:" msgstr "" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption msgid "Category co&lor:" msgstr "" #: tfrmoptionsfiletypescolors.lblcategorymask.caption msgctxt "tfrmoptionsfiletypescolors.lblcategorymask.caption" msgid "Category &mask:" msgstr "" #: tfrmoptionsfiletypescolors.lblcategoryname.caption msgctxt "tfrmoptionsfiletypescolors.lblcategoryname.caption" msgid "Category &name:" msgstr "" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "tfrmoptionsfonts.btnseleditfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "tfrmoptionsfonts.btnsellogfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "tfrmoptionsfonts.btnselmainfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "tfrmoptionsfonts.btnselviewerbookfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "tfrmoptionsfonts.btnselviewfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.lbleditorfont.caption msgid "&Editor font" msgstr "" #: tfrmoptionsfonts.lbllogfont.caption msgid "&Log font" msgstr "" #: tfrmoptionsfonts.lblmainfont.caption msgid "Main &font" msgstr "" #: tfrmoptionsfonts.lblviewerbookfont.caption msgid "Viewer&Book Font" msgstr "" #: tfrmoptionsfonts.lblviewerfont.caption msgid "&Viewer font" msgstr "" #: tfrmoptionshotkeys.btnaddhotkey.caption msgid "Add &hotkey" msgstr "" #: tfrmoptionshotkeys.btndeletehotkey.caption msgid "&Delete hotkey" msgstr "" #: tfrmoptionshotkeys.btnedithotkey.caption msgid "&Edit hotkey" msgstr "" #: tfrmoptionshotkeys.lbfilter.caption msgid "&Filter" msgstr "" #: tfrmoptionshotkeys.lblcategories.caption msgid "C&ategories:" msgstr "" #: tfrmoptionshotkeys.lblcommands.caption msgid "Co&mmands:" msgstr "" #: tfrmoptionshotkeys.lblscfiles.caption msgid "&Shortcut files:" msgstr "" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "tfrmoptionshotkeys.stghotkeys.columns[0].title.caption" msgid "Hotkey" msgstr "Prečica" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "tfrmoptionshotkeys.stghotkeys.columns[1].title.caption" msgid "Parameters" msgstr "Parametri" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption msgid "Controls" msgstr "" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "tfrmoptionsicons.cbiconsexclude.caption" msgid "For the following &paths and their subdirectories:" msgstr "Za sledeće &putanje i njihove pod-direktorijume:" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "tfrmoptionsicons.cbiconsinmenussize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption msgid "Show o&verlay icons, e.g. for links" msgstr "" #: tfrmoptionsicons.cbiconssize.text msgctxt "tfrmoptionsicons.cbiconssize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "" #: tfrmoptionsicons.gbiconssize.caption msgid " Icon size " msgstr "" #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "tfrmoptionsicons.gbshowiconsmode.caption" msgid " Show icons to the left of the filename " msgstr "Prikaži ikonice levo od naziva fajla" #: tfrmoptionsicons.rbiconsshowall.caption msgctxt "tfrmoptionsicons.rbiconsshowall.caption" msgid "A&ll" msgstr "&Sve" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "tfrmoptionsicons.rbiconsshowallandexe.caption" msgid "All associated + &EXE/LNK (slow)" msgstr "Sve povezane + &EXE/LNK (sporo)" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "tfrmoptionsicons.rbiconsshownone.caption" msgid "&No icons" msgstr "&Bez ikonica" #: tfrmoptionsicons.rbiconsshowstandard.caption msgid "Only &standard icons" msgstr "" #: tfrmoptionsignorelist.btnaddsel.caption msgid "A&dd selected names" msgstr "" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "tfrmoptionsignorelist.btnaddselwithpath.caption" msgid "Add selected names with &full path" msgstr "Dodaj označene nazive sa &punom putanjom" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "tfrmoptionsignorelist.chkignoreenable.caption" msgid "&Ignore (don't show) the following files and folders:" msgstr "&Ignoriši (ne prikazuj) sledeće fajlove i direktorijume:" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "tfrmoptionsignorelist.lblsavein.caption" msgid "&Save in:" msgstr "&Snimi u:" #: tfrmoptionskeyboard.cblynxlike.caption msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "" #: tfrmoptionskeyboard.lblalt.caption msgid "Alt+L&etters" msgstr "" #: tfrmoptionskeyboard.lblctrlalt.caption msgid "Ctrl+Alt+Le&tters" msgstr "" #: tfrmoptionskeyboard.lblnomodifier.caption msgid "&Letters" msgstr "" #: tfrmoptionslayout.cbflatdiskpanel.caption msgctxt "tfrmoptionslayout.cbflatdiskpanel.caption" msgid "&Flat buttons" msgstr "" #: tfrmoptionslayout.cbflatinterface.caption msgid "Flat i&nterface" msgstr "" #: tfrmoptionslayout.cbflattoolbar.caption msgctxt "tfrmoptionslayout.cbflattoolbar.caption" msgid "Flat b&uttons" msgstr "Ravna d&ugmad" #: tfrmoptionslayout.cbfreespaceind.caption msgid "Show fr&ee space indicator on drive label" msgstr "" #: tfrmoptionslayout.cblogwindow.caption msgid "Show lo&g window" msgstr "" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "tfrmoptionslayout.cbpanelofoperations.caption" msgid "Show panel of operation in background" msgstr "Prikaži radnu površinu operacije u pozadini" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "tfrmoptionslayout.cbproginmenubar.caption" msgid "Show common progress in menu bar" msgstr "Prikaži opštu skalu napretka na paleti menija" #: tfrmoptionslayout.cbshowcmdline.caption msgid "Show command l&ine" msgstr "" #: tfrmoptionslayout.cbshowcurdir.caption msgid "Show current director&y" msgstr "" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "tfrmoptionslayout.cbshowdiskpanel.caption" msgid "Show &drive buttons" msgstr "Prikaži dugmad &drajvova" #: tfrmoptionslayout.cbshowdrivefreespace.caption msgid "Show free s&pace label" msgstr "" #: tfrmoptionslayout.cbshowdriveslistbutton.caption msgid "Show drives list bu&tton" msgstr "" #: tfrmoptionslayout.cbshowkeyspanel.caption msgid "Show function &key buttons" msgstr "" #: tfrmoptionslayout.cbshowmainmenu.caption msgid "Show &main menu" msgstr "" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "tfrmoptionslayout.cbshowmaintoolbar.caption" msgid "Show &button bar" msgstr "Prikaži pa&nel za dugmad" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption msgid "Show short free space &label" msgstr "" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "tfrmoptionslayout.cbshowstatusbar.caption" msgid "Show &status bar" msgstr "Prikaži &statusni panel" #: tfrmoptionslayout.cbshowtabheader.caption msgid "S&how tabstop header" msgstr "" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "tfrmoptionslayout.cbshowtabs.caption" msgid "Sho&w folder tabs" msgstr "Prikaži tabo&ve direktorijuma" #: tfrmoptionslayout.cbtermwindow.caption msgid "Show te&rminal window" msgstr "" #: tfrmoptionslayout.cbtwodiskpanels.caption msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "tfrmoptionslayout.gbscreenlayout.caption" msgid " Screen layout " msgstr "Raspored ekrana" #: tfrmoptionslog.cblogarcop.caption msgid "&Pack/Unpack" msgstr "" #: tfrmoptionslog.cblogcpmvln.caption msgid "Cop&y/Move/Create link/symlink" msgstr "" #: tfrmoptionslog.cblogdelete.caption msgctxt "tfrmoptionslog.cblogdelete.caption" msgid "&Delete" msgstr "O&briši" #: tfrmoptionslog.cblogdirop.caption msgid "Crea&te/Delete directories" msgstr "" #: tfrmoptionslog.cblogerrors.caption msgctxt "tfrmoptionslog.cblogerrors.caption" msgid "Log &errors" msgstr "Loguj gr&eške" #: tfrmoptionslog.cblogfile.caption msgid "C&reate a log file:" msgstr "" #: tfrmoptionslog.cbloginfo.caption msgid "Log &information messages" msgstr "" #: tfrmoptionslog.cblogsuccess.caption msgctxt "tfrmoptionslog.cblogsuccess.caption" msgid "Log &successful operations" msgstr "Loguj u&spešne operacije" #: tfrmoptionslog.cblogvfs.caption msgid "&File system plugins" msgstr "" #: tfrmoptionslog.gblogfile.caption msgctxt "tfrmoptionslog.gblogfile.caption" msgid "File operation log file" msgstr "Log fajl operacije nad fajlovima" #: tfrmoptionslog.gblogfileop.caption msgid "Log operations" msgstr "" #: tfrmoptionslog.gblogfilestatus.caption msgid "Operation status" msgstr "" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "" #: tfrmoptionsmisc.chkshowwarningmessages.caption msgctxt "tfrmoptionsmisc.chkshowwarningmessages.caption" msgid "Show &warning messages (\"OK\" button only)" msgstr "" #: tfrmoptionsmisc.chkthumbsave.caption msgctxt "tfrmoptionsmisc.chkthumbsave.caption" msgid "&Save thumbnails in cache" msgstr "" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "tfrmoptionsmisc.dblthumbnails.caption" msgid "Thumbnails" msgstr "" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "tfrmoptionsmisc.lblthumbseparator.caption" msgid "X" msgstr "X" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "" #: tfrmoptionsmouse.cbselectionbymouse.caption msgid "&Selection by mouse" msgstr "" #: tfrmoptionsmouse.gbscrolling.caption msgctxt "tfrmoptionsmouse.gbscrolling.caption" msgid "Scrolling" msgstr "Skrolovanje" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "" #: tfrmoptionsmouse.lblmousemode.caption msgid "&Mode:" msgstr "" #: tfrmoptionsmouse.rbscrolllinebyline.caption msgid "&Line by line" msgstr "" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption msgid "Line by line &with cursor movement" msgstr "" #: tfrmoptionsmouse.rbscrollpagebypage.caption msgid "&Page by page" msgstr "" #: tfrmoptionsplugins.btnaddplugin.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "Dodaj" #: tfrmoptionsplugins.btnconfigplugin.caption #, fuzzy #| msgid "Configure" msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "Konfiguriši" #: tfrmoptionsplugins.btnenableplugin.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "Omogući" #: tfrmoptionsplugins.btnremoveplugin.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "Ukloni" #: tfrmoptionsplugins.btntweakplugin.caption #, fuzzy #| msgid "Tweak" msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "Unapredi" #: tfrmoptionsplugins.lbldsxdescription.caption #, fuzzy #| msgid "Search plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "Dodaci pretrazi omogućavaju korišćenje alternativnih algoritama pretrage ili eksternih alata (kao \"lociraj\", itd.)" #: tfrmoptionsplugins.lblwcxdescription.caption #, fuzzy #| msgid "Packer plugins are used to work with archives." msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "Paker dodaci se koriste za rad sa arhivama." #: tfrmoptionsplugins.lblwdxdescription.caption #, fuzzy #| msgid "Content plugins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "Dodaci sadržine omogućavaju prikazivanje proširenih detalja o fajlovima kao sto su mp3 tagovi ili atributi slika u fajl listama, ili ih koriste u pretrazi i alatu za višestruko preimenovavanje" #: tfrmoptionsplugins.lblwfxdescription.caption #, fuzzy #| msgid "File system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "Dodaci fajl sistemu omogućavaju pristup diskovima nedostupnim operativnom sistemu ili eksternom uređaju kao što je Palm/PocketPC." #: tfrmoptionsplugins.lblwlxdescription.caption #, fuzzy #| msgid "Viewer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "Dodaci pregledniku omogućavaju prikazivanje formata fajlova kao što su slike, tabele, baze podataka itd. u Pregledniku (F3, Ctrl+Q)" #: tfrmoptionsplugins.stgplugins.columns[0].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[0].title.caption" msgid "Active" msgstr "Aktivan" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[1].title.caption" msgid "Plugin" msgstr "Dodatak" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[2].title.caption" msgid "Registered for" msgstr "Registrovan za" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[3].title.caption" msgid "File name" msgstr "Naziv fajla" #: tfrmoptionsplugins.tsdsx.caption #, fuzzy #| msgid "Search plugins (.DSX)" msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "Dodaci pretrazi (.DSX)" #: tfrmoptionsplugins.tswcx.caption #, fuzzy #| msgid "Packer plugins (.WCX)" msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "Paker dodaci (.WCX)" #: tfrmoptionsplugins.tswdx.caption #, fuzzy #| msgid "Content plugins (.WDX)" msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "Dodaci sadržine (.WDX)" #: tfrmoptionsplugins.tswfx.caption #, fuzzy #| msgid "File system plugins (.WFX)" msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "Dodaci fajl sistemu (.WFX)" #: tfrmoptionsplugins.tswlx.caption #, fuzzy #| msgid "Viewer plugins (.WLX)" msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "Dodaci pregledniku (.WLX)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "tfrmoptionsquicksearchfilter.cbexactbeginning.caption" msgid "&Beginning (name must start with first typed character)" msgstr "&Početni (naziv mora započeti sa prvim ukucanim karakterom)" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "tfrmoptionsquicksearchfilter.cbexactending.caption" msgid "En&ding (last character before a typed dot . must match)" msgstr "&Završni (poslednji karakter pre ukucane tačke mora odgovarati)" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "tfrmoptionsquicksearchfilter.cgpoptions.caption" msgid "Options" msgstr "Opcije" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption msgid "Exact name match" msgstr "" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "tfrmoptionstabs.cbtabsactivateonclick.caption" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "Aktiviraj odredišni &panel klikom na jedan od njegovih Tabova" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "tfrmoptionstabs.cbtabsalwaysvisible.caption" msgid "&Show tab header also when there is only one tab" msgstr "Prikaži za&glavlje tabova takođe i kada je otvoren samo jedan tab" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption msgid "Con&firm close all tabs" msgstr "" #: tfrmoptionstabs.cbtabslimitoption.caption msgid "&Limit tab title length to" msgstr "" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "tfrmoptionstabs.cbtabslockedasterisk.caption" msgid "Show locked tabs &with an asterisk *" msgstr "Prikaži zaključane tabove sa jednom &zvezdicom *" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "tfrmoptionstabs.cbtabsmultilines.caption" msgid "&Tabs on multiple lines" msgstr "&Tabovi u više redova" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "tfrmoptionstabs.cbtabsopenforeground.caption" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Ctrl+&Up otvara novi tab u prvom planu" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "tfrmoptionstabs.cbtabsopennearcurrent.caption" msgid "Open &new tabs near current tab" msgstr "Otvori &novi tab pored aktivnog taba" #: tfrmoptionstabs.cbtabsshowclosebutton.caption msgid "Show ta&b close button" msgstr "" #: tfrmoptionstabs.gbtabs.caption msgctxt "tfrmoptionstabs.gbtabs.caption" msgid "Folder tabs headers" msgstr "Zaglavlja tabova direktorijuma" #: tfrmoptionstabs.lblchar.caption msgctxt "tfrmoptionstabs.lblchar.caption" msgid "characters" msgstr "karakteri" #: tfrmoptionstabs.lbltabsposition.caption msgid "Ta&bs position" msgstr "" #: tfrmoptionsterminal.lblruninterm.caption msgid "Run in &terminal:" msgstr "" #: tfrmoptionsterminal.lblrunterm.caption msgid "Run t&erminal:" msgstr "" #: tfrmoptionstoolbar.btnclonebutton.caption msgid "C&lone button" msgstr "" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "tfrmoptionstoolbar.btndeletebutton.caption" msgid "&Delete" msgstr "&Obriši" #: tfrmoptionstoolbar.btnedithotkey.caption msgid "Edit hot&key" msgstr "" #: tfrmoptionstoolbar.btninsertbutton.caption msgctxt "tfrmoptionstoolbar.btninsertbutton.caption" msgid "&Insert new button" msgstr "Umetn&i novo dugme" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "tfrmoptionstoolbar.btnopenfile.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "tfrmoptionstoolbar.btnopenicon.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnremovehotkey.caption msgid "Remove hotke&y" msgstr "" #: tfrmoptionstoolbar.cbflatbuttons.caption msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "" #: tfrmoptionstoolbar.gbgroupbox.caption msgctxt "tfrmoptionstoolbar.gbgroupbox.caption" msgid "Appearance" msgstr "Izgled" #: tfrmoptionstoolbar.lblbarsize.caption msgid "&Bar size:" msgstr "" #: tfrmoptionstoolbar.lblexternalcommand.caption msgid "Comman&d:" msgstr "" #: tfrmoptionstoolbar.lblexternalparameters.caption msgid "Parameter&s:" msgstr "" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "" #: tfrmoptionstoolbar.lbliconfile.caption msgid "Ico&n:" msgstr "" #: tfrmoptionstoolbar.lbliconsize.caption msgid "Icon si&ze:" msgstr "" #: tfrmoptionstoolbar.lblinternalcommand.caption msgid "Co&mmand:" msgstr "" #: tfrmoptionstoolbar.lblinternalparameters.caption msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "&Parametri:" #: tfrmoptionstoolbar.lblstartpath.caption msgid "Start pat&h:" msgstr "" #: tfrmoptionstoolbar.lbltooltip.caption msgctxt "tfrmoptionstoolbar.lbltooltip.caption" msgid "&Tooltip:" msgstr "Po&dsetnik" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption msgid "&Keep terminal window open after executing program" msgstr "" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption msgid "&Execute in terminal" msgstr "" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption msgid "&Use external program" msgstr "" #: tfrmoptionstoolbase.lbltoolsparameters.caption msgid "A&dditional parameters" msgstr "" #: tfrmoptionstoolbase.lbltoolspath.caption msgid "&Path to program to execute" msgstr "" #: tfrmoptionstooltips.btnaddfields.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "Dodaj" #: tfrmoptionstooltips.btnapplyfields.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "Primeni" #: tfrmoptionstooltips.btndeletefields.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "Obriši" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Šablon..." #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "Prilagodi polja po tipu fajla" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "Prikaži podsetnik" #: tfrmoptionstooltips.lblfieldslist.caption #, fuzzy #| msgid "Category hint:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "Opis kategorije:" #: tfrmoptionstooltips.lblfieldsmask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "Maska kategorije:" #: tfrmoptionstooltips.lblfieldsname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "Naziv kategorije:" #: tfrmoptionstooltips.rbtooltipallfiles.caption #, fuzzy #| msgid "Show tool tip for all files in file panel" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "Prikaži podsetnik za sve fajlove u fajl panelu" #: tfrmoptionstooltips.rbtooltipnone.caption #, fuzzy #| msgid "Don't show" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "Nemoj prikazivati" #: tfrmoptionstooltips.rbtooltiponlylarge.caption #, fuzzy #| msgid "Show tool tip for files in file panel if truncated" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "Prikaži podsetnik za fajlove u fajl panelu ako su skraćeni" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "tfrmoptionsviewer.btnbackviewercolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "tfrmoptionsviewer.btnfontviewercolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.gbviewerbookmode.caption msgctxt "tfrmoptionsviewer.gbviewerbookmode.caption" msgid "Viewer Book Mode" msgstr "Mod Preglednika Knjige" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "tfrmoptionsviewer.gbviewerexample.caption" msgid "Example" msgstr "Primer" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption msgid "&Background color in book viewer" msgstr "" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption msgid "&Font color in book viewer" msgstr "" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption msgid "&Number of columns in book viewer" msgstr "" #: tfrmpackdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmpackdlg.btnconfig.caption #, fuzzy #| msgid "&Configure" msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "&Konfiguriši" #: tfrmpackdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Pomoć" #: tfrmpackdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmpackdlg.caption msgctxt "tfrmpackdlg.caption" msgid "Pack files" msgstr "Zapakuj fajlove" #: tfrmpackdlg.cbcreateseparatearchives.caption #, fuzzy #| msgid "Create separate archives, o&ne per selected file/dir" msgid "C&reate separate archives, one per selected file/dir" msgstr "Kreiraj zasebne arhive, jednu po oz&načenom fajlu/direktorijumu" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "Kreiraj &samo-raspakujuću arhivu" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "Enkri&ptuj" #: tfrmpackdlg.cbmovetoarchive.caption #, fuzzy #| msgid "M&ove to archive" msgid "Mo&ve to archive" msgstr "Pr&emesti u arhivu" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "&Višestruka arhiva diska" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "=>" #: tfrmpackdlg.cbputintarfirst.caption #, fuzzy #| msgid "Put in the TAR archive first" msgid "P&ut in the TAR archive first" msgstr "Stavi u TAR arhivu prvo" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "&Takođe zapakuj nazive putanja (samo rekurzivne)" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "Zapakuj fajl(ove) u fajl:" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "Paker" #: tfrmpackinfodlg.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Zatvori" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "Otp&akuj sve i izvrši" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "&Otpakuj i izvrši" #: tfrmpackinfodlg.caption msgctxt "tfrmpackinfodlg.caption" msgid "Properties of packed file" msgstr "Svojstva zapakovanih fajlova" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "Atributi:" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "Stepen kompresije:" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "Datum:" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "Metoda:" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "Originalna veličina:" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "Fajl:" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "Veličina zapakovanog:" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "Paker:" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "Vreme:" #: tfrmquicksearch.btncancel.caption msgctxt "tfrmquicksearch.btncancel.caption" msgid "X" msgstr "X" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "" #: tfrmquicksearch.tglfilter.caption msgctxt "tfrmquicksearch.tglfilter.caption" msgid "Filter" msgstr "Filter" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "tfrmselecttextrange.btppanel.cancelbutton.caption" msgid "Cancel" msgstr "Odustani" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "tfrmselecttextrange.btppanel.closebutton.caption" msgid "&Close" msgstr "Za&tvori" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "tfrmselecttextrange.btppanel.helpbutton.caption" msgid "&Help" msgstr "&Pomoć" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "tfrmselecttextrange.btppanel.okbutton.caption" msgid "&OK" msgstr "&OK" #: tfrmselecttextrange.lblselecttext.caption msgid "&Select the characters to insert:" msgstr "" #: tfrmsetfileproperties.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsetfileproperties.caption msgctxt "tfrmsetfileproperties.caption" msgid "Change attributes" msgstr "Promeni atribute" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Lepljiv" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "Arhiva" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "Kreiran:" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "Skriven" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "Vršen pristup:" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "Modifikovan:" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "Samo-za-čitanje" #: tfrmsetfileproperties.chkrecursive.caption #, fuzzy #| msgid "Recursive" msgid "Including subfolders" msgstr "Rekurzivan" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "Sistem" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "Svojstva vremenske oznake" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atributi" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atributi" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Biti:" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Grupa" #: tfrmsetfileproperties.lblattrinfo.caption msgid "(gray field means unchanged value)" msgstr "(sivo polje označava nepromenjenu vrednost)" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Ostali" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Vlasnik" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Tekst:" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Izvrši" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Oktalni:" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Pročitaj" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Piši" #: tfrmsplitter.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmsplitter.caption msgctxt "tfrmsplitter.caption" msgid "Splitter" msgstr "Razdelnik" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664B - 3.5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "Naziv fajla" #: tfrmsplitter.grbxsize.caption msgid "Size and number of parts" msgstr "Veličina i broj delova" #: tfrmsplitter.lbdirtarget.caption #, fuzzy #| msgid "Directory target" msgid "Directory &target" msgstr "Odredište direktorijuma" #: tfrmsplitter.lbfilesource.caption #, fuzzy #| msgid "File source" msgid "File &source" msgstr "Izvorni kod fajla" #: tfrmsplitter.lblnumberparts.caption #, fuzzy #| msgid "Number of parts" msgid "&Number of parts" msgstr "Broj delova" #: tfrmsplitter.rbtngigab.caption #, fuzzy #| msgid "Gigabytes" msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "Gigabajti" #: tfrmsplitter.rbtnkilob.caption #, fuzzy #| msgid "Kilobytes" msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "Kilobajti" #: tfrmsplitter.rbtnmegab.caption #, fuzzy #| msgid "Megabytes" msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "Megabajti" #: tfrmsymlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsymlink.caption msgid "Create symbolic link" msgstr "Kreiraj simbolički link" #: tfrmsymlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Odredište na koje će link ukazivati" #: tfrmsymlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Naziv linka" #: tfrmtweakplugin.btnadd.caption #, fuzzy #| msgid "Add new" msgid "A&dd new" msgstr "Dodaj novi" #: tfrmtweakplugin.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Odustani" #: tfrmtweakplugin.btnchange.caption #, fuzzy #| msgid "Change" msgid "C&hange" msgstr "Promeni" #: tfrmtweakplugin.btndefault.caption #, fuzzy #| msgid "Default" msgid "De&fault" msgstr "Podrazumevani" #: tfrmtweakplugin.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmtweakplugin.btnremove.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "Ukloni" #: tfrmtweakplugin.caption msgctxt "tfrmtweakplugin.caption" msgid "Tweak plugin" msgstr "Dodatak unapređivanju" #: tfrmtweakplugin.cbpk_caps_by_content.caption #, fuzzy #| msgid "Detect archive type by content" msgid "De&tect archive type by content" msgstr "Otkrij tip arhive po sadržaju" #: tfrmtweakplugin.cbpk_caps_delete.caption #, fuzzy #| msgid "Can delete files" msgid "Can de&lete files" msgstr "Omogućeno brisanje fajlova" #: tfrmtweakplugin.cbpk_caps_encrypt.caption #, fuzzy #| msgid "Supports encryption" msgid "Supports e&ncryption" msgstr "Podržava enkripciju" #: tfrmtweakplugin.cbpk_caps_hide.caption #, fuzzy #| msgid "Show as normal files (hide packer icon)" msgid "Sho&w as normal files (hide packer icon)" msgstr "Prikaži kao normalne fajlove (sakrij ikonicu pakera)" #: tfrmtweakplugin.cbpk_caps_mempack.caption #, fuzzy #| msgid "Supports packing in memory" msgid "Supports pac&king in memory" msgstr "Podržava pakovanje u memoriju" #: tfrmtweakplugin.cbpk_caps_modify.caption #, fuzzy #| msgid "Can modify exisiting archives" msgid "Can &modify exisiting archives" msgstr "Omogućeno menjanje postojećih arhiva" #: tfrmtweakplugin.cbpk_caps_multiple.caption #, fuzzy #| msgid "Archive can contain multiple files" msgid "&Archive can contain multiple files" msgstr "Arhiva može sadržati više fajlova" #: tfrmtweakplugin.cbpk_caps_new.caption #, fuzzy #| msgid "Can create new archives" msgid "Can create new archi&ves" msgstr "Omogućeno kreiranje novih arhiva" #: tfrmtweakplugin.cbpk_caps_options.caption #, fuzzy #| msgid "Supports the options dialogbox" msgid "S&upports the options dialogbox" msgstr "Podržava dijalog za opcije" #: tfrmtweakplugin.cbpk_caps_searchtext.caption #, fuzzy #| msgid "Allow searching for text in archives" msgid "Allow searchin&g for text in archives" msgstr "Dozvoli pretraživanje teksta u arhivama" #: tfrmtweakplugin.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "Opis:" #: tfrmtweakplugin.lbldetectstr.caption #, fuzzy #| msgid "Detect string:" msgid "D&etect string:" msgstr "Otkrij niz znakova:" #: tfrmtweakplugin.lblextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "Ekstenzija:" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "Statusi:" #: tfrmtweakplugin.lblname.caption #, fuzzy #| msgid "Name:" msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "Naziv:" #: tfrmtweakplugin.lblplugin.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "Dodatak:" #: tfrmtweakplugin.lblplugin1.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "Dodatak:" #: tfrmviewer.actabout.caption msgctxt "tfrmviewer.actabout.caption" msgid "About Viewer..." msgstr "Preglednik O Programu..." #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "" #: tfrmviewer.actcopyfile.caption msgctxt "tfrmviewer.actcopyfile.caption" msgid "Copy File" msgstr "" #: tfrmviewer.actcopyfile.hint msgctxt "tfrmviewer.actcopyfile.hint" msgid "Copy File" msgstr "" #: tfrmviewer.actdeletefile.caption msgctxt "tfrmviewer.actdeletefile.caption" msgid "Delete File" msgstr "" #: tfrmviewer.actdeletefile.hint msgctxt "tfrmviewer.actdeletefile.hint" msgid "Delete File" msgstr "" #: tfrmviewer.actloadnextfile.caption msgctxt "tfrmviewer.actloadnextfile.caption" msgid "&Next" msgstr "&Sledeći" #: tfrmviewer.actloadnextfile.hint msgid "Load Next File" msgstr "" #: tfrmviewer.actloadprevfile.caption msgctxt "tfrmviewer.actloadprevfile.caption" msgid "&Previous" msgstr "&Prethodni" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "" #: tfrmviewer.actmirror.caption msgctxt "tfrmviewer.actmirror.caption" msgid "Mirror" msgstr "Ogledalo" #: tfrmviewer.actmirror.hint msgctxt "tfrmviewer.actmirror.hint" msgid "Mirror" msgstr "Ogledalo" #: tfrmviewer.actmovefile.caption msgctxt "tfrmviewer.actmovefile.caption" msgid "Move File" msgstr "" #: tfrmviewer.actmovefile.hint msgctxt "tfrmviewer.actmovefile.hint" msgid "Move File" msgstr "" #: tfrmviewer.actreload.caption msgctxt "tfrmviewer.actreload.caption" msgid "Reload" msgstr "Učitaj Ponovo" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "" #: tfrmviewer.actrotate180.caption msgctxt "tfrmviewer.actrotate180.caption" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate180.hint msgctxt "tfrmviewer.actrotate180.hint" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate270.caption msgctxt "tfrmviewer.actrotate270.caption" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate270.hint msgctxt "tfrmviewer.actrotate270.hint" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate90.caption msgctxt "tfrmviewer.actrotate90.caption" msgid "Rotate 90" msgstr "" #: tfrmviewer.actrotate90.hint msgctxt "tfrmviewer.actrotate90.hint" msgid "Rotate 90" msgstr "" #: tfrmviewer.actsaveas.caption msgctxt "tfrmviewer.actsaveas.caption" msgid "Save As..." msgstr "Snimi Kao..." #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "" #: tfrmviewer.actstretchimage.caption msgctxt "tfrmviewer.actstretchimage.caption" msgid "Stretch" msgstr "Razvuci" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "- 90" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "Kopiraj" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "Kopiraj" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "Izreži" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "Obriši" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "Obriši" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "Pun Ekran" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "||" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "S" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "Istakni" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "Ogledalo" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "Premesti" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "Premesti" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "||>" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "Oboji" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "<||" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "Crvene Oči" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "Promeni Veličinu" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "Poništi" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "Zumiraj" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "Odzumiraj" #: tfrmviewer.caption msgctxt "tfrmviewer.caption" msgid "Viewer" msgstr "Preglednik" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Slajd Prikaz" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "Olovka" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "Istakni" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "Oboji" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Slajd Prikaz" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "Pregled" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "0x0" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "+ 180" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "- 90" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "O Programu" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "Prikaži kao &Binarno" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "Kopiraj U Privremeni Spremnik" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "Ur&eđivanje" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "En&kodiranje" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "I&zlaz" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "&Fajl" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "Pun Ekran" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "Grafika" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "Prikaži kao &Heksadecimalno" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "Sl&ika" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "Prikaži kao Knjig&u" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "Ogledalo" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "Dodaci" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "Pregled" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "Štampanje..." #: tfrmviewer.mirotate.caption msgctxt "TFRMVIEWER.MIROTATE.CAPTION" msgid "Rotate" msgstr "Rotiraj" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "Snimi" #: tfrmviewer.misaveas.caption msgctxt "tfrmviewer.misaveas.caption" msgid "Save As..." msgstr "Snimi Kao..." #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "Slika stanja ekrana" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "Pretraži" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "Pretraži sledeći" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "Pretraži prethodni" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "Označi Sve" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.mistretch.caption msgctxt "tfrmviewer.mistretch.caption" msgid "Stretch" msgstr "Razvuci" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "Prikaži kao &Tekst" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "&Pregled" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "Prikaži kao Prelomljen &tekst" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "Zumiraj" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "Odzumiraj" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "Kopiraj U Privremeni Spremnik" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "Označi Sve" #: tfrmviewoperations.btnstartpause.caption msgctxt "tfrmviewoperations.btnstartpause.caption" msgid "&Start" msgstr "Po&kreni" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "" #: tfrmviewoperations.caption msgctxt "tfrmviewoperations.caption" msgid "File operations" msgstr "Operacije nad fajlovima" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "" #: tfrmviewoperations.mnucanceloperation.caption #, fuzzy #| msgid "Cancel" msgctxt "tfrmviewoperations.mnucanceloperation.caption" msgid "Cancel" msgstr "Odustani" #: tfrmviewoperations.mnucancelqueue.caption msgctxt "tfrmviewoperations.mnucancelqueue.caption" msgid "Cancel" msgstr "Odustani" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "tfrmviewoperations.mnuoperationshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "" #: tfrmviewoperations.mnuqueue.caption msgctxt "tfrmviewoperations.mnuqueue.caption" msgid "Queue" msgstr "" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "tfrmviewoperations.mnuqueueshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "tmultiarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Kada fajl postoji" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "twcxarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Kada fajl postoji" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Kada fajl postoji" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "" #: ulng.rscolattr msgid "Attr" msgstr "Atribut" #: ulng.rscoldate msgid "Date" msgstr "Datum" #: ulng.rscolext msgid "Ext" msgstr "Ekstenzija" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "Naziv" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "Veličina" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "Broj promena:" #: ulng.rsconfcolalign msgid "Align" msgstr "Poravnanje" #: ulng.rsconfcolcaption msgid "Caption" msgstr "Naslov" #: ulng.rsconfcolconfig msgid "Config" msgstr "Konfiguracija" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "Obriši" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "Sadržaj polja" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "Premesti" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "Širina" #: ulng.rsconfcustheader msgid "Customize column" msgstr "Prilagodi kolonu" #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "Kopiraj (%d) %s" #: ulng.rsdlgallopcomplete #, fuzzy #| msgid "All operations is complete" msgid "All operations completed" msgstr "Sve operacije su završene" #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "Napredak svih operacija %d %%" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "Pre&kini" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "&Sve" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "&Dodaj" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "Odus&tani" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "Kop&iraj U" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "" #: ulng.rsdlgbuttonno msgid "&No" msgstr "&Ne" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "Ni&jedan" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "&OK" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "&Prepiši" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "P&repiši Sve" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "Pok&ušaj Ponovo" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "Pr&eskoči" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "Preskoči S&ve" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "D&a" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "Proračunavanje fajlova i direktorijuma" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "Izračunavanje kontrolne sume..." #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "Proveravanje kontrolne sume..." #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "Kopiraj fajl(ove)" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "Obriši fajl(ove)" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "Premesti fajl(ove)" #: ulng.rsdlgoppause #, fuzzy #| msgid "Pause" msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "Pauziraj" #: ulng.rsdlgopstart #, fuzzy #| msgid "Start" msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "Pokreni" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "Brzina %s/s" #: ulng.rsdlgspeedtime msgid "Speed %s/s, time remaining %s" msgstr "Brzina %s/s, vremena preostalo %s" #: ulng.rsdlgsplit msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "Razdvoji" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "Obriši fajl(ove)" #: ulng.rsdrivenolabel msgid "" msgstr "" #: ulng.rsdrivenomedia msgid "" msgstr "" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Interni Editor Double Commander-a." #: ulng.rseditnewfile msgid "new.txt" msgstr "novi.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "Naziv fajla:" #: ulng.rseditnewopen msgid "Open file" msgstr "Otvori fajl" #: ulng.rseditsearchback msgid "&Backward" msgstr "&Unazad" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "Pretraga" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "Un&apred" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "Zameni" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "" #: ulng.rsfileopsetpropertyerroroptions msgid "Ask;Don't set anymore;Ignore errors" msgstr "" #: ulng.rsfilterstatus msgid "FILTER" msgstr "" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "Definiši šablon" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "%s nivo(i)" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "svi (neograničena dubina)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "tekući direktorijum samo" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "Direktorijum %s ne postoji!" #: ulng.rsfindfound msgctxt "ulng.rsfindfound" msgid "Found: %d" msgstr "Pronađen: %d" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "Snimi šablon pretrage" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "Naziv šablona:" #: ulng.rsfindscanned msgctxt "ulng.rsfindscanned" msgid "Scanned: %d" msgstr "Skeniran: %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "Skeniranje" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "Pronađi fajlove" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "Počni na" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr "Slobodno %s od %s bajta" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "%s bajta slobodno" #: ulng.rsfuncatime msgid "Access date/time" msgstr "Datum/vreme pristupa" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "Atributi" #: ulng.rsfunccomment msgid "Comment" msgstr "Komentar" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "Datum/vreme nastanka" #: ulng.rsfuncext msgid "Extension" msgstr "Ekstenzija" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "Grupa" #: ulng.rsfunclinkto msgid "Link to" msgstr "Poveži sa" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "Datum/vreme promene" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "Naziv" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "Naziv bez ekstenzije" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "Vlasnik" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "Putanja" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "Veličina" #: ulng.rsfunctype msgid "Type" msgstr "Tip" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "Greška prilikom kreiranja hard-linka" #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "Upoređivanje" #: ulng.rshotkeycategorymain msgid "Main" msgstr "" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "Preglednik" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "Linker završio rad" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "Maska za neoznačavanje" #: ulng.rsmarkplus msgid "Select mask" msgstr "Maska za označavanje" #: ulng.rsmaskinput msgid "Input mask:" msgstr "Ulazna maska:" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "Konfiguriši sopstvene kolone" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "Konfiguriši ovaj sopstveni prikaz kolone" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "Akcije" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "Uređivanje" #: ulng.rsmnueject msgid "Eject" msgstr "Izbaci" #: ulng.rsmnumount msgid "Mount" msgstr "Montiraj" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "Novi" #: ulng.rsmnunomedia msgid "No media available" msgstr "Nema dostupnih medija" #: ulng.rsmnuopenwith #, fuzzy #| msgid "Open with ..." msgid "Open with" msgstr "Otvori sa..." #: ulng.rsmnuopenwithother msgid "Other..." msgstr "" #: ulng.rsmnusortby msgid "Sort by" msgstr "Sortiraj po" #: ulng.rsmnuumount msgid "Unmount" msgstr "Demontiraj" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "Pregled" #: ulng.rsmsgaccount msgid "Account:" msgstr "Nalog:" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "Dodatni parametri za komandnu liniju arhivera:" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "Nije moguće kopirati/premestiti fajl \"%s\" preko njega samog!" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "Promena direktorijuma na [%s] nije uspela!" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "Ukloni sve neaktivne tabove?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "Ovaj tab (%s) je zaključan! Zatvoriti svakako?" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "Da li ste sigurni da želite izaći?" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "Kopiraj %d označenih fajlova/direktorijuma?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "Kopiraj označeni \"%s\"?" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "Obriši %d označenih fajlova/direktorijuma?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "Obriši %d označenih fajlova/direktorijuma u kantu za smeće?" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "Obriši označeni \"%s\"?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "Obriši označeni \"%s\" u kantu za smeće?" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "Nije moguće obrisati \"%s\" u smeće! Obriši direktno?" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "Disk nije dostupan" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "Unesi ekstenziju fajla:" #: ulng.rsmsgentername msgid "Enter name:" msgstr "Unesi naziv:" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "CRC greška u arhivskim podacima" #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "Podatak je loš" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "Nije moguća konekcija na server: \"%s\"" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "Nije moguće kopirati fajl %s u %s" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "" #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "Datum %s nije podržan" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "Direktorijum %s već postoji!" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "Funkcija prekinuta od strane korisnika" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "Greška prilikom zatvaranja fajla" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "Nije moguće kreirati fajl" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "Nema više fajlova u arhivi" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "Nije moguće otvoriti postojeći fajl" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "Greška prilikom čitanja iz fajla" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "Greška prilikom pisanja u fajl" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "Nije moguće kreirati direktorijum %s!" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "Nevalidan link" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "Nema pronađenih fajlova" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "Nema dovoljno memorije" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "Funkcija nije podržana!" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "Sintaksna greška u regularnom izrazu!" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "Nije moguće preimenovati fajl %s u %s" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "Nije moguće snimiti fajl" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "Nije moguće postaviti atribute za \"%s\"" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "Nije moguće postaviti datum/vreme za \"%s\"" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "Privremena memorija je premala" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "Previše fajlova za zapakovati" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "Nepoznat format arhive" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "Fajl %s promenjen, snimiti?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "Fajl %s postoji, prepisati?" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "Operacije nad fajlovima aktivne" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "Neke operacije nad fajlovima nisu još završene. Zatvaranje Double Commander-a se može rezultovati gubitkom podataka." #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "Fajl %s je označen kao samo-za-čitanje. Obrisati ga?" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "Veličina fajla \"%s\" je prevelika za odredišni fajl sistem!" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "Direktorijum %s postoji, prepisati?" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "Sledi simbolički link \"%s\"?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "Nevalidan naziv fajla" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "" #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "Nevalidna selekcija." #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "Učitavanje liste fajlova..." #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "Kopiraj fajl %s" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "Obriši fajl %s" #: ulng.rsmsglogerror msgid "Error: " msgstr "Greška:" #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "Raspakuj fajl %s" #: ulng.rsmsgloginfo msgid "Info: " msgstr "Informacije:" #: ulng.rsmsgloglink msgid "Create link %s" msgstr "Kreiraj link %s" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "Kreiraj direktorijum %s" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "Premesti fajl %s" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "Zapakuj u fajl %s" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "Ukloni direktorijum %s" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "Urađeno:" #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "Kreiraj simbolički link %s" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "Testiraj integritet fajla %s" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "Dodaj ručno \"hot\" putanju" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "Uredi ručno \"hot\" putanju" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "Unesi naziv i putanju (format naziv=putanja):" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "Glavna Lozinka" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "Molimo unesite glavnu lozinku:" #: ulng.rsmsgnewfile msgid "New file" msgstr "Novi fajl" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "Sledeći deo arhive će biti otpakovan" #: ulng.rsmsgnofiles msgid "No files" msgstr "" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "Nema označenih fajlova." #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "Nema dovoljno slobodnog prostora na odredišnom drajvu, Nastaviti?" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "Nema dovoljno slobodnog prostora na odredišnom drajvu, Pokušati Ponovo?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "Nije moguće obrisati fajl %s" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "Nije implementirano." #: ulng.rsmsgpassword msgid "Password:" msgstr "Lozinka:" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "Molimo unesite lozinku:" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "Lozinka (Zaštitni Zid):" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "&Dodaj %s" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "&Konfiguriši" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "&Obriši %s" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "Postavka \"%s\" već postoji. Prepisati?" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "Preimenuj/premesti %d označenih fajlova/direktorijuma?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "Preimenuj/premesti označene \"%s\"?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "Molimo, restartujte Double Commander u cilju primene promena" #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "Molimo označite samo fajlove kontrolnih suma" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "Molimo izaberite lokaciju sledećeg dela arhive" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "Postavi oznaku volumena" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "Preimenuj tab" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "Naziv novog taba:" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "Odredišna putanja:" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "Previše fajlova izabrano." #: ulng.rsmsgurl msgid "URL:" msgstr "URL:" #: ulng.rsmsgusername msgid "User name:" msgstr "Korisničko ime:" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "Korisničko ime (Zaštitni Zid):" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "Oznaka volumena:" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "Molimo unesite veličinu volumena:" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "Obrisati %d označenih fajlova/direktorijuma?" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "Obrisati označeni \"%s\"?" #: ulng.rsmulrenfilenamestylelist msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "Nema promena;VELIKA SLOVA;mala slova;Prvi karakter veliko slovo;Prvi Karakter Svake Reči Veliko Slovo;" #: ulng.rsoperaborted msgid "Aborted" msgstr "Prekinut" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "Proračunavanje" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "" #: ulng.rsopercombining msgid "Joining" msgstr "" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopying msgid "Copying" msgstr "" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "Brisanje" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "" #: ulng.rsoperexecuting msgid "Executing" msgstr "" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "" #: ulng.rsoperextracting msgid "Extracting" msgstr "" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperfinished msgid "Finished" msgstr "Završen" #: ulng.rsoperlisting msgid "Listing" msgstr "" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "" #: ulng.rsopermoving msgid "Moving" msgstr "" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "" #: ulng.rsopernotstarted msgid "Not started" msgstr "Nije pokrenut" #: ulng.rsoperpacking msgid "Packing" msgstr "" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpaused msgid "Paused" msgstr "Pauziran" #: ulng.rsoperpausing msgid "Pausing" msgstr "Pauziranje" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "Postavljen u red" #: ulng.rsoperrunning msgid "Running" msgstr "U radu" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "" #: ulng.rsopersplitting msgid "Splitting" msgstr "" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperstarting msgid "Starting" msgstr "Pokretanje" #: ulng.rsoperstopped msgid "Stopped" msgstr "Zaustavljen" #: ulng.rsoperstopping msgid "Stopping" msgstr "Zaustavljanje" #: ulng.rsopertesting msgid "Testing" msgstr "" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "Čekanje pristupa izvornom kodu fajla" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "Čekanje odgovora korisnika" #: ulng.rsoperwiping msgid "Wiping" msgstr "" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "" #: ulng.rsoperworking msgid "Working" msgstr "" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "Obriši:" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "Raspakuj bez putanje:" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "Formatiraj mod parsiranja:" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "ID:" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "ID Pozicije:" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "ID Opsega Traženja:" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "Parametar" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "Niz znakova upita za lozinku:" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "Kreiraj samo-raspakujuću arhivu:" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "Test:" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "Naziv tipa arhive:" #: ulng.rsoptarchivevalue msgid "Value" msgstr "Vrednost" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "Poveži dodatak \"%s\" sa:" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "Prvi;Poslednji;" #: ulng.rsoptdisable msgid "Disable" msgstr "Onemogući" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "Omogući" #: ulng.rsoptenterext msgid "Enter extension" msgstr "Unesi ekstenziju" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "Kursor" #: ulng.rsoptexamplemark msgid "Mark" msgstr "Označavanje" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "Označavanje + Kursor" #: ulng.rsoptexampletext msgid "Text" msgstr "Tekst" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "" #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "" #: ulng.rsopthotkeysdeletetrashcanoverrides msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "Prečica" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "Prečice" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "Parametri" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "" #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "Prečice u upotrebi" #: ulng.rsopthotkeysshortcutusedtext1 #, fuzzy #| msgid "Shortcut %s is already used for %s." msgid "Shortcut %s is already used." msgstr "Prečica %s je već upotrebljena za %s." #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "Promeni u %s?" #: ulng.rsopthotkeysusedby #, fuzzy #| msgid "used by" msgid "used for %s in %s" msgstr "upotrebljen" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "Arhiveri" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "Automatsko osvežavanje" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "Ponašanja" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "Boje" #: ulng.rsoptionseditorcolumnsview msgctxt "ulng.rsoptionseditorcolumnsview" msgid "Columns" msgstr "Kolone" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "Konfiguracija" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "" #: ulng.rsoptionseditorfileoperations msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "Operacije nad fajlovima" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "Fajl paneli" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "Tipovi fajla" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "Tabovi direktorijuma" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "Fontovi" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "Prečice" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "Ikonice" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "Lista ignorisanja" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "Jezik" #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "Raspored" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "Log" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "Raznovrsnost" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "Dodaci" #: ulng.rsoptionseditorquicksearch msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "Brzo traženje/filter" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "Terminal F9" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "Alati" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "Podsetnici" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "Levo dugme;Desno dugme;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "Dodatak %s je već dodeljen za sledeće ekstenzije:" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "Aktivan" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "Naziv fajla" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "Naziv" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "Registrovan za" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "Alfabetski, uzevši u obzir akcente;Prirodno sortiranje: alfabetski i brojevi" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "Vrh;Dno;" #: ulng.rsopttoolbarbuttontype msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "Nije moguće promeniti prava pristupa za \"%s\"" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "Nije moguće promeniti vlasnika za \"%s\"" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "Fajl" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "Direktorijum" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "Imenovana cev" #: ulng.rspropsno msgid "No" msgstr "Ne" #: ulng.rspropssocket msgid "Socket" msgstr "Podnožje" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "Specijalni blok uređaj" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "Specijalni uređaj karaktera" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "Simbolički link" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "Nepoznati tip" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "Da (%s)" #: ulng.rssearchresult msgid "Search result" msgstr "Rezultati pretrage" #: ulng.rssearchtemplateunnamed msgid "" msgstr "" #: ulng.rsselectdir msgid "Select a directory" msgstr "Izaberi direktorijum" #: ulng.rsshowhelpfor msgid "&Show help for %s" msgstr "" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "Bajti" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "Gigabajti" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "Kilobajti" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "Megabajti" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "Terabajti" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "Fajlova: %d, Direktorijuma: %d, Veličina: %s (%s bajta)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "Nije moguće kreirati odredišni direktorijum!" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "Neispravan format veličine fajla!" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "Nije moguće podeliti fajl!" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "Broj delova je veći od 100! Nastaviti?" #: ulng.rssplitseldir msgid "Select directory:" msgstr "Izaberi direktorijum:" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "Greška pri kreiranju simboličkog linka." #: ulng.rssyndefaulttext msgid "Default text" msgstr "" #: ulng.rssynlangplaintext msgid "Plain text" msgstr "" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "Dan(a)" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "Sat(i)" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "Minut(a)" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "Mesec(i)" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "Sekunda(i)" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "Nedelja" #: ulng.rstimeunityear msgid "Year(s)" msgstr "Godina" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "Upoređivanje" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "Editor" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "Terminal F9" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "Preglednik" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "Molimo prijavite ovu grešku na sistem za praćenje grešaka sa opisom šta ste radili i sledeći fajl:%sPritisnite %s da nastavite ili %s da prekinete program." #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "Mreža" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "Interni Preglednik Double Commander-a." #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "Enkodiranje" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "%s nije pronađen!" doublecmd-0.5.8/language/doublecmd.de.po0000644000175000017500000070440512250633131017164 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.5 alphaReport-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-12-20 12:40+0300\n" "PO-Revision-Date: 2013-05-07 16:14+0100\n" "Last-Translator: Vacon \n" "Language-Team: Deutsch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: German\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "Alle" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "Alle" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "Alle" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "Alle" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "Alle" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "Alle" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "Alle" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "Abbruch" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "" #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "->" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "<-" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "Bearbeite angepasste Spaltenansichten" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "Hintergrund:" #: tfcolumnssetconf.cbcursorborder.caption msgid "Cursor border" msgstr "Cursor Begrenzung" #: tfcolumnssetconf.cbovercolor.caption msgid "Allow Overcolor" msgstr "Erlaube Farb-Überschneidung" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "Nutze selbstdefinierte Schriftart und -farbe" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "Textfarbe" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "Schriftart:" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "Grösse:" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "Hintergrund 2:" #: tfcolumnssetconf.lblconfigviewnr.caption msgid "Configure view nr:" msgstr "Bearbeite Ansicht Nr.:" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "Cursorfarbe" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "Cursortext" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "Markierungsfarbe" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "Name:" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "Spalte hinzufügen" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "Spalten bearbeiten" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "Vorschau" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "R" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "Vorlage wählen..." #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption #, fuzzy #| msgid "Check free space" msgid "C&heck free space" msgstr "Prüfe freien Speic&her" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption #, fuzzy #| msgid "Copy attributes" msgid "Cop&y attributes" msgstr "Attribute ko&pieren" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption #, fuzzy #| msgid "Copy ownership" msgid "Copy o&wnership" msgstr "Besitzer k&opieren" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption #, fuzzy #| msgid "Copy date/time" msgid "Copy d&ate/time" msgstr "D&atum/Zeit kopieren" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption #, fuzzy #| msgid "Correct links" msgid "Correct lin&ks" msgstr "&Korrigiere Verknüpfungen" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "Sch&reibschutz-Attribut entfernen" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption #, fuzzy #| msgid "Exclude empty directories" msgid "E&xclude empty directories" msgstr "Leere &Verzeichnisse ignorieren" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption #, fuzzy #| msgid "Follow links" msgid "Fo&llow links" msgstr "Fo&lge Verknüpfungen" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption #, fuzzy #| msgid "Reserve space" msgid "&Reserve space" msgstr "Speicherplatz &reservieren" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "Was soll getan werden, wenn Dateieigenschaften nicht übernommen werden können" #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "Vorlage aus Datei übernehmen" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption #, fuzzy #| msgid "When directory exists" msgid "When dir&ectory exists" msgstr "W&enn das Verzeichnis vorhanden ist" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption #, fuzzy #| msgid "When file exists" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "&Wenn die Datei vorhanden ist" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption #, fuzzy #| msgid "When cannot set property" msgid "When ca&nnot set property" msgstr "We&nn Eigenschaften nicht übernommen werden können" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "" #: tfrmabout.btnclose.caption msgctxt "TFRMABOUT.BTNCLOSE.CAPTION" msgid "&Close" msgstr "S&chliessen" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "In die Zwischenablage kopieren" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "&Über" #: tfrmabout.lblbuild.caption msgid "Build" msgstr "Build" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "Free Pascal" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "Homepage" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "Revision" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption msgid "Version" msgstr "Version" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Abbru&ch" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "&Zurücksetzen" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "Attribute wählen" #: tfrmattributesedit.cbarchive.caption #, fuzzy #| msgid "Archive" msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "&Archiv" #: tfrmattributesedit.cbcompressed.caption #, fuzzy #| msgid "Compressed" msgid "Co&mpressed" msgstr "Ko&mprimiert" #: tfrmattributesedit.cbdirectory.caption #, fuzzy #| msgid "Directory" msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "Ver&zeichnis" #: tfrmattributesedit.cbencrypted.caption #, fuzzy #| msgid "Encrypted" msgid "&Encrypted" msgstr "V&erschlüsselt" #: tfrmattributesedit.cbhidden.caption #, fuzzy #| msgid "Hidden" msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "&Versteckt" #: tfrmattributesedit.cbreadonly.caption #, fuzzy #| msgid "Read only" msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "&Schreibgeschützt" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmattributesedit.cbsparse.caption #, fuzzy #| msgid "Sparse" msgid "S&parse" msgstr "&Kaum" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Dauerhaft" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmattributesedit.cbsymlink.caption msgid "&Symlink" msgstr "" #: tfrmattributesedit.cbsystem.caption msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "" #: tfrmattributesedit.cbtemporary.caption #, fuzzy #| msgid "Temporary" msgid "&Temporary" msgstr "&Temporär" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "NTFS-Attribute" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "Allgemeine Attribute" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Gruppe" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Andere" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Besitzer" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "Ausführen" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "Lesen" #: tfrmattributesedit.lbltextattrs.caption #, fuzzy #| msgid "As text:" msgid "As te&xt:" msgstr "Als Te&xt:" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "Schreiben" #: tfrmchecksumcalc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Abbruch" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmchecksumcalc.caption msgctxt "tfrmchecksumcalc.caption" msgid "Calculate check sum..." msgstr "Berechne Prüfsumme..." #: tfrmchecksumcalc.cbseparatefile.caption #, fuzzy #| msgid "Create separate checksum file for each file" msgid "C&reate separate checksum file for each file" msgstr "Fü&r jede Datei eigene MD5/SHA1-Prüfdatei erstellen" #: tfrmchecksumcalc.lblsaveto.caption #, fuzzy #| msgid "Save check sum file(s) to:" msgid "&Save check sum file(s) to:" msgstr "Prüf&summen-Datei speichern unter:" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "S&chliessen" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "Verifiziere Prüfsumme..." #: tfrmconnectionmanager.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "&Hinzufügen" #: tfrmconnectionmanager.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Abbruch" #: tfrmconnectionmanager.btnconnect.caption #, fuzzy #| msgid "Connect" msgid "C&onnect" msgstr "Ve&rbinden" #: tfrmconnectionmanager.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "&Löschen" #: tfrmconnectionmanager.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Bearb&eiten" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "Verbindungsmanager" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "Verbinde mit:" #: tfrmcopydlg.btnaddtoqueue.caption #, fuzzy #| msgid "Add To Queue" msgid "A&dd To Queue" msgstr "&Zur Warteschlange hinzufügen" #: tfrmcopydlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Abbruch" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "tfrmcopydlg.btncreatespecialqueue.caption" msgid "..." msgstr "..." #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "O&ptionen" #: tfrmcopydlg.btnsaveoptions.caption #, fuzzy #| msgid "Save these options as default" msgid "Sa&ve these options as default" msgstr "Diese &Optionen als Standard speichern" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "Datei(en) kopieren" #: tfrmdescredit.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Abbruch" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "Datei- / Ordnerkommentar" #: tfrmdescredit.lbleditcommentfor.caption #, fuzzy #| msgid "Edit comment for:" msgid "E&dit comment for:" msgstr "&Bearbeite Kommentar für:" #: tfrmdescredit.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "Kodier&e:" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "&Über" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "Automatisch vergleichen" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "Binärer Modus" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "Abbruch" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "Abbruch" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "Block nach rechts kopieren" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "Block nach rechts kopieren" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "Block nach links kopieren" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "Block nach links kopieren" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Kopieren" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Ausschneiden" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "&Löschen" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Einfügen" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Wiederholen" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "&Alles markieren" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Rückgängig machen" #: tfrmdiffer.actexit.caption #, fuzzy #| msgid "Exit" msgctxt "tfrmdiffer.actexit.caption" msgid "E&xit" msgstr "&Beenden" #: tfrmdiffer.actfirstdifference.caption msgctxt "tfrmdiffer.actfirstdifference.caption" msgid "First Difference" msgstr "Erster Unterschied" #: tfrmdiffer.actfirstdifference.hint msgctxt "tfrmdiffer.actfirstdifference.hint" msgid "First Difference" msgstr "Erster Unterschied" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "Gross- / Kleinschreibung ignorieren" #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "Leerzeichen ignorieren" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "Bildlauf fortsetzen" #: tfrmdiffer.actlastdifference.caption msgctxt "tfrmdiffer.actlastdifference.caption" msgid "Last Difference" msgstr "Letzter Unterschied" #: tfrmdiffer.actlastdifference.hint msgctxt "tfrmdiffer.actlastdifference.hint" msgid "Last Difference" msgstr "Letzter Unterschied" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "Zeilenunterschied" #: tfrmdiffer.actnextdifference.caption msgctxt "tfrmdiffer.actnextdifference.caption" msgid "Next Difference" msgstr "Nächster Unterschied" #: tfrmdiffer.actnextdifference.hint msgctxt "tfrmdiffer.actnextdifference.hint" msgid "Next Difference" msgstr "Nächster Unterschied" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "Öffne links ..." #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "Öffne rechts ..." #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "Hintergrund zeichnen" #: tfrmdiffer.actprevdifference.caption msgctxt "tfrmdiffer.actprevdifference.caption" msgid "Previous Difference" msgstr "Vorheriger Unterschied" #: tfrmdiffer.actprevdifference.hint msgctxt "tfrmdiffer.actprevdifference.hint" msgid "Previous Difference" msgstr "Vorheriger Unterschied" #: tfrmdiffer.actreload.caption #, fuzzy #| msgid "Reload" msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "&Neu laden" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "Neu laden" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "Speichern" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "Speichern" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "Speichern unter ..." #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "Speichern unter ..." #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "Speichere links" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "Speichere links" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "Speichere links unter ..." #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "Speichere links unter ..." #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "Speichere rechts" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "Speichere rechts" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "Speichere rechts unter ..." #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "Speichere rechts unter ..." #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "Vergleiche" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "Vergleiche" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "Codierung" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "Codierung" #: tfrmdiffer.caption msgctxt "TFRMDIFFER.CAPTION" msgid "Compare files" msgstr "Vergleiche Dateien" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miencodingleft.caption #, fuzzy #| msgid "Left" msgid "&Left" msgstr "&Links" #: tfrmdiffer.miencodingright.caption #, fuzzy #| msgid "Right" msgid "&Right" msgstr "&Rechts" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "&Aktionen" #: tfrmdiffer.mnuedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "Bea&rbeiten" #: tfrmdiffer.mnuencoding.caption #, fuzzy #| msgid "Encoding" msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "&Codierung" #: tfrmdiffer.mnufile.caption #, fuzzy #| msgid "File" msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "&Datei" #: tfrmdiffer.mnuoptions.caption #, fuzzy #| msgid "Options" msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "&Optionen" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "Neue Verknüpfung zur Sequenz hinzufügen" #: tfrmedithotkey.btncancel.caption msgctxt "TFRMEDITHOTKEY.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Abbru&ch" #: tfrmedithotkey.btnok.caption msgctxt "TFRMEDITHOTKEY.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "Letzte Verknüpfung aus der Sequenz entfernen" #: tfrmedithotkey.cghkcontrols.caption msgctxt "tfrmedithotkey.cghkcontrols.caption" msgid "Only for these controls" msgstr "Nur für diese Steuerungs-Elemente" #: tfrmedithotkey.lblparameters.caption #, fuzzy #| msgid "Parameters (each in a separate line):" msgid "&Parameters (each in a separate line):" msgstr "&Parameter(jeder in einer eigenen Zeile):" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "Verknüpfungen:" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "&Über" #: tfrmeditor.actabout.hint msgctxt "tfrmeditor.actabout.hint" msgid "About" msgstr "&Über" #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "&Einstellungen" #: tfrmeditor.actconfhigh.hint msgctxt "tfrmeditor.actconfhigh.hint" msgid "Configuration" msgstr "Einstellungen" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Kopieren" #: tfrmeditor.acteditcopy.hint msgctxt "tfrmeditor.acteditcopy.hint" msgid "Copy" msgstr "Kopieren" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Ausschneiden" #: tfrmeditor.acteditcut.hint msgctxt "tfrmeditor.acteditcut.hint" msgid "Cut" msgstr "Ausschneiden" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "&Löschen" #: tfrmeditor.acteditdelete.hint msgctxt "tfrmeditor.acteditdelete.hint" msgid "Delete" msgstr "&Löschen" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "&Suchen" #: tfrmeditor.acteditfind.hint msgctxt "tfrmeditor.acteditfind.hint" msgid "Find" msgstr "Suchen" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "Finde nächste" #: tfrmeditor.acteditfindnext.hint msgctxt "tfrmeditor.acteditfindnext.hint" msgid "Find next" msgstr "Finde nächste" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcr.hint msgctxt "tfrmeditor.acteditlineendcr.hint" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "tfrmeditor.acteditlineendcrlf.hint" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditlineendlf.hint msgctxt "tfrmeditor.acteditlineendlf.hint" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Einfügen" #: tfrmeditor.acteditpaste.hint msgctxt "tfrmeditor.acteditpaste.hint" msgid "Paste" msgstr "Einfügen" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Wiederholen" #: tfrmeditor.acteditredo.hint msgctxt "tfrmeditor.acteditredo.hint" msgid "Redo" msgstr "Wiederholen" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "E&rsetzen" #: tfrmeditor.acteditrplc.hint msgctxt "tfrmeditor.acteditrplc.hint" msgid "Replace" msgstr "Ersetzen" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "&Alle markieren" #: tfrmeditor.acteditselectall.hint msgctxt "tfrmeditor.acteditselectall.hint" msgid "Select All" msgstr "Alle mar&kieren" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Rückgängig machen" #: tfrmeditor.acteditundo.hint msgctxt "tfrmeditor.acteditundo.hint" msgid "Undo" msgstr "Rückgängig machen" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "S&chliessen" #: tfrmeditor.actfileclose.hint msgctxt "tfrmeditor.actfileclose.hint" msgid "Close" msgstr "Schliessen" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "En&de" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "Programm beenden" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "&Neu" #: tfrmeditor.actfilenew.hint msgctxt "tfrmeditor.actfilenew.hint" msgid "New" msgstr "Neu" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "&Öffnen" #: tfrmeditor.actfileopen.hint msgctxt "tfrmeditor.actfileopen.hint" msgid "Open" msgstr "Öffne" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "&Speichern" #: tfrmeditor.actfilesave.hint msgctxt "tfrmeditor.actfilesave.hint" msgid "Save" msgstr "Speichern" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "Speichern &unter..." #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "Speichern unter ..." #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "Alles &speichern" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "Alle speichern" #: tfrmeditor.caption msgctxt "tfrmeditor.caption" msgid "Editor" msgstr "Text-Editor" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "&Hilfe" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Bearbeiten" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "&Kodiere" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "Öffnen als..." #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "Speichern unter..." #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "&Datei" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "S&yntax hervorheben" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "Zeilenende" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n5.caption msgctxt "TFRMEDITOR.N5.CAPTION" msgid "-" msgstr "-" #: tfrmeditsearchreplace.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Abbruch" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgid "C&ase sensitivity" msgstr "Strikt nach S&chreibweise" #: tfrmeditsearchreplace.cbsearchfromcursor.caption #, fuzzy #| msgid "Search from &caret" msgid "S&earch from caret" msgstr "Suche von &caret" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "&Reguläre Ausdrücke" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgid "Selected &text only" msgstr "Nur den markierten &Text" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgid "&Whole words only" msgstr "Nur ganze &Wörter" #: tfrmeditsearchreplace.gbsearchoptions.caption msgid "Option" msgstr "Optionen" #: tfrmeditsearchreplace.lblreplacewith.caption msgid "&Replace with:" msgstr "&Ersetzen mit:" #: tfrmeditsearchreplace.lblsearchfor.caption msgid "&Search for:" msgstr "&Suche nach:" #: tfrmeditsearchreplace.rgsearchdirection.caption msgid "Direction" msgstr "Richtung" #: tfrmextractdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Abbruch" #: tfrmextractdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "&Hilfe" #: tfrmextractdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmextractdlg.caption msgctxt "TFRMEXTRACTDLG.CAPTION" msgid "Unpack files" msgstr "Entpacke Datei(en)" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "&Pfad mit entpacken (falls gespeichert)" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "Jedes Archiv in &separaten Ordner entpacken (mit Namen des Archivs)" #: tfrmextractdlg.cboverwrite.caption #, fuzzy #| msgid "&Overwrite existing files" msgid "O&verwrite existing files" msgstr "&Bestehende Datei(en) überschreiben" #: tfrmextractdlg.lblextractto.caption #, fuzzy #| msgid "To the directory:" msgid "To the &directory:" msgstr "Entpacke &Datei(en) nach:" #: tfrmextractdlg.lblfilemask.caption #, fuzzy #| msgid "Extract files matching file mask:" msgid "&Extract files matching file mask:" msgstr "Entpacken von &Dateien anhand von Vorgaben:" #: tfrmextractdlg.lblpassword.caption #, fuzzy #| msgid "Password for encrypted files:" msgid "&Password for encrypted files:" msgstr "&Passwort für verschlüsselte Dateien" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "Hinzufügen" #: tfrmfileassoc.btnaddext.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "&Hinzufügen" #: tfrmfileassoc.btnaddnewtype.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "&Hinzufügen" #: tfrmfileassoc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Abbruch" #: tfrmfileassoc.btndownact.caption #, fuzzy #| msgid "Down" msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "&Runter" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "&Ok" #: tfrmfileassoc.btnremoveact.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "Ent&fernen" #: tfrmfileassoc.btnremoveext.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "Ent&fernen" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "X" #: tfrmfileassoc.btnremovetype.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "Entfe&rnen" #: tfrmfileassoc.btnrenametype.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "Umb&enennen" #: tfrmfileassoc.btnupact.caption #, fuzzy #| msgid "Up" msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "&Hoch" #: tfrmfileassoc.caption msgid "File associations" msgstr "Datei-Verknüpfungen" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "Aktionen" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "Endungen" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "Dateitypen" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "Icon" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "Aktion:" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "&Befehl" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "Bearbeiten" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "im Editor öffnen" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "Dateiname" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "Dateipfad" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "Vollständiger Pfad" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "Ausgabe aus Konsolen-Fenster entnehmen" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "Öffnen" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "In Konsolen-Fenster ausführen" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "In VFS öffnen" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "Betrachten" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "In Betrachter öffnen" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "S&chliessen" #: tfrmfileexecuteyourself.caption msgctxt "TFRMFILEEXECUTEYOURSELF.CAPTION" msgid "Wait..." msgstr "Warte..." #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "Dateiname:" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "Von:" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "Auf [Schliessen] klicken, wenn die temporären Daten gelöscht werden können!" #: tfrmfileop.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Abbruch" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "&In Panel:" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "&Alle betrachten" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "Aktuelle Operation:" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "Von:" #: tfrmfileop.lblto.caption msgid "To:" msgstr "Nach:" #: tfrmfileproperties.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "S&chliessen" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "Eigen&schaften einstellen" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "&Auf alle ausgewählten Dateien anwenden" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "Diese Datei übers&pringen" #: tfrmfileproperties.caption msgctxt "TFRMFILEPROPERTIES.CAPTION" msgid "Properties" msgstr "Eigenschaften" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Dauerhaft" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "Besitzer" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Gruppe" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Andere" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Besitzer" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmfileproperties.lblattrtextstr.caption #, fuzzy #| msgid "Representation in text:" msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Darstellung im Text" #: tfrmfileproperties.lblcontains.caption msgctxt "tfrmfileproperties.lblcontains.caption" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "Enthält:" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Ausführen" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "Dateiname" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "Name:" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "Dateiname" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "Pfad:" #: tfrmfileproperties.lblgroupstr.caption #, fuzzy #| msgid "Group" msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "&Gruppe" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "Letzter Zugriff" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "Letzte Änderung:" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "Letzte Änderung des Status:" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Oktal:" #: tfrmfileproperties.lblownerstr.caption #, fuzzy #| msgid "Owner" msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "Besit&zer" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Lesen" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "Grösse:" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption #, fuzzy #| msgid "Symlink:" msgid "Symlink to:" msgstr "Symb. Link:" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption #, fuzzy msgid "Type:" msgstr "Typ:" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Schreiben" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Attribute" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "Eigenschaften" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "&Hinzufügen" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "&Hilfe" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "S&chliessen" #: tfrmfinddlg.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmfinddlg.btnedit.caption" msgid "&Edit" msgstr "Bea&rbeiten" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "&Gehe zu Datei" #: tfrmfinddlg.btnlastsearch.caption msgctxt "tfrmfinddlg.btnlastsearch.caption" msgid "&Last search" msgstr "&Letzte Suche" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "&Neue Suche" #: tfrmfinddlg.btnsavetemplate.caption #, fuzzy #| msgid "Save" msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "&Speichern" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "L&öschen" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "&Laden" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "&Speichern" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption #, fuzzy #| msgid "Save with starting path" msgid "Sa&ve with \"Start in directory\"" msgstr "S&peichern mit Start-Pfad" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint #, fuzzy #| msgid "If starting path if saved then it will be restored when loading template. Use it if you want to fix searching to a certain directory." msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "Wenn der Start-Pfad mitgepeichert wird, wird er wiederhergestellt, wenn die Vorlage geladen wird. Nützlich, wenn eine Suche immer im gleichen Verzeichnis gestartet werden soll." #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "&Starten" #: tfrmfinddlg.btnstop.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "&Abbruch" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "Vorlage benutzen" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "&Betrachten" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "Füge in &Listbox ein" #: tfrmfinddlg.caption msgctxt "tfrmfinddlg.caption" msgid "Find files" msgstr "Suche Datei(en)" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "Gross- / Kle&inschreibung beachten" #: tfrmfinddlg.cbdatefrom.caption #, fuzzy #| msgid "Date From:" msgid "&Date from:" msgstr "Ab &Datum:" #: tfrmfinddlg.cbdateto.caption #, fuzzy #| msgid "Date To:" msgid "Dat&e to:" msgstr "&Vor Datum:" #: tfrmfinddlg.cbfilesizefrom.caption #, fuzzy #| msgid "Size from:" msgid "S&ize from:" msgstr "Date&igrösse ab:" #: tfrmfinddlg.cbfilesizeto.caption #, fuzzy #| msgid "Size to:" msgid "Si&ze to:" msgstr "Bis Dateigr&össe" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "Suche in Da&tei" #: tfrmfinddlg.cbfollowsymlinks.caption #, fuzzy #| msgid "Follow symlinks" msgctxt "tfrmfinddlg.cbfollowsymlinks.caption" msgid "Follow s&ymlinks" msgstr "S&ymlinks folgen" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "Suche Datei die &NICHT den Text enthalten" #: tfrmfinddlg.cbnotolderthan.caption #, fuzzy #| msgid "Not older than:" msgid "N&ot older than:" msgstr "Nicht &älter als:" #: tfrmfinddlg.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name " msgid "Searc&h for part of file name" msgstr "Suc&he nach einem Teil des Dateinamens" #: tfrmfinddlg.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "&Reguläre Ausdrücke" #: tfrmfinddlg.cbreplacetext.caption #, fuzzy #| msgid "Re&place text" msgid "Re&place by" msgstr "E&rsetze Text" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "Ausgew&ählte Verzeichnisse und Dateien" #: tfrmfinddlg.cbtimefrom.caption #, fuzzy #| msgid "Time from:" msgid "&Time from:" msgstr "Ne&uer als:" #: tfrmfinddlg.cbtimeto.caption #, fuzzy #| msgid "Time to:" msgid "Ti&me to:" msgstr "Ä<er als:" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "Nutze Such-PlugIn" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "Verzeichnisnamen eingeben, die von der Suche ausgeschlossen werden sollen (Namen mit \";\" trennen)" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "Dateinamen eingeben, die von der Suche ausgeschlossen werden sollen (Namen mit \";\" trennen)" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "Dateinamen durch \";\" getrennt eingeben" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption msgctxt "tfrmfinddlg.gbdirectories.caption" msgid "Directories" msgstr "Verzeichnisse" #: tfrmfinddlg.gbfiles.caption msgctxt "tfrmfinddlg.gbfiles.caption" msgid "Files" msgstr "Dateien" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "Suche Daten" #: tfrmfinddlg.lblattributes.caption msgid "Attri&butes" msgstr "Attri&bute" #: tfrmfinddlg.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "&Kodiere:" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "Unter&verzeichnisse ausschließen" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "Dateien a&usschließen" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "&Dateimaske" #: tfrmfinddlg.lblfindpathstart.caption #, fuzzy #| msgid "&Start in directory" msgid "Start in &directory" msgstr "Verzeichnis in dem &DoubleCommander suchen soll" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "Suche Unter&verzeichnisse" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "&Vorherige Suche(n)" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "Von der Liste entfernen" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "Alle gefundenen Einträge anzeigen" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "Zeige im Betrachter" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "Fortgeschritten" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "Laden/Speichern" #: tfrmfinddlg.tsplugins.caption msgctxt "tfrmfinddlg.tsplugins.caption" msgid "Plugins" msgstr "Plugins" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "Ergebnisse" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "Standard" #: tfrmfindview.btnclose.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "&Abbruch" #: tfrmfindview.btnfind.caption #, fuzzy #| msgid "Find" msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "&Suchen" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "Suchen" #: tfrmfindview.cbcasesens.caption #, fuzzy #| msgid "Case sensitive" msgid "C&ase sensitive" msgstr "Schreibweise be&achten" #: tfrmhardlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Abbruch" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmhardlink.caption #, fuzzy #| msgid "Create hardlink" msgid "Create hard link" msgstr "Hardlink erstellen" #: tfrmhardlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Bestehen&des Ziel (auf das der Hardlink zeigt)" #: tfrmhardlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Hard&link-Name" #: tfrmhotdir.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "&Hinzufügen" #: tfrmhotdir.btnaddman.caption #, fuzzy #| msgid "Add manually" msgid "Add &manually" msgstr "&Manuel hinzufügen" #: tfrmhotdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Abbruch" #: tfrmhotdir.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "&Löschen" #: tfrmhotdir.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Bea&rbeiten" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "Verzeichnisfavoriten" #: tfrmlinker.btnexit.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "&Ende" #: tfrmlinker.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "..." #: tfrmlinker.caption msgctxt "TFRMLINKER.CAPTION" msgid "Linker" msgstr "Verschmelzer" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "Speichern unter..." #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "Eintrag" #: tfrmlinker.lblfilename.caption #, fuzzy #| msgid "File name" msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "&Dateiname" #: tfrmlinker.spbtndel.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "&Löschen" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "&Löschen" #: tfrmlinker.spbtndown.caption #, fuzzy #| msgid "Down" msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "A&bwärts" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "A&bwärts" #: tfrmlinker.spbtnup.caption #, fuzzy #| msgid "Up" msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "Aufw&ärts" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "Aufw&ärts" #: tfrmmain.actabout.caption #, fuzzy #| msgid "About" msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "&Über" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "Dateiname in die Befehlszeile kopieren" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "Pfad und Dateiname in die Befehlszeile kopieren" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "&Pfad in die Befehlszeile eintragen" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "Verkürzt" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "Verkürzte Ansicht" #: tfrmmain.actcalculatespace.caption #, fuzzy #| msgid "Calculate &Occupied Space..." msgid "Calculate &Occupied Space" msgstr "Berechne belegten &Platz" #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "Verzeichnis wechseln" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "In das übergeordnete Verzeichnis wechseln" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "Verzeichnis zu Root wechseln" #: tfrmmain.actchecksumcalc.caption #, fuzzy #| msgid "Calculate check sum..." msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "Berechne Prüf&summe..." #: tfrmmain.actchecksumverify.caption #, fuzzy #| msgid "Verify check sum..." msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "&Verifiziere Prüfsumme..." #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "Log-Datei leeren" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "Log-Fenster leeren" #: tfrmmain.actclosealltabs.caption #, fuzzy #| msgid "Remove &All Tabs" msgctxt "tfrmmain.actclosealltabs.caption" msgid "Close &All Tabs" msgstr "Alle Reiter ent&fernen" #: tfrmmain.actclosetab.caption #, fuzzy #| msgid "&Remove Tab" msgctxt "tfrmmain.actclosetab.caption" msgid "&Close Tab" msgstr "&Entferne Reiter" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "Nächste Befehlszeile" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "Stelle Befehlszeile auf den nächsten Befehl im Verlauf" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "Vorher eingegebener Befehl" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "Nutze die Befehlszeile mit dem zuletzt eingegebenen Befehl" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "Vollständig" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "Spaltenansicht" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "Anhand des &Inhalts vergleichen" #: tfrmmain.actcomparedirectories.caption msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.CAPTION" msgid "Compare Directories" msgstr "Vergleiche Ordner/Verzeichnisse" #: tfrmmain.actcomparedirectories.hint msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.HINT" msgid "Compare Directories" msgstr "Vergleiche Ordner/Verzeichnisse" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "&Zeige Kontextmenü" #: tfrmmain.actcopy.caption #, fuzzy #| msgid "Copy" msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "Kopieren" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "Kopiere Dateinamen mit komplettem &Pfad" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "Kopiere Datei&namen in die Zwischenablage" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "Datei(en) ohne Nachfrage kopieren" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "Kopiere in gleichen Ordner" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "&Kopieren" #: tfrmmain.actcountdircontent.caption #, fuzzy #| msgid "Sho&w occupied space" msgid "Sho&w Occupied Space" msgstr "&Belegten Speicherplatz anzeigen" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "A&usschneiden" #: tfrmmain.actdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMMAIN.ACTDELETE.CAPTION" msgid "Delete" msgstr "Löschen" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "Verzeichnisverlauf" #: tfrmmain.actdirhotlist.caption #, fuzzy #| msgid "Directory &hotlist" msgid "Directory &Hotlist" msgstr "Verzeic&hnis-Favoriten" #: tfrmmain.actedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "Bearbeiten" #: tfrmmain.acteditcomment.caption #, fuzzy #| msgid "Edit comment..." msgid "Edit Co&mment..." msgstr "Ko&mmentar bearbeiten" #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "Datei erstellen und bearbeiten" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "Pfad-Zeile über der Dateiliste bearbeiten" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "&Panels tauschen" #: tfrmmain.actexit.caption #, fuzzy #| msgid "Exit" msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "&Beenden" #: tfrmmain.actextractfiles.caption #, fuzzy #| msgid "Extract files..." msgid "&Extract Files..." msgstr "E&ntpacke Dateien" #: tfrmmain.actfileassoc.caption #, fuzzy #| msgid "File &associations..." msgid "File &Associations..." msgstr "Dateiverkn&üpfungen" #: tfrmmain.actfilelinker.caption #, fuzzy #| msgid "Link files" msgid "Com&bine Files..." msgstr "&Verbinde Datei(en)" #: tfrmmain.actfileproperties.caption #, fuzzy #| msgid "Show file properties" msgid "Show &File Properties" msgstr "Dateiei&genschaften" #: tfrmmain.actfilespliter.caption #, fuzzy #| msgid "Split file" msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "&Teile Datei" #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "Fokus auf die Befehlsze&ile" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "Setze die Einfügemarke auf den ersten Eintrag der Liste" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "Setze die Einfügemarke auf den letzten Eintrag der Liste" #: tfrmmain.acthardlink.caption #, fuzzy #| msgid "Create hard link..." msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "&Hardlink erstellen" #: tfrmmain.acthelpindex.caption #, fuzzy #| msgid "Contents" msgid "&Contents" msgstr "&Inhalte" #: tfrmmain.acthorizontalfilepanels.caption #, fuzzy #| msgid "Horizontal file panels" msgid "&Horizontal Panels Mode" msgstr "&Horizontale Datei-Panel" #: tfrmmain.actkeyboard.caption #, fuzzy #| msgid "Keyboard" msgid "&Keyboard" msgstr "&Tastatur" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "Links &= Rechts" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "Öffne &linke Laufwerksliste" #: tfrmmain.actloadselectionfromclip.caption #, fuzzy #| msgid "Load Selection From Clipboard" msgid "Load Selection from Clip&board" msgstr "Auswahl aus der &Zwischenablage laden" #: tfrmmain.actloadselectionfromfile.caption #, fuzzy #| msgid "Load Selection From File" msgid "&Load Selection from File..." msgstr "Auswah&l aus Datei laden" #: tfrmmain.actmakedir.caption #, fuzzy #| msgid "MakeDir" msgid "MakeDir" msgstr "Verzeichnis erstellen" #: tfrmmain.actmarkcurrentextension.caption #, fuzzy #| msgid "Select all with same extension" msgid "Select All with the Same E&xtension" msgstr "Alle mit gleicher &Endung markieren" #: tfrmmain.actmarkinvert.caption #, fuzzy #| msgid "Invert Selections" msgid "&Invert Selection" msgstr "Auswahl um&kehren" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "Alle&s markieren" #: tfrmmain.actmarkminus.caption #, fuzzy #| msgid "Unselect a group" msgid "Unselect a Gro&up..." msgstr "Gru&ppe abwählen" #: tfrmmain.actmarkplus.caption #, fuzzy #| msgid "Select a group" msgid "Select a &Group..." msgstr "&Gruppe wählen" #: tfrmmain.actmarkunmarkall.caption #, fuzzy #| msgid "Unselect All" msgid "&Unselect All" msgstr "Alles a&bwählen" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "Fenster minimieren" #: tfrmmain.actmultirename.caption #, fuzzy #| msgid "Multi Rename Tool" msgid "Multi &Rename Tool" msgstr "Meh&rfaches umbenennen" #: tfrmmain.actnetworkconnect.caption #, fuzzy #| msgid "Network Connect..." msgid "Network &Connect..." msgstr "Net&zwerk verbinden..." #: tfrmmain.actnetworkdisconnect.caption #, fuzzy #| msgid "Network Disconnect" msgid "Network &Disconnect" msgstr "Netzwerk &trennen" #: tfrmmain.actnetworkquickconnect.caption #, fuzzy #| msgid "Network Quick Connect..." msgid "Network &Quick Connect..." msgstr "Netzwerk schnell &verbinden..." #: tfrmmain.actnewtab.caption #, fuzzy #| msgid "&New tab" msgid "&New Tab" msgstr "Ne&uer Reiter" #: tfrmmain.actnexttab.caption #, fuzzy #| msgid "Switch to nex&t tab" msgid "Switch to Nex&t Tab" msgstr "Zum n&ächsten Reiter wechseln" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "Öffne" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "Versuche Archiv zu öffnen" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "Leisten-Datei öffnen" #: tfrmmain.actopendirinnewtab.caption #, fuzzy #| msgid "Open &folder in new tab" msgid "Open &Folder in a New Tab" msgstr "Verzeichnis in neue&m Reiter öffnen" #: tfrmmain.actopenvirtualfilesystemlist.caption #, fuzzy #| msgid "Open VFS List" msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "Öffne &VFS-Liste" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "Ablauf-&Betrachter" #: tfrmmain.actoptions.caption #, fuzzy #| msgid "Options..." msgid "&Options..." msgstr "&Optionen..." #: tfrmmain.actpackfiles.caption #, fuzzy #| msgid "Pack files..." msgid "&Pack Files..." msgstr "&Packe Dateien" #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "Position des Fenster-Teilers festlegen" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "Einf&ügen" #: tfrmmain.actprevtab.caption #, fuzzy #| msgid "Switch to &previous tab" msgid "Switch to &Previous Tab" msgstr "Zum v&orherigen Reiter wechseln" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "Schneller Filter" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "Schnelle Suche" #: tfrmmain.actquickview.caption #, fuzzy #| msgid "Quick View Panel" msgid "&Quick View Panel" msgstr "S&chnellbetrachter-Panel" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "A&ktualisieren" #: tfrmmain.actrename.caption #, fuzzy #| msgid "Move" msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "Verschieben" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "Verschieben / Umbenennen von Datei(en) ohne Nachfrage" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "Umbenennen" #: tfrmmain.actrenametab.caption #, fuzzy #| msgid "Re&name Tab" msgid "&Rename Tab" msgstr "&Reiter umbenennen" #: tfrmmain.actrestoreselection.caption #, fuzzy #| msgid "Restore Selection" msgid "&Restore Selection" msgstr "Auswahl w&ieder herstellen" #: tfrmmain.actreverseorder.caption #, fuzzy #| msgid "Reverse order" msgid "Re&verse Order" msgstr "&Umgekehrt anordnen" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "Rechts = L&inks" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "Öffne rechte Laufwerksliste" #: tfrmmain.actrunterm.caption #, fuzzy #| msgid "Run Term" msgid "Run &Terminal" msgstr "Konsolen-Fens&ter öffnen" #: tfrmmain.actsaveselection.caption #, fuzzy #| msgid "Save Selection" msgid "Sa&ve Selection" msgstr "Auswahl speiche&rn" #: tfrmmain.actsaveselectiontofile.caption #, fuzzy #| msgid "Save Selection To File" msgid "Save S&election to File..." msgstr "Auswa&hl in Datei speichern" #: tfrmmain.actsearch.caption #, fuzzy #| msgid "&Search" msgid "&Search..." msgstr "&Suchen..." #: tfrmmain.actsetfileproperties.caption #, fuzzy #| msgid "Change attributes" msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "Eigensch&aften ändern" #: tfrmmain.actsettaboptiondirsinnewtab.caption #, fuzzy #| msgid "Directories are opened in new &tabs" msgid "Locked with Directories Opened in New &Tabs" msgstr "Verzeichnisse in neuem Rei&ter öffnen" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "" #: tfrmmain.actsettaboptionpathlocked.caption #, fuzzy #| msgid "Locked" msgid "&Locked" msgstr "&Gesperrt" #: tfrmmain.actsettaboptionpathresets.caption #, fuzzy #| msgid "Locked, but &directory changes allowed" msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "Gesperrt, aber &Verzeichniswechsel erlaubt" #: tfrmmain.actshellexecute.caption msgctxt "tfrmmain.actshellexecute.caption" msgid "Open" msgstr "Öffnen" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "Öffnen anhand der System-eigenen Dateiverknüpfungen (außerhalb von DoubleCommander)" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "Button-Leiste anzeigen" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "Befehlszeilenverlauf anzeigen" #: tfrmmain.actshowmainmenu.caption #, fuzzy #| msgid "Menu" msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "Menü" #: tfrmmain.actshowsysfiles.caption #, fuzzy #| msgid "Show hidden/system files" msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "&Zeige versteckte und Systemdateien" #: tfrmmain.actsortbyattr.caption #, fuzzy #| msgid "Sort by attrib" msgid "Sort by &Attributes" msgstr "Nach &Attributen sortieren" #: tfrmmain.actsortbydate.caption #, fuzzy #| msgid "Sort by date" msgid "Sort by &Date" msgstr "Nach &Datum sortieren" #: tfrmmain.actsortbyext.caption #, fuzzy #| msgid "Sort by extension" msgid "Sort by &Extension" msgstr "Nach &Endung sortieren" #: tfrmmain.actsortbyname.caption #, fuzzy #| msgid "Sort by name" msgid "Sort by &Name" msgstr "Nach &Name sortieren" #: tfrmmain.actsortbysize.caption #, fuzzy #| msgid "Sort by size" msgid "Sort by &Size" msgstr "Nach &Grösse sortieren" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "De-/Aktivieren der Dateiliste um Dateinamen nicht anzuzeigen" #: tfrmmain.actsymlink.caption #, fuzzy #| msgid "Create symbolic link..." msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "Erstelle symb. &Link..." #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "Ziel = &Quelle" #: tfrmmain.acttestarchive.caption #, fuzzy #| msgid "Test Archive(s)" msgid "&Test Archive(s)" msgstr "Archiv(e) &testen" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "Vorschaubilder" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "Ansicht \"Vorschaubilder\"" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "Bewege markierten &Ordner in das linke Fenster" #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "Bewege &markierten Ordner in das rechte Fenster" #: tfrmmain.actunmarkcurrentextension.caption #, fuzzy #| msgid "Unselect all with same extension" msgid "Unselect All with the Same Ex&tension" msgstr "Alle mit der gleichen E&ndung abwählen" #: tfrmmain.actview.caption #, fuzzy #| msgid "View" msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "Betrachten" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "Zeige den Verlauf der geöffneten Verzeichnisse des aktiven Panels" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "Gehe zum nächsten Eintrag in der Verlaufsliste" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "Gehe zum vorherigen Eintrag in der Verlaufsliste" #: tfrmmain.actvisithomepage.caption #, fuzzy #| msgid "&Visit Double Commander Web Site" msgid "&Visit Double Commander Website" msgstr "&Homepage von DoubleCommander öffnen" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "Löschen" #: tfrmmain.btnf10.caption #, fuzzy #| msgid "Exit" msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "Beenden" #: tfrmmain.btnf8.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMMAIN.BTNF8.CAPTION" msgid "Delete" msgstr "Löschen" #: tfrmmain.btnf9.caption #, fuzzy #| msgid "Terminal" msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "Konsolen-Fenster" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint msgid "Directory hotlist" msgstr "Favoriten für Verzeichnisse anzeigen" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "Aktuelles Verzeichnis der rechten Seite auch auf der linken Seite anzeigen" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnlefthome.hint msgid "Go to home directory" msgstr "Zu 'Eigene Dateien' wechseln" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgid "Go to root directory" msgstr "Zum Root-Verzeichnis wechseln" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgid "Go to parent directory" msgstr "Zum übergeordneten Verzeichnis wechseln" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr "" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "Aktuelles Verzeichnis der linken Seite auch auf der rechten Seite anzeigen" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "tfrmmain.caption" msgid "Double Commander" msgstr "Double Commander" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "Pfad" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "Abbruch" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "Kopiere..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "Hardlink erstellen" #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline33.caption msgctxt "tfrmmain.miline33.caption" msgid "-" msgstr "-" #: tfrmmain.miline37.caption msgctxt "TFRMMAIN.MILINE37.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "-" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "Leeren" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "Kopieren" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "Verstecken" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "Alle mar&kieren" #: tfrmmain.mimove.caption msgid "Move..." msgstr "Verschiebe..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "Erstelle symb. Link" #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "Reiter-Optionen" #: tfrmmain.mitrayiconexit.caption #, fuzzy #| msgid "Exit" msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "&Beenden" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "Wiederherstellen" #: tfrmmain.mnualloperpause.caption msgctxt "tfrmmain.mnualloperpause.caption" msgid "||" msgstr "" #: tfrmmain.mnualloperstart.caption msgctxt "tfrmmain.mnualloperstart.caption" msgid "Start" msgstr "" #: tfrmmain.mnualloperstop.caption msgctxt "tfrmmain.mnualloperstop.caption" msgid "Cancel" msgstr "Abbruch" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "&Befehle" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "K&onfigurieren" #: tfrmmain.mnufiles.caption #, fuzzy #| msgid "Files" msgid "&Files" msgstr "&Dateien" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "&Hilfe" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "&Markieren" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "Netzwerk" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "&Zeigen" #: tfrmmain.mnutaboptions.caption #, fuzzy #| msgid "Options" msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "&Optionen" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "&Reiter" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "Verzeichnis-Wechsel" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "Kopieren" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "Ausschneiden" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "&Löschen" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "Bea&rbeiten" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "Einfügen" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmmaskinputdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Abbruch" #: tfrmmaskinputdlg.btndefinetemplate.caption #, fuzzy #| msgid "Define..." msgid "&Define..." msgstr "&Definieren..." #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmmaskinputdlg.lblsearchtemplate.caption #, fuzzy #| msgid "Or select predefined selection type:" msgid "O&r select predefined selection type:" msgstr "Ode&r vordefinierten Auswahltyp wählen:" #: tfrmmkdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Abbruch" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmmkdir.caption msgid "Create new directory" msgstr "Neues Verzeichnis anlegen" #: tfrmmkdir.lblmakedir.caption #, fuzzy #| msgid "Input new directory name:" msgid "&Input new directory name:" msgstr "Namen für neues Verze&ichnis eingeben" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "Verhältnis" #: tfrmmodview.caption msgctxt "TFRMMODVIEW.CAPTION" msgid "New Size" msgstr "Neue Grösse" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "Höhe :" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgid "2" msgstr "" #: tfrmmodview.lblpath3.caption msgid "3" msgstr "" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "Kompressions-Qualität für Jpg" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "Breite :" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "" #: tfrmmodview.teheight.text msgid "Height" msgstr "Höhe" #: tfrmmodview.tequality.text msgid "80" msgstr "" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "Breite" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "S&chliessen" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "L&öschen" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "&Laden" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "&Umbenennen" #: tfrmmultirename.btnrestore.caption #, fuzzy #| msgid "Reset all" msgid "Reset &all" msgstr "&Alle wieder herstellen" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "&Speichern" #: tfrmmultirename.caption msgctxt "tfrmmultirename.caption" msgid "MultiRename" msgstr "Mehrfaches Umbenennen" #: tfrmmultirename.cblog.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "Akti&vieren" #: tfrmmultirename.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "&Reguläre Ausdrücke" #: tfrmmultirename.cbusesubs.caption #, fuzzy #| msgid "Use substitution" msgid "&Use substitution" msgstr "N&utze Ersetzung" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption #, fuzzy #| msgid "[E]xtension" msgid "[E] Extension" msgstr "[E]ndung" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "Zähler" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "Suchen und e&rsetzen" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "Log-Ergebnis" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "Maske" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "Vorgaben" #: tfrmmultirename.lbext.caption #, fuzzy #| msgid "Extension" msgid "&Extension" msgstr "&Endung" #: tfrmmultirename.lbfind.caption #, fuzzy #| msgid "Find..." msgid "&Find..." msgstr "Su&che..." #: tfrmmultirename.lbinterval.caption #, fuzzy #| msgid "Interval" msgid "&Interval" msgstr "&Interval" #: tfrmmultirename.lbname.caption #, fuzzy #| msgid "File Name" msgid "File &Name" msgstr "Datei&name" #: tfrmmultirename.lbreplace.caption #, fuzzy #| msgid "Replace..." msgid "Re&place..." msgstr "Er&setze..." #: tfrmmultirename.lbstnb.caption #, fuzzy #| msgid "Start Number" msgid "S&tart Number" msgstr "S&tarten bei" #: tfrmmultirename.lbwidth.caption #, fuzzy #| msgid "Width" msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "&Breite" #: tfrmmultirename.micounter.caption #, fuzzy #| msgid "[C]ounter" msgid "[C] Counter" msgstr "[C] Zählweise" #: tfrmmultirename.miday.caption #, fuzzy #| msgid "[D]ay" msgid "[D] Day" msgstr "[D] Tag" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "[DD] Tag (zweistellig)" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "[DDD] Tag der Woche (kurz, z. B. \"Mo\")" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "[DDDD] Tag der Woche (lang, z. B. \"Montag\")" #: tfrmmultirename.miextensionx.caption #, fuzzy #| msgid "[Ex]xtension" msgid "[Ex] Character at position x" msgstr "[Ex]Bezeichnung an Position x" #: tfrmmultirename.miextensionxx.caption #, fuzzy #| msgid "[Ex:x]xtension" msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:y]Bezeichnung von Positionx bis y" #: tfrmmultirename.mihour.caption #, fuzzy #| msgid "[h]our" msgid "[h] Hour" msgstr "[h]Stunde" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "[hh] Stunde (zweistellig)" #: tfrmmultirename.miminute.caption #, fuzzy #| msgid "Mi[n]ute" msgid "[n] Minute" msgstr "[n] Minute" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "[nn] Minute (zweistellig)" #: tfrmmultirename.mimonth.caption #, fuzzy #| msgid "[M]onth" msgid "[M] Month" msgstr "[M] Monat" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "[MM] Monat (zweistellig)" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "[MMM] Monatsname (kurz, z. B. \"Jan\")" #: tfrmmultirename.mimonth3.caption #, fuzzy #| msgid "[MMMM] Month name (long, e.g. \"january\")" msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "[MMMM] Monatsname (lang, z. B. \"Januar\")" #: tfrmmultirename.miname.caption #, fuzzy #| msgid "[N]ame" msgid "[N] Name" msgstr "[N] Name" #: tfrmmultirename.minamex.caption #, fuzzy #| msgid "[Nx]ame" msgid "[Nx] Character at position x" msgstr "[Nx]Bezeichnung an Position x" #: tfrmmultirename.minamexx.caption #, fuzzy #| msgid "[Nx:x]ame" msgid "[Nx:y] Characters from position x to y" msgstr "[Nx:y] Bezeichnung von Position x bis y" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "Zeit..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "Endung..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "Name..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "" #: tfrmmultirename.misecond.caption #, fuzzy #| msgid "[s]econd" msgid "[s] Second" msgstr "[S] Sekunde" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "[ss] Sekunde (zweistellig)" #: tfrmmultirename.miyear.caption #, fuzzy #| msgid "[Y] Year" msgid "[Y] Year (2 digits)" msgstr "[Y] Jahr (zweistellig)" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "[YYYY] Jahr (vierstellig)" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "tfrmmultirename.stringgrid.columns[0].title.caption" msgid "Old File Name" msgstr "Vorheriger Dateiname" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "tfrmmultirename.stringgrid.columns[1].title.caption" msgid "New File Name" msgstr "Neuer Dateiname" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "tfrmmultirename.stringgrid.columns[2].title.caption" msgid "File Path" msgstr "Dateipfad" #: tfrmopenwith.caption msgid "Choose an application" msgstr "Anwendung auswählen" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "Angepasster Befehl" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "Verknüpfung speichern" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "Gewählte Aktion als Standard festlegen" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "Dateityp zum Öffnen: %s" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "Mehrere Dateinamen" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "Mehrere URL" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "Einzelner Dateiname" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "Einzelne URL" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "" #: tfrmoptions.btnapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "&Übernehmen" #: tfrmoptions.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Abbru&ch" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmoptions.caption msgctxt "tfrmoptions.caption" msgid "Options" msgstr "Optionen" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "Bitte eine der Unterseiten auswählen, diese Seite hier enthält keine Einstellmöglichkeiten." #: tfrmoptionsarchivers.btnautoconfig.caption #, fuzzy #| msgid "Auto Configure" msgctxt "TFRMOPTIONSARCHIVERS.BTNAUTOCONFIG.CAPTION" msgid "A&uto Configure" msgstr "A&uto-Konfiguration" #: tfrmoptionsarchivers.btnmultiarcadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCADD.CAPTION" msgid "A&dd" msgstr "&Hinzufügen" #: tfrmoptionsarchivers.btnmultiarcapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCAPPLY.CAPTION" msgid "A&pply" msgstr "&Übernehmen" #: tfrmoptionsarchivers.btnmultiarcdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCDELETE.CAPTION" msgid "D&elete" msgstr "&Löschen" #: tfrmoptionsarchivers.btnmultiarcrename.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCRENAME.CAPTION" msgid "&Rename" msgstr "&Umbenennen" #: tfrmoptionsarchivers.chkmultiarcdebug.caption #, fuzzy #| msgid "Debug mode" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCDEBUG.CAPTION" msgid "De&bug mode" msgstr "De&bug-Modus" #: tfrmoptionsarchivers.chkmultiarcenabled.caption #, fuzzy #| msgid "Enabled" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCENABLED.CAPTION" msgid "E&nabled" msgstr "A&ktiviert" #: tfrmoptionsarchivers.chkmultiarcoutput.caption #, fuzzy #| msgid "Show console output" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCOUTPUT.CAPTION" msgid "S&how console output" msgstr "&Zeige die Ausgabe des Konsolenfensters" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "TFRMOPTIONSARCHIVERS.GBARCHIVEROPTIONS.CAPTION" msgid "Options" msgstr "Optionen" #: tfrmoptionsarchivers.lblarchiveadd.caption #, fuzzy #| msgid "Add:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEADD.CAPTION" msgid "Add&ing:" msgstr "Füge h&inzu:" #: tfrmoptionsarchivers.lblarchiveextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTENSION.CAPTION" msgid "E&xtension:" msgstr "&Endung:" #: tfrmoptionsarchivers.lblarchiveextract.caption #, fuzzy #| msgid "Extract:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTRACT.CAPTION" msgid "Ex&tract:" msgstr "En&tpacke:" #: tfrmoptionsarchivers.lblarchivelist.caption #, fuzzy #| msgid "List:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELIST.CAPTION" msgid "&List:" msgstr "&Liste auf:" #: tfrmoptionsarchivers.lblarchivelistend.caption #, fuzzy #| msgid "Listing finish (optional):" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTEND.CAPTION" msgid "Listing &finish (optional):" msgstr "Aufli&stungsende (optional):" #: tfrmoptionsarchivers.lblarchivelistformat.caption #, fuzzy #| msgid "Listing format:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTFORMAT.CAPTION" msgid "Listing for&mat:" msgstr "Auflistungsfor&mat" #: tfrmoptionsarchivers.lblarchiveliststart.caption #, fuzzy #| msgid "Listing start (optional):" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTSTART.CAPTION" msgid "Listin&g start (optional):" msgstr "Auflistun&gsbeginn (optional):" #: tfrmoptionsarchivers.lblarchiver.caption #, fuzzy #| msgid "Archiver:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVER.CAPTION" msgid "Arc&hiver:" msgstr "Arc&hivierer:" #: tfrmoptionsarchivers.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMOPTIONSARCHIVERS.LBLDESCRIPTION.CAPTION" msgid "De&scription:" msgstr "Be&schreibung:" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERADDITIONAL.CAPTION" msgid "Additional" msgstr "Zusätzlich" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERGENERAL.CAPTION" msgid "General" msgstr "Allgemein" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption #, fuzzy #| msgid "Also when &size, date, or attributes change" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHATTRIBUTESCHANGE.CAPTION" msgid "When &size, date or attributes change" msgstr "Auch wenn &Grösse, Datum oder Attribut geändert werden" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHEXCLUDEDIRS.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "Für die &folgenden Pfade und Unterverzeichnisse:" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption #, fuzzy #| msgid "When files are &created, deleted or renamed" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHFILENAMECHANGE.CAPTION" msgid "When &files are created, deleted or renamed" msgstr "Au&ffrischen wenn Dateien erstellt, gelöscht oder umbenannt werden" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption #, fuzzy #| msgid "Don't &react to updates while in the background" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHONLYFOREGROUND.CAPTION" msgid "When application is in the &background" msgstr "Nicht auf Änderungen reagieren wenn im Hintergrund" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHDISABLE.CAPTION" msgid "Disable auto-refresh" msgstr "Kein automatisches Auffrischen" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHENABLE.CAPTION" msgid "Refresh file list" msgstr "Dateiliste auffrischen" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption #, fuzzy #| msgid "Always show tray icon" msgctxt "TFRMOPTIONSBEHAVIOR.CBALWAYSSHOWTRAYICON.CAPTION" msgid "Al&ways show tray icon" msgstr "&Immer Tray-Icon anzeigen (neben der Uhr)" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption #, fuzzy #| msgid "Automatically hide unmounted devices" msgid "Automatically &hide unmounted devices" msgstr "Automatisc&h Laufwerke ausblenden, die nicht mehr eingehangen sind (Linux: unmounted)" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBMINIMIZETOTRAY.CAPTION" msgid "Mo&ve icon to system tray when minimized" msgstr "In den Sys-Tray minimieren (neben der Uhr)" #: tfrmoptionsbehavior.cbonlyonce.caption #, fuzzy #| msgid "Allow only one copy of DC at a time" msgctxt "TFRMOPTIONSBEHAVIOR.CBONLYONCE.CAPTION" msgid "A&llow only one copy of DC at a time" msgstr "Nur eine Instanz von Doub&leCommander gleichzeitig erlauben" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "Hier können ein oder mehrere Laufwerke oder Mount_Points angegeben werden, die so getrennt werden müssen \";\"." #: tfrmoptionsbehavior.lbldrivesblacklist.caption #, fuzzy #| msgid "Drives blacklist" msgid "Drives &blacklist" msgstr "A&usschlussliste für Laufwerke" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption #, fuzzy #| msgid "Cut text to column width" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBCUTTEXTTOCOLWIDTH.CAPTION" msgid "Cut &text to column width" msgstr "&Text auf Spaltenbreite kürzen" #: tfrmoptionscolumnsview.cbgridhorzline.caption #, fuzzy #| msgid "Horizontal lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDHORZLINE.CAPTION" msgid "&Horizontal lines" msgstr "&Horizontale Linien" #: tfrmoptionscolumnsview.cbgridvertline.caption #, fuzzy #| msgid "Vertical lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDVERTLINE.CAPTION" msgid "&Vertical lines" msgstr "&Vertikale Linien" #: tfrmoptionscolumnsview.chkautofillcolumns.caption #, fuzzy #| msgid "Auto fill columns" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CHKAUTOFILLCOLUMNS.CAPTION" msgid "A&uto fill columns" msgstr "Spalten &automatisch füllen" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "Zeige Gitterstruktur zur Orientierung" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "Grösse der Spalten automatisch einstellen" #: tfrmoptionscolumnsview.lblautosizecolumn.caption #, fuzzy #| msgid "Auto size column:" msgctxt "TFRMOPTIONSCOLUMNSVIEW.LBLAUTOSIZECOLUMN.CAPTION" msgid "Auto si&ze column:" msgstr "&Grösse der Spalten automatisch einstellen:" #: tfrmoptionsconfiguration.btnconfigapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGAPPLY.CAPTION" msgid "A&pply" msgstr "&Übernehmen" #: tfrmoptionsconfiguration.btnconfigedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGEDIT.CAPTION" msgid "&Edit" msgstr "B&earbeiten" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption #, fuzzy #| msgid "Command line history" msgctxt "TFRMOPTIONSCONFIGURATION.CBCMDLINEHISTORY.CAPTION" msgid "Co&mmand line history" msgstr "&Verlauf der Befehlszeile" #: tfrmoptionsconfiguration.cbdirhistory.caption #, fuzzy #| msgid "Directory history" msgctxt "TFRMOPTIONSCONFIGURATION.CBDIRHISTORY.CAPTION" msgid "&Directory history" msgstr "Ver&zeichnisverlauf" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption #, fuzzy #| msgid "File mask history" msgctxt "TFRMOPTIONSCONFIGURATION.CBFILEMASKHISTORY.CAPTION" msgid "&File mask history" msgstr "Dateimasken-Verlau&f" #: tfrmoptionsconfiguration.chksaveconfiguration.caption #, fuzzy #| msgid "Save configuration" msgctxt "TFRMOPTIONSCONFIGURATION.CHKSAVECONFIGURATION.CAPTION" msgid "Sa&ve configuration" msgstr "&Konfiguration speichern" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption #, fuzzy #| msgid "Search/Replace history" msgctxt "TFRMOPTIONSCONFIGURATION.CHKSEARCHREPLACEHISTORY.CAPTION" msgid "Searc&h/Replace history" msgstr "Suc&he / Ersetze Verlauf " #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBLOCCONFIGFILES.CAPTION" msgid "Location of configuration files" msgstr "Speicherort der Konfigurationsdatei" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBSAVEONEXIT.CAPTION" msgid "Save on exit" msgstr "Beim Beenden speichern" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgctxt "TFRMOPTIONSCONFIGURATION.LBLCMDLINECONFIGDIR.CAPTION" msgid "Set on command line" msgstr "An Eingabeaufforderung übergeben" #: tfrmoptionsconfiguration.rbprogramdir.caption #, fuzzy #| msgid "Program directory (portable version)" msgctxt "TFRMOPTIONSCONFIGURATION.RBPROGRAMDIR.CAPTION" msgid "P&rogram directory (portable version)" msgstr "P&rogrammverzeichnis (portable Version)" #: tfrmoptionsconfiguration.rbuserhomedir.caption #, fuzzy #| msgid "User home directory" msgctxt "TFRMOPTIONSCONFIGURATION.RBUSERHOMEDIR.CAPTION" msgid "&User home directory" msgstr "E&igene Dateien" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption #, fuzzy #| msgid "Copy" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNCOPYCOLUMNSSET.CAPTION" msgid "C&opy" msgstr "K&opieren" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNDELCOLUMNSSET.CAPTION" msgid "&Delete" msgstr "&Löschen" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNEDITCOLUMNSSET.CAPTION" msgid "&Edit" msgstr "Bea&rbeiten" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNNEWCOLUMNSSET.CAPTION" msgid "&New" msgstr "&Neu" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.CBBFILESYSTEM.TEXT" msgid "General" msgstr "Allgemein" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption #, fuzzy #| msgid "Configure columns for file system:" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.LBLCONFIGCOLUMNS.CAPTION" msgid "Con&figure columns for file system:" msgstr "Bearbeite Spalten für Dateis&ystem" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption #, fuzzy #| msgid "Show confirmation dialog after drop" msgid "&Show confirmation dialog after drop" msgstr "Zeige Be&stätigungsdialog nach dem Ziehen und Ablegen von Dateien" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption #, fuzzy #| msgid "Show file system" msgid "Show &file system" msgstr "&Zeige Dateisystem" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption #, fuzzy #| msgid "Show free space" msgid "Show fr&ee space" msgstr "Z&eige freien Speicherplatz" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption #, fuzzy #| msgid "Show label" msgid "Show &label" msgstr "Zeige &Laufwerksbezeichnung" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "Laufwerksliste" #: tfrmoptionseditorcolors.backgroundlabel.caption #, fuzzy #| msgid "Background" msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "&Hintergrund" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption #, fuzzy #| msgid "Background" msgctxt "tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption" msgid "Bac&kground" msgstr "&Hintergrund" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "Attribut des Elements" #: tfrmoptionseditorcolors.foregroundlabel.caption #, fuzzy #| msgid "Foreground" msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "Vo&rdergrund" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption #, fuzzy #| msgid "Foreground" msgctxt "tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption" msgid "Fo®round" msgstr "Vo&rdergrund" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption #, fuzzy #| msgid "Text-mark" msgid "&Text-mark" msgstr "&Textmarkierung" #: tfrmoptionseditorcolors.tbtnglobal.caption #, fuzzy #| msgid "Use (and edit) global scheme settings" msgid "Use (and edit) &global scheme settings" msgstr "Nutze (und bearbeite) all&gemeine Schemeinstellungen" #: tfrmoptionseditorcolors.tbtnlocal.caption #, fuzzy #| msgid "Use local scheme settings" msgid "Use &local scheme settings" msgstr "Nutze &lokales Schemaeinstellungen" #: tfrmoptionseditorcolors.textboldcheckbox.caption #, fuzzy #| msgid "Bold" msgid "&Bold" msgstr "&Fett" #: tfrmoptionseditorcolors.textboldradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textboldradioinvert.caption" msgid "In&vert" msgstr "&Umgekehrt" #: tfrmoptionseditorcolors.textboldradiooff.caption #, fuzzy #| msgid "Off" msgctxt "tfrmoptionseditorcolors.textboldradiooff.caption" msgid "O&ff" msgstr "Au&s" #: tfrmoptionseditorcolors.textboldradioon.caption #, fuzzy #| msgid "On" msgctxt "tfrmoptionseditorcolors.textboldradioon.caption" msgid "O&n" msgstr "A&n" #: tfrmoptionseditorcolors.textitaliccheckbox.caption #, fuzzy #| msgid "Italic" msgid "&Italic" msgstr "Kurs&iv" #: tfrmoptionseditorcolors.textitalicradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textitalicradioinvert.caption" msgid "In&vert" msgstr "Um&gekehrt" #: tfrmoptionseditorcolors.textitalicradiooff.caption #, fuzzy #| msgid "Off" msgctxt "tfrmoptionseditorcolors.textitalicradiooff.caption" msgid "O&ff" msgstr "Au&s" #: tfrmoptionseditorcolors.textitalicradioon.caption #, fuzzy #| msgid "On" msgctxt "tfrmoptionseditorcolors.textitalicradioon.caption" msgid "O&n" msgstr "A&n" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption #, fuzzy #| msgid "Strike Out" msgid "&Strike Out" msgstr "Durchge&strichen" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textstrikeoutradioinvert.caption" msgid "In&vert" msgstr "Um&gekehrt" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption #, fuzzy #| msgid "Off" msgctxt "tfrmoptionseditorcolors.textstrikeoutradiooff.caption" msgid "O&ff" msgstr "Au&s" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption #, fuzzy #| msgid "On" msgctxt "tfrmoptionseditorcolors.textstrikeoutradioon.caption" msgid "O&n" msgstr "A&n" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption #, fuzzy #| msgid "Underline" msgid "&Underline" msgstr "&Unterstreichen" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "Um&gekehrt" #: tfrmoptionseditorcolors.textunderlineradiooff.caption #, fuzzy #| msgid "Off" msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "Au&s" #: tfrmoptionseditorcolors.textunderlineradioon.caption #, fuzzy #| msgid "On" msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "A&n" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption #, fuzzy #| msgid "Copy operation" msgid "Cop&y operation" msgstr "Kop&ieren" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption #, fuzzy #| msgid "Delete operation" msgid "&Delete operation" msgstr "En&dgültiges Löschen" #: tfrmoptionsfileoperations.cbdeletetotrash.caption #, fuzzy #| msgid "Delete to recycle bin (Shift key reverses this setting)" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDELETETOTRASH.CAPTION" msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "&F8/Entf löscht in den Papierkorb (mit 'Umschalt'- Taste = endgültiges Löschen)" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption #, fuzzy #| msgid "Delete to trash operation" msgid "D&elete to trash operation" msgstr "In d&en Papierkorb löschen" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDROPREADONLYFLAG.CAPTION" msgid "D&rop readonly flag" msgstr "Sch&reibschutz-Attribut entfernen" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption #, fuzzy #| msgid "Move operation" msgid "&Move operation" msgstr "&Verschieben" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPARTIALNAMESEARCH.CAPTION" msgid "&Search for part of file name" msgstr "&Suche nach Teil des Dateinamens" #: tfrmoptionsfileoperations.cbprocesscomments.caption #, fuzzy #| msgid "Process comments with files/folders" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPROCESSCOMMENTS.CAPTION" msgid "&Process comments with files/folders" msgstr "K&ommentare von Dateien / Verzeichnissen mitbearbeiten" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption #, fuzzy #| msgid "Select file name without extension when renaming" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBRENAMESELONLYNAME.CAPTION" msgid "Select &file name without extension when renaming" msgstr "&Nur den Dateinamen bearbeiten (nicht die Endung)" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption #, fuzzy #| msgid "Show tab select panel in copy/move dialog" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSHOWCOPYTABSELECTPANEL.CAPTION" msgid "Sho&w tab select panel in copy/move dialog" msgstr "&Zeige Auswahldialog für Tabs im Kopieren/Verschieben-Dialog" #: tfrmoptionsfileoperations.cbskipfileoperror.caption #, fuzzy #| msgid "Skip file operations errors and write them to log window" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSKIPFILEOPERROR.CAPTION" msgid "S&kip file operations errors and write them to log window" msgstr "&Fehler bei Datei-Operationen ignorieren und sie im Log-Fenster anzeigen" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "Führe Operationen aus" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.GBFILESEARCH.CAPTION" msgid "File search" msgstr "Dateisuche" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "Nutzeroberfläche" #: tfrmoptionsfileoperations.lblbuffersize.caption #, fuzzy #| msgid "Buffer size for file operations (in KB):" msgid "&Buffer size for file operations (in KB):" msgstr "&Puffergröße für Dateioperationen (in KB)" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "Bestätigungsdialog zeigen für:" #: tfrmoptionsfileoperations.lblprogresskind.caption #, fuzzy #| msgid "Show operations progress initially in" msgid "Show operations progress &initially in" msgstr "Ze&ige Operationsfortschritt von Anfang an" #: tfrmoptionsfileoperations.lblwipepassnumber.caption #, fuzzy #| msgid "Number of wipe passes:" msgctxt "TFRMOPTIONSFILEOPERATIONS.LBLWIPEPASSNUMBER.CAPTION" msgid "&Number of wipe passes:" msgstr "A&nzahl der Reinigungsdurchgänge" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption #, fuzzy #| msgid "Use memory mapping for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSEMMAPINSEARCH.CAPTION" msgid "Use memory mapping for search te&xt in files" msgstr "Nutze Memor&y-Mapping zur Textsuche in Dateien" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption #, fuzzy #| msgid "Use stream for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSESTREAMINSEARCH.CAPTION" msgid "&Use stream for search text in files" msgstr "N&utze Stream zur Textsuche in Dateien" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption #, fuzzy #| msgid "Use Frame Cursor" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEFRAMECURSOR.CAPTION" msgid "Use &Frame Cursor" msgstr "Ein&fügemarke nur als Rahmen darstellen" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption #, fuzzy #| msgid "Use Gradient Indicator" msgid "Use &Gradient Indicator" msgstr "Ver&wende Farbverlauf als Indikator" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption #, fuzzy #| msgid "Use Inverted Selection" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEINVERTEDSELECTION.CAPTION" msgid "U&se Inverted Selection" msgstr "Umgekehrte Au&swahl nutzen" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.DBFREESPACEINDICATOR.CAPTION" msgid "Drive Free Space Indicator" msgstr "Indikator für freien Speicherplatz auf Laufwerken" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.GBEXAMPLE.CAPTION" msgid "Example" msgstr "Beispiel" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption #, fuzzy #| msgid "Background:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR.CAPTION" msgid "Bac&kground:" msgstr "Hinter&grund:" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption #, fuzzy #| msgid "Background 2:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR2.CAPTION" msgid "Backg&round 2:" msgstr "Hinte&rgrund 2:" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption #, fuzzy #| msgid "Cursor Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORCOLOR.CAPTION" msgid "C&ursor Color:" msgstr "C&ursorfarbe" #: tfrmoptionsfilepanelscolors.lblcursortext.caption #, fuzzy #| msgid "Cursor Text:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORTEXT.CAPTION" msgid "Cursor Te&xt:" msgstr "Cursorte&xt" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption #, fuzzy #| msgid "Brightness level of inactive panel" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLINACTIVEPANELBRIGHTNESS.CAPTION" msgid "&Brightness level of inactive panel" msgstr "&Helligkeitswert des inaktiven Panels" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption #, fuzzy #| msgid "Indicator Back Color:" msgid "In&dicator Back Color:" msgstr "Hintergrun&dfarbe für Indikator" #: tfrmoptionsfilepanelscolors.lblindcolor.caption #, fuzzy #| msgid "Indicator Fore Color:" msgid "&Indicator Fore Color:" msgstr "Vordergrundfarbe für &Indikator:" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption #, fuzzy #| msgid "Mark Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLMARKCOLOR.CAPTION" msgid "&Mark Color:" msgstr "&Markierungsfarbe" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption #, fuzzy #| msgid "Text Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLTEXTCOLOR.CAPTION" msgid "T&ext Color:" msgstr "T&extfarbe" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption #, fuzzy #| msgid "Don't load file list until a tab is activated" msgid "Do&n't load file list until a tab is activated" msgstr "Datei &nicht laden bis ein Reiter aktiviert ist" #: tfrmoptionsfilesviews.cbdirbrackets.caption #, fuzzy #| msgid "Show square brackets around directories" msgctxt "TFRMOPTIONSFILESVIEWS.CBDIRBRACKETS.CAPTION" msgid "S&how square brackets around directories" msgstr "Zeige eckige Klammern um Verzeic&hnisse" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption #, fuzzy #| msgid "Highlight new and updated files" msgid "Hi&ghlight new and updated files" msgstr "Ma&rkiere neue und aktualisierte Dateien" #: tfrmoptionsfilesviews.cblistfilesinthread.caption #, fuzzy #| msgid "Load file list in separate thread" msgctxt "TFRMOPTIONSFILESVIEWS.CBLISTFILESINTHREAD.CAPTION" msgid "Load &file list in separate thread" msgstr "&Datei(en) in eigenem Prozess starten" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption #, fuzzy #| msgid "Load icons after file list" msgctxt "TFRMOPTIONSFILESVIEWS.CBLOADICONSSEPARATELY.CAPTION" msgid "Load icons af&ter file list" msgstr "Icons nach Da&teiliste laden" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption #, fuzzy #| msgid "Show system and hidden files" msgctxt "TFRMOPTIONSFILESVIEWS.CBSHOWSYSTEMFILES.CAPTION" msgid "Show s&ystem and hidden files" msgstr "Zeige versteckte und S&ystemdateien" #: tfrmoptionsfilesviews.cbspacemovesdown.caption #, fuzzy #| msgid "When selecting files with , move down to next file (as with )" msgctxt "TFRMOPTIONSFILESVIEWS.CBSPACEMOVESDOWN.CAPTION" msgid "&When selecting files with , move down to next file (as with )" msgstr "&Wenn Dateien mit der ausgewählt werden, zur nächsten Datei wechseln (wie mit )" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "Format" #: tfrmoptionsfilesviews.gbsorting.caption msgctxt "TFRMOPTIONSFILESVIEWS.GBSORTING.CAPTION" msgid "Sorting" msgstr "Sortierung" #: tfrmoptionsfilesviews.lblcasesensitivity.caption #, fuzzy #| msgid "Case sensitivity:" msgid "Case s&ensitivity:" msgstr "Schreibw&eise beachten:" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "Falsches Format" #: tfrmoptionsfilesviews.lbldatetimeformat.caption #, fuzzy #| msgid "Date and time format:" msgctxt "TFRMOPTIONSFILESVIEWS.LBLDATETIMEFORMAT.CAPTION" msgid "&Date and time format:" msgstr "&Datums- und Zeitformat" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "Dateigr&öße-Format" #: tfrmoptionsfilesviews.lblnewfilesposition.caption #, fuzzy #| msgid "Insert new files" msgid "&Insert new files" msgstr "Neue Date&ien einfügen" #: tfrmoptionsfilesviews.lblsortfoldermode.caption #, fuzzy #| msgid "Sorting directories:" msgid "So&rting directories:" msgstr "So&rtierung von Verzeichnissen:" #: tfrmoptionsfilesviews.lblsortmethod.caption #, fuzzy #| msgid "Sort &method:" msgctxt "TFRMOPTIONSFILESVIEWS.LBLSORTMETHOD.CAPTION" msgid "&Sort method:" msgstr "&Sortierungs&methode" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption #, fuzzy #| msgid "Move updated files" msgid "&Move updated files" msgstr "Aktualisierte Dateien verschiebe&n" #: tfrmoptionsfiletypescolors.btnaddcategory.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNADDCATEGORY.CAPTION" msgid "A&dd" msgstr "&Hinzufügen" #: tfrmoptionsfiletypescolors.btnapplycategory.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNAPPLYCATEGORY.CAPTION" msgid "A&pply" msgstr "&Übernehmen" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNCATEGORYCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNDELETECATEGORY.CAPTION" msgid "D&elete" msgstr "&Lösch&en" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Vorlage..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption #, fuzzy #| msgid "File types colors" msgctxt "TFRMOPTIONSFILETYPESCOLORS.GBFILETYPESCOLORS.CAPTION" msgid "File types colors (sort by drag&&drop)" msgstr "Dateitypfarben (durch \"Ziehen und Loslassen\" anordnen)" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption #, fuzzy #| msgid "Category attributes:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYATTR.CAPTION" msgid "Category a&ttributes:" msgstr "Ka&tegorie der Attribute" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption #, fuzzy #| msgid "Category color:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYCOLOR.CAPTION" msgid "Category co&lor:" msgstr "&Kategoriefarbe" #: tfrmoptionsfiletypescolors.lblcategorymask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYMASK.CAPTION" msgid "Category &mask:" msgstr "Kategorie&maske" #: tfrmoptionsfiletypescolors.lblcategoryname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYNAME.CAPTION" msgid "Category &name:" msgstr "Kategorie&name" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELEDITFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELLOGFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELMAINFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWERBOOKFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.lbleditorfont.caption #, fuzzy #| msgid "Editor font" msgctxt "TFRMOPTIONSFONTS.LBLEDITORFONT.CAPTION" msgid "&Editor font" msgstr "Schrift für &Editor" #: tfrmoptionsfonts.lbllogfont.caption #, fuzzy #| msgid "Log font" msgctxt "TFRMOPTIONSFONTS.LBLLOGFONT.CAPTION" msgid "&Log font" msgstr "&Log-Schriftart" #: tfrmoptionsfonts.lblmainfont.caption #, fuzzy #| msgid "Main font" msgctxt "TFRMOPTIONSFONTS.LBLMAINFONT.CAPTION" msgid "Main &font" msgstr "Hauptschri&ftart" #: tfrmoptionsfonts.lblviewerbookfont.caption #, fuzzy #| msgid "Viewer Book Font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERBOOKFONT.CAPTION" msgid "Viewer&Book Font" msgstr "Schriftart für die &buchartige Ansicht" #: tfrmoptionsfonts.lblviewerfont.caption #, fuzzy #| msgid "Viewer font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERFONT.CAPTION" msgid "&Viewer font" msgstr "Schriftart für &Betrachter" #: tfrmoptionshotkeys.btnaddhotkey.caption #, fuzzy #| msgid "Add hotkey" msgid "Add &hotkey" msgstr "Tastaturkürzel &hinzufügen" #: tfrmoptionshotkeys.btndeletehotkey.caption #, fuzzy #| msgid "Delete hotkey" msgid "&Delete hotkey" msgstr "&Tastaturkürzel löschen" #: tfrmoptionshotkeys.btnedithotkey.caption #, fuzzy #| msgid "Edit hotkey" msgctxt "tfrmoptionshotkeys.btnedithotkey.caption" msgid "&Edit hotkey" msgstr "Tastaturkürz&el bearbeiten" #: tfrmoptionshotkeys.lbfilter.caption msgctxt "TFRMOPTIONSHOTKEYS.LBFILTER.CAPTION" msgid "&Filter" msgstr "" #: tfrmoptionshotkeys.lblcategories.caption #, fuzzy #| msgid "Categories:" msgctxt "tfrmoptionshotkeys.lblcategories.caption" msgid "C&ategories:" msgstr "K&ategorien:" #: tfrmoptionshotkeys.lblcommands.caption #, fuzzy #| msgid "Commands:" msgctxt "tfrmoptionshotkeys.lblcommands.caption" msgid "Co&mmands:" msgstr "&Befehle:" #: tfrmoptionshotkeys.lblscfiles.caption #, fuzzy #| msgid "Shortcut files:" msgctxt "TFRMOPTIONSHOTKEYS.LBLSCFILES.CAPTION" msgid "&Shortcut files:" msgstr "&Verknüpfungen:" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[0].TITLE.CAPTION" msgid "Hotkey" msgstr "Tastaturkürzel" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[1].TITLE.CAPTION" msgid "Parameters" msgstr "Parameter" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[2].TITLE.CAPTION" msgid "Controls" msgstr "Steuerungs-Elemente" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "Für die &folgenden Pfade und Unterverzeichnisse:" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "Icons für Aktionen in Menüs anzeigen" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "tfrmoptionsicons.cbiconsinmenussize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption #, fuzzy #| msgid "Show overlay i&cons, e.g. for links" msgctxt "TFRMOPTIONSICONS.CBICONSSHOWOVERLAY.CAPTION" msgid "Show o&verlay icons, e.g. for links" msgstr "&Überlagernde Icons zeigen (z. B. Pfeile bei Verknüpfungen)" #: tfrmoptionsicons.cbiconssize.text msgctxt "TFRMOPTIONSICONS.CBICONSSIZE.TEXT" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "Keine speziellen Symbole" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "Icons in Menüs" #: tfrmoptionsicons.gbiconssize.caption #, fuzzy #| msgid " Icon &size " msgctxt "TFRMOPTIONSICONS.GBICONSSIZE.CAPTION" msgid " Icon size " msgstr "Icon-Grö&sse" #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "TFRMOPTIONSICONS.GBSHOWICONSMODE.CAPTION" msgid " Show icons to the left of the filename " msgstr "Icons links vom Dateinamen anzeigen" #: tfrmoptionsicons.rbiconsshowall.caption #, fuzzy #| msgid "&All" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALL.CAPTION" msgid "A&ll" msgstr "A&lle" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALLANDEXE.CAPTION" msgid "All associated + &EXE/LNK (slow)" msgstr "Alle verknüpften .&exe / .lnk - Dateien (langsam)" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWNONE.CAPTION" msgid "&No icons" msgstr "&Keine Icons" #: tfrmoptionsicons.rbiconsshowstandard.caption #, fuzzy #| msgid "&Only standard icons" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWSTANDARD.CAPTION" msgid "Only &standard icons" msgstr "Nur &Standard-Icons" #: tfrmoptionsignorelist.btnaddsel.caption #, fuzzy #| msgid "&Add selected names" msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSEL.CAPTION" msgid "A&dd selected names" msgstr "&Ausgewählte Namen hinzufügen" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSELWITHPATH.CAPTION" msgid "Add selected names with &full path" msgstr "Ausgewählte Namen mit &komplettem Pfad hinzufügen" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "TFRMOPTIONSIGNORELIST.CHKIGNOREENABLE.CAPTION" msgid "&Ignore (don't show) the following files and folders:" msgstr "&Ignoriere (zeige nicht) die folgenden Dateien und Verzeichnisse:" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "TFRMOPTIONSIGNORELIST.LBLSAVEIN.CAPTION" msgid "&Save in:" msgstr "&Speichern in:" #: tfrmoptionskeyboard.cblynxlike.caption #, fuzzy #| msgid "Left, Right arrows change directory (Lynx-like movement)" msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "P&feil nach links, bzw. rechts wechselt das Verzeichnis (Lynx-artiges Navigieren)" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "Schreiben" #: tfrmoptionskeyboard.lblalt.caption #, fuzzy #| msgid "Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLALT.CAPTION" msgid "Alt+L&etters" msgstr "Alt-Tast&e+Buchstabe" #: tfrmoptionskeyboard.lblctrlalt.caption #, fuzzy #| msgid "Ctrl+Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLCTRLALT.CAPTION" msgid "Ctrl+Alt+Le&tters" msgstr "S&trg+Alt+Buchstabe" #: tfrmoptionskeyboard.lblnomodifier.caption #, fuzzy #| msgid "Letters" msgid "&Letters" msgstr "&Buchstaben" #: tfrmoptionslayout.cbflatdiskpanel.caption #, fuzzy #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATDISKPANEL.CAPTION" msgid "&Flat buttons" msgstr "&Flache Schalter" #: tfrmoptionslayout.cbflatinterface.caption #, fuzzy #| msgid "Flat interface" msgctxt "TFRMOPTIONSLAYOUT.CBFLATINTERFACE.CAPTION" msgid "Flat i&nterface" msgstr "Flaches Erschei&nungsbild" #: tfrmoptionslayout.cbflattoolbar.caption #, fuzzy #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATTOOLBAR.CAPTION" msgid "Flat b&uttons" msgstr "Fla&che Schalter" #: tfrmoptionslayout.cbfreespaceind.caption #, fuzzy #| msgid "Show free space indicator on drive label" msgctxt "TFRMOPTIONSLAYOUT.CBFREESPACEIND.CAPTION" msgid "Show fr&ee space indicator on drive label" msgstr "Z&eige den 'Freien Speicher'-Indikator über den Panels" #: tfrmoptionslayout.cblogwindow.caption #, fuzzy #| msgid "Show log window" msgctxt "TFRMOPTIONSLAYOUT.CBLOGWINDOW.CAPTION" msgid "Show lo&g window" msgstr "Lo&g-Datei anzeigen" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "TFRMOPTIONSLAYOUT.CBPANELOFOPERATIONS.CAPTION" msgid "Show panel of operation in background" msgstr "Zeige den ausführenden Fensterteil im Hintergrund" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "TFRMOPTIONSLAYOUT.CBPROGINMENUBAR.CAPTION" msgid "Show common progress in menu bar" msgstr "Zeige allgemeinen Fortschritt in der Menü-Zeile" #: tfrmoptionslayout.cbshowcmdline.caption #, fuzzy #| msgid "Show command &line" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCMDLINE.CAPTION" msgid "Show command l&ine" msgstr "Befehlsze&ile anzeigen" #: tfrmoptionslayout.cbshowcurdir.caption #, fuzzy #| msgid "Show ¤t directory" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCURDIR.CAPTION" msgid "Show current director&y" msgstr "&Zeige aktuelles Verzeichnis" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDISKPANEL.CAPTION" msgid "Show &drive buttons" msgstr "Zeige Schalter für &Laufwerke" #: tfrmoptionslayout.cbshowdrivefreespace.caption #, fuzzy #| msgid "Show free space label" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDRIVEFREESPACE.CAPTION" msgid "Show free s&pace label" msgstr "Zeige '&freien Speicher' von 'Gesamt-Speicherplatz' über den Panels" #: tfrmoptionslayout.cbshowdriveslistbutton.caption #, fuzzy #| msgid "Show d&rives list button" msgid "Show drives list bu&tton" msgstr "Zeige Schalte&r für das Laufwerks-Drop-down-Menü" #: tfrmoptionslayout.cbshowkeyspanel.caption #, fuzzy #| msgid "Show &function key buttons" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWKEYSPANEL.CAPTION" msgid "Show function &key buttons" msgstr "Ze&ige Schalter der Funktionstasten" #: tfrmoptionslayout.cbshowmainmenu.caption #, fuzzy #| msgid "Show main menu" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINMENU.CAPTION" msgid "Show &main menu" msgstr "Zeige Haupt&menü" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINTOOLBAR.CAPTION" msgid "Show &button bar" msgstr "Zeige &Schalterleiste" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption #, fuzzy #| msgid "Show short free space label" msgid "Show short free space &label" msgstr "Zeige kurze Information zum freien Speicherp&latz" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWSTATUSBAR.CAPTION" msgid "Show &status bar" msgstr "&Stausleiste zeigen" #: tfrmoptionslayout.cbshowtabheader.caption #, fuzzy #| msgid "Show &tabstop header" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABHEADER.CAPTION" msgid "S&how tabstop header" msgstr "Zeige Ta&bstop-Zeile" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABS.CAPTION" msgid "Sho&w folder tabs" msgstr "Zeige &Verzeichnis-Reiter" #: tfrmoptionslayout.cbtermwindow.caption #, fuzzy #| msgid "Show terminal window" msgctxt "TFRMOPTIONSLAYOUT.CBTERMWINDOW.CAPTION" msgid "Show te&rminal window" msgstr "Konsolenfenste&r zeigen" #: tfrmoptionslayout.cbtwodiskpanels.caption #, fuzzy #| msgid "Show two drive button bars (fixed width, above file windows)" msgctxt "TFRMOPTIONSLAYOUT.CBTWODISKPANELS.CAPTION" msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "Zeige zwei &Laufwerksleisten (feste Breite, über den Dateifenstern)" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "TFRMOPTIONSLAYOUT.GBSCREENLAYOUT.CAPTION" msgid " Screen layout " msgstr "Bildschirmdarstellung" #: tfrmoptionslog.cblogarcop.caption #, fuzzy #| msgid "Pack/Unpack" msgctxt "TFRMOPTIONSLOG.CBLOGARCOP.CAPTION" msgid "&Pack/Unpack" msgstr "&Packen / Entpacken" #: tfrmoptionslog.cblogcpmvln.caption #, fuzzy #| msgid "Copy/Move/Create link/symlink" msgctxt "TFRMOPTIONSLOG.CBLOGCPMVLN.CAPTION" msgid "Cop&y/Move/Create link/symlink" msgstr "Kopiere/Verschiebe/Erstelle Link/s&ymb. Link" #: tfrmoptionslog.cblogdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSLOG.CBLOGDELETE.CAPTION" msgid "&Delete" msgstr "&Löschen" #: tfrmoptionslog.cblogdirop.caption #, fuzzy #| msgid "Create/Delete directories" msgctxt "TFRMOPTIONSLOG.CBLOGDIROP.CAPTION" msgid "Crea&te/Delete directories" msgstr "Ers&telle / Lösche Verzeichnisse" #: tfrmoptionslog.cblogerrors.caption msgctxt "TFRMOPTIONSLOG.CBLOGERRORS.CAPTION" msgid "Log &errors" msgstr "F&ehler aufzeichnen" #: tfrmoptionslog.cblogfile.caption #, fuzzy #| msgid "&Create a log file:" msgctxt "TFRMOPTIONSLOG.CBLOGFILE.CAPTION" msgid "C&reate a log file:" msgstr "E&rstelle Log-Datei:" #: tfrmoptionslog.cbloginfo.caption #, fuzzy #| msgid "Log information messages" msgctxt "TFRMOPTIONSLOG.CBLOGINFO.CAPTION" msgid "Log &information messages" msgstr "Log-Informat&ionsmeldungen" #: tfrmoptionslog.cblogsuccess.caption msgctxt "TFRMOPTIONSLOG.CBLOGSUCCESS.CAPTION" msgid "Log &successful operations" msgstr "Erfolgreiche Vorg&änge aufzeichnen" #: tfrmoptionslog.cblogvfs.caption #, fuzzy #| msgid "File system plugins" msgctxt "TFRMOPTIONSLOG.CBLOGVFS.CAPTION" msgid "&File system plugins" msgstr "&Dateisystem Plugin" #: tfrmoptionslog.gblogfile.caption msgctxt "TFRMOPTIONSLOG.GBLOGFILE.CAPTION" msgid "File operation log file" msgstr "Dateioperation Log-Datei" #: tfrmoptionslog.gblogfileop.caption #, fuzzy #| msgid "Log operations:" msgctxt "TFRMOPTIONSLOG.GBLOGFILEOP.CAPTION" msgid "Log operations" msgstr "Operationen aufzeichnen:" #: tfrmoptionslog.gblogfilestatus.caption #, fuzzy #| msgid "Operation status:" msgctxt "TFRMOPTIONSLOG.GBLOGFILESTATUS.CAPTION" msgid "Operation status" msgstr "Fortschritt des Vorgangs:" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "Vo&rschaubilder für gelöschte Dateien entfernen" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "Beim Wechsel des Laufwerkes immer zur &obersten Ebenen des Laufwerkes wechseln" #: tfrmoptionsmisc.chkshowwarningmessages.caption #, fuzzy #| msgid "Show warning messages (\"OK\" button only)" msgctxt "tfrmoptionsmisc.chkshowwarningmessages.caption" msgid "Show &warning messages (\"OK\" button only)" msgstr "&Warnungen anzeigen (nur mit \"OK\" Schalter)" #: tfrmoptionsmisc.chkthumbsave.caption #, fuzzy #| msgid "Save thumbnails in cache" msgctxt "tfrmoptionsmisc.chkthumbsave.caption" msgid "&Save thumbnails in cache" msgstr "&Speichern von Bildvorschauen im Cache" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "tfrmoptionsmisc.dblthumbnails.caption" msgid "Thumbnails" msgstr "Vorschaubilder" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "Pixel" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "tfrmoptionsmisc.lblthumbseparator.caption" msgid "X" msgstr "X" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "&Größe der Vorschaubilder" #: tfrmoptionsmouse.cbselectionbymouse.caption #, fuzzy #| msgid "Selection by mouse" msgid "&Selection by mouse" msgstr "Au&swahl mit der Maus" #: tfrmoptionsmouse.gbscrolling.caption msgid "Scrolling" msgstr "Bewegen durch die Seite (scrollen)" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "Auswahl" #: tfrmoptionsmouse.lblmousemode.caption #, fuzzy #| msgid "Mode:" msgid "&Mode:" msgstr "&Modus" #: tfrmoptionsmouse.rbscrolllinebyline.caption #, fuzzy #| msgid "Line by line" msgid "&Line by line" msgstr "Zei&le für Zeile" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption #, fuzzy #| msgid "Line by line with cursor movement" msgid "Line by line &with cursor movement" msgstr "Zeile für Zeile mit Be&wegen der Zeilenmarkierung" #: tfrmoptionsmouse.rbscrollpagebypage.caption #, fuzzy #| msgid "Page by page" msgid "&Page by page" msgstr "&Seite für Seite" #: tfrmoptionsplugins.btnaddplugin.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "&Hinzufügen" #: tfrmoptionsplugins.btnconfigplugin.caption #, fuzzy #| msgid "Configure" msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "E&instellen" #: tfrmoptionsplugins.btnenableplugin.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "Aktiviere&n" #: tfrmoptionsplugins.btnremoveplugin.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "Entfe&rnen" #: tfrmoptionsplugins.btntweakplugin.caption #, fuzzy #| msgid "Tweak" msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "An&passen" #: tfrmoptionsplugins.lbldsxdescription.caption #, fuzzy #| msgid "Search plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "Suc&h-PlugIns erlauben alternative Such-Algorithmen oder externe Tools (wie \"locate\", oder ähnliches) zu nutzen" #: tfrmoptionsplugins.lblwcxdescription.caption #, fuzzy #| msgid "Packer plugins are used to work with archives." msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "Pack&er-PlugIns werden benutzt um mit Archiven zu arbeiten." #: tfrmoptionsplugins.lblwdxdescription.caption #, fuzzy #| msgid "Content plugins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "Inhalt-Plu&gIns erlauben es, weitere Details (wie z.B. MP3-Tags) in Dateilisten anzuzeigen, oder sie zur Suche oder Umbenennung zu nutzen" #: tfrmoptionsplugins.lblwfxdescription.caption #, fuzzy #| msgid "File system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "Dateisystem-P&lugIns erlauben auf Dateisysteme oder externe Laufwerke zuzugreifen, auf die das Betriebssystem nicht zugreifen kann (z.B. Palm oder Pocket-PCs)." #: tfrmoptionsplugins.lblwlxdescription.caption #, fuzzy #| msgid "Viewer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "Be&trachter-PlugIns erlauben die Anzeige von Bilder, Tabellen, Datenbanken o.ä. durch den Betrachter (F3 oder Strg+Q)." #: tfrmoptionsplugins.stgplugins.columns[0].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[0].TITLE.CAPTION" msgid "Active" msgstr "Aktiv" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[1].TITLE.CAPTION" msgid "Plugin" msgstr "" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[2].TITLE.CAPTION" msgid "Registered for" msgstr "Registriert für" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[3].TITLE.CAPTION" msgid "File name" msgstr "Dateiname" #: tfrmoptionsplugins.tsdsx.caption #, fuzzy #| msgid "Search plugins (.DSX)" msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "&Such-PlugIns" #: tfrmoptionsplugins.tswcx.caption #, fuzzy #| msgid "Packer plugins (.WCX)" msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "Pac&ker plugins (.WCX)" #: tfrmoptionsplugins.tswdx.caption #, fuzzy #| msgid "Content plugins (.WDX)" msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "Inhalt Pl&ugin (.WDX)" #: tfrmoptionsplugins.tswfx.caption #, fuzzy #| msgid "File system plugins (.WFX)" msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "Date&isystem-Plugins (.WFX)" #: tfrmoptionsplugins.tswlx.caption #, fuzzy #| msgid "Viewer plugins (.WLX)" msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "&Betrachter-PlugIns" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTBEGINNING.CAPTION" msgid "&Beginning (name must start with first typed character)" msgstr "&Beginn (Name soll mit dem ersten eingetippten Buchstaben beginnen)" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTENDING.CAPTION" msgid "En&ding (last character before a typed dot . must match)" msgstr "Ende des Namens (letztes Zeichen vor einem . soll passen)" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CGPOPTIONS.CAPTION" msgid "Options" msgstr "Optionen" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption #, fuzzy #| msgid "Exact name match:" msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.GBEXACTNAMEMATCH.CAPTION" msgid "Exact name match" msgstr "Exakter &Name" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "Suche Schreibweise" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "Suche nach diesen Einträgen" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "TFRMOPTIONSTABS.CBTABSACTIVATEONCLICK.CAPTION" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "Ziel-&Panel auswählen, wenn eines seiner Tabs angeklickt wird" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "TFRMOPTIONSTABS.CBTABSALWAYSVISIBLE.CAPTION" msgid "&Show tab header also when there is only one tab" msgstr "&Reiter-Titel auch zeigen wenn nur einer vorhanden" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption #, fuzzy #| msgid "&Confirm close all tabs" msgctxt "TFRMOPTIONSTABS.CBTABSCONFIRMCLOSEALL.CAPTION" msgid "Con&firm close all tabs" msgstr "&Schliessen aller Reiter bestätigen" #: tfrmoptionstabs.cbtabslimitoption.caption #, fuzzy #| msgid "&Limit tab title length to:" msgctxt "TFRMOPTIONSTABS.CBTABSLIMITOPTION.CAPTION" msgid "&Limit tab title length to" msgstr "Begrenze Reiter-Tite&lzeile auf" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "TFRMOPTIONSTABS.CBTABSLOCKEDASTERISK.CAPTION" msgid "Show locked tabs &with an asterisk *" msgstr "Alle gesperrten Reiter mit Sternchen * markieren" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "TFRMOPTIONSTABS.CBTABSMULTILINES.CAPTION" msgid "&Tabs on multiple lines" msgstr "Rei&ter-Titel auf mehrere Zeilen verteilen" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENFOREGROUND.CAPTION" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Strg+Pf&eil hoch öffnet einen neuen Reiter im Vordergrund" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENNEARCURRENT.CAPTION" msgid "Open &new tabs near current tab" msgstr "&Neuen Reiter neben aktuellem Reiter einfügen" #: tfrmoptionstabs.cbtabsshowclosebutton.caption #, fuzzy #| msgid "Show tab close button" msgctxt "TFRMOPTIONSTABS.CBTABSSHOWCLOSEBUTTON.CAPTION" msgid "Show ta&b close button" msgstr "Zeige Schalter um Ta&bs zu schliessen" #: tfrmoptionstabs.gbtabs.caption msgctxt "TFRMOPTIONSTABS.GBTABS.CAPTION" msgid "Folder tabs headers" msgstr "Verzeichnisreiter-Titel" #: tfrmoptionstabs.lblchar.caption msgctxt "TFRMOPTIONSTABS.LBLCHAR.CAPTION" msgid "characters" msgstr "Bu&chstaben" #: tfrmoptionstabs.lbltabsposition.caption #, fuzzy #| msgid "Tabs position" msgctxt "TFRMOPTIONSTABS.LBLTABSPOSITION.CAPTION" msgid "Ta&bs position" msgstr "Rei&ter-Position" #: tfrmoptionsterminal.lblruninterm.caption #, fuzzy #| msgid "Run in terminal:" msgid "Run in &terminal:" msgstr "Im Befehlszeilen-Fens&ter ausführen:" #: tfrmoptionsterminal.lblrunterm.caption #, fuzzy #| msgid "Run terminal:" msgid "Run t&erminal:" msgstr "Di&esen Befehls-Interpreter benutzen:" #: tfrmoptionstoolbar.btnclonebutton.caption #, fuzzy #| msgid "&Clone button" msgctxt "tfrmoptionstoolbar.btnclonebutton.caption" msgid "C&lone button" msgstr "S&chalter klonen" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "tfrmoptionstoolbar.btndeletebutton.caption" msgid "&Delete" msgstr "L&öschen" #: tfrmoptionstoolbar.btnedithotkey.caption #, fuzzy #| msgid "Edit hotkey" msgctxt "tfrmoptionstoolbar.btnedithotkey.caption" msgid "Edit hot&key" msgstr "Tastatur&kürzel bearbeiten" #: tfrmoptionstoolbar.btninsertbutton.caption #, fuzzy #| msgid "&Insert new buttonX" msgctxt "tfrmoptionstoolbar.btninsertbutton.caption" msgid "&Insert new button" msgstr "Neuen Schalter e&infügen" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "tfrmoptionstoolbar.btnopenfile.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "tfrmoptionstoolbar.btnopenicon.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnremovehotkey.caption #, fuzzy #| msgid "Remove hotkey" msgctxt "tfrmoptionstoolbar.btnremovehotkey.caption" msgid "Remove hotke&y" msgstr "Tastaturk&ürzel entfernen" #: tfrmoptionstoolbar.cbflatbuttons.caption #, fuzzy #| msgid "Flat b&uttons" msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "&Flache Schalter" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "Befehlsparameter eingeben, jeden in einer eigenen Zeile. [F1] drücken um Hilfe zu Parametern zu erhalten." #: tfrmoptionstoolbar.gbgroupbox.caption msgctxt "tfrmoptionstoolbar.gbgroupbox.caption" msgid "Appearance" msgstr "Aussehen" #: tfrmoptionstoolbar.lblbarsize.caption #, fuzzy #| msgid "Ba&r size:" msgctxt "tfrmoptionstoolbar.lblbarsize.caption" msgid "&Bar size:" msgstr "Höhe de&r Leiste:" #: tfrmoptionstoolbar.lblexternalcommand.caption #, fuzzy #| msgid "Command:" msgctxt "tfrmoptionstoolbar.lblexternalcommand.caption" msgid "Comman&d:" msgstr "&Befehl:" #: tfrmoptionstoolbar.lblexternalparameters.caption #, fuzzy #| msgid "Parameters:" msgctxt "tfrmoptionstoolbar.lblexternalparameters.caption" msgid "Parameter&s:" msgstr "&Parameter:" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "Tastaturkürzel:" #: tfrmoptionstoolbar.lbliconfile.caption #, fuzzy #| msgid "Icon:" msgctxt "tfrmoptionstoolbar.lbliconfile.caption" msgid "Ico&n:" msgstr "Ico&ndatei" #: tfrmoptionstoolbar.lbliconsize.caption #, fuzzy #| msgid "Ic&on size:" msgctxt "tfrmoptionstoolbar.lbliconsize.caption" msgid "Icon si&ze:" msgstr "Höhe der I&cons:" #: tfrmoptionstoolbar.lblinternalcommand.caption #, fuzzy #| msgid "Command:" msgctxt "tfrmoptionstoolbar.lblinternalcommand.caption" msgid "Co&mmand:" msgstr "&Befehl:" #: tfrmoptionstoolbar.lblinternalparameters.caption #, fuzzy #| msgid "Parameters:" msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "&Parameter:" #: tfrmoptionstoolbar.lblstartpath.caption #, fuzzy #| msgid "Start path:" msgctxt "tfrmoptionstoolbar.lblstartpath.caption" msgid "Start pat&h:" msgstr "Start&pfad" #: tfrmoptionstoolbar.lbltooltip.caption #, fuzzy #| msgid "Tooltip:" msgctxt "tfrmoptionstoolbar.lbltooltip.caption" msgid "&Tooltip:" msgstr "&Tooltip" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "Schaltertyp" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption #, fuzzy #| msgid "Keep terminal window open after executing program" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSKEEPTERMINALOPEN.CAPTION" msgid "&Keep terminal window open after executing program" msgstr "&Konsolenfenster offen lassen, wenn der Vorgang abgeschlossen ist" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption #, fuzzy #| msgid "Execute in terminal" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSRUNINTERMINAL.CAPTION" msgid "&Execute in terminal" msgstr "In Konsol&enfenster ausführen" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption #, fuzzy #| msgid "Use external program" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSUSEEXTERNALPROGRAM.CAPTION" msgid "&Use external program" msgstr "Externes Programm ben&utzen" #: tfrmoptionstoolbase.lbltoolsparameters.caption #, fuzzy #| msgid "Additional parameters" msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPARAMETERS.CAPTION" msgid "A&dditional parameters" msgstr "Zus&ätzliche Parameter" #: tfrmoptionstoolbase.lbltoolspath.caption #, fuzzy #| msgid "Path to program to execute" msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPATH.CAPTION" msgid "&Path to program to execute" msgstr "&Pfad zum ausführbaren Programm" #: tfrmoptionstooltips.btnaddfields.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "&Hinzufügen" #: tfrmoptionstooltips.btnapplyfields.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "&Übernehmen" #: tfrmoptionstooltips.btndeletefields.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "&Löschen" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Vorlage..." #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "Angepasste Felder nach Dateityp" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "Zeige Tooltips (Hinweistexte)" #: tfrmoptionstooltips.lblfieldslist.caption #, fuzzy #| msgid "Category hint:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "Kategorie-&Hinweis:" #: tfrmoptionstooltips.lblfieldsmask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "Kategorie&maske" #: tfrmoptionstooltips.lblfieldsname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "Kategorie&name" #: tfrmoptionstooltips.rbtooltipallfiles.caption #, fuzzy #| msgid "Show tool tip for all files in file panel" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "Tooltip (Hin&weistext) für alle Dateien im Panel anzeigen" #: tfrmoptionstooltips.rbtooltipnone.caption #, fuzzy #| msgid "Don't show" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "Nicht &zeigen" #: tfrmoptionstooltips.rbtooltiponlylarge.caption #, fuzzy #| msgid "Show tool tip for files in file panel if truncated" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "&Tooltips (Hinweistexte) nur zeigen, wenn Dateinamen abgekürzt werden" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNBACKVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNFONTVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.gbviewerbookmode.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWERBOOKMODE.CAPTION" msgid "Viewer Book Mode" msgstr "Buchartige Ansicht" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWEREXAMPLE.CAPTION" msgid "Example" msgstr "Beispiel" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption #, fuzzy #| msgid "Background color in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLBACKGROUNDCOLORVIEWERBOOK.CAPTION" msgid "&Background color in book viewer" msgstr "Hintergrundfarbe in der &buchartigen Ansicht" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption #, fuzzy #| msgid "Font color in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLFONTCOLORVIEWERBOOK.CAPTION" msgid "&Font color in book viewer" msgstr "Schri&ftfarbe in der buchartigen Ansicht" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption #, fuzzy #| msgid "Number of columns in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLNUMBERCOLUMNSVIEWER.CAPTION" msgid "&Number of columns in book viewer" msgstr "A&nzahl der Spalten in der buchartigen Ansicht" #: tfrmpackdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Abbruch" #: tfrmpackdlg.btnconfig.caption #, fuzzy #| msgid "&Configure" msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "Kon&figurieren" #: tfrmpackdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "&Hilfe" #: tfrmpackdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmpackdlg.caption msgctxt "TFRMPACKDLG.CAPTION" msgid "Pack files" msgstr "Packe Dateien" #: tfrmpackdlg.cbcreateseparatearchives.caption #, fuzzy #| msgid "Create separate archives, o&ne per selected file/dir" msgid "C&reate separate archives, one per selected file/dir" msgstr "Sepa&rate Archive erstellen, pro gewählte Datei/Verzeichnis eins" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "SF&X-Archiv erstellen" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "Verschl&üsseln" #: tfrmpackdlg.cbmovetoarchive.caption #, fuzzy #| msgid "M&ove to archive" msgid "Mo&ve to archive" msgstr "In Archiv &verschieben" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "Archiv auf&teilen" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "=>" #: tfrmpackdlg.cbputintarfirst.caption #, fuzzy #| msgid "Put in the TAR archive first" msgid "P&ut in the TAR archive first" msgstr "Z&uerst in einem TAR-Archiv zusammenfassen" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "Pfadnamen &mitspeichern (nur abwärts)" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "Packe Datei(en) in Archiv" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "Packer" #: tfrmpackinfodlg.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "S&chliessen" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "&Alle entpacken und ausführen" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "&Entpacken und ausführen" #: tfrmpackinfodlg.caption msgctxt "TFRMPACKINFODLG.CAPTION" msgid "Properties of packed file" msgstr "Eigenschaften der gepackten Datei(en)" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "Attribute:" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "Kompressionsverhältnis:" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "Datum:" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "Methode:" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "Originalgrösse" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "Datei:" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "Gepackte Grösse:" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "Packer:" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "Zeit:" #: tfrmquicksearch.btncancel.caption msgctxt "tfrmquicksearch.btncancel.caption" msgid "X" msgstr "X" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "Filter-Panel schließen" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "Text eingeben, nach dem gesucht oder gefiltert werden soll" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "Abhängig von der Schreibweise" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "Verzeichnisse" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "Dateien" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "Entspricht dem Anfang" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "Entspricht der Endung" #: tfrmquicksearch.tglfilter.caption msgctxt "tfrmquicksearch.tglfilter.caption" msgid "Filter" msgstr "" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "Umschalten zwischen Suchen und Filtern" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CANCELBUTTON.CAPTION" msgid "Cancel" msgstr "Abbruch" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CLOSEBUTTON.CAPTION" msgid "&Close" msgstr "S&chliessen" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.HELPBUTTON.CAPTION" msgid "&Help" msgstr "&Hilfe" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "tfrmselecttextrange.btppanel.okbutton.caption" msgid "&OK" msgstr "&OK" #: tfrmselecttextrange.lblselecttext.caption #, fuzzy #| msgid "Select the characters to insert:" msgid "&Select the characters to insert:" msgstr "Zeichen zum Einfügen au&swählen:" #: tfrmsetfileproperties.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Abbruch" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "&Ok" #: tfrmsetfileproperties.caption #, fuzzy #| msgid "Change file properties" msgctxt "TFRMSETFILEPROPERTIES.CAPTION" msgid "Change attributes" msgstr "Ändern von Dateieigenschaften" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Dauerhaft" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "Archiv" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "Erstellt:" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "Versteckt" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "Zugriff:" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "Geändert" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "Schreibgeschützt" #: tfrmsetfileproperties.chkrecursive.caption #, fuzzy #| msgid "Recursive" msgid "Including subfolders" msgstr "Auch Unterverzeichnisse" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "Zeitstempel-Eigenschaften" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Attribute" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Attribute" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Gruppe" #: tfrmsetfileproperties.lblattrinfo.caption #, fuzzy #| msgid "(gray = unchanged, checked=set attribute)" msgid "(gray field means unchanged value)" msgstr "(grau = unverändert, markiert = Attribut setzen)" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Andere" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Besitzer" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Darstellung im Text" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Ausführen" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Oktal:" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Lesen" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Schreiben" #: tfrmsplitter.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Ende" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsplitter.caption msgctxt "TFRMSPLITTER.CAPTION" msgid "Splitter" msgstr "Teiler" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664B - 3.5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "Dateiname" #: tfrmsplitter.grbxsize.caption #, fuzzy #| msgid "File size" msgid "Size and number of parts" msgstr "Grösse und Anzahl der Teilstücke" #: tfrmsplitter.lbdirtarget.caption #, fuzzy #| msgid "Directory target" msgid "Directory &target" msgstr "&Zielverzeichnis" #: tfrmsplitter.lbfilesource.caption #, fuzzy #| msgid "File source" msgid "File &source" msgstr "Datei&quelle" #: tfrmsplitter.lblnumberparts.caption #, fuzzy #| msgid "Number of parts" msgid "&Number of parts" msgstr "A&nzahl der Teile" #: tfrmsplitter.rbtngigab.caption msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "" #: tfrmsplitter.rbtnkilob.caption msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "" #: tfrmsplitter.rbtnmegab.caption msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "" #: tfrmsymlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Abbruch" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsymlink.caption #, fuzzy #| msgid "Create symlink" msgid "Create symbolic link" msgstr "Erstelle symb. Link" #: tfrmsymlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Bestehen&des Ziel (auf das die Verknüpfung zeigt)" #: tfrmsymlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "&Verknüpfungsname" #: tfrmtweakplugin.btnadd.caption #, fuzzy #| msgid "Add new" msgid "A&dd new" msgstr "&Neue hinzufügen" #: tfrmtweakplugin.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "A&bbruch" #: tfrmtweakplugin.btnchange.caption #, fuzzy #| msgid "Change" msgid "C&hange" msgstr "&Ändern" #: tfrmtweakplugin.btndefault.caption #, fuzzy #| msgid "Default" msgid "De&fault" msgstr "&Standard" #: tfrmtweakplugin.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmtweakplugin.btnremove.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "Entfe&rnen" #: tfrmtweakplugin.caption msgctxt "TFRMTWEAKPLUGIN.CAPTION" msgid "Tweak plugin" msgstr "Anpass-PlugIn" #: tfrmtweakplugin.cbpk_caps_by_content.caption #, fuzzy #| msgid "Detect archive type by content" msgid "De&tect archive type by content" msgstr "Archiv&typ am Inhalt erkennen" #: tfrmtweakplugin.cbpk_caps_delete.caption #, fuzzy #| msgid "Can delete files" msgid "Can de&lete files" msgstr "Kann Dateien &löschen" #: tfrmtweakplugin.cbpk_caps_encrypt.caption #, fuzzy #| msgid "Supports encryption" msgid "Supports e&ncryption" msgstr "U&nterstützt Verschlüsselung" #: tfrmtweakplugin.cbpk_caps_hide.caption #, fuzzy #| msgid "Show as normal files (hide packer icon)" msgid "Sho&w as normal files (hide packer icon)" msgstr "A&ls normale Dateien zeigen (Packer-Symbol verstecken)" #: tfrmtweakplugin.cbpk_caps_mempack.caption #, fuzzy #| msgid "Supports packing in memory" msgid "Supports pac&king in memory" msgstr "Unterstützt &Kompression im Arbeitsspeicher" #: tfrmtweakplugin.cbpk_caps_modify.caption #, fuzzy #| msgid "Can modify exisiting archives" msgid "Can &modify exisiting archives" msgstr "Ka&nn bestehende Archive verändern" #: tfrmtweakplugin.cbpk_caps_multiple.caption #, fuzzy #| msgid "Archive can contain multiple files" msgid "&Archive can contain multiple files" msgstr "&Archive können mehrere Dateien enthalten" #: tfrmtweakplugin.cbpk_caps_new.caption #, fuzzy #| msgid "Can create new archives" msgid "Can create new archi&ves" msgstr "Kann neue Archi&ve erstellen" #: tfrmtweakplugin.cbpk_caps_options.caption #, fuzzy #| msgid "Supports the options dialogbox" msgid "S&upports the options dialogbox" msgstr "&Unterstützt die Optionen-Dialogbox" #: tfrmtweakplugin.cbpk_caps_searchtext.caption #, fuzzy #| msgid "Allow searching for text in archives" msgid "Allow searchin&g for text in archives" msgstr "Erlaubt die Suche von Te&xt in Archiven" #: tfrmtweakplugin.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "&Beschreibung:" #: tfrmtweakplugin.lbldetectstr.caption #, fuzzy #| msgid "Detect string:" msgid "D&etect string:" msgstr "&Erkenne String:" #: tfrmtweakplugin.lblextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "&Endung:" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "" #: tfrmtweakplugin.lblname.caption #, fuzzy #| msgid "Name:" msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "&Name:" #: tfrmtweakplugin.lblplugin.caption msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "" #: tfrmtweakplugin.lblplugin1.caption msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "" #: tfrmviewer.actabout.caption msgctxt "TFRMVIEWER.ACTABOUT.CAPTION" msgid "About Viewer..." msgstr "Über den Be&trachter" #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "Zeigt den 'Über'-Dialog" #: tfrmviewer.actcopyfile.caption msgctxt "TFRMVIEWER.ACTCOPYFILE.CAPTION" msgid "Copy File" msgstr "Datei kopieren" #: tfrmviewer.actcopyfile.hint msgctxt "TFRMVIEWER.ACTCOPYFILE.HINT" msgid "Copy File" msgstr "Datei kopieren" #: tfrmviewer.actdeletefile.caption msgctxt "TFRMVIEWER.ACTDELETEFILE.CAPTION" msgid "Delete File" msgstr "Datei löschen" #: tfrmviewer.actdeletefile.hint msgctxt "TFRMVIEWER.ACTDELETEFILE.HINT" msgid "Delete File" msgstr "Datei löschen" #: tfrmviewer.actloadnextfile.caption msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.CAPTION" msgid "&Next" msgstr "&Nächste" #: tfrmviewer.actloadnextfile.hint msgid "Load Next File" msgstr "Nächste Datei laden" #: tfrmviewer.actloadprevfile.caption msgctxt "TFRMVIEWER.ACTLOADPREVFILE.CAPTION" msgid "&Previous" msgstr "&Vorherige" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "Vorherige Datei laden" #: tfrmviewer.actmirror.caption msgctxt "TFRMVIEWER.ACTMIRROR.CAPTION" msgid "Mirror" msgstr "Spiegeln" #: tfrmviewer.actmirror.hint msgctxt "TFRMVIEWER.ACTMIRROR.HINT" msgid "Mirror" msgstr "Spiegeln" #: tfrmviewer.actmovefile.caption msgctxt "TFRMVIEWER.ACTMOVEFILE.CAPTION" msgid "Move File" msgstr "Datei verschieben" #: tfrmviewer.actmovefile.hint msgctxt "TFRMVIEWER.ACTMOVEFILE.HINT" msgid "Move File" msgstr "Datei verschieben" #: tfrmviewer.actreload.caption msgctxt "TFRMVIEWER.ACTRELOAD.CAPTION" msgid "Reload" msgstr "Neu laden" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "Aktuelle Datei neu laden" #: tfrmviewer.actrotate180.caption msgctxt "TFRMVIEWER.ACTROTATE180.CAPTION" msgid "Rotate 180" msgstr "Um 180 Grad drehen" #: tfrmviewer.actrotate180.hint msgctxt "TFRMVIEWER.ACTROTATE180.HINT" msgid "Rotate 180" msgstr "Um 180 Grad drehen" #: tfrmviewer.actrotate270.caption msgctxt "TFRMVIEWER.ACTROTATE270.CAPTION" msgid "Rotate 270" msgstr "Um 270 Grad drehen" #: tfrmviewer.actrotate270.hint msgctxt "TFRMVIEWER.ACTROTATE270.HINT" msgid "Rotate 270" msgstr "Um 270 Grad drhen" #: tfrmviewer.actrotate90.caption msgctxt "TFRMVIEWER.ACTROTATE90.CAPTION" msgid "Rotate 90" msgstr "Um 90 Grad drehen" #: tfrmviewer.actrotate90.hint msgctxt "TFRMVIEWER.ACTROTATE90.HINT" msgid "Rotate 90" msgstr "Um 90 Grad drehen" #: tfrmviewer.actsaveas.caption msgctxt "TFRMVIEWER.ACTSAVEAS.CAPTION" msgid "Save As..." msgstr "Speichern unter ..." #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "Datei speichern unter ..." #: tfrmviewer.actstretchimage.caption msgctxt "TFRMVIEWER.ACTSTRETCHIMAGE.CAPTION" msgid "Stretch" msgstr "Strecken" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "Bild strecken" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "Kopieren" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "Kopieren" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "Beschneiden" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "&Löschen" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "&Löschen" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "Ganzer Bildschirm" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "Markieren" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "Spiegeln" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "Verschieben" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "Verschieben" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "Malen" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "Rote Augen" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "" "Grösse\n" "ändern\n" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "Rückgängig machen" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "Grösser darstellen" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "Kleiner darstellen" #: tfrmviewer.caption msgctxt "tfrmviewer.caption" msgid "Viewer" msgstr "Schnellansicht" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Bilder automatisch nacheinander anzeigen (Slideshow)" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "Stift" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "Markieren" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "Malen" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Bilder automatisch nacheinander anzeigen (Slideshow)" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "Betrachten" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "&Über" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "Bin&är anzeigen" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "In &Zwischenablage kopieren" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Bearbeiten" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "&Kodiere" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "En&de" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "&Datei" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "Ganzer Bildschirm" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "Bilder" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "Als He&x anzeigen" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "B&ild" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "Wie ein &Buch anzeigen" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "Spiegeln" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "Plugins" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "Vorschau" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "Drucken..." #: tfrmviewer.mirotate.caption msgid "Rotate" msgstr "Drehen" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "Speichern" #: tfrmviewer.misaveas.caption msgctxt "TFRMVIEWER.MISAVEAS.CAPTION" msgid "Save As..." msgstr "Speichern unter ..." #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "" "Anzeige als\n" "Bild kopieren (Screenshot)\n" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "Suchen" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "Nächste suchen" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "Voriges suchen" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "Alle mar&kieren" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.mistretch.caption msgctxt "TFRMVIEWER.MISTRETCH.CAPTION" msgid "Stretch" msgstr "Strecken" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "A&ls Text anzeigen" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "&Betrachten" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "&Zeilenumbruch" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "Grösser darstellen" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "Kleiner darstellen" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "In &Zwischenablage kopieren" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "Alle mar&kieren" #: tfrmviewoperations.btnstartpause.caption msgctxt "tfrmviewoperations.btnstartpause.caption" msgid "&Start" msgstr "&Starten" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "" #: tfrmviewoperations.caption msgctxt "TFRMVIEWOPERATIONS.CAPTION" msgid "File operations" msgstr "Dateioperationen" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "Immer im Vordergrund" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "Nutze \"drag && drop\" um Operationen zwischen Warteschlangen zu verschieben" #: tfrmviewoperations.mnucanceloperation.caption msgctxt "tfrmviewoperations.mnucanceloperation.caption" msgid "Cancel" msgstr "Abbruch" #: tfrmviewoperations.mnucancelqueue.caption #, fuzzy #| msgid "Exit" msgctxt "tfrmviewoperations.mnucancelqueue.caption" msgid "Cancel" msgstr "Ende" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "Neue Warteschlange" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "tfrmviewoperations.mnuoperationshowdetached.caption" msgid "Show in detached window" msgstr "In eigenem Fenster anzeigen" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "An den Beginn der Warteschlange setzen" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "An das Ende der Warteschlange setzen" #: tfrmviewoperations.mnuqueue.caption msgctxt "tfrmviewoperations.mnuqueue.caption" msgid "Queue" msgstr "Warteschlange" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "Aus der Warteschlange entfernen" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "tfrmviewoperations.mnuqueueshowdetached.caption" msgid "Show in detached window" msgstr "In eigenem Fenster anzeigen" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "Alle &pausieren" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "tmultiarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Wenn die Datei vorhanden ist" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "twcxarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Wenn die Datei vorhanden ist" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "Im Hintergrund ausführen (eigene Verbindung)" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Wenn Datei vorhanden" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "Schnell-Filter abbrechen" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "Aktuellen Vorgang abbrechen" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "Die Zwischenablage enthält keine gültigen Daten für die Werkzeugleiste." #: ulng.rscolattr msgid "Attr" msgstr "Attribut" #: ulng.rscoldate msgid "Date" msgstr "Datum" #: ulng.rscolext msgid "Ext" msgstr "Endung" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "Name" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "Grösse" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "Anzahl der Änderungen:" #: ulng.rsconfcolalign msgid "Align" msgstr "Ausrichten" #: ulng.rsconfcolcaption msgid "Caption" msgstr "Überschrift" #: ulng.rsconfcolconfig msgid "Config" msgstr "Einstellung" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "&Löschen" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "Feldinhalt" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "Verschieben" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "Breite" #: ulng.rsconfcustheader msgid "Customize column" msgstr "Spalten anpassen" #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "Kopie (%d) %s" #: ulng.rsdlgallopcomplete #, fuzzy #| msgid "All operations is complete" msgid "All operations completed" msgstr "Alle Vorgänge abgeschlossen" #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "Fortschritt für alle Vorgänge %d %%" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "&Unterbrechen" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "A&lle" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "An&hängen" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "Abbru&ch" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "Fortset&zen" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "Zunächst nur d&ieses Verzeichnis kopieren" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "&Alle bestehenden Verzeichnisse kopieren" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "&Programm beenden" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "Alle i&gnorieren" #: ulng.rsdlgbuttonno msgid "&No" msgstr "&Nein" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "&Keine" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "&OK" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "&Überschreiben" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "Alle &vorhandenen Dateien überschreiben" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "Alle älteren &Dateien überschreiben" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "Fo&rtsetzen" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "&Wiederholen" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "Übe&rspringen" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "Übers&pringe alle" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "&Ja" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "Berechne Dateien und Verzeichnisse" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "Berechne Prüfsumme..." #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "Verifiziere Prüfsumme..." #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "Datei(en) kopieren" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "Datei(en) löschen" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "Datei(en) verschieben" #: ulng.rsdlgoppause msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "" #: ulng.rsdlgopstart msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "&Starten" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "Warteschlange" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "Geschwindigkeit %s/s" #: ulng.rsdlgspeedtime #, fuzzy #| msgid "Speed %s/s, remaining time %s" msgid "Speed %s/s, time remaining %s" msgstr "Geschwindigkeit %s/s, verbleibende Zeit %s" #: ulng.rsdlgsplit #, fuzzy #| msgid "Split file" msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "&Teile Datei" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "Datei(en) durch überschreiben löschen (nicht wiederherstellbar)" #: ulng.rsdrivenolabel msgid "" msgstr "" #: ulng.rsdrivenomedia msgid "" msgstr "" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Interner Text-Editor von Double Commander" #: ulng.rseditnewfile msgid "new.txt" msgstr "Neu.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "Dateiname:" #: ulng.rseditnewopen msgid "Open file" msgstr "Öffne Datei" #: ulng.rseditsearchback msgid "&Backward" msgstr "&Zurück" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "Suchen" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "&Vorwärts" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "Ersetzen" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "Fragen;Überschreiben;Hinein kopieren;Überspringen" #: ulng.rsfileopfileexistsoptions #, fuzzy #| msgid "Ask;Overwrite;Skip" msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "Fragen;Überschreiben;Ältere überschreiben;Überspringen" #: ulng.rsfileopsetpropertyerroroptions msgctxt "ulng.rsfileopsetpropertyerroroptions" msgid "Ask;Don't set anymore;Ignore errors" msgstr "Fragen;Niemals setzen;Fehler ignorieren" #: ulng.rsfilterstatus msgid "FILTER" msgstr "" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "Vorlage definieren" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "%s Level" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "Alle (ohne Einschränkung der Verzeichnistiefe)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "Nur das aktuelle Verzeichnis" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "Verzeichnis %s existiert nicht!" #: ulng.rsfindfound msgid "Found: %d" msgstr "Gefunden: %d" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "Suche als Vorlage speichern" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "Vorlagen-Name" #: ulng.rsfindscanned msgid "Scanned: %d" msgstr "Gelesen: %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "Suche" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "Suche Datei(en)" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "Starte bei" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr "%s Byte von %s frei" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "%s Bytes frei" #: ulng.rsfuncatime msgid "Access date/time" msgstr "Datum / Zeit des letzten Zugriffs" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "Attribute" #: ulng.rsfunccomment msgctxt "ulng.rsfunccomment" msgid "Comment" msgstr "Kommentar" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "Komprimierte Größe" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "Datum / Zeit der Erstellung" #: ulng.rsfuncext msgid "Extension" msgstr "Endung" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "Gruppe" #: ulng.rsfunclinkto msgid "Link to" msgstr "Vernüpfung mit" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "Datum / Zeit der letzten Änderung" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "Name" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "Name ohne Endung" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "Besitzer" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "Pfad" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "Grösse" #: ulng.rsfunctype msgid "Type" msgstr "Typ" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "Fehler beim Erstellen des Hardlink." #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "Kopieren/Verschieben-Dialog" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "Vergleichsprogramm" #: ulng.rshotkeycategorymain msgid "Main" msgstr "Haupt-Fenster" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "Schnellansicht" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "Verschmelzer ist fertig" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "Maske abwählen" #: ulng.rsmarkplus msgid "Select mask" msgstr "Wähle Maske" #: ulng.rsmaskinput msgid "Input mask:" msgstr "Eingabemaske:" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "Bearbeite angepasste Spalten" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "Bearbeite diese angepasste Spaltenansicht" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "Aktionen" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "Bea&rbeiten" #: ulng.rsmnueject msgid "Eject" msgstr "Auswerfen" #: ulng.rsmnumount msgid "Mount" msgstr "Einbinden" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "Neu" #: ulng.rsmnunomedia msgid "No media available" msgstr "Kein Datenträger verfügbar" #: ulng.rsmnuopenwith #, fuzzy #| msgid "Open with ..." msgid "Open with" msgstr "Öffnen mit..." #: ulng.rsmnuopenwithother msgid "Other..." msgstr "Andere..." #: ulng.rsmnusortby msgid "Sort by" msgstr "Sortieren" #: ulng.rsmnuumount #, fuzzy #| msgid "Umount" msgid "Unmount" msgstr "Einbindung lösen" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "Betrachten" #: ulng.rsmsgaccount msgid "Account:" msgstr "Zugang:" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "Zusätzliche Parameter für die Befehlszeile des Packers:" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "Die Datei \"%s\" kann nicht über sich selbst kopiert / verschoben werden!" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "Kann Verzeichnis %s nicht löschen." #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "Verzeichniswechsel nach [%s] fehlgeschlagen" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "Alle in-aktiven Tabs entfernen?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "Dieser Tab ist gesperrt! Trotzdem schliessen?" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "Soll DoubleCommander wirklich beendet werden?" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "%d markierte Datei(en) / Verzeichnis(se) kopieren?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "Markierte \"%s\" kopieren?" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "Teilweise kopierte Datei löschen?" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "Löschen von %d ausgewählten Dateien/Verzeichnissen?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "%d markierte Dateien/Verzeichnisse in den Papierkorb löschen?" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "Markierte \"%s\" löschen?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "Markierte \"%s\" in den Papierkorb löschen?" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "Kann \"%s\" nicht in den Papierkorb löschen! Endgültig löschen?" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "Laufwerk steht nicht zur Verfügung" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "Dateiendung eingeben:" #: ulng.rsmsgentername msgid "Enter name:" msgstr "Namen eingeben:" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "CRC-Fehler in der Archivdatei" #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "Datenfehler" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "Kann nicht mit dem Server \"%s\" verbinden" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "Kann die Datei %s nicht zu %s kopieren" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "Ein Verzeichnis mit Namen \"%s\" besteht bereits." #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "Datum %s wird nicht nicht unterstützt" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "Verzeichnis %s besteht bereits!" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "Abbruch durch Benutzer" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "Kann Datei nicht schliessen" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "Kann Datei nicht erstellen" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "Keine weiteren Dateien im Archiv" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "Kann bestehende Datei nicht öffnen" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "Kann Datei nicht lesen" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "Kann Datei nicht erstellen" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "Verzeichnis %s kann nicht erstellt werden!" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "Ungültige Verknüpfung" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "Keine Dateien gefunden" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "Nicht genügend Arbeitsspeicher" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "Funktion wird nicht unterstützt!" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "Fehler im Befehl des Kontextmenü" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "Fehler beim Laden der Konfiguration" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "Syntax-fehler im regulären Ausdruck!" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "Kann Datei %s nicht zu %s umbenennen" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "Kann Verknüpfung nicht festlegen" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "Kann Datei nicht speichern" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "Kann Attribut für \"%s\" nicht setzen" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "Kann Datum / Zeit für \"%s\" nicht setzen" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "Kann Besitzer/Gruppe für \"%s\" nicht erstellen" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "Puffer zu klein" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "Zuviel Dateien zum Packen" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "Archivformat unbekannt" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "Datei %s wurde geändert, speichern?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "Datei %s existiert bereits. Überschreiben?" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "Aktive Datei-Operationen" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "Es gibt Datei-Operationen, die noch nicht beendet sind. Das Schliessen von Double Commander kann deshalb zu Datenverlust führen!" #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "Datei %s ist als schreibgeschützt markiert. Soll sie gelöscht werden?" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "Die Grösse der Datei \"%s\" ist zu gross für das Dateisystem des Ziel-Laufwerks!" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "Verzeichnis %s besteht bereits. Bitte eine Auswahl treffen:" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "Sym-Link \"%s\" folgen?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "Fehler in der Befehlszeile" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "Ungültiger Dateiname" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "Ungültiges Format der Konfigurationsdatei" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "Ungültiger Pfad" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "Pfad %s enthält ungültige Zeichen." #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "Dies sit kein akzeptables Plugin" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "Dieses Plugin wurde für Double Commander für %s erstellt. Es kann nicht für %s verwendet werden!" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "Ungültiges Zitat" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "Ungültige Auswahl" #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "Lade Dateiliste..." #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "Kopiere Datei %s" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "Lösche Datei %s" #: ulng.rsmsglogerror msgid "Error: " msgstr "Fehler:" #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "Entpacke Datei(en) %s" #: ulng.rsmsgloginfo msgid "Info: " msgstr "Info" #: ulng.rsmsgloglink msgid "Create link %s" msgstr "Erstelle Verknüpfung %s" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "Erstelle Verzeichnis %s" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "Verschiebe Datei(en) %s" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "Packe in Datei %s" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "Verzeichnis %s entfernen" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "Fertig:" #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "Erstelle symb. Link für %s" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "Teste Dateiintegrität von %s" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "Favoriten-Pfad von Hand angeben" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "Favoriten-Pfad von Hand bearbeiten" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "Name und Pfad eingeben (Format Name=Pfad)" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "Master-Passwort" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "Bitte Master-Passwort eingeben" #: ulng.rsmsgnewfile msgid "New file" msgstr "Neue Datei" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "Nächster Teil wird entpackt" #: ulng.rsmsgnofiles msgid "No files" msgstr "Keine Dateien" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "Keine Dateien ausgewählt." #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "Nicht genügend Speicherplatz auf dem Ziellaufwerk. Trotzdem fortfahren?" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "Nicht genügend Speicherplatz auf dem Ziellaufwerk. Erneut versuchen?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "Kann Datei %s nicht löschen" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "Nicht möglich." #: ulng.rsmsgpassword msgid "Password:" msgstr "Passwort" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "Die zwei Passwort-Eingaben stimmen nicht überein!" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "Bitte Passwort eingeben:" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "Passwort (Firewall):" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "Bitte das Passwort zum Verifizieren erneut eingeben!" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "&Füge %s hinzu" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "&Konfigurieren" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "&Lösche %s" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "Voreinstellung \"%s\" besteht bereits. Überschreiben?" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "%d markierte Dateien / Verzeichnisse umbenennen / verschieben?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "Datei / Verzeichnis \"%s\" kopieren / verschieben?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "Bitte DoubleCommander neustarten um die Änderungen zu übernehmen" #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "Ausgewählt: %s von %s, Dateien: %d von %d, Verzeichnisse: %d von %d" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "Bitte nur Prüfsummen-Dateien auswählen!" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "Speicherort des nächsten Teils angeben" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "Laufwerksbezeichnung angeben" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "Reiter umbenennen" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "Neuer Reiter-Name" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "Zielpfad" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "Neuer Titel für den Menüeintrag:" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "Zuviele Dateien ausgewählt." #: ulng.rsmsgurl msgid "URL:" msgstr "" #: ulng.rsmsgusername msgid "User name:" msgstr "Nutzername:" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "Nutzername (Firewall):" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "Laufwerksbezeichnung:" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "Bitte Volume-Grösse eingeben:" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "%d markierte Dateien/Ordner sicher löschen?" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "Markierte \"%s\" sicher löschen?" #: ulng.rsmulrenfilenamestylelist #, fuzzy #| msgid "No change;UPPERCASE;lowercase;First Char Big;" msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "Keine Änderung;GROSSBUCHSTABEN;alles klein;Erster Buchstabe Gross" #: ulng.rsoperaborted msgid "Aborted" msgstr "Abgebrochen" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "Berechne Prüfsumme" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "Berechne Prüfsumme in \"%s\"" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "Berechne Prüfsumme von \"%s\"" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "Berechne" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "Berechne \"%s\"" #: ulng.rsopercombining msgid "Joining" msgstr "Verschmelze" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "Verschmelze Dateien in \"%s\" nach\"%s\"" #: ulng.rsopercopying msgid "Copying" msgstr "Kopiere" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "Kopiere von \"%s\" nach \"%s\"" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "Kopiere \"%s\" nach \"%s\"" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "Erstelle Verzeichnis" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "Erstelle Verzeichnis \"%s\"" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "Lösche" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "Lösche in \"%s\"" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "Lösche \"%s\"" #: ulng.rsoperexecuting msgid "Executing" msgstr "Führe aus" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "Führe \"%s\" aus" #: ulng.rsoperextracting msgid "Extracting" msgstr "Entpacke" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "Entpacke von \"%s\" nach \"%s\"" #: ulng.rsoperfinished msgid "Finished" msgstr "Beendet" #: ulng.rsoperlisting msgid "Listing" msgstr "Liste auf" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "Liste \"s%\" auf" #: ulng.rsopermoving msgid "Moving" msgstr "Verschiebe" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "Verschiebe von \"%s\" nach \"%s\"" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "Verschiebe \"%s\" nach \"%s\"" #: ulng.rsopernotstarted msgid "Not started" msgstr "Nicht gestartet" #: ulng.rsoperpacking msgid "Packing" msgstr "Packe" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "Packe von \"%s\" nach \"%s\"" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "Packe \"%s\" nach \"%s\"" #: ulng.rsoperpaused msgid "Paused" msgstr "Pausiert" #: ulng.rsoperpausing msgid "Pausing" msgstr "Pause" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "In Warteschlange" #: ulng.rsoperrunning msgid "Running" msgstr "Wird ausgeführt" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "Stelle Eigenschaften ein" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "Setze Eigenschaften in \"%s\"" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "Setze Eigenschaft von \"%s\"" #: ulng.rsopersplitting msgid "Splitting" msgstr "Teile" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "Teile \"%s\" nach \"%s\"" #: ulng.rsoperstarting msgid "Starting" msgstr "Wird gestartet" #: ulng.rsoperstopped msgid "Stopped" msgstr "Gestoppt" #: ulng.rsoperstopping msgid "Stopping" msgstr "Stoppe" #: ulng.rsopertesting msgid "Testing" msgstr "Test" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "Teste in \"%s\"" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "Teste \"%s\"" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "Verifiziere Prüfsumme" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "Verifiziere Prüfsumme in \"%s\"" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "Verifiziere Prüfsumme von \"%s\"" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "Warte auf Zugriff auf Datei-Quelle" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "Warte auf Benutzereingabe" #: ulng.rsoperwiping msgid "Wiping" msgstr "Lösche sicher" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "Lösche sicher in \"%s\"" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "Lösche \"%s\" sicher" #: ulng.rsoperworking msgid "Working" msgstr "Führe aus" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "Lösche:" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "Ohne gespeicherten Pfad entpacken:" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "Format Analyse-Modus:" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "" #: ulng.rsoptarchiveidseekrange #, fuzzy #| msgid "ID Seek Range (optional):" msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "ID Such-Bereich (optional)" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "Passwortabfrage:" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "Selbstentpackendes Archiv (Sfx) erstellen:" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "Teste:" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "Name des Archiv-Typs:" #: ulng.rsoptarchivevalue msgid "Value" msgstr "Wert" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "Verknüpfe PlugIn \"%s\" mit:" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "Erste;Letzte;" #: ulng.rsoptdisable msgid "Disable" msgstr "Deaktivieren" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "Aktivieren" #: ulng.rsoptenterext msgid "Enter extension" msgstr "Endung eingeben" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "Zeiger" #: ulng.rsoptexamplemark msgid "Mark" msgstr "Einfügemarke" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "Einfügemarke + Zeiger" #: ulng.rsoptexampletext msgid "Text" msgstr "" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "eigenes Fenster;minimiertes eigenes Fenster;Operationsfenster" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "Tastaturkürzel %s für cm_delete wird registriert, damit die Änderung rückgängig gemacht werden kann." #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "Füge Tastaturkürzel für %s hinzu" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "Tastaturkürzel erstellen" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "Kann die Verknüpfung nicht erstellen" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "Verknüpfung ändern" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "Befehle" #: ulng.rsopthotkeysdeletetrashcanoverrides msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "Verknüpfung %s für cm_Delete hat Parameter, die diese Einstellung überschreiben. Soll dieser Parameter geändert werden, um die globale Einstellung zu verwenden?" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "Verknüpfung %s für cm_Delete muss einen Parameter geändert bekommen, um der Verknüpfung %s zu entsprechen. Soll der Parameter geändert werden?" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "Beschreibung" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "Bearbeite Tastaturkürzle für %s" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "Parameter wiederherstellen" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "Tastaturkürzel" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "Tastaturkürzel" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "Parameter" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "Verknüpfung festlegen um Dateien zu löschen" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "Damit diese Einstellung mit Verknüpfung %s funktioniert, muss %s cm_Delete zugewiesen werden, aber ist %s zugewiesen. Soll dies geändert werden?" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "Verknüpfung %s für cm_Delete ist eine Sequenz-Verknüpfung, für die ein Tastaturkürzel mit umgekehrter Umschalt-Taste nicht verwendet werden kann. Die Einstellung funktioniert wahrscheinlich so nicht." #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "Tastaturkürzel in Gebrauch" #: ulng.rsopthotkeysshortcutusedtext1 #, fuzzy #| msgid "Shortcut %s is already used for %s." msgid "Shortcut %s is already used." msgstr "Tastaturkürzel %s wird bereits verwendet." #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "Verändern zu %s?" #: ulng.rsopthotkeysusedby #, fuzzy #| msgid "used by" msgid "used for %s in %s" msgstr "Benutzt für %s in %s" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "für diesen Befehl genutzt, aber mit unterschiedlichen Parametern" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "Archivierer" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "Automatisch Auffrischen" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "Verhalten" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "Farben" #: ulng.rsoptionseditorcolumnsview msgctxt "ulng.rsoptionseditorcolumnsview" msgid "Columns" msgstr "Spalten" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "Einstellungen" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "Benutzerdefinierte Spalten" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "Drag & Drop (ziehen und ablegen)" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "Schalter für das Laufwerks-Drop-down-Menü" #: ulng.rsoptionseditorfileoperations msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "Dateioperationen" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "Dateifenster" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "Datei-Ansicht" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "Dateitypen" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "Verzeichnisreiter" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "Schriftart" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "Hervorheber" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "Tastaurkürzel" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "Ausschluss-Liste" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "Tasten" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "Sprache" #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "Layout" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "Log" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "Verschiedenes" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "Maus" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "Plugins" #: ulng.rsoptionseditorquicksearch #, fuzzy #| msgid "Quick search" msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "Schnelle Suche" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "Befehlszeilen-Interpreter" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "Werkzeugleiste" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "Tools" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "Tooltips" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "Kein;Befehlszeile;Schnellsuche;Schnellfilter" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "Linke Taste;Rechte Taste;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "an den Beginn der Dateiliste;hinter die Verzeichnisse (wenn Verzeichnisse vor Dateien sortiert werden sollen);an festgelegte Position;ans Ende der Dateiliste" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "Plugin %s ist bereits den folgenden Dateiendungen zugewiesen:" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "Aktiv" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "Dateiname" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "Name" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "Registriert für" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "Genaue &Schreibweise;unabhängig von der Schreibwe&ise" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "&Dateien;Ve&rzeichnisse;Dateien u&nd Verzeichnisse" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "Verstecke Filterpanel wenn es nicht ausgewä&hlt ist" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "Nicht abhängig von der Schreibweise; abhängig von den lokalen Einstellungen (aAbBcC); erst GrOß, dann klein (ABCabc)" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "Nach Namen sortieren und ersten anzeigen; wie Dateien sortieren und erste anzeigen; wie Dateien sortieren" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "Alphabetisch;Natürliche Sortierung: alphabetisch und numerisch" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "Oben;Unten;" #: ulng.rsopttoolbarbuttontype #, fuzzy #| msgid "Separator;Internal command;External command;Menu" msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "Tr&ennendes Element;&nterner Befehl;E&xterner Befehl;Men&ü" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "Position nicht verändern;die gleiche Einstellung wie für neue Dateien nutzen;an festgelegte Position" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "Dateien: %d, Verzeichnisse: %d" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "Kann die Zugriffsrechte für die Datei \"%s\" nicht ändern" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "Kann den Besitzer für \"%s\" nicht ändern" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "Datei" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "Verzeichnis" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "Benannte Pipe" #: ulng.rspropsno msgid "No" msgstr "Nein" #: ulng.rspropssocket msgid "Socket" msgstr "Socket" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "Spezielles Block-device" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "Spezielles Buchstaben-device" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "Symbolischer Link" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "Unbekannter Typ" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "Ja (%s)" #: ulng.rssearchresult msgid "Search result" msgstr "Suchergebnis" #: ulng.rssearchtemplateunnamed msgid "" msgstr "" #: ulng.rsselectdir msgid "Select a directory" msgstr "Wähle ein Verzeichnis" #: ulng.rsshowhelpfor #, fuzzy #| msgid "Show help for %s" msgid "&Show help for %s" msgstr "&Zeige Hilfe zu %s" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "Dateien: %d, Verzeichnis: %d, Grösse: %s (%s byte)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "Kann Zielverzeichnis nicht erstellen" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "Falsches Dateigrössenformat!" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "Kann Datei nicht teilen!" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "Die Anzahl der Teile ist grösser als 100! Fortfahren?" #: ulng.rssplitseldir msgid "Select directory:" msgstr "Wähle Verzeichnis:" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "Fehler beim Erstellen des symb. Link." #: ulng.rssyndefaulttext msgctxt "ulng.rssyndefaulttext" msgid "Default text" msgstr "Standardtext" #: ulng.rssynlangplaintext msgctxt "ulng.rssynlangplaintext" msgid "Plain text" msgstr "Reiner Text" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "Tag(e)" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "Stunde(n)" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "Minute(n)" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "Monat(e)" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "Sekunde(n)" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "Woche(n)" #: ulng.rstimeunityear msgid "Year(s)" msgstr "Jahr(e)" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "Vergleichsprogramm" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "Text-Editor" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "Fehler beim Öffnen des Vergleichers" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "Fehler beim Öffnen des Editors" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "Fehler beim starten des Befehlszeilen-Interpreters" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "Fehler beim Öffnen des Betrachters" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "Befehlszeilen-Interpreter" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "Schnellansicht" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "Bitte diesen Fehler im Bug-Tracker melden, mit einer Beschreibung was Sie getan haben und der folgend Datei:%s Klicken Sie auf %s zum Fortfahren oder %s zum Abbrechen." #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "Netzwerk" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "Interner Betrachter des Double Commander" #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "Codierung" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "%s nicht gefunden!" doublecmd-0.5.8/language/doublecmd.pl.po0000644000175000017500000065201712250633131017210 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.5 alpha\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2011-10-13 20:19+0100\n" "Last-Translator: Franciszek Janowski \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Polish\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Language: pl_PL\n" "X-Source-Language: C\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "Wszystko" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "Wszystko" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "Wszystko" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "Wszystko" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "Wszystko" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "Wszystko" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "Wszystko" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "Anuluj" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "..." #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "->" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "<-" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "Konfiguracja wyglądu kolumn" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "Tło:" #: tfcolumnssetconf.cbcursorborder.caption msgid "Cursor border" msgstr "Obramowanie kursora" #: tfcolumnssetconf.cbovercolor.caption msgid "Allow Overcolor" msgstr "Pozwól nanakładanie sie farb na siebie" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "Ustawienie czcionki i koloru" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "Kolor tekstu:" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "Czcionka:" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "Wielkość:" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "Tło 2:" #: tfcolumnssetconf.lblconfigviewnr.caption msgid "Configure view nr:" msgstr "Konfiguracja wyglądu nr:" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "Kolor kursora:" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "Tekst pod kursorem:" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "Kolor zaznaczania:" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "Nazwa:" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "Dodaj kolumnę" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "Dostosuj kolumnę: " #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "Podgląd" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "R" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption #, fuzzy #| msgid "Check free space" msgid "C&heck free space" msgstr "Sprawdź wolne miejsce" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption msgid "Cop&y attributes" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption msgid "Copy o&wnership" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption msgid "Copy d&ate/time" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption #, fuzzy #| msgid "Correct links" msgid "Correct lin&ks" msgstr "Popraw linki" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "Zdejmij flagę \"Tylko do odczytu\"" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption msgid "E&xclude empty directories" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption #, fuzzy #| msgid "Follow links" msgid "Fo&llow links" msgstr "Idź za linkami" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "" #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption #, fuzzy #| msgid "When directory exists" msgid "When dir&ectory exists" msgstr "Gdy katalog istnieje" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption #, fuzzy #| msgid "When file exists" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "Gdy plik istnieje" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption msgid "When ca&nnot set property" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "" #: tfrmabout.btnclose.caption msgctxt "TFRMABOUT.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zamknij" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "Kopiuj do schowka" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "O programie" #: tfrmabout.lblbuild.caption msgid "Build" msgstr "Kompilacja" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "Free Pascal" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "Strona domowa:" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "http://doublecmd.sourceforge.net" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "Lazarus" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "Wydanie" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption msgid "Version" msgstr "Wersja" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "&Reset" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "Wybierz atrybuty" #: tfrmattributesedit.cbarchive.caption #, fuzzy #| msgid "Archive" msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "Archiwum" #: tfrmattributesedit.cbcompressed.caption #, fuzzy #| msgid "Compressed" msgid "Co&mpressed" msgstr "Skompresowany" #: tfrmattributesedit.cbdirectory.caption #, fuzzy #| msgid "Directory" msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "Katalog" #: tfrmattributesedit.cbencrypted.caption #, fuzzy #| msgid "Encrypted" msgid "&Encrypted" msgstr "Zaszyfrowany" #: tfrmattributesedit.cbhidden.caption #, fuzzy #| msgid "Hidden" msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "Ukryty" #: tfrmattributesedit.cbreadonly.caption #, fuzzy #| msgid "Read only" msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "Tylko do odczytu" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmattributesedit.cbsparse.caption #, fuzzy #| msgid "Sparse" msgid "S&parse" msgstr "Rzadki" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Przyklejony" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmattributesedit.cbsymlink.caption #, fuzzy #| msgid "Symlink" msgid "&Symlink" msgstr "Link symboliczny" #: tfrmattributesedit.cbsystem.caption #, fuzzy #| msgid "System" msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "Systemowy" #: tfrmattributesedit.cbtemporary.caption #, fuzzy #| msgid "Temporary" msgid "&Temporary" msgstr "Tymczasowy" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "Atrybuty NTFS" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "Atrybuty ogólne" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bity:" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Grupa" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Inne" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Właściciel" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "Wykonanie" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "Odczyt" #: tfrmattributesedit.lbltextattrs.caption #, fuzzy #| msgid "As text:" msgid "As te&xt:" msgstr "Jako tekst:" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "Zapis" #: tfrmchecksumcalc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmchecksumcalc.caption msgctxt "tfrmchecksumcalc.caption" msgid "Calculate check sum..." msgstr "Oblicz sumę kontrolną" #: tfrmchecksumcalc.cbseparatefile.caption #, fuzzy #| msgid "Create separate checksum file for each file" msgid "C&reate separate checksum file for each file" msgstr "Dla każdego pliku utwórz oddzielny plik sumy kontrolnej" #: tfrmchecksumcalc.lblsaveto.caption #, fuzzy #| msgid "Save check sum file(s) to:" msgid "&Save check sum file(s) to:" msgstr "Zapisz sumę kontrolną jako plik:" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Zamknij" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "Sprawdź sumę kontrolną" #: tfrmconnectionmanager.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "Dodaj" #: tfrmconnectionmanager.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmconnectionmanager.btnconnect.caption #, fuzzy #| msgid "Connect" msgid "C&onnect" msgstr "Połącz" #: tfrmconnectionmanager.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Usuń" #: tfrmconnectionmanager.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Edytuj" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "Menadżer połączeń" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "Połącz z:" #: tfrmcopydlg.btnaddtoqueue.caption #, fuzzy #| msgid "Add To Queue" msgid "A&dd To Queue" msgstr "Dodaj do kolejki" #: tfrmcopydlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "tfrmcopydlg.btncreatespecialqueue.caption" msgid "..." msgstr "..." #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "Opcje" #: tfrmcopydlg.btnsaveoptions.caption #, fuzzy #| msgid "Save these options as default" msgid "Sa&ve these options as default" msgstr "Zapisz te opcje jako domyślne" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "Kopiuj plik/i" #: tfrmdescredit.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "Komentarz do pliku/katalogu" #: tfrmdescredit.lbleditcommentfor.caption #, fuzzy #| msgid "Edit comment for:" msgid "E&dit comment for:" msgstr "Edytuj komentarz do:" #: tfrmdescredit.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "Kodowanie:" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "O programie" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "Aotomatycznie porównaj" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "Tryb binarny" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "Anuluj" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "Anuluj" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "Kopiuj blok w prawo" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "Kopiuj blok w prawo" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "Kopiuj blok w lewo" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "Kopiuj blok w lewo" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Kopiuj" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Wytnij" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Usuń" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Wstaw" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Powtórz szukanie" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "Zaznacz &wszystko" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Cofnij" #: tfrmdiffer.actexit.caption msgctxt "tfrmdiffer.actexit.caption" msgid "E&xit" msgstr "Koniec" #: tfrmdiffer.actfirstdifference.caption msgctxt "tfrmdiffer.actfirstdifference.caption" msgid "First Difference" msgstr "Pierwsza różnica" #: tfrmdiffer.actfirstdifference.hint msgctxt "tfrmdiffer.actfirstdifference.hint" msgid "First Difference" msgstr "Pierwsza różnica" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "Ignoruj wielkość liter" #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "Ignoruj puste" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "Kontynuuj przewijanie" #: tfrmdiffer.actlastdifference.caption msgctxt "tfrmdiffer.actlastdifference.caption" msgid "Last Difference" msgstr "Ostatnia różnica" #: tfrmdiffer.actlastdifference.hint msgctxt "tfrmdiffer.actlastdifference.hint" msgid "Last Difference" msgstr "Ostatnia różnica" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "Różnice linii" #: tfrmdiffer.actnextdifference.caption msgctxt "tfrmdiffer.actnextdifference.caption" msgid "Next Difference" msgstr "Następna różnica" #: tfrmdiffer.actnextdifference.hint msgctxt "tfrmdiffer.actnextdifference.hint" msgid "Next Difference" msgstr "Następna różnica" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "Otwórz lewy..." #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "Otwórz prawy..." #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "Maluj tło" #: tfrmdiffer.actprevdifference.caption msgctxt "tfrmdiffer.actprevdifference.caption" msgid "Previous Difference" msgstr "Poprzednia różnica" #: tfrmdiffer.actprevdifference.hint msgctxt "tfrmdiffer.actprevdifference.hint" msgid "Previous Difference" msgstr "Poprzednia różnica" #: tfrmdiffer.actreload.caption #, fuzzy #| msgid "Reload" msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "Wczytaj ponownie" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "Wczytaj ponownie" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "Zapisz" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "Zapisz" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "Zapisz jako..." #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "Zapisz jako..." #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "Zapisz lewy" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "Zapisz lewy" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "Zapisz lewy jako..." #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "Zapisz lewy jako..." #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "Zapisz prawy" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "Zapisz prawy" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "Zapisz prawy jako..." #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "Zapisz prawy jako..." #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "Porównaj" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "Porównaj" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "Kodowanie" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "Kodowanie" #: tfrmdiffer.caption msgctxt "TFRMDIFFER.CAPTION" msgid "Compare files" msgstr "Porównaj pliki" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miencodingleft.caption #, fuzzy #| msgid "Left" msgid "&Left" msgstr "Lewy" #: tfrmdiffer.miencodingright.caption #, fuzzy #| msgid "Right" msgid "&Right" msgstr "Prawy" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "&Akcje" #: tfrmdiffer.mnuedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "Edycja" #: tfrmdiffer.mnuencoding.caption #, fuzzy #| msgid "Encoding" msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "Kodowanie" #: tfrmdiffer.mnufile.caption #, fuzzy #| msgid "File" msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "Plik" #: tfrmdiffer.mnuoptions.caption msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "&Opcje" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "" #: tfrmedithotkey.btncancel.caption msgctxt "TFRMEDITHOTKEY.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Anuluj" #: tfrmedithotkey.btnok.caption msgctxt "TFRMEDITHOTKEY.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "" #: tfrmedithotkey.cghkcontrols.caption msgctxt "tfrmedithotkey.cghkcontrols.caption" msgid "Only for these controls" msgstr "Tylko dla tych kontrolek" #: tfrmedithotkey.lblparameters.caption msgid "&Parameters (each in a separate line):" msgstr "" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "O programie" #: tfrmeditor.actabout.hint msgctxt "tfrmeditor.actabout.hint" msgid "About" msgstr "O programie" #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "Konfiguracja" #: tfrmeditor.actconfhigh.hint msgctxt "tfrmeditor.actconfhigh.hint" msgid "Configuration" msgstr "Konfiguracja" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Kopiuj" #: tfrmeditor.acteditcopy.hint msgctxt "tfrmeditor.acteditcopy.hint" msgid "Copy" msgstr "Kopiuj" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Wytnij" #: tfrmeditor.acteditcut.hint msgctxt "tfrmeditor.acteditcut.hint" msgid "Cut" msgstr "Wytnij" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Usuń" #: tfrmeditor.acteditdelete.hint msgctxt "tfrmeditor.acteditdelete.hint" msgid "Delete" msgstr "Usuń" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "Znajdź" #: tfrmeditor.acteditfind.hint msgctxt "tfrmeditor.acteditfind.hint" msgid "Find" msgstr "Szukaj" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "Znajdź następny" #: tfrmeditor.acteditfindnext.hint msgctxt "tfrmeditor.acteditfindnext.hint" msgid "Find next" msgstr "Znajdź następny" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "Mac (CR)" #: tfrmeditor.acteditlineendcr.hint msgctxt "tfrmeditor.acteditlineendcr.hint" msgid "Mac (CR)" msgstr "Mac (CR)" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "Windows (CRLF)" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "tfrmeditor.acteditlineendcrlf.hint" msgid "Windows (CRLF)" msgstr "Windows (CRLF)" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "Unix (LF)" #: tfrmeditor.acteditlineendlf.hint msgctxt "tfrmeditor.acteditlineendlf.hint" msgid "Unix (LF)" msgstr "Unix (LF)" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Wstaw" #: tfrmeditor.acteditpaste.hint msgctxt "tfrmeditor.acteditpaste.hint" msgid "Paste" msgstr "Wstaw" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Powtórz" #: tfrmeditor.acteditredo.hint msgctxt "tfrmeditor.acteditredo.hint" msgid "Redo" msgstr "Powtórz szukanie" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "Zamień" #: tfrmeditor.acteditrplc.hint msgctxt "tfrmeditor.acteditrplc.hint" msgid "Replace" msgstr "Zamień" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "Zaznacz &wszystko" #: tfrmeditor.acteditselectall.hint msgctxt "tfrmeditor.acteditselectall.hint" msgid "Select All" msgstr "Zaznacz wszystko" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Cofnij" #: tfrmeditor.acteditundo.hint msgctxt "tfrmeditor.acteditundo.hint" msgid "Undo" msgstr "Cofnij" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "Zamknij" #: tfrmeditor.actfileclose.hint msgctxt "tfrmeditor.actfileclose.hint" msgid "Close" msgstr "Zamknij" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "Koniec" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "Zakończ" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "Utwórz" #: tfrmeditor.actfilenew.hint msgctxt "tfrmeditor.actfilenew.hint" msgid "New" msgstr "Nowy" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "Uruchom" #: tfrmeditor.actfileopen.hint msgctxt "tfrmeditor.actfileopen.hint" msgid "Open" msgstr "Otwórz" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "Zapisz" #: tfrmeditor.actfilesave.hint msgctxt "tfrmeditor.actfilesave.hint" msgid "Save" msgstr "Zapisz" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "Zapisz jako" #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "Zapisz jako" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "Zapisz wszystko" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "Zapisz wszystkie" #: tfrmeditor.caption msgctxt "tfrmeditor.caption" msgid "Editor" msgstr "Edytor" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "Pomoc" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "Edycja" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "Kodowanie" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "Otwórz jako" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "Zapisz jako" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "Plik" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "Kolorowanie składni" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "Koniec linii" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n5.caption msgctxt "TFRMEDITOR.N5.CAPTION" msgid "-" msgstr "-" #: tfrmeditsearchreplace.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "&Uwzględniaj wielkość liter" #: tfrmeditsearchreplace.cbsearchfromcursor.caption #, fuzzy #| msgid "Search from &caret" msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "Szukaj od kursora" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "Wyrażenie regularne" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "W zaznaczonym tekście" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "Tylko całe wyrazy" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "Opcje" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "Zamień na:" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "Znajdź:" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "Kierunek" #: tfrmextractdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmextractdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Pomoc" #: tfrmextractdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmextractdlg.caption msgctxt "TFRMEXTRACTDLG.CAPTION" msgid "Unpack files" msgstr "Rozpakuj plik/i" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "Z podkatalogami" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*.*" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "Każde archiwum rozpakuj do oddzielnego katalogu" #: tfrmextractdlg.cboverwrite.caption #, fuzzy #| msgid "&Overwrite existing files" msgid "O&verwrite existing files" msgstr "Nadpisz istniejące pliki" #: tfrmextractdlg.lblextractto.caption #, fuzzy #| msgid "To the directory:" msgid "To the &directory:" msgstr "Do katalogu:" #: tfrmextractdlg.lblfilemask.caption #, fuzzy #| msgid "Extract files matching file mask:" msgid "&Extract files matching file mask:" msgstr "Rozpakuj pliki zgodne z maską:" #: tfrmextractdlg.lblpassword.caption #, fuzzy #| msgid "Password for encrypted files:" msgid "&Password for encrypted files:" msgstr "Hasło dla zaszyfrowanych plików:" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "Dodaj" #: tfrmfileassoc.btnaddext.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "Dodaj" #: tfrmfileassoc.btnaddnewtype.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "Dodaj" #: tfrmfileassoc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmfileassoc.btndownact.caption #, fuzzy #| msgid "Down" msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "W dół" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmfileassoc.btnremoveact.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "Usuń" #: tfrmfileassoc.btnremoveext.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "Usuń" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "X" #: tfrmfileassoc.btnremovetype.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "Usuń" #: tfrmfileassoc.btnrenametype.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "Zmień nazwę" #: tfrmfileassoc.btnupact.caption #, fuzzy #| msgid "Up" msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "W górę" #: tfrmfileassoc.caption msgid "File associations" msgstr "Skojarzenia plików" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "Akcja" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "Rozszerzenie" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "Typ pliku" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "Ikona" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "Akcja:" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "Polecenie:" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "Edytuj" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "Otwórz w edytorze" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "Nazwa pliku" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "Ścieżka do pliku" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "Pełna ścieżka" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "Wyświetl zwrócone komunikaty polecenia" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "Otwórz" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "Uruchom w terminalu" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "Otwórz w VFS" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "Podgląd" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "Otwórz w przeglądarce" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Zamknij" #: tfrmfileexecuteyourself.caption msgctxt "TFRMFILEEXECUTEYOURSELF.CAPTION" msgid "Wait..." msgstr "Czekaj..." #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "Nazwa pliku:" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "Z:" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "Kliknij na Zamknij, gdy plik tymczasowy może zostać usunięty!" #: tfrmfileop.btncancel.caption #| msgid "Cancel" msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Anuluj" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "Z:" #: tfrmfileop.lblto.caption msgid "To:" msgstr "Do:" #: tfrmfileproperties.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Zamknij" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "" #: tfrmfileproperties.caption msgctxt "TFRMFILEPROPERTIES.CAPTION" msgid "Properties" msgstr "Właściwości" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Przyklejony" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "Właściciel" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bity:" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Grupa" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Inne" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Właściciel" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmfileproperties.lblattrtextstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Tekstowo:" #: tfrmfileproperties.lblcontains.caption msgctxt "tfrmfileproperties.lblcontains.caption" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Wykonywalny" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "Nazwa pliku" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "Nazwa:" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "Nazwa pliku" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "Ścieżka:" #: tfrmfileproperties.lblgroupstr.caption #, fuzzy #| msgid "Group" msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "Grupa" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "Ostatnio otwarty:" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "Ostatnio zmieniony:" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "Ostatnia zmiana statusu:" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Ósemkowo:" #: tfrmfileproperties.lblownerstr.caption #, fuzzy #| msgid "Owner" msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "Właściciel" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Odczyt" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "Rozmiar:" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption msgid "Symlink to:" msgstr "Link symboliczny do:" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption msgid "Type:" msgstr "Typ:" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Zapis" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Arybuty" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "Właściwości" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "Dodaj" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "Pomoc" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Zamknij" #: tfrmfinddlg.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmfinddlg.btnedit.caption" msgid "&Edit" msgstr "Edycja" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "Idź do pliku" #: tfrmfinddlg.btnlastsearch.caption msgctxt "tfrmfinddlg.btnlastsearch.caption" msgid "&Last search" msgstr "" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "Nowe szukanie" #: tfrmfinddlg.btnsavetemplate.caption #, fuzzy #| msgid "Save" msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "Zapisz" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "Usuń" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "Wczytaj" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "&Zapisz" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption msgid "Sa&ve with \"Start in directory\"" msgstr "" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "" #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "&Start" #: tfrmfinddlg.btnstop.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "Anuluj" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "&Podgląd" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "Wyświetl w &panelu" #: tfrmfinddlg.caption msgctxt "tfrmfinddlg.caption" msgid "Find files" msgstr "Znajdź plik" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "Według &wzorca" #: tfrmfinddlg.cbdatefrom.caption #, fuzzy #| msgid "Date From:" msgid "&Date from:" msgstr "Od daty:" #: tfrmfinddlg.cbdateto.caption #, fuzzy #| msgid "Date To:" msgid "Dat&e to:" msgstr "Do daty:" #: tfrmfinddlg.cbfilesizefrom.caption #, fuzzy #| msgid "Size from:" msgid "S&ize from:" msgstr "Wielkość od:" #: tfrmfinddlg.cbfilesizeto.caption #, fuzzy #| msgid "Size to:" msgid "Si&ze to:" msgstr "Wielkość do:" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "Znajdź &tekst w pliku" #: tfrmfinddlg.cbfollowsymlinks.caption #, fuzzy #| msgid "Follow symlinks" msgctxt "tfrmfinddlg.cbfollowsymlinks.caption" msgid "Follow s&ymlinks" msgstr "" "Podążaj za \n" "linkami symbolicznymi\n" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "Pliki &NIE zawierające tekstu" #: tfrmfinddlg.cbnotolderthan.caption #, fuzzy #| msgid "Not older than:" msgid "N&ot older than:" msgstr "Nie starsze niż:" #: tfrmfinddlg.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name " msgid "Searc&h for part of file name" msgstr "Szukaj części nazwy pliku" #: tfrmfinddlg.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "Wyrażenie regularne" #: tfrmfinddlg.cbreplacetext.caption msgid "Re&place by" msgstr "Za&mień tekst" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "" #: tfrmfinddlg.cbtimefrom.caption #, fuzzy #| msgid "Time from:" msgid "&Time from:" msgstr "Czas od:" #: tfrmfinddlg.cbtimeto.caption #, fuzzy #| msgid "Time to:" msgid "Ti&me to:" msgstr "Czas do:" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "&Użyj wtyczki wyszukiwania:" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption msgctxt "tfrmfinddlg.gbdirectories.caption" msgid "Directories" msgstr "Katalog" #: tfrmfinddlg.gbfiles.caption msgctxt "tfrmfinddlg.gbfiles.caption" msgid "Files" msgstr "Plik" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "Znajdź dane" #: tfrmfinddlg.lblattributes.caption msgid "Attri&butes" msgstr "" #: tfrmfinddlg.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "Kodowanie:" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "Maska &pliku" #: tfrmfinddlg.lblfindpathstart.caption #, fuzzy #| msgid "&Start in directory" msgid "Start in &directory" msgstr "&Katalog" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "Z po&dkatalogami:" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "&Poprzednie wyszukiwanie:" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "Usuń z listy" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "Pokaż wszystkie znalezione pozycje" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "Podgląd" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "Zaawansowane" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "Wczytaj/zapisz" #: tfrmfinddlg.tsplugins.caption msgctxt "tfrmfinddlg.tsplugins.caption" msgid "Plugins" msgstr "Wtyczki" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "Wyniki" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "Podstawowe" #: tfrmfindview.btnclose.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmfindview.btnfind.caption #, fuzzy #| msgid "Find" msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "Szukaj" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "Szukaj" #: tfrmfindview.cbcasesens.caption #, fuzzy #| msgid "Case sensitive" msgid "C&ase sensitive" msgstr "Uwzględniaj wielkie litery" #: tfrmhardlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmhardlink.caption msgid "Create hard link" msgstr "Utwórz link twardy" #: tfrmhardlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Dowiązanie do" #: tfrmhardlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Nazwa linku" #: tfrmhotdir.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "Dodaj" #: tfrmhotdir.btnaddman.caption #, fuzzy #| msgid "Add manually" msgid "Add &manually" msgstr "Dodaj ręcznie" #: tfrmhotdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmhotdir.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Usuń" #: tfrmhotdir.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Edytuj" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "Otwierane katalogi" #: tfrmlinker.btnexit.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmlinker.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "..." #: tfrmlinker.caption msgctxt "TFRMLINKER.CAPTION" msgid "Linker" msgstr "Linkowanie" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "Zapisz jako..." #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "Obiekt" #: tfrmlinker.lblfilename.caption #, fuzzy #| msgid "File name" msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "Nazwa pliku" #: tfrmlinker.spbtndel.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "Usuń" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "Usuń" #: tfrmlinker.spbtndown.caption #, fuzzy #| msgid "Down" msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "W dół" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "W dół" #: tfrmlinker.spbtnup.caption #, fuzzy #| msgid "Up" msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "W górę" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "W górę" #: tfrmmain.actabout.caption msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "O programie" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "Dodaj nazwę pliku w pasku poleceń" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "Dodaj ścieżkę i nazwę pliku w pasku poleceń" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "Kopiuj ścieżkę do paska poleceń" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "" #: tfrmmain.actcalculatespace.caption msgid "Calculate &Occupied Space" msgstr "Oblicz zajmowane &miejsce" #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "Zmień katalog" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "Zmień katalog na wyższy" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "Przejdź do katalogu głównego" #: tfrmmain.actchecksumcalc.caption msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "O&blicz sumy kontrolne" #: tfrmmain.actchecksumverify.caption msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "Sprawdź s&umy kontrolne" #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "Wyczyść plik logów" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "Wyczyść okno logów" #: tfrmmain.actclosealltabs.caption #, fuzzy #| msgid "Remove &All Tabs" msgctxt "tfrmmain.actclosealltabs.caption" msgid "Close &All Tabs" msgstr "Usuń wszystkie k&arty" #: tfrmmain.actclosetab.caption #, fuzzy #| msgid "&Remove Tab" msgctxt "tfrmmain.actclosetab.caption" msgid "&Close Tab" msgstr "Usuń kartę" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "Porównaj &zawartość" #: tfrmmain.actcomparedirectories.caption msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.CAPTION" msgid "Compare Directories" msgstr "Porównaj katalogi" #: tfrmmain.actcomparedirectories.hint msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.HINT" msgid "Compare Directories" msgstr "Porównaj katalogi" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "Pokaż menu kontekstowe" #: tfrmmain.actcopy.caption #, fuzzy #| msgid "Copy" msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "Kopiuj" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "Kopiuj nazwę pliku ze ścieżką &dostępu" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "&Kopiuj nazwę/y pliku/ów do schowka" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "Kopiuj bez pytania o potwierdzenie" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "Kopiuj do tego samego okna" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "Kopiuj" #: tfrmmain.actcountdircontent.caption msgid "Sho&w Occupied Space" msgstr "Pokaż zajęte miejsce" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "Wytnij" #: tfrmmain.actdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMMAIN.ACTDELETE.CAPTION" msgid "Delete" msgstr "Usuń" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "Historia katalogów" #: tfrmmain.actdirhotlist.caption msgid "Directory &Hotlist" msgstr "Lista otwieranych katalogów" #: tfrmmain.actedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "Edytuj" #: tfrmmain.acteditcomment.caption msgid "Edit Co&mment..." msgstr "Edytuj k&omentarz..." #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "Utwórz plik" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "Edycja ścieżki nad listą plików" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "Zamień panele" #: tfrmmain.actexit.caption msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "Koniec" #: tfrmmain.actextractfiles.caption msgid "&Extract Files..." msgstr "&Rozpakuj pliki..." #: tfrmmain.actfileassoc.caption msgid "File &Associations..." msgstr "Skoj&arzenia plików..." #: tfrmmain.actfilelinker.caption msgid "Com&bine Files..." msgstr "P&ołącz pliki..." #: tfrmmain.actfileproperties.caption msgid "Show &File Properties" msgstr "Pokaż &właściwości pliku" #: tfrmmain.actfilespliter.caption msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "Po&dziel plik" #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "Przejdź do lini poleceń" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "Umieść kursor na pierwszym pliku listy" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "Umieść kursor na ostatnim pliku listy" #: tfrmmain.acthardlink.caption msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "Utwórz link &twardy..." #: tfrmmain.acthelpindex.caption msgid "&Contents" msgstr "Zawartość" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "Horyzontalne ustawienie paneli" #: tfrmmain.actkeyboard.caption msgid "&Keyboard" msgstr "Skróty klawiaturowe" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "Lewa &= Prawa" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "Otwórz listę dysków z lewej" #: tfrmmain.actloadselectionfromclip.caption msgid "Load Selection from Clip&board" msgstr "Wczytaj zaznaczenie ze s&chowka" #: tfrmmain.actloadselectionfromfile.caption msgid "&Load Selection from File..." msgstr "Wczytaj wybór z p&liku" #: tfrmmain.actmakedir.caption #, fuzzy #| msgid "MakeDir" msgid "MakeDir" msgstr "Utwórz katalog" #: tfrmmain.actmarkcurrentextension.caption msgid "Select All with the Same E&xtension" msgstr "Zaznacz wszystko według &rozszerzenia" #: tfrmmain.actmarkinvert.caption msgid "&Invert Selection" msgstr "&Odwróć wybór" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "Zaznacz &wszystko" #: tfrmmain.actmarkminus.caption msgid "Unselect a Gro&up..." msgstr "U&suń zaznaczenie grupy..." #: tfrmmain.actmarkplus.caption msgid "Select a &Group..." msgstr "Zaznacz &grupę..." #: tfrmmain.actmarkunmarkall.caption msgid "&Unselect All" msgstr "&Usuń zaznaczenie" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "Minimalizuj okno" #: tfrmmain.actmultirename.caption msgid "Multi &Rename Tool" msgstr "Zmiany w&ielokrotne" #: tfrmmain.actnetworkconnect.caption msgid "Network &Connect..." msgstr "Połączenie sieciowe" #: tfrmmain.actnetworkdisconnect.caption msgid "Network &Disconnect" msgstr "Rozłącz sieć" #: tfrmmain.actnetworkquickconnect.caption msgid "Network &Quick Connect..." msgstr "Szybkie połączenie sieciowe..." #: tfrmmain.actnewtab.caption msgid "&New Tab" msgstr "&Nowa karta" #: tfrmmain.actnexttab.caption msgid "Switch to Nex&t Tab" msgstr "Przełącz do &kolejnej karty" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "Otwórz" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "Otwórz archiwum" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "Otwórz plik paska" #: tfrmmain.actopendirinnewtab.caption msgid "Open &Folder in a New Tab" msgstr "Otwórz katalog w &nowej karcie" #: tfrmmain.actopenvirtualfilesystemlist.caption msgid "Open &VFS List" msgstr "Otwórz listę VFS" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "Podgląd &operacji" #: tfrmmain.actoptions.caption msgid "&Options..." msgstr "Opcje" #: tfrmmain.actpackfiles.caption msgid "&Pack Files..." msgstr "S&pakuj pliki" #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "Ustaw położenie elementu rozdzielającego" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "Wklej" #: tfrmmain.actprevtab.caption msgid "Switch to &Previous Tab" msgstr "Wróć do &poprzedniej karty" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "Szybki filtr" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "Szybkie wyszukiwanie" #: tfrmmain.actquickview.caption msgid "&Quick View Panel" msgstr "&Panel szybkiego podglądu" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "Odśwież" #: tfrmmain.actrename.caption #, fuzzy #| msgid "Move" msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "Przenieś" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "Przenieś/zmień nazwę bez potwierdzania" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "Zmień nazwę" #: tfrmmain.actrenametab.caption #, fuzzy #| msgid "Re&name Tab" msgid "&Rename Tab" msgstr "Zmień &nazwę karty" #: tfrmmain.actrestoreselection.caption msgid "&Restore Selection" msgstr "&Przywróć wybór" #: tfrmmain.actreverseorder.caption msgid "Re&verse Order" msgstr "&Odwrotna kolejność" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "Prawy &= lewy" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "Otwórz listę dysków z prawej" #: tfrmmain.actrunterm.caption msgid "Run &Terminal" msgstr "Otwórz &terminal" #: tfrmmain.actsaveselection.caption msgid "Sa&ve Selection" msgstr "&Zapisz wybór" #: tfrmmain.actsaveselectiontofile.caption msgid "Save S&election to File..." msgstr "Z&apisz wybór do pliku..." #: tfrmmain.actsearch.caption msgid "&Search..." msgstr "&Znajdź..." #: tfrmmain.actsetfileproperties.caption msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "Zmień &atrybuty..." #: tfrmmain.actsettaboptiondirsinnewtab.caption msgid "Locked with Directories Opened in New &Tabs" msgstr "Katalogi otwierane w &nowych kartach" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "&Normalna" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "&Zablokowana" #: tfrmmain.actsettaboptionpathresets.caption msgid "Locked with &Directory Changes Allowed" msgstr "Zablokowana, ale możliwa zmiana &katalogu" #: tfrmmain.actshellexecute.caption msgctxt "tfrmmain.actshellexecute.caption" msgid "Open" msgstr "Otwórz" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "Pokaż menu na przyciskach" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "Pokaż historie linii poleceń" #: tfrmmain.actshowmainmenu.caption #, fuzzy #| msgid "Menu" msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "Menu" #: tfrmmain.actshowsysfiles.caption msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "Pokaż pliki &ukryte/systemowe" #: tfrmmain.actsortbyattr.caption msgid "Sort by &Attributes" msgstr "Sortuj wg &atrybutów" #: tfrmmain.actsortbydate.caption msgid "Sort by &Date" msgstr "Sortuj wg &daty" #: tfrmmain.actsortbyext.caption msgid "Sort by &Extension" msgstr "Sortuj wg rozszerzenia" #: tfrmmain.actsortbyname.caption msgid "Sort by &Name" msgstr "Sortuj wg &nazwy" #: tfrmmain.actsortbysize.caption msgid "Sort by &Size" msgstr "Sortuj wg &wielkości" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "Włącz/wyłącz plik ignorowania plików, aby nie pokazywać nazw plików" #: tfrmmain.actsymlink.caption msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "Utwórz link &symboliczny..." #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "Wyrównaj zawartości okien" #: tfrmmain.acttestarchive.caption msgid "&Test Archive(s)" msgstr "Testuj ar&chiwum" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "Otwórz ten katalog w lewym oknie" #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "Otwórz ten katalog w prawym oknie" #: tfrmmain.actunmarkcurrentextension.caption msgid "Unselect All with the Same Ex&tension" msgstr "Usuń s&elekcję według rozszerzenia" #: tfrmmain.actview.caption #, fuzzy #| msgid "View" msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "Podgląd" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "Pokaż historię odwiedzanych ścieżek dla aktywnego widoku" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "Przejdź do następnego wpisu w historii" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "Przejdź do poprzedniego wpisu w historii" #: tfrmmain.actvisithomepage.caption msgid "&Visit Double Commander Website" msgstr "&Odwiedź stronę Double Commander" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "Wyczyść" #: tfrmmain.btnf10.caption #, fuzzy #| msgid "Exit" msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "Wyjście" #: tfrmmain.btnf8.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMMAIN.BTNF8.CAPTION" msgid "Delete" msgstr "Usuń" #: tfrmmain.btnf9.caption #, fuzzy #| msgid "Terminal" msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "Terminal" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint msgid "Directory hotlist" msgstr "Lista katalogów" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "<" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "Pokaż bieżący katalog prawego panelu w lewym panelu" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnlefthome.hint msgid "Go to home directory" msgstr "Idź do katalogu domowego" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgid "Go to root directory" msgstr "Idź do katalogu głównego" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgid "Go to parent directory" msgstr "Przejdź do katalogu nadrzędnego" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr ">" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "Pokaż bieżący katalog lewego panelu w prawym panelu" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "tfrmmain.caption" msgid "Double Commander" msgstr "Double Commander" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "Ścieżka" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "&20/80" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "&30/70" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "&40/60" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "&50/50" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "&60/40" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "&70/30" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "&80/20" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "Anuluj" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "Kopiuj" #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "Utwórz link" #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline33.caption msgctxt "tfrmmain.miline33.caption" msgid "-" msgstr "-" #: tfrmmain.miline37.caption msgctxt "TFRMMAIN.MILINE37.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "-" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "Wyczyść" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "Kopiuj" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "Ukryj" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "Zaznacz wszystko" #: tfrmmain.mimove.caption msgid "Move..." msgstr "Przenieś..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "Utwórz link symboliczny" #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "Opcje kart" #: tfrmmain.mitrayiconexit.caption msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "Koniec" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "Przywróć" #: tfrmmain.mnualloperpause.caption msgctxt "tfrmmain.mnualloperpause.caption" msgid "||" msgstr "||" #: tfrmmain.mnualloperstart.caption msgctxt "tfrmmain.mnualloperstart.caption" msgid "Start" msgstr "Start" #: tfrmmain.mnualloperstop.caption msgctxt "tfrmmain.mnualloperstop.caption" msgid "Cancel" msgstr "Anuluj" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "Polecenia" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "Konfiguracja" #: tfrmmain.mnufiles.caption msgid "&Files" msgstr "Pliki" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "Pomoc" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "Zaznacz" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "Sieć" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "Wyświetlanie" #: tfrmmain.mnutaboptions.caption msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "&Opcje" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "Karty" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "CD" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "Kopiuj" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "Wytnij" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "Usuń" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "Edytuj" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "Wstaw" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmmaskinputdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmmaskinputdlg.btndefinetemplate.caption #, fuzzy #| msgid "Define..." msgid "&Define..." msgstr "Definiuj..." #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmmaskinputdlg.lblsearchtemplate.caption #, fuzzy #| msgid "Or select predefined selection type:" msgid "O&r select predefined selection type:" msgstr "Lub wybierz predefiniowany rodzaj zaznaczenia:" #: tfrmmkdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmmkdir.caption msgid "Create new directory" msgstr "Utwórz nowy katalog" #: tfrmmkdir.lblmakedir.caption #, fuzzy #| msgid "Input new directory name:" msgid "&Input new directory name:" msgstr "Podaj nazwę katalogu:" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "Pr" #: tfrmmodview.caption msgctxt "TFRMMODVIEW.CAPTION" msgid "New Size" msgstr "Nowy rozmiar" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "Wysokość:" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgctxt "tfrmmodview.lblpath2.caption" msgid "2" msgstr "2" #: tfrmmodview.lblpath3.caption msgctxt "tfrmmodview.lblpath3.caption" msgid "3" msgstr "3" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "4" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "5" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "Jakośc kompresji do Jpg" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "Szerokość:" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "BMP" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "ICO" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "JPG" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "PNG" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "PNM" #: tfrmmodview.teheight.text msgid "Height" msgstr "Wysokość" #: tfrmmodview.tequality.text msgid "80" msgstr "80" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "Cyfry" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Zamknij" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "Usuń" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "Wczytaj" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "Zmień nazwę" #: tfrmmultirename.btnrestore.caption #, fuzzy #| msgid "Reset all" msgid "Reset &all" msgstr "Porzuć wszystko" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "Zapisz" #: tfrmmultirename.caption msgctxt "tfrmmultirename.caption" msgid "MultiRename" msgstr "Wielokrotna zmiana nazwy" #: tfrmmultirename.cblog.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "Włącz" #: tfrmmultirename.cbregexp.caption msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "Wyrażenie regularne" #: tfrmmultirename.cbusesubs.caption msgid "&Use substitution" msgstr "Podmiana" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption msgid "[E] Extension" msgstr "[E] Rozszerzenie" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "Licznik" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "Znajdź i zamień" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "Rezultat" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "Maska" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "Wzorce" #: tfrmmultirename.lbext.caption msgid "&Extension" msgstr "Rozszerzenie" #: tfrmmultirename.lbfind.caption msgid "&Find..." msgstr "Znajdź" #: tfrmmultirename.lbinterval.caption #, fuzzy #| msgid "Interval" msgid "&Interval" msgstr "Przerwa" #: tfrmmultirename.lbname.caption msgid "File &Name" msgstr "Nazwa pliku" #: tfrmmultirename.lbreplace.caption msgid "Re&place..." msgstr "Zamień..." #: tfrmmultirename.lbstnb.caption #, fuzzy #| msgid "Start Number" msgid "S&tart Number" msgstr "Start" #: tfrmmultirename.lbwidth.caption #, fuzzy #| msgid "Width" msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "Cyfry" #: tfrmmultirename.micounter.caption msgid "[C] Counter" msgstr "[C] Licznik" #: tfrmmultirename.miday.caption msgid "[D] Day" msgstr "[D] Dzień" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "[DD] Dzień (2 cyfry)" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "[DDD] Dzień tygodnia (krótki, np. \"pon\")" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "[DDDD] Dzień tygodnia (długi, np. \"poniedziałek\")" #: tfrmmultirename.miextensionx.caption msgid "[Ex] Character at position x" msgstr "[Ex] Znak na pozycji x" #: tfrmmultirename.miextensionxx.caption msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:y] Znaki na pozycjach od x do y" #: tfrmmultirename.mihour.caption msgid "[h] Hour" msgstr "[h] Godzina" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "[hh] Godzina (2 cyfry)" #: tfrmmultirename.miminute.caption msgid "[n] Minute" msgstr "[n] Minuta" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "[nn] Minuty (2 cyfry)" #: tfrmmultirename.mimonth.caption msgid "[M] Month" msgstr "[М] Miesiąc" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "[MM] Miesiąc (2 cyfry)" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "[MMM] Nazwa miesiąca (krótka, np. \"sty\")" #: tfrmmultirename.mimonth3.caption #| msgid "[MMMM] Month name (long, e.g. \"january\")" msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "[MMMM] Nazwa miesiąca (długa, np. \"styczeń\")" #: tfrmmultirename.miname.caption msgid "[N] Name" msgstr "[N] Nazwa" #: tfrmmultirename.minamex.caption msgid "[Nx] Character at position x" msgstr "[Nx] Znak na pozycji x" #: tfrmmultirename.minamexx.caption msgid "[Nx:y] Characters from position x to y" msgstr "[Nx:x] Znaki na pozycjach od x do y" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "Czas..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "Rozszerzenie..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "Nazwa..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "Wtyczka" #: tfrmmultirename.misecond.caption msgid "[s] Second" msgstr "[s] sekunda" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "[ss] Sekundy (2 cyfry)" #: tfrmmultirename.miyear.caption msgid "[Y] Year (2 digits)" msgstr "[Y] Rok (2 cyfry)" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "[YYYY] Rok (4 cyfry)" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "tfrmmultirename.stringgrid.columns[0].title.caption" msgid "Old File Name" msgstr "Stara nazwa pliku" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "tfrmmultirename.stringgrid.columns[1].title.caption" msgid "New File Name" msgstr "Nowa nazwa pliku" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "tfrmmultirename.stringgrid.columns[2].title.caption" msgid "File Path" msgstr "Ścieżka" #: tfrmopenwith.caption msgid "Choose an application" msgstr "" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "" #: tfrmoptions.btnapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "Zastosuj" #: tfrmoptions.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmoptions.caption msgctxt "tfrmoptions.caption" msgid "Options" msgstr "Opcje" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "" #: tfrmoptionsarchivers.btnautoconfig.caption #, fuzzy #| msgid "Auto Configure" msgctxt "TFRMOPTIONSARCHIVERS.BTNAUTOCONFIG.CAPTION" msgid "A&uto Configure" msgstr "Autokonfiguracja" #: tfrmoptionsarchivers.btnmultiarcadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCADD.CAPTION" msgid "A&dd" msgstr "Dodaj" #: tfrmoptionsarchivers.btnmultiarcapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCAPPLY.CAPTION" msgid "A&pply" msgstr "Zastosuj" #: tfrmoptionsarchivers.btnmultiarcdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCDELETE.CAPTION" msgid "D&elete" msgstr "Usuń" #: tfrmoptionsarchivers.btnmultiarcrename.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCRENAME.CAPTION" msgid "&Rename" msgstr "Zmień nazwę" #: tfrmoptionsarchivers.chkmultiarcdebug.caption #, fuzzy #| msgid "Debug mode" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCDEBUG.CAPTION" msgid "De&bug mode" msgstr "Tryb debugowania" #: tfrmoptionsarchivers.chkmultiarcenabled.caption #, fuzzy #| msgid "Enabled" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCENABLED.CAPTION" msgid "E&nabled" msgstr "Włączone" #: tfrmoptionsarchivers.chkmultiarcoutput.caption #, fuzzy #| msgid "Show console output" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCOUTPUT.CAPTION" msgid "S&how console output" msgstr "Pokaż wyjście konsoli" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "TFRMOPTIONSARCHIVERS.GBARCHIVEROPTIONS.CAPTION" msgid "Options" msgstr "Konfiguracja" #: tfrmoptionsarchivers.lblarchiveadd.caption #, fuzzy #| msgid "Add:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEADD.CAPTION" msgid "Add&ing:" msgstr "Dodaj:" #: tfrmoptionsarchivers.lblarchiveextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTENSION.CAPTION" msgid "E&xtension:" msgstr "Rozszerzenia:" #: tfrmoptionsarchivers.lblarchiveextract.caption #, fuzzy #| msgid "Extract:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTRACT.CAPTION" msgid "Ex&tract:" msgstr "Wypakuj:" #: tfrmoptionsarchivers.lblarchivelist.caption #, fuzzy #| msgid "List:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELIST.CAPTION" msgid "&List:" msgstr "Listuj:" #: tfrmoptionsarchivers.lblarchivelistend.caption #, fuzzy #| msgid "Listing finish (optional):" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTEND.CAPTION" msgid "Listing &finish (optional):" msgstr "Koniec listingu (opcjonalnie)" #: tfrmoptionsarchivers.lblarchivelistformat.caption #, fuzzy #| msgid "Listing format:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTFORMAT.CAPTION" msgid "Listing for&mat:" msgstr "Format listingu:" #: tfrmoptionsarchivers.lblarchiveliststart.caption #, fuzzy #| msgid "Listing start (optional):" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTSTART.CAPTION" msgid "Listin&g start (optional):" msgstr "Początek listingu (opcjonalnie):" #: tfrmoptionsarchivers.lblarchiver.caption #, fuzzy #| msgid "Archiver:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVER.CAPTION" msgid "Arc&hiver:" msgstr "Archiwizer:" #: tfrmoptionsarchivers.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMOPTIONSARCHIVERS.LBLDESCRIPTION.CAPTION" msgid "De&scription:" msgstr "Opis:" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERADDITIONAL.CAPTION" msgid "Additional" msgstr "Dodatkowe" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERGENERAL.CAPTION" msgid "General" msgstr "Ogólne" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHATTRIBUTESCHANGE.CAPTION" msgid "When &size, date or attributes change" msgstr "Po zmianie &wielkości, daty lub atrybutów" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHEXCLUDEDIRS.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "Dla następujących ścieżek i ich podkatalogów:" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption #, fuzzy #| msgid "When files are &created, deleted or renamed" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHFILENAMECHANGE.CAPTION" msgid "When &files are created, deleted or renamed" msgstr "Po &utworzeniu pliku, skasowaniu i zmianie nazwy" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHONLYFOREGROUND.CAPTION" msgid "When application is in the &background" msgstr "Gdy program działa w &tle" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHDISABLE.CAPTION" msgid "Disable auto-refresh" msgstr "Wyłącz autoodświeżanie" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHENABLE.CAPTION" msgid "Refresh file list" msgstr "Odśwież listę plików" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption #, fuzzy #| msgid "Always show tray icon" msgctxt "TFRMOPTIONSBEHAVIOR.CBALWAYSSHOWTRAYICON.CAPTION" msgid "Al&ways show tray icon" msgstr "Ikona zawsze widoczna na pasku" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption msgid "Automatically &hide unmounted devices" msgstr "" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBMINIMIZETOTRAY.CAPTION" msgid "Mo&ve icon to system tray when minimized" msgstr "Pokazuj ikonę na pasku gdy zminimalizowany" #: tfrmoptionsbehavior.cbonlyonce.caption #, fuzzy #| msgid "Allow only one copy of DC at a time" msgctxt "TFRMOPTIONSBEHAVIOR.CBONLYONCE.CAPTION" msgid "A&llow only one copy of DC at a time" msgstr "Zezwalaj na tylko jedną kopię DC" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "Tu można wpisać jeden lub więcej dysków oddzielonych średnikiem \";\"." #: tfrmoptionsbehavior.lbldrivesblacklist.caption #, fuzzy #| msgid "Drives blacklist" msgid "Drives &blacklist" msgstr "Czarna lista napędów" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption #, fuzzy #| msgid "Cut text to column width" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBCUTTEXTTOCOLWIDTH.CAPTION" msgid "Cut &text to column width" msgstr "Obetnij tekst do szerokości kolumny" #: tfrmoptionscolumnsview.cbgridhorzline.caption #, fuzzy #| msgid "Horizontal lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDHORZLINE.CAPTION" msgid "&Horizontal lines" msgstr "Linie poziome" #: tfrmoptionscolumnsview.cbgridvertline.caption #, fuzzy #| msgid "Vertical lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDVERTLINE.CAPTION" msgid "&Vertical lines" msgstr "Linie pionowe" #: tfrmoptionscolumnsview.chkautofillcolumns.caption #, fuzzy #| msgid "Auto fill columns" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CHKAUTOFILLCOLUMNS.CAPTION" msgid "A&uto fill columns" msgstr "Automatycznie wypełniaj kolumny" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "Pokaż siatkę" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "Autorozmiar kolumn" #: tfrmoptionscolumnsview.lblautosizecolumn.caption #, fuzzy #| msgid "Auto size column:" msgctxt "TFRMOPTIONSCOLUMNSVIEW.LBLAUTOSIZECOLUMN.CAPTION" msgid "Auto si&ze column:" msgstr "Autorozmiar kolumn:" #: tfrmoptionsconfiguration.btnconfigapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGAPPLY.CAPTION" msgid "A&pply" msgstr "Zastosuj" #: tfrmoptionsconfiguration.btnconfigedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGEDIT.CAPTION" msgid "&Edit" msgstr "Edytuj" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption #, fuzzy #| msgid "Command line history" msgctxt "TFRMOPTIONSCONFIGURATION.CBCMDLINEHISTORY.CAPTION" msgid "Co&mmand line history" msgstr "Historia linii komend" #: tfrmoptionsconfiguration.cbdirhistory.caption #, fuzzy #| msgid "Directory history" msgctxt "TFRMOPTIONSCONFIGURATION.CBDIRHISTORY.CAPTION" msgid "&Directory history" msgstr "Historia katalogów" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption #, fuzzy #| msgid "File mask history" msgctxt "TFRMOPTIONSCONFIGURATION.CBFILEMASKHISTORY.CAPTION" msgid "&File mask history" msgstr "Historia wzorców" #: tfrmoptionsconfiguration.chksaveconfiguration.caption #, fuzzy #| msgid "Save configuration" msgctxt "TFRMOPTIONSCONFIGURATION.CHKSAVECONFIGURATION.CAPTION" msgid "Sa&ve configuration" msgstr "Zapisz konfigurację" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption #, fuzzy #| msgid "Search/Replace history" msgctxt "TFRMOPTIONSCONFIGURATION.CHKSEARCHREPLACEHISTORY.CAPTION" msgid "Searc&h/Replace history" msgstr "Historia znajdź/zamień" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBLOCCONFIGFILES.CAPTION" msgid "Location of configuration files" msgstr "Położenie plików konfiguracji" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBSAVEONEXIT.CAPTION" msgid "Save on exit" msgstr "Wychodząc zapisz" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgctxt "TFRMOPTIONSCONFIGURATION.LBLCMDLINECONFIGDIR.CAPTION" msgid "Set on command line" msgstr "Ustaw w linii komend" #: tfrmoptionsconfiguration.rbprogramdir.caption #, fuzzy #| msgid "Program directory (portable version)" msgctxt "TFRMOPTIONSCONFIGURATION.RBPROGRAMDIR.CAPTION" msgid "P&rogram directory (portable version)" msgstr "Katalog programu" #: tfrmoptionsconfiguration.rbuserhomedir.caption #, fuzzy #| msgid "User home directory" msgctxt "TFRMOPTIONSCONFIGURATION.RBUSERHOMEDIR.CAPTION" msgid "&User home directory" msgstr "Katalog domowy użytkownika" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption #, fuzzy #| msgid "Copy" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNCOPYCOLUMNSSET.CAPTION" msgid "C&opy" msgstr "Kopiuj" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNDELCOLUMNSSET.CAPTION" msgid "&Delete" msgstr "Usuń" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNEDITCOLUMNSSET.CAPTION" msgid "&Edit" msgstr "Edytuj" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNNEWCOLUMNSSET.CAPTION" msgid "&New" msgstr "&Nowy" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.CBBFILESYSTEM.TEXT" msgid "General" msgstr "Ogólne" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption #, fuzzy #| msgid "Configure columns for file system:" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.LBLCONFIGCOLUMNS.CAPTION" msgid "Con&figure columns for file system:" msgstr "Konfiguracja kolumn dla systemu plików:" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption #, fuzzy #| msgid "Show confirmation dialog after drop" msgid "&Show confirmation dialog after drop" msgstr "Pokaż okno dialogowe po upuszczeniu" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption #, fuzzy #| msgid "Show file system" msgid "Show &file system" msgstr "Pokaż system plików" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption #, fuzzy #| msgid "Show free space" msgid "Show fr&ee space" msgstr "Pokaż wolne miejsce" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption #, fuzzy #| msgid "Show label" msgid "Show &label" msgstr "Pokaż nazwę" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "Lista urządzeń" #: tfrmoptionseditorcolors.backgroundlabel.caption #, fuzzy #| msgid "Background" msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "Tło" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption #, fuzzy #| msgid "Background" msgctxt "tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption" msgid "Bac&kground" msgstr "Tło" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "Atrybuty jednostki" #: tfrmoptionseditorcolors.foregroundlabel.caption #, fuzzy #| msgid "Foreground" msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "Kolor" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption #, fuzzy #| msgid "Foreground" msgctxt "tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption" msgid "Fo®round" msgstr "Kolor" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption #, fuzzy #| msgid "Text-mark" msgid "&Text-mark" msgstr "Zaznaczony tekst" #: tfrmoptionseditorcolors.tbtnglobal.caption #, fuzzy #| msgid "Use (and edit) global scheme settings" msgid "Use (and edit) &global scheme settings" msgstr "Używaj (i edytuj) globalny schemat kolorów" #: tfrmoptionseditorcolors.tbtnlocal.caption #, fuzzy #| msgid "Use local scheme settings" msgid "Use &local scheme settings" msgstr "Używaj własny schemat kolorów" #: tfrmoptionseditorcolors.textboldcheckbox.caption msgid "&Bold" msgstr "" #: tfrmoptionseditorcolors.textboldradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textboldradioinvert.caption" msgid "In&vert" msgstr "Odwróć" #: tfrmoptionseditorcolors.textboldradiooff.caption #, fuzzy #| msgid "Off" msgctxt "tfrmoptionseditorcolors.textboldradiooff.caption" msgid "O&ff" msgstr "Wyłączony" #: tfrmoptionseditorcolors.textboldradioon.caption #, fuzzy #| msgid "On" msgctxt "tfrmoptionseditorcolors.textboldradioon.caption" msgid "O&n" msgstr "Włączony" #: tfrmoptionseditorcolors.textitaliccheckbox.caption #, fuzzy #| msgid "Italic" msgid "&Italic" msgstr "Kursywa" #: tfrmoptionseditorcolors.textitalicradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textitalicradioinvert.caption" msgid "In&vert" msgstr "Odwróć" #: tfrmoptionseditorcolors.textitalicradiooff.caption #, fuzzy #| msgid "Off" msgctxt "tfrmoptionseditorcolors.textitalicradiooff.caption" msgid "O&ff" msgstr "Wyłączony" #: tfrmoptionseditorcolors.textitalicradioon.caption #, fuzzy #| msgid "On" msgctxt "tfrmoptionseditorcolors.textitalicradioon.caption" msgid "O&n" msgstr "Włączony" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption #, fuzzy #| msgid "Strike Out" msgid "&Strike Out" msgstr "Przekreślony" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textstrikeoutradioinvert.caption" msgid "In&vert" msgstr "Odwróć" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption #, fuzzy #| msgid "Off" msgctxt "tfrmoptionseditorcolors.textstrikeoutradiooff.caption" msgid "O&ff" msgstr "Wyłączony" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption #, fuzzy #| msgid "On" msgctxt "tfrmoptionseditorcolors.textstrikeoutradioon.caption" msgid "O&n" msgstr "Włączony" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption #, fuzzy #| msgid "Underline" msgid "&Underline" msgstr "Podkreślony" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "Odwróć" #: tfrmoptionseditorcolors.textunderlineradiooff.caption #, fuzzy #| msgid "Off" msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "Wyłączony" #: tfrmoptionseditorcolors.textunderlineradioon.caption #, fuzzy #| msgid "On" msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "Włączony" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "" #: tfrmoptionsfileoperations.cbdeletetotrash.caption #, fuzzy #| msgid "Delete to recycle bin (Shift key reverses this setting)" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDELETETOTRASH.CAPTION" msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "Usuń do kosza (z Shiftem - usuwa bezpowrotnie)" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDROPREADONLYFLAG.CAPTION" msgid "D&rop readonly flag" msgstr "Zdejmij flagę \"Tylko do odczytu\"" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPARTIALNAMESEARCH.CAPTION" msgid "&Search for part of file name" msgstr "Szukaj części nazwy pliku" #: tfrmoptionsfileoperations.cbprocesscomments.caption #, fuzzy #| msgid "Process comments with files/folders" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPROCESSCOMMENTS.CAPTION" msgid "&Process comments with files/folders" msgstr "Komentarze do plików/katalogów" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption #, fuzzy #| msgid "Select file name without extension when renaming" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBRENAMESELONLYNAME.CAPTION" msgid "Select &file name without extension when renaming" msgstr "Przy zmianie nazwy edytuj tylko nazwę (bez rozszerzenia)" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption #, fuzzy #| msgid "Show tab select panel in copy/move dialog" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSHOWCOPYTABSELECTPANEL.CAPTION" msgid "Sho&w tab select panel in copy/move dialog" msgstr "Pokaż pasek postępu podczas kopiowania/przenoszenia" #: tfrmoptionsfileoperations.cbskipfileoperror.caption #, fuzzy #| msgid "Skip file operations errors and write them to log window" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSKIPFILEOPERROR.CAPTION" msgid "S&kip file operations errors and write them to log window" msgstr "Komunikaty o błędach przy operacjach na plikach pokazuj tylko w oknie logów" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.GBFILESEARCH.CAPTION" msgid "File search" msgstr "Szukanie plików" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "" #: tfrmoptionsfileoperations.lblbuffersize.caption msgid "&Buffer size for file operations (in KB):" msgstr "" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "" #: tfrmoptionsfileoperations.lblprogresskind.caption msgid "Show operations progress &initially in" msgstr "" #: tfrmoptionsfileoperations.lblwipepassnumber.caption #, fuzzy #| msgid "Number of wipe passes:" msgctxt "TFRMOPTIONSFILEOPERATIONS.LBLWIPEPASSNUMBER.CAPTION" msgid "&Number of wipe passes:" msgstr "Liczba przebiegów zacierania:" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption #, fuzzy #| msgid "Use memory mapping for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSEMMAPINSEARCH.CAPTION" msgid "Use memory mapping for search te&xt in files" msgstr "Przy poszukiwaniu ciągu znaków korzystaj z mapowania pamięci" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption #, fuzzy #| msgid "Use stream for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSESTREAMINSEARCH.CAPTION" msgid "&Use stream for search text in files" msgstr "Przy poszukiwaniu ciągu znaków korzystaj z funkcji potokowej (stream)" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption #, fuzzy #| msgid "Use Frame Cursor" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEFRAMECURSOR.CAPTION" msgid "Use &Frame Cursor" msgstr "Używaj kursora jako ramki" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption #, fuzzy #| msgid "Use Gradient Indicator" msgid "Use &Gradient Indicator" msgstr "Używaj zmiany kolorów jako wskaźnika" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption #, fuzzy #| msgid "Use Inverted Selection" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEINVERTEDSELECTION.CAPTION" msgid "U&se Inverted Selection" msgstr "Używaj odwrotnej selekcji" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.DBFREESPACEINDICATOR.CAPTION" msgid "Drive Free Space Indicator" msgstr "Wskaźnik wolnego miejsca na dysku" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.GBEXAMPLE.CAPTION" msgid "Example" msgstr "Przykład" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption #, fuzzy #| msgid "Background:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR.CAPTION" msgid "Bac&kground:" msgstr "Tło:" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption #, fuzzy #| msgid "Background 2:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR2.CAPTION" msgid "Backg&round 2:" msgstr "Tło 2:" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption #, fuzzy #| msgid "Cursor Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORCOLOR.CAPTION" msgid "C&ursor Color:" msgstr "Kolor kursora:" #: tfrmoptionsfilepanelscolors.lblcursortext.caption #, fuzzy #| msgid "Cursor Text:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORTEXT.CAPTION" msgid "Cursor Te&xt:" msgstr "Tekst pod kursorem:" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption #, fuzzy #| msgid "Brightness level of inactive panel" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLINACTIVEPANELBRIGHTNESS.CAPTION" msgid "&Brightness level of inactive panel" msgstr "Przyciemnienie nieaktywnego panelu" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption #, fuzzy #| msgid "Indicator Back Color:" msgid "In&dicator Back Color:" msgstr "Kolor tła wskaźnika:" #: tfrmoptionsfilepanelscolors.lblindcolor.caption #, fuzzy #| msgid "Indicator Fore Color:" msgid "&Indicator Fore Color:" msgstr "Kolor wskaźnika:" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption #, fuzzy #| msgid "Mark Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLMARKCOLOR.CAPTION" msgid "&Mark Color:" msgstr "Kolor zaznaczania:" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption #, fuzzy #| msgid "Text Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLTEXTCOLOR.CAPTION" msgid "T&ext Color:" msgstr "Kolor tekstu:" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption #, fuzzy #| msgid "Don't load file list until a tab is activated" msgid "Do&n't load file list until a tab is activated" msgstr "Nie ładuj listy plików aż zakładka zostanie wybrana" #: tfrmoptionsfilesviews.cbdirbrackets.caption #, fuzzy #| msgid "Show square brackets around directories" msgctxt "TFRMOPTIONSFILESVIEWS.CBDIRBRACKETS.CAPTION" msgid "S&how square brackets around directories" msgstr "Pokazuj nazwy katalogów w nawiasach kwadratowych" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption msgid "Hi&ghlight new and updated files" msgstr "" #: tfrmoptionsfilesviews.cblistfilesinthread.caption #, fuzzy #| msgid "Load file list in separate thread" msgctxt "TFRMOPTIONSFILESVIEWS.CBLISTFILESINTHREAD.CAPTION" msgid "Load &file list in separate thread" msgstr "Wczytuj listę plików w oddzielnym wątku" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption #, fuzzy #| msgid "Load icons after file list" msgctxt "TFRMOPTIONSFILESVIEWS.CBLOADICONSSEPARATELY.CAPTION" msgid "Load icons af&ter file list" msgstr "Wczytuj najpierw listę plików, potem ikony" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption #, fuzzy #| msgid "Show system and hidden files" msgctxt "TFRMOPTIONSFILESVIEWS.CBSHOWSYSTEMFILES.CAPTION" msgid "Show s&ystem and hidden files" msgstr "Pokaż pliki ukryte/systemowe" #: tfrmoptionsfilesviews.cbspacemovesdown.caption #, fuzzy #| msgid "When selecting files with , move down to next file (as with )" msgctxt "TFRMOPTIONSFILESVIEWS.CBSPACEMOVESDOWN.CAPTION" msgid "&When selecting files with , move down to next file (as with )" msgstr "Klawisz przenosi do następnego pliku (tak jak )" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "Formatowanie" #: tfrmoptionsfilesviews.gbsorting.caption msgctxt "TFRMOPTIONSFILESVIEWS.GBSORTING.CAPTION" msgid "Sorting" msgstr "Sortowanie" #: tfrmoptionsfilesviews.lblcasesensitivity.caption #, fuzzy #| msgid "Case sensitivity:" msgid "Case s&ensitivity:" msgstr "Pisownia wielkich liter:" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeformat.caption #, fuzzy #| msgid "Date and time format:" msgctxt "TFRMOPTIONSFILESVIEWS.LBLDATETIMEFORMAT.CAPTION" msgid "&Date and time format:" msgstr "Format daty i czasu:" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "" #: tfrmoptionsfilesviews.lblnewfilesposition.caption msgid "&Insert new files" msgstr "" #: tfrmoptionsfilesviews.lblsortfoldermode.caption #, fuzzy #| msgid "Sorting directories:" msgid "So&rting directories:" msgstr "Sortowanie katalogów:" #: tfrmoptionsfilesviews.lblsortmethod.caption #, fuzzy #| msgid "Sort &method:" msgctxt "TFRMOPTIONSFILESVIEWS.LBLSORTMETHOD.CAPTION" msgid "&Sort method:" msgstr "&Metoda sortowania:" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption msgid "&Move updated files" msgstr "" #: tfrmoptionsfiletypescolors.btnaddcategory.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNADDCATEGORY.CAPTION" msgid "A&dd" msgstr "Dodaj" #: tfrmoptionsfiletypescolors.btnapplycategory.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNAPPLYCATEGORY.CAPTION" msgid "A&pply" msgstr "Zastosuj" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNCATEGORYCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNDELETECATEGORY.CAPTION" msgid "D&elete" msgstr "Usuń" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Szablon..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption #| msgid "File types colors" msgctxt "TFRMOPTIONSFILETYPESCOLORS.GBFILETYPESCOLORS.CAPTION" msgid "File types colors (sort by drag&&drop)" msgstr "Kolor typu plików (sortuj przez \"przeciągnij i upuść\")" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption #, fuzzy #| msgid "Category attributes:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYATTR.CAPTION" msgid "Category a&ttributes:" msgstr "Atrybuty kategorii:" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption #, fuzzy #| msgid "Category color:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYCOLOR.CAPTION" msgid "Category co&lor:" msgstr "Kolor kategorii:" #: tfrmoptionsfiletypescolors.lblcategorymask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYMASK.CAPTION" msgid "Category &mask:" msgstr "Maska kategorii:" #: tfrmoptionsfiletypescolors.lblcategoryname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYNAME.CAPTION" msgid "Category &name:" msgstr "Nazwa kategorii:" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELEDITFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELLOGFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELMAINFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWERBOOKFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.lbleditorfont.caption #, fuzzy #| msgid "Editor font" msgctxt "TFRMOPTIONSFONTS.LBLEDITORFONT.CAPTION" msgid "&Editor font" msgstr "Czcionka edytora" #: tfrmoptionsfonts.lbllogfont.caption #, fuzzy #| msgid "Log font" msgctxt "TFRMOPTIONSFONTS.LBLLOGFONT.CAPTION" msgid "&Log font" msgstr "Czcionka logów" #: tfrmoptionsfonts.lblmainfont.caption #, fuzzy #| msgid "Main font" msgctxt "TFRMOPTIONSFONTS.LBLMAINFONT.CAPTION" msgid "Main &font" msgstr "Czcionka podstawowa" #: tfrmoptionsfonts.lblviewerbookfont.caption #, fuzzy #| msgid "Viewer Book Font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERBOOKFONT.CAPTION" msgid "Viewer&Book Font" msgstr "Czcionka przeglądarki książek" #: tfrmoptionsfonts.lblviewerfont.caption #, fuzzy #| msgid "Viewer font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERFONT.CAPTION" msgid "&Viewer font" msgstr "Czcionka podglądu" #: tfrmoptionshotkeys.btnaddhotkey.caption msgid "Add &hotkey" msgstr "" #: tfrmoptionshotkeys.btndeletehotkey.caption msgid "&Delete hotkey" msgstr "" #: tfrmoptionshotkeys.btnedithotkey.caption msgctxt "tfrmoptionshotkeys.btnedithotkey.caption" msgid "&Edit hotkey" msgstr "" #: tfrmoptionshotkeys.lbfilter.caption #, fuzzy #| msgid "Filter" msgctxt "TFRMOPTIONSHOTKEYS.LBFILTER.CAPTION" msgid "&Filter" msgstr "Filtr" #: tfrmoptionshotkeys.lblcategories.caption #, fuzzy #| msgid "Categories:" msgctxt "tfrmoptionshotkeys.lblcategories.caption" msgid "C&ategories:" msgstr "Kategorie:" #: tfrmoptionshotkeys.lblcommands.caption #, fuzzy #| msgid "Commands:" msgctxt "tfrmoptionshotkeys.lblcommands.caption" msgid "Co&mmands:" msgstr "Polecenia:" #: tfrmoptionshotkeys.lblscfiles.caption #, fuzzy #| msgid "Shortcut files:" msgctxt "TFRMOPTIONSHOTKEYS.LBLSCFILES.CAPTION" msgid "&Shortcut files:" msgstr "Pliki skrótów:" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[0].TITLE.CAPTION" msgid "Hotkey" msgstr "Skrót" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[1].TITLE.CAPTION" msgid "Parameters" msgstr "Parametry" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[2].TITLE.CAPTION" msgid "Controls" msgstr "Kontrolki" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "Dla następujących ścieżek i ich podkatalogów:" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "tfrmoptionsicons.cbiconsinmenussize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption #, fuzzy #| msgid "Show overlay i&cons, e.g. for links" msgctxt "TFRMOPTIONSICONS.CBICONSSHOWOVERLAY.CAPTION" msgid "Show o&verlay icons, e.g. for links" msgstr "Pokazuj ikony nakładkowo (np dla linków symbolicznych)" #: tfrmoptionsicons.cbiconssize.text msgctxt "TFRMOPTIONSICONS.CBICONSSIZE.TEXT" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "" #: tfrmoptionsicons.gbiconssize.caption #, fuzzy #| msgid " Icon &size " msgctxt "TFRMOPTIONSICONS.GBICONSSIZE.CAPTION" msgid " Icon size " msgstr " Rozmiar ikon" #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "TFRMOPTIONSICONS.GBSHOWICONSMODE.CAPTION" msgid " Show icons to the left of the filename " msgstr " Pokazuj ikony po lewej stronie nazwy pliku" #: tfrmoptionsicons.rbiconsshowall.caption #, fuzzy #| msgid "&All" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALL.CAPTION" msgid "A&ll" msgstr "&Wszystko" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALLANDEXE.CAPTION" msgid "All associated + &EXE/LNK (slow)" msgstr "Wszystkie skojarzone + &EXE/LNK (wolne)" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWNONE.CAPTION" msgid "&No icons" msgstr "Bez ikon" #: tfrmoptionsicons.rbiconsshowstandard.caption #, fuzzy #| msgid "&Only standard icons" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWSTANDARD.CAPTION" msgid "Only &standard icons" msgstr "Tylko standardowe ikony" #: tfrmoptionsignorelist.btnaddsel.caption #, fuzzy #| msgid "&Add selected names" msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSEL.CAPTION" msgid "A&dd selected names" msgstr "Dodaj wybrane nazwy" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSELWITHPATH.CAPTION" msgid "Add selected names with &full path" msgstr "Dodaj wybrane nazwy z pełną ścieżką" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "TFRMOPTIONSIGNORELIST.CHKIGNOREENABLE.CAPTION" msgid "&Ignore (don't show) the following files and folders:" msgstr "&Ignoruj (nie pokazuj) następujących plików i katalogów:" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "TFRMOPTIONSIGNORELIST.LBLSAVEIN.CAPTION" msgid "&Save in:" msgstr "&Zapisz w:" #: tfrmoptionskeyboard.cblynxlike.caption #, fuzzy #| msgid "Left, Right arrows change directory (Lynx-like movement)" msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "Strzałki w prawo, lewo zmieniają katalog (nawigacja w stylu Lynksa)" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "Pisanie" #: tfrmoptionskeyboard.lblalt.caption #, fuzzy #| msgid "Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLALT.CAPTION" msgid "Alt+L&etters" msgstr "Alt+Litery" #: tfrmoptionskeyboard.lblctrlalt.caption #, fuzzy #| msgid "Ctrl+Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLCTRLALT.CAPTION" msgid "Ctrl+Alt+Le&tters" msgstr "Ctrl+Alt+Litery" #: tfrmoptionskeyboard.lblnomodifier.caption #, fuzzy #| msgid "Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLNOMODIFIER.CAPTION" msgid "&Letters" msgstr "Litery" #: tfrmoptionslayout.cbflatdiskpanel.caption #, fuzzy #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATDISKPANEL.CAPTION" msgid "&Flat buttons" msgstr "Płaskie przyciski" #: tfrmoptionslayout.cbflatinterface.caption #, fuzzy #| msgid "Flat interface" msgctxt "TFRMOPTIONSLAYOUT.CBFLATINTERFACE.CAPTION" msgid "Flat i&nterface" msgstr "Płaski wygląd" #: tfrmoptionslayout.cbflattoolbar.caption #, fuzzy #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATTOOLBAR.CAPTION" msgid "Flat b&uttons" msgstr "Płaskie przyciski" #: tfrmoptionslayout.cbfreespaceind.caption #, fuzzy #| msgid "Show free space indicator on drive label" msgctxt "TFRMOPTIONSLAYOUT.CBFREESPACEIND.CAPTION" msgid "Show fr&ee space indicator on drive label" msgstr "Pokaż pasek wolnego miejsca przy etykiecie napędu" #: tfrmoptionslayout.cblogwindow.caption #, fuzzy #| msgid "Show log window" msgctxt "TFRMOPTIONSLAYOUT.CBLOGWINDOW.CAPTION" msgid "Show lo&g window" msgstr "Pokaż okno logów" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "TFRMOPTIONSLAYOUT.CBPANELOFOPERATIONS.CAPTION" msgid "Show panel of operation in background" msgstr "Pokaż panel operacji w tle" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "TFRMOPTIONSLAYOUT.CBPROGINMENUBAR.CAPTION" msgid "Show common progress in menu bar" msgstr "Pokazuj postęp ogólny na pasku menu" #: tfrmoptionslayout.cbshowcmdline.caption #, fuzzy #| msgid "Show command &line" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCMDLINE.CAPTION" msgid "Show command l&ine" msgstr "Pokaż &linie poleceń" #: tfrmoptionslayout.cbshowcurdir.caption #, fuzzy #| msgid "Show ¤t directory" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCURDIR.CAPTION" msgid "Show current director&y" msgstr "Pokaż nazwę &bieżącego katalogu" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDISKPANEL.CAPTION" msgid "Show &drive buttons" msgstr "Pokaż przyciski &dysków" #: tfrmoptionslayout.cbshowdrivefreespace.caption #, fuzzy #| msgid "Show free space label" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDRIVEFREESPACE.CAPTION" msgid "Show free s&pace label" msgstr "Pokaż wolne miejsce na dysku" #: tfrmoptionslayout.cbshowdriveslistbutton.caption #, fuzzy #| msgid "Show d&rives list button" msgid "Show drives list bu&tton" msgstr "Pokaż p&rzycisk listy dysków" #: tfrmoptionslayout.cbshowkeyspanel.caption #, fuzzy #| msgid "Show &function key buttons" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWKEYSPANEL.CAPTION" msgid "Show function &key buttons" msgstr "Pokaż przyciski klawiszy &funkcyjnych" #: tfrmoptionslayout.cbshowmainmenu.caption #, fuzzy #| msgid "Show main menu" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINMENU.CAPTION" msgid "Show &main menu" msgstr "Pokaż główne menu" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINTOOLBAR.CAPTION" msgid "Show &button bar" msgstr "Pokaż pasek &przycisków" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption #, fuzzy #| msgid "Show short free space label" msgid "Show short free space &label" msgstr "Pokaż mały opis wolnego miejsca" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWSTATUSBAR.CAPTION" msgid "Show &status bar" msgstr "Pokaż pasek &stanu" #: tfrmoptionslayout.cbshowtabheader.caption #, fuzzy #| msgid "Show &tabstop header" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABHEADER.CAPTION" msgid "S&how tabstop header" msgstr "Pokaż nagłówki &kolumn" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABS.CAPTION" msgid "Sho&w folder tabs" msgstr "Pokaż &karty katalogów" #: tfrmoptionslayout.cbtermwindow.caption #, fuzzy #| msgid "Show terminal window" msgctxt "TFRMOPTIONSLAYOUT.CBTERMWINDOW.CAPTION" msgid "Show te&rminal window" msgstr "Pokaż okno terminala" #: tfrmoptionslayout.cbtwodiskpanels.caption #, fuzzy #| msgid "Show two drive button bars (fixed width, above file windows)" msgctxt "TFRMOPTIONSLAYOUT.CBTWODISKPANELS.CAPTION" msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "Pokazuj dwa paski napędów (zmienna szerokość, nad oknami plików)" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "TFRMOPTIONSLAYOUT.GBSCREENLAYOUT.CAPTION" msgid " Screen layout " msgstr " Wygląd ekranu głównego" #: tfrmoptionslog.cblogarcop.caption #, fuzzy #| msgid "Pack/Unpack" msgctxt "TFRMOPTIONSLOG.CBLOGARCOP.CAPTION" msgid "&Pack/Unpack" msgstr "Pakowanie / Rozpakowanie" #: tfrmoptionslog.cblogcpmvln.caption #, fuzzy #| msgid "Copy/Move/Create link/symlink" msgctxt "TFRMOPTIONSLOG.CBLOGCPMVLN.CAPTION" msgid "Cop&y/Move/Create link/symlink" msgstr "Kopiowanie / Przenoszenie / Tworzenie dowiązań" #: tfrmoptionslog.cblogdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSLOG.CBLOGDELETE.CAPTION" msgid "&Delete" msgstr "Usuwanie" #: tfrmoptionslog.cblogdirop.caption #, fuzzy #| msgid "Create/Delete directories" msgctxt "TFRMOPTIONSLOG.CBLOGDIROP.CAPTION" msgid "Crea&te/Delete directories" msgstr "Tworzenie / Usuwanie katalogów" #: tfrmoptionslog.cblogerrors.caption msgctxt "TFRMOPTIONSLOG.CBLOGERRORS.CAPTION" msgid "Log &errors" msgstr "Błędy" #: tfrmoptionslog.cblogfile.caption #, fuzzy #| msgid "&Create a log file:" msgctxt "TFRMOPTIONSLOG.CBLOGFILE.CAPTION" msgid "C&reate a log file:" msgstr "&Utwórz plik z logami:" #: tfrmoptionslog.cbloginfo.caption #, fuzzy #| msgid "Log information messages" msgctxt "TFRMOPTIONSLOG.CBLOGINFO.CAPTION" msgid "Log &information messages" msgstr "Wyświetlanie komunikatów" #: tfrmoptionslog.cblogsuccess.caption msgctxt "TFRMOPTIONSLOG.CBLOGSUCCESS.CAPTION" msgid "Log &successful operations" msgstr "Informacje o zakończonej operacji" #: tfrmoptionslog.cblogvfs.caption #, fuzzy #| msgid "File system plugins" msgctxt "TFRMOPTIONSLOG.CBLOGVFS.CAPTION" msgid "&File system plugins" msgstr "Wtyczki systemów plików" #: tfrmoptionslog.gblogfile.caption msgctxt "TFRMOPTIONSLOG.GBLOGFILE.CAPTION" msgid "File operation log file" msgstr "Plik zapisu operacji na plikach" #: tfrmoptionslog.gblogfileop.caption msgctxt "TFRMOPTIONSLOG.GBLOGFILEOP.CAPTION" msgid "Log operations" msgstr "Zapisz operacje" #: tfrmoptionslog.gblogfilestatus.caption msgctxt "TFRMOPTIONSLOG.GBLOGFILESTATUS.CAPTION" msgid "Operation status" msgstr "Status operacji" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "" #: tfrmoptionsmisc.chkshowwarningmessages.caption #, fuzzy #| msgid "Show warning messages (\"OK\" button only)" msgctxt "tfrmoptionsmisc.chkshowwarningmessages.caption" msgid "Show &warning messages (\"OK\" button only)" msgstr "Pokaż komunikaty o błędach (z przyciskiem \"ОК\")" #: tfrmoptionsmisc.chkthumbsave.caption #, fuzzy #| msgid "Save thumbnails in cache" msgctxt "tfrmoptionsmisc.chkthumbsave.caption" msgid "&Save thumbnails in cache" msgstr "Zapisz miniatury w pamięci cache" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "tfrmoptionsmisc.dblthumbnails.caption" msgid "Thumbnails" msgstr "" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "tfrmoptionsmisc.lblthumbseparator.caption" msgid "X" msgstr "X" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "" #: tfrmoptionsmouse.cbselectionbymouse.caption #, fuzzy #| msgid "Selection by mouse" msgid "&Selection by mouse" msgstr "Zaznaczanie myszą" #: tfrmoptionsmouse.gbscrolling.caption msgid "Scrolling" msgstr "Przewijanie" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "Wybór" #: tfrmoptionsmouse.lblmousemode.caption #, fuzzy #| msgid "Mode:" msgid "&Mode:" msgstr "Tryb:" #: tfrmoptionsmouse.rbscrolllinebyline.caption #, fuzzy #| msgid "Line by line" msgid "&Line by line" msgstr "Ilość wierszy:" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption #, fuzzy #| msgid "Line by line with cursor movement" msgid "Line by line &with cursor movement" msgstr "Co jeden wiersz z przesuwaniem kursora" #: tfrmoptionsmouse.rbscrollpagebypage.caption #, fuzzy #| msgid "Page by page" msgid "&Page by page" msgstr "Całymi stronami" #: tfrmoptionsplugins.btnaddplugin.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "Dodaj" #: tfrmoptionsplugins.btnconfigplugin.caption #, fuzzy #| msgid "Configure" msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "Konfiguruj" #: tfrmoptionsplugins.btnenableplugin.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "Włącz" #: tfrmoptionsplugins.btnremoveplugin.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "Usuń" #: tfrmoptionsplugins.btntweakplugin.caption #, fuzzy #| msgid "Tweak" msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "Dostosuj" #: tfrmoptionsplugins.lbldsxdescription.caption #, fuzzy #| msgid "Search plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "Zezwalaj na szukanie wtyczek wg alternatwnych algorytmów i narzędzi zewnętrznych (np. \"locate\")" #: tfrmoptionsplugins.lblwcxdescription.caption #, fuzzy #| msgid "Packer plugins are used to work with archives." msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "Obsługa archiwów z użyciem wtyczek." #: tfrmoptionsplugins.lblwdxdescription.caption #, fuzzy #| msgid "Content plugins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "Wtyczki pozwalające wyświetlać dodatkowe informacje o plikach (np. tagi mp3, atrybuty grafiki) w panelach oraz przy szukaniu i zamianie." #: tfrmoptionsplugins.lblwfxdescription.caption #, fuzzy #| msgid "File system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "Wtyczki obsługujące niedostępne dla systemu dyski i urządzenia zewnętrzne (np. Palm/PocketPC)" #: tfrmoptionsplugins.lblwlxdescription.caption #, fuzzy #| msgid "Viewer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "Wtyczki pozwalające wyświetlić za pomocą przeglądarki (listera, komendą F3) pliki takie jak np. grafika, bazy danych akusze kalkulacyjne" #: tfrmoptionsplugins.stgplugins.columns[0].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[0].TITLE.CAPTION" msgid "Active" msgstr "Aktywne" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[1].TITLE.CAPTION" msgid "Plugin" msgstr "Wtyczka" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[2].TITLE.CAPTION" msgid "Registered for" msgstr "Zarejestrowany dla" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[3].TITLE.CAPTION" msgid "File name" msgstr "Nazwa pliku" #: tfrmoptionsplugins.tsdsx.caption #, fuzzy #| msgid "Search plugins (.DSX)" msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "Wtyczki wyszukiwania (.DSX)" #: tfrmoptionsplugins.tswcx.caption #, fuzzy #| msgid "Packer plugins (.WCX)" msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "Wtyczki pakera (.WCX)" #: tfrmoptionsplugins.tswdx.caption #, fuzzy #| msgid "Content plugins (.WDX)" msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "Wtyczki zawartości (.WDX)" #: tfrmoptionsplugins.tswfx.caption #, fuzzy #| msgid "File system plugins (.WFX)" msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "Wtyczki systemu plików (.WFX)" #: tfrmoptionsplugins.tswlx.caption #, fuzzy #| msgid "Viewer plugins (.WLX)" msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "Wtyczki przeglądarki (listera) (.WLX)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTBEGINNING.CAPTION" msgid "&Beginning (name must start with first typed character)" msgstr "Początek (nazwa musi zaczynać się wybranym znakiem)" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTENDING.CAPTION" msgid "En&ding (last character before a typed dot . must match)" msgstr "Koniec (taki musi być ostatni znak przed znakiem kropki '.')" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CGPOPTIONS.CAPTION" msgid "Options" msgstr "Opcje" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.GBEXACTNAMEMATCH.CAPTION" msgid "Exact name match" msgstr "Dokładne brzmienie nazwy" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "Wielkie/małe litery" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "Szukaj tych pozycji" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "TFRMOPTIONSTABS.CBTABSACTIVATEONCLICK.CAPTION" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "Aktywacja okna przez kliknięcie na którykolwiek z jego elementów" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "TFRMOPTIONSTABS.CBTABSALWAYSVISIBLE.CAPTION" msgid "&Show tab header also when there is only one tab" msgstr "Nagłówek karty widoczny nawet przy jednej karcie" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption #, fuzzy #| msgid "&Confirm close all tabs" msgctxt "TFRMOPTIONSTABS.CBTABSCONFIRMCLOSEALL.CAPTION" msgid "Con&firm close all tabs" msgstr "Potwierdzanie zamykania wszystkich kart" #: tfrmoptionstabs.cbtabslimitoption.caption msgctxt "TFRMOPTIONSTABS.CBTABSLIMITOPTION.CAPTION" msgid "&Limit tab title length to" msgstr "Ogranicz &długość tytułu karty do" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "TFRMOPTIONSTABS.CBTABSLOCKEDASTERISK.CAPTION" msgid "Show locked tabs &with an asterisk *" msgstr "Karty zablokowane oznacz &gwiazdką" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "TFRMOPTIONSTABS.CBTABSMULTILINES.CAPTION" msgid "&Tabs on multiple lines" msgstr "&Karty w kilku rzędach" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENFOREGROUND.CAPTION" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Ctrl+W_górę otwiera nową aktywną kartę" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENNEARCURRENT.CAPTION" msgid "Open &new tabs near current tab" msgstr "Otwieraj &nowe karty obok bieżącej" #: tfrmoptionstabs.cbtabsshowclosebutton.caption #, fuzzy #| msgid "Show tab close button" msgctxt "TFRMOPTIONSTABS.CBTABSSHOWCLOSEBUTTON.CAPTION" msgid "Show ta&b close button" msgstr "Pokaż przycisk zamykania karty" #: tfrmoptionstabs.gbtabs.caption msgctxt "TFRMOPTIONSTABS.GBTABS.CAPTION" msgid "Folder tabs headers" msgstr "Nagłówki kart" #: tfrmoptionstabs.lblchar.caption msgctxt "TFRMOPTIONSTABS.LBLCHAR.CAPTION" msgid "characters" msgstr "znaków" #: tfrmoptionstabs.lbltabsposition.caption #, fuzzy #| msgid "Tabs position" msgctxt "TFRMOPTIONSTABS.LBLTABSPOSITION.CAPTION" msgid "Ta&bs position" msgstr "Pozycja kart" #: tfrmoptionsterminal.lblruninterm.caption #, fuzzy #| msgid "Run in terminal:" msgid "Run in &terminal:" msgstr "Uruchamiaj w terminalu:" #: tfrmoptionsterminal.lblrunterm.caption #, fuzzy #| msgid "Run terminal:" msgid "Run t&erminal:" msgstr "Uruchom terminal:" #: tfrmoptionstoolbar.btnclonebutton.caption #, fuzzy #| msgid "&Clone button" msgctxt "tfrmoptionstoolbar.btnclonebutton.caption" msgid "C&lone button" msgstr "Klonuj przycisk" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "tfrmoptionstoolbar.btndeletebutton.caption" msgid "&Delete" msgstr "Usuń" #: tfrmoptionstoolbar.btnedithotkey.caption #, fuzzy #| msgid "Edit hotkey" msgctxt "tfrmoptionstoolbar.btnedithotkey.caption" msgid "Edit hot&key" msgstr "Edytuj" #: tfrmoptionstoolbar.btninsertbutton.caption #, fuzzy #| msgid "&Insert new buttonX" msgctxt "tfrmoptionstoolbar.btninsertbutton.caption" msgid "&Insert new button" msgstr "Dodaj nowy przycisk" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "tfrmoptionstoolbar.btnopenfile.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "tfrmoptionstoolbar.btnopenicon.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnremovehotkey.caption #, fuzzy #| msgid "Remove hotkey" msgctxt "tfrmoptionstoolbar.btnremovehotkey.caption" msgid "Remove hotke&y" msgstr "X" #: tfrmoptionstoolbar.cbflatbuttons.caption #, fuzzy #| msgid "Flat b&uttons" msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "Płaskie przyciski" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "" #: tfrmoptionstoolbar.gbgroupbox.caption msgctxt "tfrmoptionstoolbar.gbgroupbox.caption" msgid "Appearance" msgstr "Wygląd" #: tfrmoptionstoolbar.lblbarsize.caption #, fuzzy #| msgid "Ba&r size:" msgctxt "tfrmoptionstoolbar.lblbarsize.caption" msgid "&Bar size:" msgstr "Rozmiar paska:" #: tfrmoptionstoolbar.lblexternalcommand.caption msgctxt "tfrmoptionstoolbar.lblexternalcommand.caption" msgid "Comman&d:" msgstr "" #: tfrmoptionstoolbar.lblexternalparameters.caption msgctxt "tfrmoptionstoolbar.lblexternalparameters.caption" msgid "Parameter&s:" msgstr "" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "" #: tfrmoptionstoolbar.lbliconfile.caption #, fuzzy #| msgid "Icon:" msgctxt "tfrmoptionstoolbar.lbliconfile.caption" msgid "Ico&n:" msgstr "Plik ikony:" #: tfrmoptionstoolbar.lbliconsize.caption #, fuzzy #| msgid "Ic&on size:" msgctxt "tfrmoptionstoolbar.lbliconsize.caption" msgid "Icon si&ze:" msgstr "Rozmiar ikon:" #: tfrmoptionstoolbar.lblinternalcommand.caption msgctxt "tfrmoptionstoolbar.lblinternalcommand.caption" msgid "Co&mmand:" msgstr "" #: tfrmoptionstoolbar.lblinternalparameters.caption msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "" #: tfrmoptionstoolbar.lblstartpath.caption #, fuzzy #| msgid "Start path:" msgctxt "tfrmoptionstoolbar.lblstartpath.caption" msgid "Start pat&h:" msgstr "Katalog startowy:" #: tfrmoptionstoolbar.lbltooltip.caption #, fuzzy #| msgid "Tooltip:" msgctxt "tfrmoptionstoolbar.lbltooltip.caption" msgid "&Tooltip:" msgstr "Opis:" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption #, fuzzy #| msgid "Keep terminal window open after executing program" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSKEEPTERMINALOPEN.CAPTION" msgid "&Keep terminal window open after executing program" msgstr "Zachowaj otwarty terminal po wykonaniu programu" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption #, fuzzy #| msgid "Execute in terminal" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSRUNINTERMINAL.CAPTION" msgid "&Execute in terminal" msgstr "Wykonaj w terminalu" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption #, fuzzy #| msgid "Use external program" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSUSEEXTERNALPROGRAM.CAPTION" msgid "&Use external program" msgstr "Użyj zewnętrznego programu" #: tfrmoptionstoolbase.lbltoolsparameters.caption #, fuzzy #| msgid "Additional parameters" msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPARAMETERS.CAPTION" msgid "A&dditional parameters" msgstr "Dodatkowe parametry" #: tfrmoptionstoolbase.lbltoolspath.caption #, fuzzy #| msgid "Path to program to execute" msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPATH.CAPTION" msgid "&Path to program to execute" msgstr "Ścieżka programu do wykonania" #: tfrmoptionstooltips.btnaddfields.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "Dodaj" #: tfrmoptionstooltips.btnapplyfields.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "Zastosuj" #: tfrmoptionstooltips.btndeletefields.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "Usuń" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Szablon..." #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "Pola użytkownika wg typu pliku" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "Pokaż podpowiedzi" #: tfrmoptionstooltips.lblfieldslist.caption #, fuzzy #| msgid "Category hint:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "Wskazówka kategorii:" #: tfrmoptionstooltips.lblfieldsmask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "Wzorzec typu:" #: tfrmoptionstooltips.lblfieldsname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "Nazwa kategorii:" #: tfrmoptionstooltips.rbtooltipallfiles.caption #, fuzzy #| msgid "Show tool tip for all files in file panel" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "Pokazuj podpowiedzi dla wszystkich plików w panelu" #: tfrmoptionstooltips.rbtooltipnone.caption #, fuzzy #| msgid "Don't show" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "Nie pokazuj" #: tfrmoptionstooltips.rbtooltiponlylarge.caption #, fuzzy #| msgid "Show tool tip for files in file panel if truncated" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "Pokazuj podpowiedzi dla plików jeśli panel plików nie jest widoczny w całości" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNBACKVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNFONTVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.gbviewerbookmode.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWERBOOKMODE.CAPTION" msgid "Viewer Book Mode" msgstr "Przeglądarka w trybie książki" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWEREXAMPLE.CAPTION" msgid "Example" msgstr "Przykład" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption #, fuzzy #| msgid "Background color in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLBACKGROUNDCOLORVIEWERBOOK.CAPTION" msgid "&Background color in book viewer" msgstr "Kolor tła w przeglądarce książek" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption #, fuzzy #| msgid "Font color in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLFONTCOLORVIEWERBOOK.CAPTION" msgid "&Font color in book viewer" msgstr "Kolor czcionki w przeglądarce książek" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption #, fuzzy #| msgid "Number of columns in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLNUMBERCOLUMNSVIEWER.CAPTION" msgid "&Number of columns in book viewer" msgstr "Liczba kolumn w przeglądarce książek" #: tfrmpackdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmpackdlg.btnconfig.caption #, fuzzy #| msgid "&Configure" msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "&Konfiguruj" #: tfrmpackdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Pomoc" #: tfrmpackdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmpackdlg.caption msgctxt "TFRMPACKDLG.CAPTION" msgid "Pack files" msgstr "Pakowanie plików" #: tfrmpackdlg.cbcreateseparatearchives.caption #, fuzzy #| msgid "Create separate archives, o&ne per selected file/dir" msgid "C&reate separate archives, one per selected file/dir" msgstr "Utwórz oddzielne archiwa dla każdego z katalogów/plików" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "Utwórz samorozpakowujące się archiwum" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "Za&szyfrowane" #: tfrmpackdlg.cbmovetoarchive.caption #, fuzzy #| msgid "M&ove to archive" msgid "Mo&ve to archive" msgstr "&Usuń pliki po ich zarchwizowaniu" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "&Wieloczęściowe archiwum dyskowe" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "=>" #: tfrmpackdlg.cbputintarfirst.caption #, fuzzy #| msgid "Put in the TAR archive first" msgid "P&ut in the TAR archive first" msgstr "Spakuj najpierw do archiwum TAR" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "Przy archwizowaniu z podkatalogami zachowaj ścieżki" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "Nazwa pliku archiwum:" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "Paker" #: tfrmpackinfodlg.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Zamknij" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "Wypakuj &wszystko i uruchom" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "Wypakuj i &uruchom" #: tfrmpackinfodlg.caption msgctxt "TFRMPACKINFODLG.CAPTION" msgid "Properties of packed file" msgstr "Właściwości spakowanego pliku" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "Atrybuty:" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "Stopień kompresji:" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "Data:" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "Metoda:" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "Wiekość oryginalna:" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "Plik:" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "Wielkość po skompresowaniu:" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "Paker:" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "Czas:" #: tfrmquicksearch.btncancel.caption msgctxt "tfrmquicksearch.btncancel.caption" msgid "X" msgstr "X" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "Aa" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "Uwzględnia pisownię wielkich liter" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "D" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "Katalog" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "F" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "Plik" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "7" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "Początek odnalezionego wzorca" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "0" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "Koniec odnalezionego wzroca" #: tfrmquicksearch.tglfilter.caption msgctxt "tfrmquicksearch.tglfilter.caption" msgid "Filter" msgstr "Filtr" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CANCELBUTTON.CAPTION" msgid "Cancel" msgstr "Anuluj" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CLOSEBUTTON.CAPTION" msgid "&Close" msgstr "Zamknij" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.HELPBUTTON.CAPTION" msgid "&Help" msgstr "Pomoc" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "tfrmselecttextrange.btppanel.okbutton.caption" msgid "&OK" msgstr "&ОК" #: tfrmselecttextrange.lblselecttext.caption #, fuzzy #| msgid "Select the characters to insert:" msgid "&Select the characters to insert:" msgstr "Wybierz znaki do wstawienia:" #: tfrmsetfileproperties.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmsetfileproperties.caption msgctxt "TFRMSETFILEPROPERTIES.CAPTION" msgid "Change attributes" msgstr "Zmień właściwości pliku" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Przyklejony" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "Archiwum" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "Utworzony:" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "Ukryty" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "Dostęp:" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "Modyfikacja:" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "Tylko do odczytu" #: tfrmsetfileproperties.chkrecursive.caption msgid "Including subfolders" msgstr "Rekursywnie" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "System" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "Właściwości znacznika czasu" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atrybuty" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Arybuty" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bity:" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Grupa" #: tfrmsetfileproperties.lblattrinfo.caption msgid "(gray field means unchanged value)" msgstr "(szare pole oznacza niezmienioną wartość)" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Inne" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Właściciel" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Jako tekst:" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Wykonywalny" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Ósemkowo:" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Odczyt" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Zapis" #: tfrmsplitter.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmsplitter.caption msgctxt "TFRMSPLITTER.CAPTION" msgid "Splitter" msgstr "Dzielenie" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664B - 3.5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "Nazwa pliku" #: tfrmsplitter.grbxsize.caption msgid "Size and number of parts" msgstr "Wielkość i liczba części" #: tfrmsplitter.lbdirtarget.caption #, fuzzy #| msgid "Directory target" msgid "Directory &target" msgstr "Katalog docelowy" #: tfrmsplitter.lbfilesource.caption #, fuzzy #| msgid "File source" msgid "File &source" msgstr "Plik źródłowy" #: tfrmsplitter.lblnumberparts.caption #, fuzzy #| msgid "Number of parts" msgid "&Number of parts" msgstr "Liczba części" #: tfrmsplitter.rbtngigab.caption #, fuzzy #| msgid "Gigabytes" msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "Gigabajty" #: tfrmsplitter.rbtnkilob.caption #, fuzzy #| msgid "Kilobytes" msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "Kilobajty" #: tfrmsplitter.rbtnmegab.caption #, fuzzy #| msgid "Megabytes" msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "Megabajty" #: tfrmsymlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Anuluj" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&ОК" #: tfrmsymlink.caption msgid "Create symbolic link" msgstr "Utwórz link symboliczny" #: tfrmsymlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Dowiązanie do" #: tfrmsymlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Nazwa linku" #: tfrmtweakplugin.btnadd.caption #, fuzzy #| msgid "Add new" msgid "A&dd new" msgstr "Dodaj" #: tfrmtweakplugin.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Porzuć" #: tfrmtweakplugin.btnchange.caption #, fuzzy #| msgid "Change" msgid "C&hange" msgstr "Zmień" #: tfrmtweakplugin.btndefault.caption #, fuzzy #| msgid "Default" msgid "De&fault" msgstr "Domyślny" #: tfrmtweakplugin.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmtweakplugin.btnremove.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "Usuń" #: tfrmtweakplugin.caption msgctxt "TFRMTWEAKPLUGIN.CAPTION" msgid "Tweak plugin" msgstr "Ustawienia wtyczki" #: tfrmtweakplugin.cbpk_caps_by_content.caption #, fuzzy #| msgid "Detect archive type by content" msgid "De&tect archive type by content" msgstr "Wykryj typ archiwum wg zawartości" #: tfrmtweakplugin.cbpk_caps_delete.caption #, fuzzy #| msgid "Can delete files" msgid "Can de&lete files" msgstr "Możliwość usunięcia pliku z archiwum" #: tfrmtweakplugin.cbpk_caps_encrypt.caption #, fuzzy #| msgid "Supports encryption" msgid "Supports e&ncryption" msgstr "Wsparcie szyfrowania" #: tfrmtweakplugin.cbpk_caps_hide.caption #, fuzzy #| msgid "Show as normal files (hide packer icon)" msgid "Sho&w as normal files (hide packer icon)" msgstr "Pokazuj jako zwykły plik (nie pokazuj ikony archiwum)" #: tfrmtweakplugin.cbpk_caps_mempack.caption #, fuzzy #| msgid "Supports packing in memory" msgid "Supports pac&king in memory" msgstr "Wsparcie pakowania w pamięci" #: tfrmtweakplugin.cbpk_caps_modify.caption #, fuzzy #| msgid "Can modify exisiting archives" msgid "Can &modify exisiting archives" msgstr "Dozwól na modyfikację archiwum" #: tfrmtweakplugin.cbpk_caps_multiple.caption #, fuzzy #| msgid "Archive can contain multiple files" msgid "&Archive can contain multiple files" msgstr "Archiwum może zawierać kilka plików" #: tfrmtweakplugin.cbpk_caps_new.caption #, fuzzy #| msgid "Can create new archives" msgid "Can create new archi&ves" msgstr "Może tworzyc nowe archiwum" #: tfrmtweakplugin.cbpk_caps_options.caption #, fuzzy #| msgid "Supports the options dialogbox" msgid "S&upports the options dialogbox" msgstr "Z oknem dialogowym" #: tfrmtweakplugin.cbpk_caps_searchtext.caption #, fuzzy #| msgid "Allow searching for text in archives" msgid "Allow searchin&g for text in archives" msgstr "Pozwala przeszukiwać archiwa" #: tfrmtweakplugin.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "Opis:" #: tfrmtweakplugin.lbldetectstr.caption #, fuzzy #| msgid "Detect string:" msgid "D&etect string:" msgstr "Wykryj łańcuch (string):" #: tfrmtweakplugin.lblextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "Rozszerzenie:" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "Flagi:" #: tfrmtweakplugin.lblname.caption #, fuzzy #| msgid "Name:" msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "Nazwa:" #: tfrmtweakplugin.lblplugin.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "Wtyczki:" #: tfrmtweakplugin.lblplugin1.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "Wtyczki:" #: tfrmviewer.actabout.caption msgctxt "TFRMVIEWER.ACTABOUT.CAPTION" msgid "About Viewer..." msgstr "O listerze..." #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "Pokaż \"O ...\"" #: tfrmviewer.actcopyfile.caption msgctxt "TFRMVIEWER.ACTCOPYFILE.CAPTION" msgid "Copy File" msgstr "Skopiuj plik" #: tfrmviewer.actcopyfile.hint msgctxt "TFRMVIEWER.ACTCOPYFILE.HINT" msgid "Copy File" msgstr "Skopiuj plik" #: tfrmviewer.actdeletefile.caption msgctxt "TFRMVIEWER.ACTDELETEFILE.CAPTION" msgid "Delete File" msgstr "Skasuj plik" #: tfrmviewer.actdeletefile.hint msgctxt "TFRMVIEWER.ACTDELETEFILE.HINT" msgid "Delete File" msgstr "Skasuj plik" #: tfrmviewer.actloadnextfile.caption msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.CAPTION" msgid "&Next" msgstr "&Następny" #: tfrmviewer.actloadnextfile.hint msgid "Load Next File" msgstr "Ładuj następny plik" #: tfrmviewer.actloadprevfile.caption msgctxt "TFRMVIEWER.ACTLOADPREVFILE.CAPTION" msgid "&Previous" msgstr "&Poprzedni" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "Ładuj poprzedni plik" #: tfrmviewer.actmirror.caption msgctxt "TFRMVIEWER.ACTMIRROR.CAPTION" msgid "Mirror" msgstr "Odbicie lustrzane" #: tfrmviewer.actmirror.hint msgctxt "TFRMVIEWER.ACTMIRROR.HINT" msgid "Mirror" msgstr "Odbicie lustrzane" #: tfrmviewer.actmovefile.caption msgctxt "TFRMVIEWER.ACTMOVEFILE.CAPTION" msgid "Move File" msgstr "Przesuń plik" #: tfrmviewer.actmovefile.hint msgctxt "TFRMVIEWER.ACTMOVEFILE.HINT" msgid "Move File" msgstr "Przesuń plik" #: tfrmviewer.actreload.caption msgctxt "TFRMVIEWER.ACTRELOAD.CAPTION" msgid "Reload" msgstr "Wczytaj ponownie" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "Ładuj ten plik ponownie" #: tfrmviewer.actrotate180.caption msgctxt "TFRMVIEWER.ACTROTATE180.CAPTION" msgid "Rotate 180" msgstr "Obróć o 180°" #: tfrmviewer.actrotate180.hint msgctxt "TFRMVIEWER.ACTROTATE180.HINT" msgid "Rotate 180" msgstr "Obróć o 180°" #: tfrmviewer.actrotate270.caption msgctxt "TFRMVIEWER.ACTROTATE270.CAPTION" msgid "Rotate 270" msgstr "Obróć o 270°" #: tfrmviewer.actrotate270.hint msgctxt "TFRMVIEWER.ACTROTATE270.HINT" msgid "Rotate 270" msgstr "Obróć o 270°" #: tfrmviewer.actrotate90.caption msgctxt "TFRMVIEWER.ACTROTATE90.CAPTION" msgid "Rotate 90" msgstr "Obróć o 90°" #: tfrmviewer.actrotate90.hint msgctxt "TFRMVIEWER.ACTROTATE90.HINT" msgid "Rotate 90" msgstr "Obróć o 90°" #: tfrmviewer.actsaveas.caption msgctxt "TFRMVIEWER.ACTSAVEAS.CAPTION" msgid "Save As..." msgstr "Zapisz jako..." #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "Zapisz plik jako..." #: tfrmviewer.actstretchimage.caption msgctxt "TFRMVIEWER.ACTSTRETCHIMAGE.CAPTION" msgid "Stretch" msgstr "Rozciągnij" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "Rozciągnij obrazek" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "- 90" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "Kopiuj" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "Kopiuj" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "Przytnij" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "Usuń" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "Usuń" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "Pełny ekran" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "||" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "S" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "Zaznacz" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "Odbicie lustrzane" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "Przenieś" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "Przenieś" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "||>" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "Maluj" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "<||" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "Czerwone oczy" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "Zmień rozmiar" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "Cofnij" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "Powiększ" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "Zmniejsz" #: tfrmviewer.caption msgctxt "tfrmviewer.caption" msgid "Viewer" msgstr "Lister" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Pokaz slajdów" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "Ołówek" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "Zaznacz" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "Maluj" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Pokaz slajdów" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "Podgląd" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "0x0" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "+ 180" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "- 90" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "O programie" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "Tryb binarny" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "Kopiuj do schowka" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "Edytuj" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "Kodowanie" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "Koniec" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "Plik" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "Pełny ekran" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "Grafika" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "Tryb szesnastkowy (hex)" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "Rysunek" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "Pokaż jak&o Książkę" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "Odbicie lustrzane" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "Wtyczki" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "Podgląd" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "Drukuj..." #: tfrmviewer.mirotate.caption msgid "Rotate" msgstr "Obróć" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "Zapisz" #: tfrmviewer.misaveas.caption msgctxt "TFRMVIEWER.MISAVEAS.CAPTION" msgid "Save As..." msgstr "Zapisz jako..." #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "Zrzut ekranu" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "Znajdź" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "Znajdź następny" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "Znajdź poprzedni" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "Zaznacz wszystko" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.mistretch.caption msgctxt "TFRMVIEWER.MISTRETCH.CAPTION" msgid "Stretch" msgstr "Rozciągnij" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "Jako tekst" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "&Podgląd" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "Tekst z zawijaniem wierszy" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "Powiększ" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "Zmniejsz" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "Kopiuj do schowka" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "Zaznacz wszystko" #: tfrmviewoperations.btnstartpause.caption #, fuzzy #| msgid "Start" msgctxt "tfrmviewoperations.btnstartpause.caption" msgid "&Start" msgstr "Start" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "" #: tfrmviewoperations.caption msgctxt "TFRMVIEWOPERATIONS.CAPTION" msgid "File operations" msgstr "Operacje na plikach" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "" #: tfrmviewoperations.mnucanceloperation.caption msgctxt "tfrmviewoperations.mnucanceloperation.caption" msgid "Cancel" msgstr "Anuluj" #: tfrmviewoperations.mnucancelqueue.caption msgctxt "tfrmviewoperations.mnucancelqueue.caption" msgid "Cancel" msgstr "Anuluj" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "tfrmviewoperations.mnuoperationshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "" #: tfrmviewoperations.mnuqueue.caption msgctxt "tfrmviewoperations.mnuqueue.caption" msgid "Queue" msgstr "" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "tfrmviewoperations.mnuqueueshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "tmultiarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Gdy plik istnieje" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "twcxarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Gdy plik istnieje" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Gdy plik istnieje" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "Anuluj szybki filtr" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "Anuluj bieżącą operację" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "" #: ulng.rscolattr msgid "Attr" msgstr "Atr." #: ulng.rscoldate msgid "Date" msgstr "Data" #: ulng.rscolext msgid "Ext" msgstr "Rozsz." #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "Nazwa" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "Rozmiar" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "Liczba zmian:" #: ulng.rsconfcolalign msgid "Align" msgstr "Wyrównywanie" #: ulng.rsconfcolcaption msgid "Caption" msgstr "Nagłówek" #: ulng.rsconfcolconfig msgid "Config" msgstr "Ustawienia" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "Usuń" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "Pola danych" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "Przenieś" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "Szerokość" #: ulng.rsconfcustheader msgid "Customize column" msgstr "Ustawienia kolumny: " #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "Kopiuj (%d) %s" #: ulng.rsdlgallopcomplete #, fuzzy #| msgid "All operations is complete" msgid "All operations completed" msgstr "Wszystkie operacje zakończone" #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "Postęp dla wszystkich operacji %d %%" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "Przerwij" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "Wszystko" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "Dodaj" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "&Anuluj" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "Kopiuj do" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "Kopiuj do &wszystkich" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "" #: ulng.rsdlgbuttonno msgid "&No" msgstr "&Nie" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "Żadnego" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "&OK" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "&Zastąp" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "Zastąp wszystko" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "Nadpisz wszystkie &stare" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "&Wznów" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "Ponów" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "&Pomiń" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "Pomiń &wszystko" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "&Tak" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "Zlicz pliki i katalogi" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "Oblicz sumę kontrolną" #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "Sprawdź sumę kontrolną" #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "Kopiuj plik/i" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "Usuń plik/i" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "Przenieś plik/i" #: ulng.rsdlgoppause #, fuzzy #| msgid "Pause" msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "Pauza" #: ulng.rsdlgopstart #, fuzzy #| msgid "Start" msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "Start" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "Prędkość %s/s" #: ulng.rsdlgspeedtime msgid "Speed %s/s, time remaining %s" msgstr "Szybkość %s/s, pozostały czas %s" #: ulng.rsdlgsplit msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "Podziel" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "Wymaż plik(i)" #: ulng.rsdrivenolabel msgid "" msgstr "" #: ulng.rsdrivenomedia msgid "" msgstr "" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Wewnętrzny edytor Double Commandera" #: ulng.rseditnewfile msgid "new.txt" msgstr "nowy.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "Nazwa pliku:" #: ulng.rseditnewopen msgid "Open file" msgstr "Otwórz plik" #: ulng.rseditsearchback msgid "&Backward" msgstr "Cofnij" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "Szukaj" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "Naprzód" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "Zamień" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "" #: ulng.rsfileopsetpropertyerroroptions msgctxt "ulng.rsfileopsetpropertyerroroptions" msgid "Ask;Don't set anymore;Ignore errors" msgstr "" #: ulng.rsfilterstatus msgid "FILTER" msgstr "FILTR" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "Zdefiniuj wzorzec" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "%s poziom(y)" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "Wszystko (bez ograniczeń)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "Tylko bieżący katalog" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "Katalog %s nie istnieje!" #: ulng.rsfindfound msgid "Found: %d" msgstr "Szukaj: %d" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "Zapisz wzorzec wyszukiwania" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "Nazwa wzorca:" #: ulng.rsfindscanned msgid "Scanned: %d" msgstr "Przejrzano: %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "Przeszukiwanie" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "Znajdź plik" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "Zacznij w" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr "Wolne %s z %s" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "%s bajtów wolnych" #: ulng.rsfuncatime msgid "Access date/time" msgstr "Data/czas dostępu" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "Atrybuty" #: ulng.rsfunccomment msgctxt "ulng.rsfunccomment" msgid "Comment" msgstr "Komentarz" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "Data/czas utworzenia" #: ulng.rsfuncext msgid "Extension" msgstr "Rozszerzenie" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "Grupa" #: ulng.rsfunclinkto msgid "Link to" msgstr "Link do" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "Data/czas modyfikacji" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "Nazwa" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "Nazwa bez rozszerzenia" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "Właściciel" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "Ścieżka" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "Rozmiar" #: ulng.rsfunctype msgid "Type" msgstr "Typ" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "Błąd podczas tworzenia twardego linku." #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "Okienko kopiuj/przenieś" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "Różnice" #: ulng.rshotkeycategorymain msgid "Main" msgstr "Główny" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "Lister" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "Zakończono" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "Maska deselekcji" #: ulng.rsmarkplus msgid "Select mask" msgstr "Maska selekcji" #: ulng.rsmaskinput msgid "Input mask:" msgstr "Maska wejściowa:" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "Ustawienia własnego wyglądu kolumn" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "Ustawienia bieżącego wyglądu kolumn" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "Polecenia" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "Edytuj" #: ulng.rsmnueject msgid "Eject" msgstr "Wysuń" #: ulng.rsmnumount msgid "Mount" msgstr "Zamontuj" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "Nowy" #: ulng.rsmnunomedia msgid "No media available" msgstr "Brak dostępnego nośnika" #: ulng.rsmnuopenwith #, fuzzy #| msgid "Open with ..." msgid "Open with" msgstr "Otwórz z ..." #: ulng.rsmnuopenwithother msgid "Other..." msgstr "" #: ulng.rsmnusortby msgid "Sort by" msgstr "Sortuj po" #: ulng.rsmnuumount msgid "Unmount" msgstr "Odmontuj" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "Podgląd" #: ulng.rsmsgaccount msgid "Account:" msgstr "Konto:" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "Dodatkowe parametry linii komend archiwizera:" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "Nie można skopiować/przenieść pliku \"%s\" do niego samego!" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "Nie mogę usunąć katalogu %s" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "Nieudane przejście do katalogu [%s] !" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "Zamknąć nieaktywne karty?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "Karta (%s) jest zablokowana! Zamknąć mimo to?" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "Na pewno zakończyć?" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "Skopiować %d wybranych plików/katalogów?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "Skopiować wybrane \"%s\"?" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "Skasować ten częściowo skopiowany plik?" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "Usunąć %d wybranych plików/katalogów?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "Wyrzucić do kosza %d wybranych plików/katalogów?" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "Usunąć wybrane \"%s\"?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "Wyrzucić do kosza wybrane \"%s\"?" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "Nie można usunąć \"%s\" do kosza! Usunąć bezpośrednio?" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "Dysk niedostępny" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "Podaj rozszerzenie:" #: ulng.rsmsgentername msgid "Enter name:" msgstr "Podaj nazwę:" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "Błąd w archiwum. Niezgodna suma kontrolna (CRC)." #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "Błąd w danych" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "Nie można połączyć z serwerem: \"%s\"" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "Nie można skopiować pliku %s do %s" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "Katalog o nazwie \"%s\" już tam istnieje." #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "Data %s nie jest obsługiwana" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "katalog %s już istnieje!" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "Przerwane pzrez użytkownika." #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "Błąd zamknięcia pliku" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "Nie można utworzyć pliku" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "W archiwum nie ma więcej plików" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "Nie można otworzyć pliku" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "Błąd odczytu pliku" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "Błąd przy zapisie pliku" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "Nie można utworzyć katalogu %s!" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "Błędny link" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "Nie znaleziono plików" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "Za mało pamięci" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "Funkcja niewspierana!" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "Błąd w poleceniu komendy menue kontekstowego" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "Błąd składni w wyrażeniu regularnym!" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "Nie można zmienić nazwy %s na %s" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "Nie można zapisać pliku" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "Nie można ustawić atrybutów dla \"%s\"" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "Nie można ustawić daty/czasu dla \"%s\"" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "Za mały bufor" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "Za dużo wybranych plików" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "Błądny lub nieznany format archiwum." #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "Plik %s zmieniono, zapisać?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "Plik o nazwie %s istnieje, zastąpić?" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "Aktywne operacje na plikach" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "Niektóre operacje na plikach nie zostały zakończone. Zamknięcie Double Commandera może spowodować utratę danych." #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "Plik %s jest oznaczony jako tylko do odczytu. Usunąć mimo to?" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "Plik \"%s\" nie mieści się na docelowym systemie plików!" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "katalog o nazwie %s istnieje, zastąpić?" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "Iść za linkiem \"%s\"?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "Błąd w linii poleceń" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "Błądna nazwa pliku" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "Zła ścieżka" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "Ścieżka %s zawiera niedozwolone znaki." #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "Zły cytat" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "Błędny wybór." #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "Wczytywanie listy plików..." #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "Kopiowanie pliku %s" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "Kasowanie pliku %s" #: ulng.rsmsglogerror msgid "Error: " msgstr "Błąd: " #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "Rozpakowywanie pliku %s" #: ulng.rsmsgloginfo msgid "Info: " msgstr "Informacja: " #: ulng.rsmsgloglink msgid "Create link %s" msgstr "Tworzenie twardego linku %s" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "Tworzenie katalogu %s" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "Przenoszenie pliku %s" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "Archiwizowanie do pliku %s" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "Usunięcie katalogu %s" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "Wykonano: " #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "Tworzenie linku symbolicznego %s" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "Testowanie intergralności %s" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "Dopdaj wybrany katalog" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "Edycja wybranego katalogu" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "Wprowadź nazwę i ścieżkę (format nazwa=ścieżka):" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "Hasło główne" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "Proszę wprowadzić hasło główne:" #: ulng.rsmsgnewfile msgid "New file" msgstr "Nowy plik" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "Kolejna część będzie rozpakowana" #: ulng.rsmsgnofiles msgid "No files" msgstr "" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "Brak wybranych plików." #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "Brak miejsca na dysku. Kontynuować?" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "Brak miejsca na dysku. Ponowić próbę?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "Pliku %s nie można skasować" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "Nie zaimplementowo." #: ulng.rsmsgpassword msgid "Password:" msgstr "Hasło:" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "Hasła nie zgadzają się ze sobą!" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "Proszę wprowadzić hasło:" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "Hasło (Firewall):" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "Proszę podać hasło ponownie:" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "&Dodaj %s" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "&Konfiguruj" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "&Usuń %s" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "Wzorzec \"%s\" istnieje. Zastąpić?" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "Zmienić nazwę/przenieść %d wybranych plików/katalogów?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "Przenieść/zmienić nazwę \"%s\"?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "Zmiana ustawień. Należy ponownie uruchomić Double Commandera" #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "Wybrane: %s z %s, plików: %d z %d, katalogów: %d z %d" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "Zaznacz tylko pliki z sumą kontrolną!" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "Wybierz lokalizacją kolejnej części" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "Zmień etykietę części" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "Zmień nazwę karty" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "Nowa nazwa karty:" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "Ścieżka docelowa:" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "Wybrano zbyt dużo plików" #: ulng.rsmsgurl msgid "URL:" msgstr "URL:" #: ulng.rsmsgusername msgid "User name:" msgstr "Nazwa użytkownika:" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "Nazwa użytkownika (Firewall):" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "Etykieta części:" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "Proszę wpisać rozmiar części:" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "Zamazać %d wybranych plików/katalogów?" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "Zamazać \"%s\"?" #: ulng.rsmulrenfilenamestylelist msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "Bez zmian;WIELKIMI ZNAKAMI;małymi znakami;Pierwszy wielki;Wszystkie Pierwsze;" #: ulng.rsoperaborted msgid "Aborted" msgstr "Przerwane" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "Obliczanie" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "" #: ulng.rsopercombining msgid "Joining" msgstr "" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopying msgid "Copying" msgstr "" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "Usuwanie" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "" #: ulng.rsoperexecuting msgid "Executing" msgstr "" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "" #: ulng.rsoperextracting msgid "Extracting" msgstr "" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperfinished msgid "Finished" msgstr "Zakończony" #: ulng.rsoperlisting msgid "Listing" msgstr "" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "" #: ulng.rsopermoving msgid "Moving" msgstr "" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "" #: ulng.rsopernotstarted msgid "Not started" msgstr "Nie uruchomiony" #: ulng.rsoperpacking msgid "Packing" msgstr "" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpaused msgid "Paused" msgstr "Pauza" #: ulng.rsoperpausing msgid "Pausing" msgstr "Pauzowanie" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "W kolejce" #: ulng.rsoperrunning msgid "Running" msgstr "Działające" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "" #: ulng.rsopersplitting msgid "Splitting" msgstr "" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperstarting msgid "Starting" msgstr "Uruchamianie" #: ulng.rsoperstopped msgid "Stopped" msgstr "Zatrzymane" #: ulng.rsoperstopping msgid "Stopping" msgstr "Zatrzymywanie" #: ulng.rsopertesting msgid "Testing" msgstr "" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "Oczekiwanie na dostęp do źródła pliku" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "Oczekiwanie na odpowiedź użytkownika" #: ulng.rsoperwiping msgid "Wiping" msgstr "" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "" #: ulng.rsoperworking msgid "Working" msgstr "" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "Usuń:" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "Rozpakuj bez ścieżki:" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "Tryb parsowania formatu:" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "ID:" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "Pozycja ID:" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "Zakres wyszukiwania ID:" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "Parametr" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "Ciąg zapytania hasła:" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "Utwórz archiwum samorozpakowujące:" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "Test:" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "Nazwa rodzaju archiwum:" #: ulng.rsoptarchivevalue msgid "Value" msgstr "Wartość" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "Skojarzyć wtyczkę \"%s\" z:" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "Pierwszy;Ostatni;" #: ulng.rsoptdisable msgid "Disable" msgstr "Wyłącz" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "Włącz" #: ulng.rsoptenterext msgid "Enter extension" msgstr "Wpisz rozszerzenie" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "Kursor" #: ulng.rsoptexamplemark msgid "Mark" msgstr "Zaznaczenie" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "Zaznaczenie pod kursorem" #: ulng.rsoptexampletext msgid "Text" msgstr "Tekst" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "Skrót %s do cm_Delete zostanie dodany, a więc może zostać używany do odwracania tego ustawienia." #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "Dodaj skrót" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "Polecenia" #: ulng.rsopthotkeysdeletetrashcanoverrides msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "Opis" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "Skrót" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "Skróty" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "Parametry" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "" #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "Skrót jest używany" #: ulng.rsopthotkeysshortcutusedtext1 msgid "Shortcut %s is already used." msgstr "Skrót %s jest już używany." #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "Zmienić na %s?" #: ulng.rsopthotkeysusedby msgid "used for %s in %s" msgstr "używany przez %s w %s" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "Archiwizery" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "Autoodświeżanie" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "Zachowanie" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "Kolory" #: ulng.rsoptionseditorcolumnsview msgctxt "ulng.rsoptionseditorcolumnsview" msgid "Columns" msgstr "Kolumny" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "Konfiguracja" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "Własne kolumny" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "Przeciągnij i upuść" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "Przycisk listy dysków" #: ulng.rsoptionseditorfileoperations msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "Operacje na plikach" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "Okna główne" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "Widoki plików" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "Typy plików" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "Karty katalogów" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "Czcionki" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "Podświetlanie" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "Skróty klawiaturowe" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "Ikony" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "Lista ignorowanych" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "Klawisze" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "Język" #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "Wygląd" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "Logi" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "Różne" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "Mysz" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "Wtyczki" #: ulng.rsoptionseditorquicksearch msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "Szybkie wyszukiwanie/filtr" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "Terminal" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "Narzędzia" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "Podpowiedzi" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "Lewy klawisz;Prawy klawisz;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "Wtyczka %s jest już przypisana do następujących rozszerzeń:" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "Stan" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "Nazwa pliku" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "Nazwa" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "Skojarzenia" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "nie uwzględnia wielkości liter; według ustawień lokalnych (aAbBcC); napierw wielkie, potem małe litery (ABCabc)" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "według nazwy i pokaż pierwsze; sortuj jako pliki i pokaż pierwsze; sortuj jako pliki" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "Alfabetycznie, uwzględniając akcenty;Naturalne sortowanie: alfabetycznie i numery" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "Góra;Dół;" #: ulng.rsopttoolbarbuttontype msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "Nie można zmienić praw dostępu dla \"%s\"" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "Nie można zmienić właściciela dla \"%s\"" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "Plik" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "Katalog" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "Nazwany strumień" #: ulng.rspropsno msgid "No" msgstr "Nie" #: ulng.rspropssocket msgid "Socket" msgstr "Socket" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "Specjalne urządzenie blokowe" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "Specjalne urządzenie wirtualne" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "Link symboliczny" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "Nieznany typ" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "Tak (%s)" #: ulng.rssearchresult msgid "Search result" msgstr "Wynik wyszukiwania" #: ulng.rssearchtemplateunnamed msgid "" msgstr "" #: ulng.rsselectdir msgid "Select a directory" msgstr "Wybierz katalog" #: ulng.rsshowhelpfor msgid "&Show help for %s" msgstr "" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "Bajty" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "Gigabajty" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "Kilobajty" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "Megabajty" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "Terabajty" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "Plików: %d, Katalogów: %d, Rozmiar: %s (%s bajtów)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "Nie można utworzyć katalogu docelowego!" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "Nieprawodłowa format wielkości pliku" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "Pliku nie da sie podzilić!" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "Liczba części jest większa niż 100! Kontynuować?" #: ulng.rssplitseldir msgid "Select directory:" msgstr "Wybierz katalog:" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "Błąd przy tworzeniu linku symbolicznego." #: ulng.rssyndefaulttext msgctxt "ulng.rssyndefaulttext" msgid "Default text" msgstr "Zwykły tekst" #: ulng.rssynlangplaintext msgctxt "ulng.rssynlangplaintext" msgid "Plain text" msgstr "Czysty tekst" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "Dzień (dni)" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "Godzin(y)" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "Minut(y)" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "Miesiąc(e)" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "Sekund(y)" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "Tydzień (tygodnie)" #: ulng.rstimeunityear msgid "Year(s)" msgstr "Rok (Lata)" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "Różnice" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "Edytor" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "Błąd przy otwieraniu diff'a" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "Błąd przy otwieraniu edytora" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "Błąd przy otwieraniu terminalu" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "Błąd przy otwieraniu podglądu" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "Terminal" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "Lister" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "Proszę zgłosić ten błąd do systemu śledzenia błędów wraz z opisem wcześniejszych działań i następującym plikiem:%sWciśnij %s aby kontynuować lub %s aby zakończyć program." #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "Sieć" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "Program wewnętrzny Double Commandera do podglądu" #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "Kodowanie" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "%s nie znaleziony!" doublecmd-0.5.8/language/doublecmd.it.po0000644000175000017500000062653712250633131017221 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.5 alpha\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-02-07 21:08+0300\n" "PO-Revision-Date: 2013-11-03 13:34+0100\n" "Last-Translator: Krypton \n" "Language-Team: Krypton \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Italiano\n" "X-Poedit-Country: ITALY\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "Tutto" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "Tutto" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "Tutto" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "Tutto" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "Tutto" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "Tutto" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "Tutto" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "Annulla" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "..." #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "->" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "<-" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "Configura colonne personalizzate" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "Sfondo:" #: tfcolumnssetconf.cbcursorborder.caption msgid "Cursor border" msgstr "Bordo cursore" #: tfcolumnssetconf.cbovercolor.caption msgid "Allow Overcolor" msgstr "Consentire sovrapposizione colori" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "Utilizza font e colori personalizzati" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "Colore testo:" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "Font:" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "Dimensione:" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "Sfondo 2:" #: tfcolumnssetconf.lblconfigviewnr.caption msgid "Configure view nr:" msgstr "Configura vista nr:" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "Colore cursore:" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "Colore testo:" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "Colore selezione:" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "Nome:" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "Aggiungi colonna" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "Personalizza colonna:" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "Anteprima" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "R" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "Scegli modello..." #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption msgid "C&heck free space" msgstr "Contro&lla spazio libero" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption msgid "Cop&y attributes" msgstr "Cop&ia attributi" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption msgid "Copy o&wnership" msgstr "Copia p&roprietà" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption msgid "Copy d&ate/time" msgstr "Copia d&ata/ora" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption msgid "Correct lin&ks" msgstr "Lin&k valido" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "Elimina attri&buto di sola lettura" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption msgid "E&xclude empty directories" msgstr "E&scludi cartelle vuote" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption msgid "Fo&llow links" msgstr "Se&gui i link" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "&Riserva spazio" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "Cosa fare quando non è possibile impostare data, attributi, etc. del file?" #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "Usa il modello del file" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption msgid "When dir&ectory exists" msgstr "Quando le cartelle esistono" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "Quando i file esistono" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption msgid "When ca&nnot set property" msgstr "Quando &non è possibile impostare proprietà" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "" #: tfrmabout.btnclose.caption msgctxt "TFRMABOUT.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Chiudi" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "Copia negli appunti" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "Info" #: tfrmabout.lblbuild.caption msgid "Build" msgstr "Build" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "Free Pascal" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "Home Page:" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "http://doublecmd.sourceforge.net" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "Lazarus" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "Revisione" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption msgid "Version" msgstr "Versione" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "&Reset" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "Seleziona gli attributi" #: tfrmattributesedit.cbarchive.caption msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "&Archivio" #: tfrmattributesedit.cbcompressed.caption msgid "Co&mpressed" msgstr "Co&mpresso" #: tfrmattributesedit.cbdirectory.caption msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "&Cartella" #: tfrmattributesedit.cbencrypted.caption msgid "&Encrypted" msgstr "&Codificato" #: tfrmattributesedit.cbhidden.caption msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "&Nascosto" #: tfrmattributesedit.cbreadonly.caption msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "Sola le&ttura" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmattributesedit.cbsparse.caption msgid "S&parse" msgstr "S&parse" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Adesivo" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmattributesedit.cbsymlink.caption msgid "&Symlink" msgstr "&Link simbolico" #: tfrmattributesedit.cbsystem.caption msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "S&istema" #: tfrmattributesedit.cbtemporary.caption msgid "&Temporary" msgstr "&Temporaneo" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "Attributi NTFS" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "Attributi generali" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bit:" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Gruppo" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Altro" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Proprietario" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "Esegui" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "Leggi" #: tfrmattributesedit.lbltextattrs.caption msgid "As te&xt:" msgstr "Come te&sto:" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "Scrivi" #: tfrmchecksumcalc.btncancel.caption msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmchecksumcalc.caption msgctxt "TFRMCHECKSUMCALC.CAPTION" msgid "Calculate check sum..." msgstr "Calcola Checksum..." #: tfrmchecksumcalc.cbseparatefile.caption msgid "C&reate separate checksum file for each file" msgstr "C&rea un file di Checksum separato per ogni file" #: tfrmchecksumcalc.lblsaveto.caption msgid "&Save check sum file(s) to:" msgstr "&Salva file di Checksum in:" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Chiudi" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "Verifica Checksum..." #: tfrmconnectionmanager.btnadd.caption msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "Ag&giungi" #: tfrmconnectionmanager.btncancel.caption msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmconnectionmanager.btnconnect.caption msgid "C&onnect" msgstr "C&onnetti" #: tfrmconnectionmanager.btndelete.caption msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "&Elimina" #: tfrmconnectionmanager.btnedit.caption msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "&Modifica" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "Gestore connessioni" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "Connetti a:" #: tfrmcopydlg.btnaddtoqueue.caption msgid "A&dd To Queue" msgstr "A&ggiungi alla coda" #: tfrmcopydlg.btncancel.caption msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "TFRMCOPYDLG.BTNCREATESPECIALQUEUE.CAPTION" msgid "..." msgstr "..." #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "O&pzioni" #: tfrmcopydlg.btnsaveoptions.caption msgid "Sa&ve these options as default" msgstr "Sa&lva opzioni come predefinite" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "Copia il(i) file" #: tfrmdescredit.btncancel.caption msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "Commenta file/cartella" #: tfrmdescredit.lbleditcommentfor.caption msgid "E&dit comment for:" msgstr "M&odifica commento per:" #: tfrmdescredit.lblencoding.caption msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "&Codifica:" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "Info" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "Confronto Automatico" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "Modalità binaria" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "Annulla" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "Annulla" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "Copia blocco a destra" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "Copia blocco a destra" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "Copia blocco a sinistra" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "Copia blocco a sinistra" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Copia" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Taglia" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Elimina" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Incolla" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Ripristina" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "Selezion&a Tutto" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Annulla" #: tfrmdiffer.actexit.caption msgctxt "TFRMDIFFER.ACTEXIT.CAPTION" msgid "E&xit" msgstr "Es&ci" #: tfrmdiffer.actfirstdifference.caption msgctxt "TFRMDIFFER.ACTFIRSTDIFFERENCE.CAPTION" msgid "First Difference" msgstr "Prima differenza" #: tfrmdiffer.actfirstdifference.hint msgctxt "TFRMDIFFER.ACTFIRSTDIFFERENCE.HINT" msgid "First Difference" msgstr "Prima differenza" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "Ignora maiusc./minusc." #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "Ignora Spazi" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "Mantenere scorrimento" #: tfrmdiffer.actlastdifference.caption msgctxt "TFRMDIFFER.ACTLASTDIFFERENCE.CAPTION" msgid "Last Difference" msgstr "Ultima differenza" #: tfrmdiffer.actlastdifference.hint msgctxt "TFRMDIFFER.ACTLASTDIFFERENCE.HINT" msgid "Last Difference" msgstr "Ultima differenza" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "Differenze della linea" #: tfrmdiffer.actnextdifference.caption msgctxt "TFRMDIFFER.ACTNEXTDIFFERENCE.CAPTION" msgid "Next Difference" msgstr "Prossima differenza" #: tfrmdiffer.actnextdifference.hint msgctxt "TFRMDIFFER.ACTNEXTDIFFERENCE.HINT" msgid "Next Difference" msgstr "Prossima differenza" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "Apri sinistra..." #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "Apri destra..." #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "Colora sfondo" #: tfrmdiffer.actprevdifference.caption msgctxt "TFRMDIFFER.ACTPREVDIFFERENCE.CAPTION" msgid "Previous Difference" msgstr "Differenza precedente" #: tfrmdiffer.actprevdifference.hint msgctxt "TFRMDIFFER.ACTPREVDIFFERENCE.HINT" msgid "Previous Difference" msgstr "Differenza precedente" #: tfrmdiffer.actreload.caption msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "&Ricarica" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "Ricarica" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "Salva" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "Salva" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "Salva come..." #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "Salva come..." #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "Salva a sinistra" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "Salva a sinistra" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "Salva a sinistra come..." #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "Salva a sinistra come..." #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "Salva a destra" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "Salva a destra" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "Salva a destra come..." #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "Salva a destra come..." #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "Confronta" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "Confronta" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "Codifica" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "Codifica" #: tfrmdiffer.caption msgctxt "TFRMDIFFER.CAPTION" msgid "Compare files" msgstr "Confronta file" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miencodingleft.caption msgid "&Left" msgstr "&Sinistra" #: tfrmdiffer.miencodingright.caption msgid "&Right" msgstr "&Destra" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "&Azioni" #: tfrmdiffer.mnuedit.caption msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "&Modifica" #: tfrmdiffer.mnuencoding.caption msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "Co&difica" #: tfrmdiffer.mnufile.caption msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "&File" #: tfrmdiffer.mnuoptions.caption msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "&Opzioni" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "Aggiungi nuovo collegamento alla sequenza" #: tfrmedithotkey.btncancel.caption msgctxt "TFRMEDITHOTKEY.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmedithotkey.btnok.caption msgctxt "TFRMEDITHOTKEY.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "Rimuovi l'ultimo collegamento dalla sequenza" #: tfrmedithotkey.cghkcontrols.caption msgctxt "TFRMEDITHOTKEY.CGHKCONTROLS.CAPTION" msgid "Only for these controls" msgstr "Solo per questi controlli" #: tfrmedithotkey.lblparameters.caption msgid "&Parameters (each in a separate line):" msgstr "&Parametri (ognuno in una linea separata):" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "Collegamenti:" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "Info" #: tfrmeditor.actabout.hint msgctxt "TFRMEDITOR.ACTABOUT.HINT" msgid "About" msgstr "Info" #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "&Configurazione" #: tfrmeditor.actconfhigh.hint msgctxt "TFRMEDITOR.ACTCONFHIGH.HINT" msgid "Configuration" msgstr "Configurazione" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Copia" #: tfrmeditor.acteditcopy.hint msgctxt "TFRMEDITOR.ACTEDITCOPY.HINT" msgid "Copy" msgstr "Copia" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Taglia" #: tfrmeditor.acteditcut.hint msgctxt "TFRMEDITOR.ACTEDITCUT.HINT" msgid "Cut" msgstr "Taglia" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Elimina" #: tfrmeditor.acteditdelete.hint msgctxt "TFRMEDITOR.ACTEDITDELETE.HINT" msgid "Delete" msgstr "Elimina" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "&Trova" #: tfrmeditor.acteditfind.hint msgctxt "TFRMEDITOR.ACTEDITFIND.HINT" msgid "Find" msgstr "Cerca" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "Trova prossimo" #: tfrmeditor.acteditfindnext.hint msgctxt "TFRMEDITOR.ACTEDITFINDNEXT.HINT" msgid "Find next" msgstr "Trova prossimo" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "Mac (CR)" #: tfrmeditor.acteditlineendcr.hint msgctxt "TFRMEDITOR.ACTEDITLINEENDCR.HINT" msgid "Mac (CR)" msgstr "Mac (CR)" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "Windows (CRLF)" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "TFRMEDITOR.ACTEDITLINEENDCRLF.HINT" msgid "Windows (CRLF)" msgstr "Windows (CRLF)" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "Unix (LF)" #: tfrmeditor.acteditlineendlf.hint msgctxt "TFRMEDITOR.ACTEDITLINEENDLF.HINT" msgid "Unix (LF)" msgstr "Unix (LF)" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Incolla" #: tfrmeditor.acteditpaste.hint msgctxt "TFRMEDITOR.ACTEDITPASTE.HINT" msgid "Paste" msgstr "Incolla" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Ripristina" #: tfrmeditor.acteditredo.hint msgctxt "TFRMEDITOR.ACTEDITREDO.HINT" msgid "Redo" msgstr "Ripristina" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "&Sostituisci" #: tfrmeditor.acteditrplc.hint msgctxt "TFRMEDITOR.ACTEDITRPLC.HINT" msgid "Replace" msgstr "Sostituisci" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "Selezion&a Tutto" #: tfrmeditor.acteditselectall.hint msgctxt "TFRMEDITOR.ACTEDITSELECTALL.HINT" msgid "Select All" msgstr "Seleziona Tutto" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Annulla" #: tfrmeditor.acteditundo.hint msgctxt "TFRMEDITOR.ACTEDITUNDO.HINT" msgid "Undo" msgstr "Annulla" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "&Chiudi" #: tfrmeditor.actfileclose.hint msgctxt "TFRMEDITOR.ACTFILECLOSE.HINT" msgid "Close" msgstr "Chiudi" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "&Esci" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "Exit" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "&Nuovo" #: tfrmeditor.actfilenew.hint msgctxt "TFRMEDITOR.ACTFILENEW.HINT" msgid "New" msgstr "Nuovo" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "&Apri" #: tfrmeditor.actfileopen.hint msgctxt "TFRMEDITOR.ACTFILEOPEN.HINT" msgid "Open" msgstr "Apri" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "&Salva" #: tfrmeditor.actfilesave.hint msgctxt "TFRMEDITOR.ACTFILESAVE.HINT" msgid "Save" msgstr "Salva" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "Sal&va Come.." #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "Salva come" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "Sal&va Tutto" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "Salva tutto" #: tfrmeditor.caption msgctxt "TFRMEDITOR.CAPTION" msgid "Editor" msgstr "Modifica" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "Ai&uto" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Modifica" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "&Codifica" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "Apri come" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "Salva come" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "&File" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "Evidenziazione sintassi" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "Fine linea" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n5.caption msgctxt "TFRMEDITOR.N5.CAPTION" msgid "-" msgstr "-" #: tfrmeditsearchreplace.btncancel.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "Distringui m&aiusc./minusc." #: tfrmeditsearchreplace.cbsearchfromcursor.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "&Cerca da ^" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "Espressioni &Regolari" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "Seleziona solo &testo" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "Solo parole in&tere" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "Opzione" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "&Sostituisci con:" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "Ri&cerca per:" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "Direzione" #: tfrmextractdlg.btncancel.caption msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmextractdlg.btnhelp.caption msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "&Aiuto" #: tfrmextractdlg.btnok.caption msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmextractdlg.caption msgctxt "TFRMEXTRACTDLG.CAPTION" msgid "Unpack files" msgstr "Decomprimi file" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "&Estrai i nomi di percorso se salvati con i file" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*.*" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "Estrai ogni archivio in una cartella &separata (nome dell'archivio)" #: tfrmextractdlg.cboverwrite.caption msgid "O&verwrite existing files" msgstr "S&ovrascrivi file esistenti" #: tfrmextractdlg.lblextractto.caption msgid "To the &directory:" msgstr "Alla &cartella:" #: tfrmextractdlg.lblfilemask.caption msgid "&Extract files matching file mask:" msgstr "&Estrai file corrispondenti al filtro file:" #: tfrmextractdlg.lblpassword.caption msgid "&Password for encrypted files:" msgstr "&Password per il file codificato:" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "Aggiungi" #: tfrmfileassoc.btnaddext.caption msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "&Aggiungi" #: tfrmfileassoc.btnaddnewtype.caption msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "A&ggiungi" #: tfrmfileassoc.btncancel.caption msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmfileassoc.btndownact.caption msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "&Giù" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmfileassoc.btnremoveact.caption msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "&Elimina" #: tfrmfileassoc.btnremoveext.caption msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "&Elimina" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "X" #: tfrmfileassoc.btnremovetype.caption msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "&Elimina" #: tfrmfileassoc.btnrenametype.caption msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "&Rinomina" #: tfrmfileassoc.btnupact.caption msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "&Su" #: tfrmfileassoc.caption msgid "File associations" msgstr "Associazioni file" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "Azioni" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "Estensioni" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "Tipi di file" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "Icona" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "Azione:" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "&Comando:" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "Modifica" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "Apri nell'Editor" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "Nome file" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "Percorso file" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "Percorso Completo" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "Prendi l'output dal comando" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "Apri" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "Esegui in nel terminale" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "Apri in VFS" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "Visualizza" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "Apri nel visualizzatore" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Chiudi" #: tfrmfileexecuteyourself.caption msgctxt "TFRMFILEEXECUTEYOURSELF.CAPTION" msgid "Wait..." msgstr "Attendere..." #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "Nome file:" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "Da:" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "Clicca su chiudi quando il file temporaneo può essere cancellato!" #: tfrmfileop.btncancel.caption msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "&Al pannello" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "&Visualizza tutto" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "Operazione corrente" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "Da:" #: tfrmfileop.lblto.caption msgid "To:" msgstr "A:" #: tfrmfileproperties.btnclose.caption msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Chiudi" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "&Imposta proprietà" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "Imposta su &tutti i file selezionati" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "&Salta questo file" #: tfrmfileproperties.caption msgctxt "TFRMFILEPROPERTIES.CAPTION" msgid "Properties" msgstr "Proprietà" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Adesivo" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "Proprietario" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bit:" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Gruppo" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Altro" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Proprietario" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmfileproperties.lblattrtextstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Testo:" #: tfrmfileproperties.lblcontains.caption msgctxt "TFRMFILEPROPERTIES.LBLCONTAINS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "Contiene:" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Esegui" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "Nome file" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "Nome:" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "Nome file" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "Percorso:" #: tfrmfileproperties.lblgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "&Gruppo" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "Ultimo accesso:" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "Ultima modifica:" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "Ultimo cambio di stato:" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Ottale:" #: tfrmfileproperties.lblownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "&Proprietario" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Leggi" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "Dimensione:" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption msgid "Symlink to:" msgstr "Link simbolico a:" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption msgid "Type:" msgstr "Tipo:" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Scrivi" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Attributi" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "Proprietà" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "&Aggiungi" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "&Aiuto" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Chiudi" #: tfrmfinddlg.btnedit.caption msgctxt "TFRMFINDDLG.BTNEDIT.CAPTION" msgid "&Edit" msgstr "&Modifica" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "&Vai al file" #: tfrmfinddlg.btnlastsearch.caption msgctxt "TFRMFINDDLG.BTNLASTSEARCH.CAPTION" msgid "&Last search" msgstr "&Ultima ricerca" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "&Nuova ricerca" #: tfrmfinddlg.btnsavetemplate.caption msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "&Salva" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "&Elimina" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "C&arica" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "S&alva" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption msgid "Sa&ve with \"Start in directory\"" msgstr "Sa&lva con \"Start in directory\"" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "Se salvato allora \"Start in directory\" sarà ripristinato al caricamento del modello. Usalo se vuoi effettuare una ricerca su una cartella specifica" #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "&Avvia" #: tfrmfinddlg.btnstop.caption msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "A&nnulla" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "Usa modello" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "&Mostra" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "Feed to &listbox" #: tfrmfinddlg.caption msgctxt "TFRMFINDDLG.CAPTION" msgid "Find files" msgstr "Trova file" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "Dist&ingui maiusc./minusc." #: tfrmfinddlg.cbdatefrom.caption msgid "&Date from:" msgstr "&Data da:" #: tfrmfinddlg.cbdateto.caption msgid "Dat&e to:" msgstr "Dat&a a:" #: tfrmfinddlg.cbfilesizefrom.caption msgid "S&ize from:" msgstr "D&imensione da:" #: tfrmfinddlg.cbfilesizeto.caption msgid "Si&ze to:" msgstr "Di&mensione a:" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "Cerca &testo in file" #: tfrmfinddlg.cbfollowsymlinks.caption msgctxt "TFRMFINDDLG.CBFOLLOWSYMLINKS.CAPTION" msgid "Follow s&ymlinks" msgstr "Segui link s&imbolico" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "Trova file che N&ON contengono il testo" #: tfrmfinddlg.cbnotolderthan.caption msgid "N&ot older than:" msgstr "Non &più vecchio di:" #: tfrmfinddlg.cbpartialnamesearch.caption msgid "Searc&h for part of file name" msgstr "&Cerca usando parte del nome del file" #: tfrmfinddlg.cbregexp.caption msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "Espressioni &Regolari" #: tfrmfinddlg.cbreplacetext.caption msgid "Re&place by" msgstr "So&stituisci con" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "Cartelle e &file selezionati" #: tfrmfinddlg.cbtimefrom.caption msgid "&Time from:" msgstr "Data/&Ora da:" #: tfrmfinddlg.cbtimeto.caption msgid "Ti&me to:" msgstr "Data/O&ra a:" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "&Utilizza plugin per le ricerche:" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "Inserisci i nomi delle cartelle che devono essere escluse dalla ricerca, separati con \";\"" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "Inserisci i nomi di file che devono essere esclusi dalla ricerca, separati con \";\"" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "Inserisci i nomi di file separati con \";\"" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption msgctxt "TFRMFINDDLG.GBDIRECTORIES.CAPTION" msgid "Directories" msgstr "Cartelle" #: tfrmfinddlg.gbfiles.caption msgctxt "TFRMFINDDLG.GBFILES.CAPTION" msgid "Files" msgstr "File" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "Cerca Data" #: tfrmfinddlg.lblattributes.caption msgctxt "TFRMFINDDLG.LBLATTRIBUTES.CAPTION" msgid "Attri&butes" msgstr "Attri&buti" #: tfrmfinddlg.lblencoding.caption msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "Codi&fica:" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "E&scludi sottocartelle" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "&Escludi file" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "&Filtro file" #: tfrmfinddlg.lblfindpathstart.caption msgid "Start in &directory" msgstr "Avvio nella &cartella" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "Trova so&ttocartelle:" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "Ricerche &precedenti:" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "Rimuovi dalla lista" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "Visualizza tutti gli elementi trovati" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "Mostra nel visualizzatore" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "Avanzate" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "Carica/Salva" #: tfrmfinddlg.tsplugins.caption msgctxt "TFRMFINDDLG.TSPLUGINS.CAPTION" msgid "Plugins" msgstr "Plugin" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "Risultati" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "Standard" #: tfrmfindview.btnclose.caption msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmfindview.btnfind.caption msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "&Cerca" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "Cerca" #: tfrmfindview.cbcasesens.caption msgid "C&ase sensitive" msgstr "D&istingui maiusc./minusc." #: tfrmhardlink.btncancel.caption msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmhardlink.caption msgid "Create hard link" msgstr "Crea un Hard Link" #: tfrmhardlink.lblexistingfile.caption msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "&Destinazione a cui punta il collegamento" #: tfrmhardlink.lbllinktocreate.caption msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Nome del co&llegamento" #: tfrmhotdir.btnadd.caption msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "&Aggiungi" #: tfrmhotdir.btnaddman.caption msgid "Add &manually" msgstr "Aggiungi &manualmente" #: tfrmhotdir.btncancel.caption msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmhotdir.btndelete.caption msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "&Elimina" #: tfrmhotdir.btnedit.caption msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "&Modifica" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "Cartelle Preferite" #: tfrmlinker.btnexit.caption msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmlinker.btnok.caption msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "..." #: tfrmlinker.caption msgctxt "TFRMLINKER.CAPTION" msgid "Linker" msgstr "Linker" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "Salva in..." #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "Elemento" #: tfrmlinker.lblfilename.caption msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "&Nome file" #: tfrmlinker.spbtndel.caption msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "&Elimina" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "Elimina" #: tfrmlinker.spbtndown.caption msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "&Giù" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "Giù" #: tfrmlinker.spbtnup.caption msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "&Su" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "Su" #: tfrmmain.actabout.caption msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "&Info" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "Aggiungi nome file nella linea di comando" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "Aggiungi percorso e nome file nella linea di comando" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "Copia percorso completo nella linea di comando" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "Breve" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "Visualizzazione breve" #: tfrmmain.actcalculatespace.caption msgid "Calculate &Occupied Space" msgstr "Calcola spazio &occupato" #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "Cambia cartella" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "Vai alla cartella superiore" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "Vai alla cartella radice" #: tfrmmain.actchecksumcalc.caption msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "Calcola Check&sum..." #: tfrmmain.actchecksumverify.caption msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "Verifica Chec&ksum..." #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "Pulisci il file di registro operazioni" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "Pulisci la finestra di registro operazioni" #: tfrmmain.actclosealltabs.caption msgctxt "TFRMMAIN.ACTCLOSEALLTABS.CAPTION" msgid "Close &All Tabs" msgstr "Chiudi &tutte le schede" #: tfrmmain.actclosetab.caption msgctxt "TFRMMAIN.ACTCLOSETAB.CAPTION" msgid "&Close Tab" msgstr "&Chiudi la scheda" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "Prossima riga di comando" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "Scrivi nella riga di comando il prossimo comando della cronologia" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "Riga di comando precedente" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "Scrivi nella riga di comando il precedente comando della cronologia" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "Completo" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "VIsta colonne" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "Confronta per &contenuto" #: tfrmmain.actcomparedirectories.caption msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.CAPTION" msgid "Compare Directories" msgstr "Confronta cartelle" #: tfrmmain.actcomparedirectories.hint msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.HINT" msgid "Compare Directories" msgstr "Confronta cartelle" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "Mostra menu contestuale" #: tfrmmain.actcopy.caption msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "Copia" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "Copia il nome del file con il &percorso completo" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "Copia nome(i) di file negli appunti" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "Copia file senza chiedere conferme" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "Copia nello stesso pannello" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "&Copia" #: tfrmmain.actcountdircontent.caption msgid "Sho&w Occupied Space" msgstr "Most&ra spazio occupato" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "&Taglia" #: tfrmmain.actdelete.caption msgctxt "TFRMMAIN.ACTDELETE.CAPTION" msgid "Delete" msgstr "Elimina" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "Cronologia cartelle" #: tfrmmain.actdirhotlist.caption msgid "Directory &Hotlist" msgstr "Cartelle pre&ferite" #: tfrmmain.actedit.caption msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "Modifica" #: tfrmmain.acteditcomment.caption msgid "Edit Co&mment..." msgstr "Modifica co&mmento..." #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "Modifica nuovo file" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "Modifica campo percorso precedente nella lista file" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "Scambia &pannelli" #: tfrmmain.actexit.caption msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "Es&ci" #: tfrmmain.actextractfiles.caption msgid "&Extract Files..." msgstr "&Estrai file..." #: tfrmmain.actfileassoc.caption msgid "File &Associations..." msgstr "&Associazioni file..." #: tfrmmain.actfilelinker.caption msgid "Com&bine Files..." msgstr "&Unisci file..." #: tfrmmain.actfileproperties.caption msgid "Show &File Properties" msgstr "Mostra proprietà &file" #: tfrmmain.actfilespliter.caption msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "D&ividi file..." #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "Attiva linea di comando" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "Posiziona cursore sul primo file in lista" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "Posiziona cursore sull'ultimo file in lista" #: tfrmmain.acthardlink.caption msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "Crea &Hard Link..." #: tfrmmain.acthelpindex.caption msgid "&Contents" msgstr "&Contenuti" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "Modalità &pannelli &orizzontali" #: tfrmmain.actkeyboard.caption msgid "&Keyboard" msgstr "&Tastiera" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "Sinistra &= Destra" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "Apri lista unità di sinistra" #: tfrmmain.actloadselectionfromclip.caption msgid "Load Selection from Clip&board" msgstr "Carica selezione dagli a&ppunti" #: tfrmmain.actloadselectionfromfile.caption msgid "&Load Selection from File..." msgstr "Carica selezione da &file..." #: tfrmmain.actmakedir.caption msgid "MakeDir" msgstr "Crea cartella" #: tfrmmain.actmarkcurrentextension.caption msgid "Select All with the Same E&xtension" msgstr "Seleziona tutti i file con la stessa e&stensione" #: tfrmmain.actmarkinvert.caption msgid "&Invert Selection" msgstr "&Inverti selezione" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "&Seleziona tutto" #: tfrmmain.actmarkminus.caption msgid "Unselect a Gro&up..." msgstr "Deseleziona un gr&uppo..." #: tfrmmain.actmarkplus.caption msgid "Select a &Group..." msgstr "Seleziona un &gruppo..." #: tfrmmain.actmarkunmarkall.caption msgid "&Unselect All" msgstr "&Deseleziona tutto" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "Minimizza finestra" #: tfrmmain.actmultirename.caption msgid "Multi &Rename Tool" msgstr "Strumento Multi-&Rinomina" #: tfrmmain.actnetworkconnect.caption msgid "Network &Connect..." msgstr "&Connetti alla Rete..." #: tfrmmain.actnetworkdisconnect.caption msgid "Network &Disconnect" msgstr "&Disconnetti dalla Rete" #: tfrmmain.actnetworkquickconnect.caption msgid "Network &Quick Connect..." msgstr "Connessione &rapida alla rete..." #: tfrmmain.actnewtab.caption msgid "&New Tab" msgstr "&Nuova scheda" #: tfrmmain.actnexttab.caption msgid "Switch to Nex&t Tab" msgstr "Vai alla scheda &successiva" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "Apri" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "Tenta di aprire l'archivio" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "Apri barra file" #: tfrmmain.actopendirinnewtab.caption msgid "Open &Folder in a New Tab" msgstr "Apri car&tella in una nuova scheda" #: tfrmmain.actopenvirtualfilesystemlist.caption msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "Apri lista &VFS" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "&Visualizzatore operazioni" #: tfrmmain.actoptions.caption msgid "&Options..." msgstr "&Opzioni..." #: tfrmmain.actpackfiles.caption msgid "&Pack Files..." msgstr "&Comprimi file..." #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "Imposta la posizione del divisore" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "Inc&olla" #: tfrmmain.actprevtab.caption msgid "Switch to &Previous Tab" msgstr "Vai alla scheda &precedente" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "Filtro rapido" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "Ricerca rapida" #: tfrmmain.actquickview.caption msgid "&Quick View Panel" msgstr "Pannello di visualizzazione &rapida" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "&Aggiorna" #: tfrmmain.actrename.caption msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "Sposta" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "Sposta/rinomina i file senza chiedere conferma" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "Rinomina" #: tfrmmain.actrenametab.caption msgid "&Rename Tab" msgstr "Ri&nomina scheda" #: tfrmmain.actrestoreselection.caption msgid "&Restore Selection" msgstr "&Ripristina selezione" #: tfrmmain.actreverseorder.caption msgid "Re&verse Order" msgstr "In&verti ordine" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "Destra &= Sinistra" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "Apri lista unità di destra" #: tfrmmain.actrunterm.caption msgid "Run &Terminal" msgstr "Avvia &terminale" #: tfrmmain.actsaveselection.caption msgid "Sa&ve Selection" msgstr "Sal&va selezione" #: tfrmmain.actsaveselectiontofile.caption msgid "Save S&election to File..." msgstr "Salva s&elezione su file..." #: tfrmmain.actsearch.caption msgid "&Search..." msgstr "&Ricerca..." #: tfrmmain.actsetfileproperties.caption msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "Cambia &attributi..." #: tfrmmain.actsettaboptiondirsinnewtab.caption msgid "Locked with Directories Opened in New &Tabs" msgstr "Bloccato con cartelle aperte in &nuove schede" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "&Normale" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "&Bloccato" #: tfrmmain.actsettaboptionpathresets.caption msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "Bloccato con modifiche alla &cartella consentite" #: tfrmmain.actshellexecute.caption msgctxt "TFRMMAIN.ACTSHELLEXECUTE.CAPTION" msgid "Open" msgstr "Apri" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "Apri usando le associazioni di file di sistema" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "Visualizza pulsante menu" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "Visualizza cronologia della linea di comando" #: tfrmmain.actshowmainmenu.caption msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "Menu" #: tfrmmain.actshowsysfiles.caption msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "Mostra file &nascosti/di sistema" #: tfrmmain.actsortbyattr.caption msgid "Sort by &Attributes" msgstr "Ordina per &attributi" #: tfrmmain.actsortbydate.caption msgid "Sort by &Date" msgstr "Ordina per da&ta" #: tfrmmain.actsortbyext.caption msgid "Sort by &Extension" msgstr "Ordina per &estensione" #: tfrmmain.actsortbyname.caption msgid "Sort by &Name" msgstr "Ordina per &nome" #: tfrmmain.actsortbysize.caption msgid "Sort by &Size" msgstr "Ordina per &dimensione" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "Attiva/disattiva la lista dei file da ignorare" #: tfrmmain.actsymlink.caption msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "Crea &Link Simbolico..." #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "Destinazione &= Sorgente" #: tfrmmain.acttestarchive.caption msgid "&Test Archive(s)" msgstr "&Verifica archivio(i)" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "Anteprime" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "Visualizza anteprime" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "Trasferisci cartella evidenziata dal cursore nella finestra di sinistra" #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "Trasferisci cartella evidenziata dal cursore nella finestra di destra" #: tfrmmain.actunmarkcurrentextension.caption msgid "Unselect All with the Same Ex&tension" msgstr "Deseleziona i file con la stessa estensione" #: tfrmmain.actview.caption msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "Visualizza" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "Mostra cronologia dei percorsi visitati per la vista attiva" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "Vai alla prossima voce nella cronologia" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "Vai alla voce precedente nella cronologia" #: tfrmmain.actvisithomepage.caption msgid "&Visit Double Commander Website" msgstr "&Visita il sito di Double Commander" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "Cancellazione sicura" #: tfrmmain.btnf10.caption msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "Esci" #: tfrmmain.btnf8.caption msgctxt "TFRMMAIN.BTNF8.CAPTION" msgid "Delete" msgstr "Elimina" #: tfrmmain.btnf9.caption msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "Terminale" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.HINT" msgid "Directory hotlist" msgstr "Cartelle preferite" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "<" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "Mostra la cartella corrente del pannello di destra in quello di sinistra" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnlefthome.hint msgctxt "TFRMMAIN.BTNLEFTHOME.HINT" msgid "Go to home directory" msgstr "Vai alla cartella home" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgctxt "TFRMMAIN.BTNLEFTROOT.HINT" msgid "Go to root directory" msgstr "Vai alla cartella radice" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgctxt "TFRMMAIN.BTNLEFTUP.HINT" msgid "Go to parent directory" msgstr "Vai alla cartella superiore" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr ">" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "Mostra la cartella corrente del pannello di sinistra nel pannello di destra" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "TFRMMAIN.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "Percorso" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "&20/80" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "&30/70" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "&40/60" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "&50/50" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "&60/40" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "&70/30" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "&80/20" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "Annulla" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "Copia..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "Crea collegamento..." #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline33.caption msgctxt "TFRMMAIN.MILINE33.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline37.caption msgctxt "TFRMMAIN.MILINE37.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "-" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "Pulisci" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "Copia" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "Nascondi" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "Seleziona tutto" #: tfrmmain.mimove.caption msgid "Move..." msgstr "Sposta..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "Crea un collegamento simbolico (simlink)" #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "Pannello Opzioni" #: tfrmmain.mitrayiconexit.caption msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "&Esci" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "Ripristina" #: tfrmmain.mnualloperpause.caption msgctxt "TFRMMAIN.MNUALLOPERPAUSE.CAPTION" msgid "||" msgstr "||" #: tfrmmain.mnualloperstart.caption msgctxt "TFRMMAIN.MNUALLOPERSTART.CAPTION" msgid "Start" msgstr "Avvio" #: tfrmmain.mnualloperstop.caption msgctxt "TFRMMAIN.MNUALLOPERSTOP.CAPTION" msgid "Cancel" msgstr "Annulla" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "&Comandi" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "C&onfigurazione" #: tfrmmain.mnufiles.caption msgid "&Files" msgstr "&File" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "&Aiuto" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "&Selezione" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "Rete" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "&Visualizza" #: tfrmmain.mnutaboptions.caption msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "&Opzioni" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "&Pannelli" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "CD" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "Copia" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "Taglia" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "Elimina" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "Modifica" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "Incolla" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmmaskinputdlg.btncancel.caption msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmmaskinputdlg.btndefinetemplate.caption msgid "&Define..." msgstr "&Definire..." #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmmaskinputdlg.lblsearchtemplate.caption msgid "O&r select predefined selection type:" msgstr "&O seleziona il tipo predefinito:" #: tfrmmkdir.btncancel.caption msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmmkdir.caption msgid "Create new directory" msgstr "Crea nuova cartella" #: tfrmmkdir.lblmakedir.caption msgid "&Input new directory name:" msgstr "&Inserisci un nuovo nome di cartella:" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "Pr" #: tfrmmodview.caption msgctxt "TFRMMODVIEW.CAPTION" msgid "New Size" msgstr "Nuova Dimensione" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "Altezza :" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgctxt "tfrmmodview.lblpath2.caption" msgid "2" msgstr "2" #: tfrmmodview.lblpath3.caption msgctxt "tfrmmodview.lblpath3.caption" msgid "3" msgstr "3" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "4" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "5" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "Qualità compressione Jpg" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "Larghezza :" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "BMP" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "ICO" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "JPG" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "PNG" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "PNM" #: tfrmmodview.teheight.text msgid "Height" msgstr "Altezza" #: tfrmmodview.tequality.text msgid "80" msgstr "80" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "Larghezza" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Chiudi" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "&Elimina" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "&Carica" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "&Rinomina" #: tfrmmultirename.btnrestore.caption msgid "Reset &all" msgstr "Reimposta &tutto" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "&Salva" #: tfrmmultirename.caption msgctxt "TFRMMULTIRENAME.CAPTION" msgid "MultiRename" msgstr "Strumento Multi-Rinomina" #: tfrmmultirename.cblog.caption msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "A&bilita" #: tfrmmultirename.cbregexp.caption msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "E&spressioni Regolari" #: tfrmmultirename.cbusesubs.caption msgid "&Use substitution" msgstr "&Usa la sostituzione" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption msgid "[E] Extension" msgstr "[E] Estensione" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "Contatore" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "Trova && Sostituisci" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "Registra risultati" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "Filtro" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "Preset" #: tfrmmultirename.lbext.caption msgid "&Extension" msgstr "&Estensione" #: tfrmmultirename.lbfind.caption msgid "&Find..." msgstr "&Trova..." #: tfrmmultirename.lbinterval.caption msgid "&Interval" msgstr "&Intervallo" #: tfrmmultirename.lbname.caption msgid "File &Name" msgstr "&Nome file" #: tfrmmultirename.lbreplace.caption msgid "Re&place..." msgstr "&Sostituisci" #: tfrmmultirename.lbstnb.caption msgid "S&tart Number" msgstr "Numero di p&artenza" #: tfrmmultirename.lbwidth.caption msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "&Larghezza" #: tfrmmultirename.micounter.caption msgid "[C] Counter" msgstr "[C] Contatore" #: tfrmmultirename.miday.caption msgid "[D] Day" msgstr "[D] Giorno" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "[DD] Giorno (2 cifre)" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "[DDD] Giorno della settimana(corto, es: \"lun\")" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "[DDDD] Giorno della settimana(lungo, es: \"lunedì\")" #: tfrmmultirename.miextensionx.caption msgid "[Ex] Character at position x" msgstr "[Ex] Carattere alla posizione x" #: tfrmmultirename.miextensionxx.caption msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:y] Caratteri dalla posizione x a y" #: tfrmmultirename.mihour.caption msgid "[h] Hour" msgstr "[h] Ora" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "[hh] Ora (2 cifre)" #: tfrmmultirename.miminute.caption msgid "[n] Minute" msgstr "[n] Minuto" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "[nn] Minuto (2 cifre)" #: tfrmmultirename.mimonth.caption msgid "[M] Month" msgstr "[M] Mese" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "[MM] Mese (2 cifre)" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "[MMM] Nome mese(corto, es : \"gen\")" #: tfrmmultirename.mimonth3.caption msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "[MMMM] Nome del mese(lungo, es : \"gennaio\")" #: tfrmmultirename.miname.caption msgid "[N] Name" msgstr "[N] Nome" #: tfrmmultirename.minamex.caption msgid "[Nx] Character at position x" msgstr "[Nx] Carattere alla posizione x" #: tfrmmultirename.minamexx.caption msgid "[Nx:y] Characters from position x to y" msgstr "[Nx:y] Carattere dalla posizione x a y" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "Ora..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "Estensione..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "Nome..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "Plugin" #: tfrmmultirename.misecond.caption msgid "[s] Second" msgstr "[s] Secondi" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "[ss] Secondi (2 cifre)" #: tfrmmultirename.miyear.caption msgid "[Y] Year (2 digits)" msgstr "[Y] Anni (2 cifre)" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "[YYYY] Anni (4 cifre)" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "TFRMMULTIRENAME.STRINGGRID.COLUMNS[0].TITLE.CAPTION" msgid "Old File Name" msgstr "Vecchio nome del file" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "TFRMMULTIRENAME.STRINGGRID.COLUMNS[1].TITLE.CAPTION" msgid "New File Name" msgstr "Nuovo nome del file" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "TFRMMULTIRENAME.STRINGGRID.COLUMNS[2].TITLE.CAPTION" msgid "File Path" msgstr "Percorso del file" #: tfrmopenwith.caption msgid "Choose an application" msgstr "Scegli un'applicazione" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "Comando personalizzato" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "Salva associazione" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "Setta l'applicazione selezionata come azione predefinita" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "Tipo di file da aprire: %s" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "Nomi di file multipli" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "%F" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "URI multipli" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "%U" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "Nome di file singolo" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "%f" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "URI singolo" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "%u" #: tfrmoptions.btnapply.caption msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "&Applica" #: tfrmoptions.btncancel.caption msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmoptions.caption msgctxt "TFRMOPTIONS.CAPTION" msgid "Options" msgstr "Opzioni" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "Si prega si selezionare una delle sotto pagine, questa pagina non contiene alcuna impostazione" #: tfrmoptionsarchivers.btnautoconfig.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNAUTOCONFIG.CAPTION" msgid "A&uto Configure" msgstr "Config.a&utomatica" #: tfrmoptionsarchivers.btnmultiarcadd.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCADD.CAPTION" msgid "A&dd" msgstr "A&ggiungi" #: tfrmoptionsarchivers.btnmultiarcapply.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCAPPLY.CAPTION" msgid "A&pply" msgstr "A&pplica" #: tfrmoptionsarchivers.btnmultiarcdelete.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCDELETE.CAPTION" msgid "D&elete" msgstr "E&limina" #: tfrmoptionsarchivers.btnmultiarcrename.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCRENAME.CAPTION" msgid "&Rename" msgstr "&Rinomina" #: tfrmoptionsarchivers.chkmultiarcdebug.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCDEBUG.CAPTION" msgid "De&bug mode" msgstr "De&bug mode" #: tfrmoptionsarchivers.chkmultiarcenabled.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCENABLED.CAPTION" msgid "E&nabled" msgstr "A&bilita" #: tfrmoptionsarchivers.chkmultiarcoutput.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCOUTPUT.CAPTION" msgid "S&how console output" msgstr "M&ostra output della console" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "TFRMOPTIONSARCHIVERS.GBARCHIVEROPTIONS.CAPTION" msgid "Options" msgstr "Opzioni" #: tfrmoptionsarchivers.lblarchiveadd.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEADD.CAPTION" msgid "Add&ing:" msgstr "Agg&iungi:" #: tfrmoptionsarchivers.lblarchiveextension.caption msgctxt "tfrmoptionsarchivers.lblarchiveextension.caption" msgid "E&xtension:" msgstr "E&stensione:" #: tfrmoptionsarchivers.lblarchiveextract.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTRACT.CAPTION" msgid "Ex&tract:" msgstr "Es&trai:" #: tfrmoptionsarchivers.lblarchivelist.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELIST.CAPTION" msgid "&List:" msgstr "&Lista" #: tfrmoptionsarchivers.lblarchivelistend.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTEND.CAPTION" msgid "Listing &finish (optional):" msgstr "Elencazione &finita (opzionale):" #: tfrmoptionsarchivers.lblarchivelistformat.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTFORMAT.CAPTION" msgid "Listing for&mat:" msgstr "For&mato lista:" #: tfrmoptionsarchivers.lblarchiveliststart.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTSTART.CAPTION" msgid "Listin&g start (optional):" msgstr "Avvio elencazione (opzionale):" #: tfrmoptionsarchivers.lblarchiver.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVER.CAPTION" msgid "Arc&hiver:" msgstr "Arc&hiviatore:" #: tfrmoptionsarchivers.lbldescription.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLDESCRIPTION.CAPTION" msgid "De&scription:" msgstr "De&scrizione:" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERADDITIONAL.CAPTION" msgid "Additional" msgstr "Addizionale" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERGENERAL.CAPTION" msgid "General" msgstr "Generale" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHATTRIBUTESCHANGE.CAPTION" msgid "When &size, date or attributes change" msgstr "Quando dimen&sione, data o attributi cambiano" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHEXCLUDEDIRS.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "Per i seguenti &percorsi e relative sottocartelle:" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHFILENAMECHANGE.CAPTION" msgid "When &files are created, deleted or renamed" msgstr "Quando i file sono &creati, eliminati o rinominati" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHONLYFOREGROUND.CAPTION" msgid "When application is in the &background" msgstr "Quando l'applicazione è in secondo &piano" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHDISABLE.CAPTION" msgid "Disable auto-refresh" msgstr "Disabilita auto-aggiornamento" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHENABLE.CAPTION" msgid "Refresh file list" msgstr "Aggiorna lista file" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBALWAYSSHOWTRAYICON.CAPTION" msgid "Al&ways show tray icon" msgstr "Tray icon sempre &visibile " #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption msgid "Automatically &hide unmounted devices" msgstr "&Nascondi automaticamente i dispositivi smontati" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBMINIMIZETOTRAY.CAPTION" msgid "Mo&ve icon to system tray when minimized" msgstr "Sposta icone nella s&ystem tray quando minimizzato" #: tfrmoptionsbehavior.cbonlyonce.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBONLYONCE.CAPTION" msgid "A&llow only one copy of DC at a time" msgstr "C&onsenti solo una copia di DC in esecuzione" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "Qui puoi inserire una o più unità o punti di mount, separati da \";\"" #: tfrmoptionsbehavior.lbldrivesblacklist.caption msgid "Drives &blacklist" msgstr "Lista &nera delle unità" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption msgid "Cut &text to column width" msgstr "Taglia &testo alla larghezza colonna" #: tfrmoptionscolumnsview.cbgridhorzline.caption msgid "&Horizontal lines" msgstr "Linee &orizzontali" #: tfrmoptionscolumnsview.cbgridvertline.caption msgid "&Vertical lines" msgstr "Linee &verticali" #: tfrmoptionscolumnsview.chkautofillcolumns.caption msgid "A&uto fill columns" msgstr "A&uto-riempimento colonna" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "Mostra griglia" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "Auto-ridimensionamento colonne" #: tfrmoptionscolumnsview.lblautosizecolumn.caption msgid "Auto si&ze column:" msgstr "Dimen&sione automatica colonna" #: tfrmoptionsconfiguration.btnconfigapply.caption msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGAPPLY.CAPTION" msgid "A&pply" msgstr "A&pplica" #: tfrmoptionsconfiguration.btnconfigedit.caption msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGEDIT.CAPTION" msgid "&Edit" msgstr "&Modifica" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption msgid "Co&mmand line history" msgstr "Cronologia linea di co&mando" #: tfrmoptionsconfiguration.cbdirhistory.caption msgctxt "TFRMOPTIONSCONFIGURATION.CBDIRHISTORY.CAPTION" msgid "&Directory history" msgstr "Cronologia &cartelle" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption msgid "&File mask history" msgstr "&Cronologia filtri file" #: tfrmoptionsconfiguration.chksaveconfiguration.caption msgid "Sa&ve configuration" msgstr "Sal&va configurazione" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption msgid "Searc&h/Replace history" msgstr "Cronologia Trov&a/Sostituisci" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgid "Location of configuration files" msgstr "Posizione file di configurazione" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgid "Save on exit" msgstr "Salva all'uscita" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgid "Set on command line" msgstr "Imposta sulla linea di comando" #: tfrmoptionsconfiguration.rbprogramdir.caption msgid "P&rogram directory (portable version)" msgstr "Cartella p&rogramma (versione portabile)" #: tfrmoptionsconfiguration.rbuserhomedir.caption msgid "&User home directory" msgstr "Cartella home dell'&utente" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNCOPYCOLUMNSSET.CAPTION" msgid "C&opy" msgstr "C&opia" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNDELCOLUMNSSET.CAPTION" msgid "&Delete" msgstr "&Elimina" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNEDITCOLUMNSSET.CAPTION" msgid "&Edit" msgstr "&Modifica" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNNEWCOLUMNSSET.CAPTION" msgid "&New" msgstr "&Nuovo" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.CBBFILESYSTEM.TEXT" msgid "General" msgstr "Generale" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption msgid "Con&figure columns for file system:" msgstr "Con&figura colone per file system:" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption msgid "&Show confirmation dialog after drop" msgstr "&Mostra finestra di conferma dopo il rilascio dell'oggetto" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption msgid "Show &file system" msgstr "Mostra &file system" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption msgid "Show fr&ee space" msgstr "Mostra spazio lib&ero" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption msgid "Show &label" msgstr "Mostra &etichetta" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "Lista unità" #: tfrmoptionseditorcolors.backgroundlabel.caption msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "S&fondo" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption msgctxt "TFRMOPTIONSEDITORCOLORS.BACKGROUNDUSEDEFAULTCHECKBOX.CAPTION" msgid "Bac&kground" msgstr "S&fondo" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "Attributi degli elementi" #: tfrmoptionseditorcolors.foregroundlabel.caption msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "P&rimo piano" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption msgctxt "TFRMOPTIONSEDITORCOLORS.FOREGROUNDUSEDEFAULTCHECKBOX.CAPTION" msgid "Fo®round" msgstr "P&rimo piano" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption msgid "&Text-mark" msgstr "&Selezione-testo" #: tfrmoptionseditorcolors.tbtnglobal.caption msgid "Use (and edit) &global scheme settings" msgstr "Usa (e modifica) schemi di impostazione &globale" #: tfrmoptionseditorcolors.tbtnlocal.caption msgid "Use &local scheme settings" msgstr "Usa schemi di impostazione &locale" #: tfrmoptionseditorcolors.textboldcheckbox.caption msgid "&Bold" msgstr "&Grassetto" #: tfrmoptionseditorcolors.textboldradioinvert.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTBOLDRADIOINVERT.CAPTION" msgid "In&vert" msgstr "In&verti" #: tfrmoptionseditorcolors.textboldradiooff.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTBOLDRADIOOFF.CAPTION" msgid "O&ff" msgstr "O&ff" #: tfrmoptionseditorcolors.textboldradioon.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTBOLDRADIOON.CAPTION" msgid "O&n" msgstr "O&n" #: tfrmoptionseditorcolors.textitaliccheckbox.caption msgid "&Italic" msgstr "&Corsivo" #: tfrmoptionseditorcolors.textitalicradioinvert.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTITALICRADIOINVERT.CAPTION" msgid "In&vert" msgstr "In&verti" #: tfrmoptionseditorcolors.textitalicradiooff.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTITALICRADIOOFF.CAPTION" msgid "O&ff" msgstr "O&ff" #: tfrmoptionseditorcolors.textitalicradioon.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTITALICRADIOON.CAPTION" msgid "O&n" msgstr "O&n" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption msgid "&Strike Out" msgstr "&Cancellare" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTRADIOINVERT.CAPTION" msgid "In&vert" msgstr "In&verti" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTRADIOOFF.CAPTION" msgid "O&ff" msgstr "O&ff" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTRADIOON.CAPTION" msgid "O&n" msgstr "O&n" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption msgid "&Underline" msgstr "&Sottolinea" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "In&verti" #: tfrmoptionseditorcolors.textunderlineradiooff.caption msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "O&ff" #: tfrmoptionseditorcolors.textunderlineradioon.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "O&n" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "Operazione di cop&ia" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "Operazione di &eliminazione" #: tfrmoptionsfileoperations.cbdeletetotrash.caption msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "Elimina dal cestino (il tasto shift inverte questa impostazione)" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "Operazione di e&liminazione dal cestino" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDROPREADONLYFLAG.CAPTION" msgid "D&rop readonly flag" msgstr "&Rimuovi proprietà sola lettura" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "Operazione di s&postamento" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption msgid "&Search for part of file name" msgstr "&Cerca parte del nome del file" #: tfrmoptionsfileoperations.cbprocesscomments.caption msgid "&Process comments with files/folders" msgstr "&Processa commenti con file/cartelle" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption msgid "Select &file name without extension when renaming" msgstr "Seleziona solo il nome del &file quando si rinomina (non l'estensione)" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption msgid "Sho&w tab select panel in copy/move dialog" msgstr "Mostr&a pannello di selezione nella finestra di dialogo copia/sposta" #: tfrmoptionsfileoperations.cbskipfileoperror.caption msgid "S&kip file operations errors and write them to log window" msgstr "S&alta operazioni sui file con errori e riportali nella finestra di registro operazioni" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "Esecuzione di operazioni" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "tfrmoptionsfileoperations.gbfilesearch.caption" msgid "File search" msgstr "Cerca file" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "Interfaccia utente" #: tfrmoptionsfileoperations.lblbuffersize.caption msgid "&Buffer size for file operations (in KB):" msgstr "Dimensione del &Buffer per operazioni sui file (in kB):" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "Mostra finestra di conferma per:" #: tfrmoptionsfileoperations.lblprogresskind.caption msgid "Show operations progress &initially in" msgstr "Mostra &inizialmente il progresso delle operazioni in:" #: tfrmoptionsfileoperations.lblwipepassnumber.caption msgid "&Number of wipe passes:" msgstr "&Numero passaggi di cancellazione sicura" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption msgid "Use memory mapping for search te&xt in files" msgstr "Usa mappatura della memoria per la ricerca di te&sto nei file" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption msgid "&Use stream for search text in files" msgstr "&Usa stream per la ricerca di testo nei file" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption msgid "Use &Frame Cursor" msgstr "Usa il cursore &Frame" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption msgid "Use &Gradient Indicator" msgstr "Usa &indicatore gradiente" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption msgid "U&se Inverted Selection" msgstr "U&sa selezione invertita" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.DBFREESPACEINDICATOR.CAPTION" msgid "Drive Free Space Indicator" msgstr "Indicatore di spazio libero sull'unità" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.GBEXAMPLE.CAPTION" msgid "Example" msgstr "Esempio" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption msgid "Bac&kground:" msgstr "Sfo&ndo:" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR2.CAPTION" msgid "Backg&round 2:" msgstr "Sfon&do 2:" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORCOLOR.CAPTION" msgid "C&ursor Color:" msgstr "C&olore Cursore:" #: tfrmoptionsfilepanelscolors.lblcursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORTEXT.CAPTION" msgid "Cursor Te&xt:" msgstr "Te&sto Cursore:" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption msgid "&Brightness level of inactive panel" msgstr "Livello di &luminosità del pannello inattivo" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption msgid "In&dicator Back Color:" msgstr "Indicat.color.s&fondo:" #: tfrmoptionsfilepanelscolors.lblindcolor.caption msgid "&Indicator Fore Color:" msgstr "Indicat.color.Primo&Piano:" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLMARKCOLOR.CAPTION" msgid "&Mark Color:" msgstr "&Selezione colore:" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLTEXTCOLOR.CAPTION" msgid "T&ext Color:" msgstr "Colore t&esto:" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption msgid "Do&n't load file list until a tab is activated" msgstr "No&n caricare la lista di file finché una scheda viene attivata" #: tfrmoptionsfilesviews.cbdirbrackets.caption msgid "S&how square brackets around directories" msgstr "&Mostra parentesi quadre attorno alle cartelle" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption msgid "Hi&ghlight new and updated files" msgstr "Evi&denzia i file nuovi/aggiornati" #: tfrmoptionsfilesviews.cblistfilesinthread.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBLISTFILESINTHREAD.CAPTION" msgid "Load &file list in separate thread" msgstr "Carica lista &file in un processo separato" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBLOADICONSSEPARATELY.CAPTION" msgid "Load icons af&ter file list" msgstr "Carica le icone &dopo la lista file" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBSHOWSYSTEMFILES.CAPTION" msgid "Show s&ystem and hidden files" msgstr "Mostra file nascosti/di s&istema" #: tfrmoptionsfilesviews.cbspacemovesdown.caption msgid "&When selecting files with , move down to next file (as with )" msgstr "&Quando si selezionano file con , il cursore viene spostato sul file successivo (come )" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "Formattazione" #: tfrmoptionsfilesviews.gbsorting.caption msgid "Sorting" msgstr "Ordinamento" #: tfrmoptionsfilesviews.lblcasesensitivity.caption msgid "Case s&ensitivity:" msgstr "Di&stingui maiusc./minusc.:" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "Formato non corretto" #: tfrmoptionsfilesviews.lbldatetimeformat.caption msgid "&Date and time format:" msgstr "Formato &data e ora:" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "Formato della dimen&sione file" #: tfrmoptionsfilesviews.lblnewfilesposition.caption msgid "&Insert new files" msgstr "&Inserisci nuovi file" #: tfrmoptionsfilesviews.lblsortfoldermode.caption msgid "So&rting directories:" msgstr "O&rdinamento cartelle:" #: tfrmoptionsfilesviews.lblsortmethod.caption msgid "&Sort method:" msgstr "&Metodo di ordinamento:" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption msgid "&Move updated files" msgstr "&Sposta file aggiornati" #: tfrmoptionsfiletypescolors.btnaddcategory.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNADDCATEGORY.CAPTION" msgid "A&dd" msgstr "A&ggiungi" #: tfrmoptionsfiletypescolors.btnapplycategory.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNAPPLYCATEGORY.CAPTION" msgid "A&pply" msgstr "A&pplica" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNCATEGORYCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNDELETECATEGORY.CAPTION" msgid "D&elete" msgstr "&Elimina" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Modello..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption msgid "File types colors (sort by drag&&drop)" msgstr "Colore dei tipi di file (ordina con drag&&drop)" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption msgid "Category a&ttributes:" msgstr "&Attributi categoria:" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption msgid "Category co&lor:" msgstr "Co&lore categoria:" #: tfrmoptionsfiletypescolors.lblcategorymask.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYMASK.CAPTION" msgid "Category &mask:" msgstr "&Filtro categoria:" #: tfrmoptionsfiletypescolors.lblcategoryname.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYNAME.CAPTION" msgid "Category &name:" msgstr "&Nome categoria:" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELEDITFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELLOGFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELMAINFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWERBOOKFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.lbleditorfont.caption msgctxt "TFRMOPTIONSFONTS.LBLEDITORFONT.CAPTION" msgid "&Editor font" msgstr "Font &editor" #: tfrmoptionsfonts.lbllogfont.caption msgctxt "TFRMOPTIONSFONTS.LBLLOGFONT.CAPTION" msgid "&Log font" msgstr "&Registra font" #: tfrmoptionsfonts.lblmainfont.caption msgctxt "TFRMOPTIONSFONTS.LBLMAINFONT.CAPTION" msgid "Main &font" msgstr "&Font principale" #: tfrmoptionsfonts.lblviewerbookfont.caption msgctxt "TFRMOPTIONSFONTS.LBLVIEWERBOOKFONT.CAPTION" msgid "Viewer&Book Font" msgstr "Visualizzatore &Book Font" #: tfrmoptionsfonts.lblviewerfont.caption msgctxt "TFRMOPTIONSFONTS.LBLVIEWERFONT.CAPTION" msgid "&Viewer font" msgstr "&Visualizzatore font" #: tfrmoptionshotkeys.btnaddhotkey.caption msgid "Add &hotkey" msgstr "&Aggiungi scorciatoia" #: tfrmoptionshotkeys.btndeletehotkey.caption msgid "&Delete hotkey" msgstr "&Elimina scorciatoia" #: tfrmoptionshotkeys.btnedithotkey.caption msgctxt "TFRMOPTIONSHOTKEYS.BTNEDITHOTKEY.CAPTION" msgid "&Edit hotkey" msgstr "&Modifica scorciatoia" #: tfrmoptionshotkeys.lbfilter.caption msgctxt "TFRMOPTIONSHOTKEYS.LBFILTER.CAPTION" msgid "&Filter" msgstr "&Filtro" #: tfrmoptionshotkeys.lblcategories.caption msgctxt "TFRMOPTIONSHOTKEYS.LBLCATEGORIES.CAPTION" msgid "C&ategories:" msgstr "C&ategorie:" #: tfrmoptionshotkeys.lblcommands.caption msgctxt "TFRMOPTIONSHOTKEYS.LBLCOMMANDS.CAPTION" msgid "Co&mmands:" msgstr "Co&mandi:" #: tfrmoptionshotkeys.lblscfiles.caption msgctxt "TFRMOPTIONSHOTKEYS.LBLSCFILES.CAPTION" msgid "&Shortcut files:" msgstr "&Scorciatoia file:" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[0].TITLE.CAPTION" msgid "Hotkey" msgstr "Scorciatoie" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[1].TITLE.CAPTION" msgid "Parameters" msgstr "Parametri" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[2].TITLE.CAPTION" msgid "Controls" msgstr "Controlli" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "Per i seguenti &percorsi e le relative sottocartelle:" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "Mostra icone per le azioni nei &menu" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "TFRMOPTIONSICONS.CBICONSINMENUSSIZE.TEXT" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption msgctxt "TFRMOPTIONSICONS.CBICONSSHOWOVERLAY.CAPTION" msgid "Show o&verlay icons, e.g. for links" msgstr "Mostra i&cone sostitutive, ad es. per i collegamenti" #: tfrmoptionsicons.cbiconssize.text msgctxt "TFRMOPTIONSICONS.CBICONSSIZE.TEXT" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "Disabilita icone speciali" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "Icone nei menu" #: tfrmoptionsicons.gbiconssize.caption msgctxt "TFRMOPTIONSICONS.GBICONSSIZE.CAPTION" msgid " Icon size " msgstr " Dimen&sione Icona " #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "TFRMOPTIONSICONS.GBSHOWICONSMODE.CAPTION" msgid " Show icons to the left of the filename " msgstr " Mostra icone alla sinistra del nome file " #: tfrmoptionsicons.rbiconsshowall.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALL.CAPTION" msgid "A&ll" msgstr "&Tutto" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALLANDEXE.CAPTION" msgid "All associated + &EXE/LNK (slow)" msgstr "Tutti gli associati + &EXE/LNK (lento)" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWNONE.CAPTION" msgid "&No icons" msgstr "&No icone" #: tfrmoptionsicons.rbiconsshowstandard.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWSTANDARD.CAPTION" msgid "Only &standard icons" msgstr "S&olo icone predefinite" #: tfrmoptionsignorelist.btnaddsel.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSEL.CAPTION" msgid "A&dd selected names" msgstr "&Aggiungi nomi selezionati" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSELWITHPATH.CAPTION" msgid "Add selected names with &full path" msgstr "Aggiungi nomi selezionati con percorso co&mpleto" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "TFRMOPTIONSIGNORELIST.CHKIGNOREENABLE.CAPTION" msgid "&Ignore (don't show) the following files and folders:" msgstr "&Ignora (non mostrare) i seguenti file e cartelle:" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "TFRMOPTIONSIGNORELIST.LBLSAVEIN.CAPTION" msgid "&Save in:" msgstr "&Salva in:" #: tfrmoptionskeyboard.cblynxlike.caption msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "Le frecce sinistra e destra cambiano cartella (movimenti stile Lynx)" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "Digitazione" #: tfrmoptionskeyboard.lblalt.caption msgctxt "TFRMOPTIONSKEYBOARD.LBLALT.CAPTION" msgid "Alt+L&etters" msgstr "Alt+L&ettere" #: tfrmoptionskeyboard.lblctrlalt.caption msgctxt "TFRMOPTIONSKEYBOARD.LBLCTRLALT.CAPTION" msgid "Ctrl+Alt+Le&tters" msgstr "Ctrl+Alt+Le&ttere" #: tfrmoptionskeyboard.lblnomodifier.caption msgctxt "TFRMOPTIONSKEYBOARD.LBLNOMODIFIER.CAPTION" msgid "&Letters" msgstr "&Lettere" #: tfrmoptionslayout.cbflatdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBFLATDISKPANEL.CAPTION" msgid "&Flat buttons" msgstr "Pulsanti &piatti" #: tfrmoptionslayout.cbflatinterface.caption msgctxt "TFRMOPTIONSLAYOUT.CBFLATINTERFACE.CAPTION" msgid "Flat i&nterface" msgstr "I&nterfaccia piatta" #: tfrmoptionslayout.cbflattoolbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBFLATTOOLBAR.CAPTION" msgid "Flat b&uttons" msgstr "P&ulsanti piatti" #: tfrmoptionslayout.cbfreespaceind.caption msgctxt "TFRMOPTIONSLAYOUT.CBFREESPACEIND.CAPTION" msgid "Show fr&ee space indicator on drive label" msgstr "Mostra indicatore spazio lib&ero sull'etichetta unità" #: tfrmoptionslayout.cblogwindow.caption msgctxt "TFRMOPTIONSLAYOUT.CBLOGWINDOW.CAPTION" msgid "Show lo&g window" msgstr "Mostra finestra di registro operazioni" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "TFRMOPTIONSLAYOUT.CBPANELOFOPERATIONS.CAPTION" msgid "Show panel of operation in background" msgstr "Mostra pannello di registro operazioni in secondo piano" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "TFRMOPTIONSLAYOUT.CBPROGINMENUBAR.CAPTION" msgid "Show common progress in menu bar" msgstr "Mostra progressi comuni nella barra menu" #: tfrmoptionslayout.cbshowcmdline.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCMDLINE.CAPTION" msgid "Show command l&ine" msgstr "Mostra &linea di comando" #: tfrmoptionslayout.cbshowcurdir.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCURDIR.CAPTION" msgid "Show current director&y" msgstr "Mostra &cartella corrente" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDISKPANEL.CAPTION" msgid "Show &drive buttons" msgstr "Mostra pulsanti uni&tà" #: tfrmoptionslayout.cbshowdrivefreespace.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDRIVEFREESPACE.CAPTION" msgid "Show free s&pace label" msgstr "Mostra etichetta s&pazio libero" #: tfrmoptionslayout.cbshowdriveslistbutton.caption msgid "Show drives list bu&tton" msgstr "Mostra pulsan&te lista unità" #: tfrmoptionslayout.cbshowkeyspanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWKEYSPANEL.CAPTION" msgid "Show function &key buttons" msgstr "Mostra i tasti &funzione" #: tfrmoptionslayout.cbshowmainmenu.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINMENU.CAPTION" msgid "Show &main menu" msgstr "Mostra &menu principale" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINTOOLBAR.CAPTION" msgid "Show &button bar" msgstr "Mostra barra &pulsanti" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption msgid "Show short free space &label" msgstr "Mostra &etichetta breve di spazio libero" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWSTATUSBAR.CAPTION" msgid "Show &status bar" msgstr "Mostra barra di &stato" #: tfrmoptionslayout.cbshowtabheader.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABHEADER.CAPTION" msgid "S&how tabstop header" msgstr "Mostra le intestazioni delle schede" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABS.CAPTION" msgid "Sho&w folder tabs" msgstr "Mostra le schede" #: tfrmoptionslayout.cbtermwindow.caption msgctxt "TFRMOPTIONSLAYOUT.CBTERMWINDOW.CAPTION" msgid "Show te&rminal window" msgstr "Mostra finestra te&rminale" #: tfrmoptionslayout.cbtwodiskpanels.caption msgctxt "TFRMOPTIONSLAYOUT.CBTWODISKPANELS.CAPTION" msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "Mostra due barre pulsanti di unità (larghezza fi&ssa, sopra le finestre file)" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "TFRMOPTIONSLAYOUT.GBSCREENLAYOUT.CAPTION" msgid " Screen layout " msgstr "Disposizione schermo" #: tfrmoptionslog.cblogarcop.caption msgctxt "TFRMOPTIONSLOG.CBLOGARCOP.CAPTION" msgid "&Pack/Unpack" msgstr "&Comprimi/decomprimi" #: tfrmoptionslog.cblogcpmvln.caption msgctxt "TFRMOPTIONSLOG.CBLOGCPMVLN.CAPTION" msgid "Cop&y/Move/Create link/symlink" msgstr "Cop&ia/Sposta/Crea collegamento/simlink" #: tfrmoptionslog.cblogdelete.caption msgctxt "TFRMOPTIONSLOG.CBLOGDELETE.CAPTION" msgid "&Delete" msgstr "&Elimina" #: tfrmoptionslog.cblogdirop.caption msgctxt "TFRMOPTIONSLOG.CBLOGDIROP.CAPTION" msgid "Crea&te/Delete directories" msgstr "Cre&a/Elimina cartelle" #: tfrmoptionslog.cblogerrors.caption msgctxt "TFRMOPTIONSLOG.CBLOGERRORS.CAPTION" msgid "Log &errors" msgstr "Registra &errori" #: tfrmoptionslog.cblogfile.caption msgctxt "TFRMOPTIONSLOG.CBLOGFILE.CAPTION" msgid "C&reate a log file:" msgstr "&Crea file di registro:" #: tfrmoptionslog.cbloginfo.caption msgctxt "TFRMOPTIONSLOG.CBLOGINFO.CAPTION" msgid "Log &information messages" msgstr "Registra messaggi di &informazione" #: tfrmoptionslog.cblogsuccess.caption msgctxt "TFRMOPTIONSLOG.CBLOGSUCCESS.CAPTION" msgid "Log &successful operations" msgstr "Registra &operazioni eseguite con successo" #: tfrmoptionslog.cblogvfs.caption msgctxt "TFRMOPTIONSLOG.CBLOGVFS.CAPTION" msgid "&File system plugins" msgstr "Plugin del &File system" #: tfrmoptionslog.gblogfile.caption msgctxt "TFRMOPTIONSLOG.GBLOGFILE.CAPTION" msgid "File operation log file" msgstr "File di registro operazioni" #: tfrmoptionslog.gblogfileop.caption msgid "Log operations" msgstr "Registro operazioni" #: tfrmoptionslog.gblogfilestatus.caption msgid "Operation status" msgstr "Stato operazioni" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "&Rimuovi anteprime per file non più esistenti" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "&Vai sempre alla radice quando si cambia unità" #: tfrmoptionsmisc.chkshowwarningmessages.caption msgctxt "TFRMOPTIONSMISC.CHKSHOWWARNINGMESSAGES.CAPTION" msgid "Show &warning messages (\"OK\" button only)" msgstr "Mostra messaggi di avvertimento (solo pulsante \"OK\")" #: tfrmoptionsmisc.chkthumbsave.caption msgctxt "TFRMOPTIONSMISC.CHKTHUMBSAVE.CAPTION" msgid "&Save thumbnails in cache" msgstr "&Salva anteprime in cache" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "TFRMOPTIONSMISC.DBLTHUMBNAILS.CAPTION" msgid "Thumbnails" msgstr "Anteprime" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "pixel" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "TFRMOPTIONSMISC.LBLTHUMBSEPARATOR.CAPTION" msgid "X" msgstr "X" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "&Dimensione anteprime:" #: tfrmoptionsmouse.cbselectionbymouse.caption msgid "&Selection by mouse" msgstr "&Selezione da mouse" #: tfrmoptionsmouse.gbscrolling.caption msgid "Scrolling" msgstr "Scorrimento" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "Selezione" #: tfrmoptionsmouse.lblmousemode.caption msgid "&Mode:" msgstr "&Modo:" #: tfrmoptionsmouse.rbscrolllinebyline.caption msgid "&Line by line" msgstr "&Linea per linea" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption msgid "Line by line &with cursor movement" msgstr "Linea per linea &con movimento del cursore" #: tfrmoptionsmouse.rbscrollpagebypage.caption msgid "&Page by page" msgstr "&Pagina per pagina" #: tfrmoptionsplugins.btnaddplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "A&ggiungi" #: tfrmoptionsplugins.btnconfigplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "Con&figura" #: tfrmoptionsplugins.btnenableplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "A&bilita" #: tfrmoptionsplugins.btnremoveplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "&Elimina" #: tfrmoptionsplugins.btntweakplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "Tweak" #: tfrmoptionsplugins.lbldsxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "I plugin di ricer&ca consentono di usare algoritmi di ricerca alternativi o strumenti esterni (come \"locate\", ecc.)" #: tfrmoptionsplugins.lblwcxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "I plugin dei compr&essori sono usati per aprire archivi non supportati internamente da Double Commander." #: tfrmoptionsplugins.lblwdxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "I plu&gin di contenuto permettono di visualizzare dettagli estesi sui file come tag mp3 o attributi di immagine nella lista file, o di usarli negli strumenti di ricerca e nello strumento Multi-Rinomina." #: tfrmoptionsplugins.lblwfxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "I plugin del Fi&le system permettono l'accesso a dischi altrimenti inaccessibili dal sistema operativo o a dispositivi esterni come Palm/PockePC." #: tfrmoptionsplugins.lblwlxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "I plugin del visualizzatore consentono di aprire formati di file come immagini, fogli elettronici, database ecc. in Visualizza/Mostra (F3, Ctrl+Q)" #: tfrmoptionsplugins.stgplugins.columns[0].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[0].TITLE.CAPTION" msgid "Active" msgstr "Attiva" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[1].TITLE.CAPTION" msgid "Plugin" msgstr "Plugin" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[2].TITLE.CAPTION" msgid "Registered for" msgstr "Registrato per" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[3].TITLE.CAPTION" msgid "File name" msgstr "Nome file" #: tfrmoptionsplugins.tsdsx.caption msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "&Plugin ricerca (.DSX)" #: tfrmoptionsplugins.tswcx.caption msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "Plugin &compressori (.WCX)" #: tfrmoptionsplugins.tswdx.caption msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "Pl&ugin contenuto (.WDX)" #: tfrmoptionsplugins.tswfx.caption msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "Plugin F&ile system (.WFX)" #: tfrmoptionsplugins.tswlx.caption msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "Plugin &visualizzatore (.WLX)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTBEGINNING.CAPTION" msgid "&Beginning (name must start with first typed character)" msgstr "&Iniziale (il nome deve iniziare con il primo carattere digitato)" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTENDING.CAPTION" msgid "En&ding (last character before a typed dot . must match)" msgstr "Fi&nale (l'ultimo carattere digitato prima del punto . deve corrispondere)" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CGPOPTIONS.CAPTION" msgid "Options" msgstr "Opzioni" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption msgid "Exact name match" msgstr "Corrispondenza esatta del nome" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "Ricerca maiusc./minusc." #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "Cerca questi elementi" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "TFRMOPTIONSTABS.CBTABSACTIVATEONCLICK.CAPTION" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "Attiva &pannello destinazione quando clicchi su una delle sue schede" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "TFRMOPTIONSTABS.CBTABSALWAYSVISIBLE.CAPTION" msgid "&Show tab header also when there is only one tab" msgstr "&Mostra l'intestazione della scheda anche quando ce n'è una sola" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption msgctxt "TFRMOPTIONSTABS.CBTABSCONFIRMCLOSEALL.CAPTION" msgid "Con&firm close all tabs" msgstr "&Conferma chiusura di tutte le schede" #: tfrmoptionstabs.cbtabslimitoption.caption msgctxt "TFRMOPTIONSTABS.CBTABSLIMITOPTION.CAPTION" msgid "&Limit tab title length to" msgstr "&Limita lunghezza titolo della scheda a" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "TFRMOPTIONSTABS.CBTABSLOCKEDASTERISK.CAPTION" msgid "Show locked tabs &with an asterisk *" msgstr "Mostra schede bloccate con asterisco *" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "TFRMOPTIONSTABS.CBTABSMULTILINES.CAPTION" msgid "&Tabs on multiple lines" msgstr "&Schede su più linee" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENFOREGROUND.CAPTION" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Ctrl+&Su apre nuova scheda in secondo piano" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENNEARCURRENT.CAPTION" msgid "Open &new tabs near current tab" msgstr "Apri &nuove schede accanto alla corrente" #: tfrmoptionstabs.cbtabsshowclosebutton.caption msgctxt "TFRMOPTIONSTABS.CBTABSSHOWCLOSEBUTTON.CAPTION" msgid "Show ta&b close button" msgstr "Mostra tasto di chiusura sulle s&chede" #: tfrmoptionstabs.gbtabs.caption msgctxt "TFRMOPTIONSTABS.GBTABS.CAPTION" msgid "Folder tabs headers" msgstr "Intestazioni delle schede" #: tfrmoptionstabs.lblchar.caption msgctxt "TFRMOPTIONSTABS.LBLCHAR.CAPTION" msgid "characters" msgstr "caratteri " #: tfrmoptionstabs.lbltabsposition.caption msgctxt "TFRMOPTIONSTABS.LBLTABSPOSITION.CAPTION" msgid "Ta&bs position" msgstr "Posizione sche&de" #: tfrmoptionsterminal.lblruninterm.caption msgid "Run in &terminal:" msgstr "Avvia in &terminale:" #: tfrmoptionsterminal.lblrunterm.caption msgid "Run t&erminal:" msgstr "Avvia t&erminale:" #: tfrmoptionstoolbar.btnclonebutton.caption msgid "C&lone button" msgstr "Clo&na pulsante" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNDELETEBUTTON.CAPTION" msgid "&Delete" msgstr "&Elimina" #: tfrmoptionstoolbar.btnedithotkey.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNEDITHOTKEY.CAPTION" msgid "Edit hot&key" msgstr "Modifica scorciato&ia" #: tfrmoptionstoolbar.btninsertbutton.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNINSERTBUTTON.CAPTION" msgid "&Insert new button" msgstr "&Inserisci nuovo tasto" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNOPENFILE.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNOPENICON.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnremovehotkey.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNREMOVEHOTKEY.CAPTION" msgid "Remove hotke&y" msgstr "Rimuovi scorciato&ia" #: tfrmoptionstoolbar.cbflatbuttons.caption msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "Pulsanti &piatti" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "Inserisci parametri di comando, ognuno in una linea separata. Premi F1 per visualizzare l'aiuto sui parametri" #: tfrmoptionstoolbar.gbgroupbox.caption msgid "Appearance" msgstr "Aspetto" #: tfrmoptionstoolbar.lblbarsize.caption msgid "&Bar size:" msgstr "Dimensione ba&rra" #: tfrmoptionstoolbar.lblexternalcommand.caption msgctxt "TFRMOPTIONSTOOLBAR.LBLEXTERNALCOMMAND.CAPTION" msgid "Comman&d:" msgstr "Coman&do" #: tfrmoptionstoolbar.lblexternalparameters.caption msgctxt "TFRMOPTIONSTOOLBAR.LBLEXTERNALPARAMETERS.CAPTION" msgid "Parameter&s:" msgstr "Parametr&i:" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "Scorciatoia:" #: tfrmoptionstoolbar.lbliconfile.caption msgid "Ico&n:" msgstr "Ico&na:" #: tfrmoptionstoolbar.lbliconsize.caption msgid "Icon si&ze:" msgstr "Dimensione ic&ona:" #: tfrmoptionstoolbar.lblinternalcommand.caption msgctxt "tfrmoptionstoolbar.lblinternalcommand.caption" msgid "Co&mmand:" msgstr "Co&mando" #: tfrmoptionstoolbar.lblinternalparameters.caption msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "&Parametri:" #: tfrmoptionstoolbar.lblstartpath.caption msgid "Start pat&h:" msgstr "Percor&so di avvio" #: tfrmoptionstoolbar.lbltooltip.caption msgid "&Tooltip:" msgstr "&Tooltip:" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "Tipo di pulsante" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption msgid "&Keep terminal window open after executing program" msgstr "&Lascia la finestra del terminale aperta dopo l'esecuzione di un programma" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption msgid "&Execute in terminal" msgstr "&Esegui nel terminale" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption msgid "&Use external program" msgstr "&Usa programma esterno" #: tfrmoptionstoolbase.lbltoolsparameters.caption msgid "A&dditional parameters" msgstr "Parametri &addizionali" #: tfrmoptionstoolbase.lbltoolspath.caption msgid "&Path to program to execute" msgstr "&Percorso del programma da eseguire" #: tfrmoptionstooltips.btnaddfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "&Aggiungi" #: tfrmoptionstooltips.btnapplyfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "A&pplica" #: tfrmoptionstooltips.btndeletefields.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "&Elimina" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Modello..." #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "Campi personalizzati per tipo di file" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "Mostra Tooltip" #: tfrmoptionstooltips.lblfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "Suggerimento categoria:" #: tfrmoptionstooltips.lblfieldsmask.caption msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "&Filtro categoria:" #: tfrmoptionstooltips.lblfieldsname.caption msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "&Nome categoria:" #: tfrmoptionstooltips.rbtooltipallfiles.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "&Mostra Tooltip per tutti i file nel pannello" #: tfrmoptionstooltips.rbtooltipnone.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "Non &mostrare" #: tfrmoptionstooltips.rbtooltiponlylarge.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "Mostra &Tooltip per i file nel pannello file se troncati" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNBACKVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNFONTVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.gbviewerbookmode.caption msgid "Viewer Book Mode" msgstr "Visualizzatore modo book" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWEREXAMPLE.CAPTION" msgid "Example" msgstr "Esempio" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption msgid "&Background color in book viewer" msgstr "Colore di &sfondo del visualizzatore book" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption msgid "&Font color in book viewer" msgstr "Colore del &font del visualizzatore book" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption msgid "&Number of columns in book viewer" msgstr "&Numero di colonne del visualizzatore book" #: tfrmpackdlg.btncancel.caption msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmpackdlg.btnconfig.caption msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "&Configura" #: tfrmpackdlg.btnhelp.caption msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "&Aiuto" #: tfrmpackdlg.btnok.caption msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmpackdlg.caption msgctxt "TFRMPACKDLG.CAPTION" msgid "Pack files" msgstr "Comprimi file" #: tfrmpackdlg.cbcreateseparatearchives.caption msgid "C&reate separate archives, one per selected file/dir" msgstr "&Crea archivi separati, uno per ogni file/cartella" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "Crea archivio &autoestraente" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "C&ripta" #: tfrmpackdlg.cbmovetoarchive.caption msgid "Mo&ve to archive" msgstr "Sp&osta nell'archivio" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "&Multiple disk archive" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "=>" #: tfrmpackdlg.cbputintarfirst.caption msgid "P&ut in the TAR archive first" msgstr "In&serisci prima in archivio TAR" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "&Comprimi anche i nomi di percorso (solo ricorsivamente)" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "Comprimi i file nell'archivio:" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "Compressore" #: tfrmpackinfodlg.btnclose.caption msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Chiudi" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "&Decomprimi tutto ed esegui" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "&Estrai ed esegui" #: tfrmpackinfodlg.caption msgctxt "TFRMPACKINFODLG.CAPTION" msgid "Properties of packed file" msgstr "Proprietà dell'archivio" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "Attributi:" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "Tasso di compressione:" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "Data:" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "Metodo:" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "Dimensione originale:" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "File:" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "Dimensione dell'archivio:" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "Compressore:" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "Data/ora:" #: tfrmquicksearch.btncancel.caption msgctxt "TFRMQUICKSEARCH.BTNCANCEL.CAPTION" msgid "X" msgstr "X" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "Chiudi il pannello filtro" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "Inserisci il testo da cercare o filtra per" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "Aa" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "Distingui maiusc./minusc." #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "D" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "Cartelle" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "F" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "File" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "{" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "Corrispondenza all'inizio" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "}" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "Corrispondenza alla fine" #: tfrmquicksearch.tglfilter.caption msgctxt "TFRMQUICKSEARCH.TGLFILTER.CAPTION" msgid "Filter" msgstr "Filtro" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "Passare alla ricerca o al filtro" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CANCELBUTTON.CAPTION" msgid "Cancel" msgstr "Annulla" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CLOSEBUTTON.CAPTION" msgid "&Close" msgstr "&Chiudi" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.HELPBUTTON.CAPTION" msgid "&Help" msgstr "&Aiuto" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.OKBUTTON.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmselecttextrange.lblselecttext.caption msgid "&Select the characters to insert:" msgstr "&Seleziona caratteri da inserire:" #: tfrmsetfileproperties.btncancel.caption msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsetfileproperties.caption msgctxt "TFRMSETFILEPROPERTIES.CAPTION" msgid "Change attributes" msgstr "Cambia attributi" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Adesivo" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "Archivio" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "Creato:" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "Nascosto" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "Accesso:" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "Modificato:" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "Sola lettura" #: tfrmsetfileproperties.chkrecursive.caption msgid "Including subfolders" msgstr "Inclusione sottocartelle" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "Sistema" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "Proprietà timestamp" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Attributi" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Attributi" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bit:" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Gruppo" #: tfrmsetfileproperties.lblattrinfo.caption msgid "(gray field means unchanged value)" msgstr "(un campo grigio significa valore immutato)" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Altro" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Proprietario" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Testo:" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Esegui" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Ottale:" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Leggi" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Scrivi" #: tfrmsplitter.btncancel.caption msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsplitter.caption msgctxt "TFRMSPLITTER.CAPTION" msgid "Splitter" msgstr "Divisore" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664B - 3.5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "Nome file" #: tfrmsplitter.grbxsize.caption msgid "Size and number of parts" msgstr "Dimensione e numero parti" #: tfrmsplitter.lbdirtarget.caption msgid "Directory &target" msgstr "Cartella &destinazione" #: tfrmsplitter.lbfilesource.caption msgid "File &source" msgstr "File &sorgente" #: tfrmsplitter.lblnumberparts.caption msgid "&Number of parts" msgstr "&Numero parti" #: tfrmsplitter.rbtngigab.caption msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "&Gigabyte" #: tfrmsplitter.rbtnkilob.caption msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "&Kilobyte" #: tfrmsplitter.rbtnmegab.caption msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "&Megabyte" #: tfrmsymlink.btncancel.caption msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsymlink.caption msgid "Create symbolic link" msgstr "Crea link simbolico" #: tfrmsymlink.lblexistingfile.caption msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "&Destinazione alla quale punterà il collegamento" #: tfrmsymlink.lbllinktocreate.caption msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Nome co&llegamento" #: tfrmtweakplugin.btnadd.caption msgid "A&dd new" msgstr "A&ggiungi nuovo" #: tfrmtweakplugin.btncancel.caption msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annulla" #: tfrmtweakplugin.btnchange.caption msgid "C&hange" msgstr "C&ambia" #: tfrmtweakplugin.btndefault.caption msgid "De&fault" msgstr "Prede&finito" #: tfrmtweakplugin.btnok.caption msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmtweakplugin.btnremove.caption msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "&Elimina" #: tfrmtweakplugin.caption msgctxt "TFRMTWEAKPLUGIN.CAPTION" msgid "Tweak plugin" msgstr "&Tweak plugin" #: tfrmtweakplugin.cbpk_caps_by_content.caption msgid "De&tect archive type by content" msgstr "Indivi&dua il tipo di archivio dal contenuto" #: tfrmtweakplugin.cbpk_caps_delete.caption msgid "Can de&lete files" msgstr "Possibilità di e&liminare i file" #: tfrmtweakplugin.cbpk_caps_encrypt.caption msgid "Supports e&ncryption" msgstr "Supporta la c&odifica" #: tfrmtweakplugin.cbpk_caps_hide.caption msgid "Sho&w as normal files (hide packer icon)" msgstr "Mostr&a come file normali (nascondi icona archivi)" #: tfrmtweakplugin.cbpk_caps_mempack.caption msgid "Supports pac&king in memory" msgstr "Supporta la gestione di arc&hivi in memoria" #: tfrmtweakplugin.cbpk_caps_modify.caption msgid "Can &modify exisiting archives" msgstr "Puoi &modificare l'archivio esistente" #: tfrmtweakplugin.cbpk_caps_multiple.caption msgid "&Archive can contain multiple files" msgstr "L'&archivio può contenere file multipli" #: tfrmtweakplugin.cbpk_caps_new.caption msgid "Can create new archi&ves" msgstr "Puoi creare nuovi archi&vi" #: tfrmtweakplugin.cbpk_caps_options.caption msgid "S&upports the options dialogbox" msgstr "S&upporta finestre di dialogo con opzioni" #: tfrmtweakplugin.cbpk_caps_searchtext.caption msgid "Allow searchin&g for text in archives" msgstr "Consenti ricer&ca testi negli archivi" #: tfrmtweakplugin.lbldescription.caption msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "&Descrizione:" #: tfrmtweakplugin.lbldetectstr.caption msgid "D&etect string:" msgstr "Ril&eva stringa:" #: tfrmtweakplugin.lblextension.caption msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "&Estensione:" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "Flag:" #: tfrmtweakplugin.lblname.caption msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "&Nome:" #: tfrmtweakplugin.lblplugin.caption msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "&Plugin:" #: tfrmtweakplugin.lblplugin1.caption msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "&Plugin:" #: tfrmviewer.actabout.caption msgctxt "TFRMVIEWER.ACTABOUT.CAPTION" msgid "About Viewer..." msgstr "Info visualizzatore..." #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "Mostra il messagio Info" #: tfrmviewer.actcopyfile.caption msgctxt "TFRMVIEWER.ACTCOPYFILE.CAPTION" msgid "Copy File" msgstr "Copia File" #: tfrmviewer.actcopyfile.hint msgctxt "TFRMVIEWER.ACTCOPYFILE.HINT" msgid "Copy File" msgstr "Copia File" #: tfrmviewer.actdeletefile.caption msgctxt "TFRMVIEWER.ACTDELETEFILE.CAPTION" msgid "Delete File" msgstr "Elimina File" #: tfrmviewer.actdeletefile.hint msgctxt "TFRMVIEWER.ACTDELETEFILE.HINT" msgid "Delete File" msgstr "Elimina File" #: tfrmviewer.actloadnextfile.caption msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.CAPTION" msgid "&Next" msgstr "&Successivo" #: tfrmviewer.actloadnextfile.hint msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.HINT" msgid "Load Next File" msgstr "Carica File Successivo" #: tfrmviewer.actloadprevfile.caption msgctxt "TFRMVIEWER.ACTLOADPREVFILE.CAPTION" msgid "&Previous" msgstr "&Precedente" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "Carica file Precedente" #: tfrmviewer.actmirror.caption msgctxt "TFRMVIEWER.ACTMIRROR.CAPTION" msgid "Mirror" msgstr "Specchia" #: tfrmviewer.actmirror.hint msgctxt "TFRMVIEWER.ACTMIRROR.HINT" msgid "Mirror" msgstr "Specchia" #: tfrmviewer.actmovefile.caption msgctxt "TFRMVIEWER.ACTMOVEFILE.CAPTION" msgid "Move File" msgstr "Sposta File" #: tfrmviewer.actmovefile.hint msgctxt "TFRMVIEWER.ACTMOVEFILE.HINT" msgid "Move File" msgstr "Sposta File" #: tfrmviewer.actreload.caption msgctxt "TFRMVIEWER.ACTRELOAD.CAPTION" msgid "Reload" msgstr "Ricarica" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "Ricarica file corrente" #: tfrmviewer.actrotate180.caption msgctxt "TFRMVIEWER.ACTROTATE180.CAPTION" msgid "Rotate 180" msgstr "Ruota 180°" #: tfrmviewer.actrotate180.hint msgctxt "TFRMVIEWER.ACTROTATE180.HINT" msgid "Rotate 180" msgstr "Ruota 180°" #: tfrmviewer.actrotate270.caption msgctxt "TFRMVIEWER.ACTROTATE270.CAPTION" msgid "Rotate 270" msgstr "Ruota 270°" #: tfrmviewer.actrotate270.hint msgctxt "TFRMVIEWER.ACTROTATE270.HINT" msgid "Rotate 270" msgstr "Ruota 270°" #: tfrmviewer.actrotate90.caption msgctxt "TFRMVIEWER.ACTROTATE90.CAPTION" msgid "Rotate 90" msgstr "Ruota 90°" #: tfrmviewer.actrotate90.hint msgctxt "TFRMVIEWER.ACTROTATE90.HINT" msgid "Rotate 90" msgstr "Ruota 90°" #: tfrmviewer.actsaveas.caption msgctxt "TFRMVIEWER.ACTSAVEAS.CAPTION" msgid "Save As..." msgstr "Salva come..." #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "Salva file come..." #: tfrmviewer.actstretchimage.caption msgctxt "TFRMVIEWER.ACTSTRETCHIMAGE.CAPTION" msgid "Stretch" msgstr "Stira" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "Stira immagine" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "- 90°" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "+ 90°" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "Copia" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "Copia" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "Ritaglia" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "Elimina" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "Elimina" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "Schermo intero" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "||" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "S" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "Evidenzia" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "Specchia" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "Sposta" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "Sposta" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "||>" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "Colora" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "<||" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "Occhi Rossi" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "Ridimensiona" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "Annulla" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "Zoom +" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "Zoom -" #: tfrmviewer.caption msgctxt "TFRMVIEWER.CAPTION" msgid "Viewer" msgstr "Visualizzatore" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Diapositive" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "Penna" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "Evidenzia" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "Colora" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Diapositive" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "Mostra" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "0x0" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "+ 180°" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "- 90°" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "+ 90°" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "Info" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "Mostra come file &binario" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "Copia negli appunti" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Modifica" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "&Codifica" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "E&sci" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "&File" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "Schermo intero" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "Grafica" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "Mostra in &esadecimale" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "&Immagine" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "Mostra come \"&Book\"" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "Specchia" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "Plugin" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "Anteprima" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "Stampa..." #: tfrmviewer.mirotate.caption msgctxt "TFRMVIEWER.MIROTATE.CAPTION" msgid "Rotate" msgstr "Ruota" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "Salva" #: tfrmviewer.misaveas.caption msgctxt "TFRMVIEWER.MISAVEAS.CAPTION" msgid "Save As..." msgstr "Salva come..." #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "Cattura schermata" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "Cerca" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "Cerca successivo" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "Cerca precedente" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "Seleziona tutto" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.mistretch.caption msgctxt "TFRMVIEWER.MISTRETCH.CAPTION" msgid "Stretch" msgstr "Stira" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "Mostra come &testo" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "&Visualizza" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "Mostra con &ritorno a capo" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "Zoom +" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "Zoom -" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "Copia negli appunti" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "Seleziona Tutto" #: tfrmviewoperations.btnstartpause.caption msgctxt "TFRMVIEWOPERATIONS.BTNSTARTPAUSE.CAPTION" msgid "&Start" msgstr "&Avvia" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "F&erma" #: tfrmviewoperations.caption msgctxt "TFRMVIEWOPERATIONS.CAPTION" msgid "File operations" msgstr "Operazioni sui file" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "Sempre in primo piano" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "Usa \"drag && drop\" per spostare le operazioni fra le code" #: tfrmviewoperations.mnucanceloperation.caption msgctxt "TFRMVIEWOPERATIONS.MNUCANCELOPERATION.CAPTION" msgid "Cancel" msgstr "Annulla" #: tfrmviewoperations.mnucancelqueue.caption msgctxt "TFRMVIEWOPERATIONS.MNUCANCELQUEUE.CAPTION" msgid "Cancel" msgstr "Annulla" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "Nuova coda" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "TFRMVIEWOPERATIONS.MNUOPERATIONSHOWDETACHED.CAPTION" msgid "Show in detached window" msgstr "Visualizza in finestra separata" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "Metti il primo in coda" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "Metti l'ultimo in coda" #: tfrmviewoperations.mnuqueue.caption msgctxt "TFRMVIEWOPERATIONS.MNUQUEUE.CAPTION" msgid "Queue" msgstr "Coda" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "Fuori dalla coda" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "Coda 1" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "Coda 2" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "Coda 3" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "Coda 4" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "Coda 5" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "TFRMVIEWOPERATIONS.MNUQUEUESHOWDETACHED.CAPTION" msgid "Show in detached window" msgstr "Mostra in finestra separata" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "&Ferma tutti" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "TMULTIARCHIVECOPYOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Quando i file esistono" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "TWCXARCHIVECOPYOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Quando il file esiste" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "Lavora in secondo piano (connesione separata)" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Quando il file esiste" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "Annulla filtro rapido" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "Cannulla operazione corrente" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "Gli appunti non contengono nessuna barra strumenti valida" #: ulng.rscolattr msgid "Attr" msgstr "Attr" #: ulng.rscoldate msgid "Date" msgstr "Data" #: ulng.rscolext msgid "Ext" msgstr "Estensione" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "Nome" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "Dimensione" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "Numero di modifiche:" #: ulng.rsconfcolalign msgid "Align" msgstr "Allinea" #: ulng.rsconfcolcaption msgid "Caption" msgstr "Etichetta" #: ulng.rsconfcolconfig msgid "Config" msgstr "Configura" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "Elimina" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "Contenuto campi" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "Sposta" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "Larghezza" #: ulng.rsconfcustheader msgid "Customize column" msgstr "Personalizza colonna" #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "Copia (%d) %s" #: ulng.rsdlgallopcomplete msgid "All operations completed" msgstr "Tutte le operazioni sono state completate" #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "Progresso di tutte le operazioni %d %%" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "Abband&ona" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "&Tutto" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "A&ggiungi" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "&Annulla" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "&Continua" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "Copia &in" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "Copia in &tutto" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "E&sci dal programma" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "I&gnora tutti" #: ulng.rsdlgbuttonno msgid "&No" msgstr "&No" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "N&essuno" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "&OK" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "&Sovrascrivi" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "Sovrascrivi &tutti" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "Sovrascrivi tutti i &vecchi" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "&Riprendi" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "Ri&tenta" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "Sa<a" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "Salta t&utti" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "&Si" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "Calcola file e cartelle" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "Calcola Checksum..." #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "Verifica Checksum..." #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "Copia file" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "Elimina file" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "Sposta file" #: ulng.rsdlgoppause msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "Pau&sa" #: ulng.rsdlgopstart msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "&Avvio" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "Coda" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "Velocità %s/s" #: ulng.rsdlgspeedtime msgid "Speed %s/s, time remaining %s" msgstr "Velocità %s/s, tempo rimanente %s" #: ulng.rsdlgsplit msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "Dividi" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "Cancellazione sicura file" #: ulng.rsdrivenolabel msgid "" msgstr "" #: ulng.rsdrivenomedia msgid "" msgstr "" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Editor interno di Double Commander." #: ulng.rseditnewfile msgid "new.txt" msgstr "nuovo.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "Nome file:" #: ulng.rseditnewopen msgid "Open file" msgstr "Apri file" #: ulng.rseditsearchback msgid "&Backward" msgstr "&Indietro" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "Ricerca" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "&Avanti" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "Sostituisci" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "Chiedi;Sovrascrivi;Copia su;Salta" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "Chiedi;Sovrascrivi vecchi;Copia su;Salta" #: ulng.rsfileopsetpropertyerroroptions msgctxt "ulng.rsfileopsetpropertyerroroptions" msgid "Ask;Don't set anymore;Ignore errors" msgstr "Chiedi;Non impostare più;Ignora errori" #: ulng.rsfilterstatus msgid "FILTER" msgstr "FILTRO" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "Definisci modello" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "%s livello(i)" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "tutto (profondità illimitata)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "solo cartella corrente" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "La cartella %s non esiste!" #: ulng.rsfindfound msgctxt "ulng.rsfindfound" msgid "Found: %d" msgstr "Trovato: %d" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "Salva modello di ricerca" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "Nome modello:" #: ulng.rsfindscanned msgctxt "ulng.rsfindscanned" msgid "Scanned: %d" msgstr "Analizzato: %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "Analisi in corso" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "Trova file" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "Inizio a" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr "%s liberi su %s byte" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "%s byte liberi" #: ulng.rsfuncatime msgid "Access date/time" msgstr "Data/ora accesso" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "Attributi" #: ulng.rsfunccomment msgctxt "ulng.rsfunccomment" msgid "Comment" msgstr "Commento" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "Dimensione compressa" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "Data/ora creazione" #: ulng.rsfuncext msgid "Extension" msgstr "Estensione" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "Gruppo" #: ulng.rsfunclinkto msgid "Link to" msgstr "Collegamento a" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "Data/ora modifica" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "Nome" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "Nome senza estensione" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "Proprietario" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "Percorso" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "Dimensione" #: ulng.rsfunctype msgid "Type" msgstr "Tipo" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "Errore nella creazione dell'hardlink." #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "Dialogo copia/sposta" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "Differenze" #: ulng.rshotkeycategorymain msgid "Main" msgstr "Principale" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "Visualizzatore" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "Linker completo" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "Filtro di deselezione" #: ulng.rsmarkplus msgid "Select mask" msgstr "Filtro di selezione" #: ulng.rsmaskinput msgid "Input mask:" msgstr "Filtro di input:" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "Configura colonne personalizzate" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "Configura vista colonne personalizzate" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "Azioni" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "Modifica" #: ulng.rsmnueject msgid "Eject" msgstr "Espelli" #: ulng.rsmnumount msgid "Mount" msgstr "Monta" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "Nuovo" #: ulng.rsmnunomedia msgid "No media available" msgstr "Nessuna unità disponibile" #: ulng.rsmnuopenwith msgid "Open with" msgstr "Apri con..." #: ulng.rsmnuopenwithother msgid "Other..." msgstr "Altro" #: ulng.rsmnusortby msgid "Sort by" msgstr "Ordina per" #: ulng.rsmnuumount msgid "Unmount" msgstr "Smonta" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "Vista" #: ulng.rsmsgaccount msgid "Account:" msgstr "Account:" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "Parametri addizionali per compressore da linea di comando:" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "Non è possibile copiare/spostare il file \"%s\" su sé stesso!" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "Impossibile eliminare cartella %s" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "ChDir a [%s] fallito!" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "Rimuovere tutte le schede inattive?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "Questa scheda (%s) è bloccata! Chiudere ugualmente?" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "Sei sicuro di voler uscire?" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "Copia %d file/cartelle selezionati?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "Copia \"%s\"?" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "Eliminanare il file parzialmente copiato ?" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "Elimina %d file/cartelle selezionati?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "Spostare %d file/cartelle selezionati nel cestino?" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "Eliminare \"%s\"?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "Spostare \"%s\" nel cestino?" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "Impossibile spostare \"%s\" nel cestino! Eliminare definitivamente?" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "Disco non disponibile" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "Inserire estensione file:" #: ulng.rsmsgentername msgid "Enter name:" msgstr "Inserire nome:" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "Errore CRC nell'archivio" #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "Dati corrotti" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "Impossibile connettersi al server: \"%s\"" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "Impossibile copiare il file %s verso %s" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "La cartella col nome \"%s\" è già presente." #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "La data %s non è supportata" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "La cartella %s esiste già!" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "Funzione annullata dall'utente" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "Errore nella chiusura del file" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "Impossibile creare file" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "Non ci sono più file nell'archivio" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "Impossibile aprire il file esistente" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "Errore nella lettura file" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "Errore di scrittura su file" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "Impossibile creare cartella %s!" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "Collegamento non valido" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "File non trovato" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "Memoria insufficiente" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "Funzione non supportata!" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "Errore nel comando del menu contestuale" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "Errore durante il caricamento della configurazione" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "Errore sintattico nell'espressione regolare!" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "Impossibile rinominare il file %s in %s" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "Non posso salvare l'associazione!" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "Impossibile salvare il file" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "Impossibile impostare gli attributi per \"%s\"" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "Impossibile impostare data/ora per \"%s\"" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "Impossibile impostare proprietario/gruppo per \"%s\"" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "Buffer troppo piccolo" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "Troppi file da comprimere" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "Formato dell'archivio sconosciuto" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "Il file %s è stato modificato, salvarlo?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "Il file %s esiste, sovrascriverlo?" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "Operazioni sul file in corso" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "Alcune operazioni sui file non sono terminate. Chiudendo Double Commander alcuni dati potrebbero andare perduti." #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "Il file %s è in sola lettura. Eliminarlo ugualmente?" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "La dimensione del file \"%s\" è eccessiva per il file system di destinazione!" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "La cartella %s esiste, sovrascriverla?" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "Segui collegamento simbolico \"%s\"?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "Errore nella linea di comando" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "Nome file non valido" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "Formato non valido del file di configurazione" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "Percorso non valido" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "Il percorso %s contiene caratteri non consentiti." #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "Non c'è un plugin valido!" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "Questo plugin è stato fatto per Double Commander: %s.%s. Non può funzionare con Double Commander per %s!" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "Quoting non valido" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "Selezione non valida." #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "Carica lista..." #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "Copia file %s" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "Elimina file %s" #: ulng.rsmsglogerror msgid "Error: " msgstr "Errore:" #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "Estrai file %s" #: ulng.rsmsgloginfo msgid "Info: " msgstr "Info:" #: ulng.rsmsgloglink msgid "Create link %s" msgstr "Crea collegamento %s" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "Crea cartella %s" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "Sposta file %s" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "Comprimi file %s" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "Rimuovere cartella %s" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "Fatto:" #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "Crea link simbolico %s" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "Test integrità file %s" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "Aggiunta manuale del percorso preferito" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "Modifica manuale del percorso preferito" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "Inserire nome e percorso (formato nome=percorso):" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "Password principale" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "Prego inserire password principale:" #: ulng.rsmsgnewfile msgid "New file" msgstr "Nuovo file" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "Il prossimo volume verrà decompresso" #: ulng.rsmsgnofiles msgid "No files" msgstr "Nessun file" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "Nessun file selezionato." #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "Non c'è abbastanza spazio sull'unità di destinazione. Continuare?" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "Non c'è abbastanza spazio sull'unità di destinazione. Riprovare?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "Non è possibile eliminare il file %s" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "Non implementato." #: ulng.rsmsgpassword msgid "Password:" msgstr "Password:" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "Le password sono differenti!" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "Si prega di inserire la password:" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "Password (Firewall) :" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "Prego reinserire la password per verifica:" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "&Aggiungi %s" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "&Configura" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "&Elimina %s" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "Preset \"%s\" già presente. Sovrascrivere?" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "Rinominare/spostare %d file/cartelle selezionati?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "Rinomina/sposta selezione \"%s\"?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "Prego, riavviare Double Commander per applicare le modifiche" #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "Selezione: %s di %s, file: %d di %d, cartelle: %d di %d" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "Prego, selezionare solo i file per il Checksum!" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "Prego selezionare la posizione del prossimo volume" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "Imposta etichetta volume" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "Rinomina scheda" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "Nuovo nome di scheda:" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "Percorso destinazione:" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "Nuovo titolo per la voce di menu:" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "Troppi file selezionati." #: ulng.rsmsgurl msgid "URL:" msgstr "URL:" #: ulng.rsmsgusername msgid "User name:" msgstr "Nome utente:" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "Nome utente (Firewall):" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "Etichetta volume:" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "Prego inserire la dimensione del volume:" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "Avviare la cancellazione sicura per i file/cartelle %d selezionati?" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "Eseguire la cancellazione sicura per la selezione \"%s\"?" #: ulng.rsmulrenfilenamestylelist msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "Nessuna modifica;MAIUSCOLE;minuscole;Primo carattere maiusc.;Primo caratt. di ogni parola maiusc.;" #: ulng.rsoperaborted msgid "Aborted" msgstr "Annullato" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "Calcolo del Checksum" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "Calcolo del Checksum in \"%s\"" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "Calcolo del Checksum di \"%s\"" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "Calcolo in corso..." #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "Calcolo di \"%s\" in corso " #: ulng.rsopercombining msgid "Joining" msgstr "Unione" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "Unisci file in \"%s\" su \"%s\"" #: ulng.rsopercopying msgid "Copying" msgstr "Copia" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "Copia da \"%s\" to \"%s\"" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "Copia da \"%s\" to \"%s\"" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "Creazione cartella" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "Creazione cartella \"%s\"" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "Eliminazione" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "Eliminazione in \"%s\"" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "Eliminazione di \"%s\"" #: ulng.rsoperexecuting msgid "Executing" msgstr "Esecuzione" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "Esecuzione di \"%s\"" #: ulng.rsoperextracting msgid "Extracting" msgstr "Estrazione" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "Estrazione da \"%s\" a \"%s\"" #: ulng.rsoperfinished msgid "Finished" msgstr "Terminato" #: ulng.rsoperlisting msgid "Listing" msgstr "Elencazione" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "Elencazione di \"%s\" in corso" #: ulng.rsopermoving msgid "Moving" msgstr "Spostamento" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "Spostamento da \"%s\" a \"%s\"" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "Spostamento di \"%s\" a \"%s\"" #: ulng.rsopernotstarted msgid "Not started" msgstr "Non avviato" #: ulng.rsoperpacking msgid "Packing" msgstr "Compressione" #: ulng.rsoperpackingfromto #, fuzzy #| msgid "Compressione da \"%s\" a \"%s\"" msgid "Packing from \"%s\" to \"%s\"" msgstr "Compressione da \"%s\" a \"%s\"" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "Compressione da \"%s\" a \"%s\"" #: ulng.rsoperpaused msgid "Paused" msgstr "In attesa" #: ulng.rsoperpausing msgid "Pausing" msgstr "Metti in attesa" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "In coda" #: ulng.rsoperrunning msgid "Running" msgstr "Caricamento in corso" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "Imposta proprietà" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "Imposta proprietà in \"%s\"" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "Imposta proprietà di \"%s\"" #: ulng.rsopersplitting msgid "Splitting" msgstr "Divisione" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "Divisione da \"%s\" a \"%s\"" #: ulng.rsoperstarting msgid "Starting" msgstr "Avviamento" #: ulng.rsoperstopped msgid "Stopped" msgstr "Fermato" #: ulng.rsoperstopping msgid "Stopping" msgstr "Annulla" #: ulng.rsopertesting msgid "Testing" msgstr "Test" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "Test in \"%s\"" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "Test in \"%s\"" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "Verifica del Checksum" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "Verifica del Checksum in \"%s\"" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "Verifica del Checksum di \"%s\"" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "Attendere per accesso al file sorgente" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "Attendi per risposta utente" #: ulng.rsoperwiping msgid "Wiping" msgstr "Cancellazione sicura" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "Cancellazione sicura in \"%s\"" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "Cancellazione sicura \"%s\"" #: ulng.rsoperworking msgid "Working" msgstr "Funzionamento" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "Elimina:" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "Estrai senza percorso:" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "Modalità di Format parsing:" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "ID:" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "Posizione ID:" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "ID Seek Range:" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "Parametro" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "Password query string" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "Crea archivio autoestraente:" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "Test:" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "Tipo archivio:" #: ulng.rsoptarchivevalue msgid "Value" msgstr "Valore" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "Associa plugin \"%s\" con:" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "Primo;Ultimo;" #: ulng.rsoptdisable msgid "Disable" msgstr "Disabilita" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "Abilita" #: ulng.rsoptenterext msgid "Enter extension" msgstr "Inserire estensione" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "Cursore" #: ulng.rsoptexamplemark msgid "Mark" msgstr "Evidenzia" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "Evidenzia + Cursore" #: ulng.rsoptexampletext msgid "Text" msgstr "Testo" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "finestra separata;minimizza finestra separata;pannello operazioni" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "Dinamico (decimale);B;K;M;G" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "La scorciatoia %s per cm_Delete verrà registrata, può essere usata per invertire questo settaggio." #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "Aggiungi scorciatoia per %s" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "Aggiungi scorciatoia" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "Impossibile impostare scorciatoia" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "Cambia scorciatoia" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "Comando" #: ulng.rsopthotkeysdeletetrashcanoverrides msgctxt "ulng.rsopthotkeysdeletetrashcanoverrides" msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "La scorciatoia %s per cm_Delete ha un parametro che scavalca questa impostazione. Vuoi cambiare questo parametro per usare l'impostazione globale?" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgctxt "ulng.rsopthotkeysdeletetrashcanparameterexists" msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "La scorciatoia %s per cm_Delete necessita di avere un parametro modificato che corrisponda alla scorciatoia %s. Vuoi modificarlo?" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "Descrizione" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "Modifica la scorciatoia per %s" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "Fissa parametro" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "Scorciatoia" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "Scorciatoie" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "Parametri" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "Setta scorciatoie per cancellare file" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "Perché questo settaggio funzioni con la scorciatoia %s, la scorciatoia %s deve essere assegnata a cm_Delete ma è già assegnata a %s. Vuoi modificare ciò?" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "La scorciatoia %s per cm_Delete è una scorciatoia sequenziale per cui una scorciatoia con lo Shift premuto non può essere assegnata. Questa impostazione potrebbe non funzionare." #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "Scorciatoia in uso" #: ulng.rsopthotkeysshortcutusedtext1 msgid "Shortcut %s is already used." msgstr "La scorciatoia %s è già usata." #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "Modificare esso in %s?" #: ulng.rsopthotkeysusedby msgid "used for %s in %s" msgstr "usato per %s in %s" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "Usato per questo comando ma con differenti parametri" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "Archiviatori" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "Auto-aggiornamento" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "Comportamenti" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "Colori" #: ulng.rsoptionseditorcolumnsview msgid "Columns" msgstr "Colonne" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "Configurazione" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "Colonne personalizzate" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "Drag && drop" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "Pulsante lista unità" #: ulng.rsoptionseditorfileoperations msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "Operazioni sui file" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "Pannello file" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "Visualizzazioni file" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "Tipi di file" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "Schede" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "Font" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "Evidenziazioni" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "Scorciatoie" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "Icone" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "Ignora lista" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "Tasti" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "Lingua" #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "Disposizione" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "Registro operazioni" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "Altro" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "Mouse" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "Plugin" #: ulng.rsoptionseditorquicksearch msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "Ricerca Rapida/Filtro" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "Terminale" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "Barra strumenti" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "Strumenti" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "Tooltip" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "Nessuno;Linea di comando;Ricerca veloce;Filtro veloce" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "Tasto sinistro;Tasto destro;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "In alto alla lista file;dopo le cartelle (se le cartelle sono ordinate prima dei file);in posizione ordinata;In fondo alla lista file" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "Il plugin %s è già assegnato alle seguenti estensioni:" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "Attiva" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "Nome file" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "Nome" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "Registrato per" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "&Distingui maiusc./minusc.;&Nessuna distinzione maiusc./minusc." #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "&File;Cartelle;File &e cartelle" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "&Nascondi pannello filtro quando selezionato" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "nessuna distinzione maiusc./minusc.;in accordo alle impostazioni locali (aAbBcC);prima maiuscole poi minuscole (ABCabc)" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "ordina per nome e mostra prima;ordina come i file e mostra prima;ordina come file" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "Alfabetico, considera accenti;Ordinamento naturale: alfabetico e numeri" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "Inizio;Fine;" #: ulng.rsopttoolbarbuttontype msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "S&eparatore;comando inte&rno;comando e&sterno;Men&u" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "non cambiare posizione;usa le stesse impostazioni per i nuovi file; alla posizione ordinata" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "File: %d, cartelle %d" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "Impossibile modificare i permessi per \"%s\"" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "Impossibile modificare il proprietario per \"%s\"" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "File" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "Cartella" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "Nome pipe" #: ulng.rspropsno msgid "No" msgstr "No" #: ulng.rspropssocket msgid "Socket" msgstr "Socket" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "Dispositivo speciale a blocchi" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "Dispositivo speciale a caratteri" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "Collegamento simbolico" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "Tipo sconosciuto" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "Si (%s)" #: ulng.rssearchresult msgid "Search result" msgstr "Risultati di ricerca" #: ulng.rssearchtemplateunnamed msgid "" msgstr "" #: ulng.rsselectdir msgid "Select a directory" msgstr "Seleziona cartella" #: ulng.rsshowhelpfor msgid "&Show help for %s" msgstr "&Mostra aiuto per %s" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "Byte" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "Gigabyte" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "Kilobyte" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "Megabyte" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "Terabyte" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "File: %d, Cartella: %d, Dimensione: %s (%s byte)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "Impossibile creare la cartella destinazione!" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "Errore nel formato della dimensione!" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "Impossibile dividere il file!" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "Il numero di parti è superiore a 100! Continuare?" #: ulng.rssplitseldir msgid "Select directory:" msgstr "Seleziona cartella:" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "Errore nella creazione del collegamento simbolico." #: ulng.rssyndefaulttext msgctxt "ulng.rssyndefaulttext" msgid "Default text" msgstr "Testo predefinito" #: ulng.rssynlangplaintext msgctxt "ulng.rssynlangplaintext" msgid "Plain text" msgstr "Testo non formattato" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "Giorno(i)" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "Ora(e)" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "Minuto(i)" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "Mese(i)" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "Secondo(i)" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "Settimana(e)" #: ulng.rstimeunityear msgid "Year(s)" msgstr "Anno(i)" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "Differenze" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "Modifica" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "Errore nell'apertura" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "Errore apertura editor" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "Errore apertura terminale" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "Errore apertura visualizzatore" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "Terminale" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "Visualizza" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "Si prega di riportare questo errore sul bug tracker con una descrizione di cosa è stato fatto e allegando il seguente file:%sPremere %s per continuare ad usare il programma oppure %s per chiuderlo." #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "Rete" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "Visualizzatore interno di Double Commander." #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "Codifica" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "%s non trovato!" doublecmd-0.5.8/language/doublecmd.hu.po0000644000175000017500000064467412250633131017223 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.5 alpha\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-01-17 23:08+0300\n" "PO-Revision-Date: 2013-03-24 22:03+0100\n" "Last-Translator: Nyilas MISY \n" "Language-Team: unDoRito -- HTC-iP \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Hungarian\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "Mind" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "Mind" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "Mind" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "Mind" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "Mind" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "Mind" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "Mind" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "Mégsem" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "..." #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "->" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "<-" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "Egyéni oszlopmegjelnítés beállítása" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "Háttér 1 :" #: tfcolumnssetconf.cbcursorborder.caption msgid "Cursor border" msgstr "Kurzor szegélye" #: tfcolumnssetconf.cbovercolor.caption msgid "Allow Overcolor" msgstr "Átszínezés engedélyezése" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "Egyedi betűtípus és szín használata" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "Szöveg színe :" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "Betűtípus :" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "Méret :" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "Háttér 2 :" #: tfcolumnssetconf.lblconfigviewnr.caption msgid "Configure view nr:" msgstr "Nézetszám beállítás :" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "Kurzorszín :" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "Kurzor szöveg :" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "Jelölő színe :" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "Név :" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "Oszlop hozzáadása" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "Oszlop testreszabása :" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "Előnézet" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "R" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "Sablon kiválasztása..." #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption msgid "C&heck free space" msgstr "Szabad &terület ellenőrzése" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption msgid "Cop&y attributes" msgstr "&Attribútumok másolása" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption msgid "Copy o&wnership" msgstr "&Tulajdonos másolása" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption msgid "Copy d&ate/time" msgstr "&Dátum/Idő másolása" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption msgid "Correct lin&ks" msgstr "Helyes lin&kek" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption #| msgid "Drop readonly flag" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "Írásvédelmi attribútum elhagyása" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption msgid "E&xclude empty directories" msgstr "Üres &mappák kizárása" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption msgid "Fo&llow links" msgstr "Linkek követése" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "Hely &tartalékolása" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "Mit tegyen, ha nem bírja beállítani a fájl idejét, attribútumait, stb." #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "Fájl-sablon használata" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption msgid "When dir&ectory exists" msgstr "Ha a &mappa létezik" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "Ha a &fájl létezik" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption msgid "When ca&nnot set property" msgstr "Ha &nem bírja beállítani a tulajdonságokat" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "" #: tfrmabout.btnclose.caption msgctxt "TFRMABOUT.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Bezárás" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "Másolás a vágólapra" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "Névjegy" #: tfrmabout.lblbuild.caption msgid "Build" msgstr "Kiadás" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "Free Pascal" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "Honlap :" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "http://doublecmd.sourceforge.net" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "Lazarus" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "Revízió" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption msgid "Version" msgstr "verzió :" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Mégsem" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "&Visszaállít" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "Attribútumok kiválasztása" #: tfrmattributesedit.cbarchive.caption msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "&Archívum" #: tfrmattributesedit.cbcompressed.caption msgid "Co&mpressed" msgstr "Tö&mörített" #: tfrmattributesedit.cbdirectory.caption #| msgid "Directory" msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "&Könyvtár" #: tfrmattributesedit.cbencrypted.caption msgid "&Encrypted" msgstr "&Titkosított" #: tfrmattributesedit.cbhidden.caption msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "&Rejtett" #: tfrmattributesedit.cbreadonly.caption msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "Csak &olvasható" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmattributesedit.cbsparse.caption msgid "S&parse" msgstr "&Ritka" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Ragadós" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmattributesedit.cbsymlink.caption msgid "&Symlink" msgstr "&Szimbolikus hivatkozás" #: tfrmattributesedit.cbsystem.caption msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "&Rendszer" #: tfrmattributesedit.cbtemporary.caption msgid "&Temporary" msgstr "&Ideiglenes" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "NTFS attribútumok" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "Általános attribútumok" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bitek :" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Csoport" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Egyéb" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Tulajdonos" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "Végrehajtás" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "Olvasás" #: tfrmattributesedit.lbltextattrs.caption msgid "As te&xt:" msgstr "&Szövegként :" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "Írás" #: tfrmchecksumcalc.btncancel.caption #| msgid "Cancel" msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Mégsem" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmchecksumcalc.caption msgctxt "TFRMCHECKSUMCALC.CAPTION" msgid "Calculate check sum..." msgstr "Ellenőrző összeg számítása..." #: tfrmchecksumcalc.cbseparatefile.caption #| msgid "Create separate checksum file for each file" msgid "C&reate separate checksum file for each file" msgstr "&Külön MD5/SHA1 készítése fájlonként" #: tfrmchecksumcalc.lblsaveto.caption #| msgid "Save check sum file(s) to:" msgid "&Save check sum file(s) to:" msgstr "&Ellenőrzőösszeg(ek) mentése :" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Bezárás" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "Ellenőrző összeg vizsgálata..." #: tfrmconnectionmanager.btnadd.caption #| msgid "Add" msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "Hozzáadás" #: tfrmconnectionmanager.btncancel.caption #| msgid "Cancel" msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Mégsem" #: tfrmconnectionmanager.btnconnect.caption msgid "C&onnect" msgstr "&Csatlakozás" #: tfrmconnectionmanager.btndelete.caption #| msgid "Delete" msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "&Törlés" #: tfrmconnectionmanager.btnedit.caption #| msgid "Edit" msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "&Szerkesztés" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "Csatlakozás kezelő" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "Csatlakozás ide :" #: tfrmcopydlg.btnaddtoqueue.caption msgid "A&dd To Queue" msgstr "&Sorbaállít" #: tfrmcopydlg.btncancel.caption #| msgid "Cancel" msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Mégsem" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "TFRMCOPYDLG.BTNCREATESPECIALQUEUE.CAPTION" msgid "..." msgstr "..." #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "&Beállítások" #: tfrmcopydlg.btnsaveoptions.caption msgid "Sa&ve these options as default" msgstr "&Ezen beállítások az alapértelmezettek" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "Fájl(ok) másolása" #: tfrmdescredit.btncancel.caption #| msgid "Cancel" msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Mégsem" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "Fájl/Könyvtár megjegyzés" #: tfrmdescredit.lbleditcommentfor.caption #| msgid "Edit comment for:" msgid "E&dit comment for:" msgstr "&Megjegyzés szerkesztése :" #: tfrmdescredit.lblencoding.caption #| msgid "Encoding:" msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "&Kódolás :" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "Névjegy" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "Automatikus összehasonlítás" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "Bináris mód" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "Mégsem" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "Mégsem" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "Jobbra másolás" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "Jobbra másolás" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "Balra másolás" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "Balra másolás" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Másolás" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Kivágás" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Törlés" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Beillesztés" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Ismét" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "&Mind kiválasztása" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Visszavonás" #: tfrmdiffer.actexit.caption #| msgid "Exit" msgctxt "TFRMDIFFER.ACTEXIT.CAPTION" msgid "E&xit" msgstr "&Kilépés" #: tfrmdiffer.actfirstdifference.caption msgctxt "TFRMDIFFER.ACTFIRSTDIFFERENCE.CAPTION" msgid "First Difference" msgstr "Első különbség" #: tfrmdiffer.actfirstdifference.hint msgctxt "TFRMDIFFER.ACTFIRSTDIFFERENCE.HINT" msgid "First Difference" msgstr "Első különbség" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "Karakterkészlet figyelmen kívül hagyása" #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "Üres helyek figyelmen kívül hagyása" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "Folyamatos görgetés" #: tfrmdiffer.actlastdifference.caption msgctxt "TFRMDIFFER.ACTLASTDIFFERENCE.CAPTION" msgid "Last Difference" msgstr "Utolsó különbség" #: tfrmdiffer.actlastdifference.hint msgctxt "TFRMDIFFER.ACTLASTDIFFERENCE.HINT" msgid "Last Difference" msgstr "Utolsó különbség" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "Sor különbségek" #: tfrmdiffer.actnextdifference.caption msgctxt "TFRMDIFFER.ACTNEXTDIFFERENCE.CAPTION" msgid "Next Difference" msgstr "Következő különbség" #: tfrmdiffer.actnextdifference.hint msgctxt "TFRMDIFFER.ACTNEXTDIFFERENCE.HINT" msgid "Next Difference" msgstr "Következő különbség" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "Bal oldali megnyitása..." #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "Jobb oldali megnyitása..." #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "Háttér befestése" #: tfrmdiffer.actprevdifference.caption msgctxt "TFRMDIFFER.ACTPREVDIFFERENCE.CAPTION" msgid "Previous Difference" msgstr "Előző különbség" #: tfrmdiffer.actprevdifference.hint msgctxt "TFRMDIFFER.ACTPREVDIFFERENCE.HINT" msgid "Previous Difference" msgstr "Előző különbség" #: tfrmdiffer.actreload.caption msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "Új&ratölt" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "Újratölt" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "Mentés" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "Mentés" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "Mentés másként..." #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "Mentés másként..." #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "Bal oldali mentése" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "Bal oldali mentése" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "Bal oldali mentése másként..." #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "Bal oldali mentése másként..." #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "Jobb oldali mentése" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "Jobb oldali mentése" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "Jobb oldali mentése másként..." #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "Jobb oldali mentése másként..." #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "Összehasonlítás" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "Összehasonlítás" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "Kódolás" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "Kódolás" #: tfrmdiffer.caption msgctxt "TFRMDIFFER.CAPTION" msgid "Compare files" msgstr "Fájlok összehasonlítása" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miencodingleft.caption msgid "&Left" msgstr "&Bal" #: tfrmdiffer.miencodingright.caption msgid "&Right" msgstr "&Jobb" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "&Műveletek" #: tfrmdiffer.mnuedit.caption #| msgid "Edit" msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "Sz&erkesztés" #: tfrmdiffer.mnuencoding.caption msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "&Kódolás" #: tfrmdiffer.mnufile.caption #| msgid "File" msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "&Fájl" #: tfrmdiffer.mnuoptions.caption msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "&Beállítások" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "Új gyorsbillentyű hozzáadása a sorozathoz" #: tfrmedithotkey.btncancel.caption msgctxt "TFRMEDITHOTKEY.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Mégsem" #: tfrmedithotkey.btnok.caption msgctxt "TFRMEDITHOTKEY.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "Utolsó gyorsbillentyű eltávolítása a sorozatból" #: tfrmedithotkey.cghkcontrols.caption msgctxt "TFRMEDITHOTKEY.CGHKCONTROLS.CAPTION" msgid "Only for these controls" msgstr "Csak ezekhez a vezérlésekhez" #: tfrmedithotkey.lblparameters.caption msgid "&Parameters (each in a separate line):" msgstr "&Paraméterek (mind külön sorban) :" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "Gyorsbillentyűk :" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "Névjegy" #: tfrmeditor.actabout.hint msgctxt "TFRMEDITOR.ACTABOUT.HINT" msgid "About" msgstr "Névjegy" #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "&Konfiguráció" #: tfrmeditor.actconfhigh.hint msgctxt "TFRMEDITOR.ACTCONFHIGH.HINT" msgid "Configuration" msgstr "Beállítás" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Másolás" #: tfrmeditor.acteditcopy.hint msgctxt "TFRMEDITOR.ACTEDITCOPY.HINT" msgid "Copy" msgstr "Másolás" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Kivágás" #: tfrmeditor.acteditcut.hint msgctxt "TFRMEDITOR.ACTEDITCUT.HINT" msgid "Cut" msgstr "Kivágás" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Törlés" #: tfrmeditor.acteditdelete.hint msgctxt "TFRMEDITOR.ACTEDITDELETE.HINT" msgid "Delete" msgstr "Törlés" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "&Keresés" #: tfrmeditor.acteditfind.hint msgctxt "TFRMEDITOR.ACTEDITFIND.HINT" msgid "Find" msgstr "Keresés" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "Következő keresése" #: tfrmeditor.acteditfindnext.hint msgctxt "TFRMEDITOR.ACTEDITFINDNEXT.HINT" msgid "Find next" msgstr "Következő keresése" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "Mac (CR)" #: tfrmeditor.acteditlineendcr.hint msgctxt "TFRMEDITOR.ACTEDITLINEENDCR.HINT" msgid "Mac (CR)" msgstr "Mac (CR)" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "Windows (CRLF)" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "TFRMEDITOR.ACTEDITLINEENDCRLF.HINT" msgid "Windows (CRLF)" msgstr "Windows (CRLF)" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "Unix (LF)" #: tfrmeditor.acteditlineendlf.hint msgctxt "TFRMEDITOR.ACTEDITLINEENDLF.HINT" msgid "Unix (LF)" msgstr "Unix (LF)" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Beillesztés" #: tfrmeditor.acteditpaste.hint msgctxt "TFRMEDITOR.ACTEDITPASTE.HINT" msgid "Paste" msgstr "Beillesztés" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Ismét" #: tfrmeditor.acteditredo.hint msgctxt "TFRMEDITOR.ACTEDITREDO.HINT" msgid "Redo" msgstr "Ismét" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "&Helyettesítés" #: tfrmeditor.acteditrplc.hint msgctxt "TFRMEDITOR.ACTEDITRPLC.HINT" msgid "Replace" msgstr "Csere" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "Összes kiválasztás&a" #: tfrmeditor.acteditselectall.hint msgctxt "TFRMEDITOR.ACTEDITSELECTALL.HINT" msgid "Select All" msgstr "Összes kijelölése" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Visszavonás" #: tfrmeditor.acteditundo.hint msgctxt "TFRMEDITOR.ACTEDITUNDO.HINT" msgid "Undo" msgstr "Visszavonás" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "&Bezárás" #: tfrmeditor.actfileclose.hint msgctxt "TFRMEDITOR.ACTFILECLOSE.HINT" msgid "Close" msgstr "Bezárás" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "&Kilépés" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "Kilépés" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "Ú&j" #: tfrmeditor.actfilenew.hint msgctxt "TFRMEDITOR.ACTFILENEW.HINT" msgid "New" msgstr "Új" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "&Megnyitás" #: tfrmeditor.actfileopen.hint msgctxt "TFRMEDITOR.ACTFILEOPEN.HINT" msgid "Open" msgstr "Megnyitás" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "Menté&s" #: tfrmeditor.actfilesave.hint msgctxt "TFRMEDITOR.ACTFILESAVE.HINT" msgid "Save" msgstr "Mentés" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "Men&tés másként..." #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "Mentés másként" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "Ö&sszes mentése" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "Összes mentése" #: tfrmeditor.caption msgctxt "TFRMEDITOR.CAPTION" msgid "Editor" msgstr "Szerkesztő" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "&Súgó" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "S&zerkesztés" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "Kó&dolás" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "Megnyitás mint" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "Mentés mint" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "&Fájl" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "Szintaxis kiemelés" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "Sor vége" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n5.caption msgctxt "TFRMEDITOR.N5.CAPTION" msgid "-" msgstr "-" #: tfrmeditsearchreplace.btncancel.caption #| msgid "Cancel" msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Mégsem" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "Karakterér&zékeny" #: tfrmeditsearchreplace.cbsearchfromcursor.caption #| msgid "Search from &caret" msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "Keresés a hiány&jeltől" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "&Reguláris kifejezések" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "Csak a kiválasztott szöve&g" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "Csak a &teljes szavak" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "Opciók" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "&Helyettesítés ezzel :" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "&Keresés :" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "Irány" #: tfrmextractdlg.btncancel.caption #| msgid "Cancel" msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Mégsem" #: tfrmextractdlg.btnhelp.caption #| msgid "Help" msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "&Súgó" #: tfrmextractdlg.btnok.caption #| msgid "OK" msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmextractdlg.caption msgctxt "TFRMEXTRACTDLG.CAPTION" msgid "Unpack files" msgstr "Fájlok kibontása" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "Ú&tvonalak kibontása ha a fájlnév tartalmazza" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*.*" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "Minden archívum kibontása külön &alkönyvtárakba (archívnév)" #: tfrmextractdlg.cboverwrite.caption #| msgid "&Overwrite existing files" msgid "O&verwrite existing files" msgstr "Létező fájlok &felülírása" #: tfrmextractdlg.lblextractto.caption #| msgid "To the directory:" msgid "To the &directory:" msgstr "Fájl kicsomagolása ide :" #: tfrmextractdlg.lblfilemask.caption #| msgid "Extract files matching file mask:" msgid "&Extract files matching file mask:" msgstr "&Kibontandó fájlok :" #: tfrmextractdlg.lblpassword.caption msgid "&Password for encrypted files:" msgstr "Jelszó a titkosított fájl(ok)hoz :" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "Hozzáadás" #: tfrmfileassoc.btnaddext.caption #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "&Hozzáadás" #: tfrmfileassoc.btnaddnewtype.caption #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "&Hozzáadás" #: tfrmfileassoc.btncancel.caption #| msgid "Cancel" msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Mégsem" #: tfrmfileassoc.btndownact.caption #| msgid "Down" msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "&Le" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmfileassoc.btnremoveact.caption #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "&Eltávolítás" #: tfrmfileassoc.btnremoveext.caption #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "&Eltávolítás" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "X" #: tfrmfileassoc.btnremovetype.caption #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "&Eltávolítás" #: tfrmfileassoc.btnrenametype.caption #| msgid "Rename" msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "Át&nevezés" #: tfrmfileassoc.btnupact.caption #| msgid "Up" msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "&Fel" #: tfrmfileassoc.caption msgid "File associations" msgstr "Fájltársítások" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "Műveletek" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "Kiterjesztések" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "Fájltípusok" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "Ikon" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "Művelet :" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "&Parancs :" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "Szerkesztés :" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "Megnyitás szerkesztőben" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "Fájl neve" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "Fájl útvonala" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "Teljes elérési út" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "Parancs kimenetének kérése" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "Megnyitás" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "Futtatás terminálban" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "Megnyitás VFS-ben" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "Nézőke" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "Megnyitás nézőkében" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Bezárás" #: tfrmfileexecuteyourself.caption msgctxt "TFRMFILEEXECUTEYOURSELF.CAPTION" msgid "Wait..." msgstr "Várjon..." #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "Fájl neve :" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "Innen :" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "Kattintson a Bezárás gombra, ha az ideiglenes fájl törölhető!" #: tfrmfileop.btncancel.caption #| msgid "Cancel" msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Mégsem" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "&A panelbe" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "&Mind megtekintése" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "Jelenlegi művelet :" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "Innen :" #: tfrmfileop.lblto.caption msgid "To:" msgstr "Eddig :" #: tfrmfileproperties.btnclose.caption #| msgid "Close" msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Bezárás" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "&Tulajdonságok beállítása" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "&Minden kiválasztott fájlra" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "&Ezen fájl kihagyása" #: tfrmfileproperties.caption msgctxt "TFRMFILEPROPERTIES.CAPTION" msgid "Properties" msgstr "Tulajdonságok" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Ragadós" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "Tulajdonos" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bitek :" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Csoport" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Egyéb" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Tulajdonos" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmfileproperties.lblattrtextstr.caption #| msgid "Representation in text:" msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Szöveges megfelelő :" #: tfrmfileproperties.lblcontains.caption msgctxt "TFRMFILEPROPERTIES.LBLCONTAINS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "Tartalmaz :" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Végrehajtás" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "Fájl néve" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "Név :" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "Fájl neve" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "Útvonal :" #: tfrmfileproperties.lblgroupstr.caption #| msgid "Group" msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "&Csoport" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "Utolsó hozzáférés :" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "Utolsó módosítás :" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "Legutóbbi állapotváltozás :" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Oktális :" #: tfrmfileproperties.lblownerstr.caption #| msgid "Owner" msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "&Tulajdonos" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Olvasás" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "Méret :" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption #| msgid "Symlink:" msgid "Symlink to:" msgstr "Szimbolikus hivatkozás :" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption msgid "Type:" msgstr "Típus :" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Írás" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Attribútumok" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "Tulajdonságok" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "&Hozzáadás" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "&Súgó" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Bezárás" #: tfrmfinddlg.btnedit.caption #| msgid "Edit" msgctxt "TFRMFINDDLG.BTNEDIT.CAPTION" msgid "&Edit" msgstr "&Szerkesztés" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "&Ugrás fájlhoz" #: tfrmfinddlg.btnlastsearch.caption msgctxt "TFRMFINDDLG.BTNLASTSEARCH.CAPTION" msgid "&Last search" msgstr "&Utolsó keresés" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "Ú&j keresés" #: tfrmfinddlg.btnsavetemplate.caption msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "Menté&s" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "&Törlés" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "Be&töltés" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "M&entés" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption msgid "Sa&ve with \"Start in directory\"" msgstr "Me&ntés ezzel \"Indítás a mappába\"" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "Ha el van mentve \"Indítás a mappában\", akkor vissza lesz állítva a sablon betöltésekor. Használja akkor, ha szeretné rögzíteni a keresést egy adott mappában" #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "&Indítás" #: tfrmfinddlg.btnstop.caption #| msgid "Cancel" msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "&Mégsem" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "Sablon használata" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "&Nézőke" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "&Ablakba" #: tfrmfinddlg.caption msgctxt "TFRMFINDDLG.CAPTION" msgid "Find files" msgstr "Fájlok keresése" #: tfrmfinddlg.cbcasesens.caption #| msgid "Case sensitive" msgid "Case sens&itive" msgstr "Kisbetű/Nagybetű érzékeny" #: tfrmfinddlg.cbdatefrom.caption #| msgid "Date From:" msgid "&Date from:" msgstr "&Dátumtól :" #: tfrmfinddlg.cbdateto.caption #| msgid "Date To:" msgid "Dat&e to:" msgstr "Dá&tumig :" #: tfrmfinddlg.cbfilesizefrom.caption #| msgid "Size from:" msgid "S&ize from:" msgstr "&Fájlmérettől :" #: tfrmfinddlg.cbfilesizeto.caption #| msgid "Size to:" msgid "Si&ze to:" msgstr "Fá&jlméretig :" #: tfrmfinddlg.cbfindtext.caption #| msgid "Find in file" msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "&Keresés fájlban" #: tfrmfinddlg.cbfollowsymlinks.caption msgctxt "TFRMFINDDLG.CBFOLLOWSYMLINKS.CAPTION" msgid "Follow s&ymlinks" msgstr "&Szimbolikus hivatkozás követése" #: tfrmfinddlg.cbnotcontainingtext.caption #| msgid "Find files NOT containing the text" msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "A szöveget &NEM tartalmazó fájlok keresése" #: tfrmfinddlg.cbnotolderthan.caption #| msgid "Not older than:" msgid "N&ot older than:" msgstr "Nem régebbi mint :" #: tfrmfinddlg.cbpartialnamesearch.caption msgid "Searc&h for part of file name" msgstr "Keresés fájlnév &részletre" #: tfrmfinddlg.cbregexp.caption #| msgid "&Regular expressions" msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "&Reguláris kifejezések" #: tfrmfinddlg.cbreplacetext.caption #| msgid "Re&place text" msgid "Re&place by" msgstr "Szöveg &helyettesítése" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "Kiválasztott mappák és &fájlok" #: tfrmfinddlg.cbtimefrom.caption #| msgid "Time from:" msgid "&Time from:" msgstr "&Időtől :" #: tfrmfinddlg.cbtimeto.caption #| msgid "Time to:" msgid "Ti&me to:" msgstr "I&dőig :" #: tfrmfinddlg.cbuseplugin.caption #| msgid "Use search plugin:" msgid "&Use search plugin:" msgstr "Kereső &beépülő használata :" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "Írja be a mappák nevét amelyeket kizár a keresésből, \";\" az elválasztó" #: tfrmfinddlg.cmbexcludefiles.hint #| msgid "Enter files names that should be excluded from search separated wit" msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "Írja be a fájlok nevét amelyeket kizár a keresésből, \";\" az elválasztó" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "Írja be a fájlok nevét, \";\" az elválasztó" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption msgctxt "TFRMFINDDLG.GBDIRECTORIES.CAPTION" msgid "Directories" msgstr "Mappák" #: tfrmfinddlg.gbfiles.caption msgctxt "TFRMFINDDLG.GBFILES.CAPTION" msgid "Files" msgstr "Fájlok" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "Adat keresése" #: tfrmfinddlg.lblattributes.caption msgctxt "TFRMFINDDLG.LBLATTRIBUTES.CAPTION" msgid "Attri&butes" msgstr "Attri&bútumok" #: tfrmfinddlg.lblencoding.caption #| msgid "Encoding:" msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "&Kódolás :" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "&Almappák kizárása" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "Fájlok kizárása" #: tfrmfinddlg.lblfindfilemask.caption #| msgid "FileMask" msgid "&File mask" msgstr "&Fájl maszk" #: tfrmfinddlg.lblfindpathstart.caption #| msgid "&Start in directory" msgid "Start in &directory" msgstr "&Indítás a mappában" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "&Alkönyvtárak keresése :" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "&Előző keresések :" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "Eltávolít a listáról" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "Minden megtalált elem megjelenítése" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "Megjelenítés a nézőkében" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "Haladó" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "Betölt/Ment" #: tfrmfinddlg.tsplugins.caption msgctxt "TFRMFINDDLG.TSPLUGINS.CAPTION" msgid "Plugins" msgstr "Beépülők" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "Eredmények" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "Alap" #: tfrmfindview.btnclose.caption #| msgid "Cancel" msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "&Mégsem" #: tfrmfindview.btnfind.caption #| msgid "Find" msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "&Keresés" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "Keresés" #: tfrmfindview.cbcasesens.caption msgid "C&ase sensitive" msgstr "K&arakterérzékeny" #: tfrmhardlink.btncancel.caption #| msgid "Cancel" msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Mégsem" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmhardlink.caption #| msgid "Create hardlink" msgid "Create hard link" msgstr "Hardlink készítése" #: tfrmhardlink.lblexistingfile.caption #| msgid "Destination that the link will point to" msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Létező cél (erre fog mutatni a hivatkozás)" #: tfrmhardlink.lbllinktocreate.caption #| msgid "Link name" msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "&Hivatkozás neve" #: tfrmhotdir.btnadd.caption #| msgid "Add" msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "&Hozzáadás" #: tfrmhotdir.btnaddman.caption #| msgid "Add manually" msgid "Add &manually" msgstr "Hozzáadás &kézileg" #: tfrmhotdir.btncancel.caption #| msgid "Cancel" msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Mégsem" #: tfrmhotdir.btndelete.caption #| msgid "Delete" msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "&Törlés" #: tfrmhotdir.btnedit.caption #| msgid "Edit" msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "&Szerkesztés" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "Kedvenc könyvtárak" #: tfrmlinker.btnexit.caption #| msgid "Cancel" msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "&Kilépés" #: tfrmlinker.btnok.caption #| msgid "OK" msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "..." #: tfrmlinker.caption msgctxt "TFRMLINKER.CAPTION" msgid "Linker" msgstr "Linker" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "Mentés másként..." #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "Tétel" #: tfrmlinker.lblfilename.caption #| msgid "File name" msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "&Fájl neve" #: tfrmlinker.spbtndel.caption #| msgid "Delete" msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "&Törlés" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "Törlés" #: tfrmlinker.spbtndown.caption #| msgid "Down" msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "&Le" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "Le" #: tfrmlinker.spbtnup.caption #| msgid "Up" msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "&Fel" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "Fel" #: tfrmmain.actabout.caption #| msgid "About" msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "&Névjegy" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "Fájlnév hozzáadása a parancssorhoz" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "Útvonal és fájlnév hozzáadása a parancssorhoz" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "Útvonal másolása parancssorba" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "Rövid nézet" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "Rövid nézet" #: tfrmmain.actcalculatespace.caption #| msgid "Calculate &Occupied Space..." msgid "Calculate &Occupied Space" msgstr "Elfoglalt &terület számítása..." #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "Könyvtár cseréje" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "Szülő könyvtárra cserél" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "Gyökér könyvtárra cserél" #: tfrmmain.actchecksumcalc.caption #| msgid "Calculate check sum..." msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "Ellenőrző összeg számítása..." #: tfrmmain.actchecksumverify.caption #| msgid "Verify check sum..." msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "Ellenőrző összeg &vizsgálata..." #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "Naplófájl űrítése" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "Naplóablak űrítése" #: tfrmmain.actclosealltabs.caption #| msgid "Remove &All Tabs" msgctxt "TFRMMAIN.ACTCLOSEALLTABS.CAPTION" msgid "Close &All Tabs" msgstr "Ö&sszes fül bezárása" #: tfrmmain.actclosetab.caption #| msgid "&Remove Tab" msgctxt "TFRMMAIN.ACTCLOSETAB.CAPTION" msgid "&Close Tab" msgstr "&Fül bezárása" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "Következő parancssor" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "Parancssor beállítása a következő parancsra az előzményekből" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "Előző parancssor" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "Parancssor beállítása a előző parancsra az előzményekből" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "Teljes" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "Oszlopnézet" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "Összehasonlítás &tartalom alapján" #: tfrmmain.actcomparedirectories.caption msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.CAPTION" msgid "Compare Directories" msgstr "Mappák összehasonlítása" #: tfrmmain.actcomparedirectories.hint msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.HINT" msgid "Compare Directories" msgstr "Mappák összehasonlítása" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "Helyi menü megjelenítése" #: tfrmmain.actcopy.caption #| msgid "Copy" msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "Másolás" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "Fájlnév másolása &teljes elérési úttal" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "Fájlnév másolása a &vágólapra" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "Megerősítés nélküli másolás" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "Másolás ugyanarra a panelre" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "&Másolás" #: tfrmmain.actcountdircontent.caption #| msgid "Sho&w occupied space" msgid "Sho&w Occupied Space" msgstr "Elfoglalt &terület megjelenítése" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "&Kivágás" #: tfrmmain.actdelete.caption #| msgid "Delete" msgctxt "TFRMMAIN.ACTDELETE.CAPTION" msgid "Delete" msgstr "Törlés" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "Könyvtár előzmények" #: tfrmmain.actdirhotlist.caption #| msgid "Directory &hotlist" msgid "Directory &Hotlist" msgstr "Kedvenc &könyvtárak" #: tfrmmain.actedit.caption #| msgid "Edit" msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "Szerkeszt" #: tfrmmain.acteditcomment.caption #| msgid "Edit comment..." msgid "Edit Co&mment..." msgstr "Megjegyzés s&zerkesztése..." #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "Új fájl szerkesztése" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "Útvonalmező szerkesztése a fájl felett" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "Panelek &cseréje" #: tfrmmain.actexit.caption #| msgid "Exit" msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "&Kilépés" #: tfrmmain.actextractfiles.caption #| msgid "Extract files..." msgid "&Extract Files..." msgstr "Fájlok &kibontása..." #: tfrmmain.actfileassoc.caption #| msgid "File &associations..." msgid "File &Associations..." msgstr "Fájl&társítások..." #: tfrmmain.actfilelinker.caption msgid "Com&bine Files..." msgstr "&Fájlegyesítés..." #: tfrmmain.actfileproperties.caption #| msgid "Show file properties" msgid "Show &File Properties" msgstr "&Fájl tulajdonságainak megjelenítése" #: tfrmmain.actfilespliter.caption #| msgid "Split file" msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "Fájl szele&telése" #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "Parancssorra fókuszálás" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "Kurzor helyezése az első fájlra" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "Kurzor helyezése az utolsó fájlra" #: tfrmmain.acthardlink.caption #| msgid "Create hard link..." msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "&Hivatkozás létrehozása..." #: tfrmmain.acthelpindex.caption #| msgid "Contents" msgid "&Contents" msgstr "&Tartalomjegyzék" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "&Vízszintes elrendezés" #: tfrmmain.actkeyboard.caption #| msgid "Keyboard" msgid "&Keyboard" msgstr "Billentyűzet" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "Bal &= Jobb" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "Baloldali meghajtólista megnyitása" #: tfrmmain.actloadselectionfromclip.caption msgid "Load Selection from Clip&board" msgstr "Kiválasztás betöltése a &vágólapról" #: tfrmmain.actloadselectionfromfile.caption msgid "&Load Selection from File..." msgstr "Kiválasztás betöltése &fájlból" #: tfrmmain.actmakedir.caption #| msgid "MakeDir" msgid "MakeDir" msgstr "Új könyvtár" #: tfrmmain.actmarkcurrentextension.caption #| msgid "Select all with same extension" msgid "Select All with the Same E&xtension" msgstr "Minden &azonos kiterjesztésű kijelölése" #: tfrmmain.actmarkinvert.caption #| msgid "Invert Selections" msgid "&Invert Selection" msgstr "Kijelölés meg&fordítása" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "&Minden kiválasztása" #: tfrmmain.actmarkminus.caption #| msgid "Unselect a group" msgid "Unselect a Gro&up..." msgstr "&Csoportos kijelölés megszüntetése" #: tfrmmain.actmarkplus.caption #| msgid "Select a group" msgid "Select a &Group..." msgstr "Csoport &kijelölése" #: tfrmmain.actmarkunmarkall.caption #| msgid "Unselect All" msgid "&Unselect All" msgstr "Összes kijelölés me&gszüntetése" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "Kis méret" #: tfrmmain.actmultirename.caption #| msgid "Multi Rename Tool" msgid "Multi &Rename Tool" msgstr "Csoportos át&nevezés" #: tfrmmain.actnetworkconnect.caption msgid "Network &Connect..." msgstr "Hálózati &csatlakozás..." #: tfrmmain.actnetworkdisconnect.caption msgid "Network &Disconnect" msgstr "Hálózati &szétkapcsolás" #: tfrmmain.actnetworkquickconnect.caption msgid "Network &Quick Connect..." msgstr "Hálózati &gyors csatlakozás..." #: tfrmmain.actnewtab.caption #| msgid "&New tab" msgid "&New Tab" msgstr "Új &fül" #: tfrmmain.actnexttab.caption #| msgid "Switch to nex&t tab" msgid "Switch to Nex&t Tab" msgstr "Váltás a &következő fülre" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "Megnyitás" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "Archív megnyitásának kísérlete" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "Sávfájl megnyitása" #: tfrmmain.actopendirinnewtab.caption #| msgid "Open &folder in new tab" msgid "Open &Folder in a New Tab" msgstr "&Mappa megnyitása új fülön" #: tfrmmain.actopenvirtualfilesystemlist.caption msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "&VFS lista megnyitása" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "&Műveletek nézőke" #: tfrmmain.actoptions.caption #| msgid "Options..." msgid "&Options..." msgstr "&Beállítások..." #: tfrmmain.actpackfiles.caption #| msgid "Pack files..." msgid "&Pack Files..." msgstr "Fájlok &tömörítése..." #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "Elválasztó pozíciójának beállítás" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "&Beillesztés" #: tfrmmain.actprevtab.caption #| msgid "Switch to &previous tab" msgid "Switch to &Previous Tab" msgstr "Váltás az &előző fülre" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "Gyors szűrő" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "Gyorskeresés" #: tfrmmain.actquickview.caption msgid "&Quick View Panel" msgstr "&Gyorsnézőke panel" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "&Frissítés" #: tfrmmain.actrename.caption #| msgid "Move" msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "Áthely/Átnev." #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "Fájlok mozgatása/átnevezése megerősítő kérdés nélkül" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "Átnevezés" #: tfrmmain.actrenametab.caption msgid "&Rename Tab" msgstr "Fül át&nevezése" #: tfrmmain.actrestoreselection.caption msgid "&Restore Selection" msgstr "Kijelölt &visszaállítása" #: tfrmmain.actreverseorder.caption #| msgid "Reverse order" msgid "Re&verse Order" msgstr "For&dított sorrend" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "Jobb &= Bal" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "Jobboldali meghajtólista megnyitása" #: tfrmmain.actrunterm.caption #| msgid "Run Term" msgid "Run &Terminal" msgstr "&Terminál futtatása" #: tfrmmain.actsaveselection.caption msgid "Sa&ve Selection" msgstr "Kiválasztott men&tése" #: tfrmmain.actsaveselectiontofile.caption msgid "Save S&election to File..." msgstr "Kiválasztott m&entése fájlba..." #: tfrmmain.actsearch.caption #| msgid "&Search" msgid "&Search..." msgstr "&Keresés..." #: tfrmmain.actsetfileproperties.caption msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "&Attribútumok cseréje..." #: tfrmmain.actsettaboptiondirsinnewtab.caption msgid "Locked with Directories Opened in New &Tabs" msgstr "Zárolva ezzel : ú&j füleken megnyitott könyvtárak" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "&Rendes" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "&Zárolt" #: tfrmmain.actsettaboptionpathresets.caption msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "Zárolva ezzel : könyvár &változások engedélyezése" #: tfrmmain.actshellexecute.caption msgctxt "TFRMMAIN.ACTSHELLEXECUTE.CAPTION" msgid "Open" msgstr "Megnyitás" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "Megnyitás a rendszertársítottal" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "Gyorsgomb menü megjelenítése" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "Parancssori előzmények megjelenítése" #: tfrmmain.actshowmainmenu.caption #| msgid "Menu" msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "Menü" #: tfrmmain.actshowsysfiles.caption #| msgid "Show hidden/system files" msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "Rejtett/Rendszer fájlok &megjelenítése" #: tfrmmain.actsortbyattr.caption #| msgid "Sort by attrib" msgid "Sort by &Attributes" msgstr "Rendezés &attribútumok szerint" #: tfrmmain.actsortbydate.caption #| msgid "Sort by date" msgid "Sort by &Date" msgstr "Rendezés &dátum szerint" #: tfrmmain.actsortbyext.caption #| msgid "Sort by extension" msgid "Sort by &Extension" msgstr "Rendezés &kiterjesztés szerint" #: tfrmmain.actsortbyname.caption #| msgid "Sort by name" msgid "Sort by &Name" msgstr "Rendezés &név szerint" #: tfrmmain.actsortbysize.caption #| msgid "Sort by size" msgid "Sort by &Size" msgstr "Rendezés &méret szerint" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "Kihagyási lista engedélyezése/kikapcsolása, hogy nem mutatja fájlneveket" #: tfrmmain.actsymlink.caption #| msgid "Create symbolic link..." msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "&Szimbolikus hivatkozás készítése.." #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "Cél &= Forrás" #: tfrmmain.acttestarchive.caption msgid "&Test Archive(s)" msgstr "A&rchívum(ok) tesztelése" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "Miniatűrök" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "Bélyegkép-nézet" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "Kurzor alatti mappa küldése a bal ablakba" #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "Kurzor alatti mappa küldése a jobb ablakba" #: tfrmmain.actunmarkcurrentextension.caption #| msgid "Unselect all with same extension" msgid "Unselect All with the Same Ex&tension" msgstr "Összes azonos kiterjesztésű kijelölésének megszüntetése" #: tfrmmain.actview.caption #| msgid "View" msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "Nézőke" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "Aktív nézet előzményeinek megtekintése" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "Következő előzményre ugrik" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "Előző előzményre ugrik" #: tfrmmain.actvisithomepage.caption #| msgid "&Visit Double Commander Web Site" msgid "&Visit Double Commander Website" msgstr "&Látogassa meg a Double Commander honlapját" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "Eltöröl" #: tfrmmain.btnf10.caption msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "Kilépés" #: tfrmmain.btnf8.caption #| msgid "Delete" msgctxt "TFRMMAIN.BTNF8.CAPTION" msgid "Delete" msgstr "Törlés" #: tfrmmain.btnf9.caption #| msgid "Terminal" msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "Terminál" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.HINT" msgid "Directory hotlist" msgstr "Kedvenc könyvtárak" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "<" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "A jelenlegi jobb oldali könyvtár megtekintése a bal ablakban" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnlefthome.hint msgctxt "TFRMMAIN.BTNLEFTHOME.HINT" msgid "Go to home directory" msgstr "Ugrás a saját mappába" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgctxt "TFRMMAIN.BTNLEFTROOT.HINT" msgid "Go to root directory" msgstr "Ugrás a gyökérkönyvtárba" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgctxt "TFRMMAIN.BTNLEFTUP.HINT" msgid "Go to parent directory" msgstr "Ugrás a szülőkönyvtárba" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr ">" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "A jelenlegi bal oldali könyvtár megtekintése a jobb ablakban" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "TFRMMAIN.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "Útvonal" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "&20/80" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "&30/70" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "&40/60" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "&50/50" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "&60/40" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "&70/30" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "&80/20" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "Mégsem" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "Másolás..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "Hivatkozás készítése..." #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline33.caption msgctxt "TFRMMAIN.MILINE33.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline37.caption msgctxt "TFRMMAIN.MILINE37.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "-" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "Ürítés" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "Másolás" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "Elrejtés" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "Összes kijelölése" #: tfrmmain.mimove.caption msgid "Move..." msgstr "Áthelyezés..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "Szimbolikus hivatkozás készítése..." #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "Fül beállítások" #: tfrmmain.mitrayiconexit.caption #| msgid "Exit" msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "&Kilépés" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "Visszaállítás" #: tfrmmain.mnualloperpause.caption msgctxt "TFRMMAIN.MNUALLOPERPAUSE.CAPTION" msgid "||" msgstr "||" #: tfrmmain.mnualloperstart.caption msgctxt "TFRMMAIN.MNUALLOPERSTART.CAPTION" msgid "Start" msgstr "Indítás" #: tfrmmain.mnualloperstop.caption msgctxt "TFRMMAIN.MNUALLOPERSTOP.CAPTION" msgid "Cancel" msgstr "Mégsem" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "&Parancsok" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "&Beállítások" #: tfrmmain.mnufiles.caption #| msgid "Files" msgid "&Files" msgstr "Fájlok" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "&Súgó" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "&Megjelölés" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "Hálózat" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "&Nézet" #: tfrmmain.mnutaboptions.caption msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "&Beállítások" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "&Fülek" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "CD" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "Másolás" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "Kivágás" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "Törlés" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "Szerkesztés" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "Beillesztés" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmmaskinputdlg.btncancel.caption #| msgid "Cancel" msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Mégsem" #: tfrmmaskinputdlg.btndefinetemplate.caption msgid "&Define..." msgstr "&Meghatároz..." #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmmaskinputdlg.lblsearchtemplate.caption msgid "O&r select predefined selection type:" msgstr "&vagy válasszon előre meghatározott kiválasztási típust :" #: tfrmmkdir.btncancel.caption #| msgid "Cancel" msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Mégsem" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmmkdir.caption msgid "Create new directory" msgstr "Új könyvtár létrehozása" #: tfrmmkdir.lblmakedir.caption #| msgid "Input new directory name:" msgid "&Input new directory name:" msgstr "Adja meg az új könyvtár nevét :" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "Pr" #: tfrmmodview.caption msgctxt "TFRMMODVIEW.CAPTION" msgid "New Size" msgstr "Új méret" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "Magasság :" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgctxt "tfrmmodview.lblpath2.caption" msgid "2" msgstr "2" #: tfrmmodview.lblpath3.caption msgctxt "tfrmmodview.lblpath3.caption" msgid "3" msgstr "3" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "4" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "5" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "JPG-be való sűrítés minősége" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "Szélesség :" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "BMP" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "ICO" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "JPG" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "PNG" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "PNM" #: tfrmmodview.teheight.text msgid "Height" msgstr "Magasság" #: tfrmmodview.tequality.text msgid "80" msgstr "80" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "Szélesség" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Bezárás" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "&Törlés" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "Betö<és" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "Átnevezés (&R)" #: tfrmmultirename.btnrestore.caption #| msgid "Reset all" msgid "Reset &all" msgstr "Mind visszaállítása" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "Menté&s" #: tfrmmultirename.caption msgctxt "TFRMMULTIRENAME.CAPTION" msgid "MultiRename" msgstr "Csoportos Átnevező" #: tfrmmultirename.cblog.caption #| msgid "Enable" msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "E&ngedélyez" #: tfrmmultirename.cbregexp.caption #| msgid "&Regular expressions" msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "&Reguláris kifejezések" #: tfrmmultirename.cbusesubs.caption #| msgid "Use substitution" msgid "&Use substitution" msgstr "&Helyettesítések használata" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption #| msgid "[E]xtension" msgid "[E] Extension" msgstr "[E] Kiterjesztés" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "Számláló" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "Keresés && Csere" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "Eredmény naplózása" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "Maszk" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "Előre beállított" #: tfrmmultirename.lbext.caption #| msgid "Extension" msgid "&Extension" msgstr "&Kiterjesztés" #: tfrmmultirename.lbfind.caption #| msgid "Find..." msgid "&Find..." msgstr "&Keresés..." #: tfrmmultirename.lbinterval.caption #| msgid "Interval" msgid "&Interval" msgstr "&Intervallum" #: tfrmmultirename.lbname.caption #| msgid "File Name" msgid "File &Name" msgstr "Fájl &neve" #: tfrmmultirename.lbreplace.caption #| msgid "Replace..." msgid "Re&place..." msgstr "&Csere..." #: tfrmmultirename.lbstnb.caption #| msgid "Start Number" msgid "S&tart Number" msgstr "&Kezdőszám" #: tfrmmultirename.lbwidth.caption #| msgid "Width" msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "&Szélesség" #: tfrmmultirename.micounter.caption #| msgid "[C]ounter" msgid "[C] Counter" msgstr "[C] Számláló" #: tfrmmultirename.miday.caption #| msgid "[D]ay" msgid "[D] Day" msgstr "[D] Nap" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "[DD] Nap (2 számjegy)" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "[DDD] A hét neve (röviden, pl : \"hét\")" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "[DDDD] A hét neve (hosszan, pl : \"hétfő\")" #: tfrmmultirename.miextensionx.caption #| msgid "[Ex]xtension" msgid "[Ex] Character at position x" msgstr "[Ex] Kiterjesztés" #: tfrmmultirename.miextensionxx.caption #| msgid "[Ex:x]xtension" msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:y] Kiterjesztés" #: tfrmmultirename.mihour.caption #| msgid "[h]our" msgid "[h] Hour" msgstr "[h] Óra" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "[hh] Óra (2 számjegy)" #: tfrmmultirename.miminute.caption #| msgid "Mi[n]ute" msgid "[n] Minute" msgstr "[n] Perc" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "[nn] Perc (2 számjegy)" #: tfrmmultirename.mimonth.caption #| msgid "[M]onth" msgid "[M] Month" msgstr "[M] Hónap" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "[MM] Hónap (2 számjegy)" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "[MMM] Hónap neve (röviden, pl : \"jan\")" #: tfrmmultirename.mimonth3.caption msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "[MMMM] Hónap neve (hosszan, pl : \"január\")" #: tfrmmultirename.miname.caption #| msgid "[N]ame" msgid "[N] Name" msgstr "[N] Név" #: tfrmmultirename.minamex.caption #| msgid "[Nx]ame" msgid "[Nx] Character at position x" msgstr "[Nx] Név" #: tfrmmultirename.minamexx.caption #| msgid "[Nx:x]ame" msgid "[Nx:y] Characters from position x to y" msgstr "[Nx:x] Név" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "Idő..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "Kiterjesztés..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "Név..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "Beépülő" #: tfrmmultirename.misecond.caption #| msgid "[s]econd" msgid "[s] Second" msgstr "[s] Másodperc" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "[ss] Másodperc (2 számjegy)" #: tfrmmultirename.miyear.caption #| msgid "[Y] Year" msgid "[Y] Year (2 digits)" msgstr "[Y] Év (2 számjegy)" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "[YYYY] Év (4 számjegy)" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "---" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "TFRMMULTIRENAME.STRINGGRID.COLUMNS[0].TITLE.CAPTION" msgid "Old File Name" msgstr "Fájl régi neve" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "TFRMMULTIRENAME.STRINGGRID.COLUMNS[1].TITLE.CAPTION" msgid "New File Name" msgstr "Fájl új neve" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "TFRMMULTIRENAME.STRINGGRID.COLUMNS[2].TITLE.CAPTION" msgid "File Path" msgstr "Fájl útvonala" #: tfrmopenwith.caption msgid "Choose an application" msgstr "Alkalmazás kiválasztása" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "Egyéni parancs" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "Társítások mentése" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "Kiválasztott alkalmazások az alapértelmezettek" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "Fájltípus legyen megnyitva : %s" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "Összetett fájl nevek" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "%F" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "Összetett URI-k" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "%U" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "Egyszerű fájlnév" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "%f" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "Egyszerű URI" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "%u" #: tfrmoptions.btnapply.caption #| msgid "Apply" msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "&Alkalmaz" #: tfrmoptions.btncancel.caption #| msgid "Cancel" msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Mégsem" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmoptions.caption msgctxt "TFRMOPTIONS.CAPTION" msgid "Options" msgstr "Opciók" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "Kérem, válasszon egyet az aloldalak közül, ez az oldal nem tartalmaz beállításokat" #: tfrmoptionsarchivers.btnautoconfig.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNAUTOCONFIG.CAPTION" msgid "A&uto Configure" msgstr "A&utomatikus beállítás" #: tfrmoptionsarchivers.btnmultiarcadd.caption #| msgid "Add" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCADD.CAPTION" msgid "A&dd" msgstr "&Hozzáadás" #: tfrmoptionsarchivers.btnmultiarcapply.caption #| msgid "Apply" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCAPPLY.CAPTION" msgid "A&pply" msgstr "&Alkalmaz" #: tfrmoptionsarchivers.btnmultiarcdelete.caption #| msgid "Delete" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCDELETE.CAPTION" msgid "D&elete" msgstr "&Törlés" #: tfrmoptionsarchivers.btnmultiarcrename.caption #| msgid "Rename" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCRENAME.CAPTION" msgid "&Rename" msgstr "Át&nevezés" #: tfrmoptionsarchivers.chkmultiarcdebug.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCDEBUG.CAPTION" msgid "De&bug mode" msgstr "&Hibakereső mód" #: tfrmoptionsarchivers.chkmultiarcenabled.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCENABLED.CAPTION" msgid "E&nabled" msgstr "E&ngedélyezve" #: tfrmoptionsarchivers.chkmultiarcoutput.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCOUTPUT.CAPTION" msgid "S&how console output" msgstr "Konzol kimenet megjelenítése" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "TFRMOPTIONSARCHIVERS.GBARCHIVEROPTIONS.CAPTION" msgid "Options" msgstr "Opciók" #: tfrmoptionsarchivers.lblarchiveadd.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEADD.CAPTION" msgid "Add&ing:" msgstr "Hozzá&adás" #: tfrmoptionsarchivers.lblarchiveextension.caption #| msgid "Extension:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTENSION.CAPTION" msgid "E&xtension:" msgstr "&Kiterjesztés :" #: tfrmoptionsarchivers.lblarchiveextract.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTRACT.CAPTION" msgid "Ex&tract:" msgstr "Ki&bont :" #: tfrmoptionsarchivers.lblarchivelist.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELIST.CAPTION" msgid "&List:" msgstr "&Lista :" #: tfrmoptionsarchivers.lblarchivelistend.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTEND.CAPTION" msgid "Listing &finish (optional):" msgstr "Listázás &befejezve (választható) :" #: tfrmoptionsarchivers.lblarchivelistformat.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTFORMAT.CAPTION" msgid "Listing for&mat:" msgstr "Listázási for&mátum :" #: tfrmoptionsarchivers.lblarchiveliststart.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTSTART.CAPTION" msgid "Listin&g start (optional):" msgstr "Listázás &kezdése (választható) :" #: tfrmoptionsarchivers.lblarchiver.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVER.CAPTION" msgid "Arc&hiver:" msgstr "Tö&mötírő :" #: tfrmoptionsarchivers.lbldescription.caption #| msgid "Description:" msgctxt "TFRMOPTIONSARCHIVERS.LBLDESCRIPTION.CAPTION" msgid "De&scription:" msgstr "Leírá&s :" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERADDITIONAL.CAPTION" msgid "Additional" msgstr "További" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERGENERAL.CAPTION" msgid "General" msgstr "Általános" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption #| msgid "Also when &size, date, or attributes change" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHATTRIBUTESCHANGE.CAPTION" msgid "When &size, date or attributes change" msgstr "Méret, dátum vagy attribútum változása esetén is" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHEXCLUDEDIRS.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "A következő útvonalakhoz és az alma&ppáikhoz :" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption #| msgid "When files are &created, deleted or renamed" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHFILENAMECHANGE.CAPTION" msgid "When &files are created, deleted or renamed" msgstr "Frissítés fájlok létrehozása, törlése és átnevezése esetén" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHONLYFOREGROUND.CAPTION" msgid "When application is in the &background" msgstr "Amikor az alkalmazás a &háttérben fut" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHDISABLE.CAPTION" msgid "Disable auto-refresh" msgstr "Auto-frissítés kikapcsolása" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHENABLE.CAPTION" msgid "Refresh file list" msgstr "Fájl lista frissítése" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBALWAYSSHOWTRAYICON.CAPTION" msgid "Al&ways show tray icon" msgstr "Mindig mutatja a tálca ikont" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption msgid "Automatically &hide unmounted devices" msgstr "&Nem csatlakoztatott eszközök automatikus elrejtése" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBMINIMIZETOTRAY.CAPTION" msgid "Mo&ve icon to system tray when minimized" msgstr "&Ikon tálcára minimalizálása" #: tfrmoptionsbehavior.cbonlyonce.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBONLYONCE.CAPTION" msgid "A&llow only one copy of DC at a time" msgstr "cs&ak 1 DC futhat" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "Ide beírhat egy vagy több meghajtót vagy csatolási pontot, elkülönítve ezzel : \";\"" #: tfrmoptionsbehavior.lbldrivesblacklist.caption msgid "Drives &blacklist" msgstr "Meghajtó &feketelista" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption #| msgid "Cut text to column width" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBCUTTEXTTOCOLWIDTH.CAPTION" msgid "Cut &text to column width" msgstr "Szöveg &vágása az oszlop szélességéhez" #: tfrmoptionscolumnsview.cbgridhorzline.caption #| msgid "Horizontal lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDHORZLINE.CAPTION" msgid "&Horizontal lines" msgstr "&Vízszintes vonalak" #: tfrmoptionscolumnsview.cbgridvertline.caption #| msgid "Vertical lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDVERTLINE.CAPTION" msgid "&Vertical lines" msgstr "&Függőleges vonalak" #: tfrmoptionscolumnsview.chkautofillcolumns.caption msgctxt "TFRMOPTIONSCOLUMNSVIEW.CHKAUTOFILLCOLUMNS.CAPTION" msgid "A&uto fill columns" msgstr "Automatikus oszlop kitöltés" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "Rácsok megjelenítése" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "Automatikus oszlopméret" #: tfrmoptionscolumnsview.lblautosizecolumn.caption msgctxt "TFRMOPTIONSCOLUMNSVIEW.LBLAUTOSIZECOLUMN.CAPTION" msgid "Auto si&ze column:" msgstr "Automatikus os&zlopméret :" #: tfrmoptionsconfiguration.btnconfigapply.caption #| msgid "Apply" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGAPPLY.CAPTION" msgid "A&pply" msgstr "&Alkalmaz" #: tfrmoptionsconfiguration.btnconfigedit.caption #| msgid "Edit" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGEDIT.CAPTION" msgid "&Edit" msgstr "S&zerkesztés" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption #| msgid "Command line history" msgctxt "TFRMOPTIONSCONFIGURATION.CBCMDLINEHISTORY.CAPTION" msgid "Co&mmand line history" msgstr "Parancssori előz&mények" #: tfrmoptionsconfiguration.cbdirhistory.caption #| msgid "Directory history" msgctxt "TFRMOPTIONSCONFIGURATION.CBDIRHISTORY.CAPTION" msgid "&Directory history" msgstr "&Könyvtár előzmények" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption #| msgid "File mask history" msgctxt "TFRMOPTIONSCONFIGURATION.CBFILEMASKHISTORY.CAPTION" msgid "&File mask history" msgstr "&Fájlmaszk előzmények" #: tfrmoptionsconfiguration.chksaveconfiguration.caption msgctxt "TFRMOPTIONSCONFIGURATION.CHKSAVECONFIGURATION.CAPTION" msgid "Sa&ve configuration" msgstr "B&eállítások mentése" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption msgctxt "TFRMOPTIONSCONFIGURATION.CHKSEARCHREPLACEHISTORY.CAPTION" msgid "Searc&h/Replace history" msgstr "Keresés/Csere előzmé&nyek" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBLOCCONFIGFILES.CAPTION" msgid "Location of configuration files" msgstr "Konfigurációs állományok helye" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBSAVEONEXIT.CAPTION" msgid "Save on exit" msgstr "Mentés kilépéskor" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgctxt "TFRMOPTIONSCONFIGURATION.LBLCMDLINECONFIGDIR.CAPTION" msgid "Set on command line" msgstr "Állítsa be a parancssorra" #: tfrmoptionsconfiguration.rbprogramdir.caption #| msgid "Program directory (portable version)" msgctxt "TFRMOPTIONSCONFIGURATION.RBPROGRAMDIR.CAPTION" msgid "P&rogram directory (portable version)" msgstr "P&rogram könyvtár (hordozható változat)" #: tfrmoptionsconfiguration.rbuserhomedir.caption #| msgid "User home directory" msgctxt "TFRMOPTIONSCONFIGURATION.RBUSERHOMEDIR.CAPTION" msgid "&User home directory" msgstr "Felhasználó &saját könyvtára" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption #| msgid "Copy" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNCOPYCOLUMNSSET.CAPTION" msgid "C&opy" msgstr "&Másolás" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption #| msgid "Delete" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNDELCOLUMNSSET.CAPTION" msgid "&Delete" msgstr "&Törlés" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption #| msgid "Edit" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNEDITCOLUMNSSET.CAPTION" msgid "&Edit" msgstr "S&zerkesztés" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNNEWCOLUMNSSET.CAPTION" msgid "&New" msgstr "Ú&j" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.CBBFILESYSTEM.TEXT" msgid "General" msgstr "Általános" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption #| msgid "Configure columns for file system:" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.LBLCONFIGCOLUMNS.CAPTION" msgid "Con&figure columns for file system:" msgstr "Fájlrendszer &oszlopok beállítása :" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption msgid "&Show confirmation dialog after drop" msgstr "Megerő&sítő ablak megjelenítése \"ejtés\" után" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption msgid "Show &file system" msgstr "&Fájlrendszer megjelenítése" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption msgid "Show fr&ee space" msgstr "Szabad t&erület megjelenítése" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption msgid "Show &label" msgstr "Címke megje&lenítése" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "Meghajtólista" #: tfrmoptionseditorcolors.backgroundlabel.caption msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "Hát&tér" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption msgctxt "TFRMOPTIONSEDITORCOLORS.BACKGROUNDUSEDEFAULTCHECKBOX.CAPTION" msgid "Bac&kground" msgstr "Hát&tér" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "Elem attribútumai" #: tfrmoptionseditorcolors.foregroundlabel.caption msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "Előté&r" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption msgctxt "TFRMOPTIONSEDITORCOLORS.FOREGROUNDUSEDEFAULTCHECKBOX.CAPTION" msgid "Fo®round" msgstr "Előté&r" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption msgid "&Text-mark" msgstr "S&zöveg-megjelölés" #: tfrmoptionseditorcolors.tbtnglobal.caption msgid "Use (and edit) &global scheme settings" msgstr "&Globalis vázlat használata (és módosítása)" #: tfrmoptionseditorcolors.tbtnlocal.caption msgid "Use &local scheme settings" msgstr "He&lyi vázlat használata" #: tfrmoptionseditorcolors.textboldcheckbox.caption msgid "&Bold" msgstr "&Félkövér" #: tfrmoptionseditorcolors.textboldradioinvert.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTBOLDRADIOINVERT.CAPTION" msgid "In&vert" msgstr "&Fordított" #: tfrmoptionseditorcolors.textboldradiooff.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTBOLDRADIOOFF.CAPTION" msgid "O&ff" msgstr "&Ki" #: tfrmoptionseditorcolors.textboldradioon.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTBOLDRADIOON.CAPTION" msgid "O&n" msgstr "&Be" #: tfrmoptionseditorcolors.textitaliccheckbox.caption msgid "&Italic" msgstr "&Dőlt" #: tfrmoptionseditorcolors.textitalicradioinvert.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTITALICRADIOINVERT.CAPTION" msgid "In&vert" msgstr "&Fordított" #: tfrmoptionseditorcolors.textitalicradiooff.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTITALICRADIOOFF.CAPTION" msgid "O&ff" msgstr "&Ki" #: tfrmoptionseditorcolors.textitalicradioon.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTITALICRADIOON.CAPTION" msgid "O&n" msgstr "&Be" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption msgid "&Strike Out" msgstr "Á&thúzott" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTRADIOINVERT.CAPTION" msgid "In&vert" msgstr "&Fordított" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTRADIOOFF.CAPTION" msgid "O&ff" msgstr "&Ki" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTRADIOON.CAPTION" msgid "O&n" msgstr "&Be" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption msgid "&Underline" msgstr "&Aláhúzott" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "&Fordított" #: tfrmoptionseditorcolors.textunderlineradiooff.caption msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "&Ki" #: tfrmoptionseditorcolors.textunderlineradioon.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "&Be" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "Művelet &másolása" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "Művelet &törlése" #: tfrmoptionsfileoperations.cbdeletetotrash.caption #| msgid "Delete to recycle bin (Shift key reverses this setting)" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDELETETOTRASH.CAPTION" msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "&F8/Del gomb a Kukába helyez (Shifttel együtt töröl)" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "&Törlés a kukába művelet" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption #| msgid "Drop readonly flag" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDROPREADONLYFLAG.CAPTION" msgid "D&rop readonly flag" msgstr "Írásvédelmi attribútum elhagyása" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "&Mozgatás művelet" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPARTIALNAMESEARCH.CAPTION" msgid "&Search for part of file name" msgstr "Kere&sés fájlnév részletre" #: tfrmoptionsfileoperations.cbprocesscomments.caption #| msgid "Process comments with files/folders" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPROCESSCOMMENTS.CAPTION" msgid "&Process comments with files/folders" msgstr "Fájl/Könyvtár megjegyzések &feldolgozása" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption #| msgid "Select file name without extension when renaming" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBRENAMESELONLYNAME.CAPTION" msgid "Select &file name without extension when renaming" msgstr "Csak a &fájlnév kiválasztása átnevezés előtt (a kiterjesztést nem)" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSHOWCOPYTABSELECTPANEL.CAPTION" msgid "Sho&w tab select panel in copy/move dialog" msgstr "Fül kiválasztási panel megjelenítése a másol/áthelyez párbeszédablakban" #: tfrmoptionsfileoperations.cbskipfileoperror.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSKIPFILEOPERROR.CAPTION" msgid "S&kip file operations errors and write them to log window" msgstr "Fájlműveleti hibá&k átugrása és írja naplóablakba" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "Műveletek futtatása" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "tfrmoptionsfileoperations.gbfilesearch.caption" msgid "File search" msgstr "Fájlkeresés" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "Felhasználói felület" #: tfrmoptionsfileoperations.lblbuffersize.caption msgid "&Buffer size for file operations (in KB):" msgstr "&Pufferméret fájlműveletekhez (kB) :" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "Megerősítő ablak megjelenítése :" #: tfrmoptionsfileoperations.lblprogresskind.caption msgid "Show operations progress &initially in" msgstr "Mű&ködő műveletek megjelenítése" #: tfrmoptionsfileoperations.lblwipepassnumber.caption #| msgid "Number of wipe passes:" msgctxt "TFRMOPTIONSFILEOPERATIONS.LBLWIPEPASSNUMBER.CAPTION" msgid "&Number of wipe passes:" msgstr "&Hányszoros legyen a végleges törlés??" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption #| msgid "Use memory mapping for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSEMMAPINSEARCH.CAPTION" msgid "Use memory mapping for search te&xt in files" msgstr "Memória térképezés has&ználata fájlokban történő kereséskor" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption #| msgid "Use stream for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSESTREAMINSEARCH.CAPTION" msgid "&Use stream for search text in files" msgstr "Memóriafolyam haszná&lata fájlokban történő kereséskor" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEFRAMECURSOR.CAPTION" msgid "Use &Frame Cursor" msgstr "Kurz&orkeret használata" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption msgid "Use &Gradient Indicator" msgstr "&Gradiens (lejtő) mutató használata" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption #| msgid "Use Inverted Selection" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEINVERTEDSELECTION.CAPTION" msgid "U&se Inverted Selection" msgstr "Fordított kijelölé&s használata" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.DBFREESPACEINDICATOR.CAPTION" msgid "Drive Free Space Indicator" msgstr "Meghajtón a szabad terület mutató" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.GBEXAMPLE.CAPTION" msgid "Example" msgstr "Példa" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption #| msgid "Background:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR.CAPTION" msgid "Bac&kground:" msgstr "Hát&tér 1 :" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption #| msgid "Background 2:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR2.CAPTION" msgid "Backg&round 2:" msgstr "Hátté&r 2 :" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption #| msgid "Cursor Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORCOLOR.CAPTION" msgid "C&ursor Color:" msgstr "K&urzor színe :" #: tfrmoptionsfilepanelscolors.lblcursortext.caption #| msgid "Cursor Text:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORTEXT.CAPTION" msgid "Cursor Te&xt:" msgstr "Kurzor s&zöveg :" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLINACTIVEPANELBRIGHTNESS.CAPTION" msgid "&Brightness level of inactive panel" msgstr "I&naktív panel fényereje" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption msgid "In&dicator Back Color:" msgstr "Mutató háttér szí&ne :" #: tfrmoptionsfilepanelscolors.lblindcolor.caption msgid "&Indicator Fore Color:" msgstr "Mutató &előtér szí&ne :" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption #| msgid "Mark Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLMARKCOLOR.CAPTION" msgid "&Mark Color:" msgstr "&Jelölő színe :" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption #| msgid "Text Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLTEXTCOLOR.CAPTION" msgid "T&ext Color:" msgstr "Szövegszín :" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption msgid "Do&n't load file list until a tab is activated" msgstr "&Ne töltse be addig a fájl listát amíg a fül aktív" #: tfrmoptionsfilesviews.cbdirbrackets.caption #| msgid "Show square brackets around directories" msgctxt "TFRMOPTIONSFILESVIEWS.CBDIRBRACKETS.CAPTION" msgid "S&how square brackets around directories" msgstr "Szö&gletes zárójel a könyvtárnevek körül" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption msgid "Hi&ghlight new and updated files" msgstr "Ú&j és frissített fájlok kiemelése" #: tfrmoptionsfilesviews.cblistfilesinthread.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBLISTFILESINTHREAD.CAPTION" msgid "Load &file list in separate thread" msgstr "Fájl lista betöltése másik szálon" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBLOADICONSSEPARATELY.CAPTION" msgid "Load icons af&ter file list" msgstr "Ikonok be&töltése a fájl lista után" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption #| msgid "Show system and hidden files" msgctxt "TFRMOPTIONSFILESVIEWS.CBSHOWSYSTEMFILES.CAPTION" msgid "Show s&ystem and hidden files" msgstr "R&ejtett/Rendszer fájlok megjelenítése" #: tfrmoptionsfilesviews.cbspacemovesdown.caption #, fuzzy #| msgid "When selecting files with , move down to next file (as with )&When selecting files with , move down to next file (as with )" msgctxt "TFRMOPTIONSFILESVIEWS.CBSPACEMOVESDOWN.CAPTION" msgid "&When selecting files with , move down to next file (as with )" msgstr "Szó&közzel történő kijelöléskor automatikus léptetés (mint estén)" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "Formatálás" #: tfrmoptionsfilesviews.gbsorting.caption msgctxt "TFRMOPTIONSFILESVIEWS.GBSORTING.CAPTION" msgid "Sorting" msgstr "Rendezés" #: tfrmoptionsfilesviews.lblcasesensitivity.caption msgid "Case s&ensitivity:" msgstr "Karakterérzék&eny :" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "Hibás formátum" #: tfrmoptionsfilesviews.lbldatetimeformat.caption #| msgid "Date and time format:" msgctxt "TFRMOPTIONSFILESVIEWS.LBLDATETIMEFORMAT.CAPTION" msgid "&Date and time format:" msgstr "&Dátum és idő formátum :" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "Fá&jlméret formátum :" #: tfrmoptionsfilesviews.lblnewfilesposition.caption msgid "&Insert new files" msgstr "Új fájl&ok beszúrása" #: tfrmoptionsfilesviews.lblsortfoldermode.caption msgid "So&rting directories:" msgstr "Mappák &rendezése :" #: tfrmoptionsfilesviews.lblsortmethod.caption msgctxt "TFRMOPTIONSFILESVIEWS.LBLSORTMETHOD.CAPTION" msgid "&Sort method:" msgstr "Rendezé&si módszer :" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption msgid "&Move updated files" msgstr "Frissített fájlok &mozgatása" #: tfrmoptionsfiletypescolors.btnaddcategory.caption #| msgid "Add" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNADDCATEGORY.CAPTION" msgid "A&dd" msgstr "Hozzáa&dás" #: tfrmoptionsfiletypescolors.btnapplycategory.caption #| msgid "Apply" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNAPPLYCATEGORY.CAPTION" msgid "A&pply" msgstr "&Alkalmaz" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNCATEGORYCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption #| msgid "Delete" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNDELETECATEGORY.CAPTION" msgid "D&elete" msgstr "&Törlés" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Sablon..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption #| msgid "File types colors" msgctxt "TFRMOPTIONSFILETYPESCOLORS.GBFILETYPESCOLORS.CAPTION" msgid "File types colors (sort by drag&&drop)" msgstr "Fájltípus színek (húzás és ejtés által rendez)" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption #| msgid "Category attributes:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYATTR.CAPTION" msgid "Category a&ttributes:" msgstr "A&ttribútum kategória :" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption #| msgid "Category color:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYCOLOR.CAPTION" msgid "Category co&lor:" msgstr "Kat&egória színe :" #: tfrmoptionsfiletypescolors.lblcategorymask.caption #| msgid "Category mask:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYMASK.CAPTION" msgid "Category &mask:" msgstr "Kategória &maszk :" #: tfrmoptionsfiletypescolors.lblcategoryname.caption #| msgid "Category name:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYNAME.CAPTION" msgid "Category &name:" msgstr "Kategória neve :" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELEDITFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELLOGFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELMAINFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWERBOOKFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.lbleditorfont.caption #| msgid "Editor font" msgctxt "TFRMOPTIONSFONTS.LBLEDITORFONT.CAPTION" msgid "&Editor font" msgstr "Sz&erkesztő betűtípusa" #: tfrmoptionsfonts.lbllogfont.caption msgctxt "TFRMOPTIONSFONTS.LBLLOGFONT.CAPTION" msgid "&Log font" msgstr "Nap&lófájl betűtípusa" #: tfrmoptionsfonts.lblmainfont.caption #| msgid "Main font" msgctxt "TFRMOPTIONSFONTS.LBLMAINFONT.CAPTION" msgid "Main &font" msgstr "&Fő betűtípus" #: tfrmoptionsfonts.lblviewerbookfont.caption msgctxt "TFRMOPTIONSFONTS.LBLVIEWERBOOKFONT.CAPTION" msgid "Viewer&Book Font" msgstr "Megjelenítő könyv &betűtípusa" #: tfrmoptionsfonts.lblviewerfont.caption #| msgid "Viewer font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERFONT.CAPTION" msgid "&Viewer font" msgstr "Né&zőke betűtípusa" #: tfrmoptionshotkeys.btnaddhotkey.caption msgid "Add &hotkey" msgstr "Gyorsbillentyű &hozzáadása" #: tfrmoptionshotkeys.btndeletehotkey.caption msgid "&Delete hotkey" msgstr "Gyorsbillentyű tö&rlése" #: tfrmoptionshotkeys.btnedithotkey.caption msgctxt "TFRMOPTIONSHOTKEYS.BTNEDITHOTKEY.CAPTION" msgid "&Edit hotkey" msgstr "Gyorsbillentyű &módosítása" #: tfrmoptionshotkeys.lbfilter.caption #| msgid "Filter" msgctxt "TFRMOPTIONSHOTKEYS.LBFILTER.CAPTION" msgid "&Filter" msgstr "&Szűrő" #: tfrmoptionshotkeys.lblcategories.caption #| msgid "Categories:" msgctxt "TFRMOPTIONSHOTKEYS.LBLCATEGORIES.CAPTION" msgid "C&ategories:" msgstr "K&ategóriák :" #: tfrmoptionshotkeys.lblcommands.caption #| msgid "Commands:" msgctxt "TFRMOPTIONSHOTKEYS.LBLCOMMANDS.CAPTION" msgid "Co&mmands:" msgstr "&Parancsok :" #: tfrmoptionshotkeys.lblscfiles.caption msgctxt "TFRMOPTIONSHOTKEYS.LBLSCFILES.CAPTION" msgid "&Shortcut files:" msgstr "Fájl rövidíté&sek :" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[0].TITLE.CAPTION" msgid "Hotkey" msgstr "Gyorsbillentyű" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[1].TITLE.CAPTION" msgid "Parameters" msgstr "Paraméterek" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[2].TITLE.CAPTION" msgid "Controls" msgstr "Ellenőrzések" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "&Az alábbi útvonalakhoz és alkönyvtáraikhoz :" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "Műveleti ikonok megjelenítése a &menükben" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "tfrmoptionsicons.cbiconsinmenussize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption msgctxt "TFRMOPTIONSICONS.CBICONSSHOWOVERLAY.CAPTION" msgid "Show o&verlay icons, e.g. for links" msgstr "&Beborító ikonok megjelenítése, pl : linkek" #: tfrmoptionsicons.cbiconssize.text msgctxt "TFRMOPTIONSICONS.CBICONSSIZE.TEXT" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "Speciális ikonok kikapcsolása" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "Ikonok a menükben" #: tfrmoptionsicons.gbiconssize.caption msgctxt "TFRMOPTIONSICONS.GBICONSSIZE.CAPTION" msgid " Icon size " msgstr " Ikon mérete " #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "TFRMOPTIONSICONS.GBSHOWICONSMODE.CAPTION" msgid " Show icons to the left of the filename " msgstr " Ikonok megjelenítése a fájlnév bal oldalán " #: tfrmoptionsicons.rbiconsshowall.caption #| msgid "&All" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALL.CAPTION" msgid "A&ll" msgstr "&Mind" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALLANDEXE.CAPTION" msgid "All associated + &EXE/LNK (slow)" msgstr "Minden társított + &EXE/LNK (lassú)" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWNONE.CAPTION" msgid "&No icons" msgstr "&Nincs ikon" #: tfrmoptionsicons.rbiconsshowstandard.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWSTANDARD.CAPTION" msgid "Only &standard icons" msgstr "&Csak átlagos ikonok" #: tfrmoptionsignorelist.btnaddsel.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSEL.CAPTION" msgid "A&dd selected names" msgstr "Kiválasztott nevek hozzáa&dása" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSELWITHPATH.CAPTION" msgid "Add selected names with &full path" msgstr "&Kiválasztott nevek hozzáadása teljes elérési útvonallal" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "TFRMOPTIONSIGNORELIST.CHKIGNOREENABLE.CAPTION" msgid "&Ignore (don't show) the following files and folders:" msgstr "&Mellőzi (nem mutatja) a következp fájlokat és mappákat :" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "TFRMOPTIONSIGNORELIST.LBLSAVEIN.CAPTION" msgid "&Save in:" msgstr "&Mentés ide :" #: tfrmoptionskeyboard.cblynxlike.caption msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "&Bal, Jobb nyilak váltogatják a mappákat (Lynx-féle mozgás)" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "Írás" #: tfrmoptionskeyboard.lblalt.caption #| msgid "Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLALT.CAPTION" msgid "Alt+L&etters" msgstr "Al&t+Betű" #: tfrmoptionskeyboard.lblctrlalt.caption #| msgid "Ctrl+Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLCTRLALT.CAPTION" msgid "Ctrl+Alt+Le&tters" msgstr "&Ctrl+Alt+Betű" #: tfrmoptionskeyboard.lblnomodifier.caption msgctxt "TFRMOPTIONSKEYBOARD.LBLNOMODIFIER.CAPTION" msgid "&Letters" msgstr "&Betűk" #: tfrmoptionslayout.cbflatdiskpanel.caption #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATDISKPANEL.CAPTION" msgid "&Flat buttons" msgstr "Lapos gombok" #: tfrmoptionslayout.cbflatinterface.caption #| msgid "Flat interface" msgctxt "TFRMOPTIONSLAYOUT.CBFLATINTERFACE.CAPTION" msgid "Flat i&nterface" msgstr "Lapos felület" #: tfrmoptionslayout.cbflattoolbar.caption #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATTOOLBAR.CAPTION" msgid "Flat b&uttons" msgstr "Lapos gombok" #: tfrmoptionslayout.cbfreespaceind.caption msgctxt "TFRMOPTIONSLAYOUT.CBFREESPACEIND.CAPTION" msgid "Show fr&ee space indicator on drive label" msgstr "Szabad terület mutató megjelenítése a meghajtó címkéjében" #: tfrmoptionslayout.cblogwindow.caption #| msgid "Show log window" msgctxt "TFRMOPTIONSLAYOUT.CBLOGWINDOW.CAPTION" msgid "Show lo&g window" msgstr "Naplóablak me&gjelenítése" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "TFRMOPTIONSLAYOUT.CBPANELOFOPERATIONS.CAPTION" msgid "Show panel of operation in background" msgstr "Műveleti panel megjelenítése a háttérben" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "TFRMOPTIONSLAYOUT.CBPROGINMENUBAR.CAPTION" msgid "Show common progress in menu bar" msgstr "Megosztott műveletek megjelenítése a menüsávban" #: tfrmoptionslayout.cbshowcmdline.caption #| msgid "Show command &line" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCMDLINE.CAPTION" msgid "Show command l&ine" msgstr "Parancs&sor megjelenítése" #: tfrmoptionslayout.cbshowcurdir.caption #| msgid "Show ¤t directory" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCURDIR.CAPTION" msgid "Show current director&y" msgstr "Aktuális &könyvtár megjelenítése" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDISKPANEL.CAPTION" msgid "Show &drive buttons" msgstr "&Meghajtógombok megjelenítése" #: tfrmoptionslayout.cbshowdrivefreespace.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDRIVEFREESPACE.CAPTION" msgid "Show free s&pace label" msgstr "Szabad terület címke megjelenítése" #: tfrmoptionslayout.cbshowdriveslistbutton.caption msgid "Show drives list bu&tton" msgstr "Meghajtó lista gombok megjelenítése" #: tfrmoptionslayout.cbshowkeyspanel.caption #| msgid "Show &function key buttons" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWKEYSPANEL.CAPTION" msgid "Show function &key buttons" msgstr "&Funkcióbillentyűk megjelenítése" #: tfrmoptionslayout.cbshowmainmenu.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINMENU.CAPTION" msgid "Show &main menu" msgstr "Fő&menü megjelenítése" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINTOOLBAR.CAPTION" msgid "Show &button bar" msgstr "Gom&bsor megjelenítése" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption msgid "Show short free space &label" msgstr "Rövid szabad terü&leti címke megjelenítése" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWSTATUSBAR.CAPTION" msgid "Show &status bar" msgstr "Állapot&sor megjelenítése" #: tfrmoptionslayout.cbshowtabheader.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABHEADER.CAPTION" msgid "S&how tabstop header" msgstr "&Oszlopok neveinek megjelenítése" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABS.CAPTION" msgid "Sho&w folder tabs" msgstr "&Mappa fülek megjelenítése" #: tfrmoptionslayout.cbtermwindow.caption #| msgid "Show terminal window" msgctxt "TFRMOPTIONSLAYOUT.CBTERMWINDOW.CAPTION" msgid "Show te&rminal window" msgstr "Te&rminálablak megjelenítése" #: tfrmoptionslayout.cbtwodiskpanels.caption #| msgid "Show two drive button bars (fixed width, above file windows)" msgctxt "TFRMOPTIONSLAYOUT.CBTWODISKPANELS.CAPTION" msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "Két meghajtó gombsor megjelenítése (rögzített szélességben, az ablakok felett)" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "TFRMOPTIONSLAYOUT.GBSCREENLAYOUT.CAPTION" msgid " Screen layout " msgstr " Képernyő felosztása " #: tfrmoptionslog.cblogarcop.caption #| msgid "Pack/Unpack" msgctxt "TFRMOPTIONSLOG.CBLOGARCOP.CAPTION" msgid "&Pack/Unpack" msgstr "&Csomagolás/Kibontás" #: tfrmoptionslog.cblogcpmvln.caption #| msgid "Copy/Move/Create link/symlink" msgctxt "TFRMOPTIONSLOG.CBLOGCPMVLN.CAPTION" msgid "Cop&y/Move/Create link/symlink" msgstr "Szimbolikus hivatkozás/másolás/mozgatás/készítés" #: tfrmoptionslog.cblogdelete.caption #| msgid "Delete" msgctxt "TFRMOPTIONSLOG.CBLOGDELETE.CAPTION" msgid "&Delete" msgstr "&Törlés" #: tfrmoptionslog.cblogdirop.caption #| msgid "Create/Delete directories" msgctxt "TFRMOPTIONSLOG.CBLOGDIROP.CAPTION" msgid "Crea&te/Delete directories" msgstr "Könyvtár létrehozás/törlés" #: tfrmoptionslog.cblogerrors.caption msgctxt "TFRMOPTIONSLOG.CBLOGERRORS.CAPTION" msgid "Log &errors" msgstr "Hibák &naplózása" #: tfrmoptionslog.cblogfile.caption #| msgid "&Create a log file:" msgctxt "TFRMOPTIONSLOG.CBLOGFILE.CAPTION" msgid "C&reate a log file:" msgstr "Naplófájl &létrehozása :" #: tfrmoptionslog.cbloginfo.caption #| msgid "Log information messages" msgctxt "TFRMOPTIONSLOG.CBLOGINFO.CAPTION" msgid "Log &information messages" msgstr "&Információs üzenetek naplózása" #: tfrmoptionslog.cblogsuccess.caption msgctxt "TFRMOPTIONSLOG.CBLOGSUCCESS.CAPTION" msgid "Log &successful operations" msgstr "&Sikeres műveletek naplózása" #: tfrmoptionslog.cblogvfs.caption #| msgid "File system plugins" msgctxt "TFRMOPTIONSLOG.CBLOGVFS.CAPTION" msgid "&File system plugins" msgstr "&Fájlrendszer beépülők" #: tfrmoptionslog.gblogfile.caption msgctxt "TFRMOPTIONSLOG.GBLOGFILE.CAPTION" msgid "File operation log file" msgstr "Fájlműveletek naplófájlja" #: tfrmoptionslog.gblogfileop.caption #| msgid "Log operations:" msgctxt "TFRMOPTIONSLOG.GBLOGFILEOP.CAPTION" msgid "Log operations" msgstr "Naplózási műveletek" #: tfrmoptionslog.gblogfilestatus.caption #| msgid "Operation status:" msgctxt "TFRMOPTIONSLOG.GBLOGFILESTATUS.CAPTION" msgid "Operation status" msgstr "Művelet állapota" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "&Nem létező fájlok bélyegképeinek eltávolítása" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "&Mindig ugorjon a gyökérkönyvtárba a meghajtó váltásakor" #: tfrmoptionsmisc.chkshowwarningmessages.caption #| msgid "Show warning messages (\"OK\" button only)" msgctxt "tfrmoptionsmisc.chkshowwarningmessages.caption" msgid "Show &warning messages (\"OK\" button only)" msgstr "Fig&yelmeztető üzenetek megjelenítése (csak \"OK\" gomb)" #: tfrmoptionsmisc.chkthumbsave.caption msgctxt "tfrmoptionsmisc.chkthumbsave.caption" msgid "&Save thumbnails in cache" msgstr "Miniatűrök gyor&sítótárazása" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "tfrmoptionsmisc.dblthumbnails.caption" msgid "Thumbnails" msgstr "Miniatűrök" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "pixel" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "tfrmoptionsmisc.lblthumbseparator.caption" msgid "X" msgstr "X" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "&Bélyegkép mérete : " #: tfrmoptionsmouse.cbselectionbymouse.caption msgid "&Selection by mouse" msgstr "Egérrel való kivála&sztás" #: tfrmoptionsmouse.gbscrolling.caption msgid "Scrolling" msgstr "Görgetés" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "Kiválasztás" #: tfrmoptionsmouse.lblmousemode.caption msgid "&Mode:" msgstr "&Mód :" #: tfrmoptionsmouse.rbscrolllinebyline.caption msgid "&Line by line" msgstr "Sorró&l sorra" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption msgid "Line by line &with cursor movement" msgstr "Sorról sorra k&urzormozgással" #: tfrmoptionsmouse.rbscrollpagebypage.caption msgid "&Page by page" msgstr "&Oldalról oldalra" #: tfrmoptionsplugins.btnaddplugin.caption #| msgid "Add" msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "Hozzáa&dás" #: tfrmoptionsplugins.btnconfigplugin.caption #| msgid "Configure" msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "B&eállítás" #: tfrmoptionsplugins.btnenableplugin.caption #| msgid "Enable" msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "E&ngedélyezés" #: tfrmoptionsplugins.btnremoveplugin.caption #| msgid "Remove" msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "El&távolítás" #: tfrmoptionsplugins.btntweakplugin.caption #| msgid "Tweak" msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "F&inomhangolás" #: tfrmoptionsplugins.lbldsxdescription.caption #, fuzzy #| msgid "Search plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "A kereső beépülők le&hetővé tesznek más keresési algoritmusokat vagy külső eszközöket (mint pl : \"lokális\", stb)" #: tfrmoptionsplugins.lblwcxdescription.caption #| msgid "Packer plugins are used to work with archives." msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "A tömö&rítő beépülők az archív fájlokkal való munkához valók." #: tfrmoptionsplugins.lblwdxdescription.caption #, fuzzy #| msgid "Content plugins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename toolContent plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "A tartalmi beépülők lehetővé teszik kiegészítő fájlinformációk megjelenítését, mint pl : mp3 tag vagy kép attribútumok a fájl listában, vagy használja kereséshez és csoportos átnevezéshez" #: tfrmoptionsplugins.lblwfxdescription.caption #, fuzzy #| msgid "Content plu&gins allow to display extended file details like mp3 tags oFi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "A fáj&lrendszer beépülők lehetővé teszik, hogy az operációs rendszer számára elérhetetlen lemezek hozzáférését, vagy külső eszközöket, mint pl : Palm/PocketPC." #: tfrmoptionsplugins.lblwlxdescription.caption #| msgid "Fi&le system plugins allow access to disks inaccessible by operatin" msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "A né&zőke beépülők lehetővé teszik képek, táblázatok, adatbázisok, stb megtekintését a Nézőkében (F3, Ctrl+Q)" #: tfrmoptionsplugins.stgplugins.columns[0].title.caption #, fuzzy #| msgid "Vie&wer plugins allow to display file formats like images, spreadsheetsActiveActive" msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTIONTFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[0].TITLE.CAPTION" msgid "Active" msgstr "Aktív" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[1].TITLE.CAPTION" msgid "Plugin" msgstr "Beépülő" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[2].TITLE.CAPTION" msgid "Registered for" msgstr "Regisztrálva" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[3].TITLE.CAPTION" msgid "File name" msgstr "Fájl neve" #: tfrmoptionsplugins.tsdsx.caption #| msgid "Search plugins (.DSX)" msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "Kere&ső beépülők (.DSX)" #: tfrmoptionsplugins.tswcx.caption #| msgid "Packer plugins (.WCX)" msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "Tömörítő beépülő&k (.WCX)" #: tfrmoptionsplugins.tswdx.caption #| msgid "Content plugins (.WDX)" msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "Tartalmi beé&pülők (.WDX)" #: tfrmoptionsplugins.tswfx.caption #| msgid "File system plugins (.WFX)" msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "Fá&jlrendszer beépülők (.WFX)" #: tfrmoptionsplugins.tswlx.caption #| msgid "Viewer plugins (.WLX)" msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "Né&zőke beépülők (.WLX)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTBEGINNING.CAPTION" msgid "&Beginning (name must start with first typed character)" msgstr "&Kezdet (a névnek az első begépelt karakterrel kell kezdődnie)" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTENDING.CAPTION" msgid "En&ding (last character before a typed dot . must match)" msgstr "&Végződés (a . előtti utolsó karakterrel kell egyeznie)" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CGPOPTIONS.CAPTION" msgid "Options" msgstr "Opciók" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption #| msgid "Exact name match:" msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.GBEXACTNAMEMATCH.CAPTION" msgid "Exact name match" msgstr "Teljes &név egyezés:" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "Karakterérzékeny keresés" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "Keresés ezekre a tételekre" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "TFRMOPTIONSTABS.CBTABSACTIVATEONCLICK.CAPTION" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "A fülre kattintva a hozzá tartozó &panel aktiválása" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "TFRMOPTIONSTABS.CBTABSALWAYSVISIBLE.CAPTION" msgid "&Show tab header also when there is only one tab" msgstr "&Fül fejléc megjelenítése akkor is ha csak egy fül van" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption #| msgid "&Confirm close all tabs" msgctxt "TFRMOPTIONSTABS.CBTABSCONFIRMCLOSEALL.CAPTION" msgid "Con&firm close all tabs" msgstr "M&inden fül bezárásának megerősítése" #: tfrmoptionstabs.cbtabslimitoption.caption #| msgid "&Limit tab title length to:" msgctxt "TFRMOPTIONSTABS.CBTABSLIMITOPTION.CAPTION" msgid "&Limit tab title length to" msgstr "Fül címének maximá&lis hossza" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "TFRMOPTIONSTABS.CBTABSLOCKEDASTERISK.CAPTION" msgid "Show locked tabs &with an asterisk *" msgstr "&Zárolt fülek megjelenítése csillaggal *" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "TFRMOPTIONSTABS.CBTABSMULTILINES.CAPTION" msgid "&Tabs on multiple lines" msgstr "Fülek &több sorban" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENFOREGROUND.CAPTION" msgid "Ctrl+&Up opens new tab in foreground" msgstr "CTRL-Fel új fület nyit az előtérben" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENNEARCURRENT.CAPTION" msgid "Open &new tabs near current tab" msgstr "Új fül &nyitása a jelenlegi mellett" #: tfrmoptionstabs.cbtabsshowclosebutton.caption #| msgid "Show tab close button" msgctxt "TFRMOPTIONSTABS.CBTABSSHOWCLOSEBUTTON.CAPTION" msgid "Show ta&b close button" msgstr "Fül bezárása gombok megjelenítése" #: tfrmoptionstabs.gbtabs.caption msgctxt "TFRMOPTIONSTABS.GBTABS.CAPTION" msgid "Folder tabs headers" msgstr "Mappafül fejléce" #: tfrmoptionstabs.lblchar.caption msgctxt "TFRMOPTIONSTABS.LBLCHAR.CAPTION" msgid "characters" msgstr "karakterek" #: tfrmoptionstabs.lbltabsposition.caption msgctxt "TFRMOPTIONSTABS.LBLTABSPOSITION.CAPTION" msgid "Ta&bs position" msgstr "Fü&l pozíciók :" #: tfrmoptionsterminal.lblruninterm.caption msgid "Run in &terminal:" msgstr "Futtatás &terminálban :" #: tfrmoptionsterminal.lblrunterm.caption msgid "Run t&erminal:" msgstr "T&erminál indítása :" #: tfrmoptionstoolbar.btnclonebutton.caption msgctxt "tfrmoptionstoolbar.btnclonebutton.caption" msgid "C&lone button" msgstr "Gomb k&lónozása" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNDELETEBUTTON.CAPTION" msgid "&Delete" msgstr "&Törlés" #: tfrmoptionstoolbar.btnedithotkey.caption #| msgid "Edit hotkey" msgctxt "TFRMOPTIONSTOOLBAR.BTNEDITHOTKEY.CAPTION" msgid "Edit hot&key" msgstr "Gyorsbillentyű szerkesztése :" #: tfrmoptionstoolbar.btninsertbutton.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNINSERTBUTTON.CAPTION" msgid "&Insert new button" msgstr "Ú&j gomb beszúrása" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNOPENFILE.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNOPENICON.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnremovehotkey.caption msgctxt "TFRMOPTIONSTOOLBAR.BTNREMOVEHOTKEY.CAPTION" msgid "Remove hotke&y" msgstr "Gyorsbillent&yű eltávolítása" #: tfrmoptionstoolbar.cbflatbuttons.caption msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "L&apos gombok" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "Adja meg a parancs paramétereit, mindegyik külön sorban. Nyomja meg az F1 billentyűt a paraméterek súgójához" #: tfrmoptionstoolbar.gbgroupbox.caption msgctxt "tfrmoptionstoolbar.gbgroupbox.caption" msgid "Appearance" msgstr "Megjelenés" #: tfrmoptionstoolbar.lblbarsize.caption msgctxt "tfrmoptionstoolbar.lblbarsize.caption" msgid "&Bar size:" msgstr "&Sáv mérete :" #: tfrmoptionstoolbar.lblexternalcommand.caption msgctxt "TFRMOPTIONSTOOLBAR.LBLEXTERNALCOMMAND.CAPTION" msgid "Comman&d:" msgstr "Para&ncs" #: tfrmoptionstoolbar.lblexternalparameters.caption msgctxt "TFRMOPTIONSTOOLBAR.LBLEXTERNALPARAMETERS.CAPTION" msgid "Parameter&s:" msgstr "Para&méterek" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "Gyorsbillentyű :" #: tfrmoptionstoolbar.lbliconfile.caption #| msgid "Icon:" msgctxt "tfrmoptionstoolbar.lbliconfile.caption" msgid "Ico&n:" msgstr "Iko&n :" #: tfrmoptionstoolbar.lbliconsize.caption msgctxt "tfrmoptionstoolbar.lbliconsize.caption" msgid "Icon si&ze:" msgstr "Ikon mé&rete :" #: tfrmoptionstoolbar.lblinternalcommand.caption msgctxt "tfrmoptionstoolbar.lblinternalcommand.caption" msgid "Co&mmand:" msgstr "Pa&rancs :" #: tfrmoptionstoolbar.lblinternalparameters.caption msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "&Paraméterek :" #: tfrmoptionstoolbar.lblstartpath.caption #| msgid "Start path:" msgctxt "tfrmoptionstoolbar.lblstartpath.caption" msgid "Start pat&h:" msgstr "Ki&induló útvonal :" #: tfrmoptionstoolbar.lbltooltip.caption #| msgid "Tooltip:" msgctxt "tfrmoptionstoolbar.lbltooltip.caption" msgid "&Tooltip:" msgstr "Buborék& :" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "Gomb típusa" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSKEEPTERMINALOPEN.CAPTION" msgid "&Keep terminal window open after executing program" msgstr "Terminálabla&k nyitva tartása a program futtatása után" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSRUNINTERMINAL.CAPTION" msgid "&Execute in terminal" msgstr "T&erminálban futtat" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSUSEEXTERNALPROGRAM.CAPTION" msgid "&Use external program" msgstr "Kü&lső program használata" #: tfrmoptionstoolbase.lbltoolsparameters.caption msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPARAMETERS.CAPTION" msgid "A&dditional parameters" msgstr "T&ovábbi paraméterek" #: tfrmoptionstoolbase.lbltoolspath.caption msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPATH.CAPTION" msgid "&Path to program to execute" msgstr "Futtatandó &program útvonala" #: tfrmoptionstooltips.btnaddfields.caption #| msgid "Add" msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "Hozzáa&dás" #: tfrmoptionstooltips.btnapplyfields.caption #| msgid "Apply" msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "&Alkalmaz" #: tfrmoptionstooltips.btndeletefields.caption #| msgid "Delete" msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "&Törlés" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Sablon..." #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "Egyedi mezők fájl típusok szerint" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "Buboréktippek megjelenítése" #: tfrmoptionstooltips.lblfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "Kategória tipp :" #: tfrmoptionstooltips.lblfieldsmask.caption #| msgid "Category mask:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "&Maszk kategória:" #: tfrmoptionstooltips.lblfieldsname.caption #| msgid "Category name:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "&Név kategória:" #: tfrmoptionstooltips.rbtooltipallfiles.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "Eszköztipp megjelenítése az összes fájlra a fájlpanelben" #: tfrmoptionstooltips.rbtooltipnone.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "Nem mutatja" #: tfrmoptionstooltips.rbtooltiponlylarge.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "Eszköztipp megjelenítése a megcsonkított fájlra a fájlpanelben" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNBACKVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNFONTVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.gbviewerbookmode.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWERBOOKMODE.CAPTION" msgid "Viewer Book Mode" msgstr "Megjelenítő könyv mód" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWEREXAMPLE.CAPTION" msgid "Example" msgstr "Példa" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption msgctxt "TFRMOPTIONSVIEWER.LBLBACKGROUNDCOLORVIEWERBOOK.CAPTION" msgid "&Background color in book viewer" msgstr "Megjelenítő könyv &háttérszíne" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption msgctxt "TFRMOPTIONSVIEWER.LBLFONTCOLORVIEWERBOOK.CAPTION" msgid "&Font color in book viewer" msgstr "Megjelenítő könyv &betűszíne" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption msgctxt "TFRMOPTIONSVIEWER.LBLNUMBERCOLUMNSVIEWER.CAPTION" msgid "&Number of columns in book viewer" msgstr "Megjele&nítő könyv oszlopszáma" #: tfrmpackdlg.btncancel.caption #| msgid "Cancel" msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Mégsem" #: tfrmpackdlg.btnconfig.caption #| msgid "&Configure" msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "&Beállítás" #: tfrmpackdlg.btnhelp.caption #| msgid "Help" msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "&Súgó" #: tfrmpackdlg.btnok.caption #| msgid "OK" msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmpackdlg.caption msgctxt "TFRMPACKDLG.CAPTION" msgid "Pack files" msgstr "Fájlok tömörítése" #: tfrmpackdlg.cbcreateseparatearchives.caption #| msgid "Create separate archives, o&ne per selected file/dir" msgid "C&reate separate archives, one per selected file/dir" msgstr "Több a&rchívum készítése kijelölt fájlonként/mappánként egy" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "Ön&kicsomagoló archívum készítése" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "T&itkosítás" #: tfrmpackdlg.cbmovetoarchive.caption #| msgid "M&ove to archive" msgid "Mo&ve to archive" msgstr "A&rchívumba helyezés" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "&Többlemezes archívum" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "=>" #: tfrmpackdlg.cbputintarfirst.caption msgid "P&ut in the TAR archive first" msgstr "E&lőször TAR archívumba tegye" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "Elérési &utak tárolása az archívumban (csak a rekurzív)" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "Fájl(ok) becsomagolása a fájlba :" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "Tömörítő" #: tfrmpackinfodlg.btnclose.caption #| msgid "Close" msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Bezárás" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "Mind kicsomagolás&a és végreh&ajtás" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "Kicsomagolás és &végrehajtás" #: tfrmpackinfodlg.caption msgctxt "TFRMPACKINFODLG.CAPTION" msgid "Properties of packed file" msgstr "A tömörített fájl tulajdonságai" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "Attribútumok :" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "Tömörítési arány :" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "Dátum :" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "Módszer :" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "Eredeti méret :" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "Fájl :" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "Tömörített méret :" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "Tömörítő :" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "Idő :" #: tfrmquicksearch.btncancel.caption msgctxt "TFRMQUICKSEARCH.BTNCANCEL.CAPTION" msgid "X" msgstr "X" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "Szűrőpanel bezárása" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "Írja be a keresendő szöveget vagy szűrőt" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "Aa" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "Karakterérzékeny" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "D" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "Mappák" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "F" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "Fájlok" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "{" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "Kezdeti egyezés" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "}" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "Vég egyezés" #: tfrmquicksearch.tglfilter.caption msgctxt "TFRMQUICKSEARCH.TGLFILTER.CAPTION" msgid "Filter" msgstr "Szűrő" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "Váltás kereső és szűrő közt" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CANCELBUTTON.CAPTION" msgid "Cancel" msgstr "Mégsem" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CLOSEBUTTON.CAPTION" msgid "&Close" msgstr "&Bezárás" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.HELPBUTTON.CAPTION" msgid "&Help" msgstr "&Súgó" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.OKBUTTON.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmselecttextrange.lblselecttext.caption msgid "&Select the characters to insert:" msgstr "karakterek kivála&sztása beszúráshoz :" #: tfrmsetfileproperties.btncancel.caption #| msgid "Cancel" msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Mégsem" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsetfileproperties.caption msgctxt "TFRMSETFILEPROPERTIES.CAPTION" msgid "Change attributes" msgstr "Attribútumok cseréje" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Ragadós" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "Archívum" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "Létrehozva :" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "Rejtett" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "Utolsó hozzáférés :" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "Módosított :" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "Csak olvasható" #: tfrmsetfileproperties.chkrecursive.caption msgid "Including subfolders" msgstr "ALmappákkal együtt" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "Rendszer" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "Időbélyegző tulajdonságai" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Attribútumok" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Attribútumok" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bitek :" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Csoport" #: tfrmsetfileproperties.lblattrinfo.caption msgid "(gray field means unchanged value)" msgstr "(szürke mező változatlan értéket jelent)" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Egyéb" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Tulajdonos" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Szöveges megfelelő :" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Végrehajtás" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Oktális :" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Olvasás" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Írás" #: tfrmsplitter.btncancel.caption #| msgid "Cancel" msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Kilépés" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption #| msgid "OK" msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsplitter.caption msgctxt "TFRMSPLITTER.CAPTION" msgid "Splitter" msgstr "Vágó" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664B - 3.5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "Fájl neve" #: tfrmsplitter.grbxsize.caption #| msgid "File size" msgid "Size and number of parts" msgstr "Fájlméret" #: tfrmsplitter.lbdirtarget.caption #| msgid "Directory target" msgid "Directory &target" msgstr "Célkönyv&tár" #: tfrmsplitter.lbfilesource.caption #| msgid "File source" msgid "File &source" msgstr "Fájlforrá&s" #: tfrmsplitter.lblnumberparts.caption msgid "&Number of parts" msgstr "&Darabszám" #: tfrmsplitter.rbtngigab.caption msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "&GB" #: tfrmsplitter.rbtnkilob.caption msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "&kB" #: tfrmsplitter.rbtnmegab.caption msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "&MB" #: tfrmsymlink.btncancel.caption #| msgid "Cancel" msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Mégsem" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsymlink.caption #| msgid "Create symlink" msgid "Create symbolic link" msgstr "Szimbolikus hivatkozás létrehozása" #: tfrmsymlink.lblexistingfile.caption #| msgid "Destination that the link will point to" msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "&Létező cél (erre fog mutatni a hivatkozás)" #: tfrmsymlink.lbllinktocreate.caption #| msgid "Link name" msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "&Hivatkozás neve" #: tfrmtweakplugin.btnadd.caption #| msgid "Add new" msgid "A&dd new" msgstr "Új hozzáa&dása" #: tfrmtweakplugin.btncancel.caption #| msgid "Cancel" msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Mégsem" #: tfrmtweakplugin.btnchange.caption #| msgid "Change" msgid "C&hange" msgstr "Mó&dosít" #: tfrmtweakplugin.btndefault.caption #| msgid "Default" msgid "De&fault" msgstr "A&lapértelmezett" #: tfrmtweakplugin.btnok.caption #| msgid "OK" msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmtweakplugin.btnremove.caption #| msgid "Remove" msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "&Eltávolít" #: tfrmtweakplugin.caption msgctxt "TFRMTWEAKPLUGIN.CAPTION" msgid "Tweak plugin" msgstr "Beépülő finomhangolása" #: tfrmtweakplugin.cbpk_caps_by_content.caption #| msgid "Detect archive type by content" msgid "De&tect archive type by content" msgstr "Archívum &típusának megállapítása tartalma alapján" #: tfrmtweakplugin.cbpk_caps_delete.caption #| msgid "Can delete files" msgid "Can de&lete files" msgstr "Tud fáj< törölni" #: tfrmtweakplugin.cbpk_caps_encrypt.caption #| msgid "Supports encryption" msgid "Supports e&ncryption" msgstr "T&itkosítás támogatása" #: tfrmtweakplugin.cbpk_caps_hide.caption #| msgid "Show as normal files (hide packer icon)" msgid "Sho&w as normal files (hide packer icon)" msgstr "M&egjelenítés normál fájlként (tömörítő ikonjának elrejtése)" #: tfrmtweakplugin.cbpk_caps_mempack.caption #| msgid "Supports packing in memory" msgid "Supports pac&king in memory" msgstr "Memó&riába tömörítés támogatása" #: tfrmtweakplugin.cbpk_caps_modify.caption #| msgid "Can modify exisiting archives" msgid "Can &modify exisiting archives" msgstr "Tud létező archívu&mokat módosítani" #: tfrmtweakplugin.cbpk_caps_multiple.caption #| msgid "Archive can contain multiple files" msgid "&Archive can contain multiple files" msgstr "&Az archívum több fájlt is tartalmazhat" #: tfrmtweakplugin.cbpk_caps_new.caption #| msgid "Can create new archives" msgid "Can create new archi&ves" msgstr "Tud új archí&vumot létrehozni" #: tfrmtweakplugin.cbpk_caps_options.caption #| msgid "Supports the options dialogbox" msgid "S&upports the options dialogbox" msgstr "Támogatja a beállítások dialóg&usablakot" #: tfrmtweakplugin.cbpk_caps_searchtext.caption #| msgid "Allow searching for text in archives" msgid "Allow searchin&g for text in archives" msgstr "Lehetővé teszi a szöve&gkeresést az archívumban" #: tfrmtweakplugin.lbldescription.caption #| msgid "Description:" msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "&Leírás :" #: tfrmtweakplugin.lbldetectstr.caption #| msgid "Detect string:" msgid "D&etect string:" msgstr "D&etektálandó szöveg :" #: tfrmtweakplugin.lblextension.caption #| msgid "Extension:" msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "&Kiterjesztés :" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "Állapotjelző :" #: tfrmtweakplugin.lblname.caption #| msgid "Name:" msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "&Név :" #: tfrmtweakplugin.lblplugin.caption #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "&Beépülő :" #: tfrmtweakplugin.lblplugin1.caption #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "&Beépülő :" #: tfrmviewer.actabout.caption msgctxt "TFRMVIEWER.ACTABOUT.CAPTION" msgid "About Viewer..." msgstr "Nézőke névjegye..." #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "A névjegy megjelenítése" #: tfrmviewer.actcopyfile.caption msgctxt "TFRMVIEWER.ACTCOPYFILE.CAPTION" msgid "Copy File" msgstr "Fájl másolása" #: tfrmviewer.actcopyfile.hint msgctxt "TFRMVIEWER.ACTCOPYFILE.HINT" msgid "Copy File" msgstr "Fájl másolása" #: tfrmviewer.actdeletefile.caption msgctxt "TFRMVIEWER.ACTDELETEFILE.CAPTION" msgid "Delete File" msgstr "Fájl törlése" #: tfrmviewer.actdeletefile.hint msgctxt "TFRMVIEWER.ACTDELETEFILE.HINT" msgid "Delete File" msgstr "Fájl törlése" #: tfrmviewer.actloadnextfile.caption msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.CAPTION" msgid "&Next" msgstr "&Következő" #: tfrmviewer.actloadnextfile.hint msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.HINT" msgid "Load Next File" msgstr "Következő fájl betöltése" #: tfrmviewer.actloadprevfile.caption msgctxt "TFRMVIEWER.ACTLOADPREVFILE.CAPTION" msgid "&Previous" msgstr "&Előző" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "Előző fájl betöltése" #: tfrmviewer.actmirror.caption msgctxt "TFRMVIEWER.ACTMIRROR.CAPTION" msgid "Mirror" msgstr "Tükör" #: tfrmviewer.actmirror.hint msgctxt "TFRMVIEWER.ACTMIRROR.HINT" msgid "Mirror" msgstr "Tükör" #: tfrmviewer.actmovefile.caption msgctxt "TFRMVIEWER.ACTMOVEFILE.CAPTION" msgid "Move File" msgstr "Fájl mozgatása" #: tfrmviewer.actmovefile.hint msgctxt "TFRMVIEWER.ACTMOVEFILE.HINT" msgid "Move File" msgstr "Fájl mozgatása" #: tfrmviewer.actreload.caption msgctxt "TFRMVIEWER.ACTRELOAD.CAPTION" msgid "Reload" msgstr "Újratölt" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "Újratölti a jelenlegi fájlt" #: tfrmviewer.actrotate180.caption msgctxt "TFRMVIEWER.ACTROTATE180.CAPTION" msgid "Rotate 180" msgstr "Elforgat : 180" #: tfrmviewer.actrotate180.hint msgctxt "TFRMVIEWER.ACTROTATE180.HINT" msgid "Rotate 180" msgstr "Elforgat : 180" #: tfrmviewer.actrotate270.caption msgctxt "TFRMVIEWER.ACTROTATE270.CAPTION" msgid "Rotate 270" msgstr "Elforgat : 270" #: tfrmviewer.actrotate270.hint msgctxt "TFRMVIEWER.ACTROTATE270.HINT" msgid "Rotate 270" msgstr "Elforgat : 270" #: tfrmviewer.actrotate90.caption msgctxt "TFRMVIEWER.ACTROTATE90.CAPTION" msgid "Rotate 90" msgstr "Elforgat : 90" #: tfrmviewer.actrotate90.hint msgctxt "TFRMVIEWER.ACTROTATE90.HINT" msgid "Rotate 90" msgstr "Elforgat : 90" #: tfrmviewer.actsaveas.caption msgctxt "TFRMVIEWER.ACTSAVEAS.CAPTION" msgid "Save As..." msgstr "Mentés másként..." #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "Fájl mentése másként..." #: tfrmviewer.actstretchimage.caption msgctxt "TFRMVIEWER.ACTSTRETCHIMAGE.CAPTION" msgid "Stretch" msgstr "Széthúzás" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "Kép széthúzása" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "- 90" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "Másolás" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "Másolás" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "Levágás" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "Törlés" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "Törlés" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "Teljes képernyő" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "||" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "S" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "Kiemel" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "Tükör" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "Mozgat" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "Mozgat" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "||>" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "Befest" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "<||" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "Piros szemek" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "Átméretez" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "Visszavonás" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "Nagyítás" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "Kicsinyítés" #: tfrmviewer.caption msgctxt "TFRMVIEWER.CAPTION" msgid "Viewer" msgstr "Nézőke" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Bemutató" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "Toll" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "Kiemel" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "Befest" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Bemutató" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "Nézőke" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "0x0" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "+ 180" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "- 90" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "Névjegy" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "Megjelenítés &binárisként" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "Másolás a vágólapra" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "S&zerkesztés" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "Kó&dolás" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "&Kilépés" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "&Fájl" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "Teljes képernyő" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "Grafika" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "Megjelenítés &hexában" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "&Kép" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "Kö&nyvként megjelenít" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "Tükör" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "Beépülők" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "Előnézet" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "Nyomtat..." #: tfrmviewer.mirotate.caption msgctxt "TFRMVIEWER.MIROTATE.CAPTION" msgid "Rotate" msgstr "Elforgat" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "Mentés" #: tfrmviewer.misaveas.caption msgctxt "TFRMVIEWER.MISAVEAS.CAPTION" msgid "Save As..." msgstr "Mentés másként..." #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "Képernyőkép" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "Keresés" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "Következő" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "Előző keresése" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "Összes kijelölése" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.mistretch.caption msgctxt "TFRMVIEWER.MISTRETCH.CAPTION" msgid "Stretch" msgstr "Széthúzás" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "Megjelenítés &szövegként" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "&Nézőke" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "Megjelenítés &tördelt szövegként" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "Nagyítás" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "Kicsinyítés" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "Másolás a vágólapra" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "Összes kijelölése" #: tfrmviewoperations.btnstartpause.caption msgctxt "TFRMVIEWOPERATIONS.BTNSTARTPAUSE.CAPTION" msgid "&Start" msgstr "Indítá&s" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "Leállí&tás" #: tfrmviewoperations.caption msgctxt "TFRMVIEWOPERATIONS.CAPTION" msgid "File operations" msgstr "Fájlműveletek" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "Mindig felül" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "\"Fogd && Ejtsd\" használata a sorbaállítási műveletek közt" #: tfrmviewoperations.mnucanceloperation.caption msgctxt "TFRMVIEWOPERATIONS.MNUCANCELOPERATION.CAPTION" msgid "Cancel" msgstr "Mégsem" #: tfrmviewoperations.mnucancelqueue.caption msgctxt "TFRMVIEWOPERATIONS.MNUCANCELQUEUE.CAPTION" msgid "Cancel" msgstr "Mégsem" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "Új sorbaállítás" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "TFRMVIEWOPERATIONS.MNUOPERATIONSHOWDETACHED.CAPTION" msgid "Show in detached window" msgstr "Külünálló ablakban mutat" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "Elsőnek" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "Utolsónak" #: tfrmviewoperations.mnuqueue.caption msgctxt "TFRMVIEWOPERATIONS.MNUQUEUE.CAPTION" msgid "Queue" msgstr "Sorbaállítás" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "Soron kívül" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "Sorbaállítás 1" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "Sorbaállítás 2" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "Sorbaállítás 3" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "Sorbaállítás 4" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "Sorbaállítás 5" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "TFRMVIEWOPERATIONS.MNUQUEUESHOWDETACHED.CAPTION" msgid "Show in detached window" msgstr "Külünálló ablakban mutat" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "Mind &szüneteltetése" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "TMULTIARCHIVECOPYOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Ha a fájl létezik" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "TWCXARCHIVECOPYOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Ha a fájl létezik" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "Háttérben (különálló kapcsolat)" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Ha a fájl létezik" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "Gyorsszűrő mellőzése" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "Jelenlegi művelet megállítása" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "A vágólap nem tartalmaz érvényes eszköztári adatot." #: ulng.rscolattr msgid "Attr" msgstr "Attr" #: ulng.rscoldate msgid "Date" msgstr "Dátum" #: ulng.rscolext msgid "Ext" msgstr "Kit" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "Név" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "Méret" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "Változások száma :" #: ulng.rsconfcolalign msgid "Align" msgstr "Igazítás" #: ulng.rsconfcolcaption msgid "Caption" msgstr "Fejléc" #: ulng.rsconfcolconfig msgid "Config" msgstr "Beállít" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "Töröl" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "Mező tartalma" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "Mozgat" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "Szélesség" #: ulng.rsconfcustheader #| msgid "Customize column: " msgid "Customize column" msgstr "Oszlop személyreszabása:" #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "Másolat (%d) %s" #: ulng.rsdlgallopcomplete msgid "All operations completed" msgstr "Minden művelet befejezve" #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "Az összes művelet haladása : %d %%" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "Megszü&ntet" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "M&ind" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "&Hozzáfűz" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "&Mégsem" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "&Folytat" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "&Belemásol" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "&Mind belemásolja" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "&Kilépés a programból" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "Min&d mellőzése" #: ulng.rsdlgbuttonno msgid "&No" msgstr "&Nem" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "&Egyik sem" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "&OK" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "&Felülír" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "Min&det felülír" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "Min&den régebbi felülírása" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "Fol&ytat" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "Újra&próbál" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "&Kihagy" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "Minde&t kihagy" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "&Igen" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "Fájlok és mappák számítása" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "Ellenőrző összeg számítása..." #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "Ellenőrző összeg vizsgálata..." #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "Fájl(ok) másolása" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "Fájl(ok) törlése" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "Fájl(ok) mozgatása" #: ulng.rsdlgoppause msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "&Szünet" #: ulng.rsdlgopstart msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "Indítá&s" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "Sorbaállítás" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "Sebesség : %s/s" #: ulng.rsdlgspeedtime #| msgid "Speed %s/s, remaining time %s" msgid "Speed %s/s, time remaining %s" msgstr "Sebesség : %s/s, hátralevő idő : %s" #: ulng.rsdlgsplit #| msgid "Split file" msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "Fájl szeletelése" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "Fájl(ok) tisztítása" #: ulng.rsdrivenolabel msgid "" msgstr "" #: ulng.rsdrivenomedia msgid "" msgstr "" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Double Commander belső szerkesztője" #: ulng.rseditnewfile msgid "new.txt" msgstr "új.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "Fájl neve :" #: ulng.rseditnewopen msgid "Open file" msgstr "Fájl megnyitása" #: ulng.rseditsearchback msgid "&Backward" msgstr "&Vissza" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "Keresés" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "&Előre" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "Csere" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "Kérdez;Felülír;Belemásol;Kihagy" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "Kérdez;Felülír;Régebbi felülírása;Kihagy" #: ulng.rsfileopsetpropertyerroroptions msgctxt "ulng.rsfileopsetpropertyerroroptions" msgid "Ask;Don't set anymore;Ignore errors" msgstr "Kérdez;Nem állít be többet;Hibák mellőzése" #: ulng.rsfilterstatus msgid "FILTER" msgstr "SZŰRŐ" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "Sablon meghatátozása" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "%s szint mélységben" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "mind (végtelen mélység)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "csak az aktuális mappában" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "A könyvtár \"%s\" nem létezik!" #: ulng.rsfindfound msgctxt "ulng.rsfindfound" msgid "Found: %d" msgstr "Találat : %d" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "Keresési sablon mentése" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "Sablon neve :" #: ulng.rsfindscanned msgctxt "ulng.rsfindscanned" msgid "Scanned: %d" msgstr "Végignézve : %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "Keresés" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "Fájlok keresése" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "Kezdés" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr "%s szabad %s bájtból" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "%s bájt szabad" #: ulng.rsfuncatime msgid "Access date/time" msgstr "Utolsó hozzáférési dátum/idő" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "Attribútumok" #: ulng.rsfunccomment msgctxt "ulng.rsfunccomment" msgid "Comment" msgstr "Megjegyzés" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "Tömörített méret" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "Létrehozási dátum/idő" #: ulng.rsfuncext msgid "Extension" msgstr "Kiterjesztés" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "Csoport" #: ulng.rsfunclinkto msgid "Link to" msgstr "Erre utal" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "Módosítási dátum/idő" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "Név" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "Név, kiterjesztés nélkül" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "Tulajdonos" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "Útvonal" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "Méret" #: ulng.rsfunctype msgid "Type" msgstr "Típus" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "Hiba a hardlink létrehozásakor." #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "Párbeszédablak másolása/mozgatása" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "Eltérésnézőke" #: ulng.rshotkeycategorymain msgid "Main" msgstr "Fő" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "Nézőke" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "Linker végzett" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "Maszk kijelölés megszüntetése" #: ulng.rsmarkplus msgid "Select mask" msgstr "Kijelölő maszk" #: ulng.rsmaskinput msgid "Input mask:" msgstr "Maszk bevitele :" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "Egyéni oszlopok beállítása" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "Egyéni oszlop nézet beállítása" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "Műveletek" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "Szerkesztés" #: ulng.rsmnueject msgid "Eject" msgstr "Kiadás" #: ulng.rsmnumount msgid "Mount" msgstr "Csatolás" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "Új" #: ulng.rsmnunomedia msgid "No media available" msgstr "Nincs elérhető hordozó" #: ulng.rsmnuopenwith #| msgid "Open with ..." msgid "Open with" msgstr "Megnyitás ezzel ..." #: ulng.rsmnuopenwithother msgid "Other..." msgstr "Más..." #: ulng.rsmnusortby msgid "Sort by" msgstr "Rendezés" #: ulng.rsmnuumount #| msgid "Umount" msgid "Unmount" msgstr "Lecsatolás" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "Nézőke" #: ulng.rsmsgaccount msgid "Account:" msgstr "Fiók :" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "További paraméterek az archiváló parancssorra :" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "Nem másolhatja/helyezheti a fájlt \"%s\" saját magára!" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "A mappa \"%s\" nem törölhető" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "Váltás ide \"%s\" meghiúsult!" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "Eltávolítja az összes inaktív fület?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "Ez a fül (%s) zárolt! Mégis bezárja?" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "Biztosan ki akar lépni?" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "%d kiválasztott fájl/könyvtár másolása?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "\"%s\" másolása?" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "Törölje a részben átmásolt fájlt?" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "%d kiválasztott fájl/könyvtár törlése?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "A kijelölt %d fájlt/mappát a Kukába helyezi?" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "\"%s\" törlése?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "A kijelölt \"%s\" Kukába helyezi?" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "\"%s\" nem helyezhető a Kukába! Véglegesen törli?" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "A lemez nem elérhető" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "Írja be a fájl kiterjesztést :" #: ulng.rsmsgentername msgid "Enter name:" msgstr "Írja be a nevet :" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "CRC hiba az archívumban" #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "Hibás adat" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "Nem bír csatlakozni a szerverhez : \"%s\"" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "Nem tudom %s fájlt ide másolni : %s" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "Már létező könyvtárnév : \"%s\"." #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "A dátum %s nem támogatott" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "A könyvtár %s létezik!" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "A műveletet a felhasználó megszakította" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "Hiba a fájl bezárásakor" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "Nem lehet létrehozni a fájlt" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "Nincs több fájl az archívumban" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "Nem lehet megnyitni létező fájlt" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "Hiba a fájlból olvasáskor" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "Hiba a fájl írásakor" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "Nem lehet létrehozni a mappát : %s !" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "Érvénytelen hivatkozás" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "A fájl nem található" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "Nincs elég memória" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "A művelet nem támogatott!" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "Hiba a helyi menü parancsban" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "Hiba a beállítások betöltésekor" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "Szintaktikai hiba a reguláris kifejezésben!" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "Nem tudom a fájlt (%s) %s névre változtatni" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "Nem bírja menteni a társítást!" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "A fájl nem menthető" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "Nem módosíthatóak az attribútumok : \"%s\"" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "Nem módosítható a dátum/idő : \"%s\"" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "Nem módosítható a tulajdonos/csoport : \"%s\"" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "A puffer túl kicsi" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "Túl sok fájl a tömörítéshez" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "Ismeretlen archívum" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "A fájl %s megváltozott, menti?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "A fájl %s már létezik, felülírja?" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "Aktív fájl műveletek" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "Néhány fájlművelet még nem lett befejezve. Double Commander bezárása adatvesztést eredményezhet!" #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "A fájl (%s) csak olvasható. Törli?" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "A fájl \"%s\" mérete túl nagy a cél fájlrendszerre!" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "A mappa %s már létezik, felülírja?" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "A szimbolikus hivatkozás \"%s\" követése?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "Hiba a parancssorban" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "Érvénytelen fájlnév" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "Érvénytelen beállítási fájl formátum" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "Érvénytelen útvonal" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "Az útvonal (%s) tiltott karaktereket tartalmaz" #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "Ez nem érvényes beépülő!" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "Ez a beépülő a Double Commander %s verziójához készült! %s nem fog működni a Double Commander %s verziójával!" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "Érvénytelen idézet" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "Érvénytelen kijelölés" #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "Fájl lista betöltése..." #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "%s másolása" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "%s törlése" #: ulng.rsmsglogerror msgid "Error: " msgstr "Hiba : " #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "%s kitömörítése" #: ulng.rsmsgloginfo msgid "Info: " msgstr "Infó : " #: ulng.rsmsgloglink msgid "Create link %s" msgstr "%s hivatkozás létrehozása" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "%s könyvtár létrehozása" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "%s fájl mozgatása" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "Tömörítés %s fájlba" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "%s könyvtár törlése" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "Kész : " #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "%s szimbolikus hivatkozás létrehozása" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "%s fájl sértetlenségének ellenőrzése" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "Forró útvonal kézileg hozzáadása" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "Forró útvonal kézileg szerkesztése" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "Add meg a nevet és az útvonalat név = útv. formában :" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "Mesterjelszó" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "Kérem, írja be a mesterjelszavat :" #: ulng.rsmsgnewfile msgid "New file" msgstr "Új fájl" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "A következő darab kicsomagolása következik" #: ulng.rsmsgnofiles msgid "No files" msgstr "Nincsenek fájlok." #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "Nincsenek kijelölt fájlok." #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "Nincs elég hely a célmeghajtón, folytatja?" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "Nincs elég hely a célmeghajtón, újrapróbálja?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "Nem lehet törölni a fájlt : %s" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "Nincs leprogramozva." #: ulng.rsmsgpassword msgid "Password:" msgstr "Jelszó :" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "A jelszavak különböznek!" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "Kérem, írja be a jelszavat :" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "Jelszó (Tűzfal) :" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "Kérem, írja be újból a jelszavat az ellenőrzéshez :" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "%s hozzá&adása" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "&Beállítás" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "%s &törlése" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "Preset \"%s\" már létezik. Felülírja?" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "%d fájl/könyvtár áthelyezése/átnevezése?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "Kiválasztott \"%s\" áthelyezése/átnevezése?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "Kérem indítsa újra a Double Commander-t, hogy érvényesítse a változásokat" #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "Kiválasztva : %s/%s, fájl : %d/%d, mappa : %d/%d" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "Kérem, csak ellenőrzőösszeg-fájlokat jelöljön ki!" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "Válassza ki a következő kötet helyét" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "Kötetcimke beállítása" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "Fül átnevezése" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "Fül új neve :" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "Cél útvonal :" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "Menüelem új megnevezése : " #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "Túl sok fájl van kijelölve." #: ulng.rsmsgurl msgid "URL:" msgstr "URL : " #: ulng.rsmsgusername msgid "User name:" msgstr "Felhasználónév :" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "Felhasználónév (Tűzfal) :" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "Kötetcimke :" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "Kérem, írja be a kötet méretét :" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "A kiválasztott %d fájl/mappa törlése?" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "Törli a kiválasztott \"%s\"-t?" #: ulng.rsmulrenfilenamestylelist #| msgid "No change;UPPERCASE;lowercase;First Char Big;" msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "Nincs változás;NAGYBETŰS;kisbetűs;Nagy kezdőbetűs;Minden Szó Nagy Kezdőbetűs" #: ulng.rsoperaborted msgid "Aborted" msgstr "Megszüntetett" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "Ellenőrzőösszegének számítás" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "Ellenőrzőösszegének számítás itt : \"%s\"" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "\"%s\" ellenőrzőösszegének számítása" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "Számítás" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "Számítás \"%s\"" #: ulng.rsopercombining msgid "Joining" msgstr "Összefűzés" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "Fájlok összefűzése itt : \"%s\" ebbe \"%s\"" #: ulng.rsopercopying msgid "Copying" msgstr "Másolás" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "Másolás innen \"%s\" ide \"%s\"" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "\"%s\" másolása ide \"%s\"" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "Mappa készítése" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "Mappa készítése : \"%s\"" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "Törlés" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "Törlés itt : \"%s\"" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "\"%s\" törlése" #: ulng.rsoperexecuting msgid "Executing" msgstr "Végrehajtás" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "\"%s\" végrehajtása" #: ulng.rsoperextracting msgid "Extracting" msgstr "Kibontás" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "Kibontás innen \"%s\" ide \"%s\"" #: ulng.rsoperfinished msgid "Finished" msgstr "Befejezve" #: ulng.rsoperlisting msgid "Listing" msgstr "Listázás" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "\"%s\" listázása" #: ulng.rsopermoving msgid "Moving" msgstr "Mozgatás" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "Mozgatás innen \"%s\" ide \"%s\"" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "\"%s\" mozgatása ide \"%s\"" #: ulng.rsopernotstarted msgid "Not started" msgstr "Nincs elindítva" #: ulng.rsoperpacking msgid "Packing" msgstr "Csomagolás" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "Csomagolás innen \"%s\" ide \"%s\"" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "\"%s\" csomagolása ide \"%s\"" #: ulng.rsoperpaused msgid "Paused" msgstr "Szüneteltetve" #: ulng.rsoperpausing msgid "Pausing" msgstr "Szünetelés" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "Sorbaállított" #: ulng.rsoperrunning msgid "Running" msgstr "Futás" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "Tulajdonság beállítása" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "Tulajdonság beállítása itt \"%s\"" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "\"%s\" tulajdonságainak beállítása" #: ulng.rsopersplitting msgid "Splitting" msgstr "Vágás" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "\"%s\" vágása ide \"%s\"" #: ulng.rsoperstarting msgid "Starting" msgstr "Indítás" #: ulng.rsoperstopped msgid "Stopped" msgstr "Megállított" #: ulng.rsoperstopping msgid "Stopping" msgstr "Megállítás" #: ulng.rsopertesting msgid "Testing" msgstr "Próbálás" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "Próbálás itt \"%s\"" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "\"%s\" próbálása" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "Ellenőrzőösszeg ellenőrzése" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "Ellenőrzőösszeg ellenőrzése itt \"%s\"" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "\"%s\" ellenőrzőösszeg ellenőrzése" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "Fájl forrás hozzáférhetőségére várva" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "A felhasználó válaszára vár" #: ulng.rsoperwiping msgid "Wiping" msgstr "Tisztítás" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "Tisztítás itt \"%s\"" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "\"%s\" tisztítása" #: ulng.rsoperworking msgid "Working" msgstr "Dolgozik" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "Törlés :" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "Útvonal nélküli kibontás" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "Formátum értelmezési mód :" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "ID : " #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "ID pozíció :" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "ID keresési taromány :" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "Paraméter" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "Jelszó kérdező sztring :" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "Önkioldó archívum létrehozása :" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "Próba :" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "Archívum típusának neve :" #: ulng.rsoptarchivevalue msgid "Value" msgstr "Érték" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "A beépülő \"%s\" társítása ezzel :" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "Első;Utolsó;" #: ulng.rsoptdisable msgid "Disable" msgstr "Letiltás" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "Engedélyezés" #: ulng.rsoptenterext msgid "Enter extension" msgstr "Kiterjesztés megadása" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "Kurzor" #: ulng.rsoptexamplemark msgid "Mark" msgstr "Kijelölés" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "Kijelölés + kurzor" #: ulng.rsoptexampletext msgid "Text" msgstr "Szöveg" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "külön ablak;kicsinyített külön ablak;műveleti panel" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "lebegő;B;k;M;G" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "A gyorsbillentyű \"%s\" a cm_Delete-tel lesz bejegyezve, így azt fel lehet használni, hogy megfordítsuk ezt a beállítást." #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "Gyorsbillentyű hozzáadása ehhez : %s" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "Gyorsbillentyű hozzáadása" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "Gyorsbillentyű beállítása sikertelen" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "Gyorsbillentyű cseréje" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "Parancs" #: ulng.rsopthotkeysdeletetrashcanoverrides msgctxt "ulng.rsopthotkeysdeletetrashcanoverrides" msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "A cm_Delete gyorsbillentyűje \"%s\" rendelkezik paraméterrel amely felülírja ezt a beállítást. Szeretné megváltoztatni ezt a paramétert és használni a globális beállítást?" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgctxt "ulng.rsopthotkeysdeletetrashcanparameterexists" msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "A gyorsbillentyű \"%s\" a cm_Delete-hez paraméterváltozást igényel, hogy egyezzen \"%s\" gyorsbillentyűvel. Szeretné megváltoztatni?" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "Leírás" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "Gyorsbillentyű szerkesztése ehhez : %s" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "Állandó paraméter" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "Gyorsbillentyű" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "Gyorsbillentyűk" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "Paraméterek" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "Gyorsbillentyű beállítása törlésre" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "Ahhoz, hogy a gyorsbillentyű \"%s\" működjön, a gyorsbillentyűt \"%s\" hozzá kell rendelni a cm_Delete parancshoz, de már hozzá van rendelve ehhez : \"%s\". Szeretné megváltoztatni?" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "A gyorsbillentyű \"%s\" a cm_Delete-hez egy olyan szekvencia gyorsbillentyű amely a fordított Shift forrógombbal nem használható. Ez a beállítás valószínűleg nem fog működni." #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "A gyorsbillentyű már foglalt" #: ulng.rsopthotkeysshortcutusedtext1 msgid "Shortcut %s is already used." msgstr "A gyorsbillentyű \"%s\" már foglalt" #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "Cseréli erre \"%s\"?" #: ulng.rsopthotkeysusedby msgid "used for %s in %s" msgstr "erre van használva \"%s\", itt : \"%s\"" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "erre a parancsra van használva, de másik paraméterrel" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "Archívumok" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "Automatikus frissítés" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "Viselkedés" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "Színek" #: ulng.rsoptionseditorcolumnsview msgctxt "ulng.rsoptionseditorcolumnsview" msgid "Columns" msgstr "Oszlopok" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "Beállítás" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "Egyedi oszlopok" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "Húzd és ejtsd" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "Meghajtólista gombok" #: ulng.rsoptionseditorfileoperations msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "Fájlműveletek" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "Fájl panelek" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "Fájlok megtekintése" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "Fájltípusok" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "Mappafülek" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "Betűtípusok" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "Kiemelők" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "Gyorsbillentyűk" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "Ikonok" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "Kihagyási lista" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "Gombok" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "Nyelv" #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "Megjelenés" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "Napló" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "Egyéb" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "Egér" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "Beépülők" #: ulng.rsoptionseditorquicksearch #| msgid "Quick search" msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "Gyorskeresés/szűrő" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "Terminál" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "Eszköztár" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "Eszközök" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "Buboréktippek" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "Sehol;Parancssor;Gyorskeresés;Gyorsszűrő" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "Bal gomb;Jobb gomb;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "a fájl lista tetején;mappák után (ha a mappák hamarább vannak a fájloktól);rendezési sorrendben;a fájllista alján" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "A beépülő (%s) már hozzá van rendelve a következő kiterjesztés(ek)hez :" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "Aktív" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "Fájlnév" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "Név" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "Regisztrálva" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "Érzéke&ny;Érzéke&tlen" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "&Fájlok;&Mappák;Fájlok é&s Mappák" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "Szűrőpanel elrejtése, &ha nem fókuszált" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "nem karakterérzékeny;területi beállítások szerint (aAbBcC);előbb nagybetűs, aztán kisbetűs (ABCabc)" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "rendezés név szerint és mutatja az elsőt;rendezés, mint a fájlokat és mutatja az elsőt;rendezés, mint a fájlokat" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "Betűrendes, ékezetekre figyel;Természetes elrendezés : betűrendes és számok" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "Felül;Alul;" #: ulng.rsopttoolbarbuttontype msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "&Elválasztó;Belső pa&rancs;Külső ¶ncs;&Menü" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "ne módosítsa a helyzetet;használja az új fájl beállításait;rendezett sorrendben" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "Fájl : %d, mappa : %d" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "\"%s\" jogosultsága nem állítható" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "\"%s\" tulajdonosa nem állítható" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "Fájl" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "Könyvtár" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "Csőnév" #: ulng.rspropsno msgid "No" msgstr "Nem" #: ulng.rspropssocket msgid "Socket" msgstr "Foglalat" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "Speciális blokk eszköz" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "Speciális karakter eszköz" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "Szimbolikus hivatkozás" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "Ismeretlen típus" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "Igen (%s)" #: ulng.rssearchresult msgid "Search result" msgstr "Keresés eredménye" #: ulng.rssearchtemplateunnamed msgid "" msgstr "" #: ulng.rsselectdir msgid "Select a directory" msgstr "Válasszon ki egy könyvtárat" #: ulng.rsshowhelpfor msgid "&Show help for %s" msgstr "&Súgó ehhez : %s" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "B" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "GB" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "kB" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "MB" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "TB" #: ulng.rsspacemsg #| msgid "Files:%d, Dirs:%d, Size: %d bytes" msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "Fájlok:%d, Mappák:%d, Méret: %s (%s bájt)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "Nem lehet létrehozni a célkönyvtárat!" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "Hibás fájlméret formátum!" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "Nem lehet darabolni a fájlt!" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "A darabok száma több, mint 100! Folytassam?" #: ulng.rssplitseldir msgid "Select directory:" msgstr "Könyvtár kiválasztása :" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "Hiba a szimbolikus hivatkozás létrehozásakor." #: ulng.rssyndefaulttext msgctxt "ulng.rssyndefaulttext" msgid "Default text" msgstr "Átlagos szöveg" #: ulng.rssynlangplaintext msgctxt "ulng.rssynlangplaintext" msgid "Plain text" msgstr "Egyszerű szöveg" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "Nap" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "Óra" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "Perc" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "Hónap" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "Másodperc" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "Hét" #: ulng.rstimeunityear msgid "Year(s)" msgstr "Év" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "Különbségvizsgáló" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "Szerkesztő" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "Hiba a különbségvizsgáló megnyitásakor" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "Hiba a szerkesztő megnyitásakor" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "Hiba a terminál megnyitásakor" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "Hiba a nézőke megnyitásakor" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "Terminál" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "Nézőke" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "Kérjük, jelezze a hibát a 'bug tracker'-en egy leírással, hogy mit csinált, és a következő fájlt : %s. Nyomja meg \"%s\" gombot a folytatáshoz, vagy \"%s\" gombot a programból való kilépéshez." #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "Hálózat" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "A Double Commander belső nézőkéje" #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "Kódolás" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "%s nem található!" doublecmd-0.5.8/language/doublecmd.fr.po0000644000175000017500000065614612250633131017213 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.1 beta\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-01-17 23:08+0300\n" "PO-Revision-Date: 2011-12-14 23:18+0100\n" "Last-Translator: Zebulon Tourneboulle \n" "Language-Team: Zebulon Tourneboulle \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: French\n" "X-Poedit-Country: BELGIUM\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "Tous" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "Tous" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "Tous" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "Tous" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "Tous" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "Tous" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "Tous" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "Annuler" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "..." #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "->" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "<-" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "Personnaliser les colonnes affichées" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "Arrière-plan" #: tfcolumnssetconf.cbcursorborder.caption #, fuzzy msgid "Cursor border" msgstr "Bordure du curseur" #: tfcolumnssetconf.cbovercolor.caption #, fuzzy msgid "Allow Overcolor" msgstr "Autoriser la superposition des couleurs" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "Utiliser des polices et couleurs personnalisées" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "Couleur du texte :" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "Police :" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "Taille :" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "Arrière-plan 2 :" #: tfcolumnssetconf.lblconfigviewnr.caption msgid "Configure view nr:" msgstr "Configurer la vue n°" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "Couleur du curseur :" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "Caractère du curseur :" #: tfcolumnssetconf.lblmarkcolor.caption #, fuzzy msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "Couleur de la marque :" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "Nom :" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "Ajouter une colonne" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "Personnaliser les colonnes :" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "Prévisualisation" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "R" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption #, fuzzy #| msgid "Check free space" msgid "C&heck free space" msgstr "Vérifier l'espace disponible" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption msgid "Cop&y attributes" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption msgid "Copy o&wnership" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption msgid "Copy d&ate/time" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption #, fuzzy #| msgid "Correct links" msgid "Correct lin&ks" msgstr "Liens valides" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "Ne pas tenir compte du marqueur \"lecture seule\"" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption msgid "E&xclude empty directories" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption #, fuzzy #| msgid "Follow links" msgid "Fo&llow links" msgstr "Suivre les liens" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "" #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption #, fuzzy #| msgid "When directory exists" msgid "When dir&ectory exists" msgstr "Quand le dossier existe" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption #, fuzzy #| msgid "When file exists" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "Quand le fichier existe" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption msgid "When ca&nnot set property" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "" #: tfrmabout.btnclose.caption msgctxt "TFRMABOUT.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Fermer" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "A propos" #: tfrmabout.lblbuild.caption #, fuzzy msgid "Build" msgstr "Date révision" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "Free Pascal" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "Page de démarrage :" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "http://doublecmd.sourceforge.net" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "Lazarus" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "Révision" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption #, fuzzy #| msgid "Version %s" msgid "Version" msgstr "Version %s" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuler" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "&Reset" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "Choisir les attributs" #: tfrmattributesedit.cbarchive.caption #, fuzzy #| msgid "Archive" msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "Archive" #: tfrmattributesedit.cbcompressed.caption #, fuzzy #| msgid "Compressed" msgid "Co&mpressed" msgstr "Comprimé" #: tfrmattributesedit.cbdirectory.caption #, fuzzy #| msgid "Directory" msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "Dossier" #: tfrmattributesedit.cbencrypted.caption #, fuzzy #| msgid "Encrypted" msgid "&Encrypted" msgstr "Archive cryptée" #: tfrmattributesedit.cbhidden.caption #, fuzzy #| msgid "Hidden" msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "Caché" #: tfrmattributesedit.cbreadonly.caption #, fuzzy #| msgid "Read only" msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "Lecture seule" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmattributesedit.cbsparse.caption msgid "S&parse" msgstr "" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Collant" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmattributesedit.cbsymlink.caption #, fuzzy #| msgid "Symlink" msgid "&Symlink" msgstr "Lien symbolique" #: tfrmattributesedit.cbsystem.caption #, fuzzy #| msgid "System" msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "Système" #: tfrmattributesedit.cbtemporary.caption #, fuzzy #| msgid "Temporary" msgid "&Temporary" msgstr "Temporaire" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "Attributs NTFS" #: tfrmattributesedit.gbwingeneral.caption #, fuzzy msgid "General attributes" msgstr "Attributs généraux" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits :" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Groupe" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Autres" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Propriétaire" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "Exécuter" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "Lire" #: tfrmattributesedit.lbltextattrs.caption #, fuzzy #| msgid "As text:" msgid "As te&xt:" msgstr "Comme texte :" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "Ecrire" #: tfrmchecksumcalc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmchecksumcalc.caption msgctxt "tfrmchecksumcalc.caption" msgid "Calculate check sum..." msgstr "Vérification de la somme de contrôle..." #: tfrmchecksumcalc.cbseparatefile.caption #, fuzzy #| msgid "Create separate checksum file for each file" msgid "C&reate separate checksum file for each file" msgstr "Créer une somme de contrôle séparée pour chaque fichier" #: tfrmchecksumcalc.lblsaveto.caption #, fuzzy #| msgid "Save check sum file(s) to:" msgid "&Save check sum file(s) to:" msgstr "Sauvegarder la somme de contrôle dans le fichier :" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Fermer" #: tfrmchecksumverify.caption #, fuzzy msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "Vérification de la somme de contrôle..." #: tfrmconnectionmanager.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "Ajouter" #: tfrmconnectionmanager.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmconnectionmanager.btnconnect.caption #, fuzzy #| msgid "Connect" msgid "C&onnect" msgstr "Se connecter" #: tfrmconnectionmanager.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Supprimer" #: tfrmconnectionmanager.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Editer" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "Connexion manager" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "Se connecter à :" #: tfrmcopydlg.btnaddtoqueue.caption msgid "A&dd To Queue" msgstr "" #: tfrmcopydlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "tfrmcopydlg.btncreatespecialqueue.caption" msgid "..." msgstr "..." #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "O&ptions" #: tfrmcopydlg.btnsaveoptions.caption #, fuzzy #| msgid "Save these options as default" msgid "Sa&ve these options as default" msgstr "Sauvegarder comme options par défaut" #: tfrmcopydlg.caption #, fuzzy msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "Copier le(s) fichier(s)" #: tfrmdescredit.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmdescredit.caption #, fuzzy msgid "File/folder comment" msgstr "Commentaires liés aux fichiers/dossiers" #: tfrmdescredit.lbleditcommentfor.caption #, fuzzy #| msgid "Edit comment for:" msgid "E&dit comment for:" msgstr "Editer le commentaire pour :" #: tfrmdescredit.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "Encodage :" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "A propos" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "Comparaison automatique" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "Mode binaire" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "Annuler" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "Annuler" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "Copier le bloc vers la droite" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "Copier le bloc vers la droite" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "Copier le bloc vers la gauche" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "Copier le bloc vers la gauche" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Copier" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Couper" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Supprimer" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Coller" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Refaire" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "&Tout sélectionner" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Annuler (en arrière)" #: tfrmdiffer.actexit.caption msgctxt "tfrmdiffer.actexit.caption" msgid "E&xit" msgstr "&Quitter" #: tfrmdiffer.actfirstdifference.caption msgctxt "tfrmdiffer.actfirstdifference.caption" msgid "First Difference" msgstr "Première différence" #: tfrmdiffer.actfirstdifference.hint msgctxt "tfrmdiffer.actfirstdifference.hint" msgid "First Difference" msgstr "Première différence" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "Ignorer la casse" #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "Ignorer les espaces" #: tfrmdiffer.actkeepscrolling.caption #, fuzzy msgid "Keep Scrolling" msgstr "Bloquer le défilement" #: tfrmdiffer.actlastdifference.caption msgctxt "tfrmdiffer.actlastdifference.caption" msgid "Last Difference" msgstr "Dernière différence" #: tfrmdiffer.actlastdifference.hint msgctxt "tfrmdiffer.actlastdifference.hint" msgid "Last Difference" msgstr "Dernière différence" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "Différences de la ligne en cours" #: tfrmdiffer.actnextdifference.caption msgctxt "tfrmdiffer.actnextdifference.caption" msgid "Next Difference" msgstr "Prochaine différence" #: tfrmdiffer.actnextdifference.hint msgctxt "tfrmdiffer.actnextdifference.hint" msgid "Next Difference" msgstr "Prochaine différence" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "Ouvrir à Gauche" #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "Ouvrir à Droite" #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "Colorer l'arrière-plan" #: tfrmdiffer.actprevdifference.caption msgctxt "tfrmdiffer.actprevdifference.caption" msgid "Previous Difference" msgstr "Précédente différence" #: tfrmdiffer.actprevdifference.hint msgctxt "tfrmdiffer.actprevdifference.hint" msgid "Previous Difference" msgstr "Précédente différence" #: tfrmdiffer.actreload.caption #, fuzzy #| msgid "Reload" msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "Recharger" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "Recharger" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "Enregistrer" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "Enregistrer" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "Enregistrer sous... " #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "Enregistrer sous... " #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "Sauvegarder la gauche" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "Sauvegarder la gauche" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "Sauvegarder la gauche sous..." #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "Sauvegarder la gauche sous..." #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "Sauvegarder la droite" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "Sauvegarder la droite" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "Sauvegarder la droite sous..." #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "Sauvegarder la droite sous..." #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "Comparer" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "Comparer" #: tfrmdiffer.btnleftencoding.hint #, fuzzy msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "Encodage" #: tfrmdiffer.btnrightencoding.hint #, fuzzy msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "Encodage" #: tfrmdiffer.caption msgctxt "TFRMDIFFER.CAPTION" msgid "Compare files" msgstr "Comparer les fichiers" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miencodingleft.caption #, fuzzy #| msgid "Left" msgid "&Left" msgstr "Gauche" #: tfrmdiffer.miencodingright.caption #, fuzzy #| msgid "Right" msgid "&Right" msgstr "Droite" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.mnuactions.caption #, fuzzy msgid "&Actions" msgstr "&Actions" #: tfrmdiffer.mnuedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "Editer" #: tfrmdiffer.mnuencoding.caption #, fuzzy #| msgid "Encoding" msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "Encodage" #: tfrmdiffer.mnufile.caption #, fuzzy #| msgid "File" msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "Fichier" #: tfrmdiffer.mnuoptions.caption msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "&Options" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "" #: tfrmedithotkey.btncancel.caption msgctxt "TFRMEDITHOTKEY.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuler" #: tfrmedithotkey.btnok.caption msgctxt "TFRMEDITHOTKEY.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "" #: tfrmedithotkey.cghkcontrols.caption msgctxt "tfrmedithotkey.cghkcontrols.caption" msgid "Only for these controls" msgstr "" #: tfrmedithotkey.lblparameters.caption msgid "&Parameters (each in a separate line):" msgstr "" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "A propos" #: tfrmeditor.actabout.hint msgctxt "tfrmeditor.actabout.hint" msgid "About" msgstr "A propos" #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "&Configuration" #: tfrmeditor.actconfhigh.hint msgctxt "tfrmeditor.actconfhigh.hint" msgid "Configuration" msgstr "Configuration" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Copier" #: tfrmeditor.acteditcopy.hint msgctxt "tfrmeditor.acteditcopy.hint" msgid "Copy" msgstr "Copier" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Couper" #: tfrmeditor.acteditcut.hint msgctxt "tfrmeditor.acteditcut.hint" msgid "Cut" msgstr "Couper" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Supprimer" #: tfrmeditor.acteditdelete.hint msgctxt "tfrmeditor.acteditdelete.hint" msgid "Delete" msgstr "Supprimer" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "&Rechercher" #: tfrmeditor.acteditfind.hint msgctxt "tfrmeditor.acteditfind.hint" msgid "Find" msgstr "Rechercher" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "Rechercher le suivant" #: tfrmeditor.acteditfindnext.hint msgctxt "tfrmeditor.acteditfindnext.hint" msgid "Find next" msgstr "Rechercher le suivant" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcr.hint msgctxt "tfrmeditor.acteditlineendcr.hint" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "tfrmeditor.acteditlineendcrlf.hint" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditlineendlf.hint msgctxt "tfrmeditor.acteditlineendlf.hint" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Coller" #: tfrmeditor.acteditpaste.hint msgctxt "tfrmeditor.acteditpaste.hint" msgid "Paste" msgstr "Coller" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Refaire" #: tfrmeditor.acteditredo.hint msgctxt "tfrmeditor.acteditredo.hint" msgid "Redo" msgstr "Refaire" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "R&emplacer" #: tfrmeditor.acteditrplc.hint msgctxt "tfrmeditor.acteditrplc.hint" msgid "Replace" msgstr "Remplacer" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "&Tout sélectionner" #: tfrmeditor.acteditselectall.hint msgctxt "tfrmeditor.acteditselectall.hint" msgid "Select All" msgstr "Tout sélectionner" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Annuler" #: tfrmeditor.acteditundo.hint msgctxt "tfrmeditor.acteditundo.hint" msgid "Undo" msgstr "Annuler" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "&Fermer" #: tfrmeditor.actfileclose.hint msgctxt "tfrmeditor.actfileclose.hint" msgid "Close" msgstr "Fermer" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "&Quitter" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "&Nouveau" #: tfrmeditor.actfilenew.hint msgctxt "tfrmeditor.actfilenew.hint" msgid "New" msgstr "Nouveau" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "&Ouvrir" #: tfrmeditor.actfileopen.hint msgctxt "tfrmeditor.actfileopen.hint" msgid "Open" msgstr "Ouvrir" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "&Enregistrer" #: tfrmeditor.actfilesave.hint msgctxt "tfrmeditor.actfilesave.hint" msgid "Save" msgstr "Enregister" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "Enregistrer &sous" #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "T&out enregistrer" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "" #: tfrmeditor.caption msgctxt "tfrmeditor.caption" msgid "Editor" msgstr "Editeur" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "Ai&de" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Editer" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "En&codage" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "Ouvrir en :" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "Enregistrer en :" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "&Fichier" #: tfrmeditor.mihighlight.caption #, fuzzy msgid "Syntax highlight" msgstr "Coloration syntaxique" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n5.caption msgctxt "TFRMEDITOR.N5.CAPTION" msgid "-" msgstr "-" #: tfrmeditsearchreplace.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "Sensibilité à la c&asse" #: tfrmeditsearchreplace.cbsearchfromcursor.caption #, fuzzy #| msgid "Search from &caret" msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "Chercher à partir du &caret (^)" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "Expression &régulière" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "Seulement le &texte sélectionné" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "Mots entiers uniquement" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "Option" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "&remplacer avec :" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "Chaine à R&echercher :" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "Direction" #: tfrmextractdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmextractdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Aide" #: tfrmextractdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmextractdlg.caption #, fuzzy msgctxt "TFRMEXTRACTDLG.CAPTION" msgid "Unpack files" msgstr "Extraire les fichiers" #: tfrmextractdlg.cbextractpath.caption #, fuzzy msgid "&Unpack path names if stored with files" msgstr "Extraire en utilisant les chemins des dossiers dans l'archive" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*.*" #: tfrmextractdlg.cbinseparatefolder.caption #, fuzzy msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "Extraire chaque archive dans un sous-dossier séparé (au nom de l'archive)" #: tfrmextractdlg.cboverwrite.caption #, fuzzy #| msgid "&Overwrite existing files" msgid "O&verwrite existing files" msgstr "&Ecraser les fichier existants" #: tfrmextractdlg.lblextractto.caption #, fuzzy #| msgid "To the directory:" msgid "To the &directory:" msgstr "Dans le dossier :" #: tfrmextractdlg.lblfilemask.caption #, fuzzy #| msgid "Extract files matching file mask:" msgid "&Extract files matching file mask:" msgstr "Extraire les fichiers correspondant au masque :" #: tfrmextractdlg.lblpassword.caption #, fuzzy #| msgid "Password for encrypted files:" msgid "&Password for encrypted files:" msgstr "Mot de passe pour les fichiers cryptés :" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "Ajouter" #: tfrmfileassoc.btnaddext.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "Ajouter" #: tfrmfileassoc.btnaddnewtype.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "Ajouter" #: tfrmfileassoc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmfileassoc.btndownact.caption #, fuzzy #| msgid "Down" msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "En dessous" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmfileassoc.btnremoveact.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "Supprimer" #: tfrmfileassoc.btnremoveext.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "Supprimer" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "X" #: tfrmfileassoc.btnremovetype.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "Supprimer" #: tfrmfileassoc.btnrenametype.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "Effacer" #: tfrmfileassoc.btnupact.caption #, fuzzy #| msgid "Up" msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "Au dessus" #: tfrmfileassoc.caption msgid "File associations" msgstr "Associations de fichiers" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "Actions" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "Extensions" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "Types de fichiers" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "Icône" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "Action :" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "&Commande :" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "Editer" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "Ouvrir dans l'Editeur" #: tfrmfileassoc.mifilename.caption #, fuzzy msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "Nom de fichier" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "Chemin du fichier" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "Chemin complet" #: tfrmfileassoc.migetoutputfromcommand.caption #, fuzzy msgid "Get output from command" msgstr "Récupérer la sortie de la commande" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "Ouvrir" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "Exécuter dans un terminal" #: tfrmfileassoc.mivfs.caption #, fuzzy msgid "Open in VFS" msgstr "Ouvrir dans les VFS" #: tfrmfileassoc.miview.caption #, fuzzy msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "Vue" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "Ouvrir dans la visionneuse" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Fermer" #: tfrmfileexecuteyourself.caption #, fuzzy msgctxt "TFRMFILEEXECUTEYOURSELF.CAPTION" msgid "Wait..." msgstr "Attendre..." #: tfrmfileexecuteyourself.lblfilename.caption #, fuzzy msgid "File name:" msgstr "Nom de fichier :" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "De :" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "Cliquer sur Fermer quand le fichier temporaire ne peut pas être supprimé !" #: tfrmfileop.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "De :" #: tfrmfileop.lblto.caption msgid "To:" msgstr "A :" #: tfrmfileproperties.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Fermer" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "" #: tfrmfileproperties.caption msgctxt "TFRMFILEPROPERTIES.CAPTION" msgid "Properties" msgstr "Propriétés" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Collant" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "Propriétaire" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits :" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Groupe" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Autres" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Propriétaire" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmfileproperties.lblattrtextstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Texte :" #: tfrmfileproperties.lblcontains.caption msgctxt "tfrmfileproperties.lblcontains.caption" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Exécuter" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "Nom du fichier" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "Nom :" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "Nom du fichier : " #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "Chemin :" #: tfrmfileproperties.lblgroupstr.caption #, fuzzy #| msgid "Group" msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "Groupe" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "Dernier accès :" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "Dernière modification :" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "Dernier changement de statut :" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Octal :" #: tfrmfileproperties.lblownerstr.caption #, fuzzy #| msgid "Owner" msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "Propriétaire" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Lecture" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "Taille :" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption msgid "Symlink to:" msgstr "Lien symbolique vers :" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption msgid "Type:" msgstr "Type :" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Ecriture" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Attributs" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "Propriétés" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "&Ajouter" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "Ai&de" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Fermer" #: tfrmfinddlg.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmfinddlg.btnedit.caption" msgid "&Edit" msgstr "Editer" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "&Aller au fichier" #: tfrmfinddlg.btnlastsearch.caption msgctxt "tfrmfinddlg.btnlastsearch.caption" msgid "&Last search" msgstr "" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "&Nouvelle recherche" #: tfrmfinddlg.btnsavetemplate.caption #, fuzzy #| msgid "Save" msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "Enregister" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "&Supprimer" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "&Charger" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "&Enregistrer" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption msgid "Sa&ve with \"Start in directory\"" msgstr "" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "" #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "Dé&marrer" #: tfrmfinddlg.btnstop.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "Annuler" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "&Vue" #: tfrmfinddlg.btnworkwithfound.caption #, fuzzy msgid "Feed to &listbox" msgstr "Flux dans un &onglet" #: tfrmfinddlg.caption #, fuzzy msgctxt "tfrmfinddlg.caption" msgid "Find files" msgstr "Rechercher les fichiers" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "Sensible à la &casse" #: tfrmfinddlg.cbdatefrom.caption #, fuzzy #| msgid "Date From:" msgid "&Date from:" msgstr "Date début :" #: tfrmfinddlg.cbdateto.caption #, fuzzy #| msgid "Date To:" msgid "Dat&e to:" msgstr "Date fin :" #: tfrmfinddlg.cbfilesizefrom.caption #, fuzzy #| msgid "Size from:" msgid "S&ize from:" msgstr "Taille mini :" #: tfrmfinddlg.cbfilesizeto.caption #, fuzzy #| msgid "Size to:" msgid "Si&ze to:" msgstr "Taille maxi :" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "Rechercher le &texte dans les fichiers" #: tfrmfinddlg.cbfollowsymlinks.caption #, fuzzy #| msgid "Follow symlinks" msgctxt "tfrmfinddlg.cbfollowsymlinks.caption" msgid "Follow s&ymlinks" msgstr "Suivre les liens symboliques" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "Rechercher les fichiers &ne contenant PAS le texte" #: tfrmfinddlg.cbnotolderthan.caption #, fuzzy #| msgid "Not older than:" msgid "N&ot older than:" msgstr "Pas plus vieux que :" #: tfrmfinddlg.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name " msgid "Searc&h for part of file name" msgstr "Recherche pour les parties de noms" #: tfrmfinddlg.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "Expressions &régulières" #: tfrmfinddlg.cbreplacetext.caption msgid "Re&place by" msgstr "Rem&placer par" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "" #: tfrmfinddlg.cbtimefrom.caption #, fuzzy #| msgid "Time from:" msgid "&Time from:" msgstr "H. début :" #: tfrmfinddlg.cbtimeto.caption #, fuzzy #| msgid "Time to:" msgid "Ti&me to:" msgstr "H. fin :" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "&Utiliser le plugin \"search\" :" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption msgctxt "tfrmfinddlg.gbdirectories.caption" msgid "Directories" msgstr "" #: tfrmfinddlg.gbfiles.caption msgctxt "tfrmfinddlg.gbfiles.caption" msgid "Files" msgstr "" #: tfrmfinddlg.gbfinddata.caption #, fuzzy msgid "Find Data" msgstr "Chercher les données" #: tfrmfinddlg.lblattributes.caption msgid "Attri&butes" msgstr "" #: tfrmfinddlg.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "Encodage :" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "" #: tfrmfinddlg.lblfindfilemask.caption #, fuzzy msgid "&File mask" msgstr "Masque de &fichiers" #: tfrmfinddlg.lblfindpathstart.caption #, fuzzy #| msgid "&Start in directory" msgid "Start in &directory" msgstr "&Dossier" #: tfrmfinddlg.lblsearchdepth.caption #, fuzzy msgid "Search su&bdirectories:" msgstr "Rechercher dans les sous-dossiers :" #: tfrmfinddlg.lbltemplateheader.caption #, fuzzy msgid "&Previous searches:" msgstr "Recherches &précédentes :" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "Supprimer de la liste" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "Afficher tous les éléments trouvés" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "Afficher dans la visionneuse" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "Avancé" #: tfrmfinddlg.tsloadsave.caption #, fuzzy msgid "Load/Save" msgstr "Charger/Sauvegarder" #: tfrmfinddlg.tsplugins.caption msgctxt "tfrmfinddlg.tsplugins.caption" msgid "Plugins" msgstr "Plugins" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "Résultat" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "Standard" #: tfrmfindview.btnclose.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmfindview.btnfind.caption #, fuzzy #| msgid "Find" msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "Rechercher" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "Rechercher" #: tfrmfindview.cbcasesens.caption #, fuzzy #| msgid "Case sensitive" msgid "C&ase sensitive" msgstr "Sensible à la casse" #: tfrmhardlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmhardlink.caption msgid "Create hard link" msgstr "Créer un lien dur (hardlink)" #: tfrmhardlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Destination sur laquelle le lien va pointer" #: tfrmhardlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Nom du lien" #: tfrmhotdir.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "Ajouter" #: tfrmhotdir.btnaddman.caption #, fuzzy #| msgid "Add manually" msgid "Add &manually" msgstr "Ajouter dossier" #: tfrmhotdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmhotdir.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Supprimer" #: tfrmhotdir.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Editer" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "Dossiers favoris" #: tfrmlinker.btnexit.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmlinker.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "..." #: tfrmlinker.caption #, fuzzy msgctxt "TFRMLINKER.CAPTION" msgid "Linker" msgstr "Concaténeur" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "Enregistrer sous..." #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "Elément" #: tfrmlinker.lblfilename.caption #, fuzzy #| msgid "File name" msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "Nom du fichier" #: tfrmlinker.spbtndel.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "Supprimer" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "Supprimer" #: tfrmlinker.spbtndown.caption #, fuzzy #| msgid "Down" msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "En dessous" #: tfrmlinker.spbtndown.hint #, fuzzy msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "En dessous" #: tfrmlinker.spbtnup.caption #, fuzzy #| msgid "Up" msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "Au dessus" #: tfrmlinker.spbtnup.hint #, fuzzy msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "Au dessus" #: tfrmmain.actabout.caption msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "&A propos" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "Ajouter le nom du fichier dans la ligne de commande" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "Ajouter le chemin complet et le nom du fichier dans la ligne de commande" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "Copier le chemin vers la ligne de commande" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "" #: tfrmmain.actcalculatespace.caption msgid "Calculate &Occupied Space" msgstr "Calcul de l'espace &occupé" #: tfrmmain.actchangedir.caption #, fuzzy msgid "Change directory" msgstr "Changer de dossier" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "Aller au dossier parent" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "Aller au dossier racine" #: tfrmmain.actchecksumcalc.caption msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "Calculer la &somme de contrôle..." #: tfrmmain.actchecksumverify.caption msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "&Vérifier la somme de contrôle..." #: tfrmmain.actclearlogfile.caption #, fuzzy msgid "Clear log file" msgstr "Effacer le fichier journal" #: tfrmmain.actclearlogwindow.caption #, fuzzy msgid "Clear log window" msgstr "Effacer la fenêtre du journal" #: tfrmmain.actclosealltabs.caption #, fuzzy #| msgid "Remove &All Tabs" msgctxt "tfrmmain.actclosealltabs.caption" msgid "Close &All Tabs" msgstr "Fermer &tous les onglets" #: tfrmmain.actclosetab.caption #, fuzzy #| msgid "&Remove Tab" msgctxt "tfrmmain.actclosetab.caption" msgid "&Close Tab" msgstr "&Fermer l'onglet" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "Comparer le contenu" #: tfrmmain.actcomparedirectories.caption msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.CAPTION" msgid "Compare Directories" msgstr "" #: tfrmmain.actcomparedirectories.hint msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.HINT" msgid "Compare Directories" msgstr "" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "Afficher le menu contextuel" #: tfrmmain.actcopy.caption #, fuzzy #| msgid "Copy" msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "Copier" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "Copier les fichiers avec l'&arborescence complète" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "Copier le &nom du(des) fichier(s) dans le presse-papier" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "Copier les fichiers sans demander de confirmation" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "Copier dans le même panneau" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "&Copier" #: tfrmmain.actcountdircontent.caption msgid "Sho&w Occupied Space" msgstr "Afficher l'espace &occupé" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "Co&uper" #: tfrmmain.actdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMMAIN.ACTDELETE.CAPTION" msgid "Delete" msgstr "Supprimer" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "Historique des dossiers" #: tfrmmain.actdirhotlist.caption msgid "Directory &Hotlist" msgstr "Dossiers &favoris" #: tfrmmain.actedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "Editer" #: tfrmmain.acteditcomment.caption msgid "Edit Co&mment..." msgstr "Editer le commentaire" #: tfrmmain.acteditnew.caption #, fuzzy msgid "Edit new file" msgstr "Editer le nouveau fichier" #: tfrmmain.acteditpath.caption #, fuzzy msgid "Edit path field above file list" msgstr "Editer le champ du chemin au dessus de la liste des fichiers" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "&Permuter les panneaux" #: tfrmmain.actexit.caption msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "&Quitter" #: tfrmmain.actextractfiles.caption msgid "&Extract Files..." msgstr "&Extraire les fichiers..." #: tfrmmain.actfileassoc.caption msgid "File &Associations..." msgstr "&Associations de fichiers..." #: tfrmmain.actfilelinker.caption #, fuzzy msgid "Com&bine Files..." msgstr "Conca&téner les fichiers..." #: tfrmmain.actfileproperties.caption msgid "Show &File Properties" msgstr "Afficher les &propriétés des fichiers" #: tfrmmain.actfilespliter.caption msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "&Découper un fichier..." #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "" #: tfrmmain.actgotofirstfile.caption #, fuzzy msgid "Place cursor on first file in list" msgstr "Placer le curseur sur le premier fichier de la liste" #: tfrmmain.actgotolastfile.caption #, fuzzy msgid "Place cursor on last file in list" msgstr "Placer le curseur sur le dernier fichier de la liste" #: tfrmmain.acthardlink.caption msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "Créer un lien d&ur (hardlink)" #: tfrmmain.acthelpindex.caption msgid "&Contents" msgstr "&Index de l'aide" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "Mode &horizontal pour les panneaux" #: tfrmmain.actkeyboard.caption msgid "&Keyboard" msgstr "Raccourcis &clavier" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "Gauche &= Droite" #: tfrmmain.actleftopendrives.caption #, fuzzy msgid "Open left drive list" msgstr "Ouvrir la liste des volumes de gauche" #: tfrmmain.actloadselectionfromclip.caption msgid "Load Selection from Clip&board" msgstr "Charger la sélection depuis le &presse-papier" #: tfrmmain.actloadselectionfromfile.caption msgid "&Load Selection from File..." msgstr "&Charger la sélection depuis un fichier..." #: tfrmmain.actmakedir.caption #, fuzzy #| msgid "MakeDir" msgid "MakeDir" msgstr "Nouveau dossier" #: tfrmmain.actmarkcurrentextension.caption msgid "Select All with the Same E&xtension" msgstr "Sélectionner tous les fichiers avec la même &extension" #: tfrmmain.actmarkinvert.caption msgid "&Invert Selection" msgstr "&Inverser la sélection" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "&Tout sélectionner" #: tfrmmain.actmarkminus.caption msgid "Unselect a Gro&up..." msgstr "Désélectionner un &groupe" #: tfrmmain.actmarkplus.caption msgid "Select a &Group..." msgstr "&Sélectionner un groupe" #: tfrmmain.actmarkunmarkall.caption msgid "&Unselect All" msgstr "Tout &désélectionner" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "Minimiser la fenêtre" #: tfrmmain.actmultirename.caption msgid "Multi &Rename Tool" msgstr "Outil pour &renommer par lot" #: tfrmmain.actnetworkconnect.caption msgid "Network &Connect..." msgstr "&Connexion au réseau" #: tfrmmain.actnetworkdisconnect.caption msgid "Network &Disconnect" msgstr "&Déconnexion du réseau" #: tfrmmain.actnetworkquickconnect.caption msgid "Network &Quick Connect..." msgstr "Connexion &rapide au réseau..." #: tfrmmain.actnewtab.caption msgid "&New Tab" msgstr "&Nouvel onglet" #: tfrmmain.actnexttab.caption msgid "Switch to Nex&t Tab" msgstr "Onglet &suivant" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "Ouvrir" #: tfrmmain.actopenarchive.caption #, fuzzy msgid "Try open archive" msgstr "Tentative d'ouverture de l'archive" #: tfrmmain.actopenbar.caption #, fuzzy msgid "Open bar file" msgstr "Ouvrir la barre des fichiers" #: tfrmmain.actopendirinnewtab.caption msgid "Open &Folder in a New Tab" msgstr "Ouvrir le &dossier dans un nouvel onglet" #: tfrmmain.actopenvirtualfilesystemlist.caption msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "Ouvrir la liste des VFS" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "&Voir les opérations en cours" #: tfrmmain.actoptions.caption msgid "&Options..." msgstr "&Options..." #: tfrmmain.actpackfiles.caption #, fuzzy msgid "&Pack Files..." msgstr "&Créer une archive avec les fichiers..." #: tfrmmain.actpanelssplitterperpos.caption #, fuzzy msgid "Set splitter position" msgstr "Définir la position du \"split\"" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "Co&ller" #: tfrmmain.actprevtab.caption msgid "Switch to &Previous Tab" msgstr "Onglet &précédent" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "Filtre rapide" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "Recherche rapide" #: tfrmmain.actquickview.caption msgid "&Quick View Panel" msgstr "&Panneau de visualisation rapide" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "&Rafraichir" #: tfrmmain.actrename.caption #, fuzzy #| msgid "Move" msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "Déplacer" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "Déplacer/Renommer les fichiers sans demande de confirmation" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "Renommer" #: tfrmmain.actrenametab.caption #, fuzzy #| msgid "Re&name Tab" msgid "&Rename Tab" msgstr "Re&nommer l'onglet" #: tfrmmain.actrestoreselection.caption msgid "&Restore Selection" msgstr "&Restaurer la sélection" #: tfrmmain.actreverseorder.caption msgid "Re&verse Order" msgstr "Inverser l'ordre" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "Droite &= Gauche" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "Ouvrir la liste des volumes/disques de droite" #: tfrmmain.actrunterm.caption msgid "Run &Terminal" msgstr "Ouvrir un &terminal" #: tfrmmain.actsaveselection.caption msgid "Sa&ve Selection" msgstr "Sau&vegarder la sélection" #: tfrmmain.actsaveselectiontofile.caption msgid "Save S&election to File..." msgstr "Sauv&egarder la sélection dans un fichier..." #: tfrmmain.actsearch.caption msgid "&Search..." msgstr "&Chercher..." #: tfrmmain.actsetfileproperties.caption msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "Changer les &attributs..." #: tfrmmain.actsettaboptiondirsinnewtab.caption msgid "Locked with Directories Opened in New &Tabs" msgstr "Verrouillé avec les dossiers ouvert dans des nouveaux &onglets" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "&Normal" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "&Verrouillé" #: tfrmmain.actsettaboptionpathresets.caption msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "Verrouillé avec les changements de &dossiers autorisés" #: tfrmmain.actshellexecute.caption msgctxt "tfrmmain.actshellexecute.caption" msgid "Open" msgstr "Ouvrir" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "Afficher les boutons dans le menu" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "Afficher l'historique des commandes" #: tfrmmain.actshowmainmenu.caption #, fuzzy #| msgid "Menu" msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "Menu" #: tfrmmain.actshowsysfiles.caption msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "Afficher les fichiers &cachés et système" #: tfrmmain.actsortbyattr.caption msgid "Sort by &Attributes" msgstr "Trier par &Attributs" #: tfrmmain.actsortbydate.caption msgid "Sort by &Date" msgstr "Trier par &Date" #: tfrmmain.actsortbyext.caption msgid "Sort by &Extension" msgstr "Trier par &Extension" #: tfrmmain.actsortbyname.caption msgid "Sort by &Name" msgstr "Trier par &Nom" #: tfrmmain.actsortbysize.caption msgid "Sort by &Size" msgstr "Trier par &Taille" #: tfrmmain.actswitchignorelist.caption #, fuzzy msgid "Enable/disable ignore list file to not show file names" msgstr "Activer/désactiver la liste des fichiers/dossiers ignorés" #: tfrmmain.actsymlink.caption msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "Créer un &lien symbolique..." #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "Cible &= Source" #: tfrmmain.acttestarchive.caption #, fuzzy msgid "&Test Archive(s)" msgstr "&Tester une(des) archive(s)" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "" #: tfrmmain.acttransferleft.caption #, fuzzy msgid "Transfer dir under cursor to left window" msgstr "Déplacer le dossier sous le curseur dans le panneau à gauche" #: tfrmmain.acttransferright.caption #, fuzzy msgid "Transfer dir under cursor to right window" msgstr "Déplacer le dossier sous le curseur dans le panneau à droite" #: tfrmmain.actunmarkcurrentextension.caption msgid "Unselect All with the Same Ex&tension" msgstr "Désélectionner tous les fichiers avec la &même extension" #: tfrmmain.actview.caption #, fuzzy #| msgid "View" msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "Voir" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "Afficher l'historique des chemins visités pour la vue active" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "Aller à l'entrée suivante de l'historique" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "Aller à l'entrée précédente de l'historique" #: tfrmmain.actvisithomepage.caption msgid "&Visit Double Commander Website" msgstr "&Visiter le site Web de Double Commander" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "Effacement Sécurisé" #: tfrmmain.btnf10.caption #, fuzzy #| msgid "Exit" msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "Quitter" #: tfrmmain.btnf8.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMMAIN.BTNF8.CAPTION" msgid "Delete" msgstr "Supprimer" #: tfrmmain.btnf9.caption #, fuzzy #| msgid "Terminal" msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "Terminal" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.HINT" msgid "Directory hotlist" msgstr "Liste des dossiers favoris" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "<" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "Afficher le même dossier que celui actif dans le panneau opposé" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnlefthome.hint msgctxt "TFRMMAIN.BTNLEFTHOME.HINT" msgid "Go to home directory" msgstr "Aller au dossier personnel" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgctxt "TFRMMAIN.BTNLEFTROOT.HINT" msgid "Go to root directory" msgstr "Aller au dossier racine" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgctxt "TFRMMAIN.BTNLEFTUP.HINT" msgid "Go to parent directory" msgstr "Aller au dossier parent" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr ">" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "Afficher le même dossier que celui actif dans le panneau opposé" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "tfrmmain.caption" msgid "Double Commander" msgstr "Double Commander" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "Chemin" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "&20/80" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "&30/70" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "&40/60" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "&50/50" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "&60/40" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "&70/30" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "&80/20" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "Annuler" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "Copier..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "Créer un lien..." #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline33.caption msgctxt "tfrmmain.miline33.caption" msgid "-" msgstr "-" #: tfrmmain.miline37.caption msgctxt "TFRMMAIN.MILINE37.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "-" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "Effacer" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "Copier" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "Cacher" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "Tout sélectionner" #: tfrmmain.mimove.caption msgid "Move..." msgstr "Déplacer..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "Créer un lien symbolique" #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "Options des onglets" #: tfrmmain.mitrayiconexit.caption msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "&Quitter" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "Restaurer" #: tfrmmain.mnualloperpause.caption msgctxt "tfrmmain.mnualloperpause.caption" msgid "||" msgstr "||" #: tfrmmain.mnualloperstart.caption msgctxt "tfrmmain.mnualloperstart.caption" msgid "Start" msgstr "Démarrer" #: tfrmmain.mnualloperstop.caption msgctxt "tfrmmain.mnualloperstop.caption" msgid "Cancel" msgstr "Annuler" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "&Commandes" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "Confi&guration" #: tfrmmain.mnufiles.caption msgid "&Files" msgstr "&Fichiers" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "Ai&de" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "&Sélection" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "Réseau" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "&Affichage" #: tfrmmain.mnutaboptions.caption msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "&Options" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "&Onglets" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "CD" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "Copier" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "Couper" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "Supprimer" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "Editer" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "Coller" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmmaskinputdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmmaskinputdlg.btndefinetemplate.caption #, fuzzy #| msgid "Define..." msgid "&Define..." msgstr "Définir..." #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmmaskinputdlg.lblsearchtemplate.caption msgid "O&r select predefined selection type:" msgstr "" #: tfrmmkdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmmkdir.caption msgid "Create new directory" msgstr "Créer un nouveau dossier" #: tfrmmkdir.lblmakedir.caption #, fuzzy #| msgid "Input new directory name:" msgid "&Input new directory name:" msgstr "Nom du nouveau dossier :" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "" #: tfrmmodview.caption msgctxt "TFRMMODVIEW.CAPTION" msgid "New Size" msgstr "Nouvelle Taille" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "Hauteur :" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgctxt "tfrmmodview.lblpath2.caption" msgid "2" msgstr "2" #: tfrmmodview.lblpath3.caption msgctxt "tfrmmodview.lblpath3.caption" msgid "3" msgstr "3" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "4" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "5" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "Qualité de la compression JPEG" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "Largeur :" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "BMP" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "ICO" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "JPG" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "PNG" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "PNM" #: tfrmmodview.teheight.text msgid "Height" msgstr "Hauteur" #: tfrmmodview.tequality.text msgid "80" msgstr "80" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "Largeur" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Fermer" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "&Supprimer" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "&Charger" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "&Renommer" #: tfrmmultirename.btnrestore.caption #, fuzzy #| msgid "Reset all" msgid "Reset &all" msgstr "Réinitialiser" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "&Enregister" #: tfrmmultirename.caption msgctxt "tfrmmultirename.caption" msgid "MultiRename" msgstr "Renommer par lot" #: tfrmmultirename.cblog.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "Activer" #: tfrmmultirename.cbregexp.caption msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "E&xpression régulière" #: tfrmmultirename.cbusesubs.caption #, fuzzy msgid "&Use substitution" msgstr "&Utiliser la substitution" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption msgid "[E] Extension" msgstr "[E] Extension" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "Compteur" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "Chercher && Remplacer" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "Journaliser le résultat" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "Masque" #: tfrmmultirename.gbpresets.caption #, fuzzy msgid "Presets" msgstr "Présélections" #: tfrmmultirename.lbext.caption msgid "&Extension" msgstr "&Extension" #: tfrmmultirename.lbfind.caption msgid "&Find..." msgstr "&Chercher..." #: tfrmmultirename.lbinterval.caption #, fuzzy #| msgid "Interval" msgid "&Interval" msgstr "Intervalle" #: tfrmmultirename.lbname.caption msgid "File &Name" msgstr "&Nom de fichier" #: tfrmmultirename.lbreplace.caption msgid "Re&place..." msgstr "Rem&placer" #: tfrmmultirename.lbstnb.caption #, fuzzy #| msgid "Start Number" msgid "S&tart Number" msgstr "Nombre de départ" #: tfrmmultirename.lbwidth.caption #, fuzzy #| msgid "Width" msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "Largeur" #: tfrmmultirename.micounter.caption msgid "[C] Counter" msgstr "[C] Compteur" #: tfrmmultirename.miday.caption msgid "[D] Day" msgstr "[J] Jour" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "[JJ] Jour (2 digits)" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "[DDD] Jour de la semaine (court, ex : \"lun\")" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "[DDDD] Jour de la semaine (long, ex : \"lundi\")" #: tfrmmultirename.miextensionx.caption msgid "[Ex] Character at position x" msgstr "[Ex] Caractère à la position x" #: tfrmmultirename.miextensionxx.caption msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:y] Caractère de la position x à y" #: tfrmmultirename.mihour.caption msgid "[h] Hour" msgstr "[h] Heure" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "[hh] Heure (2 digits)" #: tfrmmultirename.miminute.caption msgid "[n] Minute" msgstr "[n] Minute" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "[nn] Minute (2 digits)" #: tfrmmultirename.mimonth.caption msgid "[M] Month" msgstr "[M] Mois" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "[MM] Mois (2 digits)" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "[MMM] Nom du mois (court, ex : \"jan\")" #: tfrmmultirename.mimonth3.caption #, fuzzy #| msgid "[MMMM] Month name (long, e.g. \"january\")" msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "[MMMM] Nom du mois (long, ex : \"janvier\")" #: tfrmmultirename.miname.caption msgid "[N] Name" msgstr "[N] Nom" #: tfrmmultirename.minamex.caption msgid "[Nx] Character at position x" msgstr "[Ex] Caractère à la position x" #: tfrmmultirename.minamexx.caption msgid "[Nx:y] Characters from position x to y" msgstr "[Ex:y] Caractère de la position x à y" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "Heure..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "Extension..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "Nom..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "Plugin" #: tfrmmultirename.misecond.caption msgid "[s] Second" msgstr "[s] Seconde" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "[ss] Seconde (2 digits)" #: tfrmmultirename.miyear.caption msgid "[Y] Year (2 digits)" msgstr "[Y] Année (2 digits)" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "[YYYY] Année (4 digits)" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "tfrmmultirename.stringgrid.columns[0].title.caption" msgid "Old File Name" msgstr "Ancien nom du fichier" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "tfrmmultirename.stringgrid.columns[1].title.caption" msgid "New File Name" msgstr "Nouveau nom du fichier" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "tfrmmultirename.stringgrid.columns[2].title.caption" msgid "File Path" msgstr "Chemin du Fichier" #: tfrmopenwith.caption msgid "Choose an application" msgstr "" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "" #: tfrmoptions.btnapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "Appliquer" #: tfrmoptions.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmoptions.caption msgctxt "tfrmoptions.caption" msgid "Options" msgstr "Options" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "" #: tfrmoptionsarchivers.btnautoconfig.caption #, fuzzy #| msgid "Auto Configure" msgctxt "TFRMOPTIONSARCHIVERS.BTNAUTOCONFIG.CAPTION" msgid "A&uto Configure" msgstr "Configuration automatique" #: tfrmoptionsarchivers.btnmultiarcadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCADD.CAPTION" msgid "A&dd" msgstr "Ajouter" #: tfrmoptionsarchivers.btnmultiarcapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCAPPLY.CAPTION" msgid "A&pply" msgstr "Appliquer" #: tfrmoptionsarchivers.btnmultiarcdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCDELETE.CAPTION" msgid "D&elete" msgstr "Supprimer" #: tfrmoptionsarchivers.btnmultiarcrename.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCRENAME.CAPTION" msgid "&Rename" msgstr "Effacer" #: tfrmoptionsarchivers.chkmultiarcdebug.caption #, fuzzy #| msgid "Debug mode" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCDEBUG.CAPTION" msgid "De&bug mode" msgstr "Mode de débbogage" #: tfrmoptionsarchivers.chkmultiarcenabled.caption #, fuzzy #| msgid "Enabled" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCENABLED.CAPTION" msgid "E&nabled" msgstr "Activé" #: tfrmoptionsarchivers.chkmultiarcoutput.caption #, fuzzy #| msgid "Show console output" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCOUTPUT.CAPTION" msgid "S&how console output" msgstr "Afficher la sortie de la console" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "TFRMOPTIONSARCHIVERS.GBARCHIVEROPTIONS.CAPTION" msgid "Options" msgstr "Options" #: tfrmoptionsarchivers.lblarchiveadd.caption #, fuzzy #| msgid "Add:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEADD.CAPTION" msgid "Add&ing:" msgstr "Ajouter :" #: tfrmoptionsarchivers.lblarchiveextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTENSION.CAPTION" msgid "E&xtension:" msgstr "Extension :" #: tfrmoptionsarchivers.lblarchiveextract.caption #, fuzzy #| msgid "Extract:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTRACT.CAPTION" msgid "Ex&tract:" msgstr "Extraire :" #: tfrmoptionsarchivers.lblarchivelist.caption #, fuzzy #| msgid "List:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELIST.CAPTION" msgid "&List:" msgstr "Liste :" #: tfrmoptionsarchivers.lblarchivelistend.caption #, fuzzy #| msgid "Listing finish (optional):" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTEND.CAPTION" msgid "Listing &finish (optional):" msgstr "Fin de liste (optionnel) :" #: tfrmoptionsarchivers.lblarchivelistformat.caption #, fuzzy #| msgid "Listing format:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTFORMAT.CAPTION" msgid "Listing for&mat:" msgstr "Format de liste :" #: tfrmoptionsarchivers.lblarchiveliststart.caption #, fuzzy #| msgid "Listing start (optional):" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTSTART.CAPTION" msgid "Listin&g start (optional):" msgstr "Fin de liste (optionnel) :" #: tfrmoptionsarchivers.lblarchiver.caption #, fuzzy #| msgid "Archiver:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVER.CAPTION" msgid "Arc&hiver:" msgstr "Programme gérant les archives :" #: tfrmoptionsarchivers.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMOPTIONSARCHIVERS.LBLDESCRIPTION.CAPTION" msgid "De&scription:" msgstr "Description :" #: tfrmoptionsarchivers.tbarchiveradditional.caption #, fuzzy msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERADDITIONAL.CAPTION" msgid "Additional" msgstr "Avancé" #: tfrmoptionsarchivers.tbarchivergeneral.caption #, fuzzy msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERGENERAL.CAPTION" msgid "General" msgstr "Général" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHATTRIBUTESCHANGE.CAPTION" msgid "When &size, date or attributes change" msgstr "Quand la &taille, la date ou les attributs changent" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHEXCLUDEDIRS.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "Pour les chemins suivants et leurs sous-dossiers :" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption #, fuzzy #| msgid "When files are &created, deleted or renamed" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHFILENAMECHANGE.CAPTION" msgid "When &files are created, deleted or renamed" msgstr "Quand les fichiers sont &créés, supprimés ou renommés" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHONLYFOREGROUND.CAPTION" msgid "When application is in the &background" msgstr "Quand l'application est en &arrière-plan" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHDISABLE.CAPTION" msgid "Disable auto-refresh" msgstr "Désactiver le rafraichissement automatique" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHENABLE.CAPTION" msgid "Refresh file list" msgstr "Rafraichir la liste des fichiers" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption #, fuzzy #| msgid "Always show tray icon" msgctxt "TFRMOPTIONSBEHAVIOR.CBALWAYSSHOWTRAYICON.CAPTION" msgid "Al&ways show tray icon" msgstr "Toujours afficher l'icône" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption msgid "Automatically &hide unmounted devices" msgstr "" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBMINIMIZETOTRAY.CAPTION" msgid "Mo&ve icon to system tray when minimized" msgstr "Icône dans la zone de notification lorsque la fenêtre est minimisée" #: tfrmoptionsbehavior.cbonlyonce.caption #, fuzzy #| msgid "Allow only one copy of DC at a time" msgctxt "TFRMOPTIONSBEHAVIOR.CBONLYONCE.CAPTION" msgid "A&llow only one copy of DC at a time" msgstr "Autoriser une seule instance de Double Commander à la fois" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "" #: tfrmoptionsbehavior.lbldrivesblacklist.caption msgid "Drives &blacklist" msgstr "" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption #, fuzzy #| msgid "Cut text to column width" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBCUTTEXTTOCOLWIDTH.CAPTION" msgid "Cut &text to column width" msgstr "Couper le texte à la largeur de la colonne" #: tfrmoptionscolumnsview.cbgridhorzline.caption #, fuzzy #| msgid "Horizontal lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDHORZLINE.CAPTION" msgid "&Horizontal lines" msgstr "Lignes horizontales" #: tfrmoptionscolumnsview.cbgridvertline.caption #, fuzzy #| msgid "Vertical lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDVERTLINE.CAPTION" msgid "&Vertical lines" msgstr "Ligne verticales" #: tfrmoptionscolumnsview.chkautofillcolumns.caption #, fuzzy #| msgid "Auto fill columns" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CHKAUTOFILLCOLUMNS.CAPTION" msgid "A&uto fill columns" msgstr "Remplissage automatique des colonnes" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "" #: tfrmoptionscolumnsview.lblautosizecolumn.caption #, fuzzy #| msgid "Auto size column:" msgctxt "TFRMOPTIONSCOLUMNSVIEW.LBLAUTOSIZECOLUMN.CAPTION" msgid "Auto si&ze column:" msgstr "Largeur des colonnes automatique :" #: tfrmoptionsconfiguration.btnconfigapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGAPPLY.CAPTION" msgid "A&pply" msgstr "Appliquer" #: tfrmoptionsconfiguration.btnconfigedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGEDIT.CAPTION" msgid "&Edit" msgstr "Editer" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption #, fuzzy #| msgid "Command line history" msgctxt "TFRMOPTIONSCONFIGURATION.CBCMDLINEHISTORY.CAPTION" msgid "Co&mmand line history" msgstr "Historique des commandes" #: tfrmoptionsconfiguration.cbdirhistory.caption #, fuzzy #| msgid "Directory history" msgctxt "TFRMOPTIONSCONFIGURATION.CBDIRHISTORY.CAPTION" msgid "&Directory history" msgstr "Historique des dossiers" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption #, fuzzy #| msgid "File mask history" msgctxt "TFRMOPTIONSCONFIGURATION.CBFILEMASKHISTORY.CAPTION" msgid "&File mask history" msgstr "Historique des masques de fichier" #: tfrmoptionsconfiguration.chksaveconfiguration.caption #, fuzzy #| msgid "Save configuration" msgctxt "TFRMOPTIONSCONFIGURATION.CHKSAVECONFIGURATION.CAPTION" msgid "Sa&ve configuration" msgstr "Enregistrer la configuration" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption #, fuzzy #| msgid "Search/Replace history" msgctxt "TFRMOPTIONSCONFIGURATION.CHKSEARCHREPLACEHISTORY.CAPTION" msgid "Searc&h/Replace history" msgstr "Historique des Recherches/Remplacements" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBLOCCONFIGFILES.CAPTION" msgid "Location of configuration files" msgstr "Emplacement des fichiers de configuration" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBSAVEONEXIT.CAPTION" msgid "Save on exit" msgstr "Sauvegarder en quittant" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgctxt "TFRMOPTIONSCONFIGURATION.LBLCMDLINECONFIGDIR.CAPTION" msgid "Set on command line" msgstr "" #: tfrmoptionsconfiguration.rbprogramdir.caption #, fuzzy #| msgid "Program directory (portable version)" msgctxt "TFRMOPTIONSCONFIGURATION.RBPROGRAMDIR.CAPTION" msgid "P&rogram directory (portable version)" msgstr "Dossier du programme (version portable)" #: tfrmoptionsconfiguration.rbuserhomedir.caption #, fuzzy #| msgid "User home directory" msgctxt "TFRMOPTIONSCONFIGURATION.RBUSERHOMEDIR.CAPTION" msgid "&User home directory" msgstr "Répertoire personnel de l'utilisateur" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption #, fuzzy #| msgid "Copy" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNCOPYCOLUMNSSET.CAPTION" msgid "C&opy" msgstr "Copier" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNDELCOLUMNSSET.CAPTION" msgid "&Delete" msgstr "Supprimer" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNEDITCOLUMNSSET.CAPTION" msgid "&Edit" msgstr "Editer" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNNEWCOLUMNSSET.CAPTION" msgid "&New" msgstr "&Nouveau" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.CBBFILESYSTEM.TEXT" msgid "General" msgstr "Général" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption #, fuzzy #| msgid "Configure columns for file system:" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.LBLCONFIGCOLUMNS.CAPTION" msgid "Con&figure columns for file system:" msgstr "Configurer les colonnes pour l'affichage des dossiers/fichiers" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption msgid "&Show confirmation dialog after drop" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption msgid "Show &file system" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption msgid "Show fr&ee space" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption msgid "Show &label" msgstr "" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "" #: tfrmoptionseditorcolors.backgroundlabel.caption msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "" #: tfrmoptionseditorcolors.foregroundlabel.caption msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption msgid "&Text-mark" msgstr "" #: tfrmoptionseditorcolors.tbtnglobal.caption msgid "Use (and edit) &global scheme settings" msgstr "" #: tfrmoptionseditorcolors.tbtnlocal.caption msgid "Use &local scheme settings" msgstr "" #: tfrmoptionseditorcolors.textboldcheckbox.caption msgid "&Bold" msgstr "" #: tfrmoptionseditorcolors.textboldradioinvert.caption msgctxt "tfrmoptionseditorcolors.textboldradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textboldradiooff.caption msgctxt "tfrmoptionseditorcolors.textboldradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textboldradioon.caption msgctxt "tfrmoptionseditorcolors.textboldradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textitaliccheckbox.caption msgid "&Italic" msgstr "" #: tfrmoptionseditorcolors.textitalicradioinvert.caption msgctxt "tfrmoptionseditorcolors.textitalicradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textitalicradiooff.caption msgctxt "tfrmoptionseditorcolors.textitalicradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textitalicradioon.caption msgctxt "tfrmoptionseditorcolors.textitalicradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption msgid "&Strike Out" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption msgid "&Underline" msgstr "" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textunderlineradiooff.caption msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textunderlineradioon.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "" #: tfrmoptionsfileoperations.cbdeletetotrash.caption #, fuzzy #| msgid "Delete to recycle bin (Shift key reverses this setting)" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDELETETOTRASH.CAPTION" msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "Utiliser la corbeille lors des suppressions. (L'utilisation des touches Maj+Del permet la suppression sans passer par la corbeille.)" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDROPREADONLYFLAG.CAPTION" msgid "D&rop readonly flag" msgstr "Ne pas tenir compte du marqueur \"lecture seule\"" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPARTIALNAMESEARCH.CAPTION" msgid "&Search for part of file name" msgstr "Recherche pour les parties de noms" #: tfrmoptionsfileoperations.cbprocesscomments.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPROCESSCOMMENTS.CAPTION" msgid "&Process comments with files/folders" msgstr "" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption #, fuzzy #| msgid "Select file name without extension when renaming" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBRENAMESELONLYNAME.CAPTION" msgid "Select &file name without extension when renaming" msgstr "Sélectionnez uniquement le nom du fichier lors du renommage (pas l'extension)" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption #, fuzzy #| msgid "Show tab select panel in copy/move dialog" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSHOWCOPYTABSELECTPANEL.CAPTION" msgid "Sho&w tab select panel in copy/move dialog" msgstr "Afficher l'onglet sélectionné dans la boite de dialogue des copies/déplacement" #: tfrmoptionsfileoperations.cbskipfileoperror.caption #, fuzzy #| msgid "Skip file operations errors and write them to log window" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSKIPFILEOPERROR.CAPTION" msgid "S&kip file operations errors and write them to log window" msgstr "Continuer en cas d'erreurs lors des opérations et les afficher dans la fenêtre du journal" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.GBFILESEARCH.CAPTION" msgid "File search" msgstr "Recherche de fichiers" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "" #: tfrmoptionsfileoperations.lblbuffersize.caption msgid "&Buffer size for file operations (in KB):" msgstr "" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "" #: tfrmoptionsfileoperations.lblprogresskind.caption msgid "Show operations progress &initially in" msgstr "" #: tfrmoptionsfileoperations.lblwipepassnumber.caption msgid "&Number of wipe passes:" msgstr "" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption #, fuzzy #| msgid "Use memory mapping for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSEMMAPINSEARCH.CAPTION" msgid "Use memory mapping for search te&xt in files" msgstr "Utiliser la mémoire pour les recherches dans les fichiers texte" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption #, fuzzy #| msgid "Use stream for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSESTREAMINSEARCH.CAPTION" msgid "&Use stream for search text in files" msgstr "Utiliser un flux pour les recherches dans les fichiers texte" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption #, fuzzy #| msgid "Use Frame Cursor" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEFRAMECURSOR.CAPTION" msgid "Use &Frame Cursor" msgstr "Utiliser un cadre seul pour le curseur" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption msgid "Use &Gradient Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption #, fuzzy #| msgid "Use Inverted Selection" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEINVERTEDSELECTION.CAPTION" msgid "U&se Inverted Selection" msgstr "Utiliser la sélection inverse" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.DBFREESPACEINDICATOR.CAPTION" msgid "Drive Free Space Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.GBEXAMPLE.CAPTION" msgid "Example" msgstr "Exemple" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption msgid "Bac&kground:" msgstr "" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption #, fuzzy #| msgid "Background 2:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR2.CAPTION" msgid "Backg&round 2:" msgstr "Arrière-plan 2 :" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption #, fuzzy #| msgid "Cursor Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORCOLOR.CAPTION" msgid "C&ursor Color:" msgstr "Couleur du curseur :" #: tfrmoptionsfilepanelscolors.lblcursortext.caption #, fuzzy #| msgid "Cursor Text:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORTEXT.CAPTION" msgid "Cursor Te&xt:" msgstr "Caractère du curseur :" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption #, fuzzy #| msgid "Brightness level of inactive panel" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLINACTIVEPANELBRIGHTNESS.CAPTION" msgid "&Brightness level of inactive panel" msgstr "Niveau de luminosité du panneau inactif" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption msgid "In&dicator Back Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblindcolor.caption msgid "&Indicator Fore Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption #, fuzzy #| msgid "Mark Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLMARKCOLOR.CAPTION" msgid "&Mark Color:" msgstr "Couleur de la marque :" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption #, fuzzy #| msgid "Text Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLTEXTCOLOR.CAPTION" msgid "T&ext Color:" msgstr "Couleur du Texte :" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption msgid "Do&n't load file list until a tab is activated" msgstr "" #: tfrmoptionsfilesviews.cbdirbrackets.caption #, fuzzy #| msgid "Show square brackets around directories" msgctxt "TFRMOPTIONSFILESVIEWS.CBDIRBRACKETS.CAPTION" msgid "S&how square brackets around directories" msgstr "Mettre les noms des dossiers entre crochets" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption msgid "Hi&ghlight new and updated files" msgstr "" #: tfrmoptionsfilesviews.cblistfilesinthread.caption #, fuzzy #| msgid "Load file list in separate thread" msgctxt "TFRMOPTIONSFILESVIEWS.CBLISTFILESINTHREAD.CAPTION" msgid "Load &file list in separate thread" msgstr "Charger la liste des fichiers dans un \"tread\" séparé" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption #, fuzzy #| msgid "Load icons after file list" msgctxt "TFRMOPTIONSFILESVIEWS.CBLOADICONSSEPARATELY.CAPTION" msgid "Load icons af&ter file list" msgstr "Charger les icônes après la liste des fichiers" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption #, fuzzy #| msgid "Show system and hidden files" msgctxt "TFRMOPTIONSFILESVIEWS.CBSHOWSYSTEMFILES.CAPTION" msgid "Show s&ystem and hidden files" msgstr "Afficher les fichiers cachés et système" #: tfrmoptionsfilesviews.cbspacemovesdown.caption #, fuzzy #| msgid "When selecting files with , move down to next file (as with )" msgctxt "TFRMOPTIONSFILESVIEWS.CBSPACEMOVESDOWN.CAPTION" msgid "&When selecting files with , move down to next file (as with )" msgstr "Lors de la sélections des fichiers avec [la barre d'espace], se déplacer sur le fichier suivant vers le bas (comme avec )" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "" #: tfrmoptionsfilesviews.gbsorting.caption msgctxt "TFRMOPTIONSFILESVIEWS.GBSORTING.CAPTION" msgid "Sorting" msgstr "Tri" #: tfrmoptionsfilesviews.lblcasesensitivity.caption msgid "Case s&ensitivity:" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeformat.caption #, fuzzy #| msgid "Date and time format:" msgctxt "TFRMOPTIONSFILESVIEWS.LBLDATETIMEFORMAT.CAPTION" msgid "&Date and time format:" msgstr "Format des dates et heures :" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "" #: tfrmoptionsfilesviews.lblnewfilesposition.caption msgid "&Insert new files" msgstr "" #: tfrmoptionsfilesviews.lblsortfoldermode.caption msgid "So&rting directories:" msgstr "" #: tfrmoptionsfilesviews.lblsortmethod.caption #, fuzzy #| msgid "Sort &method:" msgctxt "TFRMOPTIONSFILESVIEWS.LBLSORTMETHOD.CAPTION" msgid "&Sort method:" msgstr "Méthode de tri :" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption msgid "&Move updated files" msgstr "" #: tfrmoptionsfiletypescolors.btnaddcategory.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNADDCATEGORY.CAPTION" msgid "A&dd" msgstr "Ajouter" #: tfrmoptionsfiletypescolors.btnapplycategory.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNAPPLYCATEGORY.CAPTION" msgid "A&pply" msgstr "Appliquer" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNCATEGORYCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNDELETECATEGORY.CAPTION" msgid "D&elete" msgstr "Supprimer" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Modèle..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption msgid "File types colors (sort by drag&&drop)" msgstr "" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption #, fuzzy #| msgid "Category attributes:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYATTR.CAPTION" msgid "Category a&ttributes:" msgstr "Attributs de catégorie :" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption #, fuzzy #| msgid "Category color:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYCOLOR.CAPTION" msgid "Category co&lor:" msgstr "Couleur de catégorie :" #: tfrmoptionsfiletypescolors.lblcategorymask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYMASK.CAPTION" msgid "Category &mask:" msgstr "Masque de catégorie :" #: tfrmoptionsfiletypescolors.lblcategoryname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYNAME.CAPTION" msgid "Category &name:" msgstr "Nom de catégorie :" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELEDITFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELLOGFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELMAINFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWERBOOKFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.lbleditorfont.caption #, fuzzy #| msgid "Editor font" msgctxt "TFRMOPTIONSFONTS.LBLEDITORFONT.CAPTION" msgid "&Editor font" msgstr "Police de l'éditeur" #: tfrmoptionsfonts.lbllogfont.caption #, fuzzy #| msgid "Log font" msgctxt "TFRMOPTIONSFONTS.LBLLOGFONT.CAPTION" msgid "&Log font" msgstr "Police du journal" #: tfrmoptionsfonts.lblmainfont.caption #, fuzzy #| msgid "Main font" msgctxt "TFRMOPTIONSFONTS.LBLMAINFONT.CAPTION" msgid "Main &font" msgstr "Police principale" #: tfrmoptionsfonts.lblviewerbookfont.caption #, fuzzy #| msgid "Viewer Book Font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERBOOKFONT.CAPTION" msgid "Viewer&Book Font" msgstr "Police pour la visionneuse en mode \"Book\"" #: tfrmoptionsfonts.lblviewerfont.caption #, fuzzy #| msgid "Viewer font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERFONT.CAPTION" msgid "&Viewer font" msgstr "Police du lecteur de fichiers" #: tfrmoptionshotkeys.btnaddhotkey.caption msgid "Add &hotkey" msgstr "" #: tfrmoptionshotkeys.btndeletehotkey.caption msgid "&Delete hotkey" msgstr "" #: tfrmoptionshotkeys.btnedithotkey.caption msgctxt "tfrmoptionshotkeys.btnedithotkey.caption" msgid "&Edit hotkey" msgstr "" #: tfrmoptionshotkeys.lbfilter.caption #, fuzzy #| msgid "Filter" msgctxt "TFRMOPTIONSHOTKEYS.LBFILTER.CAPTION" msgid "&Filter" msgstr "Filtres" #: tfrmoptionshotkeys.lblcategories.caption #, fuzzy #| msgid "Categories:" msgctxt "tfrmoptionshotkeys.lblcategories.caption" msgid "C&ategories:" msgstr "Catégories :" #: tfrmoptionshotkeys.lblcommands.caption #, fuzzy #| msgid "Commands:" msgctxt "tfrmoptionshotkeys.lblcommands.caption" msgid "Co&mmands:" msgstr "Commandes :" #: tfrmoptionshotkeys.lblscfiles.caption #, fuzzy #| msgid "Shortcut files:" msgctxt "TFRMOPTIONSHOTKEYS.LBLSCFILES.CAPTION" msgid "&Shortcut files:" msgstr "Fichier des raccourcis clavier :" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption #, fuzzy msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[0].TITLE.CAPTION" msgid "Hotkey" msgstr "Raccourcis" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[1].TITLE.CAPTION" msgid "Parameters" msgstr "Paramètres" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption msgid "Controls" msgstr "" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "Pour les chemins suivants et leurs sous-dossiers :" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "tfrmoptionsicons.cbiconsinmenussize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption #, fuzzy #| msgid "Show overlay i&cons, e.g. for links" msgctxt "TFRMOPTIONSICONS.CBICONSSHOWOVERLAY.CAPTION" msgid "Show o&verlay icons, e.g. for links" msgstr "Afficher les icônes \"overlay\", par exemple pour les liens" #: tfrmoptionsicons.cbiconssize.text msgctxt "TFRMOPTIONSICONS.CBICONSSIZE.TEXT" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "" #: tfrmoptionsicons.gbiconssize.caption #, fuzzy #| msgid " Icon &size " msgctxt "TFRMOPTIONSICONS.GBICONSSIZE.CAPTION" msgid " Icon size " msgstr " &Taille des icônes " #: tfrmoptionsicons.gbshowiconsmode.caption #, fuzzy msgctxt "TFRMOPTIONSICONS.GBSHOWICONSMODE.CAPTION" msgid " Show icons to the left of the filename " msgstr "Monter les icônes à gauche des noms de fichier" #: tfrmoptionsicons.rbiconsshowall.caption #, fuzzy #| msgid "&All" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALL.CAPTION" msgid "A&ll" msgstr "&Toutes" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALLANDEXE.CAPTION" msgid "All associated + &EXE/LNK (slow)" msgstr "Toutes les associations existantes + &EXE/LNK (lent)" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWNONE.CAPTION" msgid "&No icons" msgstr "&Pas d'icônes" #: tfrmoptionsicons.rbiconsshowstandard.caption #, fuzzy #| msgid "&Only standard icons" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWSTANDARD.CAPTION" msgid "Only &standard icons" msgstr "&Seulement les icônes standard" #: tfrmoptionsignorelist.btnaddsel.caption #, fuzzy #| msgid "&Add selected names" msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSEL.CAPTION" msgid "A&dd selected names" msgstr "&Ajouter les noms sélectionnés" #: tfrmoptionsignorelist.btnaddselwithpath.caption #, fuzzy msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSELWITHPATH.CAPTION" msgid "Add selected names with &full path" msgstr "Ajouter les noms sélectionnés avec le chemin &complet" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "TFRMOPTIONSIGNORELIST.CHKIGNOREENABLE.CAPTION" msgid "&Ignore (don't show) the following files and folders:" msgstr "&Ignorer (ne pas montrer) les fichiers et dossiers suivant :" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "TFRMOPTIONSIGNORELIST.LBLSAVEIN.CAPTION" msgid "&Save in:" msgstr "&Enregistrer dans :" #: tfrmoptionskeyboard.cblynxlike.caption msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "" #: tfrmoptionskeyboard.lblalt.caption #, fuzzy #| msgid "Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLALT.CAPTION" msgid "Alt+L&etters" msgstr "Alt+Lettres" #: tfrmoptionskeyboard.lblctrlalt.caption #, fuzzy #| msgid "Ctrl+Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLCTRLALT.CAPTION" msgid "Ctrl+Alt+Le&tters" msgstr "Ctrl+Alt+Lettres" #: tfrmoptionskeyboard.lblnomodifier.caption msgid "&Letters" msgstr "" #: tfrmoptionslayout.cbflatdiskpanel.caption #, fuzzy #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATDISKPANEL.CAPTION" msgid "&Flat buttons" msgstr "Boutons plats" #: tfrmoptionslayout.cbflatinterface.caption #, fuzzy #| msgid "Flat interface" msgctxt "TFRMOPTIONSLAYOUT.CBFLATINTERFACE.CAPTION" msgid "Flat i&nterface" msgstr "Interface simple" #: tfrmoptionslayout.cbflattoolbar.caption #, fuzzy #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATTOOLBAR.CAPTION" msgid "Flat b&uttons" msgstr "Boutons plats" #: tfrmoptionslayout.cbfreespaceind.caption #, fuzzy #| msgid "Show free space indicator on drive label" msgctxt "TFRMOPTIONSLAYOUT.CBFREESPACEIND.CAPTION" msgid "Show fr&ee space indicator on drive label" msgstr "Afficher l'espace disponible sur l'étiquette des volumes/disques" #: tfrmoptionslayout.cblogwindow.caption #, fuzzy #| msgid "Show log window" msgctxt "TFRMOPTIONSLAYOUT.CBLOGWINDOW.CAPTION" msgid "Show lo&g window" msgstr "Afficher la fenêtre du journal" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "TFRMOPTIONSLAYOUT.CBPANELOFOPERATIONS.CAPTION" msgid "Show panel of operation in background" msgstr "Afficher les opérations dans les panneaux en arrière-plan" #: tfrmoptionslayout.cbproginmenubar.caption #, fuzzy msgctxt "TFRMOPTIONSLAYOUT.CBPROGINMENUBAR.CAPTION" msgid "Show common progress in menu bar" msgstr "Afficher la barre de progression dans le menu" #: tfrmoptionslayout.cbshowcmdline.caption #, fuzzy #| msgid "Show command &line" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCMDLINE.CAPTION" msgid "Show command l&ine" msgstr "Afficher la ligne de commande" #: tfrmoptionslayout.cbshowcurdir.caption #, fuzzy #| msgid "Show ¤t directory" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCURDIR.CAPTION" msgid "Show current director&y" msgstr "Afficher le répertoire (dossier) courant" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDISKPANEL.CAPTION" msgid "Show &drive buttons" msgstr "Afficher les boutons des volumes/disques" #: tfrmoptionslayout.cbshowdrivefreespace.caption #, fuzzy #| msgid "Show free space label" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDRIVEFREESPACE.CAPTION" msgid "Show free s&pace label" msgstr "Afficher l'étiquette avec l'espace libre" #: tfrmoptionslayout.cbshowdriveslistbutton.caption msgid "Show drives list bu&tton" msgstr "" #: tfrmoptionslayout.cbshowkeyspanel.caption #, fuzzy #| msgid "Show &function key buttons" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWKEYSPANEL.CAPTION" msgid "Show function &key buttons" msgstr "Afficher les boutons des touches de &fonction (F3 à F10)" #: tfrmoptionslayout.cbshowmainmenu.caption #, fuzzy #| msgid "Show main menu" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINMENU.CAPTION" msgid "Show &main menu" msgstr "Afficher le menu principal" #: tfrmoptionslayout.cbshowmaintoolbar.caption #, fuzzy msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINTOOLBAR.CAPTION" msgid "Show &button bar" msgstr "Afficher la barre avec les boutons" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption msgid "Show short free space &label" msgstr "" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWSTATUSBAR.CAPTION" msgid "Show &status bar" msgstr "Afficher la barre de statut" #: tfrmoptionslayout.cbshowtabheader.caption #, fuzzy #| msgid "Show &tabstop header" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABHEADER.CAPTION" msgid "S&how tabstop header" msgstr "Afficher la ligne de titre dans les onglets" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABS.CAPTION" msgid "Sho&w folder tabs" msgstr "Afficher les &onglets de dossiers" #: tfrmoptionslayout.cbtermwindow.caption #, fuzzy #| msgid "Show terminal window" msgctxt "TFRMOPTIONSLAYOUT.CBTERMWINDOW.CAPTION" msgid "Show te&rminal window" msgstr "Afficher la fenêtre de terminal" #: tfrmoptionslayout.cbtwodiskpanels.caption #, fuzzy #| msgid "Show two drive button bars (fixed width, above file windows)" msgctxt "TFRMOPTIONSLAYOUT.CBTWODISKPANELS.CAPTION" msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "Afficher deux barres de boutons avec les volumes/disques (largeur fixe, au dessus de la fenêtre des fichiers)" #: tfrmoptionslayout.gbscreenlayout.caption #, fuzzy msgctxt "TFRMOPTIONSLAYOUT.GBSCREENLAYOUT.CAPTION" msgid " Screen layout " msgstr "Apparence de l'écran" #: tfrmoptionslog.cblogarcop.caption #, fuzzy #| msgid "Pack/Unpack" msgctxt "TFRMOPTIONSLOG.CBLOGARCOP.CAPTION" msgid "&Pack/Unpack" msgstr "Archivage/extraction des données des archives compressées" #: tfrmoptionslog.cblogcpmvln.caption #, fuzzy #| msgid "Copy/Move/Create link/symlink" msgctxt "TFRMOPTIONSLOG.CBLOGCPMVLN.CAPTION" msgid "Cop&y/Move/Create link/symlink" msgstr "Copie/Déplacement de fichier - Création de liens durs/symboliques" #: tfrmoptionslog.cblogdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSLOG.CBLOGDELETE.CAPTION" msgid "&Delete" msgstr "Supprimer" #: tfrmoptionslog.cblogdirop.caption #, fuzzy #| msgid "Create/Delete directories" msgctxt "TFRMOPTIONSLOG.CBLOGDIROP.CAPTION" msgid "Crea&te/Delete directories" msgstr "Créations/Suppressions des dossiers" #: tfrmoptionslog.cblogerrors.caption msgctxt "TFRMOPTIONSLOG.CBLOGERRORS.CAPTION" msgid "Log &errors" msgstr "Journaliser les erreurs" #: tfrmoptionslog.cblogfile.caption #, fuzzy #| msgid "&Create a log file:" msgctxt "TFRMOPTIONSLOG.CBLOGFILE.CAPTION" msgid "C&reate a log file:" msgstr "&Créer un fichier journal :" #: tfrmoptionslog.cbloginfo.caption #, fuzzy #| msgid "Log information messages" msgctxt "TFRMOPTIONSLOG.CBLOGINFO.CAPTION" msgid "Log &information messages" msgstr "Journaliser les messages d'information" #: tfrmoptionslog.cblogsuccess.caption msgctxt "TFRMOPTIONSLOG.CBLOGSUCCESS.CAPTION" msgid "Log &successful operations" msgstr "Journaliser les opérations &réussies" #: tfrmoptionslog.cblogvfs.caption #, fuzzy #| msgid "File system plugins" msgctxt "TFRMOPTIONSLOG.CBLOGVFS.CAPTION" msgid "&File system plugins" msgstr "Plugins \"File system\"" #: tfrmoptionslog.gblogfile.caption msgctxt "TFRMOPTIONSLOG.GBLOGFILE.CAPTION" msgid "File operation log file" msgstr "Emplacement du fichier journal" #: tfrmoptionslog.gblogfileop.caption msgid "Log operations" msgstr "" #: tfrmoptionslog.gblogfilestatus.caption msgid "Operation status" msgstr "" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "" #: tfrmoptionsmisc.chkshowwarningmessages.caption #, fuzzy #| msgid "Show warning messages (\"OK\" button only)" msgctxt "tfrmoptionsmisc.chkshowwarningmessages.caption" msgid "Show &warning messages (\"OK\" button only)" msgstr "Montrer les messages d'avertissement (seulement le bouton \"OK\")" #: tfrmoptionsmisc.chkthumbsave.caption msgctxt "tfrmoptionsmisc.chkthumbsave.caption" msgid "&Save thumbnails in cache" msgstr "" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "tfrmoptionsmisc.dblthumbnails.caption" msgid "Thumbnails" msgstr "" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "tfrmoptionsmisc.lblthumbseparator.caption" msgid "X" msgstr "X" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "" #: tfrmoptionsmouse.cbselectionbymouse.caption #, fuzzy #| msgid "Selection by mouse" msgctxt "TFRMOPTIONSMOUSE.CBSELECTIONBYMOUSE.CAPTION" msgid "&Selection by mouse" msgstr "Sélection à la souris" #: tfrmoptionsmouse.gbscrolling.caption #, fuzzy msgctxt "TFRMOPTIONSMOUSE.GBSCROLLING.CAPTION" msgid "Scrolling" msgstr "Défilement" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "" #: tfrmoptionsmouse.lblmousemode.caption #, fuzzy #| msgid "Mode:" msgctxt "TFRMOPTIONSMOUSE.LBLMOUSEMODE.CAPTION" msgid "&Mode:" msgstr "Mode :" #: tfrmoptionsmouse.rbscrolllinebyline.caption #, fuzzy #| msgid "Line by line" msgctxt "TFRMOPTIONSMOUSE.RBSCROLLLINEBYLINE.CAPTION" msgid "&Line by line" msgstr "Ligne par ligne" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption #, fuzzy #| msgid "Line by line with cursor movement" msgctxt "TFRMOPTIONSMOUSE.RBSCROLLLINEBYLINECURSOR.CAPTION" msgid "Line by line &with cursor movement" msgstr "Ligne par ligne avec les mouvements du curseur" #: tfrmoptionsmouse.rbscrollpagebypage.caption #, fuzzy #| msgid "Page by page" msgctxt "TFRMOPTIONSMOUSE.RBSCROLLPAGEBYPAGE.CAPTION" msgid "&Page by page" msgstr "Page par page" #: tfrmoptionsplugins.btnaddplugin.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "Ajouter" #: tfrmoptionsplugins.btnconfigplugin.caption #, fuzzy #| msgid "Configure" msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "Configurer" #: tfrmoptionsplugins.btnenableplugin.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "Activer" #: tfrmoptionsplugins.btnremoveplugin.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "Supprimer" #: tfrmoptionsplugins.btntweakplugin.caption msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "" #: tfrmoptionsplugins.lbldsxdescription.caption #, fuzzy #| msgid "Search plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "Les \"Search\" plugins permettent d'utiliser des algorithme de recherche alternatifs ou des outils externes (comme \"locate\", etc)." #: tfrmoptionsplugins.lblwcxdescription.caption #, fuzzy #| msgid "Packer plugins are used to work with archives." msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "Les \"Packer plugins\" sont utilisés pour travailler avec les archives compressées." #: tfrmoptionsplugins.lblwdxdescription.caption #, fuzzy #| msgid "Content plugins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "Les \"Content\" plugins permettent d'afficher la liste des métadonnées des fichiers comme les tags mp3 ou les attributs des images. Ils permettent aussi d'utiliser ces métadonnées dans les recherches ou l'outil de renommage en lots." #: tfrmoptionsplugins.lblwfxdescription.caption #, fuzzy #| msgid "File system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "Les plugins \"File system\" permettent d'accéder à des systèmes de fichiers qui ne sont pas pris en charge par le système d'exploitation ou sur des périphériques externes comme les Palm et PocketPC." #: tfrmoptionsplugins.lblwlxdescription.caption #, fuzzy #| msgid "Viewer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "Les \"Viewer plugins\" permettent d'afficher différents formats de fichiers comme les images, les tableurs, les bases de données, etc, dans une visionneuse intégrée. (F3, Ctrl+Q)" #: tfrmoptionsplugins.stgplugins.columns[0].title.caption #, fuzzy msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[0].TITLE.CAPTION" msgid "Active" msgstr "Actif" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[1].TITLE.CAPTION" msgid "Plugin" msgstr "Plugin" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption #, fuzzy msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[2].TITLE.CAPTION" msgid "Registered for" msgstr "Enregistré pour" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[3].TITLE.CAPTION" msgid "File name" msgstr "Nom du fichier" #: tfrmoptionsplugins.tsdsx.caption #, fuzzy #| msgid "Search plugins (.DSX)" msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "Search plugins (.DSX)" #: tfrmoptionsplugins.tswcx.caption #, fuzzy #| msgid "Packer plugins (.WCX)" msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "Packer plugins (.WCX)" #: tfrmoptionsplugins.tswdx.caption #, fuzzy #| msgid "Content plugins (.WDX)" msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "Content plugins (.WDX)" #: tfrmoptionsplugins.tswfx.caption #, fuzzy #| msgid "File system plugins (.WFX)" msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "File system plugins (.WFX)" #: tfrmoptionsplugins.tswlx.caption #, fuzzy #| msgid "Viewer plugins (.WLX)" msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "Viewer plugins (.WLX)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTBEGINNING.CAPTION" msgid "&Beginning (name must start with first typed character)" msgstr "&Commence par (le nom doit commencer par les caractères tapés)" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTENDING.CAPTION" msgid "En&ding (last character before a typed dot . must match)" msgstr "Se &termine par (les derniers caractères avant le . de l'extension doivent correspondre)" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CGPOPTIONS.CAPTION" msgid "Options" msgstr "Options" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption msgid "Exact name match" msgstr "" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "" #: tfrmoptionstabs.cbtabsactivateonclick.caption #, fuzzy msgctxt "TFRMOPTIONSTABS.CBTABSACTIVATEONCLICK.CAPTION" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "Activer le panneau cible lors d'un clic sur un de ses onglets" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "TFRMOPTIONSTABS.CBTABSALWAYSVISIBLE.CAPTION" msgid "&Show tab header also when there is only one tab" msgstr "Montrer les entêtes des onglets même s'il n'y a qu'un &seul onglet" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption #, fuzzy #| msgid "&Confirm close all tabs" msgctxt "TFRMOPTIONSTABS.CBTABSCONFIRMCLOSEALL.CAPTION" msgid "Con&firm close all tabs" msgstr "&Confirmation pour la fermeture de tous les onglets" #: tfrmoptionstabs.cbtabslimitoption.caption msgid "&Limit tab title length to" msgstr "" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "TFRMOPTIONSTABS.CBTABSLOCKEDASTERISK.CAPTION" msgid "Show locked tabs &with an asterisk *" msgstr "Afficher les onglets verrouillés avec un astérisque *" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "TFRMOPTIONSTABS.CBTABSMULTILINES.CAPTION" msgid "&Tabs on multiple lines" msgstr "Disposer les &onglets sur plusieurs lignes" #: tfrmoptionstabs.cbtabsopenforeground.caption #, fuzzy msgctxt "TFRMOPTIONSTABS.CBTABSOPENFOREGROUND.CAPTION" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Ctrl+&FlècheHaut ouvre un nouvel onglet à l'arrière-plan" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENNEARCURRENT.CAPTION" msgid "Open &new tabs near current tab" msgstr "Ouvrir les nouveaux onglets à côté de l'onglet courant" #: tfrmoptionstabs.cbtabsshowclosebutton.caption #, fuzzy #| msgid "Show tab close button" msgctxt "TFRMOPTIONSTABS.CBTABSSHOWCLOSEBUTTON.CAPTION" msgid "Show ta&b close button" msgstr "Afficher le bouton de fermeture des onglets" #: tfrmoptionstabs.gbtabs.caption #, fuzzy msgctxt "TFRMOPTIONSTABS.GBTABS.CAPTION" msgid "Folder tabs headers" msgstr "Titre des onglets de dossiers" #: tfrmoptionstabs.lblchar.caption msgctxt "TFRMOPTIONSTABS.LBLCHAR.CAPTION" msgid "characters" msgstr "caractères" #: tfrmoptionstabs.lbltabsposition.caption msgid "Ta&bs position" msgstr "" #: tfrmoptionsterminal.lblruninterm.caption #, fuzzy #| msgid "Run in terminal:" msgctxt "TFRMOPTIONSTERMINAL.LBLRUNINTERM.CAPTION" msgid "Run in &terminal:" msgstr "Exécuter dans un terminal :" #: tfrmoptionsterminal.lblrunterm.caption #, fuzzy #| msgid "Run terminal:" msgctxt "TFRMOPTIONSTERMINAL.LBLRUNTERM.CAPTION" msgid "Run t&erminal:" msgstr "Lancer un terminal :" #: tfrmoptionstoolbar.btnclonebutton.caption #, fuzzy #| msgid "&Clone button" msgctxt "tfrmoptionstoolbar.btnclonebutton.caption" msgid "C&lone button" msgstr "&Dupliquer le bouton" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "tfrmoptionstoolbar.btndeletebutton.caption" msgid "&Delete" msgstr "&Supprimer" #: tfrmoptionstoolbar.btnedithotkey.caption #, fuzzy #| msgid "Edit hotkey" msgctxt "tfrmoptionstoolbar.btnedithotkey.caption" msgid "Edit hot&key" msgstr "Editer" #: tfrmoptionstoolbar.btninsertbutton.caption #, fuzzy #| msgid "&Insert new buttonX" msgctxt "tfrmoptionstoolbar.btninsertbutton.caption" msgid "&Insert new button" msgstr "&Insérer un nouveau bouton" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "tfrmoptionstoolbar.btnopenfile.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "tfrmoptionstoolbar.btnopenicon.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnremovehotkey.caption #, fuzzy #| msgid "Remove hotkey" msgctxt "tfrmoptionstoolbar.btnremovehotkey.caption" msgid "Remove hotke&y" msgstr "X" #: tfrmoptionstoolbar.cbflatbuttons.caption #, fuzzy #| msgid "Flat b&uttons" msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "Bo&utons simples" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "" #: tfrmoptionstoolbar.gbgroupbox.caption msgctxt "tfrmoptionstoolbar.gbgroupbox.caption" msgid "Appearance" msgstr "Apparence" #: tfrmoptionstoolbar.lblbarsize.caption #, fuzzy #| msgid "Ba&r size:" msgctxt "tfrmoptionstoolbar.lblbarsize.caption" msgid "&Bar size:" msgstr "&Taille de la barre" #: tfrmoptionstoolbar.lblexternalcommand.caption msgctxt "tfrmoptionstoolbar.lblexternalcommand.caption" msgid "Comman&d:" msgstr "" #: tfrmoptionstoolbar.lblexternalparameters.caption msgctxt "tfrmoptionstoolbar.lblexternalparameters.caption" msgid "Parameter&s:" msgstr "" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "" #: tfrmoptionstoolbar.lbliconfile.caption #, fuzzy #| msgid "Icon:" msgctxt "tfrmoptionstoolbar.lbliconfile.caption" msgid "Ico&n:" msgstr "Fichier d'icône :" #: tfrmoptionstoolbar.lbliconsize.caption #, fuzzy #| msgid "Ic&on size:" msgctxt "tfrmoptionstoolbar.lbliconsize.caption" msgid "Icon si&ze:" msgstr "T&aille de l'icône :" #: tfrmoptionstoolbar.lblinternalcommand.caption msgctxt "tfrmoptionstoolbar.lblinternalcommand.caption" msgid "Co&mmand:" msgstr "" #: tfrmoptionstoolbar.lblinternalparameters.caption msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "" #: tfrmoptionstoolbar.lblstartpath.caption #, fuzzy #| msgid "Start path:" msgctxt "tfrmoptionstoolbar.lblstartpath.caption" msgid "Start pat&h:" msgstr "&Chemin au démarrage" #: tfrmoptionstoolbar.lbltooltip.caption #, fuzzy #| msgid "Tooltip:" msgctxt "tfrmoptionstoolbar.lbltooltip.caption" msgid "&Tooltip:" msgstr "&InfoBulles" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption #, fuzzy #| msgid "Keep terminal window open after executing program" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSKEEPTERMINALOPEN.CAPTION" msgid "&Keep terminal window open after executing program" msgstr "Garder la fenêtre de terminal ouverte après avoir exécuté un programme" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption #, fuzzy #| msgid "Execute in terminal" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSRUNINTERMINAL.CAPTION" msgid "&Execute in terminal" msgstr "Exécuter dans un terminal" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption #, fuzzy #| msgid "Use external program" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSUSEEXTERNALPROGRAM.CAPTION" msgid "&Use external program" msgstr "Utiliser un programme externe" #: tfrmoptionstoolbase.lbltoolsparameters.caption #, fuzzy #| msgid "Additional parameters" msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPARAMETERS.CAPTION" msgid "A&dditional parameters" msgstr "Paramètres supplémentaires" #: tfrmoptionstoolbase.lbltoolspath.caption #, fuzzy #| msgid "Path to program to execute" msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPATH.CAPTION" msgid "&Path to program to execute" msgstr "Chemin du programme à exécuter" #: tfrmoptionstooltips.btnaddfields.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "Ajouter" #: tfrmoptionstooltips.btnapplyfields.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "Appliquer" #: tfrmoptionstooltips.btndeletefields.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "Supprimer" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Modèle..." #: tfrmoptionstooltips.gbcustomfields.caption #, fuzzy msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "Champs personnalisés par type de fichier" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "Afficher les info-bulles" #: tfrmoptionstooltips.lblfieldslist.caption #, fuzzy #| msgid "Category hint:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "\"Nuance\" de catégorie :" #: tfrmoptionstooltips.lblfieldsmask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "Masque de catégorie :" #: tfrmoptionstooltips.lblfieldsname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "Nom de catégorie :" #: tfrmoptionstooltips.rbtooltipallfiles.caption #, fuzzy #| msgid "Show tool tip for all files in file panel" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "Afficher les info-bulles pour tous les fichiers dans le panneau des fichiers" #: tfrmoptionstooltips.rbtooltipnone.caption #, fuzzy #| msgid "Don't show" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "Ne pas afficher" #: tfrmoptionstooltips.rbtooltiponlylarge.caption #, fuzzy #| msgid "Show tool tip for files in file panel if truncated" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "Afficher les info-bulles pour tous les fichiers dans le panneau des fichiers si le nom est tronqué" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNBACKVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNFONTVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.gbviewerbookmode.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWERBOOKMODE.CAPTION" msgid "Viewer Book Mode" msgstr "Vue en mode \"Book\" (book viewer)" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWEREXAMPLE.CAPTION" msgid "Example" msgstr "Exemple" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption #, fuzzy #| msgid "Background color in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLBACKGROUNDCOLORVIEWERBOOK.CAPTION" msgid "&Background color in book viewer" msgstr "Arrière-plan dans la vue en mode \"Book\"" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption #, fuzzy #| msgid "Font color in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLFONTCOLORVIEWERBOOK.CAPTION" msgid "&Font color in book viewer" msgstr "Couleur de la police en mode \"Book\"" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption #, fuzzy #| msgid "Number of columns in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLNUMBERCOLUMNSVIEWER.CAPTION" msgid "&Number of columns in book viewer" msgstr "Nombre de colonne en mode \"Book\"" #: tfrmpackdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmpackdlg.btnconfig.caption #, fuzzy #| msgid "&Configure" msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "&Configurer" #: tfrmpackdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Aide" #: tfrmpackdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmpackdlg.caption #, fuzzy msgctxt "TFRMPACKDLG.CAPTION" msgid "Pack files" msgstr "Création de l'archive" #: tfrmpackdlg.cbcreateseparatearchives.caption #, fuzzy #| msgid "Create separate archives, o&ne per selected file/dir" msgid "C&reate separate archives, one per selected file/dir" msgstr "Créer des archives séparées, &une par fichier/dossier" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "Créer une archive auto-e&xtractible" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "Cr&ypter" #: tfrmpackdlg.cbmovetoarchive.caption #, fuzzy #| msgid "M&ove to archive" msgid "Mo&ve to archive" msgstr "Déplacer les fichiers dans l'archive" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "Archive en plusieurs &volumes" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "=>" #: tfrmpackdlg.cbputintarfirst.caption #, fuzzy #| msgid "Put in the TAR archive first" msgid "P&ut in the TAR archive first" msgstr "Placer les fichiers dans une archive TAR avant de compresser" #: tfrmpackdlg.cbstoredir.caption #, fuzzy msgid "Also &pack path names (only recursed)" msgstr "Ajouter les &dossiers dans l'archive (seulement si récursif)" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "Nom et emplacement du fichier archive :" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "Compression" #: tfrmpackinfodlg.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Fermer" #: tfrmpackinfodlg.btnunpackallandexec.caption #, fuzzy msgid "Unpack &all and execute" msgstr "&Tout extraire et exécuter" #: tfrmpackinfodlg.btnunpackandexec.caption #, fuzzy msgid "&Unpack and execute" msgstr "&Extraire et exécuter" #: tfrmpackinfodlg.caption msgctxt "TFRMPACKINFODLG.CAPTION" msgid "Properties of packed file" msgstr "Propriété de l'archive" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "Attributs :" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "Taux de compression :" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "Date :" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "Methode :" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "Taille originale :" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "Fichier :" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "Taille de l'archive :" #: tfrmpackinfodlg.lblpacker.caption #, fuzzy msgid "Packer:" msgstr "Programme d'archivage :" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "Date/heure :" #: tfrmquicksearch.btncancel.caption msgctxt "tfrmquicksearch.btncancel.caption" msgid "X" msgstr "X" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "" #: tfrmquicksearch.tglfilter.caption msgctxt "tfrmquicksearch.tglfilter.caption" msgid "Filter" msgstr "Filtres" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CANCELBUTTON.CAPTION" msgid "Cancel" msgstr "Annuler" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CLOSEBUTTON.CAPTION" msgid "&Close" msgstr "&Fermer" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.HELPBUTTON.CAPTION" msgid "&Help" msgstr "Ai&de" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "tfrmselecttextrange.btppanel.okbutton.caption" msgid "&OK" msgstr "&OK" #: tfrmselecttextrange.lblselecttext.caption msgid "&Select the characters to insert:" msgstr "" #: tfrmsetfileproperties.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsetfileproperties.caption msgctxt "TFRMSETFILEPROPERTIES.CAPTION" msgid "Change attributes" msgstr "Changer les attributs" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Collant" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "Archive" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "Créé :" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "Caché" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "Accédé :" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "Modifié :" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "Lecture seule" #: tfrmsetfileproperties.chkrecursive.caption #, fuzzy #| msgid "Recursive" msgid "Including subfolders" msgstr "Récursif" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "Système" #: tfrmsetfileproperties.gbtimesamp.caption #, fuzzy msgid "Timestamp properties" msgstr "Propriétés de l'horodatage" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Attributs" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Attributs" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits :" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Groupe" #: tfrmsetfileproperties.lblattrinfo.caption msgid "(gray field means unchanged value)" msgstr "(les champs grisés signifient des valeurs inchangées)" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Autres" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Prorpiétaire" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Texte :" #: tfrmsetfileproperties.lblexec.caption #, fuzzy msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Exécuter" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Octal :" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Lire" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Ecrire" #: tfrmsplitter.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmsplitter.caption msgctxt "TFRMSPLITTER.CAPTION" msgid "Splitter" msgstr "Découper le fichier" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664B - 3.5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "Nom du fichier" #: tfrmsplitter.grbxsize.caption msgid "Size and number of parts" msgstr "Taille et nombre de parts" #: tfrmsplitter.lbdirtarget.caption #, fuzzy #| msgid "Directory target" msgid "Directory &target" msgstr "Dossier cible" #: tfrmsplitter.lbfilesource.caption #, fuzzy #| msgid "File source" msgid "File &source" msgstr "Fichier source" #: tfrmsplitter.lblnumberparts.caption #, fuzzy #| msgid "Number of parts" msgid "&Number of parts" msgstr "Nombre de parts" #: tfrmsplitter.rbtngigab.caption #, fuzzy #| msgid "Gigabytes" msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "Gigaoctet" #: tfrmsplitter.rbtnkilob.caption #, fuzzy #| msgid "Kilobytes" msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "Kilooctet" #: tfrmsplitter.rbtnmegab.caption #, fuzzy #| msgid "Megabytes" msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "Mégaoctet" #: tfrmsymlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsymlink.caption #, fuzzy msgid "Create symbolic link" msgstr "Créer un lien symbolique" #: tfrmsymlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Destination vers laquelle le lien va pointer" #: tfrmsymlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Nom du lien" #: tfrmtweakplugin.btnadd.caption #, fuzzy #| msgid "Add new" msgid "A&dd new" msgstr "Ajouter un nouveau" #: tfrmtweakplugin.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Annuler" #: tfrmtweakplugin.btnchange.caption #, fuzzy #| msgid "Change" msgid "C&hange" msgstr "Changer" #: tfrmtweakplugin.btndefault.caption #, fuzzy #| msgid "Default" msgid "De&fault" msgstr "Défaut" #: tfrmtweakplugin.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmtweakplugin.btnremove.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "Supprimer" #: tfrmtweakplugin.caption msgctxt "TFRMTWEAKPLUGIN.CAPTION" msgid "Tweak plugin" msgstr "" #: tfrmtweakplugin.cbpk_caps_by_content.caption #, fuzzy #| msgid "Detect archive type by content" msgid "De&tect archive type by content" msgstr "Détecter le type des archives par le contenu" #: tfrmtweakplugin.cbpk_caps_delete.caption #, fuzzy #| msgid "Can delete files" msgid "Can de&lete files" msgstr "Impossible de supprimer le(s) fichier(s)" #: tfrmtweakplugin.cbpk_caps_encrypt.caption #, fuzzy #| msgid "Supports encryption" msgid "Supports e&ncryption" msgstr "Supporte le cryptage" #: tfrmtweakplugin.cbpk_caps_hide.caption #, fuzzy #| msgid "Show as normal files (hide packer icon)" msgid "Sho&w as normal files (hide packer icon)" msgstr "Afficher comme des fichiers normaux (cacher l'icône d'archive)" #: tfrmtweakplugin.cbpk_caps_mempack.caption #, fuzzy #| msgid "Supports packing in memory" msgid "Supports pac&king in memory" msgstr "Supporte les opérations d'archivage en mémoire" #: tfrmtweakplugin.cbpk_caps_modify.caption #, fuzzy #| msgid "Can modify exisiting archives" msgid "Can &modify exisiting archives" msgstr "Impossible de modifier l'archive existante" #: tfrmtweakplugin.cbpk_caps_multiple.caption #, fuzzy #| msgid "Archive can contain multiple files" msgid "&Archive can contain multiple files" msgstr "L'archive peut contenir plusieurs fichiers" #: tfrmtweakplugin.cbpk_caps_new.caption #, fuzzy #| msgid "Can create new archives" msgid "Can create new archi&ves" msgstr "Impossible de créer une(des) nouvelle(s) archive(s)" #: tfrmtweakplugin.cbpk_caps_options.caption #, fuzzy #| msgid "Supports the options dialogbox" msgid "S&upports the options dialogbox" msgstr "Supporte les boites de dialogue avec les options" #: tfrmtweakplugin.cbpk_caps_searchtext.caption #, fuzzy #| msgid "Allow searching for text in archives" msgid "Allow searchin&g for text in archives" msgstr "Autoriser la recherche de texte dans les archives" #: tfrmtweakplugin.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "Description :" #: tfrmtweakplugin.lbldetectstr.caption #, fuzzy #| msgid "Detect string:" msgid "D&etect string:" msgstr "Chaine à détecter :" #: tfrmtweakplugin.lblextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "Extension :" #: tfrmtweakplugin.lblflags.caption #, fuzzy msgid "Flags:" msgstr "Marqueurs :" #: tfrmtweakplugin.lblname.caption #, fuzzy #| msgid "Name:" msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "Nom :" #: tfrmtweakplugin.lblplugin.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "Plugin :" #: tfrmtweakplugin.lblplugin1.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "Plugin :" #: tfrmviewer.actabout.caption msgctxt "TFRMVIEWER.ACTABOUT.CAPTION" msgid "About Viewer..." msgstr "A propos de la visionneuse" #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "" #: tfrmviewer.actcopyfile.caption msgctxt "TFRMVIEWER.ACTCOPYFILE.CAPTION" msgid "Copy File" msgstr "" #: tfrmviewer.actcopyfile.hint msgctxt "TFRMVIEWER.ACTCOPYFILE.HINT" msgid "Copy File" msgstr "" #: tfrmviewer.actdeletefile.caption msgctxt "TFRMVIEWER.ACTDELETEFILE.CAPTION" msgid "Delete File" msgstr "" #: tfrmviewer.actdeletefile.hint msgctxt "TFRMVIEWER.ACTDELETEFILE.HINT" msgid "Delete File" msgstr "" #: tfrmviewer.actloadnextfile.caption msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.CAPTION" msgid "&Next" msgstr "Sui&vant" #: tfrmviewer.actloadnextfile.hint msgid "Load Next File" msgstr "" #: tfrmviewer.actloadprevfile.caption msgctxt "TFRMVIEWER.ACTLOADPREVFILE.CAPTION" msgid "&Previous" msgstr "&Précédent" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "" #: tfrmviewer.actmirror.caption msgctxt "TFRMVIEWER.ACTMIRROR.CAPTION" msgid "Mirror" msgstr "Miroir" #: tfrmviewer.actmirror.hint msgctxt "TFRMVIEWER.ACTMIRROR.HINT" msgid "Mirror" msgstr "Mirroir" #: tfrmviewer.actmovefile.caption msgctxt "TFRMVIEWER.ACTMOVEFILE.CAPTION" msgid "Move File" msgstr "" #: tfrmviewer.actmovefile.hint msgctxt "TFRMVIEWER.ACTMOVEFILE.HINT" msgid "Move File" msgstr "" #: tfrmviewer.actreload.caption msgctxt "TFRMVIEWER.ACTRELOAD.CAPTION" msgid "Reload" msgstr "Recharger" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "" #: tfrmviewer.actrotate180.caption msgctxt "TFRMVIEWER.ACTROTATE180.CAPTION" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate180.hint msgctxt "TFRMVIEWER.ACTROTATE180.HINT" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate270.caption msgctxt "TFRMVIEWER.ACTROTATE270.CAPTION" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate270.hint msgctxt "TFRMVIEWER.ACTROTATE270.HINT" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate90.caption msgctxt "TFRMVIEWER.ACTROTATE90.CAPTION" msgid "Rotate 90" msgstr "" #: tfrmviewer.actrotate90.hint msgctxt "TFRMVIEWER.ACTROTATE90.HINT" msgid "Rotate 90" msgstr "" #: tfrmviewer.actsaveas.caption msgctxt "TFRMVIEWER.ACTSAVEAS.CAPTION" msgid "Save As..." msgstr "Enregistrer sous..." #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "" #: tfrmviewer.actstretchimage.caption #, fuzzy msgctxt "TFRMVIEWER.ACTSTRETCHIMAGE.CAPTION" msgid "Stretch" msgstr "Etirer" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "- 90" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "Copier" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "Copier" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "Rogner" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "Supprimer" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "Supprimer" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "Plein écran" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "||" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "S" #: tfrmviewer.btnhightlight.hint #, fuzzy msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "Surbrillance" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "Miroir" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "Déplacer" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "Déplacer" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "||>" #: tfrmviewer.btnpaint.hint #, fuzzy msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "Colorer" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "<||" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "Yeux rouges" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "Redimensionner" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "Annuler" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "Zoom +" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "Zoom -" #: tfrmviewer.caption msgctxt "tfrmviewer.caption" msgid "Viewer" msgstr "Visionneuse" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Diaporama" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "Crayon" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption #, fuzzy msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "Surbrillance" #: tfrmviewer.gboxpaint.caption #, fuzzy msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "Colorer" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Diaporama" #: tfrmviewer.gboxview.caption #, fuzzy msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "Vue" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "0x0" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "+ 180" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "- 90" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "A propos" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "Vue en &Binaire" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "Copier dans le presse-papier" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Editer" #: tfrmviewer.miencoding.caption #, fuzzy msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "En&codage" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "&Quitter" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "&Fichier" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "Plein écran" #: tfrmviewer.migraphics.caption #, fuzzy msgid "Graphics" msgstr "Graphiques" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "Vue en &Hexadécimal" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "&Image" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "Vue en mode \"&Book\"" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "Mirroir" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "Plugins" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "Prévisualisation" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "Imprimer..." #: tfrmviewer.mirotate.caption msgctxt "TFRMVIEWER.MIROTATE.CAPTION" msgid "Rotate" msgstr "Pivoter" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "Enregister" #: tfrmviewer.misaveas.caption msgctxt "TFRMVIEWER.MISAVEAS.CAPTION" msgid "Save As..." msgstr "Enregistrer sous..." #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "Capture d'écran" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "Rechercher" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "Rechercher le suivant" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "Rechercher le précédent" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "Tout sélectionner" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.mistretch.caption #, fuzzy msgctxt "TFRMVIEWER.MISTRETCH.CAPTION" msgid "Stretch" msgstr "Etirer" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "Vue en mode &Texte" #: tfrmviewer.miview.caption #, fuzzy msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "&Vue" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "Vue avec &retours à la ligne" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "Zoom +" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "Zoom -" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "Copier dans le presse-papier" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "Tout sélectionner" #: tfrmviewoperations.btnstartpause.caption #, fuzzy #| msgid "Start" msgctxt "tfrmviewoperations.btnstartpause.caption" msgid "&Start" msgstr "Démarrer" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "" #: tfrmviewoperations.caption msgctxt "TFRMVIEWOPERATIONS.CAPTION" msgid "File operations" msgstr "Opérations sur les fichiers" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "" #: tfrmviewoperations.mnucanceloperation.caption msgctxt "tfrmviewoperations.mnucanceloperation.caption" msgid "Cancel" msgstr "Annuler" #: tfrmviewoperations.mnucancelqueue.caption msgctxt "tfrmviewoperations.mnucancelqueue.caption" msgid "Cancel" msgstr "Annuler" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "tfrmviewoperations.mnuoperationshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "" #: tfrmviewoperations.mnuqueue.caption msgctxt "tfrmviewoperations.mnuqueue.caption" msgid "Queue" msgstr "" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "tfrmviewoperations.mnuqueueshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption #, fuzzy msgctxt "tmultiarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Quand le fichier existe" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption #, fuzzy msgctxt "twcxarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Quand le fichier existe" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption #, fuzzy msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Quand le fichier existe" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "" #: ulng.rscolattr msgid "Attr" msgstr "Attr" #: ulng.rscoldate msgid "Date" msgstr "Date" #: ulng.rscolext msgid "Ext" msgstr "Ext" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "Nom" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "Taille" #: ulng.rscomparediffs #, fuzzy msgid "Number of changes:" msgstr "Nombre de changements :" #: ulng.rsconfcolalign #, fuzzy msgid "Align" msgstr "Aligner" #: ulng.rsconfcolcaption #, fuzzy msgid "Caption" msgstr "Légende" #: ulng.rsconfcolconfig #, fuzzy msgid "Config" msgstr "Configurer" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "Supprimer" #: ulng.rsconfcolfieldcont #, fuzzy msgid "Field contents" msgstr "Contenu du champ" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "Déplacer" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "Largeur" #: ulng.rsconfcustheader #, fuzzy msgid "Customize column" msgstr "Personnaliser la colonne" #: ulng.rscopynametemplate #, fuzzy msgid "Copy (%d) %s" msgstr "Copie (%d) %s" #: ulng.rsdlgallopcomplete #, fuzzy #| msgid "All operations is complete" msgid "All operations completed" msgstr "Toutes les opérations sont terminées" #: ulng.rsdlgallopprogress #, fuzzy msgid "Progress of all operations %d %%" msgstr "Progressions de toutes les opérations en cours %d %%" #: ulng.rsdlgbuttonabort #, fuzzy msgid "Ab&ort" msgstr "Abandonner" #: ulng.rsdlgbuttonall #, fuzzy msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "&Tous" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "Ajo&uter" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "&Annuler" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "Copier &dans" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "" #: ulng.rsdlgbuttonno msgid "&No" msgstr "&Non" #: ulng.rsdlgbuttonnone #, fuzzy msgid "Non&e" msgstr "Aucu&n" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "&OK" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "&Ecraser" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "&Tout Ecraser" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "" #: ulng.rsdlgbuttonretry #, fuzzy msgid "Re&try" msgstr "Ré-&essayer" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "&Passer" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "Passer pour &tous" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "&Oui" #: ulng.rsdlgcalcstatistics #, fuzzy msgid "Calculate files and folders" msgstr "Calculer les fichiers et dossiers" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "Vérification de la somme de contrôle..." #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "Vérification de la somme de contrôle..." #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "Copie du(des) fichier(s)" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "Suppression du(des) fichier(s)" #: ulng.rsdlgmv #, fuzzy msgid "Move file(s)" msgstr "Déplacement du(des) fichier(s)" #: ulng.rsdlgoppause #, fuzzy #| msgid "Pause" msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "Pause" #: ulng.rsdlgopstart #, fuzzy #| msgid "Start" msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "Démarrer" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "" #: ulng.rsdlgspeed #, fuzzy msgid "Speed %s/s" msgstr "Vitesse %s/s" #: ulng.rsdlgspeedtime #, fuzzy msgid "Speed %s/s, time remaining %s" msgstr "Vitesse %s/s, temps restant estimé %s" #: ulng.rsdlgsplit #, fuzzy msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "Scinder" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "Effacement sécurisé du(des) fichier(s)" #: ulng.rsdrivenolabel msgid "" msgstr "" #: ulng.rsdrivenomedia msgid "" msgstr "" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Editeur interne de Double Commander." #: ulng.rseditnewfile msgid "new.txt" msgstr "new.txt" #: ulng.rseditnewfilename #, fuzzy msgid "Filename:" msgstr "Nom de fichier :" #: ulng.rseditnewopen msgid "Open file" msgstr "Ouvrir le fichier" #: ulng.rseditsearchback #, fuzzy msgid "&Backward" msgstr "&Retour en arrière" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "Rechercher" #: ulng.rseditsearchfrw #, fuzzy msgid "&Forward" msgstr "&Aller en avant" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "Remplacer" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "" #: ulng.rsfileopsetpropertyerroroptions msgctxt "ulng.rsfileopsetpropertyerroroptions" msgid "Ask;Don't set anymore;Ignore errors" msgstr "" #: ulng.rsfilterstatus msgid "FILTER" msgstr "" #: ulng.rsfinddefinetemplate #, fuzzy msgid "Define template" msgstr "Définir un modèle" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "%s niveaux" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "tout (profondeur illimitée)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "seulement le dossier courant" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "Le dossier %s n'existe pas !" #: ulng.rsfindfound #, fuzzy msgctxt "ulng.rsfindfound" msgid "Found: %d" msgstr "Trouvé : %d" #: ulng.rsfindsavetemplatecaption #, fuzzy msgid "Save search template" msgstr "Sauvegarder le modèle de la recherche" #: ulng.rsfindsavetemplatetitle #, fuzzy msgid "Template name:" msgstr "Nom du modèle :" #: ulng.rsfindscanned #, fuzzy msgctxt "ulng.rsfindscanned" msgid "Scanned: %d" msgstr "Analyse effectuée : %d" #: ulng.rsfindscanning #, fuzzy msgid "Scanning" msgstr "Analyse" #: ulng.rsfindsearchfiles #, fuzzy msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "Rechercher les fichiers" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "Commencer à" #: ulng.rsfreemsg #, fuzzy msgid "Free %s from %s bytes" msgstr "%s libre sur %s octets" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "%s octets libres" #: ulng.rsfuncatime msgid "Access date/time" msgstr "Date/heure d'accès" #: ulng.rsfuncattr #, fuzzy msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "Attributs" #: ulng.rsfunccomment msgid "Comment" msgstr "Commentaire" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "Date/heure de création" #: ulng.rsfuncext msgid "Extension" msgstr "Extension" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "Groupe" #: ulng.rsfunclinkto #, fuzzy msgid "Link to" msgstr "Lier" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "Date/heure de modification" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "Nom" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "Nom sans l'extension" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "Propriétaire" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "Chemin" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "Taille" #: ulng.rsfunctype msgid "Type" msgstr "Type" #: ulng.rsharderrcreate #, fuzzy msgid "Error creating hardlink." msgstr "Erreur lors de la création du lien dur (hardlink)." #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "Différences" #: ulng.rshotkeycategorymain msgid "Main" msgstr "" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "Visionneuse" #: ulng.rslinkmsgok #, fuzzy msgid "Linker complete" msgstr "Concaténation terminée" #: ulng.rsmarkminus #, fuzzy msgid "Unselect mask" msgstr "Désélectionner le masque" #: ulng.rsmarkplus #, fuzzy msgid "Select mask" msgstr "Sélectionner le masque" #: ulng.rsmaskinput #, fuzzy msgid "Input mask:" msgstr "Masque de saisie :" #: ulng.rsmenuconfigurecustomcolumns #, fuzzy msgid "Configure custom columns" msgstr "Configurer les colonnes personnalisées" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "Configurer cette vue personnalisée des colonnes" #: ulng.rsmnuactions #, fuzzy msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "Actions" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "Editer" #: ulng.rsmnueject msgid "Eject" msgstr "Ejecter" #: ulng.rsmnumount msgid "Mount" msgstr "Monter" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "Nouveau" #: ulng.rsmnunomedia msgid "No media available" msgstr "Média indisponible" #: ulng.rsmnuopenwith #, fuzzy #| msgid "Open with ..." msgid "Open with" msgstr "Ouvrir avec..." #: ulng.rsmnuopenwithother msgid "Other..." msgstr "" #: ulng.rsmnusortby msgid "Sort by" msgstr "Trier par" #: ulng.rsmnuumount msgid "Unmount" msgstr "Démonter" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "Voir" #: ulng.rsmsgaccount msgid "Account:" msgstr "Compte :" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "Paramètres additionnels pour la ligne de commande du programme d'archivage :" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "Vous ne pouvez pas copier/déplacer le fichier \"%s\" sur lui-même !" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "Le changement de dossier vers [%s] a échoué !" #: ulng.rsmsgcloseallinactivetabs #, fuzzy msgid "Remove all inactive tabs?" msgstr "Fermer tous les onglets actifs ?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "Cet onglet est verrouillé ! Forcer la fermeture ?" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "Etes-vous certain de vouloir quitter ?" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "Copier les %d fichiers/dossiers sélectionnés ?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "Copier la sélection \"%s\" ?" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "Supprimer les %d fichiers/dossiers sélectionnés ?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "Déplacer les %d fichiers/dossiers sélectionnés dans la corbeille ?" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "Supprimer la sélection \"%s\" ?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "Déplacer le fichier/dossier \"%s\" sélectionné dans la corbeille ?" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "Impossible de mettre \"%s\" à la corbeille ! Le supprimer définitivement ?" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "Le volume/disque n'est pas accessible" #: ulng.rsmsgenterfileext #, fuzzy msgid "Enter file extension:" msgstr "Donnez l'extension de fichier :" #: ulng.rsmsgentername #, fuzzy msgid "Enter name:" msgstr "Donnez le nom :" #: ulng.rsmsgerrbadarchive #, fuzzy msgid "CRC error in archive data" msgstr "Erreur CRC (contrôle de redondance cyclique) dans l'archive" #: ulng.rsmsgerrbaddata #, fuzzy msgid "Data is bad" msgstr "Les données sont erronées" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "Impossible de se connecter au serveur : \"%s\"" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "Impossible de copier le fichier %s vers %s" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "" #: ulng.rsmsgerrdatenotsupported #, fuzzy msgid "Date %s is not supported" msgstr "La date %s n'est pas supportée" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "Le dossier %s existe déjà !" #: ulng.rsmsgerreaborted #, fuzzy msgid "Function aborted by user" msgstr "Fonction interrompue par l'utilisateur" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "Erreur à la fermeture du fichier" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "Impossible de créer le fichier" #: ulng.rsmsgerrendarchive #, fuzzy msgid "No more files in archive" msgstr "Plus de fichier dans l'archive" #: ulng.rsmsgerreopen #, fuzzy msgid "Cannot open existing file" msgstr "Impossible d'ouvrir le fichier existant" #: ulng.rsmsgerreread #, fuzzy msgid "Error reading from file" msgstr "Erreur de lecture du fichier" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "Erreur lors de l'écriture dans le fichier" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "Impossible de créer le dossier %s !" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "Lien non valide" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "Pas de fichier trouvé" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "La mémoire est insuffisante" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "Fonction non supportée !" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "Erreur de syntaxe dans l'expression régulière !" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "Impossible de renommer le fichier %s en %s" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "Impossible de sauvegarder le fichier" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "Impossible de définir les attributs pour \"%s\"" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "Impossible de définir la date/heure pour \"%s\"" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "Le cache (mémoire tampon) est trop petit" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "Il y a trop de fichier à archiver" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "Format d'archive inconnu" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "Le fichier %s a été modifié, le sauvegarder ?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "Le fichier %s existe déjà, l'écraser ?" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "Opérations sur les fichiers en cours" #: ulng.rsmsgfileoperationsactivelong #, fuzzy msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "Certaines opérations sur les fichiers ne sont pas encore terminées. Fermer Double Commander peut entrainer la perte de données." #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "Le fichier %s est en lecture seule. Le supprimer quand même ?" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "La taille du fichier \"%s\" est supérieure à l'espace disponible sur le système de fichier de destination !" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "Le dossier %s existe déjà, l'écraser ?" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "Suivre le lien symbolique \"%s\"?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "" #: ulng.rsmsginvalidfilename #, fuzzy msgid "Invalid filename" msgstr "Nom de fichier incorrect" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "" #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "" #: ulng.rsmsginvalidselection #, fuzzy msgid "Invalid selection." msgstr "Sélection non permise" #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "Chargement de la liste des fichiers..." #: ulng.rsmsglogcopy #, fuzzy msgid "Copy file %s" msgstr "Copie du fichier %s" #: ulng.rsmsglogdelete #, fuzzy msgid "Delete file %s" msgstr "Suppression du fichier %s" #: ulng.rsmsglogerror msgid "Error: " msgstr "Erreur :" #: ulng.rsmsglogextract #, fuzzy msgid "Extract file %s" msgstr "Extraction du fichier %s" #: ulng.rsmsgloginfo msgid "Info: " msgstr "Information :" #: ulng.rsmsgloglink msgid "Create link %s" msgstr "Créer le lien %s" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "Créer le dossier %s" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "Déplacer le fichier %s" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "Archiver dans le fichier %s" #: ulng.rsmsglogrmdir #, fuzzy msgid "Remove directory %s" msgstr "Supprimer le dossier %s" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "Effectué :" #: ulng.rsmsglogsymlink #, fuzzy msgid "Create symlink %s" msgstr "Créer le lien symbolique %s" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "Test de l'intégrité du fichier %s" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "Ajout manuel d'un favori" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "Edition manuelle d'un favori" #: ulng.rsmsgmanualhotdirquery #, fuzzy msgid "Enter name and path (format name=path):" msgstr "Indiquez le nom et le chemin (format nom=chemin) :" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "Mot de passe principal" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "Introduisez le mot de passe principal :" #: ulng.rsmsgnewfile msgid "New file" msgstr "Nouveau fichier" #: ulng.rsmsgnextvolunpack #, fuzzy msgid "Next volume will be unpacked" msgstr "Le volume suivant de l'archive va être extrait" #: ulng.rsmsgnofiles msgid "No files" msgstr "" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "Aucun fichier sélectionner." #: ulng.rsmsgnofreespacecont #, fuzzy msgid "No enough free space on target drive, Continue?" msgstr "Espace insuffisant sur le volume cible. Continuer ?" #: ulng.rsmsgnofreespaceretry #, fuzzy msgid "No enough free space on target drive, Retry?" msgstr "Espace insuffisant sur le volume cible. Réessayer ?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "Impossible de supprimer le fichier %s" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "Pas encore implémenté." #: ulng.rsmsgpassword msgid "Password:" msgstr "Mot de passe :" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "Introduire le mot de passe :" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "Mot de passe (Firewall) :" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "&Ajouter %s" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "&Configurer" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "&Supprimer %s" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "Ecraser la configuration existante ?" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "Renommer/Déplacer les %d fichiers/dossiers sélectionnés ?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "Renommer/Déplacer la sélection \"%s\" ?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "Vous devez redémarrer Double Commander pour activer les changements." #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "Merci de sélectionner uniquement un fichier contenant une (des) somme(s) de contrôle !" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "Merci de choisir l'emplacement du volume suivant" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "Définir le nom du vomume" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "Renommer l'onglet" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "Nom du nouvel onglet :" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "Chemin du dossier cible :" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "Trop de fichier sélectionnés." #: ulng.rsmsgurl msgid "URL:" msgstr "URL :" #: ulng.rsmsgusername msgid "User name:" msgstr "Nom d'utilisateur :" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "Nom d'utilisateur (Firewall) :" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "Nom de volume :" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "Entrez la taille du volume :" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "Lancer l'effacement sécurisé pour les %d fichiers/dossiers sélectionnés ?" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "Lancer l'effacement sécurisé pour la sélection \"%s\" ?" #: ulng.rsmulrenfilenamestylelist msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "Pas de changement;MAJUSCULE;minuscule;Premier caractère majuscule;Premier Caractère De Chaque Mot Majuscule;" #: ulng.rsoperaborted msgid "Aborted" msgstr "Annulé" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "" #: ulng.rsopercalculatingstatictics #, fuzzy msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "Calcul en cours..." #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "" #: ulng.rsopercombining msgid "Joining" msgstr "" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopying msgid "Copying" msgstr "" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "" #: ulng.rsoperdeleting #, fuzzy msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "Suppression" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "" #: ulng.rsoperexecuting msgid "Executing" msgstr "" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "" #: ulng.rsoperextracting msgid "Extracting" msgstr "" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperfinished msgid "Finished" msgstr "Terminés" #: ulng.rsoperlisting msgid "Listing" msgstr "" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "" #: ulng.rsopermoving msgid "Moving" msgstr "" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "" #: ulng.rsopernotstarted msgid "Not started" msgstr "Pas encore démarrés" #: ulng.rsoperpacking msgid "Packing" msgstr "" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpaused msgid "Paused" msgstr "En attente" #: ulng.rsoperpausing msgid "Pausing" msgstr "Mettre en attente" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "Dans la file d'attente" #: ulng.rsoperrunning msgid "Running" msgstr "En cours" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "" #: ulng.rsopersplitting msgid "Splitting" msgstr "" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperstarting msgid "Starting" msgstr "En cours de démarrage" #: ulng.rsoperstopped msgid "Stopped" msgstr "Annulés" #: ulng.rsoperstopping msgid "Stopping" msgstr "Annuler" #: ulng.rsopertesting msgid "Testing" msgstr "" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "En attente de l'accès au fichier source..." #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "En attente de la réponse de l'utilisateur..." #: ulng.rsoperwiping msgid "Wiping" msgstr "" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "" #: ulng.rsoperworking msgid "Working" msgstr "" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "Supprimer :" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "Extraire sans les chemins des dossiers contenus dans l'archive :" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "ID :" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "Position de l'ID :" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "Paramètre" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "Mot de passe :" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "Créer une archive auto-extractible :" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "Tester l'archive :" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "Type d'archive :" #: ulng.rsoptarchivevalue msgid "Value" msgstr "Valeur" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "Associer le plugin \"%s\" avec :" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "Premier;Dernier;" #: ulng.rsoptdisable msgid "Disable" msgstr "Désactiver" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "Activer" #: ulng.rsoptenterext msgid "Enter extension" msgstr "Entrer une extension" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "Curseur" #: ulng.rsoptexamplemark msgid "Mark" msgstr "Signet" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "Signet + Curseur" #: ulng.rsoptexampletext msgid "Text" msgstr "Texte" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "" #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "" #: ulng.rsopthotkeysdeletetrashcanoverrides msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "" #: ulng.rsopthotkeyshotkey #, fuzzy msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "Raccourcis" #: ulng.rsopthotkeyshotkeys #, fuzzy msgid "Hotkeys" msgstr "Raccourcis clavier" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "Paramètres" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "" #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "Raccourcis utilisé" #: ulng.rsopthotkeysshortcutusedtext1 #, fuzzy #| msgid "Shortcut %s is already used for %s." msgid "Shortcut %s is already used." msgstr "Le raccourcis %s est déjà utilisé pour %s." #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "Modifier en %s ?" #: ulng.rsopthotkeysusedby #, fuzzy #| msgid "used by" msgid "used for %s in %s" msgstr "utilisé par" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "Gestions des archives" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "Rafraichissement automatique" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "Comportements" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "Couleurs" #: ulng.rsoptionseditorcolumnsview msgctxt "ulng.rsoptionseditorcolumnsview" msgid "Columns" msgstr "Colonnes" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "Configuration" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "" #: ulng.rsoptionseditorfileoperations #, fuzzy msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "Opérations sur les fichiers" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "Panneaux des fichiers" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "" #: ulng.rsoptionseditorfiletypes #, fuzzy msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "Types de fichiers" #: ulng.rsoptionseditorfoldertabs #, fuzzy msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "Titre des onglets" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "Polices" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "" #: ulng.rsoptionseditorhotkeys #, fuzzy msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "Raccourcis clavier" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "Icônes" #: ulng.rsoptionseditorignorelist #, fuzzy msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "Fichiers/dossiers ignorés" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "Langue" #: ulng.rsoptionseditorlayout #, fuzzy msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "Apparence" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "Journal" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "Divers" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "Plugins" #: ulng.rsoptionseditorquicksearch msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "Filtres de recherche rapide" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "Terminal" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "Outils" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "Info-bulles" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "Bouton gauche; Bouton droit;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "Le plugin %s est déjà enregistré pour les extensions suivantes :" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "Actif" #: ulng.rsoptpluginsfilename #, fuzzy msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "Nom de fichier" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "Nom" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "Enregistré pour" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "Alphabétique avec prise en considération des accents;Tri naturel alphanumérique (lettres et chiffres)" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "Haut;Bas;" #: ulng.rsopttoolbarbuttontype msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "Impossible de changer les droits pour \"%s\"" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "Impossible de changer le propriétaire pour \"%s\"" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "Fichier" #: ulng.rspropsfolder #, fuzzy msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "Dossier" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "Tube nommé" #: ulng.rspropsno msgid "No" msgstr "Non" #: ulng.rspropssocket msgid "Socket" msgstr "Socket" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "Périphérique spécial bloc" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "Périphérique spécial caractères" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "Lien symbolique" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "Type inconnu" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "Oui (%s)" #: ulng.rssearchresult msgid "Search result" msgstr "Résultat de la recherche" #: ulng.rssearchtemplateunnamed msgid "" msgstr "" #: ulng.rsselectdir msgid "Select a directory" msgstr "Sélectionner un dossier" #: ulng.rsshowhelpfor msgid "&Show help for %s" msgstr "" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "Octets" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "Gigaoctets" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "Kilooctets" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "Mégaoctets" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "Téraoctets" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "Fichiers : %d, Dossiers: %d, Taille: %s (%s octets)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "Impossible de créer le dossier cible !" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "Format de fichier incorrect !" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "Impossible de scinder le fichier !" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "Le nombre de partie est supérieur à 100 ! Continuer ?" #: ulng.rssplitseldir msgid "Select directory:" msgstr "Sélectionner un dossier :" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "Erreur à la création du lien symbolique." #: ulng.rssyndefaulttext msgctxt "ulng.rssyndefaulttext" msgid "Default text" msgstr "" #: ulng.rssynlangplaintext msgctxt "ulng.rssynlangplaintext" msgid "Plain text" msgstr "" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "Jour(s)" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "Heure(s)" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "Minute(s)" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "Mois" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "Seconde(s)" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "Semaine(s)" #: ulng.rstimeunityear msgid "Year(s)" msgstr "Année(s)" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "Différences" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "Editeur" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "Terminal" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "Visionneuse" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "Merci de rapporter cette erreur sur le \"bug tracker\" avec une description de ce que vous étiez en train de faire ainsi que le fichier suivant : %sCliquez %s pour continuer ou %s pour quitter le programme." #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "Réseau" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "Visionneuse interne de Double Commander." #: ulng.rsviewencoding #, fuzzy msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "Encodage" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "%s introuvable !" doublecmd-0.5.8/language/doublecmd.ko.po0000644000175000017500000066402612250633131017211 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.5 alpha\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-31 22:53+0900\n" "PO-Revision-Date: 2012-04-02 23:34+0900\n" "Last-Translator: sheppaul \", \"Lee, Cheon-Pung \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Korean\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "전부" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "전부" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "전부" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "전부" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "전부" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "전부" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "전부" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "취소" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "..." #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "->" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "확인(&O)" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "<-" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "사용자 열 보기 설정" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "배경 색상:" #: tfcolumnssetconf.cbcursorborder.caption #, fuzzy msgid "Cursor border" msgstr "커서 테두리" #: tfcolumnssetconf.cbovercolor.caption #, fuzzy msgid "Allow Overcolor" msgstr "윤색 허용" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "사용자 글꼴과 색상 사용하기" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "텍스트 색상:" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "글꼴:" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "크기:" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "배경 색상 2:" #: tfcolumnssetconf.lblconfigviewnr.caption #, fuzzy msgid "Configure view nr:" msgstr "열 보기 설정 번호:" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "커서 색상:" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "커서 텍스트:" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "선택 색상:" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "이름:" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "열 추가" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "사용자 정의 열:" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "미리보기" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "R" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption #, fuzzy #| msgid "Check free space" msgid "C&heck free space" msgstr "여유 용량 계산하기" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption msgid "Cop&y attributes" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption msgid "Copy o&wnership" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption msgid "Copy d&ate/time" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption #, fuzzy #| msgid "Correct links" msgid "Correct lin&ks" msgstr "링크 바로잡기" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "읽기전용 속성 제거하기" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption msgid "E&xclude empty directories" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption #, fuzzy #| msgid "Follow links" msgid "Fo&llow links" msgstr "링크 따라가기" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "" #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption #, fuzzy #| msgid "When directory exists" msgid "When dir&ectory exists" msgstr "폴더가 존재할 때" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption #, fuzzy #| msgid "When file exists" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "파일이 존재할 때" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption msgid "When ca&nnot set property" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "" #: tfrmabout.btnclose.caption msgctxt "TFRMABOUT.BTNCLOSE.CAPTION" msgid "&Close" msgstr "닫기 (&C)" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "클립보드에 복사" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "정보" #: tfrmabout.lblbuild.caption msgid "Build" msgstr "빌드" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "Free Pascal" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "홈페이지:" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "Lazarus" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "리비전" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption msgid "Version" msgstr "버전" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소(&C)" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "확인(&O)" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "리셋(&R)" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "속성 선택" #: tfrmattributesedit.cbarchive.caption #, fuzzy #| msgid "Archive" msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "기록" #: tfrmattributesedit.cbcompressed.caption #, fuzzy #| msgid "Compressed" msgid "Co&mpressed" msgstr "압축" #: tfrmattributesedit.cbdirectory.caption #, fuzzy #| msgid "Directory" msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "폴더" #: tfrmattributesedit.cbencrypted.caption #, fuzzy #| msgid "Encrypted" msgid "&Encrypted" msgstr "암호화" #: tfrmattributesedit.cbhidden.caption #, fuzzy #| msgid "Hidden" msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "숨김" #: tfrmattributesedit.cbreadonly.caption #, fuzzy #| msgid "Read only" msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "읽기전용" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmattributesedit.cbsparse.caption msgid "S&parse" msgstr "" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Sticky" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmattributesedit.cbsymlink.caption #, fuzzy #| msgid "Symlink" msgid "&Symlink" msgstr "심링크" #: tfrmattributesedit.cbsystem.caption #, fuzzy #| msgid "System" msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "시스템" #: tfrmattributesedit.cbtemporary.caption #, fuzzy #| msgid "Temporary" msgid "&Temporary" msgstr "임시" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "NTFS 속성" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "일반 속성" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "그룹" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Other" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "소유자" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "실행" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "읽기" #: tfrmattributesedit.lbltextattrs.caption msgid "As te&xt:" msgstr "" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "쓰기" #: tfrmchecksumcalc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "확인(&O)" #: tfrmchecksumcalc.caption msgctxt "tfrmchecksumcalc.caption" msgid "Calculate check sum..." msgstr "CRC 체크섬 생성..." #: tfrmchecksumcalc.cbseparatefile.caption #, fuzzy #| msgid "Create separate checksum file for each file" msgid "C&reate separate checksum file for each file" msgstr "각각의 파일별로 체크섬 파일 분리 생성하기" #: tfrmchecksumcalc.lblsaveto.caption #, fuzzy #| msgid "Save check sum file(s) to:" msgid "&Save check sum file(s) to:" msgstr "체크섬 파일 저장:" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "닫기(&C)" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "CRC 체크섬 검사..." #: tfrmconnectionmanager.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "추가" #: tfrmconnectionmanager.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmconnectionmanager.btnconnect.caption #, fuzzy #| msgid "Connect" msgid "C&onnect" msgstr "연결" #: tfrmconnectionmanager.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "삭제" #: tfrmconnectionmanager.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "편집" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "연결 매니저" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "연결하기:" #: tfrmcopydlg.btnaddtoqueue.caption #, fuzzy #| msgid "Add To Queue" msgid "A&dd To Queue" msgstr "대기열에 추가하기" #: tfrmcopydlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmcopydlg.btncreatespecialqueue.caption #, fuzzy msgctxt "tfrmcopydlg.btncreatespecialqueue.caption" msgid "..." msgstr "..." #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "옵션(&P)" #: tfrmcopydlg.btnsaveoptions.caption #, fuzzy #| msgid "Save these options as default" msgid "Sa&ve these options as default" msgstr "이 옵션을 기본값으로 저장" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "파일 복사" #: tfrmdescredit.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "확인(&O)" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "파일/폴더 주석" #: tfrmdescredit.lbleditcommentfor.caption #, fuzzy #| msgid "Edit comment for:" msgid "E&dit comment for:" msgstr "주석 편집:" #: tfrmdescredit.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "인코딩:" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "정보" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "자동 비교" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "바이너리 모드" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "취소" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "취소" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "블록 우측으로 복사" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "블록 우측으로 복사" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "블록 좌측으로 복사" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "블록 좌측으로 복사" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "복사" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "잘라내기" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "삭제" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "붙여넣기" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "재실행" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "전체 선택하기(&A)" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "되돌리기" #: tfrmdiffer.actexit.caption #, fuzzy msgctxt "tfrmdiffer.actexit.caption" msgid "E&xit" msgstr "종료(&X)" #: tfrmdiffer.actfirstdifference.caption msgctxt "tfrmdiffer.actfirstdifference.caption" msgid "First Difference" msgstr "처음 차이점" #: tfrmdiffer.actfirstdifference.hint msgctxt "tfrmdiffer.actfirstdifference.hint" msgid "First Difference" msgstr "처음 차이점" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "대소문자 무시" #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "공백 무시" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "스크롤 유지" #: tfrmdiffer.actlastdifference.caption msgctxt "tfrmdiffer.actlastdifference.caption" msgid "Last Difference" msgstr "마지막 차이점" #: tfrmdiffer.actlastdifference.hint msgctxt "tfrmdiffer.actlastdifference.hint" msgid "Last Difference" msgstr "마지막 차이점" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "줄 차이점" #: tfrmdiffer.actnextdifference.caption msgctxt "tfrmdiffer.actnextdifference.caption" msgid "Next Difference" msgstr "다음 차이점" #: tfrmdiffer.actnextdifference.hint msgctxt "tfrmdiffer.actnextdifference.hint" msgid "Next Difference" msgstr "다음 차이점" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "왼쪽 열기..." #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "오른쪽 열기..." #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "배경 채우기" #: tfrmdiffer.actprevdifference.caption msgctxt "tfrmdiffer.actprevdifference.caption" msgid "Previous Difference" msgstr "이전 차이점" #: tfrmdiffer.actprevdifference.hint msgctxt "tfrmdiffer.actprevdifference.hint" msgid "Previous Difference" msgstr "이전 차이점" #: tfrmdiffer.actreload.caption #, fuzzy #| msgid "Reload" msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "다시 열기" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "다시 열기" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "저장하기" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "저장하기" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "다른 이름으로 저장..." #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "다른 이름으로 저장..." #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "왼쪽 저장하기" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "왼쪽 저장하기" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "왼쪽을 다른 이름으로 저장하기..." #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "왼쪽을 다른 이름으로 저장하기..." #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "오른쪽 저장" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "오른쪽 저장" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "오른쪽을 다른 이름으로 저장하기..." #: tfrmdiffer.actsaverightas.hint #, fuzzy msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "오른쪽을 다른 이름으로 저장하기..." #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "비교하기" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "비교하기" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "인코딩" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "인코딩" #: tfrmdiffer.caption msgctxt "TFRMDIFFER.CAPTION" msgid "Compare files" msgstr "파일 비교" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miencodingleft.caption #, fuzzy #| msgid "Left" msgid "&Left" msgstr "왼쪽" #: tfrmdiffer.miencodingright.caption #, fuzzy #| msgid "Right" msgid "&Right" msgstr "오른쪽" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "동작(&A)" #: tfrmdiffer.mnuedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "편집" #: tfrmdiffer.mnuencoding.caption #, fuzzy #| msgid "Encoding" msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "인코딩" #: tfrmdiffer.mnufile.caption #, fuzzy #| msgid "File" msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "파일" #: tfrmdiffer.mnuoptions.caption msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "옵션(&O)" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "" #: tfrmedithotkey.btncancel.caption msgctxt "TFRMEDITHOTKEY.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소(&C)" #: tfrmedithotkey.btnok.caption msgctxt "TFRMEDITHOTKEY.BTNOK.CAPTION" msgid "&OK" msgstr "확인(&O)" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "" #: tfrmedithotkey.cghkcontrols.caption msgctxt "tfrmedithotkey.cghkcontrols.caption" msgid "Only for these controls" msgstr "이 컨트롤 동작만" #: tfrmedithotkey.lblparameters.caption #, fuzzy #| msgid "Parameters (each in a separate line):" msgid "&Parameters (each in a separate line):" msgstr "변수 (분리된 줄에 각각):" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "정보" #: tfrmeditor.actabout.hint #, fuzzy msgctxt "TFRMEDITOR.ACTABOUT.HINT" msgid "About" msgstr "정보" #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "환경설정(&C)" #: tfrmeditor.actconfhigh.hint #, fuzzy msgctxt "TFRMEDITOR.ACTCONFHIGH.HINT" msgid "Configuration" msgstr "환경설정" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "복사" #: tfrmeditor.acteditcopy.hint #, fuzzy msgctxt "TFRMEDITOR.ACTEDITCOPY.HINT" msgid "Copy" msgstr "복사" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "잘라내기" #: tfrmeditor.acteditcut.hint #, fuzzy msgctxt "TFRMEDITOR.ACTEDITCUT.HINT" msgid "Cut" msgstr "잘라내기" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "삭제" #: tfrmeditor.acteditdelete.hint #, fuzzy msgctxt "TFRMEDITOR.ACTEDITDELETE.HINT" msgid "Delete" msgstr "삭제" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "찾기(&F)" #: tfrmeditor.acteditfind.hint #, fuzzy msgctxt "TFRMEDITOR.ACTEDITFIND.HINT" msgid "Find" msgstr "찾기" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "다음 찾기" #: tfrmeditor.acteditfindnext.hint #, fuzzy msgctxt "TFRMEDITOR.ACTEDITFINDNEXT.HINT" msgid "Find next" msgstr "다음 찾기" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "맥 (CR)" #: tfrmeditor.acteditlineendcr.hint msgctxt "TFRMEDITOR.ACTEDITLINEENDCR.HINT" msgid "Mac (CR)" msgstr "맥 (CR)" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "윈도우 (CRLF)" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "TFRMEDITOR.ACTEDITLINEENDCRLF.HINT" msgid "Windows (CRLF)" msgstr "윈도우 (CRLF)" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "유닉스 (LF)" #: tfrmeditor.acteditlineendlf.hint msgctxt "TFRMEDITOR.ACTEDITLINEENDLF.HINT" msgid "Unix (LF)" msgstr "유닉스 (LF)" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "붙여넣기" #: tfrmeditor.acteditpaste.hint #, fuzzy msgctxt "TFRMEDITOR.ACTEDITPASTE.HINT" msgid "Paste" msgstr "붙여넣기" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "재실행" #: tfrmeditor.acteditredo.hint #, fuzzy msgctxt "TFRMEDITOR.ACTEDITREDO.HINT" msgid "Redo" msgstr "재실행" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "바꾸기(&R)" #: tfrmeditor.acteditrplc.hint #, fuzzy msgctxt "TFRMEDITOR.ACTEDITRPLC.HINT" msgid "Replace" msgstr "바꾸기" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "전체 선택(&A)" #: tfrmeditor.acteditselectall.hint #, fuzzy msgctxt "TFRMEDITOR.ACTEDITSELECTALL.HINT" msgid "Select All" msgstr "전부 선택" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "되돌리기" #: tfrmeditor.acteditundo.hint #, fuzzy msgctxt "TFRMEDITOR.ACTEDITUNDO.HINT" msgid "Undo" msgstr "되돌리기" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "닫기(&C)" #: tfrmeditor.actfileclose.hint #, fuzzy msgctxt "TFRMEDITOR.ACTFILECLOSE.HINT" msgid "Close" msgstr "닫기" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "종료(&X)" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "종료" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "새 파일(&N)" #: tfrmeditor.actfilenew.hint #, fuzzy msgctxt "TFRMEDITOR.ACTFILENEW.HINT" msgid "New" msgstr "새 파일" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "열기(&o)" #: tfrmeditor.actfileopen.hint #, fuzzy msgctxt "TFRMEDITOR.ACTFILEOPEN.HINT" msgid "Open" msgstr "열기" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "저장(&S)" #: tfrmeditor.actfilesave.hint #, fuzzy msgctxt "TFRMEDITOR.ACTFILESAVE.HINT" msgid "Save" msgstr "저장하기" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "다른 이름으로 저장(&A)..." #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "다른 이름으로 저장하기" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "모두 저장(&V)" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "전부 저장하기" #: tfrmeditor.caption msgctxt "tfrmeditor.caption" msgid "Editor" msgstr "편집기" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "도움말(&H)" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "편집기(&E)" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "인코딩(&C)" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "다른 형식으로 열기" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "다른 형식으로 저장" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "파일(&F)" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "구문강조(&H)" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "줄의 끝" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n5.caption msgctxt "TFRMEDITOR.N5.CAPTION" msgid "-" msgstr "-" #: tfrmeditsearchreplace.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "확인(&O)" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "대/소문자 구별(&A)" #: tfrmeditsearchreplace.cbsearchfromcursor.caption #, fuzzy #| msgid "Search from &caret" msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "커서 이하 검색(&C)" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "정규 표현식(&R)" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "선택한 텍스트 내(&T)" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "온전한 단어(&W)" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "옵션" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "바꾸기(&R):" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "찾기(&S):" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "방향" #: tfrmextractdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmextractdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "도움말" #: tfrmextractdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "확인" #: tfrmextractdlg.caption #, fuzzy msgctxt "TFRMEXTRACTDLG.CAPTION" msgid "Unpack files" msgstr "압축 해제" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "경로명도 함께 압축 해제(&U)" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*.*" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "파일명으로 폴더를 만들어 각각 압축 파일 풀기(&S)" #: tfrmextractdlg.cboverwrite.caption #, fuzzy #| msgid "&Overwrite existing files" msgid "O&verwrite existing files" msgstr "기존 파일 덮어쓰기(&O)" #: tfrmextractdlg.lblextractto.caption #, fuzzy #| msgid "To the directory:" msgid "To the &directory:" msgstr "압축 해제할 폴더:" #: tfrmextractdlg.lblfilemask.caption #, fuzzy #| msgid "Extract files matching file mask:" msgid "&Extract files matching file mask:" msgstr "압축 해제할 파일(&F):" #: tfrmextractdlg.lblpassword.caption #, fuzzy #| msgid "Password for encrypted files:" msgid "&Password for encrypted files:" msgstr "암호화 파일의 비밀번호:" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "추가" #: tfrmfileassoc.btnaddext.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "추가" #: tfrmfileassoc.btnaddnewtype.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "추가" #: tfrmfileassoc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmfileassoc.btndownact.caption #, fuzzy #| msgid "Down" msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "아래" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "확인(&O)" #: tfrmfileassoc.btnremoveact.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "제거" #: tfrmfileassoc.btnremoveext.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "제거" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "" #: tfrmfileassoc.btnremovetype.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "제거" #: tfrmfileassoc.btnrenametype.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "이름 바꾸기" #: tfrmfileassoc.btnupact.caption #, fuzzy #| msgid "Up" msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "위" #: tfrmfileassoc.caption msgid "File associations" msgstr "파일 연결" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "동작" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "확장자" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "파일 형식" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "아이콘" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "동작:" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "명령(&C):" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "편집" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "편집기로 열기" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "파일명" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "파일 경로" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "전체 경로" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "명령으로부터 출력 얻기" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "열기" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "명령행에서 실행" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "VFS에서 열기" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "보기" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "뷰어로 열기" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "닫기(&C)" #: tfrmfileexecuteyourself.caption msgctxt "TFRMFILEEXECUTEYOURSELF.CAPTION" msgid "Wait..." msgstr "대기..." #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "파일명:" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "원본:" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "임시 파일을 삭제 가능할 때 닫기를 누르십시오!" #: tfrmfileop.btncancel.caption #, fuzzy msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소(&C)" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "패널로(&T)" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "모두 보기(&V)" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "현재 작업:" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "원본:" #: tfrmfileop.lblto.caption msgid "To:" msgstr "대상:" #: tfrmfileproperties.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "닫기" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "" #: tfrmfileproperties.caption #, fuzzy msgctxt "TFRMFILEPROPERTIES.CAPTION" msgid "Properties" msgstr "속성" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Sticky" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "소유자" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "그룹" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Other" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "소유자" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmfileproperties.lblattrtextstr.caption #, fuzzy msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "텍스트:" #: tfrmfileproperties.lblcontains.caption msgctxt "tfrmfileproperties.lblcontains.caption" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "실행" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "파일명" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "이름:" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "파일명" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "경로:" #: tfrmfileproperties.lblgroupstr.caption #, fuzzy #| msgid "Group" msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "그룹" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "마지막 액세스:" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "마지막 변경:" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "마지막 상태 바꾸기:" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Octal:" #: tfrmfileproperties.lblownerstr.caption #, fuzzy #| msgid "Owner" msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "소유자" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "읽기" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "크기:" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption #, fuzzy msgid "Symlink to:" msgstr "심링크:" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption msgid "Type:" msgstr "형식:" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "쓰기" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "속성" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "속성" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "추가(&A)" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "도움말(&H)" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "닫기(&C)" #: tfrmfinddlg.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmfinddlg.btnedit.caption" msgid "&Edit" msgstr "편집" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "파일로 가기(&G)" #: tfrmfinddlg.btnlastsearch.caption msgctxt "tfrmfinddlg.btnlastsearch.caption" msgid "&Last search" msgstr "" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "새 찾기(&N)" #: tfrmfinddlg.btnsavetemplate.caption #, fuzzy #| msgid "Save" msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "저장하기(&A)" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "삭제하기(&D)" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "불러오기(&O)" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "저장(&A)" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption msgid "Sa&ve with \"Start in directory\"" msgstr "" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "" #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "시작(&S)" #: tfrmfinddlg.btnstop.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "취소" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "보기(&V)" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "목록상자에 입력(&L)" #: tfrmfinddlg.caption #, fuzzy msgctxt "tfrmfinddlg.caption" msgid "Find files" msgstr "파일 찾기" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "대소문자 구별(&I)" #: tfrmfinddlg.cbdatefrom.caption #, fuzzy #| msgid "Date From:" msgid "&Date from:" msgstr "다음 날짜에서:" #: tfrmfinddlg.cbdateto.caption #, fuzzy #| msgid "Date To:" msgid "Dat&e to:" msgstr "다음 날짜까지:" #: tfrmfinddlg.cbfilesizefrom.caption #, fuzzy #| msgid "Size from:" msgid "S&ize from:" msgstr "다음 크기에서:" #: tfrmfinddlg.cbfilesizeto.caption #, fuzzy #| msgid "Size to:" msgid "Si&ze to:" msgstr "다음 크기까지:" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "파일에서 텍스트 찾기(&T)" #: tfrmfinddlg.cbfollowsymlinks.caption #, fuzzy #| msgid "Follow symlinks" msgctxt "tfrmfinddlg.cbfollowsymlinks.caption" msgid "Follow s&ymlinks" msgstr "심링크 따라가기" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "텍스트를 포함하지 않은 파일 찾기(&O)" #: tfrmfinddlg.cbnotolderthan.caption #, fuzzy #| msgid "Not older than:" msgid "N&ot older than:" msgstr "지정된 시간/날짜 이내:" #: tfrmfinddlg.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name " msgid "Searc&h for part of file name" msgstr "파일명의 일부도 검색" #: tfrmfinddlg.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "정규 표현식(&R)" #: tfrmfinddlg.cbreplacetext.caption #, fuzzy msgid "Re&place by" msgstr "텍스트 바꾸기(&P)" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "" #: tfrmfinddlg.cbtimefrom.caption #, fuzzy #| msgid "Time from:" msgid "&Time from:" msgstr "다음 시간에서:" #: tfrmfinddlg.cbtimeto.caption #, fuzzy #| msgid "Time to:" msgid "Ti&me to:" msgstr "다음 시간까지:" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "검색 플러그인 이용(&U):" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption #, fuzzy msgctxt "tfrmfinddlg.gbdirectories.caption" msgid "Directories" msgstr "폴더" #: tfrmfinddlg.gbfiles.caption #, fuzzy msgctxt "tfrmfinddlg.gbfiles.caption" msgid "Files" msgstr "파일(&F)" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "문자열 검색" #: tfrmfinddlg.lblattributes.caption msgid "Attri&butes" msgstr "" #: tfrmfinddlg.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "인코딩:" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "찾을 파일(&F)" #: tfrmfinddlg.lblfindpathstart.caption #, fuzzy #| msgid "&Start in directory" msgid "Start in &directory" msgstr "폴더(&D)" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "하위 폴더 찾기(&B):" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "이전 찾기(&P):" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "목록에서 제거" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "찾기 결과 모두 보기" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "뷰어로 보여주기" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "고급" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "읽어오기/저장" #: tfrmfinddlg.tsplugins.caption #, fuzzy msgctxt "tfrmfinddlg.tsplugins.caption" msgid "Plugins" msgstr "플러그인" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "결과" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "기본" #: tfrmfindview.btnclose.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmfindview.btnfind.caption #, fuzzy #| msgid "Find" msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "찾기" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "찾기" #: tfrmfindview.cbcasesens.caption #, fuzzy #| msgid "Case sensitive" msgid "C&ase sensitive" msgstr "대소문자 구별" #: tfrmhardlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "확인(&O)" #: tfrmhardlink.caption #, fuzzy msgid "Create hard link" msgstr "하드 링크 생성" #: tfrmhardlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "링크 대상이 존재합니다." #: tfrmhardlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "링크 이름" #: tfrmhotdir.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "추가" #: tfrmhotdir.btnaddman.caption #, fuzzy #| msgid "Add manually" msgid "Add &manually" msgstr "수동으로 추가" #: tfrmhotdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmhotdir.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "삭제" #: tfrmhotdir.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "편집" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "확인(&O)" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "폴더 즐겨찾기" #: tfrmlinker.btnexit.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmlinker.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "확인" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "..." #: tfrmlinker.caption msgctxt "TFRMLINKER.CAPTION" msgid "Linker" msgstr "링커" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "...로 저장" #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "아이템" #: tfrmlinker.lblfilename.caption #, fuzzy #| msgid "File name" msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "파일명" #: tfrmlinker.spbtndel.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "삭제" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "지우기" #: tfrmlinker.spbtndown.caption #, fuzzy #| msgid "Down" msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "아래" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "아래" #: tfrmlinker.spbtnup.caption #, fuzzy #| msgid "Up" msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "위" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "위" #: tfrmmain.actabout.caption #, fuzzy msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "더블 커맨더 정보(&A)" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "명령행에 파일명 추가하기" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "명령행에 파일명과 경로 추가하기" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "명령행에 경로 복사하기" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "" #: tfrmmain.actcalculatespace.caption #, fuzzy msgid "Calculate &Occupied Space" msgstr "점유 공간 계산(&O)" #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "폴더 이동하기" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "상위 폴더로 이동하기" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "루트로 이동하기" #: tfrmmain.actchecksumcalc.caption #, fuzzy msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "CRC 체크섬 생성(&S)..." #: tfrmmain.actchecksumverify.caption #, fuzzy msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "CRC 체크섬 검사(&V)..." #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "로그 파일 비우기" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "로그 창 비우기" #: tfrmmain.actclosealltabs.caption #, fuzzy #| msgid "Remove &All Tabs" msgctxt "tfrmmain.actclosealltabs.caption" msgid "Close &All Tabs" msgstr "모든 탭 제거(&A)" #: tfrmmain.actclosetab.caption #, fuzzy #| msgid "&Remove Tab" msgctxt "tfrmmain.actclosetab.caption" msgid "&Close Tab" msgstr "탭 제거(&R)" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "파일 내용 비교(&Y)" #: tfrmmain.actcomparedirectories.caption msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.CAPTION" msgid "Compare Directories" msgstr "폴더 비교" #: tfrmmain.actcomparedirectories.hint msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.HINT" msgid "Compare Directories" msgstr "폴더 비교하기" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "컨텍스트 메뉴 보이기" #: tfrmmain.actcopy.caption #, fuzzy #| msgid "Copy" msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr " 복사" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "전체경로를 포함한 파일명 클립보드로 복사(&P)" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "선택 파일명 클립보드로 복사(&F)" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "묻지 않고 파일 복사" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "같은 패널로 복사" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "복사(&C)" #: tfrmmain.actcountdircontent.caption #, fuzzy msgid "Sho&w Occupied Space" msgstr "점유 공간 보이기(&W)" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "잘라내기(&T)" #: tfrmmain.actdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMMAIN.ACTDELETE.CAPTION" msgid "Delete" msgstr "삭제" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "폴더 히스토리" #: tfrmmain.actdirhotlist.caption #, fuzzy msgid "Directory &Hotlist" msgstr "폴더 즐겨찾기(&H)" #: tfrmmain.actedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "편집" #: tfrmmain.acteditcomment.caption #, fuzzy msgid "Edit Co&mment..." msgstr "주석 편집(&M)..." #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "새 파일 편집" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "위 파일목록의 경로 필드 편집" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "패널 맞바꾸기(&P)" #: tfrmmain.actexit.caption #, fuzzy msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "종료(&X)" #: tfrmmain.actextractfiles.caption #, fuzzy msgid "&Extract Files..." msgstr "압축 해제(&U)..." #: tfrmmain.actfileassoc.caption #, fuzzy msgid "File &Associations..." msgstr "파일 연결(&A)..." #: tfrmmain.actfilelinker.caption #, fuzzy msgid "Com&bine Files..." msgstr "파일 결합(&M)..." #: tfrmmain.actfileproperties.caption #, fuzzy msgid "Show &File Properties" msgstr "속성 보기(R)" #: tfrmmain.actfilespliter.caption #, fuzzy msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "파일 분할(&S)..." #: tfrmmain.actfocuscmdline.caption #, fuzzy msgid "Focus command line" msgstr "명령행 포커스" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "목록의 첫 파일에 커서 놓기" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "목록의 마지막 파일에 커서 놓기" #: tfrmmain.acthardlink.caption #, fuzzy msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "하드 링크 생성(&H)..." #: tfrmmain.acthelpindex.caption #, fuzzy msgid "&Contents" msgstr "도움말 항목(&I)" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "수직 패널 모드(&Z)" #: tfrmmain.actkeyboard.caption #, fuzzy msgid "&Keyboard" msgstr "단축키 정보(&K)" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "왼쪽 &= 오른쪽" #: tfrmmain.actleftopendrives.caption #, fuzzy msgid "Open left drive list" msgstr "왼쪽 드라이브 목록 열기" #: tfrmmain.actloadselectionfromclip.caption msgid "Load Selection from Clip&board" msgstr "선택목록 클립보드에서 불러오기(&B)" #: tfrmmain.actloadselectionfromfile.caption msgid "&Load Selection from File..." msgstr "선택목록 파일에서 불러오기(&L)..." #: tfrmmain.actmakedir.caption #, fuzzy #| msgid "MakeDir" msgid "MakeDir" msgstr "폴더 생성" #: tfrmmain.actmarkcurrentextension.caption #, fuzzy msgid "Select All with the Same E&xtension" msgstr "같은 확장자 모두 선택(&X)" #: tfrmmain.actmarkinvert.caption #, fuzzy msgid "&Invert Selection" msgstr "선택 반전(&I)" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "전체 선택(&A)" #: tfrmmain.actmarkminus.caption #, fuzzy msgid "Unselect a Gro&up..." msgstr "그룹 해제(&U)..." #: tfrmmain.actmarkplus.caption #, fuzzy msgid "Select a &Group..." msgstr "그룹 선택(&G)..." #: tfrmmain.actmarkunmarkall.caption #, fuzzy msgid "&Unselect All" msgstr "전체 해제(&N)" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "창 최소화" #: tfrmmain.actmultirename.caption #, fuzzy msgid "Multi &Rename Tool" msgstr "파일명 일괄 변경(&R)" #: tfrmmain.actnetworkconnect.caption msgid "Network &Connect..." msgstr "네트워크 연결(&C)..." #: tfrmmain.actnetworkdisconnect.caption msgid "Network &Disconnect" msgstr "네트워크 연결 해제(&D)" #: tfrmmain.actnetworkquickconnect.caption msgid "Network &Quick Connect..." msgstr "네트워크 빠른 연결(&Q)..." #: tfrmmain.actnewtab.caption #, fuzzy msgid "&New Tab" msgstr "새 탭(&N)" #: tfrmmain.actnexttab.caption #, fuzzy msgid "Switch to Nex&t Tab" msgstr "다음 탭으로 전환(&T)" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "열기" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "압축 파일 열어보기" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "도구모음 파일 열기" #: tfrmmain.actopendirinnewtab.caption #, fuzzy msgid "Open &Folder in a New Tab" msgstr "새 탭에 폴더 열기(&F)" #: tfrmmain.actopenvirtualfilesystemlist.caption #, fuzzy msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "가상 파일 시스템 목록 열기(&V)" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "작업 관리자(&O)" #: tfrmmain.actoptions.caption #, fuzzy msgid "&Options..." msgstr "옵션(&O)..." #: tfrmmain.actpackfiles.caption #, fuzzy msgid "&Pack Files..." msgstr "파일 압축(&P)..." #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "자르기 위치 설정" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "붙여넣기(&P)" #: tfrmmain.actprevtab.caption #, fuzzy msgid "Switch to &Previous Tab" msgstr "이전 탭으로 전환(&P)" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "빠른 필터" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "빠른 찾기" #: tfrmmain.actquickview.caption msgid "&Quick View Panel" msgstr "미리 보기(&Q)" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "새로 고침(&R)" #: tfrmmain.actrename.caption #, fuzzy #| msgid "Move" msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "이동" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "묻지 않고 파일 이동/이름 바꾸기" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "이름 바꾸기" #: tfrmmain.actrenametab.caption #, fuzzy #| msgid "Re&name Tab" msgid "&Rename Tab" msgstr "탭이름 변경(&N)" #: tfrmmain.actrestoreselection.caption msgid "&Restore Selection" msgstr "선택목록 복원(&R)" #: tfrmmain.actreverseorder.caption #, fuzzy msgid "Re&verse Order" msgstr "역순 정렬(&V)" #: tfrmmain.actrightequalleft.caption #, fuzzy msgid "Right &= Left" msgstr "오른쪽 &= 왼쪽" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "오른쪽 드라이브 목록 열기" #: tfrmmain.actrunterm.caption #, fuzzy msgid "Run &Terminal" msgstr "명령 프롬프트 실행(&T)" #: tfrmmain.actsaveselection.caption msgid "Sa&ve Selection" msgstr "선택목록 저장(&S)" #: tfrmmain.actsaveselectiontofile.caption msgid "Save S&election to File..." msgstr "선택목록 파일로 저장(&E)..." #: tfrmmain.actsearch.caption #, fuzzy msgid "&Search..." msgstr "파일 찾기(&S)..." #: tfrmmain.actsetfileproperties.caption msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "속성 변경(&A)..." #: tfrmmain.actsettaboptiondirsinnewtab.caption msgid "Locked with Directories Opened in New &Tabs" msgstr "새탭으로 연 폴더 잠김(&T)" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "보통(&N)" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "잠김(&L)" #: tfrmmain.actsettaboptionpathresets.caption #, fuzzy msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "잠김/폴더 변경 허용(&F))" #: tfrmmain.actshellexecute.caption msgctxt "tfrmmain.actshellexecute.caption" msgid "Open" msgstr "열기" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "버튼 메뉴 보이기" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "명령행 히스토리 보이기" #: tfrmmain.actshowmainmenu.caption #, fuzzy #| msgid "Menu" msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "메뉴" #: tfrmmain.actshowsysfiles.caption #, fuzzy msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "숨김/시스템 파일 보기(&H)" #: tfrmmain.actsortbyattr.caption #, fuzzy msgid "Sort by &Attributes" msgstr "속성순(&A)" #: tfrmmain.actsortbydate.caption #, fuzzy msgid "Sort by &Date" msgstr "시간순(&D)" #: tfrmmain.actsortbyext.caption #, fuzzy msgid "Sort by &Extension" msgstr "확장자순(&E)" #: tfrmmain.actsortbyname.caption #, fuzzy msgid "Sort by &Name" msgstr "파일명순(&N)" #: tfrmmain.actsortbysize.caption #, fuzzy msgid "Sort by &Size" msgstr "크기순(&S)" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "무시 목록 파일 토글하기(파일명 감추기)" #: tfrmmain.actsymlink.caption #, fuzzy msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "심볼릭 링크 생성(&B)..." #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "대상 &= 원본" #: tfrmmain.acttestarchive.caption msgid "&Test Archive(s)" msgstr "압축파일 검사(&T)" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "커서가 위치한 폴더를 왼쪽 창으로 전송" #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "커서가 위치한 폴더를 오른쪽 창으로 전송" #: tfrmmain.actunmarkcurrentextension.caption #, fuzzy msgid "Unselect All with the Same Ex&tension" msgstr "같은 확장자 모두 해제(&T)" #: tfrmmain.actview.caption #, fuzzy #| msgid "View" msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "보기" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "활성창에 방문한 경로 히스토리 보이기" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "히스토리의 다음 항목으로" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "히스토리의 이전 항목으로" #: tfrmmain.actvisithomepage.caption #, fuzzy msgid "&Visit Double Commander Website" msgstr "더블 커맨더 홈페이지 방문(&V)" #: tfrmmain.actwipe.caption #, fuzzy msgid "Wipe" msgstr "반복하여 지우기" #: tfrmmain.btnf10.caption #, fuzzy #| msgid "Exit" msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "종료" #: tfrmmain.btnf8.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMMAIN.BTNF8.CAPTION" msgid "Delete" msgstr "지우기" #: tfrmmain.btnf9.caption #, fuzzy #| msgid "Terminal" msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "명령프롬프트" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.HINT" msgid "Directory hotlist" msgstr "폴더 즐겨찾기" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "<" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "오른쪽 패널의 현재 폴더를 왼쪽 패널에 보이기" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnlefthome.hint msgctxt "TFRMMAIN.BTNLEFTHOME.HINT" msgid "Go to home directory" msgstr "사용자 폴더로 가기" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgctxt "TFRMMAIN.BTNLEFTROOT.HINT" msgid "Go to root directory" msgstr "루트로 가기" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgctxt "TFRMMAIN.BTNLEFTUP.HINT" msgid "Go to parent directory" msgstr "상위 폴더로 가기" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr ">" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "왼쪽 패널의 현재 폴더를 오른쪽 패널에 보이기" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "tfrmmain.caption" msgid "Double Commander" msgstr "더블 커맨더" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "경로" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "&20/80" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "&30/70" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "&40/60" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "&50/50" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "&60/40" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "&70/30" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "&80/20" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "취소" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "복사..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "링크 생성..." #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline33.caption msgctxt "tfrmmain.miline33.caption" msgid "-" msgstr "-" #: tfrmmain.miline37.caption msgctxt "TFRMMAIN.MILINE37.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "-" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "비우기" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "복사" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "숨기기" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "전부 선택" #: tfrmmain.mimove.caption msgid "Move..." msgstr "이동..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "심링크 생성..." #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "탭 옵션" #: tfrmmain.mitrayiconexit.caption #, fuzzy msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "종료(&X)" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "복원" #: tfrmmain.mnualloperpause.caption msgctxt "tfrmmain.mnualloperpause.caption" msgid "||" msgstr "" #: tfrmmain.mnualloperstart.caption msgctxt "tfrmmain.mnualloperstart.caption" msgid "Start" msgstr "시작" #: tfrmmain.mnualloperstop.caption msgctxt "tfrmmain.mnualloperstop.caption" msgid "Cancel" msgstr "취소" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "명령(&C)" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "설정(&O)" #: tfrmmain.mnufiles.caption #, fuzzy msgid "&Files" msgstr "파일(&F)" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "도움말(&H)" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "선택(&M)" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "네트워크" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "보기(&W)" #: tfrmmain.mnutaboptions.caption msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "옵션(&O)" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "탭(&T)" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "복사하기" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "잘라내기" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "삭제하기" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "편집하기" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "붙여넣기" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmmaskinputdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmmaskinputdlg.btndefinetemplate.caption #, fuzzy #| msgid "Define..." msgid "&Define..." msgstr "정의하기..." #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "확인(&O)" #: tfrmmaskinputdlg.lblsearchtemplate.caption #, fuzzy #| msgid "Or select predefined selection type:" msgid "O&r select predefined selection type:" msgstr "또는 미리 정의한 선택 형식을 고르십시오:" #: tfrmmkdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "확인(&O)" #: tfrmmkdir.caption msgid "Create new directory" msgstr "새 폴더 만들기" #: tfrmmkdir.lblmakedir.caption #, fuzzy #| msgid "Input new directory name:" msgid "&Input new directory name:" msgstr "새 폴더 이름 입력:" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "" #: tfrmmodview.caption msgctxt "TFRMMODVIEW.CAPTION" msgid "New Size" msgstr "새 크기" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "높이:" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgctxt "tfrmmodview.lblpath2.caption" msgid "2" msgstr "" #: tfrmmodview.lblpath3.caption msgctxt "tfrmmodview.lblpath3.caption" msgid "3" msgstr "" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "JPG 압축 품질" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "너비" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "" #: tfrmmodview.teheight.text msgid "Height" msgstr "높이" #: tfrmmodview.tequality.text msgid "80" msgstr "" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "너비" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "닫기(&C)" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "삭제(&D)" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "읽어오기(&L)" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "이름 바꾸기(&R)" #: tfrmmultirename.btnrestore.caption #, fuzzy #| msgid "Reset all" msgid "Reset &all" msgstr "전부 재설정" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "저장(&S)" #: tfrmmultirename.caption #, fuzzy msgctxt "tfrmmultirename.caption" msgid "MultiRename" msgstr "파일명 일괄 변경" #: tfrmmultirename.cblog.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "사용하기" #: tfrmmultirename.cbregexp.caption msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "정규 표현식(&X)" #: tfrmmultirename.cbusesubs.caption msgid "&Use substitution" msgstr "치환 문자열 사용(&U)" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption #, fuzzy msgid "[E] Extension" msgstr "[E] 확장자" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "카운터 정의" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "찾기 및 바꾸기" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "결과 로그" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "마스크" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "프리셋" #: tfrmmultirename.lbext.caption msgid "&Extension" msgstr "확장자(&E)" #: tfrmmultirename.lbfind.caption msgid "&Find..." msgstr "찾기(&F)..." #: tfrmmultirename.lbinterval.caption #, fuzzy #| msgid "Interval" msgid "&Interval" msgstr "간격" #: tfrmmultirename.lbname.caption msgid "File &Name" msgstr "파일명(&N)" #: tfrmmultirename.lbreplace.caption msgid "Re&place..." msgstr "바꾸기(&P)..." #: tfrmmultirename.lbstnb.caption #, fuzzy #| msgid "Start Number" msgid "S&tart Number" msgstr "시작 번호" #: tfrmmultirename.lbwidth.caption #, fuzzy #| msgid "Width" msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "너비" #: tfrmmultirename.micounter.caption #, fuzzy msgid "[C] Counter" msgstr "[C] 카운터" #: tfrmmultirename.miday.caption #, fuzzy msgid "[D] Day" msgstr "[D] 날짜" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "[DD] 날짜 (2자리)" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "[DDD] 요일 (짧게, 예, \"mon\")" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "[DDDD] 요일 (길게, 예, \"monday\")" #: tfrmmultirename.miextensionx.caption #, fuzzy msgid "[Ex] Character at position x" msgstr "[Ex] 확장자 위치 x의 문자" #: tfrmmultirename.miextensionxx.caption #, fuzzy msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:x] 확장자 위치 x에서 y까지 문자" #: tfrmmultirename.mihour.caption #, fuzzy msgid "[h] Hour" msgstr "[h] 시간" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "[hh] 시간 (2자리)" #: tfrmmultirename.miminute.caption #, fuzzy msgid "[n] Minute" msgstr "[n] 분" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "[nn] 분 (2자리)" #: tfrmmultirename.mimonth.caption #, fuzzy msgid "[M] Month" msgstr "[M] 월" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "[MM] 월 (2자리)" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "[MMM] 월 (짧게, 예, \"jan\")" #: tfrmmultirename.mimonth3.caption msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "[MMMM] 월 (길게, 예, \"january\")" #: tfrmmultirename.miname.caption #, fuzzy msgid "[N] Name" msgstr "[N] 이름" #: tfrmmultirename.minamex.caption #, fuzzy msgid "[Nx] Character at position x" msgstr "[Nx] 파일명 위치 x의 문자" #: tfrmmultirename.minamexx.caption #, fuzzy msgid "[Nx:y] Characters from position x to y" msgstr "[Nx:x] 파일명 위치 x에서 y까지 문자" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "시간..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "확장자..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "이름..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "플러그인" #: tfrmmultirename.misecond.caption #, fuzzy msgid "[s] Second" msgstr "[s] 초" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "[ss] 초 (2자리)" #: tfrmmultirename.miyear.caption #, fuzzy msgid "[Y] Year (2 digits)" msgstr "[Y] 년 (2자리)" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "[YYYY] 년 (4자리)" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.stringgrid.columns[0].title.caption #, fuzzy msgctxt "tfrmmultirename.stringgrid.columns[0].title.caption" msgid "Old File Name" msgstr "이전 파일명" #: tfrmmultirename.stringgrid.columns[1].title.caption #, fuzzy msgctxt "tfrmmultirename.stringgrid.columns[1].title.caption" msgid "New File Name" msgstr "새 파일명" #: tfrmmultirename.stringgrid.columns[2].title.caption #, fuzzy msgctxt "tfrmmultirename.stringgrid.columns[2].title.caption" msgid "File Path" msgstr "파일 경로" #: tfrmopenwith.caption msgid "Choose an application" msgstr "" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "" #: tfrmoptions.btnapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "적용" #: tfrmoptions.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "확인(&O)" #: tfrmoptions.caption #, fuzzy msgctxt "tfrmoptions.caption" msgid "Options" msgstr "옵션" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "" #: tfrmoptionsarchivers.btnautoconfig.caption #, fuzzy #| msgid "Auto Configure" msgctxt "TFRMOPTIONSARCHIVERS.BTNAUTOCONFIG.CAPTION" msgid "A&uto Configure" msgstr "자동 설정하기" #: tfrmoptionsarchivers.btnmultiarcadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCADD.CAPTION" msgid "A&dd" msgstr "추가" #: tfrmoptionsarchivers.btnmultiarcapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCAPPLY.CAPTION" msgid "A&pply" msgstr "적용" #: tfrmoptionsarchivers.btnmultiarcdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCDELETE.CAPTION" msgid "D&elete" msgstr "삭제" #: tfrmoptionsarchivers.btnmultiarcrename.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCRENAME.CAPTION" msgid "&Rename" msgstr "이름 바꾸기" #: tfrmoptionsarchivers.chkmultiarcdebug.caption #, fuzzy #| msgid "Debug mode" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCDEBUG.CAPTION" msgid "De&bug mode" msgstr "디버그 모드" #: tfrmoptionsarchivers.chkmultiarcenabled.caption #, fuzzy #| msgid "Enabled" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCENABLED.CAPTION" msgid "E&nabled" msgstr "활성화" #: tfrmoptionsarchivers.chkmultiarcoutput.caption #, fuzzy #| msgid "Show console output" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCOUTPUT.CAPTION" msgid "S&how console output" msgstr "콘솔 출력 보기" #: tfrmoptionsarchivers.gbarchiveroptions.caption #, fuzzy msgctxt "TFRMOPTIONSARCHIVERS.GBARCHIVEROPTIONS.CAPTION" msgid "Options" msgstr "옵션" #: tfrmoptionsarchivers.lblarchiveadd.caption #, fuzzy #| msgid "Add:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEADD.CAPTION" msgid "Add&ing:" msgstr "추가:" #: tfrmoptionsarchivers.lblarchiveextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTENSION.CAPTION" msgid "E&xtension:" msgstr "확장자:" #: tfrmoptionsarchivers.lblarchiveextract.caption #, fuzzy #| msgid "Extract:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTRACT.CAPTION" msgid "Ex&tract:" msgstr "압축해제:" #: tfrmoptionsarchivers.lblarchivelist.caption #, fuzzy #| msgid "List:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELIST.CAPTION" msgid "&List:" msgstr "목록:" #: tfrmoptionsarchivers.lblarchivelistend.caption #, fuzzy #| msgid "Listing finish (optional):" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTEND.CAPTION" msgid "Listing &finish (optional):" msgstr "목록 종료 (선택사항):" #: tfrmoptionsarchivers.lblarchivelistformat.caption #, fuzzy #| msgid "Listing format:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTFORMAT.CAPTION" msgid "Listing for&mat:" msgstr "목록 형식:" #: tfrmoptionsarchivers.lblarchiveliststart.caption #, fuzzy #| msgid "Listing start (optional):" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTSTART.CAPTION" msgid "Listin&g start (optional):" msgstr "목록 시작 (선택사항):" #: tfrmoptionsarchivers.lblarchiver.caption #, fuzzy #| msgid "Archiver:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVER.CAPTION" msgid "Arc&hiver:" msgstr "압축기" #: tfrmoptionsarchivers.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMOPTIONSARCHIVERS.LBLDESCRIPTION.CAPTION" msgid "De&scription:" msgstr "설명:" #: tfrmoptionsarchivers.tbarchiveradditional.caption #, fuzzy msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERADDITIONAL.CAPTION" msgid "Additional" msgstr "추가" #: tfrmoptionsarchivers.tbarchivergeneral.caption #, fuzzy msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERGENERAL.CAPTION" msgid "General" msgstr "일반" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption #, fuzzy msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHATTRIBUTESCHANGE.CAPTION" msgid "When &size, date or attributes change" msgstr "파일 크기/날짜/속성이 변경될 때(&S)" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption #, fuzzy msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHEXCLUDEDIRS.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "다음 경로와 하위폴더:" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption #, fuzzy #| msgid "When files are &created, deleted or renamed" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHFILENAMECHANGE.CAPTION" msgid "When &files are created, deleted or renamed" msgstr "파일 생성/삭제/이름 바꾸기할 때(&C)" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption #, fuzzy msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHONLYFOREGROUND.CAPTION" msgid "When application is in the &background" msgstr "응용 프로그램이 백그라운드에 있을 때(&R)" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption #, fuzzy msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHDISABLE.CAPTION" msgid "Disable auto-refresh" msgstr "자동 새로고침을 하지 않기" #: tfrmoptionsautorefresh.gbautorefreshenable.caption #, fuzzy msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHENABLE.CAPTION" msgid "Refresh file list" msgstr "파일 목록을 새로 고치기" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption #, fuzzy #| msgid "Always show tray icon" msgctxt "TFRMOPTIONSBEHAVIOR.CBALWAYSSHOWTRAYICON.CAPTION" msgid "Al&ways show tray icon" msgstr "항상 트레이 아이콘 보이기" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption msgid "Automatically &hide unmounted devices" msgstr "" #: tfrmoptionsbehavior.cbminimizetotray.caption #, fuzzy msgctxt "TFRMOPTIONSBEHAVIOR.CBMINIMIZETOTRAY.CAPTION" msgid "Mo&ve icon to system tray when minimized" msgstr "최소화 할 때 시스템 트레이로 아이콘 옮기기" #: tfrmoptionsbehavior.cbonlyonce.caption #, fuzzy #| msgid "Allow only one copy of DC at a time" msgctxt "TFRMOPTIONSBEHAVIOR.CBONLYONCE.CAPTION" msgid "A&llow only one copy of DC at a time" msgstr "더블 커맨더 중복 실행 금지" #: tfrmoptionsbehavior.edtdrivesblacklist.hint #, fuzzy msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "여기에 하나 이상의 드라이브(\";\"로 구분)를 입력할 수 있습니다." #: tfrmoptionsbehavior.lbldrivesblacklist.caption #, fuzzy #| msgid "Drives blacklist" msgid "Drives &blacklist" msgstr "드라이브 블랙리스트:" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption #, fuzzy #| msgid "Cut text to column width" msgid "Cut &text to column width" msgstr "열 너비만큼 텍스트 잘라내기" #: tfrmoptionscolumnsview.cbgridhorzline.caption #, fuzzy #| msgid "Horizontal lines" msgid "&Horizontal lines" msgstr "가로줄 표시선" #: tfrmoptionscolumnsview.cbgridvertline.caption #, fuzzy #| msgid "Vertical lines" msgid "&Vertical lines" msgstr "세로줄 표시선" #: tfrmoptionscolumnsview.chkautofillcolumns.caption #, fuzzy #| msgid "Auto fill columns" msgid "A&uto fill columns" msgstr "자동으로 열 채우기" #: tfrmoptionscolumnsview.gbshowgrid.caption #, fuzzy msgid "Show grid" msgstr "표시선 보이기" #: tfrmoptionscolumnsview.grpautosizecolumns.caption #, fuzzy msgid "Auto-size columns" msgstr "열 크기 자동 조절" #: tfrmoptionscolumnsview.lblautosizecolumn.caption #, fuzzy #| msgid "Auto size column:" msgid "Auto si&ze column:" msgstr "열 크기 자동 조절:" #: tfrmoptionsconfiguration.btnconfigapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGAPPLY.CAPTION" msgid "A&pply" msgstr "적용" #: tfrmoptionsconfiguration.btnconfigedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGEDIT.CAPTION" msgid "&Edit" msgstr "편집" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption #, fuzzy #| msgid "Command line history" msgid "Co&mmand line history" msgstr "명령행 히스토리" #: tfrmoptionsconfiguration.cbdirhistory.caption #, fuzzy #| msgid "Directory history" msgctxt "TFRMOPTIONSCONFIGURATION.CBDIRHISTORY.CAPTION" msgid "&Directory history" msgstr "폴더 히스토리" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption #, fuzzy #| msgid "File mask history" msgid "&File mask history" msgstr "파일 마스크 히스토리" #: tfrmoptionsconfiguration.chksaveconfiguration.caption #, fuzzy #| msgid "Save configuration" msgid "Sa&ve configuration" msgstr "설정 저장하기" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption #, fuzzy #| msgid "Search/Replace history" msgid "Searc&h/Replace history" msgstr "검색/바꾸기 히스토리" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgid "Location of configuration files" msgstr "환경설정 파일 위치" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgid "Save on exit" msgstr "종료할 때 저장" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgid "Set on command line" msgstr "명령행에 지정" #: tfrmoptionsconfiguration.rbprogramdir.caption #, fuzzy #| msgid "Program directory (portable version)" msgid "P&rogram directory (portable version)" msgstr "프로그램 폴더 (포터블 버전)" #: tfrmoptionsconfiguration.rbuserhomedir.caption #, fuzzy #| msgid "User home directory" msgid "&User home directory" msgstr "사용자 홈 폴더" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption #, fuzzy #| msgid "Copy" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNCOPYCOLUMNSSET.CAPTION" msgid "C&opy" msgstr "복사" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNDELCOLUMNSSET.CAPTION" msgid "&Delete" msgstr "삭제" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNEDITCOLUMNSSET.CAPTION" msgid "&Edit" msgstr "편집" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption #, fuzzy msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNNEWCOLUMNSSET.CAPTION" msgid "&New" msgstr "새 파일(&N)" #: tfrmoptionscustomcolumns.cbbfilesystem.text #, fuzzy msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.CBBFILESYSTEM.TEXT" msgid "General" msgstr "일반" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption #, fuzzy #| msgid "Configure columns for file system:" msgid "Con&figure columns for file system:" msgstr "파일 시스템별 열 설정" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption #, fuzzy #| msgid "Show confirmation dialog after drop" msgid "&Show confirmation dialog after drop" msgstr "드롭시 확인 대화상자 보이기" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption #, fuzzy #| msgid "Show file system" msgid "Show &file system" msgstr "파일 시스템 표시하기" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption #, fuzzy #| msgid "Show free space" msgid "Show fr&ee space" msgstr "여유 용량 표시하기" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption #, fuzzy #| msgid "Show label" msgid "Show &label" msgstr "레이블 표시하기" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "드라이브 목록" #: tfrmoptionseditorcolors.backgroundlabel.caption #, fuzzy #| msgid "Background" msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "배경 색상:" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption #, fuzzy #| msgid "Background" msgctxt "TFRMOPTIONSEDITORCOLORS.BACKGROUNDUSEDEFAULTCHECKBOX.CAPTION" msgid "Bac&kground" msgstr "배경 색상:" #: tfrmoptionseditorcolors.bvlattributesection.caption #, fuzzy msgid "Element Attributes" msgstr "요소 속성" #: tfrmoptionseditorcolors.foregroundlabel.caption #, fuzzy #| msgid "Foreground" msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "전경" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption #, fuzzy #| msgid "Foreground" msgctxt "TFRMOPTIONSEDITORCOLORS.FOREGROUNDUSEDEFAULTCHECKBOX.CAPTION" msgid "Fo®round" msgstr "전경" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption #, fuzzy #| msgid "Text-mark" msgid "&Text-mark" msgstr "텍스트 선택" #: tfrmoptionseditorcolors.tbtnglobal.caption #, fuzzy #| msgid "Use (and edit) global scheme settings" msgid "Use (and edit) &global scheme settings" msgstr "일괄 설정(편집)하기" #: tfrmoptionseditorcolors.tbtnlocal.caption #, fuzzy #| msgid "Use local scheme settings" msgid "Use &local scheme settings" msgstr "개별 설정하기" #: tfrmoptionseditorcolors.textboldcheckbox.caption #, fuzzy #| msgid "Bold" msgid "&Bold" msgstr "굵게(&B)" #: tfrmoptionseditorcolors.textboldradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTBOLDRADIOINVERT.CAPTION" msgid "In&vert" msgstr "반전" #: tfrmoptionseditorcolors.textboldradiooff.caption #, fuzzy #| msgid "Off" msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTBOLDRADIOOFF.CAPTION" msgid "O&ff" msgstr "해제" #: tfrmoptionseditorcolors.textboldradioon.caption #, fuzzy #| msgid "On" msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTBOLDRADIOON.CAPTION" msgid "O&n" msgstr "사용" #: tfrmoptionseditorcolors.textitaliccheckbox.caption #, fuzzy #| msgid "Italic" msgid "&Italic" msgstr "기울임(&I)" #: tfrmoptionseditorcolors.textitalicradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTITALICRADIOINVERT.CAPTION" msgid "In&vert" msgstr "반전" #: tfrmoptionseditorcolors.textitalicradiooff.caption #, fuzzy #| msgid "Off" msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTITALICRADIOOFF.CAPTION" msgid "O&ff" msgstr "해제" #: tfrmoptionseditorcolors.textitalicradioon.caption #, fuzzy #| msgid "On" msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTITALICRADIOON.CAPTION" msgid "O&n" msgstr "사용" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption #, fuzzy #| msgid "Strike Out" msgid "&Strike Out" msgstr "취소선(&S)" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTRADIOINVERT.CAPTION" msgid "In&vert" msgstr "반전" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption #, fuzzy #| msgid "Off" msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTRADIOOFF.CAPTION" msgid "O&ff" msgstr "사용" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption #, fuzzy #| msgid "On" msgctxt "TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTRADIOON.CAPTION" msgid "O&n" msgstr "사용" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption #, fuzzy #| msgid "Underline" msgid "&Underline" msgstr "밑줄(&U)" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "반전" #: tfrmoptionseditorcolors.textunderlineradiooff.caption #, fuzzy #| msgid "Off" msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "해제" #: tfrmoptionseditorcolors.textunderlineradioon.caption #, fuzzy #| msgid "On" msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "사용" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "" #: tfrmoptionsfileoperations.cbdeletetotrash.caption #, fuzzy #| msgid "Delete to recycle bin (Shift key reverses this setting)" msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "삭제시 휴지통으로 (Shift 키는 이 설정을 반대로 함)" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDROPREADONLYFLAG.CAPTION" msgid "D&rop readonly flag" msgstr "읽기전용 속성 제거하기" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name" msgid "&Search for part of file name" msgstr "파일명의 일부 검색하기" #: tfrmoptionsfileoperations.cbprocesscomments.caption #, fuzzy #| msgid "Process comments with files/folders" msgid "&Process comments with files/folders" msgstr "파일/폴더와 함께 주석 처리하기" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption #, fuzzy #| msgid "Select file name without extension when renaming" msgid "Select &file name without extension when renaming" msgstr "이름 바꾸기를 할 때 파일명만 선택하기 (확장자 제외)" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption #, fuzzy #| msgid "Show tab select panel in copy/move dialog" msgid "Sho&w tab select panel in copy/move dialog" msgstr "복사/이동 대화상자에서 탭 선택 패널 보이기" #: tfrmoptionsfileoperations.cbskipfileoperror.caption #, fuzzy #| msgid "Skip file operations errors and write them to log window" msgid "S&kip file operations errors and write them to log window" msgstr "파일 작업 오류 건너뛰기 및 로그 창에 기록하기" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "작업 실행하기" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "tfrmoptionsfileoperations.gbfilesearch.caption" msgid "File search" msgstr "파일 찾기" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "사용자 인터페이스" #: tfrmoptionsfileoperations.lblbuffersize.caption #, fuzzy #| msgid "Buffer size for file operations (in KB):" msgid "&Buffer size for file operations (in KB):" msgstr "파일 작업용 버퍼 크기 (KB):" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "" #: tfrmoptionsfileoperations.lblprogresskind.caption #, fuzzy #| msgid "Show operations progress initially in" msgid "Show operations progress &initially in" msgstr "처음에 작업 진행을 보여주는 방법: " #: tfrmoptionsfileoperations.lblwipepassnumber.caption #, fuzzy #| msgid "Number of wipe passes:" msgid "&Number of wipe passes:" msgstr "반복하여 지우기 횟수:" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption #, fuzzy #| msgid "Use memory mapping for search text in files" msgid "Use memory mapping for search te&xt in files" msgstr "파일에서 텍스트를 검색할 때 메모리 매핑 사용하기" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption #, fuzzy #| msgid "Use stream for search text in files" msgid "&Use stream for search text in files" msgstr "파일에서 텍스트 검색할 때 스트림 사용" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption #, fuzzy msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption #, fuzzy msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption #, fuzzy msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption #, fuzzy msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption #, fuzzy msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption #, fuzzy msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption #, fuzzy msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption #, fuzzy msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption #, fuzzy #| msgid "Use Frame Cursor" msgid "Use &Frame Cursor" msgstr "커서 테두리 사용" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption #, fuzzy #| msgid "Use Gradient Indicator" msgid "Use &Gradient Indicator" msgstr "표시기에 그래디언트 효과(자연스러운 색상 변화) 사용하기" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption #, fuzzy #| msgid "Use Inverted Selection" msgid "U&se Inverted Selection" msgstr "선택 반전 사용" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.DBFREESPACEINDICATOR.CAPTION" msgid "Drive Free Space Indicator" msgstr "드라이브 여유 공간 표시기" #: tfrmoptionsfilepanelscolors.gbexample.caption #, fuzzy msgctxt "TFRMOPTIONSFILEPANELSCOLORS.GBEXAMPLE.CAPTION" msgid "Example" msgstr "예시" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption #, fuzzy #| msgid "Background:" msgid "Bac&kground:" msgstr "배경 색상:" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption #, fuzzy #| msgid "Background 2:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR2.CAPTION" msgid "Backg&round 2:" msgstr "배경 색상 2:" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption #, fuzzy #| msgid "Cursor Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORCOLOR.CAPTION" msgid "C&ursor Color:" msgstr "커서 색상:" #: tfrmoptionsfilepanelscolors.lblcursortext.caption #, fuzzy #| msgid "Cursor Text:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORTEXT.CAPTION" msgid "Cursor Te&xt:" msgstr "커서 글꼴:" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption #, fuzzy #| msgid "Brightness level of inactive panel" msgid "&Brightness level of inactive panel" msgstr "비활성 패널의 밝기 정도" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption #, fuzzy #| msgid "Indicator Back Color:" msgid "In&dicator Back Color:" msgstr "표시기 배경 색상:" #: tfrmoptionsfilepanelscolors.lblindcolor.caption #, fuzzy #| msgid "Indicator Fore Color:" msgid "&Indicator Fore Color:" msgstr "표시기 전경 색상" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption #, fuzzy #| msgid "Mark Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLMARKCOLOR.CAPTION" msgid "&Mark Color:" msgstr "선택 색상:" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption #, fuzzy #| msgid "Text Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLTEXTCOLOR.CAPTION" msgid "T&ext Color:" msgstr "글꼴 색상:" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption #, fuzzy #| msgid "Don't load file list until a tab is activated" msgid "Do&n't load file list until a tab is activated" msgstr "탭 활성화시에만 파일을 불러오기" #: tfrmoptionsfilesviews.cbdirbrackets.caption #, fuzzy #| msgid "Show square brackets around directories" msgid "S&how square brackets around directories" msgstr "폴더 이름 양 옆에 대괄호 [] 보이기" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption #, fuzzy #| msgid "Highlight new and updated files" msgid "Hi&ghlight new and updated files" msgstr "새파일/업데이트된 파일 강조하기" #: tfrmoptionsfilesviews.cblistfilesinthread.caption #, fuzzy #| msgid "Load file list in separate thread" msgctxt "TFRMOPTIONSFILESVIEWS.CBLISTFILESINTHREAD.CAPTION" msgid "Load &file list in separate thread" msgstr "파일 목록을 분리된 쓰레드에서 읽어오기" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption #, fuzzy #| msgid "Load icons after file list" msgctxt "TFRMOPTIONSFILESVIEWS.CBLOADICONSSEPARATELY.CAPTION" msgid "Load icons af&ter file list" msgstr "파일 목록 읽은 후에 아이콘 읽어오기" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption #, fuzzy #| msgid "Show system and hidden files" msgctxt "TFRMOPTIONSFILESVIEWS.CBSHOWSYSTEMFILES.CAPTION" msgid "Show s&ystem and hidden files" msgstr "숨김/시스템 파일 보기" #: tfrmoptionsfilesviews.cbspacemovesdown.caption #, fuzzy #| msgid "When selecting files with , move down to next file (as with )" msgid "&When selecting files with , move down to next file (as with )" msgstr "<스페이스바>로 파일 선택 시, 다음 파일로 이동 (<인서트>처럼 동작)" #: tfrmoptionsfilesviews.gbformatting.caption #, fuzzy msgid "Formatting" msgstr "형식" #: tfrmoptionsfilesviews.gbsorting.caption msgid "Sorting" msgstr "정렬" #: tfrmoptionsfilesviews.lblcasesensitivity.caption #, fuzzy #| msgid "Case sensitivity:" msgid "Case s&ensitivity:" msgstr "대/소문자 구별" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeformat.caption #, fuzzy #| msgid "Date and time format:" msgid "&Date and time format:" msgstr "날짜 및 시간 형식:" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "" #: tfrmoptionsfilesviews.lblnewfilesposition.caption #, fuzzy #| msgid "Insert new files" msgid "&Insert new files" msgstr "새 파일 삽입" #: tfrmoptionsfilesviews.lblsortfoldermode.caption #, fuzzy #| msgid "Sorting directories:" msgid "So&rting directories:" msgstr "폴더 정렬" #: tfrmoptionsfilesviews.lblsortmethod.caption #, fuzzy #| msgid "Sort &method:" msgid "&Sort method:" msgstr "정렬 방식" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption #, fuzzy #| msgid "Move updated files" msgid "&Move updated files" msgstr "갱신된 파일 이동" #: tfrmoptionsfiletypescolors.btnaddcategory.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNADDCATEGORY.CAPTION" msgid "A&dd" msgstr "추가" #: tfrmoptionsfiletypescolors.btnapplycategory.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNAPPLYCATEGORY.CAPTION" msgid "A&pply" msgstr "적용" #: tfrmoptionsfiletypescolors.btncategorycolor.caption #, fuzzy msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNCATEGORYCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNDELETECATEGORY.CAPTION" msgid "D&elete" msgstr "삭제" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint #, fuzzy msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "템플릿..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption #, fuzzy msgid "File types colors (sort by drag&&drop)" msgstr "파일 형식 색상 (드래그&&드롭으로 정렬)" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption #, fuzzy #| msgid "Category attributes:" msgid "Category a&ttributes:" msgstr "카테고리 속성:" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption #, fuzzy #| msgid "Category color:" msgid "Category co&lor:" msgstr "카테고리 색상:" #: tfrmoptionsfiletypescolors.lblcategorymask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYMASK.CAPTION" msgid "Category &mask:" msgstr "카테고리 마스크:" #: tfrmoptionsfiletypescolors.lblcategoryname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYNAME.CAPTION" msgid "Category &name:" msgstr "카테고리 이름:" #: tfrmoptionsfonts.btnseleditfnt.caption #, fuzzy msgctxt "TFRMOPTIONSFONTS.BTNSELEDITFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnsellogfnt.caption #, fuzzy msgctxt "TFRMOPTIONSFONTS.BTNSELLOGFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselmainfnt.caption #, fuzzy msgctxt "TFRMOPTIONSFONTS.BTNSELMAINFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption #, fuzzy msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWERBOOKFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewfnt.caption #, fuzzy msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.lbleditorfont.caption #, fuzzy #| msgid "Editor font" msgctxt "TFRMOPTIONSFONTS.LBLEDITORFONT.CAPTION" msgid "&Editor font" msgstr "편집기 글꼴" #: tfrmoptionsfonts.lbllogfont.caption #, fuzzy #| msgid "Log font" msgctxt "TFRMOPTIONSFONTS.LBLLOGFONT.CAPTION" msgid "&Log font" msgstr "로그 글꼴" #: tfrmoptionsfonts.lblmainfont.caption #, fuzzy #| msgid "Main font" msgctxt "TFRMOPTIONSFONTS.LBLMAINFONT.CAPTION" msgid "Main &font" msgstr "메인 창 글꼴" #: tfrmoptionsfonts.lblviewerbookfont.caption #, fuzzy #| msgid "Viewer Book Font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERBOOKFONT.CAPTION" msgid "Viewer&Book Font" msgstr "책 뷰어 글꼴" #: tfrmoptionsfonts.lblviewerfont.caption #, fuzzy #| msgid "Viewer font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERFONT.CAPTION" msgid "&Viewer font" msgstr "뷰어 글꼴" #: tfrmoptionshotkeys.btnaddhotkey.caption #, fuzzy #| msgid "Add hotkey" msgid "Add &hotkey" msgstr "단축키 추가하기" #: tfrmoptionshotkeys.btndeletehotkey.caption #, fuzzy #| msgid "Delete hotkey" msgid "&Delete hotkey" msgstr "단축키 삭제하기" #: tfrmoptionshotkeys.btnedithotkey.caption #, fuzzy #| msgid "Edit hotkey" msgctxt "tfrmoptionshotkeys.btnedithotkey.caption" msgid "&Edit hotkey" msgstr "단축키 편집하기" #: tfrmoptionshotkeys.lbfilter.caption #, fuzzy #| msgid "Filter" msgctxt "TFRMOPTIONSHOTKEYS.LBFILTER.CAPTION" msgid "&Filter" msgstr "필터" #: tfrmoptionshotkeys.lblcategories.caption #, fuzzy #| msgid "Categories:" msgctxt "TFRMOPTIONSHOTKEYS.LBLCATEGORIES.CAPTION" msgid "C&ategories:" msgstr "카테고리:" #: tfrmoptionshotkeys.lblcommands.caption #, fuzzy #| msgid "Commands:" msgctxt "TFRMOPTIONSHOTKEYS.LBLCOMMANDS.CAPTION" msgid "Co&mmands:" msgstr "명령어:" #: tfrmoptionshotkeys.lblscfiles.caption #, fuzzy #| msgid "Shortcut files:" msgctxt "TFRMOPTIONSHOTKEYS.LBLSCFILES.CAPTION" msgid "&Shortcut files:" msgstr "바로가기 파일:" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption #, fuzzy msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[0].TITLE.CAPTION" msgid "Hotkey" msgstr "단축키" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption #, fuzzy msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[1].TITLE.CAPTION" msgid "Parameters" msgstr "변수들" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption #, fuzzy msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[2].TITLE.CAPTION" msgid "Controls" msgstr "제어" #: tfrmoptionsicons.cbiconsexclude.caption #, fuzzy msgctxt "TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "다음 경로와 하위폴더:" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "" #: tfrmoptionsicons.cbiconsinmenussize.text #, fuzzy msgctxt "tfrmoptionsicons.cbiconsinmenussize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption #, fuzzy #| msgid "Show overlay i&cons, e.g. for links" msgctxt "TFRMOPTIONSICONS.CBICONSSHOWOVERLAY.CAPTION" msgid "Show o&verlay icons, e.g. for links" msgstr "오버레이 아이콘 보이기(링크에 표시되는 것과 같은)(&C)" #: tfrmoptionsicons.cbiconssize.text #, fuzzy msgctxt "TFRMOPTIONSICONS.CBICONSSIZE.TEXT" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "" #: tfrmoptionsicons.gbiconssize.caption #, fuzzy #| msgid " Icon &size " msgctxt "TFRMOPTIONSICONS.GBICONSSIZE.CAPTION" msgid " Icon size " msgstr "아이콘 크기(&S)" #: tfrmoptionsicons.gbshowiconsmode.caption #, fuzzy msgctxt "TFRMOPTIONSICONS.GBSHOWICONSMODE.CAPTION" msgid " Show icons to the left of the filename " msgstr "파일명 왼쪽에 아이콘 보이기" #: tfrmoptionsicons.rbiconsshowall.caption #, fuzzy #| msgid "&All" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALL.CAPTION" msgid "A&ll" msgstr "전부(&A)" #: tfrmoptionsicons.rbiconsshowallandexe.caption #, fuzzy msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALLANDEXE.CAPTION" msgid "All associated + &EXE/LNK (slow)" msgstr "모든 연결된 파일 + &EXE/LNK (느림)" #: tfrmoptionsicons.rbiconsshownone.caption #, fuzzy msgctxt "TFRMOPTIONSICONS.RBICONSSHOWNONE.CAPTION" msgid "&No icons" msgstr "표시 안함(&N)" #: tfrmoptionsicons.rbiconsshowstandard.caption #, fuzzy #| msgid "&Only standard icons" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWSTANDARD.CAPTION" msgid "Only &standard icons" msgstr "표준 아이콘(&O)" #: tfrmoptionsignorelist.btnaddsel.caption #, fuzzy #| msgid "&Add selected names" msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSEL.CAPTION" msgid "A&dd selected names" msgstr "선택된 이름 추가(&A)" #: tfrmoptionsignorelist.btnaddselwithpath.caption #, fuzzy msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSELWITHPATH.CAPTION" msgid "Add selected names with &full path" msgstr "선택된 이름 경로명 포함해서 추가(&F)" #: tfrmoptionsignorelist.chkignoreenable.caption #, fuzzy msgctxt "TFRMOPTIONSIGNORELIST.CHKIGNOREENABLE.CAPTION" msgid "&Ignore (don't show) the following files and folders:" msgstr "다음 파일과 폴더를 무시하기(보이지 않기):" #: tfrmoptionsignorelist.lblsavein.caption #, fuzzy msgctxt "TFRMOPTIONSIGNORELIST.LBLSAVEIN.CAPTION" msgid "&Save in:" msgstr "저장(&S):" #: tfrmoptionskeyboard.cblynxlike.caption #, fuzzy #| msgid "Left, Right arrows change directory (Lynx-like movement)" msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "좌우 화살표 키로 폴더 변경하기 (Lynx처럼 동작)" #: tfrmoptionskeyboard.gbtyping.caption #, fuzzy msgid "Typing" msgstr "입력" #: tfrmoptionskeyboard.lblalt.caption #, fuzzy #| msgid "Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLALT.CAPTION" msgid "Alt+L&etters" msgstr "Alt+문자" #: tfrmoptionskeyboard.lblctrlalt.caption #, fuzzy #| msgid "Ctrl+Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLCTRLALT.CAPTION" msgid "Ctrl+Alt+Le&tters" msgstr "Ctrl+Alt+문자" #: tfrmoptionskeyboard.lblnomodifier.caption #, fuzzy #| msgid "Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLNOMODIFIER.CAPTION" msgid "&Letters" msgstr "문자" #: tfrmoptionslayout.cbflatdiskpanel.caption #, fuzzy #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATDISKPANEL.CAPTION" msgid "&Flat buttons" msgstr "평평한 버튼" #: tfrmoptionslayout.cbflatinterface.caption #, fuzzy #| msgid "Flat interface" msgctxt "TFRMOPTIONSLAYOUT.CBFLATINTERFACE.CAPTION" msgid "Flat i&nterface" msgstr "평평한 인터페이스" #: tfrmoptionslayout.cbflattoolbar.caption #, fuzzy #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATTOOLBAR.CAPTION" msgid "Flat b&uttons" msgstr "평평한 버튼" #: tfrmoptionslayout.cbfreespaceind.caption #, fuzzy #| msgid "Show free space indicator on drive label" msgctxt "TFRMOPTIONSLAYOUT.CBFREESPACEIND.CAPTION" msgid "Show fr&ee space indicator on drive label" msgstr "드라이브 레이블에 여유 공간 표시기 보이기" #: tfrmoptionslayout.cblogwindow.caption #, fuzzy #| msgid "Show log window" msgctxt "TFRMOPTIONSLAYOUT.CBLOGWINDOW.CAPTION" msgid "Show lo&g window" msgstr "로그 창 보이기" #: tfrmoptionslayout.cbpanelofoperations.caption #, fuzzy msgctxt "TFRMOPTIONSLAYOUT.CBPANELOFOPERATIONS.CAPTION" msgid "Show panel of operation in background" msgstr "작업 패널을 백그라운드로 보이기" #: tfrmoptionslayout.cbproginmenubar.caption #, fuzzy msgctxt "TFRMOPTIONSLAYOUT.CBPROGINMENUBAR.CAPTION" msgid "Show common progress in menu bar" msgstr "메뉴 바에 일반 작업 처리 보이기" #: tfrmoptionslayout.cbshowcmdline.caption #, fuzzy #| msgid "Show command &line" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCMDLINE.CAPTION" msgid "Show command l&ine" msgstr "명령행 보이기(&L)" #: tfrmoptionslayout.cbshowcurdir.caption #, fuzzy #| msgid "Show ¤t directory" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCURDIR.CAPTION" msgid "Show current director&y" msgstr "현재 폴더 보이기(&C)" #: tfrmoptionslayout.cbshowdiskpanel.caption #, fuzzy msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDISKPANEL.CAPTION" msgid "Show &drive buttons" msgstr "드라이브 버튼 보이기(&D)" #: tfrmoptionslayout.cbshowdrivefreespace.caption #, fuzzy #| msgid "Show free space label" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDRIVEFREESPACE.CAPTION" msgid "Show free s&pace label" msgstr "여유 공간 레이블 보이기" #: tfrmoptionslayout.cbshowdriveslistbutton.caption #, fuzzy #| msgid "Show d&rives list button" msgid "Show drives list bu&tton" msgstr "드라이브 목록 버튼 보이기(&R)" #: tfrmoptionslayout.cbshowkeyspanel.caption #, fuzzy #| msgid "Show &function key buttons" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWKEYSPANEL.CAPTION" msgid "Show function &key buttons" msgstr "단축키 버튼 표시줄 보이기(&F)" #: tfrmoptionslayout.cbshowmainmenu.caption #, fuzzy #| msgid "Show main menu" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINMENU.CAPTION" msgid "Show &main menu" msgstr "메인 메뉴 보이기" #: tfrmoptionslayout.cbshowmaintoolbar.caption #, fuzzy msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINTOOLBAR.CAPTION" msgid "Show &button bar" msgstr "도구모음 보이기(&B)" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption #, fuzzy #| msgid "Show short free space label" msgid "Show short free space &label" msgstr "짧은 여유 공간 레이블 보이기" #: tfrmoptionslayout.cbshowstatusbar.caption #, fuzzy msgctxt "TFRMOPTIONSLAYOUT.CBSHOWSTATUSBAR.CAPTION" msgid "Show &status bar" msgstr "상태 표시줄 보이기(&S)" #: tfrmoptionslayout.cbshowtabheader.caption #, fuzzy #| msgid "Show &tabstop header" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABHEADER.CAPTION" msgid "S&how tabstop header" msgstr "구분 탭 보이기(&T)" #: tfrmoptionslayout.cbshowtabs.caption #, fuzzy msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABS.CAPTION" msgid "Sho&w folder tabs" msgstr "폴더 탭 보이기(&W)" #: tfrmoptionslayout.cbtermwindow.caption #, fuzzy #| msgid "Show terminal window" msgctxt "TFRMOPTIONSLAYOUT.CBTERMWINDOW.CAPTION" msgid "Show te&rminal window" msgstr "명령 프롬프트 창 보이기" #: tfrmoptionslayout.cbtwodiskpanels.caption #, fuzzy #| msgid "Show two drive button bars (fixed width, above file windows)" msgctxt "TFRMOPTIONSLAYOUT.CBTWODISKPANELS.CAPTION" msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "두 개의 드라이브 버튼바 보이기 (파일창 위에 고정)" #: tfrmoptionslayout.gbscreenlayout.caption #, fuzzy msgctxt "TFRMOPTIONSLAYOUT.GBSCREENLAYOUT.CAPTION" msgid " Screen layout " msgstr " 화면 레이아웃 " #: tfrmoptionslog.cblogarcop.caption #, fuzzy #| msgid "Pack/Unpack" msgctxt "TFRMOPTIONSLOG.CBLOGARCOP.CAPTION" msgid "&Pack/Unpack" msgstr "압축/해제" #: tfrmoptionslog.cblogcpmvln.caption #, fuzzy #| msgid "Copy/Move/Create link/symlink" msgctxt "TFRMOPTIONSLOG.CBLOGCPMVLN.CAPTION" msgid "Cop&y/Move/Create link/symlink" msgstr "링크 및 심링크 복사/이동/생성" #: tfrmoptionslog.cblogdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSLOG.CBLOGDELETE.CAPTION" msgid "&Delete" msgstr "삭제" #: tfrmoptionslog.cblogdirop.caption #, fuzzy #| msgid "Create/Delete directories" msgctxt "TFRMOPTIONSLOG.CBLOGDIROP.CAPTION" msgid "Crea&te/Delete directories" msgstr "폴더 생성/삭제" #: tfrmoptionslog.cblogerrors.caption #, fuzzy msgctxt "TFRMOPTIONSLOG.CBLOGERRORS.CAPTION" msgid "Log &errors" msgstr "오류 로그(&E)" #: tfrmoptionslog.cblogfile.caption #, fuzzy #| msgid "&Create a log file:" msgctxt "TFRMOPTIONSLOG.CBLOGFILE.CAPTION" msgid "C&reate a log file:" msgstr "로그 파일 만들기(&C)" #: tfrmoptionslog.cbloginfo.caption #, fuzzy #| msgid "Log information messages" msgctxt "TFRMOPTIONSLOG.CBLOGINFO.CAPTION" msgid "Log &information messages" msgstr "정보 메시지 로그" #: tfrmoptionslog.cblogsuccess.caption #, fuzzy msgctxt "TFRMOPTIONSLOG.CBLOGSUCCESS.CAPTION" msgid "Log &successful operations" msgstr "성공한 작업 로그(&S)" #: tfrmoptionslog.cblogvfs.caption #, fuzzy #| msgid "File system plugins" msgctxt "TFRMOPTIONSLOG.CBLOGVFS.CAPTION" msgid "&File system plugins" msgstr "파일 시스템 플러그인" #: tfrmoptionslog.gblogfile.caption #, fuzzy msgctxt "TFRMOPTIONSLOG.GBLOGFILE.CAPTION" msgid "File operation log file" msgstr "파일 작업 로그 파일" #: tfrmoptionslog.gblogfileop.caption #, fuzzy msgid "Log operations" msgstr "작업 로그:" #: tfrmoptionslog.gblogfilestatus.caption #, fuzzy msgid "Operation status" msgstr "작업 상태:" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "" #: tfrmoptionsmisc.chkshowwarningmessages.caption #, fuzzy #| msgid "Show warning messages (\"OK\" button only)" msgctxt "tfrmoptionsmisc.chkshowwarningmessages.caption" msgid "Show &warning messages (\"OK\" button only)" msgstr "경고 메시지 보이기 (\"확인\" 버튼만)" #: tfrmoptionsmisc.chkthumbsave.caption #, fuzzy #| msgid "Save thumbnails in cache" msgctxt "tfrmoptionsmisc.chkthumbsave.caption" msgid "&Save thumbnails in cache" msgstr "썸네일을 캐쉬에 저장하기" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "tfrmoptionsmisc.dblthumbnails.caption" msgid "Thumbnails" msgstr "" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "tfrmoptionsmisc.lblthumbseparator.caption" msgid "X" msgstr "" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "" #: tfrmoptionsmouse.cbselectionbymouse.caption #, fuzzy #| msgid "Selection by mouse" msgid "&Selection by mouse" msgstr "마우스로 선택하기" #: tfrmoptionsmouse.gbscrolling.caption #, fuzzy msgid "Scrolling" msgstr "스크롤" #: tfrmoptionsmouse.gbselection.caption #, fuzzy msgid "Selection" msgstr "선택" #: tfrmoptionsmouse.lblmousemode.caption #, fuzzy #| msgid "Mode:" msgid "&Mode:" msgstr "모드:" #: tfrmoptionsmouse.rbscrolllinebyline.caption #, fuzzy #| msgid "Line by line" msgid "&Line by line" msgstr "지정 줄간격만큼" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption #, fuzzy #| msgid "Line by line with cursor movement" msgid "Line by line &with cursor movement" msgstr "커서 이동과 함께 한줄씩" #: tfrmoptionsmouse.rbscrollpagebypage.caption #, fuzzy #| msgid "Page by page" msgid "&Page by page" msgstr "한 페이지씩" #: tfrmoptionsplugins.btnaddplugin.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "추가" #: tfrmoptionsplugins.btnconfigplugin.caption #, fuzzy #| msgid "Configure" msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "설정" #: tfrmoptionsplugins.btnenableplugin.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "사용하기" #: tfrmoptionsplugins.btnremoveplugin.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "제거" #: tfrmoptionsplugins.btntweakplugin.caption #, fuzzy #| msgid "Tweak" msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "트윅" #: tfrmoptionsplugins.lbldsxdescription.caption #, fuzzy #| msgid "Search plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "검색 플러그인으로 다른 검색 알고리듬 또는 외부 도구(\"locate\" 처럼)를 사용할 수 있습니다." #: tfrmoptionsplugins.lblwcxdescription.caption #, fuzzy #| msgid "Packer plugins are used to work with archives." msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "압축기 플러그인으로 압축 파일을 다룹니다." #: tfrmoptionsplugins.lblwdxdescription.caption #, fuzzy #| msgid "Content plugins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "컨텐츠 플러그인은 파일 목록에서 mp3 태그 또는 이미지 속성 등과 같은 확장된 파일 정보를 보여주거나, 그러한 정보를 파일 찾기나 파일명 일괄 변경시에 이용할 수 있습니다." #: tfrmoptionsplugins.lblwfxdescription.caption #, fuzzy #| msgid "File system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "파일 시스템 플러그인을 이용하여 운영체제에서 접근할 수 없는 디스크 또는 또는 Palm/PocketPC 등과 같은 외부 기기에 접근할 수 있습니다." #: tfrmoptionsplugins.lblwlxdescription.caption #, fuzzy #| msgid "Viewer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "뷰어 플러그인은 뷰어에서 이미지, 스프레드시트, 데이터베이스 등의 파일 형식을 보여줍니다. (F3, Ctrl+Q)" #: tfrmoptionsplugins.stgplugins.columns[0].title.caption #, fuzzy msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[0].TITLE.CAPTION" msgid "Active" msgstr "활성" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption #, fuzzy msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[1].TITLE.CAPTION" msgid "Plugin" msgstr "플러그인" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption #, fuzzy msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[2].TITLE.CAPTION" msgid "Registered for" msgstr "등록" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption #, fuzzy msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[3].TITLE.CAPTION" msgid "File name" msgstr "파일명" #: tfrmoptionsplugins.tsdsx.caption #, fuzzy #| msgid "Search plugins (.DSX)" msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "찾기 플러그인 (.DSX)" #: tfrmoptionsplugins.tswcx.caption #, fuzzy #| msgid "Packer plugins (.WCX)" msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "압축기 플러그인 (.WCX)" #: tfrmoptionsplugins.tswdx.caption #, fuzzy #| msgid "Content plugins (.WDX)" msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "컨텐츠 플러그인 (.WDX)" #: tfrmoptionsplugins.tswfx.caption #, fuzzy #| msgid "File system plugins (.WFX)" msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "파일 시스템 플러그인 (.WFX)" #: tfrmoptionsplugins.tswlx.caption #, fuzzy #| msgid "Viewer plugins (.WLX)" msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "뷰어 플러그인 (.WLX)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption #, fuzzy msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTBEGINNING.CAPTION" msgid "&Beginning (name must start with first typed character)" msgstr "앞에서 (맨 앞부터 한 문자씩 일치하는 이름으로 찾기)(&B)" #: tfrmoptionsquicksearchfilter.cbexactending.caption #, fuzzy msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTENDING.CAPTION" msgid "En&ding (last character before a typed dot . must match)" msgstr "뒤에서 (점.을 기준으로 가까운 한 문자씩 일치하는 이름으로 찾기)(&D)" #: tfrmoptionsquicksearchfilter.cgpoptions.caption #, fuzzy msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CGPOPTIONS.CAPTION" msgid "Options" msgstr "옵션" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption #, fuzzy msgid "Exact name match" msgstr "일치하는 이름 찾기" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption #, fuzzy msgid "Search case" msgstr "대소문자 찾기" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption #, fuzzy msgid "Search for these items" msgstr "파일명의 일부 검색하기" #: tfrmoptionstabs.cbtabsactivateonclick.caption #, fuzzy msgctxt "TFRMOPTIONSTABS.CBTABSACTIVATEONCLICK.CAPTION" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "탭 클릭 시 대상 패널 활성화(&P)" #: tfrmoptionstabs.cbtabsalwaysvisible.caption #, fuzzy msgctxt "TFRMOPTIONSTABS.CBTABSALWAYSVISIBLE.CAPTION" msgid "&Show tab header also when there is only one tab" msgstr "탭이 하나만 있어도 탭 보이기(&S)" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption #, fuzzy #| msgid "&Confirm close all tabs" msgctxt "TFRMOPTIONSTABS.CBTABSCONFIRMCLOSEALL.CAPTION" msgid "Con&firm close all tabs" msgstr "모든 탭을 닫을 때 확인(&C)" #: tfrmoptionstabs.cbtabslimitoption.caption #, fuzzy msgctxt "TFRMOPTIONSTABS.CBTABSLIMITOPTION.CAPTION" msgid "&Limit tab title length to" msgstr "탭 이름 너비 제한(&L):" #: tfrmoptionstabs.cbtabslockedasterisk.caption #, fuzzy msgctxt "TFRMOPTIONSTABS.CBTABSLOCKEDASTERISK.CAPTION" msgid "Show locked tabs &with an asterisk *" msgstr "잠긴 탭에 별표 * 보이기(&W)" #: tfrmoptionstabs.cbtabsmultilines.caption #, fuzzy msgctxt "TFRMOPTIONSTABS.CBTABSMULTILINES.CAPTION" msgid "&Tabs on multiple lines" msgstr "다중 라인으로 탭 정렬(&T)" #: tfrmoptionstabs.cbtabsopenforeground.caption #, fuzzy msgctxt "TFRMOPTIONSTABS.CBTABSOPENFOREGROUND.CAPTION" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Ctrl+Up으로 새 탭을 최상위에 열기(&U)" #: tfrmoptionstabs.cbtabsopennearcurrent.caption #, fuzzy msgctxt "TFRMOPTIONSTABS.CBTABSOPENNEARCURRENT.CAPTION" msgid "Open &new tabs near current tab" msgstr "현재 탭 옆에 새 탭 열기(&N)" #: tfrmoptionstabs.cbtabsshowclosebutton.caption #, fuzzy #| msgid "Show tab close button" msgctxt "TFRMOPTIONSTABS.CBTABSSHOWCLOSEBUTTON.CAPTION" msgid "Show ta&b close button" msgstr "탭 닫기 버튼 보이기" #: tfrmoptionstabs.gbtabs.caption #, fuzzy msgctxt "TFRMOPTIONSTABS.GBTABS.CAPTION" msgid "Folder tabs headers" msgstr "폴더 탭 이름 표시줄" #: tfrmoptionstabs.lblchar.caption #, fuzzy msgctxt "TFRMOPTIONSTABS.LBLCHAR.CAPTION" msgid "characters" msgstr "문자" #: tfrmoptionstabs.lbltabsposition.caption #, fuzzy #| msgid "Tabs position" msgctxt "TFRMOPTIONSTABS.LBLTABSPOSITION.CAPTION" msgid "Ta&bs position" msgstr "탭 위치" #: tfrmoptionsterminal.lblruninterm.caption #, fuzzy #| msgid "Run in terminal:" msgid "Run in &terminal:" msgstr "명령 프롬프트에서 실행:" #: tfrmoptionsterminal.lblrunterm.caption #, fuzzy #| msgid "Run terminal:" msgid "Run t&erminal:" msgstr "명령 프롬프트 실행:" #: tfrmoptionstoolbar.btnclonebutton.caption #, fuzzy #| msgid "&Clone button" msgctxt "tfrmoptionstoolbar.btnclonebutton.caption" msgid "C&lone button" msgstr "버튼복제(&N)" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "tfrmoptionstoolbar.btndeletebutton.caption" msgid "&Delete" msgstr "삭제하기(&D)" #: tfrmoptionstoolbar.btnedithotkey.caption #, fuzzy #| msgid "Edit hotkey" msgctxt "tfrmoptionstoolbar.btnedithotkey.caption" msgid "Edit hot&key" msgstr "편집" #: tfrmoptionstoolbar.btninsertbutton.caption #, fuzzy #| msgid "&Insert new buttonX" msgctxt "tfrmoptionstoolbar.btninsertbutton.caption" msgid "&Insert new button" msgstr "새 버튼 삽입(&I)" #: tfrmoptionstoolbar.btnopenfile.caption #, fuzzy msgctxt "tfrmoptionstoolbar.btnopenfile.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnopenicon.caption #, fuzzy msgctxt "tfrmoptionstoolbar.btnopenicon.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnremovehotkey.caption msgctxt "tfrmoptionstoolbar.btnremovehotkey.caption" msgid "Remove hotke&y" msgstr "" #: tfrmoptionstoolbar.cbflatbuttons.caption #, fuzzy #| msgid "Flat b&uttons" msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "평평한 버튼(&U)" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "" #: tfrmoptionstoolbar.gbgroupbox.caption #, fuzzy msgctxt "tfrmoptionstoolbar.gbgroupbox.caption" msgid "Appearance" msgstr "외형" #: tfrmoptionstoolbar.lblbarsize.caption #, fuzzy #| msgid "Ba&r size:" msgctxt "tfrmoptionstoolbar.lblbarsize.caption" msgid "&Bar size:" msgstr "바 크기" #: tfrmoptionstoolbar.lblexternalcommand.caption msgctxt "tfrmoptionstoolbar.lblexternalcommand.caption" msgid "Comman&d:" msgstr "" #: tfrmoptionstoolbar.lblexternalparameters.caption msgctxt "tfrmoptionstoolbar.lblexternalparameters.caption" msgid "Parameter&s:" msgstr "" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "" #: tfrmoptionstoolbar.lbliconfile.caption #, fuzzy #| msgid "Icon:" msgctxt "tfrmoptionstoolbar.lbliconfile.caption" msgid "Ico&n:" msgstr "아이콘 파일(&F):" #: tfrmoptionstoolbar.lbliconsize.caption #, fuzzy #| msgid "Ic&on size:" msgctxt "tfrmoptionstoolbar.lbliconsize.caption" msgid "Icon si&ze:" msgstr "아이콘 크기(&O)" #: tfrmoptionstoolbar.lblinternalcommand.caption msgctxt "tfrmoptionstoolbar.lblinternalcommand.caption" msgid "Co&mmand:" msgstr "" #: tfrmoptionstoolbar.lblinternalparameters.caption msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "" #: tfrmoptionstoolbar.lblstartpath.caption #, fuzzy #| msgid "Start path:" msgctxt "tfrmoptionstoolbar.lblstartpath.caption" msgid "Start pat&h:" msgstr "시작 경로(&S):" #: tfrmoptionstoolbar.lbltooltip.caption #, fuzzy #| msgid "Tooltip:" msgctxt "tfrmoptionstoolbar.lbltooltip.caption" msgid "&Tooltip:" msgstr "풍선 도움말(&T):" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption #, fuzzy #| msgid "Keep terminal window open after executing program" msgid "&Keep terminal window open after executing program" msgstr "프로그램 실행 후 명령 프롬프트 창 유지하기" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption #, fuzzy #| msgid "Execute in terminal" msgid "&Execute in terminal" msgstr "명령 프롬프트에서 실행하기" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption #, fuzzy #| msgid "Use external program" msgid "&Use external program" msgstr "외부 프로그램 사용하기" #: tfrmoptionstoolbase.lbltoolsparameters.caption #, fuzzy #| msgid "Additional parameters" msgid "A&dditional parameters" msgstr "추가적인 변수" #: tfrmoptionstoolbase.lbltoolspath.caption #, fuzzy #| msgid "Path to program to execute" msgid "&Path to program to execute" msgstr "실행할 프로그램의 경로" #: tfrmoptionstooltips.btnaddfields.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "추가" #: tfrmoptionstooltips.btnapplyfields.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "적용" #: tfrmoptionstooltips.btndeletefields.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "삭제" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "템플릿..." #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "파일 형식에 의한 사용자 필드" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "풍선 도움말 보이기" #: tfrmoptionstooltips.lblfieldslist.caption #, fuzzy #| msgid "Category hint:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "카테고리 힌트:" #: tfrmoptionstooltips.lblfieldsmask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "카테고리 마스크:" #: tfrmoptionstooltips.lblfieldsname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "카테고리 이름:" #: tfrmoptionstooltips.rbtooltipallfiles.caption #, fuzzy #| msgid "Show tool tip for all files in file panel" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "파일 패널의 모든 파일에 풍선 도움말 보이기" #: tfrmoptionstooltips.rbtooltipnone.caption #, fuzzy #| msgid "Don't show" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "보이지 않기" #: tfrmoptionstooltips.rbtooltiponlylarge.caption #, fuzzy #| msgid "Show tool tip for files in file panel if truncated" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "파일명이 잘릴 때 풍선 도움말로 파일명 표시" #: tfrmoptionsviewer.btnbackviewercolor.caption #, fuzzy msgctxt "TFRMOPTIONSVIEWER.BTNBACKVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.btnfontviewercolor.caption #, fuzzy msgctxt "TFRMOPTIONSVIEWER.BTNFONTVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.gbviewerbookmode.caption msgid "Viewer Book Mode" msgstr "책 뷰어 모드" #: tfrmoptionsviewer.gbviewerexample.caption #, fuzzy msgctxt "TFRMOPTIONSVIEWER.GBVIEWEREXAMPLE.CAPTION" msgid "Example" msgstr "예시" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption #, fuzzy #| msgid "Background color in book viewer" msgid "&Background color in book viewer" msgstr "책 뷰어의 배경색" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption #, fuzzy #| msgid "Font color in book viewer" msgid "&Font color in book viewer" msgstr "책 뷰어의 글꼴 색" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption #, fuzzy #| msgid "Number of columns in book viewer" msgid "&Number of columns in book viewer" msgstr "책 뷰어의 열 개수" #: tfrmpackdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmpackdlg.btnconfig.caption #, fuzzy #| msgid "&Configure" msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "설정(&C)" #: tfrmpackdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "도움말" #: tfrmpackdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "확인" #: tfrmpackdlg.caption #, fuzzy msgctxt "TFRMPACKDLG.CAPTION" msgid "Pack files" msgstr "파일 압축하기" #: tfrmpackdlg.cbcreateseparatearchives.caption #, fuzzy #| msgid "Create separate archives, o&ne per selected file/dir" msgid "C&reate separate archives, one per selected file/dir" msgstr "선택한 파일/폴더마다 각각의 압축 파일 만들기(&N)" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "자체 압축 풀림 파일 만들기(&X)" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "암호화하기(&Y)" #: tfrmpackdlg.cbmovetoarchive.caption #, fuzzy #| msgid "M&ove to archive" msgid "Mo&ve to archive" msgstr "압축 파일로 이동하기(&O)" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "다중 디스크/볼륨 압축하기(&M)" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "=>" #: tfrmpackdlg.cbputintarfirst.caption #, fuzzy #| msgid "Put in the TAR archive first" msgid "P&ut in the TAR archive first" msgstr "TAR 압축파일에 먼저 저장하기" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "경로명 압축하기 (하위 폴더만) (&P)" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "파일 압축:" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "압축기" #: tfrmpackinfodlg.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "닫기" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "전부 압축 풀기 및 실행(&A)" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "압축 풀기 및 실행(&U)" #: tfrmpackinfodlg.caption #, fuzzy msgctxt "TFRMPACKINFODLG.CAPTION" msgid "Properties of packed file" msgstr "압축 파일의 속성" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "속성:" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "압축률:" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "날짜:" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "압축 방식:" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "원래 크기:" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "파일:" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "압축된 크기:" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "압축기:" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "시간:" #: tfrmquicksearch.btncancel.caption msgctxt "TFRMQUICKSEARCH.BTNCANCEL.CAPTION" msgid "X" msgstr "" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "" #: tfrmquicksearch.sbcasesensitive.hint #, fuzzy msgid "Case Sensitive" msgstr "대소문자 구별" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "" #: tfrmquicksearch.sbdirectories.hint #, fuzzy msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "폴더" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "" #: tfrmquicksearch.sbfiles.hint #, fuzzy msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "파일(&F)" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "시작 일치하기" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "끝 일치하기" #: tfrmquicksearch.tglfilter.caption #, fuzzy msgctxt "TFRMQUICKSEARCH.TGLFILTER.CAPTION" msgid "Filter" msgstr "필터" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "" #: tfrmselecttextrange.btppanel.cancelbutton.caption #, fuzzy msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CANCELBUTTON.CAPTION" msgid "Cancel" msgstr "취소" #: tfrmselecttextrange.btppanel.closebutton.caption #, fuzzy msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CLOSEBUTTON.CAPTION" msgid "&Close" msgstr "닫기 (&C)" #: tfrmselecttextrange.btppanel.helpbutton.caption #, fuzzy msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.HELPBUTTON.CAPTION" msgid "&Help" msgstr "도움말(&H)" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "tfrmselecttextrange.btppanel.okbutton.caption" msgid "&OK" msgstr "확인(&O)" #: tfrmselecttextrange.lblselecttext.caption #, fuzzy #| msgid "Select the characters to insert:" msgid "&Select the characters to insert:" msgstr "삽입할 문자 선택하기:" #: tfrmsetfileproperties.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "확인(&O)" #: tfrmsetfileproperties.caption #, fuzzy msgctxt "TFRMSETFILEPROPERTIES.CAPTION" msgid "Change attributes" msgstr "속성 변경" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Sticky" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "기록" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "생성됨:" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "숨김" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "접근함" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "변경됨" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "읽기전용" #: tfrmsetfileproperties.chkrecursive.caption msgid "Including subfolders" msgstr "하위폴더 포함" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "시스템" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "타임스탬프 속성" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "속성" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "속성" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "그룹" #: tfrmsetfileproperties.lblattrinfo.caption msgid "(gray field means unchanged value)" msgstr "(회색 필드는 값의 변동이 없음을 뜻한다)" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Other" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "소유자" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "텍스트:" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "실행" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "8진법:" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "읽기" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "쓰기" #: tfrmsplitter.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "확인" #: tfrmsplitter.caption #, fuzzy msgctxt "TFRMSPLITTER.CAPTION" msgid "Splitter" msgstr "분할하기" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664 바이트 - 3.5인치" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "파일명" #: tfrmsplitter.grbxsize.caption #, fuzzy msgid "Size and number of parts" msgstr "크기와 분할 개수" #: tfrmsplitter.lbdirtarget.caption #, fuzzy #| msgid "Directory target" msgid "Directory &target" msgstr "대상 폴더" #: tfrmsplitter.lbfilesource.caption #, fuzzy #| msgid "File source" msgid "File &source" msgstr "파일 소스" #: tfrmsplitter.lblnumberparts.caption #, fuzzy #| msgid "Number of parts" msgid "&Number of parts" msgstr "분할 개수" #: tfrmsplitter.rbtngigab.caption msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "" #: tfrmsplitter.rbtnkilob.caption msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "" #: tfrmsplitter.rbtnmegab.caption msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "" #: tfrmsymlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "확인(&O)" #: tfrmsymlink.caption #, fuzzy msgid "Create symbolic link" msgstr "심볼릭 링크 생성" #: tfrmsymlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "링크 대상이 존재합니다." #: tfrmsymlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "링크 이름" #: tfrmtweakplugin.btnadd.caption #, fuzzy #| msgid "Add new" msgid "A&dd new" msgstr "새로 추가" #: tfrmtweakplugin.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "취소" #: tfrmtweakplugin.btnchange.caption #, fuzzy #| msgid "Change" msgid "C&hange" msgstr "바꾸기" #: tfrmtweakplugin.btndefault.caption #, fuzzy #| msgid "Default" msgid "De&fault" msgstr "기본값" #: tfrmtweakplugin.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "확인" #: tfrmtweakplugin.btnremove.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "제거" #: tfrmtweakplugin.caption #, fuzzy msgctxt "TFRMTWEAKPLUGIN.CAPTION" msgid "Tweak plugin" msgstr "플러그인 트윅" #: tfrmtweakplugin.cbpk_caps_by_content.caption #, fuzzy #| msgid "Detect archive type by content" msgid "De&tect archive type by content" msgstr "내용으로 압축 형식 검출" #: tfrmtweakplugin.cbpk_caps_delete.caption #, fuzzy #| msgid "Can delete files" msgid "Can de&lete files" msgstr "파일 삭제 가능" #: tfrmtweakplugin.cbpk_caps_encrypt.caption #, fuzzy #| msgid "Supports encryption" msgid "Supports e&ncryption" msgstr "암호화 지원" #: tfrmtweakplugin.cbpk_caps_hide.caption #, fuzzy #| msgid "Show as normal files (hide packer icon)" msgid "Sho&w as normal files (hide packer icon)" msgstr "보통 파일처럼 보이기 (압축 아이콘 숨기기)" #: tfrmtweakplugin.cbpk_caps_mempack.caption #, fuzzy #| msgid "Supports packing in memory" msgid "Supports pac&king in memory" msgstr "메모리 압축 지원" #: tfrmtweakplugin.cbpk_caps_modify.caption #, fuzzy #| msgid "Can modify exisiting archives" msgid "Can &modify exisiting archives" msgstr "존재하는 압축 파일 변경 가능" #: tfrmtweakplugin.cbpk_caps_multiple.caption #, fuzzy #| msgid "Archive can contain multiple files" msgid "&Archive can contain multiple files" msgstr "압축 파일에 여러 파일을 포함" #: tfrmtweakplugin.cbpk_caps_new.caption #, fuzzy #| msgid "Can create new archives" msgid "Can create new archi&ves" msgstr "새 압축 파일 생성 가능" #: tfrmtweakplugin.cbpk_caps_options.caption #, fuzzy #| msgid "Supports the options dialogbox" msgid "S&upports the options dialogbox" msgstr "옵션 대화 상자 지원" #: tfrmtweakplugin.cbpk_caps_searchtext.caption #, fuzzy #| msgid "Allow searching for text in archives" msgid "Allow searchin&g for text in archives" msgstr "압축 파일 안에서 텍스트 찾기 허용" #: tfrmtweakplugin.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "설명:" #: tfrmtweakplugin.lbldetectstr.caption #, fuzzy #| msgid "Detect string:" msgid "D&etect string:" msgstr "문자열 검출:" #: tfrmtweakplugin.lblextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "확장자:" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "플래그:" #: tfrmtweakplugin.lblname.caption #, fuzzy #| msgid "Name:" msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "이름:" #: tfrmtweakplugin.lblplugin.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "플러그인:" #: tfrmtweakplugin.lblplugin1.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "플러그인:" #: tfrmviewer.actabout.caption #, fuzzy msgctxt "TFRMVIEWER.ACTABOUT.CAPTION" msgid "About Viewer..." msgstr "뷰어 정보..." #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "About 메시지 보기" #: tfrmviewer.actcopyfile.caption #, fuzzy msgctxt "TFRMVIEWER.ACTCOPYFILE.CAPTION" msgid "Copy File" msgstr "파일 복사" #: tfrmviewer.actcopyfile.hint #, fuzzy msgctxt "TFRMVIEWER.ACTCOPYFILE.HINT" msgid "Copy File" msgstr "파일 복사" #: tfrmviewer.actdeletefile.caption #, fuzzy msgctxt "TFRMVIEWER.ACTDELETEFILE.CAPTION" msgid "Delete File" msgstr "파일 삭제" #: tfrmviewer.actdeletefile.hint #, fuzzy msgctxt "TFRMVIEWER.ACTDELETEFILE.HINT" msgid "Delete File" msgstr "파일 삭제" #: tfrmviewer.actloadnextfile.caption #, fuzzy msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.CAPTION" msgid "&Next" msgstr "다음(&N)" #: tfrmviewer.actloadnextfile.hint msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.HINT" msgid "Load Next File" msgstr "다음 파일 불러오기" #: tfrmviewer.actloadprevfile.caption #, fuzzy msgctxt "TFRMVIEWER.ACTLOADPREVFILE.CAPTION" msgid "&Previous" msgstr "이전(&P)" #: tfrmviewer.actloadprevfile.hint #, fuzzy msgid "Load Previous File" msgstr "이전 파일 불러오기" #: tfrmviewer.actmirror.caption #, fuzzy msgctxt "TFRMVIEWER.ACTMIRROR.CAPTION" msgid "Mirror" msgstr "미러" #: tfrmviewer.actmirror.hint #, fuzzy msgctxt "TFRMVIEWER.ACTMIRROR.HINT" msgid "Mirror" msgstr "미러" #: tfrmviewer.actmovefile.caption #, fuzzy msgctxt "TFRMVIEWER.ACTMOVEFILE.CAPTION" msgid "Move File" msgstr "파일 이동" #: tfrmviewer.actmovefile.hint #, fuzzy msgctxt "TFRMVIEWER.ACTMOVEFILE.HINT" msgid "Move File" msgstr "파일 이동" #: tfrmviewer.actreload.caption #, fuzzy msgctxt "TFRMVIEWER.ACTRELOAD.CAPTION" msgid "Reload" msgstr "다시 열기" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "현재 파일 다시 열기" #: tfrmviewer.actrotate180.caption #, fuzzy msgctxt "TFRMVIEWER.ACTROTATE180.CAPTION" msgid "Rotate 180" msgstr "180도 회전하기" #: tfrmviewer.actrotate180.hint #, fuzzy msgctxt "TFRMVIEWER.ACTROTATE180.HINT" msgid "Rotate 180" msgstr "180도 회전하기" #: tfrmviewer.actrotate270.caption #, fuzzy msgctxt "TFRMVIEWER.ACTROTATE270.CAPTION" msgid "Rotate 270" msgstr "270도 회전하기" #: tfrmviewer.actrotate270.hint #, fuzzy msgctxt "TFRMVIEWER.ACTROTATE270.HINT" msgid "Rotate 270" msgstr "270도 회전하기" #: tfrmviewer.actrotate90.caption #, fuzzy msgctxt "TFRMVIEWER.ACTROTATE90.CAPTION" msgid "Rotate 90" msgstr "90도 회전하기" #: tfrmviewer.actrotate90.hint #, fuzzy msgctxt "TFRMVIEWER.ACTROTATE90.HINT" msgid "Rotate 90" msgstr "90도 회전하기" #: tfrmviewer.actsaveas.caption #, fuzzy msgctxt "TFRMVIEWER.ACTSAVEAS.CAPTION" msgid "Save As..." msgstr "다른 이름으로 저장하기..." #: tfrmviewer.actsaveas.hint #, fuzzy msgid "Save File As..." msgstr "다른 이름으로 저장하기..." #: tfrmviewer.actstretchimage.caption #, fuzzy msgctxt "TFRMVIEWER.ACTSTRETCHIMAGE.CAPTION" msgid "Stretch" msgstr "창 크기에 맞추기" #: tfrmviewer.actstretchimage.hint #, fuzzy msgid "Stretch Image" msgstr "창 크기에 맞추기" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "복사" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "복사" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "크롭" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "삭제" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "삭제" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "전체 화면" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "강조" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "미러" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "이동" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "이동" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "칠하기" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "적색 눈" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "리사이즈" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "되돌리기" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "확대하기" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "축소하기" #: tfrmviewer.caption #, fuzzy msgctxt "tfrmviewer.caption" msgid "Viewer" msgstr "뷰어" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "슬라이드 쇼" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "펜" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "강조" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "칠하기" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "슬라이드 쇼" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "보기" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "정보" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "바이너리(&B)" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "클립보드로 복사" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "편집(&E)" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "인코딩(&C)" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "종료(&X)" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "파일(&F)" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "전체 화면" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "그래픽" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "16진수로(&H)" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "이미지(&i)" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "책으로 보기(&B)" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "좌우 뒤집기" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "플러그인" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "미리보기" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "프린트..." #: tfrmviewer.mirotate.caption #, fuzzy msgctxt "TFRMVIEWER.MIROTATE.CAPTION" msgid "Rotate" msgstr "회전하기" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "저장하기" #: tfrmviewer.misaveas.caption #, fuzzy msgctxt "TFRMVIEWER.MISAVEAS.CAPTION" msgid "Save As..." msgstr "다른 이름으로 저장하기..." #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "스크린샷" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "찾기" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "다음 찾기" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "이전 찾기" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "전부 선택" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.mistretch.caption msgctxt "TFRMVIEWER.MISTRETCH.CAPTION" msgid "Stretch" msgstr "창 크기에 맞추기" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "텍스트로(&T)" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "보기(&V)" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "워드랩(&W)" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "확대하기" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "축소하기" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "클립보드로 복사" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "전부 선택" #: tfrmviewoperations.btnstartpause.caption #, fuzzy #| msgid "Start" msgctxt "tfrmviewoperations.btnstartpause.caption" msgid "&Start" msgstr "시작(&S)" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "종료(&T)" #: tfrmviewoperations.caption #, fuzzy msgctxt "TFRMVIEWOPERATIONS.CAPTION" msgid "File operations" msgstr "파일 작업" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "" #: tfrmviewoperations.mnucanceloperation.caption msgctxt "tfrmviewoperations.mnucanceloperation.caption" msgid "Cancel" msgstr "취소" #: tfrmviewoperations.mnucancelqueue.caption msgctxt "tfrmviewoperations.mnucancelqueue.caption" msgid "Cancel" msgstr "취소" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "새 대기열" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "tfrmviewoperations.mnuoperationshowdetached.caption" msgid "Show in detached window" msgstr "분리된 창에서 보기" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "대기열 맨 앞에 넣기" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "대기열 맨 뒤에 넣기" #: tfrmviewoperations.mnuqueue.caption msgctxt "tfrmviewoperations.mnuqueue.caption" msgid "Queue" msgstr "대기열" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "대기열 1" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "대기열 2" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "대기열 3" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "대기열 4" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "대기열 5" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "tfrmviewoperations.mnuqueueshowdetached.caption" msgid "Show in detached window" msgstr "분리된 창에서 보기" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "모두 일시정지(&P)" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "tmultiarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "파일이 존재할 때" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "twcxarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "파일이 존재할 때" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "백그라운드로 동작하기 (연결 분리)" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "파일이 존재할 때" #: ulng.rscancelfilter #, fuzzy msgid "Cancel Quick Filter" msgstr "빠른 필터 취소" #: ulng.rscanceloperation #, fuzzy msgid "Cancel Current Operation" msgstr "현재 작업 취소" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "" #: ulng.rscolattr msgid "Attr" msgstr "속성" #: ulng.rscoldate msgid "Date" msgstr "날짜" #: ulng.rscolext msgid "Ext" msgstr "확장자" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "이름" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "크기" #: ulng.rscomparediffs #, fuzzy msgid "Number of changes:" msgstr "변경된 횟수" #: ulng.rsconfcolalign msgid "Align" msgstr "정렬" #: ulng.rsconfcolcaption msgid "Caption" msgstr "캡션" #: ulng.rsconfcolconfig msgid "Config" msgstr "환경설정" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "삭제" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "필드 내용" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "이동" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "너비" #: ulng.rsconfcustheader msgid "Customize column" msgstr "사용자 정의 열" #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "(%d)를 %s로 복사하기" #: ulng.rsdlgallopcomplete #, fuzzy #| msgid "All operations is complete" msgid "All operations completed" msgstr "모든 작업이 완료되었습니다." #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "모든 작업의 처리 %d %%" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "중지(&O)" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "모두(&6)" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "추가(&P)" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "취소(&C)" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "복사(&I)" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "전부 복사(&A)" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "" #: ulng.rsdlgbuttonno msgid "&No" msgstr "아니오(&N)" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "전부 아니오(&E)" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "확인(&O)" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "덮어쓰기(&R)" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "전부 덮어쓰기(&A)" #: ulng.rsdlgbuttonoverwriteolder #, fuzzy msgid "Overwrite All Ol&der" msgstr "옛파일 전부 덮기(&D)" #: ulng.rsdlgbuttonresume #, fuzzy msgid "&Resume" msgstr "다시 시작(&R)" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "다시 시도(&T)" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "건너뛰기(&S)" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "전부 건너뛰기(&K)" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "예(&Y)" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "파일과 폴더 계산하기" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "CRC 체크섬 생성..." #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "CRC 체크섬 검사..." #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "파일 복사" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "파일 삭제" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "파일 이동" #: ulng.rsdlgoppause #, fuzzy #| msgid "Pause" msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "중지(&S)" #: ulng.rsdlgopstart #, fuzzy #| msgid "Start" msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "시작(&S)" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "대기열" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "속도 %s/s" #: ulng.rsdlgspeedtime #, fuzzy msgid "Speed %s/s, time remaining %s" msgstr "속도 %s/s, 남은 시간 %s" #: ulng.rsdlgsplit #, fuzzy msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "파일 분할(&S)" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "반복해서 파일 삭제" #: ulng.rsdrivenolabel #, fuzzy msgid "" msgstr "<레이블 없음>" #: ulng.rsdrivenomedia msgid "" msgstr "<미디어 없음>" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "더블 커맨더 내장 에디터" #: ulng.rseditnewfile msgid "new.txt" msgstr "새 파일.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "파일명:" #: ulng.rseditnewopen msgid "Open file" msgstr "파일 열기" #: ulng.rseditsearchback msgid "&Backward" msgstr "뒤로(&B)" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "찾기" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "앞으로(&F)" #: ulng.rseditsearchreplace #, fuzzy msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "바꾸기" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "" #: ulng.rsfileopsetpropertyerroroptions msgctxt "ulng.rsfileopsetpropertyerroroptions" msgid "Ask;Don't set anymore;Ignore errors" msgstr "" #: ulng.rsfilterstatus msgid "FILTER" msgstr "필터" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "템플릿 정의" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "%s 단계" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "전부 (제한 없음)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "현재 폴더만" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "%s 폴더가 존재하지 않습니다!" #: ulng.rsfindfound msgctxt "ulng.rsfindfound" msgid "Found: %d" msgstr "찾았습니다: %d" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "찾기 템플릿 저장" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "템플릿 이름:" #: ulng.rsfindscanned msgctxt "ulng.rsfindscanned" msgid "Scanned: %d" msgstr "검색됨: %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "검색 중" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "파일 찾기" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "시작함:" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr "%s / %s bytes (여유공간/전체)" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "" #: ulng.rsfuncatime msgid "Access date/time" msgstr "접근 날짜/시간" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "속성" #: ulng.rsfunccomment #, fuzzy msgctxt "ulng.rsfunccomment" msgid "Comment" msgstr "코멘트" #: ulng.rsfunccompressedsize #, fuzzy msgid "Compressed size" msgstr "압축 크기" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "생성 날짜/시간" #: ulng.rsfuncext msgid "Extension" msgstr "확장자" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "그룹" #: ulng.rsfunclinkto msgid "Link to" msgstr "" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "변경 날짜/시간" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "이름" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "확장자 없는 이름" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "소유자" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "경로" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "크기" #: ulng.rsfunctype msgid "Type" msgstr "형식" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "하드 링크 생성 오류" #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "복사/이동 대화상자" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "파일 비교" #: ulng.rshotkeycategorymain #, fuzzy msgid "Main" msgstr "메인" #: ulng.rshotkeycategoryviewer #, fuzzy msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "뷰어" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "링커 완료" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "마스크 선택 해제" #: ulng.rsmarkplus msgid "Select mask" msgstr "마스크 선택" #: ulng.rsmaskinput msgid "Input mask:" msgstr "파일 종류 지정:" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "사용자 열 설정" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "사용자 열 보기 설정" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "동작" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "편집" #: ulng.rsmnueject msgid "Eject" msgstr "꺼내기" #: ulng.rsmnumount msgid "Mount" msgstr "마운트" #: ulng.rsmnunew #, fuzzy msgctxt "ulng.rsmnunew" msgid "New" msgstr "새 파일" #: ulng.rsmnunomedia msgid "No media available" msgstr "매체가 없습니다" #: ulng.rsmnuopenwith #, fuzzy #| msgid "Open with ..." msgid "Open with" msgstr "...로 열기" #: ulng.rsmnuopenwithother msgid "Other..." msgstr "" #: ulng.rsmnusortby msgid "Sort by" msgstr "정렬" #: ulng.rsmnuumount #, fuzzy msgid "Unmount" msgstr "언마운트" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "보기" #: ulng.rsmsgaccount msgid "Account:" msgstr "계정:" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "압축기 명령행 실행시의 추가적인 변수" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "\"%s\"파일을 그 자신에게 복사/이동할 수 없습니다!" #: ulng.rsmsgcannotdeletedirectory #, fuzzy msgid "Cannot delete directory %s" msgstr "%s 폴더를 삭제할 수 없습니다!" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "[%s]로 경로 이동 실패!" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "모든 비활성 탭을 제거할까요?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "이 탭(%s)은 잠겼습니다. 닫을까요?" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "정말 끝내시겠습니까?" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "선택한 파일/폴더 %d 개를 복사할까요?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "선택한 \"%s\"를 복사할까요?" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "일부 복사된 파일을 삭제할까요?" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "선택한 파일/폴더 %d 개를 삭제할까요?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "선택한 파일/폴더 %d 개를 휴지통으로 삭제할까요?" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "선택한 \"%s\"를 지울까요?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "선택한 \"%s\"를 휴지통으로 삭제할까요?" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "\"%s\" 삭제 불가! 직접 삭제할까요?" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "디스크를 사용할 수 없습니다" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "파일 확장자 입력" #: ulng.rsmsgentername msgid "Enter name:" msgstr "이름 입력:" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "압축 데이터에서 CRC 오류 발생" #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "데이터가 틀립니다" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "서버에 연결할 수 없습니다: \"%s\"" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "파일을 복사할 수 없습니다. (%s -> %s)" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "\"%s\" 이름의 폴더가 이미 존재합니다." #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "날짜 %s 는 지원하지 않습니다." #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "%s 폴더가 존재합니다!" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "기능을 사용자가 중단했습니다" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "파일 닫기 오류" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "파일을 만들 수 없습니다" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "압축 파일에 더 이상 파일이 없습니다" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "존재하는 파일을 열 수 없습니다" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "파일 읽기 오류" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "파일 쓰기 오류" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "%s 폴더를 만들 수 없습니다!" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "잘못된 링크" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "파일을 찾을 수 없습니다" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "메모리 부족" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "지원되지 않는 기능!" #: ulng.rsmsgerrorincontextmenucommand #, fuzzy msgid "Error in context menu command" msgstr "컨텍스트 메뉴 명령어 오류" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "정규 표현식 구문 오류!" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "파일명을 변경할 수 없습니다. (%s -> %s)" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "파일을 저장할 수 없습니다" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "\"%s\" 의 속성을 설정할 수 없습니다" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "\"%s\" 의 날짜/시간을 설정할 수 없습니다" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "너무 작은 버퍼" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "압축하기에 너무 많은 파일" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "알려지지 않은 압축 파일 형식" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "%s 파일이 변경되었습니다. 저장할까요?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "%s 파일이 존재합니다. 덮어쓸까요?" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "파일 작업 활성화" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "어떤 파일 작업이 아직 끝나지 않았습니다. 더블 커멘더를 종료시 자료를 소실할 수 있습니다." #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "%s 는 읽기전용 파일입니다. 삭제할까요?" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "\"%s\" 파일 크기가 대상 파일 시스템에 너무 큽니다!" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "%s 폴더가 존재합니다. 덮어쓸까요?" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "심링크 \"%s\"를 추적할까요?" #: ulng.rsmsginvalidcommandline #, fuzzy msgid "Error in command line" msgstr "명령행 오류" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "잘못된 파일명" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "" #: ulng.rsmsginvalidpath #, fuzzy msgid "Invalid path" msgstr "잘못된 경로" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "경로 %s 는 금지된 문자를 포함하고 있습니다." #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "" #: ulng.rsmsginvalidquoting #, fuzzy msgid "Invalid quoting" msgstr "잘못된 인용" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "잘못된 선택." #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "파일 목록 불러오기..." #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "파일 %s 복사" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "파일 %s 지우기" #: ulng.rsmsglogerror msgid "Error: " msgstr "오류: " #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "파일 %s 압축 풀기" #: ulng.rsmsgloginfo msgid "Info: " msgstr "정보: " #: ulng.rsmsgloglink msgid "Create link %s" msgstr "링크 %s 생성" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "폴더 %s 생성" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "파일 %s 이동" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "파일 %s 압축" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "폴더 %s 제거" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "완료: " #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "심링크 %s 생성" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "파일 % 상태 테스트" #: ulng.rsmsgmanualaddhotdir #, fuzzy msgid "Manually add hot path" msgstr "수동으로 즐겨찾기 추가" #: ulng.rsmsgmanualedithotdir #, fuzzy msgid "Manualy edit hot path" msgstr "수동으로 즐겨찾기 편집" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "이름 및 경로 입력 (예: 이름=경로)" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "주 암호" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "주 암호를 입력하시오:" #: ulng.rsmsgnewfile msgid "New file" msgstr "새 파일" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "다음 볼륨의 압축을 풀었습니다" #: ulng.rsmsgnofiles msgid "No files" msgstr "파일이 없습니다." #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "선택한 파일이 없습니다." #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "대상 드라이브에 여유 공간이 부족합니다. 계속할까요?" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "대상 드라이브에 여유 공간이 부족합니다. 다시 시도할까요?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "%s 파일을 삭제할 수 없습니다" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "구현되지 않았습니다." #: ulng.rsmsgpassword msgid "Password:" msgstr "암호:" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "암호가 다릅니다!" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "암호를 입력하세요:" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "암호 (방화벽):" #: ulng.rsmsgpasswordverify #, fuzzy msgid "Please re-enter the password for verification:" msgstr "암호를 확인하기 위해 다시 입력하세요:" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "%s 추가(&A)" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "설정(&C)" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "%s 지우기(&D)" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "\"%s\" 프리셋이 이미 존재합니다. 덮어쓸까요?" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "선택한 파일/폴더 %d 개의 이름을 바꿀/이동할까요?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "선택한 \"%s\"의 이름을 바꿀/이동할까요?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "변경 사항을 적용하려면 더블 커맨더를 재실행해 주세요." #: ulng.rsmsgselectedinfo #, fuzzy msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "용량: %s / %s, 파일 : %d / %d, 폴더: %d / %d" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "체크섬 파일만 선택해 주세요!" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "다음 볼륨의 위치를 선택해 주세요." #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "볼륨 레이블 지정" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "탭이름 바꾸기" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "새 탭 이름:" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "대상 경로:" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "너무 많은 파일을 선택했습니다." #: ulng.rsmsgurl msgid "URL:" msgstr "" #: ulng.rsmsgusername msgid "User name:" msgstr "사용자 이름:" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "사용자 이름 (방화벽):" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "볼륨 레이블:" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "볼륨 크기를 입력하세요:" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "선택한 파일/폴더를 %d 회 지울까요?" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "선택한 \"%s\"를 반복하여 지울까요?" #: ulng.rsmulrenfilenamestylelist msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "변경 없음;대문자로;소문자로;첫 문자만 대문자로;모든 낱말의 첫 문자를 대문자로;" #: ulng.rsoperaborted msgid "Aborted" msgstr "취소됨" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "체크섬 계산" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "\"%s\" 의 체크섬 계산" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "\"%s\" 의 체크섬 계산" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "계산하기" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "\"%s\" 계산하기" #: ulng.rsopercombining msgid "Joining" msgstr "합치기" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "\"%s\" 의 파일을 \"%s\"로 합치기" #: ulng.rsopercopying msgid "Copying" msgstr "복사하기" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "\"%s\" 에서 \"%s\" 로 복사하기" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "\"%s\" ygw \"%s\" 로 복사하기" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "폴더 생성하기" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "\"%s\" 폴더 생성하기" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "삭제하기" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "\"%s\" 를 삭제하기" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "\"%s\" 를 삭제하기" #: ulng.rsoperexecuting msgid "Executing" msgstr "실행하기" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "\"%s\" 를 실행하기" #: ulng.rsoperextracting msgid "Extracting" msgstr "압축 해제하기" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "\"%s\" 에서 \"%s\" 로 압축 해제하기" #: ulng.rsoperfinished msgid "Finished" msgstr "완료됨" #: ulng.rsoperlisting msgid "Listing" msgstr "목록 만들기" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "\"%s\" 의 목록 만들기" #: ulng.rsopermoving msgid "Moving" msgstr "이동하기" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "\"%s\" 에서 \"%s\" 로 이동하기" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "\"%s\" 를 \"%s\" 로 이동하기" #: ulng.rsopernotstarted msgid "Not started" msgstr "시작되지 않음" #: ulng.rsoperpacking msgid "Packing" msgstr "압축하기" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "\"%s\" 에서 \"%s\" 로 압축하기" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "\"%s\" 를 \"%s\" 로 압축하기" #: ulng.rsoperpaused msgid "Paused" msgstr "중지됨" #: ulng.rsoperpausing msgid "Pausing" msgstr "중지중" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "대기중" #: ulng.rsoperrunning msgid "Running" msgstr "실행중" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "속성 설정하기" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "\"%s\" 에 있는 속성 설정하기" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "\"%s\" 의 속성 설정하기" #: ulng.rsopersplitting msgid "Splitting" msgstr "분할하기" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "\"%s\" 를 \"%s\" 로 분할하기" #: ulng.rsoperstarting msgid "Starting" msgstr "시작하기" #: ulng.rsoperstopped msgid "Stopped" msgstr "정지됨" #: ulng.rsoperstopping msgid "Stopping" msgstr "정지하기" #: ulng.rsopertesting msgid "Testing" msgstr "검사하기" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "\"%s\" 를 검사하기" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "\"%s\" 를 검사하기" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "체크섬 검사하기" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "\"%s\" 에 있는 체크섬 검사하기" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "\"%s\" 의 체크섬 검사하기" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "파일 소스에 접근을 기다리는 중" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "사용자 응답을 기다리는 중" #: ulng.rsoperwiping msgid "Wiping" msgstr "완전히 삭제하기" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "\"%s\" 를 완전히 삭제하기" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "\"%s\" 를 완전히 삭제하기" #: ulng.rsoperworking msgid "Working" msgstr "작업하기" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "삭제:" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "경로 없이 압축해제:" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "포멧 분석 모드" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "ID 위치:" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "ID 검색 범위:" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "변수" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "암호 질의 문자열:" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "자동 풀림 압축 파일 생성:" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "시험:" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "압축 형식 이름:" #: ulng.rsoptarchivevalue msgid "Value" msgstr "값" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "연결된 플러그인 \"%s\":" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "처음;마지막;" #: ulng.rsoptdisable msgid "Disable" msgstr "사용 안함" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "사용하기" #: ulng.rsoptenterext msgid "Enter extension" msgstr "확장자 입력" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "커서" #: ulng.rsoptexamplemark msgid "Mark" msgstr "선택" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "선택 + 커서" #: ulng.rsoptexampletext msgid "Text" msgstr "텍스트" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "분리된 창에;최소화된 분리된 창에;작업 패널에" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "이 설정을 뒤집어 사용할 수 있도록, cm_Delete의 바로가기 %s가 등록될 것입니다." #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "%s 의 단축키 추가" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "바로가기 추가" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "바로가기 설정 불가" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "바로가기 변경하기" #: ulng.rsopthotkeyscommand #, fuzzy msgid "Command" msgstr "명령어" #: ulng.rsopthotkeysdeletetrashcanoverrides msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "cm_Delete의 바로가기 %s는 바로가기 %s와 일치하기 위해 매개변수를 바꿀 필요가 있습니다. 바꾸시겠습니까?" #: ulng.rsopthotkeysdescription #, fuzzy msgid "Description" msgstr "설명" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "%의 단축키 편집" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "변수 고치기" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "단축키" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "단축키" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "변수" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "파일 삭제할 바로가기 설정" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "이 설정이 바로가기 %s와 동작하려면, 바로가기 %s 는 cm_Delete에 할당되야 하지만 이미 %s에 지정되어 있습니다. 바꾸시겠습니까?" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "" #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "사용중인 바로가기" #: ulng.rsopthotkeysshortcutusedtext1 #, fuzzy msgid "Shortcut %s is already used." msgstr "바로가기 %s 가 이미 사용중입니다." #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "%s로 바꿀까요?" #: ulng.rsopthotkeysusedby msgid "used for %s in %s" msgstr "사용중: %s / %s" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "" #: ulng.rsoptionseditorarchivers #, fuzzy msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "압축기" #: ulng.rsoptionseditorautorefresh #, fuzzy msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "자동 새로 고침" #: ulng.rsoptionseditorbehavior #, fuzzy msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "동작" #: ulng.rsoptionseditorcolors #, fuzzy msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "색상" #: ulng.rsoptionseditorcolumnsview msgid "Columns" msgstr "열 설정" #: ulng.rsoptionseditorconfiguration #, fuzzy msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "환경설정" #: ulng.rsoptionseditorcustomcolumns #, fuzzy msgid "Custom columns" msgstr "사용자 정의 열" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "드래그 & 드롭" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "드라이브 목록 버튼" #: ulng.rsoptionseditorfileoperations #, fuzzy msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "파일 작업" #: ulng.rsoptionseditorfilepanels #, fuzzy msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "파일 패널" #: ulng.rsoptionseditorfilesviews #, fuzzy msgid "Files views" msgstr "파일 보기" #: ulng.rsoptionseditorfiletypes #, fuzzy msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "파일 형식" #: ulng.rsoptionseditorfoldertabs #, fuzzy msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "폴더 탭" #: ulng.rsoptionseditorfonts #, fuzzy msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "글꼴" #: ulng.rsoptionseditorhighlighters #, fuzzy msgid "Highlighters" msgstr "강조 표시기" #: ulng.rsoptionseditorhotkeys #, fuzzy msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "단축키" #: ulng.rsoptionseditoricons #, fuzzy msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "아이콘" #: ulng.rsoptionseditorignorelist #, fuzzy msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "무시 목록" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "키" #: ulng.rsoptionseditorlanguage #, fuzzy msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "언어 (Language)" #: ulng.rsoptionseditorlayout #, fuzzy msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "레이아웃" #: ulng.rsoptionseditorlog #, fuzzy msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "로그" #: ulng.rsoptionseditormiscellaneous #, fuzzy msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "기타" #: ulng.rsoptionseditormouse #, fuzzy msgid "Mouse" msgstr "마우스" #: ulng.rsoptionseditorplugins #, fuzzy msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "플러그인" #: ulng.rsoptionseditorquicksearch #, fuzzy msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "빠른 찾기/필터" #: ulng.rsoptionseditorterminal #, fuzzy msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "명령 프롬프트" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "" #: ulng.rsoptionseditortools #, fuzzy msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "도구" #: ulng.rsoptionseditortooltips #, fuzzy msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "풍선 도움말" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "왼쪽 버튼;오른쪽 버튼;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "파일 목록의 맨 위에;폴더 뒤에 (폴더가 파일 앞쪽에 정렬된 경우);정렬된 위치에;파일 목록의 맨 아래에" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "플러그인 %s 는 이미 다음 확장자와 연결되어 있습니다:" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "활성" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "파일명" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "이름" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "등록" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "대소문자 구별하지 않기;로케일 설정에 따라서 (aAbBcC);처음은 대문자 그리고 소문자 (ABCabc)" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "이름순으로 정렬하고 먼저 보여주기;파일처럼 정렬하고 먼저 보여주기;파일처럼 정렬하기" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "액센트를 고려하여 알파벳순으로;자연스럽게 정렬: 알파벳과 숫자순으로" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "위;아래;" #: ulng.rsopttoolbarbuttontype msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "위치 변경하지 않기;새 파일처럼 동일한 설정 사용하기;정렬된 위치로" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "\"%s\" 의 접근 권한 변경 불가" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "\"%s\" 소유자 변경 불가!" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "파일" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "폴더" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "이름이 있는 파이프" #: ulng.rspropsno msgid "No" msgstr "아니오" #: ulng.rspropssocket msgid "Socket" msgstr "소켓" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "특별한 블록 기기" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "특별한 문자 기기" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "심볼릭 링크" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "알 수 없는 형식" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "예 (%s)" #: ulng.rssearchresult msgid "Search result" msgstr "검색 결과" #: ulng.rssearchtemplateunnamed msgid "" msgstr "" #: ulng.rsselectdir msgid "Select a directory" msgstr "폴더 선택" #: ulng.rsshowhelpfor msgid "&Show help for %s" msgstr "" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "파일: %d, 폴더: %d, 크기: %s (%s 바이트)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "대상 디렉토리를 만들 수 없습니다!" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "잘못된 파일 크기 형식!" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "파일을 자를 수 없습니다" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "100 개 이상의 부분으로 되어 있습니다! 계속할까요?" #: ulng.rssplitseldir msgid "Select directory:" msgstr "폴더 선택:" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "심링크 생성 오류" #: ulng.rssyndefaulttext #, fuzzy msgctxt "ulng.rssyndefaulttext" msgid "Default text" msgstr "기본 텍스트" #: ulng.rssynlangplaintext #, fuzzy msgctxt "ulng.rssynlangplaintext" msgid "Plain text" msgstr "일반 텍스트" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "일" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "시" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "분" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "월" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "초" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "주" #: ulng.rstimeunityear msgid "Year(s)" msgstr "년" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "파일 비교" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "편집기" #: ulng.rstoolerroropeningdiffer #, fuzzy msgid "Error opening differ" msgstr "파일 비교 열기 오류" #: ulng.rstoolerroropeningeditor #, fuzzy msgid "Error opening editor" msgstr "편집기 열기 오류" #: ulng.rstoolerroropeningterminal #, fuzzy msgid "Error opening terminal" msgstr "명령 프롬프트 열기 오류" #: ulng.rstoolerroropeningviewer #, fuzzy msgid "Error opening viewer" msgstr "뷰어 열기 오류" #: ulng.rstoolterminal #, fuzzy msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "명령 프롬프트" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "뷰어" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "이 에러가 발생했을 때 무엇을 하고 있었는지 다음 파일과 함께 버그 트래커에 보고해 주시면 감사하겠습니다: %s 계속하려면 %s 를 누르거나 프로그램을 종료하려면 %s를 누르세요." #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "네트워크" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "더블 커맨더 내장 뷰어" #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "인코딩" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "%s 를 찾지 못했습니다!" doublecmd-0.5.8/language/doublecmd.da.po0000644000175000017500000055714712250633131017171 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.5 alpha\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-01-17 23:08+0300\n" "PO-Revision-Date: 2012-11-27 11:52+ZONE\n" "Last-Translator: Full Name \n" "Language-Team: Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Danish\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "Alle" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "Alle" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "Alle" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "Alle" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "Alle" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "Alle" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "Alle" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "&Annuller" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "..." #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "->" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "<-" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "Brugerbestemt visning" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "&Baggrund:" #: tfcolumnssetconf.cbcursorborder.caption msgid "Cursor border" msgstr "Markør-grænser" #: tfcolumnssetconf.cbovercolor.caption msgid "Allow Overcolor" msgstr "Tillad farveoverlapning" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "Brug brugerdefinerede skrifttyper og farver" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "&Skriftfarve:" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "Skrifttype" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "Størrelse" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "Baggrund &2:" #: tfcolumnssetconf.lblconfigviewnr.caption msgid "Configure view nr:" msgstr "&Konfigurér visning nummer:" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "&Markørfarve:" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "Mar&kørskrift:" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "&Valgt farve:" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "Navn:" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "Tilføj kolonne" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "Tilpas kolonne" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "Preview" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "R" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption #, fuzzy #| msgid "Check free space" msgid "C&heck free space" msgstr "Kontroller ledig plads" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption msgid "Cop&y attributes" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption msgid "Copy o&wnership" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption msgid "Copy d&ate/time" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption #, fuzzy #| msgid "Correct links" msgid "Correct lin&ks" msgstr "Korrigér links" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "Fjern skrivebeskyttet atribut" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption msgid "E&xclude empty directories" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption #, fuzzy #| msgid "Follow links" msgid "Fo&llow links" msgstr "Følg links" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "" #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption #, fuzzy #| msgid "When directory exists" msgid "When dir&ectory exists" msgstr "Hvis mappen findes:" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption #, fuzzy #| msgid "When file exists" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "Hvis filen findes:" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption msgid "When ca&nnot set property" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "" #: tfrmabout.btnclose.caption msgctxt "tfrmabout.btnclose.caption" msgid "&Close" msgstr "&Luk" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "Om" #: tfrmabout.lblbuild.caption msgid "Build" msgstr "Build" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "Hjemmeside" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "" #: tfrmabout.lblversion.caption msgid "Version" msgstr "" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "&Nulstil" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "Vælg attributter" #: tfrmattributesedit.cbarchive.caption #, fuzzy #| msgid "Archive" msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "Arkiv" #: tfrmattributesedit.cbcompressed.caption #, fuzzy #| msgid "Compressed" msgid "Co&mpressed" msgstr "Komprimeret" #: tfrmattributesedit.cbdirectory.caption #, fuzzy #| msgid "Directory" msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "Mappe" #: tfrmattributesedit.cbencrypted.caption #, fuzzy #| msgid "Encrypted" msgid "&Encrypted" msgstr "Krypteret" #: tfrmattributesedit.cbhidden.caption #, fuzzy #| msgid "Hidden" msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "Skjult" #: tfrmattributesedit.cbreadonly.caption #, fuzzy #| msgid "Read only" msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "Skrivebeskyttet" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmattributesedit.cbsparse.caption #, fuzzy #| msgid "Sparse" msgid "S&parse" msgstr "Tynd" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Klæbrig" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmattributesedit.cbsymlink.caption msgid "&Symlink" msgstr "" #: tfrmattributesedit.cbsystem.caption msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "" #: tfrmattributesedit.cbtemporary.caption #, fuzzy #| msgid "Temporary" msgid "&Temporary" msgstr "Midlertidig" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "NTFS-attributter" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "Generelle attributter" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Gruppe" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Andre" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Ejer" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "Udfør" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "Læs" #: tfrmattributesedit.lbltextattrs.caption #, fuzzy #| msgid "As text:" msgid "As te&xt:" msgstr "Som tekst:" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "Skriv" #: tfrmchecksumcalc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmchecksumcalc.caption msgctxt "tfrmchecksumcalc.caption" msgid "Calculate check sum..." msgstr "Dan kontrolsumfil" #: tfrmchecksumcalc.cbseparatefile.caption #, fuzzy #| msgid "Create separate checksum file for each file" msgid "C&reate separate checksum file for each file" msgstr "Dan en &separat kontrolsumfil for hver fil" #: tfrmchecksumcalc.lblsaveto.caption #, fuzzy #| msgid "Save check sum file(s) to:" msgid "&Save check sum file(s) to:" msgstr "Gem kontrolsum-fil(er) som:" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Luk" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "Kontroller kontrolsum" #: tfrmconnectionmanager.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "Tilføj" #: tfrmconnectionmanager.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmconnectionmanager.btnconnect.caption #, fuzzy #| msgid "Connect" msgid "C&onnect" msgstr "Forbind" #: tfrmconnectionmanager.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Slet" #: tfrmconnectionmanager.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Rediger" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "Forbindelsesmanager" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "Forbind til:" #: tfrmcopydlg.btnaddtoqueue.caption msgid "A&dd To Queue" msgstr "" #: tfrmcopydlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "tfrmcopydlg.btncreatespecialqueue.caption" msgid "..." msgstr "..." #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "&Indstillinger" #: tfrmcopydlg.btnsaveoptions.caption #, fuzzy #| msgid "Save these options as default" msgid "Sa&ve these options as default" msgstr "Gem indstillingerne som standard" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "Kopier fil(er)" #: tfrmdescredit.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "Filkommmentar" #: tfrmdescredit.lbleditcommentfor.caption #, fuzzy #| msgid "Edit comment for:" msgid "E&dit comment for:" msgstr "Rediger kommentar for:" #: tfrmdescredit.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "Koder:" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "&Om sammenligneren..." #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "Sammenlign automatisk" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "Binær tilstand" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "&Annuller" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "&Annuller" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "Kopier blok til højre" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "Kopier blok til højre" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "Kopier blok til venstre" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "Kopier blok til venstre" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Kopier" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Klip" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Slet" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Sæt ind" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Gentag" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "Vælg &alle" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Fortryd" #: tfrmdiffer.actexit.caption msgctxt "tfrmdiffer.actexit.caption" msgid "E&xit" msgstr "&Afslut" #: tfrmdiffer.actfirstdifference.caption msgctxt "tfrmdiffer.actfirstdifference.caption" msgid "First Difference" msgstr "Første forskel" #: tfrmdiffer.actfirstdifference.hint msgctxt "tfrmdiffer.actfirstdifference.hint" msgid "First Difference" msgstr "Første forskel" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "Ignorer forskel på STORE og små bogstaver" #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "Ignorer tomme felter" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "Fortsæt rulning" #: tfrmdiffer.actlastdifference.caption msgctxt "tfrmdiffer.actlastdifference.caption" msgid "Last Difference" msgstr "Sidste forskel" #: tfrmdiffer.actlastdifference.hint msgctxt "tfrmdiffer.actlastdifference.hint" msgid "Last Difference" msgstr "Sidste forskel" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "Linjeforskel" #: tfrmdiffer.actnextdifference.caption msgctxt "tfrmdiffer.actnextdifference.caption" msgid "Next Difference" msgstr "Næste forskel" #: tfrmdiffer.actnextdifference.hint msgctxt "tfrmdiffer.actnextdifference.hint" msgid "Next Difference" msgstr "Næste forskel" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "Åbn venstre..." #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "Åbn højre..." #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "Farvet baggrund" #: tfrmdiffer.actprevdifference.caption msgctxt "tfrmdiffer.actprevdifference.caption" msgid "Previous Difference" msgstr "Forrige forskel" #: tfrmdiffer.actprevdifference.hint msgctxt "tfrmdiffer.actprevdifference.hint" msgid "Previous Difference" msgstr "Forrige forskel" #: tfrmdiffer.actreload.caption #, fuzzy #| msgid "Reload" msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "Genindlæs" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "Genindlæs" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "&Gem" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "&Gem" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "Gem som..." #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "Gem som..." #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "Gem venstre" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "Gem venstre" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "Gem venstre som..." #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "Gem venstre som..." #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "Gem højre" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "Gem højre" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "Gem højre som..." #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "Gem højre som..." #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "Sammenlign" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "Sammenlign" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "Koder" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "Koder" #: tfrmdiffer.caption msgctxt "tfrmdiffer.caption" msgid "Compare files" msgstr "Sammenlign indhold" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miencodingleft.caption #, fuzzy #| msgid "Left" msgid "&Left" msgstr "Venstre" #: tfrmdiffer.miencodingright.caption #, fuzzy #| msgid "Right" msgid "&Right" msgstr "Højre" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "&Handlinger" #: tfrmdiffer.mnuedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "&Rediger" #: tfrmdiffer.mnuencoding.caption #, fuzzy #| msgid "Encoding" msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "&Koder" #: tfrmdiffer.mnufile.caption #, fuzzy #| msgid "File" msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "&Filer" #: tfrmdiffer.mnuoptions.caption msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "&Indstillinger" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "" #: tfrmedithotkey.btncancel.caption msgctxt "tfrmedithotkey.btncancel.caption" msgid "&Cancel" msgstr "Af&bryd" #: tfrmedithotkey.btnok.caption msgctxt "tfrmedithotkey.btnok.caption" msgid "&OK" msgstr "&OK" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "" #: tfrmedithotkey.cghkcontrols.caption msgid "Only for these controls" msgstr "" #: tfrmedithotkey.lblparameters.caption msgid "&Parameters (each in a separate line):" msgstr "" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "&Om" #: tfrmeditor.actabout.hint msgctxt "tfrmeditor.actabout.hint" msgid "About" msgstr "&Om sammenligneren..." #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "&Konfiguration" #: tfrmeditor.actconfhigh.hint msgctxt "tfrmeditor.actconfhigh.hint" msgid "Configuration" msgstr "Konfiguration" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "K&opier" #: tfrmeditor.acteditcopy.hint msgctxt "tfrmeditor.acteditcopy.hint" msgid "Copy" msgstr "Kopier" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "&Klip" #: tfrmeditor.acteditcut.hint msgctxt "tfrmeditor.acteditcut.hint" msgid "Cut" msgstr "Klip" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "S&let" #: tfrmeditor.acteditdelete.hint msgctxt "tfrmeditor.acteditdelete.hint" msgid "Delete" msgstr "Slet" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "S&øg..." #: tfrmeditor.acteditfind.hint msgctxt "tfrmeditor.acteditfind.hint" msgid "Find" msgstr "Find" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "&Find næste" #: tfrmeditor.acteditfindnext.hint msgctxt "tfrmeditor.acteditfindnext.hint" msgid "Find next" msgstr "&Find næste" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcr.hint msgctxt "tfrmeditor.acteditlineendcr.hint" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "tfrmeditor.acteditlineendcrlf.hint" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditlineendlf.hint msgctxt "tfrmeditor.acteditlineendlf.hint" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Sæt i&nd" #: tfrmeditor.acteditpaste.hint msgctxt "tfrmeditor.acteditpaste.hint" msgid "Paste" msgstr "Sæt ind" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Annuller fortryd" #: tfrmeditor.acteditredo.hint msgctxt "tfrmeditor.acteditredo.hint" msgid "Redo" msgstr "Annuller fortryd" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "&Erstat..." #: tfrmeditor.acteditrplc.hint msgctxt "tfrmeditor.acteditrplc.hint" msgid "Replace" msgstr "Erstat" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "&Markér alt" #: tfrmeditor.acteditselectall.hint msgctxt "tfrmeditor.acteditselectall.hint" msgid "Select All" msgstr "Vælg alle" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Fo&rtryd" #: tfrmeditor.acteditundo.hint msgctxt "tfrmeditor.acteditundo.hint" msgid "Undo" msgstr "Fortryd" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "&Luk" #: tfrmeditor.actfileclose.hint msgctxt "tfrmeditor.actfileclose.hint" msgid "Close" msgstr "&Luk" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "&Afslut" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "&Ny" #: tfrmeditor.actfilenew.hint msgctxt "tfrmeditor.actfilenew.hint" msgid "New" msgstr "Ny" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "Å&bn..." #: tfrmeditor.actfileopen.hint msgctxt "tfrmeditor.actfileopen.hint" msgid "Open" msgstr "Åbn" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "&Gem" #: tfrmeditor.actfilesave.hint msgctxt "tfrmeditor.actfilesave.hint" msgid "Save" msgstr "&Gem" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "Gem &som..." #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "Gem alle" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "" #: tfrmeditor.caption msgctxt "TFRMEDITOR.CAPTION" msgid "Editor" msgstr "Editor" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "&Hjælp" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Rediger" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "Koder" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "Åbn som" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "Gem som" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "&Filer" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "Fremhæv syntaks" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n5.caption msgctxt "tfrmeditor.n5.caption" msgid "-" msgstr "-" #: tfrmeditsearchreplace.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "" "Forskel på STORE\n" "og små &bogstaver\n" #: tfrmeditsearchreplace.cbsearchfromcursor.caption #, fuzzy #| msgid "Search from &caret" msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "" "Søg fra &lodret tegn\n" "(pipe)\n" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "&Regulære udtryk" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "Kun den valgt &tekst" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "Kun hele ord" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "Indstillinger" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "E&rstat med:" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "&Søg efter:" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "Retning" #: tfrmextractdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmextractdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "&Hjælp" #: tfrmextractdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmextractdlg.caption msgctxt "tfrmextractdlg.caption" msgid "Unpack files" msgstr "Udpak filer" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "&Udpak stinavn, hvis gemt med fil(er)" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*.*" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "Udpak hvert arkiv til en &separate mapper (med navn som arkiv)" #: tfrmextractdlg.cboverwrite.caption #, fuzzy #| msgid "&Overwrite existing files" msgid "O&verwrite existing files" msgstr "&Overskriv eksisterende filer" #: tfrmextractdlg.lblextractto.caption #, fuzzy #| msgid "To the directory:" msgid "To the &directory:" msgstr "Udpak filer fra arkivet til:" #: tfrmextractdlg.lblfilemask.caption #, fuzzy #| msgid "Extract files matching file mask:" msgid "&Extract files matching file mask:" msgstr "Fil(er), der skal &pakkes ud: " #: tfrmextractdlg.lblpassword.caption #, fuzzy #| msgid "Password for encrypted files:" msgid "&Password for encrypted files:" msgstr "Password for krypterede filer:" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "Tilføj" #: tfrmfileassoc.btnaddext.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "Tilføj" #: tfrmfileassoc.btnaddnewtype.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "Tilføj" #: tfrmfileassoc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmfileassoc.btndownact.caption #, fuzzy #| msgid "Down" msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "Ned" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmfileassoc.btnremoveact.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "Fjern" #: tfrmfileassoc.btnremoveext.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "Fjern" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "X" #: tfrmfileassoc.btnremovetype.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "Fjern" #: tfrmfileassoc.btnrenametype.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "Omdøb" #: tfrmfileassoc.btnupact.caption #, fuzzy #| msgid "Up" msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "Op" #: tfrmfileassoc.caption msgid "File associations" msgstr "Filassociationer" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "Handlinger" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "Filendelser" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "Filtyper" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "Ikon" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "Handling:" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "&Kommando:" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "Rediger" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "Åbn i editor" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "Filnavn" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "Filsti" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "Komplet sti" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "Få output fra kommandovindue" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "Åbn" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "Kør i terminalvindue" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "Åbn i VFS" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "Vis" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "Åbn i fremviser" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Luk" #: tfrmfileexecuteyourself.caption msgctxt "tfrmfileexecuteyourself.caption" msgid "Wait..." msgstr "Vent.." #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "Filnavn:" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "Fra:" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "Klik på Luk, når den midlertidige fil kan slettes!" #: tfrmfileop.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "Fra:" #: tfrmfileop.lblto.caption msgid "To:" msgstr "Til:" #: tfrmfileproperties.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Luk" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "" #: tfrmfileproperties.caption msgctxt "tfrmfileproperties.caption" msgid "Properties" msgstr "Egenskaber" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Klæbrig" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "Ejer" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Gruppe:" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Andre:" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Ejer:" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "" #: tfrmfileproperties.lblattrtextstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Tekst:" #: tfrmfileproperties.lblcontains.caption msgctxt "tfrmfileproperties.lblcontains.caption" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Udfør" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "Filnavn" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "Navn:" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "Navn:" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "Placering:" #: tfrmfileproperties.lblgroupstr.caption #, fuzzy #| msgid "Group" msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "Gruppe:" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "Åbnet:" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "Ændret:" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "Attributter ændret:" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Oktal:" #: tfrmfileproperties.lblownerstr.caption #, fuzzy #| msgid "Owner" msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "Ejer:" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Læs" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "Størrelse:" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption msgid "Symlink to:" msgstr "Symlink til:" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption msgid "Type:" msgstr "Filtype:" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Skriv" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Attributter" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "Egenskaber" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "Tilføj" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "&Hjælp" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Luk" #: tfrmfinddlg.btnedit.caption msgctxt "tfrmfinddlg.btnedit.caption" msgid "&Edit" msgstr "&Rediger" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "G&å til fil" #: tfrmfinddlg.btnlastsearch.caption msgid "&Last search" msgstr "" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "Ny s&øgning" #: tfrmfinddlg.btnsavetemplate.caption #, fuzzy #| msgid "Save" msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "&Gem" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "S&let" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "H&ent" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "&Gem" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption msgid "Sa&ve with \"Start in directory\"" msgstr "" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "" #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "&Start" #: tfrmfinddlg.btnstop.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "&Annuller" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "&Vis" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "Ko&pier til listboks" #: tfrmfinddlg.caption msgctxt "tfrmfinddlg.caption" msgid "Find files" msgstr "Find filer" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "" "Forskel på STORE\n" "og små bogstaver\n" #: tfrmfinddlg.cbdatefrom.caption #, fuzzy #| msgid "Date From:" msgid "&Date from:" msgstr "Fra dato:" #: tfrmfinddlg.cbdateto.caption #, fuzzy #| msgid "Date To:" msgid "Dat&e to:" msgstr "Til dato:" #: tfrmfinddlg.cbfilesizefrom.caption #, fuzzy #| msgid "Size from:" msgid "S&ize from:" msgstr "Filstørrelse fra:" #: tfrmfinddlg.cbfilesizeto.caption #, fuzzy #| msgid "Size to:" msgid "Si&ze to:" msgstr "Filstørrelse til:" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "&Find tekst:" #: tfrmfinddlg.cbfollowsymlinks.caption msgid "Follow s&ymlinks" msgstr "" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "Find filer, der IKKE indeholder teksten" #: tfrmfinddlg.cbnotolderthan.caption #, fuzzy #| msgid "Not older than:" msgid "N&ot older than:" msgstr "Ikke &ældre end:" #: tfrmfinddlg.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name " msgid "Searc&h for part of file name" msgstr "Søg efter en del af filnavnet " #: tfrmfinddlg.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "&Regulære udtryk" #: tfrmfinddlg.cbreplacetext.caption msgid "Re&place by" msgstr "Erstat med:" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "" #: tfrmfinddlg.cbtimefrom.caption #, fuzzy #| msgid "Time from:" msgid "&Time from:" msgstr "Fra tid:" #: tfrmfinddlg.cbtimeto.caption #, fuzzy #| msgid "Time to:" msgid "Ti&me to:" msgstr "Til tid:" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "Anvend søge-plugin:" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*.*" #: tfrmfinddlg.gbdirectories.caption msgctxt "tfrmfinddlg.gbdirectories.caption" msgid "Directories" msgstr "" #: tfrmfinddlg.gbfiles.caption msgctxt "tfrmfinddlg.gbfiles.caption" msgid "Files" msgstr "" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "Find data" #: tfrmfinddlg.lblattributes.caption msgid "Attri&butes" msgstr "" #: tfrmfinddlg.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "Koder:" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "Søg &efter:" #: tfrmfinddlg.lblfindpathstart.caption #, fuzzy #| msgid "&Directory" msgid "Start in &directory" msgstr "Søg &i mappe:" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "Søg i under&mapper:" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "&Tidligere søgninger:" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "Fjern fra liste" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "Vis alle fundne elementer" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "Vis i fremviser" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "Avanceret" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "Hent/gem" #: tfrmfinddlg.tsplugins.caption msgctxt "tfrmfinddlg.tsplugins.caption" msgid "Plugins" msgstr "Plugins" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "Resultater" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "Generelt" #: tfrmfindview.btnclose.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmfindview.btnfind.caption #, fuzzy #| msgid "Find" msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "Find" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "Find" #: tfrmfindview.cbcasesens.caption #, fuzzy #| msgid "Case sensitive" msgid "C&ase sensitive" msgstr "STORE og små bogstaver" #: tfrmhardlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmhardlink.caption msgid "Create hard link" msgstr "Dan hårdt link" #: tfrmhardlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Destination, som linket skal pege på:" #: tfrmhardlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Navn på linket:" #: tfrmhotdir.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "Tilføj" #: tfrmhotdir.btnaddman.caption #, fuzzy #| msgid "Add manually" msgid "Add &manually" msgstr "Tilføj manuelt" #: tfrmhotdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmhotdir.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Slet" #: tfrmhotdir.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Rediger" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "Rediger favoritmapper" #: tfrmlinker.btnexit.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmlinker.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "..." #: tfrmlinker.caption msgctxt "tfrmlinker.caption" msgid "Linker" msgstr "Saml filer" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "Saml ovenstående filer til" #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "Element" #: tfrmlinker.lblfilename.caption #, fuzzy #| msgid "File name" msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "filnavnet:" #: tfrmlinker.spbtndel.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "Slet" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "Slet" #: tfrmlinker.spbtndown.caption #, fuzzy #| msgid "Down" msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "Ned" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "Ned" #: tfrmlinker.spbtnup.caption #, fuzzy #| msgid "Up" msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "Op" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "Op" #: tfrmmain.actabout.caption msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "&Om Double Commander" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "Tilføj filnavn til kommandolinje" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "Tilføj sti og filnavn til kommandolinje" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "Kopier sti til kommandolinje" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "" #: tfrmmain.actcalculatespace.caption msgid "Calculate &Occupied Space" msgstr "B&eregn brugt plads..." #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "Skift mappe" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "Gå til overmappe" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "Gå til rod-mappe" #: tfrmmain.actchecksumcalc.caption msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "&Dan CRC-kontrolsumfil(er)..." #: tfrmmain.actchecksumverify.caption msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "Kontroller CRC-kontrolsu&m (fra kontrolsum-filer)..." #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "Tøm logfil" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "Tøm logvindue" #: tfrmmain.actclosealltabs.caption msgid "Close &All Tabs" msgstr "" #: tfrmmain.actclosetab.caption msgid "&Close Tab" msgstr "" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "Sammenlign &indhold..." #: tfrmmain.actcomparedirectories.caption msgctxt "tfrmmain.actcomparedirectories.caption" msgid "Compare Directories" msgstr "" #: tfrmmain.actcomparedirectories.hint msgctxt "tfrmmain.actcomparedirectories.hint" msgid "Compare Directories" msgstr "" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "Vis kontekstmenu" #: tfrmmain.actcopy.caption #, fuzzy #| msgid "Copy F5" msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "Kopier F5" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "K&opier filnavn + sti til Udklipsholder" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "&Kopier filnavn til Udklipsholder" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "Kopier filer uden bekræftelse" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "Kopier til samme panel" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "&Kopier" #: tfrmmain.actcountdircontent.caption msgid "Sho&w Occupied Space" msgstr "Vis &brugt plads" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "Klip" #: tfrmmain.actdelete.caption #, fuzzy #| msgid "Delete F8" msgctxt "tfrmmain.actdelete.caption" msgid "Delete" msgstr "Slet F8" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "Mappehistorik" #: tfrmmain.actdirhotlist.caption msgid "Directory &Hotlist" msgstr "Favorit&mapper" #: tfrmmain.actedit.caption #, fuzzy #| msgid "Edit F4" msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "Rediger F4" #: tfrmmain.acteditcomment.caption msgid "Edit Co&mment..." msgstr "Rediger &filkommentar" #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "Rediger ny fil" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "Rediger stifeltet over fillisten" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "Ombyt &vinduer" #: tfrmmain.actexit.caption msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "Afslu&t" #: tfrmmain.actextractfiles.caption msgid "&Extract Files..." msgstr "&Udpak filer..." #: tfrmmain.actfileassoc.caption msgid "File &Associations..." msgstr "Asso&cier..." #: tfrmmain.actfilelinker.caption msgid "Com&bine Files..." msgstr "&Saml filer..." #: tfrmmain.actfileproperties.caption msgid "Show &File Properties" msgstr "E&genskaber..." #: tfrmmain.actfilespliter.caption msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "&Opdel fil..." #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "Fokus på kommandolinjen" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "Placer markøren på første fil på listen" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "Placer markøren på sidste fil på listen" #: tfrmmain.acthardlink.caption msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "Dan et &hårdt link..." #: tfrmmain.acthelpindex.caption msgid "&Contents" msgstr "&Indeks" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "&Horisontal visning" #: tfrmmain.actkeyboard.caption msgid "&Keyboard" msgstr "&Tastatur" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "Venstre &= Højre" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "Åbn venstre drevliste" #: tfrmmain.actloadselectionfromclip.caption msgid "Load Selection from Clip&board" msgstr "He&nt valg fra Udklipsholder" #: tfrmmain.actloadselectionfromfile.caption msgid "&Load Selection from File..." msgstr "&Hent valg fra fil" #: tfrmmain.actmakedir.caption #, fuzzy #| msgid "MakeDir F7" msgid "MakeDir" msgstr "Ny mappe F7" #: tfrmmain.actmarkcurrentextension.caption msgid "Select All with the Same E&xtension" msgstr "Vælg alle af samme &type" #: tfrmmain.actmarkinvert.caption msgid "&Invert Selection" msgstr "&Inverter valg" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "Vælg &alle" #: tfrmmain.actmarkminus.caption msgid "Unselect a Gro&up..." msgstr "In&dskrænk valg..." #: tfrmmain.actmarkplus.caption msgid "Select a &Group..." msgstr "&Udvid valg..." #: tfrmmain.actmarkunmarkall.caption msgid "&Unselect All" msgstr "&Fravælg alle" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "Minimer vindue" #: tfrmmain.actmultirename.caption msgid "Multi &Rename Tool" msgstr "Multi-omd&øbning..." #: tfrmmain.actnetworkconnect.caption msgid "Network &Connect..." msgstr "Forbind til netværk..." #: tfrmmain.actnetworkdisconnect.caption msgid "Network &Disconnect" msgstr "Afbryd til netværk" #: tfrmmain.actnetworkquickconnect.caption msgid "Network &Quick Connect..." msgstr "Hurtig netværksforbindelse..." #: tfrmmain.actnewtab.caption msgid "&New Tab" msgstr "&Dublér faneblad" #: tfrmmain.actnexttab.caption msgid "Switch to Nex&t Tab" msgstr "Skift til næs&te faneblad" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "Åbn" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "Prøv at åbne arkiv" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "" #: tfrmmain.actopendirinnewtab.caption msgid "Open &Folder in a New Tab" msgstr "Åbn mappe i et nyt faneblad" #: tfrmmain.actopenvirtualfilesystemlist.caption msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "Andre Computere" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "&Vis handlinger" #: tfrmmain.actoptions.caption msgid "&Options..." msgstr "&Indstillinger..." #: tfrmmain.actpackfiles.caption msgid "&Pack Files..." msgstr "&Pak filer..." #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "Indstil vidueopdelerens position" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "Sæt ind" #: tfrmmain.actprevtab.caption msgid "Switch to &Previous Tab" msgstr "Skift til forrige faneblad" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "Hurtigt filter" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "Hurtig søgning" #: tfrmmain.actquickview.caption msgid "&Quick View Panel" msgstr "&Hurtig visning" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "&Opdatér vindue" #: tfrmmain.actrename.caption #, fuzzy #| msgid "Move F6" msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "Flyt F6" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "Flyt/omdøb filer uden at spørge" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "Omdøb" #: tfrmmain.actrenametab.caption #, fuzzy #| msgid "Re&name Tab" msgid "&Rename Tab" msgstr "&Omdøb fane" #: tfrmmain.actrestoreselection.caption msgid "&Restore Selection" msgstr "&Gendan valg" #: tfrmmain.actreverseorder.caption msgid "Re&verse Order" msgstr "O&mvendt sortering" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "Højre &= venstre" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "Åbn højre drevliste" #: tfrmmain.actrunterm.caption msgid "Run &Terminal" msgstr "Åbn &terminal" #: tfrmmain.actsaveselection.caption msgid "Sa&ve Selection" msgstr "G&em valg" #: tfrmmain.actsaveselectiontofile.caption msgid "Save S&election to File..." msgstr "Gem &valg i fil" #: tfrmmain.actsearch.caption msgid "&Search..." msgstr "Find fi&ler..." #: tfrmmain.actsetfileproperties.caption msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "&Ændre attributter..." #: tfrmmain.actsettaboptiondirsinnewtab.caption msgid "Locked with Directories Opened in New &Tabs" msgstr "Lås faneblad med mapper åbnet i nyt faneblad" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "&Normal" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "L&ås faneblad" #: tfrmmain.actsettaboptionpathresets.caption msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "Lås faneblad, men &tillad mappeskift" #: tfrmmain.actshellexecute.caption msgctxt "tfrmmain.actshellexecute.caption" msgid "Open" msgstr "Åbn" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "Vis knappemenu" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "Vis kommandolinjehistorik" #: tfrmmain.actshowmainmenu.caption #, fuzzy #| msgid "Menu F9" msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "Menu F9" #: tfrmmain.actshowsysfiles.caption msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "V&is skjulte/system-filer" #: tfrmmain.actsortbyattr.caption msgid "Sort by &Attributes" msgstr "Sorter efter &attributter" #: tfrmmain.actsortbydate.caption msgid "Sort by &Date" msgstr "Sorter efter &dato" #: tfrmmain.actsortbyext.caption msgid "Sort by &Extension" msgstr "Sorter efter t&ype" #: tfrmmain.actsortbyname.caption msgid "Sort by &Name" msgstr "Sorter efter &navn" #: tfrmmain.actsortbysize.caption msgid "Sort by &Size" msgstr "Sorter efter &størrelse" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "Aktiver/deaktiver filliste for ikke at vist filnavne" #: tfrmmain.actsymlink.caption msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "Dan symbolsk &link..." #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "Mål = &kilde" #: tfrmmain.acttestarchive.caption msgid "&Test Archive(s)" msgstr "Ko&ntroller arkiv(er)" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "Overfør " #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "Flyt mappe under markøren til højre vindue" #: tfrmmain.actunmarkcurrentextension.caption msgid "Unselect All with the Same Ex&tension" msgstr "F&ravælg alle af samme type" #: tfrmmain.actview.caption #, fuzzy #| msgid "View F3" msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "Vis F3" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "Vis historikken for brugte stier i aktivt vindue" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "Gå til næste postering i historik" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "Gå til forrige postering i historik" #: tfrmmain.actvisithomepage.caption msgid "&Visit Double Commander Website" msgstr "Double Commander på &WWW" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "Sikker sletning" #: tfrmmain.btnf10.caption #, fuzzy #| msgid "Exit F10" msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "Afslut F10" #: tfrmmain.btnf8.caption msgctxt "tfrmmain.btnf8.caption" msgid "Delete" msgstr "Slet" #: tfrmmain.btnf9.caption #, fuzzy #| msgid "Terminal F9" msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "Terminal F9" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*.*" #: tfrmmain.btnleftdirectoryhotlist.hint msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.HINT" msgid "Directory hotlist" msgstr "Favoritmapper" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "<" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "Vis mappen fra det højre vindue i dette vindue" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnlefthome.hint msgctxt "TFRMMAIN.BTNLEFTHOME.HINT" msgid "Go to home directory" msgstr "Gå til home-mappen" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgctxt "TFRMMAIN.BTNLEFTROOT.HINT" msgid "Go to root directory" msgstr "Gå til roden" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgctxt "TFRMMAIN.BTNLEFTUP.HINT" msgid "Go to parent directory" msgstr "Gå til overordnet mappe" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*.*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr ">" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "Vis mappen fra det venstre vindue i dette vindue" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "tfrmmain.caption" msgid "Double Commander" msgstr "" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "Sti" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "&Annuller" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "Kopier..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "Dan link..." #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline33.caption msgctxt "tfrmmain.miline33.caption" msgid "-" msgstr "-" #: tfrmmain.miline37.caption msgctxt "tfrmmain.miline37.caption" msgid "-" msgstr "-" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "-" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "Tøm" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "Kopi" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "Skjul" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "Vælg alle" #: tfrmmain.mimove.caption msgid "Move..." msgstr "Flyt..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "Dan symlink..." #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "Faneindstillinger" #: tfrmmain.mitrayiconexit.caption msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "Afslut" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "Gendan" #: tfrmmain.mnualloperpause.caption msgctxt "tfrmmain.mnualloperpause.caption" msgid "||" msgstr "||" #: tfrmmain.mnualloperstart.caption msgctxt "tfrmmain.mnualloperstart.caption" msgid "Start" msgstr "Start" #: tfrmmain.mnualloperstop.caption #, fuzzy #| msgid "Cancel" msgctxt "tfrmmain.mnualloperstop.caption" msgid "Cancel" msgstr "&Annuller" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "&Kommandoer" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "&Opsætning" #: tfrmmain.mnufiles.caption msgid "&Files" msgstr "&Filer" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "&Hjælp" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "&Markér" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "Netværk" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "&Vis" #: tfrmmain.mnutaboptions.caption msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "&Indstillinger" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "F&aner" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "CD" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "Kopier" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "Klip" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "Slet" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "&Rediger..." #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "Sæt ind" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmmaskinputdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmmaskinputdlg.btndefinetemplate.caption #, fuzzy #| msgid "Define..." msgid "&Define..." msgstr "&Definer..." #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmmaskinputdlg.lblsearchtemplate.caption #, fuzzy #| msgid "Or select predefined selection type:" msgid "O&r select predefined selection type:" msgstr "Eller vælg fast definition:" #: tfrmmkdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmmkdir.caption msgid "Create new directory" msgstr "Opret ny mappe" #: tfrmmkdir.lblmakedir.caption #, fuzzy #| msgid "Input new directory name:" msgid "&Input new directory name:" msgstr "Ny mappe (directory):" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "pr." #: tfrmmodview.caption msgctxt "tfrmmodview.caption" msgid "New Size" msgstr "Ny størrelse" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "Højde:" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgid "2" msgstr "2" #: tfrmmodview.lblpath3.caption msgid "3" msgstr "3" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "4" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "5" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "JPG-komprimering" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "Bredde:" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "BMP" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "ICO" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "JPG" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "PNG" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "PNM" #: tfrmmodview.teheight.text msgid "Height" msgstr "Højde" #: tfrmmodview.tequality.text msgid "80" msgstr "80" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "Bredde" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Luk" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "&Slet" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "&Indlæs" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "&Start!" #: tfrmmultirename.btnrestore.caption #, fuzzy #| msgid "Reset all" msgid "Reset &all" msgstr "Nulstil alle" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "&Gem" #: tfrmmultirename.caption msgctxt "tfrmmultirename.caption" msgid "MultiRename" msgstr "Multi-omdøbning" #: tfrmmultirename.cblog.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "Aktiver" #: tfrmmultirename.cbregexp.caption msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "Regulære &udtryk" #: tfrmmultirename.cbusesubs.caption msgid "&Use substitution" msgstr "&Brug substituter" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption msgid "[E] Extension" msgstr "[E] &Type" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "Tæller" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "Søg && erstat" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "Log-resultat" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "Omdøb maske" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "Forvalg" #: tfrmmultirename.lbext.caption msgid "&Extension" msgstr "&Filtype" #: tfrmmultirename.lbfind.caption msgid "&Find..." msgstr "Sø&g efter:" #: tfrmmultirename.lbinterval.caption #, fuzzy #| msgid "Interval" msgid "&Interval" msgstr "St&ep:" #: tfrmmultirename.lbname.caption msgid "File &Name" msgstr "Fil&navn" #: tfrmmultirename.lbreplace.caption msgid "Re&place..." msgstr "Erstat &med:" #: tfrmmultirename.lbstnb.caption #, fuzzy #| msgid "Start Number" msgid "S&tart Number" msgstr "Start &ved:" #: tfrmmultirename.lbwidth.caption #, fuzzy #| msgid "Width" msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "&Cifre:" #: tfrmmultirename.micounter.caption msgid "[C] Counter" msgstr "[C] T&æller" #: tfrmmultirename.miday.caption msgid "[D] Day" msgstr "[D] Dag" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "[DD] Dag (to cifre)" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "[DDD] Ugedag (kort, f.eks. \"man\")" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "[DDDD] Ugedag (lang, f.eks. mandag\")" #: tfrmmultirename.miextensionx.caption msgid "[Ex] Character at position x" msgstr "[Ex] Tegn ved position x" #: tfrmmultirename.miextensionxx.caption msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:y] Tegn fra position x til y" #: tfrmmultirename.mihour.caption msgid "[h] Hour" msgstr "[h] Time" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "[hh] Time (to cifre)" #: tfrmmultirename.miminute.caption msgid "[n] Minute" msgstr "[n] Minut" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "[nn] Minut (to cifre)" #: tfrmmultirename.mimonth.caption msgid "[M] Month" msgstr "[M] Måned" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "[MM] Måned (to cifre)" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "[MMM] Månedsnavn (kort, f.eks. \"jan\")" #: tfrmmultirename.mimonth3.caption #, fuzzy #| msgid "[MMMM] Month name (long, e.g. \"january\")" msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "[MMMM] Månedsnavn (langt, f.eks. januar\")" #: tfrmmultirename.miname.caption msgid "[N] Name" msgstr "[N] Navn" #: tfrmmultirename.minamex.caption msgid "[Nx] Character at position x" msgstr "[Nx] Tegn ved position x" #: tfrmmultirename.minamexx.caption msgid "[Nx:y] Characters from position x to y" msgstr "[Nx:y] Tegn fra position x til y" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "Tid..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "Type..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "Navn..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "Plugin" #: tfrmmultirename.misecond.caption msgid "[s] Second" msgstr "[s] Sekund" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "[ss] Sekund (to cifre)" #: tfrmmultirename.miyear.caption msgid "[Y] Year (2 digits)" msgstr "[Y] År (to cifre)" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "[YYYY] År (fire cifre)" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "tfrmmultirename.stringgrid.columns[0].title.caption" msgid "Old File Name" msgstr "Gammelt navn" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "tfrmmultirename.stringgrid.columns[1].title.caption" msgid "New File Name" msgstr "Nyt navn" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "tfrmmultirename.stringgrid.columns[2].title.caption" msgid "File Path" msgstr "Placering" #: tfrmopenwith.caption msgid "Choose an application" msgstr "" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "" #: tfrmoptions.btnapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "&Udfør" #: tfrmoptions.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmoptions.caption msgctxt "tfrmoptions.caption" msgid "Options" msgstr "Indstillinger" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "" #: tfrmoptionsarchivers.btnautoconfig.caption msgid "A&uto Configure" msgstr "" #: tfrmoptionsarchivers.btnmultiarcadd.caption msgctxt "tfrmoptionsarchivers.btnmultiarcadd.caption" msgid "A&dd" msgstr "Tilføj" #: tfrmoptionsarchivers.btnmultiarcapply.caption msgctxt "tfrmoptionsarchivers.btnmultiarcapply.caption" msgid "A&pply" msgstr "" #: tfrmoptionsarchivers.btnmultiarcdelete.caption msgctxt "tfrmoptionsarchivers.btnmultiarcdelete.caption" msgid "D&elete" msgstr "" #: tfrmoptionsarchivers.btnmultiarcrename.caption msgctxt "tfrmoptionsarchivers.btnmultiarcrename.caption" msgid "&Rename" msgstr "&Start!" #: tfrmoptionsarchivers.chkmultiarcdebug.caption msgid "De&bug mode" msgstr "" #: tfrmoptionsarchivers.chkmultiarcenabled.caption msgid "E&nabled" msgstr "" #: tfrmoptionsarchivers.chkmultiarcoutput.caption msgid "S&how console output" msgstr "" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "tfrmoptionsarchivers.gbarchiveroptions.caption" msgid "Options" msgstr "Indstillinger" #: tfrmoptionsarchivers.lblarchiveadd.caption msgid "Add&ing:" msgstr "" #: tfrmoptionsarchivers.lblarchiveextension.caption msgid "E&xtension:" msgstr "" #: tfrmoptionsarchivers.lblarchiveextract.caption msgid "Ex&tract:" msgstr "" #: tfrmoptionsarchivers.lblarchivelist.caption msgid "&List:" msgstr "" #: tfrmoptionsarchivers.lblarchivelistend.caption msgid "Listing &finish (optional):" msgstr "" #: tfrmoptionsarchivers.lblarchivelistformat.caption msgid "Listing for&mat:" msgstr "" #: tfrmoptionsarchivers.lblarchiveliststart.caption msgid "Listin&g start (optional):" msgstr "" #: tfrmoptionsarchivers.lblarchiver.caption msgid "Arc&hiver:" msgstr "" #: tfrmoptionsarchivers.lbldescription.caption msgid "De&scription:" msgstr "" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "tfrmoptionsarchivers.tbarchiveradditional.caption" msgid "Additional" msgstr "Ekstra" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "tfrmoptionsarchivers.tbarchivergeneral.caption" msgid "General" msgstr "Generelt" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption msgctxt "tfrmoptionsautorefresh.cbwatchattributeschange.caption" msgid "When &size, date or attributes change" msgstr "Når størrelse, dato/tid eller attributter &ændres" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "tfrmoptionsautorefresh.cbwatchexcludedirs.caption" msgid "For the following &paths and their subdirectories:" msgstr "For de følgende &stier og deres undermapper:" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption msgid "When &files are created, deleted or renamed" msgstr "" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption msgctxt "tfrmoptionsautorefresh.cbwatchonlyforeground.caption" msgid "When application is in the &background" msgstr "Når &Double Commander er i baggrunden" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "tfrmoptionsautorefresh.gbautorefreshdisable.caption" msgid "Disable auto-refresh" msgstr "Slå automatisk opdatering fra" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "tfrmoptionsautorefresh.gbautorefreshenable.caption" msgid "Refresh file list" msgstr "Automatisk opdatering ved ændringer i filsystemet" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption msgid "Al&ways show tray icon" msgstr "" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption msgid "Automatically &hide unmounted devices" msgstr "" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "tfrmoptionsbehavior.cbminimizetotray.caption" msgid "Mo&ve icon to system tray when minimized" msgstr "Flyt iko&n til systembakke, når minimeret" #: tfrmoptionsbehavior.cbonlyonce.caption msgid "A&llow only one copy of DC at a time" msgstr "" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "" #: tfrmoptionsbehavior.lbldrivesblacklist.caption msgid "Drives &blacklist" msgstr "" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption msgid "Cut &text to column width" msgstr "" #: tfrmoptionscolumnsview.cbgridhorzline.caption msgid "&Horizontal lines" msgstr "" #: tfrmoptionscolumnsview.cbgridvertline.caption msgid "&Vertical lines" msgstr "" #: tfrmoptionscolumnsview.chkautofillcolumns.caption msgid "A&uto fill columns" msgstr "" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "" #: tfrmoptionscolumnsview.lblautosizecolumn.caption msgid "Auto si&ze column:" msgstr "" #: tfrmoptionsconfiguration.btnconfigapply.caption msgctxt "tfrmoptionsconfiguration.btnconfigapply.caption" msgid "A&pply" msgstr "" #: tfrmoptionsconfiguration.btnconfigedit.caption msgctxt "tfrmoptionsconfiguration.btnconfigedit.caption" msgid "&Edit" msgstr "&Rediger" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption msgid "Co&mmand line history" msgstr "" #: tfrmoptionsconfiguration.cbdirhistory.caption msgid "&Directory history" msgstr "" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption msgid "&File mask history" msgstr "" #: tfrmoptionsconfiguration.chksaveconfiguration.caption msgid "Sa&ve configuration" msgstr "" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption msgid "Searc&h/Replace history" msgstr "" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgctxt "tfrmoptionsconfiguration.gblocconfigfiles.caption" msgid "Location of configuration files" msgstr "Placering af konfigurationsfiler" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgctxt "tfrmoptionsconfiguration.gbsaveonexit.caption" msgid "Save on exit" msgstr "Gem ved afslut" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgctxt "tfrmoptionsconfiguration.lblcmdlineconfigdir.caption" msgid "Set on command line" msgstr "Angiv i kommandolinje" #: tfrmoptionsconfiguration.rbprogramdir.caption msgid "P&rogram directory (portable version)" msgstr "" #: tfrmoptionsconfiguration.rbuserhomedir.caption msgid "&User home directory" msgstr "" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption msgid "C&opy" msgstr "" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption msgctxt "tfrmoptionscustomcolumns.btndelcolumnsset.caption" msgid "&Delete" msgstr "S&let" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption msgctxt "tfrmoptionscustomcolumns.btneditcolumnsset.caption" msgid "&Edit" msgstr "&Rediger" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "tfrmoptionscustomcolumns.btnnewcolumnsset.caption" msgid "&New" msgstr "&Ny" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "tfrmoptionscustomcolumns.cbbfilesystem.text" msgid "General" msgstr "Generelt" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption msgid "Con&figure columns for file system:" msgstr "" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption msgid "&Show confirmation dialog after drop" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption msgid "Show &file system" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption msgid "Show fr&ee space" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption msgid "Show &label" msgstr "" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "" #: tfrmoptionseditorcolors.backgroundlabel.caption msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "" #: tfrmoptionseditorcolors.foregroundlabel.caption msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption msgid "&Text-mark" msgstr "" #: tfrmoptionseditorcolors.tbtnglobal.caption msgid "Use (and edit) &global scheme settings" msgstr "" #: tfrmoptionseditorcolors.tbtnlocal.caption msgid "Use &local scheme settings" msgstr "" #: tfrmoptionseditorcolors.textboldcheckbox.caption msgctxt "tfrmoptionseditorcolors.textboldcheckbox.caption" msgid "&Bold" msgstr "Feb" #: tfrmoptionseditorcolors.textboldradioinvert.caption msgctxt "tfrmoptionseditorcolors.textboldradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textboldradiooff.caption msgctxt "tfrmoptionseditorcolors.textboldradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textboldradioon.caption msgctxt "tfrmoptionseditorcolors.textboldradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textitaliccheckbox.caption msgctxt "tfrmoptionseditorcolors.textitaliccheckbox.caption" msgid "&Italic" msgstr "Kurs&iv" #: tfrmoptionseditorcolors.textitalicradioinvert.caption msgctxt "tfrmoptionseditorcolors.textitalicradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textitalicradiooff.caption msgctxt "tfrmoptionseditorcolors.textitalicradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textitalicradioon.caption msgctxt "tfrmoptionseditorcolors.textitalicradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption msgid "&Strike Out" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption msgctxt "tfrmoptionseditorcolors.textunderlinecheckbox.caption" msgid "&Underline" msgstr "Understreget" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textunderlineradiooff.caption msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textunderlineradioon.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "" #: tfrmoptionsfileoperations.cbdeletetotrash.caption msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption msgid "D&rop readonly flag" msgstr "" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption msgid "&Search for part of file name" msgstr "" #: tfrmoptionsfileoperations.cbprocesscomments.caption msgid "&Process comments with files/folders" msgstr "" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption msgid "Select &file name without extension when renaming" msgstr "" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption msgid "Sho&w tab select panel in copy/move dialog" msgstr "" #: tfrmoptionsfileoperations.cbskipfileoperror.caption msgid "S&kip file operations errors and write them to log window" msgstr "" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "tfrmoptionsfileoperations.gbfilesearch.caption" msgid "File search" msgstr "Find filer" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "" #: tfrmoptionsfileoperations.lblbuffersize.caption msgid "&Buffer size for file operations (in KB):" msgstr "" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "" #: tfrmoptionsfileoperations.lblprogresskind.caption msgid "Show operations progress &initially in" msgstr "" #: tfrmoptionsfileoperations.lblwipepassnumber.caption msgid "&Number of wipe passes:" msgstr "" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption msgid "Use memory mapping for search te&xt in files" msgstr "" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption msgid "&Use stream for search text in files" msgstr "" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnbackcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "tfrmoptionsfilepanelscolors.btnbackcolor2.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btncursorcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "tfrmoptionsfilepanelscolors.btncursortext.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnforecolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnindbackcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnindcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnmarkcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption msgid "Use &Frame Cursor" msgstr "" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption msgid "Use &Gradient Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption msgid "U&se Inverted Selection" msgstr "" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgid "Drive Free Space Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "tfrmoptionsfilepanelscolors.gbexample.caption" msgid "Example" msgstr "Eksempel" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption msgid "Bac&kground:" msgstr "" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption msgid "Backg&round 2:" msgstr "" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption msgid "C&ursor Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblcursortext.caption msgid "Cursor Te&xt:" msgstr "" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption msgid "&Brightness level of inactive panel" msgstr "" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption msgid "In&dicator Back Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblindcolor.caption msgid "&Indicator Fore Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption msgid "&Mark Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption msgid "T&ext Color:" msgstr "" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption msgid "Do&n't load file list until a tab is activated" msgstr "" #: tfrmoptionsfilesviews.cbdirbrackets.caption msgid "S&how square brackets around directories" msgstr "" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption msgid "Hi&ghlight new and updated files" msgstr "" #: tfrmoptionsfilesviews.cblistfilesinthread.caption msgid "Load &file list in separate thread" msgstr "" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption msgid "Load icons af&ter file list" msgstr "" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption msgid "Show s&ystem and hidden files" msgstr "" #: tfrmoptionsfilesviews.cbspacemovesdown.caption msgid "&When selecting files with , move down to next file (as with )" msgstr "" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "" #: tfrmoptionsfilesviews.gbsorting.caption msgctxt "tfrmoptionsfilesviews.gbsorting.caption" msgid "Sorting" msgstr "Sortering" #: tfrmoptionsfilesviews.lblcasesensitivity.caption msgid "Case s&ensitivity:" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeformat.caption msgid "&Date and time format:" msgstr "" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "" #: tfrmoptionsfilesviews.lblnewfilesposition.caption msgid "&Insert new files" msgstr "" #: tfrmoptionsfilesviews.lblsortfoldermode.caption msgid "So&rting directories:" msgstr "" #: tfrmoptionsfilesviews.lblsortmethod.caption msgid "&Sort method:" msgstr "" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption msgid "&Move updated files" msgstr "" #: tfrmoptionsfiletypescolors.btnaddcategory.caption msgctxt "tfrmoptionsfiletypescolors.btnaddcategory.caption" msgid "A&dd" msgstr "Tilføj" #: tfrmoptionsfiletypescolors.btnapplycategory.caption msgctxt "tfrmoptionsfiletypescolors.btnapplycategory.caption" msgid "A&pply" msgstr "" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "tfrmoptionsfiletypescolors.btncategorycolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption msgctxt "tfrmoptionsfiletypescolors.btndeletecategory.caption" msgid "D&elete" msgstr "" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "tfrmoptionsfiletypescolors.btnsearchtemplate.hint" msgid "Template..." msgstr "Skabelon..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption msgid "File types colors (sort by drag&&drop)" msgstr "" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption msgid "Category a&ttributes:" msgstr "" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption msgid "Category co&lor:" msgstr "" #: tfrmoptionsfiletypescolors.lblcategorymask.caption msgctxt "tfrmoptionsfiletypescolors.lblcategorymask.caption" msgid "Category &mask:" msgstr "" #: tfrmoptionsfiletypescolors.lblcategoryname.caption msgctxt "tfrmoptionsfiletypescolors.lblcategoryname.caption" msgid "Category &name:" msgstr "" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "tfrmoptionsfonts.btnseleditfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "tfrmoptionsfonts.btnsellogfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "tfrmoptionsfonts.btnselmainfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "tfrmoptionsfonts.btnselviewerbookfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "tfrmoptionsfonts.btnselviewfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.lbleditorfont.caption msgid "&Editor font" msgstr "" #: tfrmoptionsfonts.lbllogfont.caption msgid "&Log font" msgstr "" #: tfrmoptionsfonts.lblmainfont.caption msgid "Main &font" msgstr "" #: tfrmoptionsfonts.lblviewerbookfont.caption msgid "Viewer&Book Font" msgstr "" #: tfrmoptionsfonts.lblviewerfont.caption msgid "&Viewer font" msgstr "" #: tfrmoptionshotkeys.btnaddhotkey.caption msgid "Add &hotkey" msgstr "" #: tfrmoptionshotkeys.btndeletehotkey.caption msgid "&Delete hotkey" msgstr "" #: tfrmoptionshotkeys.btnedithotkey.caption msgid "&Edit hotkey" msgstr "" #: tfrmoptionshotkeys.lbfilter.caption msgid "&Filter" msgstr "" #: tfrmoptionshotkeys.lblcategories.caption msgid "C&ategories:" msgstr "" #: tfrmoptionshotkeys.lblcommands.caption msgid "Co&mmands:" msgstr "" #: tfrmoptionshotkeys.lblscfiles.caption msgid "&Shortcut files:" msgstr "" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "tfrmoptionshotkeys.stghotkeys.columns[0].title.caption" msgid "Hotkey" msgstr "Genvejstaster" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "tfrmoptionshotkeys.stghotkeys.columns[1].title.caption" msgid "Parameters" msgstr "Parametre" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption msgid "Controls" msgstr "" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "tfrmoptionsicons.cbiconsexclude.caption" msgid "For the following &paths and their subdirectories:" msgstr "For de følgende &stier og deres undermapper:" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "tfrmoptionsicons.cbiconsinmenussize.text" msgid "16x16" msgstr "" #: tfrmoptionsicons.cbiconsshowoverlay.caption msgid "Show o&verlay icons, e.g. for links" msgstr "" #: tfrmoptionsicons.cbiconssize.text msgctxt "tfrmoptionsicons.cbiconssize.text" msgid "16x16" msgstr "" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "" #: tfrmoptionsicons.gbiconssize.caption msgid " Icon size " msgstr "" #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "tfrmoptionsicons.gbshowiconsmode.caption" msgid " Show icons to the left of the filename " msgstr "Vis ikoner til venstre for filnavnet" #: tfrmoptionsicons.rbiconsshowall.caption msgctxt "tfrmoptionsicons.rbiconsshowall.caption" msgid "A&ll" msgstr "Alle" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "tfrmoptionsicons.rbiconsshowallandexe.caption" msgid "All associated + &EXE/LNK (slow)" msgstr "&Alle associerede filer inkl. EXE/LNK (langsomt)" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "tfrmoptionsicons.rbiconsshownone.caption" msgid "&No icons" msgstr "Ingen ik&oner" #: tfrmoptionsicons.rbiconsshowstandard.caption msgid "Only &standard icons" msgstr "" #: tfrmoptionsignorelist.btnaddsel.caption msgid "A&dd selected names" msgstr "" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "tfrmoptionsignorelist.btnaddselwithpath.caption" msgid "Add selected names with &full path" msgstr "Tilføj valgte navne med hele stien" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "tfrmoptionsignorelist.chkignoreenable.caption" msgid "&Ignore (don't show) the following files and folders:" msgstr "&Ignorer (vis ikke) følgende filer og mapper:" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "tfrmoptionsignorelist.lblsavein.caption" msgid "&Save in:" msgstr "Gem i:" #: tfrmoptionskeyboard.cblynxlike.caption msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "" #: tfrmoptionskeyboard.lblalt.caption msgid "Alt+L&etters" msgstr "" #: tfrmoptionskeyboard.lblctrlalt.caption msgid "Ctrl+Alt+Le&tters" msgstr "" #: tfrmoptionskeyboard.lblnomodifier.caption msgid "&Letters" msgstr "" #: tfrmoptionslayout.cbflatdiskpanel.caption msgctxt "tfrmoptionslayout.cbflatdiskpanel.caption" msgid "&Flat buttons" msgstr "" #: tfrmoptionslayout.cbflatinterface.caption msgid "Flat i&nterface" msgstr "" #: tfrmoptionslayout.cbflattoolbar.caption msgctxt "tfrmoptionslayout.cbflattoolbar.caption" msgid "Flat b&uttons" msgstr "Fla&de ikoner" #: tfrmoptionslayout.cbfreespaceind.caption msgid "Show fr&ee space indicator on drive label" msgstr "" #: tfrmoptionslayout.cblogwindow.caption msgid "Show lo&g window" msgstr "" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "tfrmoptionslayout.cbpanelofoperations.caption" msgid "Show panel of operation in background" msgstr "Vis handlingsvindue i baggrund" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "tfrmoptionslayout.cbproginmenubar.caption" msgid "Show common progress in menu bar" msgstr "Vis fremskridt i menulinje" #: tfrmoptionslayout.cbshowcmdline.caption msgid "Show command l&ine" msgstr "" #: tfrmoptionslayout.cbshowcurdir.caption msgid "Show current director&y" msgstr "" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "tfrmoptionslayout.cbshowdiskpanel.caption" msgid "Show &drive buttons" msgstr "Vis dr&ev-knapper" #: tfrmoptionslayout.cbshowdrivefreespace.caption msgid "Show free s&pace label" msgstr "" #: tfrmoptionslayout.cbshowdriveslistbutton.caption msgid "Show drives list bu&tton" msgstr "" #: tfrmoptionslayout.cbshowkeyspanel.caption msgid "Show function &key buttons" msgstr "" #: tfrmoptionslayout.cbshowmainmenu.caption msgid "Show &main menu" msgstr "" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "tfrmoptionslayout.cbshowmaintoolbar.caption" msgid "Show &button bar" msgstr "Vis &knappanel" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption msgid "Show short free space &label" msgstr "" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "tfrmoptionslayout.cbshowstatusbar.caption" msgid "Show &status bar" msgstr "Vis &statuslinje" #: tfrmoptionslayout.cbshowtabheader.caption msgid "S&how tabstop header" msgstr "" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "tfrmoptionslayout.cbshowtabs.caption" msgid "Sho&w folder tabs" msgstr "Vis faneb&lade" #: tfrmoptionslayout.cbtermwindow.caption msgid "Show te&rminal window" msgstr "" #: tfrmoptionslayout.cbtwodiskpanels.caption msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "tfrmoptionslayout.gbscreenlayout.caption" msgid " Screen layout " msgstr "Skærmlayout" #: tfrmoptionslog.cblogarcop.caption msgid "&Pack/Unpack" msgstr "" #: tfrmoptionslog.cblogcpmvln.caption msgid "Cop&y/Move/Create link/symlink" msgstr "" #: tfrmoptionslog.cblogdelete.caption msgctxt "tfrmoptionslog.cblogdelete.caption" msgid "&Delete" msgstr "&Slet" #: tfrmoptionslog.cblogdirop.caption msgid "Crea&te/Delete directories" msgstr "" #: tfrmoptionslog.cblogerrors.caption msgctxt "tfrmoptionslog.cblogerrors.caption" msgid "Log &errors" msgstr "Log &fejl" #: tfrmoptionslog.cblogfile.caption msgid "C&reate a log file:" msgstr "" #: tfrmoptionslog.cbloginfo.caption msgid "Log &information messages" msgstr "" #: tfrmoptionslog.cblogsuccess.caption msgctxt "tfrmoptionslog.cblogsuccess.caption" msgid "Log &successful operations" msgstr "Log su&ccesfulde operationer" #: tfrmoptionslog.cblogvfs.caption msgid "&File system plugins" msgstr "" #: tfrmoptionslog.gblogfile.caption msgctxt "tfrmoptionslog.gblogfile.caption" msgid "File operation log file" msgstr "Logfil for filoperationer" #: tfrmoptionslog.gblogfileop.caption msgid "Log operations" msgstr "" #: tfrmoptionslog.gblogfilestatus.caption msgid "Operation status" msgstr "" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "" #: tfrmoptionsmisc.chkshowwarningmessages.caption msgctxt "tfrmoptionsmisc.chkshowwarningmessages.caption" msgid "Show &warning messages (\"OK\" button only)" msgstr "" #: tfrmoptionsmisc.chkthumbsave.caption msgctxt "tfrmoptionsmisc.chkthumbsave.caption" msgid "&Save thumbnails in cache" msgstr "" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "tfrmoptionsmisc.dblthumbnails.caption" msgid "Thumbnails" msgstr "" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "tfrmoptionsmisc.lblthumbseparator.caption" msgid "X" msgstr "X" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "" #: tfrmoptionsmouse.cbselectionbymouse.caption msgid "&Selection by mouse" msgstr "" #: tfrmoptionsmouse.gbscrolling.caption msgctxt "tfrmoptionsmouse.gbscrolling.caption" msgid "Scrolling" msgstr "Rulning med musehjul" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "" #: tfrmoptionsmouse.lblmousemode.caption msgid "&Mode:" msgstr "" #: tfrmoptionsmouse.rbscrolllinebyline.caption msgid "&Line by line" msgstr "" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption msgid "Line by line &with cursor movement" msgstr "" #: tfrmoptionsmouse.rbscrollpagebypage.caption msgid "&Page by page" msgstr "" #: tfrmoptionsplugins.btnaddplugin.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "Tilføj" #: tfrmoptionsplugins.btnconfigplugin.caption #, fuzzy #| msgid "Configure" msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "Konfigurer" #: tfrmoptionsplugins.btnenableplugin.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "Aktiver" #: tfrmoptionsplugins.btnremoveplugin.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "Fjern" #: tfrmoptionsplugins.btntweakplugin.caption #, fuzzy #| msgid "Tweak" msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "Tilpas" #: tfrmoptionsplugins.lbldsxdescription.caption #, fuzzy #| msgid "Search plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "Søge-plugins giver mulighed for alternative søgealgoritmer eller eksterne værktøjer (som \"locate\", etc.)" #: tfrmoptionsplugins.lblwcxdescription.caption #, fuzzy #| msgid "Packer plugins are used to work with archives." msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "Pakke-plugins bruges til at åbne arkivtyper, som ikke er understøttet af Double Commander internt." #: tfrmoptionsplugins.lblwdxdescription.caption #, fuzzy #| msgid "Content plugins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "Indholds-plugins tillader at vise udvidede fildetaljer f.eks. mp3-tags eller fotooplysninger i fillister. Kan bruges i søgning og multi-omdøbning." #: tfrmoptionsplugins.lblwfxdescription.caption #, fuzzy #| msgid "File system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "Filsystem-plugins giver adgang til diske, som er utilgængelige for operativsystemet eller til eksterne enheder som Palm/PocketPC." #: tfrmoptionsplugins.lblwlxdescription.caption #, fuzzy #| msgid "Viewer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "Lister-pluins giver mulighed for at vise dataformater som f.eks. billeder, regneark, databaser etc. i Vis (F3, Ctrl+Q)." #: tfrmoptionsplugins.stgplugins.columns[0].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[0].title.caption" msgid "Active" msgstr "Aktiv" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[1].title.caption" msgid "Plugin" msgstr "Plugin" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[2].title.caption" msgid "Registered for" msgstr "Associer med" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[3].title.caption" msgid "File name" msgstr "Navn:" #: tfrmoptionsplugins.tsdsx.caption #, fuzzy #| msgid "Search plugins (.DSX)" msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "Søge-plugins (.DSX)" #: tfrmoptionsplugins.tswcx.caption #, fuzzy #| msgid "Packer plugins (.WCX)" msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "Pakke-plugins (.WCX)" #: tfrmoptionsplugins.tswdx.caption #, fuzzy #| msgid "Content plugins (.WDX)" msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "Indholds-plugins (.WDX)" #: tfrmoptionsplugins.tswfx.caption #, fuzzy #| msgid "File system plugins (.WFX)" msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "Filsystem-plugins (.WFX)" #: tfrmoptionsplugins.tswlx.caption #, fuzzy #| msgid "Viewer plugins (.WLX)" msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "Liste-plugins (.WLX)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "tfrmoptionsquicksearchfilter.cbexactbeginning.caption" msgid "&Beginning (name must start with first typed character)" msgstr "&I starten (navnet skal starte med første indtastede tegn)" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "tfrmoptionsquicksearchfilter.cbexactending.caption" msgid "En&ding (last character before a typed dot . must match)" msgstr "I slut&ningen (sidste tegn før et punktum . skal matche)" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "tfrmoptionsquicksearchfilter.cgpoptions.caption" msgid "Options" msgstr "Indstillinger" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption msgid "Exact name match" msgstr "" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "tfrmoptionstabs.cbtabsactivateonclick.caption" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "Aktiver fil&panel ved klik på fane" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "tfrmoptionstabs.cbtabsalwaysvisible.caption" msgid "&Show tab header also when there is only one tab" msgstr "Vis fane, selv om der kun er &et faneblad" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption msgid "Con&firm close all tabs" msgstr "" #: tfrmoptionstabs.cbtabslimitoption.caption msgid "&Limit tab title length to" msgstr "" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "tfrmoptionstabs.cbtabslockedasterisk.caption" msgid "Show locked tabs &with an asterisk *" msgstr "&Markér låste faneblade med stjerne (*) på fanen" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "tfrmoptionstabs.cbtabsmultilines.caption" msgid "&Tabs on multiple lines" msgstr "Tillad visning af faner på flere &linjer" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "tfrmoptionstabs.cbtabsopenforeground.caption" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Ctrl+Op åbner nyt faneblad i &forgrunden" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "tfrmoptionstabs.cbtabsopennearcurrent.caption" msgid "Open &new tabs near current tab" msgstr "Åbn &nye faneblade ved siden af aktive fane" #: tfrmoptionstabs.cbtabsshowclosebutton.caption msgid "Show ta&b close button" msgstr "" #: tfrmoptionstabs.gbtabs.caption msgctxt "tfrmoptionstabs.gbtabs.caption" msgid "Folder tabs headers" msgstr "Titel på faneblad" #: tfrmoptionstabs.lblchar.caption msgctxt "tfrmoptionstabs.lblchar.caption" msgid "characters" msgstr "tegn" #: tfrmoptionstabs.lbltabsposition.caption msgid "Ta&bs position" msgstr "" #: tfrmoptionsterminal.lblruninterm.caption msgid "Run in &terminal:" msgstr "" #: tfrmoptionsterminal.lblrunterm.caption msgid "Run t&erminal:" msgstr "" #: tfrmoptionstoolbar.btnclonebutton.caption msgid "C&lone button" msgstr "" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "tfrmoptionstoolbar.btndeletebutton.caption" msgid "&Delete" msgstr "&Slet" #: tfrmoptionstoolbar.btnedithotkey.caption msgid "Edit hot&key" msgstr "" #: tfrmoptionstoolbar.btninsertbutton.caption msgctxt "tfrmoptionstoolbar.btninsertbutton.caption" msgid "&Insert new button" msgstr "&Indsæt ny knap" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "tfrmoptionstoolbar.btnopenfile.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "tfrmoptionstoolbar.btnopenicon.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnremovehotkey.caption msgid "Remove hotke&y" msgstr "" #: tfrmoptionstoolbar.cbflatbuttons.caption msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "" #: tfrmoptionstoolbar.gbgroupbox.caption msgctxt "tfrmoptionstoolbar.gbgroupbox.caption" msgid "Appearance" msgstr "Udseende" #: tfrmoptionstoolbar.lblbarsize.caption msgid "&Bar size:" msgstr "" #: tfrmoptionstoolbar.lblexternalcommand.caption msgid "Comman&d:" msgstr "" #: tfrmoptionstoolbar.lblexternalparameters.caption msgid "Parameter&s:" msgstr "" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "" #: tfrmoptionstoolbar.lbliconfile.caption msgid "Ico&n:" msgstr "" #: tfrmoptionstoolbar.lbliconsize.caption msgid "Icon si&ze:" msgstr "" #: tfrmoptionstoolbar.lblinternalcommand.caption msgid "Co&mmand:" msgstr "" #: tfrmoptionstoolbar.lblinternalparameters.caption msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "&Parametre:" #: tfrmoptionstoolbar.lblstartpath.caption msgid "Start pat&h:" msgstr "" #: tfrmoptionstoolbar.lbltooltip.caption msgctxt "tfrmoptionstoolbar.lbltooltip.caption" msgid "&Tooltip:" msgstr "&Ballon-hjælp:" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption msgid "&Keep terminal window open after executing program" msgstr "" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption msgid "&Execute in terminal" msgstr "" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption msgid "&Use external program" msgstr "" #: tfrmoptionstoolbase.lbltoolsparameters.caption msgid "A&dditional parameters" msgstr "" #: tfrmoptionstoolbase.lbltoolspath.caption msgid "&Path to program to execute" msgstr "" #: tfrmoptionstooltips.btnaddfields.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "Tilføj" #: tfrmoptionstooltips.btnapplyfields.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "Udfør" #: tfrmoptionstooltips.btndeletefields.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "Slet" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Skabelon..." #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "Tilpas felter efter filtype" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "Værktøjshjælp" #: tfrmoptionstooltips.lblfieldslist.caption #, fuzzy #| msgid "Category hint:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "Kategori-vink:" #: tfrmoptionstooltips.lblfieldsmask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "Kategori-filter:" #: tfrmoptionstooltips.lblfieldsname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "Kategori-navn:" #: tfrmoptionstooltips.rbtooltipallfiles.caption #, fuzzy #| msgid "Show tool tip for all files in file panel" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "Vis værktøjshjælp for alle filer i panel" #: tfrmoptionstooltips.rbtooltipnone.caption #, fuzzy #| msgid "Don't show" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "Vis ikke" #: tfrmoptionstooltips.rbtooltiponlylarge.caption #, fuzzy #| msgid "Show tool tip for files in file panel if truncated" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "Vis værktøjshjælp for alle filer i panel, når filnavn afkortes" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "tfrmoptionsviewer.btnbackviewercolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "tfrmoptionsviewer.btnfontviewercolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.gbviewerbookmode.caption msgctxt "tfrmoptionsviewer.gbviewerbookmode.caption" msgid "Viewer Book Mode" msgstr "Bogvisning" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "tfrmoptionsviewer.gbviewerexample.caption" msgid "Example" msgstr "Eksempel" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption msgid "&Background color in book viewer" msgstr "" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption msgid "&Font color in book viewer" msgstr "" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption msgid "&Number of columns in book viewer" msgstr "" #: tfrmpackdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmpackdlg.btnconfig.caption #, fuzzy #| msgid "&Configure" msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "&Indstillinger" #: tfrmpackdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "&Hjælp" #: tfrmpackdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmpackdlg.caption msgctxt "tfrmpackdlg.caption" msgid "Pack files" msgstr "Pak filer" #: tfrmpackdlg.cbcreateseparatearchives.caption #, fuzzy #| msgid "Create separate archives, o&ne per selected file/dir" msgid "C&reate separate archives, one per selected file/dir" msgstr "Dan &separate arkiver, ét for hver valgt fil/mappe" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "&Dan selvudpakkende arkiv" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "&Kryptér" #: tfrmpackdlg.cbmovetoarchive.caption #, fuzzy #| msgid "M&ove to archive" msgid "Mo&ve to archive" msgstr "Fl&yt til arkiv" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "&Fordel arkiv over flere diske" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "" #: tfrmpackdlg.cbputintarfirst.caption #, fuzzy #| msgid "Put in the TAR archive first" msgid "P&ut in the TAR archive first" msgstr "Kom i TAR-arkivet først" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "Gem &også sti (kun rekursivt)" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "Pak fil(er) i arkivet:" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "Pakkeprogram" #: tfrmpackinfodlg.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Luk" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "Udpak &alle og udfør" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "&Udpak og udfør" #: tfrmpackinfodlg.caption msgctxt "tfrmpackinfodlg.caption" msgid "Properties of packed file" msgstr "Egenskaber for pakket fil" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "Attributter:" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "Komprimering:" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "Dato" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "Metode" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "Oprindelig størrelse:" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "Fil:" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "Pakket størrelse:" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "Pakkeprogram:" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "Tid:" #: tfrmquicksearch.btncancel.caption msgctxt "tfrmquicksearch.btncancel.caption" msgid "X" msgstr "X" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "" #: tfrmquicksearch.tglfilter.caption msgctxt "tfrmquicksearch.tglfilter.caption" msgid "Filter" msgstr "Filter:" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "tfrmselecttextrange.btppanel.cancelbutton.caption" msgid "Cancel" msgstr "&Annuller" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "tfrmselecttextrange.btppanel.closebutton.caption" msgid "&Close" msgstr "&Luk" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "tfrmselecttextrange.btppanel.helpbutton.caption" msgid "&Help" msgstr "&Hjælp" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "tfrmselecttextrange.btppanel.okbutton.caption" msgid "&OK" msgstr "&OK" #: tfrmselecttextrange.lblselecttext.caption msgid "&Select the characters to insert:" msgstr "" #: tfrmsetfileproperties.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsetfileproperties.caption msgctxt "tfrmsetfileproperties.caption" msgid "Change attributes" msgstr "Ændre attributter" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "" "S&GID\n" "(Set group id)\n" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Stic&ky" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "" "&SUID\n" "(Set user id)\n" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "Arkiv" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "Op&rettet:" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "Skjult" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "Å&bnet:" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "Æ&ndret:" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "Skrivebeskyttet" #: tfrmsetfileproperties.chkrecursive.caption #, fuzzy #| msgid "Recursive" msgid "Including subfolders" msgstr "Medtag filer i &undermapper" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "Ændre dato/tid" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Ændre attributter " #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Attributter" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Gruppe" #: tfrmsetfileproperties.lblattrinfo.caption msgid "(gray field means unchanged value)" msgstr "(gråt=uændret, markeret=sæt attribut)" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Andre" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Ejer" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Tekst:" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Udfør" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Oktal:" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Læs" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Skriv" #: tfrmsplitter.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsplitter.caption msgctxt "tfrmsplitter.caption" msgid "Splitter" msgstr "Opdel fil" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664b - 3,5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "Filnavn" #: tfrmsplitter.grbxsize.caption msgid "Size and number of parts" msgstr "Størrelse og antal dele" #: tfrmsplitter.lbdirtarget.caption #, fuzzy #| msgid "Directory target" msgid "Directory &target" msgstr "Opdel filen til mappen:" #: tfrmsplitter.lbfilesource.caption #, fuzzy #| msgid "File source" msgid "File &source" msgstr "Kildefil:" #: tfrmsplitter.lblnumberparts.caption #, fuzzy #| msgid "Number of parts" msgid "&Number of parts" msgstr "Antal dele:" #: tfrmsplitter.rbtngigab.caption msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "" #: tfrmsplitter.rbtnkilob.caption msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "" #: tfrmsplitter.rbtnmegab.caption msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "" #: tfrmsymlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsymlink.caption msgid "Create symbolic link" msgstr "Dan symbolsk link" #: tfrmsymlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Destination, som linket skal pege på:" #: tfrmsymlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Navn på linket:" #: tfrmtweakplugin.btnadd.caption #, fuzzy #| msgid "Add new" msgid "A&dd new" msgstr "Til føj nyt" #: tfrmtweakplugin.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Annuller" #: tfrmtweakplugin.btnchange.caption #, fuzzy #| msgid "Change" msgid "C&hange" msgstr "Ændr" #: tfrmtweakplugin.btndefault.caption #, fuzzy #| msgid "Default" msgid "De&fault" msgstr "Standard" #: tfrmtweakplugin.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmtweakplugin.btnremove.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "Fjern" #: tfrmtweakplugin.caption msgctxt "tfrmtweakplugin.caption" msgid "Tweak plugin" msgstr "Tilpas-plugin" #: tfrmtweakplugin.cbpk_caps_by_content.caption #, fuzzy #| msgid "Detect archive type by content" msgid "De&tect archive type by content" msgstr "Bestem arkivtype efter indhold" #: tfrmtweakplugin.cbpk_caps_delete.caption #, fuzzy #| msgid "Can delete files" msgid "Can de&lete files" msgstr "Kunne ikke slette filer" #: tfrmtweakplugin.cbpk_caps_encrypt.caption #, fuzzy #| msgid "Supports encryption" msgid "Supports e&ncryption" msgstr "Understøtter kryptering" #: tfrmtweakplugin.cbpk_caps_hide.caption #, fuzzy #| msgid "Show as normal files (hide packer icon)" msgid "Sho&w as normal files (hide packer icon)" msgstr "Vis som normale filer (skjul pakke-ikon)" #: tfrmtweakplugin.cbpk_caps_mempack.caption #, fuzzy #| msgid "Supports packing in memory" msgid "Supports pac&king in memory" msgstr "Understøtter komprimering i hukommelsen" #: tfrmtweakplugin.cbpk_caps_modify.caption #, fuzzy #| msgid "Can modify exisiting archives" msgid "Can &modify exisiting archives" msgstr "Kan ændre eksisterende arkiver" #: tfrmtweakplugin.cbpk_caps_multiple.caption #, fuzzy #| msgid "Archive can contain multiple files" msgid "&Archive can contain multiple files" msgstr "Arkiv kan indeholde flere filer" #: tfrmtweakplugin.cbpk_caps_new.caption #, fuzzy #| msgid "Can create new archives" msgid "Can create new archi&ves" msgstr "Kan oprette nye arkiver" #: tfrmtweakplugin.cbpk_caps_options.caption #, fuzzy #| msgid "Supports the options dialogbox" msgid "S&upports the options dialogbox" msgstr "Understøtter indstillings-dialogboks" #: tfrmtweakplugin.cbpk_caps_searchtext.caption #, fuzzy #| msgid "Allow searching for text in archives" msgid "Allow searchin&g for text in archives" msgstr "Tillad tekstsøgning i arkiver" #: tfrmtweakplugin.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "Beskrivelse:" #: tfrmtweakplugin.lbldetectstr.caption #, fuzzy #| msgid "Detect string:" msgid "D&etect string:" msgstr "Fastslå streng:" #: tfrmtweakplugin.lblextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "Type:" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "" #: tfrmtweakplugin.lblname.caption #, fuzzy #| msgid "Name:" msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "Navn:" #: tfrmtweakplugin.lblplugin.caption msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "" #: tfrmtweakplugin.lblplugin1.caption msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "" #: tfrmviewer.actabout.caption msgctxt "tfrmviewer.actabout.caption" msgid "About Viewer..." msgstr "Om fremviseren..." #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "" #: tfrmviewer.actcopyfile.caption msgctxt "tfrmviewer.actcopyfile.caption" msgid "Copy File" msgstr "" #: tfrmviewer.actcopyfile.hint msgctxt "tfrmviewer.actcopyfile.hint" msgid "Copy File" msgstr "" #: tfrmviewer.actdeletefile.caption msgctxt "tfrmviewer.actdeletefile.caption" msgid "Delete File" msgstr "" #: tfrmviewer.actdeletefile.hint msgctxt "tfrmviewer.actdeletefile.hint" msgid "Delete File" msgstr "" #: tfrmviewer.actloadnextfile.caption msgctxt "tfrmviewer.actloadnextfile.caption" msgid "&Next" msgstr "&Næste" #: tfrmviewer.actloadnextfile.hint msgid "Load Next File" msgstr "" #: tfrmviewer.actloadprevfile.caption msgctxt "tfrmviewer.actloadprevfile.caption" msgid "&Previous" msgstr "&Forrige" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "" #: tfrmviewer.actmirror.caption msgctxt "tfrmviewer.actmirror.caption" msgid "Mirror" msgstr "Spejlvend" #: tfrmviewer.actmirror.hint msgctxt "tfrmviewer.actmirror.hint" msgid "Mirror" msgstr "Spejlvend" #: tfrmviewer.actmovefile.caption msgctxt "tfrmviewer.actmovefile.caption" msgid "Move File" msgstr "" #: tfrmviewer.actmovefile.hint msgctxt "tfrmviewer.actmovefile.hint" msgid "Move File" msgstr "" #: tfrmviewer.actreload.caption msgctxt "tfrmviewer.actreload.caption" msgid "Reload" msgstr "Genindlæs" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "" #: tfrmviewer.actrotate180.caption msgctxt "tfrmviewer.actrotate180.caption" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate180.hint msgctxt "tfrmviewer.actrotate180.hint" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate270.caption msgctxt "tfrmviewer.actrotate270.caption" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate270.hint msgctxt "tfrmviewer.actrotate270.hint" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate90.caption msgctxt "tfrmviewer.actrotate90.caption" msgid "Rotate 90" msgstr "" #: tfrmviewer.actrotate90.hint msgctxt "tfrmviewer.actrotate90.hint" msgid "Rotate 90" msgstr "" #: tfrmviewer.actsaveas.caption msgctxt "tfrmviewer.actsaveas.caption" msgid "Save As..." msgstr "Gem &som..." #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "" #: tfrmviewer.actstretchimage.caption msgctxt "tfrmviewer.actstretchimage.caption" msgid "Stretch" msgstr "Stræk" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "Kopier" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "Kopier" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "Beskær" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "Slet" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "Slet" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "Fuldskærm" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "||" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "Markér" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "Spejlvend" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "Flyt" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "Flyt" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "Male" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "Røde øjne" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "Tilpas størrelse" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "Fortryd" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "Zoom ind" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "Zoom ud" #: tfrmviewer.caption msgctxt "tfrmviewer.caption" msgid "Viewer" msgstr "Fremviser" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Slideshow" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "Stift" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "Markér" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "Male" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Slideshow" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "Visning" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "&Om" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "Binær (fast linjelængde)" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "&Kopier som tekst" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Rediger" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "&Kodning" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "&Luk" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "&Fil" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "Fuldskærm" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "Billede/multimedie" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "Hex" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "B&illede" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "B&og" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "Spejlvend" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "Plugin" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "Preview" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "&Udskriv..." #: tfrmviewer.mirotate.caption msgctxt "TFRMVIEWER.MIROTATE.CAPTION" msgid "Rotate" msgstr "Rotér" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "&Gem" #: tfrmviewer.misaveas.caption msgctxt "tfrmviewer.misaveas.caption" msgid "Save As..." msgstr "Gem &som..." #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "Tag et skærmbillede" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "&Find" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "Find &næste" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "Søg &forrige" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "Vælg &alt" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.mistretch.caption msgctxt "tfrmviewer.mistretch.caption" msgid "Stretch" msgstr "Stræk" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "Kun tekst" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "&Vis" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "Ombryd tekst" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "Zomm ind" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "Zomm ud" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "Kopier til Udklipsholder" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "Vælg alle" #: tfrmviewoperations.btnstartpause.caption msgctxt "tfrmviewoperations.btnstartpause.caption" msgid "&Start" msgstr "&Start" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "" #: tfrmviewoperations.caption msgctxt "tfrmviewoperations.caption" msgid "File operations" msgstr "Filhandlinger" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "" #: tfrmviewoperations.mnucanceloperation.caption #, fuzzy #| msgid "Cancel" msgctxt "tfrmviewoperations.mnucanceloperation.caption" msgid "Cancel" msgstr "&Annuller" #: tfrmviewoperations.mnucancelqueue.caption #, fuzzy #| msgid "Cancel" msgctxt "tfrmviewoperations.mnucancelqueue.caption" msgid "Cancel" msgstr "&Annuller" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "tfrmviewoperations.mnuoperationshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "" #: tfrmviewoperations.mnuqueue.caption msgctxt "tfrmviewoperations.mnuqueue.caption" msgid "Queue" msgstr "" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "tfrmviewoperations.mnuqueueshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption #, fuzzy #| msgid "When file exists" msgctxt "tmultiarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Hvis filen findes:" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption #, fuzzy #| msgid "When file exists" msgctxt "twcxarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Hvis filen findes:" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Hvis fil findes" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "" #: ulng.rscolattr msgid "Attr" msgstr "Attribut" #: ulng.rscoldate msgid "Date" msgstr "Dato" #: ulng.rscolext msgid "Ext" msgstr "Type" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "Navn" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "Størrelse" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "Antal ændringer:" #: ulng.rsconfcolalign msgid "Align" msgstr "Justering" #: ulng.rsconfcolcaption msgid "Caption" msgstr "Titel" #: ulng.rsconfcolconfig msgid "Config" msgstr "Indstilling" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "Slet" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "Feltindhold" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "Flyt" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "Bredde" #: ulng.rsconfcustheader msgid "Customize column" msgstr "Tilføj kolonne" #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "Kopier (%d) %s" #: ulng.rsdlgallopcomplete #, fuzzy #| msgid "All operations is complete" msgid "All operations completed" msgstr "Alle handlinger afsluttet" #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "Samlet status for alle handlinger %d %%" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "Afbryd" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "Alle" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "&Tilføj" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "Af&bryd" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "Kopier ind i" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "Kopier ind i alle" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "" #: ulng.rsdlgbuttonno msgid "&No" msgstr "&Nej" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "Ing&en" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "&OK" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "&Overskriv" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "Overskriv &alle" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "Forsøg igen" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "&Spring over" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "S&pring alle over" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "&Ja" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "Beregn filer og mapper" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "Dan kontrolsumfil" #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "Kontroller kontrolsum..." #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "Kopier fil(er)" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "Slet fil(er)" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "Flyt fil(er)" #: ulng.rsdlgoppause #, fuzzy #| msgid "Pause" msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "Pause" #: ulng.rsdlgopstart #, fuzzy #| msgid "Start" msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "Start" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "Hastighed %s/s" #: ulng.rsdlgspeedtime msgid "Speed %s/s, time remaining %s" msgstr "Hastighed %s/s, resterende tid %s" #: ulng.rsdlgsplit msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "Opdel" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "Slet fil(er) sikkert" #: ulng.rsdrivenolabel msgid "" msgstr "" #: ulng.rsdrivenomedia msgid "" msgstr "" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Double Commaders interne editor" #: ulng.rseditnewfile msgid "new.txt" msgstr "Ny.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "Filnavn:" #: ulng.rseditnewopen msgid "Open file" msgstr "Åbn fil" #: ulng.rseditsearchback msgid "&Backward" msgstr "Til&bage" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "Søg" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "&Fremad" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "Erstat" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "" #: ulng.rsfileopsetpropertyerroroptions msgid "Ask;Don't set anymore;Ignore errors" msgstr "" #: ulng.rsfilterstatus msgid "FILTER" msgstr "" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "Definer valg" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "%s niveau(er)" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "Alle (ubegrænset dybde)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "Kun aktuelle mappe" #: ulng.rsfinddirnoex msgctxt "ulng.rsfinddirnoex" msgid "Directory %s does not exist!" msgstr "Mappen %s findes ikke!" #: ulng.rsfindfound msgctxt "ulng.rsfindfound" msgid "Found: %d" msgstr "Fundet: %d" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "Gem søgningen som skabelon" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "Navn på skabelon:" #: ulng.rsfindscanned msgctxt "ulng.rsfindscanned" msgid "Scanned: %d" msgstr "Skannet: %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "Skanner" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "Find filer" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "Start ved" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr "%sB af ialt %sB ledige" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "%sB ledige" #: ulng.rsfuncatime msgid "Access date/time" msgstr "Åbnet dato/tid" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "Attributter" #: ulng.rsfunccomment msgid "Comment" msgstr "Kommentar" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "Oprettet dato/tid" #: ulng.rsfuncext msgid "Extension" msgstr "Type" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "Gruppe" #: ulng.rsfunclinkto msgid "Link to" msgstr "Link til" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "Ændret dato/tid" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "Navn" #: ulng.rsfuncnamenoext msgctxt "ulng.rsfuncnamenoext" msgid "Name without extension" msgstr "Navn uden filendelse" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "Ejer" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "Sti" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "Størrelse" #: ulng.rsfunctype msgid "Type" msgstr "Type" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "Kunne ikke danne hårdt link." #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "Sammenligningsprogram" #: ulng.rshotkeycategorymain msgid "Main" msgstr "" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "Fremviser" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "Samler færdig" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "Indskrænk valg" #: ulng.rsmarkplus msgid "Select mask" msgstr "Udvid valg" #: ulng.rsmaskinput msgid "Input mask:" msgstr "Angiv filtype:" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "Indstillinger for kolonner" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "Opsætning af brugerbestemt visning..." #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "Handlinger" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "Rediger" #: ulng.rsmnueject msgid "Eject" msgstr "Skub ud" #: ulng.rsmnumount msgid "Mount" msgstr "Mount" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "Ny" #: ulng.rsmnunomedia msgid "No media available" msgstr "Kan ikke finde medie" #: ulng.rsmnuopenwith #, fuzzy #| msgid "Open with ..." msgid "Open with" msgstr "Åbn med..." #: ulng.rsmnuopenwithother msgid "Other..." msgstr "" #: ulng.rsmnusortby msgid "Sort by" msgstr "Sortér efter" #: ulng.rsmnuumount msgid "Unmount" msgstr "Skub eksternt medie ud" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "Vis" #: ulng.rsmsgaccount msgid "Account:" msgstr "Konto:" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "Ekstra parametre til pakkeprograms kommandolinje:" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "Du kan ikke kopiere/flytte filen \"%s\" til sig selv!" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "Ændre arbejdsmappe [ChDir] til [%s] mislykkedes!" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "Luk alle inaktive faneblade?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "Fanebladet (%s) er låst! Luk alligevel?" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "Er du sikker på at ville afslutte?" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "Kopier %d valgte filer/mapper til:" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "Kopier \"%s\" til:" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "Er du sikker på, at du vil slette de %d valgte filer/mapper?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "Vil du flytte disse %d elementer til Papirkurv?" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "Er du sikker på, at du vil slette den valgte fil \"%s\" ?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "Vil du flytte \"%s\" til Papirkurv?" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "Kan ikke flytte \"%s\" til Papirkurv! Slet direkte?" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "Drevet er ikke tilgængeligt" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "Indtast filendelse:" #: ulng.rsmsgentername msgid "Enter name:" msgstr "Indtast navn:" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "CRC-fejl i arkivdata" #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "Datafejl" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "Kan ikke forbinde til server: \"%s\"" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "Kan ikke kopiere fil %s til %s" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "Der findes allerede en mappe med navnet \"%s\"." #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "Datoen %s understøttes ikke" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "Fejl: Mappen \"%s\" eksisterer allerede! Angiv et andet navn." #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "Brugerafbrydelse" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "Kunne ikke lukke filen" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "Kan ikke danne fil" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "Ikke flere filer i arkivet" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "Kan ikke åbne eksisterende fil" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "Kunne ikke læse fil" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "Kunne ikke skrive til fil" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "Kan ikke oprette mappe %s!" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "Ugyldigt link" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "Ingen filer fundet" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "Ikke nok hukommelse" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "Funktionen understøttes ikke!" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "Syntaksfejl i regulære udtryk!" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "Kan ikke omdøbe fil %s til %s" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "Kan ikke gemme fil" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "Kan ikke indstille attributter for \"%s\"" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "Kan ikke indstille dato/tid for \"%s\"" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "Bufferen er for lille" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "For mange filer at pakke" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "Arkivformat ukendt" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "" "Filen \"%s\" er ændret.\n" "Vil du gemme?\n" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "" "Filen \"%s\" findes allerede.\n" "Vil du overskrive?\n" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "Aktive filhandlinger" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "Der er uafsluttede filhandlinger. Lukkes Double Commander kan det medføre tab af data." #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "Filen %s er markeret som skrivebeskyttet. Vil du slette den?" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "Størrelsen på filen \"%s\" er for stor til destinationens filsystem!" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "" "Mappen %s eksisterer.\n" "Vil du overskrive?\n" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "Følg symlink \"%s\"?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "Ugyldigt filnavn" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "" #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "Ugyldigt valg" #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "Indlæser filliste..." #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "Kopier fil %s" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "Slet fil %s" #: ulng.rsmsglogerror msgid "Error: " msgstr "Fejl:" #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "Udpak fil %s" #: ulng.rsmsgloginfo msgid "Info: " msgstr "Info:" #: ulng.rsmsgloglink msgid "Create link %s" msgstr "Dan link %s" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "Opret mappe %s" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "Flyt fil %s" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "Pak til fil %s" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "Fjern mappe %s" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "Færdig: " #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "Dan symlink %s" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "Kontroller filintegritet %s" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "Tilføj menupunkt manuelt" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "Ny titel for menupunkt" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "" "Indtast titel og sti\n" "( format: \"titel\"=/sti/ )\n" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "Master-password" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "Indtast venligst master-password:" #: ulng.rsmsgnewfile msgid "New file" msgstr "Ny fil" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "Næste volumen bliver pakket ud" #: ulng.rsmsgnofiles msgid "No files" msgstr "" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "Ingen filer valgt" #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "" "Ikke nok ledig plads på måldrevet.\n" "Vil du fortsætte?\n" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "" "Ikke nok ledig plads på måldrevet.\n" "Vil du forsøge igen?\n" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "Kan ikke slette fil %s" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "Ikke muligt." #: ulng.rsmsgpassword msgid "Password:" msgstr "Password:" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "Indtast venligst password:" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "Password (firewall):" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "&Tilføj %s" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "&Rediger favoritmapper..." #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "&Fjern %s" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "" "Forudindstilling \"%s\" findes allerede.\n" "Vil du overskrive?\n" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "Omdøbe/flytte %d valgte filer/mapper?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "Omdøb/flyt \"%s\" til?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "Genstart venligst Double Commander for at udføre ændringerne" #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "Vælg venligst kun kontrolsumfiler!" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "Vælg venligst placering af næste volumen" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "Angiv volumen-etiket" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "Omdøb fane" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "Nyt navn:" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "Sti:" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "For mange valgte filer." #: ulng.rsmsgurl msgid "URL:" msgstr "URL:" #: ulng.rsmsgusername msgid "User name:" msgstr "Brugernavn:" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "Brugernavn (firewall):" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "Volumen-etiket:" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "Indtast venligst volumen-størrelse:" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "Sikker sletning af %d valgte filer/mapper?" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "Sikker sletning af \"%s\"?" #: ulng.rsmulrenfilenamestylelist msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "Uændret;STORE TEGN;små tegn;Første tegn stort;Første Tegn Stort I Hvert Ord;" #: ulng.rsoperaborted msgid "Aborted" msgstr "Afbrudt" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "Beregner" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "" #: ulng.rsopercombining msgid "Joining" msgstr "" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopying msgid "Copying" msgstr "" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "Sletter" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "" #: ulng.rsoperexecuting msgid "Executing" msgstr "" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "" #: ulng.rsoperextracting msgid "Extracting" msgstr "" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperfinished msgid "Finished" msgstr "Afsluttet" #: ulng.rsoperlisting msgid "Listing" msgstr "" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "" #: ulng.rsopermoving msgid "Moving" msgstr "" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "" #: ulng.rsopernotstarted msgid "Not started" msgstr "Ikke startet" #: ulng.rsoperpacking msgid "Packing" msgstr "" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpaused msgid "Paused" msgstr "Sat på pause" #: ulng.rsoperpausing msgid "Pausing" msgstr "Pause" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "Sat i kø" #: ulng.rsoperrunning msgid "Running" msgstr "Kører" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "" #: ulng.rsopersplitting msgid "Splitting" msgstr "" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperstarting msgid "Starting" msgstr "Starter" #: ulng.rsoperstopped msgid "Stopped" msgstr "Stoppet" #: ulng.rsoperstopping msgid "Stopping" msgstr "Stopper" #: ulng.rsopertesting msgid "Testing" msgstr "" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "Venter på adgang til filkilde" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "Venter på brugerrespons" #: ulng.rsoperwiping msgid "Wiping" msgstr "" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "" #: ulng.rsoperworking msgid "Working" msgstr "" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "Slet:" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "Pak ud uden sti:" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "Format analyse-tilstand:" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "ID-position:" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "ID søge-interval:" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "Password forespørgsel:" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "Dan selvudpakkende arkiv:" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "Arkivtype-navn:" #: ulng.rsoptarchivevalue msgid "Value" msgstr "Værdi" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "Associer plugin \"%s\" med:" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "Første;Sidste;" #: ulng.rsoptdisable msgid "Disable" msgstr "Deaktiver" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "Aktiver" #: ulng.rsoptenterext msgid "Enter extension" msgstr "Indtast filendelse" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "Markør" #: ulng.rsoptexamplemark msgid "Mark" msgstr "Mærke" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "Mærke + markør" #: ulng.rsoptexampletext msgid "Text" msgstr "Tekst" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "" #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "" #: ulng.rsopthotkeysdeletetrashcanoverrides msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "Genvejstast" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "Genvejstaster" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "Parametre" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "" #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "Genvejstast anvendes" #: ulng.rsopthotkeysshortcutusedtext1 #, fuzzy #| msgid "Shortcut %s is already used for %s." msgid "Shortcut %s is already used." msgstr "Genvejstast %s anvendes allered til %s." #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "Ændre den til %s?" #: ulng.rsopthotkeysusedby #, fuzzy #| msgid "used by" msgid "used for %s in %s" msgstr "bruges af" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "Pakkeprogrammer" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "Opdater automatisk" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "Egenskaber" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "Farver" #: ulng.rsoptionseditorcolumnsview msgctxt "ulng.rsoptionseditorcolumnsview" msgid "Columns" msgstr "Kolonner" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "Konfiguration" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "" #: ulng.rsoptionseditorfileoperations msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "Filhandlinger" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "Fil-vindue" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "Filtyper" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "Faneblade" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "Skrifttype" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "Genvejstaster" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "Ikoner" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "Ignorer" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "Sprog" #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "Logfil" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "Diverse" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "Plugins" #: ulng.rsoptionseditorquicksearch msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "Hurtig søgning/filtrering" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "Terminal F9" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "Værktøjer" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "Værktøjshjælp" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "Brug venste knap;Brug højre knap;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "Plugin %s er allerede tildelt følgende filendelser:" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "Aktiv" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "Filnavn" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "Navn" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "Registreret til" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "Alfabetiske, inklusive tegn med accenter;Naturlig sortering: Alfabetisk og numerisk" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "Top;Bund;" #: ulng.rsopttoolbarbuttontype msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "Kan ikke ændre adgangsrettigheder for \"%s\"" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "Kan ikke ændre ejer for \"%s\"" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "Fil" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "Mappe" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "Nævnte pipe" #: ulng.rspropsno msgid "No" msgstr "Nej" #: ulng.rspropssocket msgid "Socket" msgstr "Socket" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "Speciel blok-enhed" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "Speciel tegn-enhed" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "Symbolsk link" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "Ukendt type" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "Ja (%s)" #: ulng.rssearchresult msgid "Search result" msgstr "Søgeresultat" #: ulng.rssearchtemplateunnamed msgid "" msgstr "" #: ulng.rsselectdir msgid "Select a directory" msgstr "Vælg en mappe" #: ulng.rsshowhelpfor msgid "&Show help for %s" msgstr "" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "" "Total brugt plads i fil(er): %d og mappe(r): %d\n" "Størrelse: %s (= %s bytes)\n" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "Kunne ikke danne mål-mappe!" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "Forkert filstørrelse-format!" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "Kan ikke opdele fil!" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "Der er mere end 100 dele! Vil du fortsætte?" #: ulng.rssplitseldir msgid "Select directory:" msgstr "Vælg mappe:" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "Kunne ikke danne symlink!" #: ulng.rssyndefaulttext msgid "Default text" msgstr "" #: ulng.rssynlangplaintext msgid "Plain text" msgstr "" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "Dag(e)" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "Time(r)" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "Minut(ter)" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "Måned(er)" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "Sekund(er)" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "Uge(r)" #: ulng.rstimeunityear msgid "Year(s)" msgstr "År" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "Sammenligningsprogram" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "Editor" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "Terminal F9" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "Fremviser" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "Rapportér venligst denne fejl i bug-tracker med en beskrivelse af, hvad du gjorde og følgende fil: %s Tryk %s for at fortsætte eller %s at afbryde programmet." #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "Netværk" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "Double Commanders interne fremviser" #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "Koder" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "%s ikke fundet!" doublecmd-0.5.8/language/doublecmd.nl.po0000644000175000017500000061140512250633131017202 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.5 alpha\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-01-17 23:08+0300\n" "PO-Revision-Date: \n" "Last-Translator: Kees Serier \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Dutch\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "Alles" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "Alles" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "Alles" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "Alles" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "Alles" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "Alles" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "Alles" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "..." #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "->" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "<-" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "Konfigureer aangepast kolomoverzicht" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "Achtergrond:" #: tfcolumnssetconf.cbcursorborder.caption msgid "Cursor border" msgstr "" #: tfcolumnssetconf.cbovercolor.caption msgid "Allow Overcolor" msgstr "Allow Overcolor" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "Tekst kleur:" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "Lettertype:" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "Grootte:" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "Achtergrond 2:" #: tfcolumnssetconf.lblconfigviewnr.caption msgid "Configure view nr:" msgstr "Konfigureer overzichtnr:" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "Cursor kleur:" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "Cursor tekst:" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "Markeer kleur:" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "Naam:" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "Voeg kolom toe" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "Kolom aanpassen:" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "Voorafweergave" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "R" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption msgid "C&heck free space" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption msgid "Cop&y attributes" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption msgid "Copy o&wnership" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption msgid "Copy d&ate/time" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption msgid "Correct lin&ks" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "Verwijder alleen lezen attribuut" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption msgid "E&xclude empty directories" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption msgid "Fo&llow links" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "" #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption msgid "When dir&ectory exists" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption msgid "When ca&nnot set property" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "" #: tfrmabout.btnclose.caption msgctxt "TFRMABOUT.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Sluit" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "Over" #: tfrmabout.lblbuild.caption msgid "Build" msgstr "Build" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "Free Pascal" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "Home Page:" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "http://doublecmd.sourceforge.net" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "Lazarus" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "Revisie" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption msgid "Version" msgstr "Versie" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "" #: tfrmattributesedit.cbarchive.caption msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "" #: tfrmattributesedit.cbcompressed.caption msgid "Co&mpressed" msgstr "" #: tfrmattributesedit.cbdirectory.caption #, fuzzy #| msgid "Directory" msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "Directory" #: tfrmattributesedit.cbencrypted.caption msgid "&Encrypted" msgstr "" #: tfrmattributesedit.cbhidden.caption msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "" #: tfrmattributesedit.cbreadonly.caption msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmattributesedit.cbsparse.caption msgid "S&parse" msgstr "" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Sticky" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmattributesedit.cbsymlink.caption msgid "&Symlink" msgstr "" #: tfrmattributesedit.cbsystem.caption msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "" #: tfrmattributesedit.cbtemporary.caption msgid "&Temporary" msgstr "" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "bits:" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Groep" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Ander" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Eigenaar" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "Voer uit" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "Lees" #: tfrmattributesedit.lbltextattrs.caption msgid "As te&xt:" msgstr "" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "Schrijf" #: tfrmchecksumcalc.btncancel.caption msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmchecksumcalc.caption msgctxt "tfrmchecksumcalc.caption" msgid "Calculate check sum..." msgstr "" #: tfrmchecksumcalc.cbseparatefile.caption msgid "C&reate separate checksum file for each file" msgstr "" #: tfrmchecksumcalc.lblsaveto.caption msgid "&Save check sum file(s) to:" msgstr "" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Sluit" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "" #: tfrmconnectionmanager.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "Toevoegen" #: tfrmconnectionmanager.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Afbreken" #: tfrmconnectionmanager.btnconnect.caption msgid "C&onnect" msgstr "" #: tfrmconnectionmanager.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Verwijder" #: tfrmconnectionmanager.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Bewerk" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "" #: tfrmcopydlg.btnaddtoqueue.caption msgid "A&dd To Queue" msgstr "" #: tfrmcopydlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Afbreken" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "tfrmcopydlg.btncreatespecialqueue.caption" msgid "..." msgstr "..." #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "" #: tfrmcopydlg.btnsaveoptions.caption msgid "Sa&ve these options as default" msgstr "" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "Kopiëer bestand(en)" #: tfrmdescredit.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Afbreken" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "Bestand/Folder commentaar" #: tfrmdescredit.lbleditcommentfor.caption #, fuzzy #| msgid "Edit comment for:" msgid "E&dit comment for:" msgstr "Bewerk commentaar voor:" #: tfrmdescredit.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "Koderen:" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "Over" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "Afbreken" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "Afbreken" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Kopiëer" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Knip" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Verwijder" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Plak" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Herongedaan maken" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Ongedaan maken" #: tfrmdiffer.actexit.caption #, fuzzy #| msgid "Exit" msgctxt "tfrmdiffer.actexit.caption" msgid "E&xit" msgstr "Afsluiten" #: tfrmdiffer.actfirstdifference.caption msgctxt "tfrmdiffer.actfirstdifference.caption" msgid "First Difference" msgstr "" #: tfrmdiffer.actfirstdifference.hint msgctxt "tfrmdiffer.actfirstdifference.hint" msgid "First Difference" msgstr "" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "" #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "" #: tfrmdiffer.actlastdifference.caption msgctxt "tfrmdiffer.actlastdifference.caption" msgid "Last Difference" msgstr "" #: tfrmdiffer.actlastdifference.hint msgctxt "tfrmdiffer.actlastdifference.hint" msgid "Last Difference" msgstr "" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "" #: tfrmdiffer.actnextdifference.caption msgctxt "tfrmdiffer.actnextdifference.caption" msgid "Next Difference" msgstr "" #: tfrmdiffer.actnextdifference.hint msgctxt "tfrmdiffer.actnextdifference.hint" msgid "Next Difference" msgstr "" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "" #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "" #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "" #: tfrmdiffer.actprevdifference.caption msgctxt "tfrmdiffer.actprevdifference.caption" msgid "Previous Difference" msgstr "" #: tfrmdiffer.actprevdifference.hint msgctxt "tfrmdiffer.actprevdifference.hint" msgid "Previous Difference" msgstr "" #: tfrmdiffer.actreload.caption msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "" #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "" #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "" #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "" #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "" #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "" #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "" #: tfrmdiffer.caption msgctxt "TFRMDIFFER.CAPTION" msgid "Compare files" msgstr "Vergelijk bestanden" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miencodingleft.caption msgid "&Left" msgstr "" #: tfrmdiffer.miencodingright.caption msgid "&Right" msgstr "" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "" #: tfrmdiffer.mnuedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "Bewerk" #: tfrmdiffer.mnuencoding.caption msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "" #: tfrmdiffer.mnufile.caption #, fuzzy #| msgid "File" msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "Bestand" #: tfrmdiffer.mnuoptions.caption #, fuzzy #| msgid "Options" msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "Opties" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "" #: tfrmedithotkey.btncancel.caption msgctxt "TFRMEDITHOTKEY.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Afbreken" #: tfrmedithotkey.btnok.caption msgctxt "TFRMEDITHOTKEY.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "" #: tfrmedithotkey.cghkcontrols.caption msgctxt "tfrmedithotkey.cghkcontrols.caption" msgid "Only for these controls" msgstr "" #: tfrmedithotkey.lblparameters.caption msgid "&Parameters (each in a separate line):" msgstr "" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "Over" #: tfrmeditor.actabout.hint msgctxt "tfrmeditor.actabout.hint" msgid "About" msgstr "Over" #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "&Configuratie" #: tfrmeditor.actconfhigh.hint msgctxt "tfrmeditor.actconfhigh.hint" msgid "Configuration" msgstr "Konfiguratie" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Kopiëer" #: tfrmeditor.acteditcopy.hint msgctxt "tfrmeditor.acteditcopy.hint" msgid "Copy" msgstr "Kopiëer" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Knip" #: tfrmeditor.acteditcut.hint msgctxt "tfrmeditor.acteditcut.hint" msgid "Cut" msgstr "Knip" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Verwijder" #: tfrmeditor.acteditdelete.hint msgctxt "tfrmeditor.acteditdelete.hint" msgid "Delete" msgstr "Verwijder" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "Zoek" #: tfrmeditor.acteditfind.hint msgctxt "tfrmeditor.acteditfind.hint" msgid "Find" msgstr "Zoek" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "Vindt volgende" #: tfrmeditor.acteditfindnext.hint msgctxt "tfrmeditor.acteditfindnext.hint" msgid "Find next" msgstr "Vindt volgende" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcr.hint msgctxt "tfrmeditor.acteditlineendcr.hint" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "tfrmeditor.acteditlineendcrlf.hint" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditlineendlf.hint msgctxt "tfrmeditor.acteditlineendlf.hint" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Plak" #: tfrmeditor.acteditpaste.hint msgctxt "tfrmeditor.acteditpaste.hint" msgid "Paste" msgstr "Plak" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Herongedaan maken" #: tfrmeditor.acteditredo.hint msgctxt "tfrmeditor.acteditredo.hint" msgid "Redo" msgstr "Herongedaan maken" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "Vervang" #: tfrmeditor.acteditrplc.hint msgctxt "tfrmeditor.acteditrplc.hint" msgid "Replace" msgstr "Vervang" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "Selecteer &Alles" #: tfrmeditor.acteditselectall.hint msgctxt "tfrmeditor.acteditselectall.hint" msgid "Select All" msgstr "Selecteer alles" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Ongedaan maken" #: tfrmeditor.acteditundo.hint msgctxt "tfrmeditor.acteditundo.hint" msgid "Undo" msgstr "Ongedaan maken" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "Sluit" #: tfrmeditor.actfileclose.hint msgctxt "tfrmeditor.actfileclose.hint" msgid "Close" msgstr "Sluit" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "Einde" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "&Nieuw" #: tfrmeditor.actfilenew.hint msgctxt "tfrmeditor.actfilenew.hint" msgid "New" msgstr "" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "&Open" #: tfrmeditor.actfileopen.hint msgctxt "tfrmeditor.actfileopen.hint" msgid "Open" msgstr "Open" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "Opslaan" #: tfrmeditor.actfilesave.hint msgctxt "tfrmeditor.actfilesave.hint" msgid "Save" msgstr "" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "Sla op &Als" #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "Sla alles op" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "" #: tfrmeditor.caption msgctxt "tfrmeditor.caption" msgid "Editor" msgstr "Editor" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "&Help" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Edit" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "Koderen" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "Bestand" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "Syntax kleuring" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n5.caption msgctxt "TFRMEDITOR.N5.CAPTION" msgid "-" msgstr "-" #: tfrmeditsearchreplace.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Afbreken" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "Hoofdletter gevoelig" #: tfrmeditsearchreplace.cbsearchfromcursor.caption #, fuzzy #| msgid "Search from &caret" msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "Zoek vanaf caret" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "Reguliere expressies" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "Selecteer alleen tekst" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "Alleen hele woorden" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "Optioneel" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "Vervang door:" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "Zoek naar:" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "Richting" #: tfrmextractdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Afbreken" #: tfrmextractdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Help" #: tfrmextractdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmextractdlg.caption msgctxt "TFRMEXTRACTDLG.CAPTION" msgid "Unpack files" msgstr "Bestanden uitpakken" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "&Pak paden uit indien opgeslagen met bestanden" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*.*" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "Pak elk archief uit in &aparte subdir (naam van het archief)" #: tfrmextractdlg.cboverwrite.caption #, fuzzy #| msgid "&Overwrite existing files" msgid "O&verwrite existing files" msgstr "&Overschrijf bestaande bestanden" #: tfrmextractdlg.lblextractto.caption #, fuzzy #| msgid "To the directory:" msgid "To the &directory:" msgstr "Pak bestand uit naar:" #: tfrmextractdlg.lblfilemask.caption #, fuzzy #| msgid "Extract files matching file mask:" msgid "&Extract files matching file mask:" msgstr "&Uit te pakken bestanden:" #: tfrmextractdlg.lblpassword.caption msgid "&Password for encrypted files:" msgstr "" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "Toevoegen" #: tfrmfileassoc.btnaddext.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "Toevoegen" #: tfrmfileassoc.btnaddnewtype.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "Toevoegen" #: tfrmfileassoc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Afbreken" #: tfrmfileassoc.btndownact.caption #, fuzzy #| msgid "Down" msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "Omlaag" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmfileassoc.btnremoveact.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "Verwijder" #: tfrmfileassoc.btnremoveext.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "Verwijder" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "" #: tfrmfileassoc.btnremovetype.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "Verwijder" #: tfrmfileassoc.btnrenametype.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "Hernoem" #: tfrmfileassoc.btnupact.caption #, fuzzy #| msgid "Up" msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "Omhoog" #: tfrmfileassoc.caption msgid "File associations" msgstr "Bestand verwantschappen" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "Acties" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "Extenties" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "Bestandtypes" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "Icoon" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "Actie:" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "&Commando:" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "Bewerk" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "Openen in Editor" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "Bestandsnaam" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "Bestandspad" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "Volledig pad" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "Verkrijg uitvoer van commando" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "Openen" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "Uitvoeren in terminal" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "Openenen in VFS" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "Bekijken" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "Openen in Viewer" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Sluit" #: tfrmfileexecuteyourself.caption msgctxt "TFRMFILEEXECUTEYOURSELF.CAPTION" msgid "Wait..." msgstr "" #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "" #: tfrmfileop.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Afbreken" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "" #: tfrmfileop.lblto.caption msgid "To:" msgstr "" #: tfrmfileproperties.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Sluit" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "" #: tfrmfileproperties.caption msgctxt "TFRMFILEPROPERTIES.CAPTION" msgid "Properties" msgstr "Eigenschappen" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Sticky" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "Eigenaar" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "bits:" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Groep" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Ander" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Eigenaar" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmfileproperties.lblattrtextstr.caption #, fuzzy #| msgid "Representation in text:" msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Representatie in tekst:" #: tfrmfileproperties.lblcontains.caption msgctxt "tfrmfileproperties.lblcontains.caption" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Voer uit" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "Bestandsnaam" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "Naam:" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "Bestandsnaam" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "Pad:" #: tfrmfileproperties.lblgroupstr.caption #, fuzzy #| msgid "Group" msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "Groep" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "Laatst benadered:" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "Laatste wijziging:" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "Laatste status wijziging:" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "" #: tfrmfileproperties.lblownerstr.caption #, fuzzy #| msgid "Owner" msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "Eigenaar" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Lees" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "Grootte:" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption #, fuzzy #| msgid "Symlink:" msgid "Symlink to:" msgstr "Symlink:" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption #, fuzzy msgid "Type:" msgstr "Type:" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Schrijf" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Attributen" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "Eigenschappen" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "Toevoegen" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "&Help" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Sluit" #: tfrmfinddlg.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmfinddlg.btnedit.caption" msgid "&Edit" msgstr "Bewerk" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "&Ga naar bestand" #: tfrmfinddlg.btnlastsearch.caption msgctxt "tfrmfinddlg.btnlastsearch.caption" msgid "&Last search" msgstr "" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "&Nieuwe zoekopdracht" #: tfrmfinddlg.btnsavetemplate.caption msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "Opslaan" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "Verwijder" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption msgid "Sa&ve with \"Start in directory\"" msgstr "" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "" #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "&Start" #: tfrmfinddlg.btnstop.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "Afbreken" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "Bekijk" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "Voeg toe aan &listbox" #: tfrmfinddlg.caption msgctxt "tfrmfinddlg.caption" msgid "Find files" msgstr "Vindt bestanden" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "Hoofdletter gevoelig" #: tfrmfinddlg.cbdatefrom.caption #, fuzzy #| msgid "Date From:" msgid "&Date from:" msgstr "Datum van:" #: tfrmfinddlg.cbdateto.caption #, fuzzy #| msgid "Date To:" msgid "Dat&e to:" msgstr "Datum tot:" #: tfrmfinddlg.cbfilesizefrom.caption #, fuzzy #| msgid "Size from:" msgid "S&ize from:" msgstr "Bestandsgrootte vanaf:" #: tfrmfinddlg.cbfilesizeto.caption #, fuzzy #| msgid "Size to:" msgid "Si&ze to:" msgstr "Bestandsgrootte tot:" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "Zoek in bestand" #: tfrmfinddlg.cbfollowsymlinks.caption msgctxt "tfrmfinddlg.cbfollowsymlinks.caption" msgid "Follow s&ymlinks" msgstr "" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "Vindt bestanden die NIET de tekst bevatten" #: tfrmfinddlg.cbnotolderthan.caption #, fuzzy #| msgid "Not older than:" msgid "N&ot older than:" msgstr "Niet ouder dan:" #: tfrmfinddlg.cbpartialnamesearch.caption msgid "Searc&h for part of file name" msgstr "" #: tfrmfinddlg.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "Reguliere expressies" #: tfrmfinddlg.cbreplacetext.caption #, fuzzy #| msgid "Re&place text" msgid "Re&place by" msgstr "Vervang tekst" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "" #: tfrmfinddlg.cbtimefrom.caption #, fuzzy #| msgid "Time from:" msgid "&Time from:" msgstr "Tijd vanaf:" #: tfrmfinddlg.cbtimeto.caption #, fuzzy #| msgid "Time to:" msgid "Ti&me to:" msgstr "Tijd tot:" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "Gebruik zoek plug-in:" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption msgctxt "tfrmfinddlg.gbdirectories.caption" msgid "Directories" msgstr "" #: tfrmfinddlg.gbfiles.caption msgctxt "tfrmfinddlg.gbfiles.caption" msgid "Files" msgstr "" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "Zoek Data" #: tfrmfinddlg.lblattributes.caption msgid "Attri&butes" msgstr "" #: tfrmfinddlg.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "Koderen:" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "BestandsMasker" #: tfrmfinddlg.lblfindpathstart.caption #, fuzzy #| msgid "&Start in directory" msgid "Start in &directory" msgstr "BestandDir" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "Doorzoek onderliggend mappen:" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "Laat zien in Viewer" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "Uitgebreid" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "" #: tfrmfinddlg.tsplugins.caption msgctxt "tfrmfinddlg.tsplugins.caption" msgid "Plugins" msgstr "PLugins" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "Standaard" #: tfrmfindview.btnclose.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "Afbreken" #: tfrmfindview.btnfind.caption #, fuzzy #| msgid "Find" msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "Zoek" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "Zoek" #: tfrmfindview.cbcasesens.caption msgid "C&ase sensitive" msgstr "" #: tfrmhardlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Afbreken" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmhardlink.caption #, fuzzy #| msgid "Create hardlink" msgid "Create hard link" msgstr "Maak hardlink" #: tfrmhardlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Bestaand doel (waar zal link naar wijzen)" #: tfrmhardlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Link naam" #: tfrmhotdir.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "Voeg toe" #: tfrmhotdir.btnaddman.caption #, fuzzy #| msgid "Add manually" msgid "Add &manually" msgstr "Handmatig toevoegen" #: tfrmhotdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Afbreken" #: tfrmhotdir.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Verwijder" #: tfrmhotdir.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Bewerk" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "Map Hotlist" #: tfrmlinker.btnexit.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "Einde" #: tfrmlinker.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "..." #: tfrmlinker.caption msgctxt "TFRMLINKER.CAPTION" msgid "Linker" msgstr "Linker" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "Opslaan in..." #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "Iterm" #: tfrmlinker.lblfilename.caption #, fuzzy #| msgid "File name" msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "Bestandsnaam" #: tfrmlinker.spbtndel.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "Verwijder" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "Verwijder" #: tfrmlinker.spbtndown.caption #, fuzzy #| msgid "Down" msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "Omlaag" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "Omlaag" #: tfrmlinker.spbtnup.caption #, fuzzy #| msgid "Up" msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "Omhoog" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "Omhoog" #: tfrmmain.actabout.caption #, fuzzy #| msgid "About" msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "Over" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "Kopiëer pad naar commandoregel" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "" #: tfrmmain.actcalculatespace.caption #, fuzzy #| msgid "Calculate &Occupied Space..." msgid "Calculate &Occupied Space" msgstr "Bereken gebruikte ruimte..." #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "" #: tfrmmain.actchecksumcalc.caption msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "" #: tfrmmain.actchecksumverify.caption msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "" #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "" #: tfrmmain.actclosealltabs.caption #, fuzzy #| msgid "Remove &All Tabs" msgctxt "tfrmmain.actclosealltabs.caption" msgid "Close &All Tabs" msgstr "Verwijder alle tabs" #: tfrmmain.actclosetab.caption #, fuzzy #| msgid "&Remove Tab" msgctxt "tfrmmain.actclosetab.caption" msgid "&Close Tab" msgstr "Verwijder tab" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "Vergelijk met Inhoud" #: tfrmmain.actcomparedirectories.caption msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.CAPTION" msgid "Compare Directories" msgstr "" #: tfrmmain.actcomparedirectories.hint msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.HINT" msgid "Compare Directories" msgstr "" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "Toon context menu" #: tfrmmain.actcopy.caption #, fuzzy #| msgid "Copy" msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "Kopiëer" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "Kopiëer bestand(en) met volledig pad" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "Kopiëer bestandsnaam(en) naar klembord" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "Kopiëer naar zelfde paneel" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "Kopiëren" #: tfrmmain.actcountdircontent.caption msgid "Sho&w Occupied Space" msgstr "" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "Knippen" #: tfrmmain.actdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMMAIN.ACTDELETE.CAPTION" msgid "Delete" msgstr "Verwijder" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "Map historie" #: tfrmmain.actdirhotlist.caption #, fuzzy #| msgid "Directory &hotlist" msgid "Directory &Hotlist" msgstr "Directory &hotlist" #: tfrmmain.actedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "Edit" #: tfrmmain.acteditcomment.caption #, fuzzy #| msgid "Edit comment..." msgid "Edit Co&mment..." msgstr "Bewerk commentaar..." #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "Bewerk nieuw bestand" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "Verwissel Panelen" #: tfrmmain.actexit.caption #, fuzzy #| msgid "Exit" msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "Afsluiten" #: tfrmmain.actextractfiles.caption #, fuzzy #| msgid "Extract files..." msgid "&Extract Files..." msgstr "Uitpakken bestanden..." #: tfrmmain.actfileassoc.caption #, fuzzy #| msgid "File &associations..." msgid "File &Associations..." msgstr "Bestand verwantschappen..." #: tfrmmain.actfilelinker.caption #, fuzzy #| msgid "Link files" msgid "Com&bine Files..." msgstr "Link bestanden" #: tfrmmain.actfileproperties.caption #, fuzzy #| msgid "Show file properties" msgid "Show &File Properties" msgstr "Toon bestands eigenschappen" #: tfrmmain.actfilespliter.caption #, fuzzy #| msgid "Split file" msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "Splits bestand" #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "Focus commandoregel" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "" #: tfrmmain.acthardlink.caption #, fuzzy #| msgid "Create hard link..." msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "Maak link..." #: tfrmmain.acthelpindex.caption #, fuzzy #| msgid "Contents" msgid "&Contents" msgstr "Inhoud" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "" #: tfrmmain.actkeyboard.caption #, fuzzy #| msgid "Keyboard" msgid "&Keyboard" msgstr "Toetsenbord" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "Open linker drive lijst" #: tfrmmain.actloadselectionfromclip.caption msgid "Load Selection from Clip&board" msgstr "" #: tfrmmain.actloadselectionfromfile.caption msgid "&Load Selection from File..." msgstr "" #: tfrmmain.actmakedir.caption #, fuzzy #| msgid "MakeDir" msgid "MakeDir" msgstr "Maak Map" #: tfrmmain.actmarkcurrentextension.caption #, fuzzy #| msgid "Select all with same extension" msgid "Select All with the Same E&xtension" msgstr "Alles selecteren met dezelfde toevoeging" #: tfrmmain.actmarkinvert.caption #, fuzzy #| msgid "Invert Selections" msgid "&Invert Selection" msgstr "Inverteer Selectie" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "&Selecteer Alles" #: tfrmmain.actmarkminus.caption #, fuzzy #| msgid "Unselect a group" msgid "Unselect a Gro&up..." msgstr "Deselecteer groep" #: tfrmmain.actmarkplus.caption #, fuzzy #| msgid "Select a group" msgid "Select a &Group..." msgstr "Selecteer groep" #: tfrmmain.actmarkunmarkall.caption #, fuzzy #| msgid "Unselect All" msgid "&Unselect All" msgstr "Deselecteer Alles" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "" #: tfrmmain.actmultirename.caption #, fuzzy #| msgid "Multi Rename Tool" msgid "Multi &Rename Tool" msgstr "Meervoudig hernoem tool" #: tfrmmain.actnetworkconnect.caption msgid "Network &Connect..." msgstr "" #: tfrmmain.actnetworkdisconnect.caption msgid "Network &Disconnect" msgstr "" #: tfrmmain.actnetworkquickconnect.caption msgid "Network &Quick Connect..." msgstr "" #: tfrmmain.actnewtab.caption #, fuzzy #| msgid "&New tab" msgid "&New Tab" msgstr "Nieuwe tab" #: tfrmmain.actnexttab.caption #, fuzzy #| msgid "Switch to nex&t tab" msgid "Switch to Nex&t Tab" msgstr "Spring naar volgende tab" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "Open" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "Probeer archief te openen" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "" #: tfrmmain.actopendirinnewtab.caption #, fuzzy #| msgid "Open &folder in new tab" msgid "Open &Folder in a New Tab" msgstr "Open map in nieuwe tab" #: tfrmmain.actopenvirtualfilesystemlist.caption #, fuzzy #| msgid "Open VFS List" msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "Open VFS lijst" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "" #: tfrmmain.actoptions.caption #, fuzzy #| msgid "Options..." msgid "&Options..." msgstr "Opties..." #: tfrmmain.actpackfiles.caption #, fuzzy #| msgid "Pack files..." msgid "&Pack Files..." msgstr "Inpakken bestanden..." #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "Plakken" #: tfrmmain.actprevtab.caption #, fuzzy #| msgid "Switch to &previous tab" msgid "Switch to &Previous Tab" msgstr "Spring naar vorige tab" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "Snel zoeken" #: tfrmmain.actquickview.caption msgid "&Quick View Panel" msgstr "" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "&Ververs" #: tfrmmain.actrename.caption #, fuzzy #| msgid "Move" msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "Verplaats" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "Hernoemen" #: tfrmmain.actrenametab.caption msgid "&Rename Tab" msgstr "" #: tfrmmain.actrestoreselection.caption msgid "&Restore Selection" msgstr "" #: tfrmmain.actreverseorder.caption #, fuzzy #| msgid "Reverse order" msgid "Re&verse Order" msgstr "Keer om volgorde" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "Open rechter driver lijst" #: tfrmmain.actrunterm.caption #, fuzzy #| msgid "Run Term" msgid "Run &Terminal" msgstr "Run Term" #: tfrmmain.actsaveselection.caption msgid "Sa&ve Selection" msgstr "" #: tfrmmain.actsaveselectiontofile.caption msgid "Save S&election to File..." msgstr "" #: tfrmmain.actsearch.caption #, fuzzy #| msgid "&Search" msgid "&Search..." msgstr "&Zoeken" #: tfrmmain.actsetfileproperties.caption msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "" #: tfrmmain.actsettaboptiondirsinnewtab.caption msgid "Locked with Directories Opened in New &Tabs" msgstr "" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "" #: tfrmmain.actsettaboptionpathresets.caption #, fuzzy #| msgid "Locked, but &directory changes allowed" msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "Beveiligd, maar map wijzigingen toegestaan" #: tfrmmain.actshellexecute.caption msgctxt "tfrmmain.actshellexecute.caption" msgid "Open" msgstr "Openen" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "Toon knoppen menu" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "Toon commandoregel historie" #: tfrmmain.actshowmainmenu.caption #, fuzzy #| msgid "Menu" msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "Menu" #: tfrmmain.actshowsysfiles.caption #, fuzzy #| msgid "Show hidden/system files" msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "Laat verborgen/systeem bestanden zien" #: tfrmmain.actsortbyattr.caption #, fuzzy #| msgid "Sort by attrib" msgid "Sort by &Attributes" msgstr "Attrib" #: tfrmmain.actsortbydate.caption #, fuzzy #| msgid "Sort by date" msgid "Sort by &Date" msgstr "Sorteer op datum" #: tfrmmain.actsortbyext.caption #, fuzzy #| msgid "Sort by extension" msgid "Sort by &Extension" msgstr "Sorteer op extentie" #: tfrmmain.actsortbyname.caption #, fuzzy #| msgid "Sort by name" msgid "Sort by &Name" msgstr "Sorteer op naam" #: tfrmmain.actsortbysize.caption #, fuzzy #| msgid "Sort by size" msgid "Sort by &Size" msgstr "Sorteer op grootte" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "" #: tfrmmain.actsymlink.caption #, fuzzy #| msgid "Create symbolic link..." msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "Maak symlink..." #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "Doel &= Bron" #: tfrmmain.acttestarchive.caption msgid "&Test Archive(s)" msgstr "" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "Verplaats dir onder de cursor naar linker paneel" #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "Verplaats dir onder de cursor naar rechter paneel" #: tfrmmain.actunmarkcurrentextension.caption #, fuzzy #| msgid "Unselect all with same extension" msgid "Unselect All with the Same Ex&tension" msgstr "Deselecteer alles met dezelfde toevoeging" #: tfrmmain.actview.caption #, fuzzy #| msgid "View" msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "Bekijk" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "" #: tfrmmain.actvisithomepage.caption #, fuzzy #| msgid "&Visit Double Commander Web Site" msgid "&Visit Double Commander Website" msgstr "Bezoek de Double Commander Web Pagina" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "Wissen" #: tfrmmain.btnf10.caption msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "" #: tfrmmain.btnf8.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMMAIN.BTNF8.CAPTION" msgid "Delete" msgstr "Verwijder" #: tfrmmain.btnf9.caption #, fuzzy #| msgid "Terminal" msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "Terminal" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint msgid "Directory hotlist" msgstr "" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "-" #: tfrmmain.btnlefthome.hint msgid "Go to home directory" msgstr "" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgid "Go to root directory" msgstr "" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgid "Go to parent directory" msgstr "" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr "" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "-" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "tfrmmain.caption" msgid "Double Commander" msgstr "Double Commander" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "Pad" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "&20/80" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "&30/70" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "&40/60" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "&50/50" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "&60/40" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "&70/30" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "&80/20" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "Afbreken" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "Kopiëer..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "Maak link..." #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline33.caption msgctxt "tfrmmain.miline33.caption" msgid "-" msgstr "-" #: tfrmmain.miline37.caption msgctxt "TFRMMAIN.MILINE37.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "-" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "Kopiëer" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "Selecteer alles" #: tfrmmain.mimove.caption msgid "Move..." msgstr "Verplaats..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "Maak symlink..." #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "" #: tfrmmain.mitrayiconexit.caption #, fuzzy #| msgid "Exit" msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "Afsluiten" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "" #: tfrmmain.mnualloperpause.caption msgctxt "tfrmmain.mnualloperpause.caption" msgid "||" msgstr "" #: tfrmmain.mnualloperstart.caption msgctxt "tfrmmain.mnualloperstart.caption" msgid "Start" msgstr "" #: tfrmmain.mnualloperstop.caption msgctxt "tfrmmain.mnualloperstop.caption" msgid "Cancel" msgstr "Afbreken" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "&Commando's" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "C&onfiguratie" #: tfrmmain.mnufiles.caption #, fuzzy #| msgid "Files" msgid "&Files" msgstr "Bestanden" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "&Help" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "&Markeer" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "Toon" #: tfrmmain.mnutaboptions.caption #, fuzzy #| msgid "Options" msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "Opties" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "&Tabs" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "Kopiëer" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "Knip" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "Verwijder" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "Bewerk" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "Plak" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmmaskinputdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Afbreken" #: tfrmmaskinputdlg.btndefinetemplate.caption msgid "&Define..." msgstr "" #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmmaskinputdlg.lblsearchtemplate.caption msgid "O&r select predefined selection type:" msgstr "" #: tfrmmkdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Afbreken" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmmkdir.caption msgid "Create new directory" msgstr "Maak nieuwe map" #: tfrmmkdir.lblmakedir.caption #, fuzzy #| msgid "Input new directory name:" msgid "&Input new directory name:" msgstr "Geef nieuwe mapnaam:" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "" #: tfrmmodview.caption msgctxt "TFRMMODVIEW.CAPTION" msgid "New Size" msgstr "" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgctxt "tfrmmodview.lblpath2.caption" msgid "2" msgstr "" #: tfrmmodview.lblpath3.caption msgctxt "tfrmmodview.lblpath3.caption" msgid "3" msgstr "" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "" #: tfrmmodview.teheight.text msgid "Height" msgstr "" #: tfrmmodview.tequality.text msgid "80" msgstr "" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "breedte" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Sluit" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "Verwijder" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "" #: tfrmmultirename.btnrestore.caption #, fuzzy #| msgid "Reset all" msgid "Reset &all" msgstr "Restore Alles" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "Opslaan" #: tfrmmultirename.caption msgctxt "tfrmmultirename.caption" msgid "MultiRename" msgstr "Meervoudig hernoemen" #: tfrmmultirename.cblog.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "Log" #: tfrmmultirename.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "&Reguliere expressie" #: tfrmmultirename.cbusesubs.caption #, fuzzy #| msgid "Use substitution" msgid "&Use substitution" msgstr "Gebruik substitutie" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption #, fuzzy #| msgid "[E]xtension" msgid "[E] Extension" msgstr "[E]xtentie" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "Teller" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "Zoek && Vervang" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "Log Resultaat" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "Masker" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "" #: tfrmmultirename.lbext.caption #, fuzzy #| msgid "Extension" msgid "&Extension" msgstr "Extentie" #: tfrmmultirename.lbfind.caption #, fuzzy #| msgid "Find..." msgid "&Find..." msgstr "Zoek..." #: tfrmmultirename.lbinterval.caption #, fuzzy #| msgid "Interval" msgid "&Interval" msgstr "Interval" #: tfrmmultirename.lbname.caption #, fuzzy #| msgid "File Name" msgid "File &Name" msgstr "Bestandsnaam" #: tfrmmultirename.lbreplace.caption #, fuzzy #| msgid "Replace..." msgid "Re&place..." msgstr "Vervang..." #: tfrmmultirename.lbstnb.caption #, fuzzy #| msgid "Start Number" msgid "S&tart Number" msgstr "Begin nummer" #: tfrmmultirename.lbwidth.caption #, fuzzy #| msgid "Width" msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "breedte" #: tfrmmultirename.micounter.caption #, fuzzy #| msgid "[C]ounter" msgid "[C] Counter" msgstr "[T]eller" #: tfrmmultirename.miday.caption #, fuzzy #| msgid "[D]ay" msgid "[D] Day" msgstr "[D]ag" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "" #: tfrmmultirename.miextensionx.caption #, fuzzy #| msgid "[Ex]xtension" msgid "[Ex] Character at position x" msgstr "[Ex]xtentie" #: tfrmmultirename.miextensionxx.caption #, fuzzy #| msgid "[Ex:x]xtension" msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:x]xtentie" #: tfrmmultirename.mihour.caption #, fuzzy #| msgid "[h]our" msgid "[h] Hour" msgstr "[U]ur" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "" #: tfrmmultirename.miminute.caption #, fuzzy #| msgid "Mi[n]ute" msgid "[n] Minute" msgstr "[Mi]nuut" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "" #: tfrmmultirename.mimonth.caption #, fuzzy #| msgid "[M]onth" msgid "[M] Month" msgstr "[Ma]and" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "" #: tfrmmultirename.mimonth3.caption msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "" #: tfrmmultirename.miname.caption #, fuzzy #| msgid "[N]ame" msgid "[N] Name" msgstr "[N]aam" #: tfrmmultirename.minamex.caption #, fuzzy #| msgid "[Nx]ame" msgid "[Nx] Character at position x" msgstr "[Nx]aam" #: tfrmmultirename.minamexx.caption #, fuzzy #| msgid "[Nx:x]ame" msgid "[Nx:y] Characters from position x to y" msgstr "[Nx.x]aam" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "Tijd..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "Extentie..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "Naam..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "" #: tfrmmultirename.misecond.caption #, fuzzy #| msgid "[s]econd" msgid "[s] Second" msgstr "[S]econde" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "" #: tfrmmultirename.miyear.caption #, fuzzy #| msgid "[Y] Year" msgid "[Y] Year (2 digits)" msgstr "[J]aar" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "tfrmmultirename.stringgrid.columns[0].title.caption" msgid "Old File Name" msgstr "" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "tfrmmultirename.stringgrid.columns[1].title.caption" msgid "New File Name" msgstr "" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "tfrmmultirename.stringgrid.columns[2].title.caption" msgid "File Path" msgstr "Bestandspad" #: tfrmopenwith.caption msgid "Choose an application" msgstr "" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "" #: tfrmoptions.btnapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "Toepassen" #: tfrmoptions.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Afbreken" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmoptions.caption msgctxt "tfrmoptions.caption" msgid "Options" msgstr "Opties" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "" #: tfrmoptionsarchivers.btnautoconfig.caption msgctxt "TFRMOPTIONSARCHIVERS.BTNAUTOCONFIG.CAPTION" msgid "A&uto Configure" msgstr "" #: tfrmoptionsarchivers.btnmultiarcadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCADD.CAPTION" msgid "A&dd" msgstr "Toevoegen" #: tfrmoptionsarchivers.btnmultiarcapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCAPPLY.CAPTION" msgid "A&pply" msgstr "Toepassen" #: tfrmoptionsarchivers.btnmultiarcdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCDELETE.CAPTION" msgid "D&elete" msgstr "Verwijder" #: tfrmoptionsarchivers.btnmultiarcrename.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCRENAME.CAPTION" msgid "&Rename" msgstr "Hernoem" #: tfrmoptionsarchivers.chkmultiarcdebug.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCDEBUG.CAPTION" msgid "De&bug mode" msgstr "" #: tfrmoptionsarchivers.chkmultiarcenabled.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCENABLED.CAPTION" msgid "E&nabled" msgstr "" #: tfrmoptionsarchivers.chkmultiarcoutput.caption msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCOUTPUT.CAPTION" msgid "S&how console output" msgstr "" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "TFRMOPTIONSARCHIVERS.GBARCHIVEROPTIONS.CAPTION" msgid "Options" msgstr "Opties" #: tfrmoptionsarchivers.lblarchiveadd.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEADD.CAPTION" msgid "Add&ing:" msgstr "" #: tfrmoptionsarchivers.lblarchiveextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTENSION.CAPTION" msgid "E&xtension:" msgstr "Extentie:" #: tfrmoptionsarchivers.lblarchiveextract.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTRACT.CAPTION" msgid "Ex&tract:" msgstr "" #: tfrmoptionsarchivers.lblarchivelist.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELIST.CAPTION" msgid "&List:" msgstr "" #: tfrmoptionsarchivers.lblarchivelistend.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTEND.CAPTION" msgid "Listing &finish (optional):" msgstr "" #: tfrmoptionsarchivers.lblarchivelistformat.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTFORMAT.CAPTION" msgid "Listing for&mat:" msgstr "" #: tfrmoptionsarchivers.lblarchiveliststart.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTSTART.CAPTION" msgid "Listin&g start (optional):" msgstr "" #: tfrmoptionsarchivers.lblarchiver.caption msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVER.CAPTION" msgid "Arc&hiver:" msgstr "" #: tfrmoptionsarchivers.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMOPTIONSARCHIVERS.LBLDESCRIPTION.CAPTION" msgid "De&scription:" msgstr "Omschrijving:" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERADDITIONAL.CAPTION" msgid "Additional" msgstr "" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERGENERAL.CAPTION" msgid "General" msgstr "Algemeen" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHATTRIBUTESCHANGE.CAPTION" msgid "When &size, date or attributes change" msgstr "" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHEXCLUDEDIRS.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHFILENAMECHANGE.CAPTION" msgid "When &files are created, deleted or renamed" msgstr "" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHONLYFOREGROUND.CAPTION" msgid "When application is in the &background" msgstr "" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHDISABLE.CAPTION" msgid "Disable auto-refresh" msgstr "" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHENABLE.CAPTION" msgid "Refresh file list" msgstr "" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBALWAYSSHOWTRAYICON.CAPTION" msgid "Al&ways show tray icon" msgstr "" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption msgid "Automatically &hide unmounted devices" msgstr "" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBMINIMIZETOTRAY.CAPTION" msgid "Mo&ve icon to system tray when minimized" msgstr "Verplaats icoon naar systeem tray indien geminimaliseerd" #: tfrmoptionsbehavior.cbonlyonce.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBONLYONCE.CAPTION" msgid "A&llow only one copy of DC at a time" msgstr "" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "" #: tfrmoptionsbehavior.lbldrivesblacklist.caption msgid "Drives &blacklist" msgstr "" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption #, fuzzy #| msgid "Cut text to column width" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBCUTTEXTTOCOLWIDTH.CAPTION" msgid "Cut &text to column width" msgstr "Snij tekst af op kolombreedte" #: tfrmoptionscolumnsview.cbgridhorzline.caption #, fuzzy #| msgid "Horizontal lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDHORZLINE.CAPTION" msgid "&Horizontal lines" msgstr "Horizontale lijnen" #: tfrmoptionscolumnsview.cbgridvertline.caption #, fuzzy #| msgid "Vertical lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDVERTLINE.CAPTION" msgid "&Vertical lines" msgstr "Verticale lijnen" #: tfrmoptionscolumnsview.chkautofillcolumns.caption msgctxt "TFRMOPTIONSCOLUMNSVIEW.CHKAUTOFILLCOLUMNS.CAPTION" msgid "A&uto fill columns" msgstr "" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "" #: tfrmoptionscolumnsview.lblautosizecolumn.caption msgctxt "TFRMOPTIONSCOLUMNSVIEW.LBLAUTOSIZECOLUMN.CAPTION" msgid "Auto si&ze column:" msgstr "" #: tfrmoptionsconfiguration.btnconfigapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGAPPLY.CAPTION" msgid "A&pply" msgstr "Toepassen" #: tfrmoptionsconfiguration.btnconfigedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGEDIT.CAPTION" msgid "&Edit" msgstr "Bewerk" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption #, fuzzy #| msgid "Command line history" msgctxt "TFRMOPTIONSCONFIGURATION.CBCMDLINEHISTORY.CAPTION" msgid "Co&mmand line history" msgstr "Commandoregel geschiedenis" #: tfrmoptionsconfiguration.cbdirhistory.caption #, fuzzy #| msgid "Directory history" msgctxt "TFRMOPTIONSCONFIGURATION.CBDIRHISTORY.CAPTION" msgid "&Directory history" msgstr "Map historie" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption #, fuzzy #| msgid "File mask history" msgctxt "TFRMOPTIONSCONFIGURATION.CBFILEMASKHISTORY.CAPTION" msgid "&File mask history" msgstr "Bestandsmasker geschiedenis" #: tfrmoptionsconfiguration.chksaveconfiguration.caption msgctxt "TFRMOPTIONSCONFIGURATION.CHKSAVECONFIGURATION.CAPTION" msgid "Sa&ve configuration" msgstr "" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption msgctxt "TFRMOPTIONSCONFIGURATION.CHKSEARCHREPLACEHISTORY.CAPTION" msgid "Searc&h/Replace history" msgstr "" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBLOCCONFIGFILES.CAPTION" msgid "Location of configuration files" msgstr "Locatie van configuratiebestanden" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBSAVEONEXIT.CAPTION" msgid "Save on exit" msgstr "Opslaan bij afsluiten" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgctxt "TFRMOPTIONSCONFIGURATION.LBLCMDLINECONFIGDIR.CAPTION" msgid "Set on command line" msgstr "" #: tfrmoptionsconfiguration.rbprogramdir.caption #, fuzzy #| msgid "Program directory (portable version)" msgctxt "TFRMOPTIONSCONFIGURATION.RBPROGRAMDIR.CAPTION" msgid "P&rogram directory (portable version)" msgstr "Programma map (draagbare versie)" #: tfrmoptionsconfiguration.rbuserhomedir.caption #, fuzzy #| msgid "User home directory" msgctxt "TFRMOPTIONSCONFIGURATION.RBUSERHOMEDIR.CAPTION" msgid "&User home directory" msgstr "Gebruikers home map" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption #, fuzzy #| msgid "Copy" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNCOPYCOLUMNSSET.CAPTION" msgid "C&opy" msgstr "Kopiëer" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNDELCOLUMNSSET.CAPTION" msgid "&Delete" msgstr "Verwijder" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNEDITCOLUMNSSET.CAPTION" msgid "&Edit" msgstr "Bewerk" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNNEWCOLUMNSSET.CAPTION" msgid "&New" msgstr "&Nieuw" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.CBBFILESYSTEM.TEXT" msgid "General" msgstr "Algemeen" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption #, fuzzy #| msgid "Configure columns for file system:" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.LBLCONFIGCOLUMNS.CAPTION" msgid "Con&figure columns for file system:" msgstr "Konfigureer kolommen voor bestandsysteem:" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption msgid "&Show confirmation dialog after drop" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption msgid "Show &file system" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption msgid "Show fr&ee space" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption msgid "Show &label" msgstr "" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "" #: tfrmoptionseditorcolors.backgroundlabel.caption msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "" #: tfrmoptionseditorcolors.foregroundlabel.caption msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption msgid "&Text-mark" msgstr "" #: tfrmoptionseditorcolors.tbtnglobal.caption msgid "Use (and edit) &global scheme settings" msgstr "" #: tfrmoptionseditorcolors.tbtnlocal.caption msgid "Use &local scheme settings" msgstr "" #: tfrmoptionseditorcolors.textboldcheckbox.caption msgid "&Bold" msgstr "" #: tfrmoptionseditorcolors.textboldradioinvert.caption msgctxt "tfrmoptionseditorcolors.textboldradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textboldradiooff.caption msgctxt "tfrmoptionseditorcolors.textboldradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textboldradioon.caption msgctxt "tfrmoptionseditorcolors.textboldradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textitaliccheckbox.caption msgid "&Italic" msgstr "" #: tfrmoptionseditorcolors.textitalicradioinvert.caption msgctxt "tfrmoptionseditorcolors.textitalicradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textitalicradiooff.caption msgctxt "tfrmoptionseditorcolors.textitalicradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textitalicradioon.caption msgctxt "tfrmoptionseditorcolors.textitalicradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption msgid "&Strike Out" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption msgid "&Underline" msgstr "" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textunderlineradiooff.caption msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textunderlineradioon.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "" #: tfrmoptionsfileoperations.cbdeletetotrash.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDELETETOTRASH.CAPTION" msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDROPREADONLYFLAG.CAPTION" msgid "D&rop readonly flag" msgstr "Verwijder alleen lezen attribuut" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPARTIALNAMESEARCH.CAPTION" msgid "&Search for part of file name" msgstr "" #: tfrmoptionsfileoperations.cbprocesscomments.caption #, fuzzy #| msgid "Process comments with files/folders" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPROCESSCOMMENTS.CAPTION" msgid "&Process comments with files/folders" msgstr "Verwerk commentaar met bestanden/mappen" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption #, fuzzy #| msgid "Select file name without extension when renaming" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBRENAMESELONLYNAME.CAPTION" msgid "Select &file name without extension when renaming" msgstr "Selecteer alleen de bestandsnaam met hernoemen (niet de extentie)" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSHOWCOPYTABSELECTPANEL.CAPTION" msgid "Sho&w tab select panel in copy/move dialog" msgstr "" #: tfrmoptionsfileoperations.cbskipfileoperror.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSKIPFILEOPERROR.CAPTION" msgid "S&kip file operations errors and write them to log window" msgstr "" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.GBFILESEARCH.CAPTION" msgid "File search" msgstr "Zoek bestand" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "" #: tfrmoptionsfileoperations.lblbuffersize.caption msgid "&Buffer size for file operations (in KB):" msgstr "" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "" #: tfrmoptionsfileoperations.lblprogresskind.caption msgid "Show operations progress &initially in" msgstr "" #: tfrmoptionsfileoperations.lblwipepassnumber.caption #, fuzzy #| msgid "Number of wipe passes:" msgctxt "TFRMOPTIONSFILEOPERATIONS.LBLWIPEPASSNUMBER.CAPTION" msgid "&Number of wipe passes:" msgstr "Aantal wissingen:" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption #, fuzzy #| msgid "Use memory mapping for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSEMMAPINSEARCH.CAPTION" msgid "Use memory mapping for search te&xt in files" msgstr "Gebruik geheugen mapping voor zoeken tekst in bestanden" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption #, fuzzy #| msgid "Use stream for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSESTREAMINSEARCH.CAPTION" msgid "&Use stream for search text in files" msgstr "Gebruik stream voor zoeken tekst in bestanden" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEFRAMECURSOR.CAPTION" msgid "Use &Frame Cursor" msgstr "" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption msgid "Use &Gradient Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption #, fuzzy #| msgid "Use Inverted Selection" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEINVERTEDSELECTION.CAPTION" msgid "U&se Inverted Selection" msgstr "Gebruik geïnverteerde selectie" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.DBFREESPACEINDICATOR.CAPTION" msgid "Drive Free Space Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.GBEXAMPLE.CAPTION" msgid "Example" msgstr "Voorbeeld" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption #, fuzzy #| msgid "Background:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR.CAPTION" msgid "Bac&kground:" msgstr "Achtergrond:" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption #, fuzzy #| msgid "Background 2:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR2.CAPTION" msgid "Backg&round 2:" msgstr "Achtergrond 2:" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption #, fuzzy #| msgid "Cursor Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORCOLOR.CAPTION" msgid "C&ursor Color:" msgstr "Cursor kleur:" #: tfrmoptionsfilepanelscolors.lblcursortext.caption #, fuzzy #| msgid "Cursor Text:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORTEXT.CAPTION" msgid "Cursor Te&xt:" msgstr "Cursor tekst:" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLINACTIVEPANELBRIGHTNESS.CAPTION" msgid "&Brightness level of inactive panel" msgstr "" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption msgid "In&dicator Back Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblindcolor.caption msgid "&Indicator Fore Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption #, fuzzy #| msgid "Mark Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLMARKCOLOR.CAPTION" msgid "&Mark Color:" msgstr "Markeer kleur:" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption #, fuzzy #| msgid "Text Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLTEXTCOLOR.CAPTION" msgid "T&ext Color:" msgstr "Tekst kleur:" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption msgid "Do&n't load file list until a tab is activated" msgstr "" #: tfrmoptionsfilesviews.cbdirbrackets.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBDIRBRACKETS.CAPTION" msgid "S&how square brackets around directories" msgstr "" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption msgid "Hi&ghlight new and updated files" msgstr "" #: tfrmoptionsfilesviews.cblistfilesinthread.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBLISTFILESINTHREAD.CAPTION" msgid "Load &file list in separate thread" msgstr "" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBLOADICONSSEPARATELY.CAPTION" msgid "Load icons af&ter file list" msgstr "" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption #, fuzzy #| msgid "Show system and hidden files" msgctxt "TFRMOPTIONSFILESVIEWS.CBSHOWSYSTEMFILES.CAPTION" msgid "Show s&ystem and hidden files" msgstr "Laat verborgen/systeem bestanden zien" #: tfrmoptionsfilesviews.cbspacemovesdown.caption msgctxt "TFRMOPTIONSFILESVIEWS.CBSPACEMOVESDOWN.CAPTION" msgid "&When selecting files with , move down to next file (as with )" msgstr "" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "" #: tfrmoptionsfilesviews.gbsorting.caption msgctxt "TFRMOPTIONSFILESVIEWS.GBSORTING.CAPTION" msgid "Sorting" msgstr "" #: tfrmoptionsfilesviews.lblcasesensitivity.caption msgid "Case s&ensitivity:" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeformat.caption #, fuzzy #| msgid "Date and time format:" msgctxt "TFRMOPTIONSFILESVIEWS.LBLDATETIMEFORMAT.CAPTION" msgid "&Date and time format:" msgstr "Datum en tijd formaat:" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "" #: tfrmoptionsfilesviews.lblnewfilesposition.caption msgid "&Insert new files" msgstr "" #: tfrmoptionsfilesviews.lblsortfoldermode.caption msgid "So&rting directories:" msgstr "" #: tfrmoptionsfilesviews.lblsortmethod.caption msgctxt "TFRMOPTIONSFILESVIEWS.LBLSORTMETHOD.CAPTION" msgid "&Sort method:" msgstr "" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption msgid "&Move updated files" msgstr "" #: tfrmoptionsfiletypescolors.btnaddcategory.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNADDCATEGORY.CAPTION" msgid "A&dd" msgstr "Toevoegen" #: tfrmoptionsfiletypescolors.btnapplycategory.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNAPPLYCATEGORY.CAPTION" msgid "A&pply" msgstr "Toepassen" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNCATEGORYCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNDELETECATEGORY.CAPTION" msgid "D&elete" msgstr "Verwijder" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "" #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption #, fuzzy #| msgid "File types colors" msgctxt "TFRMOPTIONSFILETYPESCOLORS.GBFILETYPESCOLORS.CAPTION" msgid "File types colors (sort by drag&&drop)" msgstr "Bestandstype kleuren" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption #, fuzzy #| msgid "Category attributes:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYATTR.CAPTION" msgid "Category a&ttributes:" msgstr "Categorie attributen:" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption #, fuzzy #| msgid "Category color:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYCOLOR.CAPTION" msgid "Category co&lor:" msgstr "Categorie kleur:" #: tfrmoptionsfiletypescolors.lblcategorymask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYMASK.CAPTION" msgid "Category &mask:" msgstr "Categorie masker:" #: tfrmoptionsfiletypescolors.lblcategoryname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYNAME.CAPTION" msgid "Category &name:" msgstr "Categorie naam:" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELEDITFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELLOGFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELMAINFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWERBOOKFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.lbleditorfont.caption #, fuzzy #| msgid "Editor font" msgctxt "TFRMOPTIONSFONTS.LBLEDITORFONT.CAPTION" msgid "&Editor font" msgstr "Editor lettertype" #: tfrmoptionsfonts.lbllogfont.caption msgctxt "TFRMOPTIONSFONTS.LBLLOGFONT.CAPTION" msgid "&Log font" msgstr "" #: tfrmoptionsfonts.lblmainfont.caption #, fuzzy #| msgid "Main font" msgctxt "TFRMOPTIONSFONTS.LBLMAINFONT.CAPTION" msgid "Main &font" msgstr "Standaard lettertype" #: tfrmoptionsfonts.lblviewerbookfont.caption msgctxt "TFRMOPTIONSFONTS.LBLVIEWERBOOKFONT.CAPTION" msgid "Viewer&Book Font" msgstr "" #: tfrmoptionsfonts.lblviewerfont.caption #, fuzzy #| msgid "Viewer font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERFONT.CAPTION" msgid "&Viewer font" msgstr "Viewer lettertype" #: tfrmoptionshotkeys.btnaddhotkey.caption msgid "Add &hotkey" msgstr "" #: tfrmoptionshotkeys.btndeletehotkey.caption msgid "&Delete hotkey" msgstr "" #: tfrmoptionshotkeys.btnedithotkey.caption msgctxt "tfrmoptionshotkeys.btnedithotkey.caption" msgid "&Edit hotkey" msgstr "" #: tfrmoptionshotkeys.lbfilter.caption msgctxt "TFRMOPTIONSHOTKEYS.LBFILTER.CAPTION" msgid "&Filter" msgstr "" #: tfrmoptionshotkeys.lblcategories.caption #, fuzzy #| msgid "Categories:" msgctxt "tfrmoptionshotkeys.lblcategories.caption" msgid "C&ategories:" msgstr "Kategoriën:" #: tfrmoptionshotkeys.lblcommands.caption msgctxt "tfrmoptionshotkeys.lblcommands.caption" msgid "Co&mmands:" msgstr "" #: tfrmoptionshotkeys.lblscfiles.caption msgctxt "TFRMOPTIONSHOTKEYS.LBLSCFILES.CAPTION" msgid "&Shortcut files:" msgstr "" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[0].TITLE.CAPTION" msgid "Hotkey" msgstr "" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[1].TITLE.CAPTION" msgid "Parameters" msgstr "" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[2].TITLE.CAPTION" msgid "Controls" msgstr "" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "tfrmoptionsicons.cbiconsinmenussize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption msgctxt "TFRMOPTIONSICONS.CBICONSSHOWOVERLAY.CAPTION" msgid "Show o&verlay icons, e.g. for links" msgstr "" #: tfrmoptionsicons.cbiconssize.text msgctxt "TFRMOPTIONSICONS.CBICONSSIZE.TEXT" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "" #: tfrmoptionsicons.gbiconssize.caption msgctxt "TFRMOPTIONSICONS.GBICONSSIZE.CAPTION" msgid " Icon size " msgstr "" #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "TFRMOPTIONSICONS.GBSHOWICONSMODE.CAPTION" msgid " Show icons to the left of the filename " msgstr "" #: tfrmoptionsicons.rbiconsshowall.caption #, fuzzy #| msgid "&All" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALL.CAPTION" msgid "A&ll" msgstr "&Alles" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALLANDEXE.CAPTION" msgid "All associated + &EXE/LNK (slow)" msgstr "" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWNONE.CAPTION" msgid "&No icons" msgstr "" #: tfrmoptionsicons.rbiconsshowstandard.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWSTANDARD.CAPTION" msgid "Only &standard icons" msgstr "" #: tfrmoptionsignorelist.btnaddsel.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSEL.CAPTION" msgid "A&dd selected names" msgstr "" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSELWITHPATH.CAPTION" msgid "Add selected names with &full path" msgstr "" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "TFRMOPTIONSIGNORELIST.CHKIGNOREENABLE.CAPTION" msgid "&Ignore (don't show) the following files and folders:" msgstr "" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "TFRMOPTIONSIGNORELIST.LBLSAVEIN.CAPTION" msgid "&Save in:" msgstr "" #: tfrmoptionskeyboard.cblynxlike.caption msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "" #: tfrmoptionskeyboard.lblalt.caption #, fuzzy #| msgid "Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLALT.CAPTION" msgid "Alt+L&etters" msgstr "Al&t+Letters" #: tfrmoptionskeyboard.lblctrlalt.caption #, fuzzy #| msgid "Ctrl+Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLCTRLALT.CAPTION" msgid "Ctrl+Alt+Le&tters" msgstr "&Ctrl+Alt+Letters" #: tfrmoptionskeyboard.lblnomodifier.caption msgctxt "TFRMOPTIONSKEYBOARD.LBLNOMODIFIER.CAPTION" msgid "&Letters" msgstr "" #: tfrmoptionslayout.cbflatdiskpanel.caption #, fuzzy #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATDISKPANEL.CAPTION" msgid "&Flat buttons" msgstr "Platte knoppen" #: tfrmoptionslayout.cbflatinterface.caption #, fuzzy #| msgid "Flat interface" msgctxt "TFRMOPTIONSLAYOUT.CBFLATINTERFACE.CAPTION" msgid "Flat i&nterface" msgstr "Platte interface" #: tfrmoptionslayout.cbflattoolbar.caption #, fuzzy #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATTOOLBAR.CAPTION" msgid "Flat b&uttons" msgstr "Platte knoppen" #: tfrmoptionslayout.cbfreespaceind.caption msgctxt "TFRMOPTIONSLAYOUT.CBFREESPACEIND.CAPTION" msgid "Show fr&ee space indicator on drive label" msgstr "" #: tfrmoptionslayout.cblogwindow.caption #, fuzzy #| msgid "Show log window" msgctxt "TFRMOPTIONSLAYOUT.CBLOGWINDOW.CAPTION" msgid "Show lo&g window" msgstr "Log venster" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "TFRMOPTIONSLAYOUT.CBPANELOFOPERATIONS.CAPTION" msgid "Show panel of operation in background" msgstr "" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "TFRMOPTIONSLAYOUT.CBPROGINMENUBAR.CAPTION" msgid "Show common progress in menu bar" msgstr "" #: tfrmoptionslayout.cbshowcmdline.caption #, fuzzy #| msgid "Show command &line" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCMDLINE.CAPTION" msgid "Show command l&ine" msgstr "Toon commando regel" #: tfrmoptionslayout.cbshowcurdir.caption #, fuzzy #| msgid "Show ¤t directory" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCURDIR.CAPTION" msgid "Show current director&y" msgstr "Toon huidige map" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDISKPANEL.CAPTION" msgid "Show &drive buttons" msgstr "Toon &drive balk" #: tfrmoptionslayout.cbshowdrivefreespace.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDRIVEFREESPACE.CAPTION" msgid "Show free s&pace label" msgstr "" #: tfrmoptionslayout.cbshowdriveslistbutton.caption msgid "Show drives list bu&tton" msgstr "" #: tfrmoptionslayout.cbshowkeyspanel.caption #, fuzzy #| msgid "Show &function key buttons" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWKEYSPANEL.CAPTION" msgid "Show function &key buttons" msgstr "Toon &functietoets knoppen" #: tfrmoptionslayout.cbshowmainmenu.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINMENU.CAPTION" msgid "Show &main menu" msgstr "" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINTOOLBAR.CAPTION" msgid "Show &button bar" msgstr "Toon knoppenbalk" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption msgid "Show short free space &label" msgstr "" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWSTATUSBAR.CAPTION" msgid "Show &status bar" msgstr "Toon &statusbalk" #: tfrmoptionslayout.cbshowtabheader.caption #, fuzzy #| msgid "Show &tabstop header" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABHEADER.CAPTION" msgid "S&how tabstop header" msgstr "Toon &tabstop header" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABS.CAPTION" msgid "Sho&w folder tabs" msgstr "Toon folder tabs" #: tfrmoptionslayout.cbtermwindow.caption #, fuzzy #| msgid "Show terminal window" msgctxt "TFRMOPTIONSLAYOUT.CBTERMWINDOW.CAPTION" msgid "Show te&rminal window" msgstr "Toon terminal venster" #: tfrmoptionslayout.cbtwodiskpanels.caption #, fuzzy #| msgid "Show two drive button bars (fixed width, above file windows)" msgctxt "TFRMOPTIONSLAYOUT.CBTWODISKPANELS.CAPTION" msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "Toon twee drive knoppenbalken (vaste breedte, boven bestandspaneel" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "TFRMOPTIONSLAYOUT.GBSCREENLAYOUT.CAPTION" msgid " Screen layout " msgstr " Scherm opmaak " #: tfrmoptionslog.cblogarcop.caption #, fuzzy #| msgid "Pack/Unpack" msgctxt "TFRMOPTIONSLOG.CBLOGARCOP.CAPTION" msgid "&Pack/Unpack" msgstr "Inpakke/Uitpakken" #: tfrmoptionslog.cblogcpmvln.caption #, fuzzy #| msgid "Copy/Move/Create link/symlink" msgctxt "TFRMOPTIONSLOG.CBLOGCPMVLN.CAPTION" msgid "Cop&y/Move/Create link/symlink" msgstr "Kopiëer/Verplaats/Maak link/syslink" #: tfrmoptionslog.cblogdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSLOG.CBLOGDELETE.CAPTION" msgid "&Delete" msgstr "Verwijder" #: tfrmoptionslog.cblogdirop.caption #, fuzzy #| msgid "Create/Delete directories" msgctxt "TFRMOPTIONSLOG.CBLOGDIROP.CAPTION" msgid "Crea&te/Delete directories" msgstr "Maak/Verwijder mappen" #: tfrmoptionslog.cblogerrors.caption msgctxt "TFRMOPTIONSLOG.CBLOGERRORS.CAPTION" msgid "Log &errors" msgstr "Log fouten" #: tfrmoptionslog.cblogfile.caption #, fuzzy #| msgid "&Create a log file:" msgctxt "TFRMOPTIONSLOG.CBLOGFILE.CAPTION" msgid "C&reate a log file:" msgstr "Creëer een logbestand:" #: tfrmoptionslog.cbloginfo.caption #, fuzzy #| msgid "Log information messages" msgctxt "TFRMOPTIONSLOG.CBLOGINFO.CAPTION" msgid "Log &information messages" msgstr "Log informtie berichten" #: tfrmoptionslog.cblogsuccess.caption msgctxt "TFRMOPTIONSLOG.CBLOGSUCCESS.CAPTION" msgid "Log &successful operations" msgstr "Log gelukte handelingen" #: tfrmoptionslog.cblogvfs.caption #, fuzzy #| msgid "File system plugins" msgctxt "TFRMOPTIONSLOG.CBLOGVFS.CAPTION" msgid "&File system plugins" msgstr "Bestandsysteem plug-ins" #: tfrmoptionslog.gblogfile.caption msgctxt "TFRMOPTIONSLOG.GBLOGFILE.CAPTION" msgid "File operation log file" msgstr "Bestandshandelingen logbestand" #: tfrmoptionslog.gblogfileop.caption #, fuzzy #| msgid "Log operations:" msgctxt "TFRMOPTIONSLOG.GBLOGFILEOP.CAPTION" msgid "Log operations" msgstr "Log handelingen:" #: tfrmoptionslog.gblogfilestatus.caption #, fuzzy #| msgid "Operation status:" msgctxt "TFRMOPTIONSLOG.GBLOGFILESTATUS.CAPTION" msgid "Operation status" msgstr "Bewerkingsstatus:" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "" #: tfrmoptionsmisc.chkshowwarningmessages.caption #, fuzzy #| msgid "Show warning messages (\"OK\" button only)" msgctxt "tfrmoptionsmisc.chkshowwarningmessages.caption" msgid "Show &warning messages (\"OK\" button only)" msgstr "Toon waarshuwingen (\"OK\" knop alleen)" #: tfrmoptionsmisc.chkthumbsave.caption msgctxt "tfrmoptionsmisc.chkthumbsave.caption" msgid "&Save thumbnails in cache" msgstr "" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "tfrmoptionsmisc.dblthumbnails.caption" msgid "Thumbnails" msgstr "" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "tfrmoptionsmisc.lblthumbseparator.caption" msgid "X" msgstr "" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "" #: tfrmoptionsmouse.cbselectionbymouse.caption msgid "&Selection by mouse" msgstr "" #: tfrmoptionsmouse.gbscrolling.caption msgid "Scrolling" msgstr "" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "" #: tfrmoptionsmouse.lblmousemode.caption msgid "&Mode:" msgstr "" #: tfrmoptionsmouse.rbscrolllinebyline.caption msgid "&Line by line" msgstr "" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption msgid "Line by line &with cursor movement" msgstr "" #: tfrmoptionsmouse.rbscrollpagebypage.caption msgid "&Page by page" msgstr "" #: tfrmoptionsplugins.btnaddplugin.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "Toevoegen" #: tfrmoptionsplugins.btnconfigplugin.caption #, fuzzy #| msgid "Configure" msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "Configureer" #: tfrmoptionsplugins.btnenableplugin.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "Activeer" #: tfrmoptionsplugins.btnremoveplugin.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "Verwijder" #: tfrmoptionsplugins.btntweakplugin.caption #, fuzzy #| msgid "Tweak" msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "Aanpassen" #: tfrmoptionsplugins.lbldsxdescription.caption #, fuzzy #| msgid "Search plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "Zoek plug-ins " #: tfrmoptionsplugins.lblwcxdescription.caption #, fuzzy #| msgid "Packer plugins are used to work with archives." msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "Inpak plug-ins worden gebruikt om te werken met archieven" #: tfrmoptionsplugins.lblwdxdescription.caption #, fuzzy #| msgid "Content plugins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "Inhoud plug-ins geven uitgebreide bestanddetails weer zoals mp3 tags of afbeeldings attributen in bestandslijsten, of gebruik ze in zoek en hernoem tool" #: tfrmoptionsplugins.lblwfxdescription.caption #, fuzzy #| msgid "File system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "Bestandssysteem plug-ins zorgen voor toegang tot schijven niet benaderbaar door het bedrijfssysteem of tot apparaten zoals Palm/PocketPC." #: tfrmoptionsplugins.lblwlxdescription.caption #, fuzzy #| msgid "Viewer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "Viewer plug-ins laten formaten zoals plaatjes, rekenbladen en databases etc. zien in Viewer (F3, Ctrl+Q)" #: tfrmoptionsplugins.stgplugins.columns[0].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[0].TITLE.CAPTION" msgid "Active" msgstr "Aktief" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[1].TITLE.CAPTION" msgid "Plugin" msgstr "" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[2].TITLE.CAPTION" msgid "Registered for" msgstr "Geregisreerd voor" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[3].TITLE.CAPTION" msgid "File name" msgstr "Bestandsnaam" #: tfrmoptionsplugins.tsdsx.caption #, fuzzy #| msgid "Search plugins (.DSX)" msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "Zoek plug-ins (.DSX)" #: tfrmoptionsplugins.tswcx.caption #, fuzzy #| msgid "Packer plugins (.WCX)" msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "Inpak plugins (.WCX)" #: tfrmoptionsplugins.tswdx.caption #, fuzzy #| msgid "Content plugins (.WDX)" msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "Inhoud plugins (.WDX)" #: tfrmoptionsplugins.tswfx.caption #, fuzzy #| msgid "File system plugins (.WFX)" msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "Bestandsysteem plugins (.WFX)" #: tfrmoptionsplugins.tswlx.caption #, fuzzy #| msgid "Viewer plugins (.WLX)" msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "Viewer plug-ins (.WLX)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTBEGINNING.CAPTION" msgid "&Beginning (name must start with first typed character)" msgstr "Begin (naam moet beginnen met eerst getypte letter)" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTENDING.CAPTION" msgid "En&ding (last character before a typed dot . must match)" msgstr "Einde (laatste karakter voor een getypte punt . moet overeenkomene" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CGPOPTIONS.CAPTION" msgid "Options" msgstr "Opties" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption #, fuzzy #| msgid "Exact name match:" msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.GBEXACTNAMEMATCH.CAPTION" msgid "Exact name match" msgstr "Precieze naamovereenkomst:" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "TFRMOPTIONSTABS.CBTABSACTIVATEONCLICK.CAPTION" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "TFRMOPTIONSTABS.CBTABSALWAYSVISIBLE.CAPTION" msgid "&Show tab header also when there is only one tab" msgstr "Toon tab header ook als er één tab is" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption #, fuzzy #| msgid "&Confirm close all tabs" msgctxt "TFRMOPTIONSTABS.CBTABSCONFIRMCLOSEALL.CAPTION" msgid "Con&firm close all tabs" msgstr "Bevestig sluiten alle tabs" #: tfrmoptionstabs.cbtabslimitoption.caption #, fuzzy #| msgid "&Limit tab title length to:" msgctxt "TFRMOPTIONSTABS.CBTABSLIMITOPTION.CAPTION" msgid "&Limit tab title length to" msgstr "&Limiteer tab titellengte tot:" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "TFRMOPTIONSTABS.CBTABSLOCKEDASTERISK.CAPTION" msgid "Show locked tabs &with an asterisk *" msgstr "Toon beveiligde tabs met een asterisk *" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "TFRMOPTIONSTABS.CBTABSMULTILINES.CAPTION" msgid "&Tabs on multiple lines" msgstr "&Tabs op meerdere regels" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENFOREGROUND.CAPTION" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Ctrl+&Up opent nieuwe tab in voorgrond" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENNEARCURRENT.CAPTION" msgid "Open &new tabs near current tab" msgstr "" #: tfrmoptionstabs.cbtabsshowclosebutton.caption msgctxt "TFRMOPTIONSTABS.CBTABSSHOWCLOSEBUTTON.CAPTION" msgid "Show ta&b close button" msgstr "" #: tfrmoptionstabs.gbtabs.caption msgctxt "TFRMOPTIONSTABS.GBTABS.CAPTION" msgid "Folder tabs headers" msgstr "Folder tabs headers" #: tfrmoptionstabs.lblchar.caption msgctxt "TFRMOPTIONSTABS.LBLCHAR.CAPTION" msgid "characters" msgstr "tekens" #: tfrmoptionstabs.lbltabsposition.caption msgctxt "TFRMOPTIONSTABS.LBLTABSPOSITION.CAPTION" msgid "Ta&bs position" msgstr "" #: tfrmoptionsterminal.lblruninterm.caption msgid "Run in &terminal:" msgstr "" #: tfrmoptionsterminal.lblrunterm.caption msgid "Run t&erminal:" msgstr "" #: tfrmoptionstoolbar.btnclonebutton.caption msgctxt "tfrmoptionstoolbar.btnclonebutton.caption" msgid "C&lone button" msgstr "" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "tfrmoptionstoolbar.btndeletebutton.caption" msgid "&Delete" msgstr "Verwijder" #: tfrmoptionstoolbar.btnedithotkey.caption #, fuzzy #| msgid "Edit hotkey" msgctxt "tfrmoptionstoolbar.btnedithotkey.caption" msgid "Edit hot&key" msgstr "Bewerk" #: tfrmoptionstoolbar.btninsertbutton.caption msgctxt "tfrmoptionstoolbar.btninsertbutton.caption" msgid "&Insert new button" msgstr "" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "tfrmoptionstoolbar.btnopenfile.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "tfrmoptionstoolbar.btnopenicon.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnremovehotkey.caption msgctxt "tfrmoptionstoolbar.btnremovehotkey.caption" msgid "Remove hotke&y" msgstr "" #: tfrmoptionstoolbar.cbflatbuttons.caption msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "Platte knoppen" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "" #: tfrmoptionstoolbar.gbgroupbox.caption msgctxt "tfrmoptionstoolbar.gbgroupbox.caption" msgid "Appearance" msgstr "Verschijning" #: tfrmoptionstoolbar.lblbarsize.caption msgctxt "tfrmoptionstoolbar.lblbarsize.caption" msgid "&Bar size:" msgstr "" #: tfrmoptionstoolbar.lblexternalcommand.caption msgctxt "tfrmoptionstoolbar.lblexternalcommand.caption" msgid "Comman&d:" msgstr "" #: tfrmoptionstoolbar.lblexternalparameters.caption msgctxt "tfrmoptionstoolbar.lblexternalparameters.caption" msgid "Parameter&s:" msgstr "" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "" #: tfrmoptionstoolbar.lbliconfile.caption #, fuzzy #| msgid "Icon:" msgctxt "tfrmoptionstoolbar.lbliconfile.caption" msgid "Ico&n:" msgstr "Icoon bestand:" #: tfrmoptionstoolbar.lbliconsize.caption msgctxt "tfrmoptionstoolbar.lbliconsize.caption" msgid "Icon si&ze:" msgstr "" #: tfrmoptionstoolbar.lblinternalcommand.caption msgctxt "tfrmoptionstoolbar.lblinternalcommand.caption" msgid "Co&mmand:" msgstr "" #: tfrmoptionstoolbar.lblinternalparameters.caption msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "" #: tfrmoptionstoolbar.lblstartpath.caption #, fuzzy #| msgid "Start path:" msgctxt "tfrmoptionstoolbar.lblstartpath.caption" msgid "Start pat&h:" msgstr "&Start pad:" #: tfrmoptionstoolbar.lbltooltip.caption #, fuzzy #| msgid "Tooltip:" msgctxt "tfrmoptionstoolbar.lbltooltip.caption" msgid "&Tooltip:" msgstr "&Tooltip:" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSKEEPTERMINALOPEN.CAPTION" msgid "&Keep terminal window open after executing program" msgstr "" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSRUNINTERMINAL.CAPTION" msgid "&Execute in terminal" msgstr "" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSUSEEXTERNALPROGRAM.CAPTION" msgid "&Use external program" msgstr "" #: tfrmoptionstoolbase.lbltoolsparameters.caption msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPARAMETERS.CAPTION" msgid "A&dditional parameters" msgstr "" #: tfrmoptionstoolbase.lbltoolspath.caption msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPATH.CAPTION" msgid "&Path to program to execute" msgstr "" #: tfrmoptionstooltips.btnaddfields.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "Voeg toe" #: tfrmoptionstooltips.btnapplyfields.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "Toepassen" #: tfrmoptionstooltips.btndeletefields.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "Verwijder" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "" #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "" #: tfrmoptionstooltips.lblfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "" #: tfrmoptionstooltips.lblfieldsmask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "Categorie masker:" #: tfrmoptionstooltips.lblfieldsname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "Categorie naam:" #: tfrmoptionstooltips.rbtooltipallfiles.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "" #: tfrmoptionstooltips.rbtooltipnone.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "" #: tfrmoptionstooltips.rbtooltiponlylarge.caption msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNBACKVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNFONTVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.gbviewerbookmode.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWERBOOKMODE.CAPTION" msgid "Viewer Book Mode" msgstr "" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWEREXAMPLE.CAPTION" msgid "Example" msgstr "Voorbeeld" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption msgctxt "TFRMOPTIONSVIEWER.LBLBACKGROUNDCOLORVIEWERBOOK.CAPTION" msgid "&Background color in book viewer" msgstr "" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption msgctxt "TFRMOPTIONSVIEWER.LBLFONTCOLORVIEWERBOOK.CAPTION" msgid "&Font color in book viewer" msgstr "" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption msgctxt "TFRMOPTIONSVIEWER.LBLNUMBERCOLUMNSVIEWER.CAPTION" msgid "&Number of columns in book viewer" msgstr "" #: tfrmpackdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Afbreken" #: tfrmpackdlg.btnconfig.caption #, fuzzy #| msgid "&Configure" msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "&Configureer" #: tfrmpackdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Help" #: tfrmpackdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmpackdlg.caption msgctxt "TFRMPACKDLG.CAPTION" msgid "Pack files" msgstr "Bestanden inpakken" #: tfrmpackdlg.cbcreateseparatearchives.caption #, fuzzy #| msgid "Create separate archives, o&ne per selected file/dir" msgid "C&reate separate archives, one per selected file/dir" msgstr "Maak aparte archieven, één per geselecteerd bestand/dir" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "Maak zelfuitpakkend archief" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "Versleutel" #: tfrmpackdlg.cbmovetoarchive.caption #, fuzzy #| msgid "M&ove to archive" msgid "Mo&ve to archive" msgstr "Verplaatst naar archief" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "&Meerdere disk archief" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "=>" #: tfrmpackdlg.cbputintarfirst.caption msgid "P&ut in the TAR archive first" msgstr "" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "Ook padnamen toevoegen (alleen recursief)" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "Inpakken bestand(en) naar bestand:" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "Inpakker" #: tfrmpackinfodlg.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Sluit" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "Alles uitpakken en uitvoeren" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "Uitpakken en uitvoeren" #: tfrmpackinfodlg.caption msgctxt "TFRMPACKINFODLG.CAPTION" msgid "Properties of packed file" msgstr "Eigenschappen van ingepakt bestand" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "Attributen:" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "Comprimerings faktor:" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "Datum:" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "Methode:" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "Oorspronkelijke grootte:" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "Bestand:" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "Ingepakte grootte:" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "Inpakker:" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "Tijd:" #: tfrmquicksearch.btncancel.caption msgctxt "tfrmquicksearch.btncancel.caption" msgid "X" msgstr "" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "" #: tfrmquicksearch.tglfilter.caption msgctxt "tfrmquicksearch.tglfilter.caption" msgid "Filter" msgstr "" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CANCELBUTTON.CAPTION" msgid "Cancel" msgstr "Afbreken" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CLOSEBUTTON.CAPTION" msgid "&Close" msgstr "Sluit" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.HELPBUTTON.CAPTION" msgid "&Help" msgstr "&Help" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "tfrmselecttextrange.btppanel.okbutton.caption" msgid "&OK" msgstr "&OK" #: tfrmselecttextrange.lblselecttext.caption msgid "&Select the characters to insert:" msgstr "" #: tfrmsetfileproperties.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Afbreken" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmsetfileproperties.caption msgctxt "TFRMSETFILEPROPERTIES.CAPTION" msgid "Change attributes" msgstr "" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Sticky" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "Gemaakt:" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "" #: tfrmsetfileproperties.chkrecursive.caption msgid "Including subfolders" msgstr "" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Attributen" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Attributen" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "bits:" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Groep" #: tfrmsetfileproperties.lblattrinfo.caption msgid "(gray field means unchanged value)" msgstr "" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Ander" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Eigenaar" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Representatie in tekst:" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Voer uit" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Lees" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Schrijf" #: tfrmsplitter.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Einde" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmsplitter.caption msgctxt "TFRMSPLITTER.CAPTION" msgid "Splitter" msgstr "Splitsen" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664B - 3.5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "Bestandsnaam" #: tfrmsplitter.grbxsize.caption #, fuzzy #| msgid "File size" msgid "Size and number of parts" msgstr "Bestandsgrootte" #: tfrmsplitter.lbdirtarget.caption #, fuzzy #| msgid "Directory target" msgid "Directory &target" msgstr "Map doel" #: tfrmsplitter.lbfilesource.caption #, fuzzy #| msgid "File source" msgid "File &source" msgstr "Bestandsbron" #: tfrmsplitter.lblnumberparts.caption msgid "&Number of parts" msgstr "" #: tfrmsplitter.rbtngigab.caption msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "" #: tfrmsplitter.rbtnkilob.caption msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "" #: tfrmsplitter.rbtnmegab.caption msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "" #: tfrmsymlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Afbreken" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&OK" #: tfrmsymlink.caption #, fuzzy #| msgid "Create symlink" msgid "Create symbolic link" msgstr "Maak symlink" #: tfrmsymlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Bestaand doel (waar zal link naar wijzen)" #: tfrmsymlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Link naam" #: tfrmtweakplugin.btnadd.caption #, fuzzy #| msgid "Add new" msgid "A&dd new" msgstr "Voeg toe nieuw" #: tfrmtweakplugin.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Afbreken" #: tfrmtweakplugin.btnchange.caption #, fuzzy #| msgid "Change" msgid "C&hange" msgstr "Wijzig" #: tfrmtweakplugin.btndefault.caption #, fuzzy #| msgid "Default" msgid "De&fault" msgstr "Standaard" #: tfrmtweakplugin.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "OK" #: tfrmtweakplugin.btnremove.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "Verwijder" #: tfrmtweakplugin.caption msgctxt "TFRMTWEAKPLUGIN.CAPTION" msgid "Tweak plugin" msgstr "Plug-ins aanpassen" #: tfrmtweakplugin.cbpk_caps_by_content.caption #, fuzzy #| msgid "Detect archive type by content" msgid "De&tect archive type by content" msgstr "Detecteer archieftype door inhoud" #: tfrmtweakplugin.cbpk_caps_delete.caption #, fuzzy #| msgid "Can delete files" msgid "Can de&lete files" msgstr "Kan bestanden vewijderen" #: tfrmtweakplugin.cbpk_caps_encrypt.caption #, fuzzy #| msgid "Supports encryption" msgid "Supports e&ncryption" msgstr "Ondersteund versleuteling" #: tfrmtweakplugin.cbpk_caps_hide.caption #, fuzzy #| msgid "Show as normal files (hide packer icon)" msgid "Sho&w as normal files (hide packer icon)" msgstr "Toon als normale bestanden (verberg inpak icoon)" #: tfrmtweakplugin.cbpk_caps_mempack.caption #, fuzzy #| msgid "Supports packing in memory" msgid "Supports pac&king in memory" msgstr "Ondersteund inpakken in geheugen" #: tfrmtweakplugin.cbpk_caps_modify.caption #, fuzzy #| msgid "Can modify exisiting archives" msgid "Can &modify exisiting archives" msgstr "Kan bestaande archieven aanpassen" #: tfrmtweakplugin.cbpk_caps_multiple.caption #, fuzzy #| msgid "Archive can contain multiple files" msgid "&Archive can contain multiple files" msgstr "Archief kan meerder bestanden bevatten" #: tfrmtweakplugin.cbpk_caps_new.caption #, fuzzy #| msgid "Can create new archives" msgid "Can create new archi&ves" msgstr "Kan nieuw archief aanmaken" #: tfrmtweakplugin.cbpk_caps_options.caption #, fuzzy #| msgid "Supports the options dialogbox" msgid "S&upports the options dialogbox" msgstr "Ondersteund de opties dialogbox" #: tfrmtweakplugin.cbpk_caps_searchtext.caption #, fuzzy #| msgid "Allow searching for text in archives" msgid "Allow searchin&g for text in archives" msgstr "Toestaan zoeken tekst in archieven" #: tfrmtweakplugin.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "Omschrijving:" #: tfrmtweakplugin.lbldetectstr.caption #, fuzzy #| msgid "Detect string:" msgid "D&etect string:" msgstr "Detecteer reeks karakters:" #: tfrmtweakplugin.lblextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "Extentie:" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "Vlaggen:" #: tfrmtweakplugin.lblname.caption #, fuzzy #| msgid "Name:" msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "Naam:" #: tfrmtweakplugin.lblplugin.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "Plug-in:" #: tfrmtweakplugin.lblplugin1.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "Plug-in:" #: tfrmviewer.actabout.caption msgctxt "TFRMVIEWER.ACTABOUT.CAPTION" msgid "About Viewer..." msgstr "About Viewer..." #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "" #: tfrmviewer.actcopyfile.caption msgctxt "TFRMVIEWER.ACTCOPYFILE.CAPTION" msgid "Copy File" msgstr "" #: tfrmviewer.actcopyfile.hint msgctxt "TFRMVIEWER.ACTCOPYFILE.HINT" msgid "Copy File" msgstr "" #: tfrmviewer.actdeletefile.caption msgctxt "TFRMVIEWER.ACTDELETEFILE.CAPTION" msgid "Delete File" msgstr "" #: tfrmviewer.actdeletefile.hint msgctxt "TFRMVIEWER.ACTDELETEFILE.HINT" msgid "Delete File" msgstr "" #: tfrmviewer.actloadnextfile.caption msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.CAPTION" msgid "&Next" msgstr "Volgend" #: tfrmviewer.actloadnextfile.hint msgid "Load Next File" msgstr "" #: tfrmviewer.actloadprevfile.caption msgctxt "TFRMVIEWER.ACTLOADPREVFILE.CAPTION" msgid "&Previous" msgstr "Vorig" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "" #: tfrmviewer.actmirror.caption msgctxt "TFRMVIEWER.ACTMIRROR.CAPTION" msgid "Mirror" msgstr "" #: tfrmviewer.actmirror.hint msgctxt "TFRMVIEWER.ACTMIRROR.HINT" msgid "Mirror" msgstr "" #: tfrmviewer.actmovefile.caption msgctxt "TFRMVIEWER.ACTMOVEFILE.CAPTION" msgid "Move File" msgstr "" #: tfrmviewer.actmovefile.hint msgctxt "TFRMVIEWER.ACTMOVEFILE.HINT" msgid "Move File" msgstr "" #: tfrmviewer.actreload.caption msgctxt "TFRMVIEWER.ACTRELOAD.CAPTION" msgid "Reload" msgstr "" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "" #: tfrmviewer.actrotate180.caption msgctxt "TFRMVIEWER.ACTROTATE180.CAPTION" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate180.hint msgctxt "TFRMVIEWER.ACTROTATE180.HINT" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate270.caption msgctxt "TFRMVIEWER.ACTROTATE270.CAPTION" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate270.hint msgctxt "TFRMVIEWER.ACTROTATE270.HINT" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate90.caption msgctxt "TFRMVIEWER.ACTROTATE90.CAPTION" msgid "Rotate 90" msgstr "" #: tfrmviewer.actrotate90.hint msgctxt "TFRMVIEWER.ACTROTATE90.HINT" msgid "Rotate 90" msgstr "" #: tfrmviewer.actsaveas.caption msgctxt "TFRMVIEWER.ACTSAVEAS.CAPTION" msgid "Save As..." msgstr "" #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "" #: tfrmviewer.actstretchimage.caption msgctxt "TFRMVIEWER.ACTSTRETCHIMAGE.CAPTION" msgid "Stretch" msgstr "Passend maken" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "Kopiëer" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "Kopiëer" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "Verwijder" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "Verwijder" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "Verplaats" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "Verplaats" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "Ongedaan maken" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "" #: tfrmviewer.caption msgctxt "tfrmviewer.caption" msgid "Viewer" msgstr "Viewer" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "Bekijken" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "Over" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "Toon als &Binair" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "Kopiëer naar klembord" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Edit" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "Koderen" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "Einde" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "Bestand" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "Afbeeldingen" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "Toon als &Hex" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "Afbeelding" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "PLugins" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "Voorafweergave" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "" #: tfrmviewer.mirotate.caption msgid "Rotate" msgstr "" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "" #: tfrmviewer.misaveas.caption msgctxt "TFRMVIEWER.MISAVEAS.CAPTION" msgid "Save As..." msgstr "" #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "Zoek" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "Selecteer alles" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.mistretch.caption msgctxt "TFRMVIEWER.MISTRETCH.CAPTION" msgid "Stretch" msgstr "Passend maken" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "Toon als &Tekst" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "Bekijk" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "Toon als &Wrap tekst" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "Kopiëer naar klembord" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "Selecteer alles" #: tfrmviewoperations.btnstartpause.caption msgctxt "tfrmviewoperations.btnstartpause.caption" msgid "&Start" msgstr "&Start" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "" #: tfrmviewoperations.caption msgctxt "TFRMVIEWOPERATIONS.CAPTION" msgid "File operations" msgstr "Bestandshandelingen" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "" #: tfrmviewoperations.mnucanceloperation.caption msgctxt "tfrmviewoperations.mnucanceloperation.caption" msgid "Cancel" msgstr "Afbreken" #: tfrmviewoperations.mnucancelqueue.caption msgctxt "tfrmviewoperations.mnucancelqueue.caption" msgid "Cancel" msgstr "Afbreken" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "tfrmviewoperations.mnuoperationshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "" #: tfrmviewoperations.mnuqueue.caption msgctxt "tfrmviewoperations.mnuqueue.caption" msgid "Queue" msgstr "" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "tfrmviewoperations.mnuqueueshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "tmultiarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "twcxarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "" #: ulng.rscolattr msgid "Attr" msgstr "Attr" #: ulng.rscoldate msgid "Date" msgstr "Datum" #: ulng.rscolext msgid "Ext" msgstr "Ext" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "Naam" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "Grootte" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "Aantal wijzigingen:" #: ulng.rsconfcolalign msgid "Align" msgstr "Uitlijnen" #: ulng.rsconfcolcaption msgid "Caption" msgstr "Titel" #: ulng.rsconfcolconfig msgid "Config" msgstr "Config" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "Verwijder" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "Veld inhoud" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "Verplaats" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "breedte" #: ulng.rsconfcustheader msgid "Customize column" msgstr "Kolom aanpassen: " #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "" #: ulng.rsdlgallopcomplete msgid "All operations completed" msgstr "" #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "Alles" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "Toevoegen" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "Afbreken" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "" #: ulng.rsdlgbuttonno msgid "&No" msgstr "&Nee" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "Geen" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "&OK" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "Overschrijven" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "Overschrijven &Alles'" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "Overslaan" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "Alles overslaan" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "&Ja" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "" #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "" #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "Kopieer bestand(en)" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "Verwijder bestand(en)" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "Verplaats bestand(en)" #: ulng.rsdlgoppause msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "" #: ulng.rsdlgopstart msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "&Start" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "" #: ulng.rsdlgspeedtime #, fuzzy #| msgid "Speed %s/s, remaining time %s" msgid "Speed %s/s, time remaining %s" msgstr "Snelheid %s/s, tijd te gaan %s" #: ulng.rsdlgsplit #, fuzzy #| msgid "Split file" msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "Splits bestand" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "" #: ulng.rsdrivenolabel msgid "" msgstr "" #: ulng.rsdrivenomedia msgid "" msgstr "" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Interne Editor van Double Commander." #: ulng.rseditnewfile msgid "new.txt" msgstr "nieuw.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "Bestandsnaam:" #: ulng.rseditnewopen msgid "Open file" msgstr "Open bestand" #: ulng.rseditsearchback msgid "&Backward" msgstr "Achterwaards" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "Zoek" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "Voorwaards" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "Vervang" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "" #: ulng.rsfileopsetpropertyerroroptions msgctxt "ulng.rsfileopsetpropertyerroroptions" msgid "Ask;Don't set anymore;Ignore errors" msgstr "" #: ulng.rsfilterstatus msgid "FILTER" msgstr "" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "%s niveau(s)" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "alles (ongelimiteerde diepte)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "alleen huidige map" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "Map %s bestaat niet!" #: ulng.rsfindfound msgid "Found: %d" msgstr "" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "" #: ulng.rsfindscanned msgid "Scanned: %d" msgstr "Gescand: %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "Vindt bestanden" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "Begin op" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr "Vrij %s van %s bytes" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "" #: ulng.rsfuncatime msgid "Access date/time" msgstr "" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "Attributen" #: ulng.rsfunccomment msgctxt "ulng.rsfunccomment" msgid "Comment" msgstr "" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "" #: ulng.rsfuncext msgid "Extension" msgstr "" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "Groep" #: ulng.rsfunclinkto msgid "Link to" msgstr "" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "Naam" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "Eigenaar" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "Pad" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "Grootte" #: ulng.rsfunctype msgid "Type" msgstr "" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "Fout bij maken hardlink." #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "" #: ulng.rshotkeycategorymain msgid "Main" msgstr "" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "Viewer" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "Linker klaar" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "Deselectie masker" #: ulng.rsmarkplus msgid "Select mask" msgstr "Selectie masker" #: ulng.rsmaskinput msgid "Input mask:" msgstr "Invoer masker:" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "Konfigureer aangepaste kolommen" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "Konfigureer dit aangepaste kolomoverzicht" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "Acties" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "Bewerk" #: ulng.rsmnueject msgid "Eject" msgstr "Uitwerpen" #: ulng.rsmnumount msgid "Mount" msgstr "Mount" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "" #: ulng.rsmnunomedia msgid "No media available" msgstr "" #: ulng.rsmnuopenwith msgid "Open with" msgstr "" #: ulng.rsmnuopenwithother msgid "Other..." msgstr "" #: ulng.rsmnusortby msgid "Sort by" msgstr "" #: ulng.rsmnuumount #, fuzzy #| msgid "Umount" msgid "Unmount" msgstr "Umount" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "Bekijken" #: ulng.rsmsgaccount msgid "Account:" msgstr "" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "Wijzigen dir naar [%s] mislukt!" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "Alle niet actieve tabs verwijderen?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "Kopiëer %d geselecteerde bestanden/mappen?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "Kopiëer geselecteerde \"%s\"?" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "Verwijder %d geselecteerde bestanden/mappen?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "Verwijder geselecteerde \"%s\"?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "Disk is niet voorhanden" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "Geef bestand extentie:" #: ulng.rsmsgentername msgid "Enter name:" msgstr "Geen naam:" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "CRC fout in archief gegevens" #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "Gegevens zijn niet goed" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "" #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "Directory %s bestaat!" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "Functie afgebroken door gebruiker" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "Fout bij sluiten bestand" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "Kan bestand niet aanmaken" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "Geen bestanden meer in archief" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "Kan bestaand bestand niet openen" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "Fout bij lezen van bestand" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "Fout bij schrijven naar bestand" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "Kan directory %s niet aanmaken!" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "Geen bestanden gevonden" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "Niet genoeg geheugen" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "Functie niet ondersteund" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "Buffer te klein" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "Te veel bestanden om in te pakken" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "Archief formaat onbekend" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "Bestand %s gewijzigd, opslaan?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "Bestand %s bestaat, overschrijven?" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "" #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "Map %s bestaat, overshrijven?" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "Volg symlink \"%s\"?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "" #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "" #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "" #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "Kopiëer bestand %s" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "Verwijder bestand %s" #: ulng.rsmsglogerror msgid "Error: " msgstr "Fout: " #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "Pak uit bestand %s" #: ulng.rsmsgloginfo msgid "Info: " msgstr "Info: " #: ulng.rsmsgloglink msgid "Create link %s" msgstr "Maak link %s" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "Maak map %s" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "Verplaats bestand %s" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "Inpakken naar bestand %s" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "Verwokder directory %s" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "Klaar: " #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "Maak symlink %s" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "" #: ulng.rsmsgnewfile msgid "New file" msgstr "Nieuw bestand" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "De volgende schijf zal worden uitgepakt" #: ulng.rsmsgnofiles msgid "No files" msgstr "" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "" #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "Niet genoeg vrije ruimte op doelschijf, Doorgaan?" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "Niet genoeg vrije ruimte op doelschijf, Herhalen?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "Kan bestand niet verwijderen %s" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "" #: ulng.rsmsgpassword msgid "Password:" msgstr "" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "Voeg toe" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "&Configureer" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "&Verwijder %s" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "Verplaats/hernoem %d geselecteerde bestanden/mappen?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "Verplaats/hernoem geselecteerde \"%s\"?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "A.u.b. Double Commander herstarten om wijzigingen door te voeren" #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "Selecteer locatie van volgende schijf" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "Zet volume label" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "" #: ulng.rsmsgurl msgid "URL:" msgstr "" #: ulng.rsmsgusername msgid "User name:" msgstr "" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "Volume label:" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "" #: ulng.rsmulrenfilenamestylelist #, fuzzy #| msgid "No change;UPPERCASE;lowercase;First Char Big;" msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "Geem wijziging:HOOFDLETTERS;kleine letters;Eerste letter Groot" #: ulng.rsoperaborted msgid "Aborted" msgstr "" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "" #: ulng.rsopercombining msgid "Joining" msgstr "" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopying msgid "Copying" msgstr "" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "" #: ulng.rsoperexecuting msgid "Executing" msgstr "" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "" #: ulng.rsoperextracting msgid "Extracting" msgstr "" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperfinished msgid "Finished" msgstr "" #: ulng.rsoperlisting msgid "Listing" msgstr "" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "" #: ulng.rsopermoving msgid "Moving" msgstr "" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "" #: ulng.rsopernotstarted msgid "Not started" msgstr "" #: ulng.rsoperpacking msgid "Packing" msgstr "" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpaused msgid "Paused" msgstr "" #: ulng.rsoperpausing msgid "Pausing" msgstr "" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "" #: ulng.rsoperrunning msgid "Running" msgstr "" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "" #: ulng.rsopersplitting msgid "Splitting" msgstr "" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperstarting msgid "Starting" msgstr "" #: ulng.rsoperstopped msgid "Stopped" msgstr "" #: ulng.rsoperstopping msgid "Stopping" msgstr "" #: ulng.rsopertesting msgid "Testing" msgstr "" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "" #: ulng.rsoperwiping msgid "Wiping" msgstr "" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "" #: ulng.rsoperworking msgid "Working" msgstr "" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "" #: ulng.rsoptarchivevalue msgid "Value" msgstr "" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "Assosiëer plug-in \"%s\" met:" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "" #: ulng.rsoptdisable msgid "Disable" msgstr "De-activeer" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "Activeer" #: ulng.rsoptenterext msgid "Enter extension" msgstr "Geef extentie" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "" #: ulng.rsoptexamplemark msgid "Mark" msgstr "" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "" #: ulng.rsoptexampletext msgid "Text" msgstr "" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "" #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "" #: ulng.rsopthotkeysdeletetrashcanoverrides msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "" #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "" #: ulng.rsopthotkeysshortcutusedtext1 msgid "Shortcut %s is already used." msgstr "" #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "" #: ulng.rsopthotkeysusedby msgid "used for %s in %s" msgstr "" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "Gedrag" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "Kleuren" #: ulng.rsoptionseditorcolumnsview msgctxt "ulng.rsoptionseditorcolumnsview" msgid "Columns" msgstr "Kolommen" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "Konfiguratie" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "" #: ulng.rsoptionseditorfileoperations msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "Bestandshandelingen" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "Bestands panelen" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "Bestandstypes" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "Folder tabs" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "Lettertypes" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "Hot keys" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "Taal" #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "Weergave" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "Log" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "Allerlei" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "PLugins" #: ulng.rsoptionseditorquicksearch #, fuzzy #| msgid "Quick search" msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "Snel zoeken" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "Terminal" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "Tools" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "Linkerknop;Rechterknop" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "Aktief" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "Bestandsnaam" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "Naam" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "Geregisreerd voor" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "" #: ulng.rsopttoolbarbuttontype msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "Bestand" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "Directory" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "Named pipe" #: ulng.rspropsno msgid "No" msgstr "Nee" #: ulng.rspropssocket msgid "Socket" msgstr "Socket" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "Speciaal blok device" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "Speciaal karakter device" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "Symbolische link" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "Onbekend type" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "Ja (%s)" #: ulng.rssearchresult msgid "Search result" msgstr "" #: ulng.rssearchtemplateunnamed msgid "" msgstr "" #: ulng.rsselectdir msgid "Select a directory" msgstr "Selecteer een map" #: ulng.rsshowhelpfor msgid "&Show help for %s" msgstr "" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "Bestanden: %d, Dirs: %d, Grootte: %s (%s, bytes)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "Kan doelmap niet maken!" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "Oncorrect bestandsgrootte formaat!" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "Kan bestand niet opsplitsen!" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "" #: ulng.rssplitseldir msgid "Select directory:" msgstr "Selecteer map:" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "Fout bij maken symlink." #: ulng.rssyndefaulttext msgctxt "ulng.rssyndefaulttext" msgid "Default text" msgstr "" #: ulng.rssynlangplaintext msgctxt "ulng.rssynlangplaintext" msgid "Plain text" msgstr "" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "Dag(en)" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "" #: ulng.rstimeunityear msgid "Year(s)" msgstr "" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "Editor" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "Terminal" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "Viewer" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "" #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "Interne Viewer van Double Commander" #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "" doublecmd-0.5.8/language/doublecmd.es.po0000644000175000017500000066526412250633131017214 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.5 alpha\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-01-17 23:08+0300\n" "PO-Revision-Date: 2012-05-03 \n" "Last-Translator: Patricio Gómez \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Spanish\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "Todo" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "Todo" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "Todo" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "Todo" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "Todo" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "Todo" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "Todo" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "Cancelar" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "" #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr "" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "&Aceptar" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "Configurar vista de columnas a medida" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "Fondo:" #: tfcolumnssetconf.cbcursorborder.caption msgid "Cursor border" msgstr "Borde del cursor" #: tfcolumnssetconf.cbovercolor.caption msgid "Allow Overcolor" msgstr "Permitir sobre exposición" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "Usar fuente y color de usuario" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "Texto:" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "Fuente" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "Tamaño:" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "Fondo 2:" #: tfcolumnssetconf.lblconfigviewnr.caption msgid "Configure view nr:" msgstr "Configurar vista no.:" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "Cursor:" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "Texto de cursor:" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "Selección:" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "Nombre:" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "Añadir columna" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "Ajustar columna:" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "Vista previa" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "Seleccione plantilla..." #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption #, fuzzy #| msgid "Check free space" msgid "C&heck free space" msgstr "Examinar espacio libre" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption #, fuzzy #| msgid "Copy attributes" msgid "Cop&y attributes" msgstr "Copiar atributos" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption #, fuzzy #| msgid "Copy ownership" msgid "Copy o&wnership" msgstr "Copiar propietario" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption #, fuzzy #| msgid "Copy date/time" msgid "Copy d&ate/time" msgstr "Coiar fecha/hora" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption #, fuzzy #| msgid "Correct links" msgid "Correct lin&ks" msgstr "Corregir enlaces" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "Quitar marca de sólo lectura" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption #, fuzzy #| msgid "Exclude empty directories" msgid "E&xclude empty directories" msgstr "Excluir directorios vacios" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption #, fuzzy #| msgid "Follow links" msgid "Fo&llow links" msgstr "Seguir enlaces" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "Que hacer cuando no se puede configurar el tiempo, los atributos, etc." #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "Usar plantilla" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption #, fuzzy #| msgid "When directory exists" msgid "When dir&ectory exists" msgstr "Cuando la carpeta exista" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption #, fuzzy #| msgid "When file exists" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "Cuando el archivo exista" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption #, fuzzy #| msgid "When cannot set property" msgid "When ca&nnot set property" msgstr "Cuando no se configurar apropiadamente" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "" #: tfrmabout.btnclose.caption msgctxt "TFRMABOUT.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Cerrar" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "Copiar al portapapeles" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "Acerca de" #: tfrmabout.lblbuild.caption msgid "Build" msgstr "Hecho" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "Página Web:" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "Lazarus" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "Revisión" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption msgid "Version" msgstr "Versión" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Cancelar" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&Aceptar" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "&Reiniciar" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "Escoger atributos" #: tfrmattributesedit.cbarchive.caption #, fuzzy #| msgid "Archive" msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "Archivo" #: tfrmattributesedit.cbcompressed.caption #, fuzzy #| msgid "Compressed" msgid "Co&mpressed" msgstr "Comprimido" #: tfrmattributesedit.cbdirectory.caption #, fuzzy #| msgid "Directory" msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "Carpeta" #: tfrmattributesedit.cbencrypted.caption #, fuzzy #| msgid "Encrypted" msgid "&Encrypted" msgstr "Encriptado" #: tfrmattributesedit.cbhidden.caption #, fuzzy #| msgid "Hidden" msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "Oculto" #: tfrmattributesedit.cbreadonly.caption #, fuzzy #| msgid "Read only" msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "Sólo lectura" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmattributesedit.cbsparse.caption #, fuzzy #| msgid "Sparse" msgid "S&parse" msgstr "Escaso" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Pegajoso" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmattributesedit.cbsymlink.caption #, fuzzy #| msgid "Symlink" msgid "&Symlink" msgstr "Enlace simbólico" #: tfrmattributesedit.cbsystem.caption #, fuzzy #| msgid "System" msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "Sistema" #: tfrmattributesedit.cbtemporary.caption #, fuzzy #| msgid "Temporary" msgid "&Temporary" msgstr "Temporal" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "Atributos NTFS" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "Atributos generales" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Grupo" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Otros" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Propietario" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "Ejecución" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "Lectura" #: tfrmattributesedit.lbltextattrs.caption #, fuzzy #| msgid "As text:" msgid "As te&xt:" msgstr "Como texto:" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "Escritura" #: tfrmchecksumcalc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancelar" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "&Aceptar" #: tfrmchecksumcalc.caption msgctxt "tfrmchecksumcalc.caption" msgid "Calculate check sum..." msgstr "Calcular suma de comprobación" #: tfrmchecksumcalc.cbseparatefile.caption #, fuzzy #| msgid "Create separate checksum file for each file" msgid "C&reate separate checksum file for each file" msgstr "Crear un archivo por cada comprobación" #: tfrmchecksumcalc.lblsaveto.caption #, fuzzy #| msgid "Save check sum file(s) to:" msgid "&Save check sum file(s) to:" msgstr "Guardar archivo de comprobación en:" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Cerrar" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "Verificar comprobación..." #: tfrmconnectionmanager.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "Añadir" #: tfrmconnectionmanager.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancelar" #: tfrmconnectionmanager.btnconnect.caption #, fuzzy #| msgid "Connect" msgid "C&onnect" msgstr "Conectar" #: tfrmconnectionmanager.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Borrar" #: tfrmconnectionmanager.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Editar" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "Conexión" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "Conectar a:" #: tfrmcopydlg.btnaddtoqueue.caption #, fuzzy #| msgid "Add To Queue" msgid "A&dd To Queue" msgstr "Añadir a la cola" #: tfrmcopydlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancelar" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "tfrmcopydlg.btncreatespecialqueue.caption" msgid "..." msgstr "" #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "O&pciones" #: tfrmcopydlg.btnsaveoptions.caption #, fuzzy #| msgid "Save these options as default" msgid "Sa&ve these options as default" msgstr "Guardar opciones por defecto" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "Copiar archivo(s)" #: tfrmdescredit.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancelar" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&Aceptar" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "Comentario archivo/Carpeta" #: tfrmdescredit.lbleditcommentfor.caption #, fuzzy #| msgid "Edit comment for:" msgid "E&dit comment for:" msgstr "Editar comentario para:" #: tfrmdescredit.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "Codificación:" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "Acerca de" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "Comparación auto." #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "Modo Binario" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "Cancelar" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "Cancelar" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "Copiar bloque derecho" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "Copiar bloque derecho" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "Copiar bloque izquierdo" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "Copiar bloque izquierdo" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Copiar" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Cortar" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Borrar" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Pegar" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Rehacer" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "Seleccionar &Todo" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Deshacer" #: tfrmdiffer.actexit.caption msgctxt "tfrmdiffer.actexit.caption" msgid "E&xit" msgstr "&Salir" #: tfrmdiffer.actfirstdifference.caption msgctxt "tfrmdiffer.actfirstdifference.caption" msgid "First Difference" msgstr "Primera diferencia" #: tfrmdiffer.actfirstdifference.hint msgctxt "tfrmdiffer.actfirstdifference.hint" msgid "First Difference" msgstr "Primera diferencia" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "Ignorar may./min." #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "Ignorar espacios blancos" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "Mantener desplazamiento" #: tfrmdiffer.actlastdifference.caption msgctxt "tfrmdiffer.actlastdifference.caption" msgid "Last Difference" msgstr "Última diferencia" #: tfrmdiffer.actlastdifference.hint msgctxt "tfrmdiffer.actlastdifference.hint" msgid "Last Difference" msgstr "Última diferencia" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "Diferencias de línea" #: tfrmdiffer.actnextdifference.caption msgctxt "tfrmdiffer.actnextdifference.caption" msgid "Next Difference" msgstr "Siguiente diferencia" #: tfrmdiffer.actnextdifference.hint msgctxt "tfrmdiffer.actnextdifference.hint" msgid "Next Difference" msgstr "Siguiente diferencia" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "Abrir izquierda..." #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "Abrir derecha..." #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "Dibujar fondo" #: tfrmdiffer.actprevdifference.caption msgctxt "tfrmdiffer.actprevdifference.caption" msgid "Previous Difference" msgstr "Diferencia previa" #: tfrmdiffer.actprevdifference.hint msgctxt "tfrmdiffer.actprevdifference.hint" msgid "Previous Difference" msgstr "Diferencia previa" #: tfrmdiffer.actreload.caption #, fuzzy #| msgid "Reload" msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "Recargar" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "Recargar" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "Guardar" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "Guardar" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "Guardar como..." #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "Guardar como..." #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "Guardar izquierda" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "Guardar Izquierda" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "Guardar Izquierda como..." #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "Guardar Izquierda como..." #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "Guardar Derecha" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "Guardar Derecha" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "Guardar Derecha como..." #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "Guardar Derecha como..." #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "Comparar" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "Comparar" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "Codificación" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "Codificación" #: tfrmdiffer.caption msgctxt "TFRMDIFFER.CAPTION" msgid "Compare files" msgstr "Comparar archivos" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.miencodingleft.caption #, fuzzy #| msgid "Left" msgid "&Left" msgstr "Izquierda" #: tfrmdiffer.miencodingright.caption #, fuzzy #| msgid "Right" msgid "&Right" msgstr "Derecha" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "&Acciones" #: tfrmdiffer.mnuedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "Editar" #: tfrmdiffer.mnuencoding.caption #, fuzzy #| msgid "Encoding" msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "Codificación" #: tfrmdiffer.mnufile.caption #, fuzzy #| msgid "File" msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "Archivo" #: tfrmdiffer.mnuoptions.caption #, fuzzy #| msgid "Options" msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "&Opciones" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "Añadir un nuevo atajo a la secuencia" #: tfrmedithotkey.btncancel.caption msgctxt "TFRMEDITHOTKEY.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Cancelar" #: tfrmedithotkey.btnok.caption msgctxt "TFRMEDITHOTKEY.BTNOK.CAPTION" msgid "&OK" msgstr "&Aceptar" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "Quitar el último atajo de la secuencia" #: tfrmedithotkey.cghkcontrols.caption msgctxt "tfrmedithotkey.cghkcontrols.caption" msgid "Only for these controls" msgstr "Sólo para estos controles" #: tfrmedithotkey.lblparameters.caption #, fuzzy #| msgid "Parameters (each in a separate line):" msgid "&Parameters (each in a separate line):" msgstr "Parámetros (cada uno en una línea):" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "Atajos:" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "Acerca de" #: tfrmeditor.actabout.hint msgctxt "tfrmeditor.actabout.hint" msgid "About" msgstr "Acerca de" #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "&Configuración" #: tfrmeditor.actconfhigh.hint msgctxt "tfrmeditor.actconfhigh.hint" msgid "Configuration" msgstr "Configuración" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Copiar" #: tfrmeditor.acteditcopy.hint msgctxt "tfrmeditor.acteditcopy.hint" msgid "Copy" msgstr "Copiar" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Cortar" #: tfrmeditor.acteditcut.hint msgctxt "tfrmeditor.acteditcut.hint" msgid "Cut" msgstr "Cortar" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Borrar" #: tfrmeditor.acteditdelete.hint msgctxt "tfrmeditor.acteditdelete.hint" msgid "Delete" msgstr "Borrar" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "&Buscar" #: tfrmeditor.acteditfind.hint msgctxt "tfrmeditor.acteditfind.hint" msgid "Find" msgstr "Buscar" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "Buscar siguiente" #: tfrmeditor.acteditfindnext.hint msgctxt "tfrmeditor.acteditfindnext.hint" msgid "Find next" msgstr "Buscar siguiente" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcr.hint msgctxt "tfrmeditor.acteditlineendcr.hint" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "tfrmeditor.acteditlineendcrlf.hint" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditlineendlf.hint msgctxt "tfrmeditor.acteditlineendlf.hint" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Pegar" #: tfrmeditor.acteditpaste.hint msgctxt "tfrmeditor.acteditpaste.hint" msgid "Paste" msgstr "Pegar" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Rehacer" #: tfrmeditor.acteditredo.hint msgctxt "tfrmeditor.acteditredo.hint" msgid "Redo" msgstr "Rehacer" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "&Reemplazar" #: tfrmeditor.acteditrplc.hint msgctxt "tfrmeditor.acteditrplc.hint" msgid "Replace" msgstr "Reemplazar" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "Seleccionar &Todo" #: tfrmeditor.acteditselectall.hint msgctxt "tfrmeditor.acteditselectall.hint" msgid "Select All" msgstr "Seleccionar todo" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Deshacer" #: tfrmeditor.acteditundo.hint msgctxt "tfrmeditor.acteditundo.hint" msgid "Undo" msgstr "Deshacer" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "Cerrar" #: tfrmeditor.actfileclose.hint msgctxt "tfrmeditor.actfileclose.hint" msgid "Close" msgstr "Cerrar" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "&Salir" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "Salir" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "&Nuevo" #: tfrmeditor.actfilenew.hint msgctxt "tfrmeditor.actfilenew.hint" msgid "New" msgstr "Nuevo" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "&Abrir" #: tfrmeditor.actfileopen.hint msgctxt "tfrmeditor.actfileopen.hint" msgid "Open" msgstr "Abrir" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "&Guardar" #: tfrmeditor.actfilesave.hint msgctxt "tfrmeditor.actfilesave.hint" msgid "Save" msgstr "Guardar" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "Guardar &Como..." #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "Guardar Como" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "G&uardarlo Todo" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "Guardar Todo" #: tfrmeditor.caption msgctxt "tfrmeditor.caption" msgid "Editor" msgstr "Editor" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "A&yuda" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Editar" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "&Codificación" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "Abrir como" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "Guardar como" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "&Archivo" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "Lenguaje de codificación" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "Fin de Línea" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "" #: tfrmeditor.n5.caption msgctxt "TFRMEDITOR.N5.CAPTION" msgid "-" msgstr "" #: tfrmeditsearchreplace.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancelar" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "&Aceptar" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "Sensible a may./min." #: tfrmeditsearchreplace.cbsearchfromcursor.caption #, fuzzy #| msgid "Search from &caret" msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "Buscar desde la posición actual" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "Expresiones ®ulares" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "Sólo seleccionar &texto" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "Sólo palabras completas" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "Opción" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "&Reemplazar con:" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "&Buscar:" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "Dirección" #: tfrmextractdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancelar" #: tfrmextractdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "A&yuda" #: tfrmextractdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "Aceptar" #: tfrmextractdlg.caption msgctxt "TFRMEXTRACTDLG.CAPTION" msgid "Unpack files" msgstr "Descomprimir archivos" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "&Descomprimir carpetas si se almacenaron" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*.*" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "Descomprimir cada archivo en una carpeta &separada" #: tfrmextractdlg.cboverwrite.caption #, fuzzy #| msgid "&Overwrite existing files" msgid "O&verwrite existing files" msgstr "&Sobreescribir archivos existentes" #: tfrmextractdlg.lblextractto.caption #, fuzzy #| msgid "To the directory:" msgid "To the &directory:" msgstr "En la carpeta:" #: tfrmextractdlg.lblfilemask.caption #, fuzzy #| msgid "Extract files matching file mask:" msgid "&Extract files matching file mask:" msgstr "Extraer archivos:" #: tfrmextractdlg.lblpassword.caption #, fuzzy #| msgid "Password for encrypted files:" msgid "&Password for encrypted files:" msgstr "Contraseña:" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "Añadir" #: tfrmfileassoc.btnaddext.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "Añadir" #: tfrmfileassoc.btnaddnewtype.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "Añadir" #: tfrmfileassoc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancelar" #: tfrmfileassoc.btndownact.caption #, fuzzy #| msgid "Down" msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "Abajo" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "&Aceptar" #: tfrmfileassoc.btnremoveact.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "Eliminar" #: tfrmfileassoc.btnremoveext.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "Eliminar" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "" #: tfrmfileassoc.btnremovetype.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "Eliminar" #: tfrmfileassoc.btnrenametype.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "Renombrar" #: tfrmfileassoc.btnupact.caption #, fuzzy #| msgid "Up" msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "Arriba" #: tfrmfileassoc.caption msgid "File associations" msgstr "Asociaciones de archivos" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "Acciones" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "Extensiones" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "Tipos de archivo" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "Icono" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "Acción:" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "&Comando:" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "Editar" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "Abrir en Editor" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "Nombre" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "Ruta del archivo" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "Ruta completa" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "Obtener salida del comando" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "Abrir" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "Ejecutar en terminal" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "Abrir en VFS" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "Ver" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "Abrir en Visor" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Cerrar" #: tfrmfileexecuteyourself.caption msgctxt "TFRMFILEEXECUTEYOURSELF.CAPTION" msgid "Wait..." msgstr "Esperar..." #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "Nombre:" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "De:" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "¡Picar en Cerrar cuando el archivo temporal se pueda borrar!" #: tfrmfileop.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancelar" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "Al &panel" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "&Ver todo" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "Operación en curso:" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "De:" #: tfrmfileop.lblto.caption msgid "To:" msgstr "Para:" #: tfrmfileproperties.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Cerrar" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "" #: tfrmfileproperties.caption msgctxt "TFRMFILEPROPERTIES.CAPTION" msgid "Properties" msgstr "Propiedades" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Pegajoso" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "Propietario" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Grupo" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Otros" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Propietario" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmfileproperties.lblattrtextstr.caption #, fuzzy #| msgid "Representation in text:" msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Texto:" #: tfrmfileproperties.lblcontains.caption msgctxt "tfrmfileproperties.lblcontains.caption" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Ejecutar" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "Nombre" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "Nombre:" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "Nombre" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "Ruta:" #: tfrmfileproperties.lblgroupstr.caption #, fuzzy #| msgid "Group" msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "Grupo" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "Último acceso:" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "Última modificación" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "Último cambio de estado:" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "" #: tfrmfileproperties.lblownerstr.caption #, fuzzy #| msgid "Owner" msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "Propietario" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Lectura" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "Tamaño:" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption #, fuzzy #| msgid "Symlink:" msgid "Symlink to:" msgstr "Enlace simb.:" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption #, fuzzy msgid "Type:" msgstr "Tipo:" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Escritura" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atributos" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "Propiedades" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "&Añadir" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "A&yuda" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Cerrar" #: tfrmfinddlg.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmfinddlg.btnedit.caption" msgid "&Edit" msgstr "Editar" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "&Ir al archivo" #: tfrmfinddlg.btnlastsearch.caption msgctxt "tfrmfinddlg.btnlastsearch.caption" msgid "&Last search" msgstr "Ú<ima búsqueda" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "&Nueva búsqueda" #: tfrmfinddlg.btnsavetemplate.caption #, fuzzy #| msgid "Save" msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "&Guardar" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "&Borrar" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "Cargar" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "Guardar" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption #, fuzzy #| msgid "Save with starting path" msgid "Sa&ve with \"Start in directory\"" msgstr "Guardar con la ruta inicial" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint #, fuzzy #| msgid "If starting path if saved then it will be restored when loading template. Use it if you want to fix searching to a certain directory." msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "Si la ruta inicial se ha guardado será restaurada cuando se cargue la plantilla. Úsela si quiere establecer la búsqueda en un directorio concreto." #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "Comenzar" #: tfrmfinddlg.btnstop.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "Cancelar" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "Usar plantilla" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "&Ver" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "Incluir en la lista" #: tfrmfinddlg.caption msgctxt "tfrmfinddlg.caption" msgid "Find files" msgstr "Buscar archivos" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "Sensible a mays/mins" #: tfrmfinddlg.cbdatefrom.caption #, fuzzy #| msgid "Date From:" msgid "&Date from:" msgstr "Fecha inicial:" #: tfrmfinddlg.cbdateto.caption #, fuzzy #| msgid "Date To:" msgid "Dat&e to:" msgstr "Fecha final:" #: tfrmfinddlg.cbfilesizefrom.caption #, fuzzy #| msgid "Size from:" msgid "S&ize from:" msgstr "Tamaño desde:" #: tfrmfinddlg.cbfilesizeto.caption #, fuzzy #| msgid "Size to:" msgid "Si&ze to:" msgstr "Tamaño hasta:" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "Buscar en archivo" #: tfrmfinddlg.cbfollowsymlinks.caption #, fuzzy #| msgid "Follow symlinks" msgctxt "tfrmfinddlg.cbfollowsymlinks.caption" msgid "Follow s&ymlinks" msgstr "Seguir el enlace simbólico" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "Buscar archivos que NO contengan el texto" #: tfrmfinddlg.cbnotolderthan.caption #, fuzzy #| msgid "Not older than:" msgid "N&ot older than:" msgstr "No más de:" #: tfrmfinddlg.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name " msgid "Searc&h for part of file name" msgstr "Buscar partes del nombre del archivo" #: tfrmfinddlg.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "Expresiones regulares" #: tfrmfinddlg.cbreplacetext.caption #, fuzzy #| msgid "Re&place text" msgid "Re&place by" msgstr "Reemplazar texto" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "" #: tfrmfinddlg.cbtimefrom.caption #, fuzzy #| msgid "Time from:" msgid "&Time from:" msgstr "Hora inicial:" #: tfrmfinddlg.cbtimeto.caption #, fuzzy #| msgid "Time to:" msgid "Ti&me to:" msgstr "Hora final:" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "Usar complemento de búsqueda:" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "Introducir las carpetas que serán excluidas de la búsqueda separadas por \";\"" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "Introducir los archivos que serán excluidos de la búsqueda separados por \";\"" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "Introducir los archivos separdos por \";\"" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption msgctxt "tfrmfinddlg.gbdirectories.caption" msgid "Directories" msgstr "Carpetas" #: tfrmfinddlg.gbfiles.caption msgctxt "tfrmfinddlg.gbfiles.caption" msgid "Files" msgstr "Archivos" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "Buscar datos" #: tfrmfinddlg.lblattributes.caption msgid "Attri&butes" msgstr "" #: tfrmfinddlg.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "Codificación:" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "Excluir subdirectorios" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "Excluir archivos" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "Máscara de archivos" #: tfrmfinddlg.lblfindpathstart.caption #, fuzzy #| msgid "&Start in directory" msgid "Start in &directory" msgstr "Carpeta de archivo" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "Buscar subcarpetas:" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "Búsquedas previas:" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "Eliminar de la lista" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "Mostrar todos los items encontrados" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "Mostrar en Visor" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "Avanzado" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "Cargar/Guardar" #: tfrmfinddlg.tsplugins.caption msgctxt "tfrmfinddlg.tsplugins.caption" msgid "Plugins" msgstr "Complementos" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "Resultados" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "Estándar" #: tfrmfindview.btnclose.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "Cancelar" #: tfrmfindview.btnfind.caption #, fuzzy #| msgid "Find" msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "Buscar" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "Buscar" #: tfrmfindview.cbcasesens.caption #, fuzzy #| msgid "Case sensitive" msgid "C&ase sensitive" msgstr "Sensible mayúsculas/minúsculas" #: tfrmhardlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancelar" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&Aceptar" #: tfrmhardlink.caption #, fuzzy #| msgid "Create hardlink" msgid "Create hard link" msgstr "Crear enlace fuerte" #: tfrmhardlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Ruta donde se enlazará" #: tfrmhardlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Nombre del enlace" #: tfrmhotdir.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "Añadir" #: tfrmhotdir.btnaddman.caption #, fuzzy #| msgid "Add manually" msgid "Add &manually" msgstr "Añadir manualmente" #: tfrmhotdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancelar" #: tfrmhotdir.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Borrar" #: tfrmhotdir.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Editar" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&Aceptar" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "Carpetas frecuentes" #: tfrmlinker.btnexit.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "Salir" #: tfrmlinker.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "Aceptar" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "" #: tfrmlinker.caption msgctxt "TFRMLINKER.CAPTION" msgid "Linker" msgstr "Enlazador" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "Guardar en..." #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "Elemento" #: tfrmlinker.lblfilename.caption #, fuzzy #| msgid "File name" msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "Nombre" #: tfrmlinker.spbtndel.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "Borrar" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "Borrar" #: tfrmlinker.spbtndown.caption #, fuzzy #| msgid "Down" msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "Abajo" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "Abajo" #: tfrmlinker.spbtnup.caption #, fuzzy #| msgid "Up" msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "Arriba" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "Arriba" #: tfrmmain.actabout.caption #, fuzzy #| msgid "About" msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "Acerca de" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "Añadir nombre de archivo a la línea de comandos" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "Añadir ruta y nombre de archivo a la línea de comandos" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "Copiar ruta a línea de comando" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "" #: tfrmmain.actcalculatespace.caption #, fuzzy #| msgid "Calculate &Occupied Space..." msgid "Calculate &Occupied Space" msgstr "Calcular espacio &ocupado" #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "Cambiar de Carpeta" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "Cambiar a la carpeta superior" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "Cambiar a la carpeta raíz" #: tfrmmain.actchecksumcalc.caption msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "Calcular suma de comprobación" #: tfrmmain.actchecksumverify.caption msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "Verificar suma de comprobación" #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "Borrar archivo log" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "Borrar ventana log" #: tfrmmain.actclosealltabs.caption #, fuzzy #| msgid "Remove &All Tabs" msgctxt "tfrmmain.actclosealltabs.caption" msgid "Close &All Tabs" msgstr "Cerrar tod&as las pestañas" #: tfrmmain.actclosetab.caption #, fuzzy #| msgid "&Remove Tab" msgctxt "tfrmmain.actclosetab.caption" msgid "&Close Tab" msgstr "Cerra&r pestaña" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "Comparar por &contenidos" #: tfrmmain.actcomparedirectories.caption msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.CAPTION" msgid "Compare Directories" msgstr "Comparar Carpetas" #: tfrmmain.actcomparedirectories.hint msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.HINT" msgid "Compare Directories" msgstr "Comparar Carpetas" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "Mostrar menú contextual" #: tfrmmain.actcopy.caption #, fuzzy #| msgid "Copy" msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "Copiar" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "Copiar nombre(s) de archivo(s) con la ruta completa" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "Copiar nombre(s) de archivo(s) al portapapeles" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "Copiar archivos sin pedir confirmación" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "Copiar al mismo panel" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "Copiar" #: tfrmmain.actcountdircontent.caption msgid "Sho&w Occupied Space" msgstr "Mostrar espacio ocupado" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "Cortar" #: tfrmmain.actdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMMAIN.ACTDELETE.CAPTION" msgid "Delete" msgstr "Borrar" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "Historia de carpetas" #: tfrmmain.actdirhotlist.caption #, fuzzy #| msgid "Directory &hotlist" msgid "Directory &Hotlist" msgstr "Marcadores" #: tfrmmain.actedit.caption #, fuzzy #| msgid "Edit" msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "Editar" #: tfrmmain.acteditcomment.caption msgid "Edit Co&mment..." msgstr "Editar comentario..." #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "Editar nuevo archivo" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "Editar campo de ruta encima de la lista de archivos" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "Intercambiar paneles" #: tfrmmain.actexit.caption msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "&Salir" #: tfrmmain.actextractfiles.caption #, fuzzy #| msgid "Extract files..." msgid "&Extract Files..." msgstr "&Extraer..." #: tfrmmain.actfileassoc.caption #, fuzzy #| msgid "File &associations..." msgid "File &Associations..." msgstr "Asociaciones de archivos..." #: tfrmmain.actfilelinker.caption #, fuzzy #| msgid "Link files" msgid "Com&bine Files..." msgstr "Com&binar..." #: tfrmmain.actfileproperties.caption #, fuzzy #| msgid "Show file properties" msgid "Show &File Properties" msgstr "Mostrar propiedades" #: tfrmmain.actfilespliter.caption #, fuzzy #| msgid "Split file" msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "Dividir..." #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "Foco en línea de comandos" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "Colocar el cursor sobre el primer archivo" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "Colocar el cursor sobre el último archivo" #: tfrmmain.acthardlink.caption #, fuzzy #| msgid "Create hard link..." msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "Crear enlace &fuerte..." #: tfrmmain.acthelpindex.caption msgid "&Contents" msgstr "Contenidos" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "Paneles en horizontal" #: tfrmmain.actkeyboard.caption msgid "&Keyboard" msgstr "Teclado" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "Izquierda &= Derecha" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "Lista de discos abiertos en la izquierda" #: tfrmmain.actloadselectionfromclip.caption msgid "Load Selection from Clip&board" msgstr "Cargar selección del portapapeles" #: tfrmmain.actloadselectionfromfile.caption msgid "&Load Selection from File..." msgstr "Cargar se&lección desde archivo..." #: tfrmmain.actmakedir.caption #, fuzzy #| msgid "MakeDir" msgid "MakeDir" msgstr "CrearDir" #: tfrmmain.actmarkcurrentextension.caption msgid "Select All with the Same E&xtension" msgstr "Seleccionar con la misma extensión" #: tfrmmain.actmarkinvert.caption #, fuzzy #| msgid "Invert Selections" msgid "&Invert Selection" msgstr "&Invertir selección" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "&Seleccionar todo" #: tfrmmain.actmarkminus.caption #, fuzzy #| msgid "Unselect a group" msgid "Unselect a Gro&up..." msgstr "Deseleccionar gr&upo..." #: tfrmmain.actmarkplus.caption #, fuzzy #| msgid "Select a group" msgid "Select a &Group..." msgstr "Seleccionar &grupo..." #: tfrmmain.actmarkunmarkall.caption #, fuzzy #| msgid "Unselect All" msgid "&Unselect All" msgstr "&Deseleccionar todo" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "Minimizar ventana" #: tfrmmain.actmultirename.caption #, fuzzy #| msgid "Multi Rename Tool" msgid "Multi &Rename Tool" msgstr "&Renombrado múltiple" #: tfrmmain.actnetworkconnect.caption msgid "Network &Connect..." msgstr "&Conectando red..." #: tfrmmain.actnetworkdisconnect.caption msgid "Network &Disconnect" msgstr "&Desconectando red..." #: tfrmmain.actnetworkquickconnect.caption msgid "Network &Quick Connect..." msgstr "Conexión &rápida de red..." #: tfrmmain.actnewtab.caption #, fuzzy #| msgid "&New tab" msgid "&New Tab" msgstr "&Nueva pestaña" #: tfrmmain.actnexttab.caption msgid "Switch to Nex&t Tab" msgstr "Cambiar a la siguien&te pestaña" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "Abrir" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "Intentar abrir archivo" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "Abrir archivo de barra" #: tfrmmain.actopendirinnewtab.caption msgid "Open &Folder in a New Tab" msgstr "Abrir carpeta en nueva pestaña" #: tfrmmain.actopenvirtualfilesystemlist.caption #, fuzzy #| msgid "Open VFS List" msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "Ver unidades de red" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "&Visor de operaciones" #: tfrmmain.actoptions.caption #, fuzzy #| msgid "Options..." msgid "&Options..." msgstr "&Opciones..." #: tfrmmain.actpackfiles.caption #, fuzzy #| msgid "Pack files..." msgid "&Pack Files..." msgstr "Comprimir..." #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "Fijar posición de separación" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "&Pegar" #: tfrmmain.actprevtab.caption msgid "Switch to &Previous Tab" msgstr "Cambiar a la pestaña &previa" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "Filtro rápido" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "Búsqueda rápida" #: tfrmmain.actquickview.caption msgid "&Quick View Panel" msgstr "Panel de vista rápida" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "&Actualizar" #: tfrmmain.actrename.caption #, fuzzy #| msgid "Move" msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "Mover" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "Mover/Eliminar sin confirmación" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "Renombrar" #: tfrmmain.actrenametab.caption #, fuzzy #| msgid "Re&name Tab" msgid "&Rename Tab" msgstr "Re&nombrar pestaña" #: tfrmmain.actrestoreselection.caption msgid "&Restore Selection" msgstr "&Restaurar Selección" #: tfrmmain.actreverseorder.caption #, fuzzy #| msgid "Reverse order" msgid "Re&verse Order" msgstr "Orden in&verso" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "Derecho &= Izquierdo" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "Lista de discos abiertos en la derecha" #: tfrmmain.actrunterm.caption #, fuzzy #| msgid "Run Term" msgid "Run &Terminal" msgstr "Terminal" #: tfrmmain.actsaveselection.caption msgid "Sa&ve Selection" msgstr "Guardar selección" #: tfrmmain.actsaveselectiontofile.caption msgid "Save S&election to File..." msgstr "Guardar sel&ección en archivo..." #: tfrmmain.actsearch.caption #, fuzzy #| msgid "&Search" msgid "&Search..." msgstr "&Buscar" #: tfrmmain.actsetfileproperties.caption msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "Cambiar atributos..." #: tfrmmain.actsettaboptiondirsinnewtab.caption msgid "Locked with Directories Opened in New &Tabs" msgstr "Bloquear carpetass abiertas en pestañas nuevas" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "B&loquear" #: tfrmmain.actsettaboptionpathresets.caption msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "Bloquear con cambios de carpeta permitidos" #: tfrmmain.actshellexecute.caption msgctxt "tfrmmain.actshellexecute.caption" msgid "Open" msgstr "Abrir" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "Abrir usando asociaciones del sistema" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "Mostrar menú de botones" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "Historial de línea de comandos" #: tfrmmain.actshowmainmenu.caption #, fuzzy #| msgid "Menu" msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "Menú" #: tfrmmain.actshowsysfiles.caption #, fuzzy #| msgid "Show hidden/system files" msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "Mostrar ocultos/sistema" #: tfrmmain.actsortbyattr.caption #, fuzzy #| msgid "Sort by attrib" msgid "Sort by &Attributes" msgstr "Ordenar por atributos" #: tfrmmain.actsortbydate.caption #, fuzzy #| msgid "Sort by date" msgid "Sort by &Date" msgstr "Or&denar por fecha" #: tfrmmain.actsortbyext.caption #, fuzzy #| msgid "Sort by extension" msgid "Sort by &Extension" msgstr "Ordenar por extensión" #: tfrmmain.actsortbyname.caption #, fuzzy #| msgid "Sort by name" msgid "Sort by &Name" msgstr "Ordenar por nombre" #: tfrmmain.actsortbysize.caption #, fuzzy #| msgid "Sort by size" msgid "Sort by &Size" msgstr "Ordenar por tamaño" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "Habilitar/deshabilitar ignorar lista para no mostrar nombres de archivo" #: tfrmmain.actsymlink.caption #, fuzzy #| msgid "Create symbolic link..." msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "Crear e&nlace simbólico..." #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "Objetivo &= Origen" #: tfrmmain.acttestarchive.caption msgid "&Test Archive(s)" msgstr "Comprobar archivo(s)" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "Carpeta bajo el cursor en la izquierda" #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "Carpeta bajo el cursor en la derecha" #: tfrmmain.actunmarkcurrentextension.caption msgid "Unselect All with the Same Ex&tension" msgstr "Deseleccionar todo con la misma extensión" #: tfrmmain.actview.caption #, fuzzy #| msgid "View" msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "Ver" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "Mostrar historia de las direcciones visitadas por vista activa" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "Ir a la entrada siguiente" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "Ir a la entrada previa" #: tfrmmain.actvisithomepage.caption msgid "&Visit Double Commander Website" msgstr "Visitar el sitio web de Double Commander" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "Destruir" #: tfrmmain.btnf10.caption #, fuzzy #| msgid "Exit" msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "Salir" #: tfrmmain.btnf8.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMMAIN.BTNF8.CAPTION" msgid "Delete" msgstr "Borrar" #: tfrmmain.btnf9.caption msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint msgid "Directory hotlist" msgstr "Marcadores" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "Mostrar carpeta actual del panel derecho en el izquierdo" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnlefthome.hint msgid "Go to home directory" msgstr "Ir a la carpeta de usuario" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgid "Go to root directory" msgstr "Ir a la carpeta raíz" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgid "Go to parent directory" msgstr "Ir a la carpeta superior" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr "" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "Mostrar la carpeta actual del panel izquierdo en el derecho" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "tfrmmain.caption" msgid "Double Commander" msgstr "Double Commander" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "Ruta" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "Cancelar" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "Copiar..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "Crear enlace" #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline33.caption msgctxt "tfrmmain.miline33.caption" msgid "-" msgstr "" #: tfrmmain.miline37.caption msgctxt "TFRMMAIN.MILINE37.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "Limpiar" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "Copiar" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "Ocultar" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "Seleccionar todo" #: tfrmmain.mimove.caption msgid "Move..." msgstr "Mover..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "Crear enlace simbólico" #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "Opciones de pestaña" #: tfrmmain.mitrayiconexit.caption msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "&Salir" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "Restaurar" #: tfrmmain.mnualloperpause.caption msgctxt "tfrmmain.mnualloperpause.caption" msgid "||" msgstr "" #: tfrmmain.mnualloperstart.caption msgctxt "tfrmmain.mnualloperstart.caption" msgid "Start" msgstr "Comenzar" #: tfrmmain.mnualloperstop.caption msgctxt "tfrmmain.mnualloperstop.caption" msgid "Cancel" msgstr "Cancelar" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "&Comandos" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "C&onfiguración" #: tfrmmain.mnufiles.caption #, fuzzy #| msgid "Files" msgid "&Files" msgstr "&Archivo" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "A&yuda" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "&Seleccionar" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "Red" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "&Ver" #: tfrmmain.mnutaboptions.caption #, fuzzy #| msgid "Options" msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "Opciones" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "&Pestañas" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "Copiar" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "Cortar" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "Borrar" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "Editar" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "Pegar" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "" #: tfrmmaskinputdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancelar" #: tfrmmaskinputdlg.btndefinetemplate.caption #, fuzzy #| msgid "Define..." msgid "&Define..." msgstr "Definir..." #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&Aceptar" #: tfrmmaskinputdlg.lblsearchtemplate.caption #, fuzzy #| msgid "Or select predefined selection type:" msgid "O&r select predefined selection type:" msgstr "O escoja tipo de selección predefinida:" #: tfrmmkdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancelar" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&Aceptar" #: tfrmmkdir.caption msgid "Create new directory" msgstr "Crear nueva carpeta" #: tfrmmkdir.lblmakedir.caption #, fuzzy #| msgid "Input new directory name:" msgid "&Input new directory name:" msgstr "Nombre de la nueva carpeta:" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "" #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "" #: tfrmmodview.caption msgctxt "TFRMMODVIEW.CAPTION" msgid "New Size" msgstr "Nuevo tamaño" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "Alto :" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgctxt "tfrmmodview.lblpath2.caption" msgid "2" msgstr "" #: tfrmmodview.lblpath3.caption msgctxt "tfrmmodview.lblpath3.caption" msgid "3" msgstr "" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "Calidad de compresión jpg" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "Ancho:" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "" #: tfrmmodview.teheight.text msgid "Height" msgstr "Alto" #: tfrmmodview.tequality.text msgid "80" msgstr "" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "Ancho" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Cerrar" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "&Borrar" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "" #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "Cargar" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "" #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "Renombrar" #: tfrmmultirename.btnrestore.caption #, fuzzy #| msgid "Reset all" msgid "Reset &all" msgstr "Restaurar" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "&Guardar" #: tfrmmultirename.caption msgctxt "tfrmmultirename.caption" msgid "MultiRename" msgstr "Renombrado múltiple" #: tfrmmultirename.cblog.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "Registro" #: tfrmmultirename.cbregexp.caption msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "Expresiones regulares" #: tfrmmultirename.cbusesubs.caption msgid "&Use substitution" msgstr "Sustituir" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption #, fuzzy #| msgid "[E]xtension" msgid "[E] Extension" msgstr "[E]xtensión" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "Contador" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "Buscar y Reemplazar" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "Registro de resultado" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "Máscara" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "Configuración" #: tfrmmultirename.lbext.caption #, fuzzy #| msgid "Extension" msgid "&Extension" msgstr "Extensión" #: tfrmmultirename.lbfind.caption #, fuzzy #| msgid "Find..." msgid "&Find..." msgstr "Buscar..." #: tfrmmultirename.lbinterval.caption #, fuzzy #| msgid "Interval" msgid "&Interval" msgstr "Intervalo" #: tfrmmultirename.lbname.caption #, fuzzy #| msgid "File Name" msgid "File &Name" msgstr "Nombre" #: tfrmmultirename.lbreplace.caption #, fuzzy #| msgid "Replace..." msgid "Re&place..." msgstr "Reemplazar..." #: tfrmmultirename.lbstnb.caption #, fuzzy #| msgid "Start Number" msgid "S&tart Number" msgstr "Número inicial" #: tfrmmultirename.lbwidth.caption #, fuzzy #| msgid "Width" msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "Dígitos" #: tfrmmultirename.micounter.caption #, fuzzy #| msgid "[C]ounter" msgid "[C] Counter" msgstr "[C]ontador" #: tfrmmultirename.miday.caption #, fuzzy #| msgid "[D]ay" msgid "[D] Day" msgstr "[D]ía" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "[DD] Día (2 dígitos)" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "[DDD] Día de la semana (corto, ejem., \"lu.\")" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "[DDDD] Día de la semana (largo, ejem., \"lunes\")" #: tfrmmultirename.miextensionx.caption #, fuzzy #| msgid "[Ex]xtension" msgid "[Ex] Character at position x" msgstr "[Ex]xtensión" #: tfrmmultirename.miextensionxx.caption #, fuzzy #| msgid "[Ex:x]xtension" msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:x]xtensión" #: tfrmmultirename.mihour.caption #, fuzzy #| msgid "[h]our" msgid "[h] Hour" msgstr "[H]ora" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "[Ho]ra (2 dígitos)" #: tfrmmultirename.miminute.caption #, fuzzy #| msgid "Mi[n]ute" msgid "[n] Minute" msgstr "[Mi]nuto" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "[Mi]nutos (2 dígitos)" #: tfrmmultirename.mimonth.caption #, fuzzy #| msgid "[M]onth" msgid "[M] Month" msgstr "[Mo]->Mes" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "[Mo]->Mes (2 dígitos)" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "[MMM] Mes (corto, ejem., \"Ene\")" #: tfrmmultirename.mimonth3.caption msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "[MMMM] Mes (largo, ejem., \"Enero\")" #: tfrmmultirename.miname.caption #, fuzzy #| msgid "[N]ame" msgid "[N] Name" msgstr "[N]ombre" #: tfrmmultirename.minamex.caption #, fuzzy #| msgid "[Nx]ame" msgid "[Nx] Character at position x" msgstr "[Nx]ombre" #: tfrmmultirename.minamexx.caption #, fuzzy #| msgid "[Nx:x]ame" msgid "[Nx:y] Characters from position x to y" msgstr "[Nx:x]ombre" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "Hora..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "Extensión..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "Nombre..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "Complemento" #: tfrmmultirename.misecond.caption #, fuzzy #| msgid "[s]econd" msgid "[s] Second" msgstr "[s]egundo" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "[se]gundos (2 dígitos)" #: tfrmmultirename.miyear.caption #, fuzzy #| msgid "[Y] Year" msgid "[Y] Year (2 digits)" msgstr "[Y]->Año (2 dígitos)" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "[YYYY] Año (4 dígitos)" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "tfrmmultirename.stringgrid.columns[0].title.caption" msgid "Old File Name" msgstr "Nombre antiguo" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "tfrmmultirename.stringgrid.columns[1].title.caption" msgid "New File Name" msgstr "Nombre nuevo" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "tfrmmultirename.stringgrid.columns[2].title.caption" msgid "File Path" msgstr "Ruta" #: tfrmopenwith.caption msgid "Choose an application" msgstr "" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "" #: tfrmoptions.btnapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "Aplicar" #: tfrmoptions.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancelar" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "&Aceptar" #: tfrmoptions.caption msgctxt "tfrmoptions.caption" msgid "Options" msgstr "Opciones" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "" #: tfrmoptionsarchivers.btnautoconfig.caption #, fuzzy #| msgid "Auto Configure" msgctxt "TFRMOPTIONSARCHIVERS.BTNAUTOCONFIG.CAPTION" msgid "A&uto Configure" msgstr "Autoconfig." #: tfrmoptionsarchivers.btnmultiarcadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCADD.CAPTION" msgid "A&dd" msgstr "Añadir" #: tfrmoptionsarchivers.btnmultiarcapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCAPPLY.CAPTION" msgid "A&pply" msgstr "Aplicar" #: tfrmoptionsarchivers.btnmultiarcdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCDELETE.CAPTION" msgid "D&elete" msgstr "Borrar" #: tfrmoptionsarchivers.btnmultiarcrename.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCRENAME.CAPTION" msgid "&Rename" msgstr "Renombrar" #: tfrmoptionsarchivers.chkmultiarcdebug.caption #, fuzzy #| msgid "Debug mode" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCDEBUG.CAPTION" msgid "De&bug mode" msgstr "Modo de depuración" #: tfrmoptionsarchivers.chkmultiarcenabled.caption #, fuzzy #| msgid "Enabled" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCENABLED.CAPTION" msgid "E&nabled" msgstr "Habilitar" #: tfrmoptionsarchivers.chkmultiarcoutput.caption #, fuzzy #| msgid "Show console output" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCOUTPUT.CAPTION" msgid "S&how console output" msgstr "Mostrar salida de consola" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "TFRMOPTIONSARCHIVERS.GBARCHIVEROPTIONS.CAPTION" msgid "Options" msgstr "Opciones" #: tfrmoptionsarchivers.lblarchiveadd.caption #, fuzzy #| msgid "Add:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEADD.CAPTION" msgid "Add&ing:" msgstr "Añadir:" #: tfrmoptionsarchivers.lblarchiveextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTENSION.CAPTION" msgid "E&xtension:" msgstr "Extensión:" #: tfrmoptionsarchivers.lblarchiveextract.caption #, fuzzy #| msgid "Extract:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTRACT.CAPTION" msgid "Ex&tract:" msgstr "Extraer:" #: tfrmoptionsarchivers.lblarchivelist.caption #, fuzzy #| msgid "List:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELIST.CAPTION" msgid "&List:" msgstr "Listar:" #: tfrmoptionsarchivers.lblarchivelistend.caption #, fuzzy #| msgid "Listing finish (optional):" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTEND.CAPTION" msgid "Listing &finish (optional):" msgstr "Acabar listado (opcional):" #: tfrmoptionsarchivers.lblarchivelistformat.caption #, fuzzy #| msgid "Listing format:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTFORMAT.CAPTION" msgid "Listing for&mat:" msgstr "Formato de lista:" #: tfrmoptionsarchivers.lblarchiveliststart.caption #, fuzzy #| msgid "Listing start (optional):" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTSTART.CAPTION" msgid "Listin&g start (optional):" msgstr "Comenzar listado (opcional):" #: tfrmoptionsarchivers.lblarchiver.caption #, fuzzy #| msgid "Archiver:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVER.CAPTION" msgid "Arc&hiver:" msgstr "Archivador:" #: tfrmoptionsarchivers.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMOPTIONSARCHIVERS.LBLDESCRIPTION.CAPTION" msgid "De&scription:" msgstr "Descripción:" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERADDITIONAL.CAPTION" msgid "Additional" msgstr "Adicional" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERGENERAL.CAPTION" msgid "General" msgstr "General" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHATTRIBUTESCHANGE.CAPTION" msgid "When &size, date or attributes change" msgstr "Cuando cambia el tamaño, la fecha o los atributos" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHEXCLUDEDIRS.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "Para las rutas siguientes y sus subcarpetas:" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption #, fuzzy #| msgid "When files are &created, deleted or renamed" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHFILENAMECHANGE.CAPTION" msgid "When &files are created, deleted or renamed" msgstr "Cuando se crean archivos, se borran o se renombran" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHONLYFOREGROUND.CAPTION" msgid "When application is in the &background" msgstr "Cuando la aplicación está en segundo plano" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHDISABLE.CAPTION" msgid "Disable auto-refresh" msgstr "Deshabilitar actualización automática" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHENABLE.CAPTION" msgid "Refresh file list" msgstr "Actualizar la lista de archivos" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption #, fuzzy #| msgid "Always show tray icon" msgctxt "TFRMOPTIONSBEHAVIOR.CBALWAYSSHOWTRAYICON.CAPTION" msgid "Al&ways show tray icon" msgstr "Icono siempre en bandeja" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption #, fuzzy #| msgid "Automatically hide unmounted devices" msgid "Automatically &hide unmounted devices" msgstr "Ocultar automáticamente los dispositivos sin montar" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBMINIMIZETOTRAY.CAPTION" msgid "Mo&ve icon to system tray when minimized" msgstr "Al minimizar, icono en bandeja" #: tfrmoptionsbehavior.cbonlyonce.caption #, fuzzy #| msgid "Allow only one copy of DC at a time" msgctxt "TFRMOPTIONSBEHAVIOR.CBONLYONCE.CAPTION" msgid "A&llow only one copy of DC at a time" msgstr "Sólo una copia de Double Commander a la vez" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "Aquí puede introducir uno o más dispositivos o puntos de montage, separados por \";\"." #: tfrmoptionsbehavior.lbldrivesblacklist.caption #, fuzzy #| msgid "Drives blacklist" msgid "Drives &blacklist" msgstr "Discos no permitidos" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption #, fuzzy #| msgid "Cut text to column width" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBCUTTEXTTOCOLWIDTH.CAPTION" msgid "Cut &text to column width" msgstr "Ajustar texto al ancho de columna" #: tfrmoptionscolumnsview.cbgridhorzline.caption #, fuzzy #| msgid "Horizontal lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDHORZLINE.CAPTION" msgid "&Horizontal lines" msgstr "Líneas horizontales" #: tfrmoptionscolumnsview.cbgridvertline.caption #, fuzzy #| msgid "Vertical lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDVERTLINE.CAPTION" msgid "&Vertical lines" msgstr "Líneas verticales" #: tfrmoptionscolumnsview.chkautofillcolumns.caption #, fuzzy #| msgid "Auto fill columns" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CHKAUTOFILLCOLUMNS.CAPTION" msgid "A&uto fill columns" msgstr "Relleno automático de columnas" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "Mostrar rejilla" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "Columnas autoajustables" #: tfrmoptionscolumnsview.lblautosizecolumn.caption #, fuzzy #| msgid "Auto size column:" msgctxt "TFRMOPTIONSCOLUMNSVIEW.LBLAUTOSIZECOLUMN.CAPTION" msgid "Auto si&ze column:" msgstr "Tamaño automático de columna:" #: tfrmoptionsconfiguration.btnconfigapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGAPPLY.CAPTION" msgid "A&pply" msgstr "Aplicar" #: tfrmoptionsconfiguration.btnconfigedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGEDIT.CAPTION" msgid "&Edit" msgstr "Editar" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption #, fuzzy #| msgid "Command line history" msgctxt "TFRMOPTIONSCONFIGURATION.CBCMDLINEHISTORY.CAPTION" msgid "Co&mmand line history" msgstr "Historia de comandos" #: tfrmoptionsconfiguration.cbdirhistory.caption #, fuzzy #| msgid "Directory history" msgctxt "TFRMOPTIONSCONFIGURATION.CBDIRHISTORY.CAPTION" msgid "&Directory history" msgstr "Historia de carpetas" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption #, fuzzy #| msgid "File mask history" msgctxt "TFRMOPTIONSCONFIGURATION.CBFILEMASKHISTORY.CAPTION" msgid "&File mask history" msgstr "Historia de máscaras" #: tfrmoptionsconfiguration.chksaveconfiguration.caption #, fuzzy #| msgid "Save configuration" msgctxt "TFRMOPTIONSCONFIGURATION.CHKSAVECONFIGURATION.CAPTION" msgid "Sa&ve configuration" msgstr "Guardar configuración" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption #, fuzzy #| msgid "Search/Replace history" msgctxt "TFRMOPTIONSCONFIGURATION.CHKSEARCHREPLACEHISTORY.CAPTION" msgid "Searc&h/Replace history" msgstr "Historia de Buscar/Reemplazar" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBLOCCONFIGFILES.CAPTION" msgid "Location of configuration files" msgstr "Situación de los archivos de configuración" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBSAVEONEXIT.CAPTION" msgid "Save on exit" msgstr "Guardar al salir" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgctxt "TFRMOPTIONSCONFIGURATION.LBLCMDLINECONFIGDIR.CAPTION" msgid "Set on command line" msgstr "Fijar sobre linea de comandos" #: tfrmoptionsconfiguration.rbprogramdir.caption #, fuzzy #| msgid "Program directory (portable version)" msgctxt "TFRMOPTIONSCONFIGURATION.RBPROGRAMDIR.CAPTION" msgid "P&rogram directory (portable version)" msgstr "Carpeta del programa (versión portable)" #: tfrmoptionsconfiguration.rbuserhomedir.caption #, fuzzy #| msgid "User home directory" msgctxt "TFRMOPTIONSCONFIGURATION.RBUSERHOMEDIR.CAPTION" msgid "&User home directory" msgstr "Carpeta de usuario" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption #, fuzzy #| msgid "Copy" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNCOPYCOLUMNSSET.CAPTION" msgid "C&opy" msgstr "Copiar" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNDELCOLUMNSSET.CAPTION" msgid "&Delete" msgstr "Borrar" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNEDITCOLUMNSSET.CAPTION" msgid "&Edit" msgstr "Editar" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNNEWCOLUMNSSET.CAPTION" msgid "&New" msgstr "&Nuevo" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.CBBFILESYSTEM.TEXT" msgid "General" msgstr "General" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption #, fuzzy #| msgid "Configure columns for file system:" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.LBLCONFIGCOLUMNS.CAPTION" msgid "Con&figure columns for file system:" msgstr "Configurar columnas para sistema de archivos:" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption #, fuzzy #| msgid "Show confirmation dialog after drop" msgid "&Show confirmation dialog after drop" msgstr "Mostrar diálogo de confirmación después de soltar" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption #, fuzzy #| msgid "Show file system" msgid "Show &file system" msgstr "Mostrar archivos del sistema" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption #, fuzzy #| msgid "Show free space" msgid "Show fr&ee space" msgstr "Mostrar espacio libre" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption #, fuzzy #| msgid "Show label" msgid "Show &label" msgstr "Mostrar etiqueta" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "Lista de Discos" #: tfrmoptionseditorcolors.backgroundlabel.caption #, fuzzy #| msgid "Background" msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "Fondo" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption #, fuzzy #| msgid "Background" msgctxt "tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption" msgid "Bac&kground" msgstr "Fondo" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "Atributos" #: tfrmoptionseditorcolors.foregroundlabel.caption #, fuzzy #| msgid "Foreground" msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "Primer plano" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption #, fuzzy #| msgid "Foreground" msgctxt "tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption" msgid "Fo®round" msgstr "Primer plano" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption #, fuzzy #| msgid "Text-mark" msgid "&Text-mark" msgstr "Marca de Texto" #: tfrmoptionseditorcolors.tbtnglobal.caption #, fuzzy #| msgid "Use (and edit) global scheme settings" msgid "Use (and edit) &global scheme settings" msgstr "Usar (y editar) configuraciones globales" #: tfrmoptionseditorcolors.tbtnlocal.caption #, fuzzy #| msgid "Use local scheme settings" msgid "Use &local scheme settings" msgstr "Usar configuraciones locales" #: tfrmoptionseditorcolors.textboldcheckbox.caption #, fuzzy #| msgid "Bold" msgid "&Bold" msgstr "Negrita" #: tfrmoptionseditorcolors.textboldradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textboldradioinvert.caption" msgid "In&vert" msgstr "Invertir" #: tfrmoptionseditorcolors.textboldradiooff.caption msgctxt "tfrmoptionseditorcolors.textboldradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textboldradioon.caption msgctxt "tfrmoptionseditorcolors.textboldradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textitaliccheckbox.caption #, fuzzy #| msgid "Italic" msgid "&Italic" msgstr "Cursiva" #: tfrmoptionseditorcolors.textitalicradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textitalicradioinvert.caption" msgid "In&vert" msgstr "Invertir" #: tfrmoptionseditorcolors.textitalicradiooff.caption msgctxt "tfrmoptionseditorcolors.textitalicradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textitalicradioon.caption msgctxt "tfrmoptionseditorcolors.textitalicradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption msgid "&Strike Out" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textstrikeoutradioinvert.caption" msgid "In&vert" msgstr "Invertir" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption #, fuzzy #| msgid "Underline" msgid "&Underline" msgstr "Subrayar" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption #, fuzzy #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "Invertir" #: tfrmoptionseditorcolors.textunderlineradiooff.caption msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textunderlineradioon.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "" #: tfrmoptionsfileoperations.cbdeletetotrash.caption #, fuzzy #| msgid "Delete to recycle bin (Shift key reverses this setting)" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDELETETOTRASH.CAPTION" msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "Se tira a la papelera (la tecla mayúscula invierte esta selección)" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDROPREADONLYFLAG.CAPTION" msgid "D&rop readonly flag" msgstr "Quitar marca de sólo lectura" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPARTIALNAMESEARCH.CAPTION" msgid "&Search for part of file name" msgstr "Buscar parte del nombre del archivo" #: tfrmoptionsfileoperations.cbprocesscomments.caption #, fuzzy #| msgid "Process comments with files/folders" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPROCESSCOMMENTS.CAPTION" msgid "&Process comments with files/folders" msgstr "Procesar comentarios con archivos/carpetas" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption #, fuzzy #| msgid "Select file name without extension when renaming" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBRENAMESELONLYNAME.CAPTION" msgid "Select &file name without extension when renaming" msgstr "Seleccionar sólo el nombre del archivo cuando se renombra (no la extensión)" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption #, fuzzy #| msgid "Show tab select panel in copy/move dialog" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSHOWCOPYTABSELECTPANEL.CAPTION" msgid "Sho&w tab select panel in copy/move dialog" msgstr "Mostrar la pestaña del panel seleccionado en el diálogo de copiar/mover" #: tfrmoptionsfileoperations.cbskipfileoperror.caption #, fuzzy #| msgid "Skip file operations errors and write them to log window" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSKIPFILEOPERROR.CAPTION" msgid "S&kip file operations errors and write them to log window" msgstr "Saltar errores de operación con archivos y escribirlos en una ventana de registro" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "Ejecutar operaciones" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.GBFILESEARCH.CAPTION" msgid "File search" msgstr "Búsqueda de archivos" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "Interfaz de Usuario" #: tfrmoptionsfileoperations.lblbuffersize.caption #, fuzzy #| msgid "Buffer size for file operations (in KB):" msgid "&Buffer size for file operations (in KB):" msgstr "Tamaño de memoria para operaciones de archivo (en Kb):" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "" #: tfrmoptionsfileoperations.lblprogresskind.caption #, fuzzy #| msgid "Show operations progress initially in" msgid "Show operations progress &initially in" msgstr "Mostrar progreso de operaciones inicialmente en" #: tfrmoptionsfileoperations.lblwipepassnumber.caption #, fuzzy #| msgid "Number of wipe passes:" msgctxt "TFRMOPTIONSFILEOPERATIONS.LBLWIPEPASSNUMBER.CAPTION" msgid "&Number of wipe passes:" msgstr "Número de pases para destruir:" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption #, fuzzy #| msgid "Use memory mapping for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSEMMAPINSEARCH.CAPTION" msgid "Use memory mapping for search te&xt in files" msgstr "Usar mapeado en memoria para buscar texto en archivos" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption #, fuzzy #| msgid "Use stream for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSESTREAMINSEARCH.CAPTION" msgid "&Use stream for search text in files" msgstr "Usar disco para buscar texto en archivos" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption #, fuzzy #| msgid "Use Frame Cursor" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEFRAMECURSOR.CAPTION" msgid "Use &Frame Cursor" msgstr "Usar cursor enmarcado" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption #, fuzzy #| msgid "Use Gradient Indicator" msgid "Use &Gradient Indicator" msgstr "Usar iindicador de gradiente" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption #, fuzzy #| msgid "Use Inverted Selection" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEINVERTEDSELECTION.CAPTION" msgid "U&se Inverted Selection" msgstr "Usar selección invertida" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.DBFREESPACEINDICATOR.CAPTION" msgid "Drive Free Space Indicator" msgstr "Indicador de espacio libre en Disco" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.GBEXAMPLE.CAPTION" msgid "Example" msgstr "Ejemplo" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption #, fuzzy #| msgid "Background:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR.CAPTION" msgid "Bac&kground:" msgstr "Fondo:" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption #, fuzzy #| msgid "Background 2:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR2.CAPTION" msgid "Backg&round 2:" msgstr "Fondo 2:" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption #, fuzzy #| msgid "Cursor Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORCOLOR.CAPTION" msgid "C&ursor Color:" msgstr "Color de cursor:" #: tfrmoptionsfilepanelscolors.lblcursortext.caption #, fuzzy #| msgid "Cursor Text:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORTEXT.CAPTION" msgid "Cursor Te&xt:" msgstr "Texto de cursor:" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption #, fuzzy #| msgid "Brightness level of inactive panel" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLINACTIVEPANELBRIGHTNESS.CAPTION" msgid "&Brightness level of inactive panel" msgstr "Nivel de brillo del panel inactivo" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption #, fuzzy #| msgid "Indicator Back Color:" msgid "In&dicator Back Color:" msgstr "Indicador color negro:" #: tfrmoptionsfilepanelscolors.lblindcolor.caption #, fuzzy #| msgid "Indicator Fore Color:" msgid "&Indicator Fore Color:" msgstr "Indicador color primer plano:" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption #, fuzzy #| msgid "Mark Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLMARKCOLOR.CAPTION" msgid "&Mark Color:" msgstr "Selección:" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption #, fuzzy #| msgid "Text Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLTEXTCOLOR.CAPTION" msgid "T&ext Color:" msgstr "Texto:" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption #, fuzzy #| msgid "Don't load file list until a tab is activated" msgid "Do&n't load file list until a tab is activated" msgstr "No cagar lista de archivos hasta que la pestaña esté activada" #: tfrmoptionsfilesviews.cbdirbrackets.caption #, fuzzy #| msgid "Show square brackets around directories" msgctxt "TFRMOPTIONSFILESVIEWS.CBDIRBRACKETS.CAPTION" msgid "S&how square brackets around directories" msgstr "Mostrar corchetes cuadrados para las carpetas" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption #, fuzzy #| msgid "Highlight new and updated files" msgid "Hi&ghlight new and updated files" msgstr "Destacar archivos nuevos y actualizados" #: tfrmoptionsfilesviews.cblistfilesinthread.caption #, fuzzy #| msgid "Load file list in separate thread" msgctxt "TFRMOPTIONSFILESVIEWS.CBLISTFILESINTHREAD.CAPTION" msgid "Load &file list in separate thread" msgstr "Cargar lista de archivos en procesos separados" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption #, fuzzy #| msgid "Load icons after file list" msgctxt "TFRMOPTIONSFILESVIEWS.CBLOADICONSSEPARATELY.CAPTION" msgid "Load icons af&ter file list" msgstr "Cargar los iconos después de la lista de archivos" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption #, fuzzy #| msgid "Show system and hidden files" msgctxt "TFRMOPTIONSFILESVIEWS.CBSHOWSYSTEMFILES.CAPTION" msgid "Show s&ystem and hidden files" msgstr "Mostrar ocultos/sistema" #: tfrmoptionsfilesviews.cbspacemovesdown.caption #, fuzzy #| msgid "When selecting files with , move down to next file (as with )" msgctxt "TFRMOPTIONSFILESVIEWS.CBSPACEMOVESDOWN.CAPTION" msgid "&When selecting files with , move down to next file (as with )" msgstr "Cuando se seleccione archivos con la barra espaciadora, pasar al siguiente archivo (como con )" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "Formateando" #: tfrmoptionsfilesviews.gbsorting.caption msgctxt "TFRMOPTIONSFILESVIEWS.GBSORTING.CAPTION" msgid "Sorting" msgstr "Ordenando" #: tfrmoptionsfilesviews.lblcasesensitivity.caption #, fuzzy #| msgid "Case sensitivity:" msgid "Case s&ensitivity:" msgstr "Sensible a may./min.:" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeformat.caption #, fuzzy #| msgid "Date and time format:" msgctxt "TFRMOPTIONSFILESVIEWS.LBLDATETIMEFORMAT.CAPTION" msgid "&Date and time format:" msgstr "Formato:" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "" #: tfrmoptionsfilesviews.lblnewfilesposition.caption #, fuzzy #| msgid "Insert new files" msgid "&Insert new files" msgstr "Insertar nuevos archivos" #: tfrmoptionsfilesviews.lblsortfoldermode.caption #, fuzzy #| msgid "Sorting directories:" msgid "So&rting directories:" msgstr "Ordenar directorios:" #: tfrmoptionsfilesviews.lblsortmethod.caption #, fuzzy #| msgid "Sort &method:" msgctxt "TFRMOPTIONSFILESVIEWS.LBLSORTMETHOD.CAPTION" msgid "&Sort method:" msgstr "Método de ordenamiento:" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption #, fuzzy #| msgid "Move updated files" msgid "&Move updated files" msgstr "Mover archivos actualizados" #: tfrmoptionsfiletypescolors.btnaddcategory.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNADDCATEGORY.CAPTION" msgid "A&dd" msgstr "Añadir" #: tfrmoptionsfiletypescolors.btnapplycategory.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNAPPLYCATEGORY.CAPTION" msgid "A&pply" msgstr "Aplicar" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNCATEGORYCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNDELETECATEGORY.CAPTION" msgid "D&elete" msgstr "Borrar" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Plantilla..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption #, fuzzy #| msgid "File types colors" msgctxt "TFRMOPTIONSFILETYPESCOLORS.GBFILETYPESCOLORS.CAPTION" msgid "File types colors (sort by drag&&drop)" msgstr "Colores para los tipos de archivos" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption #, fuzzy #| msgid "Category attributes:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYATTR.CAPTION" msgid "Category a&ttributes:" msgstr "Atributos:" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption #, fuzzy #| msgid "Category color:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYCOLOR.CAPTION" msgid "Category co&lor:" msgstr "Color:" #: tfrmoptionsfiletypescolors.lblcategorymask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYMASK.CAPTION" msgid "Category &mask:" msgstr "Máscara:" #: tfrmoptionsfiletypescolors.lblcategoryname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYNAME.CAPTION" msgid "Category &name:" msgstr "Categoría:" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELEDITFNT.CAPTION" msgid "..." msgstr "" #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELLOGFNT.CAPTION" msgid "..." msgstr "" #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELMAINFNT.CAPTION" msgid "..." msgstr "" #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWERBOOKFNT.CAPTION" msgid "..." msgstr "" #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWFNT.CAPTION" msgid "..." msgstr "" #: tfrmoptionsfonts.lbleditorfont.caption #, fuzzy #| msgid "Editor font" msgctxt "TFRMOPTIONSFONTS.LBLEDITORFONT.CAPTION" msgid "&Editor font" msgstr "Fuente del editor" #: tfrmoptionsfonts.lbllogfont.caption #, fuzzy #| msgid "Log font" msgctxt "TFRMOPTIONSFONTS.LBLLOGFONT.CAPTION" msgid "&Log font" msgstr "Fuente de registro" #: tfrmoptionsfonts.lblmainfont.caption #, fuzzy #| msgid "Main font" msgctxt "TFRMOPTIONSFONTS.LBLMAINFONT.CAPTION" msgid "Main &font" msgstr "Fuente principal" #: tfrmoptionsfonts.lblviewerbookfont.caption #, fuzzy #| msgid "Viewer Book Font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERBOOKFONT.CAPTION" msgid "Viewer&Book Font" msgstr "Fuente de Vista de Libro" #: tfrmoptionsfonts.lblviewerfont.caption #, fuzzy #| msgid "Viewer font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERFONT.CAPTION" msgid "&Viewer font" msgstr "Fuente del visor" #: tfrmoptionshotkeys.btnaddhotkey.caption #, fuzzy #| msgid "Add hotkey" msgid "Add &hotkey" msgstr "Añadir atajo" #: tfrmoptionshotkeys.btndeletehotkey.caption #, fuzzy #| msgid "Delete hotkey" msgid "&Delete hotkey" msgstr "Borrar atajo" #: tfrmoptionshotkeys.btnedithotkey.caption #, fuzzy #| msgid "Edit hotkey" msgctxt "tfrmoptionshotkeys.btnedithotkey.caption" msgid "&Edit hotkey" msgstr "Editar atajo" #: tfrmoptionshotkeys.lbfilter.caption #, fuzzy #| msgid "Filter" msgctxt "TFRMOPTIONSHOTKEYS.LBFILTER.CAPTION" msgid "&Filter" msgstr "Filtro" #: tfrmoptionshotkeys.lblcategories.caption #, fuzzy #| msgid "Categories:" msgctxt "tfrmoptionshotkeys.lblcategories.caption" msgid "C&ategories:" msgstr "Categorías:" #: tfrmoptionshotkeys.lblcommands.caption #, fuzzy #| msgid "Commands:" msgctxt "tfrmoptionshotkeys.lblcommands.caption" msgid "Co&mmands:" msgstr "Comandos:" #: tfrmoptionshotkeys.lblscfiles.caption #, fuzzy #| msgid "Shortcut files:" msgctxt "TFRMOPTIONSHOTKEYS.LBLSCFILES.CAPTION" msgid "&Shortcut files:" msgstr "Archivos de acción rápida:" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[0].TITLE.CAPTION" msgid "Hotkey" msgstr "Atajos" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[1].TITLE.CAPTION" msgid "Parameters" msgstr "Parámetros" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption msgid "Controls" msgstr "Controles" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "Para las rutas siguientes y sus subcarpetas:" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "tfrmoptionsicons.cbiconsinmenussize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption #, fuzzy #| msgid "Show overlay i&cons, e.g. for links" msgctxt "TFRMOPTIONSICONS.CBICONSSHOWOVERLAY.CAPTION" msgid "Show o&verlay icons, e.g. for links" msgstr "Mostrar iconos superpuestos; por ejemplo, para enlaces" #: tfrmoptionsicons.cbiconssize.text msgctxt "TFRMOPTIONSICONS.CBICONSSIZE.TEXT" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "" #: tfrmoptionsicons.gbiconssize.caption #, fuzzy #| msgid " Icon &size " msgctxt "TFRMOPTIONSICONS.GBICONSSIZE.CAPTION" msgid " Icon size " msgstr "Tamaño de Icono" #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "TFRMOPTIONSICONS.GBSHOWICONSMODE.CAPTION" msgid " Show icons to the left of the filename " msgstr " Mostrar iconos a la izquierda del nombre" #: tfrmoptionsicons.rbiconsshowall.caption #, fuzzy #| msgid "&All" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALL.CAPTION" msgid "A&ll" msgstr "&Todo" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALLANDEXE.CAPTION" msgid "All associated + &EXE/LNK (slow)" msgstr "Todo lo asociado + &EXE/LNK (lento)" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWNONE.CAPTION" msgid "&No icons" msgstr "Sin iconos" #: tfrmoptionsicons.rbiconsshowstandard.caption #, fuzzy #| msgid "&Only standard icons" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWSTANDARD.CAPTION" msgid "Only &standard icons" msgstr "Sólo iconos estándar" #: tfrmoptionsignorelist.btnaddsel.caption #, fuzzy #| msgid "&Add selected names" msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSEL.CAPTION" msgid "A&dd selected names" msgstr "Añadir nombres seleccionados" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSELWITHPATH.CAPTION" msgid "Add selected names with &full path" msgstr "Añadir nombres seleccionados con la ruta completa" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "TFRMOPTIONSIGNORELIST.CHKIGNOREENABLE.CAPTION" msgid "&Ignore (don't show) the following files and folders:" msgstr "&Ignorar (no mostrar) los siguientes archivos y carpetas:" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "TFRMOPTIONSIGNORELIST.LBLSAVEIN.CAPTION" msgid "&Save in:" msgstr "Guardar en:" #: tfrmoptionskeyboard.cblynxlike.caption #, fuzzy #| msgid "Left, Right arrows change directory (Lynx-like movement)" msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "Las flechas izquierda y derecha cambian de carpeta (como en Lynx)" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "Tecleando" #: tfrmoptionskeyboard.lblalt.caption #, fuzzy #| msgid "Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLALT.CAPTION" msgid "Alt+L&etters" msgstr "Al&t+Letras" #: tfrmoptionskeyboard.lblctrlalt.caption #, fuzzy #| msgid "Ctrl+Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLCTRLALT.CAPTION" msgid "Ctrl+Alt+Le&tters" msgstr "&Ctrl+Alt+Letras" #: tfrmoptionskeyboard.lblnomodifier.caption msgctxt "TFRMOPTIONSKEYBOARD.LBLNOMODIFIER.CAPTION" msgid "&Letters" msgstr "" #: tfrmoptionslayout.cbflatdiskpanel.caption #, fuzzy #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATDISKPANEL.CAPTION" msgid "&Flat buttons" msgstr "Botones planos" #: tfrmoptionslayout.cbflatinterface.caption #, fuzzy #| msgid "Flat interface" msgctxt "TFRMOPTIONSLAYOUT.CBFLATINTERFACE.CAPTION" msgid "Flat i&nterface" msgstr "Interfaz plano" #: tfrmoptionslayout.cbflattoolbar.caption #, fuzzy #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATTOOLBAR.CAPTION" msgid "Flat b&uttons" msgstr "Botones planos" #: tfrmoptionslayout.cbfreespaceind.caption #, fuzzy #| msgid "Show free space indicator on drive label" msgctxt "TFRMOPTIONSLAYOUT.CBFREESPACEIND.CAPTION" msgid "Show fr&ee space indicator on drive label" msgstr "Mostrar el espacio libre en la etiqueta del disco" #: tfrmoptionslayout.cblogwindow.caption #, fuzzy #| msgid "Show log window" msgctxt "TFRMOPTIONSLAYOUT.CBLOGWINDOW.CAPTION" msgid "Show lo&g window" msgstr "Ventana de registro" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "TFRMOPTIONSLAYOUT.CBPANELOFOPERATIONS.CAPTION" msgid "Show panel of operation in background" msgstr "Panel de operación en segundo plano" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "TFRMOPTIONSLAYOUT.CBPROGINMENUBAR.CAPTION" msgid "Show common progress in menu bar" msgstr "Progreso en la barra de menú" #: tfrmoptionslayout.cbshowcmdline.caption #, fuzzy #| msgid "Show command &line" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCMDLINE.CAPTION" msgid "Show command l&ine" msgstr "Mostrar &línea de comandos" #: tfrmoptionslayout.cbshowcurdir.caption #, fuzzy #| msgid "Show ¤t directory" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCURDIR.CAPTION" msgid "Show current director&y" msgstr "Mostrar carpeta actual" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDISKPANEL.CAPTION" msgid "Show &drive buttons" msgstr "Mostrar barra de &discos" #: tfrmoptionslayout.cbshowdrivefreespace.caption #, fuzzy #| msgid "Show free space label" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDRIVEFREESPACE.CAPTION" msgid "Show free s&pace label" msgstr "Mostrar la etiqueta de espacio libre" #: tfrmoptionslayout.cbshowdriveslistbutton.caption #, fuzzy #| msgid "Show d&rives list button" msgid "Show drives list bu&tton" msgstr "Mostrar botón de lista de discos" #: tfrmoptionslayout.cbshowkeyspanel.caption #, fuzzy #| msgid "Show &function key buttons" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWKEYSPANEL.CAPTION" msgid "Show function &key buttons" msgstr "Mostrar botones de tecla de &función" #: tfrmoptionslayout.cbshowmainmenu.caption #, fuzzy #| msgid "Show main menu" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINMENU.CAPTION" msgid "Show &main menu" msgstr "Mostrar menú principal" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINTOOLBAR.CAPTION" msgid "Show &button bar" msgstr "Mostrar barra de &botones" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption #, fuzzy #| msgid "Show short free space label" msgid "Show short free space &label" msgstr "Mostrar etiqueta corta de espacio libre" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWSTATUSBAR.CAPTION" msgid "Show &status bar" msgstr "Mostrar barra de e&stado" #: tfrmoptionslayout.cbshowtabheader.caption #, fuzzy #| msgid "Show &tabstop header" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABHEADER.CAPTION" msgid "S&how tabstop header" msgstr "Mostrar saltos de tabulación" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABS.CAPTION" msgid "Sho&w folder tabs" msgstr "Mostrar &pestañas de carpetas" #: tfrmoptionslayout.cbtermwindow.caption #, fuzzy #| msgid "Show terminal window" msgctxt "TFRMOPTIONSLAYOUT.CBTERMWINDOW.CAPTION" msgid "Show te&rminal window" msgstr "Mostrar ventana de terminal" #: tfrmoptionslayout.cbtwodiskpanels.caption #, fuzzy #| msgid "Show two drive button bars (fixed width, above file windows)" msgctxt "TFRMOPTIONSLAYOUT.CBTWODISKPANELS.CAPTION" msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "Barra de &botones de discos (anchura fija, sobre lista de archivos)" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "TFRMOPTIONSLAYOUT.GBSCREENLAYOUT.CAPTION" msgid " Screen layout " msgstr " Apariencia de pantalla" #: tfrmoptionslog.cblogarcop.caption #, fuzzy #| msgid "Pack/Unpack" msgctxt "TFRMOPTIONSLOG.CBLOGARCOP.CAPTION" msgid "&Pack/Unpack" msgstr "Comprimir/Descomprimir" #: tfrmoptionslog.cblogcpmvln.caption #, fuzzy #| msgid "Copy/Move/Create link/symlink" msgctxt "TFRMOPTIONSLOG.CBLOGCPMVLN.CAPTION" msgid "Cop&y/Move/Create link/symlink" msgstr "Copiar/Mover/Crear enlace/enl. simbólico" #: tfrmoptionslog.cblogdelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSLOG.CBLOGDELETE.CAPTION" msgid "&Delete" msgstr "Borrar" #: tfrmoptionslog.cblogdirop.caption #, fuzzy #| msgid "Create/Delete directories" msgctxt "TFRMOPTIONSLOG.CBLOGDIROP.CAPTION" msgid "Crea&te/Delete directories" msgstr "Crear/Borrar capetas" #: tfrmoptionslog.cblogerrors.caption msgctxt "TFRMOPTIONSLOG.CBLOGERRORS.CAPTION" msgid "Log &errors" msgstr "Registrar &errores" #: tfrmoptionslog.cblogfile.caption #, fuzzy #| msgid "&Create a log file:" msgctxt "TFRMOPTIONSLOG.CBLOGFILE.CAPTION" msgid "C&reate a log file:" msgstr "Crear un archivo de registro:" #: tfrmoptionslog.cbloginfo.caption #, fuzzy #| msgid "Log information messages" msgctxt "TFRMOPTIONSLOG.CBLOGINFO.CAPTION" msgid "Log &information messages" msgstr "Registrar mensajes de información" #: tfrmoptionslog.cblogsuccess.caption msgctxt "TFRMOPTIONSLOG.CBLOGSUCCESS.CAPTION" msgid "Log &successful operations" msgstr "Registrar operaciones exito&sas" #: tfrmoptionslog.cblogvfs.caption #, fuzzy #| msgid "File system plugins" msgctxt "TFRMOPTIONSLOG.CBLOGVFS.CAPTION" msgid "&File system plugins" msgstr "Sistema de archivos" #: tfrmoptionslog.gblogfile.caption msgctxt "TFRMOPTIONSLOG.GBLOGFILE.CAPTION" msgid "File operation log file" msgstr "Registro de las operaciones con archivos" #: tfrmoptionslog.gblogfileop.caption #, fuzzy #| msgid "Log operations:" msgctxt "TFRMOPTIONSLOG.GBLOGFILEOP.CAPTION" msgid "Log operations" msgstr "Registrar operaciones:" #: tfrmoptionslog.gblogfilestatus.caption #, fuzzy #| msgid "Operation status:" msgctxt "TFRMOPTIONSLOG.GBLOGFILESTATUS.CAPTION" msgid "Operation status" msgstr "Estado de la operación:" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "" #: tfrmoptionsmisc.chkshowwarningmessages.caption #, fuzzy #| msgid "Show warning messages (\"OK\" button only)" msgctxt "tfrmoptionsmisc.chkshowwarningmessages.caption" msgid "Show &warning messages (\"OK\" button only)" msgstr "Mostrar mensajes de aviso (sólo botón \"Aceptar\")" #: tfrmoptionsmisc.chkthumbsave.caption #, fuzzy #| msgid "Save thumbnails in cache" msgctxt "tfrmoptionsmisc.chkthumbsave.caption" msgid "&Save thumbnails in cache" msgstr "Guardar miniaturas en caché" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "tfrmoptionsmisc.dblthumbnails.caption" msgid "Thumbnails" msgstr "" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "tfrmoptionsmisc.lblthumbseparator.caption" msgid "X" msgstr "" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "" #: tfrmoptionsmouse.cbselectionbymouse.caption #, fuzzy #| msgid "Selection by mouse" msgid "&Selection by mouse" msgstr "Selección por ratón" #: tfrmoptionsmouse.gbscrolling.caption msgid "Scrolling" msgstr "Desplazamiento" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "Selección" #: tfrmoptionsmouse.lblmousemode.caption #, fuzzy #| msgid "Mode:" msgid "&Mode:" msgstr "Modo:" #: tfrmoptionsmouse.rbscrolllinebyline.caption #, fuzzy #| msgid "Line by line" msgid "&Line by line" msgstr "Línea a línea" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption #, fuzzy #| msgid "Line by line with cursor movement" msgid "Line by line &with cursor movement" msgstr "Línea a línea con el movimiento del cursor" #: tfrmoptionsmouse.rbscrollpagebypage.caption #, fuzzy #| msgid "Page by page" msgid "&Page by page" msgstr "Página a página" #: tfrmoptionsplugins.btnaddplugin.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "Añadir" #: tfrmoptionsplugins.btnconfigplugin.caption #, fuzzy #| msgid "Configure" msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "Configurar" #: tfrmoptionsplugins.btnenableplugin.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "Registro" #: tfrmoptionsplugins.btnremoveplugin.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "Eliminar" #: tfrmoptionsplugins.btntweakplugin.caption #, fuzzy #| msgid "Tweak" msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "Ajustar" #: tfrmoptionsplugins.lbldsxdescription.caption #, fuzzy #| msgid "Search plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "Los complementos 'Búsqueda' permiten hacer uso de algoritmos de búsqueda alternativos o herramientas externas (como \"locate\", etc.)" #: tfrmoptionsplugins.lblwcxdescription.caption #, fuzzy #| msgid "Packer plugins are used to work with archives." msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "Los complementos 'Compresores' trabajan sobre archivos." #: tfrmoptionsplugins.lblwdxdescription.caption #, fuzzy #| msgid "Content plugins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "Los complementos 'Contenido' permiten mostrar detalles extendidos del archivo: etiquetas mp3, atributos de imagen (en lista de archivo); o pueden usarse con las herramientas de búsqueda o de renombrado múltiple" #: tfrmoptionsplugins.lblwfxdescription.caption #, fuzzy #| msgid "File system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "Los complementos 'Sistema de archivos' permiten acceder a discos inaccesibles por el sistema operativo o a aparatos externos como Palm/PocketPC." #: tfrmoptionsplugins.lblwlxdescription.caption #, fuzzy #| msgid "Viewer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "Los complementos 'Visionado' (Lister) permiten mostrar fomatos de archivo como imágenes, hojas de datos, bases de datos, etc. en Ver (F3, Ctrl+A)" #: tfrmoptionsplugins.stgplugins.columns[0].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[0].TITLE.CAPTION" msgid "Active" msgstr "Activo" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[1].TITLE.CAPTION" msgid "Plugin" msgstr "Complemento" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[2].TITLE.CAPTION" msgid "Registered for" msgstr "Registrado a nombre de:" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[3].TITLE.CAPTION" msgid "File name" msgstr "Nombre de archivo" #: tfrmoptionsplugins.tsdsx.caption #, fuzzy #| msgid "Search plugins (.DSX)" msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "Búsqueda (.DSX)" #: tfrmoptionsplugins.tswcx.caption #, fuzzy #| msgid "Packer plugins (.WCX)" msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "Compresores (.WCX)" #: tfrmoptionsplugins.tswdx.caption #, fuzzy #| msgid "Content plugins (.WDX)" msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "Contenido(.WDX)" #: tfrmoptionsplugins.tswfx.caption #, fuzzy #| msgid "File system plugins (.WFX)" msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "Sistema de archivos (.WFX)" #: tfrmoptionsplugins.tswlx.caption #, fuzzy #| msgid "Viewer plugins (.WLX)" msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "Visionado (Lister) (.WLX)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTBEGINNING.CAPTION" msgid "&Beginning (name must start with first typed character)" msgstr "&Comienzo (el nombre debe empezar con el primer carácter)" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTENDING.CAPTION" msgid "En&ding (last character before a typed dot . must match)" msgstr "Fi&nal (debe coincidir el último caracter antes de un punto . )" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CGPOPTIONS.CAPTION" msgid "Options" msgstr "Opciones" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption #, fuzzy #| msgid "Exact name match:" msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.GBEXACTNAMEMATCH.CAPTION" msgid "Exact name match" msgstr "Coincidencia exacta de &nombre:" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "Buscar capitalización" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "Buscar por estos ítems" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "TFRMOPTIONSTABS.CBTABSACTIVATEONCLICK.CAPTION" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "Activar &panel cuando se pulsa en una de sus pestañas" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "TFRMOPTIONSTABS.CBTABSALWAYSVISIBLE.CAPTION" msgid "&Show tab header also when there is only one tab" msgstr "&Mostrar pestañas también si hay sólo una" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption #, fuzzy #| msgid "&Confirm close all tabs" msgctxt "TFRMOPTIONSTABS.CBTABSCONFIRMCLOSEALL.CAPTION" msgid "Con&firm close all tabs" msgstr "&Confirmar cerrar todas las pestañas" #: tfrmoptionstabs.cbtabslimitoption.caption #, fuzzy #| msgid "&Limit tab title length to:" msgctxt "TFRMOPTIONSTABS.CBTABSLIMITOPTION.CAPTION" msgid "&Limit tab title length to" msgstr "&Limitar longitud de texto en pestaña a:" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "TFRMOPTIONSTABS.CBTABSLOCKEDASTERISK.CAPTION" msgid "Show locked tabs &with an asterisk *" msgstr "Mostrar las pestañas bloqueadas con un asterisco *" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "TFRMOPTIONSTABS.CBTABSMULTILINES.CAPTION" msgid "&Tabs on multiple lines" msgstr "&Pestañas en varias líneas" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENFOREGROUND.CAPTION" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Ctrl+&Up abre una nueva pestaña en primer plano" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENNEARCURRENT.CAPTION" msgid "Open &new tabs near current tab" msgstr "Abre una &nueva pestaña al lado de la actual" #: tfrmoptionstabs.cbtabsshowclosebutton.caption #, fuzzy #| msgid "Show tab close button" msgctxt "TFRMOPTIONSTABS.CBTABSSHOWCLOSEBUTTON.CAPTION" msgid "Show ta&b close button" msgstr "Mostrar botón de cierre en pestaña" #: tfrmoptionstabs.gbtabs.caption msgctxt "TFRMOPTIONSTABS.GBTABS.CAPTION" msgid "Folder tabs headers" msgstr "Cabeceras de las pestañas de carpeta" #: tfrmoptionstabs.lblchar.caption msgctxt "TFRMOPTIONSTABS.LBLCHAR.CAPTION" msgid "characters" msgstr "caracteres" #: tfrmoptionstabs.lbltabsposition.caption #, fuzzy #| msgid "Tabs position" msgctxt "TFRMOPTIONSTABS.LBLTABSPOSITION.CAPTION" msgid "Ta&bs position" msgstr "Posición de pestañas:" #: tfrmoptionsterminal.lblruninterm.caption #, fuzzy #| msgid "Run in terminal:" msgid "Run in &terminal:" msgstr "Ejecutar en terminal:" #: tfrmoptionsterminal.lblrunterm.caption #, fuzzy #| msgid "Run terminal:" msgid "Run t&erminal:" msgstr "Ejecutar terminal:" #: tfrmoptionstoolbar.btnclonebutton.caption #, fuzzy #| msgid "&Clone button" msgctxt "tfrmoptionstoolbar.btnclonebutton.caption" msgid "C&lone button" msgstr "Botón de clo&nar" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "tfrmoptionstoolbar.btndeletebutton.caption" msgid "&Delete" msgstr "&Borrar" #: tfrmoptionstoolbar.btnedithotkey.caption #, fuzzy #| msgid "Edit hotkey" msgctxt "tfrmoptionstoolbar.btnedithotkey.caption" msgid "Edit hot&key" msgstr "Editar" #: tfrmoptionstoolbar.btninsertbutton.caption #, fuzzy #| msgid "&Insert new buttonX" msgctxt "tfrmoptionstoolbar.btninsertbutton.caption" msgid "&Insert new button" msgstr "&Insertar nuevo botón" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "tfrmoptionstoolbar.btnopenfile.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "tfrmoptionstoolbar.btnopenicon.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnremovehotkey.caption #, fuzzy #| msgid "Remove hotkey" msgctxt "tfrmoptionstoolbar.btnremovehotkey.caption" msgid "Remove hotke&y" msgstr "Quitar atajo" #: tfrmoptionstoolbar.cbflatbuttons.caption #, fuzzy #| msgid "Flat b&uttons" msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "Botones planos" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "Introducir parámetros, cada uno en una línea. Presionar F1 para ver ayuda sobre parámetros." #: tfrmoptionstoolbar.gbgroupbox.caption msgctxt "tfrmoptionstoolbar.gbgroupbox.caption" msgid "Appearance" msgstr "Apariencia" #: tfrmoptionstoolbar.lblbarsize.caption #, fuzzy #| msgid "Ba&r size:" msgctxt "tfrmoptionstoolbar.lblbarsize.caption" msgid "&Bar size:" msgstr "Tamaño de Ba&rra" #: tfrmoptionstoolbar.lblexternalcommand.caption #, fuzzy #| msgid "Command:" msgctxt "tfrmoptionstoolbar.lblexternalcommand.caption" msgid "Comman&d:" msgstr "Comando:" #: tfrmoptionstoolbar.lblexternalparameters.caption #, fuzzy #| msgid "Parameters:" msgctxt "tfrmoptionstoolbar.lblexternalparameters.caption" msgid "Parameter&s:" msgstr "Parámetros:" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "Atajo:" #: tfrmoptionstoolbar.lbliconfile.caption #, fuzzy #| msgid "Icon:" msgctxt "tfrmoptionstoolbar.lbliconfile.caption" msgid "Ico&n:" msgstr "Icono:" #: tfrmoptionstoolbar.lbliconsize.caption #, fuzzy #| msgid "Ic&on size:" msgctxt "tfrmoptionstoolbar.lbliconsize.caption" msgid "Icon si&ze:" msgstr "Tamaño ic&ono" #: tfrmoptionstoolbar.lblinternalcommand.caption #, fuzzy #| msgid "Command:" msgctxt "tfrmoptionstoolbar.lblinternalcommand.caption" msgid "Co&mmand:" msgstr "Comando:" #: tfrmoptionstoolbar.lblinternalparameters.caption #, fuzzy #| msgid "Parameters:" msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "Parámetros:" #: tfrmoptionstoolbar.lblstartpath.caption #, fuzzy #| msgid "Start path:" msgctxt "tfrmoptionstoolbar.lblstartpath.caption" msgid "Start pat&h:" msgstr "&Ruta inicial:" #: tfrmoptionstoolbar.lbltooltip.caption #, fuzzy #| msgid "Tooltip:" msgctxt "tfrmoptionstoolbar.lbltooltip.caption" msgid "&Tooltip:" msgstr "A&yuda" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "Tipo de botón" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption #, fuzzy #| msgid "Keep terminal window open after executing program" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSKEEPTERMINALOPEN.CAPTION" msgid "&Keep terminal window open after executing program" msgstr "Mantener abierta la ventana del terminal después de ejecutar el programa" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption #, fuzzy #| msgid "Execute in terminal" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSRUNINTERMINAL.CAPTION" msgid "&Execute in terminal" msgstr "Ejecutar en terminal" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption #, fuzzy #| msgid "Use external program" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSUSEEXTERNALPROGRAM.CAPTION" msgid "&Use external program" msgstr "Programa externo" #: tfrmoptionstoolbase.lbltoolsparameters.caption #, fuzzy #| msgid "Additional parameters" msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPARAMETERS.CAPTION" msgid "A&dditional parameters" msgstr "Parámetros adicionales" #: tfrmoptionstoolbase.lbltoolspath.caption #, fuzzy #| msgid "Path to program to execute" msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPATH.CAPTION" msgid "&Path to program to execute" msgstr "Ruta del programa a ejecutar" #: tfrmoptionstooltips.btnaddfields.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "Añadir" #: tfrmoptionstooltips.btnapplyfields.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "Aplicar" #: tfrmoptionstooltips.btndeletefields.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "Borrar" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Plantilla..." #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "Campos de usuario por tipo de archivo" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "Mostrar información emergente" #: tfrmoptionstooltips.lblfieldslist.caption #, fuzzy #| msgid "Category hint:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "Info. mostrada:" #: tfrmoptionstooltips.lblfieldsmask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "Máscara:" #: tfrmoptionstooltips.lblfieldsname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "Categoría:" #: tfrmoptionstooltips.rbtooltipallfiles.caption #, fuzzy #| msgid "Show tool tip for all files in file panel" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "Mostrar información emergente para todos los archivos del panel" #: tfrmoptionstooltips.rbtooltipnone.caption #, fuzzy #| msgid "Don't show" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "No mostrar" #: tfrmoptionstooltips.rbtooltiponlylarge.caption #, fuzzy #| msgid "Show tool tip for files in file panel if truncated" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "Si el panel se corta, mostrar información emergente" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNBACKVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNFONTVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.gbviewerbookmode.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWERBOOKMODE.CAPTION" msgid "Viewer Book Mode" msgstr "Ver en modo libro" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWEREXAMPLE.CAPTION" msgid "Example" msgstr "Ejemplo" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption #, fuzzy #| msgid "Background color in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLBACKGROUNDCOLORVIEWERBOOK.CAPTION" msgid "&Background color in book viewer" msgstr "Color de segundo plano en vista de libro" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption #, fuzzy #| msgid "Font color in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLFONTCOLORVIEWERBOOK.CAPTION" msgid "&Font color in book viewer" msgstr "Color de fuente en vista de libro" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption #, fuzzy #| msgid "Number of columns in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLNUMBERCOLUMNSVIEWER.CAPTION" msgid "&Number of columns in book viewer" msgstr "Número de columnas en vista de libro" #: tfrmpackdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancelar" #: tfrmpackdlg.btnconfig.caption #, fuzzy #| msgid "&Configure" msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "&Configurar" #: tfrmpackdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Ayuda" #: tfrmpackdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "Aceptar" #: tfrmpackdlg.caption msgctxt "TFRMPACKDLG.CAPTION" msgid "Pack files" msgstr "Comprimir" #: tfrmpackdlg.cbcreateseparatearchives.caption #, fuzzy #| msgid "Create separate archives, o&ne per selected file/dir" msgid "C&reate separate archives, one per selected file/dir" msgstr "Crear archivos separados, u&no por archivo/carpeta" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "Crear archivo autoe&xtraible" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "Encr&iptar" #: tfrmpackdlg.cbmovetoarchive.caption #, fuzzy #| msgid "M&ove to archive" msgid "Mo&ve to archive" msgstr "Mover &original(es) a archivo comprimido" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "Archivo de disco &múltiple" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "=>" #: tfrmpackdlg.cbputintarfirst.caption #, fuzzy #| msgid "Put in the TAR archive first" msgid "P&ut in the TAR archive first" msgstr "Pre-comprimir en TAR primero" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "Incluir nombres de car&petas (sólo recursivo)" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "Comprimir en el archivo:" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "Compresor" #: tfrmpackinfodlg.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Cerrar" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "Descomprimir todo y ejecutar" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "Descomprimir y ejecutar" #: tfrmpackinfodlg.caption msgctxt "TFRMPACKINFODLG.CAPTION" msgid "Properties of packed file" msgstr "Propiedades del archivo comprimido" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "Atributos:" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "Ratio de compresión:" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "Fecha:" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "Método:" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "Tamaño orginal:" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "Archivo:" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "Tamaño comprimido:" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "Compresor:" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "Tiempo:" #: tfrmquicksearch.btncancel.caption msgctxt "tfrmquicksearch.btncancel.caption" msgid "X" msgstr "" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "Cerrar panel de filtro" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "Introducir texto o filtro para buscar" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "Sensible a capitalización" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "Carpetas" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "Archivos" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "Comenzando coincidencia" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "Finalizando coincidencia" #: tfrmquicksearch.tglfilter.caption msgctxt "tfrmquicksearch.tglfilter.caption" msgid "Filter" msgstr "Filtro" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "Conmutar entre búsqueda o filtro" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CANCELBUTTON.CAPTION" msgid "Cancel" msgstr "Cancelar" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CLOSEBUTTON.CAPTION" msgid "&Close" msgstr "&Cerrar" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.HELPBUTTON.CAPTION" msgid "&Help" msgstr "A&yuda" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "tfrmselecttextrange.btppanel.okbutton.caption" msgid "&OK" msgstr "&Aceptar" #: tfrmselecttextrange.lblselecttext.caption #, fuzzy #| msgid "Select the characters to insert:" msgid "&Select the characters to insert:" msgstr "Seleccionar caracteres a insertar:" #: tfrmsetfileproperties.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancelar" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "&Aceptar" #: tfrmsetfileproperties.caption msgctxt "TFRMSETFILEPROPERTIES.CAPTION" msgid "Change attributes" msgstr "Cambiar atributos" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Pegajoso" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "Archivo" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "Creado:" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "Oculto" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "Accedido:" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "Modificado:" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "Sólo lectura" #: tfrmsetfileproperties.chkrecursive.caption msgid "Including subfolders" msgstr "Incluyendo subcarpetas" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "Sistema" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "Propiedades de la fecha" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atributos" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Atributos" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bits:" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Grupo" #: tfrmsetfileproperties.lblattrinfo.caption msgid "(gray field means unchanged value)" msgstr "(campo gris significa valor sin cambio)" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Otros" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Propietario" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Texto:" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Ejecución" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Lectura" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Escritura" #: tfrmsplitter.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Salir" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "Aceptar" #: tfrmsplitter.caption msgctxt "TFRMSPLITTER.CAPTION" msgid "Splitter" msgstr "Divisor" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664B - 3.5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "Nombre de archivo" #: tfrmsplitter.grbxsize.caption #, fuzzy #| msgid "File size" msgid "Size and number of parts" msgstr "Tamaño" #: tfrmsplitter.lbdirtarget.caption #, fuzzy #| msgid "Directory target" msgid "Directory &target" msgstr "Ruta de destino" #: tfrmsplitter.lbfilesource.caption #, fuzzy #| msgid "File source" msgid "File &source" msgstr "Archivo fuente" #: tfrmsplitter.lblnumberparts.caption #, fuzzy #| msgid "Number of parts" msgid "&Number of parts" msgstr "Número de partes" #: tfrmsplitter.rbtngigab.caption msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "" #: tfrmsplitter.rbtnkilob.caption msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "" #: tfrmsplitter.rbtnmegab.caption msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "" #: tfrmsymlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancelar" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&Aceptar" #: tfrmsymlink.caption #, fuzzy #| msgid "Create symlink" msgid "Create symbolic link" msgstr "Crear enlace simbólico" #: tfrmsymlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Destino (donde se enlazará)" #: tfrmsymlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Nombre del enlace" #: tfrmtweakplugin.btnadd.caption #, fuzzy #| msgid "Add new" msgid "A&dd new" msgstr "Añadir nuevo" #: tfrmtweakplugin.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "Cancelar" #: tfrmtweakplugin.btnchange.caption #, fuzzy #| msgid "Change" msgid "C&hange" msgstr "Cambiar" #: tfrmtweakplugin.btndefault.caption #, fuzzy #| msgid "Default" msgid "De&fault" msgstr "Defecto" #: tfrmtweakplugin.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "Aceptar" #: tfrmtweakplugin.btnremove.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "Eliminar" #: tfrmtweakplugin.caption msgctxt "TFRMTWEAKPLUGIN.CAPTION" msgid "Tweak plugin" msgstr "Ajustar complemento" #: tfrmtweakplugin.cbpk_caps_by_content.caption #, fuzzy #| msgid "Detect archive type by content" msgid "De&tect archive type by content" msgstr "Detectar tipo de archivo por contenido" #: tfrmtweakplugin.cbpk_caps_delete.caption #, fuzzy #| msgid "Can delete files" msgid "Can de&lete files" msgstr "Puede borrar archivos" #: tfrmtweakplugin.cbpk_caps_encrypt.caption #, fuzzy #| msgid "Supports encryption" msgid "Supports e&ncryption" msgstr "Soporta encriptado" #: tfrmtweakplugin.cbpk_caps_hide.caption #, fuzzy #| msgid "Show as normal files (hide packer icon)" msgid "Sho&w as normal files (hide packer icon)" msgstr "Mostrar como archivos normales (ocultar icono comprimido)" #: tfrmtweakplugin.cbpk_caps_mempack.caption #, fuzzy #| msgid "Supports packing in memory" msgid "Supports pac&king in memory" msgstr "Soporta compresión en memoria" #: tfrmtweakplugin.cbpk_caps_modify.caption #, fuzzy #| msgid "Can modify exisiting archives" msgid "Can &modify exisiting archives" msgstr "Puede modificar los archivos existentes" #: tfrmtweakplugin.cbpk_caps_multiple.caption #, fuzzy #| msgid "Archive can contain multiple files" msgid "&Archive can contain multiple files" msgstr "El archivo puede contener multiples archivos" #: tfrmtweakplugin.cbpk_caps_new.caption #, fuzzy #| msgid "Can create new archives" msgid "Can create new archi&ves" msgstr "Puede crear nuevos archivos" #: tfrmtweakplugin.cbpk_caps_options.caption #, fuzzy #| msgid "Supports the options dialogbox" msgid "S&upports the options dialogbox" msgstr "Soporta la ventana de diálogo con opciones" #: tfrmtweakplugin.cbpk_caps_searchtext.caption #, fuzzy #| msgid "Allow searching for text in archives" msgid "Allow searchin&g for text in archives" msgstr "Permitir buscar texto en archivos" #: tfrmtweakplugin.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "Descripción:" #: tfrmtweakplugin.lbldetectstr.caption #, fuzzy #| msgid "Detect string:" msgid "D&etect string:" msgstr "Detectar cadena:" #: tfrmtweakplugin.lblextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "Extensión:" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "Opciones:" #: tfrmtweakplugin.lblname.caption #, fuzzy #| msgid "Name:" msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "Nombre:" #: tfrmtweakplugin.lblplugin.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "Complemento:" #: tfrmtweakplugin.lblplugin1.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "Complemento:" #: tfrmviewer.actabout.caption msgctxt "TFRMVIEWER.ACTABOUT.CAPTION" msgid "About Viewer..." msgstr "Acerca del Visor..." #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "" #: tfrmviewer.actcopyfile.caption msgctxt "TFRMVIEWER.ACTCOPYFILE.CAPTION" msgid "Copy File" msgstr "" #: tfrmviewer.actcopyfile.hint msgctxt "TFRMVIEWER.ACTCOPYFILE.HINT" msgid "Copy File" msgstr "" #: tfrmviewer.actdeletefile.caption msgctxt "TFRMVIEWER.ACTDELETEFILE.CAPTION" msgid "Delete File" msgstr "" #: tfrmviewer.actdeletefile.hint msgctxt "TFRMVIEWER.ACTDELETEFILE.HINT" msgid "Delete File" msgstr "" #: tfrmviewer.actloadnextfile.caption msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.CAPTION" msgid "&Next" msgstr "&Siguiente" #: tfrmviewer.actloadnextfile.hint msgid "Load Next File" msgstr "" #: tfrmviewer.actloadprevfile.caption msgctxt "TFRMVIEWER.ACTLOADPREVFILE.CAPTION" msgid "&Previous" msgstr "&Anterior" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "" #: tfrmviewer.actmirror.caption msgctxt "TFRMVIEWER.ACTMIRROR.CAPTION" msgid "Mirror" msgstr "Espejo" #: tfrmviewer.actmirror.hint msgctxt "TFRMVIEWER.ACTMIRROR.HINT" msgid "Mirror" msgstr "Espejo" #: tfrmviewer.actmovefile.caption msgctxt "TFRMVIEWER.ACTMOVEFILE.CAPTION" msgid "Move File" msgstr "" #: tfrmviewer.actmovefile.hint msgctxt "TFRMVIEWER.ACTMOVEFILE.HINT" msgid "Move File" msgstr "" #: tfrmviewer.actreload.caption msgctxt "TFRMVIEWER.ACTRELOAD.CAPTION" msgid "Reload" msgstr "Recargar" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "" #: tfrmviewer.actrotate180.caption msgctxt "TFRMVIEWER.ACTROTATE180.CAPTION" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate180.hint msgctxt "TFRMVIEWER.ACTROTATE180.HINT" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate270.caption msgctxt "TFRMVIEWER.ACTROTATE270.CAPTION" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate270.hint msgctxt "TFRMVIEWER.ACTROTATE270.HINT" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate90.caption msgctxt "TFRMVIEWER.ACTROTATE90.CAPTION" msgid "Rotate 90" msgstr "" #: tfrmviewer.actrotate90.hint msgctxt "TFRMVIEWER.ACTROTATE90.HINT" msgid "Rotate 90" msgstr "" #: tfrmviewer.actsaveas.caption msgctxt "TFRMVIEWER.ACTSAVEAS.CAPTION" msgid "Save As..." msgstr "Guardar como..." #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "" #: tfrmviewer.actstretchimage.caption msgctxt "TFRMVIEWER.ACTSTRETCHIMAGE.CAPTION" msgid "Stretch" msgstr "Estrechar" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "Copiar" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "Copiar" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "Borrar" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "Borrar" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "Pantalla completa" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "Espejo" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "Mover" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "Mover" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "Dibujar" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "Ojos Rojos" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "Redimensionar" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "Deshacer" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "Acercar" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "Alejar" #: tfrmviewer.caption msgctxt "tfrmviewer.caption" msgid "Viewer" msgstr "Visor" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Diapositivas" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "Lápiz" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "Destacar" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "Pintar" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Diapositivas" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "Ver" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "Acerca de" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "Mostrar como &Binario" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "Copiar al portapapeles" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Editar" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "Codificar" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "&Salir" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "&Archivo" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "Pantalla Completa" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "Gráficos" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "Mostrar como &Hex" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "&Imagen" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "Mostrar como Libro" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "Espejo" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "Complementos" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "Vista previa" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "Imprimir..." #: tfrmviewer.mirotate.caption msgid "Rotate" msgstr "Rotar" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "Guardar" #: tfrmviewer.misaveas.caption msgctxt "TFRMVIEWER.MISAVEAS.CAPTION" msgid "Save As..." msgstr "Guardar como..." #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "Captura" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "Buscar" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "Buscar siguiente" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "Buscar previo" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "Seleccionar todo" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "" #: tfrmviewer.mistretch.caption msgctxt "TFRMVIEWER.MISTRETCH.CAPTION" msgid "Stretch" msgstr "Estrechar" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "Mostrar como &Texto" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "&Ver" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "Ajustar líneas" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "Acercar" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "Alejar" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "Copiar al portapapeles" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "Seleccionar todo" #: tfrmviewoperations.btnstartpause.caption #, fuzzy #| msgid "Start" msgctxt "tfrmviewoperations.btnstartpause.caption" msgid "&Start" msgstr "Comenzar" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "" #: tfrmviewoperations.caption msgctxt "TFRMVIEWOPERATIONS.CAPTION" msgid "File operations" msgstr "Operaciones con archivos" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "" #: tfrmviewoperations.mnucanceloperation.caption msgctxt "tfrmviewoperations.mnucanceloperation.caption" msgid "Cancel" msgstr "Cancelar" #: tfrmviewoperations.mnucancelqueue.caption msgctxt "tfrmviewoperations.mnucancelqueue.caption" msgid "Cancel" msgstr "Cancelar" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "tfrmviewoperations.mnuoperationshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "" #: tfrmviewoperations.mnuqueue.caption msgctxt "tfrmviewoperations.mnuqueue.caption" msgid "Queue" msgstr "" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "tfrmviewoperations.mnuqueueshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "tmultiarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "cuando el archivo exista" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "twcxarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "cuando el archivo exista" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Cuando el archivo exista" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "" #: ulng.rscolattr msgid "Attr" msgstr "Atributos" #: ulng.rscoldate msgid "Date" msgstr "Fecha" #: ulng.rscolext msgid "Ext" msgstr "Ext" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "Nombre" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "Tamaño" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "Número de cambios" #: ulng.rsconfcolalign msgid "Align" msgstr "Alinear" #: ulng.rsconfcolcaption msgid "Caption" msgstr "Texto" #: ulng.rsconfcolconfig msgid "Config" msgstr "Config." #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "Borrar" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "Contenidos de campos" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "Mover" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "Anchura" #: ulng.rsconfcustheader msgid "Customize column" msgstr "Columna personalizada" #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "Copiar (%d) %s" #: ulng.rsdlgallopcomplete #, fuzzy #| msgid "All operations is complete" msgid "All operations completed" msgstr "Se han completado todas las operaciones" #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "Progreso de todas las operaciones %d %%" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "Ab&ortar" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "Todos" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "&Añadir" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "&Cancelar" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "Copiar en" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "" #: ulng.rsdlgbuttonno msgid "&No" msgstr "&No" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "&Ninguno" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "&Aceptar" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "Sobreescribir" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "Sobreescribir &Todo" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "Reintentar" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "&Saltar" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "Saltar todos" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "&Sí" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "Calcuar archivos y carpetas" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "Calcular suma de comprobación" #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "Verificar suma de comprobación" #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "Copiar archivo(s)" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "Borrar archivo(s)" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "Mover archivo(s)" #: ulng.rsdlgoppause #, fuzzy #| msgid "Pause" msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "Pausa" #: ulng.rsdlgopstart #, fuzzy #| msgid "Start" msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "Comenzar" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "Vel.: %s/s" #: ulng.rsdlgspeedtime #, fuzzy #| msgid "Speed %s/s, time remaining s%" msgid "Speed %s/s, time remaining %s" msgstr "Vel.: %s/s, queda: s%" #: ulng.rsdlgsplit #, fuzzy #| msgid "Split file" msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "Partir archivo" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "Destruir archivo(s)" #: ulng.rsdrivenolabel msgid "" msgstr "" #: ulng.rsdrivenomedia msgid "" msgstr "" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Editor interno de Double Commander." #: ulng.rseditnewfile msgid "new.txt" msgstr "nuevo.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "Nombre de archivo:" #: ulng.rseditnewopen msgid "Open file" msgstr "Abrir archivo" #: ulng.rseditsearchback msgid "&Backward" msgstr "Hacia atrás" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "Búsqueda" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "Hacia adelante" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "Reemplazar" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "" #: ulng.rsfileopsetpropertyerroroptions msgctxt "ulng.rsfileopsetpropertyerroroptions" msgid "Ask;Don't set anymore;Ignore errors" msgstr "" #: ulng.rsfilterstatus msgid "FILTER" msgstr "" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "Definir plantilla" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "%s nivel(es)" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "todo (profundidad sin límites)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "sólo carpeta actual" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "¡La carpeta %s no existe!" #: ulng.rsfindfound msgid "Found: %d" msgstr "Hallado: %d" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "Guardar platilla de búsqueda" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "Nombre de plantilla:" #: ulng.rsfindscanned msgid "Scanned: %d" msgstr "Buscados: %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "Buscando" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "Buscar archivos" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "Comenzar en" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr " %s de %s bytes libres" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "%s bytes libres" #: ulng.rsfuncatime msgid "Access date/time" msgstr "Fecha/tiempo de acceso" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "Atributos" #: ulng.rsfunccomment msgctxt "ulng.rsfunccomment" msgid "Comment" msgstr "Comentario" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "Fecha de creación" #: ulng.rsfuncext msgid "Extension" msgstr "Extensión" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "Grupo" #: ulng.rsfunclinkto msgid "Link to" msgstr "Enlazar a" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "Fecha/tiempo de modificación" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "Nombre" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "Nombre sin extensión" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "Propietario" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "Ruta" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "Tamaño" #: ulng.rsfunctype msgid "Type" msgstr "Tipo" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "Error creando el enlace hard" #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "Differ(comparador)" #: ulng.rshotkeycategorymain msgid "Main" msgstr "" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "Visor" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "Enlazado completo" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "Máscara a deseleccionar" #: ulng.rsmarkplus msgid "Select mask" msgstr "Máscara a seleccionar" #: ulng.rsmaskinput msgid "Input mask:" msgstr "Máscara de entrada:" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "Configurar columnas a medida" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "Configurar esta vista de columnas a medida" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "Acciones" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "Editar" #: ulng.rsmnueject msgid "Eject" msgstr "Explulsar" #: ulng.rsmnumount msgid "Mount" msgstr "Montar" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "Nuevo" #: ulng.rsmnunomedia msgid "No media available" msgstr "No hay nigún medio disponible" #: ulng.rsmnuopenwith #, fuzzy #| msgid "Open with ..." msgid "Open with" msgstr "Abrir con ..." #: ulng.rsmnuopenwithother msgid "Other..." msgstr "" #: ulng.rsmnusortby msgid "Sort by" msgstr "Ordenar" #: ulng.rsmnuumount msgid "Unmount" msgstr "Desmontar" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "Ver" #: ulng.rsmsgaccount msgid "Account:" msgstr "Cuenta:" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "Parámetros adicionales para la línea de comandos:" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "No se puede copiar/mover un archivo \"%s\" dentro él mismo" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "Imposible cambiar a [%s]!" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "¿Cerrar todas las pestañas inactivas?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "¡Esta pestaña (%s) está bloqueada!¿La cierro? " #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "¿Está seguro de querer salir?" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "¿Copiar %d archivos/carpetas seleccionados?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "¿Copiar \"%s\"?" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "¿Borrar %d archivos/carpetas seleccionados?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "¿Echar %d archivos/carpetas seleccionados a la papelera?" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "¿Borrar \"%s\"?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "¿Tirar \"%s\" a la papelera?" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "¡No puedo tirar \"%s\" a la papelera!¿Lo borro directamente?" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "Disco no disponible" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "Introduzca la extensión del arhivo:" #: ulng.rsmsgentername msgid "Enter name:" msgstr "Introduzca el nombre:" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "Error de CRC en los datos" #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "Datos corrompidos" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "No puedo conectar con el servidor: \"%s\"" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "No puedo copiar el archivo %s a %s" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "" #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "La fecha %s no se soporta" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "¡La carpeta %s existe!" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "Función abortada por el usuario" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "Error cerrando el archivo" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "Imposible crear el archivo" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "No hay más archivos en el archivo" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "Imposible abrir el archivo existente" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "Error leyendo del archivo" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "Error escribiendo en el archivo" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "¡No se puede crear la carpeta %s!" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "Enlace Inválido" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "No se han encontrado archivos" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "Memoria insuficiente" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "Función no soportada!" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "Error de sintaxis en expresión regular!" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "No se puede renombrar el archivo %s a %s" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "No se puede guardar el archivo" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "No se puede fijar atributos para \"%s" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "No se puede fijar fecha/tiempo para \"%s" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "Buffer demasiado pequeño" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "¡Demasiados archivos para comprimir!" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "Formato de archivo desconocido" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "%s ha cambiado ¿guardar?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "%s existe ¿sobreescribir?" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "Operaciones de archivo activas" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "Algunas operaciones de archivo no han terminado todavía. Si cierra Double Commander puede perder datos." #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "El archivo %s se ha marcado como de sólo lectura ¿Lo borro?" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "¡El tamaño del archivo de \"%s\" es demasiado grande para su destino!" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "La carpeta %s existe ¿la sobreescribo?" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "¿Sigo el enlace duro \"%s\"?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "Nombre no válido" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "" #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "Selección no válida" #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "Cargando la lista de archivos ..." #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "Copiar archivo %s" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "Borrar archivo %s" #: ulng.rsmsglogerror msgid "Error: " msgstr "Error: " #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "Extraer archivo %s" #: ulng.rsmsgloginfo msgid "Info: " msgstr "Información: " #: ulng.rsmsgloglink msgid "Create link %s" msgstr "Crear enlace %s" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "Crear carpeta %s" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "Mover archivo %s" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "Comprimir en archivo %s" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "Eliminar carpeta %s" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "Hecho: " #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "Crear enlace simbólico %s" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "Examinar la integridad del archivo %s" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "Añadir manualmente una ruta caliente" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "Editar manualmente una ruta caliente" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "Intruduzca nombre y ruta (formato nombre=ruta):" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "Contraseña maestra" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "Por favor, introduzca la contraseña maestra:" #: ulng.rsmsgnewfile msgid "New file" msgstr "Nuevo archivo" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "Se descomprimirá el siguiente volumen" #: ulng.rsmsgnofiles msgid "No files" msgstr "" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "Ningún archivo seleccionado." #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "Espacio insuficiente en disco de destino, Continuar?" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "Espacio insuficiente en disco de destino, Reintentar?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "Imposible borrar %s" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "No implementado" #: ulng.rsmsgpassword msgid "Password:" msgstr "Contraseña:" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "Por favor, introduzca la contraseña:" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "Contraseña (Firewall):" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "&Añadir %s" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "&Configurar" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "&Borrar %s" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "La configuración \"%s\" ya exite.¿Sobreescribir?" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "Renombrar/mover %d archivos/carpetas seleccionados?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "Renombrar/mover \"%s\"?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "Por favor, reinicie Double Commander para aplicar cambios" #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "Por favor, seleccione solo archivos de comprobación" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "Escoja situación del siguiente volumen" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "Establecer etiqueta del volumen" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "Renombrar pestaña" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "Nombre de la nueva pestaña:" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "Ruta buscada:" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "Demasiados archivos seleccionados." #: ulng.rsmsgurl msgid "URL:" msgstr "" #: ulng.rsmsgusername msgid "User name:" msgstr "Nombre de usuario:" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "Nombre de usuario (Firewall):" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "Etiqueta del Volumen:" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "Por favor, introduzca el nombre del volumen:" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "¿Destruyo %d archivos/carpetas seleccionados?" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "¿Destruyo \"%s\"?" #: ulng.rsmulrenfilenamestylelist #, fuzzy #| msgid "No change;UPPERCASE;lowercase;First Char Big;" msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "Sin cambios;MAYÚSCULAS;minúsculas;Primer caracter en Mayúsculas; Primero de cada palabra en Mayúsculas" #: ulng.rsoperaborted msgid "Aborted" msgstr "Abortado" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "Calculando suma de comprobación" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "Calculando suma de comprobación en \"%s\"" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "Calculando suma de comprobación de \"%s\"" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "Calculando" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "Calculando" #: ulng.rsopercombining msgid "Joining" msgstr "Juntando" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "Juntando archivos de \"%s\" a \"%s\"" #: ulng.rsopercopying msgid "Copying" msgstr "Copiando" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "Copiando de \"%s\" a \"%s\"" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "Copiando \"%s\" a \"%s\"" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "Creando carpeta" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "Creando carpeta \"%s\"" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "Borrando" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "Borrando en \"%s\"" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "Borrando \"%s\"" #: ulng.rsoperexecuting msgid "Executing" msgstr "Ejecutando" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "Ejecutando \"%s\"" #: ulng.rsoperextracting msgid "Extracting" msgstr "Extrayendo" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "Extrayendo de \"%s\" a \"%s\"" #: ulng.rsoperfinished msgid "Finished" msgstr "Finalizado" #: ulng.rsoperlisting msgid "Listing" msgstr "Listando" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "Listando \"%s\"" #: ulng.rsopermoving msgid "Moving" msgstr "Moviendo" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "Moviendo de \"%s\" a \"%s\"" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "Moviendo \"%s\" a \"%s\"" #: ulng.rsopernotstarted msgid "Not started" msgstr "No iniciado" #: ulng.rsoperpacking msgid "Packing" msgstr "Comprimiendo" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "Comprimiendo \"%s\" a \"%s\"" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "Comprimiendo \"%s\" a \"%s\"" #: ulng.rsoperpaused msgid "Paused" msgstr "Pausado" #: ulng.rsoperpausing msgid "Pausing" msgstr "Pausando" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "En cola" #: ulng.rsoperrunning msgid "Running" msgstr "Funcionando" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "Configurando propiedad" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "Configurando propiedad en \"%s\"" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "Configurando propiedad de \"%s\"" #: ulng.rsopersplitting msgid "Splitting" msgstr "Separando" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "Separando \"%s\" a \"%s\"" #: ulng.rsoperstarting msgid "Starting" msgstr "Iniciando" #: ulng.rsoperstopped msgid "Stopped" msgstr "Parado" #: ulng.rsoperstopping msgid "Stopping" msgstr "Parando" #: ulng.rsopertesting msgid "Testing" msgstr "Comprobando" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "Comprobando en \"%s\"" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "Comprobando \"%s\"" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "Verificando suma de comprobación" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "Verificando suma de comprobación en \"%s\"" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "Verificando suma de comprobación de \"%s\"" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "Esperando para acceder al archivo" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "Esperando su respuesta" #: ulng.rsoperwiping msgid "Wiping" msgstr "Destruyendo" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "Destruyendo en \"%s\"" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "Destruyendo \"%s\"" #: ulng.rsoperworking msgid "Working" msgstr "Trabajando" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "Borrar" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "Extraer sin ruta:" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "Formato modo de análisis" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "Posición ID:" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "Rango de búsqueda ID:" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "Parámetro" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "Pregunta para la contraseña:" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "Crear archivo autoextraible:" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "Comprobar:" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "Nombre del tipo de archivo:" #: ulng.rsoptarchivevalue msgid "Value" msgstr "Valor" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "Complemento asociado \"%s\" con:" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "Primero;Último;" #: ulng.rsoptdisable msgid "Disable" msgstr "Deshabilitado" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "Habilitado" #: ulng.rsoptenterext msgid "Enter extension" msgstr "Introducir extensión" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "Cursor" #: ulng.rsoptexamplemark msgid "Mark" msgstr "Marca" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "Marca + Cursor" #: ulng.rsoptexampletext msgid "Text" msgstr "Texto" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "ventana separada;ventana separada minimizada;panel de operaciones" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "El atajo %s para cm_Delete será registrado, así puede ser usado para revertir esta configuración." #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "Añadir atajo para %s" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "Añadir atajo" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "No se puede configurar el atajo" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "Cambiar atajo" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "Comandos" #: ulng.rsopthotkeysdeletetrashcanoverrides msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "El atajo %s para cm_Delete tiene un parámetro que sobreescribe su configuración ¿Quiere cambiar este parámetro para usar la configuración global?" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "El atajo %s para cm_Delete necesita cambiar un parámetro para encajar con el atajo %s ¿Quiere cambiarlo?" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "Descripción" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "Editar atajo para %s" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "Fijar parámetro" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "Atajos" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "Atajos" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "Parámetros" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "Configurar atajo para borrar archivo" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "Para que este ajuste funcione con el atajo %s, el atajo %s se puede asignar a cm_Delete pero ya está asignado a %s ¿Quiere cambiarlo?" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "El atajo %s para cm_Delete es una secuencia para la que no se puede asignar una tecla con Shift. Este ajuste podría no funcionar" #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "Atajo en uso" #: ulng.rsopthotkeysshortcutusedtext1 #, fuzzy #| msgid "Shortcut %s is already used for %s." msgid "Shortcut %s is already used." msgstr "El atajo %s ya lo usa %s" #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "Cambiarlo a %s ?" #: ulng.rsopthotkeysusedby #, fuzzy #| msgid "used by" msgid "used for %s in %s" msgstr "Usado por" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "usado para este comando pero con parámetros diferentes" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "Compresores" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "Actualizar" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "Comportamiento" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "Colores" #: ulng.rsoptionseditorcolumnsview msgctxt "ulng.rsoptionseditorcolumnsview" msgid "Columns" msgstr "Columnas" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "Configuración" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "Columnas configurables" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "Arrastrar y soltar" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "Lista de botones de discos" #: ulng.rsoptionseditorfileoperations msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "Operaciones con archivos" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "Paneles de archivos" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "Vista de archivos" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "Tipos de archivos" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "Pestañas de carpeta" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "Fuentes" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "Destacadores" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "Atajos" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "Iconos" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "Ignorar lista" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "Teclas" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "Idioma" #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "Apariencia" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "Registro" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "Varios" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "Ratón" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "Complementos" #: ulng.rsoptionseditorquicksearch #, fuzzy #| msgid "Quick search" msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "Búsqueda rápida" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "Barra de Herramientas" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "Herramientas" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "Información emergente" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "Botón izquierdo; Botón derecho;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "al principio de la lista de archivos;después de las carpeta (si las carpetas se ordenan antes que los archivos);en posición ordenada;en el fondo de la lista de archivos" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "El complemento %s se ha asignado ya a la siguiente extensión:" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "Activo" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "Ruta del complemento" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "Nombre" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "Registrado para" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "no sensible a capitalización;de acuerdo a la configuración local(aAbBcC);primero mayúsculas luego minúsculas(ABabc)" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "ordenar por nombre y mostrar primero;ordenar como archivos y mostrar primeros;ordenar como archivos" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "Alfabéticamente, considerando acentos;Orden natural: alfabético y números" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "Arriba;Abajo;" #: ulng.rsopttoolbarbuttontype #, fuzzy #| msgid "Separator;Internal command;External command;Menu" msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "Separador;Comando interno;Comando externo;Menú" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "no cambiar posición; usar la misma configuración para nuevos archivos;para posición ordenada" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "No se puede cambiar los derechos de acceso para \"%s\"" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "No se puede cambiar el propietario para \"%s\"" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "archivo" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "Carpeta" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "Pipe con nombre" #: ulng.rspropsno msgid "No" msgstr "No" #: ulng.rspropssocket msgid "Socket" msgstr "Socket" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "Archivo de bloques especial" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "Archivo de carácter especial" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "Enlace simbólico" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "Tipo desconocido" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "Sí" #: ulng.rssearchresult msgid "Search result" msgstr "Buscar resultado" #: ulng.rssearchtemplateunnamed msgid "" msgstr "" #: ulng.rsselectdir msgid "Select a directory" msgstr "Escoja una carpeta" #: ulng.rsshowhelpfor #, fuzzy #| msgid "Show help for %s" msgid "&Show help for %s" msgstr "Mostrar ayuda para %s" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "Archivos: %d, Carpetas: %d, Tamaño: %s (%s bytes)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "¡No se pudo crear carpeta en el destino!" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "¡Formato de tamaño incorrecto!" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "¡Imposible partir el archivo!" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "¡El número de partes es mayor de 100! ¿continuar?" #: ulng.rssplitseldir msgid "Select directory:" msgstr "Escoja carpeta:" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "Error creando el enlace simbólico." #: ulng.rssyndefaulttext msgctxt "ulng.rssyndefaulttext" msgid "Default text" msgstr "Texto por defecto" #: ulng.rssynlangplaintext msgctxt "ulng.rssynlangplaintext" msgid "Plain text" msgstr "Texto normal" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "Día(s)" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "Hora(s)" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "Minuto(s)" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "Mes(es)" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "Segundo(s)" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "Semana(s)" #: ulng.rstimeunityear msgid "Year(s)" msgstr "Año(s)" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "Differ(comparador)" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "Editor" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "Error abriendo el comparador" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "Error abriendo el editor" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "Error abriendo el terminal" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "Error abriendo el visor" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "Visor" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "Por favor, informe de este error al trazador de errores con una descripción de lo que estaba haciendo: %sPulse %s para continuar o %s para abortar el programa." #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "Red" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "Visor interno de Double Commander." #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "Codificación" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "%s no encontrado!" doublecmd-0.5.8/language/doublecmd.tr.po0000644000175000017500000060503312255263151017224 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.46 alpha\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-12-20 12:40+0300\n" "PO-Revision-Date: 2013-08-27 11:34+0100\n" "Last-Translator: Ahmet Çağlar \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Turkish\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "Tüm" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "Tüm" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "Tüm" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "Tüm" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "Tüm" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "Tüm" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "Tüm" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "İptal" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "..." #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "->" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "&TAMAM" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "<-" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "Özel sütun görünümlerini düzenle" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "Arka plan:" #: tfcolumnssetconf.cbcursorborder.caption msgid "Cursor border" msgstr "Gösterge sınırı" #: tfcolumnssetconf.cbovercolor.caption msgid "Allow Overcolor" msgstr "Fazla renge izin ver" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "Kullanıcı tanımlı yazı tipi ve renk kullanın" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "Metin rengi" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "Yazı karakteri:" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "Boyut:" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "Arka plan 2:" #: tfcolumnssetconf.lblconfigviewnr.caption msgid "Configure view nr:" msgstr "Görünümünü yapılandır Nr:" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "Gösterge rengi:" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "Metin İmleci:" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "İşaret rengi:" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "İsim:" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "Sütun Ekle" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "Sütunları Düzenle" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "Önizleme" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "R" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption #, fuzzy #| msgid "Check free space" msgid "C&heck free space" msgstr "Boş alanı kontrol edin" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption msgid "Cop&y attributes" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption msgid "Copy o&wnership" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption msgid "Copy d&ate/time" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption #, fuzzy #| msgid "Correct links" msgid "Correct lin&ks" msgstr "Doğru bağlantılar" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption #, fuzzy #| msgid "Drop readonly flag" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "Salt okunur özniteliğini kaldır" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption msgid "E&xclude empty directories" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption #, fuzzy #| msgid "Follow links" msgid "Fo&llow links" msgstr "Bağlantıları İzle" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption msgid "&Reserve space" msgstr "" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "" #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption #, fuzzy #| msgid "When directory exists" msgid "When dir&ectory exists" msgstr "Dizin mevcutsa" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption #, fuzzy #| msgid "When file exists" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "Dosya mevcutsa" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption msgid "When ca&nnot set property" msgstr "" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "" #: tfrmabout.btnclose.caption msgctxt "tfrmabout.btnclose.caption" msgid "&Close" msgstr "&Kapat" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "Hakkında" #: tfrmabout.lblbuild.caption msgid "Build" msgstr "Yapı" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "Free Pascal Editor" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "Ana Sayfa" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "http://doublecmd.sourceforge.net" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "Lazarus" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "Gözden geçir" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption #, fuzzy #| msgid "Version %s" msgid "Version" msgstr "Çeviri Çağlar" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&İptal" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&TAMAM" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "&Baştaki konumuna getir" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "Özelliklerini seçin" #: tfrmattributesedit.cbarchive.caption #, fuzzy #| msgid "Archive" msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "Kayıtlar" #: tfrmattributesedit.cbcompressed.caption #, fuzzy #| msgid "Compressed" msgid "Co&mpressed" msgstr "Sıkıştırılmış" #: tfrmattributesedit.cbdirectory.caption #, fuzzy #| msgid "Directory" msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "Dizin" #: tfrmattributesedit.cbencrypted.caption #, fuzzy #| msgid "Encrypted" msgid "&Encrypted" msgstr "Şifreli" #: tfrmattributesedit.cbhidden.caption #, fuzzy #| msgid "Hidden" msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "Gizli" #: tfrmattributesedit.cbreadonly.caption #, fuzzy #| msgid "Read only" msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "Salt okunur" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmattributesedit.cbsparse.caption #, fuzzy #| msgid "Sparse" msgid "S&parse" msgstr "Seyrek" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Yapışkan" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmattributesedit.cbsymlink.caption #, fuzzy #| msgid "Symlink" msgid "&Symlink" msgstr "Sembolik link" #: tfrmattributesedit.cbsystem.caption #, fuzzy #| msgid "System" msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "Sistem" #: tfrmattributesedit.cbtemporary.caption #, fuzzy #| msgid "Temporary" msgid "&Temporary" msgstr "Geçici" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "NTFS öznitelikleri" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "Genel öznitelikler" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bit:" #: tfrmattributesedit.lblattrgroupstr.caption #, fuzzy #| msgid "Gruppe" msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Grup" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Diğer" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Sahip" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "Çalıştır" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "Oku" #: tfrmattributesedit.lbltextattrs.caption #, fuzzy #| msgid "As text:" msgid "As te&xt:" msgstr "Metin olarak:" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "Yaz" #: tfrmchecksumcalc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "&TAMAM" #: tfrmchecksumcalc.caption msgctxt "tfrmchecksumcalc.caption" msgid "Calculate check sum..." msgstr "Sağlama toplamı hesapla..." #: tfrmchecksumcalc.cbseparatefile.caption #, fuzzy #| msgid "Create separate checksum file for each file" msgid "C&reate separate checksum file for each file" msgstr "Her dosya için ayrı bir sağlama toplamı dosyası oluştur" #: tfrmchecksumcalc.lblsaveto.caption #, fuzzy #| msgid "Save check sum file(s) to:" msgid "&Save check sum file(s) to:" msgstr "Sağlama toplamı dosya(lar)ını kaydet:" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Kapat" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "Sağlama toplamı doğrula..." #: tfrmconnectionmanager.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "Ekle" #: tfrmconnectionmanager.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmconnectionmanager.btnconnect.caption #, fuzzy #| msgid "Connect" msgid "C&onnect" msgstr "Bağlan" #: tfrmconnectionmanager.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Sil" #: tfrmconnectionmanager.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Düzenle" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "Bağlantı Yöneticisi" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "Bağlantıla:" #: tfrmcopydlg.btnaddtoqueue.caption msgid "A&dd To Queue" msgstr "" #: tfrmcopydlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "tfrmcopydlg.btncreatespecialqueue.caption" msgid "..." msgstr "..." #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "Seçenekler" #: tfrmcopydlg.btnsaveoptions.caption #, fuzzy #| msgid "Save these options as default" msgid "Sa&ve these options as default" msgstr "Bu seçenekleri varsayılan olarak kaydet" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "Dosya(lar)Kopyala" #: tfrmdescredit.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&TAMAM" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "Dosya/klasör açıklaması" #: tfrmdescredit.lbleditcommentfor.caption #, fuzzy #| msgid "Edit comment for:" msgid "E&dit comment for:" msgstr "Açıklamayı düzenle:" #: tfrmdescredit.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "Kodlama:" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "Hakkında" #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "Otomatik karşılaştır" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "İkili mod" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "İptal" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "İptal" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "Bloğu sağa kopyala" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "Bloğu sağa kopyala" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "Bloğu sola kopyala" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "Bloğu sola kopyala" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Kopyala" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Kes" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Sil" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Yapıştır" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Yinele" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "Tümünü &Seç" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Geri Al" #: tfrmdiffer.actexit.caption msgctxt "tfrmdiffer.actexit.caption" msgid "E&xit" msgstr "Ç&ıkış" #: tfrmdiffer.actfirstdifference.caption msgctxt "tfrmdiffer.actfirstdifference.caption" msgid "First Difference" msgstr "İlk fark" #: tfrmdiffer.actfirstdifference.hint msgctxt "tfrmdiffer.actfirstdifference.hint" msgid "First Difference" msgstr "İlk fark" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "Büyük-küçük harf ayrımı yapma" #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "Boşlukları yoksay" #: tfrmdiffer.actkeepscrolling.caption #, fuzzy #| msgid "Keep Scrolling\"Kaydırma tutma" msgid "Keep Scrolling" msgstr "Kaydırma devam" #: tfrmdiffer.actlastdifference.caption msgctxt "tfrmdiffer.actlastdifference.caption" msgid "Last Difference" msgstr "Son Fark" #: tfrmdiffer.actlastdifference.hint msgctxt "tfrmdiffer.actlastdifference.hint" msgid "Last Difference" msgstr "Son Fark" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "Satır farklılıkları" #: tfrmdiffer.actnextdifference.caption msgctxt "tfrmdiffer.actnextdifference.caption" msgid "Next Difference" msgstr "Sonraki Fark" #: tfrmdiffer.actnextdifference.hint msgctxt "tfrmdiffer.actnextdifference.hint" msgid "Next Difference" msgstr "Sonraki Fark" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "Sol Açık..." #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "Sağ Açık..." #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "Arkaplan Rengi" #: tfrmdiffer.actprevdifference.caption msgctxt "tfrmdiffer.actprevdifference.caption" msgid "Previous Difference" msgstr "Önceki Fark" #: tfrmdiffer.actprevdifference.hint msgctxt "tfrmdiffer.actprevdifference.hint" msgid "Previous Difference" msgstr "Önceki Fark" #: tfrmdiffer.actreload.caption #, fuzzy #| msgid "Reload" msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "Güncelle" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "Güncelle" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "Kaydet" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "Kaydet" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "Farklı Kaydet ..." #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "Farklı Kaydet ..." #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "Sol Kaydet" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "Sol Kaydet" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "Sol olarak kaydet..." #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "Sol olarak kaydet..." #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "Sağ Kaydet" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "Sağ Kaydet" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "Sağ olarak kaydet..." #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "Sağ olarak kaydet..." #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "Karşılaştır" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "Karşılaştır" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "Kodlama" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "Kodlama" #: tfrmdiffer.caption msgctxt "tfrmdiffer.caption" msgid "Compare files" msgstr "Dosyaları karşılaştır" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miencodingleft.caption #, fuzzy #| msgid "Left" msgid "&Left" msgstr "Sol" #: tfrmdiffer.miencodingright.caption #, fuzzy #| msgid "Right" msgid "&Right" msgstr "Sağ" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "&Eylemler" #: tfrmdiffer.mnuedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "Düzenle" #: tfrmdiffer.mnuencoding.caption #, fuzzy #| msgid "Encoding" msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "Kodlama" #: tfrmdiffer.mnufile.caption #, fuzzy #| msgid "File" msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "Dosya" #: tfrmdiffer.mnuoptions.caption msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "Seçenekler" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "" #: tfrmedithotkey.btncancel.caption msgctxt "tfrmedithotkey.btncancel.caption" msgid "&Cancel" msgstr "&İptal" #: tfrmedithotkey.btnok.caption msgctxt "tfrmedithotkey.btnok.caption" msgid "&OK" msgstr "&TAMAM" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "" #: tfrmedithotkey.cghkcontrols.caption msgid "Only for these controls" msgstr "" #: tfrmedithotkey.lblparameters.caption msgid "&Parameters (each in a separate line):" msgstr "" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "Hakkında" #: tfrmeditor.actabout.hint msgctxt "tfrmeditor.actabout.hint" msgid "About" msgstr "Hakkında" #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "&Yapılandır" #: tfrmeditor.actconfhigh.hint msgctxt "tfrmeditor.actconfhigh.hint" msgid "Configuration" msgstr "Yapılandırma" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Kopyala" #: tfrmeditor.acteditcopy.hint msgctxt "tfrmeditor.acteditcopy.hint" msgid "Copy" msgstr "Kopyala" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Kes" #: tfrmeditor.acteditcut.hint msgctxt "tfrmeditor.acteditcut.hint" msgid "Cut" msgstr "Kes" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Sil" #: tfrmeditor.acteditdelete.hint msgctxt "tfrmeditor.acteditdelete.hint" msgid "Delete" msgstr "&Sil" #: tfrmeditor.acteditfind.caption msgid "&Find" msgstr "&Bul" #: tfrmeditor.acteditfind.hint msgctxt "tfrmeditor.acteditfind.hint" msgid "Find" msgstr "Bul" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "Sonrakini Bul" #: tfrmeditor.acteditfindnext.hint msgctxt "tfrmeditor.acteditfindnext.hint" msgid "Find next" msgstr "Sonrakini Bul" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcr.hint msgctxt "tfrmeditor.acteditlineendcr.hint" msgid "Mac (CR)" msgstr "" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "tfrmeditor.acteditlineendcrlf.hint" msgid "Windows (CRLF)" msgstr "" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditlineendlf.hint msgctxt "tfrmeditor.acteditlineendlf.hint" msgid "Unix (LF)" msgstr "" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Yapıştır" #: tfrmeditor.acteditpaste.hint msgctxt "tfrmeditor.acteditpaste.hint" msgid "Paste" msgstr "Yapıştır" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Yenile" #: tfrmeditor.acteditredo.hint msgctxt "tfrmeditor.acteditredo.hint" msgid "Redo" msgstr "Yenile" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "&Değiştir" #: tfrmeditor.acteditrplc.hint msgctxt "tfrmeditor.acteditrplc.hint" msgid "Replace" msgstr "Değiştir" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "&Hepsini Seç" #: tfrmeditor.acteditselectall.hint msgctxt "tfrmeditor.acteditselectall.hint" msgid "Select All" msgstr "Tümünü Seç" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Geri Al" #: tfrmeditor.acteditundo.hint msgctxt "tfrmeditor.acteditundo.hint" msgid "Undo" msgstr "Geri al" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "&Kapat" #: tfrmeditor.actfileclose.hint msgctxt "tfrmeditor.actfileclose.hint" msgid "Close" msgstr "Kapat" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "&Çıkış" #: tfrmeditor.actfileexit.hint msgid "Exit" msgstr "" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "&Yeni" #: tfrmeditor.actfilenew.hint msgctxt "tfrmeditor.actfilenew.hint" msgid "New" msgstr "Yeni" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "&Açık" #: tfrmeditor.actfileopen.hint msgctxt "tfrmeditor.actfileopen.hint" msgid "Open" msgstr "Açık" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "&Kaydet" #: tfrmeditor.actfilesave.hint msgctxt "tfrmeditor.actfilesave.hint" msgid "Save" msgstr "Kaydet" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "Farklı &Kaydet..." #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "&Tümünü Kaydet" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "" #: tfrmeditor.caption msgctxt "TFRMEDITOR.CAPTION" msgid "Editor" msgstr "Düzenleyici" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "&Yardım" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Düzenle" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "&Kodlama" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "Olarak aç..." #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "Farklı Kaydet..." #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "&Dosya" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "Sözdizimi vurgulama" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n5.caption msgctxt "tfrmeditor.n5.caption" msgid "-" msgstr "-" #: tfrmeditsearchreplace.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "&TAMAM" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgid "C&ase sensitivity" msgstr "Büyük/küçük harf duyarlılığı" #: tfrmeditsearchreplace.cbsearchfromcursor.caption #, fuzzy #| msgid "Search from &caret" msgid "S&earch from caret" msgstr "Şapka &imi ara" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "&Kısaltılmış metin karekterleri" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgid "Selected &text only" msgstr "Sadece &seçili metin" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgid "&Whole words only" msgstr "&Sadece tüm kelimeler" #: tfrmeditsearchreplace.gbsearchoptions.caption msgid "Option" msgstr "Seçenek" #: tfrmeditsearchreplace.lblreplacewith.caption msgid "&Replace with:" msgstr "&İle değiştirin:" #: tfrmeditsearchreplace.lblsearchfor.caption msgid "&Search for:" msgstr "&Bulmaya çalış:" #: tfrmeditsearchreplace.rgsearchdirection.caption msgid "Direction" msgstr "Yön" #: tfrmextractdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmextractdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Yardım" #: tfrmextractdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "TAMAM" #: tfrmextractdlg.caption msgctxt "tfrmextractdlg.caption" msgid "Unpack files" msgstr "Dosya(ları) aç" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "&Eğer dosyalar kaydedilmişse sıkıştırılmış yol adlarını aç" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "Her bir arşivi ayrı bir alt dizine aç(arşiv adıyla)" #: tfrmextractdlg.cboverwrite.caption #, fuzzy #| msgid "&Overwrite existing files" msgid "O&verwrite existing files" msgstr "&Varolan dosya(ların) üzerine yaz" #: tfrmextractdlg.lblextractto.caption #, fuzzy #| msgid "To the directory:" msgid "To the &directory:" msgstr "Sıkıştırılmış dosya(ları) dizine aç:" #: tfrmextractdlg.lblfilemask.caption #, fuzzy #| msgid "Extract files matching file mask:" msgid "&Extract files matching file mask:" msgstr "Dosya maskesi eşleşen dosyaları ayıkla:" #: tfrmextractdlg.lblpassword.caption #, fuzzy #| msgid "Password for encrypted files:" msgid "&Password for encrypted files:" msgstr "Şifrelenmiş Dosya için şifre" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "Ekle" #: tfrmfileassoc.btnaddext.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "Ekle" #: tfrmfileassoc.btnaddnewtype.caption #, fuzzy #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "Ekle" #: tfrmfileassoc.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmfileassoc.btndownact.caption #, fuzzy #| msgid "Down" msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "Aşağı" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "&TAMAM" #: tfrmfileassoc.btnremoveact.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "Kaldır" #: tfrmfileassoc.btnremoveext.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "Kaldır" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "X" #: tfrmfileassoc.btnremovetype.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "Kaldır" #: tfrmfileassoc.btnrenametype.caption #, fuzzy #| msgid "Rename" msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "Yeniden Adlandır" #: tfrmfileassoc.btnupact.caption #, fuzzy #| msgid "Up" msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "Yukarı" #: tfrmfileassoc.caption msgid "File associations" msgstr "Dosya ilişkileri" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "Eylemler" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "Uzantıları" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "Dosya türü" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "Simge" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "Eylem:" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "&Komut" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "Düzenle" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "Düzenleyici´de aç" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "Dosya adı" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "Dosya yolu" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "Tam yol" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "Çıkış komutu Alın" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "Açık" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "Konsol penceresinde çalıştırın" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "VFS Aç" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "Göster" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "Görüntüleyicide açık" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Kapat" #: tfrmfileexecuteyourself.caption msgctxt "tfrmfileexecuteyourself.caption" msgid "Wait..." msgstr "Bekle..." #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "Dosya Adı:" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "Kaynak:" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "Geçici dosyayı(TEMP)silmek için Kapat'ı tıklatın!" #: tfrmfileop.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "Tarafından:" #: tfrmfileop.lblto.caption msgid "To:" msgstr "Sonra:" #: tfrmfileproperties.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Kapat" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "" #: tfrmfileproperties.caption msgctxt "tfrmfileproperties.caption" msgid "Properties" msgstr "Özellikleri" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID(yürütme Grup kimliği kurun) bir dosya/klasör verilen dosya izinleri özel bir türüdür." #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Yapışkan" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID (Kullanıcı Kimliği ayarlayın) bir dosyaya verilen dosya izinleri özel bir türü" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "Sahibi" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bit:" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Grup" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Diğer" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Diğer" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmfileproperties.lblattrtextstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Metin" #: tfrmfileproperties.lblcontains.caption msgctxt "tfrmfileproperties.lblcontains.caption" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Çalıştır" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "Dosya adı" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "Adı:" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "Dosya adı" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "Yol:" #: tfrmfileproperties.lblgroupstr.caption #, fuzzy #| msgid "Group" msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "Grup" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "Son erişim" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "Son değişiklik:" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "Son durum değişikliği:" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Sekizli:" #: tfrmfileproperties.lblownerstr.caption #, fuzzy #| msgid "Owner" msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "Sahibi" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Okuma" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "Boyutu:" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption msgid "Symlink to:" msgstr "Sembolik link için:" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption msgid "Type:" msgstr "Tip:" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Yaz" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Öznitelikleri" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "Özellikleri" #: tfrmfinddlg.btnaddattribute.caption msgid "&Add" msgstr "&Ekle" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "&Yardım" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Kapat" #: tfrmfinddlg.btnedit.caption msgctxt "tfrmfinddlg.btnedit.caption" msgid "&Edit" msgstr "&Düzenle" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "&Dosya'ya git" #: tfrmfinddlg.btnlastsearch.caption msgid "&Last search" msgstr "" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "&Yeni arama" #: tfrmfinddlg.btnsavetemplate.caption #, fuzzy #| msgid "Save" msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "Kaydet" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "&Sil" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "&Yükle" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "&Kaydet" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption msgid "Sa&ve with \"Start in directory\"" msgstr "" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "" #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "&Başlat" #: tfrmfinddlg.btnstop.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "İptal" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "&Göster" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "&Liste kutusunu besle" #: tfrmfinddlg.caption msgctxt "tfrmfinddlg.caption" msgid "Find files" msgstr "Dosyaları bul" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "Büyük/küçük harf duyarlı" #: tfrmfinddlg.cbdatefrom.caption #, fuzzy #| msgid "Date From:" msgid "&Date from:" msgstr "Tarihinden itibaren:" #: tfrmfinddlg.cbdateto.caption #, fuzzy #| msgid "Date To:" msgid "Dat&e to:" msgstr "Bitiş tarihi:" #: tfrmfinddlg.cbfilesizefrom.caption #, fuzzy #| msgid "Size from:" msgid "S&ize from:" msgstr "Büyüklükleri:" #: tfrmfinddlg.cbfilesizeto.caption #, fuzzy #| msgid "Size to:" msgid "Si&ze to:" msgstr "En büyük dosya boyutu" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "Dosyadaki metni bul" #: tfrmfinddlg.cbfollowsymlinks.caption msgid "Follow s&ymlinks" msgstr "" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "Metin içermeyen dosyaları bul" #: tfrmfinddlg.cbnotolderthan.caption #, fuzzy #| msgid "Not older than:" msgid "N&ot older than:" msgstr "Daha eski değil:" #: tfrmfinddlg.cbpartialnamesearch.caption #, fuzzy #| msgid "Search for part of file name " msgid "Searc&h for part of file name" msgstr "Dosya adının bir kısmını ara" #: tfrmfinddlg.cbregexp.caption #, fuzzy #| msgid "&Regular expressions" msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "&Kısaltılmış metin karekterleri" #: tfrmfinddlg.cbreplacetext.caption msgid "Re&place by" msgstr "Metni Değiştir" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "" #: tfrmfinddlg.cbtimefrom.caption #, fuzzy #| msgid "Time from:" msgid "&Time from:" msgstr "Yeni Tarih:" #: tfrmfinddlg.cbtimeto.caption #, fuzzy #| msgid "Time to:" msgid "Ti&me to:" msgstr "Eski Tarih:" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "Arama eklentisi kullan" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption msgctxt "tfrmfinddlg.gbdirectories.caption" msgid "Directories" msgstr "" #: tfrmfinddlg.gbfiles.caption msgctxt "tfrmfinddlg.gbfiles.caption" msgid "Files" msgstr "" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "Veri Bul" #: tfrmfinddlg.lblattributes.caption msgid "Attri&butes" msgstr "" #: tfrmfinddlg.lblencoding.caption #, fuzzy #| msgid "Encoding:" msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "Kodlama:" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "Dosya Maskesi" #: tfrmfinddlg.lblfindpathstart.caption #, fuzzy #| msgid "&Directory" msgid "Start in &directory" msgstr "DoubleCommander dizininde ara" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "Alt dizinleri ara" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "Önceki arama(lar)" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "Listeden kaldır" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "Bulunan tüm öğeleri göster" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "Görüntüleyicide göster" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "Gelişmiş" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "Yükle/Kaydet" #: tfrmfinddlg.tsplugins.caption msgctxt "tfrmfinddlg.tsplugins.caption" msgid "Plugins" msgstr "Eklentiler" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "Sonuçlar" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "Standart" #: tfrmfindview.btnclose.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmfindview.btnfind.caption #, fuzzy #| msgid "Find" msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "Bul" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "Bul" #: tfrmfindview.cbcasesens.caption #, fuzzy #| msgid "Case sensitive" msgid "C&ase sensitive" msgstr "Büyük/küçük harf duyarlı" #: tfrmhardlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&TAMAM" #: tfrmhardlink.caption msgid "Create hard link" msgstr "Sabit bağlantı oluştur" #: tfrmhardlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Mevcut hedef (nereye bağlantı noktası)" #: tfrmhardlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Bağlantı adı" #: tfrmhotdir.btnadd.caption #, fuzzy #| msgid "Add" msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "Ekle" #: tfrmhotdir.btnaddman.caption #, fuzzy #| msgid "Add manually" msgid "Add &manually" msgstr "El ile ekle" #: tfrmhotdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmhotdir.btndelete.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Sil" #: tfrmhotdir.btnedit.caption #, fuzzy #| msgid "Edit" msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "Düzenle" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&TAMAM" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "Önemli Liste Dizini" #: tfrmlinker.btnexit.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "Bitiş" #: tfrmlinker.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "TAMAM" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "..." #: tfrmlinker.caption msgctxt "tfrmlinker.caption" msgid "Linker" msgstr "Bağlayıcı" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "Kaydedin..." #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "Öğe" #: tfrmlinker.lblfilename.caption #, fuzzy #| msgid "File name" msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "Dosya Adı" #: tfrmlinker.spbtndel.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "Sil" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "Sil" #: tfrmlinker.spbtndown.caption #, fuzzy #| msgid "Down" msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "Aşağı" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "Aşağı" #: tfrmlinker.spbtnup.caption #, fuzzy #| msgid "Up" msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "Yukarı" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "Yukarı" #: tfrmmain.actabout.caption msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "&Hakkında" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "Dosya adını komut satırına ekle" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "Yolu ve dosya adını komut satırına ekle" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "Komut satırına yolu kopyala" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "" #: tfrmmain.actcalculatespace.caption msgid "Calculate &Occupied Space" msgstr "Kullanılan alanı hesapla" #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "Dizin Değiştir" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "Ana dizini değiştir" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "Kök dizini Değiştir" #: tfrmmain.actchecksumcalc.caption msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "Sağlama toplamı hesapla..." #: tfrmmain.actchecksumverify.caption msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "Sağlama toplamı doğrula..." #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "Boş günlük dosyası" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "Günlüğü Temizle penceresi" #: tfrmmain.actclosealltabs.caption msgid "Close &All Tabs" msgstr "" #: tfrmmain.actclosetab.caption msgid "&Close Tab" msgstr "" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "Içeriğine göre karşılaştır" #: tfrmmain.actcomparedirectories.caption msgctxt "tfrmmain.actcomparedirectories.caption" msgid "Compare Directories" msgstr "" #: tfrmmain.actcomparedirectories.hint msgctxt "tfrmmain.actcomparedirectories.hint" msgid "Compare Directories" msgstr "" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "Bağlam menüsünü göster" #: tfrmmain.actcopy.caption #, fuzzy #| msgid "Copy F5" msgid "Copy" msgstr "Kopyala F5" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "Dosya ad(ları) tam yolu ile kopyala" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "Dosya ad(ları) Panoya Kopyala" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "Onay istemeden dosya(ları) kopyala" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "Aynı panele kopyala" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "Kopyala" #: tfrmmain.actcountdircontent.caption msgid "Sho&w Occupied Space" msgstr "&Kullanılan alanı göster" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "K&es" #: tfrmmain.actdelete.caption #, fuzzy #| msgid "Delete F8" msgid "Delete" msgstr "Sil F8" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "Dizin geçmişi" #: tfrmmain.actdirhotlist.caption msgid "Directory &Hotlist" msgstr "Sık Kullanılanlar &klasörü" #: tfrmmain.actedit.caption #, fuzzy #| msgid "Edit F4" msgid "Edit" msgstr "Düzenle F4" #: tfrmmain.acteditcomment.caption msgid "Edit Co&mment..." msgstr "Açıklamayı D&üzenle" #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "Yeni dosya Düzenle" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "Dosya listesi üzerinde Yol alanını düzenle" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "Panoları &Değiştir" #: tfrmmain.actexit.caption msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "Ç&ıkış" #: tfrmmain.actextractfiles.caption msgid "&Extract Files..." msgstr "&Dosyaları Ayıkla" #: tfrmmain.actfileassoc.caption msgid "File &Associations..." msgstr "Dosya &ilişkileri" #: tfrmmain.actfilelinker.caption msgid "Com&bine Files..." msgstr "&Dosya(ları) birleştir" #: tfrmmain.actfileproperties.caption msgid "Show &File Properties" msgstr "Dosya Özelliklerini &Göster" #: tfrmmain.actfilespliter.caption msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "&Dosyayı Parçala" #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "Komut satırında odakla" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "Listedeki ilk öğeye ekleme noktasını(imleç) ayarla" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "Listedeki son madde için imleci ayarlayın" #: tfrmmain.acthardlink.caption msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "&Sabit bağlantı oluştur" #: tfrmmain.acthelpindex.caption msgid "&Contents" msgstr "&İçindekiler" #: tfrmmain.acthorizontalfilepanels.caption msgid "&Horizontal Panels Mode" msgstr "&Panoları yatay bölme modu" #: tfrmmain.actkeyboard.caption msgid "&Keyboard" msgstr "&Klavye" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "Sol &= Sağ" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "Sol sürücü listesini aç" #: tfrmmain.actloadselectionfromclip.caption msgid "Load Selection from Clip&board" msgstr "Panoya &Yükle öğesini seç" #: tfrmmain.actloadselectionfromfile.caption msgid "&Load Selection from File..." msgstr "&Dosya Yükle öğesini seç" #: tfrmmain.actmakedir.caption #, fuzzy #| msgid "MakeDir F7" msgid "MakeDir" msgstr "Yeni Dizin F7" #: tfrmmain.actmarkcurrentextension.caption msgid "Select All with the Same E&xtension" msgstr "Ayni uzantıya &sahip olanların tümünü seç" #: tfrmmain.actmarkinvert.caption msgid "&Invert Selection" msgstr "&Seçimi tersine çevir" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "&Tümünü Seç" #: tfrmmain.actmarkminus.caption msgid "Unselect a Gro&up..." msgstr "Gruptan& seçimi kaldır" #: tfrmmain.actmarkplus.caption msgid "Select a &Group..." msgstr "&Grup seç" #: tfrmmain.actmarkunmarkall.caption msgid "&Unselect All" msgstr "&Tüm Seçimi Kaldır" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "Pencereyi simge durumuna küçült" #: tfrmmain.actmultirename.caption msgid "Multi &Rename Tool" msgstr "Çoklu ¥iden adlandırma aracı" #: tfrmmain.actnetworkconnect.caption msgid "Network &Connect..." msgstr "Ağ &Bağlantısı..." #: tfrmmain.actnetworkdisconnect.caption msgid "Network &Disconnect" msgstr "Ağ &Bağlantısını kes" #: tfrmmain.actnetworkquickconnect.caption msgid "Network &Quick Connect..." msgstr "Hızlı &Ağ Bağlantısı..." #: tfrmmain.actnewtab.caption msgid "&New Tab" msgstr "&Yeni Sekme" #: tfrmmain.actnexttab.caption msgid "Switch to Nex&t Tab" msgstr "Sonraki &Sekmeye Geç" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "Açık" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "Arşivi açmak için tekrar dene" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "Dosya Çubuğu Aç" #: tfrmmain.actopendirinnewtab.caption msgid "Open &Folder in a New Tab" msgstr "Klasörü &Yeni Sekmede Aç" #: tfrmmain.actopenvirtualfilesystemlist.caption msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "Sanal Dosya Sistemi &listesi(VFS) aç" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "İşlemleri & Görüntüle" #: tfrmmain.actoptions.caption msgid "&Options..." msgstr "&Seçenekler..." #: tfrmmain.actpackfiles.caption msgid "&Pack Files..." msgstr "&Sıkıştırılmış Dosya(lar)" #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "Parçalamanın konumunu ayarla" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "&Yapıştır" #: tfrmmain.actprevtab.caption msgid "Switch to &Previous Tab" msgstr "Bir önceki &sekmeye geç" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "Hızlı süzgeç" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "Hızlı ara" #: tfrmmain.actquickview.caption msgid "&Quick View Panel" msgstr "&Hızlı Görünüm paneli" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "&Yenile" #: tfrmmain.actrename.caption #, fuzzy #| msgid "Move F6" msgid "Move" msgstr "Taşı F6" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "Dosya(ları) onay istemeden Yeniden adlandır/ Taşı" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "Yeniden Adlandır" #: tfrmmain.actrenametab.caption #, fuzzy #| msgid "Re&name Tab" msgid "&Rename Tab" msgstr "Sekmeyi &Yeniden Adlandır" #: tfrmmain.actrestoreselection.caption msgid "&Restore Selection" msgstr "&Seçimi geri yükle" #: tfrmmain.actreverseorder.caption msgid "Re&verse Order" msgstr "Te&rs Sırala" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "Sağ &= Sol" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "Sağ sürücü listesini aç" #: tfrmmain.actrunterm.caption msgid "Run &Terminal" msgstr "Komut istemi penceresini aç" #: tfrmmain.actsaveselection.caption msgid "Sa&ve Selection" msgstr "Seçimi &Kaydet" #: tfrmmain.actsaveselectiontofile.caption msgid "Save S&election to File..." msgstr "Seçimi dosyaya &Kaydet" #: tfrmmain.actsearch.caption msgid "&Search..." msgstr "&Araştır" #: tfrmmain.actsetfileproperties.caption msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "Öznitelikleri &Değiştir" #: tfrmmain.actsettaboptiondirsinnewtab.caption msgid "Locked with Directories Opened in New &Tabs" msgstr "Kilitli Dizinleri &Yeni Sekmede Aç" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "Normal" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "Kilitli" #: tfrmmain.actsettaboptionpathresets.caption msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "Kilitli, ancak &izin verilenler değiştirilebilir" #: tfrmmain.actshellexecute.caption msgctxt "tfrmmain.actshellexecute.caption" msgid "Open" msgstr "Açık" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "Düğme menüsünü göster" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "Komut satırı geçmişi göster" #: tfrmmain.actshowmainmenu.caption #, fuzzy #| msgid "Menu F9" msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "Menü F9" #: tfrmmain.actshowsysfiles.caption msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "Gizli/sistem &dosyalarını göster" #: tfrmmain.actsortbyattr.caption msgid "Sort by &Attributes" msgstr "Özniteliklerine &Göre Sırala" #: tfrmmain.actsortbydate.caption msgid "Sort by &Date" msgstr "Tarihine &Göre Sırala" #: tfrmmain.actsortbyext.caption msgid "Sort by &Extension" msgstr "Uzantısına &Göre Sırala" #: tfrmmain.actsortbyname.caption msgid "Sort by &Name" msgstr "Adına &Göre Sırala" #: tfrmmain.actsortbysize.caption msgid "Sort by &Size" msgstr "Boyutuna &Göre Sırala" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "Etkinleştirme/devre dışı bırakma yoksayma listesi dosyaları için dosya adları" #: tfrmmain.actsymlink.caption msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "Simgesel bağlantı &Oluştur" #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "Hedef &= Kaynak" #: tfrmmain.acttestarchive.caption msgid "&Test Archive(s)" msgstr "&Arşivi(leri)Test Et" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "Sol penceredeki seçilen klasörü taşı" #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "sağ penceredeki seçilen klasörü taşı" #: tfrmmain.actunmarkcurrentextension.caption msgid "Unselect All with the Same Ex&tension" msgstr "Ayni uzantılı olanların tümünün seçimini kaldır" #: tfrmmain.actview.caption #, fuzzy #| msgid "View F3" msgid "View" msgstr "Göster F3" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "Ziyaret edilen yolun etkin görüntüsünün geçmişini göster\"" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "Git sonraki giriş tarihi" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "Git önceki giriş tarihi" #: tfrmmain.actvisithomepage.caption msgid "&Visit Double Commander Website" msgstr "&Double Commander Web Sitesini ziyaret edin" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "Temizle" #: tfrmmain.btnf10.caption msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "Çıkış" #: tfrmmain.btnf8.caption msgctxt "tfrmmain.btnf8.caption" msgid "Delete" msgstr "&Sil" #: tfrmmain.btnf9.caption #, fuzzy #| msgid "Terminal F9" msgid "Terminal" msgstr "Komut İstemi F9" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint msgid "Directory hotlist" msgstr "Önemli liste Dizini" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "<" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "Sol paneldeki sağ panelin geçerli dizini göster" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnlefthome.hint msgid "Go to home directory" msgstr "Dizinin Başına Git" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgid "Go to root directory" msgstr "Kök Dizinine Git" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgid "Go to parent directory" msgstr "Ana dizinine git" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr ">" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "Sağ paneldeki sol panelin geçerli dizini göster" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "tfrmmain.caption" msgid "Double Commander" msgstr "Double Commander" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "Yol" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "&20/80" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "&30/70" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "&40/60" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "&50/50" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "&60/40" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "&70/30" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "&80/20" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "İptal" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "Kopyala..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "Bağlantı oluştur" #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline33.caption msgctxt "tfrmmain.miline33.caption" msgid "-" msgstr "-" #: tfrmmain.miline37.caption msgctxt "tfrmmain.miline37.caption" msgid "-" msgstr "-" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "-" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "Temizle" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "Kopyala" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "Gizle" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "Hepsini Seç" #: tfrmmain.mimove.caption msgid "Move..." msgstr "Taşı..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "Sembolik bağ oluştur" #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "Sekme seçenekleri" #: tfrmmain.mitrayiconexit.caption msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "Çıkış" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "Eski haline getir" #: tfrmmain.mnualloperpause.caption msgctxt "tfrmmain.mnualloperpause.caption" msgid "||" msgstr "||" #: tfrmmain.mnualloperstart.caption msgctxt "tfrmmain.mnualloperstart.caption" msgid "Start" msgstr "Başlat" #: tfrmmain.mnualloperstop.caption #, fuzzy #| msgid "Cancel" msgctxt "tfrmmain.mnualloperstop.caption" msgid "Cancel" msgstr "Bitiş" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "&Komutlar" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "&Yapılandır" #: tfrmmain.mnufiles.caption msgid "&Files" msgstr "&Dosyalar" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "&Yardım" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "&İşaretle" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "Ağ" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "&Görünüm" #: tfrmmain.mnutaboptions.caption msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "Seçenekler" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "&Sekmeler" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "CD" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "Kopyala" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "Kes" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "Sil" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "Düzenle" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "Yapıştır" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmmaskinputdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmmaskinputdlg.btndefinetemplate.caption #, fuzzy #| msgid "Define..." msgid "&Define..." msgstr "Tanımla..." #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&TAMAM" #: tfrmmaskinputdlg.lblsearchtemplate.caption #, fuzzy #| msgid "Or select predefined selection type:" msgid "O&r select predefined selection type:" msgstr "Veya önceden tanımlanmış seçenek türünü seçin:" #: tfrmmkdir.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&TAMAM" #: tfrmmkdir.caption msgid "Create new directory" msgstr "Yeni dizin oluştur" #: tfrmmkdir.lblmakedir.caption #, fuzzy #| msgid "Input new directory name:" msgid "&Input new directory name:" msgstr "Yeni klasör için ad girin" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "Orantı" #: tfrmmodview.caption msgctxt "tfrmmodview.caption" msgid "New Size" msgstr "Yeni Boyut" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "Yükseklik :" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgid "2" msgstr "2" #: tfrmmodview.lblpath3.caption msgid "3" msgstr "3" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "4" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "5" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "JPG sıkıştırma kalitesi" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "Genişlik:" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "BMP" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "ICO" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "JPG" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "PNG" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "PNM" #: tfrmmodview.teheight.text msgid "Height" msgstr "Yükseklik" #: tfrmmodview.tequality.text msgid "80" msgstr "80" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "Genişlik" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Kapat" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "&Sil" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "&Yükle" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "&Yeniden Adlandır" #: tfrmmultirename.btnrestore.caption #, fuzzy #| msgid "Reset all" msgid "Reset &all" msgstr "Tümünü geri yükle" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "&Kaydet" #: tfrmmultirename.caption msgctxt "tfrmmultirename.caption" msgid "MultiRename" msgstr "Çoklu yeniden adlandırma" #: tfrmmultirename.cblog.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "Etkinleştir" #: tfrmmultirename.cbregexp.caption msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "&Kısaltılmış metin karekterleri" #: tfrmmultirename.cbusesubs.caption msgid "&Use substitution" msgstr "&Yerine Kullan" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption msgid "[E] Extension" msgstr "[E]Uzantı" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "Sayaç" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "Bul ve Yerine Koy" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "Günlük sonuç" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "Maske" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "Ön ayarlı" #: tfrmmultirename.lbext.caption msgid "&Extension" msgstr "&Uzantı" #: tfrmmultirename.lbfind.caption msgid "&Find..." msgstr "&Bul..." #: tfrmmultirename.lbinterval.caption #, fuzzy #| msgid "Interval" msgid "&Interval" msgstr "Aralık" #: tfrmmultirename.lbname.caption msgid "File &Name" msgstr "Dosya &Adı" #: tfrmmultirename.lbreplace.caption msgid "Re&place..." msgstr "&Değiştir..." #: tfrmmultirename.lbstnb.caption #, fuzzy #| msgid "Start Number" msgid "S&tart Number" msgstr "Başlangıç ​​Numarası" #: tfrmmultirename.lbwidth.caption #, fuzzy #| msgid "Width" msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "Genişlik" #: tfrmmultirename.micounter.caption msgid "[C] Counter" msgstr "[C] Yöntem sayma" #: tfrmmultirename.miday.caption msgid "[D] Day" msgstr "[D] Gün" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "[DD] Gün (2 basamaklı)" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "[DDD] Haftanın günü (kısa, Örneğin, \"Prtesi\")" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "[DDDD] Haftanın günü (uzun, Örneğin, \"Pazartesi\")" #: tfrmmultirename.miextensionx.caption msgid "[Ex] Character at position x" msgstr "[Ex]Karakter konumu x" #: tfrmmultirename.miextensionxx.caption msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:y]Karakter konumu x ile y" #: tfrmmultirename.mihour.caption msgid "[h] Hour" msgstr "[h]Saat" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "[hh] Saat (2 basamaklı)" #: tfrmmultirename.miminute.caption msgid "[n] Minute" msgstr "[n] Dakika" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "[nn] Dakika (2 basamaklı)" #: tfrmmultirename.mimonth.caption msgid "[M] Month" msgstr "[M] Ay" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "[MM] Ay (2 basamaklı)" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "[MMM] Ay Adı (kısa, Örneğin, \"Şbat\")" #: tfrmmultirename.mimonth3.caption #, fuzzy #| msgid "[MMMM] Month name (long, e.g. \"january\")" msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "[MMMM] Ay Adı (Uzun, Örneğin, \"Şubat\")" #: tfrmmultirename.miname.caption msgid "[N] Name" msgstr "[N] Adı" #: tfrmmultirename.minamex.caption msgid "[Nx] Character at position x" msgstr "[Nx]Karakter konumu x" #: tfrmmultirename.minamexx.caption msgid "[Nx:y] Characters from position x to y" msgstr "[Nx:y] Karakter konumu x ile y" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "Tarih..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "Uzantı..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "Adı..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "Eklenti" #: tfrmmultirename.misecond.caption msgid "[s] Second" msgstr "[S] Saniye " #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "[ss] Saniye (2 basamaklı)" #: tfrmmultirename.miyear.caption msgid "[Y] Year (2 digits)" msgstr "[Y] Yıl (2 basamaklı)" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "[YYYY] Yıl (4 basamaklı)" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "tfrmmultirename.stringgrid.columns[0].title.caption" msgid "Old File Name" msgstr "Eski dosya adı" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "tfrmmultirename.stringgrid.columns[1].title.caption" msgid "New File Name" msgstr "Yeni dosya adı" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "tfrmmultirename.stringgrid.columns[2].title.caption" msgid "File Path" msgstr "Dosya Yolu" #: tfrmopenwith.caption msgid "Choose an application" msgstr "" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "" #: tfrmopenwith.milistoffiles.caption msgid "Multiple file names" msgstr "" #: tfrmopenwith.milistoffiles.hint msgid "%F" msgstr "" #: tfrmopenwith.milistofurls.caption msgid "Multiple URIs" msgstr "" #: tfrmopenwith.milistofurls.hint msgid "%U" msgstr "" #: tfrmopenwith.misinglefilename.caption msgid "Single file name" msgstr "" #: tfrmopenwith.misinglefilename.hint msgid "%f" msgstr "" #: tfrmopenwith.misingleurl.caption msgid "Single URI" msgstr "" #: tfrmopenwith.misingleurl.hint msgid "%u" msgstr "" #: tfrmoptions.btnapply.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "Uygula" #: tfrmoptions.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "&TAMAM" #: tfrmoptions.caption msgctxt "tfrmoptions.caption" msgid "Options" msgstr "Seçenekler" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "" #: tfrmoptionsarchivers.btnautoconfig.caption msgid "A&uto Configure" msgstr "" #: tfrmoptionsarchivers.btnmultiarcadd.caption msgctxt "tfrmoptionsarchivers.btnmultiarcadd.caption" msgid "A&dd" msgstr "" #: tfrmoptionsarchivers.btnmultiarcapply.caption msgctxt "tfrmoptionsarchivers.btnmultiarcapply.caption" msgid "A&pply" msgstr "" #: tfrmoptionsarchivers.btnmultiarcdelete.caption msgctxt "tfrmoptionsarchivers.btnmultiarcdelete.caption" msgid "D&elete" msgstr "" #: tfrmoptionsarchivers.btnmultiarcrename.caption msgctxt "tfrmoptionsarchivers.btnmultiarcrename.caption" msgid "&Rename" msgstr "&Yeniden Adlandır" #: tfrmoptionsarchivers.chkmultiarcdebug.caption msgid "De&bug mode" msgstr "" #: tfrmoptionsarchivers.chkmultiarcenabled.caption msgid "E&nabled" msgstr "" #: tfrmoptionsarchivers.chkmultiarcoutput.caption msgid "S&how console output" msgstr "" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "tfrmoptionsarchivers.gbarchiveroptions.caption" msgid "Options" msgstr "Seçenekler" #: tfrmoptionsarchivers.lblarchiveadd.caption msgid "Add&ing:" msgstr "" #: tfrmoptionsarchivers.lblarchiveextension.caption msgid "E&xtension:" msgstr "" #: tfrmoptionsarchivers.lblarchiveextract.caption msgid "Ex&tract:" msgstr "" #: tfrmoptionsarchivers.lblarchivelist.caption msgid "&List:" msgstr "" #: tfrmoptionsarchivers.lblarchivelistend.caption msgid "Listing &finish (optional):" msgstr "" #: tfrmoptionsarchivers.lblarchivelistformat.caption msgid "Listing for&mat:" msgstr "" #: tfrmoptionsarchivers.lblarchiveliststart.caption msgid "Listin&g start (optional):" msgstr "" #: tfrmoptionsarchivers.lblarchiver.caption msgid "Arc&hiver:" msgstr "" #: tfrmoptionsarchivers.lbldescription.caption msgid "De&scription:" msgstr "" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "tfrmoptionsarchivers.tbarchiveradditional.caption" msgid "Additional" msgstr "Ek" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "tfrmoptionsarchivers.tbarchivergeneral.caption" msgid "General" msgstr "Genel" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption msgctxt "tfrmoptionsautorefresh.cbwatchattributeschange.caption" msgid "When &size, date or attributes change" msgstr "Gerektiğinde &Boyut,Tarih veya özniteliklerini değiştir" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "tfrmoptionsautorefresh.cbwatchexcludedirs.caption" msgid "For the following &paths and their subdirectories:" msgstr "Aşağıdaki &yolları ve alt dizinleri için:" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption msgid "When &files are created, deleted or renamed" msgstr "" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption msgctxt "tfrmoptionsautorefresh.cbwatchonlyforeground.caption" msgid "When application is in the &background" msgstr "Güncellemeleri arka planda yap" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "tfrmoptionsautorefresh.gbautorefreshdisable.caption" msgid "Disable auto-refresh" msgstr "Otomatik yenilemeyi devre dışı bırak" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "tfrmoptionsautorefresh.gbautorefreshenable.caption" msgid "Refresh file list" msgstr "Dosya listesini yenile" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption msgid "Al&ways show tray icon" msgstr "" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption msgid "Automatically &hide unmounted devices" msgstr "" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "tfrmoptionsbehavior.cbminimizetotray.caption" msgid "Mo&ve icon to system tray when minimized" msgstr "Küçültüldüğünde simgeyi sistem tepsisine taşı" #: tfrmoptionsbehavior.cbonlyonce.caption msgid "A&llow only one copy of DC at a time" msgstr "" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "" #: tfrmoptionsbehavior.lbldrivesblacklist.caption msgid "Drives &blacklist" msgstr "" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption msgid "Cut &text to column width" msgstr "" #: tfrmoptionscolumnsview.cbgridhorzline.caption msgid "&Horizontal lines" msgstr "" #: tfrmoptionscolumnsview.cbgridvertline.caption msgid "&Vertical lines" msgstr "" #: tfrmoptionscolumnsview.chkautofillcolumns.caption msgid "A&uto fill columns" msgstr "" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "" #: tfrmoptionscolumnsview.lblautosizecolumn.caption msgid "Auto si&ze column:" msgstr "" #: tfrmoptionsconfiguration.btnconfigapply.caption msgctxt "tfrmoptionsconfiguration.btnconfigapply.caption" msgid "A&pply" msgstr "" #: tfrmoptionsconfiguration.btnconfigedit.caption msgctxt "tfrmoptionsconfiguration.btnconfigedit.caption" msgid "&Edit" msgstr "&Düzenle" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption msgid "Co&mmand line history" msgstr "" #: tfrmoptionsconfiguration.cbdirhistory.caption msgid "&Directory history" msgstr "" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption msgid "&File mask history" msgstr "" #: tfrmoptionsconfiguration.chksaveconfiguration.caption msgid "Sa&ve configuration" msgstr "" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption msgid "Searc&h/Replace history" msgstr "" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgctxt "tfrmoptionsconfiguration.gblocconfigfiles.caption" msgid "Location of configuration files" msgstr "Yapılandırma dosyasının konumu" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgctxt "tfrmoptionsconfiguration.gbsaveonexit.caption" msgid "Save on exit" msgstr "Çıkışta Kaydet" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgctxt "tfrmoptionsconfiguration.lblcmdlineconfigdir.caption" msgid "Set on command line" msgstr "Komut satırında ayarla" #: tfrmoptionsconfiguration.rbprogramdir.caption msgid "P&rogram directory (portable version)" msgstr "" #: tfrmoptionsconfiguration.rbuserhomedir.caption msgid "&User home directory" msgstr "" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption msgid "C&opy" msgstr "" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption msgctxt "tfrmoptionscustomcolumns.btndelcolumnsset.caption" msgid "&Delete" msgstr "&Sil" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption msgctxt "tfrmoptionscustomcolumns.btneditcolumnsset.caption" msgid "&Edit" msgstr "&Düzenle" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "tfrmoptionscustomcolumns.btnnewcolumnsset.caption" msgid "&New" msgstr "&Yeni" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "tfrmoptionscustomcolumns.cbbfilesystem.text" msgid "General" msgstr "Genel" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption msgid "Con&figure columns for file system:" msgstr "" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption msgid "&Show confirmation dialog after drop" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption msgid "Show &file system" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption msgid "Show fr&ee space" msgstr "" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption msgid "Show &label" msgstr "" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "" #: tfrmoptionseditorcolors.backgroundlabel.caption msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption" msgid "Bac&kground" msgstr "" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "" #: tfrmoptionseditorcolors.foregroundlabel.caption msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption msgctxt "tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption" msgid "Fo®round" msgstr "" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption msgid "&Text-mark" msgstr "" #: tfrmoptionseditorcolors.tbtnglobal.caption msgid "Use (and edit) &global scheme settings" msgstr "" #: tfrmoptionseditorcolors.tbtnlocal.caption msgid "Use &local scheme settings" msgstr "" #: tfrmoptionseditorcolors.textboldcheckbox.caption msgctxt "tfrmoptionseditorcolors.textboldcheckbox.caption" msgid "&Bold" msgstr "&Kalın" #: tfrmoptionseditorcolors.textboldradioinvert.caption msgctxt "tfrmoptionseditorcolors.textboldradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textboldradiooff.caption msgctxt "tfrmoptionseditorcolors.textboldradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textboldradioon.caption msgctxt "tfrmoptionseditorcolors.textboldradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textitaliccheckbox.caption msgctxt "tfrmoptionseditorcolors.textitaliccheckbox.caption" msgid "&Italic" msgstr "&Yatık" #: tfrmoptionseditorcolors.textitalicradioinvert.caption msgctxt "tfrmoptionseditorcolors.textitalicradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textitalicradiooff.caption msgctxt "tfrmoptionseditorcolors.textitalicradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textitalicradioon.caption msgctxt "tfrmoptionseditorcolors.textitalicradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption msgid "&Strike Out" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption msgctxt "tfrmoptionseditorcolors.textstrikeoutradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionseditorcolors.textunderlinecheckbox.caption msgctxt "tfrmoptionseditorcolors.textunderlinecheckbox.caption" msgid "&Underline" msgstr "&Alt çizgi" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "" #: tfrmoptionseditorcolors.textunderlineradiooff.caption msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "" #: tfrmoptionseditorcolors.textunderlineradioon.caption msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "" #: tfrmoptionsfileoperations.cbcopyconfirmation.caption msgid "Cop&y operation" msgstr "" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption msgid "&Delete operation" msgstr "" #: tfrmoptionsfileoperations.cbdeletetotrash.caption msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption msgid "D&elete to trash operation" msgstr "" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption msgid "D&rop readonly flag" msgstr "" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption msgid "&Move operation" msgstr "" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption msgid "&Search for part of file name" msgstr "" #: tfrmoptionsfileoperations.cbprocesscomments.caption msgid "&Process comments with files/folders" msgstr "" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption msgid "Select &file name without extension when renaming" msgstr "" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption msgid "Sho&w tab select panel in copy/move dialog" msgstr "" #: tfrmoptionsfileoperations.cbskipfileoperror.caption msgid "S&kip file operations errors and write them to log window" msgstr "" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "tfrmoptionsfileoperations.gbfilesearch.caption" msgid "File search" msgstr "Dosya ara" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "" #: tfrmoptionsfileoperations.lblbuffersize.caption msgid "&Buffer size for file operations (in KB):" msgstr "" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "" #: tfrmoptionsfileoperations.lblprogresskind.caption msgid "Show operations progress &initially in" msgstr "" #: tfrmoptionsfileoperations.lblwipepassnumber.caption msgid "&Number of wipe passes:" msgstr "" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption msgid "Use memory mapping for search te&xt in files" msgstr "" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption msgid "&Use stream for search text in files" msgstr "" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnbackcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "tfrmoptionsfilepanelscolors.btnbackcolor2.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btncursorcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "tfrmoptionsfilepanelscolors.btncursortext.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnforecolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnindbackcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnindcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "tfrmoptionsfilepanelscolors.btnmarkcolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption msgid "Use &Frame Cursor" msgstr "" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption msgid "Use &Gradient Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption msgid "U&se Inverted Selection" msgstr "" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgid "Drive Free Space Indicator" msgstr "" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "tfrmoptionsfilepanelscolors.gbexample.caption" msgid "Example" msgstr "Örnek" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption msgid "Bac&kground:" msgstr "" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption msgid "Backg&round 2:" msgstr "" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption msgid "C&ursor Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblcursortext.caption msgid "Cursor Te&xt:" msgstr "" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption msgid "&Brightness level of inactive panel" msgstr "" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption msgid "In&dicator Back Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblindcolor.caption msgid "&Indicator Fore Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption msgid "&Mark Color:" msgstr "" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption msgid "T&ext Color:" msgstr "" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption msgid "Do&n't load file list until a tab is activated" msgstr "" #: tfrmoptionsfilesviews.cbdirbrackets.caption msgid "S&how square brackets around directories" msgstr "" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption msgid "Hi&ghlight new and updated files" msgstr "" #: tfrmoptionsfilesviews.cblistfilesinthread.caption msgid "Load &file list in separate thread" msgstr "" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption msgid "Load icons af&ter file list" msgstr "" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption msgid "Show s&ystem and hidden files" msgstr "" #: tfrmoptionsfilesviews.cbspacemovesdown.caption msgid "&When selecting files with , move down to next file (as with )" msgstr "" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "" #: tfrmoptionsfilesviews.gbsorting.caption msgctxt "tfrmoptionsfilesviews.gbsorting.caption" msgid "Sorting" msgstr "Sınıflandır" #: tfrmoptionsfilesviews.lblcasesensitivity.caption msgid "Case s&ensitivity:" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgid "Incorrect format" msgstr "" #: tfrmoptionsfilesviews.lbldatetimeformat.caption msgid "&Date and time format:" msgstr "" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "" #: tfrmoptionsfilesviews.lblnewfilesposition.caption msgid "&Insert new files" msgstr "" #: tfrmoptionsfilesviews.lblsortfoldermode.caption msgid "So&rting directories:" msgstr "" #: tfrmoptionsfilesviews.lblsortmethod.caption msgid "&Sort method:" msgstr "" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption msgid "&Move updated files" msgstr "" #: tfrmoptionsfiletypescolors.btnaddcategory.caption msgctxt "tfrmoptionsfiletypescolors.btnaddcategory.caption" msgid "A&dd" msgstr "" #: tfrmoptionsfiletypescolors.btnapplycategory.caption msgctxt "tfrmoptionsfiletypescolors.btnapplycategory.caption" msgid "A&pply" msgstr "" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "tfrmoptionsfiletypescolors.btncategorycolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption msgctxt "tfrmoptionsfiletypescolors.btndeletecategory.caption" msgid "D&elete" msgstr "" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "tfrmoptionsfiletypescolors.btnsearchtemplate.hint" msgid "Template..." msgstr "Şablon..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption msgid "File types colors (sort by drag&&drop)" msgstr "" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption msgid "Category a&ttributes:" msgstr "" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption msgid "Category co&lor:" msgstr "" #: tfrmoptionsfiletypescolors.lblcategorymask.caption msgid "Category &mask:" msgstr "" #: tfrmoptionsfiletypescolors.lblcategoryname.caption msgid "Category &name:" msgstr "" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "tfrmoptionsfonts.btnseleditfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "tfrmoptionsfonts.btnsellogfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "tfrmoptionsfonts.btnselmainfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "tfrmoptionsfonts.btnselviewerbookfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "tfrmoptionsfonts.btnselviewfnt.caption" msgid "..." msgstr "..." #: tfrmoptionsfonts.lbleditorfont.caption msgid "&Editor font" msgstr "" #: tfrmoptionsfonts.lbllogfont.caption msgid "&Log font" msgstr "" #: tfrmoptionsfonts.lblmainfont.caption msgid "Main &font" msgstr "" #: tfrmoptionsfonts.lblviewerbookfont.caption msgid "Viewer&Book Font" msgstr "" #: tfrmoptionsfonts.lblviewerfont.caption msgid "&Viewer font" msgstr "" #: tfrmoptionshotkeys.btnaddhotkey.caption msgid "Add &hotkey" msgstr "" #: tfrmoptionshotkeys.btndeletehotkey.caption msgid "&Delete hotkey" msgstr "" #: tfrmoptionshotkeys.btnedithotkey.caption msgid "&Edit hotkey" msgstr "" #: tfrmoptionshotkeys.lbfilter.caption msgid "&Filter" msgstr "" #: tfrmoptionshotkeys.lblcategories.caption msgid "C&ategories:" msgstr "" #: tfrmoptionshotkeys.lblcommands.caption msgid "Co&mmands:" msgstr "" #: tfrmoptionshotkeys.lblscfiles.caption msgid "&Shortcut files:" msgstr "" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "tfrmoptionshotkeys.stghotkeys.columns[0].title.caption" msgid "Hotkey" msgstr "Kısayol tuşu" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "tfrmoptionshotkeys.stghotkeys.columns[1].title.caption" msgid "Parameters" msgstr "Değişkenler" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption msgid "Controls" msgstr "" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "tfrmoptionsicons.cbiconsexclude.caption" msgid "For the following &paths and their subdirectories:" msgstr "Aşağıdaki &yolları ve alt dizinleri için:" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "tfrmoptionsicons.cbiconsinmenussize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption msgid "Show o&verlay icons, e.g. for links" msgstr "" #: tfrmoptionsicons.cbiconssize.text msgctxt "tfrmoptionsicons.cbiconssize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "" #: tfrmoptionsicons.gbiconssize.caption msgid " Icon size " msgstr "" #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "tfrmoptionsicons.gbshowiconsmode.caption" msgid " Show icons to the left of the filename " msgstr "Dosya adının solundaki simgeleri göster" #: tfrmoptionsicons.rbiconsshowall.caption msgctxt "tfrmoptionsicons.rbiconsshowall.caption" msgid "A&ll" msgstr "&Tümü" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "tfrmoptionsicons.rbiconsshowallandexe.caption" msgid "All associated + &EXE/LNK (slow)" msgstr "Tüm ilişkili+&exe/LNK(yavaş)" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "tfrmoptionsicons.rbiconsshownone.caption" msgid "&No icons" msgstr "&Simge yok" #: tfrmoptionsicons.rbiconsshowstandard.caption msgid "Only &standard icons" msgstr "" #: tfrmoptionsignorelist.btnaddsel.caption msgid "A&dd selected names" msgstr "" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "tfrmoptionsignorelist.btnaddselwithpath.caption" msgid "Add selected names with &full path" msgstr "Seçilen isimler ile &tam yolu ekle" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "tfrmoptionsignorelist.chkignoreenable.caption" msgid "&Ignore (don't show) the following files and folders:" msgstr "&Aşağıdaki dosya ve klasörleri Yoksay (görmezden gel):" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "tfrmoptionsignorelist.lblsavein.caption" msgid "&Save in:" msgstr "&Kaydet:" #: tfrmoptionskeyboard.cblynxlike.caption msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "" #: tfrmoptionskeyboard.gbtyping.caption msgid "Typing" msgstr "" #: tfrmoptionskeyboard.lblalt.caption msgid "Alt+L&etters" msgstr "" #: tfrmoptionskeyboard.lblctrlalt.caption msgid "Ctrl+Alt+Le&tters" msgstr "" #: tfrmoptionskeyboard.lblnomodifier.caption msgid "&Letters" msgstr "" #: tfrmoptionslayout.cbflatdiskpanel.caption msgctxt "tfrmoptionslayout.cbflatdiskpanel.caption" msgid "&Flat buttons" msgstr "" #: tfrmoptionslayout.cbflatinterface.caption msgid "Flat i&nterface" msgstr "" #: tfrmoptionslayout.cbflattoolbar.caption msgctxt "tfrmoptionslayout.cbflattoolbar.caption" msgid "Flat b&uttons" msgstr "Yassı düğmeler" #: tfrmoptionslayout.cbfreespaceind.caption msgid "Show fr&ee space indicator on drive label" msgstr "" #: tfrmoptionslayout.cblogwindow.caption msgid "Show lo&g window" msgstr "" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "tfrmoptionslayout.cbpanelofoperations.caption" msgid "Show panel of operation in background" msgstr "Panel işlemlerini arka planda göster" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "tfrmoptionslayout.cbproginmenubar.caption" msgid "Show common progress in menu bar" msgstr "Genel ilerlemeyi menü çubuğunda göster" #: tfrmoptionslayout.cbshowcmdline.caption msgid "Show command l&ine" msgstr "" #: tfrmoptionslayout.cbshowcurdir.caption msgid "Show current director&y" msgstr "" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "tfrmoptionslayout.cbshowdiskpanel.caption" msgid "Show &drive buttons" msgstr "Göster &sürücü düğmeleri" #: tfrmoptionslayout.cbshowdrivefreespace.caption msgid "Show free s&pace label" msgstr "" #: tfrmoptionslayout.cbshowdriveslistbutton.caption msgid "Show drives list bu&tton" msgstr "" #: tfrmoptionslayout.cbshowkeyspanel.caption msgid "Show function &key buttons" msgstr "" #: tfrmoptionslayout.cbshowmainmenu.caption msgid "Show &main menu" msgstr "" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "tfrmoptionslayout.cbshowmaintoolbar.caption" msgid "Show &button bar" msgstr "Düğme çubuğunu &göster" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption msgid "Show short free space &label" msgstr "" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "tfrmoptionslayout.cbshowstatusbar.caption" msgid "Show &status bar" msgstr "Durum çubuğunu &göster" #: tfrmoptionslayout.cbshowtabheader.caption msgid "S&how tabstop header" msgstr "" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "tfrmoptionslayout.cbshowtabs.caption" msgid "Sho&w folder tabs" msgstr "Klasör sekmelerini göster" #: tfrmoptionslayout.cbtermwindow.caption msgid "Show te&rminal window" msgstr "" #: tfrmoptionslayout.cbtwodiskpanels.caption msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "tfrmoptionslayout.gbscreenlayout.caption" msgid " Screen layout " msgstr "Ekran düzeni" #: tfrmoptionslog.cblogarcop.caption msgid "&Pack/Unpack" msgstr "" #: tfrmoptionslog.cblogcpmvln.caption msgid "Cop&y/Move/Create link/symlink" msgstr "" #: tfrmoptionslog.cblogdelete.caption msgctxt "tfrmoptionslog.cblogdelete.caption" msgid "&Delete" msgstr "&Sil" #: tfrmoptionslog.cblogdirop.caption msgid "Crea&te/Delete directories" msgstr "" #: tfrmoptionslog.cblogerrors.caption msgctxt "tfrmoptionslog.cblogerrors.caption" msgid "Log &errors" msgstr "Günlük &hataları" #: tfrmoptionslog.cblogfile.caption msgid "C&reate a log file:" msgstr "" #: tfrmoptionslog.cbloginfo.caption msgid "Log &information messages" msgstr "" #: tfrmoptionslog.cblogsuccess.caption msgctxt "tfrmoptionslog.cblogsuccess.caption" msgid "Log &successful operations" msgstr "Günlük &başarılı işlemler" #: tfrmoptionslog.cblogvfs.caption msgid "&File system plugins" msgstr "" #: tfrmoptionslog.gblogfile.caption msgctxt "tfrmoptionslog.gblogfile.caption" msgid "File operation log file" msgstr "Günlük dosyası İşlemi" #: tfrmoptionslog.gblogfileop.caption msgid "Log operations" msgstr "" #: tfrmoptionslog.gblogfilestatus.caption msgid "Operation status" msgstr "" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "" #: tfrmoptionsmisc.chkshowwarningmessages.caption msgid "Show &warning messages (\"OK\" button only)" msgstr "" #: tfrmoptionsmisc.chkthumbsave.caption msgid "&Save thumbnails in cache" msgstr "" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "tfrmoptionsmisc.dblthumbnails.caption" msgid "Thumbnails" msgstr "" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "tfrmoptionsmisc.lblthumbseparator.caption" msgid "X" msgstr "X" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "" #: tfrmoptionsmouse.cbselectionbymouse.caption msgid "&Selection by mouse" msgstr "" #: tfrmoptionsmouse.gbscrolling.caption msgctxt "tfrmoptionsmouse.gbscrolling.caption" msgid "Scrolling" msgstr "Kaydırma" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "" #: tfrmoptionsmouse.lblmousemode.caption msgid "&Mode:" msgstr "" #: tfrmoptionsmouse.rbscrolllinebyline.caption msgid "&Line by line" msgstr "" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption msgid "Line by line &with cursor movement" msgstr "" #: tfrmoptionsmouse.rbscrollpagebypage.caption msgid "&Page by page" msgstr "" #: tfrmoptionsplugins.btnaddplugin.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "Ekle" #: tfrmoptionsplugins.btnconfigplugin.caption #, fuzzy #| msgid "Configure" msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "Yapılandırma" #: tfrmoptionsplugins.btnenableplugin.caption #, fuzzy #| msgid "Enable" msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "Etkinleştir" #: tfrmoptionsplugins.btnremoveplugin.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "Kaldır" #: tfrmoptionsplugins.btntweakplugin.caption #, fuzzy #| msgid "Tweak" msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "Ayarla" #: tfrmoptionsplugins.lbldsxdescription.caption #, fuzzy #| msgid "Search plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "Alternatif arama algoritmaları kullanmak için arama eklentilerine veya harici araçlara izin ver(\"yerini belirle\",vb.gibi)" #: tfrmoptionsplugins.lblwcxdescription.caption #, fuzzy #| msgid "Packer plugins are used to work with archives." msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "Arşivler ile çalışmak için sıkıştırma eklentileri kullanılabilir." #: tfrmoptionsplugins.lblwdxdescription.caption #, fuzzy #| msgid "Content plugins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "İçerik eklentilerine izin ver, genişletilmiş dosya ayrıntıları gibi mp3 etiketleri veya resim özniteliklerini dosya listelerinde görüntülemek için veya onları aramada kullan ve çoklu-yeniden adlandırma aracı" #: tfrmoptionsplugins.lblwfxdescription.caption #, fuzzy #| msgid "File system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "Dosya sistemi eklentileri işletim sistemi tarafından ulaşılmaz disklere veya (Palm/PocketPC) gibi harici cihazlara erişim sağlar" #: tfrmoptionsplugins.lblwlxdescription.caption msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "Görüntüleyici eklentilerine izin ver, dosya tipleri,resimler,elektronik tablolar, veritabanları vb. gibi.gösterilmesini sağlar(F3, Ctrl+Q)" #: tfrmoptionsplugins.stgplugins.columns[0].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[0].title.caption" msgid "Active" msgstr "Etkin" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[1].title.caption" msgid "Plugin" msgstr "Eklenti" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[2].title.caption" msgid "Registered for" msgstr "Kayıtlı" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "tfrmoptionsplugins.stgplugins.columns[3].title.caption" msgid "File name" msgstr "Dosya Adı" #: tfrmoptionsplugins.tsdsx.caption #, fuzzy #| msgid "Search plugins (.DSX)" msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "Arama eklentileri(.DSX)" #: tfrmoptionsplugins.tswcx.caption #, fuzzy #| msgid "Packer plugins (.WCX)" msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "Sıkıştırma eklentileri (.WCX)" #: tfrmoptionsplugins.tswdx.caption #, fuzzy #| msgid "Content plugins (.WDX)" msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "İçerik eklentileri (.WDX)" #: tfrmoptionsplugins.tswfx.caption #, fuzzy #| msgid "File system plugins (.WFX)" msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "Dosya sistemi eklentileri (.WFX)" #: tfrmoptionsplugins.tswlx.caption #, fuzzy #| msgid "Viewer plugins (.WLX)" msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "Görüntüleyici eklentileri(.WLX)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "tfrmoptionsquicksearchfilter.cbexactbeginning.caption" msgid "&Beginning (name must start with first typed character)" msgstr "&Başlangıç (Adı ilk yazdığınız karakterle başlamalıdır)" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "tfrmoptionsquicksearchfilter.cbexactending.caption" msgid "En&ding (last character before a typed dot . must match)" msgstr "&Bitiş (Noktadan önceki son karakter ile . uyumlu olmalıdır)" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "tfrmoptionsquicksearchfilter.cgpoptions.caption" msgid "Options" msgstr "Seçenekler" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption msgid "Exact name match" msgstr "" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "tfrmoptionstabs.cbtabsactivateonclick.caption" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "Hedef &paneli etkinleştir onun sekmelerinden birisini tıklayarak" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "tfrmoptionstabs.cbtabsalwaysvisible.caption" msgid "&Show tab header also when there is only one tab" msgstr "&Sadece bir sekme olduğunda da sekme başlığı göster" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption msgid "Con&firm close all tabs" msgstr "" #: tfrmoptionstabs.cbtabslimitoption.caption msgctxt "tfrmoptionstabs.cbtabslimitoption.caption" msgid "&Limit tab title length to" msgstr "&Sekme başlık(alınlık) uzunluğunu sınırla" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "tfrmoptionstabs.cbtabslockedasterisk.caption" msgid "Show locked tabs &with an asterisk *" msgstr "Kilitli sekmeleri &yıldız işareti * ile göster" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "tfrmoptionstabs.cbtabsmultilines.caption" msgid "&Tabs on multiple lines" msgstr "&Çoklu satır sekmeleri" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "tfrmoptionstabs.cbtabsopenforeground.caption" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Ctrl+&Up ön planda yeni sekmede açar" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "tfrmoptionstabs.cbtabsopennearcurrent.caption" msgid "Open &new tabs near current tab" msgstr "Geçerli sekmenin yanında yeni bir sekme ekle" #: tfrmoptionstabs.cbtabsshowclosebutton.caption msgid "Show ta&b close button" msgstr "" #: tfrmoptionstabs.gbtabs.caption msgctxt "tfrmoptionstabs.gbtabs.caption" msgid "Folder tabs headers" msgstr "Klasör sekmeleri başlıkları" #: tfrmoptionstabs.lblchar.caption msgctxt "tfrmoptionstabs.lblchar.caption" msgid "characters" msgstr "karakterler" #: tfrmoptionstabs.lbltabsposition.caption msgid "Ta&bs position" msgstr "" #: tfrmoptionsterminal.lblruninterm.caption msgid "Run in &terminal:" msgstr "" #: tfrmoptionsterminal.lblrunterm.caption msgid "Run t&erminal:" msgstr "" #: tfrmoptionstoolbar.btnclonebutton.caption msgid "C&lone button" msgstr "" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "tfrmoptionstoolbar.btndeletebutton.caption" msgid "&Delete" msgstr "&Sil" #: tfrmoptionstoolbar.btnedithotkey.caption msgid "Edit hot&key" msgstr "" #: tfrmoptionstoolbar.btninsertbutton.caption msgctxt "tfrmoptionstoolbar.btninsertbutton.caption" msgid "&Insert new button" msgstr "&Yeni düğme ekle" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "tfrmoptionstoolbar.btnopenfile.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "tfrmoptionstoolbar.btnopenicon.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnremovehotkey.caption msgid "Remove hotke&y" msgstr "" #: tfrmoptionstoolbar.cbflatbuttons.caption msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "" #: tfrmoptionstoolbar.gbgroupbox.caption msgctxt "tfrmoptionstoolbar.gbgroupbox.caption" msgid "Appearance" msgstr "Görünüm" #: tfrmoptionstoolbar.lblbarsize.caption msgid "&Bar size:" msgstr "" #: tfrmoptionstoolbar.lblexternalcommand.caption msgid "Comman&d:" msgstr "" #: tfrmoptionstoolbar.lblexternalparameters.caption msgid "Parameter&s:" msgstr "" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "" #: tfrmoptionstoolbar.lbliconfile.caption msgid "Ico&n:" msgstr "" #: tfrmoptionstoolbar.lbliconsize.caption msgid "Icon si&ze:" msgstr "" #: tfrmoptionstoolbar.lblinternalcommand.caption msgid "Co&mmand:" msgstr "" #: tfrmoptionstoolbar.lblinternalparameters.caption msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "Değişkenler" #: tfrmoptionstoolbar.lblstartpath.caption msgid "Start pat&h:" msgstr "" #: tfrmoptionstoolbar.lbltooltip.caption msgctxt "tfrmoptionstoolbar.lbltooltip.caption" msgid "&Tooltip:" msgstr "&Araç İpucu" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption msgid "&Keep terminal window open after executing program" msgstr "" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption msgid "&Execute in terminal" msgstr "" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption msgid "&Use external program" msgstr "" #: tfrmoptionstoolbase.lbltoolsparameters.caption msgid "A&dditional parameters" msgstr "" #: tfrmoptionstoolbase.lbltoolspath.caption msgid "&Path to program to execute" msgstr "" #: tfrmoptionstooltips.btnaddfields.caption #, fuzzy #| msgid "Add" msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "Ekle" #: tfrmoptionstooltips.btnapplyfields.caption #, fuzzy #| msgid "Apply" msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "Uygula" #: tfrmoptionstooltips.btndeletefields.caption #, fuzzy #| msgid "Delete" msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "&Sil" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Şablon..." #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "Dosya türüne göre özel alanlar" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "Araç İpucu'nu göster (Not sözleri)" #: tfrmoptionstooltips.lblfieldslist.caption #, fuzzy #| msgid "Category hint:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "Sınıf ipucu:" #: tfrmoptionstooltips.lblfieldsmask.caption #, fuzzy #| msgid "Category mask:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "Sınıf maskesi" #: tfrmoptionstooltips.lblfieldsname.caption #, fuzzy #| msgid "Category name:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "Sınıf adı" #: tfrmoptionstooltips.rbtooltipallfiles.caption #, fuzzy #| msgid "Show tool tip for all files in file panel" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "Araç İpucu'nu göster (Not sözleri) dosya panelindeki tüm dosyalar için" #: tfrmoptionstooltips.rbtooltipnone.caption #, fuzzy #| msgid "Don't show" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "Gösterme" #: tfrmoptionstooltips.rbtooltiponlylarge.caption #, fuzzy #| msgid "Show tool tip for files in file panel if truncated" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "Dosyalar için araç ipucu göster(Not sözleri),dosya adları kısaltılmış ise" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "tfrmoptionsviewer.btnbackviewercolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "tfrmoptionsviewer.btnfontviewercolor.caption" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.gbviewerbookmode.caption msgctxt "tfrmoptionsviewer.gbviewerbookmode.caption" msgid "Viewer Book Mode" msgstr "Kitap Modu Görünümü" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "tfrmoptionsviewer.gbviewerexample.caption" msgid "Example" msgstr "Örnek" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption msgid "&Background color in book viewer" msgstr "" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption msgid "&Font color in book viewer" msgstr "" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption msgid "&Number of columns in book viewer" msgstr "" #: tfrmpackdlg.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmpackdlg.btnconfig.caption #, fuzzy #| msgid "&Configure" msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "&Yapılandır" #: tfrmpackdlg.btnhelp.caption #, fuzzy #| msgid "Help" msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Yardım" #: tfrmpackdlg.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "TAMAM" #: tfrmpackdlg.caption msgctxt "tfrmpackdlg.caption" msgid "Pack files" msgstr "Sıkıştırılmış dosyalar" #: tfrmpackdlg.cbcreateseparatearchives.caption #, fuzzy #| msgid "Create separate archives, o&ne per selected file/dir" msgid "C&reate separate archives, one per selected file/dir" msgstr "Ayrı arşiv oluştur, &Bir seçili dosya/dizin başına" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "Kendi kendine &açılan arşiv oluştur(SFX)" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "Şifrele&mek" #: tfrmpackdlg.cbmovetoarchive.caption #, fuzzy #| msgid "M&ove to archive" msgid "Mo&ve to archive" msgstr "&Arşive taşı" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "&Çoklu disk arşivi" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "=>" #: tfrmpackdlg.cbputintarfirst.caption #, fuzzy #| msgid "Put in the TAR archive first" msgid "P&ut in the TAR archive first" msgstr "İlk TAR arşivi yerleştir" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "Ayrıca sıkıştırılmış yol adları (sadece özyineleme)" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "Dosya;Sıkıştırma dosya(lar)ına " #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "Sıkıştırıcı" #: tfrmpackinfodlg.btnclose.caption #, fuzzy #| msgid "Close" msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "Kapat" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "&Tümünü aç ve yürüt" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "&Aç ve yürüt" #: tfrmpackinfodlg.caption msgctxt "tfrmpackinfodlg.caption" msgid "Properties of packed file" msgstr "Sıkıştırılmış dosyanın Özellikleri" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "Öznitelikleri:" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "Sıkıştırma oranı:" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "Tarihi:" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "Yöntemi:" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "Orijinal boyutu" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "Dosya:" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "Sıkıştırılmış boyutu:" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "Sıkıştırıcı:" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "Zaman:" #: tfrmquicksearch.btncancel.caption msgctxt "tfrmquicksearch.btncancel.caption" msgid "X" msgstr "X" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "" #: tfrmquicksearch.tglfilter.caption msgctxt "tfrmquicksearch.tglfilter.caption" msgid "Filter" msgstr "Süzgeç" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "tfrmselecttextrange.btppanel.cancelbutton.caption" msgid "Cancel" msgstr "İptal" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "tfrmselecttextrange.btppanel.closebutton.caption" msgid "&Close" msgstr "&Kapat" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "tfrmselecttextrange.btppanel.helpbutton.caption" msgid "&Help" msgstr "&Yardım" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "tfrmselecttextrange.btppanel.okbutton.caption" msgid "&OK" msgstr "&TAMAM" #: tfrmselecttextrange.lblselecttext.caption msgid "&Select the characters to insert:" msgstr "" #: tfrmsetfileproperties.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "&TAMAM" #: tfrmsetfileproperties.caption msgctxt "tfrmsetfileproperties.caption" msgid "Change attributes" msgstr "Öznitelikleri Değiştir" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Yapışkan" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "Arşiv" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "Oluşturulan:" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "Gizli" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "Giriş:" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "Değişiklik yap" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "Salt okunur" #: tfrmsetfileproperties.chkrecursive.caption #, fuzzy #| msgid "Recursive" msgid "Including subfolders" msgstr "Özyinelemeli" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "Sistem" #: tfrmsetfileproperties.gbtimesamp.caption msgid "Timestamp properties" msgstr "Zaman Damgası özellikleri(geçerli tarih ve saat, ayarlı değerleri)" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Öznitelikler" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Öznitelikler" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Bit:" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Grup" #: tfrmsetfileproperties.lblattrinfo.caption #, fuzzy #| msgid "(gray field means unchanged value)\"" msgid "(gray field means unchanged value)" msgstr "(gri alan değiştirilmemiş değer anlamına gelir)" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Diğer" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Sahibi" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Metin gösterimi" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Yürüt" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Sekizli:" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Okuma" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Yazma" #: tfrmsplitter.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "TAMAM" #: tfrmsplitter.caption msgctxt "tfrmsplitter.caption" msgid "Splitter" msgstr "Ayırıcı" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664B - 3.5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "Dosya Adı" #: tfrmsplitter.grbxsize.caption msgid "Size and number of parts" msgstr "Boyut ve parça sayıları" #: tfrmsplitter.lbdirtarget.caption #, fuzzy #| msgid "Directory target" msgid "Directory &target" msgstr "Hedef dizin" #: tfrmsplitter.lbfilesource.caption #, fuzzy #| msgid "File source" msgid "File &source" msgstr "Dosya kaynağı" #: tfrmsplitter.lblnumberparts.caption #, fuzzy #| msgid "Number of parts" msgid "&Number of parts" msgstr "Parça sayısı" #: tfrmsplitter.rbtngigab.caption #, fuzzy #| msgid "Gigabytes" msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "Gigabayt" #: tfrmsplitter.rbtnkilob.caption #, fuzzy #| msgid "Kilobytes" msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "Kilobayt" #: tfrmsplitter.rbtnmegab.caption #, fuzzy #| msgid "Megabytes" msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "Megabayt" #: tfrmsymlink.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&TAMAM" #: tfrmsymlink.caption msgid "Create symbolic link" msgstr "Sembolik bağlantı oluştur" #: tfrmsymlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Mevcut hedef;bağlantı noktası ile gösterilen" #: tfrmsymlink.lbllinktocreate.caption #, fuzzy #| msgid "Link name" msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Bağlantı adı" #: tfrmtweakplugin.btnadd.caption #, fuzzy #| msgid "Add new" msgid "A&dd new" msgstr "Yeni ekle" #: tfrmtweakplugin.btncancel.caption #, fuzzy #| msgid "Cancel" msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "İptal" #: tfrmtweakplugin.btnchange.caption #, fuzzy #| msgid "Change" msgid "C&hange" msgstr "Değiştir" #: tfrmtweakplugin.btndefault.caption #, fuzzy #| msgid "Default" msgid "De&fault" msgstr "Varsayılan" #: tfrmtweakplugin.btnok.caption #, fuzzy #| msgid "OK" msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "TAMAM" #: tfrmtweakplugin.btnremove.caption #, fuzzy #| msgid "Remove" msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "Kaldır" #: tfrmtweakplugin.caption msgctxt "tfrmtweakplugin.caption" msgid "Tweak plugin" msgstr "Ayarlama eklentisi" #: tfrmtweakplugin.cbpk_caps_by_content.caption #, fuzzy #| msgid "Detect archive type by content\"" msgid "De&tect archive type by content" msgstr "Arşiv türü içeriğini algıla" #: tfrmtweakplugin.cbpk_caps_delete.caption #, fuzzy #| msgid "Can delete files" msgid "Can de&lete files" msgstr "Dosyaları silebilirsiniz" #: tfrmtweakplugin.cbpk_caps_encrypt.caption #, fuzzy #| msgid "Supports encryption" msgid "Supports e&ncryption" msgstr "Şifrelemeyi destekler" #: tfrmtweakplugin.cbpk_caps_hide.caption #, fuzzy #| msgid "Show as normal files (hide packer icon)" msgid "Sho&w as normal files (hide packer icon)" msgstr "Normal dosyalar olarak göster(Sıkıştırıcı simgesini gizle)" #: tfrmtweakplugin.cbpk_caps_mempack.caption #, fuzzy #| msgid "Supports packing in memory" msgid "Supports pac&king in memory" msgstr "Bellek içi sıkıştırmayı destekler" #: tfrmtweakplugin.cbpk_caps_modify.caption #, fuzzy #| msgid "Can modify exisiting archives" msgid "Can &modify exisiting archives" msgstr "Var olan arşivi değiştirebilirsiniz" #: tfrmtweakplugin.cbpk_caps_multiple.caption #, fuzzy #| msgid "Archive can contain multiple files" msgid "&Archive can contain multiple files" msgstr "Arşiv birden fazla dosya içerebilir" #: tfrmtweakplugin.cbpk_caps_new.caption #, fuzzy #| msgid "Can create new archives" msgid "Can create new archi&ves" msgstr "Yeni arşivler oluşturabilirsiniz" #: tfrmtweakplugin.cbpk_caps_options.caption #, fuzzy #| msgid "Supports the options dialogbox" msgid "S&upports the options dialogbox" msgstr "Seçenekler iletişim kutusunu destekler" #: tfrmtweakplugin.cbpk_caps_searchtext.caption #, fuzzy #| msgid "Allow searching for text in archives" msgid "Allow searchin&g for text in archives" msgstr "Metin arşivlerinde arama izni verir" #: tfrmtweakplugin.lbldescription.caption #, fuzzy #| msgid "Description:" msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "Tanım:" #: tfrmtweakplugin.lbldetectstr.caption #, fuzzy #| msgid "Detect string:" msgid "D&etect string:" msgstr "Dizi algıla:" #: tfrmtweakplugin.lblextension.caption #, fuzzy #| msgid "Extension:" msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "Uzantı:" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "Etiketler" #: tfrmtweakplugin.lblname.caption #, fuzzy #| msgid "Name:" msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "Adı:" #: tfrmtweakplugin.lblplugin.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "Eklenti" #: tfrmtweakplugin.lblplugin1.caption #, fuzzy #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "Eklenti" #: tfrmviewer.actabout.caption msgctxt "tfrmviewer.actabout.caption" msgid "About Viewer..." msgstr "Görüntüleyici Hakkında" #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "" #: tfrmviewer.actcopyfile.caption msgctxt "tfrmviewer.actcopyfile.caption" msgid "Copy File" msgstr "" #: tfrmviewer.actcopyfile.hint msgctxt "tfrmviewer.actcopyfile.hint" msgid "Copy File" msgstr "" #: tfrmviewer.actdeletefile.caption msgctxt "tfrmviewer.actdeletefile.caption" msgid "Delete File" msgstr "" #: tfrmviewer.actdeletefile.hint msgctxt "tfrmviewer.actdeletefile.hint" msgid "Delete File" msgstr "" #: tfrmviewer.actloadnextfile.caption msgctxt "tfrmviewer.actloadnextfile.caption" msgid "&Next" msgstr "&Sonraki" #: tfrmviewer.actloadnextfile.hint msgid "Load Next File" msgstr "" #: tfrmviewer.actloadprevfile.caption msgctxt "tfrmviewer.actloadprevfile.caption" msgid "&Previous" msgstr "&Önceki" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "" #: tfrmviewer.actmirror.caption msgctxt "tfrmviewer.actmirror.caption" msgid "Mirror" msgstr "Yansıt(Aynala)" #: tfrmviewer.actmirror.hint msgctxt "tfrmviewer.actmirror.hint" msgid "Mirror" msgstr "Yansıt(Aynala)" #: tfrmviewer.actmovefile.caption msgctxt "tfrmviewer.actmovefile.caption" msgid "Move File" msgstr "" #: tfrmviewer.actmovefile.hint msgctxt "tfrmviewer.actmovefile.hint" msgid "Move File" msgstr "" #: tfrmviewer.actreload.caption msgctxt "tfrmviewer.actreload.caption" msgid "Reload" msgstr "Güncelle" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "" #: tfrmviewer.actrotate180.caption msgctxt "tfrmviewer.actrotate180.caption" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate180.hint msgctxt "tfrmviewer.actrotate180.hint" msgid "Rotate 180" msgstr "" #: tfrmviewer.actrotate270.caption msgctxt "tfrmviewer.actrotate270.caption" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate270.hint msgctxt "tfrmviewer.actrotate270.hint" msgid "Rotate 270" msgstr "" #: tfrmviewer.actrotate90.caption msgctxt "tfrmviewer.actrotate90.caption" msgid "Rotate 90" msgstr "" #: tfrmviewer.actrotate90.hint msgctxt "tfrmviewer.actrotate90.hint" msgid "Rotate 90" msgstr "" #: tfrmviewer.actsaveas.caption msgctxt "tfrmviewer.actsaveas.caption" msgid "Save As..." msgstr "Farklı Kaydet ..." #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "" #: tfrmviewer.actstretchimage.caption msgctxt "tfrmviewer.actstretchimage.caption" msgid "Stretch" msgstr "Çek-Düzelt" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "- 90" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "Kopyala" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "Kopyala" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "Kırp" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "&Sil" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "&Sil" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "Tam Ekran" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "||" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "S" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "Vurgula" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "Yansıt(Aynala)" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "Taşı" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "Taşı" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "||" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "Boya" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "<||" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "Kırmızı göz" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "Yeniden boyutlandır" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "Geri al" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "Yakınlaştır" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "Uzaklaştır" #: tfrmviewer.caption msgctxt "tfrmviewer.caption" msgid "Viewer" msgstr "Göster" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Resimleri otomatik olarak sırayla göster(Slayt Gösterisi)" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "Kalem" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "Vurgula" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "Boya" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Resimleri otomatik olarak sırayla göster(Slayt Gösterisi)" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "Göster" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "0x0" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "+ 180" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "- 90" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "+ 90" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "Hakkında" #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "Ikili olarak göster&Bin dosyaları[0,1]" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "Panoya Kopyala" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Düzenle" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "&Kodlama" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "Çık&ış" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "&Dosya" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "Tam Ekran" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "Teknik çizim" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "&Hex olarak göster(onaltılı sayı sistemi)" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "&Resim" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "Kitap olarak &göster" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "Yansıt(Aynala)" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "Eklentiler" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "Önizleme" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "Yazdır..." #: tfrmviewer.mirotate.caption msgid "Rotate" msgstr "Döndür" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "Kaydet" #: tfrmviewer.misaveas.caption msgctxt "tfrmviewer.misaveas.caption" msgid "Save As..." msgstr "Farklı Kaydet ..." #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "Ekran görüntüsü" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "Ara" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "Sonrakini ara" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "Öncekini ara" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "Tümünü Seç" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.mistretch.caption msgctxt "tfrmviewer.mistretch.caption" msgid "Stretch" msgstr "Çek-Düzelt" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "Metin olarak &göster" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "&Göster" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "Kaydırma metin &olarak göster" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "Yakınlaştır" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "Uzaklaştır" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "Panoya kopyala" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "Tümünü Seç" #: tfrmviewoperations.btnstartpause.caption msgctxt "tfrmviewoperations.btnstartpause.caption" msgid "&Start" msgstr "&Başlat" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "" #: tfrmviewoperations.caption msgctxt "tfrmviewoperations.caption" msgid "File operations" msgstr "Dosya işlemleri" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "" #: tfrmviewoperations.mnucanceloperation.caption #, fuzzy #| msgid "Cancel" msgctxt "tfrmviewoperations.mnucanceloperation.caption" msgid "Cancel" msgstr "İptal" #: tfrmviewoperations.mnucancelqueue.caption #, fuzzy #| msgid "Cancel" msgctxt "tfrmviewoperations.mnucancelqueue.caption" msgid "Cancel" msgstr "İptal" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "tfrmviewoperations.mnuoperationshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "" #: tfrmviewoperations.mnuqueue.caption msgctxt "tfrmviewoperations.mnuqueue.caption" msgid "Queue" msgstr "" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "tfrmviewoperations.mnuqueueshowdetached.caption" msgid "Show in detached window" msgstr "" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption #, fuzzy #| msgid "When file exists" msgctxt "tmultiarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Dosya mevcutsa" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption #, fuzzy #| msgid "When file exists" msgctxt "twcxarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Dosya mevcutsa" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Dosya mevcutsa" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "" #: ulng.rscolattr msgid "Attr" msgstr "Öznitelik" #: ulng.rscoldate msgid "Date" msgstr "Tarih" #: ulng.rscolext msgid "Ext" msgstr "Dahili" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "Adı" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "Boyutu" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "Değişiklik sayısı:" #: ulng.rsconfcolalign msgid "Align" msgstr "Hizala" #: ulng.rsconfcolcaption msgid "Caption" msgstr "Altbaşlık" #: ulng.rsconfcolconfig msgid "Config" msgstr "Yapılandır" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "&Sil" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "Alan içeriği" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "Taşı" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "Genişlik" #: ulng.rsconfcustheader msgid "Customize column" msgstr "Sütunları Özelleştir" #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "Kopyala (%d) %s" #: ulng.rsdlgallopcomplete #, fuzzy #| msgid "All operations is complete" msgid "All operations completed" msgstr "Tüm işlemler tamamlandı" #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "Tüm işlemlerin ilerleme durumu %d %%" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "Iptal &et" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "&Tümü" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "&Ekle" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "&İptal" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "İçine &koplaya" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "Hepsini içine &kopyala" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "" #: ulng.rsdlgbuttonno msgid "&No" msgstr "&Hayır" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "&Hiçbiri" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "&TAMAM" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "&Üzerine yaz" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "Tüm dosyaların &üzerine yaz" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "&Yeniden dene" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "&Atla" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "Tümünü &Atla" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "&Evet" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "Dosya ve klasörleri hesapla" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "Sağlama toplamı hesapla..." #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "Sağlama toplamı doğrula..." #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "Dosya(ları) Kopyala" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "Dosya(ları) Sil" #: ulng.rsdlgmv msgid "Move file(s)" msgstr "Dosya(ları) Taşı" #: ulng.rsdlgoppause #, fuzzy #| msgid "Pause" msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "Duraklat" #: ulng.rsdlgopstart #, fuzzy #| msgid "Start" msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "Başlat" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "Hız %s/s" #: ulng.rsdlgspeedtime msgid "Speed %s/s, time remaining %s" msgstr "Hız %s/s, kalan süre %s" #: ulng.rsdlgsplit msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "&Parçala" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "Dosya(ları) tam sil(üzerine yazarak kurtarılamayacak şekilde sil)" #: ulng.rsdrivenolabel msgid "" msgstr "" #: ulng.rsdrivenomedia msgid "" msgstr "" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Double Commander İç metin editörü" #: ulng.rseditnewfile msgid "new.txt" msgstr "Yeni.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "Dosyaadı:" #: ulng.rseditnewopen msgid "Open file" msgstr "Dosya aç" #: ulng.rseditsearchback msgid "&Backward" msgstr "&Geri" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "Ara" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "&İleri" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "Değiştir" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "" #: ulng.rsfileopfileexistsoptions msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "" #: ulng.rsfileopsetpropertyerroroptions msgid "Ask;Don't set anymore;Ignore errors" msgstr "" #: ulng.rsfilterstatus msgid "FILTER" msgstr "" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "Şablonu tanımla" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "%s Seviye(ler)" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "Tüm (sınırsız derinlik)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "Yalnızca geçerli dizin" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "Dizin %s mevcut değil!" #: ulng.rsfindfound msgid "Found: %d" msgstr "Bulundu: %d" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "Arama Şablonunu Kaydet" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "Şablon adı" #: ulng.rsfindscanned msgid "Scanned: %d" msgstr "Taranan: %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "Tara" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "Dosyaları bul" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "Başlayın" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr "%sBayt %s içermez" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "%s boş bayt" #: ulng.rsfuncatime msgid "Access date/time" msgstr "Tarih/saat Erişimi" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "Öznitelikleri" #: ulng.rsfunccomment msgid "Comment" msgstr "Açıklama" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "Tarih/saat oluştur" #: ulng.rsfuncext msgid "Extension" msgstr "Uzantı" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "Grup" #: ulng.rsfunclinkto msgid "Link to" msgstr "Bağlantı" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "Tarih/saat Son değiştirilme tarihi" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "Adı" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "Adı, uzantısı hariç" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "Sahibi" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "Yol" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "Boyut" #: ulng.rsfunctype msgid "Type" msgstr "Türü" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "Sabit bağlantı oluşturma hatası." #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "Karşılaştır" #: ulng.rshotkeycategorymain msgid "Main" msgstr "" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "Göster" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "Tam ilişkilendir" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "Maske seçimini kaldır" #: ulng.rsmarkplus msgid "Select mask" msgstr "Maske seç" #: ulng.rsmaskinput msgid "Input mask:" msgstr "Make girişi:" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "Özel sütunları yapılandır" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "Bu özel sütun görünümünü yapılandır" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "Eylemler" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "Düzenle" #: ulng.rsmnueject msgid "Eject" msgstr "Çıkar" #: ulng.rsmnumount msgid "Mount" msgstr "Monte et" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "Yeni" #: ulng.rsmnunomedia msgid "No media available" msgstr "Kullanılabilir ortam yok" #: ulng.rsmnuopenwith #, fuzzy #| msgid "Open with ..." msgid "Open with" msgstr "Birlikte aç..." #: ulng.rsmnuopenwithother msgid "Other..." msgstr "" #: ulng.rsmnusortby msgid "Sort by" msgstr "Şuna Göre Sırala" #: ulng.rsmnuumount msgid "Unmount" msgstr "Kaldır" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "Göster" #: ulng.rsmsgaccount msgid "Account:" msgstr "Hesap:" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "Arşiv komut satırı için ek değişkenler:" #: ulng.rsmsgcannotcopymoveitself #, fuzzy #| msgid "You can not copy/move a file \"%s\"to itself!\"" msgid "You can not copy/move a file \"%s\" to itself!" msgstr "Dosyayı \"kendisine!\" kopyalayamaz/taşıyamazsınız\"%s\"" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "Dizin değişikliği [%s]başarısız oldu!" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "Tüm etkin olmayan sekmeler kaldırılsın mı?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "Bu sekme (%s) kilitli! Yine de kapatılsın mı?" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "Çıkmak istediğinizden emin misiniz?" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "Seçilen %d dosyalar/dizinleri kopyala?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "Kopyalanacakları\"%s\"seç?" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "Seçili %d dosyaları/dizinleri sil ?" #: ulng.rsmsgdelfldrt #, fuzzy #| msgid "Delete %d selected files/directories into trash can?\"" msgid "Delete %d selected files/directories into trash can?" msgstr "seçilen %d dosyaları/dizinleri çöp kutusuna at?" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "Seçilenleri sil \"%s\"?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "Seçilenleri sil\"%s\" çöp kutusuna at?" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "Çöp kutusuna\"%s\" atılamıyor! Doğrudan sil?" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "Sürücü kullanılamıyo" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "Dosya uzantısını girin:" #: ulng.rsmsgentername msgid "Enter name:" msgstr "Adını girin:" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "Arşiv verisinde CRC hatası" #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "Veri kötü" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "Sunucuya bağlanamıyor \"%s\"" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "Dosya %s kopyalanamıyor %s" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "Orada zaten o adda bir dizin var" #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "Tarih %s desteklenmiyor" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "Dizin %s zaten var!" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "İşlev kullanıcı tarafından iptal edildi" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "Dosya kapatma hatası" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "Dosya oluşturulamıyor" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "Daha fazla arşiv dosyası yok" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "Varolan dosyayı açamıyor" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "Dosya okuma hatası" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "Dosya yazma hatası" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "Dizin oluşturulamıyor %s!" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "Geçersiz bağlantı" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "Dosya bulunamadı" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "Yeterli bellek yok" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "İşlev desteklenmiyor!" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "Syntax(Sözdizim)-normal ifadede hata!" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "Dosya yeniden %s adlandırılamıyor %s" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "Dosya kaydedilemiyor" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "Öznitelikleri ayarlanabilir değil \"%s\"" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "Tarih/saat ayarlanabilir değil \"%s\"" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "Arabellek çok küçük" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "Sıkıştırma için dosya miktarı çok fazla " #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "Arşiv biçimi bilinmiyor" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "Dosya %s değişikliğini,kaydet?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "Dosya %s zaten var üzerine yazılsın mı?" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "Dosya işlemleri etkin" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "Bazı dosya işlemleri henüz bitmiş değil .Double Commander´ın kapatılması veri kaybına neden olabilir!" #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "Dosya %s salt okunur olarak işaretlenmiş. Silinsin mi?" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "Dosya boyutu \"%s\" hedef dosya sistemi için çok büyük!" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "Klasör %s zaten var, üzerine yazılsın mı?" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "Sembolik bağlantıyı izle\"%s\"?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "Geçersiz dosya adı" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "" #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "Geçersiz seçim." #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "Dosya listesi yükleniyor..." #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "Dosyayı kopyala %s" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "Dosya Sil %s" #: ulng.rsmsglogerror msgid "Error: " msgstr "Hata:" #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "Dosya ayıkla %s" #: ulng.rsmsgloginfo msgid "Info: " msgstr "Bilgi" #: ulng.rsmsgloglink msgid "Create link %s" msgstr "Bağlantı oluştur %s" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "Dizin oluştur %s" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "Dosyayı Taşı %s" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "Doyayı Sıkıştır %s" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "Dizini Kaldır %s" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "Bitmiş:" #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "Sembolik bağlantı oluştur %s" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "Dosya bütünlüğünü sına %s" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "El ile hızlı erişim yolu ekle" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "hızlı erişim yolunu elle düzenle" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "Adını ve yolunu girin (biçim adı=yol):" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "Ana şifre" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "Lütfen ana şifreyi girin:" #: ulng.rsmsgnewfile msgid "New file" msgstr "Yeni dosya" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "Bir Sonraki birim açılmamış" #: ulng.rsmsgnofiles msgid "No files" msgstr "" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "Dosya seçilmedi." #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "Hedef sürücüde yeterli boşluk yok.Yine de devam edilsin mi?" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "Hedef sürücüde yeterli boşluk yok. Yeniden Dene?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "Dosya silinemiyor" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "Uygulanmamış." #: ulng.rsmsgpassword msgid "Password:" msgstr "Şifre" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "Lütfen şifreyi girin.:" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "Şifre (Güvenlik Duvarı):" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "&Ekle %s" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "&Yapılandır" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "&Sil %s" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "Ön ayar \"%s\" zaten var.Üzerine yazılsın mı?" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "Seçilen %d dosya(ları)/Dizinleri/Yeniden adlandır?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "Seçilenleri Taşı/Yeniden adlandır\"%s\"?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "Lütfen,değişiklikleri uygulamak için Double Commander´ı yeniden başlatın" #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "Lütfen yalnızca sağlama toplamı dosyaları seçin!" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "Lütfen bir sonraki parçanın konumunu belirtin" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "Birim kümesi etiketi" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "Sekmeyi yeniden adlandır" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "Yni sekme adı" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "Hedef yol" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "Çok fazla dosya seçili." #: ulng.rsmsgurl msgid "URL:" msgstr "URL" #: ulng.rsmsgusername msgid "User name:" msgstr "Kullanıcı adı:" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "Kullanıcı adı (Güvenlik duvarı):" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "Birim etiketi:" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "Lütfen birimin boyutu girin:" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "Tam sil %d Seçilen dosya/dizinler?" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "Tam silme Seçili \"%s\"?" #: ulng.rsmulrenfilenamestylelist msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "Değişiklik yok;TÜMÜ BÜYÜK HARF;tümü küçük harf;İlk karakter büyük harfle;Her kelimeyi büyük harflerle" #: ulng.rsoperaborted msgid "Aborted" msgstr "İptal edildi" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "Hesaplama" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "" #: ulng.rsopercombining msgid "Joining" msgstr "" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopying msgid "Copying" msgstr "" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "Sil" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "" #: ulng.rsoperexecuting msgid "Executing" msgstr "" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "" #: ulng.rsoperextracting msgid "Extracting" msgstr "" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperfinished msgid "Finished" msgstr "Bitmiş" #: ulng.rsoperlisting msgid "Listing" msgstr "" #: ulng.rsoperlistingin msgid "Listing \"%s\"" msgstr "" #: ulng.rsopermoving msgid "Moving" msgstr "" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "" #: ulng.rsopernotstarted msgid "Not started" msgstr "Başlatılmadı" #: ulng.rsoperpacking msgid "Packing" msgstr "" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperpaused msgid "Paused" msgstr "Duraklatıldı" #: ulng.rsoperpausing msgid "Pausing" msgstr "Duraklat" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "Sıraya(kuyruk)alındı" #: ulng.rsoperrunning msgid "Running" msgstr "Çalışıyor" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "" #: ulng.rsopersettingpropertyin msgid "Setting property in \"%s\"" msgstr "" #: ulng.rsopersettingpropertyof msgid "Setting property of \"%s\"" msgstr "" #: ulng.rsopersplitting msgid "Splitting" msgstr "" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "" #: ulng.rsoperstarting msgid "Starting" msgstr "Başlangıç" #: ulng.rsoperstopped msgid "Stopped" msgstr "Durmuş" #: ulng.rsoperstopping msgid "Stopping" msgstr "Durdur" #: ulng.rsopertesting msgid "Testing" msgstr "" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "Dosya kaynağına erişim için bekleniyor" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "Kullanıcı yanıtı bekleniyor" #: ulng.rsoperwiping msgid "Wiping" msgstr "" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "" #: ulng.rsoperworking msgid "Working" msgstr "" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "Sil:" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "Yol olmadan Çıkart:" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "Format ayrıştırma modu:" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "KİMLİK(ID):" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "(ID)Kimlik konumu" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "ID Kimlik arama aralığı (isteğe bağlı)" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "Değişkenler" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "Şifre sorgu dizgisi:" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "Kendiliğinden açılan arşiv oluştur(Sfx):" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "Deneme:" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "Arşiv tipi adı:" #: ulng.rsoptarchivevalue msgid "Value" msgstr "Değer" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "Eklentiyi ilişkilendir \"%s\" ile:" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "İlk; Son;" #: ulng.rsoptdisable msgid "Disable" msgstr "Devre dışı" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "Etkinleştir" #: ulng.rsoptenterext msgid "Enter extension" msgstr "Uzantıyı gir" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "İmleç" #: ulng.rsoptexamplemark msgid "Mark" msgstr "İşaret" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "İşaret+İmleç" #: ulng.rsoptexampletext msgid "Text" msgstr "Metin" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "" #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "" #: ulng.rsopthotkeysdeletetrashcanoverrides msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "" #: ulng.rsopthotkeysdeletetrashcanparameterexists msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "Kısayol tuşu" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "Kısayol tuşları" #: ulng.rsopthotkeysnohotkey msgid "" msgstr "" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "Değişkenler" #: ulng.rsopthotkeyssetdeleteshortcut msgid "Set shortcut to delete file" msgstr "" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "" #: ulng.rsopthotkeysshortcutfordeleteissequence msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "" #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "Kısayol kullanımı" #: ulng.rsopthotkeysshortcutusedtext1 #, fuzzy #| msgid "Shortcut %s is already used for %s." msgid "Shortcut %s is already used." msgstr "Kısayol %s zaten kullanılıyor %s." #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "Bunu değiştir %s?" #: ulng.rsopthotkeysusedby #, fuzzy #| msgid "used by" msgid "used for %s in %s" msgstr "tarafından kullanılan" #: ulng.rsopthotkeysusedwithdifferentparams msgid "used for this command but with different parameters" msgstr "" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "Sıkıştır" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "Otomatik Yenileme" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "Davranış" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "Renkler" #: ulng.rsoptionseditorcolumnsview msgctxt "ulng.rsoptionseditorcolumnsview" msgid "Columns" msgstr "Sütunlar" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "Yapılandırma" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "" #: ulng.rsoptionseditorfileoperations msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "Dosya işlemleri" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "Dosya penceresi" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "Dosya türleri" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "Klasör sekmeleri" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "Yazı tipleri" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "Kısayol tuşları" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "Simge" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "Yoksayma listesi" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "lisan " #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "Düzen" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "Günlük" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "Çeşitli" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "Eklentiler" #: ulng.rsoptionseditorquicksearch msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "Hızlı arama/süzgeç" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "Araçlar" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "Araç ipuçları" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "Sol düğme;Sağ düğme;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "Eklenti %s aşağıdaki uzantıya zaten atanmış :" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "Etkin" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "Dosya adı" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "Adı" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "Kayıtlı" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "" #: ulng.rsoptsortmethod #, fuzzy #| msgid "\"Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "Alfabetik,sıralamayı hesaba katma;Doğal sıralama: alfabetik ve numaraları" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "Üst;Alt;" #: ulng.rsopttoolbarbuttontype msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "" #: ulng.rsoptupdatedfilesposition msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "Erişim haklarını değiştirmek mümkün değil \"%s\"" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "Sahibini değiştiremezsiniz \"%s\"" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "Dosya" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "Dizin" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "Adı konmuş iletişim kanalı" #: ulng.rspropsno msgid "No" msgstr "Hayır" #: ulng.rspropssocket msgid "Socket" msgstr "Terminal adresleme yapısı" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "Özel blok aygıtları" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "Özel karakter çevre birimi" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "Sembolik bağlantı" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "Bilinmeyen tür" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "Evet (%s)" #: ulng.rssearchresult msgid "Search result" msgstr "Arama sonucu" #: ulng.rssearchtemplateunnamed msgid "" msgstr "" #: ulng.rsselectdir msgid "Select a directory" msgstr "Bir dizin seçin" #: ulng.rsshowhelpfor msgid "&Show help for %s" msgstr "" #: ulng.rssizeunitbytes #, fuzzy #| msgid "bayt" msgid "Bytes" msgstr "bayt" #: ulng.rssizeunitgbytes #, fuzzy #| msgid "Gigabayt" msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "Gigabayt" #: ulng.rssizeunitkbytes #, fuzzy #| msgid "Kilobayt" msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "Kilobayt" #: ulng.rssizeunitmbytes #, fuzzy #| msgid "Megabayt" msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "Megabayt" #: ulng.rssizeunittbytes #, fuzzy #| msgid "Terabayt" msgid "Terabytes" msgstr "Terabayt" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "Dosya: %d, endeks : %d, Boyut: %s (%s bayt)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "Hedef dizini oluşturulamadı" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "Yanlış dosya boyutu biçimi!" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "Dosya parçalanması yapılamıyor!" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "Parçaların sayısı, 100 'den fazla! Devam edilsin mi?" #: ulng.rssplitseldir msgid "Select directory:" msgstr "Dizin Seç:" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "Sembolik bağ oluşturma hatası." #: ulng.rssyndefaulttext msgid "Default text" msgstr "" #: ulng.rssynlangplaintext msgid "Plain text" msgstr "" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "Gün(ler)" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "saat(ler)" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "Dakika (lar)" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "Ay(lar)" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "Saniye (ler)" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "Hafta(lar)" #: ulng.rstimeunityear msgid "Year(s)" msgstr "Yıl(lar)" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "Karşılaştır" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "Araç Düzenleyicisi" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "Göster" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "Bu hatayı düzeltebilmemiz için lütfen bu hatayı bildirin Ne yaptığınızın bir açıklaması ve aşağıdaki dosya: %sdevam etmek için %sbasın %s ,iptal etmek için programı tıklayın" #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "Ağ" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "Double Commander dahili Görüntüleyici" #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "Kodlama" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "%s bulunamadı!" doublecmd-0.5.8/language/doublecmd.uk_UA.po0000644000175000017500000075060312250633131017601 0ustar alexxalexxmsgid "" msgstr "" "Project-Id-Version: Double Commander 0.5.5 alpha\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: \n" "PO-Revision-Date: 2013-04-07 22:34+0300\n" "Last-Translator: masterok\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Ukrainian\n" #: tfcolumnssetconf.btnallback.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK.CAPTION" msgid "All" msgstr "Всім" #: tfcolumnssetconf.btnallback2.caption msgctxt "TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION" msgid "All" msgstr "Всім" #: tfcolumnssetconf.btnallcurcol.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION" msgid "All" msgstr "Всім" #: tfcolumnssetconf.btnallcurtext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION" msgid "All" msgstr "Всім" #: tfcolumnssetconf.btnallfont.caption msgctxt "TFCOLUMNSSETCONF.BTNALLFONT.CAPTION" msgid "All" msgstr "Всім" #: tfcolumnssetconf.btnallmarc.caption msgctxt "TFCOLUMNSSETCONF.BTNALLMARC.CAPTION" msgid "All" msgstr "Всім" #: tfcolumnssetconf.btnalltext.caption msgctxt "TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION" msgid "All" msgstr "Всім" #: tfcolumnssetconf.btnbackcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnbackcolor2.caption msgctxt "TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncancel.caption msgctxt "TFCOLUMNSSETCONF.BTNCANCEL.CAPTION" msgid "Cancel" msgstr "Скасувати" #: tfcolumnssetconf.btncursorbordercolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursorcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btncursortext.caption msgctxt "TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnfontselect.caption msgctxt "TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION" msgid "..." msgstr "..." #: tfcolumnssetconf.btnforecolor.caption msgctxt "TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfcolumnssetconf.btnnext.caption msgid "->" msgstr "->" #: tfcolumnssetconf.btnok.caption msgctxt "TFCOLUMNSSETCONF.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfcolumnssetconf.btnprev.caption msgid "<-" msgstr "<-" #: tfcolumnssetconf.caption msgid "Configure custom columns view" msgstr "Налаштування набору колонок" #: tfcolumnssetconf.cbackgrndlabel.caption msgctxt "TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION" msgid "BackGround:" msgstr "Фон:" #: tfcolumnssetconf.cbcursorborder.caption msgid "Cursor border" msgstr "Межі курсору" #: tfcolumnssetconf.cbovercolor.caption msgid "Allow Overcolor" msgstr "Дозволити виділення кольором" #: tfcolumnssetconf.chkusecustomview.caption msgid "Use custom font and color" msgstr "Власні налаштування шрифтів і кольорів" #: tfcolumnssetconf.ctextlabel.caption msgctxt "TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION" msgid "Text Color:" msgstr "Колір тексту:" #: tfcolumnssetconf.label3.caption msgid "Font:" msgstr "Шрифт:" #: tfcolumnssetconf.label4.caption msgctxt "TFCOLUMNSSETCONF.LABEL4.CAPTION" msgid "Size:" msgstr "Розмір:" #: tfcolumnssetconf.lblbackground2.caption msgctxt "TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION" msgid "Background 2:" msgstr "Фон 2:" #: tfcolumnssetconf.lblconfigviewnr.caption msgid "Configure view nr:" msgstr "Налаштування набору номер:" #: tfcolumnssetconf.lblcursorcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION" msgid "Cursor Color:" msgstr "Колір курсора" #: tfcolumnssetconf.lblcursortext.caption msgctxt "TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION" msgid "Cursor Text:" msgstr "Текст &під курсором" #: tfcolumnssetconf.lblmarkcolor.caption msgctxt "TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION" msgid "Mark Color:" msgstr "Виділення" #: tfcolumnssetconf.lblname.caption msgctxt "TFCOLUMNSSETCONF.LBLNAME.CAPTION" msgid "Name:" msgstr "Ім'я:" #: tfcolumnssetconf.lbnrofcolumnsset.caption msgctxt "TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION" msgid "0" msgstr "0" #: tfcolumnssetconf.miaddcolumn.caption msgid "Add column" msgstr "Додати колонку" #: tfcolumnssetconf.pnlcusthead.caption msgid "Customize column:" msgstr "Налаштувати колонку:" #: tfcolumnssetconf.pnlpreviewhead.caption msgctxt "TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION" msgid "Preview" msgstr "Попередній перегляд" #: tfcolumnssetconf.resback.caption msgctxt "TFCOLUMNSSETCONF.RESBACK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resback2.caption msgctxt "TFCOLUMNSSETCONF.RESBACK2.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurcol.caption msgctxt "TFCOLUMNSSETCONF.RESCURCOL.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.rescurtext.caption msgctxt "TFCOLUMNSSETCONF.RESCURTEXT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resfont.caption msgctxt "TFCOLUMNSSETCONF.RESFONT.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.resmark.caption msgctxt "TFCOLUMNSSETCONF.RESMARK.CAPTION" msgid "R" msgstr "R" #: tfcolumnssetconf.restext.caption msgctxt "TFCOLUMNSSETCONF.RESTEXT.CAPTION" msgid "R" msgstr "R" #: tfilesystemcopymoveoperationoptionsui.btnsearchtemplate.hint msgid "Choose template..." msgstr "Вибрати шаблон..." #: tfilesystemcopymoveoperationoptionsui.cbcheckfreespace.caption #| msgid "Check free space" msgid "C&heck free space" msgstr "Перевірити вільне міс&це" #: tfilesystemcopymoveoperationoptionsui.cbcopyattributes.caption #| msgid "Copy attributes" msgid "Cop&y attributes" msgstr "Копі&ювати атрибути" #: tfilesystemcopymoveoperationoptionsui.cbcopyownership.caption #| msgid "Copy ownership" msgid "Copy o&wnership" msgstr "Копіювати пра&ва" #: tfilesystemcopymoveoperationoptionsui.cbcopytime.caption #| msgid "Copy date/time" msgid "Copy d&ate/time" msgstr "Копіювати &дату/час" #: tfilesystemcopymoveoperationoptionsui.cbcorrectlinks.caption #| msgid "Correct links" msgid "Correct lin&ks" msgstr "Правил&ьні посилання" #: tfilesystemcopymoveoperationoptionsui.cbdropreadonlyflag.caption #| msgid "Drop readonly flag" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION" msgid "Drop readonly fla&g" msgstr "Скинути позначку \"Л&ише читання\"" #: tfilesystemcopymoveoperationoptionsui.cbexcludeemptydirectories.caption #| msgid "Exclude empty directories" msgid "E&xclude empty directories" msgstr "Викл&ючити порожні каталоги" #: tfilesystemcopymoveoperationoptionsui.cbfollowlinks.caption #| msgid "Follow links" msgid "Fo&llow links" msgstr "Перейти за поси&ланнями" #: tfilesystemcopymoveoperationoptionsui.cbreservespace.caption #| msgid "Reserve space" msgid "&Reserve space" msgstr "Зарезервувати &місце" #: tfilesystemcopymoveoperationoptionsui.cmbsetpropertyerror.hint msgid "What to do when cannot set file time, attributes, etc." msgstr "Що робити, якщо неможливо встановити час файла, атрибути, тощо." #: tfilesystemcopymoveoperationoptionsui.gbfiletemplate.caption msgid "Use file template" msgstr "Використати файл шаблону" #: tfilesystemcopymoveoperationoptionsui.lbldirectoryexists.caption #| msgid "When directory exists" msgid "When dir&ectory exists" msgstr "Якщо &каталог існує" #: tfilesystemcopymoveoperationoptionsui.lblfileexists.caption #| msgid "When file exists" msgctxt "TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When &file exists" msgstr "Якщо &файл існує" #: tfilesystemcopymoveoperationoptionsui.lblsetpropertyerror.caption #| msgid "When cannot set property" msgid "When ca&nnot set property" msgstr "Коли не можливо встановити в&ластивості" #: tfilesystemcopymoveoperationoptionsui.lbltemplatename.caption msgid "" msgstr "" #: tfrmabout.btnclose.caption msgctxt "TFRMABOUT.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Закрити" #: tfrmabout.btncopytoclipboard.caption msgid "Copy to clipboard" msgstr "Копіювати в буфер" #: tfrmabout.caption msgctxt "TFRMABOUT.CAPTION" msgid "About" msgstr "Про програму..." #: tfrmabout.lblbuild.caption msgid "Build" msgstr "Збірка" #: tfrmabout.lblfreepascalver.caption msgid "Free Pascal" msgstr "Free Pascal" #: tfrmabout.lblhomepage.caption msgid "Home Page:" msgstr "Домашня сторінка:" #: tfrmabout.lblhomepageaddress.caption msgid "http://doublecmd.sourceforge.net" msgstr "http://doublecmd.sourceforge.net" #: tfrmabout.lbllazarusver.caption msgid "Lazarus" msgstr "Lazarus" #: tfrmabout.lblrevision.caption msgctxt "TFRMABOUT.LBLREVISION.CAPTION" msgid "Revision" msgstr "Ревізія:" #: tfrmabout.lbltitle.caption msgctxt "TFRMABOUT.LBLTITLE.CAPTION" msgid "Double Commander" msgstr "Double Commander" #: tfrmabout.lblversion.caption msgid "Version" msgstr "Версія" #: tfrmattributesedit.btncancel.caption msgctxt "TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmattributesedit.btnok.caption msgctxt "TFRMATTRIBUTESEDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfrmattributesedit.btnreset.caption msgid "&Reset" msgstr "&Скинути" #: tfrmattributesedit.caption msgid "Choose attributes" msgstr "Вибрати атрибути" #: tfrmattributesedit.cbarchive.caption #| msgid "Archive" msgctxt "TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION" msgid "&Archive" msgstr "&Архівний" #: tfrmattributesedit.cbcompressed.caption #| msgid "Compressed" msgid "Co&mpressed" msgstr "Стиснути&й" #: tfrmattributesedit.cbdirectory.caption #| msgid "Directory" msgctxt "TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION" msgid "&Directory" msgstr "&Каталог" #: tfrmattributesedit.cbencrypted.caption #| msgid "Encrypted" msgid "&Encrypted" msgstr "За&шифрований" #: tfrmattributesedit.cbhidden.caption #| msgid "Hidden" msgctxt "TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION" msgid "&Hidden" msgstr "При&хований" #: tfrmattributesedit.cbreadonly.caption #| msgid "Read only" msgctxt "TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION" msgid "Read o&nly" msgstr "Лише &читання" #: tfrmattributesedit.cbsgid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmattributesedit.cbsparse.caption #| msgid "Sparse" msgid "S&parse" msgstr "Розрід&жений" #: tfrmattributesedit.cbsticky.caption msgctxt "TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Закріплювальний біт" #: tfrmattributesedit.cbsuid.caption msgctxt "TFRMATTRIBUTESEDIT.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmattributesedit.cbsymlink.caption #| msgid "Symlink" msgid "&Symlink" msgstr "&Симв. посилання" #: tfrmattributesedit.cbsystem.caption #| msgid "System" msgctxt "TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION" msgid "S&ystem" msgstr "&Системний" #: tfrmattributesedit.cbtemporary.caption #| msgid "Temporary" msgid "&Temporary" msgstr "&Тимчасовий" #: tfrmattributesedit.gbntfsattributes.caption msgid "NTFS attributes" msgstr "Атрибути NTFS" #: tfrmattributesedit.gbwingeneral.caption msgid "General attributes" msgstr "Основні атрибути" #: tfrmattributesedit.lblattrbitsstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Біти:" #: tfrmattributesedit.lblattrgroupstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Група" #: tfrmattributesedit.lblattrotherstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Інші" #: tfrmattributesedit.lblattrownerstr.caption msgctxt "TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Власник" #: tfrmattributesedit.lblexec.caption msgctxt "TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION" msgid "Execute" msgstr "Виконання" #: tfrmattributesedit.lblread.caption msgctxt "TFRMATTRIBUTESEDIT.LBLREAD.CAPTION" msgid "Read" msgstr "Читання" #: tfrmattributesedit.lbltextattrs.caption #| msgid "As text:" msgid "As te&xt:" msgstr "Як те&кст:" #: tfrmattributesedit.lblwrite.caption msgctxt "TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION" msgid "Write" msgstr "Запис" #: tfrmchecksumcalc.btncancel.caption #| msgid "Cancel" msgctxt "TFRMCHECKSUMCALC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmchecksumcalc.btnok.caption msgctxt "TFRMCHECKSUMCALC.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfrmchecksumcalc.caption msgctxt "tfrmchecksumcalc.caption" msgid "Calculate check sum..." msgstr "Розрахувати контрольну суму..." #: tfrmchecksumcalc.cbseparatefile.caption #| msgid "Create separate checksum file for each file" msgid "C&reate separate checksum file for each file" msgstr "Для кожного файлу ство&рити свій контрольний файл" #: tfrmchecksumcalc.lblsaveto.caption #| msgid "Save check sum file(s) to:" msgid "&Save check sum file(s) to:" msgstr "Зберегти файл(и) контрольних сум &як:" #: tfrmchecksumverify.btnclose.caption msgctxt "TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Закрити" #: tfrmchecksumverify.caption msgctxt "TFRMCHECKSUMVERIFY.CAPTION" msgid "Verify check sum..." msgstr "Перевірити контрольну суму..." #: tfrmconnectionmanager.btnadd.caption #| msgid "Add" msgctxt "TFRMCONNECTIONMANAGER.BTNADD.CAPTION" msgid "A&dd" msgstr "&Додати" #: tfrmconnectionmanager.btncancel.caption #| msgid "Cancel" msgctxt "TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmconnectionmanager.btnconnect.caption #| msgid "Connect" msgid "C&onnect" msgstr "З'&єднати" #: tfrmconnectionmanager.btndelete.caption #| msgid "Delete" msgctxt "TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Ви&далити" #: tfrmconnectionmanager.btnedit.caption #| msgid "Edit" msgctxt "TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION" msgid "&Edit" msgstr "&Редагувати" #: tfrmconnectionmanager.caption msgid "Connection manager" msgstr "Диспетчер з'єднань" #: tfrmconnectionmanager.gbconnectto.caption msgid "Connect to:" msgstr "З'єднатися з:" #: tfrmcopydlg.btnaddtoqueue.caption #| msgid "Add To Queue" msgid "A&dd To Queue" msgstr "Додати в &чергу" #: tfrmcopydlg.btncancel.caption #| msgid "Cancel" msgctxt "TFRMCOPYDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmcopydlg.btncreatespecialqueue.caption msgctxt "tfrmcopydlg.btncreatespecialqueue.caption" msgid "..." msgstr "..." #: tfrmcopydlg.btnoptions.caption msgid "O&ptions" msgstr "Налашт&увати" #: tfrmcopydlg.btnsaveoptions.caption #| msgid "Save these options as default" msgid "Sa&ve these options as default" msgstr "Зберегти ці налаштування як &типові" #: tfrmcopydlg.caption msgctxt "TFRMCOPYDLG.CAPTION" msgid "Copy file(s)" msgstr "Копіювати файл(и)" #: tfrmdescredit.btncancel.caption #| msgid "Cancel" msgctxt "TFRMDESCREDIT.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmdescredit.btnok.caption msgctxt "TFRMDESCREDIT.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfrmdescredit.caption msgid "File/folder comment" msgstr "Коментар файлу/каталогу" #: tfrmdescredit.lbleditcommentfor.caption #| msgid "Edit comment for:" msgid "E&dit comment for:" msgstr "Ре&дагувати коментар для:" #: tfrmdescredit.lblencoding.caption #| msgid "Encoding:" msgctxt "TFRMDESCREDIT.LBLENCODING.CAPTION" msgid "&Encoding:" msgstr "&Кодування:" #: tfrmdescredit.lblfilename.caption msgctxt "TFRMDESCREDIT.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmdiffer.actabout.caption msgctxt "TFRMDIFFER.ACTABOUT.CAPTION" msgid "About" msgstr "Про програму..." #: tfrmdiffer.actautocompare.caption msgid "Auto Compare" msgstr "Авто порівняння" #: tfrmdiffer.actbinarycompare.caption msgid "Binary Mode" msgstr "Двійковий режим" #: tfrmdiffer.actcancelcompare.caption msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.CAPTION" msgid "Cancel" msgstr "Скасувати" #: tfrmdiffer.actcancelcompare.hint msgctxt "TFRMDIFFER.ACTCANCELCOMPARE.HINT" msgid "Cancel" msgstr "Скасувати" #: tfrmdiffer.actcopylefttoright.caption msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION" msgid "Copy Block Right" msgstr "Копіювати блок вправо" #: tfrmdiffer.actcopylefttoright.hint msgctxt "TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT" msgid "Copy Block Right" msgstr "Копіювати блок вправо" #: tfrmdiffer.actcopyrighttoleft.caption msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION" msgid "Copy Block Left" msgstr "Копіювати блок вліво" #: tfrmdiffer.actcopyrighttoleft.hint msgctxt "TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT" msgid "Copy Block Left" msgstr "Копіювати блок вліво" #: tfrmdiffer.acteditcopy.caption msgctxt "TFRMDIFFER.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Копіювати" #: tfrmdiffer.acteditcut.caption msgctxt "TFRMDIFFER.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Вирізати" #: tfrmdiffer.acteditdelete.caption msgctxt "TFRMDIFFER.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Видалити" #: tfrmdiffer.acteditpaste.caption msgctxt "TFRMDIFFER.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Вставити" #: tfrmdiffer.acteditredo.caption msgctxt "TFRMDIFFER.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Повторити" #: tfrmdiffer.acteditselectall.caption msgid "Select &All" msgstr "Виділити в&се" #: tfrmdiffer.acteditundo.caption msgctxt "TFRMDIFFER.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Вернути" #: tfrmdiffer.actexit.caption msgctxt "tfrmdiffer.actexit.caption" msgid "E&xit" msgstr "Ви&хід" #: tfrmdiffer.actfirstdifference.caption msgctxt "tfrmdiffer.actfirstdifference.caption" msgid "First Difference" msgstr "Перша відмінність" #: tfrmdiffer.actfirstdifference.hint msgctxt "tfrmdiffer.actfirstdifference.hint" msgid "First Difference" msgstr "Перша відмінність" #: tfrmdiffer.actignorecase.caption msgid "Ignore Case" msgstr "Ігнорувати регістр" #: tfrmdiffer.actignorewhitespace.caption msgid "Ignore Blanks" msgstr "Ігнорувати пробіли" #: tfrmdiffer.actkeepscrolling.caption msgid "Keep Scrolling" msgstr "Одночасне прокручування" #: tfrmdiffer.actlastdifference.caption msgctxt "tfrmdiffer.actlastdifference.caption" msgid "Last Difference" msgstr "Остання відмінність" #: tfrmdiffer.actlastdifference.hint msgctxt "tfrmdiffer.actlastdifference.hint" msgid "Last Difference" msgstr "Остання відмінність" #: tfrmdiffer.actlinedifferences.caption msgid "Line Differences" msgstr "Відмінності в рядку" #: tfrmdiffer.actnextdifference.caption msgctxt "tfrmdiffer.actnextdifference.caption" msgid "Next Difference" msgstr "Наступна відмінність" #: tfrmdiffer.actnextdifference.hint msgctxt "tfrmdiffer.actnextdifference.hint" msgid "Next Difference" msgstr "Наступна відмінність" #: tfrmdiffer.actopenleft.caption msgid "Open Left..." msgstr "Відкрити зліва..." #: tfrmdiffer.actopenright.caption msgid "Open Right..." msgstr "Відкрити справа..." #: tfrmdiffer.actpaintbackground.caption msgid "Paint Background" msgstr "Зафарбовувати фон" #: tfrmdiffer.actprevdifference.caption msgctxt "tfrmdiffer.actprevdifference.caption" msgid "Previous Difference" msgstr "Попередня відмінність" #: tfrmdiffer.actprevdifference.hint msgctxt "tfrmdiffer.actprevdifference.hint" msgid "Previous Difference" msgstr "Попередня відмінність" #: tfrmdiffer.actreload.caption #| msgid "Reload" msgctxt "TFRMDIFFER.ACTRELOAD.CAPTION" msgid "&Reload" msgstr "Пере&завантажити" #: tfrmdiffer.actreload.hint msgctxt "TFRMDIFFER.ACTRELOAD.HINT" msgid "Reload" msgstr "Перезавантажити" #: tfrmdiffer.actsave.caption msgctxt "TFRMDIFFER.ACTSAVE.CAPTION" msgid "Save" msgstr "Зберегти" #: tfrmdiffer.actsave.hint msgctxt "TFRMDIFFER.ACTSAVE.HINT" msgid "Save" msgstr "Зберегти" #: tfrmdiffer.actsaveas.caption msgctxt "TFRMDIFFER.ACTSAVEAS.CAPTION" msgid "Save as..." msgstr "Зберегти як..." #: tfrmdiffer.actsaveas.hint msgctxt "TFRMDIFFER.ACTSAVEAS.HINT" msgid "Save as..." msgstr "Зберегти як..." #: tfrmdiffer.actsaveleft.caption msgctxt "TFRMDIFFER.ACTSAVELEFT.CAPTION" msgid "Save Left" msgstr "Зберегти лівий" #: tfrmdiffer.actsaveleft.hint msgctxt "TFRMDIFFER.ACTSAVELEFT.HINT" msgid "Save Left" msgstr "Зберегти лівий" #: tfrmdiffer.actsaveleftas.caption msgctxt "TFRMDIFFER.ACTSAVELEFTAS.CAPTION" msgid "Save Left As..." msgstr "Зберегти лівий як..." #: tfrmdiffer.actsaveleftas.hint msgctxt "TFRMDIFFER.ACTSAVELEFTAS.HINT" msgid "Save Left As..." msgstr "Зберегти лівий як..." #: tfrmdiffer.actsaveright.caption msgctxt "TFRMDIFFER.ACTSAVERIGHT.CAPTION" msgid "Save Right" msgstr "Зберегти правий" #: tfrmdiffer.actsaveright.hint msgctxt "TFRMDIFFER.ACTSAVERIGHT.HINT" msgid "Save Right" msgstr "Зберегти правий" #: tfrmdiffer.actsaverightas.caption msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.CAPTION" msgid "Save Right As..." msgstr "Зберегти правий як..." #: tfrmdiffer.actsaverightas.hint msgctxt "TFRMDIFFER.ACTSAVERIGHTAS.HINT" msgid "Save Right As..." msgstr "Зберегти правий як..." #: tfrmdiffer.actstartcompare.caption msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.CAPTION" msgid "Compare" msgstr "Порівняти" #: tfrmdiffer.actstartcompare.hint msgctxt "TFRMDIFFER.ACTSTARTCOMPARE.HINT" msgid "Compare" msgstr "Порівняти" #: tfrmdiffer.btnleftencoding.hint msgctxt "TFRMDIFFER.BTNLEFTENCODING.HINT" msgid "Encoding" msgstr "Кодування" #: tfrmdiffer.btnrightencoding.hint msgctxt "TFRMDIFFER.BTNRIGHTENCODING.HINT" msgid "Encoding" msgstr "Кодування" #: tfrmdiffer.caption msgctxt "TFRMDIFFER.CAPTION" msgid "Compare files" msgstr "Порівняти файли" #: tfrmdiffer.midivider1.caption msgctxt "TFRMDIFFER.MIDIVIDER1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider10.caption msgctxt "TFRMDIFFER.MIDIVIDER10.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider2.caption msgctxt "TFRMDIFFER.MIDIVIDER2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider3.caption msgctxt "TFRMDIFFER.MIDIVIDER3.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider4.caption msgctxt "TFRMDIFFER.MIDIVIDER4.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider5.caption msgctxt "TFRMDIFFER.MIDIVIDER5.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider6.caption msgctxt "TFRMDIFFER.MIDIVIDER6.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider7.caption msgctxt "TFRMDIFFER.MIDIVIDER7.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider8.caption msgctxt "TFRMDIFFER.MIDIVIDER8.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.midivider9.caption msgctxt "TFRMDIFFER.MIDIVIDER9.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miencodingleft.caption #| msgid "Left" msgid "&Left" msgstr "З&ліва" #: tfrmdiffer.miencodingright.caption #| msgid "Right" msgid "&Right" msgstr "Сп&рава" #: tfrmdiffer.miseparator1.caption msgctxt "TFRMDIFFER.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.miseparator2.caption msgctxt "TFRMDIFFER.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmdiffer.mnuactions.caption msgid "&Actions" msgstr "&Дії" #: tfrmdiffer.mnuedit.caption #| msgid "Edit" msgctxt "TFRMDIFFER.MNUEDIT.CAPTION" msgid "&Edit" msgstr "Р&едагувати" #: tfrmdiffer.mnuencoding.caption #| msgid "Encoding" msgctxt "TFRMDIFFER.MNUENCODING.CAPTION" msgid "En&coding" msgstr "&Кодування" #: tfrmdiffer.mnufile.caption #| msgid "File" msgctxt "TFRMDIFFER.MNUFILE.CAPTION" msgid "&File" msgstr "&Файл" #: tfrmdiffer.mnuoptions.caption msgctxt "TFRMDIFFER.MNUOPTIONS.CAPTION" msgid "&Options" msgstr "&Налаштування" #: tfrmedithotkey.btnaddshortcut.hint msgid "Add new shortcut to sequence" msgstr "Додати новий ярлик в послідовність" #: tfrmedithotkey.btncancel.caption msgctxt "TFRMEDITHOTKEY.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmedithotkey.btnok.caption msgctxt "TFRMEDITHOTKEY.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfrmedithotkey.btnremoveshortcut.hint msgid "Remove last shortcut from sequence" msgstr "Видалити останній ярлик з послідовності" #: tfrmedithotkey.cghkcontrols.caption #, fuzzy msgctxt "tfrmedithotkey.cghkcontrols.caption" msgid "Only for these controls" msgstr "Тільки для цих елементів керування" #: tfrmedithotkey.lblparameters.caption #| msgid "Parameters (each in a separate line):" msgid "&Parameters (each in a separate line):" msgstr "&Параметри (кожен в окремому рядку):" #: tfrmedithotkey.lblshortcuts.caption msgid "Shortcuts:" msgstr "Ярлики:" #: tfrmeditor.actabout.caption msgctxt "TFRMEDITOR.ACTABOUT.CAPTION" msgid "About" msgstr "Про програму..." #: tfrmeditor.actabout.hint msgctxt "tfrmeditor.actabout.hint" msgid "About" msgstr "Про програму..." #: tfrmeditor.actconfhigh.caption msgid "&Configuration" msgstr "&Налаштування" #: tfrmeditor.actconfhigh.hint msgctxt "tfrmeditor.actconfhigh.hint" msgid "Configuration" msgstr "Конфігурація" #: tfrmeditor.acteditcopy.caption msgctxt "TFRMEDITOR.ACTEDITCOPY.CAPTION" msgid "Copy" msgstr "Копіювати" #: tfrmeditor.acteditcopy.hint msgctxt "tfrmeditor.acteditcopy.hint" msgid "Copy" msgstr "Копіювати" #: tfrmeditor.acteditcut.caption msgctxt "TFRMEDITOR.ACTEDITCUT.CAPTION" msgid "Cut" msgstr "Вирізати" #: tfrmeditor.acteditcut.hint msgctxt "tfrmeditor.acteditcut.hint" msgid "Cut" msgstr "Вирізати" #: tfrmeditor.acteditdelete.caption msgctxt "TFRMEDITOR.ACTEDITDELETE.CAPTION" msgid "Delete" msgstr "Видалити" #: tfrmeditor.acteditdelete.hint msgctxt "tfrmeditor.acteditdelete.hint" msgid "Delete" msgstr "Видалити" #: tfrmeditor.acteditfind.caption msgctxt "tfrmeditor.acteditfind.caption" msgid "&Find" msgstr "З&найти" #: tfrmeditor.acteditfind.hint msgctxt "tfrmeditor.acteditfind.hint" msgid "Find" msgstr "Знайти" #: tfrmeditor.acteditfindnext.caption msgctxt "tfrmeditor.acteditfindnext.caption" msgid "Find next" msgstr "Знайти наступний" #: tfrmeditor.acteditfindnext.hint msgctxt "tfrmeditor.acteditfindnext.hint" msgid "Find next" msgstr "Знайти наступний" #: tfrmeditor.acteditlineendcr.caption msgctxt "tfrmeditor.acteditlineendcr.caption" msgid "Mac (CR)" msgstr "Mac (CR)" #: tfrmeditor.acteditlineendcr.hint msgctxt "tfrmeditor.acteditlineendcr.hint" msgid "Mac (CR)" msgstr "Mac (CR)" #: tfrmeditor.acteditlineendcrlf.caption msgctxt "tfrmeditor.acteditlineendcrlf.caption" msgid "Windows (CRLF)" msgstr "Windows (CRLF)" #: tfrmeditor.acteditlineendcrlf.hint msgctxt "tfrmeditor.acteditlineendcrlf.hint" msgid "Windows (CRLF)" msgstr "Windows (CRLF)" #: tfrmeditor.acteditlineendlf.caption msgctxt "tfrmeditor.acteditlineendlf.caption" msgid "Unix (LF)" msgstr "Unix (LF)" #: tfrmeditor.acteditlineendlf.hint msgctxt "tfrmeditor.acteditlineendlf.hint" msgid "Unix (LF)" msgstr "Unix (LF)" #: tfrmeditor.acteditpaste.caption msgctxt "TFRMEDITOR.ACTEDITPASTE.CAPTION" msgid "Paste" msgstr "Вставити" #: tfrmeditor.acteditpaste.hint msgctxt "tfrmeditor.acteditpaste.hint" msgid "Paste" msgstr "Вставити" #: tfrmeditor.acteditredo.caption msgctxt "TFRMEDITOR.ACTEDITREDO.CAPTION" msgid "Redo" msgstr "Повторити" #: tfrmeditor.acteditredo.hint msgctxt "tfrmeditor.acteditredo.hint" msgid "Redo" msgstr "Повторити" #: tfrmeditor.acteditrplc.caption msgid "&Replace" msgstr "&Замінити" #: tfrmeditor.acteditrplc.hint msgctxt "tfrmeditor.acteditrplc.hint" msgid "Replace" msgstr "Замінити" #: tfrmeditor.acteditselectall.caption msgid "Select&All" msgstr "Виділити &все" #: tfrmeditor.acteditselectall.hint msgctxt "tfrmeditor.acteditselectall.hint" msgid "Select All" msgstr "Виділити &усе" #: tfrmeditor.acteditundo.caption msgctxt "TFRMEDITOR.ACTEDITUNDO.CAPTION" msgid "Undo" msgstr "Вернути" #: tfrmeditor.acteditundo.hint msgctxt "tfrmeditor.acteditundo.hint" msgid "Undo" msgstr "Вернути" #: tfrmeditor.actfileclose.caption msgctxt "TFRMEDITOR.ACTFILECLOSE.CAPTION" msgid "&Close" msgstr "&Закрити" #: tfrmeditor.actfileclose.hint msgctxt "tfrmeditor.actfileclose.hint" msgid "Close" msgstr "Закрити" #: tfrmeditor.actfileexit.caption msgctxt "TFRMEDITOR.ACTFILEEXIT.CAPTION" msgid "E&xit" msgstr "Ви&хід" #: tfrmeditor.actfileexit.hint msgctxt "tfrmeditor.actfileexit.hint" msgid "Exit" msgstr "Вихід" #: tfrmeditor.actfilenew.caption msgctxt "TFRMEDITOR.ACTFILENEW.CAPTION" msgid "&New" msgstr "&Створити" #: tfrmeditor.actfilenew.hint msgctxt "tfrmeditor.actfilenew.hint" msgid "New" msgstr "Створити" #: tfrmeditor.actfileopen.caption msgid "&Open" msgstr "&Відкрити" #: tfrmeditor.actfileopen.hint msgctxt "tfrmeditor.actfileopen.hint" msgid "Open" msgstr "Відкрити" #: tfrmeditor.actfilesave.caption msgctxt "TFRMEDITOR.ACTFILESAVE.CAPTION" msgid "&Save" msgstr "Збере&гти" #: tfrmeditor.actfilesave.hint msgctxt "tfrmeditor.actfilesave.hint" msgid "Save" msgstr "Зберегти" #: tfrmeditor.actfilesaveas.caption msgid "Save &As.." msgstr "Зберегти &як.." #: tfrmeditor.actfilesaveas.hint msgid "Save As" msgstr "Зберегти як" #: tfrmeditor.actsaveall.caption msgid "Sa&ve All" msgstr "&Зберегти все" #: tfrmeditor.actsaveall.hint msgid "Save All" msgstr "Зберегти все" #: tfrmeditor.caption msgctxt "tfrmeditor.caption" msgid "Editor" msgstr "Редактор" #: tfrmeditor.help1.caption msgctxt "TFRMEDITOR.HELP1.CAPTION" msgid "&Help" msgstr "Допомо&га" #: tfrmeditor.midiv.caption msgctxt "TFRMEDITOR.MIDIV.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miedit.caption msgctxt "TFRMEDITOR.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Редагувати" #: tfrmeditor.miencoding.caption msgctxt "TFRMEDITOR.MIENCODING.CAPTION" msgid "En&coding" msgstr "&Кодування" #: tfrmeditor.miencodingin.caption msgid "Open as" msgstr "Відкрити як" #: tfrmeditor.miencodingout.caption msgid "Save as" msgstr "Зберегти як" #: tfrmeditor.mifile.caption msgctxt "TFRMEDITOR.MIFILE.CAPTION" msgid "&File" msgstr "&Файл" #: tfrmeditor.mihighlight.caption msgid "Syntax highlight" msgstr "&Підсвітка синтаксису" #: tfrmeditor.milineendtype.caption msgid "End Of Line" msgstr "Кінець рядка" #: tfrmeditor.miseparator1.caption msgctxt "TFRMEDITOR.MISEPARATOR1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.miseparator2.caption msgctxt "TFRMEDITOR.MISEPARATOR2.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n1.caption msgctxt "TFRMEDITOR.N1.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n3.caption msgctxt "TFRMEDITOR.N3.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n4.caption msgctxt "TFRMEDITOR.N4.CAPTION" msgid "-" msgstr "-" #: tfrmeditor.n5.caption msgctxt "TFRMEDITOR.N5.CAPTION" msgid "-" msgstr "-" #: tfrmeditsearchreplace.btncancel.caption #| msgid "Cancel" msgctxt "TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmeditsearchreplace.btnok.caption msgctxt "TFRMEDITSEARCHREPLACE.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfrmeditsearchreplace.cbsearchcasesensitive.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION" msgid "C&ase sensitivity" msgstr "&Чутливість до регістру" #: tfrmeditsearchreplace.cbsearchfromcursor.caption #| msgid "Search from &caret" msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION" msgid "S&earch from caret" msgstr "Шукати від &курсора" #: tfrmeditsearchreplace.cbsearchregexp.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION" msgid "&Regular expressions" msgstr "&Регулярні вирази" #: tfrmeditsearchreplace.cbsearchselectedonly.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION" msgid "Selected &text only" msgstr "Лише виділений &текст" #: tfrmeditsearchreplace.cbsearchwholewords.caption msgctxt "TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION" msgid "&Whole words only" msgstr "Лише слова &повністю" #: tfrmeditsearchreplace.gbsearchoptions.caption msgctxt "TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION" msgid "Option" msgstr "Опції" #: tfrmeditsearchreplace.lblreplacewith.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION" msgid "&Replace with:" msgstr "&Замінити на:" #: tfrmeditsearchreplace.lblsearchfor.caption msgctxt "TFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION" msgid "&Search for:" msgstr "З&найти:" #: tfrmeditsearchreplace.rgsearchdirection.caption msgctxt "TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION" msgid "Direction" msgstr "Напрямок" #: tfrmextractdlg.btncancel.caption #| msgid "Cancel" msgctxt "TFRMEXTRACTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmextractdlg.btnhelp.caption #| msgid "Help" msgctxt "TFRMEXTRACTDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Допомо&га" #: tfrmextractdlg.btnok.caption #| msgid "OK" msgctxt "TFRMEXTRACTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfrmextractdlg.caption msgctxt "TFRMEXTRACTDLG.CAPTION" msgid "Unpack files" msgstr "Розпакувати файли" #: tfrmextractdlg.cbextractpath.caption msgid "&Unpack path names if stored with files" msgstr "Роз&пакувати шляхи якщо такі є з файлами" #: tfrmextractdlg.cbfilemask.text msgid "*.*" msgstr "*.*" #: tfrmextractdlg.cbinseparatefolder.caption msgid "Unpack each archive to a &separate subdir (name of the archive)" msgstr "Розпакувати кожен архів в &окремий каталог (з іменем архіву)" #: tfrmextractdlg.cboverwrite.caption #| msgid "&Overwrite existing files" msgid "O&verwrite existing files" msgstr "&Замінювати існуючі файли" #: tfrmextractdlg.lblextractto.caption #| msgid "To the directory:" msgid "To the &directory:" msgstr "В катало&г:" #: tfrmextractdlg.lblfilemask.caption #| msgid "Extract files matching file mask:" msgid "&Extract files matching file mask:" msgstr "Розпакувати файли по мас&ці:" #: tfrmextractdlg.lblpassword.caption #| msgid "Password for encrypted files:" msgid "&Password for encrypted files:" msgstr "Пароль для за&шифрованих файлів:" #: tfrmfileassoc.btnaddact.caption msgctxt "TFRMFILEASSOC.BTNADDACT.CAPTION" msgid "Add" msgstr "Додати" #: tfrmfileassoc.btnaddext.caption #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDEXT.CAPTION" msgid "&Add" msgstr "&Додати" #: tfrmfileassoc.btnaddnewtype.caption #| msgid "Add" msgctxt "TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION" msgid "A&dd" msgstr "&Додати" #: tfrmfileassoc.btncancel.caption #| msgid "Cancel" msgctxt "TFRMFILEASSOC.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmfileassoc.btndownact.caption #| msgid "Down" msgctxt "TFRMFILEASSOC.BTNDOWNACT.CAPTION" msgid "&Down" msgstr "В&низ" #: tfrmfileassoc.btnok.caption msgctxt "TFRMFILEASSOC.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfrmfileassoc.btnremoveact.caption #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEACT.CAPTION" msgid "Remo&ve" msgstr "&Видалити" #: tfrmfileassoc.btnremoveext.caption #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVEEXT.CAPTION" msgid "Re&move" msgstr "В&идалити" #: tfrmfileassoc.btnremoveicon.caption msgctxt "TFRMFILEASSOC.BTNREMOVEICON.CAPTION" msgid "X" msgstr "X" #: tfrmfileassoc.btnremovetype.caption #| msgid "Remove" msgctxt "TFRMFILEASSOC.BTNREMOVETYPE.CAPTION" msgid "&Remove" msgstr "Вид&алити" #: tfrmfileassoc.btnrenametype.caption #| msgid "Rename" msgctxt "TFRMFILEASSOC.BTNRENAMETYPE.CAPTION" msgid "R&ename" msgstr "Пере&йменувати" #: tfrmfileassoc.btnupact.caption #| msgid "Up" msgctxt "TFRMFILEASSOC.BTNUPACT.CAPTION" msgid "&Up" msgstr "Вгор&у" #: tfrmfileassoc.caption msgid "File associations" msgstr "Асоціації з файлами" #: tfrmfileassoc.gbactions.caption msgctxt "TFRMFILEASSOC.GBACTIONS.CAPTION" msgid "Actions" msgstr "Дії" #: tfrmfileassoc.gbexts.caption msgid "Extensions" msgstr "Розширення" #: tfrmfileassoc.gbfiletypes.caption msgctxt "TFRMFILEASSOC.GBFILETYPES.CAPTION" msgid "File types" msgstr "Типи файлів" #: tfrmfileassoc.gbicon.caption msgid "Icon" msgstr "Іконка" #: tfrmfileassoc.lblaction.caption msgid "Action:" msgstr "Дія:" #: tfrmfileassoc.lblcommand.caption msgctxt "TFRMFILEASSOC.LBLCOMMAND.CAPTION" msgid "&Command:" msgstr "&Команда:" #: tfrmfileassoc.miedit.caption msgctxt "TFRMFILEASSOC.MIEDIT.CAPTION" msgid "Edit" msgstr "Редагувати" #: tfrmfileassoc.mieditor.caption msgid "Open in Editor" msgstr "Відкрити у редакторі" #: tfrmfileassoc.mifilename.caption msgctxt "TFRMFILEASSOC.MIFILENAME.CAPTION" msgid "File name" msgstr "Ім'я файлу" #: tfrmfileassoc.mifilepath.caption msgid "File path" msgstr "Шлях до файлу" #: tfrmfileassoc.mifullpath.caption msgid "Full path" msgstr "Повний шлях" #: tfrmfileassoc.migetoutputfromcommand.caption msgid "Get output from command" msgstr "Отримати вивід команди" #: tfrmfileassoc.miopen.caption msgctxt "TFRMFILEASSOC.MIOPEN.CAPTION" msgid "Open" msgstr "Відкрити" #: tfrmfileassoc.mishell.caption msgid "Run in terminal" msgstr "Запустити у терміналі" #: tfrmfileassoc.mivfs.caption msgid "Open in VFS" msgstr "Відкрити з VFS" #: tfrmfileassoc.miview.caption msgctxt "TFRMFILEASSOC.MIVIEW.CAPTION" msgid "View" msgstr "Перегляд" #: tfrmfileassoc.miviewer.caption msgid "Open in Viewer" msgstr "Відкрити у переглядачі" #: tfrmfileexecuteyourself.btnclose.caption msgctxt "TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Закрити" #: tfrmfileexecuteyourself.caption msgctxt "TFRMFILEEXECUTEYOURSELF.CAPTION" msgid "Wait..." msgstr "Почекайте..." #: tfrmfileexecuteyourself.lblfilename.caption msgid "File name:" msgstr "Ім'я файлу:" #: tfrmfileexecuteyourself.lblfrompath.caption msgctxt "TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION" msgid "From:" msgstr "З" #: tfrmfileexecuteyourself.lblprompt.caption msgid "Click on Close when the temporary file can be deleted!" msgstr "Натисніть \"Закрити\", коли тимчасовий файл може бути видалений!" #: tfrmfileop.btncancel.caption #| msgid "Cancel" msgctxt "TFRMFILEOP.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmfileop.btnminimizetopanel.caption msgid "&To panel" msgstr "&На панель" #: tfrmfileop.btnviewoperations.caption msgid "&View all" msgstr "Переглянути &все" #: tfrmfileop.lblcurrentoperation.caption msgid "Current operation:" msgstr "Поточна операція:" #: tfrmfileop.lblfrom.caption msgctxt "TFRMFILEOP.LBLFROM.CAPTION" msgid "From:" msgstr "З" #: tfrmfileop.lblto.caption msgid "To:" msgstr "В" #: tfrmfileproperties.btnclose.caption #| msgid "Close" msgctxt "TFRMFILEPROPERTIES.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Закрити" #: tfrmfileproperties.btnsetproperties.caption msgid "&Set properties" msgstr "В&становити властивості" #: tfrmfileproperties.btnsetpropertiestoallfiles.caption msgid "Set to &all selected files" msgstr "Встановити для &всіх вибраних файлів" #: tfrmfileproperties.btnskipfile.caption msgid "Ski&p this file" msgstr "&Пропустити цей файл" #: tfrmfileproperties.caption msgctxt "TFRMFILEPROPERTIES.CAPTION" msgid "Properties" msgstr "Властивості" #: tfrmfileproperties.cbsgid.caption msgctxt "TFRMFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmfileproperties.cbsticky.caption msgctxt "TFRMFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Закріплювальний біт" #: tfrmfileproperties.cbsuid.caption msgctxt "TFRMFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmfileproperties.gbowner.caption msgctxt "TFRMFILEPROPERTIES.GBOWNER.CAPTION" msgid "Owner" msgstr "Власник" #: tfrmfileproperties.lblattrbitsstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Біти:" #: tfrmfileproperties.lblattrgroupstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Група" #: tfrmfileproperties.lblattrotherstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Інші" #: tfrmfileproperties.lblattrownerstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Власник" #: tfrmfileproperties.lblattrtext.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmfileproperties.lblattrtextstr.caption msgctxt "TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "У вигляді тексту:" #: tfrmfileproperties.lblcontains.caption msgctxt "tfrmfileproperties.lblcontains.caption" msgid "???" msgstr "???" #: tfrmfileproperties.lblcontainsstr.caption msgid "Contains:" msgstr "Містить:" #: tfrmfileproperties.lblexec.caption msgctxt "TFRMFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Виконати" #: tfrmfileproperties.lblfile.caption msgctxt "TFRMFILEPROPERTIES.LBLFILE.CAPTION" msgid "File name" msgstr "Ім'я файлу" #: tfrmfileproperties.lblfilename.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAME.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfilenamestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION" msgid "Name:" msgstr "Ім'я:" #: tfrmfileproperties.lblfilestr.caption msgctxt "TFRMFILEPROPERTIES.LBLFILESTR.CAPTION" msgid "File name" msgstr "Ім'я файлу" #: tfrmfileproperties.lblfolder.caption msgctxt "TFRMFILEPROPERTIES.LBLFOLDER.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblfolderstr.caption msgid "Path:" msgstr "Шлях:" #: tfrmfileproperties.lblgroupstr.caption #| msgid "Group" msgctxt "TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION" msgid "&Group" msgstr "Гру&па" #: tfrmfileproperties.lbllastaccess.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastaccessstr.caption msgid "Last access:" msgstr "Останній доступ:" #: tfrmfileproperties.lbllastmodif.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllastmodifstr.caption msgid "Last modification:" msgstr "Остання зміна:" #: tfrmfileproperties.lbllaststchange.caption msgctxt "TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbllaststchangestr.caption msgid "Last status change:" msgstr "Остання зміна статусу:" #: tfrmfileproperties.lbloctal.caption msgctxt "TFRMFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Вісімковий" #: tfrmfileproperties.lblownerstr.caption #| msgid "Owner" msgctxt "TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION" msgid "O&wner" msgstr "Власни&к" #: tfrmfileproperties.lblread.caption msgctxt "TFRMFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Читання" #: tfrmfileproperties.lblsize.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsizestr.caption msgctxt "TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION" msgid "Size:" msgstr "Розмір:" #: tfrmfileproperties.lblsymlink.caption msgctxt "TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lblsymlinkstr.caption msgid "Symlink to:" msgstr "Симв. посилання для:" #: tfrmfileproperties.lbltype.caption msgctxt "TFRMFILEPROPERTIES.LBLTYPE.CAPTION" msgid "???" msgstr "???" #: tfrmfileproperties.lbltypestr.caption msgid "Type:" msgstr "Тип:" #: tfrmfileproperties.lblwrite.caption msgctxt "TFRMFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Запис" #: tfrmfileproperties.tsattributes.caption msgctxt "TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Атрибути" #: tfrmfileproperties.tsproperties.caption msgctxt "TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION" msgid "Properties" msgstr "Властивості" #: tfrmfinddlg.btnaddattribute.caption msgctxt "tfrmfinddlg.btnaddattribute.caption" msgid "&Add" msgstr "&Додати" #: tfrmfinddlg.btnattrshelp.caption msgctxt "TFRMFINDDLG.BTNATTRSHELP.CAPTION" msgid "&Help" msgstr "Допомо&га" #: tfrmfinddlg.btnclose.caption msgctxt "TFRMFINDDLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Закрити" #: tfrmfinddlg.btnedit.caption msgctxt "tfrmfinddlg.btnedit.caption" msgid "&Edit" msgstr "Р&едагувати" #: tfrmfinddlg.btngotopath.caption msgid "&Go to file" msgstr "Пере&йти до файлу" #: tfrmfinddlg.btnlastsearch.caption msgctxt "tfrmfinddlg.btnlastsearch.caption" msgid "&Last search" msgstr "Останній пошу&к" #: tfrmfinddlg.btnnewsearch.caption msgid "&New search" msgstr "Н&овий пошук" #: tfrmfinddlg.btnsavetemplate.caption #| msgid "Save" msgctxt "TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION" msgid "&Save" msgstr "Збере&гти" #: tfrmfinddlg.btnsearchdelete.caption msgctxt "TFRMFINDDLG.BTNSEARCHDELETE.CAPTION" msgid "&Delete" msgstr "Ви&далити" #: tfrmfinddlg.btnsearchload.caption msgid "L&oad" msgstr "Заван&тажити" #: tfrmfinddlg.btnsearchsave.caption msgid "S&ave" msgstr "Збере&гти" #: tfrmfinddlg.btnsearchsavewithstartingpath.caption #, fuzzy #| msgid "Save with starting path" msgid "Sa&ve with \"Start in directory\"" msgstr "Зберегти шлях запуску" #: tfrmfinddlg.btnsearchsavewithstartingpath.hint #, fuzzy #| msgid "If starting path if saved then it will be restored when loading template. Use it if you want to fix searching to a certain directory." msgid "If saved then \"Start in directory\" will be restored when loading template. Use it if you want to fix searching to a certain directory" msgstr "Якщо шлях запуску збережено, то його буде відновлено при завантаженні шаблону. Використовуйте його, якщо ви хочете виправити пошук в певній директорії." #: tfrmfinddlg.btnstart.caption msgctxt "tfrmfinddlg.btnstart.caption" msgid "&Start" msgstr "&Старт" #: tfrmfinddlg.btnstop.caption #| msgid "Cancel" msgctxt "TFRMFINDDLG.BTNSTOP.CAPTION" msgid "C&ancel" msgstr "Ск&асувати" #: tfrmfinddlg.btnusetemplate.caption msgid "Use template" msgstr "Використати шаблон" #: tfrmfinddlg.btnview.caption msgctxt "TFRMFINDDLG.BTNVIEW.CAPTION" msgid "&View" msgstr "&Перегляд" #: tfrmfinddlg.btnworkwithfound.caption msgid "Feed to &listbox" msgstr "Фай&ли на панель" #: tfrmfinddlg.caption msgctxt "tfrmfinddlg.caption" msgid "Find files" msgstr "Пошук файлів" #: tfrmfinddlg.cbcasesens.caption msgid "Case sens&itive" msgstr "З врахуванням регістру" #: tfrmfinddlg.cbdatefrom.caption #| msgid "Date From:" msgid "&Date from:" msgstr "Дата в&ід:" #: tfrmfinddlg.cbdateto.caption #| msgid "Date To:" msgid "Dat&e to:" msgstr "Дата д&о:" #: tfrmfinddlg.cbfilesizefrom.caption #| msgid "Size from:" msgid "S&ize from:" msgstr "Розмір &від:" #: tfrmfinddlg.cbfilesizeto.caption #| msgid "Size to:" msgid "Si&ze to:" msgstr "Розмір &до:" #: tfrmfinddlg.cbfindtext.caption msgctxt "TFRMFINDDLG.CBFINDTEXT.CAPTION" msgid "Find &text in file" msgstr "&Шукати текст у файлі" #: tfrmfinddlg.cbfollowsymlinks.caption #, fuzzy #| msgid "Follow symlinks" msgctxt "tfrmfinddlg.cbfollowsymlinks.caption" msgid "Follow s&ymlinks" msgstr "Перейти за посиланнями" #: tfrmfinddlg.cbnotcontainingtext.caption msgctxt "TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION" msgid "Find files N&OT containing the text" msgstr "Шукати файли, що &НЕ містять текст" #: tfrmfinddlg.cbnotolderthan.caption #| msgid "Not older than:" msgid "N&ot older than:" msgstr "Н&е старші ніж:" #: tfrmfinddlg.cbpartialnamesearch.caption #| msgid "Search for part of file name " msgid "Searc&h for part of file name" msgstr "Шукати по &частині назви файлу" #: tfrmfinddlg.cbregexp.caption #| msgid "&Regular expressions" msgctxt "TFRMFINDDLG.CBREGEXP.CAPTION" msgid "&Regular expression" msgstr "&Регулярні вирази" #: tfrmfinddlg.cbreplacetext.caption msgid "Re&place by" msgstr "За&мінити на" #: tfrmfinddlg.cbselectedfiles.caption msgid "Selected directories and &files" msgstr "Вибрані &файли і каталоги" #: tfrmfinddlg.cbtimefrom.caption #| msgid "Time from:" msgid "&Time from:" msgstr "&Час від:" #: tfrmfinddlg.cbtimeto.caption #| msgid "Time to:" msgid "Ti&me to:" msgstr "Ча&с до:" #: tfrmfinddlg.cbuseplugin.caption msgid "&Use search plugin:" msgstr "Використовувати пошуковий п&лагін" #: tfrmfinddlg.cmbexcludedirectories.hint msgid "Enter directories names that should be excluded from search separated with \";\"" msgstr "Введіть імена каталогів, які повинні бути виключені з пошуку, через \";\"" #: tfrmfinddlg.cmbexcludefiles.hint msgid "Enter files names that should be excluded from search separated with \";\"" msgstr "Введіть імена файлів, які повинні бути виключені з пошуку, через \";\"" #: tfrmfinddlg.cmbfindfilemask.hint msgid "Enter files names separated with \";\"" msgstr "Введіть імена файлів, через \";\"" #: tfrmfinddlg.cmbfindfilemask.text msgctxt "TFRMFINDDLG.CMBFINDFILEMASK.TEXT" msgid "*" msgstr "*" #: tfrmfinddlg.gbdirectories.caption msgctxt "tfrmfinddlg.gbdirectories.caption" msgid "Directories" msgstr "Каталоги" #: tfrmfinddlg.gbfiles.caption msgctxt "tfrmfinddlg.gbfiles.caption" msgid "Files" msgstr "Файли" #: tfrmfinddlg.gbfinddata.caption msgid "Find Data" msgstr "Пошук даних з текстом" #: tfrmfinddlg.lblattributes.caption msgid "Attri&butes" msgstr "Атри&бути" #: tfrmfinddlg.lblencoding.caption #| msgid "Encoding:" msgctxt "TFRMFINDDLG.LBLENCODING.CAPTION" msgid "Encodin&g:" msgstr "Кодуванн&я:" #: tfrmfinddlg.lblexcludedirectories.caption msgid "E&xclude subdirectories" msgstr "Пр&опустити підкаталоги" #: tfrmfinddlg.lblexcludefiles.caption msgid "&Exclude files" msgstr "Проп&устити файли" #: tfrmfinddlg.lblfindfilemask.caption msgid "&File mask" msgstr "По &масці файлу" #: tfrmfinddlg.lblfindpathstart.caption #| msgid "&Start in directory" msgid "Start in &directory" msgstr "Шукати в &каталозі:" #: tfrmfinddlg.lblsearchdepth.caption msgid "Search su&bdirectories:" msgstr "Шукати в під&каталогах:" #: tfrmfinddlg.lbltemplateheader.caption msgid "&Previous searches:" msgstr "&Попередні пошуки:" #: tfrmfinddlg.miremovefromllist.caption msgid "Remove from list" msgstr "Видалити зі списку" #: tfrmfinddlg.mishowallfound.caption msgid "Show all found items" msgstr "Показати все знайдене" #: tfrmfinddlg.mishowinviewer.caption msgid "Show In Viewer" msgstr "Перегляд" #: tfrmfinddlg.tsadvanced.caption msgid "Advanced" msgstr "Розширені" #: tfrmfinddlg.tsloadsave.caption msgid "Load/Save" msgstr "Завантажити/Зберегти" #: tfrmfinddlg.tsplugins.caption msgctxt "tfrmfinddlg.tsplugins.caption" msgid "Plugins" msgstr "Плагіни" #: tfrmfinddlg.tsresults.caption msgid "Results" msgstr "Результати" #: tfrmfinddlg.tsstandard.caption msgid "Standard" msgstr "Стандартні" #: tfrmfindview.btnclose.caption #| msgid "Cancel" msgctxt "TFRMFINDVIEW.BTNCLOSE.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmfindview.btnfind.caption #| msgid "Find" msgctxt "TFRMFINDVIEW.BTNFIND.CAPTION" msgid "&Find" msgstr "&Знайти" #: tfrmfindview.caption msgctxt "TFRMFINDVIEW.CAPTION" msgid "Find" msgstr "Знайти" #: tfrmfindview.cbcasesens.caption #| msgid "Case sensitive" msgid "C&ase sensitive" msgstr "З урахуванням рег&істру" #: tfrmhardlink.btncancel.caption #| msgid "Cancel" msgctxt "TFRMHARDLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmhardlink.btnok.caption msgctxt "TFRMHARDLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfrmhardlink.caption msgid "Create hard link" msgstr "Створити жорстке посилання" #: tfrmhardlink.lblexistingfile.caption #| msgid "Destination that the link will point to" msgctxt "TFRMHARDLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "О&б’єкт на який вказуватиме посилання" #: tfrmhardlink.lbllinktocreate.caption #| msgid "Link name" msgctxt "TFRMHARDLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Ім'я п&осилання" #: tfrmhotdir.btnadd.caption #| msgid "Add" msgctxt "TFRMHOTDIR.BTNADD.CAPTION" msgid "&Add" msgstr "&Додати" #: tfrmhotdir.btnaddman.caption #| msgid "Add manually" msgid "Add &manually" msgstr "Додати вруч&ну" #: tfrmhotdir.btncancel.caption #| msgid "Cancel" msgctxt "TFRMHOTDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmhotdir.btndelete.caption #| msgid "Delete" msgctxt "TFRMHOTDIR.BTNDELETE.CAPTION" msgid "&Delete" msgstr "Ви&далити" #: tfrmhotdir.btnedit.caption #| msgid "Edit" msgctxt "TFRMHOTDIR.BTNEDIT.CAPTION" msgid "&Edit" msgstr "&Редагувати" #: tfrmhotdir.btnok.caption msgctxt "TFRMHOTDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfrmhotdir.caption msgid "Directory Hotlist" msgstr "Вибрані каталоги" #: tfrmlinker.btnexit.caption #| msgid "Cancel" msgctxt "TFRMLINKER.BTNEXIT.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmlinker.btnok.caption #| msgid "OK" msgctxt "TFRMLINKER.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfrmlinker.btnsave.caption msgctxt "TFRMLINKER.BTNSAVE.CAPTION" msgid "..." msgstr "..." #: tfrmlinker.caption msgctxt "TFRMLINKER.CAPTION" msgid "Linker" msgstr "Компонувальник" #: tfrmlinker.gbsaveto.caption msgid "Save to..." msgstr "Зберегти до..." #: tfrmlinker.grbxcontrol.caption msgid "Item" msgstr "Елемент" #: tfrmlinker.lblfilename.caption #| msgid "File name" msgctxt "TFRMLINKER.LBLFILENAME.CAPTION" msgid "&File name" msgstr "Ім'&я файлу" #: tfrmlinker.spbtndel.caption #| msgid "Delete" msgctxt "TFRMLINKER.SPBTNDEL.CAPTION" msgid "&Delete" msgstr "Ви&далити" #: tfrmlinker.spbtndel.hint msgctxt "TFRMLINKER.SPBTNDEL.HINT" msgid "Delete" msgstr "Видалити" #: tfrmlinker.spbtndown.caption #| msgid "Down" msgctxt "TFRMLINKER.SPBTNDOWN.CAPTION" msgid "Do&wn" msgstr "В&низ" #: tfrmlinker.spbtndown.hint msgctxt "TFRMLINKER.SPBTNDOWN.HINT" msgid "Down" msgstr "Вниз" #: tfrmlinker.spbtnup.caption #| msgid "Up" msgctxt "TFRMLINKER.SPBTNUP.CAPTION" msgid "&Up" msgstr "Вгор&у" #: tfrmlinker.spbtnup.hint msgctxt "TFRMLINKER.SPBTNUP.HINT" msgid "Up" msgstr "Вгору" #: tfrmmain.actabout.caption msgctxt "TFRMMAIN.ACTABOUT.CAPTION" msgid "&About" msgstr "Пр&о програму" #: tfrmmain.actaddfilenametocmdline.caption msgid "Add file name to command line" msgstr "Додати ім'я файлу в командний рядок" #: tfrmmain.actaddpathandfilenametocmdline.caption msgid "Add path and file name to command line" msgstr "Додати шлях і ім'я файлу в командний рядок" #: tfrmmain.actaddpathtocmdline.caption msgid "Copy path to command line" msgstr "Копіювати шлях в командний рядок" #: tfrmmain.actbriefview.caption msgid "Brief" msgstr "Короткий" #: tfrmmain.actbriefview.hint msgid "Brief View" msgstr "Cтислий вигляд" #: tfrmmain.actcalculatespace.caption #| msgid "Calculate &Occupied Space..." msgid "Calculate &Occupied Space" msgstr "Розрахувати зайнятий об'&єм" #: tfrmmain.actchangedir.caption msgid "Change directory" msgstr "Змінити каталог" #: tfrmmain.actchangedirtoparent.caption msgid "Change Directory To Parent" msgstr "Перейти в батьківський каталог" #: tfrmmain.actchangedirtoroot.caption msgid "Change directory to root" msgstr "Перейти в кореневий каталог" #: tfrmmain.actchecksumcalc.caption #| msgid "Calculate check sum..." msgctxt "TFRMMAIN.ACTCHECKSUMCALC.CAPTION" msgid "Calculate Check&sum..." msgstr "&Розрахувати контрольну суму..." #: tfrmmain.actchecksumverify.caption #| msgid "Verify check sum..." msgctxt "TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION" msgid "&Verify Checksum..." msgstr "Перевірити контрол&ьну суму..." #: tfrmmain.actclearlogfile.caption msgid "Clear log file" msgstr "Очистити файл звіту" #: tfrmmain.actclearlogwindow.caption msgid "Clear log window" msgstr "Очистити вікно звіту" #: tfrmmain.actclosealltabs.caption #| msgid "Remove &All Tabs" msgctxt "tfrmmain.actclosealltabs.caption" msgid "Close &All Tabs" msgstr "За&акрити всі вкладки" #: tfrmmain.actclosetab.caption #| msgid "&Remove Tab" msgctxt "tfrmmain.actclosetab.caption" msgid "&Close Tab" msgstr "&Закрити вкладку" #: tfrmmain.actcmdlinenext.caption msgid "Next Command Line" msgstr "Наступний командний рядок" #: tfrmmain.actcmdlinenext.hint msgid "Set command line to next command in history" msgstr "Встановіть командному рядку наступну команду з історії" #: tfrmmain.actcmdlineprev.caption msgid "Previous Command Line" msgstr "Попередній командний рядок" #: tfrmmain.actcmdlineprev.hint msgid "Set command line to previous command in history" msgstr "Встановіть командному рядку попередню команду з історії" #: tfrmmain.actcolumnsview.caption msgid "Full" msgstr "Повний" #: tfrmmain.actcolumnsview.hint msgid "Columns View" msgstr "Набір колонок" #: tfrmmain.actcomparecontents.caption msgid "Compare by &Contents" msgstr "Порівняти за &вмістом" #: tfrmmain.actcomparedirectories.caption msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.CAPTION" msgid "Compare Directories" msgstr "Порівняти каталоги" #: tfrmmain.actcomparedirectories.hint msgctxt "TFRMMAIN.ACTCOMPAREDIRECTORIES.HINT" msgid "Compare Directories" msgstr "Порівняти каталоги" #: tfrmmain.actcontextmenu.caption msgid "Show context menu" msgstr "Показати контекстне меню" #: tfrmmain.actcopy.caption #| msgid "Copy" msgctxt "tfrmmain.actcopy.caption" msgid "Copy" msgstr "Копіювати" #: tfrmmain.actcopyfullnamestoclip.caption msgid "Copy Filename(s) with Full &Path" msgstr "Копіювати ім'я файла(ів) разом з повним шля&хом" #: tfrmmain.actcopynamestoclip.caption msgid "Copy &Filename(s) to Clipboard" msgstr "Копіювати ім'я файла(ів) в &буфер" #: tfrmmain.actcopynoask.caption msgid "Copy files without asking for confirmation" msgstr "Копіювати файли без запиту підтвердження" #: tfrmmain.actcopysamepanel.caption msgid "Copy to same panel" msgstr "Копіювати в ту ж панель" #: tfrmmain.actcopytoclipboard.caption msgid "&Copy" msgstr "&Копіювати" #: tfrmmain.actcountdircontent.caption #| msgid "Sho&w occupied space" msgid "Sho&w Occupied Space" msgstr "&Показати зайнятий простір" #: tfrmmain.actcuttoclipboard.caption msgid "Cu&t" msgstr "Ви&різати" #: tfrmmain.actdelete.caption #| msgid "Delete" msgctxt "TFRMMAIN.ACTDELETE.CAPTION" msgid "Delete" msgstr "Видалити" #: tfrmmain.actdirhistory.caption msgctxt "TFRMMAIN.ACTDIRHISTORY.CAPTION" msgid "Directory history" msgstr "Історія каталогів" #: tfrmmain.actdirhotlist.caption #| msgid "Directory &hotlist" msgid "Directory &Hotlist" msgstr "Особистий спис&ок каталогів" #: tfrmmain.actedit.caption #| msgid "Edit" msgctxt "tfrmmain.actedit.caption" msgid "Edit" msgstr "Редагувати" #: tfrmmain.acteditcomment.caption #| msgid "Edit comment..." msgid "Edit Co&mment..." msgstr "Редагувати &коментар..." #: tfrmmain.acteditnew.caption msgid "Edit new file" msgstr "Редагувати новий файл" #: tfrmmain.acteditpath.caption msgid "Edit path field above file list" msgstr "Редагувати шлях в заголовку списку" #: tfrmmain.actexchange.caption msgid "Swap &Panels" msgstr "Поміняти панелі місцями" #: tfrmmain.actexit.caption msgctxt "TFRMMAIN.ACTEXIT.CAPTION" msgid "E&xit" msgstr "Ви&хід" #: tfrmmain.actextractfiles.caption #| msgid "Extract files..." msgid "&Extract Files..." msgstr "Розпак&увати файли..." #: tfrmmain.actfileassoc.caption #| msgid "File &associations..." msgid "File &Associations..." msgstr "Асоціаці&ї з файлами..." #: tfrmmain.actfilelinker.caption #| msgid "Link files" msgid "Com&bine Files..." msgstr "Ск&леїти файли..." #: tfrmmain.actfileproperties.caption #| msgid "Show file properties" msgid "Show &File Properties" msgstr "Властивост&і файлу" #: tfrmmain.actfilespliter.caption #| msgid "Split file" msgctxt "TFRMMAIN.ACTFILESPLITER.CAPTION" msgid "Spl&it File..." msgstr "Ро&зрізати файл..." #: tfrmmain.actfocuscmdline.caption msgid "Focus command line" msgstr "Перейти в командний рядок" #: tfrmmain.actgotofirstfile.caption msgid "Place cursor on first file in list" msgstr "Помістити курсор на перший у списку файл" #: tfrmmain.actgotolastfile.caption msgid "Place cursor on last file in list" msgstr "Помістити курсор на останній у списку файл" #: tfrmmain.acthardlink.caption #| msgid "Create hard link..." msgctxt "TFRMMAIN.ACTHARDLINK.CAPTION" msgid "Create &Hard Link..." msgstr "Створити &жорстке посилання..." #: tfrmmain.acthelpindex.caption msgid "&Contents" msgstr "&Довідка" #: tfrmmain.acthorizontalfilepanels.caption #| msgid "Horizontal file panels" msgid "&Horizontal Panels Mode" msgstr "&Горизонтальне розміщення панелей" #: tfrmmain.actkeyboard.caption msgid "&Keyboard" msgstr "Гарячі &клавіші" #: tfrmmain.actleftequalright.caption msgid "Left &= Right" msgstr "Ліва &= Права" #: tfrmmain.actleftopendrives.caption msgid "Open left drive list" msgstr "Відкрити список дисків зліва" #: tfrmmain.actloadselectionfromclip.caption #, fuzzy #| msgid "Load Selection From Clipboard" msgid "Load Selection from Clip&board" msgstr "Завантажити виділенння з б&уферу" #: tfrmmain.actloadselectionfromfile.caption #, fuzzy #| msgid "Load Selection From File" msgid "&Load Selection from File..." msgstr "Завантажити виділенння з ф&айлу..." #: tfrmmain.actmakedir.caption #| msgid "MakeDir" msgid "MakeDir" msgstr "Каталог" #: tfrmmain.actmarkcurrentextension.caption #| msgid "Select all with same extension" msgid "Select All with the Same E&xtension" msgstr "Виділити всі з такими ж роз&ширеннями" #: tfrmmain.actmarkinvert.caption #| msgid "Invert Selections" msgid "&Invert Selection" msgstr "&Інверсія виділення" #: tfrmmain.actmarkmarkall.caption msgid "&Select All" msgstr "&Виділити все" #: tfrmmain.actmarkminus.caption #| msgid "Unselect a group" msgid "Unselect a Gro&up..." msgstr "Зняти виділення з г&рупи..." #: tfrmmain.actmarkplus.caption #| msgid "Select a group" msgid "Select a &Group..." msgstr "Виділити &групу..." #: tfrmmain.actmarkunmarkall.caption #| msgid "Unselect All" msgid "&Unselect All" msgstr "Зняти виділення з у&сіх" #: tfrmmain.actminimize.caption msgid "Minimize window" msgstr "Згорнути" #: tfrmmain.actmultirename.caption #| msgid "Multi Rename Tool" msgid "Multi &Rename Tool" msgstr "&Мультиперейменування" #: tfrmmain.actnetworkconnect.caption #| msgid "Network Connect..." msgid "Network &Connect..." msgstr "З'&єднання з мережею..." #: tfrmmain.actnetworkdisconnect.caption #| msgid "Network Disconnect" msgid "Network &Disconnect" msgstr "Розірвати з'є&днання" #: tfrmmain.actnetworkquickconnect.caption #| msgid "Network Quick Connect..." msgid "Network &Quick Connect..." msgstr "Н&ове з'єднання..." #: tfrmmain.actnewtab.caption #| msgid "&New tab" msgid "&New Tab" msgstr "Н&ова вкладка" #: tfrmmain.actnexttab.caption #| msgid "Switch to nex&t tab" msgid "Switch to Nex&t Tab" msgstr "Перейти до нас&тупної вкладки" #: tfrmmain.actopen.caption msgctxt "TFRMMAIN.ACTOPEN.CAPTION" msgid "Open" msgstr "Відкрити" #: tfrmmain.actopenarchive.caption msgid "Try open archive" msgstr "Спробувати відкрити архів" #: tfrmmain.actopenbar.caption msgid "Open bar file" msgstr "Відкрити bar файл" #: tfrmmain.actopendirinnewtab.caption #| msgid "Open &folder in new tab" msgid "Open &Folder in a New Tab" msgstr "Відкрити каталог у новій вклад&ці" #: tfrmmain.actopenvirtualfilesystemlist.caption msgctxt "TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION" msgid "Open &VFS List" msgstr "Відкрити сп&исок VFS" #: tfrmmain.actoperationsviewer.caption msgid "Operations &Viewer" msgstr "Показати операції з &файлами" #: tfrmmain.actoptions.caption msgid "&Options..." msgstr "&Основні..." #: tfrmmain.actpackfiles.caption #| msgid "Pack files..." msgid "&Pack Files..." msgstr "У&пакувати файли..." #: tfrmmain.actpanelssplitterperpos.caption msgid "Set splitter position" msgstr "Встановити позицію роздільника" #: tfrmmain.actpastefromclipboard.caption msgid "&Paste" msgstr "&Вставити" #: tfrmmain.actprevtab.caption #| msgid "Switch to &previous tab" msgid "Switch to &Previous Tab" msgstr "Перейти до &попередньої вкладки" #: tfrmmain.actquickfilter.caption msgid "Quick filter" msgstr "Швидкий фільтр" #: tfrmmain.actquicksearch.caption msgctxt "TFRMMAIN.ACTQUICKSEARCH.CAPTION" msgid "Quick search" msgstr "Швидкий пошук" #: tfrmmain.actquickview.caption #| msgid "Quick View Panel" msgid "&Quick View Panel" msgstr "&Панель швидкого перегляду" #: tfrmmain.actrefresh.caption msgid "&Refresh" msgstr "&Оновити" #: tfrmmain.actrename.caption #| msgid "Move" msgctxt "tfrmmain.actrename.caption" msgid "Move" msgstr "Перемістити" #: tfrmmain.actrenamenoask.caption msgid "Move/Rename files without asking for confirmation" msgstr "Перемістити/Перейменувати файли без запиту підтвердження" #: tfrmmain.actrenameonly.caption msgctxt "TFRMMAIN.ACTRENAMEONLY.CAPTION" msgid "Rename" msgstr "Перейменувати" #: tfrmmain.actrenametab.caption #| msgid "Re&name Tab" msgid "&Rename Tab" msgstr "Перей&менувати вкладку" #: tfrmmain.actrestoreselection.caption #| msgid "Restore Selection" msgid "&Restore Selection" msgstr "Ві&дновити виділення" #: tfrmmain.actreverseorder.caption #| msgid "Reverse order" msgid "Re&verse Order" msgstr "О&бернений порядок" #: tfrmmain.actrightequalleft.caption msgid "Right &= Left" msgstr "Права &= Ліва" #: tfrmmain.actrightopendrives.caption msgid "Open right drive list" msgstr "Відкрити список дисків справа" #: tfrmmain.actrunterm.caption #| msgid "Run Term" msgid "Run &Terminal" msgstr "Запуск &терміналу" #: tfrmmain.actsaveselection.caption #| msgid "Save Selection" msgid "Sa&ve Selection" msgstr "&Зберегти виділенння" #: tfrmmain.actsaveselectiontofile.caption #, fuzzy #| msgid "Save Selection To File" msgid "Save S&election to File..." msgstr "Зберегти виділення у фай&л..." #: tfrmmain.actsearch.caption #| msgid "&Search" msgid "&Search..." msgstr "По&шук..." #: tfrmmain.actsetfileproperties.caption #| msgid "Change attributes" msgctxt "TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION" msgid "Change &Attributes..." msgstr "Змінити &атрибути..." #: tfrmmain.actsettaboptiondirsinnewtab.caption #| msgid "Directories are opened in new &tabs" msgid "Locked with Directories Opened in New &Tabs" msgstr "Забло&кувати і відкривати каталоги у нових вкладках" #: tfrmmain.actsettaboptionnormal.caption msgid "&Normal" msgstr "Звичай&но" #: tfrmmain.actsettaboptionpathlocked.caption msgid "&Locked" msgstr "Заб&локувати" #: tfrmmain.actsettaboptionpathresets.caption #| msgid "Locked, but &directory changes allowed" msgctxt "TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION" msgid "Locked with &Directory Changes Allowed" msgstr "Заблоку&вати, але дозволити зміну каталогу" #: tfrmmain.actshellexecute.caption msgctxt "tfrmmain.actshellexecute.caption" msgid "Open" msgstr "Відкрити" #: tfrmmain.actshellexecute.hint msgid "Open using system associations" msgstr "Відкрийте за допомогою системи асоціацій" #: tfrmmain.actshowbuttonmenu.caption msgid "Show button menu" msgstr "Показати меню кнопки" #: tfrmmain.actshowcmdlinehistory.caption msgid "Show command line history" msgstr "Історія командного рядка" #: tfrmmain.actshowmainmenu.caption #| msgid "Menu" msgctxt "TFRMMAIN.ACTSHOWMAINMENU.CAPTION" msgid "Menu" msgstr "Меню" #: tfrmmain.actshowsysfiles.caption #| msgid "Show hidden/system files" msgctxt "TFRMMAIN.ACTSHOWSYSFILES.CAPTION" msgid "Show &Hidden/System Files" msgstr "Показувати при&ховані/системні файли" #: tfrmmain.actsortbyattr.caption #| msgid "Sort by attrib" msgid "Sort by &Attributes" msgstr "Сортувати за &атрибутами" #: tfrmmain.actsortbydate.caption #| msgid "Sort by date" msgid "Sort by &Date" msgstr "Сортувати за &датою" #: tfrmmain.actsortbyext.caption #| msgid "Sort by extension" msgid "Sort by &Extension" msgstr "Сортувати за роз&ширенням" #: tfrmmain.actsortbyname.caption #| msgid "Sort by name" msgid "Sort by &Name" msgstr "Сортувати за &ім’ям" #: tfrmmain.actsortbysize.caption #| msgid "Sort by size" msgid "Sort by &Size" msgstr "Сортувати за роз&міром" #: tfrmmain.actswitchignorelist.caption msgid "Enable/disable ignore list file to not show file names" msgstr "Включити/виключити чорний список файлів, щоб не показувати імена файлів" #: tfrmmain.actsymlink.caption #| msgid "Create symbolic link..." msgctxt "TFRMMAIN.ACTSYMLINK.CAPTION" msgid "Create Symbolic &Link..." msgstr "Створити &символічне посилання..." #: tfrmmain.acttargetequalsource.caption msgid "Target &= Source" msgstr "Ціль &= Джерелу" #: tfrmmain.acttestarchive.caption #| msgid "Test Archive(s)" msgid "&Test Archive(s)" msgstr "Перевіри&ти архів(и)" #: tfrmmain.actthumbnailsview.caption msgctxt "tfrmmain.actthumbnailsview.caption" msgid "Thumbnails" msgstr "Мініатюри" #: tfrmmain.actthumbnailsview.hint msgid "Thumbnails View" msgstr "Перегляд мініатюр" #: tfrmmain.acttransferleft.caption msgid "Transfer dir under cursor to left window" msgstr "Відкрити каталог під курсором на лівій панелі" #: tfrmmain.acttransferright.caption msgid "Transfer dir under cursor to right window" msgstr "Відкрити каталог під курсором на правій панелі" #: tfrmmain.actunmarkcurrentextension.caption #| msgid "Unselect all with same extension" msgid "Unselect All with the Same Ex&tension" msgstr "Зняти виділення з усіх з таким &же розширенням" #: tfrmmain.actview.caption #| msgid "View" msgctxt "tfrmmain.actview.caption" msgid "View" msgstr "Перегляд" #: tfrmmain.actviewhistory.caption msgid "Show history of visited paths for active view" msgstr "Показати історію відвіданих шляхів для активної панелі" #: tfrmmain.actviewhistorynext.caption msgid "Go to next entry in history" msgstr "Перейти до наступного запису в історії" #: tfrmmain.actviewhistoryprev.caption msgid "Go to previous entry in history" msgstr "Перейти до попереднього запису в історії" #: tfrmmain.actvisithomepage.caption #| msgid "&Visit Double Commander Web Site" msgid "&Visit Double Commander Website" msgstr "Відвідати домашн&ю сторінку Double Commander" #: tfrmmain.actwipe.caption msgid "Wipe" msgstr "Стерти" #: tfrmmain.btnf10.caption #| msgid "Exit" msgctxt "tfrmmain.btnf10.caption" msgid "Exit" msgstr "Вихід" #: tfrmmain.btnf8.caption #| msgid "Delete" msgctxt "TFRMMAIN.BTNF8.CAPTION" msgid "Delete" msgstr "Видалити" #: tfrmmain.btnf9.caption #| msgid "Terminal" msgctxt "tfrmmain.btnf9.caption" msgid "Terminal" msgstr "Термінал" #: tfrmmain.btnleftdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnleftdirectoryhotlist.hint msgctxt "TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.HINT" msgid "Directory hotlist" msgstr "Вибрані каталоги" #: tfrmmain.btnleftequalright.caption msgid "<" msgstr "<" #: tfrmmain.btnleftequalright.hint msgid "Show current directory of the right panel in the left panel" msgstr "Показати поточний каталог правої панелі в лівій панелі" #: tfrmmain.btnlefthome.caption msgctxt "TFRMMAIN.BTNLEFTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnlefthome.hint msgctxt "TFRMMAIN.BTNLEFTHOME.HINT" msgid "Go to home directory" msgstr "Перейти в домашній каталог" #: tfrmmain.btnleftroot.caption msgctxt "TFRMMAIN.BTNLEFTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnleftroot.hint msgctxt "TFRMMAIN.BTNLEFTROOT.HINT" msgid "Go to root directory" msgstr "Перейти в кореневий каталог" #: tfrmmain.btnleftup.caption msgctxt "TFRMMAIN.BTNLEFTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.btnleftup.hint msgctxt "TFRMMAIN.BTNLEFTUP.HINT" msgid "Go to parent directory" msgstr "Перейти у каталог вище" #: tfrmmain.btnrightdirectoryhotlist.caption msgctxt "TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION" msgid "*" msgstr "*" #: tfrmmain.btnrightequalleft.caption msgid ">" msgstr ">" #: tfrmmain.btnrightequalleft.hint msgid "Show current directory of the left panel in the right panel" msgstr "Показати поточний каталог лівої панелі в правій панелі" #: tfrmmain.btnrighthome.caption msgctxt "TFRMMAIN.BTNRIGHTHOME.CAPTION" msgid "~" msgstr "~" #: tfrmmain.btnrightroot.caption msgctxt "TFRMMAIN.BTNRIGHTROOT.CAPTION" msgid "/" msgstr "/" #: tfrmmain.btnrightup.caption msgctxt "TFRMMAIN.BTNRIGHTUP.CAPTION" msgid ".." msgstr ".." #: tfrmmain.caption msgctxt "tfrmmain.caption" msgid "Double Commander" msgstr "Double Commander" #: tfrmmain.lblcommandpath.caption msgctxt "TFRMMAIN.LBLCOMMANDPATH.CAPTION" msgid "Path" msgstr "Шлях" #: tfrmmain.menuitem2.caption msgctxt "TFRMMAIN.MENUITEM2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.mi2080.caption msgid "&20/80" msgstr "&20/80" #: tfrmmain.mi3070.caption msgid "&30/70" msgstr "&30/70" #: tfrmmain.mi4060.caption msgid "&40/60" msgstr "&40/60" #: tfrmmain.mi5050.caption msgid "&50/50" msgstr "&50/50" #: tfrmmain.mi6040.caption msgid "&60/40" msgstr "&60/40" #: tfrmmain.mi7030.caption msgid "&70/30" msgstr "&70/30" #: tfrmmain.mi8020.caption msgid "&80/20" msgstr "&80/20" #: tfrmmain.micancel.caption msgctxt "TFRMMAIN.MICANCEL.CAPTION" msgid "Cancel" msgstr "Скасувати" #: tfrmmain.micopy.caption msgid "Copy..." msgstr "Копіювати..." #: tfrmmain.mihardlink.caption msgctxt "TFRMMAIN.MIHARDLINK.CAPTION" msgid "Create link..." msgstr "Створити посилання..." #: tfrmmain.miline1.caption msgctxt "TFRMMAIN.MILINE1.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline12.caption msgctxt "TFRMMAIN.MILINE12.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline13.caption msgctxt "TFRMMAIN.MILINE13.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline14.caption msgctxt "TFRMMAIN.MILINE14.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline15.caption msgctxt "TFRMMAIN.MILINE15.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline16.caption msgctxt "TFRMMAIN.MILINE16.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline17.caption msgctxt "TFRMMAIN.MILINE17.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline18.caption msgctxt "TFRMMAIN.MILINE18.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline19.caption msgctxt "TFRMMAIN.MILINE19.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline2.caption msgctxt "TFRMMAIN.MILINE2.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline20.caption msgctxt "TFRMMAIN.MILINE20.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline22.caption msgctxt "TFRMMAIN.MILINE22.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline24.caption msgctxt "TFRMMAIN.MILINE24.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline25.caption msgctxt "TFRMMAIN.MILINE25.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline3.caption msgctxt "TFRMMAIN.MILINE3.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline32.caption msgctxt "TFRMMAIN.MILINE32.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline33.caption msgctxt "tfrmmain.miline33.caption" msgid "-" msgstr "-" #: tfrmmain.miline37.caption msgctxt "TFRMMAIN.MILINE37.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline4.caption msgctxt "TFRMMAIN.MILINE4.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline47.caption msgctxt "TFRMMAIN.MILINE47.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline5.caption msgctxt "TFRMMAIN.MILINE5.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline6.caption msgctxt "TFRMMAIN.MILINE6.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline7.caption msgctxt "TFRMMAIN.MILINE7.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline8.caption msgctxt "TFRMMAIN.MILINE8.CAPTION" msgid "-" msgstr "-" #: tfrmmain.miline9.caption msgctxt "TFRMMAIN.MILINE9.CAPTION" msgid "-" msgstr "-" #: tfrmmain.milogclear.caption msgid "Clear" msgstr "Очистити" #: tfrmmain.milogcopy.caption msgctxt "TFRMMAIN.MILOGCOPY.CAPTION" msgid "Copy" msgstr "Копіювати" #: tfrmmain.miloghide.caption msgid "Hide" msgstr "Сховати" #: tfrmmain.milogselectall.caption msgctxt "TFRMMAIN.MILOGSELECTALL.CAPTION" msgid "Select All" msgstr "Виділити все" #: tfrmmain.mimove.caption msgid "Move..." msgstr "Перемістити..." #: tfrmmain.misymlink.caption msgctxt "TFRMMAIN.MISYMLINK.CAPTION" msgid "Create symlink..." msgstr "Створити символічне посилання..." #: tfrmmain.mitaboptions.caption msgid "Tab options" msgstr "Налаштування вкладки" #: tfrmmain.mitrayiconexit.caption msgctxt "TFRMMAIN.MITRAYICONEXIT.CAPTION" msgid "E&xit" msgstr "Ви&хід" #: tfrmmain.mitrayiconrestore.caption msgid "Restore" msgstr "Відновити" #: tfrmmain.mnualloperpause.caption msgctxt "tfrmmain.mnualloperpause.caption" msgid "||" msgstr "||" #: tfrmmain.mnualloperstart.caption msgctxt "tfrmmain.mnualloperstart.caption" msgid "Start" msgstr "Старт" #: tfrmmain.mnualloperstop.caption msgctxt "tfrmmain.mnualloperstop.caption" msgid "Cancel" msgstr "Скасувати" #: tfrmmain.mnucmd.caption msgid "&Commands" msgstr "&Команди" #: tfrmmain.mnuconfig.caption msgid "C&onfiguration" msgstr "&Налаштування" #: tfrmmain.mnufiles.caption msgid "&Files" msgstr "&Файли" #: tfrmmain.mnuhelp.caption msgctxt "TFRMMAIN.MNUHELP.CAPTION" msgid "&Help" msgstr "&Допомога" #: tfrmmain.mnumark.caption msgid "&Mark" msgstr "&Виділення" #: tfrmmain.mnunetwork.caption msgctxt "TFRMMAIN.MNUNETWORK.CAPTION" msgid "Network" msgstr "Мережа" #: tfrmmain.mnushow.caption msgid "&Show" msgstr "Ви&гляд" #: tfrmmain.mnutaboptions.caption msgctxt "TFRMMAIN.MNUTABOPTIONS.CAPTION" msgid "&Options" msgstr "&Налаштування" #: tfrmmain.mnutabs.caption msgid "&Tabs" msgstr "Вкладк&и" #: tfrmmain.tbchangedir.caption msgid "CD" msgstr "CD" #: tfrmmain.tbcopy.caption msgctxt "TFRMMAIN.TBCOPY.CAPTION" msgid "Copy" msgstr "Копіювати" #: tfrmmain.tbcut.caption msgctxt "TFRMMAIN.TBCUT.CAPTION" msgid "Cut" msgstr "Вирізати" #: tfrmmain.tbdelete.caption msgctxt "TFRMMAIN.TBDELETE.CAPTION" msgid "Delete" msgstr "Видалити" #: tfrmmain.tbedit.caption msgctxt "TFRMMAIN.TBEDIT.CAPTION" msgid "Edit" msgstr "Редагувати" #: tfrmmain.tbpaste.caption msgctxt "TFRMMAIN.TBPASTE.CAPTION" msgid "Paste" msgstr "Вставити" #: tfrmmain.tbseparator.caption msgctxt "TFRMMAIN.TBSEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmmaskinputdlg.btncancel.caption #| msgid "Cancel" msgctxt "TFRMMASKINPUTDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmmaskinputdlg.btndefinetemplate.caption #| msgid "Define..." msgid "&Define..." msgstr "Ви&значити..." #: tfrmmaskinputdlg.btnok.caption msgctxt "TFRMMASKINPUTDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfrmmaskinputdlg.lblsearchtemplate.caption #| msgid "Or select predefined selection type:" msgid "O&r select predefined selection type:" msgstr "Або вибе&ріть тип виділення за шаблоном:" #: tfrmmkdir.btncancel.caption #| msgid "Cancel" msgctxt "TFRMMKDIR.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmmkdir.btnok.caption msgctxt "TFRMMKDIR.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfrmmkdir.caption msgid "Create new directory" msgstr "Створити новий каталог" #: tfrmmkdir.lblmakedir.caption #| msgid "Input new directory name:" msgid "&Input new directory name:" msgstr "Введіть &ім'я каталогу:" #: tfrmmodview.btnpath1.caption msgctxt "TFRMMODVIEW.BTNPATH1.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath2.caption msgctxt "TFRMMODVIEW.BTNPATH2.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath3.caption msgctxt "TFRMMODVIEW.BTNPATH3.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath4.caption msgctxt "TFRMMODVIEW.BTNPATH4.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnpath5.caption msgctxt "TFRMMODVIEW.BTNPATH5.CAPTION" msgid "..." msgstr "..." #: tfrmmodview.btnproportion.caption msgid "Pr" msgstr "Pr" #: tfrmmodview.caption msgctxt "TFRMMODVIEW.CAPTION" msgid "New Size" msgstr "Новий розмір" #: tfrmmodview.lblheight.caption msgid "Height :" msgstr "Висота :" #: tfrmmodview.lblpath1.caption msgctxt "TFRMMODVIEW.LBLPATH1.CAPTION" msgid "1" msgstr "1" #: tfrmmodview.lblpath2.caption msgid "2" msgstr "2" #: tfrmmodview.lblpath3.caption msgid "3" msgstr "3" #: tfrmmodview.lblpath4.caption msgid "4" msgstr "4" #: tfrmmodview.lblpath5.caption msgid "5" msgstr "5" #: tfrmmodview.lblquality.caption msgid "Quality of compress to Jpg" msgstr "Якість стиснення в Jpg" #: tfrmmodview.lblwidth.caption msgid "Width :" msgstr "Ширина :" #: tfrmmodview.rbbmp.caption msgid "BMP" msgstr "BMP" #: tfrmmodview.rbico.caption msgid "ICO" msgstr "ICO" #: tfrmmodview.rbjpg.caption msgid "JPG" msgstr "JPG" #: tfrmmodview.rbpng.caption msgid "PNG" msgstr "PNG" #: tfrmmodview.rbpnm.caption msgid "PNM" msgstr "PNM" #: tfrmmodview.teheight.text msgid "Height" msgstr "Висота" #: tfrmmodview.tequality.text msgid "80" msgstr "80" #: tfrmmodview.tewidth.text msgctxt "TFRMMODVIEW.TEWIDTH.TEXT" msgid "Width" msgstr "Ширина" #: tfrmmultirename.btnclose.caption msgctxt "TFRMMULTIRENAME.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Закрити" #: tfrmmultirename.btndeletepreset.caption msgctxt "TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION" msgid "&Delete" msgstr "Ви&далити" #: tfrmmultirename.btnextmenu.caption msgctxt "TFRMMULTIRENAME.BTNEXTMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnloadpreset.caption msgid "&Load" msgstr "&Завантажити" #: tfrmmultirename.btnnamemenu.caption msgctxt "TFRMMULTIRENAME.BTNNAMEMENU.CAPTION" msgid "..." msgstr "..." #: tfrmmultirename.btnrename.caption msgctxt "tfrmmultirename.btnrename.caption" msgid "&Rename" msgstr "&Перейменувати" #: tfrmmultirename.btnrestore.caption #| msgid "Reset all" msgid "Reset &all" msgstr "Відн&овити все" #: tfrmmultirename.btnsavepreset.caption msgctxt "TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION" msgid "&Save" msgstr "З&берегти" #: tfrmmultirename.caption msgctxt "tfrmmultirename.caption" msgid "MultiRename" msgstr "Групове перейменування" #: tfrmmultirename.cblog.caption #| msgid "Enable" msgctxt "TFRMMULTIRENAME.CBLOG.CAPTION" msgid "Ena&ble" msgstr "Ввімкн&ено" #: tfrmmultirename.cbregexp.caption msgctxt "TFRMMULTIRENAME.CBREGEXP.CAPTION" msgid "Regular e&xpressions" msgstr "Регулярні вира&зи" #: tfrmmultirename.cbusesubs.caption msgid "&Use substitution" msgstr "Використов&увати заміну" #: tfrmmultirename.cmbxwidth.text msgid "01" msgstr "01" #: tfrmmultirename.edinterval.text msgctxt "TFRMMULTIRENAME.EDINTERVAL.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.edpoc.text msgctxt "TFRMMULTIRENAME.EDPOC.TEXT" msgid "1" msgstr "1" #: tfrmmultirename.extension.caption msgid "[E] Extension" msgstr "[E] Розширення" #: tfrmmultirename.gbcounter.caption msgid "Counter" msgstr "Лічильник" #: tfrmmultirename.gbfindreplace.caption msgid "Find && Replace" msgstr "Знайти &та замінити" #: tfrmmultirename.gblog.caption msgid "Log Result" msgstr "Результат у звіт" #: tfrmmultirename.gbmaska.caption msgid "Mask" msgstr "Маска" #: tfrmmultirename.gbpresets.caption msgid "Presets" msgstr "Шаблони" #: tfrmmultirename.lbext.caption msgid "&Extension" msgstr "Розшир&ення" #: tfrmmultirename.lbfind.caption msgid "&Find..." msgstr "Зна&йти..." #: tfrmmultirename.lbinterval.caption #| msgid "Interval" msgid "&Interval" msgstr "&Інтервал" #: tfrmmultirename.lbname.caption msgid "File &Name" msgstr "І&м'я файлу" #: tfrmmultirename.lbreplace.caption msgid "Re&place..." msgstr "Заміни&ти..." #: tfrmmultirename.lbstnb.caption #| msgid "Start Number" msgid "S&tart Number" msgstr "Поча&ткове значення" #: tfrmmultirename.lbwidth.caption #| msgid "Width" msgctxt "TFRMMULTIRENAME.LBWIDTH.CAPTION" msgid "&Width" msgstr "&Ширина" #: tfrmmultirename.micounter.caption msgid "[C] Counter" msgstr "[C] Лічильник" #: tfrmmultirename.miday.caption msgid "[D] Day" msgstr "[D] День" #: tfrmmultirename.miday1.caption msgid "[DD] Day (2 digits)" msgstr "[DD] День (2 цифри)" #: tfrmmultirename.miday2.caption msgid "[DDD] Day of the week (short, e.g., \"mon\")" msgstr "[DDD] День тижня (коротко, \"mon\")" #: tfrmmultirename.miday3.caption msgid "[DDDD] Day of the week (long, e.g., \"monday\")" msgstr "[DDDD] День тижня (довге, \"monday\")" #: tfrmmultirename.miextensionx.caption msgid "[Ex] Character at position x" msgstr "[Ex] Символ на позиції x" #: tfrmmultirename.miextensionxx.caption msgid "[Ex:y] Characters from position x to y" msgstr "[Ex:y] Символи між позиціями x і y" #: tfrmmultirename.mihour.caption msgid "[h] Hour" msgstr "[h] Година" #: tfrmmultirename.mihour1.caption msgid "[hh] Hour (2 digits)" msgstr "[hh] Години (2 цифри)" #: tfrmmultirename.miminute.caption msgid "[n] Minute" msgstr "[n] Хвилина" #: tfrmmultirename.miminute1.caption msgid "[nn] Minute (2 digits)" msgstr "[nn] Хвилини (2 цифри)" #: tfrmmultirename.mimonth.caption msgid "[M] Month" msgstr "[M] Місяць" #: tfrmmultirename.mimonth1.caption msgid "[MM] Month (2 digits)" msgstr "[MM] Місяць (2 цифри)" #: tfrmmultirename.mimonth2.caption msgid "[MMM] Month name (short, e.g., \"jan\")" msgstr "[MMM] Назва місяця (коротко, \"jan\")" #: tfrmmultirename.mimonth3.caption #| msgid "[MMMM] Month name (long, e.g. \"january\")" msgid "[MMMM] Month name (long, e.g., \"january\")" msgstr "[MMMM] Назва місяця (довга, \"грудень\")" #: tfrmmultirename.miname.caption msgid "[N] Name" msgstr "[N] Ім'я" #: tfrmmultirename.minamex.caption msgid "[Nx] Character at position x" msgstr "[Nx] Символ на позиції x" #: tfrmmultirename.minamexx.caption msgid "[Nx:y] Characters from position x to y" msgstr "[Nx:y] Символи між позиціями x і y" #: tfrmmultirename.minext.caption msgid "Time..." msgstr "Час..." #: tfrmmultirename.minextextension.caption msgid "Extension..." msgstr "Розширення..." #: tfrmmultirename.minextname.caption msgid "Name..." msgstr "Ім'я..." #: tfrmmultirename.miplugin.caption msgctxt "TFRMMULTIRENAME.MIPLUGIN.CAPTION" msgid "Plugin" msgstr "Плагін" #: tfrmmultirename.misecond.caption msgid "[s] Second" msgstr "[s] Секунда" #: tfrmmultirename.misecond1.caption msgid "[ss] Second (2 digits)" msgstr "[ss] Секунди (2 цифри)" #: tfrmmultirename.miyear.caption msgid "[Y] Year (2 digits)" msgstr "[Y] Рік (2 цифри)" #: tfrmmultirename.miyear1.caption msgid "[YYYY] Year (4 digits)" msgstr "[YYYY] Рік (4 цифри)" #: tfrmmultirename.n1.caption msgctxt "TFRMMULTIRENAME.N1.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n2.caption msgctxt "TFRMMULTIRENAME.N2.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n3.caption msgctxt "TFRMMULTIRENAME.N3.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n4.caption msgctxt "TFRMMULTIRENAME.N4.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.n5.caption msgctxt "TFRMMULTIRENAME.N5.CAPTION" msgid "-" msgstr "-" #: tfrmmultirename.stringgrid.columns[0].title.caption msgctxt "tfrmmultirename.stringgrid.columns[0].title.caption" msgid "Old File Name" msgstr "Старе ім’я файлу" #: tfrmmultirename.stringgrid.columns[1].title.caption msgctxt "tfrmmultirename.stringgrid.columns[1].title.caption" msgid "New File Name" msgstr "Нове ім’я файлу" #: tfrmmultirename.stringgrid.columns[2].title.caption msgctxt "tfrmmultirename.stringgrid.columns[2].title.caption" msgid "File Path" msgstr "Шлях до файлу" #: tfrmopenwith.caption msgid "Choose an application" msgstr "Вибір програми" #: tfrmopenwith.chkcustomcommand.caption msgid "Custom command" msgstr "Власна команда" #: tfrmopenwith.chksaveassociation.caption msgid "Save association" msgstr "Зберегти асоціації" #: tfrmopenwith.chkuseasdefault.caption msgid "Set selected application as default action" msgstr "Встановити обрану програму як типову дію" #: tfrmopenwith.lblmimetype.caption msgid "File type to be opened: %s" msgstr "Відкривати тип файлу: %s" #: tfrmopenwith.milistoffiles.caption #, fuzzy msgid "Multiple file names" msgstr "Кілька імен файлів" #: tfrmopenwith.milistoffiles.hint #, fuzzy msgid "%F" msgstr "%F" #: tfrmopenwith.milistofurls.caption #, fuzzy msgid "Multiple URIs" msgstr "Кілька посилань" #: tfrmopenwith.milistofurls.hint #, fuzzy msgid "%U" msgstr "%U" #: tfrmopenwith.misinglefilename.caption #, fuzzy msgid "Single file name" msgstr "Одиночне ім’я" #: tfrmopenwith.misinglefilename.hint #, fuzzy msgid "%f" msgstr "%f" #: tfrmopenwith.misingleurl.caption #, fuzzy msgid "Single URI" msgstr "Одиночне посилання" #: tfrmopenwith.misingleurl.hint #, fuzzy msgid "%u" msgstr "%u" #: tfrmoptions.btnapply.caption #| msgid "Apply" msgctxt "TFRMOPTIONS.BTNAPPLY.CAPTION" msgid "&Apply" msgstr "&Застосувати" #: tfrmoptions.btncancel.caption #| msgid "Cancel" msgctxt "TFRMOPTIONS.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "С&касувати" #: tfrmoptions.btnok.caption msgctxt "TFRMOPTIONS.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfrmoptions.caption msgctxt "tfrmoptions.caption" msgid "Options" msgstr "Налаштування" #: tfrmoptions.lblemptyeditor.caption msgid "Please select one of the subpages, this page does not contain any settings." msgstr "Будь-ласка, виберіть підсторінку, ця сторінка не містить налаштувань." #: tfrmoptionsarchivers.btnautoconfig.caption #| msgid "Auto Configure" msgctxt "TFRMOPTIONSARCHIVERS.BTNAUTOCONFIG.CAPTION" msgid "A&uto Configure" msgstr "Автоналашт&ування" #: tfrmoptionsarchivers.btnmultiarcadd.caption #| msgid "Add" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCADD.CAPTION" msgid "A&dd" msgstr "До&дати" #: tfrmoptionsarchivers.btnmultiarcapply.caption #| msgid "Apply" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCAPPLY.CAPTION" msgid "A&pply" msgstr "&Застосувати" #: tfrmoptionsarchivers.btnmultiarcdelete.caption #| msgid "Delete" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCDELETE.CAPTION" msgid "D&elete" msgstr "Ви&далити" #: tfrmoptionsarchivers.btnmultiarcrename.caption #| msgid "Rename" msgctxt "TFRMOPTIONSARCHIVERS.BTNMULTIARCRENAME.CAPTION" msgid "&Rename" msgstr "Пе&рейменувати" #: tfrmoptionsarchivers.chkmultiarcdebug.caption #| msgid "Debug mode" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCDEBUG.CAPTION" msgid "De&bug mode" msgstr "Ре&жим налагодження" #: tfrmoptionsarchivers.chkmultiarcenabled.caption #| msgid "Enabled" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCENABLED.CAPTION" msgid "E&nabled" msgstr "Ввімкне&но" #: tfrmoptionsarchivers.chkmultiarcoutput.caption #| msgid "Show console output" msgctxt "TFRMOPTIONSARCHIVERS.CHKMULTIARCOUTPUT.CAPTION" msgid "S&how console output" msgstr "Показати вивід на консол&ь" #: tfrmoptionsarchivers.gbarchiveroptions.caption msgctxt "TFRMOPTIONSARCHIVERS.GBARCHIVEROPTIONS.CAPTION" msgid "Options" msgstr "Налаштування" #: tfrmoptionsarchivers.lblarchiveadd.caption #| msgid "Add:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEADD.CAPTION" msgid "Add&ing:" msgstr "Додат&и:" #: tfrmoptionsarchivers.lblarchiveextension.caption #| msgid "Extension:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTENSION.CAPTION" msgid "E&xtension:" msgstr "Роз&ширення:" #: tfrmoptionsarchivers.lblarchiveextract.caption #| msgid "Extract:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTRACT.CAPTION" msgid "Ex&tract:" msgstr "Розпакува&ти:" #: tfrmoptionsarchivers.lblarchivelist.caption #| msgid "List:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELIST.CAPTION" msgid "&List:" msgstr "Спис&ок:" #: tfrmoptionsarchivers.lblarchivelistend.caption #| msgid "Listing finish (optional):" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTEND.CAPTION" msgid "Listing &finish (optional):" msgstr "Кіне&ць списку (за бажанням)" #: tfrmoptionsarchivers.lblarchivelistformat.caption #| msgid "Listing format:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTFORMAT.CAPTION" msgid "Listing for&mat:" msgstr "Форма&т списку:" #: tfrmoptionsarchivers.lblarchiveliststart.caption #| msgid "Listing start (optional):" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVELISTSTART.CAPTION" msgid "Listin&g start (optional):" msgstr "По&чаток списку (за бажанням)" #: tfrmoptionsarchivers.lblarchiver.caption #| msgid "Archiver:" msgctxt "TFRMOPTIONSARCHIVERS.LBLARCHIVER.CAPTION" msgid "Arc&hiver:" msgstr "Ар&хіватор:" #: tfrmoptionsarchivers.lbldescription.caption #| msgid "Description:" msgctxt "TFRMOPTIONSARCHIVERS.LBLDESCRIPTION.CAPTION" msgid "De&scription:" msgstr "Опи&с:" #: tfrmoptionsarchivers.tbarchiveradditional.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERADDITIONAL.CAPTION" msgid "Additional" msgstr "Додатково" #: tfrmoptionsarchivers.tbarchivergeneral.caption msgctxt "TFRMOPTIONSARCHIVERS.TBARCHIVERGENERAL.CAPTION" msgid "General" msgstr "Основні" #: tfrmoptionsautorefresh.cbwatchattributeschange.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHATTRIBUTESCHANGE.CAPTION" msgid "When &size, date or attributes change" msgstr "&Також оновлювати при зміні розміру, дати чи атрибутів" #: tfrmoptionsautorefresh.cbwatchexcludedirs.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHEXCLUDEDIRS.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "Для наступних шляхів і їх підкаталогів:" #: tfrmoptionsautorefresh.cbwatchfilenamechange.caption #| msgid "When files are &created, deleted or renamed" msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHFILENAMECHANGE.CAPTION" msgid "When &files are created, deleted or renamed" msgstr "&Оновлювати при створенні, копіюванні чи видаленні файлів" #: tfrmoptionsautorefresh.cbwatchonlyforeground.caption msgctxt "TFRMOPTIONSAUTOREFRESH.CBWATCHONLYFOREGROUND.CAPTION" msgid "When application is in the &background" msgstr "Не реагувати на зміни якщо вікно у &фоні" #: tfrmoptionsautorefresh.gbautorefreshdisable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHDISABLE.CAPTION" msgid "Disable auto-refresh" msgstr "Відключити автооновлення" #: tfrmoptionsautorefresh.gbautorefreshenable.caption msgctxt "TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHENABLE.CAPTION" msgid "Refresh file list" msgstr "Оновлення списку файлів" #: tfrmoptionsbehavior.cbalwaysshowtrayicon.caption #| msgid "Always show tray icon" msgctxt "TFRMOPTIONSBEHAVIOR.CBALWAYSSHOWTRAYICON.CAPTION" msgid "Al&ways show tray icon" msgstr "Завжди показувати іконку в тре&ї" #: tfrmoptionsbehavior.cbblacklistunmounteddevices.caption #| msgid "Automatically hide unmounted devices" msgid "Automatically &hide unmounted devices" msgstr "Автоматично при&ховувати відмонтовані пристрої" #: tfrmoptionsbehavior.cbminimizetotray.caption msgctxt "TFRMOPTIONSBEHAVIOR.CBMINIMIZETOTRAY.CAPTION" msgid "Mo&ve icon to system tray when minimized" msgstr "Перемістити іконку в системний трей при згортанні" #: tfrmoptionsbehavior.cbonlyonce.caption #| msgid "Allow only one copy of DC at a time" msgctxt "TFRMOPTIONSBEHAVIOR.CBONLYONCE.CAPTION" msgid "A&llow only one copy of DC at a time" msgstr "Н&е запускати більше однієї копії DC" #: tfrmoptionsbehavior.edtdrivesblacklist.hint msgid "Here you can enter one or more drives or mount points, separated by \";\"." msgstr "Тут ви можете ввести один або декілька дисків, розділених \";\"." #: tfrmoptionsbehavior.lbldrivesblacklist.caption #| msgid "Drives blacklist" msgid "Drives &blacklist" msgstr "Чорний список дискі&в" #: tfrmoptionscolumnsview.cbcuttexttocolwidth.caption #| msgid "Cut text to column width" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBCUTTEXTTOCOLWIDTH.CAPTION" msgid "Cut &text to column width" msgstr "Обр&ізати текст до ширини колонки" #: tfrmoptionscolumnsview.cbgridhorzline.caption #| msgid "Horizontal lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDHORZLINE.CAPTION" msgid "&Horizontal lines" msgstr "&Горизонтальні лінії" #: tfrmoptionscolumnsview.cbgridvertline.caption #| msgid "Vertical lines" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CBGRIDVERTLINE.CAPTION" msgid "&Vertical lines" msgstr "&Вертикальні лінії" #: tfrmoptionscolumnsview.chkautofillcolumns.caption #| msgid "Auto fill columns" msgctxt "TFRMOPTIONSCOLUMNSVIEW.CHKAUTOFILLCOLUMNS.CAPTION" msgid "A&uto fill columns" msgstr "Розтягуват&и колонки на ширину панелі" #: tfrmoptionscolumnsview.gbshowgrid.caption msgid "Show grid" msgstr "Показати сітку" #: tfrmoptionscolumnsview.grpautosizecolumns.caption msgid "Auto-size columns" msgstr "Автоматична зміна розмірів колонок" #: tfrmoptionscolumnsview.lblautosizecolumn.caption #| msgid "Auto size column:" msgctxt "TFRMOPTIONSCOLUMNSVIEW.LBLAUTOSIZECOLUMN.CAPTION" msgid "Auto si&ze column:" msgstr "Пристосовув&ати розмір:" #: tfrmoptionsconfiguration.btnconfigapply.caption #| msgid "Apply" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGAPPLY.CAPTION" msgid "A&pply" msgstr "&Застосувати" #: tfrmoptionsconfiguration.btnconfigedit.caption #| msgid "Edit" msgctxt "TFRMOPTIONSCONFIGURATION.BTNCONFIGEDIT.CAPTION" msgid "&Edit" msgstr "Редаг&увати" #: tfrmoptionsconfiguration.cbcmdlinehistory.caption #| msgid "Command line history" msgctxt "TFRMOPTIONSCONFIGURATION.CBCMDLINEHISTORY.CAPTION" msgid "Co&mmand line history" msgstr "І&сторія командного рядка" #: tfrmoptionsconfiguration.cbdirhistory.caption #| msgid "Directory history" msgctxt "TFRMOPTIONSCONFIGURATION.CBDIRHISTORY.CAPTION" msgid "&Directory history" msgstr "Історія катало&гів" #: tfrmoptionsconfiguration.cbfilemaskhistory.caption #| msgid "File mask history" msgctxt "TFRMOPTIONSCONFIGURATION.CBFILEMASKHISTORY.CAPTION" msgid "&File mask history" msgstr "Історія масок &файлів" #: tfrmoptionsconfiguration.chksaveconfiguration.caption #| msgid "Save configuration" msgctxt "TFRMOPTIONSCONFIGURATION.CHKSAVECONFIGURATION.CAPTION" msgid "Sa&ve configuration" msgstr "З&берегти налаштування" #: tfrmoptionsconfiguration.chksearchreplacehistory.caption #| msgid "Search/Replace history" msgctxt "TFRMOPTIONSCONFIGURATION.CHKSEARCHREPLACEHISTORY.CAPTION" msgid "Searc&h/Replace history" msgstr "Іст&орія пошуку/заміни" #: tfrmoptionsconfiguration.gblocconfigfiles.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBLOCCONFIGFILES.CAPTION" msgid "Location of configuration files" msgstr "Розміщення файлів конфігурації" #: tfrmoptionsconfiguration.gbsaveonexit.caption msgctxt "TFRMOPTIONSCONFIGURATION.GBSAVEONEXIT.CAPTION" msgid "Save on exit" msgstr "Зберігати при виході" #: tfrmoptionsconfiguration.lblcmdlineconfigdir.caption msgctxt "TFRMOPTIONSCONFIGURATION.LBLCMDLINECONFIGDIR.CAPTION" msgid "Set on command line" msgstr "Встановити в командному рядку" #: tfrmoptionsconfiguration.rbprogramdir.caption #| msgid "Program directory (portable version)" msgctxt "TFRMOPTIONSCONFIGURATION.RBPROGRAMDIR.CAPTION" msgid "P&rogram directory (portable version)" msgstr "Каталог п&рограми (для переносної версії)" #: tfrmoptionsconfiguration.rbuserhomedir.caption #| msgid "User home directory" msgctxt "TFRMOPTIONSCONFIGURATION.RBUSERHOMEDIR.CAPTION" msgid "&User home directory" msgstr "Домашній каталог корист&увача" #: tfrmoptionscustomcolumns.btncopycolumnsset.caption #| msgid "Copy" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNCOPYCOLUMNSSET.CAPTION" msgid "C&opy" msgstr "&Копіювати" #: tfrmoptionscustomcolumns.btndelcolumnsset.caption #| msgid "Delete" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNDELCOLUMNSSET.CAPTION" msgid "&Delete" msgstr "&Видалити" #: tfrmoptionscustomcolumns.btneditcolumnsset.caption #| msgid "Edit" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNEDITCOLUMNSSET.CAPTION" msgid "&Edit" msgstr "&Редагувати" #: tfrmoptionscustomcolumns.btnnewcolumnsset.caption msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.BTNNEWCOLUMNSSET.CAPTION" msgid "&New" msgstr "&Створити" #: tfrmoptionscustomcolumns.cbbfilesystem.text msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.CBBFILESYSTEM.TEXT" msgid "General" msgstr "Основні" #: tfrmoptionscustomcolumns.lblconfigcolumns.caption #| msgid "Configure columns for file system:" msgctxt "TFRMOPTIONSCUSTOMCOLUMNS.LBLCONFIGCOLUMNS.CAPTION" msgid "Con&figure columns for file system:" msgstr "На&лаштувати колонки для файлової системи:" #: tfrmoptionsdragdrop.cbshowconfirmationdialog.caption #| msgid "Show confirmation dialog after drop" msgid "&Show confirmation dialog after drop" msgstr "&Показувати діалог підтвердження при перетягуванні" #: tfrmoptionsdriveslistbutton.cbshowfilesystem.caption #| msgid "Show file system" msgid "Show &file system" msgstr "Показувати &файлову систему" #: tfrmoptionsdriveslistbutton.cbshowfreespace.caption #| msgid "Show free space" msgid "Show fr&ee space" msgstr "Показувати вільн&е місце" #: tfrmoptionsdriveslistbutton.cbshowlabel.caption #| msgid "Show label" msgid "Show &label" msgstr "Показувати &мітки" #: tfrmoptionsdriveslistbutton.gbdriveslist.caption msgid "Drives list" msgstr "Список дисків" #: tfrmoptionseditorcolors.backgroundlabel.caption #| msgid "Background" msgctxt "tfrmoptionseditorcolors.backgroundlabel.caption" msgid "Bac&kground" msgstr "&Фон" #: tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption #| msgid "Background" msgctxt "tfrmoptionseditorcolors.backgroundusedefaultcheckbox.caption" msgid "Bac&kground" msgstr "&Фон" #: tfrmoptionseditorcolors.bvlattributesection.caption msgid "Element Attributes" msgstr "Атрибути елементу" #: tfrmoptionseditorcolors.foregroundlabel.caption #| msgid "Foreground" msgctxt "tfrmoptionseditorcolors.foregroundlabel.caption" msgid "Fo®round" msgstr "&Передній план" #: tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption #| msgid "Foreground" msgctxt "tfrmoptionseditorcolors.foregroundusedefaultcheckbox.caption" msgid "Fo®round" msgstr "&Передній план" #: tfrmoptionseditorcolors.framecolorusedefaultcheckbox.caption #| msgid "Text-mark" msgid "&Text-mark" msgstr "&Текстова мітка" #: tfrmoptionseditorcolors.tbtnglobal.caption #| msgid "Use (and edit) global scheme settings" msgid "Use (and edit) &global scheme settings" msgstr "Використати (і редагувати) глобальні налаштування схеми" #: tfrmoptionseditorcolors.tbtnlocal.caption #| msgid "Use local scheme settings" msgid "Use &local scheme settings" msgstr "Використати локальні параметри схеми" #: tfrmoptionseditorcolors.textboldcheckbox.caption #| msgid "Bold" msgid "&Bold" msgstr "&Bold" #: tfrmoptionseditorcolors.textboldradioinvert.caption #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textboldradioinvert.caption" msgid "In&vert" msgstr "І&нвертувати" #: tfrmoptionseditorcolors.textboldradiooff.caption #| msgid "Off" msgctxt "tfrmoptionseditorcolors.textboldradiooff.caption" msgid "O&ff" msgstr "&Вимк" #: tfrmoptionseditorcolors.textboldradioon.caption #| msgid "On" msgctxt "tfrmoptionseditorcolors.textboldradioon.caption" msgid "O&n" msgstr "&Увімк." #: tfrmoptionseditorcolors.textitaliccheckbox.caption #| msgid "Italic" msgid "&Italic" msgstr "&Italic" #: tfrmoptionseditorcolors.textitalicradioinvert.caption #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textitalicradioinvert.caption" msgid "In&vert" msgstr "І&нвертувати" #: tfrmoptionseditorcolors.textitalicradiooff.caption #| msgid "Off" msgctxt "tfrmoptionseditorcolors.textitalicradiooff.caption" msgid "O&ff" msgstr "&Вимк" #: tfrmoptionseditorcolors.textitalicradioon.caption #| msgid "On" msgctxt "tfrmoptionseditorcolors.textitalicradioon.caption" msgid "O&n" msgstr "&Увімк." #: tfrmoptionseditorcolors.textstrikeoutcheckbox.caption #| msgid "Strike Out" msgid "&Strike Out" msgstr "&Закреслений" #: tfrmoptionseditorcolors.textstrikeoutradioinvert.caption #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textstrikeoutradioinvert.caption" msgid "In&vert" msgstr "І&нвертувати" #: tfrmoptionseditorcolors.textstrikeoutradiooff.caption #| msgid "Off" msgctxt "tfrmoptionseditorcolors.textstrikeoutradiooff.caption" msgid "O&ff" msgstr "&Вимк" #: tfrmoptionseditorcolors.textstrikeoutradioon.caption #| msgid "On" msgctxt "tfrmoptionseditorcolors.textstrikeoutradioon.caption" msgid "O&n" msgstr "&Увімк." #: tfrmoptionseditorcolors.textunderlinecheckbox.caption #| msgid "Underline" msgid "&Underline" msgstr "&Підкреслений" #: tfrmoptionseditorcolors.textunderlineradioinvert.caption #| msgid "Invert" msgctxt "tfrmoptionseditorcolors.textunderlineradioinvert.caption" msgid "In&vert" msgstr "І&нвертувати" #: tfrmoptionseditorcolors.textunderlineradiooff.caption #| msgid "Off" msgctxt "tfrmoptionseditorcolors.textunderlineradiooff.caption" msgid "O&ff" msgstr "&Вимк" #: tfrmoptionseditorcolors.textunderlineradioon.caption #| msgid "On" msgctxt "tfrmoptionseditorcolors.textunderlineradioon.caption" msgid "O&n" msgstr "&Увімк." #: tfrmoptionsfileoperations.cbcopyconfirmation.caption #| msgid "Copy operation" msgid "Cop&y operation" msgstr "Операції &копіювання" #: tfrmoptionsfileoperations.cbdeleteconfirmation.caption #| msgid "Delete operation" msgid "&Delete operation" msgstr "Операції &видалення" #: tfrmoptionsfileoperations.cbdeletetotrash.caption #| msgid "Delete to recycle bin (Shift key reverses this setting)" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDELETETOTRASH.CAPTION" msgid "Dele&te to recycle bin (Shift key reverses this setting)" msgstr "F8/Del - видалення в Кошик (з Shift - на&завжди)" #: tfrmoptionsfileoperations.cbdeletetotrashconfirmation.caption #| msgid "Delete to trash operation" msgid "D&elete to trash operation" msgstr "Операції видалення до к&ошика" #: tfrmoptionsfileoperations.cbdropreadonlyflag.caption #| msgid "Drop readonly flag" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBDROPREADONLYFLAG.CAPTION" msgid "D&rop readonly flag" msgstr "С&кинути прапорець \"Лише читання\"" #: tfrmoptionsfileoperations.cbmoveconfirmation.caption #| msgid "Move operation" msgid "&Move operation" msgstr "Операції &переміщення" #: tfrmoptionsfileoperations.cbpartialnamesearch.caption #| msgid "Search for part of file name" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPARTIALNAMESEARCH.CAPTION" msgid "&Search for part of file name" msgstr "&Шукати по частині назви файлу" #: tfrmoptionsfileoperations.cbprocesscomments.caption #| msgid "Process comments with files/folders" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBPROCESSCOMMENTS.CAPTION" msgid "&Process comments with files/folders" msgstr "О&працьовувати коментарі з файлами/каталогами" #: tfrmoptionsfileoperations.cbrenameselonlyname.caption #| msgid "Select file name without extension when renaming" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBRENAMESELONLYNAME.CAPTION" msgid "Select &file name without extension when renaming" msgstr "П&ри перейменуванні виділяти лише ім'я файлу (без розширення)" #: tfrmoptionsfileoperations.cbshowcopytabselectpanel.caption #| msgid "Show tab select panel in copy/move dialog" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSHOWCOPYTABSELECTPANEL.CAPTION" msgid "Sho&w tab select panel in copy/move dialog" msgstr "Показу&вати панель вибору вкладок при перейменування/переміщенні" #: tfrmoptionsfileoperations.cbskipfileoperror.caption #| msgid "Skip file operations errors and write them to log window" msgctxt "TFRMOPTIONSFILEOPERATIONS.CBSKIPFILEOPERROR.CAPTION" msgid "S&kip file operations errors and write them to log window" msgstr "Пропус&кати помилки при файлових операціях і заносити їх у звіт" #: tfrmoptionsfileoperations.gbexecutingoperations.caption msgid "Executing operations" msgstr "Виконання операцій" #: tfrmoptionsfileoperations.gbfilesearch.caption msgctxt "TFRMOPTIONSFILEOPERATIONS.GBFILESEARCH.CAPTION" msgid "File search" msgstr "Пошук файлів" #: tfrmoptionsfileoperations.gbuserinterface.caption msgid "User interface" msgstr "Інтерфейс користувача" #: tfrmoptionsfileoperations.lblbuffersize.caption #| msgid "Buffer size for file operations (in KB):" msgid "&Buffer size for file operations (in KB):" msgstr "Розмір &буфера для операцій з файлами (в КB):" #: tfrmoptionsfileoperations.lblconfirmations.caption msgid "Show confirmation window for:" msgstr "Показувати вікно підтвердження для:" #: tfrmoptionsfileoperations.lblprogresskind.caption #| msgid "Show operations progress initially in" msgid "Show operations progress &initially in" msgstr "Показати прогрес &операцій спочатку в" #: tfrmoptionsfileoperations.lblwipepassnumber.caption #| msgid "Number of wipe passes:" msgctxt "TFRMOPTIONSFILEOPERATIONS.LBLWIPEPASSNUMBER.CAPTION" msgid "&Number of wipe passes:" msgstr "Кіл-&ть проходів стирання:" #: tfrmoptionsfileoperations.rbusemmapinsearch.caption #| msgid "Use memory mapping for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSEMMAPINSEARCH.CAPTION" msgid "Use memory mapping for search te&xt in files" msgstr "Використати відображенн&я в пам'ять при пошуку тексту у файлах" #: tfrmoptionsfileoperations.rbusestreaminsearch.caption #| msgid "Use stream for search text in files" msgctxt "TFRMOPTIONSFILEOPERATIONS.RBUSESTREAMINSEARCH.CAPTION" msgid "&Use stream for search text in files" msgstr "Використати п&отік при пошуку тексту в файлах" #: tfrmoptionsfilepanelscolors.btnbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnbackcolor2.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR2.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursorcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btncursortext.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORTEXT.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnforecolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNFORECOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindbackcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDBACKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnindcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNINDCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.btnmarkcolor.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.BTNMARKCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfilepanelscolors.cbbuseframecursor.caption #| msgid "Use Frame Cursor" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEFRAMECURSOR.CAPTION" msgid "Use &Frame Cursor" msgstr "Використовувати курсор-&рамку" #: tfrmoptionsfilepanelscolors.cbbusegradientind.caption #| msgid "Use Gradient Indicator" msgid "Use &Gradient Indicator" msgstr "Використовувати &градієнтну заливку індикатора" #: tfrmoptionsfilepanelscolors.cbbuseinvertedselection.caption #| msgid "Use Inverted Selection" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.CBBUSEINVERTEDSELECTION.CAPTION" msgid "U&se Inverted Selection" msgstr "В&икористовувати інверсне виділення" #: tfrmoptionsfilepanelscolors.dbfreespaceindicator.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.DBFREESPACEINDICATOR.CAPTION" msgid "Drive Free Space Indicator" msgstr "Керування індикатором вільного місця" #: tfrmoptionsfilepanelscolors.gbexample.caption msgctxt "TFRMOPTIONSFILEPANELSCOLORS.GBEXAMPLE.CAPTION" msgid "Example" msgstr "Приклад" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor.caption #| msgid "Background:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR.CAPTION" msgid "Bac&kground:" msgstr "&Фон:" #: tfrmoptionsfilepanelscolors.lblbackgroundcolor2.caption #| msgid "Background 2:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR2.CAPTION" msgid "Backg&round 2:" msgstr "Фон &2:" #: tfrmoptionsfilepanelscolors.lblcursorcolor.caption #| msgid "Cursor Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORCOLOR.CAPTION" msgid "C&ursor Color:" msgstr "Колір к&урсора" #: tfrmoptionsfilepanelscolors.lblcursortext.caption #| msgid "Cursor Text:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORTEXT.CAPTION" msgid "Cursor Te&xt:" msgstr "Текст під курсоро&м" #: tfrmoptionsfilepanelscolors.lblinactivepanelbrightness.caption #| msgid "Brightness level of inactive panel" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLINACTIVEPANELBRIGHTNESS.CAPTION" msgid "&Brightness level of inactive panel" msgstr "Рівень &яскравості неактивної панелі" #: tfrmoptionsfilepanelscolors.lblindbackcolor.caption #| msgid "Indicator Back Color:" msgid "In&dicator Back Color:" msgstr "Колір віл&ьного місця:" #: tfrmoptionsfilepanelscolors.lblindcolor.caption #| msgid "Indicator Fore Color:" msgid "&Indicator Fore Color:" msgstr "Колір заповненн&я:" #: tfrmoptionsfilepanelscolors.lblmarkcolor.caption #| msgid "Mark Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLMARKCOLOR.CAPTION" msgid "&Mark Color:" msgstr "Ко&лір виділення:" #: tfrmoptionsfilepanelscolors.lbltextcolor.caption #| msgid "Text Color:" msgctxt "TFRMOPTIONSFILEPANELSCOLORS.LBLTEXTCOLOR.CAPTION" msgid "T&ext Color:" msgstr "Колір &тексту:" #: tfrmoptionsfilesviews.cbdelayloadingtabs.caption #| msgid "Don't load file list until a tab is activated" msgid "Do&n't load file list until a tab is activated" msgstr "Не зава&нтажувати список файлів доки вкладка не активна" #: tfrmoptionsfilesviews.cbdirbrackets.caption #| msgid "Show square brackets around directories" msgctxt "TFRMOPTIONSFILESVIEWS.CBDIRBRACKETS.CAPTION" msgid "S&how square brackets around directories" msgstr "Показувати квадратні ду&жки навколо каталогів" #: tfrmoptionsfilesviews.cbhighlightupdatedfiles.caption #| msgid "Highlight new and updated files" msgid "Hi&ghlight new and updated files" msgstr "Виділяти но&ві та оновлені файли" #: tfrmoptionsfilesviews.cblistfilesinthread.caption #| msgid "Load file list in separate thread" msgctxt "TFRMOPTIONSFILESVIEWS.CBLISTFILESINTHREAD.CAPTION" msgid "Load &file list in separate thread" msgstr "Завантажувати список &файлів в окремому потоці" #: tfrmoptionsfilesviews.cbloadiconsseparately.caption #| msgid "Load icons after file list" msgctxt "TFRMOPTIONSFILESVIEWS.CBLOADICONSSEPARATELY.CAPTION" msgid "Load icons af&ter file list" msgstr "Завантажувати іконки після сп&иску" #: tfrmoptionsfilesviews.cbshowsystemfiles.caption #| msgid "Show system and hidden files" msgctxt "TFRMOPTIONSFILESVIEWS.CBSHOWSYSTEMFILES.CAPTION" msgid "Show s&ystem and hidden files" msgstr "Показувати системні та п&риховані файли" #: tfrmoptionsfilesviews.cbspacemovesdown.caption #| msgid "When selecting files with , move down to next file (as with )" msgctxt "TFRMOPTIONSFILESVIEWS.CBSPACEMOVESDOWN.CAPTION" msgid "&When selecting files with , move down to next file (as with )" msgstr "При виділенні файлів пр&обілом переміщувати курсор на наступний файл (як в )" #: tfrmoptionsfilesviews.gbformatting.caption msgid "Formatting" msgstr "Форматування" #: tfrmoptionsfilesviews.gbsorting.caption msgctxt "TFRMOPTIONSFILESVIEWS.GBSORTING.CAPTION" msgid "Sorting" msgstr "Сортування" #: tfrmoptionsfilesviews.lblcasesensitivity.caption #| msgid "Case sensitivity:" msgid "Case s&ensitivity:" msgstr "&Чутливість до регістру:" #: tfrmoptionsfilesviews.lbldatetimeexample.caption msgctxt "TFRMOPTIONSFILESVIEWS.lblDateTimeExample.CAPTION" msgid "Incorrect format" msgstr "Неправильний формат" #: tfrmoptionsfilesviews.lbldatetimeformat.caption #| msgid "Date and time format:" msgctxt "TFRMOPTIONSFILESVIEWS.LBLDATETIMEFORMAT.CAPTION" msgid "&Date and time format:" msgstr "Формат &дати і часу:" #: tfrmoptionsfilesviews.lblfilesizeformat.caption msgid "File si&ze format:" msgstr "&Формат розміру файла:" #: tfrmoptionsfilesviews.lblnewfilesposition.caption #| msgid "Insert new files" msgid "&Insert new files" msgstr "Вставити нов&і файли" #: tfrmoptionsfilesviews.lblsortfoldermode.caption #| msgid "Sorting directories:" msgid "So&rting directories:" msgstr "Со&ртування каталогів:" #: tfrmoptionsfilesviews.lblsortmethod.caption #| msgid "Sort &method:" msgctxt "TFRMOPTIONSFILESVIEWS.LBLSORTMETHOD.CAPTION" msgid "&Sort method:" msgstr "&Метод сортування:" #: tfrmoptionsfilesviews.lblupdatedfilesposition.caption #| msgid "Move updated files" msgid "&Move updated files" msgstr "Перемістити оновлені фай&ли" #: tfrmoptionsfiletypescolors.btnaddcategory.caption #| msgid "Add" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNADDCATEGORY.CAPTION" msgid "A&dd" msgstr "До&дати" #: tfrmoptionsfiletypescolors.btnapplycategory.caption #| msgid "Apply" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNAPPLYCATEGORY.CAPTION" msgid "A&pply" msgstr "&Застосувати" #: tfrmoptionsfiletypescolors.btncategorycolor.caption msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNCATEGORYCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsfiletypescolors.btndeletecategory.caption #| msgid "Delete" msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNDELETECATEGORY.CAPTION" msgid "D&elete" msgstr "&Видалити" #: tfrmoptionsfiletypescolors.btnsearchtemplate.hint msgctxt "TFRMOPTIONSFILETYPESCOLORS.BTNSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Шаблон..." #: tfrmoptionsfiletypescolors.gbfiletypescolors.caption #| msgid "File types colors" msgctxt "TFRMOPTIONSFILETYPESCOLORS.GBFILETYPESCOLORS.CAPTION" msgid "File types colors (sort by drag&&drop)" msgstr "Кольори за &типом файлу (сортувати перетягуванням)" #: tfrmoptionsfiletypescolors.lblcategoryattr.caption #| msgid "Category attributes:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYATTR.CAPTION" msgid "Category a&ttributes:" msgstr "&Атрибути категорії:" #: tfrmoptionsfiletypescolors.lblcategorycolor.caption #| msgid "Category color:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYCOLOR.CAPTION" msgid "Category co&lor:" msgstr "&Колір категорії:" #: tfrmoptionsfiletypescolors.lblcategorymask.caption #| msgid "Category mask:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYMASK.CAPTION" msgid "Category &mask:" msgstr "&Маска категорії:" #: tfrmoptionsfiletypescolors.lblcategoryname.caption #| msgid "Category name:" msgctxt "TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYNAME.CAPTION" msgid "Category &name:" msgstr "&Назва категорії:" #: tfrmoptionsfonts.btnseleditfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELEDITFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnsellogfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELLOGFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselmainfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELMAINFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewerbookfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWERBOOKFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.btnselviewfnt.caption msgctxt "TFRMOPTIONSFONTS.BTNSELVIEWFNT.CAPTION" msgid "..." msgstr "..." #: tfrmoptionsfonts.lbleditorfont.caption #| msgid "Editor font" msgctxt "TFRMOPTIONSFONTS.LBLEDITORFONT.CAPTION" msgid "&Editor font" msgstr "Шрифт &редактора" #: tfrmoptionsfonts.lbllogfont.caption #| msgid "Log font" msgctxt "TFRMOPTIONSFONTS.LBLLOGFONT.CAPTION" msgid "&Log font" msgstr "Шрифт &логу" #: tfrmoptionsfonts.lblmainfont.caption #| msgid "Main font" msgctxt "TFRMOPTIONSFONTS.LBLMAINFONT.CAPTION" msgid "Main &font" msgstr "Основний &шрифт" #: tfrmoptionsfonts.lblviewerbookfont.caption #| msgid "Viewer Book Font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERBOOKFONT.CAPTION" msgid "Viewer&Book Font" msgstr "Шрифт переглядача &книг" #: tfrmoptionsfonts.lblviewerfont.caption #| msgid "Viewer font" msgctxt "TFRMOPTIONSFONTS.LBLVIEWERFONT.CAPTION" msgid "&Viewer font" msgstr "Шрифт &переглядача" #: tfrmoptionshotkeys.btnaddhotkey.caption #| msgid "Add hotkey" msgid "Add &hotkey" msgstr "Додати &гар.кл." #: tfrmoptionshotkeys.btndeletehotkey.caption #| msgid "Delete hotkey" msgid "&Delete hotkey" msgstr "&Видалити гар.кл." #: tfrmoptionshotkeys.btnedithotkey.caption #| msgid "Edit hotkey" msgctxt "tfrmoptionshotkeys.btnedithotkey.caption" msgid "&Edit hotkey" msgstr "&Редагувати гар.кл." #: tfrmoptionshotkeys.lbfilter.caption #| msgid "Filter" msgctxt "TFRMOPTIONSHOTKEYS.LBFILTER.CAPTION" msgid "&Filter" msgstr "&Фільтр" #: tfrmoptionshotkeys.lblcategories.caption #| msgid "Categories:" msgctxt "tfrmoptionshotkeys.lblcategories.caption" msgid "C&ategories:" msgstr "К&атегорії:" #: tfrmoptionshotkeys.lblcommands.caption #| msgid "Commands:" msgctxt "tfrmoptionshotkeys.lblcommands.caption" msgid "Co&mmands:" msgstr "Ко&манди:" #: tfrmoptionshotkeys.lblscfiles.caption #, fuzzy #| msgid "Shortcut files:" msgctxt "TFRMOPTIONSHOTKEYS.LBLSCFILES.CAPTION" msgid "&Shortcut files:" msgstr "Ярлики" #: tfrmoptionshotkeys.stghotkeys.columns[0].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[0].TITLE.CAPTION" msgid "Hotkey" msgstr "Гаряча клавіша" #: tfrmoptionshotkeys.stghotkeys.columns[1].title.caption msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[1].TITLE.CAPTION" msgid "Parameters" msgstr "Параметри" #: tfrmoptionshotkeys.stghotkeys.columns[2].title.caption #, fuzzy msgctxt "TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[2].TITLE.CAPTION" msgid "Controls" msgstr "Елементи керування" #: tfrmoptionsicons.cbiconsexclude.caption msgctxt "TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION" msgid "For the following &paths and their subdirectories:" msgstr "Для наступних шляхів і їх підкаталогів:" #: tfrmoptionsicons.cbiconsinmenus.caption msgid "Show icons for actions in &menus" msgstr "Показувати іконки для дій в &меню" #: tfrmoptionsicons.cbiconsinmenussize.text msgctxt "tfrmoptionsicons.cbiconsinmenussize.text" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.cbiconsshowoverlay.caption #| msgid "Show overlay i&cons, e.g. for links" msgctxt "TFRMOPTIONSICONS.CBICONSSHOWOVERLAY.CAPTION" msgid "Show o&verlay icons, e.g. for links" msgstr "Показувати оверле&йні &іконки (наприклад для ярликів)" #: tfrmoptionsicons.cbiconssize.text msgctxt "TFRMOPTIONSICONS.CBICONSSIZE.TEXT" msgid "16x16" msgstr "16x16" #: tfrmoptionsicons.gbdisablespecialicons.caption msgid "Disable special icons" msgstr "Вимкнути спеціальні іконки" #: tfrmoptionsicons.gbiconsinmenus.caption msgid "Icons in menus" msgstr "Іконки в меню" #: tfrmoptionsicons.gbiconssize.caption #| msgid " Icon &size " msgctxt "TFRMOPTIONSICONS.GBICONSSIZE.CAPTION" msgid " Icon size " msgstr "Розмір іконок" #: tfrmoptionsicons.gbshowiconsmode.caption msgctxt "TFRMOPTIONSICONS.GBSHOWICONSMODE.CAPTION" msgid " Show icons to the left of the filename " msgstr " Показ іконок зв’язаних з типом файлу " #: tfrmoptionsicons.rbiconsshowall.caption #| msgid "&All" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALL.CAPTION" msgid "A&ll" msgstr "&Усі" #: tfrmoptionsicons.rbiconsshowallandexe.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWALLANDEXE.CAPTION" msgid "All associated + &EXE/LNK (slow)" msgstr "Усі асоційовані + &EXE/LNK (повільно)" #: tfrmoptionsicons.rbiconsshownone.caption msgctxt "TFRMOPTIONSICONS.RBICONSSHOWNONE.CAPTION" msgid "&No icons" msgstr "&Без іконок" #: tfrmoptionsicons.rbiconsshowstandard.caption #| msgid "&Only standard icons" msgctxt "TFRMOPTIONSICONS.RBICONSSHOWSTANDARD.CAPTION" msgid "Only &standard icons" msgstr "Лише &стандартні іконки" #: tfrmoptionsignorelist.btnaddsel.caption #| msgid "&Add selected names" msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSEL.CAPTION" msgid "A&dd selected names" msgstr "До&дати виділені імена" #: tfrmoptionsignorelist.btnaddselwithpath.caption msgctxt "TFRMOPTIONSIGNORELIST.BTNADDSELWITHPATH.CAPTION" msgid "Add selected names with &full path" msgstr "Додати виділені імена з &повними шляхами" #: tfrmoptionsignorelist.chkignoreenable.caption msgctxt "TFRMOPTIONSIGNORELIST.CHKIGNOREENABLE.CAPTION" msgid "&Ignore (don't show) the following files and folders:" msgstr "&Ігнорувати (не показувати) такі файли і папки:" #: tfrmoptionsignorelist.lblsavein.caption msgctxt "TFRMOPTIONSIGNORELIST.LBLSAVEIN.CAPTION" msgid "&Save in:" msgstr "&Зберегти в:" #: tfrmoptionskeyboard.cblynxlike.caption #| msgid "Left, Right arrows change directory (Lynx-like movement)" msgid "Le&ft, Right arrows change directory (Lynx-like movement)" msgstr "Зміна каталогу с&трілками Вліво, Вправо (Навігація в стилі Lynx)" #: tfrmoptionskeyboard.gbtyping.caption #, fuzzy msgid "Typing" msgstr "Введення" #: tfrmoptionskeyboard.lblalt.caption #| msgid "Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLALT.CAPTION" msgid "Alt+L&etters" msgstr "Alt+Літ&ери" #: tfrmoptionskeyboard.lblctrlalt.caption #| msgid "Ctrl+Alt+Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLCTRLALT.CAPTION" msgid "Ctrl+Alt+Le&tters" msgstr "Ctrl+Alt+Лі&тери" #: tfrmoptionskeyboard.lblnomodifier.caption #| msgid "Letters" msgctxt "TFRMOPTIONSKEYBOARD.LBLNOMODIFIER.CAPTION" msgid "&Letters" msgstr "&Літери" #: tfrmoptionslayout.cbflatdiskpanel.caption #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATDISKPANEL.CAPTION" msgid "&Flat buttons" msgstr "Пло&скі кнопки" #: tfrmoptionslayout.cbflatinterface.caption #| msgid "Flat interface" msgctxt "TFRMOPTIONSLAYOUT.CBFLATINTERFACE.CAPTION" msgid "Flat i&nterface" msgstr "Плоский і&нтерфейс" #: tfrmoptionslayout.cbflattoolbar.caption #| msgid "Flat buttons" msgctxt "TFRMOPTIONSLAYOUT.CBFLATTOOLBAR.CAPTION" msgid "Flat b&uttons" msgstr "Пл&оскі кнопки" #: tfrmoptionslayout.cbfreespaceind.caption #| msgid "Show free space indicator on drive label" msgctxt "TFRMOPTIONSLAYOUT.CBFREESPACEIND.CAPTION" msgid "Show fr&ee space indicator on drive label" msgstr "Показувати індикатор вільного місця на пан&елі дисків" #: tfrmoptionslayout.cblogwindow.caption #| msgid "Show log window" msgctxt "TFRMOPTIONSLAYOUT.CBLOGWINDOW.CAPTION" msgid "Show lo&g window" msgstr "Показувати &вікно звіту" #: tfrmoptionslayout.cbpanelofoperations.caption msgctxt "TFRMOPTIONSLAYOUT.CBPANELOFOPERATIONS.CAPTION" msgid "Show panel of operation in background" msgstr "Показувати панель операцій у фоні" #: tfrmoptionslayout.cbproginmenubar.caption msgctxt "TFRMOPTIONSLAYOUT.CBPROGINMENUBAR.CAPTION" msgid "Show common progress in menu bar" msgstr "Показувати загальний прогрес в рядку меню" #: tfrmoptionslayout.cbshowcmdline.caption #| msgid "Show command &line" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCMDLINE.CAPTION" msgid "Show command l&ine" msgstr "Показувати &командний рядок" #: tfrmoptionslayout.cbshowcurdir.caption #| msgid "Show ¤t directory" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWCURDIR.CAPTION" msgid "Show current director&y" msgstr "Показувати по&точний каталог" #: tfrmoptionslayout.cbshowdiskpanel.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDISKPANEL.CAPTION" msgid "Show &drive buttons" msgstr "Показувати кнопки &дисків" #: tfrmoptionslayout.cbshowdrivefreespace.caption #| msgid "Show free space label" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWDRIVEFREESPACE.CAPTION" msgid "Show free s&pace label" msgstr "Показувати індикатор вільного міс&ця" #: tfrmoptionslayout.cbshowdriveslistbutton.caption #| msgid "Show d&rives list button" msgid "Show drives list bu&tton" msgstr "Показувати кнопки мен&ю дисків" #: tfrmoptionslayout.cbshowkeyspanel.caption #| msgid "Show &function key buttons" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWKEYSPANEL.CAPTION" msgid "Show function &key buttons" msgstr "Показувати кнопки &функціональних клавіш" #: tfrmoptionslayout.cbshowmainmenu.caption #| msgid "Show main menu" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINMENU.CAPTION" msgid "Show &main menu" msgstr "Показувати &головне меню" #: tfrmoptionslayout.cbshowmaintoolbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWMAINTOOLBAR.CAPTION" msgid "Show &button bar" msgstr "Показувати &панель кнопок" #: tfrmoptionslayout.cbshowshortdrivefreespace.caption #| msgid "Show short free space label" msgid "Show short free space &label" msgstr "Короткий індикатор ві&льного місця" #: tfrmoptionslayout.cbshowstatusbar.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWSTATUSBAR.CAPTION" msgid "Show &status bar" msgstr "Показувати рядок стану" #: tfrmoptionslayout.cbshowtabheader.caption #| msgid "Show &tabstop header" msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABHEADER.CAPTION" msgid "S&how tabstop header" msgstr "Показувати &заголовки табуляторів" #: tfrmoptionslayout.cbshowtabs.caption msgctxt "TFRMOPTIONSLAYOUT.CBSHOWTABS.CAPTION" msgid "Sho&w folder tabs" msgstr "Показувати вкл&адки" #: tfrmoptionslayout.cbtermwindow.caption #| msgid "Show terminal window" msgctxt "TFRMOPTIONSLAYOUT.CBTERMWINDOW.CAPTION" msgid "Show te&rminal window" msgstr "Показувати вікно терм&іналу" #: tfrmoptionslayout.cbtwodiskpanels.caption #| msgid "Show two drive button bars (fixed width, above file windows)" msgctxt "TFRMOPTIONSLAYOUT.CBTWODISKPANELS.CAPTION" msgid "Show two drive button bars (fi&xed width, above file windows)" msgstr "Показувати д&ві панелі кнопок дисків (фіксована довжина, над файловими панелями)" #: tfrmoptionslayout.gbscreenlayout.caption msgctxt "TFRMOPTIONSLAYOUT.GBSCREENLAYOUT.CAPTION" msgid " Screen layout " msgstr " Компоненти основного вікна " #: tfrmoptionslog.cblogarcop.caption #| msgid "Pack/Unpack" msgctxt "TFRMOPTIONSLOG.CBLOGARCOP.CAPTION" msgid "&Pack/Unpack" msgstr "Запак&увати/Розпакувати" #: tfrmoptionslog.cblogcpmvln.caption #| msgid "Copy/Move/Create link/symlink" msgctxt "TFRMOPTIONSLOG.CBLOGCPMVLN.CAPTION" msgid "Cop&y/Move/Create link/symlink" msgstr "Копі&ювання/Переміщення/Створення посилань" #: tfrmoptionslog.cblogdelete.caption #| msgid "Delete" msgctxt "TFRMOPTIONSLOG.CBLOGDELETE.CAPTION" msgid "&Delete" msgstr "Ви&далити" #: tfrmoptionslog.cblogdirop.caption #| msgid "Create/Delete directories" msgctxt "TFRMOPTIONSLOG.CBLOGDIROP.CAPTION" msgid "Crea&te/Delete directories" msgstr "Створення/Видалення ка&талогів" #: tfrmoptionslog.cblogerrors.caption msgctxt "TFRMOPTIONSLOG.CBLOGERRORS.CAPTION" msgid "Log &errors" msgstr "Звіт &помилок" #: tfrmoptionslog.cblogfile.caption #| msgid "&Create a log file:" msgctxt "TFRMOPTIONSLOG.CBLOGFILE.CAPTION" msgid "C&reate a log file:" msgstr "&Створити файл звіту:" #: tfrmoptionslog.cbloginfo.caption #| msgid "Log information messages" msgctxt "TFRMOPTIONSLOG.CBLOGINFO.CAPTION" msgid "Log &information messages" msgstr "Звіт &інформаційних повідомлень" #: tfrmoptionslog.cblogsuccess.caption msgctxt "TFRMOPTIONSLOG.CBLOGSUCCESS.CAPTION" msgid "Log &successful operations" msgstr "Звіт про ус&пішні операції" #: tfrmoptionslog.cblogvfs.caption #| msgid "File system plugins" msgctxt "TFRMOPTIONSLOG.CBLOGVFS.CAPTION" msgid "&File system plugins" msgstr "Плагіни &файлової системи" #: tfrmoptionslog.gblogfile.caption msgctxt "TFRMOPTIONSLOG.GBLOGFILE.CAPTION" msgid "File operation log file" msgstr "Звіт про операції з файлами" #: tfrmoptionslog.gblogfileop.caption #| msgid "Log operations:" msgctxt "TFRMOPTIONSLOG.GBLOGFILEOP.CAPTION" msgid "Log operations" msgstr "Підзвітні дії" #: tfrmoptionslog.gblogfilestatus.caption #| msgid "Operation status:" msgctxt "TFRMOPTIONSLOG.GBLOGFILESTATUS.CAPTION" msgid "Operation status" msgstr "Статус операції" #: tfrmoptionsmisc.btnthumbcompactcache.caption msgid "&Remove thumbnails for no longer existing files" msgstr "Видалити мініат&юри для не існуючих файлів" #: tfrmoptionsmisc.chkgotoroot.caption msgid "Always &go to the root of a drive when changing drives" msgstr "Завжди переходити в &корінь диску при зміні дисків" #: tfrmoptionsmisc.chkshowwarningmessages.caption msgctxt "tfrmoptionsmisc.chkshowwarningmessages.caption" msgid "Show &warning messages (\"OK\" button only)" msgstr "Показу&вати попередження (лише кнопка \"OK\")" #: tfrmoptionsmisc.chkthumbsave.caption msgctxt "tfrmoptionsmisc.chkthumbsave.caption" msgid "&Save thumbnails in cache" msgstr "Зберігати мініат&юри в кеші" #: tfrmoptionsmisc.dblthumbnails.caption msgctxt "tfrmoptionsmisc.dblthumbnails.caption" msgid "Thumbnails" msgstr "Мініатюри" #: tfrmoptionsmisc.lblthumbpixels.caption msgid "pixels" msgstr "пікселів" #: tfrmoptionsmisc.lblthumbseparator.caption msgctxt "tfrmoptionsmisc.lblthumbseparator.caption" msgid "X" msgstr "X" #: tfrmoptionsmisc.lblthumbsize.caption msgid "&Thumbnail size:" msgstr "Розмір мініа&тюр:" #: tfrmoptionsmouse.cbselectionbymouse.caption #| msgid "Selection by mouse" msgid "&Selection by mouse" msgstr "Виділе&ння мишкою" #: tfrmoptionsmouse.gbscrolling.caption msgid "Scrolling" msgstr "Прокрутка" #: tfrmoptionsmouse.gbselection.caption msgid "Selection" msgstr "Виділення" #: tfrmoptionsmouse.lblmousemode.caption #| msgid "Mode:" msgid "&Mode:" msgstr "Ре&жим:" #: tfrmoptionsmouse.rbscrolllinebyline.caption #| msgid "Line by line" msgid "&Line by line" msgstr "Через ряд&ків" #: tfrmoptionsmouse.rbscrolllinebylinecursor.caption #| msgid "Line by line with cursor movement" msgid "Line by line &with cursor movement" msgstr "Р&ядок за рядком з рухом курсора" #: tfrmoptionsmouse.rbscrollpagebypage.caption #| msgid "Page by page" msgid "&Page by page" msgstr "&Посторінково" #: tfrmoptionsplugins.btnaddplugin.caption #| msgid "Add" msgctxt "TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION" msgid "A&dd" msgstr "До&дати" #: tfrmoptionsplugins.btnconfigplugin.caption #| msgid "Configure" msgctxt "TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION" msgid "Con&figure" msgstr "Налашту&вати" #: tfrmoptionsplugins.btnenableplugin.caption #| msgid "Enable" msgctxt "TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION" msgid "E&nable" msgstr "&Увімкнути" #: tfrmoptionsplugins.btnremoveplugin.caption #| msgid "Remove" msgctxt "TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION" msgid "&Remove" msgstr "&Видалити" #: tfrmoptionsplugins.btntweakplugin.caption #| msgid "Tweak" msgctxt "TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION" msgid "&Tweak" msgstr "Пара&метри" #: tfrmoptionsplugins.lbldsxdescription.caption #| msgid "Search plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgctxt "TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION" msgid "Searc&h plugins allow to use alternative search algorithms or external tools (like \"locate\", etc.)" msgstr "По&шукові плагіни дозволяють використовувати альтернативні алгоритми пошуку або зовнішні засоби (такі як \"locate\", та інші)" #: tfrmoptionsplugins.lblwcxdescription.caption #| msgid "Packer plugins are used to work with archives." msgctxt "TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION" msgid "Pack&er plugins are used to work with archives" msgstr "Ар&хіваторні плагіни дозволяють працювати з архівами" #: tfrmoptionsplugins.lblwdxdescription.caption #| msgid "Content plugins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgctxt "TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION" msgid "Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool" msgstr "&Інформаційні плагіни дозволяють відображати розширені відомості про файли, такі як mp3 теги або атрибути зображення, або використовувати їх для пошуку або у інструменті масового перейменування." #: tfrmoptionsplugins.lblwfxdescription.caption #| msgid "File system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgctxt "TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION" msgid "Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC." msgstr "Плагіни &файлових систем дозволяють звертатися до дисків, недоступних з ОС або до зовнішніх пристроїв, напр. Palm/PocketPC, тощо." #: tfrmoptionsplugins.lblwlxdescription.caption #| msgid "Viewer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgctxt "TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION" msgid "Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)" msgstr "&Плагіни перегляду дозволяють відобразити різні формати файлів, такі як: зображення, бази даних, таблиці та інші у Переглядачі (F3, Ctrl+Q)" #: tfrmoptionsplugins.stgplugins.columns[0].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[0].TITLE.CAPTION" msgid "Active" msgstr "Активний" #: tfrmoptionsplugins.stgplugins.columns[1].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[1].TITLE.CAPTION" msgid "Plugin" msgstr "Плагін" #: tfrmoptionsplugins.stgplugins.columns[2].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[2].TITLE.CAPTION" msgid "Registered for" msgstr "Асоціації з" #: tfrmoptionsplugins.stgplugins.columns[3].title.caption msgctxt "TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[3].TITLE.CAPTION" msgid "File name" msgstr "Ім'я файлу" #: tfrmoptionsplugins.tsdsx.caption #| msgid "Search plugins (.DSX)" msgctxt "TFRMOPTIONSPLUGINS.TSDSX.CAPTION" msgid "&Search plugins (.DSX)" msgstr "По&шукові плагіни (.DSX)" #: tfrmoptionsplugins.tswcx.caption #| msgid "Packer plugins (.WCX)" msgctxt "TFRMOPTIONSPLUGINS.TSWCX.CAPTION" msgid "Pac&ker plugins (.WCX)" msgstr "&Архіваторні плагіни (.WCX)" #: tfrmoptionsplugins.tswdx.caption #| msgid "Content plugins (.WDX)" msgctxt "TFRMOPTIONSPLUGINS.TSWDX.CAPTION" msgid "Content pl&ugins (.WDX)" msgstr "&Контентні плагіни (.WDX)" #: tfrmoptionsplugins.tswfx.caption #| msgid "File system plugins (.WFX)" msgctxt "TFRMOPTIONSPLUGINS.TSWFX.CAPTION" msgid "F&ile system plugins (.WFX)" msgstr "Плагіни &файлової системи (.WFX)" #: tfrmoptionsplugins.tswlx.caption #| msgid "Viewer plugins (.WLX)" msgctxt "TFRMOPTIONSPLUGINS.TSWLX.CAPTION" msgid "&Viewer plugins (.WLX)" msgstr "Плагіни &перегляду (.WLX)" #: tfrmoptionsquicksearchfilter.cbexactbeginning.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTBEGINNING.CAPTION" msgid "&Beginning (name must start with first typed character)" msgstr "По&чаток (ім'я має починатись з набраних символів)" #: tfrmoptionsquicksearchfilter.cbexactending.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTENDING.CAPTION" msgid "En&ding (last character before a typed dot . must match)" msgstr "Кі&нець (останні символи до набраної крапки '.' повинні співпадати)" #: tfrmoptionsquicksearchfilter.cgpoptions.caption msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.CGPOPTIONS.CAPTION" msgid "Options" msgstr "Налаштування" #: tfrmoptionsquicksearchfilter.gbexactnamematch.caption #| msgid "Exact name match:" msgctxt "TFRMOPTIONSQUICKSEARCHFILTER.GBEXACTNAMEMATCH.CAPTION" msgid "Exact name match" msgstr "Точне співпадіння імені" #: tfrmoptionsquicksearchfilter.rgpsearchcase.caption msgid "Search case" msgstr "Регістр при пошуку" #: tfrmoptionsquicksearchfilter.rgpsearchitems.caption msgid "Search for these items" msgstr "Критерії пошуку" #: tfrmoptionstabs.cbtabsactivateonclick.caption msgctxt "TFRMOPTIONSTABS.CBTABSACTIVATEONCLICK.CAPTION" msgid "Activate target &panel when clicking on one of its Tabs" msgstr "Робити &панель активною при клацанні по одній з її вкладок" #: tfrmoptionstabs.cbtabsalwaysvisible.caption msgctxt "TFRMOPTIONSTABS.CBTABSALWAYSVISIBLE.CAPTION" msgid "&Show tab header also when there is only one tab" msgstr "Показувати заголовок вкладки, нав&іть якщо вона одна" #: tfrmoptionstabs.cbtabsconfirmcloseall.caption #| msgid "&Confirm close all tabs" msgctxt "TFRMOPTIONSTABS.CBTABSCONFIRMCLOSEALL.CAPTION" msgid "Con&firm close all tabs" msgstr "Підтверд&жувати закриття всіх вкладок" #: tfrmoptionstabs.cbtabslimitoption.caption #| msgid "&Limit tab title length to:" msgctxt "TFRMOPTIONSTABS.CBTABSLIMITOPTION.CAPTION" msgid "&Limit tab title length to" msgstr "&Обмежити розмір заголовка вкладки до" #: tfrmoptionstabs.cbtabslockedasterisk.caption msgctxt "TFRMOPTIONSTABS.CBTABSLOCKEDASTERISK.CAPTION" msgid "Show locked tabs &with an asterisk *" msgstr "Показувати заблоковані вкладки зі знаком зірочки *" #: tfrmoptionstabs.cbtabsmultilines.caption msgctxt "TFRMOPTIONSTABS.CBTABSMULTILINES.CAPTION" msgid "&Tabs on multiple lines" msgstr "Розміщати вкладки в декі&лька рядів" #: tfrmoptionstabs.cbtabsopenforeground.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENFOREGROUND.CAPTION" msgid "Ctrl+&Up opens new tab in foreground" msgstr "Ctrl+&Up відкриває нову вкладку на передньому плані" #: tfrmoptionstabs.cbtabsopennearcurrent.caption msgctxt "TFRMOPTIONSTABS.CBTABSOPENNEARCURRENT.CAPTION" msgid "Open &new tabs near current tab" msgstr "Відкривати &нову вкладку поряд з поточною" #: tfrmoptionstabs.cbtabsshowclosebutton.caption #| msgid "Show tab close button" msgctxt "TFRMOPTIONSTABS.CBTABSSHOWCLOSEBUTTON.CAPTION" msgid "Show ta&b close button" msgstr "Показувати кнопку закриття &вкладки" #: tfrmoptionstabs.gbtabs.caption msgctxt "TFRMOPTIONSTABS.GBTABS.CAPTION" msgid "Folder tabs headers" msgstr "Заголовки вкладок" #: tfrmoptionstabs.lblchar.caption msgctxt "TFRMOPTIONSTABS.LBLCHAR.CAPTION" msgid "characters" msgstr "символів" #: tfrmoptionstabs.lbltabsposition.caption #| msgid "Tabs position" msgctxt "TFRMOPTIONSTABS.LBLTABSPOSITION.CAPTION" msgid "Ta&bs position" msgstr "Поло&ження вкладок" #: tfrmoptionsterminal.lblruninterm.caption #| msgid "Run in terminal:" msgid "Run in &terminal:" msgstr "Запустити у &терміналі:" #: tfrmoptionsterminal.lblrunterm.caption #| msgid "Run terminal:" msgid "Run t&erminal:" msgstr "Запустити т&ермінал" #: tfrmoptionstoolbar.btnclonebutton.caption #| msgid "&Clone button" msgctxt "tfrmoptionstoolbar.btnclonebutton.caption" msgid "C&lone button" msgstr "К&лонувати кнопку" #: tfrmoptionstoolbar.btndeletebutton.caption msgctxt "tfrmoptionstoolbar.btndeletebutton.caption" msgid "&Delete" msgstr "Ви&далити кнопку" #: tfrmoptionstoolbar.btnedithotkey.caption #| msgid "Edit hotkey" msgctxt "tfrmoptionstoolbar.btnedithotkey.caption" msgid "Edit hot&key" msgstr "Реда&гувати" #: tfrmoptionstoolbar.btninsertbutton.caption #| msgid "&Insert new buttonX" msgctxt "tfrmoptionstoolbar.btninsertbutton.caption" msgid "&Insert new button" msgstr "В&ставити нову кнопку" #: tfrmoptionstoolbar.btnopenfile.caption msgctxt "tfrmoptionstoolbar.btnopenfile.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnopenicon.caption msgctxt "tfrmoptionstoolbar.btnopenicon.caption" msgid ">>" msgstr ">>" #: tfrmoptionstoolbar.btnremovehotkey.caption #| msgid "Remove hotkey" msgctxt "tfrmoptionstoolbar.btnremovehotkey.caption" msgid "Remove hotke&y" msgstr "Видалит&и гар.кл." #: tfrmoptionstoolbar.cbflatbuttons.caption #| msgid "Flat b&uttons" msgctxt "tfrmoptionstoolbar.cbflatbuttons.caption" msgid "&Flat buttons" msgstr "П&ласкі кнопки" #: tfrmoptionstoolbar.edtinternalparameters.hint msgid "Enter command parameters, each in a separate line. Press F1 to see help on parameters." msgstr "Введіть параметри команди, кожен в окремому рядку. Натисніть F1, щоб отримати довідку по параметрах." #: tfrmoptionstoolbar.gbgroupbox.caption msgctxt "tfrmoptionstoolbar.gbgroupbox.caption" msgid "Appearance" msgstr "Вигляд кнопок" #: tfrmoptionstoolbar.lblbarsize.caption #| msgid "Ba&r size:" msgctxt "tfrmoptionstoolbar.lblbarsize.caption" msgid "&Bar size:" msgstr "Розмір п&анелі:" #: tfrmoptionstoolbar.lblexternalcommand.caption #| msgid "Command:" msgctxt "tfrmoptionstoolbar.lblexternalcommand.caption" msgid "Comman&d:" msgstr "Коман&да:" #: tfrmoptionstoolbar.lblexternalparameters.caption #| msgid "Parameters:" msgctxt "tfrmoptionstoolbar.lblexternalparameters.caption" msgid "Parameter&s:" msgstr "Параметр&и:" #: tfrmoptionstoolbar.lblhotkey.caption msgid "Hot key:" msgstr "Гаряча клавіша:" #: tfrmoptionstoolbar.lbliconfile.caption #| msgid "Icon:" msgctxt "tfrmoptionstoolbar.lbliconfile.caption" msgid "Ico&n:" msgstr "Іко&нка:" #: tfrmoptionstoolbar.lbliconsize.caption #| msgid "Ic&on size:" msgctxt "tfrmoptionstoolbar.lbliconsize.caption" msgid "Icon si&ze:" msgstr "Р&озмір іконки:" #: tfrmoptionstoolbar.lblinternalcommand.caption #| msgid "Command:" msgctxt "tfrmoptionstoolbar.lblinternalcommand.caption" msgid "Co&mmand:" msgstr "Коман&да:" #: tfrmoptionstoolbar.lblinternalparameters.caption #| msgid "Parameters:" msgctxt "tfrmoptionstoolbar.lblinternalparameters.caption" msgid "&Parameters:" msgstr "&Параметри:" #: tfrmoptionstoolbar.lblstartpath.caption #| msgid "Start path:" msgctxt "tfrmoptionstoolbar.lblstartpath.caption" msgid "Start pat&h:" msgstr "Шля&х запуску:" #: tfrmoptionstoolbar.lbltooltip.caption #| msgid "Tooltip:" msgctxt "tfrmoptionstoolbar.lbltooltip.caption" msgid "&Tooltip:" msgstr "Під&казка:" #: tfrmoptionstoolbar.rgtoolitemtype.caption msgid "Button type" msgstr "Тип кнопки" #: tfrmoptionstoolbase.cbtoolskeepterminalopen.caption #| msgid "Keep terminal window open after executing program" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSKEEPTERMINALOPEN.CAPTION" msgid "&Keep terminal window open after executing program" msgstr "Тримати ві&кно терміналу відкритим після виконання програми" #: tfrmoptionstoolbase.cbtoolsruninterminal.caption #| msgid "Execute in terminal" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSRUNINTERMINAL.CAPTION" msgid "&Execute in terminal" msgstr "Виконати у т&ерміналі" #: tfrmoptionstoolbase.cbtoolsuseexternalprogram.caption #| msgid "Use external program" msgctxt "TFRMOPTIONSTOOLBASE.CBTOOLSUSEEXTERNALPROGRAM.CAPTION" msgid "&Use external program" msgstr "Використовувати &зовнішню програму" #: tfrmoptionstoolbase.lbltoolsparameters.caption #| msgid "Additional parameters" msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPARAMETERS.CAPTION" msgid "A&dditional parameters" msgstr "Додатков&і параметри" #: tfrmoptionstoolbase.lbltoolspath.caption #| msgid "Path to program to execute" msgctxt "TFRMOPTIONSTOOLBASE.LBLTOOLSPATH.CAPTION" msgid "&Path to program to execute" msgstr "&Шлях до зовнішньої програми" #: tfrmoptionstooltips.btnaddfields.caption #| msgid "Add" msgctxt "TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION" msgid "A&dd" msgstr "До&дати" #: tfrmoptionstooltips.btnapplyfields.caption #| msgid "Apply" msgctxt "TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION" msgid "A&pply" msgstr "&Застосувати" #: tfrmoptionstooltips.btndeletefields.caption #| msgid "Delete" msgctxt "TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION" msgid "D&elete" msgstr "&Видалити" #: tfrmoptionstooltips.btnfieldslist.caption msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionstooltips.btnfieldssearchtemplate.hint msgctxt "TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT" msgid "Template..." msgstr "Шаблон..." #: tfrmoptionstooltips.gbcustomfields.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION" msgid "Custom fields by file type" msgstr "Додаткові поля за типами файлів" #: tfrmoptionstooltips.gbshowtooltip.caption msgctxt "TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION" msgid "Show tool tip" msgstr "Показати спливаючі підказки" #: tfrmoptionstooltips.lblfieldslist.caption #| msgid "Category hint:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION" msgid "Category &hint:" msgstr "&Підказка категорії:" #: tfrmoptionstooltips.lblfieldsmask.caption #| msgid "Category mask:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION" msgid "Category &mask:" msgstr "&Маска категорії:" #: tfrmoptionstooltips.lblfieldsname.caption #| msgid "Category name:" msgctxt "TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION" msgid "Category &name:" msgstr "&Назва категорії:" #: tfrmoptionstooltips.rbtooltipallfiles.caption #| msgid "Show tool tip for all files in file panel" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION" msgid "Sho&w tool tip for all files in file panel" msgstr "Показу&вати підказки для всіх файлів на панелі файлів" #: tfrmoptionstooltips.rbtooltipnone.caption #| msgid "Don't show" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION" msgid "Don't &show" msgstr "Не показ&увати" #: tfrmoptionstooltips.rbtooltiponlylarge.caption #| msgid "Show tool tip for files in file panel if truncated" msgctxt "TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION" msgid "Show &tool tip for files in file panel if truncated" msgstr "Показувати під&казки для файлів з іменами які не поміщаються на панель" #: tfrmoptionsviewer.btnbackviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNBACKVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.btnfontviewercolor.caption msgctxt "TFRMOPTIONSVIEWER.BTNFONTVIEWERCOLOR.CAPTION" msgid ">>" msgstr ">>" #: tfrmoptionsviewer.gbviewerbookmode.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWERBOOKMODE.CAPTION" msgid "Viewer Book Mode" msgstr "Режим перегляду книг" #: tfrmoptionsviewer.gbviewerexample.caption msgctxt "TFRMOPTIONSVIEWER.GBVIEWEREXAMPLE.CAPTION" msgid "Example" msgstr "Приклад" #: tfrmoptionsviewer.lblbackgroundcolorviewerbook.caption #| msgid "Background color in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLBACKGROUNDCOLORVIEWERBOOK.CAPTION" msgid "&Background color in book viewer" msgstr "Колір ф&ону в переглядачі книг" #: tfrmoptionsviewer.lblfontcolorviewerbook.caption #| msgid "Font color in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLFONTCOLORVIEWERBOOK.CAPTION" msgid "&Font color in book viewer" msgstr "Колір шри&фту в переглядачі книг" #: tfrmoptionsviewer.lblnumbercolumnsviewer.caption #| msgid "Number of columns in book viewer" msgctxt "TFRMOPTIONSVIEWER.LBLNUMBERCOLUMNSVIEWER.CAPTION" msgid "&Number of columns in book viewer" msgstr "К-сть стовпців у переглядачі к&ниг" #: tfrmpackdlg.btncancel.caption #| msgid "Cancel" msgctxt "TFRMPACKDLG.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmpackdlg.btnconfig.caption #| msgid "&Configure" msgctxt "TFRMPACKDLG.BTNCONFIG.CAPTION" msgid "Con&figure" msgstr "&Налаштувати" #: tfrmpackdlg.btnhelp.caption #| msgid "Help" msgctxt "TFRMPACKDLG.BTNHELP.CAPTION" msgid "&Help" msgstr "Допомо&га" #: tfrmpackdlg.btnok.caption #| msgid "OK" msgctxt "TFRMPACKDLG.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfrmpackdlg.caption msgctxt "TFRMPACKDLG.CAPTION" msgid "Pack files" msgstr "Упакування файлів" #: tfrmpackdlg.cbcreateseparatearchives.caption #| msgid "Create separate archives, o&ne per selected file/dir" msgid "C&reate separate archives, one per selected file/dir" msgstr "Окремі архіви для кожн&ого вибраного файлу/каталогу" #: tfrmpackdlg.cbcreatesfx.caption msgid "Create self e&xtracting archive" msgstr "Створити само&розпаковуваний архів" #: tfrmpackdlg.cbencrypt.caption msgid "Encr&ypt" msgstr "&Шифрувати" #: tfrmpackdlg.cbmovetoarchive.caption #| msgid "M&ove to archive" msgid "Mo&ve to archive" msgstr "Перем&істити в архів" #: tfrmpackdlg.cbmultivolume.caption msgid "&Multiple disk archive" msgstr "Багатото&мний архів" #: tfrmpackdlg.cbotherplugins.caption msgid "=>" msgstr "=>" #: tfrmpackdlg.cbputintarfirst.caption #| msgid "Put in the TAR archive first" msgid "P&ut in the TAR archive first" msgstr "Сперш&у помістити в TAR архів" #: tfrmpackdlg.cbstoredir.caption msgid "Also &pack path names (only recursed)" msgstr "Зберігати шляхи" #: tfrmpackdlg.lblprompt.caption msgid "Pack file(s) to the file:" msgstr "Ім'я архіву:" #: tfrmpackdlg.rgpacker.caption msgid "Packer" msgstr "Пакувальник" #: tfrmpackinfodlg.btnclose.caption #| msgid "Close" msgctxt "TFRMPACKINFODLG.BTNCLOSE.CAPTION" msgid "&Close" msgstr "&Закрити" #: tfrmpackinfodlg.btnunpackallandexec.caption msgid "Unpack &all and execute" msgstr "Розпакувати все і виконати" #: tfrmpackinfodlg.btnunpackandexec.caption msgid "&Unpack and execute" msgstr "Розпакувати і виконати" #: tfrmpackinfodlg.caption msgctxt "TFRMPACKINFODLG.CAPTION" msgid "Properties of packed file" msgstr "Властивості стисненого файлу" #: tfrmpackinfodlg.lblattributes.caption msgid "Attributes:" msgstr "Атрибути:" #: tfrmpackinfodlg.lblcompressionratio.caption msgid "Compression ratio:" msgstr "Коефіцієнт стиснення:" #: tfrmpackinfodlg.lbldate.caption msgid "Date:" msgstr "Дата:" #: tfrmpackinfodlg.lblmethod.caption msgid "Method:" msgstr "Метод:" #: tfrmpackinfodlg.lbloriginalsize.caption msgid "Original size:" msgstr "Оригінальний розмір:" #: tfrmpackinfodlg.lblpackedfile.caption msgid "File:" msgstr "Файл:" #: tfrmpackinfodlg.lblpackedsize.caption msgid "Packed size:" msgstr "Розмір стисненого:" #: tfrmpackinfodlg.lblpacker.caption msgid "Packer:" msgstr "Пакувальник:" #: tfrmpackinfodlg.lbltime.caption msgid "Time:" msgstr "Час:" #: tfrmquicksearch.btncancel.caption msgctxt "tfrmquicksearch.btncancel.caption" msgid "X" msgstr "X" #: tfrmquicksearch.btncancel.hint msgid "Close filter panel" msgstr "Закрити панель фільтрів" #: tfrmquicksearch.edtsearch.hint msgid "Enter text to search for or filter by" msgstr "Введіть текст для пошуку чи фільтрації" #: tfrmquicksearch.sbcasesensitive.caption msgid "Aa" msgstr "Aa" #: tfrmquicksearch.sbcasesensitive.hint msgid "Case Sensitive" msgstr "Чутливість до регістру" #: tfrmquicksearch.sbdirectories.caption msgid "D" msgstr "D" #: tfrmquicksearch.sbdirectories.hint msgctxt "tfrmquicksearch.sbdirectories.hint" msgid "Directories" msgstr "Каталоги" #: tfrmquicksearch.sbfiles.caption msgid "F" msgstr "F" #: tfrmquicksearch.sbfiles.hint msgctxt "tfrmquicksearch.sbfiles.hint" msgid "Files" msgstr "Файли" #: tfrmquicksearch.sbmatchbeginning.caption msgid "{" msgstr "{" #: tfrmquicksearch.sbmatchbeginning.hint msgid "Match Beginning" msgstr "Початок співпадіння" #: tfrmquicksearch.sbmatchending.caption msgid "}" msgstr "}" #: tfrmquicksearch.sbmatchending.hint msgid "Match Ending" msgstr "Кінець співпадіння" #: tfrmquicksearch.tglfilter.caption msgctxt "tfrmquicksearch.tglfilter.caption" msgid "Filter" msgstr "Фільтр" #: tfrmquicksearch.tglfilter.hint msgid "Toggle between search or filter" msgstr "Перемикання між режимами пошуку або фільтра" #: tfrmselecttextrange.btppanel.cancelbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CANCELBUTTON.CAPTION" msgid "Cancel" msgstr "Скасувати" #: tfrmselecttextrange.btppanel.closebutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.CLOSEBUTTON.CAPTION" msgid "&Close" msgstr "&Закрити" #: tfrmselecttextrange.btppanel.helpbutton.caption msgctxt "TFRMSELECTTEXTRANGE.BTPPANEL.HELPBUTTON.CAPTION" msgid "&Help" msgstr "&Допомога" #: tfrmselecttextrange.btppanel.okbutton.caption msgctxt "tfrmselecttextrange.btppanel.okbutton.caption" msgid "&OK" msgstr "&Так" #: tfrmselecttextrange.lblselecttext.caption #, fuzzy #| msgid "Select the characters to insert:" msgid "&Select the characters to insert:" msgstr "Виберіть символи для вставки:" #: tfrmsetfileproperties.btncancel.caption #| msgid "Cancel" msgctxt "TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmsetfileproperties.btnok.caption msgctxt "TFRMSETFILEPROPERTIES.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfrmsetfileproperties.caption msgctxt "TFRMSETFILEPROPERTIES.CAPTION" msgid "Change attributes" msgstr "Змінити атрибути" #: tfrmsetfileproperties.cbsgid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSGID.CAPTION" msgid "SGID" msgstr "SGID" #: tfrmsetfileproperties.cbsticky.caption msgctxt "TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION" msgid "Sticky" msgstr "Закріплювальний біт" #: tfrmsetfileproperties.cbsuid.caption msgctxt "TFRMSETFILEPROPERTIES.CBSUID.CAPTION" msgid "SUID" msgstr "SUID" #: tfrmsetfileproperties.chkarchive.caption msgctxt "TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION" msgid "Archive" msgstr "Архівний" #: tfrmsetfileproperties.chkcreationtime.caption msgctxt "TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION" msgid "Created:" msgstr "Створений:" #: tfrmsetfileproperties.chkhidden.caption msgctxt "TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION" msgid "Hidden" msgstr "Прихований" #: tfrmsetfileproperties.chklastaccesstime.caption msgid "Accessed:" msgstr "Доступний:" #: tfrmsetfileproperties.chklastwritetime.caption msgid "Modified:" msgstr "Змінений:" #: tfrmsetfileproperties.chkreadonly.caption msgctxt "TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION" msgid "Read only" msgstr "Лише читання" #: tfrmsetfileproperties.chkrecursive.caption #| msgid "Recursive" msgid "Including subfolders" msgstr "Рекурсивно" #: tfrmsetfileproperties.chksystem.caption msgctxt "TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION" msgid "System" msgstr "Системний" #: tfrmsetfileproperties.gbtimesamp.caption #, fuzzy msgid "Timestamp properties" msgstr "Властивості мітки часу" #: tfrmsetfileproperties.gbunixattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Атрибути" #: tfrmsetfileproperties.gbwinattributes.caption msgctxt "TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION" msgid "Attributes" msgstr "Атрибути" #: tfrmsetfileproperties.lblattrbitsstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION" msgid "Bits:" msgstr "Біти:" #: tfrmsetfileproperties.lblattrgroupstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION" msgid "Group" msgstr "Група" #: tfrmsetfileproperties.lblattrinfo.caption msgid "(gray field means unchanged value)" msgstr "(сірі поля змінити неможливо)" #: tfrmsetfileproperties.lblattrotherstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION" msgid "Other" msgstr "Інші" #: tfrmsetfileproperties.lblattrownerstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION" msgid "Owner" msgstr "Власник" #: tfrmsetfileproperties.lblattrtext.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION" msgid "-----------" msgstr "-----------" #: tfrmsetfileproperties.lblattrtextstr.caption msgctxt "TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION" msgid "Text:" msgstr "Текст:" #: tfrmsetfileproperties.lblexec.caption msgctxt "TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION" msgid "Execute" msgstr "Виконання" #: tfrmsetfileproperties.lbloctal.caption msgctxt "TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION" msgid "Octal:" msgstr "Вісімковий" #: tfrmsetfileproperties.lblread.caption msgctxt "TFRMSETFILEPROPERTIES.LBLREAD.CAPTION" msgid "Read" msgstr "Читання" #: tfrmsetfileproperties.lblwrite.caption msgctxt "TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION" msgid "Write" msgstr "Запис" #: tfrmsplitter.btncancel.caption #| msgid "Cancel" msgctxt "TFRMSPLITTER.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmsplitter.btnftchoice.caption msgctxt "TFRMSPLITTER.BTNFTCHOICE.CAPTION" msgid "..." msgstr "..." #: tfrmsplitter.btnok.caption #| msgid "OK" msgctxt "TFRMSPLITTER.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfrmsplitter.caption msgctxt "TFRMSPLITTER.CAPTION" msgid "Splitter" msgstr "Розбивка" #: tfrmsplitter.cmbxsize.text msgid "1457664B - 3.5\"" msgstr "1457664B - 3.5\"" #: tfrmsplitter.grbxfile.caption msgctxt "TFRMSPLITTER.GRBXFILE.CAPTION" msgid "File name" msgstr "Ім'я файлу" #: tfrmsplitter.grbxsize.caption msgid "Size and number of parts" msgstr "Розмір і кількість частин" #: tfrmsplitter.lbdirtarget.caption #| msgid "Directory target" msgid "Directory &target" msgstr "Катал&ог призначення" #: tfrmsplitter.lbfilesource.caption #| msgid "File source" msgid "File &source" msgstr "Вхідний фай&л" #: tfrmsplitter.lblnumberparts.caption #| msgid "Number of parts" msgid "&Number of parts" msgstr "Кількіст&ь частин" #: tfrmsplitter.rbtngigab.caption #| msgid "Gigabytes" msgctxt "TFRMSPLITTER.RBTNGIGAB.CAPTION" msgid "&Gigabytes" msgstr "&Гігабайти" #: tfrmsplitter.rbtnkilob.caption #| msgid "Kilobytes" msgctxt "TFRMSPLITTER.RBTNKILOB.CAPTION" msgid "&Kilobytes" msgstr "&Кілобайти" #: tfrmsplitter.rbtnmegab.caption #| msgid "Megabytes" msgctxt "TFRMSPLITTER.RBTNMEGAB.CAPTION" msgid "&Megabytes" msgstr "&Мегабайти" #: tfrmsymlink.btncancel.caption #| msgid "Cancel" msgctxt "TFRMSYMLINK.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmsymlink.btnok.caption msgctxt "TFRMSYMLINK.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfrmsymlink.caption msgid "Create symbolic link" msgstr "Створити симв. посилання" #: tfrmsymlink.lblexistingfile.caption #, fuzzy #| msgid "Destination that the link will point to" msgctxt "TFRMSYMLINK.LBLEXISTINGFILE.CAPTION" msgid "&Destination that the link will point to" msgstr "Місце, на яке вказуватиме посилання" #: tfrmsymlink.lbllinktocreate.caption #| msgid "Link name" msgctxt "TFRMSYMLINK.LBLLINKTOCREATE.CAPTION" msgid "&Link name" msgstr "Ім'я поси&лання" #: tfrmtweakplugin.btnadd.caption #| msgid "Add new" msgid "A&dd new" msgstr "Д&одати новий" #: tfrmtweakplugin.btncancel.caption #| msgid "Cancel" msgctxt "TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION" msgid "&Cancel" msgstr "&Скасувати" #: tfrmtweakplugin.btnchange.caption #| msgid "Change" msgid "C&hange" msgstr "З&мінити" #: tfrmtweakplugin.btndefault.caption #| msgid "Default" msgid "De&fault" msgstr "&Типовий" #: tfrmtweakplugin.btnok.caption #| msgid "OK" msgctxt "TFRMTWEAKPLUGIN.BTNOK.CAPTION" msgid "&OK" msgstr "&Так" #: tfrmtweakplugin.btnremove.caption #| msgid "Remove" msgctxt "TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION" msgid "&Remove" msgstr "Вида&лити" #: tfrmtweakplugin.caption msgctxt "TFRMTWEAKPLUGIN.CAPTION" msgid "Tweak plugin" msgstr "Параметри плагіну" #: tfrmtweakplugin.cbpk_caps_by_content.caption #| msgid "Detect archive type by content" msgid "De&tect archive type by content" msgstr "Визнача&ти тип архіву за вмістом" #: tfrmtweakplugin.cbpk_caps_delete.caption #| msgid "Can delete files" msgid "Can de&lete files" msgstr "Може вида&ляти файли" #: tfrmtweakplugin.cbpk_caps_encrypt.caption #| msgid "Supports encryption" msgid "Supports e&ncryption" msgstr "Підтримує &шифрування" #: tfrmtweakplugin.cbpk_caps_hide.caption #| msgid "Show as normal files (hide packer icon)" msgid "Sho&w as normal files (hide packer icon)" msgstr "Показувати як нормальні фа&йли (сховати іконку архіву)" #: tfrmtweakplugin.cbpk_caps_mempack.caption #| msgid "Supports packing in memory" msgid "Supports pac&king in memory" msgstr "Підтриму&є стиснення в пам'яті" #: tfrmtweakplugin.cbpk_caps_modify.caption #| msgid "Can modify exisiting archives" msgid "Can &modify exisiting archives" msgstr "Може з&мінювати існуючі архіви" #: tfrmtweakplugin.cbpk_caps_multiple.caption #| msgid "Archive can contain multiple files" msgid "&Archive can contain multiple files" msgstr "&Архів може містити декілька файлів" #: tfrmtweakplugin.cbpk_caps_new.caption #| msgid "Can create new archives" msgid "Can create new archi&ves" msgstr "Може створювати нові архі&ви" #: tfrmtweakplugin.cbpk_caps_options.caption #| msgid "Supports the options dialogbox" msgid "S&upports the options dialogbox" msgstr "Підтримує діалогове вікно з налашт&уваннями" #: tfrmtweakplugin.cbpk_caps_searchtext.caption #| msgid "Allow searching for text in archives" msgid "Allow searchin&g for text in archives" msgstr "Дозволити шукати текст у архі&вах" #: tfrmtweakplugin.lbldescription.caption #| msgid "Description:" msgctxt "TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION" msgid "&Description:" msgstr "Оп&ис:" #: tfrmtweakplugin.lbldetectstr.caption #, fuzzy #| msgid "Detect string:" msgid "D&etect string:" msgstr "Визначення рядка:" #: tfrmtweakplugin.lblextension.caption #| msgid "Extension:" msgctxt "TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION" msgid "&Extension:" msgstr "&Розширення:" #: tfrmtweakplugin.lblflags.caption msgid "Flags:" msgstr "Позначки:" #: tfrmtweakplugin.lblname.caption #| msgid "Name:" msgctxt "TFRMTWEAKPLUGIN.LBLNAME.CAPTION" msgid "&Name:" msgstr "І&м'я" #: tfrmtweakplugin.lblplugin.caption #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION" msgid "&Plugin:" msgstr "&Плагін:" #: tfrmtweakplugin.lblplugin1.caption #| msgid "Plugin:" msgctxt "TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION" msgid "&Plugin:" msgstr "&Плагін:" #: tfrmviewer.actabout.caption msgctxt "TFRMVIEWER.ACTABOUT.CAPTION" msgid "About Viewer..." msgstr "Про переглядач..." #: tfrmviewer.actabout.hint msgid "Displays the About message" msgstr "Відображає інформаційне повідомлення" #: tfrmviewer.actcopyfile.caption msgctxt "TFRMVIEWER.ACTCOPYFILE.CAPTION" msgid "Copy File" msgstr "Копіювати файл" #: tfrmviewer.actcopyfile.hint msgctxt "TFRMVIEWER.ACTCOPYFILE.HINT" msgid "Copy File" msgstr "Копіювати файл" #: tfrmviewer.actdeletefile.caption msgctxt "TFRMVIEWER.ACTDELETEFILE.CAPTION" msgid "Delete File" msgstr "Видалити файл" #: tfrmviewer.actdeletefile.hint msgctxt "TFRMVIEWER.ACTDELETEFILE.HINT" msgid "Delete File" msgstr "Видалити файл" #: tfrmviewer.actloadnextfile.caption msgctxt "TFRMVIEWER.ACTLOADNEXTFILE.CAPTION" msgid "&Next" msgstr "На&ступний" #: tfrmviewer.actloadnextfile.hint msgid "Load Next File" msgstr "Завантажити наступний" #: tfrmviewer.actloadprevfile.caption msgctxt "TFRMVIEWER.ACTLOADPREVFILE.CAPTION" msgid "&Previous" msgstr "&Попередній" #: tfrmviewer.actloadprevfile.hint msgid "Load Previous File" msgstr "Завантажити попередній" #: tfrmviewer.actmirror.caption msgctxt "TFRMVIEWER.ACTMIRROR.CAPTION" msgid "Mirror" msgstr "Дзеркально" #: tfrmviewer.actmirror.hint msgctxt "TFRMVIEWER.ACTMIRROR.HINT" msgid "Mirror" msgstr "Дзеркально" #: tfrmviewer.actmovefile.caption msgctxt "TFRMVIEWER.ACTMOVEFILE.CAPTION" msgid "Move File" msgstr "Перемістити файл" #: tfrmviewer.actmovefile.hint msgctxt "TFRMVIEWER.ACTMOVEFILE.HINT" msgid "Move File" msgstr "Перемістити файл" #: tfrmviewer.actreload.caption msgctxt "TFRMVIEWER.ACTRELOAD.CAPTION" msgid "Reload" msgstr "Перезавантажити" #: tfrmviewer.actreload.hint msgid "Reload current file" msgstr "Перезавантажити поточний файл" #: tfrmviewer.actrotate180.caption msgctxt "TFRMVIEWER.ACTROTATE180.CAPTION" msgid "Rotate 180" msgstr "Повернути на 180" #: tfrmviewer.actrotate180.hint msgctxt "TFRMVIEWER.ACTROTATE180.HINT" msgid "Rotate 180" msgstr "Повернути на 180" #: tfrmviewer.actrotate270.caption msgctxt "TFRMVIEWER.ACTROTATE270.CAPTION" msgid "Rotate 270" msgstr "Повернути на 270" #: tfrmviewer.actrotate270.hint msgctxt "TFRMVIEWER.ACTROTATE270.HINT" msgid "Rotate 270" msgstr "Повернути на 270" #: tfrmviewer.actrotate90.caption msgctxt "TFRMVIEWER.ACTROTATE90.CAPTION" msgid "Rotate 90" msgstr "Повернути на 90" #: tfrmviewer.actrotate90.hint msgctxt "TFRMVIEWER.ACTROTATE90.HINT" msgid "Rotate 90" msgstr "Повернути на 90" #: tfrmviewer.actsaveas.caption msgctxt "TFRMVIEWER.ACTSAVEAS.CAPTION" msgid "Save As..." msgstr "Зберегти як..." #: tfrmviewer.actsaveas.hint msgid "Save File As..." msgstr "Зберегти як..." #: tfrmviewer.actstretchimage.caption msgctxt "TFRMVIEWER.ACTSTRETCHIMAGE.CAPTION" msgid "Stretch" msgstr "Розтягнути" #: tfrmviewer.actstretchimage.hint msgid "Stretch Image" msgstr "Розтягнути зображення" #: tfrmviewer.btn270.hint msgctxt "TFRMVIEWER.BTN270.HINT" msgid "- 90" msgstr "на 90° ліворуч" #: tfrmviewer.btn90.hint msgctxt "TFRMVIEWER.BTN90.HINT" msgid "+ 90" msgstr "на 90° праворуч" #: tfrmviewer.btncopyfile.hint msgctxt "TFRMVIEWER.BTNCOPYFILE.HINT" msgid "Copy" msgstr "Копіювати" #: tfrmviewer.btncopyfile1.hint msgctxt "TFRMVIEWER.BTNCOPYFILE1.HINT" msgid "Copy" msgstr "Копіювати" #: tfrmviewer.btncuttuimage.hint msgctxt "TFRMVIEWER.BTNCUTTUIMAGE.HINT" msgid "Crop" msgstr "Обрізати" #: tfrmviewer.btndeletefile.hint msgctxt "TFRMVIEWER.BTNDELETEFILE.HINT" msgid "Delete" msgstr "Видалити" #: tfrmviewer.btndeletefile1.hint msgctxt "TFRMVIEWER.BTNDELETEFILE1.HINT" msgid "Delete" msgstr "Видалити" #: tfrmviewer.btnfullscreen.hint msgctxt "TFRMVIEWER.BTNFULLSCREEN.HINT" msgid "Full Screen" msgstr "На весь екран" #: tfrmviewer.btngifmove.caption msgctxt "TFRMVIEWER.BTNGIFMOVE.CAPTION" msgid "||" msgstr "||" #: tfrmviewer.btngiftobmp.caption msgid "S" msgstr "S" #: tfrmviewer.btnhightlight.hint msgctxt "TFRMVIEWER.BTNHIGHTLIGHT.HINT" msgid "Highlight" msgstr "Підсвітити" #: tfrmviewer.btnmirror.hint msgctxt "TFRMVIEWER.BTNMIRROR.HINT" msgid "Mirror" msgstr "Дзеркально" #: tfrmviewer.btnmovefile.hint msgctxt "TFRMVIEWER.BTNMOVEFILE.HINT" msgid "Move" msgstr "Перемістити" #: tfrmviewer.btnmovefile1.hint msgctxt "TFRMVIEWER.BTNMOVEFILE1.HINT" msgid "Move" msgstr "Перемістити" #: tfrmviewer.btnnextgifframe.caption msgid "||>" msgstr "||>" #: tfrmviewer.btnpaint.hint msgctxt "TFRMVIEWER.BTNPAINT.HINT" msgid "Paint" msgstr "Малювати" #: tfrmviewer.btnprevgifframe.caption msgid "<||" msgstr "<||" #: tfrmviewer.btnredeye.hint msgid "Red Eyes" msgstr "Червоні очі" #: tfrmviewer.btnresize.hint msgctxt "TFRMVIEWER.BTNRESIZE.HINT" msgid "Resize" msgstr "Змінити розмір" #: tfrmviewer.btnundo.hint msgctxt "TFRMVIEWER.BTNUNDO.HINT" msgid "Undo" msgstr "Вернути" #: tfrmviewer.btnzoomin.hint msgctxt "TFRMVIEWER.BTNZOOMIN.HINT" msgid "Zoom In" msgstr "Збільшити" #: tfrmviewer.btnzoomout.hint msgctxt "TFRMVIEWER.BTNZOOMOUT.HINT" msgid "Zoom Out" msgstr "Зменшити" #: tfrmviewer.caption msgctxt "tfrmviewer.caption" msgid "Viewer" msgstr "Переглядач" #: tfrmviewer.cbslideshow.caption msgctxt "TFRMVIEWER.CBSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Слайд-шоу" #: tfrmviewer.comboboxpaint.text msgid "Pen" msgstr "Ручка" #: tfrmviewer.comboboxwidth.text msgctxt "TFRMVIEWER.COMBOBOXWIDTH.TEXT" msgid "1" msgstr "1" #: tfrmviewer.gboxhightlight.caption msgctxt "TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION" msgid "Highlight" msgstr "Підсвітити" #: tfrmviewer.gboxpaint.caption msgctxt "TFRMVIEWER.GBOXPAINT.CAPTION" msgid "Paint" msgstr "Малювати" #: tfrmviewer.gboxslideshow.caption msgctxt "TFRMVIEWER.GBOXSLIDESHOW.CAPTION" msgid "Slide Show" msgstr "Слайд-шоу" #: tfrmviewer.gboxview.caption msgctxt "TFRMVIEWER.GBOXVIEW.CAPTION" msgid "View" msgstr "Перегляд" #: tfrmviewer.lblhightlight.caption msgid "0x0" msgstr "0x0" #: tfrmviewer.mi180.caption msgid "+ 180" msgstr "на 180° праворуч" #: tfrmviewer.mi270.caption msgctxt "TFRMVIEWER.MI270.CAPTION" msgid "- 90" msgstr "на 90° ліворуч" #: tfrmviewer.mi90.caption msgctxt "TFRMVIEWER.MI90.CAPTION" msgid "+ 90" msgstr "на 90° праворуч" #: tfrmviewer.miabout.caption msgctxt "TFRMVIEWER.MIABOUT.CAPTION" msgid "About" msgstr "Про програму..." #: tfrmviewer.mibin.caption msgid "Show as &Bin" msgstr "Показати як &двійковий" #: tfrmviewer.micopytoclipboard.caption msgctxt "TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION" msgid "Copy To Clipboard" msgstr "Копіювати в буфер" #: tfrmviewer.midiv1.caption msgctxt "TFRMVIEWER.MIDIV1.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv2.caption msgctxt "TFRMVIEWER.MIDIV2.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv3.caption msgctxt "TFRMVIEWER.MIDIV3.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv4.caption msgctxt "TFRMVIEWER.MIDIV4.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.midiv5.caption msgctxt "TFRMVIEWER.MIDIV5.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.miedit.caption msgctxt "TFRMVIEWER.MIEDIT.CAPTION" msgid "&Edit" msgstr "&Редагування" #: tfrmviewer.miencoding.caption msgctxt "TFRMVIEWER.MIENCODING.CAPTION" msgid "En&coding" msgstr "Код&ування" #: tfrmviewer.miexit.caption msgctxt "TFRMVIEWER.MIEXIT.CAPTION" msgid "E&xit" msgstr "Ви&хід" #: tfrmviewer.mifile.caption msgctxt "TFRMVIEWER.MIFILE.CAPTION" msgid "&File" msgstr "&Файл" #: tfrmviewer.mifullscreen.caption msgctxt "TFRMVIEWER.MIFULLSCREEN.CAPTION" msgid "Full Screen" msgstr "На весь екран" #: tfrmviewer.migraphics.caption msgid "Graphics" msgstr "Графіка" #: tfrmviewer.mihex.caption msgid "Show as &Hex" msgstr "Показати як &шістнадцятковий" #: tfrmviewer.miimage.caption msgid "&Image" msgstr "&Малюнок" #: tfrmviewer.milookbook.caption msgid "Show as B&ook" msgstr "Показати як &книгу" #: tfrmviewer.mimirror.caption msgctxt "TFRMVIEWER.MIMIRROR.CAPTION" msgid "Mirror" msgstr "Дзеркально" #: tfrmviewer.miplugins.caption msgctxt "TFRMVIEWER.MIPLUGINS.CAPTION" msgid "Plugins" msgstr "Плагіни" #: tfrmviewer.mipreview.caption msgctxt "TFRMVIEWER.MIPREVIEW.CAPTION" msgid "Preview" msgstr "Попередній перегляд" #: tfrmviewer.miprint.caption msgid "Print..." msgstr "Друк..." #: tfrmviewer.mirotate.caption msgctxt "TFRMVIEWER.MIROTATE.CAPTION" msgid "Rotate" msgstr "Обертати" #: tfrmviewer.misave.caption msgctxt "TFRMVIEWER.MISAVE.CAPTION" msgid "Save" msgstr "Зберегти" #: tfrmviewer.misaveas.caption msgctxt "TFRMVIEWER.MISAVEAS.CAPTION" msgid "Save As..." msgstr "Зберегти як..." #: tfrmviewer.miscreenshot.caption msgctxt "TFRMVIEWER.MISCREENSHOT.CAPTION" msgid "Screenshot" msgstr "Скріншот" #: tfrmviewer.misearch.caption msgctxt "TFRMVIEWER.MISEARCH.CAPTION" msgid "Search" msgstr "Пошук" #: tfrmviewer.misearchnext.caption msgid "Search next" msgstr "Знайти далі" #: tfrmviewer.misearchprev.caption msgid "Search prev" msgstr "Знайти раніше" #: tfrmviewer.miselectall.caption msgctxt "TFRMVIEWER.MISELECTALL.CAPTION" msgid "Select All" msgstr "Виділити &усе" #: tfrmviewer.miseparator.caption msgctxt "TFRMVIEWER.MISEPARATOR.CAPTION" msgid "-" msgstr "-" #: tfrmviewer.mistretch.caption msgctxt "TFRMVIEWER.MISTRETCH.CAPTION" msgid "Stretch" msgstr "Розтягнути" #: tfrmviewer.mitext.caption msgid "Show as &Text" msgstr "Показати як &текст" #: tfrmviewer.miview.caption msgctxt "TFRMVIEWER.MIVIEW.CAPTION" msgid "&View" msgstr "&Перегляд" #: tfrmviewer.miwraptext.caption msgid "Show as &Wrap text" msgstr "Показати як текст з &розривами рядків" #: tfrmviewer.mizoomin.caption msgctxt "TFRMVIEWER.MIZOOMIN.CAPTION" msgid "Zoom In" msgstr "Збільшити" #: tfrmviewer.mizoomout.caption msgctxt "TFRMVIEWER.MIZOOMOUT.CAPTION" msgid "Zoom Out" msgstr "Зменшити" #: tfrmviewer.pmicopy.caption msgctxt "TFRMVIEWER.PMICOPY.CAPTION" msgid "Copy To Clipboard" msgstr "&Копіювати в буфер" #: tfrmviewer.pmiselectall.caption msgctxt "TFRMVIEWER.PMISELECTALL.CAPTION" msgid "Select All" msgstr "Виділити &все" #: tfrmviewoperations.btnstartpause.caption #| msgid "Start" msgctxt "tfrmviewoperations.btnstartpause.caption" msgid "&Start" msgstr "С&тарт" #: tfrmviewoperations.btnstop.caption msgid "S&top" msgstr "Зупини&ти" #: tfrmviewoperations.caption msgctxt "TFRMVIEWOPERATIONS.CAPTION" msgid "File operations" msgstr "Операції з файлами" #: tfrmviewoperations.cbalwaysontop.caption msgid "Always on top" msgstr "Завжди поверх інших вікон" #: tfrmviewoperations.lblusedragdrop.caption msgid "Use \"drag && drop\" to move operations between queues" msgstr "Використовуйте \"drag && drop\", щоб переміщувати операції між чергами" #: tfrmviewoperations.mnucanceloperation.caption msgctxt "tfrmviewoperations.mnucanceloperation.caption" msgid "Cancel" msgstr "Скасувати" #: tfrmviewoperations.mnucancelqueue.caption msgctxt "tfrmviewoperations.mnucancelqueue.caption" msgid "Cancel" msgstr "Скасувати" #: tfrmviewoperations.mnunewqueue.caption msgid "New queue" msgstr "Нова черга" #: tfrmviewoperations.mnuoperationshowdetached.caption msgctxt "tfrmviewoperations.mnuoperationshowdetached.caption" msgid "Show in detached window" msgstr "Показати в окремому вікні" #: tfrmviewoperations.mnuputfirstinqueue.caption msgid "Put first in queue" msgstr "На початок черги" #: tfrmviewoperations.mnuputlastinqueue.caption msgid "Put last in queue" msgstr "В кінець черги" #: tfrmviewoperations.mnuqueue.caption msgctxt "tfrmviewoperations.mnuqueue.caption" msgid "Queue" msgstr "Черга" #: tfrmviewoperations.mnuqueue0.caption msgid "Out of queue" msgstr "З черги" #: tfrmviewoperations.mnuqueue1.caption msgid "Queue 1" msgstr "Черга 1" #: tfrmviewoperations.mnuqueue2.caption msgid "Queue 2" msgstr "Черга 2" #: tfrmviewoperations.mnuqueue3.caption msgid "Queue 3" msgstr "Черга 3" #: tfrmviewoperations.mnuqueue4.caption msgid "Queue 4" msgstr "Черга 4" #: tfrmviewoperations.mnuqueue5.caption msgid "Queue 5" msgstr "Черга 5" #: tfrmviewoperations.mnuqueueshowdetached.caption msgctxt "tfrmviewoperations.mnuqueueshowdetached.caption" msgid "Show in detached window" msgstr "Показати в окремому вікні" #: tfrmviewoperations.tbpauseall.caption msgid "&Pause all" msgstr "&Призупинити все" #: tmultiarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "tmultiarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Якщо файл існує" #: twcxarchivecopyoperationoptionsui.lblfileexists.caption msgctxt "twcxarchivecopyoperationoptionsui.lblfileexists.caption" msgid "When file exists" msgstr "Якщо файл існує" #: twfxplugincopymoveoperationoptionsui.cbworkinbackground.caption msgid "Work in background (separate connection)" msgstr "Працювати у фоні (окреме з’єднання)" #: twfxplugincopymoveoperationoptionsui.lblfileexists.caption msgctxt "TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION" msgid "When file exists" msgstr "Якщо файл існує" #: ulng.rscancelfilter msgid "Cancel Quick Filter" msgstr "Скасувати швидкий фільтр" #: ulng.rscanceloperation msgid "Cancel Current Operation" msgstr "Скасувати поточну операцію" #: ulng.rsclipboardcontainsinvalidtoolbardata msgid "Clipboard doesn't contain any valid toolbar data." msgstr "Буфер обміну не містить допустимих даних панелі інструментів." #: ulng.rscolattr msgid "Attr" msgstr "Атриб" #: ulng.rscoldate msgid "Date" msgstr "Дата" #: ulng.rscolext msgid "Ext" msgstr "Розш" #: ulng.rscolname msgctxt "ulng.rscolname" msgid "Name" msgstr "Ім'я" #: ulng.rscolsize msgctxt "ulng.rscolsize" msgid "Size" msgstr "Розмір" #: ulng.rscomparediffs msgid "Number of changes:" msgstr "К-сть змін:" #: ulng.rsconfcolalign msgid "Align" msgstr "Вирівн" #: ulng.rsconfcolcaption msgid "Caption" msgstr "Заголовок" #: ulng.rsconfcolconfig msgid "Config" msgstr "Налаштувати" #: ulng.rsconfcoldelete msgctxt "ulng.rsconfcoldelete" msgid "Delete" msgstr "Видалити" #: ulng.rsconfcolfieldcont msgid "Field contents" msgstr "Вміст поля даних" #: ulng.rsconfcolmove msgctxt "ulng.rsconfcolmove" msgid "Move" msgstr "Перемістити" #: ulng.rsconfcolwidth msgctxt "ulng.rsconfcolwidth" msgid "Width" msgstr "Ширина" #: ulng.rsconfcustheader msgid "Customize column" msgstr "Налаштування колонки" #: ulng.rscopynametemplate msgid "Copy (%d) %s" msgstr "Копіювати (%d) %s" #: ulng.rsdlgallopcomplete #| msgid "All operations is complete" msgid "All operations completed" msgstr "Всі операції завершено" #: ulng.rsdlgallopprogress msgid "Progress of all operations %d %%" msgstr "Прогрес всіх операцій %d %%" #: ulng.rsdlgbuttonabort msgid "Ab&ort" msgstr "П&ерервати" #: ulng.rsdlgbuttonall msgctxt "ulng.rsdlgbuttonall" msgid "A&ll" msgstr "В&се" #: ulng.rsdlgbuttonappend msgid "A&ppend" msgstr "&Додати" #: ulng.rsdlgbuttoncancel msgctxt "ulng.rsdlgbuttoncancel" msgid "&Cancel" msgstr "&Скасувати" #: ulng.rsdlgbuttoncontinue msgid "&Continue" msgstr "Продов&жити" #: ulng.rsdlgbuttoncopyinto msgid "Copy &Into" msgstr "&Копіювати в" #: ulng.rsdlgbuttoncopyintoall msgid "Copy Into &All" msgstr "Копіюв&ати у всі" #: ulng.rsdlgbuttonexitprogram msgid "E&xit program" msgstr "В&ихід з програми" #: ulng.rsdlgbuttonignoreall msgid "I&gnore All" msgstr "Пропуст&ити все" #: ulng.rsdlgbuttonno msgid "&No" msgstr "&Ні" #: ulng.rsdlgbuttonnone msgid "Non&e" msgstr "&Жодного" #: ulng.rsdlgbuttonok msgctxt "ulng.rsdlgbuttonok" msgid "&OK" msgstr "&ОК" #: ulng.rsdlgbuttonoverwrite msgid "&Overwrite" msgstr "&Перезаписати" #: ulng.rsdlgbuttonoverwriteall msgid "Overwrite &All" msgstr "Пере&записати все" #: ulng.rsdlgbuttonoverwriteolder msgid "Overwrite All Ol&der" msgstr "Замінити всі ста&рі" #: ulng.rsdlgbuttonresume msgid "&Resume" msgstr "&Підсумок" #: ulng.rsdlgbuttonretry msgid "Re&try" msgstr "Повтор&ити" #: ulng.rsdlgbuttonskip msgid "&Skip" msgstr "Пр&опустити" #: ulng.rsdlgbuttonskipall msgid "S&kip All" msgstr "Проп&устити все" #: ulng.rsdlgbuttonyes msgid "&Yes" msgstr "&Так" #: ulng.rsdlgcalcstatistics msgid "Calculate files and folders" msgstr "Підрахувати файли і папки" #: ulng.rsdlgchecksumcalc msgctxt "ulng.rsdlgchecksumcalc" msgid "Calculate check sum..." msgstr "Розрахувати контрольну суму..." #: ulng.rsdlgchecksumverify msgctxt "ulng.rsdlgchecksumverify" msgid "Verify check sum..." msgstr "Перевірити контрольну суму..." #: ulng.rsdlgcp msgctxt "ulng.rsdlgcp" msgid "Copy file(s)" msgstr "Копіювання файлу(ів)" #: ulng.rsdlgdel msgid "Delete file(s)" msgstr "Видалити файл(и)" #: ulng.rsdlgmv msgctxt "ulng.rsdlgmv" msgid "Move file(s)" msgstr "Переміщення файлу(ів)" #: ulng.rsdlgoppause #| msgid "Pause" msgctxt "ulng.rsdlgoppause" msgid "Pau&se" msgstr "Пау&за" #: ulng.rsdlgopstart #| msgid "Start" msgctxt "ulng.rsdlgopstart" msgid "&Start" msgstr "&Старт" #: ulng.rsdlgqueue msgctxt "ulng.rsdlgqueue" msgid "Queue" msgstr "Черга" #: ulng.rsdlgspeed msgid "Speed %s/s" msgstr "Швидкість %s/s" #: ulng.rsdlgspeedtime msgid "Speed %s/s, time remaining %s" msgstr "Швидкість %s/с, залишилось часу %s" #: ulng.rsdlgsplit msgctxt "ulng.rsdlgsplit" msgid "Split" msgstr "Розрізати" #: ulng.rsdlgwipe msgid "Wipe file(s)" msgstr "Стерти файл(и)" #: ulng.rsdrivenolabel #, fuzzy msgid "" msgstr "" #: ulng.rsdrivenomedia #, fuzzy msgid "" msgstr "" #: ulng.rseditabouttext msgid "Internal Editor of Double Commander." msgstr "Внутрішній редактор Double Commander." #: ulng.rseditnewfile msgid "new.txt" msgstr "Новий.txt" #: ulng.rseditnewfilename msgid "Filename:" msgstr "Ім'я файлу:" #: ulng.rseditnewopen msgid "Open file" msgstr "Відкрити файл" #: ulng.rseditsearchback msgid "&Backward" msgstr "&Назад" #: ulng.rseditsearchcaption msgctxt "ulng.rseditsearchcaption" msgid "Search" msgstr "Пошук" #: ulng.rseditsearchfrw msgid "&Forward" msgstr "&Вперед" #: ulng.rseditsearchreplace msgctxt "ulng.rseditsearchreplace" msgid "Replace" msgstr "Замінити" #: ulng.rsfileopdirectoryexistsoptions msgid "Ask;Overwrite;Copy into;Skip" msgstr "Запитати;Замінити;Копіювати в; Пропустити" #: ulng.rsfileopfileexistsoptions #| msgid "Ask;Overwrite;Skip" msgid "Ask;Overwrite;Overwrite Older;Skip" msgstr "Запитати;Замінити;Замінити старі;Пропустити" #: ulng.rsfileopsetpropertyerroroptions msgctxt "ulng.rsfileopsetpropertyerroroptions" msgid "Ask;Don't set anymore;Ignore errors" msgstr "Запитати;Не встановлювати більше;Ігнорувати помилки" #: ulng.rsfilterstatus msgid "FILTER" msgstr "Фільтр" #: ulng.rsfinddefinetemplate msgid "Define template" msgstr "Визначення шаблону" #: ulng.rsfinddepth msgid "%s level(s)" msgstr "%s рівень(і)" #: ulng.rsfinddepthall msgid "all (unlimited depth)" msgstr "Всюди (необмежена глибина)" #: ulng.rsfinddepthcurdir msgid "current dir only" msgstr "Тільки поточному каталогозі" #: ulng.rsfinddirnoex msgid "Directory %s does not exist!" msgstr "Каталог %s не існує!" #: ulng.rsfindfound msgctxt "ulng.rsfindfound" msgid "Found: %d" msgstr "Знайдено: %d" #: ulng.rsfindsavetemplatecaption msgid "Save search template" msgstr "Зберегти шаблон пошуку" #: ulng.rsfindsavetemplatetitle msgid "Template name:" msgstr "Ім'я шаблону" #: ulng.rsfindscanned msgctxt "ulng.rsfindscanned" msgid "Scanned: %d" msgstr "Проглянуто: %d" #: ulng.rsfindscanning msgid "Scanning" msgstr "Сканування" #: ulng.rsfindsearchfiles msgctxt "ulng.rsfindsearchfiles" msgid "Find files" msgstr "Пошук файлів" #: ulng.rsfindwherebeg msgid "Begin at" msgstr "Починати з" #: ulng.rsfreemsg msgid "Free %s from %s bytes" msgstr "Вільно %s з %s байт" #: ulng.rsfreemsgshort msgid "%s bytes free" msgstr "%s байт вільно" #: ulng.rsfuncatime msgid "Access date/time" msgstr "Дата/Час доступу" #: ulng.rsfuncattr msgctxt "ulng.rsfuncattr" msgid "Attributes" msgstr "Атрибути" #: ulng.rsfunccomment msgctxt "ulng.rsfunccomment" msgid "Comment" msgstr "Коментар" #: ulng.rsfunccompressedsize msgid "Compressed size" msgstr "Стиснутий розмір" #: ulng.rsfuncctime msgid "Creation date/time" msgstr "Дата/Час створення" #: ulng.rsfuncext msgid "Extension" msgstr "Розширення" #: ulng.rsfuncgroup msgctxt "ulng.rsfuncgroup" msgid "Group" msgstr "Група" #: ulng.rsfunclinkto msgid "Link to" msgstr "Посилання на" #: ulng.rsfuncmtime msgid "Modification date/time" msgstr "Дата/Час зміни" #: ulng.rsfuncname msgctxt "ulng.rsfuncname" msgid "Name" msgstr "Ім'я" #: ulng.rsfuncnamenoext msgid "Name without extension" msgstr "Ім’я без розширення" #: ulng.rsfuncowner msgctxt "ulng.rsfuncowner" msgid "Owner" msgstr "Власник" #: ulng.rsfuncpath msgctxt "ulng.rsfuncpath" msgid "Path" msgstr "Шлях" #: ulng.rsfuncsize msgctxt "ulng.rsfuncsize" msgid "Size" msgstr "Розмір" #: ulng.rsfunctype msgid "Type" msgstr "Тип" #: ulng.rsharderrcreate msgid "Error creating hardlink." msgstr "Помилка створення жорсткого посилання." #: ulng.rshotkeycategorycopymovedialog msgid "Copy/Move Dialog" msgstr "Вікно Копіювання/Переміщення" #: ulng.rshotkeycategorydiffer msgctxt "ulng.rshotkeycategorydiffer" msgid "Differ" msgstr "Порівнювач" #: ulng.rshotkeycategorymain msgid "Main" msgstr "Основний" #: ulng.rshotkeycategoryviewer msgctxt "ulng.rshotkeycategoryviewer" msgid "Viewer" msgstr "Переглядач" #: ulng.rslinkmsgok msgid "Linker complete" msgstr "Компонування завершено" #: ulng.rsmarkminus msgid "Unselect mask" msgstr "Маска зняття вибору" #: ulng.rsmarkplus msgid "Select mask" msgstr "Маска вибору" #: ulng.rsmaskinput msgid "Input mask:" msgstr "Вкажіть маску (роздільник - ';'):" #: ulng.rsmenuconfigurecustomcolumns msgid "Configure custom columns" msgstr "Налаштувати набір колонок" #: ulng.rsmenuconfigurethiscustomcolumn msgid "Configure this custom columns view" msgstr "Налаштувати поточний набір колонок" #: ulng.rsmnuactions msgctxt "ulng.rsmnuactions" msgid "Actions" msgstr "Команди" #: ulng.rsmnuedit msgctxt "ulng.rsmnuedit" msgid "Edit" msgstr "Редагувати" #: ulng.rsmnueject msgid "Eject" msgstr "Витягнути" #: ulng.rsmnumount msgid "Mount" msgstr "Монтувати" #: ulng.rsmnunew msgctxt "ulng.rsmnunew" msgid "New" msgstr "Створити" #: ulng.rsmnunomedia msgid "No media available" msgstr "Немає доступних носіїв" #: ulng.rsmnuopenwith #| msgid "Open with ..." msgid "Open with" msgstr "Відкрити з допомогою..." #: ulng.rsmnuopenwithother msgid "Other..." msgstr "Інше..." #: ulng.rsmnusortby msgid "Sort by" msgstr "Сортувати за" #: ulng.rsmnuumount msgid "Unmount" msgstr "Розмонтувати" #: ulng.rsmnuview msgctxt "ulng.rsmnuview" msgid "View" msgstr "Перегляд" #: ulng.rsmsgaccount msgid "Account:" msgstr "Обліковий запис:" #: ulng.rsmsgarchivercustomparams msgid "Additional parameters for archiver command-line:" msgstr "Додаткові параметри для командного рядка архіватора:" #: ulng.rsmsgcannotcopymoveitself msgid "You can not copy/move a file \"%s\" to itself!" msgstr "Ви не можете скопіювати/перемістити файл \"%s\" в самого себе!" #: ulng.rsmsgcannotdeletedirectory msgid "Cannot delete directory %s" msgstr "Не вдається видалити каталог %s" #: ulng.rsmsgchdirfailed msgid "ChDir to [%s] failed!" msgstr "Перехід в каталог [%s] не вдався!" #: ulng.rsmsgcloseallinactivetabs msgid "Remove all inactive tabs?" msgstr "Видалити всі неактивні вкладки?" #: ulng.rsmsgcloselockedtab msgid "This tab (%s) is locked! Close anyway?" msgstr "Закладка (%s) заблокована. Закрити?" #: ulng.rsmsgconfirmquit msgid "Are you sure you want to quit?" msgstr "Ви впевнені, що хочете вийти?" #: ulng.rsmsgcpfldr msgid "Copy %d selected files/directories?" msgstr "Копіювати %d обраних файлів/каталогів?" #: ulng.rsmsgcpsel msgid "Copy selected \"%s\"?" msgstr "Копіювати виділене \"%s\"?" #: ulng.rsmsgdeletepartiallycopied msgid "Delete the partially copied file ?" msgstr "Видалити частково скопійований файл?" #: ulng.rsmsgdelfldr msgid "Delete %d selected files/directories?" msgstr "Видалити %d обраних файлів/каталогів?" #: ulng.rsmsgdelfldrt msgid "Delete %d selected files/directories into trash can?" msgstr "Видалити %d обраних файлів/каталогів у смітник?" #: ulng.rsmsgdelsel msgid "Delete selected \"%s\"?" msgstr "Видалити вибрані \"%s\"?" #: ulng.rsmsgdelselt msgid "Delete selected \"%s\" into trash can?" msgstr "Видалити вибрані \"%s\" в смітник" #: ulng.rsmsgdeltotrashforce msgid "Can not delete \"%s\" to trash! Delete directly?" msgstr "Неможливо видалити \"%s\" у смітник! Видалити назавжди?" #: ulng.rsmsgdisknotavail msgid "Disk is not available" msgstr "Диск не доступний" #: ulng.rsmsgenterfileext msgid "Enter file extension:" msgstr "Введіть розширення файлу:" #: ulng.rsmsgentername msgid "Enter name:" msgstr "Введіть ім'я:" #: ulng.rsmsgerrbadarchive msgid "CRC error in archive data" msgstr "Контрольна сума не співпадає, архів пошкоджено." #: ulng.rsmsgerrbaddata msgid "Data is bad" msgstr "Дані пошкоджено" #: ulng.rsmsgerrcannotconnect msgid "Can not connect to server: \"%s\"" msgstr "Неможливо з'єднатися з серевером: \"%s\"" #: ulng.rsmsgerrcannotcopyfile msgid "Cannot copy file %s to %s" msgstr "Помилка при копіюванні файлу %s в %s" #: ulng.rsmsgerrcreatefiledirectoryexists msgid "There already exists a directory named \"%s\"." msgstr "Там вже існує каталог з ім'ям \"%s\"." #: ulng.rsmsgerrdatenotsupported msgid "Date %s is not supported" msgstr "Дата %s не підтримується" #: ulng.rsmsgerrdirexists msgid "Directory %s exists!" msgstr "Каталог %s існує!" #: ulng.rsmsgerreaborted msgid "Function aborted by user" msgstr "Припинено користувачем" #: ulng.rsmsgerreclose msgid "Error closing file" msgstr "Не можу закрити файл" #: ulng.rsmsgerrecreate msgid "Cannot create file" msgstr "Не можу створити файл" #: ulng.rsmsgerrendarchive msgid "No more files in archive" msgstr "В архіві немає більше файлів" #: ulng.rsmsgerreopen msgid "Cannot open existing file" msgstr "Не можу відкрити існуючий файл" #: ulng.rsmsgerreread msgid "Error reading from file" msgstr "Помилка читання з файлу" #: ulng.rsmsgerrewrite msgid "Error writing to file" msgstr "Помилка запису в файл" #: ulng.rsmsgerrforcedir msgid "Can not create directory %s!" msgstr "Не можу створити каталог %s!" #: ulng.rsmsgerrinvalidlink msgid "Invalid link" msgstr "Некоректне посилання" #: ulng.rsmsgerrnofiles msgid "No files found" msgstr "Файли не знайдено" #: ulng.rsmsgerrnomemory msgid "Not enough memory" msgstr "Недостатньо пам'яті" #: ulng.rsmsgerrnotsupported msgid "Function not supported!" msgstr "Функція не підтримується!" #: ulng.rsmsgerrorincontextmenucommand msgid "Error in context menu command" msgstr "Помилка в команді контекстного меню" #: ulng.rsmsgerrorloadingconfiguration msgid "Error when loading configuration" msgstr "Помилка при завантаженні конфігурації" #: ulng.rsmsgerrregexpsyntax msgid "Syntax error in regular expression!" msgstr "Синтаксична помилка в регулярному виразі!" #: ulng.rsmsgerrrename msgid "Cannot rename file %s to %s" msgstr "Неможливо перейменувати файл з %s в %s" #: ulng.rsmsgerrsaveassociation msgid "Can not save association!" msgstr "Не вдається зберегти асоціацію!" #: ulng.rsmsgerrsavefile msgid "Cannot save file" msgstr "Неможливо зберегти файл" #: ulng.rsmsgerrsetattribute msgid "Can not set attributes for \"%s\"" msgstr "Неможливо встановити атрибути для \"%s\"" #: ulng.rsmsgerrsetdatetime msgid "Can not set date/time for \"%s\"" msgstr "Неможливо встановити дату/час для \"%s\"" #: ulng.rsmsgerrsetownership msgid "Can not set owner/group for \"%s\"" msgstr "Не вдається встановити права/групу для \"%s\"" #: ulng.rsmsgerrsmallbuf msgid "Buffer too small" msgstr "Буфер переповнено" #: ulng.rsmsgerrtoomanyfiles msgid "Too many files to pack" msgstr "Надто багато файлів для запакування" #: ulng.rsmsgerrunknownformat msgid "Archive format unknown" msgstr "Архів пошкоджено або має невідомий формат" #: ulng.rsmsgfilechangedsave msgid "File %s changed, save?" msgstr "Файл %s змінено, зберегти?" #: ulng.rsmsgfileexistsrwrt msgid "File %s exists, overwrite?" msgstr "Файл %s існує, перезаписати?" #: ulng.rsmsgfilenotfound msgid "File \"%s\" not found." msgstr "" #: ulng.rsmsgfileoperationsactive msgid "File operations active" msgstr "Активні операції з файлами" #: ulng.rsmsgfileoperationsactivelong msgid "Some file operations have not yet finished. Closing Double Commander may result in data loss." msgstr "Деякі операції з файлами ще не завершені. Закриття Double Commander може призвести до втрати даних." #: ulng.rsmsgfilereadonly msgid "File %s is marked as read-only. Delete it?" msgstr "Файл %s помічений як доступний лише для читання. Видалити?" #: ulng.rsmsgfilesizetoobig msgid "The file size of \"%s\" is too big for destination file system!" msgstr "Розмір файлу \"%s\" є занадто великим для цільової файлової системи!" #: ulng.rsmsgfolderexistsrwrt msgid "Folder %s exists, overwrite?" msgstr "Каталог %s існує, перезаписати?" #: ulng.rsmsgfollowsymlink msgid "Follow symlink \"%s\"?" msgstr "Прямувати за посиланням \"%s\"?" #: ulng.rsmsginvalidcommandline msgid "Error in command line" msgstr "Помилка в командному рядку" #: ulng.rsmsginvalidfilename msgid "Invalid filename" msgstr "Некоректне ім'я файлу" #: ulng.rsmsginvalidformatofconfigurationfile msgid "Invalid format of configuration file" msgstr "Неправильний формат файлу конфігурації" #: ulng.rsmsginvalidpath msgid "Invalid path" msgstr "Некоректний шлях" #: ulng.rsmsginvalidpathlong msgid "Path %s contains forbidden characters." msgstr "Шлях %s містить недопустимі символи." #: ulng.rsmsginvalidplugin msgid "This is not a valid plugin!" msgstr "Цей плагін недопустимий!" #: ulng.rsmsginvalidpluginarchitecture msgid "This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!" msgstr "Цей плагін створений для Double Commander %s. %s не може працювати з Double Commander %s!" #: ulng.rsmsginvalidquoting msgid "Invalid quoting" msgstr "Недопустиме значення в лапках" #: ulng.rsmsginvalidselection msgid "Invalid selection." msgstr "Некоректне виділення." #: ulng.rsmsgloadingfilelist msgid "Loading file list..." msgstr "Завантаження списку файлів..." #: ulng.rsmsglogcopy msgid "Copy file %s" msgstr "Копіювання файлу %s" #: ulng.rsmsglogdelete msgid "Delete file %s" msgstr "Видалення файлу %s" #: ulng.rsmsglogerror msgid "Error: " msgstr "Помилка: " #: ulng.rsmsglogextract msgid "Extract file %s" msgstr "Розпакування файлу %s" #: ulng.rsmsgloginfo msgid "Info: " msgstr "Інформація: " #: ulng.rsmsgloglink msgid "Create link %s" msgstr "Створення посилання %s" #: ulng.rsmsglogmkdir msgid "Create directory %s" msgstr "Створення каталогу %s" #: ulng.rsmsglogmove msgid "Move file %s" msgstr "Переміщення файлу %s" #: ulng.rsmsglogpack msgid "Pack to file %s" msgstr "Упакування в файл %s" #: ulng.rsmsglogrmdir msgid "Remove directory %s" msgstr "Видалення каталогу %s" #: ulng.rsmsglogsuccess msgid "Done: " msgstr "Виконано: " #: ulng.rsmsglogsymlink msgid "Create symlink %s" msgstr "Створення символьного посилання %s" #: ulng.rsmsglogtest msgid "Test file integrity %s" msgstr "Перевірка цілістності файлу %s" #: ulng.rsmsgmanualaddhotdir msgid "Manually add hot path" msgstr "Вручну ввести шлях" #: ulng.rsmsgmanualedithotdir msgid "Manualy edit hot path" msgstr "Вручну редагувати шлях" #: ulng.rsmsgmanualhotdirquery msgid "Enter name and path (format name=path):" msgstr "Введіть ім'я і шлях (формат ім'я=шлях):" #: ulng.rsmsgmasterpassword msgid "Master Password" msgstr "Суперпароль" #: ulng.rsmsgmasterpasswordenter msgid "Please enter the master password:" msgstr "Будь ласка, введіть суперпароль:" #: ulng.rsmsgnewfile msgid "New file" msgstr "Новий файл" #: ulng.rsmsgnextvolunpack msgid "Next volume will be unpacked" msgstr "Наступний том буде розпаковано" #: ulng.rsmsgnofiles msgid "No files" msgstr "Файли відсутні" #: ulng.rsmsgnofilesselected msgid "No files selected." msgstr "Немає виділених файлів." #: ulng.rsmsgnofreespacecont msgid "No enough free space on target drive, Continue?" msgstr "Недостатньо місця на отримувачі. Продовжити?" #: ulng.rsmsgnofreespaceretry msgid "No enough free space on target drive, Retry?" msgstr "Недостатньо місця на отримувачі. Повторити?" #: ulng.rsmsgnotdelete msgid "Can not delete file %s" msgstr "Не можу стерти файл %s" #: ulng.rsmsgnotimplemented msgid "Not implemented." msgstr "Не реалізовано" #: ulng.rsmsgpassword msgid "Password:" msgstr "Пароль:" #: ulng.rsmsgpassworddiff msgid "Passwords are different!" msgstr "Паролі відрізняються!" #: ulng.rsmsgpasswordenter msgid "Please enter the password:" msgstr "Будь-ласка, введіть пароль:" #: ulng.rsmsgpasswordfirewall msgid "Password (Firewall):" msgstr "Пароль (Фаєрвол):" #: ulng.rsmsgpasswordverify msgid "Please re-enter the password for verification:" msgstr "Будь ласка, ще раз введіть пароль для перевірки:" #: ulng.rsmsgpopuphotadd msgid "&Add %s" msgstr "&Додати %s" #: ulng.rsmsgpopuphotcnf msgctxt "ulng.rsmsgpopuphotcnf" msgid "&Configure" msgstr "&Налаштувати" #: ulng.rsmsgpopuphotdelete msgid "&Delete %s" msgstr "Видалити %s" #: ulng.rsmsgpresetalreadyexists msgid "Preset \"%s\" already exists. Overwrite?" msgstr "Шаблон \"%s\" вже існує. Перезаписати?" #: ulng.rsmsgrenfldr msgid "Rename/move %d selected files/directories?" msgstr "Перейменувати/перемістити %d вибраних файлів/каталогів?" #: ulng.rsmsgrensel msgid "Rename/move selected \"%s\"?" msgstr "Перейменувати/перемістити вибраний \"%s\"?" #: ulng.rsmsgrestartforapplychanges msgid "Please, restart Double Commander in order to apply changes" msgstr "Будь-ласка, перезапустіть Double Commander для того щоб зміни вступили в дію" #: ulng.rsmsgselectedinfo msgid "Selected: %s of %s, files: %d of %d, folders: %d of %d" msgstr "Виділено: %s з %s, фалів: %d з %d, папок: %d з %d" #: ulng.rsmsgselectonlychecksumfiles msgid "Please select only check sum files!" msgstr "Виберіть лише файли контрольних сум!" #: ulng.rsmsgsellocnextvol msgid "Please select location of next volume" msgstr "Вкажіть шлях до наступного тому" #: ulng.rsmsgsetvolumelabel msgid "Set volume label" msgstr "Встановити мітку диску" #: ulng.rsmsgtabrenamecaption msgid "Rename tab" msgstr "Перейменування вкладки" #: ulng.rsmsgtabrenameprompt msgid "New tab name:" msgstr "Нове ім’я вкладки" #: ulng.rsmsgtargetdir msgid "Target path:" msgstr "Шлях призначення:" #: ulng.rsmsgtitlenewentryhotdir msgid "New title for menu entry:" msgstr "Нова назва для пункту меню:" #: ulng.rsmsgtoomanyfilesselected msgid "Too many files selected." msgstr "Виділено надто багато файлів." #: ulng.rsmsgurl msgid "URL:" msgstr "URL:" #: ulng.rsmsgusername msgid "User name:" msgstr "Ім'я користувача:" #: ulng.rsmsgusernamefirewall msgid "User name (Firewall):" msgstr "Ім'я користувача (Фаєрвол):" #: ulng.rsmsgvolumelabel msgid "Volume label:" msgstr "Мітка диску:" #: ulng.rsmsgvolumesizeenter msgid "Please enter the volume size:" msgstr "Будь-ласка, введіть розмір тому:" #: ulng.rsmsgwipefldr msgid "Wipe %d selected files/directories?" msgstr "Стерти %d обраних файлів/каталогів?" #: ulng.rsmsgwipesel msgid "Wipe selected \"%s\"?" msgstr "Стерти обраний \"%s\"?" #: ulng.rsmulrenfilenamestylelist msgid "No change;UPPERCASE;lowercase;First char uppercase;First Char Of Every Word Uppercase;" msgstr "Без змін;ПРОПИСНІ;рядкові;З Прописної;Кожне Слово З Прописної;" #: ulng.rsoperaborted msgid "Aborted" msgstr "Перервано" #: ulng.rsopercalculatingchecksum msgid "Calculating check sum" msgstr "Розрахунок контрольної суми" #: ulng.rsopercalculatingchecksumin msgid "Calculating check sum in \"%s\"" msgstr "Розрахунок контрольної суми в \"%s\"" #: ulng.rsopercalculatingchecksumof msgid "Calculating check sum of \"%s\"" msgstr "Розрахунок контрольної суми \"%s\"" #: ulng.rsopercalculatingstatictics msgctxt "ulng.rsopercalculatingstatictics" msgid "Calculating" msgstr "Підрахунок" #: ulng.rsopercalculatingstatisticsin msgid "Calculating \"%s\"" msgstr "Розрахунок \"%s\"" #: ulng.rsopercombining msgid "Joining" msgstr "З’єднання" #: ulng.rsopercombiningfromto msgid "Joining files in \"%s\" to \"%s\"" msgstr "Додавання файлів in \"%s\" to \"%s\"" #: ulng.rsopercopying msgid "Copying" msgstr "Копіювання" #: ulng.rsopercopyingfromto msgid "Copying from \"%s\" to \"%s\"" msgstr "Копіювання з \"%s\" до \"%s\"" #: ulng.rsopercopyingsomethingto msgid "Copying \"%s\" to \"%s\"" msgstr "Копіювання \"%s\" до \"%s\"" #: ulng.rsopercreatingdirectory msgid "Creating directory" msgstr "Створення каталогу" #: ulng.rsopercreatingsomedirectory msgid "Creating directory \"%s\"" msgstr "Створення каталогу \"%s\"" #: ulng.rsoperdeleting msgctxt "ulng.rsoperdeleting" msgid "Deleting" msgstr "Видалення" #: ulng.rsoperdeletingin msgid "Deleting in \"%s\"" msgstr "Видалення в \"%s\"" #: ulng.rsoperdeletingsomething msgid "Deleting \"%s\"" msgstr "Видалення \"%s\"" #: ulng.rsoperexecuting msgid "Executing" msgstr "Розпакування" #: ulng.rsoperexecutingsomething msgid "Executing \"%s\"" msgstr "Виконання \"%s\"" #: ulng.rsoperextracting msgid "Extracting" msgstr "Розпакування" #: ulng.rsoperextractingfromto msgid "Extracting from \"%s\" to \"%s\"" msgstr "Видобування з \"%s\" до \"%s\"" #: ulng.rsoperfinished msgid "Finished" msgstr "Завершено" #: ulng.rsoperlisting msgid "Listing" msgstr "Створення списку" #: ulng.rsoperlistingin #, fuzzy msgid "Listing \"%s\"" msgstr "Складання списку \"%s\"" #: ulng.rsopermoving msgid "Moving" msgstr "Переміщення" #: ulng.rsopermovingfromto msgid "Moving from \"%s\" to \"%s\"" msgstr "Переміщення з \"%s\" до \"%s\"" #: ulng.rsopermovingsomethingto msgid "Moving \"%s\" to \"%s\"" msgstr "Переміщення \"%s\" до \"%s\"" #: ulng.rsopernotstarted msgid "Not started" msgstr "Не запущено" #: ulng.rsoperpacking msgid "Packing" msgstr "Упакування" #: ulng.rsoperpackingfromto msgid "Packing from \"%s\" to \"%s\"" msgstr "Упакування з \"%s\" до \"%s\"" #: ulng.rsoperpackingsomethingto msgid "Packing \"%s\" to \"%s\"" msgstr "Упакування \"%s\" до \"%s\"" #: ulng.rsoperpaused msgid "Paused" msgstr "Призупинено" #: ulng.rsoperpausing msgid "Pausing" msgstr "Призупинення" #: ulng.rsoperqueued msgctxt "ulng.rsoperqueued" msgid "Queued" msgstr "У черзі" #: ulng.rsoperrunning msgid "Running" msgstr "Виконується" #: ulng.rsopersettingproperty msgid "Setting property" msgstr "Встановлення властивостей" #: ulng.rsopersettingpropertyin #, fuzzy msgid "Setting property in \"%s\"" msgstr "Встановлення прав в \"%s\"" #: ulng.rsopersettingpropertyof #, fuzzy msgid "Setting property of \"%s\"" msgstr "Встановлення прав \"%s\"" #: ulng.rsopersplitting msgid "Splitting" msgstr "Розрізання" #: ulng.rsopersplittingfromto msgid "Splitting \"%s\" to \"%s\"" msgstr "Розрізання \"%s\" до \"%s\"" #: ulng.rsoperstarting msgid "Starting" msgstr "Запускається" #: ulng.rsoperstopped msgid "Stopped" msgstr "Зупинено" #: ulng.rsoperstopping msgid "Stopping" msgstr "Зупиняється" #: ulng.rsopertesting msgid "Testing" msgstr "Тестування" #: ulng.rsopertestingin msgid "Testing in \"%s\"" msgstr "Тестування в \"%s\"" #: ulng.rsopertestingsomething msgid "Testing \"%s\"" msgstr "Тестування \"%s\"" #: ulng.rsoperverifyingchecksum msgid "Verifying check sum" msgstr "Перевірка контрольної суми" #: ulng.rsoperverifyingchecksumin msgid "Verifying check sum in \"%s\"" msgstr "Перевірка контрольної суми в \"%s\"" #: ulng.rsoperverifyingchecksumof msgid "Verifying check sum of \"%s\"" msgstr "Перевірка контрольної суми \"%s\"" #: ulng.rsoperwaitingforconnection msgid "Waiting for access to file source" msgstr "Очікування доступу до джерела" #: ulng.rsoperwaitingforfeedback msgid "Waiting for user response" msgstr "Очікування відповіді від користувача" #: ulng.rsoperwiping msgid "Wiping" msgstr "Стирання" #: ulng.rsoperwipingin msgid "Wiping in \"%s\"" msgstr "Стирання в \"%s\"" #: ulng.rsoperwipingsomething msgid "Wiping \"%s\"" msgstr "Стирання \"%s\"" #: ulng.rsoperworking msgid "Working" msgstr "Опрацювання" #: ulng.rsoptarchivedelete msgctxt "ulng.rsoptarchivedelete" msgid "Delete:" msgstr "Видалити:" #: ulng.rsoptarchiveextractwithoutpath msgid "Extract without path:" msgstr "Розпакувати без шляхів:" #: ulng.rsoptarchiveformmode msgid "Format parsing mode:" msgstr "Синтаксичний аналіз:" #: ulng.rsoptarchiveid msgctxt "ulng.rsoptarchiveid" msgid "ID:" msgstr "ID:" #: ulng.rsoptarchiveidpos msgctxt "ulng.rsoptarchiveidpos" msgid "ID Position:" msgstr "Позиція ID:" #: ulng.rsoptarchiveidseekrange msgctxt "ulng.rsoptarchiveidseekrange" msgid "ID Seek Range:" msgstr "Діапазон пошуку ID:" #: ulng.rsoptarchiveparam msgid "Parameter" msgstr "Параметр" #: ulng.rsoptarchivepasswordquery msgid "Password query string:" msgstr "Рядок запиту пароля:" #: ulng.rsoptarchiveselfextract msgctxt "ulng.rsoptarchiveselfextract" msgid "Create self extracting archive:" msgstr "Створити саморозпаковуваний архів:" #: ulng.rsoptarchivetest msgctxt "ulng.rsoptarchivetest" msgid "Test:" msgstr "Перевірити:" #: ulng.rsoptarchivetypename msgid "Archive type name:" msgstr "Тип архіву:" #: ulng.rsoptarchivevalue msgid "Value" msgstr "Значення" #: ulng.rsoptassocpluginwith msgid "Associate plugin \"%s\" with:" msgstr "Асоціювати плагін \"%s\" з:" #: ulng.rsoptautosizecolumn msgid "First;Last;" msgstr "Першої колонки;Останньої колонки;" #: ulng.rsoptdisable msgid "Disable" msgstr "Вимкнути" #: ulng.rsoptenable msgctxt "ulng.rsoptenable" msgid "Enable" msgstr "Увімкнути" #: ulng.rsoptenterext msgid "Enter extension" msgstr "Введіть розширення" #: ulng.rsoptexamplecursor msgid "Cursor" msgstr "Курсор" #: ulng.rsoptexamplemark msgid "Mark" msgstr "Відмітка" #: ulng.rsoptexamplemarkcursor msgid "Mark + Cursor" msgstr "Відмітка + Курсор" #: ulng.rsoptexampletext msgid "Text" msgstr "Текст" #: ulng.rsoptfileoperationsprogresskind msgid "separate window;minimized separate window;operations panel" msgstr "в окремому вікні; мінімізувати в окремому вікні; панель операції" #: ulng.rsoptfilesizeformat msgid "float;B;K;M;G" msgstr "Плаваючий;Б;KБ;MБ;ГБ" #: ulng.rsopthotkeysadddeleteshortcutlong msgid "Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting." msgstr "Буде зареєстровано гар.клавішу %s для cm_Delete , таким чином вона буде використана для реверсінгу налаштування." #: ulng.rsopthotkeysaddhotkey msgid "Add hotkey for %s" msgstr "Додати гар.кл. для %s" #: ulng.rsopthotkeysaddshortcutbutton msgid "Add shortcut" msgstr "Додати гар.клавішу" #: ulng.rsopthotkeyscannotsetshortcut msgid "Cannot set shortcut" msgstr "Не можливо встановити ярлик" #: ulng.rsopthotkeyschangeshortcut msgid "Change shortcut" msgstr "Змінити ярлик" #: ulng.rsopthotkeyscommand msgid "Command" msgstr "Команди" #: ulng.rsopthotkeysdeletetrashcanoverrides #, fuzzy msgid "Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?" msgstr "Ярлик %s для cm_Delete має параметр, який перекриває ці налаштування. Змінити цей параметр, щоб використовувати глобальні налаштування?" #: ulng.rsopthotkeysdeletetrashcanparameterexists #, fuzzy msgid "Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?" msgstr "Параметр ярлика %s для cm_Delete повинен бути змінений відповідно до контекстного %s. Змінити його?" #: ulng.rsopthotkeysdescription msgid "Description" msgstr "Опис" #: ulng.rsopthotkeysedithotkey msgid "Edit hotkey for %s" msgstr "Змінити гар.клавішу для %s" #: ulng.rsopthotkeysfixparameter msgid "Fix parameter" msgstr "Зафіксувати параметр" #: ulng.rsopthotkeyshotkey msgctxt "ulng.rsopthotkeyshotkey" msgid "Hotkey" msgstr "Гаряча клавіша" #: ulng.rsopthotkeyshotkeys msgid "Hotkeys" msgstr "Гарячі клавіші" #: ulng.rsopthotkeysnohotkey #, fuzzy msgid "" msgstr "" #: ulng.rsopthotkeysparameters msgctxt "ulng.rsopthotkeysparameters" msgid "Parameters" msgstr "Параметри" #: ulng.rsopthotkeyssetdeleteshortcut #, fuzzy msgid "Set shortcut to delete file" msgstr "Встановити ярлик для видалення файлу" #: ulng.rsopthotkeysshortcutfordeletealreadyassigned #, fuzzy msgid "For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?" msgstr "Для цього налаштування роботи з ярликом %s, ярлику %s повинен бути присвоєний cm_Delete, але це вже присвоєно для %s. Змінити це?" #: ulng.rsopthotkeysshortcutfordeleteissequence #, fuzzy msgid "Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work." msgstr "Ярлик %s для cm_Delete є ярликом послідовності для якого не може бути призначена гар.кл. з інв. Shift. Цей параметр не буде працювати." #: ulng.rsopthotkeysshortcutused msgid "Shortcut in use" msgstr "Гаряча клавіша вже використовується" #: ulng.rsopthotkeysshortcutusedtext1 #| msgid "Shortcut %s is already used for %s." msgid "Shortcut %s is already used." msgstr "Гаряча клавіша %s вже використовується для %s." #: ulng.rsopthotkeysshortcutusedtext2 msgid "Change it to %s?" msgstr "Змінити на %s?" #: ulng.rsopthotkeysusedby #| msgid "used by" msgid "used for %s in %s" msgstr "використовується для %s в %s" #: ulng.rsopthotkeysusedwithdifferentparams #, fuzzy msgid "used for this command but with different parameters" msgstr "використовувати для цієї команди, але з різними параметрами" #: ulng.rsoptionseditorarchivers msgctxt "ulng.rsoptionseditorarchivers" msgid "Archivers" msgstr "Архіватори" #: ulng.rsoptionseditorautorefresh msgctxt "ulng.rsoptionseditorautorefresh" msgid "Auto refresh" msgstr "Автооновлення" #: ulng.rsoptionseditorbehavior msgctxt "ulng.rsoptionseditorbehavior" msgid "Behaviors" msgstr "Поведінка" #: ulng.rsoptionseditorcolors msgctxt "ulng.rsoptionseditorcolors" msgid "Colors" msgstr "Кольори" #: ulng.rsoptionseditorcolumnsview msgctxt "ulng.rsoptionseditorcolumnsview" msgid "Columns" msgstr "Колонки" #: ulng.rsoptionseditorconfiguration msgctxt "ulng.rsoptionseditorconfiguration" msgid "Configuration" msgstr "Конфігурація" #: ulng.rsoptionseditorcustomcolumns msgid "Custom columns" msgstr "Набір колонок" #: ulng.rsoptionseditordraganddrop msgid "Drag & drop" msgstr "Перетягування" #: ulng.rsoptionseditordriveslistbutton msgid "Drives list button" msgstr "Кнопки дисків" #: ulng.rsoptionseditorfileoperations msgctxt "ulng.rsoptionseditorfileoperations" msgid "File operations" msgstr "Операції з файлами" #: ulng.rsoptionseditorfilepanels msgctxt "ulng.rsoptionseditorfilepanels" msgid "File panels" msgstr "Файлові панелі" #: ulng.rsoptionseditorfilesviews msgid "Files views" msgstr "Перегляд файлів" #: ulng.rsoptionseditorfiletypes msgctxt "ulng.rsoptionseditorfiletypes" msgid "File types" msgstr "Типи файлів" #: ulng.rsoptionseditorfoldertabs msgctxt "ulng.rsoptionseditorfoldertabs" msgid "Folder tabs" msgstr "Вкладки каталогів" #: ulng.rsoptionseditorfonts msgctxt "ulng.rsoptionseditorfonts" msgid "Fonts" msgstr "Шрифти" #: ulng.rsoptionseditorhighlighters msgid "Highlighters" msgstr "Підсвітка" #: ulng.rsoptionseditorhotkeys msgctxt "ulng.rsoptionseditorhotkeys" msgid "Hot keys" msgstr "Гарячі клавіші" #: ulng.rsoptionseditoricons msgctxt "ulng.rsoptionseditoricons" msgid "Icons" msgstr "Іконки" #: ulng.rsoptionseditorignorelist msgctxt "ulng.rsoptionseditorignorelist" msgid "Ignore list" msgstr "Чорний список" #: ulng.rsoptionseditorkeyboard msgid "Keys" msgstr "Клавіатура" #: ulng.rsoptionseditorlanguage msgctxt "ulng.rsoptionseditorlanguage" msgid "Language" msgstr "Мова" #: ulng.rsoptionseditorlayout msgctxt "ulng.rsoptionseditorlayout" msgid "Layout" msgstr "Вигляд вікна" #: ulng.rsoptionseditorlog msgctxt "ulng.rsoptionseditorlog" msgid "Log" msgstr "Звіт" #: ulng.rsoptionseditormiscellaneous msgctxt "ulng.rsoptionseditormiscellaneous" msgid "Miscellaneous" msgstr "Різне" #: ulng.rsoptionseditormouse msgid "Mouse" msgstr "Миша" #: ulng.rsoptionseditorplugins msgctxt "ulng.rsoptionseditorplugins" msgid "Plugins" msgstr "Плагіни" #: ulng.rsoptionseditorquicksearch msgctxt "ulng.rsoptionseditorquicksearch" msgid "Quick search/filter" msgstr "Швидкий пошук/фільтр" #: ulng.rsoptionseditorterminal msgctxt "ulng.rsoptionseditorterminal" msgid "Terminal" msgstr "Термінал" #: ulng.rsoptionseditortoolbar msgid "Toolbar" msgstr "Панель інструментів" #: ulng.rsoptionseditortools msgctxt "ulng.rsoptionseditortools" msgid "Tools" msgstr "Інструменти" #: ulng.rsoptionseditortooltips msgctxt "ulng.rsoptionseditortooltips" msgid "Tooltips" msgstr "Підказки" #: ulng.rsoptletters msgid "None;Command Line;Quick Search;Quick Filter" msgstr "Немає;Командний рядок;Швидкий пошук;Швидкий фільтр" #: ulng.rsoptmouseselectionbutton msgid "Left button;Right button;" msgstr "Ліва кнопка;Права кнопка;" #: ulng.rsoptnewfilesposition msgid "at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list" msgstr "з початку списку файлів; після каталогів (якщо каталоги сортуються перед файлами); за сортуванням; в кінці списку файлів" #: ulng.rsoptpluginalreadyassigned msgid "Plugin %s is already assigned for the following extensions:" msgstr "Плагін %s вже призначено для наступних розширень:" #: ulng.rsoptpluginsactive msgctxt "ulng.rsoptpluginsactive" msgid "Active" msgstr "Активний" #: ulng.rsoptpluginsfilename msgctxt "ulng.rsoptpluginsfilename" msgid "File name" msgstr "Ім'я файлу" #: ulng.rsoptpluginsname msgctxt "ulng.rsoptpluginsname" msgid "Name" msgstr "Ім'я" #: ulng.rsoptpluginsregisteredfor msgctxt "ulng.rsoptpluginsregisteredfor" msgid "Registered for" msgstr "Асоціації з" #: ulng.rsoptsearchcase msgid "&Sensitive;&Insensitive" msgstr "&Чутливий;&Не чутливий" #: ulng.rsoptsearchitems msgid "&Files;Di&rectories;Files a&nd Directories" msgstr "&Файли;&Каталоги;Файли &і каталоги" #: ulng.rsoptsearchopt msgid "&Hide filter panel when not focused" msgstr "&Приховати панель фільтру якщо не у фокусі" #: ulng.rsoptsortcasesens msgid "not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)" msgstr "не чутливі до регістру; залежно від налаштувань локалі (aAbBcC); спочатку верхній а потім нижній регістр (ABCabc)" #: ulng.rsoptsortfoldermode msgid "sort by name and show first;sort like files and show first;sort like files" msgstr "сортувати по імені і показувати першими; сортувати як файли і показувати першими; сортувати як файли" #: ulng.rsoptsortmethod msgid "Alphabetical, considering accents;Natural sorting: alphabetical and numbers" msgstr "За абеткою, з урахуванням наголосів; Природне сортування: по алфавіту і цифрах" #: ulng.rsopttabsposition msgid "Top;Bottom;" msgstr "Зверху;Знизу" #: ulng.rsopttoolbarbuttontype #, fuzzy #| msgid "Separator;Internal command;External command;Menu" msgid "S&eparator;Inte&rnal command;E&xternal command;Men&u" msgstr "Роздільник;Внутрішні команди;Зовнішні команди;Меню" #: ulng.rsoptupdatedfilesposition #, fuzzy msgid "don't change position;use the same setting as for new files;to sorted position" msgstr "не змінювати положення; використовувати ті ж налаштування, як для нових файлів; сортувати по позиції" #: ulng.rspropscontains msgid "Files: %d, folders: %d" msgstr "Файлів: %d, папок: %d" #: ulng.rspropserrchmod msgid "Can not change access rights for \"%s\"" msgstr "Не можу змінити права доступу для \"%s\"" #: ulng.rspropserrchown msgid "Can not change owner for \"%s\"" msgstr "Не можу змінити власника для \"%s\"" #: ulng.rspropsfile msgctxt "ulng.rspropsfile" msgid "File" msgstr "Файл" #: ulng.rspropsfolder msgctxt "ulng.rspropsfolder" msgid "Directory" msgstr "Каталог" #: ulng.rspropsnmdpipe msgid "Named pipe" msgstr "Іменований канал" #: ulng.rspropsno msgid "No" msgstr "Ні" #: ulng.rspropssocket msgid "Socket" msgstr "Сокет" #: ulng.rspropsspblkdev msgid "Special block device" msgstr "Особливий блочний пристрій" #: ulng.rspropsspchrdev msgid "Special character device" msgstr "Особливий символьний пристрій" #: ulng.rspropssymlink msgid "Symbolic link" msgstr "Символьне посилання" #: ulng.rspropsunknowntype msgid "Unknown type" msgstr "Невідомий тип" #: ulng.rspropsyes msgid "Yes (%s)" msgstr "Так (%s)" #: ulng.rssearchresult msgid "Search result" msgstr "Результати пошуку" #: ulng.rssearchtemplateunnamed #, fuzzy msgid "" msgstr "<безіменний шаблон>" #: ulng.rsselectdir msgid "Select a directory" msgstr "Виберіть каталог" #: ulng.rsshowhelpfor #| msgid "Show help for %s" msgid "&Show help for %s" msgstr "Пока&зати довідку для %s" #: ulng.rssizeunitbytes msgid "Bytes" msgstr "Байти" #: ulng.rssizeunitgbytes msgctxt "ulng.rssizeunitgbytes" msgid "Gigabytes" msgstr "Гігабайти" #: ulng.rssizeunitkbytes msgctxt "ulng.rssizeunitkbytes" msgid "Kilobytes" msgstr "Кілобайти" #: ulng.rssizeunitmbytes msgctxt "ulng.rssizeunitmbytes" msgid "Megabytes" msgstr "Мегабайти" #: ulng.rssizeunittbytes msgid "Terabytes" msgstr "Терабайти" #: ulng.rsspacemsg msgid "Files: %d, Dirs: %d, Size: %s (%s bytes)" msgstr "Файлів: %d, Каталогів: %d, Розмір: %s (%s байт)" #: ulng.rsspliterrdirectory msgid "Unable to create target directory!" msgstr "Не можу створити каталог призначення!" #: ulng.rsspliterrfilesize msgid "Incorrect file size format!" msgstr "Невірний формат розміру файла!" #: ulng.rsspliterrsplitfile msgid "Unable to split the file!" msgstr "Не можу розрізати файл!" #: ulng.rssplitmsgmanyparts msgid "The number of parts is more than 100! Continue?" msgstr "Кількість частин більше 100! Продовжити?" #: ulng.rssplitseldir msgid "Select directory:" msgstr "Виберіть каталог:" #: ulng.rssymerrcreate msgid "Error creating symlink." msgstr "Помилка створення симв. посилання." #: ulng.rssyndefaulttext msgctxt "ulng.rssyndefaulttext" msgid "Default text" msgstr "Типовий текст" #: ulng.rssynlangplaintext msgctxt "ulng.rssynlangplaintext" msgid "Plain text" msgstr "Простий текст" #: ulng.rstimeunitday msgctxt "ulng.rstimeunitday" msgid "Day(s)" msgstr "Днів" #: ulng.rstimeunithour msgid "Hour(s)" msgstr "Годин(а)" #: ulng.rstimeunitminute msgid "Minute(s)" msgstr "Хвилин(а)" #: ulng.rstimeunitmonth msgid "Month(s)" msgstr "Місяців" #: ulng.rstimeunitsecond msgid "Second(s)" msgstr "Секунд(а)" #: ulng.rstimeunitweek msgid "Week(s)" msgstr "Тижнів" #: ulng.rstimeunityear msgid "Year(s)" msgstr "Років" #: ulng.rstooldiffer msgctxt "ulng.rstooldiffer" msgid "Differ" msgstr "Порівнювач" #: ulng.rstooleditor msgctxt "ulng.rstooleditor" msgid "Editor" msgstr "Редактор" #: ulng.rstoolerroropeningdiffer msgid "Error opening differ" msgstr "Помилка відкриття порівнювача" #: ulng.rstoolerroropeningeditor msgid "Error opening editor" msgstr "Помилка відкриття редактора" #: ulng.rstoolerroropeningterminal msgid "Error opening terminal" msgstr "Помилка відкриття терміналу" #: ulng.rstoolerroropeningviewer msgid "Error opening viewer" msgstr "Помилка відкриття переглядача" #: ulng.rstoolterminal msgctxt "ulng.rstoolterminal" msgid "Terminal" msgstr "Термінал" #: ulng.rstoolviewer msgctxt "ulng.rstoolviewer" msgid "Viewer" msgstr "Переглядач" #: ulng.rsunhandledexceptionmessage msgid "Please report this error to the bug tracker with a description of what you were doing and the following file:%sPress %s to continue or %s to abort the program." msgstr "При помилці зверніться до розробників. У листі опишіть помилку, вкажіть при яких діях вона виникла і вкладіть цей файл:%s. Натисніть %s щоб продовжити чи %s щоб перервати роботу." #: ulng.rsvfsnetwork msgctxt "ulng.rsvfsnetwork" msgid "Network" msgstr "Мережа" #: ulng.rsviewabouttext msgid "Internal Viewer of Double Commander." msgstr "Внутрішній переглядач Double Commander." #: ulng.rsviewencoding msgctxt "ulng.rsviewencoding" msgid "Encoding" msgstr "Кодування" #: ulng.rsviewnotfound msgid "%s not found!" msgstr "%s не знайдено!" doublecmd-0.5.8/multiarc.ini0000644000175000017500000001161012154651644015036 0ustar alexxalexx[7Z] Extension=7z Description=7-Zip - www.7-zip.org ID=37 7A BC AF 27 1C IDPos=0 Archiver=7za Start=^------------------- End=^------------------- Format0=yyyy tt dd hh mm ss aaaaa zzzzzzzzzzzz pppppppppppp nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn List=%P -r0 l %AQA Extract=%P x -y {-p%W} {%S} %AQA @%LQU ExtractWithoutPath=%P e -y {-p%W} {%S} %AQA @%LQU Test=%P t -y {%S} %AQA @%LQU Delete=%P d -y {%S} %AQA @%LQU Add=%P a -mx -y {-p%W} {-v%V} {%S} %AQA @%LQU AddSelfExtract=%P a -mx -y -sfx {-p%W} {-v%V} {%S} %AQA @%LQU PasswordQuery=Enter password FormMode=8 Output=0 Enabled=0 Debug=0 [7Z (ro)] Archiver=7z Description=7-Zip - www.7-zip.org Extension=cab,z,taz,lzh,lha,iso,wim,swm,dmg,xar,hfs,ntfs,fat,vhd,mbr Start=^------------------- End=^------------------- Format0=yyyy tt dd hh mm ss aaaaa zzzzzzzzzzzz pppppppppppp nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn List=%P -r0 l %AQA Extract=%P x -y {-p%W} {%S} %AQA @%LQU ExtractWithoutPath=%P e -y {-p%W} {%S} %AQA @%LQU Test=%P t -y {%S} %AQA @%LQU PasswordQuery=Enter password FormMode=8 Enabled=0 Output=0 Debug=0 [ACE] Archiver=ace Description=ACE v2.0.4 Extension=ace Start=^Date End=^listed: Format0=dd.tt.yy hh:mm ppppppppppp zzzzzzzzz nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn List=%P v -y %AQA Extract=%P x -y {-p%W} {%S} %AQA @%LQA ExtractWithoutPath=%P e -y {-p%W} {%S} %AQA @%LQA Test=%P t -y %AQA Delete=%P d -y %AQA @%LQA Add=%P a -y {-p%W} {-v%V} {%S} %AQA @%LQA AddSelfExtract=%P a -y -sfx {-p%W} {-v%V} {%S} %AQA @%LQA Enabled=0 Output=0 Debug=0 [ARJ] Description=ARJ 3.15 by ARJ Software, Inc. Archiver=arj ID=60 EA IDPos=0 Extension=arj Start=^------------ End=^------------ Format0=* nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn Format1=???????????? zzzzzzzzzz pppppppppp yy-tt-dd hh:mm:ss aaaaaa Format2=? Format3=? List=%P v %AQA Extract=%P x -y {-g%W} {%S} %AQA !%LQA ExtractWithoutPath=%P e -y {-g%W} {%S} %AQA !%LQA Test=%P t -y {%S} %AQA Delete=%P d -y {%S} %AQA !%LQA Add=%P a -y {-g%W} {-v%V} {%S} %AQA !%LQA Enabled=0 Output=0 Debug=0 [RAR] Description=RAR 4.00 - http://www.rarlab.com Extension=rar Archiver=rar Start=^------------ End=^------------ Format0=?nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn Format1=zzzzzzzzzzzzzzzzzzzzzz pppppppp dd-tt-yy hh:mm aaaaaaa List=%P v %AQA Extract=%P x -y {-p%W} {%S} %AQA @%LQ ExtractWithoutPath=%P e -y {-p%W} {%S} %AQA @%LQ Test=%P t -y {%S} %AQA Delete=%P d -y {%S} %AQA @%LQ Add=%P a -y {-p%W} {-v%V} {%S} %AQA @%LQ AddSelfExtract=%P a -y -sfx {-p%W} {-v%V} {%S} %AQA @%LQ PasswordQuery=Enter password Enabled=0 Output=0 Debug=0 [RAR (5)] Archiver=rar Description=RAR 5.x - http://www.rarlab.com ID=52 61 72 21 IDPos= IDSeekRange= Extension=rar Start=^----------- End=^----------- Format0=aaaaaaaaaaa zzzzzzzzz dd-tt-yy hh:mm nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn List=%P l %AQA Extract=%P x -y {-p%W} {%S} %AQA @%LQA ExtractWithoutPath=%P e -y {-p%W} {%S} %AQA @%LQA Test=%P t -y {%S} %AQA Delete=%P d -y {%S} %AQA @%LQA Add=%P a -y {-p%W} {-v%V} {%S} %AQA @%LQA AddSelfExtract=%P a -y -sfx {-p%W} {-v%V} {%S} %AQA @%LQA PasswordQuery=Enter password FormMode=0 Enabled=0 Output=0 Debug=0 [TXZ] Archiver=tar Description=Compressed tar file (tar.xz) Extension=txz Format0=aaaaaaaaaa zzzzzzz yyyy-tt-dd hh:mm nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn List=%P -tv --xz -f %AQA Extract=%P -x --xz {%S} -f %AQA -T %LFQA --no-recursion Add=%P -c --xz {%S} -f %AQA -T %LQA --no-recursion Enabled=0 Output=0 Debug=0 doublecmd-0.5.8/doublecmd.png0000644000175000017500000000725411324050326015156 0ustar alexxalexxPNG  IHDR00WsRGBbKGD pHYs  tIME *3ⵆ,IDATh͚i]Wuk7v<; v&'@ @)@  JTPժZJm?Tb(B8RD(i;c;qMws^ι}vlBik#fо U9Kp.M"aq;A Ri ŗ\(p2 {Sv-+Wזk j[C ˡ8?+.C{OM'#Kkn:ykNKz "JfDq5'~tK/rf˒3uHfZllfQ[ojv:phypfj5?vz>8 E(\֚~?}~kS?PA%Ĝ`?ܛajh(m߯YbN9ofOs Ba`k3?N,ar=o̖Pӯ?o[װh'YgceF9^0^fˀ{Hqt>5h63614$=lak7 v{7%j Q/3$׍BI%*|{ +Ս[#R_Xy/χ[sD? chfMz-\{ncCMT/ "Y;N]r1DqG?MmM/(y/[? Q9꽷4R4: .&x?-]Lԗ_3S8UTܾ_ $$}9ب7>;{;R M#!$J[OafFCo=ZioZ] q jVTfh͑U*H=N7\u)>&&G8.2kF/?}y8}7tU-Y o̓ԅAPM!j@\ԜTM0z\@),/1]h0Y|2Z$Xe.~ Gm.d`ygH[-4]1*8'$c#dޯ\ej58U <^i @^9o S4* 4iLrqatEa0q /0@0<Y&&I 4IN5?GEqeX/ϐW%s!yT?}682U,K/pNJ*R..~ `I$M$J)2?h jx ^zBya!H 0_9R xњZ0<I.@x|A.@aYZf]`A\K$;W8'+@qf цMd*%""Hΐ @(N;Mf_M|A"LEPa94M u2xşy) h<6 ٙnm&,ڪq@rVхY ~i-bsԷ߄nQCξWP` H܆.H\fnyehJE \U<43QbV1 "1f 8 ,KJ'V\!SӹZ5D|Y]A}Bly-D7XUYqn%-#¸{k'A ~z;ԩ /:z>W ,ibY-Ly/Q?zԁ<J%;POL)|a@/@݊PߨAMH[Fg-DFTG!IԱ}!v%O=C3Q?\8YޏT $xҬA$-\Iŝ{rHTxlio ,~{ D#l|ೌݺSU@[.-@5Kq>#cc15}t*Yf y$A\Bf|hi ÇqN+r.\8RTЀ^Ywura>ξ|M7}>sԤff,y{ۇmkჵFFt;;=a`wY Esy<< la˶?rZy뺝no=lˉ/}2UQkQzj@enylgtF64,1c9Gɳ \1g0~o|LJ>r'ߗl,VVAff޴*#n7VЙJL|nE0RMGo]߲vm9TED;%F'F]\sS,q4%ih.W]mĊ㰋tb:=;$<48`TzMVk>i%ʶ;(\ZiʷUz RE ‚r@ZT9wn_ "tIENDB`doublecmd-0.5.8/build.bat0000644000175000017500000000340412045752321014277 0ustar alexxalexx@echo off rem the next two line must be changed before run on your computer set lazpath=D:\Alexx\Prog\FreePascal\Lazarus set PATH=%lazpath%;%PATH% rem You can execute this script with different parameters: rem components - compiling components needed for DC rem plugins - compiling all DC plugins rem all - compiling components, plugins and DC rem default - compiling DC only rem beta - compile in beta mode (using by default) if not "%OS_TARGET%" == "" ( set DC_ARCH=%DC_ARCH% --os=%OS_TARGET% ) if not "%CPU_TARGET%" == "" ( set DC_ARCH=%DC_ARCH% --cpu=%CPU_TARGET% ) if "%1"=="components" ( call :components ) else ( if "%1"=="plugins" ( call :plugins ) else ( if "%1"=="beta" ( call :beta ) else ( if "%1"=="default" ( call :default ) else ( if "%1"=="nightly" ( call :nightly ) else ( if "%1"=="all" ( call :all ) else ( if "%1"=="" ( call :beta ) else ( echo ERROR: Mode not defined: %1 echo Available modes: components, plugins, default, nightly, all, beta ))))))) pause GOTO:EOF :components call components\build.bat GOTO:EOF :plugins call plugins\build.bat GOTO:EOF :beta call :components call :plugins rem Build Double Commander call :replace_old lazbuild src\doublecmd.lpi --bm=beta %DC_ARCH% rem Build Dwarf LineInfo Extractor lazbuild tools\extractdwrflnfo.lpi rem Extract debug line info tools\extractdwrflnfo doublecmd.dbg GOTO:EOF :all call :components call :plugins call :default GOTO:EOF :default call :replace_old lazbuild src\doublecmd.lpi %DC_ARCH% GOTO:EOF :nightly call :replace_old lazbuild src\doublecmd.lpi --bm=nightly %DC_ARCH% GOTO:EOF :replace_old del /Q doublecmd.exe.old ren doublecmd.exe doublecmd.exe.old GOTO:EOF doublecmd-0.5.8/pixmaps/0000755000175000017500000000000012257501472014174 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/0000755000175000017500000000000012257501472015605 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/index.theme0000644000175000017500000000257411362603361017744 0ustar alexxalexx[Icon Theme] Name=DCTheme Comment=Double Commander default theme Directories=8x8/emblems,16x16/actions,16x16/apps,16x16/devices,16x16/emblems,16x16/mimetypes,16x16/places,22x22/actions,22x22/apps,22x22/devices,22x22/emblems,22x22/mimetypes,22x22/places,32x32/actions,32x32/apps,32x32/devices,32x32/emblems,32x32/mimetypes,32x32/places [8x8/emblems] Size=8 Context=Emblems Type=Threshold [16x16/actions] Size=16 Context=Actions Type=Threshold [16x16/apps] Size=16 Context=Applications Type=Threshold [16x16/devices] Size=16 Context=Devices Type=Threshold [16x16/emblems] Size=16 Context=Emblems Type=Threshold [16x16/mimetypes] Size=16 Context=MimeTypes Type=Threshold [16x16/places] Size=16 Context=Places Type=Threshold [22x22/actions] Size=22 Context=Actions Type=Threshold [22x22/apps] Size=22 Context=Applications Type=Fixed [22x22/devices] Size=22 Context=Devices Type=Threshold [22x22/emblems] Size=22 Context=Emblems Type=Threshold [22x22/mimetypes] Size=22 Context=MimeTypes Type=Threshold [22x22/places] Size=22 Context=Places Type=Threshold [32x32/actions] Size=32 Context=Actions Type=Threshold [32x32/apps] Size=32 Context=Applications Type=Threshold [32x32/devices] Size=32 Context=Devices Type=Threshold [32x32/emblems] Size=32 Context=Emblems Type=Threshold [32x32/mimetypes] Size=32 Context=MimeTypes Type=Threshold [32x32/places] Size=32 Context=Places Type=Threshold doublecmd-0.5.8/pixmaps/dctheme/8x8/0000755000175000017500000000000012257501472016234 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/8x8/emblems/0000755000175000017500000000000012257501472017660 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/8x8/emblems/emblem-symbolic-link.png0000644000175000017500000000046011312762055024376 0ustar alexxalexxPNG  IHDRsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT1 `@f ^pfíQ $5B h}m[ 7gכ^<8mx$[j:Mx:7(Ԣ(=iHy~ "Lmј,K" P׆`X1eY!"iEmmuo bBIENDB`doublecmd-0.5.8/pixmaps/dctheme/8x8/emblems/emblem-unreadable.png0000644000175000017500000000050411362134553023724 0ustar alexxalexxPNG  IHDRsBIT|dIDAT?Haww_wD'bAPKKm5HVnH{. AE[k JkJ; G5L6[ЕRoF+ O*Г=fLlSLJ<:mz 6^X7AzA2%J9Wi㕯P0wMν8LiF"‚_-vry>ޢyǝ2Е AӦv0. !}~?M?~ŝIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/0000755000175000017500000000000012257501472016366 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/32x32/mimetypes/0000755000175000017500000000000012257501472020402 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/32x32/mimetypes/application-x-shellscript.png0000644000175000017500000000207511312762055026213 0ustar alexxalexxPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵWMOW=&dRMHhv5XcV P>ZO4R& ɢڐ a{Ff3J{{~~CN!S? ҀSBi??C)@9L%*?N@YVasX !E9#1K"5bvc (xUJRP{Bq"@WǏ199\EdrFn}d{‚fvR|jj Lpxx8L1uy\#c|k/~ p}4&zZ6Ȁ+WK899JB$ w9 Q86ӹc`qm[rW *h4p̾7oc>˨=qnPf#Q> h<(sدSgRW˗~9\'D㽽=0~@;ݝ5?.Bxe_C? ^w]_ؑ@dg]@ +OO6 FqgW@mǯ ߗwS{aTĄ|lszȃA ~B7j? P0wapZa||VJemnn-4x#.ȍr[r~{/k fff/T8(}BZ .-*Iۿ]`&¢QȧEWҮXdYسlPB𽈯h:T$)GInC/J;VP1٩T*/D| Ni aGXnK.&L?<3 IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/mimetypes/text-html.png0000644000175000017500000000313111312762055023031 0ustar alexxalexxPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵkh\e:sf2IӤmbozAQA]ĭ(ayaaYve?A ^H\ɌML&g̜{|9=$xxρw{="PET~RS$/z!U:6$BIֽǯ#O di,n<P|Kχ[V["Xg๳!GvxSQB` 8-pRl*Wy\k䳂]RxW)'7)Mʖ`bq"^c{"ʖ9$5LSpzm}*}~wqqVx؄ڼMt N0(^rhHPq\0XF4r\-{ # w.oxF!)蚆ihdPA_ gꊅ-TmO'nWL9!1ضB@kD.kCKq jԠ+\DNDQ>U:RͶZPg s5Ci9& JD c|ri֗143ߘ ^ǵpZʔ &JCdi9^[=Ϣ\}&ե5i*&-7C ÀO) @E03LYp O@罯gtS5JJW)j:cslc8g[cn  oOaejr nk.O>pbͣVD[ph֨^s(| FնazVVf!(>L}۷Šs H>0O:KdiwQi8UU;2>Až'" ǰE|&[`a%`ZϓfFLmPoyv?KV+@Ғ/~~ OTxrC-fm1!EܮR5'N%_ @OfI^-x`e?,Ѫ'Oqҭy)0xjAP+A$qAgfvv6^k333KLHF0R@rR_ ^ť˧O~ܶ -`wzt+ԩS]o&i-G0p+q%iӂ>9qGSSS_?~i`$y4ax`S=B`-Fb|75IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/mimetypes/package-x-generic.png0000644000175000017500000000212011323355446024356 0ustar alexxalexxPNG  IHDR szzsRGBbKGD pHYs  tIME **/IDATX=$Uӽ;lh`OHG*&e11aRwDFЊ  ;=[UM~s={ms=Ћ7]TΟysBuB,u b6vn cw?:334 `{'wns gwN1łvu sW_`{9p=;0w;xbrXeyOwnuV8p'@B ȝdXжm9^z|O_ xOPzV(?{pnώR/1#ߺ3x\(! yzFi.i &MCɩQ0OҜt~ xφ\.iȆ x"JYEtlXaWRL^A(M e?)Eθ@zA+:hq 2jh>I)9E| %Gs9+dgpD6yL`IS.x;;/q?.-~8gwJE9O6KM3b Yo> wZ$IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/mimetypes/text-x-pascal.png0000644000175000017500000000317411312762055023604 0ustar alexxalexxPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵW[O\U]̅aJiSZS XS륱iҾ*j7h&&5i4hME(DJ "rœ˸wd xۓ}f9{o}}Ea%A0X.'p *[UX Qֱv@F0 5Qu4rBHTQN#jlly9$!@&-ZY&#gbrM64 ڻ2+A4?fQLu]D"hll5jl>VOЃrcGGx%Xe'EW&P* ĔlQeTe$- >SnJQ<8B"3 x/ 66$DT2jz?"-8kXK\5si{|tdD+|> lg7 j^,Q@pJ^vuu$]][#)\/-ra=X&Umμ# eF)܋X^^FOOfgfH zP[[ KNܼy{E]]d࠼VUU%׫M&bJRHBBU]]M<{!^#}x]EjF+d*:8ri"yCŝyQ#h sa syu477jzƜ J۔ˏ? h;Nfܸ+bߑv-755 sdJFȀ5Q{Cc;0CR^ *TB{`]|!`;6{>C37)U }:98MLzE]3wg]´ $-`R)WVVXT4` |094jrڟ~ 'Yv#QX#s ]Y` K:DC[,"^4҇Ȧ#Ӹ2,/x6Tܵ\qmG0 Bj8S@ 2z1&'C%IgϾ`\=TJ^UXA"m+Bzݻwow9 V'}qbbp_m# 59Yg>lQK%@ ot_lKDJ(@TIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/mimetypes/x-office-document.png0000644000175000017500000000160611323355446024430 0ustar alexxalexxPNG  IHDR szzsBIT|d=IDATXAOG38&S;MQUUXȁߡsOЏ[.BBWNqMv;;9YϮg5JO}3~3cH>P<)%Q?aO} v<H7;;;q0 }u=_]} m(T*A`b"v AMh Yzfϳ)(A@V+HPh40*A{R y xrf !h4R0 P 666LOԐS퉦ۯ;av ]777IQο|Р^y)9: 㾭da312rrr2ǗO36Юfo6Ը`)b8NONN5z&>rTbe+++ |Wu||yXJS.IRB*hsU1i3 d}fek K8@_#eq>Vƨ@IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/mimetypes/application-x-executable.png0000644000175000017500000000321311323355446025777 0ustar alexxalexxPNG  IHDR szzsBIT|dBIDATXsTUǿwNҷ;ktHЀ hʒOS֤4> >X5%fE :AQB;[ol`!I{nbgVꜪ{|WuvtwjL%^ꋿ}$kg~^ CڇmǺN<:Ic缾X8FϸOvtwjC>;-(UD[vtwӅW^{E*+7iYzf§ǒض@[G8zi閧ůA C04߁]0[,< q7utŸ^K--Mvp^+ic 9oGCSےx@[G1p!iϞfD@,DK8dd[J-P<|!TC`|Ufw㘻s[wBH(tRb>~#;>6'g {q%Q9(PaNDvs nv}~h?} L=QpFc&EgGܜ3p{;&IAETp~Awm b4++)pTanaT};@DXLʵƦJݚd dT7kH3طۅ\}}ShO`] &xZGfbQbM Nܽ'®TC(ʃsBm7bmU$rՖC1P]iNDCa;a*VO^g[u$-2? PUPlq:B gm,f?]Noo*`FVk9?zp7dYC*$k()P_WՕiC1 Pf)mr:V_R`DÝS*(@9dQ@nG%"#ܪ08@Ot&P;2<t8jH*2aV Xp * WyxCDӳwdh趟żSPvRjuG"siQ{zӪ9n ߖ@N"hwbɊ*rwXa.)*f"Ғ" ^Oozumtߗ3$@P@Oll<~% M EWR,ch8w{..KW9Fic:[k'bnki:MYٞK|/?~gkn<xN@2DAbf:+U*&rةamƧ'r=7B@QBNB dDd'E+hΛ_0@@-øf1/ s,n5~cHiCRY$h ekq]!nnOÍ1(n׏+?Fx~2M|"IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/mimetypes/text-x-log.png0000644000175000017500000000356511323355446023132 0ustar alexxalexxPNG  IHDR szzsRGBbKGD pHYs7\7\ǤtIME IDATXŗk\ޛ7#ɑSI#Np %R1!R!ݔ@LlM]l"hUpiJ1I#M$[H3޻t#Kcg77#;|;UED;tܹDQdC͐1,oŁM7ĉş1NZNJ"hϻ۫}t{'|򳥥w޻ҘA5 CƇ {A b~M3宱?Ν @c R:l}S'Hn)DG'O)"d>qB1^QT Jͽ"769TYnQ_xD sD9ӤjEUDvLMM177GIfH f/;FX]];SSDIf1UݕV##edX1չ0")Bt:Xc ENqx(.ɬ-Tu4'!dZdsss̰cǎ qt# 3VK)B18c4a:dY"hہ/P#0ā:X}'jA`] ZK##ƠZkQ0OBeȲl+Y8~=8" s<#$IRUHbWP.<}4z9,Xȑ9f@,R-:k-E*ưS>{ɓ'"jY~[[4rs" IG(=RSlvsB|W+>(q*ֹJ=[La{{ arr3>jqalTر;^v]:>Ev&&&HNWLsf񱲮TjX #gGL:rNY(KQ5HjʫW~Vَk-ZDּ̮V{CPU s( V~i:hYBo1q}ޔC1ަ^ :z{OQ9e9Bl[—j(BQ5ZnU~GE=z=iv}Q5L%`#w [c0"LL^nKEt])`(!Ib:$H5% "R~h w6)F=›WK.… ߼ީxr)zϿZyl6fcc>*y^]?ycLhZW^/7Ft:8s iRx)ScʡTș(l}۷o|e cl^n͛k |O?'xRyzi!cv^TB}yw^r /"[o?_tNLA*Fq1Z+u:/R왞nq\ׯ_iB7 AKQJhhK-VK[L~ə뙳/ˇImCA^}{7^Ź>xߝf-"xhpNNuNv.&Ja ϥ=8voLԫ\DH,lu~H'P $\{}|}^T*@9 iG_;[A) P:H.86D+@aZ=˩FV]]=#5]<ЭL:HJ-o{ 6"IeO^^* kn,LHro!K\6wt4A6qi6YAìy$7: mOP:BQ!TȌlɤnbi_FWI'e Betnz:sl:E/1t$pS#$Ą2"1KҿMvy]aH2Bq" "!?z}uiET֗9.c-Hy.0@kMP bAGuPG8gTKDi`L*vzsc,Ze<aL-9hFRp|qok-Au;C4[+k+9wf@)ŗ_;w/cZxժk̜319};9y0]]^x܅F ^r~AR\~pff~ ԁ -NK 7</?nײIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/mimetypes/audio-x-generic.png0000644000175000017500000000271511312762055024072 0ustar alexxalexxPNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTE opUX niy  #%&((+0%1 1225557&99:t6;-;>,?%@AAB'E5E3G(LAM:NO@O.P,QXBY:[[b(ffgBqQ|\}}}sȌש٫̮ܪ"P6n&tRNS  &(),/2:<<=@G,^IDATxmMkQǝivjqfn\TTޅ.uOƭp ؕbKVƴII'3̽k{8 R xe A1#2" L( 0!"@0+BVX'd&f"dDw1!v@&.vۏmR+1dL4{zxwSL|%מDiBߤKOHH'o')ߘͱq"d$%03t@h} ]B:@pr` Qo?$" pr㜿i}\í7V/HV.v~) xF$ʬ G?gZm?x*rI&X:uCHuX 7j*kςӊ X(}j\T*~AO|J6L,sDFuXKjӝb0=Zz/ "V$ya vA 4d4 aL~Q(;D:MC Y%0љ_-ӏ[A9IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/mimetypes/unknown.png0000644000175000017500000000210311323355446022604 0ustar alexxalexxPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵWKhQ=3TX"OVU\D0[,EV).ԅ•u).ݸVpB~3[65 3Ɍ&ϗq/#ys71|Ga5<, (',"x0N%P@D]qX'że!^W " Ժ -LSGj%7\+B %XΪKaTrz.Ts4 vejV(WNfP.6kh@$ 76>98 NlCf p֗ͦ;c 0D1۱*ϭ[-|s ZWd$Ʀ`Hi.-5⠖AbQRuZ% ʺ?س%dy'蜄Qbnn21Ι]!ϗض=@)"h znA}&gGdr Etw' WD@nֶ@_ZPޣVJ_i{{{n=ʟSv1gz<ɅbG鳪 IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/mimetypes/application-x-rpm.png0000644000175000017500000000306711312762055024457 0ustar alexxalexxPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxW[lUΜn[b)ZlU|@DH$%45B">hbPmPPnQFMBJt\ϙ vh*2! p(p!(#×(]3UMٖW}t$l,q,v"4 Plvz'>qE;u<ՕdA6ڦ][Y2x|6_u[b(roYcCFuzdL8v>^ LA#)ʉ SOWghP@rH2lہx!R1qP(,]U|oZfru17{1s kѼ\D<k$VﻅR5MG\T ?" +Kȍi |Qgbr 6&q3 3y苦?fSHP fD  㚚,@SLmcf)/=ut0{o򦅙Y ã&{°cIS0=[/ |u,5% 7Ef k/=%ƱdM(IVXY >pXu*l:$M]GP@ `L̠r"E| =a]Š Y"eDM[ Tt,[4C#6X2O*Q,ۊΝGuH.C7I$"pfl vP_lіe6ᅕKBt?NdY|(t啋Ey2K.C:Mv\ih_ӆIi3g7t]/#eb\܈D33Al`?zu]6:2*m)8 *'+h6<ʦ"S h<~iwׄƼk% H%GDE1I LnCL.&JB\mt_wNxYbq "(N[.l`YT>R\LxȽ ,& PN1z0 $X O(:G"%#vWpVCfqC AbA98dL&!קyA|x 0j-Gx D>EytIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/mimetypes/application-x-deb.png0000644000175000017500000000303711312762055024410 0ustar alexxalexxPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxWklTE>sna*B IDD1c"QGL#?R_jhLD?bL 5 "H HKҖ>g33ٲ ~{v͙sδDsftuuFP/Sh`F69mڴ݌8omk(1iG c9- , J)X)(5q\qέ;?yt6gy]=D29aB.{PLJ”,*\}P_Xp9(0k98" _E(׈߉i‚7_y]/\LPiiJh&5Pku^Wv.X-5z$NA ν,]Č<CHEo`#M22Ve847N5ww]pvj;fy̝ P9m q a[t2U5=+z=a55zq>͏O{;`FC =} 7F!oI7UQҹEs=>{X1xa,^%<~Tfm^!W@hAXy>|wwq68r';\Θ/ ذvI=|xcajXAD,R8|{pix ϵ8etѫ+wup>=NȪ́y^eEx^ kW-(WAbE[r>2Wq`~>@1.[L݂L_作p|FF&k$WFd]ڲ#δDD!#@:n٣W*?86ƭ(`MD䠀e?Cy0=W FkwP,i.:a$]r:D)EI"H%7g.˘ptR=X;i $ &9:Egdt_!TM=B pkCH+˪cBp-b m_Kt RIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/mimetypes/application-x-cd-image.png0000644000175000017500000000275311312762055025330 0ustar alexxalexxPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<hIDATxڵoG3{-N@KDQ_ZJ}C)-O:łn`lRVe 6޹kRE:@@e-.fe>x6Cy?'U)1F#r#ɩ O6OTPZM8~}2! "TbAv"%-U_9+> scWs 0S)Z۞E7 7>Ziwyh!bݝHzadMP(9yek§)UC6%)^=ajF7J0!ɑZ@ \@<@sm NǍ+@2Uڻf$F8Ή^B_E1?awlLH]Qr=6Y"jrvLl.YujQ_q1 +[䮝+g.L&pyR%GuDhl."x&Zs ڃr5S܅qn>HuӘd@LӮ"2&OX+bS>yNꉅ35i<ͤ~C`־'sQ=@ɦl;20NwQr&v H@Sȯc @.!M:zg?@ qFzd#&18(g6qd:y)zŗ,gj6ښ{SnlluE! MGϬ;Rč!ulq]$ fZWVVݻCz  E8.p"ժΝ; ~:'H1R[n} ,ɾ > { ?es_T>a~9∁k!O(P6FY^HܜeDRIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/mimetypes/x-office-spreadsheet.png0000644000175000017500000000233211323355446025116 0ustar alexxalexxPNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTE װබݸ߸ǿ̿@(tRNS $'(+/189::;<>?F;IDATxmjQg۴VbŢdЛR R}ק|;K[?\%Ij4Ls&$3H7X q$qh@J5I(>R)_|@(`i)?w]-<ZSK+1X`Vc?eJ{/ی3`]Y*$/+d *և eFonSC+6d^6Y-`?$y*QT 8'.9æX*XTH} TqK, b9&3`flRI x E!u"m * 2wum( %@ I<2*(0~f{c7ƀ:$^MFQpc 8lqRL PcPXA:iCc)Q8IlQ®t[ZKٶv睛ґ 79ooULӄIdqCqD%QA(Ѕ~Bll|M,E8?yb!χ`Q&Ps*rfC}'k_qd2&uu︺8ҽݥ ,cdd?׮&͈FK /@l9yAٹ9%DؿV,_5HĻ^|y MW@UU\ qe`43ǟX̡a3{tK 0 H1rt2|>;Nv3_:kGߵ#WÙ_Pl{ eyܮxrD>k[O fN}{ |Mfff!." Ys@,d^n@7tLt\ \@Of+L:CI2(=F0jUS191ڵ&W\GUU%n}I f-v;_݆ÇcҞ7Pg64䴞z/-0 R{EA~Pyy96nzL*f1>>)TZ $'ꢎ;;;4 UQPTU'qztb &50*dFG1=5ɽko<,òeK`ydIAWMn'\R5j+e5'x~%FjH~`ͺud0:6MU 7pIa_u.fа@!+Ƚ)j wx?a rt{H]s1~9IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/mimetypes/text-x-generic.png0000644000175000017500000000356511312762055023761 0ustar alexxalexxPNG  IHDR szzsRGBbKGD pHYs7\7\ǤtIMEOIDATXŗk\ޛ7#ɑSI#Np %R1!R!ݔ@LlM]l"hUpiJ1I#M$[H3޻t#Kcg77#;|;UED;tܹDQdC͐1,oŁM7ĉş1NZNJ"hϻ۫}t{'|򳥥w޻ҘA5 CƇ {A b~M3宱?Ν @c R:l}S'Hn)DG'O)"d>qB1^QT Jͽ"769TYnQ_xD sD9ӤjEUDvLMM177GIfH f/;FX]];SSDIf1UݕV##edX1չ0")Bt:Xc ENqx(.ɬ-Tu4'!dZdsss̰cǎ qt# 3VK)B18c4a:dY"hہ/P#0ā:X}'jA`] ZK##ƠZkQ0OBeȲl+Y8~=8" s<#$IRUHbWP.<}4z9,Xȑ9f@,R-:k-E*ưS>{ɓ'"jY~[[4rs" IG(=RSlvsB|W+>(q*ֹJ=[La{{ arr3>jqalTر;^v]:>Ev&&&HNWLsf񱲮TjX #gGL:rNY(KQ5HjʫW~Vَk-ZDּ̮V{CPU s( V~i:hYBo1q}ޔC1ަ^ :z{OQ9e9Bl[—j(BQ5ZnU~GE=z=iv}Q5L%`#w [c0"LL^nKEt])`(!Ib:$H5% "R~h w6)F=›WK.… ߼ީxr)zϿZyl6fcc>*y^]?ycLhZW^/7Ft:8s iRx)ScʡTș(l}۷o|e cl^n͛k |O?'xRyzi!cv^TB}yw^r /"[o?_tNLA*Fq1Z+u:/R왞nq\ׯ_iBݶS۷؈77·s't]s@N@%or}r7<ĝ$~_fFM3G.iRx XMN*J́mJ~& Ey}s`:ٽ?…Ȝ8\< õJ͛Q~M߽͛ ]g,>#m{^f:*u+41κrK"J+\먔JjBe^skh ^^ sP?|Hk@M pb%o6 ֚08 bX%_rc*VO>kI|9` LD8[7 3qr,,*"PP윭jb-/3>3&{MډłĪ(Egw> G$eȎfTDd:xBRaHzV YM&Rne ʛ E|_}3.1], lu%|Q~! M(R8Jd)&wxtSf|޾Af,"mʕTP4~+ȷ3@\B _ JA4N7Q2Z\o`\YqהƈԗwG4͈,Xm҇hjiA#K*),ttxA;hiAd+spz+̎ ]W7m^0Fey fju(h߼gptˇj%[8#1E)35}*1H[ERJ 0e "H(8/Yފ9%N|n8>t?_}sixK$I6t: Jc& C4 a:YE˘_KׯѸzfiJK4>y۶)8MU%K-!D$=O,LJvP;6 k}߳ 큻J]/]x+J9tvs'rkQ0[VEv"E |_?կIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/0000755000175000017500000000000012257501472020026 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_filespliter.png0000644000175000017500000000254312110457565023542 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME,,g^IDATXŗKlU=:ӖP5ãmT6&Q4Yh  D]U a3 F" Æ )}B3~Lt:Nܻs `4c#o_K*MHhR$~j`ޗi@7sEA J188H:h4SvHXB a08;b1|G)5Zk-˂c9%P6aJH&7xR/[}I&cXٜyyWz~QR}=[X{W,jVoN~ W .^ׇ-+w0wٱޞ qg46@6go88y"Hv:^%Bߋ lb[[0F2y 5Jq,GPhFFFBnVLO7&4X V¶uJYw" -@kΝ;m]E1fln!H$vm#W^EursdM/fvu` aq7,Yӊl{Β 08Ww7o`uP3ckB3N<~?z׼NSqg bҪB)O6JZ, .zyA %8'Nf҆cs]xPz\xn" d&a-VԬr8C|BmVD@Q-(T-֠Tfw\)֨.lgdAZ303fBHYԕR3I8}&FbO4e^}=r&סBJ*:'q}łf|ߧJ= D"75Q}(d4v5faNlXLXZ:8FfkgU(G&qG;wѪJ<-q"r<RF8B )8wGhhh܃D>0хjXL*<˫z( D"RehN RJArA΅TD*?+Ԕ&o8(ǧU@ A?k< ,IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_copynamestoclip.png0000644000175000017500000000260012110457565024423 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME  P> IDATXý_UUk3H2|kʤ|;EACEDFC)3љBB (S1Rʨ3ӝ{9{Ν\g 7,:#_Asss1QU[!5޹ æM{(gkVk4r'},Ի48"X[Ŏ]NÉ1(~5j.3Q{AbVd ;耳]s48fˈ PAж9T`sQu9e1*w3~ ǣb9gE_90W b'04ﶬE bZ}GW[p>IƤ"zaEI<|0mK)b|1(pn4ʣa/?tgMY$Ok%"g }Ujy^ŧ +"Yolc‹6֞P-=}KoLI- (涶vɨ0ʁ3۽2[ye388VZc25˟Vsfrj%&Zȹ.l޹UOVޚXAx!.cHQHo?Z36̾鉳L 8-UY:Ԏ&V%Vŕ3G0k"\ (,cdd*HQaԈ 鎠!#e@} A^.+@0C}(ʗ0uH :y6a25`>pu Sf UAeZ|/Ug|h&.\# ^2P ?dXnK{ĀI. 4L߲O[H׿PfIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/go-next.png0000644000175000017500000000230311416270327022111 0ustar alexxalexxPNG  IHDR szzsBIT|dzIDATXhUe?{qd3S ~.(*- C2#( B7#  D#,ei6r*͙S7ڶ{~yw_{=y}mhEQl=wu$O{b{% Zh-r凯}kǓ0nzloZR0p1'p˄JS.Ggjofe,(g0Z$8G*9b|rF [^Z=OAmti}wh,S.hdOdLl$=A-ݺ5 ,^e9H$BfJa &;k4SF?HyMi=I̯ؽS3> ).B,m (Z:NӞ:*glU_.=L3W]|Zx( d#;Nr7YqwsFmYh@"VatxhKJIsh;%m%S||VKkÒ6h Fq< gR?c FC=NGI.Ffw;2 l#"UDftӔ>qXrԮ0?rsIBB-0-g! vkK>ru"OW|1D^ 򡬢=pdA4.|,cҾdA}!/wtlɡx-H@ERF677-߳Z}ETA)ɊXIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_comparedirectories.png0000644000175000017500000000205612110457565025102 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIMEtRIDATXMh\U~t%)M +[I,ZlP\"Bk*XXmˆ&&XU.L>y{K&SUq{ɡ9]ǀL1DsЩQkǑ/! AVL1+Ql3@D~%~%RVg=;xFr8@M')qiɞF9#d+L |Vh c}2$&D#D?X^`:6(@@C`|Zyx@5}g9ZWHW)uB [Jw cD?#䶿GIa&`~}|qT I?/]B\ P!x MAyT&/JŚ^]sC8 /c[~lDH/j Lώci:c4cǛgm! л35wc;;H91n1<zcŐ[:&NU@zD`_wt渤_9xf]`U Kl{y>:5IM5)84m" rs71du+}U1~́mo, Fg!h35` ,?_q< x]] `fϣqx2b ɸ!ĥ.(} BC*[gJ*Ӥ \Mms2] 5z$ITw銷σ'j=ύd2,c T%tBg9ӒOj43!c;XсVt%==k ܴ봅;)bn4w=)_*6̼}W~[ -+3-rJ= .?_)vMf&Sl_rg>#0 .lU6LLtb&uk8--NCZ`ĚX~[{SnC:Ѹ=1g֝s "8 !-Xs״es쮉+PQk*]ʲ5'0idOGo#K{?t;JM?P^k/:c3U㿶ӝh5<?CقoNV\:<^1bkX,U-=k`^<&_=meunc ]_s_j:~n %+ }GJw4ڵ_VW/*:]N@U#QQcςg1J@E?{3 `(|~`%5ߐ N5!sHnax-]g\Xm[ۛgݶX玍5liY7hލ5;!1ؙ} $=m8 Q@*5PՁ ?\W~x0[f_p*tg TbAJ^7``PP{;#$䋑P+K_Ə$q\?GB;9wNah~ @ $FZaRKIh$Q:Eya&.] c)MalTfπ+PPoԆ1πg$sH>O m UIQ#:c  022i 4AzGj(VW_?T0R qP554Kgde2&l˂CD3CnPh'Ӵfg<9ioご|~IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_markunmarkall.png0000644000175000017500000000451512110457565024062 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME @IDATX՗yl\m33'$NP $4J P6!(-[@Dj+D %(kEP"E6P ^ƙcfLPP^鼑s=;߃t[*P}ߔՀr,MYxQv[8~']׻֗nZf?,ewz.nZҽiu߃u覫}G`dqTx?ϑ2Q}GF7]%um:f{* [p[pE+Y0U#ϩzނ?-rljVXܿQ/|d-6x/=09`ٞ#~)IB)+Ř/eFd,O@+nܞ5`@w"8$S>{}?ϖ|2HGE8.ٸ=wkW0r' Dn#|y(f 4m;B*5|5e[s/п4AkoD7; C=n$=Q_DjWZjWbA )$=絆||H&, 00J<T4UpG0A,Qd+0nV, ȏ# o,MaP "ov ``tM`dž"&bx]ܺݕ )<;/>-XG5/loAJUE~ qдXDڽrpsI WQ<3AFb&=G=~t3e"d}9[dU dr_K1@v3ccaL|lKx&ϐ`Nm{ѵAf˄YRyԪB _#U7 EsMAwWBy-mr`\RR lB}N/.t7{(b^+fA| +~a Vre-Ts3~j+]v<0_pNP@@:@1\re݃5U8A(Lj.* 0ȑjdaPRGO+9(,PA(]VvB,Dn.`, t5ɘ2Uu5~\Ht0w#͌EB怣܌x<߉"Pկ(G[KMɞx`gO%V{gwO[!r"TF0\uԟq!;*F/?SZPJlm3DtPk(b&7ɲ6˞LY|QU 8p klAus]똃`v S6|Օ8,cs/k*jN= i"4(f`>dQJ"pqVC8V3gh_)fUt(O?4P CѝYNJ5F$0{Z8i}t(B*# sDA1Gd|rd( BP+*)%v<„%pخf|QBQH nwqI #;f:o%ED@GKQ"$E'H58Ħ3 NO4b )H ŞJ]KK6֣h:BUо2EP5twƺc( 0ڎtǣf-ȷّj+pDuǣK|9tjvSC*BQQTUP5!:r >}1q~QY*8j׋K90穅Zz0{.`_}ѱv  |LNQ>>`M5KT}}IG ֮̓g^  mi wK@]1ϤlY7>$IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_multirename.png0000644000175000017500000000325412110457565023542 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<NIDATxڴW{PTUݻwwYDS)W"S VȠQSR4tiPrDCG+ h(ij1*YhCT @;gw}Lo}@:ZTT AX*͐`_&$9))&.>+&lZzۋ_697?T8o=!_+)_ok3 *pՁqG W,_+-Wg2&O (;Cvl].P 8OsZ46BYvb~Nt;D$o8!auL8o1p)2Da8 ~6FYCg% "y,ySG`op.C tgAg;w!<1c.;VENNs; /8z?Y^#z#d},ܮ'l6ϞF loEUe V_ w, ->#o(pG@H=m[݅>fFl!uh$~𨄸}ugmH;R@h0XgCbp 'IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_closetab.png0000644000175000017500000000221212110457565023005 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<,IDATxWklSe~n^fBt(Ÿ$&$ß !hA LDe~(D͠[.Y/zz._5&9}{g6rX` W;>TUQ~hZ$}Gh6Gж kQSP8VVzkC1=omj8c"8:6bPw`O7B㏑ظ…-x4Elen?GAWB.kc zF[sCEӑ@}dpIPr6$D落 lI^1r(~Zl"LYEy~>vI[ =qٕ5), \@~2CUqG'7gZ9Cَۛq(M iCQQx஗DK!`ZIΆu7 Ī]4aczGv}UxдN8*bSƜΒd8c՞gQ&|Ur:gx$Vag&x{sf1b~oo]]7`d<7:ڋmH| sx<#m()Fn QT?ކ@b$ iÆ=t3QCٚzZdI&sj"s>x}ulRb'v6l  RXwkijzW8O1M l ͛a]S=2lQ-`>Ch ](K=%c"S`Gz/]F=죽عvCU*)(tRP-};h3!$ZK^X* +1üp8R"`݇[/;3G$QQP&|wb1̅CήũTgd2o=$tQ{eIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/system-search.png0000644000175000017500000000424711323654424023331 0ustar alexxalexxPNG  IHDR szzsBIT|d^IDATX͖l[ǿNL֩ I[!-AMnLӤ`eBbRX Bۘ6uu"M)LMeWmc;Ѧ4ؑ޹Ws)HD"rԂÇ !_>AضmB{1CGumBP<σR 0d066QrRy#5#GB+ۡ*4MimAE(ۍR! !/b?8|pP 2 .'JvM+죫ܿ>e| Μ9˲ּKeuj5z g;/&J&oOڥ84P5]R]mk~s1<<ݍYĥJ]u_ZoEY8^9^vҪޣH%HWBT6C~EQ011+l``8%X'O~cOL&-JPUb|tx###f5M[0zf!":;;d`0b/ZD", ؊~3R~__O?-}GGSpT*I 2N:d2~ٳ'k׮=o>0P(`6<>S\p}]ןo[\oO*to7ND"ѳqF^EB@A}}=z{{qڵulVFXcǎڴiS]t:!mۆٹhq URttt@$W^|A---n{rxUe(ku]:ugϞ޷~J6E( B,Bjw/bsNStAg]]dI3~.{4X>mP4^Y-mv I;: 4$>.=ɶ^ۚC$h lǡ;@KBSXe =P8ž,=vUBg~D)P&N}Q9e>;bFr@#A&=SߚGc>EW.<Em?{):2>Xׁc;T*z еoɀG p]ms_/\T*^C.G;A}v]riYwԵ/iR.GU;R`X]|.@窓 2F%1'jpV~͔⯣q頋n &!8ujv&+LugfPq@YfMڿ%3's# w*K}/%yũNyCrnC~tN !vc(X!z䘌֬FrCA~+k?us3VтEH-防:}qb=3h"ݝFƆr"cD *"dM4<@Dk ) дAm"\"%ۑzr}z˃ހhssgϨ~pҫ&"4qjɩi477GBP$"Es w %ܻ{6-ѫ ]࠱zd@ v(( 7Ú(PrED@@A dpB> 82_^{ ?!m=B0znn1W9t]`jI>%ا@%la"\lےc/'qǑmKI{4fc\jmpal&Eׯ_DU 9F|&F@0j!Q g@ ? V;#jޗ '!JFt[䫃jll|q$?4eq`o⭦,-g#l*2~S"|d\RCW/s60(wPw0r lb P,: IG]`dLEuoiIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_checksumcalc.png0000644000175000017500000000245012110457565023642 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxW]L[u?0BtM֢04m/64~L>*qh`o&&BLtI1ւ Ϲ vxå9ϕa?ED"{ up= R)̩Z[r/2(I>dpFO8+(*3??wňHQ\k\UWW7)T.SJ?)ŒP(K^f߷n233hFGGA& "= O` (9333abbn6\<6+fxcSZZZ -R Lg3 #T3l*սJ.ލ -###?P!$Z>RݑZ-Z!ZuƏ;\[VT-fۆ\P_ڝپ')IF-,..Ғ`|WKՃ#K$^BuZd)n7 PPPfFd3fԿ| 0N6t>lRBԼcqKPz\. {bp@YYlۖvJhNMCC  Byy9h;  R/m6 ܵHORZRv0Lmp#PRG1W,+zs0n=ӭxO;/|u%, (v b^:1ENv#c/x?$҆.KKK  Xor҅jyVinn.TV?9؂|dc|Lpn61AFXb|s'fc0ƙ'rhG8P*@!WD~i@@0Sqhf|DŃjz@lzJSU-V< Jk6@g_XcZ 0-le,_IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_loadselectionfromclip.png0000644000175000017500000000443612110457565025604 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME pR IDATXík]U̙Kiv(1P 61^Hb41V!F _Jj X ` JۙvfڙNg\m9g U+Yzo}߻WMJYk x wч $@o[PJ d׮]Q0~mI/@kPMa(@}.D08:p.ᅔhĎ/oysd^R7:PA`u±>xua*=ŕwދH M 0?>*Uqc/<<,,ꍈ˘z7CC=Wor*^(;HVCT ֨0@6f͒^R]Cuf>l}Y|gmA{3eH3,4dj@S wHcppa}!L_~ ,Epg mOags5*-PA4xEOC8lǠW&e2ݫ`n{ <ʇw։ab)aV M#Õfj..4Q(7* PپO@I0H0PRrmDq`ZdSuהP=Fg%c@rJ(dئD3}$! }T1 8XsIdx`_(3Exsv9 mFŚ(hAGy$\˞J&gAէBkta1"T<6I(Qh8B 87#D28P! 0$HqrFH;ueףG^c}T&xg,KIҖv1Q T0i\U29HW>r&*n| IWUp ,o7P kF䒕Ǟg|gt8eҲF{ޡ-cI*eM|oV[@0|zzI2()WMyɮހzXF~e^Dd b9!"T,]L|$BH 3`Hug:6:*!3"igq*'P*D:5XK0a`qjP4AC5йn.R"$ ʂ؛h ;M eߏiz!јcA[JhjCt]cFğ ͠I:)7mc;NkpS]#dSՈ)Y,'A"w\K`RV'HN亍LO/”vIu>Eߩ[)|'LSȧ1l% DcId6jd:52Y=#d1d7+|{33 4sok#hIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_fileassoc.png0000644000175000017500000000412312110457565023164 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڜWpW{y HH)'f؎@vtc:"0REgZB,X[k X524RHHB# 4{ow߹/PmH`dw{w9u> J)`z~nKeuW\3.j"2~}펧vd|߇?}}Y'Pj<GpWaSMhPT;ɂPY0Y&LˆDpazʬu]448Z eVw((q>爘@ $Z"}g |+uN>3񞞼mM.Tp  Bqt~c(|^i02cKwtl9 ϲDai9BșYꑗ"{Fi(>q\+"i{3u 3eY@@ԫ IH dω^uUp$ =^/A˳"r{B5?W~La v1N(P>6n>EdK /?5/`b sXc"BV/:o/"H20(nQ<IJt FǛw<'Ó@.iTݍYJ/ M@¹n[%_A22ƮxQ VCwjACXOzzzC{7|eϏ{&CO*8`SMqyؿozS|E7L娭Y+W`w^ŷax'$cҥ,VX;8|3!=-bhmGnjv#؟_@ 7p[t[~?8΄ƆgV G¶T*\)-WC]YfژHalswq+kCFcS.QR7ƘJFBEsIaͬxmNeIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/view-sort-ascending.png0000644000175000017500000000100311323355446024417 0ustar alexxalexxPNG  IHDR szzsRGBbKGDC pHYs  tIME:IDATX햱K@SuqYŵKAtV&vХk,]\]NEPsRXLz!9@fOכ=gHE)y"}V3"25,5L xauH"7\HhIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_runterm.png0000644000175000017500000000170712110457565022715 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<iIDATxWMhAff7M[" iOGƃOYЃPQZPZ G{AEb)*Vlv&tcMDM^fۼZkl^;i4˹u+_1BJgo<{dsDfHUO_I_zKϘ tm ?~6|GEw]āH^} D$%RyVl27>e6Y̶0=?w?8ކG3ϜøvnM"5L  -u/E(3 U/rT7 xp<{ceN+6ظ1RH޹iI@Diuw+KA0}mƷʘc?y"H<߿5Jfٟus _؉hd&rI+y]<?|E аF8Y¶m3 Q9 u <#tt6) GzQ,XV׏SFg"(I@ vhX7oy I#NHBH@3:uigI/>':p7ˊRok|⦋`` PL4M!q#NRLޒvT&Y8<wAZ2* ׌i70i9o+@U%Bqx|(oP=^tAچ4٪cU MPɀ!j?ԖZtPh"YKijyXf㭉gkxֺ\γj갌﫜-|sѽK2%\" |O oښj"KL͡WC?|@BF^ڂyT/^Ocb2ʛz߇^=+ho/Zf9 :HJ(Ca\#8,%@ğrd70T@Ų ֎5TB( ^O*nEG(Eu7#!3\YePJ]C6fCm:`7 #@@B8Bs͆@) V#"Ob 'D .#ȏ yP:/UX`YĠ[ڕ0  Ѭf&3y+eL/GBnͣ9Tk]UNMw$fEQB=y12I3^gÃFgz+e6b#fsr ŞU>UhI?_֖bgu(i۲'5V xwa,_pH׿iʤGgHRE(3ҩUՃg2zZy;OQhM@Hq >ޯSVeu ONF,L+\7tO/.qTizUQ/nH6lKlLC8eXP @0: s]EOgE`D2N=@ku\0Jr׼r^% tȟ&iv`u`zr݉eJGRl!*F!]CپYS+X~Ti,M@yW~=04-<ޜ^6__YNl68SZ{_ObRh A Og8o l /՞@Ā7 ̊" Do}dzZ<<ƊK׉Ty0 pZP1p>`waDr g/B&"l vK  `@PtL0TE/B0RS: 7~?oOmIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_settaboptionpathlocked.png0000644000175000017500000000210712110457565025766 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME8#sIDATXOlTE?3onnwBST֪xJ x11jRI`<czу$ Bb`KPCK mvxm-dg~V%g>~pްrjޥttǛuW~L1{߾߿O66F2|gW_>٫ Ny^qkTtƞu1  b,j &&pי TRJb `l.8FmJƲ&jfc-! }g]*8_JSUڴhk ֘lj!1EWOӆ:>U.:,,y 8q^^<Ƶq|D I6%u$mţAk˺]K'εahLJgWh+䂢OtҲ/pEbGXhh@_oDwYeL:ˉLLZvwl6*BE8F2Զn%^aw *L<Z #Օheߡ^\G h˭YG/"Ly. M~6o.9HGH:C]ncD H `5q tt0 0nDZ{-˗ \5Zrdzg3p6>QWXK k 38t<80hQhe>%?(Xӎ>ĔfW`Sj=쫨50[ox %r*m!+$.|g% 20@^g6H`_ u"97|PA3v~.\ÇsV!qz~ #aXLN&pejBtwBDq- n C uP{N 6~FHvw1GR_A(("sߝ{ט<#H>ө~C8DTqҡ3#gHd;WBMzX LB E$z]P0e|q' ]ss8VJC$4qX^ %HƴKy XV4 @B+vHBJ|]<4A:ſ<(i) YMBGIN)+YHR"˜IEK/QED$$%/4H pfq%߳g.\5fb$'8T9 #q<ҙlaLuO“,m~w<9b9 HhJx{ ٟG8`WBU8D/BJAJxp{I!+UlY!0GʧG*,CFGTez-ݧ7 lk$Q >Thvf }5zwyWt~? wAO%qu1Xi4+`8c:{Za*Ns91 T{~?Y{gk1#-  2@g'+"!j%YdbZJVL<ϐuJ}0'O8L5yYwၻB@3 @?)* ZɊ2Oŀ/ 9p ȤRxPAcP9H߽/E qfTbH |$hZт1s>8Ԋfn .pjb*kZ敭ܔI2M\P_ŏ 8CГq`61$dRbN/@(K:'dRiP5DAԶSDG E9ͭ&)޵F@x~.BXja{A1ff2Yyz5_GZ1)hlldNI*\ՋOoCY MrdF"geWƇt AaP DiY&0Q ӢWPP bSC7eODkmGVETRiN${j}Mfeu@0q>e@䶙RYH_YVJd{|sEǵa GfYLEknΡߤ;1v8"CޮF}#NzzZCUsh_/z7R:%W9mBMe wtWM4D}hysG™aDB(o߉kR~ jRJ \Ͽ|SZCl1<"y`:!!z}l~VI@p?Yt8L{w8U?.r{.> Oݡ(IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_opendirinnewtab.png0000644000175000017500000000264212110457565024410 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME(ZL/IDATXklTE̜V mBRWn" QC K40Ma4Ack0AU niin38 Q9yߚl m~` ͱDdۜo=pӇrDn* q0" ,K tq~: &v$]mPb ~x+ $r zPA}sx_|ώ ZYW!d䂈BFDH&0?W^w>~lD4:hIaD]Ɨ.[=u"=8Rd+PK-k̴Qh_::㜬?C)=ݺliX BSlWmZ8;ԔH _3bLd2q`u!ch8 {2fg;4TƝe+O+9v\BV\`p(=}8m7h"PXګtXU$ z/h'*hr0馻bHr"OQhd* d6ZC7=8|=7k 5#4ۇݶIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_reverseorder.png0000644000175000017500000000071012110457565023721 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME$5;Q^UIDATX;Ka,ZXD H$[XX%?_ba)VE/`6ga^f0/ |{͹#ǿD hq%4gM>sl5k7:& Г5 qpp1@`SDdnd:qym^VEi8>(wV.•8%]` Ǭ#E-ً/ x\-HխIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_briefview.png0000644000175000017500000000177112110457565023204 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxW9oAfv-;AU!9(\HTH1@B(/Q! A PQA U" $ Dڱ #=}}oގ1s ww|!sI>у_Tܱ ֐"H{92Xv98H7s997jIŦHT<^8L7U2$O6W1M^X`կ4fDd06DJzhB'4ٶJNMAATA@& }:kHp\7VOP,< I+q}"~u!mmV{C+RFBV,?C* %WYcwx=>WRI“';^T+ q7/lZƖ B;ÂHIRsf 2 }߸&Gw;y_E8u\>u*] 8v_fWоu](KIWւF @V,XJl5:!5]xtCãTH zO[Wzo>S tWr$)gFJKRF\G-FP\҂L JW;Zg([ g([<_89; [s<=/FR S$@oV4~Fr‡ ; g?%JW%(S=4J9xpN]׈ʏOGm%sY -UO$ax}=pEgp#~oB3$_(RIrNƖUtf&sLQE,3VFX  Y{':OS/:__IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_nexttab.png0000644000175000017500000000177112110457565022667 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxW]HSa~smndPa aEXADuMMAFWQ%h%eY)TdTVhYm([gȟU{OsnHC}c||t݀TF!~;LFJe$dcŜR>AKTV1!Xd::mR%IcQ*tA JgCYVoF]9=<X ?,)Zml䖥V6r̰~]K$"gДwC R#2)շwD- ;QM7^c^n._$ Eے5tA7L/ W/nFKSsSauD}GB ߒwX="4;Y`e9#1[[EKם^|GfqqR$G[LZEZy-W yoZk̢)4qR9=P  G23a#mrťL(\4l ` {?-@KCF(IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_settaboptionpathresets.png0000644000175000017500000000332112110457565026031 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME^IDATX}pTswl$ D1H`A#Vvp1Sf[Ni(5 8chRJ "`[CiB@ Mv~q7]ʌu;ss?}>+R|Ɨ}+2~ XwR7pU" 3<2nARND!7JNne>.orzW ؁  xi$w k FkWDپ _ Q맥R4ߋ ('.H#cd q=bw86s1ǐacOj:ޯQ3s2hK}eMI (%0 im]|v۲DG[ L˽|\kWN L )h s] Ý~ݠOo3:z':}6. rɂrggC:aYN0$`fؽTIB@9Ri=E5n"#,n*$80@7H֡xѳhG?^SH!tBhwKkӴq,'vcFlVigϼ ƺQ#df_g/:k z?ʟ[aOm+@Pg<߹]z82[ؑ0mś8t?#}Lُ¾^>M;<`5U=,VH˶҈. |fdʓl3L%XͫP-8r 4 2fMg# iG! DFz]hi=PmE 4eB]RwW\֤7x8hh4/#S&,b_Zwb9[L[Mӑd}Yl[&8 W7-VP(e k6^{6"˂ǗcTז>V a 'ywc]Ď'勛׹`ą{Ag'R-BO]IԐ!+U`ŚR ;(-ZVlh}m iӮ0)ZkOnvԡ Tq6}Zܳ;9T\V .R?b|J_j'IKןgqtizLiX˅ ƕs1-P@~_t|5 |.פU>{8 ĂD8:x$j`"!^WXwK {/hUwBIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_search.png0000644000175000017500000000255612110457565022471 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڬW[oE>޵sBBx~4?LcZ _njoy B,?XQhq#a f~ï`Xtb8e!s:w=p>MBxpm!yEf&çrdVs\06:TY,MrG8phRc OJx˄'=X鹣jS;[c(TRI=S F/_a _Ciޯ4-{4 nRz{Teutv WU_2p #oȇ7H3keh aI QWR/*fֱRBPZP8 ~ͬE~co6 s Os&nM0qONNvHW_~q=~cBy 4<אY___߷ l B۷Oe($h>eXM ڪ:'@ۆz3=$If K{YoC5+1%t`G#Qv GG }kYo› jtӴ8hq]j z?|tdz+[@IZް2J5HvڣQڭ,7}in3Wz 9(雎fdѾ4 $|)IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_keyboard.png0000644000175000017500000000225512110457565023020 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<OIDATxW]lU>ݭbSR! ahHO D_J5'MlV5*M /$ ݔZԖ~.֍̙{sw2P1/M+X1PMVEzI1pG"Wvo?s_gl~퇠W<ա3N|uȯ `x`Gオ#!Ah<~@Ϟ~29sRo`(,+j)C!ɰ MX4V7>߲(a篶$ů۔m2;0@3G&'3+pen@z.E s=!QBalIfkU`(3 cSE:;DŽ~KՕkfZ/赐+aHkV/,ȁf[1rO2&ʥdRz`&:MG'-$vC *5l;s}Z4)MIaYE;~/sBPZk(/Ԛ{%ώѓ[kSGh0#?эuvP@D uz,(A7|nhnfO$lBFKilܼ~ >c*'{:n1KbĊ;K}q9A m\GzSs\^oݪi{}7QCU23˷cK6kzƃqפ * ts=XIʳT'tA69UICQ樓݆c"D3 >+Q޾Iv\W'OK@®6%:-mnYL{1w&%N]άfcv'Nx@6d%P2?>KTdx>qO}g_$=׾OA  qx8v*XfՁ< nhg&4:{>Gik##߰c6Hd-}5 QE\fH>rGؗ*? wKM&w(IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_exchange.png0000644000175000017500000000244612110457565023004 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME iTXtCommentCreated with GIMPd.eIDATXŗklU1;UB ؘ0*"G%b"`$@()0?(5$@yDWȳ-twnt89Q/O Yg[* )ḿu4nAb BHV9S<>bڳX~ ijqWTkyWFYBTFqt%BXƳ&eB{ӊQ,F@Tk҆eccZ蔁iU.Ӫ/ef)~"<!58rLz."e`-6ڈ9 %Հ AlYQZ(iQ=)':hw Rd*&)h1'ߋyt*.&?L}R]ĄKxo~k YIr_A 0jm(N%P.86\] rO$HOE<4V~g[f2ԀkCO*gE/h D%nO1 O@k n{LE6n6U#V:_a3** 5g[!҉EÃcM w,;;I׹IHZpo`ʲF~3Th[YE6@\ -$vǫ%yfֶX[J"K* bbHq9#(u,%]+߻~Њ+Žh%Ao ^~w+X0M_E󱭬ig}@"J(ʵı \8k߉CҝJS.ngӂb dYf$Q8[ۻr-=#L.~6n4Ao"қ7*óp~O e-4-Rߗ-yDgOÏߏe_K=ͩ8w^UK5r8,?>)<f79(Q^@ǼRɝTKb-%*"$m:JzGJ@ߙ$nzO= IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_horizontalfilepanels.png0000644000175000017500000000110412110457565025444 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxjPƿss;CGBpQp\h u }Bs*EZ's2dd\%7K 7bf@.Ers<򵗣~7 epd3j Jxgx{>#X1hpq4ڀjR sͧK(Xn'&г"rئʚ\:Z{O'ԤXڞj mc*28a 7Sȃmeҟ4y`95\<.CQ& 'X7o뮐q d>"Vjoqu ~z՜OBnK pÅ.pC4ܰ~fL0Ɉ6ޖ2Wpqw|,c8՟jm @ٚ0\o?S-ݸidbʽ1b'IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/view-sort-descending.png0000644000175000017500000000077511323355446024606 0ustar alexxalexxPNG  IHDR szzsRGBbKGDC pHYs  tIME .}IDATX/O@Ɵn A 3jg`gBzffЯ@&fCz/r-w׎>k7VdrPϜM>!p,7ί7Ϸc]" : 1y9^&#c%P R"x_l=WT@dLθs }s. HOA $~!%u? D4fN4TNt I`F9  ) H$`!X>0[xw;o<ΎY8Xr{yiZE&Y  XlǍm_s1Vt'0OIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_helpindex.png0000644000175000017500000000433712110457565023203 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڜWkpT>6!l@SGiJV?NXgl?iEeM[#3t- I , lv7w{  !9s%ߺ%; Ig$d\ё&?U^J7꿫ֵve+4{ 0ryē:&04:0zۋ'U(OY^xXv vyZ!HD$ə8z%֗z~h>-YPSX8q)D0aG=O UX^mUD/>Ǩ?46 |-hXn=5h Y(yHE6ga r@'/⋳xo_Qƽ#yOX[Th"@(4KT:cqg zV>@)aȲk'.1Tofg{7mX |`CU#*2 K%,2d7>h >Ԍd:ɸ3NCY&W۵ʖ7֨bQ}O 9Y uQ-BOYcfu$դ)d*v? ur`C:{4s.0n$4>4THJx9Vd|ːӢa|!\n66PAn+R%oq.lGwYYwo^c a\*VԌ0:GSGE\Sa͇D"C^$6G K+c?O$0M)I}j{ęB_ںWę)ARR!,nLC.i\u*q!>y#HsNUf!Jw ӧva۲`x. |mi`>0L?>vS$!ei#.xΗOsW6ۛ*t&IN7һ ZHs$zeɶM4ջ55:-bT0\8f4/jlhWТܺ'Wj U.idFD=z+]m$;xQSu:< WG FI<_@Ą`aJVgAsmfҦ5DD}C҂/}Ʀ" *Fm(&ii&&&3vw̰;άfs y-`Y/\3GPhѨnS h(4[ ,x훑OaOf|Z<~ZPtFѠuJ}TJneɽFN-VQ G+-K*QZS.ܢs{nOLT BтQb9r $gLϞ}Հ0am;X Ş̰V U (H<n.2@WGJAnM h%e(`:Tviu[ZX{><;mkm7 /bC\mGF9;od%mh x,ӱ&.UojF'go k@KHd'8=:))$ Qt5S(:R |v-"" s+=g!ݔ`ks2v]+F@v5Jоn6?9kZˏW\TP(ܰ"DK9+^R'2Za;̘(ZK&?"+MyԊwܷ7_Y5"31|s/dzXqW8aNȕ78hÊ75b쯙Rߐ |8ےO/ת uu @9߸=v܆oTF(aiyRE`[oT+ j58ВoIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_markinvert.png0000644000175000017500000000377412110457565023411 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME ;+KIDATXWilT}۬xavMk!B(a -ZB)jJT%aqi=MTHu7$iA) c{`Z`THGOޣ{>swBF;8($W7+۔HgW=v- 矈 ө䳉DgkP @{|káS؝eM@\pgg:',_ָ+, ۮn.>v~nBpvT-z쩄zOO 8*!+s֡jƍ޺ܲD )0!G:p[qyz 8 8 J ;A z K\rBfY(fԑ.XYdǺMMs* 9"2qckE Z1G 2@}fOzϹ>f \߃Tކ"xxQ 4kY U> =Сn[Ea9:E_gAduɺܣ_Ļ]&"!@ )ۛ_fGHmoF0 U\Vem, ᨖUasNLT#\/Cd@hQ#6Yߪ PV ;Փ!]DOAj Ll3&444^F 37beM 砒:xU'l.*n@BgӐ.T' :@ "C2״T7:xA\d̼S1@1 ݴGC RKLPOIv  qA PL 8x> ӺYM/F`\QMy\rM%"e\Dp~97ȳ=#B\M6"I(*vA,aFh0;7bˏhIE7Bgoq=bƏ\-tvcklK(w tPper/z#EJfnqBIX}prwy g{oKiM?PtMs<Ѷtcck*H />'D @*}) @f,:\+D5P7fwOM2:gy}jI.@A35a_s5@ s\D\Ŭ扮C5 HЇK`ݺͿP= [=VR Bs-,sDX,Ŵ؍YuwBkT|7+ݗ~0 ތ[34)NXj/q;o;˥e~ўz^ fmmmذaWuu:&} HXRhr$JY:h 6m\G@/ӽ]GopDg9Ki}7:u%{9 ·>+9% 䵈yka 'E PH f|F0 x:xT0iJSzӝ-#D̨Wj~STֶ6>yߙ>T)?޹19@DưHbHݙq]CJxmƓsqh4?N$b Z[#n}Ah)IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_openvirtualfilesystemlist.png0000644000175000017500000000322412110457565026566 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<6IDATxڬW{PTUݻ oRDA#GtT4E665a3&^6L3Y) 9 R| 0Cey{]hae̷gϽ;{sAҧ}]N_E! 41/KֆN S:Q+D_Q!i)_Zf &#(UtԜP sc\Ig(J@Ԇuxr0hiiR5q˴{O}WܲR #y`q%Boݸw/qa`,zz z@0}(bF>0łr㑴G'S WӂF{=oˮőUxko66[zxm)ҏELG L?H̎39س&vñ]md9%UjcnsJēoU2=fm?Ʋ.1qQaY%XDz>_l70ᛑΕܓXrRz{7P}δO[)85۲uhՏ1".=dr)cuHhi_0]Y@𜋢t)oT6N=YI][v8k౏93Դ r&wbi¼RngB0o#N x[Mq2ؕ41mr7ׄ)NYMBCE펄Cgˍؼq5 NeD@ȳX5 /d7\nhH^ʪQ(Q4ݳ)N"Kn@Bri]rx@Qόn8 ͽx b")!p:I0&sV2@$li+bĨAcDɯHN$+Gnabi),GtPbt"yҿK4 _Wʊ6608P7vB<{ڨ8]|q q,pf&֬ۀc'БnUG 7gD3_Voe1hCsK;,ͭ!!υ%SD]ya2fSҾE88T&oۨI IԲ E~Kgse).YmE0h]6CYgq"7WcJ@gU}}t48z^>3gʎ.@ctwIOuEgIèWui`M`ħ1&xIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_markminus.png0000644000175000017500000000462612110457565023232 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME 6,S #IDATXŗyUǿ[fa 3XpAD"R%m)ѴTJ֦(.HlݬZH+5 Vсfͼyr}w;LMlHz;|9;y3-|z({$PSW+[毹'}&8>~ͤN B\ē ].}h^B}S]`^Eb8n_{#/b偋lRI-{—ݲf]p(d_53[)։npdB5V7\W~w.;p Z‚TpQ' $vլWk1 ::A5 pE{4_Q'˰^Dp6![\3L0ϭݔg4c (O1PS& O3Ӱ%p WL- `ٟm;?4δ`X=cE-YHTl0Ff;4rzg-jǫ쟇jTxr@r‚zz Tzۀ+M 7q*HCE|g(\5&_'8<U  8(1_=ӐND02B(P H> Wȼn@ep+ m%b&($zσ3xpLPR޷afy :eJA(NA&z|Rzz4 neT4K&+ ]umDF1qp?3mH{-y$HEQT yl"3퀵P{6wfD'U{>Pτ~to+?Yljg@B.cr%d_'MJWi%Tv`R ,O @5-31xd֎/r<&2w|8T~R΀p*!-چs}?>|=:v3T jFGCe.sB8!.mWo8}mG~OҖɞuW^HQLaCn9=xpDwBf/8ax& #QDɁglR,2A}տ64\n N0#i}ő*5O$13b"W^u˫jTAm 4@m T5;6~aͲ'7tOjb.n ˕^غ`zw ئȒ'gnn±ZpC?5dV'p%H@a}/g'>K 7,Nc)Е>k6 #I+9w0:cUu0T_ @'mk6HuݥkF~Hb6,iovR[@@N@̓pr4,T( XCs7z$ʤ˟9^_D_%,Ng@t,QVE1dzTTvUS@8_?J$EARL7J-;5å,v2*WF JPA(Nb8::>#S0XK !AD{^H PTQ`84}k$8#+P]ٶj٥U[\bИHKks,Qn^ %!(R= |rlS/ssMۉ55sWa&yp#k7֒nZr5sV2v4TB$Ri:ۈDyƩHnHIc<*\ͦ˨?kN4PVrsbw ّP`zvJf\O#q P^pLzb8M1kL c_p??dbA5+(/P);ާR}(f=?a<,S' DB&ee5$ٷ ]p?tK,uGIԠ7o36tMǃO1)>iB](JBã0C7h^M=* ndŋp'?`y{k+] b !me`8h8(O\VQԵqy_ugQ1;7M珬N7 EKK0tںMض8{;ؖ s`T&-AQiJ aįY}4ikm⭯0|**gZa g`"cij=R=,Y/\=C<3CV8 nm g2)/4My+jU8{<'ES,̒(:.Є| R_NPvXqΪE%[(/v=ř:db8[:x-\{J@Hߍzh3|o:ڠWpIZv6i:Ґ1;Ҽϵ,.FtJF: hG@A#yR <@! |󲾪c8 4*.r!*TY6@?FC?a@( 7ɓ-xR#FNp+ʉ{8Mo?6IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_loadselectionfromfile.png0000644000175000017500000000444212110457565025571 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME 5& |IDATXŗ{pT?ܻw&d !1P"bkqSS>qD,:֪T:v:-G뀔` "E $AMݻ{# ;̜ٽy<6>xP|+ L\Tqw*P]}C(l42rP5/P셽=]6i[daBTH4.[OV_=a8RX'N[yz 2ݢ M3dx$wœ7-:ޢ`OySP6V*,]ZTsɎxB8བtsMڌ+Ǟ5,;PSR{OAQv}(H~=ɟJ*}ZLh` x)X>}fOZqEV-u'3m]eetk.\ "AQz6|?gCh/&v %, 0%?b%34Nl[7Nƹ;|CnZ.cvl{#F| ?t&>r+5hS跃%{j_O5]`^"1l=>/4 m&:`ŧ%Q2QX$Hoyپ+:"I[%ׁ`< ~Uyd 7M ᔮwW3?Xھ`%)-_dWvo@f<ܖxǟFV YD*D""쀭hnnzx0>t/J'12!32]ɏq`1G'+.h>{2-7\VQU*gIMZ[#=tυ]xgC@RE ̥Ol|0g$Ȇ[)l5?)੘Sw9 2H5J32;p>XZ"G@ DA~ jvT1, K!i'!ǶQ-,+) S~F-A@8\(DL`E1a$pFA(޶\߇R"$` l$X0S: v\NGu#f&29+a>||UZ!xvjÖP^ps:NUuE%0:Ƒᯥs"[CISُOm3.-%pdoQuBqycǺg5Mڔ+k}UÙ.ri*[tq/βIі|gxVΨdҡw h#)4 `:g255-juz0bCG{?*ZUʆkʺ%6!Lyq uD]TR5e}D0=vПo+*IFulQ` lW;Oi(g+S,B9S}=IsMI ɨƴ_MЁor9Y!B*(f.MuU`K`Fg3vpr57c&=y~ϛ] Yl˳ض1ffܽ8SgŀplU5y2͍eER}a3?Jpj3#Bo!B !lF~] )+ZqsdG@gJb' zIEҹ8^&BF*~7/dn:H{kBہ}?YX%|c}S O =252kdMmGM8] bTu!8#~ւm1j5w.>7bZ@3 4'XPZ_X;[2ckϣz}Bwp1퀤nETuSMƨ# hqd?Z5HIfe 5ضF`޷7Q;< 0y@LH.l i\"pw;^@HWW]vJRqVsر'c/q%/V/hM۲Fk4 $0mb3se@81Tc]WRm1^TdخbIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_exit.png0000644000175000017500000000254612110457565022174 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڼWkU{#ͶALM_E B Q(,}_A|I@(Ňkj_TD 4iSLbSj3s;w7"f̽7;lGL_:C~K3r|Gvv~*azE* %$Mp*}kzm޹`Bn@7?edQУAg{ -ܘ2@׌5P*~frٔ(ujE"0bõqwiB+2kBXM dDmtg+M#X+Zn!=97k@+3`K)KQG밢$ Ij~vF||=F&@D7ºJa{I(5@eeh4QgMD$]x7"ʡU@Rr%emGսHxu<ۋ9()T`Ӂ7G*Dt,EBV#r}%u/;9 N"3.9'VHS zWVsncb y5/n"4qyC3:h  ?zc=(mG^6YqOp?xKb T5)p&2d|$x6xbD7IrT}- \& NYXV , XSSPR.MO!3j>a7.D"[сq,lɦR!MCuY0%x8WǺP2xȲqI*Ե8}>u(8ut|_IMi;@ԅ^Wf&&VP:[715-O=".Mm38{}wDk˜JȖIQKyv(byAfȅ6~\cr4#,KVtp zi@گu<xs3!/VfL&(*n֭r簋?Dk p 63Rȷ0M<q.̏&*SXsEDo^&cFrÍh2zKm%#"2c΂ru"rn grŞwm/`o y;^Nd[ɨW](YrIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_symlink.png0000644000175000017500000000201312110457565022676 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME 4!IDATXŗMk\Usν3I*riicM,"n܈ 7\bJ446i-}EML}̝vn̝|s?#9Dnۈ⢈AEp׀ D]s񏙭rVvvvƍ(9Z>Fu?wO=ɷ뼹3XZzhՁĴ*1f*{{R*xܹQLhҢ`0077ﷶRA %LLP*>MZ4F3@Gwx~EE p({! _Z&ӵ4wSXE;ls>xy1TRx]eNx0 ]npcZ* hW_DApm[)~r`&L$N jx^fTa}\?N3&krC"Zt޷/=IZAh[XQ k{Kwa} jz)>fX-߼ۛT~fTzlb:\1ua#Nbӑsm`XkiӦ;Χw.C#BmZ#hz"0;f%^!B+;~c T_cV?87@qC  9`^CpeIf%IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_about.png0000644000175000017500000000410012110457565022321 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڜWmpT~&lB1| VacGRpTP~(R3gv:SeZ ũN @DA&!&ٻٽ=ݸ,rgN=9=9 S+ES(ϛֲ=! d{'k?kLwU]yRh aEs.UaX0MiaVP#jZt;/NyC3. x=-k! 1k" Fr8yq?׍Ъ 5 *3q8.Ob"Î{Jڛpok-, =CqTF"'P+v|-@CIo_@|:U ɂ[hXU膉 {:Q_ž>O#o>R Bןzl}=o׏}ǯV."CO>Ys) t(6EW$$tKu1Kw;;aYXGp(*V dOgt ZDc,9@Ƨ1LY-ZNuw'f˭jO? ,oPp>ca yӎطg5~H3^{쀊Lx0 ʿjdR>RΧ;wchLÿΏRVw|7^ qĦhk }erN9잎z6~ 5|>Ewm^TY?{&#GOcy JHG6dO۶=6Ł$n{x3/Z/yuqk'8ÑHK6E]mea qYj*}2N]"zQH%Ja 0E%Z~-Gkc>1˿~ cn֭#C: o02h<%~,I "%H^,$Tz1L!P9i}l4Bbt h NYIbZ4%n߄yI1̥6H|6pj9ͦAIO|Qe.^u1}n-83ng|>F/$5 6w!I*dΞTzI8oYgH$4L?C6ٶ#8ٚK\|F+ڙR}~G.ŨBl|rο{%f_&[dQ;H|E ,8f*i^k0ףrlSC[C{)=]pLfD)Ii#|CLhܿ@ s^8{5К < \i_Ia/a^䯎'0AUg0LDd ٱH:AL/`Tbt$rܨ:Ȉ3 s&7B`IEodh=BpD>Ta)m47`e~z"G@u`hщ;ñ5XƒaI,)J!'OxM@!h@o;28T;y ayX~emn .(Iyb^}Մ'*9݌zR]o9# ^nPD 1ϔo&,Čig^ByMo 9 EjIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/go-previous.png0000644000175000017500000000226011416270327023011 0ustar alexxalexxPNG  IHDR szzsBIT|dgIDATXmhU?̊"ôYݩeVكJ SM{^ ^AA7EM0EJEe|u=޻{y۽׭@?tLa FU_้-; NȄ<&V oG޿sK_*S̵%>C- R xRւ0a MP͌Iڊ9KoKlޤoܣu n2 "Ey@|֔@zRTST #bc}+W'網Y$(_|C9A)xAGjC S-m[o$^ZJoD9YY4auXŎF GvUmOO_vSk#Cr~𗀄{4|il5N|he7vnbaͪ?P&uСd$mBR S$Ч>ןv7-q I`H9ybµF{M] /άGp;^>GpMpt2Ab̶.1CŘYttLT6rõu5)cFIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_packfiles.png0000644000175000017500000000411712110457565023160 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME i7 IDATXíklٙ]^;qiA( Q%H Q? Ҥ"4*A'Q(k+ۙ7w_o Ah({zNx)lF.< kr,˷/Qdtl:)}ק@hjN6q-s:z#*k-Z(bӺ57\BYc\g5"kfcB_`|l-kC6/ B6]C%0rk׭ 7RoԎ==oHzϟ< ˡfNZ<wKߍw2S#ǸJ:Bя-NhM/TKm]\z݃y?VOתVu _YKr5DlЛJ)W:lx'aTәogN>vvo;ʥ=(l|ʕ[MV(E?Í?WñJQhxbAv]EE>gJǞt;ϳONv~#pT"&}Fgav'[ׯax|t]{G#oIҔM8s Krȝw0 $XSs:6<1*ab:``M+/8S˜4t_;v-McKqeX uԹ u}Y dՊ,z\7`R4/k ι> 4,dAg(W@̋4^}s_͚ ;}A~ګ4֧y})Vd4q#rgoS|x9ZJ(`)OBi_e3){%6\"4Lcz?[i/23D^׀# ПBD!cq("`jU*>vԷ,>ۊJ7DB;Ѿ^Q Q(z6BL`- k S#G9JnP)2;Q&(c\+A J``nh8I)D J+ѮrDD!J3RJQlTAI͘BB:ᠴ/Dp\32ֺX4XGc# fZ'8P%恨YW ZDE((!Z#Z'>b`Le勉v4jbM%pn 1f9N V%$<<αA ?~/=0V]S_J˫ rqWmVG[+[1DSAB)Gz74﹃zC(Pf>`Aq:2-ۖuP8 8 sp? bezɪZ>!W0iovvyA{=F'.bk?߹T-atIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_copyfullnamestoclip.png0000644000175000017500000000327412110457565025316 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME  4TIIDATXímlW9O;ĸ@L4F8'}DZ/s,&&֕́%$A@AJe }(@!0 }>OSIN<>>s][b ƘU@D7=DS.?ݻk<脳}ssE߫'"*57WyG@DHR@~Ld"Gr{>⑚u8fd@#x/X ɽʯ@e\b{ G6 L}I%R]}}2 EP > QI$p[h8uۯW˾$Bg |NC {ŧ]$Yp^9r ͟5qC2l|q!/Ju)c;x@bOC>Dq^[N1K_'_y'!Wnqqײ͝l~yf>* d <'{+/=Ncc!{귨{c'o~;xE1z""=#gԼԣ_nG<@ p/n#'+#>=sA<'1$ZH)7rJo>̍G6-]@ƶ`T q&4tvvuBoO˖0Z)$DaQ@iyTD()-CU)-UJJ(-+ T־)n` 5n9DoOZEss3Ƥޞn^k477#"cb++%Da2sQjPQ^AUeJUeTW@zLU1Q=d<. M)H*vwuz͏hz c ]'Xf :qUWǵW?4BbXX0K*+RU*MHIɄ 4illĤc[nڵkʛU# {Ϟ+E.~J*3˸NXk&.ߐNjMnC{kvP(rWDe~[g%fQE5`$1NÙvI.8 b#pb[NIx7i}:x{{U'@0} `.0c|-k'@ {iFIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/view-refresh.png0000644000175000017500000000375011323355446023150 0ustar alexxalexxPNG  IHDR szzsBIT|dIDATXŗilT޷q ij,\5(%%QBZ〚㦊RRPFE,iIҪ qC Mc xggz7͹;w= 66O7.(;U8[9sX n#u13mǷ[SZ[[Č5~0-ݰXtM#%Lp@`ʽ|s }?EAӢ߷xSt ~]U..eD$IK)s~3@ }Cn#e!XƇE]70-m]=kad^@ q$ %A )$|t}p&_[7U8y^e].jx:0+KrKdaX!P lWr$HlI0m3=6Yͬx)w|e"y`D8S'<&"F: &x\H"خBMb߉)ronmܸ(ۋo2'q>BI˝ vq3kwRgp͖:/177 @M 0f4Iv p*/>, N]YQUmk[cO2idmxmtF.i_pjH$w0XBL }f7{G 9w> kʷ uGkª8eME"9.^%8c_GO, %F,F%Y"/uvj}#_ TGѴPw枹Ա /S֤w?ڌ""/Ep UhP{'dt!qvKA hX~ɚ.q nIoK[6`{Cۉg:9@{@ݘ&n?s퍽ͅ{QZȒEJ)eii cp$`6҆d2&cmf}_y5n̓@r{Q8{s)*[ee5zQٗB 9*׈}8t\?Y 篆L*j~w;8l"1XN~aAX`l#BL ?َ.S!F=HA^UK /x!Nѻ$k >_=ˆm2svIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/list-add.png0000644000175000017500000000113111323355446022232 0ustar alexxalexxPNG  IHDR szzsBIT|dIDATX햱kAH$D+AX?B[CF+AA\aai#v"B,LD"hlryMv݋Zx ;70cDU۳z?v{:d֕3vO"ae3No3A d홆9{!K|=Swz"(-g˙Z|w͛ܐOK1ђ<'!${V3K8̈́ N΁u}'l('Aq)m/Ǒp0VLq &o3 s R7~1j>,$jt mPcT&tlV%~~3# jiw] (0[@ 4w$H^wIH|4N rZc'2Se_T0/]X&΍-OV +0JOhC3o? WLvIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_checksumverify.png0000644000175000017500000000366112110457565024251 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME!43g$r>IDATXŗ{P]eHmZt3uH'&@6b'"7VM h05Z;IlufѦ$ê˲^L3|;9y}Rړ~BPPX)% IEQR౵!ZPX\!H+s-^Wק(*$/'|.H[G0Kx8soC:a\X B 4CF@QEQ4~<!Pe@#PBU L֫Wi7fåKPUuH) }+\9ٙ-h`ۙʕy-W<7CǮ\_hnٿU^$NVm PKaT,4>sذ L&_vv%EE_Qqk>@@h^ V&yOs̙3q\? 0fmh}E BP`s)6Nd1_Ckƌw$>~*N`yB 7κAo=߻}6UQCppOIַ:rWuZGWܱ\gfVߙ[eigiEGWрQJI [m=GEOeYaE5ٷ LsüB䗎5܊,"+OR>~Pl޶{ȥ-|V{7E)d8JU.@߼Bz:sMԙv*atyܔ !RKJddҸ8 <w1_i|#%o$s>o߬I? ڌ &\MLLfquݬG7\#Qؗy!p5`;.۹;i:Nikk[5x<+ O%.+r ! e;o%$$qӃhd2 |i bhUM{W4VN/Y(b~*:䆇 x--`yL AS5yL dMVAw^UUq:ݬކGlk#4<U6xCCؾi1:stơbEQ1 4ch4dhX|=EZ^žJ'/ʉfmޚZjk/aԔK-n--|>חPIǘA[[ee ɔ !B 0 B; -dzX MhЬҎPM4dwu^ݲwD#jjmIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_restorefromtray.png0000644000175000017500000000255012110457565024465 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME  aIDATXŗklU>vD% DMI )0%Rc&ATFc5MD` RUnwv-'_vs?3B)p> ,NTԬ#X*k,KEXffEՐ[J_A6bTuXQ=ؽR@_͟@'_ t>k p<VT`0`~Q e3rގ(i991 ~Qhdr0X}i0&%gSZʀJg&r;@тŝէ-Âg 6{rPeĮ4GVAtZLmF$`""¶h[(:!9_hR@V|ǵTka90=1oڏD8 yE#DlZ:Z}և՟Ԥ]v*kl_> R"cXBe[|}]R݇V64Gت' laDe [9+7{@s8RF;Г1UK0wzKn5e8Lw{z/N\[7bEahYaBm-l<:ڃsm .+C&cu? Kw ~EG}ahY7igߛ0bfZ[Z0 鿭#,֓2"1 ]pg : &g(}EK`OxYgsism6AP?` XSc&157>#@ol^]{Pа,t Il8 ?7q<{ Qp+RcL(M̠#p0t:!ۢ%Z1gx\N&y%_04wr 9q򇎡2<9Mn5icҩ5h#0o,C}Iv (T21xUnIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_saveselectiontofile.png0000644000175000017500000000445312110457565025271 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME ;/>IDATXŗyǿ;3;̱3{RvXPDPRBX&5HV-6J&E$mrE`ًeٹvwyǎt]ƤOZ@o?iFkΝOW&>SnZնAQ B xƋw󹁳֓6f nKuz\9Y"0#Y?j 1t&/5J0fKz_UrL/)˛3;_<4.Ve%~#3ԃ#^ZM2%nݒݲx!w (Bj|?UUW ݍ8p݋dRnnV??2C fCswfoP[!9Z@Z_goӤ\X'V-<8t @|ÐMw`;0'bڴJ3 w( 7/\ ؂LхtK5(%gsм f KqhL*ҮW;KW_6qk^!"{U3z`u 9ܫrO%_[ָ$d[rw* @U֚kk^]. d CW1{MG %P0C|SS's~3Uf_$NQj 7!j.58GP[:K9a]AU>H#Zd1Ws` \xt&9tB(@(d?UP5 JR8)*@> [yCQ `.1J&a 7w%0z_Br+ P@\Ĥ*B8 "0mS.Ux`-tW]L|#]u 7@o"KrLG.,S=t(ʗ䦲L6)+!I%lн5ƺ/_jΎkl5{||wBk7aGw~GdF 3 セ]d3F_FKAC (8x SuZ;ZX{,N63@SV>bt%H_ _vUI&PñdRO?ߺlXefg!.vC B cŲq_)z6 [ЪU,dmܞ; {#sÍUH @))l[`W6Pb"8lہșK9 x//(nph7hIםd4@tUx{γ/mWa()}tW)ّRcX=9 oMPix#RE1E'D:|iL|?_Q mE~wZ]=k )33+1B4 ] 8x>&2% G~0q8Mm;;6\ghu[=z;=V3x$G؜F!!(]gun0zJ(MOt4/ēŚ&5Z z 0sV^&(L! 3zQPJ?∄pOms|[fBSTAf2|^!\P$@SVT4F!SGA'3A("U*!1J/ ~?6Z\c,kŠ2ƭW\ pV G0a.--IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_saveselection.png0000644000175000017500000000435712110457565024071 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME ;! L9|IDATX՗{pU<+>`A$EE҂TLGE:S@gӢ*EǙR "T M]t֕7p<  LrO?ni/ F_bm˺lCN(?U5/Ѻw y̘ɷnIt5K\ dМP1oJ_{K$SĂZ?> n\:Vע,P,wU= 9ڧNsq}pWQkޅ)ǁj`Rsmf϶;zUq+`C Ef{Z_ƀT [ P @ckv~j2$@pUnΨ2~KɯJkC Չc1Udj XK~]ОLrpE[z4-T$= :ϱCoX'hU )i"P膫e;HUyɣ+A729gveoݡO7[lȓ).V6z."St`ܷ=v.y<JbmD-GvnU,awIbVqlӿ .m=[қR[-  / [sWdQvlYjVHF1iR'ʫ' Fj^G'1[1x z9ذrJ>Ze rD.!0/;9==& \=@{`@ JQ¦Z%nj|ܴ #0(oBpƯ|5\X9<N*O@@h\ D*D/qK%V9$0+ 3NrLy0j FA (n G@D e4 +/'\_nBM{ކ@pJ ` @E.NP<;c+4 nekE45jC-z=ReyBÈu#<ÆXfhpE8GEYd'KRPt< Xd$X&Ё?bVrZWo~΀c{Fe4];/~Ľͯ#W4HJIA7WsLgiܣsX nQo =և^Ztkedv 5@ >9*| ,?%$(i<\V=rs٬@^b-|b7/Q !p\w& ;U@))9/ѯ5F:]. K iǢCKi8ܥ<`w,gO9Qwj=w6=}|ޚ33x r/< `@"&m?X8л ΞV/ XPly[0B{}9r &0::oّkuYw2* ;@8Di>Yu,ZXƮ(2FbC8'<ȕɠZlOfDZ?l1FUU{ '[%nP$vUvj8/Tb$PU L0w-/;j]Rvrj!bLJ\l@ϑ}wmlJs4gVf]Yzh7^jcg6. /A6$.<7W]υε_ /+m}PL$ ?)jΞ+)z;< vc8?,.{P4~_?mCk \rO#^F$gX 1:9N땃ڞRfH%G^D{gČHZc%Uh25[̬uܥhHm{cǁr˚FhW׏'$~qD1Kٳ[_(c7`ŗ`oesx2hI`￙-ڀOWX+.]sOx,zt,?!e$ /_;l IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_filelinker.png0000644000175000017500000000255312110457565023345 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME/32BhiTXtCommentCreated with GIMPd.eIDATXŗkhUs&{4J؛TOtk+ZCBZhbZ[ܦHE U[Cௐ&Mlv6&QZ|p`o"`5pcFN5v㸪r/`(Ipj+r\Zq#ǂQ@r K! fٲ%0#o}/ภ5dss2 %u+yfͻSx xW2upAY2%Gi R% i,=|ytgoa(ݏTH Lsq",0M (E…zEi"UZHV pؗ(aʪGFJ(G7LWwfP 6Ǒ. *<.':e:KٱӃ8NwWpSmhh4ZM3DC1T`vh(3G4EJ9|fJ=`x$]ץ.Ύ-<pmb̈́DK#P._J+hhh##q3[Qv_iY5Ȯ4L|EM 9 S & !@*;o.2P(R )%@yQbN!~Pyys=2}! =t&ڶmf8ѓ +y\%NsZ^Z 555!6` T$I|qq_mߚy.S醕:Rz]Ap8q/P(wCǀeM"@4dx{q-=' ңl<'oOyx\& nhB Lw75qmO./7sul:pul]f:>Zm83kOHSZtݟNp"pr0=N6E)iO%U.9?YFG{ C}$3h-V&2tR\/|}[ wٷy-n8Us$q?݊[݅^憾*`[oE0PU*]i {'=` 7L ??@.fG]s'\IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_markplus.png0000644000175000017500000000467312110457565023064 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME 7%O, HIDATXŗ{pT?}?Ivy$ +PhejkKөbѱSԪj_cLvj@+ EDQbf_>WHpAL3{~g;sp3Y\fkN^mUDڋ95*eA2ѻbh dLCZCLYfw-_ JvS 9yƂZ >}geS<ז]q'S|m?.:wMfgfUd W,mQ{>و9Pwp7H \9d龪nx9ˠQh~kIh@:!/x2)䲌H_J~,hYRa- kWT*sU`L:.v =ϣ\6oxFׁ̝[[E6 FBN1_w?ºyjFIetWģ)]W@tGq;X;:|u߾a*}kJnsU^Jmnj}@Đ!6Q]kfHu(b]k,TzG ^tΓ?іmJP5d@ *]$OtMPvntn!{) _DLFP5ed)2lkEAB!2B5)^GY$,Zݠ!IB.((BгFzu&t:`r "" fX Z0QDw5 5JDD $SuQ@>jg $ a"M'P4`F[d!r6xDžnAE0 D͠ǧhg``Q9!yYr鼢=˲jd=.KE&jk?C\s `Divm&沚Vj$%)J M0犀ڛ2PRD{'vhy^3:T_"ze[1WY5XMU>XShoU؀9aS& duÌ_Nm9!$:zxuog:VϪT8GyǦ,yb,0v;&t*KLɰoEyuŋM#8PœSgϲa8Itw2r? 0S#|d750Nb芾.Ӷ\KX&>4NUSrS셈F$X#@Nbcc~Dž,o̮X@$H M $s((jwPnwEG>=ވfer4:E^RU%4CUǨpϠ-;Hob'_a(OӴ'J2r0\ϣlT )g+wv`n+LSL?8;᧔3/=ඃ;m\qxd/3aw oU}tƶџ܉ɜev|z,z:BN\-,3L/)蠷kkNH _bki̬]R=3(g*t% pf&~AiwMf$fq%U  R~IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_extractfiles.png0000644000175000017500000000427012110457565023714 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME:HEIDATXŗiU]t;v@ JAJ"ւP $؂e (4KCJJ@Н,Ysw9s K<9ysA}~cr3ZjvܵBig53ԽoSHO◯8 <*#{n]H}yT^E~gރ;yw~֓*$=D- y~ eRr}dRG4LlΥҵijӲJ0}q-tFs(n&PQO-7~c 7 nXrizʢQF#P >DB0Đh fo% Mx__+ t^gk{vᶇ U1zd(DnTE+;v|p<2b%?t{H~h[t5e^ N/A[Z֍e#4ecӔ*I[H !la Di|.P53/H`k;=2?цՀc%-kFe)MYҩK2\.A#} |.m_9EoaN_3tAr8q{ (b@ë_* i1L0 Sbi J*(އmI;7fm2C=>(_= 3ѱk)/ZFewO189hw=ꤤ,H8l" ,T0$[C"5I49@否iڒep<9Կj*[b4B|/w̻HPYh=eE婩IILi',B `(ًTߨ^[Y]IÜl<DJ.Zie`e;z;F8YF4]"ŀTw:{eUm X>D)i$za1B \%ѕdx`#Γ>/Ɯ6PU_hVVUknĴmRS)R׷w)%RJxC+A?Eg;-< c%wj§r1@RTxI ÷ t8OtS.|10IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_testarchive.png0000644000175000017500000000257412110457565023545 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIMEg  IDATXݗLUe?{νWB*t`I _5 "e9'jLt 0f\%s4p$L30,u$(s\lݹy|9/C ~d/uM,zPCa꛹5/H7Ug8AWI/Oq =%;.כܗDdNW1gC ŸY;e bS)YH'`.HjhD)GBpӷגן|p@4L1L B34V4 t$`E\~ BeL|/V4!aeij$ʗڑvbmgً۰ u!ѥ3 zq5(C#u_4t7?lEHôX_nk.};$| ( ukϿ0ɽ99Pu5D$*)?|,߃ &n`g)[@(ÉФ,&+Z>"g#O k R}jRCZ?{[qsOݻx9~XmEj,0`iyTlP]>JLF^q9ƭ!*@XNwre.f[b20LŲr*r6qG9Z?S+.#S7.`;w_taB,Km}9lLeR C4I*v{,9D;)p;{j*eTv%AIh8_IQf*a Tk ;qv 4\!!1!S 'zH9'nt#^+ٜ5%%lNԅ2~8 nKe0"$X; WxXO[Y,uD}A3fPTC!`ʤ)#w~!YA NlFacF2t[K;!i㮹4hn癴O>Ϛ=y+tǏ&fL8!!Av4lFi;s۠MJg[KX@,Ǔbc)/^L3ڸK!1u{w0 եم~3km/&att,8_.7Ёs ]He`;{fDSRѵu tP{H Q_66y~'$u!qJ:pс"RJ)z@"IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/list-remove.png0000644000175000017500000000047511323355446023011 0ustar alexxalexxPNG  IHDR szzsBIT|dIDATX!NCA}k8 p pE3 HȈRҤo+7$I$g_>~r }绋ugv.^N@)5Ng= ^HKc/Jj{kT퓦{5Sd L07-Mj%/^^g˶o^UFCj.a&c?pb>RUf/I$I2odIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_editcomment.png0000644000175000017500000000224112110457565023523 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<CIDATxWmlSU~67ltl&Lf|?DD*QBh4~#, 10cNLFbM)J˺i׮VҲ,Ϛ{<=$l2qSO~eUw$BPv% +ō//}nxƱ؂4ج]VRF5wt~-@^hdC+n#cM? V?$ Eċ::i`(?s":}5}Zr?fBD#l[`YU@\c<>8O=_yv Al~'H7WxDB349;`,`.8NpCZWmy۷=p3'%x*[D pЀVu}[,q<:eMl6NpCZ L'M%.3аwd}:-S3ႛ.H-XHr.9| (RЀ4 q7SΌ@94 ֌82?㞘sQ"$Y6W$!KދQ|>C92kZ@, |R)'-h&vy}Og߰?8 hA3Ԙ74Sn+pcε4SoCj]ñwVܸ Ӝ7(}6J`{#ADP굯MKM&lbiqKoo;Qpk7Wc4Q\Q0pSUbwo{S4fu*=};D'zis]#w1@ڊffS+)lX ͧؐ4c@d'ޛ x(cfD2}KTF>葉/n <્qH[i8@^}W;bDg2rH˶5>3m}b3ͭ_øι[*78t!*cbŎsAwy.ol ]m/8}>{?@1ґQdENf^hu&ɹu,͵rḝ,IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_visithomepage.png0000644000175000017500000000254212110457565024063 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxVYh]Ef朻i4.}IKVb0T *Ji16u"֗H}qbhJK-T Im51Mg97w7l s30nѰVC^#c Wunh)'_jE %8[X c'Z Ē@eXa0hr@d=N[`Uu1DBxuL q!p[UYXFWE`xx_]FݢE'!w8x7L0+cАi X !3iahֹYdSҪ,EkV6] P &qm4_C M3J2òb@@'mۂ8Nh}jz }ƗC2hy{f;R 2J|j|݄QjrO1QJcSE ykyE6wۨWb,g˷҄(Jsq J3䡏97S3ARx,hF gVs&%4VѨHP#,˂*QlhuHf`'IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_hardlink.png0000644000175000017500000000173312110457565023014 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME 49z*hIDATXŗoE?MRA T =4 U()[oZ '8@65(Gn=aDI൳kēVg7ﳰZyɢH NM8Z젱i+Aq٬͍[Hx \ZEάz}a&ң]UQUsOo-4VV6дIAU̧@#G}o* Z b(O/Jaѩ>ja |ڤsZӧO2ߋ(xkq1` . Upvffob ]H2x\<֛Y.1KcH  gp?P:)$WPd4@b ;;B;rPRPTRZ8@s0 W~/1ѵ+N_<֓0 BFOޝDOkwS\hEoh<H27Ul+Ml ^y?m ,i!n8hY\ק"mLz.$Àߡ9Bh??+C&ʂf4;Mʫ]0 rI@=m׾XW$/vٵax8 <2ONGމ: 0Knܣ7fռcfIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_taboptions.png0000644000175000017500000000231112110457565023373 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME38DVIDATX[lUK۴-]X h݂R .HbpqmCK4CLT(ź-)bR4]. )bx$prN2̜HBC]Jp;VVEO)C3Qeu8vR}\7ttuNpپ,_@o׮HS|.J>WTe 5r:abu[彖̒c)eт:c;% \I&!2gNapE%ھ8iM C:эi f(K DPῇG<~*@؎@ͷTz}>gVq_eM,n>ZдO'A@ LmB>DQN?Lov]s8UWWjU®倩N XT B PZZV b!pbNzIdsޯy~X,oг^o>ߏn$1YphׇeO7<&LY>,w,ɲ~)ԐtOp 30hj@byt(esY(;54B$)iT" 8p?\T"igBG1i<6C[n-C"j@Ku˭6ŀG4˩$IjTk?2k/[ЁM!.Mv\pZ)+\ !tXGTh_9#IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_setfileproperties.png0000644000175000017500000000261612110457565024771 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME4+IDATX͗}Lu?y^ȋbbě1a J\ͶreVm65G$2C]󥥀AK /pvm{vxԠwc;ʯUv]󆺦0sm'[co{+uU*ee>Bcлyrp(FD-"8qQ/B6QZ'evo+))QϽnbC)-HϱVVz'Kh~4 0jD2 y0bFԘɽAV35.e2r 1u]kc#C`hSm~Dڬmaql({^|^S)RQnLZv p LK+5"]=ۯ-6gcwethJq&n`ם΋ r_-ȒLd=ebH/IMS|ĝ&eӖbijv{v _)/LjCɓ'qr R\\,GΜǪdGu]LfX/Ȭ'͒Cb [KvNu踌 `\=:lHrss !:&X"G*jFhmiT57z{1I"!)ZuO \'3g^Wpk'&8~:;8KG~ 9)yz~)iU 4Lha YKh< 38Px4;d;h@ @(ТSEDB[֞`W4.|Y(o6[vCV<_+RlĔf&';nH\B<DN|;k֬A$#.Fǖ,>^"#4i1/ał-ͼ.a,\ ` ]s{IiXVMf  f?P8otFˆ7 R Na7*{˦-gta3nǍMK'-kKcec UP1i om)OA"P WcܝJ;YEN(իt'w} 3ޑt}n ;G 'Q@]Hå6< 0zd'6IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_newtab.png0000644000175000017500000000216412110457565022477 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxWkhUf繻6oSLڂQACX4CP(?jEB1j(DUִ>HiUB)M7Itl=ܙ6ƅ s=={3 rpLBtt5AV/V.ƿ`$p<-ێXo6%߷mj@U¬x}Q[-^6 a;];q]pow̉NPO;E"Lv݀p_pɰp*g^n0pїZ 0cSI'!uS?(+α+̜F'mg?=۳m*Kkv'J]h\hbjs xx5ZW3v Rݏ<6Cxdqڼ6tZJs\?O10V7B06 r)9K0e.W/+'# 63F]\)aiC+Nef{Jge55z蓑%Y2TdR'w{Kkė؏x= w͸'c@p0:EPEĚy!yshk%R)~⠥h{f7,dNJe۱>'&wR W *dL% T C6A畫VfYŠ;hɤLgG[XV>ێβeh[iG, D>T iOƑIp?JF$jz?mf[g$7hcg>n؎XX XLXhz e[ $~/DIۭ$_D(! DXdJ?=ۙgL1sodJBR -شWLB3IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_restoreselection.png0000644000175000017500000000443412110457565024612 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME IDATXWkpUyWroronrDQ!UkZu EtD:VH;j* :#%Q G5K qs>{f9k뛵^Xx/HejܵS:5kL:uw2/xʅVx҇ۜnߺ% |ǯop禹k]ڴ7"/|6.}:( ?մ ~]w y+ ]6Nr陶~ }6We $brT^WwzB"pj܂wC@ד߁Ot7qA7ikQ/Vʫ!玂yt.q[CZ,HYPNHK;7sȺuB3˼="Pkeϥ~pj0zH+Pڔy9hQ8/p3NOe)y* zDv":>Y9 t"ODӑ4 4`*+Ԅ@]7N灊i2àIJ,#iko@QtDSڏ_Q>hRi`e쐻a)ݲ)o!}ŋ 2DBZ_h^ɲV;".dӶ]0g-!G:h}xWnC ZK*Jڀ9G;GR,. @*V\ߔ ${v'_X|kez3j4udžwG@,~9*rkB nBiM`x 35tO9BA(qM 'S♧_ i :^_]j"78`%Dru( *dD6W8̬l( nh`ƭ\7W*x(lQc-Ѹާ'Uz+^ \L4/|hݰ=DF2GeSCG'JUenzXx.tÄaZvAc7{eL8U>^R0T;"9A-ѴO,dTQU{ +Ru!aKf-\"<s~C vwܽ_Nljv;95c.[r f |{6Iig4/'ԧ{e5ޘXV@=/rcLcܩ,e`2^8~mkx̌&3%Th5'L5Ln@K>B@ ñE4TBy"صyW=Z$e؉ʋ6޹`?SuoE8o3pi7"wɶuƃl긷d(Ů/r,>ߤJ\@;=ye3kqxm슲;*i)9='SKE[j{IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_refresh.png0000644000175000017500000000334412110457565022656 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME!|BqIDATXŗ}LU?9W( xQtMUF2mYmUMdKĽd]Ncd]v-fk2 ں(A^從sqVbs>{RJfҘk 7!f u)ޓ_0#g:*q< _[ZνIH7( qSS@kd_4^gI cVیpO]6B:k6~U9.K_pc”HƥesIsF8~ӗ{g?+~`gJ@|*<{nNi;D`i&Z N?>WCa;M8,1*q}h \*`i',,Epv/aSWj`g;zȴAw7$gN=ς#0cdrhٸ#}%"$hZP$ۧ9khV0拓BX 2ޅd:$5.F H,w vq0}MǻȚORuS L\l޸Gܠi =GXG](/]#%[7z6 dž)YrdmZ]2yKp:\EsP'쀆z['4_ñ~e ۈ%ffd6sGk&j-(/wL 46A[H_Sݦ u( L18ҹ\S# K3 ܺ] pK)$?xN3o󭚸aq / \[B(څ yzMAmZtYMo&u;s-TV́P涧Nt߸& HyM1~V@3^HENȪEx5R +J7 VgJ?L "FBH.υ(3'nwl[d9q˽ j]O*ȏ"e"y IĆgS~ Z8H='ѯ,dwc"jFH-˂mO3 :X[9cVkVBVf:xe/r{C;׾T{ͺ=cO_hhDŽ׳F o'jwX- ÀΫP[3vHc]gyh"I@`tª/eb'6EK$q}5x$' u;{̥$;8t[)’6c>>gNf6=B]u`*;uDƣtggW< p5#54. ('T3bd01CVΙ楕 Wϴ6URy7QyDl>ol a^MrUp,-gtei8U~H%HPPni ָ]XIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_targetequalsource.png0000644000175000017500000000162012110457565024752 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME'IDATXŗOhW%EHJ7X n4.,\HM7]IlCBR馛Bn B Y.f%"0=.My&is63;={]&:af`@T!0Ċ-,<9;kJg{6>fa*W~|0T|d#c@-2ΎQ+)ӋaoLEdAPJJA5%Od#z8L(@{6j]c+jݷp85RHjNeL:b$O>bD9iJVvM^:L^'KJ@u81}ָT Ppp9>4 x 8H]JIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_options.png0000644000175000017500000000447312110457565022717 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڬW{PT]vYqQP*ъU#5&aҦ:1$&$?ӦM3Q' NA_a, b_| "bR^~}9X%(-?"s|,[9@1TsxK|1 /bCQ HS f5qyi٧/[]>x cƒ7a i-:iON\VR}ng6-˱V6wV̟a̩88ŞB"/^\i!}Z:Qyb<pϱcٳl,uN26 zN[ܐI)WF~iF2bF"~RDǖ|;Nvڹfd s %<˽;̨=ÌCd 4 ½1 g%[@.Ѿ0 Q{,l0C$C_xǥdTPEu5S?n72OL^FwT"Zh&,3V?gY_܃,e {ǘbUKV_`ًgc+Id!& _Λ7sq=ΡN%zPaQOiM'I*(^ -FRtU+g~ )ˏ(cFWD[5c9@>Nc_IH$%AJ$SHOԍACUZHF8Uz۫Cy!G/''K6>KK}$AVOG7:@(j][*jh?Q^8k*c$9k~m4?;}іtrma'FI@h*4dU Q*GESSоauF򖠃1d"}! DH2 PX7y/`D".AD|=O4_ӼU6?g>?lj#x/rzG tXτnE=Ixbs?B(fXxb^U*JDmx? 9R??bń\mѠc5G\z Mr3JA}rAqLJe{ыpVÍ<5/qѵ䂍#ab cm^e-du!3NhieھnnPԃ~)us^!Ē_g+\`V*a{`k>"e7,k.VD+ Ă#f& ,a{fb)ecc8r2o4 Wm|KaiͅSX3:ch5#Š &H_BF.)R;"z~V ɸ~ń/nx+VO%.j6*FXʬ2RGj 6FaNiPۛ?݈YU?Ej|igDA0ay0+l7_BJT$ E:6vr~EBl) >AZۀ,B73Wmލ̟"02龔*^2Z|$efzrހ( 9եA5} c)f}#]-^.>9G`xRC7P5Tnm_ǭOmr7:?3[BJmp] L'O!8$7zvvޝ(O:)ǹCI1mEiى6嚖-Z HD%aP0K}|2 iuݏ;g_Z˒@o:ԟ#kU>$E{$T ֮̊AqNRf#e5KdT2$5'@I<[Y歚-, &]ڭO{kkQS_WƲbG}4ۀYC!7iBtqJr\RzJ{1 ,4$F9]/-iΔ)B+ 1؞ZK)):.1T݋^`,O׸ͼ4lj ݭ;܇ g^QUP7z%F*%tetxYz{7tno/ "(x7ڌ@] UTc|s0@B *2 0{\IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_settaboptionnormal.png0000644000175000017500000000110212110457565025132 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATx엿O@ǿvC;B*!KF  [10"$f(D !D;BD:UR@!?}~!~''}߻,9f&[LQߵSOJӒ]E|rg~zCϫcFܧ!ĻLʮ(Pܷ sJ5MO@vI/cM'DLHL`im'CS `p3?Kx"H._ -9eTŇn:?A';/skE~wxC ;S@Hu[T) jDi 4Txr2VgnvErHEͷ 1X%N҅{T*5""ڳ|F[ Dn M*ŕm𺨑GJT!tvBB AUrCHAz Ooo#IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_markcurrentextension.png0000644000175000017500000000402212110457565025504 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME  뇈IDATXkp]U{s}ޛդ&1RZhN)58HEtF3P,l"Qt2cuD,Emy)X m4iZIny=l?0֐@ 5Yg{^k;wFeGܑYݚ*^vض~uFTD">I @l`gwy:Wxݗ FnOn>@yK.{Oxk} 52pkߴV|>j|_8wu.8ھ؃4,E+Wn1GO'8a*C)ZpD,>ײU.| v=ݏi5OvK'͡Pخ .f]|ʙQ㒎fq5m^ ]&5#㑀,> nݘ޸z68rei .Ko\@*3MU?5wQ+f~{m#)}rkĜ{_Kڕr~|օnn|5$ ,7u?/oy`q?=cMb{|W&f *2Xڱ0еo$'|>`PgR#Qm#*"Q0co?[šyit\z/KdMWu@q NI]5D.D&&TDiƈ{Nr{].Jx[ب5g%ޝ\WUR/݁w][FE5Wa .؎+H;"MrGVt2U~Kc;)6B_ӢkKkʠiC f "ۑ(бmaC!F B eHe%5m{ I5.yYmLec(@9iUGMC 6Nc'(g‹sW аs`3(Pk DH@ lT'URi*V/W*]ʕMRPhi\\=RbG~~+p\n]w{50® =]NJOO]Px)P7+oz^2r|o˦c7tݼ|C>/-y+J<@;{뮆=gu?@Q8$}G l>)8wKY?tp9O Th@0SB`W-} a +gx0=|/z]F ]ʮ g[sPNY<])VnˎZGbVu k~ٰ` R(pi#/I$;!V%J)b?IesR7[y)_(+Oosrm<I޸̅ Xe}t^B!U@knnH.CD%xi_! 'Жr2$ SV4DN >=ײ1c]1YAr%h,>?gl&ډ1Y83_c @ #\p=HۍxpՁ vZ12pjb {N;*P{#[*¹5&H!DLߜaOr #h"V{?LC[R Awa2 T*6?_5`,ko~= suHy_ R|,UxU>L䪪E\ l {w5/r5%Izd.wmC͕^ 1R.2001#iHgȍaPq'![ )exg&|!*7Hbqmdl/Xk/_be\hJ!&zG#Z[y Y`"R0׈ ?Q]{S.w$J07qJf{j*foDvѮ%'J鑋|iHpjG)g>ST+@Ms VʋMq"Wxn ]s];IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_calculatespace.png0000644000175000017500000000362212110457565024170 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<4IDATxWklWܙzįMb<0qMEmA  !!U?ETTRQHHD) "+m;M'v1]{z_;;0vJ~=ڙ;ss&(v@Eb_фد ѥѸ$1~ 4s VvsMUP4Ճ^q33=wlQXwNa?cqc; Z-pҤtBONT@UCmix?d}_] ;sZ9Vr0 y0(XyaGfWХ  A߶6Rz GG|W_kTiGTtDo08}l-ڈ2z$H=x ?NzERF~Xm=z4<}@0`:[\Ua(u|0y:r5XtC_￙vU߾=c-C0/>L:Cn|u2'XeH 4يÖ.MʉӘFhp56t"*,ȰrCEQi[CWc().B!d ܧ6 B0XՊmOT OpEu1n*kB'P~9t|0q sw@0\ΎvKmR˥IZ tPtR Mq7/AiS^5=|C-/ijtVŖJb!5e/Ҙ,JW)s4?&~WR7IR ˑ̥+#'_)&tLvp4WqSirabv WQȤ.s_:Vo<3BI3$'H6txF4KQ4`C082RP0%ZX(* i0̳H.`7 -")UJ`DbF+~@htx%yݰVd5Dp @!*c|uzaElnx@i 6tC [j\aV2yìUVd!fEJ",fU߷@ҳM*Zwmck~eovsˎçwߊձ\nc,GsJ1WXIWG3O.9ZqK]*OI^ hO5jeF|a"EZw'{H(DIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_operationsviewer.png0000644000175000017500000000273712110457565024632 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIMEk+lIDATXýMeg㌊!H7AFc fBLʈ lBDuqDqcl`Cl0c{,}{^wg6St_]uUD"^SC!i5W\فE~W֩9]z7Oo6Ëϝވx@ZBFh_xv\:_^32a7#̜pwg L #"p nd~ίwIW^\v~-?ݥYADi{3Oލv ђU4hRK#hҜ6i!M.gGx< d]ɩsjrKxWEu75WTQSL^ UL{׎E97lgK DΉG@JceTˋrA"!$⹜<%"AAC{?b!P.8!8kz Qb* IN$f02r cl/;u{5sz`Tfr,qC;Dq^IvLRȃOœgG`a`=XEmO<̌:&?<-TqzZۂXq p$'s/#5q _1]&p+?܂$R2 JRú@Zq LD #K_ =,Rl/ˋ' M9ܶ(́T87^~0`!$6 BJuו&O85 KWHlhjE_BQ/M9P!IQvƵnWЀ8vO807|{|t$U͐\{=$LT0^irӏ?ammb(` K wƥ7 ђ[8ɻ zQhԿZ}_{JS;;80@PJ$8៼iWZqfmyea#  mp+䔹yYǁK;.at9U%5Zo&9 NQL6*i'1: dH<\V$r=} ;t G `>kLx- t/9̼qtve@fS\ ^z r]b^ɂw~cw l< {2(,wgβWva4,SgaNWVԁ2 \- 7G6i; vgC|; Qφu|rٰɉǞ}|K?8sgM?Mn%IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_fileproperties.png0000644000175000017500000000244712110457565024257 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڼWkLWfg]6i+ ,)/ITLLiI jX[+%CkӤ*h`],VY-[PT`wYwwz0Y`م$'wι~sE -mmMz!"a4jqq1uVq2::*ZVW z j84:sY fsii },5^#BF%U&WNCZ|v&eRI:h4"7+|R V} 6z9]y͍!^MP+fl`ijw9twcvU @FPSBf`1fԀ|H# B;~E_]/Ky8`A9a4srb;w=ץۑ0mk0ky:;j>A 4{/G;ovEPa'?e%-n'QA$ě04<0_)%%yCgA,X2#P\\ٸN>܀_%/t'zzYϤp҉En/o  7obGqO6 U/АiHMI#q;$ XؐqtTTv Kx  b.]+[}}HJLy5ԟh@lZn%Z|q6Y WC̔Up\a/)y+*q @ATl±: -=5Gkuɖ q(ɈZ5YLj.+ŦTDo9,M͘vySMה[ׁ?HC(g  2:1؝vKAr:ټӮiDE&Y10,(N'*3Sا[7:;;FW(moɇ}b)o EEy>b.vw}~hͮ={-))>WۉioNrbYwe+1cp~.J62{H[^~w]_`8OSXIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_quickview.png0000644000175000017500000000274112110457565023227 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME"oqnIDATXõT?9;;.m\ #ZӚ֥ $DM@hDciW`ME,jV,syޙ]` ddΙ>nm&K%Ʀ͛I4 5 m«j^Ѭ cGj \h@!# 5<eFGغX 33<ƺ?<ay_UL\=ie6cݺ!hG#p*Ƴޱp`o^޿zʖ-\Edi& 'Qp/1֑?0BT94ӻ[?\636qCѬR,qR[i[BZ=OG:rqn5&r@xG?(|{\cO.WPպ)0\7VZjM~{Ls^{ep)7sa"ח~ή,[`S|l{hVy_ܿ(g 0fsy40}%HۀՈWԞ[9MY{DT1yr?B`XU&2"zB37-'?#IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_markmarkall.png0000644000175000017500000000425012110457565023513 0ustar alexxalexxPNG  IHDR szzbKGD pHYs  tIME Y5IDATX՗{T?湻3}PY5T(՚W񑶱jj},jFKlSU6XW6Hcv;ڝݙs{TA՞ܓ{|9P>\2Q{iOnߣM"އW~P躾eaMx#P |[u eUkB櫤{Khevٵ@|EG /er״|[2*ٿ&Tܿ'?>_5Dgpr#q l7P7+Xآпϯ z_7-;n#p5Z5Xl,X(͍a)_/ϓrpk5|Cd}XRv-iscXm @ŌN(vLd$H3كT[?=zy޻*.An0<$2M;w@qJ@WSo7_N[_Bel 1`aF)c'ЃaRn[xlt^,cuԴ<Lǩ@U~ag)KNl[ێ]9컇.lyYME,e?͹'>٥8JgcS8&QjS {nx)|Zg !4\<˞ӑBSϨh[De묦4nr6w?D@w+7{29~jY HdC&pŧ6D=>[j8iL!4Y}R)61\4\H34ϣB_]gF4PU'"#>چm(n6SʎJi{\m lLj?:`z݉1fqmuX֯CxCAw2O{4`+m hl_ҦO+bv]L9 }~&mhNȺV͡@X?&@+7k7:ԙ@@%P$MC 4?F*|S[&fx"no'C6Dgƿoj79IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_thumbnailsview.png0000644000175000017500000000245612110457565024264 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڼW;UcfCvE%(&aMW$$bbQ)RYHaEAZDXQb!>PL*mš Q-I9眙[ܻ{^w9#BȞsL/A!]_. { c-m|KTRsWzN-߄V8&fQg;m!! fcِjzG\(m=MLDxp{Fvl֕[ D0XYY MTVT+Ţkh^8e 1^8oicUL=bTFBeL*kZK/#m:udQp3GAP1;'%n %$5rs^ ΓES~J9FxC9?xФ|5(ZbʃtnntƷs$Hd`ZQz \s;K~Y1&PF:Gyo/bGJE ׾+&rJ <^"vT@|gɸn sրy!,V:g]@2 q?f3 d}v@odS|; π\zKߟD,n;L?&紐.h,};<-0pՐW^ۆdR}b )>P焬K+Mt3'?X5 őj88AIJR3_귨}.=!?zLN~Xb`f=VdB oO P̬^;d؇VXc @w |Iܠ„`Iukb7#7ac0N|d=@S\ҙ̚akthv,=( Gvp—qa[b`&l]ql@J;N Tn͋E5#}F*-}=̟WgB =7][ow}qLe*cr \G̿}akNo v/O {{Jyo ,, j>)IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_exitfromtray.png0000644000175000017500000000254612110457565023760 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڼWkU{#ͶALM_E B Q(,}_A|I@(Ňkj_TD 4iSLbSj3s;w7"f̽7;lGL_:C~K3r|Gvv~*azE* %$Mp*}kzm޹`Bn@7?edQУAg{ -ܘ2@׌5P*~frٔ(ujE"0bõqwiB+2kBXM dDmtg+M#X+Zn!=97k@+3`K)KQG밢$ Ij~vF||=F&@D7ºJa{I(5@eeh4QgMD$]x7"ʡU@Rr%emGսHxu<ۋ9()T`Ӂ7G*Dt,EBV#r}%u/;9 N"3.9'VHS zWVsncb y5/n"4qyC3:h  ?zc=(mG^6YqOp?xKb T5)p&2d|$x6xbD7IrT}- \& NYXV , XSSPR.MO!3j>a7.D"[сq,lɦR!MCuY0%x8WǺP2xȲqI*Ե8}>u(8ut|_IMi;@ԅ^Wf&&VP:[715-O=".Mm38{}wDk˜JȖIQKyv(byAfȅ6~\cr4#,KVtp zi@گu<xs3!/VfL&(*n֭r簋?Dk p 63Rȷ0M<q.̏&*SXsEDo^&cFrÍh2zKm%#"2c΂ru"rn grŞwm/`o y;^Nd[ɨW](YrIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/actions/cm_showsysfiles.png0000644000175000017500000000266212110457565023764 0ustar alexxalexxPNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<TIDATxWklTE޻Zh-J*h,|AШ%bD4@"QBThA"EBki}vKwlw㙹nR4avν;|)fFS;jn _c᢭ǟ$>Y4S%/mi_ƀ'K4&[ϽGWmÀ+w??͊*;B=1=-'4cpE[۸iA=&{ڈ#Вi ?D|5@Oc@@J![oDfcHW =͡&f@&O;TQx[p[hlEW%?cVрa1 f"|BO6a,{0U(T2)ʑ3SU-MD5$&\`z dpj珳] ׉6U0=6ޓ5)p+Ӕsk=:N5@q x}CXy6F1$[3)1HN/@(),ǾcFB [DS/ʫ!)k #lRW˿|"GPtIgLJۗ>B.i?{(,A+&K T+=H@ Q\30U3} bՃ[H0LT/EKRLW+ĮAA6|&YzLpwx1Y)I;Q[%VTք#(|O6wL|'wzQSEsŏr5/,EuMJcrseЇ%sԾUdW*g8w/v`GEW?Z dN/ihAW6' ׬GŸzL:DCt 1*$>-59իT‡ន)UWc= Ǵӟj&q-Ct`KdoC?K]7[n~= x8b]+m%w>j&zS016CEbl@qp!Ŧg77PuMwm̾sYf ?IΝ`0b=uHY - ZSJLrk)V?Cm3DJ,+y4ۋ{YmHT|^SS~zF%j<ʺ{+n@M+Bkn|LI\;&Fr|r^ok "[v6FtCet3#Y1R]ld̷?'2iMѳS-MhD ?EIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/emblems/0000755000175000017500000000000012257501472020012 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/32x32/emblems/emblem-symbolic-link.png0000644000175000017500000000170211312762055024530 0ustar alexxalexxPNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTEttsuvu!!!9:8<>:=?<=?;=?<>?@A>@B?AB?BDACDADEBDFBFGEGHEHIFJJJJLHKKHKLILMJMMMMOKNOLOPNPQMPRNQSORTPTUQTVRUUUWYUYZYY[WZ\W[]X^`[`b]OtRNS )PQXY NXjIDATxڥJAwvbbDb k_ uNL)Q {K DK{].q,30/7,5Hu(?dI(` 1 8?w{+93>u}z8? :!"cGXU$rư "bi F /{ȱ0o'EID 9/WSHZLWȈ*ζ5㸖Y H:1xѦI!:fj]BtL>ۚ Bº@i|L:zFh~H5а=\&S@Z4 uDiJFMkbeHC4sէ5qÖԲh̹3IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/emblems/emblem-unreadable.png0000644000175000017500000000447511362134553024071 0ustar alexxalexxPNG  IHDR szzsBIT|dIDATX{]G=bbvrME]4ԕu:K[_?"k)2CA~k?gls/?п}T0*Q& &lW[iՅ1V +C_Dq|R"W΃ϿWsFM<0vOJ5Ap, }•X$qO y_~k4gy:L@dtīfg-~i+Ko|ҫ_cpTe82f5_{FkO)D5h^ɶvi:ު#U-?aR&rQx~Pt/Xޣ7Ys̾ƗH^`.n.uбd5 [**LFBX=C5&ǵ_5UY)W 7gg``YV.&]OIL%i5%)3[wL>hT8ASVF)O2K;!g9} ,P$ws7 Уk̥鞢ؓUs]9Сc!$sp2Ր KI{-zܻYMzA5cCm>K4 ֱES4rt 3VGDduڤM&Ab_VY3<O_feyG Csh (C U(r~=+Ro³79f^ p׳.==E&2 ӌN zsxG}g\,DIcrI&60Q ZyEOԥ9R$2?7S [ CbIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/places/0000755000175000017500000000000012257501472017635 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/32x32/places/folder-link-broken.png0000644000175000017500000000324511361045050024021 0ustar alexxalexxPNG  IHDR szzlIDATx}LUeǿ˽HIlHBj&Mj6[3S0(Y.L|GT.3kp/Ery=9[[Oy<GUk>L]>VUK0gKdH^@p4^2]>p\=#;Ќ>}tٽ:l/Px@$OAm KɪZt^KqH}j;RTEЭ+GM bH\Ȕ5@X({Qu+,.›NH<ЃR@uB%Hn .u@~鑨x"P?f0*D0 D0[J9+-W-_@f*@ZgfnW $.&rp>(h(D2nznh#' )s|);p 9" Wt$ɸ#^ 4n*rUQ.fHNAY#5dE0T47w$?POZ'&Ve-07D=[Xs!L? \׻qDsd?Si0`~6$?;z.1mbmܱ#Y7Xr(0rRsFCua$4Eqc1Fej*wl9xկl& Y{@B $uSH>X(㺗 0hLx[4XdUbl$sؙ"mFB`T2+jtdMm)с"˲]Fu0Cڦ~$ B M(4$&f"&ce c3e-.adLN)Jw]'мI2n&Q`܈7 +<:zpTz{JlӶQ U@tCSVOy7:UĽo(x1lne<NTp4r }]aMWhxSa/L@͆ ("T^Lm ZvȏDr "zz U._n:y]ѼCʊ2/)LzDȌBxd}1^ 2&Ys>zK2< lAKIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/places/folder-link.png0000644000175000017500000000301111323355446022545 0ustar alexxalexxPNG  IHDR szzsRGBbKGD pHYs  tIME "- IDATX[S339mU!4BdmLE  x0.KLܒ-h%HHA$H*B ^LtnZ圑$^|߾_k?c]UEWo9P4~s S/ yVۿDӸʼn) 899RKH`Gb-%KRxz??\?v'q` 8 fN$TXSOzs~0L0UTLA=pW—WA3a6)֓菱 &(f=n:j0pspJ}V !e x:T bL9fW; -. df 9PEYĽѬ*0)X)>nPᄖYiz#:JvjjO3'yGij{捫Y~՞2L1us+[~\;T.?d M=ȯ#q!֞sz Shݷ^ V3T=*y*`]19jm3\FŻ8sqsr?L~<2 IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/places/link-broken.png0000644000175000017500000000143711361045050022551 0ustar alexxalexxPNG  IHDR szzIDATx]Ka쎛J&Q ceBD/`P}.>A?W](eAIDe*b殹ή3;Ogv7e&= 7`Gt^K={z6]3fA >5[X`5Pr=dÅ&Bt l>rOePd"[(sZ76DOCȠ*eLA Shn `)egu*͞C]V$Aݺ-x-Og(bsFqD!1`dx OWДhN\4Q/0` :Rl>a% tPp Bof[Z&[!{.*+|uuwS/q:wށ%Z#<4:f>*(P{5uk<zhtzI M]VfKkj%Uv+yQsx%$IJ!)܂c]^/#8КI㕲߯G`3p}w 7F#P1dӵTXR+'!$ׄ]| 0[6IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/places/link.png0000644000175000017500000000145211323355446021303 0ustar alexxalexxPNG  IHDRĴl;bKGD pHYs B(xtIME #K(OIDAT8˭MkQs#4֊"T VX(m,. fGŶ ki&G373Idx0p9s.cqn} X\+ _Żi?xnSh"tIo&Eb[IeyD"pj QZ]ZrH%pS Vb@4æX\?`Qei+Y  fIy|%\3 _\t&P(emBEl E2 @xJ̯BQ;`(Yip- @Ш iUr]E-hmDŽVlrfv9 ip2 N@EDK.{[BAZa˜[ t*/MVλ?4$+}T ib@R/ °9 Oe]:7xzGt\.R(;L_*OF^5T)D Jebƣ"VeUߊcl.wXora?>V*ڡ.|eZK:Draf{pj&ǖ#s1I[ •G("OjEu3?:!nAnC:cIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/places/folder-virtual.png0000644000175000017500000000304111606044311023267 0ustar alexxalexxPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxŗKH]W}(jb0!cEDk;bP 2:̼B3hIL:&[NbD@ߏD~Em؃xkY9s^׿aYT*L{Qlll^tttz|||jrrrroyW~BzmSٳҬDž_8p:~Lفo=nt)vvvvd^ *** 0!# @[fff/--=@{{+11[n1pS]rEI*aØqlS؛7o_zYSSӢ///ý:Rɷ^|ggGhbqnFHzfY[;۔D_xppDXի*&&0/+ 8%5bI<ˀ8NJDDkfCI= @{}}] {y‚b!#uǜN,A"PGpP^WIzǏ:! Z#ge5$$$(iJ`Љ"{xxxsJ:cvT xfiXgmm aw8;DN!MeRR$-\=NpysZҾa!'hD:ҔXL櫪FlppP^`Jю)AqnllDtuu؉ yvSJS)BwH_'LOOyb҈f%<,'4Gv\VVx4 BL{=eKsss:ڔkoU.Zv $]PF 6`\=9QŠvK3 xF@?b%Z) 1@fff4Q(ׂpXa*;;[Q)&ںmHD?l ˃Z:hJn<w;;PF k.7٬4@#Z#rRR,))!~tљ?y)_a'ݍ7Tee%)a :JqPWl\H)/Ka [ZZXtGx, 24`a8v*QO=c>M4 $ q*yNIljbUm]li\f|a’h-ˮT`c_m;Q~˩|A?sfIJո򻨱_EAZ\eX҆3d?Od['P''|DZVUΗ}v-7͠io߾?'[PPVe`4l*QGWFO ,P Vk(e ~ -l%KhrK?$/e3|/ao<ϸ67Cñm@UXn®߇͘[9ŋ*a\5`oIڕaSiC?T@N" g9jYS)%.z?4·V} }\<4EkN_mi%X5tLMĻ?c: IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/apps/0000755000175000017500000000000012257501472017331 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/32x32/apps/utilities-terminal.png0000644000175000017500000000272011323355446023665 0ustar alexxalexxPNG  IHDR szzsBIT|dIDATX]E?3sv/KقH*mIȊZ5jW`b|a !"?^@ ?\kBD(Bn-l*w3gf_s=wƔ_=s3y3sOvF&JFDO^B}iqם |ͺ߼uڑU$|"^CQklKя^epxhX{,IF.Zv|s??ܘxK.9:o@tBkcL/3\a=AXhnHT$ZLLI@ /mO"BWz?v.|=Fk @n!R(?F5l4yXh q"1whm/Zq.ID:H Lq1"Y(욃>`9Kz& $f`+ ̤WU+q$bL@ i`)`XvR=f/8h4kU:KԗN1͛0hdfXBLiԫTiz>U1g-sxv0d |[oa6[/235E>ѐ6+1}ɥ9RE(j ZZ\} @DPIĘsāMח8,3CV_B00OsEG1`9WL6i!M= K81^_m;3k5 ;װyQJt,JkDDxDDeer~,} ^Uk-N1 O _z!c7lcbE#14t%ʻ}lp+HĹ 1`M y&܋{S1]W~%,@X6۴'~]1_+ثP|lYg-^X0Z#6WvHcAkݓֲHҮ Eh!HjWmW[sՆN?`=AJv DRPZ{~ wB_ĝy=_gNr4#ۯd &FYi=|0~ULM.5^K9$IZkyUɴ6]ļ44$IrO{e bFd%eM h%c}AE)N$ç{ww}:SZso6'ǂsQ@ @8 a!\N\iq f)zJr8^íOjͣ:n6}nkBřJF@:co 'qE~I9kys;8@y~Pk>XL\}?#< (P"^ BY#<"y}+fg!;j?0x9ǛߩĵFTԾ$@w~ T]+5ݱׁ 8J 8ƌ7I ` 0]p[uafXS ZۈJW/tV6H/</:T3 DxQ=&9FxOD\*J S8fs'`p +l:b4SsEB@&O.d jrWS @NhcK{ FD#wW!9TA\x{IuHRCCL;YN0e=VNf'I䀤@ʊN(X|"jUNlũ@vQ41<$(dIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/devices/network-wired.png0000644000175000017500000000332511323355446023323 0ustar alexxalexxPNG  IHDR szzsBIT|dIDATX[Lg.k\ 6d FtEZ)ЗjCVڇjH]U}jPiDJza%"LVnl15YJ~ҧst3_ȳ`mEQHW @4xڵ杝wۿxV[;vzU|ABȝދE`#EQ۷o,>\O?oih AAP-zpB0uvv6P($,@Mf__v>w70 ]AQ,ܹh{UU?{nzx9\6 [0?A[P0LАI񱮮.oaqqQ~Μ9c%0j5M,E 0 q4 MMMBOO%J]> ,ߨ*xaLMMAKK P.A!MhooGXDPe'NիWA ø~-L&fBNq=gnCQ@ڸ+!ɠX,brr0 Q1?d2?|{/ `ѩT*ikۻQT:DQD<GGG1>>x| KKK܄r_Z۝pP=f;wށrڭ$vE_ Ah!DQaeY'7o>б{=)T\֒Yt>}*$DQqD"@RP((}t:)YVp,K C TUDb ][[}>"P(vVjTlRy^Q߿= Z2qT;LoJ7Wx,p$I21 QHIRyQJ+ù9UsiXRY\tyEQQa ԛPs~5Ƅ 4O]U|~m*+ƾ`_> {uk2(%ruIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/devices/drive-optical.png0000644000175000017500000000247211323355446023266 0ustar alexxalexxPNG  IHDR szzsBIT|dIDATXMkW;3Fm81J1Bdg1I: 6n ?q@ EC8El#![3sdl5]B_t99GwY"877w$0FX,~}޽/'Oׯ_hR `q\)8ѥ?P(tqrSSSJ%,BcXY R'&&ѨSpT';m$IFGG_|x7 jGz|>pm_x<>dVA~,b||H$2`vh4͙f)ehOviLNNloorI*ʁyPz'N  pҥGFF&mkKD J144tP(i/^V8ήZrVhp)MJ.EMӴϳ,j)~ձm\.a ѣs)!f{H)㌏z>؂+gϞ:"NհmӧO t:M^*n[VVűcPJ{H$ѣGmN/-۶V+8{ۂvT*nܸC_u&''w<BB)^SÇ>iJ)z{{㻪qMP866H)}(۶FA&appZCHӻi8B,"Hw0@.ٳgH)9|0ia`Y4LbY_FA" Rׯ^b #1FIܹsai0 v:RbH\FJix˲hZeVVVCut]$5ԟ<d2 "\p0,Hgl6B`rwL&b~?8O^PR黥ou]O{$I޼yC>gttԷ7wkMӐRcVWWy J]׉D"!Rmll|;G~v^ v=f6pff\6SӃiAU)EVX,/nիW ; TI ؑORԔiК*Wէkkkݿ׍-7T:@(d4 ;+HwW%-TBx-2\}wxq濡Q-˲ IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/devices/media-floppy.png0000644000175000017500000000157211323355446023112 0ustar alexxalexxPNG  IHDR szzsBIT|d1IDATX?lE.qq.X@C?%qhP (hREAI!4n@BD4(ȊB6Etybwf}w{xٙy7;7}v&ڭ;xd_\7VV>FQe~" ;Me~?`Pw]LW^囟R#UTr"pO7iȇ?*b(Е*YɏC@tmll+@61[H<nFFHҐHe-A8n`P<' "dv"&C]` MeE{`6t _{{/ٳ#IP?дy .|a12]Č?$ mg,DZ% C(" þek-qchH3:1j5(⫯awg z}0 1jq'NK`Y`R/V*0dwg[kXki۹~D)=1(ɍ1 WG@Pmh`4\#(j-6ݖHp/ RGon3;U΃ #^scufϬ}=4@ 8] Axq|1K4xGd-$' 3Of=&n_x]j`%_ft1>GI֥Ǿ<@EKj3?ȰsϏIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/devices/drive-harddisk.png0000644000175000017500000000220311323355446023414 0ustar alexxalexxPNG  IHDR szzsBIT|d:IDATXoG j T(mA H""BDI*(z˭rg=s?@/p+\!$cٻJ+3;G4{{PXR:51R*M?0ѣGZwRonݺ866qÇ;88xNw):N B x+дJ988&7&ovmmmVJIE;XrBvT*1ZΕQIiJ0 lAkc RJ\׵mq$ ApU1?7q@ZmXv0*8A1'OĉkrK))T** ~*}WJqEWk}B\^^& C:]EQDݦ롔QVj5J^vM6y͡beeuKWx%Zk{2nAEcyΫoA֚ӧO>'PLdڍ> P rtC#?&>` |>IENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/devices/drive-removable-media.png0000644000175000017500000000170411633361331024653 0ustar alexxalexxPNG  IHDR szzsBIT|d{IDATXK[ǿw iBX4}TbT)Ң\!Aw]W"fvR !-!1(F13vLz3>69sg|t#i-c!M1Cx(wtt@UU躾(D"1:22!!9_5_]gYx<ӽqR)8MMD:0$Izq!M7d(ELP$/--yEy>33?88@\J&h1044tX,>s`300t:S"\H$- 4M5e$|>EQDӴrJnUUe42ݍmG/y @bؽw!"}Mb+++< T*!O+ è>H&BGQE@5}>!~co׋P( Btm@9==F5߬Es+I |j[H$ꤳ{{zi,NNNrxW~[5~W UUz+R{.1e$KuQ(0$ C8*h4 B)nPJR===#խ~ׁ@hnnF63 Jo64tPx :੶6+Np( bϾ+{qIENDB`doublecmd-0.5.8/pixmaps/dctheme/32x32/devices/media-flash.png0000644000175000017500000000245311323655670022677 0ustar alexxalexxPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXŖMlUޙ{,+B&\I"!ĕ &~.Xո(Qd΅.$1UAh"{3s{\׾jf23gsU"iQ#o"ٴ J@4U_w*#JFo^~k-\k%M2) 17nܠ1bقje :C~O^?6ŞsbYz߮WL݂'WOk 4xm}ۆAڂ:"\w3xBxBi?.B /}8'y<< جAܣR?£{8f=ŦԀZJ,H#-..lFx 6MҔJ-(,n+"m/}j/Be4y6"8t q,͒Y c!K$IB;R8Ađ!e)` tJ`mF.qyJҚڌ@wPC1h6% Ű= 'Mqyu%\Qf䭋3_R,1F9(QwmI֒&)3|06#M3@(n%"c(TF0:hiYRw0Dۜ$C [D1b- 1P@RJh"G|$@x3шyAAp%P`hg tzv9tF4b|s|;ko} ߋ|y_%"w7o֗e&IRc.)Zy_yV"0}ve5>>JH*j޻w ZCv<Ϗ=XvPJ}}fbb,); (1Xc6all 쬏1>e}~/NNNNڵK.KKKrh!*1hmJƚFR4K"c;]yVG#/<9;;WZz;wc1@8GPaH,uNmeݺu?Ro@7cuwQJdp"G~IYht]bD#8TefHzh=w޴( bh6! .\ĥ%^O١n@X*i;1gO:2R<9 zZk )KR |h(P@ݣ;|ڭ.NUU11~⣏>:6_ڹs!Bk Zb^DD\2kkc|QBڽ.-S%8!05M̊SSS91H b^JCEYʲqShfF&'?/^ZZTS@e!VXkUCRQbt$zOJ<>E)\6>|{ƘCι]$i~zyK NviRXպ;6vc$I4FS_b[o~(,:zg[˻ΑeJ1 .%Day[ˣGp1=ZGd:65XZ}(l4lA?| DT@7PxZ<ZGۧ2#XEY "Y-+391!!DEA!@ $xDcC"Ph."b@4{?z\).]o=֛Q"h-X-RQւ҈6(eր`RJPFdP'#>y>?}ί@h,,, .V}n|1c*B#q >DB5g^}եaW&H`%gϺÇa oz74ru^#`h1Xa3O??p@ 5 [={l߿&;mVozcU.NVsӧO3N_pa!cCfg;>8 OZ ӁKmj FT28=st=r.~R/Gh3 u]yNHHDžJRem)xج Nlz;;;!h4tYp}ݣ%Z^^T'Jpoe`nT#n%<::nWVU垡[apjjzv_ Αy!./>X=NCk:*eFya~x߶\i %-د.4~N$ba2ÉW<7SӴ^`*or,5ob8# Y\wwvblQG26@4K'89>snFÆ݃zR \/!A cjܸ[KXz.1CS\Yd< ΀df2hFs miոU)Z  #s"9DZz &|v6jT.8Ɩ 뇏һX6f!@Tv;!ҋN4McYVA74>|+'Wxy~s'.RBsf`,`Y׿-JWdh+Ű ~dqO5 96,X8ۜ>@XdmmB^6UZ-U* vFCV*eW(K) @.LN7iOUh^Re%7VʗѤQo_&!_2 Z$IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/mimetypes/package-x-generic.png0000644000175000017500000000153411323355446024364 0ustar alexxalexxPNG  IHDRĴl;sRGBbKGD pHYs  tIME #cutEXtCommentCreated with GIMPWIDAT8ŕ?\Eg])beNDo"""(6vFAzD `eYmۊ e@ ɒ,f!B09so|g﫷9=ĎN|imd#Q}˟'">ldJ>2yҟ|{<Nzy.[Ի߸ eBv\M0ϹgXOOqב)M2N6rn,6)ǔ p#gοOӖg޸ +KKxs/\9ʤj.mH!Pb <}1bKخm.kV] rr ]b>jl\3;C*r1fYr0ez -9=\.y)rOBly f|pN>Uk˜:6M\9y 2UL1z4,K}4DU܌kXVsfAnT}5;/ M`v5<Oҵ4m @۶kca ÂQy,>u0T FnM.Ϡx_ys8΢ۛ(kK6K(]Nb ;\>U |ߊoU޹IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/mimetypes/text-x-pascal.png0000644000175000017500000000172611312762055023603 0ustar alexxalexxPNG  IHDRj sBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTE$$$***883999DDDV&QX%S[(V\'V\(W]&W`&Zc&\f,`l-ep=lXZ_eblgkll{uxƱƵƽ͹C2tRNS"1589;=GVi #HIDATmN@soS("1ĕ[&k< >ѕ,|ݩD%Qk@~2tE[L w5rrI;gو`@N l1̂( (o ZECLf2Y֘.WPOݭ،r+Cp{i9X  icF" ?zci֕ ;dLzݩm>Ul ٦\{]Bi!P-l< u/c|Jq}st-6@qT$u1DY ikiHHXL ЌR v_IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/mimetypes/x-office-document.png0000644000175000017500000000121611323355446024423 0ustar alexxalexxPNG  IHDRĴl;bKGD pHYs B(xtIME  &IDAT8˵MkQs&&,ŝJmĈB"Tj$ƅ??&C\0F8bR#&bn&Lf9S~\)ns͵;rdʕ%Fj5 sI&)l677^DzA/^8GFU-[aL?VW2UptӼƇv@dW[G:M24?w҅y2 }+4xT Sۭu~v?;xR4bOoh 96 IP .@Zx.Nc>{nƉy.M)D`*d,J&8,8>^ϑJlR}^ e4v] E /`PAj'S}fKKז.Ob "TL}:80_tDP[DVp:'OSylg~#NoHںm|g>dfIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/mimetypes/application-x-executable.png0000644000175000017500000000202411323355446025774 0ustar alexxalexxPNG  IHDRĴl;bKGD pHYs B(xtIMEZIDAT8˵oEǿ3;];~*c;nBS(m)ATiZ m- \@ "rxBBHJy[vgnDHv>7O/|2^'o}o=(o~Z2;؄p]?kzeH*1=|i?8}!3H,koLd铠ׯ:ǁq۴籜޲zp ȰC^fϡV0  cp:5`us>+W:'ous^eLmyeVтSaPB0@ JG|9qXf.R691tv4 jD!66->#emʳGZ!gdRnfGE-j)'|hp)o*ʉMcueM&06eoX)6lA<^`1f -c/ 8`xn9IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/mimetypes/text-x-log.png0000644000175000017500000000151211323355446023116 0ustar alexxalexxPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵUn@=;vc(} BH; 6ln,݄?`۬hDUďuZ+D7gνsmH)qalТ+Ax$ Pa$"X1"MSh4FF=^9ömhLvLxE!fWżT/,CFh˰J%B(ժV\L̋GG,VH, v8i`2IH13R;풍=?4I@ɂ37Z[f2 !X&w–[B D`s(aa5Jd"@H R{gg(O9ajdap\zBRi$!LSm-La*RL'? }k5fO? T'뚎 jcUrp8qMF \Њ^3˭C (1'ꀨmôq'+S) 3dp.<4}}k%l6?mnn%m_Rml8VW( ~ 8{{{n˝s\ >.GkG5~!)LI O 9< =ϋk0_?M1zo`L6)IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/mimetypes/image-x-generic.png0000644000175000017500000000160411323355446024051 0ustar alexxalexxPNG  IHDRĴl;bKGD pHYs B(xtIME 1)IDAT8ՕOEޞޝf1D#Aѣg!G \<+xYL uuE#nc&̄=d3;{ig2hbCQUۥN, ,cX91Qy>M!F١z@: ,VGgÂI>|?Q)[@oeXGm#?Œؽ`IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/mimetypes/audio-x-generic.png0000644000175000017500000000153011312762055024062 0ustar alexxalexxPNG  IHDRj sBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTE$$$***883999DDD} yz ""$&q'&+ 1'2&44:w6:= UBZZ[%`1wUwR}NzԢښ֩ƭѳ߹ꬽW:tRNS"1589;=GVi #*IDATxmѿKC1].X-ur]EZt"qTGApE*>l9H/ \>]`qPKO3EL)jg61bkQIYÜ%( 6D U" #!T=?QZnj*éHlOU5K4֞TxU=7by'Y(W} xiw~LM6嶗X{fKa`Yo"qR !…)٤pԔI!\9WN9&K7AU>wS&_Η/]ZG,?IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/mimetypes/unknown.png0000644000175000017500000000150211323355446022604 0ustar alexxalexxPNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDATxڥkQƿôB$ *U*B! nb7-(t .|@ ԥ":$)$h褓OkH>p91d&$Ir?Uibn`'_bx<,L>@ 3<||GYhN`X+e Y. bMH?-9?frhxׅl~0>gzYѿIӋԥL5D/pzn\:fY8}V  ȡ5ef KV1JQ3h2b,m Ջ2dki7Jt|\X w)o ׶XA`_ WUZ;;Hi|"|O85A/{w_pl ou{֚n@w7~;&Z/= n[Ɇa0p2"0`^JRH$**cdakԍ*RW2PTB>gBa;)&9Xcu1XfBHӍ;L)O|7YȞn5Mc`EQP}jjH=D5 P Cjźj5\r<d Qp~P(& *u7^S&M emI@rHIDR|5P!h;DҺHMJ@ҸAJF4Q:.Y"m~I'#+,3^h-DqZLmT}zHi断4K>_XFXo'8 .A+WM; /-/,S'iWgDkx|:Z0C>cqp/2oLeNIh⥟fxday1XPSxeS0OQ oթ'<=6|1fjl(% vԕfp>x'fY 7[cfׂ9 ffjYLm*M8Bڮ譕ۡRr"E?C(Y]Y Lg`IeM jv&)J0@KQ5]jml׺t n7MܣlLa}I<ȉ ;;jkt3IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/mimetypes/application-x-deb.png0000644000175000017500000000203611312762055024404 0ustar alexxalexxPNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDATxڵ͋EƟl%?B=yH^r0~EW~EF&ٸ!dgLOvw}VΠۘl;O[UyR Q,Rqv&yy~[H .<`z;\sO~ܻ'#G.*洊@Sy6бDh@OO+>9{q&[Bp Ӻc@✴փ_ydl|-Fv{snxϾbŊx[۲ؐ##+,0cOXوPQ8Zd~;{ Vnpo `LVt/`8B#q>z+kAWӅk}]^.R*0׭ZN$b~ /x#oHx՛H[m} ,}}zNy['^o4cw7cgUBu-pfhNęg JZkVNN3ŔyҶ(_+1(ڊ[fMFHp} H|;/b[IHMa0eN=f/ӓl(0"(.3AAY16%̢IeX~˿zynەBfG*1}T ^Ox oSXv:!IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/mimetypes/application-x-cd-image.png0000644000175000017500000000173311312762055025323 0ustar alexxalexxPNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<XIDATxڥMkV_]}f$KNL&4qB]ol %Y q ?tdotu$Mp3Ituz3;遗+>=G#,KC/AY^^'kZ?Tk1O-x4:P$CVcvvvax*6(PU 4ZU9B6ty0!3 \QW=WpNq)iO CZc#o]$%c=B[/b/rpHE`tkH"FgLPtQ489:|'0b0-FP ϳiy<LvpsƁ]J0nBtYRI5jgt  H"YÍWUs޿tIȊNۋ`擁zd]/q։ hq /ߓ 6#KsyH]ʄT}W(@|YcSPS덦8~B=&Kz0'VlׄE&xȳ,Sk@>$ )I)5Yiz#$IDAT;nQs{"D44Q*`Y԰ *$`<9bZæYg@]9;|舄(}PΞv˸ &E$䐈0Uz*/"f߼ Up?uٺ1KHׇf'Im|<]Tpl2*"ۮpiκIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/mimetypes/video-x-generic.png0000644000175000017500000000160411312762055024071 0ustar alexxalexxPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵUKSQz#S&Oi24"ShЫO"dWD"3={ "fsnw;x2Dž ?=;ws>\ c X,* ?9$eYR(iN2a|*ji ȃN#H@\ ǻsl!) s`~PEߚnH^d2*§eϿ+(,r,یa||sso18x'O\SSwUNBP2ё8QWCcq3Ni gyUvѠကi"ׅ^ͼ?(IԂa?M4xh葡J3"r},>0xhllWymWQBI`@gAtM֯6wlE Gi~8*+cKKKbq~WY %%dn͗rUCQT(F L2ƨ \X6ķH(x< Պ?Ҙ .1m7:A\Y@Vg\&ԬF &Jc2^__`{7!lZ&E"YM%iQ9,LD"FaB2mxvbojULOOM 96sƏKʍ䔏$b, p8̼^kZA#-񯯦 1HGQ2 oIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/mimetypes/text-x-generic.png0000644000175000017500000000151211312762055023745 0ustar alexxalexxPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵUn@=;vc(} BH; 6ln,݄?`۬hDUďuZ+D7gνsmH)qalТ+Ax$ Pa$"X1"MSh4FF=^9ömhLvLxE!fWżT/,CFh˰J%B(ժV\L̋GG,VH, v8i`2IH13R;풍=?4I@ɂ37Z[f2 !X&w–[B D`s(aa5Jd"@H R{gg(O9ajdap\zBRi$!LSm-La*RL'? }k5fO? T'뚎 jcUrp8qMF \Њ^3˭C (1'ꀨmôq'+S) 3dp.<4}}k%l6?mnn%m_Rml8VW( ~ 8{{{n˝s\ >.GkG5~!)LI O 9< =ϋk0_?M1zo`L6)IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/mimetypes/application-pdf.png0000644000175000017500000000160611312762055024160 0ustar alexxalexxPNG  IHDRj sBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTE!!!999ρ33ssի99ڛܪܷݙ,,޼LL22CCNNᙙ;;qq⛛QQWWJJ]]ccee00UU鏏uu눈뫫봴뼼~~퀀퉉PotRNS#&MS\l>z#BIDATxmWW0apV{ u[VQ 5 6n)'{Xsfp_ZS,?ˑ27 (I Qk\QDRՉWXa m!q<$(/X|(m^شtl6s-B=3wz%uѲFcg8@m:zr`V$cayڛK|D!0X*\DA*C' H]UZS$kT>H)퐵Ve(q<\_H+aP RB3&Ȓvd(N-r|Gw\ {]Gm8﷖9{J]EInH#vq׳0 4Z#"F5=ܮyՍV g8 h(!m^7,eK4eAP@99.Z/˄ڎy"v!c~/Z%M"F}NF ԓ%cn/YG &{N+tpQ҄ᵽF! HVWl#I(C(p*71$L nY!-؀KФu4;<Ll9oÃ$] 2=n~GctK8jKFrgp1ZAEA vFiC:d%N8c >/~\[Gjw\T'\q #̍{ tC/%x.^k/N<#CE=}c/M(*ez: cE.I*6󻇸>d̵ g}e4̹˜o, ]N{m$+sk"Z ^)7>*#7fՉ=;;{>xwyyk4ʕ+fqqqlV66F#[h/Jt:& ?dJXGF)u)"333cͦ_8xOpM:55hǽLp.tK V? IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/0000755000175000017500000000000012257501472020024 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_filespliter.png0000644000175000017500000000276412110457565023545 0ustar alexxalexxPNG  IHDRj gAMA asRGB cHRMz&u0`:pQ<PLTE 8NGgAbAcBcGf 6K ^i][[dffegtvvucZt^x LkjihijiiciНߘݎ̋ʘܡ̾yluhɻ¹ncs`ocûڞtiq_ubshq^r_p]vko\o[mYtiznxfwdubvcvcubuirej[gYfXn`՞߀ո熸ײ捼٫ܣޜ̇~{qzpzpyo|q΄{hYucq_q^q^p^vcdU̮l^r_nZnZk\Ƨʬj\tap]p\k]˭ͯtbs`l]гj[wdk\Ҵٺm^k[ַ+(tRNSGEvuwwmjjji^\\\mw\x]Y@8C7@-YbKGD~?As pHYs  IDATc``df]CS ut,-MN.C#c 0153 mlll]llx\=<}||7W^аP^ظ$ HLHNIcOK/.,*NO WTAUeEuMi H jZZ;:{z{{:;Z['L4yiӧO:efΚ=g /=keW\zի׮Z~ò›6oٺm;h~7i0ٻw>|:vN:u3@α(qsϟpW^~ 7o;wļyCA'@/_={ b?~- %-#+r*PSv&zZ%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-07T23:44:44+02:00-NtEXtfilename:origFileSpliter!$9IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_copynamestoclip.png0000644000175000017500000000302412110457565024422 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  IDAT8ˍ{LWْ]bl1LvcEe)"4h)-RZ-b\, HfJ)dqS+"~;-pa7ys߽vHYwkV נ+~Z4f⪐&!}lZ%TDX VA揬jRQY/z.!C<A0d!؃fQ$ 1HX4#~p,7OPan޼f$*7`6F>#؍pE"{К AƜАΡUg6}jGx usbp δ >p`tt v#.Ѡ;]Z,U=KCUpff##¡g8D=M NCq)=ڬxcp,0=~v@8t0.iDɤFĮI.X :jns'6m=gO:? &''N n0r-?*)S.3LMM&S"n2$v d''~ OlEl"#iwE1=Lm"cC0Q_o"^WipEq446`>^񌋏gG??cbqq?GDF"/*%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-10T17:12:16+02:00:}tEXtfilename:origCopyNamesToClip;IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/go-next.png0000644000175000017500000000164211416270327022114 0ustar alexxalexxPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<4IDAT8[hU5bE))('o탅 5ЂVAE"R|iII `Q>EPKiCZ )bK4&*54KԤӓe^>9u6чt̆5ڋ٢\ &ձym-76v/)`/Ty5oo&}?k6kMeb&hhQwYu#sN7lZlU}mʖӯȕ=2'Aա(N]Cwi`l|jZ{]NԞAőYRVw7{L),>u 1JDDdKiHdC4"ICb!-';Yq궆=AӢ`JI1.ҟHBH*Nb \ah nzp|p1dx[r?>S3>')jSDnXh40<#x,)gMv>끪LՕ&R宕O}˟>.PfYK!}9^K#fIwp)#~5CgsYn)ξ˫ U"B"g&MGZA*(AۀTH΁sK.S)SMR-'4IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_comparedirectories.png0000644000175000017500000000303112110457565025072 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  IDAT8˵ LwۜCQc)EY1t*l:'LFqh&*< : X"ŊnV(*FuC[I1[K>(U'-n>}} *j{>O7]g)zalsRTEpZ2=, |Vm&] rxp8ݮ=6)Xh)" \Ӭ@UOSDJx'_nSG0ogU)X"e4nK/UQ+r!OK^ST%.Vs!xte" h3xs;>1|Z ' V٬*01Ti`ێDpQ@zx#S\e1^f ij2}i$UD`Mvke HEAog}\9px9pO‎dܭ,]Ѐ P)#xh*~S;3<;X „8mhSMAmNE<;~EPnS+r(f9:gnʼn0>>zu95SMDM߲ks %"F É7 j"r%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-08T00:08:26+02:00i tEXtfilename:origCompareDirectoriesQIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/go-up.png0000644000175000017500000000155511323355446021570 0ustar alexxalexxPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<IDAT8Mh\U~y1Fd,m1ŶBЅNRl) #.YKlRAp+?@\u"P BHݸ 2&LN;3ȼRK9p]=+ffF7tl6OMi'K;Ajۻz1b`T~`hihϑbϭ{'֋bp,K(ϒ{tƕVȷoD_޴Gƥz7āgKWjX|=YΝ wxpRSgg{'-.\gx~]FRgzURj~Yk|n)C[wӕQkwCwTObS|`PxYC]=}wU ?f1NaX =i BP0#y}vW'z5 8Vg__W5ϕ`0AUV~f$wFfЈFm ASE y^B +8o0N)6wuWȲ9)dk͸ B(IhJLQD "Jˀ|U8;J ", @$"q6w6u@kz&"g $<4d$S y6;Il3lIs$WI ,IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_markunmarkall.png0000644000175000017500000000344412110457565024060 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  IDAT8}T 4i]Y#^\ZDS!#-D2Tn-YfLJ4*cz0*B4fƼ<9>ߋ +a3:4@$HiOi=(Z /EzG1BISCze6rȚ-Az+)7pE=|ĭyhIGW4Ȇk~, w'tF}E^RtcmπŗНs!YG$HH}#_&ڕ d`>p鿢v1~Z#?5b/ܢ`yeILw:}y-@ouy"rΤ*vJN%380gDH}ˡLdp>d>-݅<@" /qr$mv]힮aṣ,Ou11竸EDyL f d^y YVmLϥ̡u0] ApYx3|OjtcQU_ߘ#8Ws xS{ .Vz.N><83ZgtVR=ڢ`7|m=>Q80_Mc܆ Xf| Cy?T|~Xb/@Af/ܦ/N(@79kjmj,?js2UreFfx3&)/m yNyDy 0]7. >xUgdlOf#YRQA 3 yj zCg>+:{#a $]7l1F%ol!*]0u%?@gv kV9'*w/;zL%с|LeIx18D?`C̖_9o 8@3OŜLT|XT.8|ͨo.y֞B)7& eQO g9M3+ rb|z_Lt K3kE? c/0K抂d(cR耱Yq+sbj6#I)yςkǯ+G4AOVEpEY!t! BW8Q/4 ^m,Xx\v_]H!KylONEፖtT-Xn > W` ȉ6x]?ziq$iue.:K-H_7JڎA4P}-:Ij⢛u  4T鉋$Vt%D2M4[w:\`U_Vg5C?mULGQNVsBeaqA џ0IDAT8˕[LeG|1M&Z/h|0ŇĤIF}&5F x@ piʭ(vAB , Zva]f37feؿ BO왡M&F)5d0Z[_RUR;YF[5ü!ʫN("MC r;Dp8x<+##-GN>S[nP27NcPo^S! %.ˑjNg粎"QrTլ.mbޱ|x}~A`S6]SmHtL})o͐Tp0k@{3>Mj|d}*8Ǽ^8!鞂yv|u!a|}5 MgFX옵crzO7*R>˜]*V_Q̱ηS~ v sƾݨiLxbRŒ"-.Yʼ2N/h'ƾ d܄{ (RYXM-{P_́~yC{ ! H0_;s 7H) 21 z~kՊ z?Ā 4$ b(mE/2#@n,E*@z@K }yHDrVE ㆓vaqf=1?)H +$+NW:^Qְٝ*VerN$I] Ǒ}_3wA/aR%;A<ժT*qDD.m` .ȃeYr(ʵU,O~)c\ʑ含wl^ou{.cf#þeq=b=qlFIi.^dž{E{LǗ/R>c' O#=[Sb%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2010-09-07T00:11:12+03:00OR|tEXtfilename:origMultiRenameфtEXtSoftwareAdobe ImageReadyqe<IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_closetab.png0000644000175000017500000000233612110457565023012 0ustar alexxalexxPNG  IHDRj gAMA asRGB cHRMz&u0`:pQ<PLTE;q?J_O>:q0@A@~MwP[5w6w6waO8tUnyxyqEoVUEo :afl@f 4VaqMp @_ǘkw_38@~KutcMJLx;vvTd4eE~E}D|C|=oe|/!."1$1%TA1%w%G7G7w%0$P@0$-"H8YG\JLgfegggeccbuwvvɕ̓줄qg|jl|jukra}h\CP5}inՙtkq[K0I.K0t^okmZr]rrjSn]aNs[HjUq\o[hRgSkUiThThTlZtaubYJ]tRNS $ !%x%hfQj!%"wk_f7<vuy?ae  pHYsHHFk>IDATc` 021 V6v('/ sqED%@RJT$*-d I)VVɅ¢U5nuҲr0amhlֶΎ.=}>00q)SL6݈ -,g̜5{YsZ1XB .\hG'ptvYlV"U׬^Yg ! ;qhXxDdDxX(Z;FEDG92P(b4ֵ%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2010-01-05T11:49:20+02:00BptEXtfilename:origCloseTabtEXtSoftwareAdobe ImageReadyqe<IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/system-search.png0000644000175000017500000000236311323654424023324 0ustar alexxalexxPNG  IHDRĴl;bKGD pHYs B(xtIME uIDAT8˵mlSU羴kGlD'c"st@ Q$!qF&F3Ad|N!pQ?2! ?(dPCm]{W~{=vI!cI=?O>b ^ 4mkSsՄ2J!R{w7 `xnӶg2k׬5f0<`M&L${w7y ;?1/w5nzp+߫9,KT* Chn*Ŕ-oo%"ڰj-HOoSjW ч 77n5ViF8-dN͓]FųQu'Z^\HQK !z" -D"#MZ!EXdԢe tQܐ jh%I I^7 3z,r9BrcȩKF^x8O fQEk0Gls 5o %zgO<#fSJI|8+1՛қ!B73D(C ̪Fz(JLz}g 89%`F80&0F͌P;%0r2ʧ\Xpv;y"U]uchnth-IuZ.8]WV8 1N\һrÇ/&Kk^ϞKXflxݪEv 7g U53˦]8t~^NQ;P=snvsG?>}sKR.Uy^p;(G~t5: !c,[QQqѦoaFtuuRj\؝bU~8~࢏ gH J 7P(::Hd] ;5߿hjKKK_X^y$Lt=n}][9W&ba5˲,>o{rZ53 SmJ{{{|whс>f( C}- `炅U=^uDeL0@qxt5bݘIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_columnsview.png0000644000175000017500000000270312110457565023567 0ustar alexxalexxPNG  IHDRj gAMA asRGB cHRMz&u0`:pQ<PLTE~~vJ nkgffegd>SQ> a *&)a^kH79t`OQPߘ⟺ԭ©ܵӯ褿سǯỽٴ̶ܺŽ߸ӽȿzr5tRNSQ\\XjjjjjjkVR4=3>bKGDy pHYsHHFk>IDATc``dbFL ,2h@MVN^ɲ1+*) RQVRdgPS׀M - m u5N]=} 040263043 [XZY;8:99\=<<}<}<}||\A!aQ1q`ĤԴ̬lpNn^~AaVQqIiYXCCH׷iBI@SN>c欆s6͛4HxK.[bk֮[a㦅 [n}]ݷ@‡=vDSO79{ G/^kקq;w] pŋ<|#0>/bb R@R2%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2010-01-05T11:48:44+02:00StEXtfilename:origColumnsView:EtEXtSoftwareAdobe ImageReadyqe<IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_checksumcalc.png0000644000175000017500000000267012110457565023644 0ustar alexxalexxPNG  IHDRj gAMA asRGB cHRMz&u0`:pQ<aPLTE())LMO}$&')uwx\]`acd~:<=:;<,-.)*++,-(()acd`acEFGEFGFGHRSU678jklDEFOQRoqs,-.$$%z|~<==\^^HIJYZ\99:Z\]122KLMfgi~qst[]^ijlŭ~]__fgiZ\_—::<=?A./1124/02''(&''"#$"#$##$""#ǰƹȳķ!{ItRNS6\\\6 cYZYm~# R|! 1pEC Y/!kp$RBMIDATc```1AXh%TR *,-l+WղrPay5k׭PT*Pa5u 6jjiBML23 3;8:X`fڴf/ _yK@ 30CPpȚ[CЄ#-*m{\|(+CbҎ;SREwlٕٱ{Kn^OA!/TdҲrv~ʪjpMm}[Z;]v]8<>j};_ jp6_EۑM V%WȘVz] V&`ϑ1ס5E:DǸ໣KhoHDDȘ *SE3{p+vR&}0#ǣѩ_C{~,ҭރU-\) zl;%?wiNa>; s:&xֵ'<]|g2-l[+Mp^U_s؟M*Mob;q/xd҅l6lyq ZZ/F P*e-ۊ(\ t $GI6 1>rqeVg#'k% 'Ňh[%}*'|Y$Xuj.#gzFe8ZC}z'4+ifE6B}}Grg,pہז7R.t^|~h^@5@3~DF.=K.93ۆ@B啛g^RyUj5PN&cJ^rUbԄ`օaJ ?T\n]GB=C]1%_vV(^rTv*EQWS<%uoR4ࢤ0QI%g-7Yo xK[?(|3iUV]2FZagFl?uX(7f;%X/S}%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-10T17:07:06+02:00 7g#tEXtfilename:origLoadSelectionFromClipkIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_fileassoc.png0000644000175000017500000000337312110457565023170 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsHHFk>IDAT8mYPSW>LL_)3jmqa%\ %$nH0PF",W -&Eؾ3VX7 zn&7~w8)4>UPRk!P7^kق^NˤT;iܤp΋W"WT^aAqRE{FS9 F?*:6&D8!16Ud.%V{ ;;߽SX=""l30@J\菌 ryAᦦf(rlwBT/1t<g拫_qh_F@Ss 6cCx)`¡*vMlFVO߅cwP~/T{"酭ǎRIiiw oJӨ3j`xV=A!OBIhO`ҋң}+U?2,b=.!;vq@ @`VK%\N(rrjpFf6LrbQ>u٨P0+(z5ǭp4H_PI޼LX@YaXR*o#k`uvvڏٹ@:Or dɛ*{ V]!Ade 74jOz`{ * { + αZݟ²Zeojikc*pt\|1|Ii N໹]{}AjzO kgG09z}]7^8[zBٻ< NgA3pm~ ~] 5TYm8uG; 8,N( i$3<2:'}{#lIlj BWY qmu$a0=u x.֭5462pf4[c?*bDZx4AH%RAǨIl̍%9@(f r\p:;:KӜIJbb""뫬Gchq HHef q#/2*AT?asfA'Z;hmXJ] (|o^#v ?I2f\if'6m&cܰaÖ;vV1'AĚ^*-V¶nm/<;=?>@@?A=<=WQQՓ\YYFFHooqDDFIIKJJLGGI]YYa]^||}ttvLLNNNPKKMa^^eaakknPPRSSUebaiefTTVkkmRRTWWYjffmjjUVXXX[Z[][[]XXZqnn\]__`burr`accdfyvvefhhikghj}zzjjmlloف}~mnqppslmqops֘ު2*tRNS3\\\\\\Z'7*hcjjjjjjk^R7==3;j pHYsHHFk>6IDATc``bfV `cccgegbd҆]=}C#^>~cS3s K+k[;{G'gWA!a7wO/o_?wаȨ蘘h0OOHLJeKIMKB\1¢R8(+ WUVUA]=H Z::{zA(;a0$K@; 'AݼSt5MI*s.Ί`R_<S7ȼ" Лae .Xxj$G\42]5Nu^PO|.@\ɂѲж- 'A{Y0ovT'Y*aFaQG#o@[fz;"4RV~x.Jm1~ ()ݱBc==5K3C {"yTf%s5 6 /X, 0yNg&|Xj=]|ՂΠ;10&_LyIa>ˢ,$ z5n^hbŚzgӌ0"a>kH4ݙL=g#f1Th]8r٩ŷ'+]6k8B}Lb<Ϣ \`t7~8- Qr8b/'A +˓"kC`1AWu3{^Kul? *`yvǀ;t]N(InT+5%=k"v(5nV Ez{5 cZaNkA UPV:τsa1±W#`2Z>Tj5+|VDP!??<[7^d#6Qn*`.fF/O]5TZJ,W%PR7PT-n}򺜢h>j;=z-&/v*߹a\6iwi<%1U+0R^g|E*/.;yBF׍}33&+܇3&2|BZ]d·)_I:q0?|F2Kb0t9{SS>/s.Lb"5=zdɂچᆹᇺᅷ"4Do]]Eo 7\fpAd 3Uat$Fc 1U_pBa?|VYF:tH-Wy5g0a0a0bDi\`Bh0a4f,VyMIKJu ܩFSqr ء:ܨFnm ՛1١:ik ͒&Ж,i `fkjgk`xhklxzz|ꎳ͘Í꛱ēάϕlԋ耦}}}Ɗq׿`_gZaqknks>o F6^>6! ;3ߢ#Ֆ6(`atRNS,,,,?;;kk?? <;,,,,,,,, >3 pHYs   IDATc`̂XA<|/ (I)QilbR2HJ +(JMQR fdfeedgee櫩30pjhVhis1UVUU766UUU25wtvuNh`bjfnfai5i)SYv NNN.g̜9k w9s͛ %\}.ZxR_?aeWX*0E88dk׬ CEO8?^EEj%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-08T22:56:34+02:00I$tEXtfilename:origSetTabOptionPathLockedu 1IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_countdircontent.png0000644000175000017500000000274712110457565024446 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsHHFk>IDAT8˭kL[eO0٢,yc(9oY؆.1ndB# ѡ3^qȸ7.K ڮh)nIa -PK I~y{=O_2\ȿv5"Pgi p5h0\߆nr@K}z)*R`;!>3?ImAY|TDAg/t18bHT'Bc06amմۂ,;NIsj B ېߎ;*\,T%R 97Pܥ ȭi9vmi+T  zP@cCAMU.e8ˎ-1m[Fۧ?)Tv8݈t^>jӂӅ) ?2 :5,A#75\5`!<X؀E8FPjX{βC;,:"}hB{g7j[\IDAT8˝{LSgƏdK\F]3Qn"v60a6qEPEeB+ WטŐ- Df-r)E(޽=t %os7~=|F{13L\ZǛyn%Lb]"JUՔ1,d.kuCʴ0{wHS]]8^9ʸ.kI" i0) }eRVRVCW< DW<TE`B*j'+G +=H9؝msWB8į407P GG;q2aQ1$?eѪ`KV4m}*FX;ʎ*$@㽤Nص5s2fdԝJx#@_Ŵ(078ù0+gø0D=e(F%eį fRaPUzjgn&ּ'Ȋ`N$bO:๨}p6w4KHQ! G:fnC/i6=FURfl(Ǚx;q˂Ii<b0EҗX mLج僦)Cch8|0k.Af!Q/Й4T2誉y=ϵY^䣖$ƂyŃ[ ;G/S4ےzZ.~nվD}3Nq#`qǁiIhz <^XZ)"4kÇzJB>kJCAZ"!jquZY`v]ALN͈J _}pvr7;}݃օ?|*;`A?/hЧlqz tw, K d׏s=ŋ2)$1oV10V., gW  U(J$ГxYסBL+ƩȔռM{SLzmKT;דL1+p%7b1cq!DyuĊǐ\ .u̎(U|[ԿzE~][u06AO X fRtXK|ܺrzAb[NUB}BSzU;) (l+x-n,4cЎ qܯ?kAbL%~XuGdvm7<nw>EqRGNRsߟ\[ &jaL|w 4SzԳ/s?J]g 1,ò -iTX>\8R#t mQXW2,G@3"v *cO;~*g8/F/4%هvkk瀙R *C5 fgIvͬ#&En"ʸQ;wCqQ &`vęE:ߙg3{ek?`5qΩoj2Mn $yW Pl!6Oy9 3\b5&d9([w};s)\SKv7< !}d9hLCt*12`Sa1~͉ ^6;72o2\bfXنZ֋,1w%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-08T21:01:40+02:00ȂctEXtfilename:origOpenDirInNewTab %IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_reverseorder.png0000644000175000017500000000120512110457565023717 0ustar alexxalexxPNG  IHDRngAMA asRGB cHRMz&u0`:pQ<bKGD̿ pHYs  XIDAT(ϵ+Dq?f<ƣaPtfAI_@cXP)ea1%FXYBcEw&Ybηnv|ρ؆T` o+aVC)جH)gVe2Jj)[̐NJ:h`.8a/Nі) Q5r 2qFmx葼dQ 0a sRgiv4GPxgLKndj;\)BRtjxbDjW(r퓎gϱ6y20Z%1Z̫O2?PHCG&Ap:;{K KC%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-08T01:36:52+02:00 ˈtEXtfilename:origReverseOrder1IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/edit-select-all.png0000644000175000017500000000120511323355446023501 0ustar alexxalexxPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<IDAT8=@$|(5'(qRP IQQPF'Dh(\K((`O8nzǻϾ3;EUeNgًu<;` "_,߼s*h_0Tcc4" 08n 4l6k_J=X,h6a "ɻN$$ܖ_ "|$JX~~k|R0l6{fJ/"VLym4^ JUJח"8`0(U[ǥmM*Ae&'R EQf-NR)|Wm8:UE$oZ8t):BDIJ,g4}y><uy<} q*RqEՊ|ͫ}Q"`)z=SJpyamۅ bnl.k2x*v7.WGbZ%#nH|p41qFޓ3༉H8fo}_ a ~IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_briefview.png0000644000175000017500000000261312110457565023176 0ustar alexxalexxPNG  IHDRj gAMA asRGB cHRMz&u0`:pQ<PLTE~~vJ nkgffegd>SQ> a *&)a^kH79t`OQPߘ⟺ԭ©ޓ̴ؠֹ褿سǯ㘵кޥ٧̶ܺ鞺ӽɹȿ8tRNSQ\\XjjjjjjkVR4=3>bKGD˄p pHYsHHFk>|IDATc``dbFL ,2h@MVN^ɲ1+*)0PQVRdgPS@j Z::z:z: &'PXȴ s;8::9zv\@a/o_?0HpTtLl\|Btb|Rr  NK/(,2K@¥eU5嵕u @fcS)wisKk[{GgWwOo_?9ab)7Px)SkM1sV9@f\ .Zd+VZf恄oظvfm߱ܵ$g:|'8yj3gϝp+IWϜv~i0o>}LByx(gśyh0%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2010-01-05T11:48:44+02:00StEXtfilename:origBriefViewztEXtSoftwareAdobe ImageReadyqe<IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_nexttab.png0000644000175000017500000000233112110457565022656 0ustar alexxalexxPNG  IHDRj gAMA asRGB cHRMz&u0`:pQ<PLTE;q?J_O>:q0@A@~DP[5w6w6waO8tUnyxyqEoVUEo :afl@f 4Vat#Fc @_r4N@~KuyOD;vJ4eE~E}D|D|D~FJ pHYsHHFk>IDATc` 021 V6v('/ sqED%@RJT$*-2d 9ypVV/(RU5nu aѭoƦֶN=}î^0q)SM1ӈ -,g͞3w ll q%K,]əW\j5k=< $а QѮH®1q A.b)@% _d ?%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2010-01-05T11:49:20+02:00BptEXtfilename:origNextTab"AtEXtSoftwareAdobe ImageReadyqe<IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_settaboptionpathresets.png0000644000175000017500000000273012110457565026032 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  IDAT8kLSg?*axͅ1&BdC/S8a]m B]3("B)NR܄R jYJK!&bP퀆,&ϋ<8yh29sK#^WDiWJ3}#}&I[y3v&7Qhn%ԅiޘ3zne(է-jN杜*hQnRkv=MuS0|hpK~#ɸh Tf8[l|:IDAT8uOTygYHP1QʪdXͺq]#2 Co33лL,8 0 H* <Cx1=ܛs9\orTjPj H4$-$陠AɩA f_Cg dH ӂn+8b1յǻ w tQ346@Vv.0~"r.'8i rG]SJ쭼s= W6"'jZڡ\FA*<"!'sZU{ / :ܰ:ӈ޾{䐍C&hQcXJ}_@ FFrH!qxHVg|6/ܺ pF7m08Y~CVXC髡(JM ,6wa?12F ?+1lrjzLbql{a&tTS/\K=053 c㔾$z?dbr za5װV0AcO֍eTˎ󥅛Dfn)q2xx4?hkj(IS%(>W8 x84 X0 5 u TOtl:dlS'F n||=紌O2 /Sxan \7eP(GV%z, _0nG[G\`1q(94,t,߳'&of8X[e aO;  {.VcU3vA%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2010-01-05T11:49:08+02:003,\jtEXtfilename:origSearch\WtEXtSoftwareAdobe ImageReadyqe<IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_keyboard.png0000644000175000017500000000266512110457565023023 0ustar alexxalexxPNG  IHDRj gAMA asRGB cHRMz&u0`:pQ<PLTE29Bjveqzq~vn{jvht~R\cgs|mzkwhu~gs|NW^%*0jw^iq6oIDATc`F&fl@P]]XD]CL\BRJMSFVN^AQ YGYEUM]C ut M`̜cb011>)>.9ƅ5%5-=#=#3+;';7/ =ȍٝBILufp:}Y4N;o -^1qe;Xwz'Ml]m{;w޳m> &߲ ¡^ ^G[p|+8y.=}Ųs@`iÎ]K\sUr5 ?!0(81GDbhj";Y%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2010-01-05T11:49:12+02:00[tEXtfilename:origKeyboardmtEXtSoftwareAdobe ImageReadyqe<IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_exchange.png0000644000175000017500000000263412110457565023001 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  oIDAT8˭kL[e"FLD bLIc/|0%sc5cL.-sL r 0\J)wJ)@G-=m427NWp$Ua_#aT(=,3 ȓI,T#a>{Qׁz,\qP"-"*xSN36 LPi<2YNȵ&WfF-2m҂ ajRJ Үf\z J٠3S+b\!A冒dAh5#hՀ:OOcH_[e ?\[*PJyH:P&5R1jhJ0Į'6 #uN5$q2x'v,!=-Ƶ/$G7@FdFSC$#}';v S w~aiN,l}WCQ0=Q,Ǭٌ \r !<EH=.J9##/ N<1,L13@ؚ oĔ}hVBKz025 H!{Mlur 1h4̐QИA~(9)LF#1g"Ga\}3:I v;fg-kX,sVkB#3X*@r%]͆"Yrdc(zɏb2Ip]!xq0[̰ti ++XZZF鵑* wy"x\\")pPt $K>BImX ""[h$>~jpgcv6*|7wPs:6oJ@p;=^恋p / lCQ"nCJ ĪOѧmy?ނftjt8,YF ?VAp[OZ=Йj. ?@\v;%bN *C[OvQͬejjgsMjǷyRF_TMlod6w^ʢߌqlGsgr?EaaǿYnG %tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-08T00:14:08+02:00dx*tEXtfilename:origExchangeYIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_horizontalfilepanels.png0000644000175000017500000000152712110457565025453 0ustar alexxalexxPNG  IHDRj gAMA asRGB cHRMz&u0`:pQ<PLTEy7p lhfee mo mkgg a>SQ)&HHg[NOoK9:ڍ^ΉۄG[WWkF46vfVW_stRNSOhjjjjjjjjjjkR3=| KbKGD37|^ pHYsHHFk>IDATebQF_9>:1:BDYp|n֤$Rj [:" v-grP,R JVgjf j0햀e'\{.nxϦxfv֛-Yݞٽ4q<|ވ,?L>@ (~pX$}CW=JQ%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2010-01-05T11:48:44+02:00S"tEXtfilename:origHorizontalFilePanelsrtEXtSoftwareAdobe ImageReadyqe<IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/view-sort-descending.png0000644000175000017500000000064711323355446024602 0ustar alexxalexxPNG  IHDRĴl;sRGBbKGDC pHYs B(xtIME@y'IDAT8!OAT"3h표APZjY4!A`jDȵv' f'/Ä8+`dMP01$+}{[\iMu3($! ?/`&׌1Ht|6Usn(%}x1\Y$OM}Yo6njv&0#ۮJ*¦f\r.ukr\sy@9w;P!f05EIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_helpindex.png0000644000175000017500000000335412110457565023177 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsHHFk>IDAT8ˍ 4UYOmU 4C(35Zb"Lm<<;3eVR{܋2hz7B(ŢD|jլkُ}MQӋ279+pmv`ĖRh+pB-@dmq"$jasC9SNev7W "5 4R+p ?vIgD%k(qc50n_nx'׿BTS%6b2/z-h@^D 6~\q+'R, )ߙ{2)1co #R01lґ")bJG'!}EX}q8UK-P^HW٥M[.GpQ4 Sn .VbS(ᷟŠW/3Ɋ%N唌y5`Jk⋰B5[x!!@׷Z숩CP^/4 v$Z,٫mj~F]hacH *'z7x9co*h[vMh$q[1J\?zA渪!PB]=&(8{N "բ-}"xw`f)c&JL|ݘfT%t9ULx.;C+)U1F4*YN%T/o-2ulvs7"z:0 l62.%dzQx4c+Y׈19P)c5W7|=.T 0ai띩ALaF"F;~?=ic5rc1hwsucj)OaƫcB78p) cN~=P. ϝ=egQ>-M!X]b'i'5C3a+{K]b:Ӎai(;JLuBON'rSmG.雮E&;kKS;9^l!Mhw!3;zFDn#h|7nOcgvAd8>I\tAH~/‰/- tc4WМ[ 9IϠ>Z` :&S34S-WZp( I} tJ+#7drkc20ּϤ Knb|@NqrEauz`쵢dUam6 HAJ Ff%;3{'8IFkwڒv( A7\jEōn.J*yy͗cR7#YM\h2BeF3]svކIBuws g*hΊN8U"i8Z毉_ %s4J[-#P]B} ZhDA_U{vde;8(~MP,Łe(nU6x`qxb^6yWزl,xӦk--94Hv.K(IEv /2@EUJ7N@APRmŔ;p F2cDB G$#ؒ-3 #k&j{,vėa|`>S¶|Y,^J{ď33&Y2ucʱ|;=F^ & p?/@%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-07T22:51:52+02:00tEXtfilename:origCompareContents8"*IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_markinvert.png0000644000175000017500000000326512110457565023402 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  IDAT8˕ PSW/ QBA -R*2: BрX*jS@;jpaTh1P$(C V$aU$aM^N0?;w9s/BJkLƾRR?3meTqS3I*Cp5$;~jH6'>O4f:th-O.Vo #Dh7~V~(n njl:Б5êUfޓ]БtDfҖuO_0guJɵ)`-:?br*o/H'ik{MMp qmJ3׽aZ.,Ft ac]<4n\! ?'2F:M@H8]TWCr4%U7j ؁>V"q>S*/pl60>ޡQZjv%O7B7s%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-10T16:59:02+02:00LptEXtfilename:origMarkInvertX>IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_openvirtualfilesystemlist.png0000644000175000017500000000303612110457565026565 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsHHFk>IDAT8˕{LSW;IeLL\p88_Mdnb ˣ(Yˣ-+Uˣȣ z *`$L\2 <'>s YhN[liӫ:P^A_ Bٹ.XI)2nL%vNm0AsVGXEST H;ˊtS g00:~1N:6keZvYOfcq>^!?6x}HW֓uˊ?+j(8Ě;ZB׫;32beb=9jz(ж㺶zΈ{W*Rd]0'H:1t>8HFײl7K(À|)7uH}n!mQ$ e؁~~Nohf>T˭svקyĜ|8HE5v vS U҄NHT AP"ǟ k2Լ$(tܨ\BՌB k!. >/a@@iXW낓WPN-h 4`0 #KՎKj+a e60,mα. SّT,),=aqļh b/HAU;›}HFRPh{s*C~'n%tUHs ҒC^15:46i;2i(2QQLMM[ƫaqmH.Xʞ˽T죍ȌܻJ$ (] }Í{'pH  wt:F%5ȵ:|pӔƄISa 1/P: Pb]w_ uL̥(F+=@P&`3:E՛zGy!$\d{/h5I~޶\gsA^yq)w ?x UX80\O$\1tE-F}Fm٤Na*+v dw6?\&۠}IଙprL\ؾzy0aw;Qۣs('Cqq-U.&ny Na^(e1Ƽ e;jtNr4KHgme)0[񮘹-E#kGi_'/EG0XI?I3_l`vκj_rj&.JD2HY[hu Pi,w3Ǎnqكh>@7nkJEq P=9Zq93ۭm=AƔV6UxiY@USb|8K{ގlDZr?}V42}{~HD l Qj};Tce ԙJ~l3Kk:)@Q0ĄW:? FjO_Yb)h72`BCL DOcHj~mgXvަYTcW#@?|3a_uYI^T87}hv}9e9NI #y%!#@t/ GnY|d6pYQR>G!<ߍkQ;=u`wg;lxVpX1=06>Ofr*9F$ {{WKѓ~Aâmܵ2dZkОrx>3; 9bh?] 1ީ.ǀxy sJAlpŭ/ɀ;AjG:uE*ٛL aNi Iv,ǀjP^{g޺7"xqo!BRo! >=/;d!5F<ژa8oʴEWfa/3&U(S@%<&yu(p\'&Og{8zܠ77=zκ]2a2%9X *cr-c1Ê!E: ]Ɯ3 Lj%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-08T23:31:58+02:00yY&tEXtfilename:origSetTabOptionDirsInNewTabׁIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_loadselectionfromfile.png0000644000175000017500000000341412110457565025565 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  IDAT8˕U 4i3$b0 [jiMbNԶ(6h !---EH%ab4.cߝ:[:<=#94D}~M3pec;m(x}sЙDKHK؃|:#u(D,7(^Ar`Ab-}owfnKY:5E潤FovKT}o Z Ҳ ɞh|vW+WVyo?cIazaeÐB,8k-}ԑȅNCyAT#hOnJsVQ0L :AI YV0=0guHUM2]Va_Co@\_ DXd9\ r⢿ Ѡ;͙0`.1gOlY1CmFV%PU)LyҚrh,]B2,ێ*RʁD*y=6{<^ ?e5ۛ-4wh"'{!/#maSEIMFMbl͂^4ok9_' Iy{`(g \킞0[3UԻݹԵ׻F8cB$.Rw-t|S񺟳[A/$qt8׭SR;FZH`ΎIGm([h(ώ7V䨘knw9@z8 y$I¥ }ϡ+15*Nf'yH`,l1H[NծكГX3#Ѵ/l`(|lηXMk$aֲ׻I?J?k~kJda}hHUp6woNH)=<[gpi*0KuJs #F `6CE GHoXJПSpTvX:eR}q4v1zybj'smG f捱%zk/p-w|ZYK8~^$p`_ִf.uVX#ΰj#G-D5  ו^>뫊GpJ9Ƅ#)ڄ\@`HU#㼿a"95D -C`$ %UL /w:B\1A] Кs:a䯣 D)?)WP6)=L8y;t9-DO&]m T3`B&!!PCUHTWB{%iGOo@ڮ@k(Hi[8 @]G)ڂ5ȗD1+j..n^w8+ḫxgKP%F0F} 7Uoe9#QJ 'f\%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-10T16:53:38+02:00q/d#tEXtfilename:origLoadSelectionFromFileGIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_exit.png0000644000175000017500000000303112110457565022160 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsHHFk>IDAT8˥LuR(a#2Mw;q;5J%P [LQASPBPQen6Z]-GϽ!(#IO>ű"!-U'wc(;c呓Uv.,<;Ͽ"]p;dtx_c̏A۽ѻMQxnoޔm5]Vs-Oݟ?"'jQZp۶f( ik3f= 0h}$-\ !_ZO2wrZ. >xVWW;l?///nooghhfggiikSM>nA;j8GxBGwCGxCGxC7^6ݻϻκϺrssxvr|kKUv*{2`KxV٥eҖ[jPܩ̸ӕΈ:fJݩωp(=}_EИ`vU{vFЀߨߧગ\tPNJFEGNpPXeFtRNS  _LSSSSSS\qqrT {:#$LCbKGDCd pHYs  YIDATc``eswvNFo_^>&0{ 3CCB /,UIDAT8ˍ Tg0[E'jHZ/&)vD%Z/\+L"orԕR]Z{;9s}??= w]%7äo )HPܤs4皇rd0Lv3`&ڈgj{Fck!Oq[^#u5DlY72۰2BBd~Lmw8. dv)$yd_"^iHLJH56CDq'%/$\[{f4c<;nSb28'#`o9!c2S d9bnvc۹V\.#ssFX?P3}|va-'X- C~ lwps4rbUsjF!Ux756-W`Ix% &4G(L F_IJPIT4kfoUi3^=iD%YT5JnР1 S헑Uu[R[0#'kpK*[d/p5,| 'dk uNjB^mQ.eTD7jO c2: %U quX; / }5_O}$zȢZXd#z\wWoÊu5d"bL.TNLZ-u;%V@#!p=1O !WdU,~'T׋upHl <?^i61͍5'H) "?FuuMtugKp9=_Ԁkach3=9 ҧaΨyv.)|Wcq#8t Әܔʆ9v<+),ypJoIm1 x?`w!ٰ1inhރ@)ySԓs>]R>CdI'3`k Y({ЃΗ,49v3[L9 6 I0*O2; OpIϷ7!|~nW 49?''yqs5mb8?Tg=c,G{u b0I'}ُƲ#v]lǞ' /O'2ѥ^Umiq.u;n.R.LOI*hyvk%rf9<-ޒZ$zEJce7+H0 .d/ӿI{sԴutNY]a- 4셅 -. V1F00GleԌy?j ˗%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2010-01-05T11:49:12+02:00[tEXtfilename:origAbout tEXtSoftwareAdobe ImageReadyqe<IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_closealltabs.png0000644000175000017500000000254212110457565023665 0ustar alexxalexxPNG  IHDRj gAMA asRGB cHRMz&u0`:pQ<PLTE;q?J_SCY`_O>:q0@A@~MwP[@J X)n7x6w6waO8tUnrWdvyxyqEoVUEo :afl@f 4VaqMp @_ǘkw_38@~KutcMJLx;vvTd4eE~E}C{AyGD|C|=oe|/!."1$1%TA1%w%G7G7w%0$P@0$-"H8YG\JLgfu{ؗdQ̓pfggeccbsXˋywvvɕ̓\ʊ줄qg|jl|jukuiВra}h\CP5}inՙ`̎tkq[K0I.K0t^okmZr]rrjSn]aNs[HjUq\o[hRgSkUiThThTlZtaub7mtRNS $ !%x%hfQj!%"wk_f7<vuy?ae pHYs  ?IDATc` 021spB7HOHXDTL\B eyAr J*`.' /(,*R-mnYyEeUu 746 [Z;ȘAtIL:u3g͞3\j -^d+VZƖnu7lܴi-[m߱s]]\=<ݷ}z1xBG=z  9yӧ΄"NXs/?w1"Y8*:+/! '$&%'%&qjZzFfFzZ*Zfedg2PkyȜ%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-08T20:22:00+02:00"WtEXtfilename:origCloseAllTabsIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/go-previous.png0000644000175000017500000000167311416270327023016 0ustar alexxalexxPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<MIDAT8Mh\Us͟R#4Ƙ,(]H+k..L7buQ"B-"*(AXӈ6idfs1w1c\9{{UJ,sE?ŽmԨFkv7~SFlZ 'X^voq{Xҵiy`XZsƻoݚѦka6矗v{G]NNAR^p?0Zs#4ܶ6`'>$Mxa[F :9[n321 F,|1y##k,ADoyq`ߺ7W)~>{k H5%Mq`2I(8?oxf Xoi BE<ƠUxYy1e_$cPTih EWG'߽tӆn/ .XZ-Qk4R\~cׇt>DBC*| jqXAs˼(D$7=UO;r'01j*7ѨS݆4uUw tu0l9fx$ M=y=ʂn-I)7 {\WKQXG<f'rql&."·I~d y0wxNzNކBSQ^WJ9x5":z#eɝƗ~riKꮿ؟yX$ۀZjF(c%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-07T23:19:10+02:00 tEXtfilename:origPackFiles`-^IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_copyfullnamestoclip.png0000644000175000017500000000224512110457565025311 0ustar alexxalexxPNG  IHDRĴl;bKGD pHYs  tIME ([2IDAT8ˍoE?3KnR5(K h%HOMcxI_L|/I%1!D! B޻nvs|ضO233gb׻IӠ`Sd(&dEo?W+Ic !0;WmN8QX*(jl664"*d_S}UTQ 3ņۃc醷>wWfr}6Ƕ۩V1;lE&[%)6vȄ rc߻_g#s8H"Ja78!XB\ATqn_3EAf(`|Eq.bhhLg)YX[\ˁ'ChRcQ !  nbb}L&ʎ^8`So#4R)qCeI{m>˾ҹ%J?#H@yX6I*E*7G lMIga:vvQ܉ fccx fm.)F1(ؕלs =O9fv?>~d=Q^t!},1Xc?޶WPU\E>JyrLPV .kQ455[kidV." "E'{έDkiuRU)ECQ U{H ]Wt@dA!uC?ذvTc Lں`!uChrjR5 Bp+>É'6BuEڃ$ TM|{x|\*;ל1Xk֐Jx(ZusJw>|>_QtӇ@53LNUxO&3E,kÓ]zCM/ >5+5nmJ_;$ nB8,!Xd1 CH `"wĴUtyh*K1C!vò)B0cK`e)N,MZ.j\귊Ԥx iNl.HH01HK97rŢ.jHc,ҎGH^V@s>⪦1ǸqFO;Jkdl9ƀnL)@VZPv>,}\Gyd\5Bi^߉ հNITɰHll͜3nӖ)?FU4/],a}@8qܝ01kr08Đȁ-=])nJXb\d"CUzm)c5;_ft/EĴyϋW 3tǾg'NƐ֐8'k+z"0g4C5&8߱im˺,7`"0/M.R]MG e/$"0Ƥ FﺸqQʝ%իOMQ2ScaC0L ]qC=81raa"gu~s=}5)++ZZp:UFLߟ}6uE$ }͛ /PDFn%! !F\GPѢ1&́D a7oEcD0Ț)i\r`IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/list-add.png0000644000175000017500000000060211323355446022232 0ustar alexxalexxPNG  IHDRĴl;bKGD pHYs B(xtIME ,+IDAT81KA;OPl,J4! I [-,lr s!1 Xd`af=vVc>jf;q`iݠn0V?575)w)C*.O2"1o\P@Y&v xz~G3agΉ„l=wzS6_ɽUZ}ET-cG܆f%Tn7W5Gؕ_F/-[->`|^4le'IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_checksumverify.png0000644000175000017500000000271112110457565024242 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  IDAT8ˍ{LWoyTf %CDndxoY710ǘ-F^(n(Vd@_li laW3n?gt8:VO=[rJPY E/f) BFkX)$Rddӥ=}70Cv1+4kJH '섅zIeM*5U-:c' '윓.iQeǸ<9~Spmo4kZ؇';iWq/+I60-7g=<6}`0vannA)ӅBQݤgB  *u"^&XUGAQIRAڲe[́08xȡʪ[DݽШTR)蛣ǟY%BacW ;`S+ac_e}U;ףO]e-%xk7N35-Ay`2S%Z"W܆'R"A\S\̗ Wf?|iZ"Ȟ+*sIߓw~%۱wN7$&Z6bR-Ew,=8[tzBQ1K>UEh{ t&fq}?.jVUU)ïsFSZ6qե4. lκ68 VO4ڇt^Z Ws%gWMU@# k[Oo74vtYNt7@}*yI(*ZN3$<((p4iifYBgAɈ^2eؤw;ye]0:4N4o#.i\+C<"d"p#t\ј@/b\&s.!V j{{칏0|uM$&b;2b<1j w$LUה"X[~-ѮgP=9^mXKi$7MP[R&Lpe8ѯE;`@3MޞvOMauejUWYV v䓆%{;o[Cqpi!z2r˂)X C 0 P _kts] p嬑 ƀhK4o9ΚZSKKldiK5CE$nWvhM7XgԜ S^s}ہoX:ɦ iVl˄4[nE$*q6gfHY2aY/c2g?.\!r7}dfaDSu1*t1{vdoKl=4%fǟVxBZCaøqOϹb~V9-+[QA]/Β?}-כޥ\MY-{\xBmJ65BQm.ᱤt@mTƘN0-\;ohT@[2U!otx .Cmye5PW~pn=\~L$q394j|};3+O_7u,e޳I@*BaiH<~*;r׍X3ϲ/3d2卅]{'ޟE0#)'4|82` }02 aG&:鯤&>hI ߀1GYBOr9[;nnv29ȹ3[SG'NѿqE蹗n \ "Aܬ.8^q`05B!vwXKA^ %Ɋg@ U)iϕ-@K A^j# Pt[\Hl0n{&apf 3h=/"6*|,´'j+psJҲl"y*ߕ27gzU>0WuɄ^7N?۾s?j|a1=Hf+peA*#N@&x%0TpZF zrln2|AXXٚ b*"0]zh5Iχ)*{(SqI #9^}bIHZN,VnCP7Z|.kpY4xmͪ?ZvL TD$,CqeEaO 'HVX;ΒnQy%Nt0wMA.īDzW$I>?pݡˮ97a15?8/M5ve'ξ<>raC9"oɠI[ӌ&0Y*qPGT,e~mly}os3e4֟bK1c8YseNa+6DicSwlʌWj<&fn̗톅'SwWnΏ5Y+& {YD%• ^ 3:ќ-Sjý* l#|%_TMsz^_X7>213[-]^m_y%tgi݊@'>ۋfO{o8Vl%.6ߕ@ܳ;S< -5g*Id CC3IXvƈ)-8NLbX@c8ō+pUv=EB"Nu[OGy `Ԑ \n.іRPm G4FږYygmAۂZ9/V⤅:"#wtrh3Wm*Ub^-phНYBԌ7eiBr(%J:T ?p60WM=?ӷ<՛CgNHThd#+{bANb+UN}#Hq|6/Wo(_wߔ"񱁀akc[irb)2klךT>hՆ1?e?.Z$-c( N7 MXIv1 nSGH B 8*'R\dtQ"|ZADZzdTZB2S\M ~Nz]Ql>&$teE1gW a/"vßex [Db{6m@_(UH5c巸gI(BF!aE.Wq( D>ߗ-h%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-10T16:59:32+02:00tEXtfilename:origSaveSelectionIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_filelinker.png0000644000175000017500000000270612110457565023343 0ustar alexxalexxPNG  IHDRj gAMA asRGB cHRMz&u0`:pQ<PLTE 8NGgAbAcGf 6K ^i][[dffegtvvucZt^x LkjihiiiciНߡԿ̬ǢǢƢ̩ݽʲs}r˰ښr vݙstߞ㛺uv瞼x x렿wvăń߀ո熸ײ匼٫ۡߘݙݢߜɰʲԦܩ۝Ÿ!àġ##àƢ& '˦|&}&ɠɄsssݛp&tRNSGEvuwwmjjji^\\\mw\x]Y@8C7PSbKGDwFd pHYs  IDATc``dB, ljZpo`hd F&z:\ \fV6``kegonn^> <~A!@YY9 vZ*P8/ KJ @R$#T&4G%6|}Wq 6ߺM2 Nݑ6p0vwb0+vxzNpKM9-Q6킩|^Vw2yπ55af0Ys7^+?PAU`0q3Z/Ad| :Qz$(|L 3eU "^};?,Sv3o'Chԏnr>U qrwHH[ #Ky&i+9Mk'd{FL $ia&uab.l/hLM66f)qaw !#ׯÔ*g7<Ő(H9LKHuŪxl4.Lc48@J=*nV >J0iaq'0&g% +.0km=HUN)HJ55*9<'$ih|z^%0kjbR!j%24( ?06 tuF<뤌ݣՙGS.9 ">^⯆ʰ#j5 `|_@@6> w8ܸc0sʓ1k>v9JD1OҫpMR_B-cZRa^4$]սI$~hMքUlЅ2:3{fe"ˡ}.2>ޒπY3{٭ ڡ^*?[BTzJ$ Xߴ`ǵa2Y('-Np^;)ݎRFѨKgwRE)]cm( hFgcn3g,`Y-9c< GE!Ia57 Rݶ[?<.T۴b0n$285,U8}[`ο 8rUnV?K15H<by:,/%UcmOѼwH WzB&NA":2V C-_FtOXWՋ1?^Dkm%쎧!:7#ҋĵPi&!GbeaPiJUXhRjhm,r! ׃(\y[Zn҂^@RmRH.a:hLaBR"/p%%:HWxA\#0`bB"wLwGw~;Px{qKp;,:RAKC{m٘NY} G`1ߞj. L$, 0*8I\ŻM Ad\6MxaMץXF+hH4(zjbIӑF+FƓ0G]>/P1zY(9dY(&N1D~'\cTP p_| PNhK3C_izr6,)$&^)Å%SОnzakkt 29JgtgY#`jՊHG|U8r', b2a6̷"0[EI#$IHK߆ &G`a"/fI鴇1+d8f0:2Tчwn wzH m='hPCmP60L鴏t:ag|I> K{@@A[Pi[@O쀨R;A6m 3D:m[(x<"Dƺn{P)jbpz?S&0I#OC"zf7rP%|S ^(͵hū]YǧG$a xF:cBLy%0[FDmHk!' ; <%7|(נ<-KKW1B xTk_lqZ<j%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-07T23:23:04+02:00 tEXtfilename:origTestArchiveM0dIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/list-remove.png0000644000175000017500000000037411323355446023005 0ustar alexxalexxPNG  IHDRĴl;bKGD pHYs B(xtIME ;w({IDAT8풱 a F6n` w#8#aֶ"]Y؈ Gx !$_wnN=Tzn?Y+FMIzWvgHi\o$p.009Ʌ;,pp$ݥUIR Wb1OIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_editcomment.png0000644000175000017500000000223712110457565023526 0ustar alexxalexxPNG  IHDRj gAMA asRGB cHRMz&u0`:pQ<PLTE;_[elm;`_-[S2s[hkjRrԛrQs%SnO\\ZZUAk$:ff$: 1W{qq2W{ ,Qshi.FZjcd]%' Cc!!UU^9Ń<@//( P 1Rf< rbKGD hV pHYsHHFk>4IDATӍ[Aq'-<ƱN{C{GFFFD)]s?'˛>/B5Ѩ&Cgsfa`[j YBpM$d,IvI(Ke>_dRLpO 9JU(|V#R)WG*hD/jcdJ*Тӧ3WU2i=_WsَNps[,ޑ }hf0 >>="oCFV0~|OL"S3&X _@XoXYY[Kc:{D}/ n{9A%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2010-01-05T11:49:00+02:00 tEXtfilename:origEditCommentNtEXtSoftwareAdobe ImageReadyqe<IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_visithomepage.png0000644000175000017500000000241112110457565024054 0ustar alexxalexxPNG  IHDRj gAMA asRGB cHRMz&u0`:pQ<PLTE~~vJ nkgfegd>SQ> a *&)a^kH79t`OQPPߘǠqɢsƯжŠrֱس]4|*Ұֳ^ժw0˯fɩyu꿤xŨzµåvw˴jѸə]ԣeiȼǪɝ_ȇķĨ–TްU´й§GޭOòʶ©rIDATc``dbFL ,Rh@MFVNʰ1+(*)*)e%Ev5u M8b u5Nm]=704261 [XXZY[;8ZX]\=<}|]\A!aQс1 ظĤԔXNجܼ¢ܜX.ʪںښʊ2pcSsKsk[{GggG{[+0ȅ O4yԩS&O,5mf͜1}Z\x/Xh͝3*xeW\j˖.Y ^fmk <|hO@AHX1KHb qRj6%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2010-01-05T11:48:44+02:00StEXtfilename:origVisitHomePagefHtEXtSoftwareAdobe ImageReadyqe<IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_hardlink.png0000644000175000017500000000266512110457565023017 0ustar alexxalexxPNG  IHDRj gAMA asRGB cHRMz&u0`:pQ<PLTEhjjAHvxx̺WYY⵷fjjOQQᶸ෹fhhEGGOPPľ8::899::9=!9t@'IfXAde 7Z`8Z^9Z[9ZY:YVWWW:Y///nooghhfgghhh^hqST<[(8p>u=t~&`\|G%& 0CSR %.-=CTL* Y9y`a)"0(.)-+ WVAAeeqT8 TÅkj࠶^&ܐM Ьn)/ֶN%eVpWz7TOPQUS OL6}fkjUϩ/Xh˴uW\r5k׭߰quz`-[A`;w޳w~}၃[vǎ8y광1(L@s/xS3k pn߹{殮P?xN@aW7pg@A`Q'%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-10T17:52:56+02:00թtEXtfilename:origHardLink ZIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_taboptions.png0000644000175000017500000000225312110457565023376 0ustar alexxalexxPNG  IHDRj gAMA asRGB cHRMz&u0`:pQ<PLTE;q?J_O>:q0?|B2Kb0t9{SS>/s.Lb"5=zdɂچᆹᇺᅷ"4Do]]Eo 7\fpAd 3Uat#Fc 1U_u'F_?|V⟦gC:tD}-Wy5g0a0a0b?i^wdeh`yLg\ZXZ[^ YZ]iijacduwyRSUacd012TUXTUX012jlnjlnDEGrtv]^` TUVdegTVWxhklxzzzzyxۂޏӣlԋw˰̬c׵бطaptRNS,,,,?;;kj?^ e=eU-]!= (+!-1J pHYs   IDATc`̂XA<|/ (I)QilAa(, +(AiI2PXE kj854!CKAGW {zz &L4 &M:mϞc`bjfnVsYΟkg. =<x BA!a#"EE# -Yl̸dĤI iY9i(!p``؈{%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-08T20:51:08+02:00VtEXtfilename:origTabOptionszqIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_setfileproperties.png0000644000175000017500000000257512110457565024773 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  GIDAT8˝{LSwSDTF6XET܃g6 [B蔠8`l&C* PP#1\@GQKEbKyG)m)Tݻa |897ιñk6ߕPSJbȐ3+E".. /=|iI7.LdE9ٗrxV^CVCܣn FP1lJO0s_7s0uBҧEt7kCBy;TOۃO0X7?g2P> հ`H ~'_Vu4/1 nUH+IZTIUw7W܆s2АK TG8h5xIǂho R5dZHzu;AM\aIpiKJAǺp1?$}4(4 /@S(()GZtx('9lVr;> DCXߏv T jca^8*su2 |QT׀MoÏY,884 w@h{$a=lEŚM͜ASpsY('x:q0@A@~@P[5w6w6waO8tUnyxyqEoVUEo :afm@f 4Var$Gs @_Y`+V-@~Ku؊?O.@;v=zO4eE~E}D|D|D}Es:t:gIDATc` 021 V6v('/ sqED%@RJT$*-d I)VVɅ¢U5nuҲr0amhlֶήn=}Þ޾~00q)SM2c[XΚ=gs,b;E,]|U N0zu7ltqE7Mlݶ}']Cv   E аȈPwrdcM.k"%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2010-01-05T11:49:20+02:00BptEXtfilename:origNewTabxrtEXtSoftwareAdobe ImageReadyqe<IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_restoreselection.png0000644000175000017500000000334412110457565024607 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  IDAT8˭ PG"! @[@*Z4T((bj!rQ 5xQrQ$  R gĎ:o">B4PIw/TH1kC\vFHkh6ŐՁxTʜѧ.JK>BԖheQ[lt@Uk3|ssWGw3 π竼2YO`Ş0^Ll>\ʫ{&KcH-h'%ey~} SUbx,zv0un~X62R=)Rπb R?Sp^pMԝ1di;o*!-3} =žQ 9tvx'5 ƓuS3¿KWtrn\ }5ˉ" F EK W="b$--O*&sɢ!cE4/ #d ]IyO H%x֑ԆL̒ 'd?-#^'ja0\{h9ޖMS8Nochӝj%ńGC ,c|ޮܽdM#񨀕{H-:ܽ#=oyIa~`hH2.88|{D {%`60 iG@X @T`-^fzkB+ʲn F3E,c?$6n[SVG_96QDgk :be%=W 돎I5mn8pR6Kdǧ=ҿ1VD9N4j 7mav ЅuH5ȗx) Tg;ng 6_dp eamâ{^ Qvg8+,"^6KU1v/tf~}ɒu= -鶵\JTeϼN.ꅀpV#pVչ5+E\A[ *BHH30_ۨt٘W й '-pe~6fQ3QS)%8x'?oC17>zȒpX>^)QzHkn|<9"K;`%휑ە|hYQ%C7qV^Ba8k<4c4]!meI$%V;z]h:QJNWe2CnkRJA)<_05Զ!o!*nSy5E OG5-I2p,݅,+2؆gR G֑ꪈ7Ĕ`vo'X`7,/)k#] @yzL\ۙJ |Y-!W9i苦Qaig>S7PE_lĘoɁÓ$ 9ѶtݮTI<065a~ x?D E)Yzq#r3>l,v61H'ۥb9mEdk j:N H?)>_eóʊJo;&ebuec[e5^)WHɌLqgfĞ&/³6!8 K5I'nc%v3%l, a?9gr $gF*EdeNIIo.?%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-08T00:33:20+02:00ytEXtfilename:origRefresho#IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_targetequalsource.png0000644000175000017500000000250712110457565024755 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  IDAT8˭[Lgǿ%[- ռXLf21lY6B4Ƅm,Y:nHl&lы]=P@UcYPNmiB=sii{RZ7{_MٿLY բν(LԎB5Ɵ!C1WԹ= rʶT96a;S$b4D+tbqC>/hNh; ŨUZ0] Q|F.Q}LkT?j&(M2G#;)^c{[}˻,ұ5G+t-"GBXx\vW] ~ >J[:h+E4=N~7X+E 5f4h2-Fcz澲|T̈́S:k,%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-08T00:03:38+02:00ɥtEXtfilename:origTargetEqualSource kIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_options.png0000644000175000017500000000351512110457565022711 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsHHFk>IDAT8˕U PSWh]F3ZEUPˎl `@DBE F-k-IÎ&!bVY. v\0GP[xgμ7wޝ > 0WFV&l!a)e&WvfTEɯ֚n"b$WI, 994_J#\ڬCpV= (=o;"|oPSN޿NsBDu6dTw씱'*OaRjx$lc[M^XE҇ZIJ5߻Uxv|65ۿ(OFZ}mv;%;L@-gWR E mHݿC+z|L/q=մK?e%:7ÅE|ؒ0Qt@A+BU2+U@3 [ xu-oҀP :%ȽCQ7kةyBR nL7|KmFw 6u0Bǒ0GL2#n,UŚj]qW0;[QnIgC?O;33c\2/6g\C R|N[Ea$!A찏-b4 %tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2010-05-12T18:23:34+03:00)8.tEXtfilename:origOptionsytEXtSoftwareAdobe ImageReadyqe<IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_settaboptionnormal.png0000644000175000017500000000145712110457565025145 0ustar alexxalexxPNG  IHDRj gAMA asRGB cHRMz&u0`:pQ<PLTE;q?J_O>:q0?|F2Kb0t9{SS>/s.Lb"5=zdɂچᆹᇺᅷ"4Do]]Eo 7\fpAd 3Uat$Fc 1U_pBa?|VYF:tH-Wy5g0a0a4f,Vyxhklxzlԋq׏ɗ=tRNS,,,,?;;kk??  pHYsHHFk>IDATc`̂XA<|/ (I)Qi= +(:8:9Á2PXE 30pjhzxz!Oo-m.]=_o``LLP% b4>,/%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2010-01-05T11:49:20+02:00Bp tEXtfilename:origSetTabOptionNormal$]tEXtSoftwareAdobe ImageReadyqe<IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_markcurrentextension.png0000644000175000017500000000317512110457565025512 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  DIDAT8˵{PSWO!<0HDQ@E8(ZqFQPKiBi4ERQZ_H""πlϕ_ݙoc={vE`_pQw2Xlm,K =_O1Lkt1 ZwyϘ^iW*h` t[# OOGzNWܞԖfA>тu[jZWI>HdNψX]%Uڋ)0ѐ"Ze)3䩎}?-cO_J?;q0A@D@~Oa6w6w5w[P8tUqyxynEoUVEo@flf :a#Fcta 4V4Nr_ @DOyuK@~J;v8nX]T+ pHYs  IDATc` 021 V6v('/ sqED%@RJT$*-2d 9ypVV/(,*RU5nuʪjaѭohljnimkN=}î޾ 'M2uL1ӈd9s_ ,ll-^te!əuʕV^<}֭  B ( aQI)X35͓kV`& n %tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-08T20:24:36+02:00DtEXtfilename:origPrevTabiIIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_calculatespace.png0000644000175000017500000000321512110457565024164 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsHHFk>5IDAT8˽{PUo( %o1Zmt|, e1aA@UCLQ# , fx)oAdayPZ35oaAgs{}2ʔ;KCjj~MY0.J2Uұp1){ GaE:B \U׌JלWC3SUJX%M*}]IeC7l4r0ĝԎmfύ6vw)+U -!fۏ@u偸{2GG\l0de>Y+#K11uFݜ!54q߂Ei3gwNS>b m7(aM 0blI+ctuTZa,E" gafo8{Ʀ KLZG|!mMtσ0eښG0뀡,Zk gmX0bGj_Zbž 0`'܇}]K|.*0thht<R1 .xK3~su|@4؝}Z*zgBDw~wDi S{Q9o0V⎱%]OO7BXt t r+yX#$"^Y*XIlPQqd2߁SZv4Wpֹ -$;ㅇZgpLi/.s`|v3۰+ؕڈn\cChad?B@^v_lOv+||Qc~ |yZHXvH܁=ab :B.hiD)6z K+/b,IS37"@ a^'w~,3D!-`Pzga`kqmvrNՃ8vKckeH0!ѷ>Qk,J){Z[Y߁ I/ IUȢ4)l^pUmXEWaKH^*5)(KWs^jF`a<ս9 F'|-6>vJl=ۣohMkMa%Rb~loNoϥ"h ˈ arf"uCf;})2(WZ蘺{YxYx뱽?` [qh0&ʢ9L)&_8jE_%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2011-01-10T01:30:20+02:00tEXtfilename:origCalculateSpaceKotEXtSoftwareAdobe ImageReadyqe<IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_renametab.png0000644000175000017500000000217212110457565023152 0ustar alexxalexxPNG  IHDRj gAMA asRGB cHRMz&u0`:pQ<PLTE;q?J_`O>:q0?|Fccchhheee5L-N5!C2Kb0t9{SSfvS\dSZ`ScqS>/s.Lb"5=zdɄۉሺሻᆹއᅷ"4Do\[Eo 7\cmAd 3U^q$Fc 1U]mBa?|VYF:tH-Wy5g0a/`.`/aAeLasM^lDf/`4f,Vy3)!B=9A=::2+voݯʦcLONJy常bFKIJCx\>B@;w˱Ͳlԋ끦xqKXtRNS,,Ǥ/,?;;kk?◒? +991'" pHYs  IDATc`B¬l QNQ1q +(*)zDdPX[':&SRtYYY9yE%F@acҲʪںƦfS3.sֶή޾ -ml'M2u괩g̜5{̙sΛ`!,ZdX^>n~ ApPaKLUqK]JĥX+EAEq Zh@4`$%leSA]BrC҇N{g>sL&ߜ~'_mt}|zjUdZ wV ǟR%h>X.ХGu[:0o{oELPY߁#u$!' "I!>zUļ%[Օz=JEK> 0l. J9_E,J4hgr("^;Ϻ{p:ȶE_>L {=i]%Gq\F(]2;8mTjђ$Vsv${r[Ɖd|>}^BtG?‘3gsDžX4f&;Q뷑Z)jHJA^[w\&.]ҭ*:{c3wTútq+GJq'r1KOQz㷒r(3X+›D䗦hsQv#TZ\*ZV`úih=)[.' ˝UPx^Y2\uT8tI`ph LJ!y_X(T34#gqjCJhԯ:XK5kg@ Nbnd"ʆNE8 β / !8?>>ē 040nQnibMY1 'I^?Cj[d]T.$L6j4}C >ah<(c@@ 1e Q8ḹ {N<& # 1sĀ=l`"~p)?S~щI~"^9*XH̯p?Đ SJAXtzXr}]lpr ''99crx='v>wX- { &$&Jm70:7>g\rhVXX o2!<[7k333 VHm~CRK aӋx%M5k y9SjoڇI~aa"/V.olmbk^3;o5[BZ9RƾFN,oP$o&n M(k|B{ k۸kiBs3.1$ ɓ=K!`t`Lgr|7bK_`lt!^`צޢ1ILLm5Wr YZRu0%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-08T01:01:02+02:00:9tEXtfilename:origOperationsViewerIeWIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_fileproperties.png0000644000175000017500000000265712110457565024260 0ustar alexxalexxPNG  IHDRj gAMA asRGB cHRMz&u0`:pQ<PLTEBFF›hjjUVXĖǔŗŠ[]]>@@899%&%}VXY;<>}~vwzrtvceg9:;|}%&'ijjijjfgggiiabbfhiikmdegTUWsuwYZ[BDFbce\^_&'(άֽ権аԾʞմ垠̣ޓŷʫ•ǫtWtRNS!" PE5Cpqqqh  !)^;*  /bKGDc +w pHYsHHFk>_IDATc` n^F&0㏌8A!fH|$$%BcRR -=#3+[B "yER`abHN/)-+OW@eUuMD.2`‘uH Q* MM-05mPОQQnꌅڮ>U5pXwP8vݻwoٰg:lh$ l|(;~gΚΝ/]7- ,m 񦓳 xzy1>0a( |t)%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2010-01-05T11:49:16+02:00'tEXtfilename:origFileProperties\ItEXtSoftwareAdobe ImageReadyqe<IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_quickview.png0000644000175000017500000000250412110457565023222 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  IDAT8˭kLU_331h?h&⼄}Fh8ʜF.ND]p?-PVZCZ0aS2.m޶rKƒeӋ=/sy;y·ahdl{L7d/ q__$Fv#c>rbokӼćj 8K,-eϻxցW</xvH?"4).W zfnCk3z4\|W]Hoqf(G V6ΔĜbhnC6ă)ZE9 Vz12:ѱ;26fh5͂Zv87!0spp)VLt+bM{g思YIlvX-_^MR6AE =;DJZHbw8aSt@| I\B^/CAC -JըMNNĥ[_1t\%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-08T00:30:34+02:00|^tEXtfilename:origQuickViewW;IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_markmarkall.png0000644000175000017500000000334312110457565023513 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  IDAT8˕ 4yc̠L&[lёRHޕVv%%IʳM["Z[ cF JZd̘?m={Ϲ?~~{dů@&Q,#Y<:Iٮ!VUn&W UՈT9-#A ## ZcrWvóh{i2#˺/3X:=^ɨ5Z0y~FՃwmsd 9&މ̺ŠRėe>7z;SN9 qq%}9|HX/ϥ%?{NsuEq#9@FanCtv!r 1W,S<5M(wъ}51 Hy~3I~\U"W.w[-cJ- Dl)V0@̎*cړ#'m *8Gy|+'ROuq VO(\a. pvN ϝPf}DH!c֕F߲AMNo*`2u L&ycp=?lZiC7{{v78+ YeҰQI/ 14+oX^+Ǒm_ zs0ILW4Y0(i= nU{`^HΉB-},˩2'7F_xT{Ͷ*1>V/-Ն4t_^={CcX.,w:@@T"͇A\mN C_.VzsvCyXaV +@\K@Pd7`8@Bf56RQI#m AŦDprB X4@MWk1\qslW:-}Dh\G3֌( Ee/z ~jtL],qA0iBq3Vj@vUD]::mvuU8CgvAB Jykqjaoj;.ߒ~ uVymNB˩$F3Q',:6*.ю(RZj՞ YYR9ךj?aK>>R G[!mDFJu>YZTo/G>T_$_?ռ%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2013-02-10T17:03:08+02:00S]@tEXtfilename:origMarkMarkAll.IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_thumbnailsview.png0000644000175000017500000000257312110457565024262 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsHHFk>#IDAT8˭Ou&f7^L,z[5bL6'N/栛c:njJ"YLC9r(=`iVZz@ mhi>~Oz$|=O_/-^s]݄ f1StRg9 8)slbe)zBbĎwVl[yg,f)kWkP:b0lK`x@![#+ű}f0"ѧM6ۛp8,aait?;,=6 E'8~EN2`3 ny12IPG?4u8v4\ ZӅyk:v*.0‰[-A_ϡ\DŽJ9Lʠހ|O'jйEYji/f8հ@`ϋx/Ř4!TS5ܵdPe`NM1n: T tKX>rk%5ǰ@j jNfBR nNDS@(^-,oC|`18 4>̠1hY'HEaK&c)謵| MP uMpul> |V*fd<`$Ͱ~lD8\ bH\##VyG/3vHa#hDd'NЎQ82|b&y hF^?R?꾃;,|45Ys^I0L.R&dd_ Ə2߀n.L.ّ,LJ@-/ +3$k`W]HZ(}t?OӉs0) ύaYz" f)=_!:@NM: OìsxH4^O8;ԂhG߿B ".#[1NiPҞqp|ƚ R9 -/a6O_ 7 Xyj*\0_g)j8:&n zwNH:{ї*;{T'82k+sh>Z%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2010-01-05T11:48:44+02:00StEXtfilename:origThumbnailsViewItEXtSoftwareAdobe ImageReadyqe<IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/actions/cm_exitfromtray.png0000644000175000017500000000304112110457565023745 0ustar alexxalexxPNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYsHHFk>IDAT8˥LuR(a#2Mw;q;5J%P [LQASPBPQen6Z]-GϽ!(#IO>ű"!-U'wc(;c呓Uv.,<;Ͽ"]p;dtx_c̏A۽ѻMQxnoޔm5]Vs-Oݟ?"'jQZp۶f( ik3f= 0h}$-\ !_ZO2wrZ. >xEIDAT8˕ LSg/2D)qlٲLECApsndLlZ"+ V&-y.nq=G Z6VJ+-Exd҅/s?K\G9>9ۗ9? 'hC_?ᐓDoElu}b5FI ŕ`8r_jxWcn+pv>Svpk9!,0u&'qU C" $Eoep2\(."YUMR2zSrNK=IXnãײT0J< I_BX0;TWoU(;pv+\ <0əhC&{L$?\Ѵ2XWHR;S | B6X qvo?C!S=ɠm=SZ߈Z}yL+az{ʶt{ǣ M<2:X'?ͪȕO "J ft `_up< 'D0#g( BPѬr(XTEhK438b&ܽ 6=,kG`rMܦザ+>m ;y! ݩ0M{l#`Rx0fjOF\^%;9.`jY-+&8Oូ:ᾴ驇GȗԴ%zN%̍Gr0%db'з0AcLZk/O o`nswcIͅDPwslCA̋ܺ#6ϱ|cQcĈ1\-j s@Zx*L% kr> a3.0 5OH{}1淇 6MA0mmQl{zexRk#'Xg6JOO2 ?텶>=ǺMȉlh{'V.eyjc(#gK=oGV% +F9&e2Hj *R9Eܝc:;9W7=miϻs[U.~s?YS9+I%tEXtdate:create2013-02-10T20:32:04+02:00,4%tEXtdate:modify2010-01-05T11:49:10+02:00itEXtfilename:origShowSysFiles tEXtSoftwareAdobe ImageReadyqe<IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/emblems/0000755000175000017500000000000012257501472020010 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/22x22/emblems/emblem-symbolic-link.png0000644000175000017500000000146111312762055024530 0ustar alexxalexxPNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵOA̦YD '.\1Z#&=P=?MC(%P`$AiVke7yY'"rPz`v{B֓;Bº*>` -˯R-`0TGkhp:KЏ>mٞ@C`BV8TOCA}ssOs 0N.[NnnnN`230 L ~<[[q%+U$TC ǨO0B*RJjzzژh! #FmqFGo@M!^޻ow#X~ N'KfVoY``L4<78>>m9VW=ƄP8Wޭ;}p=\+,D8mŞ4ilKUϞ/@6$]e+asT**,-AkwW\.kho sδ 3H$P׻'CՂ'p~~wOtn%򧄳=&6\\>A;*(OVVbNv,"1 3 2DGopŊ Bc}}}w[b8ү&Y*d2>AKd|%!=ԫAC鳧0IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/emblems/emblem-unreadable.png0000644000175000017500000000250111362134553024053 0ustar alexxalexxPNG  IHDRĴl;sBIT|dIDAT8}kTeye朹쬻ͺEfJeJJjHQTA(>U D QZy+$Uwݝ939E xW츲dZu)@ a҃ . "1:4Pb6n4U!u۞rk|y=pxR1nT{{g qC6N#-);x0̏xNyЅ>`IWvhOž,l,dUJG$fE4s|kt.L\g}S`î?fvV%TfLPcXGFZ s9 ,óZڻ &ZO7QBg SůVPg)u^v>rk|z \`%#TysE􅋘ngVs4L/ og҃LNNb͞M0D`V+ R!*Qth:mw,'zƦ.1ZVoFFD:gc~D̲@M˛A] O$ ۢ"V%kpo:2tgQSLn۴ ʹ$rZ4 `bsak2 t=R':~5}3zIͽ;B5"f3H%J5 8W R!A(q#k[=+B(HUë;{yZ &Z *CRC/|0YdU#44#&c*iS1r@A@lqp#>.ɟ97o3@1!%@Q XAId,{M +39Ʃ=}V|h܂leTǡ'x. C]C!!T/C͎зj>9MX$#c\>AWny ШMW@Ya Ka |zljrgB&~_;7) \!w ^<_n@@#a DDc "=2vEe7/]pp07d/,uFwwkC8~kRj1xcJ&@o υ&$BѨB} `~ H4 c`]w|h|gp6 yO ~< ;w! 3vh_nHv@Psp|.\zoULCTq6YLv|6IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/places/0000755000175000017500000000000012257501472017633 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/22x22/places/folder-link-broken.png0000644000175000017500000000231411361045050024013 0ustar alexxalexxPNG  IHDRĴl;IDATxڵkLUwvXʛZk65*i?Ԫ1~iD- 3jx&W Z`#/`>̭jVjZ/OokhF>bjLgkiD9$ۊ͎v}Ap!zנ6lolю7)aGo7VXNH 5 ךC0o_jmjDZN M|e^^ gDĴ)Vx‚` tU\VuJMZ;Qns3YD:pLQۘ4F0 ~uw?H4IqGէBsX}%D|\"´ sbDEW)FjSF뾞nTt,QRW~dNFVaLi ܊?fk~b 7[IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/places/folder-link.png0000644000175000017500000000213611323355446022552 0ustar alexxalexxPNG  IHDRĴl;sRGBbKGD pHYs  tIME #;itEXtCommentCreated with GIMPWIDAT8ŕOUU?s}&N8 %D-'LZ-Z*XRJ-RHL- M!.:V32My{9*!s;5w,8 WovБYKBEב|.o~_BO@#w}3|t?B>К1bPjڑ_Ep beHzũ-Ki!w#E5^ֶ>^GT[ه٬%.+&;x$q8gЉ}w G~<"9H@}I=qe䀐Tl^@r\N9?^=ɱăKMPYC1:8s֑FBefSɊccS_Y2,*"H {xsZ!bqa,9'.}GY* W1Yƍ-oм$gpׯqB2wDa[r+ z8 zjzͯ'w՟RD:}KX7Mk֗VKssn~.1xsϟ}}9KMdc+dwMxtdNcgn2z\̆6'Yr7^"'EaP H=9N%I 1bTu-/|^&>ZrvGQ64~ydxe Yc&Ea8WP/'YΜƺ'WpI gfE;@xyGTVcw;Rbq-YC;x=4^ڣ]ȠlQDx<sCvAa.]FWf`$Unf 57O-oԪ5.y{zSZ ^/ȿpNIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/places/link-broken.png0000644000175000017500000000136411361045050022546 0ustar alexxalexxPNG  IHDRĴl;IDATxݒMLA.m)--, H 4bM(FLOx31p0#171B$QD %Rn mmgvăd27}ojm=f ,&' l t.o?.zj+.uQѵϭx@nt,a )%r MP>2AvWDVŗV]ܒd5$"̩*Hx+do+\I|QBP#2KZ !`Z!j8y3_HRgdEoj?$gQ^0Ty:#BAU͑d-seps>鐉`k-A⠧vlT4q|}4K.,RڨrmBg0gV9KdF/@n#`ގtN]>P>]f̆r NZ%¾y@hJ8!+2ߊcl.wXora?>V*ڡ.|eZK:Draf{pj&ǖ#s1I[ •G("OjEu3?:!nAnC:cIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/places/folder-virtual.png0000644000175000017500000000225211606044311023270 0ustar alexxalexxPNG  IHDRj sBITO pHYsaa0UtEXtSoftwarewww.inkscape.org<@PLTE///UUUMMM000VVVWWWZZZUUU...OOOVVVqqqxxxYYYrrryyy///vvvpppppp---]]]^^^333///ooo///zzz~~~mmmrrrzzz024xxxgggwwwmmmfff|||тkkksssؓllliiigggjjjkkkdddӖYYY{{{|||~~~3I]tRNS $%'.034;===@@ABCEGLPX_abhikooqstwwz|}IsIDATc` tMM%}vٿo׶͛l8ab~n\y߾wn\8{’mر}#X3'NZr tZ`l%TTԩf̞7EMS5Em]pP]dM0iʔg'guU]ٝ-XWS۰('@,,QXVWޓ *ʊkԼ;)H߄ƊHF0GvbҎҒ9zRCal~1+r rȪ{qcNv 1&Eb-$!M'{k-֮ZR*ljieeeW._j   tSDGIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/places/folder.png0000644000175000017500000000143111323355446021614 0ustar alexxalexxPNG  IHDRĴl;sRGBbKGD pHYs  tIME ^4*tEXtCommentCreated with GIMPWtIDAT8ŕ;AwA6PL0PDUHp3>@X0H| &bnda9=3~TMSm/vbc}ՕNaG/ b1)}t-~ѮG=ȿ "م_~Bh$={Xt C|OxaG(rp&nk ^x 2e(Tŧ6IJg KX )2! LV_>~D/G9tqFe-C(Ŏ3@HD~'Jl .g%o6k@L=Y!R]kvJ5F X&.{p׬ K b[D$5m~ &LK YQ0}L O-.88:/\<'.J(+Шy6QAwp,,%80R3dc~@1¯KS42+XVjfhŨK3ӬnΩ1@ s9Fqgvyfk&:FL%6zs>4g?xUnUn"a.WkyoR$N]Cʃ3C 6{ z L|}%9 Oo%{' Z_|&9yUz~'1ھÇ199y7Ca^:Ƙ 8;7s>zjJV|0 q]iv\TulaqwnWHo5mҾY o.Z_D.Xөo,,,T*|yg]EdU 1ƘT*USkݞFܟv5 zB Tq|:=u}9FdeIENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/devices/0000755000175000017500000000000012257501472020006 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/22x22/devices/drive-removable-media-usb.png0000755000175000017500000000173211715671161025452 0ustar alexxalexxPNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<WIDATxڭSnG=u=3vg"hbl)q"e>, v@`7H@h`xlܞnMUXY9RuUߺeYacc#[|DҜ4U+++XTě;1 I$wn/..g YJu> {w^!y;峿^.34<<³v"&()(~_iJ')a/1jKi&ҏgH:lańF#c$۰'I2smƧ?w/8D&N'1% C4P)Da1?TkC0 ?z%H"P>&WqXq8ShP@a7 ꓡ6IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/devices/network-wired.png0000644000175000017500000000215211323355446023316 0ustar alexxalexxPNG  IHDRĴl;sBIT|d!IDAT8k#UǿL2ZӤɤ)imiiU)K*V`XQDE`_?@/>?}(})X TJm]3$iu줓dr}L͖W_.>|9{nѨz񿀩ho[\}OJtslly~OGQo}굗'(o]_`iB.{:H9lNS4 P@=Mt@Qp%,//D"ģ(}RalllV(ʟ`~CQA,..b``i]7WVVp\D60z=H&(p\8>>F<B/eYx0LHe&$I|3{p^3M۴ pxwA8Q̟ct]7RTeY٭E5KJIQiAIVju5̸} !lvhn6uY#qyUU,FOkkkӱ @Njt^ 0BjtmZ^]]3v}5"*K.9=Xg U<75TO2f5f-<͋2>{ْ;V2xpo=OoK#s/zPpE:IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/devices/drive-optical.png0000644000175000017500000000200411323355446023253 0ustar alexxalexxPNG  IHDRĴl;bKGD4(I pHYs B(xtIME gh<IDAT8˽O\U?潡3 ?'hҺmMLlLM5Tƅ ac4ƅhݘ [?VV "A)̛=.:†rr?Ls8{gh O)ˈHԾ>w}"K$y bmm|\.G"`l|t`7pw2@k2a瑃_)2> HkhD{.-˞|73--nO@m-^ADUGL" EloTDēL2Sx2*  kdl|t2MIJ첪kEk.C%5B@4@c{{[iXMו\ڒnAX,>L&,KU "^:rJDvS2vlx_WWw6G(T`mm}D"Ε7sC=Z`7̙mq'7 nn2XXgxI5`>,dvvvFGX,N8\O$rWEOhj""ޘ b!jWWW%J֖Nvl&'`ii] ӴFdgHwʊJR!Fc|e o@.(e eb(ɚ;S##k a? զRZeqɉ__IC_IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/devices/media-floppy.png0000644000175000017500000000142311323355446023103 0ustar alexxalexxPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<IDAT8kTWg F.,DRpcە躡֕.FPpQ RUJh7̦B @&{3V|k9xs_1p̮~%+.g@A 5~uסν[`3~cOn|ɩ|x [I9W(RK{i`w15kqqq4;>]Dži}0mHN2P%!;? jܽ8TɕT-nEJ S63WjN] efgg)˒((r4.#~5zsiR{*7)ՑB Cbf)qE+pM(˲`@#!bM1 WnM47ۦg$@&WcM(zز {1n/GOj !OBGHᣱA ^;IDAT8AkAv3&Kظ[SXUzxR<֋B!/%ZHBXi7i2^iE<ޛxo&11js`oAˏ>'P{BW;/ډou]>Q]h'"\ץVnNЋzH)βv,wn tiիv>5VW7-+E2$^q9NZ@H)Ri@)%a^Iqp8Tjx(~eq\<۶E۝0Fc8qt/inA0\RTbi|fm:o+掹H * F4ve{MӰ, !ea6ahZ3 3nzr99nPgyG'ǧjgPUueꗯ30ponZ4˱R-NOł%#q6S#4+' Vvnuup y{y VKڭ$D۶W۶M<GOJ\Rb*h4uH}}MJF7MqN$5-LQ֔B"#_pAB>Ԓ4MyDz,i=<2vzP(]bB.ȟs!q>||O|7 K`^M&~8.z$6hZ~)v=W,h_Dt:aMhZ> ee?!j} KC?R>-sh&Eo}IENDB`doublecmd-0.5.8/pixmaps/dctheme/22x22/devices/media-flash.png0000644000175000017500000000146511323655670022677 0ustar alexxalexxPNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8ˋWs8&1#BPI!Yl7 nlBv+]H i&(F7Noٲ3\6=Cj RiGcMd$qAr{=c]{{zڶ/ߝ!3YBʂMC&[^:5Y} 5"<{,Vb 38)iĦM06KZM~ZtMCwmi5R9$RḬ΢A ИkQ,TU禛oB? z!,RL~?:p۸{ïs4ӌV6rarbbI`PJm긮$pD`|'BeǏٞމ5־{B-;e|a)gfB "M3wwqiZkRNR߇ߧvٻcǎl;N[؉B<!yIWB+Т4 0BJ幫u0X2A]qH4N+2u2'uxZ-k(Syuh[ sπ98ulsjB&y\($c]K;+5Ś_oTVOE! Ð)|` RHyڵkEf,B99}!I__*B[(jc cCetvv2<1#y]۷%nf'iIp2RJMɻX;.a$1割BᚗgƁ׭Tqrr9ONF!(4M z ){xMV\qϪ V@G Q),°e:9|0gGG>_U}+W,Ř %PX ]]ד)o}rtH <|dywI(y '#sj4fqy:{<1YOc(ю[9Ɓ-'O@ 0ϓOJT*y^pܹs###fffZWb]+IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/0000755000175000017500000000000012257501472016372 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/16x16/mimetypes/0000755000175000017500000000000012257501472020406 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/16x16/mimetypes/application-x-shellscript.png0000644000175000017500000000101711312762055026212 0ustar alexxalexxPNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<IDATxڕS;nP\?-Ҥ&BPp z` 䤤Fhcő2->c 5qw?ݢQ?%If d:+J˲h)Df0+*C=\2pk4HW@9v;~m۵px绔IZUBhƵ뺟|AI<(_,^9Y([O$Y  !FIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/mimetypes/text-html.png0000644000175000017500000000127211312762055023041 0ustar alexxalexxPNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<7IDATxڕKOQN[ҖEJyEQ* h@҅;/p;WDL(,ƅↇUk\N-LLF&ipx8`&"Reo#0/_ ս/ fvF&H=]UTE ULFyWiv":pXG\nv7sd~ix|=xTc{ߦReu voQ>8xҮN6efff+VB%t]r_Y(⢘@?Ȟ2qݓaĄWY>>Ηֲ-|Q?v }IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/mimetypes/package-x-generic.png0000644000175000017500000000106711323355446024373 0ustar alexxalexxPNG  IHDRasRGBbKGD pHYs  tIME 9 $tEXtCommentCreated with GIMPWIDAT8͑=kTQY̟`)xl-X,k+/JD[VAfI@sn"ha0 E,l棾G[LvumϬgO%XLK:f419{ SƬދAr>r߯PkwW 95ՊV԰}^ǰ(Dxwغ($A>ɿVJF%q0|v KZ|뚪&䵪Z V mtƎ{u 2ح2PU5k.`]AJ:M` o&H7o(d6$JfķO3Rja{˪)7`v;RdD`&o~BK0IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/mimetypes/text-x-pascal.png0000644000175000017500000000126011312762055023602 0ustar alexxalexxPNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<-IDATxڅSMP=IM[RpppZ WҍɂH2*80 hN?IQxR8=@Ӗ{Q‚zq`)&/q¾۔{$JLPM/ +@EXE۶N@#F4mwqY9Cl~N WA <~V&kaJxfGr$(Qtԭ:6>|wUI qCnsz&H܉qi<Sz8'ȋUf).L5'`\wp3nՎ,":jht&3&?3┈?3ӀIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/mimetypes/x-office-document.png0000644000175000017500000000061011323355446024426 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME  )TIDAT8˭J@Ir('[ "&xYZ X0!i|_@tD] #xjv YNaEi(əy@D&`6PZk$)5%"z.NA#Aba`Vs_3c,2mj [klvy|!Iմy;v "߮a?A7`c^nk?Bg}TЙD# "RD1yER*6MJ3K_Ut8F~IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/mimetypes/application-x-executable.png0000644000175000017500000000106011323355446026001 0ustar alexxalexxPNG  IHDRabKGD pHYs B(xtIME8rJIDAT8˵NaofMH(`; (h aH7Mܰ`p.a4ހѕqB Q i e(.ffvY>ON!Y\ZYxz:IDd9gw=J"bi{vDҸ3>Lbd(T"/]{w]ItM31 ,;sDBO8=Xvf*dk38F 7Pp4Vھ݉\3o"5 egWָ:o]\9P$flX>o,;3`2{50$Lj3 r |C|.[8_.R,LDRxFMIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/mimetypes/text-x-log.png0000644000175000017500000000116511323355446023130 0ustar alexxalexxPNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<IDATxڕSn@'n8C%7n KT<HKVmP8.Os`O3;/qp.?=v%}2SJIQtrQy_!`QKe59[nAmtj4@pPCh6ch x4p=x,ϕbqN")(DQ7ԪoJTBLۃs"̃hqm {p4VEKD8;9? x!|ݽީoF@탨 2hue0'<~8Yfc YZ/0P 0Ur8j8Zs@sb4"Y.//cW/Kphݮ,mtjy5$IQm~n)c]sgJrY߹PvP |j HL6IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/mimetypes/image-x-generic.png0000644000175000017500000000105611323355446024060 0ustar alexxalexxPNG  IHDRabKGD pHYs B(xtIME 6IDAT8˝MkA4ݘॅ\ĢSɃ@g(1 z @ ՞TD*C"&nٙab !{fgDQ[3ZyBQ3ZjQ31nKVWpf,µM4(HakM0؂33sZ$(l~{?CR@4yò,.1SrzoD'S@)_@JNh'-\̟.@:} b}x{_ʧ|=({hmh9%_}z=oj%1@usIo?GN7.nքaQN&x3iv$ĉqǨLdk&|[Z? Ƚk^CrB0EJXᖋBIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/mimetypes/audio-x-generic.png0000644000175000017500000000120311312762055024065 0ustar alexxalexxPNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<IDATxڍSkAfdW֤HBNn%!+=#?" HC^KOH#h~$6 a7N=6&̬RB@? 2h4Hq#! ]}I 9R80&P0/ncq$>1q09(8O?=40UX)L]NmVs(}BRlvT iɶiaμ3Εe(fmXz4uIضVE >x<^]μ`D"9K#yub1"z, #ahL9~|;Ass98CT[01x!6 _{ W4Mt:`ۖO8 X{(zkܙ{|92c .qgW06Xǯg: .90R?!ڐgdUxu4*=JłTe@E󮯯5W*O` .)YQ*3#$|: ^z0qm\,T&B7B)V |w.`zy.~lkHs\?ʹ`mw TLh%q/rJkHR4" H#H%fy ~t_G.MX 7R/8=e"Wޖm諔xzNam 4Jg kH%]T)W."NbiSS4!݋Wnߙ̼xrL6QZOV:zZx:,~#} h/m&5H8.HRL9ט{AY $5?\#A0{/N%IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/mimetypes/application-x-deb.png0000644000175000017500000000132411312762055024411 0ustar alexxalexxPNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<QIDATxڥSMHTQ=SKS&~4B6.k]w%.[6[Hт~Bpa6::ͼw"w|{1W2$4slnpꕨ#MSHYC&׿TVL1 /"̼Cz4c6W,WǸu{4M4MeKɶ)(2yK2`WdBj!4y VAeIA,6g/>l@l9ۀ@BA~Z ( rr,+I c4i'J47b|2n sx( &l߻aU0AѓdJJl;ğgF\ }ȍIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/mimetypes/video-x-generic.png0000644000175000017500000000132111312762055024073 0ustar alexxalexxPNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<NIDATxڅSMkQ=3iڅta-&~A[Z XUjq!.\(V(bQ7J*(HVnZu$fQlL65GE3wy$AӴCh1xh-[SL yOsn&uuv4:n`Zk@ Hvuww0H)es &ض:{ɫ]IBUdIr^L:Ocn.۰{B W.O H$}6԰ğk 6+R C4zůEܙMb*e*5x>Xyl8::A8qnݯul؎BqF1}k@USy|Jo_?RhOnJ%Χ,  jTThh(BGOKS4;I##$y^U Z/>/j^T;3R(d<һfP*, D>[4A0yvyЉS W2y,T,!uWYT6{7oxsy;|ߗrԵL1·dhX~m8|nIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/mimetypes/text-x-generic.png0000644000175000017500000000116511312762055023757 0ustar alexxalexxPNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<IDATxڕSn@'n8C%7n KT<HKVmP8.Os`O3;/qp.?=v%}2SJIQtrQy_!`QKe59[nAmtj4@pPCh6ch x4p=x,ϕbqN")(DQ7ԪoJTBLۃs"̃hqm {p4VEKD8;9? x!|ݽީoF@탨 2hue0'<~8Yfc YZ/0P 0Ur8j8Zs@sb4"Y.//cW/Kphݮ,mtjy5$IQm~n)c]sgJrY߹PvP |j HL6IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/mimetypes/application-pdf.png0000644000175000017500000000126011312762055024162 0ustar alexxalexxPNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<-IDATxڕKQǿoM%AzP,4!x*D hmoC1M4FAׅ>bwJ:~D"Adne0~P Rp`H& Ľ`bsmmH#>6O@$ k5TqI ϳOHgpsB.,$2xyr7ߏ9]a!gF"GPx0"4rem.,|R[ڬt:{(voO$@)+ B 5%GKd8E$if2 7ZU5[bgj#/8o;0d-qgۆ*6 Q!5Pg`Eb$Ƨۛƣ,S\=%mfqz,O\;wˊ0($iodՇʾJ6pUW,g <rkWuS؎d2fӧ+2ɕbQIy|WRJU.U: ZW2uŠT*UkP(ѱ9`O-r;.~r IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/0000755000175000017500000000000012257501472020032 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_filespliter.png0000644000175000017500000000124412110457565023543 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME7,=QciTXtCommentCreated with GIMPd.eIDAT8˝?hSQ$/{77T,J)"Z EA:\MZN:):HJ)*Ԅ fpJ٥`b}ihho9{w"vղ2/*h{KvCyɹKA~܊ƭzSPV4 ֧'Ɏ%?zZ3N$'Ɏ -#lLayP:H#d|6Nh]in53'X~ s}\C?W..:ԽZՙV0L#(?0];[ }w_Q` RT63RN'i̇/8<ŠNby*J) @l޽t!ЭԓD"K?WN3 k$/JRvMfCz1} >_&_(#_(qd1G*輡, WuUʕ);P8ئDBr;+Qq]~n5fdIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_copynamestoclip.png0000644000175000017500000000127212110457565024433 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME :$pClGIDAT8ˍOHTQ;qD[ AEXQRXB"Y  R`-D Ma2$kc脐iwi1Zu=?O|EJsJZȂd?h95hڈ?Tق Rh*O 8YNIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_sortbydate.png0000644000175000017500000000074012110457565023401 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME5\GiTXtCommentCreated with GIMPd.eDIDAT8˵JQ?PDDUV|[K%`a4Xx-E+&xCVbD,#Q;wϜkٰt``˘;:kvZM^$`0w ew[JĻ:2\+ߊmhE6hWkG٪WjxƁX/W|1獬 0@5g(GcW؜88cR_RuAٿm'`_# dBǎ(uO |Iql<[5BRLY(Y#aCw!%!hDGZm;h w|IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/go-next.png0000644000175000017500000000124411416270327022120 0ustar alexxalexxPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<6IDAT8KHTaFR^D hFh"[FBr6B+7(rEb>p-f)7",3x_3ԁ1|tSSRƣqwp5Xb55(Sc 6^D㦟2OęJ~=LD|%霜 7. lj%P9&| qd߲?6 U{pl9Dgo8l؄-ljH j jAqE7R4ߣf$W*5bDE:(.^ff*GCx,l:VT"/5=19>kxn @-}襖 y}!˼1^9FnbD}fI,Rdgy8^\+*0Rbi\,A!Yx!Bs+?>0lpÕ7D (]B@+ɰLIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/go-up.png0000644000175000017500000000121411323355446021566 0ustar alexxalexxPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8OhAƿ73ٍzhLт@*ՊhDbE-rkJIbREOBM*^DPC)*4&Q!|ߛ!5ɛ|fvn<IuL:.O <WLFfG ฼ʼns֖ǖ% Ep74HK: ]"GJ a2Wk =<؎Ql*eh :}6.N_ +XR"K(u@AVqE؟~ԋ+U?cjJZۆ25|I=/b1 lܺ?n%&Fs'0۶К"IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_markunmarkall.png0000644000175000017500000000163612110457565024067 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME &+IDAT8eKh\u{wd&60RAG*u JBtSHŅ*A]TT(vIL2d޹73jZgw>wCOOcVמHOFl mF Oƾ G zDZmϱ#:GKOFKmOt#*6&8`oԮ_R(j=}Й̉R@ePl-kޡga;ZsL|Q/{h"sdĒe(AظP^*9z!̧7?!s{]CK+_څH`ꛄ5#[rR~"BQ+n| fi֖mP;ri%ٍ/FBn q]UOhB``Oۃ#?AȬ [:c]@"Z`ԛ8͆)>1 $SO⩦I1SuG_5 gcH|@AX dVͤ@0ؕݣT3E~O2߇{_J6j:Y dڕ w<9S咱蘡_ 9rny{9 M9N:Ahk\ݧ(ɫ("Pz6Q5M^uJVDvʜX\|bl'yŶ@jk4U-.oǼƝ|rɝg}Tj^%T/$Ʌ1%<Y t1qhwTSM8w_f2J$IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_sortbyext.png0000644000175000017500000000066112110457565023266 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME4+'iTXtCommentCreated with GIMPd.eIDAT8˵=/Q/iBK` بΈ%DjC B|lUx<}-#-$+eV.:[VOW =+,^vY?%"R%_nTtr{>/?6M-c@BP2s6͙9壅82tRLP)= lXLw-%+Jw `m߁:Ю 42\;9p~@ v^Q.8e:@'%`4IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_multirename.png0000644000175000017500000000141012110457565023536 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME*!NRIDAT8ˍ[HTQ猤e9ZQ$5jì%*C& z) *JLQ,) 2hjdd)99g0LIDio[??WWe%m#^(R(GL6/i&Y4E{^5*:>p%%%eyyM"c"3 KbMu&]a8PZ?0@jj*+o[+A:Bk(ncu 7u0*`8dgeq.\Ld>wʢ=LNe* @clv/䙋,urCa-njjkED$Ãt4JVbC"?C"T˃lD.KK~)۹W%/KNbDD|P4B5M5TZ4DThk&/}/Hh@[d޷=9%Z 3Ïo>W~7ߊ*qBfyxE |ͲQE&NgRg2{v[c ;֦[aHR,(ĥ\6J>iTw=6DrQcJK6 hDčآŃCro::毫<MqIʥ"3d"rIP\fU[,X6n0y}V34ݑApw־D$I v(x/7br]Hė4ʀ+m$yZ$QO&ژ LhbN80@D<ޙw2>s79(" q0ȭXt}rL&zee` DQJx+V5`rGArPpylxo#Eԉ} 6.@o{`rO^Z&`lZ[[[TCz ;fhOIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_columnsview.png0000644000175000017500000000111312110457565023567 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڜSNP=o E֭ 貁T^vH(BYQR$BYPZ!~GL !Q6;ӲhfF߹q|v<1bRMLÀ O8m.#C>/R7_J<7b%rSHJBcE*όMc_wޢݾ!~F9{mfETt[[D$*^)B:zt׃a~P2C$U;<tfނkAa1z`T6g2X 0 F|aFT4Ç.\2WRR" 0@e *)fIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_loadselectionfromclip.png0000644000175000017500000000155312110457565025605 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME 9IDAT8m]h[uHI~lĶvBz7˜n(ݍSȼPoU7ެW^^8o,::"RLAQ6iEXԶ49IN߫ݽ}>VUɽS~"^kΝ~Ų,82!KEڻ=o/P|ߟ;v4wK_|7+C]ӥ/ɘO@,1tk<5@ʼnFGhc   :ó  B#tJEڵmd n q=Nc戥'T~2v$/@>^LP0̐esfk{Ub?گ G.2'ֱ<wgL*U5" q~ aF$"}(v>T[e:  o\m<VM" -cW.ܳX)OP8ҫpI3ѕQTnUJ]kk+gb i5!Cmrō-^ #iD(3d;?f;Hnm=Y> =lVfo4 L‡H{ul7[n@~zf@W ]?K4nP/ybg+fMI@:zDZ+]/ #|,矙f^ P)IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_fileassoc.png0000644000175000017500000000155612110457565023177 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxlS[KTQ9gtF(]&2/"$(, c2D쵇(Ѝ *Ê r|b Aq93gڧ -wַaBe lv/cOm6>3L>u0:IDžgOI4:#c#?n@:{cc.,sK9ӵvUng GgG1XVJC5U'%i5Z cb䔐F\" Ղ+N9ǖJЮ\`,ρy7:'!f$shnnMMKSh]!Ł@ROC'$N7_ `S&IzзFM^ ƶEA( Cw< c{u5jj<$ˆ?Y ߼Exv.WKJw~?DOw7@"5m3xTn|N J^ ǏV+7 BWt]sjW J4g8Սd2i FqtX{#ɩ)knwر ׇIMSG֭[ ty4~Bჩu|c6/쟍7d9%fáHxTU磣nY=E-b/_ ~ RB !o/q:IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/view-sort-ascending.png0000644000175000017500000000054011323355446024430 0ustar alexxalexxPNG  IHDRasRGBbKGD pHYs B(xtIME-8aIDAT8c`%0I]$u5o?sˆKssX} gf07+f|0،v> ͙N ald̈́ a1gP;}_v>X OϊpT뱆 -%J gfǠG%Z3c> 2aI$%8 ̎_d/D`Vfd ,aT;}_ztFrVO[. IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_runterm.png0000644000175000017500000000077312110457565022723 0ustar alexxalexxPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˥S=KAE@sv ib#RF< ),Ԁ v邠GLvy]\ Yfgw͛UL,}|t5;"${FL촑h1;-~?O[e}O/K^JvO75utlI.j{FhǗ'ۤ* m֡jT`ǩoW*.t:jZ P0th4ZR^wvE;_N6m$IzvCF1M Zt3G| I@tFM-~"{de9}= kZL2#0y4V?~%('Ҿ"`#?;_Do5}M F:+213Bp(2nQ%XUU2Vhl0&`*3Iw}N+ӵz?uCŹ˟^||ױ}2yb @ v*J6 FwOPm6}lG-sCOBwJ_sp_'=l'/X5Jph(HTwdJPpNK9CnKy ,7`So+PaP3Uvyws16wr<K IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_settaboptionpathlocked.png0000644000175000017500000000124512110457565025774 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME+rT2IDAT8˥KTQ?t8"j6:QH-&1VjEFT-lZ ᏌH$+ %$py{~[gy8%"lMbn~DZexZ U:iuR²Y;#)afZkR^ڻ'G}¨pl7g|Q s#x"S?yynZn3>"!'pњ CT`gd"1≀^;7 C4f10SSLd(~%CS9C]ZBQӁF=hTxL!VS+5.B>iGExd2/vXZ0Rؗqv ^ DPx^R8Z8*\y§W8Ԗ',^\wEjb0˞}vyG!a~Õ#c,26:L0a Dlz" 9rq Qrfa^AD1(Oz_20!NIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_countdircontent.png0000644000175000017500000000115712110457565024446 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڜSkAfgf7mDsl= ѓw/ēdEڊDkAۚl̎ov4 =d_7]駦L 1F_\FvdCvwk->}^Ŋ#4BA/!,Xpҥt\qcTy/7)-!tfqN"(p~m\C&^ 2 PF0&*LT`GO| |3 \Q! ?捆4YA+ !BiqyS 48BY£3jtDmܩBǥ2$ψoQ# '4wpSmjb^јIa'w@T!Bj%35F0D &V.!6Roh}F۷SQMI.5Ǟ~+.V,WZ+ۇ|mtN?Gd;bH]5IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_dirhotlist.png0000644000175000017500000000147612110457565023415 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڄSKQ3$ZKZJ$؃PRу=T>EEA@RJER؋(HEUd]6ן(0gsa#5MCwK3 `BgқMcϊ\ H !0!@1AWrmi}R2pVMEpUPE%1W Ji/`,to[ 1 4nӶD0}nNJL-jic`^ X=*(s >,.b@Q$U}М*~bs:f 9.* 3HrYǏAd֌>qPQy$9%I[4ɪ0ύ# ,w),"w)7Bs,8`Fz(1JID, ,˽9#Fdz-lF>R'2>km<2@*4v!>ŨPŒi ,{SϹG.7^`uU oc}i)dCcfi$a*ufzC+I-rg!6.7rˊ*{X/Oɤܡ7 V v "m_2=өOyա^?NIpq{rY%|/dl m@, 6ּ8IJ S˾Rz 1*d- F'FkaajPD\(Uxsa.4_Oۈ=h}F}Z_YX.7Y9灬Mس ]ybʰEYD&4@Z0wb՗=VNgK\9lR8` X[͏%;Biyޢ1&-9l+T;=0;INy : &B={M>Js"3xۺP?iqQm@_6 i  _2\dIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_reverseorder.png0000644000175000017500000000041212110457565023724 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIMEġEIDAT8ұ q}o(o3d7<FhQJ[N_nCcTqKc5Ћ`-lF*` aJY5c )f]Ln"/Pi!L#l IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/edit-select-all.png0000644000175000017500000000067111323355446023515 0ustar alexxalexxPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<KIDAT8=N@X  .   @I.A ډ)wQ52ͬ3߼7 I<> FZKlo hi1ZkjRY12i4MX,0p/ DdqvXD"$IJžc:KVi" wxS8*9Q18m6*N7qRlFId2ٰEkWZh%{x.>+ml6[0."A%AP[dQQUl$Z-<@!`fqF2t IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_briefview.png0000644000175000017500000000106412110457565023203 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڜMOAƟَ)=VD`\RZĘ1&~ 7@^ě_^ݗ5FLf>3;x*ےJ! h W>Iwϖ _R<\thա}fI~B{_E2׭Je J&W17{rY'aTD{0# =Sd6q@D!J /PU`aΧ!Va^ՊMP>%\0 ꆔRh79M"%8ڎVmۇ{Xz uHBQJ4_;;m\4 4e> 4}dCʲ_6=T2`-Ϝ HXs]̭NPήɣ# +{9'혈?}H8$·!8+x 귩NR\oOf騷`$<~`^^TD܀A/0Z/(8;@ c@[,Om`#b-crtAMlC Ɛ3P6NzƍT9U3Vnirv?F?o7 ~ nCrWLRi\AZWBzQ< G>@`- ԓlq\ƋjMR-E[x0dW_u4j&\'qK[o+ !d}ݹ@g;K!H A՜Af-1>>d*f~>AF,ЂKa/~ö= 0ʼn@^[.^UQ 3 krԑ7$}b Py@'M΂" ^ڲ\ut(ߕzAD1(X >~3ߘ~A Q;RIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_sortbysize.png0000644000175000017500000000103512110457565023434 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME5?+iTXtCommentCreated with GIMPd.eIDAT8˽KTQϔ @( 䔫- ED KF)Ѱvw}3m!D\߹˸NgvX͌߉@e|v,Zu@QV,}!M^~JPUPJLzwp8d%j O1إTznlut9=?!bQX][|tz8ew0l Bv 5|S`Oʞ1a pK _ Zbgb3ɳI'q\# b: ϗ+BUXz |-nlzn(.-<&cY\knoXs&*W΋gIIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_search.png0000644000175000017500000000132012110457565022461 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<rIDATx|SKOQf:Ӣ4ADMԍi 5.;\]hBHQ7ƸG/Rmu\}$b<;sr3³/Vj* L|C>Y` 0 x=^r\hxr.01#0iת@-xh4jf3}p^ܳ$Yz(u5lܑL Mޞdt[[?(_*~&0@*B&!b@$ij$Xn`kfm E$Tn蘙ƕy@Qp(-q$QReaAtmu5L;bG%M,l}v E J%D"p?~b$pc7fX,}8Nl$6r1;;Y^*/Hh7cݺ5i{#b;@g767׫@]4W ӊHQFX@ex<.T+f~L'kof>R\^ ׋ÃCsȳerv (VHry5ooM`Y+ˌ3;ӣ{? X\?[IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_sortbyattr.png0000644000175000017500000000102512110457565023433 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME5*&iTXtCommentCreated with GIMPd.eyIDAT8˽һkTQϺ! F$h 2(D(T"_(j+HT"Fs͍q3̜ iW\^kϺ}G'_ϬPvStfF:˷| yWE*THd^֐'{G-ત>\N:R .=;y.<W~̣1l_" YG1H u|%`'x3emj F ># {{Ng\C?̝G}YA"U Fzv_ W@ALcQ i)u][6/X۹Ϸ[5~Ϧ bOIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_keyboard.png0000644000175000017500000000100212110457565023011 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb?%w"l S1 Gv:7J3L jfddd`߆1m3 ?5312031mdHVff& o0012AB-,4P` @tnó/"<xɇ3h3)sڙ3>u'p`x/Cf?Õ{> q(2hŒFų"hOS53`|.P OF 41)3>}ÐðxN?7`bOu@W,ݴ!6ː3F#0P`8r"8ts#4ղ03 .^ᅧ #RB׃ (]?0R /JstIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_exchange.png0000644000175000017500000000122112110457565022776 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME1*..IDAT8˕;hTA;n6dAI A0F&BY6hea:" FE Z؈7RM ш 1 &K,Ό}C,03s93"UxQL82gb8I!fasf|Byݝ8AEkHͅGÍ*kCnk*a":"t@TeUem9;@ӷ%)V~bldmdC4 V&؛@jup}D~}&a"X T%(pw.iK2lRBRL]7BIe~r]=kR\<ٕd=½WYV~翸Rnh^J>~̹pSQ&ϋ*4d: 0]}pZeAGj,[z`4'xߟDP~9%wD7j,HfK4QYV漑6*}-6Y肄i[:C?{A8 2|? yTG/z=4>rYIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/view-sort-descending.png0000644000175000017500000000053611323355446024605 0ustar alexxalexxPNG  IHDRasRGBbKGD pHYs B(xtIMEkIDAT8˝10*,˘ pwYk0!DVٸc0湴 ?iҼ{}eBm}]Fv%Sݤ*sQPٴT6-qQͯuPa^!spQ@ãs3MG2Nv;F"\h{hF# vi e' P! i$ uȵ98)Ĕ<,dW}`ۺIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_helpindex.png0000644000175000017500000000137112110457565023202 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxdSMHTQ{ޝqJ„ZHQdAjF?-مEk"E *~b؀ӌ93doƙ:Z.s}ǪN.q'Wc 6vB6`S5L ^O06+s@&oWO5!DX:0vp1@ }XHf h,ࢗoهw4`6?F^8RuIL%65lo@0 ^,*_3Sm\TF#1|i*83P=Kfh0);hRV[`P+$t!m'ƋOCz\0t %(~?yί6Gvm0",xM&y$dmJ* 0ăc@ MӐQ+ J GK:U 45_I>sqg?;yf塗4 &Lfg㙧xțdx. >983]a?tSryV쬯kw!;l "Ͽ^  Nj2Gׄ'F4˿@I CW&N^$Je^ ZIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_comparecontents.png0000644000175000017500000000114712110457565024427 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME4pIDAT8}=hSQsjj-AkE."N j2AtS]5"Pɦt*S0)*DAAlSHCJ{?w;u˟ަ#J}.&F p(~zSْtIYްdyÒ%""g""VْH4PZ23vkK4l7#”h L][*&R{!""jMVkR˯mʾy_4=JȝA<*DzTi $O^W̎nCm2 ǩ:hMIv (`4'^&qrT j ])&N/2l \[m N ryUAskj8}4=qOw}0yK!CG+;sXfb> ыH5)gKuK0n41D-T>IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_markinvert.png0000644000175000017500000000150012110457565023376 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME 81,,>IDAT8˥S]HSa~Οg;nrFͬ4(n+ !".C!( *( *.Jc9<;;?_PEsSzMM*\Y?>4y-] jOk [R=-۽Jm,W[+kuN_ãh(~l'8MznIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_openvirtualfilesystemlist.png0000644000175000017500000000134612110457565026575 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxtS]HQfgu@V, DZ{ȂՇYY6bz B ^B]"r!I(EA(?0L5|3w.;;̑8$ sp,d\:O0155Dߒ\!o}쬩<0 `5La~P6Wkv?1@9<2ވ+/ؿ+ò@ipSͩiHOu|b97W@۪, t|8_{-M)0U02eb&Zh*-@{7] (_RE,FhX@ ۀ3 y ^e#kCQ<yRAZ09rϨ{^REKj1Uذ p:ۑpCpwmBaך.XP[6/7 "D{Grfg+, ( ՁiXd\P=@qQRv$ 9)Fo|` K;9.|Ů@>t:r>J=>2.}E8UUMܰ@%Ʌ{ꅒ ) } WIvoii#(%IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_markminus.png0000644000175000017500000000164412110457565023233 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME 8 Y1IDAT8˥[he7|3ݸ6{i VPCJDXD˓JAE/O@" QX*bK&q6n^ٙ!&oq#<#rk}zԍOPE#<@fݻ qk˱'> i٥%}Kӕ;2ĆhFNWbГwLgD۰fTHƷ^(z)>]ٙt:6T]릁+J(:R+Wkj=VtR  Fs+mb;{"m$s40X> 2[9 wGp*9y܌u#L7-;q80\fS8Mbs&HٳzhT5 2JTsaan-i?ܼ-8aNe+8 𷃱ZH?q L 0p 7!k}5`,TF$baa9C:) ̣ D#v*LWP P~@Q&p , ۲R,kloDx5;=+x,aI rNR,|m'Xx]&-QKAd^WaEH TP\ZFWӲ9C)4JIxüE2AWtBzf'7t OIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_loadselectionfromfile.png0000644000175000017500000000160412110457565025572 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME #›IDAT8˥]lSe=kC0&!`L挋h MШhDTb4$jLtިDh!Q#' 3cƲҎ==}(TyiS_b]1[_^>{L?eM e&[g[*{aŇw%{L7 ^>+|4?[|!VX@&.dm>pdD\7\?v~q}ZXSn3dyKMpϿؕa4 kXP 6e"/ #TI޹s@ԙ P~;sK'G{2}[F~S,)7gC/7@ùw<ֹLE٫DWZb%ùƛ۷m\9}ߖڒ @(t|@*0u8wЋI6ګ7&S?eѪ9{7m2hS(OUجً_tn|9 +-(E~z#٥5 ǘU?>ʿ!nMW];v !E]PMIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_exit.png0000644000175000017500000000140512110457565022171 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڜSMHQ{EFE.v tEm EQ l@Grk% "#*ZQT{oͽs;w^3a9[wcip0ZѰ~3Ay5RU{WK踥U~IItrw;CLHDo,R [`+#%0] -Avavz /(FZW2^R!S3}*XQ0 ca4Af<;9H d销QL4->ग़ lnP 萛S$݌E E{"ب$&^bna]0ќiI)(6 14 h GEYT+|.ϝYuSCI'MsK dV!1B!B+P]b(55ap#w,V#OY^C2bb]QQCjPM#,+NFt LAF#$*8EaiSKk !. \Ec`~XuTF&#b)iU@^el:j@oDγeG^C"', d,N.#Hs- r]5֗y"X"CqiMr# dIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_symlink.png0000644000175000017500000000116512110457565022711 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME oIDAT8}kSQ{ν&@?:Hl"~.Ek nn P(4T:бh[!mGͽ8&)m^s#Ě["\s*5:>(U*/255.'Ug2R). 3Z5Z۸$B=8XT7lۮ r9qsbm j`:`:ݾ#5ȷ>z5j{]J`""$$S/Q@'dm'o=lpd{:Td֌{0=J8=TdP*FΡ"tn|Ù:S_QCo8F%9ˋ.s? A%h6_7ΓIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_about.png0000644000175000017500000000137412110457565022337 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxdSMHTQ޽gԑƬleH !r#P۴( 讠](V(ȍpQFRVPRZ8:<a;|{5sJzmp]璯iZJJo}3Kmдƺr)C0#'&"\ƶ^XoU[WjKx7ln9%,D}^$Na5pt~ x6$[6DIJ™|O3w\د8(HggI1ϸi 0Ppz.$hg;7uX/c>eC4P]i,dHU׳?ÔZ#p\0x*aIBsqƙ|-Xl-Twj@sK_P&s;6YWM;cZ4͕-@`:{ )<;J mUGmG"HPg9ZQzBS YئOT@smpʶ̪d$[xv/ gwɞK QLEFx5So<:`5GSz?-"McObbVyb).ں4R: 6;M3}:ZE(Csѫ~+j.VwR*>3lG}L-^uЗǓ8@` \ `:<,o[FIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/go-previous.png0000644000175000017500000000121711416270327023016 0ustar alexxalexxPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<!IDAT8OHqǿof~;RblB n["VLD"%t-z;$% n$W"KPl0wz{RJ7+[Z+a X&殅 e>“k=ى,kWŵ확ӯ;LC'~nQ >TˆW]3s zf+srCMj\X=CIgGXbzjw߸I6&2?qq]{zjh$@_OܓrYv`Y.Gk8r#Gظ7Oc}z=|~[G/ "h.r*OX5fA'~o9ɯ/qp=$yMU>-\#jRø<VW0_q#6$?@0#޹NעCL%3<*$VBY ZUn/v{QClo J~ {R6Fk(:x)Xe!lb. yvl F,u#md;6@Oo7mY=m׵R eY -G"{]gOxo}`FKF +b_$.& }:qa &X^yrSo3kyX"bRC7>; 06>o-E羘\"R=kk2 IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_copyfullnamestoclip.png0000644000175000017500000000135512110457565025320 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME ezIDAT8ˍKla[;MG+!XH(VDZLb# RE%$.BHDHJ4$b%B[( 5X͌3wL[aNrV'{<g>E}ϙ)pa粄[3b FU0r#fdo c붔@>=Sjt5JM[h\K lF"'^+26WLC#{y9z{7kVZ}=gƭFm ^zGGyW~kg|σyM._ظuzeӠ9_@魔^L'Y>wCUD\&*XUȘؽ%Bը L8qRlϦˆa $߆xS^ˤ@! D1 H!"bUtsTl&Y` H$83kk ,8ǒ%KUlo ! hޱcЁ0sk<tx [[[WgyCCwN@(fz(b ---3"R0|"آ/2}Nhm Azhfv?CkLZ"Q!`t8+2IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/view-refresh.png0000644000175000017500000000162011323355446023146 0ustar alexxalexxPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<"IDAT8mRMlTe={3m[ 3јF7`XDa M ta1L%47!«qВF;̴Yp=''\bfHe4jՄ'¸.ؖp|t&E@O*}]gQ(V02v|g'-lzW6ÌĈdǂЉ  3EW Ŋ 5>.W f43=gOk40ĭCձž _M^l8l?3]X1/23ǕgƧg^hڷuS( wD-HU/<A2e^ۏ^,}?,az  ,Hc$UgnSui&vn{'v>Eq4Akw_?߼''k'W%߼[0j>AX-/?ԩT=eYcJ奎Go@W!'$_ԓSln\{&?3 DV%r=?JeFmXv@x\qqah=Ѿ2;}З|9r-k5tT2>hMA҄ǡ̖MD, z=*];[x 8wyIuI1MN<-I7, #?[FՕD(̗ˣRmcer-0{ W1oR ]!PՑl.UvjeIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/list-add.png0000644000175000017500000000050311323355446022240 0ustar alexxalexxPNG  IHDRabKGDC pHYs B(xtIME DxIDAT8͑``rҺ`6[;tqDdZ &g7Z,Vi1v`9=0+n/\ϵUR>.009xrbD["[-$mx\9XwV2@@PiAkeRjt&Rȿ&ROXNOӅ43kgO=TrK wIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_checksumverify.png0000644000175000017500000000137712110457565024257 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME 6rtIDAT8u_HQ?7يf6=DXX"Az 2)(z(R>H1W|1)If:ͦK&{9JD8ERc?4q]@,@4Rs K'Ph@gYQz^́(y #_Xj2e v$}R*DyđmvX~MtFБCvU'yVRw̍s* 𴽽 IUJZωR Z4Kuƌ S51t>q¸EuN8ptvIh4J,#4 Bb_VVFӓHPXIa;?D"C 6RWzǁKYrmBM8[0`oHA%lܞ;V! ݈'+Hٽ'Edo2 +¾!ۺЧz>'9Bi2)ZPF;;['+p{=)JTsr <|0Ѭ$)5ޟr|ȝ,gjcM)4.L x]|}_GR t%ҕIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_restorefromtray.png0000644000175000017500000000124312110457565024467 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME PU0IDAT8˕OHTa{oL`6BAN + *KD4E!l B,% OBa4C|s[X(:Ё~r9RrizvTHyC_b[z]wzOKC72 ȋ2 ȍnpզKn)\9c?ɗ{gp`:D.b49{*ٙ]]χ8Djq﨡i;2 x| GjQ5`e0m YXXQRpM:Muql y;+- bHbc"uxrfcbFbHeC YDm=c3L/B'K Mh2vCm:EY?˅#my,?M-'c&)q4 WڥGfBF*9A Bi+JGmA5]x:j Pi?Vѥ nIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_saveselectiontofile.png0000644000175000017500000000163112110457565025270 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME #8* &IDAT8˥Kh\Uƿsνsܙt^&HKiJB)X)eV TVD| >4T몋PA0lc0HJIØL3}{4.\??";Guj #y JO}w<;2rc ͳA'}L3 Kw:N훮kϖ (PivH?3=Z\;n TقX:kzCr֧K7+@3A5栱QoyҷoNfWñ1Jy2wݓᨅ0[u\}L2B3[=*(R$Bٙr|;X}?unPUJ՛+ahvq' !UrQ`/,]tk7^[eF ڶ@P0`fAPжN3Y8@LݸJ7젙eI-s. |Q,rQדE(,ڳbĖ+ЧQ<>@H%+Av|8ۑ:.E`V]?@`fP9 U{5^k乔B *%Pʧ^2YIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_saveselection.png0000644000175000017500000000164012110457565024065 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME A-IDAT8˥[hufgvv'۽ Im!bRI )F*>XxC}R0^hS/}(žԨIk&l6lfg!d۾ ~O80K~=n9'r#SLjKԱ ѾEf}+LC{r cnm zr /o{\8U:㟻CQO,{̜^jص&$PvhܽV/gK)i@ j  r<1[}wQ[de,:.Pp"סiPtG~Q,O(Qj} 6fTRa!o%fijމѷKW[9GFl' L}\ A CXC\kFe̍ɘ^2 o}Lv MPtK.r˒o$ e,l1C'uD3ayb/MWe*ɳ`P |ŸJ܌˛!nYcʞDߎ`٤1\yi"(R2̈́ 8C5 Jrkgp]F(VqfqO6Ű,kIxrzat5H mAW-@6ɵ|_n8Ӏ .IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_markplus.png0000644000175000017500000000164412110457565023063 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME 7ccs1IDAT8˥Ileߙ6/c;qlƞ6B 8j*U,UġBNMT\XT4RN, TH *j)&d 2;x<ϡ$ 7$wzg},.G\U+AµM:2NpCMoS-ܡu:'Gj-Fk gcF|<Z:ϭG4&Yjj4lmT, ˬ,dY."5w ೯s,I$Rd粬.0>z]գ?Z&=%>5G,C'2pRԚeZS֪1=gs9\L}cu.J)[Fv)4%!@]*Xr͝LLCN1^!pEt)Q@4un+><T;hY)U&^iKRiRY/xK}'Ef01Nj~\*Gf&cE̜f/hu116L7?<> $Ͽ&/4IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_testarchive.png0000644000175000017500000000121412110457565023537 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME 6Ű(IDAT8˝KHQF'g%BEQV "gA4)dh!"Z.ZHAOEW-ʆGLI: 9i1ùp9w8Aw!8{VgI 5QXTXkAddEt!繛e4`x fYx 3_{T Β  #DamL_<IcfLfwHutH} eHEh]Fi0fJQ`wmr sx&Mc7b z\62'O-O|㋳̺n&/iopo,f \y>Ͼ73Pu{B]gW7FS&8ކn *"? 340(;Z c<{э=C`aO4 kt:z D`|C] m؊R |7&`VA$p;Osxi`<۶-P-`e/#KNC&*w@(IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/list-remove.png0000644000175000017500000000036711323355446023015 0ustar alexxalexxPNG  IHDRabKGDC pHYs B(xtIME ;"\IDAT8푱 Pi:+#mF stԶ"DO!ʳ3w&H6暺`?S-FIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_editcomment.png0000644000175000017500000000126712110457565023536 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<YIDATxڌmHQy~*"!pdDѢ>!BFAF(,65Շ m)<"=\sHGU0&LIAUO$ne!aCV р3'iNvl$O6eW1JU+\kp77 |Z-up]zi5ְf%:ͫd*S)5ְf#gPʔEʧqiX TD#Oqd 32ìÄT< `3gumvhp;DTyqg kaVv'3vURG΀RuiiC˱6Ujst3Hp7f3;7 ފ= 6!'n Lh;w< <[PYiPwyڼp:{}}A n] ~|{g UQQ*D/X#Zx'T9=[ BeIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_visithomepage.png0000644000175000017500000000115712110457565024070 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڜS=hTAvySőzc! bR  B,$AH iD k€IZITPRD޽{l11vvf[6EZrE؎ !btAB'8$ W+^"aLTOZ$[G (d cGl;5y'kUasy?,:* +L<{pާMb;Mjoв.UM3P$>Ugpٍ3M'7YF*pC& w_"6#4)ώ]4,/sϗ. ixof)6SIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_taboptions.png0000644000175000017500000000120212110457565023375 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME23IDAT8ՓOHa?*mJK2 D&R?cg#B;v51-E7&R0ӊ%vt{zy}7PONiE-Vkd{@`z,V17SsAZQ$a"tod{^ ]8ͻl)񛴟hں @Eu1p)J%UNlq(p8x]ȋmħe왒EUQng8mఁn0hJSvSvs"Na @CSYES^fA 2Q׳e1ekOqvt~J3N ASz~{[[a/j{{;G) x &ZZFkR g).W+iZ,KWuvvz<vvwhlh H09;3F@`8@<J&ggʿi&a.Tj<<"ȷ3rf`lVИW/y}q .IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_setfileproperties.png0000644000175000017500000000131112110457565024764 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME TvVIDAT8ˍMHTa;9#yDA gPAa5YE&@,jŠ ,uc dhqYys>Ppxw4%b "R])l66pH:_llX ?P1W\'zvW:PSY墀۶:6D ѦЀ'%4+>{hY M) ޭlkg"Q˳@b&LzzyK5S-) oUqd7;uXu@]f&%O* XܕrK?Ĕg`{QS[Oͩ 5|Z4=)4INJAtPZqW/|R\tV Pc"2F$"~CIq8$+{ ɻ1MSTA-:82\MjfyO Wt:I;@ͧ2TF{(R(ZE *±L̆NU|*V!d Hlh y- }筥>+Q( Mac lRX;A?(7JIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_newtab.png0000644000175000017500000000113112110457565022474 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxēMHTQfaސAa.ia)CAїE}vӪ [Jʽ"ieTLH1Pk߻)]8s?2ưYᱛ}i|8PBkU-Yk}G))c{ؼ!gIUРf NA[9x.Rμclj1:Ļjczo"M8R.&^EyqJG^0r`ZǸsIVڊ2|Srׇ00[1-󳂬L6/Ck3tc>g_OQSMPnnD &sA[ 쨓͇[ɌL<&l_- M:mC mB .3tSE-#E =$R4n"M~ٗrXBT|iWv=tQ81;|,sd_+şR7. 0cUIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_restoreselection.png0000644000175000017500000000163312110457565024614 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME "(IDAT8˥KlTe63=3S3)(XL*bk Y(.ԅj0^ڨ[ZW^o &@RbSŔөs`f:]`2[}'} !KKzxe9;csELKydʾ @*G \nz?PEw6-mݶ;800^?wD/t?S6G{egX8E-W ¥ ᘫ'o4& ESWQO5WLO'OIfA|mFJMN5fMkki\EZvqNԓ&~ a wJHt,f G־Z4Ji'kJȡxuN-? U-JO5 P}ECY2YmA,RZ2*,|$uMQX>5{EtL^Z]9aZo g%:UIz=A;?Pļ)&l;g{e`B.8WY ~:~/N3{LUo'Vn)B.lӕw#x^0]B]qlygw/ѽa7 hd~x] C02!  pf;ZlإH'ZG{FzE*ʙ,DUo7LK"hNh !20>S_Nӹ^̓ˎx]sIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_refresh.png0000644000175000017500000000144412110457565022661 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME&J!IDAT8˥[HqoZ.78ٴ$ ,.B(Ԃ.((脆EQ!yᢠ.(Q0QZiWRRAV[͚m߿yHo{/_^~<)%3EMII"=&@L^MJ{b4uR袆xơF򵡘l)c@AN9iYSxﻋ_ 4`u? @5+yi[CskW`Cɐ`!.8 p=~spp'Yc.޵$ RšTp HH,I{c>P[R:vjτpKo!(  G@'?\|Ý0cdնv&Ӭ $Lx<n UabH[6Ƹ ε|e4C Bz^"Ut:=O)KLM H$ϳ.̋ HIF *8yG]w)q{Ѧ[0NЄ>< $p im@64 UoK`P"nqKOaCR?@U9:y0L'" Rq XLƶ2:j .쨄mp&=V-Yv)|rI|dg%e.- ֟WIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_targetequalsource.png0000644000175000017500000000104412110457565024756 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME*;C4FIDAT8˕jTAg\T1SnBSͺl7l_@DY  d4V+kXxX{gk3G77kY "X4@`Foiuu^59HS,7ΑfYĜY{^19i=}%{l/bST{iV9J2àzi>}fK!s@Z_IYںūmY @e"ULPt~YݍNZyN< BSZ+[ !CU_7c|}'&8roRO?bO2 ކh˿ykq.э6FC_PSJ|Z:O$Icta3IJwgٞ;Hu+0l}9kN~0,zTIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_options.png0000644000175000017500000000151512110457565022715 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڌS]HSq}unMn:Q\9S3 , $z(z)Ȉ >5z2{H7CR3,?pι۽WR ;?BGhE:;k6ވpQ`sl͟D Kј"j]3\":50&_n?'QFZVLvsƢ bR^0(oRR 11*'&P#D녥N|f̞e'aڽE^cT%Cć)|!0qY$3OPk!}={<1L 9贺rBf %$f0 kڊӡPĖP9X H|ǭPnc1 \Yz3y-QB9O=j*p ʃʠFs|R dG d;SCaj'݈(yk@0J$c".ZeD"Jt e"4iwp+/mʖMDCOE07?K J5&WΌ 1zޣR6uNk׻=tfQi8~17_ PNA( 0qBP%iXqTGɊ&e2"]DsW})鑕l7]9*ZYZifUTo% "$!1IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_settaboptionnormal.png0000644000175000017500000000063212110457565025145 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<!>B!B@"` 4VF\ݙ  baoaf!ː82 t 9WN;G"JmI)O`_Ta6#:o1{k(L,(e<˞`v'n7CuᵺL8xlAWB~su9OԖ=BmC4:O0 xԢ+mϫJ|n ;zv+Ѐkm>:$<3d f&J8SíX5Ͽ/t IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_prevtab.png0000644000175000017500000000114212110457565022661 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME$ҙYIDAT8œOHQ}qR'e4"Fʕ2XBDB p)Ÿj͢D-$8#P٢p(*p)ڼw[|.:9󔈰h6 $3t͒wN|_q7y&z ٴfF'ؿ>m]Qxal9ʙނ $xZqa*wV "-̥N@H&hXfk 9 --4Fh464a wn% ƉHT|ZXxPJ43XkbףLV jlS#[8dq8a?~ʇRZ<މQ*䬏e E_8UA=:ɉ`0!5@- iS !#6p04jB+k$C}8<&Q ^7tAg #dVT2lbhKs䈪(Zk,|1yk!4AOoT5P"M傛+Bn&6l_3g3OXz۩DcK3\Ov8 T DB_-\<Ү:}7bxÖ\U/Q\EKUZS#+㛟IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_renametab.png0000644000175000017500000000076712110457565023170 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME 3M%IDAT8œka~EP Y܂ Rp1 -HB fAAi RvV'AdppqqQ4ɗsGDH=wϝcD)}I^%N iͭmՕ=@UYMUڧgxۻɵ=DrZu~tcZ0wW߭i/QvмpZ0Cb_zܽ~WI Px8"{@w/'̓c89p.gr0+ځSް?wH$rA,j٩>󇕡KLLg{g.sKo,Av}G9x[:7 @/Zmq<-IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_operationsviewer.png0000644000175000017500000000125112110457565024624 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME'(iTXtCommentCreated with GIMPd.e IDAT8ˍKUQϾ Ek-u> Q"l$ ́9( Y%8u`h *jt{5>΍l^\nlWDt( h9 nkC34PW6XU/Ĥ(!ldj+[`<@]]ܾ0B\sj>T8vHNh9HMAНa<6 &wl2kL-cg,8X)9O<魭1TSn>- А920(hmC(!emXn/!F+7o+Ā4/ׁ2 RլIɨ(S__"{C8@@)1DrXDUat؅AjwNͭo[%tet@ \5#z=Qm"bH\!,g' %;G1vT, GOu/O&WIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_fileproperties.png0000644000175000017500000000133412110457565024255 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<~IDATxڌRKa~a0uvSsPY̑s.M/B" "$b%sM$4ڦ-f_}sU4YTz I`I ,c8hJ\/G#a_7ɒ"]_~D`pz\~V%30(2T.*P_8\##큯' 9"XYJR__lrqvvp>*_ m C8>sp57#WۍY:Rߟ\'PcP244hy6xuy+122%:{<AB5 | )psV*p8ӡso.=xvwKB. o- -S2Ӊo++B9w[r>.,ږ1S囧'0v|f*&NFy|]Vm0/ IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_quickview.png0000644000175000017500000000125412110457565023231 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME()9IDAT8˕MHawu5ص6,;BBtحC.:t cq@,@ ! $d-Wl;yfF~.'Q w ?F3piEy1QJԯD@8ye]tNPwRIPaq=Xf P UIPi;)ξE!@}]=--7F`dYBkM.a _Z{7$(9xcNOTl`fltr{7& ζ%X:pǣDl`Л Yi@iȮ|j,60F J(MΎ!,5D,oM^oݱL(zC"EX]ၶU?EK}dnf>2xd&~elmePy?8k݄-J dF"i:3&> <4@zyˬ ǃrxfazN(6f Kt֤UQPt ,.JuWQd_7p~y^w͑_j-ى׏ V A5GXh# #oK0/A\@;<0Ơ:r Pnf*Wѡ } T5مgnݭWu6g6ZQ|N?kSM3@\cw[1YEIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_exitfromtray.png0000644000175000017500000000140512110457565023755 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڜSMHQ{EFE.v tEm EQ l@Grk% "#*ZQT{oͽs;w^3a9[wcip0ZѰ~3Ay5RU{WK踥U~IItrw;CLHDo,R [`+#%0] -Avavz /(FZW2^R!S3}*XQ0 ca4Af<;9H d销QL4->ग़ lnP 萛S$݌E E{"ب$&^bna]0ќiI)(6 14 h GEYT+|.ϝYuSCI'MsK dV!1B!B+P]b(55ap#w,V#OY^C2bb]QQCjPM#,+NFt LAF#$*8EaiSKk !. \Ec`~XuTF&#b)iU@^el:j@oDγeG^C"', d,N.#Hs- r]5֗y"X"CqiMr# dIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/actions/cm_showsysfiles.png0000644000175000017500000000144712110457565023770 0ustar alexxalexxPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڌSMOQ=ʹBH@D"`g4DF]%ƅ`KHхc‚"T@h-Hi m{(of̽s߹}"q"ik`b_/=co]&<93H0w@+cP[" wa0Xjn~UanT*͢uq];(&~dw(ݏm`v%isR?22$Z. -5ODW&!bu4loMY%Jc3pT2dbŔu]q2X:B uU=+>SOڸa͈%sc:Edx*J?DЇt4Zװ7 m[3~#:xxeG"0UJNn-A+`-0۽/l!B$g9EeL/*:41:\v ß֨ɥLuj.XS"˰>G<.b9#V5KN&}]1Q&ryȡ2D,s5(uЧ#gpv0?fim2iwl. x2|ꐷmiRfA=Fhf(Ţ!)d4žxqp)213uj9Le.gQRq(4ѸlCNC] p)q3i IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/emblems/0000755000175000017500000000000012257501472020016 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/16x16/emblems/emblem-symbolic-link.png0000644000175000017500000000072311312762055024536 0ustar alexxalexxPNG  IHDR(-SsBITO pHYs:tEXtSoftwarewww.inkscape.org<PLTE===_a^fgd  ! !! !!!###$$#'('))(..-000120231785786<=:>?R?JB$c4c" 'OT151p(# XDB? ݝ]fwvgfjwyy5QةAH=fb2 ؈FGי7 EDtJ\.`ڂNmNXwoov`tT$6l@(ʪKJB['N\UW Â{,kVT/ uR}}Bq'a=O,ix5%vJ{Q=m|{9RGa| a!l@7!fs O~}"ӝu P`;|tؐR 7W'žT8eEYxFYU\HZ*JȔ" Ob! GIj, fv]NM@%e abce' <ζFV:{PjS}^6 x7|5u\LL_D0|e6&k#Ͽwïb\#Ob `R,|,9 U'n|Larb¤d L~3L а8F$9A(6ԔKjIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/places/link.png0000644000175000017500000000111711323355446021305 0ustar alexxalexxPNG  IHDRabKGD pHYs B(xtIME '?!IDAT8˝MkQ;_MBLcm6v*~Tc B8nD+p;~Vu)D RjMu!)bL&Md'Ag^ùnjnjQgk[7<~`Mm.8q<LME^vx>'TpuXMUa?)}[PNeڧt5ɹ={V7c3Xu,O# : 6ĥ,-(靳㓱tw$Z 4nUxEG:=x{ `@fM{Uv"3C0c\@nFȂTbTZL\>{tWwvYk-0U4lQ4l69n7J]HaN3E.En ͽZ65$ݖ/܏nխϯ;v?$#P6$E/K^5IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/places/folder-virtual.png0000644000175000017500000000137011606044311023276 0ustar alexxalexxPNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<uIDATxڥSkZQ=>JF%ӤM8EBRCY fp-.R!L4`&&jb+mS:9.JqJBR((n Qo>B]#p67mll4(!aFEkb'Z5hYY)hi 䗾_6d֕Q6 e5FX;$"עMIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/devices/0000755000175000017500000000000012257501472020014 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/dctheme/16x16/devices/drive-removable-media-usb.png0000755000175000017500000000124011715671161025452 0ustar alexxalexxPNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<IDATxڕSn@})B*FH-'Ԋ_""q!JiHԞJ)R9Nų7z潙ٌJ%Uv$Ahhq"H@bAljŁp8<|oI912X.=TFHps&fBYqd{VʂR6Tpp>혘e##+s'u!3W_NO2b\t;(gcTm $܋4^"DD@\߇ܨАRpnv^#e`nrY;Bчwһ@yBɭD'f@:0EyO>Z]#^E#-~jnVJ "~ Xa3szna[> F]5N~9Z^ wd2j5&7 I(f.em.Jo)"IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/devices/network-wired.png0000644000175000017500000000127311323355446023327 0ustar alexxalexxPNG  IHDRagAMA a pHYs B(xtIME/KJIDAT8͒kpƟ蒬a`WuLOjềȆ C/ xqo<ҍR6 hꖮtKC3RePws{}.!"!dZ3}/}LQT,Z' !'G+1o{{K$!d"5!d{=R8ZQ(\) `-$wj5 A*2=L }ՌUIAЃN,`߅FH4TSUETQWDCFpˇ`0`804 By^ 0!.^Ib v OL&F!ݿ]č7jA@E?~DS!_YY9O^.a'u]r/~]St:.E>!I߻gUqe/,oT7elnݾsk{nYݹW}-"[o?'IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/devices/media-floppy.png0000644000175000017500000000106111323355446023107 0ustar alexxalexxPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8A?34F,\#("Vbg(XɝXX\\an2"w!'/3ÃS=Ы TeYFuLAEQ . 땪0Ɛ)Ʉc@$ btk-{vPv;mmKa<m[=㑪PUT$I8c97*"|2N#hLE ,ZKYwj\2gzվU&l IENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/devices/drive-removable-media.png0000644000175000017500000000077611633361331024667 0ustar alexxalexxPNG  IHDRabKGD pHYs  tIME PtEXtCommentMenu-sized icon ========== (c) 2003 Jakub 'jimmac' Steiner, http://jimmac.musichall.cz created with the GIMP, http://www.gimp.orggGIDAT8˭JP)b ! v/:7ҡ J3HY:y,p;H 7ws84eO/w䱵*>VKPJA+ttwЩhQT{pBVnq8I4 2?)˲U!Dfw8_a7:{`YI8/޸7۶QJ9qP/ۛ!Q3GWGNP{QIENDB`doublecmd-0.5.8/pixmaps/dctheme/16x16/devices/media-flash.png0000644000175000017500000000113711323655670022701 0ustar alexxalexxPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8;kAn+((1 B,  {؋ 2? ,A`4FcA7K={7f<3s;Ngg怫 f6PD\8Z[pũ9`6_>9ɱ8\y%KW.t2cr33u,#Mif8Jy.d8a0!'`֋1 8ƞ$ۿ& mst: Оjgwog_$=D"vvwCRrJոi躎eZU/TZS!RŽ{ԏhBi =cXG+"@J ]7Fv)%GGGdYO޿;:P,XMێd2q0 ,L&#_g4Bhs$;;;Kڕi˲'''W ʼne߰_Rt !Dd9 QnJ:IENDB`doublecmd-0.5.8/pixmaps/folder-link-broken_src.ico0000644000175000017500000001652611361045050021223 0ustar alexxalexx  6  h( @ fddcbba`a_ __ b a a ` _ ^ _ _ ^ ^ ] ^ ] ] \ \ [rT}FlQ{~|wvtqnlifda^[ \rwFv1YPhrxw}|zxwusrpnmkjhg^ \ra"I@b|zyw}|zxvusrpnmkih_ \rT-^+~}{y~|{ywvusqonmjia \r/fZ~~|zywutrpomljc \s6a 05h}{yxwutrpnlke \s68@3gw~|{yxvusqomlh \s6fHow~|{ywutrqomi \sBfWmk4cw}|zxvutrpnk \s>f+jV'z?f4c|!!{z!!tsrpm \s=f"[0k+T:eK4c|!!|z!!vtrqn \s4eZW5e7e>f>f>f;fCK4c{!!}|!!wvtrq \s1X/T@fTQQQQU\E@B4cz!!!!zxwutr \s?f5eTTUQTYL@BB4c|{yxvtu \ss?]$}vqia]VOLG@&|wnf`YRMKF'yeTH831/-+)~~{xusr uupkjdoublecmd-0.5.8/pixmaps/folder-link_src.ico0000644000175000017500000001752611226363660017760 0ustar alexxalexx!  6 h(!@ fddcbba`a_ __ _ ^ _ ^ _ ^ _ _ ^ ^ ] ^ ] ] \ \ [rTFQ}|xvxwutqnlifda^[ \rwF1Phrxwuutuutrrpnmkjhg^ \raƿN"}nb|zywwuvwvuusrpnmkih_ \rTN-؆\~}{yyxxxxwvusqonmjia \rN/\Zö~|||{yywutrpomljc \s6 5N~|{yxwutrpnlke \sd83NNw~|{yxvusqomlh \sN6HNNNw~|{ywutrqomi \sNBWPkN4Nw}|zxvutrpnk \sN>+uXzN?4N|}{zxvtsrpm \sN="}0+ӑNNNN:n4N|}|zyxvtrqn \sN4zy57>>>;jn4N{}|zywvtrq \s1/Ϗ@vuuuutxkhi4Nz}|zxwutr \sN?5wwwuwvohii4N|{yxvtu \ssN?ܚ<+Հ"z#|$}wyhi4N~|zywuv \sqN5=֕4440݅yr4N~{zxwx \sZɱNNNN4|4N~}{ywz \sN44N}}{y| \sN4N}|z~ \sNN~}{ \sN \s}zxvspppppppppppppps~|ssssssssssssss(, c2q9J& !Cvfeccaqxvqpvb\ \ ] ] ] ^ ] ] \ [kP!t\~yyxvsokgc [ls^)Kzxvussrqnlih \m0(֏ S{yxvuronki \nl9ݜ Ro8~}{xvtrolj ]o]ROu\>|zxutqnl ^p^9mD|%s0ڄ0~|zwtrpm _r_(݁/ z V V*yl)|H~{yvsrp _re4t(ڀ,܄,݃(jm#u6|zxvsq _t[ȳ02tvtvogf2߇5|zwvs `u90Ɇ8ד*ف)܂&~zk({&w{ywt avf-]]'xz)|@~zxv bwo4(y}zw bxb3~|y cy?~{ czrqpnnlkjiKyzuklllllllmzuFzzzzzzs  ?(  \ \ ] ^ ^ ^ ` ` b b cd degjlnnoqstuwxyz$kn"qssW\4~]`!deS"iljKm;śLqrQèxԋv?̛Tƫlw%؇[ÿz\ƺZɳ~Fَa˺֯el0`%߷g_PQyO{||~} fXUQKGB<3.(%!nsMOurojga\Y#v5'zwIqmid`[&x/+Ay2plgb]):Z" Nmld_,^9LF7-6$mhc0J1TV=C>ple4}DR@tqok8{v*;WSPHE? ~|doublecmd-0.5.8/pixmaps/mainicon/0000755000175000017500000000000012257501472015771 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/mainicon/alt/0000755000175000017500000000000012257501472016551 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/mainicon/alt/256px-doublecmd.png0000644000175000017500000003670511765566230022120 0ustar alexxalexxPNG  IHDR\rfsBIT|d pHYsIIEtEXtSoftwarewww.inkscape.org< IDATxw%Unɉ&0 H$I@AQ @_e]װ|W  KNa<=g:\u?n{V|zVթsN;y!DPL3P(C B1QP`(3% F B1QP`(3# sY+r$=;s]:Z1ގQ>Ru]R??>܉o̹'5==whsK+;ҩ;n߹%;: D&k^y7GKXd1H'|dv"DSNi ~ #ZWҁ$\B$+Ⲋv( @Ymf1-n@֤4]:g!r$_h VP\q%綵ݶpEHSsV5k_tvvD1 a`:a e_3 W(Åxx,v98^`!)O4TW(Kvaig'G/^ re[w!D3w{\hW(ÈgID" _,VƂ }N?=b¯P4 I5cVef/8?b]]J# E#7;X Apky p=O~nW(Z@FB qK|V%/5z,ܓ4ΎNU+-]蚯(_D.Bvvv":(֑i,5SV')Op;< z)Ux'7]ZK+rk!ef%Pְ[v7"4Mf~93^dY@b " UMR*M=bޛ.r{N>'*Lk'`=!H$H)d27E4#{oSRV|tz&|Sʹ_mc&lַڱ~.@YbZKKbޓv  0cH#QwRz5P0AY)Fg6tT`bhL&eYat6Dkt,\̢}AOJ~V~e0bl6[z9A<, W5JL|iehF<EYu`5@4F saX8E(nfJwb|H" ϓB4bKWorΠ7#.Z}Ch4jԉeYd2ҎBſ=RM ӬJ]MΓOg?K$33TPM)iTt#1oxsRf9q 2ogyopU51զS0IɤIyyT3&@Q?K.sKy*h]d2!0= Q#"^1RG/z"z-cyUiN2to~1/qe6 -dW˗nxg.Jm% 8!O `zl|KWKRB^kC'ڂ$.. 0WMd"|g> ;kV!/DzQ`/=Ļ>)Dלs~Ø;+aՅ޸ xYI\ !}В,?ct|*ʹwP$"[D⒏ U&BD,ৈ,Zbo]ފJZIK0=SEh:/(k}(3V @IRM7I-X-{e$<_ީYڡދR###vOBܝ7nf_6:N>Od"l7cADSA ,t,-/Y L(ei =%-@7 s&Yܾ)KtJRwۙw y) `"FM[S>"t/FRfFZ h$ n 37L-6|%Gc VB|>?~\Lu0f@8ƛ5ě#7a[c*t]I݈RJLt ӊ^rv\ {eaYoyo0D"V8##vov4S!Uk|kHs[;D)I;N{{{:Cwno޹K@hn{cK_@!h A$]s @Xn)k6O_RJuf3Eb_pMViGQ,˝Z~%ܞ=X4f6`e3 4G?! /;p&WzÕ_`Zdb k8HaTwiόBY #r*[4ʐRs`( r9X} J)3i` L31gRJ"adlXi_[,#gglHvg/AZTKs+=ޡ!־+?m=췾1w>^t( ^-mF[`;Ry d2(HiI7%5 m:1')/hǟBlv.ӄ X)q)šAv3j0=|!䆧xۄ86yR-2OݱB[Eᅧ̦k/Lh$^~ބALu>x~v:̑5ncͦo)r²,FFF&|NJJG"vyy賺*kԽnFx_ᗒݿ;?ӮtQCwbtP622/Y[Z'8VB^))V.}}2Zٷ$vd2}p;/ʼn|ToE8 U=zV =fYzUǖ"CO<:o=;0RmdYwD/FP|WՌ"s\d y=gao #}ToE@zߕ  n=a Mv;܈qRc642^G{=880;> 0_/n|h :ٸV@ ڠ0 :^ZT64Ғnj !@Jx9Vv901gB"|q3'uv;SV< n:B>^xoͿ?ouچ'z~$zs.~y0ϒtz/ZxorS%oSs1;6%ǠfA=MN?A[Nㅇ?:v^z2cHI9_\.אѵ {jh;N<҈̰;m]3+!YHQ@LYȡG":f54cÏlθ+~shW߾lo}=^ ߋ[jѣ_>n8N'el_fޗ— ~Hn)\` J}0M;ǻZN,̀ԉ=h(T ~njԥ5JF1r?zP(~<)\ 6CdADZZ_ȫ50c7 IL̔: LP{Ҩ{ ;004xf0$T>rb܉QEǟֈB(Kk X[Y((zaviU=Arڬn"oUOؚ#ܞzTi99f pĴ{Wʔ-/:hN -Id2rJ;nmNOTAc>m+uy.HQʗLb'I쐗Tv3i>u%`>xD]DIqwqb [JA؋c-NkpTYa}ݍi (>z t)thf7RB1D%Qȫ._%i3 yOCN?gqZU 6d,>B+➸}dsӜO3~/|IڋX5&wG[TW܍iWW+'n_]qTP#溿m@$oZG'Z2mךF|5F,BTTN3-oX}bqB7c5j4Rz/QλGzݳ 鏲ڱɷ=ދZ h7i-X^e 9xgd7X3%u vc[ٶ9MtSiPI^71w/mhu+R߽aC83ffrw ! dzE'B>nF>"/PP'okNMV<C@tjpN^:8 @,K7?zqQ@{$ &Xs|SlZhj^@6{vC @li^flؖX&@Xjrg:^٪ &@ 0':948YZ "ڂ&@,Ko/BB!ta@)%ooZhblFi @f۷ۥI_`aD"D$2;:mE":-f|v~c+e9|3ٿ#vPx` X V& "H$i#Je/ԺXX,V.9ZХS "_ RZf.ˎ^8Z,COԉ=pܘR`G03iLb&A^+HV7}-ٺU|+0oZ4O'z<ZaPP/eN _X V.f:͂,7,{?MYٖAZ$ґHu~ND;8d6#aN oFHI1Nc att`:tt%0^da/-`P6IDATZ/H "DRɔ(P"@@9X$O)!0R)N]]DR4: G|2~@8AAAgaH)) "0&Mt֬}TP'bBtX@:\uAgiX"پ}dH,$a ԉ6*  \M^tVZmߊH`tucE%n{:;EM fZqz pElA@稵 f:CZ"'&g='ŽBӓ=;}i,O+?@+l%+ag6b B6-,:8:J@;P @гeio4gri/ԁ0 ڵ]cK˾Io-43<ᤀs^b9<5k',/!HD5jG @d!GaN#c3KO`w: [_fӘv,nin3 87/<@nFطY, :s |xV)9<<tr&Fs(d>GqO]nJGO9tE(` B6ܶM<`87PJnE{`aq:r=QIgl'`XDX,ͳy_pnڃ)mm]9?nX} / Waʭ0Rӏ<'qQ#IXpnόsoJtN#^dGF2vS гݾ3Zw` 0mzBV\h]sy`Xa B}þ˲\;?i+4)&y wLjɄg)]٧ lV'"4~(=+-c;pnBž^roWUDYDϺh4Bh ~!w4ݎA t1Ƭs^|m6?y`BTC{P9ɏ@ @$.~O //f[ah\ڼEο?-ӟu= ӗ?,(Xf.I~R8͟ghăJ:FƏXb ''Rb#FW7N!Foўl%L5=T`wĄ uϫ# -/؝xZ$O|CX& t_8mܳOPܻ3܌p( ?=%[D [(ni.B#mHk?r_x 6t]]@'Wa׾.2 %恽52co~0^v`mxp$vdk`?pn3p(Jy#؎9g}2G `eog;BsR;/P>9D"7t RuArv R244zzwU0TiRܳ \IOϹ+x_0fbCE= !_: .xSj=-smoU~F?/0"n0rm2#3o4]ТQ|_fOW*9 ;6a["Aoyy-a_ӎ4÷2~5Ty}`ZK/#{-FGg9k Eazd&8p/\-N͖` _{#pdl  M٧1?-+X hl1i7J/=$788ji?|,q'X~0ߍĊӛ>笹4\{(@jo#~ŷHڦ\P|D"ng?d svǠ~XN?cV/ޏYw&0<Ş}'_D ǙdBd2 c~tjwŽr: Mg?}C 5P"2 g|*zX{U"Holߡؿ` CK&Y N?sX$*bf{b>]}W E4#wp[Mf3 HjEur~ФLSܺk5*!f'r'D+-:x Ju.WL+Bj33ZJXO!2Ԩ_Ka ,ψؿRg]7000}u[ 8G#³+l' %߀awqa_:QZsvbx@r4o gzky2L[|ޫϿ^K tsH& МhF"ݤuxq8}?O!p5O!{brX~(ښc8(\T(3i/N _g\{9R)b 3X:&9]/;*LģA;#[6l1# ;vdq. $hnk(MGƒv'$"] eMԩ!¶4w5kO^Z׏SǼW&}5!^SRǝ̪o^ßnhxc!L͌lHfvCG( c Sq>%Gw ok_@%K< zzz8ŶtC2tMeWWz R  !ljAN0(zzzn.lURJ,²,Lt}3h4JGGgHkR|ƪo]Gq'4]M4 ]?g_WVE嚲74.X};L o980CJCk4X̙2 dYV[umGtvvD\4:;;E+K6= tÿZy,WΙ1OXP":::\op1=waD|T*UZ籿06nv|+ v۠vE @I$Zyb>/X !HdW>Sv(&ݗ}_T+c?[vF @b~} @k7̑!6}}wv06<]Px _4з W\3J%$4d2Ybs~vle'.࿯ơxk*sN|}sվd6\Lg෬A @pz9m ripڟ\vb)bX7b("NwW/ipΦ}Kz!ʪD1(Gc?>.e:+fz?~w'`5kVXֶ-J&I,?15d!Ϧ/^ޛ~X}&<08sۻS[ *Wfl`YlWlIJ|JD",:pj{dvcϯBFU`(r? |eqs6sI{uA5&@4ɤ[|O#s.k?Lk̑a6~ {W|-wtZ04xke|v~%w(_ŘsXxE>t6vرW J4 ]!wnZ8ֺ'IN!PPSJj_gtuuItx2/?5Pe~B4, 4}P.y kb̟wihVrNuO`{BxL @Mq(iFOE  Ptʪ];{j2OzYk7`gI!BQP__F׎~:t¿w6&l/怴, ٜj(5 '/F's?epLIξsxٗ`~,E!b /`/? x5ù) ǝCg߹q8ϗSŽFsHIPLFLՅX1Sр8 ,m{ ^heypnhyhXsW%|ԙDQ iQaԠtf=oH lCN=<{)ȿ-I绾 _]=/Ur*N44Xk(_+ˮcߓjϡZcqXg묞o Ҟ<];Iύ+WP!tt9V#U疎W:wSwca9ιP.rcaN$WJ٦~6kY';_JNp! T@ {6EڳlK ڳW-#Ym!$T;\ @m!~~Zߟy]7ZمP`Z@)w^u 3@( ExQP`(3% F B1QP`(3% ӌIENDB`doublecmd-0.5.8/pixmaps/mainicon/alt/128px-dcfinal.png0000644000175000017500000002277611765566230021563 0ustar alexxalexxPNG  IHDR>abKGDtIME5" IDATxy%Uuk3ݡzlD@FA|$/?O38<5!>38D ($34|izC{QU=w;=|νuNڵk^{<1y"d\{ޑˁƹU#ʜ̉ӭ"FFO(j99^Sλ%y!Aۺv1 L_9#SWpsR*(W =*I=%ټ3ג $j}*QwՃ/)-?{~z)תryR ŤJE)KXejG3gk % pƓ5+lyq%=l]dILUŋf嚿hڼY)qelyWFzP=dzu <"r& Ɨ:D.+dAg+;}P4{=;<z%[Ar06ε|!ym!eಗej3]S}1Fyjq~ܹ hM_觗ǩ1?qKYt)F ""BFg =JFc((>U\į{{PǓbK2x'oyUBTVj,]c XH̢i(R9 jω P}X%w Á%/~ǮYNt/@vU(TP]st]p̑0ceX JU+VمXy:E xʕ :s+G/}Ogg.]y:ZyʊNY::ҎJZZ|?/gJLӏ8B0U ;;( gQ!<B䰎5"×uj+: CAC#rJ|"?.7'![2Vy8UʪrĂD/2^2X* TBG( DʂTwBv0o7N YQp1' N)8@pB^`IG` ߣ̈ %@,|[PTk6+}b$!͊`DkI҈$y2iv(.ѴKZ:D흙?H1b@>b9*0t:D06j,KJ' o F3+` aX+W5~$KT<.!CF(, '@$PD0<ީ oFD^Q,)Je9Eh䈢" }{ڡO2{I V`3``D4&4 ?4KDN;%rzB0!Cq r2s]H:1z ÐrT*D䚳:UTUD&`,wtҹtl8qqRfg}ޥ}wނ؏o 1i{<w)1"İvQ@(x1^r?xݑK/w$GXb ,YAchs>}29cKri5dU}*)(łTbks^,]KzØd!"t.YF_S~w_Q ϒy>ZFJEBG9ja3yA]L:0ưp:ʁvݷΛ[Ks%g IFςn!c"G]D-rT^z!{{9)!%@]Kq%W O|ߝY 5<)Q (9yٻc9- Ei"N|e>R,yOL<|&YD! qNa R,YEl{_Q6HvAC'|5rTˆrqܛΆ.Mq.ǟC!BRTKZx]S𮣋s?ds]8t$pZN/pzH5"s클OuCa`}l+H ےBS!Y1XTˆ r1Du[x_Dr/O72kڪ h?t1#Vh;uw0Lc()'}?^!#ϵ~sc ښ`9׽ !XH?^85PcMfiJvŪΒ#q_ԣ u`ez;Ywr<^qҏ4E)cLU\s PG2b b-ss?WJmn8!g!qS*aD%Xu%<‹$+aL$ \6WFaDVe\!P=K9 =RTcl6Z k9tukbW!Ɋ_;(y9+IðYs?97,\?6)Zӎ^}Qm|! ڸJ E<W H͎P/yօΰ1X$LQRюԶ=-8U/WIaKfUCX~T~WWFX1Lfkp;X;Li'*#Ҫһ};onZZ`0FNW*%QrVbgː@ q|x x"JBad/po]5VY|Y#Bi"6Cg/WO ր;+MD(⤿[).X'#QђE=_w؊/O (lUF(/5'm puF[X3T5 B8Q Q߻-kݲx9G=ha剧IS8, HiΩ*'ƪd7>|2]A{/7ǂ$$_4X r6d7aؚa7ŖN<#xI Gt9 9jwxr|';wvҷP kZH}阿9ֿM6氫/'|}g\YđRGZZ|FM Ą`y,(tunҙ/~ baC?SH^%/ʙ~o7nwEw߯Z.ϣó9OLìٲDP=]y i[Z {E@{i$vL+Z)|`P|~C+;{ IR{,߳]A9噬 56_#@7|Q1ڊ pժ:q c&\4 Qv4sDn5ڎĺ 0AOj&hꄵ PPVlGi۷`DDJܿ( rz\l;hK4n\?,R!,q2QFT: ԓAh0}]n9 |[(` XDfp$&j،2,D}D2^mϰ!@X<1IbiqÈ!хWS-ڎJ\nڝdmgnӄ1(_QjyB±Q WSo_؎n&64ʆ3>lyF4+MeW$ߕYXE>T{k[҂`Ǯ"ڜu.viOm6 'Bՙ:FXm LULF@~w>= 7]OM]V)7TW0! sT*#ڶ!d"qTW÷ ,=udKX` E:>d=چLAxIܳ-Hahr=ۧ]E? 0*=[}贻? x)*2j9!ឧ>0DA@.pJ ϛ?Hh,&/l-pH*e=[myh{MCZTyyL=xěFM 7`J:Vs_J]{ΤwpUhJ}f6G"M}5 n=]tI~V<O<{=#r:,)uʳY!u]۩oy 740zb4~N,8 +VM^׷K,D{q3.sZּ - V (9½;o~HهS*-ZW^6#]c*' r24Ȟ;oqY̲ -αQ8#P ڿG'dMm b,Gi@$NI$݇'/fDF^IԌ 62H1½;E%Rr .~tt@wCܕc<6モ3R'\zrʪTS"O}룸 Ozbx&G]2S}u䍐K759#<}38J|Xb* !wMZlpWxWbaZCU5&sL3; x1h_é,~y#Hp}%M taRS_c pνUoz ӵ2&^(fC0'B;6}\V^U)+TabFNNسhӣGOf|J51loz2o~ԫgj >7c8'ǿR/R(R%-e3MqlۈVFFiR%vĂ c tGϪ,|Kf`֟baM3wk/|Nx>CRQ S =LTR۹(atХ/JNuQl S\D}ϧ$r4::Elg`hy+{ɢk:?p30蔡D#4@L nO IUM6(TSJ/Y(ݴ1٘!86;idЅK<Yt΅=W_lh>ڛ7(!!/Jh`pl?87DXgK.M]ͦo}CvSJrM40$(!KڣxulzT#Pb%1 N] \SD^/d/LZ{wi=vFBe"D+O6_;`ۍ?]?VbgBpWjSⴹrCF`5JAVaWDq݆]4}j(Ecșxfar *DNyg| -\4kcXy٬v^9}[=C-s MI՝(&N%s]ڂ"t }߿Bj.O(Yv۬JH'UD?bg7qУr+`KQ *Cu݀#xFMHoE${,EByAyw;~b:\5XV֬t)^_*wtwvMʖ(٫\̄b=H$(I/-Uo6%gb>p3hm O%c!c>f;Ĕ%ѿJ$>]'%yQ_#N)rT^ 4g `zvXŌGF?GICҿK[YOٙԣ舅)H#e_-inq"= xP/Y6[:=k ۹[5V* ;KT F fwM;Hi%B X%1@r]dqNX#'B[[x1<&lOb2(IcxL: SE~L&"8+ 6QQQ+K%-647Tv(bb+=#koU"&0u:/gR@'K/򛣥uP(A]-g&AcTAϫhF%~nO#A+g <(8яo3[]4oa( < B;mbx2^kW?35cXϼa@tY\j2b1= '0܋U@Wc]7c؁s)yW{#%Fmt_]X2U4QτT/[uD7 X5aoD$8QvꄯM]8&F??kÌT3kܰ|2# ׎V7gP=^&M(:_~פ!ixuPDs5 :3~RDԗf?kx7O[i/¥eQػor\SAd)aFr5鏎 Ӽ5q3fd \۸) B?*U_ڍL6.sSjw*Gd+;&?k0Ietg+12~V woD߳|16=lGht*8WWv$J3m_R]]-N;hb9z5}#UĈ3w#i3E-'Gky#oU7$v rO1yc<&#<IENDB`doublecmd-0.5.8/pixmaps/mainicon/alt/256px-dcfinal.png0000644000175000017500000005632311765566230021560 0ustar alexxalexxPNG  IHDR\rfbKGDtIME ?6 IDATx}w$GyV潽t9(¡ @1cgA&cBDd0 ID| w:r{'tQU==3fgvNz7TRH"E)RH"E)RH"E)RH"E)RH1Ag9ճe$Z2!B=SpMFw5lăm0G焄؉2hd|2ezs +)oI1~Iy2;i'/} xMLJʗXj# t$7MbBv&N?xyBFO~Jǭ]yF C wt,_xc|.<^xca¥.}wI ұx>36Xޥϟx,1'_I7p{7+}0)wN*) "'M7}j헭Ͼ|oV"P/f3 GV\eti+@g+R78. XH V&YǏ{?I@?C3ƞ#.,Tהȷ˾KDž,D#xUND DQB JL_\07L+//)Rb6nx $Q !n.}Fo!ߏ(xMc`~חN_|% Y0{V:ەڇ:VpI:%iC/O=zuV;bLPW7 0gl̛7lxAI ~RJ3y;di?Q25&;.]Q@;:hB455E ""flȹZ/ΏXe9IaxVݷZ^]ruBڕW.}.R Gv#Z^f=+YKwSH_F8 ep }\ڹ 3~upJ_Ũ7ξV|B,^.FoADp $@T )RLX/>T@ʹ' fŚsͺ8?`xYw $qɪxٗdr*twD%!. ')R( XAH fu`go/5әYgCEKWo5MMMX|25ɰ㺠TS E>&2,]}(x9u5l@)dr*d3L61lRHQ >8!mr,¶c=( ʺ[*>c";.Y~2@\Ūp3sw)4 8rvqp\g'݁iv`uQ ;Ze/YYuL"0a霖f\bZ}}y]u5gy'GŸ"c%UK;;q)jͼe鎊d,>j['"dL*)R{ً9ft^Y"6ۋsOV`mDxֲ+0Zܷ&o1۳w\iE)FaqX2+8ΠhJ8#ج2?{ A8H1ȱj0dnB X0Ԓ}H4clՉY8̪ )f+'miN+}I0/09ɬL"ܮpڋIb*jY.SG|1ó̙k%GpY2(GdL" v%pZZ&!ؗ%|HFd_Rh$Tr<+]HHKYY%:\i)f_*n>[ cRClkmS#Ě.%8i B|݅餻]&3Q0dc0bl*1äV#ÔŻ,AGpmo> <j#No~%p13ii'q,-}9a @ BODjcg&f81Di%EDг%(Rt8 Ge{{]  .x/+n_= E_V$YZE4AXiFb RE)Z vf6Z\]0؄f7j@fHc)K@@G,Ωs'G@ĞW%=59mNj XkvE &5\lR2H1$ =8TEgX)v̰ &'ah/#`Y5" [0=\Y4egǀO)=ҰD,sR @[ сL%"t"+!{20}|0ȑ􍠇7 ]AmHK)af`QBo! hw,ʽS;A32 >s@R|iY HV vl@JʣL"0Z J'@Ge2؋fz&)L<ɐ҇_(/  {sbx ڊ⡽0`4n%GoBkX3T"κ ?}~KG.o>DQ=Jvjj)C|K3ẍ5l Kcm-N5ǣc̞Cٶ6d[67#85,Dš(<bB!X"袋Jz Vj0n .2&z,FR"?8Cڷ7oDc?hz P :ʂX q5^H2 hw ϡ/Y>!i=ǝ>=]+VRǂhiP6ʵH4wt]Wy1A ߍA~v584րZ 4AHBX0PH|@k1-@aVfsjwʩ4gr4MAp˵h(Ѵ$]}-e( w<'N _ "E"\:>#Y3_CuSv-sd8-XqXzsduJHr-->Ttx*\}p䁻o_ȫXC `] _$05 D|-ƴ Bt-]z;^fy! `\`KҲ$ j`Rk1^J؍Z_UߩuFe8’ϥlsKݞh D"܂Eg_@ :{vbǏ}= >1$$A`Z` "lBmo|p]7^EsAbYI "t-Yw^GC=GΟ;~@de, :d0[[7Q$fbm )>zej敯IW:έM>fh='ʹWa/oD6Hb8,8hm XABc D09 ~<{Pp^y=j4iG8C^Jl|wC>va V Hl EmQI뇑{~}H'%<|qHm]]61c sN˷QWo753\LpY5}aa Иe[f=Zd9tO/xO|?O\=TeMDBP@VCa!)&M~ƪeqh4͝-\{ڌ)X "t?~3mՏyO GB\AqnHĺ4@8_E`dLKV oEMK}[q_E87uWǿQ.١ 8{)Be%.xP&>KQUq>L_)T@{hn| T-IjU[L! yaTo}g ]NӭD#%*B`ŗS\Dž#h @f #tl `BJGsG$~ݼ8\OѬS)= ܏~= |/Q%REKR-LSt H~1OQ}}+_*KHH-Qq]i3y> H3>O P~#tum"ц<UR88_>J>ٟH-1`g9Dz_G*SK?*zR<;w>.{' 6^bK `^>v e.LԔFr/M=)*Xm}ƹxE3uG w!%q Ԅu!+BC+ܔʣ7zT߼SE_Jq#ұ VQJOź~|vu90f +'Kx$-O5jiFG PCYT4 W|Z`S<-Y<`D4t []{hzJ@¶L:7%ĵXJ!KЄ5`:,<8lΫ-8iS'!* c-\^oCJkWdBW|O~?#6`'QJ`񺳒ӫWƤx5׍5(Sv\K{ЯGjR C /fO#Vcً_ϿF*7jՈfXJ X,BJM]]ffLD['+8zpSۓ"ӄEKfXOSP CvEۚh[ PhұAW@:.2B%'#9tz a0i_sd]*5Ihצ8,ղOw*H> \oo,D I@ؿ}vrO';z6JLO ]-0ρ̝{÷7EIytZg>ʒ#]RcBV@/c΃]֠RJp Ԍܼt5{1:O8/T|SwCljq3)q@+0U`UW_V`*iZծ/w{202Dz:HBqb P> eց$=+M:#FSEAWF[N fa66cf Fa%W"^3Φ×3beI MAF+Pb7V5V'%_ ,~SR+_ĞͷG6<mͱT}:X}_=ޤpɪFЃ*RGM82 p'e-4Bu AY[-D}Ҭ+'*y]@l>De_o a_Xc!uy8lx~b5 \HAƭWך.ad@h]FGD:dIM]p58Џa Ab!! k59HEN̚RksSK+o ȝ.`>B^sC0C0J\iFGdF<Ij@~p;~{?o)\(fGoEZ~7ًG `Ah1:=/fq 8"+Dl9~"V'_EbH aǽXR5<:/NlaT_HK`j 0idm\t,\)a/w|mFn~`[nowy&HX @Zdz !@+2.:2ڿ%"QvƩB8`!1C6c W o*/MXqE9ў~΅@RqEDЅ0јV~fXU)&Bk M/B@`\Whz%/ZwSyALSqV1d bϘV ƵmSty#DߪO߷|3|l P V`}9*|:NѤx%lyFhۨoa7RmіP$A>5/{aENմO%|ᕴ?_*R bw8ĵlk}#nzѕA;zx?'oVwj%9~IVB?J`ߵJ PFf`XfWbm%PJ”{ !U"" !KY/k(2\8⤫0e,ahW'RDZ&=fJ1#Iw('؆Ǒ$_X'|~ Ph掼Pcf t:G +oFf'hZu6<?p51<mbx }}ҩh?~mA& IDATX tVۦn=Ϙlb`; %i։kuzID7Ynt?wܻqd.kzqеb P.Ie^h5B1""0͓@S7~k^QblGZEw%8ǻԐa HV>(P`\=ZD]7Fsܱl;oJw1Mհ.b&~ {l]K@g|'F5u1 G7]#hǾӡd-ZjB$Z#IHV~1<'#hO6حٟ o0%v TD5$…4kw7=kH@ \x&JXo4) 9~T&v!extڀ./aʈaK?Sۈ-Sh;K`.7#[=k$G{Urs~um aڳJ֚vJ 'M3ɓ ^m %> y5A[d9o|<`C"P_XA $ 8xO_gB^Nǚl*etI6!>3VVMm|$i'|ۏxo CW FDm~9LZ@În,t##:2:VEK"% s-iǣ]+Gf<Ȟ#F@urtW%hزLL03gfrF>}NUt lڀ?^KZ\if"}> k5m^h a寴K6@,O(3MQac,MJ7׋?))HP[lEjRםKd  @` v#I+3#=}TJ;M^IkZuUڮ@kk@sQ"B&ǟT!OJRbw$e.ı4k#f3բ+ } =7JO:?D&ϼ(0C"`ǮgF0g]Mzc}qD<Cϣa/h䃙# " ~B8b5P?L+"{ˆZ.w~>bvtD`ip?ib4B^-rƓ:ov EEY5 {wH:^rΕkc56iTk/8Cb&Mi'aǝ`'AN=]3M5fWXAasU hH;$+2Yt}F6L4\``iπ.#Ҏ_Οo$`31LPе\Ot3!p[ #u$:LOK;i޻27|=&P0{,f0z'Hֹ#o4u-VAGu)l'?ǎ~MUx`@V􂘩r? Irh3ٹ#RV Krf|4.|)eʌ= +gZ# & [ѦY&hQN9#l&Uaf=rz$ϕ\J"~l*]+%vsv(g3 V4ph WIuŝ`]7a`K>c;z9)*dq+ @8=?I``[Aˌp䞻 ☴yҾjB^.mfF˼f+X@ Ҋ <r8xߟ,"?H @)>~1'yx[\7m2,ڗ 稁7 &.h]2Q.etч\-BBJ5?"CG v4FR[D@<@+u銊2w1dp?icWi % Z{!Byt-˥ PD+*`}$ÜWȓff}jcYcA $L1 el% ~@sXuIRc5[,䵀}{@߳yqrE+w4A IZ=ƃ5 f G(קUc!%r0c+4&;+d4ՊNKKI\-ލ?mM H `0Ub~Pv$\pk Sh֝{sz>PS7`dH `0Z%ρ\f _;^4/RBfq. !Q8`D«־mߠP QZdx^_/@  H< 8]݀S"7Ạ`ijY,:IH `W)~G\45qH/+PPP("/"y<7<`t},%wT8Ll"e45C45f/RX1K#T2Aj=Yz֬?zf!!a#%6A4ijܬ:g57ThH `0m ʙ)侥Œ?7 x27ox2? 0'd>XE$W1rPQNs +2݈x8uJ5H ~n X}]c DTE`V9Cdp[බmoS(RH `M/|G>PaWDKF'/pM#ˊC ( DpZභ!]=$#%Qtd2 a0p4 jrC~mi#n@r@ "wnWфL{܎d;&<AwAo/X$ #o?V:PNxPu ;k2@WKC/<[ 2]&?s kv}jvѠeBܗ8yF;rശiVLP5%"-^XX{^]GeÁP AxܻvBYம1[)A` =>Sqª{k:8hSSo.YNX´X$kd &;z#"Ypgu4%DFa c"Fe[(ij[>l%`F VԿ"A$'6pgF RZ;;P~XDےeo!OZM hi|Q";1y&amU [V0sɠR(;cHyٚR08D"crLʽsN;# j3w! |5C`3G| A@y !žcvoʞ ִr4}YD:'upJIH vA2ɪ[~.]Y,woPZM7Qڤ>{큝['cgm qjH @WB{Ez#s3r{wB>Zwv;E|ZQܾFwN8=~40`6P8|^u 1 &PGI B7`pƐ'!03u5m(8Sh\gAJ{#mr >gg7;3MpJ؎/==7_<2@SmkV@)R s9Fn쁗ׅF}DsfuA `#}sY>Hz{{hWJbҰ袋!ZZ#qCB)f4}܂M(;~ zh?B:N֧!p<|sc0msM;R8-A @s$`aKǎ Ivo?44ׁ@S.aMA"M,XML=w_"2#6Q`߃wx?[6x`7` ];Z3'V1qk9}R@sOFq2oR+ iO\,x`7[6;r ⯚H+j RD,*0з AB`@-K J %zͺj6̻,8Rmg5q {辆/-ֈ`f%)O\)4@j̇V j".Nkc 8COo;}Oa, jAB ىe/{~C3,p1ooGe{EH蜃/ ^}zI1/c_5]aml"K0S1Pؾ_r-z~!G\ګiWq@ ͻ%Gw6,e::pM@Eg+0uڋ¶'KBbIc󉧣ϛ>?8 Z6@ R LRNFN]?(H]'f=TTШ7_jk_*+.](5o,(W+V@y8tj1}$Gy+jL#&9ЇŽM6T o 1D 9 ͋OcLW,@ZC[Xfx-o pӹr V/#`TAj$9<(i;ZX?4McFvXpK޻׾}01g$:Nxۨ;[ͽF_Ѯӝ+'6Cs$a|-/uci3vV|k8 P ]e0ӆ} LcD C~!v<9~ >P@Xt5(`#whm뗐^%Z,iyDA@X;;wxߘHz7fK#e?Wsݳ}Z Z7[ײ/@v`yry=8;&)7âqj⎧F݂l;&G_LucFkLC8m ;E:L6LAM nلCF!p?J@(QK c0ޖdz`RK=Qܵ@\+;xTw[e50_I8[}`f[muq m(?48M87R5A"͇TF!?ݛ I2hCk$ŘӜn,{H4XS_Oo@c~2_ z}̍N)3Id@+n Ԝ`?;Z%2/å`4eX~g) |[&ocPہ@!%j`[۾ssCGK|רeي1$05P3`߇'ĤR_6MpϳPJ3Nk?C9Zow 2I ^`~G;E'1wGE _SNKew*(hډpL=Tv &Xz섷'0"6M~f?X5tϠ?b'ˤLXU0IVʯz}o!in9 -eA@.G c@Ed0aCv>=.rDMk4cUҢzA85,疯CD]A p"j}W?{uiuLϸ::뉛[2D~5XA# @Q(rҒ ?( %4%_Y ֯ AKMALE2gv(ࢯ~ZVl j%#JdPoR3-Q4#]a쪡va8*녁ge.4)(n,=/ Pn-;\8Sl V9_-J^FBҊ QbTѠKb ]IDAT9`fdGqVB!j3~(@A - ;?-H8nТ7D&;WR?CJj?޿H K/<47hVpE8MX7L+We[@T {{0QB\uE~E>1C ( hnL5s-&?bfYgCڳ?G#M 4/TyPMMm߈RDk7-+ t{~;*;L\=<ͯ7<!  -6="'8ͱ_7bŒE&"I&}G~S`1#X /9o#>s_7際 xq)ߟCӟBj$o`JW$@ 0C H`?ɳo>uhA^&,rz+7;~b ˫"l&CpG!.c떥QU_Ueܢ7y2P2@R~ː#o,?^_*7<'ۣ1S"t$w\,Ӭ _@N*L6v}s{r=\A/ pIk ?L! 2/)5Sqh^;F|ȴ<\z9s9nK0!BT:갤R7 ~N|]J+:؁V d+<{0 rf6 %!IZ'f`\U|2oYBK@fqeאMyG=\-.(V5f_d-.vF T HbO1 0Y9cG87_o6O凕BKNbCPja*}X*Zɋ(l(Nn#dw/M3Q,R]iuXlTEk1KgCL]mos{vZuaZڏS]Ү 1iox։ߥ9S[,>:;n9}ana !P^O/(0~M,@Dp !p2T`_=A`{f8nM u @h:z6u|d6P]Klǘ41*`b0gH0\zaç? 7Xikʗ+_ ܷ;s_m:`S0TMq٢SDc'Q~$Bt}=-#A e mQ7dݍ֡330Uz#}6<,\b,9IG1W6.u( `|c[n:Vo Gۢp߂>t=x?-#2pU i5ݗ d[U .[&-Sd)<A@R28쏟ࣨB̠݋]%YMKL?-_==$&j@YW*ZnJC"oҼssL{>_~_~yI܁۹v؎|_ s ;%cT$wi3pT#m 8 tΪmhi }BoZ!7߱ %BY~?c]g6i_|m]TO;in_UUfF `pK;·u6PEQ{?/ Yʵf13ZXI"Rʧ^~0~Ć@L&̒Up.\E& ]ׅS)>]_ÃWU~5x⮀d\̪}Cf08G|gn&qGi%5kaH 8ϾhPSd `)T7R؄hpd?dZ`o?ez %oÁ"so;:@J|?Sgٿ)ƈ#wߎߺ3'4w]]3 j܍& xO2Zrًƛ{]aw?~vw_;vk0dH-Zo3aY,вN9H `qg?[0"doUߠ?Sg>-8 1%~ lR`Ʀ?|_%)LG?^Iϵmn356  2%IXoAy3u)L+b7>˽=`/V~H1&;?5M$X>l:O&r;^opsnzÆ>&.36 E&J`S8;~ORnHǁwq~zd@_Vj?7o4$ SYNP6 S=˃w-)݃׿}JlI*FBamtw>Ցh )z3" ? DH$ ᧿u,=E1Qp ޴2Ic>L>TG ˳fq13c'!j_OMqa~~D%0ր‘2:F[^{wW?ՐZU `}]}v/75MHj,$]M :S Yx}xχ_ۖTBJ˗{#+jN%tA {k8 Z :TӔXp?)z/-S)$sy|@3dMxp.c&+jg`;;.Pɴ#u.&ZuY)XV1凑t FͺTOIfҒKv2ݿ̫pz_@d2uyFDJn*9Dh7&)d0^3u_-`g0(gc-RP;C'袋'13\?~"w,-G_KDME R?U=uᄫN8.(08oГ%zG⳪LBdK;}Y{~+pXtנ!__Ϗ~>\踋Lԟvj3r`0۲}Y$,v7>X +" A Q0սq$J@H?߃٧gO ;]ǟ){&-r[7p~zF9YBGÀ= W`F0 )&)1-P3MG}D@ZdпGг!/i<9}fv[w&֜rz1\n߻Qܳ {k+&P=L;#&A&"og/$ŸPa" blbˀ~"xGoľ @4`։'sjtuZkmHr&̳W?7>} wQ$>r%8q^k{7ag{z~x`TWtUW4n5| ͫ1_Hf=ku$YHHc9V@UЭ^;z | T/l+ՉHECHEu$p JV %:K̠Vۙ_ R(A+,_;tN_lg@zh h# f@]'jEJAވtyHhϒ:^QIؚ^Tpz gyYY+EhE+\@1edfVuiDum2re9p.\ѓ 0=oX^''ˢYmիS{ 7bJGvMq"eq2@:h+O22VY[; # ›Dd0Tb 3o\]g [Dсa bRB#$hftm yټϸsS/N)š] i)ߢw5Gnx[Z[ vJnJDw B00=> t2HIFK`9c/ \ 1i@oXǑj7 UI5ɾ689LgXVe0zk;Bf[o<C(~7! |ۏx M4ip=XEN/9]X{vDaFY*ڶ,e8j_=B*?}@"=S`N fGY̫p fj l+:%ȸ7WӮ[hW _g&9XͧPq,m$@9)$q_Fەlw p[SV|UPFಋ/N(Seddl0$_5Ɠty}niZw2ʳ.X*6bRNFFm`(g0_-Ow`Zzk:h`λeD1de###c=`?3y8kROx:7\|dzU&8w bnAkRC(p+\[L&Y ddl$l0ġ59VkV`'.0֖-J$+ CIk_C Z_Yԁ`ʖ>Y{D.^(\,3GlY2pFF4`3oe@OFzX>vg\P81L'j-H̏32ւ# xi",Ff=x To,"lqE"֖bK+"<:9#n` svGnu[Ps塳O)4btmW_~ue1u{t44C`,JhK oWol6> <Ϸ a$;MR z\9b; tm9 ㉾ӐNRP_o^ONaui6IqEq9%DH$ߴz~ :]o[.1n T+751\S~a_<{/(<m6-b#ք [g-Q>{TXˀ7UkeJCKK@l]ɫ?yjA¢ZH %hΌ!p) ͮ$̋WscoՍ݉{dy8~4^4_EfsΥ-h&I] HQNnSjg`]w Mϯ%ؾ?;|e/)ζU ЅmI[ Y߻6죮%mf{N̘޺cmO JGz䠲C7{pW&ޣx&)>^WGL˟6kWXLˏ\ V0Т⊅\=̋nߵZ]}nMˋK} ?m6GȃkD:Wø};?T2xVeSVY `Y-CwM]zػwx^eL~5QTwZ+saI܀6 0cGBr6Z960_|q8W# Y|ܾKW}l_7k쯺 ۄ:t$*ruW׈zSE,Xk!p]GTAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_a <IENDB`doublecmd-0.5.8/pixmaps/mainicon/alt/info.txt0000644000175000017500000000010511765566230020247 0ustar alexxalexxAlternative version of the main icon by Ivan Dzikovsky (vanyasmart). doublecmd-0.5.8/pixmaps/mainicon/alt/dcfinal.svg0000644000175000017500000011261311765566230020704 0ustar alexxalexx doublecmd-0.5.8/pixmaps/mainicon/alt/doublecmd.svg0000644000175000017500000006664011765566230021252 0ustar alexxalexx doublecmd-0.5.8/pixmaps/mainicon/alt/128px-doublecmd.png0000644000175000017500000001736511765566230022117 0ustar alexxalexxPNG  IHDR>abKGDtIME7KIDATx}y\UwRkoIYl@MD6eQqeMy#AF>*7sA~Q!DYe K$@t:Iw.UVuUuUJ,s~;ι<1y *OG݈1UD#T9s!!BrL8ߋFV#֝8_XD/S(0 F_ Ľ(s/~IX0B~*P>?;/~s.JDWpfzS-B^]EGO[nk*Tb "0:f++A^pŅʙ(D =/|\)_B*(}BBqSDHs(|UX&*~%-#iFڱZ $[~6ꚜ@Xw˘-Psǂ BƅqI\}1nQeY%3D=)_4.J S>*>K/8))3HD[8yQʹ5`J}Upe ("IG"/*2__'ZR ?R[BQ0 -ɣZlq+Hs(t5QEWOUIEN fdlol{){*Ыw0xK+/[NBBi Tܒ0/v:eW7=|x+@E'3t/ϔ اl*N >^"KBqʔOq_0@=--:0ztvI]3!e @vsYFmaЪF"B؟f:ƤKzR\wGc1CBh0 IJQ1P,LhkŎ[sѦvK,65-$3(0 ]L4HiL$ [V x 1hpAZ$r& kt!\y4?,ÚEb=e=BxG,|] )ݎ0:3ӎ;ڽ o@/x+!3rO$%سWy  ^)$0,'ưp͚u^+V>\WǸ,(FA@>kl<$dO^7grz_qyRM\ &]4DZPKQ{)BKbh(xJ[Oi cʙܼ@RwND9 k;sf`i\ػރaSYIs?86M&fmېRN"3޼ڟw Yu0ZOdXP=dKSADD"s-$4D%c927 hkB]KbfW`?@%Fs|W Ήd5FX+"\CCZ)9]Xo֎X,6jJ.w_)UMN Gx<#_xigEGkIFUt\-nC,&-ZI\_E4sV4jJf $p{ `̗ ,&V(>h-c]8Mgiu]DϿ}9ȦSBb_$@u]z\KXus'/"̓xWC.`0;$Ym? |4gjg@ `u/qI^xr"C@_|V9}SJ]wG_:^yR@U1>J M֋OiZ1sᱫZ^*c5E7qv@ ȟًL&Sԗ3@u:Ģ0<>p#}ì~^˫ޝpwous 0䝷2 $hĽYJbO(ZN?(!as>u`xl:*j4eW LGXZ~LvMԼ_  uOsKjV-w sJ`& rQr%+ ]?[|6Pm :(t`q Ȝ{ rq_ 41-O[b *Lpa~e y`SB}o-[h bANj/f滏v79oZ_J2kOl)jP7h RW!0xrrTK{id= MCpz}:#B83QKe5 #7+V;!n/75ּayB^V镔\9R_5?Z MEPu]+K-wOJ ca 5=UjS ܋.ɧk4ar+0 Mݥ̓|BK7, X>ByrP0 t 㯾԰,3.ۛN42h-@DbjޱiHm|,gvj4pߛ-uX_.T&Uw<-m|>(ׅ5:k4Gr2 a--U6'@ VI8SW!#@tiSm#w!⭹RNjQM  h98Pw_"vs[J)E-vZLR##ZBSVRpN;-"8}udzwb9@u&t`KVmO`M;տDήM3$ܑp)= vEk_w\w>x %rm' u!(ARBvA8P AY{S-ew,@ vZAcn^.ܽ:S!۶~@{m9ln`V gp'?bӪ-[SjE|LJm-P b0f3Y\ T6 gW!G+΍>~19 d:`[n~42o@{w]R), (رXWՇΡ*5ӏ}?Rzej=j&[8;ނ;4zw]o币<ѿikrp'3 r ]&kE}9si|`e193tﮟp33$Ģ.¥}"k^Ƚn̬RB_˯bR/њ hn6?|_i{y7{*X5a.wfm\P*MTu _D ~Rhi"3 6OlF`~?,$}.Ghg/fQ]pw#1hg~!+(d2)X ?>kӆ/Ex@n LVt=N=]-^}qgDc.%1@$Xq8$(MG:Hח"CXq۬}̇p*E".JaYlF(ނU_V]u =0i8cc3gϞGzŰH C $D70B`3 {=&SւfT@0z7X&_(opύ#q(3#²,躎ο(A)mDfVNn*w94uwGvNiD8okW)%l.c!@[[R ɟ~'S߱jX+[K|sH̰[`4Mm_. c.{_ )} ICJͼś |S4 kSfWC,6@{_O:q,36(Kt 4D`J}ˡ]s-]?.eufx3HaA+:&6@]ųH@\3 ciP 9zPz"O>̹kESadSH|Kl\4%=lXIд4 mmm{ l<"Ռo?j.~L)  uR;Z#G[[[P (tH[Mwh2o^A_xt:ůAi,@8Fkk+Wl=~\w6]Iξ2ښ)8L؄T0M37bASe>n;]Wp#+%ѾL&B\  #,\ÿucNը4x ]&,z#V B0M*9Js$Oo_]BK?sY#5Bt]d{7w)ϙ^"G_~]EW뺅!3efD]aFaΚ#pYncJ?Ht~|90:us/z O"DY (w(x?",l``)kw6cu;ǟDG -GJYhuJCΜ2J48c~`p'xyO?䎷N*<j'@1bUZCѕ]zk Vhx#' x'}w aC!. 88u% P 0Y*a#Y4HCkwVXbD}&V A\m΅ڙGBeE dIL5P7D `דq&m6ҒY1uesgΣ,@@"f½j,%YAV@C'x\8Xe% p]fQR `I}\؊B2]%Ё<5N@g "|RޗYګtb8ּ%hfH,4RX_IK H0l"q>/OCGs[5 0 R 6 0 R 120 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream application/pdf v4_3 Adobe Illustrator CS4 2009-11-23T23:45:51+03:00 2009-11-26T01:53+02:00 2009-11-26T01:53+02:00 256 256 JPEG /9j/4AAQSkZJRgABAgEB0wHTAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAB0wAAAAEA AQHTAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqhtR1TTN MtWutRu4bK1T7U9xIsSD/ZOQMaSATyYNqX59/llZOyLqT3rqaEWsEsi/Q5VUb6GyQi3DTT7kkm/5 yX8lqf3FneuPF4+H6ueS4B3r+Wn3fchD/wA5OeXqmmlzEdiXYf8AMrD4Y71/LT7vubT/AJyc8uFh z0yZV7kMxP3GIY+GO9fy0+77lUf85NeUajlY3QXuQCTT/gRj4Y71/LT7vuVf+hmPI/8Ayy3v/Isf 1weH5r+Wn3fc7/oZnyN/yy3v/Isf1x8PzX8tPu+53/QzPkb/AJZb3/kWP64+H5r+Wn3fc7/oZryN /wAst7/yLH9cfD81/LT7vua/6Ga8i/8ALLe/8ix/XHw/Nfy0+77nf9DNeRf+Wa9/5Fj+uHw/Nfy0 +77nf9DN+Rf+Wa9/5Fj+uPh+a/lp933O/wChm/In/LNe/wDIsf1x8PzX8tPu+53/AEM55E/5Zr3/ AJFj+uPh+a/lp933Nf8AQznkT/lmvf8AkWP64+H5r+Wn3fc7/oZzyJ/yzXv/ACLH9cfD81/LT7vu d/0M75D/AOWa9/5Fj+uPh+a/lp933O/6Gd8h/wDLPe/8ix/XHwvNfy0+77nf9DPeQv8Alnvf+RY/ rj4Xmv5afd9zX/Qz3kL/AJZ7z/kWP64+F5r+Wn3fcpN/zlB5LDHjZ3JXsSCD93E4+F5r+Wn3fc1/ 0ND5N/5Yrj8f+acfC81/LT7vuVIf+coPIpP762u0FeqJz2+nhj4Xmv5afd9zKfLv51/lxr0iQ22q pb3MhokF2PRY/Sfh/HInGWEsUo8wzhWV1DKQysKqw3BB7jINbeKuxV2KuxV2KvOfzB/NC503UV8s eVoFv/M0wBkZ94LRG25y06t4LjKQgLk5Wm0pyHyYJJ5YsJLr6/5qu5vMutdWM7kW8RPVY0HwgDwA pmsza48h9jvsGiAGwofj8bo1LiKAcbO0trRR0EMKL+JBzClmkXOjp4jvaN/dn9v/AIVf6ZDjLPwo rRqN4Ojj6VU/rGHjKnFFx1a+/nT/AJFx/wDNOS8QsfAj+CVp1e//AJ0/5Fx/804fEK+BH8ErTq9/ /On/ACKj/wCacfEK+BH8ErDrF/8Azp/yKj/5px8Qr4EfwSsOsah/On/IqL/mnD4hR4EfwStOs6h/ On/IqL/mnD4hXwI/glYdZ1D+dP8AkVF/zTh8Qr4EfwStOtaj/On/ACKi/wCacfEK+BH8ErDrWo/z p/yKi/5px4yvgR/BK063qP8AOn/IqL/mnDxlHgR/BK063qP86f8AIqL/AJpw8ZXwI/glYdc1L+dP +RUX/NOPGV8CP4JWnXNS/nT/AJFRf804eMr4EfwSsOu6l/On/IqL/mnDxlfAj+CVp13U/wCdP+RM X/NGPGUeBH8ErG13UiCOafRFEP8AjXDxlfBj+CVFtX1BhvIPoRB+oY8RT4UVM6rf/wC/f+FX+mPE U+HFoavqCnaUfSiH9Yw8RQcUVZPMd+u0kcEynqskKUI/2IXJCZYHTx8/msuG8n6qpj1XRoomb/j4 tgEYE9/h4n8Tl0M5DRLSnob96aaB5r8yfl4Y7qxu5PMHkpmAuLRzyntgTu0ZPSn8p2+WZmPMJ7H5 us1GiB5CpPoPRNa0zW9JtdW0ydbixvEEkEq9wdiCOzKdiOx2yZFOolEg0UbgQ7FXYqx78wPNSeVv KOo6zQNPAnC0jP7U8pCRD5cmBPthAZ44cUgHj3lfTZtJ0p7u7cy67q7G4v7p/t/GdxX57ZpdVqTO V/L3PWabTiIA6D7/ANn3oo5hOcsOFK04oWHCqw4qsOSVacULGxVYcKrThVYcKrDihYcKrTiqxsIQ tOFVhxVYcKrDhQtOFKw4oWHCq04qsOFVhwqr2OoTWcrMoDxSDhPA32XQ9Qf65IGmucBIMw/JTzKf L3nOTyo0hOha8HudJDU/dXSrydK7UEiKQR/MAB1ObHFk4o+YdF2jpq9Q/H4+59BZN07sVQVxrOnW 9w1vLIfWUBmRUdyAeh+FTirz3814bzzGNBsNOgkuLCC9a81B+DJxMMZWFSHClg5kPSvTK83FwER5 udoJ44TuZpKrvSdSaY0gYItFQmg+FRQHc+2aeWjy3y+530O08AH1fYf1IOTT7tOqb+AZT+o5E6XI OjbHtHAf4goS29xGKvGyjxKkDK5Y5DmC5EM8JfTIH4qJyDYsOFVhxVYckq04oWNiqw4VWnCqw4VW HFCw4VWnFVjYQhacKrDiqw4VWHChacKVhxQsOFVpxVaqO7BUUsx6KBUn7skEEgc0bF5d12YVSwnp 1qyMo+9qZMY5Ho48tXiHOQ+aIHkrzM9eNn08ZYh+t8n4E+5q/lHB/O+w/qdL5L85wSafqFlp/LUN KvIbu2HqQkH03V+NedKbGo98uwwlE7uPn1uCYri+w/Hp3Po8eYNLIqJJCP8AjDN/zRmU84jba5hu YVmhblG9eLUI6Gh2ND1GKpNckjV7uhpVYq0/1Tirub/zH78Vb9WT+Y/firjLIRQmoPUGh/Xiqg9n Yyfbtoqn9pVCt/wS0OKpdd+VtFuan0zEx8PiH0k/H/w2VTwQlzDk4tZlh9MikGo+QrlAXspBKB+z 3+7r91cw8mgH8Jdng7aI2mPkxa7sbu1cpPGUINCSNq5g5MMocw7nBqseUek2hTkHIWnFCxsVWHCq 04VWHCqw4oWHCq04qsbCELThVYcVWHCqw4ULThStAJNAKk7ADFBZDovkDXtUYMYjbw92cfEP9jtT /ZEZkQ08jz2dbn7UxQ2HqPl+tm+l/lXo9uA14xuJNiQxJH3Div38syo6eI83VZe1MsuXpHkyez0D SLNOFvbqi+Aov4IFH4ZcIgcnAnklLeRJRiW9ulCsSKR3CrX76YWCrzelORoOmKu5v/MfvxV3NvE4 qjtB/wCOXH/ry/8AJ1sVQF1/x1rv/Vi/4icVdirsVdirsVdirsVUbuztLxOF1EJRSlT9oD54CAdi mMiDY2LDNd8jyRBp9PPqRjcxnqPo/wA/ozAzaIHePyd1pO1yNsm472ISxvG5R1KsOoOa4xINF38Z iQsGwpNgZLDhVacKrDhVYcULDhVacVWNhCFpwqsOKrDhVYcKE00HyxqetThLaMiKvxTEbDxp4/51 y7FhM/c4mq1sMI33l3PU/L3kTSNIVZHUXF3+1Idx9/8AT8cz8eGMeTzmp1uTLzO3cyQUChQAqjZV AoB8gMtcR2KuxV2KuxV2KuxVH6D/AMcuP/Xl/wCTrYql91/x1rv/AFYv+InFXbYq7bFXbYq7bFXb Yq7bFXbYq6uKpD5h8r2upRmSFRHdDcEbBsozYI5BvzczSayeE7bx7nnF9Z3FnO0E6FHXx75qMmMw NF6rBnjljxRQpyDctOFVhwqsOKFhwqtOKrGwhC04VWHFVhwqynyj5IuNXkW4ugYrJaE1qCwP9cy8 Gn4tzydRru0RD0w+r7v2vWLOztLK3W3tYxHGoAoKVNPGmZ4FPOykSbPNW2wodtirtsVdtirtsVdt irtsVdtiqYaD/wAcuP8A15f+TrYql92f9y93/qxf8ROKra4q6uKurirq4q6uKurirq4q6uKuriqT +Y/L8Oq2xIFLpB8DePt8/wDP5VZsQmKLk6XVSwyscuo73l91by20zwyji6GhzTTgYmi9dhyxyREo 8ioHItqw4VWHFCw4VWnFVjYQhacKrDirJ/JflJ9Vuhc3C0s4jU1Gzf19h/DMzT4OLc8nUdpa7g9E Pq+79r1mKKOGJYol4RoKKo/z65sHnF1cVdXFXVxV1cVdXFXVxV1cVdXFXVxVMdB/45cf+tL/AMnW xVbdaMZruS5juXhaUKHULGw+EUB+JTirFfNuo6hod/p1tFP6y3sdw7MyRAqYGhUUonf1jmNqc5xg EOw0GjGfis1SR/4x1bxU+3FP4LmH/KJ7nZHsSP8AOPyVovO92G/ewoy+1a/ryce0R1DVPsSX8Mvs /tTO084aZNQS1hY+O4zJhq8cute9wc3ZuaHSx5b/ALU6hnhnTnC6yL4qa/fmS4CpirsVdirsVdir FvOnl4XcBvbdf38e7gd/9v8Az75janDxixzDseztZ4U6P0H8W85bNQ9WsOFVhxQsOFVpxVY2EIWn CqY+X9Fm1bUEt0FYwR6h9vDb5fdl2DFxnycPXaoYYX/EeT2awsYLG1jtoBREFK0pU+ObUCnkpSJN nmiMKHYq7FXYq2AT0xVKdW81aBpSn63drzHSOMhjkZSA5tuPDOZqItiV/wDnDYIStlZNJ4O5oP4f qyk6mPR2GPsjKeZASeX849YP93ZxJ9Ib9a5D815OQOxh1l9n7VKT849fW3kkEEVU6Ci+BP8AL7Yj UnuZfyPH+cXsWmafd3mm2l2966PcQxysgjioC6BiN17VzLdDIUaTewtBaWqW4cycKku1KksxY9KD qcUK+KvPfzPA/S2hnuIrwV+b22a/tDkPe77sT+P4fpYYc1D0Cw4ULDhSr2WpXllIJIJCpHau2X4t ROHLk4ep0WPL9Q37+rNtC8021+BDcERXPj0U/Pw/V8s22DURye95rV6GeE77x709IIND1zIcJ2Ku xV2KtEKwKsKqRRgehB6jFXl/nHRjp+pM6D9xMeSn3P8AX9dc1WrxcMrHIvT9larjhwn6o/cx45iu 1WHFCw4VWnFVjYQhoKzMFUVZjQAdSThCk1uXrXkjQk07TVmcAzzCvL2PX7z+AGbfDj4I08frNScu Qnp0ZJlriuxV2KuxVD3+oWen2zXN3II4lFanqaeGAmubKMTI0Ny8s80/mXf35e202ttadOY+0w+n +P4Zh5NSeUXe6XsoDfJue5g8skkjl5GLuerMSSfpOY127iMQBQ2CkcWSw4oWT/7xzfL/AI1bJRR1 fWukoU0qzQ9VgiB+YQDNo8Xk+o+9FYsHYq8+/M//AI6uh/8AGK8/4nbZru0OQ97vuxOU/h+lhZzU vQLDhQsOFK04oWq7IwdDxZdwRkgSDYYyiJCjyZz5V8yi7VbK7aky0EUh79gD/DNzptRxij9TyvaG hOE2PoP2MlzKdc7FXYq7FUk826WL/SZKD97F8Sn/AD96fRXKs2PjiQ5Okz+FkEunX3PKGBGx2I6j NK9ksOKrDhVacVWNhCE88naSdQ1ZKj93GRU+BNd/oUE/OmZWlx3K+51naufgx8I5y+7q9gVVVQqi iqAFA6ADoM2bzDeKuxV2KobUtRtdOs5Lu5YLFGK/M+GAmhZZQgZEAcy8U80+ab3XLxnkYraqf3MP ag6E5rsuYzPk9TotFHCO+XekJylzlhwqsOFVhxQsn/3jm+X/ABq2Sijq+uLD/eG2/wCMSf8AERmz DxeT6j71fCwdirz78z/+Orof/GK8/wCJ22a7tDkPe77sTlP4fpYWc1L0Cw4ULDhStOKFhwq6OV4p FkQ0ZemThMxNhry44ziYy5F6b5f1ZdS09ZCazR0WWvU+Dfhv75vcWQTiCHjNRgOKZieiZZY0uxV2 KtOiujI4qjgqw8QRQ4q8g8xWTWmrTxHuxaviakMf+CBzT6mHDMvW9nZuPCO8bfL9iVHKHOWHCq04 qsbCEPTPy500Q2DXLD4nGx93ox/4UJm100Kh73le083HmPdHZmOZDr3Yq7FXYq8j/MTzM2oX5sYH P1S32YDozdf8/wCzMHU5bPCHoeytJwx8Q8zy9zCzmK7hacVWHCqw4VWHFCyf/eOb5f8AGrZKKOr6 4sP94bb/AIxJ/wARGbMPF5PqPvV8LB2KvPvzP/46uh/8Yrz/AInbZru0OQ97vuxOU/h+lhZzUvQL DhQsOFK04oWHCqw4qnvk/U2tdSELH93N8JHap/tofozYaHJR4e90vbGnuIyDmOfuZ9658M2jzjXr nwxV3rnwxV3rnwxVgX5gW4+tR3IFOVOX+yFAP+SZP05ga6OwLvOxcm8o/Fh5zXu/WHCq04q3FE00 yRL9qRgg+bGmSiLNMJy4QSej2PRFW30yFEWisOYHsxqv3LQZuwKeIlIk2Ud658MKHeufDFXeufDF Up806z+j9EuJtuZXio9zt+PT6chklwxJb9Nh8TII97xKR3kdnclnclmY9STuTmpJeyAAFBSOFVpx VYcKrDhVYcULJ/8AeOb5f8atkoo6vriw/wB4bb/jEn/ERmzDxeT6j71fCwdirz78z/8Ajq6H/wAY rz/idtmu7Q5D3u+7E5T+H6WFnNS9AsOFCw4UrTihYcKrDircEpinjkrTiwJp4d8sxy4ZAtOfHxwM e8PTYp/UjRz1ZQT8yN86B4hd6gxV3qDFXeoMVY353jEmnBx1Tf8A4ZQPwJzG1YuBdj2XOs487YAc 1L1Sw4VWnFUXo6c9TgHdSXHzRSw/Vl+nFzDh6+XDhkfL79nrcdI41jHRAFH0Cmbd5Bd6gxV3qDFX eoMVYP8Amben0LS1B2di5/2I3H/DDMTVy2Adz2Njucpdw+954cwXoFhwqtOKrDhVYcKrDihZP/vH N8v+NWyUUdX1xYf7w23/ABiT/iIzZh4vJ9R96vhYOxV59+Z//HV0P/jFef8AE7bNd2hyHvd92Jyn 8P0sLOal6BYcKFhwpWnFCw4VWHFVhySs/wBLnL6bbMepjFfmd832I3AHyeI1MaySH9I/eivUyxpd 6mKu9TFUn80MG0t6jYBiSfZGb+GU6j6C5ehNZo+95y91EO+aW3suEqL3sQx4k8BUW1BBjxJ8NNfK VyLjW4kFOhP3/D/HMrSG8gdb2vGsB94eq+pm2eSd6mKu9TFXepirzL8ztSEetwwntAHof8okf8a5 r9ZL1AeT0vYmO8cj/S/Qw79JR5icTufDd9fiOStjwFv63Ce+G0GJb9aM9GwootcgehrhQtOKFk/+ 8c3y/wCNWyUUdX1xYf7w23/GJP8AiIzZh4vJ9R96vhYOxV59+Z//AB1dD/4xXn/E7bNd2hyHvd92 Jyn8P0sLOal6BYcKFhwpWnFCw4VWHFVNmA6nCrNdJ5fo22PYxqR9IzfYPoHueL1n99P+sUXVvHLX GdVvHFXVbxxVKPNUhTRrgk7COU/8kmynUH93L3OXoBeeH9YPIHvD45z3E+gcCg92fHG08Ci92fHD a8DIPy/uifMsK9SyMB9FG/hmXoT+8Dqe3If4OfeHsdW8c3bxLqt44q6reOKuq3jiryL84i0XmC1k 7SWqr7VVmP8Axtmr131D3PW+z++KQ/pfoDAfrh8cw7d7wO+unxw2jgbF+fHDaDBcNQPjkrYGCoup sO+SEmJxq6aqfHJCTA41dtSVrOYH2H/Ctk4lqMN32NYf7w23/GJP+IjNoHh8n1H3q+Fg7FXn35n/ APHV0P8A4xXn/E7bNd2hyHvd92Jyn8P0sLOal6BYcKFhwpWEgdcUKEk6L74LZCJQkt74HAZNgxoK S7ZmCruSaADxOR4mzgp6paQCG0ghH+641X+n4Z08I0AO588yz4pmXebVOOSa3ccVdxxVjfn+YQ+X bk9+FP8AgnVP+N8xdYaxF2XY8OLUwH45F4w8pznrfQKUmlOG00pNIcbWk48k3Qi802LE/aMiAe7x Mq/icytHKsodb2xj4tNP3fcQXvxAJNOnb5Z0D581xxV3HFXccVeX/nnYt9T0vUFHwxvJA58S4DL9 3DNf2hHYF6X2cyeqcO8A/L+14+ZTmsespaZjhRS0zHxwopr1z45JHC76yfHDbHhXC7PjkrYmKsLw /VpBX9pf1Nk4lrlF912H+8Nt/wAYk/4iM3AfPMn1H3q+Fg7FXn35n/8AHV0P/jFef8Tts13aHIe9 33YnKfw/Sws5qXoFjEDrhVDy3Cr0wGTIQQM92fHIGTbHGgJbk+ORMm0QQkk58cjbYIo7yrZPqGu2 0Q+xGwlc9gFO1f8AZUrmVosfHkHlu6/tbP4Wnkesth8f2PWWIrtsvRR4AdM6R4FrFXYq7FWA/mxe +npkduD8UsiinioqzfiEzXdpTrGB3l6D2cxcWcy/mx+/8F5OzHNI9qpsThVTY4qq6befUtTtLz/l nmjl/wCAYN/DLMcuGQPc06jH4mOUf5wIfSts4e2iYGoKgVHcr8JP3jOnfMCFTFXYq7FWO/mDojaz 5SvbWNeVwi+tbjvzQ1AH+sQBlOox8cCHO7N1Pg54yPLkfcXzQTmhfRVMnChYWwqsLYULS+SRTXqY UUvWX/R5P9df1Nk482Eg+/rD/eG2/wCMSf8AERm6D5tk+o+9XwsHYq8+/M//AI6uh/8AGK8/4nbZ ru0OQ97vuxOU/h+lhEkiqPfNQS9CBaBnueu+RMm6MEBNcHffKzJujBBSze+RJbBFCyS4LZiKGeTG 2VPTPIGhtY6a19OtLi7+yD1VB0/X/nTOh7P0/BCzzk8N25rfFy8Efph9/X9TKKZsHSOpirqYq6mK vG/zP1MXWuJbK1UtlJP+tJQ/8QVDmj7SyXPh7ntvZ3T8OEzP8Z+wftthbHNc9ApMcKqbHCqxsKH0 D+XmqDUvKdnITWWFRFJ41T4N/nw5fTnRaWfFjBfOu1cHhaiQ6E3892R0zIde6mKupirqAggiqkEM PEHYjFXzr+aflN9B8wySxL/oN8WlgYDYMTV126daj7u2aXV4eCVjkXu+xdb42LhP1w2P6CwljmM7 hY2FVNsKFNjhVYThQvVv3D/66fqbJx5sJP0FsP8AeG2/4xJ/xEZuw+aZPqPvV8LB2KvO/wA1H4an oZ8Yrz/idtmt7RPpHveg7CF8fw/S87nnO++aQyeojBATS5AltEUHLJkbbQEK74LZAKDtiypknkry q+qXS3l0tNPhNd/92MOw8R/n45s9Bo+M8UvpH2ug7a7UGGPhwP7w/wCxH6/7e56jQUAAooFFA7AZ 0DxDqYq6mKupiqE1W8istOnuZW4JGpJbw2JJ+hQTkZSEQSejPFjM5CI5k0+e9SvZL6+nu5NnncuR 2AJ2UewG2ctkmZSMj1fTsGEYoCA5RFINsi2qbYVU2wqpthQ9I/JfXlg1G40eZ6R3Q9SCp25gAOB7 7K3yU5s+zstExeY9o9LcY5R02Pu6fjzevlSCQdiOubd5F1MVdTFXUxVJ/Nfley8y6NLptyKOfit5 aCqSD7JFf8+3QnK8uITjRcrR6uWDIJx/tHc+ZvMGg6loWpy6dqERjmjPwn9l1rQOp8D/AGHfNHkx mBovoOm1MM0BOB2Spsi5Cm2FVNsKFjHCrY/uH/10/U2TjzYSfoRYf7w23/GJP+IjN2HzPJ9R96vh YOxV5r+bzcdR0I/5F5/xO2zV9qfTH3vR+z4+v4fpeaTSZoiXrAEHI++RtsAQ0jYGQCgxJNBuTill XlnyFc3zLdakDBZ1qIjs7/0GbXSdmmXqnsO55ztLt6MLhh3l39B+v7no8MEMEKQQII4YxREXYADN 8AAKDx0pGRs7kr6YWLqYq6mKupirzf8ANfzCqxpo8D/E3xXFP5Qen0sKf7H3zV9pZ6HAOvN6b2d0 XFI5jyjsPf8AseXNmlexU2woU2wqpthVTbChW03UbjTdRt763NJrdw6jsadVPsw2OWY5mJBHRqz4 Y5YGEuUg+mNG1S21jSLbU7Zucc6Dl4g+/vtv71zo8cxKII6vmufDLFMwlzCLpk2l1MVdTFXUxVIf OXknSfNmnfVrweldxgm1vB9pGIpv7eI7/cRVmwjIKLm6HXT08+KPLqO986ebvJGveWLxoNQgPoVp FdoCY3r037HbofoqN80+XBKB3e40XaGLUC4nfu6scbK3OU2woU2wq2P7h/8AXT9TZKPNhJ+hNh/v Dbf8Yk/4iM3gfM8n1H3q+Fgoy3lnC/CWeON+vF3VTT5E4q84/Nc/XL7RGs/9JEa3QkMXxheTW/Hk VrSvE9c1vaUJSjGhe70PYOWEOPiIGw5n3vN5bDUK0+rS/wDAN/TNH+XyfzZfIvUDWYP58P8ATBZH oes3BpFZysT0qpH66ZOOizS5RP3Nc+1dNDnMfDf7k0svy91m4YG5KW0fepq33ZmY+yZn6iA63P7S Yo/3cTI+ewZZo3k3R9MKycPrFwP92yb0+QzaYNFjx7gb95ee1naufPtI1HuHL9vxT075lutdTFXU xV1MVdTFUt8xa3baJpUt7M1HoRCv7RbpUe/h7+wOVZsoxxMi5Ok0ss+QQj1+zzeBajfT395Ldzms srVPgB0CivYDYZzGTIZyMjzL6Rp8EcUBCPIINsi3KbYUKbYVU2wqpthQpthV6L+UHnRdM1A6Lesf qV637gn9mU/s/wCy7e/+tmx0GfhPCeRec7f7P44+LH6o8/d+z7vc9sdOJ61B3Vh0IPQjNw8atpir qYq6mKupiqy6tbO9tmtb6BLq2ccWjkAYUPbfAQDzZRmYmwaLzTzL+QOg6g7T6Hdtp0rb/V5Bzir7 AkUr7NT2zDyaKJ5bO90vtBlhtMcY+Recax+SP5gaex4WSXse59S3kFKfKT0z92YstJMebu8Xbumn zJj7x+q2L3Hk3zbDIUfRr3kNjxt5GH0MqkZX4Mx0Lmx1+A8px+YWDyp5p9Fx+hr6vNf+PabsG/yc lHHK+RWWsw/z4/6YPuyx1HT1srdWuYgwjQEF1BBCj3zcB87yfUfejY5I5EDxsHRujKQQfpGFgxXW wv6YuDxBJWPcgHoD44qgwQOir/wK/wBMVbLk+H0AD+GKrSSepOKupirqYq6mKupirqYq6mKqdzcW 1pbSXVy/CCIEsSQK0FaCuAkAWWUIGRAAsl4f50813Gv6izA8bOI0gjFQDTblQ/h/UnOc1mqOWW30 h7/sns0aaG/95Ln+pjTZiO2U2wqpthQpthVTbCqm2FCm2FVhJBBBoRuCMKvdvys/MGLWrNdG1OQJ qcA/cysf7xfH/mr7++270mp4xR+oPDdsdlnBLjgP3Z+zy93cz9kKsVYUI6jM10bVMVdTFXUxV1MV dTFW1d1+yxX5GmKrjK5+0Q3zAP6xiq2o/lT/AIBf6Yq6o/lT/gF/pirJvLgpo8I7cpaf8jWxVJdb /wCOxP8A6sf/ABHFUHTFXUxV1MVdTFXUxV1MVdTFXUxVSu7m1srV7q8kEUCCpZiBWnhXIykIizyZ 48cpyEYiyXjvnfzxca7P9Xt6xabHsidOdD1Pt/tnsBoNZrTkPDH6fve57J7IGnHHPfJ9347/AMGI NmA7tTbCqm2FVNsKFNsKqbYVU2woU2wqpthVdbXVxaXMdzbSGKeFg8ci9Qw6ZKMiDYYZMcZxMZCw Xvn5c/mbZeY4E03U2W31eNaIa/DIAOq1/V1Hyzd6bVDJsfqeF7U7JlpzxR3x/d7/ANbOXjZG4tsc y3TtUxV1MVdTFXUxV1MVdTFXUxV1MVZP5e/45EP+tJ/ycbFUl1of7mJ/9WP/AIjiqDpirqYq6mKu pirqYq6mKthSTQCp8BiqUa/5p0fQoS1zIJLgj93boakn6P8Aa98x8+phiHqPwc3Rdn5dRKoDbv6B 5D5n826pr0/K4b07ZT+7t1Pwjwr4nNBqdXLKd9h3Pc9n9l49MNt59T+ruSBsxXZKbYUKbYVU2wqp thQpthVTbCqm2FCm2FVNsKrGwoWxyywypLE5jljIZHUkMrDcEEdCMINIlEEUeT1/yF+diqkemeZ/ iQfDHfjan+uB0+fTxp1zaafW9J/N5TtHsEi54f8AS/q/U9dge3uoFubOVbi3cBldDXY7jpmxBt5i USDR5uphQ6mKupirqYq6mKupirqYqyby9/xyYf8AWk/5ONiqTax/x17j/Vj/AOI4qhaYq6mKupir gpOw3xVtk4CshEYPQuQv68VSrVfNGg6Wp+tXIMg/3UtQ33UL/wDC098oy6nHj+ouZptBmz/REkd/ T5sC1/8ANG/uVaDS4/q0J2MjAcz/ALGrD7yfozU5+1SdoCvN6bR+zkI75TxHuHL9f3MFuJ5p5Wlm dpJXNWdyWYn3JzVmRJs83pIQjAVEUAoNgZKbYVU2woU2wqpthVTbChTbCqm2FVNsKFNsKqbYVWNh QpNhVY2FU88seevMnlqYPpt0RCDVrWSrRHx2qCv+xIy/FnlDk4Gs7Ow6j6h6u8c3sXln89vLWpBI dbjOnXR2MvWMn/XAp/wQX55ssetjLns8vquwc2PeHrj9vy/U9CtLzTr6JZrG7iuIpPsMrD4vka0P 0HMsEHk6ScDE0RRV2idPtKR8xhYraYq6mKupirqYqyPy/wD8cmH/AFpP+TjYqhtQ0a8nvpLiIwlJ FUUk5ggqKfs4qxvzdqE3li0tbu8hilhurgWq+lzJV2jeRS3Jl2PpkfOmVZ8oxxMiLpy9HpDnnwAg HzY/P+YttA4U2lahWBCmhVhUdZPfMCXasB0LtYezuWQ+qP2/qQU35oUH7uz3/wBgv6xJlR7Yj0i5 EfZmfWY+SV3n5n604IgjWIH+Zmb8E9MfhlM+15nkAHLxezOIfVKR92362PX3mnXruoku3RT1SKkY +nhQn6cw8mtyz5y/Q7TB2TpsXKAvz3+9JWJNSdyeuYzsVNsVUmwqsbCqm2FVNsKFNsKqbYVU2woU 2wqpthVTbChTbCqm2FVjYUKTYVWNhVTbCqm2FCvp+r6rpkpl0+7mtJD9owuyVHg1DuPnk4zMeRas uCGQVMCXvZfpX53efNOCq1xHdoNuMqFdv+eRjqfc1zJjrJjzdVl7B08uQMfcf12yW1/5yRv1UC80 hZW7ukqgf8D6Vf8AhsvGu7w4E/Zofwz+z9qZx/8AOSWimvraRKp7cKH76yrkxro9zjn2cy9JR+1M NN/P7RtQvtPsLbR7h7vUrhLW2jPEVeR1jUn970LN+By3HqRM0A4+fsTJiiZGUaHv/U9i/QepEfZt h785T+FMyHSptpNnLZ6fFbysHlTkXZdgSzFtq/PFUXiqS+cvLieY/LN9pBf0pbhA1tP/AL7niYSQ v8lkVSfEZGURIUeTdp8xxzEh0fP9o81/aTWs8Rt9Z0p3hvbJvtoUJ5r78WqQe6n2zmdTppYzwnpy 8w99ptXGYEx9MvsP7UFIMwnZAodxgZKLDCqk2FVNsVU2wqpthVTbCqm2FCm2FVNsKqbYUKbYVU2w qpthQpthVTbCqxsKFJsKrGwqpthVTbChTbCqm2FVNsKF1tazXUwiiG9CWY7KqjdmY9lA3OEC2MpA Cy9g/wCcbvI7a75ybzRLGTonl+sdizjaW7YEKQCP2Axc06MVzb6bDwRs8z9zyfbWu4h4cfj+PsfV eZDzbsVdirsVeZfml+Vl3rN0vmfyvKLPzRbqFkWvGO7jT7KSeDjoreGx7UhkxRyCpOdo9bLCf6Ly CTzLpxu3sPMlrL5e1uM8ZhJGxgZh34j4lr7VGafUdlyG4ep0vagI7x+Pxuik0/61vY3Vreqehgnj Y/8AAkhvwzWy0s49HaQ12Muby9q/++P+HT/mrIeDLubPzePv+9Rby7rH/LP/AMOn/NWHwZdyfzeP v+9TPl3WP+Wf/h0/5qx8GXcv5rH3/ept5d1j/ln/AOHT/mrD4Mu5fzWPv+9Tby5rP/LP/wAOn/NW HwZdy/msff8Aepny3rX/ACz/APDx/wDNWHwZdyPzWPv+9YfLetf8s3/Dx/8ANWPgy7l/NY+/71M+ Wtb/AOWb/h4/+asPhS7l/NY+/wC9YfLOt/8ALN/w8f8AzVh8KXcv5rH3/ept5Y1z/lm/4eP/AJqw +FLuR+ax9/3qZ8sa5/yzf8PH/wA1YfCl3L+ax9/3rG8r67/yzf8ADx/81YfCl3L+ax9/3qbeVtd/ 5Zf+Hj/5qw+FLuX81j7/AL1jeVte/wCWX/kpH/zVh8KSPzWPv+9Tbyrr3/LL/wAlI/8AmrD4Ul/N Y+/71h8qa/8A8sv/ACUj/wCasPhSX81j7/vUz5T1/wD5Zf8AkpH/AM1Y+FJH5rH3/esbyn5g/wCW X/kpH/zVh8OS/msff96mfKXmD/lk/wCSkf8AzVh8OS/msff96m3lHzD/AMsn/JSL/mrD4ckfmsfe sbyj5h/5ZP8AkpF/zVh8OS/msfesbyjryrzlhjhTu8s8CAfe+SGKR6MTrMY6/ehZ9O0ez31DV7eo /wB0WVbqU+1VpGPpfMiGimfJxsnacB9ItnnkH8n/ADP549MRWcvl7yc5Vrm+uP8Aeu8QUICVAqp7 UHAf5RGbDFpo4/Muh1vapO17vqzy55d0jy5otro2kQC3sLROEUY6nxZj3ZjuTlxNvPykZGymWBi7 FXYq7FXYqlHmHyj5a8x2/oa1p0N6g2VpF+Nf9VxRh9+ESITGRG4ec6j/AM4y+Qbhy9pLd2lTXh6n qKPYA0/XkuIdQ5A1mQdUvH/OLugAUGsXAA7cD/1Uwej+az/P5e93/Qrmgf8AV4uP+AP/AFUxqH81 fz+XvXJ/zi55bDfvNWuWXwVSp+8u2NQ/mr+fy96//oV3yl/1c7z7/wC3BUP5oX8/l73f9CueUv8A q5Xn3/241D+aF/P5e9r/AKFb8o/9XK8+/wDtxqH80L+fy97v+hWvKH/VyvPv/tx9P80L+fy97X/Q rPk//q5Xf3/24fT/ADQv5/L3u/6FY8n/APVxu/v/ALcfT/NC/n8ve1/0Kv5O/wCrjd/f/bj6f5oX 8/l73f8AQq/k7/q43f3/ANuPp/mhfz+Xvd/0Kt5N/wCrhd/f/bj6f5oX8/l72v8AoVXyZ/1cLv7/ AO3H0/zQv5/L3u/6FU8l/wDVwu/v/txuPcF/P5e9r/oVPyX/ANXC7+/+3G49y/n8ve7/AKFS8lf8 t939/wDzdjce5fz+XvWSf84oeTyB6eo3KnvyBb9TrhuP81fz+XvUJP8AnE3y0QPT1aVT35RM36pl xuP81fz+XvUJP+cTdH5fBqvJfFo5FP3CY4eKH81fz+XvWf8AQpmlf9XMf8BL/wBVcPFDuX8/l718 f/OJeiE/vdV4jtxjkb9cy4OKH81fz+XvTKz/AOcT/wAvUcNeXF3cU3Ko/pA/OvqH8ceMdAg63J3s 38tfkz+WflyRZtN0G3NypDLc3INzIGHQqZi/A/6tMiZFqnqJy5lmuRaXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq//9k= xmp.did:1909C3C878D8DE11BA3FC4734EDA5420 uuid:79f4e077-af0a-49b0-8661-3c88af079b47 uuid:4BC73B30D582DE118E9E833D7C53E1E9 proof:pdf xmp.iid:1809C3C878D8DE11BA3FC4734EDA5420 xmp.did:1809C3C878D8DE11BA3FC4734EDA5420 uuid:4BC73B30D582DE118E9E833D7C53E1E9 proof:pdf saved xmp.iid:1709C3C878D8DE11BA3FC4734EDA5420 2009-11-23T23:40:14+02:00 Adobe Illustrator CS4 / saved xmp.iid:1809C3C878D8DE11BA3FC4734EDA5420 2009-11-23T23:44:22+02:00 Adobe Illustrator CS4 / saved xmp.iid:1909C3C878D8DE11BA3FC4734EDA5420 2009-11-23T23:45:49+02:00 Adobe Illustrator CS4 / Adobe PDF library 9.00 1 True False 100.000000 100.000000 Pixels Cyan Magenta Yellow Black Default Swatch Group 0 White RGB PROCESS 255 255 255 Black RGB PROCESS 0 0 0 Charcoal RGB PROCESS 63 63 63 Graphite RGB PROCESS 102 102 102 Ash RGB PROCESS 140 140 140 Smoke RGB PROCESS 178 178 178 Latte RGB PROCESS 228 188 150 Capuccino RGB PROCESS 213 151 88 Mochaccino RGB PROCESS 139 92 41 Chocolate RGB PROCESS 90 61 28 Mars Red RGB PROCESS 143 0 0 Ruby RGB PROCESS 191 0 0 Pure Red RGB PROCESS 255 0 0 Pumpkin RGB PROCESS 255 64 0 Squash RGB PROCESS 255 127 0 Sunshine RGB PROCESS 255 191 0 Yellow RGB PROCESS 255 255 0 Chartreuse Green RGB PROCESS 204 255 0 Fresh Grass Green RGB PROCESS 125 255 0 Pure Green RGB PROCESS 0 255 0 Spearmint RGB PROCESS 0 163 61 Holly Green RGB PROCESS 0 107 51 Sea Green RGB PROCESS 1 83 83 Caribbean Blue RGB PROCESS 4 115 145 Mediterranean Blue RGB PROCESS 0 160 198 Aloha Blue RGB PROCESS 0 96 182 Black Light Blue RGB PROCESS 0 60 255 Pure Blue RGB PROCESS 0 0 255 Sapphire Blue RGB PROCESS 34 16 210 Tanzanite RGB PROCESS 66 16 210 Brilliant Purple RGB PROCESS 93 16 210 Violet RGB PROCESS 130 16 210 Purple Orchid RGB PROCESS 171 16 210 Fuschia RGB PROCESS 208 16 177 Global Pure Red PROCESS 100.000000 RGB 255 0 0 Global Squash PROCESS 100.000000 RGB 255 126 0 Global Yellow PROCESS 100.000000 RGB 255 255 0 Global Pure Green PROCESS 100.000000 RGB 0 255 0 Global Mediterranean Blue PROCESS 100.000000 RGB 0 160 198 Global Pure Blue PROCESS 100.000000 RGB 0 0 255 Document endstream endobj 3 0 obj <> endobj 122 0 obj <>/Resources<>/ExtGState<>/Properties<>/Shading<>/XObject<>>>/Thumb 148 0 R/TrimBox[0.0 0.0 100.0 100.0]/Type/Page>> endobj 123 0 obj <>stream HVMo1 W7wN=}a *$NfUZ3dz>ݟ=kfӿK}>П_K=}C}I.QeJt.L>.@kuāLe*uDS:MW7;Ʋ۪xx&XN!v|TЪxS{긦X { CC\lNz}T7_`}EtR+^s]w:#EJ>ɜ3E/ʐ f}gO*3-.mҋG "c2%%3f&/aNM,rBޡ ܊ė@`3amUH״xɩI`tFKjHL6RTD\ȅmL1|!#vƒ!`wUC.\ĴX4w϶ i xvo#?Ē} 5f("fJlH&< ֣}sTEH!3_s{mJ٭d@=U`BF'vHhn "G k %|AM$N`c8B hB#F"bHLiUs-ő̆eg00;P֡eG v'Ly]h1`A򤌉UlgCc}K/ ?Y9^;)5SKFLҸ;F4$4:ۨiiI6jjч\9L&8v qwPkFfj^&7濻Oku endstream endobj 124 0 obj <> endobj 148 0 obj <>stream 8;TH&Yml4;%(iAMQZNRi0YmpAU7%IPRh*W\fQTk76<7pUNf5GP5e+@-2h3.j-C=c[ X>?7'ff1<=MJ!eeY$4!s/8sW4K8q\C--cHIW\"sBhR',F>s<)t)$&!h:Po~> endstream endobj 150 0 obj [/Indexed/DeviceRGB 255 151 0 R] endobj 151 0 obj <>stream 8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn 6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 136 0 obj <>/ExtGState<>/ProcSet[/PDF/ImageC/ImageI]/XObject<>>>/Subtype/Form>>stream q /GS0 gs 103 0 0 104 -1.2519531 -1.7480469 cm /Im0 Do Q endstream endobj 137 0 obj <>/ExtGState<>/Shading<>>>/Subtype/Form>>stream q 96.212 15.058 m 96.212 8.931 91.243 3.962 85.116 3.962 c 14.845 3.962 l 8.717 3.962 3.75 8.931 3.75 15.058 c 3.75 85.329 l 3.75 91.457 8.717 96.424 14.845 96.424 c 85.116 96.424 l 91.243 96.424 96.212 91.457 96.212 85.329 c h W n q 0 g /GS0 gs 69.5471954 0 0 -33.9607239 63.3984375 19.1269531 cm BX /Sh0 sh EX Q Q endstream endobj 138 0 obj <>/ExtGState<>>>/Subtype/Form>>stream /CS0 cs 1 1 1 scn /GS0 gs q 1 0 0 1 93 13.6084 cm 0 0 m -25.587 0.464 -43.041 26.396 -33.12 50.419 c -28.93 60.568 -19.768 67.936 -9.37 70.94 c -5.22 72.14 -0.952 72.174 3.324 72.174 c 4.029 72.174 6.644 72.262 6.644 72.182 c 6.644 67.061 l 6.644 65.776 6.838 58.987 6.461 58.987 c 2.456 58.987 -1.518 59.179 -5.454 58.312 c -15.31 56.142 -22.082 46.627 -22.181 36.807 c -22.256 29.279 -19.142 22.479 -13.3 17.724 c -9.507 14.636 -4.445 13.187 0.386 13.187 c 5.256 13.187 l 7.01 13.187 6.644 13.519 6.644 11.56 c 6.644 0.959 l 6.644 -0.574 6.697 0 5.212 0 c 0 0 l -0.006 0 -0.006 -0.727 0 -0.727 c 6.647 -0.727 l 6.651 -0.727 6.651 -0.382 6.651 -0.363 c 6.651 13.55 l 6.651 13.568 6.651 13.913 6.647 13.913 c 1.272 13.913 -3.796 13.736 -8.885 15.822 c -16.377 18.895 -20.912 26.35 -22.019 34.097 c -23.294 43.028 -17.92 51.391 -10.417 55.671 c -5.163 58.669 0.841 58.262 6.647 58.262 c 6.651 58.262 6.651 58.605 6.651 58.625 c 6.651 72.537 l 6.651 72.556 6.651 72.899 6.647 72.899 c -3.479 72.899 -12.49 72.064 -21.092 66.079 c -29.982 59.893 -35.861 48.978 -36.065 38.143 c -36.462 17.169 -21.49 -0.336 0 -0.727 c 0.001 -0.727 0.01 -0.001 0 0 c f Q endstream endobj 139 0 obj <>/ExtGState<>>>/Subtype/Form>>stream /CS0 cs 0.584 0.584 0.584 scn /GS0 gs q 1 0 0 1 99.999 86.4976 cm 0 0 m 0 -8.302 l 0 -13.343 l 0 -14.996 -0.466 -14.557 -2.103 -14.557 c -12.256 -14.557 -21.036 -16.68 -26.366 -26.228 c -29.246 -31.387 -29.334 -37.473 -27.891 -43.036 c -25.236 -53.265 -15.646 -59.047 -5.554 -59.047 c -0.591 -59.047 l 0.405 -59.047 0 -60.057 0 -60.909 c 0 -72.331 l 0 -74.685 -4.432 -73.544 -6.389 -73.544 c -11.539 -73.544 -16.433 -72.595 -21.206 -70.663 c -45.354 -60.88 -50.09 -28.242 -32.323 -10.372 c -23.38 -1.377 -11.978 -0.061 0.001 -0.061 c 0.002 -0.061 0.002 0.061 0.001 0.061 c -11.299 0.061 -21.256 -1.08 -30.389 -8.501 c -38.647 -15.212 -43.442 -25.866 -43.442 -36.442 c -43.442 -47.266 -38.896 -57.359 -30.929 -64.642 c -22.124 -72.689 -11.302 -73.666 0.001 -73.666 c 0.002 -73.666 0.002 -73.608 0.002 -73.605 c 0.002 -58.987 l 0.002 -58.984 0.002 -58.926 0.001 -58.926 c -5.466 -58.926 -10.659 -59.158 -15.828 -57.009 c -23.162 -53.962 -27.593 -46.601 -28.671 -39.005 c -30.005 -29.606 -24.512 -20.828 -16.31 -16.705 c -11.27 -14.171 -5.458 -14.678 0.001 -14.678 c 0.002 -14.678 0.002 -14.62 0.002 -14.617 c 0.002 0 l 0.002 0.068 0 0.068 0 0 c f Q endstream endobj 140 0 obj <>/ExtGState<>>>/Subtype/Form>>stream /CS0 cs 1 1 1 scn /GS0 gs q 1 0 0 1 14.8452 5.4121 cm 0 0 m -7.936 0.536 -9.893 6.795 -9.893 13.469 c -9.893 32.113 l -9.893 75.597 l -9.893 81.944 -8.775 87.948 -1.341 89.471 c 1.944 90.144 5.865 89.562 9.176 89.562 c 54.925 89.562 l 64.029 89.562 80.164 92.408 80.164 78.776 c 80.164 39.824 l 80.164 18.135 l 80.164 13.798 80.814 8.887 78.813 4.905 c 76.173 -0.348 70.332 0 65.428 0 c 45.917 0 l 0 0 l -0.004 0 -0.004 -0.5 0 -0.5 c 69.621 -0.5 l 81.847 -0.5 80.169 11.979 80.169 20.255 c 80.169 66.216 l 80.169 74.311 82.756 90.062 70.197 90.062 c 36.13 90.062 l 0.292 90.062 l -12.077 90.062 -9.897 75.947 -9.897 67.797 c -9.897 23.346 l -9.897 14.734 -12.484 0.343 0 -0.5 c -0.007 -0.499 0.015 -0.001 0 0 c f Q endstream endobj 141 0 obj <>/ExtGState<>>>/Subtype/Form>>stream /CS0 cs 0.051 0 0.231 scn /GS0 gs q 1 0 0 1 96.21 15.6602 cm 0 0 m -0.51 -8.207 -6.845 -11.073 -14.005 -11.073 c -31.712 -11.073 l -75.974 -11.073 l -81.106 -11.073 -85.64 -11.367 -89.66 -7.347 c -93.249 -3.757 -92.454 1.974 -92.454 6.579 c -92.454 51.744 l -92.454 61.266 -95.718 80.139 -81.072 80.139 c -45.235 80.139 l -11.168 80.139 l 3.628 80.139 -0.004 59.402 -0.004 49.96 c -0.004 -0.603 l -0.004 -1.31 0.008 -1.31 0.008 -0.603 c 0.008 69.019 l 0.008 75.759 -4.091 80.954 -11.094 81.389 c -14.36 81.592 -17.705 81.389 -20.977 81.389 c -66.85 81.389 l -76.392 81.389 -92.466 83.879 -92.466 69.668 c -92.466 37.513 l -92.466 0.048 l -92.466 -6.693 -88.367 -11.889 -81.365 -12.323 c -78.098 -12.526 -74.753 -12.323 -71.482 -12.323 c -28.145 -12.323 l -18.302 -12.323 -0.883 -15.476 0.004 -1.205 c 0.027 -0.829 -0.018 -0.293 0 0 c f Q endstream endobj 142 0 obj <>/ExtGState<>/Shading<>>>/Subtype/Form>>stream q 0 12.893 m 0 27.511 l 7 27.511 l 19.56 27.511 28.824 37.6 28.824 49.23 c 28.824 61.688 19.354 71.88 6.794 71.88 c 0 71.88 l 0 86.498 l 7 86.498 l 27.178 86.498 43.443 70.131 43.443 49.334 c 43.443 29.467 27.178 12.893 7 12.893 c h W n q 0 g /GS0 gs 0 73.6044922 73.6044922 0 21.7211914 12.8925781 cm BX /Sh0 sh EX Q Q endstream endobj 143 0 obj <>/ExtGState<>/Shading<>>>/Subtype/Form>>stream q 0 12.893 m 0 27.511 l 7 27.511 l 19.56 27.511 28.824 37.6 28.824 49.23 c 28.824 61.688 19.354 71.88 6.794 71.88 c 0 71.88 l 0 86.498 l 7 86.498 l 27.178 86.498 43.443 70.131 43.443 49.334 c 43.443 29.467 27.178 12.893 7 12.893 c h W n q 0 g /GS0 gs 0 -73.6054687 -73.6054687 0 21.7211914 86.4975586 cm BX /Sh0 sh EX Q Q endstream endobj 144 0 obj <>/ExtGState<>>>/Subtype/Form>>stream /CS0 cs 1 1 1 scn /GS0 gs q 1 0 0 1 0.356 13.2451 cm 0 0 m 0 8.438 l 0 13.143 l 0 14.115 2.06 13.55 3.32 13.55 c 13.909 13.55 22.95 17.372 27.326 27.653 c 29.708 33.251 29.104 40.175 26.962 45.689 c 23.033 55.81 13.212 59.351 3.217 59.351 c 2.514 59.351 0 59.261 0 59.342 c 0 63.506 l 0 69.293 l 0 70.263 -0.188 72.537 0.183 72.537 c 9.645 72.537 18.18 71.9 26.43 66.685 c 35.703 60.824 41.198 50.575 42.517 39.882 c 44.149 26.65 37.354 13.875 26.674 6.444 c 18.582 0.813 9.46 0.363 -0.003 0.363 c -0.009 0.363 -0.009 -0.363 -0.003 -0.363 c 11.069 -0.363 20.82 0.816 29.774 8.043 c 38.14 14.795 42.738 25.448 42.738 36.089 c 42.738 46.924 38.443 57.006 30.446 64.339 c 21.808 72.259 11.113 73.263 -0.003 73.263 c -0.008 73.263 -0.007 72.919 -0.007 72.9 c -0.007 58.988 l -0.007 58.969 -0.008 58.625 -0.003 58.625 c 5.372 58.625 10.439 58.802 15.528 56.715 c 23.021 53.643 27.556 46.187 28.662 38.44 c 29.937 29.509 24.564 21.146 17.061 16.866 c 11.807 13.869 5.803 14.276 -0.003 14.276 c -0.008 14.276 -0.007 13.932 -0.007 13.913 c -0.007 0 l -0.007 -0.41 0 -0.41 0 0 c f Q endstream endobj 145 0 obj <>/ExtGState<>>>/Subtype/Form>>stream /CS0 cs 0.584 0.584 0.584 scn /GS0 gs q 1 0 0 1 0.0005 12.8926 cm 0 0 m 0 8.303 l 0 13.344 l 0 14.997 0.466 14.558 2.103 14.558 c 12.256 14.558 21.037 16.681 26.366 26.229 c 29.246 31.387 29.333 37.473 27.89 43.036 c 25.236 53.265 15.647 59.048 5.554 59.048 c 0.592 59.048 l -0.405 59.048 0 60.058 0 60.91 c 0 72.331 l 0 74.685 4.433 73.544 6.39 73.544 c 11.54 73.544 16.434 72.595 21.206 70.662 c 45.356 60.881 50.09 28.243 32.324 10.373 c 23.381 1.378 11.979 0.061 0 0.061 c -0.001 0.061 -0.001 -0.061 0 -0.061 c 11.3 -0.061 21.257 1.08 30.389 8.502 c 38.648 15.213 43.443 25.865 43.443 36.441 c 43.443 47.266 38.897 57.359 30.929 64.642 c 22.125 72.689 11.303 73.666 0 73.666 c -0.001 73.666 -0.001 73.608 -0.001 73.605 c -0.001 58.988 l -0.001 58.985 -0.001 58.927 0 58.927 c 5.466 58.927 10.659 59.158 15.828 57.01 c 23.163 53.963 27.593 46.601 28.67 39.005 c 30.004 29.606 24.512 20.829 16.311 16.706 c 11.27 14.172 5.458 14.679 0 14.679 c -0.001 14.679 -0.001 14.621 -0.001 14.618 c -0.001 0 l -0.001 -0.068 0 -0.068 0 0 c f Q endstream endobj 146 0 obj <>/ExtGState<>/Shading<>>>/Subtype/Form>>stream q 100 86.498 m 100 71.88 l 93 71.88 l 80.441 71.88 71.175 61.791 71.175 50.159 c 71.175 37.702 80.646 27.511 93.205 27.511 c 100 27.511 l 100 12.893 l 93 12.893 l 72.822 12.893 56.558 29.26 56.558 50.056 c 56.558 69.925 72.822 86.498 93 86.498 c h W n q 0 g /GS0 gs 0 73.6044922 73.6044922 0 78.2792969 12.8925781 cm BX /Sh0 sh EX Q Q endstream endobj 147 0 obj <>/ExtGState<>/Shading<>>>/Subtype/Form>>stream q 100 86.498 m 100 71.88 l 93 71.88 l 80.441 71.88 71.175 61.791 71.175 50.159 c 71.175 37.702 80.646 27.511 93.205 27.511 c 100 27.511 l 100 12.893 l 93 12.893 l 72.822 12.893 56.558 29.26 56.558 50.056 c 56.558 69.925 72.822 86.498 93 86.498 c h W n q 0 g /GS0 gs 0 -73.6054687 -73.6054687 0 78.2792969 86.4975586 cm BX /Sh0 sh EX Q Q endstream endobj 171 0 obj <> endobj 167 0 obj <> endobj 126 0 obj [/ICCBased 174 0 R] endobj 173 0 obj <> endobj 175 0 obj <> endobj 176 0 obj <> endobj 177 0 obj <> endobj 178 0 obj <> endobj 174 0 obj <>stream HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 N')].uJr  wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 172 0 obj <> endobj 179 0 obj <> endobj 180 0 obj <>/Shading<>>>/Subtype/Form>>stream q 0 g /GS0 gs 0 -73.6054687 -73.6054687 0 78.2792969 86.4975586 cm BX /Sh0 sh EX Q endstream endobj 181 0 obj <> endobj 182 0 obj <> endobj 184 0 obj /DeviceGray endobj 185 0 obj <> endobj 186 0 obj <> endobj 187 0 obj <> endobj 188 0 obj <> endobj 189 0 obj <> endobj 128 0 obj <> endobj 183 0 obj /DeviceGray endobj 170 0 obj <> endobj 164 0 obj <> endobj 190 0 obj <> endobj 191 0 obj <> endobj 192 0 obj <> endobj 169 0 obj <> endobj 168 0 obj <> endobj 165 0 obj <> endobj 166 0 obj <> endobj 193 0 obj <> endobj 194 0 obj <>/Shading<>>>/Subtype/Form>>stream q 0 g /GS0 gs 0 -73.6054687 -73.6054687 0 21.7211914 86.4975586 cm BX /Sh0 sh EX Q endstream endobj 195 0 obj <> endobj 163 0 obj <> endobj 162 0 obj <> endobj 161 0 obj <> endobj 160 0 obj <> endobj 159 0 obj <> endobj 156 0 obj <> endobj 158 0 obj <> endobj 196 0 obj <> endobj 197 0 obj <> endobj 157 0 obj <> endobj 198 0 obj <> endobj 199 0 obj <>/Shading<>>>/Subtype/Form>>stream q 0 g /GS0 gs 69.5471954 0 0 -33.9607239 63.3984375 19.1269531 cm BX /Sh0 sh EX Q endstream endobj 200 0 obj <> endobj 201 0 obj <> endobj 202 0 obj <> endobj 203 0 obj <> endobj 204 0 obj <> endobj 152 0 obj <> endobj 155 0 obj <>stream H1 Om x0) endstream endobj 153 0 obj [/Indexed 206 0 R 0 207 0 R] endobj 205 0 obj <>/Filter/FlateDecode/Height 104/Intent/RelativeColorimetric/Length 973/Name/X/Subtype/Image/Type/XObject/Width 103>>stream HOhfpK#L3]a9a RH ;١)%<ׇQF; g%i^V^}IlFؑ%e R{zby @ЉAC A>ae4eX)Th&lHfBS^; AN3gɴAI&&FdL! ongs\pۙ+s~';ޚl{E8߻~v+=:ޟ$f/fύVoHrl`+(D/ޅ8^4h9|~^\Xfa:z4^9>^U 7kU6Q3q'wJuLM`;dX_M<[1fIL0%ScZHCIN0e5:n3p`I0 `0 `0 `Ť^N'9t`/@+VDd]/McR:cAlݚ9ˑ.9j L&݀Af(X. 7eX|XagG5vNZ߿9ۇX խQBq k d=廴QC6YfEF7 M|zDIeEm_%q1whu^zIZGZ/"7]xE"2M㯎[zRriwMԩ /Iv#~bf/[k?nݺ﹩Nm帶WȘA>ST9Gޛ K/ED/'hr97qCѠu}`9&T`*43sqp~^ IR6FDr1ldUFA^W (F>stream endstream endobj 154 0 obj <> endobj 208 0 obj <> endobj 209 0 obj [0.0 0.0 0.0] endobj 210 0 obj <>/ProcSet[/PDF/ImageB]/XObject<>>>/Subtype/Form>>stream q /GS0 gs 103 0 0 104 -1.2519531 -1.7480469 cm /Im0 Do Q endstream endobj 211 0 obj <> endobj 213 0 obj <>/Filter/FlateDecode/Height 104/Intent/RelativeColorimetric/Length 973/Name/X/Subtype/Image/Type/XObject/Width 103>>stream HOhfpK#L3]a9a RH ;١)%<ׇQF; g%i^V^}IlFؑ%e R{zby @ЉAC A>ae4eX)Th&lHfBS^; AN3gɴAI&&FdL! ongs\pۙ+s~';ޚl{E8߻~v+=:ޟ$f/fύVoHrl`+(D/ޅ8^4h9|~^\Xfa:z4^9>^U 7kU6Q3q'wJuLM`;dX_M<[1fIL0%ScZHCIN0e5:n3p`I0 `0 `0 `Ť^N'9t`/@+VDd]/McR:cAlݚ9ˑ.9j L&݀Af(X. 7eX|XagG5vNZ߿9ۇX խQBq k d=廴QC6YfEF7 M|zDIeEm_%q1whu^zIZGZ/"7]xE"2M㯎[zRriwMԩ /Iv#~bf/[k?nݺ﹩Nm帶WȘA>ST9Gޛ K/ED/'hr97qCѠu}`9&T`*43sqp~^ IR6FDr1ldUFA^W (F> endobj 134 0 obj <> endobj 135 0 obj <> endobj 215 0 obj <> endobj 216 0 obj <> endobj 217 0 obj <> endobj 218 0 obj <> endobj 219 0 obj <> endobj 214 0 obj <> endobj 220 0 obj <> endobj 221 0 obj <> endobj 120 0 obj <> endobj 222 0 obj [/View/Design] endobj 223 0 obj <>>> endobj 127 0 obj <> endobj 129 0 obj <> endobj 130 0 obj <> endobj 131 0 obj <> endobj 132 0 obj <> endobj 133 0 obj <> endobj 125 0 obj <> endobj 224 0 obj <> endobj 225 0 obj <>stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 14.0 %%AI8_CreatorVersion: 14.0.0 %%For: (Administrator) () %%Title: (v4_3.ai) %%CreationDate: 11/26/2009 1:52 AM %%Canvassize: 16383 %%BoundingBox: -2 -2 102 103 %%HiResBoundingBox: -1.25195 -1.74805 101.748 102.252 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 10.0 %AI12_BuildNumber: 357 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0.627451 0.776471 (Global Mediterranean Blue) %%+ 0 0 1 (Global Pure Blue) %%+ 0 1 0 (Global Pure Green) %%+ 1 0 0 (Global Pure Red) %%+ 1 0.498039 0 (Global Squash) %%+ 1 1 0 (Global Yellow) %%+ 0 0 0 ([Registration]) %AI3_Cropmarks: 0 0 100 100 %AI3_TemplateBox: 50.5 49.5 50.5 49.5 %AI3_TileBox: -247.6001 -370.8701 347.4199 470.9902 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -110 120 4 1252 620 18 0 0 69 109 0 0 0 1 1 0 1 1 0 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 226 0 obj <>stream %%BoundingBox: -2 -2 102 103 %%HiResBoundingBox: -1.25195 -1.74805 101.748 102.252 %AI7_Thumbnail: 128 128 8 %%BeginData: 27134 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDFCFFFDFCFFFDFCFFFD1EFFCBA2A87D7E7D7D537D537D777D777E %7D7D7DA27D7E7DA27D7E7DA27D7E7DA27D7E7DA27D7E7DA27D7E7DA27D7E %7DA27D7E7DA27D7E7DA27D7E7DA27D7E7DA27D7E7DA27D7E7DA27D7E7DA2 %7D7E7DA27D7E7D7E7D7E7D7E7D7E7DA8A9FD20FFA87D4C4C4B4B214C4B4B %454C4B4B454C4B4B214C454B214B214B214B214B214B214B214B214B214B %214B214B214B214B214B214B214B214B214B214B214B214B214B214B214B %214B214B214B214B214B214B214B214B214B214B214B2145214C4CA2A8FD %1CFF764C6FA1A1C3A1C9C3C3A0C3C3C9A1C9C3C9A1C9A1C9A1C9A1C9A1C9 %A1C9A1C9A1C3A1C9A1C3A1C9A1C3A1C9A1C3A1C9A1C3A1C3A1C3A1C3A1C3 %A1C3A1C3A1C3A1C3A1C3A1C3A1C3A1A1A1C3A1A1A0C3A1A19AA19AA19AA1 %9AA19AFD05A176702152A2FD19FF7D4576A1C9C3C3C2C29AC29AC29AC29A %C29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AA09AC29AA09A %C29A9A9AC29A9A9AA09A9A9AA09A9A9AA0FD0E9A999A9A9A999A999A759A %999A6F9A999A759A9AA1A1C9A1A16F4B52FD16FFA9774BC3C9C9C2C29AC2 %C2C29AC2C2C29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC2 %9AC29AC29AC29AC29AC29A9A9AC29A9A9AA0FD069A999A9A9A999A9A9A99 %9A9A9A999A9A9A999A9A9A999A9A9A999A9A9A759A999A6F9A939A75A1A1 %CA9A4B4CFD14FFAF524BC9C3C299C29AC29AC29AC29AC29AC29AC29AC299 %C29AC299C29AA099C29A9A99C29A9A99A09A9A999A9A9A999A999A999A99 %9A999A999A999A999A999A999A999A999A999A999A759A999A6F9A999A6F %9A759A6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F9A76A19A4B4CFD13FF7D %4BC9C9C2BCC3C2C2BCC3C2C29AC2C2C29AC2C2C29AC29AC29AC29AC29AC2 %9AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AA09AC29AA0 %9AC29A9A9AC29A9A9AA0FD129A999A9A9A999A9A9A759A9A9A759A9A9A6F %C3A14B7DFD11FFA821A0C3C29AC29AC29AC29AC29AC29AC29AC29AC29AC2 %9AC29AC29AC29AC29AC29AA09AC29A9A9AC29A9A99C29A9A99A09A9A999A %9A9A999A9A9A999A9A9A999A999A999A999A999A999A999A999A759A999A %759A999A6F9A759A6F9A759A6F9A6F9A6F9A6F9A6F9A6F9A6FA17645A8FD %10FF5276C3C39AC2C2C29AC2C2C29AC2C2C29AC2BCC29AC29AC29AC29AC2 %9AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AA09AC29A9A9AC2 %9A9A9AC2FD0A9A999A9A9A999A9A9A999A9A9A999A9A9A999A9A9A999A9A %9A759A9A9A6F9A9A9A6F9A759A6FA14B77FD0FFFA84B9AC39AC29AC29AC2 %9AC29AC29AC29AC29AC29AC29AC29AC299C29AC299C29A9A99C29A9A99C2 %9A9A999A9A9A999A9A9A999A999A999A999A999A999A999A999A999A999A %999A999A759A999A6F9A999A6F9A759A6F9A759A6F9A6F9A6F9A6F9A6F9A %6F9A6F9A6F9A6F9A6F9A6F9A21CAFD0EFFA26FC9C2C2C2C3C2C2C2C3C2C2 %9AC3C2C29AC2C2C29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC2 %9AC29AC29AC29AC29AC29AC29AC29AC29AA09AC29A9A9AC29A9A9AA0FD12 %9A999A9A9A999A9A9A999A9A9A759A9A9A759A9A9A6F9A9A6F7DFD0EFF76 %9AC2C2BCC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29A %C29AA09AC29A9A9AC29A9A99C29A9A99C29A9A999A9A9A999A9A9A999A9A %9A999A9A9A999A999A999A999A999A999A999A999A759A999A6F9A999A6F %9A759A6F9A759A6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F76FD0DFFCA76A0C3 %9AC3C2C2A0C2C2C2BCC2C2C29AC2C2C29AC29AC29AC29AC29AC29AC29AC2 %9AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29A9A9AC29A9A9AC29A9A %9AA0FD0A9A999A9A9A999A9A9A999A9A9A999A9A9A999A9A9A759A9A9A6F %9A999A6F9A999A759A769A769A4BFD09FFA87DA8A8A87DA8A8A8A7A8A1A8 %A1A7A1A19AC29AC299C29AC29AC29AC299C29AC299C29AA099C29A9A99C2 %9A9A99A09A9A999A9A9A999A999A999A999A999A999A999A999A999A999A %999A999A999A999A759A999A6F9A999A6F9A759A6F9A6F9A6F9A6F9A6F9A %6F9A6F9A76A17DA1A1A87DA8A8A8A1FD06A8FD04FFA8FD0BFFAFFFAFFFA8 %FFA8A8A1C3A0C29AC2C2C29AC29AC29AC29AC29AC29AC29AC29AC29AC29A %C29AC29AC29AC29AC29AC29AC29AC29AA09AC29AA09AC29A9A9AC29A9A9A %A0FD129A999A9A9A939A9AA1A1A8A8FFA8FFAFFFAFFFFFFFAFFFFFFFA8FF %FFA8FD04FFA8A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8AFA8A8A1A1 %9AC29AC29AC29AC29AC29AC29AC29AA09AC29A9A9AC29A9A99C29A9A99A0 %9A9A999A9A9A999A9A9A999A9A9A999A999A999A999A999A999A999A999A %759A999A759A999A6F9A759A6F9A76A1A1A8A8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FD04FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFFFFFA8FFA8A8A1C3BCC29AC29AC29AC29AC29AC29AC29AC29AC29AC2 %9AC29AC29AC29AC29AA09AC29A9A9AC29A9A9AC2FD0A9A999A9A9A999A9A %9A999A9A9A999A9A9A999A9AA1A1FFAFFFA8FFFFFFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FD05FFA8A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8AFA8A19ABC99C29AC299C29A9A99C29A9A99C29A9A999A %9A9A999A9A9A999A999A999A999A999A999A999A999A999A999A999A999A %759A999A6F9A999A6F9A759A6F9A6F9A76A8A8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD04FFA8FFA8FFFFFFA8FFFFFFA8FF %FFFFA8FFFFFFA8FFFFFFA8FFA8FFA8FFAFA8A1C3BCC29AC29AC29AC29AC2 %9AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AA09AC29A9A9AC2 %9A9A9AA0FD0E9A999A9AA1A8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFF %FFA8FFFFFFA8FFFFFFA8FD05FFA8A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A19ABC9AC29AA09AC29A9A9AC29A9A %99C29A9A99C29A9A999A9A9A999A9A9A999A9A9A999A9A9A999A999A999A %999A999A999A999A999A759A999A76A8A8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD04FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFFFFFA8A8A0C29AC29AC2 %9AC29AC29AC29AC29AC29AC29AC29AC29AC29A9A9AC29A9A9AC29A9A9AA0 %FD0A9A999A9A9A999A9A9A93A0A1FFA9FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8FD04FFA8A8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8A19A99C29A %9A99C29A9A99A09A9A999A9A9A999A999A999A999A999A999A999A999A99 %9A999A999A999A999A999A759A999A6F9A93A0A1FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD04FFA8FFFF %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFFFFFA1C39AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29A %A09AC29AA09AC29A9A9AC29A9A9AA0FD099AA1A8FFFFFFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8FD04FFA8A8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA1A0999A9AC29A9A9AC29A9A99C29A9A99A09A9A999A9A9A99 %9A9A9A999A9A9A999A999A999A999A999A999A999A999A75A8A8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FD04FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFFFFFA8C39AC29AC29AC29AC29AC29AC29AC29A %C29AA09AC29A9A9AC29A9A9AC2FD0A9A999A9A9A999A9AA8A8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FD05FFA8A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8A1999A99C29A9A999A9A9A999A9A9A99 %9A999A999A999A999A999A999A999A999A999A999A999A759A999A76A8A8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FD04FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A19AC29AC29AC29A %C29AC29AC29AC29AC29AC29AC29AC29AA09AC29A9A9AC29A9A9AA0FD079A %A8FFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FD05FFA8A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A099C29A9A %99C29A9A99C29A9A999A9A9A999A9A9A999A9A9A999A9A9A999A999A999A %999A999A9AA8A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD04FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8A19AC29AC29AC29AC29AC29AC29AC29A9A9AC29A9A9AC29A9A9AA0 %FD0B9AA8AFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8FD04FFA8A8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA19A99A09A9A999A9A9A999A999A999A999A999A999A999A999A999A %999A999A999A999A99A1A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD04FFA8FFA8FF %A8FFAFFFA8FFAFFFA8FFFFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFFFFFA1C29AC29AC29AC29AC29AC29AC29AC29AC29AA0 %9AC29AA09AC29A9A9AC2FD059AA1A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFFFFFAFFFFFFFAFFFFFFFA8FFA8A8FD04 %FFFD05A8A1A8A1A7A1A8A7A8A8AFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8A9A0BC9A9A99C29A9A99A09A9A999A9A9A %999A9A9A999A9A9A999A999A999A999A93A1A8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFFD04A87DA8A1A17DA1FD05A8 %FD09FF9AC2C3C2C29AC2A0C3A0C9A8A8A8FFFFFFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFFFA89AC29AC29AC29AC29AC29AA09AC29A9A %9AC29A9A9AC2FD099AA0A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFFFFFA8A87DA1769A759A6F9A759A6FCAFD0DFF9AC29AC29A %C29AC29AC299C29AA1A1AFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8A8999A9A9A999A9A9A999A999A999A999A999A999A999A99 %9A999A999A999A7DAFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8A8769A6F9A6F9A6F9A6F9A6F9A6F6FA2FD0DFFA0C2C3C2C2C2C3 %C2C2C2C3C2C2BCC3A1A8A8FFFFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8A79AC29AC29AC29AC29AC29AC29AC29AC29AA09AC29A9A9AC2 %9A9A9ABCA1AFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFFFFF %A1A19A9A939A9A9A759A9A9A6F9A9A9A6FCBFD0DFF9AC29AC29AC29AC29A %C29AC29AC29AC29AA1A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8A0999A99C29A9A999A9A9A999A9A9A999A9A9A999A9A9A999A99 %9A9AA8A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8769A6F %9A6F9A6F9A6F9A6F9A6F9A6F9A756FA8FD0CFFCBFD07C29AC2C2C29AC2C2 %C29AC2BCC2A1FFFFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA1 %C29AC29AC29AC29AC29A9A9AC29A9A9AC29A9A9AA0FD059AA1A8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A1769A999A759A9A9A6F9A9A %9A6F9A759A6F9A6FCAFD0DFF9AC29AC29AC29AC29AC29AC29AC29AC29AC2 %9AC2A1A8A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8FD049A99 %9A999A999A999A999A999A999A999A999A999A93A07DFFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8A16F9A6F9A6F9A6F9A6F9A6F9A6F9A6F %9A6F9A6F9AA8FD0DFFC2C2C3C2C3C2C2C2C3C2C2BCC3C2C29AC2C2C29AC2 %A1AFAFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A89AC29AC29AC2 %9AC29AC29AC29AA09AC29AA09AC29A9A9ABCA1FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFCAFFA8A1999A999A9A9A759A9A9A759A9A9A6F9A9A9A %759A6FFD0EFF9AC2A0C29AC29AC29AC29AC29AC29AC29AC29AC29AC2A0A8 %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A0999A99A09A9A999A %9A9A999A9A9A999A9A9A999A999A9AA8A8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA89A6F9A759A6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F9A %A8FD0DFFC2C2C3C2C2BCC2C2C29AC2C2C29AC2C2C29AC2BCC29AC2A1AFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA1C29AC29AC29AA09AC29A %9A9AC29A9A9AC2FD059AA1A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8A1999A999A9A9A759A9A9A6F9A9A9A6F9A759A6F9A769A6FFD0EFF9A %C29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC299C2A1A8A8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8FD049A999A999A999A999A999A999A %999A999A999A7DAFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A16F9A %6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F6FA8FD0DFFC2C2C3C2 %C2C2C3C2C2C2C3C2C29AC3C2C29AC2C2C29AC2BCC2A1FFFFFFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8A19AC29AC29AC29AC29AC29AC29AA09AC29A %9A9ABCA0A8A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFAFA1999A9A9A99 %9A9A9A999A9A9A759A9A9A759A9A9A6F9A9A9A6FFD0EFF9AC29AC29AC29A %C29AC29AC29AC29AC29AC29AC29AC29AC29AA07DFFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8AF7DC29A9A999A9A9A999A9A9A999A9A9A999A9A9A99 %A1A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8759A6F9A759A6F9A75 %9A6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F70A8FD0CFFCBFD07C29AC2C2C29A %C2C2C29AC2C2C29AC29AC29AC2BCA1A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFAFA89AC29AC29AC29A9A9AC29A9A9AC29A9A9AA09AA07DFFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFFFAF769A9A9A999A9A9A759A9A9A759A9A %9A6F9A9A9A6F9A759A6F9A6FFD0EFF9AC29AC29AC29AC29AC29AC29AC29A %C29AC29AC29AC29AC299C29AA8A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8A1999A999A999A999A999A999A999A999A999A76A8A8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FF7D9A6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F %9A6F9A6F9A6F9A6F76A8FD0DFFC2C2C3C2C3C2C2C2C3C2C2BCC3C2C29AC2 %C2C29AC2C2C29AC29AC2A0FFFFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A1C29AC29AC29AC29AC29AA09AC29AA09AC29AA1A8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8A1999A9A9A999A9A9A999A9A9A759A9A9A759A9A9A %6F9A9A9A759A6FFD0EFF9AC2A0C29AC29AC29AC29AC29AC29AC29AC29AC2 %9AC29AC29AC29AC27DFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8FD04 %9A999A9A9A999A9A9A999A9A9A999A7DA8A8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8A8999A6F9A759A6F9A759A6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F %9A6F9AA8FD0DFFC2C2C3C2C2BCC2C2C29AC2C2C29AC2C2C29AC2BCC29AC2 %9AC29AC29AA1A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A19AC29AA0 %9AC29A9A9AC29A9A9AC29A9A9AA8A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8AFFD049A999A9A9A999A9A9A759A9A9A6F9A9A9A6F9A759A6F9A769A6F %FD0EFF9AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC299 %C29AFD13A8A09A999A999A999A999A999A999A999A99A17EFFFD0FA8FFA1 %9A6F9A759A6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F6FA8 %FD0DFFC2C2C3C2C2C2C3C2C2C2C3C2C29AC3C2C29AC2C2C29AC29AC29AC2 %9AC2A1FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A19AC29AC29AC29AC2 %9AC29AA09AC29A9AA1AFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A1999A %9A9A999A9A9A999A9A9A999A9A9A759A9A9A759A9A9A6F9A9A9A6FFD0EFF %9AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AA1 %A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8AFA19A999A9A9A999A9A9A999A %9A9A999A99A1A8FFA8A8A8FFA8A8A8FFA8A8A8FFFD04A89A9A6F9A999A6F %9A759A6F9A759A6F9A6F9A6F9A6F9A6F9A6F9A6F9A6F70A8FD0CFFCBFD07 %C29AC2C2C29AC2C2C29AC2C2C29AC29AC29AC29AC29AC2A0A8A8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8A89AC29AC29A9A9AC29A9A9AC29A9A9AC2A1 %A8A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A0999A999A9A9A999A9A9A75 %9A9A9A759A9A9A6F9A9A9A6F9A759A6F9A6FFD0EFF9AC29AC29AC29AC29A %C29AC29AC29AC29AC29AC29AC29AC299C29AC299C2A1FD11A87DA0999A99 %9A999A999A999A999A999A99FD13A86F9A759A6F9A6F9A6F9A6F9A6F9A6F %9A6F9A6F9A6F9A6F9A6F9A6F9A6F76A8FD0DFFC2C2C3C2C3C2C2C2C3C2C2 %BCC3C2C29AC2C2C29AC2C2C29AC29AC29AC29AA8A8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8A8A0C29AC29AC29AC29AA09AC29AA09AC3A8AFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA1FD079A999A9A9A999A9A9A759A9A9A759A %9A9A6F9A9A9A759A6FFD0EFF9AC2A0C29AC29AC29AC29AC29AC29AC29AC2 %9AC29AC29AC29AC29AC29AC2A1FD11A87DA1999A999A9A9A999A999A999A %999A9AFD12A8A16F9A999A6F9A759A6F9A759A6F9A6F9A6F9A6F9A6F9A6F %9A6F9A6F9A6F9AA8FD0DFFC2C2C3C2C2BCC2C2C29AC2C2C29AC2C2C29AC2 %BCC29AC29AC29AC29AC29AC9FD12A8A0C29A9A99BC9A9A999A999A999A99 %9AA8AFFD0FA8AFA1996F9A939A6F9A999A6F9A999A6F9A9A9A759A9A9A6F %9A759A6F9A769A6FFD0EFF9AC29AC29AC29AC29AC29AC29AC29AC29AC29A %C29AC29AC29AC299C29ABCA0FD11A87EA0939A9999939A9399939993996F %9976FD12A8A16E936F936F936F996F936F996F996F9A6F9A6F9A6F9A6F9A %6F9A6F9A6F6FA8FD0DFFC2C2C3C2C2C2C3C2C2C2C3C2C29AC3C2C29AC2C2 %C29AC29AC29AC29AC29AC3FD12A89ABC999A999A9999939A93999399939A %A8AFFD0FA8AF9A936F996F936F996F996F996F996F9A6F996F9A6F9A6F9A %759A6F9A9A9A6FFD0EFF9AC29AC29AC29AC29AC29AC29AC29AC29AC29AC2 %9AC29AC29AC29AC29ABCA0FD11A884A093999399939993936F9993936E93 %99FD12A8A168936E936E936E936F6F6E936F6F6F936F6F6F936F6F6F996F %936F9A6F6FA8FD0CFFCBFD07C29AC2C2C29AC2C2C29AC2C2C29AC29AC29A %C29AC29AC29AA1FD12A89A99939993999399939993999393929AFD11A8AF %76936E936E936F936E936F936E936F936F936F936F936F936F936F936F9A %6FFD0EFF9AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC29AC2 %9AC299BCA0A87DA8A8A87DA8A8A87DA8A8A87DA8A8A87D9A92936E939293 %6E936E936E936E936FA8A8A87DA8A8A87DA8A8A87DA8A8A87DA8A8A16893 %686F6893686F686F686F686F686F686F686F686F6E6F68FD056FA8FD0DFF %C2C2C3C2C3C2C2C2C3C2C2BCC3C2C29AC2C2C29AC2C2C29AC29AC29AC299 %A1FD12A89A939399939993999393929993939299FD11A8A9A1936E936E93 %6E936E936E936E936E936E936E936E936F936E936F936F996FFD0EFF9AC2 %A0C29AC29AC29AC29AC29AC29AC29AC29AC29AC29ABC99BC999A99BCA1FD %11A87D9A92936E9392936E9392936E936E926EFD13A86892686E6893686E %686F686E686F686E686F686F686F686F686F686F6E6FA8FD0DFFC2C2C3C2 %C2BCC2C2C29AC2C2C29AC2C2C29AC2BCC29AC29ABC99BC99BC99FD13A8FD %049392939293929392936E9392937DAFFD11A89968936E93689368936893 %686F6893686F6893686F686F686F686F6E6F68FD0EFF9AC29AC29AC29AC2 %9AC29AC29AC29AC29AC299C299BC99BC999993BB939A7DFD11A87D936E93 %92936E936E936E936E92689368A184FD10A8A97668686E686E686E686E68 %6E6868686E6868686E6868686E6868686F686FA8FD0DFFC2C2C3C2C2C2C3 %C2C2C2C3C2C29AC2C2C29AC29AC299C299BC99BC99BB9AAFFD0FA8FFA8A1 %9299929392939293929392939293929276AFFD11A8A16893689368936893 %689368936893686F6893686F6893686F686F686F68FD0EFF9AC29AC29AC2 %9AC29AC29AC29AC299C299BC99BC99BB99BB999993BB93A1FD12A876926E %9392936E9392936E936E926893689A84FD12A86F6892686E686E686E686E %6868686E6868686E6868686E6868686F6869A8FD0CFFCBFD07C29AC2C2C2 %9AC2BCC299C299BC99BC99BB99BB99BB93BCFD12A884A092939293929392 %939293929392936E9393FD12A8AF768C689368926893686E6893686E686F %686E686F686E686F686E686F68FD0EFF9AC29AC29AC29AC29AC299BC99BC %99BB99BB99BB93BB939992BB93939AFD13A86F9292936E936E9268936E92 %68936E9268937DFD12A8A16868686E6868686E6868686EFD0F6869A8FD0D %FFC2C2C3C2C3C2C2BCC2BCC299C2BBBC99BC99BB99BC99BB93BB99BB93FD %13A87D9992939293929392939293929392936E9392A1A8FFFD0FA8FFA89A %68936893689368926893686E6893686E686F686E686F686E686F68FD0EFF %9AC2A0C29AC29AC299C299BC99BC99BB99BB99BB93BB939992BB929AFD13 %A8A1929392936E9392926E936E9268936E92689275FD12A8AF7D6E686E68 %6E686E6868686E6868686EFD0B6869A8FD0DFFC2C2C3C2C29AC2BCC299C2 %BBBC99BC99BB99BB99BB93BB93BB92BBA7AFFD12A89A9292939293929392 %93929392936E9392936899FD13A8AF75686893686E6893686E686F686E68 %6E686E686E6868686E686E68FD0EFF9AC29AC299C299BC99BB99BB99BB93 %BB93BB92BB939992BB929276A9FD12A87D9392926E936E9268936E926893 %6E926893689268A1FD14A86868686E6868686EFD0E6844686868A8FD0DFF %C2C2C2BCC2BBC2BBC299C2BBBB99BB99BB99BB99BB93BB93BB99AFA8A8A8 %FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8A192939293929392939293929392 %93929392936E929AAFA8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A168 %9368926893686E6893686E686F686E686F686E686E686F68FD0EFF9AC299 %C299BC99BC99BB99BB99BB93BB93BB92BB939992BB93FD15A86F9292936E %9392926E9392926E936E9268936E926893A1FD14A876686E6868686E6868 %686EFD0E68A8FD0CFFCBC2C2C299C2BBBC99BCBBBB99BB99BB93BB99BB93 %BB93BB92A7FD13A8AFA1939293929392939293929392936E9392936E9392 %9368A1FD13A8FFA8996893686E6893686E686E686E686E6868686E686868 %6F68FD0EFF99C299BC99BB99BB93BB99BB93BB93BB92BB929992BB92A1FD %14A8849A8C926E9392926E936E9268936E9268936892689268926FFD14A8 %AFA86F686EFD0E68446868684468A8FD0DFFC2BCC2BBC2BBBC99BCBBBB99 %BB99BB93BB99BB93BB93A1A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFFD %04A89393929992939293929392939293929392936E9392936E93A1FFA8FF %A8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8FFA899686E6893686E6893686E %686F686E686E6868686F68FD0EFF99C299BB99BB99BB93BB99BB93BB93BB %92BB92B592A7FD16A876929293929392936E9392926E936E9268936E9268 %936E926899FD15A8AFA89A6868686EFD1068A8FD0DFFBCBBC2BBBB99BBBB %BB99BB99BB93BB99BB92BB99A8A8FFFD13A8FFA199929392939293929392 %939293929392936E9392936E93929368A1FD15A8FFA8A16868686E686E68 %6E6868686E6868686E686E68FD0EFF99BC99BB99BB93BB93BB92BB93BB92 %BB92999AFD17A8849A92936E9392926E936E9268936E9268936E92689368 %92689268926FFD18A8A16FFD0D6844686868A8FD0DFFBCBBC2BBBB99BBBB %BB99BBBBBB92BB99A0A1FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8 %FFA8CAA8A8929392999293929392939293929392939293929392936E9392 %936E92A0FFA8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFAFAF76 %936868686F686E686F686E686E686E68FD0EFF99BB99BB99BB93BB93BB92 %BB92999AFD1BA86F929293929392936E9392926E9392926E936E9268936E %92689368926893A1AFFD17A8AFA8A16FFD0D68A8FD0DFFBCFD06BB93BB99 %9A9AA7A8AFA8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8 %AF9A92929392939293929392939293929392936E9392936E9392936E936E %93689AA8FFA8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFFD05A8FFA8FFA1 %9A6F6FFD0968FD0AFFA8FFA8A89AC3A0A09AA09AA17DFD1EA8A97D939293 %929392926E9392926E936E9268936E9268936892689268926892689268A1 %FD1BA8FFA8A8A1A876766F766F766F76A8FFA8FFA8FD04FFFD05A8FFA8FF %A8FFA8AFA8FFA8FFA8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FF %A8A8A8FFA8FFA89992939299929392999293929392939293929392939293 %6E9392936E9392936E936EA8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FF %A8A8A8FFA8A8A8FFA8FFA8FFA8FFA9FFA8FFA8FFA8A8A8FFA8A8FD04FFFD %2AA8FFA89A9293929392939293929392936E9392926E936E9268936E9268 %936E926893689268926FFD2CA8FD04FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8 %A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8FFA8A0 %929392999293929392939293929392939293929392936E9392936E939293 %6E936E9368926FA9A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FF %A8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFFD04A8FD04FFFD28A8AFA8A19293 %9293929392936E9392926E936E9268936E9268936E926893689268926892 %68926892689275FD2AA8FD04FFA8A8A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A192BB929992 %99929392999293929392939293929392939293929392936E9392936E936E %936E936E9276FFAFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD05FFFD28A8A192929293929392 %939293929392936E9392926E9392926E936E9268936E9268936892689368 %926892686E76AFFD27A8FD04FFFD05A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8 %A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A192B592939299929392 %9392939293929392939293929392936E9392936E9392936E936E9368936E %936893689275FFAFFFA8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8 %FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8FD04FFFD24A8AFA8A0929292939293 %92939293929392926E9392926E936E9268936E9268936892689268926892 %68926892686E689268686FFD26A8FD04FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A092BB92BB92 %9992BB929392999293929992939293929392939293929392936E9392936E %9392936E936E9368936E9368926FA8AFFFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8FD04FFFD22A8AFA199 %92939293929392939293929392939293929392936E9392926E936E926893 %6E9268936E9268936892689368926892686E689268A1A8FFFD21A8FD04FF %A8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8 %A8FFA8A89ABB929992BB9293929992939299929392939293929392939293 %9293929392936E9392936E9392936E936E9368936E9368936E926892689A %A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FF %FD04A8FD04FFFD1EA8AFA8A7999292939293929392939293929392939293 %6E9392926E936E9268936E9268936E926893689268926892689268926892 %686E6892686E686E686F7CAFFD1FA8FD04FFA8A8A8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8C292B592BB93BB92BB9399 %92BB92999299929392999293929392939293929392939293929392936E93 %92936E936E936E936E9368936E9368936893689275A8A8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD05FFFD1AA8AFA8A8 %9A9992BB929392999293929392939293929392939293929392936E939292 %6E9392926E936E9268936E926893689268936892689268926892686E6892 %686E686868767DFFA8FFFD19A8FD04FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8A8A8FFA8FFA8AFA7A093BB92BB92BB939992BB929992BB9293 %92999293929392939293929392939293929392936E9392936E9392936E93 %6E9368936E9368936E9368936892689368926892686F75A8A8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8FD04FFFD12A8FFA8A9A8 %A9A1A199BB92939299929392939293929392939293929392939293929392 %926E9392926E936E9268936E926893689268926892689268926892686E68 %92686E6892686E686E686E686E6868686F76A8A8FFA8AFFD13A8FD04FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8A7C39ABB92BB93BB92BB93 %BB92BB93BB92BB939992BB929992BB929392999293929992939293929392 %939293929392936E9392936E9392936E936E9368936E9368936E93689368 %936893689368936868689A9AA8A8FFAFFFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8A8FD04FFFD06A8AFA8A8A8AFFD04A8A1A1A0A099BB92BB929992BB92 %9392BB92939299929392939293929392939293929392939293929392936E %9392926E936E9268936E9268936E9268936892689368926892686E689268 %6E6892686E686E6868686EFD05686F6F9A7DA8A1FD04A8AFA8AFA8FFFD04 %A87DFD06FFA8FFAFA19AC3A0C29AC29ABC99BB99BB92BB93BB92BB93BB92 %BB93BB92BB93BB92BB929992BB9293929992939299929392939293929392 %9392939293929392936E9392936E9392936E936E9368936E9368936E9268 %936892689368926893686E6893686E686E6868686E686F6E936F9A6F9A76 %7676FFA8FFA8FD0AFFA19299BB92BB92BB92BB92BB92BB92BB929992BB92 %939299929392999293929392939293929392939293929392936E9392926E %936E9268936E9268936E926893689268926892689268926892686E689268 %6E686E686E686E6868686E6868686EFD0A6844686868446E4477FD0FFF6F %C2C2BB99BBBBBB99BB99BB93BB99BB93BB93BB92BB93BB92BB93BB92BB93 %BB92BB939992BB9299929992939299929392939293929392939293929392 %9392936E9392936E936E936E936E9368936E936893689368936893689368 %926893686E6893686E686F686E686F686E686F6845A8FD0FFF7792C299BB %93BB93BB92BB93BB92BB92BB92BB929992BB929392BB9293929992939293 %92939293929392939293929392936E9392926E9392926E936E9268936E92 %6893689268936892689268926892686E6892686E686E686E686E6868686E %6868686EFD0C684CFD10FFA86FBBC3BBBB99BBBBBB93BB99BB92BB93BB92 %BB93BB92BB93BB92BB939992BB929992BB92939299929392939293929392 %9392939293929392936E9392936E9392936E936E9368936E9368936E9368 %936892689368926893686E6893686E6893686E686E686E686EFD04686E6F %20A8FD11FF776F99C293BB92BB93BB92BB92BB92BB929992BB9293929992 %9392939293929392939293929392939293929392926E9392926E936E9268 %936E926893689268926892689268926892686E6892686E6892686E686E68 %6E686E6868686EFD0F68932077FD13FF526FC2C399BBBBBB99BB99BB93BB %93BB93BB93BB92BB93BB92BB93BB92BB939992BB929992BB929392999293 %929992939293929392939293929392936E9392936E9392936E936E936893 %6E9368936E936893689368936893689368926893686E6893686E686F6868 %6F9A204CFD15FF4C4B9AC399BB92BB92BB92BB92BB929992BB929392BB92 %9392999293929392939293929392939293929392926E9392926E9392926E %936E9268936E926893689268926892689268926892686E6892686E689268 %6E686E6868686E6868686EFD0768936F70204CA8FD16FF524B6FA1C2C2BB %BB99BB99BB93BB99BB93BB93BB93BB93BB92BB93BB92BB939992BB939992 %99939392999293929992939293929392939293929392936E9392936E9392 %936E936E936E936E9368936E9368936E93689368936893686F689368936E %93939A704B2077FD19FF7D4C206F6F9A9AC29AC29AC29AC29AC29AC29AC2 %9AC29AA09AC29AA09AC29A9A99A09A9A99A09A9A999A9A9A999A9A9A999A %9A9A999A999A999A999A999A999A999A999A759A999A759A999A6F9A759A %6F9A759A6F9A759A6F9A6F9A6F9A76764B4C20214BA8FD1CFFA24C4C454B %45704B6F4B6F4B6F4B6F4B6F456F4B4B456F4B4B456F4B4B456F454B454B %454B454B454B454B454B454B454B454B454B454B454B454B454B454B454B %454B454B454B454B454B454B454B454B454B454B454B454B454B2145204B %4B77A8FD20FFA8A87D7D52775377527753775277537D537D777D537D777D %537D777D537D777D537D777D537D777D537D777D537D777D537D777D537D %777D537D777D537D777D537D777D537D5377527752534C534C534C534C53 %4C535253527D7DA8A8FD70FFA9FFAFFFA8FFAFFFA8FDFCFFFDFCFFFDA1FF %FF %%EndData endstream endobj 227 0 obj <>stream %AI12_CompressedDataxkɑ-CFXn#axVՌbhPjĽl/=~n+U̇gd<͎?eX=~|zOz~w~?n×ӷ>~>GϞqwOohl߼~$ OssU5>Կ;|͛o}34wz/Wt_]|xߦ/]W]ۡx/ rm?~Oa7~/̛a~3[_ n~[/޽ꟿOoa4Ǜ/q}|ۯ/~ {c|p??y_ӧ7{oz/wަX鳿~Ʒ'OWvf4}ۿ+fSS΃>}7緿ͯۯyg ٮz~=y>?ZWUW{ <#X9~S<ǻ-/4l۰A7?޿} 񱑎>~=#qz/*޽_73A?Φކo~˺\o~z[ =\RըZo8Ɛ_>˻_ӻY@+<gRޟ? W;sW"||:"x/l>C|  |K8bC/;x7>~o?ׯ?3_gpV@wp]o= oy}3>WO\3߿>cwϼG]5wWlDz!o#zʭ_>f~ۿ>:2{gzϏCť'/o޿Oo?/<tޫ΢?^/}b~? ;} ނ(_/pxɼ2} z_a`=o>8^Ç7_/P}aa^ׯ~UnjXMRnXRork]F7mM4Mׄnnfk׶k};~n]չwc7wk_uzߏ/oW$O~_6TC=Zn0`0˰pNc5#l،ء/ql;~5_vX֢uh=GF5d_me;Ubu^Κ֥#W?6i#^z2+)zXU x^ ~]ݪg>oq]:6wjj/-{(pe3}3eSWwB3}7?tkӃwׯ QH}ɟ_Ԩ'?E'eJx&M'P䣢 ~Jl`ȮFvmj'1izG9cMvF_mC4q#^xŭvW`;~#(3x E* *F++'Wlq2?YTOZ'ޤQrΣO!2W/z+Ywϲ%aːO%z53kbPx#,@pN\.'5̳O^I25bQx;;bW\=z3&i%U5Zn#\Da-sB4[4nr2ӅI"'XcifS .DPnEWpщ \aDsy\naV_p, <.Up(t#/=x 嘊㕘VZm9\qeeWNv5_ `[ٖ wqW[{Wn5Fr: ?uTomC?%XuSdI_խrZe|qڥYgֈk մnM]lwpcF_!I{.UxxF86`q(ʺWR{LB31fi^ 2oZ̐58jUj0Ri) f7N^Mf~ɣ9fFkpΣyOlL(]t6vŴͲmlnN[u`{7moȰVj fL/BHBU1ԇ|l/և:8'źr BuS+1UW_qU")ت*7 _H'{+@cTpꠂh2l~ )Kj qj2ZVIWgWTTQUEFix*euJG.+5YZя=M?ч؍cB/첦0Za^s:D.;w0cW0uk{[8NW4xl¸q#;.m.S8 Rh͗[j-\y2, |G\~23W\F%MpX[%vT oXrzgy<,2[e]Vt|RzDp+h]m=m`B5"~:gOh[6xm',>>d#6$>AHl|tM:a0no9۹ϼy1`_r0⚜\Fs.R1 }sι3Up6cG g熇h' g VHy8:88jLmp-˼LxXtxsۊɷ a:0搂;an4܈d2ANi:iG~x!Ai2 6NXI0&) S_\.G-LlȚ0m19rt҆ G,`} Gc6x5x]&bϐ8I&JpL#1^nG0tEت Ͻ+3/.&D; EȈ ^.'o*&G}7|AG-0Oc_ yFGpf<MzpYaJ7!'MxrmԵ)CBX)O{w_SnhO5Ӟr񔄨B}09~1fYw\h/C8˅Hg}`'Së \cAu?ZE0ߎqK N= [W)zG]6ؿ/h7CK.8d 5wbG1\㮩0t zo9Xsu\r*f\xǃNl9蘽{!L|=娿`5Ec ;q6븼_]/=Lxwhj|}qӀvc_CW)+W:C0?}&?vmiq9Bm{߾}kM$A7mkoĴ[H0 44NXQ-  ܭX{{U iMW_PV&BZ"W uCg&5mgҤYi3Q6HI 3&NI %:,oP/!$:7g7Lo0Df8x );ǭ9Ŭ:m(<avh14S@!s qcI5̌ :ht%%,='FpY]}Jik6љ:, .pyI&&_׬{um{P0Pr1kKbϭ.ǃե j HAҮ/եY_j6Wq+fL$Mr"ZB1)@}Zޫ0)Vg%ݷw[^;dYR|Q=Jc~Dm<̗[E4jr_Ù>cB\љџ,ӒJNŐs.z-+H%+&]`PҥO}`dJПdB0fVX$[ Op* D35lN`\UArI K^s^X0`>m05&[إ ی[GqjpJ`rˉ\]0Jٸeekh$z,|E  ,R/%W%?EWW.G׳V͙MBfSz#hlVѱ#Nh[H"p΂^jFO51DžHr$*_9Ԝ:/# cnBdbpP`!3>3I0MˆTp""[OjJgӄqyk28r_[̪"vS/Y&2Rň/IH 7PT.O$-Y󳣞!=s5rϓOϔOBBE-‰ ڒ'4AŁ m|'_=]Ǩc$.j$Ab,#I Qd?r{DG|rG]Lq9̺d>W~fJF. "4ʡp{Up#x'&az=qqkt`ƿ ?p .#}s\Zy"`b6BJա*Cφ@:ՠ8: vU㏮J87w [ĚXY-lJh>-ݒtW۝wT@ !Rs9C *Zbڲ`2X`Zilnl]3vg`M.|Z*Ҽڍhv*1,m|XhOZxϙv 3올c_a}Ȅc>Խm =ߗl!O$1IFsR'MJdnrᙄ-7=jW L 4~Y~cʴe39h>M'9pO k83 ,厇'˜m AaJ!pyUEUɟKr.$Wעo'|ހ{F7>^0%igJ#Yc V#!IE,x2 $ZA&Gd':FNH<$~ڐTUǬwH}v\mcs1S;뚊1-U4 {wDwS]-n~0!/6|\C>9̞$k)YIOE1`Ky$9XjUMjɮfd%+&D=94?^KGP?I:?Vs}mrek99 Xlۘ-`}*PJt .y)E&KfEϨK%/p( 0TP RHF &_hy͞.o#kCb8t~I@ )1`a%=p{pt*:1m fF5gsQ{IA Vw)s*VY<7NZWUQ g Y2SkZU<1 3'=k,,fiŬz&p9 y5hׁKBEQ)cTT'j5$]Ϟ\c9#8gȲM[C03I\* Te7>s✼9|ěx; ?JU& }ҹoG-pȳW1idfK eSVR>'J`ҫ е-|,.+>K9'Ũ/,dL%J'p r9VXR@zH_𙧁P&r̭>D)#^#VMéwІC3Z?ѲrdہFuhG4.ڮ1PQigw4Heq4 ,iߵyL~ X4~M gf[;_z xZWpA;Ha}pAr K= `Ln༲Į8{ɓ](8uRGڗ fa w]2x} ʗ{b)o#AdZ#>Wr3U:L`XRYy8ٶ0–c蛛A_q'?_C.di\m"ae3qֿmmAZj„Ieq8떯#:C,X[h0 6 ƊAhXg ZWBڭkVB] *ض+fE?ia2m?mڏ"!ʎ\1r3ZYόۂ9pZZҹB׷ɒ4.><|, (5.eRř&XBb- ^"1HAϷ$,}OpRۆ>IPTiFD)"K?0W&)22[|npuԥy1ڔc2/xDOU#=zBd䟁q02 qڽs82?Rbq_9W]MJdzC()݈j7o'D[`{R} XS͜#|s|gaskO3*FwlgPpT=v>yW9c5\t~ 8~@ݺV`e_ gt9$ƪ+6,֯r#SR5@!>lVrb%Sh<ΒOpf௙H58dzq"KА𔐂Pƙ̑Pq'Fy:yru]*4s4#In.'S%Z<1sVr3*&&;Ay3N dd 82J ,Ӝ潾 LT ]*<&-ǩ=1Dpv +]+`ipz@qk-և`2{O祧`:Ά '4q(L>Oz=&'rRG>Rm(>l2Dѐ./s^9BTbŠ}5z^n}#]ǟpvM_3&Hֈ`ʨItޠ!tW/hfh p Im"h HjzXe6Kb%Ṿ#Eۏ,`m4`]t=+n)7 IwClr He-ڥR(3|-.e vS Q>7 D>'.i4% CQGayD 3i܊[zp W2UJ1:,;n.H} 8Cdq?i<5 {Y] C`lO9>%Z+4~55Zí+ud=$Mն8miApwnm1v(,b3 }2/[ 0&b Ls혜!,]'Xzd2Lm?in#Ƃ3S_ Om^lēV'c;^ؒ`Ĝ4<ETw\ЂrrM{W&0o#NnO4}YF (%DpG0Uݍt!ěPc8%XBX*Ske*XIIe&&g"52p> Z馬^j\Lt6I^䀳%ß5غcQo I)åk^\1Z(0B23}윥P ^sh;T#f(qcКy26)#w "DN0͵0jXTCew3/1 \d"N^5gv[AMp]V"&xliΩtfPWPHg `^`9qV I(]C|=2_JkpR,$ FBEDP,Bp ϰ(~M,ڠh8 Ԕ3 %Lu7dU܁AkNgAwW9̍ޏ%@|5KV+q 6EqXη(W\AHJ0D~{Q_B4ߞ;xph<<z 7ehp5ӤNB7V>FYKH@PT՚bCpi!"|4"d!Y֌xփnJ"fDs&XE,}Z-'d*Y)s%*،!㿪*9x/ޝ] ϶90#1w-9i\,4J]'\Y||12}}' L~1;©&Vy3FôGzn/G2֛wOn?(Xǂ}6[Q^<"=hIv:m >?VFS[ή2ٴyTj/).Y[D%hWqj-s˨Aqx* r9wjt$H[B:5?0rmj`Β;c}L#}:=Xҭ>nr;:ǓsC29?P> kN] gV =1er߀tXN7a.&+cEA:1i=蛤GHn | 5kƅlŤp|mxՠzq'|>=Fkx19Ƙ3+!&5nTDsGZ.?yTf|v6*߽Oݿ[2Sc$pSl,|qp s/nڮū Ӫ=+jFk=?>Խ*LmdUb]wkV/W7N{m~ oW{~gpMuoc=:]IߒN+NYdW]6{UgS?|m[^+yuv'߿\6kbeaJypKW67/V_ gaf-#xI7Qvc߱_ӬaWW\} oߠjjqwpNL Is9U~*ӟ1᮳:?TEaC~|]5ZmCc1lkE^A[( ּaC<۵0u`!.#f|~+2Y.?";bUX |H?{I&A\rsR!ACc>d(OBtԪ^ Q:_tjrj0MuDՠaҎI h|FeY96k!@$"fb#e'65- 9Dۦ--F£Ȟ[>Z`,>Y^_&9l㼳ҷܿ=H8 6lޘv φ@$,{^MErRG|^ңzYf/}g:q[ m=g 6n)^|oCKe=NٯJbvoha, x)h!eK`trlG|c smdۍx~a%;b((\Zw%#.؅ 7 FZvmߌ+]0] 2l|-GHVAr M'5Y C _Oyb s# ]8b-) DŽg8'mjۢxWohu_ τaZ{Yh+ƊTP`"grG{WETʗ7\JF+7epX-mMie&?16OՊeGM&Igh̨wv5JW`LL Z I\m횈}<21_2.7JN5[4O%2 <`D&`\L@2eN G,'ĝ Y0\;$B,x 9#f<IW@>}@'4kab/w:yC/SF$y2rVJ8x#o؂pkfUHO}'jT l:`1[}0k$"es-7cHeW[ynfhlffU|̅OBzgw|n~̲<s~VGyar>@16g?3%uoٓN/bN( 'V#&ƿ Y=y+`!Rص^G'w *D^ޣE~BU3poqfs(6p~Q2cV#j6<#e,Od)p5,Hq,$HD=)\6U4,k@q-jJAqa |" [9DzűTq&q})yaFeAZrJl &O,&n]Gc 3H;E(ntC΢!Y'>Ɏx9#>%s|M)^G-kEV[`xͱ,ثgJ/l}2'ʭr&_=Wʙ`~ IK+yx CLɝ5D }d$]JcWp0XYN#+m 5&ur|PHI.?IG2?zpI>yFGhԬ2vkB>bI'܊Z|6D g3v 0Ds&MD Zs~+JʺM Ů. f/݌fgA)m si9蔌c,)7glrRQ& C}-^5:KN{ [{` A]>_O' 얼ܓW!(-uXJѺv`22nԺ!qS8bݘ-@(biMI'7cx;~B0ӄseb\&sʕ͏E#%$t%kVRbפt!C@+兟!.o)0KzXRĒ&6̂g5m,cI7ՓN0/'M(IjbG6} Ŕ]T%0swq7"oP 3JSUO4h@u,^Hc=PĂӆ_QVTQ{i:6󧋃 3apLOO=BZv;<)@ g%D i#LYYZ֚{ik紞amGA)YLM*hi/Ή\Ea`Q=ЊgiČ4r4=zٰ.5%أuL ŠjLκ"ФGA&9[ O<(3DoLIQۊpM'6Ad5_*D'*u,Zd7 }m#u'i3{9d'F^?կ4wZ#CHXA>G@^&@KR~rzʏlz+]Tj捕ɜ31~Nnt2{o;߇'{{ГM6%H2HL1HrE3yr &?xދF:C kP4VZ voZ$豵?ߎJs>xh0bϷ%ќmMPbXPD2{&ϕeupˈA)x8MZʢrhX&!Pa|8d42I] T^ (̚elRo5B6ڍ Unj&f΀\eo#OV Oc+-v0㒉vC7([auR2"MwWL-ZCs˽Љ=8 #v̠d/#>om[O3,65[(6 OҌ+2`;묭@0xAsY3i:U25%UT1$HV8ͪxVDVNn@tGEl#:TQXPzJ ińͶ[V Ǝ,T,o  X"rS0W %S:i#OԌ3 ~3ԌǰYt<74Hi:mt:m _.,xҧT n2z+$Ҝ\%z觌+`HI!:~ggrI)sq'r@S*S;I8VFCl8o0Wj?=Ed0"q(XǐpP؆Y"Xb F I. Tn Jhk34P!g|{Hc|-ZgHOޠNVW]#Tz'L`>jyIT=%??+#nju̐_c{BeB9=4b}t鿿طj+?bRzjmŶpÐ~hCHĔIU/enŖa ⛋ `F"BOQ$e,jg6`D;!9Y,w&e̦ Cާ]= k)T2uϠʼnRޔu~‹Gӄ?8aR1TT)mVkNz峲G5+e dHUjKL`kYsߧ<#`0b ;~M h0}r.xuWnƟ1z(АOr(Й\qP[k(GF ({@i%>!5, jDQg1iض[ F܎WO22tQDO5Q#OI#یl!鸕mVgQg@O#]y4Zn` lp$f a}1+AgzpsmE$%’F, j3hBD‚2,+GP;_ALzu`荕EMJ+q[Q1 _w?2ˈ7[,YjNJRFs!3iYTA#>ƪ{+qˑqF<Kt^0`Ļ"dyer! !d-^cD8g|k?!h&Z-@WEu*Vh`hA>RExSS/m[p@槵]! m75^δ^/[r%C=̓ƌٙv[23 L]ݷ-Io}apCZI? `C3cCVaUGդʩ)|@{ :K f\*ֆN FQHx"l9ia#&"ۇNLIyVߌ;aPZc1a8bQXLBK ؕwc=9SO'E69WOb{G©b-Ss_WVZ^Hj'+6V8;aѓkG_NsWP"xi(<{, SD\/b׀?^Cwp*?uPk=eBTbQN3(v**,-wX.X+Z1|'|GT׎94&˳>؏a4V:ln_␺`mWGoteie)D"P5P˂˟1dJlBzp¤)3ˆi[BJ <sl0"ssss,J,rV!{aR\ t2R"2OCY"'=Ipo&uLJf%\K$j 8¹~tf^{E?{Jq^UP@+{08hk`G2avH4b !0\o΀ H & ,*8A[Gr=P )*5R[PNHۮzoĉ:VE?v!Qv%@?AZ9mkȔ35!F|}4R_? Xs?@6L8$vP/Dà lD K30-Ru&$Y m }gA;IF$8Q[HW@#BN";EOCNx7c"_184>qPaH1+1,O Sڊ~҃Z.>x ܠXBKfKc~0;&!Y b"Ixo}b,,C兕 ~pD oCO±'\;Gh qY]lGVb=GP/!PR^v&KpssDQZe般eyQlg͊Yv)!ňG*(SοiZ2)!qP8\}c eR Xp#]x|hۆ'փ_ɵQ`m.<M>lM.3]z[NyJ$Lgw>bBZ#EՁ+kT-#%+.7!$W 7[_CH-n`>5o,>~#]dQQ. c25B.`co []}!͸9js s3Z]25Y*5^ է3<ZKҿߙO P#u=\@vÓJ:lEbZsQ6qV׌ t 2_3H'Q3 3FpYDq%-<6"SrܳJ5JKEl9vn I":RB[gKs.@_I|rV} ^dc]mC&ܫ^Y<`]dn:>g6$;`U.5˰kʮ\Cڕőn{~`ۺ&DaiWYH PKC; FU^2pֆ!QpINdαi@޺};{K \r7+M#>b/F$1 6-*IL V/r;…f;Eͼ\(i%l)鐋rWӠWkrדm@ҩ6!>p2$iXXٕ]VL-q1$iG0pot3YNӞ@_2ľvN:p%51KSF%(fB<jm Xu@/ΐ KܐP~ݚ٬bE8 ,!:?e6`3.szvd?jUϲLj/#TKQKXhl&V!ʤע_ |,XW$3)θ`2-p9k " ìΈ'CxWؚ`' ժHGqG䠪NˆKD JCNB E_ py}Uc >f.%SX{eħ7(?gTINgJ݅svbKT)WBgN #R{+i*:]$4 9wl5L 5wlLsvO(:ZtX2sF|Q{Q{Q{Qy5oZ/V_j}6V쓦P~D ,ELxNں=,sE^+~S̙0F%+M9'f4+e,&f_ ԨѪcV#djaJ%̂b%\HMFͣc6VnŕY4TEJmbt7̥7[wl0g65xu/ }݋B_ƁjǑS#EQ ]Rx/`=`c3CP\4c#oؕ *k#jj%jש*O?N%a>pq=?B~)ێ4t@1hq`s `yH>> fG!Z]{*Y3aA[4٬B_ʨF) }?vd6Sƻ<вf\㪶qoDc>׎ZGWzZ|H=bwGwphEܗNtKs`1uh9mք1M@'V+&: >W?%cWg"0HF_pKpG\{xLʇ# aȚq' DZz t\dRӟr6r^t'-Ų9=މhA)]Դ]gu)ԍLNe9Z|vJ좖-mF.-Qa%j9]8ƅdDWtn3b#@>rջKэ]qvm􇴖X{ ˸(6)ڳ|"pozIco`⟱pߜeܳjo*]J< PgIhqi\XbZk^x%48p*RQL?jF.Ip"IS;haTttwD">r&Q,cB3il6i]:rb -)nH!v*cGgJ\.G^Jp_shD+˴[T+AuR lkӸtk5p"T-q{R2btܕuSX/^Ki֚#K6Ui:du9Qޥ&HQzF".Dr&[\J6+ґnP+ɘH,EW+]vYPJmt9DvZR.svZi+k(:L0>r \bh8O5^:+LF`בBJU0'"6 l"|T`mi0E' 2(i>+pb&#F?Wٝ(zG&K E= =D0i#f|6h.XbB#6?e c1b3# btf;oz5#j&{m)m'z RD$ztAW#*kNl;f\/ d/7> x[\3+!,j:hVXϊ̝L7s|7X&JIv%bsܜW?Y!9 kGQw8[֛k\0b*A[! o668U>ޱ𝕽kݍ a:1 ĉ5_IE;MDj5#+g-pYyz(هGpFu"B`CF τpNX>z|FsCܲ 6C=ɏr(=y~ڨ,7$9<3Jj- k2vO՟Y/(U`6ٍH`6 r%ț7+EzNIpE(3HP"Rr㏫2y GHd_\<>^U0fw\znܰJ4kFm,&~fC~mNXuF&kr/ MVu*j֪f>x_ȭ6 ɭY{av&{'aNVkLYNK Opg>t ?{pV'p?Xb yA`ØEapz61KVlI6m,/6#㦽ĝōp{s.ĎDV}V0s_D E!;֝|T .d  *;LdpGg&9*K:tL9G5<"ǽ$Z&9͆GLgZDRtV"t<8{aSǢLb< 5}eei7ed!Ec!OJpVƖ3pt=5{h!bMxdxrt3l{sE_Nh@RrKI KR.1}*{5WCIRozZA<$t0I&K]kpqDݎ6U5 2 VY`Aٯ"jl,+U`oI EAkjŅ+z^XE`^xNnwRp :gyއB`|LWv>yyo=?>A -ox]O.ktv۴/4vbAh{>]nPHϲhtU-dDᤑ7az6JdBR2b%9Z6=ޟZmE V2( #|SHպ(QthЈYLaTH:*kQgif"4XD ~b?FeL<7>\~^0 89>p2;mQtlJ9# J$`.aLJo|]Oz& D'3M[dotHK| Qޱ.p=6QFz0iM!wt`((;8*lWJq+&C׿XSK1o(1ã{3ߕ,|^ˎ8 2CC;\6;>tORS3Fo#iZغ63jwc{|Ï3ёgş {3rн=ݢ_cac/,|fs( ˖FZ:N90@#2 . j{?LKmRaʒ4ǹ8ƋMO pk;'9m0m,idIct4G[6Ɍ"tMY pkPGq/${9/d]Ykq='nD,¼>@㞌r@pm<}==Ks! t]enN}c-3^"V͎2WX~Y"aWh!@Z!J:#E܏7c.іa,{'UÞ6/ =hk`^djA5[lE~SV} X7UuO9}8_ΈW鼳\Sqe͊ nWXr؆D٬cCmik&5}O\7[ ȫDz@YRq8dQd9 e]|iMs.\_)fT74GtazkY=pN!"uĭs~ħ>= 5ᎇ>jBߘ .Kỻ[Χ0tI^쓚u0:pqO1Py5@1 \ xê,sXޅB>X]gGo#rw6ZD( 'wt{֬Ti RI:E^=L>ԴfC9*u3O+A'9+^G=޴?v}=س>5*Ē&d&Ǽ%SJ\Yinq^C.iʶ*iҶ2P|cJ"]Qp]quae}m2dI Oq8u֧=6sKS,R1E8Sƌ/3k\q3f]`dA/dY4$KYGv$K$gVB)./'|i"N*Kbo9Nsan#ݭ޶%J{[$ECT7n)'@"}d0bV~XXJXb BJq9lAo F>Y ෭orkˈfMMGdX]#vIaY0?LD31ųj{Arf1!3#zi?#psKgZQ8 X~7pn0b>'4fbG=cqBcSRD]d􎓖&ژ9HoL'z0{UC_n[xtRr)$@h?\~ȴ+v,+ !T}vv4!'l{J[Ψ@2DýIݪEګ/G:m&;(X\i"3m ` M"۷(Q'7ڲd[&8,-K'ŊMJ,MD͌GwbRV?(:JAY4T¸aI͇e'*n@kdE+fwzchZ !^b!f0Rr" ,zHKδ}GD1ϣ>+fO#~o0}7{I;1x .3Aq!`v@0) B~=d- ?ڪ[LW43:d)j@B8OBIߧkqG "%$U^lZ&_K+V"^CH"_,Kw 3Ŕ#@rȍ$jߵzARZh:݌=utsO 85*z J]pm dqC )MPvsôMiNMWS1p2(IŵbhMij' 0lȾ[|_Y %C8<3QntzSXQ;s-;ܷܼ߿oOQ~ڃ[Q;֊x&.UoZŅE\/Qd(z$|HqM: [(:9\;/ZUJowZmE5'6UZQ:j+*T"S7#(%{(Dl6\KJ+K  浯 FAx5kd߿+>bԍ F&Bo<0sD#w6('MSWr!4%չ*V rְUTjEf\\mÃԠx@sYre(T?:Mͨ@³@QMx#tYEq =Aۑ3!.'@@<Da&*PsjU}TbfHo*dz .#rP͹4=)yLufDccƥ]T ?+FȚ-a$c ܤi22I޵b4k1"TtL`0+f\M]sccG41L )[G;^q4jU{Sv8̶cbvfVln);M46+*nl֠ g]TV!K%KѺͨ<+E.dÍڌں 6&Q¡ Q 6ɒݲrR3UI@jFaEV#C,d*A6=1jP6niӮOopO(wWb]iY6Ś&O򊷾e6Ԩ*>{)d3 <m{;_%;5TO_쐃;SO#:!0j\mGL3[q*}W@UPݾ~* ݛRv?{k4k7`-Fgl4c['Sl q(Txf3k'iO:RNj7ѦfEkxq8wyvO]\$-2ou.31Af.|2ouEkҴ6zYLSeM-cr|]>{L7y!هᚏ49GYԪ|y ;2sFN>w{wIyШaj <N;qVz+n#@7x8U'ڑGrc:u#*(3:7,ߘxl/3uSHXif޼fx]Ļ3rxdw4||3|Nlfre]1ÿ__> ?^>h4{׽!zg{=3`L0*N7e-g2QM {S.K֓O]jl훹v/ g;s+˨XHp>Ggg)_se{μg/`1znz@Ս!Fi1V5!جrivOZt.3 a`4,x6 %HiZZs\ՁTA|B7߿ThӸܦDn$I8d.=u_ ̈f P|<78iFN+v0 ͂,4_(7I# b@Yii[h|q5ӭDލ/@VC@)yuEpAG} ;ܛSGl爭T'H.2wEuLnf=Rw/Y۳|Y3 ,srfh /+3xrsɝIAqՌˉ[?;f"l[Ӌ??S欴kgF+b'ǃe3 >_!᳓ɶ3⟚ w7U3ٱ=kb\ *XWB+]xwcl] s/_&|0SKLUcNsRFQ=#I"\A3pW6oWh`$:;c8sU_;|8%ěɏ͛= YȐNyu |PNQa)3FXbD7Mw ټ^g;íqB_:^n*#'g548J˔܅)qq|N/ Hi`fl7LJs'p487Q=)X ^G<7_U7 ZlWV u6coMRsfu(=nc*SblCR\` ZThEZ78&C\3éd2=`og4R%;n|Hg<Ć@<"P3X#UN1#c%^;.~LhԮt^hvU juKy~F#uQ[zzE"cI>O17͕e\G (:MϏX-:cH~zV賁6 ~ ڑQ0W1"C1;!J$(41pvάb_5Q=l>g#H{jXyGƜ%UWN;(T BibŢ>;ΘSfjR)*y<;Ikba;ב㝘x cb8bL:ױdVח+.沐^Z<;h;R.!\Gyuo%NY0-kEV.ɹ|{\zYBRl.t;mUsk7oh_pm(ogpq#mC:]pET 5*5QyRfT78}x=ػs=ŪwܫR3ɰRW:KUNhw3vTk5 7J47DwHt$cpLvGZ8XEF UIֆUDifNKTaQ}g]]xڕRwb&QA^q~_dPGE 2"<2-Umڥh=ZQP{WVPJNڽՆ;Ak(i4Ycx5QC'8{uL[ͨ~Oe$b#wsswOUPD/ɪy%3M}*-=T5.9*G~CCPpKJl咰R_!_!mT{1ѤڀF0c3] {&tG*5(1T'Yg#+~+43@ìAJ:*5-E}\s !s{{h{OJ|Xʛ~&7GVgkx@VucGu*/v4lL1FNvFW2NyZq3gɴHѫǸ$xAǸ֪;z5 OH*+ʻ3_辭e\hvwǔ O_BH..жNW3/uxߤ=sSwܷ_C<]Zw:|~Axҍ6  ;FPwntWZPhY Ӷȴ^ ~>7,#|x3HLΰ1e;6)MdgSnɞ:S2Kl>sr:o)f8YROYdw; !*^bz72J/tr=e3#}q"%6t RV1ת0[X*\s$l*MhvQ=oh_ݖ)2:'S66{oQ޳1v`#?cYg'S%PTK 8_VP |3XsxB[Hĵp)/+p SLyE|/b6=/<>jmbCR9N ("_9t"2TY6 8'4M BZPOMI쓖@~dNgVuN0K<^exS]y]ٟ&'K-4MS&&E3ҧ'.nʔs)}_ "U!ㄶ=Rӓ%RS:WI<9׶{~;`/xjǛ=Vи?ڹ#<,-S3v{G;go.;n6aH҆ZX/6  .$sw{BU|uJ([y!eTø 1n/.;(̤ؑA:# [RQeȟ:7cF؀>-(;v{[%5$df[IgW4WoK,jPVJuq lQ66VTim8>SlkmFGo|TYmh f._Q#.S+99_bF%v>>3z'~9+3z.l$,zwYىFHss6h=-hJ5>@1b0sEZdppdM&k왡atŵ፸0D@`YΠb[׉&$Yuitʸ7 ҞOOy LwN \ uL}~-j7H܅Yb;saݵ;!慯աEe.ܵEhxܣKuhr#yr9vmgMԡU1Ez23LAxݗ=.x-e%Wjbҕ*v9j፤\%k$%6gY4wO E<  H=$Y6 qe*4:K蜤҂iq2 mNX^ &6V63SYe[v~l OUWC\Ԟݫ#V6PGیNZ5N#;1!#bYʄϹX= ھy3OKj5gҊSY 4N]

W@7PɭglDq|=xGtՋr+=SKzײڸobDB 1^Gҟu𥏋v[קw8~I!4cM7oDjs,T`];>I&&n&4Ҏ3$^X|ѾO+bW(o>̬Ҙ~f+SX.w7}GKwŀ25mRR'-vxG|yGw?OaQeYAQ, o"@cgKg%h$[*  W`^9@J0ajp((:f1d0 ,u^¤7H'@-^؟\Ѱ6AxSdgy3组 33SK(HDz)mL[ aDVcïދՃcM+o=i9tV(dM Ldf?k@t#}.i`IOb6rbx;-;n*3`p2ݢ}.`H4 "-$/d’l΅d].Uv&(S{D2B6RE$8}^u]P/>?$KS/Uv 2W|i*5cd&0YX.uc(X =0*W徫[%SI  ++[-$Ue*o$ )fk4:xNqsRQR_8d5QjZKle6$srј}#XA8xs%J\$(15d]6u0 /}F[QL_\"ڝ[B(^9>ߡxwΒHMF@f-g%HAK80]`t7b p@E)*AAKL'A 4@ YM ,N i o E[= x ysęi !y4[4d 3!.eY;7wG{%_'ߓOS9d1QB2nB.%tχΫ˟z_ QYl+{̀c/{ȉ=zlOW-)eedI֤B̊grVMiaZ%*2,M@*h Ӌ̼T2JHW,LߋbG_' D@sw=ܫ ؇_ߵ5}+@QܵŝE7}iȞ^,BW$D})PNhn"ex>\ tR+7_1ƙ r&,fR&,d2&H=t$_;?=~#C]TZK]j$-ku;rR(EGi^r·S#Nm3rJ{UJW'*I{b[{sh]ϵcōPt1ah|s_*ǀqRHOY3#v`lQ3rMX7Wv*q@ yd#KF9z&iՍFgȕ7D"1q[Z!'$vI+#x0e.1 躯݀ד|-p$r &_Sa&kT/`L3.?Mu u.,ڮc->\:8c}jKΏ?qGWG. {s?rV\8}.R/}tC͐@QCNNDio:ڒR A8V\>LzT ﵻ1*ظ0g1:b-QՋ{g5V,{YuW/e*=Lb=[<sK=Ѝm1;D4'5kV_}J3_"'"ODR#y###;jo/㎣3cO wUdZi$c{ G8(x`My^. xÑ "R!FND)>mE5:R<2:QXy B^t]-"Trooܢf2NQL io+lT^ղ-jVj:)A}QU!y=ri'2{,AŃh,r0p3סzFou1oc=뼱~zzP2VoNnesU6ӝ]NH=(Ш8u'cg#|١^/;!zc@A5”,&1L@ǡaH {QF},($͍ݷ;^.uǫ=Fs|'K+ƳFFc* JNfCS .7 .Q'j͢ ɪ) B*)V/)q(*ӿ#;US=t4աm(duIcNZG5d͓R}x7y׽k'N$&#~0(xV)uEj~fεBZr:F6jֈ.b%GZoy}Nq{#w˝JKcJp [հ[k+f0VZb!kCV"FLb_bfz>OM`^ MP 6 Bn`Rr_ |Kr@h'wr[{G!jV~gZQs~$?Bpke(`E6郫QB6cZ޾ӏvK>!A(#]`@eq]>̝|u ho'/4λ Z),Xw9H^iucN%tSn o! !݃'=qߢ#HG<.UBh$RP\zL_Uī/?I(*=Pbo+vĺo"K$O_YwHnun`{}Ryc (L8az *`ox/T<m7KV6MB7*#|"3:l{q w:IXyrrj[ uZaRACVS0䐳8,5ROb c:HP! {Qlᤇj`SR|PNx"cIb5CV#('?*PWO #)ZK)R\"|^Fzq=XI|^{L1>̨[zύn<7&mbκz7SҦ62ô oJeD TB+HP`wc{p׏^@2P3@/'-=6oV_o3pQP_xGIWIJ;tmw+Wy("]Y W?Il8" pp*D{CrI4\F,bYZM`iJW +M]q VGZ3 JL)GP`6A(daR e~:Ҙ Yx"oF||ۀaTa.kU|5mWW3XrM.Um!.N0.5aG(D!^^\ }eK~u 0.]zunv }SfdUPfg6d\2yeL ~eESǍl>9C=R,Wǜ~C;KҰ&m;]\ cg'woǝWH 2_7H)f>QN?SxcOJj qGX1 z2 U,չx7 w3V,ڰ޳% fš(!KTW `ʌ7 _vcMn[$> Jq189͵dGMsRQKՖ2T1.uW:]t#ƍPd=%Bnb͈b>jur)Qx`DQmnFȚ9")c񉎥&@^īO~-(򖱒'Y Vf\@GM|]=.遶W8 8WPr('eX4C*؇g8 Ʃ>!tͦ,Y6A*=xg+=vSӓwN-AcCL?f Ϛex,\5Bf8ny  ӓڃvH+:5Uj>r 1xLVș }O 4,DpaZ')5&$ÆKu%9e+͜suKs`'l.aQ6Lb3e3\,xrNWjԱrV 4ˆ_6,_'r/dqLHV}m*{㼐JaZ'K8>!ꍟоU!ux>(f!>AsBwBE*%Ui!FJth X%G&~(PO8cu- 5//S+Dp"ϜafBlHDMgOz'mi)Os#! |=|}Hfw?qJG_D*,$:d%T!Qٹ9uBu0pB !GH@ߐV#>qWh)EtȫxI-qK[?#j$@@)LČRqR#Y6񬷝]M2܄5,pX1f q,%!u D$KEHH@9PdZ^F*s༡ӃNs.ѕԪ\UOD\=Ra& %UV$)^XB bL"o4QVӮ"d>fJlVQslwZƥEdTg>6٤]JM>Acm}n)Z Yhěj\-TXHDB^¬)ڲl^5LTa25`F<[*Qq˩\@]5sCUX2hCH4Û̀@0`r\TCAZҲ{,EeTKS]9_㱗eQօi0PFNq, R2x&V693 Q047S̮(M*BR*w&=vRy* n5Z > +^.TIXWgxdrd >0ҁN{fJ <`pgQu5b@Q9uţ?}Z̟>e>2Qtf>128jF[SaЖ{\2w9WW+/c!X+ P *B%ت ܯ*'JS]{Oך>e \~'p \~\k w+x;};T*%qB([73FraaF΢Ƞ H\**p sfo-^SBJJ?B4 ;.;fVEP(94FJB-Wl:w..Pz@^3u"nV%ʄq F0_q֕_J鸢I;TV%j_ҮkiR޶[_k& ( mj\dG/<9[#c~}&)|8Umw jƞU 0d稄(x%d`րXnrQux`q %d6p<4)jxf08tƫ&A))_WE ;}ǧ gAB]u׶'h PpO4瓊u=MaBҡS\ Pa;'D._Clnqs=s#Hv0<vs/xmnJ"*Zg =n, irAJSSjP*Fb $-oQ iG$ ;VtstkTJS' N2L[/_NݹK=!zUۅzY6g$C7:kx LJa2#Sքl;gDwnhyա],`^H}uvT3, ~܂9]h=_$Y uoȘIWsw*J:yȭ_e.(ez\2 Oe-3]cY0 O5FQuϮyYMBpNZĮ{F# -rWI2ӸVj֕ByULY.= QV]On;R; j7\e:Tv&w Nz-^Ϯ^kk|<1%<=)1bZ1^XTx:H!ͣDZ4ܝy0 g`bp=$$8 !WHnMeZ5Eb 84N)!Dv d>ziI6XƟD%a_֫ QZ]2i@n?/9x5 .K)H24DRkR W뫻p't34SIXVZu!|ajt᫋ےEgΊC 6do|g>1>k- &u 8_|@x_$ƗiI lw,s!tm Tf"SΆ˽ ^GpLO,l PlsJ#JJ|,4xu@k6*NR=&v(z}`t&t)Z25e}\drOs`B޺bVӉW]WՑHP VpZIv'y.3;\~ӑb䟫jI>%$G2^ Wop,/K²"+[!Y s*+YjqqLi ۥCB@"q3՝TCvD$, >=pP Qnurq??tU|# y)'J(Y&++INu31AsLb#){c_k[w}S/C3H[c1Y $X'P.7H0HM@L)o+52޽!ibdGi(F1Ѭt@)o LQW%8u F"3K1$"=ҾXMy9.TrsO<7sy|/w)S:d)J +fǑ5e" v$kz*yusꧠs1K 0gܵsvҝ!`dVHV\C,$ Upm^Z֟jgRh21O3:g2,chm'%+EZS=b#U]!gW\=ouZq|VʵI}W|}P5?cC;C퀙*L㇝?((%ԃTOԿaYI#9 gta|m&÷h؉EV "5fw'nMuekܠϞUP =et')UƂTl)&aWB[f*jlQb3l#Og>cݿ~2-Il> o-_im?@F&Px(УO@\/AGx:堡G U-kVOO~ 9X)eOPD1R~~Gx6\Yqo)K4!"/fZZ2#3b%Kveq,onO%)HKy'Q2 umJ?qU }ql{&=ag[yRe}÷wo@4 !Њ^0)f6R4 TP  KS* w)g{0}!`-D5fii ,LuuNgtbx@}sRXy;sqTX=WUqg/ :`P;ܑr'{ٵ}^{U#k{t,c/6ઓ;t |tN Zi 馵Tܗ{vJ\nGЂ4 < xgs~8bW=6ơΟ6, -={rgl^ؑDZGRz~Y?v Ÿ؎Pq$IuTooUyp{id._1OBAIJSV5FiZ2HR#e*uSb6(-#yۿQ$o`4w@nu PnlBgP7ʲDY\yNo AWe0b4ɲBv_Ӫ& 54M=@"69;v܊?߰ 6B3[*{ADx#qWAA`ū(?3BV¸&^Kkqz4 ?Kk/Vɀ-*v6.+,ۨ!r[4>ʟڽ:)/Wf{^z<,5KI*gc` hE6]ۓ_ÖّLYQgE Gd<tjV~pf&Np:B|g<b͒J']9,TENxez Wg8D3 uJsp4I *蜷('ɄՐD UY4m42ijkJƘ^D&_7d3U!QRXl!3!=!ɐHPurzmnpuf"t&{຦>l ݊=zxaN~=Gpm$ξoS]@*<(N<M4ΜZLS5U2Q赐{. MRf&$wuqv{B>ZHDqD%ӑ"O~r-$77=(odjU'm$|ˍyVh?*O$؋pIk! }~pUQќ dΌ2*wrrS |Y;,d5A)켧{+'S0^Wo.Y6l&*N7njV閵3o\5SA3)N_a+#DGVC;P'ST LW;LȽU2o&3o ^of,y4sQEj꣐nK"J`2q>guǻC)L`R`)L 0ԀT/2:7ǡZl#0nWøH@O pB+d/)w "V}S3Cp o\":CtG SՉV!1Q\lh;Z-RS㤸]{zslh"zuJTi9B=頲=:Z-1$ɍ"A]dGg&1 A`ĩV@5 rh (fwg2I?1>4cGuS*TԣfToRE4(EP%[A\js`WsF (wYX;0,gm^Qdb'T@C&D*I:I0-%JPNP3"8╶$W\@ QR-QM\oؓtbޱ7sMHe4tȦqQ14xIZ#Wrٙ;d$AZ "a!8Ɖ#2Ӈ{' V tpm4&Ҷf㶕BOjrzζҺwx?FV=_4Y]hKQƊ Z6e|g[֒rcKkoD(_]_wo<;z4z/tsCx!Ǩ*7߅滤$fʧ  #*(l fZ}9mqb[J[6WckcB=Z/Z[r9˔`6Rsz[_i{`LouLu_oG] lX/hȁo@ 1&W!|]%YT%zŒ?-y|>fD-2d,9 Tp0~o2ha0RXu u hoTzIu̍E\ϭ;*^vN2b=HjORG[bJ-6lZ- *bRX.@$Kg,WbCmK?dIAS0h. Z[-xZE*r^: s EV @1` lT%00HԌxL U$H+BJ)pB =|nI'>1X>I['I9G|&MƆm0FГQ]Wޚ/cp5u;]?Zp=ɤm?BpItfRYBn3 [Kn9}u>Ug^;`-bBoo@j$h&f2/XYĚMztE֧wlS*Ld>?#{@<'|PME3u.d>lڎ EN$9D$q҃5 ɋd=Ӈ 5=ХzFg4JZ{)NaS9B| }KvGvfM|z;/d!8QQ\vm{|́l=aqac4 Z5l8FqK8#8&MA+EVwp WŢE6^YSiNmBu+ `)U ˼H&Y3|!nf9{Ya8z|erRSI+ns(;VʧH8wXǂTS}6X\5H[HheU}V}\kvOm%t~VuQ>;6.7Ū.!WɎEFzF̀1dIb^@$x* Ivyw5 <k<&X?wB1f1ıi6-y'whnvFiXR{(!_bwC<}XPv2ġՋ)Sh{K54l!KF`D{Ӟ}A'ub!\㿟HH%) 80H]7";bdHWAH6<d*g|Ů(r$vO x  mWn0WfV(/DIX~24=\(c#\8UtS{.T*C39V͡'P>×X|.K>cdv] P~ 0怦Tf)0SnaU3r `Ŏ4%E7^^:lF_fCvͽw:@~w^zr*^v2@aUȢ3"+"x*q7Oðrxo9c^ O`OB\'@P"Wt.Z{mޗWt5煴Uİj ϤV'ΜXOz2˓ ≀Uz!)9t>-RFn$MjVDNj6qHM:ٱ+mb~3'mqiS4k!mWYWsӟ*[u hOg9  5㔞'f4c5b^'#c~.Ɯ4FIOg(ű &fXEg I S뱩7C<`b;Yy&X9)F1rX*Gv۹BBjZ=qz8ݔSyٕѵpѪ_ ]r•գ'L:cذ"WqՅndr S{2?3.+yJcr߀ns?n?c󗏍0 tx֥SMԤ79UOtR39 @I2Fv(p.u'cd%FU`lIU6`g(RɅ&(RUH0JTBeu! *6 :AHq-_c  _׌d04k 䚍 w6 WY19A7ق[q:RWd8/VrYiT:uJ+ߴOj5xOg7q@rraliW\B[:iw^iGyP7}?=hZ&|1 (Iٜ0*5M,7Ek0ٳ1=WѲ=_QRB^N(^B,+4ū mF0C %dD1udS&dmڕأZ_w?+J4?+J45+k3Fn+w篢ӟ\dž6Wb8VƱJ>7U -DL0kFw ɻhX__rC &|E;SP3zWƒ+9}yމ6$Bg;?! ֒ZK5jX t 0똧«@XJ(p;QY9pjEt|U} ?W(;*wVq_#\~ohាI5UxL{]#5w 0j? l&6ᗓ WK88?}Q3l<]+^[&5?G榡 b(r>DRlEA4/wfd  8gQ@/Hψn53N9zt!l1^"OUxzD1zGM1"5ycd%ԛ@6F8qμ@H@RE<ʕ:qu#Fr\cڿ|՟oίKVw5JZV;Xq ?Ú̦(Ɇ(ءH`(Q1BxdYdF UQ9pJ%Qh#lij]{u"{WIcM 3|~אUd _tbc,`To(r(:iݨ>s6|(w%K#"yc0*Ũw-9_vN Qݳ,tz@7vp:/j8 <;]"ZqlIg򇢃d+qׂܴ6Hf!(w/-J: :qc r8JύF;3fs)#'Z&Jg_r'&9]V ׮NYV{hO^!C:/XBX" Q^KQN(F(89Ej<_qy'X\W-YtݝøR,3;a縖cREQecyHgѓ/WHRX4N&>Խ6unͰ,an&\f{;*|Sf M{5|ײ-_xu7)Dkr;ci<6с+W',t|YsH=lr.Tk=¹o66۾\ݟ}uMdvyvzfANVןA8ۭYL7U, TEOq8>8S1S~ 5nV^hO?<ρY+cw.h^^1dto^o ~f.tjn҇^t'#tsT4.[꽫0w.Ai9_ʙҺW"^mjPkVk%65?GJ{/$q `EnQ-~6uO;ij>yY=/uTuTϫoɞ\ԽU)|{ B;SdDwɂU.䓞+7gOʎy"+e&07t (d !-@`{LX7zesKY R.YBP{Ŧ r~>VY>a#$)%Q%LF5CL﫞ICqsΚ!}8-~n+}txӏlO6UɅǺD~?w`_xW.oCfƸ>6%}thO0_M<[7z!g% !pҙ кx\wrbՆɺ}K2U[^ltMhEc|uaW\];j~Smh!pʍ0˗oqzlaIgHf{};]3K v<ǻe5~3oż7ƳJ#hr_|m_m>M⯸-$MeLɚ{i'{};4N:_rE;bp imq^ІMS7!?cȿא 5C`%2}mDbCs S~qcT@N%a,c9B*`c,7c_&0>韂>xn ->T|#/@T{" 3({ W&&3HF9} xL50lY"x3'Ѳ ۳@fM>Vcqƨzb+6M tN`ӳ-)e߿tiI+<0m ̱G_.hƖkbG:! %67V}fEfֺK&gk9A|ͼّY2^= eVsΤ 8q@if"vI %b8\ݯWIfIm6!6KۄK @.ނNh4%OIޅ E(e${s1R$QJ3#W s¦.j"m&qi o:'C@JLBKA`;$,)VJd^op\7fjV2/Ҧ56fӲͭ'kuuhW^YVcGa`KYq=S[Ny`iy>()kb`|Yt-'϶~dmwm G0^@a Y]벖Oi {E6O VJvʣh-$1M1!a;[y{{vRc΅LVr|8%R&urc$dǴzD:H KNm&ނ,Za 3Sg;e_x$:H"ͼ/D+{Ȓ+.x-qw5W4Weⵛ95yJi 3ٳ'y5I,pk5[ t8?"I (-iΠxUU0w;@֙4 f~u{5=on5AAs':mi~ͦY!@mVDJעYUd F O'TRnsHd2X$pDӕ<͓OCLmiffT0óBzLN-*rz5)=1=+/EeIKE} P&DQ(8(@ܠ!'w'3ȉ:2’uɘ 6m`n+h-_7\fi$6.7XQfx=vGf-ɔ3'ɉq%)iG`|c7o&%{̴A<]Ǽ[4C;,bN6=܀vZoԈHJ{˫CP2B◺0pplB??)+o*qRX7!\_6>n@/azcaˁʼ}ץꛥkR퀿/=ƕ wNp /p`[/ ӸK;e*2{K_#R) .Oxg2ST9[^pp1a` @|d\  T89;f2TF}%ҞBsU>%硫YhɲdUf[Mr +iL*@Xo K $gBY- k%3<ݾך,c:dIut{nn@IsĥoRʎ,tq3.qǕ>!.m`㚻\wC\ӓ&'}-1o͞ MdS/q-kI"gw;mvYY]|CZ8 WI$n,^y>=u]w9)HQGK:Zq&RǟgZ9+z `]0&")ZY_WƑ|"uO$|B8PTLzDRRh:$fFē땹.W"~Ŕ:7W40>TᘯLe6;ZlZ04H|}3$\vwRfDN8qN.RV€ԙiu[8xD֌njZDNw(Fs.ݰ,?)с4q-PO駦&,w{STc/}:oxcY)+O9A\۾ħÎ_M=IMn ujy7!'CHX\fݗJ1\iuQu0U2Hax)rG\ef. 7ٿ-hcR?%r ;Q`i|nwY+̑C!h>C~ύ e "fSDL<֩<+O4ys! ΒbdN>nQOL~%WgO<=dq_@ElG (3eO]>6j#qbv4,$ޑEViܡ6Ғ 92AF6L}إcUr߫lŬ0'nbH=(Q+:yM<+[*',I! JeTJCm%9f.C9s>~$;/s$V ͷ1LHί3 0Bб cdg+-btDޝz{&@4A?ԄXp"ueu>q!Z۫mt͡>dR^}s"<a&Bxaî^"cbG&@&q2RvI"ȸ_P' _ E_1ҍ*c~_T,QR`6]y='|R?P<"=f}َ_K!8@NOdA2SR)޶ŮC0J5kPq^Qɩh>SJƺI.ɐPbX M|c^d"R~C*g,Mn+>؅$Ǯw 9*FVa<2 3G)c|q @yfgbv8gjzi dޘ `˒mɴy\.~l| xsb;% }ٸwAJk&g3,,|%E1&Q4Śt;nJK3#pﳙ+V܀ƚj S6Ҙtn5TLVKnfLq=wm^svEkҴN>93Īo1 l:l}C9b ܛx,Vu@C2H~vXv^gh Æ)|A_d(hhH.X!L)BUr!r'(ٗ,=6m&:06dѱg~F/v@Tw! g%)5?< =>$3OhͰ?z + /Ό!3/̨ǚ'ý[=cbĆbZ0~Qx1!1yeZ q Uvtyҕ }%X`L, 9k  #4 8asb[ ѭf#1Ʊ\i҃bс-g4pÙջx!cJ#8A qԹ`ƶb00qp^-~ZW /v?~7^Qgn?|gt% bA Z!FPH6mHtP ~81i 2%؅(A:F F[qMn>stream ѰWOj`8Ӻ|fQ4A|uP~g4|ZOt–QM,Ƙ5Fa^Hx1G@-1iX@oJ}wc yT# 6 ie[UYzu\U9Ua9 wKr8}ZG H>LԱb,P\.ѭ81ug4+c|5FDg"V(+ī&xeC/B!|7E'\ e@tjMj}c5ρ,jbF%%ňCcxz+~4gn6lq^gΩQv()~IɘXKiRQ/SYt :~]Z!r1n 1'ƪg@tBWL@.qa "C"MB_Qq%!a<`0F㭣a0#B" oDy{F& a؈Wb`F0\@Wb-Ȑ][W$.R֟HkCZ'l,,yoX!-51= 3eU[=3E@u_@CC2A*e"Ʀu|R9nW}K~kQF-ƈ_mJ# co_M ciGtqLq?Fe;A<>$ȶ.+$fR*818tŒ,Dt8t1H}0DrfvfpS'隷$H%:;YrKIھu|d]j9\ǒ z9a!ǮOxkrI SE7#.G*;+RuGuuvB@,! hՆ*fk ̽f`oAr=bWAE| ]Dngqyدr O]܏`Q ZDV7y7WKɠd/X'zg`K'_YX#}! LDF%Ϊ^v?u w,=vر3AÌK#"d Dn*k>L TҪhnI-uM$RI vgOp(shKf-MXPlG5;6,'"5ai5bVRXkXɅ=wwKʘ*P/,#8QYܸ +!aVn7fF3fm8zPEyۙZQ/i;\ \a~P' \P.%t%7Jmwn;ޤY>Q\?$MQ6IzDgcGRmXN_0mV`I* E E eT5 34M8VcUX)Ii?Nr:0逓k, 6x5kB&odQRD)ƌZM-PQ٘X l|QĎ#1hմWcX(wQDs'If)8V[_(j#Dφܑɉfc%bLKHZX[ ȿmu,`Iy9R^Q&MG",a)eT0ҳ=-ָT)RC0$ֆYMS f%%GЃ`by.) $hbemU&",f\D%rQ1KIƼѼFL,+X90Y53is1 sҗ#0b:m.aD46{^ x6geszcSgPЉa"W@S,?E 1͉.kc%lUĖelC)XoʖdÆۂd-(Z*kTWHNNy0,/W_rxE ؠM"Jۦ$;]nV! OD[nt=ʤE#e I\Q d)%qUJĊ<,RqG {S[ؼL%]Եjjh)QYhh`IXE[ FѥR)Sa:-v%:*rtvUUVSasVK.1:hFMtlɎ!~Hs I ^Jcz0m V6 @bB1C;0PѢD!s?ǚNVNawzqudU>!Ư`|~H|,]BC&N27磘[M=6&R:c;]AK@.ȔؾjŦy!AvTKyOWY?o*!+f2e{%D]]ܺӱgc3sR#Hƀ"X!ե ukw0ӳ{6cڳI}<@ jly: E+%rU| H;(reDÌ CaV݈۽9gx{{NZN"֝ßtVz\A(irw''fr+笜gǩ=FhËZ:5@CWpp:3ݡɑGRooĵ+IA kEAv3-kƩB \b$"/$+JV׾G #b)1bZ.#O2E'ڨY!gN/TMB_<- `lH5TP}<|<S̾{8. RH@`x$pwID!>mO|{5˷{FӢ|"ȎL 9 M0U\*@F*AG D3'L<:SsψB9_/:A}(Xk&ʁKd=||wWCyUdsx)])3)N\ *kALf,|+][NWKZુ^qL@ n?D(:l=}|Ƥn iOX%m S{4C**h[-M;!H=wώ[BH>;ޙk v)dώwB;P"P/{(Y\ 85a8kMmŹ͎L $$ >|D-hDT'0c̺/Sj)\c9T>]CPqݛ=8= l1_ 9,O{%L-h: 9`ޱBNϯ)Ԩ(fYrx,c6ߧ݉&X\K*eOr~;e;mKƸvWaE! +oL=X4al`h *Bv;RӮO|%&Kɪ(G4.TvEXf;eʷ#O#J yh*s5IkԕlGIufh#M@"nȵl8FW &_;jUxw8(O.,~எE[!<'$xO.ܿ^q1yd0")k;UFh)iO<۸-)75,=4lhVA8FB&iB5`Q{D38p4BQ,} FvmF; .m3H gPz:&] ]u%k^&t)=r>/]8/=jrZ}@j` )rrJqxtރfS7@fh0u1GLU9e65zvިO AU'Pޭ(-|GYZJ#7ew$־™>hO'&}L; f\K_~AgcOG1YtFK?]EOu*d(E.<2 l6܁IQX,0n3RZ%nشמk>kRX:($!rlW:CL$G`<)"۠JqQ8ֵ]}vBp$v /($1ll2Q)G61@ .E JlۑF%ƕ[6gq>71d ıX^ OFAfBيoEpX3PRb6ۿ`yb&ZvscO$dZ8g 5'Vqb/2imb2 Z6zHA=T&@JB[Cu,!Q k0jJh~FVzx6Hha_yDc%QIT h$̈ϼ [Z=8MDl(OG񵟬^XsI3C>FZ*HeܛW'zȚ WCTФ'-E狈YI q =Q!K낊" ]LWA#5F$jZbg!o(T`flM?݁xO\Vje֫NG uf~vUz>{l0k?_ȔAxǟ4?R'RA}(^ G|ȒE(n!'3:VkZv~p껹{=])X t xP,H$Bˀ Ѡ $APk"@*eODގDE[t>$yԄu8,"3IƘ$oӒɎ]ChtL˜8Za2,+̽S2C9͝: ]E7+GkXK8$*z;zC"N6ڊP/Fp,7Ʒ'<N2R}fƒ9S6XHݭf,(R |g4#sxI3:_?_drÀxj@f_FS;*~7O|gbLvu$3a~5Q}gK3?3c )J1N_OيcC5aVIz~KgPPWIϞ )&=4FLQ>ze`gP6ٹu+|^'}`'h~75B=vK|Ζ";5eyPe˻&r%ti<>܄!jpj w: 4mS%&deGdi('K#Tw]>+c|+i<}K6GS`[H.pIP|lno|,"]+9pi#\ZbHk!afRAq.D*j9 X(J@)ht]ֱ7%.8Ũ ݨ zatT(E'd]>AJ0ubr`bCa26HKtX {XyS >^p)E"._B\n@ X)j}!&=cQޠErUq^Q8Zb8hÙ 6%! z{73;$gn]_~eC-JT$m[Ew];+,}34՟|wFɊqsHn%A'\ȵl#U{R;+QTS@ (%i7 @gȟ#kq+\z? {DNpo1@fNRNT.Hsx "k |m.#|xG3zG I% !ϡW0S17Z-ۦ--IJ{ה fXċ1` baAs8R;p(7j[[;@kAB uRbhvFUfT_*aݩ"IM2.<e1ՁO(y!mpuʸ!oZ;``.gY5)Dkf Τ{ɌםJjR8Jt^zL**vjV6mE"u$}5 J͈}\ ic:UUR&}33ʛq*uәX*#9N M%is 8(<+QƐ0+I!~w\s^"Yup`C@w\B$(HU0Ju°AL Z+k[cxf4/- 7lĥG8ƨdndgLɊo.>ͅWVOSDS祃ϸu*c4+-.΢oMcLo$ C5p[hhtS8ObQ8b8I] 5~gwz?TJd,CH-Qj bIw>NL =USG'UBGp럆rUHP{drlv8&*\)d&.Z:ͦw"+yNRA"7IHgĦZ4>h@%ў"=n-k". XÒ/-S?1QjFU_ԿUYZ u=onTYoOG)kvT&$\$lTxuv<,p(y] 0l71H kM]nktp_8XM +A*~;_:7aF}l T̥8)fcN@S>0wj˚ڱhN + F9v&XVeިa{ԬK/ 1l"n~*b e,({![F*pQ-b&MnqԨِnt[zbӭ4{_O`|x2cf瓍L GQd~u 50#xOͰÄAfc!ME&>5zafhV~c#OuFQ4`%ͺч`7Jo G=DP id@ ņf-Eߕ XEc<0FmDo)z׵*㙅τ6@ q #;24JvLnBGhO9/.*^HKk)s,?BUkU"x(OPCr8\>wB xPۏH`Zv֎<V]@6/; 7C-f{z߇)7tTvA9%!`5a(JH `ȳ͊сD@ V)@^P1}i@Q_ -+ItSqJe^XܠJ}NJ` cާ'RIHyDvVF_m@ڠB qQc22:b= V FxU#KoIz< %B,= :J:2!e8CD6X!x+uǮ"TW-b+0 ZX!  $Bag2s)>y;_6P܌w F8]z\m }'1M x >y $0apw׀&4}+@䁮e{@Q !pKgX 0f>2@ƫ뻕_ީb`qLp1IOR_@G' ٢͉cWc-^x7$ ^{qu!VkFܔhQZ²Lv I0AчrmqDS؈ [wt(vj w5 e-%3aj)5ĨlRARxsDN<@4[mRNFY3#1-)?W Ox^8OdP>( 9|&UNr?07m.͝Kz.C[y1`Ʊ`61enDVUVn'#3m#ClUrrNl #R'Ƨ ^rJp}z,]'p=W9K=|[kћ9'%+Qdadw'u|,`fb˕9pTtHA{Bs~_*| ? : S4@x|p=z"׌/E}b75jf \Ʀ`\4.(Â'Wd$/_*BoDwM(wJ+V-Wf*o?/ ~Sb?s95畳Dj 7Bzh+̙SixbNv9,\ | U,@!k`B2 6(<=j !DFFn0ÄPQ9FcGe.==ҪѿpYœÉ`;"0.]Z+4' Qn_6pvHĺxV90pQ9EEqVgϋrnZӳ# &G^ΚF>B9ֻ\u'zW:kMzG;[|wt7YP-я`F;Ñ@=Bk)"@'xFbT+jQ㻞 WW'PߧSV&J%3ʂܦv=gk\dyN~.E-a@$fIh(1TbNpZI3hH~ܠݨR V$yU j0 _{ᷞog939?^o0m!ꩿ>wjo7"N 0j񖙝XfZT0г *js Kܧ⮔=AO(FSOOIWgp uG^O@υ=djzvK={zUAڥϵVmo^δpδSCv(w ]Ιw=\gsFN5c.&ޟrc["ծF -Ϥ[&㝛-~Z '_ Lm-fUi#^40oi)ǘ~` `Ot@*Q  qcvSk'@'. L*E\Q%㴢:$גKjse5Tc jFٷX\y=cw1hgo|3:k-~Y ,zfR16mkH[ J8Zm|!e}%]f@-#rCX 4ehl^83"> OC9Kq"8}-'o.SF1&=mņѦJKRZa=$ANKTN |>Ѧ:DɪEqpzQ ,stb66#ij`6jL,Xi&7d 5B:t8-dDa&\|Mh4}4g'Ls?` ]`38QyL}nt+C]9_a5`>A26-# Y;44vgO3zsj9M  d ̊NO>ыG:P" hOΠk$YuDBB*^GFo%C@$q^wa- 1-cIifJTR~-hA{eN0N{T&U߹ M5mWWd ♐ʴz]$L;$fƫ@b-# j\!ȓ4!#7v1==Kѹg$ P|:ڣp⠋3fXfӔ9h>ΜVMG '.%nQ˼KQ2ڂo |dSaC3m;8\yG[be~bmp(f͢[׺B,{&{F/WB%Ja%iPI(6;T;oA&C7U~>Vc CD⃻@2-wL'TfCOK]%JDհjazT:m JDU Df$֍ B_lH^XZZpH+q$Ƭ^Z*Yr\{b Q-iת=~J:ԁɰ5;:"un/< x2Bf|G">:fq`p3Sg4=Ĭ"b!XDL!x){$^WܯŞ@4M2-E qةdl?B}dJl.mQĔxF)iB=H⹆X3 6: @cc-AJ?gC$p=s򽆪>F>7YkPGn3=0nFbdh7xɍsxoҞp졶yx>xoS(FQ]0YLc@^.h!5m=æpF:|k Ϛ$XǃDHtoH2W9TV":0D Kd܎:Աʈ8BL#:v_rmˎ;x^>Z X @!/UPf;;Z7:wdXБlp/95iP;27Y^E07 Ĭaޘ,0^:1Ɇi9c*fDq2[j'ICndVʃ뷐K֔M$@757|ìr!ю啭=Ì$?^CtD !OTAzA{|܋ƘlDcePS}1Cq`uC7jZ j@P\*;,%͆JfۑxvLO"Z^a.Ϝ9fcKܷP`1Bݨ-l+RT12>/vjO{ᾬ Č )]a">/Z'8ET%QZ!;z(Y_NK"菟? .Cuжѡ6 .[}}n+ϚJ2E0cErKFRFҸÄg#Kg3"1\QIx@=gՎz;tI'2#!$J &G,F3 oD3+bYi"d]VwEܥ)1o 1Ůb`6zQ^&vˢJKPպ,V%)TJ;&q:\kr>HJ+2fǟ:cӆj Z#X;FbƑM𽘭A0 ZZ)NQuNŠ_ʳ7 慝O8zf^Pr8GJQ/` (`8C u0 かD 6X'|mP ' /lpxAL%݌mFn~n;-C5`btJa#u8[ԷKzr~Vf#8)hqK'2JP&ZP%,[8D͊l>-կ٫dR-aUi N)ŷIxyP9 G CXm|dmGak9ciK_?L|+cf AQ/T]HU1ڨ+['$0b\E=y Ϧ6eʒ9/ SyNrGBnrZEܘ:}OE= qخAz`qJVƩщI7mX`[Bu'г mUݪamjs_ Pd?a3^TK>[yao D!!ZPAÚ |Ngъ`Cu=a{e| kYc{glNi[?J5_I! sՏTw'  ظ{o'=60y_Hv0ȗ㕞ދw :@?*cz'$@1! Ҋww~Qޚ[ӕ9Bi xUa 4ib-l cS|/g _OH KMb#5RB,y#@Fxx_]-uF[QpeCn[*HG*=LN{qJr`ъVkB.imPk5Íw %Jh.f q}xލ!c:,4Q- 3S#ײw>W.)wYY!ERFܳ-@[%AAU+pC@juQp[`HE6;dl A͂ -1Q# d;Z6E>`G|Alk$";gj s&dlli'Gc.)wL0>XOVa?X5}FF7 U<"H&Qܘ3zV`S`=%4ll6Ax*<&8+qU§tϑ)'ŃoקM[_w e[ TA-0gK- '4`{&Fq3L3L؍ toè'xooeh=ޥ<<`:b=0[ZxnV\2?j:AkPN;v/0{y`v08R) z-d O[T_?c&,7,~7:Ȥ}M#~pk|1 .һwz3.­:'vǏ^-bx;v }kq<7^5VAfu^f'z (9xCD*ιrD(lsKpe]|RgǞmep֪ϧ>>>>N݌ q ں%$и {/G8IGV"Ji5"whRUT*;iga!gދtr'ƉHCxTO+/n%',ͳ ;}}IIϝ%:YzW}.?$:?GEjܥ̩sq#`:}WS~WァN=@ow}x/4yp⪧:6|*ɦ@3zq.نϢb-JAqNAD͝!{)͜V\51 |R+Yb&xE.!:V5.9G,gѨԄ o6#[Vf8ļ 2t?zzKT>qP D YVA=Ğ"FXzXN8%(MQErV?'XDk$L4Ů1vhu S=UD9HVChu>0 z:N'Rx`"$^)E 9sWcu#9]k&*M2wg%JF {ّf+ 9~9-'I 73l{ΘU[BbVPOOs \6b@ac-P[-qJV>I3,4 \i"3*G;p4ӕ_QsUjqlrtc^ QUmI>!UZ (ܫw ;@d߆'4!ޭ/ĽLXM!+P !=`E;ʠ7ZOµ$R|ȣ`1wgަOgjЎ#Eu0N,Zf7ʳp|вƲj iIS,'uay]MZ=:J(zxL\jYż^I^fE+'TOVUޙ̢IYdXkJZZs0(^{Ly} 6ߔOޕv ;*?qeuO@q5;*WGJ_'q$Vy}8Vs}κTQ^w|#ԭ{֩MDoߍCl̋ھU>WFw=MKG4::ioVZ5‹*,%-m*ۖ396&0#]j0:۬V5rq96Q*LI$[T (_?&.[޵C)@, 9EʴI[6ೄEBR_N{6b)k?OŒ" yO9|% a vm,(n@<:0`I #o[y rVam6q Zn-ظԢ9M-@N I6V @RB ڒOQd+#^z| H@F5%D.b8h -2Y9ob8ǰ>=KO[`|.rv 1"C!N;—q|X,}o ӭܩlNna{CڑZ3r"~VK u z9?7tI:Jɤyoдt>DP?{`VY *U0 B3@[ 襤B+^0I*S%:<k!SL"IMvO݌鱵#ZZai%a3(w>3&  t^F*!)e$::#7@v0^ހ#D^4hF6Zl4o q9`2>dRofox:rCa0B@R9(!p癚 UmZi}C4|C0MD] wgI':ܛ#{>1 XUeU^:%{ؗ{KgtJVbCLdQ-Wav>`i'&㳑?^k=ä+tuQisF svjvIQJHUbdB2߫Nվ)ԃ^:w`GHBBApK+!<דkyuWtXޤa򆪰Ƀݦb'm=k@Qr2^!b@n)GڬCzDaFR; Th߫qbfo-o"} P_['zq;~ϯ~l9m>MSfzLN5`b!@'~hd304d3 7qߜ/ 4J8yЇqPc j U`;ea6 bn8v}#kXOxp1J;jNu h50 C@jwXJaBRŭ ߅wf3L5\WMwT"x W; -;p_~ftN14*cTwB>m\j繁r,(oP6FҐrFXTpݜS!a;Pz.RM/NNKKdRoLRMWp”4suҟ?>B_$`$#S='{RAǹ{Ah6P_2zE"lMmf<ن9 B")(!CD[JPEQb9:*j5 KtnGSY#MO ŕัD!E-r bZ#VY?9]:m3{tf+N9k{66y%C]g?)c=z%Medwƻf+NIqK^b"?_5.aƃTk)[?CٲktPӏ b QjU#EeF٬â.pOl$z oe[+ǚVf՞U]] ؞vcaׯlW8OQT`Zt{Ԥ:58XLж\8N5%k_007QmziƎ#Jx$zfHR2 uMs ATT؎`g+7.SS"MJTڃm.z}M;Q7,vnj J?j~Q|if :7-hz>0#S(=lHeugPxI<<~%xw@]h@cJ~&YcہP3 B>2FdU?m5OU:C1x"@Inu|U~ks15uSS/kwԗ!pб]7]יʊ*=r!JY$BW6vPS01x~`) iO(yIchB>Ni)X)L ՞: h8? 1\ÌÓ47Œ^'q60w) EHFdըF=FV)[#;cP[a Af@yq[h*"0;\ޖV&$[=Þ{"c*Ks vBf_7/^[ΘH>)B`a 辥>=qy=_yA\=q޳Ǭҥ:L"&3t*B\$VwelA h*~qNC[d?>è6.Ĵ* ,ү+ƿN ke3_}CS~xO;,s;~7F: +:gtzٱFQtO{quqaK]w4&UNs( 6y&#D롶CT"j3 Ɋdj*vx>N_ss9"3&8i_/a-+a 7r.Xm0.(@xF0%wW} Z0|>DZ0V"ތОc YlV 3ܞ(. жj V?Г _"1&c#̈?J[lJdYx#=eMwGs>ŒθQTўR_0|$,˰$$x,'Q/0 # gHjIy" %ޝƾ?x0I&*RR&Xȳ$!, H"z$1Af!!7;FX I"-vtTCbH"  KD&6|cS\\zH#S5&M@:S2d$Sa~>ŒWS÷x_|WNtG]\S8}0<1pWnQ=*{]&q?Y@%nn\>?ފF^V+mۚFPk)-GjT/} g aH uF콛]/gHr?FvPTqj}kJ㒊Aɏf]bWh\e}){{pl /3v NՖr ,2[%ĉsWxb> kQAO%AΜ"hх$a"Ksً/ϝ[t U "ۊMlKNKǯyZPG(ȏN|pjM1|:4]_w4 TjBi>n66k?`d|Utda]>h|Х/ȃ?j/4<'!jjj{3Tn$ le*ؽs$@Q7dT" me4qn| T۱ z"[DphN+hBkb@{s)𦩡hƦ X;)zoR0YЛ1Ɣ1QC.9)}$uFX6ԶوڲӚ)#_E@A#a? gѹzt-:բTMp Z0AUE~!Dկ1oUuTևdQ+mEpDrBJUELhhvf2*j\q?%+q:Cne7XT68ja'*>4$%m"x7\>,qqf 2j"S0fĥDAriN"U`@!X՛d5cFHZ70*]  mP'_ v5xJ @D@iϺSt&^5o4hِ$ʴҐmgw~f9g;Q݇+C U[&퉠#\)k猱s 3=~yƣ@U.B+i{/vm=< xQծ33_z2\䖁3F0RU;.rWq[(]̹ @ii:16]rCV073wV!!zbHqkO:NKX\zEiX"6o_8;!뻱8^a']['$ߕK]ے+Βɭ:"4 eKO Ed;1T ؝!e i҉"{>V$գX`6qʅ=()*Q8֥+k~ʨM;ѓ{yɷ Wv߁>i9W+2Ne9d\Z.n^ij0[Bc00ع 6tq37ra4@̛bi i}xs\wk*c9'/bFJHT||t"v+-lle\ۡk0z XZ\"}V!Bii`求m?LM_\&`]7 -c :v}n|Sk )VW^ױMw芆SwNؗ>3UI1;AN .w/ZrܠzK{ kKВV;t Rz-&S<%kc>9uI*GWj6&$r&Epy {}33JhϳgL0㥞KJxNCX! I\Z#2Fxn,[ϭu3 Tਤ)`*9!S*Djn&8nS;&\1uG;9|.d̜xH,^Q."K,qn:9xȷ3sOe!.2|)ŐrRBjf 髍|}8p9% geA *2wL(mf@+VSql$P$MiU}2U>#JXY;՘1sUO8i^U|"X,%Op~$_ v{yet%|@VҸXh7QJm0ߤUGWPe*Ӛ@ju}}oAVȻu5S֜vOnXXY㼅x(CMi^ϝ[@ "]6)nM?1ewq`R3~`Xƫ U'[q&W\s4Įקf8Np8+q.4;=#=oqL~58Tp jwqoyo*l+x#ZӦ")eS6[ݡ^0np?Z*Ԫ*kuYzECPrPXyq%=D[*^Dϖ߁A3^3>W~ C^mO1q.[\Ϥu7ODϬ DҲCFnn!='\(1/#ѠXeC|!(Ė\0 vjW&Q1>0W]09az$WFzR{>@TG̩E5PÏ" ,>GecFnԄg_[NqR?rIL֫AO 9Rb7>j5g [v#d~]:P[Ɯ3HYZ&f%}{ $0_eG< _O_Q|s+5oQef<W7j7ga5[ǟ:?$Jڼ]` !ыb;cTdwԊNiU\*h=V2GXP_6If`LQ;5dO^O{Ph ḡ(_ uĝ4U yTn쪲L;*i*&We 8DQb<{'Oj/Sg\׹s_i, Y%Q wBA=$yv8 %ZyP;k BD!`<yrfd#<7Eؿ%ɮ ɱ@Lpxc 39.nD\Ltc;nip> c{kׂeO)k鯞ڀnD_w'+Dz-^fbi>Pە!Vp#܃[Y՜a`N =^Md7 <,RlWԎX4ܥNz _%o5>a{r/)) i3'Ou⒇\I^^r:-jI5` #33 F֊7zũ~CxXPN3\ׄ {E9HD~EhJ7_\x낶VwNqgt`Ao)F+7׉^+ d wY7X@͂56ϘҞ;y7!hT;u+W`daV)A| Wc Y>rR3PN W6JjL=WJ6(D_X ?لx٘26[XNp9NЂD٘$cFy\J0wx2xsŻ&=ٺԆm_n?GBټL,`1`E!{M&^ iN`E:Fhnq>(_~WL@$/ů{* '`Q{gC}s?٥laFOuژ t[533nT/\^hjޫ 'Uôv8aHxcQ<-u _ً΋L?yQW3p0>v1F[3_%_N[װwK*GQfFaSR8aPaRo0NP0EйQ8nWQ5c,ct܄t eD؄4&/Q}ܵXKݕ:Y3<#uGhC$D.l"Wj]lGh0*7MEQBJwf./D 6olضE5% ̈́É"3=ɸDɌE#0cu瓯1Y;_&Q^{[r<cc  ` og0F$Ӏa#4iCۛߺq]5Ugoނ\\o%M~BOdѲ@{P(9!A bC1fL6SGa9;${%aFQa׍/0(jQ ":Z<¥{~*%oFЕ9zS`7 6d*zUҫ>I&]2In8GunIri5Φv/&qxKV:?_\I~aw<Cr(~gq'ރ(@& Aq&%ٮY%|'Y%1"Y ?>ڥM9sN/ KI .@$HJ~L:ї9 HLf8d gR3S71!lFY@ψ lBYތ=ћo2h'dFmP0k-ޅ> WlI*܂T3Mh2L0]sՕ 8zKd1_xYKZt䉯}RajL}lQH< a~tד8\TtwssO%G ծ]>c<{캰 fisfz>qq%'3A%Exd fN3g h9@=n#84ja"y9e%\ m,:g`R0@<*VpVb4_inݙ~!WށFpATvs@ü8ci@s5_ߩRbkVNNhIpFXM H"VӌpשO-!"#`y8"(9@V۠VpWӶun YGGplr6;M)p|7͉kPUHNs@l9El9s9%?8NPzdES,\VGbNjcCƢr2>{8@.{צhz޵) yaFm g(ܱS݉kSi&4$vm X8/@|O/ňwUqC/ł6U.RܥNV Y)h淸)+9)ocx-Y O|F^lv/?ﴵ␷v?lg-uG${qTrQt$luJ/!_^@[Ybܷ(hJRV' >udEf7œ`7sVUFmca@+SSVZ%cHD}C8(c*:vVTH)r,*TF b ߙHEtP'AtJj9b88H5?Iy/}K}NEדձlq][ WkD]b^G)^QJ+᪴N|xOe~5hr'O`TÒ~"h޻K @&jC?O,y3seI$ TY>,]Ã),&(G2lt 4_Z$1 |6;/KcI0nEA~,eS%qźhbk9{9vmkzpK>8^jׯsS'ʼn`ur9Zcpﺲ^k_ |:՘>{?]Ƿ_aT*guG\Hv@nN;&Z."6m/GѶ =`8:w] ù8dۜCh4 LV+#TIϮzO`<\ҥZ]@S KKxk|L)1;輕\9ȵNv3vWO"r٫]G_ߥ}J;^nn=X۳}}ܻnNit d}yoϮnu5^Xu ~|zx((>̀| ~@tzT 4Cӟ$]/YR"t- t[ZMXnc8Y -?',^sf\.yFs*/2}zUkO@:^䗩+8gw?| ,{ыfFz?z8[MM_nބD ͹l/ xGfGbw-YN;s~pylp""{]scG:2#U~)Ѹx^sK*)gu?\5W&wp>x݅vU~3HR+]uŋkt{1Mq*'IŬ J KQ:?}T̏O7 XgI6H%%hВH ސ&j-㘱 KEgVNF :o۶:ke+64so& %BIDO.ySK.w8<t w]|7\W|_#ׯ V/i__̓N%z xk:|5Sޏ^ƷZ1xB8? G~~18/βO:N\cs%wA5ƒu̲IyL]euL:K꯳[Q$zv=ZzY%!hm_QCgk tUPl`=FZbY| K pdkWAQ?XVw?j_1G&yBBNY ]&my]j`JkӘ =ߗM]|4 #5{q!Slxpwq{4$:lrFԻt7=XוUX ҝps3~NoӮz ^ gTQ;RMϡcPL`!^ս:ktAX|Pd];)D FNA)@@x!Uҷi‡ki 6FBc|4uO8n,Bౌ%Lh)g,e+d<;cg=_-Ly^3|uӽQ mB<涒tA:Uz,''DLaϒv4jcZĘƋ]R>f97fɻ0 0 `-N/j׫d;#o"S>sNBH0 A_~'(#cK@ȱlj[9пjָExlp]kOqs|7g{9%Zu6fE2+ :|¯~Uw_-誙E|| &nDAR;Mаޔ(!;2KNc\9Qt RI,9]L2R )ȮI?=9n40Y|_%l)e-k yIX:?'~Vx} ;/`^$L~Yyݐ0Юt) O35BQVD{ۓ:w~9ݵܵk"/vv4&K%UɌm=Nnڶ*J緙YZhL$U}s6+=O$ s,> >Y蘺St Nם!qzSPL:Pݷ[iޫNt Ht9zS3e&/QשtKjQsQ,>k~l/s9.re8~rW~5vዸï'b8 $lw]9d@@=TޝN9AĚ`n2H$J8GRӲȋ$%i}s540DGA$* ɢP"x:uY$}}J*&"sp$}AK*@5 TIg2\o5Riʥ,*_;;u!*Ǽ: U$u +|'NF񅀷6?OIU\&rp9 !)b Hp5 A1I0 uԕH8,6:Vz^:VM]ݏǥ&o j./j'AsXMXY&`fOV!X?Y&̼;ULS-#J˽\yKZ"‹]zO.wޮ>*dL$xn ѾX.-BwM5vmUk&ƵS7\勀% W~5Nɿ=,z~K#r5fgj;gri:QH˹Oh0}5>LSޛ.zƻ^]5ZUV )\R PНR `~-PqqޝzJhB;Ƭ۳BX]MZf ѲCbHe=Kg|賝@Pgqfe鳌d1g9gk#bLSڃZXѬ55R03_.g\~}fko 4퉸3Mk@-aHiݛhǕrvM*M hՐ)Qer(=+3z&n?g!-b>y+53TJFquJ^c.GR"3hؔ\6$ %25^Q@r_̗zW~5^-;rŕ|Ӛnd/ZӚ.Em_dxv{Д1<;k^y귙3]rLEE3s3J~ o0GL_خnȉ܅9L&䚣7P<ٿO;4X@]dҳPəTtsoem_e!>:C3mNS',;/Ks?VTn]DAWcs(B$V%D."LrŠܶK_tm$Q˱׬WD PZJ'/{ J+JnpMCY막1'f8L部7ç[ܢNhA{f}8s}[wY<̓y+Vӳ?ʫԮpoM?88A!gH,z -d_Qx夷Od:Z g2W_򕝐HDanfwo7/ƣ|xCT- sM22ijXIc\B_=<K@2^ѫoIQ%m `5WN0:쨾,^Rw*>%\Gd!$W:5T9waq 4Kr`:LbhX!j޴ӨRwZ:nO\}!//0s+SsfGD.HG[,BrNH I8rpѢ$N@]4By4>(WBy|N@>-:$!A ]ͳGd_ourV5JkNUkC_fr.Rss .̋ג*P'Di( (q0&Z;YJjo;fU%:8ױ*Ƌ!DTEwnY}ɥ-fvuZ92uٿlyAmo_G 5 t׿P4̎udd'E֕ONL KSR~錑uf}Y!l#W:eW!=jK;Y,2{*A muUNy^WS`ċkG6A RK /(]g$B㦐vlfI^ ٻHu"p=hd12  zjpo0ցL k8=n @ȆE4 YwtrX6Ӕ 4#N `_{O0 |=OgctbވDn|*ҾF 2\Vp[֣ X_Ⲕ`DK~9*ad(rR;Xt }>_m.4Vw)T-zm!}OP5GAOJr(5{Nhv8H5+KםKÁ!k0%[_n]d%򫷭t.D<s>Ɓ &\䇨^953@ ((ۡthĬ30\`r@T-<t X@LT 2ɻ7taŌ ψtq %q0qސbMpp ߟմdO_]^_o=ݑٱgwTlȈmdOm4mFi,\|.El_}$hbLv?3JRd~^w׽owW;Hc6Coz55ܗѭ]jS Ŀ 5ivV&~Bsx}6Zë=rl,Y崿0,DgH~-dWU};/OdOHm$.T_!@*Qʶy-6P㓰=(%w~-v7˧9T[U/7u_otp ,aUrb5ujw:}bH1|}mw^>6]K}o~l[V;}.}[uߪ@'뭎* bK_vݹYR0P';+mv&Vo$XP|%1'_zѕh%k`]207]u>we#k.tJw9VyVyV?=櫜 jdTއ ʺw ,e$O|q!4d/n&qGyi/ۛP@j&:R}Gj5ߕ;po|^V)ޗӗRGd R{'GɊ:5*! rP@Bh#(1F1{!{I>瓭B:+c纄F`O{ n9/Ty Y KF)aD^qJi u<*>5^VJi\emĝpgyC[k^x_m\ kq<)7k#>&6m:d]v($KƞQQ5: [:4wo,90mxxדw1I߳(=բnJ[hȑ\WbMSv#D!2WiN+sHi6H:acW$Dc &.wc#εNN(fEkx@%Rəd$ 9E܉ &) J3Kɕ8d,dw+}|\:ͺEj_.^o[ϾNAѿ+Yg[=u:oZٞʼnuVڜJ>Zg5~YkN 35f}mܛu<E{IY_sLJ Z;"׵"뉒!Ea1ˈxxGN 92e6 a&1xfFŨM5S A <9~R|^e{%{lyr_ @ |זxxqy]SLxjԲN ),q,,%у xA@1OxQws(VA<Q0 ŗLǝ UwT>'|~貛Fb@; x-ųV |sbFmv_b"YE$F]IJin}<YEve[V(uA{@i Z9Wzhh 5’Mڍ60RDnYWc}ڏ®Z(^.1}` R::ƈtY_ d$5@wݧ;1޴oT89=xitYKVZkL) 7|rO\ss%PE@T/ @2N}fIW~Vˤ2Q WZ Hgj?VZ/)ėW͔}QT}wqrs0!siլLm.d+\ky4EP 3JFKA >j4&߸s64FK9GgǯtI/f..x-QŐnwq)ϮZϼtN#]Φ]$O~m%SdTL02ngd܊+Wh{^sWM2^_O! 4Z|n\ȈRNߺ~>q ywOs"ps;{gi.&'v[d|o}e"C58k]?O;d˟2̋K (;!o72w9;Yq}y}ޜj-ZB%5П3ѷ\¢ew%l}^!7P(4,cz|$I7]S(gyrZkJ_U=R;r`U8ri<4_#7;JÔE6X;>! %a*-O)I%0`AﲡA]AhNx?9U] I~G #voN;Jr<'LJc1.6>ufLf[񬾔S [D<,ϞR4$6 ᳛'lzK9\7GpIT925)[X =v}/irDO(,+ Z Ǻo0 ?F(˵$!~qBey< Z %tw-G4|,u4{F NsHYLښnr b Y^ 5h2 3`7TBxGLF.!*ԅ\aܼ Єm^ rpK >e@ K QA=.b 4&ZjDw,M:r{Fh[B.KtȊ]c&Rr,XgOW1%5+؂A`Y9U/ZhhRj"M~8 ,mWQi '3$ǏE¡89 {1mgP4L4 1;y2jP49ersMDzL% ؄?P[0͡~j&\{7yB8{zB_&.CpXK`^W8 hfJ)y}*^K됒dLxSJQa}Jӥ(iZ~[0Őվ3u = ɉǔ}bbXՇ NZ9H'ynw} \KS-zjl5ibLE(:r0tIpsOL>#jwF$/:0RWOdU.ꃩlEKXRO=Dk-NZ҅?LS$AL]zI+5QA+E' J_;' %QB 8ǁ_ Ѯ_ǭkJ#:dБXXFdzSGHoґtt Fk#߫5N2|ə_o]K"8nUYbCi4KG?po!ܬ޸Fp9ۏB/LÇn䈔("bܨdEp[#圪t-G_c⾲0 ey,kTʼnmH{^3(Zm4j+\WʙI'wIpX|z*|.Zվ3?wDt 7o8po8pzQ"U|ba\Z7U(iَo7A M&}R7A MWôߪ 6 X-O??;/_|_-o?cd~$MJokm{YPnr~ooe/(_0i^{Ue*7~{j(܆fMpWuۺo lk"4$xZOX%*#o|$0Y+~X8oӶ?{ }|>"Yk+ۿ?6[WB4Ulڻ*J%?GŶݷUJ_IePnxpYsi?|%wMkmgmEWmM\o>ҿuh\R8c¡m*;5ԥF C7dغ2j>C-u(uƖ>~ݮ/m=~6MW4ܺD-4YyKhH$*ec˭O5GSWmPc!u.+>'*N_~yΫw@VTW6}ZQTIY7+B}UTia^Q>D{&JVT7'idMuecۭWFu%<_ͯKE;eZn}rT{4=}o7?!oZ{Է3ק/)uТ x}>Ml-JYק֒.nz3cpz^J1>lMO^^ק uD3ӱmPI[ٸO3wGU73e\T-[%Vm *.\dŦhF-ݞ#wi'e>-{fpC'8 YQ,Wv S;lm sz0M<4љܣ#y~e|]QWOskC 8ezKBa-a~t+t3~b^a }1]yeO범N|73{ LYΣm#n}[1}A3]\^̄3HkyӾ2yyzyӮ~b23“3S;Ew>A8젳6E5WwR==_Ν}.?_n 4Q\VA 6nhkUF 5?B]PU|? bJl^7T+=85QmYl$flbcW[GFXc۬ G+HBEs'"P)b(t}`KXeCK 2&ŕ(6+OoڗXH u,%܆u+ZJcԕPڅQT}V\E_-Cl$1eR M}"V"X+nXWjSjEQday"^obYm^c]G euZQo W?m^.6%D%(1St^l{]?LƾoGݺ٪ zz\*'ӝ%kֱߔ:\>nݏzoSuS(Rzg%2j3{A{\RWgVVWvD/񴡂gy 9cVyue=ýnRgȈ$X)r.lCCi %UQn$;!WSq_sK=Jq mNֺԇp[ѵlE+Zj BtƝun{zgX]*OaD; ҍvROttnCRw6Zgj[Kܥ[aBKFX镂v\[\iS(c"&u1[-^y!az>宺hsݞ(-Z=Vqj!`8 UJXLn^_q_mOT.C0걾QTTOoQv#YIJ/ug+ ֩Dj De_ud (UŪ9\%6vkBf}_jtm5fI+G]{"á/9`D!*\ˍLj#Ɉ,e4=cfs=_7 Z6{sebtXT_Ӳ1/u EwMOhX'-q`m8jCqE 7pIvTJF*TrV^D l2%`zk=Snu %kD/KRn%juXY:Ԭ3 25)98̝Ku,=mEeycƉ_kَ^ 4%PW:H⊬=FϦLo/+-^]%pumG}t !Tbv4>=8V]Y/ZL =L݃.z\ۋ!dxViPjT9Jp7F㋡R1h-ںC`%X7Z 07^cw{bfΦ*+{QŢEzHtbDl;|=[K^iu;JyغXHT%n@9\BjϴnԦ#6QZ3Ya76Ur@d9"@Yl׽@<ИpȪ:걲%>,!AwCmR K;@YPɨ-ʬڇ:8ZJ~ MГğ:ɯmL*O?^tF=ā{+xUVI6)0jP&8lЯn\ida!Wq,nNVWmEܑf8FZAUWLJbriv5knl#6)f2]eRDQ *-+0 rJzk xg8AZ@rvӑ0Pk /4&/)8}8G=%`z/B[-t,aU$ƶ06Nr"0 E`J̝>vrq| b@9Q,SΌ;+Pڎ !3߰?'Lj?2i3$A,L1m*L d b#%#6ZRb#*(y7ymLkTnEҦ> 9ᄀP6u]M$ߏBIUra*B:Y hş.*A7X'3Pe"sUJ Fl@)mzH r>-2VT+_-?@<<*[tO * *KAqMTŜ9XRgOP^$ٸ3Ԉ9K:XÇ!C f0OY0褜u o)@|el `_b#ۜF;qtpj6٢2v{x‘ gi[)bBí)E*?hS7s^=]ً*dZ Yn6 i@`Pj|D,Q~z k v*ڔ9gQ\YFP9T6»u wɰ] 3 װBE\ 8V}<.(Y{Od2]+?(/'gd 9#x#pJ<#{Gmf$!=O#tSV$=;%CTYJ޶[2|L=s&\&(gu3Mx6h`Xh:];zn{&*k4K-3ɠNQgi;YN'u)0q .Qg"h{XT}}t褙;[{6QQ-21~PmL-"t:Tu^! FQA#P<H"+ŗZL-p\ 9&r6(*UN5'N^7y|{8fB0Ov$N=@#n-:3p,E !SӱCX)!K іfQ];MBa2)AV#J1E 4a\BX/Z3F ŴzkƤ 80G .zEأBMb#,%t 0+/G{DnbXc eEΤ}USS m]7(AY!k `)-ɌiySY%M|X B:`ȭ~h]am {NQ܃"SW[Ǖ9#Br]qp YJo $QdnU{yj.(B= W+u%f [䅃kOq.i5vZ0$.K gq!gj3ޱljyZ3Սnq _7wOqP Me>\47#>;Hz=@?ޙB)4p3}е9ܓқQ_WΪz%:9AÚ$Gc; n@m*'HX"p6=wh7aj{b]Zi<ͫs8!cy-i B=K͂r HgNu7s\7+o!`'dCQ.d_Y:rtbS6^8\SWNtv*!3v+D<"g=r}.}Cn:VVcQaٵ0y e2FM rU .&9F Ξn.B6?]%UIԣ9.ùª}kwyl QlWIZ;Z2p΁{r[ 2)كkp$~۵^a7w'܍#r z:CйB5DyqvqPL6͊R+pPnG] ͂i-s͚sP%2-f޼UB\y9Q_%9X j=+!kU- tf3g-qk16gJ@!7oG碊q@]MF4RZj-a*HAzm9P5 7B[NE[Np~>6R夆4'rBNN[NTw<.\YW[Np `ʴ-'Cr6B9DɃPI($,r>B*LpՄi  [Mx>V(ɞe2(a)$SHapd$"i|%PJ/`adE4 FxHႝOzZAfIJ@-JH'Hmou?_"5)Eme!oz?٣M pD( ~7$Lvh`^+k40O$#@(M"'7aA}ԀZ | óA'AKI!ifəޛm%^kR9i,1^yQl PlFC f*+x)kp¸XLON;!:M<ڼĶ[V|. 7#qQ;?`hϔeI"(濈i˖ҿ0 4kþp,e`5,,^b\0Ʉ)0hXVys *{~ ;* ;U}I/#B*iUcÔh7|N)XAuo |T "sT=-)X&P! [K暖T.m9҂(0h #Z$o/ !|6Xa@ jTH5%] v>&ԭ`_*F0kkWth25+ѦZW(80HVwaOhF)+AJV_w sAV5HmoM K Q]ZĎ}B`Y079s)̅&-;3a"i@#Akes,Q^jp@P2KE,Jڵ/`P6u`v7``%K-PsKڗ"y(v"Q녠d ҥWa%qu$ƝX- )Fuf~ǃ=T{y}Z=Y8,ĦG:1Z)M)WAN6|G(Tq W a7FvX7q:;?tidJw kaB( d1Írw>I `wj"2m?i:WlGrSvE|aT* h7hg8@%[;2qywSpaKl,a*5ٝr3ZARZ9Տ+ ]$Z?kCb eCh)d' vf DqY0E`J(XZ \ {iLE?kS`E{`(R ʜCcM%B ٦ăn0nQhErP̢VCGt8ȀrЖ_bC݂r73#frPߥfr"3?.F%mJYZ=BC Ɵ"Qk4ͨ9vp6ReHe oh 1@o7/aU4`hA_(d.V&㽖 E5' LNۄ=%.`2~h=ݏ =d̍B/p_Zq` ۋE&%i0M-dW&UD5" ^[@X;zNc68E i, |ؚm OP0:.l°R( 'j\v+b.\k/~]@8O/3ZgHpwIS/H{B z7ט-mI #*'p \2( 8lƚF!_BFvm%zjS\#s\s>.Հ+Sn4,&H?@dL ڪE,}(rg/s52E2X$@վylA)733d%+ m78/)tq d5l'@BP, $yPNj#ߝU.#0E'ijH#b˔*7i ;Ev@6KE ghbc48@ݔՈ=&|ڬa@V̛O, 0sd1K|E f5@!1yu=!2ȋra"<1ɥ|E5ДCN@^3 #?Pʉo醉9LK0у[>Xΐ 'x (>+SmtnQKXuHs 9须]YGj Gt"#&b7DzgЌ"K %D<D7gf$Ly ʹ{--(ߺ13|{T4xN˓Y%tѡY*{R.5dBrCXkJš1AKӢs0`t C *j-8+/9D"mN@PZ PڡE 4>J|_93QI_덻x++vk<8bv4Յ!,g>k?-ĐjՙAnv.űfVcbrJڅE?d*X"XlzΕQJ` [唀r!P8I"j2E+mmn]dz,8"%ZeQ.U11)N#B7C^¾FGcVw/TܫS |^hRĭ*Xjid 6s\ԑkukGMG|PΔic@C SZHuz*e4)+soZ5yh+CrSkIDE`Cy,K[$g1Z(Z+Uv[NUv)#m$=%l};oG·cǹFE -ǻ2%\+(̺'];@ 1T V޷[;+zK_06ФJ5>KoE] ;GxS-][j(ՂkKS!I[ T']! b;FK]J^4T!-mhi-iwM}%ۤ?f_vgBV: 32*&P+Mq$-]BbI}hi-iwM}%iӧ#ZaD\}N%}H VIZJ}K)tcJ1 ?VXąmjCKoIn+&-Qöwk%H δ#r%}H X%޷ћPIIYer^&d!kۄv$n7!0vS*}KkJ%n;4im: _Lr]q>n+Z҇P Y%ah)-qwWNZw^4pE] YA}B>lԷi!-B -ߒvGoچJIK *EL;.h/חҋ)g:YDw۩={J7qehO 9v6VM>LUw ZmqØu%r-8V9.c(q[qVQC_%<W^D+q,9f톻\Yߪ=jŬlSahUg7Ʊ:nS6O]!,i/7%^@zlSwS_ڷq`dZtܺ70il8 e$))Tȍ|Ze"utdx* };c][aVs_[$%(QZY!z~ϕڣVUNUݸ*A WuǠr8:05:=aFm皺A+%m*-EޖO5IMOEBVʝNQA[Irjw&An;ԵhZ)wUu-}Ԕ&-ޏDi"uqVH dCm)-ڃVʝnU[mTS0ՍR0ah-} euk c=Z-YgN(<xd]B7Ht 9{NKɡURמzIs%cpPWHr0aJo*qߣH *9גuG ]wqL5kؼXJY+=(|)*Xm+9."MXEyl/wimCEeҞ pn_Jzj@RNCwxuBTQמ=mc{wKos߄eҞlnEyXRqh_5Gy[T޷hZA򅋜REGgᰎƚʤEųX*4FOFmr[+}{\$#q( q@ ^okJE_TBu\/d{9Te}9T&v\b\oBc"aЭ5[&U3خZgEzi 6ߞu6T4S-V6/h8V)[ؘe"u3R֔-RI-eb;Ö"&Eud )D9vly*o+!.UԺ72iWP(+`, kMu?Cn*C%oj*ICKon+9,2+(dR)Is'7ԷOY!-xӪن-tܖQ˗2 ezwW8k;L={K\* c{ºn*Z'Ow8P_Hp4::5UMe4z#7ԷOY!1VͺmZI[Q(Kl٭^`J,=TUv@v7-Co!ܸ©5jױq~fd+%UmɳVƊJߞ=$nԵr __;;/j)zfgo9\Wߨ=jfS*+Ƒ:*P+%Um6Zհn*Z9+%VQ:--kCwNK7?&䟐; * %}H ٛH*9ï1펻䘴$Jo^n,'cIX`HAJbߒ>ąYB<;mtW&-kOՓ|b&@`%Jbߒ>3CKoI74iWr(I]!utϽt&J}땤6TMT:jCK^aћPI$%RJb~ VZ"_PV>6G܊A6wP#Id`uHDPI[҇PC8i7IKq]!L\)mx`t;d;Mc%gRuhi[H-tN6Fx#{ k^|׽oKBŽhլC[k:$7屖ݖ̿zҺf;p4з  h Z]sFY&lu.セWqֽI W23ʄo{ڮiaqŴ.>}$`WnDiUd8# kUɳ|LBiBvrN0~?d2'Rn]S}Pgw. nPsiWXub}{]sE2~ԓK2 iA H+X!i-Qb $~w0ݠҍ 2{ $p_eL>+]kB_s.\uҺf'eSEL _0]E kݰX&&`8!<3&7-=Kb ̊ɧɕ2Yt[}V53)e-}u{JwQ]|4$JR'gꂱd0W~X6Rm3:FXoCە2?a.,_T7? äDY?alۧ љj6{ϖE2Y\)bVHFʇ2ҳ!LY\/o˟A0q'Df{ψXl#۞4WQkB_s.\',_(.ofR[/ H2]/wR>LR0?*j>tY}4MW^\vҿ /ٟ\)ŎiB|fln\"[brLڱ #ۓ좂zS@J1o]pҕ_L7? W 2|>MhΌ-=oRL7(j>kJ-7\ړ<Ө׽kˌ-g['|_&oFֹtٳYRlԫEN\:Ms-*Atq՘nj\?!A}&[[8X_r?}5, ("eU ?6w&enLeuvFk_֟2=tkiǸ>_CwrtкM'$t GD"ÄY{R/3%^eI𧓩w;cezN n>L>:9􈡟~4MF CW8Y>Я&|b2%e&W^`cODP:CjH=k:JQHא|zCq7'vκS:U-ZgQ:s7 W^{xؑn:)ivtRMA8B?!2#ZzðG?^hQ5FJ7m >gl!=:[T+j~6Y}?ҵoePi˓AG>#}ܤ"(y"9^.G^K"0˅a"3==avnJ%Qi]}!tΦ]0#3ώc3Ӷv4ʂʷۈR |>C]o_^7'ӹXC):UR5]wϴeSZ)e] ?}eL|q6 R·np?C'ۜ3ežE=4Lr X {ɜYrM|PfN&;(=Opkzz #]'}lJ VOw]Ja|I~Jź+/EdggL (qYRN۵2@qGݬM[C^I@XY@J!ZU|MU׻)7qc|C&ٶkц,] pw,)v—8Oq::z{ܿ91}ƭ1sŪ;4ӧh_ˠ:FKn/ tҽ }hͱ.nOlgkMB]i)WM{ NItn~obکMbgOQNiJ; q:ӗ4?_EmO¦_ W7}[bSIj=5}KcMq2D$P^{+lJ8HO[nJ*I  F}&1X5gW^ Xgmv}ueAd;xJc+zɇSbΪ1ʱґ A|UɅw9v봧Tgvon9;ю[W oGgbOO4pŠk)^C3T|fO}1hQ|zQskC#?4Pk~?r.uº]P6xMj Dg'5.(=f~h9oK+j|^[Axq>IwټV4ߴkeht|UI*o~OǏ3@uK;]ڟRq6_*e`ݟB<9݈γ2XF`|+Moq)qB"=::{ bGh"⡯$uxYo{{SJkrwHNgiiiiw|$|C]OXO뗰 %v>rGb>KOKOKNKNKBv;#.<-<-8-8-Anףn'}$֣~?/$w}4=Nr/UOqۧNNrDNr}(InƟO+OKr{cO_(In>In_~Z~ZvZvZ'ϯ$o%%|BNrDNrG}GIzO.wǼ?Ru}׎߫\{q8}ugԚ6G`Bvm}֫ZC$0j';'W6۾&G58Nvʣ?[z4XOO6ghi0'ؐ1#xܶ%cxBoGc?!ȧSc@|40i6ңvtm,}x4z8 _:vah?6^NCcv: ?~soG4|ih:/nKOÏia<ӀǮ|ZrZ#1+y>.[9Бv 暈E:i>6piivZOdpFGb;.<`}"EO˧=~^;~z e4󙥞|v"*N_OIâRQ!=8Mb7βݙ /R/ +EEģyȫ\dF8%T&ۗe*!O׏goiTGO؏slDIe{, ^+գU%5pzyk#wU%mmCq˿,6{ }gK~pF 嫦=9T[3[ +_9okK"7V)\Ś>yUvRI{6zv_wU j*e {褞o[@֔,RyFl=Eʳ|:ɟgGgGG(1ȷ=/aly2gln/XC3mkؾ"W/ 甔&HSnxϞ-W]}"˯Ϟ޴A:*ztZv ?ЉL3a]N M'w\M9X[v,!=6. pq[xmG4G vgw| UÎ)X"S7 `aweu":a \>>?5}x ]<.{m{,v͑1Mǹ?SlIF=]f6g#l=cls8_v%uZs pJոnư 86c=EMξ[j\'ф\ H<]d90Sz \Iw?Dw병kG-]#ggoCbux#5I~R OXm*}w(7姰h|4jZ7I]|4SgGWO Z:~n^h~R3γpptFoۑ+UNR]-bPlTg#Z"ܿp㣋DoվpCm,壚l4Ѧ~Fή|;xPو}ݬO)h|?\g[G} _-3C.m ~)olOYlC,>\gGo}()/5ZDpKI55? fܥYr¯V>y~;'<&w 3H߅)ETM0S9oO _+l 0zۡ)e¿j?Aל/ta˟7COy|Sş+. t \?vgL_OyT. x}o_3a|3`}Opmo=)$|8?+W!???]og?3?/O·?OE,-\fHR5WnW:>W˸w+Ekr~(Sb6J)(%H9yƣL3o>\9l9q{Z =6qE:yrb,9i8;vu{Tõ'{SWBG+m endstream endobj 229 0 obj <>stream o51Ы1QI+'hԱ}th틕;y'$@6d|ؚBO=![Biⶋ b).b~>)t]a~ڽ6]$R3b 1%chɞ2mߎ=xUߥs^̚*_fSFr9JtͧaX.uf޵Bڵd:]dka}'q1;v$_Z:n7w5ǽ&LEiVwYk-`"pm^'q~[t@~h&k\{dW`@ bq_>Ep^XxM 97ۄBԂB,:1bbMlOlY}_0B%V۩gky/ 8@p"NRz X"Ո N;Ҟi;Rk>umO۱Pl7YcuƩFX-s:"DiXi:!:&xdp,rżdpcSE%qEp aHD0EaCmz5.X4e Jlixɘ鯅IosҨBﳋ$S;>ߐJ>C;q4BE|_c2~ &UNB&<#W{ȠFe>Kы"h  A?&8:>[ߎ}KrKCl=uW;.u yIH.èC#DH!hIHUcrڽFv(vg;,4ȃ݋0 :8D@kr/y٨rΫ,v .zXNvS!۫y3J擑K^a$vfr4 ڮk{4Kx"!MqF̙w./K%mȋ*]J/a. ]m V% \ g4#j"D}pf?/ M~9LR֘6d>.UYTW˴nLL2U>ptU |1{н_ g8&jMd5"EhM^u䀑%#3b&Ķ+Z\ P %V)a-r> mc|L|kHzz=Gz5܊wr} lɡm͂cv^i%UGm $[(Z9ςD%:c[YF.lIb6@)٧"]עr4Ѩ.f/5Z ZfnUKvvhNoF՗H[A$IZچ|QP^C,bN Y6#Ν"a9{{56B 8U(l"Z)ri!HJ)f&ȩ{o+vUw#$u"*!vas/eT@bH ;Sv\3@jH Sԍ⒈ZƓ| -Wӈ]aN+I5&30ƑRBZ r9Ќ'nlY%N*'6a4%KN5?kZ\NWgRLEl#sb4IB !OAiw$RI:W0HֵjxUPDф+>)\; 5y_bL~чӒbRRG`;_rQw})-4%qۺDy,J"U9(BmZݬB+GuS ==!yny,+\\Ѯ Dmx\DQ|jơ\ Xߩזfe8D\IUa+ިy#5ʤ1>*y$K笑Aց` .)`s"AyF=L!DDt-M 8Cê^Ҳmm C[iVXZ0{ETzd Rr6k #Y;[Z+tЗ8D75F{s|SψfRhr;5%Y۝)MDDN& m,QMW.BF{FdFZr%cb-ô ]q40ye["؏E E z/b_&y dZ"6e\6t.et1(QΙ6mRf" I#I8p#Q \_8 q\ +Ƶ4^jge,kL\P5e}WCk)znu]ͲocR0)j%2fvWii/ 8g Ȳ!^I/}`b2x;"}>T]xkI˿\ v3j\'TLU.wԶ8\ -״6q0 KGi(҆7:Q|0+n9h,eQrO U㉠zLjPԘמšGlQBߕ/FWՇzBݠԵᨉƢqQ"*-`C :`:(q%c-bM[{1C ΙlmpyUfDMh'Gf1 &q5j>Fɹظyl]DX|GEe&R5ۉ X֎R"BV+^ڂXWDE Ϭ 'mZrP!gG)jߖF·WzNU2Tvb7 ~'U ]R#8 =GX}tWȭRݡ&ﱎgxSb=鄞;9e|65/WE'aI;@Cl\QKBu4ʹuXs|Ft[s{%D5AQt:+9h %k$Q WЈP`)fN87B^&,~n-鿈-Iܚ -k+[tSI"eL~h'_D:"vcbU9ab9 ?GGV07[Rm ʇ0+a]G{vD'ra!4 @⚆ 3"} l WQGFح fFi_\f'8Z!X&jP STLjKeaҦ}LKORTnh渘d)HKkBVF~yqA`uӱ9}T? +BLe1G{])Ћ /d+Bju2"X.1=qR6KG E=&68݀kЙ$ԩUʶ"@Hwr褩]yn 6D CͶt OA+άƤ{i~TZkc".qA@ACO`C0%vI D?VCPe !uY@-Y;2 ?(t>%!>[-&D*Uv08$w&3#=3(Α/u| HJ|,Z6n"1:Bp$00}b+b  =zDa_0Za&Ҹ@g)t~e>?¨2=~)\}?9e40XHW6{5̜S d>=ˈe-t Q?D]bKnz`D6 ۳Q\ݽҞ$ֈ\DK|lBjw\HVŖ(a f@mԈTFWIXb(灡];V TX߅H\1vȜ.s e-+9,W6Ur *ϔ}o!㭣BnGAǪs4nShcb(SA㣨]&0@[u@musf]$l+}r&j&w$J aI. Øp- 29CSՓlt\ 9gdB60"BQGr F; 8 efK=sԊaXޚȈ m F &m }4 E=pJȀo7'P7hDckc&3]mWΡg U׺AóI C1;<“8#V )#vognxC.zb:U w&pSA*>6bE'[儚IE&pv@ +ű 9vAwaq\cxw@hMͳUƁ]. P 9-MPbaX-8 ۽,'Er{҈S/Lh[ZAòDwzhA6sL2)q.v/anon0;G RJI׈Y?ǜ\aMk05`k?7 D L{|e%.nj}͋AM)~hn.e?'J ΅uvcH(i#>?x_MAO3 |tWb"qr=Ψ[F7Kp6QJԫ]LYo e>tRx#t Dfb _?`1qQoӢ,P/U bg@f@oN3 0˒%1 ishU9rmIe)eNnc!ox\W=E Z'źA8QS`5)C}@C,|5FJ fy+v[{q Eo̜O4Ywk< jG i됾C{Y~7DE"ewD KzyJ_]rFKs0k {bnc.Q4lnL[F?R\--o Tb BAKmMڌT&'bG@ع67Mrb WҩVޝ0O6]%=B׉i.vF9vۍxH:I9FwlGu r_.BL]$gj R, ÅY?}P4[dNc @KG|e8x1=3#/3q 0Ac`B3u-S6d= Q~E5ȇ#8G:m l!b|ZTzQ-6`Fqp=DzcXV̆ E"Q[lW ^y9ߙ]1uAn}-֠eBsR?vaqsߧi:Ku%GqRqdtN_2RrZ  >pKD\>zXdIou3Nx6jAcW7L|Of$xx= " lv#JGҗ$8uQkI.چν'i3z4pbF)KREcpw,pB.gOz7pqCo3X[{YaK~ͲuH7qtBZQaɕ$zn-x LP0ؗ!)0Nc]3Vb:#wstF#Lb%܍XO<$[xstb2^C^tG";hSU|^Oo!r?)M}')+Hnc|w}m;_-*oh/0["[hYc_0|?ng@[#U^}GQ18yrŶ+syBm w"jr@0Os'ŝgV f2=`T[XSK i"5+bHc焍yf{$T ʖ!6XP}1#14u-U3 {ܴQ$3-<:弘z]jJ`?WE(K ^YϯKsvJ9adn=臇 ,= I7]J~}5tљI!ݥڦʨ] NvaI" = -3z;ݔm LU5PϨz| K"pr,QmoJ8y|HJtBdǼ@2bv?R21,!SD.!8>`p_oIzI&ʄ r ܶ)yNι5zK< s(6Wp O-R:͉_xrmQH_ Ȗ=XQ0RfGDdG|ZBhX>8QnY_I'$|XƢWM+{v@+35;-1QU'9?N̶2Lf?4"˽²z$O_vKv׶  1 A) &F9{:70DzoNo +Hi1G!70_3>-Dl`U^>q,SRGQNmߟq4bw̡Hcqj;ŻW|t|o3 EfF |32*ĕoImAMS- u[4ѽnW=fA(e.A[ݏL5 K+Jǻ.nz#Xy,iVf|W߰1cVX'F @7`s|#wR8d+yi;[~w2WT0#%fUsW>sEƛN-/[J59NKR$b 0i4X{Ɖ逓JN7@gÓ! ҙ& \=x0s2~N+eb,Qy?=xqkw/H| >P 31|F;|՗ewP dk,8ciw pmVi[MӰ;{> B9Q[O2h,tIwM\2 ;Y$"zdF6G,^$Y(x߃aVl=゜z%}-댞cxx9G/q~?_/&?e>,W_}[*Ze\YIMR_Xz'W}%سYFХuGg Jq&K"NS弗Tt(IMJ`&L+y^ڒϞǰ 8Kw+6/{UrgQCeXEV8b\(\2XUmmJljd.p43X5DEk6[MhIȁH3z'`+G0۩ 읂^-d[JA1HȤR Ӻ0*Q=/dyn(WM؅w; RzISӣ #J>7%քNJѯnozQ[}k g ;@.?!_D6kaw(&y^t9=E'9h'% N#MJhydjlQC+:%n v_Gs ơ7GPk+r(]w6  D+єE%: D(0RiY?[Ո,6DB~ 9mnaBU Qo12B_dB/"tg1;S3)Je@Q9[.rF׋& lu4hT_'Bj&SYbT6)>U`-u'`UTLBh*FA3lC1 ITǭ2QBBɡ.0eZ*ύLrHK ^i<川VD7^* 3O:]+_ Pzx!g<}vdB#/Suُ ?W=ZFbHCЮ զ"bs4)Tۊg eu@899 Uh9m : KP0/NI,dJWimDRUZHy=nd!kk@\EֻVM2I;fQA}%aN'bef$ lָ͆=oJޫ%pv ċDbSkp7Ud{v6c,f'Tdd?r)n/0vuv$OTpW ^dFkoվ~`;MU.tIb'F$/ZA, 1EDq.ݧV8 tS^! \d/,T̟fSh.q-CT5k\rjZ@ꪪ;tz5* PujhruLNKTp旳4hjpS-A54Uؠ*j>!vն #j\s 6-9FhBZM:I<꾈1,/ #*{@l] pqN4VT<Ih'V%[@Zc 'tͨa[BX1Y4km. 0-QDhIQ\,?JN&gEpQL,I 9oRZ ux:aegKD&pX LSmcV5XFk1f@Iך&*49AL%ee֕h`&>NyϨjgI ɷ'UQ^^ Шl dĩ d\˖VJkj_@h[Vsh)8 dž'%Uvj6zoXWЈ٭'!Jj ɋsk@bn&PZv%A^`V +LWl rQf t_IU.ZEQ1$J;[߯VY8A[QEY_K6X݇̚E<BT()]m^0j0 EG1ۈd&6KL? RHUET7Jq?J5d|kkKW-Y WXNWz Xx7Z+ǵ3M =l0h&3\iRңI%a *S.3jN$nYm'@[fJSRYM1m`[ZWXjRQ;^o e #vQd1CJϞ^&7w}JiF8m`*Gt.fٍ8$5^W0"<}=f^f 5mMvJi @#OhWR1uu3W=3Y1E!&g6%Y1S}jgDJ "X1jUB#=)2/GΛ+fU**OV71,oEԼ+lfAde.J}LBoɁ*>!e+DTKD/t-= 4Fۺя>=%Oo -;'W v(ό nI_\>/6Xνy%v5I6*sG] D.V1N>D(}:QTg]7} $}1 xI(5iI܅<}fUQL<9@%~i?ï&?o??۟_ůϿc}[ tHW|`AZ Hm<ӕ'k#{[PNSaY@e0ѴeCIF9YUX{iԫ Ž:*JAQG3oSWq eOky6-\||n|Kx\F0N(3 X\ ʔ=Vu>ve,c$py`U/N%#P_c`D)jfAL!:]k@!.xuߒ#? 2cЗ3cPo'ߖ%s\/3̬i|?ʌV濰{ $$=C2zۦz*Q/l`Z pP`0Bb3n0-d efZd)4~5x(Tu닇4%5J6Ƅ$s5mVq Cْ̺}AJL\ZfrlCt"UȦYK OTt-BC"O~zŌͶn\ +=""Ȉl>|#*^T7"N-k|r<=ګ#y|Yrk1Żc=v1UfG!yh4Fd:0tnP[].C*SGfu6LY;k ΌAq}&3I*DRfqEt;^HsCȼ!>[ -8[?Ccmdžd3ߐumCmK{`v]i ׳o&;XluJi3QpF>/}@p!jģҋVwf2fԏ[8z`LJtkV+/?Mԉ߯]GLSͭUB_5xd]C=eVn{=qk6R/>uO7ч(nXu;޺V!%ΥthZy^:g<;{9{{dz,ّ}5Ґ4 $iSݍG݌tj}>9m7l|ؓVRm,pu a&RÚIO&aZR",0U ;X(O[xeų4C[`f`-Ie y#8G3 Κ EhU<%A֯A_UN֙HZze3`QhPVKec˵ HW9nY,2)ŬOP*d<^W_mٚGUQMia~鈊P$71Ua/9 n" u&昳lk=x{$p L9?WONȈGLSj]^ܵQ7EbdcJ^T^޷n;|yǞȂO"?L AyU&aQ,]W ~Kf^υsAD-"'u̪id*?olj=ƞf$Y`IXăO?R l Yb .m*JD:JcXeYKfn/i_8DtN(PIJsDIB4, ġE(-l<*$FBAdKV`cҒ!-)o_(Ry/D9V$BikY7eU*ͬj lNƄț|[J*Dhi @+]VIސA ڴӤ"ׁGm:BK1XT T"3&Xm^CZp\6bM,<PJΠ#bG6W^ ݲ<@eqE6J$^ sq(O_n^^0qC vF1l.QQ isn:]zo~ 'Ks"[RYm\$8T9JMX]GC!z<]ֻK0,YfjL+fV)P]3U`V3k841vn "5* ڲPc| 5#Khp1a #؞#Hie-ini7@fᶨLf𲥬^XVЫ2[XVj@/72dOl+!~`jBmd/ }W#\&^=N`ĸrlD[ɍ5!񔈝0v۲V{dý kM ob"/9!z/cL8Oؒ+zY-ZBH$*LS/l %ªe%š뱕˜؅,όU" 6$KyX6D`)R۵Ŵ+1 B j#˵ٟiU@91ԮAkL"݊S44su~M'CwdN\imk9 ﻶ̛U^ǎw:٫jt\@nBM u .pYċUޭ1VBēP:qJ1 Iga~y#xziGZݦ ,=f(D쑬E u&DձdQ63mT|SLw|'`Lx=_Ϥ2M3{)vi*Dwh[s1+QBD_a d.# DlSVvБJz)!Bb2ٓP :j]KO=* nM@jdNX*y+.}x&PlB8U>ld~iNv~9e:UG%O-F &НzP1,D}վx)yX.Jvаpɫ[&ˆ:,$h%3gKoǺf&1ho_cͬnIm fu3N/4!tNC"Hn&۴l/x% `'n%`4-V+RG4њ^cچ54ψm1ʸC%Oxfm tAuΓW8`TBonaaaG1V [*2;Z=!w4ku$t#+\"*ޙ^[J ڶ`p9}!OLxmOMl扥U]^תװ, +K^[F`/Kcm- ZF:Grl,ָ.lF;akdeoH+_KP5rx]Β61gw{􊟸5\d%+|J}w>@V6 KUKRki,[>hAVnIcx%/enaYJVcKYxm]('˸J" ila5?EH%Yi?;5Wtg{VNSᝯ\mrV1h I-`**rdλ:V^A3~Wa Lq"#{q,u0YOkj`[W讓unaϠc[ ``47XVyKGF L'}Ri[VN> &`FWӰRa@G61 B΀6B%&N#C9&rX5De(s7- mnt;;-իm s`ӣbwC!(I!qfڭtJ/-׃֪-m\7o 0$V+x/{. MLS.af/p!:b1_oI Z #"! vVu9nD~ q& Iyw /ڜv㱖P̋[Rck& \$8GyHuO$ ag%)^IfR)A2z,맥ޜ6OP.UIBlt>/zɔ67g(i.^%Z5#‰@S1vd6þ@$a|p '[ype{6+)Zj bk83ӛӝdB9gQN )SU3=CQL{PPeh-DֳVێT͓,$]tܶytL,vFhꗽ5Ĭ%C-!6/Ir'R K~ ڵ(Md2N gZ6sH q<鋯[g;" Λr"7Tf/jGܼD'Dh%o]|$S72s:ӣBCN=.5T-S#谵)bZN؇%҃7{ݺ2VT*9dDszYf U94}1Djm90K e3xf3{e+EmN<(δliBro#O7 `[&\ `Q:t z_iu;Rf4 ]HP$iCBiQvK(VY[*HyMFE5M\&s#x igܷI l |ugbUӚm6JaډWtw,+1KR~.Q]~G#\M<5Ԧ5DMhK˛̃p8x1]hV/NaD:qgOlLE<'X@wN v#[K %rB"Io;[օdJj\w'颦d)]'Zׄ^MFK2_l}O}&:\soԁޙٛ'/2&*+Qxƚ/-!"FW-no_n{#xN(N Vz7}34J]B\'GB*L vj"/iK&jcwFr4С u;Kk?:4w3y"-GMۑY^[+:Q-Uɜ-o+0WJ*D {q X`-OEuMezsgF`!ڵ)yO6A܈ } arzC*{qnZb8bq(lsxyإp״u{ѣ:3C?6LQ(6?;8 onށ "|;e+ɂ2Fdmó9HNR sFGb|tHDֱ8ؗ4C8j"(f݀b<ۚJ…鷐oeٓ% fRI)$TO0grX Y)w,6v2ᆰ f\YNpDMu5"R:dmhRgfz 3J$± AՃʰo%Œ"AwaW}:yb8#.պ d)v;BR0u[>Rxgo ŀb' [W/ nۈLm ϻMыxxkzqE~uk ْ=I[=L@8Djo8Hv=tUȴ_wϏ3];*Aا0z\'W>iq@ǽqqZs.>~R8©/3QN$qQ[t`[̍+9ܩեzp>SZY sfv֨Ii[{n"؜ns#L(Ү=,F,dO_ IܙWO8 4食#@9#yoR\OR~%zL^QA} A,6XEo8&QTg*D^ͱmxضhcZ"Lq/*xFZ(LʫC2ΐ{B`i|==kxy>NHY5RS3H1Lz>K낑>@Y4/㛭nI$jT`-ⒿkvX.5E<͒ЂF3X|j1R+c2N_fS:@p-ӈhcT=If91ϝD#3 Y5^:ʧ9]=kZ-zlAߧƾdR雱BQ%c@\jA*u#x.u(3xaF0`)! Lw.,F#7,%=.s H,vDQ)p)b)飮F\UW ߰1:@. X7FJ{]; y T\#iE4QAтtK:,R"[ ΁/ʈHF!{Gq|)1놃&k=+ݭkaT$xw++O#z8vp0 "RYVYIKD[ *ٔ4W+ jrJ;,T(W[(zdSbbt"6.A^E2T0{d"TvݫHh=kKJae/Xhi2Qq=Ũ;p~Tud6X K!׷GGzN, -x:#χEqkM-$kL.mrq1٣cg0DT E *j"['L #XI^M˹6륓:n)#Y=my*MH=afF?sRɥ )q2xS;P@2㦢 EN rr7f"ڤ˄/f)_jKՋߪg2Юc&=Ğ9i`=eGKH8=,Ŋ2+ξf+D~ū$Cn'Gd\9!W-*:#没U^ >'0RvP. )>4ZOݫL" m-`5R_F3ɴRf%$t{ K+xWd?Bɸ۶T<)@hnpH\k{x15I˺\/໴otZ$M +DV¦r6VVa ED yB#yvdۂ2<ٓw'f턹ɷΜ=c~%Rˬ BGBJ9'+4%z6T<}2)YyoZٕY"?އ'*fzYErMG#'r+=vHmx薸:QmE76Mu}U=Vc)0ӁP5#rwA1AV7sEB͋^]Q#߉DdB[J:!{4H錑@o+Tt4K1D%B5  gT56w-c^VsgY(Ak>D P#zG'H{Ƕ,Y$f yw {Jde4x1ZC:S64Τcݥ64 [OH6iR\vfK&w4N$h]iwUBf(N[rDp[_0e58c֮jfr2o7es QdڙdOy=I.O 3Cxӈ{v{Ξ]nBOB~stR0wzᄎ^J=)=ap%* т1ٓGo q4Y_f }6[6 |kbyzs}{.2WFpdHjuޮgː3(LQ@ZD!r/r:,+gr]%@:B`T=Nehq9*XZ& 0p'1CZm^8X b pU 0:I*<ۂ%%"D6rA.+Dtwz< ʨ-ېa a;(vBfHoBeBJgVN!A\z S(-YwC|o K"q#u8 ~;pjMZ"i c}x 㖧7] ߱OBW[rnIp,ci&%v'8Yƻ$BwM/V!2Z^;v]{l,dKnػ[Ț]Nj{Tv ݳPnz$C* ԕd0>8!˚uSPp9u]HͱϽvl^4ѽiWB}c>LZ;}ˠ%3 JT|p@sʆ+M-҈Cְ먲֚^WQ–XF輍(2/"bZzw@ _Bu+[}K)Ԝ öiлŠEBXKK ;ֈwGWbq6dDÚA+V[vgY}e9 :54JI'0q"-}=UxdWty^UCvlնk`Sk1n'N?ʹ䓆TY  #ozN;v uDWdE1`CrpȌm`` [zu!fu&\QL| "vJ+nfq(|;*m»T8:/(Oylp ElUbQ8,>o-J.\71Ӷd m3ywXƼ@MݞB:LF 1{۞a&{1K~㈂G/ޖ&Qѻ9-IėZWܨ+6+Ee"roqyOɍ^X?>6F~uS*Q}[uIrݻ`ClA7y [:ϪulX͸<b::]LmDNN$~/;bҩH`;;Yk=6p|ߝ@5"\bOwCW \bm2Yv4}7Lv0#3Mml"OD2D##s\rBcϯƉHxbd1?N6rjBf ! P_xI$ ;j,s[p oH/\חz f"B}0T#}!"xͪ2İȽ),@Qm҂,ڊqLDV\  q"%6koŷ^騽MѬ#Ҋ 3@؂˓sB_qk0P/ݫ_V՗8@T *Y ?ы牏ԗnσp*I%h2wL@7+z\;LoAN\,abkjoO9_YFԸG:$S)W*8 `yfT%|+ar;#aFB&ʧblsW"-| V_9Q"6+KNIGȳ;Hh:q8œ&2FTtȀ([^)eU(;:+xQ_ AX64|cO*VL4׈UNƜ跶;ΧxɕK J'nw')=' l\wP؋O1:.zCGC}h8@5>TR!]LaUu7prx}0|x&Y| # _$G>]:w\A*[p|^'YDLBN=NxyJ.tbT*L QKH*A:\pPv\8-Ľ17hSfBm[eĠاkA` .2Df.C!;+Otd3㊄=Zp5b?I2@F7>ciI:tAuz^mfĎh~p)CoU;j:W9'{eOXY! 8v?.yYhvQMbאַtu1ԯoS{.`*aD'O"t-DJ! ނ_oxaRw7a$#ǟ݆6-K ZfZq,_X.Iix74QgM:P YLV4kqlu~Dz(1S-&1_IӨ' CU'13>2S& aRR}@vGE@DisI#xr򎆁 8Q.4PBy9+׺ d=z;-6q#1y[6{Q{n0 FmEOw1k 7z 8@:-* a,$FTH}xpn"SZ!Ai#îF9Ն]Wj%AG UD*NX`iڢdG$@K8\*k.0@*?;CטOx~KspɶuV)-bkO1n޸y˛hEoXN[Tͩ#:rJ*98:YtjL9A)IA՜ b``Ŏ_ Bq9lIڨ*vcmZAX PW։[5o &hlmr^8< dN ;$JX#E~hZ9*1o V@0P#"UEWۂJ*F ;BatUXB,)\Jfbi3k8>56 O\P;ƋFe4a0[{B+=Vj-5^s5n$6P0)9,]$wŧ f^hjWdUPL`.*=p2?sȽV{r`cQ)"l;fAJ(9(ͨw`o $\L\uԳ 3N;Jf)A§Fw)VB}Y=j[O@٤+N9dП[T#UiNzcXioPi5ӈ-%~ɸ>t@ `߶'zX~W(eR}rv+x;Ő_ԻT66P;82~ 7OA\PK:NFN)<']Ŗ쓖vKh#?W";"Z0\jtv49:p+<LM.?kiH #vǛH oѿ::+jQbxEk]W~;DȣLdlEqg| ^D,CXbk7T#۹n|mIiL*\}?`ޤ9 &Tzt( 0=:=Rϱ=֏6f}S */``$8 x7Ԇv!INRO-?Mhb{Pd& Fs.^ -me8rRP^9pl?_hz} 9x7U'A&]!N\.[ eW{9rLy[tS|nX؇GKIC*L ezVtdzd /sQնVTb;XX(] ֨#p6hZZn.6/ 켌uK 7e&󲟇~S4W)1?ZlOzmVΰIIqo碒]unboag@B+nPzD:kZ&{=}2R;]o6#.ɓB]º.b>V" flrM֐A"V2}pe ݅K 8YIK*A}ӍteS=[u܇]ٕW[^#=t B1Oۗ\=^/{P_ĒRHS/Rb`]&E%R 7ዬ1g dpd1c;O3g|tUso0{)~Z.d.zO.3dfԒ\ U UQ"1CO\`ŋ4V/Rk|PI$Oh.N)b/ـB%V!.l^6^EirP aa=XC76.2EZr{ Z= U%MnMJpOVWgLAtœ"W,9Lr"R(vDR:fJJJ&'*"ILwiƭ* Vl<LaN몳 tx9v5VXܪ`7y ]V S&́2x7k[qiA;߽v|6,2bX6C$Qn}8c*ʞņCfނԸqURǍVB} UR;XA=-Dܿ3W,,ݕwLeM ް yY9k}TOP?rJ֏w2 pc:):!0C|.T3JIm> "/s+y h hqh0Ȁrp0#撸{7g~)sjK:U{47Y_#ܬ/%>,Qˮ<" ׿+PacF*|/P0IGnFS p\0w'>@\7|[a" :`G΍`d}I&z93xڝ^=Hcc8o+FĖIDA2 FO{{BBN9럕\# g_]O kCL-\ ΖeL/ b;̅{1=,-i"Y/5)k2 5jW:Ox8/+ trU\t+ր )O14\Ŕ2 z0H!= k\LH.AOB{z N&_^ -rjm9ˇ'!4 kOJ$}3x013+Yh "p;۔-KF3"/f5L*F+LDlq1RbgQ<LǗ?x42!G_Ex+ߖ.>ݱ] g[mIƜ2LvuɞC:2fmc+oU9!] -R)!,zٍ{p}x߃%m &[YJ!NzU,?ҟBBKKT !s`7A W HOB$K8FʙidDĞBȊG1Qpۢ7<V(vTEݔ by eB&inxP^KI#t>ZEq#'擖ͩy9'/K2°U6bkS/zhe"s6 om ،X;y`JԾzS de:5p FG҄lG/Į+b7 Is&4t3bݨAq2DQa`ӝq3I;>M>=&y0V³H wC9|mąx"JÉlDe25N{qM=<1U&Y;!=Y{#2mA.6K@} T:p Ik?,"&V!Q8P;ۊxBƈU <ª3.F ;21xW$y!P$ stq$j\K}y?<6a41}Nc:to wS6iv¡Q;3c0#ov˕9}وë[*qxKCi\u" ;wZv\#M:MpA}о wS!{۠Gp׷*2"dY?uJ:z 24Y;WnTۼ4̏&Umi[qcF0 168gc'8H`Wxxk ?kS /v;6`4gJGK#ie2.;'wA-MߢxŎF*Fe݈dq)o)eﵙCm1f DzN P{.[O|gN'쾘9N^ݝ{굆S3 ǰBt=yeKتS|mkM" Z /ЗU38u7I;~f2dpx 0Q2|uw-\ZV>ȈFXpdP Cvr;lxp1S7teּg$?{E{${YG"_O ?^@&^k-NGX,c8 ~^j$j/Y"zF@Q9`-L;HT4M99"?J:[DHԾ(+h*D eKGIa_m2U uC̭?`$SMHhp[ȳL\BDž 4ٶ7' 5M;QPdZیp$J!mDR(N͜_Y@vCUѺ (G1Û@Sw_8{?u!F^D 8n֝ic鎊>4O~-o%}xl ȪFDln"I Ccmh>`4HEqLZp䖧:ޢ/o>Co,[#{|40Q闗[ç9E[%3ebkuhFi &?v๟y3RC'C QDPnz5$ׯ/.M/n*E>OD6/wV9?SO顗.?~5jNUQg;?oyJ‰j`tKJߋ ʺa}'1PgB$$y(arc@exʱQO'%BIFIR s9c!/{`[[^yo&k;RCtDj,5Sn&NM߿i=w'e( vxvTXDiID/SHPs.Pot"q\V{m0oRGks$EVCyM 0wrRPUmօTf]HX#8/@=TY]o55cH&C3QCv(|,anXT]I\#%'3Ͻ'l)hbFl`u ]G'*׾$ f7; r"2ky첡S!Ub1:ƿ ܅t>LGρ>M-fV}(޹x 0S%sĢfwDV^d7?@>Jx*2 )Np8x(˩qᾙjn2$Q#&j:y JbX=:v]YP!U^JCفi!`1"VHPuWH yBC]ӋnIN+Hp,<8y5'#iz8BZ VNph3bWVl#G ~/*Mt r.Ұ]V.Y4.qQCj"YbT 2+RޠDNxy1DZ# 'J()0n.t'JNAӡsPx\."&)p\dhz.v fhu8a w-~uPz=2?RlzQ c (nHX@;׾; j -'v=9W0}S$/x I;Fۀ+j[ʳ9:5Xhb 3p-Nxt9PV;Tw/⸥9߾̥Ui;(z[kfL;rӜp>XO[7ĸlȖvWN&jum-yݘ.VMwoo*>}Z;y=Gk;|VlbBD>hg6 BvHFK]ԛ1wй]E W߈fAJݩbzX ۣ6̍󗠲1Ej!8\c]Ln*-#Ϩ( ,ʠZEwOB%#xOeJ IۉF3D~6Њ˃a]=xR-h̘'* <-I8kT|'a0#NZ z[`sP>S,~ɼ= $ׂڡ7 ycOux0a E&7E|J>$u`fE%ؽ:-D 7r&_5kHoRM) Y/d,^Uw ̑bDV_T`R>rN´VU@Vx͝ OPbIiV .eJyVl^~ҷwdφlP  ?)S f lLڶ2޾yxFBI/?)j b 2q3B0 e߽/#a0#~)Ԧ—xDyb@_-O&߿o츨-m6( H ok|uv їN(\:N\|6_}y wv*^Qsڛ߿n>~AbP[ e(rd(؂

5,;v/ N%9!QP vfCRM" L}"xJlW_ݝnOrW`;ɓes/sKM<#uҗĞ,cc7=ݏxQc[^QͫR4|䬻WcEZ(ZI"Rm</! YG{߯8 LgM<|;1QWߥ{ls@|O]mu8DZ,9#QO8=bdt=U !n4>-wEL{5_DyGɫi>sODa7B_sЌa!o/l :8b˴;f:2tJ*8I<.{c: /rV7l_=siSrǥEVE"CeJtߔhk޴rܛPRﰷ͹^ 9A/FgNՎ:}mnIVqaʊc)lX} Mga% jڷO?nh}l5Mp7qo_'߄fμђɍYX7~vz$>spRh@b0/MQX *q7yb]JU2Ji@bG[geAC["*dyF+$68_ށhVO>>`?D0cP=Տ`s"3W:vSbImGpF+Wq1c[=+v/r&!o۽wJ ,[|U~T)!Rn"P#ς@DIj#)\kqg2/yIOq|{6څn"A .F>ֵ̈́7b)܋4Be۫ x0wxK>$]!@OBoOkO2,Kw=koETJn4V?5}(+bߐopJBr_?K,JAITBO/xZC ] Q4kN`~H:;Wڝ+1J+(锚-( ~#JrBaZ: v!yB笥~bŝsX+D{X vd܅d^P6q:Gq:.| xlXZX; xPG+v8NćC:"r(vK:cAFp:^zCiTiQ]Nᒿ`F}דn_!<3't7Us uV4be||{0-F)870!g8X a˔]mzho|w=sciDg|v]8YZʍ6\) l|™;"y$8"qo? _=U0bg=^.} TۼHZ)V? ͨBp%n1&.\C'!yړ+A\!_\ apJk'oQzEIN!!8/2pkvWyUqP\K\wC;IJi^[P=y ';򛛹˔kQհ$g>rpd{*qɱ"0ʮ bcKkuv-$FQ;Pƙa(օn~ߩvu/ݔ+z|w2mXg/9k+:\psU!g8 k˄HԹLiYU0fY ^ke|H`^P K6cKTj{8xXR~l Woiꔃ'нBO >ZCNZ&]>$sةP})cYQTT0~W5[sT.zhVGif.~nl-~})UJI`S R^ܸ+u] ~ |'Fac=xBPyktX5`@Jg+CA+ jfP@[8FYN>0P><üu>KDֿjv/>6vwr?$k?) 4P@I )>p@ts-mS|^i`47قǾN>ы;[\Uk"hXNs|X`{C*T(YM-Ls8%Un|.l ,[qa<҅:RE*ǖx271S;d19[/Oүk)X.__HAzЏkO>n}-f;k=t,F ԅ!Kj?^&L_m-G5Mb\yY{j;Be4_׫UP/︚^G!S _?Po ,ww#1Zݯ7j1ݣF1x}袊=pp< /܇}vIpfTbtxzF `.{ݡASk/,O%yaW$U;m4oxxxN"Vj]ѝ vNA hURI'V azHUۖf1n~ǘSMO|~1ޔ{,yaDXRQn2ovtӈ~0װ*z`8\y"q(8d:}]zH=*3M<҇i@-S\,?cM&ds/@ᴖ.fP(Uο~o;d*xuwaո 7[ n\ja=6A(L>)ti? f1zrJDWrC^W&lxMڠɢt?<.Ycn_!{2yA"+.`eqv|h(9,bx[>yN )-"A>f}}hJC[DU-p 7t/'A4ԇ̃3г|&]ܢȼJ>CWcI͈ k%"x9H*Lc tC4V ?E.n3f4Ju@0xaῤ.ruKDk"~`GM0tcTYqL%GvDKK.2Ck~,R2 LZ+ Q/Ȅ:^${vtT#T/(1#t̷ٰs*ܯpqsy4g<0w'(?ܰ _mjйIv.X4JL3QHUrsVh4b{ŊccЩ\WJYຍ)"''8s-}q~/m&&N* JMXpoɿp̞fLVgj _ʵtΡX;ACcjFxL@dM_Qwa`ז©`7)E0lS XAUAW-8sl¬۳đ~8:"'T;`q}U 8;dܸ_B*]̬%Q7\Y'# p.CyTV#W2}oTB*7Ox 7Hh]R|L |x@(Qa>[|.+`N6@Ӊ1PDR&ٴ"*z sPhnA:љ kBD5{Nh{ƙهBJ/"WЯ肪Ab1GVmڡg2T"r|&2 Pi cSc.A@o2gGϪTx(a>d'p3[N$9E ,nml"ȟiX?I\5 nmkDhƥ !G4Jna$e3@\pvN N]fJ# DV%1ڪ{Wq"|Z`>J^nX;C}c) ,k6PB~ FRYgO}aҕI>+1VD>qS#)0fǭ^Cf/B X->1Ad\J T Ard R)7j}#N>߬uOBKV1Sc3%6PEohV)[y'3b!T7ǵK:1#J!+2#pdzMX]k؅žc.ao:Q޼"d`?{_@RiRջV?Fhwdul/ɶWI 1/SCMTQc۬JmTz'իk-C=; ?3j8#4–17^!$=gP!Hz d_C"XP.37Xl)A0KtH+I]qODS@~m! )#l/,I& +_|1Z }!{hu;(Tg;g]F;mCgU2(ʧGmUZ\/T* R'KțRI7r]1"P$ /r myi{2Z=!tU ڌ5*9BV tփ "l!wkQބ c>Pn7LtT*Q 7ܱG;s}Ư̎&},3]3Ll}-[P͝sIا@Eb ;j)Wy=FnT@2蝰'\ w[?8' pQh5>N# 0^pK( 5booMlCtq2'rI YY b+^wy]A-`lvX8i5^ ^:u ˪-Ql0E6g1R Yk:/rYi*=`"6@y$=ŇxK:$~tꜴ>#2OܤV==wEdre|-uB87:ˁ^ah=;<Υh!|[yqP2FŰ> e-7H{=1/*ENҸ>xg*q~3J #J|z +M)/T9Nc30c\ bwpAWi%ѵ͞n ǿ2$[GBІ  t w^IpbP.t׾ۖ[+pCx$ίlaİT5:6.Y\ TFH?AyȆ#~K}Kk1oYW9nTv VB\Ď ":c 8Âkb&t"|}S2X E,. 5ZTՀ=\(D6 3f㵱8ø)Dl5ŘjtWT&*5quBiɉ@,j,ast1#\p9FP@G%G_9=_I^D}7i#S.kF u %%dQ~=5LUsNC R*‹]l m!Y 21Irud6wh?!P'Vv`>?`G|@Q4rQZO/#f^jD5WĸՈЁ^~|1FѠ ڇ#5XvDO4q¿B7KyU[.l8E|6}MeH%ɈR^<%BD10~)<`Ii i WCiP4Bd`L^qFq(zfƾI]r^9pbv-zxZ F >l#Wc!m(5X=c{@Qcͬkע׎?n͇t2,dƶP| sov/$([Ǭ0d$+J9E{]qjj?o!\AI`<e](@cw5bbԩحIbI]ť6z􋡏qMݢ^)_. ײSߴq/1a {ŖW7D5 Z:о 5W۟ǿ?on?۳_?ƿ]6_T_aǟO_OzfSIB+Y$e,';NO|gO&'p XE5%f=`I>B9(ǐnDpwIڒuv_|qHi:Z$mJ܍612N^'df8fWVBV1ļh$R*]Ltdub u/82oA vKTI)dᰟHJ\/}Q0TJG^1H8`>d](z}l$4 gKK7 H+" ^OFKޜ\Y0K BV\VCEɠ6P s 'Ι$ט!`+r аJ-%UaBxq0/Q/mrqGg4re#=9#&ўIZ7HAVP,J2&N%ELP/ÌrzAolZ#5E5͚RBhASMk$k? v- <, ڰ'hI 1D1Hc[X2o`"|X5AΌq9B!7Eng<Ī~y˲' I%oM3_ٴ`'pI )VaI 6/ lKBO(0^#X?V]W@VV(t,xɈGuلV(Pwҹ 9jNLʹ nub-;Y]tq2NecDmOV {L^0zTL&:,c8I~T F]s z6'I11 X|}뱊ao^C'A#ϱtk!0pC'*jbXA/`ą\D$Ⱦ%Փ\@Ӎˇ]p~ÜLTڊ 7q1< V;KOBNDha!^(MA sj[-`EWoDj$-Tŭ.XpF6xj߶QMZ JQ@^d<*5 aއHb【Py(Xj'RS+bYIdD.Zwॸ/>vT| >Brr{B{I- m 4&c# d4r Ua_vՉJ_1c%I{p6@/@:< OQdZAn;ZM%l \/<7N(~O@g\;pʨMn>Qx=DP݌U'ߦ+ A@(nMA!Ru9j*bc1y=/B &`AebSz@H>_Es4X etf8&sT|7Ztt֬5edX ?.}3ԇ` fl/jPҀt`zDSK[B{aIlC]؊ Do{\-AȘ MIUš͍\C7Iۋ}zW隃(zrde˃.Ղgi>H?I y%TFRLP/_@JD/L1.=aS>H.q&!Gu╅ J!ga㹬8 xPYMo3u)"R1A8ua$zɝ+UQ  ODQ$M}Od XP'.E2@ + :Ϥvsd}K@r_xP)$iQd5O߰.!".}@t.V4%( }f >OqR2mbl1Xmbfd=,q!ݐJk6g9gb6a%c\w%j@ híъ*Ħ)7Lyܰ{1a$=-򯊛Ca*XHb?Q0o$ yF}kI+ƹ"tQrBwy$~t\:Ë XVЁ\JztdCqN@峴l][,NSB)u72Y=lBEru;Pf1}0_XWVbv$HӺNE˥"Iŋ"Dز)t |e~F~糧@ Ha U@jX^CUW' $ũ+.NSx-BBǚZpؚ޸qpϺ ޒѠrT- 6ӊw_U:Pssu]LQr^SBx_Zƞ7u䇚:u}g^j-5im`Zh?hbi)y{Mu׍RZJ 3; } XJ#9oQ(ܝ|_K: %H5qFwҏ;Wqnl%a ;} R4R?Mc7 Q3.H6zdAyVNK/ͥyǴ y;EmqC #0/Av^j2_GXa'uWC/Y@.~4~#gp H)#bUIRJ:Ĵ9F>OxZmMp\C˂䒇G%x~\&F79qP pӁ'Cna1f٤\{:a"fbPf'FA$Nۇeԟ'zcp*o䌴cсʫ}^xc283SU55.oxC72[}r/!Eª=prX˓\:=Mݳتt{H*//&d }`rn@,WG[{뾛2ˮ+l<"UO1Rv4pX~=prkN.w#~4~&aNlW;U2@WU]4HSR&o׉B,dZx'HDy9׉Q!͉hD;;HD]V9>x2JkhTzX #]$oZޛ`k< k*ZHVttJ;';* ju3yQO?r^rK>H~h(ZhC,\/W}#W粚6*JMrBRon\XNQM,g:6b( &HۙAhU5@Wf#gk19W 6'fL0ezdľH<QY\ɫQ73}-ib:Plr湽`_6_-l*o*۬l7I.8t0Mk%syM'4s| |& p-Jll !i#t6뎭T<~z  oL|&~/V ^ƽAg [ e}9MMzriGA,bik >1KN剖9)5IP 3-Ei-TQRn.`ʝ#4IsBoavGA aB~EM-iBe:Bm6716塸6U|PHPC[җH5R`6+RB$A'`;֜pnjK>g.9h ' Ƹ mW Ҵ.A ŪKҤ' IN*=|/ZYʁ{eU, ͚ҥE@X.!:l]jo$^m W j8Zĸd~Pc#^RviB;-=}<έ "~Z .v8ċU\b'*YF- ΎrD3|$j2SĦdk!kljca |Vq}3,%*5q_nR%6hOHGÈ]ʌшnE`uoȞ/e{=# OwV^i!3H<s&d Hg-o""i_D_C{;aH#-6\~D 8ei+}~ MPв-3m[=dRgv-uΰw 8%@hr2Qi16<)*Hd>8Y?؇6Em`0-uBdTyEVħD2Lbl9-4-XkX$@@J&!!cAxJͿ'+ɜ);Bߴß BpYZɤ9L,DHSJ ]=t]x#]M%~ɺ!u;!B )7ƽȊ}2&jWܬU&0'I|?s?x0<-#}E0x=[jZ֝EPV^F&&^Kb4V)--@GNUg֖cx|u|saNL*IJZ QIl`4> ï& !>1壘K1y.cRRN9\H2ZW՘JU`~h]EꑋqZXy @qqxte|igb,X`Il`բt -<j"ڂ։P)8L3Ǿڱ:K{+t()*uUWg.&ܾe}iħ;v-\Ǎ˫)?x (ղXkFBRj %zQQbjg[V%Gv`@HOu#goF-v@[y"5BNb @ }WhYfDʧcYx2Ԁ9iC)n5W$B%$Hl:±bKЄԝ*}C Y.TS,KH6-#fbҍBG.W_КW2)Vpe0BN7zh a j([ށ&*\u!A@ O;[w]GB>O{:.B7bRHF-u-5m7l*xJf-q4cݒ{ܼf,'{?6cqSr(> 8>H͋d,(79(t:7IJBՅ65[pr.gCHX, I[.l1Rغ?=լt:[xfQ6rQA hih{0n)@?u*`wM\b± F)ı|,Jr2FWG/&+^7ҭ3J ]ƛ䙬GDZ^VVvK_L<E^-c#6c EFWsjAԲm ]*jz-2d|_3/ooIBBx1 y٘oBB&!$/aCLb`csU붺U]ۖ=P˨ Hc%"QYNJt> Q @vcM!xBu-¦xBkbѥVf{I8u\r&Ŵ!/=}5H lydZ`QA 7cW$q߿2%l,:1d-.m"F0:NI6.`"뵢l $PX2:-za^gkBcrЁiW:4TKZ8vL̲&%Ɏ|y^.f*Z X564&)S#" BZ0q qBg# C^%!A3 3669n9gd*;aع 1jח$βr^a>i`ԓ۬uE+)%=6Ai).(g864 Qu5$C롪&\ă ߄g\܉p Jx E[LAt+dJ~҇( ,_A=%KӍQRR))S] #I6RBc3 RAJlagN ;FcS؃Q'x8E -buN7K{iX28E`؜J2̸p %<[pN< B+ÈL.o{0R CAk0 mQO!dp 9y)^)rRǑqJM: W(tHĴ,EYٲ%GxR;/BaHt^&Mb1;JrbR_ʳ4?6ݼf2PVa ٕ=f(iCk^FopεC I=:RW' 0樚J$ l m& uBH΀ڻSՄ٣iFV:CND0t 6DnQG8刯gc6wu$yߩ[OYe7؃um6e (]ف BȜ3]F]RocM-K#ıX/"|R9H{"G5 %~"rtNmṊ\&hvƜiR%&[.eydVdBR9Br=2Y"N@%tҙD&DrI82Efa< h7JHƁb lR2¾T+!)(y@ܷYx]BPI8"'Ƃi+`lۄ}bAUZgvDq>zR[#.K@6 u*m+yؼ_:3H@#a\ePL3A976!W*,m !Φ8ƨ1pLI&qa px cJjD[U)2A'W GM2倓4:\i j%Ú\eIR%q݁o#Feҥtt@)ҘӮ؆,ZJnsi|g]+}הZ~;L# Y |NN8hZ"Q c"QߘƗ̬%XpER30cf)):,)d1=U#$ `.9UPfgFS1Qh9hʌmn$[KNY9vqڒ03e"^XMg 'Y,t<m,7l}=oZ9W rGā ;?1g ϴ pt ǜu9>;4,X9I*b-Xqjڀm0 '.wiaWgc}MX^+-,4oҫ8Q+)+^٤uva&^vٶdsɇ̌}aUH-r1CK<\@Ҟg3jpGg3ydEY(ّiz՟qHo$%'֡y)ߪv0@INũ i4k veӤ e3+Iz zr@6q+1 WDӺZ@!x#u2<{FYspdG/nFZoSLzi,Lb'hӂ|qL[ȩw&<I$ɞjE Z6w`xSqS?}GE@S.ObzG5+|e(/IȬj {Xjy>#[g:9=Լ A3Q6r<7hYAb #9>&Ű]ǂUBZ~,[JN V[~T 4 -YC)p*zAJeTx4=A5zY q66:j Գ^Y;S_L1^"ܺbjc8C:Mys+zhgüh-ȡh1ԎN将;s6ifO&ɤ1w*KT, ڳI`' pR4)Z|4NLT\Nht̅ ȅ]2l{v%F׳h2c'{K u2-gmEH 2fTγ$j2BX){(d.+ExL̩ƾ*-3 %*HPk߫SR(2j6]t }W+]omFa U-0܉DFx-gD(4M&(lP6֎N9.BF>-|496nPG{؆G'D-C.)=`X{ئYi@Q~Ĩ:.s]˹s]/'0eXTijiRmR+w+?e;7&e JH! ͜Ɉ6ǏkCT=!8*'%y mҔ׾M*Iw 8'BU9"(OY= b9~y<ŶU37\* O>sy{ sr,g1XVgWNsT{d[uVڝj:8;p{w]M_Nzg׷(nxhf TzN,1~FndXLiC(ҒYLQ.A3(*).hoU  3> (ƫ)'V)m))u\b&Q`w*["!%.. #dF-⬒|DΠz--aFDeE:Ji/O..qgIKA+؊ %)Њت Y7 J&5#T Y:a+CϺ'En'vj \8;M87UゎZ{i&+9?Lȗzu*,Xv ۳KX!r:n>e땸zR8j+фΗ=r&R@([ Ӹ9TFhYG0Zn_M"-V2NXJYn1B"OYI3bRS-HIc%%"c͔ GR8'XjQ)K1N+ Y0 m %8Ցs1|%' ]mmc6k2Ѡ`=BԴسclg=An8'Uqsm@:uQЪ)Z7,O:'Cyӆri"udBJItgϞx_!m\w :hJEjb +)`6yh"J@Y_J#Y7v<Ä3u;G^8 govmSy7Ԟv> ymݹ}ΏWj[uRJkf˰m3{=?[:+ʩ} KN{vŲ-iίJS[lJ a xl[|B>7!`RGҽOKONw\}n&w𖙃'3j)2xkмѸ=}ٕCPw €vey-=thjveu|3yQɽjlybKWض-)go.nZjkyl\S#ϳpdvyOE>3vV+kPD23=4"45l>ń"q[wdQ+cٰcեKœihgjw&q;kg&]l-5WK,}b7k]nv6i=['j*9tNC+9 ȡ~%r艥&pu˕$:ZDGR Z Z Z wnzۉ4!¨}2S@aP͹dDy Էq|~u :=mB>5fvr9;:y5WM9َit9:6,prOMTW3A9MKmԻGԻ;+ӢxֵuLP״p-r%ٓŠO3)ƕhUƣ9F'.w#nש+15X܌$pw3211P<^9l%N0n.WN.VJʊOX:8]-\׉Jm;:ʑk4Peh&EQ8&CMTudqMuZwn"⊶_\j:`9^->xEWbFs%f4;&Mk7KxL|kwidw{ש32~(Dӄ[ Ab]&ӛOP#Fge'G'?JH dt?*A*AmKٝ*+vĸN }JFn:tZZRڌ'5GX{On//7g[ ʭʼn$j Mnt$Ik^WrG>},}_'Lp: Tp)MRk #ofdC7)ht {bS4nD?nr~j'󥼸'aO,uJ̊ZkVוn ;fkA c'u"P6sqM9o"\*G5qMptbm4Q'ظ<6goΕgĸvFrM,[Mn+3όkK-ҭ>ϹJ2tOU:jv vG"G*1 UTH[W]BM ~H%4ijtnGRtF6ltwR(J2I^$I.,vk>b`YԸx2durrRd}w2oqd׭-q`*vb }699ɕҩR:UJJT1I4P{NҩR:0JT)*٠t-RTi.f HK[iRTj;$lPVa>~aJd0%hBÔфduJO om2L0Tx"*U'ƥFm1msm[zc's{irM"cL(1zJ*腄NA<5WbFk܌t1)8{rkRk? 8N\qf|6 "Z"jt,HE8 Bc]{G>%11T#|o)۞+*65Sbj'[kffۏkrJJ_d*ĩdJ%3A\xT2%fTd*L{OJo*$dPh\iq3D'2Xjή4oK.{X&8URI-6Ҥ^cLRǛ˭ZZmufK=k%uV޹L3b{l2;w4Єm̍>](1/j=y^bh[oN2ِHUWyFg5<_cu<`ԒY'D ޹jDJDJD- UEGf+Qtށp gclYtyVh%n=Rɢ,Zɢ*նFKMiB`ʣe6tsw-5KJ~S.D~m. U^c*ne>jL;1t};]|s5uS7Q//:4mwjB/MxD'#f\b*l 곀%8#; >,zI̶[wV悭AF';w̐lhߌJIr3211G]61txr^K`"\j\hZT㭏'фń3b\O ^_O2-D|Uv2X3A*&gw6uy>}']|Ic)ΞUVKYF&.'}rNKR~hǤś&?֕owtvΊ*$]o|6gJ6L(GprMh)ޱW>[ N *Nn@IfQ"2b~/vM-j<^b'Ikk[Ih\R-{hX~lD5vv#:ېࡱ:)XjvORf އuM7:iT9<3VʜJSGxp~6Vn8GP"ރ(oΜLGA3u;GBT]Nݻn[~|ةyV[z -lsݫwrgzx.vjJ1p 8JE:CU&!A{&Ѻvg;>Rw^`ڭݫn߽+Q Oq7Py84BFv- BWkwA#wk*Z78jk( #(] #n(?IjAC6 S (M OA/u`A!ACE:0zlop0b-F`! 5#kCX4ch%54C@QC Bu,@״iD@7?05S*%nO!̵ &o x`i> mN8 HG.1 "؉$,R>LO! endstream endobj 230 0 obj <>stream pTɠ - ))y. 8݉]>D&`l' 6IE0 1Xhp* 3³w#KFe76л]8¦M6 cYJGn# #1E ң3Ͱ$LjT|a nM i1,f;((Ib4.8|Cbʂ+"TB!1>Bdh!†baghIq'!a"0=.%"I8p;\h/Ŝcj\N~XOJPkmc y_k|@\8`'74)N\˄4 Sgx&p瀸H6 gƀAFa 8*2>tOgb-!Ujc )pA@>#Y2%F1atdiab-c|ք[i!a«'":f&M~h݇qL<$Yt_"O<ViY>ሸZؒ$ P3#i!j,'+U`,@+}NҍS䮲l ܊ef|D|̅Vؠ$e'sbOn/~ y"Nǫ<"o.mXq&#޾ L q>*@["m)/ .D⧍(X^fœ 5N$u*p"AgV:L8'8xx]'< /7BC*}Qo;uae\S kiXT5(ք CdT:E<*xE3hd_ D}34BZ 24nR]j>b_?NŹy2zrṚc5֞%Mߤ XMбDG-mP)58#"TPFD7C2JVWπϘn%!Vdً`88R$&,byteLr4~B$W wMJP| Oe-'Kj9%.4QBz?`v54TK7`o2,ѩ@ɩC=b։Y"D\Q;4@ dFJ˳>ϷK0y+2:_X&@lCĹi،[ ZneVN6kJjl4/nN9bP !eLl;4uJrD^N3PSlv7srI* #aQ E`({PKKT3sdp jѨPkO:/`,qN0c9T&j}fQ+I Ch( şÀ25e7"X {_8{#~I Wҷod5iļP(#RNhPAz$n!3F%g+QtFau·S⮧%| K#dJ<^Hm>&TѠ8j`Q;rWvBv=O9ߤkf(nd*ChK)Df ¸\ٝF@e=y~i(pL)a>BSh# XxpE-TX T1SB:(f5D"Bz\$Cd9I_(ֆ!\BS∄CC rPB'4rE8wQh' @%NȐN,)x9tlЕ$& @EEFвNH,4'IE .ʈ*[nՏ| @HH%YڪP^P( Cȼu .Z;DEԊ%t0*F5a5ۅ:$ tSB1s_-Č,a}&-jXI EF#"2MS|J&0Fbbf5MSag344"͜ɤɤ isfkQΊۀtx@ON j܏,me`aTe^LلabQ熽x" jk#OYؤXkJmX0W~YQ?=aP;L+Jeay`6i(5Ӥzj=6i#j̠_2&r֭\gz}{FCDv!%? i#RfO3ZJ"=&26dePO:dJX3Fut {Hh0uvVe/Fctz$#B2#Ð Q2!I|U%cwd }'% 8T gF eb%U&q>RI +G-;nAbȳ%ŘuU"MEu4 A .hvɴIDl?G*d!GP-!&GVҒ%V%)" /Ҏ8GdcK"d&])/jU@ 5ˑ!)В~b)Jx–Q)QOMŨh7&DzLO06A}`/նbV):@a#VQʸM!"Y;FM>P @Hr5Na!{&*%=~$Sg1Ynquc{ѶEhWaܢ;(+T޳؝Q+𷶙@^^lS+@/-KƇOބk[mM߼D AUhV"g+V;'DeNs"O EDr 35Ȭļ;<@GMl`Y]PJaRʕ>?=+Y)r5`!H$$-$!#S'0e1dS"/$ĥVr#G%p׻bpi%wg@Nvd=ůJSS[˭r3grIP i Ցf!t&p("2{ƔrYFVtF-,l{q*z/

d||k'&ofԡ<ߡhj Zjε[8/u!6z&I*а_X% ` 'Ђ(nxq5Bh``ADBMZsU'㒇)w%?O~k_SW]龷緱==oݗk=k)q]9{?hoKn?}18~ob׶''xΣعƟ ۮQP_-?3BEػVqk5}o=x9{߭-,==}xںA<ѣǶ:J_mG_{Qf˜2gY/sJ2w.)gN/Sz;8u>\]L~mрBڲph0%ѬW9ZxsΡ4v;shS޽ץ)6\t>%٬> gܧ zK׈N՚b+QPSa`X>. N α~ʠ{hWI#hxSshѾ:z% 1D]]|qH9"wnй),1;ϭ(@ut6`[jWW5}wgo%9r|tOkn S3jvPmmݕ[ݥ98󌇟\Mf9w.-B8rj5!t;Di>@dDǐϠ_Ԡb=Eގ&L/9n5|vs1V)%lG)ľRPT/tց{JdLrӐ>zž/[w;__39/~?'8 :a#rv;scCFucRxixKSk;xvN39'e|rxBGܧO=? |/ c?v5^\l ?^bsk hOZ҇6{ςB;o=J|_>?7v|_ݯޜ}4[@R`bz]A;4'N^NϷ6x$}Tp<.F3D >)L2Ÿ1~ƘdžY_833 cÇtب!mH=#}:FY06vH2҆c1~˵sc' Mw{svs?w s=Ͽk{͕}>򫯏_w[o{bυر9{o~__ݿWyNs}m>z nS>0??7yoÏ?ھ;w]|;ʾO/Wvڟse>O=mh~OwƗg8o?}?6[_{mŗ]pN:{O>~}s~]CGw*^yO}5ԟ|?=W:Y?p_~`wB }sO[Mlk7GlOqs7;ysc/2ֽܮ<3%Od)^/>{>]u >o 3O>38W-bc_CB#_ß:dp$w: ~!o z'_ {P?|ox0ԯm^5Ц74 m10\(_w,3᳔ HW\qՔ70`&kRm~kĎ"GY;b`:\Y"jaԐz" }ΜP,@ Ibt8{d e)wtDE${p8DlG}3@K\j9V ޗ6)d=ű芏5Gc?qTKw0ߢrCݹ4%Ktp1CUv|:ʧp,l>7`ic${!aSLЛH?̹WQRknl{qY4@L$;?s.BPxL&b;/:?J蓊˩aI&Il *1_8cn"\ *֛56TӜ rOcYO*`t( @pSZr(oR!1mUnI*E{THҼ/*"< wSI; 3 RAtQ\{('v!Qh9j5,ET)aSnD$s5EUOCH[O`fBc$XHQb G5sܻܷ8wc Zُ>䋛/"<꿽 |OX~+=}c73>7g_7{n˯ /^ώg>gSK7>ē}hxgһ{]ݷދ>F84g~ }xvތv#2y']g#k5>?Ƌ>9WkrÚ|O~~`'3_ jC/ܕ$YϺ?YCt:~N=?V~K#_/D{P3Yx/<` u3Yfq-,3&TiqaDRR9i/^k2*p XP@Uq\52;wcQfǎ>ssP;㣱 /yK^v5{uUJl89+W{ ~Wswοy/~{]کc׀ҋ\r~s_x˯~ ~(hx_>ǎpy]+U QpCG{/<;ً{tnHw+~e{v˔0W6t%^]jhc_\]^{~7^ ?0W] /d׹{&^nj_{v^]- AWv0x#iG{~[*?Jn|_h~bX=nlm/:XYë~4`qu n\Uyzιݥ^D>"8Wyn49ѥА+_I&#sv ^}^LnE]׷V |e/fpŗy/{ \]@]pK.K. 1 ~v: wVfLC(u`+ic8ݘs4εTufʻ"aymF$E CUqG9֕ThXV # ^׋7If `jPohEnrCe \^^Ma}[j'=_>w@~ozz.7 x8u/p'~ji;OG~.}_t#MG^ntk)f<τk5?8ↁ[oBoX!:7}xQCǑxLwnMF {cx)݈%^j"dxciIcO-֫iASAJ5@LP'Fa_HgD00ۋ$h:blz$0!}n,Kj&t&ӵ{ҎNΌ}DS!*3'PQk*H d`\mgv$ Π #YGR8ͬRFe=xQ"ⶾ7w7?ٵ:_ k|u|dªjM[vSO_"D~m3oqr//<G2lƑ< U$~ W#OҩHZeSQ^Rn8z)I+ 9nS };+ >wĠeD8F٫6]Xvj'Bwիsڹ[:\Yi-u̷;KZKgwtNtI˚_3Qzp= u&F `fBiɂB$U@J_呉)1A@Mu~//6 l`*ۯwO`uyt枴}]v̰zfT}ɺ@_i"!LeR x1 -q h a&HTV8tKʔұL~H3Úy,$ 8 \:IA/A,9Lje8P.GChj0 0(6Hi N@0B$ hiR}(=44tlY~_)V*  Сxb8ꘐp71ʧO5\:++^$-l`'{Q`7h"E 0;)#~U4NT¶ F#*,kd Xq6G2~|"& : 6Cy 8waGG!\A"_؈ Ja JA@8Vc6O+ edANclIE3JLP ^9C"K15MF!puA " ;)CE)E\x6cTOw3[@ > >6pWӠdt0cI{xN ރB FL,Ht0ԀcI`3}hAxM$2@gnvVL7wݶHUVOnmvwjG@ނƗ5v9?{d{VﯙJvd4V>M͕Z)B[c+Ođ{GڳYoxo(x}PƱr<\k w׎.o'rl94i- y*ߞd3VEvt`Ħpxd:_ǰ' vxZǠɎ$2tX LpWio}*?uC^u'OH)oO&] f Ԧ;f1i )4<O暰C&;%fq#F"Ccm:c5fc&!Cc&uoM4)8t&R+ǷbNc5!w0p@ G4(6r9hpMљ_sv69 kXvO5?%0qz`S& fwzT"s{ $:-JL'\Kݻ[e%y{jy e5jbt]:lЀqFQH.FMP=Q;P۽/3h5khh3+\R6|itaY[j+T~e$ƲƤwc]V#ʺк:w7-n9277xcwѮA\/f{.#c r_wWFZzl4B:%~uVJ>p4>?pKgYnOާ"/?΅ʌ6\P~i"Nry_8lAxvUuEoY*vԍwLal/QGSEn˫K' L_je뾕%`WNڷtⲝO24=,[-WwuOku-| ۗZti%/7S[C<OD!e+, G4 :G?'s)(vxgW67 T~e8S[z|wyw[c+-yaKO[[ep#O5o^ GQ n//7O\sò^Ks>ԂYu*IG[Kˋ-bq\j.,N{ݜo5@cK{BqQ?w|-wrqvyiwEK fvG'u!u7Óݥw`9*r>>)>l t]QW$iCYxƅPQяԯ?gy3 s'1}ϼ1y{0=2;[6cTP(CI'JAoa^p3:f-)MM0~㤸$Lr"/P6T>gps α$:XR"۝{X}+T^vOY&r:y^fa+P1rTQ~KR͒G@5h#~>O_W诤$ ,>z[_|=U"ֹ̀.\:(#3?LR\"E{_aluHil KY1듣uqT1ÅQi驔53Ir&PP1NtNZ*d6Bf*l96q C}&gS+|;2sc1'p5eh]ۘ! [g-Bb3*gCnFad}YӶ;2M7dQ^*xYCx`Z % SD[֖X sjqni,Zjt΅s %,b*X%lW/p~5؜=9&Jd'b(Á֚9nw,bsNls5gVy ,l;>]lxuث{b-y+oI8Ǧ=8g^{dy{w@)54/XíZ2Tϛ"T':CN9c,)!`730++++qa-US8Cl|79֎m`glj@ݕ*n*nV^^ܟLݟƐRIv}:)[W`Ø+L7VZ_e8;lev+6XL)'ZQeU .H8#M<<1h axF8/9)BdPFɧW>!BO,67p1nS[T'ST@)fl3g s_MekWb@ܗ :c?S{7ث(3Eb"T#u2Dzmɧ7*{f9*fbr鳊Y&YUXw}0 ׮IgdFrpZS ֺ,[fwK(*q:=}5VE?69*48jDv_W,r"o!}-^g .ⴐoiņؑ=*h<؆2TRkL^Xڌ{ʢQ\ފnA[ym/zGΞK*=gX9+=疑EOjGf!"00۔t А6DHuU`e^y}4n#lϸ \LIegkgw:0~~ֺ7":Lp093J Yg{a]$*] 0%5sY)7F1ʍQnrcXGn,2u׼dXWf/du7/i~'_פGx8cS^0ɋ-|tyMVl15kv5?XQ![Q[)1bJwTze+;+QIΥ"Ϙ{rKj-䇙6Ks} @a[#i$ߢv%mOr}m{!$cSW[㬁h;j̨yzH].d'7#ak1 ⪈)83VC'õ&-V5YB0} v(3ɋ_Eg|U/ak'ϸZk?|˸]Dvmfgmf5Ge\ɢ)LJA Œ7$1 ճL\vqEة3 w5ú' f}*![RmWgM%6)!S0RrGBK-~Fj,6ͬ@E TTKhBczda팈dcjڀrzYY z#F.2Pq =ݾ 9:`'TDޔDD),&mQbEtV1K!kkz7^mbp`ڿv?ܨvH[n3/d^ܱ0"%Q@&90A& $xq ݚVhQ|caDiQ+I%pd "Snt[ÇeC;dd|ÒWϾDkah<5HCmfe;nh)nG)%ஶ8Y.)5Ж{wmPS48Z; FɗDdEvӮ\ O%%m1PCEtL7of^H_͖jÜakb̻0aJ/v9es҃ë8(X-ņDupHg$Be~,OgOkðB8Qn NeKc$&֏O!Y(4VGGc?b% w8`ל$[dIIdIp>/߱n[^b.๝=w`W'4 ؞>_ xT oy#^$R [bֈw+BCά4L( eZ"~J +rYS0R*۞Wr5D,֜dPu4Gf6s!)}=#\fHZB~3JES ?I:?xڿx*xS< cw%$NG$YTd; (!Ïx9N9C}4CdJ@Wp"#fdvddا!m%^NͽڈNRybNP@}j^-hEZk[WыxErZ6 g/.kYyϳK1%W}q]AkUX@tޞ R:Nw~]԰u!ZZx$.}8+'1U4,c)d|sF5tBE|ބ/1rF15ܿ;L:]h~ØTڏC~jYAK BWV\.ahu}y^,&l0s"}pIdF6]A]ZL-dqD9igo &lF\q+ Vpߋ'n,#,wǷKUgDě) WK"] ;V2C.S/; 0t)8kn Ac=EEL׽ q_q0^T){I_e,qU$o2W\"X-ZEA[>>A pFquALxM۪aeK ) 6yERtYR[t/(.X,!YIdٟ?\l(ChKN{Wq0lj8Ù>b E8tFÂI)U]dUOƋ*a)5bSO&_|Q|lm a[(b\PQ LCF.>蹭y㡣c X<: Fn~i AJ5m?%ljqZXRs$@~brt SeGF@~zC[b^IUwYz0d˪|![%0X\.{H2eb^&ѐV d,oш_rң@VLzui,G`bY%Qf =HYi<먔5"M)I!h`(A_Z-<Ě@ b~&ԤԸь.wvLwv(Gs>LꍨC12 ')QGUkU2!; ˶SvOC R@l'#вyrPձќq43/R\3U*SKO)ix%RH4O%~*S\"&K_$EMb9FCyB P"O -,/uh6TF_s@K.(H@J?!vPT_d⿩FӒ"bM=-g]1RڕWd362Lj4ZOol-$CndN65?VxHqߏms芄 e$.Z$FVb9I:I˷QPA*PF)o%B2^OUHΡWˈ& LTSӛS?BPtYJ %#U6Gfu "6k6;xKXcG$;#祕Anmd!g(>+C/e I$V@%(q^EѰ[||El=5eE(w2܉7,X*B $$Up(9#rZ~# !wEȊ$ËZ8I1Ĉ,XbȒHWxyXI1 6@:54A+M!j,BsԀaM`Q3,(:`77 EYHqS%*۵rRA$GwTh7FE;*ڍhwG v-M:N 86OUG.cn~Dy_ߩR2͢uPWyXc0LT,b,eAlAp,P+q V0N"p":- 2']{?4n [< Gee iqO闽g_E Jl{q53{./$gZ|b4Tam`<˾y^dHNJAD8!~$dbLcOsTCU1Ӏg=/&I~*q1qb?"V*x*FjmNxkI*D"V"{EVvB VFeʻȐ?'qƟ^d+j%_2d?]ކv^t}ӺV n`Szql2d?r:M>ZfZb,*=7u/홌߈z[9sF@ i :^X;/Y| Xދlq% j.@(TK4\ݩypq;}DRHWgB~i1)i1Zw@/p0,^1bLŘZZVX< Hb(tBS/H%pl"0&NjDII2feQF$ 2,xrvjL:kgiIK׈nax_[x!gh.ٓ-}Fߋ{?kN+8vZe B-5Q1p6(6Gv?)j/ղSԞ -;y<G '0!A8nq, vh!*Hj Jkcox{@ǫ*@FZƲY5]|*NgRo.ǛƔ8PTCQͷQ5L34R - 0S/ѡ{""8  ,SʄdؗL(3}@XpP` 21$ /Jv0,K h%!4Ѐ@4Ѐ7A%^9OJ+3#MUD~JT}'@"㈲ m{d+r|ok[r}p$ =3qwb lYgkq ge36 ڊۯL݃,;ؗvddk2dF1~$[}L98b-WPtX:[i)WuFY%n1 dbƍSe䈔HcP9+K1ÓDBU!+qv~mMMZ3i˄: [Xk3 X 8t`J0JX^?@g24VJP"Bc%y"5c+͵qtg@ht4d 2ϠZ!/2<vE(~xΟ IBl0~XOBOV 1VFo2Ӑ@CxLR*( J!JT'D![Z>cUB?hd*!3Fhp |o?u>:sٵˍёA fJk/gهmlPd8nr<߻Tdk @~kE_4?eO:f Rᔪ{mz3ޜZ }Sh%D NRaN)AaGゝQ# ;SM7yqcwT8cY g/ /$g%ta4B/`DV63#1UI[XN`{ȣ^j:2A SK&wTvFR$Sl]0R`tTUVSY'U8՗M $IX) /ID{ J#U\yJZ[q.g"^mT0GjSՐ`+R~Y^z."ST6P=CUj֨fCR q΁Ph+NS3(YO'M4iԬ-+ 8)~yK\T6@8jRV*5ϓA8JЃԃըZmT0`h$(oҢ>}:ꈜ2~:yӧBeʌLUʜh+DD N.b$U4>%ԵꀨP7`ˌ]{[!c*{M)" [敩Y,bk }1%ETh_A].2RQ_/BT8*iń+M*]=F5i~ ]Q:sz6i!{'(q%]1ǂ_)yoFkRvꛩ ?~8|)O~7cfjCq7qyf \$JgoWR< EȊĨ+NpNHN;'VL3|@SOK{9,_ߩQ-(ٛԚe%#$ GrKT d'Y`(BV[)Y2dR@ARF2SK)#HARFpA_NY eYbd8L!g`eM`֥V) HY@_-9 HP8!ZKD>`f^{ !# X0H2 %dG`#hyTF-4(J-[H2J }{-o}ΡWSfPOmOvMt rftXkNP2rx( Qџj6/msK!|3IԎsZ|ooRF(d`I9r V_ O2dN59e^r]@|!")>@&r=[1;Ի(g7tMuQ;$w|&? P B2.&SSlPQES+>\JET[!^bx/,ZZH)ʐ2=&jQS$"+ X 򵌮rVONz"ӔA艼H>F3S~! :8vJ '0p感S6|%(tG>0+{U׍?TFl "I^"(đ&HI 4nLo #8A$r4^e <Ẍ:VGk%PyrPUz؇ d#**62 /4iL0XMcPD]`U} ˽Hn4JdN iPQRN!pP Yd\%Y%% }?fM?WMҋcsF!S&ߨ"*b<V$D!52˓0D9/D2O//p+0V1ԑ ğH"tB?ޒh;U|.OtNq ^a4q֊eE6Yb ]iX;P"yGF=#^OT3-CA5`8\VS[o,s$\שJjQ)8=5Ed Vl}\ f6|}TeۭPwZVV(\/\~ҰOAݣ5x^7bղ7UpkeVoE}z*/H8'~Q#Ks3ANX :,Y@hދ,$  -6/ÉQ́!BƼd+&KȌuvC4Y5%Ui^$A+8!kC'` /6ʊ0TJU>։=A 6UhV ZR mJW p~HVܓuJ ~9 P?ߩ+O)\W~U*Ca'׫NX Ct'µmV$v_@ȤCxо+bftКLLqaRQ-%PTzTm)]k>٪By&Cc+ߥ?\s_]+fɤkM/:C%SX:_;Vؘj" (ﱡg_a2>$FSHT~,w:>iM[m"=ɭkajn5t؆ څ]o?J3#|;Şs_c_v/v-b׬BBi)% Hڼ||}_-:\ͭn+e5g%[C~s;'Z`]2#(E3ዾё\ WS),*8,_ߙam|xj`y(j!rQ_,FAʺro9h4uMŦRwimMceAs`?XAh@\F5+Zw-ɝ>Ҩ"M5VV 0}E7ViMtb!,]e 56~ZƷ#yxXn-2V#'~XF:((gd5%@zܪTGxԈ冗m؆Z53b7{cZYф.%5j.k]lwx)04ԙ뱅z\"9(,OkY]V˕73K@m˾gODOhRao yQZ #qc!0ZH4JJУbA}vUpC~߭}4*L@FխPNNKB}/gem *2mzju08ތުQ70a޶d0֏ɿ?%?1|藂Z11m=mxtX̷XDPgΌ2\6GtRAKypwzru7}K"jP*hjEHm+Db_ =緪ل>vI7y ckcV̠ ~`&VjXhcA7tߔBSg>6~px4bҌFY{?ޠ |&*=˺4A׉ lEɢ\-C"=zn9&+{,Yz/i:ksx;,e 1pf+禆Dپذ?&V8&`<Dbd5ߞl֒s #'%b*Vpuh[12m[E>=g.1(XW-t(JX+k^ n_Z#GQrRWۺGlP|jЫnmCj*(+VK$ѬJ݅ Tqė/QLZV+JԫJygB= M;]*jj&6~;J'̚g7]4TΫRk2lCS)K -鿨g-`vz=Ұ=q=׷[%Ja_,UkMw`(ŷFv-ΆL> J9͇ƍDұ;B/6݈4ud|%<`zo[7R4v3MinEfD|RHKC'f|a9R嗻ODpbU9:8WWgYÜ؎vۖ|x[+[ӊe?='@ԍ7&Bw7N wIq㼈.]8E5t31tQP EM[5tr--L{}BX/u;YشR ZZ.7XI" biL/ (KZDov}5t!?pϯK ]'gfch`ӊzwV%=@6J]5 VͷB>XEvi5ӫQ{twX ftmTF̗6`O95ަ) lVicoF:H45,DBضfjY+[cJ]#fw=jaFn;@Zd݉KqSvZL,HsXI6Y%Ҭ'zNR" >v⟛FcQK3̨ea)[3׵OҲq]*V)(@ 4F m,v.nZcRVMW,hsPz̢k3Ќ:4K])Ag(Aj$3] %n8~^BW ZCn5qE hg69XݒRrM0#E#[u(ts<[}GԱ}A1妙Ѻ>>7μ殙eh] U$nwJf(v&7k:4D"K)%3[pE5} akaJ}CKwӋ A["VQ1yd߮Ҩjz.A\\EUC2i˼ݑ٨ͼ6/40'T`~A/?Rhca+Q WPnoWkYGXd:ʟVFP=⨵w! V'ױ5{mLf =u=(jUSۊM/9~(9c| e>5Q ~|, Kl.ejd47( ?KXꊙoE w…Gy> hchv`>z\^ȮPVC=N\P3 }+aïs&ڝ׫!~=?BK]<~Axf+>aM"+qOgA ]fv±Yh)ood>pDջ={n؂B#T0ު9雈};={iq5v?\5zؿS1E{G^1epXx F{{g*/u|N7V fyc0s {:օ(\Lռ/%j8fC ES!)fO\4|z|#? YD3w?z#5#~Qt>݇eC^!n.jbޥgm6dH?xWo)ܿYxϮEsj?/[}.[vGr,iW7ՋxM3ąEV\#?\}K{_k3^;;Gݛ7^+Qq[0Ǟ`?Y.,gV#LgNg3̥~Q\3>3Τ h!;] RB:TLҜ]wsZv6fnuV*(٭_ٽAϞgOv`~vyqY.* ŜUߒw 3[f Zmne?7l œ1s\E`q NWo˵mpci&1l>eOss_\oV0 wg'ŧypa%:u3fEnx{y>)g*w/zc>_R6]Xg~a1X.J 8 {Zh oNŅ텇Ԃh›*<.j`vq|X wspqbi1|lbigwV[*-TsYxX89|]v16\/TY7N\*&RtT ,/zd5,,ヤr",Enem K|cu%8+|~倛SW. eP_VRמW**+3/&zWoOUe<~*W+3"fmu6ֶZٵ m`xwVF }@>x Tj4Rzp/Won7'[sA #nk=pyZ2zz~Q^8 b<+(q樒enޢL".a8[^8TSpm,HvC *ct8rޭY"M9/"¯k.!gyn{?ys ïW"ݯw+s^+en,W*|+ȼp~,o"•.'e%~ Ey9nNab4Vr[i$G¼y&i{+qB/ܔXnKΡ/mmh?B_j]mG0sǺGby*|=Zܬ(4+lE޵D.}HO[ه_ہJfyLɥ_o掷KGllGS;g+;vJZia7wwIbWEw͒"ﭟDnq/49G-ܿnnE%^ʿj!|\bKx6\2ӫhHlؓHR9dS7ѹj&*G`6~&c ;Z,,,ǮR/޾99~Jy߿/3<|tcu<`A4arŠvvusZ^~?~LG}hʞGɫQF9^:,o?#FFS,I+$C+'e9‘ӫk=}oVŷYnٳS:n\jg2糥DWXa>_;2cjoqٍS~witϬx=2L9}[c6_+{[k^]GmMQ%vpqūɈo-cdрb4>!>Wa!*'e$Wr;psw} 2G͉rVx| ]E7Gml񼷕?m|5ɢa~!>ߊw *\;k!'{[VGhۋ>-|`?Blњĝat,-\,ErVh[X ¶xD6i%?iI0hjs6LX] OIr/`yo(mpy/TL/VO7Ӷ+nZQ휸" :dpXSú(Xk?ߋndpvG/[7 65L)Σ%Y|,^V0`Mϳuek!_}00Bz!M0Lj'_Vw[ر>e޳՝}۶;̼ӬwaPQm )KJ3_>t*ͮeq. S[םU.] %ҧ+ gKݯjm,uAKޛh6ː-E*˫;)0Wz{7Now)IfBt+kaC~iM*pqWX{]]Guf >YyU ]Ut [ϰkB[UBi9UMsQۛX;Rێ 0W8=| X*%? ǡi<=p#=ma?zr>n6wyt??.nmnF*,ngM{yX6A: vy𠾮Muc2#gԷ'8~5S%E׵AvNC%.0[L쩶#ؚq:K?E M/<. \K+. y2 'زRN׽+qBpp66Up S1w^k"n/Ce\ծp|:<=~\5m) D`wѢ\AXGz^ZԱŌscwiiꀊg wx5la +m/Qxv:dsIhMNpjMk[טs)!dhW=qL5~_N?vه6ߓk>y͑-ge&@j4 ċ[@0P0枳zN}ln?mmS~6\8dŎ*[]V> PpnC۸6xcWD|9Иoy=2KH>lF 1 ?ә~r(\)>GWQ Րzrek33by&tuhҞ"eѩ߮iz,d-OzGyUCR7k3t̘Oė y7:9d}H.Y ,8,ɠuqv;r6(]+[&LꣵC  󡫨ޛH]a- L=վ733 0|00IyaBAh @chAl1(RܔsnmOﭪ{rO]%0\f>qG&6mD3Gy+v 73+ly.Ijaw%7GŅǽit Q--. t[FsoWA> $LZMi w4!O3Ov\뛲=>UEǷ`黗 blK ġjer`%t^RPgV/jŀ^YX#ɏg"eM߇F~oŻ͘|֜.F Ձ4̮2ť&q}+gs#ƪŀlgrn6/=ŅX)[l"aMFI(XR%wG`Nފrt*wOW| O N):?A:i%"NxZsۮmX/&io7B `폈׋+ַ*ǕʉHsJ=\>% quZ_)׮)䝕xRHMc,ŮǓwҶ9<vLYrl+MPv87r[Oo5F#;J>=7?]6s[;\;Ņ=tN*RZv ]>f.JTNJ}b&Q2>, hڀmcE Y|q|ad҄kN_y5(N)@NӥwŅˍb,VFyTz_6@/{E]vnu DK6&k3/Y8/0 GiǶ0Fbvv|v#oFF㵙cnWNJoǟLvܜ&`EZr4smBP *) !PߟoGK'鈵hFp&~8#eƃ猪}UI$SVk4tW,ȩVU>8U%wј mY<>ti'{|ne0ddxrs-R]XS`S7@6^)OT{So jo4]\LDEhTn͙:,yKlJO;I0ɕ}f8a23q9! tx S6^xH"nȺTkB9;sK>./Y:.? h.5a`<`'sHRpY4?j6Z5Jr[12o-˝>ގ3,fnoCȧbv4 ttu*ʘ:=kر;uXᲓnP[ɕ#4`:V8(Clji}#S!tҼpC3>)]rZgk*qf*Uns30d_׽2B;x9vݱq,H<*\:-۠N3rEmPGidAE0dGu}NRT,zA-2+';ԅ*Ȱ֠nMMP[<(l#FTmcPw'5ve0BM<n᥍.VG$ r䓰q~4[XCm6!P#$!rG]|9\v#ٶedS쌟>f=8`w^3ճWϻ@#hax6rq^&RNﴴN^ʭ7<.rs#]qb)Lw)FkN[HO;nU&s֤]G+0G']3-D [/q/+Ԣz0~Mtwi.'gW4o *&fS:u=Qw= H:AvFfEyewH8|;mfnf@FJ׳tFiDi4`)Б;T*w'TF*1\)l % U*-v9>;&us;'TT<^f8jvD7 *#PN,88j uO\Aը$'<A*J6bK_xކϝ?x>ѡ?:6)^اӍ<8D>lRƔצNgƷ{?s&?Om]G:~2ۋf;cfQXyB1OrQ@d̓i2Nu8f٤iƶf>\D0zgsFw֡8$Z[Ӊ35qҳ,ccȤݪ >ݪN$99 dֹ۬02‰#$5$.eq,FNzC[ k菥I;W(mR/ؼ Mz}y^3?}..H#"J-Bdd__{*DF+R:^hlv6rӒ9X,%?w$s}bk{F?B)tWuWkO j/H(І%P۷s?,>/z,U򉭏NT477~Lc"41x!t5t>\R/G_V'X(a(A8pdqI,GЎ#0BI[[0Du FRq똆-/g/;6gYDB$,(UZl &A9z\W^k.+8-AUxʣŋE>mZCFpK]Ø>2We>F+Pk[xTL_Juݰn~F5nȌ@GЈܬX=W.ԝ]T,`ǯyI7Et]hmw8Oqѱ2][@ذr3#y@ FU8Zq3 h[Ť51[^w64?Fp2GKQ!}ȦgAppo@)s&+t;~akx}[H+9HCl4ԍ֊J?Z=Q^g Թ0GtvQ^zhОSPk, =wh3rCS.ܕ`{tϤPX:Ўq`Jw3hA(t?тdփSҩ6NUH{wړMGtk`8{8?>×C{5[lWߏ}mSKS``vhcc5kv Ƕ?E{\[޾aW}H^j8QNS9Jt>\>!HC6t>\>3t>\#ut>\>DER{L0I3=G &/g(}=fL' |퓌>QޤwQSM>U@zm/@)w*Q.B >#1NiwvCW>y[ߩO ]~SUg T -/1䋿4D3\T{aprRrE,1 vbf@iw]Ǘ2b%[QrėYtPT[ %2Gk/M8;{@ ]/wӌ B5y9+ o7gkUx}tWOт&A S1|sƥMtz'txw^݄%\VV/p4V~0& ZhEK Z>ivEv1ii;=)wǐ'T"R:qѓ(wƝ=3}^GtWAwB x ݩ gX.T+:R o Y}{`]PkqAtG~4q۴/U.af[m)K7B[MCpiY/Ai }}kLw ?{pO#/T]we1tu2I(zR} #A~ El3Nzn/F_zo Rh?UͦbYHpBa_~ڂz Zo [ D!^:X E%XkkG?AID<- L5fUjec] {u:M)~?{[ .w0.g"MdV[}-ܴ l~98gi;#Xf^AdE/;zgk̼vNJڀ3}Ltfe=O$@f- ScyۙzSf٩aN]0vz  "!>9uAB/;R-߯ [h-U4;#P)SwHzG6uc07a~@l-zb ߍhm9#C=]xZ'\^ԧICFJ:Xtw:KĦcCޙ0Ħ{?/OZ&/@Yp5@I@s{i^N-I>R 4I>rޗmAHdd1om I@d`h#^  ؏v4fS^cǤѿs+4I~ocmK/ŏ(ּ3fbg3<' ^=$vE0v?+"!ݲҼY{NƣnuNZ_kkΟgK󙗉By{N> gK\U^,(%@ 9:h|]kRg˒j띓v\^pxhs1?:s"O՛>gybo[`fzn(mmz>^/aDWStOk7MN >  jh}nVz=a}nXblHs3iGo? (m ] %װiA'5Օ8Xb[SnRg}ΦJĤH%yal`0}n Ddq~q>a:/sb[Ħ>$eQ>ܲ">gVF{b_{/>^ܠ:݂/k?ӓ}iK}]O?NkwBL:A{I:u9c"֑{ :UnRST:Uuɋؐnu0OPVH!))^Bz8;+>GM ?u s!:}GN}gnOL,*m4ots;`N_Zji)@qS6 n&gRD&5Zx&S1\{.FƈIBS,%zp4`|q/ ւ|o/`$!@"G=m~PD_3k3pV}8ֹpv ;mVl߭~[G:B\)f9gq._dI]PD%Fv eegz)ڲ7Ra|F#por]'uP).r4^1Z ?HH|熼b 7Qh_5gq<wIi+.G_v_{dJ͇Mr_D;ܿHܨ,PG0.ەuns~_WQMٝh 4#fistHv~>GǗ8aS5=.̴v8/ 0bN*:ص|ZCf R.tN/oQMN"nyi.Wh'\JǤ@ݪ]}O-VnSԳO6me'*t.} ͤZtPQ{hefl.Zv9inҖcڲ=F|DM9%Z7SKI kGJL{#`AeJ['ݦ$]#{˔Ġ4A9$&훒)h1EiB'B qXa:0R+tHBWs.g6BBwXOO6 SƲ끇U'wimx[hoO@jEx?$1zUiA{vNð><;yࡿ4o'}ic"tB]x68K8K#އtw琈zo0ya<#VR C#Hq=Y]^<îĴ<O;t{?п7f CgjÈk"fg@vXyqLCzO;tFpaǔ_v假Jq+2.% _f\}ԙ`7bHa6'kvi,֥9V6GknZC2tզ.Mu= lfq8q:doeSTǬѕم4{\= |z<{wnLRs^ϯyi~ï1Q=oϷG.~z)+Y~vg=VƪkŅ⻑ͥcc.\ǚ(Hco#%KRMgwvӉay71OƔKybHkVT:oGf^vb&Kꈑ.l? |jԝPVS55wux;6_^t/20fvaU' Dc={=;̔95zw9|FkIXŀ!9+oo1K[KOa$z߳9HmEk'N*jrd>2`3˩]/0s\U>vvEclVƌ΃&Wq[۫%JU^Kcq̊M]17^4/6Fl0-I g 3IRvԄb!mVF\Vh$ɱr&'kFW nH7}Tn2•ynTϘְ:I΍W+0m5MNd 2Q*xxV6A7~~Hj\YQD$˳!_"]g/p6v/6vHh;9O`3T\<%nM B0S;ߥ&soK [1ӧPkcv4ūi&ڋ8md^|YmTNMrqs'ze2<0mmj9DCQ@1??X]sx_K 4u/A͡d킬ax1Q8!7FwyFvtq2w9;sq1A'{_"/W&~v@KLz8O42ƍ?{6e~E#8?޿0L, tj&8IVfKX&`E 4QEh0%rrF0T) Ј>I̤K)*dٙw%?ܙsva9b՚Ff ]ơ ZFj+ iX/Y&]9\?ԕWML{R7Rȍ/ ZqMX!ѹ%p1aR722;Wa.$-Y)-_e#b&M̶e*w81m KS)~|ꈅi.&}4ݓ!V wqbkG'􃡹 ۇtىɍB8b’c&yDH,!h8 6!Bv<dbQڤ_ؼNH%2.GshSnZ$Eup.Vlj+Gڰ-ߛz%p#"a $f\z~J/Ϊbd dxN\*yb쏲Mf`_,lf&n=S뮇xi&Yd>9i/ŌX;0nLk΢F-&Y:N|t )VL2sJ1NZ)|7M9?3  W"^hʋ)^h3SZд~tz\-1oO-mB'2MӰK b @a/i[c]6uƽ*#ʴJLLwV*OYKĺ1*-#rZcf M-9blLZ9M0'e#k.R[`%g/k24{qxjA9YٺE* U\\ʚs0QJI5z.;&rH inDۙtkOW<I6mM'v쎰O.cs5gjgq[Sibu ^ZeXm/Dz=:%W_ܕ r81-36^7&r2uμ!9C͔g)-D2<왙FsdO ,MaH5N=1]->?|A{^쿤5=&MZŏNꒆݪ7r\f2;4i~@M mnL7U bVq2@mЄZTn FS@ d1!?׻Fsysu0Xvl4xzxxer[E,6./C%I<)YP3Nlj~ZF7gŷ,!% D 2avzx. 'maH4-6Rbeya xw^zY \U̎GUnK^KB"EPհ{_Ƈӫd .ãE%3cpbcdu8q^sé9\ٯO>G.vJNJrʹ?RF')WP\TuSϐ"_BҋNG5etx}1TzZQ ؾE18haƸQM^X7`^kyT7^Tf&:4!(x_''A<&C6Wɒ"P\2$&5 heZI< @# w9ux !NZ1S^=L씧K;N :wPtkO0 ܤYKd|QPJy~]\w>kPm&qZu}F5B_: >ϰ qRiOYu:֯.҆qHCq?~{N-;&g^ԍa!Lly+m@^3Ig ˴ݚNi͝4M8qd}kIQB"$1R]c@g)UcnnQNԅpQ8Lf2 }hVY2r=9Hdbh~e '5) @vL^u`ӏL;-P!b] xbb{J5kr *t5g2܌infak6h,'6gwj%pb8҆CnaydJkZhoFuJoak`hNri9Ījͺ C= ɭg>vyj{\ ZkÆqJZV+ژ;4yZLf~nV>n#B;yDD׍yc`j=%(fK{<yI_ zG3N"_-1Yh4~Ť] FR/DIe,?CaRheJirm 27.X?^4|Rh(Е,gLeA,+ .QKtz}!eI/5M)9IkvAH a[ U4^jZN*G֚`cDMgLjRڙr;Sgky){4nۻ7#y+ZaBΗBxZ&xĵ_]MnP*aJ4T$4N{O9Jo+E}4LZK@Wthnpz ho M ,[+=\V=yDW7/57῜(*r<&FCer͗C,_YY(ekP q'vcf(ybҲbKxg~f2o(ܑ@s@ (&*7b 7J~h#s)6͉* QrCWqd0Z/ϱ/ '>p#Oz~ '~곟O ~3؇GO}?I ۇ'R3G>񙨴T{/}Wt}~O,(n?}t}w,O?~W]?ٟć`>_/w33ӆO¿?G?ƿ룟G?#_ CG|/Wp'p>o~P?3|՟|4~_wÜ?_܉,͗᷾O~׾'G_08?+!L& `B0!L& `B0!L& `B0!+0#nvi`޳CN}7ޗ{tHG>?Yӽ~*v˿p,pwx?//|`窿?8?o/gёz(ON?-clΟ|w?Ŧ|𱿫>wptGД_|ϾM_~W.?{_|KG?o篾Wv;}~_?z;y:l?f_џG]E"[f}G{_Oi󟢃>|Wٯo/iaU3|__/V2t 1Ó/_:*L ޲K_΂:s? G$?#L\f]ż[fhB6~?~茷ÏO~S~ӟ*޲§?1}m@ :< XXGW#or b j6뭗F3f55=E0Ckb_Q4Dz+Q*%$ lxnOCfY*y!UyeVTOˢ$) }9E—I /i-AW `F7dTAF*cTF(uV8w}rYi< <g&5)A)ZwaVT j4ƤU|{5 iIy[soyhwIJ OW/xUH}/DeRZq̢VFbaTq05h=³ieD,ENWDfS YVXЯ(ryҌFU؃|Zd(ˆf+dEf*pBXojQ2l?Y [M"v`U9p o!*oU2F`GDP̲K< j>ÀdJD#0$Qpp*v2L ćɊcXw,# !,)&f(e^08v,Q%iN% ݓ`P15`Xdx(2̸$rVS-eX O\R5l'Ud @bTF2ˀ$35p^E'D)3) x,"B{`3K 2J[h#e"K8p*oVqrQx f,/+w$EIddEE5vI`-r((kA0cQVW8d}0&򸰲((JBb/< %FCBp]آSX1T~7_[CۏwqB(a@x1Ǘ83eϫjȗ%J g恎Ȍ,pШ Iy5_7/7旆X7zi<\ i7.kP?r(6b^7&7UB-|eHUv l|8 b <+, s8Ӫˀt@| 82`5_۔%0Y*gKfdnzm4kaDy \2]IZGImwO;PAC H!"꡼%fN6d@̲|MU74`5%U m dQer*Xd贠hDBuP x*eFīD1@$^< :bD l$EH8Hj(F3*72>W(K(L6PUIUҌ'e ֞c iT UPb2 1#3JSfEF{y{ V8C@e $+2 n8T`CAHPa)}A 9\5QzCTaqV*s+ *bU2< (ļ/l _H #BePiEӯH')1*fŭo@X_Zf b9l dN'm#ȜBHK:hTAu"%v%Q_e؉Wi$DDDIjDbɊ(XyI0A Xˢ+ |)+E.h~<-iki 6wVuw,0{}yL7i#n.ƚy,RK56( `Df~>\56.&~xSo@wHphWWqV /d/d rn+_Yxh.5t_\k\b'oط10$mD'_-P}p"8ԟEd,IUɬ&p Kz "3Di6Kh &x 24D+Y@1(,cAͣj@ V*&( (C_`s-C~vPݽ)N $JT\VֺR =<+IT%£ƒ؂~W8-nC $o5Zz/Qot ~s }0;n㉜VTv@`oJtqdYvѬKce81U'" 2um]a1;Ʀ ^)̥~Mc,2| )jT57 :"#ښbQ~Qҝ-Ewx(J;@-=6/K +/*DN7Dk"zۇѲ"vQɩ6"C6^6Xͨ`8E%[-=>^[we[-` X#]UǨ$8YXͨ ʣ@_?6Z왈Uje:IS J2U!]ĪDX*4Ȳ%Ypz!#K$Kl5'YqdVaSl8( [KMTF`U/ P/ =Kwh-N`RjE(e$e٪@F>:I$ Ɍ01^w_,31b3,$1 rzpA:dh"y:2-RNr$OAȊ2 1]U pD3Өjp@7贷'X*2TTKJɲ! z%i؂2"?vt$f1n7 ^5Q`D4QI@Ҍb.'B֣yQM0hwDleQ45t)a&(DlB46~FU|V<ϣF@E# 8 i(X ? 7d8x=H(;6DxRQOl$(N^ #J >)*8^9^f(ij 1 e"/"J{ *C_Bi=I¤*?IS5%Io* Uq%`eD,Nj((<)DQy0 [\բ`B)ƭjQtb_v쨁fGX# #UI HbJDp HRQ"_.yQ2]zׅP^yb7C՛ks^w<0%_/7*@I0镘ɬH1D7B e[mF-XOjI .J$tȪG 'Ĝ!Y@/a7)ZGOL"+OAު(7悠|WˢUPʄ\TJ29(2,2W;c,3*_$gzMLz ^ f4M**jZbCDҳ!o238ͧ\t:K_s(rY7c(aՈLzEp#RZBj)FBG}0*>$D@-aQt12 $ДA'UB[b 0@$!-+i`U 7ʚ_,;zErGH 'I 6t/Q6frUUΦM)'UL-%V:IH2`RHN`"DIATV&~yFXl"đL9!/KBa  yt˘l.0`+J+)tY0$+FLY6.̠:2;`BrU@kHf))Iւ!I!42"Z|@0m<<4G4$-Jd1*1| B&B3؄@_hq[eUâ2+U%+KWLBu+XPj6}} k]7묉t&"m2+a0+A 5|Z&()0Z+ʊ7aԐ*I+ffLl#jފC/ 2@]1C1S&z"2(+^cD"!Hu,2tG A*yCH4B V̆&|D# 2/fѾ6@=,9-\e 2Ћ iҋFR'@kDW0S I] $" lOy"̊B| R!֨1*I^9])H  (@ } u(a#"*QET$@2^VW%ⳖC,h}$-GY,;241=$aQE"hS]{9 sEuY76jUG0 z;ٖF~:WÖ2:@I[f"@k4P T󦨚~YL6 2 w,P9F-cQW9XqN%ǎB VlcFM6.Bu/YEʒeEIT,(/ BU9I=)˥8lbP6`E(/y~$.Z0#0hP5D|>  ,0$f7_j4S)[_5;UPѣc1Ժ~"K ccr ݇ endstream endobj 149 0 obj [/ICCBased 174 0 R] endobj 5 0 obj <> endobj 6 0 obj <> endobj 110 0 obj [/View/Design] endobj 111 0 obj <>>> endobj 108 0 obj [/View/Design] endobj 109 0 obj <>>> endobj 121 0 obj [120 0 R] endobj 231 0 obj <> endobj xref 0 232 0000000004 65535 f 0000000016 00000 n 0000000174 00000 n 0000042784 00000 n 0000000008 00000 f 0000356296 00000 n 0000356368 00000 n 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000356558 00000 n 0000356590 00000 n 0000356440 00000 n 0000356472 00000 n 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000000000 00000 f 0000068464 00000 n 0000356676 00000 n 0000042837 00000 n 0000043488 00000 n 0000044387 00000 n 0000069392 00000 n 0000055904 00000 n 0000068656 00000 n 0000060385 00000 n 0000068771 00000 n 0000068896 00000 n 0000069020 00000 n 0000069144 00000 n 0000069268 00000 n 0000067167 00000 n 0000067313 00000 n 0000045286 00000 n 0000045612 00000 n 0000046165 00000 n 0000047533 00000 n 0000048898 00000 n 0000049830 00000 n 0000050885 00000 n 0000051441 00000 n 0000051999 00000 n 0000053292 00000 n 0000054546 00000 n 0000055119 00000 n 0000044451 00000 n 0000356259 00000 n 0000044721 00000 n 0000044771 00000 n 0000063567 00000 n 0000063890 00000 n 0000065250 00000 n 0000063631 00000 n 0000062156 00000 n 0000062590 00000 n 0000062220 00000 n 0000062092 00000 n 0000062028 00000 n 0000061964 00000 n 0000061900 00000 n 0000061836 00000 n 0000060592 00000 n 0000061228 00000 n 0000061292 00000 n 0000055758 00000 n 0000061164 00000 n 0000061100 00000 n 0000060528 00000 n 0000055694 00000 n 0000059153 00000 n 0000055941 00000 n 0000056503 00000 n 0000056112 00000 n 0000056203 00000 n 0000056298 00000 n 0000056393 00000 n 0000059270 00000 n 0000059325 00000 n 0000059622 00000 n 0000059697 00000 n 0000060499 00000 n 0000059843 00000 n 0000059872 00000 n 0000060043 00000 n 0000060128 00000 n 0000060217 00000 n 0000060301 00000 n 0000060738 00000 n 0000060854 00000 n 0000060975 00000 n 0000061409 00000 n 0000061464 00000 n 0000061761 00000 n 0000062374 00000 n 0000062495 00000 n 0000062707 00000 n 0000062762 00000 n 0000063058 00000 n 0000063133 00000 n 0000063287 00000 n 0000063408 00000 n 0000063483 00000 n 0000063936 00000 n 0000065160 00000 n 0000065197 00000 n 0000065366 00000 n 0000065432 00000 n 0000065463 00000 n 0000065755 00000 n 0000067054 00000 n 0000065830 00000 n 0000068114 00000 n 0000067459 00000 n 0000067630 00000 n 0000067751 00000 n 0000067872 00000 n 0000067993 00000 n 0000068235 00000 n 0000068351 00000 n 0000068538 00000 n 0000068570 00000 n 0000069468 00000 n 0000069715 00000 n 0000070958 00000 n 0000098299 00000 n 0000163889 00000 n 0000229479 00000 n 0000295069 00000 n 0000356703 00000 n trailer <<7592BE616E403549899ECDF72B80D9A7>]>> startxref 356872 %%EOF doublecmd-0.5.8/pixmaps/mainicon/dc_96.svg0000644000175000017500000003764211765566230017440 0ustar alexxalexx doublecmd-0.5.8/pixmaps/mainicon/colored/0000755000175000017500000000000012257501472017420 5ustar alexxalexxdoublecmd-0.5.8/pixmaps/mainicon/colored/v4_6.png0000644000175000017500000001723311765566230020720 0ustar alexxalexxPNG  IHDRe^:ڡ pHYs  tEXtSoftwareAdobe ImageReadyqe<(IDATx]yl}f#x߷(uٖhۉlNa$ îhu.?i uAHRmMq⤎8,[m]EEJ<^3-I)p۷;;|k~3$]+7[+IbI["YyRj@+.A4b"EQ/*AF DcwS|hW'EVMkHȤU dk~ P|lV_j^kkCq$>ľ gM*ީ"Nk=slOj7  %b tb"g>R 5BDmAD97Zvٰcl^:ϰ0(+b1V_9WŁuS߶c}A0yc BEDhuKZ/Ɛ{g@cJB Xbh"4:0THeKu9AM"7޹~!n,, /kz"lo:>.c4ow~ns\/QwISf{v/ElmCSnSPJ t|<]IT9XzٴB>^Z\n}N:Hq_Y4۩|/M}&]n:f5!衺3Ise=C:c!ljb2u8hseLWy\g7LvLB}mtq"(SO >ڊd*pv*qc:@_ |L,r5eq,jdP\Bsh+O15ڧhA ڧSBOq`/),ۧI/9ƬQtrtӨ3V u1(ȠXmBV򭾾w67#J)9و$ڄe5dcBD㘒ؓ 3$!H gI\ .  .Ҹܵx1 7a 59 8Ő{ &@ !TX;TU."Kh7MMxYm]@7ޓ*++=>1NOȀ qMOi)E|?RA?6s7/Wze52XpZZZ@COHӄ$vt$1C@H1d(Qb<+2zSسMF0˺mxnՋ{;PIduʢD3 E)iMT TSyݳ eeek3 n͜1Vmʠӵ&wz0TWWs.c )t0,R Gr~ˍޭ&E5cƸKFmv7 ?$.;7g S|-6Ck]ˍDoCœUoQ"YLݡD s{;:ր8K/k|OY؉`YG;эМY^~7מEooێ[p eXsÂ3x` U99tWͲJ VP3hk*s.SJxSߘ6`ao޼AǙ\lB6Q圉|Չ8>Pc{#1zӊv2JWeD(EykS k qlw8c:ouHPVw3ggxbdbbg/cl)x3re F\Jo@ɞ+_`9+ańYZzNNqܽ35ZQv Gcj"J(V]Icw<eM̸x"1I6 [XΣ&-CAd!B];~~ ÃMxyt :\wvNÛ[7xi;J Yvi6#Rҧ (OV~tpYCs-46yͫ90n"8}b\Oe',zڎ!^R =[՘S֙pGW :ZY_ҁ~k1ZhYX%xbs9kqzҪ_{Fk-uBN)"/جćDݫWs!Vʔ)Rβ+%GX  :HȀ9:ق؁wN ؽEd*2 P9 X'%I^y 80=R &g/Y3!?=?g(Y= u6bhh(0؍Q ]4c˽rs`ꉝNbdǎ#`r+<4!0BGr [L26@e 7_kz-20h^%Óry$5P3kc^C#8EٶM 7[ɮHŐ/,z QKRƸX1&Df;#1$gM)wpNmii W)"K@B8J_zrys8Vq Op:]UTT`WˌK,}8YǂOWH*Euޠ\kxKdZT&XfeJ Xe׷p%C\`ٰMs=7 oE\bM$r|{Ǘ*PPG{Ch$`DE,]`_(@cGp%`\CՓ.S3{TemPEQͷ##¤U Gw5FKaDAA"^^b{!>L7ZpӶya㗺% t]l ;`H9^xU1h4L&q.IBMjoH! w:i[D#,R9ǴMѣڔ"na28n8"Ru<r uzgʁPiS`PQ5"Ǻ,7>"%$Hq284ePYF#j &z$kPJh :G#~F W/6RKF;W7ZiXHS/^("Q@fxv ASrB!",8JdMGMJI?əfOF*u "S𵒨k똵P5/:ALS:1#(YeT)Y*$6&TKB&3ӕ]Uz P,|]|9,+)'eb:H$nchr{TKX] H!oRW O=u1&v\:p!r#tCdɭc9dD! q& g"w6zG4B[IH2T0ÇMҴYb-[U,^.|*%; @M1j;H>QF TMZ'+j+r>G (6cPJiEUsŘ'Qkӯsdp|# Q!>C\E9LIm41\`YؽJ?y1"/H`Q]H9 aڂD$7[*ScS<5m8~r A@.dZk6(%Z_ħG"TE}:FexCX3%*^!~$ ;;qKRgI(+P+iΪ i9b8f^Rŗ) Uc\y.T7EjE|ʍ߸ׂSMG`c! nȳQy9γb>|.˦W@.{\UV34ZWȵ> lcI&RGT9KwLD*af}`mG`a[7m?s'ӕR@j̚jRb[ux3 /z@X7{k 2yR4$S1Deα9wL%JvdʝH; y:23)S1 J1yX??E--M, Qdmq\/,?\U2-sxyB ~E1y!q)8I ,$ }A M]E1k-KB Y9)^1ჃחzOλ3;jej1v~²Db''.⌔RQ2ROv~bbj :s }Ѣ|w} )GkߺRY[G$Sv~[ZC\`b'(:I h%{F- }F 뾾ˑ3ͶO$ dV9lQ6{QNJz?iL|z%?0cH: +S DA3{vƭJD_D/&JdKV"^溨vs6@YA霔#3xwZ*s1J(/׻ydpӉLF#7/v֛'c߸i+ Ea '&Mb]i cD/9oVjm"tGK x4Pjc5{#7KE&|nJf +,af|f1ߔ?y ^Xg8H .YaoT3,zuq;ESz'؂uQer86)ĬY+c1ux!YG˾gBGuy2)rWpF ]JFJЭn %00vVai[D)%'K|D#b)YvO5`b)P@2晱ěu08;P[O-`\c]-iM,w|p뽈sxrpŵu ?\D6pػq|z|w)Cb%y%5oGwkڒA7z:H96ۄU=/_?g>P93^{SzŁ c"oMsןC,}ծe=_B˯ /T]H$st36>T9vo9>}  Xt5c},X|Yu=έtY* 1:iE+]Yu-7(d{~XBȐ)|o_} ,V!gi~x`2U +_Fz6)V*col>[}=6Β:!P6)3O-jH ߩb:Gf膺0!Uys]+$vsI)*+7&{BD) qDȽP4\|vlm:vkb;_}3ؙ {+/B4L-z MJ,,wN{脅6ȉs-_"+`,F"@K2|@?\SPzeճLMjq,@Q ѳr2V[e'jm^ܛ~8>'HPR\?j ? <] \͵E7sK⋷(:B) \n|٤䋭)Wrsk- w-a.3h>co^#ҽ"<^Ua w6$ϝ J(XyBM_dg*AOr_^܀O{|Z&݁UpQ/G$Os,|F_2c(G| R2WUK7♳.m>Qz)==qOnƏNB&ʭ#&, ~3ּN|e7<ܩ8.Ϊlzd޽k*֔r`MxW?oU4p*_?Ϙ?]]zJu Qo {{ьNI4}B~g(vtWjEкֳStDHpA&-QWrfr/\^:<[{o20:8kNsyqK (Y{?)&#655z  9O;pP}hItI'[n!gb``caketK~HR@V aJ> r@ε+\Z\W' 2ٺ1]W EG0<Қ`&-֥]<=ʁ܈ZY3@>[e58ѻ wFbjLxa¶` IENDB`doublecmd-0.5.8/pixmaps/mainicon/colored/v4_3.png0000644000175000017500000001550611765566230020716 0ustar alexxalexxPNG  IHDRgh, pHYs  tEXtSoftwareAdobe ImageReadyqe<IDATx] třhf$HIdY-6` 8!1`BBM&Yݷ<솗l^ 6vsuY1:f4W_S3YC2vLwW_GU7pbHY/q-U ' =^*v $C(/  i* QEUY 2EJ0r93dݗp-EngMAF<#8/%p`̂Q!ۿWss$!٧dwLq_rJKJa,pTR?;i-@8F kAa-)n{wAFT\iܹs-((ܱhp866ƁANC{eP]xX [\L3@3Ju*A]f@Ic텉d4q ^Za(1K![ˢPPRyCc0s 8 IAnDSq1 a8:N ʂ%E(`LmNu؜ReBv:(^|u8xv5E]SA6SϥmxHQo^#szM4GЅJ5Wr(**#T1gMԳHϻ^pS.V#7'$'+kQnBۡtf0GluaZJV%'7h+.g`H`2t+/Y;Vmʔnt5:no*g0Uup~ x XgN^QQ'j3VQ>rVLq]4VY;E1Qݦ/.9ڎ )V)PXX3vQfYJJJ _^[~֟w±Sܛ ZwE<:"l6v.<_ɒ=g |㭨0;C'sWnillt j߶kYc#^&Yr Y:KWT bĥӓ!=_|zPvdOV\KNW:1AAA v^qd5XIs?u_:FXa`lڴ)To]Y4 gf; 0^5HHtҵW3g[f# ʫ*!Lww7 c02`,l,'a?9y",a$^rAvyA/}͐0xUXǜ)>|=34ӗufgNȺ󎕎Bс]x,lq)G|Rrvj{DժNMEzգy5ˌԬXUUiqo7rJIN[H2ú~:VH u`p \n-YJ3yZkT]ެD*Nʟy)Ɨax,X{m?[XJyyQvR4ԉϢkr V7QJJiX@sOet7>}3gxcrهfק^#K`S7; o{ N!d<,@v``` j^%'q=Ԅa!d)kaWJهnc5 xHozxq+ÙjZ@Э,d64OtVg"Lvck.pwj\Vj S lve-PlLң9NilC;^|ެ+k'0B#-Gsssѕ_;BϪ3IY-GdWYd,:QZ5G$U `]0>' [3tIS0Zfd(p k5_C 7)|p}|f_i*.3\91.p F52™tqܒd-VbΧQk!?#A#(`R䐝=g sɓolSvLv$Jɫ>~6MYͭa`#sB K 99L9r8WH!YPT¥ јDb&@aG#;h4F"x"ɪV0U Q ktm(4ծu !zb$Fւc0 ѢMFLGKrhQ KȨ:Wyge&lBQ7I̸Ycs(N? E!ψ%`K#ƗN:*Nv*'Lni繷SQˠHUah9[A"VAbc,o09ᠰ9qK(vq5G\R<ֆpL"ؤ}q IS.}GZ0B `B%q|dlH/?(h@QT+uMQ=S ,sIS!צ'Qb hDNpdU @(98"JCE_.LJ#ozP<WQ&FUΆ;0ШDF:&)JVrp GG$D ҀoY%xGbcq'2on%glga>W\*Vb''oj,0ўĀJ ;A+yH {={1$~_gF&@i&mq)G@ {J $&KQe-oH:\o wwƪ4HKjC~EzE@MQAQE YH 6쟻 ;COo3~ޮCd38達bAHQYWX+QW0G4P;:^A {HW-$AշW_)l9Qu I kF|_xvF鍗aK_9kSH)o}j4HIC]cW+Stpoy1uoz϶#mi@{+_J$hwgeђqr!Y+aЫlanZތ9N]g*a|>R1 <:GQnZ,c(049n<Q,ZFUC;L{XW|Et9{ix.?C0Ou֕3;T6 !ʮk.Xlv57EY[6/P@R3!]c|X?o6lBw~z9]mpFE˩ۖt'.p]5(EJ|ɏSUJDJRP/,z MUX/ b}HT,,tt'.z̹Q&SyZ6Z^߉CKX3>z#@rzd*Fd*B֓z0Nka{8wg3w Lp>дjc7M;8:@ޣ?e;J ~ vF$(#ić%2Kٳht(z?a{!cfC?NH(f&vi = |ϋ?#RilxdF/> ;L[Q/qØn.d+m~Ӡ{ù70ҪM\%4|}=M7sud"m0 < gP|hB*r<=@=_Bͪ5~s'3E3@] hniVuténq3 ;{r:uB  K. og_~)$X^nV52hs`v,e?S=ş|{;E])E^&dԸ 8Aqx嵫+{a{ .\&!@$( L.fm܄oc[_XB0 &Sk;/BswBZtL嵚-h%|$)Oc]+}vSH_Qi$v{`6k.o[> Ko@=.1X'q$_TyeK+/GU ?GfN@W;818{vO8xUy-uP[¬ B=mAH7b%ă]#]uߋq>Wݕ&׀;y^>kwT7AktaIσYWko[MKq(\p+{+vׇfF LF.-@a^cK!(Q0|$-SM<BUsb~c~aUk}|pl (u#)!+ӤxówPvMF u>3YP0 $IQ`T1]f +P8x`TX{m6ǖkU/Z{VtwyH=¶+N4LdhM gRf9qiC&<DG 罂?~1 kUy>4RdԀdTR,$*>EeJ@Qem7M$:AH%tـ)}8)2jT!ACLW 4<0 j/kƅcp8@o P| @3ZRmoXIENDB`doublecmd-0.5.8/pixmaps/mainicon/colored/v4_2.png0000644000175000017500000001467711765566230020725 0ustar alexxalexxPNG  IHDR_^EP pHYs  tEXtSoftwareAdobe ImageReadyqe<LIDATx] tչFZdyf'N:!!&!%Pвe+ByJr(=}4%@YZ KHH=!dKp8M,Y}sG3HdY#iՙhن,l+K`tB_؍0NYZ/lKuWhHZa|aovogP`~Q/Moي֬Þvm~|mKj7Ϙf w"C  '+~yI 0 c`x׻^.'@(c_u-];:vEybd1)R?sގIўmcd~& .voLbjn]{g_"饫reӰ۵, ߆kg\'<LJ`μ P%`hI;1{lXƔ,/e A'v ׎MbGTZx5pg =&WAg6\'|9|?MujaAo^i {x,ߘV ?v JZO$@rCxSj]H/|]^uTш cR[y<Hϫeod5nn9ßǻ?倭j?YG`ҘPGA7-1?ǎ 4|pucjajs.](Iȫ5'$=r `1f5MN }NʬcX?a5# HggW+n, [9SNC|P(O3\Cث. < oYF4nrf`R9{_ ,3mppp|y~<FèqVui_.zvGO q=o5~W} NMyg=]= Uv"bN\ms߇Jkʠi䩠[dv"4/2 (<Q6nw.?9BQǤ *B='j\1geٱoVx u bڼnȖnV|+9koa MA7ޟ,LdwNI] +V++[Ǧ[poL%]Oܰ\@>' H=F*r ;Һ1 nN`ҭ]A&I0cU!pZq~Þ?$gT9T![hq<-M] (7S ja3&ԥì9q+;;g~!;DtVuj`?zVԃ~PNi نL"3v|+\{A=CA.\fE$!'!Q BYqJVXILSNڴVFs :8}ѹ$@?yn [ѠLځ a ?;s9# a^F+Lfm $E1pr (_ ?y('$S;H@J)~z쟷%> jmYm¥=L/?743L~α*WHkp `B? iPU9& T†=SUObvt;(G'Sm/z>$'`1fؿ+j< ̖v/Ӛ>X4dpݺOt^AmV;U;HgSӓ)T& 3'nz!@ ~ 4r(ʨ1e^0ѕq%8m ҄qeTOQv/爴}uI`aHd s,"N!ҪBMg|!%v\vmx3l/?op)<>_Si^'6Ք!J$3tNL;0Hp Tɧ!^^8#9z ?O& 6 $$0¨#dFIT;^1w"FSFOCG6_Y|t#Ӊx@T/>EWF@d/IcLvrC:jO`E#u())Q ]Y{~\; lZ`~Hl>(T73 l%HTWE%^%/e:hz&Y  GQ-bP6TR) )騂+!k$8b* "R8 ģ}$nD$^"\|V䇔O_{BxV =&~9IE$ N PRA ~(5  Du1Щ6C ʲ_kC[ڨ/5QL[u5E3Uc( QDb[x~)իQ_ܼ_:FxGloy94. c+hye}ݹB+A= ҷH=уCNӌ%*_8IG4It3 ^P4r1I4 <@NPQUS9nXh6V0 O2Zhj94N72yUN:}O #B ~Ȍ3'Jꅂ)bRDHr )/%Gw[pat#VEk qe] }F!zDF4% )^aQ/D#n=U+;bN I R_1Ák,SP$ol{Q+z^15Q$y`@m`d-{bdj*b3$3&p^:Hl G8 {.]PtũB\=2E^Ζ`oA/=!뤩[mUD}eM&!IBLC*D38? 4(H`<).PQH!Wɕdm*yYʤ~˾ plݷC=rsU?*l!j$[å@r6 t.Ht.*E 6rxl~ѡw&(vO"CoX?a2$$""N 爀G4GXt:}:d3n54*p/#R ܤ R$VIKVˢQ)SQK9XWcJ cT=ͽAZkPi(^c;`PTBWgŚ"?Ο3pٷ.7@fѩjsRLϱŷV뿟6ymհ@Ʃ7^(ćyo',}HPLG:э*(ԏCi8QhxWFۂO'&T˂G=کO6qvKi2Ͱ_{ǝwP#M R)[>z08Ak ÔbzYE'u|~)lU΍ϊL;fT??_İ=Ūz9cymI )3DKi.jGSY+VYu}*'gˎm_]Γl868붽d?5ɺtǒNvcG?LyHx:}663*es(w)W5 ;41+U0r/ -ֈ}ޫI|ѹ.!lUGgOmqyw n{7$>l8) ЕڀOjNaS~ .-/oR-Zh 54Dpa9WKoϓ_g/Т LR kG|/p`On[O;57ۆ7=ZDPc'RO#W= +g.&On^ЌmV=)UWBFyj FZku@BxxS({ӂk.Esrb -cc? yVt_wFݓ1g ~jԫX%4VNI hPJ} *JcGS19r&'c ègǮq zP؏փ`1Ν܈c&CTOU4=5֣a^ y510퍑_V*-.4V @W_q=ۭa3&-2!5{-HL7\ĝ/GS/=\L7;\w~TLU7y@L&@(}9릠\}/yi/A (sQc}Ǝ)ylTLU.1Xf;-ȌI-q^ 4^PlsR+遦ؿ{raߊ siJM穭Q< Fk~H>C0T 8I46]; {Bgi<wy_Jv`J7s>IENDB`doublecmd-0.5.8/pixmaps/mainicon/colored/v4_5.png0000644000175000017500000001334311765566230020715 0ustar alexxalexxPNG  IHDRe^:ڡ pHYs  tEXtSoftwareAdobe ImageReadyqe<pIDATx t[WOeٲdyQǻ%5{ڐd2PJ,@[Z8sPsf:90 P 4ӆ6]HC$MqR;݉E}idKO4,=w[wqHCrq%E''{\%{XAo\3W_s&CLt=rx=s>":($.AI35a+ryKfMFM1 )1{Xqy*+9jDL99I{}v؇z~ H >ߺtOWrݵPRZ.)15텏}<-ڹ) o3}8^8]8g/?/Gzf9[KXT*5|=p⭿O ~> J?-wZWZ6;y0qBǺF B/}T@l@c})-xaaCvKBoVT61LL2c>0d k4d*6^e ] A!b.isͶ;W^ dO̡?8-Z`{ '쮥'?u&C%˷nݺ _qnӘ|ivY?_vXиC2>v+)`YC{B+/Ϻe:t9`յ otҖ\cNrWj/`ȃŲRP&¤ݻwdje/L; JؤVߵs|WYi. M:, ^T,6}7JvY0(рHQYwU$=v| S{Xز(g"eRK"=Xf{ǩ6{ Ȧ|]5***d ,(DᔖOYpNG=ZV41ȴ$(.%K𥻚P_BޕnkFyyyЛv(je!2I vﹳNJ[TQ!L&D5ۛQTT)^0IQZ Z]%(2g?2]dqۇ*w@U_T@(FGd4,G:96c@rrrX=*AxuN |. :j4~'cdנ€%z=x@P98Wy7Zg |ąq`tC`Ӗl3Ra1硳ow=>o㻾F+eVf <م\F]&`ODa>ۏN r1Bs~oo{4Σ͑3~lX-YL(, }_x3LF7l I ^>؉3z0eWE$uq={8\}[6uf*YSc m>_`r-j:' hd 8QuoD/:JT}$2*+%YfUTM**? ) Hj ,62˟c PUOj$ ySalv(Ӏ0M``Gz'\@u! $.DIIHj. (Wtig!>J",[#}]trLRfOd"T*-B)RCapt @ m-,9KA4+F1dÌ?Q;wގIG&Sa@Da?p;ң c6fyB` OG)[ Ս6aXeݧR#h/a B`טK&IOԄXM:j8E">-A%=]Z\4Zvg\P$s}AXNS DžmˠB@"U[J bH !C%\>,j#c2` RRJt(FS,CM尾U螑j,1L{ ϊjLMJ"2/F$bY.8nB4W8uVZ2ɕnЈ; "L4$NrbzJ %Àa!# @踪Y5(Чos\p A+ΝIi2V8:AdӘ#UfAԜ}1t{<);x:~+gLT0ˍRn"k̋0 <#WԚOdRCҳmcjL:IOk'FŋZ%NzՓ)sK Aw$b7ȰR;R$)rxmd2^u\{M`el7#v>fb5`~FSk 1*)(t+ՓK^,< _C[mKJ*TyOGN09X̌B<~7U^UwR>oVŒ\xt\!N5=9 dE9`#dbcaЋEV҃vdvfOi.TR3x3j+rV\ HHEf oN(} q:wU%H ٓco)'85e |=F9 a(@ J6I[>TUd(vQ/}m>rsMaե6:>q慩I ޻TI{H}Q<)O Yr<߾Yo=콫$]owHwzrD5l[}A"P_hb1E=)_ ѾgعUc j;ml|j gO[ln 1{$[mBP/̝mGFHBEB[?|h9CQ,Dؓ]0%+s߾odctiJЭ aTݻ*7haKb??=T&I̝n#_Uͦ/M T#(4̭>Z7mJx㉧G$)I }'1T$bx7aϏ8'3P(ކ0uPg0~ri=.SxvUm@e;cݍT/a05 j ַԪN-tHƇiҪ:F? |ҋSgqp?ИC}V]P鎎MϸJQRK;7k:27{?:#IsP|-|,RoF{1: :,Y;e6O)1>ŋw*POW")S Ixi 'ֽ9ZåZaN&Rm6<4~J>7e{gjD$M%?s<4 +?b@iE+khI{_v_+%{?9ֳ fAz.|Y=;{끓AIuӟ\A}_|MRY# Q/VHrov6Jd]Rˣ/m׾;./!UvCm#&뒒 Kۻ_ HG3k^<3V{6WϊPg}ϝHĭ_xM?e6L7RU~9uz>1uk+X#8TwS G 3Ӓd8ޓ1Aw|U3* ]Kc^  {xM7^8DG_>4&Q4յګkG5jY\~%șlLA VfxMc4 \wRΏr0s~u%+o=vtۤ<~ f+ P]aƆ\f^cG |ֶ}#۰*lKo;:=9eWGP*V:7H}.ICYM_yb@}Mgp6|QK&xLCRXՓ˖h-yN:gCs_k # p(աyi)99~eSxuvqiAp͞,uܬyp%IkV,O@+M(C\=c^4 _EL&I0@wwPŔ،6W;yqȽ7~" a^0ٵ^ 7us@BP(\iiox9LLz/.90(fv\#{c;oi˷mUkk`^%@EGMV3$&& yYW_2^|)z]}_yKtyokKPl4ot j=Ø@eãQyTKC1]= kt9ZnG&$8u_帢 И*]nQ<\1P@q֚ؿ$Eϣ^l'wA>ߪ~O{Bx.`IENDB`doublecmd-0.5.8/pixmaps/mainicon/colored/v4_4.png0000644000175000017500000001514311765566230020714 0ustar alexxalexxPNG  IHDRe]U pHYs  tEXtSoftwareAdobe ImageReadyqe<IDATx]y\G}zcg[ڕVuYucc)\_IA2$e*EP1|#cccK6`Z[,jW{ưwfv8R׾ury:3<jfg>ѹ.{AN*QUØ \"w5v=N?.\TXJ$ҿ|pѠşTֺæ{Vׂ8fqD-6ve~1Ai퇓4|LfՒ;?vd?c=g=Sl^[2cQD$InxN4_"IJ#y:17T-TnB\AifߝRnAq΁=~Ï}a PZ6?ܱկ~;WH3!!!L/rɓDYO9@w}*`=O irF#'75ٚ/+C)”ϕk_FЭIQ1Ux\H ܔhI h%o4y$=!Fc(hQPP5xD6M>Qp(-,!SHvb3,ՁKušP ̭TiAhaת eʒ؃^r8kN4uOJyT34)e.|OGvۤ=1Iz8;FJ'+q_U_C*SOz//I‘0"0$;l6'2S[;"j5OGWH^fΜ~ll?, }UUjjsB011#\$:Xe ] 'ՀdE MY D CV!Fk ?+o9@$fJ١5NtFpYKee%nA0ĥqfΎy[EZl qф֘$wNaJ& 1PJ=>@}kry߳I%E izva?'.cbFքV8&kZjc`.e h8RVSdk[jBE,\.>~:GFƕw4bZM#i J%PH #P$cd3¦:;/P`@)F Nmm-0s B B5ih?|odyQucX*P Qt[cswEXMk;[ݲE vˢV&%ýݏu0b,HEj<]kRQD4=+P]]J+◌SFx^|#Wf1*yuM ,s$ZjIܵ\DtSRo dYaD04Eˍ v.'Zj@r/~nggs+c!&rC= ̅z5hk[`"'|ż ~+(/Y?Y7,zMvԻWUGRcp,P 3[֔yqjj 'f0>x/90ON+.s[Sw^Jг]:=E'؟y"a=$F4>TGzO g[WL?\[d-:; l]\R.LJy8.gmު)e3+s7g?g43e1.2_w.X ̦bTak>$"O l ED2&}9ec[E&RCCC8x1ڴa!sXR)2ziMm,*~qɍCcY|q[[@d1ßl_&/g2/Ϟ:B/GKKgI# ţ82UT/ 8o< I48|nҮn#:=2;yqNd?^W7~kkz0 ?[:&]Nmg,`1__ `0SAƔ:w%eɬg >) *JSs>6?[梼ↆlv/kcY P49D܎+~era3ÜnӀp7^@^lq)1gR29Uac:t9aD r̨.9Os 0 L M%!D`k#[^W jfB+`#Qb9%!zEa:Ƚ!՛ȊK֔3N(q]Bpm|jD^X4ŕk:%&ZQ [ "$Q|;}namfQe9~}&љ&4S+œ| {4"wU\BI(W358jwTy- ]L72\V(~F!E 4RFs %%7pA*:ʀ)@߈AuF0<@wse5 3]քn(Tdr+w)u(*@QKO(҈@z6ԎsȍMIQpAϴ׸e/{<lxRaٲ)E%HK_xH[UYA0 WN1nQcgφEC5VQqcr?- UPCH\a&b9=zvc4a?B D\ FEp8-6K"e ȫxE=~O_ֱRENN[U~LQ-cI"\w"xAPByɁ*S(H3τ=MxhQj`*+ UM"ZulY_+,]sZW\CzcLrn*T[71/Qeups.b0l\B"M{g tYؘ(HH-T9 ^QP25ˉ`r ~5PfU>$ 0%D]x~SKffA(Y,KTK c`04/ V \_+9 tN>l_X^Z<ɩ01/j쳡BKZL|AiuTkf^'f*M~bPQrLnJSO/ys .:,Fjs*GĪjp$^hn̾]1uT[hJjwˣorܱ 4&4/PȂkXTni^}^/1>[|ʍM˙1fۥՆ>ei)MyyfS||΢{&QK-WOZ08{G#|bs`|=3|W Iz*Y):h󢹡J^6ǩZ.;0YϷgirz^pC(|C0b(h>ZN_Ǜz2h^SηUgN#;:n \)IUW吭)N֯%IfA8nzւWzt]2 P %975o\]}0)&$ܿqA?*wgN|뾍9c_Hh+~T/v #<3H^'NOlv bkgOѼ@֙k#zNΛqC{BZ>27{ /Wxqh~;njNZ6(rYʓ"juJt6;[p꾡x4cT$+~wuW߸}YTҔj,2=5+02mlm<5TU:nk*mUiZVSv;>@ASxefzшOC-gyRJIENDB`doublecmd-0.5.8/pixmaps/mainicon/dc_128.svg0000644000175000017500000003403111765566230017501 0ustar alexxalexx doublecmd-0.5.8/pixmaps/mainicon/dc_48.svg0000644000175000017500000003277211765566230017434 0ustar alexxalexx doublecmd-0.5.8/pixmaps/mainicon/dc_192.svg0000644000175000017500000003406711765566230017513 0ustar alexxalexx doublecmd-0.5.8/pixmaps/mainicon/info.txt0000644000175000017500000000035011765566230017471 0ustar alexxalexxAuthor of the Double Commander icon is Андрей Гудяк (Andryei Gudyak). The source file is dc.ai. SVG files are generated from it. The "colored" directory contains some early versions of the icon with different colors. doublecmd-0.5.8/pixmaps/mainicon/dc_256.svg0000644000175000017500000003431011765566230017503 0ustar alexxalexx doublecmd-0.5.8/pixmaps/archive_src.ico0000644000175000017500000001712611226363660017167 0ustar alexxalexx  6 h( @ feeed d d c d b b b b a a ` ` _ _ _ ^ ^ ] ^ ] ] \ \ [s~|yvtqnlifda^[ \s}|zxwusrpnmkjhg^ \s}|zxvusrpnmkih_ \s~|{yxvusqonmjia \s~|zywutrpomljc \s}{yxwutrpnlke \s~|{yxvusqomlh \s~|{ywutrqomi \s}|zxvutrpnk \s}{zxvtsrpm \s}|zyxvtrqn \s}|zywvtrq \s}|zxwutr \s|{yxvtu \s~|zywuv \s~{zxwx \s~}{ywz \s}}{y| \s}|z~ \s~}{ \s \s}zxvspppppppppppppps~|ssssssssssssss(, Cvggfeed c c b a a ` _ ^ ^ ] ] \ [k{wsokgc [l~|zwusqnlih \m~{ywuronki \n~{xvtrolj ]o|zxutqnl ^pddddddddd~|zwtrpm _r~{yvsrp _r|zxvsq _tddd|zwvs `uddd{ywt avddddddddd~zxv bw}zw bx~|y cy~{ czrqpnnlkjiKyzuklllllllmzuFzzzzzzs  ?(  \ \ ] ^ ^ ^ ` ` b b cd degjlnnoqstuwxyzW\]`deijmqrvwz~y{||~}  E86420.,(&#!NdROIF@;9 Wg**VQMHC?:"^kZUPKFA=$hm**]XRMKC>%no`[TPMGB'sp**b_YSPKD)ur*ca\VQOJ+vtvL<7531/-qq*jillfedoublecmd-0.5.8/plugins/0000755000175000017500000000000012257501472014174 5ustar alexxalexxdoublecmd-0.5.8/plugins/build.sh0000755000175000017500000000360611612541364015635 0ustar alexxalexx#!/bin/sh # Build all plugins # This script run from main build.sh script # If you run it direct, set up $lazbuild first # CD to plugins directory basedir=$(pwd) cd plugins pluginsdir=$(pwd) # WCX plugins $lazbuild wcx/cpio/src/cpio.lpi $DC_ARCH $lazbuild wcx/deb/src/deb.lpi $DC_ARCH $lazbuild wcx/lzma/src/lzma.lpi $DC_ARCH $lazbuild wcx/rpm/src/rpm.lpi $DC_ARCH $lazbuild wcx/unrar/src/unrar.lpi $DC_ARCH $lazbuild wcx/zip/src/Zip.lpi $DC_ARCH # WDX plugins $lazbuild wdx/rpm_wdx/src/rpm_wdx.lpi $DC_ARCH $lazbuild wdx/deb_wdx/src/deb_wdx.lpi $DC_ARCH $lazbuild wdx/svn_wdx/src/svn_wdx.lpi $DC_ARCH $lazbuild wdx/xpi_wdx/src/xpi_wdx.lpi $DC_ARCH # WFX plugins $lazbuild wfx/ftp/src/ftp.lpi $DC_ARCH $lazbuild wfx/samba/src/samba.lpi $DC_ARCH # WLX plugins $lazbuild wlx/WlxMplayer/src/wlxMplayer.lpi $DC_ARCH # DSX plugins $lazbuild dsx/DSXLocate/src/DSXLocate.lpi $DC_ARCH # Strip and rename WCX cd wcx/cpio/lib/ strip --strip-all cpio.wcx cd $pluginsdir cd wcx/deb/lib/ strip --strip-all deb.wcx cd $pluginsdir cd wcx/lzma/lib/ strip --strip-all lzma.wcx cd $pluginsdir cd wcx/rpm/lib/ strip --strip-all rpm.wcx cd $pluginsdir cd wcx/unrar/lib/ strip --strip-all unrar.wcx cd $pluginsdir cd wcx/zip/lib/ strip --strip-all zip.wcx cd $pluginsdir # Strip and rename WDX cd wdx/rpm_wdx/lib/ strip --strip-all rpm_wdx.wdx cd $pluginsdir cd wdx/deb_wdx/lib/ strip --strip-all deb_wdx.wdx cd $pluginsdir cd wdx/svn_wdx/lib/ strip --strip-all svn_wdx.wdx cd $pluginsdir cd wdx/xpi_wdx/lib/ strip --strip-all xpi_wdx.wdx cd $pluginsdir # Strip and rename WFX cd wfx/ftp/lib/ strip --strip-all ftp.wfx cd $pluginsdir cd wfx/samba/lib/ strip --strip-all samba.wfx cd $pluginsdir # Strip and rename WLX cd wlx/WlxMplayer/lib/ strip --strip-all wlxmplayer.wlx cd $pluginsdir # Strip and rename DSX cd dsx/DSXLocate/lib/ strip --strip-all dsxlocate.dsx cd $pluginsdir # Return from plugins directory cd $basedir doublecmd-0.5.8/plugins/dsx/0000755000175000017500000000000012257501472014772 5ustar alexxalexxdoublecmd-0.5.8/plugins/dsx/DSXLocate/0000755000175000017500000000000012257501472016560 5ustar alexxalexxdoublecmd-0.5.8/plugins/dsx/DSXLocate/lib/0000755000175000017500000000000012257501472017326 5ustar alexxalexxdoublecmd-0.5.8/plugins/dsx/DSXLocate/src/0000755000175000017500000000000012257501472017347 5ustar alexxalexxdoublecmd-0.5.8/plugins/dsx/DSXLocate/src/DSXLocate.lpr0000644000175000017500000001201012014201074021630 0ustar alexxalexx { DSXLocate ------------------------------------------------------------------------- This is DSX (Search) plugin for Double Commander. Plugin use locate and it's database for searching. Copyright (C) 2008 Dmitry Kolomiets (B4rr4cuda@rambler.ru) The original class of TExProcess used in plugin was written by Anton Rjeshevsky. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } library DSXLocate; {$mode objfpc}{$H+} {$include calling.inc} uses Classes, SysUtils, DsxPlugin, un_process; var List: TStringList; LocatePath: String; type { TPlugInfo } TPlugInfo = class private FProcess: TExProcess; FAddProc: TSAddFileProc; FUpdateProc: TSUpdateStatusProc; FSearchRec: TDsxSearchRecord; FilesScanned: Integer; public PluginNr: Integer; //--------------------- constructor Create(Nr: Integer); procedure SetProcs(AddProc: TSAddFileProc; UpdateProc: TSUpdateStatusProc); procedure SetDefs(pSearchRec: PDsxSearchRecord); destructor Destroy; override; //--------------------- procedure Start; procedure Stop; procedure OnReadLn(str: String); end; constructor TPlugInfo.Create(Nr: Integer); begin PluginNr := Nr; FProcess := nil; end; procedure TPlugInfo.SetProcs(AddProc: TSAddFileProc; UpdateProc: TSUpdateStatusProc); begin FAddProc := AddProc; FUpdateProc := UpdateProc; end; procedure TPlugInfo.SetDefs(pSearchRec: PDsxSearchRecord); begin FSearchRec := pSearchRec^; end; destructor TPlugInfo.Destroy; begin if Assigned(FProcess) then FreeAndNil(FProcess); inherited Destroy; end; procedure TPlugInfo.Start; var sSearch: String; begin FilesScanned := 0; if Assigned(FProcess) then FreeAndNil(FProcess); FProcess := TExProcess.Create; FProcess.OnReadLn := @OnReadLn; with FSearchRec do begin // TProcess doesn't support passing parameters other than quoted in "". // Adapt this code when this changes. sSearch := String(StartPath); if sSearch <> '' then begin // Search in given start path and in subdirectories. sSearch := '"' + IncludeTrailingPathDelimiter(sSearch) + String(FileMask) + '" ' + '"' + IncludeTrailingPathDelimiter(sSearch) + '*' + PathDelim + String(FileMask) + '"'; end else sSearch := '"' + String(FileMask) + '"'; end; if LocatePath <> '' then FProcess.SetCmdLine(LocatePath + ' ' + sSearch); FProcess.Execute; end; procedure TPlugInfo.Stop; begin if Assigned(FProcess) then begin FProcess.Stop; FreeAndNil(FProcess); end; end; procedure TPlugInfo.OnReadLn(str: String); begin if str <> '' then Inc(FilesScanned); FAddProc(PluginNr, PChar(str)); FUpdateProc(PluginNr, PChar(str), FilesScanned); end; {Main --------------------------------------------------------------------------------} function Init(dps: PDsxDefaultParamStruct; pAddFileProc: TSAddFileProc; pUpdateStatus: TSUpdateStatusProc): Integer; dcpcall; var i: Integer; begin if not assigned(List) then List := TStringList.Create; I := List.Count; List.AddObject(IntToStr(I), TPlugInfo.Create(I)); TPlugInfo(List.Objects[I]).SetProcs(pAddFileProc, pUpdateStatus); Result := I; end; procedure StartSearch(FPluginNr: Integer; pSearchRecRec: PDsxSearchRecord); dcpcall; begin TPlugInfo(List.Objects[FPluginNr]).SetDefs(pSearchRecRec); TPlugInfo(List.Objects[FPluginNr]).Start; end; procedure StopSearch(FPluginNr: Integer); dcpcall; begin TPlugInfo(List.Objects[FPluginNr]).Stop; end; procedure Finalize(FPluginNr: Integer); dcpcall; begin if not Assigned(List) then exit; if (FPluginNr > List.Count) or (FPluginNr < 0) or (List.Count = 0) then exit; //Destroy PlugInfo Item № TPlugInfo(List.Objects[FPluginNr]).Free; List.Delete(FPluginNr); if List.Count = 0 then FreeAndNil(List); end; exports Init, StartSearch, StopSearch, Finalize; type Tx = class procedure OnReadLnWhich(str: String); end; procedure Tx.OnReadLnWhich(str: String); begin if str <> '' then begin LocatePath := str; //WriteLn('PLUGIN: locate found in '+str); end; end; var Pr: TExProcess; x: TX; {$R *.res} begin pr := TExProcess.Create('which locate'); x := Tx.Create; pr.OnReadLn := @x.OnReadLnWhich; pr.Execute; pr.Free; x.Free; {$IFDEF UNIX} if LocatePath = '' then Writeln('DSXLocate: Locate utility not found.'); {$ENDIF} end. doublecmd-0.5.8/plugins/dsx/DSXLocate/src/DSXLocate.lpi0000644000175000017500000000474012210604521021634 0ustar alexxalexx <ResourceType Value="res"/> </General> <VersionInfo> <UseVersionInfo Value="True"/> <MinorVersionNr Value="1"/> <StringTable FileDescription="DSXLocate plugin for Double Commander" LegalCopyright="Copyright (C) 2006-2012 Koblov Alexander" ProductVersion=""/> </VersionInfo> <BuildModes Count="1"> <Item1 Name="default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <DestinationDirectory Value="$(TestDir)\publishedproject\"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <Units Count="2"> <Unit0> <Filename Value="DSXLocate.lpr"/> <IsPartOfProject Value="True"/> <UnitName Value="DSXLocate"/> </Unit0> <Unit1> <Filename Value="un_process.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="un_process"/> </Unit1> </Units> </ProjectOptions> <CompilerOptions> <Version Value="11"/> <Target> <Filename Value="../lib/dsxlocate.dsx" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir);../../../../sdk"/> <OtherUnitFiles Value="../../../../sdk"/> <UnitOutputDirectory Value="../lib"/> </SearchPaths> <Conditionals Value="if (TargetCPU <> 'arm') then begin CustomOptions += '-fPIC'; end; if (TargetOS = 'darwin') then begin LinkerOptions += ' -no_order_inits'; end;"/> <Parsing> <SyntaxOptions> <UseAnsiStrings Value="False"/> </SyntaxOptions> </Parsing> <Linking> <LinkSmart Value="True"/> <Options> <PassLinkerOptions Value="True"/> <ExecutableType Value="Library"/> </Options> </Linking> <Other> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> </CONFIG> ��������������������������������doublecmd-0.5.8/plugins/dsx/DSXLocate/src/un_process.pas��������������������������������������������0000644�0001750�0001750�00000004444�12014201074�022224� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{$mode delphi} {$longstrings on} unit un_process; interface uses process, Math, SysUtils; type TOnReadLn = procedure(str: String) of object; { TExProcess } TExProcess = class protected p: TProcess; s: String; FStop: Boolean; function _GetExitStatus(): Integer; public OnReadLn: TOnReadLn; constructor Create(commandline: String = ''); procedure Execute; procedure Stop; procedure SetCmdLine(commandline: String); destructor Destroy; override; property ExitStatus: Integer read _GetExitStatus; end; implementation const buf_len = 3000; { TExProcess } function TExProcess._GetExitStatus(): Integer; begin Result := p.ExitStatus; end; constructor TExProcess.Create(commandline: String = ''); begin s := ''; p := TProcess.Create(nil); p.CommandLine := commandline; p.Options := [poUsePipes, poNoConsole, poWaitOnExit]; end; procedure TExProcess.Execute; var buf: String; i, j: Integer; begin try p.Execute; repeat if FStop then exit; SetLength(buf, buf_len); SetLength(buf, p.output.Read(buf[1], length(buf))); //waits for the process output // cut the incoming stream to lines: s := s + buf; //add to the accumulator repeat //detect the line breaks and cut. i := Pos(#13, s); j := Pos(#10, s); if i = 0 then i := j; if j = 0 then j := i; if j = 0 then Break; //there are no complete lines yet. if Assigned(OnReadLn) then OnReadLn(Copy(s, 1, min(i, j) - 1)); //return the line without the CR/LF characters s := Copy(s, max(i, j) + 1, length(s) - max(i, j)); //remove the line from accumulator until False; until buf = ''; if s <> '' then if Assigned(OnReadLn) then OnReadLn(s); buf := ''; except {$IFDEF UNIX} on e: Exception do Writeln('DSXLocate error: ', e.Message); {$ENDIF} end; if Assigned(OnReadLn) then OnReadLn(buf); //Empty line to notify DC about search process finish end; procedure TExProcess.Stop; begin FStop := True; end; procedure TExProcess.SetCmdLine(commandline: String); begin p.CommandLine := commandline; end; destructor TExProcess.Destroy; begin FreeAndNil(p); inherited Destroy; end; end. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�015000� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/��������������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�015571� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/COPYING.LESSER.txt��������������������������������������������������0000644�0001750�0001750�00000016726�12014201074�020434� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library.������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/COPYING.GPL.txt�����������������������������������������������������0000644�0001750�0001750�00000104500�12014201074�020045� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. <one line to give the program's name and a brief idea of what it does.> Copyright (C) <year> <name of author> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: <program> Copyright (C) <year> <name of author> This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/synapse/������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017253� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/synapse/ssl_openssl.pas���������������������������������������������0000644�0001750�0001750�00000054526�12014201074�022322� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{==============================================================================| | Project : Ararat Synapse | 001.002.000 | |==============================================================================| | Content: SSL support by OpenSSL | |==============================================================================| | Copyright (c)1999-2008, Lukas Gebauer | | All rights reserved. | | | | Redistribution and use in source and binary forms, with or without | | modification, are permitted provided that the following conditions are met: | | | | Redistributions of source code must retain the above copyright notice, this | | list of conditions and the following disclaimer. | | | | Redistributions in binary form must reproduce the above copyright notice, | | this list of conditions and the following disclaimer in the documentation | | and/or other materials provided with the distribution. | | | | Neither the name of Lukas Gebauer nor the names of its contributors may | | be used to endorse or promote products derived from this software without | | specific prior written permission. | | | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | | ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR | | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | | DAMAGE. | |==============================================================================| | The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).| | Portions created by Lukas Gebauer are Copyright (c)2005-2012. | | Portions created by Petr Fejfar are Copyright (c)2011-2012. | | All Rights Reserved. | |==============================================================================| | Contributor(s): | |==============================================================================| | History: see HISTORY.HTM from distribution package | | (Found at URL: http://www.ararat.cz/synapse/) | |==============================================================================} //requires OpenSSL libraries! {:@abstract(SSL plugin for OpenSSL) You need OpenSSL libraries version 0.9.7. It can work with 0.9.6 too, but application mysteriously crashing when you are using freePascal on Linux. Use Kylix on Linux is OK! If you have version 0.9.7 on Linux, then I not see any problems with FreePascal. OpenSSL libraries are loaded dynamicly - you not need OpenSSl librares even you compile your application with this unit. SSL just not working when you not have OpenSSL libraries. This plugin have limited support for .NET too! Because is not possible to use callbacks with CDECL calling convention under .NET, is not supported key/certificate passwords and multithread locking. :-( For handling keys and certificates you can use this properties: @link(TCustomSSL.CertificateFile) for PEM or ASN1 DER (cer) format. @br @link(TCustomSSL.Certificate) for ASN1 DER format only. @br @link(TCustomSSL.PrivateKeyFile) for PEM or ASN1 DER (key) format. @br @link(TCustomSSL.PrivateKey) for ASN1 DER format only. @br @link(TCustomSSL.CertCAFile) for PEM CA certificate bundle. @br @link(TCustomSSL.PFXFile) for PFX format. @br @link(TCustomSSL.PFX) for PFX format from binary string. @br This plugin is capable to create Ad-Hoc certificates. When you start SSL/TLS server without explicitly assigned key and certificate, then this plugin create Ad-Hoc key and certificate for each incomming connection by self. It slowdown accepting of new connections! } {$IFDEF FPC} {$MODE DELPHI} {$ENDIF} {$H+} {$IFDEF UNICODE} {$WARN IMPLICIT_STRING_CAST OFF} {$WARN IMPLICIT_STRING_CAST_LOSS OFF} {$ENDIF} unit ssl_openssl; interface uses SysUtils, Classes, blcksock, synsock, synautil, {$IFDEF CIL} System.Text, {$ENDIF} ssl_openssl_lib; type {:@abstract(class implementing OpenSSL SSL plugin.) Instance of this class will be created for each @link(TTCPBlockSocket). You not need to create instance of this class, all is done by Synapse itself!} TSSLOpenSSL = class(TCustomSSL) protected FSsl: PSSL; Fctx: PSSL_CTX; function SSLCheck: Boolean; function SetSslKeys: boolean; function Init(server:Boolean): Boolean; function DeInit: Boolean; function Prepare(server:Boolean): Boolean; function LoadPFX(pfxdata: ansistring): Boolean; function CreateSelfSignedCert(Host: string): Boolean; override; public {:See @inherited} constructor Create(const Value: TTCPBlockSocket); override; destructor Destroy; override; {:See @inherited} function LibVersion: String; override; {:See @inherited} function LibName: String; override; {:See @inherited and @link(ssl_cryptlib) for more details.} function Connect: boolean; override; {:See @inherited and @link(ssl_cryptlib) for more details.} function Accept: boolean; override; {:See @inherited} function Shutdown: boolean; override; {:See @inherited} function BiShutdown: boolean; override; {:See @inherited} function SendBuffer(Buffer: TMemory; Len: Integer): Integer; override; {:See @inherited} function RecvBuffer(Buffer: TMemory; Len: Integer): Integer; override; {:See @inherited} function WaitingData: Integer; override; {:See @inherited} function GetSSLVersion: string; override; {:See @inherited} function GetPeerSubject: string; override; {:See @inherited} function GetPeerSerialNo: integer; override; {pf} {:See @inherited} function GetPeerIssuer: string; override; {:See @inherited} function GetPeerName: string; override; {:See @inherited} function GetPeerNameHash: cardinal; override; {pf} {:See @inherited} function GetPeerFingerprint: string; override; {:See @inherited} function GetCertInfo: string; override; {:See @inherited} function GetCipherName: string; override; {:See @inherited} function GetCipherBits: integer; override; {:See @inherited} function GetCipherAlgBits: integer; override; {:See @inherited} function GetVerifyCert: integer; override; end; implementation {==============================================================================} {$IFNDEF CIL} function PasswordCallback(buf:PAnsiChar; size:Integer; rwflag:Integer; userdata: Pointer):Integer; cdecl; var Password: AnsiString; begin Password := ''; if TCustomSSL(userdata) is TCustomSSL then Password := TCustomSSL(userdata).KeyPassword; if Length(Password) > (Size - 1) then SetLength(Password, Size - 1); Result := Length(Password); StrLCopy(buf, PAnsiChar(Password + #0), Result + 1); end; {$ENDIF} {==============================================================================} constructor TSSLOpenSSL.Create(const Value: TTCPBlockSocket); begin inherited Create(Value); FCiphers := 'DEFAULT'; FSsl := nil; Fctx := nil; end; destructor TSSLOpenSSL.Destroy; begin DeInit; inherited Destroy; end; function TSSLOpenSSL.LibVersion: String; begin Result := SSLeayversion(0); end; function TSSLOpenSSL.LibName: String; begin Result := 'ssl_openssl'; end; function TSSLOpenSSL.SSLCheck: Boolean; var {$IFDEF CIL} sb: StringBuilder; {$ENDIF} s : AnsiString; begin Result := true; FLastErrorDesc := ''; FLastError := ErrGetError; ErrClearError; if FLastError <> 0 then begin Result := False; {$IFDEF CIL} sb := StringBuilder.Create(256); ErrErrorString(FLastError, sb, 256); FLastErrorDesc := Trim(sb.ToString); {$ELSE} s := StringOfChar(#0, 256); ErrErrorString(FLastError, s, Length(s)); FLastErrorDesc := s; {$ENDIF} end; end; function TSSLOpenSSL.CreateSelfSignedCert(Host: string): Boolean; var pk: EVP_PKEY; x: PX509; rsa: PRSA; t: PASN1_UTCTIME; name: PX509_NAME; b: PBIO; xn, y: integer; s: AnsiString; {$IFDEF CIL} sb: StringBuilder; {$ENDIF} begin Result := True; pk := EvpPkeynew; x := X509New; try rsa := RsaGenerateKey(1024, $10001, nil, nil); EvpPkeyAssign(pk, EVP_PKEY_RSA, rsa); X509SetVersion(x, 2); Asn1IntegerSet(X509getSerialNumber(x), 0); t := Asn1UtctimeNew; try X509GmtimeAdj(t, -60 * 60 *24); X509SetNotBefore(x, t); X509GmtimeAdj(t, 60 * 60 * 60 *24); X509SetNotAfter(x, t); finally Asn1UtctimeFree(t); end; X509SetPubkey(x, pk); Name := X509GetSubjectName(x); X509NameAddEntryByTxt(Name, 'C', $1001, 'CZ', -1, -1, 0); X509NameAddEntryByTxt(Name, 'CN', $1001, host, -1, -1, 0); x509SetIssuerName(x, Name); x509Sign(x, pk, EvpGetDigestByName('SHA1')); b := BioNew(BioSMem); try i2dX509Bio(b, x); xn := bioctrlpending(b); {$IFDEF CIL} sb := StringBuilder.Create(xn); y := bioread(b, sb, xn); if y > 0 then begin sb.Length := y; s := sb.ToString; end; {$ELSE} setlength(s, xn); y := bioread(b, s, xn); if y > 0 then setlength(s, y); {$ENDIF} finally BioFreeAll(b); end; FCertificate := s; b := BioNew(BioSMem); try i2dPrivatekeyBio(b, pk); xn := bioctrlpending(b); {$IFDEF CIL} sb := StringBuilder.Create(xn); y := bioread(b, sb, xn); if y > 0 then begin sb.Length := y; s := sb.ToString; end; {$ELSE} setlength(s, xn); y := bioread(b, s, xn); if y > 0 then setlength(s, y); {$ENDIF} finally BioFreeAll(b); end; FPrivatekey := s; finally X509free(x); EvpPkeyFree(pk); end; end; function TSSLOpenSSL.LoadPFX(pfxdata: Ansistring): Boolean; var cert, pkey, ca: SslPtr; b: PBIO; p12: SslPtr; begin Result := False; b := BioNew(BioSMem); try BioWrite(b, pfxdata, Length(PfxData)); p12 := d2iPKCS12bio(b, nil); if not Assigned(p12) then Exit; try cert := nil; pkey := nil; ca := nil; try {pf} if PKCS12parse(p12, FKeyPassword, pkey, cert, ca) > 0 then if SSLCTXusecertificate(Fctx, cert) > 0 then if SSLCTXusePrivateKey(Fctx, pkey) > 0 then Result := True; {pf} finally EvpPkeyFree(pkey); X509free(cert); SkX509PopFree(ca,_X509Free); // for ca=nil a new STACK was allocated... end; {/pf} finally PKCS12free(p12); end; finally BioFreeAll(b); end; end; function TSSLOpenSSL.SetSslKeys: boolean; var st: TFileStream; s: string; begin Result := False; if not assigned(FCtx) then Exit; try if FCertificateFile <> '' then if SslCtxUseCertificateChainFile(FCtx, FCertificateFile) <> 1 then if SslCtxUseCertificateFile(FCtx, FCertificateFile, SSL_FILETYPE_PEM) <> 1 then if SslCtxUseCertificateFile(FCtx, FCertificateFile, SSL_FILETYPE_ASN1) <> 1 then Exit; if FCertificate <> '' then if SslCtxUseCertificateASN1(FCtx, length(FCertificate), FCertificate) <> 1 then Exit; SSLCheck; if FPrivateKeyFile <> '' then if SslCtxUsePrivateKeyFile(FCtx, FPrivateKeyFile, SSL_FILETYPE_PEM) <> 1 then if SslCtxUsePrivateKeyFile(FCtx, FPrivateKeyFile, SSL_FILETYPE_ASN1) <> 1 then Exit; if FPrivateKey <> '' then if SslCtxUsePrivateKeyASN1(EVP_PKEY_RSA, FCtx, FPrivateKey, length(FPrivateKey)) <> 1 then Exit; SSLCheck; if FCertCAFile <> '' then if SslCtxLoadVerifyLocations(FCtx, FCertCAFile, '') <> 1 then Exit; if FPFXfile <> '' then begin try st := TFileStream.Create(FPFXfile, fmOpenRead or fmShareDenyNone); try s := ReadStrFromStream(st, st.Size); finally st.Free; end; if not LoadPFX(s) then Exit; except on Exception do Exit; end; end; if FPFX <> '' then if not LoadPFX(FPfx) then Exit; SSLCheck; Result := True; finally SSLCheck; end; end; function TSSLOpenSSL.Init(server:Boolean): Boolean; var s: AnsiString; begin Result := False; FLastErrorDesc := ''; FLastError := 0; Fctx := nil; case FSSLType of LT_SSLv2: Fctx := SslCtxNew(SslMethodV2); LT_SSLv3: Fctx := SslCtxNew(SslMethodV3); LT_TLSv1: Fctx := SslCtxNew(SslMethodTLSV1); LT_all: Fctx := SslCtxNew(SslMethodV23); else Exit; end; if Fctx = nil then begin SSLCheck; Exit; end else begin s := FCiphers; SslCtxSetCipherList(Fctx, s); if FVerifyCert then SslCtxSetVerify(FCtx, SSL_VERIFY_PEER, nil) else SslCtxSetVerify(FCtx, SSL_VERIFY_NONE, nil); {$IFNDEF CIL} SslCtxSetDefaultPasswdCb(FCtx, @PasswordCallback); SslCtxSetDefaultPasswdCbUserdata(FCtx, self); {$ENDIF} if server and (FCertificateFile = '') and (FCertificate = '') and (FPFXfile = '') and (FPFX = '') then begin CreateSelfSignedcert(FSocket.ResolveIPToName(FSocket.GetRemoteSinIP)); end; if not SetSSLKeys then Exit else begin Fssl := nil; Fssl := SslNew(Fctx); if Fssl = nil then begin SSLCheck; exit; end; end; end; Result := true; end; function TSSLOpenSSL.DeInit: Boolean; begin Result := True; if assigned (Fssl) then sslfree(Fssl); Fssl := nil; if assigned (Fctx) then begin SslCtxFree(Fctx); Fctx := nil; ErrRemoveState(0); end; FSSLEnabled := False; end; function TSSLOpenSSL.Prepare(server:Boolean): Boolean; begin Result := false; DeInit; if Init(server) then Result := true else DeInit; end; function TSSLOpenSSL.Connect: boolean; var x: integer; begin Result := False; if FSocket.Socket = INVALID_SOCKET then Exit; if Prepare(False) then begin {$IFDEF CIL} if sslsetfd(FSsl, FSocket.Socket.Handle.ToInt32) < 1 then {$ELSE} if sslsetfd(FSsl, FSocket.Socket) < 1 then {$ENDIF} begin SSLCheck; Exit; end; if SNIHost<>'' then SSLCtrl(Fssl, SSL_CTRL_SET_TLSEXT_HOSTNAME, TLSEXT_NAMETYPE_host_name, PAnsiChar(SNIHost)); x := sslconnect(FSsl); if x < 1 then begin SSLcheck; Exit; end; if FverifyCert then if (GetVerifyCert <> 0) or (not DoVerifyCert) then Exit; FSSLEnabled := True; Result := True; end; end; function TSSLOpenSSL.Accept: boolean; var x: integer; begin Result := False; if FSocket.Socket = INVALID_SOCKET then Exit; if Prepare(True) then begin {$IFDEF CIL} if sslsetfd(FSsl, FSocket.Socket.Handle.ToInt32) < 1 then {$ELSE} if sslsetfd(FSsl, FSocket.Socket) < 1 then {$ENDIF} begin SSLCheck; Exit; end; x := sslAccept(FSsl); if x < 1 then begin SSLcheck; Exit; end; FSSLEnabled := True; Result := True; end; end; function TSSLOpenSSL.Shutdown: boolean; begin if assigned(FSsl) then sslshutdown(FSsl); DeInit; Result := True; end; function TSSLOpenSSL.BiShutdown: boolean; var x: integer; begin if assigned(FSsl) then begin x := sslshutdown(FSsl); if x = 0 then begin Synsock.Shutdown(FSocket.Socket, 1); sslshutdown(FSsl); end; end; DeInit; Result := True; end; function TSSLOpenSSL.SendBuffer(Buffer: TMemory; Len: Integer): Integer; var err: integer; {$IFDEF CIL} s: ansistring; {$ENDIF} begin FLastError := 0; FLastErrorDesc := ''; repeat {$IFDEF CIL} s := StringOf(Buffer); Result := SslWrite(FSsl, s, Len); {$ELSE} Result := SslWrite(FSsl, Buffer , Len); {$ENDIF} err := SslGetError(FSsl, Result); until (err <> SSL_ERROR_WANT_READ) and (err <> SSL_ERROR_WANT_WRITE); if err = SSL_ERROR_ZERO_RETURN then Result := 0 else if (err <> 0) then FLastError := err; end; function TSSLOpenSSL.RecvBuffer(Buffer: TMemory; Len: Integer): Integer; var err: integer; {$IFDEF CIL} sb: stringbuilder; s: ansistring; {$ENDIF} begin FLastError := 0; FLastErrorDesc := ''; repeat {$IFDEF CIL} sb := StringBuilder.Create(Len); Result := SslRead(FSsl, sb, Len); if Result > 0 then begin sb.Length := Result; s := sb.ToString; System.Array.Copy(BytesOf(s), Buffer, length(s)); end; {$ELSE} Result := SslRead(FSsl, Buffer , Len); {$ENDIF} err := SslGetError(FSsl, Result); until (err <> SSL_ERROR_WANT_READ) and (err <> SSL_ERROR_WANT_WRITE); if err = SSL_ERROR_ZERO_RETURN then Result := 0 {pf}// Verze 1.1.0 byla s else tak jak to ted mam, // ve verzi 1.1.1 bylo ELSE zruseno, ale pak je SSL_ERROR_ZERO_RETURN // propagovano jako Chyba. {pf} else {/pf} if (err <> 0) then FLastError := err; end; function TSSLOpenSSL.WaitingData: Integer; begin Result := sslpending(Fssl); end; function TSSLOpenSSL.GetSSLVersion: string; begin if not assigned(FSsl) then Result := '' else Result := SSlGetVersion(FSsl); end; function TSSLOpenSSL.GetPeerSubject: string; var cert: PX509; s: ansistring; {$IFDEF CIL} sb: StringBuilder; {$ENDIF} begin if not assigned(FSsl) then begin Result := ''; Exit; end; cert := SSLGetPeerCertificate(Fssl); if not assigned(cert) then begin Result := ''; Exit; end; {$IFDEF CIL} sb := StringBuilder.Create(4096); Result := X509NameOneline(X509GetSubjectName(cert), sb, 4096); {$ELSE} setlength(s, 4096); Result := X509NameOneline(X509GetSubjectName(cert), s, Length(s)); {$ENDIF} X509Free(cert); end; function TSSLOpenSSL.GetPeerSerialNo: integer; {pf} var cert: PX509; SN: PASN1_INTEGER; begin if not assigned(FSsl) then begin Result := -1; Exit; end; cert := SSLGetPeerCertificate(Fssl); try if not assigned(cert) then begin Result := -1; Exit; end; SN := X509GetSerialNumber(cert); Result := Asn1IntegerGet(SN); finally X509Free(cert); end; end; function TSSLOpenSSL.GetPeerName: string; var s: ansistring; begin s := GetPeerSubject; s := SeparateRight(s, '/CN='); Result := Trim(SeparateLeft(s, '/')); end; function TSSLOpenSSL.GetPeerNameHash: cardinal; {pf} var cert: PX509; begin if not assigned(FSsl) then begin Result := 0; Exit; end; cert := SSLGetPeerCertificate(Fssl); try if not assigned(cert) then begin Result := 0; Exit; end; Result := X509NameHash(X509GetSubjectName(cert)); finally X509Free(cert); end; end; function TSSLOpenSSL.GetPeerIssuer: string; var cert: PX509; s: ansistring; {$IFDEF CIL} sb: StringBuilder; {$ENDIF} begin if not assigned(FSsl) then begin Result := ''; Exit; end; cert := SSLGetPeerCertificate(Fssl); if not assigned(cert) then begin Result := ''; Exit; end; {$IFDEF CIL} sb := StringBuilder.Create(4096); Result := X509NameOneline(X509GetIssuerName(cert), sb, 4096); {$ELSE} setlength(s, 4096); Result := X509NameOneline(X509GetIssuerName(cert), s, Length(s)); {$ENDIF} X509Free(cert); end; function TSSLOpenSSL.GetPeerFingerprint: string; var cert: PX509; x: integer; {$IFDEF CIL} sb: StringBuilder; {$ENDIF} begin if not assigned(FSsl) then begin Result := ''; Exit; end; cert := SSLGetPeerCertificate(Fssl); if not assigned(cert) then begin Result := ''; Exit; end; {$IFDEF CIL} sb := StringBuilder.Create(EVP_MAX_MD_SIZE); X509Digest(cert, EvpGetDigestByName('MD5'), sb, x); sb.Length := x; Result := sb.ToString; {$ELSE} setlength(Result, EVP_MAX_MD_SIZE); X509Digest(cert, EvpGetDigestByName('MD5'), Result, x); SetLength(Result, x); {$ENDIF} X509Free(cert); end; function TSSLOpenSSL.GetCertInfo: string; var cert: PX509; x, y: integer; b: PBIO; s: AnsiString; {$IFDEF CIL} sb: stringbuilder; {$ENDIF} begin if not assigned(FSsl) then begin Result := ''; Exit; end; cert := SSLGetPeerCertificate(Fssl); if not assigned(cert) then begin Result := ''; Exit; end; try {pf} b := BioNew(BioSMem); try X509Print(b, cert); x := bioctrlpending(b); {$IFDEF CIL} sb := StringBuilder.Create(x); y := bioread(b, sb, x); if y > 0 then begin sb.Length := y; s := sb.ToString; end; {$ELSE} setlength(s,x); y := bioread(b,s,x); if y > 0 then setlength(s, y); {$ENDIF} Result := ReplaceString(s, LF, CRLF); finally BioFreeAll(b); end; {pf} finally X509Free(cert); end; {/pf} end; function TSSLOpenSSL.GetCipherName: string; begin if not assigned(FSsl) then Result := '' else Result := SslCipherGetName(SslGetCurrentCipher(FSsl)); end; function TSSLOpenSSL.GetCipherBits: integer; var x: integer; begin if not assigned(FSsl) then Result := 0 else Result := SSLCipherGetBits(SslGetCurrentCipher(FSsl), x); end; function TSSLOpenSSL.GetCipherAlgBits: integer; begin if not assigned(FSsl) then Result := 0 else SSLCipherGetBits(SslGetCurrentCipher(FSsl), Result); end; function TSSLOpenSSL.GetVerifyCert: integer; begin if not assigned(FSsl) then Result := 1 else Result := SslGetVerifyResult(FSsl); end; {==============================================================================} initialization if InitSSLInterface then SSLImplementation := TSSLOpenSSL; end. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/synapse/ssl_openssl_lib.pas�����������������������������������������0000644�0001750�0001750�00000230373�12014201074�023144� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{==============================================================================| | Project : Ararat Synapse | 003.007.000 | |==============================================================================| | Content: SSL support by OpenSSL | |==============================================================================| | Copyright (c)1999-2012, Lukas Gebauer | | All rights reserved. | | | | Redistribution and use in source and binary forms, with or without | | modification, are permitted provided that the following conditions are met: | | | | Redistributions of source code must retain the above copyright notice, this | | list of conditions and the following disclaimer. | | | | Redistributions in binary form must reproduce the above copyright notice, | | this list of conditions and the following disclaimer in the documentation | | and/or other materials provided with the distribution. | | | | Neither the name of Lukas Gebauer nor the names of its contributors may | | be used to endorse or promote products derived from this software without | | specific prior written permission. | | | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | | ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR | | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | | DAMAGE. | |==============================================================================| | The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).| | Portions created by Lukas Gebauer are Copyright (c)2002-2012. | | Portions created by Petr Fejfar are Copyright (c)2011-2012. | | All Rights Reserved. | |==============================================================================| | Contributor(s): | |==============================================================================| | History: see HISTORY.HTM from distribution package | | (Found at URL: http://www.ararat.cz/synapse/) | |==============================================================================} { Special thanks to Gregor Ibic <gregor.ibic@intelicom.si> (Intelicom d.o.o., http://www.intelicom.si) for good inspiration about begin with SSL programming. } {$IFDEF FPC} {$MODE DELPHI} {$ENDIF} {$H+} {$IFDEF VER125} {$DEFINE BCB} {$ENDIF} {$IFDEF BCB} {$ObjExportAll On} (*$HPPEMIT 'namespace ssl_openssl_lib { using System::Shortint; }' *) {$ENDIF} //old Delphi does not have MSWINDOWS define. {$IFDEF WIN32} {$IFNDEF MSWINDOWS} {$DEFINE MSWINDOWS} {$ENDIF} {$ENDIF} {:@abstract(OpenSSL support) This unit is Pascal interface to OpenSSL library (used by @link(ssl_openssl) unit). OpenSSL is loaded dynamicly on-demand. If this library is not found in system, requested OpenSSL function just return errorcode. } unit ssl_openssl_lib; interface uses {$IFDEF CIL} System.Runtime.InteropServices, System.Text, {$ENDIF} Classes, synafpc, {$IFNDEF MSWINDOWS} {$IFDEF FPC} BaseUnix, SysUtils; {$ELSE} Libc, SysUtils; {$ENDIF} {$ELSE} Windows; {$ENDIF} {$IFDEF CIL} const {$IFDEF LINUX} DLLSSLName = 'libssl.so'; DLLUtilName = 'libcrypto.so'; {$ELSE} DLLSSLName = 'ssleay32.dll'; DLLUtilName = 'libeay32.dll'; {$ENDIF} {$ELSE} var {$IFNDEF MSWINDOWS} {$IFDEF DARWIN} DLLSSLName: string = 'libssl.dylib'; DLLUtilName: string = 'libcrypto.dylib'; {$ELSE} DLLSSLName: string = 'libssl.so'; DLLUtilName: string = 'libcrypto.so'; {$ENDIF} {$ELSE} DLLSSLName: string = 'ssleay32.dll'; DLLSSLName2: string = 'libssl32.dll'; DLLUtilName: string = 'libeay32.dll'; {$ENDIF} {$ENDIF} type {$IFDEF CIL} SslPtr = IntPtr; {$ELSE} SslPtr = Pointer; {$ENDIF} PSslPtr = ^SslPtr; PSSL_CTX = SslPtr; PSSL = SslPtr; PSSL_METHOD = SslPtr; PX509 = SslPtr; PX509_NAME = SslPtr; PEVP_MD = SslPtr; PInteger = ^Integer; PBIO_METHOD = SslPtr; PBIO = SslPtr; EVP_PKEY = SslPtr; PRSA = SslPtr; PASN1_UTCTIME = SslPtr; PASN1_INTEGER = SslPtr; PPasswdCb = SslPtr; PFunction = procedure; PSTACK = SslPtr; {pf} TSkPopFreeFunc = procedure(p:SslPtr); cdecl; {pf} TX509Free = procedure(x: PX509); cdecl; {pf} DES_cblock = array[0..7] of Byte; PDES_cblock = ^DES_cblock; des_ks_struct = packed record ks: DES_cblock; weak_key: Integer; end; des_key_schedule = array[1..16] of des_ks_struct; const EVP_MAX_MD_SIZE = 16 + 20; SSL_ERROR_NONE = 0; SSL_ERROR_SSL = 1; SSL_ERROR_WANT_READ = 2; SSL_ERROR_WANT_WRITE = 3; SSL_ERROR_WANT_X509_LOOKUP = 4; SSL_ERROR_SYSCALL = 5; //look at error stack/return value/errno SSL_ERROR_ZERO_RETURN = 6; SSL_ERROR_WANT_CONNECT = 7; SSL_ERROR_WANT_ACCEPT = 8; SSL_OP_NO_SSLv2 = $01000000; SSL_OP_NO_SSLv3 = $02000000; SSL_OP_NO_TLSv1 = $04000000; SSL_OP_ALL = $000FFFFF; SSL_VERIFY_NONE = $00; SSL_VERIFY_PEER = $01; OPENSSL_DES_DECRYPT = 0; OPENSSL_DES_ENCRYPT = 1; X509_V_OK = 0; X509_V_ILLEGAL = 1; X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT = 2; X509_V_ERR_UNABLE_TO_GET_CRL = 3; X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE = 4; X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE = 5; X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY = 6; X509_V_ERR_CERT_SIGNATURE_FAILURE = 7; X509_V_ERR_CRL_SIGNATURE_FAILURE = 8; X509_V_ERR_CERT_NOT_YET_VALID = 9; X509_V_ERR_CERT_HAS_EXPIRED = 10; X509_V_ERR_CRL_NOT_YET_VALID = 11; X509_V_ERR_CRL_HAS_EXPIRED = 12; X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD = 13; X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD = 14; X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD = 15; X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD = 16; X509_V_ERR_OUT_OF_MEM = 17; X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT = 18; X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN = 19; X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY = 20; X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE = 21; X509_V_ERR_CERT_CHAIN_TOO_LONG = 22; X509_V_ERR_CERT_REVOKED = 23; X509_V_ERR_INVALID_CA = 24; X509_V_ERR_PATH_LENGTH_EXCEEDED = 25; X509_V_ERR_INVALID_PURPOSE = 26; X509_V_ERR_CERT_UNTRUSTED = 27; X509_V_ERR_CERT_REJECTED = 28; //These are 'informational' when looking for issuer cert X509_V_ERR_SUBJECT_ISSUER_MISMATCH = 29; X509_V_ERR_AKID_SKID_MISMATCH = 30; X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH = 31; X509_V_ERR_KEYUSAGE_NO_CERTSIGN = 32; X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER = 33; X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION = 34; //The application is not happy X509_V_ERR_APPLICATION_VERIFICATION = 50; SSL_FILETYPE_ASN1 = 2; SSL_FILETYPE_PEM = 1; EVP_PKEY_RSA = 6; SSL_CTRL_SET_TLSEXT_HOSTNAME = 55; TLSEXT_NAMETYPE_host_name = 0; var SSLLibHandle: TLibHandle = 0; SSLUtilHandle: TLibHandle = 0; SSLLibFile: string = ''; SSLUtilFile: string = ''; {$IFDEF CIL} [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_get_error')] function SslGetError(s: PSSL; ret_code: Integer): Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_library_init')] function SslLibraryInit: Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_load_error_strings')] procedure SslLoadErrorStrings; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_CTX_set_cipher_list')] function SslCtxSetCipherList(arg0: PSSL_CTX; var str: String): Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_CTX_new')] function SslCtxNew(meth: PSSL_METHOD):PSSL_CTX; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_CTX_free')] procedure SslCtxFree (arg0: PSSL_CTX); external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_set_fd')] function SslSetFd(s: PSSL; fd: Integer):Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSLv2_method')] function SslMethodV2 : PSSL_METHOD; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSLv3_method')] function SslMethodV3 : PSSL_METHOD; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'TLSv1_method')] function SslMethodTLSV1:PSSL_METHOD; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSLv23_method')] function SslMethodV23 : PSSL_METHOD; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_CTX_use_PrivateKey')] function SslCtxUsePrivateKey(ctx: PSSL_CTX; pkey: SslPtr):Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_CTX_use_PrivateKey_ASN1')] function SslCtxUsePrivateKeyASN1(pk: integer; ctx: PSSL_CTX; d: String; len: integer):Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_CTX_use_RSAPrivateKey_file')] function SslCtxUsePrivateKeyFile(ctx: PSSL_CTX; const _file: String; _type: Integer):Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_CTX_use_certificate')] function SslCtxUseCertificate(ctx: PSSL_CTX; x: SslPtr):Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_CTX_use_certificate_ASN1')] function SslCtxUseCertificateASN1(ctx: PSSL_CTX; len: integer; d: String):Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_CTX_use_certificate_file')] function SslCtxUseCertificateFile(ctx: PSSL_CTX; const _file: String; _type: Integer):Integer;external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_CTX_use_certificate_chain_file')] function SslCtxUseCertificateChainFile(ctx: PSSL_CTX; const _file: String):Integer;external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_CTX_check_private_key')] function SslCtxCheckPrivateKeyFile(ctx: PSSL_CTX):Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_CTX_set_default_passwd_cb')] procedure SslCtxSetDefaultPasswdCb(ctx: PSSL_CTX; cb: PPasswdCb); external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_CTX_set_default_passwd_cb_userdata')] procedure SslCtxSetDefaultPasswdCbUserdata(ctx: PSSL_CTX; u: IntPtr); external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_CTX_load_verify_locations')] function SslCtxLoadVerifyLocations(ctx: PSSL_CTX; CAfile: string; CApath: String):Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_CTX_ctrl')] function SslCtxCtrl(ctx: PSSL_CTX; cmd: integer; larg: integer; parg: IntPtr): integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_new')] function SslNew(ctx: PSSL_CTX):PSSL; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_free')] procedure SslFree(ssl: PSSL); external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_accept')] function SslAccept(ssl: PSSL):Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_connect')] function SslConnect(ssl: PSSL):Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_shutdown')] function SslShutdown(s: PSSL):Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_read')] function SslRead(ssl: PSSL; buf: StringBuilder; num: Integer):Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_peek')] function SslPeek(ssl: PSSL; buf: StringBuilder; num: Integer):Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_write')] function SslWrite(ssl: PSSL; buf: String; num: Integer):Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_pending')] function SslPending(ssl: PSSL):Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_get_version')] function SslGetVersion(ssl: PSSL):String; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_get_peer_certificate')] function SslGetPeerCertificate(s: PSSL):PX509; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_CTX_set_verify')] procedure SslCtxSetVerify(ctx: PSSL_CTX; mode: Integer; arg2: PFunction); external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_get_current_cipher')] function SSLGetCurrentCipher(s: PSSL): SslPtr; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_CIPHER_get_name')] function SSLCipherGetName(c: SslPtr):String; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_CIPHER_get_bits')] function SSLCipherGetBits(c: SslPtr; var alg_bits: Integer):Integer; external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_get_verify_result')] function SSLGetVerifyResult(ssl: PSSL):Integer;external; [DllImport(DLLSSLName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSL_ctrl')] function SslCtrl(ssl: PSSL; cmd: integer; larg: integer; parg: IntPtr): integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'X509_new')] function X509New: PX509; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'X509_free')] procedure X509Free(x: PX509); external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'X509_NAME_oneline')] function X509NameOneline(a: PX509_NAME; buf: StringBuilder; size: Integer): String; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'X509_get_subject_name')] function X509GetSubjectName(a: PX509):PX509_NAME; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'X509_get_issuer_name')] function X509GetIssuerName(a: PX509):PX509_NAME; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'X509_NAME_hash')] function X509NameHash(x: PX509_NAME):Cardinal; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'X509_digest')] function X509Digest (data: PX509; _type: PEVP_MD; md: StringBuilder; var len: Integer):Integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'X509_set_version')] function X509SetVersion(x: PX509; version: integer): integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'X509_set_pubkey')] function X509SetPubkey(x: PX509; pkey: EVP_PKEY): integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'X509_set_issuer_name')] function X509SetIssuerName(x: PX509; name: PX509_NAME): integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'X509_NAME_add_entry_by_txt')] function X509NameAddEntryByTxt(name: PX509_NAME; field: string; _type: integer; bytes: string; len, loc, _set: integer): integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'X509_sign')] function X509Sign(x: PX509; pkey: EVP_PKEY; const md: PEVP_MD): integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'X509_print')] function X509print(b: PBIO; a: PX509): integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'X509_gmtime_adj')] function X509GmtimeAdj(s: PASN1_UTCTIME; adj: integer): PASN1_UTCTIME; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'X509_set_notBefore')] function X509SetNotBefore(x: PX509; tm: PASN1_UTCTIME): integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'X509_set_notAfter')] function X509SetNotAfter(x: PX509; tm: PASN1_UTCTIME): integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'X509_get_serialNumber')] function X509GetSerialNumber(x: PX509): PASN1_INTEGER; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'EVP_PKEY_new')] function EvpPkeyNew: EVP_PKEY; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'EVP_PKEY_free')] procedure EvpPkeyFree(pk: EVP_PKEY); external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'EVP_PKEY_assign')] function EvpPkeyAssign(pkey: EVP_PKEY; _type: integer; key: Prsa): integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'EVP_get_digestbyname')] function EvpGetDigestByName(Name: String): PEVP_MD; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'EVP_cleanup')] procedure EVPcleanup; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'SSLeay_version')] function SSLeayversion(t: integer): String; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'ERR_error_string_n')] procedure ErrErrorString(e: integer; buf: StringBuilder; len: integer); external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'ERR_get_error')] function ErrGetError: integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'ERR_clear_error')] procedure ErrClearError; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'ERR_free_strings')] procedure ErrFreeStrings; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'ERR_remove_state')] procedure ErrRemoveState(pid: integer); external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'OPENSSL_add_all_algorithms_noconf')] procedure OPENSSLaddallalgorithms; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'CRYPTO_cleanup_all_ex_data')] procedure CRYPTOcleanupAllExData; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'RAND_screen')] procedure RandScreen; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'BIO_new')] function BioNew(b: PBIO_METHOD): PBIO; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'BIO_free_all')] procedure BioFreeAll(b: PBIO); external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'BIO_s_mem')] function BioSMem: PBIO_METHOD; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'BIO_ctrl_pending')] function BioCtrlPending(b: PBIO): integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'BIO_read')] function BioRead(b: PBIO; Buf: StringBuilder; Len: integer): integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'BIO_write')] function BioWrite(b: PBIO; var Buf: String; Len: integer): integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'd2i_PKCS12_bio')] function d2iPKCS12bio(b:PBIO; Pkcs12: SslPtr): SslPtr; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'PKCS12_parse')] function PKCS12parse(p12: SslPtr; pass: string; var pkey, cert, ca: SslPtr): integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'PKCS12_free')] procedure PKCS12free(p12: SslPtr); external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'RSA_generate_key')] function RsaGenerateKey(bits, e: integer; callback: PFunction; cb_arg: SslPtr): PRSA; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'ASN1_UTCTIME_new')] function Asn1UtctimeNew: PASN1_UTCTIME; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'ASN1_UTCTIME_free')] procedure Asn1UtctimeFree(a: PASN1_UTCTIME); external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'ASN1_INTEGER_set')] function Asn1IntegerSet(a: PASN1_INTEGER; v: integer): integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'i2d_X509_bio')] function i2dX509bio(b: PBIO; x: PX509): integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'i2d_PrivateKey_bio')] function i2dPrivateKeyBio(b: PBIO; pkey: EVP_PKEY): integer; external; // 3DES functions [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'DES_set_odd_parity')] procedure DESsetoddparity(Key: des_cblock); external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'DES_set_key_checked')] function DESsetkeychecked(key: des_cblock; schedule: des_key_schedule): Integer; external; [DllImport(DLLUtilName, CharSet = CharSet.Ansi, SetLastError = False, CallingConvention= CallingConvention.cdecl, EntryPoint = 'DES_ecb_encrypt')] procedure DESecbencrypt(Input: des_cblock; output: des_cblock; ks: des_key_schedule; enc: Integer); external; {$ELSE} // libssl.dll function SslGetError(s: PSSL; ret_code: Integer):Integer; function SslLibraryInit:Integer; procedure SslLoadErrorStrings; // function SslCtxSetCipherList(arg0: PSSL_CTX; str: PChar):Integer; function SslCtxSetCipherList(arg0: PSSL_CTX; var str: AnsiString):Integer; function SslCtxNew(meth: PSSL_METHOD):PSSL_CTX; procedure SslCtxFree(arg0: PSSL_CTX); function SslSetFd(s: PSSL; fd: Integer):Integer; function SslMethodV2:PSSL_METHOD; function SslMethodV3:PSSL_METHOD; function SslMethodTLSV1:PSSL_METHOD; function SslMethodV23:PSSL_METHOD; function SslCtxUsePrivateKey(ctx: PSSL_CTX; pkey: SslPtr):Integer; function SslCtxUsePrivateKeyASN1(pk: integer; ctx: PSSL_CTX; d: AnsiString; len: integer):Integer; // function SslCtxUsePrivateKeyFile(ctx: PSSL_CTX; const _file: PChar; _type: Integer):Integer; function SslCtxUsePrivateKeyFile(ctx: PSSL_CTX; const _file: AnsiString; _type: Integer):Integer; function SslCtxUseCertificate(ctx: PSSL_CTX; x: SslPtr):Integer; function SslCtxUseCertificateASN1(ctx: PSSL_CTX; len: integer; d: AnsiString):Integer; function SslCtxUseCertificateFile(ctx: PSSL_CTX; const _file: AnsiString; _type: Integer):Integer; // function SslCtxUseCertificateChainFile(ctx: PSSL_CTX; const _file: PChar):Integer; function SslCtxUseCertificateChainFile(ctx: PSSL_CTX; const _file: AnsiString):Integer; function SslCtxCheckPrivateKeyFile(ctx: PSSL_CTX):Integer; procedure SslCtxSetDefaultPasswdCb(ctx: PSSL_CTX; cb: PPasswdCb); procedure SslCtxSetDefaultPasswdCbUserdata(ctx: PSSL_CTX; u: SslPtr); // function SslCtxLoadVerifyLocations(ctx: PSSL_CTX; const CAfile: PChar; const CApath: PChar):Integer; function SslCtxLoadVerifyLocations(ctx: PSSL_CTX; const CAfile: AnsiString; const CApath: AnsiString):Integer; function SslCtxCtrl(ctx: PSSL_CTX; cmd: integer; larg: integer; parg: SslPtr): integer; function SslNew(ctx: PSSL_CTX):PSSL; procedure SslFree(ssl: PSSL); function SslAccept(ssl: PSSL):Integer; function SslConnect(ssl: PSSL):Integer; function SslShutdown(ssl: PSSL):Integer; function SslRead(ssl: PSSL; buf: SslPtr; num: Integer):Integer; function SslPeek(ssl: PSSL; buf: SslPtr; num: Integer):Integer; function SslWrite(ssl: PSSL; buf: SslPtr; num: Integer):Integer; function SslPending(ssl: PSSL):Integer; function SslGetVersion(ssl: PSSL):AnsiString; function SslGetPeerCertificate(ssl: PSSL):PX509; procedure SslCtxSetVerify(ctx: PSSL_CTX; mode: Integer; arg2: PFunction); function SSLGetCurrentCipher(s: PSSL):SslPtr; function SSLCipherGetName(c: SslPtr): AnsiString; function SSLCipherGetBits(c: SslPtr; var alg_bits: Integer):Integer; function SSLGetVerifyResult(ssl: PSSL):Integer; function SSLCtrl(ssl: PSSL; cmd: integer; larg: integer; parg: SslPtr):Integer; // libeay.dll function X509New: PX509; procedure X509Free(x: PX509); function X509NameOneline(a: PX509_NAME; var buf: AnsiString; size: Integer):AnsiString; function X509GetSubjectName(a: PX509):PX509_NAME; function X509GetIssuerName(a: PX509):PX509_NAME; function X509NameHash(x: PX509_NAME):Cardinal; // function SslX509Digest(data: PX509; _type: PEVP_MD; md: PChar; len: PInteger):Integer; function X509Digest(data: PX509; _type: PEVP_MD; md: AnsiString; var len: Integer):Integer; function X509print(b: PBIO; a: PX509): integer; function X509SetVersion(x: PX509; version: integer): integer; function X509SetPubkey(x: PX509; pkey: EVP_PKEY): integer; function X509SetIssuerName(x: PX509; name: PX509_NAME): integer; function X509NameAddEntryByTxt(name: PX509_NAME; field: Ansistring; _type: integer; bytes: Ansistring; len, loc, _set: integer): integer; function X509Sign(x: PX509; pkey: EVP_PKEY; const md: PEVP_MD): integer; function X509GmtimeAdj(s: PASN1_UTCTIME; adj: integer): PASN1_UTCTIME; function X509SetNotBefore(x: PX509; tm: PASN1_UTCTIME): integer; function X509SetNotAfter(x: PX509; tm: PASN1_UTCTIME): integer; function X509GetSerialNumber(x: PX509): PASN1_INTEGER; function EvpPkeyNew: EVP_PKEY; procedure EvpPkeyFree(pk: EVP_PKEY); function EvpPkeyAssign(pkey: EVP_PKEY; _type: integer; key: Prsa): integer; function EvpGetDigestByName(Name: AnsiString): PEVP_MD; procedure EVPcleanup; // function ErrErrorString(e: integer; buf: PChar): PChar; function SSLeayversion(t: integer): Ansistring; procedure ErrErrorString(e: integer; var buf: Ansistring; len: integer); function ErrGetError: integer; procedure ErrClearError; procedure ErrFreeStrings; procedure ErrRemoveState(pid: integer); procedure OPENSSLaddallalgorithms; procedure CRYPTOcleanupAllExData; procedure RandScreen; function BioNew(b: PBIO_METHOD): PBIO; procedure BioFreeAll(b: PBIO); function BioSMem: PBIO_METHOD; function BioCtrlPending(b: PBIO): integer; function BioRead(b: PBIO; var Buf: AnsiString; Len: integer): integer; function BioWrite(b: PBIO; Buf: AnsiString; Len: integer): integer; function d2iPKCS12bio(b:PBIO; Pkcs12: SslPtr): SslPtr; function PKCS12parse(p12: SslPtr; pass: Ansistring; var pkey, cert, ca: SslPtr): integer; procedure PKCS12free(p12: SslPtr); function RsaGenerateKey(bits, e: integer; callback: PFunction; cb_arg: SslPtr): PRSA; function Asn1UtctimeNew: PASN1_UTCTIME; procedure Asn1UtctimeFree(a: PASN1_UTCTIME); function Asn1IntegerSet(a: PASN1_INTEGER; v: integer): integer; function Asn1IntegerGet(a: PASN1_INTEGER): integer; {pf} function i2dX509bio(b: PBIO; x: PX509): integer; function d2iX509bio(b:PBIO; x:PX509): PX509; {pf} function PEMReadBioX509(b:PBIO; {var x:PX509;}x:PSslPtr; callback:PFunction; cb_arg: SslPtr): PX509; {pf} procedure SkX509PopFree(st: PSTACK; func: TSkPopFreeFunc); {pf} function i2dPrivateKeyBio(b: PBIO; pkey: EVP_PKEY): integer; // 3DES functions procedure DESsetoddparity(Key: des_cblock); function DESsetkeychecked(key: des_cblock; schedule: des_key_schedule): Integer; procedure DESecbencrypt(Input: des_cblock; output: des_cblock; ks: des_key_schedule; enc: Integer); {$ENDIF} function IsSSLloaded: Boolean; function InitSSLInterface: Boolean; function DestroySSLInterface: Boolean; var _X509Free: TX509Free = nil; {pf} implementation uses SyncObjs; {$IFNDEF CIL} type // libssl.dll TSslGetError = function(s: PSSL; ret_code: Integer):Integer; cdecl; TSslLibraryInit = function:Integer; cdecl; TSslLoadErrorStrings = procedure; cdecl; TSslCtxSetCipherList = function(arg0: PSSL_CTX; str: PAnsiChar):Integer; cdecl; TSslCtxNew = function(meth: PSSL_METHOD):PSSL_CTX; cdecl; TSslCtxFree = procedure(arg0: PSSL_CTX); cdecl; TSslSetFd = function(s: PSSL; fd: Integer):Integer; cdecl; TSslMethodV2 = function:PSSL_METHOD; cdecl; TSslMethodV3 = function:PSSL_METHOD; cdecl; TSslMethodTLSV1 = function:PSSL_METHOD; cdecl; TSslMethodV23 = function:PSSL_METHOD; cdecl; TSslCtxUsePrivateKey = function(ctx: PSSL_CTX; pkey: sslptr):Integer; cdecl; TSslCtxUsePrivateKeyASN1 = function(pk: integer; ctx: PSSL_CTX; d: sslptr; len: integer):Integer; cdecl; TSslCtxUsePrivateKeyFile = function(ctx: PSSL_CTX; const _file: PAnsiChar; _type: Integer):Integer; cdecl; TSslCtxUseCertificate = function(ctx: PSSL_CTX; x: SslPtr):Integer; cdecl; TSslCtxUseCertificateASN1 = function(ctx: PSSL_CTX; len: Integer; d: SslPtr):Integer; cdecl; TSslCtxUseCertificateFile = function(ctx: PSSL_CTX; const _file: PAnsiChar; _type: Integer):Integer; cdecl; TSslCtxUseCertificateChainFile = function(ctx: PSSL_CTX; const _file: PAnsiChar):Integer; cdecl; TSslCtxCheckPrivateKeyFile = function(ctx: PSSL_CTX):Integer; cdecl; TSslCtxSetDefaultPasswdCb = procedure(ctx: PSSL_CTX; cb: SslPtr); cdecl; TSslCtxSetDefaultPasswdCbUserdata = procedure(ctx: PSSL_CTX; u: SslPtr); cdecl; TSslCtxLoadVerifyLocations = function(ctx: PSSL_CTX; const CAfile: PAnsiChar; const CApath: PAnsiChar):Integer; cdecl; TSslCtxCtrl = function(ctx: PSSL_CTX; cmd: integer; larg: integer; parg: SslPtr): integer; cdecl; TSslNew = function(ctx: PSSL_CTX):PSSL; cdecl; TSslFree = procedure(ssl: PSSL); cdecl; TSslAccept = function(ssl: PSSL):Integer; cdecl; TSslConnect = function(ssl: PSSL):Integer; cdecl; TSslShutdown = function(ssl: PSSL):Integer; cdecl; TSslRead = function(ssl: PSSL; buf: PAnsiChar; num: Integer):Integer; cdecl; TSslPeek = function(ssl: PSSL; buf: PAnsiChar; num: Integer):Integer; cdecl; TSslWrite = function(ssl: PSSL; const buf: PAnsiChar; num: Integer):Integer; cdecl; TSslPending = function(ssl: PSSL):Integer; cdecl; TSslGetVersion = function(ssl: PSSL):PAnsiChar; cdecl; TSslGetPeerCertificate = function(ssl: PSSL):PX509; cdecl; TSslCtxSetVerify = procedure(ctx: PSSL_CTX; mode: Integer; arg2: SslPtr); cdecl; TSSLGetCurrentCipher = function(s: PSSL):SslPtr; cdecl; TSSLCipherGetName = function(c: Sslptr):PAnsiChar; cdecl; TSSLCipherGetBits = function(c: SslPtr; alg_bits: PInteger):Integer; cdecl; TSSLGetVerifyResult = function(ssl: PSSL):Integer; cdecl; TSSLCtrl = function(ssl: PSSL; cmd: integer; larg: integer; parg: SslPtr):Integer; cdecl; TSSLSetTlsextHostName = function(ssl: PSSL; buf: PAnsiChar):Integer; cdecl; // libeay.dll TX509New = function: PX509; cdecl; TX509NameOneline = function(a: PX509_NAME; buf: PAnsiChar; size: Integer):PAnsiChar; cdecl; TX509GetSubjectName = function(a: PX509):PX509_NAME; cdecl; TX509GetIssuerName = function(a: PX509):PX509_NAME; cdecl; TX509NameHash = function(x: PX509_NAME):Cardinal; cdecl; TX509Digest = function(data: PX509; _type: PEVP_MD; md: PAnsiChar; len: PInteger):Integer; cdecl; TX509print = function(b: PBIO; a: PX509): integer; cdecl; TX509SetVersion = function(x: PX509; version: integer): integer; cdecl; TX509SetPubkey = function(x: PX509; pkey: EVP_PKEY): integer; cdecl; TX509SetIssuerName = function(x: PX509; name: PX509_NAME): integer; cdecl; TX509NameAddEntryByTxt = function(name: PX509_NAME; field: PAnsiChar; _type: integer; bytes: PAnsiChar; len, loc, _set: integer): integer; cdecl; TX509Sign = function(x: PX509; pkey: EVP_PKEY; const md: PEVP_MD): integer; cdecl; TX509GmtimeAdj = function(s: PASN1_UTCTIME; adj: integer): PASN1_UTCTIME; cdecl; TX509SetNotBefore = function(x: PX509; tm: PASN1_UTCTIME): integer; cdecl; TX509SetNotAfter = function(x: PX509; tm: PASN1_UTCTIME): integer; cdecl; TX509GetSerialNumber = function(x: PX509): PASN1_INTEGER; cdecl; TEvpPkeyNew = function: EVP_PKEY; cdecl; TEvpPkeyFree = procedure(pk: EVP_PKEY); cdecl; TEvpPkeyAssign = function(pkey: EVP_PKEY; _type: integer; key: Prsa): integer; cdecl; TEvpGetDigestByName = function(Name: PAnsiChar): PEVP_MD; cdecl; TEVPcleanup = procedure; cdecl; TSSLeayversion = function(t: integer): PAnsiChar; cdecl; TErrErrorString = procedure(e: integer; buf: PAnsiChar; len: integer); cdecl; TErrGetError = function: integer; cdecl; TErrClearError = procedure; cdecl; TErrFreeStrings = procedure; cdecl; TErrRemoveState = procedure(pid: integer); cdecl; TOPENSSLaddallalgorithms = procedure; cdecl; TCRYPTOcleanupAllExData = procedure; cdecl; TRandScreen = procedure; cdecl; TBioNew = function(b: PBIO_METHOD): PBIO; cdecl; TBioFreeAll = procedure(b: PBIO); cdecl; TBioSMem = function: PBIO_METHOD; cdecl; TBioCtrlPending = function(b: PBIO): integer; cdecl; TBioRead = function(b: PBIO; Buf: PAnsiChar; Len: integer): integer; cdecl; TBioWrite = function(b: PBIO; Buf: PAnsiChar; Len: integer): integer; cdecl; Td2iPKCS12bio = function(b:PBIO; Pkcs12: SslPtr): SslPtr; cdecl; TPKCS12parse = function(p12: SslPtr; pass: PAnsiChar; var pkey, cert, ca: SslPtr): integer; cdecl; TPKCS12free = procedure(p12: SslPtr); cdecl; TRsaGenerateKey = function(bits, e: integer; callback: PFunction; cb_arg: SslPtr): PRSA; cdecl; TAsn1UtctimeNew = function: PASN1_UTCTIME; cdecl; TAsn1UtctimeFree = procedure(a: PASN1_UTCTIME); cdecl; TAsn1IntegerSet = function(a: PASN1_INTEGER; v: integer): integer; cdecl; TAsn1IntegerGet = function(a: PASN1_INTEGER): integer; cdecl; {pf} Ti2dX509bio = function(b: PBIO; x: PX509): integer; cdecl; Td2iX509bio = function(b:PBIO; x:PX509): PX509; cdecl; {pf} TPEMReadBioX509 = function(b:PBIO; {var x:PX509;}x:PSslPtr; callback:PFunction; cb_arg:SslPtr): PX509; cdecl; {pf} TSkX509PopFree = procedure(st: PSTACK; func: TSkPopFreeFunc); cdecl; {pf} Ti2dPrivateKeyBio= function(b: PBIO; pkey: EVP_PKEY): integer; cdecl; // 3DES functions TDESsetoddparity = procedure(Key: des_cblock); cdecl; TDESsetkeychecked = function(key: des_cblock; schedule: des_key_schedule): Integer; cdecl; TDESecbencrypt = procedure(Input: des_cblock; output: des_cblock; ks: des_key_schedule; enc: Integer); cdecl; //thread lock functions TCRYPTOnumlocks = function: integer; cdecl; TCRYPTOSetLockingCallback = procedure(cb: Sslptr); cdecl; var // libssl.dll _SslGetError: TSslGetError = nil; _SslLibraryInit: TSslLibraryInit = nil; _SslLoadErrorStrings: TSslLoadErrorStrings = nil; _SslCtxSetCipherList: TSslCtxSetCipherList = nil; _SslCtxNew: TSslCtxNew = nil; _SslCtxFree: TSslCtxFree = nil; _SslSetFd: TSslSetFd = nil; _SslMethodV2: TSslMethodV2 = nil; _SslMethodV3: TSslMethodV3 = nil; _SslMethodTLSV1: TSslMethodTLSV1 = nil; _SslMethodV23: TSslMethodV23 = nil; _SslCtxUsePrivateKey: TSslCtxUsePrivateKey = nil; _SslCtxUsePrivateKeyASN1: TSslCtxUsePrivateKeyASN1 = nil; _SslCtxUsePrivateKeyFile: TSslCtxUsePrivateKeyFile = nil; _SslCtxUseCertificate: TSslCtxUseCertificate = nil; _SslCtxUseCertificateASN1: TSslCtxUseCertificateASN1 = nil; _SslCtxUseCertificateFile: TSslCtxUseCertificateFile = nil; _SslCtxUseCertificateChainFile: TSslCtxUseCertificateChainFile = nil; _SslCtxCheckPrivateKeyFile: TSslCtxCheckPrivateKeyFile = nil; _SslCtxSetDefaultPasswdCb: TSslCtxSetDefaultPasswdCb = nil; _SslCtxSetDefaultPasswdCbUserdata: TSslCtxSetDefaultPasswdCbUserdata = nil; _SslCtxLoadVerifyLocations: TSslCtxLoadVerifyLocations = nil; _SslCtxCtrl: TSslCtxCtrl = nil; _SslNew: TSslNew = nil; _SslFree: TSslFree = nil; _SslAccept: TSslAccept = nil; _SslConnect: TSslConnect = nil; _SslShutdown: TSslShutdown = nil; _SslRead: TSslRead = nil; _SslPeek: TSslPeek = nil; _SslWrite: TSslWrite = nil; _SslPending: TSslPending = nil; _SslGetVersion: TSslGetVersion = nil; _SslGetPeerCertificate: TSslGetPeerCertificate = nil; _SslCtxSetVerify: TSslCtxSetVerify = nil; _SSLGetCurrentCipher: TSSLGetCurrentCipher = nil; _SSLCipherGetName: TSSLCipherGetName = nil; _SSLCipherGetBits: TSSLCipherGetBits = nil; _SSLGetVerifyResult: TSSLGetVerifyResult = nil; _SSLCtrl: TSSLCtrl = nil; // libeay.dll _X509New: TX509New = nil; _X509NameOneline: TX509NameOneline = nil; _X509GetSubjectName: TX509GetSubjectName = nil; _X509GetIssuerName: TX509GetIssuerName = nil; _X509NameHash: TX509NameHash = nil; _X509Digest: TX509Digest = nil; _X509print: TX509print = nil; _X509SetVersion: TX509SetVersion = nil; _X509SetPubkey: TX509SetPubkey = nil; _X509SetIssuerName: TX509SetIssuerName = nil; _X509NameAddEntryByTxt: TX509NameAddEntryByTxt = nil; _X509Sign: TX509Sign = nil; _X509GmtimeAdj: TX509GmtimeAdj = nil; _X509SetNotBefore: TX509SetNotBefore = nil; _X509SetNotAfter: TX509SetNotAfter = nil; _X509GetSerialNumber: TX509GetSerialNumber = nil; _EvpPkeyNew: TEvpPkeyNew = nil; _EvpPkeyFree: TEvpPkeyFree = nil; _EvpPkeyAssign: TEvpPkeyAssign = nil; _EvpGetDigestByName: TEvpGetDigestByName = nil; _EVPcleanup: TEVPcleanup = nil; _SSLeayversion: TSSLeayversion = nil; _ErrErrorString: TErrErrorString = nil; _ErrGetError: TErrGetError = nil; _ErrClearError: TErrClearError = nil; _ErrFreeStrings: TErrFreeStrings = nil; _ErrRemoveState: TErrRemoveState = nil; _OPENSSLaddallalgorithms: TOPENSSLaddallalgorithms = nil; _CRYPTOcleanupAllExData: TCRYPTOcleanupAllExData = nil; _RandScreen: TRandScreen = nil; _BioNew: TBioNew = nil; _BioFreeAll: TBioFreeAll = nil; _BioSMem: TBioSMem = nil; _BioCtrlPending: TBioCtrlPending = nil; _BioRead: TBioRead = nil; _BioWrite: TBioWrite = nil; _d2iPKCS12bio: Td2iPKCS12bio = nil; _PKCS12parse: TPKCS12parse = nil; _PKCS12free: TPKCS12free = nil; _RsaGenerateKey: TRsaGenerateKey = nil; _Asn1UtctimeNew: TAsn1UtctimeNew = nil; _Asn1UtctimeFree: TAsn1UtctimeFree = nil; _Asn1IntegerSet: TAsn1IntegerSet = nil; _Asn1IntegerGet: TAsn1IntegerGet = nil; {pf} _i2dX509bio: Ti2dX509bio = nil; _d2iX509bio: Td2iX509bio = nil; {pf} _PEMReadBioX509: TPEMReadBioX509 = nil; {pf} _SkX509PopFree: TSkX509PopFree = nil; {pf} _i2dPrivateKeyBio: Ti2dPrivateKeyBio = nil; // 3DES functions _DESsetoddparity: TDESsetoddparity = nil; _DESsetkeychecked: TDESsetkeychecked = nil; _DESecbencrypt: TDESecbencrypt = nil; //thread lock functions _CRYPTOnumlocks: TCRYPTOnumlocks = nil; _CRYPTOSetLockingCallback: TCRYPTOSetLockingCallback = nil; {$ENDIF} var SSLCS: TCriticalSection; SSLloaded: boolean = false; {$IFNDEF CIL} Locks: TList; {$ENDIF} {$IFNDEF CIL} // libssl.dll function SslGetError(s: PSSL; ret_code: Integer):Integer; begin if InitSSLInterface and Assigned(_SslGetError) then Result := _SslGetError(s, ret_code) else Result := SSL_ERROR_SSL; end; function SslLibraryInit:Integer; begin if InitSSLInterface and Assigned(_SslLibraryInit) then Result := _SslLibraryInit else Result := 1; end; procedure SslLoadErrorStrings; begin if InitSSLInterface and Assigned(_SslLoadErrorStrings) then _SslLoadErrorStrings; end; //function SslCtxSetCipherList(arg0: PSSL_CTX; str: PChar):Integer; function SslCtxSetCipherList(arg0: PSSL_CTX; var str: AnsiString):Integer; begin if InitSSLInterface and Assigned(_SslCtxSetCipherList) then Result := _SslCtxSetCipherList(arg0, PAnsiChar(str)) else Result := 0; end; function SslCtxNew(meth: PSSL_METHOD):PSSL_CTX; begin if InitSSLInterface and Assigned(_SslCtxNew) then Result := _SslCtxNew(meth) else Result := nil; end; procedure SslCtxFree(arg0: PSSL_CTX); begin if InitSSLInterface and Assigned(_SslCtxFree) then _SslCtxFree(arg0); end; function SslSetFd(s: PSSL; fd: Integer):Integer; begin if InitSSLInterface and Assigned(_SslSetFd) then Result := _SslSetFd(s, fd) else Result := 0; end; function SslMethodV2:PSSL_METHOD; begin if InitSSLInterface and Assigned(_SslMethodV2) then Result := _SslMethodV2 else Result := nil; end; function SslMethodV3:PSSL_METHOD; begin if InitSSLInterface and Assigned(_SslMethodV3) then Result := _SslMethodV3 else Result := nil; end; function SslMethodTLSV1:PSSL_METHOD; begin if InitSSLInterface and Assigned(_SslMethodTLSV1) then Result := _SslMethodTLSV1 else Result := nil; end; function SslMethodV23:PSSL_METHOD; begin if InitSSLInterface and Assigned(_SslMethodV23) then Result := _SslMethodV23 else Result := nil; end; function SslCtxUsePrivateKey(ctx: PSSL_CTX; pkey: SslPtr):Integer; begin if InitSSLInterface and Assigned(_SslCtxUsePrivateKey) then Result := _SslCtxUsePrivateKey(ctx, pkey) else Result := 0; end; function SslCtxUsePrivateKeyASN1(pk: integer; ctx: PSSL_CTX; d: AnsiString; len: integer):Integer; begin if InitSSLInterface and Assigned(_SslCtxUsePrivateKeyASN1) then Result := _SslCtxUsePrivateKeyASN1(pk, ctx, Sslptr(d), len) else Result := 0; end; //function SslCtxUsePrivateKeyFile(ctx: PSSL_CTX; const _file: PChar; _type: Integer):Integer; function SslCtxUsePrivateKeyFile(ctx: PSSL_CTX; const _file: AnsiString; _type: Integer):Integer; begin if InitSSLInterface and Assigned(_SslCtxUsePrivateKeyFile) then Result := _SslCtxUsePrivateKeyFile(ctx, PAnsiChar(_file), _type) else Result := 0; end; function SslCtxUseCertificate(ctx: PSSL_CTX; x: SslPtr):Integer; begin if InitSSLInterface and Assigned(_SslCtxUseCertificate) then Result := _SslCtxUseCertificate(ctx, x) else Result := 0; end; function SslCtxUseCertificateASN1(ctx: PSSL_CTX; len: integer; d: AnsiString):Integer; begin if InitSSLInterface and Assigned(_SslCtxUseCertificateASN1) then Result := _SslCtxUseCertificateASN1(ctx, len, SslPtr(d)) else Result := 0; end; function SslCtxUseCertificateFile(ctx: PSSL_CTX; const _file: AnsiString; _type: Integer):Integer; begin if InitSSLInterface and Assigned(_SslCtxUseCertificateFile) then Result := _SslCtxUseCertificateFile(ctx, PAnsiChar(_file), _type) else Result := 0; end; //function SslCtxUseCertificateChainFile(ctx: PSSL_CTX; const _file: PChar):Integer; function SslCtxUseCertificateChainFile(ctx: PSSL_CTX; const _file: AnsiString):Integer; begin if InitSSLInterface and Assigned(_SslCtxUseCertificateChainFile) then Result := _SslCtxUseCertificateChainFile(ctx, PAnsiChar(_file)) else Result := 0; end; function SslCtxCheckPrivateKeyFile(ctx: PSSL_CTX):Integer; begin if InitSSLInterface and Assigned(_SslCtxCheckPrivateKeyFile) then Result := _SslCtxCheckPrivateKeyFile(ctx) else Result := 0; end; procedure SslCtxSetDefaultPasswdCb(ctx: PSSL_CTX; cb: PPasswdCb); begin if InitSSLInterface and Assigned(_SslCtxSetDefaultPasswdCb) then _SslCtxSetDefaultPasswdCb(ctx, cb); end; procedure SslCtxSetDefaultPasswdCbUserdata(ctx: PSSL_CTX; u: SslPtr); begin if InitSSLInterface and Assigned(_SslCtxSetDefaultPasswdCbUserdata) then _SslCtxSetDefaultPasswdCbUserdata(ctx, u); end; //function SslCtxLoadVerifyLocations(ctx: PSSL_CTX; const CAfile: PChar; const CApath: PChar):Integer; function SslCtxLoadVerifyLocations(ctx: PSSL_CTX; const CAfile: AnsiString; const CApath: AnsiString):Integer; begin if InitSSLInterface and Assigned(_SslCtxLoadVerifyLocations) then Result := _SslCtxLoadVerifyLocations(ctx, SslPtr(CAfile), SslPtr(CApath)) else Result := 0; end; function SslCtxCtrl(ctx: PSSL_CTX; cmd: integer; larg: integer; parg: SslPtr): integer; begin if InitSSLInterface and Assigned(_SslCtxCtrl) then Result := _SslCtxCtrl(ctx, cmd, larg, parg) else Result := 0; end; function SslNew(ctx: PSSL_CTX):PSSL; begin if InitSSLInterface and Assigned(_SslNew) then Result := _SslNew(ctx) else Result := nil; end; procedure SslFree(ssl: PSSL); begin if InitSSLInterface and Assigned(_SslFree) then _SslFree(ssl); end; function SslAccept(ssl: PSSL):Integer; begin if InitSSLInterface and Assigned(_SslAccept) then Result := _SslAccept(ssl) else Result := -1; end; function SslConnect(ssl: PSSL):Integer; begin if InitSSLInterface and Assigned(_SslConnect) then Result := _SslConnect(ssl) else Result := -1; end; function SslShutdown(ssl: PSSL):Integer; begin if InitSSLInterface and Assigned(_SslShutdown) then Result := _SslShutdown(ssl) else Result := -1; end; //function SslRead(ssl: PSSL; buf: PChar; num: Integer):Integer; function SslRead(ssl: PSSL; buf: SslPtr; num: Integer):Integer; begin if InitSSLInterface and Assigned(_SslRead) then Result := _SslRead(ssl, PAnsiChar(buf), num) else Result := -1; end; //function SslPeek(ssl: PSSL; buf: PChar; num: Integer):Integer; function SslPeek(ssl: PSSL; buf: SslPtr; num: Integer):Integer; begin if InitSSLInterface and Assigned(_SslPeek) then Result := _SslPeek(ssl, PAnsiChar(buf), num) else Result := -1; end; //function SslWrite(ssl: PSSL; const buf: PChar; num: Integer):Integer; function SslWrite(ssl: PSSL; buf: SslPtr; num: Integer):Integer; begin if InitSSLInterface and Assigned(_SslWrite) then Result := _SslWrite(ssl, PAnsiChar(buf), num) else Result := -1; end; function SslPending(ssl: PSSL):Integer; begin if InitSSLInterface and Assigned(_SslPending) then Result := _SslPending(ssl) else Result := 0; end; //function SslGetVersion(ssl: PSSL):PChar; function SslGetVersion(ssl: PSSL):AnsiString; begin if InitSSLInterface and Assigned(_SslGetVersion) then Result := _SslGetVersion(ssl) else Result := ''; end; function SslGetPeerCertificate(ssl: PSSL):PX509; begin if InitSSLInterface and Assigned(_SslGetPeerCertificate) then Result := _SslGetPeerCertificate(ssl) else Result := nil; end; //procedure SslCtxSetVerify(ctx: PSSL_CTX; mode: Integer; arg2: SslPtr); procedure SslCtxSetVerify(ctx: PSSL_CTX; mode: Integer; arg2: PFunction); begin if InitSSLInterface and Assigned(_SslCtxSetVerify) then _SslCtxSetVerify(ctx, mode, @arg2); end; function SSLGetCurrentCipher(s: PSSL):SslPtr; begin if InitSSLInterface and Assigned(_SSLGetCurrentCipher) then {$IFDEF CIL} {$ELSE} Result := _SSLGetCurrentCipher(s) {$ENDIF} else Result := nil; end; //function SSLCipherGetName(c: SslPtr):PChar; function SSLCipherGetName(c: SslPtr):AnsiString; begin if InitSSLInterface and Assigned(_SSLCipherGetName) then Result := _SSLCipherGetName(c) else Result := ''; end; //function SSLCipherGetBits(c: SslPtr; alg_bits: PInteger):Integer; function SSLCipherGetBits(c: SslPtr; var alg_bits: Integer):Integer; begin if InitSSLInterface and Assigned(_SSLCipherGetBits) then Result := _SSLCipherGetBits(c, @alg_bits) else Result := 0; end; function SSLGetVerifyResult(ssl: PSSL):Integer; begin if InitSSLInterface and Assigned(_SSLGetVerifyResult) then Result := _SSLGetVerifyResult(ssl) else Result := X509_V_ERR_APPLICATION_VERIFICATION; end; function SSLCtrl(ssl: PSSL; cmd: integer; larg: integer; parg: SslPtr):Integer; begin if InitSSLInterface and Assigned(_SSLCtrl) then Result := _SSLCtrl(ssl, cmd, larg, parg) else Result := X509_V_ERR_APPLICATION_VERIFICATION; end; // libeay.dll function X509New: PX509; begin if InitSSLInterface and Assigned(_X509New) then Result := _X509New else Result := nil; end; procedure X509Free(x: PX509); begin if InitSSLInterface and Assigned(_X509Free) then _X509Free(x); end; //function SslX509NameOneline(a: PX509_NAME; buf: PChar; size: Integer):PChar; function X509NameOneline(a: PX509_NAME; var buf: AnsiString; size: Integer):AnsiString; begin if InitSSLInterface and Assigned(_X509NameOneline) then Result := _X509NameOneline(a, PAnsiChar(buf),size) else Result := ''; end; function X509GetSubjectName(a: PX509):PX509_NAME; begin if InitSSLInterface and Assigned(_X509GetSubjectName) then Result := _X509GetSubjectName(a) else Result := nil; end; function X509GetIssuerName(a: PX509):PX509_NAME; begin if InitSSLInterface and Assigned(_X509GetIssuerName) then Result := _X509GetIssuerName(a) else Result := nil; end; function X509NameHash(x: PX509_NAME):Cardinal; begin if InitSSLInterface and Assigned(_X509NameHash) then Result := _X509NameHash(x) else Result := 0; end; //function SslX509Digest(data: PX509; _type: PEVP_MD; md: PChar; len: PInteger):Integer; function X509Digest(data: PX509; _type: PEVP_MD; md: AnsiString; var len: Integer):Integer; begin if InitSSLInterface and Assigned(_X509Digest) then Result := _X509Digest(data, _type, PAnsiChar(md), @len) else Result := 0; end; function EvpPkeyNew: EVP_PKEY; begin if InitSSLInterface and Assigned(_EvpPkeyNew) then Result := _EvpPkeyNew else Result := nil; end; procedure EvpPkeyFree(pk: EVP_PKEY); begin if InitSSLInterface and Assigned(_EvpPkeyFree) then _EvpPkeyFree(pk); end; function SSLeayversion(t: integer): Ansistring; begin if InitSSLInterface and Assigned(_SSLeayversion) then Result := PAnsiChar(_SSLeayversion(t)) else Result := ''; end; procedure ErrErrorString(e: integer; var buf: Ansistring; len: integer); begin if InitSSLInterface and Assigned(_ErrErrorString) then _ErrErrorString(e, Pointer(buf), len); buf := PAnsiChar(Buf); end; function ErrGetError: integer; begin if InitSSLInterface and Assigned(_ErrGetError) then Result := _ErrGetError else Result := SSL_ERROR_SSL; end; procedure ErrClearError; begin if InitSSLInterface and Assigned(_ErrClearError) then _ErrClearError; end; procedure ErrFreeStrings; begin if InitSSLInterface and Assigned(_ErrFreeStrings) then _ErrFreeStrings; end; procedure ErrRemoveState(pid: integer); begin if InitSSLInterface and Assigned(_ErrRemoveState) then _ErrRemoveState(pid); end; procedure OPENSSLaddallalgorithms; begin if InitSSLInterface and Assigned(_OPENSSLaddallalgorithms) then _OPENSSLaddallalgorithms; end; procedure EVPcleanup; begin if InitSSLInterface and Assigned(_EVPcleanup) then _EVPcleanup; end; procedure CRYPTOcleanupAllExData; begin if InitSSLInterface and Assigned(_CRYPTOcleanupAllExData) then _CRYPTOcleanupAllExData; end; procedure RandScreen; begin if InitSSLInterface and Assigned(_RandScreen) then _RandScreen; end; function BioNew(b: PBIO_METHOD): PBIO; begin if InitSSLInterface and Assigned(_BioNew) then Result := _BioNew(b) else Result := nil; end; procedure BioFreeAll(b: PBIO); begin if InitSSLInterface and Assigned(_BioFreeAll) then _BioFreeAll(b); end; function BioSMem: PBIO_METHOD; begin if InitSSLInterface and Assigned(_BioSMem) then Result := _BioSMem else Result := nil; end; function BioCtrlPending(b: PBIO): integer; begin if InitSSLInterface and Assigned(_BioCtrlPending) then Result := _BioCtrlPending(b) else Result := 0; end; //function BioRead(b: PBIO; Buf: PChar; Len: integer): integer; function BioRead(b: PBIO; var Buf: AnsiString; Len: integer): integer; begin if InitSSLInterface and Assigned(_BioRead) then Result := _BioRead(b, PAnsiChar(Buf), Len) else Result := -2; end; //function BioWrite(b: PBIO; Buf: PChar; Len: integer): integer; function BioWrite(b: PBIO; Buf: AnsiString; Len: integer): integer; begin if InitSSLInterface and Assigned(_BioWrite) then Result := _BioWrite(b, PAnsiChar(Buf), Len) else Result := -2; end; function X509print(b: PBIO; a: PX509): integer; begin if InitSSLInterface and Assigned(_X509print) then Result := _X509print(b, a) else Result := 0; end; function d2iPKCS12bio(b:PBIO; Pkcs12: SslPtr): SslPtr; begin if InitSSLInterface and Assigned(_d2iPKCS12bio) then Result := _d2iPKCS12bio(b, Pkcs12) else Result := nil; end; function PKCS12parse(p12: SslPtr; pass: Ansistring; var pkey, cert, ca: SslPtr): integer; begin if InitSSLInterface and Assigned(_PKCS12parse) then Result := _PKCS12parse(p12, SslPtr(pass), pkey, cert, ca) else Result := 0; end; procedure PKCS12free(p12: SslPtr); begin if InitSSLInterface and Assigned(_PKCS12free) then _PKCS12free(p12); end; function RsaGenerateKey(bits, e: integer; callback: PFunction; cb_arg: SslPtr): PRSA; begin if InitSSLInterface and Assigned(_RsaGenerateKey) then Result := _RsaGenerateKey(bits, e, callback, cb_arg) else Result := nil; end; function EvpPkeyAssign(pkey: EVP_PKEY; _type: integer; key: Prsa): integer; begin if InitSSLInterface and Assigned(_EvpPkeyAssign) then Result := _EvpPkeyAssign(pkey, _type, key) else Result := 0; end; function X509SetVersion(x: PX509; version: integer): integer; begin if InitSSLInterface and Assigned(_X509SetVersion) then Result := _X509SetVersion(x, version) else Result := 0; end; function X509SetPubkey(x: PX509; pkey: EVP_PKEY): integer; begin if InitSSLInterface and Assigned(_X509SetPubkey) then Result := _X509SetPubkey(x, pkey) else Result := 0; end; function X509SetIssuerName(x: PX509; name: PX509_NAME): integer; begin if InitSSLInterface and Assigned(_X509SetIssuerName) then Result := _X509SetIssuerName(x, name) else Result := 0; end; function X509NameAddEntryByTxt(name: PX509_NAME; field: Ansistring; _type: integer; bytes: Ansistring; len, loc, _set: integer): integer; begin if InitSSLInterface and Assigned(_X509NameAddEntryByTxt) then Result := _X509NameAddEntryByTxt(name, PAnsiChar(field), _type, PAnsiChar(Bytes), len, loc, _set) else Result := 0; end; function X509Sign(x: PX509; pkey: EVP_PKEY; const md: PEVP_MD): integer; begin if InitSSLInterface and Assigned(_X509Sign) then Result := _X509Sign(x, pkey, md) else Result := 0; end; function Asn1UtctimeNew: PASN1_UTCTIME; begin if InitSSLInterface and Assigned(_Asn1UtctimeNew) then Result := _Asn1UtctimeNew else Result := nil; end; procedure Asn1UtctimeFree(a: PASN1_UTCTIME); begin if InitSSLInterface and Assigned(_Asn1UtctimeFree) then _Asn1UtctimeFree(a); end; function X509GmtimeAdj(s: PASN1_UTCTIME; adj: integer): PASN1_UTCTIME; begin if InitSSLInterface and Assigned(_X509GmtimeAdj) then Result := _X509GmtimeAdj(s, adj) else Result := nil; end; function X509SetNotBefore(x: PX509; tm: PASN1_UTCTIME): integer; begin if InitSSLInterface and Assigned(_X509SetNotBefore) then Result := _X509SetNotBefore(x, tm) else Result := 0; end; function X509SetNotAfter(x: PX509; tm: PASN1_UTCTIME): integer; begin if InitSSLInterface and Assigned(_X509SetNotAfter) then Result := _X509SetNotAfter(x, tm) else Result := 0; end; function i2dX509bio(b: PBIO; x: PX509): integer; begin if InitSSLInterface and Assigned(_i2dX509bio) then Result := _i2dX509bio(b, x) else Result := 0; end; function d2iX509bio(b: PBIO; x: PX509): PX509; {pf} begin if InitSSLInterface and Assigned(_d2iX509bio) then Result := _d2iX509bio(x,b) else Result := nil; end; function PEMReadBioX509(b:PBIO; {var x:PX509;}x:PSslPtr; callback:PFunction; cb_arg: SslPtr): PX509; {pf} begin if InitSSLInterface and Assigned(_PEMReadBioX509) then Result := _PEMReadBioX509(b,x,callback,cb_arg) else Result := nil; end; procedure SkX509PopFree(st: PSTACK; func:TSkPopFreeFunc); {pf} begin if InitSSLInterface and Assigned(_SkX509PopFree) then _SkX509PopFree(st,func); end; function i2dPrivateKeyBio(b: PBIO; pkey: EVP_PKEY): integer; begin if InitSSLInterface and Assigned(_i2dPrivateKeyBio) then Result := _i2dPrivateKeyBio(b, pkey) else Result := 0; end; function EvpGetDigestByName(Name: AnsiString): PEVP_MD; begin if InitSSLInterface and Assigned(_EvpGetDigestByName) then Result := _EvpGetDigestByName(PAnsiChar(Name)) else Result := nil; end; function Asn1IntegerSet(a: PASN1_INTEGER; v: integer): integer; begin if InitSSLInterface and Assigned(_Asn1IntegerSet) then Result := _Asn1IntegerSet(a, v) else Result := 0; end; function Asn1IntegerGet(a: PASN1_INTEGER): integer; {pf} begin if InitSSLInterface and Assigned(_Asn1IntegerGet) then Result := _Asn1IntegerGet(a) else Result := 0; end; function X509GetSerialNumber(x: PX509): PASN1_INTEGER; begin if InitSSLInterface and Assigned(_X509GetSerialNumber) then Result := _X509GetSerialNumber(x) else Result := nil; end; // 3DES functions procedure DESsetoddparity(Key: des_cblock); begin if InitSSLInterface and Assigned(_DESsetoddparity) then _DESsetoddparity(Key); end; function DESsetkeychecked(key: des_cblock; schedule: des_key_schedule): Integer; begin if InitSSLInterface and Assigned(_DESsetkeychecked) then Result := _DESsetkeychecked(key, schedule) else Result := -1; end; procedure DESecbencrypt(Input: des_cblock; output: des_cblock; ks: des_key_schedule; enc: Integer); begin if InitSSLInterface and Assigned(_DESecbencrypt) then _DESecbencrypt(Input, output, ks, enc); end; procedure locking_callback(mode, ltype: integer; lfile: PChar; line: integer); cdecl; begin if (mode and 1) > 0 then TCriticalSection(Locks[ltype]).Enter else TCriticalSection(Locks[ltype]).Leave; end; procedure InitLocks; var n: integer; max: integer; begin Locks := TList.Create; max := _CRYPTOnumlocks; for n := 1 to max do Locks.Add(TCriticalSection.Create); _CRYPTOsetlockingcallback(@locking_callback); end; procedure FreeLocks; var n: integer; begin _CRYPTOsetlockingcallback(nil); for n := 0 to Locks.Count - 1 do TCriticalSection(Locks[n]).Free; Locks.Free; end; {$ENDIF} function LoadLib(const Value: String): HModule; begin {$IFDEF CIL} Result := LoadLibrary(Value); {$ELSE} Result := LoadLibrary(PChar(Value)); {$ENDIF} end; function GetProcAddr(module: HModule; const ProcName: string): SslPtr; begin {$IFDEF CIL} Result := GetProcAddress(module, ProcName); {$ELSE} Result := GetProcAddress(module, PChar(ProcName)); {$ENDIF} end; function InitSSLInterface: Boolean; var s: string; x: integer; begin {pf} if SSLLoaded then begin Result := TRUE; exit; end; {/pf} SSLCS.Enter; try if not IsSSLloaded then begin {$IFDEF CIL} SSLLibHandle := 1; SSLUtilHandle := 1; {$ELSE} SSLLibHandle := LoadLib(DLLSSLName); SSLUtilHandle := LoadLib(DLLUtilName); {$IFDEF MSWINDOWS} if (SSLLibHandle = 0) then SSLLibHandle := LoadLib(DLLSSLName2); {$ENDIF} {$ENDIF} if (SSLLibHandle <> 0) and (SSLUtilHandle <> 0) then begin {$IFNDEF CIL} _SslGetError := GetProcAddr(SSLLibHandle, 'SSL_get_error'); _SslLibraryInit := GetProcAddr(SSLLibHandle, 'SSL_library_init'); _SslLoadErrorStrings := GetProcAddr(SSLLibHandle, 'SSL_load_error_strings'); _SslCtxSetCipherList := GetProcAddr(SSLLibHandle, 'SSL_CTX_set_cipher_list'); _SslCtxNew := GetProcAddr(SSLLibHandle, 'SSL_CTX_new'); _SslCtxFree := GetProcAddr(SSLLibHandle, 'SSL_CTX_free'); _SslSetFd := GetProcAddr(SSLLibHandle, 'SSL_set_fd'); _SslMethodV2 := GetProcAddr(SSLLibHandle, 'SSLv2_method'); _SslMethodV3 := GetProcAddr(SSLLibHandle, 'SSLv3_method'); _SslMethodTLSV1 := GetProcAddr(SSLLibHandle, 'TLSv1_method'); _SslMethodV23 := GetProcAddr(SSLLibHandle, 'SSLv23_method'); _SslCtxUsePrivateKey := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_PrivateKey'); _SslCtxUsePrivateKeyASN1 := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_PrivateKey_ASN1'); //use SSL_CTX_use_RSAPrivateKey_file instead SSL_CTX_use_PrivateKey_file, //because SSL_CTX_use_PrivateKey_file not support DER format. :-O _SslCtxUsePrivateKeyFile := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_RSAPrivateKey_file'); _SslCtxUseCertificate := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_certificate'); _SslCtxUseCertificateASN1 := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_certificate_ASN1'); _SslCtxUseCertificateFile := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_certificate_file'); _SslCtxUseCertificateChainFile := GetProcAddr(SSLLibHandle, 'SSL_CTX_use_certificate_chain_file'); _SslCtxCheckPrivateKeyFile := GetProcAddr(SSLLibHandle, 'SSL_CTX_check_private_key'); _SslCtxSetDefaultPasswdCb := GetProcAddr(SSLLibHandle, 'SSL_CTX_set_default_passwd_cb'); _SslCtxSetDefaultPasswdCbUserdata := GetProcAddr(SSLLibHandle, 'SSL_CTX_set_default_passwd_cb_userdata'); _SslCtxLoadVerifyLocations := GetProcAddr(SSLLibHandle, 'SSL_CTX_load_verify_locations'); _SslCtxCtrl := GetProcAddr(SSLLibHandle, 'SSL_CTX_ctrl'); _SslNew := GetProcAddr(SSLLibHandle, 'SSL_new'); _SslFree := GetProcAddr(SSLLibHandle, 'SSL_free'); _SslAccept := GetProcAddr(SSLLibHandle, 'SSL_accept'); _SslConnect := GetProcAddr(SSLLibHandle, 'SSL_connect'); _SslShutdown := GetProcAddr(SSLLibHandle, 'SSL_shutdown'); _SslRead := GetProcAddr(SSLLibHandle, 'SSL_read'); _SslPeek := GetProcAddr(SSLLibHandle, 'SSL_peek'); _SslWrite := GetProcAddr(SSLLibHandle, 'SSL_write'); _SslPending := GetProcAddr(SSLLibHandle, 'SSL_pending'); _SslGetPeerCertificate := GetProcAddr(SSLLibHandle, 'SSL_get_peer_certificate'); _SslGetVersion := GetProcAddr(SSLLibHandle, 'SSL_get_version'); _SslCtxSetVerify := GetProcAddr(SSLLibHandle, 'SSL_CTX_set_verify'); _SslGetCurrentCipher := GetProcAddr(SSLLibHandle, 'SSL_get_current_cipher'); _SslCipherGetName := GetProcAddr(SSLLibHandle, 'SSL_CIPHER_get_name'); _SslCipherGetBits := GetProcAddr(SSLLibHandle, 'SSL_CIPHER_get_bits'); _SslGetVerifyResult := GetProcAddr(SSLLibHandle, 'SSL_get_verify_result'); _SslCtrl := GetProcAddr(SSLLibHandle, 'SSL_ctrl'); _X509New := GetProcAddr(SSLUtilHandle, 'X509_new'); _X509Free := GetProcAddr(SSLUtilHandle, 'X509_free'); _X509NameOneline := GetProcAddr(SSLUtilHandle, 'X509_NAME_oneline'); _X509GetSubjectName := GetProcAddr(SSLUtilHandle, 'X509_get_subject_name'); _X509GetIssuerName := GetProcAddr(SSLUtilHandle, 'X509_get_issuer_name'); _X509NameHash := GetProcAddr(SSLUtilHandle, 'X509_NAME_hash'); _X509Digest := GetProcAddr(SSLUtilHandle, 'X509_digest'); _X509print := GetProcAddr(SSLUtilHandle, 'X509_print'); _X509SetVersion := GetProcAddr(SSLUtilHandle, 'X509_set_version'); _X509SetPubkey := GetProcAddr(SSLUtilHandle, 'X509_set_pubkey'); _X509SetIssuerName := GetProcAddr(SSLUtilHandle, 'X509_set_issuer_name'); _X509NameAddEntryByTxt := GetProcAddr(SSLUtilHandle, 'X509_NAME_add_entry_by_txt'); _X509Sign := GetProcAddr(SSLUtilHandle, 'X509_sign'); _X509GmtimeAdj := GetProcAddr(SSLUtilHandle, 'X509_gmtime_adj'); _X509SetNotBefore := GetProcAddr(SSLUtilHandle, 'X509_set_notBefore'); _X509SetNotAfter := GetProcAddr(SSLUtilHandle, 'X509_set_notAfter'); _X509GetSerialNumber := GetProcAddr(SSLUtilHandle, 'X509_get_serialNumber'); _EvpPkeyNew := GetProcAddr(SSLUtilHandle, 'EVP_PKEY_new'); _EvpPkeyFree := GetProcAddr(SSLUtilHandle, 'EVP_PKEY_free'); _EvpPkeyAssign := GetProcAddr(SSLUtilHandle, 'EVP_PKEY_assign'); _EVPCleanup := GetProcAddr(SSLUtilHandle, 'EVP_cleanup'); _EvpGetDigestByName := GetProcAddr(SSLUtilHandle, 'EVP_get_digestbyname'); _SSLeayversion := GetProcAddr(SSLUtilHandle, 'SSLeay_version'); _ErrErrorString := GetProcAddr(SSLUtilHandle, 'ERR_error_string_n'); _ErrGetError := GetProcAddr(SSLUtilHandle, 'ERR_get_error'); _ErrClearError := GetProcAddr(SSLUtilHandle, 'ERR_clear_error'); _ErrFreeStrings := GetProcAddr(SSLUtilHandle, 'ERR_free_strings'); _ErrRemoveState := GetProcAddr(SSLUtilHandle, 'ERR_remove_state'); _OPENSSLaddallalgorithms := GetProcAddr(SSLUtilHandle, 'OPENSSL_add_all_algorithms_noconf'); _CRYPTOcleanupAllExData := GetProcAddr(SSLUtilHandle, 'CRYPTO_cleanup_all_ex_data'); _RandScreen := GetProcAddr(SSLUtilHandle, 'RAND_screen'); _BioNew := GetProcAddr(SSLUtilHandle, 'BIO_new'); _BioFreeAll := GetProcAddr(SSLUtilHandle, 'BIO_free_all'); _BioSMem := GetProcAddr(SSLUtilHandle, 'BIO_s_mem'); _BioCtrlPending := GetProcAddr(SSLUtilHandle, 'BIO_ctrl_pending'); _BioRead := GetProcAddr(SSLUtilHandle, 'BIO_read'); _BioWrite := GetProcAddr(SSLUtilHandle, 'BIO_write'); _d2iPKCS12bio := GetProcAddr(SSLUtilHandle, 'd2i_PKCS12_bio'); _PKCS12parse := GetProcAddr(SSLUtilHandle, 'PKCS12_parse'); _PKCS12free := GetProcAddr(SSLUtilHandle, 'PKCS12_free'); _RsaGenerateKey := GetProcAddr(SSLUtilHandle, 'RSA_generate_key'); _Asn1UtctimeNew := GetProcAddr(SSLUtilHandle, 'ASN1_UTCTIME_new'); _Asn1UtctimeFree := GetProcAddr(SSLUtilHandle, 'ASN1_UTCTIME_free'); _Asn1IntegerSet := GetProcAddr(SSLUtilHandle, 'ASN1_INTEGER_set'); _Asn1IntegerGet := GetProcAddr(SSLUtilHandle, 'ASN1_INTEGER_get'); {pf} _i2dX509bio := GetProcAddr(SSLUtilHandle, 'i2d_X509_bio'); _d2iX509bio := GetProcAddr(SSLUtilHandle, 'd2i_X509_bio'); {pf} _PEMReadBioX509 := GetProcAddr(SSLUtilHandle, 'PEM_read_bio_X509'); {pf} _SkX509PopFree := GetProcAddr(SSLUtilHandle, 'SK_X509_POP_FREE'); {pf} _i2dPrivateKeyBio := GetProcAddr(SSLUtilHandle, 'i2d_PrivateKey_bio'); // 3DES functions _DESsetoddparity := GetProcAddr(SSLUtilHandle, 'DES_set_odd_parity'); _DESsetkeychecked := GetProcAddr(SSLUtilHandle, 'DES_set_key_checked'); _DESecbencrypt := GetProcAddr(SSLUtilHandle, 'DES_ecb_encrypt'); // _CRYPTOnumlocks := GetProcAddr(SSLUtilHandle, 'CRYPTO_num_locks'); _CRYPTOsetlockingcallback := GetProcAddr(SSLUtilHandle, 'CRYPTO_set_locking_callback'); {$ENDIF} {$IFDEF CIL} SslLibraryInit; SslLoadErrorStrings; OPENSSLaddallalgorithms; RandScreen; {$ELSE} SetLength(s, 1024); x := GetModuleFilename(SSLLibHandle,PChar(s),Length(s)); SetLength(s, x); SSLLibFile := s; SetLength(s, 1024); x := GetModuleFilename(SSLUtilHandle,PChar(s),Length(s)); SetLength(s, x); SSLUtilFile := s; //init library if assigned(_SslLibraryInit) then _SslLibraryInit; if assigned(_SslLoadErrorStrings) then _SslLoadErrorStrings; if assigned(_OPENSSLaddallalgorithms) then _OPENSSLaddallalgorithms; if assigned(_RandScreen) then _RandScreen; if assigned(_CRYPTOnumlocks) and assigned(_CRYPTOsetlockingcallback) then InitLocks; {$ENDIF} Result := True; SSLloaded := True; end else begin //load failed! if SSLLibHandle <> 0 then begin {$IFNDEF CIL} FreeLibrary(SSLLibHandle); {$ENDIF} SSLLibHandle := 0; end; if SSLUtilHandle <> 0 then begin {$IFNDEF CIL} FreeLibrary(SSLUtilHandle); {$ENDIF} SSLLibHandle := 0; end; Result := False; end; end else //loaded before... Result := true; finally SSLCS.Leave; end; end; function DestroySSLInterface: Boolean; begin SSLCS.Enter; try if IsSSLLoaded then begin //deinit library {$IFNDEF CIL} if assigned(_CRYPTOnumlocks) and assigned(_CRYPTOsetlockingcallback) then FreeLocks; {$ENDIF} EVPCleanup; CRYPTOcleanupAllExData; ErrRemoveState(0); end; SSLloaded := false; if SSLLibHandle <> 0 then begin {$IFNDEF CIL} FreeLibrary(SSLLibHandle); {$ENDIF} SSLLibHandle := 0; end; if SSLUtilHandle <> 0 then begin {$IFNDEF CIL} FreeLibrary(SSLUtilHandle); {$ENDIF} SSLLibHandle := 0; end; {$IFNDEF CIL} _SslGetError := nil; _SslLibraryInit := nil; _SslLoadErrorStrings := nil; _SslCtxSetCipherList := nil; _SslCtxNew := nil; _SslCtxFree := nil; _SslSetFd := nil; _SslMethodV2 := nil; _SslMethodV3 := nil; _SslMethodTLSV1 := nil; _SslMethodV23 := nil; _SslCtxUsePrivateKey := nil; _SslCtxUsePrivateKeyASN1 := nil; _SslCtxUsePrivateKeyFile := nil; _SslCtxUseCertificate := nil; _SslCtxUseCertificateASN1 := nil; _SslCtxUseCertificateFile := nil; _SslCtxUseCertificateChainFile := nil; _SslCtxCheckPrivateKeyFile := nil; _SslCtxSetDefaultPasswdCb := nil; _SslCtxSetDefaultPasswdCbUserdata := nil; _SslCtxLoadVerifyLocations := nil; _SslCtxCtrl := nil; _SslNew := nil; _SslFree := nil; _SslAccept := nil; _SslConnect := nil; _SslShutdown := nil; _SslRead := nil; _SslPeek := nil; _SslWrite := nil; _SslPending := nil; _SslGetPeerCertificate := nil; _SslGetVersion := nil; _SslCtxSetVerify := nil; _SslGetCurrentCipher := nil; _SslCipherGetName := nil; _SslCipherGetBits := nil; _SslGetVerifyResult := nil; _SslCtrl := nil; _X509New := nil; _X509Free := nil; _X509NameOneline := nil; _X509GetSubjectName := nil; _X509GetIssuerName := nil; _X509NameHash := nil; _X509Digest := nil; _X509print := nil; _X509SetVersion := nil; _X509SetPubkey := nil; _X509SetIssuerName := nil; _X509NameAddEntryByTxt := nil; _X509Sign := nil; _X509GmtimeAdj := nil; _X509SetNotBefore := nil; _X509SetNotAfter := nil; _X509GetSerialNumber := nil; _EvpPkeyNew := nil; _EvpPkeyFree := nil; _EvpPkeyAssign := nil; _EVPCleanup := nil; _EvpGetDigestByName := nil; _SSLeayversion := nil; _ErrErrorString := nil; _ErrGetError := nil; _ErrClearError := nil; _ErrFreeStrings := nil; _ErrRemoveState := nil; _OPENSSLaddallalgorithms := nil; _CRYPTOcleanupAllExData := nil; _RandScreen := nil; _BioNew := nil; _BioFreeAll := nil; _BioSMem := nil; _BioCtrlPending := nil; _BioRead := nil; _BioWrite := nil; _d2iPKCS12bio := nil; _PKCS12parse := nil; _PKCS12free := nil; _RsaGenerateKey := nil; _Asn1UtctimeNew := nil; _Asn1UtctimeFree := nil; _Asn1IntegerSet := nil; _Asn1IntegerGet := nil; {pf} _SkX509PopFree := nil; {pf} _i2dX509bio := nil; _i2dPrivateKeyBio := nil; // 3DES functions _DESsetoddparity := nil; _DESsetkeychecked := nil; _DESecbencrypt := nil; // _CRYPTOnumlocks := nil; _CRYPTOsetlockingcallback := nil; {$ENDIF} finally SSLCS.Leave; end; Result := True; end; function IsSSLloaded: Boolean; begin Result := SSLLoaded; end; initialization begin SSLCS:= TCriticalSection.Create; end; finalization begin {$IFNDEF CIL} DestroySSLInterface; {$ENDIF} SSLCS.Free; end; end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/synapse/synafpc.pas�������������������������������������������������0000644�0001750�0001750�00000012153�12014201074�021407� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{==============================================================================| | Project : Ararat Synapse | 001.002.000 | |==============================================================================| | Content: Utils for FreePascal compatibility | |==============================================================================| | Copyright (c)1999-2011, Lukas Gebauer | | All rights reserved. | | | | Redistribution and use in source and binary forms, with or without | | modification, are permitted provided that the following conditions are met: | | | | Redistributions of source code must retain the above copyright notice, this | | list of conditions and the following disclaimer. | | | | Redistributions in binary form must reproduce the above copyright notice, | | this list of conditions and the following disclaimer in the documentation | | and/or other materials provided with the distribution. | | | | Neither the name of Lukas Gebauer nor the names of its contributors may | | be used to endorse or promote products derived from this software without | | specific prior written permission. | | | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | | ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR | | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | | DAMAGE. | |==============================================================================| | The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).| | Portions created by Lukas Gebauer are Copyright (c)2003-2011. | | All Rights Reserved. | |==============================================================================| | Contributor(s): | |==============================================================================| | History: see HISTORY.HTM from distribution package | | (Found at URL: http://www.ararat.cz/synapse/) | |==============================================================================} {:@exclude} {$IFDEF FPC} {$MODE DELPHI} {$ENDIF} {$H+} //old Delphi does not have MSWINDOWS define. {$IFDEF WIN32} {$IFNDEF MSWINDOWS} {$DEFINE MSWINDOWS} {$ENDIF} {$ENDIF} unit synafpc; interface uses {$IFDEF FPC} dynlibs, sysutils; {$ELSE} {$IFDEF MSWINDOWS} Windows; {$ELSE} SysUtils; {$ENDIF} {$ENDIF} {$IFDEF FPC} type TLibHandle = dynlibs.TLibHandle; function LoadLibrary(ModuleName: PChar): TLibHandle; function FreeLibrary(Module: TLibHandle): LongBool; function GetProcAddress(Module: TLibHandle; Proc: PChar): Pointer; function GetModuleFileName(Module: TLibHandle; Buffer: PChar; BufLen: Integer): Integer; {$ELSE} type {$IFDEF CIL} TLibHandle = Integer; PtrInt = Integer; {$ELSE} TLibHandle = HModule; {$IFNDEF WIN64} PtrInt = Integer; {$ENDIF} {$ENDIF} {$IFDEF VER100} LongWord = DWord; {$ENDIF} {$ENDIF} procedure Sleep(milliseconds: Cardinal); implementation {==============================================================================} {$IFDEF FPC} function LoadLibrary(ModuleName: PChar): TLibHandle; begin Result := dynlibs.LoadLibrary(Modulename); end; function FreeLibrary(Module: TLibHandle): LongBool; begin Result := dynlibs.UnloadLibrary(Module); end; function GetProcAddress(Module: TLibHandle; Proc: PChar): Pointer; begin Result := dynlibs.GetProcedureAddress(Module, Proc); end; function GetModuleFileName(Module: TLibHandle; Buffer: PChar; BufLen: Integer): Integer; begin Result := 0; end; {$ELSE} {$ENDIF} procedure Sleep(milliseconds: Cardinal); begin {$IFDEF MSWINDOWS} {$IFDEF FPC} sysutils.sleep(milliseconds); {$ELSE} windows.sleep(milliseconds); {$ENDIF} {$ELSE} sysutils.sleep(milliseconds); {$ENDIF} end; end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/synapse/synaip.pas��������������������������������������������������0000644�0001750�0001750�00000027177�12014201074�021263� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{==============================================================================| | Project : Ararat Synapse | 001.002.001 | |==============================================================================| | Content: IP address support procedures and functions | |==============================================================================| | Copyright (c)2006-2010, Lukas Gebauer | | All rights reserved. | | | | Redistribution and use in source and binary forms, with or without | | modification, are permitted provided that the following conditions are met: | | | | Redistributions of source code must retain the above copyright notice, this | | list of conditions and the following disclaimer. | | | | Redistributions in binary form must reproduce the above copyright notice, | | this list of conditions and the following disclaimer in the documentation | | and/or other materials provided with the distribution. | | | | Neither the name of Lukas Gebauer nor the names of its contributors may | | be used to endorse or promote products derived from this software without | | specific prior written permission. | | | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | | ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR | | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | | DAMAGE. | |==============================================================================| | The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).| | Portions created by Lukas Gebauer are Copyright (c) 2006-2010. | | All Rights Reserved. | |==============================================================================| | Contributor(s): | |==============================================================================| | History: see HISTORY.HTM from distribution package | | (Found at URL: http://www.ararat.cz/synapse/) | |==============================================================================} {:@abstract(IP adress support procedures and functions)} {$IFDEF FPC} {$MODE DELPHI} {$ENDIF} {$Q-} {$R-} {$H+} {$IFDEF UNICODE} {$WARN IMPLICIT_STRING_CAST OFF} {$WARN IMPLICIT_STRING_CAST_LOSS OFF} {$WARN SUSPICIOUS_TYPECAST OFF} {$ENDIF} unit synaip; interface uses SysUtils, SynaUtil; type {:binary form of IPv6 adress (for string conversion routines)} TIp6Bytes = array [0..15] of Byte; {:binary form of IPv6 adress (for string conversion routines)} TIp6Words = array [0..7] of Word; {:Returns @TRUE, if "Value" is a valid IPv4 address. Cannot be a symbolic Name!} function IsIP(const Value: string): Boolean; {:Returns @TRUE, if "Value" is a valid IPv6 address. Cannot be a symbolic Name!} function IsIP6(const Value: string): Boolean; {:Returns a string with the "Host" ip address converted to binary form.} function IPToID(Host: string): Ansistring; {:Convert IPv6 address from their string form to binary byte array.} function StrToIp6(value: string): TIp6Bytes; {:Convert IPv6 address from binary byte array to string form.} function Ip6ToStr(value: TIp6Bytes): string; {:Convert IPv4 address from their string form to binary.} function StrToIp(value: string): integer; {:Convert IPv4 address from binary to string form.} function IpToStr(value: integer): string; {:Convert IPv4 address to reverse form.} function ReverseIP(Value: AnsiString): AnsiString; {:Convert IPv6 address to reverse form.} function ReverseIP6(Value: AnsiString): AnsiString; {:Expand short form of IPv6 address to long form.} function ExpandIP6(Value: AnsiString): AnsiString; implementation {==============================================================================} function IsIP(const Value: string): Boolean; var TempIP: string; function ByteIsOk(const Value: string): Boolean; var x, n: integer; begin x := StrToIntDef(Value, -1); Result := (x >= 0) and (x < 256); // X may be in correct range, but value still may not be correct value! // i.e. "$80" if Result then for n := 1 to length(Value) do if not (AnsiChar(Value[n]) in ['0'..'9']) then begin Result := False; Break; end; end; begin TempIP := Value; Result := False; if not ByteIsOk(Fetch(TempIP, '.')) then Exit; if not ByteIsOk(Fetch(TempIP, '.')) then Exit; if not ByteIsOk(Fetch(TempIP, '.')) then Exit; if ByteIsOk(TempIP) then Result := True; end; {==============================================================================} function IsIP6(const Value: string): Boolean; var TempIP: string; s,t: string; x: integer; partcount: integer; zerocount: integer; First: Boolean; begin TempIP := Value; Result := False; if Value = '::' then begin Result := True; Exit; end; partcount := 0; zerocount := 0; First := True; while tempIP <> '' do begin s := fetch(TempIP, ':'); if not(First) and (s = '') then Inc(zerocount); First := False; if zerocount > 1 then break; Inc(partCount); if s = '' then Continue; if partCount > 8 then break; if tempIP = '' then begin t := SeparateRight(s, '%'); s := SeparateLeft(s, '%'); x := StrToIntDef('$' + t, -1); if (x < 0) or (x > $ffff) then break; end; x := StrToIntDef('$' + s, -1); if (x < 0) or (x > $ffff) then break; if tempIP = '' then if not((PartCount = 1) and (ZeroCount = 0)) then Result := True; end; end; {==============================================================================} function IPToID(Host: string): Ansistring; var s: string; i, x: Integer; begin Result := ''; for x := 0 to 3 do begin s := Fetch(Host, '.'); i := StrToIntDef(s, 0); Result := Result + AnsiChar(i); end; end; {==============================================================================} function StrToIp(value: string): integer; var s: string; i, x: Integer; begin Result := 0; for x := 0 to 3 do begin s := Fetch(value, '.'); i := StrToIntDef(s, 0); Result := (256 * Result) + i; end; end; {==============================================================================} function IpToStr(value: integer): string; var x1, x2: word; y1, y2: byte; begin Result := ''; x1 := value shr 16; x2 := value and $FFFF; y1 := x1 div $100; y2 := x1 mod $100; Result := inttostr(y1) + '.' + inttostr(y2) + '.'; y1 := x2 div $100; y2 := x2 mod $100; Result := Result + inttostr(y1) + '.' + inttostr(y2); end; {==============================================================================} function ExpandIP6(Value: AnsiString): AnsiString; var n: integer; s: ansistring; x: integer; begin Result := ''; if value = '' then exit; x := countofchar(value, ':'); if x > 7 then exit; if value[1] = ':' then value := '0' + value; if value[length(value)] = ':' then value := value + '0'; x := 8 - x; s := ''; for n := 1 to x do s := s + ':0'; s := s + ':'; Result := replacestring(value, '::', s); end; {==============================================================================} function StrToIp6(Value: string): TIp6Bytes; var IPv6: TIp6Words; Index: Integer; n: integer; b1, b2: byte; s: string; x: integer; begin for n := 0 to 15 do Result[n] := 0; for n := 0 to 7 do Ipv6[n] := 0; Index := 0; Value := ExpandIP6(value); if value = '' then exit; while Value <> '' do begin if Index > 7 then Exit; s := fetch(value, ':'); if s = '@' then break; if s = '' then begin IPv6[Index] := 0; end else begin x := StrToIntDef('$' + s, -1); if (x > 65535) or (x < 0) then Exit; IPv6[Index] := x; end; Inc(Index); end; for n := 0 to 7 do begin b1 := ipv6[n] div 256; b2 := ipv6[n] mod 256; Result[n * 2] := b1; Result[(n * 2) + 1] := b2; end; end; {==============================================================================} //based on routine by the Free Pascal development team function Ip6ToStr(value: TIp6Bytes): string; var i, x: byte; zr1,zr2: set of byte; zc1,zc2: byte; have_skipped: boolean; ip6w: TIp6words; begin zr1 := []; zr2 := []; zc1 := 0; zc2 := 0; for i := 0 to 7 do begin x := i * 2; ip6w[i] := value[x] * 256 + value[x + 1]; if ip6w[i] = 0 then begin include(zr2, i); inc(zc2); end else begin if zc1 < zc2 then begin zc1 := zc2; zr1 := zr2; zc2 := 0; zr2 := []; end; end; end; if zc1 < zc2 then begin zr1 := zr2; end; SetLength(Result, 8*5-1); SetLength(Result, 0); have_skipped := false; for i := 0 to 7 do begin if not(i in zr1) then begin if have_skipped then begin if Result = '' then Result := '::' else Result := Result + ':'; have_skipped := false; end; Result := Result + IntToHex(Ip6w[i], 1) + ':'; end else begin have_skipped := true; end; end; if have_skipped then if Result = '' then Result := '::0' else Result := Result + ':'; if Result = '' then Result := '::0'; if not (7 in zr1) then SetLength(Result, Length(Result)-1); Result := LowerCase(result); end; {==============================================================================} function ReverseIP(Value: AnsiString): AnsiString; var x: Integer; begin Result := ''; repeat x := LastDelimiter('.', Value); Result := Result + '.' + Copy(Value, x + 1, Length(Value) - x); Delete(Value, x, Length(Value) - x + 1); until x < 1; if Length(Result) > 0 then if Result[1] = '.' then Delete(Result, 1, 1); end; {==============================================================================} function ReverseIP6(Value: AnsiString): AnsiString; var ip6: TIp6bytes; n: integer; x, y: integer; begin ip6 := StrToIP6(Value); x := ip6[15] div 16; y := ip6[15] mod 16; Result := IntToHex(y, 1) + '.' + IntToHex(x, 1); for n := 14 downto 0 do begin x := ip6[n] div 16; y := ip6[n] mod 16; Result := Result + '.' + IntToHex(y, 1) + '.' + IntToHex(x, 1); end; end; {==============================================================================} end. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/synapse/synautil.pas������������������������������������������������0000644�0001750�0001750�00000154000�12014201074�021612� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{==============================================================================| | Project : Ararat Synapse | 004.015.000 | |==============================================================================| | Content: support procedures and functions | |==============================================================================| | Copyright (c)1999-2012, Lukas Gebauer | | All rights reserved. | | | | Redistribution and use in source and binary forms, with or without | | modification, are permitted provided that the following conditions are met: | | | | Redistributions of source code must retain the above copyright notice, this | | list of conditions and the following disclaimer. | | | | Redistributions in binary form must reproduce the above copyright notice, | | this list of conditions and the following disclaimer in the documentation | | and/or other materials provided with the distribution. | | | | Neither the name of Lukas Gebauer nor the names of its contributors may | | be used to endorse or promote products derived from this software without | | specific prior written permission. | | | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | | ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR | | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | | DAMAGE. | |==============================================================================| | The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).| | Portions created by Lukas Gebauer are Copyright (c) 1999-2012. | | Portions created by Hernan Sanchez are Copyright (c) 2000. | | Portions created by Petr Fejfar are Copyright (c)2011-2012. | | All Rights Reserved. | |==============================================================================| | Contributor(s): | | Hernan Sanchez (hernan.sanchez@iname.com) | |==============================================================================| | History: see HISTORY.HTM from distribution package | | (Found at URL: http://www.ararat.cz/synapse/) | |==============================================================================} {:@abstract(Support procedures and functions)} {$IFDEF FPC} {$MODE DELPHI} {$ENDIF} {$Q-} {$R-} {$H+} //old Delphi does not have MSWINDOWS define. {$IFDEF WIN32} {$IFNDEF MSWINDOWS} {$DEFINE MSWINDOWS} {$ENDIF} {$ENDIF} {$IFDEF UNICODE} {$WARN IMPLICIT_STRING_CAST OFF} {$WARN IMPLICIT_STRING_CAST_LOSS OFF} {$WARN SUSPICIOUS_TYPECAST OFF} {$ENDIF} unit synautil; interface uses {$IFDEF MSWINDOWS} Windows, {$ELSE} {$IFDEF FPC} UnixUtil, Unix, BaseUnix, {$ELSE} Libc, {$ENDIF} {$ENDIF} {$IFDEF CIL} System.IO, {$ENDIF} SysUtils, Classes, SynaFpc; {$IFDEF VER100} type int64 = integer; {$ENDIF} {:Return your timezone bias from UTC time in minutes.} function TimeZoneBias: integer; {:Return your timezone bias from UTC time in string representation like "+0200".} function TimeZone: string; {:Returns current time in format defined in RFC-822. Useful for SMTP messages, but other protocols use this time format as well. Results contains the timezone specification. Four digit year is used to break any Y2K concerns. (Example 'Fri, 15 Oct 1999 21:14:56 +0200')} function Rfc822DateTime(t: TDateTime): string; {:Returns date and time in format defined in C compilers in format "mmm dd hh:nn:ss"} function CDateTime(t: TDateTime): string; {:Returns date and time in format defined in format 'yymmdd hhnnss'} function SimpleDateTime(t: TDateTime): string; {:Returns date and time in format defined in ANSI C compilers in format "ddd mmm d hh:nn:ss yyyy" } function AnsiCDateTime(t: TDateTime): string; {:Decode three-letter string with name of month to their month number. If string not match any month name, then is returned 0. For parsing are used predefined names for English, French and German and names from system locale too.} function GetMonthNumber(Value: String): integer; {:Return decoded time from given string. Time must be witch separator ':'. You can use "hh:mm" or "hh:mm:ss".} function GetTimeFromStr(Value: string): TDateTime; {:Decode string in format "m-d-y" to TDateTime type.} function GetDateMDYFromStr(Value: string): TDateTime; {:Decode various string representations of date and time to Tdatetime type. This function do all timezone corrections too! This function can decode lot of formats like: @longcode(# ddd, d mmm yyyy hh:mm:ss ddd, d mmm yy hh:mm:ss ddd, mmm d yyyy hh:mm:ss ddd mmm dd hh:mm:ss yyyy #) and more with lot of modifications, include: @longcode(# Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036 Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() Format #) Timezone corrections known lot of symbolic timezone names (like CEST, EDT, etc.) or numeric representation (like +0200). By convention defined in RFC timezone +0000 is GMT and -0000 is current your system timezone.} function DecodeRfcDateTime(Value: string): TDateTime; {:Return current system date and time in UTC timezone.} function GetUTTime: TDateTime; {:Set Newdt as current system date and time in UTC timezone. This function work only if you have administrator rights!} function SetUTTime(Newdt: TDateTime): Boolean; {:Return current value of system timer with precizion 1 millisecond. Good for measure time difference.} function GetTick: LongWord; {:Return difference between two timestamps. It working fine only for differences smaller then maxint. (difference must be smaller then 24 days.)} function TickDelta(TickOld, TickNew: LongWord): LongWord; {:Return two characters, which ordinal values represents the value in byte format. (High-endian)} function CodeInt(Value: Word): Ansistring; {:Decodes two characters located at "Index" offset position of the "Value" string to Word values.} function DecodeInt(const Value: Ansistring; Index: Integer): Word; {:Return four characters, which ordinal values represents the value in byte format. (High-endian)} function CodeLongInt(Value: LongInt): Ansistring; {:Decodes four characters located at "Index" offset position of the "Value" string to LongInt values.} function DecodeLongInt(const Value: Ansistring; Index: Integer): LongInt; {:Dump binary buffer stored in a string to a result string.} function DumpStr(const Buffer: Ansistring): string; {:Dump binary buffer stored in a string to a result string. All bytes with code of character is written as character, not as hexadecimal value.} function DumpExStr(const Buffer: Ansistring): string; {:Dump binary buffer stored in a string to a file with DumpFile filename.} procedure Dump(const Buffer: AnsiString; DumpFile: string); {:Dump binary buffer stored in a string to a file with DumpFile filename. All bytes with code of character is written as character, not as hexadecimal value.} procedure DumpEx(const Buffer: AnsiString; DumpFile: string); {:Like TrimLeft, but remove only spaces, not control characters!} function TrimSPLeft(const S: string): string; {:Like TrimRight, but remove only spaces, not control characters!} function TrimSPRight(const S: string): string; {:Like Trim, but remove only spaces, not control characters!} function TrimSP(const S: string): string; {:Returns a portion of the "Value" string located to the left of the "Delimiter" string. If a delimiter is not found, results is original string.} function SeparateLeft(const Value, Delimiter: string): string; {:Returns the portion of the "Value" string located to the right of the "Delimiter" string. If a delimiter is not found, results is original string.} function SeparateRight(const Value, Delimiter: string): string; {:Returns parameter value from string in format: parameter1="value1"; parameter2=value2} function GetParameter(const Value, Parameter: string): string; {:parse value string with elements differed by Delimiter into stringlist.} procedure ParseParametersEx(Value, Delimiter: string; const Parameters: TStrings); {:parse value string with elements differed by ';' into stringlist.} procedure ParseParameters(Value: string; const Parameters: TStrings); {:Index of string in stringlist with same beginning as Value is returned.} function IndexByBegin(Value: string; const List: TStrings): integer; {:Returns only the e-mail portion of an address from the full address format. i.e. returns 'nobody@@somewhere.com' from '"someone" <nobody@@somewhere.com>'} function GetEmailAddr(const Value: string): string; {:Returns only the description part from a full address format. i.e. returns 'someone' from '"someone" <nobody@@somewhere.com>'} function GetEmailDesc(Value: string): string; {:Returns a string with hexadecimal digits representing the corresponding values of the bytes found in "Value" string.} function StrToHex(const Value: Ansistring): string; {:Returns a string of binary "Digits" representing "Value".} function IntToBin(Value: Integer; Digits: Byte): string; {:Returns an integer equivalent of the binary string in "Value". (i.e. ('10001010') returns 138)} function BinToInt(const Value: string): Integer; {:Parses a URL to its various components.} function ParseURL(URL: string; var Prot, User, Pass, Host, Port, Path, Para: string): string; {:Replaces all "Search" string values found within "Value" string, with the "Replace" string value.} function ReplaceString(Value, Search, Replace: AnsiString): AnsiString; {:It is like RPos, but search is from specified possition.} function RPosEx(const Sub, Value: string; From: integer): Integer; {:It is like POS function, but from right side of Value string.} function RPos(const Sub, Value: String): Integer; {:Like @link(fetch), but working with binary strings, not with text.} function FetchBin(var Value: string; const Delimiter: string): string; {:Fetch string from left of Value string.} function Fetch(var Value: string; const Delimiter: string): string; {:Fetch string from left of Value string. This function ignore delimitesr inside quotations.} function FetchEx(var Value: string; const Delimiter, Quotation: string): string; {:If string is binary string (contains non-printable characters), then is returned true.} function IsBinaryString(const Value: AnsiString): Boolean; {:return position of string terminator in string. If terminator found, then is returned in terminator parameter. Possible line terminators are: CRLF, LFCR, CR, LF} function PosCRLF(const Value: AnsiString; var Terminator: AnsiString): integer; {:Delete empty strings from end of stringlist.} Procedure StringsTrim(const value: TStrings); {:Like Pos function, buf from given string possition.} function PosFrom(const SubStr, Value: String; From: integer): integer; {$IFNDEF CIL} {:Increase pointer by value.} function IncPoint(const p: pointer; Value: integer): pointer; {$ENDIF} {:Get string between PairBegin and PairEnd. This function respect nesting. For example: @longcode(# Value is: 'Hi! (hello(yes!))' pairbegin is: '(' pairend is: ')' In this case result is: 'hello(yes!)'#)} function GetBetween(const PairBegin, PairEnd, Value: string): string; {:Return count of Chr in Value string.} function CountOfChar(const Value: string; Chr: char): integer; {:Remove quotation from Value string. If Value is not quoted, then return same string without any modification. } function UnquoteStr(const Value: string; Quote: Char): string; {:Quote Value string. If Value contains some Quote chars, then it is doubled.} function QuoteStr(const Value: string; Quote: Char): string; {:Convert lines in stringlist from 'name: value' form to 'name=value' form.} procedure HeadersToList(const Value: TStrings); {:Convert lines in stringlist from 'name=value' form to 'name: value' form.} procedure ListToHeaders(const Value: TStrings); {:swap bytes in integer.} function SwapBytes(Value: integer): integer; {:read string with requested length form stream.} function ReadStrFromStream(const Stream: TStream; len: integer): AnsiString; {:write string to stream.} procedure WriteStrToStream(const Stream: TStream; Value: AnsiString); {:Return filename of new temporary file in Dir (if empty, then default temporary directory is used) and with optional filename prefix.} function GetTempFile(const Dir, prefix: AnsiString): AnsiString; {:Return padded string. If length is greater, string is truncated. If length is smaller, string is padded by Pad character.} function PadString(const Value: AnsiString; len: integer; Pad: AnsiChar): AnsiString; {:XOR each byte in the strings} function XorString(Indata1, Indata2: AnsiString): AnsiString; {:Read header from "Value" stringlist beginning at "Index" position. If header is Splitted into multiple lines, then this procedure de-split it into one line.} function NormalizeHeader(Value: TStrings; var Index: Integer): string; {pf} {:Search for one of line terminators CR, LF or NUL. Return position of the line beginning and length of text.} procedure SearchForLineBreak(var APtr:PANSIChar; AEtx:PANSIChar; out ABol:PANSIChar; out ALength:integer); {:Skip both line terminators CR LF (if any). Move APtr position forward.} procedure SkipLineBreak(var APtr:PANSIChar; AEtx:PANSIChar); {:Skip all blank lines in a buffer starting at APtr and move APtr position forward.} procedure SkipNullLines (var APtr:PANSIChar; AEtx:PANSIChar); {:Copy all lines from a buffer starting at APtr to ALines until empty line or end of the buffer is reached. Move APtr position forward).} procedure CopyLinesFromStreamUntilNullLine(var APtr:PANSIChar; AEtx:PANSIChar; ALines:TStrings); {:Copy all lines from a buffer starting at APtr to ALines until ABoundary or end of the buffer is reached. Move APtr position forward).} procedure CopyLinesFromStreamUntilBoundary(var APtr:PANSIChar; AEtx:PANSIChar; ALines:TStrings; const ABoundary:ANSIString); {:Search ABoundary in a buffer starting at APtr. Return beginning of the ABoundary. Move APtr forward behind a trailing CRLF if any).} function SearchForBoundary (var APtr:PANSIChar; AEtx:PANSIChar; const ABoundary:ANSIString): PANSIChar; {:Compare a text at position ABOL with ABoundary and return position behind the match (including a trailing CRLF if any).} function MatchBoundary (ABOL,AETX:PANSIChar; const ABoundary:ANSIString): PANSIChar; {:Compare a text at position ABOL with ABoundary + the last boundary suffix and return position behind the match (including a trailing CRLF if any).} function MatchLastBoundary (ABOL,AETX:PANSIChar; const ABoundary:ANSIString): PANSIChar; {:Copy data from a buffer starting at position APtr and delimited by AEtx position into ANSIString.} function BuildStringFromBuffer (AStx,AEtx:PANSIChar): ANSIString; {/pf} var {:can be used for your own months strings for @link(getmonthnumber)} CustomMonthNames: array[1..12] of string; implementation {==============================================================================} const MyDayNames: array[1..7] of AnsiString = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'); var MyMonthNames: array[0..6, 1..12] of String = ( ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', //rewrited by system locales 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'), ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', //English 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'), ('jan', 'fv', 'mar', 'avr', 'mai', 'jun', //French 'jul', 'ao', 'sep', 'oct', 'nov', 'dc'), ('jan', 'fev', 'mar', 'avr', 'mai', 'jun', //French#2 'jul', 'aou', 'sep', 'oct', 'nov', 'dec'), ('Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', //German 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'), ('Jan', 'Feb', 'Mr', 'Apr', 'Mai', 'Jun', //German#2 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'), ('Led', 'no', 'Be', 'Dub', 'Kv', 'en', //Czech 'ec', 'Srp', 'Z', 'j', 'Lis', 'Pro') ); {==============================================================================} function TimeZoneBias: integer; {$IFNDEF MSWINDOWS} {$IFNDEF FPC} var t: TTime_T; UT: TUnixTime; begin __time(@T); localtime_r(@T, UT); Result := ut.__tm_gmtoff div 60; {$ELSE} begin Result := TZSeconds div 60; {$ENDIF} {$ELSE} var zoneinfo: TTimeZoneInformation; bias: Integer; begin case GetTimeZoneInformation(Zoneinfo) of 2: bias := zoneinfo.Bias + zoneinfo.DaylightBias; 1: bias := zoneinfo.Bias + zoneinfo.StandardBias; else bias := zoneinfo.Bias; end; Result := bias * (-1); {$ENDIF} end; {==============================================================================} function TimeZone: string; var bias: Integer; h, m: Integer; begin bias := TimeZoneBias; if bias >= 0 then Result := '+' else Result := '-'; bias := Abs(bias); h := bias div 60; m := bias mod 60; Result := Result + Format('%.2d%.2d', [h, m]); end; {==============================================================================} function Rfc822DateTime(t: TDateTime): string; var wYear, wMonth, wDay: word; begin DecodeDate(t, wYear, wMonth, wDay); Result := Format('%s, %d %s %s %s', [MyDayNames[DayOfWeek(t)], wDay, MyMonthNames[1, wMonth], FormatDateTime('yyyy hh":"nn":"ss', t), TimeZone]); end; {==============================================================================} function CDateTime(t: TDateTime): string; var wYear, wMonth, wDay: word; begin DecodeDate(t, wYear, wMonth, wDay); Result:= Format('%s %2d %s', [MyMonthNames[1, wMonth], wDay, FormatDateTime('hh":"nn":"ss', t)]); end; {==============================================================================} function SimpleDateTime(t: TDateTime): string; begin Result := FormatDateTime('yymmdd hhnnss', t); end; {==============================================================================} function AnsiCDateTime(t: TDateTime): string; var wYear, wMonth, wDay: word; begin DecodeDate(t, wYear, wMonth, wDay); Result := Format('%s %s %d %s', [MyDayNames[DayOfWeek(t)], MyMonthNames[1, wMonth], wDay, FormatDateTime('hh":"nn":"ss yyyy ', t)]); end; {==============================================================================} function DecodeTimeZone(Value: string; var Zone: integer): Boolean; var x: integer; zh, zm: integer; s: string; begin Result := false; s := Value; if (Pos('+', s) = 1) or (Pos('-',s) = 1) then begin if s = '-0000' then Zone := TimeZoneBias else if Length(s) > 4 then begin zh := StrToIntdef(s[2] + s[3], 0); zm := StrToIntdef(s[4] + s[5], 0); zone := zh * 60 + zm; if s[1] = '-' then zone := zone * (-1); end; Result := True; end else begin x := 32767; if s = 'NZDT' then x := 13; if s = 'IDLE' then x := 12; if s = 'NZST' then x := 12; if s = 'NZT' then x := 12; if s = 'EADT' then x := 11; if s = 'GST' then x := 10; if s = 'JST' then x := 9; if s = 'CCT' then x := 8; if s = 'WADT' then x := 8; if s = 'WAST' then x := 7; if s = 'ZP6' then x := 6; if s = 'ZP5' then x := 5; if s = 'ZP4' then x := 4; if s = 'BT' then x := 3; if s = 'EET' then x := 2; if s = 'MEST' then x := 2; if s = 'MESZ' then x := 2; if s = 'SST' then x := 2; if s = 'FST' then x := 2; if s = 'CEST' then x := 2; if s = 'CET' then x := 1; if s = 'FWT' then x := 1; if s = 'MET' then x := 1; if s = 'MEWT' then x := 1; if s = 'SWT' then x := 1; if s = 'UT' then x := 0; if s = 'UTC' then x := 0; if s = 'GMT' then x := 0; if s = 'WET' then x := 0; if s = 'WAT' then x := -1; if s = 'BST' then x := -1; if s = 'AT' then x := -2; if s = 'ADT' then x := -3; if s = 'AST' then x := -4; if s = 'EDT' then x := -4; if s = 'EST' then x := -5; if s = 'CDT' then x := -5; if s = 'CST' then x := -6; if s = 'MDT' then x := -6; if s = 'MST' then x := -7; if s = 'PDT' then x := -7; if s = 'PST' then x := -8; if s = 'YDT' then x := -8; if s = 'YST' then x := -9; if s = 'HDT' then x := -9; if s = 'AHST' then x := -10; if s = 'CAT' then x := -10; if s = 'HST' then x := -10; if s = 'EAST' then x := -10; if s = 'NT' then x := -11; if s = 'IDLW' then x := -12; if x <> 32767 then begin zone := x * 60; Result := True; end; end; end; {==============================================================================} function GetMonthNumber(Value: String): integer; var n: integer; function TestMonth(Value: String; Index: Integer): Boolean; var n: integer; begin Result := False; for n := 0 to 6 do if Value = AnsiUppercase(MyMonthNames[n, Index]) then begin Result := True; Break; end; end; begin Result := 0; Value := AnsiUppercase(Value); for n := 1 to 12 do if TestMonth(Value, n) or (Value = AnsiUppercase(CustomMonthNames[n])) then begin Result := n; Break; end; end; {==============================================================================} function GetTimeFromStr(Value: string): TDateTime; var x: integer; begin x := rpos(':', Value); if (x > 0) and ((Length(Value) - x) > 2) then Value := Copy(Value, 1, x + 2); Value := ReplaceString(Value, ':', TimeSeparator); Result := -1; try Result := StrToTime(Value); except on Exception do ; end; end; {==============================================================================} function GetDateMDYFromStr(Value: string): TDateTime; var wYear, wMonth, wDay: word; s: string; begin Result := 0; s := Fetch(Value, '-'); wMonth := StrToIntDef(s, 12); s := Fetch(Value, '-'); wDay := StrToIntDef(s, 30); wYear := StrToIntDef(Value, 1899); if wYear < 1000 then if (wYear > 99) then wYear := wYear + 1900 else if wYear > 50 then wYear := wYear + 1900 else wYear := wYear + 2000; try Result := EncodeDate(wYear, wMonth, wDay); except on Exception do ; end; end; {==============================================================================} function DecodeRfcDateTime(Value: string): TDateTime; var day, month, year: Word; zone: integer; x, y: integer; s: string; t: TDateTime; begin // ddd, d mmm yyyy hh:mm:ss // ddd, d mmm yy hh:mm:ss // ddd, mmm d yyyy hh:mm:ss // ddd mmm dd hh:mm:ss yyyy // Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 // Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036 // Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() Format Result := 0; if Value = '' then Exit; day := 0; month := 0; year := 0; zone := 0; Value := ReplaceString(Value, ' -', ' #'); Value := ReplaceString(Value, '-', ' '); Value := ReplaceString(Value, ' #', ' -'); while Value <> '' do begin s := Fetch(Value, ' '); s := uppercase(s); // timezone if DecodetimeZone(s, x) then begin zone := x; continue; end; x := StrToIntDef(s, 0); // day or year if x > 0 then if (x < 32) and (day = 0) then begin day := x; continue; end else begin if (year = 0) and ((month > 0) or (x > 12)) then begin year := x; if year < 32 then year := year + 2000; if year < 1000 then year := year + 1900; continue; end; end; // time if rpos(':', s) > Pos(':', s) then begin t := GetTimeFromStr(s); if t <> -1 then Result := t; continue; end; //timezone daylight saving time if s = 'DST' then begin zone := zone + 60; continue; end; // month y := GetMonthNumber(s); if (y > 0) and (month = 0) then month := y; end; if year = 0 then year := 1980; if month < 1 then month := 1; if month > 12 then month := 12; if day < 1 then day := 1; x := MonthDays[IsLeapYear(year), month]; if day > x then day := x; Result := Result + Encodedate(year, month, day); zone := zone - TimeZoneBias; x := zone div 1440; Result := Result - x; zone := zone mod 1440; t := EncodeTime(Abs(zone) div 60, Abs(zone) mod 60, 0, 0); if zone < 0 then t := 0 - t; Result := Result - t; end; {==============================================================================} function GetUTTime: TDateTime; {$IFDEF MSWINDOWS} {$IFNDEF FPC} var st: TSystemTime; begin GetSystemTime(st); result := SystemTimeToDateTime(st); {$ELSE} var st: SysUtils.TSystemTime; stw: Windows.TSystemTime; begin GetSystemTime(stw); st.Year := stw.wYear; st.Month := stw.wMonth; st.Day := stw.wDay; st.Hour := stw.wHour; st.Minute := stw.wMinute; st.Second := stw.wSecond; st.Millisecond := stw.wMilliseconds; result := SystemTimeToDateTime(st); {$ENDIF} {$ELSE} {$IFNDEF FPC} var TV: TTimeVal; begin gettimeofday(TV, nil); Result := UnixDateDelta + (TV.tv_sec + TV.tv_usec / 1000000) / 86400; {$ELSE} var TV: TimeVal; begin fpgettimeofday(@TV, nil); Result := UnixDateDelta + (TV.tv_sec + TV.tv_usec / 1000000) / 86400; {$ENDIF} {$ENDIF} end; {==============================================================================} function SetUTTime(Newdt: TDateTime): Boolean; {$IFDEF MSWINDOWS} {$IFNDEF FPC} var st: TSystemTime; begin DateTimeToSystemTime(newdt,st); Result := SetSystemTime(st); {$ELSE} var st: SysUtils.TSystemTime; stw: Windows.TSystemTime; begin DateTimeToSystemTime(newdt,st); stw.wYear := st.Year; stw.wMonth := st.Month; stw.wDay := st.Day; stw.wHour := st.Hour; stw.wMinute := st.Minute; stw.wSecond := st.Second; stw.wMilliseconds := st.Millisecond; Result := SetSystemTime(stw); {$ENDIF} {$ELSE} {$IFNDEF FPC} var TV: TTimeVal; d: double; TZ: Ttimezone; PZ: PTimeZone; begin TZ.tz_minuteswest := 0; TZ.tz_dsttime := 0; PZ := @TZ; gettimeofday(TV, PZ); d := (newdt - UnixDateDelta) * 86400; TV.tv_sec := trunc(d); TV.tv_usec := trunc(frac(d) * 1000000); Result := settimeofday(TV, TZ) <> -1; {$ELSE} var TV: TimeVal; d: double; begin d := (newdt - UnixDateDelta) * 86400; TV.tv_sec := trunc(d); TV.tv_usec := trunc(frac(d) * 1000000); Result := fpsettimeofday(@TV, nil) <> -1; {$ENDIF} {$ENDIF} end; {==============================================================================} {$IFNDEF MSWINDOWS} function GetTick: LongWord; var Stamp: TTimeStamp; begin Stamp := DateTimeToTimeStamp(Now); Result := Stamp.Time; end; {$ELSE} function GetTick: LongWord; var tick, freq: TLargeInteger; {$IFDEF VER100} x: TLargeInteger; {$ENDIF} begin if Windows.QueryPerformanceFrequency(freq) then begin Windows.QueryPerformanceCounter(tick); {$IFDEF VER100} x.QuadPart := (tick.QuadPart / freq.QuadPart) * 1000; Result := x.LowPart; {$ELSE} Result := Trunc((tick / freq) * 1000) and High(LongWord) {$ENDIF} end else Result := Windows.GetTickCount; end; {$ENDIF} {==============================================================================} function TickDelta(TickOld, TickNew: LongWord): LongWord; begin //if DWord is signed type (older Deplhi), // then it not work properly on differencies larger then maxint! Result := 0; if TickOld <> TickNew then begin if TickNew < TickOld then begin TickNew := TickNew + LongWord(MaxInt) + 1; TickOld := TickOld + LongWord(MaxInt) + 1; end; Result := TickNew - TickOld; if TickNew < TickOld then if Result > 0 then Result := 0 - Result; end; end; {==============================================================================} function CodeInt(Value: Word): Ansistring; begin setlength(result, 2); result[1] := AnsiChar(Value div 256); result[2] := AnsiChar(Value mod 256); // Result := AnsiChar(Value div 256) + AnsiChar(Value mod 256) end; {==============================================================================} function DecodeInt(const Value: Ansistring; Index: Integer): Word; var x, y: Byte; begin if Length(Value) > Index then x := Ord(Value[Index]) else x := 0; if Length(Value) >= (Index + 1) then y := Ord(Value[Index + 1]) else y := 0; Result := x * 256 + y; end; {==============================================================================} function CodeLongInt(Value: Longint): Ansistring; var x, y: word; begin // this is fix for negative numbers on systems where longint = integer x := (Value shr 16) and integer($ffff); y := Value and integer($ffff); setlength(result, 4); result[1] := AnsiChar(x div 256); result[2] := AnsiChar(x mod 256); result[3] := AnsiChar(y div 256); result[4] := AnsiChar(y mod 256); end; {==============================================================================} function DecodeLongInt(const Value: Ansistring; Index: Integer): LongInt; var x, y: Byte; xl, yl: Byte; begin if Length(Value) > Index then x := Ord(Value[Index]) else x := 0; if Length(Value) >= (Index + 1) then y := Ord(Value[Index + 1]) else y := 0; if Length(Value) >= (Index + 2) then xl := Ord(Value[Index + 2]) else xl := 0; if Length(Value) >= (Index + 3) then yl := Ord(Value[Index + 3]) else yl := 0; Result := ((x * 256 + y) * 65536) + (xl * 256 + yl); end; {==============================================================================} function DumpStr(const Buffer: Ansistring): string; var n: Integer; begin Result := ''; for n := 1 to Length(Buffer) do Result := Result + ' +#$' + IntToHex(Ord(Buffer[n]), 2); end; {==============================================================================} function DumpExStr(const Buffer: Ansistring): string; var n: Integer; x: Byte; begin Result := ''; for n := 1 to Length(Buffer) do begin x := Ord(Buffer[n]); if x in [65..90, 97..122] then Result := Result + ' +''' + char(x) + '''' else Result := Result + ' +#$' + IntToHex(Ord(Buffer[n]), 2); end; end; {==============================================================================} procedure Dump(const Buffer: AnsiString; DumpFile: string); var f: Text; begin AssignFile(f, DumpFile); if FileExists(DumpFile) then DeleteFile(DumpFile); Rewrite(f); try Writeln(f, DumpStr(Buffer)); finally CloseFile(f); end; end; {==============================================================================} procedure DumpEx(const Buffer: AnsiString; DumpFile: string); var f: Text; begin AssignFile(f, DumpFile); if FileExists(DumpFile) then DeleteFile(DumpFile); Rewrite(f); try Writeln(f, DumpExStr(Buffer)); finally CloseFile(f); end; end; {==============================================================================} function TrimSPLeft(const S: string): string; var I, L: Integer; begin Result := ''; if S = '' then Exit; L := Length(S); I := 1; while (I <= L) and (S[I] = ' ') do Inc(I); Result := Copy(S, I, Maxint); end; {==============================================================================} function TrimSPRight(const S: string): string; var I: Integer; begin Result := ''; if S = '' then Exit; I := Length(S); while (I > 0) and (S[I] = ' ') do Dec(I); Result := Copy(S, 1, I); end; {==============================================================================} function TrimSP(const S: string): string; begin Result := TrimSPLeft(s); Result := TrimSPRight(Result); end; {==============================================================================} function SeparateLeft(const Value, Delimiter: string): string; var x: Integer; begin x := Pos(Delimiter, Value); if x < 1 then Result := Value else Result := Copy(Value, 1, x - 1); end; {==============================================================================} function SeparateRight(const Value, Delimiter: string): string; var x: Integer; begin x := Pos(Delimiter, Value); if x > 0 then x := x + Length(Delimiter) - 1; Result := Copy(Value, x + 1, Length(Value) - x); end; {==============================================================================} function GetParameter(const Value, Parameter: string): string; var s: string; v: string; begin Result := ''; v := Value; while v <> '' do begin s := Trim(FetchEx(v, ';', '"')); if Pos(Uppercase(parameter), Uppercase(s)) = 1 then begin Delete(s, 1, Length(Parameter)); s := Trim(s); if s = '' then Break; if s[1] = '=' then begin Result := Trim(SeparateRight(s, '=')); Result := UnquoteStr(Result, '"'); break; end; end; end; end; {==============================================================================} procedure ParseParametersEx(Value, Delimiter: string; const Parameters: TStrings); var s: string; begin Parameters.Clear; while Value <> '' do begin s := Trim(FetchEx(Value, Delimiter, '"')); Parameters.Add(s); end; end; {==============================================================================} procedure ParseParameters(Value: string; const Parameters: TStrings); begin ParseParametersEx(Value, ';', Parameters); end; {==============================================================================} function IndexByBegin(Value: string; const List: TStrings): integer; var n: integer; s: string; begin Result := -1; Value := uppercase(Value); for n := 0 to List.Count -1 do begin s := UpperCase(List[n]); if Pos(Value, s) = 1 then begin Result := n; Break; end; end; end; {==============================================================================} function GetEmailAddr(const Value: string): string; var s: string; begin s := SeparateRight(Value, '<'); s := SeparateLeft(s, '>'); Result := Trim(s); end; {==============================================================================} function GetEmailDesc(Value: string): string; var s: string; begin Value := Trim(Value); s := SeparateRight(Value, '"'); if s <> Value then s := SeparateLeft(s, '"') else begin s := SeparateLeft(Value, '<'); if s = Value then begin s := SeparateRight(Value, '('); if s <> Value then s := SeparateLeft(s, ')') else s := ''; end; end; Result := Trim(s); end; {==============================================================================} function StrToHex(const Value: Ansistring): string; var n: Integer; begin Result := ''; for n := 1 to Length(Value) do Result := Result + IntToHex(Byte(Value[n]), 2); Result := LowerCase(Result); end; {==============================================================================} function IntToBin(Value: Integer; Digits: Byte): string; var x, y, n: Integer; begin Result := ''; x := Value; repeat y := x mod 2; x := x div 2; if y > 0 then Result := '1' + Result else Result := '0' + Result; until x = 0; x := Length(Result); for n := x to Digits - 1 do Result := '0' + Result; end; {==============================================================================} function BinToInt(const Value: string): Integer; var n: Integer; begin Result := 0; for n := 1 to Length(Value) do begin if Value[n] = '0' then Result := Result * 2 else if Value[n] = '1' then Result := Result * 2 + 1 else Break; end; end; {==============================================================================} function ParseURL(URL: string; var Prot, User, Pass, Host, Port, Path, Para: string): string; var x, y: Integer; sURL: string; s: string; s1, s2: string; begin Prot := 'http'; User := ''; Pass := ''; Port := '80'; Para := ''; x := Pos('://', URL); if x > 0 then begin Prot := SeparateLeft(URL, '://'); sURL := SeparateRight(URL, '://'); end else sURL := URL; if UpperCase(Prot) = 'HTTPS' then Port := '443'; if UpperCase(Prot) = 'FTP' then Port := '21'; x := Pos('@', sURL); y := Pos('/', sURL); if (x > 0) and ((x < y) or (y < 1))then begin s := SeparateLeft(sURL, '@'); sURL := SeparateRight(sURL, '@'); x := Pos(':', s); if x > 0 then begin User := SeparateLeft(s, ':'); Pass := SeparateRight(s, ':'); end else User := s; end; x := Pos('/', sURL); if x > 0 then begin s1 := SeparateLeft(sURL, '/'); s2 := SeparateRight(sURL, '/'); end else begin s1 := sURL; s2 := ''; end; if Pos('[', s1) = 1 then begin Host := Separateleft(s1, ']'); Delete(Host, 1, 1); s1 := SeparateRight(s1, ']'); if Pos(':', s1) = 1 then Port := SeparateRight(s1, ':'); end else begin x := Pos(':', s1); if x > 0 then begin Host := SeparateLeft(s1, ':'); Port := SeparateRight(s1, ':'); end else Host := s1; end; Result := '/' + s2; x := Pos('?', s2); if x > 0 then begin Path := '/' + SeparateLeft(s2, '?'); Para := SeparateRight(s2, '?'); end else Path := '/' + s2; if Host = '' then Host := 'localhost'; end; {==============================================================================} function ReplaceString(Value, Search, Replace: AnsiString): AnsiString; var x, l, ls, lr: Integer; begin if (Value = '') or (Search = '') then begin Result := Value; Exit; end; ls := Length(Search); lr := Length(Replace); Result := ''; x := Pos(Search, Value); while x > 0 do begin {$IFNDEF CIL} l := Length(Result); SetLength(Result, l + x - 1); Move(Pointer(Value)^, Pointer(@Result[l + 1])^, x - 1); {$ELSE} Result:=Result+Copy(Value,1,x-1); {$ENDIF} {$IFNDEF CIL} l := Length(Result); SetLength(Result, l + lr); Move(Pointer(Replace)^, Pointer(@Result[l + 1])^, lr); {$ELSE} Result:=Result+Replace; {$ENDIF} Delete(Value, 1, x - 1 + ls); x := Pos(Search, Value); end; Result := Result + Value; end; {==============================================================================} function RPosEx(const Sub, Value: string; From: integer): Integer; var n: Integer; l: Integer; begin result := 0; l := Length(Sub); for n := From - l + 1 downto 1 do begin if Copy(Value, n, l) = Sub then begin result := n; break; end; end; end; {==============================================================================} function RPos(const Sub, Value: String): Integer; begin Result := RPosEx(Sub, Value, Length(Value)); end; {==============================================================================} function FetchBin(var Value: string; const Delimiter: string): string; var s: string; begin Result := SeparateLeft(Value, Delimiter); s := SeparateRight(Value, Delimiter); if s = Value then Value := '' else Value := s; end; {==============================================================================} function Fetch(var Value: string; const Delimiter: string): string; begin Result := FetchBin(Value, Delimiter); Result := TrimSP(Result); Value := TrimSP(Value); end; {==============================================================================} function FetchEx(var Value: string; const Delimiter, Quotation: string): string; var b: Boolean; begin Result := ''; b := False; while Length(Value) > 0 do begin if b then begin if Pos(Quotation, Value) = 1 then b := False; Result := Result + Value[1]; Delete(Value, 1, 1); end else begin if Pos(Delimiter, Value) = 1 then begin Delete(Value, 1, Length(delimiter)); break; end; b := Pos(Quotation, Value) = 1; Result := Result + Value[1]; Delete(Value, 1, 1); end; end; end; {==============================================================================} function IsBinaryString(const Value: AnsiString): Boolean; var n: integer; begin Result := False; for n := 1 to Length(Value) do if Value[n] in [#0..#8, #10..#31] then //ignore null-terminated strings if not ((n = Length(value)) and (Value[n] = AnsiChar(#0))) then begin Result := True; Break; end; end; {==============================================================================} function PosCRLF(const Value: AnsiString; var Terminator: AnsiString): integer; var n, l: integer; begin Result := -1; Terminator := ''; l := length(value); for n := 1 to l do if value[n] in [#$0d, #$0a] then begin Result := n; Terminator := Value[n]; if n <> l then case value[n] of #$0d: if value[n + 1] = #$0a then Terminator := #$0d + #$0a; #$0a: if value[n + 1] = #$0d then Terminator := #$0a + #$0d; end; Break; end; end; {==============================================================================} Procedure StringsTrim(const Value: TStrings); var n: integer; begin for n := Value.Count - 1 downto 0 do if Value[n] = '' then Value.Delete(n) else Break; end; {==============================================================================} function PosFrom(const SubStr, Value: String; From: integer): integer; var ls,lv: integer; begin Result := 0; ls := Length(SubStr); lv := Length(Value); if (ls = 0) or (lv = 0) then Exit; if From < 1 then From := 1; while (ls + from - 1) <= (lv) do begin {$IFNDEF CIL} if CompareMem(@SubStr[1],@Value[from],ls) then {$ELSE} if SubStr = copy(Value, from, ls) then {$ENDIF} begin result := from; break; end else inc(from); end; end; {==============================================================================} {$IFNDEF CIL} function IncPoint(const p: pointer; Value: integer): pointer; begin Result := PAnsiChar(p) + Value; end; {$ENDIF} {==============================================================================} //improved by 'DoggyDawg' function GetBetween(const PairBegin, PairEnd, Value: string): string; var n: integer; x: integer; s: string; lenBegin: integer; lenEnd: integer; str: string; max: integer; begin lenBegin := Length(PairBegin); lenEnd := Length(PairEnd); n := Length(Value); if (Value = PairBegin + PairEnd) then begin Result := '';//nothing between exit; end; if (n < lenBegin + lenEnd) then begin Result := Value; exit; end; s := SeparateRight(Value, PairBegin); if (s = Value) then begin Result := Value; exit; end; n := Pos(PairEnd, s); if (n = 0) then begin Result := Value; exit; end; Result := ''; x := 1; max := Length(s) - lenEnd + 1; for n := 1 to max do begin str := copy(s, n, lenEnd); if (str = PairEnd) then begin Dec(x); if (x <= 0) then Break; end; str := copy(s, n, lenBegin); if (str = PairBegin) then Inc(x); Result := Result + s[n]; end; end; {==============================================================================} function CountOfChar(const Value: string; Chr: char): integer; var n: integer; begin Result := 0; for n := 1 to Length(Value) do if Value[n] = chr then Inc(Result); end; {==============================================================================} // ! do not use AnsiExtractQuotedStr, it's very buggy and can crash application! function UnquoteStr(const Value: string; Quote: Char): string; var n: integer; inq, dq: Boolean; c, cn: char; begin Result := ''; if Value = '' then Exit; if Value = Quote + Quote then Exit; inq := False; dq := False; for n := 1 to Length(Value) do begin c := Value[n]; if n <> Length(Value) then cn := Value[n + 1] else cn := #0; if c = quote then if dq then dq := False else if not inq then inq := True else if cn = quote then begin Result := Result + Quote; dq := True; end else inq := False else Result := Result + c; end; end; {==============================================================================} function QuoteStr(const Value: string; Quote: Char): string; var n: integer; begin Result := ''; for n := 1 to length(value) do begin Result := result + Value[n]; if value[n] = Quote then Result := Result + Quote; end; Result := Quote + Result + Quote; end; {==============================================================================} procedure HeadersToList(const Value: TStrings); var n, x, y: integer; s: string; begin for n := 0 to Value.Count -1 do begin s := Value[n]; x := Pos(':', s); if x > 0 then begin y:= Pos('=',s); if not ((y > 0) and (y < x)) then begin s[x] := '='; Value[n] := s; end; end; end; end; {==============================================================================} procedure ListToHeaders(const Value: TStrings); var n, x: integer; s: string; begin for n := 0 to Value.Count -1 do begin s := Value[n]; x := Pos('=', s); if x > 0 then begin s[x] := ':'; Value[n] := s; end; end; end; {==============================================================================} function SwapBytes(Value: integer): integer; var s: AnsiString; x, y, xl, yl: Byte; begin s := CodeLongInt(Value); x := Ord(s[4]); y := Ord(s[3]); xl := Ord(s[2]); yl := Ord(s[1]); Result := ((x * 256 + y) * 65536) + (xl * 256 + yl); end; {==============================================================================} function ReadStrFromStream(const Stream: TStream; len: integer): AnsiString; var x: integer; {$IFDEF CIL} buf: Array of Byte; {$ENDIF} begin {$IFDEF CIL} Setlength(buf, Len); x := Stream.read(buf, Len); SetLength(buf, x); Result := StringOf(Buf); {$ELSE} Setlength(Result, Len); x := Stream.read(PAnsiChar(Result)^, Len); SetLength(Result, x); {$ENDIF} end; {==============================================================================} procedure WriteStrToStream(const Stream: TStream; Value: AnsiString); {$IFDEF CIL} var buf: Array of Byte; {$ENDIF} begin {$IFDEF CIL} buf := BytesOf(Value); Stream.Write(buf,length(Value)); {$ELSE} Stream.Write(PAnsiChar(Value)^, Length(Value)); {$ENDIF} end; {==============================================================================} function GetTempFile(const Dir, prefix: AnsiString): AnsiString; {$IFNDEF FPC} {$IFDEF MSWINDOWS} var Path: AnsiString; x: integer; {$ENDIF} {$ENDIF} begin {$IFDEF FPC} Result := GetTempFileName(Dir, Prefix); {$ELSE} {$IFNDEF MSWINDOWS} Result := tempnam(Pointer(Dir), Pointer(prefix)); {$ELSE} {$IFDEF CIL} Result := System.IO.Path.GetTempFileName; {$ELSE} if Dir = '' then begin SetLength(Path, MAX_PATH); x := GetTempPath(Length(Path), PChar(Path)); SetLength(Path, x); end else Path := Dir; x := Length(Path); if Path[x] <> '\' then Path := Path + '\'; SetLength(Result, MAX_PATH + 1); GetTempFileName(PChar(Path), PChar(Prefix), 0, PChar(Result)); Result := PChar(Result); SetFileattributes(PChar(Result), GetFileAttributes(PChar(Result)) or FILE_ATTRIBUTE_TEMPORARY); {$ENDIF} {$ENDIF} {$ENDIF} end; {==============================================================================} function PadString(const Value: AnsiString; len: integer; Pad: AnsiChar): AnsiString; begin if length(value) >= len then Result := Copy(value, 1, len) else Result := Value + StringOfChar(Pad, len - length(value)); end; {==============================================================================} function XorString(Indata1, Indata2: AnsiString): AnsiString; var i: integer; begin Indata2 := PadString(Indata2, length(Indata1), #0); Result := ''; for i := 1 to length(Indata1) do Result := Result + AnsiChar(ord(Indata1[i]) xor ord(Indata2[i])); end; {==============================================================================} function NormalizeHeader(Value: TStrings; var Index: Integer): string; var s, t: string; n: Integer; begin s := Value[Index]; Inc(Index); if s <> '' then while (Value.Count - 1) > Index do begin t := Value[Index]; if t = '' then Break; for n := 1 to Length(t) do if t[n] = #9 then t[n] := ' '; if not(AnsiChar(t[1]) in [' ', '"', ':', '=']) then Break else begin s := s + ' ' + Trim(t); Inc(Index); end; end; Result := TrimRight(s); end; {==============================================================================} {pf} procedure SearchForLineBreak(var APtr:PANSIChar; AEtx:PANSIChar; out ABol:PANSIChar; out ALength:integer); begin ABol := APtr; while (APtr<AEtx) and not (APtr^ in [#0,#10,#13]) do inc(APtr); ALength := APtr-ABol; end; {/pf} {pf} procedure SkipLineBreak(var APtr:PANSIChar; AEtx:PANSIChar); begin if (APtr<AEtx) and (APtr^=#13) then inc(APtr); if (APtr<AEtx) and (APtr^=#10) then inc(APtr); end; {/pf} {pf} procedure SkipNullLines(var APtr:PANSIChar; AEtx:PANSIChar); var bol: PANSIChar; lng: integer; begin while (APtr<AEtx) do begin SearchForLineBreak(APtr,AEtx,bol,lng); SkipLineBreak(APtr,AEtx); if lng>0 then begin APtr := bol; Break; end; end; end; {/pf} {pf} procedure CopyLinesFromStreamUntilNullLine(var APtr:PANSIChar; AEtx:PANSIChar; ALines:TStrings); var bol: PANSIChar; lng: integer; s: ANSIString; begin // Copying until body separator will be reached while (APtr<AEtx) and (APtr^<>#0) do begin SearchForLineBreak(APtr,AEtx,bol,lng); SkipLineBreak(APtr,AEtx); if lng=0 then Break; SetString(s,bol,lng); ALines.Add(s); end; end; {/pf} {pf} procedure CopyLinesFromStreamUntilBoundary(var APtr:PANSIChar; AEtx:PANSIChar; ALines:TStrings; const ABoundary:ANSIString); var bol: PANSIChar; lng: integer; s: ANSIString; BackStop: ANSIString; eob1: PANSIChar; eob2: PANSIChar; begin BackStop := '--'+ABoundary; eob2 := nil; // Copying until Boundary will be reached while (APtr<AEtx) do begin SearchForLineBreak(APtr,AEtx,bol,lng); SkipLineBreak(APtr,AEtx); eob1 := MatchBoundary(bol,APtr,ABoundary); if Assigned(eob1) then eob2 := MatchLastBoundary(bol,AEtx,ABoundary); if Assigned(eob2) then begin APtr := eob2; Break; end else if Assigned(eob1) then begin APtr := eob1; Break; end else begin SetString(s,bol,lng); ALines.Add(s); end; end; end; {/pf} {pf} function SearchForBoundary(var APtr:PANSIChar; AEtx:PANSIChar; const ABoundary:ANSIString): PANSIChar; var eob: PANSIChar; Step: integer; begin Result := nil; // Moving Aptr position forward until boundary will be reached while (APtr<AEtx) do begin if strlcomp(APtr,#13#10'--',4)=0 then begin eob := MatchBoundary(APtr,AEtx,ABoundary); Step := 4; end else if strlcomp(APtr,'--',2)=0 then begin eob := MatchBoundary(APtr,AEtx,ABoundary); Step := 2; end else begin eob := nil; Step := 1; end; if Assigned(eob) then begin Result := APtr; // boundary beginning APtr := eob; // boundary end exit; end else inc(APtr,Step); end; end; {/pf} {pf} function MatchBoundary(ABol,AEtx:PANSIChar; const ABoundary:ANSIString): PANSIChar; var MatchPos: PANSIChar; Lng: integer; begin Result := nil; MatchPos := ABol; Lng := length(ABoundary); if (MatchPos+2+Lng)>AETX then exit; if strlcomp(MatchPos,#13#10,2)=0 then inc(MatchPos,2); if (MatchPos+2+Lng)>AETX then exit; if strlcomp(MatchPos,'--',2)<>0 then exit; inc(MatchPos,2); if strlcomp(MatchPos,PANSIChar(ABoundary),Lng)<>0 then exit; inc(MatchPos,Lng); if ((MatchPos+2)<=AEtx) and (strlcomp(MatchPos,#13#10,2)=0) then inc(MatchPos,2); Result := MatchPos; end; {/pf} {pf} function MatchLastBoundary(ABOL,AETX:PANSIChar; const ABoundary:ANSIString): PANSIChar; var MatchPos: PANSIChar; begin Result := nil; MatchPos := MatchBoundary(ABOL,AETX,ABoundary); if not Assigned(MatchPos) then exit; if strlcomp(MatchPos,'--',2)<>0 then exit; inc(MatchPos,2); if (MatchPos+2<=AEtx) and (strlcomp(MatchPos,#13#10,2)=0) then inc(MatchPos,2); Result := MatchPos; end; {/pf} {pf} function BuildStringFromBuffer(AStx,AEtx:PANSIChar): ANSIString; var lng: integer; begin Lng := 0; if Assigned(AStx) and Assigned(AEtx) then begin Lng := AEtx-AStx; if Lng<0 then Lng := 0; end; SetString(Result,AStx,lng); end; {/pf} {==============================================================================} var n: integer; begin for n := 1 to 12 do begin CustomMonthNames[n] := ShortMonthNames[n]; MyMonthNames[0, n] := ShortMonthNames[n]; end; end. doublecmd-0.5.8/plugins/wfx/ftp/synapse/blcksock.pas������������������������������������������������0000644�0001750�0001750�00000374032�12014201074�021546� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{==============================================================================| | Project : Ararat Synapse | 009.008.005 | |==============================================================================| | Content: Library base | |==============================================================================| | Copyright (c)1999-2012, Lukas Gebauer | | All rights reserved. | | | | Redistribution and use in source and binary forms, with or without | | modification, are permitted provided that the following conditions are met: | | | | Redistributions of source code must retain the above copyright notice, this | | list of conditions and the following disclaimer. | | | | Redistributions in binary form must reproduce the above copyright notice, | | this list of conditions and the following disclaimer in the documentation | | and/or other materials provided with the distribution. | | | | Neither the name of Lukas Gebauer nor the names of its contributors may | | be used to endorse or promote products derived from this software without | | specific prior written permission. | | | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | | ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR | | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | | DAMAGE. | |==============================================================================| | The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).| | Portions created by Lukas Gebauer are Copyright (c)1999-2012. | | All Rights Reserved. | |==============================================================================| | Contributor(s): | |==============================================================================| | History: see HISTORY.HTM from distribution package | | (Found at URL: http://www.ararat.cz/synapse/) | |==============================================================================} { Special thanks to Gregor Ibic <gregor.ibic@intelicom.si> (Intelicom d.o.o., http://www.intelicom.si) for good inspiration about SSL programming. } {$DEFINE ONCEWINSOCK} {Note about define ONCEWINSOCK: If you remove this compiler directive, then socket interface is loaded and initialized on constructor of TBlockSocket class for each socket separately. Socket interface is used only if your need it. If you leave this directive here, then socket interface is loaded and initialized only once at start of your program! It boost performace on high count of created and destroyed sockets. It eliminate possible small resource leak on Windows systems too. } //{$DEFINE RAISEEXCEPT} {When you enable this define, then is Raiseexcept property is on by default } {:@abstract(Synapse's library core) Core with implementation basic socket classes. } {$IFDEF FPC} {$MODE DELPHI} {$ENDIF} {$IFDEF VER125} {$DEFINE BCB} {$ENDIF} {$IFDEF BCB} {$ObjExportAll On} {$ENDIF} {$Q-} {$H+} {$M+} {$TYPEDADDRESS OFF} //old Delphi does not have MSWINDOWS define. {$IFDEF WIN32} {$IFNDEF MSWINDOWS} {$DEFINE MSWINDOWS} {$ENDIF} {$ENDIF} {$IFDEF UNICODE} {$WARN IMPLICIT_STRING_CAST OFF} {$WARN IMPLICIT_STRING_CAST_LOSS OFF} {$ENDIF} unit blcksock; interface uses SysUtils, Classes, synafpc, synsock, synautil, synacode, synaip {$IFDEF CIL} ,System.Net ,System.Net.Sockets ,System.Text {$ENDIF} ; const SynapseRelease = '38'; cLocalhost = '127.0.0.1'; cAnyHost = '0.0.0.0'; cBroadcast = '255.255.255.255'; c6Localhost = '::1'; c6AnyHost = '::0'; c6Broadcast = 'ffff::1'; cAnyPort = '0'; CR = #$0d; LF = #$0a; CRLF = CR + LF; c64k = 65536; type {:@abstract(Exception clas used by Synapse) When you enable generating of exceptions, this exception is raised by Synapse's units.} ESynapseError = class(Exception) private FErrorCode: Integer; FErrorMessage: string; published {:Code of error. Value depending on used operating system} property ErrorCode: Integer read FErrorCode Write FErrorCode; {:Human readable description of error.} property ErrorMessage: string read FErrorMessage Write FErrorMessage; end; {:Types of OnStatus events} THookSocketReason = ( {:Resolving is begin. Resolved IP and port is in parameter in format like: 'localhost.somewhere.com:25'.} HR_ResolvingBegin, {:Resolving is done. Resolved IP and port is in parameter in format like: 'localhost.somewhere.com:25'. It is always same as in HR_ResolvingBegin!} HR_ResolvingEnd, {:Socket created by CreateSocket method. It reporting Family of created socket too!} HR_SocketCreate, {:Socket closed by CloseSocket method.} HR_SocketClose, {:Socket binded to IP and Port. Binded IP and Port is in parameter in format like: 'localhost.somewhere.com:25'.} HR_Bind, {:Socket connected to IP and Port. Connected IP and Port is in parameter in format like: 'localhost.somewhere.com:25'.} HR_Connect, {:Called when CanRead method is used with @True result.} HR_CanRead, {:Called when CanWrite method is used with @True result.} HR_CanWrite, {:Socket is swithed to Listen mode. (TCP socket only)} HR_Listen, {:Socket Accepting client connection. (TCP socket only)} HR_Accept, {:report count of bytes readed from socket. Number is in parameter string. If you need is in integer, you must use StrToInt function!} HR_ReadCount, {:report count of bytes writed to socket. Number is in parameter string. If you need is in integer, you must use StrToInt function!} HR_WriteCount, {:If is limiting of bandwidth on, then this reason is called when sending or receiving is stopped for satisfy bandwidth limit. Parameter is count of waiting milliseconds.} HR_Wait, {:report situation where communication error occured. When raiseexcept is @true, then exception is called after this Hook reason.} HR_Error ); {:Procedural type for OnStatus event. Sender is calling TBlockSocket object, Reason is one of set Status events and value is optional data.} THookSocketStatus = procedure(Sender: TObject; Reason: THookSocketReason; const Value: String) of object; {:This procedural type is used for DataFilter hooks.} THookDataFilter = procedure(Sender: TObject; var Value: AnsiString) of object; {:This procedural type is used for hook OnCreateSocket. By this hook you can insert your code after initialisation of socket. (you can set special socket options, etc.)} THookCreateSocket = procedure(Sender: TObject) of object; {:This procedural type is used for monitoring of communication.} THookMonitor = procedure(Sender: TObject; Writing: Boolean; const Buffer: TMemory; Len: Integer) of object; {:This procedural type is used for hook OnAfterConnect. By this hook you can insert your code after TCP socket has been sucessfully connected.} THookAfterConnect = procedure(Sender: TObject) of object; {:This procedural type is used for hook OnVerifyCert. By this hook you can insert your additional certificate verification code. Usefull to verify server CN against URL. } THookVerifyCert = function(Sender: TObject):boolean of object; {:This procedural type is used for hook OnHeartbeat. By this hook you can call your code repeately during long socket operations. You must enable heartbeats by @Link(HeartbeatRate) property!} THookHeartbeat = procedure(Sender: TObject) of object; {:Specify family of socket.} TSocketFamily = ( {:Default mode. Socket family is defined by target address for connection. It allows instant access to IPv4 and IPv6 nodes. When you need IPv6 address as destination, then is used IPv6 mode. othervise is used IPv4 mode. However this mode not working properly with preliminary IPv6 supports!} SF_Any, {:Turn this class to pure IPv4 mode. This mode is totally compatible with previous Synapse releases.} SF_IP4, {:Turn to only IPv6 mode.} SF_IP6 ); {:specify possible values of SOCKS modes.} TSocksType = ( ST_Socks5, ST_Socks4 ); {:Specify requested SSL/TLS version for secure connection.} TSSLType = ( LT_all, LT_SSLv2, LT_SSLv3, LT_TLSv1, LT_TLSv1_1, LT_SSHv2 ); {:Specify type of socket delayed option.} TSynaOptionType = ( SOT_Linger, SOT_RecvBuff, SOT_SendBuff, SOT_NonBlock, SOT_RecvTimeout, SOT_SendTimeout, SOT_Reuse, SOT_TTL, SOT_Broadcast, SOT_MulticastTTL, SOT_MulticastLoop ); {:@abstract(this object is used for remember delayed socket option set.)} TSynaOption = class(TObject) public Option: TSynaOptionType; Enabled: Boolean; Value: Integer; end; TCustomSSL = class; TSSLClass = class of TCustomSSL; {:@abstract(Basic IP object.) This is parent class for other class with protocol implementations. Do not use this class directly! Use @link(TICMPBlockSocket), @link(TRAWBlockSocket), @link(TTCPBlockSocket) or @link(TUDPBlockSocket) instead.} TBlockSocket = class(TObject) private FOnStatus: THookSocketStatus; FOnReadFilter: THookDataFilter; FOnCreateSocket: THookCreateSocket; FOnMonitor: THookMonitor; FOnHeartbeat: THookHeartbeat; FLocalSin: TVarSin; FRemoteSin: TVarSin; FTag: integer; FBuffer: AnsiString; FRaiseExcept: Boolean; FNonBlockMode: Boolean; FMaxLineLength: Integer; FMaxSendBandwidth: Integer; FNextSend: LongWord; FMaxRecvBandwidth: Integer; FNextRecv: LongWord; FConvertLineEnd: Boolean; FLastCR: Boolean; FLastLF: Boolean; FBinded: Boolean; FFamily: TSocketFamily; FFamilySave: TSocketFamily; FIP6used: Boolean; FPreferIP4: Boolean; FDelayedOptions: TList; FInterPacketTimeout: Boolean; {$IFNDEF CIL} FFDSet: TFDSet; {$ENDIF} FRecvCounter: Integer; FSendCounter: Integer; FSendMaxChunk: Integer; FStopFlag: Boolean; FNonblockSendTimeout: Integer; FHeartbeatRate: integer; {$IFNDEF ONCEWINSOCK} FWsaDataOnce: TWSADATA; {$ENDIF} function GetSizeRecvBuffer: Integer; procedure SetSizeRecvBuffer(Size: Integer); function GetSizeSendBuffer: Integer; procedure SetSizeSendBuffer(Size: Integer); procedure SetNonBlockMode(Value: Boolean); procedure SetTTL(TTL: integer); function GetTTL:integer; procedure SetFamily(Value: TSocketFamily); virtual; procedure SetSocket(Value: TSocket); virtual; function GetWsaData: TWSAData; function FamilyToAF(f: TSocketFamily): TAddrFamily; protected FSocket: TSocket; FLastError: Integer; FLastErrorDesc: string; FOwner: TObject; procedure SetDelayedOption(const Value: TSynaOption); procedure DelayedOption(const Value: TSynaOption); procedure ProcessDelayedOptions; procedure InternalCreateSocket(Sin: TVarSin); procedure SetSin(var Sin: TVarSin; IP, Port: string); function GetSinIP(Sin: TVarSin): string; function GetSinPort(Sin: TVarSin): Integer; procedure DoStatus(Reason: THookSocketReason; const Value: string); procedure DoReadFilter(Buffer: TMemory; var Len: Integer); procedure DoMonitor(Writing: Boolean; const Buffer: TMemory; Len: Integer); procedure DoCreateSocket; procedure DoHeartbeat; procedure LimitBandwidth(Length: Integer; MaxB: integer; var Next: LongWord); procedure SetBandwidth(Value: Integer); function TestStopFlag: Boolean; procedure InternalSendStream(const Stream: TStream; WithSize, Indy: boolean); virtual; function InternalCanRead(Timeout: Integer): Boolean; virtual; public constructor Create; {:Create object and load all necessary socket library. What library is loaded is described by STUB parameter. If STUB is empty string, then is loaded default libraries.} constructor CreateAlternate(Stub: string); destructor Destroy; override; {:If @link(family) is not SF_Any, then create socket with type defined in @link(Family) property. If family is SF_Any, then do nothing! (socket is created automaticly when you know what type of socket you need to create. (i.e. inside @link(Connect) or @link(Bind) call.) When socket is created, then is aplyed all stored delayed socket options.} procedure CreateSocket; {:It create socket. Address resolving of Value tells what type of socket is created. If Value is resolved as IPv4 IP, then is created IPv4 socket. If value is resolved as IPv6 address, then is created IPv6 socket.} procedure CreateSocketByName(const Value: String); {:Destroy socket in use. This method is also automatically called from object destructor.} procedure CloseSocket; virtual; {:Abort any work on Socket and destroy them.} procedure AbortSocket; virtual; {:Connects socket to local IP address and PORT. IP address may be numeric or symbolic ('192.168.74.50', 'cosi.nekde.cz', 'ff08::1'). The same for PORT - it may be number or mnemonic port ('23', 'telnet'). If port value is '0', system chooses itself and conects unused port in the range 1024 to 4096 (this depending by operating system!). Structure LocalSin is filled after calling this method. Note: If you call this on non-created socket, then socket is created automaticly. Warning: when you call : Bind('0.0.0.0','0'); then is nothing done! In this case is used implicit system bind instead.} procedure Bind(IP, Port: string); {:Connects socket to remote IP address and PORT. The same rules as with @link(BIND) method are valid. The only exception is that PORT with 0 value will not be connected! Structures LocalSin and RemoteSin will be filled with valid values. When you call this on non-created socket, then socket is created automaticly. Type of created socket is by @link(Family) property. If is used SF_IP4, then is created socket for IPv4. If is used SF_IP6, then is created socket for IPv6. When you have family on SF_Any (default!), then type of created socket is determined by address resolving of destination address. (Not work properly on prilimitary winsock IPv6 support!)} procedure Connect(IP, Port: string); virtual; {:Sets socket to receive mode for new incoming connections. It is necessary to use @link(TBlockSocket.BIND) function call before this method to select receiving port!} procedure Listen; virtual; {:Waits until new incoming connection comes. After it comes a new socket is automatically created (socket handler is returned by this function as result).} function Accept: TSocket; virtual; {:Sends data of LENGTH from BUFFER address via connected socket. System automatically splits data to packets.} function SendBuffer(Buffer: Tmemory; Length: Integer): Integer; virtual; {:One data BYTE is sent via connected socket.} procedure SendByte(Data: Byte); virtual; {:Send data string via connected socket. Any terminator is not added! If you need send true string with CR-LF termination, you must add CR-LF characters to sended string! Because any termination is not added automaticly, you can use this function for sending any binary data in binary string.} procedure SendString(Data: AnsiString); virtual; {:Send integer as four bytes to socket.} procedure SendInteger(Data: integer); virtual; {:Send data as one block to socket. Each block begin with 4 bytes with length of data in block. This 4 bytes is added automaticly by this function.} procedure SendBlock(const Data: AnsiString); virtual; {:Send data from stream to socket.} procedure SendStreamRaw(const Stream: TStream); virtual; {:Send content of stream to socket. It using @link(SendBlock) method} procedure SendStream(const Stream: TStream); virtual; {:Send content of stream to socket. It using @link(SendBlock) method and this is compatible with streams in Indy library.} procedure SendStreamIndy(const Stream: TStream); virtual; {:Note: This is low-level receive function. You must be sure if data is waiting for read before call this function for avoid deadlock! Waits until allocated buffer is filled by received data. Returns number of data received, which equals to LENGTH value under normal operation. If it is not equal the communication channel is possibly broken. On stream oriented sockets if is received 0 bytes, it mean 'socket is closed!" On datagram socket is readed first waiting datagram.} function RecvBuffer(Buffer: TMemory; Length: Integer): Integer; virtual; {:Note: This is high-level receive function. It using internal @link(LineBuffer) and you can combine this function freely with other high-level functions! Method waits until data is received. If no data is received within TIMEOUT (in milliseconds) period, @link(LastError) is set to WSAETIMEDOUT. Methods serves for reading any size of data (i.e. one megabyte...). This method is preffered for reading from stream sockets (like TCP).} function RecvBufferEx(Buffer: Tmemory; Len: Integer; Timeout: Integer): Integer; virtual; {:Similar to @link(RecvBufferEx), but readed data is stored in binary string, not in memory buffer.} function RecvBufferStr(Len: Integer; Timeout: Integer): AnsiString; virtual; {:Note: This is high-level receive function. It using internal @link(LineBuffer) and you can combine this function freely with other high-level functions. Waits until one data byte is received which is also returned as function result. If no data is received within TIMEOUT (in milliseconds)period, @link(LastError) is set to WSAETIMEDOUT and result have value 0.} function RecvByte(Timeout: Integer): Byte; virtual; {:Note: This is high-level receive function. It using internal @link(LineBuffer) and you can combine this function freely with other high-level functions. Waits until one four bytes are received and return it as one Ineger Value. If no data is received within TIMEOUT (in milliseconds)period, @link(LastError) is set to WSAETIMEDOUT and result have value 0.} function RecvInteger(Timeout: Integer): Integer; virtual; {:Note: This is high-level receive function. It using internal @link(LineBuffer) and you can combine this function freely with other high-level functions. Method waits until data string is received. This string is terminated by CR-LF characters. The resulting string is returned without this termination (CR-LF)! If @link(ConvertLineEnd) is used, then CR-LF sequence may not be exactly CR-LF. See @link(ConvertLineEnd) description. If no data is received within TIMEOUT (in milliseconds) period, @link(LastError) is set to WSAETIMEDOUT. You may also specify maximum length of reading data by @link(MaxLineLength) property.} function RecvString(Timeout: Integer): AnsiString; virtual; {:Note: This is high-level receive function. It using internal @link(LineBuffer) and you can combine this function freely with other high-level functions. Method waits until data string is received. This string is terminated by Terminator string. The resulting string is returned without this termination. If no data is received within TIMEOUT (in milliseconds) period, @link(LastError) is set to WSAETIMEDOUT. You may also specify maximum length of reading data by @link(MaxLineLength) property.} function RecvTerminated(Timeout: Integer; const Terminator: AnsiString): AnsiString; virtual; {:Note: This is high-level receive function. It using internal @link(LineBuffer) and you can combine this function freely with other high-level functions. Method reads all data waiting for read. If no data is received within TIMEOUT (in milliseconds) period, @link(LastError) is set to WSAETIMEDOUT. Methods serves for reading unknown size of data. Because before call this function you don't know size of received data, returned data is stored in dynamic size binary string. This method is preffered for reading from stream sockets (like TCP). It is very goot for receiving datagrams too! (UDP protocol)} function RecvPacket(Timeout: Integer): AnsiString; virtual; {:Read one block of data from socket. Each block begin with 4 bytes with length of data in block. This function read first 4 bytes for get lenght, then it wait for reported count of bytes.} function RecvBlock(Timeout: Integer): AnsiString; virtual; {:Read all data from socket to stream until socket is closed (or any error occured.)} procedure RecvStreamRaw(const Stream: TStream; Timeout: Integer); virtual; {:Read requested count of bytes from socket to stream.} procedure RecvStreamSize(const Stream: TStream; Timeout: Integer; Size: Integer); {:Receive data to stream. It using @link(RecvBlock) method.} procedure RecvStream(const Stream: TStream; Timeout: Integer); virtual; {:Receive data to stream. This function is compatible with similar function in Indy library. It using @link(RecvBlock) method.} procedure RecvStreamIndy(const Stream: TStream; Timeout: Integer); virtual; {:Same as @link(RecvBuffer), but readed data stays in system input buffer. Warning: this function not respect data in @link(LineBuffer)! Is not recommended to use this function!} function PeekBuffer(Buffer: TMemory; Length: Integer): Integer; virtual; {:Same as @link(RecvByte), but readed data stays in input system buffer. Warning: this function not respect data in @link(LineBuffer)! Is not recommended to use this function!} function PeekByte(Timeout: Integer): Byte; virtual; {:On stream sockets it returns number of received bytes waiting for picking. 0 is returned when there is no such data. On datagram socket it returns length of the first waiting datagram. Returns 0 if no datagram is waiting.} function WaitingData: Integer; virtual; {:Same as @link(WaitingData), but if exists some of data in @link(Linebuffer), return their length instead.} function WaitingDataEx: Integer; {:Clear all waiting data for read from buffers.} procedure Purge; {:Sets linger. Enabled linger means that the system waits another LINGER (in milliseconds) time for delivery of sent data. This function is only for stream type of socket! (TCP)} procedure SetLinger(Enable: Boolean; Linger: Integer); {:Actualize values in @link(LocalSin).} procedure GetSinLocal; {:Actualize values in @link(RemoteSin).} procedure GetSinRemote; {:Actualize values in @link(LocalSin) and @link(RemoteSin).} procedure GetSins; {:Reset @link(LastError) and @link(LastErrorDesc) to non-error state.} procedure ResetLastError; {:If you "manually" call Socket API functions, forward their return code as parameter to this function, which evaluates it, eventually calls GetLastError and found error code returns and stores to @link(LastError).} function SockCheck(SockResult: Integer): Integer; virtual; {:If @link(LastError) contains some error code and @link(RaiseExcept) property is @true, raise adequate exception.} procedure ExceptCheck; {:Returns local computer name as numerical or symbolic value. It try get fully qualified domain name. Name is returned in the format acceptable by functions demanding IP as input parameter.} function LocalName: string; {:Try resolve name to all possible IP address. i.e. If you pass as name result of @link(LocalName) method, you get all IP addresses used by local system.} procedure ResolveNameToIP(Name: string; const IPList: TStrings); {:Try resolve name to primary IP address. i.e. If you pass as name result of @link(LocalName) method, you get primary IP addresses used by local system.} function ResolveName(Name: string): string; {:Try resolve IP to their primary domain name. If IP not have domain name, then is returned original IP.} function ResolveIPToName(IP: string): string; {:Try resolve symbolic port name to port number. (i.e. 'Echo' to 8)} function ResolvePort(Port: string): Word; {:Set information about remote side socket. It is good for seting remote side for sending UDP packet, etc.} procedure SetRemoteSin(IP, Port: string); {:Picks IP socket address from @link(LocalSin).} function GetLocalSinIP: string; virtual; {:Picks IP socket address from @link(RemoteSin).} function GetRemoteSinIP: string; virtual; {:Picks socket PORT number from @link(LocalSin).} function GetLocalSinPort: Integer; virtual; {:Picks socket PORT number from @link(RemoteSin).} function GetRemoteSinPort: Integer; virtual; {:Return @TRUE, if you can read any data from socket or is incoming connection on TCP based socket. Status is tested for time Timeout (in milliseconds). If value in Timeout is 0, status is only tested and continue. If value in Timeout is -1, run is breaked and waiting for read data maybe forever. This function is need only on special cases, when you need use @link(RecvBuffer) function directly! read functioms what have timeout as calling parameter, calling this function internally.} function CanRead(Timeout: Integer): Boolean; virtual; {:Same as @link(CanRead), but additionally return @TRUE if is some data in @link(LineBuffer).} function CanReadEx(Timeout: Integer): Boolean; virtual; {:Return @TRUE, if you can to socket write any data (not full sending buffer). Status is tested for time Timeout (in milliseconds). If value in Timeout is 0, status is only tested and continue. If value in Timeout is -1, run is breaked and waiting for write data maybe forever. This function is need only on special cases!} function CanWrite(Timeout: Integer): Boolean; virtual; {:Same as @link(SendBuffer), but send datagram to address from @link(RemoteSin). Usefull for sending reply to datagram received by function @link(RecvBufferFrom).} function SendBufferTo(Buffer: TMemory; Length: Integer): Integer; virtual; {:Note: This is low-lever receive function. You must be sure if data is waiting for read before call this function for avoid deadlock! Receives first waiting datagram to allocated buffer. If there is no waiting one, then waits until one comes. Returns length of datagram stored in BUFFER. If length exceeds buffer datagram is truncated. After this @link(RemoteSin) structure contains information about sender of UDP packet.} function RecvBufferFrom(Buffer: TMemory; Length: Integer): Integer; virtual; {$IFNDEF CIL} {:This function is for check for incoming data on set of sockets. Whitch sockets is checked is decribed by SocketList Tlist with TBlockSocket objects. TList may have maximal number of objects defined by FD_SETSIZE constant. Return @TRUE, if you can from some socket read any data or is incoming connection on TCP based socket. Status is tested for time Timeout (in milliseconds). If value in Timeout is 0, status is only tested and continue. If value in Timeout is -1, run is breaked and waiting for read data maybe forever. If is returned @TRUE, CanReadList TList is filled by all TBlockSocket objects what waiting for read.} function GroupCanRead(const SocketList: TList; Timeout: Integer; const CanReadList: TList): Boolean; {$ENDIF} {:By this method you may turn address reuse mode for local @link(bind). It is good specially for UDP protocol. Using this with TCP protocol is hazardous!} procedure EnableReuse(Value: Boolean); {:Try set timeout for all sending and receiving operations, if socket provider can do it. (It not supported by all socket providers!)} procedure SetTimeout(Timeout: Integer); {:Try set timeout for all sending operations, if socket provider can do it. (It not supported by all socket providers!)} procedure SetSendTimeout(Timeout: Integer); {:Try set timeout for all receiving operations, if socket provider can do it. (It not supported by all socket providers!)} procedure SetRecvTimeout(Timeout: Integer); {:Return value of socket type.} function GetSocketType: integer; Virtual; {:Return value of protocol type for socket creation.} function GetSocketProtocol: integer; Virtual; {:WSA structure with information about socket provider. On non-windows platforms this structure is simulated!} property WSAData: TWSADATA read GetWsaData; {:FDset structure prepared for usage with this socket.} property FDset: TFDSet read FFDset; {:Structure describing local socket side.} property LocalSin: TVarSin read FLocalSin write FLocalSin; {:Structure describing remote socket side.} property RemoteSin: TVarSin read FRemoteSin write FRemoteSin; {:Socket handler. Suitable for "manual" calls to socket API or manual connection of socket to a previously created socket (i.e by Accept method on TCP socket)} property Socket: TSocket read FSocket write SetSocket; {:Last socket operation error code. Error codes are described in socket documentation. Human readable error description is stored in @link(LastErrorDesc) property.} property LastError: Integer read FLastError; {:Human readable error description of @link(LastError) code.} property LastErrorDesc: string read FLastErrorDesc; {:Buffer used by all high-level receiving functions. This buffer is used for optimized reading of data from socket. In normal cases you not need access to this buffer directly!} property LineBuffer: AnsiString read FBuffer write FBuffer; {:Size of Winsock receive buffer. If it is not supported by socket provider, it return as size one kilobyte.} property SizeRecvBuffer: Integer read GetSizeRecvBuffer write SetSizeRecvBuffer; {:Size of Winsock send buffer. If it is not supported by socket provider, it return as size one kilobyte.} property SizeSendBuffer: Integer read GetSizeSendBuffer write SetSizeSendBuffer; {:If @True, turn class to non-blocking mode. Not all functions are working properly in this mode, you must know exactly what you are doing! However when you have big experience with non-blocking programming, then you can optimise your program by non-block mode!} property NonBlockMode: Boolean read FNonBlockMode Write SetNonBlockMode; {:Set Time-to-live value. (if system supporting it!)} property TTL: Integer read GetTTL Write SetTTL; {:If is @true, then class in in IPv6 mode.} property IP6used: Boolean read FIP6used; {:Return count of received bytes on this socket from begin of current connection.} property RecvCounter: Integer read FRecvCounter; {:Return count of sended bytes on this socket from begin of current connection.} property SendCounter: Integer read FSendCounter; published {:Return descriptive string for given error code. This is class function. You may call it without created object!} class function GetErrorDesc(ErrorCode: Integer): string; {:Return descriptive string for @link(LastError).} function GetErrorDescEx: string; virtual; {:this value is for free use.} property Tag: Integer read FTag write FTag; {:If @true, winsock errors raises exception. Otherwise is setted @link(LastError) value only and you must check it from your program! Default value is @false.} property RaiseExcept: Boolean read FRaiseExcept write FRaiseExcept; {:Define maximum length in bytes of @link(LineBuffer) for high-level receiving functions. If this functions try to read more data then this limit, error is returned! If value is 0 (default), no limitation is used. This is very good protection for stupid attacks to your server by sending lot of data without proper terminator... until all your memory is allocated by LineBuffer! Note: This maximum length is checked only in functions, what read unknown number of bytes! (like @link(RecvString) or @link(RecvTerminated))} property MaxLineLength: Integer read FMaxLineLength Write FMaxLineLength; {:Define maximal bandwidth for all sending operations in bytes per second. If value is 0 (default), bandwidth limitation is not used.} property MaxSendBandwidth: Integer read FMaxSendBandwidth Write FMaxSendBandwidth; {:Define maximal bandwidth for all receiving operations in bytes per second. If value is 0 (default), bandwidth limitation is not used.} property MaxRecvBandwidth: Integer read FMaxRecvBandwidth Write FMaxRecvBandwidth; {:Define maximal bandwidth for all sending and receiving operations in bytes per second. If value is 0 (default), bandwidth limitation is not used.} property MaxBandwidth: Integer Write SetBandwidth; {:Do a conversion of non-standard line terminators to CRLF. (Off by default) If @True, then terminators like sigle CR, single LF or LFCR are converted to CRLF internally. This have effect only in @link(RecvString) method!} property ConvertLineEnd: Boolean read FConvertLineEnd Write FConvertLineEnd; {:Specified Family of this socket. When you are using Windows preliminary support for IPv6, then I recommend to set this property!} property Family: TSocketFamily read FFamily Write SetFamily; {:When resolving of domain name return both IPv4 and IPv6 addresses, then specify if is used IPv4 (dafault - @true) or IPv6.} property PreferIP4: Boolean read FPreferIP4 Write FPreferIP4; {:By default (@true) is all timeouts used as timeout between two packets in reading operations. If you set this to @false, then Timeouts is for overall reading operation!} property InterPacketTimeout: Boolean read FInterPacketTimeout Write FInterPacketTimeout; {:All sended datas was splitted by this value.} property SendMaxChunk: Integer read FSendMaxChunk Write FSendMaxChunk; {:By setting this property to @true you can stop any communication. You can use this property for soft abort of communication.} property StopFlag: Boolean read FStopFlag Write FStopFlag; {:Timeout for data sending by non-blocking socket mode.} property NonblockSendTimeout: Integer read FNonblockSendTimeout Write FNonblockSendTimeout; {:This event is called by various reasons. It is good for monitoring socket, create gauges for data transfers, etc.} property OnStatus: THookSocketStatus read FOnStatus write FOnStatus; {:this event is good for some internal thinks about filtering readed datas. It is used by telnet client by example.} property OnReadFilter: THookDataFilter read FOnReadFilter write FOnReadFilter; {:This event is called after real socket creation for setting special socket options, because you not know when socket is created. (it is depended on Ipv4, IPv6 or automatic mode)} property OnCreateSocket: THookCreateSocket read FOnCreateSocket write FOnCreateSocket; {:This event is good for monitoring content of readed or writed datas.} property OnMonitor: THookMonitor read FOnMonitor write FOnMonitor; {:This event is good for calling your code during long socket operations. (Example, for refresing UI if class in not called within the thread.) Rate of heartbeats can be modified by @link(HeartbeatRate) property.} property OnHeartbeat: THookHeartbeat read FOnHeartbeat write FOnHeartbeat; {:Specify typical rate of @link(OnHeartbeat) event and @link(StopFlag) testing. Default value 0 disabling heartbeats! Value is in milliseconds. Real rate can be higher or smaller then this value, because it depending on real socket operations too! Note: Each heartbeat slowing socket processing.} property HeartbeatRate: integer read FHeartbeatRate Write FHeartbeatRate; {:What class own this socket? Used by protocol implementation classes.} property Owner: TObject read FOwner Write FOwner; end; {:@abstract(Support for SOCKS4 and SOCKS5 proxy) Layer with definition all necessary properties and functions for implementation SOCKS proxy client. Do not use this class directly.} TSocksBlockSocket = class(TBlockSocket) protected FSocksIP: string; FSocksPort: string; FSocksTimeout: integer; FSocksUsername: string; FSocksPassword: string; FUsingSocks: Boolean; FSocksResolver: Boolean; FSocksLastError: integer; FSocksResponseIP: string; FSocksResponsePort: string; FSocksLocalIP: string; FSocksLocalPort: string; FSocksRemoteIP: string; FSocksRemotePort: string; FBypassFlag: Boolean; FSocksType: TSocksType; function SocksCode(IP, Port: string): Ansistring; function SocksDecode(Value: Ansistring): integer; public constructor Create; {:Open connection to SOCKS proxy and if @link(SocksUsername) is set, do authorisation to proxy. This is needed only in special cases! (it is called internally!)} function SocksOpen: Boolean; {:Send specified request to SOCKS proxy. This is needed only in special cases! (it is called internally!)} function SocksRequest(Cmd: Byte; const IP, Port: string): Boolean; {:Receive response to previosly sended request. This is needed only in special cases! (it is called internally!)} function SocksResponse: Boolean; {:Is @True when class is using SOCKS proxy.} property UsingSocks: Boolean read FUsingSocks; {:If SOCKS proxy failed, here is error code returned from SOCKS proxy.} property SocksLastError: integer read FSocksLastError; published {:Address of SOCKS server. If value is empty string, SOCKS support is disabled. Assingning any value to this property enable SOCKS mode. Warning: You cannot combine this mode with HTTP-tunneling mode!} property SocksIP: string read FSocksIP write FSocksIP; {:Port of SOCKS server. Default value is '1080'.} property SocksPort: string read FSocksPort write FSocksPort; {:If you need authorisation on SOCKS server, set username here.} property SocksUsername: string read FSocksUsername write FSocksUsername; {:If you need authorisation on SOCKS server, set password here.} property SocksPassword: string read FSocksPassword write FSocksPassword; {:Specify timeout for communicatin with SOCKS server. Default is one minute.} property SocksTimeout: integer read FSocksTimeout write FSocksTimeout; {:If @True, all symbolic names of target hosts is not translated to IP's locally, but resolving is by SOCKS proxy. Default is @True.} property SocksResolver: Boolean read FSocksResolver write FSocksResolver; {:Specify SOCKS type. By default is used SOCKS5, but you can use SOCKS4 too. When you select SOCKS4, then if @link(SOCKSResolver) is enabled, then is used SOCKS4a. Othervise is used pure SOCKS4.} property SocksType: TSocksType read FSocksType write FSocksType; end; {:@abstract(Implementation of TCP socket.) Supported features: IPv4, IPv6, SSL/TLS or SSH (depending on used plugin), SOCKS5 proxy (outgoing connections and limited incomming), SOCKS4/4a proxy (outgoing connections and limited incomming), TCP through HTTP proxy tunnel.} TTCPBlockSocket = class(TSocksBlockSocket) protected FOnAfterConnect: THookAfterConnect; FSSL: TCustomSSL; FHTTPTunnelIP: string; FHTTPTunnelPort: string; FHTTPTunnel: Boolean; FHTTPTunnelRemoteIP: string; FHTTPTunnelRemotePort: string; FHTTPTunnelUser: string; FHTTPTunnelPass: string; FHTTPTunnelTimeout: integer; procedure SocksDoConnect(IP, Port: string); procedure HTTPTunnelDoConnect(IP, Port: string); procedure DoAfterConnect; public {:Create TCP socket class with default plugin for SSL/TSL/SSH implementation (see @link(SSLImplementation))} constructor Create; {:Create TCP socket class with desired plugin for SSL/TSL/SSH implementation} constructor CreateWithSSL(SSLPlugin: TSSLClass); destructor Destroy; override; {:See @link(TBlockSocket.CloseSocket)} procedure CloseSocket; override; {:See @link(TBlockSocket.WaitingData)} function WaitingData: Integer; override; {:Sets socket to receive mode for new incoming connections. It is necessary to use @link(TBlockSocket.BIND) function call before this method to select receiving port! If you use SOCKS, activate incoming TCP connection by this proxy. (By BIND method of SOCKS.)} procedure Listen; override; {:Waits until new incoming connection comes. After it comes a new socket is automatically created (socket handler is returned by this function as result). If you use SOCKS, new socket is not created! In this case is used same socket as socket for listening! So, you can accept only one connection in SOCKS mode.} function Accept: TSocket; override; {:Connects socket to remote IP address and PORT. The same rules as with @link(TBlockSocket.BIND) method are valid. The only exception is that PORT with 0 value will not be connected. After call to this method a communication channel between local and remote socket is created. Local socket is assigned automatically if not controlled by previous call to @link(TBlockSocket.BIND) method. Structures @link(TBlockSocket.LocalSin) and @link(TBlockSocket.RemoteSin) will be filled with valid values. If you use SOCKS, activate outgoing TCP connection by SOCKS proxy specified in @link(TSocksBlockSocket.SocksIP). (By CONNECT method of SOCKS.) If you use HTTP-tunnel mode, activate outgoing TCP connection by HTTP tunnel specified in @link(HTTPTunnelIP). (By CONNECT method of HTTP protocol.) Note: If you call this on non-created socket, then socket is created automaticly.} procedure Connect(IP, Port: string); override; {:If you need upgrade existing TCP connection to SSL/TLS (or SSH2, if plugin allows it) mode, then call this method. This method switch this class to SSL mode and do SSL/TSL handshake.} procedure SSLDoConnect; {:By this method you can downgrade existing SSL/TLS connection to normal TCP connection.} procedure SSLDoShutdown; {:If you need use this component as SSL/TLS TCP server, then after accepting of inbound connection you need start SSL/TLS session by this method. Before call this function, you must have assigned all neeeded certificates and keys!} function SSLAcceptConnection: Boolean; {:See @link(TBlockSocket.GetLocalSinIP)} function GetLocalSinIP: string; override; {:See @link(TBlockSocket.GetRemoteSinIP)} function GetRemoteSinIP: string; override; {:See @link(TBlockSocket.GetLocalSinPort)} function GetLocalSinPort: Integer; override; {:See @link(TBlockSocket.GetRemoteSinPort)} function GetRemoteSinPort: Integer; override; {:See @link(TBlockSocket.SendBuffer)} function SendBuffer(Buffer: TMemory; Length: Integer): Integer; override; {:See @link(TBlockSocket.RecvBuffer)} function RecvBuffer(Buffer: TMemory; Len: Integer): Integer; override; {:Return value of socket type. For TCP return SOCK_STREAM.} function GetSocketType: integer; override; {:Return value of protocol type for socket creation. For TCP return IPPROTO_TCP.} function GetSocketProtocol: integer; override; {:Class implementing SSL/TLS support. It is allways some descendant of @link(TCustomSSL) class. When programmer not select some SSL plugin class, then is used @link(TSSLNone)} property SSL: TCustomSSL read FSSL; {:@True if is used HTTP tunnel mode.} property HTTPTunnel: Boolean read FHTTPTunnel; published {:Return descriptive string for @link(LastError). On case of error in SSL/TLS subsystem, it returns right error description.} function GetErrorDescEx: string; override; {:Specify IP address of HTTP proxy. Assingning non-empty value to this property enable HTTP-tunnel mode. This mode is for tunnelling any outgoing TCP connection through HTTP proxy server. (If policy on HTTP proxy server allow this!) Warning: You cannot combine this mode with SOCK5 mode!} property HTTPTunnelIP: string read FHTTPTunnelIP Write FHTTPTunnelIP; {:Specify port of HTTP proxy for HTTP-tunneling.} property HTTPTunnelPort: string read FHTTPTunnelPort Write FHTTPTunnelPort; {:Specify authorisation username for access to HTTP proxy in HTTP-tunnel mode. If you not need authorisation, then let this property empty.} property HTTPTunnelUser: string read FHTTPTunnelUser Write FHTTPTunnelUser; {:Specify authorisation password for access to HTTP proxy in HTTP-tunnel mode.} property HTTPTunnelPass: string read FHTTPTunnelPass Write FHTTPTunnelPass; {:Specify timeout for communication with HTTP proxy in HTTPtunnel mode.} property HTTPTunnelTimeout: integer read FHTTPTunnelTimeout Write FHTTPTunnelTimeout; {:This event is called after sucessful TCP socket connection.} property OnAfterConnect: THookAfterConnect read FOnAfterConnect write FOnAfterConnect; end; {:@abstract(Datagram based communication) This class implementing datagram based communication instead default stream based communication style.} TDgramBlockSocket = class(TSocksBlockSocket) public {:Fill @link(TBlockSocket.RemoteSin) structure. This address is used for sending data.} procedure Connect(IP, Port: string); override; {:Silently redirected to @link(TBlockSocket.SendBufferTo).} function SendBuffer(Buffer: TMemory; Length: Integer): Integer; override; {:Silently redirected to @link(TBlockSocket.RecvBufferFrom).} function RecvBuffer(Buffer: TMemory; Length: Integer): Integer; override; end; {:@abstract(Implementation of UDP socket.) NOTE: in this class is all receiving redirected to RecvBufferFrom. You can use for reading any receive function. Preffered is RecvPacket! Similary all sending is redirected to SendbufferTo. You can use for sending UDP packet any sending function, like SendString. Supported features: IPv4, IPv6, unicasts, broadcasts, multicasts, SOCKS5 proxy (only unicasts! Outgoing and incomming.)} TUDPBlockSocket = class(TDgramBlockSocket) protected FSocksControlSock: TTCPBlockSocket; function UdpAssociation: Boolean; procedure SetMulticastTTL(TTL: integer); function GetMulticastTTL:integer; public destructor Destroy; override; {:Enable or disable sending of broadcasts. If seting OK, result is @true. This method is not supported in SOCKS5 mode! IPv6 does not support broadcasts! In this case you must use Multicasts instead.} procedure EnableBroadcast(Value: Boolean); {:See @link(TBlockSocket.SendBufferTo)} function SendBufferTo(Buffer: TMemory; Length: Integer): Integer; override; {:See @link(TBlockSocket.RecvBufferFrom)} function RecvBufferFrom(Buffer: TMemory; Length: Integer): Integer; override; {$IFNDEF CIL} {:Add this socket to given multicast group. You cannot use Multicasts in SOCKS mode!} procedure AddMulticast(MCastIP:string); {:Remove this socket from given multicast group.} procedure DropMulticast(MCastIP:string); {$ENDIF} {:All sended multicast datagrams is loopbacked to your interface too. (you can read your sended datas.) You can disable this feature by this function. This function not working on some Windows systems!} procedure EnableMulticastLoop(Value: Boolean); {:Return value of socket type. For UDP return SOCK_DGRAM.} function GetSocketType: integer; override; {:Return value of protocol type for socket creation. For UDP return IPPROTO_UDP.} function GetSocketProtocol: integer; override; {:Set Time-to-live value for multicasts packets. It define number of routers for transfer of datas. If you set this to 1 (dafault system value), then multicasts packet goes only to you local network. If you need transport multicast packet to worldwide, then increase this value, but be carefull, lot of routers on internet does not transport multicasts packets!} property MulticastTTL: Integer read GetMulticastTTL Write SetMulticastTTL; end; {:@abstract(Implementation of RAW ICMP socket.) For this object you must have rights for creating RAW sockets!} TICMPBlockSocket = class(TDgramBlockSocket) public {:Return value of socket type. For RAW and ICMP return SOCK_RAW.} function GetSocketType: integer; override; {:Return value of protocol type for socket creation. For ICMP returns IPPROTO_ICMP or IPPROTO_ICMPV6} function GetSocketProtocol: integer; override; end; {:@abstract(Implementation of RAW socket.) For this object you must have rights for creating RAW sockets!} TRAWBlockSocket = class(TBlockSocket) public {:Return value of socket type. For RAW and ICMP return SOCK_RAW.} function GetSocketType: integer; override; {:Return value of protocol type for socket creation. For RAW returns IPPROTO_RAW.} function GetSocketProtocol: integer; override; end; {:@abstract(Implementation of PGM-message socket.) Not all systems supports this protocol!} TPGMMessageBlockSocket = class(TBlockSocket) public {:Return value of socket type. For PGM-message return SOCK_RDM.} function GetSocketType: integer; override; {:Return value of protocol type for socket creation. For PGM-message returns IPPROTO_RM.} function GetSocketProtocol: integer; override; end; {:@abstract(Implementation of PGM-stream socket.) Not all systems supports this protocol!} TPGMStreamBlockSocket = class(TBlockSocket) public {:Return value of socket type. For PGM-stream return SOCK_STREAM.} function GetSocketType: integer; override; {:Return value of protocol type for socket creation. For PGM-stream returns IPPROTO_RM.} function GetSocketProtocol: integer; override; end; {:@abstract(Parent class for all SSL plugins.) This is abstract class defining interface for other SSL plugins. Instance of this class will be created for each @link(TTCPBlockSocket). Warning: not all methods and propertis can work in all existing SSL plugins! Please, read documentation of used SSL plugin.} TCustomSSL = class(TObject) private protected FOnVerifyCert: THookVerifyCert; FSocket: TTCPBlockSocket; FSSLEnabled: Boolean; FLastError: integer; FLastErrorDesc: string; FSSLType: TSSLType; FKeyPassword: string; FCiphers: string; FCertificateFile: string; FPrivateKeyFile: string; FCertificate: Ansistring; FPrivateKey: Ansistring; FPFX: Ansistring; FPFXfile: string; FCertCA: Ansistring; FCertCAFile: string; FTrustCertificate: Ansistring; FTrustCertificateFile: string; FVerifyCert: Boolean; FUsername: string; FPassword: string; FSSHChannelType: string; FSSHChannelArg1: string; FSSHChannelArg2: string; FCertComplianceLevel: integer; FSNIHost: string; procedure ReturnError; procedure SetCertCAFile(const Value: string); virtual; function DoVerifyCert:boolean; function CreateSelfSignedCert(Host: string): Boolean; virtual; public {: Create plugin class. it is called internally from @link(TTCPBlockSocket)} constructor Create(const Value: TTCPBlockSocket); virtual; {: Assign settings (certificates and configuration) from another SSL plugin class.} procedure Assign(const Value: TCustomSSL); virtual; {: return description of used plugin. It usually return name and version of used SSL library.} function LibVersion: String; virtual; {: return name of used plugin.} function LibName: String; virtual; {: Do not call this directly. It is used internally by @link(TTCPBlockSocket)! Here is needed code for start SSL connection.} function Connect: boolean; virtual; {: Do not call this directly. It is used internally by @link(TTCPBlockSocket)! Here is needed code for acept new SSL connection.} function Accept: boolean; virtual; {: Do not call this directly. It is used internally by @link(TTCPBlockSocket)! Here is needed code for hard shutdown of SSL connection. (for example, before socket is closed)} function Shutdown: boolean; virtual; {: Do not call this directly. It is used internally by @link(TTCPBlockSocket)! Here is needed code for soft shutdown of SSL connection. (for example, when you need to continue with unprotected connection.)} function BiShutdown: boolean; virtual; {: Do not call this directly. It is used internally by @link(TTCPBlockSocket)! Here is needed code for sending some datas by SSL connection.} function SendBuffer(Buffer: TMemory; Len: Integer): Integer; virtual; {: Do not call this directly. It is used internally by @link(TTCPBlockSocket)! Here is needed code for receiving some datas by SSL connection.} function RecvBuffer(Buffer: TMemory; Len: Integer): Integer; virtual; {: Do not call this directly. It is used internally by @link(TTCPBlockSocket)! Here is needed code for getting count of datas what waiting for read. If SSL plugin not allows this, then it should return 0.} function WaitingData: Integer; virtual; {:Return string with identificator of SSL/TLS version of existing connection.} function GetSSLVersion: string; virtual; {:Return subject of remote SSL peer.} function GetPeerSubject: string; virtual; {:Return Serial number if remote X509 certificate.} function GetPeerSerialNo: integer; virtual; {:Return issuer certificate of remote SSL peer.} function GetPeerIssuer: string; virtual; {:Return peer name from remote side certificate. This is good for verify, if certificate is generated for remote side IP name.} function GetPeerName: string; virtual; {:Returns has of peer name from remote side certificate. This is good for fast remote side authentication.} function GetPeerNameHash: cardinal; virtual; {:Return fingerprint of remote SSL peer.} function GetPeerFingerprint: string; virtual; {:Return all detailed information about certificate from remote side of SSL/TLS connection. Result string can be multilined! Each plugin can return this informations in different format!} function GetCertInfo: string; virtual; {:Return currently used Cipher.} function GetCipherName: string; virtual; {:Return currently used number of bits in current Cipher algorythm.} function GetCipherBits: integer; virtual; {:Return number of bits in current Cipher algorythm.} function GetCipherAlgBits: integer; virtual; {:Return result value of verify remote side certificate. Look to OpenSSL documentation for possible values. For example 0 is successfuly verified certificate, or 18 is self-signed certificate.} function GetVerifyCert: integer; virtual; {: Resurn @true if SSL mode is enabled on existing cvonnection.} property SSLEnabled: Boolean read FSSLEnabled; {:Return error code of last SSL operation. 0 is OK.} property LastError: integer read FLastError; {:Return error description of last SSL operation.} property LastErrorDesc: string read FLastErrorDesc; published {:Here you can specify requested SSL/TLS mode. Default is autodetection, but on some servers autodetection not working properly. In this case you must specify requested SSL/TLS mode by your hand!} property SSLType: TSSLType read FSSLType write FSSLType; {:Password for decrypting of encoded certificate or key.} property KeyPassword: string read FKeyPassword write FKeyPassword; {:Username for possible credentials.} property Username: string read FUsername write FUsername; {:password for possible credentials.} property Password: string read FPassword write FPassword; {:By this property you can modify default set of SSL/TLS ciphers.} property Ciphers: string read FCiphers write FCiphers; {:Used for loading certificate from disk file. See to plugin documentation if this method is supported and how!} property CertificateFile: string read FCertificateFile write FCertificateFile; {:Used for loading private key from disk file. See to plugin documentation if this method is supported and how!} property PrivateKeyFile: string read FPrivateKeyFile write FPrivateKeyFile; {:Used for loading certificate from binary string. See to plugin documentation if this method is supported and how!} property Certificate: Ansistring read FCertificate write FCertificate; {:Used for loading private key from binary string. See to plugin documentation if this method is supported and how!} property PrivateKey: Ansistring read FPrivateKey write FPrivateKey; {:Used for loading PFX from binary string. See to plugin documentation if this method is supported and how!} property PFX: Ansistring read FPFX write FPFX; {:Used for loading PFX from disk file. See to plugin documentation if this method is supported and how!} property PFXfile: string read FPFXfile write FPFXfile; {:Used for loading trusted certificates from disk file. See to plugin documentation if this method is supported and how!} property TrustCertificateFile: string read FTrustCertificateFile write FTrustCertificateFile; {:Used for loading trusted certificates from binary string. See to plugin documentation if this method is supported and how!} property TrustCertificate: Ansistring read FTrustCertificate write FTrustCertificate; {:Used for loading CA certificates from binary string. See to plugin documentation if this method is supported and how!} property CertCA: Ansistring read FCertCA write FCertCA; {:Used for loading CA certificates from disk file. See to plugin documentation if this method is supported and how!} property CertCAFile: string read FCertCAFile write SetCertCAFile; {:If @true, then is verified client certificate. (it is good for writing SSL/TLS servers.) When you are not server, but you are client, then if this property is @true, verify servers certificate.} property VerifyCert: Boolean read FVerifyCert write FVerifyCert; {:channel type for possible SSH connections} property SSHChannelType: string read FSSHChannelType write FSSHChannelType; {:First argument of channel type for possible SSH connections} property SSHChannelArg1: string read FSSHChannelArg1 write FSSHChannelArg1; {:Second argument of channel type for possible SSH connections} property SSHChannelArg2: string read FSSHChannelArg2 write FSSHChannelArg2; {: Level of standards compliance level (CryptLib: values in cryptlib.pas, -1: use default value ) } property CertComplianceLevel:integer read FCertComplianceLevel write FCertComplianceLevel; {:This event is called when verifying the server certificate immediatally after a successfull verification in the ssl library.} property OnVerifyCert: THookVerifyCert read FOnVerifyCert write FOnVerifyCert; {: Server Name Identification. Host name to send to server. If empty the host name found in URL will be used, which should be the normal use (http Header Host = SNI Host). The value is cleared after the connection is established. (SNI support requires OpenSSL 0.9.8k or later. Cryptlib not supported, yet ) } property SNIHost:string read FSNIHost write FSNIHost; end; {:@abstract(Default SSL plugin with no SSL support.) Dummy SSL plugin implementation for applications without SSL/TLS support.} TSSLNone = class (TCustomSSL) public {:See @inherited} function LibVersion: String; override; {:See @inherited} function LibName: String; override; end; {:@abstract(Record with definition of IP packet header.) For reading data from ICMP or RAW sockets.} TIPHeader = record VerLen: Byte; TOS: Byte; TotalLen: Word; Identifer: Word; FragOffsets: Word; TTL: Byte; Protocol: Byte; CheckSum: Word; SourceIp: LongWord; DestIp: LongWord; Options: LongWord; end; {:@abstract(Parent class of application protocol implementations.) By this class is defined common properties.} TSynaClient = Class(TObject) protected FTargetHost: string; FTargetPort: string; FIPInterface: string; FTimeout: integer; FUserName: string; FPassword: string; public constructor Create; published {:Specify terget server IP (or symbolic name). Default is 'localhost'.} property TargetHost: string read FTargetHost Write FTargetHost; {:Specify terget server port (or symbolic name).} property TargetPort: string read FTargetPort Write FTargetPort; {:Defined local socket address. (outgoing IP address). By default is used '0.0.0.0' as wildcard for default IP.} property IPInterface: string read FIPInterface Write FIPInterface; {:Specify default timeout for socket operations.} property Timeout: integer read FTimeout Write FTimeout; {:If protocol need user authorization, then fill here username.} property UserName: string read FUserName Write FUserName; {:If protocol need user authorization, then fill here password.} property Password: string read FPassword Write FPassword; end; var {:Selected SSL plugin. Default is @link(TSSLNone). Do not change this value directly!!! Just add your plugin unit to your project uses instead. Each plugin unit have initialization code what modify this variable.} SSLImplementation: TSSLClass = TSSLNone; implementation {$IFDEF ONCEWINSOCK} var WsaDataOnce: TWSADATA; e: ESynapseError; {$ENDIF} constructor TBlockSocket.Create; begin CreateAlternate(''); end; constructor TBlockSocket.CreateAlternate(Stub: string); {$IFNDEF ONCEWINSOCK} var e: ESynapseError; {$ENDIF} begin inherited Create; FDelayedOptions := TList.Create; FRaiseExcept := False; {$IFDEF RAISEEXCEPT} FRaiseExcept := True; {$ENDIF} FSocket := INVALID_SOCKET; FBuffer := ''; FLastCR := False; FLastLF := False; FBinded := False; FNonBlockMode := False; FMaxLineLength := 0; FMaxSendBandwidth := 0; FNextSend := 0; FMaxRecvBandwidth := 0; FNextRecv := 0; FConvertLineEnd := False; FFamily := SF_Any; FFamilySave := SF_Any; FIP6used := False; FPreferIP4 := True; FInterPacketTimeout := True; FRecvCounter := 0; FSendCounter := 0; FSendMaxChunk := c64k; FStopFlag := False; FNonblockSendTimeout := 15000; FHeartbeatRate := 0; FOwner := nil; {$IFNDEF ONCEWINSOCK} if Stub = '' then Stub := DLLStackName; if not InitSocketInterface(Stub) then begin e := ESynapseError.Create('Error loading Socket interface (' + Stub + ')!'); e.ErrorCode := 0; e.ErrorMessage := 'Error loading Socket interface (' + Stub + ')!'; raise e; end; SockCheck(synsock.WSAStartup(WinsockLevel, FWsaDataOnce)); ExceptCheck; {$ENDIF} end; destructor TBlockSocket.Destroy; var n: integer; p: TSynaOption; begin CloseSocket; {$IFNDEF ONCEWINSOCK} synsock.WSACleanup; DestroySocketInterface; {$ENDIF} for n := FDelayedOptions.Count - 1 downto 0 do begin p := TSynaOption(FDelayedOptions[n]); p.Free; end; FDelayedOptions.Free; inherited Destroy; end; function TBlockSocket.FamilyToAF(f: TSocketFamily): TAddrFamily; begin case f of SF_ip4: Result := AF_INET; SF_ip6: Result := AF_INET6; else Result := AF_UNSPEC; end; end; procedure TBlockSocket.SetDelayedOption(const Value: TSynaOption); var li: TLinger; x: integer; buf: TMemory; {$IFNDEF MSWINDOWS} timeval: TTimeval; {$ENDIF} begin case value.Option of SOT_Linger: begin {$IFDEF CIL} li := TLinger.Create(Value.Enabled, Value.Value div 1000); synsock.SetSockOptObj(FSocket, integer(SOL_SOCKET), integer(SO_LINGER), li); {$ELSE} li.l_onoff := Ord(Value.Enabled); li.l_linger := Value.Value div 1000; buf := @li; synsock.SetSockOpt(FSocket, integer(SOL_SOCKET), integer(SO_LINGER), buf, SizeOf(li)); {$ENDIF} end; SOT_RecvBuff: begin {$IFDEF CIL} buf := System.BitConverter.GetBytes(value.Value); {$ELSE} buf := @Value.Value; {$ENDIF} synsock.SetSockOpt(FSocket, integer(SOL_SOCKET), integer(SO_RCVBUF), buf, SizeOf(Value.Value)); end; SOT_SendBuff: begin {$IFDEF CIL} buf := System.BitConverter.GetBytes(value.Value); {$ELSE} buf := @Value.Value; {$ENDIF} synsock.SetSockOpt(FSocket, integer(SOL_SOCKET), integer(SO_SNDBUF), buf, SizeOf(Value.Value)); end; SOT_NonBlock: begin FNonBlockMode := Value.Enabled; x := Ord(FNonBlockMode); synsock.IoctlSocket(FSocket, FIONBIO, x); end; SOT_RecvTimeout: begin {$IFDEF CIL} buf := System.BitConverter.GetBytes(value.Value); synsock.SetSockOpt(FSocket, integer(SOL_SOCKET), integer(SO_RCVTIMEO), buf, SizeOf(Value.Value)); {$ELSE} {$IFDEF MSWINDOWS} buf := @Value.Value; synsock.SetSockOpt(FSocket, integer(SOL_SOCKET), integer(SO_RCVTIMEO), buf, SizeOf(Value.Value)); {$ELSE} timeval.tv_sec:=Value.Value div 1000; timeval.tv_usec:=(Value.Value mod 1000) * 1000; synsock.SetSockOpt(FSocket, integer(SOL_SOCKET), integer(SO_RCVTIMEO), @timeval, SizeOf(timeval)); {$ENDIF} {$ENDIF} end; SOT_SendTimeout: begin {$IFDEF CIL} buf := System.BitConverter.GetBytes(value.Value); {$ELSE} {$IFDEF MSWINDOWS} buf := @Value.Value; synsock.SetSockOpt(FSocket, integer(SOL_SOCKET), integer(SO_SNDTIMEO), buf, SizeOf(Value.Value)); {$ELSE} timeval.tv_sec:=Value.Value div 1000; timeval.tv_usec:=(Value.Value mod 1000) * 1000; synsock.SetSockOpt(FSocket, integer(SOL_SOCKET), integer(SO_SNDTIMEO), @timeval, SizeOf(timeval)); {$ENDIF} {$ENDIF} end; SOT_Reuse: begin x := Ord(Value.Enabled); {$IFDEF CIL} buf := System.BitConverter.GetBytes(x); {$ELSE} buf := @x; {$ENDIF} synsock.SetSockOpt(FSocket, integer(SOL_SOCKET), integer(SO_REUSEADDR), buf, SizeOf(x)); end; SOT_TTL: begin {$IFDEF CIL} buf := System.BitConverter.GetBytes(value.Value); {$ELSE} buf := @Value.Value; {$ENDIF} if FIP6Used then synsock.SetSockOpt(FSocket, integer(IPPROTO_IPV6), integer(IPV6_UNICAST_HOPS), buf, SizeOf(Value.Value)) else synsock.SetSockOpt(FSocket, integer(IPPROTO_IP), integer(IP_TTL), buf, SizeOf(Value.Value)); end; SOT_Broadcast: begin //#todo1 broadcasty na IP6 x := Ord(Value.Enabled); {$IFDEF CIL} buf := System.BitConverter.GetBytes(x); {$ELSE} buf := @x; {$ENDIF} synsock.SetSockOpt(FSocket, integer(SOL_SOCKET), integer(SO_BROADCAST), buf, SizeOf(x)); end; SOT_MulticastTTL: begin {$IFDEF CIL} buf := System.BitConverter.GetBytes(value.Value); {$ELSE} buf := @Value.Value; {$ENDIF} if FIP6Used then synsock.SetSockOpt(FSocket, integer(IPPROTO_IPV6), integer(IPV6_MULTICAST_HOPS), buf, SizeOf(Value.Value)) else synsock.SetSockOpt(FSocket, integer(IPPROTO_IP), integer(IP_MULTICAST_TTL), buf, SizeOf(Value.Value)); end; SOT_MulticastLoop: begin x := Ord(Value.Enabled); {$IFDEF CIL} buf := System.BitConverter.GetBytes(x); {$ELSE} buf := @x; {$ENDIF} if FIP6Used then synsock.SetSockOpt(FSocket, integer(IPPROTO_IPV6), integer(IPV6_MULTICAST_LOOP), buf, SizeOf(x)) else synsock.SetSockOpt(FSocket, integer(IPPROTO_IP), integer(IP_MULTICAST_LOOP), buf, SizeOf(x)); end; end; Value.free; end; procedure TBlockSocket.DelayedOption(const Value: TSynaOption); begin if FSocket = INVALID_SOCKET then begin FDelayedOptions.Insert(0, Value); end else SetDelayedOption(Value); end; procedure TBlockSocket.ProcessDelayedOptions; var n: integer; d: TSynaOption; begin for n := FDelayedOptions.Count - 1 downto 0 do begin d := TSynaOption(FDelayedOptions[n]); SetDelayedOption(d); end; FDelayedOptions.Clear; end; procedure TBlockSocket.SetSin(var Sin: TVarSin; IP, Port: string); var f: TSocketFamily; begin DoStatus(HR_ResolvingBegin, IP + ':' + Port); ResetLastError; //if socket exists, then use their type, else use users selection f := SF_Any; if (FSocket = INVALID_SOCKET) and (FFamily = SF_any) then begin if IsIP(IP) then f := SF_IP4 else if IsIP6(IP) then f := SF_IP6; end else f := FFamily; FLastError := synsock.SetVarSin(sin, ip, port, FamilyToAF(f), GetSocketprotocol, GetSocketType, FPreferIP4); DoStatus(HR_ResolvingEnd, GetSinIP(sin) + ':' + IntTostr(GetSinPort(sin))); end; function TBlockSocket.GetSinIP(Sin: TVarSin): string; begin Result := synsock.GetSinIP(sin); end; function TBlockSocket.GetSinPort(Sin: TVarSin): Integer; begin Result := synsock.GetSinPort(sin); end; procedure TBlockSocket.CreateSocket; var sin: TVarSin; begin //dummy for SF_Any Family mode ResetLastError; if (FFamily <> SF_Any) and (FSocket = INVALID_SOCKET) then begin {$IFDEF CIL} if FFamily = SF_IP6 then sin := TVarSin.Create(IPAddress.Parse('::0'), 0) else sin := TVarSin.Create(IPAddress.Parse('0.0.0.0'), 0); {$ELSE} FillChar(Sin, Sizeof(Sin), 0); if FFamily = SF_IP6 then sin.sin_family := AF_INET6 else sin.sin_family := AF_INET; {$ENDIF} InternalCreateSocket(Sin); end; end; procedure TBlockSocket.CreateSocketByName(const Value: String); var sin: TVarSin; begin ResetLastError; if FSocket = INVALID_SOCKET then begin SetSin(sin, value, '0'); if FLastError = 0 then InternalCreateSocket(Sin); end; end; procedure TBlockSocket.InternalCreateSocket(Sin: TVarSin); begin FStopFlag := False; FRecvCounter := 0; FSendCounter := 0; ResetLastError; if FSocket = INVALID_SOCKET then begin FBuffer := ''; FBinded := False; FIP6Used := Sin.AddressFamily = AF_INET6; FSocket := synsock.Socket(integer(Sin.AddressFamily), GetSocketType, GetSocketProtocol); if FSocket = INVALID_SOCKET then FLastError := synsock.WSAGetLastError; {$IFNDEF CIL} FD_ZERO(FFDSet); FD_SET(FSocket, FFDSet); {$ENDIF} ExceptCheck; if FIP6used then DoStatus(HR_SocketCreate, 'IPv6') else DoStatus(HR_SocketCreate, 'IPv4'); ProcessDelayedOptions; DoCreateSocket; end; end; procedure TBlockSocket.CloseSocket; begin AbortSocket; end; procedure TBlockSocket.AbortSocket; var n: integer; p: TSynaOption; begin if FSocket <> INVALID_SOCKET then synsock.CloseSocket(FSocket); FSocket := INVALID_SOCKET; for n := FDelayedOptions.Count - 1 downto 0 do begin p := TSynaOption(FDelayedOptions[n]); p.Free; end; FDelayedOptions.Clear; FFamily := FFamilySave; DoStatus(HR_SocketClose, ''); end; procedure TBlockSocket.Bind(IP, Port: string); var Sin: TVarSin; begin ResetLastError; if (FSocket <> INVALID_SOCKET) or not((FFamily = SF_ANY) and (IP = cAnyHost) and (Port = cAnyPort)) then begin SetSin(Sin, IP, Port); if FLastError = 0 then begin if FSocket = INVALID_SOCKET then InternalCreateSocket(Sin); SockCheck(synsock.Bind(FSocket, Sin)); GetSinLocal; FBuffer := ''; FBinded := True; end; ExceptCheck; DoStatus(HR_Bind, IP + ':' + Port); end; end; procedure TBlockSocket.Connect(IP, Port: string); var Sin: TVarSin; begin SetSin(Sin, IP, Port); if FLastError = 0 then begin if FSocket = INVALID_SOCKET then InternalCreateSocket(Sin); SockCheck(synsock.Connect(FSocket, Sin)); if FLastError = 0 then GetSins; FBuffer := ''; FLastCR := False; FLastLF := False; end; ExceptCheck; DoStatus(HR_Connect, IP + ':' + Port); end; procedure TBlockSocket.Listen; begin SockCheck(synsock.Listen(FSocket, SOMAXCONN)); GetSins; ExceptCheck; DoStatus(HR_Listen, ''); end; function TBlockSocket.Accept: TSocket; begin Result := synsock.Accept(FSocket, FRemoteSin); /// SockCheck(Result); ExceptCheck; DoStatus(HR_Accept, ''); end; procedure TBlockSocket.GetSinLocal; begin synsock.GetSockName(FSocket, FLocalSin); end; procedure TBlockSocket.GetSinRemote; begin synsock.GetPeerName(FSocket, FRemoteSin); end; procedure TBlockSocket.GetSins; begin GetSinLocal; GetSinRemote; end; procedure TBlockSocket.SetBandwidth(Value: Integer); begin MaxSendBandwidth := Value; MaxRecvBandwidth := Value; end; procedure TBlockSocket.LimitBandwidth(Length: Integer; MaxB: integer; var Next: LongWord); var x: LongWord; y: LongWord; n: integer; begin if FStopFlag then exit; if MaxB > 0 then begin y := GetTick; if Next > y then begin x := Next - y; if x > 0 then begin DoStatus(HR_Wait, IntToStr(x)); sleep(x mod 250); for n := 1 to x div 250 do if FStopFlag then Break else sleep(250); end; end; Next := GetTick + Trunc((Length / MaxB) * 1000); end; end; function TBlockSocket.TestStopFlag: Boolean; begin DoHeartbeat; Result := FStopFlag; if Result then begin FStopFlag := False; FLastError := WSAECONNABORTED; ExceptCheck; end; end; function TBlockSocket.SendBuffer(Buffer: TMemory; Length: Integer): Integer; {$IFNDEF CIL} var x, y: integer; l, r: integer; p: Pointer; {$ENDIF} begin Result := 0; if TestStopFlag then Exit; DoMonitor(True, Buffer, Length); {$IFDEF CIL} Result := synsock.Send(FSocket, Buffer, Length, 0); {$ELSE} l := Length; x := 0; while x < l do begin y := l - x; if y > FSendMaxChunk then y := FSendMaxChunk; if y > 0 then begin LimitBandwidth(y, FMaxSendBandwidth, FNextsend); p := IncPoint(Buffer, x); r := synsock.Send(FSocket, p, y, MSG_NOSIGNAL); SockCheck(r); if FLastError = WSAEWOULDBLOCK then begin if CanWrite(FNonblockSendTimeout) then begin r := synsock.Send(FSocket, p, y, MSG_NOSIGNAL); SockCheck(r); end else FLastError := WSAETIMEDOUT; end; if FLastError <> 0 then Break; Inc(x, r); Inc(Result, r); Inc(FSendCounter, r); DoStatus(HR_WriteCount, IntToStr(r)); end else break; end; {$ENDIF} ExceptCheck; end; procedure TBlockSocket.SendByte(Data: Byte); {$IFDEF CIL} var buf: TMemory; {$ENDIF} begin {$IFDEF CIL} setlength(buf, 1); buf[0] := Data; SendBuffer(buf, 1); {$ELSE} SendBuffer(@Data, 1); {$ENDIF} end; procedure TBlockSocket.SendString(Data: AnsiString); var buf: TMemory; begin {$IFDEF CIL} buf := BytesOf(Data); {$ELSE} buf := Pointer(data); {$ENDIF} SendBuffer(buf, Length(Data)); end; procedure TBlockSocket.SendInteger(Data: integer); var buf: TMemory; begin {$IFDEF CIL} buf := System.BitConverter.GetBytes(Data); {$ELSE} buf := @Data; {$ENDIF} SendBuffer(buf, SizeOf(Data)); end; procedure TBlockSocket.SendBlock(const Data: AnsiString); var i: integer; begin i := SwapBytes(Length(data)); SendString(Codelongint(i) + Data); end; procedure TBlockSocket.InternalSendStream(const Stream: TStream; WithSize, Indy: boolean); var l: integer; yr: integer; s: AnsiString; b: boolean; {$IFDEF CIL} buf: TMemory; {$ENDIF} begin b := true; l := 0; if WithSize then begin l := Stream.Size - Stream.Position;; if not Indy then l := synsock.HToNL(l); end; repeat {$IFDEF CIL} Setlength(buf, FSendMaxChunk); yr := Stream.read(buf, FSendMaxChunk); if yr > 0 then begin if WithSize and b then begin b := false; SendString(CodeLongInt(l)); end; SendBuffer(buf, yr); if FLastError <> 0 then break; end {$ELSE} Setlength(s, FSendMaxChunk); yr := Stream.read(Pointer(s)^, FSendMaxChunk); if yr > 0 then begin SetLength(s, yr); if WithSize and b then begin b := false; SendString(CodeLongInt(l) + s); end else SendString(s); if FLastError <> 0 then break; end {$ENDIF} until yr <= 0; end; procedure TBlockSocket.SendStreamRaw(const Stream: TStream); begin InternalSendStream(Stream, false, false); end; procedure TBlockSocket.SendStreamIndy(const Stream: TStream); begin InternalSendStream(Stream, true, true); end; procedure TBlockSocket.SendStream(const Stream: TStream); begin InternalSendStream(Stream, true, false); end; function TBlockSocket.RecvBuffer(Buffer: TMemory; Length: Integer): Integer; begin Result := 0; if TestStopFlag then Exit; LimitBandwidth(Length, FMaxRecvBandwidth, FNextRecv); // Result := synsock.Recv(FSocket, Buffer^, Length, MSG_NOSIGNAL); Result := synsock.Recv(FSocket, Buffer, Length, MSG_NOSIGNAL); if Result = 0 then FLastError := WSAECONNRESET else SockCheck(Result); ExceptCheck; if Result > 0 then begin Inc(FRecvCounter, Result); DoStatus(HR_ReadCount, IntToStr(Result)); DoMonitor(False, Buffer, Result); DoReadFilter(Buffer, Result); end; end; function TBlockSocket.RecvBufferEx(Buffer: TMemory; Len: Integer; Timeout: Integer): Integer; var s: AnsiString; rl, l: integer; ti: LongWord; {$IFDEF CIL} n: integer; b: TMemory; {$ENDIF} begin ResetLastError; Result := 0; if Len > 0 then begin rl := 0; repeat ti := GetTick; s := RecvPacket(Timeout); l := Length(s); if (rl + l) > Len then l := Len - rl; {$IFDEF CIL} b := BytesOf(s); for n := 0 to l do Buffer[rl + n] := b[n]; {$ELSE} Move(Pointer(s)^, IncPoint(Buffer, rl)^, l); {$ENDIF} rl := rl + l; if FLastError <> 0 then Break; if rl >= Len then Break; if not FInterPacketTimeout then begin Timeout := Timeout - integer(TickDelta(ti, GetTick)); if Timeout <= 0 then begin FLastError := WSAETIMEDOUT; Break; end; end; until False; delete(s, 1, l); FBuffer := s; Result := rl; end; end; function TBlockSocket.RecvBufferStr(Len: Integer; Timeout: Integer): AnsiString; var x: integer; {$IFDEF CIL} buf: Tmemory; {$ENDIF} begin Result := ''; if Len > 0 then begin {$IFDEF CIL} Setlength(Buf, Len); x := RecvBufferEx(buf, Len , Timeout); if FLastError = 0 then begin SetLength(Buf, x); Result := StringOf(buf); end else Result := ''; {$ELSE} Setlength(Result, Len); x := RecvBufferEx(Pointer(Result), Len , Timeout); if FLastError = 0 then SetLength(Result, x) else Result := ''; {$ENDIF} end; end; function TBlockSocket.RecvPacket(Timeout: Integer): AnsiString; var x: integer; {$IFDEF CIL} buf: TMemory; {$ENDIF} begin Result := ''; ResetLastError; if FBuffer <> '' then begin Result := FBuffer; FBuffer := ''; end else begin {$IFDEF MSWINDOWS} //not drain CPU on large downloads... Sleep(0); {$ENDIF} x := WaitingData; if x > 0 then begin {$IFDEF CIL} SetLength(Buf, x); x := RecvBuffer(Buf, x); if x >= 0 then begin SetLength(Buf, x); Result := StringOf(Buf); end; {$ELSE} SetLength(Result, x); x := RecvBuffer(Pointer(Result), x); if x >= 0 then SetLength(Result, x); {$ENDIF} end else begin if CanRead(Timeout) then begin x := WaitingData; if x = 0 then FLastError := WSAECONNRESET; if x > 0 then begin {$IFDEF CIL} SetLength(Buf, x); x := RecvBuffer(Buf, x); if x >= 0 then begin SetLength(Buf, x); result := StringOf(Buf); end; {$ELSE} SetLength(Result, x); x := RecvBuffer(Pointer(Result), x); if x >= 0 then SetLength(Result, x); {$ENDIF} end; end else FLastError := WSAETIMEDOUT; end; end; if FConvertLineEnd and (Result <> '') then begin if FLastCR and (Result[1] = LF) then Delete(Result, 1, 1); if FLastLF and (Result[1] = CR) then Delete(Result, 1, 1); FLastCR := False; FLastLF := False; end; ExceptCheck; end; function TBlockSocket.RecvByte(Timeout: Integer): Byte; begin Result := 0; ResetLastError; if FBuffer = '' then FBuffer := RecvPacket(Timeout); if (FLastError = 0) and (FBuffer <> '') then begin Result := Ord(FBuffer[1]); Delete(FBuffer, 1, 1); end; ExceptCheck; end; function TBlockSocket.RecvInteger(Timeout: Integer): Integer; var s: AnsiString; begin Result := 0; s := RecvBufferStr(4, Timeout); if FLastError = 0 then Result := (ord(s[1]) + ord(s[2]) * 256) + (ord(s[3]) + ord(s[4]) * 256) * 65536; end; function TBlockSocket.RecvTerminated(Timeout: Integer; const Terminator: AnsiString): AnsiString; var x: Integer; s: AnsiString; l: Integer; CorCRLF: Boolean; t: AnsiString; tl: integer; ti: LongWord; begin ResetLastError; Result := ''; l := Length(Terminator); if l = 0 then Exit; tl := l; CorCRLF := FConvertLineEnd and (Terminator = CRLF); s := ''; x := 0; repeat //get rest of FBuffer or incomming new data... ti := GetTick; s := s + RecvPacket(Timeout); if FLastError <> 0 then Break; x := 0; if Length(s) > 0 then if CorCRLF then begin t := ''; x := PosCRLF(s, t); tl := Length(t); if t = CR then FLastCR := True; if t = LF then FLastLF := True; end else begin x := pos(Terminator, s); tl := l; end; if (FMaxLineLength <> 0) and (Length(s) > FMaxLineLength) then begin FLastError := WSAENOBUFS; Break; end; if x > 0 then Break; if not FInterPacketTimeout then begin Timeout := Timeout - integer(TickDelta(ti, GetTick)); if Timeout <= 0 then begin FLastError := WSAETIMEDOUT; Break; end; end; until False; if x > 0 then begin Result := Copy(s, 1, x - 1); Delete(s, 1, x + tl - 1); end; FBuffer := s; ExceptCheck; end; function TBlockSocket.RecvString(Timeout: Integer): AnsiString; var s: AnsiString; begin Result := ''; s := RecvTerminated(Timeout, CRLF); if FLastError = 0 then Result := s; end; function TBlockSocket.RecvBlock(Timeout: Integer): AnsiString; var x: integer; begin Result := ''; x := RecvInteger(Timeout); if FLastError = 0 then Result := RecvBufferStr(x, Timeout); end; procedure TBlockSocket.RecvStreamRaw(const Stream: TStream; Timeout: Integer); var s: AnsiString; begin repeat s := RecvPacket(Timeout); if FLastError = 0 then WriteStrToStream(Stream, s); until FLastError <> 0; end; procedure TBlockSocket.RecvStreamSize(const Stream: TStream; Timeout: Integer; Size: Integer); var s: AnsiString; n: integer; {$IFDEF CIL} buf: TMemory; {$ENDIF} begin for n := 1 to (Size div FSendMaxChunk) do begin {$IFDEF CIL} SetLength(buf, FSendMaxChunk); RecvBufferEx(buf, FSendMaxChunk, Timeout); if FLastError <> 0 then Exit; Stream.Write(buf, FSendMaxChunk); {$ELSE} s := RecvBufferStr(FSendMaxChunk, Timeout); if FLastError <> 0 then Exit; WriteStrToStream(Stream, s); {$ENDIF} end; n := Size mod FSendMaxChunk; if n > 0 then begin {$IFDEF CIL} SetLength(buf, n); RecvBufferEx(buf, n, Timeout); if FLastError <> 0 then Exit; Stream.Write(buf, n); {$ELSE} s := RecvBufferStr(n, Timeout); if FLastError <> 0 then Exit; WriteStrToStream(Stream, s); {$ENDIF} end; end; procedure TBlockSocket.RecvStreamIndy(const Stream: TStream; Timeout: Integer); var x: integer; begin x := RecvInteger(Timeout); x := synsock.NToHL(x); if FLastError = 0 then RecvStreamSize(Stream, Timeout, x); end; procedure TBlockSocket.RecvStream(const Stream: TStream; Timeout: Integer); var x: integer; begin x := RecvInteger(Timeout); if FLastError = 0 then RecvStreamSize(Stream, Timeout, x); end; function TBlockSocket.PeekBuffer(Buffer: TMemory; Length: Integer): Integer; begin {$IFNDEF CIL} // Result := synsock.Recv(FSocket, Buffer^, Length, MSG_PEEK + MSG_NOSIGNAL); Result := synsock.Recv(FSocket, Buffer, Length, MSG_PEEK + MSG_NOSIGNAL); SockCheck(Result); ExceptCheck; {$ENDIF} end; function TBlockSocket.PeekByte(Timeout: Integer): Byte; var s: string; begin {$IFNDEF CIL} Result := 0; if CanRead(Timeout) then begin SetLength(s, 1); PeekBuffer(Pointer(s), 1); if s <> '' then Result := Ord(s[1]); end else FLastError := WSAETIMEDOUT; ExceptCheck; {$ENDIF} end; procedure TBlockSocket.ResetLastError; begin FLastError := 0; FLastErrorDesc := ''; end; function TBlockSocket.SockCheck(SockResult: Integer): Integer; begin ResetLastError; if SockResult = integer(SOCKET_ERROR) then begin FLastError := synsock.WSAGetLastError; FLastErrorDesc := GetErrorDescEx; end; Result := FLastError; end; procedure TBlockSocket.ExceptCheck; var e: ESynapseError; begin FLastErrorDesc := GetErrorDescEx; if (LastError <> 0) and (LastError <> WSAEINPROGRESS) and (LastError <> WSAEWOULDBLOCK) then begin DoStatus(HR_Error, IntToStr(FLastError) + ',' + FLastErrorDesc); if FRaiseExcept then begin e := ESynapseError.Create(Format('Synapse TCP/IP Socket error %d: %s', [FLastError, FLastErrorDesc])); e.ErrorCode := FLastError; e.ErrorMessage := FLastErrorDesc; raise e; end; end; end; function TBlockSocket.WaitingData: Integer; var x: Integer; begin Result := 0; if synsock.IoctlSocket(FSocket, FIONREAD, x) = 0 then Result := x; if Result > c64k then Result := c64k; end; function TBlockSocket.WaitingDataEx: Integer; begin if FBuffer <> '' then Result := Length(FBuffer) else Result := WaitingData; end; procedure TBlockSocket.Purge; begin Sleep(1); try while (Length(FBuffer) > 0) or (WaitingData > 0) do begin RecvPacket(0); if FLastError <> 0 then break; end; except on exception do; end; ResetLastError; end; procedure TBlockSocket.SetLinger(Enable: Boolean; Linger: Integer); var d: TSynaOption; begin d := TSynaOption.Create; d.Option := SOT_Linger; d.Enabled := Enable; d.Value := Linger; DelayedOption(d); end; function TBlockSocket.LocalName: string; begin Result := synsock.GetHostName; if Result = '' then Result := '127.0.0.1'; end; procedure TBlockSocket.ResolveNameToIP(Name: string; const IPList: TStrings); begin IPList.Clear; synsock.ResolveNameToIP(Name, FamilyToAF(FFamily), GetSocketprotocol, GetSocketType, IPList); if IPList.Count = 0 then IPList.Add(cAnyHost); end; function TBlockSocket.ResolveName(Name: string): string; var l: TStringList; begin l := TStringList.Create; try ResolveNameToIP(Name, l); Result := l[0]; finally l.Free; end; end; function TBlockSocket.ResolvePort(Port: string): Word; begin Result := synsock.ResolvePort(Port, FamilyToAF(FFamily), GetSocketProtocol, GetSocketType); end; function TBlockSocket.ResolveIPToName(IP: string): string; begin if not IsIP(IP) and not IsIp6(IP) then IP := ResolveName(IP); Result := synsock.ResolveIPToName(IP, FamilyToAF(FFamily), GetSocketProtocol, GetSocketType); end; procedure TBlockSocket.SetRemoteSin(IP, Port: string); begin SetSin(FRemoteSin, IP, Port); end; function TBlockSocket.GetLocalSinIP: string; begin Result := GetSinIP(FLocalSin); end; function TBlockSocket.GetRemoteSinIP: string; begin Result := GetSinIP(FRemoteSin); end; function TBlockSocket.GetLocalSinPort: Integer; begin Result := GetSinPort(FLocalSin); end; function TBlockSocket.GetRemoteSinPort: Integer; begin Result := GetSinPort(FRemoteSin); end; function TBlockSocket.InternalCanRead(Timeout: Integer): Boolean; {$IFDEF CIL} begin Result := FSocket.Poll(Timeout * 1000, SelectMode.SelectRead); {$ELSE} var TimeVal: PTimeVal; TimeV: TTimeVal; x: Integer; FDSet: TFDSet; begin TimeV.tv_usec := (Timeout mod 1000) * 1000; TimeV.tv_sec := Timeout div 1000; TimeVal := @TimeV; if Timeout = -1 then TimeVal := nil; FDSet := FFdSet; x := synsock.Select(FSocket + 1, @FDSet, nil, nil, TimeVal); SockCheck(x); if FLastError <> 0 then x := 0; Result := x > 0; {$ENDIF} end; function TBlockSocket.CanRead(Timeout: Integer): Boolean; var ti, tr: Integer; n: integer; begin if (FHeartbeatRate <> 0) and (Timeout <> -1) then begin ti := Timeout div FHeartbeatRate; tr := Timeout mod FHeartbeatRate; end else begin ti := 0; tr := Timeout; end; Result := InternalCanRead(tr); if not Result then for n := 0 to ti do begin DoHeartbeat; if FStopFlag then begin Result := False; FStopFlag := False; Break; end; Result := InternalCanRead(FHeartbeatRate); if Result then break; end; ExceptCheck; if Result then DoStatus(HR_CanRead, ''); end; function TBlockSocket.CanWrite(Timeout: Integer): Boolean; {$IFDEF CIL} begin Result := FSocket.Poll(Timeout * 1000, SelectMode.SelectWrite); {$ELSE} var TimeVal: PTimeVal; TimeV: TTimeVal; x: Integer; FDSet: TFDSet; begin TimeV.tv_usec := (Timeout mod 1000) * 1000; TimeV.tv_sec := Timeout div 1000; TimeVal := @TimeV; if Timeout = -1 then TimeVal := nil; FDSet := FFdSet; x := synsock.Select(FSocket + 1, nil, @FDSet, nil, TimeVal); SockCheck(x); if FLastError <> 0 then x := 0; Result := x > 0; {$ENDIF} ExceptCheck; if Result then DoStatus(HR_CanWrite, ''); end; function TBlockSocket.CanReadEx(Timeout: Integer): Boolean; begin if FBuffer <> '' then Result := True else Result := CanRead(Timeout); end; function TBlockSocket.SendBufferTo(Buffer: TMemory; Length: Integer): Integer; begin Result := 0; if TestStopFlag then Exit; DoMonitor(True, Buffer, Length); LimitBandwidth(Length, FMaxSendBandwidth, FNextsend); Result := synsock.SendTo(FSocket, Buffer, Length, MSG_NOSIGNAL, FRemoteSin); SockCheck(Result); ExceptCheck; Inc(FSendCounter, Result); DoStatus(HR_WriteCount, IntToStr(Result)); end; function TBlockSocket.RecvBufferFrom(Buffer: TMemory; Length: Integer): Integer; begin Result := 0; if TestStopFlag then Exit; LimitBandwidth(Length, FMaxRecvBandwidth, FNextRecv); Result := synsock.RecvFrom(FSocket, Buffer, Length, MSG_NOSIGNAL, FRemoteSin); SockCheck(Result); ExceptCheck; Inc(FRecvCounter, Result); DoStatus(HR_ReadCount, IntToStr(Result)); DoMonitor(False, Buffer, Result); end; function TBlockSocket.GetSizeRecvBuffer: Integer; var l: Integer; {$IFDEF CIL} buf: TMemory; {$ENDIF} begin {$IFDEF CIL} setlength(buf, 4); SockCheck(synsock.GetSockOpt(FSocket, integer(SOL_SOCKET), integer(SO_RCVBUF), buf, l)); Result := System.BitConverter.ToInt32(buf,0); {$ELSE} l := SizeOf(Result); SockCheck(synsock.GetSockOpt(FSocket, SOL_SOCKET, SO_RCVBUF, @Result, l)); if FLastError <> 0 then Result := 1024; ExceptCheck; {$ENDIF} end; procedure TBlockSocket.SetSizeRecvBuffer(Size: Integer); var d: TSynaOption; begin d := TSynaOption.Create; d.Option := SOT_RecvBuff; d.Value := Size; DelayedOption(d); end; function TBlockSocket.GetSizeSendBuffer: Integer; var l: Integer; {$IFDEF CIL} buf: TMemory; {$ENDIF} begin {$IFDEF CIL} setlength(buf, 4); SockCheck(synsock.GetSockOpt(FSocket, integer(SOL_SOCKET), integer(SO_SNDBUF), buf, l)); Result := System.BitConverter.ToInt32(buf,0); {$ELSE} l := SizeOf(Result); SockCheck(synsock.GetSockOpt(FSocket, SOL_SOCKET, SO_SNDBUF, @Result, l)); if FLastError <> 0 then Result := 1024; ExceptCheck; {$ENDIF} end; procedure TBlockSocket.SetSizeSendBuffer(Size: Integer); var d: TSynaOption; begin d := TSynaOption.Create; d.Option := SOT_SendBuff; d.Value := Size; DelayedOption(d); end; procedure TBlockSocket.SetNonBlockMode(Value: Boolean); var d: TSynaOption; begin d := TSynaOption.Create; d.Option := SOT_nonblock; d.Enabled := Value; DelayedOption(d); end; procedure TBlockSocket.SetTimeout(Timeout: Integer); begin SetSendTimeout(Timeout); SetRecvTimeout(Timeout); end; procedure TBlockSocket.SetSendTimeout(Timeout: Integer); var d: TSynaOption; begin d := TSynaOption.Create; d.Option := SOT_sendtimeout; d.Value := Timeout; DelayedOption(d); end; procedure TBlockSocket.SetRecvTimeout(Timeout: Integer); var d: TSynaOption; begin d := TSynaOption.Create; d.Option := SOT_recvtimeout; d.Value := Timeout; DelayedOption(d); end; {$IFNDEF CIL} function TBlockSocket.GroupCanRead(const SocketList: TList; Timeout: Integer; const CanReadList: TList): boolean; var FDSet: TFDSet; TimeVal: PTimeVal; TimeV: TTimeVal; x, n: Integer; Max: Integer; begin TimeV.tv_usec := (Timeout mod 1000) * 1000; TimeV.tv_sec := Timeout div 1000; TimeVal := @TimeV; if Timeout = -1 then TimeVal := nil; FD_ZERO(FDSet); Max := 0; for n := 0 to SocketList.Count - 1 do if TObject(SocketList.Items[n]) is TBlockSocket then begin if TBlockSocket(SocketList.Items[n]).Socket > Max then Max := TBlockSocket(SocketList.Items[n]).Socket; FD_SET(TBlockSocket(SocketList.Items[n]).Socket, FDSet); end; x := synsock.Select(Max + 1, @FDSet, nil, nil, TimeVal); SockCheck(x); ExceptCheck; if FLastError <> 0 then x := 0; Result := x > 0; CanReadList.Clear; if Result then for n := 0 to SocketList.Count - 1 do if TObject(SocketList.Items[n]) is TBlockSocket then if FD_ISSET(TBlockSocket(SocketList.Items[n]).Socket, FDSet) then CanReadList.Add(TBlockSocket(SocketList.Items[n])); end; {$ENDIF} procedure TBlockSocket.EnableReuse(Value: Boolean); var d: TSynaOption; begin d := TSynaOption.Create; d.Option := SOT_reuse; d.Enabled := Value; DelayedOption(d); end; procedure TBlockSocket.SetTTL(TTL: integer); var d: TSynaOption; begin d := TSynaOption.Create; d.Option := SOT_TTL; d.Value := TTL; DelayedOption(d); end; function TBlockSocket.GetTTL:integer; var l: Integer; begin {$IFNDEF CIL} l := SizeOf(Result); if FIP6Used then synsock.GetSockOpt(FSocket, IPPROTO_IPV6, IPV6_UNICAST_HOPS, @Result, l) else synsock.GetSockOpt(FSocket, IPPROTO_IP, IP_TTL, @Result, l); {$ENDIF} end; procedure TBlockSocket.SetFamily(Value: TSocketFamily); begin FFamily := Value; FFamilySave := Value; end; procedure TBlockSocket.SetSocket(Value: TSocket); begin FRecvCounter := 0; FSendCounter := 0; FSocket := Value; {$IFNDEF CIL} FD_ZERO(FFDSet); FD_SET(FSocket, FFDSet); {$ENDIF} GetSins; FIP6Used := FRemoteSin.AddressFamily = AF_INET6; end; function TBlockSocket.GetWsaData: TWSAData; begin {$IFDEF ONCEWINSOCK} Result := WsaDataOnce; {$ELSE} Result := FWsaDataOnce; {$ENDIF} end; function TBlockSocket.GetSocketType: integer; begin Result := 0; end; function TBlockSocket.GetSocketProtocol: integer; begin Result := integer(IPPROTO_IP); end; procedure TBlockSocket.DoStatus(Reason: THookSocketReason; const Value: string); begin if assigned(OnStatus) then OnStatus(Self, Reason, Value); end; procedure TBlockSocket.DoReadFilter(Buffer: TMemory; var Len: Integer); var s: AnsiString; begin if assigned(OnReadFilter) then if Len > 0 then begin {$IFDEF CIL} s := StringOf(Buffer); {$ELSE} SetLength(s, Len); Move(Buffer^, Pointer(s)^, Len); {$ENDIF} OnReadFilter(Self, s); if Length(s) > Len then SetLength(s, Len); Len := Length(s); {$IFDEF CIL} Buffer := BytesOf(s); {$ELSE} Move(Pointer(s)^, Buffer^, Len); {$ENDIF} end; end; procedure TBlockSocket.DoCreateSocket; begin if assigned(OnCreateSocket) then OnCreateSocket(Self); end; procedure TBlockSocket.DoMonitor(Writing: Boolean; const Buffer: TMemory; Len: Integer); begin if assigned(OnMonitor) then begin OnMonitor(Self, Writing, Buffer, Len); end; end; procedure TBlockSocket.DoHeartbeat; begin if assigned(OnHeartbeat) and (FHeartbeatRate <> 0) then begin OnHeartbeat(Self); end; end; function TBlockSocket.GetErrorDescEx: string; begin Result := GetErrorDesc(FLastError); end; class function TBlockSocket.GetErrorDesc(ErrorCode: Integer): string; begin {$IFDEF CIL} if ErrorCode = 0 then Result := '' else begin Result := WSAGetLastErrorDesc; if Result = '' then Result := 'Other Winsock error (' + IntToStr(ErrorCode) + ')'; end; {$ELSE} case ErrorCode of 0: Result := ''; WSAEINTR: {10004} Result := 'Interrupted system call'; WSAEBADF: {10009} Result := 'Bad file number'; WSAEACCES: {10013} Result := 'Permission denied'; WSAEFAULT: {10014} Result := 'Bad address'; WSAEINVAL: {10022} Result := 'Invalid argument'; WSAEMFILE: {10024} Result := 'Too many open files'; WSAEWOULDBLOCK: {10035} Result := 'Operation would block'; WSAEINPROGRESS: {10036} Result := 'Operation now in progress'; WSAEALREADY: {10037} Result := 'Operation already in progress'; WSAENOTSOCK: {10038} Result := 'Socket operation on nonsocket'; WSAEDESTADDRREQ: {10039} Result := 'Destination address required'; WSAEMSGSIZE: {10040} Result := 'Message too long'; WSAEPROTOTYPE: {10041} Result := 'Protocol wrong type for Socket'; WSAENOPROTOOPT: {10042} Result := 'Protocol not available'; WSAEPROTONOSUPPORT: {10043} Result := 'Protocol not supported'; WSAESOCKTNOSUPPORT: {10044} Result := 'Socket not supported'; WSAEOPNOTSUPP: {10045} Result := 'Operation not supported on Socket'; WSAEPFNOSUPPORT: {10046} Result := 'Protocol family not supported'; WSAEAFNOSUPPORT: {10047} Result := 'Address family not supported'; WSAEADDRINUSE: {10048} Result := 'Address already in use'; WSAEADDRNOTAVAIL: {10049} Result := 'Can''t assign requested address'; WSAENETDOWN: {10050} Result := 'Network is down'; WSAENETUNREACH: {10051} Result := 'Network is unreachable'; WSAENETRESET: {10052} Result := 'Network dropped connection on reset'; WSAECONNABORTED: {10053} Result := 'Software caused connection abort'; WSAECONNRESET: {10054} Result := 'Connection reset by peer'; WSAENOBUFS: {10055} Result := 'No Buffer space available'; WSAEISCONN: {10056} Result := 'Socket is already connected'; WSAENOTCONN: {10057} Result := 'Socket is not connected'; WSAESHUTDOWN: {10058} Result := 'Can''t send after Socket shutdown'; WSAETOOMANYREFS: {10059} Result := 'Too many references:can''t splice'; WSAETIMEDOUT: {10060} Result := 'Connection timed out'; WSAECONNREFUSED: {10061} Result := 'Connection refused'; WSAELOOP: {10062} Result := 'Too many levels of symbolic links'; WSAENAMETOOLONG: {10063} Result := 'File name is too long'; WSAEHOSTDOWN: {10064} Result := 'Host is down'; WSAEHOSTUNREACH: {10065} Result := 'No route to host'; WSAENOTEMPTY: {10066} Result := 'Directory is not empty'; WSAEPROCLIM: {10067} Result := 'Too many processes'; WSAEUSERS: {10068} Result := 'Too many users'; WSAEDQUOT: {10069} Result := 'Disk quota exceeded'; WSAESTALE: {10070} Result := 'Stale NFS file handle'; WSAEREMOTE: {10071} Result := 'Too many levels of remote in path'; WSASYSNOTREADY: {10091} Result := 'Network subsystem is unusable'; WSAVERNOTSUPPORTED: {10092} Result := 'Winsock DLL cannot support this application'; WSANOTINITIALISED: {10093} Result := 'Winsock not initialized'; WSAEDISCON: {10101} Result := 'Disconnect'; WSAHOST_NOT_FOUND: {11001} Result := 'Host not found'; WSATRY_AGAIN: {11002} Result := 'Non authoritative - host not found'; WSANO_RECOVERY: {11003} Result := 'Non recoverable error'; WSANO_DATA: {11004} Result := 'Valid name, no data record of requested type' else Result := 'Other Winsock error (' + IntToStr(ErrorCode) + ')'; end; {$ENDIF} end; {======================================================================} constructor TSocksBlockSocket.Create; begin inherited Create; FSocksIP:= ''; FSocksPort:= '1080'; FSocksTimeout:= 60000; FSocksUsername:= ''; FSocksPassword:= ''; FUsingSocks := False; FSocksResolver := True; FSocksLastError := 0; FSocksResponseIP := ''; FSocksResponsePort := ''; FSocksLocalIP := ''; FSocksLocalPort := ''; FSocksRemoteIP := ''; FSocksRemotePort := ''; FBypassFlag := False; FSocksType := ST_Socks5; end; function TSocksBlockSocket.SocksOpen: boolean; var Buf: AnsiString; n: integer; begin Result := False; FUsingSocks := False; if FSocksType <> ST_Socks5 then begin FUsingSocks := True; Result := True; end else begin FBypassFlag := True; try if FSocksUsername = '' then Buf := #5 + #1 + #0 else Buf := #5 + #2 + #2 +#0; SendString(Buf); Buf := RecvBufferStr(2, FSocksTimeout); if Length(Buf) < 2 then Exit; if Buf[1] <> #5 then Exit; n := Ord(Buf[2]); case n of 0: //not need authorisation ; 2: begin Buf := #1 + AnsiChar(Length(FSocksUsername)) + FSocksUsername + AnsiChar(Length(FSocksPassword)) + FSocksPassword; SendString(Buf); Buf := RecvBufferStr(2, FSocksTimeout); if Length(Buf) < 2 then Exit; if Buf[2] <> #0 then Exit; end; else //other authorisation is not supported! Exit; end; FUsingSocks := True; Result := True; finally FBypassFlag := False; end; end; end; function TSocksBlockSocket.SocksRequest(Cmd: Byte; const IP, Port: string): Boolean; var Buf: AnsiString; begin FBypassFlag := True; try if FSocksType <> ST_Socks5 then Buf := #4 + AnsiChar(Cmd) + SocksCode(IP, Port) else Buf := #5 + AnsiChar(Cmd) + #0 + SocksCode(IP, Port); SendString(Buf); Result := FLastError = 0; finally FBypassFlag := False; end; end; function TSocksBlockSocket.SocksResponse: Boolean; var Buf, s: AnsiString; x: integer; begin Result := False; FBypassFlag := True; try FSocksResponseIP := ''; FSocksResponsePort := ''; FSocksLastError := -1; if FSocksType <> ST_Socks5 then begin Buf := RecvBufferStr(8, FSocksTimeout); if FLastError <> 0 then Exit; if Buf[1] <> #0 then Exit; FSocksLastError := Ord(Buf[2]); end else begin Buf := RecvBufferStr(4, FSocksTimeout); if FLastError <> 0 then Exit; if Buf[1] <> #5 then Exit; case Ord(Buf[4]) of 1: s := RecvBufferStr(4, FSocksTimeout); 3: begin x := RecvByte(FSocksTimeout); if FLastError <> 0 then Exit; s := AnsiChar(x) + RecvBufferStr(x, FSocksTimeout); end; 4: s := RecvBufferStr(16, FSocksTimeout); else Exit; end; Buf := Buf + s + RecvBufferStr(2, FSocksTimeout); if FLastError <> 0 then Exit; FSocksLastError := Ord(Buf[2]); end; if ((FSocksLastError <> 0) and (FSocksLastError <> 90)) then Exit; SocksDecode(Buf); Result := True; finally FBypassFlag := False; end; end; function TSocksBlockSocket.SocksCode(IP, Port: string): Ansistring; var ip6: TIp6Bytes; n: integer; begin if FSocksType <> ST_Socks5 then begin Result := CodeInt(ResolvePort(Port)); if not FSocksResolver then IP := ResolveName(IP); if IsIP(IP) then begin Result := Result + IPToID(IP); Result := Result + FSocksUsername + #0; end else begin Result := Result + IPToID('0.0.0.1'); Result := Result + FSocksUsername + #0; Result := Result + IP + #0; end; end else begin if not FSocksResolver then IP := ResolveName(IP); if IsIP(IP) then Result := #1 + IPToID(IP) else if IsIP6(IP) then begin ip6 := StrToIP6(IP); Result := #4; for n := 0 to 15 do Result := Result + AnsiChar(ip6[n]); end else Result := #3 + AnsiChar(Length(IP)) + IP; Result := Result + CodeInt(ResolvePort(Port)); end; end; function TSocksBlockSocket.SocksDecode(Value: Ansistring): integer; var Atyp: Byte; y, n: integer; w: Word; ip6: TIp6Bytes; begin FSocksResponsePort := '0'; Result := 0; if FSocksType <> ST_Socks5 then begin if Length(Value) < 8 then Exit; Result := 3; w := DecodeInt(Value, Result); FSocksResponsePort := IntToStr(w); FSocksResponseIP := Format('%d.%d.%d.%d', [Ord(Value[5]), Ord(Value[6]), Ord(Value[7]), Ord(Value[8])]); Result := 9; end else begin if Length(Value) < 4 then Exit; Atyp := Ord(Value[4]); Result := 5; case Atyp of 1: begin if Length(Value) < 10 then Exit; FSocksResponseIP := Format('%d.%d.%d.%d', [Ord(Value[5]), Ord(Value[6]), Ord(Value[7]), Ord(Value[8])]); Result := 9; end; 3: begin y := Ord(Value[5]); if Length(Value) < (5 + y + 2) then Exit; for n := 6 to 6 + y - 1 do FSocksResponseIP := FSocksResponseIP + Value[n]; Result := 5 + y + 1; end; 4: begin if Length(Value) < 22 then Exit; for n := 0 to 15 do ip6[n] := ord(Value[n + 5]); FSocksResponseIP := IP6ToStr(ip6); Result := 21; end; else Exit; end; w := DecodeInt(Value, Result); FSocksResponsePort := IntToStr(w); Result := Result + 2; end; end; {======================================================================} procedure TDgramBlockSocket.Connect(IP, Port: string); begin SetRemoteSin(IP, Port); InternalCreateSocket(FRemoteSin); FBuffer := ''; DoStatus(HR_Connect, IP + ':' + Port); end; function TDgramBlockSocket.RecvBuffer(Buffer: TMemory; Length: Integer): Integer; begin Result := RecvBufferFrom(Buffer, Length); end; function TDgramBlockSocket.SendBuffer(Buffer: TMemory; Length: Integer): Integer; begin Result := SendBufferTo(Buffer, Length); end; {======================================================================} destructor TUDPBlockSocket.Destroy; begin if Assigned(FSocksControlSock) then FSocksControlSock.Free; inherited; end; procedure TUDPBlockSocket.EnableBroadcast(Value: Boolean); var d: TSynaOption; begin d := TSynaOption.Create; d.Option := SOT_Broadcast; d.Enabled := Value; DelayedOption(d); end; function TUDPBlockSocket.UdpAssociation: Boolean; var b: Boolean; begin Result := True; FUsingSocks := False; if FSocksIP <> '' then begin Result := False; if not Assigned(FSocksControlSock) then FSocksControlSock := TTCPBlockSocket.Create; FSocksControlSock.CloseSocket; FSocksControlSock.CreateSocketByName(FSocksIP); FSocksControlSock.Connect(FSocksIP, FSocksPort); if FSocksControlSock.LastError <> 0 then Exit; // if not assigned local port, assign it! if not FBinded then Bind(cAnyHost, cAnyPort); //open control TCP connection to SOCKS FSocksControlSock.FSocksUsername := FSocksUsername; FSocksControlSock.FSocksPassword := FSocksPassword; b := FSocksControlSock.SocksOpen; if b then b := FSocksControlSock.SocksRequest(3, GetLocalSinIP, IntToStr(GetLocalSinPort)); if b then b := FSocksControlSock.SocksResponse; if not b and (FLastError = 0) then FLastError := WSANO_RECOVERY; FUsingSocks :=FSocksControlSock.UsingSocks; FSocksRemoteIP := FSocksControlSock.FSocksResponseIP; FSocksRemotePort := FSocksControlSock.FSocksResponsePort; Result := b and (FLastError = 0); end; end; function TUDPBlockSocket.SendBufferTo(Buffer: TMemory; Length: Integer): Integer; var SIp: string; SPort: integer; Buf: Ansistring; begin Result := 0; FUsingSocks := False; if (FSocksIP <> '') and (not UdpAssociation) then FLastError := WSANO_RECOVERY else begin if FUsingSocks then begin {$IFNDEF CIL} Sip := GetRemoteSinIp; SPort := GetRemoteSinPort; SetRemoteSin(FSocksRemoteIP, FSocksRemotePort); SetLength(Buf,Length); Move(Buffer^, Pointer(Buf)^, Length); Buf := #0 + #0 + #0 + SocksCode(Sip, IntToStr(SPort)) + Buf; Result := inherited SendBufferTo(Pointer(Buf), System.Length(buf)); SetRemoteSin(Sip, IntToStr(SPort)); {$ENDIF} end else Result := inherited SendBufferTo(Buffer, Length); end; end; function TUDPBlockSocket.RecvBufferFrom(Buffer: TMemory; Length: Integer): Integer; var Buf: Ansistring; x: integer; begin Result := inherited RecvBufferFrom(Buffer, Length); if FUsingSocks then begin {$IFNDEF CIL} SetLength(Buf, Result); Move(Buffer^, Pointer(Buf)^, Result); x := SocksDecode(Buf); Result := Result - x + 1; Buf := Copy(Buf, x, Result); Move(Pointer(Buf)^, Buffer^, Result); SetRemoteSin(FSocksResponseIP, FSocksResponsePort); {$ENDIF} end; end; {$IFNDEF CIL} procedure TUDPBlockSocket.AddMulticast(MCastIP: string); var Multicast: TIP_mreq; Multicast6: TIPv6_mreq; n: integer; ip6: Tip6bytes; begin if FIP6Used then begin ip6 := StrToIp6(MCastIP); for n := 0 to 15 do Multicast6.ipv6mr_multiaddr.u6_addr8[n] := Ip6[n]; Multicast6.ipv6mr_interface := 0; SockCheck(synsock.SetSockOpt(FSocket, IPPROTO_IPV6, IPV6_JOIN_GROUP, PAnsiChar(@Multicast6), SizeOf(Multicast6))); end else begin Multicast.imr_multiaddr.S_addr := swapbytes(strtoip(MCastIP)); Multicast.imr_interface.S_addr := INADDR_ANY; SockCheck(synsock.SetSockOpt(FSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, PAnsiChar(@Multicast), SizeOf(Multicast))); end; ExceptCheck; end; procedure TUDPBlockSocket.DropMulticast(MCastIP: string); var Multicast: TIP_mreq; Multicast6: TIPv6_mreq; n: integer; ip6: Tip6bytes; begin if FIP6Used then begin ip6 := StrToIp6(MCastIP); for n := 0 to 15 do Multicast6.ipv6mr_multiaddr.u6_addr8[n] := Ip6[n]; Multicast6.ipv6mr_interface := 0; SockCheck(synsock.SetSockOpt(FSocket, IPPROTO_IPV6, IPV6_LEAVE_GROUP, PAnsiChar(@Multicast6), SizeOf(Multicast6))); end else begin Multicast.imr_multiaddr.S_addr := swapbytes(strtoip(MCastIP)); Multicast.imr_interface.S_addr := INADDR_ANY; SockCheck(synsock.SetSockOpt(FSocket, IPPROTO_IP, IP_DROP_MEMBERSHIP, PAnsiChar(@Multicast), SizeOf(Multicast))); end; ExceptCheck; end; {$ENDIF} procedure TUDPBlockSocket.SetMulticastTTL(TTL: integer); var d: TSynaOption; begin d := TSynaOption.Create; d.Option := SOT_MulticastTTL; d.Value := TTL; DelayedOption(d); end; function TUDPBlockSocket.GetMulticastTTL:integer; var l: Integer; begin {$IFNDEF CIL} l := SizeOf(Result); if FIP6Used then synsock.GetSockOpt(FSocket, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, @Result, l) else synsock.GetSockOpt(FSocket, IPPROTO_IP, IP_MULTICAST_TTL, @Result, l); {$ENDIF} end; procedure TUDPBlockSocket.EnableMulticastLoop(Value: Boolean); var d: TSynaOption; begin d := TSynaOption.Create; d.Option := SOT_MulticastLoop; d.Enabled := Value; DelayedOption(d); end; function TUDPBlockSocket.GetSocketType: integer; begin Result := integer(SOCK_DGRAM); end; function TUDPBlockSocket.GetSocketProtocol: integer; begin Result := integer(IPPROTO_UDP); end; {======================================================================} constructor TTCPBlockSocket.CreateWithSSL(SSLPlugin: TSSLClass); begin inherited Create; FSSL := SSLPlugin.Create(self); FHTTPTunnelIP := ''; FHTTPTunnelPort := ''; FHTTPTunnel := False; FHTTPTunnelRemoteIP := ''; FHTTPTunnelRemotePort := ''; FHTTPTunnelUser := ''; FHTTPTunnelPass := ''; FHTTPTunnelTimeout := 30000; end; constructor TTCPBlockSocket.Create; begin CreateWithSSL(SSLImplementation); end; destructor TTCPBlockSocket.Destroy; begin inherited Destroy; FSSL.Free; end; function TTCPBlockSocket.GetErrorDescEx: string; begin Result := inherited GetErrorDescEx; if (FLastError = WSASYSNOTREADY) and (self.SSL.LastError <> 0) then begin Result := self.SSL.LastErrorDesc; end; end; procedure TTCPBlockSocket.CloseSocket; begin if FSSL.SSLEnabled then FSSL.Shutdown; if (FSocket <> INVALID_SOCKET) and (FLastError = 0) then begin Synsock.Shutdown(FSocket, 1); Purge; end; inherited CloseSocket; end; procedure TTCPBlockSocket.DoAfterConnect; begin if assigned(OnAfterConnect) then begin OnAfterConnect(Self); end; end; function TTCPBlockSocket.WaitingData: Integer; begin Result := 0; if FSSL.SSLEnabled and (FSocket <> INVALID_SOCKET) then Result := FSSL.WaitingData; if Result = 0 then Result := inherited WaitingData; end; procedure TTCPBlockSocket.Listen; var b: Boolean; Sip,SPort: string; begin if FSocksIP = '' then begin inherited Listen; end else begin Sip := GetLocalSinIP; if Sip = cAnyHost then Sip := LocalName; SPort := IntToStr(GetLocalSinPort); inherited Connect(FSocksIP, FSocksPort); b := SocksOpen; if b then b := SocksRequest(2, Sip, SPort); if b then b := SocksResponse; if not b and (FLastError = 0) then FLastError := WSANO_RECOVERY; FSocksLocalIP := FSocksResponseIP; if FSocksLocalIP = cAnyHost then FSocksLocalIP := FSocksIP; FSocksLocalPort := FSocksResponsePort; FSocksRemoteIP := ''; FSocksRemotePort := ''; ExceptCheck; DoStatus(HR_Listen, ''); end; end; function TTCPBlockSocket.Accept: TSocket; begin if FUsingSocks then begin if not SocksResponse and (FLastError = 0) then FLastError := WSANO_RECOVERY; FSocksRemoteIP := FSocksResponseIP; FSocksRemotePort := FSocksResponsePort; Result := FSocket; ExceptCheck; DoStatus(HR_Accept, ''); end else begin result := inherited Accept; end; end; procedure TTCPBlockSocket.Connect(IP, Port: string); begin if FSocksIP <> '' then SocksDoConnect(IP, Port) else if FHTTPTunnelIP <> '' then HTTPTunnelDoConnect(IP, Port) else inherited Connect(IP, Port); if FLasterror = 0 then DoAfterConnect; end; procedure TTCPBlockSocket.SocksDoConnect(IP, Port: string); var b: Boolean; begin inherited Connect(FSocksIP, FSocksPort); if FLastError = 0 then begin b := SocksOpen; if b then b := SocksRequest(1, IP, Port); if b then b := SocksResponse; if not b and (FLastError = 0) then FLastError := WSASYSNOTREADY; FSocksLocalIP := FSocksResponseIP; FSocksLocalPort := FSocksResponsePort; FSocksRemoteIP := IP; FSocksRemotePort := Port; end; ExceptCheck; DoStatus(HR_Connect, IP + ':' + Port); end; procedure TTCPBlockSocket.HTTPTunnelDoConnect(IP, Port: string); //bugfixed by Mike Green (mgreen@emixode.com) var s: string; begin Port := IntToStr(ResolvePort(Port)); inherited Connect(FHTTPTunnelIP, FHTTPTunnelPort); if FLastError <> 0 then Exit; FHTTPTunnel := False; if IsIP6(IP) then IP := '[' + IP + ']'; SendString('CONNECT ' + IP + ':' + Port + ' HTTP/1.0' + CRLF); if FHTTPTunnelUser <> '' then Sendstring('Proxy-Authorization: Basic ' + EncodeBase64(FHTTPTunnelUser + ':' + FHTTPTunnelPass) + CRLF); SendString(CRLF); repeat s := RecvTerminated(FHTTPTunnelTimeout, #$0a); if FLastError <> 0 then Break; if (Pos('HTTP/', s) = 1) and (Length(s) > 11) then FHTTPTunnel := s[10] = '2'; until (s = '') or (s = #$0d); if (FLasterror = 0) and not FHTTPTunnel then FLastError := WSASYSNOTREADY; FHTTPTunnelRemoteIP := IP; FHTTPTunnelRemotePort := Port; ExceptCheck; end; procedure TTCPBlockSocket.SSLDoConnect; begin ResetLastError; if not FSSL.Connect then FLastError := WSASYSNOTREADY; ExceptCheck; end; procedure TTCPBlockSocket.SSLDoShutdown; begin ResetLastError; FSSL.BiShutdown; end; function TTCPBlockSocket.GetLocalSinIP: string; begin if FUsingSocks then Result := FSocksLocalIP else Result := inherited GetLocalSinIP; end; function TTCPBlockSocket.GetRemoteSinIP: string; begin if FUsingSocks then Result := FSocksRemoteIP else if FHTTPTunnel then Result := FHTTPTunnelRemoteIP else Result := inherited GetRemoteSinIP; end; function TTCPBlockSocket.GetLocalSinPort: Integer; begin if FUsingSocks then Result := StrToIntDef(FSocksLocalPort, 0) else Result := inherited GetLocalSinPort; end; function TTCPBlockSocket.GetRemoteSinPort: Integer; begin if FUsingSocks then Result := ResolvePort(FSocksRemotePort) else if FHTTPTunnel then Result := StrToIntDef(FHTTPTunnelRemotePort, 0) else Result := inherited GetRemoteSinPort; end; function TTCPBlockSocket.RecvBuffer(Buffer: TMemory; Len: Integer): Integer; begin if FSSL.SSLEnabled then begin Result := 0; if TestStopFlag then Exit; ResetLastError; LimitBandwidth(Len, FMaxRecvBandwidth, FNextRecv); Result := FSSL.RecvBuffer(Buffer, Len); if FSSL.LastError <> 0 then FLastError := WSASYSNOTREADY; ExceptCheck; Inc(FRecvCounter, Result); DoStatus(HR_ReadCount, IntToStr(Result)); DoMonitor(False, Buffer, Result); DoReadFilter(Buffer, Result); end else Result := inherited RecvBuffer(Buffer, Len); end; function TTCPBlockSocket.SendBuffer(Buffer: TMemory; Length: Integer): Integer; var x, y: integer; l, r: integer; {$IFNDEF CIL} p: Pointer; {$ENDIF} begin if FSSL.SSLEnabled then begin Result := 0; if TestStopFlag then Exit; ResetLastError; DoMonitor(True, Buffer, Length); {$IFDEF CIL} Result := FSSL.SendBuffer(Buffer, Length); if FSSL.LastError <> 0 then FLastError := WSASYSNOTREADY; Inc(FSendCounter, Result); DoStatus(HR_WriteCount, IntToStr(Result)); {$ELSE} l := Length; x := 0; while x < l do begin y := l - x; if y > FSendMaxChunk then y := FSendMaxChunk; if y > 0 then begin LimitBandwidth(y, FMaxSendBandwidth, FNextsend); p := IncPoint(Buffer, x); r := FSSL.SendBuffer(p, y); if FSSL.LastError <> 0 then FLastError := WSASYSNOTREADY; if Flasterror <> 0 then Break; Inc(x, r); Inc(Result, r); Inc(FSendCounter, r); DoStatus(HR_WriteCount, IntToStr(r)); end else break; end; {$ENDIF} ExceptCheck; end else Result := inherited SendBuffer(Buffer, Length); end; function TTCPBlockSocket.SSLAcceptConnection: Boolean; begin ResetLastError; if not FSSL.Accept then FLastError := WSASYSNOTREADY; ExceptCheck; Result := FLastError = 0; end; function TTCPBlockSocket.GetSocketType: integer; begin Result := integer(SOCK_STREAM); end; function TTCPBlockSocket.GetSocketProtocol: integer; begin Result := integer(IPPROTO_TCP); end; {======================================================================} function TICMPBlockSocket.GetSocketType: integer; begin Result := integer(SOCK_RAW); end; function TICMPBlockSocket.GetSocketProtocol: integer; begin if FIP6Used then Result := integer(IPPROTO_ICMPV6) else Result := integer(IPPROTO_ICMP); end; {======================================================================} function TRAWBlockSocket.GetSocketType: integer; begin Result := integer(SOCK_RAW); end; function TRAWBlockSocket.GetSocketProtocol: integer; begin Result := integer(IPPROTO_RAW); end; {======================================================================} function TPGMmessageBlockSocket.GetSocketType: integer; begin Result := integer(SOCK_RDM); end; function TPGMmessageBlockSocket.GetSocketProtocol: integer; begin Result := integer(IPPROTO_RM); end; {======================================================================} function TPGMstreamBlockSocket.GetSocketType: integer; begin Result := integer(SOCK_STREAM); end; function TPGMstreamBlockSocket.GetSocketProtocol: integer; begin Result := integer(IPPROTO_RM); end; {======================================================================} constructor TSynaClient.Create; begin inherited Create; FIPInterface := cAnyHost; FTargetHost := cLocalhost; FTargetPort := cAnyPort; FTimeout := 5000; FUsername := ''; FPassword := ''; end; {======================================================================} constructor TCustomSSL.Create(const Value: TTCPBlockSocket); begin inherited Create; FSocket := Value; FSSLEnabled := False; FUsername := ''; FPassword := ''; FLastError := 0; FLastErrorDesc := ''; FVerifyCert := False; FSSLType := LT_all; FKeyPassword := ''; FCiphers := ''; FCertificateFile := ''; FPrivateKeyFile := ''; FCertCAFile := ''; FCertCA := ''; FTrustCertificate := ''; FTrustCertificateFile := ''; FCertificate := ''; FPrivateKey := ''; FPFX := ''; FPFXfile := ''; FSSHChannelType := ''; FSSHChannelArg1 := ''; FSSHChannelArg2 := ''; FCertComplianceLevel := -1; //default FSNIHost := ''; end; procedure TCustomSSL.Assign(const Value: TCustomSSL); begin FUsername := Value.Username; FPassword := Value.Password; FVerifyCert := Value.VerifyCert; FSSLType := Value.SSLType; FKeyPassword := Value.KeyPassword; FCiphers := Value.Ciphers; FCertificateFile := Value.CertificateFile; FPrivateKeyFile := Value.PrivateKeyFile; FCertCAFile := Value.CertCAFile; FCertCA := Value.CertCA; FTrustCertificate := Value.TrustCertificate; FTrustCertificateFile := Value.TrustCertificateFile; FCertificate := Value.Certificate; FPrivateKey := Value.PrivateKey; FPFX := Value.PFX; FPFXfile := Value.PFXfile; FCertComplianceLevel := Value.CertComplianceLevel; FSNIHost := Value.FSNIHost; end; procedure TCustomSSL.ReturnError; begin FLastError := -1; FLastErrorDesc := 'SSL/TLS support is not compiled!'; end; function TCustomSSL.LibVersion: String; begin Result := ''; end; function TCustomSSL.LibName: String; begin Result := ''; end; function TCustomSSL.CreateSelfSignedCert(Host: string): Boolean; begin Result := False; end; function TCustomSSL.Connect: boolean; begin ReturnError; Result := False; end; function TCustomSSL.Accept: boolean; begin ReturnError; Result := False; end; function TCustomSSL.Shutdown: boolean; begin ReturnError; Result := False; end; function TCustomSSL.BiShutdown: boolean; begin ReturnError; Result := False; end; function TCustomSSL.SendBuffer(Buffer: TMemory; Len: Integer): Integer; begin ReturnError; Result := integer(SOCKET_ERROR); end; procedure TCustomSSL.SetCertCAFile(const Value: string); begin FCertCAFile := Value; end; function TCustomSSL.RecvBuffer(Buffer: TMemory; Len: Integer): Integer; begin ReturnError; Result := integer(SOCKET_ERROR); end; function TCustomSSL.WaitingData: Integer; begin ReturnError; Result := 0; end; function TCustomSSL.GetSSLVersion: string; begin Result := ''; end; function TCustomSSL.GetPeerSubject: string; begin Result := ''; end; function TCustomSSL.GetPeerSerialNo: integer; begin Result := -1; end; function TCustomSSL.GetPeerName: string; begin Result := ''; end; function TCustomSSL.GetPeerNameHash: cardinal; begin Result := 0; end; function TCustomSSL.GetPeerIssuer: string; begin Result := ''; end; function TCustomSSL.GetPeerFingerprint: string; begin Result := ''; end; function TCustomSSL.GetCertInfo: string; begin Result := ''; end; function TCustomSSL.GetCipherName: string; begin Result := ''; end; function TCustomSSL.GetCipherBits: integer; begin Result := 0; end; function TCustomSSL.GetCipherAlgBits: integer; begin Result := 0; end; function TCustomSSL.GetVerifyCert: integer; begin Result := 1; end; function TCustomSSL.DoVerifyCert:boolean; begin if assigned(OnVerifyCert) then begin result:=OnVerifyCert(Self); end else result:=true; end; {======================================================================} function TSSLNone.LibVersion: String; begin Result := 'Without SSL support'; end; function TSSLNone.LibName: String; begin Result := 'ssl_none'; end; {======================================================================} initialization begin {$IFDEF ONCEWINSOCK} if not InitSocketInterface(DLLStackName) then begin e := ESynapseError.Create('Error loading Socket interface (' + DLLStackName + ')!'); e.ErrorCode := 0; e.ErrorMessage := 'Error loading Socket interface (' + DLLStackName + ')!'; raise e; end; synsock.WSAStartup(WinsockLevel, WsaDataOnce); {$ENDIF} end; finalization begin {$IFDEF ONCEWINSOCK} synsock.WSACleanup; DestroySocketInterface; {$ENDIF} end; end. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/synapse/synacode.pas������������������������������������������������0000644�0001750�0001750�00000142656�12014201074�021565� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{==============================================================================| | Project : Ararat Synapse | 002.002.001 | |==============================================================================| | Content: Coding and decoding support | |==============================================================================| | Copyright (c)1999-2012, Lukas Gebauer | | All rights reserved. | | | | Redistribution and use in source and binary forms, with or without | | modification, are permitted provided that the following conditions are met: | | | | Redistributions of source code must retain the above copyright notice, this | | list of conditions and the following disclaimer. | | | | Redistributions in binary form must reproduce the above copyright notice, | | this list of conditions and the following disclaimer in the documentation | | and/or other materials provided with the distribution. | | | | Neither the name of Lukas Gebauer nor the names of its contributors may | | be used to endorse or promote products derived from this software without | | specific prior written permission. | | | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | | ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR | | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | | DAMAGE. | |==============================================================================| | The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).| | Portions created by Lukas Gebauer are Copyright (c)2000-2012. | | All Rights Reserved. | |==============================================================================| | Contributor(s): | |==============================================================================| | History: see HISTORY.HTM from distribution package | | (Found at URL: http://www.ararat.cz/synapse/) | |==============================================================================} {:@abstract(Various encoding and decoding support)} {$IFDEF FPC} {$MODE DELPHI} {$ENDIF} {$Q-} {$R-} {$H+} {$TYPEDADDRESS OFF} {$IFDEF UNICODE} {$WARN IMPLICIT_STRING_CAST OFF} {$WARN IMPLICIT_STRING_CAST_LOSS OFF} {$WARN SUSPICIOUS_TYPECAST OFF} {$ENDIF} unit synacode; interface uses SysUtils; type TSpecials = set of AnsiChar; const SpecialChar: TSpecials = ['=', '(', ')', '[', ']', '<', '>', ':', ';', ',', '@', '/', '?', '\', '"', '_']; NonAsciiChar: TSpecials = [#0..#31, #127..#255]; URLFullSpecialChar: TSpecials = [';', '/', '?', ':', '@', '=', '&', '#', '+']; URLSpecialChar: TSpecials = [#$00..#$20, '_', '<', '>', '"', '%', '{', '}', '|', '\', '^', '~', '[', ']', '`', #$7F..#$FF]; TableBase64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; TableBase64mod = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,='; TableUU = '`!"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'; TableXX = '+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; ReTablebase64 = #$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$3E +#$40 +#$40 +#$40 +#$3F +#$34 +#$35 +#$36 +#$37 +#$38 +#$39 +#$3A +#$3B +#$3C +#$3D +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$00 +#$01 +#$02 +#$03 +#$04 +#$05 +#$06 +#$07 +#$08 +#$09 +#$0A +#$0B +#$0C +#$0D +#$0E +#$0F +#$10 +#$11 +#$12 +#$13 +#$14 +#$15 +#$16 +#$17 +#$18 +#$19 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$1A +#$1B +#$1C +#$1D +#$1E +#$1F +#$20 +#$21 +#$22 +#$23 +#$24 +#$25 +#$26 +#$27 +#$28 +#$29 +#$2A +#$2B +#$2C +#$2D +#$2E +#$2F +#$30 +#$31 +#$32 +#$33 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40; ReTableUU = #$01 +#$02 +#$03 +#$04 +#$05 +#$06 +#$07 +#$08 +#$09 +#$0A +#$0B +#$0C +#$0D +#$0E +#$0F +#$10 +#$11 +#$12 +#$13 +#$14 +#$15 +#$16 +#$17 +#$18 +#$19 +#$1A +#$1B +#$1C +#$1D +#$1E +#$1F +#$20 +#$21 +#$22 +#$23 +#$24 +#$25 +#$26 +#$27 +#$28 +#$29 +#$2A +#$2B +#$2C +#$2D +#$2E +#$2F +#$30 +#$31 +#$32 +#$33 +#$34 +#$35 +#$36 +#$37 +#$38 +#$39 +#$3A +#$3B +#$3C +#$3D +#$3E +#$3F +#$00 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40; ReTableXX = #$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$00 +#$40 +#$01 +#$40 +#$40 +#$02 +#$03 +#$04 +#$05 +#$06 +#$07 +#$08 +#$09 +#$0A +#$0B +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$0C +#$0D +#$0E +#$0F +#$10 +#$11 +#$12 +#$13 +#$14 +#$15 +#$16 +#$17 +#$18 +#$19 +#$1A +#$1B +#$1C +#$1D +#$1E +#$1F +#$20 +#$21 +#$22 +#$23 +#$24 +#$25 +#$40 +#$40 +#$40 +#$40 +#$40 +#$40 +#$26 +#$27 +#$28 +#$29 +#$2A +#$2B +#$2C +#$2D +#$2E +#$2F +#$30 +#$31 +#$32 +#$33 +#$34 +#$35 +#$36 +#$37 +#$38 +#$39 +#$3A +#$3B +#$3C +#$3D +#$3E +#$3F +#$40 +#$40 +#$40 +#$40 +#$40 +#$40; {:Decodes triplet encoding with a given character delimiter. It is used for decoding quoted-printable or URL encoding.} function DecodeTriplet(const Value: AnsiString; Delimiter: AnsiChar): AnsiString; {:Decodes a string from quoted printable form. (also decodes triplet sequences like '=7F')} function DecodeQuotedPrintable(const Value: AnsiString): AnsiString; {:Decodes a string of URL encoding. (also decodes triplet sequences like '%7F')} function DecodeURL(const Value: AnsiString): AnsiString; {:Performs triplet encoding with a given character delimiter. Used for encoding quoted-printable or URL encoding.} function EncodeTriplet(const Value: AnsiString; Delimiter: AnsiChar; Specials: TSpecials): AnsiString; {:Encodes a string to triplet quoted printable form. All @link(NonAsciiChar) are encoded.} function EncodeQuotedPrintable(const Value: AnsiString): AnsiString; {:Encodes a string to triplet quoted printable form. All @link(NonAsciiChar) and @link(SpecialChar) are encoded.} function EncodeSafeQuotedPrintable(const Value: AnsiString): AnsiString; {:Encodes a string to URL format. Used for encoding data from a form field in HTTP, etc. (Encodes all critical characters including characters used as URL delimiters ('/',':', etc.)} function EncodeURLElement(const Value: AnsiString): AnsiString; {:Encodes a string to URL format. Used to encode critical characters in all URLs.} function EncodeURL(const Value: AnsiString): AnsiString; {:Decode 4to3 encoding with given table. If some element is not found in table, first item from table is used. This is good for buggy coded items by Microsoft Outlook. This software sometimes using wrong table for UUcode, where is used ' ' instead '`'.} function Decode4to3(const Value, Table: AnsiString): AnsiString; {:Decode 4to3 encoding with given REVERSE table. Using this function with reverse table is much faster then @link(Decode4to3). This function is used internally for Base64, UU or XX decoding.} function Decode4to3Ex(const Value, Table: AnsiString): AnsiString; {:Encode by system 3to4 (used by Base64, UU coding, etc) by given table.} function Encode3to4(const Value, Table: AnsiString): AnsiString; {:Decode string from base64 format.} function DecodeBase64(const Value: AnsiString): AnsiString; {:Encodes a string to base64 format.} function EncodeBase64(const Value: AnsiString): AnsiString; {:Decode string from modified base64 format. (used in IMAP, for example.)} function DecodeBase64mod(const Value: AnsiString): AnsiString; {:Encodes a string to modified base64 format. (used in IMAP, for example.)} function EncodeBase64mod(const Value: AnsiString): AnsiString; {:Decodes a string from UUcode format.} function DecodeUU(const Value: AnsiString): AnsiString; {:encode UUcode. it encode only datas, you must also add header and footer for proper encode.} function EncodeUU(const Value: AnsiString): AnsiString; {:Decodes a string from XXcode format.} function DecodeXX(const Value: AnsiString): AnsiString; {:decode line with Yenc code. This code is sometimes used in newsgroups.} function DecodeYEnc(const Value: AnsiString): AnsiString; {:Returns a new CRC32 value after adding a new byte of data.} function UpdateCrc32(Value: Byte; Crc32: Integer): Integer; {:return CRC32 from a value string.} function Crc32(const Value: AnsiString): Integer; {:Returns a new CRC16 value after adding a new byte of data.} function UpdateCrc16(Value: Byte; Crc16: Word): Word; {:return CRC16 from a value string.} function Crc16(const Value: AnsiString): Word; {:Returns a binary string with a RSA-MD5 hashing of "Value" string.} function MD5(const Value: AnsiString): AnsiString; {:Returns a binary string with HMAC-MD5 hash.} function HMAC_MD5(Text, Key: AnsiString): AnsiString; {:Returns a binary string with a RSA-MD5 hashing of string what is constructed by repeating "value" until length is "Len".} function MD5LongHash(const Value: AnsiString; Len: integer): AnsiString; {:Returns a binary string with a SHA-1 hashing of "Value" string.} function SHA1(const Value: AnsiString): AnsiString; {:Returns a binary string with HMAC-SHA1 hash.} function HMAC_SHA1(Text, Key: AnsiString): AnsiString; {:Returns a binary string with a SHA-1 hashing of string what is constructed by repeating "value" until length is "Len".} function SHA1LongHash(const Value: AnsiString; Len: integer): AnsiString; {:Returns a binary string with a RSA-MD4 hashing of "Value" string.} function MD4(const Value: AnsiString): AnsiString; implementation const Crc32Tab: array[0..255] of Integer = ( Integer($00000000), Integer($77073096), Integer($EE0E612C), Integer($990951BA), Integer($076DC419), Integer($706AF48F), Integer($E963A535), Integer($9E6495A3), Integer($0EDB8832), Integer($79DCB8A4), Integer($E0D5E91E), Integer($97D2D988), Integer($09B64C2B), Integer($7EB17CBD), Integer($E7B82D07), Integer($90BF1D91), Integer($1DB71064), Integer($6AB020F2), Integer($F3B97148), Integer($84BE41DE), Integer($1ADAD47D), Integer($6DDDE4EB), Integer($F4D4B551), Integer($83D385C7), Integer($136C9856), Integer($646BA8C0), Integer($FD62F97A), Integer($8A65C9EC), Integer($14015C4F), Integer($63066CD9), Integer($FA0F3D63), Integer($8D080DF5), Integer($3B6E20C8), Integer($4C69105E), Integer($D56041E4), Integer($A2677172), Integer($3C03E4D1), Integer($4B04D447), Integer($D20D85FD), Integer($A50AB56B), Integer($35B5A8FA), Integer($42B2986C), Integer($DBBBC9D6), Integer($ACBCF940), Integer($32D86CE3), Integer($45DF5C75), Integer($DCD60DCF), Integer($ABD13D59), Integer($26D930AC), Integer($51DE003A), Integer($C8D75180), Integer($BFD06116), Integer($21B4F4B5), Integer($56B3C423), Integer($CFBA9599), Integer($B8BDA50F), Integer($2802B89E), Integer($5F058808), Integer($C60CD9B2), Integer($B10BE924), Integer($2F6F7C87), Integer($58684C11), Integer($C1611DAB), Integer($B6662D3D), Integer($76DC4190), Integer($01DB7106), Integer($98D220BC), Integer($EFD5102A), Integer($71B18589), Integer($06B6B51F), Integer($9FBFE4A5), Integer($E8B8D433), Integer($7807C9A2), Integer($0F00F934), Integer($9609A88E), Integer($E10E9818), Integer($7F6A0DBB), Integer($086D3D2D), Integer($91646C97), Integer($E6635C01), Integer($6B6B51F4), Integer($1C6C6162), Integer($856530D8), Integer($F262004E), Integer($6C0695ED), Integer($1B01A57B), Integer($8208F4C1), Integer($F50FC457), Integer($65B0D9C6), Integer($12B7E950), Integer($8BBEB8EA), Integer($FCB9887C), Integer($62DD1DDF), Integer($15DA2D49), Integer($8CD37CF3), Integer($FBD44C65), Integer($4DB26158), Integer($3AB551CE), Integer($A3BC0074), Integer($D4BB30E2), Integer($4ADFA541), Integer($3DD895D7), Integer($A4D1C46D), Integer($D3D6F4FB), Integer($4369E96A), Integer($346ED9FC), Integer($AD678846), Integer($DA60B8D0), Integer($44042D73), Integer($33031DE5), Integer($AA0A4C5F), Integer($DD0D7CC9), Integer($5005713C), Integer($270241AA), Integer($BE0B1010), Integer($C90C2086), Integer($5768B525), Integer($206F85B3), Integer($B966D409), Integer($CE61E49F), Integer($5EDEF90E), Integer($29D9C998), Integer($B0D09822), Integer($C7D7A8B4), Integer($59B33D17), Integer($2EB40D81), Integer($B7BD5C3B), Integer($C0BA6CAD), Integer($EDB88320), Integer($9ABFB3B6), Integer($03B6E20C), Integer($74B1D29A), Integer($EAD54739), Integer($9DD277AF), Integer($04DB2615), Integer($73DC1683), Integer($E3630B12), Integer($94643B84), Integer($0D6D6A3E), Integer($7A6A5AA8), Integer($E40ECF0B), Integer($9309FF9D), Integer($0A00AE27), Integer($7D079EB1), Integer($F00F9344), Integer($8708A3D2), Integer($1E01F268), Integer($6906C2FE), Integer($F762575D), Integer($806567CB), Integer($196C3671), Integer($6E6B06E7), Integer($FED41B76), Integer($89D32BE0), Integer($10DA7A5A), Integer($67DD4ACC), Integer($F9B9DF6F), Integer($8EBEEFF9), Integer($17B7BE43), Integer($60B08ED5), Integer($D6D6A3E8), Integer($A1D1937E), Integer($38D8C2C4), Integer($4FDFF252), Integer($D1BB67F1), Integer($A6BC5767), Integer($3FB506DD), Integer($48B2364B), Integer($D80D2BDA), Integer($AF0A1B4C), Integer($36034AF6), Integer($41047A60), Integer($DF60EFC3), Integer($A867DF55), Integer($316E8EEF), Integer($4669BE79), Integer($CB61B38C), Integer($BC66831A), Integer($256FD2A0), Integer($5268E236), Integer($CC0C7795), Integer($BB0B4703), Integer($220216B9), Integer($5505262F), Integer($C5BA3BBE), Integer($B2BD0B28), Integer($2BB45A92), Integer($5CB36A04), Integer($C2D7FFA7), Integer($B5D0CF31), Integer($2CD99E8B), Integer($5BDEAE1D), Integer($9B64C2B0), Integer($EC63F226), Integer($756AA39C), Integer($026D930A), Integer($9C0906A9), Integer($EB0E363F), Integer($72076785), Integer($05005713), Integer($95BF4A82), Integer($E2B87A14), Integer($7BB12BAE), Integer($0CB61B38), Integer($92D28E9B), Integer($E5D5BE0D), Integer($7CDCEFB7), Integer($0BDBDF21), Integer($86D3D2D4), Integer($F1D4E242), Integer($68DDB3F8), Integer($1FDA836E), Integer($81BE16CD), Integer($F6B9265B), Integer($6FB077E1), Integer($18B74777), Integer($88085AE6), Integer($FF0F6A70), Integer($66063BCA), Integer($11010B5C), Integer($8F659EFF), Integer($F862AE69), Integer($616BFFD3), Integer($166CCF45), Integer($A00AE278), Integer($D70DD2EE), Integer($4E048354), Integer($3903B3C2), Integer($A7672661), Integer($D06016F7), Integer($4969474D), Integer($3E6E77DB), Integer($AED16A4A), Integer($D9D65ADC), Integer($40DF0B66), Integer($37D83BF0), Integer($A9BCAE53), Integer($DEBB9EC5), Integer($47B2CF7F), Integer($30B5FFE9), Integer($BDBDF21C), Integer($CABAC28A), Integer($53B39330), Integer($24B4A3A6), Integer($BAD03605), Integer($CDD70693), Integer($54DE5729), Integer($23D967BF), Integer($B3667A2E), Integer($C4614AB8), Integer($5D681B02), Integer($2A6F2B94), Integer($B40BBE37), Integer($C30C8EA1), Integer($5A05DF1B), Integer($2D02EF8D) ); Crc16Tab: array[0..255] of Word = ( $0000, $1189, $2312, $329B, $4624, $57AD, $6536, $74BF, $8C48, $9DC1, $AF5A, $BED3, $CA6C, $DBE5, $E97E, $F8F7, $1081, $0108, $3393, $221A, $56A5, $472C, $75B7, $643E, $9CC9, $8D40, $BFDB, $AE52, $DAED, $CB64, $F9FF, $E876, $2102, $308B, $0210, $1399, $6726, $76AF, $4434, $55BD, $AD4A, $BCC3, $8E58, $9FD1, $EB6E, $FAE7, $C87C, $D9F5, $3183, $200A, $1291, $0318, $77A7, $662E, $54B5, $453C, $BDCB, $AC42, $9ED9, $8F50, $FBEF, $EA66, $D8FD, $C974, $4204, $538D, $6116, $709F, $0420, $15A9, $2732, $36BB, $CE4C, $DFC5, $ED5E, $FCD7, $8868, $99E1, $AB7A, $BAF3, $5285, $430C, $7197, $601E, $14A1, $0528, $37B3, $263A, $DECD, $CF44, $FDDF, $EC56, $98E9, $8960, $BBFB, $AA72, $6306, $728F, $4014, $519D, $2522, $34AB, $0630, $17B9, $EF4E, $FEC7, $CC5C, $DDD5, $A96A, $B8E3, $8A78, $9BF1, $7387, $620E, $5095, $411C, $35A3, $242A, $16B1, $0738, $FFCF, $EE46, $DCDD, $CD54, $B9EB, $A862, $9AF9, $8B70, $8408, $9581, $A71A, $B693, $C22C, $D3A5, $E13E, $F0B7, $0840, $19C9, $2B52, $3ADB, $4E64, $5FED, $6D76, $7CFF, $9489, $8500, $B79B, $A612, $D2AD, $C324, $F1BF, $E036, $18C1, $0948, $3BD3, $2A5A, $5EE5, $4F6C, $7DF7, $6C7E, $A50A, $B483, $8618, $9791, $E32E, $F2A7, $C03C, $D1B5, $2942, $38CB, $0A50, $1BD9, $6F66, $7EEF, $4C74, $5DFD, $B58B, $A402, $9699, $8710, $F3AF, $E226, $D0BD, $C134, $39C3, $284A, $1AD1, $0B58, $7FE7, $6E6E, $5CF5, $4D7C, $C60C, $D785, $E51E, $F497, $8028, $91A1, $A33A, $B2B3, $4A44, $5BCD, $6956, $78DF, $0C60, $1DE9, $2F72, $3EFB, $D68D, $C704, $F59F, $E416, $90A9, $8120, $B3BB, $A232, $5AC5, $4B4C, $79D7, $685E, $1CE1, $0D68, $3FF3, $2E7A, $E70E, $F687, $C41C, $D595, $A12A, $B0A3, $8238, $93B1, $6B46, $7ACF, $4854, $59DD, $2D62, $3CEB, $0E70, $1FF9, $F78F, $E606, $D49D, $C514, $B1AB, $A022, $92B9, $8330, $7BC7, $6A4E, $58D5, $495C, $3DE3, $2C6A, $1EF1, $0F78 ); procedure ArrByteToLong(var ArByte: Array of byte; var ArLong: Array of Integer); {$IFDEF CIL} var n: integer; {$ENDIF} begin if (High(ArByte) + 1) > ((High(ArLong) + 1) * 4) then Exit; {$IFDEF CIL} for n := 0 to ((high(ArByte) + 1) div 4) - 1 do ArLong[n] := ArByte[n * 4 + 0] + (ArByte[n * 4 + 1] shl 8) + (ArByte[n * 4 + 2] shl 16) + (ArByte[n * 4 + 3] shl 24); {$ELSE} Move(ArByte[0], ArLong[0], High(ArByte) + 1); {$ENDIF} end; procedure ArrLongToByte(var ArLong: Array of Integer; var ArByte: Array of byte); {$IFDEF CIL} var n: integer; {$ENDIF} begin if (High(ArByte) + 1) < ((High(ArLong) + 1) * 4) then Exit; {$IFDEF CIL} for n := 0 to high(ArLong) do begin ArByte[n * 4 + 0] := ArLong[n] and $000000FF; ArByte[n * 4 + 1] := (ArLong[n] shr 8) and $000000FF; ArByte[n * 4 + 2] := (ArLong[n] shr 16) and $000000FF; ArByte[n * 4 + 3] := (ArLong[n] shr 24) and $000000FF; end; {$ELSE} Move(ArLong[0], ArByte[0], High(ArByte) + 1); {$ENDIF} end; type TMDCtx = record State: array[0..3] of Integer; Count: array[0..1] of Integer; BufAnsiChar: array[0..63] of Byte; BufLong: array[0..15] of Integer; end; TSHA1Ctx= record Hi, Lo: integer; Buffer: array[0..63] of byte; Index: integer; Hash: array[0..4] of Integer; HashByte: array[0..19] of byte; end; TMDTransform = procedure(var Buf: array of LongInt; const Data: array of LongInt); {==============================================================================} function DecodeTriplet(const Value: AnsiString; Delimiter: AnsiChar): AnsiString; var x, l, lv: Integer; c: AnsiChar; b: Byte; bad: Boolean; begin lv := Length(Value); SetLength(Result, lv); x := 1; l := 1; while x <= lv do begin c := Value[x]; Inc(x); if c <> Delimiter then begin Result[l] := c; Inc(l); end else if x < lv then begin Case Value[x] Of #13: if (Value[x + 1] = #10) then Inc(x, 2) else Inc(x); #10: if (Value[x + 1] = #13) then Inc(x, 2) else Inc(x); else begin bad := False; Case Value[x] Of '0'..'9': b := (Byte(Value[x]) - 48) Shl 4; 'a'..'f', 'A'..'F': b := ((Byte(Value[x]) And 7) + 9) shl 4; else begin b := 0; bad := True; end; end; Case Value[x + 1] Of '0'..'9': b := b Or (Byte(Value[x + 1]) - 48); 'a'..'f', 'A'..'F': b := b Or ((Byte(Value[x + 1]) And 7) + 9); else bad := True; end; if bad then begin Result[l] := c; Inc(l); end else begin Inc(x, 2); Result[l] := AnsiChar(b); Inc(l); end; end; end; end else break; end; Dec(l); SetLength(Result, l); end; {==============================================================================} function DecodeQuotedPrintable(const Value: AnsiString): AnsiString; begin Result := DecodeTriplet(Value, '='); end; {==============================================================================} function DecodeURL(const Value: AnsiString): AnsiString; begin Result := DecodeTriplet(Value, '%'); end; {==============================================================================} function EncodeTriplet(const Value: AnsiString; Delimiter: AnsiChar; Specials: TSpecials): AnsiString; var n, l: Integer; s: AnsiString; c: AnsiChar; begin SetLength(Result, Length(Value) * 3); l := 1; for n := 1 to Length(Value) do begin c := Value[n]; if c in Specials then begin Result[l] := Delimiter; Inc(l); s := IntToHex(Ord(c), 2); Result[l] := s[1]; Inc(l); Result[l] := s[2]; Inc(l); end else begin Result[l] := c; Inc(l); end; end; Dec(l); SetLength(Result, l); end; {==============================================================================} function EncodeQuotedPrintable(const Value: AnsiString): AnsiString; begin Result := EncodeTriplet(Value, '=', ['='] + NonAsciiChar); end; {==============================================================================} function EncodeSafeQuotedPrintable(const Value: AnsiString): AnsiString; begin Result := EncodeTriplet(Value, '=', SpecialChar + NonAsciiChar); end; {==============================================================================} function EncodeURLElement(const Value: AnsiString): AnsiString; begin Result := EncodeTriplet(Value, '%', URLSpecialChar + URLFullSpecialChar); end; {==============================================================================} function EncodeURL(const Value: AnsiString): AnsiString; begin Result := EncodeTriplet(Value, '%', URLSpecialChar); end; {==============================================================================} function Decode4to3(const Value, Table: AnsiString): AnsiString; var x, y, n, l: Integer; d: array[0..3] of Byte; begin SetLength(Result, Length(Value)); x := 1; l := 1; while x <= Length(Value) do begin for n := 0 to 3 do begin if x > Length(Value) then d[n] := 64 else begin y := Pos(Value[x], Table); if y < 1 then y := 1; d[n] := y - 1; end; Inc(x); end; Result[l] := AnsiChar((D[0] and $3F) shl 2 + (D[1] and $30) shr 4); Inc(l); if d[2] <> 64 then begin Result[l] := AnsiChar((D[1] and $0F) shl 4 + (D[2] and $3C) shr 2); Inc(l); if d[3] <> 64 then begin Result[l] := AnsiChar((D[2] and $03) shl 6 + (D[3] and $3F)); Inc(l); end; end; end; Dec(l); SetLength(Result, l); end; {==============================================================================} function Decode4to3Ex(const Value, Table: AnsiString): AnsiString; var x, y, lv: Integer; d: integer; dl: integer; c: byte; p: integer; begin lv := Length(Value); SetLength(Result, lv); x := 1; dl := 4; d := 0; p := 1; while x <= lv do begin y := Ord(Value[x]); if y in [33..127] then c := Ord(Table[y - 32]) else c := 64; Inc(x); if c > 63 then continue; d := (d shl 6) or c; dec(dl); if dl <> 0 then continue; Result[p] := AnsiChar((d shr 16) and $ff); inc(p); Result[p] := AnsiChar((d shr 8) and $ff); inc(p); Result[p] := AnsiChar(d and $ff); inc(p); d := 0; dl := 4; end; case dl of 1: begin d := d shr 2; Result[p] := AnsiChar((d shr 8) and $ff); inc(p); Result[p] := AnsiChar(d and $ff); inc(p); end; 2: begin d := d shr 4; Result[p] := AnsiChar(d and $ff); inc(p); end; end; SetLength(Result, p - 1); end; {==============================================================================} function Encode3to4(const Value, Table: AnsiString): AnsiString; var c: Byte; n, l: Integer; Count: Integer; DOut: array[0..3] of Byte; begin setlength(Result, ((Length(Value) + 2) div 3) * 4); l := 1; Count := 1; while Count <= Length(Value) do begin c := Ord(Value[Count]); Inc(Count); DOut[0] := (c and $FC) shr 2; DOut[1] := (c and $03) shl 4; if Count <= Length(Value) then begin c := Ord(Value[Count]); Inc(Count); DOut[1] := DOut[1] + (c and $F0) shr 4; DOut[2] := (c and $0F) shl 2; if Count <= Length(Value) then begin c := Ord(Value[Count]); Inc(Count); DOut[2] := DOut[2] + (c and $C0) shr 6; DOut[3] := (c and $3F); end else begin DOut[3] := $40; end; end else begin DOut[2] := $40; DOut[3] := $40; end; for n := 0 to 3 do begin if (DOut[n] + 1) <= Length(Table) then begin Result[l] := Table[DOut[n] + 1]; Inc(l); end; end; end; SetLength(Result, l - 1); end; {==============================================================================} function DecodeBase64(const Value: AnsiString): AnsiString; begin Result := Decode4to3Ex(Value, ReTableBase64); end; {==============================================================================} function EncodeBase64(const Value: AnsiString): AnsiString; begin Result := Encode3to4(Value, TableBase64); end; {==============================================================================} function DecodeBase64mod(const Value: AnsiString): AnsiString; begin Result := Decode4to3(Value, TableBase64mod); end; {==============================================================================} function EncodeBase64mod(const Value: AnsiString): AnsiString; begin Result := Encode3to4(Value, TableBase64mod); end; {==============================================================================} function DecodeUU(const Value: AnsiString): AnsiString; var s: AnsiString; uut: AnsiString; x: Integer; begin Result := ''; uut := TableUU; s := trim(UpperCase(Value)); if s = '' then Exit; if Pos('BEGIN', s) = 1 then Exit; if Pos('END', s) = 1 then Exit; if Pos('TABLE', s) = 1 then Exit; //ignore Table yet (set custom UUT) //begin decoding x := Pos(Value[1], uut) - 1; case (x mod 3) of 0: x :=(x div 3)* 4; 1: x :=((x div 3) * 4) + 2; 2: x :=((x div 3) * 4) + 3; end; //x - lenght UU line s := Copy(Value, 2, x); if s = '' then Exit; s := s + StringOfChar(' ', x - length(s)); Result := Decode4to3(s, uut); end; {==============================================================================} function EncodeUU(const Value: AnsiString): AnsiString; begin Result := ''; if Length(Value) < Length(TableUU) then Result := TableUU[Length(Value) + 1] + Encode3to4(Value, TableUU); end; {==============================================================================} function DecodeXX(const Value: AnsiString): AnsiString; var s: AnsiString; x: Integer; begin Result := ''; s := trim(UpperCase(Value)); if s = '' then Exit; if Pos('BEGIN', s) = 1 then Exit; if Pos('END', s) = 1 then Exit; //begin decoding x := Pos(Value[1], TableXX) - 1; case (x mod 3) of 0: x :=(x div 3)* 4; 1: x :=((x div 3) * 4) + 2; 2: x :=((x div 3) * 4) + 3; end; //x - lenght XX line s := Copy(Value, 2, x); if s = '' then Exit; s := s + StringOfChar(' ', x - length(s)); Result := Decode4to3(s, TableXX); end; {==============================================================================} function DecodeYEnc(const Value: AnsiString): AnsiString; var C : Byte; i: integer; begin Result := ''; i := 1; while i <= Length(Value) do begin c := Ord(Value[i]); Inc(i); if c = Ord('=') then begin c := Ord(Value[i]); Inc(i); Dec(c, 64); end; Dec(C, 42); Result := Result + AnsiChar(C); end; end; {==============================================================================} function UpdateCrc32(Value: Byte; Crc32: Integer): Integer; begin Result := (Crc32 shr 8) xor crc32tab[Byte(Value xor (Crc32 and Integer($000000FF)))]; end; {==============================================================================} function Crc32(const Value: AnsiString): Integer; var n: Integer; begin Result := Integer($FFFFFFFF); for n := 1 to Length(Value) do Result := UpdateCrc32(Ord(Value[n]), Result); Result := not Result; end; {==============================================================================} function UpdateCrc16(Value: Byte; Crc16: Word): Word; begin Result := ((Crc16 shr 8) and $00FF) xor crc16tab[Byte(Crc16 xor (Word(Value)) and $00FF)]; end; {==============================================================================} function Crc16(const Value: AnsiString): Word; var n: Integer; begin Result := $FFFF; for n := 1 to Length(Value) do Result := UpdateCrc16(Ord(Value[n]), Result); end; {==============================================================================} procedure MDInit(var MDContext: TMDCtx); var n: integer; begin MDContext.Count[0] := 0; MDContext.Count[1] := 0; for n := 0 to high(MDContext.BufAnsiChar) do MDContext.BufAnsiChar[n] := 0; for n := 0 to high(MDContext.BufLong) do MDContext.BufLong[n] := 0; MDContext.State[0] := Integer($67452301); MDContext.State[1] := Integer($EFCDAB89); MDContext.State[2] := Integer($98BADCFE); MDContext.State[3] := Integer($10325476); end; procedure MD5Transform(var Buf: array of LongInt; const Data: array of LongInt); var A, B, C, D: LongInt; procedure Round1(var W: LongInt; X, Y, Z, Data: LongInt; S: Byte); begin Inc(W, (Z xor (X and (Y xor Z))) + Data); W := (W shl S) or (W shr (32 - S)); Inc(W, X); end; procedure Round2(var W: LongInt; X, Y, Z, Data: LongInt; S: Byte); begin Inc(W, (Y xor (Z and (X xor Y))) + Data); W := (W shl S) or (W shr (32 - S)); Inc(W, X); end; procedure Round3(var W: LongInt; X, Y, Z, Data: LongInt; S: Byte); begin Inc(W, (X xor Y xor Z) + Data); W := (W shl S) or (W shr (32 - S)); Inc(W, X); end; procedure Round4(var W: LongInt; X, Y, Z, Data: LongInt; S: Byte); begin Inc(W, (Y xor (X or not Z)) + Data); W := (W shl S) or (W shr (32 - S)); Inc(W, X); end; begin A := Buf[0]; B := Buf[1]; C := Buf[2]; D := Buf[3]; Round1(A, B, C, D, Data[0] + Longint($D76AA478), 7); Round1(D, A, B, C, Data[1] + Longint($E8C7B756), 12); Round1(C, D, A, B, Data[2] + Longint($242070DB), 17); Round1(B, C, D, A, Data[3] + Longint($C1BDCEEE), 22); Round1(A, B, C, D, Data[4] + Longint($F57C0FAF), 7); Round1(D, A, B, C, Data[5] + Longint($4787C62A), 12); Round1(C, D, A, B, Data[6] + Longint($A8304613), 17); Round1(B, C, D, A, Data[7] + Longint($FD469501), 22); Round1(A, B, C, D, Data[8] + Longint($698098D8), 7); Round1(D, A, B, C, Data[9] + Longint($8B44F7AF), 12); Round1(C, D, A, B, Data[10] + Longint($FFFF5BB1), 17); Round1(B, C, D, A, Data[11] + Longint($895CD7BE), 22); Round1(A, B, C, D, Data[12] + Longint($6B901122), 7); Round1(D, A, B, C, Data[13] + Longint($FD987193), 12); Round1(C, D, A, B, Data[14] + Longint($A679438E), 17); Round1(B, C, D, A, Data[15] + Longint($49B40821), 22); Round2(A, B, C, D, Data[1] + Longint($F61E2562), 5); Round2(D, A, B, C, Data[6] + Longint($C040B340), 9); Round2(C, D, A, B, Data[11] + Longint($265E5A51), 14); Round2(B, C, D, A, Data[0] + Longint($E9B6C7AA), 20); Round2(A, B, C, D, Data[5] + Longint($D62F105D), 5); Round2(D, A, B, C, Data[10] + Longint($02441453), 9); Round2(C, D, A, B, Data[15] + Longint($D8A1E681), 14); Round2(B, C, D, A, Data[4] + Longint($E7D3FBC8), 20); Round2(A, B, C, D, Data[9] + Longint($21E1CDE6), 5); Round2(D, A, B, C, Data[14] + Longint($C33707D6), 9); Round2(C, D, A, B, Data[3] + Longint($F4D50D87), 14); Round2(B, C, D, A, Data[8] + Longint($455A14ED), 20); Round2(A, B, C, D, Data[13] + Longint($A9E3E905), 5); Round2(D, A, B, C, Data[2] + Longint($FCEFA3F8), 9); Round2(C, D, A, B, Data[7] + Longint($676F02D9), 14); Round2(B, C, D, A, Data[12] + Longint($8D2A4C8A), 20); Round3(A, B, C, D, Data[5] + Longint($FFFA3942), 4); Round3(D, A, B, C, Data[8] + Longint($8771F681), 11); Round3(C, D, A, B, Data[11] + Longint($6D9D6122), 16); Round3(B, C, D, A, Data[14] + Longint($FDE5380C), 23); Round3(A, B, C, D, Data[1] + Longint($A4BEEA44), 4); Round3(D, A, B, C, Data[4] + Longint($4BDECFA9), 11); Round3(C, D, A, B, Data[7] + Longint($F6BB4B60), 16); Round3(B, C, D, A, Data[10] + Longint($BEBFBC70), 23); Round3(A, B, C, D, Data[13] + Longint($289B7EC6), 4); Round3(D, A, B, C, Data[0] + Longint($EAA127FA), 11); Round3(C, D, A, B, Data[3] + Longint($D4EF3085), 16); Round3(B, C, D, A, Data[6] + Longint($04881D05), 23); Round3(A, B, C, D, Data[9] + Longint($D9D4D039), 4); Round3(D, A, B, C, Data[12] + Longint($E6DB99E5), 11); Round3(C, D, A, B, Data[15] + Longint($1FA27CF8), 16); Round3(B, C, D, A, Data[2] + Longint($C4AC5665), 23); Round4(A, B, C, D, Data[0] + Longint($F4292244), 6); Round4(D, A, B, C, Data[7] + Longint($432AFF97), 10); Round4(C, D, A, B, Data[14] + Longint($AB9423A7), 15); Round4(B, C, D, A, Data[5] + Longint($FC93A039), 21); Round4(A, B, C, D, Data[12] + Longint($655B59C3), 6); Round4(D, A, B, C, Data[3] + Longint($8F0CCC92), 10); Round4(C, D, A, B, Data[10] + Longint($FFEFF47D), 15); Round4(B, C, D, A, Data[1] + Longint($85845DD1), 21); Round4(A, B, C, D, Data[8] + Longint($6FA87E4F), 6); Round4(D, A, B, C, Data[15] + Longint($FE2CE6E0), 10); Round4(C, D, A, B, Data[6] + Longint($A3014314), 15); Round4(B, C, D, A, Data[13] + Longint($4E0811A1), 21); Round4(A, B, C, D, Data[4] + Longint($F7537E82), 6); Round4(D, A, B, C, Data[11] + Longint($BD3AF235), 10); Round4(C, D, A, B, Data[2] + Longint($2AD7D2BB), 15); Round4(B, C, D, A, Data[9] + Longint($EB86D391), 21); Inc(Buf[0], A); Inc(Buf[1], B); Inc(Buf[2], C); Inc(Buf[3], D); end; //fixed by James McAdams procedure MDUpdate(var MDContext: TMDCtx; const Data: AnsiString; transform: TMDTransform); var Index, partLen, InputLen, I: integer; {$IFDEF CIL} n: integer; {$ENDIF} begin InputLen := Length(Data); with MDContext do begin Index := (Count[0] shr 3) and $3F; Inc(Count[0], InputLen shl 3); if Count[0] < (InputLen shl 3) then Inc(Count[1]); Inc(Count[1], InputLen shr 29); partLen := 64 - Index; if InputLen >= partLen then begin ArrLongToByte(BufLong, BufAnsiChar); {$IFDEF CIL} for n := 1 to partLen do BufAnsiChar[index - 1 + n] := Ord(Data[n]); {$ELSE} Move(Data[1], BufAnsiChar[Index], partLen); {$ENDIF} ArrByteToLong(BufAnsiChar, BufLong); Transform(State, Buflong); I := partLen; while I + 63 < InputLen do begin ArrLongToByte(BufLong, BufAnsiChar); {$IFDEF CIL} for n := 1 to 64 do BufAnsiChar[n - 1] := Ord(Data[i + n]); {$ELSE} Move(Data[I+1], BufAnsiChar, 64); {$ENDIF} ArrByteToLong(BufAnsiChar, BufLong); Transform(State, Buflong); inc(I, 64); end; Index := 0; end else I := 0; ArrLongToByte(BufLong, BufAnsiChar); {$IFDEF CIL} for n := 1 to InputLen-I do BufAnsiChar[Index + n - 1] := Ord(Data[i + n]); {$ELSE} Move(Data[I+1], BufAnsiChar[Index], InputLen-I); {$ENDIF} ArrByteToLong(BufAnsiChar, BufLong); end end; function MDFinal(var MDContext: TMDCtx; transform: TMDTransform): AnsiString; var Cnt: Word; P: Byte; digest: array[0..15] of Byte; i: Integer; n: integer; begin for I := 0 to 15 do Digest[I] := I + 1; with MDContext do begin Cnt := (Count[0] shr 3) and $3F; P := Cnt; BufAnsiChar[P] := $80; Inc(P); Cnt := 64 - 1 - Cnt; if Cnt < 8 then begin for n := 0 to cnt - 1 do BufAnsiChar[P + n] := 0; ArrByteToLong(BufAnsiChar, BufLong); // FillChar(BufAnsiChar[P], Cnt, #0); Transform(State, BufLong); ArrLongToByte(BufLong, BufAnsiChar); for n := 0 to 55 do BufAnsiChar[n] := 0; ArrByteToLong(BufAnsiChar, BufLong); // FillChar(BufAnsiChar, 56, #0); end else begin for n := 0 to Cnt - 8 - 1 do BufAnsiChar[p + n] := 0; ArrByteToLong(BufAnsiChar, BufLong); // FillChar(BufAnsiChar[P], Cnt - 8, #0); end; BufLong[14] := Count[0]; BufLong[15] := Count[1]; Transform(State, BufLong); ArrLongToByte(State, Digest); // Move(State, Digest, 16); Result := ''; for i := 0 to 15 do Result := Result + AnsiChar(digest[i]); end; // FillChar(MD5Context, SizeOf(TMD5Ctx), #0) end; {==============================================================================} function MD5(const Value: AnsiString): AnsiString; var MDContext: TMDCtx; begin MDInit(MDContext); MDUpdate(MDContext, Value, @MD5Transform); Result := MDFinal(MDContext, @MD5Transform); end; {==============================================================================} function HMAC_MD5(Text, Key: AnsiString): AnsiString; var ipad, opad, s: AnsiString; n: Integer; MDContext: TMDCtx; begin if Length(Key) > 64 then Key := md5(Key); ipad := StringOfChar(#$36, 64); opad := StringOfChar(#$5C, 64); for n := 1 to Length(Key) do begin ipad[n] := AnsiChar(Byte(ipad[n]) xor Byte(Key[n])); opad[n] := AnsiChar(Byte(opad[n]) xor Byte(Key[n])); end; MDInit(MDContext); MDUpdate(MDContext, ipad, @MD5Transform); MDUpdate(MDContext, Text, @MD5Transform); s := MDFinal(MDContext, @MD5Transform); MDInit(MDContext); MDUpdate(MDContext, opad, @MD5Transform); MDUpdate(MDContext, s, @MD5Transform); Result := MDFinal(MDContext, @MD5Transform); end; {==============================================================================} function MD5LongHash(const Value: AnsiString; Len: integer): AnsiString; var cnt, rest: integer; l: integer; n: integer; MDContext: TMDCtx; begin l := length(Value); cnt := Len div l; rest := Len mod l; MDInit(MDContext); for n := 1 to cnt do MDUpdate(MDContext, Value, @MD5Transform); if rest > 0 then MDUpdate(MDContext, Copy(Value, 1, rest), @MD5Transform); Result := MDFinal(MDContext, @MD5Transform); end; {==============================================================================} // SHA1 is based on sources by Dave Barton (davebarton@bigfoot.com) procedure SHA1init( var SHA1Context: TSHA1Ctx ); var n: integer; begin SHA1Context.Hi := 0; SHA1Context.Lo := 0; SHA1Context.Index := 0; for n := 0 to High(SHA1Context.Buffer) do SHA1Context.Buffer[n] := 0; for n := 0 to High(SHA1Context.HashByte) do SHA1Context.HashByte[n] := 0; // FillChar(SHA1Context, SizeOf(TSHA1Ctx), #0); SHA1Context.Hash[0] := integer($67452301); SHA1Context.Hash[1] := integer($EFCDAB89); SHA1Context.Hash[2] := integer($98BADCFE); SHA1Context.Hash[3] := integer($10325476); SHA1Context.Hash[4] := integer($C3D2E1F0); end; //****************************************************************************** function RB(A: integer): integer; begin Result := (A shr 24) or ((A shr 8) and $FF00) or ((A shl 8) and $FF0000) or (A shl 24); end; procedure SHA1Compress(var Data: TSHA1Ctx); var A, B, C, D, E, T: integer; W: array[0..79] of integer; i: integer; n: integer; function F1(x, y, z: integer): integer; begin Result := z xor (x and (y xor z)); end; function F2(x, y, z: integer): integer; begin Result := x xor y xor z; end; function F3(x, y, z: integer): integer; begin Result := (x and y) or (z and (x or y)); end; function LRot32(X: integer; c: integer): integer; begin result := (x shl c) or (x shr (32 - c)); end; begin ArrByteToLong(Data.Buffer, W); // Move(Data.Buffer, W, Sizeof(Data.Buffer)); for i := 0 to 15 do W[i] := RB(W[i]); for i := 16 to 79 do W[i] := LRot32(W[i-3] xor W[i-8] xor W[i-14] xor W[i-16], 1); A := Data.Hash[0]; B := Data.Hash[1]; C := Data.Hash[2]; D := Data.Hash[3]; E := Data.Hash[4]; for i := 0 to 19 do begin T := LRot32(A, 5) + F1(B, C, D) + E + W[i] + integer($5A827999); E := D; D := C; C := LRot32(B, 30); B := A; A := T; end; for i := 20 to 39 do begin T := LRot32(A, 5) + F2(B, C, D) + E + W[i] + integer($6ED9EBA1); E := D; D := C; C := LRot32(B, 30); B := A; A := T; end; for i := 40 to 59 do begin T := LRot32(A, 5) + F3(B, C, D) + E + W[i] + integer($8F1BBCDC); E := D; D := C; C := LRot32(B, 30); B := A; A := T; end; for i := 60 to 79 do begin T := LRot32(A, 5) + F2(B, C, D) + E + W[i] + integer($CA62C1D6); E := D; D := C; C := LRot32(B, 30); B := A; A := T; end; Data.Hash[0] := Data.Hash[0] + A; Data.Hash[1] := Data.Hash[1] + B; Data.Hash[2] := Data.Hash[2] + C; Data.Hash[3] := Data.Hash[3] + D; Data.Hash[4] := Data.Hash[4] + E; for n := 0 to high(w) do w[n] := 0; // FillChar(W, Sizeof(W), 0); for n := 0 to high(Data.Buffer) do Data.Buffer[n] := 0; // FillChar(Data.Buffer, Sizeof(Data.Buffer), 0); end; //****************************************************************************** procedure SHA1Update(var Context: TSHA1Ctx; const Data: AnsiString); var Len: integer; n: integer; i, k: integer; begin Len := Length(data); for k := 0 to 7 do begin i := Context.Lo; Inc(Context.Lo, Len); if Context.Lo < i then Inc(Context.Hi); end; for n := 1 to len do begin Context.Buffer[Context.Index] := byte(Data[n]); Inc(Context.Index); if Context.Index = 64 then begin Context.Index := 0; SHA1Compress(Context); end; end; end; //****************************************************************************** function SHA1Final(var Context: TSHA1Ctx): AnsiString; type Pinteger = ^integer; var i: integer; procedure ItoArr(var Ar: Array of byte; I, value: Integer); begin Ar[i + 0] := Value and $000000FF; Ar[i + 1] := (Value shr 8) and $000000FF; Ar[i + 2] := (Value shr 16) and $000000FF; Ar[i + 3] := (Value shr 24) and $000000FF; end; begin Context.Buffer[Context.Index] := $80; if Context.Index >= 56 then SHA1Compress(Context); ItoArr(Context.Buffer, 56, RB(Context.Hi)); ItoArr(Context.Buffer, 60, RB(Context.Lo)); // Pinteger(@Context.Buffer[56])^ := RB(Context.Hi); // Pinteger(@Context.Buffer[60])^ := RB(Context.Lo); SHA1Compress(Context); Context.Hash[0] := RB(Context.Hash[0]); Context.Hash[1] := RB(Context.Hash[1]); Context.Hash[2] := RB(Context.Hash[2]); Context.Hash[3] := RB(Context.Hash[3]); Context.Hash[4] := RB(Context.Hash[4]); ArrLongToByte(Context.Hash, Context.HashByte); Result := ''; for i := 0 to 19 do Result := Result + AnsiChar(Context.HashByte[i]); end; function SHA1(const Value: AnsiString): AnsiString; var SHA1Context: TSHA1Ctx; begin SHA1Init(SHA1Context); SHA1Update(SHA1Context, Value); Result := SHA1Final(SHA1Context); end; {==============================================================================} function HMAC_SHA1(Text, Key: AnsiString): AnsiString; var ipad, opad, s: AnsiString; n: Integer; SHA1Context: TSHA1Ctx; begin if Length(Key) > 64 then Key := SHA1(Key); ipad := StringOfChar(#$36, 64); opad := StringOfChar(#$5C, 64); for n := 1 to Length(Key) do begin ipad[n] := AnsiChar(Byte(ipad[n]) xor Byte(Key[n])); opad[n] := AnsiChar(Byte(opad[n]) xor Byte(Key[n])); end; SHA1Init(SHA1Context); SHA1Update(SHA1Context, ipad); SHA1Update(SHA1Context, Text); s := SHA1Final(SHA1Context); SHA1Init(SHA1Context); SHA1Update(SHA1Context, opad); SHA1Update(SHA1Context, s); Result := SHA1Final(SHA1Context); end; {==============================================================================} function SHA1LongHash(const Value: AnsiString; Len: integer): AnsiString; var cnt, rest: integer; l: integer; n: integer; SHA1Context: TSHA1Ctx; begin l := length(Value); cnt := Len div l; rest := Len mod l; SHA1Init(SHA1Context); for n := 1 to cnt do SHA1Update(SHA1Context, Value); if rest > 0 then SHA1Update(SHA1Context, Copy(Value, 1, rest)); Result := SHA1Final(SHA1Context); end; {==============================================================================} procedure MD4Transform(var Buf: array of LongInt; const Data: array of LongInt); var A, B, C, D: LongInt; function LRot32(a, b: longint): longint; begin Result:= (a shl b) or (a shr (32 - b)); end; begin A := Buf[0]; B := Buf[1]; C := Buf[2]; D := Buf[3]; A:= LRot32(A + (D xor (B and (C xor D))) + Data[ 0], 3); D:= LRot32(D + (C xor (A and (B xor C))) + Data[ 1], 7); C:= LRot32(C + (B xor (D and (A xor B))) + Data[ 2], 11); B:= LRot32(B + (A xor (C and (D xor A))) + Data[ 3], 19); A:= LRot32(A + (D xor (B and (C xor D))) + Data[ 4], 3); D:= LRot32(D + (C xor (A and (B xor C))) + Data[ 5], 7); C:= LRot32(C + (B xor (D and (A xor B))) + Data[ 6], 11); B:= LRot32(B + (A xor (C and (D xor A))) + Data[ 7], 19); A:= LRot32(A + (D xor (B and (C xor D))) + Data[ 8], 3); D:= LRot32(D + (C xor (A and (B xor C))) + Data[ 9], 7); C:= LRot32(C + (B xor (D and (A xor B))) + Data[10], 11); B:= LRot32(B + (A xor (C and (D xor A))) + Data[11], 19); A:= LRot32(A + (D xor (B and (C xor D))) + Data[12], 3); D:= LRot32(D + (C xor (A and (B xor C))) + Data[13], 7); C:= LRot32(C + (B xor (D and (A xor B))) + Data[14], 11); B:= LRot32(B + (A xor (C and (D xor A))) + Data[15], 19); A:= LRot32(A + ((B and C) or (B and D) or (C and D)) + Data[ 0] + longint($5a827999), 3); D:= LRot32(D + ((A and B) or (A and C) or (B and C)) + Data[ 4] + longint($5a827999), 5); C:= LRot32(C + ((D and A) or (D and B) or (A and B)) + Data[ 8] + longint($5a827999), 9); B:= LRot32(B + ((C and D) or (C and A) or (D and A)) + Data[12] + longint($5a827999), 13); A:= LRot32(A + ((B and C) or (B and D) or (C and D)) + Data[ 1] + longint($5a827999), 3); D:= LRot32(D + ((A and B) or (A and C) or (B and C)) + Data[ 5] + longint($5a827999), 5); C:= LRot32(C + ((D and A) or (D and B) or (A and B)) + Data[ 9] + longint($5a827999), 9); B:= LRot32(B + ((C and D) or (C and A) or (D and A)) + Data[13] + longint($5a827999), 13); A:= LRot32(A + ((B and C) or (B and D) or (C and D)) + Data[ 2] + longint($5a827999), 3); D:= LRot32(D + ((A and B) or (A and C) or (B and C)) + Data[ 6] + longint($5a827999), 5); C:= LRot32(C + ((D and A) or (D and B) or (A and B)) + Data[10] + longint($5a827999), 9); B:= LRot32(B + ((C and D) or (C and A) or (D and A)) + Data[14] + longint($5a827999), 13); A:= LRot32(A + ((B and C) or (B and D) or (C and D)) + Data[ 3] + longint($5a827999), 3); D:= LRot32(D + ((A and B) or (A and C) or (B and C)) + Data[ 7] + longint($5a827999), 5); C:= LRot32(C + ((D and A) or (D and B) or (A and B)) + Data[11] + longint($5a827999), 9); B:= LRot32(B + ((C and D) or (C and A) or (D and A)) + Data[15] + longint($5a827999), 13); A:= LRot32(A + (B xor C xor D) + Data[ 0] + longint($6ed9eba1), 3); D:= LRot32(D + (A xor B xor C) + Data[ 8] + longint($6ed9eba1), 9); C:= LRot32(C + (D xor A xor B) + Data[ 4] + longint($6ed9eba1), 11); B:= LRot32(B + (C xor D xor A) + Data[12] + longint($6ed9eba1), 15); A:= LRot32(A + (B xor C xor D) + Data[ 2] + longint($6ed9eba1), 3); D:= LRot32(D + (A xor B xor C) + Data[10] + longint($6ed9eba1), 9); C:= LRot32(C + (D xor A xor B) + Data[ 6] + longint($6ed9eba1), 11); B:= LRot32(B + (C xor D xor A) + Data[14] + longint($6ed9eba1), 15); A:= LRot32(A + (B xor C xor D) + Data[ 1] + longint($6ed9eba1), 3); D:= LRot32(D + (A xor B xor C) + Data[ 9] + longint($6ed9eba1), 9); C:= LRot32(C + (D xor A xor B) + Data[ 5] + longint($6ed9eba1), 11); B:= LRot32(B + (C xor D xor A) + Data[13] + longint($6ed9eba1), 15); A:= LRot32(A + (B xor C xor D) + Data[ 3] + longint($6ed9eba1), 3); D:= LRot32(D + (A xor B xor C) + Data[11] + longint($6ed9eba1), 9); C:= LRot32(C + (D xor A xor B) + Data[ 7] + longint($6ed9eba1), 11); B:= LRot32(B + (C xor D xor A) + Data[15] + longint($6ed9eba1), 15); Inc(Buf[0], A); Inc(Buf[1], B); Inc(Buf[2], C); Inc(Buf[3], D); end; {==============================================================================} function MD4(const Value: AnsiString): AnsiString; var MDContext: TMDCtx; begin MDInit(MDContext); MDUpdate(MDContext, Value, @MD4Transform); Result := MDFinal(MDContext, @MD4Transform); end; {==============================================================================} end. ����������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/synapse/licence.txt�������������������������������������������������0000644�0001750�0001750�00000004154�12014201074�021404� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Copyright (c)1999-2002, Lukas Gebauer All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of Lukas Gebauer nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/synapse/sslinux.inc�������������������������������������������������0000644�0001750�0001750�00000116017�12014201074�021443� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{==============================================================================| | Project : Ararat Synapse | 002.000.009 | |==============================================================================| | Content: Socket Independent Platform Layer - Linux definition include | |==============================================================================| | Copyright (c)1999-2010, Lukas Gebauer | | All rights reserved. | | | | Redistribution and use in source and binary forms, with or without | | modification, are permitted provided that the following conditions are met: | | | | Redistributions of source code must retain the above copyright notice, this | | list of conditions and the following disclaimer. | | | | Redistributions in binary form must reproduce the above copyright notice, | | this list of conditions and the following disclaimer in the documentation | | and/or other materials provided with the distribution. | | | | Neither the name of Lukas Gebauer nor the names of its contributors may | | be used to endorse or promote products derived from this software without | | specific prior written permission. | | | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | | ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR | | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | | DAMAGE. | |==============================================================================| | The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).| | Portions created by Lukas Gebauer are Copyright (c)2003-2010. | | All Rights Reserved. | |==============================================================================| | Contributor(s): | |==============================================================================| | History: see HISTORY.HTM from distribution package | | (Found at URL: http://www.ararat.cz/synapse/) | |==============================================================================} {:@exclude} {$IFDEF LINUX} //{$DEFINE FORCEOLDAPI} {Note about define FORCEOLDAPI: If you activate this compiler directive, then is allways used old socket API for name resolution. If you leave this directive inactive, then the new API is used, when running system allows it. For IPv6 support you must have new API! } {$IFDEF FPC} {$MODE DELPHI} {$ENDIF} {$H+} interface uses SyncObjs, SysUtils, Classes, synafpc, Libc; function InitSocketInterface(stack: string): Boolean; function DestroySocketInterface: Boolean; const WinsockLevel = $0202; type u_char = Char; u_short = Word; u_int = Integer; u_long = Longint; pu_long = ^u_long; pu_short = ^u_short; TSocket = u_int; TAddrFamily = integer; TMemory = pointer; const DLLStackName = 'libc.so.6'; cLocalhost = '127.0.0.1'; cAnyHost = '0.0.0.0'; cBroadcast = '255.255.255.255'; c6Localhost = '::1'; c6AnyHost = '::0'; c6Broadcast = 'ffff::1'; cAnyPort = '0'; type DWORD = Integer; __fd_mask = LongWord; const __FD_SETSIZE = 1024; __NFDBITS = 8 * sizeof(__fd_mask); type __fd_set = {packed} record fds_bits: packed array[0..(__FD_SETSIZE div __NFDBITS)-1] of __fd_mask; end; TFDSet = __fd_set; PFDSet = ^TFDSet; const FIONREAD = $541B; FIONBIO = $5421; FIOASYNC = $5452; type PTimeVal = ^TTimeVal; TTimeVal = packed record tv_sec: Longint; tv_usec: Longint; end; const IPPROTO_IP = 0; { Dummy } IPPROTO_ICMP = 1; { Internet Control Message Protocol } IPPROTO_IGMP = 2; { Internet Group Management Protocol} IPPROTO_TCP = 6; { TCP } IPPROTO_UDP = 17; { User Datagram Protocol } IPPROTO_IPV6 = 41; IPPROTO_ICMPV6 = 58; IPPROTO_RM = 113; IPPROTO_RAW = 255; IPPROTO_MAX = 256; type PInAddr = ^TInAddr; TInAddr = packed record case integer of 0: (S_bytes: packed array [0..3] of byte); 1: (S_addr: u_long); end; PSockAddrIn = ^TSockAddrIn; TSockAddrIn = packed record case Integer of 0: (sin_family: u_short; sin_port: u_short; sin_addr: TInAddr; sin_zero: array[0..7] of Char); 1: (sa_family: u_short; sa_data: array[0..13] of Char) end; TIP_mreq = record imr_multiaddr: TInAddr; { IP multicast address of group } imr_interface: TInAddr; { local IP address of interface } end; PInAddr6 = ^TInAddr6; TInAddr6 = packed record case integer of 0: (S6_addr: packed array [0..15] of byte); 1: (u6_addr8: packed array [0..15] of byte); 2: (u6_addr16: packed array [0..7] of word); 3: (u6_addr32: packed array [0..3] of integer); end; PSockAddrIn6 = ^TSockAddrIn6; TSockAddrIn6 = packed record sin6_family: u_short; // AF_INET6 sin6_port: u_short; // Transport level port number sin6_flowinfo: u_long; // IPv6 flow information sin6_addr: TInAddr6; // IPv6 address sin6_scope_id: u_long; // Scope Id: IF number for link-local // SITE id for site-local end; TIPv6_mreq = record ipv6mr_multiaddr: TInAddr6; // IPv6 multicast address. ipv6mr_interface: integer; // Interface index. padding: u_long; end; PHostEnt = ^THostEnt; THostent = record h_name: PChar; h_aliases: PPChar; h_addrtype: Integer; h_length: Cardinal; case Byte of 0: (h_addr_list: PPChar); 1: (h_addr: PPChar); end; PNetEnt = ^TNetEnt; TNetEnt = record n_name: PChar; n_aliases: PPChar; n_addrtype: Integer; n_net: uint32_t; end; PServEnt = ^TServEnt; TServEnt = record s_name: PChar; s_aliases: PPChar; s_port: Integer; s_proto: PChar; end; PProtoEnt = ^TProtoEnt; TProtoEnt = record p_name: PChar; p_aliases: ^PChar; p_proto: u_short; end; const INADDR_ANY = $00000000; INADDR_LOOPBACK = $7F000001; INADDR_BROADCAST = $FFFFFFFF; INADDR_NONE = $FFFFFFFF; ADDR_ANY = INADDR_ANY; INVALID_SOCKET = TSocket(NOT(0)); SOCKET_ERROR = -1; Const IP_TOS = 1; { int; IP type of service and precedence. } IP_TTL = 2; { int; IP time to live. } IP_HDRINCL = 3; { int; Header is included with data. } IP_OPTIONS = 4; { ip_opts; IP per-packet options. } IP_ROUTER_ALERT = 5; { bool } IP_RECVOPTS = 6; { bool } IP_RETOPTS = 7; { bool } IP_PKTINFO = 8; { bool } IP_PKTOPTIONS = 9; IP_PMTUDISC = 10; { obsolete name? } IP_MTU_DISCOVER = 10; { int; see below } IP_RECVERR = 11; { bool } IP_RECVTTL = 12; { bool } IP_RECVTOS = 13; { bool } IP_MULTICAST_IF = 32; { in_addr; set/get IP multicast i/f } IP_MULTICAST_TTL = 33; { u_char; set/get IP multicast ttl } IP_MULTICAST_LOOP = 34; { i_char; set/get IP multicast loopback } IP_ADD_MEMBERSHIP = 35; { ip_mreq; add an IP group membership } IP_DROP_MEMBERSHIP = 36; { ip_mreq; drop an IP group membership } SOL_SOCKET = 1; SO_DEBUG = 1; SO_REUSEADDR = 2; SO_TYPE = 3; SO_ERROR = 4; SO_DONTROUTE = 5; SO_BROADCAST = 6; SO_SNDBUF = 7; SO_RCVBUF = 8; SO_KEEPALIVE = 9; SO_OOBINLINE = 10; SO_NO_CHECK = 11; SO_PRIORITY = 12; SO_LINGER = 13; SO_BSDCOMPAT = 14; SO_REUSEPORT = 15; SO_PASSCRED = 16; SO_PEERCRED = 17; SO_RCVLOWAT = 18; SO_SNDLOWAT = 19; SO_RCVTIMEO = 20; SO_SNDTIMEO = 21; { Security levels - as per NRL IPv6 - don't actually do anything } SO_SECURITY_AUTHENTICATION = 22; SO_SECURITY_ENCRYPTION_TRANSPORT = 23; SO_SECURITY_ENCRYPTION_NETWORK = 24; SO_BINDTODEVICE = 25; { Socket filtering } SO_ATTACH_FILTER = 26; SO_DETACH_FILTER = 27; SOMAXCONN = 128; IPV6_UNICAST_HOPS = 16; IPV6_MULTICAST_IF = 17; IPV6_MULTICAST_HOPS = 18; IPV6_MULTICAST_LOOP = 19; IPV6_JOIN_GROUP = 20; IPV6_LEAVE_GROUP = 21; MSG_NOSIGNAL = $4000; // Do not generate SIGPIPE. // getnameinfo constants NI_MAXHOST = 1025; NI_MAXSERV = 32; NI_NOFQDN = $4; NI_NUMERICHOST = $1; NI_NAMEREQD = $8; NI_NUMERICSERV = $2; NI_DGRAM = $10; const SOCK_STREAM = 1; { stream socket } SOCK_DGRAM = 2; { datagram socket } SOCK_RAW = 3; { raw-protocol interface } SOCK_RDM = 4; { reliably-delivered message } SOCK_SEQPACKET = 5; { sequenced packet stream } { TCP options. } TCP_NODELAY = $0001; { Address families. } AF_UNSPEC = 0; { unspecified } AF_INET = 2; { internetwork: UDP, TCP, etc. } AF_INET6 = 10; { Internetwork Version 6 } AF_MAX = 24; { Protocol families, same as address families for now. } PF_UNSPEC = AF_UNSPEC; PF_INET = AF_INET; PF_INET6 = AF_INET6; PF_MAX = AF_MAX; type { Structure used by kernel to store most addresses. } PSockAddr = ^TSockAddr; TSockAddr = TSockAddrIn; { Structure used by kernel to pass protocol information in raw sockets. } PSockProto = ^TSockProto; TSockProto = packed record sp_family: u_short; sp_protocol: u_short; end; type PAddrInfo = ^TAddrInfo; TAddrInfo = record ai_flags: integer; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST. ai_family: integer; // PF_xxx. ai_socktype: integer; // SOCK_xxx. ai_protocol: integer; // 0 or IPPROTO_xxx for IPv4 and IPv6. ai_addrlen: u_int; // Length of ai_addr. ai_addr: PSockAddr; // Binary address. ai_canonname: PChar; // Canonical name for nodename. ai_next: PAddrInfo; // Next structure in linked list. end; const // Flags used in "hints" argument to getaddrinfo(). AI_PASSIVE = $1; // Socket address will be used in bind() call. AI_CANONNAME = $2; // Return canonical name in first ai_canonname. AI_NUMERICHOST = $4; // Nodename must be a numeric address string. type { Structure used for manipulating linger option. } PLinger = ^TLinger; TLinger = packed record l_onoff: integer; l_linger: integer; end; const MSG_OOB = $01; // Process out-of-band data. MSG_PEEK = $02; // Peek at incoming messages. const WSAEINTR = EINTR; WSAEBADF = EBADF; WSAEACCES = EACCES; WSAEFAULT = EFAULT; WSAEINVAL = EINVAL; WSAEMFILE = EMFILE; WSAEWOULDBLOCK = EWOULDBLOCK; WSAEINPROGRESS = EINPROGRESS; WSAEALREADY = EALREADY; WSAENOTSOCK = ENOTSOCK; WSAEDESTADDRREQ = EDESTADDRREQ; WSAEMSGSIZE = EMSGSIZE; WSAEPROTOTYPE = EPROTOTYPE; WSAENOPROTOOPT = ENOPROTOOPT; WSAEPROTONOSUPPORT = EPROTONOSUPPORT; WSAESOCKTNOSUPPORT = ESOCKTNOSUPPORT; WSAEOPNOTSUPP = EOPNOTSUPP; WSAEPFNOSUPPORT = EPFNOSUPPORT; WSAEAFNOSUPPORT = EAFNOSUPPORT; WSAEADDRINUSE = EADDRINUSE; WSAEADDRNOTAVAIL = EADDRNOTAVAIL; WSAENETDOWN = ENETDOWN; WSAENETUNREACH = ENETUNREACH; WSAENETRESET = ENETRESET; WSAECONNABORTED = ECONNABORTED; WSAECONNRESET = ECONNRESET; WSAENOBUFS = ENOBUFS; WSAEISCONN = EISCONN; WSAENOTCONN = ENOTCONN; WSAESHUTDOWN = ESHUTDOWN; WSAETOOMANYREFS = ETOOMANYREFS; WSAETIMEDOUT = ETIMEDOUT; WSAECONNREFUSED = ECONNREFUSED; WSAELOOP = ELOOP; WSAENAMETOOLONG = ENAMETOOLONG; WSAEHOSTDOWN = EHOSTDOWN; WSAEHOSTUNREACH = EHOSTUNREACH; WSAENOTEMPTY = ENOTEMPTY; WSAEPROCLIM = -1; WSAEUSERS = EUSERS; WSAEDQUOT = EDQUOT; WSAESTALE = ESTALE; WSAEREMOTE = EREMOTE; WSASYSNOTREADY = -2; WSAVERNOTSUPPORTED = -3; WSANOTINITIALISED = -4; WSAEDISCON = -5; WSAHOST_NOT_FOUND = HOST_NOT_FOUND; WSATRY_AGAIN = TRY_AGAIN; WSANO_RECOVERY = NO_RECOVERY; WSANO_DATA = -6; EAI_BADFLAGS = -1; { Invalid value for `ai_flags' field. } EAI_NONAME = -2; { NAME or SERVICE is unknown. } EAI_AGAIN = -3; { Temporary failure in name resolution. } EAI_FAIL = -4; { Non-recoverable failure in name res. } EAI_NODATA = -5; { No address associated with NAME. } EAI_FAMILY = -6; { `ai_family' not supported. } EAI_SOCKTYPE = -7; { `ai_socktype' not supported. } EAI_SERVICE = -8; { SERVICE not supported for `ai_socktype'. } EAI_ADDRFAMILY = -9; { Address family for NAME not supported. } EAI_MEMORY = -10; { Memory allocation failure. } EAI_SYSTEM = -11; { System error returned in `errno'. } const WSADESCRIPTION_LEN = 256; WSASYS_STATUS_LEN = 128; type PWSAData = ^TWSAData; TWSAData = packed record wVersion: Word; wHighVersion: Word; szDescription: array[0..WSADESCRIPTION_LEN] of Char; szSystemStatus: array[0..WSASYS_STATUS_LEN] of Char; iMaxSockets: Word; iMaxUdpDg: Word; lpVendorInfo: PChar; end; function IN6_IS_ADDR_UNSPECIFIED(const a: PInAddr6): boolean; function IN6_IS_ADDR_LOOPBACK(const a: PInAddr6): boolean; function IN6_IS_ADDR_LINKLOCAL(const a: PInAddr6): boolean; function IN6_IS_ADDR_SITELOCAL(const a: PInAddr6): boolean; function IN6_IS_ADDR_MULTICAST(const a: PInAddr6): boolean; function IN6_ADDR_EQUAL(const a: PInAddr6; const b: PInAddr6):boolean; procedure SET_IN6_IF_ADDR_ANY (const a: PInAddr6); procedure SET_LOOPBACK_ADDR6 (const a: PInAddr6); var in6addr_any, in6addr_loopback : TInAddr6; procedure FD_CLR(Socket: TSocket; var FDSet: TFDSet); function FD_ISSET(Socket: TSocket; var FDSet: TFDSet): Boolean; procedure FD_SET(Socket: TSocket; var FDSet: TFDSet); procedure FD_ZERO(var FDSet: TFDSet); {=============================================================================} type TWSAStartup = function(wVersionRequired: Word; var WSData: TWSAData): Integer; cdecl; TWSACleanup = function: Integer; cdecl; TWSAGetLastError = function: Integer; cdecl; TGetServByName = function(name, proto: PChar): PServEnt; cdecl; TGetServByPort = function(port: Integer; proto: PChar): PServEnt; cdecl; TGetProtoByName = function(name: PChar): PProtoEnt; cdecl; TGetProtoByNumber = function(proto: Integer): PProtoEnt; cdecl; TGetHostByName = function(name: PChar): PHostEnt; cdecl; TGetHostByAddr = function(addr: Pointer; len, Struc: Integer): PHostEnt; cdecl; TGetHostName = function(name: PChar; len: Integer): Integer; cdecl; TShutdown = function(s: TSocket; how: Integer): Integer; cdecl; TSetSockOpt = function(s: TSocket; level, optname: Integer; optval: PChar; optlen: Integer): Integer; cdecl; TGetSockOpt = function(s: TSocket; level, optname: Integer; optval: PChar; var optlen: Integer): Integer; cdecl; TSendTo = function(s: TSocket; const Buf; len, flags: Integer; addrto: PSockAddr; tolen: Integer): Integer; cdecl; TSend = function(s: TSocket; const Buf; len, flags: Integer): Integer; cdecl; TRecv = function(s: TSocket; var Buf; len, flags: Integer): Integer; cdecl; TRecvFrom = function(s: TSocket; var Buf; len, flags: Integer; from: PSockAddr; var fromlen: Integer): Integer; cdecl; Tntohs = function(netshort: u_short): u_short; cdecl; Tntohl = function(netlong: u_long): u_long; cdecl; TListen = function(s: TSocket; backlog: Integer): Integer; cdecl; TIoctlSocket = function(s: TSocket; cmd: DWORD; var arg: integer): Integer; cdecl; TInet_ntoa = function(inaddr: TInAddr): PChar; cdecl; TInet_addr = function(cp: PChar): u_long; cdecl; Thtons = function(hostshort: u_short): u_short; cdecl; Thtonl = function(hostlong: u_long): u_long; cdecl; TGetSockName = function(s: TSocket; name: PSockAddr; var namelen: Integer): Integer; cdecl; TGetPeerName = function(s: TSocket; name: PSockAddr; var namelen: Integer): Integer; cdecl; TConnect = function(s: TSocket; name: PSockAddr; namelen: Integer): Integer; cdecl; TCloseSocket = function(s: TSocket): Integer; cdecl; TBind = function(s: TSocket; addr: PSockAddr; namelen: Integer): Integer; cdecl; TAccept = function(s: TSocket; addr: PSockAddr; var addrlen: Integer): TSocket; cdecl; TTSocket = function(af, Struc, Protocol: Integer): TSocket; cdecl; TSelect = function(nfds: Integer; readfds, writefds, exceptfds: PFDSet; timeout: PTimeVal): Longint; cdecl; TGetAddrInfo = function(NodeName: PChar; ServName: PChar; Hints: PAddrInfo; var Addrinfo: PAddrInfo): integer; cdecl; TFreeAddrInfo = procedure(ai: PAddrInfo); cdecl; TGetNameInfo = function( addr: PSockAddr; namelen: Integer; host: PChar; hostlen: DWORD; serv: PChar; servlen: DWORD; flags: integer): integer; cdecl; var WSAStartup: TWSAStartup = nil; WSACleanup: TWSACleanup = nil; WSAGetLastError: TWSAGetLastError = nil; GetServByName: TGetServByName = nil; GetServByPort: TGetServByPort = nil; GetProtoByName: TGetProtoByName = nil; GetProtoByNumber: TGetProtoByNumber = nil; GetHostByName: TGetHostByName = nil; GetHostByAddr: TGetHostByAddr = nil; ssGetHostName: TGetHostName = nil; Shutdown: TShutdown = nil; SetSockOpt: TSetSockOpt = nil; GetSockOpt: TGetSockOpt = nil; ssSendTo: TSendTo = nil; ssSend: TSend = nil; ssRecv: TRecv = nil; ssRecvFrom: TRecvFrom = nil; ntohs: Tntohs = nil; ntohl: Tntohl = nil; Listen: TListen = nil; IoctlSocket: TIoctlSocket = nil; Inet_ntoa: TInet_ntoa = nil; Inet_addr: TInet_addr = nil; htons: Thtons = nil; htonl: Thtonl = nil; ssGetSockName: TGetSockName = nil; ssGetPeerName: TGetPeerName = nil; ssConnect: TConnect = nil; CloseSocket: TCloseSocket = nil; ssBind: TBind = nil; ssAccept: TAccept = nil; Socket: TTSocket = nil; Select: TSelect = nil; GetAddrInfo: TGetAddrInfo = nil; FreeAddrInfo: TFreeAddrInfo = nil; GetNameInfo: TGetNameInfo = nil; function LSWSAStartup(wVersionRequired: Word; var WSData: TWSAData): Integer; cdecl; function LSWSACleanup: Integer; cdecl; function LSWSAGetLastError: Integer; cdecl; var SynSockCS: SyncObjs.TCriticalSection; SockEnhancedApi: Boolean; SockWship6Api: Boolean; type TVarSin = packed record case integer of 0: (AddressFamily: u_short); 1: ( case sin_family: u_short of AF_INET: (sin_port: u_short; sin_addr: TInAddr; sin_zero: array[0..7] of Char); AF_INET6: (sin6_port: u_short; sin6_flowinfo: u_long; sin6_addr: TInAddr6; sin6_scope_id: u_long); ); end; function SizeOfVarSin(sin: TVarSin): integer; function Bind(s: TSocket; const addr: TVarSin): Integer; function Connect(s: TSocket; const name: TVarSin): Integer; function GetSockName(s: TSocket; var name: TVarSin): Integer; function GetPeerName(s: TSocket; var name: TVarSin): Integer; function GetHostName: string; function Send(s: TSocket; Buf: TMemory; len, flags: Integer): Integer; function Recv(s: TSocket; Buf: TMemory; len, flags: Integer): Integer; function SendTo(s: TSocket; Buf: TMemory; len, flags: Integer; addrto: TVarSin): Integer; function RecvFrom(s: TSocket; Buf: TMemory; len, flags: Integer; var from: TVarSin): Integer; function Accept(s: TSocket; var addr: TVarSin): TSocket; function IsNewApi(Family: integer): Boolean; function SetVarSin(var Sin: TVarSin; IP, Port: string; Family, SockProtocol, SockType: integer; PreferIP4: Boolean): integer; function GetSinIP(Sin: TVarSin): string; function GetSinPort(Sin: TVarSin): Integer; procedure ResolveNameToIP(Name: string; Family, SockProtocol, SockType: integer; const IPList: TStrings); function ResolveIPToName(IP: string; Family, SockProtocol, SockType: integer): string; function ResolvePort(Port: string; Family, SockProtocol, SockType: integer): Word; {==============================================================================} implementation var SynSockCount: Integer = 0; LibHandle: TLibHandle = 0; Libwship6Handle: TLibHandle = 0; function IN6_IS_ADDR_UNSPECIFIED(const a: PInAddr6): boolean; begin Result := ((a^.u6_addr32[0] = 0) and (a^.u6_addr32[1] = 0) and (a^.u6_addr32[2] = 0) and (a^.u6_addr32[3] = 0)); end; function IN6_IS_ADDR_LOOPBACK(const a: PInAddr6): boolean; begin Result := ((a^.u6_addr32[0] = 0) and (a^.u6_addr32[1] = 0) and (a^.u6_addr32[2] = 0) and (a^.u6_addr8[12] = 0) and (a^.u6_addr8[13] = 0) and (a^.u6_addr8[14] = 0) and (a^.u6_addr8[15] = 1)); end; function IN6_IS_ADDR_LINKLOCAL(const a: PInAddr6): boolean; begin Result := ((a^.u6_addr8[0] = $FE) and (a^.u6_addr8[1] = $80)); end; function IN6_IS_ADDR_SITELOCAL(const a: PInAddr6): boolean; begin Result := ((a^.u6_addr8[0] = $FE) and (a^.u6_addr8[1] = $C0)); end; function IN6_IS_ADDR_MULTICAST(const a: PInAddr6): boolean; begin Result := (a^.u6_addr8[0] = $FF); end; function IN6_ADDR_EQUAL(const a: PInAddr6; const b: PInAddr6): boolean; begin Result := (CompareMem( a, b, sizeof(TInAddr6))); end; procedure SET_IN6_IF_ADDR_ANY (const a: PInAddr6); begin FillChar(a^, sizeof(TInAddr6), 0); end; procedure SET_LOOPBACK_ADDR6 (const a: PInAddr6); begin FillChar(a^, sizeof(TInAddr6), 0); a^.u6_addr8[15] := 1; end; {=============================================================================} var {$IFNDEF VER1_0} //FTP version 1.0.x errno_loc: function: PInteger cdecl = nil; {$ELSE} errno_loc: function: PInteger = nil; cdecl; {$ENDIF} function LSWSAStartup(wVersionRequired: Word; var WSData: TWSAData): Integer; begin with WSData do begin wVersion := wVersionRequired; wHighVersion := $202; szDescription := 'Synsock - Synapse Platform Independent Socket Layer'; szSystemStatus := 'Running on Linux'; iMaxSockets := 32768; iMaxUdpDg := 8192; end; Result := 0; end; function LSWSACleanup: Integer; begin Result := 0; end; function LSWSAGetLastError: Integer; var p: PInteger; begin p := errno_loc; Result := p^; end; function __FDELT(Socket: TSocket): Integer; begin Result := Socket div __NFDBITS; end; function __FDMASK(Socket: TSocket): __fd_mask; begin Result := LongWord(1) shl (Socket mod __NFDBITS); end; function FD_ISSET(Socket: TSocket; var fdset: TFDSet): Boolean; begin Result := (fdset.fds_bits[__FDELT(Socket)] and __FDMASK(Socket)) <> 0; end; procedure FD_SET(Socket: TSocket; var fdset: TFDSet); begin fdset.fds_bits[__FDELT(Socket)] := fdset.fds_bits[__FDELT(Socket)] or __FDMASK(Socket); end; procedure FD_CLR(Socket: TSocket; var fdset: TFDSet); begin fdset.fds_bits[__FDELT(Socket)] := fdset.fds_bits[__FDELT(Socket)] and (not __FDMASK(Socket)); end; procedure FD_ZERO(var fdset: TFDSet); var I: Integer; begin with fdset do for I := Low(fds_bits) to High(fds_bits) do fds_bits[I] := 0; end; {=============================================================================} function SizeOfVarSin(sin: TVarSin): integer; begin case sin.sin_family of AF_INET: Result := SizeOf(TSockAddrIn); AF_INET6: Result := SizeOf(TSockAddrIn6); else Result := 0; end; end; {=============================================================================} function Bind(s: TSocket; const addr: TVarSin): Integer; begin Result := ssBind(s, @addr, SizeOfVarSin(addr)); end; function Connect(s: TSocket; const name: TVarSin): Integer; begin Result := ssConnect(s, @name, SizeOfVarSin(name)); end; function GetSockName(s: TSocket; var name: TVarSin): Integer; var len: integer; begin len := SizeOf(name); FillChar(name, len, 0); Result := ssGetSockName(s, @name, Len); end; function GetPeerName(s: TSocket; var name: TVarSin): Integer; var len: integer; begin len := SizeOf(name); FillChar(name, len, 0); Result := ssGetPeerName(s, @name, Len); end; function GetHostName: string; var s: string; begin Result := ''; setlength(s, 255); ssGetHostName(pchar(s), Length(s) - 1); Result := Pchar(s); end; function Send(s: TSocket; Buf: TMemory; len, flags: Integer): Integer; begin Result := ssSend(s, Buf^, len, flags); end; function Recv(s: TSocket; Buf: TMemory; len, flags: Integer): Integer; begin Result := ssRecv(s, Buf^, len, flags); end; function SendTo(s: TSocket; Buf: TMemory; len, flags: Integer; addrto: TVarSin): Integer; begin Result := ssSendTo(s, Buf^, len, flags, @addrto, SizeOfVarSin(addrto)); end; function RecvFrom(s: TSocket; Buf: TMemory; len, flags: Integer; var from: TVarSin): Integer; var x: integer; begin x := SizeOf(from); Result := ssRecvFrom(s, Buf^, len, flags, @from, x); end; function Accept(s: TSocket; var addr: TVarSin): TSocket; var x: integer; begin x := SizeOf(addr); Result := ssAccept(s, @addr, x); end; {=============================================================================} function IsNewApi(Family: integer): Boolean; begin Result := SockEnhancedApi; if not Result then Result := (Family = AF_INET6) and SockWship6Api; end; function SetVarSin(var Sin: TVarSin; IP, Port: string; Family, SockProtocol, SockType: integer; PreferIP4: Boolean): integer; type pu_long = ^u_long; var ProtoEnt: PProtoEnt; ServEnt: PServEnt; HostEnt: PHostEnt; r: integer; Hints1, Hints2: TAddrInfo; Sin1, Sin2: TVarSin; TwoPass: boolean; function GetAddr(const IP, port: string; Hints: TAddrInfo; var Sin: TVarSin): integer; var Addr: PAddrInfo; begin Addr := nil; try FillChar(Sin, Sizeof(Sin), 0); if Hints.ai_socktype = SOCK_RAW then begin Hints.ai_socktype := 0; Hints.ai_protocol := 0; Result := synsock.GetAddrInfo(PChar(IP), nil, @Hints, Addr); end else begin if (IP = cAnyHost) or (IP = c6AnyHost) then begin Hints.ai_flags := AI_PASSIVE; Result := synsock.GetAddrInfo(nil, PChar(Port), @Hints, Addr); end else if (IP = cLocalhost) or (IP = c6Localhost) then begin Result := synsock.GetAddrInfo(nil, PChar(Port), @Hints, Addr); end else begin Result := synsock.GetAddrInfo(PChar(IP), PChar(Port), @Hints, Addr); end; end; if Result = 0 then if (Addr <> nil) then Move(Addr^.ai_addr^, Sin, Addr^.ai_addrlen); finally if Assigned(Addr) then synsock.FreeAddrInfo(Addr); end; end; begin Result := 0; FillChar(Sin, Sizeof(Sin), 0); if not IsNewApi(family) then begin SynSockCS.Enter; try Sin.sin_family := AF_INET; ProtoEnt := synsock.GetProtoByNumber(SockProtocol); ServEnt := nil; if ProtoEnt <> nil then ServEnt := synsock.GetServByName(PChar(Port), ProtoEnt^.p_name); if ServEnt = nil then Sin.sin_port := synsock.htons(StrToIntDef(Port, 0)) else Sin.sin_port := ServEnt^.s_port; if IP = cBroadcast then Sin.sin_addr.s_addr := u_long(INADDR_BROADCAST) else begin Sin.sin_addr.s_addr := synsock.inet_addr(PChar(IP)); if Sin.sin_addr.s_addr = u_long(INADDR_NONE) then begin HostEnt := synsock.GetHostByName(PChar(IP)); Result := synsock.WSAGetLastError; if HostEnt <> nil then Sin.sin_addr.S_addr := u_long(Pu_long(HostEnt^.h_addr_list^)^); end; end; finally SynSockCS.Leave; end; end else begin FillChar(Hints1, Sizeof(Hints1), 0); FillChar(Hints2, Sizeof(Hints2), 0); TwoPass := False; if Family = AF_UNSPEC then begin if PreferIP4 then begin Hints1.ai_family := AF_INET; Hints2.ai_family := AF_INET6; TwoPass := True; end else begin Hints2.ai_family := AF_INET; Hints1.ai_family := AF_INET6; TwoPass := True; end; end else Hints1.ai_family := Family; Hints1.ai_socktype := SockType; Hints1.ai_protocol := SockProtocol; Hints2.ai_socktype := Hints1.ai_socktype; Hints2.ai_protocol := Hints1.ai_protocol; r := GetAddr(IP, Port, Hints1, Sin1); Result := r; sin := sin1; if r <> 0 then if TwoPass then begin r := GetAddr(IP, Port, Hints2, Sin2); Result := r; if r = 0 then sin := sin2; end; end; end; function GetSinIP(Sin: TVarSin): string; var p: PChar; host, serv: string; hostlen, servlen: integer; r: integer; begin Result := ''; if not IsNewApi(Sin.AddressFamily) then begin p := synsock.inet_ntoa(Sin.sin_addr); if p <> nil then Result := p; end else begin hostlen := NI_MAXHOST; servlen := NI_MAXSERV; setlength(host, hostlen); setlength(serv, servlen); r := getnameinfo(@sin, SizeOfVarSin(sin), PChar(host), hostlen, PChar(serv), servlen, NI_NUMERICHOST + NI_NUMERICSERV); if r = 0 then Result := PChar(host); end; end; function GetSinPort(Sin: TVarSin): Integer; begin if (Sin.sin_family = AF_INET6) then Result := synsock.ntohs(Sin.sin6_port) else Result := synsock.ntohs(Sin.sin_port); end; procedure ResolveNameToIP(Name: string; Family, SockProtocol, SockType: integer; const IPList: TStrings); type TaPInAddr = array[0..250] of PInAddr; PaPInAddr = ^TaPInAddr; var Hints: TAddrInfo; Addr: PAddrInfo; AddrNext: PAddrInfo; r: integer; host, serv: string; hostlen, servlen: integer; RemoteHost: PHostEnt; IP: u_long; PAdrPtr: PaPInAddr; i: Integer; s: string; InAddr: TInAddr; begin IPList.Clear; if not IsNewApi(Family) then begin IP := synsock.inet_addr(PChar(Name)); if IP = u_long(INADDR_NONE) then begin SynSockCS.Enter; try RemoteHost := synsock.GetHostByName(PChar(Name)); if RemoteHost <> nil then begin PAdrPtr := PAPInAddr(RemoteHost^.h_addr_list); i := 0; while PAdrPtr^[i] <> nil do begin InAddr := PAdrPtr^[i]^; s := Format('%d.%d.%d.%d', [InAddr.S_bytes[0], InAddr.S_bytes[1], InAddr.S_bytes[2], InAddr.S_bytes[3]]); IPList.Add(s); Inc(i); end; end; finally SynSockCS.Leave; end; end else IPList.Add(Name); end else begin Addr := nil; try FillChar(Hints, Sizeof(Hints), 0); Hints.ai_family := AF_UNSPEC; Hints.ai_socktype := SockType; Hints.ai_protocol := SockProtocol; Hints.ai_flags := 0; r := synsock.GetAddrInfo(PChar(Name), nil, @Hints, Addr); if r = 0 then begin AddrNext := Addr; while not(AddrNext = nil) do begin if not(((Family = AF_INET6) and (AddrNext^.ai_family = AF_INET)) or ((Family = AF_INET) and (AddrNext^.ai_family = AF_INET6))) then begin hostlen := NI_MAXHOST; servlen := NI_MAXSERV; setlength(host, hostlen); setlength(serv, servlen); r := getnameinfo(AddrNext^.ai_addr, AddrNext^.ai_addrlen, PChar(host), hostlen, PChar(serv), servlen, NI_NUMERICHOST + NI_NUMERICSERV); if r = 0 then begin host := PChar(host); IPList.Add(host); end; end; AddrNext := AddrNext^.ai_next; end; end; finally if Assigned(Addr) then synsock.FreeAddrInfo(Addr); end; end; if IPList.Count = 0 then IPList.Add(cAnyHost); end; function ResolvePort(Port: string; Family, SockProtocol, SockType: integer): Word; var ProtoEnt: PProtoEnt; ServEnt: PServEnt; Hints: TAddrInfo; Addr: PAddrInfo; r: integer; begin Result := 0; if not IsNewApi(Family) then begin SynSockCS.Enter; try ProtoEnt := synsock.GetProtoByNumber(SockProtocol); ServEnt := nil; if ProtoEnt <> nil then ServEnt := synsock.GetServByName(PChar(Port), ProtoEnt^.p_name); if ServEnt = nil then Result := StrToIntDef(Port, 0) else Result := synsock.htons(ServEnt^.s_port); finally SynSockCS.Leave; end; end else begin Addr := nil; try FillChar(Hints, Sizeof(Hints), 0); Hints.ai_family := AF_UNSPEC; Hints.ai_socktype := SockType; Hints.ai_protocol := Sockprotocol; Hints.ai_flags := AI_PASSIVE; r := synsock.GetAddrInfo(nil, PChar(Port), @Hints, Addr); if (r = 0) and Assigned(Addr) then begin if Addr^.ai_family = AF_INET then Result := synsock.htons(Addr^.ai_addr^.sin_port); if Addr^.ai_family = AF_INET6 then Result := synsock.htons(PSockAddrIn6(Addr^.ai_addr)^.sin6_port); end; finally if Assigned(Addr) then synsock.FreeAddrInfo(Addr); end; end; end; function ResolveIPToName(IP: string; Family, SockProtocol, SockType: integer): string; var Hints: TAddrInfo; Addr: PAddrInfo; r: integer; host, serv: string; hostlen, servlen: integer; RemoteHost: PHostEnt; IPn: u_long; begin Result := IP; if not IsNewApi(Family) then begin IPn := synsock.inet_addr(PChar(IP)); if IPn <> u_long(INADDR_NONE) then begin SynSockCS.Enter; try RemoteHost := GetHostByAddr(@IPn, SizeOf(IPn), AF_INET); if RemoteHost <> nil then Result := RemoteHost^.h_name; finally SynSockCS.Leave; end; end; end else begin Addr := nil; try FillChar(Hints, Sizeof(Hints), 0); Hints.ai_family := AF_UNSPEC; Hints.ai_socktype := SockType; Hints.ai_protocol := SockProtocol; Hints.ai_flags := 0; r := synsock.GetAddrInfo(PChar(IP), nil, @Hints, Addr); if (r = 0) and Assigned(Addr)then begin hostlen := NI_MAXHOST; servlen := NI_MAXSERV; setlength(host, hostlen); setlength(serv, servlen); r := getnameinfo(Addr^.ai_addr, Addr^.ai_addrlen, PChar(host), hostlen, PChar(serv), servlen, NI_NUMERICSERV); if r = 0 then Result := PChar(host); end; finally if Assigned(Addr) then synsock.FreeAddrInfo(Addr); end; end; end; {=============================================================================} function InitSocketInterface(stack: string): Boolean; begin Result := False; SockEnhancedApi := False; if stack = '' then stack := DLLStackName; SynSockCS.Enter; try if SynSockCount = 0 then begin SockEnhancedApi := False; SockWship6Api := False; Libc.Signal(Libc.SIGPIPE, TSignalHandler(Libc.SIG_IGN)); LibHandle := LoadLibrary(PChar(Stack)); if LibHandle <> 0 then begin errno_loc := GetProcAddress(LibHandle, PChar('__errno_location')); CloseSocket := GetProcAddress(LibHandle, PChar('close')); IoctlSocket := GetProcAddress(LibHandle, PChar('ioctl')); WSAGetLastError := LSWSAGetLastError; WSAStartup := LSWSAStartup; WSACleanup := LSWSACleanup; ssAccept := GetProcAddress(LibHandle, PChar('accept')); ssBind := GetProcAddress(LibHandle, PChar('bind')); ssConnect := GetProcAddress(LibHandle, PChar('connect')); ssGetPeerName := GetProcAddress(LibHandle, PChar('getpeername')); ssGetSockName := GetProcAddress(LibHandle, PChar('getsockname')); GetSockOpt := GetProcAddress(LibHandle, PChar('getsockopt')); Htonl := GetProcAddress(LibHandle, PChar('htonl')); Htons := GetProcAddress(LibHandle, PChar('htons')); Inet_Addr := GetProcAddress(LibHandle, PChar('inet_addr')); Inet_Ntoa := GetProcAddress(LibHandle, PChar('inet_ntoa')); Listen := GetProcAddress(LibHandle, PChar('listen')); Ntohl := GetProcAddress(LibHandle, PChar('ntohl')); Ntohs := GetProcAddress(LibHandle, PChar('ntohs')); ssRecv := GetProcAddress(LibHandle, PChar('recv')); ssRecvFrom := GetProcAddress(LibHandle, PChar('recvfrom')); Select := GetProcAddress(LibHandle, PChar('select')); ssSend := GetProcAddress(LibHandle, PChar('send')); ssSendTo := GetProcAddress(LibHandle, PChar('sendto')); SetSockOpt := GetProcAddress(LibHandle, PChar('setsockopt')); ShutDown := GetProcAddress(LibHandle, PChar('shutdown')); Socket := GetProcAddress(LibHandle, PChar('socket')); GetHostByAddr := GetProcAddress(LibHandle, PChar('gethostbyaddr')); GetHostByName := GetProcAddress(LibHandle, PChar('gethostbyname')); GetProtoByName := GetProcAddress(LibHandle, PChar('getprotobyname')); GetProtoByNumber := GetProcAddress(LibHandle, PChar('getprotobynumber')); GetServByName := GetProcAddress(LibHandle, PChar('getservbyname')); GetServByPort := GetProcAddress(LibHandle, PChar('getservbyport')); ssGetHostName := GetProcAddress(LibHandle, PChar('gethostname')); {$IFNDEF FORCEOLDAPI} GetAddrInfo := GetProcAddress(LibHandle, PChar('getaddrinfo')); FreeAddrInfo := GetProcAddress(LibHandle, PChar('freeaddrinfo')); GetNameInfo := GetProcAddress(LibHandle, PChar('getnameinfo')); SockEnhancedApi := Assigned(GetAddrInfo) and Assigned(FreeAddrInfo) and Assigned(GetNameInfo); {$ENDIF} Result := True; end; end else Result := True; if Result then Inc(SynSockCount); finally SynSockCS.Leave; end; end; function DestroySocketInterface: Boolean; begin SynSockCS.Enter; try Dec(SynSockCount); if SynSockCount < 0 then SynSockCount := 0; if SynSockCount = 0 then begin if LibHandle <> 0 then begin FreeLibrary(libHandle); LibHandle := 0; end; if LibWship6Handle <> 0 then begin FreeLibrary(LibWship6Handle); LibWship6Handle := 0; end; end; finally SynSockCS.Leave; end; Result := True; end; initialization begin SynSockCS := SyncObjs.TCriticalSection.Create; SET_IN6_IF_ADDR_ANY (@in6addr_any); SET_LOOPBACK_ADDR6 (@in6addr_loopback); end; finalization begin SynSockCS.Free; end; {$ENDIF} �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/synapse/ftpsend.pas�������������������������������������������������0000644�0001750�0001750�00000154013�12014201074�021411� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{==============================================================================| | Project : Ararat Synapse | 004.000.000 | |==============================================================================| | Content: FTP client | |==============================================================================| | Copyright (c)1999-2011, Lukas Gebauer | | All rights reserved. | | | | Redistribution and use in source and binary forms, with or without | | modification, are permitted provided that the following conditions are met: | | | | Redistributions of source code must retain the above copyright notice, this | | list of conditions and the following disclaimer. | | | | Redistributions in binary form must reproduce the above copyright notice, | | this list of conditions and the following disclaimer in the documentation | | and/or other materials provided with the distribution. | | | | Neither the name of Lukas Gebauer nor the names of its contributors may | | be used to endorse or promote products derived from this software without | | specific prior written permission. | | | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | | ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR | | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | | DAMAGE. | |==============================================================================| | The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).| | Portions created by Lukas Gebauer are Copyright (c) 1999-2010. | | All Rights Reserved. | |==============================================================================| | Contributor(s): | | Petr Esner <petr.esner@atlas.cz> | |==============================================================================| | History: see HISTORY.HTM from distribution package | | (Found at URL: http://www.ararat.cz/synapse/) | |==============================================================================} {: @abstract(FTP client protocol) Used RFC: RFC-959, RFC-2228, RFC-2428 } {$IFDEF FPC} {$MODE DELPHI} {$ENDIF} {$H+} {$TYPEINFO ON}// Borland changed defualt Visibility from Public to Published // and it requires RTTI to be generated $M+ {$M+} {$IFDEF UNICODE} {$WARN IMPLICIT_STRING_CAST OFF} {$WARN IMPLICIT_STRING_CAST_LOSS OFF} {$ENDIF} unit ftpsend; interface uses SysUtils, Classes, blcksock, synautil, synaip, synsock; const cFtpProtocol = '21'; cFtpDataProtocol = '20'; {:Terminating value for TLogonActions} FTP_OK = 255; {:Terminating value for TLogonActions} FTP_ERR = 254; type {:Array for holding definition of logon sequence.} TLogonActions = array [0..17] of byte; {:Procedural type for OnStatus event. Sender is calling @link(TFTPSend) object. Value is FTP command or reply to this comand. (if it is reply, Response is @True).} TFTPStatus = procedure(Sender: TObject; Response: Boolean; const Value: string) of object; {: @abstract(Object for holding file information) parsed from directory listing of FTP server.} TFTPListRec = class(TObject) private FFileName: String; FDirectory: Boolean; FReadable: Boolean; FFileSize: int64; FFileTime: TDateTime; FOriginalLine: string; FMask: string; FPermission: String; public {: You can assign another TFTPListRec to this object.} procedure Assign(Value: TFTPListRec); virtual; {:name of file} property FileName: string read FFileName write FFileName; {:if name is subdirectory not file.} property Directory: Boolean read FDirectory write FDirectory; {:if you have rights to read} property Readable: Boolean read FReadable write FReadable; {:size of file in bytes} property FileSize: int64 read FFileSize write FFileSize; {:date and time of file. Local server timezone is used. Any timezone conversions was not done!} property FileTime: TDateTime read FFileTime write FFileTime; {:original unparsed line} property OriginalLine: string read FOriginalLine write FOriginalLine; {:mask what was used for parsing} property Mask: string read FMask write FMask; {:permission string (depending on used mask!)} property Permission: string read FPermission write FPermission; end; {:@abstract(This is TList of TFTPListRec objects.) This object is used for holding lististing of all files information in listed directory on FTP server.} TFTPList = class(TObject) protected FList: TList; FLines: TStringList; FMasks: TStringList; FUnparsedLines: TStringList; Monthnames: string; BlockSize: string; DirFlagValue: string; FileName: string; VMSFileName: string; Day: string; Month: string; ThreeMonth: string; YearTime: string; Year: string; Hours: string; HoursModif: Ansistring; Minutes: string; Seconds: string; Size: Ansistring; Permissions: Ansistring; DirFlag: string; function GetListItem(Index: integer): TFTPListRec; virtual; function ParseEPLF(Value: string): Boolean; virtual; procedure ClearStore; virtual; function ParseByMask(Value, NextValue, Mask: ansistring): Integer; virtual; function CheckValues: Boolean; virtual; procedure FillRecord(const Value: TFTPListRec); virtual; public {:Constructor. You not need create this object, it is created by TFTPSend class as their property.} constructor Create; destructor Destroy; override; {:Clear list.} procedure Clear; virtual; {:count of holded @link(TFTPListRec) objects} function Count: integer; virtual; {:Assigns one list to another} procedure Assign(Value: TFTPList); virtual; {:try to parse raw directory listing in @link(lines) to list of @link(TFTPListRec).} procedure ParseLines; virtual; {:By this property you have access to list of @link(TFTPListRec). This is for compatibility only. Please, use @link(Items) instead.} property List: TList read FList; {:By this property you have access to list of @link(TFTPListRec).} property Items[Index: Integer]: TFTPListRec read GetListItem; default; {:Set of lines with RAW directory listing for @link(parseLines)} property Lines: TStringList read FLines; {:Set of masks for directory listing parser. It is predefined by default, however you can modify it as you need. (for example, you can add your own definition mask.) Mask is same as mask used in TotalCommander.} property Masks: TStringList read FMasks; {:After @link(ParseLines) it holding lines what was not sucessfully parsed.} property UnparsedLines: TStringList read FUnparsedLines; end; {:@abstract(Implementation of FTP protocol.) Note: Are you missing properties for setting Username and Password? Look to parent @link(TSynaClient) object! (Username and Password have default values for "anonymous" FTP login) Are you missing properties for specify server address and port? Look to parent @link(TSynaClient) too!} TFTPSend = class(TSynaClient) protected FOnStatus: TFTPStatus; FSock: TTCPBlockSocket; FDSock: TTCPBlockSocket; FResultCode: Integer; FResultString: string; FFullResult: TStringList; FAccount: string; FFWHost: string; FFWPort: string; FFWUsername: string; FFWPassword: string; FFWMode: integer; FDataStream: TMemoryStream; FDataIP: string; FDataPort: string; FDirectFile: Boolean; FDirectFileName: string; FCanResume: Boolean; FPassiveMode: Boolean; FForceDefaultPort: Boolean; FForceOldPort: Boolean; FFtpList: TFTPList; FBinaryMode: Boolean; FAutoTLS: Boolean; FIsTLS: Boolean; FIsDataTLS: Boolean; FTLSonData: Boolean; FFullSSL: Boolean; function Auth(Mode: integer): Boolean; virtual; function Connect: Boolean; virtual; function InternalStor(const Command: string; RestoreAt: int64): Boolean; virtual; function DataSocket: Boolean; virtual; function AcceptDataSocket: Boolean; virtual; procedure DoStatus(Response: Boolean; const Value: string); virtual; public {:Custom definition of login sequence. You can use this when you set @link(FWMode) to value -1.} CustomLogon: TLogonActions; constructor Create; destructor Destroy; override; {:Waits and read FTP server response. You need this only in special cases!} function ReadResult: Integer; virtual; {:Parse remote side information of data channel from value string (returned by PASV command). This function you need only in special cases!} procedure ParseRemote(Value: string); virtual; {:Parse remote side information of data channel from value string (returned by EPSV command). This function you need only in special cases!} procedure ParseRemoteEPSV(Value: string); virtual; {:Send Value as FTP command to FTP server. Returned result code is result of this function. This command is good for sending site specific command, or non-standard commands.} function FTPCommand(const Value: string): integer; virtual; {:Connect and logon to FTP server. If you specify any FireWall, connect to firewall and throw them connect to FTP server. Login sequence depending on @link(FWMode).} function Login: Boolean; virtual; {:Logoff and disconnect from FTP server.} function Logout: Boolean; virtual; {:Break current transmission of data. (You can call this method from Sock.OnStatus event, or from another thread.)} procedure Abort; virtual; {:Break current transmission of data. It is same as Abort, but it send abort telnet commands prior ABOR FTP command. Some servers need it. (You can call this method from Sock.OnStatus event, or from another thread.)} procedure TelnetAbort; virtual; {:Download directory listing of Directory on FTP server. If Directory is empty string, download listing of current working directory. If NameList is @true, download only names of files in directory. (internally use NLST command instead LIST command) If NameList is @false, returned list is also parsed to @link(FTPList) property.} function List(Directory: string; NameList: Boolean): Boolean; virtual; {:Read data from FileName on FTP server. If Restore is @true and server supports resume dowloads, download is resumed. (received is only rest of file)} function RetrieveFile(const FileName: string; Restore: Boolean): Boolean; virtual; {:Send data to FileName on FTP server. If Restore is @true and server supports resume upload, upload is resumed. (send only rest of file) In this case if remote file is same length as local file, nothing will be done. If remote file is larger then local, resume is disabled and file is transfered from begin!} function StoreFile(const FileName: string; Restore: Boolean): Boolean; virtual; {:Send data to FTP server and assing unique name for this file.} function StoreUniqueFile: Boolean; virtual; {:Append data to FileName on FTP server.} function AppendFile(const FileName: string): Boolean; virtual; {:Rename on FTP server file with OldName to NewName.} function RenameFile(const OldName, NewName: string): Boolean; virtual; {:Delete file FileName on FTP server.} function DeleteFile(const FileName: string): Boolean; virtual; {:Return size of Filename file on FTP server. If command failed (i.e. not implemented), return -1.} function FileSize(const FileName: string): int64; virtual; {:Send NOOP command to FTP server for preserve of disconnect by inactivity timeout.} function NoOp: Boolean; virtual; {:Change currect working directory to Directory on FTP server.} function ChangeWorkingDir(const Directory: string): Boolean; virtual; {:walk to upper directory on FTP server.} function ChangeToParentDir: Boolean; virtual; {:walk to root directory on FTP server. (May not work with all servers properly!)} function ChangeToRootDir: Boolean; virtual; {:Delete Directory on FTP server.} function DeleteDir(const Directory: string): Boolean; virtual; {:Create Directory on FTP server.} function CreateDir(const Directory: string): Boolean; virtual; {:Return current working directory on FTP server.} function GetCurrentDir: String; virtual; {:Establish data channel to FTP server and retrieve data. This function you need only in special cases, i.e. when you need to implement some special unsupported FTP command!} function DataRead(const DestStream: TStream): Boolean; virtual; {:Establish data channel to FTP server and send data. This function you need only in special cases, i.e. when you need to implement some special unsupported FTP command.} function DataWrite(const SourceStream: TStream): Boolean; virtual; published {:After FTP command contains result number of this operation.} property ResultCode: Integer read FResultCode; {:After FTP command contains main line of result.} property ResultString: string read FResultString; {:After any FTP command it contains all lines of FTP server reply.} property FullResult: TStringList read FFullResult; {:Account information used in some cases inside login sequence.} property Account: string read FAccount Write FAccount; {:Address of firewall. If empty string (default), firewall not used.} property FWHost: string read FFWHost Write FFWHost; {:port of firewall. standard value is same port as ftp server used. (21)} property FWPort: string read FFWPort Write FFWPort; {:Username for login to firewall. (if needed)} property FWUsername: string read FFWUsername Write FFWUsername; {:password for login to firewall. (if needed)} property FWPassword: string read FFWPassword Write FFWPassword; {:Type of Firewall. Used only if you set some firewall address. Supported predefined firewall login sequences are described by comments in source file where you can see pseudocode decribing each sequence.} property FWMode: integer read FFWMode Write FFWMode; {:Socket object used for TCP/IP operation on control channel. Good for seting OnStatus hook, etc.} property Sock: TTCPBlockSocket read FSock; {:Socket object used for TCP/IP operation on data channel. Good for seting OnStatus hook, etc.} property DSock: TTCPBlockSocket read FDSock; {:If you not use @link(DirectFile) mode, all data transfers is made to or from this stream.} property DataStream: TMemoryStream read FDataStream; {:After data connection is established, contains remote side IP of this connection.} property DataIP: string read FDataIP; {:After data connection is established, contains remote side port of this connection.} property DataPort: string read FDataPort; {:Mode of data handling by data connection. If @False, all data operations are made to or from @link(DataStream) TMemoryStream. If @true, data operations is made directly to file in your disk. (filename is specified by @link(DirectFileName) property.) Dafault is @False!} property DirectFile: Boolean read FDirectFile Write FDirectFile; {:Filename for direct disk data operations.} property DirectFileName: string read FDirectFileName Write FDirectFileName; {:Indicate after @link(Login) if remote server support resume downloads and uploads.} property CanResume: Boolean read FCanResume; {:If true (default value), all transfers is made by passive method. It is safer method for various firewalls.} property PassiveMode: Boolean read FPassiveMode Write FPassiveMode; {:Force to listen for dataconnection on standard port (20). Default is @false, dataconnections will be made to any non-standard port reported by PORT FTP command. This setting is not used, if you use passive mode.} property ForceDefaultPort: Boolean read FForceDefaultPort Write FForceDefaultPort; {:When is @true, then is disabled EPSV and EPRT support. However without this commands you cannot use IPv6! (Disabling of this commands is needed only when you are behind some crap firewall/NAT.} property ForceOldPort: Boolean read FForceOldPort Write FForceOldPort; {:You may set this hook for monitoring FTP commands and replies.} property OnStatus: TFTPStatus read FOnStatus write FOnStatus; {:After LIST command is here parsed list of files in given directory.} property FtpList: TFTPList read FFtpList; {:if @true (default), then data transfers is in binary mode. If this is set to @false, then ASCII mode is used.} property BinaryMode: Boolean read FBinaryMode Write FBinaryMode; {:if is true, then if server support upgrade to SSL/TLS mode, then use them.} property AutoTLS: Boolean read FAutoTLS Write FAutoTLS; {:if server listen on SSL/TLS port, then you set this to true.} property FullSSL: Boolean read FFullSSL Write FFullSSL; {:Signalise, if control channel is in SSL/TLS mode.} property IsTLS: Boolean read FIsTLS; {:Signalise, if data transfers is in SSL/TLS mode.} property IsDataTLS: Boolean read FIsDataTLS; {:If @true (default), then try to use SSL/TLS on data transfers too. If @false, then SSL/TLS is used only for control connection.} property TLSonData: Boolean read FTLSonData write FTLSonData; end; {:A very useful function, and example of use can be found in the TFtpSend object. Dowload specified file from FTP server to LocalFile.} function FtpGetFile(const IP, Port, FileName, LocalFile, User, Pass: string): Boolean; {:A very useful function, and example of use can be found in the TFtpSend object. Upload specified LocalFile to FTP server.} function FtpPutFile(const IP, Port, FileName, LocalFile, User, Pass: string): Boolean; {:A very useful function, and example of use can be found in the TFtpSend object. Initiate transfer of file between two FTP servers.} function FtpInterServerTransfer( const FromIP, FromPort, FromFile, FromUser, FromPass: string; const ToIP, ToPort, ToFile, ToUser, ToPass: string): Boolean; implementation constructor TFTPSend.Create; begin inherited Create; FFullResult := TStringList.Create; FDataStream := TMemoryStream.Create; FSock := TTCPBlockSocket.Create; FSock.Owner := self; FSock.ConvertLineEnd := True; FDSock := TTCPBlockSocket.Create; FDSock.Owner := self; FFtpList := TFTPList.Create; FTimeout := 300000; FTargetPort := cFtpProtocol; FUsername := 'anonymous'; FPassword := 'anonymous@' + FSock.LocalName; FDirectFile := False; FPassiveMode := True; FForceDefaultPort := False; FForceOldPort := false; FAccount := ''; FFWHost := ''; FFWPort := cFtpProtocol; FFWUsername := ''; FFWPassword := ''; FFWMode := 0; FBinaryMode := True; FAutoTLS := False; FFullSSL := False; FIsTLS := False; FIsDataTLS := False; FTLSonData := True; end; destructor TFTPSend.Destroy; begin FDSock.Free; FSock.Free; FFTPList.Free; FDataStream.Free; FFullResult.Free; inherited Destroy; end; procedure TFTPSend.DoStatus(Response: Boolean; const Value: string); begin if assigned(OnStatus) then OnStatus(Self, Response, Value); end; function TFTPSend.ReadResult: Integer; var s, c: AnsiString; begin FFullResult.Clear; c := ''; repeat s := FSock.RecvString(FTimeout); if c = '' then if length(s) > 3 then if s[4] in [' ', '-'] then c :=Copy(s, 1, 3); FResultString := s; FFullResult.Add(s); DoStatus(True, s); if FSock.LastError <> 0 then Break; until (c <> '') and (Pos(c + ' ', s) = 1); Result := StrToIntDef(c, 0); FResultCode := Result; end; function TFTPSend.FTPCommand(const Value: string): integer; begin FSock.Purge; FSock.SendString(Value + CRLF); DoStatus(False, Value); Result := ReadResult; end; // based on idea by Petr Esner <petr.esner@atlas.cz> function TFTPSend.Auth(Mode: integer): Boolean; const //if not USER <username> then // if not PASS <password> then // if not ACCT <account> then ERROR! //OK! Action0: TLogonActions = (0, FTP_OK, 3, 1, FTP_OK, 6, 2, FTP_OK, FTP_ERR, 0, 0, 0, 0, 0, 0, 0, 0, 0); //if not USER <FWusername> then // if not PASS <FWPassword> then ERROR! //if SITE <FTPServer> then ERROR! //if not USER <username> then // if not PASS <password> then // if not ACCT <account> then ERROR! //OK! Action1: TLogonActions = (3, 6, 3, 4, 6, FTP_ERR, 5, FTP_ERR, 9, 0, FTP_OK, 12, 1, FTP_OK, 15, 2, FTP_OK, FTP_ERR); //if not USER <FWusername> then // if not PASS <FWPassword> then ERROR! //if USER <UserName>'@'<FTPServer> then OK! //if not PASS <password> then // if not ACCT <account> then ERROR! //OK! Action2: TLogonActions = (3, 6, 3, 4, 6, FTP_ERR, 6, FTP_OK, 9, 1, FTP_OK, 12, 2, FTP_OK, FTP_ERR, 0, 0, 0); //if not USER <FWusername> then // if not PASS <FWPassword> then ERROR! //if not USER <username> then // if not PASS <password> then // if not ACCT <account> then ERROR! //OK! Action3: TLogonActions = (3, 6, 3, 4, 6, FTP_ERR, 0, FTP_OK, 9, 1, FTP_OK, 12, 2, FTP_OK, FTP_ERR, 0, 0, 0); //OPEN <FTPserver> //if not USER <username> then // if not PASS <password> then // if not ACCT <account> then ERROR! //OK! Action4: TLogonActions = (7, 3, 3, 0, FTP_OK, 6, 1, FTP_OK, 9, 2, FTP_OK, FTP_ERR, 0, 0, 0, 0, 0, 0); //if USER <UserName>'@'<FTPServer> then OK! //if not PASS <password> then // if not ACCT <account> then ERROR! //OK! Action5: TLogonActions = (6, FTP_OK, 3, 1, FTP_OK, 6, 2, FTP_OK, FTP_ERR, 0, 0, 0, 0, 0, 0, 0, 0, 0); //if not USER <FWUserName>@<FTPServer> then // if not PASS <FWPassword> then ERROR! //if not USER <username> then // if not PASS <password> then // if not ACCT <account> then ERROR! //OK! Action6: TLogonActions = (8, 6, 3, 4, 6, FTP_ERR, 0, FTP_OK, 9, 1, FTP_OK, 12, 2, FTP_OK, FTP_ERR, 0, 0, 0); //if USER <UserName>@<FTPServer> <FWUserName> then ERROR! //if not PASS <password> then // if not ACCT <account> then ERROR! //OK! Action7: TLogonActions = (9, FTP_ERR, 3, 1, FTP_OK, 6, 2, FTP_OK, FTP_ERR, 0, 0, 0, 0, 0, 0, 0, 0, 0); //if not USER <UserName>@<FWUserName>@<FTPServer> then // if not PASS <Password>@<FWPassword> then // if not ACCT <account> then ERROR! //OK! Action8: TLogonActions = (10, FTP_OK, 3, 11, FTP_OK, 6, 2, FTP_OK, FTP_ERR, 0, 0, 0, 0, 0, 0, 0, 0, 0); var FTPServer: string; LogonActions: TLogonActions; i: integer; s: string; x: integer; begin Result := False; if FFWHost = '' then Mode := 0; if (FTargetPort = cFtpProtocol) or (FTargetPort = '21') then FTPServer := FTargetHost else FTPServer := FTargetHost + ':' + FTargetPort; case Mode of -1: LogonActions := CustomLogon; 1: LogonActions := Action1; 2: LogonActions := Action2; 3: LogonActions := Action3; 4: LogonActions := Action4; 5: LogonActions := Action5; 6: LogonActions := Action6; 7: LogonActions := Action7; 8: LogonActions := Action8; else LogonActions := Action0; end; i := 0; repeat case LogonActions[i] of 0: s := 'USER ' + FUserName; 1: s := 'PASS ' + FPassword; 2: s := 'ACCT ' + FAccount; 3: s := 'USER ' + FFWUserName; 4: s := 'PASS ' + FFWPassword; 5: s := 'SITE ' + FTPServer; 6: s := 'USER ' + FUserName + '@' + FTPServer; 7: s := 'OPEN ' + FTPServer; 8: s := 'USER ' + FFWUserName + '@' + FTPServer; 9: s := 'USER ' + FUserName + '@' + FTPServer + ' ' + FFWUserName; 10: s := 'USER ' + FUserName + '@' + FFWUserName + '@' + FTPServer; 11: s := 'PASS ' + FPassword + '@' + FFWPassword; end; x := FTPCommand(s); x := x div 100; if (x <> 2) and (x <> 3) then Exit; i := LogonActions[i + x - 1]; case i of FTP_ERR: Exit; FTP_OK: begin Result := True; Exit; end; end; until False; end; function TFTPSend.Connect: Boolean; begin FSock.CloseSocket; FSock.Bind(FIPInterface, cAnyPort); if FSock.LastError = 0 then if FFWHost = '' then FSock.Connect(FTargetHost, FTargetPort) else FSock.Connect(FFWHost, FFWPort); if FSock.LastError = 0 then if FFullSSL then FSock.SSLDoConnect; Result := FSock.LastError = 0; end; function TFTPSend.Login: Boolean; var x: integer; begin Result := False; FCanResume := False; if not Connect then Exit; FIsTLS := FFullSSL; FIsDataTLS := False; repeat x := ReadResult div 100; until x <> 1; if x <> 2 then Exit; if FAutoTLS and not(FIsTLS) then if (FTPCommand('AUTH TLS') div 100) = 2 then begin FSock.SSLDoConnect; FIsTLS := FSock.LastError = 0; if not FIsTLS then begin Result := False; Exit; end; end; if not Auth(FFWMode) then Exit; if FIsTLS then begin FTPCommand('PBSZ 0'); if FTLSonData then FIsDataTLS := (FTPCommand('PROT P') div 100) = 2; if not FIsDataTLS then FTPCommand('PROT C'); end; FTPCommand('TYPE I'); FTPCommand('STRU F'); FTPCommand('MODE S'); if FTPCommand('REST 0') = 350 then if FTPCommand('REST 1') = 350 then begin FTPCommand('REST 0'); FCanResume := True; end; Result := True; end; function TFTPSend.Logout: Boolean; begin Result := (FTPCommand('QUIT') div 100) = 2; FSock.CloseSocket; end; procedure TFTPSend.ParseRemote(Value: string); var n: integer; nb, ne: integer; s: string; x: integer; begin Value := trim(Value); nb := Pos('(',Value); ne := Pos(')',Value); if (nb = 0) or (ne = 0) then begin nb:=RPos(' ',Value); s:=Copy(Value, nb + 1, Length(Value) - nb); end else begin s:=Copy(Value,nb+1,ne-nb-1); end; for n := 1 to 4 do if n = 1 then FDataIP := Fetch(s, ',') else FDataIP := FDataIP + '.' + Fetch(s, ','); x := StrToIntDef(Fetch(s, ','), 0) * 256; x := x + StrToIntDef(Fetch(s, ','), 0); FDataPort := IntToStr(x); end; procedure TFTPSend.ParseRemoteEPSV(Value: string); var n: integer; s, v: AnsiString; begin s := SeparateRight(Value, '('); s := Trim(SeparateLeft(s, ')')); Delete(s, Length(s), 1); v := ''; for n := Length(s) downto 1 do if s[n] in ['0'..'9'] then v := s[n] + v else Break; FDataPort := v; FDataIP := FTargetHost; end; function TFTPSend.DataSocket: boolean; var s: string; begin Result := False; if FIsDataTLS then FPassiveMode := True; if FPassiveMode then begin if FSock.IP6used then s := '2' else s := '1'; if FSock.IP6used and not(FForceOldPort) and ((FTPCommand('EPSV ' + s) div 100) = 2) then begin ParseRemoteEPSV(FResultString); end else if FSock.IP6used then Exit else begin if (FTPCommand('PASV') div 100) <> 2 then Exit; ParseRemote(FResultString); end; FDSock.CloseSocket; FDSock.Bind(FIPInterface, cAnyPort); FDSock.Connect(FDataIP, FDataPort); Result := FDSock.LastError = 0; end else begin FDSock.CloseSocket; if FForceDefaultPort then s := cFtpDataProtocol else s := '0'; //data conection from same interface as command connection FDSock.Bind(FSock.GetLocalSinIP, s); if FDSock.LastError <> 0 then Exit; FDSock.SetLinger(True, 10000); FDSock.Listen; FDSock.GetSins; FDataIP := FDSock.GetLocalSinIP; FDataIP := FDSock.ResolveName(FDataIP); FDataPort := IntToStr(FDSock.GetLocalSinPort); if FSock.IP6used and (not FForceOldPort) then begin if IsIp6(FDataIP) then s := '2' else s := '1'; s := 'EPRT |' + s +'|' + FDataIP + '|' + FDataPort + '|'; Result := (FTPCommand(s) div 100) = 2; end; if not Result and IsIP(FDataIP) then begin s := ReplaceString(FDataIP, '.', ','); s := 'PORT ' + s + ',' + IntToStr(FDSock.GetLocalSinPort div 256) + ',' + IntToStr(FDSock.GetLocalSinPort mod 256); Result := (FTPCommand(s) div 100) = 2; end; end; end; function TFTPSend.AcceptDataSocket: Boolean; var x: TSocket; begin if FPassiveMode then Result := True else begin Result := False; if FDSock.CanRead(FTimeout) then begin x := FDSock.Accept; if not FDSock.UsingSocks then FDSock.CloseSocket; FDSock.Socket := x; Result := True; end; end; if Result and FIsDataTLS then begin FDSock.SSL.Assign(FSock.SSL); FDSock.SSLDoConnect; Result := FDSock.LastError = 0; end; end; function TFTPSend.DataRead(const DestStream: TStream): Boolean; var x: integer; begin Result := False; try if not AcceptDataSocket then Exit; FDSock.RecvStreamRaw(DestStream, FTimeout); FDSock.CloseSocket; x := ReadResult; Result := (x div 100) = 2; finally FDSock.CloseSocket; end; end; function TFTPSend.DataWrite(const SourceStream: TStream): Boolean; var x: integer; b: Boolean; begin Result := False; try if not AcceptDataSocket then Exit; FDSock.SendStreamRaw(SourceStream); b := FDSock.LastError = 0; FDSock.CloseSocket; x := ReadResult; Result := b and ((x div 100) = 2); finally FDSock.CloseSocket; end; end; function TFTPSend.List(Directory: string; NameList: Boolean): Boolean; var x: integer; begin Result := False; FDataStream.Clear; FFTPList.Clear; if Directory <> '' then Directory := ' ' + Directory; FTPCommand('TYPE A'); if not DataSocket then Exit; if NameList then x := FTPCommand('NLST' + Directory) else x := FTPCommand('LIST' + Directory); if (x div 100) <> 1 then Exit; Result := DataRead(FDataStream); if (not NameList) and Result then begin FDataStream.Position := 0; FFTPList.Lines.LoadFromStream(FDataStream); FFTPList.ParseLines; end; FDataStream.Position := 0; end; function TFTPSend.RetrieveFile(const FileName: string; Restore: Boolean): Boolean; var RetrStream: TStream; begin Result := False; if FileName = '' then Exit; if not DataSocket then Exit; Restore := Restore and FCanResume; if FDirectFile then if Restore and FileExists(FDirectFileName) then RetrStream := TFileStream.Create(FDirectFileName, fmOpenReadWrite or fmShareExclusive) else RetrStream := TFileStream.Create(FDirectFileName, fmCreate or fmShareDenyWrite) else RetrStream := FDataStream; try if FBinaryMode then FTPCommand('TYPE I') else FTPCommand('TYPE A'); if Restore then begin RetrStream.Position := RetrStream.Size; if (FTPCommand('REST ' + IntToStr(RetrStream.Size)) div 100) <> 3 then Exit; end else if RetrStream is TMemoryStream then TMemoryStream(RetrStream).Clear; if (FTPCommand('RETR ' + FileName) div 100) <> 1 then Exit; Result := DataRead(RetrStream); if not FDirectFile then RetrStream.Position := 0; finally if FDirectFile then RetrStream.Free; end; end; function TFTPSend.InternalStor(const Command: string; RestoreAt: int64): Boolean; var SendStream: TStream; StorSize: int64; begin Result := False; if FDirectFile then if not FileExists(FDirectFileName) then Exit else SendStream := TFileStream.Create(FDirectFileName, fmOpenRead or fmShareDenyWrite) else SendStream := FDataStream; try if not DataSocket then Exit; if FBinaryMode then FTPCommand('TYPE I') else FTPCommand('TYPE A'); StorSize := SendStream.Size; if not FCanResume then RestoreAt := 0; if (StorSize > 0) and (RestoreAt = StorSize) then begin Result := True; Exit; end; if RestoreAt > StorSize then RestoreAt := 0; FTPCommand('ALLO ' + IntToStr(StorSize - RestoreAt)); if FCanResume then if (FTPCommand('REST ' + IntToStr(RestoreAt)) div 100) <> 3 then Exit; SendStream.Position := RestoreAt; if (FTPCommand(Command) div 100) <> 1 then Exit; Result := DataWrite(SendStream); finally if FDirectFile then SendStream.Free; end; end; function TFTPSend.StoreFile(const FileName: string; Restore: Boolean): Boolean; var RestoreAt: int64; begin Result := False; if FileName = '' then Exit; RestoreAt := 0; Restore := Restore and FCanResume; if Restore then begin RestoreAt := Self.FileSize(FileName); if RestoreAt < 0 then RestoreAt := 0; end; Result := InternalStor('STOR ' + FileName, RestoreAt); end; function TFTPSend.StoreUniqueFile: Boolean; begin Result := InternalStor('STOU', 0); end; function TFTPSend.AppendFile(const FileName: string): Boolean; begin Result := False; if FileName = '' then Exit; Result := InternalStor('APPE ' + FileName, 0); end; function TFTPSend.NoOp: Boolean; begin Result := (FTPCommand('NOOP') div 100) = 2; end; function TFTPSend.RenameFile(const OldName, NewName: string): Boolean; begin Result := False; if (FTPCommand('RNFR ' + OldName) div 100) <> 3 then Exit; Result := (FTPCommand('RNTO ' + NewName) div 100) = 2; end; function TFTPSend.DeleteFile(const FileName: string): Boolean; begin Result := (FTPCommand('DELE ' + FileName) div 100) = 2; end; function TFTPSend.FileSize(const FileName: string): int64; var s: string; begin Result := -1; if (FTPCommand('SIZE ' + FileName) div 100) = 2 then begin s := Trim(SeparateRight(ResultString, ' ')); s := Trim(SeparateLeft(s, ' ')); {$IFDEF VER100} Result := StrToIntDef(s, -1); {$ELSE} Result := StrToInt64Def(s, -1); {$ENDIF} end; end; function TFTPSend.ChangeWorkingDir(const Directory: string): Boolean; begin Result := (FTPCommand('CWD ' + Directory) div 100) = 2; end; function TFTPSend.ChangeToParentDir: Boolean; begin Result := (FTPCommand('CDUP') div 100) = 2; end; function TFTPSend.ChangeToRootDir: Boolean; begin Result := ChangeWorkingDir('/'); end; function TFTPSend.DeleteDir(const Directory: string): Boolean; begin Result := (FTPCommand('RMD ' + Directory) div 100) = 2; end; function TFTPSend.CreateDir(const Directory: string): Boolean; begin Result := (FTPCommand('MKD ' + Directory) div 100) = 2; end; function TFTPSend.GetCurrentDir: String; begin Result := ''; if (FTPCommand('PWD') div 100) = 2 then begin Result := SeparateRight(FResultString, '"'); Result := Trim(Separateleft(Result, '"')); end; end; procedure TFTPSend.Abort; begin FSock.SendString('ABOR' + CRLF); FDSock.StopFlag := True; end; procedure TFTPSend.TelnetAbort; begin FSock.SendString(#$FF + #$F4 + #$FF + #$F2); Abort; end; {==============================================================================} procedure TFTPListRec.Assign(Value: TFTPListRec); begin FFileName := Value.FileName; FDirectory := Value.Directory; FReadable := Value.Readable; FFileSize := Value.FileSize; FFileTime := Value.FileTime; FOriginalLine := Value.OriginalLine; FMask := Value.Mask; end; constructor TFTPList.Create; begin inherited Create; FList := TList.Create; FLines := TStringList.Create; FMasks := TStringList.Create; FUnparsedLines := TStringList.Create; //various UNIX FMasks.add('pppppppppp $!!!S*$TTT$DD$hh mm ss$YYYY$n*'); FMasks.add('pppppppppp $!!!S*$DD$TTT$hh mm ss$YYYY$n*'); FMasks.add('pppppppppp $!!!S*$TTT$DD$UUUUU$n*'); //mostly used UNIX format FMasks.add('pppppppppp $!!!S*$DD$TTT$UUUUU$n*'); //MacOS FMasks.add('pppppppppp $!!S*$TTT$DD$UUUUU$n*'); FMasks.add('pppppppppp $!S*$TTT$DD$UUUUU$n*'); //Novell FMasks.add('d $!S*$TTT$DD$UUUUU$n*'); //Windows FMasks.add('MM DD YY hh mmH !S* n*'); FMasks.add('MM DD YY hh mmH $ d!n*'); FMasks.add('MM DD YYYY hh mmH !S* n*'); FMasks.add('MM DD YYYY hh mmH $ d!n*'); FMasks.add('DD MM YYYY hh mmH !S* n*'); FMasks.add('DD MM YYYY hh mmH $ d!n*'); //VMS FMasks.add('v*$ DD TTT YYYY hh mm'); FMasks.add('v*$!DD TTT YYYY hh mm'); FMasks.add('n*$ YYYY MM DD hh mm$S*'); //AS400 FMasks.add('!S*$MM DD YY hh mm ss !n*'); FMasks.add('!S*$DD MM YY hh mm ss !n*'); FMasks.add('n*!S*$MM DD YY hh mm ss d'); FMasks.add('n*!S*$DD MM YY hh mm ss d'); //VxWorks FMasks.add('$S* TTT DD YYYY hh mm ss $n* $ d'); FMasks.add('$S* TTT DD YYYY hh mm ss $n*'); //Distinct FMasks.add('d $S*$TTT DD YYYY hh mm$n*'); FMasks.add('d $S*$TTT DD$hh mm$n*'); //PC-NFSD FMasks.add('nnnnnnnn.nnn dSSSSSSSSSSS MM DD YY hh mmH'); //VOS FMasks.add('- SSSSS YY MM DD hh mm ss n*'); FMasks.add('- d= SSSSS YY MM DD hh mm ss n*'); //Unissys ClearPath FMasks.add('nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn SSSSSSSSS MM DD YYYY hh mm'); FMasks.add('n*\x SSSSSSSSS MM DD YYYY hh mm'); //IBM FMasks.add('- SSSSSSSSSSSS d MM DD YYYY hh mm n*'); //OS9 FMasks.add('- YY MM DD hhmm d SSSSSSSSS n*'); //tandem FMasks.add('nnnnnnnn SSSSSSS DD TTT YY hh mm ss'); //MVS FMasks.add('- YYYY MM DD SSSSS d=O n*'); //BullGCOS8 FMasks.add(' $S* MM DD YY hh mm ss !n*'); FMasks.add('d $S* MM DD YY !n*'); //BullGCOS7 FMasks.add(' TTT DD YYYY n*'); FMasks.add(' d n*'); end; destructor TFTPList.Destroy; begin Clear; FList.Free; FLines.Free; FMasks.Free; FUnparsedLines.Free; inherited Destroy; end; procedure TFTPList.Clear; var n:integer; begin for n := 0 to FList.Count - 1 do if Assigned(FList[n]) then TFTPListRec(FList[n]).Free; FList.Clear; FLines.Clear; FUnparsedLines.Clear; end; function TFTPList.Count: integer; begin Result := FList.Count; end; function TFTPList.GetListItem(Index: integer): TFTPListRec; begin Result := nil; if Index < Count then Result := TFTPListRec(FList[Index]); end; procedure TFTPList.Assign(Value: TFTPList); var flr: TFTPListRec; n: integer; begin Clear; for n := 0 to Value.Count - 1 do begin flr := TFTPListRec.Create; flr.Assign(Value[n]); Flist.Add(flr); end; Lines.Assign(Value.Lines); Masks.Assign(Value.Masks); UnparsedLines.Assign(Value.UnparsedLines); end; procedure TFTPList.ClearStore; begin Monthnames := ''; BlockSize := ''; DirFlagValue := ''; FileName := ''; VMSFileName := ''; Day := ''; Month := ''; ThreeMonth := ''; YearTime := ''; Year := ''; Hours := ''; HoursModif := ''; Minutes := ''; Seconds := ''; Size := ''; Permissions := ''; DirFlag := ''; end; function TFTPList.ParseByMask(Value, NextValue, Mask: AnsiString): Integer; var Ivalue, IMask: integer; MaskC, LastMaskC: AnsiChar; c: AnsiChar; s: string; begin ClearStore; Result := 0; if Value = '' then Exit; if Mask = '' then Exit; Ivalue := 1; IMask := 1; Result := 1; LastMaskC := ' '; while Imask <= Length(mask) do begin if (Mask[Imask] <> '*') and (Ivalue > Length(Value)) then begin Result := 0; Exit; end; MaskC := Mask[Imask]; if Ivalue > Length(Value) then Exit; c := Value[Ivalue]; case MaskC of 'n': FileName := FileName + c; 'v': VMSFileName := VMSFileName + c; '.': begin if c in ['.', ' '] then FileName := TrimSP(FileName) + '.' else begin Result := 0; Exit; end; end; 'D': Day := Day + c; 'M': Month := Month + c; 'T': ThreeMonth := ThreeMonth + c; 'U': YearTime := YearTime + c; 'Y': Year := Year + c; 'h': Hours := Hours + c; 'H': HoursModif := HoursModif + c; 'm': Minutes := Minutes + c; 's': Seconds := Seconds + c; 'S': Size := Size + c; 'p': Permissions := Permissions + c; 'd': DirFlag := DirFlag + c; 'x': if c <> ' ' then begin Result := 0; Exit; end; '*': begin s := ''; if LastMaskC in ['n', 'v'] then begin if Imask = Length(Mask) then s := Copy(Value, IValue, Maxint) else while IValue <= Length(Value) do begin if Value[Ivalue] = ' ' then break; s := s + Value[Ivalue]; Inc(Ivalue); end; if LastMaskC = 'n' then FileName := FileName + s else VMSFileName := VMSFileName + s; end else begin while IValue <= Length(Value) do begin if not(Value[Ivalue] in ['0'..'9']) then break; s := s + Value[Ivalue]; Inc(Ivalue); end; case LastMaskC of 'S': Size := Size + s; end; end; Dec(IValue); end; '!': begin while IValue <= Length(Value) do begin if Value[Ivalue] = ' ' then break; Inc(Ivalue); end; while IValue <= Length(Value) do begin if Value[Ivalue] <> ' ' then break; Inc(Ivalue); end; Dec(IValue); end; '$': begin while IValue <= Length(Value) do begin if not(Value[Ivalue] in [' ', #9]) then break; Inc(Ivalue); end; Dec(IValue); end; '=': begin s := ''; case LastmaskC of 'S': begin while Imask <= Length(Mask) do begin if not(Mask[Imask] in ['0'..'9']) then break; s := s + Mask[Imask]; Inc(Imask); end; Dec(Imask); BlockSize := s; end; 'T': begin Monthnames := Copy(Mask, IMask, 12 * 3); Inc(IMask, 12 * 3); end; 'd': begin Inc(Imask); DirFlagValue := Mask[Imask]; end; end; end; '\': begin Value := NextValue; IValue := 0; Result := 2; end; end; Inc(Ivalue); Inc(Imask); LastMaskC := MaskC; end; end; function TFTPList.CheckValues: Boolean; var x, n: integer; begin Result := false; if FileName <> '' then begin if pos('?', VMSFilename) > 0 then Exit; if pos('*', VMSFilename) > 0 then Exit; end; if VMSFileName <> '' then if pos(';', VMSFilename) <= 0 then Exit; if (FileName = '') and (VMSFileName = '') then Exit; if Permissions <> '' then begin if length(Permissions) <> 10 then Exit; for n := 1 to 10 do if not(Permissions[n] in ['a', 'b', 'c', 'd', 'h', 'l', 'p', 'r', 's', 't', 'w', 'x', 'y', '-']) then Exit; end; if Day <> '' then begin Day := TrimSP(Day); x := StrToIntDef(day, -1); if (x < 1) or (x > 31) then Exit; end; if Month <> '' then begin Month := TrimSP(Month); x := StrToIntDef(Month, -1); if (x < 1) or (x > 12) then Exit; end; if Hours <> '' then begin Hours := TrimSP(Hours); x := StrToIntDef(Hours, -1); if (x < 0) or (x > 24) then Exit; end; if HoursModif <> '' then begin if not (HoursModif[1] in ['a', 'A', 'p', 'P']) then Exit; end; if Minutes <> '' then begin Minutes := TrimSP(Minutes); x := StrToIntDef(Minutes, -1); if (x < 0) or (x > 59) then Exit; end; if Seconds <> '' then begin Seconds := TrimSP(Seconds); x := StrToIntDef(Seconds, -1); if (x < 0) or (x > 59) then Exit; end; if Size <> '' then begin Size := TrimSP(Size); for n := 1 to Length(Size) do if not (Size[n] in ['0'..'9']) then Exit; end; if length(Monthnames) = (12 * 3) then for n := 1 to 12 do CustomMonthNames[n] := Copy(Monthnames, ((n - 1) * 3) + 1, 3); if ThreeMonth <> '' then begin x := GetMonthNumber(ThreeMonth); if (x = 0) then Exit; end; if YearTime <> '' then begin YearTime := ReplaceString(YearTime, '-', ':'); if pos(':', YearTime) > 0 then begin if (GetTimeFromstr(YearTime) = -1) then Exit; end else begin YearTime := TrimSP(YearTime); x := StrToIntDef(YearTime, -1); if (x = -1) then Exit; if (x < 1900) or (x > 2100) then Exit; end; end; if Year <> '' then begin Year := TrimSP(Year); x := StrToIntDef(Year, -1); if (x = -1) then Exit; if Length(Year) = 4 then begin if not((x > 1900) and (x < 2100)) then Exit; end else if Length(Year) = 2 then begin if not((x >= 0) and (x <= 99)) then Exit; end else if Length(Year) = 3 then begin if not((x >= 100) and (x <= 110)) then Exit; end else Exit; end; Result := True; end; procedure TFTPList.FillRecord(const Value: TFTPListRec); var s: string; x: integer; myear: Word; mmonth: Word; mday: Word; mhours, mminutes, mseconds: word; n: integer; begin s := DirFlagValue; if s = '' then s := 'D'; s := Uppercase(s); Value.Directory := s = Uppercase(DirFlag); if FileName <> '' then Value.FileName := SeparateLeft(Filename, ' -> '); if VMSFileName <> '' then begin Value.FileName := VMSFilename; Value.Directory := Pos('.DIR;',VMSFilename) > 0; end; Value.FileName := TrimSPRight(Value.FileName); Value.Readable := not Value.Directory; if BlockSize <> '' then x := StrToIntDef(BlockSize, 1) else x := 1; {$IFDEF VER100} Value.FileSize := x * StrToIntDef(Size, 0); {$ELSE} Value.FileSize := x * StrToInt64Def(Size, 0); {$ENDIF} DecodeDate(Date,myear,mmonth,mday); mhours := 0; mminutes := 0; mseconds := 0; if Day <> '' then mday := StrToIntDef(day, 1); if Month <> '' then mmonth := StrToIntDef(Month, 1); if length(Monthnames) = (12 * 3) then for n := 1 to 12 do CustomMonthNames[n] := Copy(Monthnames, ((n - 1) * 3) + 1, 3); if ThreeMonth <> '' then mmonth := GetMonthNumber(ThreeMonth); if Year <> '' then begin myear := StrToIntDef(Year, 0); if (myear <= 99) and (myear > 50) then myear := myear + 1900; if myear <= 50 then myear := myear + 2000; end; if YearTime <> '' then begin if pos(':', YearTime) > 0 then begin YearTime := TrimSP(YearTime); mhours := StrToIntDef(Separateleft(YearTime, ':'), 0); mminutes := StrToIntDef(SeparateRight(YearTime, ':'), 0); if (Encodedate(myear, mmonth, mday) + EncodeTime(mHours, mminutes, 0, 0)) > now then Dec(mYear); end else myear := StrToIntDef(YearTime, 0); end; if Minutes <> '' then mminutes := StrToIntDef(Minutes, 0); if Seconds <> '' then mseconds := StrToIntDef(Seconds, 0); if Hours <> '' then begin mHours := StrToIntDef(Hours, 0); if HoursModif <> '' then if Uppercase(HoursModif[1]) = 'P' then if mHours <> 12 then mHours := MHours + 12; end; Value.FileTime := Encodedate(myear, mmonth, mday) + EncodeTime(mHours, mminutes, mseconds, 0); if Permissions <> '' then begin Value.Permission := Permissions; Value.Readable := Uppercase(permissions)[2] = 'R'; if Uppercase(permissions)[1] = 'D' then begin Value.Directory := True; Value.Readable := false; end else if Uppercase(permissions)[1] = 'L' then Value.Directory := True; end; end; function TFTPList.ParseEPLF(Value: string): Boolean; var s, os: string; flr: TFTPListRec; begin Result := False; if Value <> '' then if Value[1] = '+' then begin os := Value; Delete(Value, 1, 1); flr := TFTPListRec.create; flr.FileName := SeparateRight(Value, #9); s := Fetch(Value, ','); while s <> '' do begin if s[1] = #9 then Break; case s[1] of '/': flr.Directory := true; 'r': flr.Readable := true; 's': {$IFDEF VER100} flr.FileSize := StrToIntDef(Copy(s, 2, Length(s) - 1), 0); {$ELSE} flr.FileSize := StrToInt64Def(Copy(s, 2, Length(s) - 1), 0); {$ENDIF} 'm': flr.FileTime := (StrToIntDef(Copy(s, 2, Length(s) - 1), 0) / 86400) + 25569; end; s := Fetch(Value, ','); end; if flr.FileName <> '' then if (flr.Directory and ((flr.FileName = '.') or (flr.FileName = '..'))) or (flr.FileName = '') then flr.free else begin flr.OriginalLine := os; flr.Mask := 'EPLF'; Flist.Add(flr); Result := True; end; end; end; procedure TFTPList.ParseLines; var flr: TFTPListRec; n, m: Integer; S: string; x: integer; b: Boolean; begin n := 0; while n < Lines.Count do begin if n = Lines.Count - 1 then s := '' else s := Lines[n + 1]; b := False; x := 0; if ParseEPLF(Lines[n]) then begin b := True; x := 1; end else for m := 0 to Masks.Count - 1 do begin x := ParseByMask(Lines[n], s, Masks[m]); if x > 0 then if CheckValues then begin flr := TFTPListRec.create; FillRecord(flr); flr.OriginalLine := Lines[n]; flr.Mask := Masks[m]; if flr.Directory and ((flr.FileName = '.') or (flr.FileName = '..')) then flr.free else Flist.Add(flr); b := True; Break; end; end; if not b then FUnparsedLines.Add(Lines[n]); Inc(n); if x > 1 then Inc(n, x - 1); end; end; {==============================================================================} function FtpGetFile(const IP, Port, FileName, LocalFile, User, Pass: string): Boolean; begin Result := False; with TFTPSend.Create do try if User <> '' then begin Username := User; Password := Pass; end; TargetHost := IP; TargetPort := Port; if not Login then Exit; DirectFileName := LocalFile; DirectFile:=True; Result := RetrieveFile(FileName, False); Logout; finally Free; end; end; function FtpPutFile(const IP, Port, FileName, LocalFile, User, Pass: string): Boolean; begin Result := False; with TFTPSend.Create do try if User <> '' then begin Username := User; Password := Pass; end; TargetHost := IP; TargetPort := Port; if not Login then Exit; DirectFileName := LocalFile; DirectFile:=True; Result := StoreFile(FileName, False); Logout; finally Free; end; end; function FtpInterServerTransfer( const FromIP, FromPort, FromFile, FromUser, FromPass: string; const ToIP, ToPort, ToFile, ToUser, ToPass: string): Boolean; var FromFTP, ToFTP: TFTPSend; s: string; x: integer; begin Result := False; FromFTP := TFTPSend.Create; toFTP := TFTPSend.Create; try if FromUser <> '' then begin FromFTP.Username := FromUser; FromFTP.Password := FromPass; end; if ToUser <> '' then begin ToFTP.Username := ToUser; ToFTP.Password := ToPass; end; FromFTP.TargetHost := FromIP; FromFTP.TargetPort := FromPort; ToFTP.TargetHost := ToIP; ToFTP.TargetPort := ToPort; if not FromFTP.Login then Exit; if not ToFTP.Login then Exit; if (FromFTP.FTPCommand('PASV') div 100) <> 2 then Exit; FromFTP.ParseRemote(FromFTP.ResultString); s := ReplaceString(FromFTP.DataIP, '.', ','); s := 'PORT ' + s + ',' + IntToStr(StrToIntDef(FromFTP.DataPort, 0) div 256) + ',' + IntToStr(StrToIntDef(FromFTP.DataPort, 0) mod 256); if (ToFTP.FTPCommand(s) div 100) <> 2 then Exit; x := ToFTP.FTPCommand('RETR ' + FromFile); if (x div 100) <> 1 then Exit; x := FromFTP.FTPCommand('STOR ' + ToFile); if (x div 100) <> 1 then Exit; FromFTP.Timeout := 21600000; x := FromFTP.ReadResult; if (x div 100) <> 2 then Exit; ToFTP.Timeout := 21600000; x := ToFTP.ReadResult; if (x div 100) <> 2 then Exit; Result := True; finally ToFTP.Free; FromFTP.Free; end; end; end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/synapse/sswin32.inc�������������������������������������������������0000644�0001750�0001750�00000152163�12014201074�021250� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{==============================================================================| | Project : Ararat Synapse | 002.003.000 | |==============================================================================| | Content: Socket Independent Platform Layer - Win32/64 definition include | |==============================================================================| | Copyright (c)1999-2011, Lukas Gebauer | | All rights reserved. | | | | Redistribution and use in source and binary forms, with or without | | modification, are permitted provided that the following conditions are met: | | | | Redistributions of source code must retain the above copyright notice, this | | list of conditions and the following disclaimer. | | | | Redistributions in binary form must reproduce the above copyright notice, | | this list of conditions and the following disclaimer in the documentation | | and/or other materials provided with the distribution. | | | | Neither the name of Lukas Gebauer nor the names of its contributors may | | be used to endorse or promote products derived from this software without | | specific prior written permission. | | | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | | ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR | | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | | DAMAGE. | |==============================================================================| | The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).| | Portions created by Lukas Gebauer are Copyright (c)2003-2011. | | All Rights Reserved. | |==============================================================================| | Contributor(s): | |==============================================================================| | History: see HISTORY.HTM from distribution package | | (Found at URL: http://www.ararat.cz/synapse/) | |==============================================================================} {:@exclude} //{$DEFINE WINSOCK1} {Note about define WINSOCK1: If you activate this compiler directive, then socket interface level 1.1 is used instead default level 2.2. Level 2.2 is not available on old W95, however you can install update. } //{$DEFINE FORCEOLDAPI} {Note about define FORCEOLDAPI: If you activate this compiler directive, then is allways used old socket API for name resolution. If you leave this directive inactive, then the new API is used, when running system allows it. For IPv6 support you must have new API! } {$IFDEF FPC} {$MODE DELPHI} {$ENDIF} {$H+} {$IFDEF VER125} {$DEFINE BCB} {$ENDIF} {$IFDEF BCB} {$ObjExportAll On} (*$HPPEMIT '/* EDE 2003-02-19 */' *) (*$HPPEMIT 'namespace Synsock { using System::Shortint; }' *) (*$HPPEMIT '#undef h_addr' *) (*$HPPEMIT '#undef IOCPARM_MASK' *) (*$HPPEMIT '#undef FD_SETSIZE' *) (*$HPPEMIT '#undef IOC_VOID' *) (*$HPPEMIT '#undef IOC_OUT' *) (*$HPPEMIT '#undef IOC_IN' *) (*$HPPEMIT '#undef IOC_INOUT' *) (*$HPPEMIT '#undef FIONREAD' *) (*$HPPEMIT '#undef FIONBIO' *) (*$HPPEMIT '#undef FIOASYNC' *) (*$HPPEMIT '#undef IPPROTO_IP' *) (*$HPPEMIT '#undef IPPROTO_ICMP' *) (*$HPPEMIT '#undef IPPROTO_IGMP' *) (*$HPPEMIT '#undef IPPROTO_TCP' *) (*$HPPEMIT '#undef IPPROTO_UDP' *) (*$HPPEMIT '#undef IPPROTO_RAW' *) (*$HPPEMIT '#undef IPPROTO_MAX' *) (*$HPPEMIT '#undef INADDR_ANY' *) (*$HPPEMIT '#undef INADDR_LOOPBACK' *) (*$HPPEMIT '#undef INADDR_BROADCAST' *) (*$HPPEMIT '#undef INADDR_NONE' *) (*$HPPEMIT '#undef INVALID_SOCKET' *) (*$HPPEMIT '#undef SOCKET_ERROR' *) (*$HPPEMIT '#undef WSADESCRIPTION_LEN' *) (*$HPPEMIT '#undef WSASYS_STATUS_LEN' *) (*$HPPEMIT '#undef IP_OPTIONS' *) (*$HPPEMIT '#undef IP_TOS' *) (*$HPPEMIT '#undef IP_TTL' *) (*$HPPEMIT '#undef IP_MULTICAST_IF' *) (*$HPPEMIT '#undef IP_MULTICAST_TTL' *) (*$HPPEMIT '#undef IP_MULTICAST_LOOP' *) (*$HPPEMIT '#undef IP_ADD_MEMBERSHIP' *) (*$HPPEMIT '#undef IP_DROP_MEMBERSHIP' *) (*$HPPEMIT '#undef IP_DONTFRAGMENT' *) (*$HPPEMIT '#undef IP_DEFAULT_MULTICAST_TTL' *) (*$HPPEMIT '#undef IP_DEFAULT_MULTICAST_LOOP' *) (*$HPPEMIT '#undef IP_MAX_MEMBERSHIPS' *) (*$HPPEMIT '#undef SOL_SOCKET' *) (*$HPPEMIT '#undef SO_DEBUG' *) (*$HPPEMIT '#undef SO_ACCEPTCONN' *) (*$HPPEMIT '#undef SO_REUSEADDR' *) (*$HPPEMIT '#undef SO_KEEPALIVE' *) (*$HPPEMIT '#undef SO_DONTROUTE' *) (*$HPPEMIT '#undef SO_BROADCAST' *) (*$HPPEMIT '#undef SO_USELOOPBACK' *) (*$HPPEMIT '#undef SO_LINGER' *) (*$HPPEMIT '#undef SO_OOBINLINE' *) (*$HPPEMIT '#undef SO_DONTLINGER' *) (*$HPPEMIT '#undef SO_SNDBUF' *) (*$HPPEMIT '#undef SO_RCVBUF' *) (*$HPPEMIT '#undef SO_SNDLOWAT' *) (*$HPPEMIT '#undef SO_RCVLOWAT' *) (*$HPPEMIT '#undef SO_SNDTIMEO' *) (*$HPPEMIT '#undef SO_RCVTIMEO' *) (*$HPPEMIT '#undef SO_ERROR' *) (*$HPPEMIT '#undef SO_OPENTYPE' *) (*$HPPEMIT '#undef SO_SYNCHRONOUS_ALERT' *) (*$HPPEMIT '#undef SO_SYNCHRONOUS_NONALERT' *) (*$HPPEMIT '#undef SO_MAXDG' *) (*$HPPEMIT '#undef SO_MAXPATHDG' *) (*$HPPEMIT '#undef SO_UPDATE_ACCEPT_CONTEXT' *) (*$HPPEMIT '#undef SO_CONNECT_TIME' *) (*$HPPEMIT '#undef SO_TYPE' *) (*$HPPEMIT '#undef SOCK_STREAM' *) (*$HPPEMIT '#undef SOCK_DGRAM' *) (*$HPPEMIT '#undef SOCK_RAW' *) (*$HPPEMIT '#undef SOCK_RDM' *) (*$HPPEMIT '#undef SOCK_SEQPACKET' *) (*$HPPEMIT '#undef TCP_NODELAY' *) (*$HPPEMIT '#undef AF_UNSPEC' *) (*$HPPEMIT '#undef SOMAXCONN' *) (*$HPPEMIT '#undef AF_INET' *) (*$HPPEMIT '#undef AF_MAX' *) (*$HPPEMIT '#undef PF_UNSPEC' *) (*$HPPEMIT '#undef PF_INET' *) (*$HPPEMIT '#undef PF_MAX' *) (*$HPPEMIT '#undef MSG_OOB' *) (*$HPPEMIT '#undef MSG_PEEK' *) (*$HPPEMIT '#undef WSABASEERR' *) (*$HPPEMIT '#undef WSAEINTR' *) (*$HPPEMIT '#undef WSAEBADF' *) (*$HPPEMIT '#undef WSAEACCES' *) (*$HPPEMIT '#undef WSAEFAULT' *) (*$HPPEMIT '#undef WSAEINVAL' *) (*$HPPEMIT '#undef WSAEMFILE' *) (*$HPPEMIT '#undef WSAEWOULDBLOCK' *) (*$HPPEMIT '#undef WSAEINPROGRESS' *) (*$HPPEMIT '#undef WSAEALREADY' *) (*$HPPEMIT '#undef WSAENOTSOCK' *) (*$HPPEMIT '#undef WSAEDESTADDRREQ' *) (*$HPPEMIT '#undef WSAEMSGSIZE' *) (*$HPPEMIT '#undef WSAEPROTOTYPE' *) (*$HPPEMIT '#undef WSAENOPROTOOPT' *) (*$HPPEMIT '#undef WSAEPROTONOSUPPORT' *) (*$HPPEMIT '#undef WSAESOCKTNOSUPPORT' *) (*$HPPEMIT '#undef WSAEOPNOTSUPP' *) (*$HPPEMIT '#undef WSAEPFNOSUPPORT' *) (*$HPPEMIT '#undef WSAEAFNOSUPPORT' *) (*$HPPEMIT '#undef WSAEADDRINUSE' *) (*$HPPEMIT '#undef WSAEADDRNOTAVAIL' *) (*$HPPEMIT '#undef WSAENETDOWN' *) (*$HPPEMIT '#undef WSAENETUNREACH' *) (*$HPPEMIT '#undef WSAENETRESET' *) (*$HPPEMIT '#undef WSAECONNABORTED' *) (*$HPPEMIT '#undef WSAECONNRESET' *) (*$HPPEMIT '#undef WSAENOBUFS' *) (*$HPPEMIT '#undef WSAEISCONN' *) (*$HPPEMIT '#undef WSAENOTCONN' *) (*$HPPEMIT '#undef WSAESHUTDOWN' *) (*$HPPEMIT '#undef WSAETOOMANYREFS' *) (*$HPPEMIT '#undef WSAETIMEDOUT' *) (*$HPPEMIT '#undef WSAECONNREFUSED' *) (*$HPPEMIT '#undef WSAELOOP' *) (*$HPPEMIT '#undef WSAENAMETOOLONG' *) (*$HPPEMIT '#undef WSAEHOSTDOWN' *) (*$HPPEMIT '#undef WSAEHOSTUNREACH' *) (*$HPPEMIT '#undef WSAENOTEMPTY' *) (*$HPPEMIT '#undef WSAEPROCLIM' *) (*$HPPEMIT '#undef WSAEUSERS' *) (*$HPPEMIT '#undef WSAEDQUOT' *) (*$HPPEMIT '#undef WSAESTALE' *) (*$HPPEMIT '#undef WSAEREMOTE' *) (*$HPPEMIT '#undef WSASYSNOTREADY' *) (*$HPPEMIT '#undef WSAVERNOTSUPPORTED' *) (*$HPPEMIT '#undef WSANOTINITIALISED' *) (*$HPPEMIT '#undef WSAEDISCON' *) (*$HPPEMIT '#undef WSAENOMORE' *) (*$HPPEMIT '#undef WSAECANCELLED' *) (*$HPPEMIT '#undef WSAEEINVALIDPROCTABLE' *) (*$HPPEMIT '#undef WSAEINVALIDPROVIDER' *) (*$HPPEMIT '#undef WSAEPROVIDERFAILEDINIT' *) (*$HPPEMIT '#undef WSASYSCALLFAILURE' *) (*$HPPEMIT '#undef WSASERVICE_NOT_FOUND' *) (*$HPPEMIT '#undef WSATYPE_NOT_FOUND' *) (*$HPPEMIT '#undef WSA_E_NO_MORE' *) (*$HPPEMIT '#undef WSA_E_CANCELLED' *) (*$HPPEMIT '#undef WSAEREFUSED' *) (*$HPPEMIT '#undef WSAHOST_NOT_FOUND' *) (*$HPPEMIT '#undef HOST_NOT_FOUND' *) (*$HPPEMIT '#undef WSATRY_AGAIN' *) (*$HPPEMIT '#undef TRY_AGAIN' *) (*$HPPEMIT '#undef WSANO_RECOVERY' *) (*$HPPEMIT '#undef NO_RECOVERY' *) (*$HPPEMIT '#undef WSANO_DATA' *) (*$HPPEMIT '#undef NO_DATA' *) (*$HPPEMIT '#undef WSANO_ADDRESS' *) (*$HPPEMIT '#undef ENAMETOOLONG' *) (*$HPPEMIT '#undef ENOTEMPTY' *) (*$HPPEMIT '#undef FD_CLR' *) (*$HPPEMIT '#undef FD_ISSET' *) (*$HPPEMIT '#undef FD_SET' *) (*$HPPEMIT '#undef FD_ZERO' *) (*$HPPEMIT '#undef NO_ADDRESS' *) (*$HPPEMIT '#undef ADDR_ANY' *) (*$HPPEMIT '#undef SO_GROUP_ID' *) (*$HPPEMIT '#undef SO_GROUP_PRIORITY' *) (*$HPPEMIT '#undef SO_MAX_MSG_SIZE' *) (*$HPPEMIT '#undef SO_PROTOCOL_INFOA' *) (*$HPPEMIT '#undef SO_PROTOCOL_INFOW' *) (*$HPPEMIT '#undef SO_PROTOCOL_INFO' *) (*$HPPEMIT '#undef PVD_CONFIG' *) (*$HPPEMIT '#undef AF_INET6' *) (*$HPPEMIT '#undef PF_INET6' *) {$ENDIF} {$IFDEF FPC} {$IFDEF WIN32} {$ALIGN OFF} {$ELSE} {$PACKRECORDS C} {$ENDIF} {$ENDIF} interface uses SyncObjs, SysUtils, Classes, Windows; function InitSocketInterface(stack: String): Boolean; function DestroySocketInterface: Boolean; const {$IFDEF WINSOCK1} WinsockLevel = $0101; {$ELSE} WinsockLevel = $0202; {$ENDIF} type u_short = Word; u_int = Integer; u_long = Longint; pu_long = ^u_long; pu_short = ^u_short; {$IFDEF FPC} TSocket = ptruint; {$ELSE} {$IFDEF WIN64} TSocket = UINT_PTR; {$ELSE} TSocket = u_int; {$ENDIF} {$ENDIF} TAddrFamily = integer; TMemory = pointer; const {$IFDEF WINCE} DLLStackName = 'ws2.dll'; {$ELSE} {$IFDEF WINSOCK1} DLLStackName = 'wsock32.dll'; {$ELSE} DLLStackName = 'ws2_32.dll'; {$ENDIF} {$ENDIF} DLLwship6 = 'wship6.dll'; cLocalhost = '127.0.0.1'; cAnyHost = '0.0.0.0'; cBroadcast = '255.255.255.255'; c6Localhost = '::1'; c6AnyHost = '::0'; c6Broadcast = 'ffff::1'; cAnyPort = '0'; const FD_SETSIZE = 64; type PFDSet = ^TFDSet; TFDSet = record fd_count: u_int; fd_array: array[0..FD_SETSIZE-1] of TSocket; end; const FIONREAD = $4004667f; FIONBIO = $8004667e; FIOASYNC = $8004667d; type PTimeVal = ^TTimeVal; TTimeVal = record tv_sec: Longint; tv_usec: Longint; end; const IPPROTO_IP = 0; { Dummy } IPPROTO_ICMP = 1; { Internet Control Message Protocol } IPPROTO_IGMP = 2; { Internet Group Management Protocol} IPPROTO_TCP = 6; { TCP } IPPROTO_UDP = 17; { User Datagram Protocol } IPPROTO_IPV6 = 41; IPPROTO_ICMPV6 = 58; IPPROTO_RM = 113; IPPROTO_RAW = 255; IPPROTO_MAX = 256; type PInAddr = ^TInAddr; TInAddr = record case integer of 0: (S_bytes: packed array [0..3] of byte); 1: (S_addr: u_long); end; PSockAddrIn = ^TSockAddrIn; TSockAddrIn = record case Integer of 0: (sin_family: u_short; sin_port: u_short; sin_addr: TInAddr; sin_zero: array[0..7] of byte); 1: (sa_family: u_short; sa_data: array[0..13] of byte) end; TIP_mreq = record imr_multiaddr: TInAddr; { IP multicast address of group } imr_interface: TInAddr; { local IP address of interface } end; PInAddr6 = ^TInAddr6; TInAddr6 = record case integer of 0: (S6_addr: packed array [0..15] of byte); 1: (u6_addr8: packed array [0..15] of byte); 2: (u6_addr16: packed array [0..7] of word); 3: (u6_addr32: packed array [0..3] of integer); end; PSockAddrIn6 = ^TSockAddrIn6; TSockAddrIn6 = record sin6_family: u_short; // AF_INET6 sin6_port: u_short; // Transport level port number sin6_flowinfo: u_long; // IPv6 flow information sin6_addr: TInAddr6; // IPv6 address sin6_scope_id: u_long; // Scope Id: IF number for link-local // SITE id for site-local end; TIPv6_mreq = record ipv6mr_multiaddr: TInAddr6; // IPv6 multicast address. ipv6mr_interface: integer; // Interface index. padding: integer; end; PHostEnt = ^THostEnt; THostEnt = record h_name: PAnsiChar; h_aliases: ^PAnsiChar; h_addrtype: Smallint; h_length: Smallint; case integer of 0: (h_addr_list: ^PAnsiChar); 1: (h_addr: ^PInAddr); end; PNetEnt = ^TNetEnt; TNetEnt = record n_name: PAnsiChar; n_aliases: ^PAnsiChar; n_addrtype: Smallint; n_net: u_long; end; PServEnt = ^TServEnt; TServEnt = record s_name: PAnsiChar; s_aliases: ^PAnsiChar; {$ifdef WIN64} s_proto: PAnsiChar; s_port: Smallint; {$else} s_port: Smallint; s_proto: PAnsiChar; {$endif} end; PProtoEnt = ^TProtoEnt; TProtoEnt = record p_name: PAnsiChar; p_aliases: ^PAnsichar; p_proto: Smallint; end; const INADDR_ANY = $00000000; INADDR_LOOPBACK = $7F000001; INADDR_BROADCAST = $FFFFFFFF; INADDR_NONE = $FFFFFFFF; ADDR_ANY = INADDR_ANY; INVALID_SOCKET = TSocket(NOT(0)); SOCKET_ERROR = -1; Const {$IFDEF WINSOCK1} IP_OPTIONS = 1; IP_MULTICAST_IF = 2; { set/get IP multicast interface } IP_MULTICAST_TTL = 3; { set/get IP multicast timetolive } IP_MULTICAST_LOOP = 4; { set/get IP multicast loopback } IP_ADD_MEMBERSHIP = 5; { add an IP group membership } IP_DROP_MEMBERSHIP = 6; { drop an IP group membership } IP_TTL = 7; { set/get IP Time To Live } IP_TOS = 8; { set/get IP Type Of Service } IP_DONTFRAGMENT = 9; { set/get IP Don't Fragment flag } {$ELSE} IP_OPTIONS = 1; IP_HDRINCL = 2; IP_TOS = 3; { set/get IP Type Of Service } IP_TTL = 4; { set/get IP Time To Live } IP_MULTICAST_IF = 9; { set/get IP multicast interface } IP_MULTICAST_TTL = 10; { set/get IP multicast timetolive } IP_MULTICAST_LOOP = 11; { set/get IP multicast loopback } IP_ADD_MEMBERSHIP = 12; { add an IP group membership } IP_DROP_MEMBERSHIP = 13; { drop an IP group membership } IP_DONTFRAGMENT = 14; { set/get IP Don't Fragment flag } {$ENDIF} IP_DEFAULT_MULTICAST_TTL = 1; { normally limit m'casts to 1 hop } IP_DEFAULT_MULTICAST_LOOP = 1; { normally hear sends if a member } IP_MAX_MEMBERSHIPS = 20; { per socket; must fit in one mbuf } SOL_SOCKET = $ffff; {options for socket level } { Option flags per-socket. } SO_DEBUG = $0001; { turn on debugging info recording } SO_ACCEPTCONN = $0002; { socket has had listen() } SO_REUSEADDR = $0004; { allow local address reuse } SO_KEEPALIVE = $0008; { keep connections alive } SO_DONTROUTE = $0010; { just use interface addresses } SO_BROADCAST = $0020; { permit sending of broadcast msgs } SO_USELOOPBACK = $0040; { bypass hardware when possible } SO_LINGER = $0080; { linger on close if data present } SO_OOBINLINE = $0100; { leave received OOB data in line } SO_DONTLINGER = $ff7f; { Additional options. } SO_SNDBUF = $1001; { send buffer size } SO_RCVBUF = $1002; { receive buffer size } SO_SNDLOWAT = $1003; { send low-water mark } SO_RCVLOWAT = $1004; { receive low-water mark } SO_SNDTIMEO = $1005; { send timeout } SO_RCVTIMEO = $1006; { receive timeout } SO_ERROR = $1007; { get error status and clear } SO_TYPE = $1008; { get socket type } { WinSock 2 extension -- new options } SO_GROUP_ID = $2001; { ID of a socket group} SO_GROUP_PRIORITY = $2002; { the relative priority within a group} SO_MAX_MSG_SIZE = $2003; { maximum message size } SO_PROTOCOL_INFOA = $2004; { WSAPROTOCOL_INFOA structure } SO_PROTOCOL_INFOW = $2005; { WSAPROTOCOL_INFOW structure } SO_PROTOCOL_INFO = SO_PROTOCOL_INFOA; PVD_CONFIG = $3001; {configuration info for service provider } { Option for opening sockets for synchronous access. } SO_OPENTYPE = $7008; SO_SYNCHRONOUS_ALERT = $10; SO_SYNCHRONOUS_NONALERT = $20; { Other NT-specific options. } SO_MAXDG = $7009; SO_MAXPATHDG = $700A; SO_UPDATE_ACCEPT_CONTEXT = $700B; SO_CONNECT_TIME = $700C; SOMAXCONN = $7fffffff; IPV6_UNICAST_HOPS = 8; // ??? IPV6_MULTICAST_IF = 9; // set/get IP multicast i/f IPV6_MULTICAST_HOPS = 10; // set/get IP multicast ttl IPV6_MULTICAST_LOOP = 11; // set/get IP multicast loopback IPV6_JOIN_GROUP = 12; // add an IP group membership IPV6_LEAVE_GROUP = 13; // drop an IP group membership MSG_NOSIGNAL = 0; // getnameinfo constants NI_MAXHOST = 1025; NI_MAXSERV = 32; NI_NOFQDN = $1; NI_NUMERICHOST = $2; NI_NAMEREQD = $4; NI_NUMERICSERV = $8; NI_DGRAM = $10; const SOCK_STREAM = 1; { stream socket } SOCK_DGRAM = 2; { datagram socket } SOCK_RAW = 3; { raw-protocol interface } SOCK_RDM = 4; { reliably-delivered message } SOCK_SEQPACKET = 5; { sequenced packet stream } { TCP options. } TCP_NODELAY = $0001; { Address families. } AF_UNSPEC = 0; { unspecified } AF_INET = 2; { internetwork: UDP, TCP, etc. } AF_INET6 = 23; { Internetwork Version 6 } AF_MAX = 24; { Protocol families, same as address families for now. } PF_UNSPEC = AF_UNSPEC; PF_INET = AF_INET; PF_INET6 = AF_INET6; PF_MAX = AF_MAX; type { Structure used by kernel to store most addresses. } PSockAddr = ^TSockAddr; TSockAddr = TSockAddrIn; { Structure used by kernel to pass protocol information in raw sockets. } PSockProto = ^TSockProto; TSockProto = record sp_family: u_short; sp_protocol: u_short; end; type PAddrInfo = ^TAddrInfo; TAddrInfo = record ai_flags: integer; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST. ai_family: integer; // PF_xxx. ai_socktype: integer; // SOCK_xxx. ai_protocol: integer; // 0 or IPPROTO_xxx for IPv4 and IPv6. ai_addrlen: u_int; // Length of ai_addr. ai_canonname: PAnsiChar; // Canonical name for nodename. ai_addr: PSockAddr; // Binary address. ai_next: PAddrInfo; // Next structure in linked list. end; const // Flags used in "hints" argument to getaddrinfo(). AI_PASSIVE = $1; // Socket address will be used in bind() call. AI_CANONNAME = $2; // Return canonical name in first ai_canonname. AI_NUMERICHOST = $4; // Nodename must be a numeric address string. type { Structure used for manipulating linger option. } PLinger = ^TLinger; TLinger = record l_onoff: u_short; l_linger: u_short; end; const MSG_OOB = $01; // Process out-of-band data. MSG_PEEK = $02; // Peek at incoming messages. const { All Windows Sockets error constants are biased by WSABASEERR from the "normal" } WSABASEERR = 10000; { Windows Sockets definitions of regular Microsoft C error constants } WSAEINTR = (WSABASEERR+4); WSAEBADF = (WSABASEERR+9); WSAEACCES = (WSABASEERR+13); WSAEFAULT = (WSABASEERR+14); WSAEINVAL = (WSABASEERR+22); WSAEMFILE = (WSABASEERR+24); { Windows Sockets definitions of regular Berkeley error constants } WSAEWOULDBLOCK = (WSABASEERR+35); WSAEINPROGRESS = (WSABASEERR+36); WSAEALREADY = (WSABASEERR+37); WSAENOTSOCK = (WSABASEERR+38); WSAEDESTADDRREQ = (WSABASEERR+39); WSAEMSGSIZE = (WSABASEERR+40); WSAEPROTOTYPE = (WSABASEERR+41); WSAENOPROTOOPT = (WSABASEERR+42); WSAEPROTONOSUPPORT = (WSABASEERR+43); WSAESOCKTNOSUPPORT = (WSABASEERR+44); WSAEOPNOTSUPP = (WSABASEERR+45); WSAEPFNOSUPPORT = (WSABASEERR+46); WSAEAFNOSUPPORT = (WSABASEERR+47); WSAEADDRINUSE = (WSABASEERR+48); WSAEADDRNOTAVAIL = (WSABASEERR+49); WSAENETDOWN = (WSABASEERR+50); WSAENETUNREACH = (WSABASEERR+51); WSAENETRESET = (WSABASEERR+52); WSAECONNABORTED = (WSABASEERR+53); WSAECONNRESET = (WSABASEERR+54); WSAENOBUFS = (WSABASEERR+55); WSAEISCONN = (WSABASEERR+56); WSAENOTCONN = (WSABASEERR+57); WSAESHUTDOWN = (WSABASEERR+58); WSAETOOMANYREFS = (WSABASEERR+59); WSAETIMEDOUT = (WSABASEERR+60); WSAECONNREFUSED = (WSABASEERR+61); WSAELOOP = (WSABASEERR+62); WSAENAMETOOLONG = (WSABASEERR+63); WSAEHOSTDOWN = (WSABASEERR+64); WSAEHOSTUNREACH = (WSABASEERR+65); WSAENOTEMPTY = (WSABASEERR+66); WSAEPROCLIM = (WSABASEERR+67); WSAEUSERS = (WSABASEERR+68); WSAEDQUOT = (WSABASEERR+69); WSAESTALE = (WSABASEERR+70); WSAEREMOTE = (WSABASEERR+71); { Extended Windows Sockets error constant definitions } WSASYSNOTREADY = (WSABASEERR+91); WSAVERNOTSUPPORTED = (WSABASEERR+92); WSANOTINITIALISED = (WSABASEERR+93); WSAEDISCON = (WSABASEERR+101); WSAENOMORE = (WSABASEERR+102); WSAECANCELLED = (WSABASEERR+103); WSAEEINVALIDPROCTABLE = (WSABASEERR+104); WSAEINVALIDPROVIDER = (WSABASEERR+105); WSAEPROVIDERFAILEDINIT = (WSABASEERR+106); WSASYSCALLFAILURE = (WSABASEERR+107); WSASERVICE_NOT_FOUND = (WSABASEERR+108); WSATYPE_NOT_FOUND = (WSABASEERR+109); WSA_E_NO_MORE = (WSABASEERR+110); WSA_E_CANCELLED = (WSABASEERR+111); WSAEREFUSED = (WSABASEERR+112); { Error return codes from gethostbyname() and gethostbyaddr() (when using the resolver). Note that these errors are retrieved via WSAGetLastError() and must therefore follow the rules for avoiding clashes with error numbers from specific implementations or language run-time systems. For this reason the codes are based at WSABASEERR+1001. Note also that [WSA]NO_ADDRESS is defined only for compatibility purposes. } { Authoritative Answer: Host not found } WSAHOST_NOT_FOUND = (WSABASEERR+1001); HOST_NOT_FOUND = WSAHOST_NOT_FOUND; { Non-Authoritative: Host not found, or SERVERFAIL } WSATRY_AGAIN = (WSABASEERR+1002); TRY_AGAIN = WSATRY_AGAIN; { Non recoverable errors, FORMERR, REFUSED, NOTIMP } WSANO_RECOVERY = (WSABASEERR+1003); NO_RECOVERY = WSANO_RECOVERY; { Valid name, no data record of requested type } WSANO_DATA = (WSABASEERR+1004); NO_DATA = WSANO_DATA; { no address, look for MX record } WSANO_ADDRESS = WSANO_DATA; NO_ADDRESS = WSANO_ADDRESS; EWOULDBLOCK = WSAEWOULDBLOCK; EINPROGRESS = WSAEINPROGRESS; EALREADY = WSAEALREADY; ENOTSOCK = WSAENOTSOCK; EDESTADDRREQ = WSAEDESTADDRREQ; EMSGSIZE = WSAEMSGSIZE; EPROTOTYPE = WSAEPROTOTYPE; ENOPROTOOPT = WSAENOPROTOOPT; EPROTONOSUPPORT = WSAEPROTONOSUPPORT; ESOCKTNOSUPPORT = WSAESOCKTNOSUPPORT; EOPNOTSUPP = WSAEOPNOTSUPP; EPFNOSUPPORT = WSAEPFNOSUPPORT; EAFNOSUPPORT = WSAEAFNOSUPPORT; EADDRINUSE = WSAEADDRINUSE; EADDRNOTAVAIL = WSAEADDRNOTAVAIL; ENETDOWN = WSAENETDOWN; ENETUNREACH = WSAENETUNREACH; ENETRESET = WSAENETRESET; ECONNABORTED = WSAECONNABORTED; ECONNRESET = WSAECONNRESET; ENOBUFS = WSAENOBUFS; EISCONN = WSAEISCONN; ENOTCONN = WSAENOTCONN; ESHUTDOWN = WSAESHUTDOWN; ETOOMANYREFS = WSAETOOMANYREFS; ETIMEDOUT = WSAETIMEDOUT; ECONNREFUSED = WSAECONNREFUSED; ELOOP = WSAELOOP; ENAMETOOLONG = WSAENAMETOOLONG; EHOSTDOWN = WSAEHOSTDOWN; EHOSTUNREACH = WSAEHOSTUNREACH; ENOTEMPTY = WSAENOTEMPTY; EPROCLIM = WSAEPROCLIM; EUSERS = WSAEUSERS; EDQUOT = WSAEDQUOT; ESTALE = WSAESTALE; EREMOTE = WSAEREMOTE; EAI_ADDRFAMILY = 1; // Address family for nodename not supported. EAI_AGAIN = 2; // Temporary failure in name resolution. EAI_BADFLAGS = 3; // Invalid value for ai_flags. EAI_FAIL = 4; // Non-recoverable failure in name resolution. EAI_FAMILY = 5; // Address family ai_family not supported. EAI_MEMORY = 6; // Memory allocation failure. EAI_NODATA = 7; // No address associated with nodename. EAI_NONAME = 8; // Nodename nor servname provided, or not known. EAI_SERVICE = 9; // Servname not supported for ai_socktype. EAI_SOCKTYPE = 10; // Socket type ai_socktype not supported. EAI_SYSTEM = 11; // System error returned in errno. const WSADESCRIPTION_LEN = 256; WSASYS_STATUS_LEN = 128; type PWSAData = ^TWSAData; TWSAData = record wVersion: Word; wHighVersion: Word; {$ifdef win64} iMaxSockets : Word; iMaxUdpDg : Word; lpVendorInfo : PAnsiChar; szDescription : array[0..WSADESCRIPTION_LEN] of AnsiChar; szSystemStatus : array[0..WSASYS_STATUS_LEN] of AnsiChar; {$else} szDescription: array[0..WSADESCRIPTION_LEN] of AnsiChar; szSystemStatus: array[0..WSASYS_STATUS_LEN] of AnsiChar; iMaxSockets: Word; iMaxUdpDg: Word; lpVendorInfo: PAnsiChar; {$endif} end; function IN6_IS_ADDR_UNSPECIFIED(const a: PInAddr6): boolean; function IN6_IS_ADDR_LOOPBACK(const a: PInAddr6): boolean; function IN6_IS_ADDR_LINKLOCAL(const a: PInAddr6): boolean; function IN6_IS_ADDR_SITELOCAL(const a: PInAddr6): boolean; function IN6_IS_ADDR_MULTICAST(const a: PInAddr6): boolean; function IN6_ADDR_EQUAL(const a: PInAddr6; const b: PInAddr6):boolean; procedure SET_IN6_IF_ADDR_ANY (const a: PInAddr6); procedure SET_LOOPBACK_ADDR6 (const a: PInAddr6); var in6addr_any, in6addr_loopback : TInAddr6; procedure FD_CLR(Socket: TSocket; var FDSet: TFDSet); function FD_ISSET(Socket: TSocket; var FDSet: TFDSet): Boolean; procedure FD_SET(Socket: TSocket; var FDSet: TFDSet); procedure FD_ZERO(var FDSet: TFDSet); {=============================================================================} type TWSAStartup = function(wVersionRequired: Word; var WSData: TWSAData): Integer; stdcall; TWSACleanup = function: Integer; stdcall; TWSAGetLastError = function: Integer; stdcall; TGetServByName = function(name, proto: PAnsiChar): PServEnt; stdcall; TGetServByPort = function(port: Integer; proto: PAnsiChar): PServEnt; stdcall; TGetProtoByName = function(name: PAnsiChar): PProtoEnt; stdcall; TGetProtoByNumber = function(proto: Integer): PProtoEnt; stdcall; TGetHostByName = function(name: PAnsiChar): PHostEnt; stdcall; TGetHostByAddr = function(addr: Pointer; len, Struc: Integer): PHostEnt; stdcall; TGetHostName = function(name: PAnsiChar; len: Integer): Integer; stdcall; TShutdown = function(s: TSocket; how: Integer): Integer; stdcall; TSetSockOpt = function(s: TSocket; level, optname: Integer; optval: PAnsiChar; optlen: Integer): Integer; stdcall; TGetSockOpt = function(s: TSocket; level, optname: Integer; optval: PAnsiChar; var optlen: Integer): Integer; stdcall; TSendTo = function(s: TSocket; const Buf; len, flags: Integer; addrto: PSockAddr; tolen: Integer): Integer; stdcall; TSend = function(s: TSocket; const Buf; len, flags: Integer): Integer; stdcall; TRecv = function(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall; TRecvFrom = function(s: TSocket; var Buf; len, flags: Integer; from: PSockAddr; var fromlen: Integer): Integer; stdcall; Tntohs = function(netshort: u_short): u_short; stdcall; Tntohl = function(netlong: u_long): u_long; stdcall; TListen = function(s: TSocket; backlog: Integer): Integer; stdcall; TIoctlSocket = function(s: TSocket; cmd: DWORD; var arg: Integer): Integer; stdcall; TInet_ntoa = function(inaddr: TInAddr): PAnsiChar; stdcall; TInet_addr = function(cp: PAnsiChar): u_long; stdcall; Thtons = function(hostshort: u_short): u_short; stdcall; Thtonl = function(hostlong: u_long): u_long; stdcall; TGetSockName = function(s: TSocket; name: PSockAddr; var namelen: Integer): Integer; stdcall; TGetPeerName = function(s: TSocket; name: PSockAddr; var namelen: Integer): Integer; stdcall; TConnect = function(s: TSocket; name: PSockAddr; namelen: Integer): Integer; stdcall; TCloseSocket = function(s: TSocket): Integer; stdcall; TBind = function(s: TSocket; addr: PSockAddr; namelen: Integer): Integer; stdcall; TAccept = function(s: TSocket; addr: PSockAddr; var addrlen: Integer): TSocket; stdcall; TTSocket = function(af, Struc, Protocol: Integer): TSocket; stdcall; TSelect = function(nfds: Integer; readfds, writefds, exceptfds: PFDSet; timeout: PTimeVal): Longint; stdcall; TGetAddrInfo = function(NodeName: PAnsiChar; ServName: PAnsiChar; Hints: PAddrInfo; var Addrinfo: PAddrInfo): integer; stdcall; TFreeAddrInfo = procedure(ai: PAddrInfo); stdcall; TGetNameInfo = function( addr: PSockAddr; namelen: Integer; host: PAnsiChar; hostlen: DWORD; serv: PAnsiChar; servlen: DWORD; flags: integer): integer; stdcall; T__WSAFDIsSet = function (s: TSocket; var FDSet: TFDSet): Bool; stdcall; TWSAIoctl = function (s: TSocket; dwIoControlCode: DWORD; lpvInBuffer: Pointer; cbInBuffer: DWORD; lpvOutBuffer: Pointer; cbOutBuffer: DWORD; lpcbBytesReturned: PDWORD; lpOverlapped: Pointer; lpCompletionRoutine: pointer): u_int; stdcall; var WSAStartup: TWSAStartup = nil; WSACleanup: TWSACleanup = nil; WSAGetLastError: TWSAGetLastError = nil; GetServByName: TGetServByName = nil; GetServByPort: TGetServByPort = nil; GetProtoByName: TGetProtoByName = nil; GetProtoByNumber: TGetProtoByNumber = nil; GetHostByName: TGetHostByName = nil; GetHostByAddr: TGetHostByAddr = nil; ssGetHostName: TGetHostName = nil; Shutdown: TShutdown = nil; SetSockOpt: TSetSockOpt = nil; GetSockOpt: TGetSockOpt = nil; ssSendTo: TSendTo = nil; ssSend: TSend = nil; ssRecv: TRecv = nil; ssRecvFrom: TRecvFrom = nil; ntohs: Tntohs = nil; ntohl: Tntohl = nil; Listen: TListen = nil; IoctlSocket: TIoctlSocket = nil; Inet_ntoa: TInet_ntoa = nil; Inet_addr: TInet_addr = nil; htons: Thtons = nil; htonl: Thtonl = nil; ssGetSockName: TGetSockName = nil; ssGetPeerName: TGetPeerName = nil; ssConnect: TConnect = nil; CloseSocket: TCloseSocket = nil; ssBind: TBind = nil; ssAccept: TAccept = nil; Socket: TTSocket = nil; Select: TSelect = nil; GetAddrInfo: TGetAddrInfo = nil; FreeAddrInfo: TFreeAddrInfo = nil; GetNameInfo: TGetNameInfo = nil; __WSAFDIsSet: T__WSAFDIsSet = nil; WSAIoctl: TWSAIoctl = nil; var SynSockCS: SyncObjs.TCriticalSection; SockEnhancedApi: Boolean; SockWship6Api: Boolean; type TVarSin = packed record case integer of 0: (AddressFamily: u_short); 1: ( case sin_family: u_short of AF_INET: (sin_port: u_short; sin_addr: TInAddr; sin_zero: array[0..7] of byte); AF_INET6: (sin6_port: u_short; sin6_flowinfo: u_long; sin6_addr: TInAddr6; sin6_scope_id: u_long); ); end; function SizeOfVarSin(sin: TVarSin): integer; function Bind(s: TSocket; const addr: TVarSin): Integer; function Connect(s: TSocket; const name: TVarSin): Integer; function GetSockName(s: TSocket; var name: TVarSin): Integer; function GetPeerName(s: TSocket; var name: TVarSin): Integer; function GetHostName: AnsiString; function Send(s: TSocket; Buf: TMemory; len, flags: Integer): Integer; function Recv(s: TSocket; Buf: TMemory; len, flags: Integer): Integer; function SendTo(s: TSocket; Buf: TMemory; len, flags: Integer; addrto: TVarSin): Integer; function RecvFrom(s: TSocket; Buf: TMemory; len, flags: Integer; var from: TVarSin): Integer; function Accept(s: TSocket; var addr: TVarSin): TSocket; function IsNewApi(Family: integer): Boolean; function SetVarSin(var Sin: TVarSin; IP, Port: AnsiString; Family, SockProtocol, SockType: integer; PreferIP4: Boolean): integer; function GetSinIP(Sin: TVarSin): AnsiString; function GetSinPort(Sin: TVarSin): Integer; procedure ResolveNameToIP(Name: AnsiString; Family, SockProtocol, SockType: integer; const IPList: TStrings); function ResolveIPToName(IP: AnsiString; Family, SockProtocol, SockType: integer): AnsiString; function ResolvePort(Port: AnsiString; Family, SockProtocol, SockType: integer): Word; {==============================================================================} implementation var SynSockCount: Integer = 0; LibHandle: THandle = 0; Libwship6Handle: THandle = 0; function IN6_IS_ADDR_UNSPECIFIED(const a: PInAddr6): boolean; begin Result := ((a^.u6_addr32[0] = 0) and (a^.u6_addr32[1] = 0) and (a^.u6_addr32[2] = 0) and (a^.u6_addr32[3] = 0)); end; function IN6_IS_ADDR_LOOPBACK(const a: PInAddr6): boolean; begin Result := ((a^.u6_addr32[0] = 0) and (a^.u6_addr32[1] = 0) and (a^.u6_addr32[2] = 0) and (a^.u6_addr8[12] = 0) and (a^.u6_addr8[13] = 0) and (a^.u6_addr8[14] = 0) and (a^.u6_addr8[15] = 1)); end; function IN6_IS_ADDR_LINKLOCAL(const a: PInAddr6): boolean; begin Result := ((a^.u6_addr8[0] = $FE) and (a^.u6_addr8[1] = $80)); end; function IN6_IS_ADDR_SITELOCAL(const a: PInAddr6): boolean; begin Result := ((a^.u6_addr8[0] = $FE) and (a^.u6_addr8[1] = $C0)); end; function IN6_IS_ADDR_MULTICAST(const a: PInAddr6): boolean; begin Result := (a^.u6_addr8[0] = $FF); end; function IN6_ADDR_EQUAL(const a: PInAddr6; const b: PInAddr6): boolean; begin Result := (CompareMem( a, b, sizeof(TInAddr6))); end; procedure SET_IN6_IF_ADDR_ANY (const a: PInAddr6); begin FillChar(a^, sizeof(TInAddr6), 0); end; procedure SET_LOOPBACK_ADDR6 (const a: PInAddr6); begin FillChar(a^, sizeof(TInAddr6), 0); a^.u6_addr8[15] := 1; end; {=============================================================================} procedure FD_CLR(Socket: TSocket; var FDSet: TFDSet); var I: Integer; begin I := 0; while I < FDSet.fd_count do begin if FDSet.fd_array[I] = Socket then begin while I < FDSet.fd_count - 1 do begin FDSet.fd_array[I] := FDSet.fd_array[I + 1]; Inc(I); end; Dec(FDSet.fd_count); Break; end; Inc(I); end; end; function FD_ISSET(Socket: TSocket; var FDSet: TFDSet): Boolean; begin Result := __WSAFDIsSet(Socket, FDSet); end; procedure FD_SET(Socket: TSocket; var FDSet: TFDSet); begin if FDSet.fd_count < FD_SETSIZE then begin FDSet.fd_array[FDSet.fd_count] := Socket; Inc(FDSet.fd_count); end; end; procedure FD_ZERO(var FDSet: TFDSet); begin FDSet.fd_count := 0; end; {=============================================================================} function SizeOfVarSin(sin: TVarSin): integer; begin case sin.sin_family of AF_INET: Result := SizeOf(TSockAddrIn); AF_INET6: Result := SizeOf(TSockAddrIn6); else Result := 0; end; end; {=============================================================================} function Bind(s: TSocket; const addr: TVarSin): Integer; begin Result := ssBind(s, @addr, SizeOfVarSin(addr)); end; function Connect(s: TSocket; const name: TVarSin): Integer; begin Result := ssConnect(s, @name, SizeOfVarSin(name)); end; function GetSockName(s: TSocket; var name: TVarSin): Integer; var len: integer; begin len := SizeOf(name); FillChar(name, len, 0); Result := ssGetSockName(s, @name, Len); end; function GetPeerName(s: TSocket; var name: TVarSin): Integer; var len: integer; begin len := SizeOf(name); FillChar(name, len, 0); Result := ssGetPeerName(s, @name, Len); end; function GetHostName: AnsiString; var s: AnsiString; begin Result := ''; setlength(s, 255); ssGetHostName(pAnsichar(s), Length(s) - 1); Result := PAnsichar(s); end; function Send(s: TSocket; Buf: TMemory; len, flags: Integer): Integer; begin Result := ssSend(s, Buf^, len, flags); end; function Recv(s: TSocket; Buf: TMemory; len, flags: Integer): Integer; begin Result := ssRecv(s, Buf^, len, flags); end; function SendTo(s: TSocket; Buf: TMemory; len, flags: Integer; addrto: TVarSin): Integer; begin Result := ssSendTo(s, Buf^, len, flags, @addrto, SizeOfVarSin(addrto)); end; function RecvFrom(s: TSocket; Buf: TMemory; len, flags: Integer; var from: TVarSin): Integer; var x: integer; begin x := SizeOf(from); Result := ssRecvFrom(s, Buf^, len, flags, @from, x); end; function Accept(s: TSocket; var addr: TVarSin): TSocket; var x: integer; begin x := SizeOf(addr); Result := ssAccept(s, @addr, x); end; {=============================================================================} function IsNewApi(Family: integer): Boolean; begin Result := SockEnhancedApi; if not Result then Result := (Family = AF_INET6) and SockWship6Api; end; function SetVarSin(var Sin: TVarSin; IP, Port: AnsiString; Family, SockProtocol, SockType: integer; PreferIP4: Boolean): integer; type pu_long = ^u_long; var ProtoEnt: PProtoEnt; ServEnt: PServEnt; HostEnt: PHostEnt; r: integer; Hints1, Hints2: TAddrInfo; Sin1, Sin2: TVarSin; TwoPass: boolean; function GetAddr(const IP, port: AnsiString; Hints: TAddrInfo; var Sin: TVarSin): integer; var Addr: PAddrInfo; begin Addr := nil; try FillChar(Sin, Sizeof(Sin), 0); if Hints.ai_socktype = SOCK_RAW then begin Hints.ai_socktype := 0; Hints.ai_protocol := 0; Result := synsock.GetAddrInfo(PAnsiChar(IP), nil, @Hints, Addr); end else begin if (IP = cAnyHost) or (IP = c6AnyHost) then begin Hints.ai_flags := AI_PASSIVE; Result := synsock.GetAddrInfo(nil, PAnsiChar(Port), @Hints, Addr); end else if (IP = cLocalhost) or (IP = c6Localhost) then begin Result := synsock.GetAddrInfo(nil, PAnsiChar(Port), @Hints, Addr); end else begin Result := synsock.GetAddrInfo(PAnsiChar(IP), PAnsiChar(Port), @Hints, Addr); end; end; if Result = 0 then if (Addr <> nil) then Move(Addr^.ai_addr^, Sin, Addr^.ai_addrlen); finally if Assigned(Addr) then synsock.FreeAddrInfo(Addr); end; end; begin Result := 0; FillChar(Sin, Sizeof(Sin), 0); if not IsNewApi(family) then begin SynSockCS.Enter; try Sin.sin_family := AF_INET; ProtoEnt := synsock.GetProtoByNumber(SockProtocol); ServEnt := nil; if (ProtoEnt <> nil) and (StrToIntDef(string(Port),-1) =-1) then ServEnt := synsock.GetServByName(PAnsiChar(Port), ProtoEnt^.p_name); if ServEnt = nil then Sin.sin_port := synsock.htons(StrToIntDef(string(Port), 0)) else Sin.sin_port := ServEnt^.s_port; if IP = cBroadcast then Sin.sin_addr.s_addr := u_long(INADDR_BROADCAST) else begin Sin.sin_addr.s_addr := synsock.inet_addr(PAnsiChar(IP)); if Sin.sin_addr.s_addr = u_long(INADDR_NONE) then begin HostEnt := synsock.GetHostByName(PAnsiChar(IP)); Result := synsock.WSAGetLastError; if HostEnt <> nil then Sin.sin_addr.S_addr := u_long(Pu_long(HostEnt^.h_addr_list^)^); end; end; finally SynSockCS.Leave; end; end else begin FillChar(Hints1, Sizeof(Hints1), 0); FillChar(Hints2, Sizeof(Hints2), 0); TwoPass := False; if Family = AF_UNSPEC then begin if PreferIP4 then begin Hints1.ai_family := AF_INET; Hints2.ai_family := AF_INET6; TwoPass := True; end else begin Hints2.ai_family := AF_INET; Hints1.ai_family := AF_INET6; TwoPass := True; end; end else Hints1.ai_family := Family; Hints1.ai_socktype := SockType; Hints1.ai_protocol := SockProtocol; Hints2.ai_socktype := Hints1.ai_socktype; Hints2.ai_protocol := Hints1.ai_protocol; r := GetAddr(IP, Port, Hints1, Sin1); Result := r; sin := sin1; if r <> 0 then if TwoPass then begin r := GetAddr(IP, Port, Hints2, Sin2); Result := r; if r = 0 then sin := sin2; end; end; end; function GetSinIP(Sin: TVarSin): AnsiString; var p: PAnsiChar; host, serv: AnsiString; hostlen, servlen: integer; r: integer; begin Result := ''; if not IsNewApi(Sin.AddressFamily) then begin p := synsock.inet_ntoa(Sin.sin_addr); if p <> nil then Result := p; end else begin hostlen := NI_MAXHOST; servlen := NI_MAXSERV; setlength(host, hostlen); setlength(serv, servlen); r := getnameinfo(@sin, SizeOfVarSin(sin), PAnsiChar(host), hostlen, PAnsiChar(serv), servlen, NI_NUMERICHOST + NI_NUMERICSERV); if r = 0 then Result := PAnsiChar(host); end; end; function GetSinPort(Sin: TVarSin): Integer; begin if (Sin.sin_family = AF_INET6) then Result := synsock.ntohs(Sin.sin6_port) else Result := synsock.ntohs(Sin.sin_port); end; procedure ResolveNameToIP(Name: AnsiString; Family, SockProtocol, SockType: integer; const IPList: TStrings); type TaPInAddr = array[0..250] of PInAddr; PaPInAddr = ^TaPInAddr; var Hints: TAddrInfo; Addr: PAddrInfo; AddrNext: PAddrInfo; r: integer; host, serv: AnsiString; hostlen, servlen: integer; RemoteHost: PHostEnt; IP: u_long; PAdrPtr: PaPInAddr; i: Integer; s: String; InAddr: TInAddr; begin IPList.Clear; if not IsNewApi(Family) then begin IP := synsock.inet_addr(PAnsiChar(Name)); if IP = u_long(INADDR_NONE) then begin SynSockCS.Enter; try RemoteHost := synsock.GetHostByName(PAnsiChar(Name)); if RemoteHost <> nil then begin PAdrPtr := PAPInAddr(RemoteHost^.h_addr_list); i := 0; while PAdrPtr^[i] <> nil do begin InAddr := PAdrPtr^[i]^; s := Format('%d.%d.%d.%d', [InAddr.S_bytes[0], InAddr.S_bytes[1], InAddr.S_bytes[2], InAddr.S_bytes[3]]); IPList.Add(s); Inc(i); end; end; finally SynSockCS.Leave; end; end else IPList.Add(string(Name)); end else begin Addr := nil; try FillChar(Hints, Sizeof(Hints), 0); Hints.ai_family := AF_UNSPEC; Hints.ai_socktype := SockType; Hints.ai_protocol := SockProtocol; Hints.ai_flags := 0; r := synsock.GetAddrInfo(PAnsiChar(Name), nil, @Hints, Addr); if r = 0 then begin AddrNext := Addr; while not(AddrNext = nil) do begin if not(((Family = AF_INET6) and (AddrNext^.ai_family = AF_INET)) or ((Family = AF_INET) and (AddrNext^.ai_family = AF_INET6))) then begin hostlen := NI_MAXHOST; servlen := NI_MAXSERV; setlength(host, hostlen); setlength(serv, servlen); r := getnameinfo(AddrNext^.ai_addr, AddrNext^.ai_addrlen, PAnsiChar(host), hostlen, PAnsiChar(serv), servlen, NI_NUMERICHOST + NI_NUMERICSERV); if r = 0 then begin host := PAnsiChar(host); IPList.Add(string(host)); end; end; AddrNext := AddrNext^.ai_next; end; end; finally if Assigned(Addr) then synsock.FreeAddrInfo(Addr); end; end; if IPList.Count = 0 then IPList.Add(cAnyHost); end; function ResolvePort(Port: AnsiString; Family, SockProtocol, SockType: integer): Word; var ProtoEnt: PProtoEnt; ServEnt: PServEnt; Hints: TAddrInfo; Addr: PAddrInfo; r: integer; begin Result := 0; if not IsNewApi(Family) then begin SynSockCS.Enter; try ProtoEnt := synsock.GetProtoByNumber(SockProtocol); ServEnt := nil; if ProtoEnt <> nil then ServEnt := synsock.GetServByName(PAnsiChar(Port), ProtoEnt^.p_name); if ServEnt = nil then Result := StrToIntDef(string(Port), 0) else Result := synsock.htons(ServEnt^.s_port); finally SynSockCS.Leave; end; end else begin Addr := nil; try FillChar(Hints, Sizeof(Hints), 0); Hints.ai_family := AF_UNSPEC; Hints.ai_socktype := SockType; Hints.ai_protocol := Sockprotocol; Hints.ai_flags := AI_PASSIVE; r := synsock.GetAddrInfo(nil, PAnsiChar(Port), @Hints, Addr); if (r = 0) and Assigned(Addr) then begin if Addr^.ai_family = AF_INET then Result := synsock.htons(Addr^.ai_addr^.sin_port); if Addr^.ai_family = AF_INET6 then Result := synsock.htons(PSockAddrIn6(Addr^.ai_addr)^.sin6_port); end; finally if Assigned(Addr) then synsock.FreeAddrInfo(Addr); end; end; end; function ResolveIPToName(IP: AnsiString; Family, SockProtocol, SockType: integer): AnsiString; var Hints: TAddrInfo; Addr: PAddrInfo; r: integer; host, serv: AnsiString; hostlen, servlen: integer; RemoteHost: PHostEnt; IPn: u_long; begin Result := IP; if not IsNewApi(Family) then begin IPn := synsock.inet_addr(PAnsiChar(IP)); if IPn <> u_long(INADDR_NONE) then begin SynSockCS.Enter; try RemoteHost := GetHostByAddr(@IPn, SizeOf(IPn), AF_INET); if RemoteHost <> nil then Result := RemoteHost^.h_name; finally SynSockCS.Leave; end; end; end else begin Addr := nil; try FillChar(Hints, Sizeof(Hints), 0); Hints.ai_family := AF_UNSPEC; Hints.ai_socktype := SockType; Hints.ai_protocol := SockProtocol; Hints.ai_flags := 0; r := synsock.GetAddrInfo(PAnsiChar(IP), nil, @Hints, Addr); if (r = 0) and Assigned(Addr)then begin hostlen := NI_MAXHOST; servlen := NI_MAXSERV; setlength(host, hostlen); setlength(serv, servlen); r := getnameinfo(Addr^.ai_addr, Addr^.ai_addrlen, PAnsiChar(host), hostlen, PAnsiChar(serv), servlen, NI_NUMERICSERV); if r = 0 then Result := PAnsiChar(host); end; finally if Assigned(Addr) then synsock.FreeAddrInfo(Addr); end; end; end; {=============================================================================} function InitSocketInterface(stack: String): Boolean; begin Result := False; SockEnhancedApi := False; if stack = '' then stack := DLLStackName; SynSockCS.Enter; try if SynSockCount = 0 then begin SockEnhancedApi := False; SockWship6Api := False; LibHandle := LoadLibrary(PChar(Stack)); if LibHandle <> 0 then begin WSAIoctl := GetProcAddress(LibHandle, PAnsiChar(AnsiString('WSAIoctl'))); __WSAFDIsSet := GetProcAddress(LibHandle, PAnsiChar(AnsiString('__WSAFDIsSet'))); CloseSocket := GetProcAddress(LibHandle, PAnsiChar(AnsiString('closesocket'))); IoctlSocket := GetProcAddress(LibHandle, PAnsiChar(AnsiString('ioctlsocket'))); WSAGetLastError := GetProcAddress(LibHandle, PAnsiChar(AnsiString('WSAGetLastError'))); WSAStartup := GetProcAddress(LibHandle, PAnsiChar(AnsiString('WSAStartup'))); WSACleanup := GetProcAddress(LibHandle, PAnsiChar(AnsiString('WSACleanup'))); ssAccept := GetProcAddress(LibHandle, PAnsiChar(AnsiString('accept'))); ssBind := GetProcAddress(LibHandle, PAnsiChar(AnsiString('bind'))); ssConnect := GetProcAddress(LibHandle, PAnsiChar(AnsiString('connect'))); ssGetPeerName := GetProcAddress(LibHandle, PAnsiChar(AnsiString('getpeername'))); ssGetSockName := GetProcAddress(LibHandle, PAnsiChar(AnsiString('getsockname'))); GetSockOpt := GetProcAddress(LibHandle, PAnsiChar(AnsiString('getsockopt'))); Htonl := GetProcAddress(LibHandle, PAnsiChar(AnsiString('htonl'))); Htons := GetProcAddress(LibHandle, PAnsiChar(AnsiString('htons'))); Inet_Addr := GetProcAddress(LibHandle, PAnsiChar(AnsiString('inet_addr'))); Inet_Ntoa := GetProcAddress(LibHandle, PAnsiChar(AnsiString('inet_ntoa'))); Listen := GetProcAddress(LibHandle, PAnsiChar(AnsiString('listen'))); Ntohl := GetProcAddress(LibHandle, PAnsiChar(AnsiString('ntohl'))); Ntohs := GetProcAddress(LibHandle, PAnsiChar(AnsiString('ntohs'))); ssRecv := GetProcAddress(LibHandle, PAnsiChar(AnsiString('recv'))); ssRecvFrom := GetProcAddress(LibHandle, PAnsiChar(AnsiString('recvfrom'))); Select := GetProcAddress(LibHandle, PAnsiChar(AnsiString('select'))); ssSend := GetProcAddress(LibHandle, PAnsiChar(AnsiString('send'))); ssSendTo := GetProcAddress(LibHandle, PAnsiChar(AnsiString('sendto'))); SetSockOpt := GetProcAddress(LibHandle, PAnsiChar(AnsiString('setsockopt'))); ShutDown := GetProcAddress(LibHandle, PAnsiChar(AnsiString('shutdown'))); Socket := GetProcAddress(LibHandle, PAnsiChar(AnsiString('socket'))); GetHostByAddr := GetProcAddress(LibHandle, PAnsiChar(AnsiString('gethostbyaddr'))); GetHostByName := GetProcAddress(LibHandle, PAnsiChar(AnsiString('gethostbyname'))); GetProtoByName := GetProcAddress(LibHandle, PAnsiChar(AnsiString('getprotobyname'))); GetProtoByNumber := GetProcAddress(LibHandle, PAnsiChar(AnsiString('getprotobynumber'))); GetServByName := GetProcAddress(LibHandle, PAnsiChar(AnsiString('getservbyname'))); GetServByPort := GetProcAddress(LibHandle, PAnsiChar(AnsiString('getservbyport'))); ssGetHostName := GetProcAddress(LibHandle, PAnsiChar(AnsiString('gethostname'))); {$IFNDEF FORCEOLDAPI} GetAddrInfo := GetProcAddress(LibHandle, PAnsiChar(AnsiString('getaddrinfo'))); FreeAddrInfo := GetProcAddress(LibHandle, PAnsiChar(AnsiString('freeaddrinfo'))); GetNameInfo := GetProcAddress(LibHandle, PAnsiChar(AnsiString('getnameinfo'))); SockEnhancedApi := Assigned(GetAddrInfo) and Assigned(FreeAddrInfo) and Assigned(GetNameInfo); if not SockEnhancedApi then begin LibWship6Handle := LoadLibrary(PChar(DLLWship6)); if LibWship6Handle <> 0 then begin GetAddrInfo := GetProcAddress(LibWship6Handle, PAnsiChar(AnsiString('getaddrinfo'))); FreeAddrInfo := GetProcAddress(LibWship6Handle, PAnsiChar(AnsiString('freeaddrinfo'))); GetNameInfo := GetProcAddress(LibWship6Handle, PAnsiChar(AnsiString('getnameinfo'))); SockWship6Api := Assigned(GetAddrInfo) and Assigned(FreeAddrInfo) and Assigned(GetNameInfo); end; end; {$ENDIF} Result := True; end; end else Result := True; if Result then Inc(SynSockCount); finally SynSockCS.Leave; end; end; function DestroySocketInterface: Boolean; begin SynSockCS.Enter; try Dec(SynSockCount); if SynSockCount < 0 then SynSockCount := 0; if SynSockCount = 0 then begin if LibHandle <> 0 then begin FreeLibrary(libHandle); LibHandle := 0; end; if LibWship6Handle <> 0 then begin FreeLibrary(LibWship6Handle); LibWship6Handle := 0; end; end; finally SynSockCS.Leave; end; Result := True; end; initialization begin SynSockCS := SyncObjs.TCriticalSection.Create; SET_IN6_IF_ADDR_ANY (@in6addr_any); SET_LOOPBACK_ADDR6 (@in6addr_loopback); end; finalization begin SynSockCS.Free; end;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/synapse/synsock.pas�������������������������������������������������0000644�0001750�0001750�00000007571�12014201074�021445� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{==============================================================================| | Project : Ararat Synapse | 005.002.001 | |==============================================================================| | Content: Socket Independent Platform Layer | |==============================================================================| | Copyright (c)1999-2011, Lukas Gebauer | | All rights reserved. | | | | Redistribution and use in source and binary forms, with or without | | modification, are permitted provided that the following conditions are met: | | | | Redistributions of source code must retain the above copyright notice, this | | list of conditions and the following disclaimer. | | | | Redistributions in binary form must reproduce the above copyright notice, | | this list of conditions and the following disclaimer in the documentation | | and/or other materials provided with the distribution. | | | | Neither the name of Lukas Gebauer nor the names of its contributors may | | be used to endorse or promote products derived from this software without | | specific prior written permission. | | | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | | ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR | | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | | DAMAGE. | |==============================================================================| | The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).| | Portions created by Lukas Gebauer are Copyright (c)2001-2011. | | All Rights Reserved. | |==============================================================================| | Contributor(s): | |==============================================================================| | History: see HISTORY.HTM from distribution package | | (Found at URL: http://www.ararat.cz/synapse/) | |==============================================================================} {:@exclude} unit synsock; {$MINENUMSIZE 4} //old Delphi does not have MSWINDOWS define. {$IFDEF WIN32} {$IFNDEF MSWINDOWS} {$DEFINE MSWINDOWS} {$ENDIF} {$ENDIF} {$IFDEF CIL} {$I ssdotnet.inc} {$ELSE} {$IFDEF MSWINDOWS} {$I sswin32.inc} {$ELSE} {$IFDEF WINCE} {$I sswin32.inc} //not complete yet! {$ELSE} {$IFDEF FPC} {$I ssfpc.inc} {$ELSE} {$I sslinux.inc} {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} end. ���������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/synapse/ssfpc.inc���������������������������������������������������0000644�0001750�0001750�00000066217�12014201074�021062� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{==============================================================================| | Project : Ararat Synapse | 001.001.004 | |==============================================================================| | Content: Socket Independent Platform Layer - FreePascal definition include | |==============================================================================| | Copyright (c)2006-2011, Lukas Gebauer | | All rights reserved. | | | | Redistribution and use in source and binary forms, with or without | | modification, are permitted provided that the following conditions are met: | | | | Redistributions of source code must retain the above copyright notice, this | | list of conditions and the following disclaimer. | | | | Redistributions in binary form must reproduce the above copyright notice, | | this list of conditions and the following disclaimer in the documentation | | and/or other materials provided with the distribution. | | | | Neither the name of Lukas Gebauer nor the names of its contributors may | | be used to endorse or promote products derived from this software without | | specific prior written permission. | | | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | | ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR | | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | | DAMAGE. | |==============================================================================| | The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).| | Portions created by Lukas Gebauer are Copyright (c)2006-2011. | | All Rights Reserved. | |==============================================================================| | Contributor(s): | |==============================================================================| | History: see HISTORY.HTM from distribution package | | (Found at URL: http://www.ararat.cz/synapse/) | |==============================================================================} {:@exclude} {$IFDEF FPC} {For FreePascal 2.x.x} //{$DEFINE FORCEOLDAPI} {Note about define FORCEOLDAPI: If you activate this compiler directive, then is allways used old socket API for name resolution. If you leave this directive inactive, then the new API is used, when running system allows it. For IPv6 support you must have new API! } {$IFDEF FPC} {$MODE DELPHI} {$ENDIF} {$H+} {$ifdef FreeBSD} {$DEFINE SOCK_HAS_SINLEN} // BSD definition of scoketaddr {$endif} {$ifdef darwin} {$DEFINE SOCK_HAS_SINLEN} // BSD definition of scoketaddr {$endif} interface uses SyncObjs, SysUtils, Classes, synafpc, BaseUnix, Unix, termio, sockets, netdb; function InitSocketInterface(stack: string): Boolean; function DestroySocketInterface: Boolean; const DLLStackName = ''; WinsockLevel = $0202; cLocalHost = '127.0.0.1'; cAnyHost = '0.0.0.0'; c6AnyHost = '::0'; c6Localhost = '::1'; cLocalHostStr = 'localhost'; type TSocket = longint; TAddrFamily = integer; TMemory = pointer; type TFDSet = Baseunix.TFDSet; PFDSet = ^TFDSet; Ptimeval = Baseunix.ptimeval; Ttimeval = Baseunix.ttimeval; const FIONREAD = termio.FIONREAD; FIONBIO = termio.FIONBIO; FIOASYNC = termio.FIOASYNC; const IPPROTO_IP = 0; { Dummy } IPPROTO_ICMP = 1; { Internet Control Message Protocol } IPPROTO_IGMP = 2; { Internet Group Management Protocol} IPPROTO_TCP = 6; { TCP } IPPROTO_UDP = 17; { User Datagram Protocol } IPPROTO_IPV6 = 41; IPPROTO_ICMPV6 = 58; IPPROTO_RM = 113; IPPROTO_RAW = 255; IPPROTO_MAX = 256; type PInAddr = ^TInAddr; TInAddr = sockets.in_addr; PSockAddrIn = ^TSockAddrIn; TSockAddrIn = sockets.TInetSockAddr; TIP_mreq = record imr_multiaddr: TInAddr; // IP multicast address of group imr_interface: TInAddr; // local IP address of interface end; PInAddr6 = ^TInAddr6; TInAddr6 = sockets.Tin6_addr; PSockAddrIn6 = ^TSockAddrIn6; TSockAddrIn6 = sockets.TInetSockAddr6; TIPv6_mreq = record ipv6mr_multiaddr: TInAddr6; // IPv6 multicast address. ipv6mr_interface: integer; // Interface index. end; const INADDR_ANY = $00000000; INADDR_LOOPBACK = $7F000001; INADDR_BROADCAST = $FFFFFFFF; INADDR_NONE = $FFFFFFFF; ADDR_ANY = INADDR_ANY; INVALID_SOCKET = TSocket(NOT(0)); SOCKET_ERROR = -1; Const IP_TOS = sockets.IP_TOS; { int; IP type of service and precedence. } IP_TTL = sockets.IP_TTL; { int; IP time to live. } IP_HDRINCL = sockets.IP_HDRINCL; { int; Header is included with data. } IP_OPTIONS = sockets.IP_OPTIONS; { ip_opts; IP per-packet options. } // IP_ROUTER_ALERT = sockets.IP_ROUTER_ALERT; { bool } IP_RECVOPTS = sockets.IP_RECVOPTS; { bool } IP_RETOPTS = sockets.IP_RETOPTS; { bool } // IP_PKTINFO = sockets.IP_PKTINFO; { bool } // IP_PKTOPTIONS = sockets.IP_PKTOPTIONS; // IP_PMTUDISC = sockets.IP_PMTUDISC; { obsolete name? } // IP_MTU_DISCOVER = sockets.IP_MTU_DISCOVER; { int; see below } // IP_RECVERR = sockets.IP_RECVERR; { bool } // IP_RECVTTL = sockets.IP_RECVTTL; { bool } // IP_RECVTOS = sockets.IP_RECVTOS; { bool } IP_MULTICAST_IF = sockets.IP_MULTICAST_IF; { in_addr; set/get IP multicast i/f } IP_MULTICAST_TTL = sockets.IP_MULTICAST_TTL; { u_char; set/get IP multicast ttl } IP_MULTICAST_LOOP = sockets.IP_MULTICAST_LOOP; { i_char; set/get IP multicast loopback } IP_ADD_MEMBERSHIP = sockets.IP_ADD_MEMBERSHIP; { ip_mreq; add an IP group membership } IP_DROP_MEMBERSHIP = sockets.IP_DROP_MEMBERSHIP; { ip_mreq; drop an IP group membership } SOL_SOCKET = sockets.SOL_SOCKET; SO_DEBUG = sockets.SO_DEBUG; SO_REUSEADDR = sockets.SO_REUSEADDR; SO_TYPE = sockets.SO_TYPE; SO_ERROR = sockets.SO_ERROR; SO_DONTROUTE = sockets.SO_DONTROUTE; SO_BROADCAST = sockets.SO_BROADCAST; SO_SNDBUF = sockets.SO_SNDBUF; SO_RCVBUF = sockets.SO_RCVBUF; SO_KEEPALIVE = sockets.SO_KEEPALIVE; SO_OOBINLINE = sockets.SO_OOBINLINE; // SO_NO_CHECK = sockets.SO_NO_CHECK; // SO_PRIORITY = sockets.SO_PRIORITY; SO_LINGER = sockets.SO_LINGER; // SO_BSDCOMPAT = sockets.SO_BSDCOMPAT; // SO_REUSEPORT = sockets.SO_REUSEPORT; // SO_PASSCRED = sockets.SO_PASSCRED; // SO_PEERCRED = sockets.SO_PEERCRED; SO_RCVLOWAT = sockets.SO_RCVLOWAT; SO_SNDLOWAT = sockets.SO_SNDLOWAT; SO_RCVTIMEO = sockets.SO_RCVTIMEO; SO_SNDTIMEO = sockets.SO_SNDTIMEO; { Security levels - as per NRL IPv6 - don't actually do anything } // SO_SECURITY_AUTHENTICATION = sockets.SO_SECURITY_AUTHENTICATION; // SO_SECURITY_ENCRYPTION_TRANSPORT = sockets.SO_SECURITY_ENCRYPTION_TRANSPORT; // SO_SECURITY_ENCRYPTION_NETWORK = sockets.SO_SECURITY_ENCRYPTION_NETWORK; // SO_BINDTODEVICE = sockets.SO_BINDTODEVICE; { Socket filtering } // SO_ATTACH_FILTER = sockets.SO_ATTACH_FILTER; // SO_DETACH_FILTER = sockets.SO_DETACH_FILTER; SOMAXCONN = 1024; IPV6_UNICAST_HOPS = sockets.IPV6_UNICAST_HOPS; IPV6_MULTICAST_IF = sockets.IPV6_MULTICAST_IF; IPV6_MULTICAST_HOPS = sockets.IPV6_MULTICAST_HOPS; IPV6_MULTICAST_LOOP = sockets.IPV6_MULTICAST_LOOP; IPV6_JOIN_GROUP = sockets.IPV6_JOIN_GROUP; IPV6_LEAVE_GROUP = sockets.IPV6_LEAVE_GROUP; const SOCK_STREAM = 1; { stream socket } SOCK_DGRAM = 2; { datagram socket } SOCK_RAW = 3; { raw-protocol interface } SOCK_RDM = 4; { reliably-delivered message } SOCK_SEQPACKET = 5; { sequenced packet stream } { TCP options. } TCP_NODELAY = $0001; { Address families. } AF_UNSPEC = 0; { unspecified } AF_INET = 2; { internetwork: UDP, TCP, etc. } AF_INET6 = 10; { Internetwork Version 6 } AF_MAX = 24; { Protocol families, same as address families for now. } PF_UNSPEC = AF_UNSPEC; PF_INET = AF_INET; PF_INET6 = AF_INET6; PF_MAX = AF_MAX; type { Structure used for manipulating linger option. } PLinger = ^TLinger; TLinger = packed record l_onoff: integer; l_linger: integer; end; const MSG_OOB = sockets.MSG_OOB; // Process out-of-band data. MSG_PEEK = sockets.MSG_PEEK; // Peek at incoming messages. {$ifdef DARWIN} MSG_NOSIGNAL = $20000; // Do not generate SIGPIPE. // Works under MAC OS X, but is undocumented, // So FPC doesn't include it {$else} MSG_NOSIGNAL = sockets.MSG_NOSIGNAL; // Do not generate SIGPIPE. {$endif} const WSAEINTR = ESysEINTR; WSAEBADF = ESysEBADF; WSAEACCES = ESysEACCES; WSAEFAULT = ESysEFAULT; WSAEINVAL = ESysEINVAL; WSAEMFILE = ESysEMFILE; WSAEWOULDBLOCK = ESysEWOULDBLOCK; WSAEINPROGRESS = ESysEINPROGRESS; WSAEALREADY = ESysEALREADY; WSAENOTSOCK = ESysENOTSOCK; WSAEDESTADDRREQ = ESysEDESTADDRREQ; WSAEMSGSIZE = ESysEMSGSIZE; WSAEPROTOTYPE = ESysEPROTOTYPE; WSAENOPROTOOPT = ESysENOPROTOOPT; WSAEPROTONOSUPPORT = ESysEPROTONOSUPPORT; WSAESOCKTNOSUPPORT = ESysESOCKTNOSUPPORT; WSAEOPNOTSUPP = ESysEOPNOTSUPP; WSAEPFNOSUPPORT = ESysEPFNOSUPPORT; WSAEAFNOSUPPORT = ESysEAFNOSUPPORT; WSAEADDRINUSE = ESysEADDRINUSE; WSAEADDRNOTAVAIL = ESysEADDRNOTAVAIL; WSAENETDOWN = ESysENETDOWN; WSAENETUNREACH = ESysENETUNREACH; WSAENETRESET = ESysENETRESET; WSAECONNABORTED = ESysECONNABORTED; WSAECONNRESET = ESysECONNRESET; WSAENOBUFS = ESysENOBUFS; WSAEISCONN = ESysEISCONN; WSAENOTCONN = ESysENOTCONN; WSAESHUTDOWN = ESysESHUTDOWN; WSAETOOMANYREFS = ESysETOOMANYREFS; WSAETIMEDOUT = ESysETIMEDOUT; WSAECONNREFUSED = ESysECONNREFUSED; WSAELOOP = ESysELOOP; WSAENAMETOOLONG = ESysENAMETOOLONG; WSAEHOSTDOWN = ESysEHOSTDOWN; WSAEHOSTUNREACH = ESysEHOSTUNREACH; WSAENOTEMPTY = ESysENOTEMPTY; WSAEPROCLIM = -1; WSAEUSERS = ESysEUSERS; WSAEDQUOT = ESysEDQUOT; WSAESTALE = ESysESTALE; WSAEREMOTE = ESysEREMOTE; WSASYSNOTREADY = -2; WSAVERNOTSUPPORTED = -3; WSANOTINITIALISED = -4; WSAEDISCON = -5; WSAHOST_NOT_FOUND = 1; WSATRY_AGAIN = 2; WSANO_RECOVERY = 3; WSANO_DATA = -6; const WSADESCRIPTION_LEN = 256; WSASYS_STATUS_LEN = 128; type PWSAData = ^TWSAData; TWSAData = packed record wVersion: Word; wHighVersion: Word; szDescription: array[0..WSADESCRIPTION_LEN] of Char; szSystemStatus: array[0..WSASYS_STATUS_LEN] of Char; iMaxSockets: Word; iMaxUdpDg: Word; lpVendorInfo: PChar; end; function IN6_IS_ADDR_UNSPECIFIED(const a: PInAddr6): boolean; function IN6_IS_ADDR_LOOPBACK(const a: PInAddr6): boolean; function IN6_IS_ADDR_LINKLOCAL(const a: PInAddr6): boolean; function IN6_IS_ADDR_SITELOCAL(const a: PInAddr6): boolean; function IN6_IS_ADDR_MULTICAST(const a: PInAddr6): boolean; function IN6_ADDR_EQUAL(const a: PInAddr6; const b: PInAddr6):boolean; procedure SET_IN6_IF_ADDR_ANY (const a: PInAddr6); procedure SET_LOOPBACK_ADDR6 (const a: PInAddr6); var in6addr_any, in6addr_loopback : TInAddr6; procedure FD_CLR(Socket: TSocket; var FDSet: TFDSet); function FD_ISSET(Socket: TSocket; var FDSet: TFDSet): Boolean; procedure FD_SET(Socket: TSocket; var FDSet: TFDSet); procedure FD_ZERO(var FDSet: TFDSet); {=============================================================================} var SynSockCS: SyncObjs.TCriticalSection; SockEnhancedApi: Boolean; SockWship6Api: Boolean; type TVarSin = packed record {$ifdef SOCK_HAS_SINLEN} sin_len : cuchar; {$endif} case integer of 0: (AddressFamily: sa_family_t); 1: ( case sin_family: sa_family_t of AF_INET: (sin_port: word; sin_addr: TInAddr; sin_zero: array[0..7] of Char); AF_INET6: (sin6_port: word; sin6_flowinfo: longword; sin6_addr: TInAddr6; sin6_scope_id: longword); ); end; function SizeOfVarSin(sin: TVarSin): integer; function WSAStartup(wVersionRequired: Word; var WSData: TWSAData): Integer; function WSACleanup: Integer; function WSAGetLastError: Integer; function GetHostName: string; function Shutdown(s: TSocket; how: Integer): Integer; function SetSockOpt(s: TSocket; level, optname: Integer; optval: TMemory; optlen: Integer): Integer; function GetSockOpt(s: TSocket; level, optname: Integer; optval: TMemory; var optlen: Integer): Integer; function Send(s: TSocket; Buf: TMemory; len, flags: Integer): Integer; function Recv(s: TSocket; Buf: TMemory; len, flags: Integer): Integer; function SendTo(s: TSocket; Buf: TMemory; len, flags: Integer; addrto: TVarSin): Integer; function RecvFrom(s: TSocket; Buf: TMemory; len, flags: Integer; var from: TVarSin): Integer; function ntohs(netshort: word): word; function ntohl(netlong: longword): longword; function Listen(s: TSocket; backlog: Integer): Integer; function IoctlSocket(s: TSocket; cmd: DWORD; var arg: integer): Integer; function htons(hostshort: word): word; function htonl(hostlong: longword): longword; function GetSockName(s: TSocket; var name: TVarSin): Integer; function GetPeerName(s: TSocket; var name: TVarSin): Integer; function Connect(s: TSocket; const name: TVarSin): Integer; function CloseSocket(s: TSocket): Integer; function Bind(s: TSocket; const addr: TVarSin): Integer; function Accept(s: TSocket; var addr: TVarSin): TSocket; function Socket(af, Struc, Protocol: Integer): TSocket; function Select(nfds: Integer; readfds, writefds, exceptfds: PFDSet; timeout: PTimeVal): Longint; function IsNewApi(Family: integer): Boolean; function SetVarSin(var Sin: TVarSin; IP, Port: string; Family, SockProtocol, SockType: integer; PreferIP4: Boolean): integer; function GetSinIP(Sin: TVarSin): string; function GetSinPort(Sin: TVarSin): Integer; procedure ResolveNameToIP(Name: string; Family, SockProtocol, SockType: integer; const IPList: TStrings); function ResolveIPToName(IP: string; Family, SockProtocol, SockType: integer): string; function ResolvePort(Port: string; Family, SockProtocol, SockType: integer): Word; {==============================================================================} implementation function IN6_IS_ADDR_UNSPECIFIED(const a: PInAddr6): boolean; begin Result := ((a^.u6_addr32[0] = 0) and (a^.u6_addr32[1] = 0) and (a^.u6_addr32[2] = 0) and (a^.u6_addr32[3] = 0)); end; function IN6_IS_ADDR_LOOPBACK(const a: PInAddr6): boolean; begin Result := ((a^.u6_addr32[0] = 0) and (a^.u6_addr32[1] = 0) and (a^.u6_addr32[2] = 0) and (a^.u6_addr8[12] = 0) and (a^.u6_addr8[13] = 0) and (a^.u6_addr8[14] = 0) and (a^.u6_addr8[15] = 1)); end; function IN6_IS_ADDR_LINKLOCAL(const a: PInAddr6): boolean; begin Result := ((a^.u6_addr8[0] = $FE) and (a^.u6_addr8[1] = $80)); end; function IN6_IS_ADDR_SITELOCAL(const a: PInAddr6): boolean; begin Result := ((a^.u6_addr8[0] = $FE) and (a^.u6_addr8[1] = $C0)); end; function IN6_IS_ADDR_MULTICAST(const a: PInAddr6): boolean; begin Result := (a^.u6_addr8[0] = $FF); end; function IN6_ADDR_EQUAL(const a: PInAddr6; const b: PInAddr6): boolean; begin Result := (CompareMem( a, b, sizeof(TInAddr6))); end; procedure SET_IN6_IF_ADDR_ANY (const a: PInAddr6); begin FillChar(a^, sizeof(TInAddr6), 0); end; procedure SET_LOOPBACK_ADDR6 (const a: PInAddr6); begin FillChar(a^, sizeof(TInAddr6), 0); a^.u6_addr8[15] := 1; end; {=============================================================================} function WSAStartup(wVersionRequired: Word; var WSData: TWSAData): Integer; begin with WSData do begin wVersion := wVersionRequired; wHighVersion := $202; szDescription := 'Synsock - Synapse Platform Independent Socket Layer'; szSystemStatus := 'Running on Unix/Linux by FreePascal'; iMaxSockets := 32768; iMaxUdpDg := 8192; end; Result := 0; end; function WSACleanup: Integer; begin Result := 0; end; function WSAGetLastError: Integer; begin Result := fpGetErrno; end; function FD_ISSET(Socket: TSocket; var fdset: TFDSet): Boolean; begin Result := fpFD_ISSET(socket, fdset) <> 0; end; procedure FD_SET(Socket: TSocket; var fdset: TFDSet); begin fpFD_SET(Socket, fdset); end; procedure FD_CLR(Socket: TSocket; var fdset: TFDSet); begin fpFD_CLR(Socket, fdset); end; procedure FD_ZERO(var fdset: TFDSet); begin fpFD_ZERO(fdset); end; {=============================================================================} function SizeOfVarSin(sin: TVarSin): integer; begin case sin.sin_family of AF_INET: Result := SizeOf(TSockAddrIn); AF_INET6: Result := SizeOf(TSockAddrIn6); else Result := 0; end; end; {=============================================================================} function Bind(s: TSocket; const addr: TVarSin): Integer; begin if fpBind(s, @addr, SizeOfVarSin(addr)) = 0 then Result := 0 else Result := SOCKET_ERROR; end; function Connect(s: TSocket; const name: TVarSin): Integer; begin if fpConnect(s, @name, SizeOfVarSin(name)) = 0 then Result := 0 else Result := SOCKET_ERROR; end; function GetSockName(s: TSocket; var name: TVarSin): Integer; var len: integer; begin len := SizeOf(name); FillChar(name, len, 0); Result := fpGetSockName(s, @name, @Len); end; function GetPeerName(s: TSocket; var name: TVarSin): Integer; var len: integer; begin len := SizeOf(name); FillChar(name, len, 0); Result := fpGetPeerName(s, @name, @Len); end; function GetHostName: string; begin Result := unix.GetHostName; end; function Send(s: TSocket; Buf: TMemory; len, flags: Integer): Integer; begin Result := fpSend(s, pointer(Buf), len, flags); end; function Recv(s: TSocket; Buf: TMemory; len, flags: Integer): Integer; begin Result := fpRecv(s, pointer(Buf), len, flags); end; function SendTo(s: TSocket; Buf: TMemory; len, flags: Integer; addrto: TVarSin): Integer; begin Result := fpSendTo(s, pointer(Buf), len, flags, @addrto, SizeOfVarSin(addrto)); end; function RecvFrom(s: TSocket; Buf: TMemory; len, flags: Integer; var from: TVarSin): Integer; var x: integer; begin x := SizeOf(from); Result := fpRecvFrom(s, pointer(Buf), len, flags, @from, @x); end; function Accept(s: TSocket; var addr: TVarSin): TSocket; var x: integer; begin x := SizeOf(addr); Result := fpAccept(s, @addr, @x); end; function Shutdown(s: TSocket; how: Integer): Integer; begin Result := fpShutdown(s, how); end; function SetSockOpt(s: TSocket; level, optname: Integer; optval: Tmemory; optlen: Integer): Integer; begin Result := fpsetsockopt(s, level, optname, pointer(optval), optlen); end; function GetSockOpt(s: TSocket; level, optname: Integer; optval: Tmemory; var optlen: Integer): Integer; begin Result := fpgetsockopt(s, level, optname, pointer(optval), @optlen); end; function ntohs(netshort: word): word; begin Result := sockets.ntohs(NetShort); end; function ntohl(netlong: longword): longword; begin Result := sockets.ntohl(NetLong); end; function Listen(s: TSocket; backlog: Integer): Integer; begin if fpListen(s, backlog) = 0 then Result := 0 else Result := SOCKET_ERROR; end; function IoctlSocket(s: TSocket; cmd: DWORD; var arg: integer): Integer; begin Result := fpIoctl(s, cmd, @arg); end; function htons(hostshort: word): word; begin Result := sockets.htons(Hostshort); end; function htonl(hostlong: longword): longword; begin Result := sockets.htonl(HostLong); end; function CloseSocket(s: TSocket): Integer; begin Result := sockets.CloseSocket(s); end; function Socket(af, Struc, Protocol: Integer): TSocket; begin Result := fpSocket(af, struc, protocol); end; function Select(nfds: Integer; readfds, writefds, exceptfds: PFDSet; timeout: PTimeVal): Longint; begin Result := fpSelect(nfds, readfds, writefds, exceptfds, timeout); end; {=============================================================================} function IsNewApi(Family: integer): Boolean; begin Result := SockEnhancedApi; if not Result then Result := (Family = AF_INET6) and SockWship6Api; end; function SetVarSin(var Sin: TVarSin; IP, Port: string; Family, SockProtocol, SockType: integer; PreferIP4: Boolean): integer; var TwoPass: boolean; f1, f2: integer; function GetAddr(f:integer): integer; var a4: array [1..1] of in_addr; a6: array [1..1] of Tin6_addr; he: THostEntry; begin Result := WSAEPROTONOSUPPORT; case f of AF_INET: begin if IP = cAnyHost then begin Sin.sin_family := AF_INET; Result := 0; end else begin if lowercase(IP) = cLocalHostStr then a4[1].s_addr := htonl(INADDR_LOOPBACK) else begin a4[1].s_addr := 0; Result := WSAHOST_NOT_FOUND; a4[1] := StrTonetAddr(IP); if a4[1].s_addr = INADDR_ANY then if GetHostByName(ip, he) then a4[1]:=HostToNet(he.Addr) else Resolvename(ip, a4); end; if a4[1].s_addr <> INADDR_ANY then begin Sin.sin_family := AF_INET; sin.sin_addr := a4[1]; Result := 0; end; end; end; AF_INET6: begin if IP = c6AnyHost then begin Sin.sin_family := AF_INET6; Result := 0; end else begin if lowercase(IP) = cLocalHostStr then SET_LOOPBACK_ADDR6(@a6[1]) else begin Result := WSAHOST_NOT_FOUND; SET_IN6_IF_ADDR_ANY(@a6[1]); a6[1] := StrTonetAddr6(IP); if IN6_IS_ADDR_UNSPECIFIED(@a6[1]) then Resolvename6(ip, a6); end; if not IN6_IS_ADDR_UNSPECIFIED(@a6[1]) then begin Sin.sin_family := AF_INET6; sin.sin6_addr := a6[1]; Result := 0; end; end; end; end; end; begin Result := 0; FillChar(Sin, Sizeof(Sin), 0); Sin.sin_port := Resolveport(port, family, SockProtocol, SockType); TwoPass := False; if Family = AF_UNSPEC then begin if PreferIP4 then begin f1 := AF_INET; f2 := AF_INET6; TwoPass := True; end else begin f2 := AF_INET; f1 := AF_INET6; TwoPass := True; end; end else f1 := Family; Result := GetAddr(f1); if Result <> 0 then if TwoPass then Result := GetAddr(f2); end; function GetSinIP(Sin: TVarSin): string; begin Result := ''; case sin.AddressFamily of AF_INET: begin result := NetAddrToStr(sin.sin_addr); end; AF_INET6: begin result := NetAddrToStr6(sin.sin6_addr); end; end; end; function GetSinPort(Sin: TVarSin): Integer; begin if (Sin.sin_family = AF_INET6) then Result := synsock.ntohs(Sin.sin6_port) else Result := synsock.ntohs(Sin.sin_port); end; procedure ResolveNameToIP(Name: string; Family, SockProtocol, SockType: integer; const IPList: TStrings); var x, n: integer; a4: array [1..255] of in_addr; a6: array [1..255] of Tin6_addr; he: THostEntry; begin IPList.Clear; if (family = AF_INET) or (family = AF_UNSPEC) then begin if lowercase(name) = cLocalHostStr then IpList.Add(cLocalHost) else begin a4[1] := StrTonetAddr(name); if a4[1].s_addr = INADDR_ANY then if GetHostByName(name, he) then begin a4[1]:=HostToNet(he.Addr); x := 1; end else x := Resolvename(name, a4) else x := 1; for n := 1 to x do IpList.Add(netaddrToStr(a4[n])); end; end; if (family = AF_INET6) or (family = AF_UNSPEC) then begin if lowercase(name) = cLocalHostStr then IpList.Add(c6LocalHost) else begin a6[1] := StrTonetAddr6(name); if IN6_IS_ADDR_UNSPECIFIED(@a6[1]) then x := Resolvename6(name, a6) else x := 1; for n := 1 to x do IpList.Add(netaddrToStr6(a6[n])); end; end; if IPList.Count = 0 then IPList.Add(cLocalHost); end; function ResolvePort(Port: string; Family, SockProtocol, SockType: integer): Word; var ProtoEnt: TProtocolEntry; ServEnt: TServiceEntry; begin Result := synsock.htons(StrToIntDef(Port, 0)); if Result = 0 then begin ProtoEnt.Name := ''; GetProtocolByNumber(SockProtocol, ProtoEnt); ServEnt.port := 0; GetServiceByName(Port, ProtoEnt.Name, ServEnt); Result := ServEnt.port; end; end; function ResolveIPToName(IP: string; Family, SockProtocol, SockType: integer): string; var n: integer; a4: array [1..1] of in_addr; a6: array [1..1] of Tin6_addr; a: array [1..1] of string; begin Result := IP; a4[1] := StrToNetAddr(IP); if a4[1].s_addr <> INADDR_ANY then begin //why ResolveAddress need address in HOST order? :-O n := ResolveAddress(nettohost(a4[1]), a); if n > 0 then Result := a[1]; end else begin a6[1] := StrToNetAddr6(IP); n := ResolveAddress6(a6[1], a); if n > 0 then Result := a[1]; end; end; {=============================================================================} function InitSocketInterface(stack: string): Boolean; begin SockEnhancedApi := False; SockWship6Api := False; // Libc.Signal(Libc.SIGPIPE, TSignalHandler(Libc.SIG_IGN)); Result := True; end; function DestroySocketInterface: Boolean; begin Result := True; end; initialization begin SynSockCS := SyncObjs.TCriticalSection.Create; SET_IN6_IF_ADDR_ANY (@in6addr_any); SET_LOOPBACK_ADDR6 (@in6addr_loopback); end; finalization begin SynSockCS.Free; end; {$ENDIF} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/lib/����������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016337� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/src/����������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016360� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/src/FtpConfDlg.pas��������������������������������������������������0000644�0001750�0001750�00000016750�12014201074�021046� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ Double commander ------------------------------------------------------------------------- WFX plugin for working with File Transfer Protocol Copyright (C) 2009-2012 Koblov Alexander (Alexx2000@mail.ru) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit FtpConfDlg; {$mode objfpc}{$H+} {$include calling.inc} {$R FtpConfDlg.lfm} interface uses SysUtils, Extension; function ShowFtpConfDlg: Boolean; implementation uses FtpFunc, FtpUtils, blcksock, ssl_openssl_lib; function DlgProc (pDlg: PtrUInt; DlgItemName: PAnsiChar; Msg, wParam, lParam: PtrInt): PtrInt; dcpcall; var Data: PtrInt; Text: UTF8String; begin with gStartupInfo do begin case Msg of DN_INITDIALOG: begin Text:= gConnection.ConnectionName; Data:= PtrInt(PAnsiChar(Text)); SendDlgMsg(pDlg, 'edtName', DM_SETTEXT, Data, 0); Text:= gConnection.Host; if gConnection.Port <> EmptyStr then Text:= Text + ':' + gConnection.Port; Data:= PtrInt(PAnsiChar(Text)); SendDlgMsg(pDlg, 'edtHost', DM_SETTEXT, Data, 0); Text:= gConnection.UserName; Data:= PtrInt(PAnsiChar(Text)); SendDlgMsg(pDlg, 'edtUserName', DM_SETTEXT, Data, 0); if gConnection.MasterPassword then begin SendDlgMsg(pDlg, 'chkMasterPassword', DM_SETCHECK, 1, 0); SendDlgMsg(pDlg, 'chkMasterPassword', DM_ENABLE, 0, 0); //SendDlgMsg(pDlg, 'edtPassword', DM_SHOWITEM, 0, 0); SendDlgMsg(pDlg, 'btnChangePassword', DM_SHOWITEM, 1, 0); end else begin Text:= gConnection.Password; Data:= PtrInt(PAnsiChar(Text)); SendDlgMsg(pDlg, 'edtPassword', DM_SETTEXT, Data, 0); end; Text:= gConnection.Path; Data:= PtrInt(PAnsiChar(Text)); SendDlgMsg(pDlg, 'edtRemoteDir', DM_SETTEXT, Data, 0); Text:= gConnection.InitCommands; Data:= PtrInt(PAnsiChar(Text)); SendDlgMsg(pDlg, 'edtInitCommands', DM_SETTEXT, Data, 0); Data:= PtrInt(gConnection.PassiveMode); SendDlgMsg(pDlg, 'chkPassiveMode', DM_SETCHECK, Data, 0); Data:= PtrInt(gConnection.AutoTLS); SendDlgMsg(pDlg, 'chkAutoTLS', DM_SETCHECK, Data, 0); end; DN_CHANGE: begin if DlgItemName = 'chkMasterPassword' then begin Data:= SendDlgMsg(pDlg, 'chkMasterPassword', DM_GETCHECK, 0, 0); gConnection.MasterPassword:= Boolean(Data); if not gConnection.MasterPassword then DeletePassword(gConnection.ConnectionName); end; if DlgItemName = 'chkAutoTLS' then begin Data:= SendDlgMsg(pDlg, 'chkAutoTLS', DM_GETCHECK, 0, 0); gConnection.AutoTLS:= Boolean(Data); if gConnection.AutoTLS then begin if not InitSSLInterface then begin MessageBox(PAnsiChar('OpenSSL library not found!' + LineEnding + 'To use SSL connections, please install the OpenSSL ' + 'libraries (' + DLLSSLName + ' and ' + DLLUtilName + ')!'), 'OpenSSL', MB_OK or MB_ICONERROR ); gConnection.AutoTLS:= False; Data:= PtrInt(gConnection.AutoTLS); SendDlgMsg(pDlg, 'chkAutoTLS', DM_SETCHECK, Data, 0); end; end; end; end; DN_CLICK: if DlgItemName = 'btnAnonymous' then begin Text:= 'anonymous'; Data:= PtrInt(PAnsiChar(Text)); SendDlgMsg(pDlg, 'edtUserName', DM_SETTEXT, Data, 0); end else if DlgItemName = 'btnChangePassword' then begin Text:= ReadPassword(gConnection.ConnectionName); if Text <> EmptyStr then begin Data:= PtrInt(PAnsiChar(Text)); SendDlgMsg(pDlg, 'edtPassword', DM_SETTEXT, Data, 0); SendDlgMsg(pDlg, 'edtPassword', DM_SHOWITEM, 1, 0); SendDlgMsg(pDlg, 'btnChangePassword', DM_SHOWITEM, 0, 0); SendDlgMsg(pDlg, 'chkMasterPassword', DM_ENABLE, 1, 0); gConnection.PasswordChanged:= True; end; end else if DlgItemName = 'btnOK' then begin Data:= SendDlgMsg(pDlg, 'edtName', DM_GETTEXT, 0, 0); Text:= PAnsiChar(Data); gConnection.ConnectionName:= StringReplace(Text, PathDelim, '_', [rfReplaceAll]); Data:= SendDlgMsg(pDlg, 'edtHost', DM_GETTEXT, 0, 0); Text:= PAnsiChar(Data); gConnection.Host:= ExtractConnectionHost(Text); gConnection.Port:= ExtractConnectionPort(Text); Data:= SendDlgMsg(pDlg, 'edtUserName', DM_GETTEXT, 0, 0); Text:= PAnsiChar(Data); gConnection.UserName:= Text; Data:= SendDlgMsg(pDlg, 'edtPassword', DM_GETTEXT, 0, 0); Text:= PAnsiChar(Data); gConnection.Password:= Text; Data:= SendDlgMsg(pDlg, 'chkMasterPassword', DM_GETCHECK, 0, 0); gConnection.MasterPassword:= Boolean(Data); Data:= SendDlgMsg(pDlg, 'edtRemoteDir', DM_GETTEXT, 0, 0); Text:= PAnsiChar(Data); gConnection.Path:= Text; Data:= SendDlgMsg(pDlg, 'edtInitCommands', DM_GETTEXT, 0, 0); Text:= PAnsiChar(Data); gConnection.InitCommands:= Text; Data:= SendDlgMsg(pDlg, 'chkPassiveMode', DM_GETCHECK, 0, 0); gConnection.PassiveMode:= Boolean(Data); Data:= SendDlgMsg(pDlg, 'chkAutoTLS', DM_GETCHECK, 0, 0); gConnection.AutoTLS:= Boolean(Data); // close dialog SendDlgMsg(pDlg, DlgItemName, DM_CLOSE, 1, 0); end else if DlgItemName = 'btnCancel' then begin // close dialog SendDlgMsg(pDlg, DlgItemName, DM_CLOSE, 2, 0); end; end;// case end; // with end; function ShowFtpConfDlg: Boolean; var ResHandle: TFPResourceHandle = 0; ResGlobal: TFPResourceHGLOBAL = 0; ResData: Pointer = nil; ResSize: LongWord; begin Result := False; try ResHandle := FindResource(HINSTANCE, PChar('TDIALOGBOX'), MAKEINTRESOURCE(10) {RT_RCDATA}); if ResHandle <> 0 then begin ResGlobal := LoadResource(HINSTANCE, ResHandle); if ResGlobal <> 0 then begin ResData := LockResource(ResGlobal); ResSize := SizeofResource(HINSTANCE, ResHandle); with gStartupInfo do begin Result := DialogBoxLRS(ResData, ResSize, @DlgProc); end; end; end; finally if ResGlobal <> 0 then begin UnlockResource(ResGlobal); FreeResource(ResGlobal); end; end; end; end. ������������������������doublecmd-0.5.8/plugins/wfx/ftp/src/FtpConfDlg.lfm��������������������������������������������������0000644�0001750�0001750�00000016174�11772014110�021044� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������object DialogBox: TDialogBox Left = 431 Height = 345 Top = 141 Width = 420 AutoSize = True BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'FTP' ChildSizing.LeftRightSpacing = 10 ChildSizing.TopBottomSpacing = 10 ClientHeight = 345 ClientWidth = 420 OnShow = DialogBoxShow Position = poScreenCenter LCLVersion = '0.9.30.4' object lblName: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = edtName AnchorSideTop.Side = asrCenter Left = 12 Height = 14 Top = 15 Width = 88 BorderSpacing.Left = 12 Caption = 'Connection name:' ParentColor = False end object edtName: TEdit AnchorSideLeft.Control = lblName AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = Owner AnchorSideRight.Side = asrBottom Left = 118 Height = 21 Top = 12 Width = 260 BorderSpacing.Left = 18 BorderSpacing.Top = 12 BorderSpacing.Right = 12 TabOrder = 0 end object lblHost: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = edtHost AnchorSideTop.Side = asrCenter Left = 12 Height = 14 Top = 42 Width = 59 BorderSpacing.Left = 12 Caption = 'Host[:Port]:' ParentColor = False end object edtHost: TEdit AnchorSideLeft.Control = edtName AnchorSideTop.Control = edtName AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtName AnchorSideRight.Side = asrBottom Left = 118 Height = 21 Top = 39 Width = 260 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 TabOrder = 1 end object lblUserName: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = edtUserName AnchorSideTop.Side = asrCenter Left = 12 Height = 14 Top = 100 Width = 56 BorderSpacing.Left = 12 Caption = 'User name:' ParentColor = False end object edtUserName: TEdit AnchorSideLeft.Control = btnAnonymous AnchorSideTop.Control = btnAnonymous AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnAnonymous AnchorSideRight.Side = asrBottom Left = 118 Height = 21 Top = 97 Width = 260 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 TabOrder = 4 end object btnAnonymous: TButton AnchorSideLeft.Control = edtHost AnchorSideTop.Control = edtHost AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtHost AnchorSideRight.Side = asrBottom Left = 118 Height = 25 Top = 66 Width = 260 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = 'Anonymous' OnClick = ButtonClick TabOrder = 3 end object edtRemoteDir: TEdit AnchorSideLeft.Control = edtPassword AnchorSideTop.Control = chkMasterPassword AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtPassword AnchorSideRight.Side = asrBottom Left = 118 Height = 21 Top = 176 Width = 260 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 TabOrder = 8 end object lblRemoteDir: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = edtRemoteDir AnchorSideTop.Side = asrCenter Left = 12 Height = 14 Top = 179 Width = 57 BorderSpacing.Left = 12 Caption = 'Remote dir:' ParentColor = False end object chkPassiveMode: TCheckBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = edtInitCommands AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 242 Width = 275 BorderSpacing.Left = 12 BorderSpacing.Top = 18 Caption = 'Use passive mode for transfers (like a WWW brower)' TabOrder = 10 end object btnCancel: TButton AnchorSideTop.Control = chkPassiveMode AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtRemoteDir AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 303 Height = 25 Top = 271 Width = 75 Anchors = [akTop, akRight] BorderSpacing.Top = 12 Caption = 'Cancel' ModalResult = 2 OnClick = ButtonClick TabOrder = 12 end object btnOK: TButton AnchorSideTop.Control = btnCancel AnchorSideRight.Control = btnCancel AnchorSideBottom.Side = asrBottom Left = 216 Height = 25 Top = 271 Width = 75 Anchors = [akTop, akRight] BorderSpacing.Right = 12 Caption = '&OK' ModalResult = 1 OnClick = ButtonClick TabOrder = 11 end object edtPassword: TEdit AnchorSideLeft.Control = edtUserName AnchorSideTop.Control = edtUserName AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtUserName AnchorSideRight.Side = asrBottom Left = 118 Height = 21 Top = 124 Width = 260 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 EchoMode = emPassword PasswordChar = '*' TabOrder = 5 end object lblPassword: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = edtPassword AnchorSideTop.Side = asrCenter Left = 12 Height = 14 Top = 127 Width = 51 BorderSpacing.Left = 12 Caption = 'Password:' ParentColor = False end object chkMasterPassword: TCheckBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = lblPassword AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 153 Width = 242 BorderSpacing.Left = 12 BorderSpacing.Top = 12 Caption = 'Use master password to protect the password' OnChange = CheckBoxChange TabOrder = 7 end object btnChangePassword: TButton AnchorSideLeft.Control = edtUserName AnchorSideTop.Control = edtUserName AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtUserName AnchorSideRight.Side = asrBottom Left = 118 Height = 25 Top = 124 Width = 260 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = 'Change password...' OnClick = ButtonClick TabOrder = 6 Visible = False end object edtInitCommands: TEdit AnchorSideLeft.Control = edtRemoteDir AnchorSideTop.Control = edtRemoteDir AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtRemoteDir AnchorSideRight.Side = asrBottom Left = 118 Height = 21 Top = 203 Width = 260 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 TabOrder = 9 end object lblInitCommands: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = edtInitCommands AnchorSideTop.Side = asrCenter Left = 12 Height = 14 Top = 206 Width = 74 BorderSpacing.Left = 12 Caption = 'Init commands:' ParentColor = False end object chkAutoTLS: TCheckBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = btnAnonymous AnchorSideTop.Side = asrCenter Left = 12 Height = 17 Top = 70 Width = 58 BorderSpacing.Left = 12 Caption = 'SSL/TLS' OnChange = CheckBoxChange TabOrder = 2 end end ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/src/ftp.dpr���������������������������������������������������������0000644�0001750�0001750�00000001010�12014201074�017632� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library ftp; {$IFDEF FPC} {$mode delphi}{$H+} {$ENDIF} uses Classes, FtpFunc, FtpUtils, FtpConfDlg; exports FsInit, FsFindFirst, FsFindNext, FsFindClose, FsExecuteFile, FsRenMovFile, FsGetFile, FsPutFile, FsDeleteFile, FsMkDir, FsRemoveDir, FsDisconnect, FsSetCryptCallback, FsGetDefRootName, FsSetDefaultParams, { FsNetworkGetSupportedProtocols, FsNetworkGetConnection, FsNetworkManageConnection, FsNetworkOpenConnection, } ExtensionInitialize; {$R *.res} begin end. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/src/ftpfunc.pas�����������������������������������������������������0000644�0001750�0001750�00000070163�12014201074�020523� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ Double commander ------------------------------------------------------------------------- Wfx plugin for working with File Transfer Protocol Copyright (C) 2009-2012 Koblov Alexander (Alexx2000@mail.ru) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit FtpFunc; {$mode delphi}{$H+} {$include calling.inc} interface uses SysUtils, Classes, WfxPlugin, FtpSend, Extension; type { TFTPListRecEx } TFTPListRecEx = class(TFTPListRec) public procedure Assign(Value: TFTPListRec); override; end; { TFTPListEx } TFTPListEx = class(TFTPList) public procedure Assign(Value: TFTPList); override; end; { TFTPSendEx } TFTPSendEx = class(TFTPSend) public procedure FTPStatus(Sender: TObject; Response: Boolean; const Value: String); end; TConnection = class public ConnectionName, Path, Host: AnsiString; Port: AnsiString; UserName: AnsiString; Password: AnsiString; MasterPassword: Boolean; PassiveMode: Boolean; AutoTLS: Boolean; InitCommands: AnsiString; PasswordChanged: Boolean; end; function FsInit(PluginNr: Integer; pProgressProc: TProgressProc; pLogProc: TLogProc; pRequestProc: TRequestProc): Integer; dcpcall; function FsFindFirst(Path: PAnsiChar; var FindData: TWin32FindData): THandle; dcpcall; function FsFindNext(Hdl: THandle; var FindData: TWin32FindData): BOOL; dcpcall; function FsFindClose(Hdl: THandle): Integer; dcpcall; function FsExecuteFile(MainWin: THandle; RemoteName, Verb: PAnsiChar): Integer; dcpcall; function FsRenMovFile(OldName, NewName: PAnsiChar; Move, OverWrite: BOOL; RemoteInfo: pRemoteInfo): Integer; dcpcall; function FsGetFile(RemoteName, LocalName: PAnsiChar; CopyFlags: Integer; RemoteInfo: pRemoteInfo): Integer; dcpcall; function FsPutFile(LocalName, RemoteName: PAnsiChar; CopyFlags: Integer) : Integer; dcpcall; function FsDeleteFile(RemoteName: PAnsiChar): BOOL; dcpcall; function FsMkDir(RemoteDir: PAnsiChar): BOOL; dcpcall; function FsRemoveDir(RemoteName: PAnsiChar): BOOL; dcpcall; function FsDisconnect(DisconnectRoot: PAnsiChar): BOOL; dcpcall; procedure FsSetCryptCallback(pCryptProc: TCryptProc; CryptoNr, Flags: Integer); dcpcall; procedure FsGetDefRootName(DefRootName: PAnsiChar; MaxLen: Integer); dcpcall; procedure FsSetDefaultParams(dps: pFsDefaultParamStruct); dcpcall; { Network API } { procedure FsNetworkGetSupportedProtocols(Protocols: PAnsiChar; MaxLen: LongInt); dcpcall; function FsNetworkGetConnection(Index: LongInt; Connection: PAnsiChar; MaxLen: LongInt): LongBool; dcpcall; function FsNetworkManageConnection(MainWin: HWND; Connection: PAnsiChar; Action: LongInt; MaxLen: LongInt): LongBool; dcpcall; function FsNetworkOpenConnection(Connection: PAnsiChar; RootDir, RemotePath: PAnsiChar; MaxLen: LongInt): LongBool; dcpcall; } { Extension API } procedure ExtensionInitialize(StartupInfo: PExtensionStartupInfo); dcpcall; function ReadPassword(ConnectionName: UTF8String): AnsiString; function DeletePassword(ConnectionName: UTF8String): Boolean; var gStartupInfo: TExtensionStartupInfo; gConnection: TConnection; implementation uses IniFiles, StrUtils, FtpUtils, FtpConfDlg, syncobjs, ssl_openssl; var ActiveConnectionList, ConnectionList: TStringList; IniFile: TIniFile; ProgressProc: TProgressProc; LogProc: TLogProc; RequestProc: TRequestProc; PluginNumber: Integer; CryptProc: TCryptProc; CryptoNumber: Integer; HasDialogAPI: Boolean = False; ListLock: TCriticalSection; const cAddConnection = '<Add connection>'; cQuickConnection = '<Quick connection>'; RootList: array [0 .. 1] of AnsiString = (cAddConnection, cQuickConnection); type TListRec = record Path: AnsiString; Index: Integer; FtpList: TFTPListEx; end; PListRec = ^TListRec; procedure ReadConnectionList; var I, Count: Integer; sIndex: AnsiString; Connection: TConnection; begin Count := IniFile.ReadInteger('FTP', 'ConnectionCount', 0); for I := 1 to Count do begin sIndex := IntToStr(I); Connection := TConnection.Create; Connection.ConnectionName := IniFile.ReadString('FTP', 'Connection' + sIndex + 'Name', EmptyStr); Connection.Path := IniFile.ReadString('FTP', 'Connection' + sIndex + 'Path', EmptyStr); Connection.Host := IniFile.ReadString('FTP', 'Connection' + sIndex + 'Host', EmptyStr); Connection.Port := IniFile.ReadString('FTP', 'Connection' + sIndex + 'Port', EmptyStr); Connection.UserName := IniFile.ReadString('FTP', 'Connection' + sIndex + 'UserName', EmptyStr); Connection.MasterPassword := IniFile.ReadBool('FTP', 'Connection' + sIndex + 'MasterPassword', False); if Connection.MasterPassword then Connection.Password := EmptyStr else Connection.Password := DecodeBase64(IniFile.ReadString('FTP', 'Connection' + sIndex + 'Password', EmptyStr)); Connection.PassiveMode:= IniFile.ReadBool('FTP', 'Connection' + sIndex + 'PassiveMode', True); Connection.AutoTLS:= IniFile.ReadBool('FTP', 'Connection' + sIndex + 'AutoTLS', False); Connection.InitCommands := IniFile.ReadString('FTP', 'Connection' + sIndex + 'InitCommands', EmptyStr); // add connection to connection list ConnectionList.AddObject(Connection.ConnectionName, Connection); end; end; procedure WriteConnectionList; var I, Count: Integer; sIndex: AnsiString; Connection: TConnection; begin IniFile.EraseSection('FTP'); Count := ConnectionList.Count; IniFile.WriteInteger('FTP', 'ConnectionCount', Count); for I := 0 to Count - 1 do begin sIndex := IntToStr(I + 1); Connection := TConnection(ConnectionList.Objects[I]); IniFile.WriteString('FTP', 'Connection' + sIndex + 'Name', Connection.ConnectionName); IniFile.WriteString('FTP', 'Connection' + sIndex + 'Path', Connection.Path); IniFile.WriteString('FTP', 'Connection' + sIndex + 'Host', Connection.Host); IniFile.WriteString('FTP', 'Connection' + sIndex + 'Port', Connection.Port); IniFile.WriteString('FTP', 'Connection' + sIndex + 'UserName', Connection.UserName); IniFile.WriteBool('FTP', 'Connection' + sIndex + 'MasterPassword', Connection.MasterPassword); if Connection.MasterPassword then IniFile.DeleteKey('FTP', 'Connection' + sIndex + 'Password') else IniFile.WriteString('FTP', 'Connection' + sIndex + 'Password', EncodeBase64(Connection.Password)); IniFile.WriteBool('FTP', 'Connection' + sIndex + 'PassiveMode', Connection.PassiveMode); IniFile.WriteBool('FTP', 'Connection' + sIndex + 'AutoTLS', Connection.AutoTLS); IniFile.WriteString('FTP', 'Connection' + sIndex + 'InitCommands', Connection.InitCommands); end; end; procedure FreeConnectionList; var I, Count: Integer; Connection: TConnection; begin Count := ConnectionList.Count; for I := Count - 1 downto 0 do begin Connection := TConnection(ConnectionList.Objects[I]); Connection.Free; ConnectionList.Delete(I); end; end; function CryptFunc(Mode: LongInt; ConnectionName: AnsiString; var Password: AnsiString): LongInt; begin if (Mode = FS_CRYPT_LOAD_PASSWORD) or (Mode = FS_CRYPT_LOAD_PASSWORD_NO_UI) then SetLength(Password, MAX_PATH); Result:= CryptProc(PluginNumber, CryptoNumber, Mode, PAnsiChar(ConnectionName), PAnsiChar(Password), MAX_PATH); end; function ShowPasswordDialog(out Password: AnsiString): Boolean; begin SetLength(Password, MAX_PATH); Password[1] := #0; Result := RequestProc(PluginNumber, RT_Password, nil, nil, PAnsiChar(Password), MAX_PATH); if Result then Password:= PAnsiChar(Password) // truncate to #0 else Password := ''; end; function FtpConnect(const ConnectionName: AnsiString; out FtpSend: TFTPSendEx): Boolean; var I: Integer; Connection: TConnection; sTemp: AnsiString; begin Result:= False; I:= ActiveConnectionList.IndexOf(ConnectionName); // If find active connection then use it if I >= 0 then begin FtpSend:= TFTPSendEx(ActiveConnectionList.Objects[I]); Result:= True; end else begin // find in exists connection list I:= ConnectionList.IndexOf(ConnectionName); if I >= 0 then begin Connection := TConnection(ConnectionList.Objects[I]); FtpSend := TFTPSendEx.Create; FtpSend.OnStatus:= FtpSend.FTPStatus; FtpSend.TargetHost := Connection.Host; FtpSend.PassiveMode:= Connection.PassiveMode; FtpSend.AutoTLS:= Connection.AutoTLS; if Connection.Port <> EmptyStr then FtpSend.TargetPort := Connection.Port; if Connection.UserName <> EmptyStr then FtpSend.UserName := Connection.UserName; if Connection.MasterPassword then begin if CryptFunc(FS_CRYPT_LOAD_PASSWORD, Connection.ConnectionName, Connection.Password) <> FS_FILE_OK then Connection.Password:= EmptyStr; end; if Connection.Password = EmptyStr then // if no saved password then ask it begin if not ShowPasswordDialog(Connection.Password) then begin FreeAndNil(FtpSend); Exit; end; end; FtpSend.Password := Connection.Password; // try to connect if FtpSend.Login then begin LogProc(PluginNumber, MSGTYPE_CONNECT, PAnsiChar('CONNECT ' + ConnectionName)); sTemp:= Connection.InitCommands; while sTemp <> EmptyStr do FtpSend.FTPCommand(Copy2SymbDel(sTemp, ';')); if Length(Connection.Path) > 0 then FtpSend.ChangeWorkingDir(Connection.Path); ActiveConnectionList.AddObject(ConnectionName, FtpSend); Result:= True; end else begin RequestProc(PluginNumber, RT_MsgOK, nil, 'Can not connect to the server!', nil, MAX_PATH); FreeAndNil(FtpSend); Exit; end; end; end; end; function AddQuickConnection(const Connection: TConnection): Boolean; var Temp: AnsiString; begin Result:= False; SetLength(Temp, MAX_PATH); Temp[1]:= #0; if RequestProc(PluginNumber, RT_URL, nil, nil, PAnsiChar(Temp), MAX_PATH) then begin Connection.Host := Temp; Temp[1]:= #0; if RequestProc(PluginNumber, RT_TargetDir, nil, nil, PAnsiChar(Temp), MAX_PATH) then begin Connection.Path := Temp; Temp[1]:= #0; if RequestProc(PluginNumber, RT_UserName, nil, nil, PAnsiChar(Temp), MAX_PATH) then begin Connection.UserName := Temp; Result:= True; end; end; end; end; function QuickConnection: Boolean; var I: Integer; Connection: TConnection; FtpSend: TFTPSendEx; begin Result:= False; Connection := TConnection.Create; if AddQuickConnection(Connection) then begin if ShowPasswordDialog(Connection.Password) then begin Connection.ConnectionName:= Connection.Host; I:= ConnectionList.AddObject(Connection.ConnectionName, Connection); Result:= FtpConnect(Connection.ConnectionName, FtpSend); ConnectionList.Delete(I); end; end; if not Result then Connection.Free; end; function AddConnection: Integer; var Temp: AnsiString; bCancel: Boolean; begin Result:= -1; bCancel := True; gConnection := TConnection.Create; if HasDialogAPI then begin if ShowFtpConfDlg then with gConnection do begin if MasterPassword then begin if CryptFunc(FS_CRYPT_SAVE_PASSWORD, ConnectionName, Password) = FS_FILE_OK then Password:= EmptyStr; end; Result:= ConnectionList.AddObject(ConnectionName, gConnection); bCancel := False; end; end else begin SetLength(Temp, MAX_PATH); Temp[1]:= #0; if RequestProc(PluginNumber, RT_Other, nil, nil, PAnsiChar(Temp), MAX_PATH) then begin gConnection.ConnectionName := Temp; if AddQuickConnection(gConnection) then begin Result:= ConnectionList.AddObject(gConnection.ConnectionName, gConnection); bCancel := False; end; end; end; if bCancel then FreeAndNil(gConnection) else WriteConnectionList; end; function EditConnection(ConnectionName: AnsiString): Boolean; var I: Integer; begin Result:= False; if HasDialogAPI then begin I := ConnectionList.IndexOf(ConnectionName); if I >= 0 then begin gConnection:= TConnection(ConnectionList.Objects[I]); if ShowFtpConfDlg then begin with gConnection do if MasterPassword and PasswordChanged then begin if CryptFunc(FS_CRYPT_SAVE_PASSWORD, ConnectionName, Password) = FS_FILE_OK then Password:= EmptyStr; end; WriteConnectionList; Result:= True; end; gConnection:= nil; end; end; end; function DeleteConnection(ConnectionName: AnsiString): Boolean; var I: Integer; Connection: TConnection; begin Result:= False; I:= ConnectionList.IndexOf(ConnectionName); if I >= 0 then begin Connection:= TConnection(ConnectionList.Objects[I]); Connection.Free; ConnectionList.Delete(I); WriteConnectionList; Result:= True; end; end; function ExtractConnectionName(const sPath: AnsiString): AnsiString; var Index: Integer; begin Result:= sPath; if sPath[1] = PathDelim then Result := Copy(sPath, 2, Length(sPath)); Index := Pos(PathDelim, Result); if Index = 0 then Index := MaxInt; Result := Copy(Result, 1, Index - 1); end; function ExtractRemoteFileName(const FileName: AnsiString): AnsiString; var I: Integer; begin Result := FileName; System.Delete(Result, 1, 1); I := Pos(PathDelim, Result); if I = 0 then Result := '/' else begin System.Delete(Result, 1, I - 1); Result := StringReplace(Result, '\', '/', [rfReplaceAll]); end; end; function GetConnectionByPath(const sPath: AnsiString; out FtpSend: TFTPSendEx; out RemotePath: AnsiString): Boolean; var sConnName: AnsiString; begin Result := False; if (ExtractFileDir(sPath) = PathDelim) then Exit; sConnName := ExtractConnectionName(sPath); RemotePath := ExtractRemoteFileName(sPath); Result:= FtpConnect(sConnName, FtpSend); end; function LocalFindNext(Hdl: THandle; var FindData: TWin32FindData): Boolean; var ListRec: PListRec absolute Hdl; I, RootCount: Integer; Connection: TConnection; begin Result := False; I := ListRec^.Index; RootCount := High(RootList) + 1; FillChar(FindData, SizeOf(FindData), 0); if I < RootCount then begin StrPCopy(FindData.cFileName, RootList[I]); FindData.dwFileAttributes := 0; Inc(ListRec^.Index); Result := True; end else if I - RootCount < ConnectionList.Count then begin Connection := TConnection(ConnectionList.Objects[I - RootCount]); StrPCopy(FindData.cFileName, Connection.ConnectionName); FindData.dwFileAttributes := FILE_ATTRIBUTE_NORMAL; Inc(ListRec^.Index); Result := True; end; end; function RemoteFindNext(Hdl: THandle; var FindData: TWin32FindData): Boolean; var ListRec: PListRec absolute Hdl; I: Integer; begin Result := False; if Assigned(ListRec^.FtpList) then with ListRec^ do begin I := Index; if I < FtpList.Count then begin FillChar(FindData, SizeOf(FindData), 0); StrPCopy(FindData.cFileName, FtpList.Items[I].FileName); FindData.dwFileAttributes := FindData.dwFileAttributes or FILE_ATTRIBUTE_UNIX_MODE; if FtpList.Items[I].Directory then FindData.dwFileAttributes := FindData.dwFileAttributes or FILE_ATTRIBUTE_DIRECTORY else begin FindData.nFileSizeLow := (FtpList.Items[I].FileSize and MAXDWORD); FindData.nFileSizeHigh := (FtpList.Items[I].FileSize shr $20); end; // set Unix permissions FindData.dwReserved0 := ModeStr2Mode(FtpList.Items[I].Permission); FindData.ftLastWriteTime := DateTimeToFileTime(FtpList.Items[I].FileTime); Inc(ListRec^.Index); Result := True; end; end; end; function FsInit(PluginNr: Integer; pProgressProc: TProgressProc; pLogProc: TLogProc; pRequestProc: TRequestProc): Integer; dcpcall; begin ProgressProc := pProgressProc; LogProc := pLogProc; RequestProc := pRequestProc; PluginNumber := PluginNr; ActiveConnectionList := TStringList.Create; ConnectionList := TStringList.Create; Result := 0; end; function FsFindFirst(Path: PAnsiChar; var FindData: TWin32FindData): THandle; dcpcall; var ListRec: PListRec; sPath: AnsiString; FtpSend: TFTPSendEx; begin New(ListRec); ListRec.Path := Path; ListRec.Index := 0; ListRec.FtpList:= nil; Result := wfxInvalidHandle; if Path = PathDelim then begin Result := THandle(ListRec); LocalFindNext(Result, FindData); end else begin ListLock.Acquire; try if GetConnectionByPath(IncludeTrailingPathDelimiter(Path), FtpSend, sPath) then begin // Get directory listing if FtpSend.List(sPath, False) then begin if FtpSend.FtpList.Count > 0 then begin ListRec.FtpList:= TFTPListEx.Create; // Save file list ListRec.FtpList.Assign(FtpSend.FtpList); Result := THandle(ListRec); RemoteFindNext(Result, FindData); end; end; end; finally ListLock.Release; if Result = wfxInvalidHandle then Dispose(ListRec); end; end; end; function FsFindNext(Hdl: THandle; var FindData: TWin32FindData): BOOL; dcpcall; var ListRec: PListRec absolute Hdl; begin if ListRec.Path = PathDelim then Result := LocalFindNext(Hdl, FindData) else Result := RemoteFindNext(Hdl, FindData); end; function FsFindClose(Hdl: THandle): Integer; dcpcall; var ListRec: PListRec absolute Hdl; begin if Assigned(ListRec) then begin if Assigned(ListRec^.FtpList) then FreeAndNil(ListRec^.FtpList); Dispose(ListRec); end; Result:= 0; end; function FsExecuteFile(MainWin: THandle; RemoteName, Verb: PAnsiChar): Integer; dcpcall; var FtpSend: TFTPSendEx; sFileName: AnsiString; begin Result:= FS_EXEC_YOURSELF; if (RemoteName = '') then Exit; if Verb = 'open' then begin if (ExtractFileDir(RemoteName) = PathDelim) then // root path begin if RemoteName[1] <> '<' then // connection begin if not FtpConnect(RemoteName + 1, FtpSend) then Result := FS_EXEC_OK else begin sFileName:= SetDirSeparators(RemoteName + FtpSend.GetCurrentDir); StrPLCopy(RemoteName, sFileName, MAX_PATH); Result := FS_EXEC_SYMLINK; end; end else // special item begin if (RemoteName + 1) = cAddConnection then begin AddConnection; Result:= FS_EXEC_OK; end else if (RemoteName + 1) = cQuickConnection then begin if QuickConnection then Result := FS_EXEC_SYMLINK else Result := FS_EXEC_OK; end; end; end; // root path end // Verb = open else if Pos('chmod', Verb) > 0 then begin if GetConnectionByPath(RemoteName, FtpSend, sFileName) then begin if (FtpSend.FTPCommand('SITE' + #32 + Verb + #32 + sFileName) div 100) = 2 then Result:= FS_EXEC_OK else Result := FS_EXEC_ERROR; end; end else if Verb = 'properties' then if (ExtractFileDir(RemoteName) = PathDelim) and (RemoteName[1] <> '<') then // connection begin EditConnection(RemoteName + 1); Result:= FS_EXEC_OK; end; end; function FsRenMovFile(OldName, NewName: PAnsiChar; Move, OverWrite: BOOL; RemoteInfo: pRemoteInfo): Integer; dcpcall; var I: Integer; FtpSend: TFTPSendEx; sOldName, sNewName: AnsiString; begin Result := FS_FILE_NOTSUPPORTED; if not Move then Exit; if (ExtractFileDir(OldName) = PathDelim) and (AnsiChar(OldName[1]) <> '<') then begin I:= ConnectionList.IndexOf(OldName + 1); if I < 0 then Result:= FS_FILE_NOTFOUND else begin TConnection(ConnectionList.Objects[I]).ConnectionName:= ExtractFileName(NewName); WriteConnectionList; Result:= FS_FILE_OK; end; end else if GetConnectionByPath(OldName, FtpSend, sOldName) then begin sNewName := ExtractRemoteFileName(NewName); ProgressProc(PluginNumber, OldName, NewName, 0); if FtpSend.RenameFile(sOldName, sNewName) then begin ProgressProc(PluginNumber, OldName, NewName, 100); Result := FS_FILE_OK; end; end; end; function FsGetFile(RemoteName, LocalName: PAnsiChar; CopyFlags: Integer; RemoteInfo: pRemoteInfo): Integer; dcpcall; var sFileName: AnsiString; FtpSend: TFTPSendEx; begin Result := FS_FILE_READERROR; if GetConnectionByPath(RemoteName, FtpSend, sFileName) then begin FtpSend.DataStream.Clear; ProgressProc(PluginNumber, RemoteName, LocalName, 0); if FtpSend.RetrieveFile(sFileName, (CopyFlags and FS_COPYFLAGS_RESUME) <> 0) then try FtpSend.DataStream.SaveToFile(LocalName); ProgressProc(PluginNumber, RemoteName, LocalName, 100); Result := FS_FILE_OK; except on EFCreateError do Result := FS_FILE_WRITEERROR; on EWriteError do Result := FS_FILE_WRITEERROR; end; end; end; function FsPutFile(LocalName, RemoteName: PAnsiChar; CopyFlags: Integer) : Integer; dcpcall; var sFileName: AnsiString; FtpSend: TFTPSendEx; begin Result := FS_FILE_WRITEERROR; if GetConnectionByPath(RemoteName, FtpSend, sFileName) then begin FtpSend.DataStream.Clear; try ProgressProc(PluginNumber, LocalName, RemoteName, 0); FtpSend.DataStream.LoadFromFile(LocalName); except on EFOpenError do begin Result := FS_FILE_NOTFOUND; Exit; end; on EReadError do begin Result := FS_FILE_READERROR; Exit; end; end; if FtpSend.StoreFile(sFileName, (CopyFlags and FS_COPYFLAGS_RESUME) <> 0) then begin ProgressProc(PluginNumber, LocalName, RemoteName, 100); Result := FS_FILE_OK; end; end; end; function FsDeleteFile(RemoteName: PAnsiChar): BOOL; dcpcall; var sFileName: AnsiString; FtpSend: TFTPSendEx; begin Result := False; // if root path then delete connection if (ExtractFileDir(RemoteName) = PathDelim) and (AnsiChar(RemoteName[1]) <> '<') then Result:= DeleteConnection(ExtractConnectionName(RemoteName)) else if GetConnectionByPath(RemoteName, FtpSend, sFileName) then Result := FtpSend.DeleteFile(sFileName); end; function FsMkDir(RemoteDir: PAnsiChar): BOOL; dcpcall; var sPath: AnsiString; FtpSend: TFTPSendEx; begin Result := False; if GetConnectionByPath(RemoteDir, FtpSend, sPath) then Result := FtpSend.CreateDir(sPath); end; function FsRemoveDir(RemoteName: PAnsiChar): BOOL; dcpcall; var sPath: AnsiString; FtpSend: TFTPSendEx; begin Result := False; if GetConnectionByPath(RemoteName, FtpSend, sPath) then Result := FtpSend.DeleteDir(sPath); end; function FsDisconnect(DisconnectRoot: PAnsiChar): BOOL; dcpcall; var FtpSend: TFTPSendEx; sTemp: AnsiString; begin Result := False; if GetConnectionByPath(DisconnectRoot, FtpSend, sTemp) then begin Result := FtpSend.Logout; LogProc(PluginNumber, MSGTYPE_DISCONNECT, PAnsiChar('DISCONNECT ' + DisconnectRoot)); ActiveConnectionList.Delete(ActiveConnectionList.IndexOfObject(FtpSend)); FreeAndNil(FtpSend); end; end; procedure FsSetCryptCallback(pCryptProc: TCryptProc; CryptoNr, Flags: Integer); dcpcall; begin CryptProc:= pCryptProc; CryptoNumber:= CryptoNr; end; procedure FsGetDefRootName(DefRootName: PAnsiChar; MaxLen: Integer); dcpcall; begin StrPLCopy(DefRootName, 'FTP', MaxLen); end; procedure FsSetDefaultParams(dps: pFsDefaultParamStruct); dcpcall; begin IniFile := TIniFile.Create(dps.DefaultIniName); IniFile.WriteDateTime('FTP', 'Test', Now); ReadConnectionList; end; { procedure FsNetworkGetSupportedProtocols(Protocols: PAnsiChar; MaxLen: LongInt); dcpcall; begin StrPLCopy(Protocols, ftpProtocol, MaxLen); end; function FsNetworkGetConnection(Index: LongInt; Connection: PAnsiChar; MaxLen: LongInt): LongBool; dcpcall; begin Result:= False; if Index >= ConnectionList.Count then Exit; StrPLCopy(Connection, TConnection(ConnectionList.Objects[Index]).ConnectionName, MaxLen); Result:= True; end; function FsNetworkManageConnection(MainWin: HWND; Connection: PAnsiChar; Action: LongInt; MaxLen: LongInt): LongBool; dcpcall; var I: Integer; begin Result:= False; case Action of FS_NM_ACTION_ADD: begin I:= AddConnection; if I >= 0 then begin StrPLCopy(Connection, ConnectionList[I], MaxLen); Result:= True; end; end; FS_NM_ACTION_EDIT: begin I:= ConnectionList.IndexOf(Connection); if I >= 0 then begin if EditConnection(Connection) then begin StrPLCopy(Connection, ConnectionList[I], MaxLen); Result:= True; end; end; end; FS_NM_ACTION_DELETE: Result:= DeleteConnection(Connection); end; end; function FsNetworkOpenConnection(Connection: PAnsiChar; RootDir, RemotePath: PAnsiChar; MaxLen: LongInt): LongBool; dcpcall; var I: Integer; FtpSend: TFTPSendEx; Con: TConnection; begin Result:= False; if Connection = #0 then begin if QuickConnection then begin I:= ActiveConnectionList.IndexOf(cQuickConnection); if I >= 0 then begin Con:= TConnection(ActiveConnectionList.Objects[I]); StrPLCopy(Connection, ftpProtocol + Con.Host, MaxLen); StrPLCopy(RootDir, PathDelim + Con.ConnectionName, MaxLen); StrPLCopy(RemotePath, Con.Path, MaxLen); Result:= True; end; end; end else if FtpConnect(Connection, FtpSend) then begin I:= ConnectionList.IndexOf(Connection); if I >= 0 then begin Con:= TConnection(ConnectionList.Objects[I]); StrPLCopy(Connection, ftpProtocol + Con.Host, MaxLen); StrPLCopy(RootDir, PathDelim + Con.ConnectionName, MaxLen); StrPLCopy(RemotePath, Con.Path, MaxLen); Result:= True; end; end; end; } procedure ExtensionInitialize(StartupInfo: PExtensionStartupInfo); begin gStartupInfo:= StartupInfo^; HasDialogAPI:= True; end; function ReadPassword(ConnectionName: UTF8String): AnsiString; begin if CryptFunc(FS_CRYPT_LOAD_PASSWORD, ConnectionName, Result) <> FS_FILE_OK then Result:= EmptyStr; end; function DeletePassword(ConnectionName: UTF8String): Boolean; var Password: AnsiString; begin Password:= EmptyStr; Result:= CryptFunc(FS_CRYPT_DELETE_PASSWORD, ConnectionName, Password) = FS_FILE_OK; end; { TFTPListRecEx } procedure TFTPListRecEx.Assign(Value: TFTPListRec); begin inherited Assign(Value); Permission:= Value.Permission; end; { TFTPListEx } procedure TFTPListEx.Assign(Value: TFTPList); var flr: TFTPListRecEx; n: integer; begin Clear; for n := 0 to Value.Count - 1 do begin flr := TFTPListRecEx.Create; flr.Assign(Value[n]); Flist.Add(flr); end; Lines.Assign(Value.Lines); Masks.Assign(Value.Masks); UnparsedLines.Assign(Value.UnparsedLines); end; { TFTPSendEx } procedure TFTPSendEx.FTPStatus(Sender: TObject; Response: Boolean; const Value: string); begin LogProc(PluginNumber, msgtype_details, PAnsiChar(Value)); end; initialization ListLock := syncobjs.TCriticalSection.Create; finalization FreeAndNil(ListLock); end. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/src/ftputils.pas����������������������������������������������������0000644�0001750�0001750�00000015323�12014201074�020725� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ Double commander ------------------------------------------------------------------------- WFX plugin for working with File Transfer Protocol Copyright (C) 2009 Koblov Alexander (Alexx2000@mail.ru) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit FtpUtils; {$IFDEF FPC} {$mode objfpc}{$H+} {$ENDIF} interface uses Classes, SysUtils, WfxPlugin; const S_IFMT = $F000; { first-in/first-out (FIFO/pipe) } S_IFIFO = $1000; { character-special file (tty/console) } S_IFCHR = $2000; { directory } S_IFDIR = $4000; { blocking device (unused) } S_IFBLK = $6000; { regular } S_IFREG = $8000; { symbolic link (unused) } S_IFLNK = $A000; { Berkeley socket } S_IFSOCK = $C000; S_IRWXU = $01C0; S_IRUSR = $0100; S_IWUSR = $0080; S_IXUSR = $0040; S_IREAD = S_IRUSR; S_IWRITE = S_IWUSR; S_IEXEC = S_IXUSR; { POSIX file modes: group permission... } S_IRWXG = $0038; S_IRGRP = $0020; S_IWGRP = $0010; S_IXGRP = $0008; { POSIX file modes: other permission... } S_IRWXO = $0007; S_IROTH = $0004; S_IWOTH = $0002; S_IXOTH = $0001; { POSIX setuid(), setgid(), and sticky... } S_ISUID = $0800; S_ISGID = $0400; S_ISVTX = $0200; const ftpProtocol = 'ftp://'; function ModeStr2Mode(const sMode: String): Integer; function EncodeBase64(Data: AnsiString): AnsiString; function DecodeBase64(Data: AnsiString): AnsiString; function ExtractConnectionHost(Connection: AnsiString): AnsiString; function ExtractConnectionPort(Connection: AnsiString): AnsiString; function FileTimeToLocalFileTimeEx(const lpFileTime: TFileTime; var lpLocalFileTime: TFileTime): LongBool; function LocalFileTimeToFileTimeEx(const lpLocalFileTime: TFileTime; var lpFileTime: TFileTime): LongBool; function FileTimeToDateTime(ft : TFileTime) : TDateTime; function DateTimeToFileTime(dt : TDateTime) : TFileTime; implementation uses Base64 {$IFDEF MSWINDOWS} , Windows {$ELSE} , UnixUtil {$ENDIF} ; function ModeStr2Mode(const sMode: String): Integer; begin Result:= 0; if Length(sMode) < 10 then Exit; if sMode[1] = 'd' then Result:= Result or S_IFDIR; if sMode[1] = 'l' then Result:= Result or S_IFLNK; if sMode[1] = 's' then Result:= Result or S_IFSOCK; if sMode[1] = 'f' then Result:= Result or S_IFIFO; if sMode[1] = 'b' then Result:= Result or S_IFBLK; if sMode[1] = 'c' then Result:= Result or S_IFCHR; if sMode[2] = 'r' then Result:= Result or S_IRUSR; if sMode[3] = 'w' then Result:= Result or S_IWUSR; if sMode[4] = 'x' then Result:= Result or S_IXUSR; if sMode[5] = 'r' then Result:= Result or S_IRGRP; if sMode[6] = 'w' then Result:= Result or S_IWGRP; if sMode[7] = 'x' then Result:= Result or S_IXGRP; if sMode[8] = 'r' then Result:= Result or S_IROTH; if sMode[9] = 'w' then Result:= Result or S_IWOTH; if sMode[10] = 'x' then Result:= Result or S_IXOTH; if sMode[4] = 's' then Result:= Result or S_ISUID; if sMode[7] = 's' then Result:= Result or S_ISGID; end; function EncodeBase64(Data: AnsiString): AnsiString; var StringStream1, StringStream2: TStringStream; begin Result:= EmptyStr; if Data = EmptyStr then Exit; StringStream1:= TStringStream.Create(Data); try StringStream1.Position:= 0; StringStream2:= TStringStream.Create(EmptyStr); try with TBase64EncodingStream.Create(StringStream2) do try CopyFrom(StringStream1, StringStream1.Size); finally Free; end; Result:= StringStream2.DataString; finally StringStream2.Free; end; finally StringStream1.Free; end; end; function DecodeBase64(Data: AnsiString): AnsiString; var StringStream1, StringStream2: TStringStream; Base64DecodingStream: TBase64DecodingStream; begin Result:= EmptyStr; if Data = EmptyStr then Exit; StringStream1:= TStringStream.Create(Data); try StringStream1.Position:= 0; StringStream2:= TStringStream.Create(EmptyStr); try Base64DecodingStream:= TBase64DecodingStream.Create(StringStream1); with StringStream2 do try CopyFrom(Base64DecodingStream, Base64DecodingStream.Size); finally Base64DecodingStream.Free; end; Result:= StringStream2.DataString; finally StringStream2.Free; end; finally StringStream1.Free; end; end; function ExtractConnectionHost(Connection: AnsiString): AnsiString; var I: Integer; begin if Pos(ftpProtocol, LowerCase(Connection)) <> 0 then Delete(Connection, 1, 6); I:= Pos(':', Connection); if I > 0 then Result:= Copy(Connection, 1, I - 1) else Result:= Connection; end; function ExtractConnectionPort(Connection: AnsiString): AnsiString; var I, J: Integer; begin Result:= EmptyStr; if Pos(ftpProtocol, LowerCase(Connection)) <> 0 then Delete(Connection, 1, 6); I:= Pos(':', Connection); if I > 0 then begin J:= Pos('/', Connection); if J = 0 then J:= MaxInt; Result:= Trim(Copy(Connection, I + 1, J)); end; end; function FileTimeToLocalFileTimeEx(const lpFileTime: TFileTime; var lpLocalFileTime: TFileTime): LongBool; {$IFDEF MSWINDOWS} begin Result := FileTimeToLocalFileTime(lpFileTime, lpLocalFileTime); end; {$ELSE} begin Int64(lpLocalFileTime) := Int64(lpFileTime) + 10000000 * Int64(TZSeconds); Result := True; end; {$ENDIF} function LocalFileTimeToFileTimeEx(const lpLocalFileTime: TFileTime; var lpFileTime: TFileTime): LongBool; {$IFDEF MSWINDOWS} begin Result := LocalFileTimeToFileTime(lpLocalFileTime, lpFileTime); end; {$ELSE} begin Int64(lpFileTime) := Int64(lpLocalFileTime) - 10000000 * Int64(TZSeconds); Result := True; end; {$ENDIF} function FileTimeToDateTime(ft : TFileTime) : TDateTime; begin FileTimeToLocalFileTimeEx(ft,ft); Result := (Int64(ft) / 864000000000.0) - 109205.0; end; function DateTimeToFileTime(dt : TDateTime) : TFileTime; begin Int64(Result) := Round((dt + 109205.0) * 864000000000.0); LocalFileTimeToFileTimeEx(Result, Result); end; end. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/ftp/src/ftp.lpi���������������������������������������������������������0000644�0001750�0001750�00000006116�12247124203�017653� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <CONFIG> <ProjectOptions> <Version Value="9"/> <PathDelim Value="\"/> <General> <Flags> <SaveOnlyProjectUnits Value="True"/> <MainUnitHasCreateFormStatements Value="False"/> <MainUnitHasTitleStatement Value="False"/> </Flags> <SessionStorage Value="InProjectDir"/> <MainUnit Value="0"/> <UseAppBundle Value="False"/> </General> <VersionInfo> <UseVersionInfo Value="True"/> <MinorVersionNr Value="1"/> <StringTable FileDescription="FTP WFX plugin for Double Commander" LegalCopyright="Copyright (C) 2006-2012 Koblov Alexander" ProductVersion=""/> </VersionInfo> <BuildModes Count="1"> <Item1 Name="default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <HostApplicationFilename Value="D:\totalcmd\totalcmd.exe"/> <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <Units Count="4"> <Unit0> <Filename Value="ftp.dpr"/> <IsPartOfProject Value="True"/> </Unit0> <Unit1> <Filename Value="ftputils.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="FtpUtils"/> </Unit1> <Unit2> <Filename Value="FtpConfDlg.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="DialogBox"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="FtpConfDlg"/> </Unit2> <Unit3> <Filename Value="ftpfunc.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="FtpFunc"/> </Unit3> </Units> </ProjectOptions> <CompilerOptions> <Version Value="11"/> <PathDelim Value="\"/> <Target> <Filename Value="..\lib\ftp.wfx" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir);..\..\..\..\sdk"/> <OtherUnitFiles Value="..\synapse;..\..\..\..\sdk"/> <UnitOutputDirectory Value="..\lib"/> </SearchPaths> <Conditionals Value="if (TargetCPU <> 'arm') then begin CustomOptions += '-fPIC'; end; if (TargetOS = 'linux') then begin LinkerOptions += ' -z relro'; end; if (TargetOS = 'darwin') then begin LinkerOptions += ' -no_order_inits'; end;"/> <Parsing> <SyntaxOptions> <SyntaxMode Value="Delphi"/> </SyntaxOptions> </Parsing> <Linking> <LinkSmart Value="True"/> <Options> <PassLinkerOptions Value="True"/> <ExecutableType Value="Library"/> </Options> </Linking> <Other> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> </CONFIG> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/sample/�����������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016261� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/sample/lib/�������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017027� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/sample/src/�������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017050� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/sample/src/sample.lpi���������������������������������������������������0000644�0001750�0001750�00000004244�12210604521�021027� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <CONFIG> <ProjectOptions> <Version Value="9"/> <General> <SessionStorage Value="InProjectDir"/> <MainUnit Value="0"/> </General> <VersionInfo> <UseVersionInfo Value="True"/> <MinorVersionNr Value="1"/> <StringTable FileDescription="Example of WFX plugin for Double Commander" LegalCopyright="Copyright (C) 2006-2012 Koblov Alexander" ProductVersion=""/> </VersionInfo> <BuildModes Count="1"> <Item1 Name="default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <Units Count="1"> <Unit0> <Filename Value="sample.lpr"/> <IsPartOfProject Value="True"/> <UnitName Value="Sample"/> </Unit0> </Units> </ProjectOptions> <CompilerOptions> <Version Value="11"/> <Target> <Filename Value="../lib/sample.wfx" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir);../../../../sdk"/> <OtherUnitFiles Value="../../../../sdk"/> <UnitOutputDirectory Value="../lib"/> </SearchPaths> <Conditionals Value="if (TargetCPU <> 'arm') then begin CustomOptions += '-fPIC'; end; if (TargetOS = 'darwin') then begin LinkerOptions += ' -no_order_inits'; end;"/> <Parsing> <SyntaxOptions> <UseAnsiStrings Value="False"/> </SyntaxOptions> </Parsing> <Linking> <LinkSmart Value="True"/> <Options> <PassLinkerOptions Value="True"/> <ExecutableType Value="Library"/> </Options> </Linking> <Other> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> </CONFIG> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/sample/src/sample.lpr���������������������������������������������������0000644�0001750�0001750�00000003354�12014201074�021037� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library Sample; {$mode objfpc}{$H+} {$include calling.inc} uses {$IFDEF MSWINDOWS} Windows, {$ENDIF} {$IFDEF unix} baseunix, {$ENDIF} Classes, WfxPlugin, SysUtils; {$E wfx} {$R *.res} var gPluginNr: integer; gProgressProc: tProgressProc; gLogProc: tLogProc; gRequestProc: tRequestProc; function FsInit(PluginNr:integer;pProgressProc:tProgressProc;pLogProc:tLogProc; pRequestProc:tRequestProc):integer; dcpcall; begin gPluginNr:= PluginNr; gProgressProc:= pProgressProc; gLogProc:= pLogProc; gRequestProc:= pRequestProc; Result:= 0; end; function FsFindFirst(path :pchar;var FindData:tWIN32FINDDATA):thandle; dcpcall; begin FillChar(FindData, SizeOf(FindData), 0); FindData.dwFileAttributes :=0; //0 - обычный файл без каких-либо атрибутов StrPCopy(FindData.cFileName,'Hello, world.txt'); //имя файла Result:= 1985; //функция нормально отработала} end; function FsFindNext(Hdl:thandle;var FindData:tWIN32FINDDATA): BOOL; dcpcall; begin // gRequestProc(gPluginNr, RT_URL, nil, nil, nil, 0); Result:= False; end; function FsFindClose(Hdl:thandle):integer; dcpcall; begin Result:= 0; end; function FsRenMovFile(OldName,NewName:pchar;Move,OverWrite:bool; RemoteInfo:pRemoteInfo):integer; dcpcall; begin gRequestProc(gPluginNr, RT_MsgOK, OldName, NewName, nil, 0); Result:= FS_FILE_OK; end; function FsExecuteFile(MainWin:thandle;RemoteName,Verb:pchar):integer; dcpcall; begin gRequestProc(gPluginNr, RT_MsgOK, RemoteName, Verb, nil, 0); Result:= FS_EXEC_OK; end; exports // mandatory FsInit, FsFindFirst, FsFindNext, FsFindClose, // optional FsRenMovFile, FsExecuteFile; begin end. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/gvfs/�������������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�015745� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/gvfs/README.txt���������������������������������������������������������0000644�0001750�0001750�00000002100�12014201074�017416� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Double Commander -------------------------------------------------------------------------------- WFX plugin for working with GVFS Copyright (C) 2009 Koblov Alexander (Alexx2000@mail.ru) Based on: GVFS plugin for Tux Commander Copyright (C) 2008 Tomas Bzatek <tbzatek@users.sourceforge.net> http://tuxcmd.sourceforge.net Requirements: - glib2 library at least version 2.16.0 - gvfs daemon and backends available in the system (check your distribution for gvfs packages) This is the GVFS plugin for Double Commander file manager. It's built on top of the GVFS daemon, which is an integral part of Gnome Desktop since version 2.22. It provides access to many type of resources such as network shares (FTP, SSH/SFTP, SMB, WebDAV), bluetooth devices (ObexFTP), cameras and portable players (gphoto2) and others. Feature highlights: * read/write access to network resources (FTP, SSH/SFTP, SMB, WebDAV) For successful compilation you will need working gcc compiler and glib2 library installed with development files. Compilation has been tested with gcc compiler v4.3.1 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/gvfs/lib/���������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016513� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/gvfs/src/���������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016534� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/gvfs/src/Makefile�������������������������������������������������������0000644�0001750�0001750�00000001043�11610507422�020163� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# compiler options CC = gcc CFLAGS =-I. -I/usr/include -I../../../../sdk \ -Wall -fPIC -O2 -g \ -DG_DISABLE_DEPRECATED -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_GNU_SOURCE LIB_SUFFIX=`if test \`uname -m\` = x86_64; then echo 64; fi` VFS_OBJECTS=gvfs.o .SUFFIXES: .c .c.o: $(CC) $(CFLAGS) `pkg-config glib-2.0 gio-2.0 --cflags` -c $< all shared static: gvfs.wfx gvfs.wfx: $(VFS_OBJECTS) $(CC) -shared -o ../lib/gvfs.wfx $(VFS_OBJECTS) $(CFLAGS) `pkg-config glib-2.0 gio-2.0 --libs` clean: rm -f *.o *.d *.gch rm -f ../lib/gvfs.wfx ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/gvfs/src/gvfs.c���������������������������������������������������������0000644�0001750�0001750�00000162456�11621535203�017654� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Double Commander ------------------------------------------------------------------------- WFX plugin for working with GVFS Copyright (C) 2009-2010 Koblov Alexander (Alexx2000@mail.ru) Based on: GVFS plugin for Tux Commander Copyright (C) 2008-2009 Tomas Bzatek <tbzatek@users.sourceforge.net> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdint.h> #include <sys/stat.h> #include <errno.h> #include <glib.h> #include <gio/gio.h> #include <glib/gtypes.h> #include "wfxplugin.h" #define CONST_DEFAULT_QUERY_INFO_ATTRIBUTES G_FILE_ATTRIBUTE_STANDARD_TYPE "," G_FILE_ATTRIBUTE_STANDARD_NAME "," \ G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME "," G_FILE_ATTRIBUTE_STANDARD_SIZE "," \ G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET "," G_FILE_ATTRIBUTE_TIME_MODIFIED "," \ G_FILE_ATTRIBUTE_TIME_ACCESS "," G_FILE_ATTRIBUTE_TIME_CREATED "," \ G_FILE_ATTRIBUTE_UNIX_MODE "," G_FILE_ATTRIBUTE_UNIX_UID "," \ G_FILE_ATTRIBUTE_UNIX_GID #define TUXCMD_DEFAULT_COPY_FLAGS G_FILE_COPY_OVERWRITE | G_FILE_COPY_NOFOLLOW_SYMLINKS | G_FILE_COPY_ALL_METADATA #define GROUP_NAME "gvfs" #define PathDelim "/" #define cAddConnection "<Add connection>" #define cQuickConnection "<Quick connection>" #define cAnonymous "anonymous" #define cDefaultIniName "gvfs.ini" #define IS_DIR_SEP(ch) ((ch) == '/') #define Int32x32To64(a,b) ((gint64)(a)*(gint64)(b)) typedef int TVFSResult; typedef struct _Connection { gchar *Name; gchar *Type; gchar *Host; gchar *UserName; gchar *Password; gchar *Path; } TConnection, *PConnection; struct TVFSGlobs { PConnection Connection; gchar *RemotePath; GFile *file; GFileEnumerator *enumerator; GFile *enumerated_file; GMainLoop *mount_main_loop; TVFSResult mount_result; int mount_try; gboolean ftp_anonymous; }; typedef struct { gchar *Path; gint Index; GList *list; struct TVFSGlobs *globs; } TListRec, *PListRec; typedef struct _ProgressInfo { gchar SourceName[MAX_PATH]; gchar TargetName[MAX_PATH]; GCancellable *cancellable; } TProgressInfo, *PProgressInfo; //--------------------------------------------------------------------- // global variables //--------------------------------------------------------------------- int gPluginNumber; tProgressProc gProgressProc; tLogProc gLogProc; tRequestProc gRequestProc; gchar gDefaultIniName[MAX_PATH]; GList *ActiveConnectionList; GList *ConnectionList; PConnection gConnection; //--------------------------------------------------------------------- unsigned long FileTimeToUnixTime(LPFILETIME ft) { gint64 ll = ft->dwHighDateTime; ll = (ll << 32) | ft->dwLowDateTime; ll = (ll - 116444736000000000) / 10000000; return (unsigned long)ll; } gboolean UnixTimeToFileTime(unsigned long mtime, LPFILETIME ft) { gint64 ll = Int32x32To64(mtime, 10000000) + 116444736000000000; ft->dwLowDateTime = (DWORD)ll; ft->dwHighDateTime = ll >> 32; return TRUE; } static TVFSResult g_error_to_TVFSResult (GError *error) { g_print ("g_error_to_TVFSResult: code = %d\n", error->code); switch (error->code) { case G_IO_ERROR_FAILED: case G_IO_ERROR_NOT_FOUND: case G_IO_ERROR_PERMISSION_DENIED: return FS_FILE_NOTFOUND; break; case G_IO_ERROR_CANCELLED: return FS_FILE_USERABORT; break; case G_IO_ERROR_NOT_SUPPORTED: case G_IO_ERROR_FILENAME_TOO_LONG: return FS_FILE_NOTSUPPORTED; break; case G_IO_ERROR_IS_DIRECTORY: case G_IO_ERROR_NOT_REGULAR_FILE: case G_IO_ERROR_NOT_SYMBOLIC_LINK: case G_IO_ERROR_NOT_MOUNTABLE_FILE: case G_IO_ERROR_INVALID_FILENAME: case G_IO_ERROR_TOO_MANY_LINKS: case G_IO_ERROR_INVALID_ARGUMENT: case G_IO_ERROR_NOT_DIRECTORY: case G_IO_ERROR_NOT_MOUNTED: case G_IO_ERROR_ALREADY_MOUNTED: case G_IO_ERROR_WRONG_ETAG: case G_IO_ERROR_TIMED_OUT: case G_IO_ERROR_WOULD_RECURSE: case G_IO_ERROR_HOST_NOT_FOUND: return FS_FILE_READERROR; break; case G_IO_ERROR_NO_SPACE: case G_IO_ERROR_EXISTS: case G_IO_ERROR_NOT_EMPTY: case G_IO_ERROR_CLOSED: case G_IO_ERROR_PENDING: case G_IO_ERROR_READ_ONLY: case G_IO_ERROR_CANT_CREATE_BACKUP: case G_IO_ERROR_BUSY: case G_IO_ERROR_WOULD_BLOCK: case G_IO_ERROR_WOULD_MERGE: return FS_FILE_WRITEERROR; break; case G_IO_ERROR_FAILED_HANDLED: default: return FS_FILE_NOTSUPPORTED; } } static void ask_password_cb (GMountOperation *op, const char *message, const char *default_user, const char *default_domain, GAskPasswordFlags flags, gpointer user_data) { struct TVFSGlobs *globs; char username[MAX_PATH]; char password[MAX_PATH]; int anonymous; char domain[MAX_PATH]; GPasswordSave password_save; gboolean mount_handled = FALSE; globs = (struct TVFSGlobs*) user_data; g_assert (globs != NULL); globs->mount_try++; /* First pass, look if we have a password to supply */ if (globs->mount_try == 1) { if ((flags & G_ASK_PASSWORD_ANONYMOUS_SUPPORTED) && globs->ftp_anonymous) { printf ("(WW) ask_password_cb: mount_try = %d, trying FTP anonymous login...\n", globs->mount_try); g_mount_operation_set_anonymous (op, TRUE); g_mount_operation_reply (op, G_MOUNT_OPERATION_HANDLED); return; } if ((flags & G_ASK_PASSWORD_NEED_USERNAME) && (globs->Connection->UserName != NULL)) { printf ("(WW) ask_password_cb: mount_try = %d, trying login with saved username...\n", globs->mount_try); g_mount_operation_set_username (op, globs->Connection->UserName); mount_handled = TRUE; } if ((flags & G_ASK_PASSWORD_NEED_PASSWORD) && (globs->Connection->Password != NULL)) { printf ("(WW) ask_password_cb: mount_try = %d, trying login with saved password...\n", globs->mount_try); g_mount_operation_set_password (op, globs->Connection->Password); mount_handled = TRUE; } if (mount_handled) { g_mount_operation_reply (op, G_MOUNT_OPERATION_HANDLED); return; } } /* Ask user for password */ g_print ("(WW) ask_password_cb: mount_try = %d, message = '%s'\n", globs->mount_try, message); /* Handle abort message from certain backends properly */ /* - e.g. SMB backends use this to mask multiple auth callbacks from smbclient */ if (default_user && strcmp (default_user, "ABORT") == 0) { g_print ("(WW) default_user == \"ABORT\", aborting\n"); g_mount_operation_reply (op, G_MOUNT_OPERATION_ABORTED); return; } username[0] = 0; domain[0] = 0; password[0] = 0; anonymous = FALSE; password_save = G_PASSWORD_SAVE_NEVER; if (gRequestProc) { fprintf (stderr, " (II) Spawning callback_ask_password (%p)...\n", gRequestProc); g_strlcpy(username, default_user, MAX_PATH); g_strlcpy(domain, default_domain, MAX_PATH); if (flags & G_ASK_PASSWORD_NEED_USERNAME) { if (gRequestProc(gPluginNumber, RT_UserName, (char *)message, NULL, username, MAX_PATH)) { g_mount_operation_set_username (op, username); } else { g_mount_operation_reply (op, G_MOUNT_OPERATION_ABORTED); return; } } if (flags & G_ASK_PASSWORD_NEED_DOMAIN) { if (gRequestProc(gPluginNumber, RT_Other, (char *)message, "Domain:", domain, MAX_PATH)) { g_mount_operation_set_domain (op, domain); } else { g_mount_operation_reply (op, G_MOUNT_OPERATION_ABORTED); return; } } if (flags & G_ASK_PASSWORD_NEED_PASSWORD) { if (gRequestProc(gPluginNumber, RT_Password, (char *)message, NULL, password, MAX_PATH)) { g_mount_operation_set_password (op, password); } else { g_mount_operation_reply (op, G_MOUNT_OPERATION_ABORTED); return; } } if (flags & G_ASK_PASSWORD_ANONYMOUS_SUPPORTED) g_mount_operation_set_anonymous (op, anonymous); if (flags & G_ASK_PASSWORD_SAVING_SUPPORTED) g_mount_operation_set_password_save (op, password_save); g_mount_operation_reply (op, G_MOUNT_OPERATION_HANDLED); return; } /* Unhandled, abort */ g_mount_operation_reply (op, G_MOUNT_OPERATION_ABORTED); } static void ask_question_cb (GMountOperation *op, const gchar *message, const gchar *choices[], gpointer user_data) { struct TVFSGlobs *globs; int len; int choice; globs = (struct TVFSGlobs*) user_data; g_assert (globs != NULL); g_print ("(WW) ask_question_cb: message = '%s'\n", message); len = 0; while (choices[len] != NULL) { g_print ("(WW) ask_question_cb: choice[%d] = '%s'\n", len, choices[len]); len++; } choice = -1; /* if (globs->callback_ask_question) { fprintf (stderr, " (II) Spawning callback_ask_question (%p)...\n", globs->callback_ask_question); // At this moment, only SFTP uses ask_question and the second button is cancellation globs->callback_ask_question (message, choices, &choice, 1, globs->callback_data); fprintf (stderr, " (II) Received choice = %d\n", choice); if (choice >= 0) { g_mount_operation_set_choice (op, choice); g_mount_operation_reply (op, G_MOUNT_OPERATION_HANDLED); } else { g_mount_operation_reply (op, G_MOUNT_OPERATION_ABORTED); } return; } */ g_mount_operation_reply (op, G_MOUNT_OPERATION_UNHANDLED); } static void mount_done_cb (GObject *object, GAsyncResult *res, gpointer user_data) { struct TVFSGlobs *globs; gboolean succeeded; GError *error = NULL; globs = (struct TVFSGlobs*) user_data; g_assert (globs != NULL); succeeded = g_file_mount_enclosing_volume_finish (G_FILE (object), res, &error); if (! succeeded) { g_print ("(EE) Error mounting location: %s\n", error->message); globs->mount_result = g_error_to_TVFSResult (error); g_error_free (error); } else { globs->mount_result = FS_FILE_OK; g_print ("(II) Mount successful.\n"); } g_main_loop_quit (globs->mount_main_loop); } static TVFSResult vfs_handle_mount (struct TVFSGlobs *globs, GFile *file) { GMountOperation *op; g_print ("(II) Mounting location...\n"); op = g_mount_operation_new (); g_signal_connect (op, "ask-password", (GCallback)ask_password_cb, globs); g_signal_connect (op, "ask-question", (GCallback)ask_question_cb, globs); globs->mount_result = FS_FILE_NOTFOUND; globs->mount_try = 0; /* Inspiration taken from Bastien Nocera's http://svn.gnome.org/viewvc/totem-pl-parser/trunk/plparse/totem-disc.c?view=markup */ globs->mount_main_loop = g_main_loop_new (NULL, FALSE); g_file_mount_enclosing_volume (file, G_MOUNT_MOUNT_NONE, op, NULL, mount_done_cb, globs); g_main_loop_run (globs->mount_main_loop); g_main_loop_unref (globs->mount_main_loop); globs->mount_main_loop = NULL; g_object_unref (op); return globs->mount_result; } struct TVFSGlobs * VFSNew () { struct TVFSGlobs *globs; globs = (struct TVFSGlobs *) malloc (sizeof (struct TVFSGlobs)); memset (globs, 0, sizeof (struct TVFSGlobs)); globs->file = NULL; globs->enumerator = NULL; globs->enumerated_file = NULL; return globs; } char * VFSGetServices () { GVfs *gvfs; const gchar* const * schemes; char *l = NULL; char *s; gvfs = g_vfs_get_default (); g_print ("(II) GVFS: is_active = %d\n", g_vfs_is_active (gvfs)); schemes = g_vfs_get_supported_uri_schemes (gvfs); for (; *schemes; schemes++) { if (l) { s = g_strdup_printf ("%s;%s", l, *schemes); g_free (l); l = s; } else l = g_strdup (*schemes); } g_print ("(II) GVFS: supported schemes: %s\n", l); return l; } char * VFSGetPrefix (struct TVFSGlobs *globs) { GFile *f; char *s; if (globs->file) { f = g_file_resolve_relative_path (globs->file, "/"); s = g_file_get_uri (f); g_object_unref (f); return s; } else return NULL; } char * VFSGetPath (struct TVFSGlobs *globs) { GFile *root; char *path, *s; if (globs->file) { root = g_file_resolve_relative_path (globs->file, "/"); if (root == NULL) return NULL; path = g_file_get_relative_path (root, globs->file); if (path == NULL) { g_object_unref (root); return NULL; } if (! g_path_is_absolute (path)) s = g_strdup_printf ("/%s", path); else s = g_strdup (path); g_print ("(II) VFSGetPath: '%s'\n", s); g_free (path); g_object_unref (root); return s; } else return NULL; } char * VFSGetPathURI (struct TVFSGlobs *globs) { if (globs->file) return g_file_get_uri (globs->file); else return NULL; } guint64 VFSGetFileSystemFree (struct TVFSGlobs *globs, char *APath) { GFileInfo *info; GError *error; guint64 res; if (globs->file == NULL) return 0; error = NULL; info = g_file_query_filesystem_info (globs->file, G_FILE_ATTRIBUTE_FILESYSTEM_FREE, NULL, &error); if (error) { g_print ("(EE) VFSGetFileSystemFree: %s\n", error->message); g_error_free (error); return 0; } res = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE); g_object_unref (info); return res; } guint64 VFSGetFileSystemSize (struct TVFSGlobs *globs, char *APath) { GFileInfo *info; GError *error; guint64 res; if (globs->file == NULL) return 0; error = NULL; info = g_file_query_filesystem_info (globs->file, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE, NULL, &error); if (error) { g_print ("(EE) VFSGetFileSystemSize: %s\n", error->message); g_error_free (error); return 0; } res = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE); g_object_unref (info); return res; } /**************************************************************************************************************************************/ /**************************************************************************************************************************************/ TVFSResult VFSChangeDir (struct TVFSGlobs *globs, char *NewPath) { GFile *f; GFileEnumerator *en; GError *error, *error_shortcut; TVFSResult res; GFileInfo *info; gchar *target_uri; g_print ("VFSChangeDir: Enter\n"); if (globs->file == NULL) { g_print ("(EE) VFSChangeDir: globs->file == NULL !\n"); return FS_FILE_NOTFOUND; } g_print ("(II) VFSChangeDir: changing dir to '%s'\n", NewPath); f = g_file_resolve_relative_path (globs->file, NewPath); if (f == NULL) { g_print ("(EE) VFSChangeDir: g_file_resolve_relative_path() failed.\n"); return FS_FILE_NOTFOUND; } res = FS_FILE_OK; while (1) { error = NULL; en = g_file_enumerate_children (f, CONST_DEFAULT_QUERY_INFO_ATTRIBUTES, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &error); /* if the target is shortcut, change the URI */ if (error && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_DIRECTORY)) { error_shortcut = NULL; info = g_file_query_info (f, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &error_shortcut); if (info) { target_uri = g_strdup (g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI)); g_object_unref (info); if (target_uri) { g_print ("(WW) VFSChangeDir: following shortcut, changing URI to '%s'\n", target_uri); g_object_unref (f); f = g_file_new_for_uri (target_uri); g_free (target_uri); g_error_free (error); continue; } } if (error_shortcut) g_error_free (error_shortcut); } /* Mount the target */ if (error && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED)) { g_error_free (error); res = vfs_handle_mount (globs, f); if (res != FS_FILE_OK) { g_object_unref (f); return res; } else continue; } /* Any other errors --> report */ if (error) { g_print ("(EE) VFSChangeDir: g_file_enumerate_children() error: %s\n", error->message); res = g_error_to_TVFSResult (error); g_error_free (error); g_object_unref (f); return res; } /* everything ok? */ break; } globs->enumerator = en; globs->enumerated_file = g_file_dup (f); g_object_unref (globs->file); globs->file = f; return res; } /**************************************************************************************************************************************/ /**************************************************************************************************************************************/ static void GFileInfoToWin32FindData (GFile *reference_file, GFileInfo *info, WIN32_FIND_DATAA *FindData) { GFileInfo *symlink_info = NULL; GError *error = NULL; g_assert (info != NULL); g_assert (FindData != NULL); g_strlcpy(FindData->cFileName, g_file_info_get_name (info), MAX_PATH); // File size goffset filesize = g_file_info_get_size (info); FindData->nFileSizeLow = (DWORD)filesize; FindData->nFileSizeHigh = filesize >> 32; // File attributes FindData->dwFileAttributes |= FILE_ATTRIBUTE_UNIX_MODE; FindData->dwReserved0 = g_file_info_get_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_MODE); // File date/time if (!UnixTimeToFileTime(g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED), &FindData->ftLastWriteTime)) { FindData->ftLastWriteTime.dwHighDateTime = 0xFFFFFFFF; FindData->ftLastWriteTime.dwLowDateTime = 0xFFFFFFFE; } if (!UnixTimeToFileTime(g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_ACCESS), &FindData->ftLastAccessTime)) { FindData->ftLastAccessTime.dwHighDateTime = 0xFFFFFFFF; FindData->ftLastAccessTime.dwLowDateTime = 0xFFFFFFFE; } if (!UnixTimeToFileTime(g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_CREATED), &FindData->ftCreationTime)) { FindData->ftCreationTime.dwHighDateTime = 0xFFFFFFFF; FindData->ftCreationTime.dwLowDateTime = 0xFFFFFFFE; } // g_print ("(II) GFileInfoToWin32FindData: type = %d\n", g_file_info_get_file_type (info)); // g_print ("(II) GFileInfoToWin32FindData: UNIX_MODE = %d\n", FindData->dwReserved0); switch (g_file_info_get_file_type (info)) { case G_FILE_TYPE_DIRECTORY: case G_FILE_TYPE_SHORTCUT: /* Used in network:/// */ case G_FILE_TYPE_MOUNTABLE: FindData->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY; break; case G_FILE_TYPE_SYMBOLIC_LINK: FindData->dwReserved0 |= S_IFLNK; // Check: file is symlink to directory symlink_info = g_file_query_info (reference_file, G_FILE_ATTRIBUTE_UNIX_MODE, G_FILE_QUERY_INFO_NONE, NULL, &error); if (error) { g_print ("(EE) GFileInfoToWin32FindData: g_file_query_info() error: %s\n", error->message); g_error_free (error); } if (symlink_info) { if (g_file_info_get_file_type (symlink_info) == G_FILE_TYPE_DIRECTORY) { FindData->dwFileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT; } g_object_unref (symlink_info); } break; case G_FILE_TYPE_UNKNOWN: case G_FILE_TYPE_REGULAR: case G_FILE_TYPE_SPECIAL: break; } /* fallback to default file mode if read fails */ if (FindData->dwReserved0 == 0) { if ((FindData->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) FindData->dwReserved0 = S_IFDIR + S_IRWXU + S_IRGRP + S_IXGRP + S_IROTH + S_IXOTH; else FindData->dwReserved0 = S_IRUSR + S_IWUSR + S_IRGRP + S_IROTH; } } /**************************************************************************************************************************************/ /**************************************************************************************************************************************/ long VFSFileExists (struct TVFSGlobs *globs, const char *FileName, const long Use_lstat) { GFile *f; GError *error; GFileInfo *info; if (globs->file == NULL) { g_print ("(EE) VFSFileExists: globs->file == NULL !\n"); return FS_FILE_NOTFOUND; } f = g_file_resolve_relative_path (globs->file, FileName); if (f == NULL) { g_print ("(EE) VFSMkDir: g_file_resolve_relative_path() failed.\n"); return FS_FILE_NOTFOUND; } error = NULL; info = g_file_query_info (f, G_FILE_ATTRIBUTE_STANDARD_NAME, Use_lstat ? G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS : G_FILE_QUERY_INFO_NONE, NULL, &error); g_object_unref (f); if (error) { // g_print ("(EE) VFSFileExists: g_file_query_info() error: %s\n", error->message); g_error_free (error); return FALSE; } g_object_unref (info); return TRUE; } TVFSResult VFSFileInfo (struct TVFSGlobs *globs, char *AFileName, WIN32_FIND_DATAA *FindData) { GFile *f; GError *error; GFileInfo *info; TVFSResult res; if (globs->file == NULL) { g_print ("(EE) VFSFileInfo: globs->file == NULL !\n"); return FS_FILE_NOTFOUND; } f = g_file_resolve_relative_path (globs->file, AFileName); if (f == NULL) { g_print ("(EE) VFSMkDir: g_file_resolve_relative_path() failed.\n"); return FS_FILE_NOTFOUND; } error = NULL; info = g_file_query_info (f, CONST_DEFAULT_QUERY_INFO_ATTRIBUTES, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &error); g_object_unref (f); if (error) { g_print ("(EE) VFSFileInfo: g_file_query_info() error: %s\n", error->message); res = g_error_to_TVFSResult (error); g_error_free (error); return res; } GFileInfoToWin32FindData (f, info, FindData); g_object_unref (info); g_object_unref (f); return FS_FILE_OK; } TVFSResult VFSRemove (struct TVFSGlobs *globs, const char *APath) { GFile *f; GError *error; TVFSResult res; if (globs->file == NULL) { g_print ("(EE) VFSRemove: globs->file == NULL !\n"); return FS_FILE_NOTFOUND; } f = g_file_resolve_relative_path (globs->file, APath); if (f == NULL) { g_print ("(EE) VFSRemove: g_file_resolve_relative_path() failed.\n"); return FS_FILE_NOTFOUND; } error = NULL; g_file_delete (f, NULL, &error); g_object_unref (f); if (error) { g_print ("(EE) VFSRemove: g_file_delete() error: %s\n", error->message); res = g_error_to_TVFSResult (error); g_error_free (error); return res; } return FS_FILE_OK; } TVFSResult VFSMakeSymLink (struct TVFSGlobs *globs, const char *NewFileName, const char *PointTo) { GFile *f; GError *error; TVFSResult res; if (globs->file == NULL) { g_print ("(EE) VFSMakeSymLink: globs->file == NULL !\n"); return FS_FILE_NOTFOUND; } f = g_file_resolve_relative_path (globs->file, NewFileName); if (f == NULL) { g_print ("(EE) VFSMakeSymLink: g_file_resolve_relative_path() failed.\n"); return FS_FILE_NOTFOUND; } error = NULL; g_file_make_symbolic_link (f, PointTo, NULL, &error); g_object_unref (f); if (error) { g_print ("(EE) VFSMakeSymLink: g_file_make_symbolic_link() error: %s\n", error->message); res = g_error_to_TVFSResult (error); g_error_free (error); return res; } return FS_FILE_OK; } TVFSResult VFSChmod (struct TVFSGlobs *globs, const char *FileName, const uint Mode) { GFile *f; GError *error; TVFSResult res; if (globs->file == NULL) { g_print ("(EE) VFSChmod: globs->file == NULL !\n"); return FS_FILE_NOTFOUND; } f = g_file_resolve_relative_path (globs->file, FileName); if (f == NULL) { g_print ("(EE) VFSChmod: g_file_resolve_relative_path() failed.\n"); return FS_FILE_NOTFOUND; } // g_print ("(II) VFSChmod (%s, %d): Going to set permissions on '%s'\n", FileName, Mode, g_file_get_uri (f)); error = NULL; g_file_set_attribute_uint32 (f, G_FILE_ATTRIBUTE_UNIX_MODE, Mode, G_FILE_QUERY_INFO_NONE, NULL, &error); g_object_unref (f); if (error) { g_print ("(EE) VFSChmod: g_file_set_attribute_uint32() error: %s\n", error->message); res = g_error_to_TVFSResult (error); g_error_free (error); return res; } return FS_FILE_OK; } TVFSResult VFSChown (struct TVFSGlobs *globs, const char *FileName, const uint UID, const uint GID) { GFile *f; GError *error; TVFSResult res; if (globs->file == NULL) { g_print ("(EE) VFSChown: globs->file == NULL !\n"); return FS_FILE_NOTFOUND; } f = g_file_resolve_relative_path (globs->file, FileName); if (f == NULL) { g_print ("(EE) VFSChown: g_file_resolve_relative_path() failed.\n"); return FS_FILE_NOTFOUND; } error = NULL; g_file_set_attribute_uint32 (f, G_FILE_ATTRIBUTE_UNIX_UID, UID, G_FILE_QUERY_INFO_NONE, NULL, &error); if (error) { g_print ("(EE) VFSChown: g_file_set_attribute_uint32() error: %s\n", error->message); res = g_error_to_TVFSResult (error); g_error_free (error); g_object_unref (f); return res; } error = NULL; g_file_set_attribute_uint32 (f, G_FILE_ATTRIBUTE_UNIX_GID, GID, G_FILE_QUERY_INFO_NONE, NULL, &error); if (error) { g_print ("(EE) VFSChown: g_file_set_attribute_uint32() error: %s\n", error->message); res = g_error_to_TVFSResult (error); g_error_free (error); g_object_unref (f); return res; } g_object_unref (f); return FS_FILE_OK; } /**************************************************************************************************************************************/ /**************************************************************************************************************************************/ gboolean VFSIsOnSameFS (struct TVFSGlobs *globs, const char *Path1, const char *Path2) { GFile *file1, *file2; GFileInfo *info1, *info2; GError *error; gboolean res; if (globs->file == NULL) { g_print ("(EE) VFSIsOnSameFS: globs->file == NULL !\n"); return FALSE; } file1 = g_file_resolve_relative_path (globs->file, Path1); file2 = g_file_resolve_relative_path (globs->file, Path2); if (file1 == NULL) { g_print ("(EE) VFSIsOnSameFS: g_file_resolve_relative_path() failed.\n"); return FALSE; } if (file2 == NULL) { g_print ("(EE) VFSIsOnSameFS: g_file_resolve_relative_path() failed.\n"); return FALSE; } error = NULL; info1 = g_file_query_info (file1, G_FILE_ATTRIBUTE_ID_FILESYSTEM, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &error); if (error) { g_print ("(EE) VFSIsOnSameFS: g_file_query_info() error: %s\n", error->message); g_error_free (error); g_object_unref (file1); g_object_unref (file2); return FALSE; } info2 = g_file_query_info (file2, G_FILE_ATTRIBUTE_ID_FILESYSTEM, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &error); if (error) { g_print ("(EE) VFSIsOnSameFS: g_file_query_info() error: %s\n", error->message); g_error_free (error); g_object_unref (info1); g_object_unref (file1); g_object_unref (file2); return FALSE; } g_print ("(II) VFSIsOnSameFS: '%s' vs. '%s'\n", g_file_info_get_attribute_string (info1, G_FILE_ATTRIBUTE_ID_FILESYSTEM), g_file_info_get_attribute_string (info2, G_FILE_ATTRIBUTE_ID_FILESYSTEM)); res = strcmp (g_file_info_get_attribute_string (info1, G_FILE_ATTRIBUTE_ID_FILESYSTEM), g_file_info_get_attribute_string (info2, G_FILE_ATTRIBUTE_ID_FILESYSTEM)) == 0; g_object_unref (file1); g_object_unref (file2); g_object_unref (info1); g_object_unref (info2); return res; } gboolean VFSTwoSameFiles (struct TVFSGlobs *globs, const char *Path1, const char *Path2) { GFile *file1, *file2; gboolean res; if (globs->file == NULL) { g_print ("(EE) VFSTwoSameFiles: globs->file == NULL !\n"); return FALSE; } file1 = g_file_resolve_relative_path (globs->file, Path1); file2 = g_file_resolve_relative_path (globs->file, Path2); if (file1 == NULL) { g_print ("(EE) VFSTwoSameFiles: g_file_resolve_relative_path() failed.\n"); return FALSE; } if (file2 == NULL) { g_print ("(EE) VFSTwoSameFiles: g_file_resolve_relative_path() failed.\n"); return FALSE; } /* FIXME: we should do some I/O test, we're esentially comparing strings at the moment */ res = g_file_equal (file1, file2); g_object_unref (file1); g_object_unref (file2); return res; } /**************************************************************************************************************************************/ /**************************************************************************************************************************************/ static void vfs_copy_progress_callback (goffset current_num_bytes, goffset total_num_bytes, gpointer user_data) { PProgressInfo ProgressInfo; int Percent; // g_print ("(II) vfs_copy_progress_callback spawned: current_num_bytes = %lu, total_num_bytes = %lu\n", current_num_bytes, total_num_bytes); if (! user_data) return; ProgressInfo = (PProgressInfo)user_data; if (gProgressProc) { if (total_num_bytes == 0) { Percent = 0; } else { Percent = (current_num_bytes * 100) / total_num_bytes; } if (gProgressProc(gPluginNumber, ProgressInfo->SourceName, ProgressInfo->TargetName, Percent) == 1) { g_cancellable_cancel (ProgressInfo->cancellable); } } } //-------------------------------------------------------------------------------------------- PConnection g_list_lookup(GList *list, gchar *value) { GList* l; PConnection Connection; for( l = g_list_first(list); l != NULL; l = l->next ) { Connection = (PConnection) l->data; // g_print("g_list_lookup: Item = %s\n", Connection->Name); if (strcmp(value, Connection->Name) == 0) { return Connection; } } return NULL; } struct TVFSGlobs * g_list_lookup_globs(GList *list, gchar *value) { GList* l; struct TVFSGlobs *globs; for( l = g_list_first(list); l != NULL; l = l->next ) { globs = (struct TVFSGlobs *) l->data; // g_print("g_list_lookup: Item = %s\n", Connection->Name); if (strcmp(value, globs->Connection->Name) == 0) { return globs; } } return NULL; } gboolean g_key_file_save_to_file(GKeyFile *key_file, const gchar *file, GError **error) { gchar *data = NULL; gsize length = 0; gboolean Result = FALSE; data = g_key_file_to_data(key_file, &length, error); if (data) { Result = g_file_set_contents(file, data, length, error); g_free(data); } return Result; } PConnection NewConnection() { PConnection Connection = (PConnection) malloc(sizeof(TConnection)); memset (Connection, 0, sizeof (TConnection)); return Connection; } void FreeConnection(PConnection Connection) { if (Connection == NULL) { return; } if (Connection->Name != NULL) { free(Connection->Name); } if (Connection->Type != NULL) { free(Connection->Type); } if (Connection->Host != NULL) { free(Connection->Host); } if (Connection->UserName != NULL) { free(Connection->UserName); } if (Connection->Password != NULL) { free(Connection->Password); } if (Connection->Path != NULL) { free(Connection->Path); } free(Connection); Connection = NULL; } void ReadConnectionList() { GKeyFile *KeyFile; GError *error = NULL; TConnection *Connection; gchar key[MAX_PATH]; KeyFile = g_key_file_new(); if (!g_key_file_load_from_file(KeyFile, gDefaultIniName, G_KEY_FILE_KEEP_COMMENTS, &error)) { g_print(error->message); g_error_free(error); } else { int i; int Count = g_key_file_get_integer(KeyFile, GROUP_NAME, "ConnectionCount", NULL); for (i = 1; i <= Count; i++) { Connection = NewConnection(); sprintf(key, "Connection%dName", i); Connection->Name = g_key_file_get_string(KeyFile, GROUP_NAME, key, NULL); sprintf(key, "Connection%dType", i); Connection->Type = g_key_file_get_string(KeyFile, GROUP_NAME, key, NULL); sprintf(key, "Connection%dHost", i); Connection->Host = g_key_file_get_string(KeyFile, GROUP_NAME, key, NULL); sprintf(key, "Connection%dUserName", i); Connection->UserName = g_key_file_get_string(KeyFile, GROUP_NAME, key, NULL); sprintf(key, "Connection%dPassword", i); Connection->Password = g_key_file_get_string(KeyFile, GROUP_NAME, key, NULL); sprintf(key, "Connection%dPath", i); Connection->Path = g_key_file_get_string(KeyFile, GROUP_NAME, key, NULL); ConnectionList = g_list_append(ConnectionList, Connection); } } g_key_file_free(KeyFile); } void WriteConnectionList() { GKeyFile *KeyFile; GError *error = NULL; GList* l; PConnection Connection; gchar key[MAX_PATH]; int i = 0; KeyFile = g_key_file_new(); for( l = g_list_first(ConnectionList); l != NULL; l = l->next ) { i++; Connection = (PConnection) l->data; if (Connection->Name != NULL) { sprintf(key, "Connection%dName", i); g_print("WriteConnectionList: %s = %s\n", key, Connection->Name); g_key_file_set_string(KeyFile, GROUP_NAME, key, Connection->Name); } if (Connection->Type != NULL) { sprintf(key, "Connection%dType", i); g_key_file_set_string(KeyFile, GROUP_NAME, key, Connection->Type); } if (Connection->Host != NULL) { sprintf(key, "Connection%dHost", i); g_key_file_set_string(KeyFile, GROUP_NAME, key, Connection->Host); } if (Connection->UserName != NULL) { sprintf(key, "Connection%dUserName", i); g_key_file_set_string(KeyFile, GROUP_NAME, key, Connection->UserName); } if (Connection->Password != NULL) { sprintf(key, "Connection%dPassword", i); g_key_file_set_string(KeyFile, GROUP_NAME, key, Connection->Password); } if (Connection->Path != NULL) { sprintf(key, "Connection%dPath", i); g_key_file_set_string(KeyFile, GROUP_NAME, key, Connection->Path); } } // save connection count g_key_file_set_integer(KeyFile, GROUP_NAME, "ConnectionCount", i); // save data to file if (!g_key_file_save_to_file(KeyFile, gDefaultIniName, &error)) { if (error) { g_print ("(EE) Impossible to write config file: %s\n", error->message); g_error_free (error); } } g_key_file_free(KeyFile); } struct TVFSGlobs * NetworkConnect(gchar *ConnectionName) { struct TVFSGlobs *globs; g_print("NetworkConnect: Enter\n"); // find in active connection list globs = (struct TVFSGlobs *) g_list_lookup_globs(ActiveConnectionList, ConnectionName); if (globs == NULL) { // find in exists connection list PConnection Connection = (PConnection) g_list_lookup(ConnectionList, ConnectionName); if (Connection != NULL) { GFile *f, *f2; GFileInfo *info; GError *error; TVFSResult res; globs = VFSNew(NULL); globs->file = NULL; globs->ftp_anonymous = FALSE; globs->Connection = Connection; g_print("NetworkConnect: Host = %s\n", Connection->Host); gchar *Host = Connection->Host; if (strcmp (Connection->UserName, cAnonymous) == 0) { globs->ftp_anonymous = TRUE; } g_print ("(II) NetworkConnect: opening URI '%s'\n", Host); f = g_file_new_for_commandline_arg (Host); while (1) { error = NULL; g_print ("(II) NetworkConnect: Before - g_file_query_info\n"); info = g_file_query_info (f, CONST_DEFAULT_QUERY_INFO_ATTRIBUTES, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &error); g_print ("(II) NetworkConnect: After - g_file_query_info\n"); /* Fallback to parent directory if specified path doesn't exist */ if (error && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) { g_print ("(II) NetworkConnect: Fallback to parent directory\n"); f2 = g_file_get_parent (f); if (f2) { g_object_unref (f); f = f2; g_error_free (error); continue; } } g_print ("(II) NetworkConnect: Before - Mount the target\n"); /* Mount the target */ if (error && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED)) { g_print ("(II) NetworkConnect: Mount the target\n"); g_error_free (error); error = NULL; res = vfs_handle_mount (globs, f); if (res != FS_FILE_OK) return NULL; else continue; } /* Any other errors --> report */ if (error) { g_print ("(EE) NetworkConnect: g_file_query_info() error: %s\n", error->message); res = g_error_to_TVFSResult (error); g_error_free (error); g_object_unref (f); return NULL; } /* everything ok? */ break; } // while globs->file = f; ActiveConnectionList = g_list_append(ActiveConnectionList, globs); g_print("NetworkConnect: Exit = True\n"); return globs; } } return globs; } gboolean AddQuickConnection(PConnection Connection) { char host[MAX_PATH], home_dir[MAX_PATH], user[MAX_PATH], pwd[MAX_PATH]; host[0] = 0; user[0] = 0; pwd[0] = 0; home_dir[0] = '/'; home_dir[1] = 0; if (gRequestProc(gPluginNumber, RT_URL, NULL, NULL, host, MAX_PATH)) { Connection->Host = strdup(host); if (gRequestProc(gPluginNumber, RT_TargetDir, NULL, NULL, home_dir, MAX_PATH)) { Connection->Path = strdup(home_dir); /* test for FTP protocol (we only enable anonymous here) */ if (strcasestr (host, "ftp://") == host) { if (gRequestProc(gPluginNumber, RT_MsgYesNo, NULL, "Use anonymous login?", NULL, MAX_PATH)) { Connection->UserName = strdup(cAnonymous); return TRUE; } } if (gRequestProc(gPluginNumber, RT_UserName, NULL, NULL, user, MAX_PATH)) { Connection->UserName = strdup(user); if (gRequestProc(gPluginNumber, RT_Password, NULL, NULL, pwd, MAX_PATH)) { Connection->Password = strdup(pwd); return TRUE; } } } } return FALSE; } gboolean QuickConnection() { g_print("QuickConnection: Enter\n"); gboolean Result = FALSE; PConnection Connection = NewConnection(); if (AddQuickConnection(Connection)) { Connection->Name = strdup(cQuickConnection); ConnectionList = g_list_append(ConnectionList, Connection); Result = (NetworkConnect(Connection->Name) != NULL); ConnectionList = g_list_remove(ConnectionList, Connection); } if (!Result) { FreeConnection(Connection); } g_print("QuickConnection: Exit\n"); return Result; } void AddConnection() { g_print("AddConnection: Enter\n"); gchar name[MAX_PATH]; gboolean bCancel = TRUE; name[0] = 0; gConnection = NewConnection(); if (gRequestProc(gPluginNumber, RT_Other, "Network", "Connection name:", name, MAX_PATH)) { unsigned int i; for(i = 0; i < strlen(name); i++) { if (name[i] == '/') name[i] = '_'; } gConnection->Name = strdup(name); if (AddQuickConnection(gConnection)) { ConnectionList = g_list_append(ConnectionList, gConnection); bCancel = FALSE; } } if (bCancel) { FreeConnection(gConnection); } else { WriteConnectionList(); } g_print("AddConnection: Exit\n"); } gchar *ExtractConnectionName(gchar *Path) { if (Path == NULL) return NULL; char *tmp; if (IS_DIR_SEP(*Path)) tmp = strdup(Path + 1); else tmp = strdup(Path); char *connection_part = strchr(tmp, 0x2f); if (connection_part == NULL) { return tmp; } char *connection_name = (char*)malloc(connection_part - tmp + 1); snprintf(connection_name, connection_part - tmp + 1, "%s", tmp); free(tmp); return connection_name; } gchar *ExtractRemoteFileName(gchar *FileName) { if (FileName == NULL) return NULL; char *tmp; if (IS_DIR_SEP(*FileName)) tmp = strdup(FileName + 1); else tmp = strdup(FileName); char *file_name_part = strchr(tmp, 0x2f); if (file_name_part == NULL) { free(tmp); return PathDelim; } char *file_name = strdup(file_name_part); free(tmp); return file_name; } struct TVFSGlobs * GetConnectionByPath(gchar *Path) { struct TVFSGlobs *globs; gchar *ConnectionName = ExtractConnectionName(Path); g_print("GetConnectionByPath: ConnectionName = %s\n", ConnectionName); globs = (struct TVFSGlobs *) g_list_lookup_globs(ActiveConnectionList, ConnectionName); if (globs == NULL) { globs = NetworkConnect(ConnectionName); free(ConnectionName); return globs; } free(ConnectionName); /* if (globs->RemotePath != NULL) { free(globs->RemotePath); } */ globs->RemotePath = ExtractRemoteFileName(Path); g_print("GetConnectionByPath: RemotePath = %s\n", globs->RemotePath); return globs; } BOOL LocalFindNext(HANDLE Hdl, WIN32_FIND_DATAA *FindData) { PListRec ListRec = (PListRec) Hdl; if (ListRec == NULL) { g_print("LocalFindNext: ListRec == NULL !\n"); return FALSE; } g_print("LocalFindNext: Path == %s\n", ListRec->Path); switch (ListRec->Index) { case 0: { g_print("LocalFindNext: Item == %s\n", cAddConnection); strcpy(FindData->cFileName, cAddConnection); break; } case 1: { g_print("LocalFindNext: Item == %s\n", cQuickConnection); strcpy(FindData->cFileName, cQuickConnection); break; } default: { if (ListRec->list == NULL) { return FALSE; } PConnection Connection = (PConnection) ListRec->list->data; g_strlcpy(FindData->cFileName, Connection->Name, MAX_PATH); ListRec->list = g_list_next(ListRec->list); return TRUE; } } g_print("LocalFindNext: Exit\n"); ListRec->Index++; return TRUE; } BOOL RemoteFindNext(HANDLE Hdl, WIN32_FIND_DATAA *FindData) { PListRec ListRec; struct TVFSGlobs *globs; char *sDir; GError *error; GFileInfo *info; GFile *f; g_print ("(EE) RemoteFindNext: Enter\n"); ListRec = (PListRec) Hdl; globs = ListRec->globs; sDir = ExtractRemoteFileName(ListRec->Path); if (globs->file == NULL) { g_print ("(EE) RemoteFindNext: globs->file == NULL !\n"); return FALSE; } if (globs->enumerator == NULL) { g_print ("(EE) RemoteFindNext: globs->enumerator == NULL !\n"); return FALSE; } error = NULL; info = g_file_enumerator_next_file (globs->enumerator, NULL, &error); if (error) { g_print ("(EE) RemoteFindNext: g_file_enumerator_next_file() error: %s\n", error->message); g_error_free (error); return FALSE; } if (! error && ! info) return FALSE; f = g_file_get_child (globs->enumerated_file, g_file_info_get_name (info)); GFileInfoToWin32FindData(f, info, FindData); g_object_unref (f); g_object_unref (info); return TRUE; } // Export functions-------------------------------------------------------------------------------------- int DCPCALL FsInit(int PluginNr,tProgressProc pProgressProc, tLogProc pLogProc,tRequestProc pRequestProc) { gProgressProc = pProgressProc; gLogProc = pLogProc; gRequestProc = pRequestProc; gPluginNumber = PluginNr; ActiveConnectionList = NULL; ConnectionList = NULL; g_type_init(); return 0; } HANDLE DCPCALL FsFindFirst(char* Path,WIN32_FIND_DATAA *FindData) { PListRec ListRec = (PListRec) malloc(sizeof(TListRec)); memset(ListRec, 0, sizeof(TListRec)); ListRec->Path = Path; ListRec->Index = 0; HANDLE Handle = (HANDLE) ListRec; memset(FindData, 0, sizeof(WIN32_FIND_DATAA)); if (strcmp(Path, PathDelim) == 0) { ListRec->list = g_list_first(ConnectionList); LocalFindNext(Handle, FindData); return Handle; } else { ListRec->globs = GetConnectionByPath(Path); if (ListRec->globs == NULL) { free(ListRec); return (HANDLE)(-1); } VFSChangeDir(ListRec->globs, ListRec->globs->RemotePath); g_print("Call RemoteFindNext = %s\n", ListRec->globs->RemotePath); if (!RemoteFindNext(Handle, FindData)) { free(ListRec); return (HANDLE)(-1); } return Handle; } } BOOL DCPCALL FsFindNext(HANDLE Hdl,WIN32_FIND_DATAA *FindData) { PListRec ListRec = (PListRec) Hdl; memset(FindData, 0, sizeof(WIN32_FIND_DATAA)); if (strcmp(ListRec->Path, PathDelim) == 0) { return LocalFindNext(Hdl, FindData); } else { return RemoteFindNext(Hdl, FindData); } } int DCPCALL FsFindClose(HANDLE Hdl) { PListRec ListRec; GError *error; TVFSResult res; ListRec = (PListRec) Hdl; if (ListRec->globs == NULL) { g_print ("(EE) FsFindClose: ListRec->globs == NULL !\n"); return FS_FILE_NOTSUPPORTED; } if (ListRec->globs->file == NULL) { g_print ("(EE) FsFindClose: ListRec->globs->file == NULL !\n"); return FS_FILE_NOTSUPPORTED; } if (ListRec->globs->enumerator == NULL) { g_print ("(EE) FsFindClose: ListRec->globs->enumerator == NULL !\n"); return FS_FILE_NOTSUPPORTED; } g_print ("(II) FsFindClose\n"); error = NULL; g_file_enumerator_close (ListRec->globs->enumerator, NULL, &error); g_object_unref (ListRec->globs->enumerator); ListRec->globs->enumerator = NULL; g_object_unref (ListRec->globs->enumerated_file); ListRec->globs->enumerated_file = NULL; if (error) { g_print ("(EE) FsFindClose: g_file_enumerator_close() error: %s\n", error->message); res = g_error_to_TVFSResult (error); g_error_free (error); return res; } return FS_FILE_OK; } BOOL DCPCALL FsMkDir(char* Path) { struct TVFSGlobs *globs; GFile *f; GError *error; globs = GetConnectionByPath(Path); if (globs == NULL) { g_print ("(EE) FsMkDir: globs == NULL !\n"); return FALSE; } if (globs->file == NULL) { g_print ("(EE) FsMkDir: globs->file == NULL !\n"); return FALSE; } f = g_file_resolve_relative_path (globs->file, globs->RemotePath); if (f == NULL) { g_print ("(EE) FsMkDir: g_file_resolve_relative_path() failed.\n"); return FALSE; } error = NULL; g_file_make_directory (f, NULL, &error); g_object_unref (f); if (error) { g_print ("(EE) FsMkDir: g_file_make_directory() error: %s\n", error->message); g_error_free (error); return FALSE; } return TRUE; } BOOL DCPCALL FsRemoveDir(char* RemoteName) { struct TVFSGlobs *globs; globs = GetConnectionByPath(RemoteName); return (VFSRemove(globs, globs->RemotePath) == FS_FILE_OK); } int DCPCALL FsRenMovFile(char* OldName,char* NewName,BOOL Move, BOOL OverWrite,RemoteInfoStruct* ri) { struct TVFSGlobs *globs; GFile *src, *dst; GError *error; TVFSResult res; char *sSrcName; char *sDstName; globs = GetConnectionByPath(OldName); if (globs == NULL) { g_print ("(EE) FsRenMovFile: globs == NULL !\n"); return FS_FILE_NOTSUPPORTED; } if (globs->file == NULL) { g_print ("(EE) FsRenMovFile: globs->file == NULL !\n"); return FS_FILE_NOTSUPPORTED; } sSrcName = globs->RemotePath; sDstName = ExtractRemoteFileName(NewName); src = g_file_resolve_relative_path (globs->file, sSrcName); if (src == NULL) { g_print ("(EE) FsRenMovFile: g_file_resolve_relative_path() failed.\n"); return FS_FILE_NOTFOUND; } g_print ("FsRenMovFile: '%s' --> '%s'\n", sSrcName, sDstName); error = NULL; g_file_set_display_name (src, sDstName, NULL, &error); if (error) { g_print ("(WW) FsRenMovFile: g_file_set_display_name() failed (\"%s\"), using fallback g_file_move()\n", error->message); g_error_free (error); dst = g_file_resolve_relative_path (src, sDstName); if (dst == NULL) { g_print ("(EE) FsRenMovFile: g_file_resolve_relative_path() failed.\n"); g_object_unref (src); return FS_FILE_NOTFOUND; } error = NULL; g_file_move (src, dst, G_FILE_COPY_NO_FALLBACK_FOR_MOVE, NULL, NULL, NULL, &error); if (error) { g_print ("(EE) FsRenMovFile: g_file_move() error: %s\n", error->message); res = g_error_to_TVFSResult (error); g_error_free (error); g_object_unref (src); g_object_unref (dst); return res; } g_object_unref (dst); } g_object_unref (src); return FS_FILE_OK; } int DCPCALL FsGetFile(char* RemoteName,char* LocalName,int CopyFlags, RemoteInfoStruct* ri) { struct TVFSGlobs *globs; GFile *src, *dst; GError *error; TVFSResult res; PProgressInfo ProgressInfo; globs = GetConnectionByPath(RemoteName); if (globs == NULL) { g_print ("(EE) FsGetFile: globs == NULL !\n"); return FS_FILE_NOTSUPPORTED; } if (globs->file == NULL) { g_print ("(EE) FsGetFile: globs->file == NULL !\n"); return FS_FILE_NOTSUPPORTED; } ProgressInfo = (PProgressInfo) g_malloc(sizeof(TProgressInfo)); g_strlcpy(ProgressInfo->SourceName, globs->RemotePath, MAX_PATH); g_strlcpy(ProgressInfo->TargetName, LocalName, MAX_PATH); g_print ("(II) FsGetFile: '%s' --> '%s'\n", ProgressInfo->SourceName, ProgressInfo->TargetName); src = g_file_resolve_relative_path (globs->file, ProgressInfo->SourceName); if (src == NULL) { g_print ("(EE) FsGetFile: g_file_resolve_relative_path() failed.\n"); g_free(ProgressInfo); return FS_FILE_NOTFOUND; } dst = g_file_new_for_path (ProgressInfo->TargetName); if (dst == NULL) { g_print ("(EE) FsGetFile: g_file_resolve_relative_path() failed.\n"); g_free(ProgressInfo); return FS_FILE_NOTFOUND; } ProgressInfo->cancellable = g_cancellable_new (); res = FS_FILE_OK; error = NULL; g_file_copy (src, dst, TUXCMD_DEFAULT_COPY_FLAGS, ProgressInfo->cancellable, vfs_copy_progress_callback, ProgressInfo, &error); if (error) { g_print ("(EE) FsGetFile: g_file_copy() error: %s\n", error->message); // res = g_error_to_TVFSResult (error); if (error->code == G_IO_ERROR_CANCELLED) res = FS_FILE_USERABORT; else res = FS_FILE_READERROR; g_error_free (error); } g_object_unref (ProgressInfo->cancellable); g_free(ProgressInfo); g_object_unref (src); g_object_unref (dst); return res; } int DCPCALL FsPutFile(char* LocalName,char* RemoteName,int CopyFlags) { struct TVFSGlobs *globs; GFile *src, *dst; GError *error; TVFSResult res; PProgressInfo ProgressInfo; globs = GetConnectionByPath(RemoteName); if (globs == NULL) { g_print ("(EE) FsPutFile: globs == NULL !\n"); return FS_FILE_NOTSUPPORTED; } if (globs->file == NULL) { g_print ("(EE) FsPutFile: globs->file == NULL !\n"); return FS_FILE_NOTSUPPORTED; } ProgressInfo = (PProgressInfo) g_malloc(sizeof(TProgressInfo)); g_strlcpy(ProgressInfo->SourceName, LocalName, MAX_PATH); g_strlcpy(ProgressInfo->TargetName, globs->RemotePath, MAX_PATH); g_print ("(II) FsPutFile: '%s' --> '%s'\n", ProgressInfo->SourceName, ProgressInfo->TargetName); src = g_file_new_for_path (ProgressInfo->SourceName); if (src == NULL) { g_print ("(EE) FsPutFile: g_file_resolve_relative_path() failed.\n"); g_free(ProgressInfo); return FS_FILE_NOTFOUND; } dst = g_file_resolve_relative_path (globs->file, ProgressInfo->TargetName); if (dst == NULL) { g_print ("(EE) FsPutFile: g_file_resolve_relative_path() failed.\n"); g_free(ProgressInfo); return FS_FILE_NOTFOUND; } ProgressInfo->cancellable = g_cancellable_new (); res = FS_FILE_OK; error = NULL; /* FIXME: Appending not supported */ g_file_copy (src, dst, TUXCMD_DEFAULT_COPY_FLAGS, ProgressInfo->cancellable, vfs_copy_progress_callback, ProgressInfo, &error); if (error) { g_print ("(EE) FsPutFile: g_file_copy() error: %s\n", error->message); // res = g_error_to_TVFSResult (error); if (error->code == G_IO_ERROR_CANCELLED) res = FS_FILE_USERABORT; else res = FS_FILE_WRITEERROR; g_error_free (error); } g_object_unref (ProgressInfo->cancellable); g_free(ProgressInfo); g_object_unref (src); g_object_unref (dst); return res; } int DCPCALL FsExecuteFile(HWND MainWin,char* RemoteName,char* Verb) { g_print("FsExecuteFile: Item = %s, Verb = %s\n", RemoteName + 1, Verb); if (strcmp(Verb,"open") == 0) { if (strrchr(RemoteName, 0x2f) == RemoteName) // root path { if (strchr(RemoteName, 0x3c) == NULL) // connection { struct TVFSGlobs *globs = NetworkConnect(RemoteName + 1); if (globs != NULL) { // go to Connection->Path g_strlcat(RemoteName, globs->Connection->Path, MAX_PATH); return FS_EXEC_SYMLINK; } return FS_EXEC_ERROR; } else // special item { if (strcmp(RemoteName + 1, cAddConnection) == 0) { AddConnection(); } else if (strcmp(RemoteName + 1, cQuickConnection) == 0) { if (QuickConnection()) return FS_EXEC_SYMLINK; else return FS_EXEC_ERROR; } } } // root path return FS_EXEC_OK; } else if (strcmp(Verb,"properties") == 0) { return FS_EXEC_OK; } else if (strstr(Verb, "chmod ") != NULL) { struct TVFSGlobs *globs; uint Mode = (uint) strtol(strchr(Verb, 0x20) + 1, NULL, 8); globs = GetConnectionByPath(RemoteName); if (VFSChmod(globs, globs->RemotePath, Mode) != FS_FILE_OK) { return FS_EXEC_ERROR; } } return FS_EXEC_OK; } BOOL DCPCALL FsDeleteFile(char* RemoteName) { if (strrchr(RemoteName, 0x2f) == RemoteName) // root path { if (strchr(RemoteName, 0x3c) == NULL) // connection { // find in exists connection list PConnection Connection = (PConnection) g_list_lookup(ConnectionList, RemoteName + 1); if (Connection != NULL) { ConnectionList = g_list_remove(ConnectionList, Connection); WriteConnectionList(); return TRUE; } } return FALSE; } struct TVFSGlobs *globs = GetConnectionByPath(RemoteName); return (VFSRemove(globs, globs->RemotePath) == FS_FILE_OK); } BOOL DCPCALL FsSetTime(char* RemoteName,FILETIME *CreationTime, FILETIME *LastAccessTime,FILETIME *LastWriteTime) { struct TVFSGlobs *globs; GFile *f; GError *error; long mtime; long atime; long ctime; globs = GetConnectionByPath(RemoteName); if (globs == NULL) { g_print ("(EE) FsSetTime: globs == NULL !\n"); return FALSE; } if (globs->file == NULL) { g_print ("(EE) FsSetTime: globs->file == NULL !\n"); return FALSE; } f = g_file_resolve_relative_path (globs->file, globs->RemotePath); if (f == NULL) { g_print ("(EE) FsSetTime: g_file_resolve_relative_path() failed.\n"); return FALSE; } ctime = FileTimeToUnixTime(CreationTime); atime = FileTimeToUnixTime(LastAccessTime); mtime = FileTimeToUnixTime(LastWriteTime); error = NULL; g_file_set_attribute_uint64 (f, G_FILE_ATTRIBUTE_TIME_MODIFIED, mtime, G_FILE_QUERY_INFO_NONE, NULL, &error); if (error) { g_print ("(EE) FsSetTime: g_file_set_attribute_uint64() error: %s\n", error->message); g_error_free (error); g_object_unref (f); return FALSE; } error = NULL; g_file_set_attribute_uint64 (f, G_FILE_ATTRIBUTE_TIME_ACCESS, atime, G_FILE_QUERY_INFO_NONE, NULL, &error); if (error) { g_print ("(EE) FsSetTime: g_file_set_attribute_uint64() error: %s\n", error->message); g_error_free (error); /* Silently drop the error, atime is not commonly supported on most systems */ } error = NULL; g_file_set_attribute_uint64 (f, G_FILE_ATTRIBUTE_TIME_CREATED, ctime, G_FILE_QUERY_INFO_NONE, NULL, &error); if (error) { g_print ("(EE) FsSetTime: g_file_set_attribute_uint64() error: %s\n", error->message); g_error_free (error); /* Silently drop the error, ctime is not commonly supported on most systems */ } g_object_unref (f); return TRUE; } BOOL DCPCALL FsDisconnect(char *DisconnectRoot) { struct TVFSGlobs *globs; g_print("FsDisconnect: DisconnectRoot == %s\n", DisconnectRoot); globs = (struct TVFSGlobs *) g_list_lookup_globs(ActiveConnectionList, DisconnectRoot); if (globs != NULL) { if (globs->file) g_object_unref (globs->file); globs->file = NULL; ActiveConnectionList = g_list_remove(ActiveConnectionList, globs); free (globs); return TRUE; } return FALSE; } void DCPCALL FsSetDefaultParams(FsDefaultParamStruct* dps) { // use default location, but our own ini file name g_strlcpy(gDefaultIniName, dps->DefaultIniName, MAX_PATH - 1); gchar* tmp = strrchr(gDefaultIniName, 0x2f); if (tmp) { tmp[1] = 0; g_strlcat(gDefaultIniName, cDefaultIniName, sizeof(gDefaultIniName) - 1); } g_print ("gDefaultIniName: %s\n", gDefaultIniName); ReadConnectionList(); } void DCPCALL FsGetDefRootName(char* DefRootName,int maxlen) { g_strlcpy(DefRootName, "Network", maxlen); } //-------------------------------------------------- ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/gvfs/COPYING.txt��������������������������������������������������������0000644�0001750�0001750�00000043103�12014201074�017601� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. <one line to give the program's name and a brief idea of what it does.> Copyright (C) <year> <name of author> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. <signature of Ty Coon>, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/samba/������������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016063� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/samba/COPYING.LESSER.txt������������������������������������������������0000644�0001750�0001750�00000016726�12014201074�020726� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library.������������������������������������������doublecmd-0.5.8/plugins/wfx/samba/COPYING.GPL.txt���������������������������������������������������0000644�0001750�0001750�00000104500�12014201074�020337� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. <one line to give the program's name and a brief idea of what it does.> Copyright (C) <year> <name of author> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: <program> Copyright (C) <year> <name of author> This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/samba/lib/��������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016631� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/samba/src/��������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016652� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/samba/src/smbfunc.pas���������������������������������������������������0000644�0001750�0001750�00000042462�12014201074�021006� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ Double commander ------------------------------------------------------------------------- WFX plugin for working with Common Internet File System (CIFS) Copyright (C) 2011 Koblov Alexander (Alexx2000@mail.ru) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit SmbFunc; {$mode objfpc}{$H+} interface uses Classes, SysUtils, WfxPlugin, Extension; function FsInit(PluginNr: Integer; pProgressProc: TProgressProc; pLogProc: TLogProc; pRequestProc: TRequestProc): Integer; cdecl; function FsFindFirst(Path: PAnsiChar; var FindData: TWin32FindData): THandle; cdecl; function FsFindNext(Hdl: THandle; var FindData: TWin32FindData): BOOL; cdecl; function FsFindClose(Hdl: THandle): Integer; cdecl; function FsRenMovFile(OldName, NewName: PAnsiChar; Move, OverWrite: BOOL; RemoteInfo: pRemoteInfo): Integer; cdecl; function FsGetFile(RemoteName, LocalName: PAnsiChar; CopyFlags: Integer; RemoteInfo: pRemoteInfo): Integer; cdecl; function FsPutFile(LocalName, RemoteName: PAnsiChar; CopyFlags: Integer): Integer; cdecl; function FsDeleteFile(RemoteName: PAnsiChar): BOOL; cdecl; function FsMkDir(RemoteDir: PAnsiChar): BOOL; cdecl; function FsRemoveDir(RemoteName: PAnsiChar): BOOL; cdecl; function FsSetAttr(RemoteName: PAnsiChar; NewAttr: Integer): BOOL; cdecl; function FsSetTime(RemoteName: PAnsiChar; CreationTime, LastAccessTime, LastWriteTime: PFileTime): BOOL; cdecl; procedure FsGetDefRootName(DefRootName: PAnsiChar; MaxLen: Integer); cdecl; { Extension API } procedure ExtensionInitialize(StartupInfo: PExtensionStartupInfo); cdecl; var Message: AnsiString; WorkGroup: array[0..MAX_PATH-1] of AnsiChar; UserName: array[0..MAX_PATH-1] of AnsiChar; Password: array[0..MAX_PATH-1] of AnsiChar; ExtensionStartupInfo: TExtensionStartupInfo; implementation uses Unix, BaseUnix, UnixType, StrUtils, SmbAuthDlg, libsmbclient; const SMB_BUFFER_SIZE = 524288; type PSambaHandle = ^TSambaHandle; TSambaHandle = record Path: String; Handle: LongInt; end; var ProgressProc: TProgressProc; LogProc: TLogProc; RequestProc: TRequestProc; PluginNumber: Integer; Auth: Boolean = False; Abort: Boolean = False; NeedAuth: Boolean = False; function FileTimeToUnixTime(ft: TFileTime): time_t; var UnixTime: Int64; begin UnixTime:= ft.dwHighDateTime; UnixTime:= (UnixTime shl 32) or ft.dwLowDateTime; UnixTime:= (UnixTime - 116444736000000000) div 10000000; Result:= time_t(UnixTime); end; function UnixTimeToFileTime(mtime: time_t): TFileTime; var FileTime: Int64; begin FileTime:= Int64(mtime) * 10000000 + 116444736000000000; Result.dwLowDateTime:= (FileTime and $FFFF); Result.dwHighDateTime:= (FileTime shr $20); end; procedure WriteError(const FuncName: String); begin WriteLn(FuncName + ': ', SysErrorMessage(GetLastOSError)); end; procedure smbc_get_auth_data(server, share: PAnsiChar; wg: PAnsiChar; wglen: LongInt; un: PAnsiChar; unlen: LongInt; pw: PAnsiChar; pwlen: LongInt); cdecl; begin Auth:= True; if NeedAuth then begin Abort:= True; // Set query resource if (server = nil) then Message:= StrPas(share) else Message:= StrPas(server) + PathDelim + StrPas(share); // Set authentication data StrLCopy(WorkGroup, wg, wglen); StrLCopy(UserName, un, unlen); StrLCopy(Password, pw, pwlen); // Query authentication data if ShowSmbAuthDlg then begin Abort:= False; // Get authentication data StrLCopy(wg, WorkGroup, wglen); StrLCopy(un, UserName, unlen); StrLCopy(pw, Password, pwlen); end; end else begin // If has saved workgroup then use it if StrLen(WorkGroup) <> 0 then StrLCopy(wg, WorkGroup, wglen); // If has saved user name then use it if StrLen(UserName) <> 0 then StrLCopy(un, UserName, unlen); // If has saved password then use it if StrLen(Password) <> 0 then StrLCopy(pw, Password, pwlen); end; end; function BuildNetworkPath(const Path: String): String; var I, C: Integer; begin C:= 0; if Path = PathDelim then Exit('smb://'); Result := Path; // Don't check last symbol for I := 1 to Length(Result) - 1 do begin if (Result[I] = PathDelim) then Inc(C); end; if (C < 2) then Result:= 'smb:/' + Result else begin I:= PosEx(PathDelim, Result, 2); Result:= 'smb:/' + Copy(Result, I, MaxInt); end; end; function ForceAuth(Path: PAnsiChar): String; var un: array[0..MAX_PATH-1] of AnsiChar; pw: array[0..MAX_PATH-1] of AnsiChar; begin Result:= BuildNetworkPath(Path); // Use by default saved user name and password StrLCopy(un, UserName, MAX_PATH); StrLCopy(pw, Password, MAX_PATH); // Query auth data smbc_get_auth_data(nil, PAnsiChar(Result), WorkGroup, MAX_PATH, un, MAX_PATH, pw, MAX_PATH); if (Abort = False) and (un <> '') then begin if StrLen(WorkGroup) = 0 then Result:= 'smb://' + un + ':' + pw + '@' + Copy(Result, 7, MAX_PATH) else Result:= 'smb://' + WorkGroup + ';' + un + ':' + pw + '@' + Copy(Result, 7, MAX_PATH); end; end; function FsInit(PluginNr: Integer; pProgressProc: tProgressProc; pLogProc: tLogProc; pRequestProc: tRequestProc): Integer; cdecl; begin if not LoadSambaLibrary then begin pRequestProc(PluginNr, RT_MsgOK, nil, 'Can not load "libsmbclient" library!', nil, 0); Exit(-1); end; ProgressProc := pProgressProc; LogProc := pLogProc; RequestProc := pRequestProc; PluginNumber := PluginNr; FillChar(WorkGroup, SizeOf(WorkGroup), #0); FillChar(UserName, SizeOf(UserName), #0); FillChar(Password, SizeOf(Password), #0); Result := smbc_init(@smbc_get_auth_data, 0); if Result < 0 then WriteError('smbc_init'); end; function FsFindFirst(Path: PAnsiChar; var FindData: TWin32FindData): THandle; cdecl; var NetworkPath: String; SambaHandle: PSambaHandle; Handle: LongInt; begin Abort:= False; NetworkPath:= BuildNetworkPath(Path); repeat Auth:= False; Handle:= smbc_opendir(PChar(NetworkPath)); NeedAuth:= (Handle = -1); // Sometimes smbc_get_auth_data don't called automatically // so we call it manually if NeedAuth and (Auth = False) then begin NetworkPath:= ForceAuth(Path); end; until not NeedAuth or Abort; if Handle < 0 then begin WriteError('smbc_opendir'); Result:= wfxInvalidHandle; end else begin New(SambaHandle); SambaHandle^.Path:= IncludeTrailingPathDelimiter(NetworkPath); SambaHandle^.Handle:= Handle; Result:= THandle(SambaHandle); FsFindNext(Result, FindData); end; end; function FsFindNext(Hdl: THandle; var FindData: TWin32FindData): BOOL; cdecl; var dirent: psmbc_dirent; FileInfo: BaseUnix.Stat; SambaHandle: PSambaHandle absolute Hdl; Mode: array[0..7] of Byte; begin Result:= True; dirent := smbc_readdir(SambaHandle^.Handle); if (dirent = nil) then Exit(False); FillByte(FindData, SizeOf(TWin32FindData), 0); StrLCopy(FindData.cFileName, dirent^.name, dirent^.namelen); if dirent^.smbc_type in [SMBC_WORKGROUP, SMBC_SERVER, SMBC_FILE_SHARE] then FindData.dwFileAttributes:= FILE_ATTRIBUTE_DIRECTORY; if dirent^.smbc_type in [SMBC_DIR, SMBC_FILE, SMBC_LINK] then begin if smbc_stat(PChar(SambaHandle^.Path + FindData.cFileName), @FileInfo) = 0 then begin FindData.nFileSizeLow := (FileInfo.st_size and MAXDWORD); FindData.nFileSizeHigh := (FileInfo.st_size shr $20); FindData.ftLastAccessTime:= UnixTimeToFileTime(FileInfo.st_atime); FindData.ftCreationTime:= UnixTimeToFileTime(FileInfo.st_ctime); FindData.ftLastWriteTime:= UnixTimeToFileTime(FileInfo.st_mtime); end; if smbc_getxattr(PChar(SambaHandle^.Path + FindData.cFileName), 'system.dos_attr.mode', @Mode, SizeOf(Mode)) >= 0 then begin if (Mode[3] = 0) then FindData.dwFileAttributes:= Mode[2] - SMBC_DOS_MODE_DIRECTORY - SMBC_DOS_MODE_ARCHIVE else case Mode[2] of 48: FindData.dwFileAttributes:= 0; 49: FindData.dwFileAttributes:= Mode[3] - SMBC_DOS_MODE_ARCHIVE; 50: FindData.dwFileAttributes:= Mode[3] - SMBC_DOS_MODE_DIRECTORY; 51: FindData.dwFileAttributes:= Mode[3]; end; end; end; end; function FsFindClose(Hdl: THandle): Integer; cdecl; var SambaHandle: PSambaHandle absolute Hdl; begin Result:= smbc_closedir(SambaHandle^.Handle); if Result < 0 then WriteError('smbc_closedir'); Dispose(SambaHandle); end; function FsRenMovFile(OldName, NewName: PAnsiChar; Move, OverWrite: BOOL; RemoteInfo: pRemoteInfo): Integer; cdecl; var OldFileName, NewFileName: String; Buffer: Pointer = nil; BufferSize: LongWord; fdOldFile: LongInt; fdNewFile: LongInt; dwRead: LongWord; Written: Int64; FileSize: Int64; Percent: LongInt; begin OldFileName:= BuildNetworkPath(OldName); NewFileName:= BuildNetworkPath(NewName); if Move then begin if smbc_rename(PChar(OldFileName), PChar(NewFileName)) < 0 then Exit(-1); end else begin BufferSize:= SMB_BUFFER_SIZE; Buffer:= GetMem(BufferSize); try // Open source file fdOldFile:= smbc_open(PChar(OldFileName), O_RDONLY, 0); if (fdOldFile < 0) then Exit(FS_FILE_READERROR); // Open target file fdNewFile:= smbc_open(PChar(NewFileName), O_CREAT or O_RDWR or O_TRUNC, RemoteInfo^.Attr); if (fdNewFile < 0) then Exit(FS_FILE_WRITEERROR); // Get source file size FileSize:= smbc_lseek(fdOldFile, 0, SEEK_END); smbc_lseek(fdOldFile, 0, SEEK_SET); Written:= 0; // Copy data repeat dwRead:= smbc_read(fdOldFile, Buffer, BufferSize); if (fpgeterrno <> 0) then Exit(FS_FILE_READERROR); if (dwRead > 0) then begin if smbc_write(fdNewFile, Buffer, dwRead) <> dwRead then Exit(FS_FILE_WRITEERROR); if (fpgeterrno <> 0) then Exit(FS_FILE_WRITEERROR); Written:= Written + dwRead; // Calculate percent Percent:= (Written * 100) div FileSize; // Update statistics if ProgressProc(PluginNumber, PChar(OldFileName), PChar(NewFileName), Percent) = 1 then Exit(FS_FILE_USERABORT); end; until (dwRead = 0); finally if Assigned(Buffer) then FreeMem(Buffer); if not (fdOldFile < 0) then smbc_close(fdOldFile); if not (fdNewFile < 0) then smbc_close(fdNewFile); end; end; Result:= FS_FILE_OK; end; function FsGetFile(RemoteName, LocalName: PAnsiChar; CopyFlags: Integer; RemoteInfo: pRemoteInfo): Integer; cdecl; var OldFileName: String; Buffer: Pointer = nil; BufferSize: LongWord; fdOldFile: LongInt; fdNewFile: LongInt; dwRead: LongWord; Written: Int64; FileSize: Int64; Percent: LongInt; begin OldFileName:= BuildNetworkPath(RemoteName); BufferSize:= SMB_BUFFER_SIZE; Buffer:= GetMem(BufferSize); try // Open source file fdOldFile:= smbc_open(PChar(OldFileName), O_RDONLY, 0); if (fdOldFile < 0) then Exit(FS_FILE_READERROR); // Open target file fdNewFile:= fpOpen(PChar(LocalName), O_CREAT or O_RDWR or O_TRUNC, $1A4); // $1A4 = &644 if (fdNewFile < 0) then Exit(FS_FILE_WRITEERROR); // Get source file size FileSize:= smbc_lseek(fdOldFile, 0, SEEK_END); smbc_lseek(fdOldFile, 0, SEEK_SET); Written:= 0; // Copy data repeat dwRead:= smbc_read(fdOldFile, Buffer, BufferSize); if (fpgeterrno <> 0) then Exit(FS_FILE_READERROR); if (dwRead > 0) then begin if fpWrite(fdNewFile, Buffer^, dwRead) <> dwRead then Exit(FS_FILE_WRITEERROR); if (fpgeterrno <> 0) then Exit(FS_FILE_WRITEERROR); Written:= Written + dwRead; // Calculate percent Percent:= (Written * 100) div FileSize; // Update statistics if ProgressProc(PluginNumber, PChar(OldFileName), LocalName, Percent) = 1 then Exit(FS_FILE_USERABORT); end; until (dwRead = 0); finally if Assigned(Buffer) then FreeMem(Buffer); if not (fdOldFile < 0) then smbc_close(fdOldFile); if not (fdNewFile < 0) then fpClose(fdNewFile); end; Result:= FS_FILE_OK; end; function FsPutFile(LocalName, RemoteName: PAnsiChar; CopyFlags: Integer): Integer; cdecl; var NewFileName: String; Buffer: Pointer = nil; BufferSize: LongWord; fdOldFile: LongInt; fdNewFile: LongInt; dwRead: LongWord; Written: Int64; FileSize: Int64; Percent: LongInt; begin NewFileName:= BuildNetworkPath(RemoteName); begin BufferSize:= SMB_BUFFER_SIZE; Buffer:= GetMem(BufferSize); try // Open source file fdOldFile:= fpOpen(LocalName, O_RDONLY, 0); if (fdOldFile < 0) then Exit(FS_FILE_READERROR); // Open target file fdNewFile:= smbc_open(PChar(NewFileName), O_CREAT or O_RDWR or O_TRUNC, 0); if (fdNewFile < 0) then Exit(FS_FILE_WRITEERROR); // Get source file size FileSize:= fpLseek(fdOldFile, 0, SEEK_END); fpLseek(fdOldFile, 0, SEEK_SET); Written:= 0; // Copy data repeat dwRead:= fpRead(fdOldFile, Buffer^, BufferSize); if (fpgeterrno <> 0) then Exit(FS_FILE_READERROR); if (dwRead > 0) then begin if smbc_write(fdNewFile, Buffer, dwRead) <> dwRead then Exit(FS_FILE_WRITEERROR); if (fpgeterrno <> 0) then Exit(FS_FILE_WRITEERROR); Written:= Written + dwRead; // Calculate percent Percent:= (Written * 100) div FileSize; // Update statistics if ProgressProc(PluginNumber, LocalName, PChar(NewFileName), Percent) = 1 then Exit(FS_FILE_USERABORT); end; until (dwRead = 0); finally if Assigned(Buffer) then FreeMem(Buffer); if not (fdOldFile < 0) then fpClose(fdOldFile); if not (fdNewFile < 0) then smbc_close(fdNewFile); end; end; Result:= FS_FILE_OK; end; function FsDeleteFile(RemoteName: PAnsiChar): BOOL; cdecl; var FileName: String; begin FileName:= BuildNetworkPath(RemoteName); Result:= smbc_unlink(PChar(FileName)) = 0; end; function FsMkDir(RemoteDir: PAnsiChar): BOOL; cdecl; var NewDir: String; begin NewDir:= BuildNetworkPath(RemoteDir); Result:= smbc_mkdir(PChar(NewDir), $1FF) = 0; // $1FF = &0777 end; function FsRemoveDir(RemoteName: PAnsiChar): BOOL; cdecl; var RemDir: String; begin RemDir:= BuildNetworkPath(RemoteName); Result:= smbc_rmdir(PChar(RemDir)) = 0; end; function FsSetAttr(RemoteName: PAnsiChar; NewAttr: Integer): BOOL; cdecl; var FileName: String; Mode: array[0..7] of Byte; begin Mode[0]:= 48; Mode[1]:= 120; FileName:= BuildNetworkPath(RemoteName); if (NewAttr and SMBC_DOS_MODE_DIRECTORY <> 0) and (NewAttr and SMBC_DOS_MODE_ARCHIVE <> 0) then begin Mode[2]:= 51; Mode[3]:= NewAttr; end else if (NewAttr and SMBC_DOS_MODE_ARCHIVE <> 0) then begin Mode[2]:= 50; Mode[3]:= NewAttr + SMBC_DOS_MODE_DIRECTORY; end else if (NewAttr and SMBC_DOS_MODE_DIRECTORY <> 0) then begin Mode[2]:= 49; Mode[3]:= NewAttr + SMBC_DOS_MODE_ARCHIVE; end else begin Mode[2]:= NewAttr + SMBC_DOS_MODE_DIRECTORY + SMBC_DOS_MODE_ARCHIVE; Mode[3]:= 0; end; Result:= (smbc_setxattr(PChar(FileName), 'system.dos_attr.mode', @Mode, SizeOf(Mode), 0) >= 0); end; function FsSetTime(RemoteName: PAnsiChar; CreationTime, LastAccessTime, LastWriteTime: PFileTime): BOOL; cdecl; var FileName: String; tbuf: array[0..1] of timeval; FileInfo: BaseUnix.Stat; begin FileName:= BuildNetworkPath(RemoteName); if (LastAccessTime = nil) or (LastWriteTime = nil) then begin if smbc_stat(PChar(FileName), @FileInfo) < 0 then Exit(False); if (LastAccessTime = nil) then tbuf[0].tv_sec:= FileInfo.st_atime else tbuf[0].tv_sec:= FileTimeToUnixTime(LastAccessTime^); if (LastWriteTime = nil) then tbuf[1].tv_sec:= FileInfo.st_mtime else tbuf[1].tv_sec:= FileTimeToUnixTime(LastWriteTime^); end else begin tbuf[0].tv_sec:= FileTimeToUnixTime(LastAccessTime^); tbuf[1].tv_sec:= FileTimeToUnixTime(LastWriteTime^); end; Result:= (smbc_utimes(PChar(FileName), @tbuf) = 0); end; procedure FsGetDefRootName(DefRootName: PAnsiChar; MaxLen: Integer); cdecl; begin StrPLCopy(DefRootName, 'Windows Network', MaxLen); end; procedure ExtensionInitialize(StartupInfo: PExtensionStartupInfo); cdecl; begin ExtensionStartupInfo:= StartupInfo^; end; end. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/samba/src/smbauthdlg.lfm������������������������������������������������0000755�0001750�0001750�00000024744�11622223034�021510� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������object DialogBox: TDialogBox Left = 369 Height = 185 Top = 214 Width = 354 AutoSize = True BorderStyle = bsDialog Caption = 'Authentication' ChildSizing.LeftRightSpacing = 8 ChildSizing.TopBottomSpacing = 8 ClientHeight = 185 ClientWidth = 354 OnShow = DialogBoxShow Position = poScreenCenter LCLVersion = '0.9.30' object lblUserName: TLabel AnchorSideLeft.Control = lblMessage AnchorSideTop.Control = edtUserName AnchorSideTop.Side = asrCenter Left = 66 Height = 18 Top = 54 Width = 69 Caption = 'User name:' ParentColor = False end object edtUserName: TEdit AnchorSideLeft.Control = lblUserName AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblMessage AnchorSideTop.Side = asrBottom Left = 153 Height = 27 Top = 50 Width = 200 BorderSpacing.Left = 18 BorderSpacing.Top = 24 TabOrder = 0 end object lblPassword: TLabel AnchorSideLeft.Control = lblMessage AnchorSideTop.Control = edtPassword AnchorSideTop.Side = asrCenter Left = 66 Height = 18 Top = 120 Width = 63 Caption = 'Password:' ParentColor = False end object edtPassword: TEdit AnchorSideLeft.Control = edtUserName AnchorSideTop.Control = edtDomain AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtUserName AnchorSideRight.Side = asrBottom Left = 153 Height = 27 Top = 116 Width = 200 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 EchoMode = emPassword PasswordChar = '*' TabOrder = 2 end object btnCancel: TBitBtn AnchorSideTop.Control = edtPassword AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtPassword AnchorSideRight.Side = asrBottom Left = 263 Height = 30 Top = 155 Width = 90 Anchors = [akTop, akRight] BorderSpacing.Top = 12 Cancel = True Caption = 'Cancel' Kind = bkCancel ModalResult = 2 OnClick = ButtonClick TabOrder = 4 end object btnOK: TBitBtn AnchorSideTop.Control = btnCancel AnchorSideRight.Control = btnCancel Left = 167 Height = 30 Top = 155 Width = 90 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = '&OK' Default = True Kind = bkOK ModalResult = 1 OnClick = ButtonClick TabOrder = 3 end object lblMessage: TLabel AnchorSideLeft.Control = imgAuth AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = imgAuth Left = 66 Height = 18 Top = 8 Width = 153 BorderSpacing.Left = 10 Caption = 'Password required for %s' ParentColor = False end object edtDomain: TEdit AnchorSideLeft.Control = edtUserName AnchorSideTop.Control = edtUserName AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtPassword AnchorSideRight.Side = asrBottom Left = 153 Height = 27 Top = 83 Width = 200 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 TabOrder = 1 end object lblDomain: TLabel AnchorSideLeft.Control = lblMessage AnchorSideTop.Control = edtDomain AnchorSideTop.Side = asrCenter Left = 66 Height = 18 Top = 87 Width = 52 Caption = 'Domain:' ParentColor = False end object imgAuth: TImage AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner Left = 8 Height = 48 Top = 8 Width = 48 AutoSize = True Picture.Data = { 1754506F727461626C654E6574776F726B477261706869639E0C000089504E47 0D0A1A0A0000000D49484452000000300000003008060000005702F987000000 017352474200AECE1CE900000006624B474400FF00FF00FFA0BDA79300000009 7048597300000DD700000DD70142289B780000000774494D4507DB080F071810 46DD836300000C1E4944415468DEED99696C5CD775C7FFF7BE75567286FB4E4A 946451FB92C892BA08B12CD5B69C1510827C285023C856A4881D470E69B4982F 7165C9551314719AB641F3A51FE43A4E1D25B2C5489614CB5A182D96646DDCB7 216786E4BCD9E76DF7DE7E9811CB2869E02816ED02BDC0C50CDE9CF3707FE79C 7BCEB97780FFE383FC6F3F9C3C79D2AF7AA4373CBAE7615DD36555D50A9515A1 F16231F72BCBB2DF4CA5B2C7366FDE5CF8C8029C38D57BA3BEB6BEABA9B119B2 A2429115A8AA0AC77190CEA45028E4529665FFB8E09A3F58BF727DFF470EA0F7 ADA37CD3BA8F93A9E94930E62210A8444B730B2CCB86AA2A2084229FCFC148CD 8942A1D06B99C57D9B363D7C6DB101E8EF2163966DC1B48A30D2C6778D64AA66 70F0CEA3F178F4603C3E356EA4E62049148D0DCDA4AEB661B7C7E7BBDC77F9C2 BF9EEC3B59FF9100101CE763F1289A1A9B0190AF1AC6CCEAAEAEB5C73B3B1FDA D7D27271492697FED4ECDCEC9BF1C4342714686FED901A6AEBBFE8A7DAC0E9B7 4FFEF5871E42478F1E0DCA3A195CD1B9A2C6A37B71EBF60DC7B2EDAFEFDAF9D8 0F17CADD18B8B18A30719052F258385405894A181D1F412693FE0FDBE45FDEBD 7B77FE43010080DEDE23CBA8A2FCAA6BC5AA7A55D5717BE0268AF9DCCB3E6FFE D96DDBF61617CABE7BFDE22EEEF2433E5F60556D4D2DA663D3181E1932870747 662DCBC901483026AE13224E158B9EDE48E46F320F1C00008E1D3BD64264F67A 5B6BFB86CA8A10C627C661A4674708A4AF3FFA89BFF8C55DB9175E7AA14B97E4 7FEA5CD6F9677575F5726B4B3B72B90C46C68621530D54926099261289193B11 9F7518633F1682753FF7DC73D9070A0000478E1CF16A5EF9DF7D5EEFDEF6B60E 388E83F1C93198A6F95330F6DCBBEFBEB79DCAF4E5952BBBB4D87482FA033ED4 D5D56049C712148B266289692C695F0ADBB2E03206C7B171FBCE803D32343AE3 38D8D5D3F3ECCD070A00004208F2CB136F7E89CAE4859AAADAF0D28E6548A753 38DF775644A7A6F8C73FB645BA72F92AEAEBEBB17EFD5A080023A3837868D94A 4CC7A730376BA0ABAB0B9665C2765CC812453C9E1017CE5F4A3A8EB5B9BBBB7B F403CD42BF454A88D8B5F3B11FC29597C713B17FBE72EDD73C9E886162224AB6 6DDD2E0DF40FA1A6BA06EBD7AF43201044DA48636C64323B363186C6FA26B8CC 16972F5D81AAE9A004B01D1BB575B564C3C6B52145D17E1E8944E80305B83B76 EEDC39B7EB91C7BF5AB48A5BCEF59D8B3FF4D00AE40B7918C934D66F5C8B5C3E 034A292E5EBC84C6E6FA002040A90C5991AD3B7706012E402905A5121CC7466B 6B330D87431D5EAFFF8B8B02309F757E7D63B2982F56B4B4B462B07F18EBD6AD 06E70C9C7364B319D8B68BBAEA3A04FD15181A1940A150B846482962A9248152 0A42081CD7C5EAB52BBD94D26F2D2A0083B3A7B5A58D73C66024D3686E6982EB B890CA96ED58D28E4B97DF15935313666236716AF0CEE8FAA6A606C88A0C4208 2452F282E00C55E12AA8AADA78E0C081A57FE83AE4FB059065795B5575D89B4E 67E1F379A1280A6CDB02A5148EEB60E5CAE5B06D8B5CBF7A471742EC686F6FC3 B6ED5B21B88044244002280400094270545787D9D858612380A14501A0200DAA AA2197CB4255D5D2334A21840000D8B68575EBD660C38675E09CC3EBF54140C0 751C104A4041200909800040E0F3F9144250BD681E0050E442409452ECFCC604 0444F9B96599701C079C73A4520602C10AE89A064A693935030214945230CE04 40DC45DB035CB09BB94C96852A2A90C96421D1D24238E7C8E5F2309249CCCECE 219BCBC1B26D702150C8E5C05C0610024A4AF2129520491272D9BC0DB0F14503 70B97B2A3A1D2D042B2B000264B279082E70EBD66DC46271E4727970CE41CAD5 92828250A050CC838094C2A8EC3521041289844708D1B768004BDB569C4C1B29 DB344D842A2B30D03F009FDF875028044A040821A5C513024228082D7D7221E0 D81608290148928CA9A99820845CE8EEEE36160D60EFDEBDCCE5ACE7CAE5CB85 CE651DB8736700F97C014B3ADA21ABDA6F742B64BE6B21902885CBDCB2F54B21 77E9E295A265B9DD8B5A0700C02A38FF964A1B971389B8D3D45C8F13C7DF02A5 0A562C5F01BFCF575AB3004048C9E28494810884E02020E8EBBB683A8EFD9F3D 3DFBDE5974804824C2298A4F0E8F8E4E575404A0A80A7E71F40D70C6D0D1B114 ADAD6D08852AA1EB1EE89A024DD7A1697A290B09829B376FB1B1D1F16B994CFA 2B1FF891F2FD8EA79F8EA408A0D4D7376069673B344DC14F7EF23AAE5DBB0E89 4AA8AAAA4175751582C14A783C1EC89204C761E04240D3344A08FA23918879DF 05F58F053874E890C7E5569522CBA80A57419224787D31F40F0CE0EAD5EBF0FB FDF8DCE73E09084040802A145CE4C05C070D0D0D8473EC7E2087FAF73B9E79E6 992221F8FB2BD7AF145455452010404B4B33EA1BAAB17CC51214CD8298994942 966548B4D4C4C9928CA269A2A232084D537DF7D3037D6000A5AAC65F8B4E44F5 4C26035996C1184355388C254B97A0582C3867CF9E2B663219288A024996A069 2A0AF90220085A5A9AC19878F44301884422F41FBF77E0652AAB7D1B366C2415 C10A101098A6054551C0980BCBCE8B4462F61BAFBEFA5FC69933E74C4A283C1E 0F2CCB826D5B686B6BF1EABAFE990F05C0EB55D6CBB2FA977B9E7852EBECEC24 5C7030C6619945783C5E1849033E9FFF4277F7BE7F9124F967B222498CB1524D 20402A9D467D431D1CC7FD93575E79455A74004678D0716C52340BF3876BD32C 82730E8FD783583C6672CE7FBA7FFFFE559462EFDA35AB15D775C13883A66A30 92B3D0351DC1A09F0D0D8D6F5C7480EE6FFDED29DB743E7BE2C4F1ECCCCCAC90 6505D96C0E9AAA419664C462319711F4027447737353B95B2D75AF5EAF8E39C3 80E338686D6D5125E9FEB2D11FBD89BFFDEDE78FB9AEFD77232343454A095269 03814000C54211B66DBB3DCFF6DCE49C9E181E1EC1E1C3AFE64F9D7E3B373D15 13FE4010AEE3209D4EA1A1A1419365F9338B5A07BE73F03BAB3DB2FA82107CB3 00426D6DEDBA6DDB706C1BA1501813D14948941C07809E9E676F0B217CFBF7EF 5F3A3A52FC6C3693ED79FCF1DD153E9F17B3C939B4B6B4C175DDD59148C41B89 440A8BE201954A7FD5D6DEF6C49E3D9F6CF8C2E7BFA037373523954E43D33CF0 FA7C88C5A6338ECD7EB6F05A261C0E8FC9B2FC312A490AE70CC1400552460A12 95100E878BBAAEFFE9A28510A5D4234BB253110CE2EEC92C9BC92014AA84E01C B1585C755571FCAEFC8B2FBE18C8E70B6FD737D4EDD9B163BBD7652EFC8100F2 851C6CDB465373634051D43D8B06609BECF9FE8101DB4819A52B1200D96C06D5 55D5481A491082D8F34F3F3FBDC0033ED7659BB66CD9A40380EB32E8BA064228 32D934EAEA6A28409F583400429C660891E8EFEF679450148A45702E50595981 582CCE39134717CAEFDBB72F46A974A6B7F7547E2E999A3F3BFBFD3E18461295 9595E09C351E3C78B0F68103BC74E8408FAAEBE7B73EBCB5EDE12D5B25102093 CE201008824A0AA2D1C92C13EED17BF5BEF9CD6F7C229FCB7CEDD45B6F174647 26C08580DFE7472A950221404D4D95EDBAE291070E40089EFED4939FF6AE5CB9 4AA612052514D95C06E1AA305CC7C15C72CE63E69DD3BFEB7E9531761610B4AA 3A0CC65CF87DFEF9B6A2A1A12EA069CAA71F14000120B7B7B7EB103C1E9D8ABA 840094500801E47239842B4388CF24204BF2ED728F7FEFED379165E507CB972F 95155502671CB22243D554188681503804D7658F00D0CA299E7C1075800290CA B2D2E8E8A8D477E1CAE705C8D9DA9ADA406D6D1DF2F92C0821F0FB03B8FEDE7B 762E9FFB39001D0003E0960F9614800C821ADDA3CB9CF3BB775A08F883300C03 9AEA018028004F59F7AEBE0B80DF8F074879F14A79AA00B4C3870F272727A3DD BDC77F59304D1373C924828120F2F93C868787D87474EA4C59765EA7FC5D9E9D 99FBFEB5AB37F217CE5D2CCC2593E09C83CA14F1C40C060606AD6432F94A595E 2D1B4DFE7DDE90DE07C05D0FD085F3FCB90B835BB76E69BC71EB46576226614A 9244CEF79DB70C23F5BD7F78E9BBAF952DC6CBD69F37D83BEF9CE99F9818FF51 5D5D5D3A39975E3D31314526C6A2C865F3C9542AF3C6E9D3277F343E3E9E5FA0 BF70DED73F34BF1142F74CB266CD1AFF23BB766C095586FE3C9F2D5C3870E0A5 D717B8FFB7436881BECFE7939F7AEAA9EDA3A3D1D123475E8B2E58287BBF2144 FEC04D7CAF27EED517F7588CDDE301B20080CE5F16FDCF058C58F00EF63BF4FF 7F7CE4C67F0326A2B675DDA7D6BA0000000049454E44AE426082 } end end ����������������������������doublecmd-0.5.8/plugins/wfx/samba/src/libsmbclient.pas����������������������������������������������0000644�0001750�0001750�00000011511�12014201074�022007� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit libsmbclient; {$mode delphi} interface uses Classes, SysUtils, Unix, BaseUnix, UnixType; const SMBC_WORKGROUP = 1; SMBC_SERVER = 2; SMBC_FILE_SHARE = 3; SMBC_PRINTER_SHARE = 4; SMBC_COMMS_SHARE = 5; SMBC_IPC_SHARE = 6; SMBC_DIR = 7; SMBC_FILE = 8; SMBC_LINK = 9; const SMBC_DOS_MODE_READONLY = $01; SMBC_DOS_MODE_HIDDEN = $02; SMBC_DOS_MODE_SYSTEM = $04; SMBC_DOS_MODE_VOLUME_ID = $08; SMBC_DOS_MODE_DIRECTORY = $10; SMBC_DOS_MODE_ARCHIVE = $20; type (**@ingroup structure * Structure that represents a directory entry. * *) psmbc_dirent = ^smbc_dirent; smbc_dirent = record (** Type of entity. SMBC_WORKGROUP=1, SMBC_SERVER=2, SMBC_FILE_SHARE=3, SMBC_PRINTER_SHARE=4, SMBC_COMMS_SHARE=5, SMBC_IPC_SHARE=6, SMBC_DIR=7, SMBC_FILE=8, SMBC_LINK=9,*) smbc_type: LongWord; (** Length of this smbc_dirent in bytes *) dirlen: LongWord; (** The length of the comment string in bytes (does not include * null terminator) *) commentlen: LongWord; (** Points to the null terminated comment string *) comment: PAnsiChar; (** The length of the name string in bytes (does not include * null terminator) *) namelen: LongWord; (** Points to the null terminated name string *) name: array[0..0] of AnsiChar; end; smbc_get_auth_data_fn = procedure(server, share: PAnsiChar; wg: PAnsiChar; wglen: LongInt; un: PAnsiChar; unlen: LongInt; pw: PAnsiChar; pwlen: LongInt); cdecl; smbc_init_fn = function (fn: smbc_get_auth_data_fn; debug: LongInt): LongInt; cdecl; smbc_open_fn = function(furl: PAnsiChar; flags: LongInt; mode: mode_t): LongInt; cdecl; smbc_read_fn = function(fd: LongInt; buf: Pointer; bufsize: size_t): ssize_t; cdecl; smbc_write_fn = function(fd: LongInt; buf: Pointer; bufsize: size_t): ssize_t; cdecl; smbc_lseek_fn = function(fd: LongInt; offset: off_t; whence: LongInt): off_t; cdecl; smbc_close_fn = function(fd: LongInt): LongInt; cdecl; smbc_unlink_fn = function(furl: PAnsiChar): LongInt; cdecl; smbc_rename_fn = function(ourl: PAnsiChar; nurl: PAnsiChar): LongInt; cdecl; smbc_opendir_fn = function(durl: PAnsiChar): LongInt; cdecl; smbc_closedir_fn = function(dh: LongInt): LongInt; cdecl; smbc_readdir_fn = function(dh: LongInt): psmbc_dirent; cdecl; smbc_mkdir_fn = function(durl: PAnsiChar; mode: mode_t): LongInt; cdecl; smbc_rmdir_fn = function(durl: PAnsiChar): LongInt; cdecl; smbc_stat_fn = function(url: PAnsiChar; st: PStat): LongInt; cdecl; smbc_getxattr_fn = function(url, name: PAnsiChar; value: Pointer; size: size_t): LongInt; cdecl; smbc_setxattr_fn = function(url, name: PAnsiChar; value: Pointer; size: size_t; flags: LongInt): LongInt; cdecl; smbc_utimes_fn = function(url: PAnsiChar; tbuf: ptimeval): LongInt; cdecl; var smbc_init: smbc_init_fn; smbc_open: smbc_open_fn; smbc_read: smbc_read_fn; smbc_write: smbc_write_fn; smbc_lseek: smbc_lseek_fn; smbc_close: smbc_close_fn; smbc_unlink: smbc_unlink_fn; smbc_rename: smbc_rename_fn; smbc_opendir: smbc_opendir_fn; smbc_closedir: smbc_closedir_fn; smbc_readdir: smbc_readdir_fn; smbc_mkdir: smbc_mkdir_fn; smbc_rmdir: smbc_rmdir_fn; smbc_stat: smbc_stat_fn; smbc_getxattr: smbc_getxattr_fn; smbc_setxattr: smbc_setxattr_fn; smbc_utimes: smbc_utimes_fn; function LoadSambaLibrary: Boolean; implementation uses dynlibs; var hSamba: TLibHandle = 0; function LoadSambaLibrary: Boolean; begin if (hSamba = 0) then begin hSamba:= LoadLibrary('libsmbclient.so.0'); if (hSamba <> 0) then begin @smbc_init:= GetProcAddress(hSamba, 'smbc_init'); @smbc_opendir:= GetProcAddress(hSamba, 'smbc_opendir'); @smbc_readdir:= GetProcAddress(hSamba, 'smbc_readdir'); @smbc_closedir:= GetProcAddress(hSamba, 'smbc_closedir'); @smbc_mkdir:= GetProcAddress(hSamba, 'smbc_mkdir'); @smbc_rmdir:= GetProcAddress(hSamba, 'smbc_rmdir'); @smbc_open:= GetProcAddress(hSamba, 'smbc_open'); @smbc_read:= GetProcAddress(hSamba, 'smbc_read'); @smbc_write:= GetProcAddress(hSamba, 'smbc_write'); @smbc_lseek:= GetProcAddress(hSamba, 'smbc_lseek'); @smbc_close:= GetProcAddress(hSamba, 'smbc_close'); @smbc_unlink:= GetProcAddress(hSamba, 'smbc_unlink'); @smbc_rename:= GetProcAddress(hSamba, 'smbc_rename'); @smbc_stat:= GetProcAddress(hSamba, 'smbc_stat'); @smbc_getxattr:= GetProcAddress(hSamba, 'smbc_getxattr'); @smbc_setxattr:= GetProcAddress(hSamba, 'smbc_setxattr'); @smbc_utimes:= GetProcAddress(hSamba, 'smbc_utimes'); end; end; Result:= (hSamba <> 0); end; end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/samba/src/samba.lpi�����������������������������������������������������0000644�0001750�0001750�00000005205�12247124203�020435� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <CONFIG> <ProjectOptions> <Version Value="9"/> <General> <Flags> <MainUnitHasCreateFormStatements Value="False"/> <MainUnitHasTitleStatement Value="False"/> </Flags> <SessionStorage Value="InProjectDir"/> <MainUnit Value="0"/> <Title Value="samba"/> <UseAppBundle Value="False"/> <ResourceType Value="res"/> </General> <i18n> <EnableI18N LFM="False"/> </i18n> <VersionInfo> <UseVersionInfo Value="True"/> <MinorVersionNr Value="1"/> <StringTable FileDescription="Samba WFX plugin for Double Commander" LegalCopyright="Copyright (C) 2006-2012 Koblov Alexander" ProductVersion=""/> </VersionInfo> <BuildModes Count="1"> <Item1 Name="Default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <HostApplicationFilename Value="/usr/bin/doublecmd"/> <LaunchingApplication PathPlusParams="/usr/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <Units Count="2"> <Unit0> <Filename Value="samba.lpr"/> <IsPartOfProject Value="True"/> <UnitName Value="samba"/> </Unit0> <Unit1> <Filename Value="smbauthdlg.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="DialogBox"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="SmbAuthDlg"/> </Unit1> </Units> </ProjectOptions> <CompilerOptions> <Version Value="11"/> <Target> <Filename Value="../lib/samba.wfx" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir)"/> <OtherUnitFiles Value="../../../../sdk"/> <UnitOutputDirectory Value="../lib"/> </SearchPaths> <Conditionals Value="if (TargetCPU <> 'arm') then begin CustomOptions += '-fPIC'; end; if (TargetOS = 'linux') then begin LinkerOptions += ' -z relro'; end; if (TargetOS = 'darwin') then begin LinkerOptions += ' -no_order_inits'; end;"/> <Linking> <Options> <PassLinkerOptions Value="True"/> <ExecutableType Value="Library"/> </Options> </Linking> <Other> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> </CONFIG> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/samba/src/samba.lpr�����������������������������������������������������0000644�0001750�0001750�00000000536�12014201074�020442� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library samba; {$mode objfpc}{$H+} uses Classes, SmbFunc, SmbAuthDlg { you can add units after this }; exports FsInit, FsFindFirst, FsFindNext, FsFindClose, FsRenMovFile, FsGetFile, FsPutFile, FsDeleteFile, FsMkDir, FsRemoveDir, FsSetAttr, FsSetTime, FsGetDefRootName, ExtensionInitialize; {$R *.res} begin end. ������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wfx/samba/src/smbauthdlg.pas������������������������������������������������0000755�0001750�0001750�00000004734�12014201074�021506� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit SmbAuthDlg; {$mode objfpc}{$H+} {$R smbauthdlg.lfm} interface uses SysUtils, Extension; function ShowSmbAuthDlg: Boolean; implementation uses SmbFunc; function DlgProc (pDlg: PtrUInt; DlgItemName: PAnsiChar; Msg, wParam, lParam: PtrInt): PtrInt; cdecl; var Data: PtrInt; Text: UTF8String; begin with ExtensionStartupInfo do begin case Msg of DN_INITDIALOG: begin Text:= PAnsiChar(SendDlgMsg(pDlg, 'lblMessage', DM_GETTEXT, 0, 0)); Data:= PtrInt(PAnsiChar(Format(Text, [Message]))); SendDlgMsg(pDlg, 'lblMessage', DM_SETTEXT, Data, 0); Data:= PtrInt(PAnsiChar(UserName)); SendDlgMsg(pDlg, 'edtUserName', DM_SETTEXT, Data, 0); Data:= PtrInt(PAnsiChar(WorkGroup)); SendDlgMsg(pDlg, 'edtDomain', DM_SETTEXT, Data, 0); Data:= PtrInt(PAnsiChar(Password)); SendDlgMsg(pDlg, 'edtPassword', DM_SETTEXT, Data, 0); end; DN_CLICK: if DlgItemName = 'btnOK' then begin Data:= SendDlgMsg(pDlg, 'edtUserName', DM_GETTEXT, 0, 0); StrLCopy(UserName, PAnsiChar(Data), MAX_PATH); Data:= SendDlgMsg(pDlg, 'edtDomain', DM_GETTEXT, 0, 0); StrLCopy(WorkGroup, PAnsiChar(Data), MAX_PATH); Data:= SendDlgMsg(pDlg, 'edtPassword', DM_GETTEXT, 0, 0); StrLCopy(Password, PAnsiChar(Data), MAX_PATH); // close dialog SendDlgMsg(pDlg, DlgItemName, DM_CLOSE, ID_OK, 0); end else if DlgItemName = 'btnCancel' then begin // close dialog SendDlgMsg(pDlg, DlgItemName, DM_CLOSE, ID_CANCEL, 0); end; end;// case end; // with end; function ShowSmbAuthDlg: Boolean; var ResHandle: TFPResourceHandle = 0; ResGlobal: TFPResourceHGLOBAL = 0; ResData: Pointer = nil; ResSize: LongWord; begin Result := False; try ResHandle := FindResource(HINSTANCE, PChar('TDIALOGBOX'), MAKEINTRESOURCE(10) {RT_RCDATA}); if ResHandle <> 0 then begin ResGlobal := LoadResource(HINSTANCE, ResHandle); if ResGlobal <> 0 then begin ResData := LockResource(ResGlobal); ResSize := SizeofResource(HINSTANCE, ResHandle); with ExtensionStartupInfo do begin Result := DialogBoxLRS(ResData, ResSize, @DlgProc); end; end; end; finally if ResGlobal <> 0 then begin UnlockResource(ResGlobal); FreeResource(ResGlobal); end; end; end; end. ������������������������������������doublecmd-0.5.8/plugins/wlx/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�015006� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wlx/WlxMplayer/�������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017112� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wlx/WlxMplayer/README.txt���������������������������������������������������0000644�0001750�0001750�00000002542�12014201074�020575� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ WlxMplayer ------------------------------------------------------------------------- This is WLX (Lister) plugin for Double Commander. Copyright (C) 2008 Dmitry Kolomiets (B4rr4cuda@rambler.ru) Class TExProcess used in plugin was written by Anton Rjeshevsky. Gtk2 and Qt support were added by Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA While the gui interface for wlx isn't developed to use this plugin add to doublecmd.ini these lines and edit them. [Lister Plugins] PluginCount=1 Plugin1Name=WlxMplayer Plugin1Detect=(EXT="MPG")|(EXT="AVI")|(EXT="MPEG")|(EXT="FLV") Plugin1Path=*Here you must write path to compiled plugin* ��������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wlx/WlxMplayer/lib/���������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017660� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wlx/WlxMplayer/src/���������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017701� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wlx/WlxMplayer/src/wlxMplayer.lpr�������������������������������������������0000644�0001750�0001750�00000017035�12117057733�022573� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ WlxMplayer ------------------------------------------------------------------------- This is WLX (Lister) plugin for Double Commander. Copyright (C) 2008 Dmitry Kolomiets (B4rr4cuda@rambler.ru) Class TExProcess used in plugin was written by Anton Rjeshevsky. Gtk2 and Qt support were added by Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } library wlxMplayer; {$mode objfpc}{$H+} {$include calling.inc} {$IF NOT (DEFINED(LCLGTK) or DEFINED(LCLGTK2) or DEFINED(LCLQT))} {$DEFINE LCLGTK2} {$ENDIF} uses {$IFDEF UNIX} cthreads, {$ENDIF} Classes, sysutils, x, {$IFDEF LCLGTK} gtk, gdk, glib, {$ENDIF} {$IFDEF LCLGTK2} gtk2, gdk2, glib2, gdk2x, {$ENDIF} {$IFDEF LCLQT} qt4, {$ENDIF} process, math, WLXPlugin; type { TExProcess } TExProcess = class protected p: TProcess; s: string; function _GetExitStatus(): integer; public RezList:TStringList; constructor Create(commandline: string); procedure Execute; destructor Destroy; procedure OnReadLn(str: string); property ExitStatus: integer read _GetExitStatus; end; const buf_len = 3000; { TExProcess } function TExProcess._GetExitStatus(): integer; begin Result:=p.ExitStatus; end; constructor TExProcess.Create(commandline: string); begin RezList:=TStringList.Create; s:=''; p:=TProcess.Create(nil); p.CommandLine:=commandline; p.Options:=[poUsePipes,poNoConsole]; end; procedure TExProcess.Execute; var buf: string; i, j, c, n: integer; begin p.Execute; repeat SetLength(buf, buf_len); SetLength(buf, p.output.Read(buf[1], length(buf))); //waits for the process output // cut the incoming stream to lines: s:=s + buf; //add to the accumulator repeat //detect the line breaks and cut. i:=Pos(#13, s); j:=Pos(#10, s); if i=0 then i:=j; if j=0 then j:=i; if j = 0 then Break; //there are no complete lines yet. OnReadLn(Copy(s, 1, min(i, j) - 1)); //return the line without the CR/LF characters s:=Copy(s, max(i, j) + 1, length(s) - max(i, j)); //remove the line from accumulator until false; until buf = ''; if s <> '' then OnReadLn(s); end; destructor TExProcess.Destroy; begin RezList.Free; p.Free; end; procedure TExProcess.OnReadLn(str: string); begin RezList.Add(str); end; type //Class implementing mplayer control { TMPlayer } TMPlayer=class(TThread) public //--------------------- hWidget:THandle; //the integrable widget fileName:string; //filename xid:TWindow; //X window handle pr:TProcess; //mplayer's process pmplayer:string; //path to mplayer //--------------------- constructor Create(APlayerPath, AFilename: String); destructor destroy; override; procedure SetParentWidget(AWidget:thandle); protected procedure Execute; override; private end; { TMPlayer } constructor TMPlayer.Create(APlayerPath, AFilename: String); begin inherited Create(True); filename:= '"' + AFilename + '"'; pmplayer:= APlayerPath + ' '; WriteLn('wlxMPlayer: found mplayer in - ' + pmplayer); end; destructor TMPlayer.destroy; begin if pr.Running then pr.Terminate(0); pr.Free; {$IF DEFINED(LCLQT)} QWidget_Destroy(QWidgetH(hWidget)); {$ELSE} gtk_widget_destroy(PGtkWidget(hWidget)); {$ENDIF} inherited destroy; end; procedure TMPlayer.SetParentWidget(AWidget: THandle); {$IFDEF LCLQT} begin hWidget:= THandle(QWidget_create(QWidgetH(AWidget))); QWidget_show(QWidgetH(hWidget)); xid:= QWidget_winId(QWidgetH(hWidget)); end; {$ELSE} var widget, mySocket: PGtkWidget; //the socket begin widget := PGtkWidget(AWidget); mySocket := gtk_socket_new; gtk_container_add(GTK_CONTAINER(widget), mySocket); gtk_widget_show(mySocket); gtk_widget_show(widget); gtk_widget_realize(mySocket); {$IFDEF LCLGTK} xid:= (PGdkWindowPrivate(mySocket^.window))^.xwindow; {$ENDIF} {$IFDEF LCLGTK2} xid:= GDK_WINDOW_XID(mySocket^.window); {$ENDIF} hWidget:= THandle(mySocket); end; {$ENDIF} procedure TMPlayer.Execute; begin pr:=TProcess.Create(nil); pr.Options := Pr.Options + [poWaitOnExit,poNoConsole{,poUsePipes}]; //mplayer stops if poUsePipes used. pr.CommandLine:=pmplayer+fileName+' -wid '+IntToStr(xid); WriteLn(pr.CommandLine); pr.Execute; end; //Custom class contains info for plugin windows type { TPlugInfo } TPlugInfo = class private fControls:TStringList; public fFileToLoad:string; fShowFlags:integer; //etc constructor Create; destructor Destroy; override; function AddControl(AItem: TMPlayer):integer; end; { TPlugInfo } constructor TPlugInfo.Create; begin fControls:=TStringlist.Create; end; destructor TPlugInfo.Destroy; begin while fControls.Count>0 do begin TMPlayer(fControls.Objects[0]).Free; fControls.Delete(0); end; inherited Destroy; end; function TPlugInfo.AddControl(AItem: TMPlayer): integer; begin fControls.AddObject(inttostr(PtrUInt(AItem)),TObject(AItem)); end; {Plugin main part} var List:TStringList; function ListLoad(ParentWin: THandle; FileToLoad: PChar; ShowFlags: Integer): THandle; dcpcall; var pf: TExProcess; sPlayerPath: String; p: TMPlayer; begin pf:= TExProcess.Create('which mplayer'); try pf.Execute; if (pf.RezList.Count <> 0) then sPlayerPath:= pf.RezList[0] else WriteLn('wlxMPlayer: mplayer not found!'); finally pf.Free; end; if sPlayerPath = EmptyStr then Exit(wlxInvalidHandle); p:= TMPlayer.Create(sPlayerPath, string(FileToLoad)); p.SetParentWidget(ParentWin); // Create list if none if not Assigned(List) then List:= TStringList.Create; // Add to list new plugin window and it's info List.AddObject(IntToStr(PtrInt(p.hWidget)), TPlugInfo.Create); with TPlugInfo(List.Objects[List.Count-1]) do begin fFileToLoad:= FileToLoad; fShowFlags:= ShowFlags; AddControl(p); end; Result:= p.hWidget; p.Resume; end; procedure ListCloseWindow(ListWin:thandle); dcpcall; var Index:integer; s:string; begin if assigned(List) then begin writeln('ListCloseWindow quit, List Item count: '+inttostr(List.Count)); s:=IntToStr(ListWin); Index:=List.IndexOf(s); if Index>-1 then begin TPlugInfo(List.Objects[index]).Free; List.Delete(Index); writeln('List item n: '+inttostr(Index)+' Deleted'); end; //Free list if it has zero items If List.Count=0 then FreeAndNil(List); end; end; procedure ListGetDetectString(DetectString:pchar;maxlen:integer); dcpcall; begin StrLCopy(DetectString, '(EXT="AVI")|(EXT="MKV")|(EXT="FLV")|(EXT="MPG")|(EXT="MPEG")|(EXT="MP4")|(EXT="VOB")', maxlen); end; exports ListLoad, ListCloseWindow, ListGetDetectString; {$R *.res} begin end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wlx/WlxMplayer/src/wlxMplayer.lpi�������������������������������������������0000644�0001750�0001750�00000005217�12247124203�022550� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <CONFIG> <ProjectOptions> <Version Value="9"/> <PathDelim Value="\"/> <General> <Flags> <LRSInOutputDirectory Value="False"/> </Flags> <SessionStorage Value="InProjectDir"/> <MainUnit Value="0"/> </General> <VersionInfo> <UseVersionInfo Value="True"/> <MinorVersionNr Value="1"/> <StringTable FileDescription="MPlayer WLX plugin for Double Commander" LegalCopyright="Copyright (C) 2006-2012 Koblov Alexander" ProductVersion=""/> </VersionInfo> <BuildModes Count="1"> <Item1 Name="default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <RequiredPackages Count="1"> <Item1> <PackageName Value="LCL"/> </Item1> </RequiredPackages> <Units Count="1"> <Unit0> <Filename Value="wlxMplayer.lpr"/> <IsPartOfProject Value="True"/> <UnitName Value="wlxMplayer"/> </Unit0> </Units> </ProjectOptions> <CompilerOptions> <Version Value="11"/> <PathDelim Value="\"/> <Target> <Filename Value="..\lib\wlxmplayer.wlx" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="..\..\..\..\sdk"/> <OtherUnitFiles Value="$(LazarusDir)\lcl\units\$(TargetCPU)-$(TargetOS)\$(LCLWidgetType);..\..\..\..\sdk"/> <UnitOutputDirectory Value="..\lib"/> </SearchPaths> <Conditionals Value="if (TargetOS = 'linux') then begin LinkerOptions += ' -z relro'; end; if TargetOS = 'darwin' then begin LinkerOptions += ' -no_order_inits'; end;"/> <Parsing> <SyntaxOptions> <UseAnsiStrings Value="False"/> </SyntaxOptions> </Parsing> <Linking> <LinkSmart Value="True"/> <Options> <PassLinkerOptions Value="True"/> <ExecutableType Value="Library"/> </Options> </Linking> <Other> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <ConfigFile> <CustomConfigFile Value="True"/> <ConfigFilePath Value="fpc-extra.cfg"/> </ConfigFile> <CustomOptions Value="-dLCL$(LCLWidgetType)"/> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> </CONFIG> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wlx/WlxMplayer/src/fpc-extra.cfg��������������������������������������������0000644�0001750�0001750�00000000157�11673054716�022263� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#IFDEF CPU64 #IFDEF FPC_CROSSCOMPILING -Fl/usr/lib/gcc/i486-linux-gnu/4.6/64 -Fl/usr/local/lib64 #ENDIF #ENDIF �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wlx/simplewlx/��������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017032� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wlx/simplewlx/lib/����������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017600� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wlx/simplewlx/src/����������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017621� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wlx/simplewlx/src/wlxplugin.pas���������������������������������������������0000644�0001750�0001750�00000004443�12014201074�022346� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Lister API definitions. // This unit is written by Christian Ghisler, it's from Total Commander // Lister API Guide, which can be found at http://ghisler.com. // Version: 1.8. unit WLXPlugin; interface {$IFDEF MSWINDOWS} uses Windows;{$ENDIF} const lc_copy=1; lc_newparams=2; lc_selectall=3; lc_setpercent=4; lcp_wraptext=1; lcp_fittowindow=2; lcp_ansi=4; lcp_ascii=8; lcp_variable=12; lcp_forceshow=16; lcp_fitlargeronly=32; lcp_center=64; lcs_findfirst=1; lcs_matchcase=2; lcs_wholewords=4; lcs_backwards=8; itm_percent=$FFFE; itm_fontstyle=$FFFD; itm_wrap=$FFFC; itm_fit=$FFFB; itm_next=$FFFA; itm_center=$FFF9; LISTPLUGIN_OK=0; LISTPLUGIN_ERROR=1; const MAX_PATH=32000; type tListDefaultParamStruct=record size, PluginInterfaceVersionLow, PluginInterfaceVersionHi:longint; DefaultIniName:array[0..MAX_PATH-1] of char; end; pListDefaultParamStruct=^tListDefaultParamStruct; type tdateformat=record wYear,wMonth,wDay:word; end; pdateformat=^tdateformat; type ttimeformat=record wHour,wMinute,wSecond:word; end; ptimeformat=^ttimeformat; type HBITMAP = type LongWord; { Function prototypes: Functions need to be defined exactly like this!} { function ListLoad(ParentWin:thandle;FileToLoad:pchar;ShowFlags:integer):thandle; stdcall; function ListLoadNext(ParentWin,PluginWin:thandle;FileToLoad:pchar;ShowFlags:integer):integer; stdcall; procedure ListCloseWindow(ListWin:thandle); stdcall; procedure ListGetDetectString(DetectString:pchar;maxlen:integer); stdcall; function ListSearchText(ListWin:thandle;SearchString:pchar; SearchParameter:integer):integer; stdcall; function ListSearchDialog(ListWin:thandle;FindNext:integer):integer; stdcall; function ListSendCommand(ListWin:thandle;Command,Parameter:integer):integer; stdcall; function ListPrint(ListWin:thandle;FileToPrint,DefPrinter:pchar; PrintFlags:integer;var Margins:trect):integer; stdcall; function ListNotificationReceived(ListWin:thandle;Message,wParam,lParam:integer):integer; stdcall; procedure ListSetDefaultParams(dps:pListDefaultParamStruct); stdcall; function ListGetPreviewBitmap(FileToLoad:pchar;width,height:integer; contentbuf:pchar;contentbuflen:integer):hbitmap; stdcall; } implementation end. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wlx/simplewlx/src/simplewlx.lpr���������������������������������������������0000644�0001750�0001750�00000005325�12117057733�022372� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library SimpleWlx; {$mode objfpc}{$H+} {$include calling.inc} {$DEFINE GTK2} uses Classes, sysutils, {$IFDEF GTK} gtk,gdk,glib, {$ENDIF} {$IFDEF GTK2} gtk2,gdk2,glib2, {$ENDIF} WLXPlugin; var List:TStringList; //Custom class contains info for plugin windows type { TPlugInfo } TPlugInfo = class private fControls:TStringList; public fFileToLoad:string; fShowFlags:integer; //etc constructor Create; destructor Destroy; override; function AddControl(AItem:PGtkWidget):integer; end; { TPlugInfo } constructor TPlugInfo.Create; begin fControls:=TStringlist.Create; end; destructor TPlugInfo.Destroy; begin while fControls.Count>0 do begin gtk_widget_destroy(PGtkWidget(fControls.Objects[0])); fControls.Delete(0); end; inherited Destroy; end; function TPlugInfo.AddControl(AItem: PGtkWidget): integer; begin fControls.AddObject(inttostr(Integer(AItem)),TObject(AItem)); end; function ListLoad(ParentWin:thandle;FileToLoad:pchar;ShowFlags:integer):thandle; dcpcall; var GFix, GButton1, Gbutton2: PGtkWidget; begin // gFix:=gtk_fixed_new; gFix:=gtk_vbox_new(true,5); gtk_container_add(GTK_CONTAINER(PGtkWidget(ParentWin)),gFix); gtk_widget_show(gFix); GButton1:=gtk_button_new_with_label('Yehoo1'); gtk_container_add(GTK_CONTAINER(GFix),GButton1); gtk_widget_set_usize(GButton1,10,10); // gtk_widget_set_uposition(GButton1,30,10); gtk_widget_show(GButton1); Gbutton2:=gtk_button_new_with_label('Yehoo2'); gtk_container_add(GTK_CONTAINER(GFix),Gbutton2 ); gtk_widget_set_usize(GButton2,20,20); // gtk_widget_set_uposition(GButton2,50,50); gtk_widget_show(Gbutton2); //Create list if none if not assigned(List) then List:=TStringList.Create; //add to list new plugin window and it's info List.AddObject(IntToStr(integer(GFix)),TPlugInfo.Create); with TPlugInfo(List.Objects[List.Count-1]) do begin fFileToLoad:=FileToLoad; fShowFlags:=ShowFlags; AddControl(GFix); end; Result:= thandle(GFix); end; procedure ListCloseWindow(ListWin:thandle); dcpcall; var Index:integer; s:string; begin if assigned(List) then begin writeln('ListCloseWindow quit, List Item count: '+inttostr(List.Count)); s:=IntToStr(ListWin); Index:=List.IndexOf(s); if Index>-1 then begin TPlugInfo(List.Objects[index]).Free; List.Delete(Index); writeln('List item n: '+inttostr(Index)+' Deleted'); end; //Free list if it has zero items If List.Count=0 then FreeAndNil(List); end; end; exports ListLoad, ListCloseWindow; begin end. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wlx/simplewlx/src/simplewlx.lpi���������������������������������������������0000644�0001750�0001750�00000004175�12210604521�022346� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <CONFIG> <ProjectOptions> <Version Value="9"/> <General> <Flags> <LRSInOutputDirectory Value="False"/> </Flags> <SessionStorage Value="InProjectDir"/> <MainUnit Value="0"/> </General> <VersionInfo> <Language Value=""/> <CharSet Value=""/> <StringTable ProductVersion=""/> </VersionInfo> <BuildModes Count="1"> <Item1 Name="default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <Units Count="1"> <Unit0> <Filename Value="simplewlx.lpr"/> <IsPartOfProject Value="True"/> <UnitName Value="SimpleWlx"/> </Unit0> </Units> </ProjectOptions> <CompilerOptions> <Version Value="11"/> <Target> <Filename Value="../lib/simplewlx.wlx" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="../../../../sdk"/> <UnitOutputDirectory Value="../lib"/> </SearchPaths> <Conditionals Value="if (TargetCPU <> 'arm') then begin CustomOptions += '-fPIC'; end; if (TargetOS = 'darwin') then begin LinkerOptions += ' -no_order_inits'; end;"/> <Parsing> <SyntaxOptions> <UseAnsiStrings Value="False"/> </SyntaxOptions> </Parsing> <Linking> <LinkSmart Value="True"/> <Options> <PassLinkerOptions Value="True"/> <ExecutableType Value="Library"/> </Options> </Linking> <Other> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> </CONFIG> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/build.bat�������������������������������������������������������������������0000644�0001750�0001750�00000002747�11610475250�015771� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������@echo off rem Build all plugins rem This script is run from build.bat. rem If you run it directly set %lazpath% first rem or have lazbuild in your PATH. rem CD to plugins directory pushd plugins rem WCX plugins lazbuild wcx\cpio\src\cpio.lpi %DC_ARCH% lazbuild wcx\deb\src\deb.lpi %DC_ARCH% lazbuild wcx\lzma\src\lzma.lpi %DC_ARCH% lazbuild wcx\rpm\src\rpm.lpi %DC_ARCH% lazbuild wcx\unrar\src\unrar.lpi %DC_ARCH% lazbuild wcx\zip\src\zip.lpi %DC_ARCH% rem WDX plugins lazbuild wdx\rpm_wdx\src\rpm_wdx.lpi %DC_ARCH% lazbuild wdx\deb_wdx\src\deb_wdx.lpi %DC_ARCH% lazbuild wdx\svn_wdx\src\svn_wdx.lpi %DC_ARCH% lazbuild wdx\xpi_wdx\src\xpi_wdx.lpi %DC_ARCH% rem WFX plugins lazbuild wfx\ftp\src\ftp.lpi %DC_ARCH% rem Strip and rename WCX pushd wcx\cpio\lib\ strip --strip-all cpio.wcx popd pushd wcx\deb\lib\ strip --strip-all deb.wcx popd pushd wcx\lzma\lib\ strip --strip-all lzma.wcx popd pushd wcx\rpm\lib\ strip --strip-all rpm.wcx popd pushd wcx\unrar\lib\ strip --strip-all unrar.wcx popd pushd wcx\zip\lib\ strip --strip-all zip.wcx popd rem Strip and rename WDX pushd wdx\rpm_wdx\lib\ strip --strip-all rpm_wdx.wdx popd pushd wdx\deb_wdx\lib\ strip --strip-all deb_wdx.wdx popd pushd wdx\svn_wdx\lib\ strip --strip-all svn_wdx.wdx popd pushd wdx\xpi_wdx\lib\ strip --strip-all xpi_wdx.wdx popd rem Strip and rename WFX pushd wfx\ftp\lib\ strip --strip-all ftp.wfx popd rem Return from plugins directory popd �������������������������doublecmd-0.5.8/plugins/wdx/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�014776� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/scripts/����������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016465� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/scripts/simplewdx.lua���������������������������������������������������0000644�0001750�0001750�00000001415�11610606331�021175� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-- Simple example of how to write wdx-scripts function ContentSetDefaultParams(IniFileName,PlugApiVerHi,PlugApiVerLow) --Initialization code here end first=true; function ContentGetSupportedField(Index) if (not first) then return '','', 0; -- ft_nomorefields end if (first) then first=false; return 'FieldName','', 8; -- FieldName,Units,ft_string end end function ContentGetDefaultSortOrder(FieldIndex) return 1; --or -1 end function ContentGetDetectString() return 'EXT="TXT"'; -- return detect string end function ContentGetValue(FileName, FieldIndex, UnitIndex, flags) return "test"; --return string end --function ContentGetSupportedFieldFlags(FieldIndex) --return 0; -- return flags --end --function ContentStopGetValue(Filename) --end ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/scripts/descriptionwdx.lua����������������������������������������������0000644�0001750�0001750�00000002203�11610606331�022223� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-- This script reads file descriptions from descript.ion first=true; function ContentGetSupportedField(Index) if (not first) then return '','', 0; -- ft_nomorefields end if (first) then first=false; return 'Description','', 8; -- FieldName,Units,ft_string end end function ContentGetDefaultSortOrder(FieldIndex) return 1; --or -1 end function ContentGetDetectString() return 'EXT="*"'; -- return detect string end function ContentGetValue(FileName, FieldIndex, UnitIndex, flags) if FieldIndex==0 then --Linux paths only local pat="/.*/" i,j=string.find(FileName,pat); if i~=nil then local path=string.sub(FileName,i,j); fn=string.sub(FileName,string.len(path)+1,-1); if fn~=".." then return GetDesc(path,fn); else return ""; end end end end function GetDesc(Path,Name) local f=io.open(Path..'descript.ion',"r"); if not f then return ""; end for line in f:lines() do if string.find(line,Name..' ') then f:close(); return string.sub(line,string.len(Name..' ')+1,-1); end end f:close(); return ""; end ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/xpi_wdx/����������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016460� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/xpi_wdx/lib/������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017226� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/xpi_wdx/src/������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017247� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/xpi_wdx/src/xpi_wdx.lpr�������������������������������������������������0000644�0001750�0001750�00000002262�12014201074�021434� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ Double commander ------------------------------------------------------------------------- xpi_wdx is destined to obtainin the information from xpi-files in which extensions and themes for Gecko-based applications are distributed. Copyright (C) 2010 Koblov Alexander (Alexx2000@mail.ru) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. } library xpi_wdx; {$mode objfpc}{$H+} uses Classes, xpi_wdx_intf, xpi_def, xpi_io { you can add units after this }; exports ContentGetDetectString, ContentGetSupportedField, ContentGetValue; {$R *.res} begin end. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/xpi_wdx/src/xpi_wdx.lpi�������������������������������������������������0000644�0001750�0001750�00000006112�12210604521�021423� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <CONFIG> <ProjectOptions> <Version Value="9"/> <PathDelim Value="\"/> <General> <Flags> <SaveOnlyProjectUnits Value="True"/> <MainUnitHasCreateFormStatements Value="False"/> <MainUnitHasTitleStatement Value="False"/> </Flags> <SessionStorage Value="InProjectDir"/> <MainUnit Value="0"/> <UseAppBundle Value="False"/> <ResourceType Value="res"/> </General> <VersionInfo> <UseVersionInfo Value="True"/> <MinorVersionNr Value="1"/> <StringTable FileDescription="XPI WDX plugin for Double Commander" LegalCopyright="Copyright (C) 2006-2012 Koblov Alexander" ProductVersion=""/> </VersionInfo> <BuildModes Count="1"> <Item1 Name="default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <HostApplicationFilename Value="D:\totalcmd\totalcmd.exe"/> <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <Units Count="4"> <Unit0> <Filename Value="xpi_wdx.lpr"/> <IsPartOfProject Value="True"/> <UnitName Value="xpi_wdx"/> </Unit0> <Unit1> <Filename Value="xpi_wdx_intf.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="xpi_wdx_intf"/> </Unit1> <Unit2> <Filename Value="xpi_def.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="xpi_def"/> </Unit2> <Unit3> <Filename Value="xpi_io.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="xpi_io"/> </Unit3> </Units> </ProjectOptions> <CompilerOptions> <Version Value="11"/> <PathDelim Value="\"/> <Target> <Filename Value="..\lib\xpi_wdx.wdx" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir);..\..\..\..\sdk"/> <OtherUnitFiles Value="..\..\..\..\sdk"/> <UnitOutputDirectory Value="..\lib"/> </SearchPaths> <Conditionals Value="if (TargetCPU <> 'arm') then begin CustomOptions += '-fPIC'; end; if (TargetOS = 'darwin') then begin LinkerOptions += ' -no_order_inits'; end;"/> <Linking> <Options> <PassLinkerOptions Value="True"/> <ExecutableType Value="Library"/> </Options> </Linking> <Other> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> <Debugging> <Exceptions Count="3"> <Item1> <Name Value="EAbort"/> </Item1> <Item2> <Name Value="ECodetoolError"/> </Item2> <Item3> <Name Value="EFOpenError"/> </Item3> </Exceptions> </Debugging> </CONFIG> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/xpi_wdx/src/xpi_def.pas�������������������������������������������������0000644�0001750�0001750�00000005472�12014201074�021364� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ Double commander ------------------------------------------------------------------------- xpi_wdx is destined to obtainin the information from xpi-files in which extensions and themes for Gecko-based applications are distributed. Copyright (C) 2010 Koblov Alexander (Alexx2000@mail.ru) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. } unit xpi_def; {$mode objfpc}{$H+} interface uses Classes, SysUtils; type { TInstallManifest } TInstallManifest = class public ID, Name, Version, Description, Creator, Developer, Contributor, Translator, HomePageURL, UpdateURL, TargetPlatform, Compatibility, AddonType: AnsiString; TargetApplication: TStringList; public constructor Create; destructor Destroy; override; procedure Clear; end; var ApplicationList: TStringList; implementation { TInstallManifest } procedure TInstallManifest.Clear; begin ID := EmptyStr; Name := EmptyStr; Version := EmptyStr; Description := EmptyStr; Creator := EmptyStr; Developer := EmptyStr; Contributor := EmptyStr; Translator := EmptyStr; HomePageURL := EmptyStr; UpdateURL := EmptyStr; TargetPlatform := EmptyStr; Compatibility := EmptyStr; TargetApplication.Clear; end; constructor TInstallManifest.Create; begin TargetApplication:= TStringList.Create; end; destructor TInstallManifest.Destroy; begin FreeAndNil(TargetApplication); inherited Destroy; end; initialization ApplicationList:= TStringList.Create; ApplicationList.Add('{ec8030f7-c20a-464f-9b0e-13a3a9e97384}=fx'); // Firefox ApplicationList.Add('{86c18b42-e466-45a9-ae7a-9b95ba6f5640}=mz'); // Mozilla Suite ApplicationList.Add('{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}=sm'); // SeaMonkey ApplicationList.Add('{3550f703-e582-4d05-9a08-453d09bdfdc6}=mt'); // Mozilla Thunderbird ApplicationList.Add('{a463f10c-3994-11da-9945-000d60ca027b}=fl'); // Flock ApplicationList.Add('{718e30fb-e89b-41dd-9da7-e25a45638b28}=sb'); // Sunbird ApplicationList.Add('{a23983c0-fd0e-11dc-95ff-0800200c9a66}=fc'); // Fennec //ApplicationList.Add(''); finalization FreeAndNil(ApplicationList); end. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/xpi_wdx/src/xpi_wdx_intf.pas��������������������������������������������0000644�0001750�0001750�00000014620�12014201074�022443� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ Double commander ------------------------------------------------------------------------- xpi_wdx is destined to obtainin the information from xpi-files in which extensions and themes for Gecko-based applications are distributed. Copyright (C) 2010 Koblov Alexander (Alexx2000@mail.ru) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. } unit xpi_wdx_intf; {$mode objfpc}{$H+} {$include calling.inc} interface uses Classes, SysUtils, WdxPlugin; procedure ContentGetDetectString(DetectString: PAnsiChar; MaxLen: Integer); dcpcall; function ContentGetSupportedField(FieldIndex: Integer; FieldName: PAnsiChar; Units: PAnsiChar; MaxLen: Integer): Integer; dcpcall; function ContentGetValue(FileName: PAnsiChar; FieldIndex, UnitIndex: Integer; FieldValue: PByte; MaxLen, Flags: Integer): Integer; dcpcall; implementation uses xpi_def, xpi_io; const IDX_ID = 0; IDX_NAME = 1; IDX_VERSION = 2; IDX_TYPE = 3; IDX_DESCRIPTION = 4; IDX_CREATOR = 5; IDX_DEVELOPER = 6; IDX_CONTRIBUTOR = 7; IDX_TRANSLATOR = 8; IDX_HOMEPAGEURL = 9; IDX_UPDATEURL = 10; IDX_PLATFORM = 11; IDX_COMPATIBILITY = 12; IDX_FIREFOX = 13; IDX_MOZILLA = 14; IDX_SEAMONKEY = 15; IDX_THUNDERBIRD = 16; IDX_FLOCK = 17; IDX_SUNBIRD = 18; IDX_FENNEC = 19; FIELD_COUNT = 20; var CurrentFileName: AnsiString; // Current *.xpi file InstallManifest: TInstallManifest; // Cache for current file function EnsureLength(S: AnsiString; MaxLen: Integer): AnsiString; begin Result := S; if Length(Result) >= MaxLen then begin Result := Copy(Result, 1, MaxLen - 4); Result := Result + '...'; end; end; procedure ContentGetDetectString(DetectString: PAnsiChar; MaxLen: Integer); dcpcall; begin StrPLCopy(DetectString, 'EXT="XPI"', MaxLen) end; function ContentGetSupportedField(FieldIndex: Integer; FieldName: PAnsiChar; Units: PAnsiChar; MaxLen: Integer): Integer; dcpcall; var Field: AnsiString; begin StrPCopy(Units, EmptyStr); if FieldIndex >= FIELD_COUNT then begin Result := FT_NOMOREFIELDS; Exit; end; Result := FT_STRING; case FieldIndex of IDX_ID: Field := 'ID'; IDX_NAME: Field := 'Name'; IDX_VERSION: Field := 'Version'; IDX_TYPE: Field := 'Type'; IDX_DESCRIPTION: Field := 'Description'; IDX_CREATOR: Field := 'Creator'; IDX_DEVELOPER: Field := 'Developer(s)'; IDX_CONTRIBUTOR: Field := 'Contributor(s)'; IDX_TRANSLATOR: Field := 'Translator(s)'; IDX_HOMEPAGEURL: Field := 'Home page'; IDX_UPDATEURL: Field := 'Update URL'; IDX_PLATFORM: Field := 'Platform(s)'; IDX_COMPATIBILITY: Field := 'Compatibility'; IDX_FIREFOX: Field := 'Firefox'; IDX_MOZILLA: Field := 'Mozilla Suite'; IDX_SEAMONKEY: Field := 'SeaMonkey'; IDX_THUNDERBIRD: Field := 'Mozilla Thunderbird'; IDX_FLOCK: Field := 'Flock'; IDX_SUNBIRD: Field := 'Sunbird'; IDX_FENNEC: Field := 'Fennec'; end; StrPLCopy(FieldName, Field, MaxLen); end; function ContentGetValue(FileName: PAnsiChar; FieldIndex, UnitIndex: Integer; FieldValue: PByte; MaxLen, Flags: Integer): Integer; dcpcall; var Value : AnsiString; begin Result := FT_FILEERROR; if not FileExists(FileName) then Exit; if CurrentFileName <> FileName then begin if not ParseInsatallManifest(FileName, InstallManifest) then Exit; CurrentFileName := FileName; end; if (FieldIndex >= FIELD_COUNT) then begin Result := FT_NOSUCHFIELD; Exit; end; Result := FT_STRING; case FieldIndex of IDX_ID: Value := InstallManifest.ID; IDX_NAME: Value := InstallManifest.Name; IDX_VERSION: Value := InstallManifest.Version; IDX_TYPE: Value := InstallManifest.AddonType; IDX_DESCRIPTION: Value := InstallManifest.Description; IDX_CREATOR: Value := InstallManifest.Creator; IDX_DEVELOPER: Value := InstallManifest.Developer; IDX_CONTRIBUTOR: Value := InstallManifest.Contributor; IDX_TRANSLATOR: Value := InstallManifest.Translator; IDX_HOMEPAGEURL: Value := InstallManifest.HomePageURL; IDX_UPDATEURL: Value := InstallManifest.UpdateURL; IDX_PLATFORM: Value := InstallManifest.TargetPlatform; IDX_COMPATIBILITY: Value := InstallManifest.Compatibility; IDX_FIREFOX: Value := InstallManifest.TargetApplication.Values[ApplicationList.Names[0]]; IDX_MOZILLA: Value := InstallManifest.TargetApplication.Values[ApplicationList.Names[1]]; IDX_SEAMONKEY: Value := InstallManifest.TargetApplication.Values[ApplicationList.Names[2]]; IDX_THUNDERBIRD: Value := InstallManifest.TargetApplication.Values[ApplicationList.Names[3]]; IDX_FLOCK: Value := InstallManifest.TargetApplication.Values[ApplicationList.Names[4]]; IDX_SUNBIRD: Value := InstallManifest.TargetApplication.Values[ApplicationList.Names[5]]; IDX_FENNEC: Value := InstallManifest.TargetApplication.Values[ApplicationList.Names[6]]; else Result := FT_FIELDEMPTY; Exit; end; StrPLCopy(PAnsiChar(FieldValue), EnsureLength(Value, MaxLen), MaxLen); end; initialization CurrentFileName := EmptyStr; InstallManifest := TInstallManifest.Create; finalization FreeAndNil(InstallManifest); end. ����������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/xpi_wdx/src/xpi_io.pas��������������������������������������������������0000644�0001750�0001750�00000014703�12014201074�021232� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ Double commander ------------------------------------------------------------------------- xpi_wdx is destined to obtainin the information from xpi-files in which extensions and themes for Gecko-based applications are distributed. Copyright (C) 2010 Koblov Alexander (Alexx2000@mail.ru) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. } unit xpi_io; {$mode objfpc}{$H+} interface uses Classes, SysUtils, xpi_def; function ParseInsatallManifest(FileName: PAnsiChar; out InstallManifest: TInstallManifest): Boolean; implementation uses Unzip, ZipUtils, DOM, XMLRead; function ExtractInstallManifest(FileName: PAnsiChar; out MemoryStream: TMemoryStream): Boolean; var xpiFile: unzFile = nil; rdfInfo: unz_file_info; iError: LongInt; FileBuffer: Pointer = nil; begin Result:= False; xpiFile:= unzOpen(FileName); if Assigned(xpiFile) then try iError:= unzLocateFile(xpiFile, 'install.rdf', 0); if iError <> UNZ_OK then Exit; iError:= unzGetCurrentFileInfo(xpiFile, @rdfInfo, nil, 0, nil, 0, nil, 0); if iError <> UNZ_OK then Exit; FileBuffer:= AllocMem(rdfInfo.uncompressed_size); if FileBuffer = nil then Exit; iError := unzOpenCurrentFile(xpiFile); if iError <> UNZ_OK then Exit; iError := unzReadCurrentFile(xpiFile, FileBuffer, rdfInfo.uncompressed_size); if iError < 0 then Exit; if MemoryStream.Write(FileBuffer^, iError) = iError then Result:= True; iError := unzCloseCurrentFile(xpiFile); finally iError := unzClose(xpiFile); if Assigned(FileBuffer) then FreeMem(FileBuffer); end; end; function AddonType(const sType: AnsiString): AnsiString; var iType: Integer; begin iType:= StrToIntDef(sType, 0); case iType of 2: Result:= 'Extension'; 4: Result:= 'Theme'; 8: Result:= 'Locale'; 16: Result:= 'Plugin'; 32: Result:= 'Multiple Item Package'; else Result:= 'Unknown'; end; end; function AddString(const TargetStr, SourceStr: AnsiString): AnsiString; begin if Length(TargetStr) = 0 then Result:= SourceStr else Result:= TargetStr + ', ' + SourceStr; end; procedure AddApplication(const InstallManifest: TInstallManifest; Node: TDOMNode); var I: LongWord; Application: AnsiString; ID, MinVersion, MaxVersion: AnsiString; begin Node:= Node.FindNode('Description'); if Assigned(Node) then begin for I:= 0 to Node.ChildNodes.Count - 1 do with Node.ChildNodes.Item[I] do begin if nodeName = 'em:id' then ID:= FirstChild.NodeValue else if nodeName = 'em:minVersion' then MinVersion:= FirstChild.NodeValue else if nodeName = 'em:maxVersion' then MaxVersion:= FirstChild.NodeValue end; if InstallManifest.TargetApplication.IndexOfName(ID) < 0 then begin InstallManifest.TargetApplication.Add(ID + '=' + MinVersion + '-' + MaxVersion); Application:= ApplicationList.Values[ID]; if Length(Application) <> 0 then begin InstallManifest.Compatibility:= AddString(InstallManifest.Compatibility, Application); end; end; end; end; function ParseInsatallManifest(FileName: PAnsiChar; out InstallManifest: TInstallManifest): Boolean; var I: LongWord; MemoryStream: TMemoryStream = nil; Doc: TXMLDocument = nil; mainNode: TDOMNode = nil; childNode: TDOMNode = nil; begin Result:= False; MemoryStream:= TMemoryStream.Create; try if ExtractInstallManifest(FileName, MemoryStream) then; begin MemoryStream.Position:= 0; ReadXMLFile(Doc, MemoryStream); if Assigned(Doc.documentElement) then mainNode:= Doc.documentElement.FindNode('Description'); { if not Assigned(mainNode) then mainNode:= Doc.documentElement.FindNode('RDF:Description'); } if Assigned(mainNode) then begin InstallManifest.Clear; for I:= 0 to mainNode.ChildNodes.Count - 1 do begin childNode := mainNode.ChildNodes.Item[I]; if Assigned(childNode) then with childNode do begin if nodeName = 'em:id' then InstallManifest.ID:= FirstChild.NodeValue else if nodeName = 'em:name' then InstallManifest.Name:= FirstChild.NodeValue else if nodeName = 'em:version' then InstallManifest.Version:= FirstChild.NodeValue else if nodeName = 'em:type' then InstallManifest.AddonType:= AddonType(FirstChild.NodeValue) else if nodeName = 'em:description' then InstallManifest.Description:= FirstChild.NodeValue else if nodeName = 'em:creator' then InstallManifest.Creator:= FirstChild.NodeValue else if nodeName = 'em:contributor' then InstallManifest.Contributor:= AddString(InstallManifest.Contributor, FirstChild.NodeValue) else if nodeName = 'em:developer' then InstallManifest.Developer:= AddString(InstallManifest.Developer, FirstChild.NodeValue) else if nodeName = 'em:translator' then InstallManifest.Translator:= AddString(InstallManifest.Translator, FirstChild.NodeValue) else if nodeName = 'em:homepageURL' then InstallManifest.HomePageURL:= FirstChild.NodeValue else if nodeName = 'em:updateURL' then InstallManifest.UpdateURL:= FirstChild.NodeValue else if nodeName = 'em:targetPlatform' then InstallManifest.TargetPlatform:= AddString(InstallManifest.TargetPlatform, FirstChild.NodeValue) else if nodeName = 'em:targetApplication' then AddApplication(InstallManifest, childNode) end; end; Result:= True; end; FreeAndNil(Doc); end; finally FreeAndNil(MemoryStream); end; end; end. �������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/xpi_wdx/COPYING.txt�����������������������������������������������������0000644�0001750�0001750�00000016743�12014201074�020326� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. �����������������������������doublecmd-0.5.8/plugins/wdx/deb_wdx/����������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016412� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/deb_wdx/lib/������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017160� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/deb_wdx/src/������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017201� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/deb_wdx/src/deb_wdx_intf.pas��������������������������������������������0000644�0001750�0001750�00000013575�12014201074�022337� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//*************************************************************** // This file is part of DEBWDX, a content plugin for // Total Commander handling Debian Linux package. // // Copyright (C) 2005 Ralgh Young (yang.guilong@gmail.com) //*************************************************************** // This program is free software; you can redistribute it and/or modify it // under the GPL. // // Only version 2.0 package is supported, and I would not to add support for // old format since I haven't old packages. But if you have some package of old format, // and you're interested in, you're welcomed to modify the source by yourself. // FYI: refer to dpkg-deb/extract.c in dpkg-deb's source, // and search '0.93' in function extracthalf, you're find something useful. {$A-,I-} //no alignment, no I/O error autochecking unit deb_wdx_intf; {$mode delphi}{$H+} {$include calling.inc} interface uses Classes, WdxPlugin; procedure ContentGetDetectString(DetectString:pchar; maxlen:integer); dcpcall; function ContentGetSupportedField(FieldIndex:integer;FieldName:pchar; Units:pchar;maxlen:integer):integer; dcpcall; function ContentGetValue(FileName:pchar;FieldIndex,UnitIndex:integer;FieldValue:pbyte; maxlen,flags:integer):integer; dcpcall; implementation uses SysUtils{$IFDEF GDEBUG}, DbugIntf{$ENDIF}, debunpak; var IDX_PACKAGE, IDX_VERSION, IDX_SECTION, IDX_PRIORITY, IDX_ARCH, IDX_DEPENDS, IDX_RECOMMENDS, IDX_SUGGESTS, IDX_CONFLICTS, IDX_INSTALLED_SIZE, IDX_MAINTAINER, IDX_SOURCE, IDX_SUMMARY, IDX_DESCRIPTION : integer; CurrentPackageFile: String; FieldList : TStrings; FileInfo : TStrings; procedure ContentGetDetectString(DetectString:pchar; maxlen:integer); begin StrPCopy(DetectString, 'EXT="DEB"'); end; function ContentGetSupportedField(FieldIndex:integer; FieldName:pchar; Units:pchar;maxlen:integer):integer; begin StrPCopy(Units, ''); if FieldIndex =IDX_INSTALLED_SIZE then begin StrPCopy(FieldName, FieldList.Strings[FieldIndex]); StrPCopy(Units, 'bytes|kbytes|Mbytes|Gbytes'+#0); Result := FT_NUMERIC_64; end else if FieldIndex < FieldList.Count then begin StrPCopy(FieldName, FieldList.Strings[FieldIndex]); Result := FT_STRING; end else Result := FT_NOMOREFIELDS; end; {$WRITEABLECONST ON} function ContentGetValue(FileName:pchar; FieldIndex,UnitIndex:integer; FieldValue:pbyte; maxlen,flags:integer):integer; function EnsureLength(S: string; nMaxlen: integer): string; begin Result := S; if length(Result)>=nMaxlen then begin Result := Copy(Result, 1, nMaxlen-4); Result := Result + '...'; end; end; const DescTmpFile: String = ''; var Field, Value : String; i, where_start_desc : integer; size : int64; begin Result := FT_FILEERROR; if not FileExists(FileName) then exit; if CurrentPackageFile<>FileName then begin if FileExists(DescTmpFile) then begin DeleteFile(DescTmpFile); RemoveDir(ExtractFileDir(DescTmpFile)); end; if not Deb_ExtractCtrlInfoFile(FileName, DescTmpFile) then exit; if not FileExists(DescTmpFile) then exit; FileInfo.Clear; FileInfo.LoadFromFile(DescTmpFile); CurrentPackageFile := FileName; end {$IFDEF GDEBUG} else SendDebug('Cached info reused for '+FileName); {$ENDIF}; if (FieldIndex>=FieldList.Count) then begin Result := FT_NOSUCHFIELD; exit; end; if FieldIndex<>IDX_DESCRIPTION then begin if FieldIndex=IDX_SUMMARY then //for 'Summary', return the value of Description Field := 'Description' else Field := FieldList.Strings[FieldIndex]; Value := ''; Value := FileInfo.Values[Field]; if Value='' then begin Result := FT_FIELDEMPTY; exit; end; if FieldIndex=IDX_INSTALLED_SIZE then begin size := StrToInt64Def(Value, -1); case UnitIndex of 0: //bytes size := size * 1024; // 1: //kbytes // pass 2: //mbytes size := size div 1024; 3: //gbytes size := size div (1024 * 1024); end; Move(size, FieldValue^, sizeof(size)); Result := FT_NUMERIC_64; end else //other fields, just string begin StrPCopy(PChar(FieldValue), EnsureLength(Value, maxlen)); Result := FT_STRING; end; end else //IDX_DESCRIPTION, begin Value := ''; where_start_desc := -1; for i:=0 to FileInfo.Count-1 do begin if FileInfo.Names[i]='Description' then begin where_start_desc := i; break; end; end; if where_start_desc>=0 then begin for i:=where_start_desc+1 to FileInfo.Count-1 do begin Value := Value + FileInfo.Strings[i]; end; StrPCopy(PChar(FieldValue), EnsureLength(Value, maxlen)); //Result := FT_FULLTEXT; Result := FT_STRING; end; end end; initialization FileInfo := TStringList.Create; FileInfo.NameValueSeparator := ':'; CurrentPackageFile := ''; FieldList := TStringList.Create; IDX_PACKAGE := FieldList.Add('Package'); IDX_VERSION := FieldList.Add('Version'); IDX_SECTION := FieldList.Add('Section'); IDX_PRIORITY := FieldList.Add('Priority'); IDX_ARCH := FieldList.Add('Architecture'); IDX_DEPENDS := FieldList.Add('Depends'); IDX_RECOMMENDS:= FieldList.Add('Recommends'); IDX_SUGGESTS := FieldList.Add('Suggests'); IDX_CONFLICTS := FieldList.Add('Conflicts'); IDX_INSTALLED_SIZE := FieldList.Add('Installed-Size'); IDX_MAINTAINER := FieldList.Add('Maintainer'); IDX_SOURCE := FieldList.Add('Source'); IDX_SUMMARY := FieldList.Add('Summary'); IDX_DESCRIPTION := FieldList.Add('Description'); finalization FileInfo.Free; FieldList.Free; end. �����������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/deb_wdx/src/dpkg_deb.pas������������������������������������������������0000644�0001750�0001750�00000024763�12014201074�021443� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit dpkg_deb; //Debian Linux package unpacker implemented as TFileStream //v1.0.1 add option ReadAfterDataMember, to avoid unnecessary read after data.tar.gz interface uses Classes; const MEMBER_CONTROL = 1; MEMBER_DATA = 2; type ar_hdr = record //converted from /usr/include/ar.h ar_name: array [0..Pred(16)] of char; (* name *) ar_date: array [0..Pred(12)] of char; (* modification time *) ar_uid: array [0..Pred(6)] of char; (* user id *) ar_gid: array [0..Pred(6)] of char; (* group id *) ar_mode: array [0..Pred(8)] of char; (* octal file permissions *) ar_size: array [0..Pred(10)] of char; (* size in bytes *) ar_fmag: array [0..Pred(2)] of char; (* consistency check *) end; TDebianPackage = class private //FMemberList: array of ar_hdr; FPkgVersion: string; //FDebStrm: TFileStream; FCheckHeader : boolean; //constructor Create; override; //destructor Destory; override; FFileName : string; function DoCheckHeader(arh: ar_hdr; infobuf: PChar; memberlen: integer): boolean; //function GetFileList: TStrings; function ParseHeaderLength(inh: PChar; Len: integer): integer; function SkipMember(Strm: TStream; memberlen: integer): boolean; public FMemberList: array of ar_hdr; ReadAfterDataMember: boolean; constructor Create; function ReadFromFile(DebPkgFile: string): integer; function ExtractMemberToStream(MemberIdx: integer; OutputStrm: TStream): boolean; function ExtractMemberToFile(idx: integer; OutputFile: string): boolean; published property PkgVersion: string read FPkgVersion; property CheckHeader: boolean read FCheckHeader write FCheckHeader default false; //property MemberList: array of ar_hdr read FMemberList; default; //property FileList: TStrings read GetFileList; //property GetControlFile: //need tar+gzip to implement this end; implementation uses SysUtils{$IFDEF GDEBUG}, dbugintf {$ENDIF}; const (* Pre-4BSD archives had these magic numbers in them. *) OARMAG1 = $FF6D; OARMAG2 = $FF65; ARMAG = '!<arch>'#10; (* ar "magic number" *) SARMAG = 8; (* strlen(ARMAG); *) AR_EFMT1 = '#1/'; (* extended format #1 *) ARFMAG = '`'#10''; (* static void skipmember(FILE *ar, const char *fn, long memberlen) { int c; memberlen += (memberlen&1); while (memberlen > 0) { if ((c= getc(ar)) == EOF) readfail(ar,fn,"skipped member data"); memberlen--; } } *) function TDebianPackage.SkipMember(Strm: TStream; memberlen: integer): boolean; begin Result := false; Inc(memberlen, (memberlen and 1)); if Strm.Position + memberlen > Strm.Size then exit; Strm.Seek(memberlen, soFromCurrent); Result := true; end; //return the number of members found function TDebianPackage.ReadFromFile(DebPkgFile: string): integer; var debStrm: TFileStream; MagicHeaderBuf: array[0..10] of char; //memberbuf: PChar; verinfobuf : array [0..100] of char; arh: ar_hdr; memberlen, memberidx: integer; n: integer; begin Result := 0; SetLength(FMemberList, 0); //if not Assigned(DebStrm) then raise Exception.Create('Stream not assigned'); if not FileExists(DebPkgFile) then raise Exception.Create('File not exists!'); FFileName := DebPkgFile; debStrm := TFileStream.Create(DebPkgFile, fmOpenRead or fmShareDenyWrite); try //debStrm.LoadFromFile(DebPkgFile); if DebStrm.Size < sizeof(ARMAG) + 2*sizeof(ar_hdr) then raise Exception.Create('Size of file is too small. maybe its not a debian package'); DebStrm.Seek(0, soFromBeginning); //rewind DebStrm.Read(MagicHeaderBuf, SARMAG); if StrLComp(MagicHeaderBuf, ARMAG, SARMAG)=0 then //if MagicHeaderBuf='!<arch>\n' begin memberidx:=0; repeat n := DebStrm.Read(arh, sizeof(arh)); if n=0 then break else if n<sizeof(ar_hdr) then raise Exception.Create('corrputed package'); (* if (memcmp(arh.ar_fmag,ARFMAG,sizeof(arh.ar_fmag))) ohshit("file `%.250s' is corrupt - bad magic at end of first header",debar); *) if StrLComp(arh.ar_fmag, ARFMAG, sizeof(arh.ar_fmag))<>0 then raise Exception.Create('bad magic at end of first header'); memberlen := ParseHeaderLength(arh.ar_size, sizeof(arh.ar_size)); if memberlen<0 then raise Exception.Create('corrputed package'); //ohshit("file `%.250s' is corrupt - negative member length %ld",debar,memberlen); //save header (member info) into list SetLength(FMemberList, memberidx+1); FMemberList[memberidx] := arh; Inc(memberidx); if (memberidx=0) and FCheckHeader then //package header begin //GetMem(memberbuf, memberlen + 1); try //if DebStrm.Read(memberbuf, memberlen + (memberlen and 1))<memberlen then exit; //failed to read header info member if DebStrm.Read(verinfobuf, memberlen + (memberlen and 1))<memberlen then exit; {$IFDEF GDEBUG} SendDebug(StrPas(verinfobuf)); {$ENDIF} //if CheckHeader(arh, memberbuf, memberlen) then exit; if not DoCheckHeader(arh, verinfobuf, memberlen) then exit; finally //FreeMem(memberbuf, memberlen + 1); end; end else if (Trim(arh.ar_name)='data.tar.gz') and (not ReadAfterDataMember) then break else SkipMember(DebStrm, memberlen) until (DebStrm.Position>=DebStrm.Size); Result := memberidx + 1; end else if StrLComp(MagicHeaderBuf,'!<arch>',7)=0 then raise Exception.Create('Bad magic header. maybe it''s not a debian package') //"file looks like it might be an archive which has been\n" //"corrupted by being downloaded in ASCII mode.\n" else if StrLComp(MagicHeaderBuf,'0.93',4)=0 then raise Exception.Create('Old format debian package not supported') else raise Exception.Create('Bad magic header. maybe it''s not a debian package'); finally DebStrm.Free; end; end; function TDebianPackage.ExtractMemberToStream(MemberIdx: integer; OutputStrm: TStream): boolean; var idx, memberlen: integer; DebStrm : TFileStream; arh: ar_hdr; begin Result := false; if not Assigned(OutputStrm) then exit; if MemberIdx > High(FMemberList) then exit; DebStrm := TFileStream.Create(FFileName, fmOpenRead or fmShareDenyWrite); try DebStrm.Seek(SARMAG, soFromBeginning); //rewind to the first member idx := 0; while(idx<=memberidx) do begin arh := FMemberList[idx]; if DebStrm.Read(arh, sizeof(arh))<sizeof(ar_hdr) then raise Exception.Create('corrputed package'); memberlen := ParseHeaderLength(arh.ar_size, sizeof(arh.ar_size)); if memberlen<0 then raise Exception.Create('corrputed package'); //ohshit("file `%.250s' is corrupt - negative member length %ld",debar,memberlen); //if (idx=1) then //header // if ReadControlFile(DebStrm, arh, memberlen)<0 then raise.... if (idx=MemberIdx) then begin if OutputStrm.CopyFrom(DebStrm, memberlen)<memberlen then exit; Result := True; break; end else SkipMember(DebStrm, memberlen); Inc(idx); end; finally DebStrm.Free; end; end; function TDebianPackage.ExtractMemberToFile(idx: integer; OutputFile: string): boolean; var AFileStrm: TFileStream; begin Result := false; if idx>High(FMemberList) then exit; AFileStrm := TFileStream.Create(OutputFile, fmCreate or fmOpenWrite or fmShareDenyWrite); try Result := ExtractMemberToStream(idx, AFileStrm); finally AFileStrm.Free; end; end; function TDebianPackage.ParseHeaderLength(inh: PChar; Len: integer): integer; (*static unsigned long parseheaderlength(const char *inh, size_t len, const char *fn, const char *what) { char lintbuf[15]; unsigned long r; char *endp; if (memchr(inh,0,len)) ohshit("file `%.250s' is corrupt - %.250s length contains nulls",fn,what); assert(sizeof(lintbuf) > len); memcpy(lintbuf,inh,len); lintbuf[len]= ' '; *strchr(lintbuf,' ')= 0; r= strtoul(lintbuf,&endp,10); if ( *endp ) ohshit("file `%.250s' is corrupt - bad digit (code %d) in %s",fn,*endp,what); return r; *) var lintbuf: array[0..14] of char; begin if len> sizeof(lintbuf) then raise Exception.Create('ParseMemberLength'); StrLCopy(lintbuf, inh, len); lintbuf[len] := #0; StrScan(lintbuf, ' ')^ := #0; Result := StrToInt(StrPas(lintbuf)); end; //return the length of control.tar.gz (*function TDebianPackage.CheckControlFile(DebStrm: TMemoryStream; arh: ar_hdr; memberlen: integer; OutputFile: String): integer; begin end; *) //if any error encounted, return false function TDebianPackage.DoCheckHeader(arh: ar_hdr; infobuf: PChar; memberlen: integer): boolean; const DebianSign = 'debian-binary '; var verinfobuf: array[0..20] of char; cur: PChar; begin Result := false; if StrLComp(arh.ar_name, DebianSign, sizeof(arh.ar_name))<>0 then exit; //ohshit("file `%.250s' is not a debian binary archive (try dpkg-split?)",debar); //memberlen = ParseArchiveLength(arh.ar_size,sizeof(arh.ar_size)); infobuf[memberlen] := #0; cur := StrScan(infobuf, #10); if (cur=nil) then exit; //ohshit("archive has no newlines in header"); cur^ := #0; cur := StrScan(infobuf,'.'); if (cur=nil) then exit; //ohshit("archive has no dot in version number"); cur^ := #0; if (StrComp(infobuf,'2')<>0) then exit; //ohshit("archive version %.250s not understood, get newer " BACKEND, infobuf); cur^ := '.'; //restore version delimiter //StrLCopy(verinfobuf, infobuf, min(sizeof(verinfobuf)-1, memberlen); //got the package version info StrLCopy(verinfobuf, infobuf, sizeof(verinfobuf)-1); verinfobuf[sizeof(verinfobuf)-1] := #0; FPkgVersion := StrPas(verinfobuf); Result := true; end; constructor TDebianPackage.Create; begin CheckHeader := True; ReadAfterDataMember := false; end; end.�������������doublecmd-0.5.8/plugins/wdx/deb_wdx/src/untar.pas���������������������������������������������������0000644�0001750�0001750�00000022506�12014201074�021026� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit UnTar; {$mode delphi}{$H+} interface uses SysUtils, Classes, {$IFDEF ABOUTDLG}DsgnIntf, {$ENDIF}tarfile; CONST BUFSIZE = 512 * 128; // 512 = SECSIZE in unit tarfile type TZeroHundred = 0..100; TOverwriteMode = ( omSkip, omRename, omReplace ); TNextFile = record name : string; size : longint; timestamp : TDateTime end; {$IFDEF ABOUTDLG} TAboutProperty = class(TPropertyEditor) public procedure Edit; override; function GetAttributes: TPropertyAttributes; override; function GetValue: string; override; end; {$ENDIF} TUnTar = class(TComponent) private { Private declarations } {$IFDEF ABOUTDLG} FAbout : TAboutProperty; {$ENDIF} FOnNextFile : TNotifyEvent; FNextFile : TNextFile; FCreateEmptyDir: boolean; FOnExtractOverwrite : TNotifyEvent; FOnProgress : TNotifyEvent; FProgress : integer; FProgressStep : TZeroHundred; FOverwriteMode : TOverwriteMode; FOverwriteThisTime : TOverwriteMode; FOverwriteFilename : String; FFileSource : string; FUnpackPath : string; FNewFileName : string; procedure DoProgress( tarfile : TTarFile); procedure CreateNextFile( tarfile: TTarfile); function TranslateDate(dt: TDateTimeRec): longint; protected { Protected declarations } procedure DoOnNextFile; virtual; procedure DoOnExtractOverwrite; virtual; procedure DoOnProgress; virtual; public { Public declarations } constructor Create( AOwner: TComponent); override; // destructor Free; procedure UnTar; procedure UnTarSelected( list: TStringList); procedure GetInfo; property Progress : integer read FProgress; property NextFile : TNextfile read FNextFile; property OverwriteThisTime : TOverwriteMode read FOverwriteThisTime write FOverwriteThisTime; property OverwriteFilename : String read FOverwriteFilename write FOverwriteFilename; published { Published declarations } {$IFDEF ABOUTDLG} property About: TAboutProperty read FAbout write FAbout; {$ENDIF} property FileSource : String read FFileSource write FFileSource; property UnpackPath : String read FUnpackPath write FUnpackPath; property ProgressStep : TZeroHundred read FProgressStep write FProgressStep; property OnProgress : TNotifyEvent read FOnProgress write FOnProgress; Property OverwriteMode : TOverwriteMode read FOverwriteMode write FOverwriteMode; Property CreateEmptyDir: boolean read FCreateEmptyDir write FCreateEmptyDir; Property OnExtractOverwrite : TNotifyEvent read FOnExtractOverwrite write FOnExtractOverwrite; Property OnNextFile : TNotifyEvent read FOnNextFile write FOnNextFile; end; procedure Register; implementation {$IFDEF ABOUTDLG}uses utils;{$ENDIF} {$IFDEF ABOUTDLG} procedure TAboutProperty.Edit; var utils : TUtils; begin ShowMessage(utils.CreateAboutMsg('DelphiUnTar')) end; function TAboutProperty.GetAttributes: TPropertyAttributes; begin Result := [paMultiSelect, paDialog, paReadOnly]; end; function TAboutProperty.GetValue: string; begin Result := 'DelphiUnTar'; end; {$ENDIF} constructor TUnTar.Create( AOwner: TComponent); begin inherited Create( AOwner); FFileSource := ''; FUnpackPath := ''; FProgressStep := 0; FCreateEmptyDir := false; //FOverwriteMode := omRename FOverwriteMode := omReplace; end; procedure TUnTar.DoOnNextFile; begin if Assigned (FOnNextFile) then FOnNextFile (self) end; procedure TUnTar.DoOnExtractOverwrite; begin if Assigned (FOnExtractOverwrite) then FOnExtractOverwrite (self) end; procedure TUnTar.DoOnProgress; begin if Assigned (FOnProgress) then FOnProgress (self) end; procedure TUnTar.DoProgress( tarfile : TTarFile); var dummy : integer; begin if FProgressStep > 0 then begin dummy := tarfile.Progress; if (dummy >= FProgress + FProgressStep) or (dummy = 100) then begin FProgress := dummy - (dummy mod FProgressStep); if dummy = 100 then FProgress := dummy; DoOnProgress end end end; function TUnTar.TranslateDate( dt : TDateTimeRec) : longint; begin Result := DateTimeToFileDate( EncodeDate( dt.year, dt.month, dt.day) + EncodeTime( dt.hour, dt.min, dt.sec, 0)) end; procedure TUnTar.CreateNextFile( tarfile: TTarfile); type TBuffer = Array [0..Pred(BUFSIZE)] Of byte; var outfiledir: string; outf: TFileStream; iread: longint; buffer: TBuffer; begin outfileDir := ExtractFileDir(FNextFile.name); // Check if sub-dir exists, if not create if not(DirectoryExists(outfileDir)) and (outfileDir<>'') then begin outfileDir := ExpandFileName(outfileDir); ForceDirectories(outfileDir); end; if outfileDir <> '' then outfileDir := outfileDir + PathDelim; FNewFilename := outfileDir+ExtractFileName(FNextFile.name); FOverwriteThisTime := omRename; while (FileExists( FNewFilename)) and (FOverwriteMode = omRename)and (FOverwriteThisTime = omRename) do begin FOverwriteFilename := ''; // Raise event to ask what should be done DoOnExtractOverwrite; if (FOverwriteThisTime = omRename) and (FOverwriteFilename <> '') then FNewFilename := FOverwriteFilename end; if (not FileExists( FNewFilename)) or (FOverwriteMode = omReplace) or (FOverwriteThisTime = omReplace) then begin outf := TFileStream.Create(FNewFilename, fmCreate or fmShareDenyWrite); while FNextFile.size > 0 do begin iread := tarfile.ReadFile( buffer, BUFSIZE); outf.Write( buffer, iread); FNextFile.size := FNextFile.size - iread; DoProgress(tarfile) end; FileSetDate(outf.Handle, DateTimeToFileDate(FNextFile.timestamp)); outf.Free end else begin tarfile.SkipFile; // We do not need the file DoProgress(tarfile) end end; procedure TUnTar.UnTar; var oldDir, outfileDir : string; tarfile : TTarFile; begin FProgress := 0; oldDir := getCurrentDir; // check if destination-path exists if FUnpackPath <> '' then begin if not(DirectoryExists(FUnpackPath)) then ForceDirectories(FUnpackPath); setCurrentDir(FUnpackPath); end; tarfile := TTarFile.Create( FFileSource); DoProgress(tarfile); while not( tarfile.EOF) do begin FNextFile.name := tarfile.GetNextFilename; DoProgress( tarfile); outfileDir := ExtractFileDir(FNextFile.name); if FCreateEmptyDir then // Check if sub-dir exists, if not create if not(DirectoryExists(outfileDir)) and (outfileDir<>'') then begin outfileDir := ExpandFileName(outfileDir); ForceDirectories(outfileDir); end; FNextFile.size := tarfile.GetNextSize; if FNextFile.size > 0 then begin //FNextFile.timestamp := tarfile.GetNextDate; FNextFile.timestamp := TranslateDate(tarfile.GetNextDate); DoOnNextFile; // raise event that we start with new file // Info is now read and in FNextFile // Create the file CreateNextFile(tarfile) end end; DoProgress( tarfile); tarfile.Free; setCurrentDir(oldDir) end; procedure TUnTar.UnTarSelected( list: TStringList); var oldDir, outfileDir : string; tarfile : TTarFile; begin FProgress := 0; oldDir := getCurrentDir; // check if destination-path exists if FUnpackPath <> '' then begin if not(DirectoryExists(FUnpackPath)) then ForceDirectories(FUnpackPath); setCurrentDir(FUnpackPath); end; tarfile := TTarFile.Create( FFileSource); DoProgress(tarfile); while not( tarfile.EOF) do begin FNextFile.name := tarfile.GetNextFilename; DoProgress( tarfile); outfileDir := ExtractFileDir(FNextFile.name); FNextFile.size := tarfile.GetNextSize; if FNextFile.size > 0 then begin //FNextFile.timestamp := tarfile.GetNextDate; FNextFile.timestamp := TranslateDate(tarfile.GetNextDate); if list.IndexOf(FNextFile.Name) > -1 then begin DoOnNextFile; // raise event that we start with new file // Info is now read and in FNextFile // Create the file CreateNextFile(tarfile) end else tarFile.SkipFile end end; DoProgress( tarfile); tarfile.Free; setCurrentDir(oldDir) end; procedure TUnTar.GetInfo; var tarfile : TTarFile; begin FProgress := 0; tarfile := TTarFile.Create( FFileSource); DoProgress( tarfile); while not( tarfile.EOF) do begin FNextFile.name := tarfile.GetNextFilename; FNextFile.size := tarfile.GetNextSize; DoProgress( tarfile); if FNextFile.size > 0 then begin //FNextFile.timestamp := tarfile.GetNextDate; FNextFile.timestamp := TranslateDate(tarfile.GetNextDate); tarfile.SkipFile; DoOnNextFile; DoProgress( tarfile) end end; DoProgress( tarfile); tarfile.Free; end; procedure Register; begin RegisterComponents('Samples', [TUnTar]); {$IFDEF ABOUTDLG} RegisterPropertyEditor(TypeInfo(TAboutProperty), TUnTar, 'ABOUT', TAboutProperty); {$ENDIF} end; end. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/deb_wdx/src/minigzip.pas������������������������������������������������0000644�0001750�0001750�00000011444�12014201074�021522� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ minigzip.c -- simulate gzip using the zlib compression library Copyright (C) 1995-1998 Jean-loup Gailly. minigzip is a minimal implementation of the gzip utility. This is only an example of using zlib and isn't meant to replace the full-featured gzip. No attempt is made to deal with file systems limiting names to 14 or 8+3 characters, etc... Error checking is very limited. So use minigzip only for testing; use gzip for the real thing. On MSDOS, use only on file names without extension or in pipe mode. Pascal tranlastion based on code contributed by Francisco Javier Crespo Copyright (C) 1998 by Jacques Nomssi Nzali For conditions of distribution and use, see copyright notice in readme.txt } unit minigzip; {$mode fpc}{$H+} interface uses gzio; procedure gz_compress (var infile:file; outfile:gzFile); procedure gz_uncompress (infile:gzFile; var outfile:file); procedure file_compress (filename:string; mode:string); procedure file_uncompress (filename:string); implementation const BUFLEN = 16384 ; GZ_SUFFIX = '.gz' ; {$DEFINE MAXSEF_64K} var buf : packed array [0..BUFLEN-1] of byte; { Global uses BSS instead of stack } prog : string; { ERROR ===================================================================== Display error message and exit ============================================================================} procedure error (msg:string); begin writeln (prog,': ',msg); halt(1); end; { GZ_COMPRESS =============================================================== Compress input to output then close both files ============================================================================} procedure gz_compress (var infile:file; outfile:gzFile); var len : cardinal; ioerr : integer; err : integer; begin while true do begin {$I-} blockread (infile, buf, BUFLEN, len); {$I+} ioerr := IOResult; if (ioerr <> 0) then begin writeln ('read error: ',ioerr); halt(1); end; if (len = 0) then break; if (gzwrite (outfile, @buf, len) <> len) then error (gzerror (outfile, err)); end; {WHILE} close (infile); if (gzclose (outfile) <> 0{Z_OK}) then error ('gzclose error'); end; { GZ_UNCOMPRESS ============================================================= Uncompress input to output then close both files ============================================================================} procedure gz_uncompress (infile:gzFile; var outfile:file); var len : integer; written : cardinal; ioerr : integer; err : integer; begin while true do begin len := gzread (infile, @buf, BUFLEN); if (len < 0) then error (gzerror (infile, err)); if (len = 0) then break; {$I-} blockwrite (outfile, buf, len, written); {$I+} if (written <> len) then error ('write error'); end; {WHILE} {$I-} close (outfile); {$I+} ioerr := IOResult; if (ioerr <> 0) then begin writeln ('close error: ',ioerr); halt(1); end; if (gzclose (infile) <> 0{Z_OK}) then error ('gzclose error'); end; { FILE_COMPRESS ============================================================= Compress the given file: create a corresponding .gz file and remove the original ============================================================================} procedure file_compress (filename:string; mode:string); var infile : file; outfile : gzFile; ioerr : integer; outname : string; begin Assign (infile, filename); {$I-} Reset (infile,1); {$I+} ioerr := IOResult; if (ioerr <> 0) then begin writeln ('open error: ',ioerr); halt(1); end; outname := filename + GZ_SUFFIX; outfile := gzopen (outname, mode); if (outfile = NIL) then begin writeln (prog,': can''t gzopen ',outname); halt(1); end; gz_compress(infile, outfile); erase (infile); end; { FILE_UNCOMPRESS =========================================================== Uncompress the given file and remove the original ============================================================================} procedure file_uncompress (filename:string); var inname : string; outname : string; infile : gzFile; outfile : file; ioerr : integer; len : integer; begin len := Length(filename); if (copy(filename,len-2,3) = GZ_SUFFIX) then begin inname := filename; outname := copy(filename,0,len-3); end else begin inname := filename + GZ_SUFFIX; outname := filename; end; infile := gzopen (inname, 'r'); if (infile = NIL) then begin writeln (prog,': can''t gzopen ',inname); halt(1); end; Assign (outfile, outname); {$I-} Rewrite (outfile,1); {$I+} ioerr := IOResult; if (ioerr <> 0) then begin writeln ('open error: ',ioerr); halt(1); end; gz_uncompress (infile, outfile); { erase (infile); } end; end. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/deb_wdx/src/deb_wdx.lpi�������������������������������������������������0000644�0001750�0001750�00000004742�12210604521�021316� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <CONFIG> <ProjectOptions> <Version Value="9"/> <PathDelim Value="\"/> <General> <SessionStorage Value="InProjectDir"/> <MainUnit Value="0"/> </General> <VersionInfo> <UseVersionInfo Value="True"/> <MinorVersionNr Value="1"/> <StringTable FileDescription="DEB WDX plugin for Double Commander" LegalCopyright="Copyright (C) 2006-2012 Koblov Alexander" ProductVersion=""/> </VersionInfo> <BuildModes Count="1"> <Item1 Name="default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <Units Count="1"> <Unit0> <Filename Value="deb_wdx.dpr"/> <IsPartOfProject Value="True"/> </Unit0> </Units> </ProjectOptions> <CompilerOptions> <Version Value="11"/> <PathDelim Value="\"/> <Target> <Filename Value="..\lib\deb_wdx.wdx" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir);..\..\..\..\sdk"/> <OtherUnitFiles Value="..\..\..\..\sdk"/> <UnitOutputDirectory Value="..\lib"/> </SearchPaths> <Conditionals Value="if (TargetCPU <> 'arm') then begin CustomOptions += '-fPIC'; end; if (TargetOS = 'darwin') then begin LinkerOptions += ' -no_order_inits'; end;"/> <Parsing> <SyntaxOptions> <SyntaxMode Value="Delphi"/> <CStyleOperator Value="False"/> </SyntaxOptions> </Parsing> <Linking> <LinkSmart Value="True"/> <Options> <PassLinkerOptions Value="True"/> <ExecutableType Value="Library"/> </Options> </Linking> <Other> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> <Debugging> <Exceptions Count="3"> <Item1> <Name Value="EAbort"/> </Item1> <Item2> <Name Value="ECodetoolError"/> </Item2> <Item3> <Name Value="EFOpenError"/> </Item3> </Exceptions> </Debugging> </CONFIG> ������������������������������doublecmd-0.5.8/plugins/wdx/deb_wdx/src/deb_wdx.dpr�������������������������������������������������0000644�0001750�0001750�00000001260�12014201074�021305� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//*************************************************************** // This file is part of DEBWDX, a content plugin for // Total Commander handling Debian Linux package. // // Copyright (C) 2005 Ralgh Young (yang.guilong@gmail.com) //*************************************************************** // Add some changes for Lazarus and Linux compatibility // // Copyright (C) 2009 Koblov Alexander (Alexx2000@mail.ru) //*************************************************************** library deb_wdx; uses SysUtils, Classes, WdxPlugin, deb_wdx_intf in 'deb_wdx_intf.pas'; exports ContentGetDetectString, ContentGetSupportedField, ContentGetValue; {$R *.res} begin end. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/deb_wdx/src/tarfile.pas�������������������������������������������������0000644�0001750�0001750�00000013540�12014201074�021321� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit tarfile; interface uses classes, sysutils, math; const EXP_FILENAME = 0; EXP_SIZE = 1; EXP_DATE = 2; EXP_BODY = 3; EXP_ERROR = 4; EXP_EOF = 5; SECSIZE = 512; // SECSPERBLOCK = 120; BUFSIZE = SECSIZE; // * SECSPERBLOCK; type TBuffer = Array [0..Pred(BUFSIZE)] Of byte; TDateTimeRec = record sec : integer; min : integer; hour : integer; day : integer; month : integer; year : integer; end; TTarFile = class private FTarF : TFileStream; FExpecting : byte; FName : string; FBuffer : TBuffer; FLen : longint; FUnreadSec : integer; function CrackUnixDateTime( UnixDate : longint) : TDateTimeRec; procedure AdjustFilename( var filename : string); public constructor Create( filename : string); destructor Free; function EOF : boolean; function Progress : integer; function GetNextFilename : string; function GetNextSize : longint; function GetNextDate : TDateTimeRec; function ReadFile( var buffer; maximum : longint) : longint; Procedure SkipFile; protected end; implementation // ************************************************** // Private part // ************************************************** {$WRITEABLECONST ON} function TTarFile.CrackUnixDateTime( UnixDate : longint) : TDateTimeRec; Const monlen : Array [1..12] Of byte = (31,28,31,30,31,30,31,31,30,31,30,31); var dt : TDateTimeRec; begin dt.sec := UnixDate mod 60; UnixDate := UnixDate div 60; dt.min := UnixDate mod 60; UnixDate := UnixDate div 60; dt.hour := UnixDate mod 24; UnixDate := UnixDate div 24; dt.year := 1970; while ((UnixDate>=365) and (dt.year mod 4 <> 0)) or ((UnixDate>=366) and (dt.year mod 4 = 0 )) do begin if dt.year mod 4 = 0 then UnixDate := UnixDate - 1; UnixDate := UnixDate - 365; Inc(dt.year) end; dt.month := 1; if dt.year mod 4 = 0 then Inc(monlen[2]); while UnixDate>=monlen[dt.month] do begin UnixDate := UnixDate - monlen[dt.month]; Inc(dt.month) end; if dt.year mod 4 = 0 then Dec(monlen[2]); dt.day := UnixDate + 1; Result := dt end; Procedure TTarFile.AdjustFilename(Var filename : string); Const badletter : Set Of char = ['+',' ',':','<','>','|']; Var i : byte; Begin { openfile } For i := Length(filename) DownTo 1 Do Begin If filename[i] = '/' Then filename[i] := '\'; If filename[i] In badletter Then filename[i] := '_'; End end; // ************************************************** // Public part // ************************************************** constructor TTarFile.Create( filename : string); begin FTarF := TFileStream.Create( filename, fmOpenRead or fmShareDenyWrite); end; destructor TTarFile.Free; begin FTarF.Free; end; function TTarFile.EOF : boolean; begin EOF := FTarF.Size = FTarF.Position; end; function TTarFile.Progress : integer; begin Progress := Floor((FTarF.Position / FTarF.Size) * 100) end; function TTarFile.GetNextFilename : string; var iread : integer; i : integer; begin FName := ''; if (not(EOF) and (FExpecting = EXP_FILENAME)) then begin iread := FTarF.Read( FBuffer, SECSIZE); If iread <> SECSIZE Then FExpecting := EXP_ERROR else begin i := 0; While (FBuffer[i] <> 0) And (i < 254) Do begin FName := FName + char(FBuffer[i]); Inc(i); end; if i > 0 then begin FExpecting := EXP_SIZE; AdjustFilename( FName) end else begin i := 0; // Lazy evaluation needed to prvent reading from FBuffer[SECSIZE] while (i < SECSIZE) and (FBuffer[i]=0) do Inc(i); if i < SECSIZE then FExpecting := EXP_FILENAME else begin FExpecting := EXP_EOF; FTarF.Position := FTarF.Size end end end end; Result := FName; end; function TTarFile.GetNextSize : longint; var i : byte; begin FLen := 0; GetNextSize := 0; if (not(EOF) and (FExpecting = EXP_SIZE)) then begin For i := $7C To $86 Do If (FBuffer[i] >= 48) And (FBuffer[i] <= 55) Then FLen := 8*FLen + FBuffer[i] - 48; if FLen > 0 then FExpecting := EXP_DATE else FExpecting := EXP_FILENAME; GetNextSize := FLen end; FUnreadSec := (SECSIZE - (FLen mod SECSIZE)) mod SECSIZE end; function TTarFile.GetNextDate : TDateTimeRec; var UnixDate : longint; i : byte; begin UnixDate := 0; if FExpecting = EXP_DATE then begin For i := $88 To $92 Do If (FBuffer[i] >= 48) And (FBuffer[i] <= 55) Then UnixDate := 8*UnixDate + FBuffer[i] - 48; FExpecting := EXP_BODY end; Result := CrackUnixDateTime( UnixDate) end; function TTarFile.ReadFile( var buffer; maximum : longint) : longint; var iread : longint; buff : TBuffer; begin iread := 0; if (FLen > FTarF.Size - FTarF.Position) or (FExpecting <> EXP_BODY) then FExpecting := EXP_ERROR else begin iread := FTarF.Read( buffer, min(maximum,FLen)); FLen := FLen - iread; if FLen = 0 then begin FExpecting := EXP_FILENAME; if FUnreadSec > 0 then FTarF.Read( buff, FUnreadSec) end end; ReadFile := iread end; procedure TTarFile.SkipFile; begin if (FLen > FTarF.Size - FTarF.Position) or (FExpecting <> EXP_BODY) then FExpecting := EXP_ERROR else begin FTarF.Position := FTarF.Position + FLen + FUnreadSec; FExpecting := EXP_FILENAME end end; end. ����������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/deb_wdx/src/DbugIntf.pas������������������������������������������������0000644�0001750�0001750�00000011321�12014201074�021370� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit DbugIntf; interface uses Windows, Dialogs; // We need "Dialogs" for TMsgDlgType procedure SendBoolean(const Identifier: string; const Value: Boolean); procedure SendDateTime(const Identifier: string; const Value: TDateTime); procedure SendDebugEx(const Msg: string; MType: TMsgDlgType); procedure SendDebug(const Msg: string); procedure SendDebugClear; procedure SendInteger(const Identifier: string; const Value: Integer); procedure SendMethodEnter(const MethodName: string); procedure SendMethodExit(const MethodName: string); procedure SendSeparator; procedure SendDebugFmt(const Msg: string; const Args: array of const); procedure SendDebugFmtEx(const Msg: string; const Args: array of const; MType: TMsgDlgType); function StartDebugWin: hWnd; implementation uses Messages, SysUtils, Registry, Forms; // We need "Forms" for the Application object threadvar MsgPrefix: AnsiString; const chrClearCommand = #3; var PastFailedAttemptToStartDebugWin: Boolean = False; function StartDebugWin: hWnd; var DebugFilename: string; Buf: array[0..MAX_PATH + 1] of Char; si: TStartupInfo; pi: TProcessInformation; begin MsgPrefix := ''; Result := 0; if PastFailedAttemptToStartDebugWin then Exit; with TRegIniFile.Create('\Software\GExperts') do try DebugFilename := ReadString('Debug', 'FilePath', ''); finally Free; end; if Trim(DebugFileName) = '' then begin GetModuleFileName(HINSTANCE, Buf, SizeOf(Buf)-1); DebugFileName := ExtractFilePath(StrPas(Buf))+'GDebug.exe'; end; if (Trim(DebugFilename) = '') or not FileExists(DebugFilename) then begin PastFailedAttemptToStartDebugWin := True; Exit; end; FillChar(si, SizeOf(si), #0); si.cb := SizeOf(si); si.dwFlags := STARTF_USESHOWWINDOW; si.wShowWindow := SW_SHOW; if not CreateProcess(PChar(DebugFilename), nil, nil, nil, False, 0, nil, nil, si, pi) then begin PastFailedAttemptToStartDebugWin := True; Exit; end; try WaitForInputIdle(pi.hProcess, 3 * 1000); // wait for 3 seconds to get idle finally CloseHandle(pi.hThread); CloseHandle(pi.hProcess); end; Result := FindWindow('TfmDebug', nil); end; procedure SendDebugEx(const Msg: string; MType: TMsgDlgType); var CDS: TCopyDataStruct; DebugWin: hWnd; MessageString: string; {$IFDEF LINUX} const MTypeStr: array[TMsgDlgType] of string = ('Waring: ', 'Error: ', 'Information: ', 'Confirmation: ', 'Custom: '); {$ENDIF LINUX} begin {$IFDEF LINUX} Writeln('GX: ' + MTypeStr[MType] + Msg); {$ENDIF LINUX} {$IFNDEF LINUX} DebugWin := FindWindow('TfmDebug', nil); if DebugWin = 0 then DebugWin := StartDebugWin; if DebugWin <> 0 then begin MessageString := MsgPrefix + Msg; CDS.cbData := Length(MessageString) + 4; CDS.dwData := 0; if Msg = chrClearCommand then CDS.lpData := PChar(chrClearCommand+Char(Ord(MType) + 1)+ MessageString +#0) else CDS.lpData := PChar(#1+Char(Ord(MType) + 1)+ MessageString +#0); SendMessage(DebugWin, WM_COPYDATA, WParam(Application.Handle), LParam(@CDS)); end; {$ENDIF not LINUX} end; procedure SendDebug(const Msg: string); begin SendDebugEx(Msg, mtInformation); end; procedure SendDebugFmt(const Msg: string; const Args: array of const); begin SendDebugEx(Format(Msg, Args), mtInformation); end; procedure SendDebugFmtEx(const Msg: string; const Args: array of const; MType: TMsgDlgType); begin SendDebugEx(Format(Msg, Args), MType); end; procedure SendDebugClear; begin SendDebug(chrClearCommand); end; const Indentation = ' '; procedure SendMethodEnter(const MethodName: string); begin MsgPrefix := MsgPrefix + Indentation; SendDebugEx('Entering ' + MethodName, mtInformation); end; procedure SendMethodExit(const MethodName: string); begin SendDebugEx('Exiting ' + MethodName, mtInformation); Delete(MsgPrefix, 1, Length(Indentation)); end; procedure SendSeparator; const SeparatorString = '------------------------------'; begin SendDebugEx(SeparatorString, mtInformation); end; procedure SendBoolean(const Identifier: string; const Value: Boolean); begin // Note: We deliberately leave "True" and "False" as // hard-coded string constants, since these are // technical terminology which should not be localised. if Value then SendDebugEx(Identifier + '= True', mtInformation) else SendDebugEx(Identifier + '= False', mtInformation); end; procedure SendInteger(const Identifier: string; const Value: Integer); begin SendDebugEx(Format('%s = %d', [Identifier, Value]), mtInformation); end; procedure SendDateTime(const Identifier: string; const Value: TDateTime); begin SendDebugEx(Identifier + '=' + DateTimeToStr(Value), mtInformation); end; end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/deb_wdx/src/debunpak.pas������������������������������������������������0000644�0001750�0001750�00000012447�12014201074�021471� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit debunpak; {$mode delphi}{$H+} interface uses SysUtils {$IFDEF GDEBUG} , dbugintf {$ENDIF}; //extract `control' in control.tar.gz function Deb_ExtractCtrlInfoFile(debfile: string; var descfile: string): boolean; //list out files int data.tar.gz function Deb_ListFileInDataMember(debfile: string; var FileList: string): integer; implementation uses dpkg_deb, minigzip, tarfile, {$IFDEF USE_LIBTAR}libtar{$ELSE}untar, classes{$ENDIF}; var DebPkg: TDebianPackage; //dpkg_deb // TarArch: TTarArchive; //libtar TempDir: array[0..MAX_PATH] of char; //member: 1: control.tar.gz, 2: data.tar.gz //return: full path of extracted file (${TEMP}\debXXXX\foo.tar.gz, function UnpackDebFile(DebFile: string; memberidx: integer): string; var TempFile: array[0..MAX_PATH] of char; FileSource, FileDestination: String; begin {$IFDEF GDEBUG} SendMethodEnter('UnpackDebFile: memberidx='+IntToStr(memberidx)); {$ENDIF} Result := ''; if (memberidx<>MEMBER_CONTROL) and (memberidx<>MEMBER_DATA) then exit; //error repeat GetTempFileName(TempDir, 'deb', random(1000), TempFile); StrLCopy(TempFile, PChar(ChangeFileExt(StrPas(TempFile), '.tar.gz')), MAX_PATH); until not FileExists(StrPas(TempFile)); {$IFDEF GDEBUG} SendDebug('TempFile=' + TempFile); {$ENDIF} DebPkg := TDebianPackage.Create; if DebPkg.ReadFromFile(DebFile) < 2 then exit; //a debian package must have control.tar.gz and data.tar.gz //extract 'control.tar.gz' if not DebPkg.ExtractMemberToFile(memberidx, StrPas(TempFile)) then exit; FileSource := StrPas(TempFile); // X:\some\where\foo.tar.gz FileDestination := StrPas(TempDir) + ChangeFileExt(ExtractFileName(FileSource), ''); // ${TempDir}\foo.tar file_uncompress(FileSource); if not FileExists(FileDestination) then begin DeleteFile(TempFile); //foo.tar.gz Exit; end; Result := FileDestination; DeleteFile(PChar(FileSource)); {$IFDEF GDEBUG} SendMethodExit('UnpackDebFile'); {$ENDIF} end; //function Deb_ExtractDataFileList(debfile: string; var FileList: string): integer; function Deb_ListFileInDataMember; var tarfilename: string; fname : string; fsize : integer; TarFile: TTarFile; begin tarfilename := UnpackDebFile(debfile, MEMBER_DATA); {$IFDEF GDEBUG} SendDebug('tarfilename=' + tarfilename); {$ENDIF} FileList:=''; Result := 0; if not FileExists(tarfilename) then exit; TarFile := TTarFile.Create(tarfilename); try while not TarFile.Eof do begin fname := TarFile.GetNextFilename; fsize := TarFile.GetNextSize; if fsize>0 then begin TarFile.GetNextDate; TarFile.SkipFile; end; if FileList='' then FileList := fname else FileList := FileList + #13#10 + fname; Inc(Result); end; finally TarFile.Free; DeleteFile(PChar(tarfilename)); end; end; //function ExtractDebInfoFile(debfile: string; var descfile: string): boolean; //debfile: full path of .deb file to extract member from //descfile: [out] full path of extracted control file (${TEMP}\debXXXX\control) // you should remove this file (and the temp folder ${TEMP}\debXXXX after use. //return: succeed or not function Deb_ExtractCtrlInfoFile; var tarfilename: string; {$IFDEF USE_LIBTAR} TA: TTarArchive; DirRec: TTarDirRec; {$ELSE USE_TARFILE} Untar1: TUntar; strlst: TStringList; {$ENDIF} begin Result := false; {$IFDEF GDEBUG} SendMethodEnter('ExtractDebInfoFile'); {$ENDIF} tarfilename := UnpackDebFile(debfile, MEMBER_CONTROL); {$IFDEF GDEBUG} SendDebug('tarfilename=' + tarfilename); {$ENDIF} if not FileExists(tarfilename) then exit; {$IFDEF USE_LIBTAR} //libtar seems to be bad descfile := StrPas(TempDir) + 'control.txt'; {$IFDEF GDEBUG} SendDebug('descfile=' + descfile); {$ENDIF} TA := TTarArchive.Create(tarfilename); TA.Reset; while TA.FindNext(DirRec) do begin {$IFDEF GDEBUG} SendDebug('DirRec.Name=' + DirRec.Name); {$ENDIF} if (DirRec.Name = './control') or (DirRec.Name = '.\control') or (DirRec.Name = 'control') then begin TA.ReadFile(descfile); break; end; end; TA.Free; {$ELSE} Untar1 := TUntar.Create(nil); Untar1.FileSource := tarfilename; //Untar1.UnpackPath := TempDir + 'deb4wii'; Untar1.UnpackPath := TempDir + ChangeFileExt(ExtractFileName(Untar1.FileSource), ''); // ${TempDir}\foo {$IFDEF GDEBUG} SendDebug('UnpackPath=' + Untar1.UnpackPath); {$ENDIF} strlst := TStringList.Create; strlst.Add('control'); strlst.Add('./control'); strlst.Add('.\control'); Untar1.OverwriteMode := omReplace; //shit! Untar1.UntarSelected(strlst); //Untar1.Untar; //untar all descfile := IncludeTrailingBackSlash(Untar1.UnpackPath) + 'control'; strlst.Free; Untar1.Free; {$ENDIF} DeleteFile(PChar(tarfilename)); //foo.tar Result := true; {$IFDEF GDEBUG} SendMethodExit('ExtractDebInfoFile'); {$ENDIF} (* filelist := ''; TA := TarArchive.Create('data.tar.gz'); WHILE TA.FindNext(DirRec) DO BEGIN filelist := filelist + DirRec.Name + #13#10; end; TA.Free; *) end; initialization DebPkg := TDebianPackage.Create; TempDir:= GetTempDir; Randomize; finalization DebPkg.Free; // TarArc.Free; end. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/rpm_wdx/����������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016456� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/rpm_wdx/lib/������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017224� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/rpm_wdx/src/������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017245� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/rpm_wdx/src/rpm_wdx.lpi�������������������������������������������������0000644�0001750�0001750�00000005413�12210604521�021422� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <CONFIG> <ProjectOptions> <Version Value="9"/> <PathDelim Value="\"/> <General> <SessionStorage Value="InProjectDir"/> <MainUnit Value="0"/> </General> <VersionInfo> <UseVersionInfo Value="True"/> <MinorVersionNr Value="1"/> <StringTable FileDescription="RPM WDX plugin for Double Commander" LegalCopyright="Copyright (C) 2006-2012 Koblov Alexander" ProductVersion=""/> </VersionInfo> <BuildModes Count="1"> <Item1 Name="default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <RequiredPackages Count="1"> <Item1> <PackageName Value="LCL"/> </Item1> </RequiredPackages> <Units Count="4"> <Unit0> <Filename Value="rpm_wdx.dpr"/> <IsPartOfProject Value="True"/> </Unit0> <Unit1> <Filename Value="rpm_io.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="rpm_io"/> </Unit1> <Unit2> <Filename Value="rpm_wdx_intf.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="rpm_wdx_intf"/> </Unit2> <Unit3> <Filename Value="rpm_def.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="rpm_def"/> </Unit3> </Units> </ProjectOptions> <CompilerOptions> <Version Value="11"/> <PathDelim Value="\"/> <Target> <Filename Value="..\lib\rpm_wdx.wdx" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir);..\..\..\..\sdk"/> <OtherUnitFiles Value="..\..\..\..\sdk"/> <UnitOutputDirectory Value="..\lib"/> </SearchPaths> <Conditionals Value="if (TargetCPU <> 'arm') then begin CustomOptions += '-fPIC'; end; if (TargetOS = 'darwin') then begin LinkerOptions += ' -no_order_inits'; end;"/> <Parsing> <SyntaxOptions> <SyntaxMode Value="Delphi"/> <UseAnsiStrings Value="False"/> </SyntaxOptions> </Parsing> <Linking> <LinkSmart Value="True"/> <Options> <PassLinkerOptions Value="True"/> <ExecutableType Value="Library"/> </Options> </Linking> <Other> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> </CONFIG> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/rpm_wdx/src/rpm_io.pas��������������������������������������������������0000644�0001750�0001750�00000017247�11172641244�021247� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//*************************************************************** // This file is part of RPMWCX, a archiver plugin for // Windows Commander. // Copyright (C) 2000 Mandryka Yurij e-mail:braingroup@hotmail.ru //*************************************************************** //*************************************************************** // This code based on Christian Ghisler (support@ghisler.com) sources //*************************************************************** //*************************************************************** // This code was improved by Sergio Daniel Freue (sfreue@dc.uba.ar) //*************************************************************** {$A-,I-} unit rpm_io; {$MODE Delphi} interface uses SysUtils, rpm_def; type TStrBuf = array[1..260] of Char; function RPM_ReadLead(var f : file; var lead : RPM_Lead) : Boolean; function RPM_ReadSignature(var f : file; sig_type : Word; var signature : RPM_Header) : Boolean; function RPM_ReadHeader(var f : file; align_data : Boolean; var header : RPM_Header; var info : RPM_InfoRec) : Boolean; function RPM_ReadEntry(var f : file; data_start : LongInt; var entry : RPM_EntryInfo) : Boolean; function RPM_ProcessEntry(var f : file; data_start : LongInt; var entry : RPM_EntryInfo; var info : RPM_InfoRec) : Boolean; procedure swap_value(var value; size : Integer); procedure copy_str2buf(var buf : TStrBuf; s : AnsiString); function get_archivename(var fname : String;is_bz2file:boolean) : String; function read_string(var f : file; var s : AnsiString) : Boolean; function read_int32(var f : file; var int32 : LongWord) : Boolean; implementation uses Classes; procedure swap_value(var value; size:Integer); type byte_array = array[1..MaxInt] of Byte; var i : Integer; avalue : Byte; begin for i:=1 to size div 2 do begin avalue := byte_array(value)[i]; byte_array(value)[i] := byte_array(value)[size + 1 - i]; byte_array(value)[size + 1 - i] := avalue; end; end; procedure copy_str2buf(var buf : TStrBuf; s : AnsiString); var i_char : Integer; begin FillChar(buf, Sizeof(buf), 0); if Length(s) = 0 then Exit; if Length(s) > 259 then SetLength(s, 259); s := s + #0; for i_char := 1 to Length(s) do buf[i_char] := s[i_char]; end; function get_archivename(var fname : String;is_bz2file:boolean) : String; var tmp_str : String; i_char : Integer; fgFound : Boolean; begin tmp_str := ExtractFileName(fname); fgFound := False; for i_char := Length(tmp_str) downto 1 do if tmp_str[i_char] = '.' then begin fgFound := True; Break; end; if fgFound then SetLength(tmp_str, i_char - 1); if is_bz2file then tmp_str := tmp_str + '.cpio.bz2' else tmp_str := tmp_str + '.cpio.gz'; Result := tmp_str; end; function RPM_ReadLead; begin Result := False; BlockRead(f, lead, Sizeof(Lead)); if IOResult = 0 then Result := True; with lead do begin swap_value(rpmtype, 2); swap_value(archnum, 2); swap_value(osnum, 2); swap_value(signature_type, 2); end; end; function RPM_ReadHeader; var i_entry : LongWord; start : Integer; entry : RPM_EntryInfo; begin Result := False; BlockRead(f, header, Sizeof(header)); if IOResult = 0 then begin with header do begin swap_value(count, 4); swap_value(data_size, 4); start := FilePos(f) + LongInt(count) * Sizeof(entry); for i_entry := 0 to count - 1 do begin if not RPM_ReadEntry(f, start, entry) then Exit else if not RPM_ProcessEntry(f, start, entry, info) then Exit; end; end; start := start + LongInt(header.data_size); // Move file pointer on padded to a multiple of 8 bytes position if align_data then if (start mod 8) <> 0 then begin start := start and $FFFFFFF8; Inc(start, 8); end; Seek(f, start); Result := True; end; end; function RPM_ReadEntry; begin Result := False; BlockRead(f, entry, Sizeof(entry)); if IOResult = 0 then Result := True; with entry do begin swap_value(tag, 4); swap_value(etype, 4); swap_value(offset, 4); offset := data_start + LongInt(offset); swap_value(count, 4); end; end; function RPM_ReadSignature; var info : RPM_InfoRec; begin Result := False; case sig_type of RPMSIG_PGP262_1024 : ; // Old PGP signature RPMSIG_MD5 : ; // RPMSIG_MD5_PGP : ; // RPMSIG_HEADERSIG : // New header signature begin if RPM_ReadHeader(f, True, signature, info) then Result := True; end; end;{case signature type} end; procedure CRtoCRLF(var instr:string); var s:string; i,l:integer; ch,ch2:char; begin instr:=instr+' '; {Avoid overflow} l:=length(instr)-1; for i:=1 to l do begin ch:=instr[i]; ch2:=instr[i+1]; if ((ch=#13) and (ch2<>#10)) or ((ch=#10) and (ch2<>#13)) then s:=s+#13#10 else s:=s+ch; end; instr:=s; end; function RPM_ProcessEntry; var save_pos : Integer; fgError : Boolean; begin result:=true; if entry.tag = RPMTAG_FILENAMES then exit; fgError := False; save_pos := FilePos(f); Seek(f, entry.offset); if IOResult = 0 then begin case entry.tag of RPMTAG_NAME : if entry.etype = 6 then fgError := not read_string(f, info.name); RPMTAG_VERSION : if entry.etype = 6 then fgError := not read_string(f, info.version); RPMTAG_RELEASE : if entry.etype = 6 then fgError := not read_string(f, info.release); RPMTAG_SUMMARY : if entry.etype = 9 then fgError := not read_string(f, info.summary); RPMTAG_DESCRIPTION : if entry.etype = 9 then begin fgError := not read_string(f, info.description); if not fgError then CRtoCRLF(info.description); end; RPMTAG_BUILDTIME : if entry.etype = 4 then fgError := not read_int32(f, info.buildtime); RPMTAG_DISTRIBUTION : if entry.etype = 6 then fgError := not read_string(f, info.distribution); RPMTAG_VENDOR : if entry.etype = 6 then fgError := not read_string(f, info.vendor); RPMTAG_LICENSE : if entry.etype = 6 then fgError := not read_string(f, info.license); RPMTAG_PACKAGER : if entry.etype = 6 then fgError := not read_string(f, info.packager); RPMTAG_GROUP : if entry.etype = 9 then fgError := not read_string(f, info.group); RPMTAG_OS : if entry.etype = 6 then fgError := not read_string(f, info.os); RPMTAG_ARCH : if entry.etype = 6 then fgError := not read_string(f, info.arch); RPMTAG_SOURCERPM : if entry.etype = 6 then fgError := not read_string(f, info.sourcerpm); end;{case} end else fgError := True; Result := not fgError; Seek(f, save_pos); end; function read_string(var f : file; var s : AnsiString) : Boolean; var i_char : Char; fgError : Boolean; begin fgError := False; SetLength(s, 0); while not eof(f) do begin BlockRead(f, i_char, 1); if IOResult <> 0 then begin fgError := True; Break; end; if i_char = #0 then Break else s := s + i_char; end; Result := not fgError; end; function read_int32(var f : file; var int32 : LongWord) : Boolean; begin BlockRead(f, int32, Sizeof(LongWord)); swap_value(int32, Sizeof(LongWord)); if IOResult = 0 then Result := True else Result := False; end; procedure RPM_CreateInfoRec(var info : RPM_InfoRec); begin end; procedure RPM_DeleteInfoRec(var info : RPM_InfoRec); begin end; end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/rpm_wdx/src/rpm_def.pas�������������������������������������������������0000644�0001750�0001750�00000005724�11172641244�021373� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//*************************************************************** // This file is part of RPMWCX, a archiver plugin for // Windows Commander. // Copyright (C) 2000 Mandryka Yurij e-mail:braingroup@hotmail.ru //*************************************************************** //*************************************************************** // This code based on Christian Ghisler (support@ghisler.com) sources //*************************************************************** {$A-,I-} unit rpm_def; {$MODE Delphi} interface uses Classes; {$ifdef ver90} type longword=longint; {$endif} {$ifdef ver100} type longword=longint; {$endif} //values for TArchiveRec.headers (pseudo-files to show) const HDR_INFO = 0; HDR_DATA = 1; const MAX_PHANTOM_FILES = 13; const RPM_MAGIC = $DBEEABED; RPM_TYPE_BINARY = 0; // binary package type RPM_TYPE_SOURCE = 1; // source package type RPMSIG_PGP262_1024 = 1; RPMSIG_MD5 = 3; RPMSIG_MD5_PGP = 4; RPMSIG_HEADERSIG = 5; const RPMTAG_NAME = 1000; RPMTAG_VERSION = 1001; RPMTAG_RELEASE = 1002; RPMTAG_SUMMARY = 1004; RPMTAG_DESCRIPTION = 1005; RPMTAG_BUILDTIME = 1006; RPMTAG_DISTRIBUTION = 1010; RPMTAG_VENDOR = 1011; RPMTAG_LICENSE = 1014; RPMTAG_PACKAGER = 1015; RPMTAG_GROUP = 1016; RPMTAG_OS = 1021; RPMTAG_ARCH = 1022; RPMTAG_FILENAMES = 1027; RPMTAG_FILEMTIMES = 1034; RPMTAG_SOURCERPM = 1044; RPMTAG_ARCHIVESIZE = 1046; type RPM_EntryInfo = record tag : LongWord; etype : LongWord; offset : LongWord; count : LongWord; end;{EntryInfo} type RPM_Lead = record magic : LongWord; major_ver : Byte; minor_ver : Byte; rpmtype : Word; archnum : Word; name : array[1..66] of Char; osnum : Word; signature_type : Word; reserved : array[1..16] of Char; end;{RPM_Lead} RPM_Header =record magic : array [1..3] of byte; header_ver : Byte; reserved : array [1..4] of Byte; count : LongWord; data_size : LongWord; end;{RPM_Header} RPM_InfoRec = record name : AnsiString; // RPMTAG_NAME version : AnsiString; // RPMTAG_VERSION release : AnsiString; // RPMTAG_RELEASE summary : AnsiString; // RPMTAG_SUMMARY description : AnsiString; // RPMTAG_DESCRIPTION distribution : AnsiString; // RPMTAG_DISTRIBUTION buildtime : LongWord; // RPMTAG_BUILDTIME vendor : AnsiString; // RPMTAG_VENDOR license : AnsiString; // RPMTAG_LICENSE packager : AnsiString; // RPMTAG_PACKAGER group : AnsiString; // RPMTAG_GROUP os : AnsiString; // RPMTAG_OS arch : AnsiString; // RPMTAG_ARCH sourcerpm : AnsiString; // RPMTAG_SOURCERPM end;{RPM_Info} implementation end. ��������������������������������������������doublecmd-0.5.8/plugins/wdx/rpm_wdx/src/rpm_wdx_intf.pas��������������������������������������������0000644�0001750�0001750�00000012567�12014201074�022447� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit rpm_wdx_intf; {$mode delphi} {$include calling.inc} interface procedure ContentGetDetectString(DetectString:pchar; maxlen:integer); dcpcall; function ContentGetSupportedField(FieldIndex:integer; FieldName:pchar; Units:pchar;maxlen:integer):integer; dcpcall; function ContentGetValue(FileName:pchar;FieldIndex,UnitIndex:integer;FieldValue:pbyte; maxlen,flags:integer):integer; dcpcall; implementation uses SysUtils, WdxPlugin, rpm_io, rpm_def; const IDX_PACKAGE = 0; IDX_VERSION = 1; IDX_RELEASE = 2; IDX_DISTRIBUTION = 3; IDX_VENDER = 4; IDX_LICENSE = 5; IDX_PACKAGER = 6; IDX_GROUP = 7; IDX_OS = 8; IDX_ARCH = 9; IDX_SOURCE_RPM = 10; IDX_SUMMARY = 11; IDX_DESCRIPTION = 12; FIELDS_COUNT = 13; // IDX_BUILDTIME , // IDX_ARCHIVE_SIZE var CurrentPackageFile: String; FileInfoCache : RPM_InfoRec; //cache procedure ContentGetDetectString(DetectString:pchar; maxlen:integer); begin StrPCopy(DetectString, 'EXT="RPM"'); end; function ContentGetSupportedField(FieldIndex:integer; FieldName:pchar; Units:pchar;maxlen:integer):integer; var Field: String; begin StrPCopy(Units, ''); // if FieldIndex =IDX_ARCHIVE_SIZE then // begin // StrPCopy(FieldName, FieldList.Strings[FieldIndex]); // StrPCopy(Units, 'bytes|kbytes|Mbytes|Gbytes'+#0); // Result := FT_NUMERIC_64; // exit; // end // else if FieldIndex >= FIELDS_COUNT then begin Result := FT_NOMOREFIELDS; exit; end; Result := FT_STRING; case FieldIndex of IDX_PACKAGE: Field := 'Package'; IDX_VERSION: Field := 'Version'; IDX_RELEASE: Field := 'Release'; IDX_DISTRIBUTION:Field := 'Distribution'; IDX_VENDER: Field := 'Vender'; IDX_LICENSE: Field := 'License'; IDX_PACKAGER: Field := 'Packager'; IDX_GROUP: Field := 'Group'; IDX_OS: Field := 'OS'; IDX_ARCH: Field := 'Arch'; IDX_SOURCE_RPM: Field := 'Source-RPM'; IDX_SUMMARY: Field := 'Summary'; IDX_DESCRIPTION: Field := 'Description'; // IDX_BUILD_TIME: Field := 'Build-Time'; // IDX_ARCHIVE_SIZE: // begin // Field := 'Archive-Size'; // StrPCopy(FieldName, Field); // StrPCopy(Units, 'bytes|kbytes|Mbytes|Gbytes'+#0); // Result := FT_NUMERIC_64; // exit; end; StrPCopy(FieldName, Field); end; function ContentGetValue(FileName:pchar; FieldIndex,UnitIndex:integer; FieldValue:pbyte; maxlen,flags:integer):integer; function ReadRPMInfo(filename: String): integer; var fh: integer; fh_file: file; r_lead: RPM_Lead; signature, r_header: RPM_Header; //r_info: RPM_InfoRec; begin Result := -1; fh := FileOpen(filename, fmOpenRead or fmShareDenyNone); if fh=-1 then exit; AssignFile(fh_file, filename); try FileMode := 0; Reset(fh_file, 1); if IOResult <> 0 then exit; RPM_ReadLead(fh_file, r_lead); if r_lead.magic <> RPM_MAGIC then exit; if not RPM_ReadSignature(fh_file, r_lead.signature_type, signature) then exit; if not RPM_ReadHeader(fh_file, false, r_header, FileInfoCache) then exit; Result := 0; finally CloseFile(fh_file); FileClose(fh); //oppsition to FileOpen end; end; function EnsureLength(S: string; nMaxlen: integer): string; begin Result := S; if length(Result)>=nMaxlen then begin Result := Copy(Result, 1, nMaxlen-4); Result := Result + '...'; end; end; var Value : String; begin Result := FT_FILEERROR; if not FileExists(FileName) then exit; if CurrentPackageFile<>FileName then begin if ReadRPMInfo(FileName) <0 then exit; CurrentPackageFile := FileName; end {$IFDEF GDEBUG} else SendDebug('Cached info reused for '+FileName); {$ENDIF}; if (FieldIndex>=FIELDS_COUNT) then begin Result := FT_NOSUCHFIELD; exit; end; Result := FT_STRING; case FieldIndex of IDX_PACKAGE: Value := FileInfoCache.name; IDX_VERSION: Value := FileInfoCache.version; IDX_RELEASE: Value := FileInfoCache.release; IDX_DISTRIBUTION: Value := FileInfoCache.distribution; IDX_VENDER: Value := FileInfoCache.version; IDX_LICENSE: Value := FileInfoCache.license; IDX_PACKAGER: Value := FileInfoCache.packager; IDX_GROUP: Value := FileInfoCache.group; IDX_OS: Value := FileInfoCache.os; IDX_ARCH: Value := FileInfoCache.arch; IDX_SOURCE_RPM: Value := FileInfoCache.sourcerpm; IDX_SUMMARY: Value := FileInfoCache.summary; IDX_DESCRIPTION: Value := FileINfoCache.description; // IDX_BUILD_TIME: // //??? // IDX_ARCHIVE_SIZE: // Result := FT_NUMERIC_64; // size := FileInfoCache.archive_size; // case UnitIndex of // 0: //bytes // size := size * 1024; // // 1: //kbytes // // pass // 2: //mbytes // size := size div 1024; // 3: //gbytes // size := size div (1024 * 1024); // end; // exit; else Result := FT_FIELDEMPTY; exit; end; StrPCopy(PChar(FieldValue), EnsureLength(Value, maxlen)); end; initialization CurrentPackageFile := ''; end. �����������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/rpm_wdx/src/rpm_wdx.dpr�������������������������������������������������0000644�0001750�0001750�00000001556�12014201074�021425� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library rpm_wdx; {$MODE Delphi} { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. } uses SysUtils, Classes, rpm_io in 'rpm_io.pas', rpm_wdx_intf in 'rpm_wdx_intf.pas', rpm_def in 'rpm_def.pas'; {$E wdx} exports ContentGetDetectString, ContentGetSupportedField, ContentGetValue; {$R *.res} begin end. ��������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/svn_wdx/����������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016466� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/svn_wdx/lib/������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017234� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/svn_wdx/src/������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017255� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/svn_wdx/src/svn_wdx.lpi�������������������������������������������������0000644�0001750�0001750�00000006151�12210604521�021442� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <CONFIG> <ProjectOptions> <Version Value="9"/> <PathDelim Value="\"/> <General> <Flags> <SaveOnlyProjectUnits Value="True"/> <MainUnitHasCreateFormStatements Value="False"/> <MainUnitHasTitleStatement Value="False"/> </Flags> <SessionStorage Value="InProjectDir"/> <MainUnit Value="0"/> <Title Value="svn_wdx"/> <UseAppBundle Value="False"/> <ResourceType Value="res"/> </General> <VersionInfo> <UseVersionInfo Value="True"/> <MinorVersionNr Value="1"/> <StringTable FileDescription="SVN WDX plugin for Double Commander" LegalCopyright="Copyright (C) 2006-2012 Koblov Alexander" ProductVersion=""/> </VersionInfo> <BuildModes Count="1"> <Item1 Name="default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <HostApplicationFilename Value="D:\totalcmd\totalcmd.exe"/> <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <Units Count="4"> <Unit0> <Filename Value="svn_wdx.lpr"/> <IsPartOfProject Value="True"/> <UnitName Value="svn_wdx"/> </Unit0> <Unit1> <Filename Value="xpi_wdx_intf.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="xpi_wdx_intf"/> </Unit1> <Unit2> <Filename Value="xpi_def.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="xpi_def"/> </Unit2> <Unit3> <Filename Value="xpi_io.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="xpi_io"/> </Unit3> </Units> </ProjectOptions> <CompilerOptions> <Version Value="11"/> <PathDelim Value="\"/> <Target> <Filename Value="..\lib\svn_wdx.wdx" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir);..\..\..\..\sdk"/> <OtherUnitFiles Value="..\..\..\..\sdk"/> <UnitOutputDirectory Value="..\lib"/> </SearchPaths> <Conditionals Value="if (TargetCPU <> 'arm') then begin CustomOptions += '-fPIC'; end; if (TargetOS = 'darwin') then begin LinkerOptions += ' -no_order_inits'; end;"/> <Linking> <Options> <PassLinkerOptions Value="True"/> <ExecutableType Value="Library"/> </Options> </Linking> <Other> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> <Debugging> <Exceptions Count="3"> <Item1> <Name Value="EAbort"/> </Item1> <Item2> <Name Value="ECodetoolError"/> </Item2> <Item3> <Name Value="EFOpenError"/> </Item3> </Exceptions> </Debugging> </CONFIG> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/svn_wdx/src/svn_wdx_intf.pas��������������������������������������������0000644�0001750�0001750�00000010053�12014201074�022453� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ Double commander ------------------------------------------------------------------------- svn_wdx is a content plugin that displays some information from subversion Copyright (C) 2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. } unit svn_wdx_intf; {$mode objfpc}{$H+} {$include calling.inc} interface uses Classes, SysUtils, WdxPlugin; function ContentGetSupportedField(FieldIndex: Integer; FieldName: PAnsiChar; Units: PAnsiChar; MaxLen: Integer): Integer; dcpcall; function ContentGetValue(FileName: PAnsiChar; FieldIndex, UnitIndex: Integer; FieldValue: PByte; MaxLen, Flags: Integer): Integer; dcpcall; implementation uses md5, svn_def, svn_io; const IDX_SVN_AUTHOR = 0; IDX_SVN_REVISION = 1; IDX_SVN_STATUS = 2; FIELD_COUNT = 3; threadvar CurrentFilePath: AnsiString; // Current file path CurrentFileName: AnsiString; // Current file name CurrentFileIndex: Integer; // Current file index function EnsureLength(S: AnsiString; MaxLen: Integer): AnsiString; begin Result := S; if Length(Result) >= MaxLen then begin Result := Copy(Result, 1, MaxLen - 4); Result := Result + '...'; end; end; function ContentGetSupportedField(FieldIndex: Integer; FieldName: PAnsiChar; Units: PAnsiChar; MaxLen: Integer): Integer; dcpcall; var Field: AnsiString; begin StrPCopy(Units, EmptyStr); if FieldIndex >= FIELD_COUNT then begin Result := FT_NOMOREFIELDS; Exit; end; Result := FT_STRING; case FieldIndex of IDX_SVN_AUTHOR: Field := 'SVN Author'; IDX_SVN_REVISION: Field := 'SVN Revision'; IDX_SVN_STATUS: Field := 'SVN Status'; end; StrPLCopy(FieldName, Field, MaxLen); end; function ContentGetValue(FileName: PAnsiChar; FieldIndex, UnitIndex: Integer; FieldValue: PByte; MaxLen, Flags: Integer): Integer; dcpcall; var Value, FilePath, CheckSum: AnsiString; FileAttr: LongInt; begin Result := FT_FILEERROR; FileAttr:= FileGetAttr(FileName); if (FileAttr < 0) or Boolean(FileAttr and faDirectory) then Exit; FilePath:= ExtractFileDir(FileName); if CurrentFilePath <> FilePath then begin if not ParseEntries(FilePath) then Exit; CurrentFilePath := FilePath; end; if CurrentFileName <> FileName then begin CurrentFileIndex:= FileNameIndex(ExtractFileName(FileName)); CurrentFileName := FileName; end; if (FieldIndex >= FIELD_COUNT) then begin Result := FT_NOSUCHFIELD; Exit; end; Result := FT_STRING; case FieldIndex of IDX_SVN_AUTHOR: Value := GetSvnInfo(CurrentFileIndex, SVN_AUTHOR); IDX_SVN_REVISION: Value := GetSvnInfo(CurrentFileIndex, SVN_REVISION); IDX_SVN_STATUS: begin if CurrentFileIndex < 0 then Value:= 'Unversioned' else begin // Get file checksum from subversion Value := GetSvnInfo(CurrentFileIndex, SVN_CHECKSUM); // Calculate file checksum CheckSum:= MD5Print(MD5File(FileName)); // Compare checksums if not SameText(Value, CheckSum) then Value:= 'Modified' else Value:= 'Normal'; end; end else Result := FT_FIELDEMPTY; Exit; end; StrPLCopy(PAnsiChar(FieldValue), EnsureLength(Value, MaxLen), MaxLen); end; end. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/svn_wdx/src/svn_def.pas�������������������������������������������������0000644�0001750�0001750�00000002143�12014201074�021370� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ Double commander ------------------------------------------------------------------------- svn_wdx is a content plugin that displays some information from subversion Copyright (C) 2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. } unit svn_def; {$mode objfpc}{$H+} interface uses Classes, SysUtils; const // Information offset relative to file name index SVN_CHECKSUM = 7; SVN_REVISION = 9; SVN_AUTHOR = 10; implementation end. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/svn_wdx/src/svn_io.pas��������������������������������������������������0000644�0001750�0001750�00000004431�12014201074�021243� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ Double commander ------------------------------------------------------------------------- svn_wdx is a content plugin that displays some information from subversion Copyright (C) 2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. } unit svn_io; {$mode objfpc}{$H+} interface uses Classes, SysUtils, svn_def; function ParseEntries(const FilePath: AnsiString): Boolean; function FileNameIndex(const FileName: AnsiString): Integer; function GetSvnInfo(FileIndex, Offset: Integer): AnsiString; implementation threadvar EntriesFile: array of AnsiString; // Current svn entries file function ParseEntries(const FilePath: AnsiString): Boolean; var I: LongWord; FileName: AnsiString; StringList: TStringList = nil; begin Result:= False; FileName:= FilePath + PathDelim + '.svn' + PathDelim + 'entries'; if not FileExists(FileName) then Exit; StringList:= TStringList.Create; try StringList.LoadFromFile(FileName); SetLength(EntriesFile, StringList.Count); for I:= 0 to StringList.Count - 1 do EntriesFile[I]:= StringList[I]; Result:= True; finally FreeAndNil(StringList); end; end; function FileNameIndex(const FileName: AnsiString): Integer; var I: LongWord; begin Result:= -1; for I:= Low(EntriesFile) to High(EntriesFile) do begin if SameText(EntriesFile[I], FileName) then Exit(I); end; end; function GetSvnInfo(FileIndex, Offset: Integer): AnsiString; var Index: Integer; begin Result:= EmptyStr; if FileIndex < 0 then Exit; Index:= FileIndex + Offset; if (Index >= Low(EntriesFile)) and (Index <= High(EntriesFile)) then Result:= EntriesFile[Index]; end; end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/svn_wdx/src/svn_wdx.lpr�������������������������������������������������0000644�0001750�0001750�00000002124�12014201074�021445� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ Double commander ------------------------------------------------------------------------- svn_wdx is a content plugin that displays some information from subversion Copyright (C) 2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. } library svn_wdx; {$mode objfpc}{$H+} uses Classes, svn_wdx_intf, svn_def, svn_io { you can add units after this }; exports ContentGetSupportedField, ContentGetValue; {$R *.res} begin end. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wdx/svn_wdx/COPYING.txt�����������������������������������������������������0000644�0001750�0001750�00000016743�12014201074�020334� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. �����������������������������doublecmd-0.5.8/plugins/wcx/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�014775� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/rpm/��������������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�015573� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/rpm/install.txt���������������������������������������������������������0000644�0001750�0001750�00000001026�12014201074�017763� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������How to install RPM plugin: 1. Unzip the rpm.wcx and cpio.wcx to the Totalcmd directory 2. In Total Commander, choose Configuration - Options 3. Open the 'Packer' page 4. Click 'Configure packer extension WCXs 5. type rpm as the extension 6. Click 'new type', and select the rpm.wcx 5. type cpio as the extension 6. Click 'new type', and select the cpio.wcx 7. Click OK What it does: This plugin allow you to browse rpm archives. Mandryka Yurij Brain group http://braingroup.hotmail.ru/wcplugins/ mailto:braingroup@hotmail.ru����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/rpm/lib/����������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016341� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/rpm/src/����������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016362� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/rpm/src/rpm.lpi���������������������������������������������������������0000644�0001750�0001750�00000005266�12210604521�017663� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <CONFIG> <ProjectOptions> <Version Value="9"/> <PathDelim Value="\"/> <General> <Flags> <LRSInOutputDirectory Value="False"/> </Flags> <SessionStorage Value="InProjectDir"/> <MainUnit Value="0"/> </General> <VersionInfo> <UseVersionInfo Value="True"/> <MinorVersionNr Value="1"/> <StringTable FileDescription="RPM WCX plugin for Double Commander" LegalCopyright="Copyright (C) 2006-2012 Koblov Alexander" ProductVersion=""/> </VersionInfo> <BuildModes Count="1"> <Item1 Name="default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <DestinationDirectory Value="$(TestDir)\publishedproject\"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <RequiredPackages Count="1"> <Item1> <PackageName Value="doublecmd_common"/> <MinVersion Minor="2" Valid="True"/> </Item1> </RequiredPackages> <Units Count="1"> <Unit0> <Filename Value="rpm.dpr"/> <IsPartOfProject Value="True"/> </Unit0> </Units> </ProjectOptions> <CompilerOptions> <Version Value="11"/> <Target> <Filename Value="../lib/rpm.wcx" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="../../../../sdk"/> <OtherUnitFiles Value="../../../../sdk"/> <UnitOutputDirectory Value="../lib"/> </SearchPaths> <Conditionals Value="if (TargetCPU <> 'arm') then begin CustomOptions += '-fPIC'; end; if (TargetOS = 'darwin') then begin LinkerOptions += ' -no_order_inits'; end;"/> <Parsing> <SyntaxOptions> <SyntaxMode Value="Delphi"/> <UseAnsiStrings Value="False"/> </SyntaxOptions> </Parsing> <Linking> <LinkSmart Value="True"/> <Options> <PassLinkerOptions Value="True"/> <ExecutableType Value="Library"/> </Options> </Linking> <Other> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> <Debugging> <Exceptions Count="2"> <Item1> <Name Value="ECodetoolError"/> </Item1> <Item2> <Name Value="EFOpenError"/> </Item2> </Exceptions> </Debugging> </CONFIG> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/rpm/src/rpm_io.pas������������������������������������������������������0000644�0001750�0001750�00000017227�12014201074�020347� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//*************************************************************** // This file is part of RPMWCX, a archiver plugin for // Windows Commander. // Copyright (C) 2000 Mandryka Yurij e-mail:braingroup@hotmail.ru //*************************************************************** //*************************************************************** // This code based on Christian Ghisler (support@ghisler.com) sources //*************************************************************** //*************************************************************** // This code was improved by Sergio Daniel Freue (sfreue@dc.uba.ar) //*************************************************************** {$A-,I-} unit rpm_io; interface uses SysUtils, rpm_def; type TStrBuf = array[1..260] of Char; function RPM_ReadLead(var f : file; var lead : RPM_Lead) : Boolean; function RPM_ReadSignature(var f : file; sig_type : Word; var signature : RPM_Header) : Boolean; function RPM_ReadHeader(var f : file; align_data : Boolean; var header : RPM_Header; var info : RPM_InfoRec) : Boolean; function RPM_ReadEntry(var f : file; data_start : LongInt; var entry : RPM_EntryInfo) : Boolean; function RPM_ProcessEntry(var f : file; data_start : LongInt; var entry : RPM_EntryInfo; var info : RPM_InfoRec) : Boolean; procedure swap_value(var value; size : Integer); procedure copy_str2buf(var buf : TStrBuf; s : AnsiString); function get_archivename(var fname : String;datasig:RPM_DataSig) : String; function read_string(var f : file; var s : AnsiString) : Boolean; function read_int32(var f : file; var int32 : LongWord) : Boolean; implementation uses Classes; procedure swap_value(var value; size:Integer); type byte_array = array[1..MaxInt] of Byte; var i : Integer; avalue : Byte; begin for i:=1 to size div 2 do begin avalue := byte_array(value)[i]; byte_array(value)[i] := byte_array(value)[size + 1 - i]; byte_array(value)[size + 1 - i] := avalue; end; end; procedure copy_str2buf(var buf : TStrBuf; s : AnsiString); var i_char : Integer; begin FillChar(buf, Sizeof(buf), 0); if Length(s) = 0 then Exit; if Length(s) > 259 then SetLength(s, 259); s := s + #0; for i_char := 1 to Length(s) do buf[i_char] := s[i_char]; end; function get_archivename(var fname : String;datasig:RPM_DataSig) : String; var tmp_str : String; i_char : Integer; fgFound : Boolean; begin tmp_str := ExtractFileName(fname); fgFound := False; for i_char := Length(tmp_str) downto 1 do if tmp_str[i_char] = '.' then begin fgFound := True; Break; end; if fgFound then SetLength(tmp_str, i_char - 1); if (datasig[0] = #031) and (datasig[1] = #139) then tmp_str := tmp_str + '.cpio.gz' else if (datasig[0]='B') and (datasig[1]='Z') and (datasig[2]='h') then tmp_str := tmp_str + '.cpio.bz2' else if CompareByte(datasig, #253'7zXZ'#000, 6) = 0 then tmp_str := tmp_str + '.cpio.xz' else tmp_str := tmp_str + '.cpio.lzma'; Result := tmp_str; end; function RPM_ReadLead; begin Result := False; BlockRead(f, lead, Sizeof(Lead)); if IOResult = 0 then Result := True; with lead do begin swap_value(rpmtype, 2); swap_value(archnum, 2); swap_value(osnum, 2); swap_value(signature_type, 2); end; end; function RPM_ReadHeader; var i_entry : LongWord; start : Integer; entry : RPM_EntryInfo; begin Result := False; BlockRead(f, header, Sizeof(header)); if IOResult = 0 then begin with header do begin swap_value(count, 4); swap_value(data_size, 4); start := FilePos(f) + LongInt(count) * Sizeof(entry); for i_entry := 0 to count - 1 do begin if not RPM_ReadEntry(f, start, entry) then Exit else if not RPM_ProcessEntry(f, start, entry, info) then Exit; end; end; start := start + LongInt(header.data_size); // Move file pointer on padded to a multiple of 8 bytes position if align_data then if (start mod 8) <> 0 then begin start := start and $FFFFFFF8; Inc(start, 8); end; Seek(f, start); Result := True; end; end; function RPM_ReadEntry; begin Result := False; BlockRead(f, entry, Sizeof(entry)); if IOResult = 0 then Result := True; with entry do begin swap_value(tag, 4); swap_value(etype, 4); swap_value(offset, 4); offset := data_start + LongInt(offset); swap_value(count, 4); end; end; function RPM_ReadSignature; var info : RPM_InfoRec; begin Result := False; case sig_type of RPMSIG_PGP262_1024 : ; // Old PGP signature RPMSIG_MD5 : ; // RPMSIG_MD5_PGP : ; // RPMSIG_HEADERSIG : // New header signature begin if RPM_ReadHeader(f, True, signature, info) then Result := True; end; end;{case signature type} end; procedure CRtoCRLF(var instr:string); var s:string; i,l:integer; ch,ch2:char; begin instr:=instr+' '; {Avoid overflow} l:=length(instr)-1; for i:=1 to l do begin ch:=instr[i]; ch2:=instr[i+1]; if ((ch=#13) and (ch2<>#10)) or ((ch=#10) and (ch2<>#13)) then s:=s+#13#10 else s:=s+ch; end; instr:=s; end; function RPM_ProcessEntry; var save_pos : Integer; fgError : Boolean; begin result:=true; if entry.tag = RPMTAG_FILENAMES then exit; fgError := False; save_pos := FilePos(f); Seek(f, entry.offset); if IOResult = 0 then begin case entry.tag of RPMTAG_NAME : if entry.etype = 6 then fgError := not read_string(f, info.name); RPMTAG_VERSION : if entry.etype = 6 then fgError := not read_string(f, info.version); RPMTAG_RELEASE : if entry.etype = 6 then fgError := not read_string(f, info.release); RPMTAG_SUMMARY : if entry.etype = 9 then fgError := not read_string(f, info.summary); RPMTAG_DESCRIPTION : if entry.etype = 9 then begin fgError := not read_string(f, info.description); if not fgError then CRtoCRLF(info.description); end; RPMTAG_BUILDTIME : if entry.etype = 4 then fgError := not read_int32(f, info.buildtime); RPMTAG_DISTRIBUTION : if entry.etype = 6 then fgError := not read_string(f, info.distribution); RPMTAG_VENDOR : if entry.etype = 6 then fgError := not read_string(f, info.vendor); RPMTAG_LICENSE : if entry.etype = 6 then fgError := not read_string(f, info.license); RPMTAG_PACKAGER : if entry.etype = 6 then fgError := not read_string(f, info.packager); RPMTAG_GROUP : if entry.etype = 9 then fgError := not read_string(f, info.group); RPMTAG_OS : if entry.etype = 6 then fgError := not read_string(f, info.os); RPMTAG_ARCH : if entry.etype = 6 then fgError := not read_string(f, info.arch); RPMTAG_SOURCERPM : if entry.etype = 6 then fgError := not read_string(f, info.sourcerpm); end;{case} end else fgError := True; Result := not fgError; Seek(f, save_pos); end; function read_string(var f : file; var s : AnsiString) : Boolean; var i_char : Char; fgError : Boolean; begin fgError := False; SetLength(s, 0); while not eof(f) do begin BlockRead(f, i_char, 1); if IOResult <> 0 then begin fgError := True; Break; end; if i_char = #0 then Break else s := s + i_char; end; Result := not fgError; end; function read_int32(var f : file; var int32 : LongWord) : Boolean; begin BlockRead(f, int32, Sizeof(LongWord)); swap_value(int32, Sizeof(LongWord)); if IOResult = 0 then Result := True else Result := False; end; procedure RPM_CreateInfoRec(var info : RPM_InfoRec); begin end; procedure RPM_DeleteInfoRec(var info : RPM_InfoRec); begin end; end. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/rpm/src/rpm.dof���������������������������������������������������������0000644�0001750�0001750�00000002373�11173025634�017654� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������[Compiler] A=0 B=0 C=1 D=1 E=0 F=0 G=1 H=1 I=0 J=1 K=0 L=1 M=0 N=1 O=1 P=1 Q=0 R=0 S=0 T=0 U=0 V=1 W=0 X=1 Y=1 Z=1 ShowHints=1 ShowWarnings=1 UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; [Linker] MapFile=0 OutputObjs=0 ConsoleApp=1 DebugInfo=0 MinStackSize=16384 MaxStackSize=1048576 ImageBase=4194304 ExeDescription= [Directories] OutputDir= UnitOutputDir= SearchPath= Packages=VCL50;VCLX50;VCLSMP50;VCLDB50;VCLADO50;ibevnt50;VCLBDE50;VCLDBX50;QRPT50;TEEUI50;TEEDB50;TEE50;DSS50;TEEQR50;VCLIB50;VCLMID50;VCLIE50;INETDB50;INET50;NMFAST50;WEBMID50;dclocx50;dclaxserver50;dcldtree50 Conditionals= DebugSourceDirs= UsePackages=0 [Parameters] RunParams= HostApplication=e:\delphi\exedpr\totalcmd.exe [Version Info] IncludeVerInfo=1 AutoIncBuild=1 MajorVer=1 MinorVer=1 Release=0 Build=188 Debug=0 PreRelease=0 Special=0 Private=0 DLL=0 Locale=1049 CodePage=1251 [Version Info Keys] CompanyName=Brain group FileDescription=rpm plugin for Windows Commander FileVersion=1.1.0.188 InternalName=rpm.wcx LegalCopyright=Mandryka Yurij LegalTrademarks= OriginalFilename=rpm.wcx ProductName=rpm plugin ProductVersion=1.1.0.0 Comments=any questions on braingroup@hotmail.ru ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/rpm/src/rpm_def.pas�����������������������������������������������������0000644�0001750�0001750�00000005632�12014201074�020473� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//*************************************************************** // This file is part of RPMWCX, a archiver plugin for // Windows Commander. // Copyright (C) 2000 Mandryka Yurij e-mail:braingroup@hotmail.ru //*************************************************************** //*************************************************************** // This code based on Christian Ghisler (support@ghisler.com) sources //*************************************************************** {$A-,I-} unit rpm_def; interface uses Classes; {$ifdef ver90} type longword=longint; {$endif} {$ifdef ver100} type longword=longint; {$endif} //values for TArchiveRec.headers (pseudo-files to show) const HDR_INFO = 0; HDR_DATA = 1; const MAX_PHANTOM_FILES = 13; const RPM_MAGIC = $DBEEABED; RPM_TYPE_BINARY = 0; // binary package type RPM_TYPE_SOURCE = 1; // source package type RPMSIG_PGP262_1024 = 1; RPMSIG_MD5 = 3; RPMSIG_MD5_PGP = 4; RPMSIG_HEADERSIG = 5; const RPMTAG_NAME = 1000; RPMTAG_VERSION = 1001; RPMTAG_RELEASE = 1002; RPMTAG_SUMMARY = 1004; RPMTAG_DESCRIPTION = 1005; RPMTAG_BUILDTIME = 1006; RPMTAG_DISTRIBUTION = 1010; RPMTAG_VENDOR = 1011; RPMTAG_LICENSE = 1014; RPMTAG_PACKAGER = 1015; RPMTAG_GROUP = 1016; RPMTAG_OS = 1021; RPMTAG_ARCH = 1022; RPMTAG_FILENAMES = 1027; RPMTAG_FILEMTIMES = 1034; RPMTAG_SOURCERPM = 1044; RPMTAG_ARCHIVESIZE = 1046; type RPM_DataSig = array[0..5] of char; type RPM_EntryInfo = record tag : LongWord; etype : LongWord; offset : LongWord; count : LongWord; end;{EntryInfo} type RPM_Lead = record magic : LongWord; major_ver : Byte; minor_ver : Byte; rpmtype : Word; archnum : Word; name : array[1..66] of Char; osnum : Word; signature_type : Word; reserved : array[1..16] of Char; end;{RPM_Lead} RPM_Header =record magic : array [1..3] of byte; header_ver : Byte; reserved : array [1..4] of Byte; count : LongWord; data_size : LongWord; end;{RPM_Header} RPM_InfoRec = record name : AnsiString; // RPMTAG_NAME version : AnsiString; // RPMTAG_VERSION release : AnsiString; // RPMTAG_RELEASE summary : AnsiString; // RPMTAG_SUMMARY description : AnsiString; // RPMTAG_DESCRIPTION distribution : AnsiString; // RPMTAG_DISTRIBUTION buildtime : LongWord; // RPMTAG_BUILDTIME vendor : AnsiString; // RPMTAG_VENDOR license : AnsiString; // RPMTAG_LICENSE packager : AnsiString; // RPMTAG_PACKAGER group : AnsiString; // RPMTAG_GROUP os : AnsiString; // RPMTAG_OS arch : AnsiString; // RPMTAG_ARCH sourcerpm : AnsiString; // RPMTAG_SOURCERPM end;{RPM_Info} implementation end. ������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/rpm/src/rpm.cfg���������������������������������������������������������0000644�0001750�0001750�00000000546�11173025634�017643� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-$A- -$B- -$C+ -$D+ -$E- -$F- -$G+ -$H+ -$I- -$J+ -$K- -$L+ -$M- -$N+ -$O+ -$P+ -$Q- -$R- -$S- -$T- -$U- -$V+ -$W- -$X+ -$YD -$Z1 -cg -AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -H+ -W+ -M -$M16384,1048576 -K$00400000 -LE"c:\borland\delphi5\Projects\Bpl" -LN"c:\borland\delphi5\Projects\Bpl" ����������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/rpm/src/rpm.dpr���������������������������������������������������������0000644�0001750�0001750�00000001702�12014201074�017651� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//*************************************************************** // This file is part of RPMWCX, a archiver plugin for // Windows Commander. // Copyright (C) 2000 Mandryka Yurij e-mail:braingroup@hotmail.ru //*************************************************************** { Add some changes for Lazarus and Linux compability Copyright (C) 2007-2012 Koblov Alexander (Alexx2000@mail.ru) } //*************************************************************** // This code based on Christian Ghisler (support@ghisler.com) sources //*************************************************************** library rpm; uses SysUtils, Classes, WcxPlugin, rpm_io in 'rpm_io.pas', rpm_def in 'rpm_def.pas', rpm_archive in 'rpm_archive.pas'; exports CloseArchive, GetPackerCaps, OpenArchive, ProcessFile, ReadHeader, SetChangeVolProc, SetProcessDataProc; {$R *.res} begin {$IFNDEF MSWINDOWS} WriteLn('Rpm plugin is loaded'); {$ENDIF} end. ��������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/rpm/src/rpm_archive.pas�������������������������������������������������0000644�0001750�0001750�00000025566�12014201074�021366� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//*************************************************************** // This file is part of RPMWCX, a archiver plugin for // Windows Commander. // Copyright (C) 2000 Mandryka Yurij e-mail:braingroup@hotmail.ru //*************************************************************** { Add some changes for Lazarus and Linux compability Copyright (C) 2007-2012 Koblov Alexander (Alexx2000@mail.ru) } //*************************************************************** // This code based on Christian Ghisler (support@ghisler.com) sources //*************************************************************** //*************************************************************** // This code was improved by Sergio Daniel Freue (sfreue@dc.uba.ar) //*************************************************************** // History // 2001-02-04 Bug: Error Opening rpm file on CD (readonly) // Fix: Add FileMode = 0 before Reset // Who: Oliver Haeger <haeger@inghb.de> unit rpm_archive; {$mode delphi}{$A-,I-} {$include calling.inc} interface uses Classes, WcxPlugin, rpm_def, rpm_io; const MAX_ARCHIVE_LIST = 20; type PArchiveRec = ^TArchiveRec; TArchiveRec = record handle_io : THandle; handle_file : file; fname : AnsiString; fdate : Integer; headers : Integer; header : RPM_Header; arch_len : LongWord; process_proc : TProcessDataProc; changevol_proc : TChangeVolProc; //- RPM tags ------------------------------------------- info : RPM_InfoRec; datasig : RPM_DataSig; end;{ArchiveRec} var aList : TList; function GetPackerCaps : Integer; dcpcall; function OpenArchive(var ArchiveData : TOpenArchiveData) : TArcHandle; dcpcall; function CloseArchive(hArcData : TArcHandle) : Integer; dcpcall; function ReadHeader(hArcData : TArcHandle; var HeaderData : THeaderData) : Integer; dcpcall; function ProcessFile(hArcData : TArcHandle; Operation : Integer; DestPath : PChar; DestName : PChar) : Integer; dcpcall; procedure SetProcessDataProc(hArcData : TArcHandle; ProcessDataProc : TProcessDataProc); dcpcall; procedure SetChangeVolProc(hArcData : TArcHandle; ChangeVolProc : TChangeVolProc); dcpcall; implementation uses SysUtils, DCDateTimeUtils, DCBasicTypes; function GetArchiveID(hArcData : THandle) : Integer; var i_rec : Integer; arec : PArchiveRec; begin Result := -1; if aList.Count = 0 then Exit; for i_rec := 0 to (aList.Count - 1) do begin arec := aList.Items[i_rec]; if arec^.handle_io = hArcData then begin Result := i_rec; Break; end; end; end; function GetPackerCaps; begin Result := PK_CAPS_MULTIPLE; end; function OpenArchive; var arch : THandle; arec : PArchiveRec; filename : String; r_lead : RPM_Lead; signature : RPM_Header; fgError : Boolean; headerend : integer; begin arec := nil; arch := 0; fgError := False; if aList.Count >= MAX_ARCHIVE_LIST then begin fgError := True; end else begin filename := String(ArchiveData.ArcName); arch := FileOpen(filename, fmOpenRead or fmShareDenyNone); if arch = THandle(-1) then begin fgError := True; end else begin New(arec); with arec^ do begin handle_io := arch; fname := filename; headers := HDR_INFO; arch_len := 0; fdate := FileAge(filename); process_proc := nil; changevol_proc := nil; if fdate = -1 then fdate := 0; end; AssignFile(arec^.handle_file, filename); FileMode := 0; Reset(arec^.handle_file, 1); if IOResult <> 0 then begin fgError := True; end else begin RPM_ReadLead(arec^.handle_file, r_lead); if r_lead.magic <> RPM_MAGIC then fgError := True else begin if not RPM_ReadSignature(arec^.handle_file, r_lead.signature_type, signature) then fgError := True else if not RPM_ReadHeader(arec^.handle_file, False, arec^.header, arec^.info) then fgError := True else arec^.arch_len := FileSize(arec^.handle_file) - FilePos(arec^.handle_file); if not fgError then begin headerend:=FilePos(arec^.handle_file); BlockRead(arec^.handle_file, arec^.datasig, SizeOf(RPM_DataSig)); Seek(arec^.handle_file, headerend); end; end; end;{ioresult} end;{arch = -1} end;{max count reached} if fgError then begin if arec <> nil then begin CloseFile(arec^.handle_file); Dispose(arec); end; FileClose(arch); Result := 0; ArchiveData.OpenResult := E_EOPEN end else begin aList.Add(arec); Result := arch; end; end; function CloseArchive; var i_rec : Integer; arec : PArchiveRec; begin if aList.Count <> 0 then begin i_rec := GetArchiveID(hArcData); if i_rec <> -1 then begin arec := aList.Items[i_rec]; CloseFile(arec^.handle_file); FileClose(hArcData); Dispose(arec); aList.Delete(i_rec); end; end; Result := E_SUCCESS; end; function ReadHeader; var i_rec : Integer; arec : PArchiveRec; begin Result := E_END_ARCHIVE; i_rec := GetArchiveID(hArcData); if i_rec <> -1 then begin arec := aList.Items[i_rec]; Result := E_SUCCESS; with HeaderData do begin case arec^.headers of HDR_DATA: begin copy_str2buf(TStrBuf(FileName), get_archivename(arec^.fname,arec^.datasig)); PackSize := arec^.arch_len; UnpSize := arec^.arch_len; end; HDR_INFO: begin copy_str2buf(TStrBuf(FileName), 'INFO.TXT'); PackSize := 0; UnpSize := 0; end; else Result := E_END_ARCHIVE; end; if Result = E_SUCCESS then begin copy_str2buf(TStrBuf(ArcName), arec^.fname); FileAttr := faArchive; FileTime := LongInt(UnixFileTimeToDosTime(TUnixFileTime(arec^.info.buildtime))); Inc(arec^.headers); end; end; end; end; function ProcessFile; var i_rec : Integer; arec : PArchiveRec; rpm_file : file; rpm_name : String; buf : Pointer; buf_size : LongWord; fsize : LongWord; fgReadError : Boolean; fgWriteError: Boolean; faborted : Boolean; testonly : Boolean; //Helper function to output one line of text to rpm_file function Line(S: AnsiString): Integer; begin Result := 0; if not fgReadError and not fgWriteError then if testonly then Result := Length(S) + 2 else begin S := S + #13#10; BlockWrite(rpm_file, S[1], Length(S), Result); if IOResult <> 0 then fgWriteError := True; end; end; begin case Operation of // Because rpm archive doesn't contains length of _alone_ attached // gzipped cpio archive, plugin cann't skip or test rpm archive // correctly without extracting archive. PK_SKIP : Result := E_SUCCESS; PK_TEST, PK_EXTRACT : begin testonly:=Operation=PK_TEST; if not testonly then begin rpm_name := String(DestName); AssignFile(rpm_file, rpm_name); Rewrite(rpm_file, 1); end; if not testonly and (IOResult <> 0) then begin Result := E_EWRITE end else begin i_rec := GetArchiveID(hArcData); arec := aList.Items[i_rec]; fgReadError := False; fgWriteError := False; faborted:=false; case (arec^.headers-1) of HDR_DATA: begin fsize := arec^.arch_len; buf_size := 65536; GetMem(buf, buf_size); while not faborted do begin if fsize < buf_size then Break; BlockRead(arec^.handle_file, buf^, buf_size); if IOResult <> 0 then begin fgReadError := True; Break; end;{if IO error} if not testonly then begin BlockWrite(rpm_file, buf^, buf_size); if IOResult <> 0 then begin fgWriteError := True; Break; end;{if IO error} end; Dec(fsize, buf_size); if Assigned(arec^.process_proc) then if arec^.process_proc(nil, buf_size)=0 then faborted:=true; end;{while} if not fgReadError and not fgWriteError and not faborted then begin if fsize <> 0 then begin BlockRead(arec^.handle_file, buf^, fsize); if IOResult <> 0 then fgReadError := True; if not testonly and not fgReadError then begin BlockWrite(rpm_file, buf^, fsize); if IOResult <> 0 then fgWriteError := True; end; if Assigned(arec^.process_proc) then if arec^.process_proc(nil, fsize)=0 then faborted:=true; end; end; Freemem(buf, buf_size); //Other pseudo-files end; HDR_INFO: with arec^.info do begin Line('NAME: ' + name); Line('VERSION: ' + version); Line('RELEASE: ' + release); Line('SUMMARY: ' + summary); Line('DISTRIBUTION: ' + distribution); Line('VENDOR: ' + vendor); Line('LICENSE: ' + license); Line('PACKAGER: ' + packager); Line('GROUP: ' + group); Line('OS: ' + os); Line('ARCH: ' + arch); Line('SOURCE RPM: ' + sourcerpm); Line('DESCRIPTION: '); Line(description); end; end; if faborted then Result:=E_EABORTED else if fgReadError then Result := E_BAD_DATA else if fgWriteError then Result:= E_EWRITE else Result := E_SUCCESS; if not testonly then begin if result = E_SUCCESS then FileSetDate(tfilerec(rpm_file).handle, LongInt(UnixFileTimeToDosTime(TUnixFileTime(arec^.info.buildtime)))); CloseFile(rpm_file); if result <> E_SUCCESS then Erase(rpm_file); end; end; end else Result := E_SUCCESS; end;{case operation} end; procedure SetProcessDataProc; var i_rec : Integer; arec : PArchiveRec; begin i_rec := GetArchiveID(hArcData); if i_rec <> -1 then begin arec := aList.Items[i_rec]; arec^.process_proc := ProcessDataProc; end; end; procedure SetChangeVolProc; var i_rec : Integer; arec : PArchiveRec; begin i_rec := GetArchiveID(hArcData); if i_rec <> -1 then begin arec := aList.Items[i_rec]; arec^.changevol_proc := ChangeVolProc; end; end; initialization aList := TList.Create; finalization aList.Free; end. ������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/rpm/license.txt���������������������������������������������������������0000644�0001750�0001750�00000002205�12014201074�017737� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������RPM plugin v.1.4 for Windows Commander. Copyright (c) 2000..2002 Mandryka Yurij ( Brain Group ) Add some changes for Lazarus and Linux compability Copyright (C) 2007 Koblov Alexander (Alexx2000@mail.ru) This plugin allow you to browse rpm archives with Windows Commander 4.0 or greater. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS OR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Any questions about plugin can be made via e-mail : braingroup@hotmail.ru and information about plugin can be found on Brain Group web site : http://braingroup.hotmail.ru/wcplugins/ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unrar/������������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016124� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unrar/lib/��������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016672� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unrar/src/��������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016713� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unrar/src/unrar.dpr�����������������������������������������������������0000644�0001750�0001750�00000003307�12103235236�020544� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library unrar; uses SysUtils, DynLibs, UnRARFunc; exports { Mandatory } OpenArchive, OpenArchiveW, ReadHeader, ReadHeaderEx, ReadHeaderExW, ProcessFile, ProcessFileW, CloseArchive, SetChangeVolProc, SetChangeVolProcW, SetProcessDataProc, SetProcessDataProcW, { Optional } GetPackerCaps, { Extension API } ExtensionInitialize; {$R *.res} begin ModuleHandle := LoadLibrary(_unrar); if ModuleHandle = NilHandle then ModuleHandle := LoadLibrary(GetEnvironmentVariable('COMMANDER_PATH') + PathDelim + _unrar); if ModuleHandle <> NilHandle then begin RAROpenArchive := TRAROpenArchive(GetProcAddress(ModuleHandle, 'RAROpenArchive')); RAROpenArchiveEx := TRAROpenArchiveEx(GetProcAddress(ModuleHandle, 'RAROpenArchiveEx')); RARCloseArchive := TRARCloseArchive(GetProcAddress(ModuleHandle, 'RARCloseArchive')); RARReadHeader := TRARReadHeader(GetProcAddress(ModuleHandle, 'RARReadHeader')); RARReadHeaderEx := TRARReadHeaderEx(GetProcAddress(ModuleHandle, 'RARReadHeaderEx')); RARProcessFile := TRARProcessFile(GetProcAddress(ModuleHandle, 'RARProcessFile')); RARProcessFileW := TRARProcessFileW(GetProcAddress(ModuleHandle, 'RARProcessFileW')); RARSetCallback := TRARSetCallback(GetProcAddress(ModuleHandle, 'RARSetCallback')); RARSetChangeVolProc := TRARSetChangeVolProc(GetProcAddress(ModuleHandle, 'RARSetChangeVolProc')); RARSetProcessDataProc := TRARSetProcessDataProc(GetProcAddress(ModuleHandle, 'RARSetProcessDataProc')); RARSetPassword := TRARSetPassword(GetProcAddress(ModuleHandle, 'RARSetPassword')); RARGetDllVersion := TRARGetDllVersion(GetProcAddress(ModuleHandle, 'RARGetDllVersion')); end; end. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unrar/src/unrarfunc.pas�������������������������������������������������0000644�0001750�0001750�00000054641�12103235236�021425� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ Double commander ------------------------------------------------------------------------- WCX plugin for unpacking RAR archives This is simple wrapper for unrar.dll or libunrar.so Copyright (C) 2008-2012 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License in a file called COPYING along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. } unit UnRARFunc; {$mode objfpc}{$H+} {$include calling.inc} interface uses DynLibs, WcxPlugin, Extension; const {$IF DEFINED(MSWINDOWS)} // libunrar must be built with sizeof(wchar_t) = 2 (default on Windows) _unrar = 'unrar.dll'; {$ELSEIF DEFINED(DARWIN)} // libunrar must be built with sizeof(wchar_t) = 4 (default on Unix) _unrar = 'libunrar.dylib'; {$ELSEIF DEFINED(UNIX)} // libunrar must be built with sizeof(wchar_t) = 4 (default on Unix) _unrar = 'libunrar.so'; {$ENDIF} const // Unrar callback messages. UCM_CHANGEVOLUME = 0; UCM_PROCESSDATA = 1; UCM_NEEDPASSWORD = 2; UCM_CHANGEVOLUMEW = 3; UCM_NEEDPASSWORDW = 4; // Main header flags. MHD_VOLUME = $0001; MHD_COMMENT = $0002; MHD_LOCK = $0004; MHD_SOLID = $0008; MHD_PACK_COMMENT = $0010; MHD_NEWNUMBERING = $0010; MHD_AV = $0020; // (archive signed) MHD_PROTECT = $0040; MHD_PASSWORD = $0080; MHD_FIRSTVOLUME = $0100; MHD_ENCRYPTVER = $0200; type {$IFDEF UNIX} TRarUnicodeChar = UCS4Char; TRarUnicodeString = UCS4String; {$ENDIF} {$IFDEF WINDOWS} TRarUnicodeChar = WideChar; // assuming 2 byte WideChar TRarUnicodeString = WideString; {$ENDIF} PRarUnicodeChar = ^TRarUnicodeChar; TRarUnicodeArray = packed array [0..1023] of TRarUnicodeChar; RARHeaderData = packed record ArcName: packed array[0..259] of Char; FileName: packed array[0..259] of Char; // a zero terminated string of the file name in OEM (DOS) encoding. Flags: LongWord; PackSize: LongWord; UnpSize: LongWord; HostOS: LongWord; FileCRC: LongWord; FileTime: LongWord; UnpVer: LongWord; Method: LongWord; FileAttr: LongWord; CmtBuf: PChar; CmtBufSize: LongWord; CmtSize: LongWord; CmtState: LongWord; end; RARHeaderDataEx = packed record ArcName: packed array [0..1023] of Char; ArcNameW: TRarUnicodeArray; FileName: packed array [0..1023] of Char; FileNameW: TRarUnicodeArray; Flags: LongWord; PackSize: LongWord; PackSizeHigh: LongWord; UnpSize: LongWord; UnpSizeHigh: LongWord; HostOS: LongWord; FileCRC: LongWord; FileTime: LongWord; UnpVer: LongWord; Method: LongWord; FileAttr: LongWord; CmtBuf: PChar; CmtBufSize: LongWord; CmtSize: LongWord; CmtState: LongWord; Reserved: packed array [0..1023] of LongWord; end; RAROpenArchiveData = packed record ArcName: PChar; OpenMode: LongWord; OpenResult: LongWord; CmtBuf: PChar; CmtBufSize: LongWord; CmtSize: LongWord; CmtState: LongWord; end; {$IFDEF MSWINDOWS}{$CALLING STDCALL}{$ELSE}{$CALLING CDECL}{$ENDIF} TUnrarCallback = function(Msg: LongWord; UserData, P1, P2: PtrInt) : Integer; TUnrarChangeVolProc = function(ArcName: PChar; Mode: Integer): Integer; TUnrarProcessDataProc = function(BufAddr: Pointer; BufSize: Integer): Integer; RAROpenArchiveDataEx = packed record ArcName: PAnsiChar; ArcNameW: PRarUnicodeChar; OpenMode: LongWord; OpenResult: LongWord; CmtBuf: PChar; CmtBufSize: LongWord; CmtSize: LongWord; CmtState: LongWord; Flags: LongWord; Callback: TUnrarCallback; UserData: PtrInt; Reserved: packed array [0..27] of LongWord; end; TRAROpenArchive = function(var ArchiveData: RAROpenArchiveData) : TArcHandle; TRAROpenArchiveEx = function(var ArchiveData: RAROpenArchiveDataEx) : TArcHandle; TRARCloseArchive = function(hArcData: TArcHandle) : Integer; TRARReadHeader = function(hArcData: TArcHandle; var HeaderData: RARHeaderData) : Integer; TRARReadHeaderEx = function (hArcData: TArcHandle; var HeaderData: RARHeaderDataEx) : Integer; TRARProcessFile = function(hArcData: TArcHandle; Operation: Integer; DestPath, DestName: PAnsiChar) : Integer; TRARProcessFileW = function(hArcData: TArcHandle; Operation: Integer; DestPath, DestName: PRarUnicodeChar) : Integer; TRARSetCallback = procedure(hArcData: TArcHandle; UnrarCallback: TUnrarCallback; UserData: PtrInt); TRARSetChangeVolProc = procedure(hArcData: TArcHandle; ChangeVolProc: TUnrarChangeVolProc); TRARSetProcessDataProc = procedure(hArcData: TArcHandle; ProcessDataProc: TUnrarProcessDataProc); TRARSetPassword = procedure(hArcData: TArcHandle; Password: PChar); TRARGetDllVersion = function: Integer; {$CALLING DEFAULT} var RAROpenArchive : TRAROpenArchive = nil; RAROpenArchiveEx : TRAROpenArchiveEx = nil; RARCloseArchive : TRARCloseArchive = nil; RARReadHeader : TRARReadHeader = nil; RARReadHeaderEx : TRARReadHeaderEx = nil; RARProcessFile : TRARProcessFile = nil; RARProcessFileW : TRARProcessFileW = nil; RARSetCallback : TRARSetCallback = nil; RARSetChangeVolProc : TRARSetChangeVolProc = nil; RARSetProcessDataProc : TRARSetProcessDataProc = nil; RARSetPassword : TRARSetPassword = nil; RARGetDllVersion : TRARGetDllVersion = nil; ModuleHandle : TLibHandle = NilHandle; function OpenArchive(var ArchiveData: TOpenArchiveData) : TArcHandle;dcpcall; function OpenArchiveW(var ArchiveData: tOpenArchiveDataW) : TArcHandle;dcpcall; function ReadHeader(hArcData: TArcHandle; var HeaderData: THeaderData) : Integer;dcpcall; function ReadHeaderEx(hArcData: TArcHandle; var HeaderData: THeaderDataEx) : Integer;dcpcall; function ReadHeaderExW(hArcData: TArcHandle; var HeaderData: THeaderDataExW) : Integer;dcpcall; function ProcessFile(hArcData: TArcHandle; Operation: Integer; DestPath, DestName: PChar) : Integer;dcpcall; function ProcessFileW(hArcData: TArcHandle; Operation: Integer; DestPath, DestName: PWideChar) : Integer;dcpcall; function CloseArchive(hArcData: TArcHandle): Integer;dcpcall; procedure SetChangeVolProc(hArcData : TArcHandle; pChangeVolProc : TChangeVolProc);dcpcall; procedure SetChangeVolProcW(hArcData : TArcHandle; pChangeVolProc : TChangeVolProcW);dcpcall; procedure SetProcessDataProc(hArcData : TArcHandle; pProcessDataProc : TProcessDataProc);dcpcall; procedure SetProcessDataProcW(hArcData : TArcHandle; pProcessDataProc : TProcessDataProcW);dcpcall; function GetPackerCaps : Integer; dcpcall; procedure ExtensionInitialize(StartupInfo: PExtensionStartupInfo); dcpcall; implementation uses DCBasicTypes, DCDateTimeUtils, DCConvertEncoding, DCFileAttributes; type // From libunrar (dll.hpp) RarHostSystem = ( HOST_MSDOS = 0, HOST_OS2 = 1, HOST_WIN32 = 2, HOST_UNIX = 3, HOST_MACOS = 4, HOST_BEOS = 5, HOST_MAX ); var ChangeVolProc : TChangeVolProc = nil; ChangeVolProcW : TChangeVolProcW = nil; ProcessDataProc : TProcessDataProc = nil; ProcessDataProcW : TProcessDataProcW = nil; // These variables store currently processed file name. // They cannot be dynamic strings, because if they are created from the // main thread of the calling program and then they're freed from another // thread of the calling program there's a crash. // It is because currently the library can only be statically linked with RTL // and so it doesn't know about the main program's multithreading. ProcessedFileName: array [0..1023] of Char; ProcessedFileNameW: array [0..1023] of WideChar; ProcessedFileHostOS: RarHostSystem; ExtensionStartupInfo: TExtensionStartupInfo; procedure StringToArrayA(src: AnsiString; pDst: PAnsiChar; MaxDstLength: Integer); begin if Length(src) < MaxDstLength then MaxDstLength := Length(src) else MaxDstLength := MaxDstLength - 1; // for ending #0 if Length(src) > 0 then Move(src[1], pDst^, SizeOf(AnsiChar) * MaxDstLength); pDst[MaxDstLength] := AnsiChar(0); end; procedure StringToArrayW(src: WideString; pDst: PWideChar; MaxDstLength: Integer); begin if Length(src) < MaxDstLength then MaxDstLength := Length(src) else MaxDstLength := MaxDstLength - 1; // for ending #0 if Length(src) > 0 then Move(src[1], pDst^, SizeOf(WideChar) * MaxDstLength); pDst[MaxDstLength] := WideChar(0); end; function RarUnicodeStringToWideString(src: TRarUnicodeString): WideString; begin {$IFDEF UNIX} Result := UCS4StringToWideString(src); {$ELSE} Result := src; {$ENDIF} end; function WideStringToRarUnicodeString(src: WideString): TRarUnicodeString; begin {$IFDEF UNIX} Result := WideStringToUCS4String(src); {$ELSE} Result := src; {$ENDIF} end; function GetSystemSpecificFileName(HostOS: RarHostSystem; FileName: AnsiString) : AnsiString; begin Result:= FileName; if HostOS in [HOST_MSDOS, HOST_WIN32] then begin Result:= CeOemToSys(Result); end; {$IFDEF MSWINDOWS} if HostOS in [HOST_UNIX, HOST_MACOS] then begin Result:= CeUTF8ToAnsi(Result); end; {$ENDIF} end; function SetSystemSpecificFileName(HostOS: RarHostSystem; FileName: AnsiString) : AnsiString; begin Result:= FileName; {$IFDEF MSWINDOWS} if HostOS in [HOST_MSDOS, HOST_WIN32] then begin Result:= CeSysToOem(Result); end; if HostOS in [HOST_UNIX, HOST_MACOS] then begin Result:= CeSysToOem(Result); end; {$ENDIF} end; function GetSystemSpecificFileTime(HostOS: RarHostSystem; FileTime: LongInt) : LongInt; var DateTime: TDateTime; begin Result := FileTime; {$IFDEF MSWINDOWS} if (HostOS = HOST_UNIX) then begin DateTime := UnixFileTimeToDateTime(Result); Result := LongInt(DateTimeToDosFileTime(DateTime)); end; {$ENDIF} {$IFDEF UNIX} if HostOS in [HOST_MSDOS, HOST_WIN32] then begin DateTime := DosFileTimeToDateTime(TDosFileTime(Result)); Result := LongInt(DateTimeToUnixFileTime(DateTime)); end; {$ENDIF} end; function GetSystemSpecificAttributes(HostOS: RarHostSystem; Attrs: LongInt): LongInt; begin Result := Attrs; {$IFDEF MSWINDOWS} if (HostOS = HOST_UNIX) or // Ugly hack: $1FFFF is max value of attributes on Windows (Result > $1FFFF) then begin Result := LongInt(UnixToWinFileAttr(TFileAttrs(Attrs))); end; {$ENDIF} {$IFDEF UNIX} if HostOS in [HOST_MSDOS, HOST_WIN32] then Result := LongInt(WinToUnixFileAttr(TFileAttrs(Result))); {$ENDIF} end; function UnrarCallback(Msg: LongWord; UserData, P1, P2: PtrInt) : Integer; dcpcall; begin Result := 0; case Msg of UCM_CHANGEVOLUME: begin if Assigned(ChangeVolProcW) then begin if ChangeVolProcW(PWideChar(UTF8Decode(AnsiToUtf8(PChar(P1)))), LongInt(P2)) = 0 then Result := -1; end else if Assigned(ChangeVolProc) then begin if ChangeVolProc(PChar(P1), LongInt(P2)) = 0 then Result := -1; end end; UCM_PROCESSDATA: begin // P1 - pointer to data buffer (first param of ProcessDataProc) // P2 - number of bytes in the buffer (second param of ProcessDataProc) if Assigned(ProcessDataProcW) then begin if ProcessDataProcW(PWideChar(ProcessedFileNameW), LongInt(P2)) = 0 then Result := -1; end else if Assigned(ProcessDataProc) then begin if ProcessDataProc(PAnsiChar(ProcessedFileName), LongInt(P2)) = 0 then Result := -1; end; end; UCM_NEEDPASSWORD: begin // DLL needs a password to process archive. This message must be // processed if you wish to be able to handle encrypted archives. // Return zero or a positive value to continue process or -1 // to cancel the archive operation. // P1 - contains the address pointing to the buffer for // a password in single byte encoding. You need to copy a password // here. // P2 - contains the size of password buffer. if not ExtensionStartupInfo.InputBox('Unrar', 'Please enter the password:', True, PAnsiChar(P1), P2) then Result := -1; end; end; end; function OpenArchive(var ArchiveData: TOpenArchiveData) : TArcHandle;dcpcall; var RarArchiveData: RAROpenArchiveData; begin if Assigned(RAROpenArchive) then begin RarArchiveData.ArcName := ArchiveData.ArcName; RarArchiveData.OpenMode := ArchiveData.OpenMode; RarArchiveData.CmtBuf := ArchiveData.CmtBuf; RarArchiveData.CmtBufSize := ArchiveData.CmtBufSize; Result := RAROpenArchive(RarArchiveData); ArchiveData.OpenResult := RarArchiveData.OpenResult; if Result <> 0 then begin ArchiveData.CmtSize := RarArchiveData.CmtSize; ArchiveData.CmtState := RarArchiveData.CmtState; RARSetCallback(Result, @UnrarCallback, 0); end; end else begin ArchiveData.OpenResult := E_EOPEN; Result := 0; end; end; function OpenArchiveW(var ArchiveData: tOpenArchiveDataW) : TArcHandle;dcpcall; var RarArchiveData: RAROpenArchiveDataEx; RarArcName: TRarUnicodeString; begin if Assigned(RAROpenArchiveEx) then begin RarArcName := WideStringToRarUnicodeString(ArchiveData.ArcName); FillChar(RarArchiveData, SizeOf(RAROpenArchiveDataEx), #0); RarArchiveData.ArcNameW := PRarUnicodeChar(RarArcName); RarArchiveData.OpenMode := ArchiveData.OpenMode; RarArchiveData.Callback := @UnrarCallback; Result := RAROpenArchiveEx(RarArchiveData); ArchiveData.OpenResult := RarArchiveData.OpenResult; if Result <> 0 then begin ArchiveData.CmtSize := RarArchiveData.CmtSize; ArchiveData.CmtState := RarArchiveData.CmtState; RARSetCallback(Result, @UnrarCallback, 0); end; end else begin ArchiveData.OpenResult := E_EOPEN; Result := 0; end; end; function ReadHeader(hArcData: TArcHandle; var HeaderData: THeaderData) : Integer;dcpcall; var RarHeader: RARHeaderData; begin if Assigned(RARReadHeader) then begin FillChar(RarHeader, SizeOf(RarHeader), 0); RarHeader.CmtBuf := HeaderData.CmtBuf; RarHeader.CmtBufSize := HeaderData.CmtBufSize; Result := RARReadHeader(hArcData, RarHeader); {$PUSH} {$Q-} {$R-} HeaderData.ArcName := RarHeader.ArcName; StringToArrayA( GetSystemSpecificFileName(RarHostSystem(RarHeader.HostOS), AnsiString(RarHeader.FileName)), @HeaderData.FileName, SizeOf(HeaderData.FileName) ); HeaderData.Flags := RarHeader.Flags; HeaderData.PackSize := RarHeader.PackSize; HeaderData.UnpSize := RarHeader.UnpSize; HeaderData.HostOS := RarHeader.HostOS; HeaderData.FileCRC := RarHeader.FileCRC; HeaderData.FileTime := RarHeader.FileTime; HeaderData.UnpVer := RarHeader.UnpVer; HeaderData.Method := RarHeader.Method; HeaderData.FileAttr := RarHeader.FileAttr; HeaderData.CmtSize := RarHeader.CmtSize; HeaderData.CmtState := RarHeader.CmtState; HeaderData.FileAttr := GetSystemSpecificAttributes(RarHostSystem(HeaderData.HostOS), HeaderData.FileAttr); HeaderData.FileTime := GetSystemSpecificFileTime(RarHostSystem(HeaderData.HostOS), HeaderData.FileTime); {$POP} Move(HeaderData.FileName, ProcessedFileName, SizeOf(HeaderData.FileName)); ProcessedFileNameW := ''; ProcessedFileHostOS:= RarHostSystem(HeaderData.HostOS); end else Result := E_EREAD; end; function ReadHeaderEx(hArcData: TArcHandle; var HeaderData: THeaderDataEx) : Integer;dcpcall; var RarHeader: RARHeaderDataEx; begin if Assigned(RARReadHeaderEx) then begin FillChar(RarHeader, SizeOf(RarHeader), 0); RarHeader.CmtBuf := HeaderData.CmtBuf; RarHeader.CmtBufSize := HeaderData.CmtBufSize; Result := RARReadHeaderEx(hArcData, RarHeader); {$PUSH} {$Q-} {$R-} HeaderData.ArcName := RarHeader.ArcName; StringToArrayA( GetSystemSpecificFileName(RarHostSystem(RarHeader.HostOS), AnsiString(RarHeader.FileName)), @HeaderData.FileName, SizeOf(HeaderData.FileName) ); HeaderData.Flags := RarHeader.Flags; HeaderData.PackSize := RarHeader.PackSize; HeaderData.PackSizeHigh := RarHeader.PackSizeHigh; HeaderData.UnpSize := RarHeader.UnpSize; HeaderData.UnpSizeHigh := RarHeader.UnpSizeHigh; HeaderData.HostOS := RarHeader.HostOS; HeaderData.FileCRC := RarHeader.FileCRC; HeaderData.FileTime := RarHeader.FileTime; HeaderData.UnpVer := RarHeader.UnpVer; HeaderData.Method := RarHeader.Method; HeaderData.FileAttr := RarHeader.FileAttr; HeaderData.CmtSize := RarHeader.CmtSize; HeaderData.CmtState := RarHeader.CmtState; HeaderData.FileAttr := GetSystemSpecificAttributes(RarHostSystem(HeaderData.HostOS), HeaderData.FileAttr); HeaderData.FileTime := GetSystemSpecificFileTime(RarHostSystem(HeaderData.HostOS), HeaderData.FileTime); {$POP} ProcessedFileName := HeaderData.FileName; ProcessedFileNameW := ''; ProcessedFileHostOS:= RarHostSystem(HeaderData.HostOS); end else Result := E_EREAD; end; function ReadHeaderExW(hArcData: TArcHandle; var HeaderData: THeaderDataExW) : Integer;dcpcall; var RarHeader: RARHeaderDataEx; begin if Assigned(RARReadHeaderEx) then begin FillChar(RarHeader, SizeOf(RarHeader), 0); RarHeader.CmtBuf := HeaderData.CmtBuf; RarHeader.CmtBufSize := HeaderData.CmtBufSize; Result := RARReadHeaderEx(hArcData, RarHeader); {$PUSH} {$Q-} {$R-} StringToArrayW( RarUnicodeStringToWideString(TRarUnicodeString(RarHeader.ArcNameW)), @HeaderData.ArcName, SizeOf(HeaderData.ArcName)); StringToArrayW( RarUnicodeStringToWideString(TRarUnicodeString(RarHeader.FileNameW)), @HeaderData.FileName, SizeOf(HeaderData.FileName)); HeaderData.Flags := RarHeader.Flags; HeaderData.PackSize := RarHeader.PackSize; HeaderData.PackSizeHigh := RarHeader.PackSizeHigh; HeaderData.UnpSize := RarHeader.UnpSize; HeaderData.UnpSizeHigh := RarHeader.UnpSizeHigh; HeaderData.HostOS := RarHeader.HostOS; HeaderData.FileCRC := RarHeader.FileCRC; HeaderData.FileTime := RarHeader.FileTime; HeaderData.UnpVer := RarHeader.UnpVer; HeaderData.Method := RarHeader.Method; HeaderData.FileAttr := RarHeader.FileAttr; HeaderData.CmtSize := RarHeader.CmtSize; HeaderData.CmtState := RarHeader.CmtState; HeaderData.FileAttr := GetSystemSpecificAttributes(RarHostSystem(HeaderData.HostOS), HeaderData.FileAttr); HeaderData.FileTime := GetSystemSpecificFileTime(RarHostSystem(HeaderData.HostOS), HeaderData.FileTime); {$POP} ProcessedFileName := RarHeader.FileName; ProcessedFileNameW := HeaderData.FileName; end else Result := E_EREAD; end; function ProcessFile(hArcData: TArcHandle; Operation: Integer; DestPath, DestName: PChar) : Integer;dcpcall; var pacDestPath: PAnsiChar = nil; pacDestName: PAnsiChar = nil; SysSpecDestPath, SysSpecDestName: AnsiString; begin if Assigned(RARProcessFile) then begin // Both DestPath and DestName must be in OEM encoding // if HostOS is MS DOS or MS Windows and archive is open under MS Windows. if DestPath <> nil then begin SysSpecDestPath:= SetSystemSpecificFileName(ProcessedFileHostOS, DestPath); pacDestPath := PAnsiChar(SysSpecDestPath); end; if DestName <> nil then begin SysSpecDestName:= SetSystemSpecificFileName(ProcessedFileHostOS, DestName); pacDestName := PAnsiChar(SysSpecDestName); end; Result := RARProcessFile(hArcData, Operation, pacDestPath, pacDestName); end else Result := E_EREAD; end; function ProcessFileW(hArcData: TArcHandle; Operation: Integer; DestPath, DestName: PWideChar) : Integer;dcpcall; var pwcDestPath: PRarUnicodeChar = nil; pwcDestName: PRarUnicodeChar = nil; SysSpecDestPath, SysSpecDestName: TRarUnicodeString; begin if Assigned(RARProcessFileW) then begin if DestPath <> nil then begin SysSpecDestPath:= WideStringToRarUnicodeString(DestPath); pwcDestPath := PRarUnicodeChar(SysSpecDestPath); end; if DestName <> nil then begin SysSpecDestName:= WideStringToRarUnicodeString(DestName); pwcDestName := PRarUnicodeChar(SysSpecDestName); end; Result := RARProcessFileW(hArcData, Operation, pwcDestPath, pwcDestName); end else Result := E_EREAD; end; function CloseArchive(hArcData: TArcHandle) : Integer;dcpcall; begin if Assigned(RARCloseArchive) then Result := RARCloseArchive(hArcData) else Result := E_ECLOSE; end; procedure SetChangeVolProc(hArcData : TArcHandle; pChangeVolProc : TChangeVolProc);dcpcall; begin ChangeVolProc := pChangeVolProc; end; procedure SetChangeVolProcW(hArcData : TArcHandle; pChangeVolProc : TChangeVolProcW);dcpcall; begin ChangeVolProcW := pChangeVolProc; end; procedure SetProcessDataProc(hArcData : TArcHandle; pProcessDataProc : TProcessDataProc);dcpcall; begin ProcessDataProc := pProcessDataProc; end; procedure SetProcessDataProcW(hArcData : TArcHandle; pProcessDataProc : TProcessDataProcW);dcpcall; begin ProcessDataProcW := pProcessDataProc; end; function GetPackerCaps: Integer; dcpcall; begin Result := PK_CAPS_MULTIPLE or PK_CAPS_BY_CONTENT; end; procedure ExtensionInitialize(StartupInfo: PExtensionStartupInfo); dcpcall; begin ExtensionStartupInfo := StartupInfo^; end; finalization if ModuleHandle <> 0 then UnloadLibrary(ModuleHandle); end. �����������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unrar/src/fpc-extra.cfg�������������������������������������������������0000644�0001750�0001750�00000000157�11673054716�021275� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#IFDEF CPU64 #IFDEF FPC_CROSSCOMPILING -Fl/usr/lib/gcc/i486-linux-gnu/4.6/64 -Fl/usr/local/lib64 #ENDIF #ENDIF �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unrar/src/unrar.lpi�����������������������������������������������������0000644�0001750�0001750�00000005241�12247124203�020542� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <CONFIG> <ProjectOptions> <Version Value="9"/> <PathDelim Value="\"/> <General> <Flags> <SaveClosedFiles Value="False"/> </Flags> <SessionStorage Value="InProjectDir"/> <MainUnit Value="0"/> <ResourceType Value="res"/> </General> <VersionInfo> <UseVersionInfo Value="True"/> <MinorVersionNr Value="1"/> <StringTable FileDescription="UnRAR WCX plugin for Double Commander" LegalCopyright="Copyright (C) 2006-2012 Koblov Alexander" ProductVersion=""/> </VersionInfo> <BuildModes Count="1"> <Item1 Name="default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <RequiredPackages Count="1"> <Item1> <PackageName Value="doublecmd_common"/> <MinVersion Minor="2" Valid="True"/> </Item1> </RequiredPackages> <Units Count="1"> <Unit0> <Filename Value="unrar.dpr"/> <IsPartOfProject Value="True"/> </Unit0> </Units> </ProjectOptions> <CompilerOptions> <Version Value="11"/> <PathDelim Value="\"/> <Target> <Filename Value="..\lib\unrar.wcx" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir);..\..\..\..\sdk"/> <OtherUnitFiles Value="..\..\..\..\sdk"/> <UnitOutputDirectory Value="..\lib"/> </SearchPaths> <Conditionals Value="if (TargetCPU <> 'arm') then begin CustomOptions += '-fPIC'; end; if (TargetOS = 'linux') then begin LinkerOptions += ' -z relro'; end; if (TargetOS = 'darwin') then begin LinkerOptions += ' -no_order_inits'; end;"/> <CodeGeneration> <Optimizations> <OptimizationLevel Value="2"/> </Optimizations> </CodeGeneration> <Linking> <LinkSmart Value="True"/> <Options> <PassLinkerOptions Value="True"/> <ExecutableType Value="Library"/> </Options> </Linking> <Other> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <ConfigFile> <CustomConfigFile Value="True"/> <ConfigFilePath Value="fpc-extra.cfg"/> </ConfigFile> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> </CONFIG> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unrar/readme.txt��������������������������������������������������������0000644�0001750�0001750�00000001303�12014201074�020101� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������For using this plugin you need unrar library. You can download it from http://www.rarlab.com/rar_add.htm Windows: Download "UnRAR.dll" - Self-extracting archive UnRARDLL.exe, unpack it and copy unrar.dll in Double Commander (or %windir%\system32) directory Linux: Download "UnRAR source" unrarsrc-x.x.x.tar.gz, unpack it: $ tar -xf unrarsrc-x.x.x.tar.gz go to "unrar" directory: $ cd unrar make symlink makefile.unix -> makefile: $ ln -s makefile.unix makefile set CXX environment variable to "g++ -DSILENT" $export CXX="g++ -DSILENT" and build library: $ make lib After compiling, copy "libunrar.so" in "/usr/lib" directory: $ cp libunrar.so /usr/lib/libunrar.so�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/cpio/�������������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�015727� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/cpio/install.txt��������������������������������������������������������0000644�0001750�0001750�00000001026�12014201074�020117� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������How to install RPM plugin: 1. Unzip the rpm.wcx and cpio.wcx to the Totalcmd directory 2. In Total Commander, choose Configuration - Options 3. Open the 'Packer' page 4. Click 'Configure packer extension WCXs 5. type rpm as the extension 6. Click 'new type', and select the rpm.wcx 5. type cpio as the extension 6. Click 'new type', and select the cpio.wcx 7. Click OK What it does: This plugin allow you to browse rpm archives. Mandryka Yurij Brain group http://braingroup.hotmail.ru/wcplugins/ mailto:braingroup@hotmail.ru����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/cpio/lib/���������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016475� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/cpio/src/���������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016516� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/cpio/src/cpio.dpr�������������������������������������������������������0000644�0001750�0001750�00000001632�12014201074�020143� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//*************************************************************** // This file is part of RPMWCX, a archiver plugin for // Windows Commander. // Copyright (C) 2000 Mandryka Yurij e-mail:braingroup@hotmail.ru //*************************************************************** { Add some changes for Lazarus and Linux compability Copyright (C) 2007 Koblov Alexander (Alexx2000@mail.ru) } //*************************************************************** // This code based on Christian Ghisler (support@ghisler.com) sources //*************************************************************** library cpio; uses SysUtils, Classes, WcxPlugin, cpio_io in 'cpio_io.pas', cpio_def in 'cpio_def.pas', cpio_archive in 'cpio_archive.pas'; exports CloseArchive, GetPackerCaps, OpenArchive, ProcessFile, ReadHeader, SetChangeVolProc, SetProcessDataProc, CanYouHandleThisFile; {$R *.res} begin end. ������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/cpio/src/cpio.dof�������������������������������������������������������0000644�0001750�0001750�00000002433�11173006725�020141� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������[Compiler] A=0 B=0 C=1 D=1 E=0 F=0 G=1 H=1 I=0 J=1 K=0 L=1 M=0 N=1 O=1 P=1 Q=0 R=0 S=0 T=0 U=0 V=1 W=0 X=1 Y=1 Z=1 ShowHints=1 ShowWarnings=1 UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; [Linker] MapFile=0 OutputObjs=0 ConsoleApp=1 DebugInfo=0 MinStackSize=16384 MaxStackSize=1048576 ImageBase=4194304 ExeDescription= [Directories] OutputDir= UnitOutputDir= SearchPath= Packages=VCL50;VCLX50;VCLSMP50;VCLDB50;VCLADO50;ibevnt50;VCLBDE50;VCLDBX50;QRPT50;TEEUI50;TEEDB50;TEE50;DSS50;TEEQR50;VCLIB50;VCLMID50;VCLIE50;INETDB50;INET50;NMFAST50;WEBMID50;dclocx50;dclaxserver50;dcldtree50 Conditionals= DebugSourceDirs= UsePackages=0 [Parameters] RunParams= HostApplication=e:\delphi\exedpr\wincmd32.exe [Version Info] IncludeVerInfo=1 AutoIncBuild=1 MajorVer=1 MinorVer=0 Release=0 Build=79 Debug=0 PreRelease=0 Special=0 Private=0 DLL=0 Locale=1049 CodePage=1251 [Version Info Keys] CompanyName=Brain group FileDescription=cpio plugin for rpm plugin for Windows Commander FileVersion=1.0.0.79 InternalName=cpio.wcx LegalCopyright=Mandryka Yurij LegalTrademarks= OriginalFilename=cpio.wcx ProductName=cpio plugin for rpm plugin ProductVersion=1.0.0.0 Comments=any questions on braingroup@hotmail.ru �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/cpio/src/cpio.lpi�������������������������������������������������������0000644�0001750�0001750�00000005236�12210604521�020150� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <CONFIG> <ProjectOptions> <Version Value="9"/> <PathDelim Value="\"/> <General> <SessionStorage Value="InProjectDir"/> <MainUnit Value="0"/> <ResourceType Value="res"/> </General> <VersionInfo> <UseVersionInfo Value="True"/> <MinorVersionNr Value="1"/> <StringTable FileDescription="CPIO WCX plugin for Double Commander" LegalCopyright="Copyright (C) 2006-2012 Koblov Alexander" ProductVersion=""/> </VersionInfo> <BuildModes Count="1"> <Item1 Name="default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <DestinationDirectory Value="$(TestDir)\publishedproject\"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <RequiredPackages Count="1"> <Item1> <PackageName Value="doublecmd_common"/> <MinVersion Minor="2" Valid="True"/> </Item1> </RequiredPackages> <Units Count="1"> <Unit0> <Filename Value="cpio.dpr"/> <IsPartOfProject Value="True"/> </Unit0> </Units> </ProjectOptions> <CompilerOptions> <Version Value="11"/> <Target> <Filename Value="../lib/cpio.wcx" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir);../../../../sdk"/> <OtherUnitFiles Value="../../../../sdk"/> <UnitOutputDirectory Value="../lib"/> </SearchPaths> <Conditionals Value="if (TargetCPU <> 'arm') then begin CustomOptions += '-fPIC'; end; if (TargetOS = 'darwin') then begin LinkerOptions += ' -no_order_inits'; end;"/> <Parsing> <SyntaxOptions> <SyntaxMode Value="Delphi"/> <UseAnsiStrings Value="False"/> </SyntaxOptions> </Parsing> <Linking> <LinkSmart Value="True"/> <Options> <PassLinkerOptions Value="True"/> <ExecutableType Value="Library"/> </Options> </Linking> <Other> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> <Debugging> <Exceptions Count="2"> <Item1> <Name Value="ECodetoolError"/> </Item1> <Item2> <Name Value="EFOpenError"/> </Item2> </Exceptions> </Debugging> </CONFIG> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/cpio/src/cpio_archive.pas�����������������������������������������������0000644�0001750�0001750�00000025165�12014201074�021651� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//*************************************************************** // This file is part of RPMWCX, a archiver plugin for // Windows Commander. // Copyright (C) 2000 Mandryka Yurij e-mail:braingroup@hotmail.ru //*************************************************************** { Add some changes for Lazarus and Linux compability Copyright (C) 2007-2009 Koblov Alexander (Alexx2000@mail.ru) } //*************************************************************** // This code based on Christian Ghisler (support@ghisler.com) sources //*************************************************************** // History // 2001-02-04 Bug: Error Opening rpm file on CD (readonly) // Fix: Add FileMode = 0 before Reset // Who: Oliver Haeger <haeger@inghb.de> // 2001-02-27 Bug: My or Ghisler I don't know : WC incorrectly // work with names in archive started with // "./" or "/" (normal UNIX filenames form) unit cpio_archive; interface {$mode delphi}{$A-,I-} {$include calling.inc} uses Classes, WcxPlugin, cpio_def, cpio_io; const MAX_ARCHIVE_LIST = 20; type PArchiveRec = ^TArchiveRec; TArchiveRec = record handle_io : THandle; handle_file : file; fname : AnsiString; fdate : Integer; fgEndArchive : Boolean; process_proc : TProcessDataProc; changevol_proc : TChangeVolProc; last_header : CPIO_Header; end;{ArchiveRec} var aList : TList; function GetPackerCaps : Integer; dcpcall; function OpenArchive(var ArchiveData : TOpenArchiveData) : TArcHandle; dcpcall; function CloseArchive(hArcData : TArcHandle) : Integer; dcpcall; function ReadHeader(hArcData : TArcHandle; var HeaderData : THeaderData) : Integer; dcpcall; function ProcessFile(hArcData : TArcHandle; Operation : Integer; DestPath : PChar; DestName : PChar) : Integer; dcpcall; procedure SetProcessDataProc(hArcData : TArcHandle; ProcessDataProc : TProcessDataProc); dcpcall; procedure SetChangeVolProc(hArcData : TArcHandle; ChangeVolProc : TChangeVolProc); dcpcall; function CanYouHandleThisFile(FileName: PAnsiChar): Boolean; dcpcall; implementation uses SysUtils, DCDateTimeUtils, DCBasicTypes; function GetArchiveID(hArcData : THandle) : Integer; var i_rec : Integer; arec : PArchiveRec; begin Result := -1; if aList.Count = 0 then Exit; for i_rec := 0 to (aList.Count - 1) do begin arec := aList.Items[i_rec]; if arec^.handle_io = hArcData then begin Result := i_rec; Break; end; end; end; function GetPackerCaps; begin Result := 0; end; function OpenArchive; var arch : THandle; arec : PArchiveRec; filename : String; fgError : Boolean; begin arec := nil; arch := 0; fgError := False; if aList.Count >= MAX_ARCHIVE_LIST then begin fgError := True; end else begin filename := String(ArchiveData.ArcName); arch := FileOpen(filename, fmOpenRead or fmShareDenyNone); if arch = -1 then begin fgError := True; end else begin New(arec); with arec^ do begin handle_io := arch; fname := filename; fdate := FileAge(filename); fgEndArchive := False; process_proc := nil; changevol_proc := nil; if fdate = -1 then fdate := 0; end; AssignFile(arec^.handle_file, filename); FileMode := 0; Reset(arec^.handle_file, 1); if IOResult <> 0 then begin fgError := True; end;{ioresult} end;{arch = -1} end;{max count reached} if fgError then begin if arec <> nil then begin CloseFile(arec^.handle_file); Dispose(arec); end; FileClose(arch); Result := 0; ArchiveData.OpenResult := E_EOPEN end else begin aList.Add(arec); Result := arch; end; end; function CloseArchive; var i_rec : Integer; arec : PArchiveRec; begin if aList.Count <> 0 then begin i_rec := GetArchiveID(hArcData); if i_rec <> -1 then begin arec := aList.Items[i_rec]; CloseFile(arec^.handle_file); FileClose(hArcData); Dispose(arec); aList.Delete(i_rec); end; end; Result := E_SUCCESS; end; function ReadHeader(hArcData : TArcHandle; var HeaderData : THeaderData): Integer; var i_rec : Integer; arec : PArchiveRec; header : CPIO_Header; begin Result := E_EREAD; i_rec := GetArchiveID(hArcData); if i_rec <> -1 then begin arec := aList.Items[i_rec]; if arec^.fgEndArchive then Result := E_END_ARCHIVE else begin while True do begin if CPIO_ReadHeader(arec^.handle_file, header) then begin if header.filename = 'TRAILER!!!' then begin Result := E_END_ARCHIVE; Break end else begin if header.filesize <> 0 then begin with HeaderData do begin copy_str2buf(TStrBuf(ArcName), arec^.fname); copy_str2buf(TStrBuf(FileName), header.filename); PackSize := header.filesize; UnpSize := header.filesize; FileAttr := LongInt(header.mode); FileTime := LongInt(UnixFileTimeToDosTime(TUnixFileTime(header.mtime))); end;{with} Result := 0; Break; end else Continue; end;{not end of file "TRAILER!!!"} end{if header readed} else begin Result := E_EREAD; Break; end; end;{while true} arec^.last_header := header; end;{if not end of archive} end; end; function ProcessFile; var i_rec : Integer; arec : PArchiveRec; cpio_file : file; cpio_name : String; cpio_dir : String; buf : Pointer; buf_size : LongWord; fsize : LongWord; fgReadError : Boolean; fgWriteError: Boolean; fAborted : Boolean; head : CPIO_Header; begin i_rec := GetArchiveID(hArcData); arec := aList.Items[i_rec]; head := arec^.last_header; case Operation of PK_TEST : begin faborted:=false; fsize := head.filesize; buf_size := 65536; GetMem(buf, buf_size); fgReadError := False; while not faborted do begin if fsize < buf_size then Break; BlockRead(arec^.handle_file, buf^, buf_size); if IOResult <> 0 then begin fgReadError := True; Break; end;{if IO error} Dec(fsize, buf_size); if Assigned(arec^.process_proc) then if arec^.process_proc(nil, buf_size)=0 then faborted:=true; end;{while} if not fgReadError and not faborted then begin if fsize <> 0 then begin BlockRead(arec^.handle_file, buf^, fsize); if IOResult <> 0 then fgReadError := True; if Assigned(arec^.process_proc) then arec^.process_proc(nil, fsize); end; end; if faborted then Result:=E_EABORTED else if fgReadError then Result := E_EREAD else begin Result := 0; if arec^.last_header.IsOldHeader then begin if not AlignFilePointer(arec^.handle_file, 2) then Result := E_EREAD; end else if not AlignFilePointer(arec^.handle_file, 4) then Result := E_EREAD; end; FreeMem(buf, 65536); end;{PK_TEST} PK_SKIP : begin Seek(arec^.handle_file, FilePos(arec^.handle_file) + LongInt(head.filesize)); if IOResult = 0 then begin Result := 0; if arec^.last_header.IsOldHeader then begin if not AlignFilePointer(arec^.handle_file, 2) then Result := E_EREAD; end else if not AlignFilePointer(arec^.handle_file, 4) then Result := E_EREAD; end else Result := E_EREAD; end;{PK_SKIP} PK_EXTRACT : begin cpio_name := String(DestName); cpio_dir := ExtractFileDir(cpio_name); if CreateDirectories(cpio_dir) then begin AssignFile(cpio_file, cpio_name); Rewrite(cpio_file, 1); if IOResult <> 0 then Result := E_ECREATE else begin fsize := head.filesize; buf_size := 65536; GetMem(buf, buf_size); fgReadError := False; fgWriteError :=False; fAborted := False; while not fAborted do begin if fsize < buf_size then Break; BlockRead(arec^.handle_file, buf^, buf_size); if IOResult <> 0 then begin fgReadError := True; Break; end;{if IO error} BlockWrite(cpio_file, buf^, buf_size); if ioresult<>0 then begin fgWriteError:=true; break; end; Dec(fsize, buf_size); if Assigned(arec^.process_proc) then if arec^.process_proc(nil, buf_size)=0 then fAborted:=true; end;{while} if not fgReadError then begin if fsize <> 0 then begin BlockRead(arec^.handle_file, buf^, fsize); if IOResult <> 0 then fgReadError := True; BlockWrite(cpio_file, buf^, fsize); if ioresult<>0 then fgWriteError:=true; if Assigned(arec^.process_proc) then if arec^.process_proc(nil, fsize)=0 then fAborted:=true; end; end; if fAborted then Result:= E_EABORTED else if fgWriteError then Result := E_EWRITE else if fgReadError then Result := E_EREAD else begin Result := 0; if arec^.last_header.IsOldHeader then begin if not AlignFilePointer(arec^.handle_file, 2) then Result := E_EREAD; end else if not AlignFilePointer(arec^.handle_file, 4) then Result := E_EREAD; end; FileSetDate(tfilerec(cpio_file).handle, LongInt(UnixFileTimeToDosTime(TUnixFileTime(head.mtime)))); CloseFile(cpio_file); if result<>0 then Erase(cpio_file); FreeMem(buf, 65536); end; end else Result := E_ECREATE; end{PK_EXTRACT} else Result := 0; end;{case operation} end; procedure SetProcessDataProc; var i_rec : Integer; arec : PArchiveRec; begin i_rec := GetArchiveID(hArcData); if i_rec <> -1 then begin arec := aList.Items[i_rec]; arec^.process_proc := ProcessDataProc; end; end; procedure SetChangeVolProc; var i_rec : Integer; arec : PArchiveRec; begin i_rec := GetArchiveID(hArcData); if i_rec <> -1 then begin arec := aList.Items[i_rec]; arec^.changevol_proc := ChangeVolProc; end; end; function CanYouHandleThisFile; begin try Result:= IsCPIOArchive(StrPas(FileName)); except Result := False; end; end; initialization aList := TList.Create; finalization aList.Free; end. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/cpio/src/cpio_io.pas����������������������������������������������������0000644�0001750�0001750�00000017243�12014201074�020635� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//*************************************************************** // This file is part of RPMWCX, a archiver plugin for // Windows Commander. // Copyright (C) 2000 Mandryka Yurij e-mail:braingroup@hotmail.ru //*************************************************************** { Add some changes for Lazarus and Linux compability Copyright (C) 2007 Koblov Alexander (Alexx2000@mail.ru) } //*************************************************************** // Part of code (functions DirectoryExists and ForceDirectories) // got from Delphi source code //*************************************************************** //*************************************************************** // This code based on Christian Ghisler (support@ghisler.com) sources //*************************************************************** {$A-,I-} unit cpio_io; interface uses cpio_def, Classes; type TStrBuf = array[1..260] of Char; function CPIO_ReadHeader(var f : file; var header : CPIO_Header) : Boolean; function IsCPIOArchive(FileName: UTF8String): Boolean; function AlignFilePointer(var f : file; align : Integer) : Boolean; procedure copy_str2buf(var buf : TStrBuf; s : AnsiString); function CreateDirectories(Dir : String) : Boolean; function correct_filename(oldname : AnsiString) : AnsiString; implementation uses SysUtils; {$IFNDEF FPC} // for compiling under Delphi Const DirSeparators : set of char = ['/','\']; Procedure DoDirSeparators (Var FileName : String); VAr I : longint; begin For I:=1 to Length(FileName) do If FileName[I] in DirSeparators then FileName[i]:=PathDelim; end; {$ENDIF} procedure copy_str2buf(var buf : TStrBuf; s : AnsiString); var i_char : Integer; begin FillChar(buf, Sizeof(buf), 0); if Length(s) = 0 then Exit; if Length(s) > 259 then SetLength(s, 259); s := s + #0; for i_char := 1 to Length(s) do buf[i_char] := s[i_char]; end; function AlignFilePointer; var start : Integer; mul : LongWord; begin Result := False; start := FilePos(f); case align of 2 : mul := $FFFFFFFE; 4 : mul := $FFFFFFFC; 8 : mul := $FFFFFFF8; else Exit; end;{case} if (start mod align) <> 0 then begin start := start and mul; Inc(start, align); end; Seek(f, start); if IOResult = 0 then Result := True; end; function ExcludeTrailingBackslash(Dir:string):string; begin if (length(dir)>0) and (dir[length(dir)]='\') then result:=copy(dir,1,length(dir)-1) else result:=dir; end; function CreateDirectories(Dir : String) : Boolean; begin Result := True; if Length(Dir) = 0 then Result := False else begin Dir := ExcludeTrailingBackslash(Dir); if (Length(Dir) < 3) or DirectoryExists(Dir) or (ExtractFilePath(Dir) = Dir) then Exit; Result := CreateDirectories(ExtractFilePath(Dir)) and CreateDir(Dir); end; end; function OctalToDec(Octal: String): Longword; var i: Integer; begin Result := 0; for i := 1 to Length(Octal) do begin Result := Result shl 3; case Octal[i] of '0'..'7': Result := Result + Longword(Ord(Octal[i]) - Ord('0')); end; end; end; function HexToDec(Hex: String): Longword; var i: Integer; begin Result := 0; for i := 1 to Length(Hex) do begin Result := Result shl 4; case Hex[i] of '0'..'9': Result := Result + LongWord(Ord(Hex[i]) - Ord('0')); 'A'..'F': Result := Result + LongWord(Ord(Hex[i]) - Ord('A')) + 10; 'a'..'f': Result := Result + LongWord(Ord(Hex[i]) - Ord('a')) + 10; end; end; end; function CPIO_ReadHeader(var f : file; var header : CPIO_Header): Boolean; var Buffer : array [0..259] of AnsiChar; OldHdr : TOldBinaryHeader absolute Buffer; OdcHdr : TOldCharHeader absolute Buffer; NewHdr : TNewCharHeader absolute Buffer; ofs : Integer; begin Result := False; {First, check the type of header} BlockRead(f, Buffer[0], 6); if IOResult <> 0 then Exit; header.IsOldHeader := False; // Old binary format. if PWord(@Buffer[0])^ = $71C7 then begin header.IsOldHeader := True; BlockRead(f, Buffer[6], SizeOf(TOldBinaryHeader) - 6); if IOResult <> 0 then Exit; with header, OldHdr do begin magic := c_magic; dev_major := c_dev; dev_minor := 0; inode := c_ino; mode := c_mode; uid := c_uid; gid := c_gid; nlink := c_nlink; mtime := 65536 * c_mtime1 + c_mtime2; filesize := 65536 * c_filesize1 + c_filesize2; namesize := c_namesize; end; end // Old Ascii format. else if strlcomp(Buffer, '070707', 6) = 0 then begin BlockRead(f, Buffer[6], SizeOf(TOldCharHeader) - 6); if IOResult <> 0 then Exit; with header, OdcHdr do begin magic := OctalToDec(c_magic); dev_major := OctalToDec(c_dev); dev_minor := 0; inode := OctalToDec(c_ino); mode := OctalToDec(c_mode); uid := OctalToDec(c_uid); gid := OctalToDec(c_gid); nlink := OctalToDec(c_nlink); mtime := OctalToDec(c_mtime); filesize := OctalToDec(c_filesize); namesize := OctalToDec(c_namesize); end; end // New Ascii format. else if (strlcomp(Buffer, '070701', 6) = 0) or (strlcomp(Buffer, '070702', 6) = 0) then begin BlockRead(f, Buffer[6], SizeOf(TNewCharHeader) - 6); if IOResult <> 0 then Exit; with header, NewHdr do begin magic := HexToDec(c_magic); dev_major := HexToDec(c_devmajor); dev_minor := HexToDec(c_devminor); inode := HexToDec(c_ino); mode := HexToDec(c_mode); uid := HexToDec(c_uid); gid := HexToDec(c_gid); nlink := HexToDec(c_nlink); mtime := HexToDec(c_mtime); filesize := HexToDec(c_filesize); namesize := HexToDec(c_namesize); end; end else Exit; with header do begin if namesize = 0 then exit; {Error!} {Read name} ofs:=0; if namesize > 259 then begin ofs := namesize - 259; namesize := 259; end; FillChar(Buffer, SizeOf(Buffer), #0); BlockRead(f, Buffer, namesize); if IOResult <> 0 then Exit; SetString(filename, Buffer, namesize); if ofs <> 0 then Seek(f, FilePos(f) + ofs); origname := filename; DoDirSeparators(filename); if IsOldHeader then begin if not AlignFilePointer(f, 2) then Exit; end else if not AlignFilePointer(f, 4) then Exit; //Correct file name started with "./" or "/" filename := correct_filename(filename); end; Result := True; end; function IsCPIOArchive(FileName: UTF8String): Boolean; type TAsciiHeader = array[0..5] of AnsiChar; const sOld: TAsciiHeader = ('0', '7', '0', '7', '0', '7'); sNew: TAsciiHeader = ('0', '7', '0', '7', '0', '1'); sCrc: TAsciiHeader = ('0', '7', '0', '7', '0', '2'); var Buf: TAsciiHeader; Stream: TFileStream; begin Result := False; Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone); try if (Stream.Size >= 6) and (Stream.Read(Buf[0], 6) = 6) then begin Result := // Binary format (PWord(@Buf[0])^ = $71C7) or // Ascii formats CompareMem(@Buf[0], @sOld[0], 6) or CompareMem(@Buf[0], @sNew[0], 6) or CompareMem(@Buf[0], @sCrc[0], 6); end; finally Stream.Free; end; end; function correct_filename(oldname : AnsiString) : AnsiString; begin Result := oldname; if Length(oldname) > 1 then begin case oldname[1] of '.' : case oldname[2] of '/', '\' : System.Delete(oldname, 1, 2); end;{case} '/', '\' : System.Delete(oldname, 1, 1); end;{case} end; Result := oldname; end; end. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/cpio/src/cpio.cfg�������������������������������������������������������0000644�0001750�0001750�00000000546�11173006725�020133� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-$A- -$B- -$C+ -$D+ -$E- -$F- -$G+ -$H+ -$I- -$J+ -$K- -$L+ -$M- -$N+ -$O+ -$P+ -$Q- -$R- -$S- -$T- -$U- -$V+ -$W- -$X+ -$YD -$Z1 -cg -AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -H+ -W+ -M -$M16384,1048576 -K$00400000 -LE"c:\borland\delphi5\Projects\Bpl" -LN"c:\borland\delphi5\Projects\Bpl" ����������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/cpio/src/cpio_def.pas���������������������������������������������������0000644�0001750�0001750�00000006153�11366324333�020777� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//*************************************************************** // This file is part of RPMWCX, a archiver plugin for // Windows Commander. // Copyright (C) 2000 Mandryka Yurij e-mail:braingroup@hotmail.ru //*************************************************************** //*************************************************************** // This code based on Christian Ghisler (support@ghisler.com) sources //*************************************************************** {$A-,I-} unit cpio_def; interface type CPIO_Header = record magic, dev_major, dev_minor, inode, mode, uid, gid, nlink, mtime, filesize, namesize: Longword; filename : UTF8String; origname : UTF8String; IsOldHeader: Boolean; end;{CPIO_Header} TOldBinaryHeader=packed record c_magic, c_dev, c_ino, c_mode, c_uid, c_gid, c_nlink, c_rdev:word; c_mtime1,c_mtime2:word; c_namesize:word; c_filesize1,c_filesize2:word; (* char c_name[c_namesize rounded to word];*) end; TOldCharHeader=packed record c_magic : array[0..5] of AnsiChar; {070707} c_dev : array[0..5] of AnsiChar; c_ino : array[0..5] of AnsiChar; c_mode : array[0..5] of AnsiChar; c_uid : array[0..5] of AnsiChar; c_gid : array[0..5] of AnsiChar; c_nlink : array[0..5] of AnsiChar; c_rdev : array[0..5] of AnsiChar; c_mtime : array[0..10] of AnsiChar; c_namesize: array[0..5] of AnsiChar; c_filesize: array[0..10] of AnsiChar; end; TNewCharHeader=packed record c_magic : array[0..5] of AnsiChar; {070701} {070702 - CRC format} c_ino : array[0..7] of AnsiChar; c_mode : array[0..7] of AnsiChar; c_uid : array[0..7] of AnsiChar; c_gid : array[0..7] of AnsiChar; c_nlink : array[0..7] of AnsiChar; c_mtime : array[0..7] of AnsiChar; c_filesize : array[0..7] of AnsiChar; //must be 0 for FIFOs and directories c_devmajor : array[0..7] of AnsiChar; c_devminor : array[0..7] of AnsiChar; c_rdevmajor: array[0..7] of AnsiChar; //only valid for chr and blk special files c_rdevminor: array[0..7] of AnsiChar; //only valid for chr and blk special files c_namesize : array[0..7] of AnsiChar; //count includes terminating NUL in pathname c_check : array[0..7] of AnsiChar; //0 for "new" portable format; for CRC format the sum of all the bytes in the file end; implementation end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/cpio/license.txt��������������������������������������������������������0000644�0001750�0001750�00000002205�12014201074�020073� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������RPM plugin v.1.4 for Windows Commander. Copyright (c) 2000..2002 Mandryka Yurij ( Brain Group ) Add some changes for Lazarus and Linux compability Copyright (C) 2007 Koblov Alexander (Alexx2000@mail.ru) This plugin allow you to browse rpm archives with Windows Commander 4.0 or greater. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS OR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Any questions about plugin can be made via e-mail : braingroup@hotmail.ru and information about plugin can be found on Brain Group web site : http://braingroup.hotmail.ru/wcplugins/ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/deb/��������������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�015527� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/deb/install.txt���������������������������������������������������������0000644�0001750�0001750�00000000646�12014201074�017726� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������How to install DEB plugin: 1. Unzip the deb.wcx to the Wincmd directory 2. In Windows Commander, choose Configuration - Options 3. Open the 'Packer' page 4. Click 'Configure packer extension WCXs 5. type deb as the extension 6. Click 'new type', and select the deb.wcx 7. Click OK What it does: This plugin allow you to browse debian linux package archives. Alexandre Maximov. Penza. Russia. http://max.reklam.ru ������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/deb/lib/����������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016275� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/deb/src/����������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016316� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/deb/src/deb_io.pas������������������������������������������������������0000644�0001750�0001750�00000002454�12014201074�020233� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit deb_io; interface {$A-,I-} uses deb_def; function deb_ReadHeader(var f : file; var header, lastheader : deb_Header) : Boolean; implementation uses SysUtils; function deb_ReadHeader; var tmp_buf : array [0..259] of Char; tmp_str : String[10]; j : Integer; loadlen : Integer; begin Result := False; loadlen:=size_deb_files; Seek(f, lastheader.pos+lastheader.size); if IOResult <> 0 then Exit; header.pos:=FilePos(f)+size_deb_files; BlockRead(f, tmp_buf, loadlen); if IOResult <> 0 then Exit; if tmp_buf[0] = #10 then begin // other version DPKG - offset 1. Seek(f, lastheader.pos+lastheader.size+1); if IOResult <> 0 then Exit; header.pos:=FilePos(f)+size_deb_files; BlockRead(f, tmp_buf, loadlen); if IOResult <> 0 then Exit; end; SetLength(header.filename, 16); for j:=1 to 16 do header.filename[j]:=tmp_buf[j-1]; header.filename:=Trim(header.filename); SetLength(tmp_str, 10); for j:=1 to 10 do tmp_str[j] := tmp_buf[j - 1 + 32+16]; if tmp_str = '' then header.size:=0 else header.size:=StrToInt(Trim(tmp_str)); SetLength(tmp_str, 12); for j:=1 to 12 do tmp_str[j] := tmp_buf[j - 1 + 16]; if tmp_str = '' then header.Time:=0 else header.Time:=StrToInt(Trim(tmp_str)); header.crc:=0; Result := True; end; end. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/deb/src/deb_def.pas�����������������������������������������������������0000644�0001750�0001750�00000000404�12014201074�020353� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit deb_def; interface type deb_Header = record filename : String[16]; time : longint; size : longint; pos : longint; crc : longint; end; const size_deb_files= 60; size_deb_signature = 72; implementation end. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/deb/src/deb.lpi���������������������������������������������������������0000644�0001750�0001750�00000005226�12210604521�017547� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <CONFIG> <ProjectOptions> <Version Value="9"/> <PathDelim Value="\"/> <General> <SessionStorage Value="InProjectDir"/> <MainUnit Value="0"/> <ResourceType Value="res"/> </General> <VersionInfo> <UseVersionInfo Value="True"/> <MinorVersionNr Value="1"/> <StringTable FileDescription="DEB WCX plugin for Double Commander" LegalCopyright="Copyright (C) 2006-2012 Koblov Alexander" ProductVersion=""/> </VersionInfo> <BuildModes Count="1"> <Item1 Name="default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <DestinationDirectory Value="$(TestDir)\publishedproject\"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <HostApplicationFilename Value="X:\Totalcmd\Totalcmd.exe"/> <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <RequiredPackages Count="1"> <Item1> <PackageName Value="doublecmd_common"/> <MinVersion Minor="2" Valid="True"/> </Item1> </RequiredPackages> <Units Count="1"> <Unit0> <Filename Value="deb.dpr"/> <IsPartOfProject Value="True"/> </Unit0> </Units> </ProjectOptions> <CompilerOptions> <Version Value="11"/> <PathDelim Value="\"/> <Target> <Filename Value="..\lib\deb.wcx" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir);..\..\..\..\sdk"/> <OtherUnitFiles Value="..\..\..\..\sdk"/> <UnitOutputDirectory Value="..\lib"/> </SearchPaths> <Conditionals Value="if (TargetCPU <> 'arm') then begin CustomOptions += '-fPIC'; end; if (TargetOS = 'darwin') then begin LinkerOptions += ' -no_order_inits'; end;"/> <Parsing> <SyntaxOptions> <SyntaxMode Value="Delphi"/> <UseAnsiStrings Value="False"/> </SyntaxOptions> </Parsing> <CodeGeneration> <Checks> <IOChecks Value="True"/> </Checks> </CodeGeneration> <Linking> <LinkSmart Value="True"/> <Options> <PassLinkerOptions Value="True"/> <ExecutableType Value="Library"/> </Options> </Linking> <Other> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> </CONFIG> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/deb/src/deb.dof���������������������������������������������������������0000644�0001750�0001750�00000002417�11173006725�017543� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������[FileVersion] Version=6.0 [Compiler] A=8 B=0 C=0 D=0 E=0 F=0 G=1 H=1 I=0 J=0 K=0 L=0 M=0 N=1 O=1 P=1 Q=0 R=0 S=0 T=0 U=1 V=1 W=1 X=1 Y=0 Z=1 ShowHints=1 ShowWarnings=1 UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; [Linker] MapFile=0 OutputObjs=0 ConsoleApp=1 DebugInfo=0 RemoteSymbols=0 MinStackSize=16384 MaxStackSize=1048576 ImageBase=65536 ExeDescription= [Directories] OutputDir=bin UnitOutputDir=bin PackageDLLOutputDir= PackageDCPOutputDir= SearchPath=..\..\.. Packages=vcl;rtl;vclx Conditionals= DebugSourceDirs= UsePackages=0 [Parameters] RunParams= HostApplication=X:\Totalcmd\Totalcmd.exe Launcher= UseLauncher=0 DebugCWD= [Version Info] IncludeVerInfo=1 AutoIncBuild=0 MajorVer=1 MinorVer=0 Release=0 Build=0 Debug=0 PreRelease=0 Special=0 Private=0 DLL=1 Locale=1049 CodePage=1251 [Version Info Keys] CompanyName=Alexandre Maximov FileDescription= FileVersion=1.0.0.0 InternalName=deb.wcx LegalCopyright= LegalTrademarks= OriginalFilename=deb.wcx ProductName=WC Plugin for Debian pakages ProductVersion=1.0.0.0 Comments= [Excluded Packages] [HistoryLists\hlUnitAliases] Count=1 Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/deb/src/deb_archive.pas�������������������������������������������������0000644�0001750�0001750�00000023351�12014201074�021244� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit deb_archive; interface {$mode delphi}{$A-,I-} {$include calling.inc} uses Classes, WcxPlugin, deb_def, deb_io; const MAX_ARCHIVE_LIST = 20; type PArchiveRec = ^TArchiveRec; TArchiveRec = record handle_io : THandle; handle_file : file; fname : AnsiString; fdate : Integer; fgEndArchive : Boolean; process_proc : TProcessDataProc; changevol_proc : TChangeVolProc; last_header : deb_Header; end;{ArchiveRec} var aList : TList; function GetPackerCaps : Integer; dcpcall; function OpenArchive(var ArchiveData : TOpenArchiveData) : TArcHandle; dcpcall; function CloseArchive(hArcData : TArcHandle) : Integer; dcpcall; function ReadHeader(hArcData : TArcHandle; var HeaderData : THeaderData) : Integer; dcpcall; function ProcessFile(hArcData : TArcHandle; Operation : Integer; DestPath : PChar; DestName : PChar) : Integer; dcpcall; procedure SetProcessDataProc(hArcData : TArcHandle; ProcessDataProc : TProcessDataProc); dcpcall; procedure SetChangeVolProc(hArcData : TArcHandle; ChangeVolProc : TChangeVolProc); dcpcall; implementation uses SysUtils, DCDateTimeUtils, DCBasicTypes; function GetArchiveID(hArcData : THandle) : Integer; var i_rec : Integer; arec : PArchiveRec; begin Result := -1; if aList.Count = 0 then Exit; for i_rec := 0 to (aList.Count - 1) do begin arec := aList.Items[i_rec]; if arec^.handle_io = hArcData then begin Result := i_rec; Break; end; end; end; function GetPackerCaps; begin Result := PK_CAPS_MULTIPLE; end; function OpenArchive; var arch : THandle; arec : PArchiveRec; filename : String; fgError : Boolean; function SignatureProbe: integer; //0 Ales Gut; 1 IO error; 2 is not DEBIAN PKG const deb_signature: array [0..20] of Char ='!<arch>'#10'debian-binary'; var tmp_buf : array [0..20] of Char; j : integer; begin Result:=2; BlockRead(arec^.handle_file, tmp_buf, 21); if IOResult <> 0 then begin Result:=1; Exit; end; for j:=0 to 20 do if deb_signature[j] <> tmp_buf[j] then Exit; Result:=0; end; begin ArchiveData.OpenResult := E_EOPEN; arec := nil; arch := 0; fgError := False; if aList.Count >= MAX_ARCHIVE_LIST then begin fgError := True; end else begin filename := String(ArchiveData.ArcName); arch := FileOpen(filename, fmOpenRead or fmShareDenyNone); if arch = THandle(-1) then begin fgError := True; end else begin New(arec); with arec^ do begin handle_io := arch; fname := filename; fdate := FileAge(filename); fgEndArchive := False; process_proc := nil; changevol_proc := nil; if fdate = -1 then fdate := 0; last_header.size:=0; last_header.pos:=size_deb_signature; end; AssignFile(arec^.handle_file, filename); FileMode := 0; Reset(arec^.handle_file, 1); if IOResult <> 0 then begin fgError := True; end else begin case SignatureProbe of 1: begin ArchiveData.OpenResult := E_EREAD; fgError := True; end; 2: begin ArchiveData.OpenResult := E_UNKNOWN_FORMAT; fgError := True; end else begin Seek(arec^.handle_file, size_deb_signature); if IOResult <> 0 then fgError := True; end; end;{case SignatureProbe} end;{ioresult} end;{arch = -1} end;{max count reached} if fgError then begin if arec <> nil then begin CloseFile(arec^.handle_file); Dispose(arec); end; FileClose(arch); Result := 0; end else begin aList.Add(arec); Result := arch; ArchiveData.OpenResult := E_SUCCESS; end; end; function CloseArchive; var i_rec : Integer; arec : PArchiveRec; begin if aList.Count <> 0 then begin i_rec := GetArchiveID(hArcData); if i_rec <> -1 then begin arec := aList.Items[i_rec]; CloseFile(arec^.handle_file); FileClose(hArcData); Dispose(arec); aList.Delete(i_rec); end; end; Result := E_SUCCESS; end; function ReadHeader; var i_rec : Integer; arec : PArchiveRec; header : deb_Header; begin Result := E_EREAD; i_rec := GetArchiveID(hArcData); if i_rec <> -1 then begin arec := aList.Items[i_rec]; if arec^.fgEndArchive then Result := E_END_ARCHIVE else begin while True do begin if not deb_ReadHeader(arec^.handle_file, header, arec^.last_header) then begin Result := E_END_ARCHIVE; Break end else begin with HeaderData do begin StrPCopy(ArcName, arec^.fname); StrPCopy(FileName, header.filename); PackSize := header.size; UnpSize := header.size; UnpVer := 2; HostOS := 0; FileCRC := header.CRC; FileAttr := faArchive; FileTime := LongInt(UnixFileTimeToDosTime(TUnixFileTime(header.time))); end;{with} Result := E_SUCCESS; Break; end{if header readed} end;{while true} arec^.last_header := header; end;{if not end of archive} end; end; function ProcessFile; var i_rec : Integer; arec : PArchiveRec; targz_file : file; targz_name : String; buf : Pointer; buf_size : LongWord; fsize : LongWord; fpos : LongWord; fgReadError : Boolean; fgWriteError: Boolean; fAborted : Boolean; head : deb_Header; begin i_rec := GetArchiveID(hArcData); arec := aList.Items[i_rec]; head := arec^.last_header; case Operation of PK_TEST : begin fAborted:=false; fsize := head.size; fpos := head.pos; buf_size := 65536; GetMem(buf, buf_size); fgReadError := False; Seek(arec^.handle_file, fpos); if IOResult <> 0 then begin fgReadError := True; fAborted:=True; end; while not faborted do begin if fsize < buf_size then Break; BlockRead(arec^.handle_file, buf^, buf_size); if IOResult <> 0 then begin fgReadError := True; Break; end;{if IO error} Dec(fsize, buf_size); if Assigned(arec^.process_proc) then if arec^.process_proc(nil, buf_size)=0 then fAborted:=true; end;{while} if not fgReadError and not faborted then begin if fsize <> 0 then begin BlockRead(arec^.handle_file, buf^, fsize); if IOResult <> 0 then fgReadError := True; if Assigned(arec^.process_proc) then if arec^.process_proc(nil, fsize)=0 then fAborted:=true; end; end; if fAborted then Result:=E_EABORTED else if fgReadError then Result := E_EREAD else Result := 0; Seek(arec^.handle_file, size_deb_signature); FreeMem(buf, 65536); end;{PK_TEST} PK_SKIP : Result := 0; PK_EXTRACT : begin targz_name := String(DestName); AssignFile(targz_file, targz_name); Rewrite(targz_file, 1); if IOResult <> 0 then Result := E_ECREATE else begin i_rec := GetArchiveID(hArcData); arec := aList.Items[i_rec]; fgReadError := False; fgWriteError :=False; fAborted := False; fsize := head.size; fpos := head.pos; buf_size := 65536; GetMem(buf, buf_size); Seek(arec^.handle_file, fpos); if IOResult <> 0 then begin fgReadError := True; fAborted:=True; end; while not fAborted do begin if fsize < buf_size then Break; BlockRead(arec^.handle_file, buf^, buf_size); if IOResult <> 0 then begin fgReadError := True; Break; end;{if IO error} BlockWrite(targz_file, buf^, buf_size); if ioresult<>0 then begin fgWriteError:=true; break; end; Dec(fsize, buf_size); if Assigned(arec^.process_proc) then if arec^.process_proc(nil, buf_size)=0 then fAborted:=true; end;{while} if not fgReadError then begin if fsize <> 0 then begin BlockRead(arec^.handle_file, buf^, fsize); if IOResult <> 0 then fgReadError := True; BlockWrite(targz_file, buf^, fsize); if ioresult<>0 then fgWriteError:=true; if Assigned(arec^.process_proc) then if arec^.process_proc(nil, fsize)=0 then fAborted:=true; end; end; if fAborted then Result:= E_EABORTED else if fgWriteError then Result := E_EWRITE else if fgReadError then Result := E_EREAD else Result := 0; FileSetDate(tfilerec(targz_file).handle, LongInt(UnixFileTimeToDosTime(TUnixFileTime(head.time)))); CloseFile(targz_file); Seek(arec^.handle_file, size_deb_signature); if result<>0 then Erase(targz_file); FreeMem(buf, 65536); end; end;{PK_EXTRACT} else Result := E_SUCCESS; end;{case operation} end; procedure SetProcessDataProc; var i_rec : Integer; arec : PArchiveRec; begin i_rec := GetArchiveID(hArcData); if i_rec <> -1 then begin arec := aList.Items[i_rec]; arec^.process_proc := ProcessDataProc; end; end; procedure SetChangeVolProc; var i_rec : Integer; arec : PArchiveRec; begin i_rec := GetArchiveID(hArcData); if i_rec <> -1 then begin arec := aList.Items[i_rec]; arec^.changevol_proc := ChangeVolProc; end; end; initialization aList := TList.Create; finalization aList.Free; end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/deb/src/deb.dpr���������������������������������������������������������0000644�0001750�0001750�00000000421�12014201074�017536� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library deb; uses deb_io in 'deb_io.pas', deb_archive in 'deb_archive.pas', deb_def in 'deb_def.pas'; {$E wcx} exports CloseArchive, GetPackerCaps, OpenArchive, ProcessFile, ReadHeader, SetChangeVolProc, SetProcessDataProc; {$R *.res} begin end. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/deb/license.txt���������������������������������������������������������0000644�0001750�0001750�00000002037�12014201074�017676� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DEB plugin for Windows Commander. Copyright (c) 2002 Alexandre Maximov Add some changes for Lazarus and Linux compability Copyright (C) 2007 Koblov Alexander (Alexx2000@mail.ru) This plugin allow you to browse debian linux package (*.deb) archives with Windows Commander 4.0 or greater. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS OR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Any information about plugin can be found on web site : http://max.reklam.ru �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/��������������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�015577� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/����������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017546� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abdfpkmg.pas����������������������������������������������0000644�0001750�0001750�00000021740�12014201074�022014� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbDfPkMg.pas *} {*********************************************************} {* Deflate package-merge algorithm *} {*********************************************************} unit AbDfPkMg; {$I AbDefine.inc} interface uses AbDfBase; procedure GenerateCodeLengths(aMaxCodeLen : integer; const aWeights : array of integer; var aCodeLengths : array of integer; aStartInx : integer; aLog : TAbLogger); implementation type PPkgNode = ^TPkgNode; TPkgNode = packed record pnWeight : integer; pnCount : integer; pnLeft : PPkgNode; pnRight : PPkgNode; end; PPkgNodeList = ^TPkgNodeList; TPkgNodeList = array [0..pred(286 * 2)] of PPkgNode; {Note: the "286" is the number of literal/length symbols, the maximum number of weights we'll be calculating the optimal code lengths for} {===helper routines==================================================} function IsCalcFeasible(aCount : integer; aMaxCodeLen : integer) : boolean; begin {works out if length-limited codes can be calculated for a given number of symbols and the maximum code length} {return whether 2^aMaxCodeLen > aCount} Result := (1 shl aMaxCodeLen) > aCount; end; {--------} procedure QSS(aList : PPkgNodeList; aFirst : integer; aLast : integer); var L, R : integer; Pivot : integer; Temp : pointer; begin {while there are at least two items to sort} while (aFirst < aLast) do begin {the pivot is the middle item} Pivot := aList^[(aFirst+aLast) div 2]^.pnWeight; {set indexes and partition} L := pred(aFirst); R := succ(aLast); while true do begin repeat dec(R); until (aList^[R]^.pnWeight <= Pivot); repeat inc(L); until (aList^[L]^.pnWeight >= Pivot); if (L >= R) then Break; Temp := aList^[L]; aList^[L] := aList^[R]; aList^[R] := Temp; end; {quicksort the first subfile} if (aFirst < R) then QSS(aList, aFirst, R); {quicksort the second subfile - recursion removal} aFirst := succ(R); end; end; {--------} procedure SortList(aList : PPkgNodeList; aCount : integer); begin QSS(aList, 0, pred(aCount)); end; {--------} procedure Accumulate(aNode : PPkgNode); begin while (aNode^.pnLeft <> nil) do begin Accumulate(aNode^.pnLeft); aNode := aNode^.pnRight; end; inc(aNode^.pnCount); end; {====================================================================} {===Interfaced routine===============================================} procedure GenerateCodeLengths(aMaxCodeLen : integer; const aWeights : array of integer; var aCodeLengths : array of integer; aStartInx : integer; aLog : TAbLogger); var i : integer; Bit : integer; WeightCount : integer; OrigList : PPkgNodeList; OrigListCount : integer; MergeList : PPkgNodeList; MergeListCount : integer; PkgList : PPkgNodeList; PkgListCount : integer; OrigInx : integer; PkgInx : integer; Node : PPkgNode; NodeMgr : TAbNodeManager; begin {calculate the number of weights} WeightCount := succ(high(aWeights)); {check for dumb programming errors} Assert((0 < aMaxCodeLen) and (aMaxCodeLen <= 15), 'GenerateCodeLengths: the maximum code length should be in the range 1..15'); Assert((1 <= WeightCount) and (WeightCount <= 286), 'GenerateCodeLengths: the weight array must have 1..286 elements'); Assert(IsCalcFeasible(WeightCount, aMaxCodeLen), 'GenerateCodeLengths: the package-merge algorithm should always be feasible'); {clear the code lengths array} FillChar(aCodeLengths[aStartInx], WeightCount * sizeof(integer), 0); {prepare for the try..finally} OrigList := nil; MergeList := nil; PkgList := nil; NodeMgr := nil; try {create the node manager} NodeMgr := TAbNodeManager.Create(sizeof(TPkgNode)); {create the original list of nodes} GetMem(OrigList, WeightCount * sizeof(PPkgNode)); OrigListCount := 0; for i := 0 to pred(WeightCount) do if (aWeights[i] <> 0) then begin Node := NodeMgr.AllocNode; Node^.pnLeft := nil; { this will indicate a leaf} Node^.pnRight := pointer(i); { the index of the weight} Node^.pnWeight := aWeights[i]; { the weight itself} Node^.pnCount := 1; { how many times used} OrigList^[OrigListCount] := Node; inc(OrigListCount); end; {we need at least 2 items, so make anything less a special case} if (OrigListCount <= 1) then begin {if there are no items at all in the original list, we need to pretend that there is one, since we shall eventually need to calculate a Count-1 value that cannot be negative} if (OrigListCount = 0) then begin aCodeLengths[aStartInx] := 1; Exit; end; {otherwise there is only one item: set its code length directly} for i := 0 to pred(WeightCount) do if (aWeights[i] <> 0) then begin aCodeLengths[aStartInx + i] := 1; Exit; end; end; {there are at least 2 items in the list; so sort the list} SortList(OrigList, OrigListCount); {create the merge and package lists} GetMem(MergeList, OrigListCount * 2 * sizeof(PPkgNode)); GetMem(PkgList, OrigListCount * 2 * sizeof(PPkgNode)); {initialize the merge list to have the same items as the original list} Move(OrigList^, MergeList^, OrigListCount * sizeof(PPkgNode)); MergeListCount := OrigListCount; {do aMaxCodeLen - 2 times...} for Bit := 1 to pred(aMaxCodeLen) do begin {generate the package list from the merge list by grouping pairs from the merge list and adding them to the package list} PkgListCount := 0; for i := 0 to pred(MergeListCount div 2) do begin Node := NodeMgr.AllocNode; Node^.pnLeft := MergeList^[i * 2]; Node^.pnRight := MergeList^[i * 2 + 1]; Node^.pnWeight := Node^.pnLeft^.pnWeight + Node^.pnRight^.pnWeight; {$IFOPT C+} Node^.pnCount := 0; {$ENDIF} PkgList^[PkgListCount] := Node; inc(PkgListCount); end; {merge the original list and the package list} MergeListCount := 0; OrigInx := 0; PkgInx := 0; {note the optimization here: the package list will *always* be last to empty in the merge process since it will have at least one item whose accumulated weight is greater than all of the items in the original list} while (OrigInx < OrigListCount) and (PkgInx < PkgListCount) do begin if (OrigList^[OrigInx]^.pnWeight <= PkgList^[PkgInx]^.pnWeight) then begin MergeList^[MergeListCount] := OrigList^[OrigInx]; inc(OrigInx); end else begin MergeList^[MergeListCount] := PkgList^[PkgInx]; inc(PkgInx); end; inc(MergeListCount); end; if (OrigInx < OrigListCount) then begin Move(OrigList^[OrigInx], MergeList^[MergeListCount], (OrigListCount - OrigInx) * sizeof(PPkgNode)); inc(MergeListCount, (OrigListCount - OrigInx)); end else begin Move(PkgList^[PkgInx], MergeList^[MergeListCount], (PkgListCount - PkgInx) * sizeof(PPkgNode)); inc(MergeListCount, (PkgListCount - PkgInx)); end; end; {calculate the code lengths} for i := 0 to (OrigListCount * 2) - 3 do begin Node := MergeList^[i]; if (Node^.pnLeft <> nil) then Accumulate(Node); end; for i := 0 to pred(OrigListCount) do aCodeLengths[aStartInx + integer(OrigList^[i].pnRight)] := OrigList^[i].pnCount; finally FreeMem(OrigList); FreeMem(MergeList); FreeMem(PkgList); NodeMgr.Free; end; end; {====================================================================} end. ��������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abdfenc.pas�����������������������������������������������0000644�0001750�0001750�00000073675�12014201074�021641� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbDfEnc.pas *} {*********************************************************} {* Deflate encoding unit *} {*********************************************************} unit AbDfEnc; {$I AbDefine.inc} interface uses Classes, AbDfBase; function Deflate(aSource : TStream; aDest : TStream; aHelper : TAbDeflateHelper) : longint; implementation uses AbDfInW, AbDfHufD, AbDfStrm, AbDfCryS, AbDfPkMg; {====================================================================} function CalcDynamicBitCount(aUseDeflate64: boolean; aLitBuckets : PAbDfLitBuckets; aDistBuckets : PAbDfDistBuckets; aCodeBuckets : PAbDfCodeLenBuckets; const aCodeLens : array of integer; const aCLCodeLens : array of integer; aLitCount : integer; aDistCount : integer; aCodeCount : integer) : longint; var Symbol : integer; LastSymbol : integer; Inx : integer; begin {note: this routine calculates the number of bits required to compress a given block} {a dynamic block starts off with 5 bits of literal symbol count, 5 bits of distance symbol count, 4 bits of codelength symbol count, and then 3 bits for every codelength symbol used} Result := 5 + 5 + 4 + (aCodeCount * 3); {add in the bits needed to compress the literal and distance trees} inc(Result, aCodeBuckets^[16] * (aCLCodeLens[16] + 2)); inc(Result, aCodeBuckets^[17] * (aCLCodeLens[16] + 3)); inc(Result, aCodeBuckets^[18] * (aCLCodeLens[16] + 7)); for Symbol := 3 to pred(aCodeCount) do begin Inx := dfc_CodeLengthIndex[Symbol]; Assert(Inx <=15, 'CalcDynamicBitCount: the index array of codelengths is corrupted'); inc(Result, aCodeBuckets^[Inx] * aCLCodeLens[Inx]) end; {make the literal symbol 285 a special case} LastSymbol := pred(aLitCount); if (LastSymbol = 285) then LastSymbol := 284; {add in all the bits needed to compress the literals (except 285)} for Symbol := 0 to LastSymbol do if (Symbol < dfc_LitExtraOffset) then inc(Result, aLitBuckets^[Symbol] * aCodeLens[Symbol]) else inc(Result, aLitBuckets^[Symbol] * (aCodeLens[Symbol] + dfc_LitExtraBits[Symbol - dfc_LitExtraOffset])); {add in all the bits needed to compress the literal symbol 285} if (pred(aLitCount) = 285) then if (not aUseDeflate64) then inc(Result, aLitBuckets^[285] * aCodeLens[285]) else inc(Result, aLitBuckets^[285] * (aCodeLens[285] + 16)); {add in all the bits needed to compress the distances} for Symbol := 0 to pred(aDistCount) do inc(Result, aDistBuckets^[Symbol] * (aCodeLens[aLitCount + Symbol] + dfc_DistExtraBits[Symbol])); end; {====================================================================} {====================================================================} procedure OutputEndOfBlock(aBitStrm : TAbDfOutBitStream; aLitTree : TAbDfDecodeHuffmanTree); var Code : longint; begin {note: this routine encodes the end-of-block character (symbol 256) and then writes out the code to the bit stream} {encode the end-of-block character as a symbol} {$IFOPT C+} {if Assertions are on } Code := aLitTree.Encode(256); {$ELSE} Code := aLitTree.Encodes^[256]; {$ENDIF} {write the code out to the bit stream} aBitStrm.WriteBits(Code and $FFFF, (Code shr 16) and $FF); end; {--------} procedure EncodeLZStreamStored(aFinalBlock : boolean; aStream : TAbDfLZStream; aBitStrm : TAbDfOutBitStream; aDataSize : integer; aLog : TAbLogger); var BlockHeader : packed record bhSize : word; bhNotSize : word; end; Buffer : pointer; Code : integer; BlockSize : integer; begin {note: this routine writes out an incompressible block to the bit stream (the store algorithm)} {allocate the maximum buffer we can write at once} GetMem(Buffer, 64 * 1024); try {while there's more incompressible data to store...} while (aDataSize <> 0) do begin {calculate the block size to write this time} if (aDataSize > $FFFF) then begin BlockSize := $FFFF; dec(aDataSize, $FFFF); end else begin BlockSize := aDataSize; aDataSize := 0; end; {$IFDEF UseLogging} {log it} if (aLog <> nil) then begin aLog.WriteLine('..Writing new block...'); aLog.WriteLine(Format('..final block? %d', [ord(aFinalBlock)])); aLog.WriteLine('..block type? 0'); aLog.WriteLine(Format('..block size: %d', [BlockSize])); end; {$ENDIF} {output the block information to the bit stream} if aFinalBlock then Code := 1 + (0 shl 1) else Code := 0 + (0 shl 1); aBitStrm.WriteBits(Code, 3); {align the bit stream to the nearest byte} aBitStrm.AlignToByte; {write the stored block header} BlockHeader.bhSize := BlockSize; BlockHeader.bhNotSize := not BlockHeader.bhSize; aBitStrm.WriteBuffer(BlockHeader, sizeof(BlockHeader)); {get and write this block} aStream.ReadStoredBuffer(Buffer^, BlockSize); aBitStrm.WriteBuffer(Buffer^, BlockSize); end; finally FreeMem(Buffer); end; {clear the stream, ready for the next block} aStream.Clear; end; {--------} procedure EncodeLZStreamStatic(aFinalBlock : boolean; aUseDeflate64 : boolean; aStream : TAbDfLZStream; aBitStrm : TAbDfOutBitStream; aLog : TAbLogger); var Code : integer; begin {note: this routine writes out the stream of LZ77 tokens for the current block to the bit stream, using the static huffman trees to encode the token symbols} {$IFDEF UseLogging} {log it} if (aLog <> nil) then begin aLog.WriteLine('..Writing new block...'); aLog.WriteLine(Format('..final block? %d', [ord(aFinalBlock)])); aLog.WriteLine('..block type? 1'); end; {$ENDIF} {output the block information to the bit stream} if aFinalBlock then Code := 1 + (1 shl 1) else Code := 0 + (1 shl 1); aBitStrm.WriteBits(Code, 3); {encode the LZ77 stream} aStream.Encode(aBitStrm, AbStaticLiteralTree, AbStaticDistanceTree, aUseDeflate64); {output the end-of-block marker to the bit stream} OutputEndOfBlock(aBitStrm, AbStaticLiteralTree); {$IFDEF UseLogging} if (aLog <> nil) then aLog.WriteLine('Char: end-of-block marker (#256)'); {$ENDIF} end; {--------} procedure EncodeLZStreamDynamic(aFinalBlock : boolean; aUseDeflate64 : boolean; aUseBest : boolean; aStream : TAbDfLZStream; aBitStrm : TAbDfOutBitStream; aLog : TAbLogger); var i : integer; LitTree : TAbDfDecodeHuffmanTree; DistTree : TAbDfDecodeHuffmanTree; CodeLenTree : TAbDfDecodeHuffmanTree; CodeLenStream : TAbDfCodeLenStream; CodeLens : array [0..285+32] of integer; CLCodeLens : array [0..18] of integer; LitCodeCount : integer; DistCodeCount : integer; LenCodeCount : integer; BitCount : integer; Code : integer; StaticSize : integer; StoredSize : integer; begin {note: this routine writes out the stream of LZ77 tokens for the current block to the bit stream, using the dynamic huffman trees to encode the token symbols; if the routine determines that the data can better be compressed using the static huffman trees or should be stored as is, it'll switch algorithms} {prepare for the try..finally} LitTree := nil; DistTree := nil; CodeLenTree := nil; CodeLenStream := nil; try {calculate the code lengths for the literal symbols} GenerateCodeLengths(15, aStream.LitBuckets^, CodeLens, 0, aLog); {calculate the number of the used codelengths for the literals} LitCodeCount := 286; repeat dec(LitCodeCount); until (CodeLens[LitCodeCount] <> 0); inc(LitCodeCount); {calculate the code lengths for the distance symbols} GenerateCodeLengths(15, aStream.DistBuckets^, CodeLens, LitCodeCount, aLog); {calculate the number of the used codelengths for the distances} DistCodeCount := 32; repeat dec(DistCodeCount); until (CodeLens[DistCodeCount + LitCodeCount] <> 0); inc(DistCodeCount); {calculate the code lengths array as a stream of items} CodeLenStream := TAbDfCodeLenStream.Create(aLog); CodeLenStream.Build(CodeLens, LitCodeCount + DistCodeCount); {calculate the codelengths for the code lengths} GenerateCodeLengths(7, CodeLenStream.Buckets^, CLCodeLens, 0, nil); {calculate the number of the used codelengths for the code lengths} LenCodeCount := 19; repeat dec(LenCodeCount); until (CLCodeLens[dfc_CodeLengthIndex[LenCodeCount]] <> 0); inc(LenCodeCount); {..there's a minimum of four, though} if (LenCodeCount < 4) then LenCodeCount := 4; {if we have to work out and use the best method...} if aUseBest then begin {calculate the number of bits required for the compressed data using dynamic huffman trees} BitCount := CalcDynamicBitCount(aUseDeflate64, aStream.LitBuckets, aStream.DistBuckets, CodeLenStream.Buckets, CodeLens, CLCodeLens, LitCodeCount, DistCodeCount, LenCodeCount); {choose the algorithm with the smallest size} StaticSize := aStream.StaticSize; StoredSize := (aStream.StoredSize + 4) * 8; if (StaticSize < BitCount) then begin if (StoredSize < StaticSize) then EncodeLZStreamStored(aFinalBlock, aStream, aBitStrm, (StoredSize div 8) - 4, aLog) else EncodeLZStreamStatic(aFinalBlock, aUseDeflate64, aStream, aBitStrm, aLog); Exit; end else if (StoredSize < BitCount) then begin EncodeLZStreamStored(aFinalBlock, aStream, aBitStrm, (StoredSize div 8) - 4, aLog); Exit; end; end; {create the code lengths tree} CodeLenTree := TAbDfDecodeHuffmanTree.Create(19, 7, huEncoding); CodeLenTree.Build(CLCodeLens, 0, 19, [0], $FFFF); {$IFDEF UseLogging} {log the tree} if (aLog <> nil) then begin aLog.WriteLine('Code lengths tree'); CodeLenTree.DebugPrint(aLog); end; {$ENDIF} {calculate the literal encoding tree} LitTree := TAbDfDecodeHuffmanTree.Create(286, 15, huEncoding); LitTree.Build(CodeLens, 0, LitCodeCount, dfc_LitExtraBits, dfc_LitExtraOffset); {$IFDEF UseLogging} {log the tree} if (aLog <> nil) then begin aLog.WriteLine('Literal/length tree'); LitTree.DebugPrint(aLog); end; {$ENDIF} {calculate the distance tree} if aUseDeflate64 then DistTree := TAbDfDecodeHuffmanTree.Create(32, 15, huEncoding) else DistTree := TAbDfDecodeHuffmanTree.Create(30, 15, huEncoding); DistTree.Build(CodeLens, LitCodeCount, DistCodeCount, dfc_DistExtraBits, dfc_DistExtraOffset); {$IFDEF UseLogging} if (aLog <> nil) then begin {log the tree} aLog.WriteLine('Distance tree'); DistTree.DebugPrint(aLog); {log the new block} aLog.WriteLine('..Writing new block...'); aLog.WriteLine(Format('..final block? %d', [ord(aFinalBlock)])); aLog.WriteLine('..block type? 2'); aLog.WriteLine(Format('Count of literals: %d', [LitCodeCount])); aLog.WriteLine(Format('Count of distances: %d', [DistCodeCount])); aLog.WriteLine(Format('Count of code lengths: %d', [LenCodeCount])); end; {$ENDIF} {output the block information to the bit stream} if aFinalBlock then Code := 1 + (2 shl 1) else Code := 0 + (2 shl 1); aBitStrm.WriteBits(Code, 3); {output the various counts to the bit stream} Code := (LitCodeCount - 257) + ((DistCodeCount - 1) shl 5) + ((LenCodeCount - 4) shl 10); aBitStrm.WriteBits(Code, 14); {output the code length codelengths to the bit stream} for i := 0 to pred(LenCodeCount) do aBitStrm.WriteBits(CLCodeLens[dfc_CodeLengthIndex[i]], 3); {encode and write the codelength stream to the bit stream} CodeLenStream.Encode(aBitStrm, CodeLenTree); {encode and write the LZ77 stream to the bit stream} aStream.Encode(aBitStrm, LitTree, DistTree, aUseDeflate64); {output the end-of-block marker to the bit stream} OutputEndOfBlock(aBitStrm, LitTree); {$IFDEF UseLogging} if (aLog <> nil) then aLog.WriteLine('Char: end-of-block marker (#256)'); {$ENDIF} finally LitTree.Free; DistTree.Free; CodeLenTree.Free; CodeLenStream.Free; end; end; {====================================================================} {===Single algorithm Static/Dynamic Huffman tree deflate=============} function DeflateStaticDynamic(aStatic : boolean; aUseBest: boolean; aSource : TStream; aDest : TStream; aHelper : TAbDeflateHelper; aLog : TAbLogger) : longint; var i : integer; SlideWin : TAbDfInputWindow; BitStrm : TAbDfOutBitStream; LZ77Stream : TAbDfLZStream; KeyLen : integer; Match : TAbDfMatch; PrevMatch : TAbDfMatch; UseDeflate64 : boolean; UseCRC32 : boolean; GotMatch : boolean; LZStrmIsFull : boolean; TestForBinary: boolean; begin {note: turn on the following define to see when and how the lazy matching algorithm works} {$IFDEF UseLogging} {$DEFINE UseLazyMatchLogging} {$ENDIF} {$IFDEF UseLogging} if (aLog <> nil) then if aStatic then aLog.WriteLine('..compressing source data with static huffman trees') else aLog.WriteLine('..compressing source data with dynamic huffman trees'); {$ENDIF} {prepare for the try..finally} SlideWin := nil; BitStrm := nil; LZ77Stream := nil; try {create the sliding window} UseDeflate64 := (aHelper.Options and dfc_UseDeflate64) <> 0; UseCRC32 := (aHelper.Options and dfc_UseAdler32) = 0; SlideWin := TAbDfInputWindow.Create(aSource, aHelper.StreamSize, aHelper.WindowSize, aHelper.ChainLength, UseDeflate64, UseCRC32); SlideWin.OnProgress := aHelper.OnProgressStep; {create the bit stream} BitStrm := TAbDfOutBitStream.Create(aDest); {create the LZ77 stream} LZ77Stream := TAbDfLZStream.Create(SlideWin, UseDeflate64, aLog); LZStrmIsFull := false; TestForBinary := true; {set the previous match to be a literal character: this will ensure that no lazy matching goes on with the first key read} PrevMatch.maLen := 0; {get the first key length} KeyLen := SlideWin.GetNextKeyLength; {while the current key is three characters long...} while (KeyLen = 3) do begin {tweak for binary/text} {note: the test for whether a stream is binary or not is to check whether there are any #0 characters in the first 1024 bytes: if there are the stream is binary. this test and tweaking is based on experimentation compression ratios for binary and text files based on the PKZIP 'n' option.} if TestForBinary and (LZ77Stream.StoredSize = 1024) then begin if (aHelper.PKZipOption = 'n') then if (LZ77Stream.LitBuckets^[0] = 0) then begin aHelper.AmpleLength := aHelper.AmpleLength * 2; aHelper.MaxLazyLength := aHelper.MaxLazyLength * 2; aHelper.ChainLength := aHelper.ChainLength * 2; SlideWin.ChainLen := aHelper.ChainLength; end; TestForBinary := false; end; {if the LZ77 stream is full, empty it} if LZStrmIsFull then begin if aStatic then EncodeLZStreamStatic(false, UseDeflate64, LZ77Stream, BitStrm, aLog) else EncodeLZStreamDynamic(false, UseDeflate64, aUseBest, LZ77Stream, BitStrm, aLog); LZ77Stream.Clear; LZStrmIsFull := false; end; {try and find a match of three or more characters (note: this has the side effect of adding the current key to the internal hash table); this routine will only return true if it finds a match greater than the previous match} GotMatch := SlideWin.FindLongestMatch(aHelper.AmpleLength, Match, PrevMatch); {if the maximum match length were three and the distance exceeds 4096 bytes, it's most likely that we'll get better compression by outputting the three literal bytes rather than by outputting a length symbol, a distance symbol, and at least ten extra bits for the extra distance value} if (Match.maLen = 3) and (Match.maDist > 4096) then GotMatch := false; {if we found a match...} if GotMatch then begin {if there were no previous match, we can't do any lazy match processing now, so save the current match details ready for lazy matching the next time through, and advance the sliding window} if (PrevMatch.maLen = 0) then begin PrevMatch.maLen := Match.maLen; PrevMatch.maDist := Match.maDist; PrevMatch.maLit := Match.maLit; SlideWin.AdvanceByOne; end {otherwise the previous match is smaller than this one, so we're going to accept this match in preference; throw away the previous match, output the previous literal character instead and save these match details} else begin {$IFDEF UseLazyMatchLogging} if (aLog <> nil) then aLog.WriteLine( Format( '..this match longer, rejecting previous one (%d,%d)', [PrevMatch.maLen, PrevMatch.maDist])); {$ENDIF} LZStrmIsFull := LZ77Stream.AddLiteral(PrevMatch.maLit); PrevMatch.maLen := Match.maLen; PrevMatch.maDist := Match.maDist; PrevMatch.maLit := Match.maLit; SlideWin.AdvanceByOne; end; {if, by this point, we're storing up a match, check to see if it equals or exceeds the maximum lazy match length; if it does then output the match right now and avoid checking for a lazy match} if (PrevMatch.maLen >= aHelper.MaxLazyLength) then begin {$IFDEF UseLazyMatchLogging} if (aLog <> nil) then if ((aHelper.Options and dfc_UseLazyMatch) <> 0) then aLog.WriteLine('..match longer than max lazy match, using it'); {$ENDIF} LZStrmIsFull := LZ77Stream.AddLenDist(PrevMatch.maLen, PrevMatch.maDist); SlideWin.Advance(PrevMatch.maLen - 1, PrevMatch.maLen - 1); PrevMatch.maLen := 0; end; end {otherwise, we don't have a match at all: so we possibly just need to output a literal character} else begin {if there was a previous match, output it and discard the results of this match} if (PrevMatch.maLen <> 0) then begin LZStrmIsFull := LZ77Stream.AddLenDist(PrevMatch.maLen, PrevMatch.maDist); SlideWin.Advance(PrevMatch.maLen - 1, PrevMatch.maLen - 2); PrevMatch.maLen := 0; end {otherwise there was no previous match or it's already been output, so output this literal} else begin LZStrmIsFull := LZ77Stream.AddLiteral(Match.maLit); SlideWin.AdvanceByOne; PrevMatch.maLen := 0; end; end; {get the next key} KeyLen := SlideWin.GetNextKeyLength; end; {if the last key read were one or two characters in length, save them as literal character encodings} if (KeyLen > 0) then begin {if there's a match pending, it'll be of length 3: output it} if (PrevMatch.maLen <> 0) then begin Assert(PrevMatch.maLen = 3, 'DeflateStaticDynamic: previous match should be length 3'); LZ77Stream.AddLenDist(PrevMatch.maLen, PrevMatch.maDist); end {otherwise, output the one or two final literals} else for i := 1 to KeyLen do LZ77Stream.AddLiteral(SlideWin.GetNextChar); end; {empty the LZ77 stream} if aStatic then EncodeLZStreamStatic(true, UseDeflate64, LZ77Stream, BitStrm, aLog) else EncodeLZStreamDynamic(true, UseDeflate64, aUseBest, LZ77Stream, BitStrm, aLog); {calculate the checksum of the input stream} Result := SlideWin.Checksum; finally {free the objects} SlideWin.Free; BitStrm.Free; LZ77Stream.Free; end;{try..finally} {$IFDEF UseLogging} {log it} if (aLog <> nil) then aLog.WriteLine(Format('..checksum: %8x', [Result])) {$ENDIF} end; {====================================================================} {===Simple storing===================================================} function DeflateStored(aSource : TStream; aDest : TStream; aHelper : TAbDeflateHelper; aLog : TAbLogger) : longint; const StoredBlockSize = $FFFF; var Buffer : PAnsiChar; BytesRead : LongWord; ByteCount : Int64; BytesToGo : Int64; CurPos : Int64; Size : Int64; Percent : longint; CheckSum : longint; UseCRC32 : boolean; BlockHeader : packed record bhInfo : byte; bhSize : word; bhNotSize : word; end; begin {note: this routine merely stores the aSource stream data, no compression is attempted or done} {$IFDEF UseLogging} if (aLog <> nil) then aLog.WriteLine('..storing source data to destination, no compression'); {$ENDIF} {initialize} ByteCount := 0; UseCRC32 := (aHelper.Options and dfc_UseAdler32) = 0; if UseCRC32 then Checksum := -1 { CRC32 starts off with all bits set} else CheckSum := 1; { Adler32 starts off with a value of 1} if (aHelper.StreamSize > 0) then BytesToGo := aHelper.StreamSize else begin CurPos := aSource.Seek(0, soCurrent); Size := aSource.Seek(0, soEnd); aSource.Seek(CurPos, soBeginning); BytesToGo := Size - CurPos; end; {get a buffer} GetMem(Buffer, StoredBlockSize); try {while there is still data to be stored...} while (BytesToGo <> 0) do begin {read the next block} BytesRead := aSource.Read(Buffer^, StoredBlockSize); {fire the progress event} if Assigned(aHelper.OnProgressStep) then begin inc(ByteCount, BytesRead); Percent := Round((100.0 * ByteCount) / aHelper.StreamSize); aHelper.OnProgressStep(Percent); end; {update the checksum} if UseCRC32 then AbUpdateCRCBuffer(Checksum, Buffer^, BytesRead) else AbUpdateAdlerBuffer(Checksum, Buffer^, BytesRead); {write the block header} if (BytesRead = BytesToGo) then BlockHeader.bhInfo := 1 {ie, final block, stored} else BlockHeader.bhInfo := 0; {ie, not final block, stored} BlockHeader.bhSize := BytesRead; BlockHeader.bhNotSize := not BlockHeader.bhSize; aDest.WriteBuffer(BlockHeader, sizeof(BlockHeader)); {write the block of data} aDest.WriteBuffer(Buffer^, BytesRead); {$IFDEF UseLogging} {log it} if (aLog <> nil) then begin if (BlockHeader.bhInfo = 0) then aLog.WriteLine(Format('..block size: %d', [BytesRead])) else aLog.WriteLine(Format('..block size: %d (final block)', [BytesRead])); end; {$ENDIF} {decrement the number of bytes to go} dec(BytesToGo, BytesRead); end; finally FreeMem(Buffer); end; {return the checksum} {note: the CRC32 checksum algorithm requires a post-conditioning step after being calculated (the result is NOTted), whereas Adler32 does not} if UseCRC32 then Result := not Checksum else Result := Checksum; {$IFDEF UseLogging} {log it} if (aLog <> nil) then aLog.WriteLine(Format('..checksum: %8x', [Result])) {$ENDIF} end; {====================================================================} {===Interfaced routine===============================================} function Deflate(aSource : TStream; aDest : TStream; aHelper : TAbDeflateHelper) : longint; var Helper : TAbDeflateHelper; Log : TAbLogger; SourceStartPos : longint; DestStartPos : longint; begin {pre-conditions: streams are allocated, options enable some kind of archiving} Assert(aSource <> nil, 'Deflate: aSource stream cannot be nil'); Assert(aDest <> nil, 'Deflate: aDest stream cannot be nil'); Assert((aHelper = nil) or ((aHelper.Options and $07) <> 0), 'Deflate: aHelper.Options must enable some kind of archiving'); {$IFDEF DefeatWarnings} Result := 0; {$ENDIF} {prepare for the try..finally} Helper := nil; Log := nil; try {finally} try {except} {create our helper; assign the passed one to it} Helper := TAbDeflateHelper.Create; if (aHelper <> nil) then Helper.Assign(aHelper); {save the current positions of both streams} SourceStartPos := aSource.Position; DestStartPos := aDest.Position; {if the helper's stream size is -1, and it has a progress event handler, calculate the stream size from the stream itself} if Assigned(Helper.OnProgressStep) then begin if (Helper.StreamSize = -1) then Helper.StreamSize := aSource.Size; end {otherwise we certainly can't do any progress reporting} else begin Helper.OnProgressStep := nil; Helper.StreamSize := 0; end; {if lazy matching is not requested, ensure the maximum lazy match length is zero: this make the LZ77 code a little easier to understand} if ((Helper.Options and dfc_UseLazyMatch) = 0) then Helper.MaxLazyLength := 0; {patch up the various lengths in the helper if they specify the maximum (that is, are equal to -1)} if (Helper.AmpleLength = -1) then Helper.AmpleLength := MaxLongInt; if (Helper.MaxLazyLength = -1) then Helper.MaxLazyLength := MaxLongInt; if (Helper.ChainLength = -1) then Helper.ChainLength := MaxLongInt; {create the logger, if requested} if (Helper.LogFile <> '') then begin Log := TAbLogger.Create(Helper.LogFile); Log.WriteLine('DEFLATING STREAM...'); {$IFNDEF UseLogging} Log.WriteLine('Need to recompile the app with UseLogging turned on'); {$ENDIF} end; {use the helper's options property to decide what to do} case (Helper.Options and $07) of dfc_CanUseStored : Result := DeflateStored(aSource, aDest, Helper, Log); dfc_CanUseStatic : Result := DeflateStaticDynamic(true, false, aSource, aDest, Helper, Log); dfc_CanUseDynamic : Result := DeflateStaticDynamic(false, false, aSource, aDest, Helper, Log); else Result := DeflateStaticDynamic(false, true, aSource, aDest, Helper, Log); end; {save the uncompressed and compressed sizes} if (aHelper <> nil) then begin aHelper.NormalSize := aSource.Position - SourceStartPos; aHelper.CompressedSize := aDest.Position - DestStartPos; end; except on E : EAbInternalDeflateError do begin {$IFDEF UseLogging} if (Log <> nil) then Log.WriteLine(Format('Internal exception raised: %s', [E.Message])); {$ENDIF} raise EAbDeflateError.Create(E.Message); end; end; finally Helper.Free; Log.Free; end; {WARNING NOTE: the compiler will warn that the return value of this function might be undefined. However, it is wrong: it has been fooled by the code. If you don't want to see this warning again, enable the DefeatWarnings compiler define in AbDefine.inc.} end; {====================================================================} end. �������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abspanst.pas����������������������������������������������0000644�0001750�0001750�00000030723�12014201074�022055� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Craig Peterson <capeterson@users.sourceforge.net> * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbSpanSt.pas *} {*********************************************************} {* ABBREVIA: TAbSpan*Stream Classes *} {*********************************************************} {* Streams to handle splitting ZIP files or spanning *} {* them to diskettes *} {*********************************************************} unit AbSpanSt; {$I AbDefine.inc} interface uses Classes, AbArcTyp; type { TAbSpanBaseStream interface ============================================== } TAbSpanBaseStream = class(TStream) protected {private} FArchiveName: string; FOnRequestImage: TAbRequestImageEvent; protected {methods} function GetImageName( ImageNumber: Integer ): string; public {methods} constructor Create( const ArchiveName: string ); public {events} property OnRequestImage : TAbRequestImageEvent read FOnRequestImage write FOnRequestImage; end; { TAbSpanReadStream interface ============================================== } TAbSpanReadStream = class(TAbSpanBaseStream) protected {private} FCurrentImage: LongWord; FIsSplit: Boolean; FLastImage: LongWord; FStream: TStream; FOnRequestNthDisk : TAbRequestNthDiskEvent; protected {methods} procedure GotoImage( ImageNumber: Integer ); procedure SetOnRequestImage(Value: TAbRequestImageEvent); public {methods} constructor Create( const ArchiveName: string; CurrentImage: LongWord; Stream: TStream ); destructor Destroy; override; function Read(var Buffer; Count: Longint): Longint; override; function Write(const Buffer; Count: Longint): Longint; override; function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override; procedure SeekImage( Image: LongWord; const Offset: Int64); public {events} property OnRequestImage write SetOnRequestImage; property OnRequestNthDisk : TAbRequestNthDiskEvent read FOnRequestNthDisk write FOnRequestNthDisk; end; { TAbSpanWriteStream interface ============================================= } TAbSpanWriteStream = class(TAbSpanBaseStream) protected {private} FCurrentImage: LongWord; FImageSize: Int64; FStream: TStream; FThreshold: Int64; FOnRequestBlankDisk : TAbRequestDiskEvent; protected {methods} procedure NewImage; public {methods} constructor Create( const ArchiveName: string; Stream: TStream; Threshold: Int64 ); destructor Destroy; override; function Read(var Buffer; Count: Longint): Longint; override; function Write(const Buffer; Count: Longint): Longint; override; function WriteUnspanned(const Buffer; Count: Longint; FailOnSpan: Boolean = False): Boolean; function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override; function ReleaseStream: TStream; public {properties} property CurrentImage : LongWord read FCurrentImage; public {events} property OnRequestBlankDisk : TAbRequestDiskEvent read FOnRequestBlankDisk write FOnRequestBlankDisk; end; implementation uses {$IFDEF MSWINDOWS} Windows, {$ENDIF} Math, RTLConsts, SysUtils, AbUtils, AbExcept, DCOSUtils, DCClassesUtf8; {============================================================================} { TAbSpanBaseStream implementation ========================================= } constructor TAbSpanBaseStream.Create( const ArchiveName: string ); begin inherited Create; FArchiveName := ArchiveName; end; {------------------------------------------------------------------------------} function TAbSpanBaseStream.GetImageName( ImageNumber: Integer ): string; var Abort : Boolean; Ext : string; begin {generate default name} Ext := ExtractFileExt(FArchiveName); if (Length(Ext) < 2) then Ext := '.' + Format('%.2d', [ImageNumber]) else Ext := Ext[1] + Ext[2] + Format('%.2d', [ImageNumber]); Result := ChangeFileExt(FArchiveName, Ext); {call event} if Assigned(FOnRequestImage) then begin Abort := False; FOnRequestImage(Self, ImageNumber, Result, Abort); if Abort then raise EAbUserAbort.Create; end; end; {============================================================================} { TAbSpanReadStream implementation ========================================= } constructor TAbSpanReadStream.Create( const ArchiveName: string; CurrentImage: LongWord; Stream: TStream ); begin inherited Create(ArchiveName); FCurrentImage := CurrentImage; FIsSplit := mbFileExists(GetImageName(1)) or not AbDriveIsRemovable(ArchiveName); FLastImage := CurrentImage; FStream := Stream; end; {------------------------------------------------------------------------------} destructor TAbSpanReadStream.Destroy; begin FreeAndNil(FStream); inherited; end; {------------------------------------------------------------------------------} procedure TAbSpanReadStream.GotoImage( ImageNumber: Integer ); var Abort: Boolean; ImageName: string; begin { switch to the requested image. ImageNumber is passed in as 0-based to match the zip spec, but all of the callbacks receive 1-based values. } FreeAndNil(FStream); FCurrentImage := ImageNumber; Inc(ImageNumber); ImageName := FArchiveName; if FIsSplit then begin { the last image uses the original filename } if FCurrentImage <> FLastImage then ImageName := GetImageName(ImageNumber) end else if Assigned(FOnRequestNthDisk) then begin Abort := False; repeat FOnRequestNthDisk(Self, ImageNumber, Abort); if Abort then raise EAbUserAbort.Create; until AbGetDriveFreeSpace(ImageName) <> -1; end else raise EAbUserAbort.Create; FStream := TFileStreamEx.Create(ImageName, fmOpenRead or fmShareDenyWrite); end; {------------------------------------------------------------------------------} function TAbSpanReadStream.Read(var Buffer; Count: Longint): Longint; var BytesRead, BytesLeft: LongInt; PBuf: PByte; begin { read until the buffer's full, switching images if necessary } Result := 0; if FStream = nil then Exit; PBuf := @Buffer; BytesLeft := Count; while Result < Count do begin BytesRead := FStream.Read(PBuf^, BytesLeft); Inc(Result, BytesRead); Inc(PBuf, BytesRead); Dec(BytesLeft, BytesRead); if BytesRead < BytesLeft then begin if FCurrentImage <> FLastImage then GotoImage(FCurrentImage + 1) else Break; end; end; end; {------------------------------------------------------------------------------} function TAbSpanReadStream.Write(const Buffer; Count: Longint): Longint; begin raise EAbException.Create('TAbSpanReadStream.Write unsupported'); end; {------------------------------------------------------------------------------} function TAbSpanReadStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; begin if FStream = nil then Result := 0 else if (Offset = 0) and (Origin = soCurrent) then Result := FStream.Position else raise EAbException.Create('TAbSpanReadStream.Seek unsupported'); end; {------------------------------------------------------------------------------} procedure TAbSpanReadStream.SeekImage( Image: LongWord; const Offset: Int64); begin if FStream = nil then Exit; if FCurrentImage <> Image then GotoImage(Image); FStream.Position := Offset; end; {------------------------------------------------------------------------------} procedure TAbSpanReadStream.SetOnRequestImage(Value: TAbRequestImageEvent); begin FOnRequestImage := Value; FIsSplit := mbFileExists(GetImageName(1)) or not AbDriveIsRemovable(FArchiveName); end; {============================================================================} { TAbSpanWriteStream implementation ======================================== } constructor TAbSpanWriteStream.Create( const ArchiveName: string; Stream: TStream; Threshold: Int64 ); begin inherited Create(ArchiveName); FCurrentImage := 0; FStream := Stream; FThreshold := Threshold; end; {------------------------------------------------------------------------------} destructor TAbSpanWriteStream.Destroy; begin FStream.Free; inherited; end; {------------------------------------------------------------------------------} procedure TAbSpanWriteStream.NewImage; var Abort: Boolean; begin { start a new span or blank disk. FCurrentImage is 0-based to match the zip spec, but all of the callbacks receive 1-based values. } FreeAndNil(FStream); Inc(FCurrentImage); if FThreshold > 0 then mbRenameFile(FArchiveName, GetImageName(FCurrentImage)) else begin if Assigned(FOnRequestBlankDisk) then begin Abort := False; repeat FOnRequestBlankDisk(Self, Abort); if Abort then raise EAbUserAbort.Create; until AbGetDriveFreeSpace(FArchiveName) <> -1; end else raise EAbUserAbort.Create; AbSetSpanVolumeLabel(AbDrive(FArchiveName), FCurrentImage); end; FStream := TFileStreamEx.Create(FArchiveName, fmCreate or fmShareDenyWrite); FImageSize := 0; end; {------------------------------------------------------------------------------} function TAbSpanWriteStream.Read(var Buffer; Count: Longint): Longint; begin raise EAbException.Create('TAbSpanWriteStream.Read unsupported'); end; {------------------------------------------------------------------------------} function TAbSpanWriteStream.Write(const Buffer; Count: Longint): Longint; var BytesWritten, BytesLeft: LongInt; PBuf: PByte; begin { write until the buffer is done, starting new spans if necessary } Result := 0; if FStream = nil then Exit; PBuf := @Buffer; BytesLeft := Count; while Result < Count do begin if FThreshold > 0 then BytesWritten := FStream.Write(PBuf^, Min(BytesLeft, FThreshold - FImageSize)) else BytesWritten := FStream.Write(PBuf^, BytesLeft); Inc(FImageSize, BytesWritten); Inc(Result, BytesWritten); Inc(PBuf, BytesWritten); Dec(BytesLeft, BytesWritten); if BytesWritten < BytesLeft then NewImage; end; end; {------------------------------------------------------------------------------} function TAbSpanWriteStream.WriteUnspanned(const Buffer; Count: Longint; FailOnSpan: Boolean = False): Boolean; var BytesWritten: LongInt; begin { write as a contiguous block, starting a new span if there isn't room. FailOnSpan (and result = false) can be used to update data before it's written again } if FStream = nil then raise EWriteError.Create(SWriteError); if (FThreshold > 0) and (FThreshold - FImageSize < Count) then BytesWritten := 0 else BytesWritten := FStream.Write(Buffer, Count); if BytesWritten < Count then begin if BytesWritten > 0 then FStream.Size := FStream.Size - BytesWritten; NewImage; if FailOnSpan then BytesWritten := 0 else begin BytesWritten := Count; FStream.WriteBuffer(Buffer, Count); end; end; Inc(FImageSize, BytesWritten); Result := (BytesWritten = Count); end; {------------------------------------------------------------------------------} function TAbSpanWriteStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; begin if FStream = nil then Result := 0 else if (Offset = 0) and (Origin = soCurrent) then Result := FStream.Position else raise EAbException.Create('TAbSpanWriteStream.Seek unsupported'); end; {------------------------------------------------------------------------------} function TAbSpanWriteStream.ReleaseStream: TStream; begin Result := FStream; FStream := nil; end; {------------------------------------------------------------------------------} end. ���������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abresstring.pas�������������������������������������������0000644�0001750�0001750�00000023301�12014201074�022557� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Roman Kassebaum * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* Abbrevia: AbResString.pas *} {*********************************************************} {* Abbrevia: Resource strings *} {*********************************************************} unit AbResString; {$I AbDefine.inc} interface resourcestring AbErrZipInvalidS = 'Invalid file - not a PKZip file'; AbZipVersionNeededS = 'Cannot extract file - newer version required'; AbUnknownCompressionMethodS = 'Cannot extract file - unsupported compression method'; AbNoExtractionMethodS = 'Cannot extract file - no extraction support provided'; AbInvalidPasswordS = 'Cannot extract file - invalid password'; AbNoInsertionMethodS = 'Cannot insert file - no insertion support provided'; AbInvalidFactorS = 'Invalid Reduce Factor'; AbDuplicateNameS = 'Cannot insert file - duplicates stored name'; AbUnsupportedCompressionMethodS = 'Cannot insert file - unsupported compression method'; AbUserAbortS = 'Process aborted by user'; AbArchiveBusyS = 'Archive is busy - cannot process new requests'; AbLastDiskRequestS = 'Insert the last disk in the spanned disk set'; AbDiskRequestS = 'Insert floppy'; AbImageRequestS = 'Image file name'; AbBadSpanStreamS = 'Spanned archives must be opened as file streams'; AbDiskNumRequestS = 'Insert disk number %d of the spanned disk set'; AbImageNumRequestS = 'Insert span number %d of the spanned file set'; AbNoOverwriteSpanStreamS = 'Cannot update an existing spanned disk set'; AbNoSpannedSelfExtractS = 'Cannot make a self-extracting spanned disk set'; AbBlankDiskS = 'Insert a blank floppy disk'; AbStreamFullS = 'Stream write error'; AbNoSuchDirectoryS = 'Directory does not exist'; AbInflateBlockErrorS = 'Cannot inflate block'; AbBadStreamTypeS = 'Invalid Stream'; AbTruncateErrorS = 'Error truncating Zip File'; AbZipBadCRCS = 'Failed CRC Check'; AbZipBadStubS = 'Stub must be an executable'; AbFileNotFoundS = 'File not found'; AbInvalidLFHS = 'Invalid Local File Header entry'; AbNoArchiveS = 'Archive does not exist - Filename is blank'; AbReadErrorS = 'Error reading archive'; AbInvalidIndexS = 'Invalid archive item index'; AbInvalidThresholdS = 'Invalid archive size threshold'; AbUnhandledFileTypeS = 'Unhandled Archive Type'; AbSpanningNotSupportedS = 'Spanning not supported by this Archive type'; AbLogCreateErrorS = 'Error creating Log File'; AbMoveFileErrorS = 'Error Moving File %s to %s'; AbFileSizeTooBigS = 'File size is too big for archive type'; AbNoCabinetDllErrorS = 'Cannot load cabinet.dll'; AbFCIFileOpenErrorS = 'FCI cannot open file'; AbFCIFileReadErrorS = 'FCI cannot read file'; AbFCIFileWriteErrorS = 'FCI cannot write file'; AbFCIFileCloseErrorS = 'FCI close file error'; AbFCIFileSeekErrorS = 'FCI file seek error'; AbFCIFileDeleteErrorS = 'FCI file delete error'; AbFCIAddFileErrorS = 'FCI cannot add file'; AbFCICreateErrorS = 'FCI cannot create context'; AbFCIFlushCabinetErrorS = 'FCI cannot flush cabinet'; AbFCIFlushFolderErrorS = 'FCI cannot flush folder'; AbFDICopyErrorS = 'FDI cannot enumerate files'; AbFDICreateErrorS = 'FDI cannot create context'; AbInvalidCabTemplateS = 'Invalid cab file template'; AbInvalidCabFileS = 'Invalid file - not a cabinet file'; AbZipStored = 'Stored'; AbZipShrunk = 'Shrunk'; AbZipReduced = 'Reduced'; AbZipImploded = 'Imploded'; AbZipTokenized = 'Tokenized'; AbZipDeflated = 'Deflated'; AbZipDeflate64 = 'Enhanced Deflation'; AbZipDCLImploded = 'DCL Imploded'; AbZipBzip2 = 'Bzip2'; AbZipLZMA = 'LZMA'; AbZipIBMTerse = 'IBM Terse'; AbZipLZ77 = 'IBM LZ77'; AbZipJPEG = 'JPEG'; AbZipWavPack = 'WavPack'; AbZipPPMd = 'PPMd'; AbZipUnknown = 'Unknown (%d)'; AbZipBestMethod = 'Best Method'; AbVersionFormatS = 'Version %s'; AbCompressedSizeFormatS = 'Compressed Size: %d'; AbUncompressedSizeFormatS = 'Uncompressed Size: %d'; AbCompressionMethodFormatS = 'Compression Method: %s'; AbCompressionRatioFormatS = 'Compression Ratio: %2.0f%%'; AbCRCFormatS = 'CRC: %x'; AbReadOnlyS = 'r'; AbHiddenS = 'h'; AbSystemS = 's'; AbArchivedS = 'a'; AbEFAFormatS = 'External File Attributes: %s'; AbIFAFormatS = 'File Type: %s'; AbTextS = 'Text'; AbBinaryS = 'Binary'; AbEncryptionFormatS = 'Encryption: %s'; AbEncryptedS = 'Encrypted'; AbNotEncryptedS = 'Not Encrypted'; AbUnknownS = 'Unknown'; AbTimeStampFormatS = 'Time Stamp: %s'; AbMadeByFormatS = 'Made by Version: %f'; AbNeededFormatS = 'Version Needed to Extract: %f'; AbCommentFormatS = 'Comment: %s'; AbDefaultExtS = '*.zip'; AbFilterS = 'PKZip Archives (*.zip)|*.zip|Self Extracting Archives (*.exe)|*.exe|All Files (*.*)|*.*'; AbFileNameTitleS = 'Select File Name'; AbOKS = 'OK'; AbCancelS = 'Cancel'; AbSelectDirectoryS = 'Select Directory'; AbEnterPasswordS = 'Enter Password'; AbPasswordS = '&Password'; AbVerifyS = '&Verify'; AbCabExtS = '*.cab'; AbCabFilterS = 'Cabinet Archives (*.cab)|*.CAB|All Files (*.*)|*.*'; AbLogExtS = '*.txt'; AbLogFilterS = 'Text Files (*.txt)|*.TXT|All Files (*.*)|*.*'; AbExeExtS = '*.exe'; AbExeFilterS = 'Self-Extracting Zip Files (*.exe)|*.EXE|All Files (*.*)|*.*'; AbVMSReadTooManyBytesS = 'VMS: request to read too many bytes [%d]'; AbVMSInvalidOriginS = 'VMS: invalid origin %d, should be 0, 1, 2'; AbVMSErrorOpenSwapS = 'VMS: Cannot open swap file %s'; AbVMSSeekFailS = 'VMS: Failed to seek in swap file %s'; AbVMSReadFailS = 'VMS: Failed to read %d bytes from swap file %s'; AbVMSWriteFailS = 'VMS: Failed to write %d bytes to swap file %s'; AbVMSWriteTooManyBytesS = 'VMS: request to write too many bytes [%d]'; AbBBSReadTooManyBytesS = 'BBS: request to read too many bytes [%d]'; AbBBSSeekOutsideBufferS = 'BBS: New position is outside the buffer'; AbBBSInvalidOriginS = 'BBS: Invalid Origin value'; AbBBSWriteTooManyBytesS = 'BBS: request to write too many bytes [%d]'; AbSWSNotEndofStreamS = 'TabSlidingWindowStream.Write: Not at end of stream'; AbSWSSeekFailedS = 'TabSlidingWindowStream.bsWriteChunk: seek failed'; AbSWSWriteFailedS = 'TabSlidingWindowStream.bsWriteChunk: write failed'; AbSWSInvalidOriginS = 'TabSlidingWindowStream.Seek: invalid origin'; AbSWSInvalidNewOriginS = 'TabSlidingWindowStream.Seek: invalid new position'; AbItemNameHeadingS = 'Name'; AbPackedHeadingS = 'Packed'; AbMethodHeadingS = 'Method'; AbRatioHeadingS = 'Ratio (%)'; AbCRCHeadingS = 'CRC32'; AbFileAttrHeadingS = 'Attributes'; AbFileFormatHeadingS = 'Format'; AbEncryptionHeadingS = 'Encrypted'; AbTimeStampHeadingS = 'Time Stamp'; AbFileSizeHeadingS = 'Size'; AbVersionMadeHeadingS = 'Version Made'; AbVersionNeededHeadingS = 'Version Needed'; AbPathHeadingS = 'Path'; AbPartialHeadingS = 'Partial'; AbExecutableHeadingS = 'Executable'; AbFileTypeHeadingS = 'Type'; AbLastModifiedHeadingS = 'Modified'; AbCabMethod0S = 'None'; AbCabMethod1S = 'MSZip'; AbLtAddS = ' added '; AbLtDeleteS = ' deleted '; AbLtExtractS = ' extracted '; AbLtFreshenS = ' freshened '; AbLtMoveS = ' moved '; AbLtReplaceS = ' replaced '; AbLtStartS = ' logging '; AbGzipInvalidS = 'Invalid Gzip'; AbGzipBadCRCS = 'Bad CRC'; AbGzipBadFileSizeS = 'Bad File Size'; AbTarInvalidS = 'Invalid Tar'; AbTarBadFileNameS = 'File name too long'; AbTarBadLinkNameS = 'Symbolic link path too long'; AbTarBadOpS = 'Unsupported Operation'; AbUnhandledEntityS = 'Unhandled Entity'; { pre-defined "operating system" (really more FILE system) identifiers for the Gzip header } AbGzOsFat = 'FAT File System (MS-DOS, OS/2, NT/Win32)'; AbGzOsAmiga = 'Amiga'; AbGzOsVMS = 'VMS (or OpenVMS)'; AbGzOsUnix = 'Unix'; AbGzOsVM_CMS = 'VM/CMS'; AbGzOsAtari = 'Atari TOS'; AbGzOsHPFS = 'HPFS File System (OS/2, NT)'; AbGzOsMacintosh = 'Macintosh'; AbGzOsZ_System = 'Z-System'; AbGzOsCP_M = 'CP/M'; AbGzOsTOPS_20 = 'TOPS-20'; AbGzOsNTFS = 'NTFS File System (NT)'; AbGzOsQDOS = 'QDOS'; AbGzOsAcornRISCOS = 'Acorn RISCOS'; AbGzOsVFAT = 'VFAT File System (Win95, NT)'; AbGzOsMVS = 'MVS'; AbGzOsBeOS = 'BeOS (BeBox or PowerMac)'; AbGzOsTandem = 'Tandem/NSK'; AbGzOsTHEOS = 'THEOS'; AbGzOsunknown = 'unknown'; AbGzOsUndefined = 'ID undefined by gzip'; { Compound File specific error messages } resourcestring AbCmpndIndexOutOfBounds = 'Index out of bounds'; AbCmpndBusyUpdating = 'Compound file is busy updating'; AbCmpndInvalidFile = 'Invalid compound file'; AbCmpndFileNotFound = 'File/Directory not found'; AbCmpndFolderNotEmpty = 'Folder not empty'; AbCmpndExceedsMaxFileSize = 'File size exceeds maximum allowable'; implementation end. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abdfoutw.pas����������������������������������������������0000644�0001750�0001750�00000026405�12014201074�022057� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbDfOutW.pas *} {*********************************************************} {* Deflate output sliding window *} {*********************************************************} unit AbDfOutW; {$I AbDefine.inc} interface uses Classes, AbDfBase; {Notes: TAbDfOutputWindow implements a sliding window on previously written data for the LZ77 dictionary decoding. AddLiteral will add a literal character at the current position and advance by one. AddLenDist will copy the required number of characters from the given position to the current position, and advance the stream on by the length. The class will periodically update the stream from the internal buffer. For normal Deflate, the internal buffer is 48K + 512 bytes in size. Once there is 48Kb worth of data, 16KB is written to file, and the buffer is shifted left by 16KB. We need to keep the last decoded 32KB in memory at all times. For Deflate64, the internal buffer is 96K + 512 bytes in size. Once there is 96Kb worth of data, 32KB is written to file, and the buffer is shifted left by 32KB. We need to keep the last decoded 64KB in memory at all times. } type TAbDfOutputWindow = class private FBuffer : PAnsiChar; FChecksum : longint; FCurrent : PAnsiChar; FLog : TAbLogger; FPartSize : longint; FSlideCount : integer; FStream : TStream; FStreamPos : longint; FTestOnly : boolean; FUseCRC32 : boolean; FWritePoint : PAnsiChar; protected function swGetChecksum : longint; procedure swWriteToStream(aFlush : boolean); public constructor Create(aStream : TStream; aUseDeflate64 : boolean; aUseCRC32 : boolean; aPartSize : longint; aTestOnly : boolean; aLog : TAbLogger); destructor Destroy; override; procedure AddBuffer(var aBuffer; aCount : integer); procedure AddLiteral(aCh : AnsiChar); procedure AddLenDist(aLen : integer; aDist : integer); function Position : longint; property Checksum : longint read swGetChecksum; property Log : TAbLogger read FLog; end; implementation uses SysUtils; {Notes: Meaning of the internal pointers: |==============================+------------------------+----| | | | FBuffer FCurrent FWritePoint Once FCurrent reaches or exceeds FWritePoint, FSlideCount bytes of data from FBuffer are written to the stream and the remaining data is moved back FSlideCount bytes, moving FCurrent along with it as well. } {===TAbDfOutputWindow==================================================} constructor TAbDfOutputWindow.Create(aStream : TStream; aUseDeflate64 : boolean; aUseCRC32 : boolean; aPartSize : longint; aTestOnly : boolean; aLog : TAbLogger); var Size : integer; LookAheadSize : integer; begin {allow the ancestor to initialize} inherited Create; {save parameters} FLog := aLog; FStream := aStream; FTestOnly := aTestOnly; if (aPartSize <= 0) then FPartSize := 0 else FPartSize := aPartSize; FUseCRC32 := aUseCRC32; if aUseCRC32 then FChecksum := -1 { CRC32 starts off with all bits set} else FCheckSum := 1; { Adler32 starts off with a value of 1} {set capacity of sliding window} if aUseDeflate64 then begin Size := 96 * 1024; FSlideCount := 32 * 1024; LookAheadSize := 64 * 1024; end else begin Size := 64 * 1024; FSlideCount := 32 * 1024; LookAheadSize := 258; end; GetMem(FBuffer, Size + LookAheadSize); {set the other internal pointers} FCurrent := FBuffer; FWritePoint := FBuffer + Size; if (FPartSize > Size) then FPartSize := Size; end; {--------} destructor TAbDfOutputWindow.Destroy; begin {write remaining data and free the buffer} if (FBuffer <> nil) then begin if (FCurrent <> FBuffer) then swWriteToStream(true); FreeMem(FBuffer); end; {destroy the ancestor} inherited Destroy; end; {--------} procedure TAbDfOutputWindow.AddBuffer(var aBuffer; aCount : integer); var Buffer : PAnsiChar; BytesToWrite : integer; begin {if we've advanced to the point when we need to write, do so} if (FCurrent >= FWritePoint) then swWriteToStream(false); {cast the user buffer to a PChar, it's easier to use} Buffer := @aBuffer; {calculate the number of bytes to copy} BytesToWrite := FWritePoint - FCurrent; if (BytesToWrite > aCount) then BytesToWrite := aCount; {move this block of bytes} Move(Buffer^, FCurrent^, BytesToWrite); {advance pointers and counters} inc(FCurrent, BytesToWrite); dec(aCount, BytesToWrite); {while there is still data to copy...} while (aCount > 0) do begin {advance the user buffer pointer} inc(Buffer, BytesToWrite); {write the sliding window chunk to the stream} swWriteToStream(false); {calculate the number of bytes to copy} BytesToWrite := FWritePoint - FCurrent; if (BytesToWrite > aCount) then BytesToWrite := aCount; {move this block of bytes} Move(Buffer^, FCurrent^, BytesToWrite); {advance pointers and counters} inc(FCurrent, BytesToWrite); dec(aCount, BytesToWrite); end; end; {--------} procedure AddLenDistToLog(aLog : TAbLogger; aPosn : longint; aLen : integer; aDist : integer; aOverLap : boolean); begin {NOTE the reason for this separate routine is to avoid string allocations and try..finally blocks in the main method: an optimization issue} if aOverLap then aLog.WriteLine(Format('%8x Len: %-3d, Dist: %-5d **overlap**', [aPosn, aLen, aDist])) else aLog.WriteLine(Format('%8x Len: %-3d, Dist: %-5d', [aPosn, aLen, aDist])); end; {--------} procedure TAbDfOutputWindow.AddLenDist(aLen : integer; aDist : integer); var i : integer; ToChar : PAnsiChar; FromChar : PAnsiChar; begin {log it} {$IFDEF UseLogging} if (FLog <> nil) then AddLenDistToLog(FLog, Position, aLen, aDist, (aLen > aDist)); {$ENDIF} {if the length to copy is less than the distance, just do a move} if (aLen <= aDist) then begin Move((FCurrent - aDist)^ , FCurrent^, aLen); end {otherwise we have to use a byte-by-byte copy} else begin FromChar := FCurrent - aDist; ToChar := FCurrent; for i := 1 to aLen do begin ToChar^ := FromChar^; inc(FromChar); inc(ToChar); end; end; {increment the current pointer} inc(FCurrent, aLen); {if we've reached the point requested, abort} if (FPartSize > 0) and ((FCurrent - FBuffer) >= FPartSize) then raise EAbPartSizedInflate.Create(''); {NOTE: This exception is expected during detection of .GZ and .TGZ files. (VerifyGZip)} {if we've advanced to the point when we need to write, do so} if (FCurrent >= FWritePoint) then swWriteToStream(false); end; {--------} procedure AddLiteralToLog(aLog : TAbLogger; aPosn : longint; aCh : AnsiChar); begin {NOTE the reason for this separate routine is to avoid string allocations and try..finally blocks in the main method: an optimization issue} if (' ' < aCh) and (aCh <= '~') then aLog.WriteLine(Format('%8x Char: %3d $%2x [%s]', [aPosn, ord(aCh), ord(aCh), aCh])) else aLog.WriteLine(Format('%8x Char: %3d $%2x', [aPosn, ord(aCh), ord(aCh)])); end; {--------} procedure TAbDfOutputWindow.AddLiteral(aCh : AnsiChar); begin {log it} {$IFDEF UseLogging} if (FLog <> nil) then AddLiteralToLog(FLog, Position, aCh); {$ENDIF} {add the literal to the buffer} FCurrent^ := aCh; {increment the current pointer} inc(FCurrent); {if we've reached the point requested, abort} if (FPartSize > 0) and ((FCurrent - FBuffer) >= FPartSize) then raise EAbPartSizedInflate.Create(''); {if we've advanced to the point when we need to write, do so} if (FCurrent >= FWritePoint) then swWriteToStream(false); end; {--------} function TAbDfOutputWindow.Position : longint; begin if FTestOnly then Result := FStreamPos + (FCurrent - FBuffer) else Result := FStream.Position + (FCurrent - FBuffer); end; {--------} function TAbDfOutputWindow.swGetChecksum : longint; begin {since the checksum is calculated by the method that flushes to the stream, make sure any buffered data is written out first} if (FCurrent <> FBuffer) then swWriteToStream(true); {the CRC32 checksum algorithm requires a post-conditioning step after being calculated (the result is NOTted), whereas Adler32 does not} if FUseCRC32 then Result := not FChecksum else Result := FChecksum; end; {--------} procedure TAbDfOutputWindow.swWriteToStream(aFlush : boolean); var FromPtr : PAnsiChar; begin {if the request was to flush, write all remaining data after updating the checksum} if aFlush then begin if FUseCRC32 then AbUpdateCRCBuffer(FChecksum, FBuffer^, FCurrent - FBuffer) else AbUpdateAdlerBuffer(FChecksum, FBuffer^, FCurrent - FBuffer); if FTestOnly then inc(FStreamPos, FCurrent - FBuffer) else FStream.WriteBuffer(FBuffer^, FCurrent - FBuffer); FCurrent := FBuffer; end {otherwise, update the checksum with the data in the sliding window chunk, write it out to the stream, and move the rest of the buffer back} else begin if FUseCRC32 then AbUpdateCRCBuffer(FChecksum, FBuffer^, FSlideCount) else AbUpdateAdlerBuffer(FChecksum, FBuffer^, FSlideCount); if FTestOnly then inc(FStreamPos, FSlideCount) else FStream.WriteBuffer(FBuffer^, FSlideCount); FromPtr := FBuffer + FSlideCount; Move(FromPtr^, FBuffer^, FCurrent - FromPtr); FCurrent := FCurrent - FSlideCount; end; end; {====================================================================} end. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abbrowse.pas����������������������������������������������0000644�0001750�0001750�00000050203�12132234523�022047� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbBrowse.pas *} {*********************************************************} {* ABBREVIA: Base Browser Component *} {*********************************************************} unit AbBrowse; {$I AbDefine.inc} interface uses Classes, AbBase, AbUtils, AbArcTyp; type IAbProgressMeter = interface ['{4B766704-FD20-40BF-BA40-2EC2DD77B178}'] procedure DoProgress(Progress : Byte); procedure Reset; end; TAbBaseBrowser = class(TAbBaseComponent) public FArchive : TAbArchive; protected {private} FSpanningThreshold : Longint; FItemProgressMeter : IAbProgressMeter; FArchiveProgressMeter : IAbProgressMeter; FBaseDirectory : string; FFileName : string; FLogFile : string; FLogging : Boolean; FOnArchiveProgress : TAbArchiveProgressEvent; FOnArchiveItemProgress : TAbArchiveItemProgressEvent; FOnChange : TNotifyEvent; FOnConfirmProcessItem : TAbArchiveItemConfirmEvent; FOnLoad : TAbArchiveEvent; FOnProcessItemFailure : TAbArchiveItemFailureEvent; FOnRequestImage : TAbRequestImageEvent; FTempDirectory : string; { detected compression type } FArchiveType : TAbArchiveType; FForceType : Boolean; protected {private methods} function GetCount : Integer; function GetItem(Value : Longint) : TAbArchiveItem; function GetSpanned : Boolean; function GetStatus : TAbArchiveStatus; procedure ResetMeters; virtual; procedure SetArchiveProgressMeter(const Value: IAbProgressMeter); procedure SetCompressionType(const Value: TAbArchiveType); procedure SetBaseDirectory(const Value : string); procedure SetItemProgressMeter(const Value: IAbProgressMeter); procedure SetSpanningThreshold(Value : Longint); procedure SetLogFile(const Value : string); procedure SetLogging(Value : Boolean); procedure SetTempDirectory(const Value : string); procedure Loaded; override; procedure Notification(Component: TComponent; Operation: TOperation); override; protected {virtual methods} procedure DoArchiveItemProgress(Sender : TObject; Item : TAbArchiveItem; Progress : Byte; var Abort : Boolean); virtual; procedure DoArchiveProgress(Sender : TObject; Progress : Byte; var Abort : Boolean); virtual; procedure DoChange; virtual; procedure DoConfirmProcessItem(Sender : TObject; Item : TAbArchiveItem; ProcessType : TAbProcessType; var Confirm : Boolean); virtual; procedure DoLoad(Sender : TObject); virtual; procedure DoProcessItemFailure(Sender : TObject; Item : TAbArchiveItem; ProcessType : TAbProcessType; ErrorClass : TAbErrorClass; ErrorCode : Integer); virtual; procedure SetOnRequestImage(Value : TAbRequestImageEvent); virtual; procedure InitArchive; virtual; {This method must be defined in descendent classes} procedure SetFileName(const aFileName : string); virtual; abstract; protected {properties} property Archive : TAbArchive read FArchive; property ArchiveProgressMeter : IAbProgressMeter read FArchiveProgressMeter write SetArchiveProgressMeter; property BaseDirectory : string read FBaseDirectory write SetBaseDirectory; property FileName : string read FFileName write SetFileName; property SpanningThreshold : Longint read FSpanningThreshold write SetSpanningThreshold default 0; property ItemProgressMeter : IAbProgressMeter read FItemProgressMeter write SetItemProgressMeter; property LogFile : string read FLogFile write SetLogFile; property Logging : Boolean read FLogging write SetLogging default False; property Spanned : Boolean read GetSpanned; property TempDirectory : string read FTempDirectory write SetTempDirectory; protected {events} property OnArchiveProgress : TAbArchiveProgressEvent read FOnArchiveProgress write FOnArchiveProgress; property OnArchiveItemProgress : TAbArchiveItemProgressEvent read FOnArchiveItemProgress write FOnArchiveItemProgress; property OnConfirmProcessItem : TAbArchiveItemConfirmEvent read FOnConfirmProcessItem write FOnConfirmProcessItem; property OnProcessItemFailure : TAbArchiveItemFailureEvent read FOnProcessItemFailure write FOnProcessItemFailure; property OnRequestImage : TAbRequestImageEvent read FOnRequestImage write SetOnRequestImage; public {methods} constructor Create(AOwner : TComponent); override; destructor Destroy; override; procedure ClearTags; {Clear all tags from the archive} function FindItem(aItem : TAbArchiveItem) : Integer; function FindFile(const aFileName : string) : Integer; procedure TagItems(const FileMask : string); {tag all items that match the mask} procedure UnTagItems(const FileMask : string); {clear tags for all items that match the mask} procedure CloseArchive; {closes the archive by setting FileName to ''} procedure OpenArchive(const aFileName : string); {opens the archive} public {properties} property Count : Integer read GetCount; property Items[Index : Integer] : TAbArchiveItem read GetItem; default; property Status : TAbArchiveStatus read GetStatus; property ArchiveType : TAbArchiveType read FArchiveType write SetCompressionType default atUnknown; property ForceType : Boolean read FForceType write FForceType default False; public {events} property OnChange : TNotifyEvent read FOnChange write FOnChange; property OnLoad : TAbArchiveEvent read FOnLoad write FOnLoad; end; function AbDetermineArcType(const FN : string; AssertType : TAbArchiveType) : TAbArchiveType; overload; function AbDetermineArcType(aStream: TStream) : TAbArchiveType; overload; implementation uses SysUtils, AbExcept, {$IF DEFINED(ExtractCabSupport)} AbCabTyp, {$ENDIF} AbZipTyp, AbTarTyp, AbGzTyp, AbBzip2Typ, DCOSUtils, DCClassesUtf8; { TAbBaseBrowser implementation ======================================= } { -------------------------------------------------------------------------- } constructor TAbBaseBrowser.Create(AOwner : TComponent); begin inherited Create(AOwner); FLogFile := ''; FLogging := False; FSpanningThreshold := 0; FArchiveType := atUnknown; FForceType := False; end; { -------------------------------------------------------------------------- } destructor TAbBaseBrowser.Destroy; begin FArchive.Free; FArchive := nil; inherited Destroy; end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.ClearTags; {Clear all tags from the archive} begin if Assigned(FArchive) then FArchive.ClearTags else raise EAbNoArchive.Create; end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.CloseArchive; {closes the archive by setting FileName to ''} begin if FFileName <> '' then FileName := ''; end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.DoArchiveItemProgress(Sender : TObject; Item : TAbArchiveItem; Progress : Byte; var Abort : Boolean); begin Abort := False; if Assigned(FItemProgressMeter) then FItemProgressMeter.DoProgress(Progress); if Assigned(FOnArchiveItemProgress) then FOnArchiveItemProgress(Self, Item, Progress, Abort); end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.DoArchiveProgress(Sender : TObject; Progress : Byte; var Abort : Boolean); begin Abort := False; if Assigned(FArchiveProgressMeter) then FArchiveProgressMeter.DoProgress(Progress); if Assigned(FOnArchiveProgress) then FOnArchiveProgress(Self, Progress, Abort); end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.DoChange; begin if Assigned(FOnChange) then begin FOnChange(Self); end; end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.DoConfirmProcessItem(Sender : TObject; Item : TAbArchiveItem; ProcessType : TAbProcessType; var Confirm : Boolean); begin Confirm := True; if Assigned(FItemProgressMeter) then FItemProgressMeter.Reset; if Assigned(FOnConfirmProcessItem) then FOnConfirmProcessItem(Self, Item, ProcessType, Confirm); end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.DoLoad(Sender : TObject); begin if Assigned(FOnLoad) then FOnLoad(Self); end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.DoProcessItemFailure(Sender : TObject; Item : TAbArchiveItem; ProcessType : TAbProcessType; ErrorClass : TAbErrorClass; ErrorCode : Integer); begin if Assigned(FOnProcessItemFailure) then FOnProcessItemFailure(Self, Item, ProcessType, ErrorClass, ErrorCode); end; { -------------------------------------------------------------------------- } function TAbBaseBrowser.FindItem(aItem : TAbArchiveItem) : Integer; begin if Assigned(FArchive) then Result := FArchive.FindItem(aItem) else Result := -1; end; { -------------------------------------------------------------------------- } function TAbBaseBrowser.FindFile(const aFileName : string) : Integer; begin if Assigned(FArchive) then Result := FArchive.FindFile(aFileName) else Result := -1; end; { -------------------------------------------------------------------------- } function TAbBaseBrowser.GetSpanned : Boolean; begin if Assigned(FArchive) then Result := FArchive.Spanned else Result := False; end; { -------------------------------------------------------------------------- } function TAbBaseBrowser.GetStatus : TAbArchiveStatus; begin if Assigned(FArchive) then Result := FArchive.Status else Result := asInvalid; end; { -------------------------------------------------------------------------- } function TAbBaseBrowser.GetCount : Integer; begin if Assigned(FArchive) then Result := FArchive.Count else Result := 0; end; { -------------------------------------------------------------------------- } function TAbBaseBrowser.GetItem(Value : Longint) : TAbArchiveItem; begin if Assigned(FArchive) then Result := FArchive.ItemList[Value] else raise EAbNoArchive.Create; end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.InitArchive; begin ResetMeters; if Assigned(FArchive) then begin {properties} FArchive.SpanningThreshold := FSpanningThreshold; FArchive.LogFile := FLogFile; FArchive.Logging := FLogging; FArchive.TempDirectory := FTempDirectory; SetBaseDirectory(FBaseDirectory); {events} FArchive.OnArchiveProgress := DoArchiveProgress; FArchive.OnArchiveItemProgress := DoArchiveItemProgress; FArchive.OnConfirmProcessItem := DoConfirmProcessItem; FArchive.OnLoad := DoLoad; FArchive.OnProcessItemFailure := DoProcessItemFailure; FArchive.OnRequestImage := FOnRequestImage; end; end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.Loaded; begin inherited Loaded; DoChange; end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.Notification(Component: TComponent; Operation: TOperation); begin inherited Notification(Component, Operation); if (Operation = opRemove) then begin if Assigned(ItemProgressMeter) and Component.IsImplementorOf(ItemProgressMeter) then ItemProgressMeter := nil; if Assigned(ArchiveProgressMeter) and Component.IsImplementorOf(ArchiveProgressMeter) then ArchiveProgressMeter := nil; end; end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.OpenArchive(const aFileName : string); {opens the archive} begin FileName := AFileName; end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.ResetMeters; begin if Assigned(FArchiveProgressMeter) then FArchiveProgressMeter.Reset; if Assigned(FItemProgressMeter) then FItemProgressMeter.Reset; end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.SetBaseDirectory(const Value : string); begin if Assigned(FArchive) then begin FArchive.BaseDirectory := Value; FBaseDirectory := FArchive.BaseDirectory; end else FBaseDirectory := Value; end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.SetSpanningThreshold(Value : Longint); begin FSpanningThreshold := Value; if Assigned(FArchive) then FArchive.SpanningThreshold := Value; end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.SetLogFile(const Value : string); begin FLogFile := Value; if (csDesigning in ComponentState) then Exit; if Assigned(FArchive) then FArchive.LogFile := Value; SetLogging(Value <> ''); end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.SetLogging(Value : Boolean); begin FLogging := Value; if (csDesigning in ComponentState) then Exit; if Assigned(FArchive) then FArchive.Logging:= Value; end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.SetOnRequestImage(Value : TAbRequestImageEvent); begin FOnRequestImage := Value; if Assigned(FArchive) then FArchive.OnRequestImage := Value; end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.SetTempDirectory(const Value : string); begin FTempDirectory := Value; if Assigned(FArchive) then FArchive.TempDirectory := Value; end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.TagItems(const FileMask : string); {tag all items that match the mask} begin if Assigned(FArchive) then FArchive.TagItems(FileMask) else raise EAbNoArchive.Create; end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.UnTagItems(const FileMask : string); {clear tags for all items that match the mask} begin if Assigned(FArchive) then FArchive.UnTagItems(FileMask) else raise EAbNoArchive.Create; end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.SetCompressionType(const Value: TAbArchiveType); begin if not Assigned(FArchive) or (Status <> asInvalid) then FArchiveType := Value else raise EAbArchiveBusy.Create; end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.SetArchiveProgressMeter(const Value: IAbProgressMeter); begin ReferenceInterface(FArchiveProgressMeter, opRemove); FArchiveProgressMeter := Value; ReferenceInterface(FArchiveProgressMeter, opInsert); end; { -------------------------------------------------------------------------- } procedure TAbBaseBrowser.SetItemProgressMeter(const Value: IAbProgressMeter); begin ReferenceInterface(FItemProgressMeter, opRemove); FItemProgressMeter := Value; ReferenceInterface(FItemProgressMeter, opInsert); end; { -------------------------------------------------------------------------- } function AbDetermineArcType(const FN : string; AssertType : TAbArchiveType) : TAbArchiveType; var Ext : string; FS : TStream; begin Result := AssertType; if Result = atUnknown then begin { Guess archive type based on it's extension } Ext := UpperCase(ExtractFileExt(FN)); if (Ext = '.ZIP') or (Ext = '.JAR') then Result := atZip else if (Ext = '.EXE') then Result := atSelfExtZip else if (Ext = '.TAR') then Result := atTar else if (Ext = '.GZ') then Result := atGzip else if (Ext = '.TGZ') then Result := atGzippedTar else if (Ext = '.CAB') then Result := atCab else if (Ext = '.BZ2') then Result := atBzip2 else if (Ext = '.TBZ') then Result := atBzippedTar; end; {$IF NOT DEFINED(ExtractCabSupport)} if Result = atCab then Result := atUnknown; {$ENDIF} if mbFileExists(FN) and (AbFileGetSize(FN) > 0) then begin { If the file doesn't exist (or is empty) presume to make one, otherwise guess or verify the contents } try FS := TFileStreamEx.Create(FN, fmOpenRead or fmShareDenyNone); try if Result <> atUnknown then begin case Result of atZip : begin Result := VerifyZip(FS); end; atSelfExtZip : begin Result := VerifySelfExtracting(FS); end; atTar : begin Result := VerifyTar(FS); end; atGzip, atGzippedTar: begin Result := VerifyGzip(FS); end; {$IF DEFINED(ExtractCabSupport)} atCab : begin Result := VerifyCab(FS); end; {$ENDIF} atBzip2, atBzippedTar: begin Result := VerifyBzip2(FS); end; end; end; if Result = atUnknown then Result := AbDetermineArcType(FS) finally FS.Free; end; except // Skip end; end; end; { -------------------------------------------------------------------------- } function AbDetermineArcType(aStream: TStream): TAbArchiveType; begin { VerifyZip returns true for self-extracting zips too, so test those first } Result := VerifySelfExtracting(aStream); { VerifyZip returns true for example when ZIP file is stored in a TAR archive, so test it first } if Result = atUnknown then Result := VerifyTar(aStream); if Result = atUnknown then Result := VerifyZip(aStream); if Result = atUnknown then Result := VerifyGzip(aStream); if Result = atUnknown then Result := VerifyBzip2(aStream); {$IF DEFINED(ExtractCabSupport)} if Result = atUnknown then Result := VerifyCab(aStream); {$ENDIF} end; { -------------------------------------------------------------------------- } end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abzbrows.pas����������������������������������������������0000644�0001750�0001750�00000026607�12014201074�022101� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Craig Peterson <capeterson@users.sourceforge.net> * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbZBrows.pas *} {*********************************************************} {* ABBREVIA: Zip file Browser Component *} {*********************************************************} unit AbZBrows; {$I AbDefine.inc} interface uses Classes, AbArcTyp, AbBrowse, AbSpanSt, AbZipTyp; type TAbCustomZipBrowser = class(TAbBaseBrowser) private function GetTarAutoHandle: Boolean; procedure SetTarAutoHandle(const Value: Boolean); protected {private} FPassword : AnsiString; FOnRequestLastDisk : TAbRequestDiskEvent; FOnRequestNthDisk : TAbRequestNthDiskEvent; FOnRequestBlankDisk : TAbRequestDiskEvent; FTarAutoHandle : Boolean; protected {methods} function GetItem(Index : Integer) : TAbZipItem; virtual; function GetStream: TStream; function GetZipfileComment : AnsiString; procedure InitArchive; override; procedure SetFileName(const aFileName : string); override; procedure SetStream(aValue: TStream); procedure SetOnRequestLastDisk(Value : TAbRequestDiskEvent); procedure SetOnRequestNthDisk(Value : TAbRequestNthDiskEvent); procedure SetOnRequestBlankDisk(Value : TAbRequestDiskEvent); procedure SetPassword(const Value : AnsiString); procedure SetZipfileComment(const Value : AnsiString); virtual; protected {properties} property Password : AnsiString read FPassword write SetPassword; protected {events} property OnRequestLastDisk : TAbRequestDiskEvent read FOnRequestLastDisk write SetOnRequestLastDisk; property OnRequestNthDisk : TAbRequestNthDiskEvent read FOnRequestNthDisk write SetOnRequestNthDisk; property OnRequestBlankDisk : TAbRequestDiskEvent read FOnRequestBlankDisk write SetOnRequestBlankDisk; public {methods} constructor Create(AOwner : TComponent); override; destructor Destroy; override; public {properties} property Items[Index : Integer] : TAbZipItem read GetItem; default; property Stream : TStream // This can be used instead of Filename read GetStream write SetStream; property ZipArchive : {TAbZipArchive} TAbArchive read FArchive; property ZipfileComment : AnsiString read GetZipfileComment write SetZipfileComment; property TarAutoHandle : Boolean read GetTarAutoHandle write SetTarAutoHandle; end; TAbZipBrowser = class(TAbCustomZipBrowser) published property ArchiveProgressMeter; property ItemProgressMeter; property BaseDirectory; property LogFile; property Logging; property OnArchiveProgress; property OnArchiveItemProgress; property OnChange; property OnConfirmProcessItem; property OnLoad; property OnProcessItemFailure; property OnRequestLastDisk; property OnRequestNthDisk; property Version; property TarAutoHandle; property FileName; {must be after OnLoad} end; implementation uses SysUtils, AbBzip2Typ, AbExcept, AbGzTyp, AbTarTyp, AbUtils, DCOSUtils; { TAbCustomZipBrowser implementation ======================================= } { -------------------------------------------------------------------------- } constructor TAbCustomZipBrowser.Create(AOwner : TComponent); begin inherited Create(AOwner); end; { -------------------------------------------------------------------------- } destructor TAbCustomZipBrowser.Destroy; begin inherited Destroy; end; { -------------------------------------------------------------------------- } function TAbCustomZipBrowser.GetItem(Index : Integer) : TAbZipItem; begin Result := TAbZipItem(ZipArchive.ItemList[Index]); end; { -------------------------------------------------------------------------- } function TAbCustomZipBrowser.GetStream: TStream; begin if FArchive <> nil then Result := FArchive.FStream else Result := nil end; { -------------------------------------------------------------------------- } function TAbCustomZipBrowser.GetTarAutoHandle: Boolean; begin Result := False; if FArchive is TAbGzipArchive then Result := TAbGzipArchive(FArchive).TarAutoHandle else if FArchive is TAbBzip2Archive then Result := TAbBzip2Archive(FArchive).TarAutoHandle; end; { -------------------------------------------------------------------------- } function TAbCustomZipBrowser.GetZipfileComment : AnsiString; begin if ZipArchive is TAbZipArchive then Result := TAbZipArchive(ZipArchive).ZipfileComment else Result := ''; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipBrowser.InitArchive; begin inherited InitArchive; if ZipArchive is TAbZipArchive then begin {properties} TAbZipArchive(ZipArchive).Password := FPassword; {events} TAbZipArchive(ZipArchive).OnRequestLastDisk := FOnRequestLastDisk; TAbZipArchive(ZipArchive).OnRequestNthDisk := FOnRequestNthDisk; end; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipBrowser.SetFileName(const aFileName : string); var ArcType : TAbArchiveType; begin FFileName := aFileName; if csDesigning in ComponentState then Exit; try if Assigned(FArchive) then begin FArchive.Save; end; except end; FArchive.Free; FArchive := nil; if FileName <> '' then begin if mbFileExists(FileName) then begin { open it } ArcType := ArchiveType; if not ForceType then ArcType := AbDetermineArcType(FileName, atUnknown); case ArcType of atZip, atSpannedZip, atSelfExtZip : begin FArchive := TAbZipArchive.Create(FileName, fmOpenRead or fmShareDenyNone); InitArchive; end; atTar : begin FArchive := TAbTarArchive.Create(FileName, fmOpenRead or fmShareDenyNone); inherited InitArchive; end; atGZip : begin FArchive := TAbGzipArchive.Create(FileName, fmOpenRead or fmShareDenyNone); TAbGzipArchive(FArchive).TarAutoHandle := FTarAutoHandle; TAbGzipArchive(FArchive).IsGzippedTar := False; inherited InitArchive; end; atGZippedTar : begin FArchive := TAbGzipArchive.Create(FileName, fmOpenRead or fmShareDenyNone); TAbGzipArchive(FArchive).TarAutoHandle := FTarAutoHandle; TAbGzipArchive(FArchive).IsGzippedTar := True; inherited InitArchive; end; atBzip2 : begin FArchive := TAbBzip2Archive.Create(FileName, fmOpenRead or fmShareDenyNone); TAbBzip2Archive(FArchive).TarAutoHandle := FTarAutoHandle; TAbBzip2Archive(FArchive).IsBzippedTar := False; inherited InitArchive; end; atBzippedTar : begin FArchive := TAbBzip2Archive.Create(FileName, fmOpenRead or fmShareDenyNone); TAbBzip2Archive(FArchive).TarAutoHandle := FTarAutoHandle; TAbBzip2Archive(FArchive).IsBzippedTar := True; inherited InitArchive; end; else raise EAbUnhandledType.Create; end {case}; FArchive.Load; FArchiveType := ArcType; end; end; DoChange; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipBrowser.SetStream(aValue: TStream); var ArcType : TAbArchiveType; begin FFileName := ''; try if FArchive <> nil then FArchive.Save; except end; FreeAndNil(FArchive); if aValue <> nil then begin ArcType := ArchiveType; if not ForceType then ArcType := AbDetermineArcType(aValue); case ArcType of atZip, atSpannedZip, atSelfExtZip : begin FArchive := TAbZipArchive.CreateFromStream(aValue, ''); end; atTar : begin FArchive := TAbTarArchive.CreateFromStream(aValue, ''); end; atGZip, atGZippedTar : begin FArchive := TAbGzipArchive.CreateFromStream(aValue, ''); TAbGzipArchive(FArchive).TarAutoHandle := FTarAutoHandle; TAbGzipArchive(FArchive).IsGzippedTar := (ArcType = atGZippedTar); end; atBzip2, atBzippedTar : begin FArchive := TAbBzip2Archive.CreateFromStream(aValue, ''); TAbBzip2Archive(FArchive).TarAutoHandle := FTarAutoHandle; TAbBzip2Archive(FArchive).IsBzippedTar := (ArcType = atBzippedTar); end; else raise EAbUnhandledType.Create; end {case}; InitArchive; FArchive.Load; FArchiveType := ArcType; end; DoChange; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipBrowser.SetOnRequestBlankDisk(Value : TAbRequestDiskEvent); begin FOnRequestBlankDisk := Value; if ZipArchive is TAbZipArchive then TAbZipArchive(ZipArchive).OnRequestBlankDisk := FOnRequestBlankDisk; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipBrowser.SetOnRequestLastDisk(Value : TAbRequestDiskEvent); begin FOnRequestLastDisk := Value; if ZipArchive is TAbZipArchive then TAbZipArchive(ZipArchive).OnRequestLastDisk := FOnRequestLastDisk; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipBrowser.SetOnRequestNthDisk(Value : TAbRequestNthDiskEvent); begin FOnRequestNthDisk := Value; if ZipArchive is TAbZipArchive then TAbZipArchive(ZipArchive).OnRequestNthDisk := FOnRequestNthDisk; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipBrowser.SetPassword(const Value : AnsiString); begin FPassword := Value; if ZipArchive is TAbZipArchive then TAbZipArchive(ZipArchive).Password := Value; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipBrowser.SetTarAutoHandle(const Value: Boolean); begin FTarAutoHandle := Value; if FArchive is TAbGzipArchive then begin if TAbGzipArchive(FArchive).TarAutoHandle <> Value then begin TAbGzipArchive(FArchive).TarAutoHandle := Value; InitArchive; FArchive.Load; DoChange; end; end; if FArchive is TAbBzip2Archive then begin if TAbBzip2Archive(FArchive).TarAutoHandle <> Value then begin TAbBzip2Archive(FArchive).TarAutoHandle := Value; InitArchive; FArchive.Load; DoChange; end; end; end; procedure TAbCustomZipBrowser.SetZipfileComment(const Value : AnsiString); begin {NOP - descendents wishing to set this property should override} end; { -------------------------------------------------------------------------- } end. �������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abziptyp.pas����������������������������������������������0000644�0001750�0001750�00000251247�12134456030�022121� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Craig Peterson <capeterson@users.sourceforge.net> * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbZipTyp.pas *} {*********************************************************} {* ABBREVIA: PKZip types *} {* Based on information from Appnote.txt, shipped with *} {* PKWare's PKZip for Windows 2.5 *} {*********************************************************} unit AbZipTyp; {$I AbDefine.inc} interface uses Classes, AbArcTyp, AbUtils, AbSpanSt; const { note #$50 = 'P', #$4B = 'K'} Ab_ZipVersion = 63; Ab_ZipLocalFileHeaderSignature : Longint = $04034B50; Ab_ZipDataDescriptorSignature : Longint = $08074B50; Ab_ZipCentralDirectoryFileHeaderSignature : Longint = $02014B50; Ab_Zip64EndCentralDirectorySignature : Longint = $06064B50; Ab_Zip64EndCentralDirectoryLocatorSignature:Longint = $07064B50; Ab_ZipEndCentralDirectorySignature : Longint = $06054B50; Ab_ZipSpannedSetSignature : Longint = $08074B50; Ab_ZipPossiblySpannedSignature : Longint = $30304B50; Ab_GeneralZipSignature : Word = $4B50; Ab_ArchiveExtraDataRecord : Longint = $08064B50; Ab_DigitalSignature : Longint = $05054B50; Ab_WindowsExeSignature : Word = $5A4D; Ab_LinuxExeSignature : Longint = $464C457F; AbDefZipSpanningThreshold = 0; AbDefPasswordRetries = 3; AbFileIsEncryptedFlag = $0001; AbHasDataDescriptorFlag = $0008; AbLanguageEncodingFlag = $0800; Ab_Zip64SubfieldID : Word = $0001; Ab_InfoZipUnicodePathSubfieldID : Word = $7075; Ab_XceedUnicodePathSubfieldID : Word = $554E; Ab_XceedUnicodePathSignature : LongWord= $5843554E; type PAbByteArray4K = ^TAbByteArray4K; TAbByteArray4K = array[1..4096] of Byte; PAbByteArray8K = ^TAbByteArray8K; TAbByteArray8K = array[0..8192] of Byte; PAbIntArray8K = ^TAbIntArray8K; TAbIntArray8K = array[0..8192] of SmallInt; PAbWordArray = ^TAbWordArray; TAbWordArray = array[0..65535 div SizeOf(Word)-1] of Word; PAbByteArray = ^TAbByteArray; TAbByteArray = array[0..65535-1] of Byte; PAbSmallIntArray = ^TAbSmallIntArray; TAbSmallIntArray = array[0..65535 div SizeOf(SmallInt)-1] of SmallInt; PAbIntegerArray = ^TAbIntegerArray; TAbIntegerArray = array[0..65535 div sizeof(integer)-1] of integer; TAbZip64EndOfCentralDirectoryRecord = packed record Signature : Longint; RecordSize : Int64; VersionMadeBy : Word; VersionNeededToExtract : Word; DiskNumber : LongWord; StartDiskNumber : LongWord; EntriesOnDisk : Int64; TotalEntries : Int64; DirectorySize : Int64; DirectoryOffset : Int64; end; TAbZip64EndOfCentralDirectoryLocator = packed record Signature : Longint; StartDiskNumber : Longint; RelativeOffset : Int64; TotalDisks : Longint; end; TAbZipEndOfCentralDirectoryRecord = packed record Signature : Longint; DiskNumber : Word; StartDiskNumber : Word; EntriesOnDisk : Word; TotalEntries : Word; DirectorySize : LongWord; DirectoryOffset : LongWord; CommentLength : Word; end; TAbFollower = {used to expand reduced files} packed record Size : Byte; {size of follower set} FSet : array[0..31] of Byte; {follower set} end; PAbFollowerSets = ^TAbFollowerSets; TAbFollowerSets = array[0..255] of TAbFollower; PAbSfEntry = ^TAbSfEntry; TAbSfEntry = {entry in a Shannon-Fano tree} packed record case Byte of 0 : (Code : Word; Value, BitLength : Byte); 1 : (L : Longint); end; PAbSfTree = ^TAbSfTree; TAbSfTree = packed record {a Shannon-Fano tree} Entries : SmallInt; MaxLength : SmallInt; Entry : array[0..256] of TAbSfEntry; end; PInfoZipUnicodePathRec = ^TInfoZipUnicodePathRec; TInfoZipUnicodePathRec = packed record Version: Byte; NameCRC32: LongInt; UnicodeName: array[0..0] of AnsiChar; end; PXceedUnicodePathRec = ^TXceedUnicodePathRec; TXceedUnicodePathRec = packed record Signature: LongWord; Length: Integer; UnicodeName: array[0..0] of WideChar; end; PZip64LocalHeaderRec = ^TZip64LocalHeaderRec; TZip64LocalHeaderRec = packed record UncompressedSize: Int64; CompressedSize: Int64; end; type TAbZipCompressionMethod = (cmStored, cmShrunk, cmReduced1, cmReduced2, cmReduced3, cmReduced4, cmImploded, cmTokenized, cmDeflated, cmEnhancedDeflated, cmDCLImploded, cmBzip2 = 12, cmLZMA = 14, cmIBMTerse = 18, cmLZ77, cmJPEG = 96, cmWavPack = 97, cmPPMd); TAbZipSupportedMethod = (smStored, smDeflated, smBestMethod); {ExternalFileAttributes compatibility; aliases are Info-ZIP/PKZIP overlaps} TAbZipHostOS = (hosDOS, hosAmiga, hosVAX, hosUnix, hosVMCMS, hosAtari, hosOS2, hosMacintosh, hosZSystem, hosCPM, hosNTFS, hosTOPS20 = hosNTFS, hosMVS, hosWinNT = hosMVS, hosVSE, hosQDOS = hosVSE, hosRISC, hosVFAT, hosAltMVS, hosBeOS, hosTandem, hosOS400, hosTHEOS = hosOS400, hosDarwin, hosAtheOS = 30); {for method 6 - imploding} TAbZipDictionarySize = (dsInvalid, ds4K, ds8K); {for method 8 - deflating} TAbZipDeflationOption = (doInvalid, doNormal, doMaximum, doFast, doSuperFast ); type TAbNeedPasswordEvent = procedure(Sender : TObject; var NewPassword : AnsiString) of object; const AbDefCompressionMethodToUse = smBestMethod; AbDefDeflationOption = doNormal; type TAbZipDataDescriptor = class( TObject ) protected {private} FCRC32 : Longint; FCompressedSize : Int64; FUncompressedSize : Int64; public {methods} procedure SaveToStream( Stream : TStream ); public {properties} property CRC32 : Longint read FCRC32 write FCRC32; property CompressedSize : Int64 read FCompressedSize write FCompressedSize; property UncompressedSize : Int64 read FUncompressedSize write FUncompressedSize; end; type { TAbZipFileHeader interface =============================================== } {ancestor class for ZipLocalFileHeader and DirectoryFileHeader} TAbZipFileHeader = class( TObject ) protected {private} FValidSignature : Longint; FSignature : Longint; FVersionNeededToExtract : Word; FGeneralPurposeBitFlag : Word; FCompressionMethod : Word; FLastModFileTime : Word; FLastModFileDate : Word; FCRC32 : Longint; FCompressedSize : LongWord; FUncompressedSize : LongWord; FFileName : AnsiString; FExtraField : TAbExtraField; protected {methods} function GetCompressionMethod : TAbZipCompressionMethod; function GetCompressionRatio : Double; function GetDataDescriptor : Boolean; function GetDeflationOption : TAbZipDeflationOption; function GetDictionarySize : TAbZipDictionarySize; function GetEncrypted : Boolean; function GetIsUTF8 : Boolean; function GetShannonFanoTreeCount : Byte; function GetValid : Boolean; procedure SetCompressionMethod( Value : TAbZipCompressionMethod ); procedure SetIsUTF8( Value : Boolean ); public {methods} constructor Create; destructor Destroy; override; public {properties} property Signature : Longint read FSignature write FSignature; property VersionNeededToExtract : Word read FVersionNeededToExtract write FVersionNeededToExtract; property GeneralPurposeBitFlag : Word read FGeneralPurposeBitFlag write FGeneralPurposeBitFlag; property CompressionMethod : TAbZipCompressionMethod read GetCompressionMethod write SetCompressionMethod; property LastModFileTime : Word read FLastModFileTime write FLastModFileTime; property LastModFileDate : Word read FLastModFileDate write FLastModFileDate; property CRC32 : Longint read FCRC32 write FCRC32; property CompressedSize : LongWord read FCompressedSize write FCompressedSize; property UncompressedSize : LongWord read FUncompressedSize write FUncompressedSize; property FileName : AnsiString read FFileName write FFileName; property ExtraField : TAbExtraField read FExtraField; property CompressionRatio : Double read GetCompressionRatio; property DeflationOption : TAbZipDeflationOption read GetDeflationOption; property DictionarySize : TAbZipDictionarySize read GetDictionarySize; property HasDataDescriptor : Boolean read GetDataDescriptor; property IsValid : Boolean read GetValid; property IsEncrypted : Boolean read GetEncrypted; property IsUTF8 : Boolean read GetIsUTF8 write SetIsUTF8; property ShannonFanoTreeCount : Byte read GetShannonFanoTreeCount; end; { TAbZipLocalFileHeader interface ========================================== } TAbZipLocalFileHeader = class( TAbZipFileHeader ) public {methods} constructor Create; destructor Destroy; override; procedure LoadFromStream( Stream : TStream ); procedure SaveToStream( Stream : TStream ); end; { TAbZipDirectoryFileHeader interface ====================================== } TAbZipDirectoryFileHeader = class( TAbZipFileHeader ) protected {private} FVersionMadeBy : Word; FDiskNumberStart : Word; FInternalFileAttributes : Word; FExternalFileAttributes : LongWord; FRelativeOffset : LongWord; FFileComment : AnsiString; public {methods} constructor Create; destructor Destroy; override; procedure LoadFromStream( Stream : TStream ); procedure SaveToStream( Stream : TStream ); public {properties} property VersionMadeBy : Word read FVersionMadeBy write FVersionMadeBy; property DiskNumberStart : Word read FDiskNumberStart write FDiskNumberStart; property InternalFileAttributes : Word read FInternalFileAttributes write FInternalFileAttributes; property ExternalFileAttributes : LongWord read FExternalFileAttributes write FExternalFileAttributes; property RelativeOffset : LongWord read FRelativeOffset write FRelativeOffset; property FileComment : AnsiString read FFileComment write FFileComment; end; { TAbZipDirectoryFileFooter interface ====================================== } TAbZipDirectoryFileFooter = class( TObject ) protected {private} FDiskNumber : LongWord; FStartDiskNumber : LongWord; FEntriesOnDisk : Int64; FTotalEntries : Int64; FDirectorySize : Int64; FDirectoryOffset : Int64; FZipfileComment : AnsiString; function GetIsZip64: Boolean; public {methods} procedure LoadFromStream( Stream : TStream ); procedure LoadZip64FromStream( Stream : TStream ); procedure SaveToStream( Stream : TStream; aZip64TailOffset : Int64 = -1 ); public {properties} property DiskNumber : LongWord read FDiskNumber write FDiskNumber; property EntriesOnDisk : Int64 read FEntriesOnDisk write FEntriesOnDisk; property TotalEntries : Int64 read FTotalEntries write FTotalEntries; property DirectorySize : Int64 read FDirectorySize write FDirectorySize; property DirectoryOffset : Int64 read FDirectoryOffset write FDirectoryOffset; property StartDiskNumber : LongWord read FStartDiskNumber write FStartDiskNumber; property ZipfileComment : AnsiString read FZipfileComment write FZipfileComment; property IsZip64: Boolean read GetIsZip64; end; { TAbZipItem interface ===================================================== } TAbZipItem = class( TAbArchiveItem ) protected {private} FItemInfo : TAbZipDirectoryFileHeader; FDiskNumberStart : LongWord; FLFHExtraField : TAbExtraField; FRelativeOffset : Int64; protected {methods} function GetCompressionMethod : TAbZipCompressionMethod; function GetCompressionRatio : Double; function GetDeflationOption : TAbZipDeflationOption; function GetDictionarySize : TAbZipDictionarySize; function GetExtraField : TAbExtraField; function GetFileComment : AnsiString; function GetGeneralPurposeBitFlag : Word; function GetHostOS: TAbZipHostOS; function GetInternalFileAttributes : Word; function GetRawFileName : AnsiString; function GetShannonFanoTreeCount : Byte; function GetVersionMadeBy : Word; function GetVersionNeededToExtract : Word; procedure SaveCDHToStream( Stream : TStream ); procedure SaveDDToStream( Stream : TStream ); procedure SaveLFHToStream( Stream : TStream ); procedure SetCompressionMethod( Value : TAbZipCompressionMethod ); procedure SetDiskNumberStart( Value : LongWord ); procedure SetFileComment(const Value : AnsiString ); procedure SetGeneralPurposeBitFlag( Value : Word ); procedure SetHostOS( Value : TAbZipHostOS ); procedure SetInternalFileAttributes( Value : Word ); procedure SetRelativeOffset( Value : Int64 ); procedure SetVersionMadeBy( Value : Word ); procedure SetVersionNeededToExtract( Value : Word ); procedure UpdateVersionNeededToExtract; procedure UpdateZip64ExtraHeader; protected {redefined property methods} function GetCRC32 : Longint; override; function GetExternalFileAttributes : LongWord; override; function GetIsDirectory: Boolean; override; function GetIsEncrypted : Boolean; override; function GetLastModFileDate : Word; override; function GetLastModFileTime : Word; override; function GetNativeFileAttributes : LongInt; override; function GetNativeLastModFileTime: Longint; override; procedure SetCompressedSize( const Value : Int64 ); override; procedure SetCRC32( const Value : Longint ); override; procedure SetExternalFileAttributes( Value : LongWord ); override; procedure SetFileName(const Value : string ); override; procedure SetLastModFileDate(const Value : Word ); override; procedure SetLastModFileTime(const Value : Word ); override; procedure SetUncompressedSize( const Value : Int64 ); override; public {methods} constructor Create; destructor Destroy; override; procedure LoadFromStream( Stream : TStream ); public {properties} property CompressionMethod : TAbZipCompressionMethod read GetCompressionMethod write SetCompressionMethod; property CompressionRatio : Double read GetCompressionRatio; property DeflationOption : TAbZipDeflationOption read GetDeflationOption; property DictionarySize : TAbZipDictionarySize read GetDictionarySize; property DiskNumberStart : LongWord read FDiskNumberStart write SetDiskNumberStart; property ExtraField : TAbExtraField read GetExtraField; property FileComment : AnsiString read GetFileComment write SetFileComment; property HostOS: TAbZipHostOS read GetHostOS write SetHostOS; property InternalFileAttributes : Word read GetInternalFileAttributes write SetInternalFileAttributes; property GeneralPurposeBitFlag : Word read GetGeneralPurposeBitFlag write SetGeneralPurposeBitFlag; property LFHExtraField : TAbExtraField read FLFHExtraField; property RawFileName : AnsiString read GetRawFileName; property RelativeOffset : Int64 read FRelativeOffset write SetRelativeOffset; property ShannonFanoTreeCount : Byte read GetShannonFanoTreeCount; property VersionMadeBy : Word read GetVersionMadeBy write SetVersionMadeBy; property VersionNeededToExtract : Word read GetVersionNeededToExtract write SetVersionNeededToExtract; end; { TAbZipArchive interface ================================================== } TAbZipArchive = class( TAbArchive ) protected {private} FCompressionMethodToUse : TAbZipSupportedMethod; FDeflationOption : TAbZipDeflationOption; FInfo : TAbZipDirectoryFileFooter; FIsExecutable : Boolean; FPassword : AnsiString; FPasswordRetries : Byte; FStubSize : LongWord; FExtractHelper : TAbArchiveItemExtractEvent; FExtractToStreamHelper : TAbArchiveItemExtractToStreamEvent; FTestHelper : TAbArchiveItemTestEvent; FInsertHelper : TAbArchiveItemInsertEvent; FInsertFromStreamHelper : TAbArchiveItemInsertFromStreamEvent; FOnNeedPassword : TAbNeedPasswordEvent; FOnRequestLastDisk : TAbRequestDiskEvent; FOnRequestNthDisk : TAbRequestNthDiskEvent; FOnRequestBlankDisk : TAbRequestDiskEvent; protected {methods} procedure DoExtractHelper(Index : Integer; const NewName : string); procedure DoExtractToStreamHelper(Index : Integer; aStream : TStream); procedure DoTestHelper(Index : Integer); procedure DoInsertHelper(Index : Integer; OutStream : TStream); procedure DoInsertFromStreamHelper(Index : Integer; OutStream : TStream); function GetItem( Index : Integer ) : TAbZipItem; function GetZipfileComment : AnsiString; procedure PutItem( Index : Integer; Value : TAbZipItem ); procedure DoRequestDisk(const AMessage: string; var Abort : Boolean); procedure DoRequestLastDisk( var Abort : Boolean ); virtual; procedure DoRequestNthDisk(Sender: TObject; DiskNumber : Byte; var Abort : Boolean ); virtual; procedure DoRequestBlankDisk(Sender: TObject; var Abort : Boolean ); virtual; procedure ExtractItemAt(Index : Integer; const UseName : string); override; procedure ExtractItemToStreamAt(Index : Integer; aStream : TStream); override; procedure TestItemAt(Index : Integer); override; function FixName(const Value : string ) : string; override; function GetSupportsEmptyFolders: Boolean; override; procedure LoadArchive; override; procedure SaveArchive; override; procedure SetZipfileComment(const Value : AnsiString ); protected {properties} property IsExecutable : Boolean read FIsExecutable write FIsExecutable; public {protected} procedure DoRequestImage(Sender: TObject; ImageNumber: Integer; var ImageName: string; var Abort: Boolean); public {methods} constructor CreateFromStream( aStream : TStream; const ArchiveName : string ); override; destructor Destroy; override; function CreateItem(const SourceFileName : string; const ArchiveDirectory : string): TAbArchiveItem; override; public {properties} property CompressionMethodToUse : TAbZipSupportedMethod read FCompressionMethodToUse write FCompressionMethodToUse; property DeflationOption : TAbZipDeflationOption read FDeflationOption write FDeflationOption; property ExtractHelper : TAbArchiveItemExtractEvent read FExtractHelper write FExtractHelper; property ExtractToStreamHelper : TAbArchiveItemExtractToStreamEvent read FExtractToStreamHelper write FExtractToStreamHelper; property TestHelper : TAbArchiveItemTestEvent read FTestHelper write FTestHelper; property InsertHelper : TAbArchiveItemInsertEvent read FInsertHelper write FInsertHelper; property InsertFromStreamHelper : TAbArchiveItemInsertFromStreamEvent read FInsertFromStreamHelper write FInsertFromStreamHelper; property Password : AnsiString read FPassword write FPassword; property PasswordRetries : Byte read FPasswordRetries write FPasswordRetries default AbDefPasswordRetries; property StubSize : LongWord read FStubSize; property ZipfileComment : AnsiString read GetZipfileComment write SetZipfileComment; property Items[Index : Integer] : TAbZipItem read GetItem write PutItem; default; public {events} property OnNeedPassword : TAbNeedPasswordEvent read FOnNeedPassword write FOnNeedPassword; property OnRequestLastDisk : TAbRequestDiskEvent read FOnRequestLastDisk write FOnRequestLastDisk; property OnRequestNthDisk : TAbRequestNthDiskEvent read FOnRequestNthDisk write FOnRequestNthDisk; property OnRequestBlankDisk : TAbRequestDiskEvent read FOnRequestBlankDisk write FOnRequestBlankDisk; end; {============================================================================} procedure MakeSelfExtracting( StubStream, ZipStream, SelfExtractingStream : TStream ); {-takes an executable stub, and a .zip format stream, and creates a SelfExtracting stream. The stub should create a TAbZipArchive passing itself as the file, using a read-only open mode. It should then perform operations as needed - like ExtractFiles( '*.*' ). This routine updates the RelativeOffset of each item in the archive} function FindCentralDirectoryTail(aStream : TStream) : Int64; function VerifyZip(Strm : TStream) : TAbArchiveType; function VerifySelfExtracting(Strm : TStream) : TAbArchiveType; function ZipCompressionMethodToString(aMethod: TAbZipCompressionMethod): string; implementation uses {$IFDEF MSWINDOWS} Windows, {$ENDIF} {$IFDEF LibcAPI} Libc, {$ENDIF} {$IFDEF UnixDialogs} {$IFDEF KYLIX} QControls, QDialogs, {$ENDIF} {$IFDEF LCL} Controls, Dialogs, {$ENDIF} {$ENDIF} Math, AbResString, AbExcept, AbVMStrm, SysUtils, DCOSUtils, DCClassesUtf8, DCConvertEncoding; function VerifyZip(Strm : TStream) : TAbArchiveType; { determine if stream appears to be in PkZip format } var Footer : TAbZipEndOfCentralDirectoryRecord; Sig : LongInt; TailPosition : int64; StartPos : int64; begin StartPos := Strm.Position; Result := atUnknown; try Strm.Position := 0; if Strm.Read(Sig, SizeOf(Sig)) = SizeOf(Sig) then begin if (Sig = Ab_ZipSpannedSetSignature) then Result := atSpannedZip else begin { attempt to find Central Directory Tail } TailPosition := FindCentralDirectoryTail( Strm ); if TailPosition <> -1 then begin { check Central Directory Signature } if (Strm.Read(Footer, SizeOf(Footer)) = SizeOf(Footer)) and (Footer.Signature = Ab_ZipEndCentralDirectorySignature) then begin { check Central Directory Offset } if (Footer.DirectoryOffset = High(LongWord)) or ((Strm.Seek(Footer.DirectoryOffset, soBeginning) = Footer.DirectoryOffset) and (Strm.Read(Sig, SizeOf(Sig)) = SizeOf(Sig)) and (Sig = Ab_ZipCentralDirectoryFileHeaderSignature)) then begin if Footer.DiskNumber = 0 then Result := atZip else Result := atSpannedZip; end; end; end; end; end; except on EReadError do Result := atUnknown; end; Strm.Position := StartPos; end; function VerifySelfExtracting(Strm : TStream) : TAbArchiveType; { determine if stream appears to be an executable with appended PkZip data } var FileSignature : Longint; StartPos : Int64; IsWinExe, IsLinuxExe : Boolean; begin StartPos := Strm.Position; { verify presence of executable stub } {check file type of stub stream} Strm.Position := 0; Strm.Read( FileSignature, sizeof( FileSignature ) ); Result := atSelfExtZip; { detect executable type } IsLinuxExe := FileSignature = Ab_LinuxExeSignature; IsWinExe := LongRec(FileSignature).Lo = Ab_WindowsExeSignature; if not (IsWinExe or IsLinuxExe) then Result := atUnknown; { Check for central directory tail } if VerifyZip(Strm) <> atZip then Result := atUnknown; Strm.Position := StartPos; end; {============================================================================} function ZipCompressionMethodToString(aMethod: TAbZipCompressionMethod): string; begin case aMethod of cmStored: Result := AbZipStored; cmShrunk: Result := AbZipShrunk; cmReduced1..cmReduced4: Result := AbZipReduced; cmImploded: Result := AbZipImploded; cmTokenized: Result := AbZipTokenized; cmDeflated: Result := AbZipDeflated; cmEnhancedDeflated: Result := AbZipDeflate64; cmDCLImploded: Result := AbZipDCLImploded; cmBzip2: Result := AbZipBzip2; cmLZMA: Result := AbZipLZMA; cmIBMTerse: Result := AbZipIBMTerse; cmLZ77: Result := AbZipLZ77; cmJPEG: Result := AbZipJPEG; cmWavPack: Result := AbZipWavPack; cmPPMd: Result := AbZipPPMd; else Result := Format(AbZipUnknown, [Ord(aMethod)]); end; end; {============================================================================} function FindCentralDirectoryTail(aStream : TStream) : Int64; { search end of aStream looking for ZIP Central Directory structure returns position in stream if found (otherwise returns -1), leaves stream positioned at start of structure or at original position if not found } const MaxBufSize = 256 * 1024; var StartPos : Int64; TailRec : TAbZipEndOfCentralDirectoryRecord; Buffer : PAnsiChar; Offset : Int64; TestPos : PAnsiChar; BytesRead : Int64; BufSize : Int64; CommentLen: integer; begin {save the starting position} StartPos := aStream.Seek(0, soCurrent); {start off with the majority case: no zip file comment, so the central directory tail is the last thing in the stream and it's a fixed size and doesn't indicate a zip file comment} Result := aStream.Seek(-sizeof(TailRec), soEnd); if (Result >= 0) then begin aStream.ReadBuffer(TailRec, sizeof(TailRec)); if (TailRec.Signature = Ab_ZipEndCentralDirectorySignature) and (TailRec.CommentLength = 0) then begin aStream.Seek(Result, soBeginning); Exit; end; end; {the zip stream seems to have a comment, or it has null padding bytes from some flaky program, or it's not even a zip formatted stream; we need to search for the tail signature} {get a buffer} BufSize := Min(MaxBufSize, aStream.Size); GetMem(Buffer, BufSize); try {start out searching backwards} Offset := -BufSize; {seek to the search position} Result := aStream.Seek(Offset, soEnd); if (Result < 0) then begin Result := aStream.Seek(0, soBeginning); end; {read a buffer full} BytesRead := aStream.Read(Buffer^, BufSize); if BytesRead < sizeOf(TailRec) then begin Result := -1; Exit; end; {search backwards through the buffer looking for the signature} TestPos := Buffer + BytesRead - sizeof(TailRec); while (TestPos <> Buffer) and (PLongint(TestPos)^ <> Ab_ZipEndCentralDirectorySignature) do dec(TestPos); {if we found the signature...} if (PLongint(TestPos)^ = Ab_ZipEndCentralDirectorySignature) then begin {get the tail record at this position} Move(TestPos^, TailRec, sizeof(TailRec)); {if it's as valid a tail as we can check here...} CommentLen := -Offset - (TestPos - Buffer + sizeof(TailRec)); if (TailRec.CommentLength <= CommentLen) then begin {calculate its position and exit} Result := Result + (TestPos - Buffer); aStream.Seek(Result, soBeginning); Exit; end; end; {if we reach this point, the CD tail is not present} Result := -1; aStream.Seek(StartPos, soBeginning); finally FreeMem(Buffer); end; end; {============================================================================} procedure MakeSelfExtracting( StubStream, ZipStream, SelfExtractingStream : TStream ); {-takes an executable stub, and a .zip format stream, and creates a SelfExtracting stream. The stub should create a TAbZipArchive passing itself as the file, using a read-only open mode. It should then perform operations as needed - like ExtractFiles( '*.*' ). This routine updates the RelativeOffset of each item in the archive} var DirectoryStart : Int64; FileSignature : Longint; StubSize : LongWord; TailPosition : Int64; ZDFF : TAbZipDirectoryFileFooter; ZipItem : TAbZipItem; IsWinExe, IsLinuxExe : Boolean; begin {check file type of stub stream} StubStream.Position := 0; StubStream.Read(FileSignature, SizeOf(FileSignature)); {detect executable type } IsLinuxExe := FileSignature = Ab_LinuxExeSignature; IsWinExe := LongRec(FileSignature).Lo = Ab_WindowsExeSignature; if not (IsWinExe or IsLinuxExe) then raise EAbZipInvalidStub.Create; StubStream.Position := 0; StubSize := StubStream.Size; ZipStream.Position := 0; ZipStream.Read( FileSignature, sizeof( FileSignature ) ); if LongRec(FileSignature).Lo <> Ab_GeneralZipSignature then raise EAbZipInvalid.Create; ZipStream.Position := 0; {copy the stub into the selfex stream} SelfExtractingStream.Position := 0; SelfExtractingStream.CopyFrom( StubStream, 0 ); TailPosition := FindCentralDirectoryTail( ZipStream ); if TailPosition = -1 then raise EAbZipInvalid.Create; {load the ZipDirectoryFileFooter} ZDFF := TAbZipDirectoryFileFooter.Create; try ZDFF.LoadFromStream( ZipStream ); DirectoryStart := ZDFF.DirectoryOffset; finally ZDFF.Free; end; {copy everything up to the CDH into the SelfExtractingStream} ZipStream.Position := 0; SelfExtractingStream.CopyFrom( ZipStream, DirectoryStart ); ZipStream.Position := DirectoryStart; repeat ZipItem := TAbZipItem.Create; try ZipItem.LoadFromStream( ZipStream ); ZipItem.RelativeOffset := ZipItem.RelativeOffset + StubSize; {save the modified entry into the Self Extracting Stream} ZipItem.SaveCDHToStream( SelfExtractingStream ); finally ZipItem.Free; end; until ZipStream.Position = TailPosition; {save the CDH Footer.} ZDFF := TAbZipDirectoryFileFooter.Create; try ZDFF.LoadFromStream( ZipStream ); ZDFF.DirectoryOffset := ZDFF.DirectoryOffset + StubSize; ZDFF.SaveToStream( SelfExtractingStream ); finally ZDFF.Free; end; end; {============================================================================} { TAbZipDataDescriptor implementation ====================================== } procedure TAbZipDataDescriptor.SaveToStream( Stream : TStream ); begin Stream.Write( Ab_ZipDataDescriptorSignature, sizeof( Ab_ZipDataDescriptorSignature ) ); Stream.Write( FCRC32, sizeof( FCRC32 ) ); if (FCompressedSize >= $FFFFFFFF) or (FUncompressedSize >= $FFFFFFFF) then begin Stream.Write( FCompressedSize, sizeof( FCompressedSize ) ); Stream.Write( FUncompressedSize, sizeof( FUncompressedSize ) ); end else begin Stream.Write( FCompressedSize, sizeof( LongWord ) ); Stream.Write( FUncompressedSize, sizeof( LongWord ) ); end; end; { -------------------------------------------------------------------------- } { TAbZipFileHeader implementation ========================================== } constructor TAbZipFileHeader.Create; begin inherited Create; FExtraField := TAbExtraField.Create; FValidSignature := $0; end; { -------------------------------------------------------------------------- } destructor TAbZipFileHeader.Destroy; begin FreeAndNil(FExtraField); inherited Destroy; end; { -------------------------------------------------------------------------- } function TAbZipFileHeader.GetCompressionMethod : TAbZipCompressionMethod; begin Result := TAbZipCompressionMethod( FCompressionMethod ); end; { -------------------------------------------------------------------------- } function TAbZipFileHeader.GetDataDescriptor : Boolean; begin Result := ( CompressionMethod = cmDeflated ) and ( ( FGeneralPurposeBitFlag and AbHasDataDescriptorFlag ) <> 0 ); end; { -------------------------------------------------------------------------- } function TAbZipFileHeader.GetCompressionRatio : Double; var CompSize : Int64; begin {adjust for encrypted headers - ensures we never get negative compression ratios for stored, encrypted files - no guarantees about negative compression ratios in other cases} if isEncrypted then CompSize := CompressedSize - 12 else CompSize := CompressedSize; if UncompressedSize > 0 then Result := 100.0 * ( 1 - ( ( 1.0 * CompSize ) / UncompressedSize ) ) else Result := 0.0; end; { -------------------------------------------------------------------------- } function TAbZipFileHeader.GetDeflationOption : TAbZipDeflationOption; begin if CompressionMethod = cmDeflated then if ( ( FGeneralPurposeBitFlag and $02 ) <> 0 ) then if ( ( FGeneralPurposeBitFlag and $04 ) <> 0 ) then Result := doSuperFast else Result := doMaximum else if ( ( FGeneralPurposeBitFlag and $04 ) <> 0 ) then Result := doFast else Result := doNormal else Result := doInvalid; end; { -------------------------------------------------------------------------- } function TAbZipFileHeader.GetDictionarySize : TAbZipDictionarySize; begin if CompressionMethod = cmImploded then if ( ( FGeneralPurposeBitFlag and $02 ) <> 0 ) then Result := ds8K else Result := ds4K else Result := dsInvalid; end; { -------------------------------------------------------------------------- } function TAbZipFileHeader.GetEncrypted : Boolean; begin {bit 0 of the GeneralPurposeBitFlag} Result := ( ( FGeneralPurposeBitFlag and AbFileIsEncryptedFlag ) <> 0 ); end; { -------------------------------------------------------------------------- } function TAbZipFileHeader.GetIsUTF8 : Boolean; begin Result := ( ( GeneralPurposeBitFlag and AbLanguageEncodingFlag ) <> 0 ); end; { -------------------------------------------------------------------------- } function TAbZipFileHeader.GetShannonFanoTreeCount : Byte; begin if CompressionMethod = cmImploded then if ( ( FGeneralPurposeBitFlag and $04 ) <> 0 ) then Result := 3 else Result := 2 else Result := 0; end; { -------------------------------------------------------------------------- } function TAbZipFileHeader.GetValid : Boolean; begin Result := ( FValidSignature = FSignature ); end; { -------------------------------------------------------------------------- } procedure TAbZipFileHeader.SetCompressionMethod( Value : TAbZipCompressionMethod ); begin FCompressionMethod := Ord( Value ); end; { -------------------------------------------------------------------------- } procedure TAbZipFileHeader.SetIsUTF8( Value : Boolean ); begin if Value then GeneralPurposeBitFlag := GeneralPurposeBitFlag or AbLanguageEncodingFlag else GeneralPurposeBitFlag := GeneralPurposeBitFlag and not AbLanguageEncodingFlag; end; { -------------------------------------------------------------------------- } { TAbZipLocalFileHeader implementation ===================================== } constructor TAbZipLocalFileHeader.Create; begin inherited Create; FValidSignature := Ab_ZipLocalFileHeaderSignature; end; { -------------------------------------------------------------------------- } destructor TAbZipLocalFileHeader.Destroy; begin inherited Destroy; end; { -------------------------------------------------------------------------- } procedure TAbZipLocalFileHeader.LoadFromStream( Stream : TStream ); var ExtraFieldLength, FileNameLength : Word; begin with Stream do begin Read( FSignature, sizeof( FSignature ) ); Read( FVersionNeededToExtract, sizeof( FVersionNeededToExtract ) ); Read( FGeneralPurposeBitFlag, sizeof( FGeneralPurposeBitFlag ) ); Read( FCompressionMethod, sizeof( FCompressionMethod ) ); Read( FLastModFileTime, sizeof( FLastModFileTime ) ); Read( FLastModFileDate, sizeof( FLastModFileDate ) ); Read( FCRC32, sizeof( FCRC32 ) ); Read( FCompressedSize, sizeof( FCompressedSize ) ); Read( FUncompressedSize, sizeof( FUncompressedSize ) ); Read( FileNameLength, sizeof( FileNameLength ) ); Read( ExtraFieldLength, sizeof( ExtraFieldLength ) ); SetLength( FFileName, FileNameLength ); if FileNameLength > 0 then Read( FFileName[1], FileNameLength ); FExtraField.LoadFromStream( Stream, ExtraFieldLength ); end; if not IsValid then raise EAbZipInvalid.Create; end; { -------------------------------------------------------------------------- } procedure TAbZipLocalFileHeader.SaveToStream( Stream : TStream ); var ExtraFieldLength, FileNameLength: Word; begin with Stream do begin {write the valid signature from the constant} Write( FValidSignature, sizeof( FValidSignature ) ); Write( FVersionNeededToExtract, sizeof( FVersionNeededToExtract ) ); Write( FGeneralPurposeBitFlag, sizeof( FGeneralPurposeBitFlag ) ); Write( FCompressionMethod, sizeof( FCompressionMethod ) ); Write( FLastModFileTime, sizeof( FLastModFileTime ) ); Write( FLastModFileDate, sizeof( FLastModFileDate ) ); Write( FCRC32, sizeof( FCRC32 ) ); Write( FCompressedSize, sizeof( FCompressedSize ) ); Write( FUncompressedSize, sizeof( FUncompressedSize ) ); FileNameLength := Word( Length( FFileName ) ); Write( FileNameLength, sizeof( FileNameLength ) ); ExtraFieldLength := Length(FExtraField.Buffer); Write( ExtraFieldLength, sizeof( ExtraFieldLength ) ); if FileNameLength > 0 then Write( FFileName[1], FileNameLength ); if ExtraFieldLength > 0 then Write(FExtraField.Buffer[0], ExtraFieldLength); end; end; { -------------------------------------------------------------------------- } { TAbZipDirectoryFileHeader implementation ================================= } constructor TAbZipDirectoryFileHeader.Create; begin inherited Create; FValidSignature := Ab_ZipCentralDirectoryFileHeaderSignature; end; { -------------------------------------------------------------------------- } destructor TAbZipDirectoryFileHeader.Destroy; begin inherited Destroy; end; { -------------------------------------------------------------------------- } procedure TAbZipDirectoryFileHeader.LoadFromStream( Stream : TStream ); var ExtraFieldLength, FileCommentLength, FileNameLength : Word; begin with Stream do begin Read( FSignature, sizeof( FSignature ) ); Read( FVersionMadeBy, sizeof( FVersionMadeBy ) ); Read( FVersionNeededToExtract, sizeof( FVersionNeededToExtract ) ); Read( FGeneralPurposeBitFlag, sizeof( FGeneralPurposeBitFlag ) ); Read( FCompressionMethod, sizeof( FCompressionMethod ) ); Read( FLastModFileTime, sizeof( FLastModFileTime ) ); Read( FLastModFileDate, sizeof( FLastModFileDate ) ); Read( FCRC32, sizeof( FCRC32 ) ); Read( FCompressedSize, sizeof( FCompressedSize ) ); Read( FUncompressedSize, sizeof( FUncompressedSize ) ); Read( FileNameLength, sizeof( FileNameLength ) ); Read( ExtraFieldLength, sizeof( ExtraFieldLength ) ); Read( FileCommentLength, sizeof( FileCommentLength ) ); Read( FDiskNumberStart, sizeof( FDiskNumberStart ) ); Read( FInternalFileAttributes, sizeof( FInternalFileAttributes ) ); Read( FExternalFileAttributes, sizeof( FExternalFileAttributes ) ); Read( FRelativeOffset, sizeof( FRelativeOffset ) ); SetLength( FFileName, FileNameLength ); if FileNameLength > 0 then Read( FFileName[1], FileNameLength ); FExtraField.LoadFromStream( Stream, ExtraFieldLength ); SetLength( FFileComment, FileCommentLength ); if FileCommentLength > 0 then Read( FFileComment[1], FileCommentLength ); end; if not IsValid then raise EAbZipInvalid.Create; end; { -------------------------------------------------------------------------- } procedure TAbZipDirectoryFileHeader.SaveToStream( Stream : TStream ); var ExtraFieldLength, FileCommentLength, FileNameLength : Word; begin with Stream do begin {write the valid signature from the constant} Write( FValidSignature, sizeof( FValidSignature ) ); Write( FVersionMadeBy, sizeof( FVersionMadeBy ) ); Write( FVersionNeededToExtract, sizeof( FVersionNeededToExtract ) ); Write( FGeneralPurposeBitFlag, sizeof( FGeneralPurposeBitFlag ) ); Write( FCompressionMethod, sizeof( FCompressionMethod ) ); Write( FLastModFileTime, sizeof( FLastModFileTime ) ); Write( FLastModFileDate, sizeof( FLastModFileDate ) ); Write( FCRC32, sizeof( FCRC32 ) ); Write( FCompressedSize, sizeof( FCompressedSize ) ); Write( FUncompressedSize, sizeof( FUncompressedSize ) ); FileNameLength := Word( Length( FFileName ) ); Write( FileNameLength, sizeof( FileNameLength ) ); ExtraFieldLength := Length(FExtraField.Buffer); Write( ExtraFieldLength, sizeof( ExtraFieldLength ) ); FileCommentLength := Word( Length( FFileComment ) ); Write( FileCommentLength, sizeof( FileCommentLength ) ); Write( FDiskNumberStart, sizeof( FDiskNumberStart ) ); Write( FInternalFileAttributes, sizeof( FInternalFileAttributes ) ); Write( FExternalFileAttributes, sizeof( FExternalFileAttributes ) ); Write( FRelativeOffset, sizeof( FRelativeOffset ) ); if FileNameLength > 0 then Write( FFileName[1], FileNameLength ); if ExtraFieldLength > 0 then Write( FExtraField.Buffer[0], ExtraFieldLength ); if FileCommentLength > 0 then Write( FFileComment[1], FileCommentLength ); end; end; { -------------------------------------------------------------------------- } { TAbZipDirectoryFileFooter implementation ================================= } function TAbZipDirectoryFileFooter.GetIsZip64: Boolean; begin Result := (DiskNumber >= $FFFF) or (StartDiskNumber >= $FFFF) or (EntriesOnDisk >= $FFFF) or (TotalEntries >= $FFFF) or (DirectorySize >= $FFFFFFFF) or (DirectoryOffset >= $FFFFFFFF); end; { -------------------------------------------------------------------------- } procedure TAbZipDirectoryFileFooter.LoadFromStream( Stream : TStream ); var Footer: TAbZipEndOfCentralDirectoryRecord; begin Stream.ReadBuffer( Footer, SizeOf(Footer) ); if Footer.Signature <> Ab_ZipEndCentralDirectorySignature then raise EAbZipInvalid.Create; FDiskNumber := Footer.DiskNumber; FStartDiskNumber := Footer.StartDiskNumber; FEntriesOnDisk := Footer.EntriesOnDisk; FTotalEntries := Footer.TotalEntries; FDirectorySize := Footer.DirectorySize; FDirectoryOffset := Footer.DirectoryOffset; SetLength( FZipfileComment, Footer.CommentLength ); if Footer.CommentLength > 0 then Stream.ReadBuffer( FZipfileComment[1], Footer.CommentLength ); end; { -------------------------------------------------------------------------- } procedure TAbZipDirectoryFileFooter.LoadZip64FromStream( Stream : TStream ); {load the ZIP64 end of central directory record. LoadFromStream() must be called first to load the standard record} var Footer: TAbZip64EndOfCentralDirectoryRecord; begin Stream.ReadBuffer( Footer, SizeOf(Footer) ); if Footer.Signature <> Ab_Zip64EndCentralDirectorySignature then raise EAbZipInvalid.Create; if FDiskNumber = $FFFF then FDiskNumber := Footer.DiskNumber; if FStartDiskNumber = $FFFF then FStartDiskNumber := Footer.StartDiskNumber; if FEntriesOnDisk = $FFFF then FEntriesOnDisk := Footer.EntriesOnDisk; if FTotalEntries = $FFFF then FTotalEntries := Footer.TotalEntries; if FDirectorySize = $FFFFFFFF then FDirectorySize := Footer.DirectorySize; if FDirectoryOffset = $FFFFFFFF then FDirectoryOffset := Footer.DirectoryOffset; {RecordSize, VersionMadeBy, and VersionNeededToExtract are currently ignored} end; { -------------------------------------------------------------------------- } procedure TAbZipDirectoryFileFooter.SaveToStream( Stream : TStream; aZip64TailOffset: Int64 = -1); {write end of central directory record, along with Zip64 records if necessary. aZip64TailOffset is the value to use for the Zip64 locator's directory offset, and is only necessary when writing to an intermediate stream} var Footer: TAbZipEndOfCentralDirectoryRecord; Zip64Footer: TAbZip64EndOfCentralDirectoryRecord; Zip64Locator: TAbZip64EndOfCentralDirectoryLocator; begin if IsZip64 then begin {setup Zip64 end of central directory record} Zip64Footer.Signature := Ab_Zip64EndCentralDirectorySignature; Zip64Footer.RecordSize := SizeOf(Zip64Footer) - SizeOf(Zip64Footer.Signature) - SizeOf(Zip64Footer.RecordSize); Zip64Footer.VersionMadeBy := 45; Zip64Footer.VersionNeededToExtract := 45; Zip64Footer.DiskNumber := DiskNumber; Zip64Footer.StartDiskNumber := StartDiskNumber; Zip64Footer.EntriesOnDisk := EntriesOnDisk; Zip64Footer.TotalEntries := TotalEntries; Zip64Footer.DirectorySize := DirectorySize; Zip64Footer.DirectoryOffset := DirectoryOffset; {setup Zip64 end of central directory locator} Zip64Locator.Signature := Ab_Zip64EndCentralDirectoryLocatorSignature; Zip64Locator.StartDiskNumber := DiskNumber; if aZip64TailOffset = -1 then Zip64Locator.RelativeOffset := Stream.Position else Zip64Locator.RelativeOffset := aZip64TailOffset; Zip64Locator.TotalDisks := DiskNumber + 1; {write Zip64 records} Stream.WriteBuffer(Zip64Footer, SizeOf(Zip64Footer)); Stream.WriteBuffer(Zip64Locator, SizeOf(Zip64Locator)); end; Footer.Signature := Ab_ZipEndCentralDirectorySignature; Footer.DiskNumber := Min(FDiskNumber, $FFFF); Footer.StartDiskNumber := Min(FStartDiskNumber, $FFFF); Footer.EntriesOnDisk := Min(FEntriesOnDisk, $FFFF); Footer.TotalEntries := Min(FTotalEntries, $FFFF); Footer.DirectorySize := Min(FDirectorySize, $FFFFFFFF); Footer.DirectoryOffset := Min(FDirectoryOffset, $FFFFFFFF); Footer.CommentLength := Length( FZipfileComment ); Stream.WriteBuffer( Footer, SizeOf(Footer) ); if FZipfileComment <> '' then Stream.Write( FZipfileComment[1], Length(FZipfileComment) ); end; { -------------------------------------------------------------------------- } { TAbZipItem implementation ================================================ } constructor TAbZipItem.Create; begin inherited Create; FItemInfo := TAbZipDirectoryFileHeader.Create; FLFHExtraField := TAbExtraField.Create; end; { -------------------------------------------------------------------------- } destructor TAbZipItem.Destroy; begin FLFHExtraField.Free; FItemInfo.Free; FItemInfo := nil; inherited Destroy; end; { -------------------------------------------------------------------------- } function TAbZipItem.GetCompressionMethod : TAbZipCompressionMethod; begin Result := FItemInfo.CompressionMethod; end; { -------------------------------------------------------------------------- } function TAbZipItem.GetCompressionRatio : Double; begin Result := FItemInfo.CompressionRatio; end; { -------------------------------------------------------------------------- } function TAbZipItem.GetCRC32 : Longint; begin Result := FItemInfo.CRC32; end; { -------------------------------------------------------------------------- } function TAbZipItem.GetDeflationOption : TAbZipDeflationOption; begin Result := FItemInfo.DeflationOption; end; { -------------------------------------------------------------------------- } function TAbZipItem.GetDictionarySize : TAbZipDictionarySize; begin Result := FItemInfo.DictionarySize; end; { -------------------------------------------------------------------------- } function TAbZipItem.GetGeneralPurposeBitFlag : Word; begin Result := FItemInfo.GeneralPurposeBitFlag; end; { -------------------------------------------------------------------------- } function TAbZipItem.GetHostOS: TAbZipHostOS; begin Result := TAbZipHostOS(Hi(VersionMadeBy)); end; { -------------------------------------------------------------------------- } function TAbZipItem.GetExternalFileAttributes : LongWord; begin Result := FItemInfo.ExternalFileAttributes; end; { -------------------------------------------------------------------------- } function TAbZipItem.GetExtraField : TAbExtraField; begin Result := FItemInfo.ExtraField; end; { -------------------------------------------------------------------------- } function TAbZipItem.GetFileComment : AnsiString; begin Result := FItemInfo.FileComment; end; { -------------------------------------------------------------------------- } function TAbZipItem.GetInternalFileAttributes : Word; begin Result := FItemInfo.InternalFileAttributes; end; { -------------------------------------------------------------------------- } function TAbZipItem.GetIsDirectory: Boolean; begin Result := ((ExternalFileAttributes and faDirectory) <> 0) or ((FileName <> '') and CharInSet(Filename[Length(FFilename)], ['\','/'])); end; { -------------------------------------------------------------------------- } function TAbZipItem.GetIsEncrypted : Boolean; begin Result := FItemInfo.IsEncrypted; end; { -------------------------------------------------------------------------- } function TAbZipItem.GetLastModFileDate : Word; begin Result := FItemInfo.LastModFileDate; end; { -------------------------------------------------------------------------- } function TAbZipItem.GetLastModFileTime : Word; begin Result := FItemInfo.LastModFileTime; end; { -------------------------------------------------------------------------- } function TAbZipItem.GetNativeFileAttributes : LongInt; begin {$IFDEF MSWINDOWS} if (HostOS = hosUnix) or (ExternalFileAttributes > $1FFFF) then Result := AbUnix2DosFileAttributes(ExternalFileAttributes shr 16) else Result := Byte(ExternalFileAttributes); {$ENDIF} {$IFDEF UNIX} if HostOS in [hosDOS, hosNTFS, hosWinNT] then Result := AbDOS2UnixFileAttributes(ExternalFileAttributes) else Result := ExternalFileAttributes shr 16; {$ENDIF} end; { -------------------------------------------------------------------------- } function TAbZipItem.GetRawFileName : AnsiString; begin Result := FItemInfo.FileName; end; { -------------------------------------------------------------------------- } function TAbZipItem.GetNativeLastModFileTime: Longint; {$IFDEF UNIX} var DateTime: TDateTime; {$ENDIF} begin // Zip stores MS-DOS date/time. {$IFDEF UNIX} DateTime := AbDosFileDateToDateTime(LastModFileDate, LastModFileTime); Result := AbLocalDateTimeToUnixTime(DateTime); {$ELSE} LongRec(Result).Hi := LastModFileDate; LongRec(Result).Lo := LastModFileTime; {$ENDIF} end; { -------------------------------------------------------------------------- } function TAbZipItem.GetShannonFanoTreeCount : Byte; begin Result := FItemInfo.ShannonFanoTreeCount; end; { -------------------------------------------------------------------------- } function TAbZipItem.GetVersionMadeBy : Word; begin Result := FItemInfo.VersionMadeBy; end; { -------------------------------------------------------------------------- } function TAbZipItem.GetVersionNeededToExtract : Word; begin Result := FItemInfo.VersionNeededToExtract; end; { -------------------------------------------------------------------------- } procedure TAbZipItem.LoadFromStream( Stream : TStream ); var FieldSize: Word; FieldStream: TStream; InfoZipField: PInfoZipUnicodePathRec; UnicodeName: UnicodeString; UTF8Name: UTF8String; XceedField: PXceedUnicodePathRec; SystemCode: TAbZipHostOs; begin FItemInfo.LoadFromStream( Stream ); { decode filename (ANSI/OEM/UTF-8) } if FItemInfo.IsUTF8 then FFileName := FItemInfo.FileName else if FItemInfo.ExtraField.Get(Ab_InfoZipUnicodePathSubfieldID, Pointer(InfoZipField), FieldSize) and (FieldSize > SizeOf(TInfoZipUnicodePathRec)) and (InfoZipField.Version = 1) and (InfoZipField.NameCRC32 = AbCRC32Of(FItemInfo.FileName)) then begin SetString(UTF8Name, InfoZipField.UnicodeName, FieldSize - SizeOf(TInfoZipUnicodePathRec) + 1); FFileName := UTF8Name; end else if FItemInfo.ExtraField.Get(Ab_XceedUnicodePathSubfieldID, Pointer(XceedField), FieldSize) and (FieldSize > SizeOf(TXceedUnicodePathRec)) and (XceedField.Signature = Ab_XceedUnicodePathSignature) and (XceedField.Length * SizeOf(WideChar) = FieldSize - SizeOf(TXceedUnicodePathRec) + SizeOf(WideChar)) then begin SetString(UnicodeName, XceedField.UnicodeName, XceedField.Length); FFileName := UTF8Encode(UnicodeName); end else begin SystemCode := HostOS; {$IF DEFINED(MSWINDOWS)} if (GetACP <> GetOEMCP) and (SystemCode = hosDOS) then FFileName := CeOemToUtf8(FItemInfo.FileName) else if (GetACP <> GetOEMCP) and CeTryDecode(FItemInfo.FileName, CP_OEMCP, UnicodeName) then FFileName := UTF8Encode(UnicodeName) else if (SystemCode = hosNTFS) or (SystemCode = hosWinNT) then FFileName := CeAnsiToUtf8(FItemInfo.FileName) else {$ELSEIF DEFINED(UNIX)} if (SystemCode = hosDOS) then FFileName := CeOemToUtf8(FItemInfo.FileName) else if (SystemCode = hosNTFS) or (SystemCode = hosWinNT) then FFileName := CeAnsiToUtf8(FItemInfo.FileName) else {$ENDIF} FFileName := FItemInfo.FileName; end; { read ZIP64 extended header } FUncompressedSize := FItemInfo.UncompressedSize; FCompressedSize := FItemInfo.CompressedSize; FRelativeOffset := FItemInfo.RelativeOffset; FDiskNumberStart := FItemInfo.DiskNumberStart; if FItemInfo.ExtraField.GetStream(Ab_Zip64SubfieldID, FieldStream) then try if FItemInfo.UncompressedSize = $FFFFFFFF then FieldStream.ReadBuffer(FUncompressedSize, SizeOf(Int64)); if FItemInfo.CompressedSize = $FFFFFFFF then FieldStream.ReadBuffer(FCompressedSize, SizeOf(Int64)); if FItemInfo.RelativeOffset = $FFFFFFFF then FieldStream.ReadBuffer(FRelativeOffset, SizeOf(Int64)); if FItemInfo.DiskNumberStart = $FFFF then FieldStream.ReadBuffer(FDiskNumberStart, SizeOf(LongWord)); finally FieldStream.Free; end; LastModFileTime := FItemInfo.LastModFileTime; LastModFileDate := FItemInfo.LastModFileDate; FDiskFileName := FileName; AbUnfixName( FDiskFileName ); Action := aaNone; Tagged := False; end; { -------------------------------------------------------------------------- } procedure TAbZipItem.SaveLFHToStream( Stream : TStream ); var LFH : TAbZipLocalFileHeader; Zip64Field: TZip64LocalHeaderRec; begin LFH := TAbZipLocalFileHeader.Create; try LFH.VersionNeededToExtract := VersionNeededToExtract; LFH.GeneralPurposeBitFlag := GeneralPurposeBitFlag; LFH.CompressionMethod := CompressionMethod; LFH.LastModFileTime := LastModFileTime; LFH.LastModFileDate := LastModFileDate; LFH.CRC32 := CRC32; LFH.FileName := RawFileName; LFH.ExtraField.Assign(LFHExtraField); LFH.ExtraField.CloneFrom(ExtraField, Ab_InfoZipUnicodePathSubfieldID); LFH.ExtraField.CloneFrom(ExtraField, Ab_XceedUnicodePathSubfieldID); { setup sizes; unlike the central directory header, the ZIP64 local header needs to store both compressed and uncompressed sizes if either needs it } if (CompressedSize >= $FFFFFFFF) or (UncompressedSize >= $FFFFFFFF) then begin LFH.UncompressedSize := $FFFFFFFF; LFH.CompressedSize := $FFFFFFFF; Zip64Field.UncompressedSize := UncompressedSize; Zip64Field.CompressedSize := CompressedSize; LFH.ExtraField.Put(Ab_Zip64SubfieldID, Zip64Field, SizeOf(Zip64Field)); end else begin LFH.UncompressedSize := UncompressedSize; LFH.CompressedSize := CompressedSize; LFH.ExtraField.Delete(Ab_Zip64SubfieldID); end; LFH.SaveToStream( Stream ); finally LFH.Free; end; end; { -------------------------------------------------------------------------- } procedure TAbZipItem.SaveCDHToStream( Stream : TStream ); {-Save a ZipCentralDirectorHeader entry to Stream} begin FItemInfo.SaveToStream( Stream ); end; { -------------------------------------------------------------------------- } procedure TAbZipItem.SaveDDToStream( Stream : TStream ); var DD : TAbZipDataDescriptor; begin DD := TAbZipDataDescriptor.Create; try DD.CRC32 := CRC32; DD.CompressedSize := CompressedSize; DD.UncompressedSize := UncompressedSize; DD.SaveToStream( Stream ); finally DD.Free; end; end; { -------------------------------------------------------------------------- } procedure TAbZipItem.SetCompressedSize( const Value : Int64 ); begin FCompressedSize := Value; FItemInfo.CompressedSize := Min(Value, $FFFFFFFF); UpdateZip64ExtraHeader; end; { -------------------------------------------------------------------------- } procedure TAbZipItem.SetCompressionMethod( Value : TAbZipCompressionMethod ); begin FItemInfo.CompressionMethod := Value; UpdateVersionNeededToExtract; end; { -------------------------------------------------------------------------- } procedure TAbZipItem.SetCRC32( const Value : Longint ); begin FItemInfo.CRC32 := Value; end; { -------------------------------------------------------------------------- } procedure TAbZipItem.SetDiskNumberStart( Value : LongWord ); begin FDiskNumberStart := Value; FItemInfo.DiskNumberStart := Min(Value, $FFFF); UpdateZip64ExtraHeader; end; { -------------------------------------------------------------------------- } procedure TAbZipItem.SetExternalFileAttributes( Value : LongWord ); begin FItemInfo.ExternalFileAttributes := Value; end; { -------------------------------------------------------------------------- } procedure TAbZipItem.SetFileComment(const Value : AnsiString ); begin FItemInfo.FileComment := Value; end; { -------------------------------------------------------------------------- } {$IFDEF KYLIX}{$IFOPT O+}{$DEFINE OPTIMIZATIONS_ON}{$O-}{$ENDIF}{$ENDIF} procedure TAbZipItem.SetFileName(const Value : string ); var {$IFDEF MSWINDOWS} AnsiName : AnsiString; {$ENDIF} UTF8Name : UTF8String; FieldSize : Word; I : Integer; InfoZipField : PInfoZipUnicodePathRec; UseExtraField: Boolean; begin inherited SetFileName(Value); {$IFDEF MSWINDOWS} FItemInfo.IsUTF8 := False; HostOS := hosDOS; if CeTryEncode(UTF8Decode(Value), CP_OEMCP, False, AnsiName) then {no-op} else if (GetACP <> GetOEMCP) and CeTryEncode(UTF8Decode(Value), CP_ACP, False, AnsiName) then HostOS := hosWinNT else FItemInfo.IsUTF8 := True; if FItemInfo.IsUTF8 then FItemInfo.FileName := Value else FItemInfo.FileName := AnsiName; {$ENDIF} {$IFDEF UNIX} FItemInfo.FileName := Value; FItemInfo.IsUTF8 := SystemEncodingUtf8; {$ENDIF} UseExtraField := False; if not FItemInfo.IsUTF8 then for i := 1 to Length(Value) do begin if Ord(Value[i]) > 127 then begin UseExtraField := True; Break; end; end; if UseExtraField then begin UTF8Name := Value; FieldSize := SizeOf(TInfoZipUnicodePathRec) + Length(UTF8Name) - 1; GetMem(InfoZipField, FieldSize); try InfoZipField.Version := 1; InfoZipField.NameCRC32 := AbCRC32Of(FItemInfo.FileName); Move(UTF8Name[1], InfoZipField.UnicodeName, Length(UTF8Name)); FItemInfo.ExtraField.Put(Ab_InfoZipUnicodePathSubfieldID, InfoZipField^, FieldSize); finally FreeMem(InfoZipField); end; end else FItemInfo.ExtraField.Delete(Ab_InfoZipUnicodePathSubfieldID); FItemInfo.ExtraField.Delete(Ab_XceedUnicodePathSubfieldID); end; {$IFDEF OPTIMIZATIONS_ON}{$O+}{$ENDIF} { -------------------------------------------------------------------------- } procedure TAbZipItem.SetGeneralPurposeBitFlag( Value : Word ); begin FItemInfo.GeneralPurposeBitFlag := Value; UpdateVersionNeededToExtract; end; { -------------------------------------------------------------------------- } procedure TAbZipItem.SetHostOS( Value : TAbZipHostOS ); begin FItemInfo.VersionMadeBy := Low(FItemInfo.VersionMadeBy) or Word(Ord(Value)) shl 8; end; { -------------------------------------------------------------------------- } procedure TAbZipItem.SetInternalFileAttributes( Value : Word ); begin FItemInfo.InternalFileAttributes := Value; end; { -------------------------------------------------------------------------- } procedure TAbZipItem.SetLastModFileDate( const Value : Word ); begin FItemInfo.LastModFileDate := Value; end; { -------------------------------------------------------------------------- } procedure TAbZipItem.SetLastModFileTime( const Value : Word ); begin FItemInfo.LastModFileTime := Value; end; { -------------------------------------------------------------------------- } procedure TAbZipItem.SetRelativeOffset( Value : Int64 ); begin FRelativeOffset := Value; FItemInfo.RelativeOffset := Min(Value, $FFFFFFFF); UpdateZip64ExtraHeader; end; { -------------------------------------------------------------------------- } procedure TAbZipItem.SetUncompressedSize( const Value : Int64 ); begin FUncompressedSize := Value; FItemInfo.UncompressedSize:= Min(Value, $FFFFFFFF); UpdateZip64ExtraHeader; end; { -------------------------------------------------------------------------- } procedure TAbZipItem.SetVersionMadeBy( Value : Word ); begin FItemInfo.VersionMadeBy := Value; end; { -------------------------------------------------------------------------- } procedure TAbZipItem.SetVersionNeededToExtract( Value : Word ); begin FItemInfo.VersionNeededToExtract := Value; end; { -------------------------------------------------------------------------- } procedure TAbZipItem.UpdateVersionNeededToExtract; {calculates VersionNeededToExtract and VersionMadeBy based on used features} begin {According to AppNote.txt zipx compression methods should set the Version Needed To Extract to the AppNote version the method was introduced in (e.g., 6.3 for PPMd). Most utilities just set it to 2.0 and rely on the extractor detecting unsupported compression methods, since it's easier to add support for decompression methods without implementing the entire newer spec. } if ExtraField.Has(Ab_Zip64SubfieldID) then VersionNeededToExtract := 45 else if IsDirectory or IsEncrypted or not (CompressionMethod in [cmStored..cmImploded]) then VersionNeededToExtract := 20 else VersionNeededToExtract := 10; VersionMadeBy := (VersionMadeBy and $FF00) + Max(20, VersionNeededToExtract); end; { -------------------------------------------------------------------------- } procedure TAbZipItem.UpdateZip64ExtraHeader; var Changed: Boolean; FieldStream: TMemoryStream; begin FieldStream := TMemoryStream.Create; try if UncompressedSize >= $FFFFFFFF then FieldStream.WriteBuffer(FUncompressedSize, SizeOf(Int64)); if CompressedSize >= $FFFFFFFF then FieldStream.WriteBuffer(FCompressedSize, SizeOf(Int64)); if RelativeOffset >= $FFFFFFFF then FieldStream.WriteBuffer(FRelativeOffset, SizeOf(Int64)); if DiskNumberStart >= $FFFF then FieldStream.WriteBuffer(FDiskNumberStart, SizeOf(LongWord)); Changed := (FieldStream.Size > 0) <> ExtraField.Has(Ab_Zip64SubfieldID); if FieldStream.Size > 0 then ExtraField.Put(Ab_Zip64SubfieldID, FieldStream.Memory^, FieldStream.Size) else ExtraField.Delete(Ab_Zip64SubfieldID); if Changed then UpdateVersionNeededToExtract; finally FieldStream.Free; end; end; { -------------------------------------------------------------------------- } { TAbZipArchive implementation ============================================= } constructor TAbZipArchive.CreateFromStream( aStream : TStream; const ArchiveName : string ); begin inherited CreateFromStream( aStream, ArchiveName ); FCompressionMethodToUse := smBestMethod; FInfo := TAbZipDirectoryFileFooter.Create; StoreOptions := StoreOptions + [soStripDrive]; FDeflationOption := doNormal; FPasswordRetries := AbDefPasswordRetries; FTempDir := ''; SpanningThreshold := AbDefZipSpanningThreshold; end; { -------------------------------------------------------------------------- } destructor TAbZipArchive.Destroy; begin FInfo.Free; FInfo := nil; inherited Destroy; end; { -------------------------------------------------------------------------- } function TAbZipArchive.CreateItem(const SourceFileName : string; const ArchiveDirectory : string): TAbArchiveItem; var FullSourceFileName, FullArchiveFileName: string; begin Result := TAbZipItem.Create; with TAbZipItem( Result ) do begin CompressionMethod := cmDeflated; GeneralPurposeBitFlag := 0; CompressedSize := 0; CRC32 := 0; RelativeOffset := 0; MakeFullNames(SourceFileName, ArchiveDirectory, FullSourceFileName, FullArchiveFileName); if mbDirectoryExists(FullSourceFileName) then begin FullSourceFileName := IncludeTrailingPathDelimiter(FullSourceFileName); end; Result.FileName := FullArchiveFileName; Result.DiskFileName := FullSourceFileName; end; end; { -------------------------------------------------------------------------- } procedure TAbZipArchive.DoExtractHelper(Index : Integer; const NewName : string); begin if Assigned(FExtractHelper) then FExtractHelper(Self, ItemList[Index], NewName) else raise EAbZipNoExtraction.Create; end; { -------------------------------------------------------------------------- } procedure TAbZipArchive.DoExtractToStreamHelper(Index : Integer; aStream : TStream); begin if Assigned(FExtractToStreamHelper) then FExtractToStreamHelper(Self, ItemList[Index], aStream) else raise EAbZipNoExtraction.Create; end; { -------------------------------------------------------------------------- } procedure TAbZipArchive.DoTestHelper(Index : Integer); begin if Assigned(FTestHelper) then FTestHelper(Self, ItemList[Index]) else raise EAbZipNoExtraction.Create; end; { -------------------------------------------------------------------------- } procedure TAbZipArchive.DoInsertHelper(Index : Integer; OutStream : TStream); begin if Assigned(FInsertHelper) then FInsertHelper(Self, ItemList[Index], OutStream) else raise EAbZipNoInsertion.Create; end; { -------------------------------------------------------------------------- } procedure TAbZipArchive.DoInsertFromStreamHelper(Index : Integer; OutStream : TStream); begin if Assigned(FInsertFromStreamHelper) then FInsertFromStreamHelper(Self, ItemList[Index], OutStream, InStream) else raise EAbZipNoInsertion.Create; end; { -------------------------------------------------------------------------- } procedure TAbZipArchive.DoRequestDisk(const AMessage: string; var Abort : Boolean); begin {$IFDEF MSWINDOWS} Abort := Windows.MessageBox( 0, PChar(AMessage), PChar(AbDiskRequestS), MB_TASKMODAL or MB_OKCANCEL ) = IDCANCEL; {$ENDIF} {$IFDEF UnixDialogs} {$IFDEF KYLIX} Abort := QDialogs.MessageDlg(AbDiskRequestS, AMessage, mtWarning, mbOKCancel, 0) = mrCancel; {$ENDIF} {$IFDEF LCL} Abort := Dialogs.MessageDlg(AbDiskRequestS, AMessage, mtWarning, mbOKCancel, 0) = mrCancel; {$ENDIF} {$ELSE} Abort := True; {$ENDIF} end; { -------------------------------------------------------------------------- } procedure TAbZipArchive.DoRequestLastDisk( var Abort : Boolean ); begin Abort := False; if Assigned( FOnRequestLastDisk ) then FOnRequestLastDisk( Self, Abort ) else DoRequestDisk( AbLastDiskRequestS, Abort ); end; { -------------------------------------------------------------------------- } procedure TAbZipArchive.DoRequestNthDisk( Sender: TObject; DiskNumber : Byte; var Abort : Boolean ); begin Abort := False; if Assigned( FOnRequestNthDisk ) then FOnRequestNthDisk( Self, DiskNumber, Abort ) else DoRequestDisk( Format(AbDiskNumRequestS, [DiskNumber]), Abort ); end; { -------------------------------------------------------------------------- } procedure TAbZipArchive.DoRequestBlankDisk(Sender: TObject; var Abort : Boolean ); begin Abort := False; FSpanned := True; if Assigned( FOnRequestBlankDisk ) then FOnRequestBlankDisk( Self, Abort ) else DoRequestDisk( AbBlankDiskS, Abort ); end; { -------------------------------------------------------------------------- } procedure TAbZipArchive.DoRequestImage(Sender: TObject; ImageNumber : Integer; var ImageName : string ; var Abort : Boolean); begin if Assigned(FOnRequestImage) then FOnRequestImage(Self, ImageNumber, ImageName, Abort); end; { -------------------------------------------------------------------------- } procedure TAbZipArchive.ExtractItemAt(Index : Integer; const UseName : string); begin DoExtractHelper(Index, UseName); end; { -------------------------------------------------------------------------- } procedure TAbZipArchive.ExtractItemToStreamAt(Index : Integer; aStream : TStream); begin DoExtractToStreamHelper(Index, aStream); end; { -------------------------------------------------------------------------- } function TAbZipArchive.FixName(const Value : string ) : string; {-changes backslashes to forward slashes} var i : SmallInt; lValue : string; begin lValue := Value; {$IFDEF MSWINDOWS} if DOSMode then begin {Add the base directory to the filename before converting } {the file spec to the short filespec format. } if BaseDirectory <> '' then begin {Does the filename contain a drive or a leading backslash? } if not ((Pos(':', lValue) = 2) or (Pos(AbPathDelim, lValue) = 1)) then {If not, add the BaseDirectory to the filename.} lValue := AbAddBackSlash(BaseDirectory) + lValue; end; lValue := AbGetShortFileSpec( lValue ); end; {$ENDIF MSWINDOWS} {Zip files Always strip the drive path} StoreOptions := StoreOptions + [soStripDrive]; {strip drive stuff} if soStripDrive in StoreOptions then AbStripDrive( lValue ); {check for a leading backslash} if (Length(lValue) > 1) and (lValue[1] = AbPathDelim) then System.Delete( lValue, 1, 1 ); if soStripPath in StoreOptions then begin lValue := ExtractFileName( lValue ); end; if soRemoveDots in StoreOptions then AbStripDots( lValue ); for i := 1 to Length( lValue ) do if lValue[i] = AbDosPathDelim then lValue[i] := AbUnixPathDelim; Result := lValue; end; { -------------------------------------------------------------------------- } function TAbZipArchive.GetItem( Index : Integer ) : TAbZipItem; begin Result := TAbZipItem(FItemList.Items[Index]); end; { -------------------------------------------------------------------------- } function TAbZipArchive.GetSupportsEmptyFolders: Boolean; begin Result := True; end; { -------------------------------------------------------------------------- } function TAbZipArchive.GetZipfileComment : AnsiString; begin Result := FInfo.ZipfileComment; end; { -------------------------------------------------------------------------- } procedure TAbZipArchive.LoadArchive; var Abort : Boolean; TailPosition : int64; Item : TAbZipItem; Progress : Byte; FileSignature : Longint; Zip64Locator : TAbZip64EndOfCentralDirectoryLocator; begin Abort := False; if FStream.Size = 0 then Exit; {Get signature info} FStream.Position := 0; FStream.Read( FileSignature, sizeof( FileSignature ) ); {Get Executable Type; allow non-native stubs} IsExecutable := (LongRec(FileSignature).Lo = Ab_WindowsExeSignature) or (FileSignature = Ab_LinuxExeSignature); { try to locate central directory tail } TailPosition := FindCentralDirectoryTail( FStream ); if (TailPosition = -1) and (FileSignature = Ab_ZipSpannedSetSignature) and FOwnsStream and AbDriveIsRemovable(ArchiveName) then begin while TailPosition = -1 do begin FreeAndNil(FStream); DoRequestLastDisk(Abort); if Abort then begin FStatus := asInvalid; //TODO: Status updates are extremely inconsistent raise EAbUserAbort.Create; end; FStream := TFileStreamEx.Create( ArchiveName, Mode ); TailPosition := FindCentralDirectoryTail( FStream ); end; end; if TailPosition = -1 then begin FStatus := asInvalid; raise EAbZipInvalid.Create; end; { load the ZipDirectoryFileFooter } FInfo.LoadFromStream(FStream); { find Zip64 end of central directory locator; it will usually occur immediately before the standard end of central directory record. the actual Zip64 end of central directory may be on another disk } if FInfo.IsZip64 then begin Dec(TailPosition, SizeOf(Zip64Locator)); repeat if TailPosition < 0 then raise EAbZipInvalid.Create; FStream.Position := TailPosition; FStream.ReadBuffer(Zip64Locator, SizeOf(Zip64Locator)); Dec(TailPosition); until Zip64Locator.Signature = Ab_Zip64EndCentralDirectoryLocatorSignature; { update current image number } FInfo.DiskNumber := Zip64Locator.TotalDisks - 1; end; { setup spanning support and move to the start of the central directory } FSpanned := FInfo.DiskNumber > 0; if FSpanned then begin if FOwnsStream then begin FStream := TAbSpanReadStream.Create( ArchiveName, FInfo.DiskNumber, FStream ); TAbSpanReadStream(FStream).OnRequestImage := DoRequestImage; TAbSpanReadStream(FStream).OnRequestNthDisk := DoRequestNthDisk; if FInfo.IsZip64 then begin TAbSpanReadStream(FStream).SeekImage(Zip64Locator.StartDiskNumber, Zip64Locator.RelativeOffset); FInfo.LoadZip64FromStream(FStream); end; TAbSpanReadStream(FStream).SeekImage(FInfo.StartDiskNumber, FInfo.DirectoryOffset); end else raise EAbZipBadSpanStream.Create; end else begin if FInfo.IsZip64 then begin FStream.Position := Zip64Locator.RelativeOffset; FInfo.LoadZip64FromStream(FStream); end; FStream.Position := FInfo.DirectoryOffset; end; { build Items list from central directory records } FStubSize := High(LongWord); while Count < FInfo.TotalEntries do begin { create new Item } Item := TAbZipItem.Create; try Item.LoadFromStream(FStream); Item.Action := aaNone; FItemList.Add(Item); except Item.Free; raise; end; if IsExecutable and (Item.DiskNumberStart = 0) and (Item.RelativeOffset < FStubSize) then FStubSize := Item.RelativeOffset; Progress := (Count * 100) div FInfo.TotalEntries; DoArchiveProgress( Progress, Abort ); if Abort then begin FStatus := asInvalid; raise EAbUserAbort.Create; end; end; DoArchiveProgress(100, Abort); FIsDirty := False; end; { -------------------------------------------------------------------------- } procedure TAbZipArchive.PutItem( Index : Integer; Value : TAbZipItem ); begin FItemList.Items[Index] := Value; end; { -------------------------------------------------------------------------- } procedure TAbZipArchive.SaveArchive; {builds a new archive and copies it to FStream} var Abort : Boolean; MemStream : TMemoryStream; HasDataDescriptor : Boolean; i : LongWord; LFH : TAbZipLocalFileHeader; NewStream : TStream; WorkingStream : TAbVirtualMemoryStream; CurrItem : TAbZipItem; Progress : Byte; begin if Count = 0 then Exit; {shouldn't be trying to overwrite an existing spanned archive} if Spanned then begin for i := 0 to Pred(Count) do if ItemList[i].Action <> aaFailed then ItemList[i].Action := aaNone; FIsDirty := False; raise EAbZipSpanOverwrite.Create; end; {init new zip archive stream can span only new archives, if SpanningThreshold > 0 or removable drive spanning writes to original location, rather than writing to a temp stream first} if FOwnsStream and (FStream.Size = 0) and not IsExecutable and ((SpanningThreshold > 0) or AbDriveIsRemovable(ArchiveName)) then begin NewStream := TAbSpanWriteStream.Create(ArchiveName, FStream, SpanningThreshold); FStream := nil; TAbSpanWriteStream(NewStream).OnRequestBlankDisk := DoRequestBlankDisk; TAbSpanWriteStream(NewStream).OnRequestImage := DoRequestImage; end else begin NewStream := TAbVirtualMemoryStream.Create; TAbVirtualMemoryStream(NewStream).SwapFileDirectory := FTempDir; end; try {NewStream} {copy the executable stub over to the output} if IsExecutable then NewStream.CopyFrom( FStream, StubSize ) {assume spanned for spanning stream} else if NewStream is TAbSpanWriteStream then NewStream.Write(Ab_ZipSpannedSetSignature, SizeOf(Ab_ZipSpannedSetSignature)); {build new zip archive from existing archive} for i := 0 to pred( Count ) do begin CurrItem := (ItemList[i] as TAbZipItem); FCurrentItem := ItemList[i]; case CurrItem.Action of aaNone, aaMove: begin {just copy the file to new stream} Assert(not (NewStream is TAbSpanWriteStream)); FStream.Position := CurrItem.RelativeOffset; CurrItem.DiskNumberStart := 0; CurrItem.RelativeOffset := NewStream.Position; {toss old local file header} LFH := TAbZipLocalFileHeader.Create; try {LFH} LFH.LoadFromStream( FStream ); if CurrItem.LFHExtraField.Count = 0 then CurrItem.LFHExtraField.Assign(LFH.ExtraField); finally {LFH} LFH.Free; end; {LFH} {write out new local file header and append compressed data} CurrItem.SaveLFHToStream( NewStream ); if (CurrItem.CompressedSize > 0) then NewStream.CopyFrom(FStream, CurrItem.CompressedSize); end; aaDelete: begin {doing nothing omits file from new stream} end; aaAdd, aaFreshen, aaReplace, aaStreamAdd: begin {compress the file and add it to new stream} try WorkingStream := TAbVirtualMemoryStream.Create; try {WorkingStream} WorkingStream.SwapFileDirectory := FTempDir; {compress the file} if (CurrItem.Action = aaStreamAdd) then DoInsertFromStreamHelper(i, WorkingStream) else DoInsertHelper(i, WorkingStream); {write local header} if NewStream is TAbSpanWriteStream then begin MemStream := TMemoryStream.Create; try CurrItem.SaveLFHToStream(MemStream); TAbSpanWriteStream(NewStream).WriteUnspanned( MemStream.Memory^, MemStream.Size); {calculate positions after the write in case it triggered a new span} CurrItem.DiskNumberStart := TAbSpanWriteStream(NewStream).CurrentImage; CurrItem.RelativeOffset := NewStream.Position - MemStream.Size; finally MemStream.Free; end; end else begin CurrItem.DiskNumberStart := 0; CurrItem.RelativeOffset := NewStream.Position; CurrItem.SaveLFHToStream(NewStream); end; {copy compressed data} NewStream.CopyFrom(WorkingStream, 0); if CurrItem.IsEncrypted then CurrItem.SaveDDToStream(NewStream); finally WorkingStream.Free; end; except on E : Exception do begin { Exception was caused by a User Abort and Item Failure should not be called Question: Do we want an New Event when this occurs or should the exception just be re-raised [783614] } if (E is EAbUserAbort) then raise; CurrItem.Action := aaDelete; DoProcessItemFailure(CurrItem, ptAdd, ecFileOpenError, 0); end; end; end; end; { case } { TODO: Check HasDataDescriptior behavior; seems like it's getting written twice for encrypted files } {Now add the data descriptor record to new stream} HasDataDescriptor := (CurrItem.CompressionMethod = cmDeflated) and ((CurrItem.GeneralPurposeBitFlag and AbHasDataDescriptorFlag) <> 0); if (CurrItem.Action <> aaDelete) and HasDataDescriptor then CurrItem.SaveDDToStream(NewStream); Progress := AbPercentage(9 * succ( i ), 10 * Count); DoArchiveSaveProgress(Progress, Abort); DoArchiveProgress(Progress, Abort); if Abort then raise EAbUserAbort.Create; end; {write the central directory} if NewStream is TAbSpanWriteStream then FInfo.DiskNumber := TAbSpanWriteStream(NewStream).CurrentImage else FInfo.DiskNumber := 0; FInfo.StartDiskNumber := FInfo.DiskNumber; FInfo.DirectoryOffset := NewStream.Position; FInfo.DirectorySize := 0; FInfo.EntriesOnDisk := 0; FInfo.TotalEntries := 0; MemStream := TMemoryStream.Create; try {write central directory entries} for i := 0 to Count - 1 do begin if not (FItemList[i].Action in [aaDelete, aaFailed]) then begin (FItemList[i] as TAbZipItem).SaveCDHToStream(MemStream); if NewStream is TAbSpanWriteStream then begin TAbSpanWriteStream(NewStream).WriteUnspanned(MemStream.Memory^, MemStream.Size); {update tail info on span change} if FInfo.DiskNumber <> TAbSpanWriteStream(NewStream).CurrentImage then begin FInfo.DiskNumber := TAbSpanWriteStream(NewStream).CurrentImage; FInfo.EntriesOnDisk := 0; if FInfo.TotalEntries = 0 then begin FInfo.StartDiskNumber := FInfo.DiskNumber; FInfo.DirectoryOffset := NewStream.Position - MemStream.Size; end; end; end else NewStream.WriteBuffer(MemStream.Memory^, MemStream.Size); FInfo.DirectorySize := FInfo.DirectorySize + MemStream.Size; FInfo.EntriesOnDisk := FInfo.EntriesOnDisk + 1; FInfo.TotalEntries := FInfo.TotalEntries + 1; MemStream.Clear; end; end; {append the central directory footer} FInfo.SaveToStream(MemStream, NewStream.Position); if NewStream is TAbSpanWriteStream then begin {update the footer if writing it would trigger a new span} if not TAbSpanWriteStream(NewStream).WriteUnspanned(MemStream.Memory^, MemStream.Size) then begin FInfo.DiskNumber := TAbSpanWriteStream(NewStream).CurrentImage; FInfo.EntriesOnDisk := 0; FInfo.SaveToStream(NewStream); end; end else NewStream.WriteBuffer(MemStream.Memory^, MemStream.Size); finally {MemStream} MemStream.Free; end; {MemStream} FSpanned := (FInfo.DiskNumber > 0); {update output stream} if NewStream is TAbSpanWriteStream then begin {zip has already been written to target location} FStream := TAbSpanWriteStream(NewStream).ReleaseStream; if Spanned then begin {switch to read stream} FStream := TAbSpanReadStream.Create(ArchiveName, FInfo.DiskNumber, FStream); TAbSpanReadStream(FStream).OnRequestImage := DoRequestImage; TAbSpanReadStream(FStream).OnRequestNthDisk := DoRequestNthDisk; end else begin {replace spanned signature} FStream.Position := 0; FStream.Write(Ab_ZipPossiblySpannedSignature, SizeOf(Ab_ZipPossiblySpannedSignature)); end; end else begin {copy new stream to FStream (non-spanned only)} NewStream.Position := 0; if (FStream is TMemoryStream) then TMemoryStream(FStream).LoadFromStream(NewStream) else begin if FOwnsStream then begin {need new stream to write} FreeAndNil(FStream); FStream := TFileStreamEx.Create(FArchiveName, fmOpenReadWrite or fmShareDenyWrite); end; FStream.Size := 0; FStream.Position := 0; FStream.CopyFrom(NewStream, 0) end; end; {update Items list} for i := pred( Count ) downto 0 do begin if FItemList[i].Action = aaDelete then FItemList.Delete( i ) else if FItemList[i].Action <> aaFailed then FItemList[i].Action := aaNone; end; DoArchiveSaveProgress( 100, Abort ); DoArchiveProgress( 100, Abort ); finally {NewStream} NewStream.Free; end; end; { -------------------------------------------------------------------------- } procedure TAbZipArchive.SetZipfileComment(const Value : AnsiString ); begin FInfo.FZipfileComment := Value; FIsDirty := True; end; { -------------------------------------------------------------------------- } procedure TAbZipArchive.TestItemAt(Index : Integer); begin DoTestHelper(Index); end; end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abdfxlat.pas����������������������������������������������0000644�0001750�0001750�00000013032�12014201074�022021� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbDfXlat.pas *} {*********************************************************} {* Deflate length/dist to symbol translator *} {*********************************************************} unit AbDfXlat; {$I AbDefine.inc} interface uses SysUtils; type TAbDfTranslator = class private FBuffer : PAnsiChar; FLenSymbols : PByteArray; {for lengths 3..258} FLongDistSymbols : PByteArray; {for distances 32769..65536 (deflate64)} FMediumDistSymbols : PByteArray; {for distances 257..32768} FShortDistSymbols : PByteArray; {for distances 1..256} protected procedure trBuild; public constructor Create; destructor Destroy; override; function TranslateLength(aLen : integer): integer; function TranslateDistance(aDist : integer) : integer; property LenSymbols : PByteArray read FLenSymbols; property LongDistSymbols : PByteArray read FLongDistSymbols; property MediumDistSymbols : PByteArray read FMediumDistSymbols; property ShortDistSymbols : PByteArray read FShortDistSymbols; end; var AbSymbolTranslator : TAbDfTranslator; implementation uses AbDfBase; {====================================================================} constructor TAbDfTranslator.Create; begin {create the ancestor} inherited Create; {allocate the translation arrays (the buffer *must* be zeroed)} FBuffer := AllocMem(256 + 2 + 256 + 256); FLenSymbols := PByteArray(FBuffer); FLongDistSymbols := PByteArray(FBuffer + 256); FMediumDistSymbols := PByteArray(FBuffer + 256 + 2); FShortDistSymbols := PByteArray(FBuffer + 256 + 2 + 256); {build the translation arrays} trBuild; end; {--------} destructor TAbDfTranslator.Destroy; begin if (FBuffer <> nil) then FreeMem(FBuffer); inherited Destroy; end; {--------} function TAbDfTranslator.TranslateDistance(aDist : integer) : integer; begin {save against dumb programming mistakes} Assert((1 <= aDist) and (aDist <= 65536), 'TAbDfTranslator.Translate: distance should be 1..65536'); {translate the distance} if (aDist <= 256) then Result := FShortDistSymbols[aDist - 1] else if (aDist <= 32768) then Result := FMediumDistSymbols[((aDist - 1) div 128) - 2] else Result := FLongDistSymbols[((aDist - 1) div 16384) - 2]; end; {--------} function TAbDfTranslator.TranslateLength(aLen : integer): integer; begin {save against dumb programming mistakes} Assert((3 <= aLen) and (aLen <= 65536), 'TAbDfTranslator.Translate: length should be 3..65536'); {translate the length} dec(aLen, 3); if (0 <= aLen) and (aLen <= 255) then Result := FLenSymbols[aLen] + 257 else Result := 285; end; {--------} procedure TAbDfTranslator.trBuild; var i : integer; Len : integer; Dist : integer; Value : integer; begin {initialize the length translation array; elements will contain (Symbol - 257) for a given (length - 3)} for i := low(dfc_LengthBase) to pred(high(dfc_LengthBase)) do begin Len := dfc_LengthBase[i] - 3; FLenSymbols[Len] := i; end; FLenSymbols[255] := 285 - 257; Value := -1; for i := 0 to 255 do begin if (Value < FLenSymbols[i]) then Value := FLenSymbols[i] else FLenSymbols[i] := Value; end; {initialize the short distance translation array: it will contain the Symbol for a given (distance - 1) where distance <= 256} for i := 0 to 15 do begin Dist := dfc_DistanceBase[i] - 1; FShortDistSymbols[Dist] := i; end; Value := -1; for i := 0 to 255 do begin if (Value < FShortDistSymbols[i]) then Value := FShortDistSymbols[i] else FShortDistSymbols[i] := Value; end; {initialize the medium distance translation array: it will contain the Symbol for a given (((distance - 1) div 128) - 2) where distance is in the range 256..32768} for i := 16 to 29 do begin Dist := ((dfc_DistanceBase[i] - 1) div 128) - 2; FMediumDistSymbols[Dist] := i; end; Value := -1; for i := 0 to 255 do begin if (Value < FMediumDistSymbols[i]) then Value := FMediumDistSymbols[i] else FMediumDistSymbols[i] := Value; end; {initialize the long distance translation array: it will contain the Symbol for a given ((distance - 1) div 16384) - 2) for distances over 32768 in deflate64} FLongDistSymbols[0] := 30; FLongDistSymbols[1] := 31; end; {====================================================================} initialization AbSymbolTranslator := TAbDfTranslator.Create; finalization AbSymbolTranslator.Free; end. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abdfcrys.pas����������������������������������������������0000644�0001750�0001750�00000045367�12014201074�022051� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbDfCryS.pas *} {*********************************************************} {* Deflate encryption streams *} {*********************************************************} unit AbDfCryS; {$I AbDefine.inc} interface uses Classes; type TAbZipEncryptHeader = array [0..11] of byte; TAbZipDecryptEngine = class private FReady : boolean; FState : array [0..2] of longint; protected procedure zdeInitState(const aPassphrase : AnsiString); public constructor Create; function Decode(aCh : byte) : byte; {-decodes a byte} procedure DecodeBuffer(var aBuffer; aCount : integer); {-decodes a buffer} function VerifyHeader(const aHeader : TAbZipEncryptHeader; const aPassphrase : AnsiString; aCheckValue : longint) : boolean; {-validate an encryption header} end; TAbDfDecryptStream = class(TStream) private FCheckValue : longint; FEngine : TAbZipDecryptEngine; FOwnsStream : Boolean; FPassphrase : AnsiString; FReady : boolean; FStream : TStream; protected public constructor Create(aStream : TStream; aCheckValue : longint; const aPassphrase : AnsiString); destructor Destroy; override; function IsValid : boolean; function Read(var aBuffer; aCount : longint) : longint; override; function Seek(aOffset : longint; aOrigin : word) : longint; override; function Write(const aBuffer; aCount : longint) : longint; override; property OwnsStream : Boolean read FOwnsStream write FOwnsStream; end; TAbZipEncryptEngine = class private FReady : boolean; FState : array [0..2] of longint; protected procedure zeeInitState(const aPassphrase : AnsiString); public constructor Create; function Encode(aCh : byte) : byte; {-encodes a byte} procedure EncodeBuffer(var aBuffer; aCount : integer); {-encodes a buffer} procedure CreateHeader(var aHeader : TAbZipEncryptHeader; const aPassphrase : AnsiString; aCheckValue : longint); {-generate an encryption header} end; TAbDfEncryptStream = class(TStream) private FBuffer : PAnsiChar; FBufSize : integer; FEngine : TAbZipEncryptEngine; FStream : TStream; protected public constructor Create(aStream : TStream; aCheckValue : longint; const aPassphrase : AnsiString); destructor Destroy; override; function Read(var aBuffer; aCount : longint) : longint; override; function Seek(aOffset : longint; aOrigin : word) : longint; override; function Write(const aBuffer; aCount : longint) : longint; override; end; implementation {Notes: the ZIP spec defines a couple of primitive routines for performing encryption. For speed Abbrevia inlines them into the respective methods of the encryption/decryption engines char crc32(long,char) return updated CRC from current CRC and next char update_keys(char): Key(0) <- crc32(key(0),char) Key(1) <- Key(1) + (Key(0) & 000000ffH) Key(1) <- Key(1) * 134775813 + 1 Key(2) <- crc32(key(2),key(1) >> 24) end update_keys char decrypt_byte() local unsigned short temp temp <- Key(2) | 2 decrypt_byte <- (temp * (temp ^ 1)) >> 8 end decrypt_byte } uses AbUtils; {---magic numbers from ZIP spec---} const StateInit1 = 305419896; StateInit2 = 591751049; StateInit3 = 878082192; MagicNumber = 134775813; {===internal encryption class========================================} constructor TAbZipDecryptEngine.Create; begin {create the ancestor} inherited Create; {we're not ready for decryption yet since a header hasn't been properly verified with VerifyHeader} FReady := false; end; {--------} function TAbZipDecryptEngine.Decode(aCh : byte) : byte; var Temp : longint; begin {check for programming error} Assert(FReady, 'TAbZipDecryptEngine.Decode: must successfully call VerifyHeader first'); {calculate the decoded byte (uses inlined decrypt_byte)} Temp := (FState[2] and $FFFF) or 2; Result := aCh xor ((Temp * (Temp xor 1)) shr 8); {mix the decoded byte into the state (uses inlined update_keys)} FState[0] := AbUpdateCrc32(Result, FState[0]); FState[1] := FState[1] + (FState[0] and $FF); FState[1] := (FState[1] * MagicNumber) + 1; FState[2] := AbUpdateCrc32(FState[1] shr 24, FState[2]); end; {--------} procedure TAbZipDecryptEngine.DecodeBuffer(var aBuffer; aCount : integer); var i : integer; Temp : longint; Buffer : PAnsiChar; WorkState : array [0..2] of longint; begin {check for programming error} Assert(FReady, 'TAbZipDecryptEngine.Decode: must successfully call VerifyHeader first'); {move the state to a local variable--for better speed} WorkState[0] := FState[0]; WorkState[1] := FState[1]; WorkState[2] := FState[2]; {reference the buffer as a PChar--easier arithmetic} Buffer := @aBuffer; {for each byte in the buffer...} for i := 0 to pred(aCount) do begin {calculate the next decoded byte (uses inlined decrypt_byte)} Temp := (WorkState[2] and $FFFF) or 2; Buffer^ := AnsiChar( byte(Buffer^) xor ((Temp * (Temp xor 1)) shr 8)); {mix the decoded byte into the state (uses inlined update_keys)} WorkState[0] := AbUpdateCrc32(byte(Buffer^), WorkState[0]); WorkState[1] := WorkState[1] + (WorkState[0] and $FF); WorkState[1] := (WorkState[1] * MagicNumber) + 1; WorkState[2] := AbUpdateCrc32(WorkState[1] shr 24, WorkState[2]); {move onto the next byte} inc(Buffer); end; {save the state} FState[0] := WorkState[0]; FState[1] := WorkState[1]; FState[2] := WorkState[2]; end; {--------} function TAbZipDecryptEngine.VerifyHeader(const aHeader : TAbZipEncryptHeader; const aPassphrase : AnsiString; aCheckValue : longint) : boolean; type TLongAsBytes = packed record L1, L2, L3, L4 : byte end; var i : integer; Temp : longint; WorkHeader : TAbZipEncryptHeader; begin {check for programming errors} Assert(aPassphrase <> '', 'TAbZipDecryptEngine.VerifyHeader: need a passphrase'); {initialize the decryption state} zdeInitState(aPassphrase); {decrypt the bytes in the header} for i := 0 to 11 do begin {calculate the next decoded byte (uses inlined decrypt_byte)} Temp := (FState[2] and $FFFF) or 2; WorkHeader[i] := aHeader[i] xor ((Temp * (Temp xor 1)) shr 8); {mix the decoded byte into the state (uses inlined update_keys)} FState[0] := AbUpdateCrc32(WorkHeader[i], FState[0]); FState[1] := FState[1] + (FState[0] and $FF); FState[1] := (FState[1] * MagicNumber) + 1; FState[2] := AbUpdateCrc32(FState[1] shr 24, FState[2]); end; {the header is valid if the twelfth byte of the decrypted header equals the fourth byte of the check value} Result := WorkHeader[11] = TLongAsBytes(aCheckValue).L4; {note: zips created with PKZIP prior to version 2.0 also checked that the tenth byte of the decrypted header equals the third byte of the check value} FReady := Result; end; {--------} procedure TAbZipDecryptEngine.zdeInitState(const aPassphrase : AnsiString); var i : integer; begin {initialize the decryption state} FState[0] := StateInit1; FState[1] := StateInit2; FState[2] := StateInit3; {mix in the passphrase to the state (uses inlined update_keys)} for i := 1 to length(aPassphrase) do begin FState[0] := AbUpdateCrc32(byte(aPassphrase[i]), FState[0]); FState[1] := FState[1] + (FState[0] and $FF); FState[1] := (FState[1] * MagicNumber) + 1; FState[2] := AbUpdateCrc32(FState[1] shr 24, FState[2]); end; end; {====================================================================} {====================================================================} constructor TAbDfDecryptStream.Create(aStream : TStream; aCheckValue : longint; const aPassphrase : AnsiString); begin {create the ancestor} inherited Create; {save the parameters} FStream := aStream; FCheckValue := aCheckValue; FPassphrase := aPassphrase; {create the decryption engine} FEngine := TAbZipDecryptEngine.Create; end; {--------} destructor TAbDfDecryptStream.Destroy; {new !!.02} begin FEngine.Free; if FOwnsStream then FStream.Free; inherited Destroy; end; {--------} function TAbDfDecryptStream.IsValid : boolean; var Header : TAbZipEncryptHeader; begin {read the header from the stream} FStream.ReadBuffer(Header, sizeof(Header)); {check to see if the decryption engine agrees it's valid} Result := FEngine.VerifyHeader(Header, FPassphrase, FCheckValue); {if it isn't valid, reposition the stream, ready for the next try} if not Result then begin FStream.Seek(-sizeof(Header), soCurrent); FReady := false; end {otherwise, the stream is ready for decrypting data} else FReady := true; end; {--------} function TAbDfDecryptStream.Read(var aBuffer; aCount : longint) : longint; begin {check for programming error} Assert(FReady, 'TAbDfDecryptStream.Read: the stream header has not been verified'); {read the data from the underlying stream} Result := FStream.Read(aBuffer, aCount); {decrypt the data} FEngine.DecodeBuffer(aBuffer, Result); end; {--------} function TAbDfDecryptStream.Seek(aOffset : longint; aOrigin : word) : longint; begin Result := FStream.Seek(aOffset, aOrigin); end; {--------} function TAbDfDecryptStream.Write(const aBuffer; aCount : longint) : longint; begin {check for programming error} Assert(false, 'TAbDfDecryptStream.Write: the stream is read-only'); Result := 0; end; {====================================================================} {===TAbZipEncryptEngine==============================================} constructor TAbZipEncryptEngine.Create; begin {create the ancestor} inherited Create; {we're not ready for encryption yet since a header hasn't been properly generated with CreateHeader} FReady := false; end; {--------} procedure TAbZipEncryptEngine.CreateHeader( var aHeader : TAbZipEncryptHeader; const aPassphrase : AnsiString; aCheckValue : longint); type TLongAsBytes = packed record L1, L2, L3, L4 : byte end; var Ch : byte; i : integer; Temp : longint; WorkHeader : TAbZipEncryptHeader; begin {check for programming errors} Assert(aPassphrase <> '', 'TAbZipEncryptEngine.CreateHeader: need a passphrase'); {set the first ten bytes of the header with random values (in fact, we use a random value for each byte and mix it in with the state)} {initialize the decryption state} zeeInitState(aPassphrase); {for the first ten bytes...} for i := 0 to 9 do begin {get a random value} Ch := Random( 256 ); {calculate the XOR encoding byte (uses inlined decrypt_byte)} Temp := (FState[2] and $FFFF) or 2; Temp := (Temp * (Temp xor 1)) shr 8; {mix the unencoded byte into the state (uses inlined update_keys)} FState[0] := AbUpdateCrc32(Ch, FState[0]); FState[1] := FState[1] + (FState[0] and $FF); FState[1] := (FState[1] * MagicNumber) + 1; FState[2] := AbUpdateCrc32(FState[1] shr 24, FState[2]); {set the current byte of the header} WorkHeader[i] := Ch xor Temp; end; {now encrypt the first ten bytes of the header (this merely sets up the state so that we can encrypt the last two bytes)} {reinitialize the decryption state} zeeInitState(aPassphrase); {for the first ten bytes...} for i := 0 to 9 do begin {calculate the XOR encoding byte (uses inlined decrypt_byte)} Temp := (FState[2] and $FFFF) or 2; Temp := (Temp * (Temp xor 1)) shr 8; {mix the unencoded byte into the state (uses inlined update_keys)} FState[0] := AbUpdateCrc32(WorkHeader[i], FState[0]); FState[1] := FState[1] + (FState[0] and $FF); FState[1] := (FState[1] * MagicNumber) + 1; FState[2] := AbUpdateCrc32(FState[1] shr 24, FState[2]); {set the current byte of the header} WorkHeader[i] := WorkHeader[i] xor Temp; end; {now initialize byte 10 of the header, and encrypt it} Ch := TLongAsBytes(aCheckValue).L3; Temp := (FState[2] and $FFFF) or 2; Temp := (Temp * (Temp xor 1)) shr 8; FState[0] := AbUpdateCrc32(Ch, FState[0]); FState[1] := FState[1] + (FState[0] and $FF); FState[1] := (FState[1] * MagicNumber) + 1; FState[2] := AbUpdateCrc32(FState[1] shr 24, FState[2]); WorkHeader[10] := Ch xor Temp; {now initialize byte 11 of the header, and encrypt it} Ch := TLongAsBytes(aCheckValue).L4; Temp := (FState[2] and $FFFF) or 2; Temp := (Temp * (Temp xor 1)) shr 8; FState[0] := AbUpdateCrc32(Ch, FState[0]); FState[1] := FState[1] + (FState[0] and $FF); FState[1] := (FState[1] * MagicNumber) + 1; FState[2] := AbUpdateCrc32(FState[1] shr 24, FState[2]); WorkHeader[11] := Ch xor Temp; {we're now ready to encrypt} FReady := true; {return the header} aHeader := WorkHeader; end; {--------} function TAbZipEncryptEngine.Encode(aCh : byte) : byte; var Temp : longint; begin {check for programming error} Assert(FReady, 'TAbZipEncryptEngine.Encode: must call CreateHeader first'); {calculate the encoded byte (uses inlined decrypt_byte)} Temp := (FState[2] and $FFFF) or 2; Result := aCh xor (Temp * (Temp xor 1)) shr 8; {mix the unencoded byte into the state (uses inlined update_keys)} FState[0] := AbUpdateCrc32(aCh, FState[0]); FState[1] := FState[1] + (FState[0] and $FF); FState[1] := (FState[1] * MagicNumber) + 1; FState[2] := AbUpdateCrc32(FState[1] shr 24, FState[2]); end; {--------} procedure TAbZipEncryptEngine.EncodeBuffer(var aBuffer; aCount : integer); var Ch : byte; i : integer; Temp : longint; Buffer : PAnsiChar; WorkState : array [0..2] of longint; begin {check for programming error} Assert(FReady, 'TAbZipEncryptEngine.EncodeBuffer: must call CreateHeader first'); {move the state to a local variable--for better speed} WorkState[0] := FState[0]; WorkState[1] := FState[1]; WorkState[2] := FState[2]; {reference the buffer as a PChar--easier arithmetic} Buffer := @aBuffer; {for each byte in the buffer...} for i := 0 to pred(aCount) do begin {calculate the next encoded byte (uses inlined decrypt_byte)} Temp := (WorkState[2] and $FFFF) or 2; Ch := byte(Buffer^); Buffer^ := AnsiChar(Ch xor ((Temp * (Temp xor 1)) shr 8)); {mix the decoded byte into the state (uses inlined update_keys)} WorkState[0] := AbUpdateCrc32(Ch, WorkState[0]); WorkState[1] := WorkState[1] + (WorkState[0] and $FF); WorkState[1] := (WorkState[1] * MagicNumber) + 1; WorkState[2] := AbUpdateCrc32(WorkState[1] shr 24, WorkState[2]); {move onto the next byte} inc(Buffer); end; {save the state} FState[0] := WorkState[0]; FState[1] := WorkState[1]; FState[2] := WorkState[2]; end; {--------} procedure TAbZipEncryptEngine.zeeInitState(const aPassphrase : AnsiString); var i : integer; begin {initialize the decryption state} FState[0] := StateInit1; FState[1] := StateInit2; FState[2] := StateInit3; {mix in the passphrase to the state (uses inlined update_keys)} for i := 1 to length(aPassphrase) do begin FState[0] := AbUpdateCrc32(byte(aPassphrase[i]), FState[0]); FState[1] := FState[1] + (FState[0] and $FF); FState[1] := (FState[1] * MagicNumber) + 1; FState[2] := AbUpdateCrc32(FState[1] shr 24, FState[2]); end; end; {====================================================================} {===TAbDfEncryptStream===============================================} constructor TAbDfEncryptStream.Create(aStream : TStream; aCheckValue : longint; const aPassphrase : AnsiString); var Header : TAbZipEncryptHeader; begin {create the ancestor} inherited Create; {save the stream parameter} FStream := aStream; {create the encryption engine} FEngine := TAbZipEncryptEngine.Create; {generate the encryption header, write it to the stream} FEngine.CreateHeader(Header, aPassphrase, aCheckValue); aStream.WriteBuffer(Header, sizeof(Header)); end; {--------} destructor TAbDfEncryptStream.Destroy; begin {free the internal buffer if used} if (FBuffer <> nil) then FreeMem(FBuffer); {free the engine} FEngine.Free; {destroy the ancestor} inherited Destroy; end; {--------} function TAbDfEncryptStream.Read(var aBuffer; aCount : longint) : longint; begin {check for programming error} Assert(false, 'TAbDfEncryptStream.Read: the stream is write-only'); Result := 0; end; {--------} function TAbDfEncryptStream.Seek(aOffset : longint; aOrigin : word) : longint; begin Result := FStream.Seek(aOffset, aOrigin); end; {--------} function TAbDfEncryptStream.Write(const aBuffer; aCount : longint) : longint; begin {note: since we cannot alter a const parameter, we should copy the data to our own buffer, encrypt it and then write it} {check that our buffer is large enough} if (FBufSize < aCount) then begin if (FBuffer <> nil) then FreeMem(FBuffer); GetMem(FBuffer, aCount); FBufSize := aCount; end; {copy the data to our buffer} Move(aBuffer, FBuffer^, aCount); {encrypt the data in our buffer} FEngine.EncodeBuffer(FBuffer^, aCount); {write the data in our buffer to the underlying stream} Result := FStream.Write(FBuffer^, aCount); end; {====================================================================} end. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abarctyp.pas����������������������������������������������0000644�0001750�0001750�00000211312�12204103540�022042� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbArcTyp.pas *} {*********************************************************} {* ABBREVIA: TABArchive, TABArchiveItem classes *} {*********************************************************} unit AbArcTyp; {$I AbDefine.inc} interface uses {$IFDEF MSWINDOWS} Windows, {$ENDIF MSWINDOWS} Classes, Types, AbUtils; { ===== TAbArchiveItem ====================================================== } type TAbArchiveItem = class(TObject) protected {private} NextItem : TAbArchiveItem; FAction : TAbArchiveAction; FCompressedSize : Int64; FCRC32 : Longint; FDiskFileName : string; FExternalFileAttributes : LongWord; FFileName : string; FIsEncrypted : Boolean; FLastModFileTime : Word; FLastModFileDate : Word; FTagged : Boolean; FUncompressedSize : Int64; protected {property methods} function GetCompressedSize : Int64; virtual; function GetCRC32 : Longint; virtual; function GetDiskPath : string; function GetExternalFileAttributes : LongWord; virtual; function GetFileName : string; virtual; function GetIsDirectory: Boolean; virtual; function GetIsEncrypted : Boolean; virtual; function GetLastModFileDate : Word; virtual; function GetLastModFileTime : Word; virtual; { This depends on in what format the attributes are stored in the archive, to which system they refer (MS-DOS, Unix, etc.) and what system we're running on (compile time). } function GetNativeFileAttributes : LongInt; virtual; { This depends on in what format the date/time is stored in the archive (Unix, MS-DOS, ...) and what system we're running on (compile time). Returns MS-DOS local time on Windows, Unix UTC time on Unix. } function GetNativeLastModFileTime : Longint; virtual; function GetStoredPath : string; function GetUncompressedSize : Int64; virtual; procedure SetCompressedSize(const Value : Int64); virtual; procedure SetCRC32(const Value : Longint); virtual; procedure SetExternalFileAttributes( Value : LongWord ); virtual; procedure SetFileName(const Value : string); virtual; procedure SetIsEncrypted(Value : Boolean); virtual; procedure SetLastModFileDate(const Value : Word); virtual; procedure SetLastModFileTime(const Value : Word); virtual; procedure SetUncompressedSize(const Value : Int64); virtual; function GetLastModTimeAsDateTime: TDateTime; virtual; procedure SetLastModTimeAsDateTime(const Value: TDateTime); virtual; public {methods} constructor Create; destructor Destroy; override; function MatchesDiskName(const FileMask : string) : Boolean; function MatchesStoredName(const FileMask : string) : Boolean; function MatchesStoredNameEx(const FileMask : string) : Boolean; public {properties} property Action : TAbArchiveAction read FAction write FAction; property CompressedSize : Int64 read GetCompressedSize write SetCompressedSize; property CRC32 : Longint read GetCRC32 write SetCRC32; property DiskFileName : string read FDiskFileName write FDiskFileName; property DiskPath : string read GetDiskPath; property ExternalFileAttributes : LongWord read GetExternalFileAttributes write SetExternalFileAttributes; property FileName : string read GetFileName write SetFileName; property IsDirectory: Boolean read GetIsDirectory; property IsEncrypted : Boolean read GetIsEncrypted write SetIsEncrypted; property LastModFileDate : Word read GetLastModFileDate write SetLastModFileDate; property LastModFileTime : Word read GetLastModFileTime write SetLastModFileTime; property NativeFileAttributes : LongInt read GetNativeFileAttributes; property NativeLastModFileTime : Longint read GetNativeLastModFileTime; property StoredPath : string read GetStoredPath; property Tagged : Boolean read FTagged write FTagged; property UncompressedSize : Int64 read GetUncompressedSize write SetUncompressedSize; property LastModTimeAsDateTime : TDateTime read GetLastModTimeAsDateTime write SetLastModTimeAsDateTime; end; { ===== TAbArchiveListEnumerator ============================================ } type TAbArchiveList = class; TAbArchiveListEnumerator = class private FIndex: Integer; FList: TAbArchiveList; public constructor Create(aList: TAbArchiveList); function GetCurrent: TAbArchiveItem; function MoveNext: Boolean; property Current: TAbArchiveItem read GetCurrent; end; { ===== TAbArchiveList ====================================================== } TAbArchiveList = class protected {private} FList : TList; FOwnsItems: Boolean; HashTable : array[0..1020] of TAbArchiveItem; protected {methods} function GenerateHash(const S : string) : LongInt; function GetCount : Integer; function Get(Index : Integer) : TAbArchiveItem; procedure Put(Index : Integer; Item : TAbArchiveItem); public {methods} constructor Create(AOwnsItems: Boolean); destructor Destroy; override; function Add(Item : Pointer): Integer; procedure Clear; procedure Delete(Index : Integer); function Find(const FN : string) : Integer; function GetEnumerator: TAbArchiveListEnumerator; function IsActiveDupe(const FN : string) : Boolean; public {properties} property Count : Integer read GetCount; property Items[Index : Integer] : TAbArchiveItem read Get write Put; default; end; { ===== TAbArchive specific types =========================================== } type TAbStoreOption = (soStripDrive, soStripPath, soRemoveDots, soRecurse, soFreshen, soReplace); TAbStoreOptions = set of TAbStoreOption; TAbExtractOption = (eoCreateDirs, eoRestorePath); TAbExtractOptions = set of TAbExtractOption; TAbArchiveStatus = (asInvalid, asIdle, asBusy); TAbArchiveEvent = procedure(Sender : TObject) of object; TAbArchiveConfirmEvent = procedure (Sender : TObject; var Confirm : Boolean) of object; TAbArchiveProgressEvent = procedure(Sender : TObject; Progress : Byte; var Abort : Boolean) of object; TAbArchiveItemEvent = procedure(Sender : TObject; Item : TAbArchiveItem) of object; TAbArchiveItemConfirmEvent = procedure(Sender : TObject; Item : TAbArchiveItem; ProcessType : TAbProcessType; var Confirm : Boolean) of object; TAbConfirmOverwriteEvent = procedure(var Name : string; var Confirm : Boolean) of object; TAbArchiveItemFailureEvent = procedure(Sender : TObject; Item : TAbArchiveItem; ProcessType : TAbProcessType; ErrorClass : TAbErrorClass; ErrorCode : Integer) of object; TAbArchiveItemExtractEvent = procedure(Sender : TObject; Item : TAbArchiveItem; const NewName : string) of object; TAbArchiveItemExtractToStreamEvent = procedure(Sender : TObject; Item : TAbArchiveItem; OutStream : TStream) of object; TAbArchiveItemTestEvent = procedure(Sender : TObject; Item : TAbArchiveItem) of object; TAbArchiveItemInsertEvent = procedure(Sender : TObject; Item : TAbArchiveItem; OutStream : TStream) of object; TAbArchiveItemInsertFromStreamEvent = procedure(Sender : TObject; Item : TAbArchiveItem; OutStream, InStream : TStream) of object; TAbArchiveItemProgressEvent = procedure(Sender : TObject; Item : TAbArchiveItem; Progress : Byte; var Abort : Boolean) of object; TAbProgressEvent = procedure(Progress : Byte; var Abort : Boolean) of object; TAbRequestDiskEvent = procedure(Sender : TObject; var Abort : Boolean) of object; TAbRequestImageEvent = procedure(Sender : TObject; ImageNumber : Integer; var ImageName : string; var Abort : Boolean) of object; TAbRequestNthDiskEvent = procedure(Sender : TObject; DiskNumber : Byte; var Abort : Boolean) of object; type TAbArchiveStreamHelper = class protected FStream : TStream; public constructor Create(AStream : TStream); procedure ExtractItemData(AStream : TStream); virtual; abstract; function FindFirstItem : Boolean; virtual; abstract; function FindNextItem : Boolean; virtual; abstract; procedure ReadHeader; virtual; abstract; procedure ReadTail; virtual; abstract; function SeekItem(Index : Integer): Boolean; virtual; abstract; procedure WriteArchiveHeader; virtual; abstract; procedure WriteArchiveItem(AStream : TStream); virtual; abstract; procedure WriteArchiveTail; virtual; abstract; function GetItemCount : Integer; virtual; abstract; end; { ===== TAbArchive ========================================================== } type TAbArchive = class(TObject) public FStream : TStream; FStatus : TAbArchiveStatus; protected {property variables} //These break Encapsulation FArchiveName : string; FAutoSave : Boolean; FBaseDirectory : string; FCurrentItem : TAbArchiveItem; FDOSMode : Boolean; FExtractOptions : TAbExtractOptions; FImageNumber : Word; FInStream : TStream; FIsDirty : Boolean; FSpanningThreshold : Int64; FItemList : TAbArchiveList; FLogFile : string; FLogging : Boolean; FLogStream : TFileStream; FMode : Word; FOwnsStream : Boolean; FSpanned : Boolean; FStoreOptions : TAbStoreOptions; FTempDir : string; protected {event variables} FOnProcessItemFailure : TAbArchiveItemFailureEvent; FOnArchiveProgress : TAbArchiveProgressEvent; FOnArchiveSaveProgress : TAbArchiveProgressEvent; FOnArchiveItemProgress : TAbArchiveItemProgressEvent; FOnConfirmProcessItem : TAbArchiveItemConfirmEvent; FOnConfirmOverwrite : TAbConfirmOverwriteEvent; FOnConfirmSave : TAbArchiveConfirmEvent; FOnLoad : TAbArchiveEvent; FOnProgress : TAbProgressEvent; FOnRequestImage : TAbRequestImageEvent; FOnSave : TAbArchiveEvent; protected {methods} constructor CreateInit; procedure CheckValid; function ConfirmPath(Item : TAbArchiveItem; const NewName : string; out UseName : string) : Boolean; procedure FreshenAt(Index : Integer); function FreshenRequired(Item : TAbArchiveItem) : Boolean; procedure GetFreshenTarget(Item : TAbArchiveItem); function GetItemCount : Integer; procedure MakeLogEntry(const FN: string; LT : TAbLogType); procedure MakeFullNames(const SourceFileName: String; const ArchiveDirectory: String; out FullSourceFileName: String; out FullArchiveFileName: String); procedure ReplaceAt(Index : Integer); procedure SaveIfNeeded(aItem : TAbArchiveItem); procedure SetBaseDirectory(Value : string); procedure SetLogFile(const Value : string); procedure SetLogging(Value : Boolean); protected {abstract methods} function CreateItem(const SourceFileName : string; const ArchiveDirectory : string): TAbArchiveItem; {SourceFileName - full or relative path to a file/dir on some file system If full path, BaseDirectory is used to determine relative path} {ArchiveDirectory - path to a directory in the archive the file/dir will be in} {Example: FBaseDirectory = /dir SourceFileName = /dir/subdir/file ArchiveDirectory = files/storage (or files/storage/) -> name in archive = files/storage/subdir/file} virtual; abstract; overload; function CreateItem(const FileSpec : string): TAbArchiveItem; overload; procedure ExtractItemAt(Index : Integer; const UseName : string); virtual; abstract; procedure ExtractItemToStreamAt(Index : Integer; aStream : TStream); virtual; abstract; procedure LoadArchive; virtual; abstract; procedure SaveArchive; virtual; abstract; procedure TestItemAt(Index : Integer); virtual; abstract; protected {virtual methods} procedure DoProcessItemFailure(Item : TAbArchiveItem; ProcessType : TAbProcessType; ErrorClass : TAbErrorClass; ErrorCode : Integer); virtual; procedure DoArchiveSaveProgress(Progress : Byte; var Abort : Boolean); virtual; procedure DoArchiveProgress(Progress : Byte; var Abort : Boolean); virtual; procedure DoArchiveItemProgress(Item : TAbArchiveItem; Progress : Byte; var Abort : Boolean); virtual; procedure DoConfirmOverwrite(var FileName : string; var Confirm : Boolean); virtual; procedure DoConfirmProcessItem(Item : TAbArchiveItem; const ProcessType : TAbProcessType; var Confirm : Boolean); virtual; procedure DoConfirmSave(var Confirm : Boolean); virtual; procedure DoLoad; virtual; procedure DoProgress(Progress : Byte; var Abort : Boolean); virtual; procedure DoSave; virtual; function FixName(const Value : string) : string; virtual; function GetSpanningThreshold : Int64; virtual; function GetSupportsEmptyFolders : Boolean; virtual; procedure SetSpanningThreshold( Value : Int64 ); virtual; protected {properties and events} property InStream : TStream read FInStream; public {methods} constructor Create(const FileName : string; Mode : Word); virtual; constructor CreateFromStream(aStream : TStream; const aArchiveName : string); virtual; destructor Destroy; override; procedure Add(aItem : TAbArchiveItem); virtual; procedure AddEntry(const Path : String; const ArchiveDirectory : String); procedure AddFiles(const FileMask : string; SearchAttr : Integer); procedure AddFilesEx(const FileMask, ExclusionMask : string; SearchAttr : Integer); procedure AddFromStream(const NewName : string; aStream : TStream); procedure ClearTags; procedure Delete(aItem : TAbArchiveItem); procedure DeleteAt(Index : Integer); procedure DeleteFiles(const FileMask : string); procedure DeleteFilesEx(const FileMask, ExclusionMask : string); procedure DeleteTaggedItems; procedure Extract(aItem : TAbArchiveItem; const NewName : string); procedure ExtractAt(Index : Integer; const NewName : string); procedure ExtractFiles(const FileMask : string); procedure ExtractFilesEx(const FileMask, ExclusionMask : string); procedure ExtractTaggedItems; procedure ExtractToStream(const aFileName : string; aStream : TStream); function FindFile(const aFileName : string): Integer; function FindItem(aItem : TAbArchiveItem): Integer; procedure Freshen(aItem : TAbArchiveItem); procedure FreshenFiles(const FileMask : string); procedure FreshenFilesEx(const FileMask, ExclusionMask : string); procedure FreshenTaggedItems; procedure Load; virtual; procedure Move(aItem : TAbArchiveItem; const NewStoredPath : string); virtual; procedure Replace(aItem : TAbArchiveItem); procedure Save; virtual; procedure TagItems(const FileMask : string); procedure TestTaggedItems; procedure UnTagItems(const FileMask : string); procedure DoDeflateProgress(aPercentDone : integer); virtual; procedure DoInflateProgress(aPercentDone : integer); virtual; procedure DoSpanningMediaRequest(Sender : TObject; ImageNumber : Integer; var ImageName : string; var Abort : Boolean); virtual; public {properties} property OnProgress : TAbProgressEvent read FOnProgress write FOnProgress; property ArchiveName : string read FArchiveName; property AutoSave : Boolean read FAutoSave write FAutoSave; property BaseDirectory : string read FBaseDirectory write SetBaseDirectory; property Count : Integer read GetItemCount; property DOSMode : Boolean read FDOSMode write FDOSMode; property ExtractOptions : TAbExtractOptions read FExtractOptions write FExtractOptions; property IsDirty : Boolean read FIsDirty write FIsDirty; property ItemList : TAbArchiveList read FItemList; property LogFile : string read FLogFile write SetLogFile; property Logging : Boolean read FLogging write SetLogging; property Mode : Word read FMode; property Spanned : Boolean read FSpanned; property SpanningThreshold : Int64 read GetSpanningThreshold write SetSpanningThreshold; property Status : TAbArchiveStatus read FStatus; property StoreOptions : TAbStoreOptions read FStoreOptions write FStoreOptions; property SupportsEmptyFolders : Boolean read GetSupportsEmptyFolders; property TempDirectory : string read FTempDir write FTempDir; public {events} property OnProcessItemFailure : TAbArchiveItemFailureEvent read FOnProcessItemFailure write FOnProcessItemFailure; property OnArchiveProgress : TAbArchiveProgressEvent read FOnArchiveProgress write FOnArchiveProgress; property OnArchiveSaveProgress : TAbArchiveProgressEvent read FOnArchiveSaveProgress write FOnArchiveSaveProgress; property OnArchiveItemProgress : TAbArchiveItemProgressEvent read FOnArchiveItemProgress write FOnArchiveItemProgress; property OnConfirmProcessItem : TAbArchiveItemConfirmEvent read FOnConfirmProcessItem write FOnConfirmProcessItem; property OnConfirmOverwrite : TAbConfirmOverwriteEvent read FOnConfirmOverwrite write FOnConfirmOverwrite; property OnConfirmSave : TAbArchiveConfirmEvent read FOnConfirmSave write FOnConfirmSave; property OnLoad : TAbArchiveEvent read FOnLoad write FOnLoad; property OnRequestImage : TAbRequestImageEvent read FOnRequestImage write FOnRequestImage; property OnSave : TAbArchiveEvent read FOnSave write FOnSave; end; { ===== TAbExtraField ======================================================= } type PAbExtraSubField = ^TAbExtraSubField; TAbExtraSubField = packed record ID : Word; Len : Word; Data : record end; end; TAbExtraField = class private {fields} FBuffer : TByteDynArray; private {methods} procedure DeleteField(aSubField : PAbExtraSubField); function FindField(aID : Word; out aSubField : PAbExtraSubField) : Boolean; function FindNext(var aCurField : PAbExtraSubField) : Boolean; function GetCount : Integer; function GetID(aIndex : Integer): Word; procedure SetBuffer(const aValue : TByteDynArray); protected {methods} procedure Changed; virtual; public {methods} procedure Assign(aSource : TAbExtraField); procedure Clear; procedure CloneFrom(aSource : TAbExtraField; aID : Word); procedure Delete(aID : Word); function Get(aID : Word; out aData : Pointer; out aDataSize : Word) : Boolean; function GetStream(aID : Word; out aStream : TStream): Boolean; function Has(aID : Word): Boolean; procedure LoadFromStream(aStream : TStream; aSize : Word); procedure Put(aID : Word; const aData; aDataSize : Word); public {properties} property Count : Integer read GetCount; property Buffer : TByteDynArray read FBuffer write SetBuffer; property IDs[aIndex : Integer]: Word read GetID; end; const AbDefAutoSave = False; AbDefExtractOptions = [eoCreateDirs]; AbDefStoreOptions = [soStripDrive, soRemoveDots]; AbBufferSize = 32768; AbLastDisk = -1; AbLastImage = -1; implementation {.$R ABRES.R32} uses RTLConsts, SysUtils, AbExcept, AbDfBase, AbConst, AbResString, DCOSUtils, DCClassesUtf8; { TAbArchiveItem implementation ============================================ } { TAbArchiveItem } constructor TAbArchiveItem.Create; begin inherited Create; FCompressedSize := 0; FUncompressedSize := 0; FFileName := ''; FAction := aaNone; FLastModFileTime := 0; FLastModFileDate := 0; end; { -------------------------------------------------------------------------- } destructor TAbArchiveItem.Destroy; begin inherited Destroy; end; { -------------------------------------------------------------------------- } function TAbArchiveItem.GetCompressedSize : Int64; begin Result := FCompressedSize; end; { -------------------------------------------------------------------------- } function TAbArchiveItem.GetCRC32 : LongInt; begin Result := FCRC32; end; { -------------------------------------------------------------------------- } function TAbArchiveItem.GetDiskPath : string; begin Result := ExtractFilePath(DiskFileName); end; { -------------------------------------------------------------------------- } function TAbArchiveItem.GetExternalFileAttributes : LongWord; begin Result := FExternalFileAttributes; end; { -------------------------------------------------------------------------- } function TAbArchiveItem.GetFileName : string; begin Result := FFileName; end; { -------------------------------------------------------------------------- } function TAbArchiveItem.GetIsDirectory: Boolean; begin Result := False; end; { -------------------------------------------------------------------------- } function TAbArchiveItem.GetIsEncrypted : Boolean; begin Result := FIsEncrypted; end; { -------------------------------------------------------------------------- } function TAbArchiveItem.GetLastModFileTime : Word; begin Result := FLastModFileTime; end; { -------------------------------------------------------------------------- } function TAbArchiveItem.GetLastModFileDate : Word; begin Result := FLastModFileDate; end; { -------------------------------------------------------------------------- } function TAbArchiveItem.GetNativeFileAttributes : LongInt; begin {$IFDEF MSWINDOWS} if IsDirectory then Result := faDirectory else Result := 0; {$ENDIF} {$IFDEF UNIX} if IsDirectory then Result := AB_FPERMISSION_GENERIC or AB_FPERMISSION_OWNEREXECUTE else Result := AB_FPERMISSION_GENERIC; {$ENDIF} end; { -------------------------------------------------------------------------- } function TAbArchiveItem.GetNativeLastModFileTime : Longint; begin LongRec(Result).Hi := LastModFileDate; LongRec(Result).Lo := LastModFileTime; end; { -------------------------------------------------------------------------- } function TAbArchiveItem.GetStoredPath : string; begin Result := ExtractFilePath(DiskFileName); end; { -------------------------------------------------------------------------- } function TAbArchiveItem.GetUnCompressedSize : Int64; begin Result := FUnCompressedSize; end; { -------------------------------------------------------------------------- } function TAbArchiveItem.MatchesDiskName(const FileMask : string) : Boolean; var DiskName, Mask : string; begin DiskName := DiskFileName; AbUnfixName(DiskName); Mask := FileMask; AbUnfixName(Mask); Result := AbFileMatch(DiskName, Mask); end; { -------------------------------------------------------------------------- } function TAbArchiveItem.MatchesStoredName(const FileMask : string) : Boolean; var Value : string; Drive, Dir, Name : string; begin Value := FileMask; AbUnfixName(Value); AbParseFileName(Value, Drive, Dir, Name); Value := Dir + Name; Name := FileName; AbUnfixName(Name); if IsDirectory then Name := ExcludeTrailingPathDelimiter(Name); Result := AbFileMatch(Name, Value); end; { -------------------------------------------------------------------------- } function TAbArchiveItem.MatchesStoredNameEx(const FileMask : string) : Boolean; var I, J: Integer; MaskPart: string; begin Result := True; I := 1; while I <= Length(FileMask) do begin J := I; while (I <= Length(FileMask)) and (FileMask[I] <> PathSep {';'}) do Inc(I); MaskPart := Trim(Copy(FileMask, J, I - J)); if (I <= Length(FileMask)) and (FileMask[I] = PathSep {';'}) then Inc(I); if MatchesStoredName(MaskPart) then Exit; end; Result := False; end; { -------------------------------------------------------------------------- } procedure TAbArchiveItem.SetCompressedSize(const Value : Int64); begin FCompressedSize := Value; end; { -------------------------------------------------------------------------- } procedure TAbArchiveItem.SetCRC32(const Value : LongInt); begin FCRC32 := Value; end; { -------------------------------------------------------------------------- } procedure TAbArchiveItem.SetExternalFileAttributes( Value : LongWord ); begin FExternalFileAttributes := Value; end; { -------------------------------------------------------------------------- } procedure TAbArchiveItem.SetFileName(const Value : string); begin FFileName := Value; end; { -------------------------------------------------------------------------- } procedure TAbArchiveItem.SetIsEncrypted(Value : Boolean); begin FIsEncrypted := Value; end; { -------------------------------------------------------------------------- } procedure TAbArchiveItem.SetLastModFileDate(const Value : Word); begin FLastModFileDate := Value; end; { -------------------------------------------------------------------------- } procedure TAbArchiveItem.SetLastModFileTime(const Value : Word); begin FLastModFileTime := Value; end; { -------------------------------------------------------------------------- } procedure TAbArchiveItem.SetUnCompressedSize(const Value : Int64); begin FUnCompressedSize := Value; end; { -------------------------------------------------------------------------- } function TAbArchiveItem.GetLastModTimeAsDateTime: TDateTime; begin Result := AbDosFileDateToDateTime(LastModFileDate, LastModFileTime); end; { -------------------------------------------------------------------------- } procedure TAbArchiveItem.SetLastModTimeAsDateTime(const Value: TDateTime); var FileDate : Integer; begin FileDate := AbDateTimeToDosFileDate(Value); LastModFileTime := LongRec(FileDate).Lo; LastModFileDate := LongRec(FileDate).Hi; end; { -------------------------------------------------------------------------- } { TAbArchiveEnumeratorList implementation ================================== } { TAbArchiveEnumeratorList } constructor TAbArchiveListEnumerator.Create(aList: TAbArchiveList); begin inherited Create; FIndex := -1; FList := aList; end; { -------------------------------------------------------------------------- } function TAbArchiveListEnumerator.GetCurrent: TAbArchiveItem; begin Result := FList[FIndex]; end; { -------------------------------------------------------------------------- } function TAbArchiveListEnumerator.MoveNext: Boolean; begin Result := FIndex < FList.Count - 1; if Result then Inc(FIndex); end; { -------------------------------------------------------------------------- } { TAbArchiveList implementation ============================================ } { TAbArchiveList } constructor TAbArchiveList.Create(AOwnsItems: Boolean); begin inherited Create; FList := TList.Create; FOwnsItems := AOwnsItems; end; { -------------------------------------------------------------------------- } destructor TAbArchiveList.Destroy; begin Clear; FList.Free; inherited Destroy; end; { -------------------------------------------------------------------------- } function TAbArchiveList.Add(Item : Pointer) : Integer; var H : LongInt; begin if FOwnsItems then begin H := GenerateHash(TAbArchiveItem(Item).FileName); TAbArchiveItem(Item).NextItem := HashTable[H]; HashTable[H] := TAbArchiveItem(Item); end; Result := FList.Add(Item); end; { -------------------------------------------------------------------------- } procedure TAbArchiveList.Clear; var i : Integer; begin if FOwnsItems then for i := 0 to Count - 1 do TObject(FList[i]).Free; FList.Clear; FillChar(HashTable, SizeOf(HashTable), #0); end; { -------------------------------------------------------------------------- } procedure TAbArchiveList.Delete(Index: Integer); var Look : TAbArchiveItem; Last : Pointer; FN : string; begin if FOwnsItems then begin FN := TAbArchiveItem(FList[Index]).FileName; Last := @HashTable[GenerateHash(FN)]; Look := TAbArchiveItem(Last^); while Look <> nil do begin if CompareText(Look.FileName, FN) = 0 then begin Move(Look.NextItem, Last^, 4); Break; end; Last := @Look.NextItem; Look := TAbArchiveItem(Last^); end; TObject(FList[Index]).Free; end; FList.Delete(Index); end; { -------------------------------------------------------------------------- } function TAbArchiveList.Find(const FN : string) : Integer; var Look : TAbArchiveItem; I : Integer; begin if FOwnsItems then begin Look := HashTable[GenerateHash(FN)]; while Look <> nil do begin if CompareText(Look.FileName, FN) = 0 then begin Result := FList.IndexOf(Look); Exit; end; Look := Look.NextItem; end; end else begin for I := 0 to FList.Count - 1 do if CompareText(Items[I].FileName, FN) = 0 then begin Result := I; Exit; end; end; Result := -1; end; { -------------------------------------------------------------------------- } {$IFOPT Q+}{$DEFINE OVERFLOW_CHECKS_ON}{$Q-}{$ENDIF} function TAbArchiveList.GenerateHash(const S : string) : LongInt; var G : LongInt; I : Integer; U : string; begin Result := 0; U := AnsiUpperCase(S); for I := 1 to Length(U) do begin Result := (Result shl 4) + Ord(U[I]); G := LongInt(Result and $F0000000); if (G <> 0) then Result := Result xor (G shr 24); Result := Result and (not G); end; Result := Result mod 1021; end; {$IFDEF OVERFLOW_CHECKS_ON}{$Q+}{$ENDIF} { -------------------------------------------------------------------------- } function TAbArchiveList.Get(Index : Integer): TAbArchiveItem; begin Result := TAbArchiveItem(FList[Index]); end; { -------------------------------------------------------------------------- } function TAbArchiveList.GetCount : Integer; begin Result := FList.Count; end; { -------------------------------------------------------------------------- } function TAbArchiveList.GetEnumerator: TAbArchiveListEnumerator; begin Result := TAbArchiveListEnumerator.Create(Self); end; { -------------------------------------------------------------------------- } function TAbArchiveList.IsActiveDupe(const FN : string) : Boolean; var Look : TAbArchiveItem; I : Integer; begin if FOwnsItems then begin Look := HashTable[GenerateHash(FN)]; while Look <> nil do begin if (CompareText(Look.FileName, FN) = 0) and (Look.Action <> aaDelete) then begin Result := True; Exit; end; Look := Look.NextItem; end; end else begin for I := 0 to Count - 1 do if (CompareText(Items[I].FileName, FN) = 0) and (Items[I].Action <> aaDelete) then begin Result := True; Exit; end; end; Result := False; end; { -------------------------------------------------------------------------- } procedure TAbArchiveList.Put(Index : Integer; Item : TAbArchiveItem); var H : LongInt; Look : TAbArchiveItem; Last : Pointer; FN : string; begin if FOwnsItems then begin FN := TAbArchiveItem(FList[Index]).FileName; Last := @HashTable[GenerateHash(FN)]; Look := TAbArchiveItem(Last^); { Delete old index } while Look <> nil do begin if CompareText(Look.FileName, FN) = 0 then begin Move(Look.NextItem, Last^, 4); Break; end; Last := @Look.NextItem; Look := TAbArchiveItem(Last^); end; { Free old instance } TObject(FList[Index]).Free; { Add new index } H := GenerateHash(TAbArchiveItem(Item).FileName); TAbArchiveItem(Item).NextItem := HashTable[H]; HashTable[H] := TAbArchiveItem(Item); end; { Replace pointer } FList[Index] := Item; end; { TAbArchive implementation ================================================ } { TAbArchive } constructor TAbArchive.CreateInit; begin inherited Create; FIsDirty := False; FAutoSave := False; FItemList := TAbArchiveList.Create(True); StoreOptions := []; ExtractOptions := []; FStatus := asIdle; FOnProgress := DoProgress; // BaseDirectory := ExtractFilePath(ParamStr(0)); end; { -------------------------------------------------------------------------- } constructor TAbArchive.Create(const FileName : string; Mode : Word); {create an archive by opening a filestream on filename with the given mode} begin FOwnsStream := True; CreateFromStream(TFileStreamEx.Create(FileName, Mode), FileName); FMode := Mode; end; { -------------------------------------------------------------------------- } constructor TAbArchive.CreateFromStream(aStream : TStream; const aArchiveName : string); {create an archive based on an existing stream} begin CreateInit; FArchiveName := aArchiveName; FStream := aStream; end; { -------------------------------------------------------------------------- } destructor TAbArchive.Destroy; begin FItemList.Free; if FOwnsStream then FStream.Free; FLogStream.Free; inherited Destroy; end; { -------------------------------------------------------------------------- } procedure TAbArchive.Add(aItem : TAbArchiveItem); var Confirm, ItemAdded : Boolean; begin ItemAdded := False; try CheckValid; if FItemList.IsActiveDupe(aItem.FileName) then begin if (soFreshen in StoreOptions) then Freshen(aItem) else if (soReplace in StoreOptions) then Replace(aItem) else DoProcessItemFailure(aItem, ptAdd, ecAbbrevia, AbDuplicateName); Exit; end; DoConfirmProcessItem(aItem, ptAdd, Confirm); if not Confirm then Exit; aItem.Action := aaAdd; FItemList.Add(aItem); ItemAdded := True; FIsDirty := True; if AutoSave then Save; finally if not ItemAdded then aItem.Free; end; end; { -------------------------------------------------------------------------- } procedure TAbArchive.AddEntry(const Path : String; const ArchiveDirectory : String); var Item : TAbArchiveItem; FullSourceFileName, FullArchiveFileName : String; begin MakeFullNames(Path, ArchiveDirectory, FullSourceFileName, FullArchiveFileName); if (FullSourceFileName <> FArchiveName) then begin Item := CreateItem(Path, ArchiveDirectory); Add(Item); end; end; { -------------------------------------------------------------------------- } procedure TAbArchive.AddFiles(const FileMask : string; SearchAttr : Integer); {Add files to the archive where the disk filespec matches} begin AddFilesEx(FileMask, '', SearchAttr); end; { -------------------------------------------------------------------------- } procedure TAbArchive.AddFilesEx(const FileMask, ExclusionMask : string; SearchAttr : Integer); {Add files matching Filemask except those matching ExclusionMask} var PathType : TAbPathType; IsWild : Boolean; SaveDir : string; Mask : string; MaskF : string; procedure CreateItems(Wild, Recursing : Boolean); var i : Integer; Files : TStrings; FilterList : TStringList; Item : TAbArchiveItem; begin FilterList := TStringList.Create; try if (MaskF <> '') then AbFindFilesEx(MaskF, SearchAttr, FilterList, Recursing); Files := TStringList.Create; try AbFindFilesEx(Mask, SearchAttr, Files, Recursing); if (Files.Count > 0) then for i := 0 to pred(Files.Count) do if FilterList.IndexOf(Files[i]) < 0 then if not Wild then begin if (Files[i] <> FArchiveName) then begin Item := CreateItem(Files[i]); Add(Item); end; end else begin if (AbAddBackSlash(FBaseDirectory) + Files[i]) <> FArchiveName then begin Item := CreateItem(Files[i]); Add(Item); end; end; finally Files.Free; end; finally FilterList.Free; end; end; begin if not SupportsEmptyFolders then SearchAttr := SearchAttr and not faDirectory; CheckValid; IsWild := (Pos('*', FileMask) > 0) or (Pos('?', FileMask) > 0); PathType := AbGetPathType(FileMask); Mask := FileMask; AbUnfixName(Mask); MaskF := ExclusionMask; AbUnfixName(MaskF); case PathType of ptNone, ptRelative : begin GetDir(0, SaveDir); if BaseDirectory <> '' then ChDir(BaseDirectory); try CreateItems(IsWild, soRecurse in StoreOptions); finally if BaseDirectory <> '' then ChDir(SaveDir); end; end; ptAbsolute : begin CreateItems(IsWild, soRecurse in StoreOptions); end; end; end; { -------------------------------------------------------------------------- } procedure TAbArchive.AddFromStream(const NewName : string; aStream : TStream); {Add an item to the archive directly from a TStream descendant} var Confirm : Boolean; Item : TAbArchiveItem; PT : TAbProcessType; begin Item := CreateItem(NewName); CheckValid; PT := ptAdd; if FItemList.IsActiveDupe(NewName) then begin if ((soFreshen in StoreOptions) or (soReplace in StoreOptions)) then begin Item.Free; Item := FItemList[FItemList.Find(NewName)]; PT := ptReplace; end else begin DoProcessItemFailure(Item, ptAdd, ecAbbrevia, AbDuplicateName); Item.Free; Exit; end; end; DoConfirmProcessItem(Item, PT, Confirm); if not Confirm then Exit; FInStream := aStream; Item.Action := aaStreamAdd; if (PT = ptAdd) then FItemList.Add(Item); FIsDirty := True; Save; FInStream := nil; end; { -------------------------------------------------------------------------- } procedure TAbArchive.CheckValid; begin if Status = asInvalid then raise EAbNoArchive.Create; end; { -------------------------------------------------------------------------- } procedure TAbArchive.ClearTags; {Clear all tags from the archive} var i : Integer; begin if Count > 0 then for i := 0 to pred(Count) do TAbArchiveItem(FItemList[i]).Tagged := False; end; { -------------------------------------------------------------------------- } function TAbArchive.ConfirmPath(Item : TAbArchiveItem; const NewName : string; out UseName : string) : Boolean; var Path : string; begin if Item.IsDirectory and not (ExtractOptions >= [eoRestorePath, eoCreateDirs]) then begin Result := False; Exit; end; if (NewName = '') then begin UseName := Item.FileName; AbUnfixName(UseName); if Item.IsDirectory then UseName := ExcludeTrailingPathDelimiter(UseName); if (not (eoRestorePath in ExtractOptions)) then UseName := ExtractFileName(UseName); end else UseName := NewName; if (AbGetPathType(UseName) <> ptAbsolute) then UseName := AbAddBackSlash(BaseDirectory) + UseName; Path := ExtractFileDir(UseName); if (Path <> '') and not mbDirectoryExists(Path) then if (eoCreateDirs in ExtractOptions) then AbCreateDirectory(Path) else raise EAbNoSuchDirectory.Create; Result := True; if not Item.IsDirectory and mbFileExists(UseName) then DoConfirmOverwrite(UseName, Result); end; { -------------------------------------------------------------------------- } procedure TAbArchive.Delete(aItem : TAbArchiveItem); {delete an item from the archive} var Index : Integer; begin CheckValid; Index := FindItem(aItem); if Index <> -1 then DeleteAt(Index); end; { -------------------------------------------------------------------------- } procedure TAbArchive.DeleteAt(Index : Integer); {delete the item at the index from the archive} var Confirm : Boolean; begin CheckValid; SaveIfNeeded(FItemList[Index]); DoConfirmProcessItem(FItemList[Index], ptDelete, Confirm); if not Confirm then Exit; TAbArchiveItem(FItemList[Index]).Action := aaDelete; FIsDirty := True; if AutoSave then Save; end; { -------------------------------------------------------------------------- } procedure TAbArchive.DeleteFiles(const FileMask : string); {delete all files from the archive that match the file mask} begin DeleteFilesEx(FileMask, ''); end; { -------------------------------------------------------------------------- } procedure TAbArchive.DeleteFilesEx(const FileMask, ExclusionMask : string); {Delete files matching Filemask except those matching ExclusionMask} var i : Integer; begin CheckValid; if Count > 0 then begin for i := pred(Count) downto 0 do begin with TAbArchiveItem(FItemList[i]) do if MatchesStoredNameEx(FileMask) then if not MatchesStoredNameEx(ExclusionMask) then DeleteAt(i); end; end; end; { -------------------------------------------------------------------------- } procedure TAbArchive.DeleteTaggedItems; {delete all tagged items from the archive} var i : Integer; begin CheckValid; if Count > 0 then begin for i := pred(Count) downto 0 do begin with TAbArchiveItem(FItemList[i]) do if Tagged then DeleteAt(i); end; end; end; { -------------------------------------------------------------------------- } procedure TAbArchive.DoProcessItemFailure(Item : TAbArchiveItem; ProcessType : TAbProcessType; ErrorClass : TAbErrorClass; ErrorCode : Integer); begin if Assigned(FOnProcessItemFailure) then FOnProcessItemFailure(Self, Item, ProcessType, ErrorClass, ErrorCode); end; { -------------------------------------------------------------------------- } procedure TAbArchive.DoArchiveSaveProgress(Progress : Byte; var Abort : Boolean); begin Abort := False; if Assigned(FOnArchiveSaveProgress) then FOnArchiveSaveProgress(Self, Progress, Abort); end; { -------------------------------------------------------------------------- } procedure TAbArchive.DoArchiveProgress(Progress : Byte; var Abort : Boolean); begin Abort := False; if Assigned(FOnArchiveProgress) then FOnArchiveProgress(Self, Progress, Abort); end; { -------------------------------------------------------------------------- } procedure TAbArchive.DoArchiveItemProgress(Item : TAbArchiveItem; Progress : Byte; var Abort : Boolean); begin Abort := False; if Assigned(FOnArchiveItemProgress) then FOnArchiveItemProgress(Self, Item, Progress, Abort); end; { -------------------------------------------------------------------------- } procedure TAbArchive.DoConfirmOverwrite(var FileName : string; var Confirm : Boolean); begin Confirm := True; if Assigned(FOnConfirmOverwrite) then FOnConfirmOverwrite(FileName, Confirm); end; { -------------------------------------------------------------------------- } procedure TAbArchive.DoConfirmProcessItem(Item : TAbArchiveItem; const ProcessType : TAbProcessType; var Confirm : Boolean); const ProcessTypeToLogType : array[TAbProcessType] of TAbLogType = (ltAdd, ltDelete, ltExtract, ltFreshen, ltMove, ltReplace, ltFoundUnhandled); begin Confirm := True; if Assigned(FOnConfirmProcessItem) then FOnConfirmProcessItem(Self, Item, ProcessType, Confirm); if (Confirm and FLogging) then MakeLogEntry(Item.Filename, ProcessTypeToLogType[ProcessType]); end; { -------------------------------------------------------------------------- } procedure TAbArchive.DoConfirmSave(var Confirm : Boolean); begin Confirm := True; if Assigned(FOnConfirmSave) then FOnConfirmSave(Self, Confirm); end; { -------------------------------------------------------------------------- } procedure TAbArchive.DoDeflateProgress(aPercentDone: integer); var Abort : Boolean; begin DoProgress(aPercentDone, Abort); if Abort then raise EAbAbortProgress.Create(AbUserAbortS); end; { -------------------------------------------------------------------------- } procedure TAbArchive.DoInflateProgress(aPercentDone: integer); var Abort : Boolean; begin DoProgress(aPercentDone, Abort); if Abort then raise EAbAbortProgress.Create(AbUserAbortS); end; { -------------------------------------------------------------------------- } procedure TAbArchive.DoLoad; begin if Assigned(FOnLoad) then FOnLoad(Self); end; { -------------------------------------------------------------------------- } procedure TAbArchive.DoProgress(Progress : Byte; var Abort : Boolean); begin Abort := False; DoArchiveItemProgress(FCurrentItem, Progress, Abort); end; { -------------------------------------------------------------------------- } procedure TAbArchive.DoSave; begin if Assigned(FOnSave) then FOnSave(Self); end; { -------------------------------------------------------------------------- } procedure TAbArchive.Extract(aItem : TAbArchiveItem; const NewName : string); {extract an item from the archive} var Index : Integer; begin CheckValid; Index := FindItem(aItem); if Index <> -1 then ExtractAt(Index, NewName); end; { -------------------------------------------------------------------------- } procedure TAbArchive.ExtractAt(Index : Integer; const NewName : string); {extract an item from the archive at Index} var Confirm : Boolean; ErrorClass : TAbErrorClass; ErrorCode : Integer; UseName : string; begin CheckValid; SaveIfNeeded(FItemList[Index]); DoConfirmProcessItem(FItemList[Index], ptExtract, Confirm); if not Confirm then Exit; if not ConfirmPath(FItemList[Index], NewName, UseName) then Exit; try FCurrentItem := FItemList[Index]; ExtractItemAt(Index, UseName); except on E : Exception do begin AbConvertException(E, ErrorClass, ErrorCode); DoProcessItemFailure(FItemList[Index], ptExtract, ErrorClass, ErrorCode); end; end; end; { -------------------------------------------------------------------------- } procedure TAbArchive.ExtractToStream(const aFileName : string; aStream : TStream); {extract an item from the archive at Index directly to a stream} var Confirm : Boolean; ErrorClass : TAbErrorClass; ErrorCode : Integer; Index : Integer; begin CheckValid; Index := FindFile(aFileName); if (Index = -1) then Exit; SaveIfNeeded(FItemList[Index]); DoConfirmProcessItem(FItemList[Index], ptExtract, Confirm); if not Confirm then Exit; FCurrentItem := FItemList[Index]; try ExtractItemToStreamAt(Index, aStream); except on E : Exception do begin AbConvertException(E, ErrorClass, ErrorCode); DoProcessItemFailure(FItemList[Index], ptExtract, ErrorClass, ErrorCode); end; end; end; { -------------------------------------------------------------------------- } procedure TAbArchive.ExtractFiles(const FileMask : string); {extract all files from the archive that match the mask} begin ExtractFilesEx(FileMask, ''); end; { -------------------------------------------------------------------------- } procedure TAbArchive.ExtractFilesEx(const FileMask, ExclusionMask : string); {Extract files matching Filemask except those matching ExclusionMask} var i : Integer; Abort : Boolean; begin CheckValid; if Count > 0 then begin for i := 0 to pred(Count) do begin with TAbArchiveItem(FItemList[i]) do if MatchesStoredNameEx(FileMask) and not MatchesStoredNameEx(ExclusionMask) and ((eoCreateDirs in ExtractOptions) or not IsDirectory) then ExtractAt(i, ''); DoArchiveProgress(AbPercentage(succ(i), Count), Abort); if Abort then raise EAbUserAbort.Create; end; DoArchiveProgress(100, Abort); end; end; { -------------------------------------------------------------------------- } procedure TAbArchive.ExtractTaggedItems; {extract all tagged items from the archive} var i : Integer; Abort : Boolean; begin CheckValid; if Count > 0 then begin for i := 0 to pred(Count) do begin with TAbArchiveItem(FItemList[i]) do if Tagged then ExtractAt(i, ''); DoArchiveProgress(AbPercentage(succ(i), Count), Abort); if Abort then raise EAbUserAbort.Create; end; DoArchiveProgress(100, Abort); end; end; { -------------------------------------------------------------------------- } procedure TAbArchive.TestTaggedItems; {test all tagged items in the archive} var i : Integer; Abort : Boolean; begin CheckValid; if Count > 0 then begin for i := 0 to pred(Count) do begin with TAbArchiveItem(FItemList[i]) do if Tagged then begin FCurrentItem := FItemList[i]; TestItemAt(i); end; DoArchiveProgress(AbPercentage(succ(i), Count), Abort); if Abort then raise EAbUserAbort.Create; end; DoArchiveProgress(100, Abort); end; end; { -------------------------------------------------------------------------- } function TAbArchive.FindFile(const aFileName : string): Integer; {find the index of the specified file} begin Result := FItemList.Find(aFileName); end; { -------------------------------------------------------------------------- } function TAbArchive.FindItem(aItem : TAbArchiveItem): Integer; {find the index of the specified item} begin Result := FItemList.Find(aItem.FileName); end; { -------------------------------------------------------------------------- } function TAbArchive.FixName(const Value : string) : string; var lValue: string; begin lValue := Value; {$IFDEF MSWINDOWS} if DOSMode then begin {Add the base directory to the filename before converting } {the file spec to the short filespec format. } if BaseDirectory <> '' then begin {Does the filename contain a drive or a leading backslash? } if not ((Pos(':', lValue) = 2) or (Pos(AbPathDelim, lValue) = 1)) then {If not, add the BaseDirectory to the filename.} lValue := AbAddBackSlash(BaseDirectory) + lValue; end; lValue := AbGetShortFileSpec(lValue); end; {$ENDIF} {strip drive stuff} if soStripDrive in StoreOptions then AbStripDrive(lValue); {check for a leading backslash} if lValue[1] = AbPathDelim then System.Delete(lValue, 1, 1); if soStripPath in StoreOptions then begin lValue := ExtractFileName(lValue); end; if soRemoveDots in StoreOptions then AbStripDots(lValue); Result := lValue; end; { -------------------------------------------------------------------------- } procedure TAbArchive.Freshen(aItem : TAbArchiveItem); {freshen the item} var Index : Integer; begin CheckValid; Index := FindItem(aItem); if Index <> -1 then begin FreshenAt(Index); {point existing item at the new file} if AbGetPathType(aItem.DiskFileName) = ptAbsolute then FItemList[Index].DiskFileName := aItem.DiskFileName; end; end; { -------------------------------------------------------------------------- } procedure TAbArchive.FreshenAt(Index : Integer); {freshen item at index} var Confirm : Boolean; FR : Boolean; ErrorClass : TAbErrorClass; ErrorCode : Integer; begin CheckValid; SaveIfNeeded(FItemList[Index]); GetFreshenTarget(FItemList[Index]); FR := False; try FR := FreshenRequired(FItemList[Index]); except on E : Exception do begin AbConvertException(E, ErrorClass, ErrorCode); DoProcessItemFailure(FItemList[Index], ptFreshen, ErrorClass, ErrorCode); end; end; if not FR then Exit; DoConfirmProcessItem(FItemList[Index], ptFreshen, Confirm); if not Confirm then Exit; TAbArchiveItem(FItemList[Index]).Action := aaFreshen; FIsDirty := True; if AutoSave then Save; end; { -------------------------------------------------------------------------- } procedure TAbArchive.FreshenFiles(const FileMask : string); {freshen all items that match the file mask} begin FreshenFilesEx(FileMask, ''); end; { -------------------------------------------------------------------------- } procedure TAbArchive.FreshenFilesEx(const FileMask, ExclusionMask : string); {freshen all items that match the file mask} var i : Integer; begin CheckValid; if Count > 0 then begin for i := pred(Count) downto 0 do begin with TAbArchiveItem(FItemList[i]) do if MatchesStoredNameEx(FileMask) then if not MatchesStoredNameEx(ExclusionMask) then FreshenAt(i); end; end; end; { -------------------------------------------------------------------------- } function TAbArchive.FreshenRequired(Item : TAbArchiveItem) : Boolean; var FS : TFileStreamEx; DateTime : LongInt; FileTime : Word; FileDate : Word; Matched : Boolean; SaveDir : string; begin GetDir(0, SaveDir); if BaseDirectory <> '' then ChDir(BaseDirectory); try FS := TFileStreamEx.Create(Item.DiskFileName, fmOpenRead or fmShareDenyWrite); try DateTime := FileGetDate(FS.Handle); FileTime := LongRec(DateTime).Lo; FileDate := LongRec(DateTime).Hi; Matched := (Item.LastModFileDate = FileDate) and (Item.LastModFileTime = FileTime) and (Item.UncompressedSize = FS.Size); Result := not Matched; finally FS.Free; end; finally if BaseDirectory <> '' then ChDir(SaveDir); end; end; { -------------------------------------------------------------------------- } procedure TAbArchive.FreshenTaggedItems; {freshen all tagged items} var i : Integer; begin CheckValid; if Count > 0 then begin for i := pred(Count) downto 0 do begin with TAbArchiveItem(FItemList[i]) do if Tagged then FreshenAt(i); end; end; end; { -------------------------------------------------------------------------- } procedure TAbArchive.GetFreshenTarget(Item : TAbArchiveItem); var PathType : TAbPathType; Files : TStrings; SaveDir : string; DName : string; begin PathType := AbGetPathType(Item.DiskFileName); if (soRecurse in StoreOptions) and (PathType = ptNone) then begin GetDir(0, SaveDir); if BaseDirectory <> '' then ChDir(BaseDirectory); try Files := TStringList.Create; try // even if archive supports empty folder we don't have to // freshen it because there is no data, although, the timestamp // can be update since the folder was added AbFindFiles(Item.FileName, faAnyFile and not faDirectory, Files, True); if Files.Count > 0 then begin DName := AbAddBackSlash(BaseDirectory) + Files[0]; AbUnfixName(DName); Item.DiskFileName := DName; end else Item.DiskFileName := ''; finally Files.Free; end; finally if BaseDirectory <> '' then ChDir(SaveDir); end; end else begin if (BaseDirectory <> '') then DName := AbAddBackSlash(BaseDirectory) + Item.FileName else if AbGetPathType(Item.DiskFileName) = ptAbsolute then DName := Item.DiskFileName else DName := Item.FileName; AbUnfixName(DName); Item.DiskFileName := DName; end; end; { -------------------------------------------------------------------------- } function TAbArchive.GetSpanningThreshold : Int64; begin Result := FSpanningThreshold; end; { -------------------------------------------------------------------------- } function TAbArchive.GetSupportsEmptyFolders : Boolean; begin Result := False; end; { -------------------------------------------------------------------------- } function TAbArchive.GetItemCount : Integer; begin if Assigned(FItemList) then Result := FItemList.Count else Result := 0; end; { -------------------------------------------------------------------------- } procedure TAbArchive.Load; {load the archive} begin try LoadArchive; FStatus := asIdle; finally DoLoad; end; end; { -------------------------------------------------------------------------- } procedure TAbArchive.MakeLogEntry(const FN: string; LT : TAbLogType); const LogTypeRes : array[TAbLogType] of string = (AbLtAddS, AbLtDeleteS, AbLtExtractS, AbLtFreshenS, AbLtMoveS, AbLtReplaceS, AbLtStartS, AbUnhandledEntityS); var Buf : string; begin if Assigned(FLogStream) then begin Buf := FN + LogTypeRes[LT] + DateTimeToStr(Now) + sLineBreak; FLogStream.Write(Buf[1], Length(Buf) * SizeOf(Char)); end; end; { -------------------------------------------------------------------------- } procedure TAbArchive.MakeFullNames(const SourceFileName: String; const ArchiveDirectory: String; out FullSourceFileName: String; out FullArchiveFileName: String); var PathType : TAbPathType; RelativeSourceFileName: String; begin PathType := AbGetPathType(SourceFileName); case PathType of ptNone, ptRelative : begin if FBaseDirectory <> '' then FullSourceFileName := AbAddBackSlash(FBaseDirectory) + SourceFileName else FullSourceFileName := SourceFileName; RelativeSourceFileName := SourceFileName; end; ptAbsolute : begin FullSourceFileName := SourceFileName; if FBaseDirectory <> '' then RelativeSourceFileName := ExtractRelativepath(AbAddBackSlash(FBaseDirectory), SourceFileName) else RelativeSourceFileName := ExtractFileName(SourceFileName); end; end; if ArchiveDirectory <> '' then FullArchiveFileName := AbAddBackSlash(ArchiveDirectory) + RelativeSourceFileName else FullArchiveFileName := RelativeSourceFileName; FullArchiveFileName := FixName(FullArchiveFileName); end; { -------------------------------------------------------------------------- } procedure TAbArchive.Move(aItem : TAbArchiveItem; const NewStoredPath : string); var Confirm : Boolean; Found : Boolean; i : Integer; FixedPath: string; begin CheckValid; FixedPath := FixName(NewStoredPath); Found := False; if Count > 0 then for i := 0 to pred(Count) do if (ItemList[i] <> aItem) and SameText(FixedPath, ItemList[i].FileName) and (ItemList[i].Action <> aaDelete) then begin Found := True; Break; end; if Found then begin DoProcessItemFailure(aItem, ptMove, ecAbbrevia, AbDuplicateName); {even if something gets done in the AddItemFailure, we don't want to continue...} Exit; end; SaveIfNeeded(aItem); DoConfirmProcessItem(aItem, ptMove, Confirm); if not Confirm then Exit; with aItem do begin FileName := FixedPath; Action := aaMove; end; FIsDirty := True; if AutoSave then Save; end; { -------------------------------------------------------------------------- } procedure TAbArchive.Replace(aItem : TAbArchiveItem); {replace the item} var Index : Integer; begin CheckValid; Index := FindItem(aItem); if Index <> -1 then begin ReplaceAt(Index); {point existing item at the new file} if AbGetPathType(aItem.DiskFileName) = ptAbsolute then FItemList[Index].DiskFileName := aItem.DiskFileName; end; end; { -------------------------------------------------------------------------- } procedure TAbArchive.ReplaceAt(Index : Integer); {replace item at Index} var Confirm : Boolean; begin CheckValid; SaveIfNeeded(FItemList[Index]); GetFreshenTarget(FItemList[Index]); DoConfirmProcessItem(FItemList[Index], ptReplace, Confirm); if not Confirm then Exit; TAbArchiveItem(FItemList[Index]).Action := aaReplace; FIsDirty := True; if AutoSave then Save; end; { -------------------------------------------------------------------------- } procedure TAbArchive.Save; {save the archive} var Confirm : Boolean; begin if Status = asInvalid then Exit; if not FIsDirty then Exit; DoConfirmSave(Confirm); if not Confirm then Exit; SaveArchive; FIsDirty := False; DoSave; end; { -------------------------------------------------------------------------- } procedure TAbArchive.SaveIfNeeded(aItem : TAbArchiveItem); begin if (aItem.Action <> aaNone) then Save; end; { -------------------------------------------------------------------------- } procedure TAbArchive.SetBaseDirectory(Value : string); begin if (Value <> '') then if Value[Length(Value)] = AbPathDelim then if (Length(Value) > 1) and (Value[Length(Value) - 1] <> ':') then System.Delete(Value, Length(Value), 1); if (Length(Value) = 0) or mbDirectoryExists(Value) then FBaseDirectory := Value else raise EAbNoSuchDirectory.Create; end; { -------------------------------------------------------------------------- } procedure TAbArchive.SetSpanningThreshold( Value : Int64 ); begin FSpanningThreshold := Value; end; { -------------------------------------------------------------------------- } procedure TAbArchive.SetLogFile(const Value : string); begin FLogFile := Value; end; { -------------------------------------------------------------------------- } procedure TAbArchive.SetLogging(Value : Boolean); begin FLogging := Value; if Assigned(FLogStream) then begin FLogStream.Free; FLogStream := nil; end; if FLogging and (FLogFile <> '') then begin try FLogStream := TFileStream.Create(FLogFile, fmCreate or fmOpenWrite); MakeLogEntry(FArchiveName, ltStart); except raise EAbException.Create(AbLogCreateErrorS); end; end; end; { -------------------------------------------------------------------------- } procedure TAbArchive.TagItems(const FileMask : string); {tag all items that match the mask} var i : Integer; begin if Count > 0 then for i := 0 to pred(Count) do with TAbArchiveItem(FItemList[i]) do begin if MatchesStoredNameEx(FileMask) then Tagged := True; end; end; { -------------------------------------------------------------------------- } procedure TAbArchive.UnTagItems(const FileMask : string); {clear tags for all items that match the mask} var i : Integer; begin if Count > 0 then for i := 0 to pred(Count) do with TAbArchiveItem(FItemList[i]) do begin if MatchesStoredNameEx(FileMask) then Tagged := False; end; end; { -------------------------------------------------------------------------- } procedure TAbArchive.DoSpanningMediaRequest(Sender: TObject; ImageNumber: Integer; var ImageName: string; var Abort: Boolean); begin raise EAbSpanningNotSupported.Create; end; { -------------------------------------------------------------------------- } function TAbArchive.CreateItem(const FileSpec : string): TAbArchiveItem; begin // This function is used by Abbrevia. We don't use it but a dummy // definition is needed for the code to compile successfully. raise Exception.Create(''); end; { -------------------------------------------------------------------------- } { TAbExtraField implementation ============================================= } procedure TAbExtraField.Assign(aSource : TAbExtraField); begin SetBuffer(aSource.Buffer); end; { -------------------------------------------------------------------------- } procedure TAbExtraField.Changed; begin // No-op end; { -------------------------------------------------------------------------- } procedure TAbExtraField.Clear; begin FBuffer := nil; Changed; end; { -------------------------------------------------------------------------- } procedure TAbExtraField.CloneFrom(aSource : TAbExtraField; aID : Word); var Data : Pointer; DataSize : Word; begin if aSource.Get(aID, Data, DataSize) then Put(aID, Data, DataSize) else Delete(aID); end; { -------------------------------------------------------------------------- } procedure TAbExtraField.Delete(aID : Word); var SubField : PAbExtraSubField; begin if FindField(aID, SubField) then begin DeleteField(SubField); Changed; end; end; { -------------------------------------------------------------------------- } procedure TAbExtraField.DeleteField(aSubField : PAbExtraSubField); var Len, Offset : Integer; begin Len := SizeOf(TAbExtraSubField) + aSubField.Len; Offset := Pointer(aSubField) - Pointer(FBuffer); if Offset + Len < Length(FBuffer) then Move(FBuffer[Offset + Len], aSubField^, Length(FBuffer) - Offset - Len); SetLength(FBuffer, Length(FBuffer) - Len); end; { -------------------------------------------------------------------------- } function TAbExtraField.FindField(aID : Word; out aSubField : PAbExtraSubField) : Boolean; begin Result := False; aSubField := nil; while FindNext(aSubField) do if aSubField.ID = aID then begin Result := True; Break; end; end; { -------------------------------------------------------------------------- } function TAbExtraField.FindNext(var aCurField : PAbExtraSubField) : Boolean; var BytesLeft : Integer; begin if aCurField = nil then begin aCurField := PAbExtraSubField(FBuffer); BytesLeft := Length(FBuffer); end else begin BytesLeft := Length(FBuffer) - (Pointer(aCurField) - Pointer(FBuffer)) - SizeOf(TAbExtraSubField) - aCurField.Len; Inc(Pointer(aCurField), aCurField.Len + SizeOf(TAbExtraSubField)); end; Result := (BytesLeft >= SizeOf(TAbExtraSubField)); if Result and (BytesLeft < SizeOf(TAbExtraSubField) + aCurField.Len) then aCurField.Len := BytesLeft - SizeOf(TAbExtraSubField); end; { -------------------------------------------------------------------------- } function TAbExtraField.Get(aID : Word; out aData : Pointer; out aDataSize : Word) : Boolean; var SubField : PAbExtraSubField; begin Result := FindField(aID, SubField); if Result then begin aData := @SubField.Data; aDataSize := SubField.Len; end else begin aData := nil; aDataSize := 0; end; end; { -------------------------------------------------------------------------- } function TAbExtraField.GetCount : Integer; var SubField : PAbExtraSubField; begin Result := 0; SubField := nil; while FindNext(SubField) do Inc(Result); end; { -------------------------------------------------------------------------- } function TAbExtraField.GetID(aIndex : Integer): Word; var i: Integer; SubField : PAbExtraSubField; begin i := 0; SubField := nil; while FindNext(SubField) do if i = aIndex then begin Result := SubField.ID; Exit; end else Inc(i); raise EListError.CreateFmt(SListIndexError, [aIndex]); end; { -------------------------------------------------------------------------- } function TAbExtraField.GetStream(aID : Word; out aStream : TStream): Boolean; var Data: Pointer; DataSize: Word; begin Result := Get(aID, Data, DataSize); if Result then begin aStream := TMemoryStream.Create; aStream.WriteBuffer(Data^, DataSize); aStream.Position := 0; end; end; { -------------------------------------------------------------------------- } function TAbExtraField.Has(aID : Word): Boolean; var SubField : PAbExtraSubField; begin Result := FindField(aID, SubField); end; { -------------------------------------------------------------------------- } procedure TAbExtraField.LoadFromStream(aStream : TStream; aSize : Word); begin SetLength(FBuffer, aSize); if aSize > 0 then aStream.ReadBuffer( FBuffer[0], aSize); end; { -------------------------------------------------------------------------- } procedure TAbExtraField.Put(aID : Word; const aData; aDataSize : Word); var Offset : Cardinal; SubField : PAbExtraSubField; begin if FindField(aID, SubField) then begin if SubField.Len = aDataSize then begin Move(aData, SubField.Data, aDataSize); Changed; Exit; end else DeleteField(SubField); end; Offset := Length(FBuffer); SetLength(FBuffer, Length(FBuffer) + SizeOf(TAbExtraSubField) + aDataSize); SubField := PAbExtraSubField(@FBuffer[Offset]); SubField.ID := aID; SubField.Len := aDataSize; Move(aData, SubField.Data, aDataSize); Changed; end; { -------------------------------------------------------------------------- } procedure TAbExtraField.SetBuffer(const aValue : TByteDynArray); begin SetLength(FBuffer, Length(aValue)); if Length(FBuffer) > 0 then Move(aValue[0], FBuffer[0], Length(FBuffer)); Changed; end; { -------------------------------------------------------------------------- } { ========================================================================== } { TAbArchiveStreamHelper } constructor TAbArchiveStreamHelper.Create(AStream: TStream); begin if Assigned(AStream) then FStream := AStream else raise Exception.Create('nil stream'); end; end. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/doublecmd.diff��������������������������������������������0000644�0001750�0001750�00000255173�12204103540�022335� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: AbArcTyp.pas =================================================================== --- AbArcTyp.pas (revision 512) +++ AbArcTyp.pas (working copy) @@ -70,7 +70,14 @@ function GetIsEncrypted : Boolean; virtual; function GetLastModFileDate : Word; virtual; function GetLastModFileTime : Word; virtual; + { This depends on in what format the attributes are stored in the archive, + to which system they refer (MS-DOS, Unix, etc.) and what system + we're running on (compile time). } function GetNativeFileAttributes : LongInt; virtual; + { This depends on in what format the date/time is stored in the archive + (Unix, MS-DOS, ...) and what system we're running on (compile time). + Returns MS-DOS local time on Windows, Unix UTC time on Unix. } + function GetNativeLastModFileTime : Longint; virtual; function GetStoredPath : string; function GetUncompressedSize : Int64; virtual; procedure SetCompressedSize(const Value : Int64); virtual; @@ -126,6 +133,8 @@ write SetLastModFileTime; property NativeFileAttributes : LongInt read GetNativeFileAttributes; + property NativeLastModFileTime : Longint + read GetNativeLastModFileTime; property StoredPath : string read GetStoredPath; property Tagged : Boolean @@ -316,6 +325,10 @@ procedure GetFreshenTarget(Item : TAbArchiveItem); function GetItemCount : Integer; procedure MakeLogEntry(const FN: string; LT : TAbLogType); + procedure MakeFullNames(const SourceFileName: String; + const ArchiveDirectory: String; + out FullSourceFileName: String; + out FullArchiveFileName: String); procedure ReplaceAt(Index : Integer); procedure SaveIfNeeded(aItem : TAbArchiveItem); procedure SetBaseDirectory(Value : string); @@ -323,8 +336,19 @@ procedure SetLogging(Value : Boolean); protected {abstract methods} + function CreateItem(const SourceFileName : string; + const ArchiveDirectory : string): TAbArchiveItem; + {SourceFileName - full or relative path to a file/dir on some file system + If full path, BaseDirectory is used to determine relative path} + {ArchiveDirectory - path to a directory in the archive the file/dir will be in} + {Example: + FBaseDirectory = /dir + SourceFileName = /dir/subdir/file + ArchiveDirectory = files/storage (or files/storage/) + -> name in archive = files/storage/subdir/file} + virtual; abstract; overload; function CreateItem(const FileSpec : string): TAbArchiveItem; - virtual; abstract; + overload; procedure ExtractItemAt(Index : Integer; const UseName : string); virtual; abstract; procedure ExtractItemToStreamAt(Index : Integer; aStream : TStream); @@ -384,6 +408,7 @@ override; procedure Add(aItem : TAbArchiveItem); virtual; + procedure AddEntry(const Path : String; const ArchiveDirectory : String); procedure AddFiles(const FileMask : string; SearchAttr : Integer); procedure AddFilesEx(const FileMask, ExclusionMask : string; SearchAttr : Integer); @@ -565,7 +590,9 @@ AbExcept, AbDfBase, AbConst, - AbResString; + AbResString, + DCOSUtils, + DCClassesUtf8; { TAbArchiveItem implementation ============================================ } @@ -647,6 +674,12 @@ {$ENDIF} end; { -------------------------------------------------------------------------- } +function TAbArchiveItem.GetNativeLastModFileTime : Longint; +begin + LongRec(Result).Hi := LastModFileDate; + LongRec(Result).Lo := LastModFileTime; +end; +{ -------------------------------------------------------------------------- } function TAbArchiveItem.GetStoredPath : string; begin Result := ExtractFilePath(DiskFileName); @@ -973,14 +1006,14 @@ ExtractOptions := []; FStatus := asIdle; FOnProgress := DoProgress; - BaseDirectory := ExtractFilePath(ParamStr(0)); + // BaseDirectory := ExtractFilePath(ParamStr(0)); end; { -------------------------------------------------------------------------- } constructor TAbArchive.Create(const FileName : string; Mode : Word); {create an archive by opening a filestream on filename with the given mode} begin FOwnsStream := True; - CreateFromStream(TFileStream.Create(FileName, Mode), FileName); + CreateFromStream(TFileStreamEx.Create(FileName, Mode), FileName); FMode := Mode; end; { -------------------------------------------------------------------------- } @@ -1032,6 +1065,19 @@ end; end; { -------------------------------------------------------------------------- } +procedure TAbArchive.AddEntry(const Path : String; const ArchiveDirectory : String); +var + Item : TAbArchiveItem; + FullSourceFileName, FullArchiveFileName : String; +begin + MakeFullNames(Path, ArchiveDirectory, FullSourceFileName, FullArchiveFileName); + + if (FullSourceFileName <> FArchiveName) then begin + Item := CreateItem(Path, ArchiveDirectory); + Add(Item); + end; +end; +{ -------------------------------------------------------------------------- } procedure TAbArchive.AddFiles(const FileMask : string; SearchAttr : Integer); {Add files to the archive where the disk filespec matches} begin @@ -1196,14 +1242,14 @@ UseName := AbAddBackSlash(BaseDirectory) + UseName; Path := ExtractFileDir(UseName); - if (Path <> '') and not DirectoryExists(Path) then + if (Path <> '') and not mbDirectoryExists(Path) then if (eoCreateDirs in ExtractOptions) then AbCreateDirectory(Path) else raise EAbNoSuchDirectory.Create; Result := True; - if not Item.IsDirectory and FileExists(UseName) then + if not Item.IsDirectory and mbFileExists(UseName) then DoConfirmOverwrite(UseName, Result); end; { -------------------------------------------------------------------------- } @@ -1560,11 +1606,12 @@ begin CheckValid; Index := FindItem(aItem); - if Index <> -1 then begin + if Index <> -1 then + begin + FreshenAt(Index); {point existing item at the new file} if AbGetPathType(aItem.DiskFileName) = ptAbsolute then FItemList[Index].DiskFileName := aItem.DiskFileName; - FreshenAt(Index); end; end; { -------------------------------------------------------------------------- } @@ -1625,7 +1672,7 @@ { -------------------------------------------------------------------------- } function TAbArchive.FreshenRequired(Item : TAbArchiveItem) : Boolean; var - FS : TFileStream; + FS : TFileStreamEx; DateTime : LongInt; FileTime : Word; FileDate : Word; @@ -1636,8 +1683,8 @@ if BaseDirectory <> '' then ChDir(BaseDirectory); try - FS := TFileStream.Create(Item.DiskFileName, - fmOpenRead or fmShareDenyWrite); + FS := TFileStreamEx.Create(Item.DiskFileName, + fmOpenRead or fmShareDenyWrite); try DateTime := FileGetDate(FS.Handle); FileTime := LongRec(DateTime).Lo; @@ -1761,6 +1808,45 @@ end; end; { -------------------------------------------------------------------------- } +procedure TAbArchive.MakeFullNames(const SourceFileName: String; + const ArchiveDirectory: String; + out FullSourceFileName: String; + out FullArchiveFileName: String); +var + PathType : TAbPathType; + RelativeSourceFileName: String; +begin + PathType := AbGetPathType(SourceFileName); + case PathType of + ptNone, ptRelative : + begin + if FBaseDirectory <> '' then + FullSourceFileName := AbAddBackSlash(FBaseDirectory) + SourceFileName + else + FullSourceFileName := SourceFileName; + + RelativeSourceFileName := SourceFileName; + end; + ptAbsolute : + begin + FullSourceFileName := SourceFileName; + + if FBaseDirectory <> '' then + RelativeSourceFileName := ExtractRelativepath(AbAddBackSlash(FBaseDirectory), + SourceFileName) + else + RelativeSourceFileName := ExtractFileName(SourceFileName); + end; + end; + + if ArchiveDirectory <> '' then + FullArchiveFileName := AbAddBackSlash(ArchiveDirectory) + RelativeSourceFileName + else + FullArchiveFileName := RelativeSourceFileName; + + FullArchiveFileName := FixName(FullArchiveFileName); +end; +{ -------------------------------------------------------------------------- } procedure TAbArchive.Move(aItem : TAbArchiveItem; const NewStoredPath : string); var Confirm : Boolean; @@ -1807,11 +1893,12 @@ begin CheckValid; Index := FindItem(aItem); - if Index <> -1 then begin + if Index <> -1 then + begin + ReplaceAt(Index); {point existing item at the new file} if AbGetPathType(aItem.DiskFileName) = ptAbsolute then FItemList[Index].DiskFileName := aItem.DiskFileName; - ReplaceAt(Index); end; end; { -------------------------------------------------------------------------- } @@ -1841,7 +1928,7 @@ begin if Status = asInvalid then Exit; - if (not FIsDirty) and (Count > 0) then + if not FIsDirty then Exit; DoConfirmSave(Confirm); @@ -1865,7 +1952,7 @@ if Value[Length(Value)] = AbPathDelim then if (Length(Value) > 1) and (Value[Length(Value) - 1] <> ':') then System.Delete(Value, Length(Value), 1); - if (Length(Value) = 0) or DirectoryExists(Value) then + if (Length(Value) = 0) or mbDirectoryExists(Value) then FBaseDirectory := Value else raise EAbNoSuchDirectory.Create; @@ -1930,6 +2017,13 @@ raise EAbSpanningNotSupported.Create; end; { -------------------------------------------------------------------------- } +function TAbArchive.CreateItem(const FileSpec : string): TAbArchiveItem; +begin + // This function is used by Abbrevia. We don't use it but a dummy + // definition is needed for the code to compile successfully. + raise Exception.Create(''); +end; +{ -------------------------------------------------------------------------- } { TAbExtraField implementation ============================================= } procedure TAbExtraField.Assign(aSource : TAbExtraField); @@ -1973,7 +2067,7 @@ Len, Offset : Integer; begin Len := SizeOf(TAbExtraSubField) + aSubField.Len; - Offset := PtrInt(aSubField) - PtrInt(Pointer(FBuffer)); + Offset := Pointer(aSubField) - Pointer(FBuffer); if Offset + Len < Length(FBuffer) then Move(FBuffer[Offset + Len], aSubField^, Length(FBuffer) - Offset - Len); SetLength(FBuffer, Length(FBuffer) - Len); @@ -2001,9 +2095,9 @@ end else begin BytesLeft := Length(FBuffer) - - Integer(PtrInt(aCurField) - PtrInt(Pointer(FBuffer))) - + (Pointer(aCurField) - Pointer(FBuffer)) - SizeOf(TAbExtraSubField) - aCurField.Len; - aCurField := Pointer(PtrInt(aCurField) + aCurField.Len + SizeOf(TAbExtraSubField)); + Inc(Pointer(aCurField), aCurField.Len + SizeOf(TAbExtraSubField)); end; Result := (BytesLeft >= SizeOf(TAbExtraSubField)); if Result and (BytesLeft < SizeOf(TAbExtraSubField) + aCurField.Len) then Index: AbBitBkt.pas =================================================================== --- AbBitBkt.pas (revision 512) +++ AbBitBkt.pas (working copy) @@ -47,7 +47,7 @@ FBufPosn : longint; FPosn : Int64; FSize : Int64; - FTail : longint; + FTail : Int64; protected public constructor Create(aBufSize : cardinal); @@ -108,8 +108,8 @@ {--------} function TAbBitBucketStream.Read(var Buffer; Count : Longint) : Longint; var - Chunk2Size : longint; - Chunk1Size : longint; + Chunk2Size : Int64; + Chunk1Size : Int64; OutBuffer : PByte; begin OutBuffer := @Buffer; @@ -146,7 +146,7 @@ end; if (Chunk2Size > 0) then begin {we've wrapped} - Move(FBuffer[0], PByte(PtrInt(OutBuffer) + PtrInt(Chunk1Size))^, Chunk2Size); + Move(FBuffer[0], (OutBuffer + Chunk1Size)^, Chunk2Size); FBufPosn := Chunk2Size; inc(FPosn, Chunk2Size); end; @@ -155,8 +155,8 @@ {--------} function TAbBitBucketStream.Write(const Buffer; Count : Longint) : Longint; var - Chunk2Size : longint; - Chunk1Size : longint; + Chunk2Size : Int64; + Chunk1Size : Int64; InBuffer : PByte; Overage : longint; begin @@ -186,7 +186,7 @@ {if the second chunk size is not zero, write the second chunk; note that we have wrapped} if (Chunk2Size > 0) then begin - Move(PByte(PtrInt(InBuffer) + PtrInt(Chunk1Size))^, FBuffer[0], Chunk2Size); + Move((InBuffer + Chunk1Size)^, FBuffer[0], Chunk2Size); FTail := Chunk2Size; end; {the stream size and position have changed} Index: AbBrowse.pas =================================================================== --- AbBrowse.pas (revision 525) +++ AbBrowse.pas (working copy) @@ -220,13 +220,15 @@ uses SysUtils, AbExcept, -{$IFDEF MSWINDOWS} +{$IF DEFINED(ExtractCabSupport)} AbCabTyp, {$ENDIF} AbZipTyp, AbTarTyp, AbGzTyp, - AbBzip2Typ; + AbBzip2Typ, + DCOSUtils, + DCClassesUtf8; { TAbBaseBrowser implementation ======================================= } @@ -515,66 +517,70 @@ function AbDetermineArcType(const FN : string; AssertType : TAbArchiveType) : TAbArchiveType; var Ext : string; - FS : TFileStream; + FS : TStream; begin Result := AssertType; if Result = atUnknown then begin { Guess archive type based on it's extension } Ext := UpperCase(ExtractFileExt(FN)); if (Ext = '.ZIP') or (Ext = '.JAR') then - Result := atZip; - if (Ext = '.EXE') then - Result := atSelfExtZip; - if (Ext = '.TAR') then - Result := atTar; - if (Ext = '.GZ') then - Result := atGzip; - if (Ext = '.TGZ') then - Result := atGzippedTar; - if (Ext = '.CAB') then - Result := atCab; - if (Ext = '.BZ2') then - Result := atBzip2; - if (Ext = '.TBZ') then + Result := atZip + else if (Ext = '.EXE') then + Result := atSelfExtZip + else if (Ext = '.TAR') then + Result := atTar + else if (Ext = '.GZ') then + Result := atGzip + else if (Ext = '.TGZ') then + Result := atGzippedTar + else if (Ext = '.CAB') then + Result := atCab + else if (Ext = '.BZ2') then + Result := atBzip2 + else if (Ext = '.TBZ') then Result := atBzippedTar; end; - {$IFNDEF MSWINDOWS} + {$IF NOT DEFINED(ExtractCabSupport)} if Result = atCab then Result := atUnknown; {$ENDIF} - if FileExists(FN) and (AbFileGetSize(FN) > 0) then begin + if mbFileExists(FN) and (AbFileGetSize(FN) > 0) then begin { If the file doesn't exist (or is empty) presume to make one, otherwise guess or verify the contents } - FS := TFileStream.Create(FN, fmOpenRead or fmShareDenyNone); - try - if Result = atUnknown then - Result := AbDetermineArcType(FS) - else begin - case Result of - atZip : begin - Result := VerifyZip(FS); + try + FS := TFileStreamEx.Create(FN, fmOpenRead or fmShareDenyNone); + try + if Result <> atUnknown then begin + case Result of + atZip : begin + Result := VerifyZip(FS); + end; + atSelfExtZip : begin + Result := VerifySelfExtracting(FS); + end; + atTar : begin + Result := VerifyTar(FS); + end; + atGzip, atGzippedTar: begin + Result := VerifyGzip(FS); + end; + {$IF DEFINED(ExtractCabSupport)} + atCab : begin + Result := VerifyCab(FS); + end; + {$ENDIF} + atBzip2, atBzippedTar: begin + Result := VerifyBzip2(FS); + end; end; - atSelfExtZip : begin - Result := VerifySelfExtracting(FS); - end; - atTar : begin - Result := VerifyTar(FS); - end; - atGzip, atGzippedTar: begin - Result := VerifyGzip(FS); - end; - {$IFDEF MSWINDOWS} - atCab : begin - Result := VerifyCab(FS); - end; - {$ENDIF} - atBzip2, atBzippedTar: begin - Result := VerifyBzip2(FS); - end; end; + if Result = atUnknown then + Result := AbDetermineArcType(FS) + finally + FS.Free; end; - finally - FS.Free; + except + // Skip end; end; end; @@ -583,15 +589,16 @@ begin { VerifyZip returns true for self-extracting zips too, so test those first } Result := VerifySelfExtracting(aStream); + { VerifyZip returns true for example when ZIP file is stored in a TAR archive, so test it first } if Result = atUnknown then + Result := VerifyTar(aStream); + if Result = atUnknown then Result := VerifyZip(aStream); if Result = atUnknown then - Result := VerifyTar(aStream); - if Result = atUnknown then Result := VerifyGzip(aStream); if Result = atUnknown then Result := VerifyBzip2(aStream); - {$IFDEF MSWINDOWS} + {$IF DEFINED(ExtractCabSupport)} if Result = atUnknown then Result := VerifyCab(aStream); {$ENDIF} Index: AbBzip2.pas =================================================================== --- AbBzip2.pas (revision 512) +++ AbBzip2.pas (working copy) @@ -391,7 +391,7 @@ {$ENDIF} const - libbz2 = {$IF DEFINED(MSWINDOWS)}'libbz2.dll' + libbz2 = {$IF DEFINED(MSWINDOWS)}'bz2.dll' {$ELSEIF DEFINED(DARWIN)}'libbz2.dylib' {$ELSE}'libbz2.so.1'{$IFEND}; @@ -527,8 +527,7 @@ P := OutBuf; Inc(OutBytes, 256); ReallocMem(OutBuf, OutBytes); - strm.next_out := PByte(PtrInt(OutBuf) - + (PtrInt(strm.next_out) - PtrInt(P))); + strm.next_out := OutBuf + (strm.next_out - P); strm.avail_out := 256; end; finally @@ -571,7 +570,7 @@ P := OutBuf; Inc(OutBytes, BufInc); ReallocMem(OutBuf, OutBytes); - strm.next_out := PByte(PtrInt(OutBuf) + (PtrInt(strm.next_out) - PtrInt(P))); + strm.next_out := OutBuf + (strm.next_out - P); strm.avail_out := BufInc; end; finally Index: AbBzip2Typ.pas =================================================================== --- AbBzip2Typ.pas (revision 512) +++ AbBzip2Typ.pas (working copy) @@ -86,7 +86,8 @@ protected { Inherited Abstract functions } - function CreateItem(const FileSpec : string): TAbArchiveItem; override; + function CreateItem(const SourceFileName : string; + const ArchiveDirectory : string): TAbArchiveItem; override; procedure ExtractItemAt(Index : Integer; const NewName : string); override; procedure ExtractItemToStreamAt(Index : Integer; aStream : TStream); override; procedure LoadArchive; override; @@ -118,7 +119,7 @@ Windows, // Fix inline warnings {$ENDIF} StrUtils, SysUtils, - AbBzip2, AbExcept, AbVMStrm, AbBitBkt; + AbBzip2, AbExcept, AbVMStrm, AbBitBkt, DCOSUtils, DCClassesUtf8; { ****************** Helper functions Not from Classes Above ***************** } function VerifyHeader(const Header : TAbBzip2Header) : Boolean; @@ -193,20 +194,29 @@ FState := gsBzip2; end; { -------------------------------------------------------------------------- } -function TAbBzip2Archive.CreateItem(const FileSpec: string): TAbArchiveItem; +function TAbBzip2Archive.CreateItem(const SourceFileName : string; + const ArchiveDirectory : string): TAbArchiveItem; +var + Bz2Item : TAbBzip2Item; + FullSourceFileName, FullArchiveFileName: String; begin if IsBzippedTar and TarAutoHandle then begin SwapToTar; - Result := inherited CreateItem(FileSpec); + Result := inherited CreateItem(SourceFileName, ArchiveDirectory); end else begin SwapToBzip2; - Result := TAbBzip2Item.Create; + Bz2Item := TAbBzip2Item.Create; try - Result.DiskFileName := ExpandFileName(FileSpec); - Result.FileName := FixName(FileSpec); + MakeFullNames(SourceFileName, ArchiveDirectory, + FullSourceFileName, FullArchiveFileName); + + Bz2Item.FileName := FullArchiveFileName; + Bz2Item.DiskFileName := FullSourceFileName; + + Result := Bz2Item; except - Result.Free; + Result := nil; raise; end; end; @@ -223,7 +233,7 @@ procedure TAbBzip2Archive.ExtractItemAt(Index: Integer; const NewName: string); var - OutStream : TFileStream; + OutStream : TStream; begin if IsBzippedTar and TarAutoHandle then begin SwapToTar; @@ -231,7 +241,7 @@ end else begin SwapToBzip2; - OutStream := TFileStream.Create(NewName, fmCreate or fmShareDenyNone); + OutStream := TFileStreamEx.Create(NewName, fmCreate or fmShareDenyNone); try try ExtractItemToStreamAt(Index, OutStream); @@ -242,12 +252,12 @@ except on E : EAbUserAbort do begin FStatus := asInvalid; - if FileExists(NewName) then - DeleteFile(NewName); + if mbFileExists(NewName) then + mbDeleteFile(NewName); raise; end else begin - if FileExists(NewName) then - DeleteFile(NewName); + if mbFileExists(NewName) then + mbDeleteFile(NewName); raise; end; end; @@ -347,7 +357,7 @@ if CurItem.Action = aaStreamAdd then CompStream.CopyFrom(InStream, 0){ Copy/compress entire Instream to FBzip2Stream } else begin - InputFileStream := TFileStream.Create(CurItem.DiskFileName, fmOpenRead or fmShareDenyWrite ); + InputFileStream := TFileStreamEx.Create(CurItem.DiskFileName, fmOpenRead or fmShareDenyWrite ); try CompStream.CopyFrom(InputFileStream, 0);{ Copy/compress entire Instream to FBzip2Stream } finally Index: AbDfInW.pas =================================================================== --- AbDfInW.pas (revision 512) +++ AbDfInW.pas (working copy) @@ -261,8 +261,7 @@ HashInx := ((HashInx shl c_HashShift) xor longint(CurPos[2])) and c_HashMask; - HashChains^[longint(CurPos) and FWinMask] := - HashHeads^[HashInx]; + HashChains^[PtrUInt(CurPos) and FWinMask] := HashHeads^[HashInx]; HashHeads^[HashInx] := CurPos; inc(CurPos); end; @@ -367,7 +366,6 @@ {$ENDIF} {$ENDIF} type - PLongint = ^longint; PWord = ^word; var MaxLen : longint; @@ -406,7 +404,7 @@ {update the chain itself: set the entry for this position equal to the previous string position} - FHashChains^[longint(CurPos) and FWinMask] := PrevStrPos; + FHashChains^[PtrUInt(CurPos) and FWinMask] := PrevStrPos; {calculate the maximum match we could do at this position} MaxMatch := (FLookAheadEnd - CurPos); @@ -602,7 +600,7 @@ Break; {otherwise move onto the next position} - PrevStrPos := FHashChains^[longint(PrevStrPos) and FWinMask]; + PrevStrPos := FHashChains^[PtrUInt(PrevStrPos) and FWinMask]; end; {$ENDIF} @@ -700,13 +698,11 @@ end; {--------} procedure TAbDfInputWindow.iwSlide; -type - PLongint = ^longint; var i : integer; - ByteCount : integer; - Buffer : longint; - ListItem : PLongint; + ByteCount : PtrInt; + Buffer : PAnsiChar; + ListItem : PPointer; begin {move current valid data back to the start of the buffer} ByteCount := FLookAheadEnd - FStart; @@ -719,22 +715,22 @@ dec(FLookAheadEnd, ByteCount); {patch up the hash table: the head pointers} - Buffer := longint(FBuffer); - ListItem := PLongint(@FHashHeads^[0]); + Buffer := FBuffer; + ListItem := @FHashHeads^[0]; for i := 0 to pred(c_HashCount) do begin dec(ListItem^, ByteCount); if (ListItem^ < Buffer) then - ListItem^ := 0; - inc(PAnsiChar(ListItem), sizeof(pointer)); + ListItem^ := nil; + inc(ListItem); end; {..the chain pointers} - ListItem := PLongint(@FHashChains^[0]); + ListItem := @FHashChains^[0]; for i := 0 to pred(FWinSize) do begin dec(ListItem^, ByteCount); if (ListItem^ < Buffer) then - ListItem^ := 0; - inc(PAnsiChar(ListItem), sizeof(pointer)); + ListItem^ := nil; + inc(ListItem); end; {now read some more data from the stream} Index: AbDfStrm.pas =================================================================== --- AbDfStrm.pas (revision 512) +++ AbDfStrm.pas (working copy) @@ -230,7 +230,8 @@ {save the on progress handler} if Assigned(aOnProgress) and (aStreamSize > 0) then begin FOnProgress := aOnProgress; - FStreamSize := aStreamSize; + //FStreamSize := aStreamSize; + FStreamSize := aStream.Size - aStream.Position; end; end; {--------} Index: AbGzTyp.pas =================================================================== --- AbGzTyp.pas (revision 512) +++ AbGzTyp.pas (working copy) @@ -140,6 +140,7 @@ function GetLastModFileDate : Word; override; function GetLastModFileTime : Word; override; function GetLastModTimeAsDateTime: TDateTime; override; + function GetNativeLastModFileTime: Longint; override; procedure SetExternalFileAttributes( Value : LongWord ); override; procedure SetFileName(const Value : string); override; @@ -242,7 +243,8 @@ procedure SwapToTar; protected - function CreateItem(const FileSpec : string): TAbArchiveItem; + function CreateItem(const SourceFileName : string; + const ArchiveDirectory : string): TAbArchiveItem; override; procedure ExtractItemAt(Index : Integer; const UseName : string); override; @@ -291,7 +293,8 @@ Windows, {$ENDIF} SysUtils, - AbBitBkt, AbCharset, AbDfBase, AbDfDec, AbDfEnc, AbExcept, AbResString, AbVMStrm; + AbBitBkt, AbDfBase, AbDfDec, AbDfEnc, AbExcept, AbResString, + AbVMStrm, DCOSUtils, DCClassesUtf8, DCConvertEncoding; const { Header Signature Values} @@ -708,6 +711,20 @@ Result := AbUnixTimeToLocalDateTime(FGZHeader.ModTime); end; +function TAbGzipItem.GetNativeLastModFileTime: Longint; +{$IFDEF MSWINDOWS} +var + DateTime: TDateTime; +{$ENDIF} +begin + Result := FGZHeader.ModTime; + +{$IFDEF MSWINDOWS} + DateTime := AbUnixTimeToLocalDateTime(Result); + Result := AbDateTimeToDosFileDate(DateTime); +{$ENDIF} +end; + procedure TAbGzipItem.LoadGzHeaderFromStream(AStream: TStream); var LenW : Word; @@ -731,7 +748,7 @@ { Get Filename, if any } if HasFileName then begin FRawFileName := ReadCStringInStream(AStream); - FFileName := AbRawBytesToString(FRawFileName) + FFileName := CeRawToUtf8(FRawFileName) end else FFileName := 'unknown'; @@ -804,7 +821,7 @@ procedure TAbGzipItem.SetFileName(const Value: string); begin FFileName := Value; - FRawFileName := AbStringToUnixBytes(Value); + FRawFileName := CeUtf8ToSys(Value); if Value <> '' then FGzHeader.Flags := FGzHeader.Flags or AB_GZ_FLAG_FNAME else @@ -886,25 +903,30 @@ FState := gsGzip; end; -function TAbGzipArchive.CreateItem(const FileSpec: string): TAbArchiveItem; +function TAbGzipArchive.CreateItem(const SourceFileName : string; + const ArchiveDirectory : string): TAbArchiveItem; var GzItem : TAbGzipItem; + FullSourceFileName, FullArchiveFileName: String; begin if IsGZippedTar and TarAutoHandle then begin SwapToTar; - Result := inherited CreateItem(FileSpec); + Result := inherited CreateItem(SourceFileName, ArchiveDirectory); end else begin SwapToGzip; GzItem := TAbGzipItem.Create; try - GzItem.CompressedSize := 0; - GzItem.CRC32 := 0; - GzItem.DiskFileName := ExpandFileName(FileSpec); - GzItem.FileName := FixName(FileSpec); + MakeFullNames(SourceFileName, ArchiveDirectory, + FullSourceFileName, FullArchiveFileName); + + GzItem.FileName := FullArchiveFileName; + GzItem.DiskFileName := FullSourceFileName; + Result := GzItem; except Result := nil; + raise; end; end; end; @@ -921,7 +943,7 @@ procedure TAbGzipArchive.ExtractItemAt(Index: Integer; const UseName: string); var - OutStream : TFileStream; + OutStream : TStream; CurItem : TAbGzipItem; begin if IsGZippedTar and TarAutoHandle then begin @@ -934,7 +956,7 @@ CurItem := TAbGzipItem(ItemList[Index]); - OutStream := TFileStream.Create(UseName, fmCreate or fmShareDenyNone); + OutStream := TFileStreamEx.Create(UseName, fmCreate or fmShareDenyNone); try try {OutStream} ExtractItemToStreamAt(Index, OutStream); @@ -946,12 +968,12 @@ except on E : EAbUserAbort do begin FStatus := asInvalid; - if FileExists(UseName) then - DeleteFile(UseName); + if mbFileExists(UseName) then + mbDeleteFile(UseName); raise; end else begin - if FileExists(UseName) then - DeleteFile(UseName); + if mbFileExists(UseName) then + mbDeleteFile(UseName); raise; end; end; @@ -1089,7 +1111,6 @@ i : Integer; NewStream : TAbVirtualMemoryStream; UncompressedStream : TStream; - SaveDir : string; CurItem : TAbGzipItem; begin {prepare for the try..finally} @@ -1111,19 +1132,22 @@ if IsGzippedTar and TarAutoHandle then begin SwapToTar; inherited SaveArchive; - if FGZItem.Count = 0 then begin - CurItem := TAbGzipItem.Create; - FGZItem.Add(CurItem); + if FTarStream.Size > 0 then + begin + if FGZItem.Count = 0 then begin + CurItem := TAbGzipItem.Create; + FGZItem.Add(CurItem); + end; + CurItem := FGZItem[0] as TAbGzipItem; + CurItem.Action := aaNone; + CurItem.LastModTimeAsDateTime := Now; + CurItem.SaveGzHeaderToStream(NewStream); + FTarStream.Position := 0; + OutGzHelp.WriteArchiveItem(FTarStream); + CurItem.CRC32 := OutGzHelp.CRC; + CurItem.UncompressedSize := OutGzHelp.FileSize; + OutGzHelp.WriteArchiveTail; end; - CurItem := FGZItem[0] as TAbGzipItem; - CurItem.Action := aaNone; - CurItem.LastModTimeAsDateTime := Now; - CurItem.SaveGzHeaderToStream(NewStream); - FTarStream.Position := 0; - OutGzHelp.WriteArchiveItem(FTarStream); - CurItem.CRC32 := OutGzHelp.CRC; - CurItem.UncompressedSize := OutGzHelp.FileSize; - OutGzHelp.WriteArchiveTail; end else begin SwapToGzip; @@ -1154,17 +1178,9 @@ OutGzHelp.WriteArchiveTail; end else begin - { it's coming from a file } - GetDir(0, SaveDir); - try {SaveDir} - if (BaseDirectory <> '') then - ChDir(BaseDirectory); - CurItem.LastModTimeAsDateTime := AbGetFileTime(CurItem.DiskFileName); - UncompressedStream := TFileStream.Create(CurItem.DiskFileName, + CurItem.LastModTimeAsDateTime := AbGetFileTime(CurItem.DiskFileName); + UncompressedStream := TFileStreamEx.Create(CurItem.DiskFileName, fmOpenRead or fmShareDenyWrite ); - finally {SaveDir} - ChDir( SaveDir ); - end; {SaveDir} try CurItem.UncompressedSize := UncompressedStream.Size; @@ -1197,7 +1213,7 @@ { need new stream to write } FreeAndNil(FStream); FGZStream := nil; - FStream := TFileStream.Create(FArchiveName, fmCreate or fmShareDenyWrite); + FStream := TFileStreamEx.Create(FArchiveName, fmCreate or fmShareDenyWrite); FGZStream := FStream; FStream.CopyFrom(NewStream, NewStream.Size); end; Index: AbSelfEx.pas =================================================================== --- AbSelfEx.pas (revision 512) +++ AbSelfEx.pas (working copy) @@ -49,9 +49,9 @@ FStubExe : string; FZipFile : string; FSelfExe : string; - FStubStream : TFileStream; - FZipStream : TFileStream; - FSelfStream : TFileStream; + FStubStream : TStream; + FZipStream : TStream; + FSelfStream : TStream; FOnGetStubExe : TAbGetFileEvent; FOnGetZipFile : TAbGetFileEvent; @@ -88,7 +88,7 @@ {$IFDEF LibcAPI} Libc, {$ENDIF} - AbExcept, AbZipTyp; + AbExcept, AbZipTyp, DCOSUtils, DCClassesUtf8; { -------------------------------------------------------------------------- } function TAbMakeSelfExe.Execute : Boolean; @@ -100,20 +100,20 @@ DoGetStubExe(Abort); if Abort then raise EAbUserAbort.Create; - if not FileExists(FStubExe) then + if not mbFileExists(FStubExe) then raise EAbFileNotFound.Create; if (FZipFile = '') then DoGetZipFile(Abort); if Abort then raise EAbUserAbort.Create; - if not FileExists(FZipFile) then + if not mbFileExists(FZipFile) then raise EAbFileNotFound.Create; - FStubStream := TFileStream.Create(FStubExe, fmOpenRead or fmShareDenyWrite); - FZipStream := TFileStream.Create(FZipFile, fmOpenRead or fmShareDenyWrite); + FStubStream := TFileStreamEx.Create(FStubExe, fmOpenRead or fmShareDenyWrite); + FZipStream := TFileStreamEx.Create(FZipFile, fmOpenRead or fmShareDenyWrite); if (FSelfExe = '') then FSelfExe := ChangeFileExt(FZipFile, '.exe'); - FSelfStream := TFileStream.Create(FSelfExe, fmCreate or fmShareExclusive); + FSelfStream := TFileStreamEx.Create(FSelfExe, fmCreate or fmShareExclusive); try MakeSelfExtracting(FStubStream, FZipStream, FSelfStream); Result := True; Index: AbSpanSt.pas =================================================================== --- AbSpanSt.pas (revision 512) +++ AbSpanSt.pas (working copy) @@ -142,7 +142,7 @@ {$IFDEF MSWINDOWS} Windows, {$ENDIF} - Math, RTLConsts, SysUtils, AbUtils, AbExcept; + Math, RTLConsts, SysUtils, AbUtils, AbExcept, DCOSUtils, DCClassesUtf8; {============================================================================} @@ -181,7 +181,7 @@ begin inherited Create(ArchiveName); FCurrentImage := CurrentImage; - FIsSplit := FileExists(GetImageName(1)) or not AbDriveIsRemovable(ArchiveName); + FIsSplit := mbFileExists(GetImageName(1)) or not AbDriveIsRemovable(ArchiveName); FLastImage := CurrentImage; FStream := Stream; end; @@ -218,7 +218,7 @@ end else raise EAbUserAbort.Create; - FStream := TFileStream.Create(ImageName, fmOpenRead or fmShareDenyWrite); + FStream := TFileStreamEx.Create(ImageName, fmOpenRead or fmShareDenyWrite); end; {------------------------------------------------------------------------------} function TAbSpanReadStream.Read(var Buffer; Count: Longint): Longint; @@ -273,7 +273,7 @@ procedure TAbSpanReadStream.SetOnRequestImage(Value: TAbRequestImageEvent); begin FOnRequestImage := Value; - FIsSplit := FileExists(GetImageName(1)) or not AbDriveIsRemovable(FArchiveName); + FIsSplit := mbFileExists(GetImageName(1)) or not AbDriveIsRemovable(FArchiveName); end; {============================================================================} @@ -302,7 +302,7 @@ FreeAndNil(FStream); Inc(FCurrentImage); if FThreshold > 0 then - RenameFile(FArchiveName, GetImageName(FCurrentImage)) + mbRenameFile(FArchiveName, GetImageName(FCurrentImage)) else begin if Assigned(FOnRequestBlankDisk) then begin Abort := False; @@ -316,7 +316,7 @@ raise EAbUserAbort.Create; AbSetSpanVolumeLabel(AbDrive(FArchiveName), FCurrentImage); end; - FStream := TFileStream.Create(FArchiveName, fmCreate or fmShareDenyWrite); + FStream := TFileStreamEx.Create(FArchiveName, fmCreate or fmShareDenyWrite); FImageSize := 0; end; {------------------------------------------------------------------------------} Index: AbTarTyp.pas =================================================================== --- AbTarTyp.pas (revision 512) +++ AbTarTyp.pas (working copy) @@ -320,6 +320,7 @@ function GetLastModFileTime : Word; override; function GetLastModTimeAsDateTime: TDateTime; override; function GetNativeFileAttributes : LongInt; override; + function GetNativeLastModFileTime: Longint; override; function GetUncompressedSize : Int64; override; procedure SetCompressedSize(const Value : Int64); override; { Extended Headers } @@ -418,7 +419,8 @@ FArchReadOnly : Boolean; FArchFormat: TAbTarHeaderFormat; protected - function CreateItem(const FileSpec : string): TAbArchiveItem; + function CreateItem(const SourceFileName : string; + const ArchiveDirectory : string): TAbArchiveItem; override; procedure ExtractItemAt(Index : Integer; const UseName : string); override; @@ -448,6 +450,11 @@ write PutItem; default; end; + procedure UnixAttrsToTarAttrs(const UnixAttrs: LongWord; + out Permissions: LongWord; out LinkFlag: AnsiChar); + procedure TarAttrsToUnixAttrs(const Permissions: LongWord; const LinkFlag: AnsiChar; + out UnixAttrs: LongWord); + function VerifyTar(Strm : TStream) : TAbArchiveType; @@ -457,7 +464,8 @@ {$IFDEF MSWINDOWS} Windows, // Fix inline warnings {$ENDIF MSWINDOWS} - Math, RTLConsts, SysUtils, AbCharset, AbVMStrm, AbExcept; + Math, RTLConsts, SysUtils, AbVMStrm, AbExcept, + DCOSUtils, DCClassesUtf8, DCConvertEncoding; { ****************** Helper functions Not from Classes Above ***************** } function OctalToInt(const Oct : PAnsiChar; aLen : integer): Int64; @@ -566,7 +574,58 @@ not (AB_TAR_RECORDSIZE - 1); end; +procedure UnixAttrsToTarAttrs(const UnixAttrs: LongWord; + out Permissions: LongWord; out LinkFlag: AnsiChar); +begin + case (UnixAttrs and $F000) of + AB_FMODE_SOCKET: + ; + AB_FMODE_FILELINK: + LinkFlag := AB_TAR_LF_SYMLINK; + AB_FMODE_FILE2: + LinkFlag := AB_TAR_LF_NORMAL; + AB_FMODE_BLOCKSPECFILE: + LinkFlag := AB_TAR_LF_BLK; + AB_FMODE_DIR: + LinkFlag := AB_TAR_LF_DIR; + AB_FMODE_CHARSPECFILE: + LinkFlag := AB_TAR_LF_CHR; + AB_FMODE_FIFO: + LinkFlag := AB_TAR_LF_FIFO; + AB_FMODE_FILE: + LinkFlag := AB_TAR_LF_NORMAL; + else + LinkFlag := AB_TAR_LF_OLDNORMAL; + end; + Permissions := (UnixAttrs and $0FFF); +end; +{ -------------------------------------------------------------------------- } +procedure TarAttrsToUnixAttrs(const Permissions: LongWord; const LinkFlag: AnsiChar; + out UnixAttrs: LongWord); +begin + case LinkFlag of + AB_TAR_LF_OLDNORMAL: + UnixAttrs := AB_FMODE_FILE; + AB_TAR_LF_NORMAL: + UnixAttrs := AB_FMODE_FILE2; + AB_TAR_LF_SYMLINK: + UnixAttrs := AB_FMODE_FILELINK; + AB_TAR_LF_BLK: + UnixAttrs := AB_FMODE_BLOCKSPECFILE; + AB_TAR_LF_DIR: + UnixAttrs := AB_FMODE_DIR; + AB_TAR_LF_CHR: + UnixAttrs := AB_FMODE_CHARSPECFILE; + AB_TAR_LF_FIFO: + UnixAttrs := AB_FMODE_FIFO; + else + UnixAttrs := AB_FMODE_FILE; + end; + + UnixAttrs := UnixAttrs or (Permissions and $0FFF); +end; + { ****************************** TAbTarItem ********************************** } constructor TAbTarItem.Create; begin @@ -632,7 +691,7 @@ function TAbTarItem.GetExternalFileAttributes: LongWord; begin - Result := FTarItem.Mode; + TarAttrsToUnixAttrs(FTarItem.Mode, FTarItem.LinkFlag, Result); end; function TAbTarItem.GetFileName: string; @@ -678,6 +737,19 @@ Result := AbUnixTimeToLocalDateTime(FTarItem.ModTime); end; +function TAbTarItem.GetNativeLastModFileTime: Longint; +{$IFDEF MSWINDOWS} +var + DateTime: TDateTime; +{$ENDIF} +begin + Result := Self.ModTime; + +{$IFDEF MSWINDOWS} + DateTime := AbUnixTimeToLocalDateTime(Result); + Result := AbDateTimeToDosFileDate(DateTime); +{$ENDIF} +end; function TAbTarItem.GetLinkName: string; begin Result := FTarItem.LinkName; @@ -819,7 +891,7 @@ RawFileName := PTarHeader.Name; end; { End not FoundName } - FTarItem.Name := AbRawBytesToString(RawFileName); + FTarItem.Name := CeRawToUtf8(RawFileName); end; { Extract the file name from the headers } @@ -876,7 +948,7 @@ if not FoundName then RawLinkName := PHeader.LinkName; - FTarItem.LinkName := AbRawBytesToString(RawLinkName); + FTarItem.LinkName := CeRawToUtf8(RawLinkName); end; { Return True if CheckSum passes out. } @@ -1017,8 +1089,8 @@ begin ParseTarHeaders; { Update FTarItem values } FFileName := FTarItem.Name; {FTarHeader.Name;} - FDiskFileName := FileName; - AbUnfixName(FDiskFileName); +// FDiskFileName := FileName; +// AbUnfixName(FDiskFileName); end; Action := aaNone; Tagged := False; @@ -1142,14 +1214,21 @@ var S : AnsiString; I: Integer; + Permissions: LongWord; + ALinkFlag: AnsiChar; begin if FTarItem.ItemReadOnly then { Read Only - Do Not Save } Exit; - FTarItem.Mode := Value; - S := PadString(IntToOctal(Value), SizeOf(Arr8)); + + UnixAttrsToTarAttrs(Value, Permissions, ALinkFlag); + + FTarItem.Mode := Permissions; + S := PadString(IntToOctal(Permissions), SizeOf(Arr8)); for I := 0 to FTarHeaderList.Count - 1 do if TAbTarHeaderType(FTarHeaderTypeList.Items[I]) in [FILE_HEADER, META_DATA_HEADER] then Move(S[1], PAbTarHeaderRec(FTarHeaderList.Items[I]).Mode, Length(S)); + + Self.LinkFlag := ALinkFlag; // also updates headers FTarItem.Dirty := True; end; @@ -1297,9 +1376,9 @@ { Finally we need to stuff the file type Header. } { Note: Value.length > AB_TAR_NAMESIZE(100) } if LinkFlag = AB_TAR_LF_LONGNAME then - Move(Value[1], PHeader.Name, AB_TAR_NAMESIZE) + Move(Value[1], PTarHeader.Name, AB_TAR_NAMESIZE) else - Move(Value[1], PHeader.LinkName, AB_TAR_NAMESIZE); + Move(Value[1], PTarHeader.LinkName, AB_TAR_NAMESIZE); end; procedure TAbTarItem.SetFileName(const Value: string); @@ -1333,7 +1412,7 @@ OLD_GNU & GNU: Add N Headers for name, Update name in MD header, update name field in File Headers, min 3 headers Add headers to length of new Name Length, update name in file header, update name fields } - RawFileName := AbStringToUnixBytes(Value); + RawFileName := CeUtf8ToSys(Value); { In all cases zero out the name fields in the File Header. } if Length(RawFileName) > AB_TAR_NAMESIZE then begin { Must be null terminated except at 100 char length } { Look for long name meta-data headers already in the archive. } @@ -1431,8 +1510,8 @@ { Update the inherited file names. } FFileName := FTarItem.Name; - DiskFileName := FFileName; - AbUnfixName(FDiskFileName); +//DiskFileName := FFileName; +//AbUnfixName(FDiskFileName); // Don't override DiskFileName FTarItem.Dirty := True; end; @@ -1527,7 +1606,7 @@ if old was Long, OLD_GNU & GNU: Add N Headers for name, Update name in MD header, update name field in File Headers, min 3 headers STAR & PAX: And should not yet get here.} - RawLinkName := AbStringToUnixBytes(Value); + RawLinkName := CeUtf8ToSys(Value); if Length(RawLinkName) > AB_TAR_NAMESIZE then { Must be null terminated except at 100 char length } begin { Look for long name meta-data headers already in the archive. } @@ -1838,16 +1917,19 @@ FArchFormat := V7_FORMAT; // Default for new archives end; -function TAbTarArchive.CreateItem(const FileSpec: string): TAbArchiveItem; +function TAbTarArchive.CreateItem(const SourceFileName : string; + const ArchiveDirectory : string): TAbArchiveItem; var Item : TAbTarItem; - S : String; I: Integer; + FullSourceFileName, FullArchiveFileName: String; begin if FArchReadOnly then raise EAbTarBadOp.Create; { Create Item Unsupported in this Archive } - S := FixName(FileSpec); + MakeFullNames(SourceFileName, ArchiveDirectory, + FullSourceFileName, FullArchiveFileName); + Item := TAbTarItem.Create; try // HeaderFormat = (UNKNOWN_FORMAT, V7_FORMAT, OLDGNU_FORMAT, GNU_FORMAT, USTAR_FORMAT, STAR_FORMAT, POSIX_FORMAT); @@ -1863,7 +1945,7 @@ Item.LinkFlag := AB_TAR_LF_NORMAL; Item.Magic := AB_TAR_MAGIC_VAL+AB_TAR_MAGIC_VER; end - else if (FArchFormat = V7_FORMAT) and (Length(S) > 100) then + else if (FArchFormat = V7_FORMAT) and (Length(FullArchiveFileName) > 100) then begin { Switch the rep over to GNU so it can have long file names. } FArchFormat := OLDGNU_FORMAT; Item.ArchiveFormat := OLDGNU_FORMAT; @@ -1882,9 +1964,10 @@ { Most others are initialized in the .Create } Item.CRC32 := 0; + { Note this can raise exceptions for file name lengths. } - Item.FileName := FixName(FileSpec); - Item.DiskFileName := ExpandFileName(FileSpec); + Item.FileName := FullArchiveFileName; + Item.DiskFileName := FullSourceFileName; Item.Action := aaNone; finally Result := Item; @@ -1894,7 +1977,7 @@ procedure TAbTarArchive.ExtractItemAt(Index: Integer; const UseName: string); var - OutStream : TFileStream; + OutStream : TStream; CurItem : TAbTarItem; begin { Check the index is not out of range. } @@ -1914,18 +1997,26 @@ if CurItem.IsDirectory then AbCreateDirectory(UseName) else begin - OutStream := TFileStream.Create(UseName, fmCreate or fmShareDenyNone); - try - try {OutStream} - ExtractItemToStreamAt(Index, OutStream); - finally {OutStream} - OutStream.Free; - end; {OutStream} - except - if ExceptObject is EAbUserAbort then - FStatus := asInvalid; - DeleteFile(UseName); - raise; + case (CurItem.Mode and $F000) of + AB_FMODE_FILE, AB_FMODE_FILE2: begin + OutStream := TFileStreamEx.Create(UseName, fmCreate or fmShareDenyNone); + try + try {OutStream} + ExtractItemToStreamAt(Index, OutStream); + finally {OutStream} + OutStream.Free; + end; {OutStream} + except + if ExceptObject is EAbUserAbort then + FStatus := asInvalid; + mbDeleteFile(UseName); + raise; + end; + end; + + AB_FMODE_FILELINK: begin + AbCreateSymlink(CurItem.LinkName, UseName); + end; end; end; AbSetFileTime(UseName, CurItem.LastModTimeAsDateTime); @@ -2060,7 +2151,7 @@ AbStripDrive( lValue ); { check for a leading slash } - if lValue[1] = AbPathDelim then + if (Length(lValue) > 0) and (lValue[1] = AbPathDelim) then System.Delete( lValue, 1, 1 ); if soStripPath in StoreOptions then @@ -2097,7 +2188,6 @@ i : Integer; NewStream : TAbVirtualMemoryStream; TempStream : TStream; - SaveDir : string; CurItem : TAbTarItem; AttrEx : TAbAttrExRec; begin @@ -2145,24 +2235,27 @@ aaAdd, aaFreshen, aaReplace: begin try - { it's coming from a file } - GetDir(0, SaveDir); - try {SaveDir} - if (BaseDirectory <> '') then - ChDir(BaseDirectory); - { update metadata } - AbFileGetAttrEx(CurItem.DiskFileName, AttrEx); - CurItem.ExternalFileAttributes := AttrEx.Mode; - CurItem.LastModTimeAsDateTime := AttrEx.Time; - { TODO: uid, gid, uname, gname should be added here } - { TODO: Add support for different types of files here } - if (AttrEx.Mode and AB_FMODE_DIR) <> 0 then begin - CurItem.LinkFlag := AB_TAR_LF_DIR; + { update metadata } + if not AbFileGetAttrEx(CurItem.DiskFileName, AttrEx, False) then + Raise EAbFileNotFound.Create; + CurItem.ExternalFileAttributes := AttrEx.Mode; + CurItem.LastModTimeAsDateTime := AttrEx.Time; + { TODO: uid, gid, uname, gname should be added here } + { TODO: Add support for different types of files here } + case (AttrEx.Mode and $F000) of + AB_FMODE_DIR: begin CurItem.UncompressedSize := 0; CurItem.SaveTarHeaderToStream(NewStream); - end - else begin - TempStream := TFileStream.Create(CurItem.DiskFileName, + end; + + AB_FMODE_FILELINK: begin + CurItem.UncompressedSize := 0; + CurItem.LinkName := AbReadSymlink(CurItem.DiskFileName); + CurItem.SaveTarHeaderToStream(NewStream); + end; + + AB_FMODE_FILE, AB_FMODE_FILE2: begin + TempStream := TFileStreamEx.Create(CurItem.DiskFileName, fmOpenRead or fmShareDenyWrite ); try { TempStream } CurItem.UncompressedSize := TempStream.Size; @@ -2173,9 +2266,13 @@ TempStream.Free; end; { TempStream } end; - finally {SaveDir} - ChDir( SaveDir ); - end; {SaveDir} + + else begin + CurItem.UncompressedSize := AttrEx.Size; + CurItem.SaveTarHeaderToStream(NewStream); + end; + end; + except ItemList[i].Action := aaDelete; DoProcessItemFailure(ItemList[i], ptAdd, ecFileOpenError, 0); @@ -2200,7 +2297,7 @@ else begin { need new stream to write } FreeAndNil(FStream); - FStream := TFileStream.Create(FArchiveName, fmCreate or fmShareDenyWrite); + FStream := TFileStreamEx.Create(FArchiveName, fmCreate or fmShareDenyWrite); FStream.CopyFrom(NewStream, NewStream.Size); end; Index: AbUnzPrc.pas =================================================================== --- AbUnzPrc.pas (revision 512) +++ AbUnzPrc.pas (working copy) @@ -153,7 +153,8 @@ AbSpanSt, AbSWStm, AbUnzOutStm, - AbUtils; + AbUtils, + DCClassesUtf8; { -------------------------------------------------------------------------- } procedure AbReverseBits(var W : Word); @@ -1111,7 +1112,7 @@ else begin InStream := ExtractPrep(ZipArchive, Item); try - OutStream := TFileStream.Create(UseName, fmCreate or fmShareDenyWrite); + OutStream := TFileStreamEx.Create(UseName, fmCreate or fmShareDenyWrite); try try {OutStream} DoExtract(ZipArchive, Item, InStream, OutStream); Index: AbUtils.pas =================================================================== --- AbUtils.pas (revision 512) +++ AbUtils.pas (working copy) @@ -60,10 +60,10 @@ {$ENDIF} {$IFDEF UNIX} DateUtils, + DCClassesUtf8, {$ENDIF} SysUtils, - Classes, - AbCharset; + Classes; type @@ -114,6 +114,12 @@ {$ENDIF} {$IFEND} +{ Unicode backwards compatibility types } +{$IF NOT DECLARED(RawByteString)} +type + RawByteString = AnsiString; +{$IFEND} + { System-encoded SBCS string (formerly AnsiString) } type AbSysString = {$IFDEF Posix}UTF8String{$ELSE}AnsiString{$ENDIF}; @@ -198,8 +204,13 @@ because if you have a path x:\dir, and request x:\dir\sub1\sub2, (/dir and /dir/sub1/sub2 on Unix) it fails.} + function AbCreateSymlink( const LinksPointsTo, LinkName : String ): Boolean; + function AbCreateTempFile(const Dir : string) : string; + function AbReadSymlink( const LinkFile : String ): String; + {Reads the name that a link points to.} + function AbGetTempDirectory : string; {-Return the system temp directory} @@ -294,7 +305,7 @@ Mode: {$IFDEF UNIX}mode_t{$ELSE}Cardinal{$ENDIF}; end; - function AbFileGetAttrEx(const aFileName: string; out aAttr: TAbAttrExRec) : Boolean; + function AbFileGetAttrEx(const aFileName: string; out aAttr: TAbAttrExRec; FollowLinks: Boolean = True) : Boolean; function AbSwapLongEndianness(Value : LongInt): LongInt; @@ -364,8 +375,12 @@ uses StrUtils, AbConst, - AbExcept; + AbExcept, + DCOSUtils, + DCStrUtils, + DCDateTimeUtils; +(* {$IF DEFINED(FPCUnixAPI)} function mktemp(template: PAnsiChar): PAnsiChar; cdecl; external clib name 'mktemp'; @@ -387,6 +402,7 @@ function nl_langinfo(__item: nl_item): PAnsiChar; cdecl; external clib name 'nl_langinfo'; {$IFEND} +*) {===platform independent routines for platform dependent stuff=======} function ExtractShortName(const SR : TSearchRec) : string; @@ -410,16 +426,16 @@ function AbCopyFile(const Source, Destination: string; FailIfExists: Boolean): Boolean; {$IFDEF UNIX} var - DesStream, SrcStream: TFileStream; + DesStream, SrcStream: TFileStreamEx; {$ENDIF} begin {$IFDEF UNIX} Result := False; - if not FailIfExists or not FileExists(Destination) then + if not FailIfExists or not mbFileExists(Destination) then try - SrcStream := TFileStream.Create(Source, fmOpenRead or fmShareDenyWrite); + SrcStream := TFileStreamEx.Create(Source, fmOpenRead or fmShareDenyWrite); try - DesStream := TFileStream.Create(Destination, fmCreate); + DesStream := TFileStreamEx.Create(Destination, fmCreate); try DesStream.CopyFrom(SrcStream, 0); Result := True; @@ -434,7 +450,7 @@ end; {$ENDIF UNIX} {$IFDEF MSWINDOWS} - Result := CopyFile(PChar(Source), PChar(Destination), FailIfExists); + Result := CopyFileW(PWideChar(UTF8Decode(Source)), PWideChar(UTF8Decode(Destination)), FailIfExists); {$ENDIF MSWINDOWS} end; { -------------------------------------------------------------------------- } @@ -447,7 +463,7 @@ i : Integer; TempPath : string; begin - if DirectoryExists( Path ) then + if mbDirectoryExists( Path ) then Exit; {see how much of the path currently exists} if Pos( '\\', Path ) > 0 then @@ -463,57 +479,66 @@ {get a temp path to try: drive:\path1} TempPath := Copy( Path, 1, i ); {if it doesn't exist, create it} - if not DirectoryExists( TempPath ) then - MkDir( TempPath ); + if not mbDirectoryExists( TempPath ) then + if mbCreateDir( TempPath ) = False then + Exit; inc( iStartSlash ); until ( Length( TempPath ) = Length( Path ) ); end; + +function AbCreateSymlink(const LinksPointsTo, LinkName: String): Boolean; +begin +{$IF DEFINED(MSWINDOWS)} + // TODO: Implement using uNTFSLinks. + Result := False; +{$ELSEIF DEFINED(FPCUnixAPI)} + Result := (fpsymlink(PChar(UTF8ToSys(LinksPointsTo)),PChar(UTF8ToSys(LinkName)))=0); +{$ELSE} + Result := False; +{$ENDIF} +end; + { -------------------------------------------------------------------------- } function AbCreateTempFile(const Dir : string) : string; begin Result := AbGetTempFile(Dir, True); end; + +function AbReadSymlink(const LinkFile: String): String; +begin +{$IF DEFINED(MSWINDOWS)} + // TODO: Implement using uNTFSLinks. + Result := ''; +{$ELSEIF DEFINED(FPCUnixAPI)} + Result := SysToUTF8(fpReadlink(UTF8ToSys(LinkFile))); +{$ELSE} + Result := ''; +{$ENDIF} +end; + { -------------------------------------------------------------------------- } function AbGetTempDirectory : string; begin -{$IFDEF MSWiNDOWS} - SetLength(Result, MAX_PATH); - SetLength(Result, GetTempPath(Length(Result), PChar(Result))); -{$ENDIF} -{$IFDEF UNIX} - Result := '/tmp/'; -{$ENDIF} + Result:= SysToUTF8(GetTempDir); end; { -------------------------------------------------------------------------- } function AbGetTempFile(const Dir : string; CreateIt : Boolean) : string; var - TempPath : string; -{$IFDEF MSWINDOWS} - FileNameZ : array [0..259] of char; -{$ENDIF} -{$IFDEF UNIX} - hFile: Integer; - FileName: AbSysString; -{$ENDIF} + hFile: System.THandle; + TempPath : UTF8String; begin - if DirectoryExists(Dir) then - TempPath := Dir + if mbDirectoryExists(Dir) then + TempPath := IncludeTrailingPathDelimiter(Dir) else TempPath := AbGetTempDirectory; -{$IFDEF MSWINDOWS} - GetTempFileName(PChar(TempPath), 'VMS', Word(not CreateIt), FileNameZ); - Result := string(FileNameZ); -{$ENDIF} -{$IFDEF UNIX} - FileName := AbSysString(TempPath) + 'VMSXXXXXX'; - mktemp(PAnsiChar(AbSysString(FileName))); - Result := string(FileName); + + Result := GetTempName(TempPath + 'VMS'); + if CreateIt then begin - hFile := FileCreate(Result); - if hFile <> -1 then + hFile := mbFileCreate(Result); + if hFile <> feInvalidHandle then FileClose(hFile); end; -{$ENDIF} end; { -------------------------------------------------------------------------- } function AbDrive(const ArchiveName : string) : Char; @@ -560,8 +585,8 @@ var FreeAvailable, TotalSpace: Int64; begin - if GetDiskFreeSpaceEx(PChar(ExtractFilePath(ExpandFileName(ArchiveName))), - FreeAvailable, TotalSpace, nil) then + if GetDiskFreeSpaceExW(PWideChar(UTF8Decode(ExtractFilePath(ExpandFileName(ArchiveName)))), + FreeAvailable, TotalSpace, nil) then Result := FreeAvailable else Result := -1; @@ -574,7 +599,7 @@ if statfs(PAnsiChar(ExtractFilePath(ArchiveName)), FStats) = 0 then Result := Int64(FStats.f_bAvail) * Int64(FStats.f_bsize) {$ELSEIF DEFINED(FPCUnixAPI)} - if fpStatFS(PAnsiChar(ExtractFilePath(ArchiveName)), @FStats) = 0 then + if fpStatFS(PAnsiChar(UTF8ToSys(ExtractFilePath(ArchiveName))), @FStats) = 0 then Result := Int64(FStats.bAvail) * Int64(FStats.bsize) {$ELSEIF DEFINED(PosixAPI)} if statvfs(PAnsiChar(AbSysString(ExtractFilePath(ArchiveName))), FStats) = 0 then @@ -591,8 +616,8 @@ DirMatch : Boolean; MaskDir : string; begin - FileName := UpperCase( FileName ); - FileMask := UpperCase( FileMask ); +//FileName := UpperCase( FileName ); +//FileMask := UpperCase( FileMask ); MaskDir := ExtractFilePath( FileMask ); if MaskDir = '' then DirMatch := True @@ -614,12 +639,12 @@ Found := FindFirst( FileMask, SearchAttr, SR ); if Found = 0 then begin try - NameMask := UpperCase(ExtractFileName(FileMask)); + NameMask := ExtractFileName(FileMask); while Found = 0 do begin NewFile := ExtractFilePath( FileMask ) + SR.Name; if (SR.Name <> AbThisDir) and (SR.Name <> AbParentDir) and - AbPatternMatch(UpperCase(SR.Name), 1, NameMask, 1) then + AbPatternMatch(SR.Name, 1, NameMask, 1) then if (SR.Attr and faDirectory) <> 0 then FileList.Add( NewFile + PathDelim ) else @@ -1002,18 +1027,18 @@ function AbWriteVolumeLabel(const VolName : string; Drive : Char) : Cardinal; var - Temp : string; - Vol : array[0..11] of Char; - Root : array[0..3] of Char; + Temp : WideString; + Vol : array[0..11] of WideChar; + Root : array[0..3] of WideChar; begin - Temp := VolName; - StrCopy(Root, '%:' + AbPathDelim); + Temp := UTF8Decode(VolName); + StrPCopyW(Root, '%:' + AbPathDelim); Root[0] := Drive; if Length(Temp) > 11 then SetLength(Temp, 11); - StrPCopy(Vol, Temp); + StrPCopyW(Vol, Temp); {$IFDEF MSWINDOWS} - if Windows.SetVolumeLabel(Root, Vol) then + if Windows.SetVolumeLabelW(Root, Vol) then Result := 0 else Result := GetLastError; {$ENDIF MSWINDOWS} @@ -1166,12 +1191,7 @@ function AbSetFileTime(const aFileName: string; aValue: TDateTime): Boolean; begin - {$IFDEF MSWINDOWS} - Result := FileSetDate(aFileName, AbDateTimeToDosFileDate(aValue)) = 0; - {$ENDIF} - {$IFDEF UNIX} - Result := FileSetDate(aFileName, AbLocalDateTimeToUnixTime(aValue)) = 0; - {$ENDIF} + Result:= mbFileSetTime(aFileName, DateTimeToFileTime(aValue)); end; { -------------------------------------------------------------------------- } @@ -1188,7 +1208,8 @@ { -------------------------------------------------------------------------- } function AbDOS2UnixFileAttributes(Attr: LongInt): LongInt; begin - {$WARN SYMBOL_PLATFORM OFF} + {$IFDEF LINUX} {$IF NOT ((FPC_VERSION = 2) and (FPC_RELEASE = 6) and (FPC_PATCH = 0))} {$WARN SYMBOL_PLATFORM OFF} {$ENDIF} + {$ELSE} {$WARN SYMBOL_PLATFORM OFF} {$ENDIF} Result := { default permissions } AB_FPERMISSION_OWNERREAD or AB_FPERMISSION_GROUPREAD or @@ -1201,12 +1222,14 @@ Result := Result or AB_FMODE_DIR or AB_FPERMISSION_OWNEREXECUTE else Result := Result or AB_FMODE_FILE; - {$WARN SYMBOL_PLATFORM ON} + {$IFDEF LINUX} {$IF NOT ((FPC_VERSION = 2) and (FPC_RELEASE = 6) and (FPC_PATCH = 0))} {$WARN SYMBOL_PLATFORM ON} {$ENDIF} + {$ELSE} {$WARN SYMBOL_PLATFORM ON} {$ENDIF} end; { -------------------------------------------------------------------------- } function AbUnix2DosFileAttributes(Attr: LongInt): LongInt; begin - {$WARN SYMBOL_PLATFORM OFF} + {$IFDEF LINUX} {$IF NOT ((FPC_VERSION = 2) and (FPC_RELEASE = 6) and (FPC_PATCH = 0))} {$WARN SYMBOL_PLATFORM OFF} {$ENDIF} + {$ELSE} {$WARN SYMBOL_PLATFORM OFF} {$ENDIF} Result := 0; case (Attr and $F000) of AB_FMODE_FILE, AB_FMODE_FILE2: { standard file } @@ -1225,21 +1248,20 @@ if (Attr and AB_FPERMISSION_OWNERWRITE) <> AB_FPERMISSION_OWNERWRITE then Result := Result or faReadOnly; - {$WARN SYMBOL_PLATFORM ON} + {$IFDEF LINUX} {$IF NOT ((FPC_VERSION = 2) and (FPC_RELEASE = 6) and (FPC_PATCH = 0))} {$WARN SYMBOL_PLATFORM ON} {$ENDIF} + {$ELSE} {$WARN SYMBOL_PLATFORM ON} {$ENDIF} end; { -------------------------------------------------------------------------- } procedure AbSetFileAttr(const aFileName : string; aAttr: Integer); begin - {$WARN SYMBOL_PLATFORM OFF} {$IFDEF MSWINDOWS} - FileSetAttr(aFileName, aAttr); + mbFileSetAttr(aFileName, aAttr); {$ENDIF} {$IF DEFINED(LibcAPI) OR DEFINED(PosixAPI)} chmod(PAnsiChar(AbSysString(aFileName)), aAttr); {$ELSEIF DEFINED(FPCUnixAPI)} - fpchmod(aFileName, aAttr); + mbFileSetAttr(aFileName, aAttr); {$IFEND} - {$WARN SYMBOL_PLATFORM ON} end; { -------------------------------------------------------------------------- } function AbFileGetSize(const aFileName : string) : Int64; @@ -1252,12 +1274,12 @@ Result := -1; end; { -------------------------------------------------------------------------- } -function AbFileGetAttrEx(const aFileName: string; out aAttr: TAbAttrExRec) : Boolean; +function AbFileGetAttrEx(const aFileName: string; out aAttr: TAbAttrExRec; FollowLinks: Boolean = True) : Boolean; var {$IFDEF MSWINDOWS} FileDate: LongRec; - FindData: TWin32FindData; - LocalFileTime: TFileTime; + FindData: TWin32FindDataW; + LocalFileTime: Windows.TFileTime; {$ENDIF} {$IFDEF FPCUnixAPI} StatBuf: stat; @@ -1274,9 +1296,9 @@ aAttr.Attr := -1; aAttr.Mode := 0; {$IFDEF MSWINDOWS} - Result := GetFileAttributesEx(PChar(aFileName), GetFileExInfoStandard, @FindData); + Result := GetFileAttributesExW(PWideChar(UTF8Decode(aFileName)), GetFileExInfoStandard, @FindData); if Result then begin - if FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime) and + if Windows.FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime) and FileTimeToDosDateTime(LocalFileTime, FileDate.Hi, FileDate.Lo) then aAttr.Time := FileDateToDateTime(Integer(FileDate)); LARGE_INTEGER(aAttr.Size).LowPart := FindData.nFileSizeLow; @@ -1287,7 +1309,10 @@ {$ENDIF} {$IFDEF UNIX} {$IFDEF FPCUnixAPI} - Result := (FpStat(aFileName, StatBuf) = 0); + if FollowLinks then + Result := (FpStat(UTF8ToSys(aFileName), StatBuf) = 0) + else + Result := (FpLStat(UTF8ToSys(aFileName), StatBuf) = 0); {$ENDIF} {$IFDEF LibcAPI} // Work around Kylix QC#2761: Stat64, et al., are defined incorrectly @@ -1313,10 +1338,10 @@ {-Get the volume label for the specified drive.} {$IFDEF MSWINDOWS} var - Root : string; + Root : WideString; Flags, MaxLength : DWORD; NameSize : Integer; - VolName : string; + VolName : WideString; {$ENDIF} begin {$IFDEF MSWINDOWS} @@ -1326,10 +1351,10 @@ Result := ''; - if GetVolumeInformation(PChar(Root), PChar(VolName), Length(VolName), + if GetVolumeInformationW(PWideChar(Root), PWideChar(VolName), Length(VolName), nil, MaxLength, Flags, nil, NameSize) then - Result := VolName; + Result := UTF8Encode(VolName); {$ELSE} Result := ''; //Stop Gap, spanning support needs to be rethought for Unix {$ENDIF} Index: AbVMStrm.pas =================================================================== --- AbVMStrm.pas (revision 512) +++ AbVMStrm.pas (working copy) @@ -109,7 +109,8 @@ {$ENDIF} SysUtils, AbExcept, - AbUtils; + AbUtils, + DCOSUtils; const LastLRUValue = $7FFFFFFF; @@ -429,10 +430,10 @@ begin if (vmsSwapHandle = 0) then begin vmsSwapFileName := AbCreateTempFile(vmsSwapFileDir); - vmsSwapHandle := FileOpen(vmsSwapFileName, fmOpenReadWrite); + vmsSwapHandle := mbFileOpen(vmsSwapFileName, fmOpenReadWrite); if (vmsSwapHandle <= 0) then begin vmsSwapHandle := 0; - DeleteFile(vmsSwapFileName); + mbDeleteFile(vmsSwapFileName); raise EAbVMSErrorOpenSwap.Create( vmsSwapFileName ); end; vmsSwapFileSize := 0; @@ -443,7 +444,7 @@ begin if (vmsSwapHandle <> 0) then begin FileClose(vmsSwapHandle); - DeleteFile(vmsSwapFileName); + mbDeleteFile(vmsSwapFileName); vmsSwapHandle := 0; end; end; Index: AbZBrows.pas =================================================================== --- AbZBrows.pas (revision 512) +++ AbZBrows.pas (working copy) @@ -129,7 +129,7 @@ implementation uses - SysUtils, AbBzip2Typ, AbExcept, AbGzTyp, AbTarTyp, AbUtils; + SysUtils, AbBzip2Typ, AbExcept, AbGzTyp, AbTarTyp, AbUtils, DCOSUtils; { TAbCustomZipBrowser implementation ======================================= } @@ -205,7 +205,7 @@ FArchive := nil; if FileName <> '' then begin - if FileExists(FileName) then begin { open it } + if mbFileExists(FileName) then begin { open it } ArcType := ArchiveType; if not ForceType then ArcType := AbDetermineArcType(FileName, atUnknown); Index: AbZipper.pas =================================================================== --- AbZipper.pas (revision 512) +++ AbZipper.pas (working copy) @@ -173,7 +173,7 @@ implementation uses - SysUtils, AbUtils, AbTarTyp, AbGzTyp, AbBzip2Typ, AbExcept, AbZipPrc; + SysUtils, AbUtils, AbTarTyp, AbGzTyp, AbBzip2Typ, AbExcept, AbZipPrc, DCOSUtils; { -------------------------------------------------------------------------- } constructor TAbCustomZipper.Create( AOwner : TComponent ); @@ -399,7 +399,7 @@ ArcType := ArchiveType; if (FileName <> '') then - if FileExists(FileName) then begin { open it } + if mbFileExists(FileName) then begin { open it } if not ForceType then ArcType := AbDetermineArcType(FileName, atUnknown); @@ -411,33 +411,33 @@ end; atTar : begin - FArchive := TAbTarArchive.Create(FileName, fmOpenReadWrite or fmShareDenyNone); + FArchive := TAbTarArchive.Create(FileName, fmOpenRead or fmShareDenyNone); inherited InitArchive; end; atGZip : begin - FArchive := TAbGzipArchive.Create(FileName, fmOpenReadWrite or fmShareDenyNone); + FArchive := TAbGzipArchive.Create(FileName, fmOpenRead or fmShareDenyNone); TAbGzipArchive(FArchive).TarAutoHandle := FTarAutoHandle; TAbGzipArchive(FArchive).IsGzippedTar := False; inherited InitArchive; end; atGZippedTar : begin - FArchive := TAbGzipArchive.Create(FileName, fmOpenReadWrite or fmShareDenyNone); + FArchive := TAbGzipArchive.Create(FileName, fmOpenRead or fmShareDenyNone); TAbGzipArchive(FArchive).TarAutoHandle := FTarAutoHandle; TAbGzipArchive(FArchive).IsGzippedTar := True; inherited InitArchive; end; atBzip2 : begin - FArchive := TAbBzip2Archive.Create(FileName, fmOpenReadWrite or fmShareDenyNone); + FArchive := TAbBzip2Archive.Create(FileName, fmOpenRead or fmShareDenyNone); TAbBzip2Archive(FArchive).TarAutoHandle := FTarAutoHandle; TAbBzip2Archive(FArchive).IsBzippedTar := False; inherited InitArchive; end; atBzippedTar : begin - FArchive := TAbBzip2Archive.Create(FileName, fmOpenReadWrite or fmShareDenyNone); + FArchive := TAbBzip2Archive.Create(FileName, fmOpenRead or fmShareDenyNone); TAbBzip2Archive(FArchive).TarAutoHandle := FTarAutoHandle; TAbBzip2Archive(FArchive).IsBzippedTar := True; inherited InitArchive; @@ -455,38 +455,38 @@ case ArcType of atZip : begin - FArchive := TAbZipArchive.Create(FileName, fmCreate); + FArchive := TAbZipArchive.Create(FileName, fmCreate or fmShareDenyWrite); InitArchive; end; atTar : begin - FArchive := TAbTarArchive.Create(FileName, fmCreate or fmShareDenyNone); + FArchive := TAbTarArchive.Create(FileName, fmCreate or fmShareDenyWrite); inherited InitArchive; end; atGZip : begin - FArchive := TAbGzipArchive.Create(FileName, fmCreate or fmShareDenyNone); + FArchive := TAbGzipArchive.Create(FileName, fmCreate or fmShareDenyWrite); TAbGzipArchive(FArchive).TarAutoHandle := FTarAutoHandle; TAbGzipArchive(FArchive).IsGzippedTar := False; inherited InitArchive; end; atGZippedTar : begin - FArchive := TAbGzipArchive.Create(FileName, fmCreate or fmShareDenyNone); + FArchive := TAbGzipArchive.Create(FileName, fmCreate or fmShareDenyWrite); TAbGzipArchive(FArchive).TarAutoHandle := FTarAutoHandle; TAbGzipArchive(FArchive).IsGzippedTar := True; inherited InitArchive; end; atBzip2 : begin - FArchive := TAbBzip2Archive.Create(FileName, fmCreate or fmShareDenyNone); + FArchive := TAbBzip2Archive.Create(FileName, fmCreate or fmShareDenyWrite); TAbBzip2Archive(FArchive).TarAutoHandle := FTarAutoHandle; TAbBzip2Archive(FArchive).IsBzippedTar := False; inherited InitArchive; end; atBzippedTar : begin - FArchive := TAbBzip2Archive.Create(FileName, fmCreate or fmShareDenyNone); + FArchive := TAbBzip2Archive.Create(FileName, fmCreate or fmShareDenyWrite); TAbBzip2Archive(FArchive).TarAutoHandle := FTarAutoHandle; TAbBzip2Archive(FArchive).IsBzippedTar := True; inherited InitArchive; Index: AbZipPrc.pas =================================================================== --- AbZipPrc.pas (revision 512) +++ AbZipPrc.pas (working copy) @@ -67,7 +67,8 @@ AbVMStrm, AbDfBase, AbDfEnc, - AbSpanSt; + AbSpanSt, + DCClassesUtf8; { ========================================================================== } @@ -294,22 +295,14 @@ OutStream : TStream ); var UncompressedStream : TStream; - SaveDir : string; AttrEx : TAbAttrExRec; begin - GetDir(0, SaveDir); - try {SaveDir} - if (Sender.BaseDirectory <> '') then - ChDir(Sender.BaseDirectory); - AbFileGetAttrEx(Item.DiskFileName, AttrEx); - if ((AttrEx.Attr and faDirectory) <> 0) then - UncompressedStream := TMemoryStream.Create - else - UncompressedStream := - TFileStream.Create(Item.DiskFileName, fmOpenRead or fmShareDenyWrite); - finally {SaveDir} - ChDir( SaveDir ); - end; {SaveDir} + if not AbFileGetAttrEx(Item.DiskFileName, AttrEx) then + Raise EAbFileNotFound.Create; + if ((AttrEx.Attr and faDirectory) <> 0) then + UncompressedStream := TMemoryStream.Create + else + UncompressedStream := TFileStreamEx.Create(Item.DiskFileName, fmOpenRead or fmShareDenyWrite); try {UncompressedStream} {$IFDEF UNIX} Item.ExternalFileAttributes := LongWord(AttrEx.Mode) shl 16 + LongWord(AttrEx.Attr); Index: AbZipTyp.pas =================================================================== --- AbZipTyp.pas (revision 525) +++ AbZipTyp.pas (working copy) @@ -407,6 +407,7 @@ function GetLastModFileDate : Word; override; function GetLastModFileTime : Word; override; function GetNativeFileAttributes : LongInt; override; + function GetNativeLastModFileTime: Longint; override; procedure SetCompressedSize( const Value : Int64 ); override; procedure SetCRC32( const Value : Longint ); override; procedure SetExternalFileAttributes( Value : LongWord ); override; @@ -530,8 +531,8 @@ override; destructor Destroy; override; - function CreateItem(const FileName : string): TAbArchiveItem; - override; + function CreateItem(const SourceFileName : string; + const ArchiveDirectory : string): TAbArchiveItem; override; public {properties} property CompressionMethodToUse : TAbZipSupportedMethod @@ -620,11 +621,13 @@ {$ENDIF} {$ENDIF} Math, - AbCharset, AbResString, AbExcept, AbVMStrm, - SysUtils; + SysUtils, + DCOSUtils, + DCClassesUtf8, + DCConvertEncoding; function VerifyZip(Strm : TStream) : TAbArchiveType; { determine if stream appears to be in PkZip format } @@ -638,20 +641,31 @@ Result := atUnknown; try Strm.Position := 0; - Strm.Read(Sig, SizeOf(Sig)); - if (Sig = Ab_ZipSpannedSetSignature) then - Result := atSpannedZip - else begin - { attempt to find Central Directory Tail } - TailPosition := FindCentralDirectoryTail( Strm ); - if TailPosition <> -1 then begin - { check Central Directory Signature } - Strm.ReadBuffer(Footer, SizeOf(Footer)); - if Footer.Signature = Ab_ZipEndCentralDirectorySignature then - if Footer.DiskNumber = 0 then - Result := atZip - else - Result := atSpannedZip; + if Strm.Read(Sig, SizeOf(Sig)) = SizeOf(Sig) then + begin + if (Sig = Ab_ZipSpannedSetSignature) then + Result := atSpannedZip + else begin + { attempt to find Central Directory Tail } + TailPosition := FindCentralDirectoryTail( Strm ); + if TailPosition <> -1 then begin + { check Central Directory Signature } + if (Strm.Read(Footer, SizeOf(Footer)) = SizeOf(Footer)) and + (Footer.Signature = Ab_ZipEndCentralDirectorySignature) then + begin + { check Central Directory Offset } + if (Footer.DirectoryOffset = High(LongWord)) or + ((Strm.Seek(Footer.DirectoryOffset, soBeginning) = Footer.DirectoryOffset) and + (Strm.Read(Sig, SizeOf(Sig)) = SizeOf(Sig)) and + (Sig = Ab_ZipCentralDirectoryFileHeaderSignature)) then + begin + if Footer.DiskNumber = 0 then + Result := atZip + else + Result := atSpannedZip; + end; + end; + end; end; end; except @@ -733,15 +747,13 @@ leaves stream positioned at start of structure or at original position if not found } const - StartBufSize = 512; - MaxBufSize = 64 * 1024; + MaxBufSize = 256 * 1024; var StartPos : Int64; TailRec : TAbZipEndOfCentralDirectoryRecord; Buffer : PAnsiChar; Offset : Int64; TestPos : PAnsiChar; - Done : boolean; BytesRead : Int64; BufSize : Int64; CommentLen: integer; @@ -767,64 +779,48 @@ stream; we need to search for the tail signature} {get a buffer} - BufSize := StartBufSize; + BufSize := Min(MaxBufSize, aStream.Size); GetMem(Buffer, BufSize); try {start out searching backwards} Offset := -BufSize; - {while there is still data to search ...} - Done := false; - while not Done do begin + {seek to the search position} + Result := aStream.Seek(Offset, soEnd); + if (Result < 0) then begin + Result := aStream.Seek(0, soBeginning); + end; - {seek to the search position} - Result := aStream.Seek(Offset, soEnd); - if (Result <= 0) then begin - Result := aStream.Seek(0, soBeginning); - Done := true; - end; + {read a buffer full} + BytesRead := aStream.Read(Buffer^, BufSize); - {read a buffer full} - BytesRead := aStream.Read(Buffer^, BufSize); + if BytesRead < sizeOf(TailRec) then begin + Result := -1; + Exit; + end; - if BytesRead < sizeOf(TailRec) then begin - Result := -1; - Exit; - end; + {search backwards through the buffer looking for the signature} + TestPos := Buffer + BytesRead - sizeof(TailRec); + while (TestPos <> Buffer) and + (PLongint(TestPos)^ <> Ab_ZipEndCentralDirectorySignature) do + dec(TestPos); - {search backwards through the buffer looking for the signature} - TestPos := Buffer + BytesRead - sizeof(TailRec); - while (TestPos <> Buffer) and - (PLongint(TestPos)^ <> Ab_ZipEndCentralDirectorySignature) do - dec(TestPos); + {if we found the signature...} + if (PLongint(TestPos)^ = Ab_ZipEndCentralDirectorySignature) then begin - {if we found the signature...} - if (PLongint(TestPos)^ = Ab_ZipEndCentralDirectorySignature) then begin + {get the tail record at this position} + Move(TestPos^, TailRec, sizeof(TailRec)); - {get the tail record at this position} - Move(TestPos^, TailRec, sizeof(TailRec)); + {if it's as valid a tail as we can check here...} + CommentLen := -Offset - (TestPos - Buffer + sizeof(TailRec)); + if (TailRec.CommentLength <= CommentLen) then begin - {if it's as valid a tail as we can check here...} - CommentLen := -Offset - (TestPos - Buffer + sizeof(TailRec)); - if (TailRec.CommentLength <= CommentLen) then begin - - {calculate its position and exit} - Result := Result + (TestPos - Buffer); - aStream.Seek(Result, soBeginning); - Exit; - end; + {calculate its position and exit} + Result := Result + (TestPos - Buffer); + aStream.Seek(Result, soBeginning); + Exit; end; - - {otherwise move back one step, doubling the buffer} - if (BufSize < MaxBufSize) then begin - FreeMem(Buffer); - BufSize := BufSize * 2; - if BufSize > MaxBufSize then - BufSize := MaxBufSize; - GetMem(Buffer, BufSize); - end; - dec(Offset, BufSize - SizeOf(TailRec)); end; {if we reach this point, the CD tail is not present} @@ -1407,6 +1403,22 @@ Result := FItemInfo.FileName; end; { -------------------------------------------------------------------------- } +function TAbZipItem.GetNativeLastModFileTime: Longint; +{$IFDEF UNIX} +var + DateTime: TDateTime; +{$ENDIF} +begin + // Zip stores MS-DOS date/time. +{$IFDEF UNIX} + DateTime := AbDosFileDateToDateTime(LastModFileDate, LastModFileTime); + Result := AbLocalDateTimeToUnixTime(DateTime); +{$ELSE} + LongRec(Result).Hi := LastModFileDate; + LongRec(Result).Lo := LastModFileTime; +{$ENDIF} +end; +{ -------------------------------------------------------------------------- } function TAbZipItem.GetShannonFanoTreeCount : Byte; begin Result := FItemInfo.ShannonFanoTreeCount; @@ -1428,37 +1440,50 @@ FieldStream: TStream; InfoZipField: PInfoZipUnicodePathRec; UnicodeName: UnicodeString; - UTF8Name: AnsiString; + UTF8Name: UTF8String; XceedField: PXceedUnicodePathRec; + SystemCode: TAbZipHostOs; begin FItemInfo.LoadFromStream( Stream ); { decode filename (ANSI/OEM/UTF-8) } - if FItemInfo.IsUTF8 or (AbDetectCharSet(FItemInfo.FileName) = csUTF8) then - FFileName := UTF8ToString(FItemInfo.FileName) + if FItemInfo.IsUTF8 then + FFileName := FItemInfo.FileName else if FItemInfo.ExtraField.Get(Ab_InfoZipUnicodePathSubfieldID, Pointer(InfoZipField), FieldSize) and (FieldSize > SizeOf(TInfoZipUnicodePathRec)) and (InfoZipField.Version = 1) and (InfoZipField.NameCRC32 = AbCRC32Of(FItemInfo.FileName)) then begin SetString(UTF8Name, InfoZipField.UnicodeName, FieldSize - SizeOf(TInfoZipUnicodePathRec) + 1); - FFileName := UTF8ToString(UTF8Name); + FFileName := UTF8Name; end else if FItemInfo.ExtraField.Get(Ab_XceedUnicodePathSubfieldID, Pointer(XceedField), FieldSize) and (FieldSize > SizeOf(TXceedUnicodePathRec)) and (XceedField.Signature = Ab_XceedUnicodePathSignature) and (XceedField.Length * SizeOf(WideChar) = FieldSize - SizeOf(TXceedUnicodePathRec) + SizeOf(WideChar)) then begin SetString(UnicodeName, XceedField.UnicodeName, XceedField.Length); - FFileName := string(UnicodeName); + FFileName := UTF8Encode(UnicodeName); end - {$IFDEF MSWINDOWS} - else if (GetACP <> GetOEMCP) and ((HostOS = hosDOS) or AbIsOEM(FItemInfo.FileName)) then begin - SetLength(FFileName, Length(FItemInfo.FileName)); - OemToCharBuff(PAnsiChar(FItemInfo.FileName), PChar(FFileName), Length(FFileName)); - end - {$ENDIF} else - FFileName := string(FItemInfo.FileName); + begin + SystemCode := HostOS; + {$IF DEFINED(MSWINDOWS)} + if (GetACP <> GetOEMCP) and (SystemCode = hosDOS) then + FFileName := CeOemToUtf8(FItemInfo.FileName) + else if (GetACP <> GetOEMCP) and CeTryDecode(FItemInfo.FileName, CP_OEMCP, UnicodeName) then + FFileName := UTF8Encode(UnicodeName) + else if (SystemCode = hosNTFS) or (SystemCode = hosWinNT) then + FFileName := CeAnsiToUtf8(FItemInfo.FileName) + else + {$ELSEIF DEFINED(UNIX)} + if (SystemCode = hosDOS) then + FFileName := CeOemToUtf8(FItemInfo.FileName) + else if (SystemCode = hosNTFS) or (SystemCode = hosWinNT) then + FFileName := CeAnsiToUtf8(FItemInfo.FileName) + else + {$ENDIF} + FFileName := FItemInfo.FileName; + end; { read ZIP64 extended header } FUncompressedSize := FItemInfo.UncompressedSize; @@ -1586,7 +1611,7 @@ {$IFDEF MSWINDOWS} AnsiName : AnsiString; {$ENDIF} - UTF8Name : AnsiString; + UTF8Name : UTF8String; FieldSize : Word; I : Integer; InfoZipField : PInfoZipUnicodePathRec; @@ -1596,24 +1621,20 @@ {$IFDEF MSWINDOWS} FItemInfo.IsUTF8 := False; HostOS := hosDOS; - if AbTryEncode(Value, CP_OEMCP, False, AnsiName) then + if CeTryEncode(UTF8Decode(Value), CP_OEMCP, False, AnsiName) then {no-op} - else if (GetACP <> GetOEMCP) and AbTryEncode(Value, CP_ACP, False, AnsiName) then + else if (GetACP <> GetOEMCP) and CeTryEncode(UTF8Decode(Value), CP_ACP, False, AnsiName) then HostOS := hosWinNT - else if AbTryEncode(Value, CP_OEMCP, True, AnsiName) then - {no-op} - else if (GetACP <> GetOEMCP) and AbTryEncode(Value, CP_ACP, True, AnsiName) then - HostOS := hosWinNT else FItemInfo.IsUTF8 := True; if FItemInfo.IsUTF8 then - FItemInfo.FileName := Utf8Encode(Value) + FItemInfo.FileName := Value else FItemInfo.FileName := AnsiName; {$ENDIF} {$IFDEF UNIX} - FItemInfo.FileName := AnsiString(Value); - FItemInfo.IsUTF8 := AbSysCharSetIsUTF8; + FItemInfo.FileName := Value; + FItemInfo.IsUTF8 := SystemEncodingUtf8; {$ENDIF} UseExtraField := False; @@ -1626,7 +1647,7 @@ end; if UseExtraField then begin - UTF8Name := AnsiToUTF8(Value); + UTF8Name := Value; FieldSize := SizeOf(TInfoZipUnicodePathRec) + Length(UTF8Name) - 1; GetMem(InfoZipField, FieldSize); try @@ -1762,20 +1783,28 @@ inherited Destroy; end; { -------------------------------------------------------------------------- } -function TAbZipArchive.CreateItem( const FileName : string ): TAbArchiveItem; +function TAbZipArchive.CreateItem(const SourceFileName : string; + const ArchiveDirectory : string): TAbArchiveItem; var - FileSpec : string; + FullSourceFileName, FullArchiveFileName: string; begin - FileSpec := FileName; Result := TAbZipItem.Create; with TAbZipItem( Result ) do begin CompressionMethod := cmDeflated; GeneralPurposeBitFlag := 0; CompressedSize := 0; CRC32 := 0; - DiskFileName := ExpandFileName(FileSpec); - FileName := FixName(FileSpec); RelativeOffset := 0; + + MakeFullNames(SourceFileName, ArchiveDirectory, + FullSourceFileName, FullArchiveFileName); + + if mbDirectoryExists(FullSourceFileName) then begin + FullSourceFileName := IncludeTrailingPathDelimiter(FullSourceFileName); + end; + + Result.FileName := FullArchiveFileName; + Result.DiskFileName := FullSourceFileName; end; end; { -------------------------------------------------------------------------- } @@ -1930,8 +1959,8 @@ AbStripDots( lValue ); for i := 1 to Length( lValue ) do - if lValue[i] = '\' then - lValue[i] := '/'; + if lValue[i] = AbDosPathDelim then + lValue[i] := AbUnixPathDelim; Result := lValue; end; { -------------------------------------------------------------------------- } @@ -1983,7 +2012,7 @@ FStatus := asInvalid; //TODO: Status updates are extremely inconsistent raise EAbUserAbort.Create; end; - FStream := TFileStream.Create( ArchiveName, Mode ); + FStream := TFileStreamEx.Create( ArchiveName, Mode ); TailPosition := FindCentralDirectoryTail( FStream ); end; end; @@ -2302,7 +2331,7 @@ if FOwnsStream then begin {need new stream to write} FreeAndNil(FStream); - FStream := TFileStream.Create(FArchiveName, + FStream := TFileStreamEx.Create(FArchiveName, fmOpenReadWrite or fmShareDenyWrite); end; FStream.Size := 0; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abutils.pas�����������������������������������������������0000644�0001750�0001750�00000123253�12014201074�021706� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbUtils.pas *} {*********************************************************} {* ABBREVIA: Utility classes and routines *} {*********************************************************} unit AbUtils; {$I AbDefine.inc} interface uses {$IFDEF MSWINDOWS} Windows, {$ENDIF} {$IFDEF LibcAPI} Libc, {$ENDIF} {$IFDEF FPCUnixAPI} baseunix, {$IFDEF Linux} initc, {$ENDIF} unix, {$ENDIF} {$IFDEF PosixAPI} Posix.SysStatvfs, Posix.SysStat, Posix.Utime, Posix.Base, Posix.Unistd, Posix.Fcntl, Posix.SysTypes, {$ENDIF} {$IFDEF UNIX} DateUtils, DCClassesUtf8, {$ENDIF} SysUtils, Classes; type {describe the pending action for an archive item} TAbArchiveAction = (aaFailed, aaNone, aaAdd, aaDelete, aaFreshen, aaMove, aaReplace, aaStreamAdd); TAbProcessType = (ptAdd, ptDelete, ptExtract, ptFreshen, ptMove, ptReplace, ptFoundUnhandled); TAbLogType = (ltAdd, ltDelete, ltExtract, ltFreshen, ltMove, ltReplace, ltStart, ltFoundUnhandled); TAbErrorClass = (ecAbbrevia, ecInOutError, ecFilerError, ecFileCreateError, ecFileOpenError, ecCabError, ecOther); const AbPathDelim = PathDelim; { Delphi/Linux constant } AbPathSep = PathSep; { Delphi/Linux constant } AbDosPathDelim = '\'; AbUnixPathDelim = '/'; AbDosPathSep = ';'; AbUnixPathSep = ':'; AbDosAnyFile = '*.*'; AbUnixAnyFile = '*'; AbAnyFile = {$IFDEF UNIX} AbUnixAnyFile; {$ELSE} AbDosAnyFile; {$ENDIF} AbThisDir = '.'; AbParentDir = '..'; type TAbArchiveType = (atUnknown, atZip, atSpannedZip, atSelfExtZip, atTar, atGzip, atGzippedTar, atCab, atBzip2, atBzippedTar); {$IF NOT DECLARED(DWORD)} type DWORD = LongWord; {$IFEND} {$IF NOT DECLARED(PtrInt)} type // Delphi 7-2007 declared NativeInt incorrectly {$IFDEF CPU386} PtrInt = LongInt; PtrUInt = LongWord; {$ELSE} PtrInt = NativeInt; PtrUInt = NativeUInt; {$ENDIF} {$IFEND} { Unicode backwards compatibility types } {$IF NOT DECLARED(RawByteString)} type RawByteString = AnsiString; {$IFEND} { System-encoded SBCS string (formerly AnsiString) } type AbSysString = {$IFDEF Posix}UTF8String{$ELSE}AnsiString{$ENDIF}; const AbCrc32Table : array[0..255] of DWord = ( $00000000, $77073096, $ee0e612c, $990951ba, $076dc419, $706af48f, $e963a535, $9e6495a3, $0edb8832, $79dcb8a4, $e0d5e91e, $97d2d988, $09b64c2b, $7eb17cbd, $e7b82d07, $90bf1d91, $1db71064, $6ab020f2, $f3b97148, $84be41de, $1adad47d, $6ddde4eb, $f4d4b551, $83d385c7, $136c9856, $646ba8c0, $fd62f97a, $8a65c9ec, $14015c4f, $63066cd9, $fa0f3d63, $8d080df5, $3b6e20c8, $4c69105e, $d56041e4, $a2677172, $3c03e4d1, $4b04d447, $d20d85fd, $a50ab56b, $35b5a8fa, $42b2986c, $dbbbc9d6, $acbcf940, $32d86ce3, $45df5c75, $dcd60dcf, $abd13d59, $26d930ac, $51de003a, $c8d75180, $bfd06116, $21b4f4b5, $56b3c423, $cfba9599, $b8bda50f, $2802b89e, $5f058808, $c60cd9b2, $b10be924, $2f6f7c87, $58684c11, $c1611dab, $b6662d3d, $76dc4190, $01db7106, $98d220bc, $efd5102a, $71b18589, $06b6b51f, $9fbfe4a5, $e8b8d433, $7807c9a2, $0f00f934, $9609a88e, $e10e9818, $7f6a0dbb, $086d3d2d, $91646c97, $e6635c01, $6b6b51f4, $1c6c6162, $856530d8, $f262004e, $6c0695ed, $1b01a57b, $8208f4c1, $f50fc457, $65b0d9c6, $12b7e950, $8bbeb8ea, $fcb9887c, $62dd1ddf, $15da2d49, $8cd37cf3, $fbd44c65, $4db26158, $3ab551ce, $a3bc0074, $d4bb30e2, $4adfa541, $3dd895d7, $a4d1c46d, $d3d6f4fb, $4369e96a, $346ed9fc, $ad678846, $da60b8d0, $44042d73, $33031de5, $aa0a4c5f, $dd0d7cc9, $5005713c, $270241aa, $be0b1010, $c90c2086, $5768b525, $206f85b3, $b966d409, $ce61e49f, $5edef90e, $29d9c998, $b0d09822, $c7d7a8b4, $59b33d17, $2eb40d81, $b7bd5c3b, $c0ba6cad, $edb88320, $9abfb3b6, $03b6e20c, $74b1d29a, $ead54739, $9dd277af, $04db2615, $73dc1683, $e3630b12, $94643b84, $0d6d6a3e, $7a6a5aa8, $e40ecf0b, $9309ff9d, $0a00ae27, $7d079eb1, $f00f9344, $8708a3d2, $1e01f268, $6906c2fe, $f762575d, $806567cb, $196c3671, $6e6b06e7, $fed41b76, $89d32be0, $10da7a5a, $67dd4acc, $f9b9df6f, $8ebeeff9, $17b7be43, $60b08ed5, $d6d6a3e8, $a1d1937e, $38d8c2c4, $4fdff252, $d1bb67f1, $a6bc5767, $3fb506dd, $48b2364b, $d80d2bda, $af0a1b4c, $36034af6, $41047a60, $df60efc3, $a867df55, $316e8eef, $4669be79, $cb61b38c, $bc66831a, $256fd2a0, $5268e236, $cc0c7795, $bb0b4703, $220216b9, $5505262f, $c5ba3bbe, $b2bd0b28, $2bb45a92, $5cb36a04, $c2d7ffa7, $b5d0cf31, $2cd99e8b, $5bdeae1d, $9b64c2b0, $ec63f226, $756aa39c, $026d930a, $9c0906a9, $eb0e363f, $72076785, $05005713, $95bf4a82, $e2b87a14, $7bb12bae, $0cb61b38, $92d28e9b, $e5d5be0d, $7cdcefb7, $0bdbdf21, $86d3d2d4, $f1d4e242, $68ddb3f8, $1fda836e, $81be16cd, $f6b9265b, $6fb077e1, $18b74777, $88085ae6, $ff0f6a70, $66063bca, $11010b5c, $8f659eff, $f862ae69, $616bffd3, $166ccf45, $a00ae278, $d70dd2ee, $4e048354, $3903b3c2, $a7672661, $d06016f7, $4969474d, $3e6e77db, $aed16a4a, $d9d65adc, $40df0b66, $37d83bf0, $a9bcae53, $debb9ec5, $47b2cf7f, $30b5ffe9, $bdbdf21c, $cabac28a, $53b39330, $24b4a3a6, $bad03605, $cdd70693, $54de5729, $23d967bf, $b3667a2e, $c4614ab8, $5d681b02, $2a6f2b94, $b40bbe37, $c30c8ea1, $5a05df1b, $2d02ef8d ); type TAbPathType = ( ptNone, ptRelative, ptAbsolute ); {===Helper functions===} function AbCopyFile(const Source, Destination: string; FailIfExists: Boolean): Boolean; procedure AbCreateDirectory( const Path : string ); {creates the requested directory tree. CreateDir is insufficient, because if you have a path x:\dir, and request x:\dir\sub1\sub2, (/dir and /dir/sub1/sub2 on Unix) it fails.} function AbCreateSymlink( const LinksPointsTo, LinkName : String ): Boolean; function AbCreateTempFile(const Dir : string) : string; function AbReadSymlink( const LinkFile : String ): String; {Reads the name that a link points to.} function AbGetTempDirectory : string; {-Return the system temp directory} function AbGetTempFile(const Dir : string; CreateIt : Boolean) : string; function AbDrive(const ArchiveName : string) : Char; function AbDriveIsRemovable(const ArchiveName : string) : Boolean; function AbFileMatch(FileName : string; FileMask : string ) : Boolean; {see if FileName matches FileMask} procedure AbFindFiles(const FileMask : string; SearchAttr : Integer; FileList : TStrings; Recurse : Boolean ); procedure AbFindFilesEx( const FileMask : string; SearchAttr : Integer; FileList : TStrings; Recurse : Boolean ); function AbAddBackSlash(const DirName : string) : string; function AbFindNthSlash( const Path : string; n : Integer ) : Integer; {return the position of the character just before the nth backslash} function AbGetDriveFreeSpace(const ArchiveName : string) : Int64; {return the available space on the specified drive } function AbGetPathType( const Value : string ) : TAbPathType; {returns path type - none, relative or absolute} {$IFDEF MSWINDOWS} function AbGetShortFileSpec(const LongFileSpec : string ) : string; {$ENDIF} procedure AbIncFilename( var Filename : string; Value : Word ); procedure AbParseFileName( FileSpec : string; out Drive : string; out Path : string; out FileName : string ); procedure AbParsePath( Path : string; SubPaths : TStrings ); {- break abart path into subpaths --- Path : abbrevia/examples -> SubPaths[0] = abbrevia SubPaths[1] = examples} function AbPatternMatch(const Source : string; iSrc : Integer; const Pattern : string; iPat : Integer ) : Boolean; { recursive routine to see if the source string matches the pattern. Both ? and * wildcard characters are allowed.} function AbPercentage(V1, V2 : LongInt) : Byte; {-Returns the ratio of V1 to V2 * 100} procedure AbStripDots( var FName : string ); {-strips relative path information} procedure AbStripDrive( var FName : string ); {-strips the drive off a filename} procedure AbFixName( var FName : string ); {-changes backslashes to forward slashes} procedure AbUnfixName( var FName : string ); {-changes forward slashes to backslashes} procedure AbUpdateCRC( var CRC : LongInt; const Buffer; Len : Integer ); function AbUpdateCRC32(CurByte : Byte; CurCrc : LongInt) : LongInt; {-Returns an updated crc32} function AbCRC32Of( const aValue : RawByteString ) : LongInt; function AbWriteVolumeLabel(const VolName : string; Drive : Char) : Cardinal; const AB_SPAN_VOL_LABEL = 'PKBACK# %3.3d'; function AbGetVolumeLabel(Drive : Char) : string; procedure AbSetSpanVolumeLabel(Drive: Char; VolNo : Integer); function AbTestSpanVolumeLabel(Drive: Char; VolNo : Integer): Boolean; procedure AbSetFileAttr(const aFileName : string; aAttr: Integer); {-Sets platform-native file attributes (DOS attr or Unix mode)} function AbFileGetSize(const aFileName : string) : Int64; type TAbAttrExRec = record Time: TDateTime; Size: Int64; Attr: Integer; Mode: {$IFDEF UNIX}mode_t{$ELSE}Cardinal{$ENDIF}; end; function AbFileGetAttrEx(const aFileName: string; out aAttr: TAbAttrExRec; FollowLinks: Boolean = True) : Boolean; function AbSwapLongEndianness(Value : LongInt): LongInt; { date and time stuff } const Date1900 {: LongInt} = $0001AC05; {Julian day count for 01/01/1900 -- TDateTime Start Date} Date1970 {: LongInt} = $00020FE4; {Julian day count for 01/01/1970 -- Unix Start Date} Unix0Date: TDateTime = 25569; {Date1970 - Date1900} SecondsInDay = 86400; {Number of seconds in a day} SecondsInHour = 3600; {Number of seconds in an hour} SecondsInMinute = 60; {Number of seconds in a minute} HoursInDay = 24; {Number of hours in a day} MinutesInHour = 60; {Number of minutes in an hour} MinutesInDay = 1440; {Number of minutes in a day} function AbUnixTimeToLocalDateTime(UnixTime : LongInt) : TDateTime; function AbLocalDateTimeToUnixTime(DateTime : TDateTime) : LongInt; function AbDosFileDateToDateTime(FileDate, FileTime : Word) : TDateTime; function AbDateTimeToDosFileDate(Value : TDateTime) : LongInt; function AbGetFileTime(const aFileName: string): TDateTime; function AbSetFileTime(const aFileName: string; aValue: TDateTime): Boolean; { file attributes } function AbDOS2UnixFileAttributes(Attr: LongInt): LongInt; function AbUnix2DosFileAttributes(Attr: LongInt): LongInt; { UNIX File Types and Permissions } const AB_FMODE_FILE = $0000; AB_FMODE_FIFO = $1000; AB_FMODE_CHARSPECFILE = $2000; AB_FMODE_DIR = $4000; AB_FMODE_BLOCKSPECFILE = $6000; AB_FMODE_FILE2 = $8000; AB_FMODE_FILELINK = $A000; AB_FMODE_SOCKET = $C000; AB_FPERMISSION_OWNERREAD = $0100; { read by owner } AB_FPERMISSION_OWNERWRITE = $0080; { write by owner } AB_FPERMISSION_OWNEREXECUTE = $0040; { execute/search by owner } AB_FPERMISSION_GROUPREAD = $0020; { read by group } AB_FPERMISSION_GROUPWRITE = $0010; { write by group } AB_FPERMISSION_GROUPEXECUTE = $0008; { execute/search by group } AB_FPERMISSION_OTHERREAD = $0004; { read by other } AB_FPERMISSION_OTHERWRITE = $0002; { write by other } AB_FPERMISSION_OTHEREXECUTE = $0001; { execute/search by other } AB_FPERMISSION_GENERIC = AB_FPERMISSION_OWNERREAD or AB_FPERMISSION_OWNERWRITE or AB_FPERMISSION_GROUPREAD or AB_FPERMISSION_OTHERREAD; { Unicode backwards compatibility functions } {$IFNDEF UNICODE} function CharInSet(C: AnsiChar; CharSet: TSysCharSet): Boolean; {$ENDIF} implementation uses StrUtils, AbConst, AbExcept, DCOSUtils, DCStrUtils, DCDateTimeUtils; (* {$IF DEFINED(FPCUnixAPI)} function mktemp(template: PAnsiChar): PAnsiChar; cdecl; external clib name 'mktemp'; {$ELSEIF DEFINED(PosixAPI)} function mktemp(template: PAnsiChar): PAnsiChar; cdecl; external libc name _PU + 'mktemp'; {$IFEND} {$IF DEFINED(FPCUnixAPI) AND DEFINED(Linux)} // FreePascal libc definitions type nl_item = cint; const __LC_CTYPE = 0; _NL_CTYPE_CLASS = (__LC_CTYPE shl 16); _NL_CTYPE_CODESET_NAME = (_NL_CTYPE_CLASS)+14; function nl_langinfo(__item: nl_item): PAnsiChar; cdecl; external clib name 'nl_langinfo'; {$IFEND} *) {===platform independent routines for platform dependent stuff=======} function ExtractShortName(const SR : TSearchRec) : string; begin {$IFDEF MSWINDOWS} {$WARN SYMBOL_PLATFORM OFF} if SR.FindData.cAlternateFileName[0] <> #0 then Result := SR.FindData.cAlternateFileName else Result := SR.FindData.cFileName; {$WARN SYMBOL_PLATFORM ON} {$ENDIF} {$IFDEF UNIX} Result := SR.Name; {$ENDIF} end; {====================================================================} { ========================================================================== } function AbCopyFile(const Source, Destination: string; FailIfExists: Boolean): Boolean; {$IFDEF UNIX} var DesStream, SrcStream: TFileStreamEx; {$ENDIF} begin {$IFDEF UNIX} Result := False; if not FailIfExists or not mbFileExists(Destination) then try SrcStream := TFileStreamEx.Create(Source, fmOpenRead or fmShareDenyWrite); try DesStream := TFileStreamEx.Create(Destination, fmCreate); try DesStream.CopyFrom(SrcStream, 0); Result := True; finally DesStream.Free; end; finally SrcStream.Free; end; except // Ignore errors and just return false end; {$ENDIF UNIX} {$IFDEF MSWINDOWS} Result := CopyFileW(PWideChar(UTF8Decode(Source)), PWideChar(UTF8Decode(Destination)), FailIfExists); {$ENDIF MSWINDOWS} end; { -------------------------------------------------------------------------- } procedure AbCreateDirectory( const Path : string ); {creates the requested directory tree. CreateDir is insufficient, because if you have a path x:\dir, and request x:\dir\sub1\sub2, (/dir and /dir/sub1/sub2 on Unix) it fails.} var iStartSlash : Integer; i : Integer; TempPath : string; begin if mbDirectoryExists( Path ) then Exit; {see how much of the path currently exists} if Pos( '\\', Path ) > 0 then {UNC Path \\computername\sharename\path1..\pathn} iStartSlash := 5 else {standard Path drive:\path1..\pathn} iStartSlash := 2; repeat {find the Slash at iStartSlash} i := AbFindNthSlash( Path, iStartSlash ); {get a temp path to try: drive:\path1} TempPath := Copy( Path, 1, i ); {if it doesn't exist, create it} if not mbDirectoryExists( TempPath ) then if mbCreateDir( TempPath ) = False then Exit; inc( iStartSlash ); until ( Length( TempPath ) = Length( Path ) ); end; function AbCreateSymlink(const LinksPointsTo, LinkName: String): Boolean; begin {$IF DEFINED(MSWINDOWS)} // TODO: Implement using uNTFSLinks. Result := False; {$ELSEIF DEFINED(FPCUnixAPI)} Result := (fpsymlink(PChar(UTF8ToSys(LinksPointsTo)),PChar(UTF8ToSys(LinkName)))=0); {$ELSE} Result := False; {$ENDIF} end; { -------------------------------------------------------------------------- } function AbCreateTempFile(const Dir : string) : string; begin Result := AbGetTempFile(Dir, True); end; function AbReadSymlink(const LinkFile: String): String; begin {$IF DEFINED(MSWINDOWS)} // TODO: Implement using uNTFSLinks. Result := ''; {$ELSEIF DEFINED(FPCUnixAPI)} Result := SysToUTF8(fpReadlink(UTF8ToSys(LinkFile))); {$ELSE} Result := ''; {$ENDIF} end; { -------------------------------------------------------------------------- } function AbGetTempDirectory : string; begin Result:= SysToUTF8(GetTempDir); end; { -------------------------------------------------------------------------- } function AbGetTempFile(const Dir : string; CreateIt : Boolean) : string; var hFile: System.THandle; TempPath : UTF8String; begin if mbDirectoryExists(Dir) then TempPath := IncludeTrailingPathDelimiter(Dir) else TempPath := AbGetTempDirectory; Result := GetTempName(TempPath + 'VMS'); if CreateIt then begin hFile := mbFileCreate(Result); if hFile <> feInvalidHandle then FileClose(hFile); end; end; { -------------------------------------------------------------------------- } function AbDrive(const ArchiveName : string) : Char; var iPos: Integer; Path : string; begin Path := ExpandFileName(ArchiveName); iPos := Pos(':', Path); if (iPos <= 0) then Result := 'A' else Result := Path[1]; end; { -------------------------------------------------------------------------- } function AbDriveIsRemovable(const ArchiveName : string) : Boolean; {$IFDEF MSWINDOWS} var Path: string; {$ENDIF} begin {$IFDEF MSWINDOWS} Path := ExpandFileName(ArchiveName); if AnsiStartsText('\\?\UNC\', Path) then Delete(Path, 1, 8) else if AnsiStartsText('\\?\', Path) then Delete(Path, 1, 4); Path := IncludeTrailingPathDelimiter(ExtractFileDrive(Path)); Result := GetDriveType(PChar(Path)) = DRIVE_REMOVABLE; {$ENDIF} {$IFDEF LINUX} {LINUX -- Following may not cover all the bases} Result := AnsiStartsText('/mnt/floppy', ExtractFilePath(ExpandFileName(ArchiveName))); {$ENDIF} {$IFDEF DARWIN} Result := False; {$ENDIF} end; { -------------------------------------------------------------------------- } function AbGetDriveFreeSpace(const ArchiveName : string) : Int64; { attempt to find free space (in bytes) on drive/volume, returns -1 if fails for some reason } {$IFDEF MSWINDOWS} var FreeAvailable, TotalSpace: Int64; begin if GetDiskFreeSpaceExW(PWideChar(UTF8Decode(ExtractFilePath(ExpandFileName(ArchiveName)))), FreeAvailable, TotalSpace, nil) then Result := FreeAvailable else Result := -1; {$ENDIF} {$IFDEF UNIX} var FStats : {$IFDEF PosixAPI}_statvfs{$ELSE}TStatFs{$ENDIF}; begin {$IF DEFINED(LibcAPI)} if statfs(PAnsiChar(ExtractFilePath(ArchiveName)), FStats) = 0 then Result := Int64(FStats.f_bAvail) * Int64(FStats.f_bsize) {$ELSEIF DEFINED(FPCUnixAPI)} if fpStatFS(PAnsiChar(UTF8ToSys(ExtractFilePath(ArchiveName))), @FStats) = 0 then Result := Int64(FStats.bAvail) * Int64(FStats.bsize) {$ELSEIF DEFINED(PosixAPI)} if statvfs(PAnsiChar(AbSysString(ExtractFilePath(ArchiveName))), FStats) = 0 then Result := Int64(FStats.f_bavail) * Int64(FStats.f_bsize) {$IFEND} else Result := -1; {$ENDIF} end; { -------------------------------------------------------------------------- } function AbFileMatch(FileName: string; FileMask: string ): Boolean; {see if FileName matches FileMask} var DirMatch : Boolean; MaskDir : string; begin //FileName := UpperCase( FileName ); //FileMask := UpperCase( FileMask ); MaskDir := ExtractFilePath( FileMask ); if MaskDir = '' then DirMatch := True else DirMatch := AbPatternMatch( ExtractFilePath( FileName ), 1, MaskDir, 1 ); Result := DirMatch and AbPatternMatch( ExtractFileName( FileName ), 1, ExtractFileName( FileMask ), 1 ); end; { -------------------------------------------------------------------------- } procedure AbFindFiles( const FileMask : string; SearchAttr : Integer; FileList : TStrings; Recurse : Boolean ); var NewFile : string; SR : TSearchRec; Found : Integer; NameMask: string; begin Found := FindFirst( FileMask, SearchAttr, SR ); if Found = 0 then begin try NameMask := ExtractFileName(FileMask); while Found = 0 do begin NewFile := ExtractFilePath( FileMask ) + SR.Name; if (SR.Name <> AbThisDir) and (SR.Name <> AbParentDir) and AbPatternMatch(SR.Name, 1, NameMask, 1) then if (SR.Attr and faDirectory) <> 0 then FileList.Add( NewFile + PathDelim ) else FileList.Add( NewFile ); Found := FindNext( SR ); end; finally FindClose( SR ); end; end; if not Recurse then Exit; NewFile := ExtractFilePath( FileMask ); if ( NewFile <> '' ) and ( NewFile[Length(NewFile)] <> AbPathDelim) then NewFile := NewFile + AbPathDelim; NewFile := NewFile + AbAnyFile; Found := FindFirst( NewFile, faDirectory or SearchAttr, SR ); if Found = 0 then begin try while ( Found = 0 ) do begin if ( SR.Name <> AbThisDir ) and ( SR.Name <> AbParentDir ) and ((SR.Attr and faDirectory) > 0 ) then AbFindFiles( ExtractFilePath( NewFile ) + SR.Name + AbPathDelim + ExtractFileName( FileMask ), SearchAttr, FileList, True ); Found := FindNext( SR ); end; finally FindClose( SR ); end; end; end; { -------------------------------------------------------------------------- } procedure AbFindFilesEx( const FileMask : string; SearchAttr : Integer; FileList : TStrings; Recurse : Boolean ); var I, J: Integer; MaskPart: string; begin I := 1; while I <= Length(FileMask) do begin J := I; while (I <= Length(FileMask)) and (FileMask[I] <> AbPathSep) do Inc(I); MaskPart := Trim(Copy(FileMask, J, I - J)); if (I <= Length(FileMask)) and (FileMask[I] = AbPathSep) then Inc(I); AbFindFiles(MaskPart, SearchAttr, FileList, Recurse); end; end; { -------------------------------------------------------------------------- } function AbAddBackSlash(const DirName : string) : string; { Add a default slash to a directory name } const AbDelimSet : set of AnsiChar = [AbPathDelim, ':', #0]; begin Result := DirName; if Length(DirName) = 0 then Exit; if not CharInSet(DirName[Length(DirName)], AbDelimSet) then Result := DirName + AbPathDelim; end; { -------------------------------------------------------------------------- } function AbFindNthSlash( const Path : string; n : Integer ) : Integer; { return the position of the character just before the nth slash } var i : Integer; Len : Integer; iSlash : Integer; begin Len := Length( Path ); Result := Len; iSlash := 0; i := 0; while i <= Len do begin if Path[i] = AbPathDelim then begin inc( iSlash ); if iSlash = n then begin Result := pred( i ); break; end; end; inc( i ); end; end; { -------------------------------------------------------------------------- } function AbGetPathType( const Value : string ) : TAbPathType; { returns path type - none, relative or absolute } begin Result := ptNone; {$IFDEF MSWINDOWS} {check for drive/unc info} if ( Pos( '\\', Value ) > 0 ) or ( Pos( ':', Value ) > 0 ) then {$ENDIF MSWINDOWS} {$IFDEF UNIX} { UNIX absolute paths start with a slash } if (Value[1] = AbPathDelim) then {$ENDIF UNIX} Result := ptAbsolute else if ( Pos( AbPathDelim, Value ) > 0 ) or ( Pos( AB_ZIPPATHDELIM, Value ) > 0 ) then Result := ptRelative; end; { -------------------------------------------------------------------------- } {$IFDEF MSWINDOWS} {$WARN SYMBOL_PLATFORM OFF} function AbGetShortFileSpec(const LongFileSpec : string ) : string; var SR : TSearchRec; Search : string; Drive : string; Path : string; FileName : string; Found : Integer; SubPaths : TStrings; i : Integer; begin AbParseFileName( LongFileSpec, Drive, Path, FileName ); SubPaths := TStringList.Create; try AbParsePath( Path, SubPaths ); Search := Drive; Result := Search + AbPathDelim; if SubPaths.Count > 0 then for i := 0 to pred( SubPaths.Count ) do begin Search := Search + AbPathDelim + SubPaths[i]; Found := FindFirst( Search, faHidden + faSysFile + faDirectory, SR ); if Found <> 0 then raise EAbException.Create( 'Path not found' ); try Result := Result + ExtractShortName(SR) + AbPathDelim; finally FindClose( SR ); end; end; Search := Search + AbPathDelim + FileName; Found := FindFirst( Search, faReadOnly + faHidden + faSysFile + faArchive, SR ); if Found <> 0 then raise EAbFileNotFound.Create; try Result := Result + ExtractShortName(SR); finally FindClose( SR ); end; finally SubPaths.Free; end; end; {$WARN SYMBOL_PLATFORM ON} {$ENDIF} { -------------------------------------------------------------------------- } procedure AbIncFilename( var Filename : string; Value : Word ); { place value at the end of filename, e.g. Files.C04 } var Ext : string; I : Word; begin I := (Value + 1) mod 100; Ext := ExtractFileExt(Filename); if (Length(Ext) < 2) then Ext := '.' + Format('%.2d', [I]) else Ext := Ext[1] + Ext[2] + Format('%.2d', [I]); Filename := ChangeFileExt(Filename, Ext); end; { -------------------------------------------------------------------------- } procedure AbParseFileName( FileSpec : string; out Drive : string; out Path : string; out FileName : string ); var i : Integer; iColon : Integer; iStartSlash : Integer; begin if Pos( AB_ZIPPATHDELIM, FileSpec ) > 0 then AbUnfixName( FileSpec ); FileName := ExtractFileName( FileSpec ); Path := ExtractFilePath( FileSpec ); {see how much of the path currently exists} iColon := Pos( ':', Path ); if Pos( '\\', Path ) > 0 then begin {UNC Path \\computername\sharename\path1..\pathn} {everything up to the 4th slash is the drive} iStartSlash := 4; i := AbFindNthSlash( Path, iStartSlash ); Drive := Copy( Path, 1, i ); Delete( Path, 1, i + 1 ); end else if iColon > 0 then begin Drive := Copy( Path, 1, iColon ); Delete( Path, 1, iColon ); if Path[1] = AbPathDelim then Delete( Path, 1, 1 ); end; end; { -------------------------------------------------------------------------- } procedure AbParsePath( Path : string; SubPaths : TStrings ); { break abart path into subpaths --- Path : abbrevia/examples > SubPaths[0] = abbrevia SubPaths[1] = examples} var i : Integer; iStart : Integer; iStartSlash : Integer; SubPath : string; begin if Path = '' then Exit; if Path[ Length( Path ) ] = AbPathDelim then Delete( Path, Length( Path ), 1 ); iStart := 1; iStartSlash := 1; repeat {find the Slash at iStartSlash} i := AbFindNthSlash( Path, iStartSlash ); {get the subpath} SubPath := Copy( Path, iStart, i - iStart + 1 ); iStart := i + 2; inc( iStartSlash ); SubPaths.Add( SubPath ); until ( i = Length( Path ) ); end; { -------------------------------------------------------------------------- } function AbPatternMatch(const Source : string; iSrc : Integer; const Pattern : string; iPat : Integer ) : Boolean; { recursive routine to see if the source string matches the pattern. Both ? and * wildcard characters are allowed. Compares Source from iSrc to Length(Source) to Pattern from iPat to Length(Pattern)} var Matched : Boolean; k : Integer; begin if Length( Source ) = 0 then begin Result := Length( Pattern ) = 0; Exit; end; if iPat = 1 then begin if ( CompareStr( Pattern, AbDosAnyFile) = 0 ) or ( CompareStr( Pattern, AbUnixAnyFile ) = 0 ) then begin Result := True; Exit; end; end; if Length( Pattern ) = 0 then begin Result := (Length( Source ) - iSrc + 1 = 0); Exit; end; while True do begin if ( Length( Source ) < iSrc ) and ( Length( Pattern ) < iPat ) then begin Result := True; Exit; end; if Length( Pattern ) < iPat then begin Result := False; Exit; end; if Pattern[iPat] = '*' then begin k := iPat; if ( Length( Pattern ) < iPat + 1 ) then begin Result := True; Exit; end; while True do begin Matched := AbPatternMatch( Source, k, Pattern, iPat + 1 ); if Matched or ( Length( Source ) < k ) then begin Result := Matched; Exit; end; inc( k ); end; end else begin if ( (Pattern[iPat] = '?') and ( Length( Source ) <> iSrc - 1 ) ) or ( Pattern[iPat] = Source[iSrc] ) then begin inc( iPat ); inc( iSrc ); end else begin Result := False; Exit; end; end; end; end; { -------------------------------------------------------------------------- } function AbPercentage(V1, V2 : LongInt) : Byte; { Returns the ratio of V1 to V2 * 100 } begin if V2 > 16384000 then begin {Possible LongInt overflow} V1 := (V1 + $80) shr 8; {scale down (div 256)} V2 := (V2 + $80) shr 8; {scale down (div 256)} end; if V2 <= 0 then Result := 0 else if V1 >= V2 then Result := 100 else Result := (V1 * 100) div V2; end; { -------------------------------------------------------------------------- } procedure AbStripDots( var FName : string ); { strips relative path information, e.g. ".."} begin while Pos( AbParentDir + AbPathDelim, FName ) = 1 do System.Delete( FName, 1, 3 ); end; { -------------------------------------------------------------------------- } procedure AbStripDrive( var FName : string ); { strips the drive off a filename } var Drive, Path, Name : string; begin AbParseFileName( FName, Drive, Path, Name ); FName := Path + Name; end; { -------------------------------------------------------------------------- } procedure AbFixName( var FName : string ); { changes backslashes to forward slashes } var i : Integer; begin for i := 1 to Length( FName ) do if FName[i] = AbPathDelim then FName[i] := AB_ZIPPATHDELIM; end; { -------------------------------------------------------------------------- } procedure AbUnfixName( var FName : string ); { changes forward slashes to backslashes } var i : Integer; begin for i := 1 to Length( FName ) do if FName[i] = AB_ZIPPATHDELIM then FName[i] := AbPathDelim; end; { -------------------------------------------------------------------------- } procedure AbUpdateCRC( var CRC : LongInt; const Buffer; Len : Integer ); var BufPtr : PByte; i : Integer; CRCTemp : DWORD; begin BufPtr := @Buffer; CRCTemp := CRC; for i := 0 to pred( Len ) do begin CRCTemp := AbCrc32Table[ Byte(CrcTemp) xor (BufPtr^) ] xor ((CrcTemp shr 8) and $00FFFFFF); Inc(BufPtr); end; CRC := CRCTemp; end; { -------------------------------------------------------------------------- } function AbUpdateCRC32(CurByte : Byte; CurCrc : LongInt) : LongInt; { Return the updated 32bit CRC } { Normally a good candidate for basm, but Delphi32's code generation couldn't be beat on this one!} begin Result := DWORD(AbCrc32Table[ Byte(CurCrc xor LongInt( CurByte ) ) ] xor ((CurCrc shr 8) and DWORD($00FFFFFF))); end; { -------------------------------------------------------------------------- } function AbCRC32Of( const aValue : RawByteString ) : LongInt; begin Result := -1; AbUpdateCRC(Result, aValue[1], Length(aValue)); Result := not Result; end; { -------------------------------------------------------------------------- } function AbWriteVolumeLabel(const VolName : string; Drive : Char) : Cardinal; var Temp : WideString; Vol : array[0..11] of WideChar; Root : array[0..3] of WideChar; begin Temp := UTF8Decode(VolName); StrPCopyW(Root, '%:' + AbPathDelim); Root[0] := Drive; if Length(Temp) > 11 then SetLength(Temp, 11); StrPCopyW(Vol, Temp); {$IFDEF MSWINDOWS} if Windows.SetVolumeLabelW(Root, Vol) then Result := 0 else Result := GetLastError; {$ENDIF MSWINDOWS} {$IFDEF UNIX} { Volume labels not supported on Unix } Result := 0; {$ENDIF UNIX} end; { -------------------------------------------------------------------------- } {$IFDEF MSWINDOWS} function AbOffsetFromUTC: LongInt; { local timezone's offset from UTC in seconds (UTC = local + bias) } var TZI: TTimeZoneInformation; begin case GetTimeZoneInformation(TZI) of TIME_ZONE_ID_UNKNOWN: Result := TZI.Bias; TIME_ZONE_ID_DAYLIGHT: Result := TZI.Bias + TZI.DaylightBias; TIME_ZONE_ID_STANDARD: Result := TZI.Bias + TZI.StandardBias else Result := 0 end; Result := Result * SecondsInMinute; end; {$ENDIF} { -------------------------------------------------------------------------- } function AbUnixTimeToLocalDateTime(UnixTime : LongInt) : TDateTime; { convert UTC unix date to Delphi TDateTime in local timezone } {$IFDEF MSWINDOWS} var Hrs, Mins, Secs : Word; TodaysSecs : LongInt; Time: TDateTime; begin UnixTime := UnixTime - AbOffsetFromUTC; TodaysSecs := UnixTime mod SecondsInDay; Hrs := TodaysSecs div SecondsInHour; TodaysSecs := TodaysSecs - (Hrs * SecondsInHour); Mins := TodaysSecs div SecondsInMinute; Secs := TodaysSecs - (Mins * SecondsInMinute); if TryEncodeTime(Hrs, Mins, Secs, 0, Time) then Result := Unix0Date + (UnixTime div SecondsInDay) + Time else Result := 0; {$ENDIF} {$IFDEF UNIX} begin Result := FileDateToDateTime(UnixTime); {$ENDIF} end; { -------------------------------------------------------------------------- } function AbLocalDateTimeToUnixTime(DateTime : TDateTime) : LongInt; { convert local Delphi TDateTime to UTC unix date } {$IFDEF MSWINDOWS} var Hrs, Mins, Secs, MSecs : Word; Dt, Tm : TDateTime; begin Dt := Trunc(DateTime); Tm := DateTime - Dt; if Dt < Unix0Date then Result := 0 else Result := Trunc(Dt - Unix0Date) * SecondsInDay; DecodeTime(Tm, Hrs, Mins, Secs, MSecs); Result := Result + (Hrs * SecondsInHour) + (Mins * SecondsInMinute) + Secs; Result := Result + AbOffsetFromUTC; {$ENDIF} {$IFDEF UNIX} begin Result := DateTimeToFileDate(DateTime); {$ENDIF} end; { -------------------------------------------------------------------------- } function AbDosFileDateToDateTime(FileDate, FileTime : Word) : TDateTime; {$IFDEF MSWINDOWS} var Temp : LongInt; begin LongRec(Temp).Lo := FileTime; LongRec(Temp).Hi := FileDate; Result := FileDateToDateTime(Temp); {$ENDIF MSWINDOWS} {$IFDEF UNIX} var Yr, Mo, Dy : Word; Hr, Mn, S : Word; begin Yr := FileDate shr 9 + 1980; Mo := FileDate shr 5 and 15; if Mo < 1 then Mo := 1; if Mo > 12 then Mo := 12; Dy := FileDate and 31; if Dy < 1 then Dy := 1; if Dy > DaysInAMonth(Yr, Mo) then Dy := DaysInAMonth(Yr, Mo); Hr := FileTime shr 11; if Hr > 23 then Hr := 23; Mn := FileTime shr 5 and 63; if Mn > 59 then Mn := 59; S := FileTime and 31 shl 1; if S > 59 then S := 59; Result := EncodeDate(Yr, Mo, Dy) + EncodeTime(Hr, Mn, S, 0); {$ENDIF UNIX} end; function AbDateTimeToDosFileDate(Value : TDateTime) : LongInt; {$IFDEF MSWINDOWS} begin Result := DateTimeToFileDate(Value); {$ENDIF MSWINDOWS} {$IFDEF UNIX} var Yr, Mo, Dy : Word; Hr, Mn, S, MS: Word; begin DecodeDate(Value, Yr, Mo, Dy); if (Yr < 1980) or (Yr > 2107) then { outside DOS file date year range } Yr := 1980; DecodeTime(Value, Hr, Mn, S, MS); LongRec(Result).Lo := (S shr 1) or (Mn shl 5) or (Hr shl 11); LongRec(Result).Hi := Dy or (Mo shl 5) or (Word(Yr - 1980) shl 9); {$ENDIF UNIX} end; { -------------------------------------------------------------------------- } function AbGetFileTime(const aFileName: string): TDateTime; var Attr: TAbAttrExRec; begin AbFileGetAttrEx(aFileName, Attr); Result := Attr.Time; end; function AbSetFileTime(const aFileName: string; aValue: TDateTime): Boolean; begin Result:= mbFileSetTime(aFileName, DateTimeToFileTime(aValue)); end; { -------------------------------------------------------------------------- } function AbSwapLongEndianness(Value : LongInt): LongInt; { convert BigEndian <-> LittleEndian 32-bit value } type TCastArray = array [0..3] of Byte; var i : Integer; begin for i := 3 downto 0 do TCastArray(Result)[3-i] := TCastArray(Value)[i]; end; { -------------------------------------------------------------------------- } function AbDOS2UnixFileAttributes(Attr: LongInt): LongInt; begin {$IFDEF LINUX} {$IF NOT ((FPC_VERSION = 2) and (FPC_RELEASE = 6) and (FPC_PATCH = 0))} {$WARN SYMBOL_PLATFORM OFF} {$ENDIF} {$ELSE} {$WARN SYMBOL_PLATFORM OFF} {$ENDIF} Result := { default permissions } AB_FPERMISSION_OWNERREAD or AB_FPERMISSION_GROUPREAD or AB_FPERMISSION_OTHERREAD; if (Attr and faReadOnly) = 0 then Result := Result or AB_FPERMISSION_OWNERWRITE; if (Attr and faDirectory) <> 0 then Result := Result or AB_FMODE_DIR or AB_FPERMISSION_OWNEREXECUTE else Result := Result or AB_FMODE_FILE; {$IFDEF LINUX} {$IF NOT ((FPC_VERSION = 2) and (FPC_RELEASE = 6) and (FPC_PATCH = 0))} {$WARN SYMBOL_PLATFORM ON} {$ENDIF} {$ELSE} {$WARN SYMBOL_PLATFORM ON} {$ENDIF} end; { -------------------------------------------------------------------------- } function AbUnix2DosFileAttributes(Attr: LongInt): LongInt; begin {$IFDEF LINUX} {$IF NOT ((FPC_VERSION = 2) and (FPC_RELEASE = 6) and (FPC_PATCH = 0))} {$WARN SYMBOL_PLATFORM OFF} {$ENDIF} {$ELSE} {$WARN SYMBOL_PLATFORM OFF} {$ENDIF} Result := 0; case (Attr and $F000) of AB_FMODE_FILE, AB_FMODE_FILE2: { standard file } Result := 0; AB_FMODE_DIR: { directory } Result := Result or faDirectory; AB_FMODE_FIFO, AB_FMODE_CHARSPECFILE, AB_FMODE_BLOCKSPECFILE, AB_FMODE_FILELINK, AB_FMODE_SOCKET: Result := Result or faSysFile; end; if (Attr and AB_FPERMISSION_OWNERWRITE) <> AB_FPERMISSION_OWNERWRITE then Result := Result or faReadOnly; {$IFDEF LINUX} {$IF NOT ((FPC_VERSION = 2) and (FPC_RELEASE = 6) and (FPC_PATCH = 0))} {$WARN SYMBOL_PLATFORM ON} {$ENDIF} {$ELSE} {$WARN SYMBOL_PLATFORM ON} {$ENDIF} end; { -------------------------------------------------------------------------- } procedure AbSetFileAttr(const aFileName : string; aAttr: Integer); begin {$IFDEF MSWINDOWS} mbFileSetAttr(aFileName, aAttr); {$ENDIF} {$IF DEFINED(LibcAPI) OR DEFINED(PosixAPI)} chmod(PAnsiChar(AbSysString(aFileName)), aAttr); {$ELSEIF DEFINED(FPCUnixAPI)} mbFileSetAttr(aFileName, aAttr); {$IFEND} end; { -------------------------------------------------------------------------- } function AbFileGetSize(const aFileName : string) : Int64; var SR: TAbAttrExRec; begin if AbFileGetAttrEx(aFileName, SR) then Result := SR.Size else Result := -1; end; { -------------------------------------------------------------------------- } function AbFileGetAttrEx(const aFileName: string; out aAttr: TAbAttrExRec; FollowLinks: Boolean = True) : Boolean; var {$IFDEF MSWINDOWS} FileDate: LongRec; FindData: TWin32FindDataW; LocalFileTime: Windows.TFileTime; {$ENDIF} {$IFDEF FPCUnixAPI} StatBuf: stat; {$ENDIF} {$IFDEF LibcAPI} StatBuf: TStatBuf64; {$ENDIF} {$IFDEF PosixAPI} StatBuf: _stat; {$ENDIF} begin aAttr.Time := 0; aAttr.Size := -1; aAttr.Attr := -1; aAttr.Mode := 0; {$IFDEF MSWINDOWS} Result := GetFileAttributesExW(PWideChar(UTF8Decode(aFileName)), GetFileExInfoStandard, @FindData); if Result then begin if Windows.FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime) and FileTimeToDosDateTime(LocalFileTime, FileDate.Hi, FileDate.Lo) then aAttr.Time := FileDateToDateTime(Integer(FileDate)); LARGE_INTEGER(aAttr.Size).LowPart := FindData.nFileSizeLow; LARGE_INTEGER(aAttr.Size).HighPart := FindData.nFileSizeHigh; aAttr.Attr := FindData.dwFileAttributes; aAttr.Mode := AbDOS2UnixFileAttributes(FindData.dwFileAttributes); end; {$ENDIF} {$IFDEF UNIX} {$IFDEF FPCUnixAPI} if FollowLinks then Result := (FpStat(UTF8ToSys(aFileName), StatBuf) = 0) else Result := (FpLStat(UTF8ToSys(aFileName), StatBuf) = 0); {$ENDIF} {$IFDEF LibcAPI} // Work around Kylix QC#2761: Stat64, et al., are defined incorrectly Result := (__lxstat64(_STAT_VER, PAnsiChar(aFileName), StatBuf) = 0); {$ENDIF} {$IFDEF PosixAPI} Result := (stat(PAnsiChar(AbSysString(aFileName)), StatBuf) = 0); {$ENDIF} if Result then begin aAttr.Time := FileDateToDateTime(StatBuf.st_mtime); aAttr.Size := StatBuf.st_size; aAttr.Attr := AbUnix2DosFileAttributes(StatBuf.st_mode); aAttr.Mode := StatBuf.st_mode; end; {$ENDIF UNIX} end; const MAX_VOL_LABEL = 16; function AbGetVolumeLabel(Drive : Char) : string; {-Get the volume label for the specified drive.} {$IFDEF MSWINDOWS} var Root : WideString; Flags, MaxLength : DWORD; NameSize : Integer; VolName : WideString; {$ENDIF} begin {$IFDEF MSWINDOWS} NameSize := 0; Root := Drive + ':\'; SetLength(VolName, MAX_VOL_LABEL); Result := ''; if GetVolumeInformationW(PWideChar(Root), PWideChar(VolName), Length(VolName), nil, MaxLength, Flags, nil, NameSize) then Result := UTF8Encode(VolName); {$ELSE} Result := ''; //Stop Gap, spanning support needs to be rethought for Unix {$ENDIF} end; procedure AbSetSpanVolumeLabel(Drive: Char; VolNo : Integer); begin AbWriteVolumeLabel(Format(AB_SPAN_VOL_LABEL, [VolNo]), Drive); end; function AbTestSpanVolumeLabel(Drive: Char; VolNo : Integer): Boolean; var VolLabel, TestLabel : string; begin TestLabel := Format(AB_SPAN_VOL_LABEL, [VolNo]); VolLabel := UpperCase(AbGetVolumeLabel(Drive)); Result := VolLabel = TestLabel; end; { Unicode backwards compatibility functions } {$IFNDEF UNICODE} function CharInSet(C: AnsiChar; CharSet: TSysCharSet): Boolean; begin Result := C in CharSet; end; {$ENDIF} end. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abunzoutstm.pas�������������������������������������������0000644�0001750�0001750�00000013645�12014201074�022641� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is Craig Peterson * * Portions created by the Initial Developer are Copyright (C) 2011 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Craig Peterson <capeterson@users.sourceforge.net> * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbUnzOutStm.pas *} {*********************************************************} {* ABBREVIA: UnZip output stream; progress and CRC32 *} {*********************************************************} unit AbUnzOutStm; {$I AbDefine.inc} interface uses SysUtils, Classes, AbArcTyp; type // Fixed-length read-only stream, limits reads to the range between // the input stream's starting position and a specified size. Seek/Position // are adjusted to be 0 based. TAbUnzipSubsetStream = class( TStream ) private FStream : TStream; FStartPos: Int64; FCurPos: Int64; FEndPos: Int64; public constructor Create(aStream: TStream; aStreamSize: Int64); function Read(var Buffer; Count: Longint): Longint; override; function Write(const Buffer; Count: Longint): Longint; override; function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override; end; // Write-only output stream, computes CRC32 and calls progress event TAbUnzipOutputStream = class( TStream ) private FBytesWritten : Int64; FCRC32 : LongInt; FCurrentProgress : Byte; FStream : TStream; FUncompressedSize : Int64; FOnProgress : TAbProgressEvent; function GetCRC32 : LongInt; public constructor Create(aStream : TStream); function Read(var Buffer; Count: Longint): Longint; override; function Write(const Buffer; Count: Longint): Longint; override; function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override; property CRC32 : LongInt read GetCRC32; property Stream : TStream read FStream write FStream; property UncompressedSize : Int64 read FUncompressedSize write FUncompressedSize; property OnProgress : TAbProgressEvent read FOnProgress write FOnProgress; end; implementation uses Math, AbExcept, AbUtils; { TAbUnzipSubsetStream implementation ====================================== } { -------------------------------------------------------------------------- } constructor TAbUnzipSubsetStream.Create(aStream: TStream; aStreamSize: Int64); begin inherited Create; FStream := aStream; FStartPos := FStream.Position; FCurPos := FStartPos; FEndPos := FStartPos + aStreamSize; end; { -------------------------------------------------------------------------- } function TAbUnzipSubsetStream.Read(var Buffer; Count: Longint): Longint; begin if Count > FEndPos - FCurPos then Count := FEndPos - FCurPos; if Count > 0 then begin Result := FStream.Read(Buffer, Count); Inc(FCurPos, Result); end else Result := 0; end; { -------------------------------------------------------------------------- } function TAbUnzipSubsetStream.Write(const Buffer; Count: Longint): Longint; begin raise EAbException.Create('TAbUnzipSubsetStream.Write not supported'); end; { -------------------------------------------------------------------------- } function TAbUnzipSubsetStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; var OldPos: Int64; begin OldPos := FCurPos; case Origin of soBeginning: FCurPos := FStartPos + Offset; soCurrent: FCurPos := FCurPos + Offset; soEnd: FCurPos := FEndPos + Offset; end; if FCurPos < FStartPos then FCurPos := FStartPos; if FCurPos > FEndPos then FCurPos := FEndPos; if OldPos <> FCurPos then FStream.Position := FCurPos; Result := FCurPos - FStartPos; end; { -------------------------------------------------------------------------- } { TAbUnzipOutputStream implementation ====================================== } { -------------------------------------------------------------------------- } constructor TAbUnzipOutputStream.Create(aStream: TStream); begin inherited Create; FStream := aStream; FCRC32 := -1; end; { -------------------------------------------------------------------------- } function TAbUnzipOutputStream.Read(var Buffer; Count: Integer): Longint; begin raise EAbException.Create('TAbUnzipOutputStream.Read not supported'); end; { -------------------------------------------------------------------------- } function TAbUnzipOutputStream.Write(const Buffer; Count: Longint): Longint; var Abort : Boolean; NewProgress : Byte; begin Result := FStream.Write(Buffer, Count); AbUpdateCRC( FCRC32, Buffer, Count ); Inc( FBytesWritten, Result ); if Assigned( FOnProgress ) then begin Abort := False; NewProgress := AbPercentage(FBytesWritten, FUncompressedSize); if (NewProgress <> FCurrentProgress) then begin FOnProgress( NewProgress, Abort ); FCurrentProgress := NewProgress; end; if Abort then raise EAbUserAbort.Create; end; end; { -------------------------------------------------------------------------- } function TAbUnzipOutputStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; begin Result := FStream.Seek(Offset, Origin); end; { -------------------------------------------------------------------------- } function TAbUnzipOutputStream.GetCRC32: LongInt; begin Result := not FCRC32; end; end. �������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abdfinw.pas�����������������������������������������������0000644�0001750�0001750�00000053741�12014201074�021661� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbDfInW.pas *} {*********************************************************} {* Deflate input sliding window unit *} {*********************************************************} unit AbDfInW; {$I AbDefine.inc} interface uses Classes, AbDfBase; {Notes: TdfInputWindow implements a sliding window on data for the LZ77 dictionary encoding. The stream passed to the class is automatically read when required to keep the internal buffer fully loaded. } type TAbDfMatch = record maLen : integer; maDist : integer; maLit : AnsiChar; end; type PAbPointerList = ^TAbPointerList; TAbPointerList = array[0..MaxInt div SizeOf(Pointer) - 1] of Pointer; TAbDfInputWindow = class private FAdvanceStart : boolean; FBuffer : PAnsiChar; FBufferEnd : PAnsiChar; FBytesUsed : longint; FChainLen : integer; FHashChains : PAbPointerList; FHashHeads : PAbPointerList; FHashIndex : integer; FChecksum : longint; FCurrent : PAnsiChar; FLookAheadEnd : PAnsiChar; FMaxMatchLen : integer; FMustSlide : boolean; FOnProgress : TAbProgressStep; FSlidePoint : PAnsiChar; FStart : PAnsiChar; FStartOffset : longint; FStream : TStream; FStreamSize : longint; FUseCRC32 : boolean; FUseDeflate64 : boolean; FWinMask : integer; FWinSize : integer; protected function iwGetChecksum : longint; procedure iwReadFromStream; procedure iwSetCapacity(aValue : longint); procedure iwSlide; public constructor Create(aStream : TStream; aStreamSize : longint; aWinSize : integer; aChainLength : integer; aUseDeflate64 : boolean; aUseCRC32 : boolean); destructor Destroy; override; procedure Advance(aCount : integer; aHashCount : integer); procedure AdvanceByOne; function FindLongestMatch(aAmpleLength : integer; var aMatch : TAbDfMatch; const aPrevMatch : TAbDfMatch) : boolean; function GetNextChar : AnsiChar; function GetNextKeyLength : integer; function Position : longint; procedure ReadBuffer(var aBuffer; aCount : longint; aOffset : Int64); property ChainLen : integer read FChainLen write FChainLen; property Checksum : longint read iwGetChecksum; property OnProgress : TAbProgressStep read FOnProgress write FOnProgress; end; implementation uses SysUtils; {Notes: Meaning of the internal pointers: |----------+===================+==+--------------------------| | | | | | FBuffer FStart FCurrent FLookAheadEnd FBufferEnd FCurrent is the current match position. The valid data that can be matched is between FStart and FLookAheadEnd, The data between FStart and FCurrent has already been seen; the data between FCurrent and FLookAheadEnd can be used for matching. The buffer size depends on the requested window size (a multiple of 1KB, up to 32KB for deflate, up to 64KB for deflate64) and the lookahead size (up to 258 bytes for deflate and 64KB for deflate64.) The window of data continuously slides to the right, and is slid back to FBuffer whenever FStart reaches a point 16KB away, this point being given by FSlidePoint. The hash table: This is a chained hash table with some peculiarities. First the table itself, FHashHeads. It contains pointers to strings in the window buffer, not to chains. The chains are held is a separate structure, FHashChains. The hash function on the three-character keys is a Rabin-Karp function: ((((Ch1 shl 5) xor Ch2) shl 5) xor Ch3) and $3FFF designed so that a running hash value can be kept and calculated per character. The hash table is $4000 elements long (obviously, given the hash function). On insertion, the previous pointer in the hash table at the calculated index is saved and replaced by the new pointer. The old pointer is saved in the chains array. This has the same number of elements as the sliding window has characters. The pointer is placed at (Ptr and (WindowsSize-1)) overwriting the value that's already there. In this fashion the individual chains in the standard hash table are interwoven with each other in this hash table, like a skein of threads. } const c_HashCount = $4000; {the number of hash entries} c_HashMask = c_HashCount - 1; {a mask for the hash function} c_HashShift = 5; {shift value for the hash function} {===TAbDfInputWindow=================================================} constructor TAbDfInputWindow.Create(aStream : TStream; aStreamSize : longint; aWinSize : integer; aChainLength : integer; aUseDeflate64 : boolean; aUseCRC32 : boolean); begin {create the ancestor} inherited Create; {save parameters} FStreamSize := aStreamSize; FWinSize := aWinSize; FWinMask := aWinSize - 1; FStream := aStream; FChainLen := aChainLength; FUseDeflate64 := aUseDeflate64; FUseCRC32 := aUseCRC32; if aUseCRC32 then FChecksum := -1 { CRC32 starts off with all bits set } else FCheckSum := 1; { Adler32 starts off with a value of 1 } {set capacity of sliding window} iwSetCapacity(aWinSize); {create the hash table, first the hash table itself (and set all entries to nil)} FHashHeads := AllocMem(c_HashCount * sizeof(pointer)); {..now the chains (there's no need to set the entries to nil, since the chain entries get fed from the head entries before searching)} GetMem(FHashChains, aWinSize * sizeof(pointer)); {read the first chunk of data from the stream} FMustSlide := true; iwReadFromStream; {if there are at least two bytes, prime the hash index} if ((FLookAheadEnd - FBuffer) >= 2) then FHashIndex := ((longint(FBuffer[0]) shl c_HashShift) xor longint(FBuffer[1])) and c_HashMask; end; {--------} destructor TAbDfInputWindow.Destroy; begin {free the hash table} FreeMem(FHashHeads); FreeMem(FHashChains); {free the buffer} FreeMem(FBuffer); {destroy the ancestor} inherited Destroy; end; {--------} procedure TAbDfInputWindow.Advance(aCount : integer; aHashCount : integer); var i : integer; ByteCount : integer; Percent : integer; HashChains: PAbPointerList; HashHeads : PAbPointerList; HashInx : integer; CurPos : PAnsiChar; begin Assert((FLookAheadEnd - FCurrent) >= aCount, 'TAbDfInputWindow.Advance: seem to be advancing into the unknown'); Assert((aHashCount = aCount) or (aHashCount = pred(aCount)), 'TAbDfInputWindow.Advance: the parameters are plain wrong'); {use local var for speed} CurPos := FCurrent; {advance the current pointer if needed} if (aCount > aHashCount) then inc(CurPos); {make sure we update the hash table; remember that the string[3] at the current position has already been added to the hash table (for notes on updating the hash table, see FindLongestMatch} {use local vars for speed} HashChains := FHashChains; HashHeads := FHashHeads; HashInx := FHashIndex; {update the hash table} for i := 0 to pred(aHashCount) do begin HashInx := ((HashInx shl c_HashShift) xor longint(CurPos[2])) and c_HashMask; HashChains^[PtrUInt(CurPos) and FWinMask] := HashHeads^[HashInx]; HashHeads^[HashInx] := CurPos; inc(CurPos); end; {replace old values} FHashChains := HashChains; FHashHeads := HashHeads; FHashIndex := HashInx; FCurrent := CurPos; {if we've seen at least FWinSize bytes...} if FAdvanceStart then begin {advance the start of the sliding window} inc(FStart, aCount); inc(FStartOffset, aCount); {check to see if we have advanced into the slide zone} if FMustSlide and (FStart >= FSlidePoint) then iwSlide; end {otherwise check to see if we've seen at least FWinSize bytes} else if ((CurPos - FStart) >= FWinSize) then begin FAdvanceStart := true; {note: we can't advance automatically aCount bytes here, we need to calculate the actual count} ByteCount := (CurPos - FWinSize) - FStart; inc(FStart, ByteCount); inc(FStartOffset, ByteCount); end; {show progress} if Assigned(FOnProgress) then begin inc(FBytesUsed, aCount); if ((FBytesUsed and $FFF) = 0) then begin Percent := Round((100.0 * FBytesUsed) / FStreamSize); FOnProgress(Percent); end; end; {check to see if we have advanced into the slide zone} if (FStart >= FSlidePoint) then iwSlide; end; {--------} procedure TAbDfInputWindow.AdvanceByOne; var Percent : integer; begin {advance the current pointer} inc(FCurrent); {if we've seen at least FWinSize bytes...} if FAdvanceStart then begin {advance the start of the sliding window} inc(FStart, 1); inc(FStartOffset, 1); {check to see if we have advanced into the slide zone} if FMustSlide and (FStart >= FSlidePoint) then iwSlide; end {otherwise check to see if we've seen FWinSize bytes} else if ((FCurrent - FStart) = FWinSize) then FAdvanceStart := true; {show progress} if Assigned(FOnProgress) then begin inc(FBytesUsed, 1); if ((FBytesUsed and $FFF) = 0) then begin Percent := Round((100.0 * FBytesUsed) / FStreamSize); FOnProgress(Percent); end; end; end; {--------} function TAbDfInputWindow.FindLongestMatch(aAmpleLength : integer; var aMatch : TAbDfMatch; const aPrevMatch : TAbDfMatch) : boolean; {Note: this routine implements a greedy algorithm and is by far the time sink for compression. There are two versions, one written in Pascal for understanding, one in assembler for speed. Activate one and only one of the following compiler defines.} {$IFDEF CPU386} {$DEFINE UseGreedyAsm} {$ELSE} {$DEFINE UseGreedyPascal} {$ENDIF} {Check to see that all is correct} {$IFDEF UseGreedyAsm} {$IFDEF UseGreedyPascal} !! Compile Error: only one of the greedy compiler defines can be used {$ENDIF} {$ELSE} {$IFNDEF UseGreedyPascal} !! Compile Error: one of the greedy compiler defines must be used {$ENDIF} {$ENDIF} type PWord = ^word; var MaxLen : longint; MaxDist : longint; MaxMatch : integer; ChainLen : integer; PrevStrPos : PAnsiChar; CurPos : PAnsiChar; {$IFDEF UseGreedyAsm} CurWord : word; MaxWord : word; {$ENDIF} {$IFDEF UseGreedyPascal} Len : longint; MatchStr : PAnsiChar; CurrentCh : PAnsiChar; CurCh : AnsiChar; MaxCh : AnsiChar; {$ENDIF} begin {calculate the hash index for the current position; using the Rabin-Karp algorithm this is equal to the previous index less the effect of the character just lost plus the effect of the character just gained} CurPos := FCurrent; FHashIndex := ((FHashIndex shl c_HashShift) xor longint(CurPos[2])) and c_HashMask; {get the head of the hash chain: this is the position in the sliding window of the previous 3-character string with this hash value} PrevStrPos := FHashHeads^[FHashIndex]; {set the head of the hash chain equal to our current position} FHashHeads^[FHashIndex] := CurPos; {update the chain itself: set the entry for this position equal to the previous string position} FHashChains^[PtrUInt(CurPos) and FWinMask] := PrevStrPos; {calculate the maximum match we could do at this position} MaxMatch := (FLookAheadEnd - CurPos); if (MaxMatch > FMaxMatchLen) then MaxMatch := FMaxMatchLen; if (aAmpleLength > MaxMatch) then aAmpleLength := MaxMatch; {calculate the current match length} if (aPrevMatch.maLen = 0) then MaxLen := 2 else begin if (MaxMatch < aPrevMatch.maLen) then begin Result := false; aMatch.maLen := 0; aMatch.maLit := CurPos^; Exit; end; MaxLen := aPrevMatch.maLen; end; {get the bytes at the current position and at the end of the maximum match we have to better} {$IFDEF UseGreedyAsm} CurWord := PWord(CurPos)^; MaxWord := PWord(CurPos + pred(MaxLen))^; {$ENDIF} {$IFDEF UseGreedyPascal} CurCh := CurPos^; MaxCh := (CurPos + pred(MaxLen))^; {$ENDIF} {set the chain length to search based on the current maximum match (basically: if we've already satisfied the ample length requirement, don't search as far)} if (MaxLen >= aAmpleLength) then ChainLen := FChainLen div 4 else ChainLen := FChainLen; {get ready for the loop} {$IFDEF DefeatWarnings} MaxDist := 0; {$ENDIF} {$IFDEF UseGreedyAsm} { slip into assembler for speed...} asm push ebx { save those registers we should} push esi push edi mov ebx, Self { ebx will store the Self pointer} mov edi, PrevStrPos { edi => previous string} mov esi, CurPos { esi => current string} @@TestThisPosition: { check previous string is in range} or edi, edi je @@Exit cmp edi, [ebx].TAbDfInputWindow.FStart jb @@Exit cmp edi, CurPos jae @@Exit mov ax, [edi] { check previous string starts with same} cmp CurWord, ax { two bytes as current} jne @@GetNextPosition { ..nope, they don't match} mov edx, edi { check previous string ends with same} add edi, MaxLen { two bytes as current (by "ends" we} dec edi { mean the last two bytes at the} mov ax, [edi] { current match length)} cmp MaxWord, ax mov edi, edx jne @@GetNextPosition { ..nope, they don't match} push edi { compare the previous string with the} push esi { current string} mov eax, MaxMatch add edi, 2 { (we've already checked that the first} sub eax, 2 { two characters are the same)} add esi, 2 mov ecx, eax @@CmpQuads: cmp ecx, 4 jb @@CmpSingles mov edx, [esi] cmp edx, [edi] jne @@CmpSingles add esi, 4 add edi, 4 sub ecx, 4 jnz @@CmpQuads jmp @@MatchCheck @@CmpSingles: or ecx, ecx jb @@MatchCheck mov dl, [esi] cmp dl, [edi] jne @@MatchCheck inc esi inc edi dec ecx jnz @@CmpSingles @@MatchCheck: sub eax, ecx add eax, 2 pop esi pop edi cmp eax, MaxLen { have we found a longer match?} jbe @@GetNextPosition { ..no} mov MaxLen, eax { ..yes, so save it} mov eax, esi { calculate the dist for this new match} sub eax, edi mov MaxDist, eax cmp eax, aAmpleLength { if this match is ample enough, exit} jae @@Exit mov eax, esi { calculate the two bytes at the end of} add eax, MaxLen { this new match} dec eax mov ax, [eax] mov MaxWord, ax @@GetNextPosition: mov eax, ChainLen { we've visited one more link on the} dec eax { chain, if that's the last one we} je @@Exit { should visit, exit} mov ChainLen, eax { advance along the chain} mov edx, [ebx].TAbDfInputWindow.FHashChains mov eax, [ebx].TAbDfInputWindow.FWinMask and edi, eax shl edi, 2 mov edi, [edx+edi] jmp @@TestThisPosition @@Exit: pop edi pop esi pop ebx end; {$ENDIF} {$IFDEF UseGreedyPascal} {for all possible hash nodes in the chain...} while (FStart <= PrevStrPos) and (PrevStrPos < CurPos) do begin {if the initial and maximal characters match...} if (PrevStrPos[0] = CurCh) and (PrevStrPos[pred(MaxLen)] = MaxCh) then begin {compare more characters} Len := 1; CurrentCh := CurPos + 1; MatchStr := PrevStrPos + 1; {compare away, but don't go above the maximum length} while (Len < MaxMatch) and (MatchStr^ = CurrentCh^) do begin inc(CurrentCh); inc(MatchStr); inc(Len); end; {have we reached another maximum for the length?} if (Len > MaxLen) then begin MaxLen := Len; {calculate the distance} MaxDist := CurPos - PrevStrPos; MaxCh := CurPos[pred(MaxLen)]; {is the new best length ample enough?} if MaxLen >= aAmpleLength then Break; end; end; {have we reached the end of this chain?} dec(ChainLen); if (ChainLen = 0) then Break; {otherwise move onto the next position} PrevStrPos := FHashChains^[PtrUInt(PrevStrPos) and FWinMask]; end; {$ENDIF} {based on the results of our investigation, return the match values} if (MaxLen < 3) or (MaxLen <= aPrevMatch.maLen) then begin Result := false; aMatch.maLen := 0; aMatch.maLit := CurPos^; end else begin Result := true; aMatch.maLen := MaxLen; aMatch.maDist := MaxDist; aMatch.maLit := CurPos^; { just in case...} end; end; {--------} function TAbDfInputWindow.GetNextChar : AnsiChar; begin Result := FCurrent^; inc(FCurrent); end; {--------} function TAbDfInputWindow.GetNextKeyLength : integer; begin Result := FLookAheadEnd - FCurrent; if (Result > 3) then Result := 3; end; {--------} function TAbDfInputWindow.iwGetChecksum : longint; begin {the CRC32 checksum algorithm requires a post-conditioning step after being calculated (the result is NOTted), whereas Adler32 does not} if FUseCRC32 then Result := not FChecksum else Result := FChecksum; end; {--------} procedure TAbDfInputWindow.iwReadFromStream; var BytesRead : longint; BytesToRead : longint; begin {read some more data into the look ahead zone} BytesToRead := FBufferEnd - FLookAheadEnd; BytesRead := FStream.Read(FLookAheadEnd^, BytesToRead); {if nothing was read, we reached the end of the stream; hence there's no more need to slide the window since we have all the data} if (BytesRead = 0) then FMustSlide := false {otherwise something was actually read...} else begin {update the checksum} if FUseCRC32 then AbUpdateCRCBuffer(FChecksum, FLookAheadEnd^, BytesRead) else AbUpdateAdlerBuffer(FChecksum, FLookAheadEnd^, BytesRead); {reposition the pointer for the end of the lookahead area} inc(FLookAheadEnd, BytesRead); end; end; {--------} procedure TAbDfInputWindow.iwSetCapacity(aValue : longint); var ActualSize : integer; begin {calculate the actual size; this will be the value passed in, plus the correct look ahead size, plus 16KB} ActualSize := aValue + (16 * 1024); if FUseDeflate64 then begin inc(ActualSize, dfc_MaxMatchLen64); FMaxMatchLen := dfc_MaxMatchLen64; end else begin inc(ActualSize, dfc_MaxMatchLen); FMaxMatchLen := dfc_MaxMatchLen; end; {get the new buffer} GetMem(FBuffer, ActualSize); {set the other buffer pointers} FStart := FBuffer; FCurrent := FBuffer; FLookAheadEnd := FBuffer; FBufferEnd := FBuffer + ActualSize; FSlidePoint := FBuffer + (16 * 1024); end; {--------} procedure TAbDfInputWindow.iwSlide; var i : integer; ByteCount : PtrInt; Buffer : PAnsiChar; ListItem : PPointer; begin {move current valid data back to the start of the buffer} ByteCount := FLookAheadEnd - FStart; Move(FStart^, FBuffer^, ByteCount); {reset the various pointers} ByteCount := FStart - FBuffer; FStart := FBuffer; dec(FCurrent, ByteCount); dec(FLookAheadEnd, ByteCount); {patch up the hash table: the head pointers} Buffer := FBuffer; ListItem := @FHashHeads^[0]; for i := 0 to pred(c_HashCount) do begin dec(ListItem^, ByteCount); if (ListItem^ < Buffer) then ListItem^ := nil; inc(ListItem); end; {..the chain pointers} ListItem := @FHashChains^[0]; for i := 0 to pred(FWinSize) do begin dec(ListItem^, ByteCount); if (ListItem^ < Buffer) then ListItem^ := nil; inc(ListItem); end; {now read some more data from the stream} iwReadFromStream; end; {--------} function TAbDfInputWindow.Position : longint; begin Result := (FCurrent - FStart) + FStartOffset; end; {--------} procedure TAbDfInputWindow.ReadBuffer(var aBuffer; aCount : longint; aOffset : Int64); var CurPos : Int64; begin CurPos := FStream.Seek(0, soCurrent); FStream.Seek(aOffSet, soBeginning); FStream.ReadBuffer(aBuffer, aCount); FStream.Seek(CurPos, soBeginning); end; {====================================================================} end. �������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abvmstrm.pas����������������������������������������������0000644�0001750�0001750�00000041606�12014201074�022077� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbVMStrm.pas *} {*********************************************************} {* ABBREVIA: Virtual Memory Stream *} {*********************************************************} unit AbVMStrm; {$I AbDefine.inc} interface uses Classes; const AB_VMSPageSize = 4096; {must be a power of two} AB_VMSMaxPages = 2048; {makes 8MB with the above value} type PvmsPage = ^TvmsPage; TvmsPage = packed record vpStmOfs : Int64; {value will be multiple of AB_VMSPageSize} vpLRU : integer; {'time' page was last accessed} vpDirty : Boolean; {has the page been changed?} vpData : array [0..pred(AB_VMSPageSize)] of byte; {stream data} end; type TAbVirtualMemoryStream = class(TStream) protected {private} vmsCachePage : PvmsPage; {the latest page used} vmsLRU : Longint; {'tick' value} vmsMaxMemToUse : Longword; {maximum memory to use for data} vmsMaxPages : Integer; {maximum data pages} vmsPageList : TList; {page array, sorted by offset} vmsPosition : Int64; {position of stream} vmsSize : Int64; {size of stream} vmsSwapFileDir : string; {swap file directory} vmsSwapFileName : string; {swap file name} vmsSwapFileSize : Int64; {size of swap file} vmsSwapHandle : System.THandle; {swap file handle} protected procedure vmsSetMaxMemToUse(aNewMem : Longword); function vmsAlterPageList(aNewMem : Longword) : Longword; procedure vmsFindOldestPage(out OldestInx : Longint; out OldestPage: PvmsPage); function vmsGetNextLRU : Longint; function vmsGetPageForOffset(aOffset : Int64) : PvmsPage; procedure vmsSwapFileCreate; procedure vmsSwapFileDestroy; procedure vmsSwapFileRead(aPage : PvmsPage); procedure vmsSwapFileWrite(aPage : PvmsPage); public constructor Create; {-create the virtual memory stream} destructor Destroy; override; {-destroy the virtual memory stream} function Read(var Buffer; Count : Longint) : Longint; override; {-read from the stream into a buffer} function Write(const Buffer; Count : Longint) : Longint; override; {-write to the stream from a buffer} function Seek(const Offset : Int64; Origin : TSeekOrigin) : Int64; override; {-seek to a particular point in the stream} procedure SetSize(const NewSize : Int64); override; {-set the stream size} property MaxMemToUse : Longword read vmsMaxMemToUse write vmsSetMaxMemToUse; {-maximum memory to use for data before swapping to disk} property SwapFileDirectory : string read vmsSwapFileDir write vmsSwapFileDir; end; implementation uses {$IFDEF MSWINDOWS} Windows, // Fix warning about unexpanded inline functions {$ENDIF} SysUtils, AbExcept, AbUtils, DCOSUtils; const LastLRUValue = $7FFFFFFF; {===TAbVirtualMemoryStream===========================================} constructor TAbVirtualMemoryStream.Create; var Page : PvmsPage; begin inherited Create; {create the page array} vmsPageList := TList.Create; {create the first page} New(Page); with Page^ do begin vpStmOfs := 0; vpLRU := vmsGetNextLRU; vpDirty := False; FillChar(vpData, AB_VMSPageSize, 0); end; vmsPageList.Insert(0, pointer(Page)); {prime the cache, from now on the cache will never be nil} vmsCachePage := Page; {default to using all allowed pages} MaxMemToUse := AB_VMSMaxPages * AB_VMSPageSize; end; {--------} destructor TAbVirtualMemoryStream.Destroy; var Inx : integer; begin {destroy the swap file} vmsSwapFileDestroy; {throw away all pages in the list} if (vmsPageList <> nil) then begin for Inx := 0 to pred(vmsPageList.Count) do Dispose(PvmsPage(vmsPageList[Inx])); vmsPageList.Destroy; end; {let our ancestor clean up} inherited Destroy; end; {--------} function TAbVirtualMemoryStream.Read(var Buffer; Count : Longint) : Longint; var BufPtr : PByte; Page : PvmsPage; PageDataInx : integer; Posn : int64; BytesToGo : int64; BytesToRead : int64; StartOfs : int64; begin {reading is complicated by the fact we can only read in chunks of AB_VMSPageSize: we need to partition out the overall read into a read from a partial page, zero or more reads from complete pages and then a possible read from a partial page} {initialise some variables, note that the complex calc in the expression for PageDataInx is the offset of the start of the page where Posn is found.} BufPtr := @Buffer; Posn := vmsPosition; PageDataInx := Posn - (Posn and (not pred(AB_VMSPageSize))); BytesToRead := AB_VMSPageSize - PageDataInx; {calculate the actual number of bytes to read - this depends on the current position and size of the stream} BytesToGo := Count; if (vmsSize < (vmsPosition + Count)) then BytesToGo := vmsSize - vmsPosition; if (BytesToGo < 0) then BytesToGo := 0; Result := BytesToGo; {while we have bytes to read, read them} while (BytesToGo <> 0) do begin if (BytesToRead > BytesToGo) then BytesToRead := BytesToGo; StartOfs := Posn and (not pred(AB_VMSPageSize)); if (vmsCachePage^.vpStmOfs = StartOfs) then Page := vmsCachePage else Page := vmsGetPageForOffset(StartOfs); Move(Page^.vpData[PageDataInx], BufPtr^, BytesToRead); dec(BytesToGo, BytesToRead); inc(Posn, BytesToRead); inc(BufPtr, BytesToRead); PageDataInx := 0; BytesToRead := AB_VMSPageSize; end; {remember our new position} vmsPosition := Posn; end; {--------} function TAbVirtualMemoryStream.Seek(const Offset : Int64; Origin : TSeekOrigin) : Int64; begin case Origin of soBeginning : vmsPosition := Offset; soCurrent : inc(vmsPosition, Offset); soEnd : vmsPosition := vmsSize + Offset; else raise EAbVMSInvalidOrigin.Create( Integer(Origin)); end; Result := vmsPosition; end; {--------} procedure TAbVirtualMemoryStream.SetSize(const NewSize : Int64); var Page : PvmsPage; Inx : integer; NewFileSize : Int64; begin if (NewSize < vmsSize) then begin {go through the page list discarding pages whose offset is greater than our new size; don't bother saving any data from them since it be beyond the end of the stream anyway} {never delete the last page here} for Inx := pred(vmsPageList.Count) downto 1 do begin Page := PvmsPage(vmsPageList[Inx]); if (Page^.vpStmOfs >= NewSize) then begin Dispose(Page); vmsPageList.Delete(Inx); end else begin Break; end; end; { Reset cache to the first page in case the cached page was deleted. } vmsCachePage := vmsPageList[0]; {force the swap file file size in range, it'll be a multiple of AB_VMSPageSize} NewFileSize := pred(NewSize + AB_VMSPageSize) and (not pred(AB_VMSPageSize)); if (NewFileSize < vmsSwapFileSize) then vmsSwapFileSize := NewFileSize; {ignore the swap file itself} end; vmsSize := NewSize; if (vmsPosition > NewSize) then vmsPosition := NewSize; end; {--------} function TAbVirtualMemoryStream.vmsAlterPageList(aNewMem : Longword) : Longword; var NumPages : Longint; Page : PvmsPage; i : integer; OldestPageNum : Longint; begin {calculate the max number of pages required} if aNewMem = 0 then NumPages := 1 // always have at least one page else NumPages := pred(aNewMem + AB_VMSPageSize) div AB_VMSPageSize; if (NumPages > AB_VMSMaxPages) then NumPages := AB_VMSMaxPages; {if the maximum number of pages means we have to shrink the current list, do so, tossing out the oldest pages first} if (NumPages < vmsPageList.Count) then begin for i := 1 to (vmsPageList.Count - NumPages) do begin {find the oldest page} vmsFindOldestPage(OldestPageNum, Page); {if it is dirty, write it out to the swap file} if Page^.vpDirty then begin vmsSwapFileWrite(Page); end; {remove it from the page list} vmsPageList.Delete(OldestPageNum); {free the page memory} Dispose(Page); end; { Reset cache to the first page in case the cached page was deleted. } vmsCachePage := vmsPageList[0]; end; {remember our new max number of pages} vmsMaxPages := NumPages; Result := NumPages * AB_VMSPageSize; end; {--------} procedure TAbVirtualMemoryStream.vmsFindOldestPage(out OldestInx : Longint; out OldestPage: PvmsPage); var OldestLRU : Longint; Inx : integer; Page : PvmsPage; begin OldestInx := -1; OldestLRU := LastLRUValue; for Inx := 0 to pred(vmsPageList.Count) do begin Page := PvmsPage(vmsPageList[Inx]); if (Page^.vpLRU < OldestLRU) then begin OldestInx := Inx; OldestLRU := Page^.vpLRU; OldestPage := Page; end; end; end; {--------} function TAbVirtualMemoryStream.vmsGetNextLRU : Longint; var Inx : integer; begin if (vmsLRU = LastLRUValue) then begin {reset all LRUs in list} for Inx := 0 to pred(vmsPageList.Count) do PvmsPage(vmsPageList[Inx])^.vpLRU := 0; vmsLRU := 0; end; inc(vmsLRU); Result := vmsLRU; end; {--------} function TAbVirtualMemoryStream.vmsGetPageForOffset(aOffset : Int64) : PvmsPage; var Page : PvmsPage; PageOfs : Int64; L, M, R : integer; OldestPageNum : integer; CreatedNewPage: boolean; begin {using a sequential or a binary search (depending on the number of pages), try to find the page in the cache; we'll do a sequential search if the number of pages is very small, eg less than 4} if (vmsPageList.Count < 4) then begin L := vmsPageList.Count; for M := 0 to pred(vmsPageList.Count) do begin Page := PvmsPage(vmsPageList[M]); PageOfs := Page^.vpStmOfs; if (aOffset < PageOfs) then begin L := M; Break; end; if (aOffset = PageOfs) then begin Page^.vpLRU := vmsGetNextLRU; vmsCachePage := Page; Result := Page; Exit; end; end; end else {we need to do a binary search} begin L := 0; R := pred(vmsPageList.Count); repeat M := (L + R) div 2; Page := PvmsPage(vmsPageList[M]); PageOfs := Page^.vpStmOfs; if (aOffset < PageOfs) then R := pred(M) else if (aOffset > PageOfs) then L := succ(M) else {aOffset = PageOfs} begin Page^.vpLRU := vmsGetNextLRU; vmsCachePage := Page; Result := Page; Exit; end; until (L > R); end; {if we get here the page for the offset is not present in the page list, and once created/loaded, the page should be inserted at L} {enter a try..except block so that if a new page is created and an exception occurs, the page is freed} CreatedNewPage := false; Result := nil; try {if there is room to insert a new page, create one ready} if (vmsPageList.Count < vmsMaxPages) then begin New(Page); CreatedNewPage := true; end {otherwise there is no room for the insertion, so find the oldest page in the list and discard it} else {vmsMaxPages <= vmsPageList.Count} begin {find the oldest page} vmsFindOldestPage(OldestPageNum, Page); {if it is dirty, write it out to the swap file} if Page^.vpDirty then begin vmsSwapFileWrite(Page); end; {remove it from the page list} vmsPageList.Delete(OldestPageNum); {patch up the insertion point, in case the page just deleted was before it} if (OldestPageNum < L) then dec(L); end; {set all the page fields} with Page^ do begin vpStmOfs := aOffset; vpLRU := vmsGetNextLRU; vpDirty := False; vmsSwapFileRead(Page); end; {insert the page into the correct spot} vmsPageList.Insert(L, pointer(Page)); {return the page, remembering to save it in the cache} vmsCachePage := Page; Result := Page; except if CreatedNewPage then Dispose(Page); end;{try..except} end; {--------} procedure TAbVirtualMemoryStream.vmsSetMaxMemToUse(aNewMem : Longword); begin vmsMaxMemToUse := vmsAlterPageList(aNewMem); end; {--------} procedure TAbVirtualMemoryStream.vmsSwapFileCreate; begin if (vmsSwapHandle = 0) then begin vmsSwapFileName := AbCreateTempFile(vmsSwapFileDir); vmsSwapHandle := mbFileOpen(vmsSwapFileName, fmOpenReadWrite); if (vmsSwapHandle <= 0) then begin vmsSwapHandle := 0; mbDeleteFile(vmsSwapFileName); raise EAbVMSErrorOpenSwap.Create( vmsSwapFileName ); end; vmsSwapFileSize := 0; end; end; {--------} procedure TAbVirtualMemoryStream.vmsSwapFileDestroy; begin if (vmsSwapHandle <> 0) then begin FileClose(vmsSwapHandle); mbDeleteFile(vmsSwapFileName); vmsSwapHandle := 0; end; end; {--------} procedure TAbVirtualMemoryStream.vmsSwapFileRead(aPage : PvmsPage); var BytesRead : Longint; SeekResult: Int64; begin if (vmsSwapHandle = 0) or (aPage^.vpStmOfs >= vmsSwapFileSize) then begin {there is nothing to be read from the disk (either the swap file doesn't exist or it's too small) so zero out the page data} FillChar(aPage^.vpData, AB_VMSPageSize, 0) end else {there is something to be read from the swap file} begin SeekResult := FileSeek(vmsSwapHandle, aPage^.vpStmOfs, 0); if (SeekResult = -1) then raise EAbVMSSeekFail.Create( vmsSwapFileName ); BytesRead := FileRead(vmsSwapHandle, aPage^.vpData, AB_VMSPageSize); if (BytesRead <> AB_VMSPageSize) then raise EAbVMSReadFail.Create( AB_VMSPageSize, vmsSwapFileName ); end; end; {--------} procedure TAbVirtualMemoryStream.vmsSwapFileWrite(aPage : PvmsPage); var NewPos : Int64; SeekResult: Int64; BytesWritten : Longint; begin if (vmsSwapHandle = 0) then vmsSwapFileCreate; SeekResult := FileSeek(vmsSwapHandle, aPage^.vpStmOfs, 0); if (SeekResult = -1) then raise EAbVMSSeekFail.Create( vmsSwapFileName ); BytesWritten := FileWrite(vmsSwapHandle, aPage^.vpData, AB_VMSPageSize); if BytesWritten <> AB_VMSPageSize then raise EAbVMSWriteFail.Create( AB_VMSPageSize, vmsSwapFileName ); NewPos := aPage^.vpStmOfs + AB_VMSPageSize; if (NewPos > vmsSwapFileSize) then vmsSwapFileSize := NewPos; end; {--------} function TAbVirtualMemoryStream.Write(const Buffer; Count : Longint) : Longint; var BufPtr : PByte; Page : PvmsPage; PageDataInx : integer; Posn : Int64; BytesToGo : Int64; BytesToWrite: Int64; StartOfs : Int64; begin {writing is complicated by the fact we can only write in chunks of AB_VMSPageSize: we need to partition out the overall write into a write to a partial page, zero or more writes to complete pages and then a possible write to a partial page} {initialise some variables, note that the complex calc in the expression for PageDataInx is the offset of the start of the page where Posn is found.} BufPtr := @Buffer; Posn := vmsPosition; PageDataInx := Posn - (Posn and (not pred(AB_VMSPageSize))); BytesToWrite := AB_VMSPageSize - PageDataInx; {calculate the actual number of bytes to write} BytesToGo := Count; Result := BytesToGo; {while we have bytes to write, write them} while (BytesToGo <> 0) do begin if (BytesToWrite > BytesToGo) then BytesToWrite := BytesToGo; StartOfs := Posn and (not pred(AB_VMSPageSize)); if (vmsCachePage^.vpStmOfs = StartOfs) then Page := vmsCachePage else Page := vmsGetPageForOffset(StartOfs); Move(BufPtr^, Page^.vpData[PageDataInx], BytesToWrite); Page^.vpDirty := True; dec(BytesToGo, BytesToWrite); inc(Posn, BytesToWrite); inc(BufPtr, BytesToWrite); PageDataInx := 0; BytesToWrite := AB_VMSPageSize; end; {remember our new position} vmsPosition := Posn; {if we've grown the stream, make a note of it} if (vmsPosition > vmsSize) then vmsSize := vmsPosition; end; {====================================================================} end. ��������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abgztyp.pas�����������������������������������������������0000644�0001750�0001750�00000107720�12014201074�021724� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Craig Peterson <capeterson@users.sourceforge.net> * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbGzTyp.pas *} {*********************************************************} {* ABBREVIA: TAbGzipArchive, TAbGzipItem classes *} {*********************************************************} {* Misc. constants, types, and routines for working *} {* with GZip files *} {* See: RFC 1952 *} {* "GZIP file format specification version 4.3" *} {* for more information on GZip *} {* See "algorithm.doc" in Gzip source and "format.txt" *} {* on gzip.org for differences from RFC *} {*********************************************************} unit AbGzTyp; {$I AbDefine.inc} interface uses Classes, AbUtils, AbArcTyp, AbTarTyp; type { pre-defined "operating system" (really more FILE system) types for the Gzip header } TAbGzFileSystem = (osFat, osAmiga, osVMS, osUnix, osVM_CMS, osAtariTOS, osHPFS, osMacintosh, osZSystem, osCP_M, osTOPS20, osNTFS, osQDOS, osAcornRISCOS, osVFAT, osMVS, osBeOS, osTandem, osTHEOS, osUnknown, osUndefined); type PAbGzHeader = ^TAbGzHeader; TAbGzHeader = packed record { SizeOf(TGzHeader) = 10} ID1 : Byte; { ID Byte, should always be $1F} ID2 : Byte; { ID Byte, should always be $8B} CompMethod : Byte; { compression method used} { 0..7 reserved, 8 = deflate, others undefined as of this writing (4/27/2001)} Flags : Byte; { misc flags} { Bit 0: FTEXT compressed file contains text, can be used for} { cross platform line termination translation} { Bit 1: FCONTINUATION file is a continuation of a multi-part gzip file} { RFC 1952 says this is the header CRC16 flag, but gzip} { reserves it and won't extract the file if this is set} { header data includes part number after header record} { Bit 2: FEXTRA header data contains Extra Data, starts after part} { number (if any)} { Bit 3: FNAME header data contains FileName, null terminated} { string starting immediately after Extra Data (if any)} { RFC 1952 says this is ISO 8859-1 encoded, but gzip} { always uses the system encoding} { Bit 4: FCOMMENT header data contains Comment, null terminated string} { starting immediately after FileName (if any)} { Bit 5: FENCRYPTED file is encrypted using zip-1.9 encryption } { header data contains a 12-byte encryption header } { starting immediately after Comment. Documented in} { "algorithm.doc", but unsupported in gzip} { Bits 6..7 are undefined and reserved as of this writing (8/25/2009)} ModTime : LongInt; { File Modification (Creation) time,} { UNIX cdate format} XtraFlags : Byte; { additional flags} { XtraFlags = 2 -- Deflate compressor used maximum compression algorithm} { XtraFlags = 4 -- Deflate compressor used fastest algorithm} OS : Byte; { Operating system that created file,} { see GZOsToStr routine for values} end; TAbGzTailRec = packed record CRC32 : LongInt; { crc for uncompressed data } ISize : LongWord; { size of uncompressed data } end; TAbGzExtraFieldSubID = array[0..1] of AnsiChar; type TAbGzipExtraField = class(TAbExtraField) private FGZHeader : PAbGzHeader; function GetID(aIndex : Integer): TAbGzExtraFieldSubID; protected procedure Changed; override; public constructor Create(aGZHeader : PAbGzHeader); procedure Delete(aID : TAbGzExtraFieldSubID); function Get(aID : TAbGzExtraFieldSubID; out aData : Pointer; out aDataSize : Word) : Boolean; procedure Put(aID : TAbGzExtraFieldSubID; const aData; aDataSize : Word); public property IDs[aIndex : Integer]: TAbGzExtraFieldSubID read GetID; end; TAbGzipItem = class(TAbArchiveItem) protected {private} FGZHeader : TAbGzHeader; FExtraField : TAbGzipExtraField; FFileComment : AnsiString; FRawFileName : AnsiString; protected function GetFileSystem: TAbGzFileSystem; function GetHasExtraField: Boolean; function GetHasFileComment: Boolean; function GetHasFileName: Boolean; function GetIsText: Boolean; procedure SetFileComment(const Value : AnsiString); procedure SetFileSystem(const Value: TAbGzFileSystem); procedure SetIsText(const Value: Boolean); function GetExternalFileAttributes : LongWord; override; function GetIsEncrypted : Boolean; override; function GetLastModFileDate : Word; override; function GetLastModFileTime : Word; override; function GetLastModTimeAsDateTime: TDateTime; override; function GetNativeLastModFileTime: Longint; override; procedure SetExternalFileAttributes( Value : LongWord ); override; procedure SetFileName(const Value : string); override; procedure SetIsEncrypted(Value : Boolean); override; procedure SetLastModFileDate(const Value : Word); override; procedure SetLastModFileTime(const Value : Word); override; procedure SetLastModTimeAsDateTime(const Value: TDateTime); override; procedure SaveGzHeaderToStream(AStream : TStream); procedure LoadGzHeaderFromStream(AStream : TStream); public property CompressionMethod : Byte read FGZHeader.CompMethod; property ExtraFlags : Byte {Default: 2} read FGZHeader.XtraFlags write FGZHeader.XtraFlags; property Flags : Byte read FGZHeader.Flags; property FileComment : AnsiString read FFileComment write SetFileComment; property FileSystem : TAbGzFileSystem {Default: osFat (Windows); osUnix (Linux)} read GetFileSystem write SetFileSystem; property ExtraField : TAbGzipExtraField read FExtraField; property IsEncrypted : Boolean read GetIsEncrypted; property HasExtraField : Boolean read GetHasExtraField; property HasFileName : Boolean read GetHasFileName; property HasFileComment : Boolean read GetHasFileComment; property IsText : Boolean read GetIsText write SetIsText; property GZHeader : TAbGzHeader read FGZHeader; constructor Create; destructor Destroy; override; end; TAbGzipStreamHelper = class(TAbArchiveStreamHelper) private function GetGzCRC: LongInt; function GetFileSize: LongInt; protected {private} FItem : TAbGzipItem; FTail : TAbGzTailRec; public constructor Create(AStream : TStream); destructor Destroy; override; procedure ExtractItemData(AStream : TStream); override; function FindFirstItem : Boolean; override; function FindNextItem : Boolean; override; function SeekItem(Index : Integer): Boolean; override; procedure SeekToItemData; procedure WriteArchiveHeader; override; procedure WriteArchiveItem(AStream : TStream); override; procedure WriteArchiveTail; override; function GetItemCount : Integer; override; procedure ReadHeader; override; procedure ReadTail; override; property CRC : LongInt read GetGzCRC; property FileSize : LongInt read GetFileSize; property TailCRC : LongInt read FTail.CRC32; property TailSize : LongWord read FTail.ISize; end; TAbGzipArchiveState = (gsGzip, gsTar); TAbGzipArchive = class(TAbTarArchive) private FGZStream : TStream; { stream for GZip file} FGZItem : TAbArchiveList; { item in Gzip (only one, but need polymorphism of class)} FTarStream : TStream; { stream for possible contained Tar } FTarList : TAbArchiveList; { items in possible contained Tar } FTarAutoHandle: Boolean; FState : TAbGzipArchiveState; FIsGzippedTar : Boolean; procedure SetTarAutoHandle(const Value: Boolean); function GetIsGzippedTar: Boolean; procedure SwapToGzip; procedure SwapToTar; protected function CreateItem(const SourceFileName : string; const ArchiveDirectory : string): TAbArchiveItem; override; procedure ExtractItemAt(Index : Integer; const UseName : string); override; procedure ExtractItemToStreamAt(Index : Integer; aStream : TStream); override; procedure LoadArchive; override; procedure SaveArchive; override; procedure TestItemAt(Index : Integer); override; function FixName(const Value : string) : string; override; function GetSupportsEmptyFolders : Boolean; override; function GetItem(Index: Integer): TAbGzipItem; procedure PutItem(Index: Integer; const Value: TAbGzipItem); public {methods} constructor CreateFromStream(aStream : TStream; const aArchiveName : string); override; destructor Destroy; override; procedure DoSpanningMediaRequest(Sender : TObject; ImageNumber : Integer; var ImageName : string; var Abort : Boolean); override; property TarAutoHandle : Boolean read FTarAutoHandle write SetTarAutoHandle; property IsGzippedTar : Boolean read GetIsGzippedTar write FIsGzippedTar; property Items[Index : Integer] : TAbGzipItem read GetItem write PutItem; default; end; function VerifyGZip(Strm : TStream) : TAbArchiveType; function GZOsToStr(OS: Byte) : string; implementation uses {$IFDEF MSWINDOWS} Windows, {$ENDIF} SysUtils, AbBitBkt, AbDfBase, AbDfDec, AbDfEnc, AbExcept, AbResString, AbVMStrm, DCOSUtils, DCClassesUtf8, DCConvertEncoding; const { Header Signature Values} AB_GZ_HDR_ID1 = $1F; AB_GZ_HDR_ID2 = $8B; { Test bits for TGzHeader.Flags field } AB_GZ_FLAG_FTEXT = $01; AB_GZ_FLAG_FCONTINUATION = $02; AB_GZ_FLAG_FEXTRA = $04; AB_GZ_FLAG_FNAME = $08; AB_GZ_FLAG_FCOMMENT = $10; AB_GZ_FLAG_FENCRYPTED = $20; AB_GZ_UNSUPPORTED_FLAGS = $E2; { GZip OS source flags } AB_GZ_OS_ID_FAT = 0; AB_GZ_OS_ID_Amiga = 1; AB_GZ_OS_ID_VMS = 2; AB_GZ_OS_ID_Unix = 3; AB_GZ_OS_ID_VM_CMS = 4; AB_GZ_OS_ID_AtariTOS = 5; AB_GZ_OS_ID_HPFS = 6; AB_GZ_OS_ID_Macintosh = 7; AB_GZ_OS_ID_Z_System = 8; AB_GZ_OS_ID_CP_M = 9; AB_GZ_OS_ID_TOPS20 = 10; AB_GZ_OS_ID_NTFS = 11; AB_GZ_OS_ID_QDOS = 12; AB_GZ_OS_ID_AcornRISCOS = 13; AB_GZ_OS_ID_VFAT = 14; AB_GZ_OS_ID_MVS = 15; AB_GZ_OS_ID_BEOS = 16; AB_GZ_OS_ID_TANDEM = 17; AB_GZ_OS_ID_THEOS = 18; AB_GZ_OS_ID_unknown = 255; function GZOsToStr(OS: Byte) : string; { Return a descriptive string for TGzHeader.OS field } begin case OS of AB_GZ_OS_ID_FAT : Result := AbGzOsFat; AB_GZ_OS_ID_Amiga : Result := AbGzOsAmiga; AB_GZ_OS_ID_VMS : Result := AbGzOsVMS; AB_GZ_OS_ID_Unix : Result := AbGzOsUnix; AB_GZ_OS_ID_VM_CMS : Result := AbGzOsVM_CMS; AB_GZ_OS_ID_AtariTOS : Result := AbGzOsAtari; AB_GZ_OS_ID_HPFS : Result := AbGzOsHPFS; AB_GZ_OS_ID_Macintosh : Result := AbGzOsMacintosh; AB_GZ_OS_ID_Z_System : Result := AbGzOsZ_System; AB_GZ_OS_ID_CP_M : Result := AbGzOsCP_M; AB_GZ_OS_ID_TOPS20 : Result := AbGzOsTOPS_20; AB_GZ_OS_ID_NTFS : Result := AbGzOsNTFS; AB_GZ_OS_ID_QDOS : Result := AbGzOsQDOS; AB_GZ_OS_ID_AcornRISCOS : Result := AbGzOsAcornRISCOS; AB_GZ_OS_ID_VFAT : Result := AbGzOsVFAT; AB_GZ_OS_ID_MVS : Result := AbGzOsMVS; AB_GZ_OS_ID_BEOS : Result := AbGzOsBeOS; AB_GZ_OS_ID_TANDEM : Result := AbGzOsTandem; AB_GZ_OS_ID_THEOS : Result := AbGzOsTHEOS; AB_GZ_OS_ID_unknown : Result := AbGzOsunknown; else Result := AbGzOsUndefined; end; end; function VerifyHeader(const Header : TAbGzHeader) : Boolean; begin { check id fields and if deflated (only handle deflate anyway)} Result := (Header.ID1 = AB_GZ_HDR_ID1) and (Header.ID2 = AB_GZ_HDR_ID2) and (Header.CompMethod = 8 {deflate}); end; function VerifyGZip(Strm : TStream) : TAbArchiveType; var GHlp : TAbGzipStreamHelper; Hlpr : TAbDeflateHelper; PartialTarData : TMemoryStream; CurPos : Int64; begin Result := atUnknown; CurPos := Strm.Position; try Strm.Seek(0, soFromBeginning); {prepare for the try..finally} Hlpr := nil; PartialTarData := nil; GHlp := TAbGzipStreamHelper.Create(Strm); try {create the stream helper and read the item header} GHlp.ReadHeader; { check id fields and if deflated (only handle deflate anyway)} if VerifyHeader(GHlp.FItem.FGZHeader) then begin Result := atGZip; { provisional } { check if is actually a Gzipped Tar } { partial extract contents, verify vs. Tar } PartialTarData := TMemoryStream.Create; GHlp.SeekToItemData; Hlpr := TAbDeflateHelper.Create; Hlpr.PartialSize := 512; PartialTarData.SetSize(512 * 2); Inflate(Strm, PartialTarData, Hlpr); {set to beginning of extracted data} PartialTarData.Position := 0; if (VerifyTar(PartialTarData) = atTar) then Result := atGZippedTar; end; finally GHlp.Free; Hlpr.Free; PartialTarData.Free; end; except on EReadError do Result := atUnknown; end; Strm.Position := CurPos; end; { TAbGzipExtraField } constructor TAbGzipExtraField.Create(aGZHeader : PAbGzHeader); begin inherited Create; FGZHeader := aGZHeader; end; procedure TAbGzipExtraField.Changed; begin if Buffer = nil then FGzHeader.Flags := FGzHeader.Flags and not AB_GZ_FLAG_FEXTRA else FGzHeader.Flags := FGzHeader.Flags or AB_GZ_FLAG_FEXTRA; end; procedure TAbGzipExtraField.Delete(aID : TAbGzExtraFieldSubID); begin inherited Delete(Word(aID)); end; function TAbGzipExtraField.GetID(aIndex : Integer): TAbGzExtraFieldSubID; begin Result := TAbGzExtraFieldSubID(inherited IDs[aIndex]); end; function TAbGzipExtraField.Get(aID : TAbGzExtraFieldSubID; out aData : Pointer; out aDataSize : Word) : Boolean; begin Result := inherited Get(Word(aID), aData, aDataSize); end; procedure TAbGzipExtraField.Put(aID : TAbGzExtraFieldSubID; const aData; aDataSize : Word); begin inherited Put(Word(aID), aData, aDataSize); end; { TAbGzipStreamHelper } constructor TAbGzipStreamHelper.Create(AStream : TStream); begin inherited Create(AStream); FItem := TAbGzipItem.Create; end; destructor TAbGzipStreamHelper.Destroy; begin FItem.Free; inherited; end; function ReadCStringInStream(AStream: TStream): AnsiString; { locate next instance of a null character in a stream leaves stream positioned just past that, or at end of stream if not found or null is last byte in stream. Result is the entire read string. } const BuffSiz = 1024; var Buff : array [0..BuffSiz-1] of AnsiChar; Len, DataRead : LongInt; begin { basically what this is supposed to do is...} { repeat AStream.Read(C, 1); Result := Result + C; until (AStream.Position = AStream.Size) or (C = #0); } Result := ''; repeat DataRead := AStream.Read(Buff, BuffSiz - 1); Buff[DataRead] := #0; Len := StrLen(Buff); if Len > 0 then begin SetLength(Result, Length(Result) + Len); Move(Buff, Result[Length(Result) - Len + 1], Len); end; if Len < DataRead then begin AStream.Seek(Len - DataRead + 1, soFromCurrent); Break; end; until DataRead = 0; end; procedure TAbGzipStreamHelper.SeekToItemData; {find end of header data, including FileName etc.} begin {** Seek to Compressed Data **} FStream.Seek(0, soFromBeginning); FItem.LoadGzHeaderFromStream(FStream); end; procedure TAbGzipStreamHelper.ExtractItemData(AStream: TStream); var Helper : TAbDeflateHelper; begin Helper := TAbDeflateHelper.Create; try SeekToItemData; if (AStream is TAbBitBucketStream) then Helper.Options := Helper.Options or dfc_TestOnly; FItem.CRC32 := Inflate(FStream, AStream, Helper); FItem.UncompressedSize := AStream.Size{Helper.NormalSize}; finally Helper.Free; end; end; function TAbGzipStreamHelper.FindFirstItem: Boolean; var GZH : TAbGzHeader; DataRead : Integer; begin Result := False; FStream.Seek(0, soFromBeginning); DataRead := FStream.Read(GZH, SizeOf(TAbGzHeader)); if (DataRead = SizeOf(TAbGzHeader)) and VerifyHeader(GZH) then begin FItem.FGZHeader := GZH; Result := True; end; FStream.Seek(0, soFromBeginning); end; function TAbGzipStreamHelper.FindNextItem: Boolean; begin { only one item in a GZip } Result := False; end; function TAbGzipStreamHelper.SeekItem(Index: Integer): Boolean; begin if Index > 0 then Result := False else Result := FindFirstItem; end; procedure TAbGzipStreamHelper.WriteArchiveHeader; begin FItem.SaveGzHeaderToStream(FStream); end; procedure TAbGzipStreamHelper.WriteArchiveItem(AStream: TStream); var Helper : TAbDeflateHelper; begin Helper := TAbDeflateHelper.Create; try FItem.CRC32 := Deflate(AStream, FStream, Helper); FItem.UncompressedSize := AStream.Size; finally Helper.Free; end; end; procedure TAbGzipStreamHelper.WriteArchiveTail; var Tail : TAbGzTailRec; begin Tail.CRC32 := FItem.CRC32; Tail.ISize := FItem.UncompressedSize; FStream.Write(Tail, SizeOf(TAbGzTailRec)); end; function TAbGzipStreamHelper.GetItemCount: Integer; begin { only one item in a gzip } Result := 1; end; procedure TAbGzipStreamHelper.ReadHeader; begin FItem.LoadGzHeaderFromStream(FStream); end; procedure TAbGzipStreamHelper.ReadTail; begin FStream.Read(FTail, SizeOf(TAbGzTailRec)); end; function TAbGzipStreamHelper.GetGzCRC: LongInt; begin Result := FItem.CRC32; end; function TAbGzipStreamHelper.GetFileSize: LongInt; begin Result := FItem.UncompressedSize; end; { TAbGzipItem } constructor TAbGzipItem.Create; begin inherited Create; { default ID fields } FGzHeader.ID1 := AB_GZ_HDR_ID1; FGzHeader.ID2 := AB_GZ_HDR_ID2; { compression method } FGzHeader.CompMethod := 8; { deflate } { Maxium Compression } FGzHeader.XtraFlags := 2; FFileName := ''; FFileComment := ''; FExtraField := TAbGzipExtraField.Create(@FGzHeader); { source OS ID } {$IFDEF LINUX } {assume EXT2 system } FGzHeader.OS := AB_GZ_OS_ID_Unix; {$ENDIF LINUX } {$IFDEF MSWINDOWS } {assume FAT system } FGzHeader.OS := AB_GZ_OS_ID_FAT; {$ENDIF MSWINDOWS } end; destructor TAbGzipItem.Destroy; begin FExtraField.Free; inherited; end; function TAbGzipItem.GetExternalFileAttributes: LongWord; begin { GZip has no provision for storing attributes } Result := 0; end; function TAbGzipItem.GetFileSystem: TAbGzFileSystem; begin case FGzHeader.OS of 0..18: Result := TAbGzFileSystem(FGzHeader.OS); 255: Result := osUnknown; else Result := osUndefined; end; { case } end; function TAbGzipItem.GetIsEncrypted: Boolean; begin Result := (FGZHeader.Flags and AB_GZ_FLAG_FENCRYPTED) = AB_GZ_FLAG_FENCRYPTED; end; function TAbGzipItem.GetHasExtraField: Boolean; begin Result := (FGZHeader.Flags and AB_GZ_FLAG_FEXTRA) = AB_GZ_FLAG_FEXTRA; end; function TAbGzipItem.GetHasFileComment: Boolean; begin Result := (FGZHeader.Flags and AB_GZ_FLAG_FCOMMENT) = AB_GZ_FLAG_FCOMMENT; end; function TAbGzipItem.GetHasFileName: Boolean; begin Result := (FGZHeader.Flags and AB_GZ_FLAG_FNAME) = AB_GZ_FLAG_FNAME; end; function TAbGzipItem.GetIsText: Boolean; begin Result := (FGZHeader.Flags and AB_GZ_FLAG_FTEXT) = AB_GZ_FLAG_FTEXT; end; function TAbGzipItem.GetLastModFileDate: Word; begin { convert to local DOS file Date } Result := LongRec(AbDateTimeToDosFileDate(LastModTimeAsDateTime)).Hi; end; function TAbGzipItem.GetLastModFileTime: Word; begin { convert to local DOS file Time } Result := LongRec(AbDateTimeToDosFileDate(LastModTimeAsDateTime)).Lo; end; function TAbGzipItem.GetLastModTimeAsDateTime: TDateTime; begin Result := AbUnixTimeToLocalDateTime(FGZHeader.ModTime); end; function TAbGzipItem.GetNativeLastModFileTime: Longint; {$IFDEF MSWINDOWS} var DateTime: TDateTime; {$ENDIF} begin Result := FGZHeader.ModTime; {$IFDEF MSWINDOWS} DateTime := AbUnixTimeToLocalDateTime(Result); Result := AbDateTimeToDosFileDate(DateTime); {$ENDIF} end; procedure TAbGzipItem.LoadGzHeaderFromStream(AStream: TStream); var LenW : Word; begin AStream.Read(FGzHeader, SizeOf(TAbGzHeader)); if not VerifyHeader(FGzHeader) then Exit; { Skip part number, if any } if (FGzHeader.Flags and AB_GZ_FLAG_FCONTINUATION) = AB_GZ_FLAG_FCONTINUATION then AStream.Seek(SizeOf(Word), soCurrent); if HasExtraField then begin { get length of extra data } AStream.Read(LenW, SizeOf(Word)); FExtraField.LoadFromStream(AStream, LenW); end else FExtraField.Clear; { Get Filename, if any } if HasFileName then begin FRawFileName := ReadCStringInStream(AStream); FFileName := CeRawToUtf8(FRawFileName) end else FFileName := 'unknown'; { any comment present? } if HasFileComment then FFileComment := ReadCStringInStream(AStream) else FFileComment := ''; {Assert: stream should now be located at start of compressed data } {If file was compressed with 3.3 spec this will be invalid so use with care} CompressedSize := AStream.Size - AStream.Position - SizeOf(TAbGzTailRec); FDiskFileName := FileName; AbUnfixName(FDiskFileName); Action := aaNone; Tagged := False; end; procedure TAbGzipItem.SaveGzHeaderToStream(AStream: TStream); var LenW : Word; begin { default ID fields } FGzHeader.ID1 := AB_GZ_HDR_ID1; FGzHeader.ID2 := AB_GZ_HDR_ID2; { compression method } FGzHeader.CompMethod := 8; { deflate } { reset unsupported flags } FGzHeader.Flags := FGzHeader.Flags and not AB_GZ_UNSUPPORTED_FLAGS; { main header data } AStream.Write(FGzHeader, SizeOf(TAbGzHeader)); { add extra field if any } if HasExtraField then begin LenW := Length(FExtraField.Buffer); AStream.Write(LenW, SizeOf(LenW)); if LenW > 0 then AStream.Write(FExtraField.Buffer[0], LenW); end; { add filename if any (and include final #0 from string) } if HasFileName then AStream.Write(FRawFileName[1], Length(FRawFileName) + 1); { add file comment if any (and include final #0 from string) } if HasFileComment then AStream.Write(FFileComment[1], Length(FFileComment) + 1); end; procedure TAbGzipItem.SetExternalFileAttributes(Value: LongWord); begin { do nothing } end; procedure TAbGzipItem.SetFileComment(const Value: AnsiString); begin FFileComment := Value; if FFileComment <> '' then FGzHeader.Flags := FGzHeader.Flags or AB_GZ_FLAG_FCOMMENT else FGzHeader.Flags := FGzHeader.Flags and not AB_GZ_FLAG_FCOMMENT; end; procedure TAbGzipItem.SetFileName(const Value: string); begin FFileName := Value; FRawFileName := CeUtf8ToSys(Value); if Value <> '' then FGzHeader.Flags := FGzHeader.Flags or AB_GZ_FLAG_FNAME else FGzHeader.Flags := FGzHeader.Flags and not AB_GZ_FLAG_FNAME; end; procedure TAbGzipItem.SetFileSystem(const Value: TAbGzFileSystem); begin if Value = osUnknown then FGzHeader.OS := 255 else FGzHeader.OS := Ord(Value); end; procedure TAbGzipItem.SetIsEncrypted(Value: Boolean); begin { do nothing } end; procedure TAbGzipItem.SetIsText(const Value: Boolean); begin if Value then FGzHeader.Flags := FGzHeader.Flags or AB_GZ_FLAG_FTEXT else FGzHeader.Flags := FGzHeader.Flags and not AB_GZ_FLAG_FTEXT; end; procedure TAbGzipItem.SetLastModFileDate(const Value: Word); begin { replace date, keep existing time } LastModTimeAsDateTime := EncodeDate( Value shr 9 + 1980, Value shr 5 and 15, Value and 31) + Frac(LastModTimeAsDateTime); end; procedure TAbGzipItem.SetLastModFileTime(const Value: Word); begin { keep current date, replace time } LastModTimeAsDateTime := Trunc(LastModTimeAsDateTime) + EncodeTime( Value shr 11, Value shr 5 and 63, Value and 31 shl 1, 0); end; procedure TAbGzipItem.SetLastModTimeAsDateTime(const Value: TDateTime); begin FGZHeader.ModTime := AbLocalDateTimeToUnixTime(Value); end; { TAbGzipArchive } constructor TAbGzipArchive.CreateFromStream(aStream : TStream; const aArchiveName : string); begin inherited CreateFromStream(aStream, aArchiveName); FState := gsGzip; FGZStream := FStream; FGZItem := FItemList; FTarStream := TAbVirtualMemoryStream.Create; FTarList := TAbArchiveList.Create(True); end; procedure TAbGzipArchive.SwapToTar; begin FStream := FTarStream; FItemList := FTarList; FState := gsTar; end; procedure TAbGzipArchive.SwapToGzip; begin FStream := FGzStream; FItemList := FGzItem; FState := gsGzip; end; function TAbGzipArchive.CreateItem(const SourceFileName : string; const ArchiveDirectory : string): TAbArchiveItem; var GzItem : TAbGzipItem; FullSourceFileName, FullArchiveFileName: String; begin if IsGZippedTar and TarAutoHandle then begin SwapToTar; Result := inherited CreateItem(SourceFileName, ArchiveDirectory); end else begin SwapToGzip; GzItem := TAbGzipItem.Create; try MakeFullNames(SourceFileName, ArchiveDirectory, FullSourceFileName, FullArchiveFileName); GzItem.FileName := FullArchiveFileName; GzItem.DiskFileName := FullSourceFileName; Result := GzItem; except Result := nil; raise; end; end; end; destructor TAbGzipArchive.Destroy; begin SwapToGzip; FTarList.Free; FTarStream.Free; inherited Destroy; end; procedure TAbGzipArchive.ExtractItemAt(Index: Integer; const UseName: string); var OutStream : TStream; CurItem : TAbGzipItem; begin if IsGZippedTar and TarAutoHandle then begin SwapToTar; inherited ExtractItemAt(Index, UseName); end else begin SwapToGzip; if Index > 0 then Index := 0; { only one item in a GZip} CurItem := TAbGzipItem(ItemList[Index]); OutStream := TFileStreamEx.Create(UseName, fmCreate or fmShareDenyNone); try try {OutStream} ExtractItemToStreamAt(Index, OutStream); finally {OutStream} OutStream.Free; end; {OutStream} AbSetFileTime(UseName, CurItem.LastModTimeAsDateTime); AbSetFileAttr(UseName, CurItem.NativeFileAttributes); except on E : EAbUserAbort do begin FStatus := asInvalid; if mbFileExists(UseName) then mbDeleteFile(UseName); raise; end else begin if mbFileExists(UseName) then mbDeleteFile(UseName); raise; end; end; end; end; procedure TAbGzipArchive.ExtractItemToStreamAt(Index: Integer; aStream: TStream); var GzHelp : TAbGzipStreamHelper; begin if IsGzippedTar and TarAutoHandle then begin SwapToTar; inherited ExtractItemToStreamAt(Index, aStream); end else begin SwapToGzip; { note Index ignored as there's only one item in a GZip } GZHelp := TAbGzipStreamHelper.Create(FGzStream); try { read GZip Header } GzHelp.ReadHeader; { extract copy data from GZip} GzHelp.ExtractItemData(aStream); { Get validation data } GzHelp.ReadTail; {$IFDEF STRICTGZIP} { According to http://www.gzip.org/zlib/rfc1952.txt A compliant gzip compressor should calculate and set the CRC32 and ISIZE. However, a compliant decompressor should not check these values. If you want to check the the values of the CRC32 and ISIZE in a GZIP file when decompressing enable the STRICTGZIP define contained in AbDefine.inc } { validate against CRC } if GzHelp.FItem.Crc32 <> GzHelp.TailCRC then raise EAbGzipBadCRC.Create; { validate against file size } if GzHelp.FItem.UncompressedSize <> GZHelp.TailSize then raise EAbGzipBadFileSize.Create; {$ENDIF} finally GzHelp.Free; end; end; end; function TAbGzipArchive.FixName(const Value: string): string; { fix up fileaname for storage } begin if FState = gsTar then Result := inherited FixName( Value ) else begin {GZip files Always strip the file path} StoreOptions := StoreOptions + [soStripDrive, soStripPath]; Result := ''; if Value <> '' then Result := ExtractFileName(Value); end; end; function TAbGzipArchive.GetIsGzippedTar: Boolean; begin Result := FIsGzippedTar; end; function TAbGzipArchive.GetItem(Index: Integer): TAbGzipItem; begin Result := nil; if Index = 0 then Result := TAbGzipItem(FItemList.Items[Index]); end; function TAbGzipArchive.GetSupportsEmptyFolders : Boolean; begin Result := IsGzippedTar and TarAutoHandle; end; procedure TAbGzipArchive.LoadArchive; var GzHelp : TAbGzipStreamHelper; Item : TAbGzipItem; Abort : Boolean; begin SwapToGzip; if FGzStream.Size > 0 then begin GzHelp := TAbGzipStreamHelper.Create(FGzStream); try if GzHelp.FindFirstItem then begin Item := TAbGzipItem.Create; Item.LoadGzHeaderFromStream(FGzStream); FGzStream.Seek(-SizeOf(TAbGzTailRec), soFromEnd); GZHelp.ReadTail; Item.CRC32 := GZHelp.TailCRC; Item.UncompressedSize := GZHelp.TailSize; Item.Action := aaNone; FGZItem.Add(Item); if IsGzippedTar and TarAutoHandle then begin { extract Tar and set stream up } GzHelp.SeekToItemData; GzHelp.ExtractItemData(FTarStream); SwapToTar; inherited LoadArchive; end; end; DoArchiveProgress(100, Abort); FIsDirty := False; finally { Clean Up } GzHelp.Free; end; end; end; procedure TAbGzipArchive.PutItem(Index: Integer; const Value: TAbGzipItem); begin if Index = 0 then FItemList.Items[Index] := Value; end; procedure TAbGzipArchive.SaveArchive; var InGzHelp, OutGzHelp : TAbGzipStreamHelper; Abort : Boolean; i : Integer; NewStream : TAbVirtualMemoryStream; UncompressedStream : TStream; CurItem : TAbGzipItem; begin {prepare for the try..finally} OutGzHelp := nil; NewStream := nil; try InGzHelp := TAbGzipStreamHelper.Create(FGzStream); try {init new archive stream} NewStream := TAbVirtualMemoryStream.Create; OutGzHelp := TAbGzipStreamHelper.Create(NewStream); { create helper } NewStream.SwapFileDirectory := ExtractFilePath(AbGetTempFile(FTempDir, False)); { save the Tar data } if IsGzippedTar and TarAutoHandle then begin SwapToTar; inherited SaveArchive; if FTarStream.Size > 0 then begin if FGZItem.Count = 0 then begin CurItem := TAbGzipItem.Create; FGZItem.Add(CurItem); end; CurItem := FGZItem[0] as TAbGzipItem; CurItem.Action := aaNone; CurItem.LastModTimeAsDateTime := Now; CurItem.SaveGzHeaderToStream(NewStream); FTarStream.Position := 0; OutGzHelp.WriteArchiveItem(FTarStream); CurItem.CRC32 := OutGzHelp.CRC; CurItem.UncompressedSize := OutGzHelp.FileSize; OutGzHelp.WriteArchiveTail; end; end else begin SwapToGzip; {build new archive from existing archive} for i := 0 to pred(Count) do begin FCurrentItem := ItemList[i]; CurItem := TAbGzipItem(ItemList[i]); InGzHelp.SeekToItemData; case CurItem.Action of aaNone, aaMove : begin {just copy the file to new stream} CurItem.SaveGzHeaderToStream(NewStream); InGzHelp.SeekToItemData; NewStream.CopyFrom(FGZStream, FGZStream.Size - FGZStream.Position); end; aaDelete: {doing nothing omits file from new stream} ; aaAdd, aaFreshen, aaReplace, aaStreamAdd: begin try if (CurItem.Action = aaStreamAdd) then begin { adding from a stream } CurItem.SaveGzHeaderToStream(NewStream); CurItem.UncompressedSize := InStream.Size; OutGzHelp.WriteArchiveItem(InStream); OutGzHelp.WriteArchiveTail; end else begin CurItem.LastModTimeAsDateTime := AbGetFileTime(CurItem.DiskFileName); UncompressedStream := TFileStreamEx.Create(CurItem.DiskFileName, fmOpenRead or fmShareDenyWrite ); try CurItem.UncompressedSize := UncompressedStream.Size; CurItem.SaveGzHeaderToStream(NewStream); OutGzHelp.WriteArchiveItem(UncompressedStream); OutGzHelp.WriteArchiveTail; finally {UncompressedStream} UncompressedStream.Free; end; {UncompressedStream} end; except ItemList[i].Action := aaDelete; DoProcessItemFailure(ItemList[i], ptAdd, ecFileOpenError, 0); end; end; end; {case} end; { for } end; finally InGzHelp.Free; end; {copy new stream to FStream} SwapToGzip; NewStream.Position := 0; if (FStream is TMemoryStream) then TMemoryStream(FStream).LoadFromStream(NewStream) else begin { need new stream to write } FreeAndNil(FStream); FGZStream := nil; FStream := TFileStreamEx.Create(FArchiveName, fmCreate or fmShareDenyWrite); FGZStream := FStream; FStream.CopyFrom(NewStream, NewStream.Size); end; {update Items list} for i := pred( Count ) downto 0 do begin if ItemList[i].Action = aaDelete then FItemList.Delete( i ) else if ItemList[i].Action <> aaFailed then ItemList[i].Action := aaNone; end; if IsGzippedTar and TarAutoHandle then SwapToTar; DoArchiveSaveProgress( 100, Abort ); DoArchiveProgress( 100, Abort ); finally {NewStream} OutGzHelp.Free; NewStream.Free; end; end; procedure TAbGzipArchive.SetTarAutoHandle(const Value: Boolean); begin if Value then SwapToTar else SwapToGzip; FTarAutoHandle := Value; end; procedure TAbGzipArchive.TestItemAt(Index: Integer); var SavePos : LongInt; GZType : TAbArchiveType; BitBucket : TAbBitBucketStream; GZHelp : TAbGzipStreamHelper; begin if IsGzippedTar and TarAutoHandle then begin inherited TestItemAt(Index); end else begin { note Index ignored as there's only one item in a GZip } SavePos := FGzStream.Position; GZType := VerifyGZip(FGZStream); if not (GZType in [atGZip, atGZippedTar]) then raise EAbGzipInvalid.Create; BitBucket := nil; GZHelp := nil; try BitBucket := TAbBitBucketStream.Create(1024); GZHelp := TAbGzipStreamHelper.Create(FGZStream); GZHelp.ExtractItemData(BitBucket); GZHelp.ReadTail; { validate against CRC } if GzHelp.FItem.Crc32 <> GZHelp.TailCRC then raise EAbGzipBadCRC.Create; { validate against file size } if GzHelp.FItem.UncompressedSize <> GZHelp.TailSize then raise EAbGzipBadFileSize.Create; finally GZHelp.Free; BitBucket.Free; end; FGzStream.Position := SavePos; end; end; procedure TAbGzipArchive.DoSpanningMediaRequest(Sender: TObject; ImageNumber: Integer; var ImageName: string; var Abort: Boolean); begin Abort := False; end; end. ������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abbitbkt.pas����������������������������������������������0000644�0001750�0001750�00000015600�12014201074�022021� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbBitBkt.pas *} {*********************************************************} {* ABBREVIA: Bit bucket memory stream class *} {*********************************************************} unit AbBitBkt; {$I AbDefine.inc} interface uses Classes, AbUtils; type TAbBitBucketStream = class(TStream) private FBuffer : {$IFDEF UNICODE}PByte{$ELSE}PAnsiChar{$ENDIF}; FBufSize : longint; FBufPosn : longint; FPosn : Int64; FSize : Int64; FTail : Int64; protected public constructor Create(aBufSize : cardinal); destructor Destroy; override; function Read(var Buffer; Count : Longint) : Longint; override; function Write(const Buffer; Count : Longint) : Longint; override; function Seek(const Offset : Int64; Origin : TSeekOrigin) : Int64; override; procedure ForceSize(aSize : Int64); end; implementation uses Math, SysUtils, AbExcept; {Notes: The buffer is a circular queue without a head pointer; FTail is where data is next going to be written and it wraps indescriminately. The buffer can never be empty--it is always full (initially it is full of binary zeros. The class is designed to act as a bit bucket for the test feature of Abbrevia's zip code; it is not intended as a complete class with many possible applications. It is designed to be written to in a steady progression with some reading back in the recently written stream (the buffer size details how far back the Seek method will work). Seeking outside this buffer will result in exceptions being generated. For testing deflated files, the buffer size should be 32KB, for imploded files, either 8KB or 4KB. The Create constructor limits the buffer size to these values.} {===TAbBitBucketStream===============================================} constructor TAbBitBucketStream.Create(aBufSize : cardinal); begin inherited Create; if (aBufSize <> 4096) and (aBufSize <> 8192) and (aBufSize <> 32768) then FBufSize := 32768 else FBufSize := aBufSize; {add a 1KB leeway} inc(FBufSize, 1024); GetMem(FBuffer, FBufSize); end; {--------} destructor TAbBitBucketStream.Destroy; begin if (FBuffer <> nil) then FreeMem(FBuffer, FBufSize); inherited Destroy; end; {--------} procedure TAbBitBucketStream.ForceSize(aSize : Int64); begin FSize := aSize; end; {--------} function TAbBitBucketStream.Read(var Buffer; Count : Longint) : Longint; var Chunk2Size : Int64; Chunk1Size : Int64; OutBuffer : PByte; begin OutBuffer := @Buffer; {we cannot read more bytes than there is buffer} if (Count > FBufSize) then raise EAbBBSReadTooManyBytes.Create(Count); {calculate the size of the chunks} if (FBufPosn <= FTail) then begin Chunk1Size := FTail - FBufPosn; if (Chunk1Size > Count) then Chunk1Size := Count; Chunk2Size := 0; end else begin Chunk1Size := FBufSize - FBufPosn; if (Chunk1Size > Count) then begin Chunk1Size := Count; Chunk2Size := 0; end else begin Chunk2Size := FTail; if (Chunk2Size > (Count - Chunk1Size)) then Chunk2Size := Count - Chunk1Size; end end; {we cannot read more bytes than there are available} if (Count > (Chunk1Size + Chunk2Size)) then raise EAbBBSReadTooManyBytes.Create(Count); {perform the read} if (Chunk1Size > 0) then begin Move(FBuffer[FBufPosn], OutBuffer^, Chunk1Size); inc(FBufPosn, Chunk1Size); inc(FPosn, Chunk1Size); end; if (Chunk2Size > 0) then begin {we've wrapped} Move(FBuffer[0], (OutBuffer + Chunk1Size)^, Chunk2Size); FBufPosn := Chunk2Size; inc(FPosn, Chunk2Size); end; Result := Count; end; {--------} function TAbBitBucketStream.Write(const Buffer; Count : Longint) : Longint; var Chunk2Size : Int64; Chunk1Size : Int64; InBuffer : PByte; Overage : longint; begin Result := Count; InBuffer := @Buffer; {we cannot write more bytes than there is buffer} while Count > FBufSize do begin Overage := Min(FBufSize, Count - FBufSize); Write(InBuffer^, Overage); Inc(PtrInt(InBuffer), Overage); Dec(Count, Overage); end; {calculate the size of the chunks} Chunk1Size := FBufSize - FTail; if (Chunk1Size > Count) then begin Chunk1Size := Count; Chunk2Size := 0; end else begin Chunk2Size := Count - Chunk1Size; end; {write the first chunk} if (Chunk1Size > 0) then begin Move(InBuffer^, FBuffer[FTail], Chunk1Size); inc(FTail, Chunk1Size); end; {if the second chunk size is not zero, write the second chunk; note that we have wrapped} if (Chunk2Size > 0) then begin Move((InBuffer + Chunk1Size)^, FBuffer[0], Chunk2Size); FTail := Chunk2Size; end; {the stream size and position have changed} inc(FSize, Count); FPosn := FSize; FBufPosn := FTail; end; {--------} function TAbBitBucketStream.Seek(const Offset : Int64; Origin : TSeekOrigin): Int64; var Posn : Int64; BytesBack : longint; begin {calculate the new position} case Origin of soBeginning : Posn := Offset; soCurrent : Posn := FPosn + Offset; soEnd : if (Offset = 0) then begin {special case: position at end of stream} FBufPosn := FTail; FPosn := FSize; Result := FSize; Exit; end else begin Posn := FSize + Offset; end; else raise EAbBBSInvalidOrigin.Create; end; {calculate whether the new position is within the buffer; if not, raise exception} if (Posn > FSize) or (Posn <= (FSize - FBufSize)) then raise EAbBBSSeekOutsideBuffer.Create; {set the internal fields for the new position} FPosn := Posn; BytesBack := FSize - Posn; if (BytesBack <= FTail) then FBufPosn := FTail - BytesBack else FBufPosn := longint(FTail) + FBufSize - BytesBack; {return the new position} Result := Posn; end; {====================================================================} end. ��������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abunzprc.pas����������������������������������������������0000644�0001750�0001750�00000106446�12014201074�022074� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Craig Peterson <capeterson@users.sourceforge.net> * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbUnzPrc.pas *} {*********************************************************} {* ABBREVIA: UnZip procedures *} {*********************************************************} unit AbUnzPrc; {$I AbDefine.inc} interface uses Classes, AbArcTyp, AbZipTyp; type TAbUnzipHelper = class( TObject ) protected {private} {internal variables} FOutWriter : TStream; FOutStream : TStream; FUnCompressedSize : LongInt; FCompressionMethod : TAbZipCompressionMethod; FDictionarySize : TAbZipDictionarySize; FShannonFanoTreeCount : Byte; FOutBuf : PAbByteArray; {output buffer} FOutSent : LongInt; {number of bytes sent to output buffer} FOutPos : Cardinal; {current position in output buffer} FBitSValid : Byte; {Number of valid bits} FInBuf : TAbByteArray4K; FInPos : Integer; {current position in input buffer} FInCnt : Integer; {number of bytes in input buffer} FInEof : Boolean; {set when stream read returns 0} FCurByte : Byte; {current input byte} FBitsLeft : Byte; {bits left to process in FCurByte} FZStream : TStream; protected procedure uzFlushOutBuf; {-Flushes the output buffer} function uzReadBits(Bits : Byte) : Integer; {-Read the specified number of bits} procedure uzReadNextPrim; {-does less likely part of uzReadNext} {$IFDEF UnzipImplodeSupport} procedure uzUnImplode; {-Extract an imploded file} {$ENDIF} {$IFDEF UnzipReduceSupport} procedure uzUnReduce; {-Extract a reduced file} {$ENDIF} {$IFDEF UnzipShrinkSupport} procedure uzUnShrink; {-Extract a shrunk file} {$ENDIF} procedure uzWriteByte(B : Byte); {write to output} public constructor Create( InputStream, OutputStream : TStream ); destructor Destroy; override; procedure Execute; property UnCompressedSize : LongInt read FUncompressedSize write FUncompressedSize; property CompressionMethod : TAbZipCompressionMethod read FCompressionMethod write FCompressionMethod; property DictionarySize : TAbZipDictionarySize read FDictionarySize write FDictionarySize; property ShannonFanoTreeCount : Byte read FShannonFanoTreeCount write FShannonFanoTreeCount; end; procedure AbUnzipToStream( Sender : TObject; Item : TAbZipItem; OutStream : TStream); procedure AbUnzip(Sender : TObject; Item : TAbZipItem; const UseName : string); procedure AbTestZipItem(Sender : TObject; Item : TAbZipItem); procedure InflateStream(CompressedStream, UnCompressedStream : TStream); {-Inflates everything in CompressedStream to UncompressedStream no encryption is tried, no check on CRC is done, uses the whole compressedstream - no Progress events - no Frills!} implementation uses {$IFDEF MSWINDOWS} Windows, {$ENDIF} SysUtils, {$IFDEF UnzipBzip2Support} AbBzip2, {$ENDIF} {$IFDEF UnzipLzmaSupport} AbLzma, {$ENDIF} {$IFDEF UnzipPPMdSupport} AbPPMd, {$ENDIF} {$IFDEF UnzipWavPackSupport} AbWavPack, {$ENDIF} AbBitBkt, AbConst, AbDfBase, AbDfCryS, AbDfDec, AbExcept, AbSpanSt, AbSWStm, AbUnzOutStm, AbUtils, DCClassesUtf8; { -------------------------------------------------------------------------- } procedure AbReverseBits(var W : Word); {-Reverse the order of the bits in W} register; const RevTable : array[0..255] of Byte = ($00, $80, $40, $C0, $20, $A0, $60, $E0, $10, $90, $50, $D0, $30, $B0, $70, $F0, $08, $88, $48, $C8, $28, $A8, $68, $E8, $18, $98, $58, $D8, $38, $B8, $78, $F8, $04, $84, $44, $C4, $24, $A4, $64, $E4, $14, $94, $54, $D4, $34, $B4, $74, $F4, $0C, $8C, $4C, $CC, $2C, $AC, $6C, $EC, $1C, $9C, $5C, $DC, $3C, $BC, $7C, $FC, $02, $82, $42, $C2, $22, $A2, $62, $E2, $12, $92, $52, $D2, $32, $B2, $72, $F2, $0A, $8A, $4A, $CA, $2A, $AA, $6A, $EA, $1A, $9A, $5A, $DA, $3A, $BA, $7A, $FA, $06, $86, $46, $C6, $26, $A6, $66, $E6, $16, $96, $56, $D6, $36, $B6, $76, $F6, $0E, $8E, $4E, $CE, $2E, $AE, $6E, $EE, $1E, $9E, $5E, $DE, $3E, $BE, $7E, $FE, $01, $81, $41, $C1, $21, $A1, $61, $E1, $11, $91, $51, $D1, $31, $B1, $71, $F1, $09, $89, $49, $C9, $29, $A9, $69, $E9, $19, $99, $59, $D9, $39, $B9, $79, $F9, $05, $85, $45, $C5, $25, $A5, $65, $E5, $15, $95, $55, $D5, $35, $B5, $75, $F5, $0D, $8D, $4D, $CD, $2D, $AD, $6D, $ED, $1D, $9D, $5D, $DD, $3D, $BD, $7D, $FD, $03, $83, $43, $C3, $23, $A3, $63, $E3, $13, $93, $53, $D3, $33, $B3, $73, $F3, $0B, $8B, $4B, $CB, $2B, $AB, $6B, $EB, $1B, $9B, $5B, $DB, $3B, $BB, $7B, $FB, $07, $87, $47, $C7, $27, $A7, $67, $E7, $17, $97, $57, $D7, $37, $B7, $77, $F7, $0F, $8F, $4F, $CF, $2F, $AF, $6F, $EF, $1F, $9F, $5F, $DF, $3F, $BF, $7F, $FF); begin W := RevTable[Byte(W shr 8)] or Word(RevTable[Byte(W)] shl 8); end; { TAbUnzipHelper implementation ============================================ } { -------------------------------------------------------------------------- } constructor TAbUnzipHelper.Create( InputStream, OutputStream : TStream ); begin inherited Create; FOutBuf := AllocMem( AbBufferSize ); FOutPos := 0; FZStream := InputStream; FOutStream := OutputStream; FUncompressedSize := 0; FDictionarySize := dsInvalid; FShannonFanoTreeCount := 0; FCompressionMethod := cmDeflated; end; { -------------------------------------------------------------------------- } destructor TAbUnzipHelper.Destroy; begin FreeMem( FOutBuf, AbBufferSize ); inherited Destroy; end; { -------------------------------------------------------------------------- } procedure TAbUnzipHelper.Execute; begin {parent class handles exceptions via OnExtractFailure} FBitsLeft := 0; FCurByte := 0; FInCnt := 0; FOutSent := 0; FOutPos := 0; FInEof := False; {set the output stream; for Imploded/Reduced files this has to be buffered, for all other types of compression, the code buffers the output data nicely and so the given output stream can be used.} {$IFDEF UnzipImplodeSupport} if (FCompressionMethod = cmImploded) then FOutWriter := TabSlidingWindowStream.Create(FOutStream) else {$ENDIF} {$IFDEF UnzipReduceSupport} if (FCompressionMethod >= cmReduced1) and (FCompressionMethod <= cmReduced4) then FOutWriter := TabSlidingWindowStream.Create(FOutStream) else {$ENDIF} FOutWriter := FOutStream; FInPos := 1+SizeOf(FInBuf); { GetMem( FInBuf, SizeOf(FInBuf^) );} try {uncompress it with the appropriate method} case FCompressionMethod of {$IFDEF UnzipShrinkSupport} cmShrunk : uzUnshrink; {$ENDIF} {$IFDEF UnzipReduceSupport} cmReduced1..cmReduced4 : uzUnReduce; {$ENDIF} {$IFDEF UnzipImplodeSupport} cmImploded : uzUnImplode; {$ENDIF} {cmTokenized} {cmEnhancedDeflated} {cmDCLImploded} else raise EAbZipInvalidMethod.Create; end; finally uzFlushOutBuf; {free any memory} if (FOutWriter <> FOutStream) then FOutWriter.Free; end; end; { -------------------------------------------------------------------------- } procedure TAbUnzipHelper.uzReadNextPrim; begin FInCnt := FZStream.Read( FInBuf, sizeof( FInBuf ) ); FInEof := FInCnt = 0; {load first byte in buffer and set position counter} FCurByte := FInBuf[1]; FInPos := 2; end; { -------------------------------------------------------------------------- } procedure TAbUnzipHelper.uzFlushOutBuf; {-flushes the output buffer} begin if (FOutPos <> 0) then begin FOutWriter.Write( FOutBuf^, FOutPos ); Inc( FOutSent, FOutPos ); FOutPos := 0; end; end; { -------------------------------------------------------------------------- } procedure TAbUnzipHelper.uzWriteByte(B : Byte); {-Write one byte to the output buffer} begin FOutBuf^[FOutPos] := B; inc(FOutPos); if (FOutPos = AbBufferSize) or (LongInt(FOutPos) + FOutSent = FUncompressedSize) then uzFlushOutBuf; end; { -------------------------------------------------------------------------- } function TAbUnzipHelper.uzReadBits(Bits : Byte) : Integer; {-Read the specified number of bits} var SaveCurByte, Delta, SaveBitsLeft : Byte; begin {read next byte if we're out of bits} if FBitsLeft = 0 then begin {do we still have a byte buffered?} if FInPos <= FInCnt then begin {get next byte out of buffer and advance position counter} FCurByte := FInBuf[FInPos]; Inc(FInPos); end {are there any left to read?} else uzReadNextPrim; FBitsLeft := 8; end; if ( Bits < FBitsLeft ) then begin Dec( FBitsLeft, Bits ); Result := ((1 shl Bits) - 1) and FCurByte; FCurByte := FCurByte shr Bits; end else if ( Bits = FBitsLeft ) then begin Result := FCurByte; FCurByte := 0; FBitsLeft := 0; end else begin SaveCurByte := FCurByte; SaveBitsLeft := FBitsLeft; {number of additional bits that we need} Delta := Bits - FBitsLeft; {do we still have a byte buffered?} if FInPos <= FInCnt then begin {get next byte out of buffer and advance position counter} FCurByte := FInBuf[FInPos]; Inc(FInPos); end {are there any left to read?} else uzReadNextPrim; FBitsLeft := 8; Result := ( uzReadBits( Delta ) shl SaveBitsLeft ) or SaveCurByte; end; end; {$IFDEF UnzipImplodeSupport} { -------------------------------------------------------------------------- } procedure TAbUnzipHelper.uzUnImplode; {-Extract an imploded file} const szLengthTree = SizeOf(TAbSfTree)-(192*SizeOf(TAbSfEntry)); szDistanceTree = SizeOf(TAbSfTree)-(192*SizeOf(TAbSfEntry)); szLitTree = SizeOf(TAbSfTree); var Length : Integer; DIndex : LongInt; Distance : Integer; SPos : LongInt; MyByte : Byte; DictBits : Integer; {number of bits used in sliding dictionary} MinMatchLength : Integer; {minimum match length} LitTree : PAbSfTree; {Literal tree} LengthTree : PAbSfTree; {Length tree} DistanceTree : PAbSfTree; {Distance tree} procedure uzLoadTree(var T; TreeSize : Integer); {-Load one Shannon-Fano tree} var I : Word; Tree : TAbSfTree absolute T; procedure GenerateTree; {-Generate a Shannon-Fano tree} var C : Word; CodeIncrement : Integer; LastBitLength : Integer; I : Integer; begin C := 0; CodeIncrement := 0; LastBitLength := 0; for I := Tree.Entries-1 downto 0 do with Tree.Entry[I] do begin Inc(C, CodeIncrement); if BitLength <> LastBitLength then begin LastBitLength := BitLength; CodeIncrement := 1 shl (16-LastBitLength); end; Code := C; end; end; procedure SortLengths; {-Sort the bit lengths in ascending order, while retaining the order of the original lengths stored in the file} var XL : Integer; XGL : Integer; TXP : PAbSfEntry; TXGP : PAbSfEntry; X, Gap : Integer; Done : Boolean; LT : LongInt; begin Gap := Tree.Entries shr 1; repeat repeat Done := True; for X := 0 to (Tree.Entries-1)-Gap do begin TXP := @Tree.Entry[X]; TXGP := @Tree.Entry[X+Gap]; XL := TXP^.BitLength; XGL := TXGP^.BitLength; if (XL > XGL) or ((XL = XGL) and (TXP^.Value > TXGP^.Value)) then begin LT := TXP^.L; TXP^.L := TXGP^.L; TXGP^.L := LT; Done := False; end; end; until Done; Gap := Gap shr 1; until (Gap = 0); end; procedure uzReadLengths; {-Read bit lengths for a tree} var TreeBytes : Integer; I, J, K : Integer; Num, Len : Integer; B : Byte; begin {get number of bytes in compressed tree} TreeBytes := uzReadBits(8)+1; I := 0; Tree.MaxLength := 0; {High nibble: Number of values at this bit length + 1. Low nibble: Bits needed to represent value + 1} for J := 1 to TreeBytes do begin B := uzReadBits(8); Len := (B and $0F)+1; Num := (B shr 4)+1; for K := I to I+Num-1 do with Tree, Entry[K] do begin if Len > MaxLength then MaxLength := Len; BitLength := Len; Value := K; end; Inc(I, Num); end; end; begin Tree.Entries := TreeSize; uzReadLengths; SortLengths; GenerateTree; for I := 0 to TreeSize-1 do AbReverseBits(Tree.Entry[I].Code); end; function uzReadTree(var T) : Byte; {-Read next byte using a Shannon-Fano tree} var Bits : Integer; CV : Word; E : Integer; Cur : Integer; var Tree : TAbSfTree absolute T; begin Result := 0; Bits := 0; CV := 0; Cur := 0; E := Tree.Entries; repeat CV := CV or (uzReadBits(1) shl Bits); Inc(Bits); while Tree.Entry[Cur].BitLength < Bits do begin Inc(Cur); if Cur >= E then Exit; end; while Tree.Entry[Cur].BitLength = Bits do begin if Tree.Entry[Cur].Code = CV then begin Result := Tree.Entry[Cur].Value; Exit; end; Inc(Cur); if Cur >= E then Exit; end; until False; end; begin {do we have an 8K dictionary?} if FDictionarySize = ds8K then DictBits := 7 else DictBits := 6; {allocate trees} LengthTree := AllocMem(szLengthTree); DistanceTree := AllocMem(szDistanceTree); LitTree := nil; try {do we have a Literal tree?} MinMatchLength := FShannonFanoTreeCount; if MinMatchLength = 3 then begin LitTree := AllocMem(szLitTree); uzLoadTree(LitTree^, 256); end; {load the other two trees} uzLoadTree(LengthTree^, 64); uzLoadTree(DistanceTree^, 64); while (not FInEof) and (FOutSent + LongInt(FOutPos) < FUncompressedSize) do {is data literal?} if Boolean(uzReadBits(1)) then begin {if MinMatchLength = 3 then we have a Literal tree} if (MinMatchLength = 3) then uzWriteByte( uzReadTree(LitTree^) ) else uzWriteByte( uzReadBits(8) ); end else begin {data is a sliding dictionary} Distance := uzReadBits(DictBits); {using the Distance Shannon-Fano tree, read and decode the upper 6 bits of the Distance value} Distance := Distance or (uzReadTree(DistanceTree^) shl DictBits); {using the Length Shannon-Fano tree, read and decode the Length value} Length := uzReadTree(LengthTree^); if Length = 63 then Inc(Length, uzReadBits(8)); Inc(Length, MinMatchLength); {move backwards Distance+1 bytes in the output stream, and copy Length characters from this position to the output stream. (if this position is before the start of the output stream, then assume that all the data before the start of the output stream is filled with zeros)} DIndex := (FOutSent + LongInt(FOutPos))-(Distance+1); while Length > 0 do begin if DIndex < 0 then uzWriteByte(0) else begin uzFlushOutBuf; SPos := FOutWriter.Position; FOutWriter.Position := DIndex; FOutWriter.Read( MyByte, 1 ); FOutWriter.Position := SPos; uzWriteByte(MyByte); end; Inc(DIndex); Dec(Length); end; end; finally if (LitTree <> nil) then FreeMem(LitTree, szLitTree); FreeMem(LengthTree, szLengthTree); FreeMem(DistanceTree, szDistanceTree); end; end; {$ENDIF UnzipImplodeSupport} { -------------------------------------------------------------------------- } {$IFDEF UnzipReduceSupport} procedure TAbUnzipHelper.uzUnReduce; const FactorMasks : array[1..4] of Byte = ($7F, $3F, $1F, $0F); DLE = 144; var C, Last : Byte; OpI : LongInt; I, J, Sz : Integer; D : Word; SPos : LongInt; MyByte : Byte; Factor : Byte; {reduction Factor} FactorMask : Byte; {bit mask to use based on Factor} Followers : PAbFollowerSets; {array of follower sets} State : Integer; {used while processing reduced files} V : Integer; {"} Len : Integer; {"} function BitsNeeded( i : Byte ) : Word; begin dec( i ); Result := 0; repeat inc( Result ); i := i shr 1; until i = 0; end; begin GetMem(Followers, SizeOf(TAbFollowerSets)); try Factor := Ord( FCompressionMethod ) - 1; FactorMask := FactorMasks[Factor]; State := 0; C := 0; V := 0; Len := 0; D := 0; {load follower sets} for I := 255 downto 0 do begin Sz := uzReadBits(6); Followers^[I].Size := Sz; Dec(Sz); for J := 0 to Sz do Followers^[I].FSet[J] := uzReadBits(8); end; while (not FInEof) and ((FOutSent + LongInt(FOutPos)) < FUncompressedSize) do begin Last := C; with Followers^[Last] do if Size = 0 then C := uzReadBits(8) else begin C := uzReadBits(1); if C <> 0 then C := uzReadBits(8) else C := FSet[uzReadBits(BitsNeeded(Size))]; end; if FInEof then Exit; case State of 0 : if C <> DLE then uzWriteByte(C) else State := 1; 1 : if C <> 0 then begin V := C; Len := V and FactorMask; if Len = FactorMask then State := 2 else State := 3; end else begin uzWriteByte(DLE); State := 0; end; 2 : begin Inc(Len, C); State := 3; end; 3 : begin case Factor of 1 : D := (V shr 7) and $01; 2 : D := (V shr 6) and $03; 3 : D := (V shr 5) and $07; 4 : D := (V shr 4) and $0f; else raise EAbZipInvalidFactor.Create; end; {Delphi raises compiler Hints here, saying D might be undefined... If Factor is not in [1..4], the exception gets raised, and we never execute the following line} OpI := (FOutSent + LongInt(FOutPos))-(Swap(D)+C+1); for I := 0 to Len+2 do begin if OpI < 0 then uzWriteByte(0) else if OpI >= FOutSent then uzWriteByte(FOutBuf[OpI - FOutSent]) else begin SPos := FOutWriter.Position; FOutWriter.Position := OpI; FOutWriter.Read( MyByte, 1 ); FOutWriter.Position := SPos; uzWriteByte(MyByte); end; Inc(OpI); end; State := 0; end; end; end; finally FreeMem(Followers, SizeOf(Followers^)); end; end; {$ENDIF UnzipReduceSupport} { -------------------------------------------------------------------------- } {$IFDEF UnzipShrinkSupport} procedure TAbUnzipHelper.uzUnShrink; {-Extract a file that was shrunk} const MaxBits = 13; InitBits = 9; FirstFree = 257; Clear = 256; MaxCodeMax = 8192; {= 1 shl MaxBits} Unused = -1; var CodeSize : SmallInt; NextFree : SmallInt; BaseChar : SmallInt; NewCode : SmallInt; OldCode : SmallInt; SaveCode : SmallInt; N, R : SmallInt; I : Integer; PrefixTable : PAbIntArray8K; {used while processing shrunk files} SuffixTable : PAbByteArray8K; {"} Stack : PAbByteArray8K; {"} StackIndex : Integer; {"} begin CodeSize := InitBits; { MaxCode := (1 shl InitBits)-1;} NextFree := FirstFree; PrefixTable := nil; SuffixTable := nil; Stack := nil; try GetMem(PrefixTable, SizeOf(PrefixTable^)); SuffixTable := AllocMem(SizeOf(SuffixTable^)); GetMem(Stack, SizeOf(Stack^)); FillChar(PrefixTable^, SizeOf(PrefixTable^), $FF); for NewCode := 255 downto 0 do begin PrefixTable^[NewCode] := 0; SuffixTable^[NewCode] := NewCode; end; OldCode := uzReadBits(CodeSize); if FInEof then Exit; BaseChar := OldCode; uzWriteByte(BaseChar); StackIndex := 0; while (not FInEof) do begin NewCode := uzReadBits(CodeSize); while (NewCode = Clear) and (not FInEof) do begin case uzReadBits(CodeSize) of 1 : begin Inc(CodeSize); end; 2 : begin {mark all nodes as potentially unused} for I := FirstFree to pred( NextFree ) do PrefixTable^[I] := PrefixTable^[I] or LongInt($8000); {unmark those used by other nodes} for N := FirstFree to NextFree-1 do begin {reference to another node?} R := PrefixTable^[N] and $7FFF; {flag node as referenced} if R >= FirstFree then PrefixTable^[R] := PrefixTable^[R] and $7FFF; end; {clear the ones that are still marked} for I := FirstFree to pred( NextFree ) do if PrefixTable^[I] < 0 then PrefixTable^[I] := -1; {recalculate NextFree} NextFree := FirstFree; while (NextFree < MaxCodeMax) and (PrefixTable^[NextFree] <> -1) do Inc(NextFree); end; end; NewCode := uzReadBits(CodeSize); end; if FInEof then Exit; {save current code} SaveCode := NewCode; {special case} if PrefixTable^[NewCode] = Unused then begin Stack^[StackIndex] := BaseChar; Inc(StackIndex); NewCode := OldCode; end; {generate output characters in reverse order} while (NewCode >= FirstFree) do begin if PrefixTable^[NewCode] = Unused then begin Stack^[StackIndex] := BaseChar; Inc(StackIndex); NewCode := OldCode; end else begin Stack^[StackIndex] := SuffixTable^[NewCode]; Inc(StackIndex); NewCode := PrefixTable^[NewCode]; end; end; BaseChar := SuffixTable^[NewCode]; uzWriteByte(BaseChar); {put them out in forward order} while (StackIndex > 0) do begin Dec(StackIndex); uzWriteByte(Stack^[StackIndex]); end; {add new entry to tables} NewCode := NextFree; if NewCode < MaxCodeMax then begin PrefixTable^[NewCode] := OldCode; SuffixTable^[NewCode] := BaseChar; while (NextFree < MaxCodeMax) and (PrefixTable^[NextFree] <> Unused) do Inc(NextFree); end; {remember previous code} OldCode := SaveCode; end; finally FreeMem(PrefixTable, SizeOf(PrefixTable^)); FreeMem(SuffixTable, SizeOf(SuffixTable^)); FreeMem(Stack, SizeOf(Stack^)); end; end; {$ENDIF} { -------------------------------------------------------------------------- } procedure RequestPassword(Archive : TAbZipArchive; var Abort : Boolean); var APassPhrase : AnsiString; begin APassPhrase := Archive.Password; Abort := False; if Assigned(Archive.OnNeedPassword) then begin Archive.OnNeedPassword(Archive, APassPhrase); if APassPhrase = '' then Abort := True else Archive.Password := APassPhrase; end; end; { -------------------------------------------------------------------------- } procedure CheckPassword(Archive : TAbZipArchive; var Tries : Integer; var Abort : Boolean); begin { if current password empty } if Archive.Password = '' then begin { request password } RequestPassword(Archive, Abort); { increment tries } Inc(Tries); end; { if current password still empty } if Archive.Password = '' then begin { abort } raise EAbZipInvalidPassword.Create; end; end; { -------------------------------------------------------------------------- } procedure DoInflate(Archive : TAbZipArchive; Item : TAbZipItem; InStream, OutStream : TStream); var Hlpr : TAbDeflateHelper; begin Hlpr := TAbDeflateHelper.Create; try if Item.CompressionMethod = cmEnhancedDeflated then Hlpr.Options := Hlpr.Options or dfc_UseDeflate64; Hlpr.StreamSize := Item.CompressedSize; Inflate(InStream, OutStream, Hlpr); finally Hlpr.Free; end; end; { -------------------------------------------------------------------------- } procedure DoLegacyUnzip(Archive : TAbZipArchive; Item : TAbZipItem; InStream, OutStream : TStream); var Helper : TAbUnzipHelper; begin Helper := TAbUnzipHelper.Create(InStream, OutStream); try {Helper} Helper.DictionarySize := Item.DictionarySize; Helper.UnCompressedSize := Item.UncompressedSize; Helper.CompressionMethod := Item.CompressionMethod; Helper.ShannonFanoTreeCount := Item.ShannonFanoTreeCount; Helper.Execute; finally Helper.Free; end; end; { -------------------------------------------------------------------------- } {$IFDEF UnzipBzip2Support} procedure DoExtractBzip2(Archive : TAbZipArchive; Item : TAbZipItem; InStream, OutStream : TStream); var Bzip2Stream: TStream; begin Bzip2Stream := TBZDecompressionStream.Create(InStream); try OutStream.CopyFrom(Bzip2Stream, Item.UncompressedSize); finally Bzip2Stream.Free; end; end; {$ENDIF} { -------------------------------------------------------------------------- } {$IFDEF UnzipLzmaSupport} procedure DoExtractLzma(Archive : TAbZipArchive; Item : TAbZipItem; InStream, OutStream : TStream); var Header: packed record MajorVer, MinorVer: Byte; PropSize: Word; end; Properties: array of Byte; begin InStream.ReadBuffer(Header, SizeOf(Header)); SetLength(Properties, Header.PropSize); InStream.ReadBuffer(Properties[0], Header.PropSize); LzmaDecodeStream(PByte(Properties), Header.PropSize, InStream, OutStream, Item.UncompressedSize); end; {$ENDIF} { -------------------------------------------------------------------------- } function ExtractPrep(ZipArchive: TAbZipArchive; Item: TAbZipItem): TStream; var LFH : TAbZipLocalFileHeader; Abort : Boolean; Tries : Integer; CheckValue : LongInt; DecryptStream: TAbDfDecryptStream; begin { validate } if (Lo(Item.VersionNeededToExtract) > Ab_ZipVersion) then raise EAbZipVersion.Create; { seek to compressed file } if ZipArchive.FStream is TAbSpanReadStream then TAbSpanReadStream(ZipArchive.FStream).SeekImage(Item.DiskNumberStart, Item.RelativeOffset) else ZipArchive.FStream.Position := Item.RelativeOffset; { get local header info for Item} LFH := TAbZipLocalFileHeader.Create; try { select appropriate CRC value based on General Purpose Bit Flag } { also get whether the file is stored, while we've got the local file header } LFH.LoadFromStream(ZipArchive.FStream); if (LFH.GeneralPurposeBitFlag and AbHasDataDescriptorFlag = AbHasDataDescriptorFlag) then { if bit 3 is set, then the data descriptor record is appended to the compressed data } CheckValue := LFH.LastModFileTime shl $10 else CheckValue := Item.CRC32; finally LFH.Free; end; Result := TAbUnzipSubsetStream.Create(ZipArchive.FStream, Item.CompressedSize); { get decrypting stream } if Item.IsEncrypted then begin try { need to decrypt } Tries := 0; Abort := False; CheckPassword(ZipArchive, Tries, Abort); while True do begin if Abort then raise EAbUserAbort.Create; { check for valid password } DecryptStream := TAbDfDecryptStream.Create(Result, CheckValue, ZipArchive.Password); if DecryptStream.IsValid then begin DecryptStream.OwnsStream := True; Result := DecryptStream; Break; end; FreeAndNil(DecryptStream); { prompt again } Inc(Tries); if (Tries > ZipArchive.PasswordRetries) then raise EAbZipInvalidPassword.Create; RequestPassword(ZipArchive, Abort); end; except Result.Free; raise; end; end; end; { -------------------------------------------------------------------------- } procedure DoExtract(aZipArchive: TAbZipArchive; aItem: TAbZipItem; aInStream, aOutStream: TStream); var OutStream : TAbUnzipOutputStream; begin if aItem.UncompressedSize = 0 then Exit; OutStream := TAbUnzipOutputStream.Create(aOutStream); try OutStream.UncompressedSize := aItem.UncompressedSize; OutStream.OnProgress := aZipArchive.OnProgress; { determine storage type } case aItem.CompressionMethod of cmStored: begin { unstore aItem } OutStream.CopyFrom(aInStream, aItem.UncompressedSize); end; cmDeflated, cmEnhancedDeflated: begin { inflate aItem } DoInflate(aZipArchive, aItem, aInStream, OutStream); end; {$IFDEF UnzipBzip2Support} cmBzip2: begin DoExtractBzip2(aZipArchive, aItem, aInStream, OutStream); end; {$ENDIF} {$IFDEF UnzipLzmaSupport} cmLZMA: begin DoExtractLzma(aZipArchive, aItem, aInStream, OutStream); end; {$ENDIF} {$IFDEF UnzipPPMdSupport} cmPPMd: begin DecompressPPMd(aInStream, OutStream); end; {$ENDIF} {$IFDEF UnzipWavPackSupport} cmWavPack: begin DecompressWavPack(aInStream, OutStream); end; {$ENDIF} cmShrunk..cmImploded: begin DoLegacyUnzip(aZipArchive, aItem, aInStream, OutStream); end; else raise EAbZipInvalidMethod.Create; end; { check CRC } if OutStream.CRC32 <> aItem.CRC32 then if Assigned(aZipArchive.OnProcessItemFailure) then aZipArchive.OnProcessItemFailure(aZipArchive, aItem, ptExtract, ecAbbrevia, AbZipBadCRC) else raise EAbZipBadCRC.Create; finally OutStream.Free; end; end; { -------------------------------------------------------------------------- } procedure AbUnzipToStream( Sender : TObject; Item : TAbZipItem; OutStream : TStream); var ZipArchive : TAbZipArchive; InStream : TStream; begin ZipArchive := Sender as TAbZipArchive; if not Assigned(OutStream) then raise EAbBadStream.Create; InStream := ExtractPrep(ZipArchive, Item); try DoExtract(ZipArchive, Item, InStream, OutStream); finally InStream.Free end; end; { -------------------------------------------------------------------------- } procedure AbUnzip(Sender : TObject; Item : TAbZipItem; const UseName : string); {create the output filestream and pass it to DoExtract} var InStream, OutStream : TStream; ZipArchive : TAbZipArchive; begin ZipArchive := TAbZipArchive(Sender); if Item.IsDirectory then AbCreateDirectory(UseName) else begin InStream := ExtractPrep(ZipArchive, Item); try OutStream := TFileStreamEx.Create(UseName, fmCreate or fmShareDenyWrite); try try {OutStream} DoExtract(ZipArchive, Item, InStream, OutStream); finally {OutStream} OutStream.Free; end; {OutStream} except if ExceptObject is EAbUserAbort then ZipArchive.FStatus := asInvalid; DeleteFile(UseName); raise; end; finally InStream.Free end; end; AbSetFileTime(UseName, Item.LastModTimeAsDateTime); AbSetFileAttr(UseName, Item.NativeFileAttributes); end; { -------------------------------------------------------------------------- } procedure AbTestZipItem(Sender : TObject; Item : TAbZipItem); {extract item to bit bucket and verify its local file header} var BitBucket : TAbBitBucketStream; FieldSize : Word; LFH : TAbZipLocalFileHeader; Zip64Field : PZip64LocalHeaderRec; ZipArchive : TAbZipArchive; begin ZipArchive := TAbZipArchive(Sender); if (Lo(Item.VersionNeededToExtract) > Ab_ZipVersion) then raise EAbZipVersion.Create; { seek to compressed file } if ZipArchive.FStream is TAbSpanReadStream then TAbSpanReadStream(ZipArchive.FStream).SeekImage(Item.DiskNumberStart, Item.RelativeOffset) else ZipArchive.FStream.Position := Item.RelativeOffset; BitBucket := nil; LFH := nil; try BitBucket := TAbBitBucketStream.Create(0); LFH := TAbZipLocalFileHeader.Create; {get the item's local file header} ZipArchive.FStream.Seek(Item.RelativeOffset, soBeginning); LFH.LoadFromStream(ZipArchive.FStream); ZipArchive.FStream.Seek(Item.RelativeOffset, soBeginning); {currently a single exception is raised for any LFH error} if (LFH.VersionNeededToExtract <> Item.VersionNeededToExtract) then raise EAbZipInvalidLFH.Create; if (LFH.GeneralPurposeBitFlag <> Item.GeneralPurposeBitFlag) then raise EAbZipInvalidLFH.Create; if (LFH.LastModFileTime <> Item.LastModFileTime) then raise EAbZipInvalidLFH.Create; if (LFH.LastModFileDate <> Item.LastModFileDate) then raise EAbZipInvalidLFH.Create; if (LFH.CRC32 <> Item.CRC32) then raise EAbZipInvalidLFH.Create; if LFH.ExtraField.Get(Ab_Zip64SubfieldID, Pointer(Zip64Field), FieldSize) then begin if (Zip64Field.CompressedSize <> Item.CompressedSize) then raise EAbZipInvalidLFH.Create; if (Zip64Field.UncompressedSize <> Item.UncompressedSize) then raise EAbZipInvalidLFH.Create; end else begin if (LFH.CompressedSize <> Item.CompressedSize) then raise EAbZipInvalidLFH.Create; if (LFH.UncompressedSize <> Item.UncompressedSize) then raise EAbZipInvalidLFH.Create; end; if (LFH.FileName <> Item.RawFileName) then raise EAbZipInvalidLFH.Create; {any CRC errors will raise exception during extraction} AbUnZipToStream(Sender, Item, BitBucket); finally BitBucket.Free; LFH.Free; end; end; { -------------------------------------------------------------------------- } procedure InflateStream( CompressedStream, UnCompressedStream : TStream ); {-Inflates everything in CompressedStream to UncompressedStream no encryption is tried, no check on CRC is done, uses the whole compressedstream - no Progress events - no Frills!} begin Inflate(CompressedStream, UncompressedStream, nil); end; end. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abtartyp.pas����������������������������������������������0000644�0001750�0001750�00000256546�12143646266�022130� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Joel Haynie * Craig Peterson <capeterson@users.sourceforge.net> * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbTarTyp.pas *} {*********************************************************} {* ABBREVIA: TAbTarArchive, TAbTarItem classes *} {*********************************************************} {* Misc. constants, types, and routines for working *} {* with Tar files *} {*********************************************************} unit AbTarTyp; {$I AbDefine.inc} interface uses Classes, AbUtils, AbArcTyp; const AB_TAR_RECORDSIZE = 512; {Note: SizeOf(TAbTarHeaderRec) = AB_TAR_RECORDSIZE} AB_TAR_NAMESIZE = 100; AB_TAR_V7_EMPTY_SIZE = 167; AB_TAR_USTAR_PREFIX_SIZE = 155; AB_TAR_STAR_PREFIX_SIZE = 131; AB_TAR_OLD_GNU_EMPTY1_SIZE = 5; AB_TAR_OLD_GNU_SPARSE_SIZE = 96; AB_TAR_OLD_GNU_EMPTY2_SIZE = 17; AB_TAR_SIZE_AFTER_STDHDR = 167; AB_TAR_TUSRNAMELEN = 32; AB_TAR_TGRPNAMELEN = 32; { The checksum field is filled with this while the checksum is computed. } AB_TAR_CHKBLANKS = ' '; { 8 blank spaces(#20), no null } AB_TAR_L_HDR_NAME = '././@LongLink'; { As seen in the GNU File Examples} AB_TAR_L_HDR_USR_NAME='root'; { On Cygwin this is #0, Redhat it is 'root' } AB_TAR_L_HDR_GRP_NAME='root'; { Same on all OS's } AB_TAR_L_HDR_ARR8_0 ='0000000'#0; { 7 zeros and one null } AB_TAR_L_HDR_ARR12_0 ='00000000000'#0;{ 11 zeros and one null } AB_TAR_MAGIC_VAL = 'ustar'#0; { 5 chars & a nul } AB_TAR_MAGIC_VER = '00'; { 2 chars } AB_TAR_MAGIC_GNUOLD = 'ustar '#0; { 7 chars & a null } AB_TAR_MAGIC_V7_NONE = #0#0#0#0#0#0#0#0;{ 8, #0 } { The linkflag defines the type of file(FH), and Meta Data about File(MDH) } AB_TAR_LF_OLDNORMAL = #0; { FH, Normal disk file, Unix compatible } { Historically used for V7 } AB_TAR_LF_NORMAL = '0'; { FH, Normal disk file } AB_TAR_LF_LINK = '1'; { FH, Link to previously archived file } AB_TAR_LF_SYMLINK = '2'; { FH, Symbolic(soft) link } AB_TAR_LF_CHR = '3'; { FH, Character special file }{ Used for device nodes, Conditionally compiled into GNUTAR } AB_TAR_LF_BLK = '4'; { FH, Block special file }{ Used for device nodes, Conditionally compiled into GNUTAR } AB_TAR_LF_DIR = '5'; { FH, Directory, Zero size File } AB_TAR_LF_FIFO = '6'; { FH, FIFO special file }{ Used for fifo files(pipe like), Conditionally complied into GNUTAR } AB_TAR_LF_CONTIG = '7'; { FH, Contiguous file } { Normal File, but All blocks should be contiguos on the disk } AB_TAR_LF_XHDR = 'x'; { MDH, POSIX, Next File has Extended Header } AB_TAR_LF_XGL = 'g'; { MDH, POSIX, Global Extended Header } AB_TAR_LF_DUMPDIR = 'D'; { FH, Extra GNU, Dump Directory} { Generated Dump of Files in a directory, has a size } AB_TAR_LF_LONGLINK = 'K'; { MDH, Extra GNU, Next File has Long LinkName} AB_TAR_LF_LONGNAME = 'L'; { MDH, Extra GNU, Next File has Long Name} AB_TAR_LF_MULTIVOL = 'M'; { FH, Extra GNU, MultiVolume File Cont.}{ End of a file that spans multiple TARs } AB_TAR_LF_SPARSE = 'S'; { FH, Extra GNU, Sparse File Cont.} AB_TAR_LF_VOLHDR = 'V'; { FH, Extra GNU, File is Volume Header } AB_TAR_LF_EXHDR = 'X'; { MDH, Extra GNU, Solaris Extended Header } { The only questionable MetaData type is 'V', file or meta-data? will treat as file header } AB_SUPPORTED_F_HEADERS = [AB_TAR_LF_OLDNORMAL, AB_TAR_LF_NORMAL, AB_TAR_LF_LINK, AB_TAR_LF_SYMLINK, AB_TAR_LF_DIR]; AB_UNSUPPORTED_F_HEADERS = [AB_TAR_LF_CHR, AB_TAR_LF_BLK, AB_TAR_LF_FIFO, AB_TAR_LF_CONTIG, AB_TAR_LF_DUMPDIR, AB_TAR_LF_MULTIVOL, AB_TAR_LF_SPARSE, AB_TAR_LF_VOLHDR]; AB_SUPPORTED_MD_HEADERS = [AB_TAR_LF_LONGNAME, AB_TAR_LF_LONGLINK]; AB_UNSUPPORTED_MD_HEADERS= [AB_TAR_LF_XHDR, AB_TAR_LF_XGL, AB_TAR_LF_EXHDR]; AB_GNU_MD_HEADERS = [AB_TAR_LF_LONGLINK, AB_TAR_LF_LONGNAME]; { If present then OLD_/GNU_FORMAT } AB_PAX_MD_HEADERS = [AB_TAR_LF_XHDR, AB_TAR_LF_XGL]; { If present then POSIX_FORMAT } AB_IGNORE_SIZE_HEADERS = [AB_TAR_LF_LINK, AB_TAR_LF_SYMLINK, AB_TAR_LF_CHR, AB_TAR_LF_BLK, AB_TAR_LF_DIR, AB_TAR_LF_FIFO]; { The rest of the Chars are unsupported and unknown types Treat those headers as File types } { Further link types may be defined later. } { Bits used in the mode field - values in octal } AB_TAR_TSUID = $0800; { Set UID on execution } AB_TAR_TSGID = $0400; { Set GID on execution } AB_TAR_TSVTX = $0200; { Save text (sticky bit) } type Arr8 = array [0..7] of AnsiChar; Arr12 = array [0..11] of AnsiChar; Arr12B = array[0..11] of Byte; ArrName = array [0..AB_TAR_NAMESIZE-1] of AnsiChar; TAbTarHeaderFormat = (UNKNOWN_FORMAT, V7_FORMAT, OLDGNU_FORMAT, GNU_FORMAT, USTAR_FORMAT, STAR_FORMAT, POSIX_FORMAT); TAbTarItemType = (SUPPORTED_ITEM, UNSUPPORTED_ITEM, UNKNOWN_ITEM); TAbTarHeaderType = (FILE_HEADER, META_DATA_HEADER, MD_DATA_HEADER, UNKNOWN_HEADER); TAbTarMagicType = (GNU_OLD, NORMAL); TAbTarMagicRec = packed record case TAbTarMagicType of GNU_OLD: (gnuOld : array[0..7] of AnsiChar); { Old GNU magic: (Magic.gnuOld) } NORMAL : (value : array[0..5] of AnsiChar; { Magic value: (Magic.value)} version: array[0..1] of AnsiChar); { Version: (Magic.version) } end; { Notes from GNU Tar & POSIX Spec.: } {All the first 345 bytes are the same. } { "USTAR_header": Prefix(155): 345-499, empty(12): 500-511 } { "old_gnu_header": atime(12): 345-356, ctime(12): 357-368, offset(12): 369-380, longnames(4): 381-384, empty(1): 385, sparse structs(4x(12+12)=96): 386-481, isextended(1): 482, realsize(12): 483-494, empty(16): 495-511 } { "star_header": Prefix(131): 345-475, atime(12): 476-487, ctime(12): 488-499, empty(12): 500-511 } { "star_in_header": prefix(1): 345, empty(9): 346-354, isextended(1): 355, sparse structs(4x(12+12)=96): 356-451, realsize(12): 452-463, offset(12): 464-475, atime(12): 476-487, ctime(12): 488-499, empty(8): 500-507, xmagic(4): 508-511 } { "sparse_header": These two structs are the same, and they are Meta data about file. } {"star_ext_header": sparse structs(21x(12+12)=504): 0-503, isextended(1): 504 } {POSIX(PAX) extended header: is a buffer packed with content of this form: This if from the POSIX spec. References the C printf command string. "%d %s=%s\n". Then they are simply concatenated. } { PAX Extended Header Keywords: } { 'atime', 'charset', 'comment', 'ctime', 'gid', 'gname', 'linkpath', 'mtime', 'path', 'realtime.', 'security.', 'size', 'uid', 'uname' } { GNU Added PAX Extended Header Keywords: } { 'GNU.sparse.name', 'GNU.sparse.major', 'GNU.sparse.minor', 'GNU.sparse.realsize', 'GNU.sparse.numblocks', 'GNU.sparse.size', 'GNU.sparse.offset', 'GNU.sparse.numbytes', 'GNU.sparse.map', 'GNU.dumpdir', 'GNU.volume.label', 'GNU.volume.filename', 'GNU.volume.size', 'GNU.volume.offset' } { V7 uses AB_TAR_LF_OLDNORMAL linkflag, has no magic field & no Usr/Grp Names } { V7 Format ends Empty(padded with zeros), as does the POSIX record. } TAbTarEnd_Empty_Rec = packed record Empty: array[0..AB_TAR_V7_EMPTY_SIZE-1] of Byte; { 345-511, $159-1FF, Empty Space } end; { UStar End Format } TAbTarEnd_UStar_Rec = packed record Prefix: array[0..AB_TAR_USTAR_PREFIX_SIZE-1] of AnsiChar; { 345-499, $159-1F3, Prefix of file & path name, null terminated ASCII string } Empty : Arr12B;{ 500-512, $1F4-1FF, Empty Space } end; { Old GNU End Format } TAbTarEnd_GNU_old_Rec = packed record Atime : Arr12; { 345-356, $159-164, time of last access (UNIX Date in ASCII coded Octal)} Ctime : Arr12; { 357-368, $165-170, time of last status change (UNIX Date in ASCII coded Octal)} Offset: Arr12; { 369-380, $171-17C, Multirecord specific value } Empty1: array[0..AB_TAR_OLD_GNU_EMPTY1_SIZE-1] of Byte; { 381-385, $17D-181, Empty Space, Once contained longname ref. } Sparse: array[0..AB_TAR_OLD_GNU_SPARSE_SIZE-1] of Byte; { 386-481, $182-1E1, Sparse File specific values } IsExtended: byte;{ 482, $ 1E2, Flag to signify Sparse file headers follow } RealSize: Arr12;{ 483-494, $1E3-1EE, Real size of a Sparse File. } Empty2: array[0..AB_TAR_OLD_GNU_EMPTY2_SIZE-1] of Byte; { 495-511, $1EF-1FF, Empty Space } end; { Star End Format } TAbTarEnd_Star_Rec = packed record Prefix: array[0..AB_TAR_STAR_PREFIX_SIZE-1] of AnsiChar; { 345-499, $159-1F3, prefix of file & path name, null terminated ASCII string } Atime : Arr12; { 476-487, $1DC-1E7, time of last access (UNIX Date in ASCII coded Octal)} Ctime : Arr12; { 488-499, $1E8-1F3, time of last status change (UNIX Date in ASCII coded Octal)} Empty : Arr12B;{ 500-512, $1F4-1FF, Empty Space } end; { When support for sparse files is added, Add another record for sparse in header } { Note: SizeOf(TAbTarHeaderRec) = AB_TAR_RECORDSIZE by design } PAbTarHeaderRec = ^TAbTarHeaderRec; { Declare pointer type for use in the list } TAbTarHeaderRec = packed record Name : ArrName; { 0- 99, $ 0- 63, filename, null terminated ASCII string, unless length is 100 } Mode : Arr8; { 100-107, $ 64- 6B, file mode (UNIX style, ASCII coded Octal) } uid : Arr8; { 108-115, $ 6C- 73, usrid # (UNIX style, ASCII coded Octal) } gid : Arr8; { 116-123, $ 74- 7B, grpid # (UNIX style, ASCII coded Octal) } Size : Arr12; { 124-135, $ 7C- 87, size of TARred file (ASCII coded Octal) } ModTime : Arr12; { 136-147, $ 88- 93, time of last modification.(UNIX Date in ASCII coded Octal) UTC time } ChkSum : Arr8; { 148-155, $ 94- 9B, checksum of header (6 bytes ASCII coded Octal, #00, #20) } LinkFlag: AnsiChar; { 156, $ 9C, type of item, one of the Link Flag constants from above } LinkName: ArrName; { 157-256, $ 9D-100, name of link, null terminated ASCII string } Magic : TAbTarMagicRec; { 257-264, $101-108, identifier, usually 'ustar'#00'00' } UsrName : array [0..AB_TAR_TUSRNAMELEN-1] of AnsiChar; { 265-296, $109-128, username, null terminated ASCII string } GrpName : array [0..AB_TAR_TGRPNAMELEN-1] of AnsiChar; { 297-328, $129-148, groupname, null terminated ASCII string } DevMajor: Arr8; { 329-336, $149-150, major device ID (UNIX style, ASCII coded Octal) } DevMinor: Arr8; { 337-344, $151-158, minor device ID (UNIX style, ASCII coded Octal) } case TAbTarHeaderFormat of{ 345-511, $159-1FF See byte Definitions above.} V7_FORMAT : ( v7 : TAbTarEnd_Empty_Rec ); OLDGNU_FORMAT: ( gnuOld: TAbTarEnd_GNU_old_Rec ); GNU_FORMAT : ( gnu : TAbTarEnd_GNU_old_Rec ); USTAR_FORMAT : ( ustar : TAbTarEnd_UStar_Rec ); STAR_FORMAT : ( star : TAbTarEnd_Star_Rec ); POSIX_FORMAT : ( pax : TAbTarEnd_Empty_Rec ); end;{ end TAbTarHeaderRec } { There are three main types of headers we will see in a Tar file } { TAbTarHeaderType = (STANDARD_HDR, SPARSE_HDR, POSIX_EXTENDED_HDR); } { The 1st is defined above, The later two are simply organized data types. } TAbTarItemRec = record { Note: that the actual The name needs to be coherient with the name Inherited from parent type TAbArchiveItem } Name : string; { Path & File name. } Mode : LongWord; { File Permissions } uid : Integer; { User ID } gid : Integer; { Group ID } Size : Int64; { Tared File size } ModTime : Int64; { Last time of Modification, in UnixTime } ChkSumPass : Boolean; { Header Check sum found to be good } LinkFlag : AnsiChar; { Link Flag, Echos the actual File Type of this Item. } ItemType : TAbTarItemType; { Item Type Assigned from LinkFlag Header Types. } LinkName : string; { Link Name } Magic : AnsiString; { Magic value } Version : Integer; { Version Number } UsrName : string; { User Name, for User ID } GrpName : string; { Group Name, for Group ID } DevMajor : Integer; { Major Device ID } DevMinor : Integer; { Minor Device ID } { Additional Types used for holding info. } AccessTime : Int64; { Time of Last Access, in UnixTime } ChangeTime : Int64; { Time of Last Status Change, in UnixTime } ArchiveFormat: TAbTarHeaderFormat; { Type of Archive of this record } StreamPosition: Int64; { Pointer to the top of the item in the file. } Dirty : Boolean; { Indication if this record needs to have its headers CheckSum recalculated } ItemReadOnly: Boolean; { Indication if this record is READ ONLY } FileHeaderCount:Integer;{ Number of Headers in the Orginal TarHeaders in the File Stream } end; type PTAbTarItem = ^TAbTarItem; TAbTarItem = class(TAbArchiveItem) private { The following private members are used for Stuffing FTarItem struct } procedure ParseTarHeaders; { Error in header if } procedure DetectHeaderFormat; { Helper to stuff HeaderFormat } procedure GetFileNameFromHeaders; { Helper to pull name from Headers } procedure GetLinkNameFromHeaders; { Helper to pull name from Headers } function TestCheckSum: Boolean; { Helper to Calculate Checksum of a header. } procedure DoGNUExistingLongNameLink(LinkFlag: AnsiChar; I: Integer; const Value: AnsiString); procedure DoGNUNewLongNameLink(LinkFlag: AnsiChar; I: Integer; const Value: AnsiString); protected {private} PTarHeader: PAbTarHeaderRec;{ Points to FTarHeaderList.Items[FTarHeaderList.Count-1] } FTarHeaderList: TList; { List of The Headers } FTarHeaderTypeList: TList; { List of the Header Types } FTarItem: TAbTarItemRec; { Data about current TAR Item } protected function GetDevMajor: Integer; function GetDevMinor: Integer; function GetGroupID: Integer; function GetGroupName: string; function GetLinkName: string; function GetUserID: Integer; function GetUserName: string; function GetModTime: Int64; function GetNumHeaders: Integer; function GetMagic: string; { All Sets shall update the headers Or add headers as needed. } procedure SetDevMajor(const Value: Integer); procedure SetDevMinor(const Value: Integer); procedure SetGroupID(const Value: Integer); { Extended Headers } procedure SetGroupName(const Value: string); { Extended Headers } procedure SetLinkFlag(Value: AnsiChar); procedure SetLinkName(const Value: string); { Extended Headers } procedure SetUserID(const Value: Integer); { Extended Headers } procedure SetUserName(const Value: string); { Extended Headers } procedure SetModTime(const Value: Int64); Procedure SetMagic(const Value: string); { TODO: add support for Atime and Ctime here } { Overrides for Inherited Properties from type TAbArchiveItem } function GetCompressedSize : Int64; override; function GetExternalFileAttributes : LongWord; override; function GetFileName : string; override; function GetIsDirectory: Boolean; override; function GetIsEncrypted : Boolean; override; function GetLastModFileDate : Word; override; function GetLastModFileTime : Word; override; function GetLastModTimeAsDateTime: TDateTime; override; function GetNativeFileAttributes : LongInt; override; function GetNativeLastModFileTime: Longint; override; function GetUncompressedSize : Int64; override; procedure SetCompressedSize(const Value : Int64); override; { Extended Headers } procedure SetExternalFileAttributes( Value : LongWord ); override; procedure SetFileName(const Value : string); override; { Extended Headers } procedure SetIsEncrypted(Value : Boolean); override; procedure SetLastModFileDate(const Value : Word); override; { Extended Headers } procedure SetLastModFileTime(const Value : Word); override; { Extended Headers } procedure SetLastModTimeAsDateTime(const Value: TDateTime); override; procedure SetUncompressedSize(const Value : Int64); override; { Extended Headers } procedure SaveTarHeaderToStream(AStream : TStream); procedure LoadTarHeaderFromStream(AStream : TStream); property Magic : string { Magic value } read GetMagic write SetMagic; public { property Name : STRING; Path & File name. Inherited from parent type TAbArchiveItem } { read GetFileName write SetFileName; overridden above} property Mode : LongWord { File Permissions } read GetExternalFileAttributes write SetExternalFileAttributes; property UserID : Integer { User ID } read GetUserID write SetUserID; property GroupID : Integer { Group ID } read GetGroupID write SetGroupID; property ModTime : Int64 read GetModTime write SetModTime; { property UncompressedSize/CompressedSize(Size): Int64; File size (comp/uncomp) Inherited from parent type TAbArchiveItem } { read GetUncompressedSize, GetCompressedSize; overridden above } { write SetUncompressedSize, SetCompressedSize; overridden above } { property LastModFileTime/LastModFileDate(ModeTime): TDateTime; Last time of Modification Inherited from parent type TAbArchiveItem } { read GetLastModFileTime, GetLastModFileDate; overridden above } { write SetLastModFileTime, SetLastModFileDate; overridden above } property CheckSumGood: Boolean read FTarItem.ChkSumPass; { Header Check sum found to be good } property LinkFlag : AnsiChar { Link Flag of File Header } read FTarItem.LinkFlag write SetLinkFlag; property LinkName : string { Link Name } read GetLinkName write SetLinkName; property UserName : string { User Name, for User ID } read GetUserName write SetUserName; property GroupName : string { Group Name, for Group ID } read GetGroupName write SetGroupName; property DevMajor : Integer { Major Device ID } read GetDevMajor write SetDevMajor; property DevMinor : Integer { Minor Device ID } read GetDevMinor write SetDevMinor; { TODO: Add support ATime and CTime } {AccessTime : TDateTime;} { Time of Last Access } {ChangeTime : TDateTime;} { Time of Last Status Change } { Additional Types used for holding info. } property ExternalFileAttributes; property ArchiveFormat: TAbTarHeaderFormat read FTarItem.ArchiveFormat write FTarItem.ArchiveFormat; property ItemType: TAbTarItemType read FTarItem.ItemType write FTarItem.ItemType; property ItemReadOnly: Boolean read FTarItem.ItemReadOnly write FTarItem.ItemReadOnly; property FileHeaderCount: Integer read FTarItem.FileHeaderCount; property HeaderCount: Integer read GetNumHeaders; property StreamPosition: Int64 read FTarItem.StreamPosition write FTarItem.StreamPosition; constructor Create; destructor Destroy; override; end; { end TAbArchiveItem } TAbTarStreamHelper = class(TAbArchiveStreamHelper) private function FindItem: Boolean; { Tool for FindFirst/NextItem functions } protected FTarHeader : TAbTarHeaderRec; { Speed-up Buffer only } FCurrItemSize : Int64; { Current Item size } FCurrItemPreHdrs: Integer; { Number of Meta-data Headers before the Item } public destructor Destroy; override; procedure ExtractItemData(AStream : TStream); override; function FindFirstItem : Boolean; override; function FindNextItem : Boolean; override; procedure ReadHeader; override; procedure ReadTail; override; function SeekItem(Index : Integer): Boolean; override; procedure WriteArchiveHeader; override; procedure WriteArchiveItem(AStream : TStream); override; procedure WriteArchiveItemSize(AStream : TStream; Size: Int64); procedure WriteArchiveTail; override; function GetItemCount : Integer; override; end; TAbTarArchive = class(TAbArchive) private FArchReadOnly : Boolean; FArchFormat: TAbTarHeaderFormat; protected function CreateItem(const SourceFileName : string; const ArchiveDirectory : string): TAbArchiveItem; override; procedure ExtractItemAt(Index : Integer; const UseName : string); override; procedure ExtractItemToStreamAt(Index : Integer; aStream : TStream); override; procedure LoadArchive; override; procedure SaveArchive; override; procedure TestItemAt(Index : Integer); override; function FixName(const Value: string): string; override; function GetSupportsEmptyFolders: Boolean; override; function GetItem(Index: Integer): TAbTarItem; procedure PutItem(Index: Integer; const Value: TAbTarItem); public {methods} constructor CreateFromStream(aStream : TStream; const aArchiveName : string); override; property UnsupportedTypesDetected : Boolean read FArchReadOnly; property Items[Index : Integer] : TAbTarItem read GetItem write PutItem; default; end; procedure UnixAttrsToTarAttrs(const UnixAttrs: LongWord; out Permissions: LongWord; out LinkFlag: AnsiChar); procedure TarAttrsToUnixAttrs(const Permissions: LongWord; const LinkFlag: AnsiChar; out UnixAttrs: LongWord); function VerifyTar(Strm : TStream) : TAbArchiveType; implementation uses {$IFDEF MSWINDOWS} Windows, // Fix inline warnings {$ENDIF MSWINDOWS} Math, RTLConsts, SysUtils, AbVMStrm, AbExcept, DCOSUtils, DCClassesUtf8, DCConvertEncoding; { ****************** Helper functions Not from Classes Above ***************** } function OctalToInt(const Oct : PAnsiChar; aLen : integer): Int64; var i : integer; begin Result := 0; i := 0; while (i < aLen) and (Oct[i] = ' ') do inc(i); if (i = aLen) then Exit; while (i < aLen) and (Oct[i] in ['0'..'7']) do begin Result := (Result * 8) + (Ord(Oct[i]) - Ord('0')); inc(i); end; end; function IntToOctal(Value : Int64): AnsiString; const OctDigits : array[0..7] of AnsiChar = '01234567'; begin if Value = 0 then Result := '0' else begin Result := ''; while Value > 0 do begin Result := OctDigits[Value and 7] + Result; Value := Value shr 3; end; end; end; function CalcTarHeaderChkSum(const TarH : TAbTarHeaderRec): LongInt; var HdrBuffer : PAnsiChar; HdrChkSum : LongInt; j : Integer; begin { prepare for the checksum calculation } HdrBuffer := PAnsiChar(@TarH); HdrChkSum := 0; {calculate the checksum, a simple sum of the bytes in the header} for j := 0 to Pred(SizeOf(TAbTarHeaderRec)) do HdrChkSum := HdrChkSum + Ord(HdrBuffer[j]); Result := HdrChkSum; end; function VerifyTar(Strm : TStream) : TAbArchiveType; { assumes Tar positioned correctly for test of item } var TarItem : TAbTarItem; StartPos : Int64; begin StartPos := Strm.Position; try { Verifies that the header checksum is valid, and Item type is understood. This does not mean that extraction is supported. } TarItem := TAbTarItem.Create; try { get current Tar Header } TarItem.LoadTarHeaderFromStream(Strm); if TarItem.CheckSumGood then Result := atTar else Result := atUnknown; finally TarItem.Free; end; except on EReadError do Result := atUnknown; end; Strm.Position := StartPos; end; function PadString(const S : AnsiString; Places : Integer) : AnsiString; { Pads a string (S) with one right space and as many left spaces as needed to fill Places If length S greater than Places, just returns S Some TAR utilities evidently expect Octal numeric fields to be in this format } begin if Length(S) >= LongInt(Places) then Result := S else begin Result := S + ' '; Result := StringOfChar(AnsiChar(' '), Places - Length(Result)) + Result; end; end; { Round UP to the nearest Tar Block Boundary. } function RoundToTarBlock(Size: Int64) : Int64; begin Result := (Size + (AB_TAR_RECORDSIZE - 1)) and not (AB_TAR_RECORDSIZE - 1); end; procedure UnixAttrsToTarAttrs(const UnixAttrs: LongWord; out Permissions: LongWord; out LinkFlag: AnsiChar); begin case (UnixAttrs and $F000) of AB_FMODE_SOCKET: ; AB_FMODE_FILELINK: LinkFlag := AB_TAR_LF_SYMLINK; AB_FMODE_FILE2: LinkFlag := AB_TAR_LF_NORMAL; AB_FMODE_BLOCKSPECFILE: LinkFlag := AB_TAR_LF_BLK; AB_FMODE_DIR: LinkFlag := AB_TAR_LF_DIR; AB_FMODE_CHARSPECFILE: LinkFlag := AB_TAR_LF_CHR; AB_FMODE_FIFO: LinkFlag := AB_TAR_LF_FIFO; AB_FMODE_FILE: LinkFlag := AB_TAR_LF_NORMAL; else LinkFlag := AB_TAR_LF_OLDNORMAL; end; Permissions := (UnixAttrs and $0FFF); end; { -------------------------------------------------------------------------- } procedure TarAttrsToUnixAttrs(const Permissions: LongWord; const LinkFlag: AnsiChar; out UnixAttrs: LongWord); begin case LinkFlag of AB_TAR_LF_OLDNORMAL: UnixAttrs := AB_FMODE_FILE; AB_TAR_LF_NORMAL: UnixAttrs := AB_FMODE_FILE2; AB_TAR_LF_SYMLINK: UnixAttrs := AB_FMODE_FILELINK; AB_TAR_LF_BLK: UnixAttrs := AB_FMODE_BLOCKSPECFILE; AB_TAR_LF_DIR: UnixAttrs := AB_FMODE_DIR; AB_TAR_LF_CHR: UnixAttrs := AB_FMODE_CHARSPECFILE; AB_TAR_LF_FIFO: UnixAttrs := AB_FMODE_FIFO; else UnixAttrs := AB_FMODE_FILE; end; UnixAttrs := UnixAttrs or (Permissions and $0FFF); end; { ****************************** TAbTarItem ********************************** } constructor TAbTarItem.Create; begin inherited Create; FTarHeaderList := TList.Create; FTarHeaderTypeList := TList.Create; GetMem(PTarHeader, AB_TAR_RECORDSIZE); { PTarHeader is our new Header } FillChar(PTarHeader^, AB_TAR_RECORDSIZE, #0); FTarHeaderList.Add(PTarHeader); FTarHeaderTypeList.Add(Pointer(FILE_HEADER)); FTarItem.FileHeaderCount := 1; { set defaults } FTarItem.ArchiveFormat := UNKNOWN_FORMAT; FileName := ''; Mode := AB_FPERMISSION_GENERIC; UserID := 0; GroupID := 0; UncompressedSize := 0; { ModTime } LinkFlag := AB_TAR_LF_OLDNORMAL; { Link Name } PTarHeader.Magic.gnuOld := AB_TAR_MAGIC_V7_NONE; { Default to GNU type } UserName := ''; GroupName := ''; DevMajor := 0; DevMinor := 0; { TODO: atime, ctime } FTarItem.ItemType := SUPPORTED_ITEM; FTarItem.Dirty := True; { Checksum needs to be generated } FTarItem.ItemReadOnly := False; end; destructor TAbTarItem.Destroy; var i : Integer; begin if Assigned(FTarHeaderList) then begin for i := 0 to FTarHeaderList.Count - 1 do FreeMem(FTarHeaderList.Items[i]); { This list holds PAbTarHeaderRec's } FTarHeaderList.Free; end; FTarHeaderTypeList.Free; inherited Destroy; end; function TAbTarItem.GetCompressedSize: Int64; { TAR includes no internal compression, returns same value as GetUncompressedSize } begin Result := FTarItem.Size; end; function TAbTarItem.GetDevMajor: Integer; begin Result := FTarItem.DevMajor; end; function TAbTarItem.GetDevMinor: Integer; begin Result := FTarItem.DevMinor; end; function TAbTarItem.GetExternalFileAttributes: LongWord; begin TarAttrsToUnixAttrs(FTarItem.Mode, FTarItem.LinkFlag, Result); end; function TAbTarItem.GetFileName: string; begin Result := FTarItem.Name; { Inherited String from Parent Class } end; function TAbTarItem.GetGroupID: Integer; begin Result := FTarItem.gid; end; function TAbTarItem.GetGroupName: string; begin Result := FTarItem.GrpName; end; function TAbTarItem.GetIsDirectory: Boolean; begin Result := (LinkFlag = AB_TAR_LF_DIR); end; function TAbTarItem.GetIsEncrypted: Boolean; begin { TAR has no native encryption } Result := False; end; function TAbTarItem.GetLastModFileDate: Word; begin { convert to local DOS file Date } Result := LongRec(AbDateTimeToDosFileDate(LastModTimeAsDateTime)).Hi; end; function TAbTarItem.GetLastModFileTime: Word; begin { convert to local DOS file Time } Result := LongRec(AbDateTimeToDosFileDate(LastModTimeAsDateTime)).Lo; end; function TAbTarItem.GetLastModTimeAsDateTime: TDateTime; begin Result := AbUnixTimeToLocalDateTime(FTarItem.ModTime); end; function TAbTarItem.GetNativeLastModFileTime: Longint; {$IFDEF MSWINDOWS} var DateTime: TDateTime; {$ENDIF} begin Result := Self.ModTime; {$IFDEF MSWINDOWS} DateTime := AbUnixTimeToLocalDateTime(Result); Result := AbDateTimeToDosFileDate(DateTime); {$ENDIF} end; function TAbTarItem.GetLinkName: string; begin Result := FTarItem.LinkName; end; function TAbTarItem.GetMagic: string; begin Result := string(FTarItem.Magic); end; function TAbTarItem.GetNativeFileAttributes : LongInt; begin Result := GetExternalFileAttributes; {$IFDEF MSWINDOWS} Result := AbUnix2DosFileAttributes(Result); {$ENDIF} end; function TAbTarItem.GetUncompressedSize: Int64; { TAR includes no internal compression, returns same value as GetCompressedSize } begin Result := FTarItem.Size; end; function TAbTarItem.GetUserID: Integer; begin Result := FTarItem.uid; end; function TAbTarItem.GetUserName: string; begin Result := FTarItem.UsrName; end; function TAbTarItem.GetModTime: Int64; begin Result := FTarItem.ModTime; end; { Get Number of tar headers currently for this item } function TAbTarItem.GetNumHeaders: Integer; begin Result := FTarHeaderList.Count; end; { Takes data from Supported Header types stored in TAbTarItem.FTarHeaderList } { and updates values in the TAbTarItem.FTarItem.X } procedure TAbTarItem.DetectHeaderFormat; begin if FTarItem.ArchiveFormat <> UNKNOWN_FORMAT then Exit;{ We have already set the format. } { In the previous header parsing if pax headers are detected the format is changed } { GNU_FORMAT is detected by the presence of GNU extended headers. } { These detections are similar to GNU tar's. } if (PTarHeader.Magic.value = AB_TAR_MAGIC_VAL) then begin { We have one of three types, STAR_FORMAT, USTAR_FORMAT, POSIX_FORMAT } { Detect STAR format. Leave disabled until explicit STAR support is added. } {if (PTarHeader.star.Prefix[130] = #00) and (PTarHeader.star.Atime[0] in ['0'..'7']) and (PTarHeader.star.Atime[11] = #20) and (PTarHeader.star.Ctime[0]in ['0'..'7']) and (PTarHeader.star.Ctime[11] = #20) then begin FTarItme.ArchiveType := STAR_FORMAT; end } { else if } { POSIX uses the existance of x headers } { This can define false positives, Pax headers/ STAR format could be detected as this } FTarItem.ArchiveFormat := USTAR_FORMAT; end else if (PTarHeader.Magic.gnuOld = AB_TAR_MAGIC_GNUOLD) then begin FTarItem.ArchiveFormat := OLDGNU_FORMAT; end else { V7 uses AB_TAR_LF_OLDNORMAL linkflag, has no magic field & no Usr/Grp Names } begin FTarItem.ArchiveFormat := V7_FORMAT; { Lowest Common Denominator } end; end; { Extract the file name from the headers } procedure TAbTarItem.GetFileNameFromHeaders; var I, J : Integer; PHeader: PAbTarHeaderRec; FoundName: Boolean; NameLength : Int64; NumMHeaders: integer; ExtraName: integer; RawFileName, TempStr: AnsiString; begin { UNKNOWN_FORMAT, V7_FORMAT, OLDGNU_FORMAT, GNU_FORMAT, USTAR_FORMAT, STAR_FORMAT, POSIX_FORMAT } FoundName := False; I := 0; while (not FoundName) and (I <= (FTarHeaderList.Count - 1)) do begin PHeader := FTarHeaderList.Items[I]; if PHeader.LinkFlag = AB_TAR_LF_LONGNAME then begin FoundName := True; RawFileName := ''; NameLength := OctalToInt(PHeader.Size, SizeOf(PHeader.Size)); NumMHeaders := NameLength div AB_TAR_RECORDSIZE; ExtraName := NameLength mod AB_TAR_RECORDSIZE; { Chars in the last Header } { NumMHeaders should never be zero } { It appears that it is not null terminated in the blocks } for J := 1 to NumMHeaders do begin { Copy entire content of Header to String } PHeader := FTarHeaderList.Items[I+J]; SetString(TempStr, PAnsiChar(PHeader), AB_TAR_RECORDSIZE); RawFileName := RawFileName + TempStr; end; if ExtraName <> 0 then begin PHeader := FTarHeaderList.Items[I+NumMHeaders+1]; SetString(TempStr, PAnsiChar(PHeader), ExtraName-1); RawFileName := RawFileName + TempStr; end else { We already copied the entire name, but the string is still null terminated. } begin { Removed the last zero } SetLength(RawFileName, (Length(RawFileName)-1)); end; end { end long filename link flag } else I := I + 1; end; { End While } if not FoundName then begin if (FTarItem.ArchiveFormat = USTAR_FORMAT) and (PTarHeader.ustar.Prefix[0] <> #0) then RawFileName := PTarHeader.ustar.Prefix+'/'+PTarHeader.Name else { V7_FORMAT, OLDGNU_FORMAT } RawFileName := PTarHeader.Name; end; { End not FoundName } FTarItem.Name := CeRawToUtf8(RawFileName); end; { Extract the file name from the headers } procedure TAbTarItem.GetLinkNameFromHeaders; var I, J : Integer; PHeader: PAbTarHeaderRec; FoundName: Boolean; NameLength : Int64; NumMHeaders: integer; ExtraName: integer; RawLinkName, TempStr: AnsiString; begin { UNKNOWN_FORMAT, V7_FORMAT, OLDGNU_FORMAT, GNU_FORMAT, USTAR_FORMAT, STAR_FORMAT, POSIX_FORMAT } PHeader := nil; FoundName := False; I := 0; { Note that: FTarHeaderList.Count <= 1, always } while (not FoundName) and (I <= (FTarHeaderList.Count - 1)) do begin PHeader := FTarHeaderList.Items[I]; if PHeader.LinkFlag = AB_TAR_LF_LONGLINK then begin FoundName := True; RawLinkName := ''; NameLength := OctalToInt(PHeader.Size, SizeOf(PHeader.Size)); NumMHeaders := NameLength div AB_TAR_RECORDSIZE; ExtraName := NameLength mod AB_TAR_RECORDSIZE; { Chars in the last Header } { NumMHeaders should never be zero } { It appears that it is not null terminated in the blocks } for J := 1 to NumMHeaders do begin { Copy entire content of Header to String } PHeader := FTarHeaderList.Items[I+J]; SetString(TempStr, PAnsiChar(PHeader), AB_TAR_RECORDSIZE); RawLinkName := RawLinkName + TempStr; end; if ExtraName <> 0 then begin PHeader := FTarHeaderList.Items[I+NumMHeaders+1]; SetString(TempStr, PAnsiChar(PHeader), ExtraName-1); RawLinkName := RawLinkName + TempStr; end else { We already copied the entire name, but the string is still null terminated. } begin { Removed the last zero } SetLength(RawLinkName, (Length(RawLinkName)-1)); end; end { end long filename link flag } else I := I + 1; end; { End While } if not FoundName then RawLinkName := PHeader.LinkName; FTarItem.LinkName := CeRawToUtf8(RawLinkName); end; { Return True if CheckSum passes out. } function TAbTarItem.TestCheckSum : Boolean; var TarChkSum : LongInt; TarChkSumArr : Arr8; { ChkSum field is Arr8 } PHeader: PAbTarHeaderRec; I: Integer; begin Result := True; { Check sums are in valid headers but NOT in the data headers. } for I := 0 to FTarHeaderList.Count - 1 do begin if TAbTarHeaderType(FTarHeaderTypeList.Items[I]) in [FILE_HEADER, META_DATA_HEADER] then begin PHeader := FTarHeaderList.Items[i]; { Save off old Check sum } Move(PHeader.ChkSum, TarChkSumArr, SizeOf(PHeader.ChkSum)); TarChkSum := OctalToInt(TarChkSumArr, SizeOf(TarChkSumArr)); { Set to Generator Value } PHeader.ChkSum := AB_TAR_CHKBLANKS; if CalcTarHeaderChkSum(PHeader^) <> TarChkSum then Result := False; { Pass unless one miss-compares } { Save back old checksum } Move(TarChkSumArr, PHeader.ChkSum, SizeOf(TarChkSumArr)); end; end; end; procedure TAbTarItem.ParseTarHeaders; begin { The final index is the Item index } DetectHeaderFormat; { Long term this parsing is not correct, as the values in extended headers override the later values in this header } FTarItem.Mode := OctalToInt(PTarHeader.Mode, SizeOf(PTarHeader.Mode)); FTarItem.uid := OctalToInt(PTarHeader.uid, SizeOf(PTarHeader.uid)); { Extended in PAX Headers } FTarItem.gid := OctalToInt(PTarHeader.gid, SizeOf(PTarHeader.gid)); { Extended in PAX Headers } FTarItem.Size := OctalToInt(PTarHeader.Size, SizeOf(PTarHeader.Size)); { Extended in PAX Headers } { ModTime should be an Int64 but no tool support, No issues until Feb 6th, 2106 :) } { ModTime is Extended in PAX Headers } FTarItem.ModTime := OctalToInt(PTarHeader.ModTime, SizeOf(PTarHeader.ModTime)); FTarItem.ChkSumPass := TestCheckSum(); FTarItem.LinkFlag := PTarHeader.LinkFlag; GetLinkNameFromHeaders; { Extended in PAX Headers } FTarItem.Magic := PTarHeader.Magic.value; FTarItem.Version := OctalToInt(PTarHeader.Magic.version, SizeOf(PTarHeader.Magic.version)); FTarItem.UsrName := string(PTarHeader.UsrName); { Extended in PAX Headers } FTarItem.GrpName := string(PTarHeader.GrpName); { Extended in PAX Headers } FTarItem.DevMajor := OctalToInt(PTarHeader.DevMajor, SizeOf(PTarHeader.DevMajor)); FTarItem.DevMinor := OctalToInt(PTarHeader.DevMinor, SizeOf(PTarHeader.DevMinor)); GetFileNameFromHeaders; { FTarItem.ArchiveFormat; Already stuffed } { FTarItem.StreamPosition: Already Stuffed } { FTarItem.Dirty; Stuffed upon creaction } end; procedure TAbTarItem.LoadTarHeaderFromStream(AStream: TStream); var NumMHeaders : Integer; I : Integer; FoundItem : Boolean; begin { Note: The SizeOf(TAbTarHeaderRec) = AB_TAR_RECORDSIZE } { We should expect FindNext/FirstItem, and next check for bounds. } if FTarHeaderList.Count > 0 then begin { We're Going to stomp over the headers that are already present } { We need to destory the memory we've used } PTarHeader := nil; for i := 0 to FTarHeaderList.Count - 1 do FreeMem(FTarHeaderList.Items[i]); { This list holds PAbTarHeaderRec's } FTarHeaderList.Clear; FTarHeaderTypeList.Clear; FTarItem.FileHeaderCount := 0; { All pointers should now be removed from those headers } end; { Now lets start filling up that list. } FTarItem.ItemType := UNKNOWN_ITEM; { We don't know what we have yet } FoundItem := False; while not FoundItem do begin { Create a Header to be Stored in the Items List } GetMem(PTarHeader, AB_TAR_RECORDSIZE); AStream.ReadBuffer(PTarHeader^, AB_TAR_RECORDSIZE); FTarHeaderList.Add(PTarHeader); { Store the Header to the list } { Parse header based on LinkFlag } if PTarHeader.LinkFlag in (AB_SUPPORTED_MD_HEADERS+AB_UNSUPPORTED_MD_HEADERS) then begin { This Header type is in the Set of un/supported Meta data type headers } if PTarHeader.LinkFlag in AB_UNSUPPORTED_MD_HEADERS then FTarItem.ItemReadOnly := True; { We don't fully support this meta-data type } if (PTarHeader.LinkFlag in AB_PAX_MD_HEADERS) and (PTarHeader.Magic.value = AB_TAR_MAGIC_VAL) then FTarItem.ArchiveFormat := POSIX_FORMAT; { We have a POSIX_FORMAT, has x headers, and Magic matches } if PTarHeader.LinkFlag in AB_GNU_MD_HEADERS then FTarItem.ArchiveFormat := OLDGNU_FORMAT; { We have a OLDGNU_FORMAT, has L/K headers } { There can be a unknown number of Headers of data } { We are for sure going to read at least one more header, but are we going to read more than that? } FTarHeaderTypeList.Add(Pointer(META_DATA_HEADER)); NumMHeaders := Ceil(OctalToInt(PTarHeader.Size, SizeOf(PTarHeader.Size)) / AB_TAR_RECORDSIZE); { NumMHeasder should never be zero } for I := 1 to NumMHeaders do begin GetMem(PTarHeader, AB_TAR_RECORDSIZE); { Create a new Header } AStream.ReadBuffer(PTarHeader^, AB_TAR_RECORDSIZE); { Get the Meta Data } FTarHeaderList.Add(PTarHeader); { Store the Header to the list } FTarHeaderTypeList.Add(Pointer(MD_DATA_HEADER)); end; { Loop and reparse } end else if PTarHeader.LinkFlag in AB_SUPPORTED_F_HEADERS then begin { This Header type is in the Set of supported File type Headers } FoundItem := True; { Exit Criterion } FTarItem.ItemType := SUPPORTED_ITEM; if FTarItem.ItemReadOnly then { Since some of the Headers are read only. } FTarItem.ItemType := UNSUPPORTED_ITEM; { This Item is unsupported } FTarHeaderTypeList.Add(Pointer(FILE_HEADER)); end else if PTarHeader.LinkFlag in AB_UNSUPPORTED_F_HEADERS then begin { This Header type is in the Set of unsupported File type Headers } FoundItem := True; { Exit Criterion } FTarItem.ItemType := UNSUPPORTED_ITEM; FTarHeaderTypeList.Add(Pointer(FILE_HEADER)); end else { These are unknown header types } begin { Note: Some of these unknown types could have known Meta-data headers } FoundItem := True; FTarItem.ItemType := UNKNOWN_ITEM; FTarHeaderTypeList.Add(Pointer(UNKNOWN_HEADER)); end;{ end LinkFlag parsing } end; { end Found Item While } { PTarHeader points to FTarHeaderList.Items[FTarHeaderList.Count-1]; } { Re-wind the Stream back to the begining of this Item inc. all headers } AStream.Seek(-(FTarHeaderList.Count*AB_TAR_RECORDSIZE), soFromCurrent); { AStream.Position := FTarItem.StreamPosition; } { This should be equivalent as above } FTarItem.FileHeaderCount := FTarHeaderList.Count; if FTarItem.ItemType <> UNKNOWN_ITEM then begin ParseTarHeaders; { Update FTarItem values } FFileName := FTarItem.Name; {FTarHeader.Name;} // FDiskFileName := FileName; // AbUnfixName(FDiskFileName); end; Action := aaNone; Tagged := False; end; { ****************** BEGIN SET ********************** } procedure TAbTarItem.SaveTarHeaderToStream(AStream: TStream); var i : Integer; j : Integer; PHeader : PAbTarHeaderRec; HdrChkSum : Integer; HdrChkStr : AnsiString; HdrBuffer : PAnsiChar; SkipNextChkSum: Integer; SkipChkSum: Boolean; begin if FTarItem.ItemReadOnly then { Read Only - Do Not Save } Exit; { Note: The SizeOf(TAbTarHeaderRec) = AB_TAR_RECORDSIZE } if FTarItem.Dirty then SkipNextChkSum := 0 else SkipNextChkSum := FTarHeaderList.Count; { Don't recalc any chkSums } { The first header in the Item list must have a checksum calculation } for i := 0 to (FTarHeaderList.Count-1) do begin SkipChkSum := False; PHeader := FTarHeaderList.Items[i]; if (SkipNextChkSum = 0) then begin { We need to parse this header } if PHeader.LinkFlag in (AB_SUPPORTED_MD_HEADERS+AB_UNSUPPORTED_MD_HEADERS) then begin { We have a Meta-Data Header, Calculate how many headers to skip. } { These meta-data headers have non-Header buffers after this Header } SkipNextChkSum := Ceil(OctalToInt(PHeader.Size, SizeOf(PHeader.Size)) / AB_TAR_RECORDSIZE); { Ceil will mandate one run through, and will handle 512 correctly } end else if PHeader.LinkFlag in AB_SUPPORTED_F_HEADERS then begin SkipNextChkSum := 0; end else begin { Un-Supported Header type, Copy but do nothing to the data } SkipNextChkSum := 0; SkipChkSum := True; end;{ end LinkFlag parsing } end else begin { Do not calcuate the check sum on this meta Data header buffer } SkipNextChkSum := SkipNextChkSum - 1; SkipChkSum := True; end;{ end SkipNextChkSum } if not SkipChkSum then begin { We are Calculating the Checksum for this Header } {Tar ChkSum is "odd" The check sum field is filled with #20 chars as empty } { ChkSum field itself is #20'd and has an effect on the sum } PHeader.ChkSum := AB_TAR_CHKBLANKS; { Set up the buffers } HdrBuffer := PAnsiChar(PHeader); HdrChkSum := 0; { Calculate the checksum, a simple sum of the bytes in the header } for j := 0 to (AB_TAR_RECORDSIZE-1) do HdrChkSum := HdrChkSum + Ord(HdrBuffer[j]); { set the checksum in the header } HdrChkStr := PadString(IntToOctal(HdrChkSum), SizeOf(PHeader.ChkSum)); Move(HdrChkStr[1], PHeader.ChkSum, Length(HdrChkStr)); end; { end Skip Check Sum } { write header to the file } AStream.Write(PHeader^, AB_TAR_RECORDSIZE); end; { End for the number of headers in the list } { Updated here as the stream is now updated to the latest number of headers } FTarItem.FileHeaderCount := FTarHeaderList.Count; end; procedure TAbTarItem.SetCompressedSize(const Value: Int64); var S : AnsiString; begin if FTarItem.ItemReadOnly then { Read Only - Do Not Save } Exit; { Size is extendable in PAX Headers, Remember PAX extended Header Over Rule File Headers } FTarItem.Size := Value; { Store our Vitrual Copy } S := PadString(IntToOctal(Value), SizeOf(Arr12));{ Stuff to header } Move(S[1], PTarHeader.Size, Length(S)); FTarItem.Dirty := True; end; procedure TAbTarItem.SetDevMajor(const Value: Integer); var S : AnsiString; begin if FTarItem.ItemReadOnly then { Read Only - Do Not Save } Exit; { Dev Major and Minor are Only used for AB_TAR_LF_CHR, AB_TAR_LF_BLK } { Otherwise they are stuffed with #00 } FTarItem.DevMajor := Value; { Store to the struct } S := PadString(IntToOctal(Value), SizeOf(Arr8)); Move(S[1], PTarHeader.DevMajor, Length(S)); FTarItem.Dirty := True; end; procedure TAbTarItem.SetDevMinor(const Value: Integer); var S : AnsiString; begin if FTarItem.ItemReadOnly then { Read Only - Do Not Save } Exit; { Dev Major and Minor are Only used for AB_TAR_LF_CHR, AB_TAR_LF_BLK } { Otherwise they are stuffed with #00 } FTarItem.DevMinor := Value; S := PadString(IntToOctal(Value), SizeOf(Arr8)); Move(S[1], PTarHeader.DevMinor, Length(S)); FTarItem.Dirty := True; end; procedure TAbTarItem.SetExternalFileAttributes(Value: LongWord); var S : AnsiString; I: Integer; Permissions: LongWord; ALinkFlag: AnsiChar; begin if FTarItem.ItemReadOnly then { Read Only - Do Not Save } Exit; UnixAttrsToTarAttrs(Value, Permissions, ALinkFlag); FTarItem.Mode := Permissions; S := PadString(IntToOctal(Permissions), SizeOf(Arr8)); for I := 0 to FTarHeaderList.Count - 1 do if TAbTarHeaderType(FTarHeaderTypeList.Items[I]) in [FILE_HEADER, META_DATA_HEADER] then Move(S[1], PAbTarHeaderRec(FTarHeaderList.Items[I]).Mode, Length(S)); Self.LinkFlag := ALinkFlag; // also updates headers FTarItem.Dirty := True; end; { Add/Remove Headers as needed To/From Existing GNU Long (Link/Name) TarItems } procedure TAbTarItem.DoGNUExistingLongNameLink(LinkFlag: AnsiChar; I: Integer; const Value: AnsiString); var PHeader: PAbTarHeaderRec; J: Integer; OldNameLength: Integer; TotalOldNumHeaders: Integer; TotalNewNumHeaders: Integer; NumHeaders: Integer; ExtraName: Integer; tempStr: AnsiString; begin PHeader := FTarHeaderList.Items[I]; { Need this data from the old header } OldNameLength := OctalToInt(PHeader.Size, SizeOf(PHeader.Size));{ inlcudes Null termination } { Length(FTarItem.Name)+1 = OldNameLength; }{ This should be true, always } { Save off the new Length, so we don't have to change the pointers later. } tempStr := PadString(IntToOctal(Length(Value)+1), SizeOf(PHeader.Size)); Move(tempStr[1], PHeader.Size, Length(tempStr)); TotalOldNumHeaders := Ceil(OldNameLength / AB_TAR_RECORDSIZE); TotalNewNumHeaders := Ceil((Length(Value)+1) / AB_TAR_RECORDSIZE);{ Null terminated } {Length(Value)+1: 1-512 = 1, 513-1024 = 2 ... } J := TotalOldNumHeaders - TotalNewNumHeaders; while J <> 0 do begin if J > 0 then begin { Old > New, Have to many Headers, Remove } FreeMem(FTarHeaderList.Items[I+J]); { Free the Memory for the extra Header } FTarHeaderList.Delete(I+J); { Delete the List index } FTarHeaderTypeList.Delete(I+J); J := J - 1; end else { if J < 0 then } begin { Old < New, Need more Headers, Insert } GetMem(PHeader, AB_TAR_RECORDSIZE); FTarHeaderList.Insert(I+1,PHeader);{ Insert: Inserts at index } FTarHeaderTypeList.Insert(I+1,Pointer(MD_DATA_HEADER));{ We are only adding MD Data headers here } J := J + 1; end; end;{ end numHeaders while } { Yes, GNU Tar adds a Nil filled MD data header if Length(Value) mod AB_TAR_RECORDSIZE = 0 } NumHeaders := (Length(Value)+1) div AB_TAR_RECORDSIZE; { Include Null terminator } ExtraName := (Length(Value)+1) mod AB_TAR_RECORDSIZE; { Chars in the last Header } { Now we have the number of headers set up, stuff the name in the Headers } TempStr := AnsiString(Value); for J := 1 to NumHeaders do begin { Copy entire next AB_TAR_RECORDSIZE bytes of tempString to content of Header } { There may only be AB_TAR_RECORDSIZE-1 bytes if this is the last rounded header } PHeader := FTarHeaderList.Items[I+J]; Move(TempStr[1], PHeader^, AB_TAR_RECORDSIZE); if Length(TempStr) >= AB_TAR_RECORDSIZE then Delete(TempStr, 1, AB_TAR_RECORDSIZE);{ Crop string } end; if ExtraName <> 0 then begin { Copy whatever is left in tempStr into the rest of the buffer } PHeader := FTarHeaderList.Items[I+NumHeaders+1]; FillChar(PHeader^, AB_TAR_RECORDSIZE, #0); { Zero the whole block } Move(TempStr[1], PHeader^, ExtraName-1); { The string is null terminated } end else { We already copied the entire name, but it must be null terminated } begin FillChar(Pointer(PtrInt(PHeader)+AB_TAR_RECORDSIZE-1)^, 1, #0); { Zero rest of the block } end; { Finally we need to stuff the file type Header. } { Note: Value.length > AB_TAR_NAMESIZE(100) } if LinkFlag = AB_TAR_LF_LONGNAME then Move(Value[1], PTarHeader.Name, AB_TAR_NAMESIZE) else Move(Value[1], PTarHeader.LinkName, AB_TAR_NAMESIZE); end; { Always inserts the L/K Headers at index 0+ } procedure TAbTarItem.DoGNUNewLongNameLink(LinkFlag: AnsiChar; I: Integer; const Value: AnsiString); var PHeader: PAbTarHeaderRec; J: Integer; NumHeaders: Integer; ExtraName: Integer; tempStr: AnsiString; begin { We have a GNU_FORMAT, and no L/K Headers.} { Add a new MD Header and MD Data Headers } { Make an L/K header } GetMem(PHeader, AB_TAR_RECORDSIZE); FTarHeaderList.Insert(I, PHeader);{ Insert: Inserts at base index } FTarHeaderTypeList.Insert(I, Pointer( META_DATA_HEADER));{ This is the L/K Header } FillChar(PHeader^, AB_TAR_RECORDSIZE, #0); { Zero the whole block } StrPCopy(PHeader.Name, AB_TAR_L_HDR_NAME); { Stuff L/K String Name } StrPCopy(PHeader.Mode, AB_TAR_L_HDR_ARR8_0); { Stuff zeros } StrPCopy(PHeader.uid, AB_TAR_L_HDR_ARR8_0); { Stuff zeros } StrPCopy(PHeader.gid, AB_TAR_L_HDR_ARR8_0); { Stuff zeros } tempStr := PadString(IntToOctal(Length(Value)+1), SizeOf(PHeader.Size)); { Stuff Size } Move(tempStr[1], PHeader.Size, Length(tempStr)); StrPCopy(PHeader.ModTime, AB_TAR_L_HDR_ARR12_0); { Stuff zeros } { Check sum will be calculated as the Dirty flag is in caller. } PHeader.LinkFlag := LinkFlag; { Stuff Link FlagSize } StrPCopy(PHeader.Magic.gnuOld, AB_TAR_MAGIC_GNUOLD); { Stuff the magic } StrPCopy(PHeader.UsrName, AB_TAR_L_HDR_USR_NAME); StrPCopy(PHeader.GrpName, AB_TAR_L_HDR_GRP_NAME); { All else stays as Zeros. } { Completed with L/K Header } { OK, now we need to add the proper number of MD Data Headers, and intialize to new name } { Yes, GNU Tar adds an extra Nil filled MD data header if Length(Value) mod AB_TAR_RECORDSIZE = 0 } NumHeaders := Ceil((Length(Value)+1) / AB_TAR_RECORDSIZE); { Include Null terminator } ExtraName := (Length(Value)+1) mod AB_TAR_RECORDSIZE; { Chars in the last Header } { Now we have the number of headers set up, stuff the name in the Headers } TempStr := AnsiString(Value); for J := 1 to NumHeaders-1 do begin { Make a buffer, and copy entire next AB_TAR_RECORDSIZE bytes of tempStr to content of Header } { There may only be AB_TAR_RECORDSIZE-1 bytes if this is the last rounded header } GetMem(PHeader, AB_TAR_RECORDSIZE); FTarHeaderList.Insert(J+I, PHeader); FTarHeaderTypeList.Insert(J+I, Pointer(MD_DATA_HEADER));{ We are adding MD Data headers here } Move(TempStr[1], PHeader^, AB_TAR_RECORDSIZE); if Length(TempStr) >= AB_TAR_RECORDSIZE then Delete(TempStr, 1, AB_TAR_RECORDSIZE);{ Crop string } end; if ExtraName <> 0 then begin { Copy what ever is left in tempStr into the rest of the buffer } { Create the last MD Data Header } GetMem(PHeader, AB_TAR_RECORDSIZE); FTarHeaderList.Insert(I+NumHeaders, PHeader);{ Insert: Inserts at base index } FTarHeaderTypeList.Insert(I+NumHeaders, Pointer(MD_DATA_HEADER));{ We are only adding MD Data headers here } FillChar(PHeader^, AB_TAR_RECORDSIZE, #0); { Zero the whole block } Move(TempStr[1], PHeader^, ExtraName-1); { The string is null terminated in the header } end else { We already copied the entire name, but it must be null terminated } begin FillChar(Pointer(PtrInt(PHeader)+AB_TAR_RECORDSIZE-1)^, 1, #0); { Zero rest of the block } end; { Finally we need to stuff the file type Header. } { Note: Value.length > AB_TAR_NAMESIZE(100) } if LinkFlag = AB_TAR_LF_LONGNAME then Move(Value[1], PTarHeader.Name, AB_TAR_NAMESIZE) else Move(Value[1], PTarHeader.LinkName, AB_TAR_NAMESIZE); end; procedure TAbTarItem.SetFileName(const Value: string); var FoundMetaDataHeader: Boolean; PHeader: PAbTarHeaderRec; I, J: Integer; TotalOldNumHeaders: Integer; RawFileName: AnsiString; begin if FTarItem.ItemReadOnly then { Read Only - Do Not Save } Exit; { Assume ItemReadOnly is set for all Unsupported Type. } { Cases: New File Name is short, Length <= 100, All formats: Zero Name field and move new name to field. V7: Work complete, 1 header USTAR: zero prefix field, 1 Header OLD_GNU & GNU: Remove old name headers, 1 header. STAR & PAX: And should not yet get here. New File Name is Long, Length >=101 Note: The Header Parsing sets any V7 to GNU if 'L'/'K" Headers are present V7: Raise an exception, as this can NOT be done, no change to header. USTAR: if new length <= 254 zero fill header, update name fields, 1 updated Header if new Length >= 255 raise an exception, as this can NOT be done, no change to header if old was Short, Add files to match format, OLD_GNU & GNU: Create new Name header, Add N Headers for name, Update name in file header, update name fields, min 3 headers STAR & PAX: And should not yet get here. if old was Long, OLD_GNU & GNU: Add N Headers for name, Update name in MD header, update name field in File Headers, min 3 headers Add headers to length of new Name Length, update name in file header, update name fields } RawFileName := CeUtf8ToSys(Value); { In all cases zero out the name fields in the File Header. } if Length(RawFileName) > AB_TAR_NAMESIZE then begin { Must be null terminated except at 100 char length } { Look for long name meta-data headers already in the archive. } FoundMetaDataHeader := False; I := 0; { FTarHeaderList.Count <= 1 always } while (not FoundMetaDataHeader) and (I <= (FTarHeaderList.Count - 1)) do begin PHeader := FTarHeaderList.Items[I]; if PHeader.LinkFlag = AB_TAR_LF_LONGNAME then begin { We are growing or Shriking the Name MD Data fields. } FoundMetaDataHeader := True; DoGNUExistingLongNameLink(AB_TAR_LF_LONGNAME, I, RawFileName); { Need to copy the Name to the header. } FTarItem.Name := Value; end else I := I + 1; end; { End While } { MD Headers & MD Data Headers have been stuffed if FoundMetaDataHeader } { Still need to stuff the File type header contents. } if not FoundMetaDataHeader then begin case FTarItem.ArchiveFormat of V7_FORMAT: raise EAbTarBadFileName.Create; { File Name to Long } USTAR_FORMAT: begin { Longest file name is AB_TAR_NAMESIZE(100) chars } { Longest Prefix is AB_TAR_USTAR_PREFIX_SIZE(155) chars } { These two fields are delimted by a '/' char } {0123456789012345, Length = 15, NameLength = 5, PrefixLength = 9} { AAAA/BBBB/C.txt, Stored as Name := 'C.txt', Prefix := 'AAAA/BBBB' } { That means Theoretical maximum is 256 for Length(RawFileName) } if Length(RawFileName) > (AB_TAR_NAMESIZE+AB_TAR_USTAR_PREFIX_SIZE+1) then { Check the obvious one. } raise EAbTarBadFileName.Create; { File Name to Long } for I := Length(RawFileName) downto Length(RawFileName)-AB_TAR_NAMESIZE-1 do begin if RawFileName[I] = '/' then begin if (I <= AB_TAR_USTAR_PREFIX_SIZE+1) and (Length(RawFileName)-I <= AB_TAR_NAMESIZE) then begin { We have a successfull parse. } FillChar(PTarHeader.Name, SizeOf(PTarHeader.Name), #0); FillChar(PTarHeader.ustar.Prefix, SizeOf(PTarHeader.ustar.Prefix), #0); Move(RawFileName[I+1], PTarHeader.Name, Length(RawFileName)-I); Move(RawFileName[1], PTarHeader.ustar.Prefix, I); break; end else if (Length(RawFileName)-I > AB_TAR_NAMESIZE) then raise EAbTarBadFileName.Create { File Name not splittable } { else continue; } end; end;{ End for I... } end; { End USTAR Format } OLDGNU_FORMAT: DoGNUNewLongNameLink(AB_TAR_LF_LONGNAME, 0, RawFileName); {GNU_FORMAT} else begin { UNKNOWN_FORMAT, STAR_FORMAT, POSIX_FORMAT } raise EAbTarBadOp.Create; { Unknown Archive Format } end;{ End of Else for case statement } end;{ End of case statement } FTarItem.Name := Value; end; { if no Meta data header found } end { End "name length larger than 100" } else begin { Short new name, Simple Case Just put it in the Name Field & remove any headers } { PTarHeader Points to the File type Header } { Zero the Name field } FillChar(PTarHeader.Name, SizeOf(PTarHeader.Name), #0); if FTarItem.ArchiveFormat in [USTAR_FORMAT] then { Zero the prefix field } FillChar(PTarHeader.ustar.Prefix, SizeOf(PTarHeader.ustar.Prefix), #0); if FTarItem.ArchiveFormat in [GNU_FORMAT, OLDGNU_FORMAT] then begin { We may have AB_TAR_LF_LONGNAME Headers to be removed } { Remove long file names Headers if they exist} FoundMetaDataHeader := False; I := 0; while not FoundMetaDataHeader and (I <= (FTarHeaderList.Count - 1)) do begin PHeader := FTarHeaderList.Items[I]; if PHeader.LinkFlag in [AB_TAR_LF_LONGNAME] then begin { Delete this Header, and the data Headers. } FoundMetaDataHeader := True; TotalOldNumHeaders := Ceil( OctalToInt(PHeader.Size, SizeOf(PHeader.Size)) / AB_TAR_RECORDSIZE); for J := TotalOldNumHeaders downto 0 do begin { Note 0 will delete the Long Link MD Header } FreeMem(FTarHeaderList.Items[I+J]); { This list holds PAbTarHeaderRec's } FTarHeaderList.Delete(I+J); FTarHeaderTypeList.Delete(I+J); end; end else I := I + 1; { Got to next header } end;{ End While not found... } end; { End if GNU... } { Save off the new name and store to the Header } FTarItem.Name := Value; { Must add Null Termination before we store to Header } StrPLCopy(PTarHeader.Name, RawFileName, AB_TAR_NAMESIZE); end;{ End else Short new name,... } { Update the inherited file names. } FFileName := FTarItem.Name; //DiskFileName := FFileName; //AbUnfixName(FDiskFileName); // Don't override DiskFileName FTarItem.Dirty := True; end; procedure TAbTarItem.SetGroupID(const Value: Integer); var S : AnsiString; begin if FTarItem.ItemReadOnly then { Read Only - Do Not Save } Exit; { gid is extendable in PAX Headers, Rember PAX extended Header Over Rule File Headers } FTarItem.gid := Value; S := PadString(IntToOctal(Value), SizeOf(Arr8)); Move(S[1], PTarHeader.gid, Length(S)); FTarItem.Dirty := True; end; procedure TAbTarItem.SetGroupName(const Value: string); begin if FTarItem.ItemReadOnly then { Read Only - Do Not Save } Exit; { GrpName is extendable in PAX Headers, Rember PAX extended Header Over Rule File Headers } FTarItem.GrpName := Value; StrPLCopy(PTarHeader.GrpName, AnsiString(Value), SizeOf(PTarHeader.GrpName)); FTarItem.Dirty := True; end; procedure TAbTarItem.SetIsEncrypted(Value: Boolean); begin { do nothing, TAR has no native encryption } end; procedure TAbTarItem.SetLastModFileDate(const Value: Word); begin { replace date, keep existing time } LastModTimeAsDateTime := EncodeDate( Value shr 9 + 1980, Value shr 5 and 15, Value and 31) + Frac(LastModTimeAsDateTime); end; procedure TAbTarItem.SetLastModFileTime(const Value: Word); begin { keep current date, replace time } LastModTimeAsDateTime := Trunc(LastModTimeAsDateTime) + EncodeTime( Value shr 11, Value shr 5 and 63, Value and 31 shl 1, 0); end; procedure TAbTarItem.SetLastModTimeAsDateTime(const Value: TDateTime); begin // TAR stores always Unix time. SetModTime(AbLocalDateTimeToUnixTime(Value)); // also updates headers end; procedure TAbTarItem.SetLinkFlag(Value: AnsiChar); begin if FTarItem.ItemReadOnly then Exit; FTarItem.LinkFlag := Value; PTarHeader.LinkFlag := Value; FTarItem.Dirty := True; end; procedure TAbTarItem.SetLinkName(const Value: string); var FoundMetaDataHeader: Boolean; PHeader: PAbTarHeaderRec; I, J: Integer; TotalOldNumHeaders: Integer; RawLinkName: AnsiString; begin if FTarItem.ItemReadOnly then { Read Only - Do Not Save } Exit; { Cases: New Link Name is short, Length <= 100, All formats: Zero Name field and move new name to field. V7: Work complete, 1 header USTAR: Work complete, 1 Header OLD_GNU & GNU: Remove old link headers, 1 header. STAR & PAX: And should not yet get here. New File Name is Long, Length >=101 Note: The Header Parsing sets any V7 to GNU if 'L'/'K' Headers are present V7: Raise an exception, as this can NOT be done, no change to header. USTAR: Raise an exception, as this can NOT be done, no change to header. if old was Short, Add files to match format, OLD_GNU & GNU: Create new Link header, Add N Headers for name, Update name in file header, update name fields, min 3 headers if old was Long, OLD_GNU & GNU: Add N Headers for name, Update name in MD header, update name field in File Headers, min 3 headers STAR & PAX: And should not yet get here.} RawLinkName := CeUtf8ToSys(Value); if Length(RawLinkName) > AB_TAR_NAMESIZE then { Must be null terminated except at 100 char length } begin { Look for long name meta-data headers already in the archive. } FoundMetaDataHeader := False; I := 0; { FTarHeaderList.Count <= 1 always } while (not FoundMetaDataHeader) and (I <= (FTarHeaderList.Count - 1)) do begin PHeader := FTarHeaderList.Items[I]; if PHeader.LinkFlag = AB_TAR_LF_LONGLINK then begin { We are growing or Shriking the Name MD Data fields. } FoundMetaDataHeader := True; DoGNUExistingLongNameLink(AB_TAR_LF_LONGLINK, I, RawLinkName); { Need to copy the Name to the header. } FTarItem.LinkName := Value; end else I := I + 1; end; { End While } { MD Headers & MD Data Headers have been stuffed if FoundMetaDataHeader } { Still need to stuff the File type header contents. } if not FoundMetaDataHeader then begin case FTarItem.ArchiveFormat of V7_FORMAT: raise EAbTarBadLinkName.Create; { Link Name to Long } USTAR_FORMAT: raise EAbTarBadLinkName.Create; { Link Name to Long } OLDGNU_FORMAT: DoGNUNewLongNameLink(AB_TAR_LF_LONGLINK, 0, RawLinkName); {GNU_FORMAT} else begin { UNKNOWN_FORMAT, STAR_FORMAT, POSIX_FORMAT } raise EAbTarBadOp.Create; { Unknown Archive Format } end;{ End of Else for case statement } end;{ End of case statement } FTarItem.LinkName := Value; end; { if no Meta data header found } end { End "name length larger than 100" } else begin { Short new name, Simple Case Just put it in the Link Field & remove any headers } { PTarHeader Points to the File type Header } { Zero the Link field } FillChar(PTarHeader.LinkName, SizeOf(PTarHeader.LinkName), #0); if FTarItem.ArchiveFormat in [GNU_FORMAT, OLDGNU_FORMAT] then begin { We may have AB_TAR_LF_LONGNAME Headers to be removed } { Remove long file names Headers if they exist} FoundMetaDataHeader := False; I := 0; while not FoundMetaDataHeader and (I <= (FTarHeaderList.Count - 1)) do begin PHeader := FTarHeaderList.Items[I]; if PHeader.LinkFlag in [AB_TAR_LF_LONGLINK] then begin { Delete this Header, and the data Headers. } FoundMetaDataHeader := True; TotalOldNumHeaders := Ceil( OctalToInt(PHeader.Size, SizeOf(PHeader.Size)) / AB_TAR_RECORDSIZE); for J := TotalOldNumHeaders downto 0 do begin { Note 0 will delete the Long Link MD Header } FreeMem(FTarHeaderList.Items[I+J]); { This list holds PAbTarHeaderRec's } FTarHeaderList.Delete(I+J); FTarHeaderTypeList.Delete(I+J); end; end else I := I + 1; { Got to next header } end;{ End While not found... } end; { End if GNU... } { Save off the new name and store to the Header } FTarItem.LinkName := Value; StrPLCopy(PTarHeader.LinkName, RawLinkName, AB_TAR_NAMESIZE); end;{ End else Short new name,... } FTarItem.Dirty := True; end; procedure TAbTarItem.SetMagic(const Value: String); begin if FTarItem.ItemReadOnly then { Read Only - Do Not Save } Exit; FTarItem.Magic := AnsiString(Value); Move(Value[1], PTarHeader.Magic, SizeOf(TAbTarMagicRec)); FTarItem.Dirty := True; end; procedure TAbTarItem.SetUncompressedSize(const Value: Int64); var S : AnsiString; begin if FTarItem.ItemReadOnly then { Read Only - Do Not Save } Exit; { Size is extendable in PAX Headers, Remember PAX extended Header Over Rule File Headers } FTarItem.Size := Value; { Store our Vitrual Copy } S := PadString(IntToOctal(Value), SizeOf(Arr12));{ Stuff to header } Move(S[1], PTarHeader.Size, Length(S)); FTarItem.Dirty := True; end; procedure TAbTarItem.SetUserID(const Value: Integer); var S : AnsiString; begin if FTarItem.ItemReadOnly then { Read Only - Do Not Save } Exit; { uid is extendable in PAX Headers, Remember PAX extended Header Over Rule File Headers } FTarItem.uid := Value; S := PadString(IntToOctal(Value), SizeOf(Arr8)); Move(S[1], PTarHeader.uid, Length(S)); FTarItem.Dirty := True; end; procedure TAbTarItem.SetUserName(const Value: string); begin if FTarItem.ItemReadOnly then { Read Only - Do Not Save } Exit; { UsrName is extendable in PAX Headers, Remember PAX extended Header Over Rule File Headers } FTarItem.UsrName := Value; StrPLCopy(PTarHeader.UsrName, AnsiString(Value), SizeOf(PTarHeader.UsrName)); FTarItem.Dirty := True; end; procedure TAbTarItem.SetModTime(const Value: Int64); var S: AnsiString; begin if FTarItem.ItemReadOnly then { Read Only - Do Not Save } Exit; { ModTime is extendable in PAX Headers, Remember PAX extended Header Over Rule File Headers } FTarItem.ModTime := Value; { Store our Virtual Copy } S := PadString(IntToOctal(Value), SizeOf(Arr12));{ Stuff to header } Move(S[1], PTarHeader.ModTime, Length(S)); FTarItem.Dirty := True; end; { ************************** TAbTarStreamHelper ****************************** } destructor TAbTarStreamHelper.Destroy; begin inherited Destroy; end; { This is slow, use the archive class instead } procedure TAbTarStreamHelper.ExtractItemData(AStream: TStream); begin { Note: The SizeOf(TAbTarHeaderRec) = AB_TAR_RECORDSIZE } if FCurrItemSize <> 0 then begin { copy stored data to output } AStream.CopyFrom(FStream, FCurrItemSize); {reset the stream to the start of the item} FStream.Seek(-(FCurrItemPreHdrs*AB_TAR_RECORDSIZE+FCurrItemSize), soFromCurrent); end; { else do nothing } end; { This function Should only be used from LoadArchive, as it is slow. } function TAbTarStreamHelper.FindItem: Boolean; var DataRead : LongInt; FoundItem: Boolean; SkipHdrs : Integer; begin { Note: The SizeOf(TAbTarHeaderRec) = AB_TAR_RECORDSIZE } { Note: Standard LBA size of hard disks is 512 bytes = AB_TAR_RECORDSIZE } FoundItem := False; { Getting an new Item reset these numbers } FCurrItemSize := 0; FCurrItemPreHdrs := 0; DataRead := FStream.Read(FTarHeader, AB_TAR_RECORDSIZE); { Read in a header } { DataRead <> AB_TAR_RECORDSIZE means end of stream, and the End Of Archive record is all #0's, which the StrLen(FTarHeader.Name) check will catch } while (DataRead = AB_TAR_RECORDSIZE) and (StrLen(FTarHeader.Name) > 0) and not FoundItem do begin { Either exit when we find a supported file or end of file or an invalid header name. } if FTarHeader.LinkFlag in (AB_SUPPORTED_MD_HEADERS+AB_UNSUPPORTED_MD_HEADERS) then begin { We have a un/supported Meta-Data Header } { FoundItem := False } { Value remains False. } SkipHdrs := Ceil(OctalToInt(FTarHeader.Size, SizeOf(FTarHeader.Size))/AB_TAR_RECORDSIZE); FStream.Seek(SkipHdrs*AB_TAR_RECORDSIZE, soFromCurrent); { Tally new Headers: Consumed + Current } FCurrItemPreHdrs := FCurrItemPreHdrs + SkipHdrs + 1; { Read our next header, Loop, and re-parse } DataRead := FStream.Read(FTarHeader, AB_TAR_RECORDSIZE); end else if FTarHeader.LinkFlag in (AB_SUPPORTED_F_HEADERS+AB_UNSUPPORTED_F_HEADERS) then begin { We have a un/supported File Header. } FoundItem := True; if not (FTarHeader.LinkFlag in AB_IGNORE_SIZE_HEADERS) then FCurrItemSize := OctalToInt(FTarHeader.Size, SizeOf(FTarHeader.Size)) else FCurrItemSize := 0; { Per The spec these Headers do not have file content } FCurrItemPreHdrs := FCurrItemPreHdrs + 1; { Tally current header } end else begin{ We Have an Unknown header } FoundItem := True; FCurrItemSize := 0; { We could have many un/supported headers before this unknown type } FCurrItemPreHdrs := FCurrItemPreHdrs + 1; { Tally current header } { These Headers should throw exceptions when TAbTarItem.LoadTarHeaderFromStream is called } end; { End of Link Flag parsing } end; { Rewind to the "The Beginning" of this Item } { Really that means to the first supported Header Type before a supported Item Type } if FoundItem then FStream.Seek(-(FCurrItemPreHdrs*AB_TAR_RECORDSIZE), soFromCurrent); Result := FoundItem; end; { Should only be used from LoadArchive, as it is slow. } function TAbTarStreamHelper.FindFirstItem: Boolean; begin FStream.Seek(0, soFromBeginning); Result := FindItem; end; { Should only be used from LoadArchive, as it is slow. } function TAbTarStreamHelper.FindNextItem: Boolean; begin { Fast Forward Past the current Item } FStream.Seek((FCurrItemPreHdrs*AB_TAR_RECORDSIZE + RoundToTarBlock(FCurrItemSize)), soFromCurrent); Result := FindItem; end; { This is slow, use the archive class instead } function TAbTarStreamHelper.GetItemCount : Integer; var Found : Boolean; begin Result := 0; Found := FindFirstItem; while Found do begin Inc(Result); Found := FindNextItem; end; end; procedure TAbTarStreamHelper.ReadHeader; begin { do nothing } { Tar archives have no overall header data } end; procedure TAbTarStreamHelper.ReadTail; begin { do nothing } { Tar archives have no overall tail data } end; { This is slow, use the archive class instead } function TAbTarStreamHelper.SeekItem(Index: Integer): Boolean; var i : Integer; begin Result := FindFirstItem; { see if can get to first item } i := 1; while Result and (i < Index) do begin Result := FindNextItem; Inc(i); end; end; procedure TAbTarStreamHelper.WriteArchiveHeader; begin { do nothing } { Tar archives have no overall header data } end; procedure TAbTarStreamHelper.WriteArchiveItem(AStream: TStream); begin WriteArchiveItemSize(AStream, AStream.Size); end; procedure TAbTarStreamHelper.WriteArchiveItemSize(AStream: TStream; Size: Int64); var PadBuff : PAnsiChar; PadSize : Integer; begin if Size = 0 then Exit; { transfer actual item data } FStream.CopyFrom(AStream, Size); { Pad to Next block } PadSize := RoundToTarBlock(Size) - Size; GetMem(PadBuff, PadSize); FillChar(PadBuff^, PadSize, #0); FStream.Write(PadBuff^, PadSize); FreeMem(PadBuff, PadSize); end; procedure TAbTarStreamHelper.WriteArchiveTail; var PadBuff : PAnsiChar; PadSize : Integer; begin { append 2 terminating null blocks } PadSize := AB_TAR_RECORDSIZE; GetMem(PadBuff, PadSize); try FillChar(PadBuff^, PadSize, #0); FStream.Write(PadBuff^, PadSize); FStream.Write(PadBuff^, PadSize); finally FreeMem(PadBuff, PadSize); end; end; { ***************************** TAbTarArchive ******************************** } constructor TAbTarArchive.CreateFromStream(aStream : TStream; const aArchiveName : string); begin inherited; FArchFormat := V7_FORMAT; // Default for new archives end; function TAbTarArchive.CreateItem(const SourceFileName : string; const ArchiveDirectory : string): TAbArchiveItem; var Item : TAbTarItem; I: Integer; FullSourceFileName, FullArchiveFileName: String; begin if FArchReadOnly then raise EAbTarBadOp.Create; { Create Item Unsupported in this Archive } MakeFullNames(SourceFileName, ArchiveDirectory, FullSourceFileName, FullArchiveFileName); Item := TAbTarItem.Create; try // HeaderFormat = (UNKNOWN_FORMAT, V7_FORMAT, OLDGNU_FORMAT, GNU_FORMAT, USTAR_FORMAT, STAR_FORMAT, POSIX_FORMAT); if FArchFormat in [OLDGNU_FORMAT, GNU_FORMAT] then begin Item.ArchiveFormat := FArchFormat; Item.LinkFlag := AB_TAR_LF_NORMAL; Item.Magic := AB_TAR_MAGIC_GNUOLD; end else if FArchFormat in [USTAR_FORMAT] then begin Item.ArchiveFormat := USTAR_FORMAT; Item.LinkFlag := AB_TAR_LF_NORMAL; Item.Magic := AB_TAR_MAGIC_VAL+AB_TAR_MAGIC_VER; end else if (FArchFormat = V7_FORMAT) and (Length(FullArchiveFileName) > 100) then begin { Switch the rep over to GNU so it can have long file names. } FArchFormat := OLDGNU_FORMAT; Item.ArchiveFormat := OLDGNU_FORMAT; { Leave the Defaults for LinkFlag, and Magic } { Update all the rest so that it can transistion to GNU_FORMAT } for I := 0 to FItemList.Count - 1 do TAbTarItem(FItemList.Items[i]).ArchiveFormat := OLDGNU_FORMAT; end;{ This should not execute... }{ else if FArchFormat in [STAR_FORMAT, POSIX_FORMAT] then begin Item.ArchiveFormat := FArchFormat; Item.LinkFlag := AB_TAR_LF_NORMAL; Item.Magic := AB_TAR_MAGIC_VAL+AB_TAR_MAGIC_VER; end; }{ else FArchFormat in [ UNKNOWN_FORMAT, V7_FORMAT and Length(S) <= 100 ] } { This is the default. } { Most others are initialized in the .Create } Item.CRC32 := 0; { Note this can raise exceptions for file name lengths. } Item.FileName := FullArchiveFileName; Item.DiskFileName := FullSourceFileName; Item.Action := aaNone; finally Result := Item; end; end; procedure TAbTarArchive.ExtractItemAt(Index: Integer; const UseName: string); var OutStream : TStream; CurItem : TAbTarItem; begin { Check the index is not out of range. } if(Index >= ItemList.Count) then raise EListError.CreateFmt(SListIndexError, [Index]); CurItem := TAbTarItem(ItemList[Index]); if CurItem.ItemType in [UNKNOWN_ITEM] then raise EAbTarBadOp.Create; { Unsupported Type, Cannot Extract } if (CurItem.ItemType = UNSUPPORTED_ITEM) and ((Length(CurItem.FileName) >= AB_TAR_NAMESIZE) or (Length(CurItem.LinkName) >= AB_TAR_NAMESIZE)) then raise EAbTarBadOp.Create; { Unsupported Type, Cannot Extract } { We will allow extractions if the file name/Link name are strickly less than 100 chars } if CurItem.IsDirectory then AbCreateDirectory(UseName) else begin case (CurItem.Mode and $F000) of AB_FMODE_FILE, AB_FMODE_FILE2: begin OutStream := TFileStreamEx.Create(UseName, fmCreate or fmShareDenyNone); try try {OutStream} ExtractItemToStreamAt(Index, OutStream); finally {OutStream} OutStream.Free; end; {OutStream} except if ExceptObject is EAbUserAbort then FStatus := asInvalid; mbDeleteFile(UseName); raise; end; end; AB_FMODE_FILELINK: begin AbCreateSymlink(CurItem.LinkName, UseName); end; end; end; AbSetFileTime(UseName, CurItem.LastModTimeAsDateTime); AbSetFileAttr(UseName, CurItem.NativeFileAttributes); end; procedure TAbTarArchive.ExtractItemToStreamAt(Index: Integer; aStream: TStream); var CurItem : TAbTarItem; begin if(Index >= ItemList.Count) then raise EListError.CreateFmt(SListIndexError, [Index]); CurItem := TAbTarItem(ItemList[Index]); if CurItem.ItemType in [UNKNOWN_ITEM] then raise EAbTarBadOp.Create; { Unsupported Type, Cannot Extract } if (CurItem.ItemType = UNSUPPORTED_ITEM) and ((Length(CurItem.FileName) >= AB_TAR_NAMESIZE) or (Length(CurItem.LinkName) >= AB_TAR_NAMESIZE)) then raise EAbTarBadOp.Create; { Unsupported Type, Cannot Extract } { We will allow extractions if the file name is strictly less than 100 chars } FStream.Position := CurItem.StreamPosition+CurItem.FileHeaderCount*AB_TAR_RECORDSIZE; if CurItem.UncompressedSize <> 0 then aStream.CopyFrom(FStream, CurItem.UncompressedSize); { Else there is nothing to copy. } end; procedure TAbTarArchive.LoadArchive; var TarHelp : TAbTarStreamHelper; Item : TAbTarItem; ItemFound : Boolean; Abort : Boolean; Confirm : Boolean; i : Integer; Progress : Byte; begin { create helper } TarHelp := TAbTarStreamHelper.Create(FStream); try {TarHelp} {build Items list from tar header records} { reset Tar } ItemFound := (FStream.Size > 0) and TarHelp.FindFirstItem; if ItemFound then FArchFormat := UNKNOWN_FORMAT else FArchFormat := V7_FORMAT; { while more data in Tar } while (FStream.Position < FStream.Size) and ItemFound do begin {create new Item} Item := TAbTarItem.Create; Item.FTarItem.StreamPosition := FStream.Position; try {Item} Item.LoadTarHeaderFromStream(FStream); if Item.ItemReadOnly then FArchReadOnly := True; { Set Archive as Read Only } if Item.ItemType in [SUPPORTED_ITEM, UNSUPPORTED_ITEM] then begin { List of supported Item/File Types. } { Add the New Supported Item to the List } if FArchFormat < Item.ArchiveFormat then FArchFormat := Item.ArchiveFormat; { Take the max format } Item.Action := aaNone; FItemList.Add(Item); end { end if } else begin { unhandled Tar file system entity, notify user, but otherwise ignore } if Assigned(FOnConfirmProcessItem) then FOnConfirmProcessItem(self, Item, ptFoundUnhandled, Confirm); end; { show progress and allow for aborting } Progress := (FStream.Position*100) div FStream.Size; DoArchiveProgress(Progress, Abort); if Abort then begin FStatus := asInvalid; raise EAbUserAbort.Create; end; { get the next item } ItemFound := TarHelp.FindNextItem; except {Item} raise EAbTarBadOp.Create; { Invalid Item } end; {Item} end; {end while } { All the items need to reflect this information. } for i := 0 to FItemList.Count - 1 do begin TAbTarItem(FItemList.Items[i]).ArchiveFormat := FArchFormat; TAbTarItem(FItemList.Items[i]).ItemReadOnly := FArchReadOnly; end; DoArchiveProgress(100, Abort); FIsDirty := False; finally {TarHelp} { Clean Up } TarHelp.Free; end; {TarHelp} end; function TAbTarArchive.FixName(const Value: string): string; { fixup filename for storage } var lValue : string; begin lValue := Value; {$IFDEF MSWINDOWS} if DOSMode then begin {Add the base directory to the filename before converting } {the file spec to the short filespec format. } if BaseDirectory <> '' then begin {Does the filename contain a drive or a leading backslash? } if not ((Pos(':', lValue) = 2) or (Pos(AbPathDelim, lValue) = 1)) then {If not, add the BaseDirectory to the filename.} lValue := BaseDirectory + AbPathDelim + lValue; end; lValue := AbGetShortFileSpec( lValue ); end; {$ENDIF MSWINDOWS} { Should always trip drive info if on a Win/Dos system } StoreOptions := StoreOptions + [soStripDrive]; { strip drive stuff } if soStripDrive in StoreOptions then AbStripDrive( lValue ); { check for a leading slash } if (Length(lValue) > 0) and (lValue[1] = AbPathDelim) then System.Delete( lValue, 1, 1 ); if soStripPath in StoreOptions then lValue := ExtractFileName(lValue); if soRemoveDots in StoreOptions then AbStripDots(lValue); AbFixName(lValue); Result := lValue; end; function TAbTarArchive.GetItem(Index: Integer): TAbTarItem; begin Result := TAbTarItem(FItemList.Items[Index]); end; function TAbTarArchive.GetSupportsEmptyFolders: Boolean; begin Result := True; end; procedure TAbTarArchive.PutItem(Index: Integer; const Value: TAbTarItem); begin //TODO: Remove this from all archives FItemList.Items[Index] := Value; end; procedure TAbTarArchive.SaveArchive; var OutTarHelp : TAbTarStreamHelper; Abort : Boolean; i : Integer; NewStream : TAbVirtualMemoryStream; TempStream : TStream; CurItem : TAbTarItem; AttrEx : TAbAttrExRec; begin if FArchReadOnly then raise EAbTarBadOp.Create; { Archive is read only } {init new archive stream} NewStream := TAbVirtualMemoryStream.Create; OutTarHelp := TAbTarStreamHelper.Create(NewStream); try {NewStream/OutTarHelp} { create helper } NewStream.SwapFileDirectory := AbGetTempDirectory; {build new archive from existing archive} for i := 0 to pred(Count) do begin FCurrentItem := ItemList[i]; CurItem := TAbTarItem(ItemList[i]); case CurItem.Action of aaNone, aaMove : begin {just copy the file to new stream} { "Seek" to the Item Data } { SaveTarHeaders, Updates FileHeaderCount } FStream.Position := CurItem.StreamPosition+CurItem.FileHeaderCount*AB_TAR_RECORDSIZE; CurItem.StreamPosition := NewStream.Position;{ Reset the Stream Pointer. } { Flush The Headers to the new stream } CurItem.SaveTarHeaderToStream(NewStream); { Copy to new Stream, Round to the AB_TAR_RECORDSIZE boundry, and Pad zeros} outTarhelp.WriteArchiveItemSize(FStream, CurItem.UncompressedSize); end; aaDelete: {doing nothing omits file from new stream} ; aaStreamAdd : begin try { adding from a stream } CurItem.StreamPosition := NewStream.Position;{ Reset the Stream Pointer. } CurItem.UncompressedSize := InStream.Size; CurItem.SaveTarHeaderToStream(NewStream); OutTarHelp.WriteArchiveItemSize(InStream, InStream.Size); except ItemList[i].Action := aaDelete; DoProcessItemFailure(ItemList[i], ptAdd, ecFileOpenError, 0); end; end; aaAdd, aaFreshen, aaReplace: begin try { update metadata } if not AbFileGetAttrEx(CurItem.DiskFileName, AttrEx, False) then Raise EAbFileNotFound.Create; CurItem.ExternalFileAttributes := AttrEx.Mode; CurItem.LastModTimeAsDateTime := AttrEx.Time; { TODO: uid, gid, uname, gname should be added here } { TODO: Add support for different types of files here } case (AttrEx.Mode and $F000) of AB_FMODE_DIR: begin CurItem.UncompressedSize := 0; CurItem.SaveTarHeaderToStream(NewStream); end; AB_FMODE_FILELINK: begin CurItem.UncompressedSize := 0; CurItem.LinkName := AbReadSymlink(CurItem.DiskFileName); CurItem.SaveTarHeaderToStream(NewStream); end; AB_FMODE_FILE, AB_FMODE_FILE2: begin TempStream := TFileStreamEx.Create(CurItem.DiskFileName, fmOpenRead or fmShareDenyWrite ); try { TempStream } CurItem.UncompressedSize := TempStream.Size; CurItem.StreamPosition := NewStream.Position;{ Reset the Stream Pointer. } CurItem.SaveTarHeaderToStream(NewStream); OutTarHelp.WriteArchiveItemSize(TempStream, TempStream.Size); finally { TempStream } TempStream.Free; end; { TempStream } end; else begin CurItem.UncompressedSize := AttrEx.Size; CurItem.SaveTarHeaderToStream(NewStream); end; end; except ItemList[i].Action := aaDelete; DoProcessItemFailure(ItemList[i], ptAdd, ecFileOpenError, 0); end; end; { aaAdd ... } end; { case } end; { for i ... } if NewStream.Size <> 0 then OutTarHelp.WriteArchiveTail; { Terminate the TAR } { Size of NewStream is still 0, and max of the stream will also be 0 } {copy new stream to FStream} NewStream.Position := 0; if (FStream is TMemoryStream) then TMemoryStream(FStream).LoadFromStream(NewStream) else if (FStream is TAbVirtualMemoryStream) then begin FStream.Position := 0; FStream.Size := 0; TAbVirtualMemoryStream(FStream).CopyFrom(NewStream, NewStream.Size) end else begin { need new stream to write } FreeAndNil(FStream); FStream := TFileStreamEx.Create(FArchiveName, fmCreate or fmShareDenyWrite); FStream.CopyFrom(NewStream, NewStream.Size); end; {update Items list} for i := pred( Count ) downto 0 do begin if ItemList[i].Action = aaDelete then FItemList.Delete( i ) else if ItemList[i].Action <> aaFailed then ItemList[i].Action := aaNone; end; DoArchiveSaveProgress( 100, Abort ); DoArchiveProgress( 100, Abort ); finally {NewStream/OutTarHelp} OutTarHelp.Free; NewStream.Free; end; end; { This assumes that LoadArchive has been called. } procedure TAbTarArchive.TestItemAt(Index: Integer); begin FStream.Position := TAbTarItem(FItemList[Index]).StreamPosition; if VerifyTar(FStream) <> atTar then raise EAbTarInvalid.Create; { Invalid Tar } end; end. ����������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abbase.pas������������������������������������������������0000644�0001750�0001750�00000003470�12014201074�021456� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbBase.pas *} {*********************************************************} {* ABBREVIA: Base component class *} {*********************************************************} unit AbBase; {$I AbDefine.inc} interface uses Classes; type TAbBaseComponent = class(TComponent) protected {methods} function GetVersion : string; procedure SetVersion(const Value : string); protected {properties} property Version : string read GetVersion write SetVersion stored False; end; implementation uses AbConst; { -------------------------------------------------------------------------- } function TAbBaseComponent.GetVersion : string; begin Result := AbVersionS; end; { -------------------------------------------------------------------------- } procedure TAbBaseComponent.SetVersion(const Value : string); begin {NOP} end; end. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abconst.pas�����������������������������������������������0000644�0001750�0001750�00000017473�12014201074�021702� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* Abbrevia: AbConst.pas *} {*********************************************************} {* Abbrevia: Constants *} {*********************************************************} unit AbConst; {$I AbDefine.inc} interface const AbVersion = 5.0; AbVersionS = '5.0'; Ab_MessageLen = 255; Ab_CaptionLen = 80; AB_ZIPPATHDELIM = '/'; const AbZipVersionNeeded = 1; AbUnknownCompressionMethod = 2; AbNoExtractionMethod = 3; AbInvalidPassword = 4; AbNoInsertionMethod = 5; AbInvalidFactor = 6; AbDuplicateName = 7; AbUnsupportedCompressionMethod = 8; AbUserAbort = 9; AbArchiveBusy = 10; AbBadSpanStream = 11; AbNoOverwriteSpanStream = 12; AbNoSpannedSelfExtract = 13; AbStreamFull = 14; AbNoSuchDirectory = 15; AbInflateBlockError = 16; AbBadStreamType = 17; AbTruncateError = 18; AbZipBadCRC = 19; AbZipBadStub = 20; AbFileNotFound = 21; AbInvalidLFH = 22; AbNoArchive = 23; AbErrZipInvalid = 24; AbReadError = 25; AbInvalidIndex = 26; AbInvalidThreshold = 27; AbUnhandledFileType = 28; AbSpanningNotSupported = 29; AbBBSReadTooManyBytes = 40; AbBBSSeekOutsideBuffer = 41; AbBBSInvalidOrigin = 42; AbBBSWriteTooManyBytes = 43; AbNoCabinetDllError = 50; AbFCIFileOpenError = 51; AbFCIFileReadError = 52; AbFCIFileWriteError = 53; AbFCIFileCloseError = 54; AbFCIFileSeekError = 55; AbFCIFileDeleteError = 56; AbFCIAddFileError = 57; AbFCICreateError = 58; AbFCIFlushCabinetError = 59; AbFCIFlushFolderError = 60; AbFDICopyError = 61; AbFDICreateError = 62; AbInvalidCabTemplate = 63; AbInvalidCabFile = 64; AbSWSNotEndofStream = 80; AbSWSSeekFailed = 81; AbSWSWriteFailed = 82; AbSWSInvalidOrigin = 83; AbSWSInvalidNewOrigin = 84; AbVMSReadTooManyBytes = 100; AbVMSInvalidOrigin = 101; AbVMSErrorOpenSwap = 102; AbVMSSeekFail = 103; AbVMSReadFail = 104; AbVMSWriteFail = 105; AbVMSWriteTooManyBytes = 106; AbGZipInvalid = 200; AbGzipBadCRC = 201; AbGzipBadFileSize = 202; AbTarInvalid = 220; AbTarBadFileName = 221; AbTarBadLinkName = 222; AbTarBadOp = 223; function AbStrRes(Index : Integer) : string; implementation uses AbResString; type AbStrRec = record ID: Integer; Str: string; end; const AbStrArray : array [0..66] of AbStrRec = ( (ID: AbZipVersionNeeded; Str: AbZipVersionNeededS), (ID: AbUnknownCompressionMethod; Str: AbUnknownCompressionMethodS), (ID: AbNoExtractionMethod; Str: AbNoExtractionMethodS), (ID: AbInvalidPassword; Str: AbInvalidPasswordS), (ID: AbNoInsertionMethod; Str: AbNoInsertionMethodS), (ID: AbInvalidFactor; Str: AbInvalidFactorS), (ID: AbDuplicateName; Str: AbDuplicateNameS), (ID: AbUnsupportedCompressionMethod; Str: AbUnsupportedCompressionMethodS), (ID: AbUserAbort; Str: AbUserAbortS), (ID: AbArchiveBusy; Str: AbArchiveBusyS), (ID: AbBadSpanStream; Str: AbBadSpanStreamS), (ID: AbNoOverwriteSpanStream; Str: AbNoOverwriteSpanStreamS), (ID: AbNoSpannedSelfExtract; Str: AbNoSpannedSelfExtractS), (ID: AbStreamFull; Str: AbStreamFullS), (ID: AbNoSuchDirectory; Str: AbNoSuchDirectoryS), (ID: AbInflateBlockError; Str: AbInflateBlockErrorS), (ID: AbBadStreamType; Str: AbBadStreamTypeS), (ID: AbTruncateError; Str: AbTruncateErrorS), (ID: AbZipBadCRC; Str: AbZipBadCRCS), (ID: AbZipBadStub; Str: AbZipBadStubS), (ID: AbFileNotFound; Str: AbFileNotFoundS), (ID: AbInvalidLFH; Str: AbInvalidLFHS), (ID: AbNoArchive; Str: AbNoArchiveS), (ID: AbErrZipInvalid; Str: AbErrZipInvalidS), (ID: AbReadError; Str: AbReadErrorS), (ID: AbInvalidIndex; Str: AbInvalidIndexS), (ID: AbInvalidThreshold; Str: AbInvalidThresholdS), (ID: AbUnhandledFileType; Str: AbUnhandledFileTypeS), (ID: AbSpanningNotSupported; Str: AbSpanningNotSupportedS), (ID: AbBBSReadTooManyBytes; Str: AbBBSReadTooManyBytesS), (ID: AbBBSSeekOutsideBuffer; Str: AbBBSSeekOutsideBufferS), (ID: AbBBSInvalidOrigin; Str: AbBBSInvalidOriginS), (ID: AbBBSWriteTooManyBytes; Str: AbBBSWriteTooManyBytesS), (ID: AbNoCabinetDllError; Str: AbNoCabinetDllErrorS), (ID: AbFCIFileOpenError; Str: AbFCIFileOpenErrorS), (ID: AbFCIFileReadError; Str: AbFCIFileReadErrorS), (ID: AbFCIFileWriteError; Str: AbFCIFileWriteErrorS), (ID: AbFCIFileCloseError; Str: AbFCIFileCloseErrorS), (ID: AbFCIFileSeekError; Str: AbFCIFileSeekErrorS), (ID: AbFCIFileDeleteError; Str: AbFCIFileDeleteErrorS), (ID: AbFCIAddFileError; Str: AbFCIAddFileErrorS), (ID: AbFCICreateError; Str: AbFCICreateErrorS), (ID: AbFCIFlushCabinetError; Str: AbFCIFlushCabinetErrorS), (ID: AbFCIFlushFolderError; Str: AbFCIFlushFolderErrorS), (ID: AbFDICopyError; Str: AbFDICopyErrorS), (ID: AbFDICreateError; Str: AbFDICreateErrorS), (ID: AbInvalidCabTemplate; Str: AbInvalidCabTemplateS), (ID: AbInvalidCabFile; Str: AbInvalidCabFileS), (ID: AbSWSNotEndofStream; Str: AbSWSNotEndofStreamS), (ID: AbSWSSeekFailed; Str: AbSWSSeekFailedS), (ID: AbSWSWriteFailed; Str: AbSWSWriteFailedS), (ID: AbSWSInvalidOrigin; Str: AbSWSInvalidOriginS), (ID: AbSWSInvalidNewOrigin; Str: AbSWSInvalidNewOriginS), (ID: AbVMSReadTooManyBytes; Str: AbVMSReadTooManyBytesS), (ID: AbVMSInvalidOrigin; Str: AbVMSInvalidOriginS), (ID: AbVMSErrorOpenSwap; Str: AbVMSErrorOpenSwapS), (ID: AbVMSSeekFail; Str: AbVMSSeekFailS), (ID: AbVMSReadFail; Str: AbVMSReadFailS), (ID: AbVMSWriteFail; Str: AbVMSWriteFailS), (ID: AbVMSWriteTooManyBytes; Str: AbVMSWriteTooManyBytesS), (ID: AbGzipInvalid; Str: AbGzipInvalidS), (ID: AbGzipBadCRC; Str: AbGzipBadCRCS), (ID: AbGzipBadFileSize; Str: AbGzipBadFileSizeS), (ID: AbTarInvalid; Str: AbTarInvalidS), (ID: AbTarBadFileName; Str: AbTarBadFileNameS), (ID: AbTarBadLinkName; Str: AbTarBadLinkNameS), (ID: AbTarBadOp; Str: AbTarBadOpS) ); function AbStrRes(Index : Integer) : string; var i : Integer; begin for i := Low(AbStrArray) to High(AbStrArray) do if AbStrArray[i].ID = Index then Result := AbStrArray[i].Str; end; end. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abdfbase.pas����������������������������������������������0000644�0001750�0001750�00000056315�12014201074�021776� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbDfBase.pas *} {*********************************************************} {* Deflate base unit *} {*********************************************************} unit AbDfBase; {$I AbDefine.inc} interface uses SysUtils, Classes; type PAbDfLongintList = ^TAbDfLongintList; TAbDfLongintList = array [0..pred(MaxInt div sizeof(longint))] of longint; const dfc_CodeLenCodeLength = 7; dfc_LitDistCodeLength = 15; dfc_MaxCodeLength = 15; const dfc_MaxMatchLen = 258; {lengths are 3..258 for deflate} dfc_MaxMatchLen64 = 64 * 1024; {lengths are 3..65536 for deflate64} const dfc_LitExtraOffset = 257; dfc_LitExtraBits : array [0..30] of byte = (0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 16, 99, 99); { note: the last two are required to avoid going beyond the end} { of the array when generating static trees} dfc_DistExtraOffset = 0; dfc_DistExtraBits : array [0..31] of byte = (0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14); { note: the last two are only use for deflate64} dfc_LengthBase : array [0..28] of word = (3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 3); { note: the final 3 is correct for deflate64; for symbol 285,} { lengths are stored as (length - 3)} { for deflate it's very wrong, but there's special code in} { the (de)compression code to cater for this} dfc_DistanceBase : array [0..31] of word = (1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 32769, 49153); dfc_CodeLengthIndex : array [0..18] of byte = (16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15); const dfc_CanUseStored = $01; dfc_CanUseStatic = $02; dfc_CanUseDynamic = $04; dfc_UseLazyMatch = $08; dfc_UseDeflate64 = $10; dfc_UseAdler32 = $20; dfc_CanUseHuffman = dfc_CanUseStatic or dfc_CanUseDynamic; dfc_TestOnly = $40000000; type TAbProgressStep = procedure (aPercentDone : integer) of object; {-progress metering of deflate/inflate; abort with AbortProgress} TAbDeflateHelper = class private FAmpleLength : longint; FChainLength : longint; FLogFile : string; FMaxLazy : longint; FOnProgressStep : TAbProgressStep; FOptions : longint; FPartSize : Int64; FSizeCompressed : Int64; FSizeNormal : Int64; FStreamSize : Int64; FWindowSize : longint; FZipOption : AnsiChar; protected procedure dhSetAmpleLength(aValue : longint); procedure dhSetChainLength(aValue : longint); procedure dhSetLogFile(const aValue : string); procedure dhSetMaxLazy(aValue : longint); procedure dhSetOnProgressStep(aValue : TAbProgressStep); procedure dhSetOptions(aValue : longint); procedure dhSetWindowSize(aValue : longint); procedure dhSetZipOption(aValue : AnsiChar); public constructor Create; procedure Assign(aHelper : TAbDeflateHelper); property AmpleLength : longint read FAmpleLength write dhSetAmpleLength; property ChainLength : longint read FChainLength write dhSetChainLength; property LogFile : string read FLogFile write dhSetLogFile; property MaxLazyLength : longint read FMaxLazy write dhSetMaxLazy; property Options : longint read FOptions write dhSetOptions; property PartialSize : Int64 read FPartSize write FPartSize; property PKZipOption : AnsiChar read FZipOption write dhSetZipOption; property StreamSize : Int64 read FStreamSize write FStreamSize; property WindowSize : longint read FWindowSize write dhSetWindowSize; property CompressedSize : Int64 read FSizeCompressed write FSizeCompressed; property NormalSize : Int64 read FSizeNormal write FSizeNormal; property OnProgressStep : TAbProgressStep read FOnProgressStep write dhSetOnProgressStep; end; type TAbLineDelimiter = (ldCRLF, ldLF); TAbLogger = class(TStream) private FBuffer : PAnsiChar; FCurPos : PAnsiChar; FLineDelim : TAbLineDelimiter; FStream : TFileStream; protected function logWriteBuffer : boolean; public constructor Create(const aLogName : string); destructor Destroy; override; function Read(var Buffer; Count : longint) : longint; override; function Seek(const Offset : Int64; Origin : TSeekOrigin) : Int64; override; function Write(const Buffer; Count : longint) : longint; override; procedure WriteLine(const S : string); procedure WriteStr(const S : string); property LineDelimiter : TAbLineDelimiter read FLineDelim write FLineDelim; end; type TAbNodeManager = class private FFreeList : pointer; FNodeSize : cardinal; FNodesPerPage : cardinal; FPageHead : pointer; FPageSize : cardinal; protected function nmAllocNewPage : pointer; public constructor Create(aNodeSize : cardinal); destructor Destroy; override; function AllocNode : pointer; function AllocNodeClear : pointer; procedure FreeNode(aNode : pointer); end; {---exception classes---} type EAbAbortProgress = class(Exception); EAbPartSizedInflate = class(Exception); EAbInflatePasswordError = class(Exception); EAbInternalInflateError = class(Exception); EAbInflateError = class(Exception) public constructor Create(const aMsg : string); constructor CreateUnknown(const aMsg : string; const aErrorMsg : string); end; EAbInternalDeflateError = class(Exception); EAbDeflateError = class(Exception) public constructor Create(const aMsg : string); constructor CreateUnknown(const aMsg : string; const aErrorMsg : string); end; {---aborting a process---} procedure AbortProgress; {---calculation of checksums---} procedure AbUpdateAdlerBuffer(var aAdler : longint; var aBuffer; aCount : integer); procedure AbUpdateCRCBuffer(var aCRC : longint; var aBuffer; aCount : integer); implementation uses AbUtils; {===TAbDeflateHelper=================================================} constructor TAbDeflateHelper.Create; begin inherited Create; FAmpleLength := 8; FChainLength := 32; {FLogFile := '';} FMaxLazy := 16; {FOnProgressStep := nil;} FOptions := $F; {FStreamSize := 0;} FWindowSize := 32 * 1024; FZipOption := 'n'; end; {--------} procedure TAbDeflateHelper.Assign(aHelper : TAbDeflateHelper); begin FAmpleLength := aHelper.FAmpleLength; FChainLength := aHelper.FChainLength; FLogFile := aHelper.FLogFile; FMaxLazy := aHelper.FMaxLazy; FOnProgressStep := aHelper.FOnProgressStep; FOptions := aHelper.FOptions; FPartSize := aHelper.FPartSize; FStreamSize := aHelper.FStreamSize; FWindowSize := aHelper.FWindowSize; FZipOption := aHelper.FZipOption; end; {--------} procedure TAbDeflateHelper.dhSetAmpleLength(aValue : longint); begin if (aValue <> AmpleLength) then begin if (aValue <> -1) and (aValue < 4) then aValue := 4; FAmpleLength := aValue; FZipOption := '?'; end; end; {--------} procedure TAbDeflateHelper.dhSetChainLength(aValue : longint); begin if (aValue <> ChainLength) then begin if (aValue <> -1) and (aValue < 4) then aValue := 4; FChainLength := aValue; FZipOption := '?'; end; end; {--------} procedure TAbDeflateHelper.dhSetLogFile(const aValue : string); begin FLogFile := aValue; end; {--------} procedure TAbDeflateHelper.dhSetMaxLazy(aValue : longint); begin if (aValue <> MaxLazyLength) then begin if (aValue <> -1) and (aValue < 4) then aValue := 4; FMaxLazy := aValue; FZipOption := '?'; end; end; {--------} procedure TAbDeflateHelper.dhSetOnProgressStep(aValue : TAbProgressStep); begin FOnProgressStep := aValue; end; {--------} procedure TAbDeflateHelper.dhSetOptions(aValue : longint); begin if (aValue <> Options) then begin FOptions := aValue; FZipOption := '?'; end; end; {--------} procedure TAbDeflateHelper.dhSetWindowSize(aValue : longint); var NewValue : longint; begin if (aValue <> WindowSize) then begin {calculate the window size rounded to nearest 1024 bytes} NewValue := ((aValue + 1023) div 1024) * 1024; {if the new window size is greater than 32KB...} if (NewValue > 32 * 1024) then {if the Deflate64 option is set, force to 64KB} if ((Options and dfc_UseDeflate64) <> 0) then NewValue := 64 * 1024 {otherwise, force to 32KB} else NewValue := 32 * 1024; {set the new window size} FWindowSize := NewValue; end; end; {--------} procedure TAbDeflateHelper.dhSetZipOption(aValue : AnsiChar); begin {notes: The original Abbrevia code used the following table for setting the equivalent values: Good Lazy Chain UseLazy Option 4 4 4 N s ^ 4 5 8 N | 4 6 32 N f faster 4 4 16 Y slower 8 16 32 Y n | 8 16 128 Y | 8 32 256 Y | 32 128 1024 Y | 32 258 4096 Y x V The new Abbrevia 3 code follows these values to a certain extent. } {force to lower case} if ('A' <= aValue) and (aValue <= 'Z') then aValue := AnsiChar(ord(aValue) + ord('a') - ord('A')); {if the value has changed...} if (aValue <> PKZipOption) then begin {switch on the new value...} case aValue of '0' : {no compression} begin FZipOption := aValue; FOptions := (FOptions and (not $0F)) or dfc_CanUseStored; FAmpleLength := 8; { not actually needed} FChainLength := 32; { not actually needed} FMaxLazy := 16; { not actually needed} end; '2' : {hidden option: Abbrevia 2 compatibility} begin FZipOption := aValue; FOptions := FOptions or $0F; FAmpleLength := 8; FChainLength := 32; FMaxLazy := 16; end; 'f' : {fast compression} begin FZipOption := aValue; FOptions := FOptions or $07; { no lazy matching} FAmpleLength := 4; FChainLength := 32; FMaxLazy := 6; end; 'n' : {normal compression} begin FZipOption := aValue; FOptions := FOptions or $0F; FAmpleLength := 16; FChainLength := 32; FMaxLazy := 24; end; 's' : {super fast compression} begin FZipOption := aValue; FOptions := FOptions or $07; { no lazy matching} FAmpleLength := 4; FChainLength := 4; FMaxLazy := 4; end; 'x' : {maximum compression} begin FZipOption := aValue; FOptions := FOptions or $0F; FAmpleLength := 64;{32;} FChainLength := 4096; FMaxLazy := 258; end; end; end; end; {====================================================================} {===TAbLogger========================================================} const LogBufferSize = 4096; {--------} constructor TAbLogger.Create(const aLogName : string); begin Assert(aLogName <> '', 'TAbLogger.Create: a filename must be provided for the logger'); {create the ancestor} inherited Create; {set the default line terminator} {$IFDEF MSWINDOWS} FLineDelim := ldCRLF; {$ENDIF} {$IFDEF UNIX} FLineDelim := ldLF; {$ENDIF} {create and initialize the buffer} GetMem(FBuffer, LogBufferSize); FCurPos := FBuffer; {create the log file} FStream := TFileStream.Create(aLogName, fmCreate); end; {--------} destructor TAbLogger.Destroy; begin {if there is a buffer ensure that it is flushed before freeing it} if (FBuffer <> nil) then begin if (FCurPos <> FBuffer) then logWriteBuffer; FreeMem(FBuffer, LogBufferSize); end; {free the stream} FStream.Free; {destroy the ancestor} inherited Destroy; end; {--------} function TAbLogger.logWriteBuffer : boolean; var BytesToWrite : longint; BytesWritten : longint; begin BytesToWrite := FCurPos - FBuffer; BytesWritten := FStream.Write(FBuffer^, BytesToWrite); if (BytesWritten = BytesToWrite) then begin Result := true; FCurPos := FBuffer; end else begin Result := false; if (BytesWritten <> 0) then begin Move(FBuffer[BytesWritten], FBuffer^, BytesToWrite - BytesWritten); FCurPos := FBuffer + (BytesToWrite - BytesWritten); end; end; end; {--------} function TAbLogger.Read(var Buffer; Count : longint) : longint; begin Assert(false, 'TAbLogger.Read: loggers are write-only, no reading allowed'); Result := 0; end; {--------} function TAbLogger.Seek(const Offset : Int64; Origin : TSeekOrigin) : Int64; begin case Origin of soBeginning : begin end; soCurrent : if (Offset = 0) then begin Result := FStream.Position + (FCurPos - FBuffer); Exit; end; soEnd : if (Offset = 0) then begin Result := FStream.Position + (FCurPos - FBuffer); Exit; end; end; Assert(false, 'TAbLogger.Seek: loggers are write-only, no seeking allowed'); Result := 0; end; {--------} function TAbLogger.Write(const Buffer; Count : longint) : longint; var UserBuf : PAnsiChar; BytesToGo : longint; BytesToWrite : longint; begin {reference the user's buffer as a PChar} UserBuf := @Buffer; {start the counter for the number of bytes written} Result := 0; {if needed, empty the internal buffer into the underlying stream} if (LogBufferSize = FCurPos - FBuffer) then if not logWriteBuffer then Exit; {calculate the number of bytes to copy this time from the user's buffer to the internal buffer} BytesToGo := Count; BytesToWrite := LogBufferSize - (FCurPos - FBuffer); if (BytesToWrite > BytesToGo) then BytesToWrite := BytesToGo; {copy the bytes} Move(UserBuf^, FCurPos^, BytesToWrite); {adjust the counters} inc(FCurPos, BytesToWrite); dec(BytesToGo, BytesToWrite); inc(Result, BytesToWrite); {while there are still more bytes to copy, do so} while (BytesToGo <> 0) do begin {advance the user's buffer} inc(UserBuf, BytesToWrite); {empty the internal buffer into the underlying stream} if not logWriteBuffer then Exit; {calculate the number of bytes to copy this time from the user's buffer to the internal buffer} BytesToWrite := LogBufferSize; if (BytesToWrite > BytesToGo) then BytesToWrite := BytesToGo; {copy the bytes} Move(UserBuf^, FCurPos^, BytesToWrite); {adjust the counters} inc(FCurPos, BytesToWrite); dec(BytesToGo, BytesToWrite); inc(Result, BytesToWrite); end; end; {--------} procedure TAbLogger.WriteLine(const S : string); const cLF : AnsiChar = ^J; cCRLF : array [0..1] of AnsiChar = ^M^J; begin if (length(S) > 0) then Write(S[1], length(S)); case FLineDelim of ldLF : Write(cLF, sizeof(cLF)); ldCRLF : Write(cCRLF, sizeof(cCRLF)); end; end; {--------} procedure TAbLogger.WriteStr(const S : string); begin if (length(S) > 0) then Write(S[1], length(S)); end; {====================================================================} {===Calculate checksums==============================================} procedure AbUpdateAdlerBuffer(var aAdler : longint; var aBuffer; aCount : integer); var S1 : LongWord; S2 : LongWord; i : integer; Buffer : PAnsiChar; BytesToUse : integer; begin {Note: this algorithm will *only* work if the buffer is 4KB or less, which is why we go to such lengths to chop up the user buffer into usable chunks of 4KB. However, for Delphi 3 there is no proper 32-bit longword. Although the additions pose no problems in this situation, the mod operations below (especially for S2) will be signed integer divisions, producing an (invalid) signed result. In this case, the buffer is chopped up into 2KB chunks to avoid any signed problems.} {split the current Adler checksum into its halves} S1 := LongWord(aAdler) and $FFFF; S2 := LongWord(aAdler) shr 16; {reference the user buffer as a PChar: it makes it easier} Buffer := @aBuffer; {while there's still data to checksum...} while (aCount <> 0) do begin {calculate the number of bytes to checksum this time} {$IFDEF HasLongWord} BytesToUse := 4096; {$ELSE} BytesToUse := 2048; {$ENDIF} if (BytesToUse > aCount) then BytesToUse := aCount; {checksum the bytes} for i := 0 to pred(BytesToUse) do begin inc(S1, ord(Buffer^)); inc(S2, S1); inc(Buffer); end; {recalibrate the Adler checksum halves} S1 := S1 mod 65521; S2 := S2 mod 65521; {calculate the number of bytes still to go} dec(aCount, BytesToUse); end; {join the halves to produce the complete Adler checksum} aAdler := longint((S2 shl 16) or S1); end; {--------} procedure AbUpdateCRCBuffer(var aCRC : longint; var aBuffer; aCount : integer); var i : integer; CRC : LongWord; Buffer : PAnsiChar; begin {$R-}{$Q-} {reference the user buffer as a PChar: it makes it easier} Buffer := @aBuffer; {get the current CRC as a local variable, it's faster} CRC := aCRC; {checksum the bytes in the buffer} for i := 0 to pred(aCount) do begin CRC := AbCrc32Table[byte(CRC) xor byte(Buffer^)] xor (CRC shr 8); inc(Buffer); end; {return the new CRC} aCRC := CRC; {$R+}{$Q+} end; {====================================================================} {===EAbInflateError==================================================} constructor EAbInflateError.Create(const aMsg : string); begin inherited Create( 'Abbrevia inflate error, possibly a corrupted compressed stream. ' + '(Internal cause: ' + aMsg + ')'); end; {--------} constructor EAbInflateError.CreateUnknown(const aMsg : string; const aErrorMsg : string); begin inherited Create(aMsg + ': ' + aErrorMsg); end; {====================================================================} {===EAbDeflateError==================================================} constructor EAbDeflateError.Create(const aMsg : string); begin inherited Create( 'Abbrevia deflate error. ' + '(Internal cause: ' + aMsg + ')'); end; {--------} constructor EAbDeflateError.CreateUnknown(const aMsg : string; const aErrorMsg : string); begin inherited Create(aMsg + ': ' + aErrorMsg); end; {====================================================================} {===Node manager=====================================================} const PageSize = 8 * 1024; type PGenericNode = ^TGenericNode; TGenericNode = packed record gnNext : PGenericNode; gnData : record end; end; {--------} constructor TAbNodeManager.Create(aNodeSize : cardinal); const Gran = sizeof(pointer); Mask = not (Gran - 1); begin {create the ancestor} inherited Create; {save the node size rounded to nearest 4 bytes} if (aNodeSize <= sizeof(pointer)) then aNodeSize := sizeof(pointer) else aNodeSize := (aNodeSize + Gran - 1) and Mask; FNodeSize := aNodeSize; {calculate the page size (default 1024 bytes) and the number of nodes per page; if the default page size is not large enough for two or more nodes, force a single node per page} FNodesPerPage := (PageSize - sizeof(pointer)) div aNodeSize; if (FNodesPerPage > 1) then FPageSize := PageSize else begin FNodesPerPage := 1; FPagesize := aNodeSize + sizeof(pointer); end; end; {--------} destructor TAbNodeManager.Destroy; var Temp : pointer; begin {dispose of all the pages, if there are any} while (FPageHead <> nil) do begin Temp := PGenericNode(FPageHead)^.gnNext; FreeMem(FPageHead, FPageSize); FPageHead := Temp; end; {destroy the ancestor} inherited Destroy; end; {--------} function TAbNodeManager.AllocNode : pointer; begin Result := FFreeList; if (Result = nil) then Result := nmAllocNewPage else FFreeList := PGenericNode(Result)^.gnNext; end; {--------} function TAbNodeManager.AllocNodeClear : pointer; begin Result := FFreeList; if (Result = nil) then Result := nmAllocNewPage else FFreeList := PGenericNode(Result)^.gnNext; FillChar(Result^, FNodeSize, 0); end; {--------} procedure TAbNodeManager.FreeNode(aNode : pointer); begin {add the node (if non-nil) to the top of the free list} if (aNode <> nil) then begin PGenericNode(aNode)^.gnNext := FFreeList; FFreeList := aNode; end; end; {--------} function TAbNodeManager.nmAllocNewPage : pointer; var NewPage : PAnsiChar; i : integer; FreeList : pointer; NodeSize : integer; begin {allocate a new page and add it to the front of the page list} GetMem(NewPage, FPageSize); PGenericNode(NewPage)^.gnNext := FPageHead; FPageHead := NewPage; {now split up the new page into nodes and push them all onto the free list; note that the first 4 bytes of the page is a pointer to the next page, so remember to skip over it} inc(NewPage, sizeof(pointer)); FreeList := FFreeList; NodeSize := FNodeSize; for i := 0 to pred(FNodesPerPage) do begin PGenericNode(NewPage)^.gnNext := FreeList; FreeList := NewPage; inc(NewPage, NodeSize); end; {return the top of the list} Result := FreeList; FFreeList := PGenericNode(Result)^.gnNext; end; {====================================================================} {====================================================================} procedure AbortProgress; begin raise EAbAbortProgress.Create('Abort'); end; {====================================================================} end. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abdefine.inc����������������������������������������������0000644�0001750�0001750�00000021174�12014201074�021765� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbDefine.inc *} {*********************************************************} {* ABBREVIA: Compiler options/directives include file *} {*********************************************************} {NOTE: ABDEFINE.INC is included in all ABBREVIA units; hence you can specify global compiler options here. ABDEFINE.INC is included *before* each unit's own required compiler options, so options specified here could be overridden by hardcoded options in the unit source file.} {====Compiler options that can be changed====} {$A+ Force alignment on word/dword boundaries} {$S- No stack checking} {---Global compiler defines for 32-bit OS's---} {====Global fixed compiler options (do NOT change)====} {$B- Incomplete boolean evaluation} {$H+ Long string support} {$P- No open string parameters} {$Q- Arithmetic overflow checking} {!! - Needs to be turned on!} {$R- Range checking} {!! - Needs to be turned on!} {$T+ No type-checked pointers} {$V- No var string checking} {$X+ Extended syntax} {$Z1 Enumerations are byte sized} {====Platform defines================================================} { map Delphi platform defines to FreePascal's (MSWINDOWS/UNIX/LINUX/DARWIN) } {$IFNDEF FPC} {$IF DEFINED(LINUX) AND (CompilerVersion < 15)} {$DEFINE KYLIX} {$DEFINE UNIX} {$IFEND} {$IFDEF MACOS} {$DEFINE DARWIN} {$ENDIF} {$IFDEF POSIX} {$DEFINE UNIX} {$ENDIF} {$ENDIF} { Unix API (Kylix/Delphi/FreePascal) } {$IFDEF UNIX} {$IF DEFINED(FPC)} {$DEFINE FPCUnixAPI} {$ELSEIF DEFINED(KYLIX)} {$DEFINE LibcAPI} {$ELSE} {$DEFINE PosixAPI} {$IFEND} {$ENDIF} {$IFDEF FPC} {$MODE DELPHI} {$PACKRECORDS C} {$ENDIF} {Activate this define to show CLX/LCL dialogs for spanning media requests. The default behavior will abort the operation instead. This define is only safe when using Abbrevia from the foreground thread. If using it from a background thread override OnRequestLastDisk, OnRequestNthDisk, and OnRequestBlankDisk and synchronize to the foreground yourself. The Windows version always MessageBox so it's thread-safe.} {.$DEFINE UnixDialogs} {====RTL defines=====================================================} {$IFNDEF FPC} {$IF RTLVersion >= 18} // Delphi 2006 {$DEFINE HasAdvancedRecords} {$IFEND} {$IF RTLVersion >= 20} // Delphi 2009 {$DEFINE HasThreadFinished} {$IFEND} {$IF RTLVersion >= 21} // Delphi 2010 {$DEFINE HasThreadStart} {$IFEND} {$IF RTLVersion >= 23} // Delphi XE2 {$DEFINE HasPlatformsAttribute} {$IFEND} {$ENDIF} {====Widgetset defines===============================================} { VCL version specific defines } {$IFNDEF FPC} {$IF RTLVersion >= 17} // Delphi 2005 {$DEFINE HasOnMouseActivate} {$IFEND} {$IF RTLVersion >= 18} // Delphi 2006 {$DEFINE HasOnMouseEnter} {$IFEND} {$IF RTLVersion >= 20} // Delphi 2009 {$DEFINE HasListViewGroups} {$DEFINE HasListViewOnItemChecked} {$DEFINE HasParentDoubleBuffered} {$DEFINE HasTreeViewExpandedImageIndex} {$IFEND} {$IF RTLVersion >= 21} // Delphi 2010 {$DEFINE HasGridDrawingStyle} {$DEFINE HasTouch} {$IFEND} {$ENDIF} {====General defines=================================================} {Activate the following define to include extra code to get rid of all hints and warnings. Parts of ABBREVIA are written in such a way that the hint/warning algorithms of the Delphi compilers are fooled and report things like variables being used before initialisation and so on when in reality the problem does not exist.} {$DEFINE DefeatWarnings} { Disable warnings for explicit string casts } {$IFDEF UNICODE} {$WARN EXPLICIT_STRING_CAST OFF} {$WARN EXPLICIT_STRING_CAST_LOSS OFF} {$ENDIF} { Disable hints on Delphi XE2/Mac to prevent unexpanded inline messages } {$IFDEF POSIX} {$HINTS OFF} {$ENDIF} {====Bzip2 defines===================================================} {Activate this define to statically link bzip2 .obj files into the application. Curerntly only supported by Delphi/Win32.} {.$DEFINE Bzip2Static} {Activate this define to dynamically link to a libbz2.dll/libbbz2.so.1} {.$DEFINE Bzip2Dynamic} {Activate this define to load libbz2.dll/libbz2.so.1 at runtime using LoadLibrary} {.$DEFINE Bzip2Runtime} {Pick an appropriate linking method if none of the above are activate} {$IF NOT DEFINED(Bzip2Static) AND NOT DEFINED(Bzip2Dynamic) AND NOT DEFINED(Bzip2Runtime)} {$IFDEF FPC} {$DEFINE Bzip2Runtime} {$ELSE} {$IFDEF MSWINDOWS} {$DEFINE Bzip2Static} {$ELSE} {$DEFINE Bzip2Dynamic} {$ENDIF} {$ENDIF} {$IFEND} {====Zip defines=====================================================} {Activate the following define when you don't want Visual parts of the VCL library included for a program using a TAbArchive or TAbZipArchive} {.$DEFINE BuildingStub} {Activate the following define to include support for extracting files using PKzip compatible unShrink.} {.$DEFINE UnzipShrinkSupport} {Activate the following define to include support for extracting files using PKZip compatible unReduce.} {.$DEFINE UnzipReduceSupport} {Activate the following define to include support for extracting files using PKZip compatible unImplode.} {.$DEFINE UnzipImplodeSupport} {Activate the following to include support for extracting files using all older PKZip compatible methods (Shrink, Reduce, Implode} {$DEFINE UnzipBackwardSupport} {Activate the following to include support for extracting files using BZIP2 compression. Added in AppNote.txt v4.6. } {.$DEFINE UnzipBzip2Support} {Activate the following to include support for extracting files using 7-zip compatible Lzma compression. Added in AppNote.txt v6.3.} {.$DEFINE UnzipLzmaSupport} {Activate the following to include support for extracting files using zipx PPMd I compression. Added in AppNote.txt v6.3.} {.$DEFINE UnzipPPMdSupport} {Activate the following to include support for extracting .wav files using zipx WavPack compression. Requires copyright notice in your documentation. Check "WavPack License.txt" for details. Added in AppNote.txt v6.3. } {.$DEFINE UnzipWavPackSupport} {Activate the following to include support for extracting files using all newer (zipx) compatible methods (Bzip2, Lzma, PPMd, WavPack)} {$DEFINE UnzipZipxSupport} {Activate the following to include logging support in the deflate/ inflate code. Since this logging support is a by-product of assertion checking, you should only activate it if that is also on: $C+} {$IFOPT C+} //if Assertions are on {.$DEFINE UseLogging} {$ENDIF} { According to http://www.gzip.org/zlib/rfc1952.txt A compliant gzip compressor should calculate and set the CRC32 and ISIZE. However, a compliant decompressor should not check these values. If you want to check the the values of the CRC32 and ISIZE in a GZIP file when decompressing enable the STRICTGZIP define below. } {.$DEFINE STRICTGZIP} { The following define is ONLY used for Abbrevia Unit Tests. It has no effect on the Abbrevia Library. If defined it uses Winzip to create and test archives for compatability. The winzip tests require Systools stSpawn.pas It can be downloaded at http://sf.net/projects/tpsystools } {$IFDEF MSWINDOWS} {.$DEFINE WINZIPTESTS} {$ENDIF} {-------- !! DO NOT CHANGE DEFINES BELOW THIS LINE !! --------} {$IFDEF UnzipBackwardSupport} {$DEFINE UnzipShrinkSupport} {$DEFINE UnzipReduceSupport} {$DEFINE UnzipImplodeSupport} {$ENDIF} {$IFDEF UnzipZipxSupport} {$DEFINE UnzipBzip2Support} {$DEFINE UnzipLzmaSupport} {$DEFINE UnzipPPMdSupport} {$DEFINE UnzipWavPackSupport} {$ENDIF} { Linking .obj files isn't currently supported in Kylix or FPC } {$IF DEFINED(FPC) OR NOT DEFINED(MSWINDOWS)} {$UNDEF UnzipLzmaSupport} {$UNDEF UnzipPPMdSupport} {$UNDEF UnzipWavPackSupport} {$IFEND} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abzipprc.pas����������������������������������������������0000644�0001750�0001750�00000023462�12014201074�022056� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbZipPrc.pas *} {*********************************************************} {* ABBREVIA: TABZipHelper class *} {*********************************************************} unit AbZipPrc; {$I AbDefine.inc} interface uses Classes, AbZipTyp; procedure AbZip( Sender : TAbZipArchive; Item : TAbZipItem; OutStream : TStream ); procedure AbZipFromStream(Sender : TAbZipArchive; Item : TAbZipItem; OutStream, InStream : TStream); procedure DeflateStream( UncompressedStream, CompressedStream : TStream ); {-Deflates everything in UncompressedStream to CompressedStream no encryption is tried, no check on CRC is done, uses the whole compressedstream - no Progress events - no Frills! } implementation uses {$IFDEF MSWINDOWS} Windows, {$ENDIF} {$IFDEF LibcAPI} Libc, {$ENDIF} SysUtils, AbArcTyp, AbExcept, AbUtils, AbDfCryS, AbVMStrm, AbDfBase, AbDfEnc, AbSpanSt, DCClassesUtf8; { ========================================================================== } procedure DoDeflate(Archive : TAbZipArchive; Item : TAbZipItem; OutStream, InStream : TStream); const DEFLATE_NORMAL_MASK = $00; DEFLATE_MAXIMUM_MASK = $02; DEFLATE_FAST_MASK = $04; DEFLATE_SUPERFAST_MASK = $06; var Hlpr : TAbDeflateHelper; begin Item.CompressionMethod := cmDeflated; Hlpr := TAbDeflateHelper.Create; {anything dealing with store options, etc. should already be done.} try {Hlpr} Hlpr.StreamSize := InStream.Size; { set deflation level desired } Hlpr.PKZipOption := '0'; case Archive.DeflationOption of doNormal : begin Hlpr.PKZipOption := 'n'; Item.GeneralPurposeBitFlag := Item.GeneralPurposeBitFlag or DEFLATE_NORMAL_MASK; end; doMaximum : begin Hlpr.PKZipOption := 'x'; Item.GeneralPurposeBitFlag := Item.GeneralPurposeBitFlag or DEFLATE_MAXIMUM_MASK; end; doFast : begin Hlpr.PKZipOption := 'f'; Item.GeneralPurposeBitFlag := Item.GeneralPurposeBitFlag or DEFLATE_FAST_MASK; end; doSuperFast : begin Hlpr.PKZipOption := 's'; Item.GeneralPurposeBitFlag := Item.GeneralPurposeBitFlag or DEFLATE_SUPERFAST_MASK; end; end; { attach progress notification method } Hlpr.OnProgressStep := Archive.DoInflateProgress; { provide encryption check value } Item.CRC32 := Deflate(InStream, OutStream, Hlpr); finally {Hlpr} Hlpr.Free; end; {Hlpr} end; { ========================================================================== } procedure DoStore(Archive : TAbZipArchive; Item : TAbZipItem; OutStream, InStream : TStream); var CRC32 : LongInt; Percent : LongInt; LastPercent : LongInt; InSize : Int64; DataRead : Int64; Total : Int64; Abort : Boolean; Buffer : array [0..8191] of byte; begin { setup } Item.CompressionMethod := cmStored; Abort := False; CRC32 := -1; Total := 0; Percent := 0; LastPercent := 0; InSize := InStream.Size; { get first bufferful } DataRead := InStream.Read(Buffer, SizeOf(Buffer)); { while more data has been read and we're not told to bail } while (DataRead <> 0) and not Abort do begin {report the progress} if Assigned(Archive.OnProgress) then begin Total := Total + DataRead; Percent := Round((100.0 * Total) / InSize); if (LastPercent <> Percent) then Archive.OnProgress(Percent, Abort); LastPercent := Percent; end; { update CRC} AbUpdateCRCBuffer(CRC32, Buffer, DataRead); { write data (encrypting if needed) } OutStream.WriteBuffer(Buffer, DataRead); { get next bufferful } DataRead := InStream.Read(Buffer, SizeOf(Buffer)); end; { finish CRC calculation } Item.CRC32 := not CRC32; { show final progress increment } if (Percent < 100) and Assigned(Archive.OnProgress) then Archive.OnProgress(100, Abort); { User wants to bail } if Abort then begin raise EAbUserAbort.Create; end; end; { ========================================================================== } procedure DoZipFromStream(Sender : TAbZipArchive; Item : TAbZipItem; OutStream, InStream : TStream); var ZipArchive : TAbZipArchive; InStartPos : LongInt; TempOut : TAbVirtualMemoryStream; DestStrm : TStream; begin ZipArchive := TAbZipArchive(Sender); { configure Item } Item.UncompressedSize := InStream.Size; Item.GeneralPurposeBitFlag := Item.GeneralPurposeBitFlag and AbLanguageEncodingFlag; if ZipArchive.Password <> '' then { encrypt the stream } DestStrm := TAbDfEncryptStream.Create(OutStream, LongInt(Item.LastModFileTime shl $10), ZipArchive.Password) else DestStrm := OutStream; try if InStream.Size > 0 then begin { determine how to store Item based on specified CompressionMethodToUse } case ZipArchive.CompressionMethodToUse of smDeflated : begin { Item is to be deflated regarless } { deflate item } DoDeflate(ZipArchive, Item, DestStrm, InStream); end; smStored : begin { Item is to be stored regardless } { store item } DoStore(ZipArchive, Item, DestStrm, InStream); end; smBestMethod : begin { Item is to be archived using method producing best compression } TempOut := TAbVirtualMemoryStream.Create; try TempOut.SwapFileDirectory := Sender.TempDirectory; { save starting points } InStartPos := InStream.Position; { try deflating item } DoDeflate(ZipArchive, Item, TempOut, InStream); { if deflated size > input size then got negative compression } { so storing the item is more efficient } if TempOut.Size > InStream.Size then begin { store item instead } { reset streams to original positions } InStream.Position := InStartPos; TempOut.Free; TempOut := TAbVirtualMemoryStream.Create; TempOut.SwapFileDirectory := Sender.TempDirectory; { store item } DoStore(ZipArchive, Item, TempOut, InStream); end {if}; TempOut.Seek(0, soBeginning); DestStrm.CopyFrom(TempOut, TempOut.Size); finally TempOut.Free; end; end; end; { case } end else begin { InStream is zero length} Item.CRC32 := 0; { ignore any storage indicator and treat as stored } DoStore(ZipArchive, Item, DestStrm, InStream); end; finally if DestStrm <> OutStream then DestStrm.Free; end; { update item } Item.CompressedSize := OutStream.Size; Item.InternalFileAttributes := 0; { don't care } if (ZipArchive.Password <> '') then Item.GeneralPurposeBitFlag := Item.GeneralPurposeBitFlag or AbFileIsEncryptedFlag or AbHasDataDescriptorFlag; end; { -------------------------------------------------------------------------- } procedure AbZipFromStream(Sender : TAbZipArchive; Item : TAbZipItem; OutStream, InStream : TStream); var FileTimeStamp : LongInt; begin // Set item properties for non-file streams Item.ExternalFileAttributes := 0; FileTimeStamp := DateTimeToFileDate(SysUtils.Now); Item.LastModFileTime := LongRec(FileTimeStamp).Lo; Item.LastModFileDate := LongRec(FileTimeStamp).Hi; DoZipFromStream(Sender, Item, OutStream, InStream); end; { -------------------------------------------------------------------------- } procedure AbZip( Sender : TAbZipArchive; Item : TAbZipItem; OutStream : TStream ); var UncompressedStream : TStream; AttrEx : TAbAttrExRec; begin if not AbFileGetAttrEx(Item.DiskFileName, AttrEx) then Raise EAbFileNotFound.Create; if ((AttrEx.Attr and faDirectory) <> 0) then UncompressedStream := TMemoryStream.Create else UncompressedStream := TFileStreamEx.Create(Item.DiskFileName, fmOpenRead or fmShareDenyWrite); try {UncompressedStream} {$IFDEF UNIX} Item.ExternalFileAttributes := LongWord(AttrEx.Mode) shl 16 + LongWord(AttrEx.Attr); {$ELSE} Item.ExternalFileAttributes := AttrEx.Attr; {$ENDIF} Item.LastModTimeAsDateTime := AttrEx.Time; DoZipFromStream(Sender, Item, OutStream, UncompressedStream); finally {UncompressedStream} UncompressedStream.Free; end; {UncompressedStream} end; { -------------------------------------------------------------------------- } procedure DeflateStream( UncompressedStream, CompressedStream : TStream ); {-Deflates everything in CompressedStream to UncompressedStream no encryption is tried, no check on CRC is done, uses the whole Uncompressedstream - no Progress events - no Frills! } begin Deflate(UncompressedStream, CompressedStream, nil); end; { -------------------------------------------------------------------------- } end. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abexcept.pas����������������������������������������������0000644�0001750�0001750�00000042327�12014201074�022040� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbExcept.pas *} {*********************************************************} {* ABBREVIA: Exception classes *} {*********************************************************} unit AbExcept; {$I AbDefine.inc} interface uses SysUtils, AbUtils; type EAbException = class( Exception ) public ErrorCode : Integer; end; EAbArchiveBusy = class( EAbException ) public constructor Create; end; EAbBadStream = class( EAbException ) protected FInnerException : Exception; public constructor Create; constructor CreateInner(aInnerException : Exception); property InnerException : Exception read FInnerException; end; EAbDuplicateName = class( EAbException ) public constructor Create; end; EAbFileNotFound = class( EAbException ) public constructor Create; end; EAbNoArchive = class( EAbException ) public constructor Create; end; EAbUserAbort = class( EAbException ) public constructor Create; end; EAbNoSuchDirectory = class( EAbException ) public constructor Create; end; EAbUnhandledType = class( EAbException ) public constructor Create; end; EAbSpanningNotSupported = class (EAbException) public constructor Create; end; EAbInvalidSpanningThreshold = class ( EAbException ) public constructor Create; end; EAbZipException = class( EAbException ); {Zip exception} EAbCabException = class( EAbException ); {Cab exception} EAbTarException = class( EAbException ); {Tar Exception} EAbGzipException = class( EAbException); {GZip exception} EAbZipBadSpanStream = class( EAbZipException ) public constructor Create; end; EAbZipBadCRC = class( EAbZipException ) public constructor Create; end; EAbZipInflateBlock = class( EAbZipException ) public constructor Create; end; EAbZipInvalid = class( EAbZipException ) public constructor Create; end; EAbInvalidIndex = class( EAbZipException ) public constructor Create; end; EAbZipInvalidFactor = class( EAbZipException ) public constructor Create; end; EAbZipInvalidLFH = class( EAbZipException ) public constructor Create; end; EAbZipInvalidMethod = class( EAbZipException ) public constructor Create; end; EAbZipInvalidPassword = class( EAbZipException ) public constructor Create; end; EAbZipInvalidStub= class( EAbZipException ) public constructor Create; end; EAbZipNoExtraction = class( EAbZipException ) public constructor Create; end; EAbZipNoInsertion = class( EAbZipException ) public constructor Create; end; EAbZipSpanOverwrite= class( EAbZipException ) public constructor Create; end; EAbZipStreamFull = class( EAbZipException ) public constructor Create; end; EAbZipTruncate = class( EAbZipException ) public constructor Create; end; EAbZipUnsupported = class( EAbZipException ) public constructor Create; end; EAbZipVersion = class( EAbZipException ) public constructor Create; end; EAbReadError = class( EAbZipException ) public constructor Create; end; EAbGzipBadCRC = class( EAbGZipException ) public constructor Create; end; EAbGzipBadFileSize = class( EAbGZipException ) public constructor Create; end; EAbGzipInvalid = class( EAbGZipException ) public constructor Create; end; EAbTarInvalid = class( EAbTarException) public constructor Create; end; EAbTarBadFileName = class( EAbTarException) public constructor Create; end; EAbTarBadLinkName = class( EAbTarException) public constructor Create; end; EAbTarBadOp = class( EAbTarException) public constructor Create; end; EAbVMSInvalidOrigin = class( EAbZipException ) public constructor Create( Value : Integer ); end; EAbVMSErrorOpenSwap = class( EAbZipException ) public constructor Create( const Value : string ); end; EAbVMSSeekFail = class( EAbZipException ) public constructor Create( const Value : string ); end; EAbVMSReadFail = class( EAbZipException ) public constructor Create( Count : Integer; const Value : string ); end; EAbVMSWriteFail = class( EAbZipException ) public constructor Create( Count : Integer; const Value : string ); end; EAbVMSWriteTooManyBytes = class( EAbZipException ) public constructor Create( Count : Integer ); end; EAbBBSReadTooManyBytes = class( EAbZipException ) public constructor Create(Count : Integer ); end; EAbBBSSeekOutsideBuffer = class( EAbZipException ) public constructor Create; end; EAbBBSInvalidOrigin = class( EAbZipException ) public constructor Create; end; EAbBBSWriteTooManyBytes = class( EAbZipException ) public constructor Create(Count : Integer ); end; EAbSWSNotEndofStream = class( EAbZipException ) public constructor Create; end; EAbSWSSeekFailed = class( EAbZipException ) public constructor Create; end; EAbSWSWriteFailed = class( EAbZipException ) public constructor Create; end; EAbSWSInvalidOrigin = class( EAbZipException ) public constructor Create; end; EAbSWSInvalidNewOrigin = class( EAbZipException ) public constructor Create; end; EAbNoCabinetDll = class( EAbCabException ) public constructor Create; end; EAbFCIFileOpenError = class( EAbCabException ) public constructor Create; end; EAbFCIFileReadError = class( EAbCabException ) public constructor Create; end; EAbFCIFileWriteError = class( EAbCabException ) public constructor Create; end; EAbFCIFileCloseError = class( EAbCabException ) public constructor Create; end; EAbFCIFileSeekError = class( EAbCabException ) public constructor Create; end; EAbFCIFileDeleteError = class( EAbCabException ) public constructor Create; end; EAbFCIAddFileError = class( EAbCabException ) public constructor Create; end; EAbFCICreateError = class( EAbCabException ) public constructor Create; end; EAbFCIFlushCabinetError = class( EAbCabException ) public constructor Create; end; EAbFCIFlushFolderError = class( EAbCabException ) public constructor Create; end; EAbFDICopyError = class( EAbCabException ) public constructor Create; end; EAbFDICreateError = class( EAbCabException ) public constructor Create; end; EAbInvalidCabTemplate = class( EAbCabException ) public constructor Create; end; EAbInvalidCabFile = class( EAbCabException ) public constructor Create; end; EAbFileTooLarge = class(EAbException) public constructor Create; end; procedure AbConvertException( const E : Exception; var eClass : TAbErrorClass; var eErrorCode : Integer ); implementation uses Classes, AbConst, AbResString; constructor EAbArchiveBusy.Create; begin inherited Create(AbArchiveBusyS); ErrorCode := AbArchiveBusy; end; constructor EAbBadStream.Create; begin inherited Create(AbBadStreamTypeS); FInnerException := nil; ErrorCode := AbBadStreamType; end; constructor EAbBadStream.CreateInner(aInnerException: Exception); begin inherited Create(AbBadStreamTypeS + #13#10 + aInnerException.Message); FInnerException := aInnerException; ErrorCode := AbBadStreamType; end; constructor EAbDuplicateName.Create; begin inherited Create(AbDuplicateNameS); ErrorCode := AbDuplicateName; end; constructor EAbNoSuchDirectory.Create; begin inherited Create(AbNoSuchDirectoryS); ErrorCode := AbNoSuchDirectory; end; constructor EAbInvalidSpanningThreshold.Create; begin inherited Create(AbInvalidThresholdS); ErrorCode := AbInvalidThreshold; end; constructor EAbFileNotFound.Create; begin inherited Create(AbFileNotFoundS); ErrorCode := AbFileNotFound; end; constructor EAbNoArchive.Create; begin inherited Create(AbNoArchiveS); ErrorCode := AbNoArchive; end; constructor EAbUserAbort.Create; begin inherited Create(AbUserAbortS); ErrorCode := AbUserAbort; end; constructor EAbZipBadSpanStream.Create; begin inherited Create(AbBadSpanStreamS); ErrorCode := AbBadSpanStream; end; constructor EAbZipBadCRC.Create; begin inherited Create(AbZipBadCRCS); ErrorCode := AbZipBadCRC; end; constructor EAbZipInflateBlock.Create; begin inherited Create(AbInflateBlockErrorS); ErrorCode := AbInflateBlockError; end; constructor EAbZipInvalid.Create; begin inherited Create(AbErrZipInvalidS); ErrorCode := AbErrZipInvalid; end; constructor EAbInvalidIndex.Create; begin inherited Create(AbInvalidIndexS); ErrorCode := AbInvalidIndex; end; constructor EAbZipInvalidFactor.Create; begin inherited Create(AbInvalidFactorS); ErrorCode := AbInvalidFactor; end; constructor EAbZipInvalidLFH.Create; begin inherited Create(AbInvalidLFHS); ErrorCode := AbInvalidLFH; end; constructor EAbZipInvalidMethod.Create; begin inherited Create(AbUnknownCompressionMethodS); ErrorCode := AbUnknownCompressionMethod; end; constructor EAbZipInvalidPassword.Create; begin inherited Create(AbInvalidPasswordS); ErrorCode := AbInvalidPassword; end; constructor EAbZipInvalidStub.Create; begin inherited Create(AbZipBadStubS); ErrorCode := AbZipBadStub; end; constructor EAbZipNoExtraction.Create; begin inherited Create(AbNoExtractionMethodS); ErrorCode := AbNoExtractionMethod; end; constructor EAbZipNoInsertion.Create; begin inherited Create(AbNoInsertionMethodS); ErrorCode := AbNoInsertionMethod; end; constructor EAbZipSpanOverwrite.Create; begin inherited Create(AbNoOverwriteSpanStreamS); ErrorCode := AbNoOverwriteSpanStream; end; constructor EAbZipStreamFull.Create; begin inherited Create(AbStreamFullS); ErrorCode := AbStreamFull; end; constructor EAbZipTruncate.Create; begin inherited Create(AbTruncateErrorS); ErrorCode := AbTruncateError; end; constructor EAbZipUnsupported.Create; begin inherited Create(AbUnsupportedCompressionMethodS); ErrorCode := AbUnsupportedCompressionMethod; end; constructor EAbZipVersion.Create; begin inherited Create(AbZipVersionNeededS); ErrorCode := AbZipVersionNeeded; end; constructor EAbReadError.Create; begin inherited Create(AbReadErrorS); ErrorCode := AbReadError; end; constructor EAbVMSInvalidOrigin.Create( Value : Integer ); begin inherited Create(Format(AbVMSInvalidOriginS, [Value])); ErrorCode := AbVMSInvalidOrigin; end; constructor EAbBBSReadTooManyBytes.Create(Count : Integer ); begin inherited Create(Format(AbBBSReadTooManyBytesS, [Count])); ErrorCode := AbBBSReadTooManyBytes; end; constructor EAbBBSSeekOutsideBuffer.Create; begin inherited Create(AbBBSSeekOutsideBufferS); ErrorCode := AbBBSSeekOutsideBuffer; end; constructor EAbBBSInvalidOrigin.Create; begin inherited Create(AbBBSInvalidOriginS); ErrorCode := AbBBSInvalidOrigin; end; constructor EAbBBSWriteTooManyBytes.Create(Count : Integer); begin inherited Create(Format(AbBBSWriteTooManyBytesS, [Count])); ErrorCode := AbBBSWriteTooManyBytes; end; constructor EAbVMSErrorOpenSwap.Create( const Value : string ); begin inherited Create(Format(AbVMSErrorOpenSwapS, [Value])); ErrorCode := AbVMSErrorOpenSwap; end; constructor EAbVMSSeekFail.Create( const Value : string ); begin inherited Create(Format(AbVMSSeekFailS, [Value])); ErrorCode := AbVMSSeekFail; end; constructor EAbVMSReadFail.Create( Count : Integer; const Value : string ); begin inherited Create(Format(AbVMSReadFailS, [Count, Value])); ErrorCode := AbVMSReadFail; end; constructor EAbVMSWriteFail.Create( Count : Integer; const Value : string ); begin inherited Create(Format(AbVMSWriteFailS, [Count, Value])); ErrorCode := AbVMSWriteFail; end; constructor EAbVMSWriteTooManyBytes.Create( Count : Integer ); begin inherited Create(Format(AbVMSWriteTooManyBytesS, [Count])); ErrorCode := AbVMSWriteTooManyBytes; end; constructor EAbSWSNotEndofStream.Create; begin inherited Create(AbSWSNotEndofStreamS); ErrorCode := AbSWSNotEndofStream; end; constructor EAbSWSSeekFailed.Create; begin inherited Create(AbSWSSeekFailedS); ErrorCode := AbSWSSeekFailed; end; constructor EAbSWSWriteFailed.Create; begin inherited Create(AbSWSWriteFailedS); ErrorCode := AbSWSWriteFailed; end; constructor EAbSWSInvalidOrigin.Create; begin inherited Create(AbSWSInvalidOriginS); ErrorCode := AbSWSInvalidOrigin; end; constructor EAbSWSInvalidNewOrigin.Create; begin inherited Create(AbSWSInvalidNewOriginS); ErrorCode := AbSWSInvalidNewOrigin; end; constructor EAbFCIFileOpenError.Create; begin inherited Create(AbFCIFileOpenErrorS); ErrorCode := AbFCIFileOpenError; end; constructor EAbNoCabinetDll.Create; begin inherited Create(AbNoCabinetDllErrorS); ErrorCode := AbNoCabinetDllError; end; constructor EAbFCIFileReadError.Create; begin inherited Create(AbFCIFileReadErrorS); ErrorCode := AbFCIFileReadError; end; constructor EAbFCIFileWriteError.Create; begin inherited Create(AbFCIFileWriteErrorS); ErrorCode := AbFCIFileWriteError; end; constructor EAbFCIFileCloseError.Create; begin inherited Create(AbFCIFileCloseErrorS); ErrorCode := AbFCIFileCloseError; end; constructor EAbFCIFileSeekError.Create; begin inherited Create(AbFCIFileSeekErrorS); ErrorCode := AbFCIFileSeekError; end; constructor EAbFCIFileDeleteError.Create; begin inherited Create(AbFCIFileDeleteErrorS); ErrorCode := AbFCIFileDeleteError; end; constructor EAbFCIAddFileError.Create; begin inherited Create(AbFCIAddFileErrorS); ErrorCode := AbFCIAddFileError; end; constructor EAbFCICreateError.Create; begin inherited Create(AbFCICreateErrorS); ErrorCode := AbFCICreateError; end; constructor EAbFCIFlushCabinetError.Create; begin inherited Create(AbFCIFlushCabinetErrorS); ErrorCode := AbFCIFlushCabinetError; end; constructor EAbFCIFlushFolderError.Create; begin inherited Create(AbFCIFlushFolderErrorS); ErrorCode := AbFCIFlushFolderError; end; constructor EAbFDICopyError.Create; begin inherited Create(AbFDICopyErrorS); ErrorCode := AbFDICopyError; end; constructor EAbFDICreateError.Create; begin inherited Create(AbFDICreateErrorS); ErrorCode := AbFDICreateError; end; constructor EAbInvalidCabTemplate.Create; begin inherited Create(AbInvalidCabTemplateS); ErrorCode := AbInvalidCabTemplate; end; constructor EAbInvalidCabFile.Create; begin inherited Create(AbInvalidCabFileS); ErrorCode := AbInvalidCabFile; end; procedure AbConvertException( const E : Exception; var eClass : TAbErrorClass; var eErrorCode : Integer ); begin eClass := ecOther; eErrorCode := 0; if E is EAbException then begin eClass := ecAbbrevia; eErrorCode := (E as EAbException).ErrorCode; end else if E is EInOutError then begin eClass := ecInOutError; eErrorCode := (E as EInOutError).ErrorCode; end else if E is EFilerError then eClass := ecFilerError else if E is EFOpenError then eClass := ecFileOpenError else if E is EFCreateError then eClass := ecFileCreateError; end; { EAbUnhandledType } constructor EAbUnhandledType.Create; begin inherited Create(AbUnhandledFileTypeS); ErrorCode := AbUnhandledFileType; end; { EAbGzipBadCRC } constructor EAbGzipBadCRC.Create; begin inherited Create(AbGzipBadCRCS); ErrorCode := AbGzipBadCRC; end; { EAbGzipBadFileSize } constructor EAbGzipBadFileSize.Create; begin inherited Create(AbGzipBadFileSizeS); ErrorCode := AbGzipBadFileSize; end; { EAbGzipInvalid } constructor EAbGzipInvalid.Create; begin inherited Create(AbSpanningNotSupportedS); ErrorCode := AbSpanningNotSupported; end; { EAbTarInvalid } constructor EAbTarInvalid.Create; begin inherited Create(AbTarInvalidS); ErrorCode := AbTarInvalid; end; { EAbTarBadFileName } constructor EAbTarBadFileName.Create; begin inherited Create(AbTarBadFileNameS); ErrorCode := AbTarBadFileName; end; { EAbTarBadLinkName } constructor EAbTarBadLinkName.Create; begin inherited Create(AbTarBadLinkNameS); ErrorCode := AbTarBadLinkName; end; { EAbTarBadOp } constructor EAbTarBadOp.Create; begin inherited Create(AbTarBadOpS); ErrorCode := AbTarBadOp; end; { EAbSpanningNotSupported } constructor EAbSpanningNotSupported.Create; begin inherited Create(AbSpanningNotSupportedS); ErrorCode := AbSpanningNotSupported; end; { EAbFileTooLarge } constructor EAbFileTooLarge.Create; begin {TODO Create const and fix wording} inherited Create(AbFileSizeTooBigS); end; end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abdfstrm.pas����������������������������������������������0000644�0001750�0001750�00000132320�12014201074�022040� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbDfStrm.pas *} {*********************************************************} {* Deflate streams unit for various streams *} {*********************************************************} unit AbDfStrm; {$I AbDefine.inc} interface uses Classes, AbDfBase, AbDfInW, AbDfHufD; type TAb32bit = longint; { a 32-bit type} PAbDfLitBuckets = ^TAbDfLitBuckets; TAbDfLitBuckets = array [0..285] of integer; PAbDfDistBuckets = ^TAbDfDistBuckets; TAbDfDistBuckets = array [0..31] of integer; PAbDfCodeLenBuckets = ^TAbDfCodeLenBuckets; TAbDfCodeLenBuckets = array [0..18] of integer; const AbExtractMask : array [1..31] of TAb32bit = ($00000001, $00000003, $00000007, $0000000F, $0000001F, $0000003F, $0000007F, $000000FF, $000001FF, $000003FF, $000007FF, $00000FFF, $00001FFF, $00003FFF, $00007FFF, $0000FFFF, $0001FFFF, $0003FFFF, $0007FFFF, $000FFFFF, $001FFFFF, $003FFFFF, $007FFFFF, $00FFFFFF, $01FFFFFF, $03FFFFFF, $07FFFFFF, $0FFFFFFF, $1FFFFFFF, $3FFFFFFF, $7FFFFFFF); type TAbDfInBitStream = class { input bit stream} private FBitBuffer : TAb32bit; FBitsLeft : integer; FBufEnd : PAnsiChar; FBuffer : PAnsiChar; FBufPos : PAnsiChar; FByteCount : longint; FFakeCount : integer; FOnProgress: TAbProgressStep; {$IFOPT C+} FPeekCount : integer; {$ENDIF} FStream : TStream; FStreamSize: longint; protected function ibsFillBuffer : boolean; public constructor Create(aStream : TStream; aOnProgress : TAbProgressStep; aStreamSize : longint); destructor Destroy; override; procedure AlignToByte; procedure DiscardBits(aCount : integer); procedure DiscardMoreBits(aCount : integer); function PeekBits(aCount : integer) : integer; function PeekMoreBits(aCount : integer) : integer; function ReadBit : boolean; function ReadBits(aCount : integer) : integer; procedure ReadBuffer(var aBuffer; aCount : integer); property BitBuffer : TAb32bit read FBitBuffer write FBitBuffer; property BitsLeft : integer read FBitsLeft write FBitsLeft; end; type TAbDfOutBitStream = class { output bit stream} private FBitBuffer : TAb32bit; FBitsUsed : integer; FBufEnd : PAnsiChar; FBuffer : PAnsiChar; FBufPos : PAnsiChar; FStream : TStream; protected procedure obsEmptyBuffer; public constructor Create(aStream : TStream); destructor Destroy; override; procedure AlignToByte; function Position : longint; procedure WriteBit(aBit : boolean); procedure WriteBits(aBits : integer; aCount : integer); procedure WriteBuffer(var aBuffer; aCount : integer); procedure WriteMoreBits(aBits : integer; aCount : integer); property BitBuffer : TAb32bit read FBitBuffer write FBitBuffer; property BitsUsed : integer read FBitsUsed write FBitsUsed; end; type TAbDfLZStream = class { LZ77 token stream} private FCurPos : PAnsiChar; FDistBuckets : PAbDfDistBuckets; FDistCount : integer; FLitBuckets : PAbDfLitBuckets; FLitCount : integer; FLog : TAbLogger; FSlideWin : TAbDfInputWindow; FStartOfs : Int64; FStoredSize : LongWord; FStream : PAnsiChar; FStrmEnd : PAnsiChar; {$IFDEF UseLogging} FSWPos : longint; {$ENDIF} FUseDeflate64: boolean; protected function lzsGetApproxSize : LongWord; function lzsGetStaticSize : integer; function lzsGetStoredSize : integer; function lzsIsFull : boolean; public constructor Create(aSlideWin : TAbDfInputWindow; aUseDeflate64 : boolean; aLog : TAbLogger); destructor Destroy; override; function AddLenDist(aLen : integer; aDist : integer) : boolean; { returns true if the stream is "full"} function AddLiteral(aCh : AnsiChar) : boolean; { returns true if the stream is "full"} procedure Clear; procedure Encode(aBitStrm : TAbDfOutBitStream; aLitTree : TAbDfDecodeHuffmanTree; aDistTree : TAbDfDecodeHuffmanTree; aUseDeflate64 : boolean); procedure Rewind; procedure ReadStoredBuffer(var aBuffer; aCount : integer); property LenDistCount : integer read FDistCount; property LiteralCount : integer read FLitCount; property DistBuckets : PAbDfDistBuckets read FDistBuckets; property LitBuckets : PAbDfLitBuckets read FLitBuckets; property StaticSize : integer read lzsGetStaticSize;{ in bits} property StoredSize : integer read lzsGetStoredSize;{ in bytes} end; type TAbDfCodeLenStream = class { codelength token stream} private FBuckets : PAbDfCodeLenBuckets; FPosition : PAnsiChar; FStream : PAnsiChar; {array [0..285+32*2] of byte;} FStrmEnd : PAnsiChar; protected public constructor Create(aLog : TAbLogger); destructor Destroy; override; procedure Build(const aCodeLens : array of integer; aCount : integer); procedure Encode(aBitStrm : TAbDfOutBitStream; aTree : TAbDfDecodeHuffmanTree); property Buckets : PAbDfCodeLenBuckets read FBuckets; end; implementation uses SysUtils, AbDfXlat; type PAb32bit = ^TAb32bit; const BitStreamBufferSize = 16*1024; {===TAbDfInBitStream=================================================} constructor TAbDfInBitStream.Create(aStream : TStream; aOnProgress : TAbProgressStep; aStreamSize : longint); begin {protect against dumb programming mistakes} Assert(aStream <> nil, 'TAbDfInBitStream.Create: Cannot create a bit stream wrapping a nil stream'); {create the ancestor} inherited Create; {save the stream instance, allocate the buffer} FStream := aStream; GetMem(FBuffer, BitStreamBufferSize); {save the on progress handler} if Assigned(aOnProgress) and (aStreamSize > 0) then begin FOnProgress := aOnProgress; //FStreamSize := aStreamSize; FStreamSize := aStream.Size - aStream.Position; end; end; {--------} destructor TAbDfInBitStream.Destroy; begin {if we did some work...} if (FBuffer <> nil) then begin {reposition the underlying stream to the point where we stopped; this position is equal to... the position of the underlying stream, PLUS the number of fake bytes we added, LESS the number of bytes in the buffer, PLUS the position in the buffer, PLUS the number of complete bytes in the bit buffer} FStream.Seek(FStream.Position + FFakeCount - (FBufEnd - FBuffer) + (FBufPos - FBuffer) - (FBitsLeft div 8), soFromBeginning); {free the buffer} FreeMem(FBuffer); end; {destroy the ancestor} inherited Destroy; end; {--------} procedure TAbDfInBitStream.AlignToByte; begin {get rid of the odd bits by shifting them out of the bit cache} FBitBuffer := FBitBuffer shr (FBitsLeft mod 8); dec(FBitsLeft, FBitsLeft mod 8); end; {--------} procedure TAbDfInBitStream.DiscardBits(aCount : integer); var BitsToGo : integer; begin {aCount comes from a (possibly corrupt) stream, so check that it is the correct range, 1..32} if (aCount <= 0) or (aCount > 32) then raise EAbInternalInflateError.Create( 'count of bits must be between 1 and 32 inclusive [TAbDfInBitStream.DiscardBits]'); {$IFOPT C+} {verify that the count of bits to discard is less than or equal to the recent count from PeekBits--a programming error} Assert((aCount <= FPeekCount), 'TAbDfInBitStream.DiscardBits: discarding more bits than peeked'); {since we're discarding bits already peeked, reset the peek count} FPeekCount := 0; {$ENDIF} {if we have more than enough bits in our bit buffer, update the bitbuffer and the number of bits left} if (aCount <= FBitsLeft) then begin FBitBuffer := FBitBuffer shr aCount; dec(FBitsLeft, aCount); end {otherwise we shall have to read another integer out of the buffer to satisfy the request} else begin {check that there is data in the buffer, if not it's indicates a corrupted stream: PeekBits should have filled it} if (FBufPos = FBufEnd) then raise EAbInternalInflateError.Create( 'no more compressed data in stream [TAbDfInBitStream.DiscardBits]'); {refill the bit buffer} BitsToGo := aCount - FBitsLeft; FBitBuffer := PAb32bit(FBufPos)^; inc(FBufPos, sizeof(TAb32bit)); FBitBuffer := FBitBuffer shr BitsToGo; FBitsLeft := 32 - BitsToGo; end; end; {--------} procedure TAbDfInBitStream.DiscardMoreBits(aCount : integer); var BitsToGo : integer; begin {aCount comes from a (possibly corrupt) stream, so check that it is the correct range, 1..32} if (aCount <= 0) or (aCount > 32) then raise EAbInternalInflateError.Create( 'count of bits must be between 1 and 32 inclusive [TAbDfInBitStream.DiscardMoreBits]'); {$IFOPT C+} {verify that the count of bits to discard is less than or equal to the recent count from PeekBits--a programming error} Assert((aCount <= FPeekCount), 'TAbDfInBitStream.DiscardBits: discarding more bits than peeked'); {since we're discarding bits already peeked, reset the peek count} FPeekCount := 0; {$ENDIF} {check that there is data in the buffer, if not it's indicates a corrupted stream: PeekBits/PeekMoreBits should have filled it} if (FBufPos = FBufEnd) then raise EAbInternalInflateError.Create( 'no more compressed data in stream [TAbDfInBitStream.DiscardBits]'); {refill the bit buffer} BitsToGo := aCount - FBitsLeft; FBitBuffer := PAb32bit(FBufPos)^; inc(FBufPos, sizeof(TAb32bit)); FBitBuffer := FBitBuffer shr BitsToGo; FBitsLeft := 32 - BitsToGo; end; {--------} function TAbDfInBitStream.ibsFillBuffer : boolean; var BytesRead : longint; BytesToRead : longint; i : integer; Percent : integer; Buffer : PAnsiChar; BufferCount : integer; begin {check for dumb programming mistakes: this routine should only be called if there are less than 4 bytes unused in the buffer} Assert((FBufEnd - FBufPos) < sizeof(longint), 'TAbDfInBitStream.ibsFillBuffer: the buffer should be almost empty'); {if there are still 1, 2, or three bytes unused, move them to the front of the buffer} Buffer := FBuffer; while (FBufPos <> FBufEnd) do begin Buffer^ := FBufPos^; inc(FBufPos); inc(Buffer); end; {fill the buffer} BytesToRead := BitStreamBufferSize - (Buffer - FBuffer); BytesRead := FStream.Read(Buffer^, BytesToRead); {reset the internal pointers} FBufPos := FBuffer; FBufEnd := Buffer + BytesRead; BufferCount := FBufEnd - FBuffer; {if, as a result of the read, no data is in the buffer, return false; the caller will decide what to do about the problem} if (BufferCount = 0) then Result := false {otherwise there is data to be processed} else begin Result := true; {if we didn't read anything from the stream, we need to make sure that enough buffer is zeroed out so that reading longint values don't produce (dreadfully) bogus values} if (BytesRead = 0) and ((BufferCount mod 4) <> 0) then begin FFakeCount := 4 - (BufferCount mod 4); for i := 0 to pred(FFakeCount) do begin FBufEnd^ := #0; inc(FBufEnd); end; end; {fire the progress event} if Assigned(FOnProgress) then begin inc(FByteCount, BytesRead); Percent := Round((100.0 * FByteCount) / FStreamSize); FOnProgress(Percent); end; end; end; {--------} function TAbDfInBitStream.PeekBits(aCount : integer) : integer; var BitsToGo : integer; TempBuffer : integer; begin {check that aCount is in the correct range 1..32} Assert((0 <= aCount) and (aCount <= 32), 'TAbDfInBitStream.PeekBits: count of bits must be between 1 and 32 inclusive'); {if we have more than enough bits in our bit buffer, return as many as needed} if (aCount <= FBitsLeft) then Result := FBitBuffer and AbExtractMask[aCount] {otherwise we shall have to read another integer out of the buffer to satisfy the request; note that this will fill the stream buffer if required} else begin BitsToGo := aCount - FBitsLeft; Result := FBitBuffer; if ((FBufEnd - FBufPos) < sizeof(TAb32bit)) then if not ibsFillBuffer then TempBuffer := 0 else TempBuffer := PAb32bit(FBufPos)^ else TempBuffer := PAb32bit(FBufPos)^; Result := Result + ((TempBuffer and AbExtractMask[BitsToGo]) shl FBitsLeft); end; {$IFOPT C+} {save the number of bits peeked for an assertion check later} FPeekCount := aCount; {$ENDIF} end; {--------} function TAbDfInBitStream.PeekMoreBits(aCount : integer) : integer; var BitsToGo : integer; TempBuffer : integer; begin BitsToGo := aCount - FBitsLeft; Result := FBitBuffer; if ((FBufEnd - FBufPos) < sizeof(TAb32bit)) then if not ibsFillBuffer then TempBuffer := 0 else TempBuffer := PAb32bit(FBufPos)^ else TempBuffer := PAb32bit(FBufPos)^; Result := Result + ((TempBuffer and AbExtractMask[BitsToGo]) shl FBitsLeft); end; {--------} function TAbDfInBitStream.ReadBit : boolean; begin if (FBitsLeft = 0) then begin if ((FBufEnd - FBufPos) < sizeof(TAb32bit)) then if not ibsFillBuffer then raise EAbInternalInflateError.Create( 'no more compressed data in stream [TAbDfInBitStream.ReadBit]'); FBitBuffer := PAb32bit(FBufPos)^; inc(FBufPos, sizeof(TAb32bit)); FBitsLeft := 32; end; Result := Odd(FBitBuffer); FBitBuffer := FBitBuffer shr 1; dec(FBitsLeft); end; {--------} function TAbDfInBitStream.ReadBits(aCount : integer) : integer; var BitsToGo : integer; begin {aCount comes from a (possibly corrupt) stream, so check that it is the correct range, 1..16} if (aCount <= 0) or (aCount > 16) then raise EAbInternalInflateError.Create( 'count of bits must be between 1 and 16 inclusive [TAbDfInBitStream.ReadBits]'); {if we have more than enough bits in our bit buffer, return as many as needed, and update the bitbuffer and the number of bits left} if (aCount <= FBitsLeft) then begin Result := FBitBuffer and AbExtractMask[aCount]; FBitBuffer := FBitBuffer shr aCount; dec(FBitsLeft, aCount); end {if we have exactly enough bits in our bit buffer, return them all, and update the bitbuffer and the number of bits left} else if (aCount = FBitsLeft) then begin Result := FBitBuffer; FBitBuffer := 0; FBitsLeft := 0; end {otherwise we shall have to read another integer out of the buffer to satisfy the request} else begin BitsToGo := aCount - FBitsLeft; Result := FBitBuffer; if ((FBufEnd - FBufPos) < sizeof(TAb32bit)) then if not ibsFillBuffer then raise EAbInternalInflateError.Create( 'no more compressed data in stream [TAbDfInBitStream.ReadBits]'); FBitBuffer := PAb32bit(FBufPos)^; inc(FBufPos, sizeof(TAb32bit)); Result := Result + ((FBitBuffer and AbExtractMask[BitsToGo]) shl FBitsLeft); FBitBuffer := FBitBuffer shr BitsToGo; FBitsLeft := 32 - BitsToGo; end; end; {--------} procedure TAbDfInBitStream.ReadBuffer(var aBuffer; aCount : integer); var i : integer; Buffer : PAnsiChar; BytesToRead : integer; BytesInBuffer : integer; begin {this method is designed to read a set of bytes and this can only be done if the stream has been byte aligned--if it isn't, it's a programming error} Assert((FBitsLeft mod 8) = 0, 'TAbDfInBitStream.ReadBuffer. cannot read a buffer unless the stream is byte-aligned'); {get the address of the user buffer as a PChar: easier arithmetic} Buffer := @aBuffer; {if we have some bits left in the bit buffer, we need to copy those first} if (FBitsLeft > 0) then begin BytesToRead := FBitsLeft div 8; for i := 0 to pred(BytesToRead) do begin Buffer^ := AnsiChar(FBitBuffer and $FF); inc(Buffer); FBitBuffer := FBitBuffer shr 8; end; {calculate the count of bytes still to read} dec(aCount, BytesToRead); end; {calculate the number of bytes to copy} BytesInBuffer := FBufEnd - FBufPos; if (aCount <= BytesInBuffer) then BytesToRead := aCount else BytesToRead := BytesInBuffer; {copy the data from our buffer to the user buffer} Move(FBufPos^, Buffer^, BytesToRead); {update variables} dec(aCount, BytesToRead); inc(FBufPos, BytesToRead); {while there is still data to copy, keep on filling our internal buffer and copy it to the user buffer} while (aCount <> 0) do begin {increment the user buffer pointer past the data just copied} inc(Buffer, BytesToRead); {fill our buffer} if not ibsFillBuffer then raise EAbInternalInflateError.Create( 'no more compressed data in stream [TAbDfInBitStream.ReadBuffer]'); {calculate the number of bytes to copy} BytesInBuffer := FBufEnd - FBufPos; if (aCount <= BytesInBuffer) then BytesToRead := aCount else BytesToRead := BytesInBuffer; {copy the data from our buffer to the user buffer} Move(FBufPos^, Buffer^, BytesToRead); {update variables} dec(aCount, BytesToRead); inc(FBufPos, BytesToRead); end; {now we've copied everything over, reset the bit variables: they're empty and need refilling} FBitBuffer := 0; FBitsLeft := 0; end; {====================================================================} {===TAbDfOutBitStream================================================} constructor TAbDfOutBitStream.Create(aStream : TStream); begin {protect against dumb programming mistakes} Assert(aStream <> nil, 'TAbDfOutBitStream.Create: Cannot create a bit stream wrapping a nil stream'); {create the ancestor} inherited Create; {save the stream instance, allocate the buffer} FStream := aStream; GetMem(FBuffer, BitStreamBufferSize); FBufEnd := FBuffer + BitStreamBufferSize; FBufPos := FBuffer; end; {--------} destructor TAbDfOutBitStream.Destroy; var i : integer; begin {if the buffer was allocated...} if (FBuffer <> nil) then begin {if there are still some bits in the bit buffer...} if (FBitsUsed <> 0) then begin {pad the bit buffer to a byte boundary} AlignToByte; {empty the main buffer if there isn't enough room to copy over the 1 to 4 bytes in the bit buffer} if ((FBufEnd - FBufPos) < FBitsUsed div 8) then obsEmptyBuffer; {flush the bit buffer} for i := 1 to (FBitsUsed div 8) do begin FBufPos^ := AnsiChar(FBitBuffer); FBitBuffer := FBitBuffer shr 8; inc(FBufPos); end; end; {if there is some data in the main buffer, empty it} if (FBufPos <> FBuffer) then obsEmptyBuffer; {free the buffer} FreeMem(FBuffer); end; {destroy the ancestor} inherited Destroy; end; {--------} procedure TAbDfOutBitStream.AlignToByte; begin {round up the number of bits used to the nearest 8} FBitsUsed := (FBitsUsed + 7) and $F8; {if the bit buffer is now full, flush it to the main buffer} if (FBitsUsed = 32) then begin if ((FBufEnd - FBufPos) < sizeof(TAb32bit)) then obsEmptyBuffer; PAb32bit(FBufPos)^ := FBitBuffer; inc(FBufPos, sizeof(TAb32bit)); FBitBuffer := 0; FBitsUsed := 0; end; end; {--------} procedure TAbDfOutBitStream.obsEmptyBuffer; var ByteCount : integer; BytesWritten : longint; begin {empty the buffer} ByteCount := FBufPos - FBuffer; BytesWritten := FStream.Write(FBuffer^, ByteCount); {if we couldn't write the correct number of bytes, it's an error} if (BytesWritten <> ByteCount) then raise EAbInternalDeflateError.Create( 'could not write to the output stream [TAbDfInBitStream.obsEmptyBuffer]'); {reset the pointers} FBufPos := FBuffer; end; {--------} function TAbDfOutBitStream.Position : longint; begin Assert(false, 'TAbDfOutBitStream.Position: not implemented yet!'); Result := -1; end; {--------} procedure TAbDfOutBitStream.WriteBit(aBit : boolean); begin {only set the corresponding bit in the bit buffer if the passed bit is set (the bit buffer is set to zero when emptied, so we don't actually have to record clear bits)} if aBit then FBitBuffer := FBitBuffer or (1 shl FBitsUsed); {we've now got one more bit} inc(FBitsUsed); {if the bit buffer is now full, flush it to the main buffer} if (FBitsUsed = 32) then begin if ((FBufEnd - FBufPos) < sizeof(TAb32bit)) then obsEmptyBuffer; PAb32bit(FBufPos)^ := FBitBuffer; inc(FBufPos, sizeof(TAb32bit)); FBitBuffer := 0; FBitsUsed := 0; end; end; {--------} procedure TAbDfOutBitStream.WriteBits(aBits : integer; aCount : integer); begin {protect against programming mistakes...} {..the count should be in the range 1 to 16 (BTW, the latter is only used once: Deflate64 with length symbol 258)} Assert((0 < aCount) and (aCount <= 16), 'TAbDfOutBitStream.WriteBits: aCount should be from 1 to 16'); {..there shouldn't be more than aCount bits} Assert((aBits shr aCount) = 0, 'TAbDfOutBitStream.WriteBits: aBits has more than aCount bits'); {copy as many bits as we can to the bit buffer} FBitBuffer := FBitBuffer or (aBits shl FBitsUsed); {increment the number of bits used} inc(FBitsUsed, aCount); {if we've overshot...} if (FBitsUsed >= 32) then begin {the bit buffer is now full, so flush it} if ((FBufEnd - FBufPos) < sizeof(TAb32bit)) then obsEmptyBuffer; PAb32bit(FBufPos)^ := FBitBuffer; inc(FBufPos, sizeof(TAb32bit)); {patch up the bit buffer and the number of bits used} dec(FBitsUsed, 32); FBitBuffer := aBits shr (aCount - FBitsUsed); end; end; {--------} procedure TAbDfOutBitStream.WriteBuffer(var aBuffer; aCount : integer); var Buffer : PAnsiChar; BytesToCopy : integer; begin {guard against dumb programming errors: we must be byte aligned} Assert((FBitsUsed and $7) = 0, 'TAbDfOutBitStream.WriteBuffer: must be byte aligned'); {use the user buffer as a PChar} Buffer := @aBuffer; {flush the bit buffer to the underlying stream} while (FBitsUsed <> 0) do begin if (FBufEnd = FBufPos) then obsEmptyBuffer; FBufPos^ := AnsiChar(FBitBuffer and $FF); inc(FBufPos); FBitBuffer := FBitBuffer shr 8; dec(FBitsUsed, 8); end; {copy over the data to the underlying stream} BytesToCopy := FBufEnd - FBufPos; if (BytesToCopy > aCount) then BytesToCopy := aCount; Move(Buffer^, FBufPos^, BytesToCopy); inc(FBufPos, BytesToCopy); dec(aCount, BytesToCopy); while (aCount <> 0) do begin inc(Buffer, BytesToCopy); obsEmptyBuffer; BytesToCopy := FBufEnd - FBufPos; if (BytesToCopy > aCount) then BytesToCopy := aCount; Move(Buffer^, FBufPos^, BytesToCopy); inc(FBufPos, BytesToCopy); dec(aCount, BytesToCopy); end; {finish with a flushed buffer} obsEmptyBuffer; end; {--------} procedure TAbDfOutBitStream.WriteMoreBits(aBits : integer; aCount : integer); begin {the bit buffer is now full, so flush it} if ((FBufEnd - FBufPos) < sizeof(TAb32bit)) then obsEmptyBuffer; PAb32bit(FBufPos)^ := FBitBuffer; inc(FBufPos, sizeof(TAb32bit)); {patch up the bit buffer and the number of bits used} dec(FBitsUsed, 32); FBitBuffer := aBits shr (aCount - FBitsUsed); end; {====================================================================} {===TAbDfLZStream====================================================} const {Implementation note: this stream size has been chosen so that if the data must be stored, a block size of about 64K will result} StreamSize = 160 * 1024; type PWord = ^word; {--------} constructor TAbDfLZStream.Create(aSlideWin : TAbDfInputWindow; aUseDeflate64 : boolean; aLog : TAbLogger); begin {create the ancestor} inherited Create; {save the sliding window and the logger} FSlideWin := aSlideWin; FUseDeflate64 := aUseDeflate64; FLog := aLog; {create the buckets} New(FDistBuckets); New(FLitBuckets); {create the memory stream, allocate its buffer, position at start} GetMem(FStream, StreamSize); Clear; end; {--------} destructor TAbDfLZStream.Destroy; begin {free the buckets} if (FDistBuckets <> nil) then Dispose(FDistBuckets); if (FLitBuckets <> nil) then Dispose(FLitBuckets); {free the memory stream} if (FStream <> nil) then FreeMem(FStream); {destroy the ancestor} inherited Destroy; end; {--------} {$IFDEF UseLogging} procedure AddLenDistToLog(aLog : TAbLogger; aPosn : longint; aLen : integer; aDist : integer; aOverLap : boolean); begin {NOTE the reason for this separate routine is to avoid string allocations and try..finally blocks in the main method: an optimization issue} if aOverLap then aLog.WriteLine(Format('%8x Len: %-3d, Dist: %-5d **overlap**', [aPosn, aLen, aDist])) else aLog.WriteLine(Format('%8x Len: %-3d, Dist: %-5d', [aPosn, aLen, aDist])); end; {$ENDIF} {--------} function TAbDfLZStream.AddLenDist(aLen : integer; aDist : integer) : boolean; var LenSymbol : integer; DistSymbol : integer; CurPos : PAnsiChar; begin {$IFDEF UseLogging} {log it} if (FLog <> nil) then begin if (aLen > aDist) then AddLenDistToLog(FLog, FSWPos, aLen, aDist, true) else AddLenDistToLog(FLog, FSWPos, aLen, aDist, false); inc(FSWPos, aLen); end; {$ENDIF} {write a length/distance record to the stream} CurPos := FCurPos; CurPos^ := AnsiChar(false); inc(CurPos); PWord(CurPos)^ := word(aLen - 1); inc(CurPos, sizeof(word)); PWord(CurPos)^ := word(aDist - 1); inc(CurPos, sizeof(word)); FCurPos := CurPos; {increment the various counters} inc(FDistCount); inc(FStoredSize, aLen); {convert the length and distance to their symbols} {$IFOPT C+} {if Assertions are on} LenSymbol := AbSymbolTranslator.TranslateLength(aLen); DistSymbol := AbSymbolTranslator.TranslateDistance(aDist); {$ELSE} if (3 <= aLen) and (aLen <= 258) then LenSymbol := AbSymbolTranslator.LenSymbols[aLen-3] + 257 else LenSymbol := 285; if (aDist <= 256) then DistSymbol := AbSymbolTranslator.ShortDistSymbols[aDist - 1] else if (aDist <= 32768) then DistSymbol := AbSymbolTranslator.MediumDistSymbols[((aDist - 1) div 128) - 2] else DistSymbol := AbSymbolTranslator.LongDistSymbols[((aDist - 1) div 16384) - 2]; {$ENDIF} {increment the buckets} inc(FLitBuckets^[LenSymbol]); inc(FDistBuckets^[DistSymbol]); {return whether the stream is full and needs encoding} Result := lzsIsFull; end; {--------} {$IFDEF UseLogging} procedure AddLiteralToLog(aLog : TAbLogger; aPosn : longint; aCh : AnsiChar); begin {NOTE the reason for this separate routine is to avoid string allocations and try..finally blocks in the main method: an optimization issue} if (' ' < aCh) and (aCh <= '~') then aLog.WriteLine(Format('%8x Char: %3d $%2x [%s]', [aPosn, ord(aCh), ord(aCh), aCh])) else aLog.WriteLine(Format('%8x Char: %3d $%2x', [aPosn, ord(aCh), ord(aCh)])); end; {$ENDIF} {--------} function TAbDfLZStream.AddLiteral(aCh : AnsiChar) : boolean; var CurPos : PAnsiChar; begin {$IFDEF UseLogging} {log it} if (FLog <> nil) then begin AddLiteralToLog(FLog, FSWPos, aCh); inc(FSWPos); end; {$ENDIF} {write a literal to the internal stream} CurPos := FCurPos; CurPos^ := AnsiChar(true); inc(CurPos); CurPos^ := aCh; inc(CurPos); FCurPos := CurPos; {increment the various counters} inc(FLitCount); inc(FLitBuckets^[byte(aCh)]); inc(FStoredSize); {return whether the stream is full and needs encoding} Result := lzsIsFull; end; {--------} procedure TAbDfLZStream.Clear; begin {position the stream at the start} Rewind; {reset all variables} FStrmEnd := nil; FLitCount := 0; FDistCount := 0; FStartOfs := FSlideWin.Position; FStoredSize := 0; {$IFDEF UseLogging} FSWPos := FStartOfs; {$ENDIF} {reset the buckets} FillChar(FLitBuckets^, sizeof(FLitBuckets^), 0); FLitBuckets^[256] := 1; { end-of-block marker: it's always there...} FillChar(FDistBuckets^, sizeof(FDistBuckets^), 0); end; {--------} procedure TAbDfLZStream.Encode(aBitStrm : TAbDfOutBitStream; aLitTree : TAbDfDecodeHuffmanTree; aDistTree : TAbDfDecodeHuffmanTree; aUseDeflate64 : boolean); var Len : integer; Dist : integer; Symbol : integer; CurPos : PAnsiChar; StrmEnd : PAnsiChar; Code : longint; ExtraBits : longint; begin {rewind the LZ77 stream} Rewind; {for speed use local variables} CurPos := FCurPos; StrmEnd := FStrmEnd; {while there are still items in the stream...} while (CurPos < StrmEnd) do begin {if the next item is a literal...} if boolean(CurPos^) then begin {encode the literal character as a symbol} inc(CurPos); {$IFOPT C+} {if Assertions are on} Code := aLitTree.Encode(byte(CurPos^)); {$ELSE} Code := aLitTree.Encodes^[byte(CurPos^)]; {$ENDIF} inc(CurPos); {write the code out to the bit stream} {$IFOPT C+} aBitStrm.WriteBits(Code and $FFFF, (Code shr 16) and $FF); {$ELSE} with aBitStrm do begin BitBuffer := BitBuffer or ((Code and $FFFF) shl BitsUsed); BitsUsed := BitsUsed + ((Code shr 16) and $FF); if (BitsUsed >= 32) then WriteMoreBits(Code and $FFFF, (Code shr 16) and $FF); end; {$ENDIF} end {otherwise it's a length/distance pair} else begin {DO THE LENGTH FIRST-------------------------------------------} {get the length from the stream} inc(CurPos); Len := integer(PWord(CurPos)^) + 1; inc(CurPos, sizeof(word)); {translate it to a symbol and convert that to a code using the literal/length huffman tree} {$IFOPT C+} {if Assertions are on} Symbol := AbSymbolTranslator.TranslateLength(Len); Code := aLitTree.Encode(Symbol); {$ELSE} if (3 <= Len) and (Len <= 258) then Symbol := AbSymbolTranslator.LenSymbols[Len-3] + 257 else Symbol := 285; Code := aLitTree.Encodes^[Symbol]; {$ENDIF} {output the length code} {$IFOPT C+} aBitStrm.WriteBits(Code and $FFFF, (Code shr 16) and $FF); {$ELSE} with aBitStrm do begin BitBuffer := BitBuffer or ((Code and $FFFF) shl BitsUsed); BitsUsed := BitsUsed + ((Code shr 16) and $FF); if (BitsUsed >= 32) then WriteMoreBits(Code and $FFFF, (Code shr 16) and $FF); end; {$ENDIF} {if the length symbol were 285, its definition changes from Deflate to Deflate64, so make it a special case: for Deflate there are no extra bits, for Deflate64 output the (length - 3) as 16 bits} if (Symbol = 285) then begin if aUseDeflate64 then begin {$IFOPT C+} aBitStrm.WriteBits(Len - 3, 16); {$ELSE} with aBitStrm do begin BitBuffer := BitBuffer or ((Len - 3) shl BitsUsed); BitsUsed := BitsUsed + 16; if (BitsUsed >= 32) then WriteMoreBits(Len - 3, 16); end; {$ENDIF} end; end {otherwise if there are extra bits to be output for this length, calculate them and output them} else begin ExtraBits := Code shr 24; if (ExtraBits <> 0) then begin {$IFOPT C+} aBitStrm.WriteBits((Len - dfc_LengthBase[Symbol - 257]), ExtraBits); {$ELSE} with aBitStrm do begin BitBuffer := BitBuffer or ((Len - dfc_LengthBase[Symbol - 257]) shl BitsUsed); BitsUsed := BitsUsed + ExtraBits; if (BitsUsed >= 32) then WriteMoreBits((Len - dfc_LengthBase[Symbol - 257]), ExtraBits); end; {$ENDIF} end; end; {DO THE DISTANCE NEXT------------------------------------------} {get the distance from the stream} Dist := integer(PWord(CurPos)^) + 1; inc(CurPos, sizeof(word)); {translate it to a symbol and convert that to a code using the distance huffman tree} {$IFOPT C+} {if Assertions are on} Symbol := AbSymbolTranslator.TranslateDistance(Dist); Assert(aUseDeflate64 or (Symbol < 30), 'TAbDfLZStream.Encode: a Deflate64 distance symbol has been generated for Deflate'); Code := aDistTree.Encode(Symbol); {$ELSE} if (Dist <= 256) then Symbol := AbSymbolTranslator.ShortDistSymbols[Dist - 1] else if (Dist <= 32768) then Symbol := AbSymbolTranslator.MediumDistSymbols[((Dist - 1) div 128) - 2] else Symbol := AbSymbolTranslator.LongDistSymbols[((Dist - 1) div 16384) - 2]; Code := aDistTree.Encodes^[Symbol]; {$ENDIF} {output the distance code} {$IFOPT C+} aBitStrm.WriteBits(Code and $FFFF, (Code shr 16) and $FF); {$ELSE} with aBitStrm do begin BitBuffer := BitBuffer or ((Code and $FFFF) shl BitsUsed); BitsUsed := BitsUsed + ((Code shr 16) and $FF); if (BitsUsed >= 32) then WriteMoreBits(Code and $FFFF, (Code shr 16) and $FF); end; {$ENDIF} {if there are extra bits to be output for this distance, calculate them and output them} ExtraBits := Code shr 24; if (ExtraBits <> 0) then begin {$IFOPT C+} aBitStrm.WriteBits((Dist - dfc_DistanceBase[Symbol]), ExtraBits); {$ELSE} with aBitStrm do begin BitBuffer := BitBuffer or ((Dist - dfc_DistanceBase[Symbol]) shl BitsUsed); BitsUsed := BitsUsed + ExtraBits; if (BitsUsed >= 32) then WriteMoreBits((Dist - dfc_DistanceBase[Symbol]), ExtraBits); end; {$ENDIF} end; end; end; {clear the stream; ready for some more items} { Clear;} end; {--------} function TAbDfLZStream.lzsGetApproxSize : LongWord; var i : integer; begin {note: calculates an approximate compressed size without taking too long about it. The average encoded bit length for literals and lengths is assumed to be 8. Distances are assumed to follow the static tree definition (ie, 5 bits per distance, plus any extra bits). There are FLitCount literals, FDistCount lengths, and FDistCount distances} Result := (13 * FDistCount) + (8 * FLitCount); for i := 4 to 31 do inc(Result, FDistBuckets^[i] * dfc_DistExtraBits[i]); Result := Result div 8; end; {--------} function TAbDfLZStream.lzsGetStaticSize : integer; var i : integer; begin Result := 0; for i := 0 to 143 do inc(Result, FLitBuckets^[i] * 8); for i := 144 to 255 do inc(Result, FLitBuckets^[i] * 9); inc(Result, FLitBuckets^[256] * 7); for i := 257 to 279 do inc(Result, FLitBuckets^[i] * (7 + dfc_LitExtraBits[i - dfc_LitExtraOffset])); for i := 280 to 284 do inc(Result, FLitBuckets^[i] * (8 + dfc_LitExtraBits[i - dfc_LitExtraOffset])); if FUseDeflate64 then inc(Result, FLitBuckets^[285] * (8 + 16)) else inc(Result, FLitBuckets^[285] * 8); for i := 0 to 31 do inc(Result, FDistBuckets^[i] * (5 + dfc_DistExtraBits[i])); end; {--------} function TAbDfLZStream.lzsGetStoredSize : integer; begin Result := FStoredSize; {Result := FSlideWin.Position - FStartOfs;} end; {--------} function TAbDfLZStream.lzsIsFull : boolean; begin {if the number of hits on the (eventual) literal tree is a multiple of 8192, the stream is full if the majority were straight literals and we're getting approx 50% compression} if (((FLitCount + FDistCount) and $1FFF) = 0) then begin Result := (FDistCount < FLitCount) and (lzsGetApproxSize < (FStoredSize div 2)); if Result then Exit; end; {otherwise the stream is full if the number of hits on the literal tree or on the distance tree is 32768} { Result := (FCurPos - FStream) > (StreamSIze - 100);} Result := (FDistCount >= 32768) or ((FLitCount + FDistCount) >= 32768); end; {--------} procedure TAbDfLZStream.ReadStoredBuffer(var aBuffer; aCount : integer); begin FSlideWin.ReadBuffer(aBuffer, aCount, FStartOfs); inc(FStartOfs, aCount); end; {--------} procedure TAbDfLZStream.Rewind; begin {position the stream at the beginning} FStrmEnd := FCurPos; FCurPos := FStream; end; {====================================================================} {===TAbDfCodeLenStream===============================================} constructor TAbDfCodeLenStream.Create(aLog : TAbLogger); begin {create the ancestor} inherited Create; {allocate the stream (to contain all literals and distances and possible extra data} GetMem(FStream, (285 + 32) * 2); FPosition := FStream; {allocate the buckets} FBuckets := AllocMem(sizeof(TAbDfCodeLenBuckets)); end; {--------} destructor TAbDfCodeLenStream.Destroy; begin {free the stream} if (FStream <> nil) then FreeMem(FStream); {free the buckets} if (FBuckets <> nil) then Dispose(FBuckets); {destroy the ancestor} inherited Destroy; end; {--------} procedure TAbDfCodeLenStream.Build(const aCodeLens : array of integer; aCount : integer); var i : integer; State : (ScanStart, ScanNormal, Got2nd, Got3rd); Count : integer; ThisCount : integer; CodeLen : integer; PrevCodeLen : integer; CurPos : PAnsiChar; Buckets : PAbDfCodeLenBuckets; begin {start the automaton} State := ScanStart; CurPos := FStream; Buckets := FBuckets; Count := 0; PrevCodeLen := 0; {for all the codelengths in the array (plus a fake one at the end to ensure all codeslengths are counted)...} for i := 0 to aCount do begin {get the current codelength} if (i = aCount) then CodeLen := -1 else CodeLen := aCodeLens[i]; {switch based on the state...} case State of ScanStart : begin PrevCodeLen := CodeLen; State := ScanNormal; end; ScanNormal : begin {if the current code is the same as the previous, move to the next state} if (CodeLen = PrevCodeLen) then State := Got2nd {otherwise output the previous code} else begin CurPos^ := AnsiChar(PrevCodeLen); inc(CurPos); inc(Buckets^[PrevCodeLen]); PrevCodeLen := CodeLen; end; end; Got2nd : begin {if the current code is the same as the previous, move to the next state; we now have three similar codes in a row} if (CodeLen = PrevCodeLen) then begin State := Got3rd; Count := 3; end {otherwise output the previous two similar codes, move back to the initial state} else begin CurPos^ := AnsiChar(PrevCodeLen); inc(CurPos); CurPos^ := AnsiChar(PrevCodeLen); inc(CurPos); inc(Buckets^[PrevCodeLen], 2); PrevCodeLen := CodeLen; State := ScanNormal; end; end; Got3rd: begin {if the current code is the same as the previous, increment the count of similar codes} if (CodeLen = PrevCodeLen) then inc(Count) {otherwise we need to output the repeat values...} else begin {if the previous code were a zero code...} if (PrevCodeLen = 0) then begin {while there are zero codes to be output...} while (Count <> 0) do begin {if there are less than three zero codes, output them individually} if (Count < 3) then begin while (Count <> 0) do begin CurPos^ := #0; inc(CurPos); inc(Buckets^[0]); dec(Count); end; end {if there are less than 11 successive zero codes, output a 17 code and the count of zeros} else if (Count < 11) then begin CurPos^ := #17; inc(CurPos); inc(Buckets^[17]); CurPos^ := AnsiChar(Count - 3); inc(CurPos); Count := 0; end {otherwise output an 18 code and the count of zeros} else begin ThisCount := Count; if (ThisCount > 138) then ThisCount := 138; CurPos^ := #18; inc(CurPos); inc(Buckets^[18]); CurPos^ := AnsiChar(ThisCount - 11); inc(CurPos); dec(Count, ThisCount); end; end; end {otherwise the previous code was a non-zero code...} else begin {output the first code} CurPos^ := AnsiChar(PrevCodeLen); inc(CurPos); inc(Buckets^[PrevCodeLen]); dec(Count); {while there are more codes to be output...} while (Count <> 0) do begin {if there are less than three codes, output them individually} if (Count < 3) then begin while (Count <> 0) do begin CurPos^ := AnsiChar(PrevCodeLen); inc(CurPos); inc(Buckets^[PrevCodeLen]); dec(Count); end; end {otherwise output an 16 code and the count} else begin ThisCount := Count; if (ThisCount > 6) then ThisCount := 6; CurPos^ := #16; inc(CurPos); inc(Buckets^[16]); CurPos^ := AnsiChar(ThisCount - 3); inc(CurPos); dec(Count, ThisCount); end; end; end; {move back to the initial state} PrevCodeLen := CodeLen; State := ScanNormal; end; end; end; end; {set the read position} FStrmEnd := CurPos; FPosition := FStream; end; {--------} procedure TAbDfCodeLenStream.Encode(aBitStrm : TAbDfOutBitStream; aTree : TAbDfDecodeHuffmanTree); var Symbol : integer; ExtraData : integer; Code : longint; CurPos : PAnsiChar; StrmEnd : PAnsiChar; begin {prepare for the loop} CurPos := FPosition; StrmEnd := FStrmEnd; {while there are tokens in the stream...} while (CurPos <> StrmEnd) do begin {get the next symbol} Symbol := ord(CurPos^); inc(CurPos); {if the symbol is 0..15, get the code and output it} if (Symbol <= 15) then begin {$IFOPT C+} {if Assertions are on} Code := aTree.Encode(Symbol); {$ELSE} Code:= aTree.Encodes^[Symbol]; {$ENDIF} aBitStrm.WriteBits(Code and $FFFF, (Code shr 16) and $FF); end {otherwise the symbol is 16, 17, or 18} else begin {get the extra data} ExtraData := ord(CurPos^); inc(CurPos); {get the code and output it} {$IFOPT C+} {if Assertions are on} Code := aTree.Encode(Symbol); {$ELSE} Code:= aTree.Encodes^[Symbol]; {$ENDIF} aBitStrm.WriteBits(Code and $FFFF, (Code shr 16) and $FF); if (Symbol = 16) then aBitStrm.WriteBits(ExtraData, 2) else if (Symbol = 17) then aBitStrm.WriteBits(ExtraData, 3) else {Symbol = 18} aBitStrm.WriteBits(ExtraData, 7); end; end; end; {====================================================================} end. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abbzip2typ.pas��������������������������������������������0000644�0001750�0001750�00000033751�12014201074�022334� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * Joel Haynie * Craig Peterson * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbBzip2Typ.pas *} {*********************************************************} {* ABBREVIA: TAbBzip2Archive, TAbBzip2Item classes *} {*********************************************************} {* Misc. constants, types, and routines for working *} {* with Bzip2 files *} {*********************************************************} unit AbBzip2Typ; {$I AbDefine.inc} interface uses Classes, AbArcTyp, AbTarTyp, AbUtils; const { Default Stream Header for Bzip2s is 'BZhX', where X is the block size setting 1-9 in ASCII } { Each block has the following header: '1AY&SY', and are in units of 100kilobytes NOT 100kibiBytes } AB_BZIP2_FILE_HEADER = 'BZh'; AB_BZIP2_BLOCK_SIZE = ['1','2','3','4','5','6','7','8','9']; AB_BZIP2_BLOCK_HEADER = '1AY&SY'; { Note: $314159265359, BCD for Pi :) } { Note that Blocks are bit aligned, as such the only time you will "for sure" see the block header is on the start of stream/File } AB_BZIP2_FILE_TAIL =#23#114#36#83#133#9#0; { $1772245385090, BCD for sqrt(Pi) :) } { This is odd as the blocks are bit allgned so this is a string that is 13*4 bits = 52 bits } type PAbBzip2Header = ^TAbBzip2Header; { File Header } TAbBzip2Header = packed record { SizeOf(TAbBzip2Header) = 10 } FileHeader : array[0..2] of AnsiChar;{ 'BZh'; $42,5A,68 } BlockSize : AnsiChar; { '1'..'9'; $31-$39 } BlockHeader : array[0..5] of AnsiChar;{ '1AY&SY'; $31,41,59,26,53,59 } end; { The Purpose for this Item is the placeholder for aaAdd and aaDelete Support. } { For all intents and purposes we could just use a TAbArchiveItem } type TAbBzip2Item = class(TabArchiveItem); TAbBzip2ArchiveState = (gsBzip2, gsTar); TAbBzip2Archive = class(TAbTarArchive) private FBzip2Stream : TStream; { stream for Bzip2 file} FBzip2Item : TAbArchiveList; { item in bzip2 (only one, but need polymorphism of class)} FTarStream : TStream; { stream for possible contained Tar } FTarList : TAbArchiveList; { items in possible contained Tar } FTarAutoHandle: Boolean; FState : TAbBzip2ArchiveState; FIsBzippedTar : Boolean; procedure DecompressToStream(aStream: TStream); procedure SetTarAutoHandle(const Value: Boolean); procedure SwapToBzip2; procedure SwapToTar; protected { Inherited Abstract functions } function CreateItem(const SourceFileName : string; const ArchiveDirectory : string): TAbArchiveItem; override; procedure ExtractItemAt(Index : Integer; const NewName : string); override; procedure ExtractItemToStreamAt(Index : Integer; aStream : TStream); override; procedure LoadArchive; override; procedure SaveArchive; override; procedure TestItemAt(Index : Integer); override; function GetSupportsEmptyFolders : Boolean; override; public {methods} constructor CreateFromStream(aStream : TStream; const aArchiveName : string); override; destructor Destroy; override; procedure DoSpanningMediaRequest(Sender : TObject; ImageNumber : Integer; var ImageName : string; var Abort : Boolean); override; { Properties } property TarAutoHandle : Boolean read FTarAutoHandle write SetTarAutoHandle; property IsBzippedTar : Boolean read FIsBzippedTar write FIsBzippedTar; end; function VerifyBzip2(Strm : TStream) : TAbArchiveType; implementation uses {$IFDEF MSWINDOWS} Windows, // Fix inline warnings {$ENDIF} StrUtils, SysUtils, AbBzip2, AbExcept, AbVMStrm, AbBitBkt, DCOSUtils, DCClassesUtf8; { ****************** Helper functions Not from Classes Above ***************** } function VerifyHeader(const Header : TAbBzip2Header) : Boolean; begin Result := (Header.FileHeader = AB_BZIP2_FILE_HEADER) and (Header.BlockSize in AB_BZIP2_BLOCK_SIZE) and (Header.BlockHeader = AB_BZIP2_BLOCK_HEADER); end; { -------------------------------------------------------------------------- } function VerifyBzip2(Strm : TStream) : TAbArchiveType; var Hdr : TAbBzip2Header; CurPos : int64; DecompStream, TarStream: TStream; begin Result := atUnknown; CurPos := Strm.Position; Strm.Seek(0, soFromBeginning); try if (Strm.Read(Hdr, SizeOf(Hdr)) = SizeOf(Hdr)) and VerifyHeader(Hdr) then begin Result := atBzip2; { Check for embedded TAR } Strm.Seek(0, soFromBeginning); DecompStream := TBZDecompressionStream.Create(Strm); try TarStream := TMemoryStream.Create; try TarStream.CopyFrom(DecompStream, 512 * 2); TarStream.Seek(0, soFromBeginning); if VerifyTar(TarStream) = atTar then Result := atBzippedTar; finally TarStream.Free; end; finally DecompStream.Free; end; end; except on EReadError do Result := atUnknown; end; Strm.Position := CurPos; { Return to original position. } end; { ****************************** TAbBzip2Archive ***************************** } constructor TAbBzip2Archive.CreateFromStream(aStream: TStream; const aArchiveName: string); begin inherited CreateFromStream(aStream, aArchiveName); FState := gsBzip2; FBzip2Stream := FStream; FBzip2Item := FItemList; FTarStream := TAbVirtualMemoryStream.Create; FTarList := TAbArchiveList.Create(True); end; { -------------------------------------------------------------------------- } procedure TAbBzip2Archive.SwapToTar; begin FStream := FTarStream; FItemList := FTarList; FState := gsTar; end; { -------------------------------------------------------------------------- } procedure TAbBzip2Archive.SwapToBzip2; begin FStream := FBzip2Stream; FItemList := FBzip2Item; FState := gsBzip2; end; { -------------------------------------------------------------------------- } function TAbBzip2Archive.CreateItem(const SourceFileName : string; const ArchiveDirectory : string): TAbArchiveItem; var Bz2Item : TAbBzip2Item; FullSourceFileName, FullArchiveFileName: String; begin if IsBzippedTar and TarAutoHandle then begin SwapToTar; Result := inherited CreateItem(SourceFileName, ArchiveDirectory); end else begin SwapToBzip2; Bz2Item := TAbBzip2Item.Create; try MakeFullNames(SourceFileName, ArchiveDirectory, FullSourceFileName, FullArchiveFileName); Bz2Item.FileName := FullArchiveFileName; Bz2Item.DiskFileName := FullSourceFileName; Result := Bz2Item; except Result := nil; raise; end; end; end; { -------------------------------------------------------------------------- } destructor TAbBzip2Archive.Destroy; begin SwapToBzip2; FTarList.Free; FTarStream.Free; inherited Destroy; end; { -------------------------------------------------------------------------- } procedure TAbBzip2Archive.ExtractItemAt(Index: Integer; const NewName: string); var OutStream : TStream; begin if IsBzippedTar and TarAutoHandle then begin SwapToTar; inherited ExtractItemAt(Index, NewName); end else begin SwapToBzip2; OutStream := TFileStreamEx.Create(NewName, fmCreate or fmShareDenyNone); try try ExtractItemToStreamAt(Index, OutStream); finally OutStream.Free; end; { Bz2 doesn't store the last modified time or attributes, so don't set them } except on E : EAbUserAbort do begin FStatus := asInvalid; if mbFileExists(NewName) then mbDeleteFile(NewName); raise; end else begin if mbFileExists(NewName) then mbDeleteFile(NewName); raise; end; end; end; end; { -------------------------------------------------------------------------- } procedure TAbBzip2Archive.ExtractItemToStreamAt(Index: Integer; aStream: TStream); begin if IsBzippedTar and TarAutoHandle then begin SwapToTar; inherited ExtractItemToStreamAt(Index, aStream); end else begin SwapToBzip2; { Index ignored as there's only one item in a Bz2 } DecompressToStream(aStream); end; end; { -------------------------------------------------------------------------- } function TAbBzip2Archive.GetSupportsEmptyFolders : Boolean; begin Result := IsBzippedTar and TarAutoHandle; end; { -------------------------------------------------------------------------- } procedure TAbBzip2Archive.LoadArchive; var Item: TAbBzip2Item; Abort: Boolean; ItemName: string; begin if FBzip2Stream.Size = 0 then Exit; if IsBzippedTar and TarAutoHandle then begin { Decompress and send to tar LoadArchive } DecompressToStream(FTarStream); SwapToTar; inherited LoadArchive; end else begin SwapToBzip2; Item := TAbBzip2Item.Create; Item.Action := aaNone; { Filename isn't stored, so constuct one based on the archive name } ItemName := ExtractFileName(ArchiveName); if ItemName = '' then Item.FileName := 'unknown' else if AnsiEndsText('.tbz', ItemName) or AnsiEndsText('.tbz2', ItemName) then Item.FileName := ChangeFileExt(ItemName, '.tar') else Item.FileName := ChangeFileExt(ItemName, ''); Item.DiskFileName := Item.FileName; FItemList.Add(Item); end; DoArchiveProgress(100, Abort); FIsDirty := False; end; { -------------------------------------------------------------------------- } procedure TAbBzip2Archive.SaveArchive; var CompStream: TStream; i: Integer; CurItem: TAbBzip2Item; InputFileStream: TStream; begin if IsBzippedTar and TarAutoHandle then begin SwapToTar; inherited SaveArchive; FTarStream.Position := 0; FBzip2Stream.Size := 0; CompStream := TBZCompressionStream.Create(bs9, FBzip2Stream); try CompStream.CopyFrom(FTarStream, 0); finally CompStream.Free; end; end else begin { Things we know: There is only one file per archive.} { Actions we have to address in SaveArchive: } { aaNone & aaMove do nothing, as the file does not change, only the meta data } { aaDelete could make a zero size file unless there are two files in the list.} { aaAdd, aaStreamAdd, aaFreshen, & aaReplace will be the only ones to take action. } SwapToBzip2; for i := 0 to pred(Count) do begin FCurrentItem := ItemList[i]; CurItem := TAbBzip2Item(ItemList[i]); case CurItem.Action of aaNone, aaMove: Break;{ Do nothing; bz2 doesn't store metadata } aaDelete: ; {doing nothing omits file from new stream} aaAdd, aaFreshen, aaReplace, aaStreamAdd: begin FBzip2Stream.Size := 0; CompStream := TBZCompressionStream.Create(bs9, FBzip2Stream); try if CurItem.Action = aaStreamAdd then CompStream.CopyFrom(InStream, 0){ Copy/compress entire Instream to FBzip2Stream } else begin InputFileStream := TFileStreamEx.Create(CurItem.DiskFileName, fmOpenRead or fmShareDenyWrite ); try CompStream.CopyFrom(InputFileStream, 0);{ Copy/compress entire Instream to FBzip2Stream } finally InputFileStream.Free; end; end; finally CompStream.Free; end; Break; end; { End aaAdd, aaFreshen, aaReplace, & aaStreamAdd } end; { End of CurItem.Action Case } end; { End Item for loop } end; { End Tar Else } end; { -------------------------------------------------------------------------- } procedure TAbBzip2Archive.SetTarAutoHandle(const Value: Boolean); begin if Value then SwapToTar else SwapToBzip2; FTarAutoHandle := Value; end; { -------------------------------------------------------------------------- } procedure TAbBzip2Archive.DecompressToStream(aStream: TStream); const BufSize = $F000; var DecompStream: TBZDecompressionStream; Buffer: PByte; N: Integer; begin DecompStream := TBZDecompressionStream.Create(FBzip2Stream); try GetMem(Buffer, BufSize); try N := DecompStream.Read(Buffer^, BufSize); while N > 0 do begin aStream.WriteBuffer(Buffer^, N); N := DecompStream.Read(Buffer^, BufSize); end; finally FreeMem(Buffer, BufSize); end; finally DecompStream.Free; end; end; { -------------------------------------------------------------------------- } procedure TAbBzip2Archive.TestItemAt(Index: Integer); var Bzip2Type: TAbArchiveType; BitBucket: TAbBitBucketStream; begin if IsBzippedTar and TarAutoHandle then begin SwapToTar; inherited TestItemAt(Index); end else begin { note Index ignored as there's only one item in a GZip } Bzip2Type := VerifyBzip2(FBzip2Stream); if not (Bzip2Type in [atBzip2, atBzippedTar]) then raise EAbGzipInvalid.Create;// TODO: Add bzip2-specific exceptions } BitBucket := TAbBitBucketStream.Create(1024); try DecompressToStream(BitBucket); finally BitBucket.Free; end; end; end; { -------------------------------------------------------------------------- } procedure TAbBzip2Archive.DoSpanningMediaRequest(Sender: TObject; ImageNumber: Integer; var ImageName: string; var Abort: Boolean); begin Abort := False; end; end. �����������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abbzip2.pas�����������������������������������������������0000644�0001750�0001750�00000066110�12014201074�021572� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * This program, "bzip2", the associated library "libbzip2", and all * documentation, are copyright (C) 1996-2007 Julian R Seward. All * rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. The origin of this software must not be misrepresented; you must * not claim that you wrote the original software. If you use this * software in a product, an acknowledgment in the product * documentation would be appreciated but is not required. * * 3. Altered source versions must be plainly marked as such, and must * not be misrepresented as being the original software. * * 4. The name of the author may not be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Julian Seward, jseward@bzip.org * bzip2/libbzip2 version 1.0.5 of 10 December 2007 * * Pascal wrapper created by Edison Mera, version 1.04 * http://edisonlife.homelinux.com/ * * Dynamic and runtime linking and Win64/OS X/Linux support by Craig Peterson * http://tpabbrevia.sourceforge.net/ * ***** END LICENSE BLOCK ***** *) unit AbBzip2; {$I AbDefine.inc} interface uses SysUtils, Classes; type TAlloc = function(opaque: Pointer; Items, Size: Integer): Pointer; cdecl; TFree = procedure(opaque, Block: Pointer); cdecl; // Internal structure. Ignore. TBZStreamRec = record next_in: PByte; // next input byte avail_in: Integer; // number of bytes available at next_in total_in_lo32: Integer; // total nb of input bytes read so far total_in_hi32: Integer; next_out: PByte; // next output byte should be put here avail_out: Integer; // remaining free space at next_out total_out_lo32: Integer; // total nb of bytes output so far total_out_hi32: Integer; state: Pointer; bzalloc: TAlloc; // used to allocate the internal state bzfree: TFree; // used to free the internal state opaque: Pointer; end; // Abstract ancestor class TCustomBZip2Stream = class(TStream) private FStrm: TStream; FStrmPos: Int64; FOnProgress: TNotifyEvent; FBZRec: TBZStreamRec; FBuffer: array[Word] of Byte; protected procedure Progress(Sender: TObject); dynamic; property OnProgress: TNotifyEvent read FOnProgress write FOnProgress; constructor Create(Strm: TStream); end; { TBZCompressionStream compresses data on the fly as data is written to it, and stores the compressed data to another stream. TBZCompressionStream is write-only and strictly sequential. Reading from the stream will raise an exception. Using Seek to move the stream pointer will raise an exception. Output data is cached internally, written to the output stream only when the internal output buffer is full. All pending output data is flushed when the stream is destroyed. The Position property returns the number of uncompressed bytes of data that have been written to the stream so far. CompressionRate returns the on-the-fly percentage by which the original data has been compressed: (1 - (CompressedBytes / UncompressedBytes)) * 100 If raw data size = 100 and compressed data size = 25, the CompressionRate is 75% The OnProgress event is called each time the output buffer is filled and written to the output stream. This is useful for updating a progress indicator when you are writing a large chunk of data to the compression stream in a single call.} TBlockSize100k = (bs1, bs2, bs3, bs4, bs5, bs6, bs7, bs8, bs9); TBZCompressionStream = class(TCustomBZip2Stream) private function GetCompressionRate: Single; public constructor Create(BlockSize100k: TBlockSize100k; Dest: TStream); destructor Destroy; override; function Read(var Buffer; Count: Longint): Longint; override; function Write(const Buffer; Count: Longint): Longint; override; function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override; property CompressionRate: Single read GetCompressionRate; property OnProgress; end; { TDecompressionStream decompresses data on the fly as data is read from it. Compressed data comes from a separate source stream. TDecompressionStream is read-only and unidirectional; you can seek forward in the stream, but not backwards. The special case of setting the stream position to zero is allowed. Seeking forward decompresses data until the requested position in the uncompressed data has been reached. Seeking backwards, seeking relative to the end of the stream, requesting the size of the stream, and writing to the stream will raise an exception. The Position property returns the number of bytes of uncompressed data that have been read from the stream so far. The OnProgress event is called each time the internal input buffer of compressed data is exhausted and the next block is read from the input stream. This is useful for updating a progress indicator when you are reading a large chunk of data from the decompression stream in a single call.} TBZDecompressionStream = class(TCustomBZip2Stream) public constructor Create(Source: TStream); destructor Destroy; override; function Read(var Buffer; Count: Longint): Longint; override; function Write(const Buffer; Count: Longint): Longint; override; function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override; property OnProgress; end; { CompressBuf compresses data, buffer to buffer, in one call. In: InBuf = ptr to compressed data InBytes = number of bytes in InBuf Out: OutBuf = ptr to newly allocated buffer containing decompressed data OutBytes = number of bytes in OutBuf } procedure BZCompressBuf(const InBuf: Pointer; InBytes: Integer; out OutBuf: Pointer; out OutBytes: Integer); { DecompressBuf decompresses data, buffer to buffer, in one call. In: InBuf = ptr to compressed data InBytes = number of bytes in InBuf OutEstimate = zero, or est. size of the decompressed data Out: OutBuf = ptr to newly allocated buffer containing decompressed data OutBytes = number of bytes in OutBuf } procedure BZDecompressBuf(const InBuf: Pointer; InBytes: Integer; OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer); type EBZip2Error = class(Exception); EBZCompressionError = class(EBZip2Error); EBZDecompressionError = class(EBZip2Error); implementation // Compile for Win64 using MSVC // <Path To MSVC>\bin\x86_amd64\cl.exe -c -nologo -GS- -Z7 -wd4086 -Gs32768 // -DBZ_NO_STDIO blocksort.c huffman.c compress.c decompress.c bzlib.c uses {$IFDEF Bzip2Runtime} {$IF DEFINED(FPC)} dynlibs, {$ELSEIF DEFINED(MSWINDOWS)} Windows, {$IFEND} {$ENDIF} AbUtils; {$IFDEF Bzip2Static} {$IF DEFINED(WIN32)} {$L Win32\blocksort.obj} {$L Win32\huffman.obj} {$L Win32\compress.obj} {$L Win32\decompress.obj} {$L Win32\bzlib.obj} {$ELSEIF DEFINED(WIN64)} {$L Win64\blocksort.obj} {$L Win64\huffman.obj} {$L Win64\compress.obj} {$L Win64\decompress.obj} {$L Win64\bzlib.obj} {$IFEND} procedure BZ2_hbMakeCodeLengths; external; procedure BZ2_blockSort; external; procedure BZ2_hbCreateDecodeTables; external; procedure BZ2_hbAssignCodes; external; procedure BZ2_compressBlock; external; procedure BZ2_decompress; external; {$ENDIF} type TLargeInteger = record case Integer of 0: ( LowPart: LongWord; HighPart: LongWord); 1: ( QuadPart: Int64); end; const BZ_RUN = 0; BZ_FLUSH = 1; BZ_FINISH = 2; BZ_OK = 0; BZ_RUN_OK = 1; BZ_FLUSH_OK = 2; BZ_FINISH_OK = 3; BZ_STREAM_END = 4; BZ_SEQUENCE_ERROR = (-1); BZ_PARAM_ERROR = (-2); BZ_MEM_ERROR = (-3); BZ_DATA_ERROR = (-4); BZ_DATA_ERROR_MAGIC = (-5); BZ_IO_ERROR = (-6); BZ_UNEXPECTED_EOF = (-7); BZ_OUTBUFF_FULL = (-8); BZ_BLOCK_SIZE_100K = 9; {$IFDEF Bzip2Static} BZ2_rNums: array[0..511] of Longint = ( 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, 936, 638 ); BZ2_crc32Table: array[0..255] of Longint = ( $00000000, $04C11DB7, $09823B6E, $0D4326D9, $130476DC, $17C56B6B, $1A864DB2, $1E475005, $2608EDB8, $22C9F00F, $2F8AD6D6, $2B4BCB61, $350C9B64, $31CD86D3, $3C8EA00A, $384FBDBD, $4C11DB70, $48D0C6C7, $4593E01E, $4152FDA9, $5F15ADAC, $5BD4B01B, $569796C2, $52568B75, $6A1936C8, $6ED82B7F, $639B0DA6, $675A1011, $791D4014, $7DDC5DA3, $709F7B7A, $745E66CD, -$67DC4920, -$631D54A9, -$6E5E7272, -$6A9F6FC7, -$74D83FC4, -$70192275, -$7D5A04AE, -$799B191B, -$41D4A4A8, -$4515B911, -$48569FCA, -$4C97827F, -$52D0D27C, -$5611CFCD, -$5B52E916, -$5F93F4A3, -$2BCD9270, -$2F0C8FD9, -$224FA902, -$268EB4B7, -$38C9E4B4, -$3C08F905, -$314BDFDE, -$358AC26B, -$0DC57FD8, -$09046261, -$044744BA, -$0086590F, -$1EC1090C, -$1A0014BD, -$17433266, -$13822FD3, $34867077, $30476DC0, $3D044B19, $39C556AE, $278206AB, $23431B1C, $2E003DC5, $2AC12072, $128E9DCF, $164F8078, $1B0CA6A1, $1FCDBB16, $018AEB13, $054BF6A4, $0808D07D, $0CC9CDCA, $7897AB07, $7C56B6B0, $71159069, $75D48DDE, $6B93DDDB, $6F52C06C, $6211E6B5, $66D0FB02, $5E9F46BF, $5A5E5B08, $571D7DD1, $53DC6066, $4D9B3063, $495A2DD4, $44190B0D, $40D816BA, -$535A3969, -$579B24E0, -$5AD80207, -$5E191FB2, -$405E4FB5, -$449F5204, -$49DC74DB, -$4D1D696E, -$7552D4D1, -$7193C968, -$7CD0EFBF, -$7811F20A, -$6656A20D, -$6297BFBC, -$6FD49963, -$6B1584D6, -$1F4BE219, -$1B8AFFB0, -$16C9D977, -$1208C4C2, -$0C4F94C5, -$088E8974, -$05CDAFAB, -$010CB21E, -$39430FA1, -$3D821218, -$30C134CF, -$3400297A, -$2A47797D, -$2E8664CC, -$23C54213, -$27045FA6, $690CE0EE, $6DCDFD59, $608EDB80, $644FC637, $7A089632, $7EC98B85, $738AAD5C, $774BB0EB, $4F040D56, $4BC510E1, $46863638, $42472B8F, $5C007B8A, $58C1663D, $558240E4, $51435D53, $251D3B9E, $21DC2629, $2C9F00F0, $285E1D47, $36194D42, $32D850F5, $3F9B762C, $3B5A6B9B, $0315D626, $07D4CB91, $0A97ED48, $0E56F0FF, $1011A0FA, $14D0BD4D, $19939B94, $1D528623, -$0ED0A9F2, -$0A11B447, -$075292A0, -$03938F29, -$1DD4DF2E, -$1915C29B, -$1456E444, -$1097F9F5, -$28D8444A, -$2C1959FF, -$215A7F28, -$259B6291, -$3BDC3296, -$3F1D2F23, -$325E09FC, -$369F144D, -$42C17282, -$46006F37, -$4B4349F0, -$4F825459, -$51C5045E, -$550419EB, -$58473F34, -$5C862285, -$64C99F3A, -$6008828F, -$6D4BA458, -$698AB9E1, -$77CDE9E6, -$730CF453, -$7E4FD28C, -$7A8ECF3D, $5D8A9099, $594B8D2E, $5408ABF7, $50C9B640, $4E8EE645, $4A4FFBF2, $470CDD2B, $43CDC09C, $7B827D21, $7F436096, $7200464F, $76C15BF8, $68860BFD, $6C47164A, $61043093, $65C52D24, $119B4BE9, $155A565E, $18197087, $1CD86D30, $029F3D35, $065E2082, $0B1D065B, $0FDC1BEC, $3793A651, $3352BBE6, $3E119D3F, $3AD08088, $2497D08D, $2056CD3A, $2D15EBE3, $29D4F654, -$3A56D987, -$3E97C432, -$33D4E2E9, -$3715FF60, -$2952AF5B, -$2D93B2EE, -$20D09435, -$24118984, -$1C5E343F, -$189F298A, -$15DC0F51, -$111D12E8, -$0F5A42E3, -$0B9B5F56, -$06D8798D, -$0219643C, -$764702F7, -$72861F42, -$7FC53999, -$7B042430, -$6543742B, -$6182699E, -$6CC14F45, -$680052F4, -$504FEF4F, -$548EF2FA, -$59CDD421, -$5D0CC998, -$434B9993, -$478A8426, -$4AC9A2FD, -$4E08BF4C ); procedure bz_internal_error(errcode: Integer); cdecl; begin raise EBZip2Error.CreateFmt('Compression Error %d', [errcode]); end; { _bz_internal_error } function malloc(size: Integer): Pointer; cdecl; begin GetMem(Result, Size); end; { _malloc } procedure free(block: Pointer); cdecl; begin FreeMem(block); end; { _free } {$ENDIF} const libbz2 = {$IF DEFINED(MSWINDOWS)}'bz2.dll' {$ELSEIF DEFINED(DARWIN)}'libbz2.dylib' {$ELSE}'libbz2.so.1'{$IFEND}; {$IFDEF Bzip2Runtime} var hBzip2: HMODULE; // deflate compresses data BZ2_bzCompressInit: function(var strm: TBZStreamRec; blockSize100k: Integer; verbosity: Integer; workFactor: Integer): Integer; {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF} BZ2_bzCompress: function(var strm: TBZStreamRec; action: Integer): Integer; {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF} BZ2_bzCompressEnd: function (var strm: TBZStreamRec): Integer; {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF} BZ2_bzBuffToBuffCompress: function(dest: Pointer; var destLen: Integer; source: Pointer; sourceLen, blockSize100k, verbosity, workFactor: Integer): Integer; {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF} // inflate decompresses data BZ2_bzDecompressInit: function(var strm: TBZStreamRec; verbosity: Integer; small: Integer): Integer; {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF} BZ2_bzDecompress: function(var strm: TBZStreamRec): Integer; {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF} BZ2_bzDecompressEnd: function(var strm: TBZStreamRec): Integer; {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF} BZ2_bzBuffToBuffDecompress: function(dest: Pointer; var destLen: Integer; source: Pointer; sourceLen, small, verbosity: Integer): Integer; {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF} {$ELSE} // deflate compresses data function BZ2_bzCompressInit(var strm: TBZStreamRec; blockSize100k: Integer; verbosity: Integer; workFactor: Integer): Integer; {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF} external {$IFDEF Bzip2Dynamic}libbz2{$ENDIF} {$IFDEF DARWIN}name '_BZ2_bzCompressInit'{$ENDIF}; function BZ2_bzCompress(var strm: TBZStreamRec; action: Integer): Integer; {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF} external {$IFDEF Bzip2Dynamic}libbz2{$ENDIF} {$IFDEF DARWIN}name '_BZ2_bzCompress'{$ENDIF}; function BZ2_bzCompressEnd(var strm: TBZStreamRec): Integer; {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF} external {$IFDEF Bzip2Dynamic}libbz2{$ENDIF} {$IFDEF DARWIN}name '_BZ2_bzCompressEnd'{$ENDIF}; function BZ2_bzBuffToBuffCompress(dest: Pointer; var destLen: Integer; source: Pointer; sourceLen, blockSize100k, verbosity, workFactor: Integer): Integer; {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF} external {$IFDEF Bzip2Dynamic}libbz2{$ENDIF} {$IFDEF DARWIN}name '_BZ2_bzBuffToBuffCompress'{$ENDIF}; // inflate decompresses data function BZ2_bzDecompressInit(var strm: TBZStreamRec; verbosity: Integer; small: Integer): Integer; {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF} external {$IFDEF Bzip2Dynamic}libbz2{$ENDIF} {$IFDEF DARWIN}name '_BZ2_bzDecompressInit'{$ENDIF}; function BZ2_bzDecompress(var strm: TBZStreamRec): Integer; {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF} external {$IFDEF Bzip2Dynamic}libbz2{$ENDIF} {$IFDEF DARWIN}name '_BZ2_bzDecompress'{$ENDIF}; function BZ2_bzDecompressEnd(var strm: TBZStreamRec): Integer; {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF} external {$IFDEF Bzip2Dynamic}libbz2{$ENDIF} {$IFDEF DARWIN}name '_BZ2_bzDecompressEnd'{$ENDIF}; function BZ2_bzBuffToBuffDecompress(dest: Pointer; var destLen: Integer; source: Pointer; sourceLen, small, verbosity: Integer): Integer; {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF} external {$IFDEF Bzip2Dynamic}libbz2{$ENDIF} {$IFDEF DARWIN}name '_BZ2_bzBuffToBuffDecompress'{$ENDIF}; {$ENDIF} procedure LoadBzip2DLL; begin {$IFDEF Bzip2Runtime} if hBzip2 <> 0 then Exit; hBzip2 := LoadLibrary(libbz2); if hBzip2 = 0 then raise EBZip2Error.Create('Bzip2 shared library not found'); @BZ2_bzCompressInit := GetProcAddress(hBzip2, 'BZ2_bzCompressInit'); @BZ2_bzCompress := GetProcAddress(hBzip2, 'BZ2_bzCompress'); @BZ2_bzCompressEnd := GetProcAddress(hBzip2, 'BZ2_bzCompressEnd'); @BZ2_bzBuffToBuffCompress := GetProcAddress(hBzip2, 'BZ2_bzBuffToBuffCompress'); @BZ2_bzDecompressInit := GetProcAddress(hBzip2, 'BZ2_bzDecompressInit'); @BZ2_bzDecompress := GetProcAddress(hBzip2, 'BZ2_bzDecompress'); @BZ2_bzDecompressEnd := GetProcAddress(hBzip2, 'BZ2_bzDecompressEnd'); @BZ2_bzBuffToBuffDecompress := GetProcAddress(hBzip2, 'BZ2_bzBuffToBuffDecompress'); {$ENDIF} end; function bzip2AllocMem(AppData: Pointer; Items, Size: Integer): Pointer; cdecl; begin GetMem(Result, Items * Size); end; { bzip2AllocMem } procedure bzip2FreeMem(AppData, Block: Pointer); cdecl; begin FreeMem(Block); end; { bzip2FreeMem } function CCheck(code: Integer): Integer; begin Result := code; if code < 0 then raise EBZCompressionError.CreateFmt('error %d', [code]); //!! end; { CCheck } function DCheck(code: Integer): Integer; begin Result := code; if code < 0 then raise EBZDecompressionError.CreateFmt('error %d', [code]); //!! end; { DCheck } procedure BZCompressBuf(const InBuf: Pointer; InBytes: Integer; out OutBuf: Pointer; out OutBytes: Integer); var strm: TBZStreamRec; P: Pointer; begin LoadBzip2DLL; FillChar(strm, sizeof(strm), 0); strm.bzalloc := bzip2AllocMem; strm.bzfree := bzip2FreeMem; OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255; GetMem(OutBuf, OutBytes); try strm.next_in := InBuf; strm.avail_in := InBytes; strm.next_out := OutBuf; strm.avail_out := OutBytes; CCheck(BZ2_bzCompressInit(strm, 9, 0, 0)); try while CCheck(BZ2_bzCompress(strm, BZ_FINISH)) <> BZ_STREAM_END do begin P := OutBuf; Inc(OutBytes, 256); ReallocMem(OutBuf, OutBytes); strm.next_out := OutBuf + (strm.next_out - P); strm.avail_out := 256; end; finally CCheck(BZ2_bzCompressEnd(strm)); end; ReallocMem(OutBuf, strm.total_out_lo32); OutBytes := strm.total_out_lo32; except FreeMem(OutBuf); raise end; end; procedure BZDecompressBuf(const InBuf: Pointer; InBytes: Integer; OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer); var strm: TBZStreamRec; P: Pointer; BufInc: Integer; begin LoadBzip2DLL; FillChar(strm, sizeof(strm), 0); strm.bzalloc := bzip2AllocMem; strm.bzfree := bzip2FreeMem; BufInc := (InBytes + 255) and not 255; if OutEstimate = 0 then OutBytes := BufInc else OutBytes := OutEstimate; GetMem(OutBuf, OutBytes); try strm.next_in := InBuf; strm.avail_in := InBytes; strm.next_out := OutBuf; strm.avail_out := OutBytes; DCheck(BZ2_bzDecompressInit(strm, 0, 0)); try while DCheck(BZ2_bzDecompress(strm)) <> BZ_STREAM_END do begin P := OutBuf; Inc(OutBytes, BufInc); ReallocMem(OutBuf, OutBytes); strm.next_out := OutBuf + (strm.next_out - P); strm.avail_out := BufInc; end; finally DCheck(BZ2_bzDecompressEnd(strm)); end; ReallocMem(OutBuf, strm.total_out_lo32); OutBytes := strm.total_out_lo32; except FreeMem(OutBuf); raise end; end; // TCustomBZip2Stream constructor TCustomBZip2Stream.Create(Strm: TStream); begin inherited Create; FStrm := Strm; FStrmPos := Strm.Position; FBZRec.bzalloc := bzip2AllocMem; FBZRec.bzfree := bzip2FreeMem; end; procedure TCustomBZip2Stream.Progress(Sender: TObject); begin if Assigned(FOnProgress) then FOnProgress(Sender); end; { TCustomBZip2Stream } // TBZCompressionStream constructor TBZCompressionStream.Create(BlockSize100k: TBlockSize100k; Dest: TStream); const BlockSizes: array[TBlockSize100k] of ShortInt = (1, 2, 3, 4, 5, 6, 7, 8, 9); begin inherited Create(Dest); LoadBzip2DLL; FBZRec.next_out := @FBuffer[0]; FBZRec.avail_out := sizeof(FBuffer); CCheck(BZ2_bzCompressInit(FBZRec, BlockSizes[BlockSize100k], 0, 0)); end; destructor TBZCompressionStream.Destroy; begin if FBZRec.state <> nil then begin FBZRec.next_in := nil; FBZRec.avail_in := 0; try if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos; while (CCheck(BZ2_bzCompress(FBZRec, BZ_FINISH)) <> BZ_STREAM_END) and (FBZRec.avail_out = 0) do begin FStrm.WriteBuffer(FBuffer, sizeof(FBuffer)); FBZRec.next_out := @FBuffer[0]; FBZRec.avail_out := sizeof(FBuffer); end; if FBZRec.avail_out < sizeof(FBuffer) then FStrm.WriteBuffer(FBuffer, sizeof(FBuffer) - FBZRec.avail_out); finally BZ2_bzCompressEnd(FBZRec); end; end; inherited Destroy; end; function TBZCompressionStream.Read(var Buffer; Count: Longint): Longint; begin raise EBZCompressionError.Create('Invalid stream operation'); end; { TBZCompressionStream } function TBZCompressionStream.Write(const Buffer; Count: Longint): Longint; begin FBZRec.next_in := @Buffer; FBZRec.avail_in := Count; if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos; while (FBZRec.avail_in > 0) do begin CCheck(BZ2_bzCompress(FBZRec, BZ_RUN)); if FBZRec.avail_out = 0 then begin FStrm.WriteBuffer(FBuffer, sizeof(FBuffer)); FBZRec.next_out := @FBuffer[0]; FBZRec.avail_out := sizeof(FBuffer); FStrmPos := FStrm.Position; end; Progress(Self); end; Result := Count; end; { TBZCompressionStream } function TBZCompressionStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; var conv64 : TLargeInteger; begin if (Offset = 0) and (Origin = soCurrent) then begin conv64.LowPart := FBZRec.total_in_lo32; conv64.HighPart := FBZRec.total_in_hi32; Result := conv64.QuadPart end else raise EBZCompressionError.Create('Invalid stream operation'); end; { TBZCompressionStream } function TBZCompressionStream.GetCompressionRate: Single; var conv64In : TLargeInteger; conv64Out: TLargeInteger; begin conv64In.LowPart := FBZRec.total_in_lo32; conv64In.HighPart := FBZRec.total_in_hi32; conv64Out.LowPart := FBZRec.total_out_lo32; conv64Out.HighPart := FBZRec.total_out_hi32; if conv64In.QuadPart = 0 then Result := 0 else Result := (1.0 - (conv64Out.QuadPart / conv64In.QuadPart)) * 100.0; end; { TBZCompressionStream } // TDecompressionStream constructor TBZDecompressionStream.Create(Source: TStream); begin inherited Create(Source); LoadBzip2DLL; FBZRec.next_in := @FBuffer[0]; FBZRec.avail_in := 0; DCheck(BZ2_bzDecompressInit(FBZRec, 0, 0)); end; destructor TBZDecompressionStream.Destroy; begin if FBZRec.state <> nil then BZ2_bzDecompressEnd(FBZRec); inherited Destroy; end; function TBZDecompressionStream.Read(var Buffer; Count: Longint): Longint; begin FBZRec.next_out := @Buffer; FBZRec.avail_out := Count; if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos; while (FBZRec.avail_out > 0) do begin if FBZRec.avail_in = 0 then begin FBZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer)); if FBZRec.avail_in = 0 then begin Result := Count - FBZRec.avail_out; Exit; end; FBZRec.next_in := @FBuffer[0]; FStrmPos := FStrm.Position; end; CCheck(BZ2_bzDecompress(FBZRec)); Progress(Self); end; Result := Count; end; { TBZDecompressionStream } function TBZDecompressionStream.Write(const Buffer; Count: Longint): Longint; begin raise EBZDecompressionError.Create('Invalid stream operation'); end; { TBZDecompressionStream } function TBZDecompressionStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; var I : Integer; Buf : array[0..4095] of Char; conv64: TLargeInteger; NewOff: Int64; begin conv64.LowPart := FBZRec.total_out_lo32; conv64.HighPart := FBZRec.total_out_hi32; if (Offset = 0) and (Origin = soBeginning) then begin DCheck(BZ2_bzDecompressEnd(FBZRec)); DCheck(BZ2_bzDecompressInit(FBZRec, 0, 0)); FBZRec.next_in := @FBuffer[0]; FBZRec.avail_in := 0; FStrm.Position := 0; FStrmPos := 0; end else if ((Offset >= 0) and (Origin = soCurrent)) or (((Offset - conv64.QuadPart) > 0) and (Origin = soBeginning)) then begin NewOff := Offset; if Origin = soBeginning then Dec(NewOff, conv64.QuadPart); if NewOff > 0 then begin for I := 1 to NewOff div sizeof(Buf) do ReadBuffer(Buf, sizeof(Buf)); ReadBuffer(Buf, NewOff mod sizeof(Buf)); end; end else raise EBZDecompressionError.Create('Invalid stream operation'); Result := conv64.QuadPart; end; { TBZDecompressionStream } end. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abdfdec.pas�����������������������������������������������0000644�0001750�0001750�00000064352�12014201074�021617� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbDfDec.pas *} {*********************************************************} {* Deflate decoding unit *} {*********************************************************} unit AbDfDec; {$I AbDefine.inc} interface uses Classes, AbDfBase; function Inflate(aSource : TStream; aDest : TStream; aHelper : TAbDeflateHelper) : longint; implementation uses SysUtils, AbDfStrm, AbDfHufD, AbDfOutW, AbDfCryS; {===Helper routines==================================================} procedure ReadLitDistCodeLengths(aInStrm : TAbDfInBitStream; aCodeLenTree : TAbDfDecodeHuffmanTree; var aCodeLens : array of integer; aCount : integer; var aTotalBits : integer); var i : integer; SymbolCount : integer; LookupValue : integer; EncodedSymbol : longint; Symbol : integer; SymbolCodeLen : integer; RepeatCount : integer; BitBuffer : TAb32bit; BitCount : integer; begin {$IFDEF UseLogging} {we need to calculate the total number of bits in the code lengths for reporting purposes, so zero the count} aTotalBits := 0; {$ENDIF} {clear the code lengths array} FillChar(aCodeLens, sizeof(aCodeLens), 0); {read all the Symbols required in the bit stream} SymbolCount := 0; while (SymbolCount < aCount) do begin {grab the lookup set of bits} BitCount := aCodeLenTree.LookupBitLength + 7; {$IFOPT C+} BitBuffer := aInStrm.PeekBits(BitCount); {$ELSE} if (aInStrm.BitsLeft < BitCount) then BitBuffer := aInStrm.PeekMoreBits(BitCount) else BitBuffer := aInStrm.BitBuffer and AbExtractMask[BitCount]; {$ENDIF} LookupValue := BitBuffer and AbExtractMask[aCodeLenTree.LookupBitLength]; {get the encoded Symbol} {$IFOPT C+} {if Assertions are on} EncodedSymbol := aCodeLenTree.Decode(LookupValue); {$ELSE} EncodedSymbol := aCodeLenTree.Decodes^[LookupValue]; {$ENDIF} {extract the data} Symbol := EncodedSymbol and $FFFF; SymbolCodeLen := (EncodedSymbol shr 16) and $FF; {$IFDEF UseLogging} {keep count of the total number of bits read} inc(aTotalBits, SymbolCodeLen); {$ENDIF} {check that the symbol is between 0 and 18} if not ((0 <= Symbol) and (Symbol <= 18)) then raise EAbInternalInflateError.Create( 'decoded a symbol not between 0 and 18 {ReadLitDistCodeLengths}'); {check that the codelength is in range} if not ((0 < SymbolCodeLen) and (SymbolCodeLen <= aCodeLenTree.LookupBitLength)) then raise EAbInternalInflateError.Create( 'decoded a code length out of range {ReadLitDistCodeLengths}'); {for a Symbol of 0..15, just save the value} if (Symbol <= 15) then begin aCodeLens[SymbolCount] := Symbol; inc(SymbolCount); {$IFOPT C+} aInStrm.DiscardBits(SymbolCodeLen); {$ELSE} if (aInStrm.BitsLeft < SymbolCodeLen) then aInStrm.DiscardMoreBits(SymbolCodeLen) else begin aInStrm.BitBuffer := aInStrm.BitBuffer shr SymbolCodeLen; aInStrm.BitsLeft := aInStrm.BitsLeft - SymbolCodeLen; end; {$ENDIF} end {for a Symbol of 16, get two more bits and copy the previous code length that many times + 3} else if (Symbol = 16) then begin RepeatCount := 3 + ((BitBuffer shr SymbolCodeLen) and $3); Symbol := aCodeLens[SymbolCount-1]; for i := 0 to pred(RepeatCount) do aCodeLens[SymbolCount+i] := Symbol; inc(SymbolCount, RepeatCount); BitCount := SymbolCodeLen + 2; {$IFOPT C+} aInStrm.DiscardBits(BitCount); {$ELSE} if (aInStrm.BitsLeft < BitCount) then aInStrm.DiscardMoreBits(BitCount) else begin aInStrm.BitBuffer := aInStrm.BitBuffer shr BitCount; aInStrm.BitsLeft := aInStrm.BitsLeft - BitCount; end; {$ENDIF} {$IFDEF UseLogging} inc(aTotalBits, 2); {$ENDIF} end {for a Symbol of 17, get three more bits and copy a zero code length that many times + 3} else if (Symbol = 17) then begin RepeatCount := 3 + ((BitBuffer shr SymbolCodeLen) and $7); {note: the codelengths array was aet to zeros at the start so the following two lines are not needed for i := 0 to pred(RepeatCount) do aCodeLens[SymbolCount+i] := 0;} inc(SymbolCount, RepeatCount); BitCount := SymbolCodeLen + 3; {$IFOPT C+} aInStrm.DiscardBits(BitCount); {$ELSE} if (aInStrm.BitsLeft < BitCount) then aInStrm.DiscardMoreBits(BitCount) else begin aInStrm.BitBuffer := aInStrm.BitBuffer shr BitCount; aInStrm.BitsLeft := aInStrm.BitsLeft - BitCount; end; {$ENDIF} {$IFDEF UseLogging} inc(aTotalBits, 3); {$ENDIF} end {for a Symbol of 18, get seven more bits and copy a zero code length that many times + 11} else if (Symbol = 18) then begin RepeatCount := 11 + ((BitBuffer shr SymbolCodeLen) and $7F); {note: the codelengths array was aet to zeros at the start so the following two lines are not needed for i := 0 to pred(RepeatCount) do aCodeLens[SymbolCount+i] := 0;} inc(SymbolCount, RepeatCount); BitCount := SymbolCodeLen + 7; {$IFOPT C+} aInStrm.DiscardBits(BitCount); {$ELSE} if (aInStrm.BitsLeft < BitCount) then aInStrm.DiscardMoreBits(BitCount) else begin aInStrm.BitBuffer := aInStrm.BitBuffer shr BitCount; aInStrm.BitsLeft := aInStrm.BitsLeft - BitCount; end; {$ENDIF} {$IFDEF UseLogging} inc(aTotalBits, 7); {$ENDIF} end; end; end; {--------} procedure DecodeData(aInStrm : TAbDfInBitStream; aOutWindow : TAbDfOutputWindow; aLiteralTree : TAbDfDecodeHuffmanTree; aDistanceTree : TAbDfDecodeHuffmanTree; aDeflate64 : boolean); var LookupValue : integer; EncodedSymbol : longint; Symbol : integer; SymbolCodeLen : integer; ExtraBitCount : integer; Length : integer; Distance : integer; BitBuffer : TAb32bit; BitCount : integer; begin {extract the first symbol (it's got to be a literal/length symbol)} {..grab the lookup set of bits} if aDeflate64 then BitCount := aLiteralTree.LookupBitLength + 16 else BitCount := aLiteralTree.LookupBitLength + 5; {$IFOPT C+} BitBuffer := aInStrm.PeekBits(BitCount); {$ELSE} if (aInStrm.BitsLeft < BitCount) then BitBuffer := aInStrm.PeekMoreBits(BitCount) else BitBuffer := aInStrm.BitBuffer and AbExtractMask[BitCount]; {$ENDIF} LookupValue := BitBuffer and AbExtractMask[aLiteralTree.LookupBitLength]; {..get the encoded symbol} {$IFOPT C+} {if Assertions are on} EncodedSymbol := aLiteralTree.Decode(LookupValue); {$ELSE} EncodedSymbol := aLiteralTree.Decodes^[LookupValue]; {$ENDIF} {..extract the data} Symbol := EncodedSymbol and $FFFF; SymbolCodeLen := (EncodedSymbol shr 16) and $FF; // ExtraBitCount := EncodedSymbol shr 24; {repeat until we get the end-of-block symbol} while ((Symbol <> 256) {and (ExtraBitCount <> 15)}) do begin {for a literal, just output it to the sliding window} if (Symbol < 256) then begin aOutWindow.AddLiteral(AnsiChar(Symbol)); {$IFOPT C+} aInStrm.DiscardBits(SymbolCodeLen); {$ELSE} if (aInStrm.BitsLeft < SymbolCodeLen) then aInStrm.DiscardMoreBits(SymbolCodeLen) else begin aInStrm.BitBuffer := aInStrm.BitBuffer shr SymbolCodeLen; aInStrm.BitsLeft := aInStrm.BitsLeft - SymbolCodeLen; end; {$ENDIF} end {for a length value, we need to get any extra bits, and then the distance (plus any extra bits for that), and then add the duplicated characters to the sliding window} else begin {check that the length symbol is less than or equal to 285} if (Symbol > 285) then raise EAbInternalInflateError.Create( 'decoded an invalid length symbol: greater than 285 [DecodeData]'); {calculate the length (if need be, by calculating the number of extra bits that encode the length)} if (not aDeflate64) and (Symbol = 285) then begin Length := 258; {$IFOPT C+} aInStrm.DiscardBits(SymbolCodeLen); {$ELSE} if (aInStrm.BitsLeft < SymbolCodeLen) then aInStrm.DiscardMoreBits(SymbolCodeLen) else begin aInStrm.BitBuffer := aInStrm.BitBuffer shr SymbolCodeLen; aInStrm.BitsLeft := aInStrm.BitsLeft - SymbolCodeLen; end; {$ENDIF} end else begin ExtraBitCount := EncodedSymbol shr 24; if (ExtraBitCount = 0) then begin Length := dfc_LengthBase[Symbol - 257]; {$IFOPT C+} aInStrm.DiscardBits(SymbolCodeLen); {$ELSE} if (aInStrm.BitsLeft < SymbolCodeLen) then aInStrm.DiscardMoreBits(SymbolCodeLen) else begin aInStrm.BitBuffer := aInStrm.BitBuffer shr SymbolCodeLen; aInStrm.BitsLeft := aInStrm.BitsLeft - SymbolCodeLen; end; {$ENDIF} end else begin Length := dfc_LengthBase[Symbol - 257] + ((BitBuffer shr SymbolCodeLen) and AbExtractMask[ExtraBitCount]); BitCount := SymbolCodeLen + ExtraBitCount; {$IFOPT C+} aInStrm.DiscardBits(BitCount); {$ELSE} if (aInStrm.BitsLeft < BitCount) then aInStrm.DiscardMoreBits(BitCount) else begin aInStrm.BitBuffer := aInStrm.BitBuffer shr BitCount; aInStrm.BitsLeft := aInStrm.BitsLeft - BitCount; end; {$ENDIF} end; end; {extract the distance} {..grab the lookup set of bits} BitCount := aDistanceTree.LookupBitLength + 14; {$IFOPT C+} BitBuffer := aInStrm.PeekBits(BitCount); {$ELSE} if (aInStrm.BitsLeft < BitCount) then BitBuffer := aInStrm.PeekMoreBits(BitCount) else BitBuffer := aInStrm.BitBuffer and AbExtractMask[BitCount]; {$ENDIF} LookupValue := BitBuffer and AbExtractMask[aDistanceTree.LookupBitLength]; {..get the encoded symbol} {$IFOPT C+} {if Assertions are on} EncodedSymbol := aDistanceTree.Decode(LookupValue); {$ELSE} EncodedSymbol := aDistanceTree.Decodes^[LookupValue]; {$ENDIF} {..extract the data} Symbol := EncodedSymbol and $FFFF; SymbolCodeLen := (EncodedSymbol shr 16) and $FF; {check that the distance symbol is less than or equal to 29} if (not aDeflate64) and (Symbol > 29) then raise EAbInternalInflateError.Create( 'decoded an invalid distance symbol: greater than 29 [DecodeData]'); {..calculate the extra bits for the distance} ExtraBitCount := EncodedSymbol shr 24; {..calculate the distance} if (ExtraBitCount = 0) then begin Distance := dfc_DistanceBase[Symbol]; {$IFOPT C+} aInStrm.DiscardBits(SymbolCodeLen); {$ELSE} if (aInStrm.BitsLeft < SymbolCodeLen) then aInStrm.DiscardMoreBits(SymbolCodeLen) else begin aInStrm.BitBuffer := aInStrm.BitBuffer shr SymbolCodeLen; aInStrm.BitsLeft := aInStrm.BitsLeft - SymbolCodeLen; end; {$ENDIF} end else begin Distance := dfc_DistanceBase[Symbol] + ((BitBuffer shr SymbolCodeLen) and AbExtractMask[ExtraBitCount]); BitCount := SymbolCodeLen + ExtraBitCount; {$IFOPT C+} aInStrm.DiscardBits(BitCount); {$ELSE} if (aInStrm.BitsLeft < BitCount) then aInStrm.DiscardMoreBits(BitCount) else begin aInStrm.BitBuffer := aInStrm.BitBuffer shr BitCount; aInStrm.BitsLeft := aInStrm.BitsLeft - BitCount; end; {$ENDIF} end; {duplicate the characters in the sliding window} aOutWindow.AddLenDist(Length, Distance); end; {extract the next symbol} {..grab the lookup set of bits} if aDeflate64 then BitCount := aLiteralTree.LookupBitLength + 16 else BitCount := aLiteralTree.LookupBitLength + 5; {$IFOPT C+} BitBuffer := aInStrm.PeekBits(BitCount); {$ELSE} if (aInStrm.BitsLeft < BitCount) then BitBuffer := aInStrm.PeekMoreBits(BitCount) else BitBuffer := aInStrm.BitBuffer and AbExtractMask[BitCount]; {$ENDIF} LookupValue := BitBuffer and AbExtractMask[aLiteralTree.LookupBitLength]; {..get the encoded symbol} {$IFOPT C+} {if Assertions are on} EncodedSymbol := aLiteralTree.Decode(LookupValue); {$ELSE} EncodedSymbol := aLiteralTree.Decodes^[LookupValue]; {$ENDIF} {..extract the data} Symbol := EncodedSymbol and $FFFF; SymbolCodeLen := (EncodedSymbol shr 16) and $FF; end; {discard the bits for the end-of-block marker} {$IFOPT C+} aInStrm.DiscardBits(SymbolCodeLen); {$ELSE} if (aInStrm.BitsLeft < SymbolCodeLen) then aInStrm.DiscardMoreBits(SymbolCodeLen) else begin aInStrm.BitBuffer := aInStrm.BitBuffer shr SymbolCodeLen; aInStrm.BitsLeft := aInStrm.BitsLeft - SymbolCodeLen; end; {$ENDIF} end; {--------} procedure InflateStoredBlock(aInStrm : TAbDfInBitStream; aOutWindow : TAbDfOutputWindow; aLog : TAbLogger); const BufferSize = 16 * 1024; var LenNotLen : packed record Len : word; NotLen : word; end; BytesToGo : integer; BytesToWrite : integer; Buffer : pointer; begin {$IFDEF UseLogging} {log it} if (aLog <> nil) then aLog.WriteLine('....a stored block'); {$ENDIF} {align the input bit stream to the nearest byte boundary} aInStrm.AlignToByte; {read the length of the stored data and the notted length} aInStrm.ReadBuffer(LenNotLen, sizeof(LenNotLen)); {$IFDEF UseLogging} {log it} if (aLog <> nil) then aLog.WriteLine(Format('..block length: %d (%-4x, NOT %-4x)', [LenNotLen.Len, LenNotLen.Len, LenNotLen.NotLen])); {$ENDIF} {check that NOT of the length equals the notted length} if ((not LenNotLen.Len) <> LenNotLen.NotLen) then raise EAbInternalInflateError.Create( 'invalid stored block (length and NOT length do not match) [InflateStoredBlock]'); {calculate the number of bytes to copy from the stored block} BytesToGo := LenNotLen.Len; {allocate a large buffer} GetMem(Buffer, BufferSize); {copy all the data in the stored block to the output window} try {while there are still some bytes to copy...} while (BytesToGo <> 0) do begin {calculate the number of bytes this time} if (BytesToGo > BufferSize) then BytesToWrite := BufferSize else BytesToWrite := BytesToGo; {read that many bytes and write them to the output window} aInStrm.ReadBuffer(Buffer^, BytesToWrite); aOutWindow.AddBuffer(Buffer^, BytesToWrite); {calculate the number of bytes still to copy} dec(BytesToGo, BytesToWrite); end; finally FreeMem(Buffer); end; end; {--------} procedure InflateStaticBlock(aInStrm : TAbDfInBitStream; aOutWindow : TAbDfOutputWindow; aLog : TAbLogger; aDeflate64 : boolean); begin {$IFDEF UseLogging} {log it} if (aLog <> nil) then aLog.WriteLine('....a static huffman tree block'); {$ENDIF} {decode the data with the static trees} DecodeData(aInStrm, aOutWindow, AbStaticLiteralTree, AbStaticDistanceTree, aDeflate64); end; {--------} procedure InflateDynamicBlock(aInStrm : TAbDfInBitStream; aOutWindow : TAbDfOutputWindow; aLog : TAbLogger; aDeflate64 : boolean); var i : integer; LitCount : integer; DistCount : integer; CodeLenCount : integer; CodeLens : array [0..285+32] of integer; CodeLenTree : TAbDfDecodeHuffmanTree; LiteralTree : TAbDfDecodeHuffmanTree; DistanceTree : TAbDfDecodeHuffmanTree; TotalBits : integer; begin {$IFDEF UseLogging} {log it} if (aLog <> nil) then aLog.WriteLine('....a dynamic huffman tree block'); {$ENDIF} {prepare for the try..finally} CodeLenTree := nil; LiteralTree := nil; DistanceTree := nil; try {decode the number of literal, distance and codelength codes} LitCount := aInStrm.ReadBits(5) + 257; DistCount := aInStrm.ReadBits(5) + 1; CodeLenCount := aInStrm.ReadBits(4) + 4; {$IFDEF UseLogging} {log it} if (aLog <> nil) then begin aLog.WriteLine(Format('Count of literals: %d', [LitCount])); aLog.WriteLine(Format('Count of distances: %d', [DistCount])); aLog.WriteLine(Format('Count of code lengths: %d', [CodeLenCount])); end; {$ENDIF} {verify that the counts are valid} if (LitCount > 286) then raise EAbInternalInflateError.Create( 'count of literal codes in dynamic block is greater than 286 [InflateDynamicBlock]'); if (not aDeflate64) and (DistCount > 30) then raise EAbInternalInflateError.Create( 'count of distance codes in dynamic block is greater than 30 [InflateDynamicBlock]'); {read the codelengths} FillChar(CodeLens, 19 * sizeof(integer), 0); for i := 0 to pred(CodeLenCount) do CodeLens[dfc_CodeLengthIndex[i]] := aInStrm.ReadBits(3); {$IFDEF UseLogging} {log them} if (aLog <> nil) then begin aLog.WriteLine('CodeLength Huffman tree: code lengths'); for i := 0 to 18 do aLog.WriteStr(Format('%-3d', [CodeLens[i]])); aLog.WriteLine(''); aLog.WriteLine(Format('..total bits: %d', [CodeLenCount * 3])); end; {$ENDIF} {create the codelength huffman tree} CodeLenTree := TAbDfDecodeHuffmanTree.Create(19, 7, huDecoding); CodeLenTree.Build(CodeLens, 0, 19, [0], $FFFF); {$IFDEF UseLogging} {log the tree} if (aLog <> nil) then begin aLog.WriteLine('Code lengths tree'); CodeLenTree.DebugPrint(aLog); end; {$ENDIF} {read the codelengths for both the literal/length and distance huffman trees} ReadLitDistCodeLengths(aInStrm, CodeLenTree, CodeLens, LitCount + DistCount, TotalBits); {$IFDEF UseLoggingx} {log them} if (aLog <> nil) then begin aLog.WriteLine('Literal/length & Dist Huffman trees: code lengths'); for i := 0 to pred(LitCount + DistCount) do aLog.WriteLine(Format('%3d: %3d', [i, CodeLens[i]])); aLog.WriteLine(''); aLog.WriteLine(Format('..total bits: %d', [TotalBits])); end; {$ENDIF} {create the literal huffman tree} LiteralTree := TAbDfDecodeHuffmanTree.Create(286, 15, huDecoding); LiteralTree.Build(CodeLens, 0, LitCount, dfc_LitExtraBits, dfc_LitExtraOffset); {$IFDEF UseLogging} {log the tree} if (aLog <> nil) then begin aLog.WriteLine('Literal/length tree'); LiteralTree.DebugPrint(aLog); end; {$ENDIF} {create the distance huffman tree} if aDeflate64 then DistanceTree := TAbDfDecodeHuffmanTree.Create(32, 15, huDecoding) else DistanceTree := TAbDfDecodeHuffmanTree.Create(30, 15, huDecoding); DistanceTree.Build(CodeLens, LitCount, DistCount, dfc_DistExtraBits, dfc_DistExtraOffset); {$IFDEF UseLogging} {log the tree} if (aLog <> nil) then begin aLog.WriteLine('Distance tree'); DistanceTree.DebugPrint(aLog); end; {$ENDIF} {using the literal and distance trees, decode the bit stream} DecodeData(aInStrm, aOutWindow, LiteralTree, DistanceTree, aDeflate64); finally CodeLenTree.Free; LiteralTree.Free; DistanceTree.Free; end; end; {====================================================================} {===Interfaced routine===============================================} function Inflate(aSource : TStream; aDest : TStream; aHelper : TAbDeflateHelper) : longint; var Helper : TAbDeflateHelper; InBitStrm : TAbDfInBitStream; OutWindow : TAbDfOutputWindow; Log : TAbLogger; UseDeflate64 : boolean; UseCRC32 : boolean; IsFinalBlock : boolean; BlockType : integer; TestOnly : boolean; SourceStartPos : longint; DestStartPos : longint; {$IFDEF UseLogging} StartPosn : longint; {$ENDIF} begin {$IFDEF DefeatWarnings} Result := 0; SourceStartPos := 0; DestStartPos := 0; TestOnly := False; {$ENDIF} {$IFDEF UseLogging} StartPosn := 0; {$ENDIF} {pre-conditions: streams must be allocated of course} Assert(aSource <> nil, 'Deflate: aSource stream cannot be nil'); Assert(aDest <> nil, 'Deflate: aDest stream cannot be nil'); {prepare for the try..finally} Helper := nil; InBitStrm := nil; OutWindow := nil; Log := nil; try {finally} try {except} {create our helper; assign the passed one to it} Helper := TAbDeflateHelper.Create; if (aHelper <> nil) then Helper.Assign(aHelper); {get the initial start positions of both streams} SourceStartPos := aSource.Position; DestStartPos := aDest.Position; {if the helper's stream size is -1, and it has a progress event handler, calculate the stream size from the stream itself} if Assigned(Helper.OnProgressStep) then begin if (Helper.StreamSize = -1) then Helper.StreamSize := aSource.Size; end {otherwise we certainly can't do any progress reporting} else begin Helper.OnProgressStep := nil; Helper.StreamSize := 0; end; {create the logger, if requested} if (Helper.LogFile <> '') then begin Log := TAbLogger.Create(Helper.LogFile); Log.WriteLine('INFLATING STREAM...'); {$IFNDEF UseLogging} Log.WriteLine('Need to recompile the app with UseLogging turned on'); {$ENDIF} end; InBitStrm := TAbDfInBitStream.Create(aSource, Helper.OnProgressStep, Helper.StreamSize); {create the output sliding window} UseDeflate64 := (Helper.Options and dfc_UseDeflate64) <> 0; UseCRC32 := (Helper.Options and dfc_UseAdler32) = 0; TestOnly := (Helper.Options and dfc_TestOnly) <> 0; OutWindow := TAbDfOutputWindow.Create( aDest, UseDeflate64, UseCRC32, Helper.PartialSize, TestOnly, Log); {start decoding the deflated stream} repeat {read the final block flag and the block type} IsFinalBlock := InBitStrm.ReadBit; BlockType := InBitStrm.ReadBits(2); {$IFDEF UseLogging} {log it} if (Log <> nil) then begin Log.WriteLine(''); Log.WriteLine('Starting new block'); Log.WriteLine(Format('..final block? %d', [ord(IsFinalBlock)])); Log.WriteLine(Format('..block type? %d', [BlockType])); StartPosn := OutWindow.Position; end; {$ENDIF} case BlockType of 0 : InflateStoredBlock(InBitStrm, OutWindow, Log); 1 : InflateStaticBlock(InBitStrm, OutWindow, Log, UseDeflate64); 2 : InflateDynamicBlock(InBitStrm, OutWindow, Log, UseDeflate64); else raise EAbInternalInflateError.Create( 'starting new block, but invalid block type [Inflate]'); end; {$IFDEF UseLogging} {log it} if (Log <> nil) then Log.WriteLine(Format('---block end--- (decoded size %d bytes)', [OutWindow.Position - StartPosn])); {$ENDIF} until IsFinalBlock; {get the uncompressed stream's checksum} Result := OutWindow.Checksum; if TestOnly and (aHelper <> nil) then aHelper.NormalSize := OutWindow.Position; {$IFDEF UseLogging} {log it} if (Log <> nil) then Log.WriteLine(Format('End of compressed stream, checksum %-8x', [Result])); {$ENDIF} except on E : EAbPartSizedInflate do begin {nothing, just swallow the exception} Result := 0; end; on E : EAbAbortProgress do begin {nothing, just swallow the exception} Result := 0; end; on E : EAbInternalInflateError do begin if (Log <> nil) then Log.WriteLine(Format('Internal exception raised: %s', [E.Message])); raise EAbInflateError.Create(E.Message); end; end; finally Helper.Free; OutWindow.Free; InBitStrm.Free; Log.Free; end; {if there's a helper return the compressed and uncompressed sizes} if (aHelper <> nil) then begin if not TestOnly then aHelper.NormalSize := aDest.Position - DestStartPos; aHelper.CompressedSize := aSource.Position - SourceStartPos; end; {WARNING NOTE: the compiler will warn that the return value of this function might be undefined. However, it is wrong: it has been fooled by the code. If you don't want to see this warning again, enable the DefeatWarnings compiler define in AbDefine.inc.} end; {====================================================================} end. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abzipper.pas����������������������������������������������0000644�0001750�0001750�00000047056�12014201074�022065� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbZipper.pas *} {*********************************************************} {* ABBREVIA: Non-visual Component with Zip support *} {*********************************************************} unit AbZipper; {$I AbDefine.inc} interface uses Classes, AbBrowse, AbZBrows, AbArcTyp, AbZipTyp; type TAbCustomZipper = class(TAbCustomZipBrowser) protected {private} FAutoSave : Boolean; FCompressionMethodToUse : TAbZipSupportedMethod; FDeflationOption : TAbZipDeflationOption; FDOSMode : Boolean; FOnConfirmSave : TAbArchiveConfirmEvent; FOnSave : TAbArchiveEvent; FOnArchiveSaveProgress : TAbArchiveProgressEvent; FArchiveSaveProgressMeter : IAbProgressMeter; FStoreOptions : TAbStoreOptions; protected {methods} procedure DoConfirmSave(Sender : TObject; var Confirm : Boolean); virtual; procedure DoSave(Sender : TObject); virtual; procedure DoArchiveSaveProgress(Sender : TObject; Progress : Byte; var Abort : Boolean); procedure InitArchive; override; procedure SetAutoSave(Value : Boolean); procedure SetCompressionMethodToUse(Value : TAbZipSupportedMethod); procedure SetDeflationOption(Value : TAbZipDeflationOption); procedure SetDOSMode( Value : Boolean ); procedure SetFileName(const aFileName : string); override; procedure SetStoreOptions( Value : TAbStoreOptions ); procedure SetArchiveSaveProgressMeter(const Value: IAbProgressMeter); procedure SetZipfileComment(const Value : AnsiString); override; procedure ZipProc(Sender : TObject; Item : TAbArchiveItem; OutStream : TStream); procedure ZipFromStreamProc(Sender : TObject; Item : TAbArchiveItem; OutStream, InStream : TStream ); procedure Notification(Component: TComponent; Operation: TOperation); override; procedure ResetMeters; override; protected {properties} property AutoSave : Boolean read FAutoSave write SetAutoSave; property CompressionMethodToUse : TAbZipSupportedMethod read FCompressionMethodToUse write SetCompressionMethodToUse default AbDefCompressionMethodToUse; property DeflationOption : TAbZipDeflationOption read FDeflationOption write SetDeflationOption default AbDefDeflationOption; property DOSMode : Boolean read FDOSMode write SetDOSMode; property StoreOptions : TAbStoreOptions read FStoreOptions write SetStoreOptions default AbDefStoreOptions; property ArchiveSaveProgressMeter : IAbProgressMeter read FArchiveSaveProgressMeter write SetArchiveSaveProgressMeter; protected {events} property OnConfirmSave : TAbArchiveConfirmEvent read FOnConfirmSave write FOnConfirmSave; property OnSave : TAbArchiveEvent read FOnSave write FOnSave; property OnArchiveSaveProgress : TAbArchiveProgressEvent read FOnArchiveSaveProgress write FOnArchiveSaveProgress; public {methods} constructor Create(AOwner : TComponent); override; destructor Destroy; override; procedure AddFiles(const FileMask : string; SearchAttr : Integer); procedure AddFilesEx(const FileMask, ExclusionMask : string; SearchAttr : Integer); procedure AddFromStream(const NewName : string; FromStream : TStream); procedure DeleteAt(Index : Integer); procedure DeleteFiles(const FileMask : string); procedure DeleteFilesEx(const FileMask, ExclusionMask : string); procedure DeleteTaggedItems; procedure FreshenFiles(const FileMask : string); procedure FreshenFilesEx(const FileMask, ExclusionMask : string); procedure FreshenTaggedItems; procedure Move(aItem : TAbArchiveItem; const NewStoredPath : string); procedure Save; procedure Replace(aItem : TAbArchiveItem); end; type TAbZipper = class(TAbCustomZipper) published property ArchiveProgressMeter; property ArchiveSaveProgressMeter; property ItemProgressMeter; property AutoSave; property BaseDirectory; property CompressionMethodToUse; property DeflationOption; property DOSMode; property SpanningThreshold; property LogFile; property Logging; property OnArchiveProgress; property OnArchiveSaveProgress; property OnArchiveItemProgress; property OnChange; property OnConfirmProcessItem; property OnConfirmSave; property OnLoad; property OnProcessItemFailure; property OnRequestBlankDisk; property OnRequestImage; property OnRequestLastDisk; property OnRequestNthDisk; property OnSave; property Password; property StoreOptions; property TempDirectory; property Version; property FileName; {must be after OnLoad} end; implementation uses SysUtils, AbUtils, AbTarTyp, AbGzTyp, AbBzip2Typ, AbExcept, AbZipPrc, DCOSUtils; { -------------------------------------------------------------------------- } constructor TAbCustomZipper.Create( AOwner : TComponent ); begin inherited Create( AOwner ); CompressionMethodToUse := AbDefCompressionMethodToUse; DeflationOption := AbDefDeflationOption; StoreOptions := AbDefStoreOptions; end; { -------------------------------------------------------------------------- } destructor TAbCustomZipper.Destroy; begin inherited Destroy; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.AddFiles(const FileMask : string; SearchAttr : Integer); {Add files to the archive where the disk filespec matches} begin if (ZipArchive <> nil) then ZipArchive.AddFiles(FileMask, SearchAttr) else raise EAbNoArchive.Create; DoChange; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.AddFilesEx(const FileMask, ExclusionMask : string; SearchAttr : Integer); {Add files that match Filemask except those matching ExclusionMask} begin if (ZipArchive <> nil) then ZipArchive.AddFilesEx(FileMask, ExclusionMask, SearchAttr) else raise EAbNoArchive.Create; DoChange; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.AddFromStream(const NewName : string; FromStream : TStream); {Add stream directly to archive} begin if (ZipArchive <> nil) then begin FromStream.Position := 0; ZipArchive.AddFromStream(NewName, FromStream); end else raise EAbNoArchive.Create; DoChange; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.DeleteFiles(const FileMask : string); {delete all files from the archive that match the file mask} begin if (ZipArchive <> nil) then ZipArchive.DeleteFiles( FileMask ) else raise EAbNoArchive.Create; DoChange; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.DeleteAt(Index : Integer); {delete item at Index} begin if (ZipArchive <> nil) then ZipArchive.DeleteAt( Index ) else raise EAbNoArchive.Create; DoChange; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.DeleteFilesEx(const FileMask, ExclusionMask : string); {Delete files that match Filemask except those matching ExclusionMask} begin if (ZipArchive <> nil) then ZipArchive.DeleteFilesEx(FileMask, ExclusionMask) else raise EAbNoArchive.Create; DoChange; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.DeleteTaggedItems; {delete all tagged items from the archive} begin if (ZipArchive <> nil) then ZipArchive.DeleteTaggedItems else raise EAbNoArchive.Create; DoChange; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.DoConfirmSave(Sender : TObject; var Confirm : Boolean); begin Confirm := True; if Assigned(FOnConfirmSave) then FOnConfirmSave(Self, Confirm); end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.DoSave(Sender : TObject); begin if Assigned(FOnSave) then FOnSave(Self); end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.FreshenFiles(const FileMask : string); {freshen all items that match the file mask} begin if (ZipArchive <> nil) then ZipArchive.FreshenFiles( FileMask ) else raise EAbNoArchive.Create; DoChange; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.FreshenFilesEx(const FileMask, ExclusionMask : string); {freshen all items matching FileMask except those matching ExclusionMask} begin if (ZipArchive <> nil) then ZipArchive.FreshenFilesEx( FileMask, ExclusionMask ) else raise EAbNoArchive.Create; DoChange; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.FreshenTaggedItems; {freshen all tagged items} begin if (ZipArchive <> nil) then ZipArchive.FreshenTaggedItems else raise EAbNoArchive.Create; DoChange; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.InitArchive; begin inherited InitArchive; if (ZipArchive is TAbZipArchive) then begin {properties} ZipArchive.AutoSave := FAutoSave; TAbZipArchive(ZipArchive).CompressionMethodToUse := FCompressionMethodToUse; TAbZipArchive(ZipArchive).DeflationOption := FDeflationOption; FArchive.DOSMode := FDOSMode; ZipArchive.StoreOptions := FStoreOptions; {events} ZipArchive.OnArchiveSaveProgress := DoArchiveSaveProgress; ZipArchive.OnConfirmSave := DoConfirmSave; TAbZipArchive(ZipArchive).OnRequestBlankDisk := OnRequestBlankDisk; ZipArchive.OnSave := DoSave; TAbZipArchive(ZipArchive).InsertHelper := ZipProc; TAbZipArchive(ZipArchive).InsertFromStreamHelper := ZipFromStreamProc; end; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.Move(aItem : TAbArchiveItem; const NewStoredPath : string); {renames the item} begin if (ZipArchive <> nil) then ZipArchive.Move(aItem, NewStoredPath) else raise EAbNoArchive.Create; DoChange; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.Replace(aItem : TAbArchiveItem); {replace the item} begin if (ZipArchive <> nil) then ZipArchive.Replace( aItem ) else raise EAbNoArchive.Create; DoChange; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.Save; begin if (ZipArchive <> nil) then begin ZipArchive.Save; DoChange; end; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.SetAutoSave(Value : Boolean); begin FAutoSave := Value; if (ZipArchive <> nil) then ZipArchive.AutoSave := Value; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.SetCompressionMethodToUse( Value : TAbZipSupportedMethod); begin FCompressionMethodToUse := Value; if (ZipArchive is TAbZipArchive) then TAbZipArchive(ZipArchive).CompressionMethodToUse := Value; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.SetDeflationOption(Value : TAbZipDeflationOption); begin FDeflationOption := Value; if (ZipArchive is TAbZipArchive) then TAbZipArchive(ZipArchive).DeflationOption := Value; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.SetDOSMode(Value : Boolean); begin FDOSMode := Value; if (ZipArchive <> nil) then ZipArchive.DOSMode := Value; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.SetFileName(const aFileName : string); var ArcType : TAbArchiveType; begin FFileName := aFileName; if (csDesigning in ComponentState) then Exit; if Assigned(FArchive) then begin FArchive.Save; FreeAndNil(FArchive); end; ArcType := ArchiveType; if (FileName <> '') then if mbFileExists(FileName) then begin { open it } if not ForceType then ArcType := AbDetermineArcType(FileName, atUnknown); case ArcType of atZip, atSpannedZip, atSelfExtZip : begin FArchive := TAbZipArchive.Create(FileName, fmOpenRead or fmShareDenyNone); InitArchive; end; atTar : begin FArchive := TAbTarArchive.Create(FileName, fmOpenRead or fmShareDenyNone); inherited InitArchive; end; atGZip : begin FArchive := TAbGzipArchive.Create(FileName, fmOpenRead or fmShareDenyNone); TAbGzipArchive(FArchive).TarAutoHandle := FTarAutoHandle; TAbGzipArchive(FArchive).IsGzippedTar := False; inherited InitArchive; end; atGZippedTar : begin FArchive := TAbGzipArchive.Create(FileName, fmOpenRead or fmShareDenyNone); TAbGzipArchive(FArchive).TarAutoHandle := FTarAutoHandle; TAbGzipArchive(FArchive).IsGzippedTar := True; inherited InitArchive; end; atBzip2 : begin FArchive := TAbBzip2Archive.Create(FileName, fmOpenRead or fmShareDenyNone); TAbBzip2Archive(FArchive).TarAutoHandle := FTarAutoHandle; TAbBzip2Archive(FArchive).IsBzippedTar := False; inherited InitArchive; end; atBzippedTar : begin FArchive := TAbBzip2Archive.Create(FileName, fmOpenRead or fmShareDenyNone); TAbBzip2Archive(FArchive).TarAutoHandle := FTarAutoHandle; TAbBzip2Archive(FArchive).IsBzippedTar := True; inherited InitArchive; end; else raise EAbUnhandledType.Create; end {case}; FArchive.Load; FArchiveType := ArcType; end else begin { file doesn't exist, so create a new one } if not ForceType then ArcType := AbDetermineArcType(FileName, atUnknown); case ArcType of atZip : begin FArchive := TAbZipArchive.Create(FileName, fmCreate or fmShareDenyWrite); InitArchive; end; atTar : begin FArchive := TAbTarArchive.Create(FileName, fmCreate or fmShareDenyWrite); inherited InitArchive; end; atGZip : begin FArchive := TAbGzipArchive.Create(FileName, fmCreate or fmShareDenyWrite); TAbGzipArchive(FArchive).TarAutoHandle := FTarAutoHandle; TAbGzipArchive(FArchive).IsGzippedTar := False; inherited InitArchive; end; atGZippedTar : begin FArchive := TAbGzipArchive.Create(FileName, fmCreate or fmShareDenyWrite); TAbGzipArchive(FArchive).TarAutoHandle := FTarAutoHandle; TAbGzipArchive(FArchive).IsGzippedTar := True; inherited InitArchive; end; atBzip2 : begin FArchive := TAbBzip2Archive.Create(FileName, fmCreate or fmShareDenyWrite); TAbBzip2Archive(FArchive).TarAutoHandle := FTarAutoHandle; TAbBzip2Archive(FArchive).IsBzippedTar := False; inherited InitArchive; end; atBzippedTar : begin FArchive := TAbBzip2Archive.Create(FileName, fmCreate or fmShareDenyWrite); TAbBzip2Archive(FArchive).TarAutoHandle := FTarAutoHandle; TAbBzip2Archive(FArchive).IsBzippedTar := True; inherited InitArchive; end; else raise EAbUnhandledType.Create; end {case}; FArchiveType := ArcType; end; DoChange; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.SetStoreOptions(Value : TAbStoreOptions); begin FStoreOptions := Value; if (ZipArchive <> nil) then ZipArchive.StoreOptions := Value; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.SetArchiveSaveProgressMeter(const Value: IAbProgressMeter); begin ReferenceInterface(FArchiveSaveProgressMeter, opRemove); FArchiveSaveProgressMeter := Value; ReferenceInterface(FArchiveSaveProgressMeter, opInsert); end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.SetZipfileComment(const Value : AnsiString); begin if (ZipArchive is TAbZipArchive) then TAbZipArchive(ZipArchive).ZipfileComment := Value else raise EAbNoArchive.Create; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.ZipProc(Sender : TObject; Item : TAbArchiveItem; OutStream : TStream); begin AbZip(TAbZipArchive(Sender), TAbZipItem(Item), OutStream); end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.ZipFromStreamProc(Sender : TObject; Item : TAbArchiveItem; OutStream, InStream : TStream); begin if Assigned(InStream) then AbZipFromStream(TAbZipArchive(Sender), TAbZipItem(Item), OutStream, InStream) else raise EAbZipNoInsertion.Create; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.DoArchiveSaveProgress(Sender : TObject; Progress : Byte; var Abort : Boolean); begin Abort := False; if Assigned(FArchiveSaveProgressMeter) then FArchiveSaveProgressMeter.DoProgress(Progress); if Assigned(FOnArchiveSaveProgress) then FOnArchiveSaveProgress(Self, Progress, Abort); end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.Notification(Component: TComponent; Operation: TOperation); begin inherited Notification(Component, Operation); if (Operation = opRemove) then if Assigned(ArchiveSaveProgressMeter) and Component.IsImplementorOf(ArchiveSaveProgressMeter) then ArchiveSaveProgressMeter := nil end; { -------------------------------------------------------------------------- } procedure TAbCustomZipper.ResetMeters; begin inherited ResetMeters; if Assigned(FArchiveSaveProgressMeter) then FArchiveSaveProgressMeter.Reset; end; { -------------------------------------------------------------------------- } end. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abzipkit.pas����������������������������������������������0000644�0001750�0001750�00000023047�12014201074�022060� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbZipKit.pas *} {*********************************************************} {* ABBREVIA: TABZipKit component *} {*********************************************************} unit AbZipKit; {$I AbDefine.inc} interface uses Classes, AbZipper, AbArcTyp, AbZipTyp; type TAbCustomZipKit = class(TAbCustomZipper) protected {private} FExtractOptions : TAbExtractOptions; FOnConfirmOverwrite : TAbConfirmOverwriteEvent; FOnNeedPassword : TAbNeedPasswordEvent; FPasswordRetries : Byte; protected {methods} procedure DoConfirmOverwrite(var Name : string; var Confirm : Boolean); virtual; procedure DoNeedPassword(Sender : TObject; var NewPassword : AnsiString); virtual; procedure InitArchive; override; procedure SetExtractOptions(Value : TAbExtractOptions); procedure SetPasswordRetries(Value : Byte); procedure UnzipProc(Sender : TObject; Item : TAbArchiveItem; const NewName : string ); procedure UnzipToStreamProc(Sender : TObject; Item : TAbArchiveItem; OutStream : TStream); procedure TestItemProc(Sender : TObject; Item : TAbArchiveItem); protected {properties} property ExtractOptions : TAbExtractOptions read FExtractOptions write SetExtractOptions default AbDefExtractOptions; property PasswordRetries : Byte read FPasswordRetries write SetPasswordRetries default AbDefPasswordRetries; protected {events} property OnConfirmOverwrite : TAbConfirmOverwriteEvent read FOnConfirmOverwrite write FOnConfirmOverwrite; property OnNeedPassword : TAbNeedPasswordEvent read FOnNeedPassword write FOnNeedPassword; public {methods} constructor Create(AOwner : TComponent); override; destructor Destroy; override; procedure ExtractAt(Index : Integer; const NewName : string); procedure ExtractFiles(const FileMask : string); {extract all files from the archive that match the mask} procedure ExtractFilesEx(const FileMask, ExclusionMask : string); {extract files matching FileMask except those matching ExclusionMask} procedure ExtractTaggedItems; {extract all tagged items from the archive} procedure ExtractToStream(const aFileName : string; ToStream : TStream); {extract the specified item to TStream descendant} procedure TestTaggedItems; {test all tagged items in the archive} public {property} property Spanned; end; TAbZipKit = class(TAbCustomZipKit) published property ArchiveProgressMeter; property ArchiveSaveProgressMeter; property AutoSave; property BaseDirectory; property CompressionMethodToUse; property DeflationOption; {$IFDEF MSWINDOWS} property DOSMode; {$ENDIF} property ExtractOptions; property SpanningThreshold; property ItemProgressMeter; property LogFile; property Logging; property OnArchiveProgress; property OnArchiveSaveProgress; property OnArchiveItemProgress; property OnChange; property OnConfirmOverwrite; property OnConfirmProcessItem; property OnConfirmSave; property OnLoad; property OnNeedPassword; property OnProcessItemFailure; property OnRequestBlankDisk; property OnRequestImage; property OnRequestLastDisk; property OnRequestNthDisk; property OnSave; property Password; property PasswordRetries; property StoreOptions; property TempDirectory; property Version; property FileName; {must be after OnLoad} end; implementation uses AbExcept, AbUnzPrc, AbZBrows; { -------------------------------------------------------------------------- } constructor TAbCustomZipKit.Create( AOwner : TComponent ); begin inherited Create( AOwner ); PasswordRetries := AbDefPasswordRetries; end; { -------------------------------------------------------------------------- } destructor TAbCustomZipKit.Destroy; begin inherited Destroy; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipKit.DoConfirmOverwrite( var Name : string; var Confirm : Boolean ); begin Confirm := True; if Assigned( FOnConfirmOverwrite ) then FOnConfirmOverwrite( Name, Confirm ); end; { -------------------------------------------------------------------------- } procedure TAbCustomZipKit.DoNeedPassword( Sender : TObject; var NewPassword : AnsiString ); begin if Assigned( FOnNeedPassword ) then begin FOnNeedPassword( Self, NewPassword ); FPassword := NewPassword; end; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipKit.ExtractAt(Index : Integer; const NewName : string); {extract a file from the archive that match the index} begin if (ZipArchive <> nil) then ZipArchive.ExtractAt( Index, NewName ) else raise EAbNoArchive.Create; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipKit.ExtractFiles(const FileMask : string); {extract all files from the archive that match the mask} begin if (ZipArchive <> nil) then ZipArchive.ExtractFiles( FileMask ) else raise EAbNoArchive.Create; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipKit.ExtractFilesEx(const FileMask, ExclusionMask : string); {extract files matching FileMask except those matching ExclusionMask} begin if (ZipArchive <> nil) then ZipArchive.ExtractFilesEx( FileMask, ExclusionMask ) else raise EAbNoArchive.Create; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipKit.ExtractTaggedItems; {extract all tagged items from the archive} begin if (ZipArchive <> nil) then ZipArchive.ExtractTaggedItems else raise EAbNoArchive.Create; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipKit.ExtractToStream(const aFileName : string; ToStream : TStream); begin if (ZipArchive <> nil) then ZipArchive.ExtractToStream(aFileName, ToStream) else raise EAbNoArchive.Create; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipKit.InitArchive; begin inherited InitArchive; if (ZipArchive <> nil) then begin if ZipArchive is TAbZipArchive then begin {properties} ZipArchive.ExtractOptions := FExtractOptions; TAbZipArchive(ZipArchive).PasswordRetries := FPasswordRetries; {events} ZipArchive.OnConfirmOverwrite := DoConfirmOverwrite; TAbZipArchive(ZipArchive).OnNeedPassword := DoNeedPassword; TAbZipArchive(ZipArchive).ExtractHelper := UnzipProc; TAbZipArchive(ZipArchive).ExtractToStreamHelper := UnzipToStreamProc; TAbZipArchive(ZipArchive).TestHelper := TestItemProc; end; end; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipKit.SetExtractOptions( Value : TAbExtractOptions ); begin FExtractOptions := Value; if (ZipArchive <> nil) then ZipArchive.ExtractOptions := Value; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipKit.SetPasswordRetries( Value : Byte ); begin FPasswordRetries := Value; if (ZipArchive <> nil) then (ZipArchive as TAbZipArchive).PasswordRetries := Value; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipKit.TestTaggedItems; {test all tagged items in the archive} begin if (ZipArchive <> nil) then ZipArchive.TestTaggedItems else raise EAbNoArchive.Create; end; { -------------------------------------------------------------------------- } procedure TAbCustomZipKit.UnzipProc( Sender : TObject; Item : TAbArchiveItem; const NewName : string ); begin AbUnzip( TAbZipArchive(Sender), TAbZipItem(Item), NewName); end; { -------------------------------------------------------------------------- } procedure TAbCustomZipKit.UnzipToStreamProc(Sender : TObject; Item : TAbArchiveItem; OutStream : TStream); begin AbUnzipToStream(TAbZipArchive(Sender), TAbZipItem(Item), OutStream); end; { -------------------------------------------------------------------------- } procedure TAbCustomZipKit.TestItemProc(Sender : TObject; Item : TAbArchiveItem); begin AbTestZipItem(TAbZipArchive(Sender), TAbZipItem(Item)); end; { -------------------------------------------------------------------------- } end. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abselfex.pas����������������������������������������������0000644�0001750�0001750�00000007521�12014201074�022033� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbSelfEx.pas *} {*********************************************************} {* ABBREVIA: Component for building self-extracting zips *} {*********************************************************} unit AbSelfEx; {$I AbDefine.inc} interface uses Classes, AbBase; type TAbGetFileEvent = procedure(Sender : TObject; var aFilename : string; var Abort : Boolean) of object; type TAbMakeSelfExe = class(TAbBaseComponent) protected {private} FStubExe : string; FZipFile : string; FSelfExe : string; FStubStream : TStream; FZipStream : TStream; FSelfStream : TStream; FOnGetStubExe : TAbGetFileEvent; FOnGetZipFile : TAbGetFileEvent; procedure DoGetStubExe(var Abort : Boolean); procedure DoGetZipFile(var Abort : Boolean); public function Execute : Boolean; published property SelfExe : string read FSelfExe write FSelfExe; property StubExe : string read FStubExe write FStubExe; property ZipFile : string read FZipFile write FZipFile; property OnGetStubExe : TAbGetFileEvent read FOnGetStubExe write FOnGetStubExe; property OnGetZipFile : TAbGetFileEvent read FOnGetZipFile write FOnGetZipFile; property Version; end; implementation uses SysUtils, {$IFDEF LibcAPI} Libc, {$ENDIF} AbExcept, AbZipTyp, DCOSUtils, DCClassesUtf8; { -------------------------------------------------------------------------- } function TAbMakeSelfExe.Execute : Boolean; var Abort : Boolean; begin Abort := False; if (FStubExe = '') then DoGetStubExe(Abort); if Abort then raise EAbUserAbort.Create; if not mbFileExists(FStubExe) then raise EAbFileNotFound.Create; if (FZipFile = '') then DoGetZipFile(Abort); if Abort then raise EAbUserAbort.Create; if not mbFileExists(FZipFile) then raise EAbFileNotFound.Create; FStubStream := TFileStreamEx.Create(FStubExe, fmOpenRead or fmShareDenyWrite); FZipStream := TFileStreamEx.Create(FZipFile, fmOpenRead or fmShareDenyWrite); if (FSelfExe = '') then FSelfExe := ChangeFileExt(FZipFile, '.exe'); FSelfStream := TFileStreamEx.Create(FSelfExe, fmCreate or fmShareExclusive); try MakeSelfExtracting(FStubStream, FZipStream, FSelfStream); Result := True; finally FStubStream.Free; FZipStream.Free; FSelfStream.Free; end; end; { -------------------------------------------------------------------------- } procedure TAbMakeSelfExe.DoGetStubExe(var Abort: Boolean); begin if Assigned(FOnGetStubExe) then FOnGetStubExe(Self, FStubExe, Abort); end; { -------------------------------------------------------------------------- } procedure TAbMakeSelfExe.DoGetZipFile(var Abort : Boolean); begin if Assigned(FOnGetZipFile) then FOnGetZipFile(Self, FZipFile, Abort); end; { -------------------------------------------------------------------------- } end. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/readme.txt������������������������������������������������0000644�0001750�0001750�00000002444�12014201074�021532� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Abbrevia Version: 5.0 Revision: 512 Home Page: http://tpabbrevia.sourceforge.net Abbrevia is a compression toolkit for Embarcadero Delphi, C++ Builder, and Kylix and FreePascal. It supports PKZip, Microsoft CAB, tar, gzip, bzip2 and zlib compression formats, and the creation of self-extracting executables. It includes several visual components that simplify displaying zip files. Some modifications done for Double Commander (see doublecmd.diff). NOTES: Functions AbDetectCharSet and IsOEM from AbCharset unit fails with some code pages and characters (eg. 936 and 图片) ! Don't use it when merging with Abbrevia. Better to try to convert with MultiByteToWideChar (see DCConvertEncoding CeTryEncode and CeTryDecode). Abbrevia sets current directory before reading files from disk in case paths are relative and uses ExpandFileName (which relies on current directory) to change relative paths to absolute. Since Double Commander uses the toolkit from a non-main thread it cannot rely on current directory not changing while working. Instead, always full paths in archive items are used, both archive file name and disk file name, paths are rebased against TAbArchive.BaseDirectory (which doesn't change during working) and all calls to functions changing current directory have been removed. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/license.txt�����������������������������������������������0000644�0001750�0001750�00000062233�12014201074�021721� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ MOZILLA PUBLIC LICENSE Version 1.1 --------------- 1. Definitions. 1.0.1. "Commercial Use" means distribution or otherwise making the Covered Code available to a third party. 1.1. "Contributor" means each entity that creates or contributes to the creation of Modifications. 1.2. "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. 1.3. "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. 1.4. "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. 1.5. "Executable" means Covered Code in any form other than Source Code. 1.6. "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. 1.7. "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. 1.8. "License" means this document. 1.8.1. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. 1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. B. Any new file that contains any part of the Original Code or previous Modifications. 1.10. "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. 1.10.1. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. 1.11. "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. 1.12. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. Source Code License. 2.1. The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. 2.2. Contributor Grant. Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. 3. Distribution Obligations. 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. 3.3. Description of Modifications. You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. 3.4. Intellectual Property Matters (a) Third Party Claims. If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. (b) Contributor APIs. If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. (c) Representations. Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. 3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. 4. Inability to Comply Due to Statute or Regulation. If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Application of this License. This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. 6. Versions of the License. 6.1. New Versions. Netscape Communications Corporation ("Netscape") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. 6.2. Effect of New Versions. Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License. 6.3. Derivative Works. If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", "MPL", "NPL" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) 7. DISCLAIMER OF WARRANTY. COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 8. TERMINATION. 8.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. 8.2. If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that: (a) such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. (b) any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. 8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. 8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. 9. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. 10. U.S. GOVERNMENT END USERS. The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. 11. MISCELLANEOUS. This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. 12. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. 13. MULTIPLE-LICENSED CODE. Initial Developer may designate portions of the Covered Code as "Multiple-Licensed". "Multiple-Licensed" means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the NPL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. EXHIBIT A -Mozilla Public License. ``The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is ______________________________________. The Initial Developer of the Original Code is ________________________. Portions created by ______________________ are Copyright (C) ______ _______________________. All Rights Reserved. Contributor(s): ______________________________________. Alternatively, the contents of this file may be used under the terms of the _____ license (the "[___] License"), in which case the provisions of [______] License are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the [___] License." [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abdfhufd.pas����������������������������������������������0000644�0001750�0001750�00000044156�12014201074�022012� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbDfHufD.pas *} {*********************************************************} {* Deflate Huffman tree for decoder *} {*********************************************************} unit AbDfHufD; {$I AbDefine.inc} {Activate this compiler define and rebuild if you want the complete huffman tree output to print to the current log. The output is voluminous to say the least...} {$IFDEF UseLogging} {.$DEFINE EnableMegaLog} {$ENDIF} {Notes: The object of this class is to build a decoder array, not to build a Huffman tree particularly. We don't want to decode huffman strings bit by bit. moving down the Huffman tree sometimes left, sometimes right. Instead we want to grab a set of bits and look them up in an array. Sometimes we'll grab too many bits, sure, but we can deal with that later. So, the object of the exercise is to calculate the code for a symbol, reverse it ('cos that's how the input bit stream will present it to us) and set that element of the array to the decoded symbol value (plus some extra information: bit lengths). If the alphabet size were 19 (the codelengths huffman tree) and the maximum code length 5, for example, the decoder array would be 2^5 elements long, much larger than the alphabet size. The user of this class will be presenting sets of 5 bits for us to decode. We would like to look up these 5 bits in the array (as an index) and have the symbol returned. Now, since the alphabet size is much less than the number of elements in the decoder array, we must set the other elements in the array as well. Consider a symbol that has a code of 110 in this scenario. The reversed code is 011, or 3, so we'd be setting element 3. However we should also be setting elements 01011, 10011, and 11011 to this symbol information as well, since the lookup will be 5 bits long. Because the code is a huffman code from a prefix tree, we won't get any index clashes between actual codes by this "filling in" process. For the codelength Huffman tree, the maximum code length is at most 7. This equates to a 128 element array. For the literal and distance trees, the max code length is at most 15. This equates to a 32768 element array. For a given lookup value the decoder will return a 32-bit value. The lower 16 bits is the decoded symbol, the next 8 bits is the code length for that symbol, the last 8 bits (the most significant) are the number of extra bits that must be extracted from the input bit stream. } interface uses AbDfBase; type TAbDfHuffmanUsage = ( {usage of a huffman decoder..} huEncoding, {..encoding} huDecoding, {..decoding} huBoth); {..both (used for static trees)} TAbDfDecodeHuffmanTree = class private FAlphaSize : integer; FDecodes : PAbDfLongintList; FDefMaxCodeLen : integer; FEncodes : PAbDfLongintList; {$IFOPT C+} FMask : integer; {$ENDIF} FMaxCodeLen : integer; FUsage : TAbDfHuffmanUsage; protected public constructor Create(aAlphabetSize : integer; aDefMaxCodeLen: integer; aUsage : TAbDfHuffmanUsage); destructor Destroy; override; procedure Build(const aCodeLengths : array of integer; aStartInx : integer; aCount : integer; const aExtraBits : array of byte; aExtraOffset : integer); function Decode(aLookupBits : integer) : longint; function Encode(aSymbol : integer) : longint; {$IFDEF UseLogging} procedure DebugPrint(aLog : TAbLogger); {$ENDIF} property LookupBitLength : integer read FMaxCodeLen; property Decodes : PAbDfLongintList read FDecodes; property Encodes : PAbDfLongintList read FEncodes; end; var AbStaticLiteralTree : TAbDfDecodeHuffmanTree; AbStaticDistanceTree : TAbDfDecodeHuffmanTree; implementation uses SysUtils; const PowerOfTwo : array [0..dfc_MaxCodeLength] of integer = (1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768); {===Debug helper routine=============================================} {$IFDEF EnableMegaLog} function CodeToStr(aCode : longint; aLen : integer) : string; var i : integer; begin if (aLen = 0) then Result := 'no code' else begin SetLength(Result, 32); FillChar(Result[1], 32, ' '); for i := 32 downto (33-aLen) do begin if Odd(aCode) then Result[i] := '1' else Result[i] := '0'; aCode := aCode shr 1; end; end; end; {$ENDIF} {====================================================================} {===TAbDfDecodeHuffmanTree===========================================} constructor TAbDfDecodeHuffmanTree.Create( aAlphabetSize : integer; aDefMaxCodeLen: integer; aUsage : TAbDfHuffmanUsage); begin {protect against dumb programming mistakes} Assert(aAlphabetSize >= 2, 'TAbDfDecodeHuffmanTree.Create: a huffman tree must be for at least two symbols'); {let the ancestor initialize} inherited Create; {save the alphabet size, etc} FAlphaSize := aAlphabetSize; FDefMaxCodeLen := aDefMaxCodeLen; FUsage := aUsage; {allocate the encoder array (needs to be initialized to zeros)} if (aUsage <> huDecoding) then FEncodes := AllocMem(FAlphaSize * sizeof(longint)); end; {--------} destructor TAbDfDecodeHuffmanTree.Destroy; begin {destroy the codes arrays} if (FDecodes <> nil) then FreeMem(FDecodes); if (FEncodes <> nil) then FreeMem(FEncodes); {let the ancestor die} inherited Destroy; end; {--------} procedure TAbDfDecodeHuffmanTree.Build( const aCodeLengths : array of integer; aStartInx : integer; aCount : integer; const aExtraBits : array of byte; aExtraOffset : integer); const ByteRevTable : array [0..255] of byte = ( $00, $80, $40, $C0, $20, $A0, $60, $E0, $10, $90, $50, $D0, $30, $B0, $70, $F0, $08, $88, $48, $C8, $28, $A8, $68, $E8, $18, $98, $58, $D8, $38, $B8, $78, $F8, $04, $84, $44, $C4, $24, $A4, $64, $E4, $14, $94, $54, $D4, $34, $B4, $74, $F4, $0C, $8C, $4C, $CC, $2C, $AC, $6C, $EC, $1C, $9C, $5C, $DC, $3C, $BC, $7C, $FC, $02, $82, $42, $C2, $22, $A2, $62, $E2, $12, $92, $52, $D2, $32, $B2, $72, $F2, $0A, $8A, $4A, $CA, $2A, $AA, $6A, $EA, $1A, $9A, $5A, $DA, $3A, $BA, $7A, $FA, $06, $86, $46, $C6, $26, $A6, $66, $E6, $16, $96, $56, $D6, $36, $B6, $76, $F6, $0E, $8E, $4E, $CE, $2E, $AE, $6E, $EE, $1E, $9E, $5E, $DE, $3E, $BE, $7E, $FE, $01, $81, $41, $C1, $21, $A1, $61, $E1, $11, $91, $51, $D1, $31, $B1, $71, $F1, $09, $89, $49, $C9, $29, $A9, $69, $E9, $19, $99, $59, $D9, $39, $B9, $79, $F9, $05, $85, $45, $C5, $25, $A5, $65, $E5, $15, $95, $55, $D5, $35, $B5, $75, $F5, $0D, $8D, $4D, $CD, $2D, $AD, $6D, $ED, $1D, $9D, $5D, $DD, $3D, $BD, $7D, $FD, $03, $83, $43, $C3, $23, $A3, $63, $E3, $13, $93, $53, $D3, $33, $B3, $73, $F3, $0B, $8B, $4B, $CB, $2B, $AB, $6B, $EB, $1B, $9B, $5B, $DB, $3B, $BB, $7B, $FB, $07, $87, $47, $C7, $27, $A7, $67, $E7, $17, $97, $57, $D7, $37, $B7, $77, $F7, $0F, $8F, $4F, $CF, $2F, $AF, $6F, $EF, $1F, $9F, $5F, $DF, $3F, $BF, $7F, $FF); var i : integer; Symbol : integer; LengthCount : array [0..dfc_MaxCodeLength] of integer; NextCode : array [0..dfc_MaxCodeLength] of integer; Code : longint; CodeLen : integer; CodeData : longint; DecoderLen : integer; CodeIncr : integer; Decodes : PAbDfLongintList; Encodes : PAbDfLongintList; {$IFDEF CPU386} DecodesEnd : pointer; {$ENDIF} TablePtr : pointer; begin {count the number of instances of each code length and calculate the maximum code length at the same time} FillChar(LengthCount, sizeof(LengthCount), 0); FMaxCodeLen := 0; for i := 0 to pred(aCount) do begin CodeLen := aCodeLengths[i + aStartInx]; Assert((CodeLen <= FDefMaxCodeLen), Format('TAbDfDecodeHuffmanTree.Build: a code length is greater than %d', [FDefMaxCodeLen])); if (CodeLen > FMaxCodeLen) then FMaxCodeLen := CodeLen; inc(LengthCount[CodeLen]); end; {now we know the maximum code length we can allocate our decoder array} {$IFNDEF CPU386} DecoderLen := 0; {$ENDIF} if (FUsage <> huEncoding) then begin DecoderLen := PowerOfTwo[FMaxCodeLen]; GetMem(FDecodes, DecoderLen * sizeof(longint)); {$IFDEF CPU386} DecodesEnd := PAnsiChar(FDecodes) + (DecoderLen * sizeof(longint)); {$ENDIF} {$IFOPT C+} FillChar(FDecodes^, DecoderLen * sizeof(longint), $FF); FMask := not (DecoderLen - 1); {$ENDIF} end; {calculate the start codes for each code length} Code := 0; LengthCount[0] := 0; for i := 1 to FDefMaxCodeLen do begin Code := (Code + LengthCount[i-1]) shl 1; NextCode[i] := Code; end; {for speed and convenience} Decodes := FDecodes; Encodes := FEncodes; TablePtr := @ByteRevTable; {for each symbol...} for Symbol := 0 to pred(aCount) do begin {calculate the code length} CodeLen := aCodeLengths[Symbol + aStartInx]; {if the code length were zero, just set the relevant entry in the encoder array; the decoder array doesn't need anything} if (CodeLen = 0) then begin if (FUsage <> huDecoding) then Encodes^[Symbol] := -1 end {otherwise we need to fill elements in both the encoder and decoder arrays} else begin {calculate *reversed* code} Code := NextCode[CodeLen]; {$IFDEF CPU386} asm push esi mov eax, Code mov esi, TablePtr xor ecx, ecx xor edx, edx mov cl, ah mov dl, al mov al, [esi+ecx] mov ah, [esi+edx] mov ecx, 16 pop esi sub ecx, CodeLen shr eax, cl mov Code, eax end; {$ELSE} CodeData:= Code; LongRec(Code).Bytes[1]:= ByteRevTable[LongRec(CodeData).Bytes[0]]; LongRec(Code).Bytes[0]:= ByteRevTable[LongRec(CodeData).Bytes[1]]; Code:= Code shr (16-CodeLen); {$ENDIF} {set the code data (bit count, extra bits required, symbol), everywhere the reversed code would appear in the decoder array; set the code data in the encoder array as well} if (Symbol >= aExtraOffset) then begin if (FUsage <> huEncoding) then CodeData := Symbol + { symbol} (CodeLen shl 16) + { code length} (aExtraBits[Symbol-aExtraOffset] shl 24); { extra bits required} if (FUsage <> huDecoding) then Encodes^[Symbol] := Code + { code} (CodeLen shl 16) + { code length} (aExtraBits[Symbol-aExtraOffset] shl 24) { extra bits required} end else begin if (FUsage <> huEncoding) then CodeData := Symbol + { symbol} (CodeLen shl 16); { code length} if (FUsage <> huDecoding) then Encodes^[Symbol] := Code + { code} (CodeLen shl 16); { code length} end; {OPTIMIZATION NOTE: the following code CodeIncr := PowerOfTwo[CodeLen]; while Code < DecoderLen do begin Decodes^[Code] := CodeData; inc(Code, CodeIncr); end; was replaced by the asm code below to improve the speed. The code in the loop is the big time sink in this routine so it was best to replace it.} if (FUsage <> huEncoding) then begin {$IFDEF CPU386} CodeIncr := PowerOfTwo[CodeLen] * sizeof(longint); asm push edi { save edi} mov eax, Decodes { get the Decodes array} mov edi, DecodesEnd { get the end of the Decodes array} mov edx, Code { get Code and..} shl edx, 1 { ..multiply by 4} shl edx, 1 add eax, edx { eax => first element to be set} mov edx, CodeData { get the CodeData} mov ecx, CodeIncr { get the increment per loop} @@1: mov [eax], edx { set the element} add eax, ecx { move to the next element} cmp eax, edi { if we haven't gone past the end..} jl @@1 { ..go back for the next one} pop edi { retrieve edi} end; {$ELSE} CodeIncr := PowerOfTwo[CodeLen]; while Code < DecoderLen do begin Decodes^[Code] := CodeData; inc(Code, CodeIncr); end; {$ENDIF} end; {we've used this code up for this symbol, so increment for the next symbol at this code length} inc(NextCode[CodeLen]); end; end; end; {--------} {$IFDEF UseLogging} procedure TAbDfDecodeHuffmanTree.DebugPrint(aLog : TAbLogger); {$IFDEF EnableMegaLog} var i : integer; Code : longint; {$ENDIF} begin {to print the huffman tree, we must have a logger...} Assert(aLog <> nil, 'TAbDfDecodeHuffmanTree.DebugPrint needs a logger object to which to print'); if (FUsage <> huEncoding) then begin aLog.WriteLine('Huffman decoder array'); aLog.WriteLine(Format('Alphabet size: %d', [FAlphaSize])); aLog.WriteLine(Format('Max codelength: %d', [FMaxCodeLen])); {$IFDEF EnableMegaLog} aLog.WriteLine('Index Len Xtra Symbol Reversed Code'); for i := 0 to pred(PowerOfTwo[FMaxCodeLen]) do begin Code := FDecodes^[i]; if (Code = -1) then aLog.WriteLine(Format('%5d%49s', [i, 'no code'])) else aLog.WriteLine(Format('%5d%4d%5d%7d%33s', [i, ((Code shr 16) and $FF), ((Code shr 24) and $FF), (Code and $FFFF), CodeToStr(i, ((Code shr 16) and $FF))])); end; aLog.WriteLine('---end decoder array---'); {$ENDIF} end; if (FUsage <> huDecoding) then begin aLog.WriteLine('Huffman encoder array'); aLog.WriteLine(Format('Alphabet size: %d', [FAlphaSize])); {$IFDEF EnableMegaLog} aLog.WriteLine('Symbol Len Xtra Reversed Code'); for i := 0 to pred(FAlphaSize) do begin Code := FEncodes^[i]; if (Code = -1) then aLog.WriteLine(Format('%6d%42s', [i, 'no code'])) else aLog.WriteLine(Format('%6d%4d%5d%33s', [i, ((Code shr 16) and $FF), ((Code shr 24) and $FF), CodeToStr((Code and $FFFF), ((Code shr 16) and $FF))])); end; aLog.WriteLine('---end encoder array---'); {$ENDIF} end; end; {$ENDIF} {--------} function TAbDfDecodeHuffmanTree.Decode(aLookupBits : integer) : longint; begin {protect against dumb programming mistakes (note: FMask only exists if assertions are on)} {$IFOPT C+} Assert((aLookupBits and FMask) = 0, 'TAbDfDecodeHuffmanTree.Decode: trying to decode too many bits, use LookupBitLength property'); {$ENDIF} {return the code data} Result := FDecodes^[aLookupBits]; end; {--------} function TAbDfDecodeHuffmanTree.Encode(aSymbol : integer) : longint; begin {protect against dumb programming mistakes} Assert((0 <= aSymbol) and (aSymbol < FAlphaSize), 'TAbDfDecodeHuffmanTree.Encode: trying to encode a symbol that is not in the alphabet'); {return the code data} Result := FEncodes^[aSymbol]; {if the result is -1, it's another programming mistake: the user is attempting to get a code for a symbol that wasn't being used} Assert(Result <> -1, 'TAbDfDecodeHuffmanTree.Encode: trying to encode a symbol that was not used'); end; {====================================================================} {===BuildStaticTrees=================================================} procedure BuildStaticTrees; var i : integer; CodeLens : array [0..287] of integer; begin {this routine builds the static huffman trees, those whose code lengths are determined by the deflate spec} {the static literal tree first} for i := 0 to 143 do CodeLens[i] := 8; for i := 144 to 255 do CodeLens[i] := 9; for i := 256 to 279 do CodeLens[i] := 7; for i := 280 to 287 do CodeLens[i] := 8; AbStaticLiteralTree := TAbDfDecodeHuffmanTree.Create(288, 15, huBoth); AbStaticLiteralTree.Build(CodeLens, 0, 288, dfc_LitExtraBits, dfc_LitExtraOffset); {the static distance tree afterwards} for i := 0 to 31 do CodeLens[i] := 5; AbStaticDistanceTree := TAbDfDecodeHuffmanTree.Create(32, 15, huBoth); AbStaticDistanceTree.Build(CodeLens, 0, 32, dfc_DistExtraBits, dfc_DistExtraOffset); end; {====================================================================} initialization BuildStaticTrees; finalization AbStaticLiteralTree.Free; AbStaticDistanceTree.Free; end. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/fparchive/abswstm.pas�����������������������������������������������0000644�0001750�0001750�00000033461�12014201074�021724� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: AbSWStm.pas *} {*********************************************************} {* ABBREVIA: TabSlidingWindowStream class *} {*********************************************************} unit AbSWStm; {$I AbDefine.inc} {Notes: The TabSlidingWindowStream class provides a simple buffered stream for sliding window compression/decompression routines. The sliding window stream is limited when compared with a true buffered stream: - it is assumed that the underlying stream is just going to be written to and is initially empty - the buffer is fixed in size to 40KB - write operations can only occur at the end of the stream - the stream can only be positioned with a certain limited range - we can only read up to 32KB - we can only write up to 32KB The stream is written as a wrapper around another stream (presumably a file stream) which is used for actual reads to the buffer and writes from the buffer. The stream buffer is organized as five 8KB chunks in an array. The last chunk is the only one used for writing, the other four are a 32KB buffer for reading. As the final chunk gets filled, the class will drop off the first chunk (writing it to the underlying stream, and shift the other chunks in the array.} {Define this if you wish to see a trace of the stream usage in a file called C:\SlideWin.LOG} {.$DEFINE DebugTrace} interface uses SysUtils, Classes; const abSWChunkCount = 5; type TabSlidingWindowStream = class(TStream) protected {private} bsChunks : array [0..pred(abSWChunkCount)] of PByteArray; bsBufferStart : longint; bsLastPos : integer; bsCurChunk : integer; bsPosInChunk : integer; bsPosInBuffer : longint; bsSize : Longint; {count of bytes in stream} bsDirty : boolean; {whether the buffer is dirty or not} bsStream : TStream; {actual stream containing data} {$IFDEF DebugTrace} bsF : System.Text; {$ENDIF} protected procedure bsWriteChunk(aIndex : integer); procedure bsSlide; public constructor Create(aStream : TStream); {-create the buffered stream} destructor Destroy; override; {-destroy the buffered stream} procedure Flush; {-ensures that all dirty buffered data is flushed} function Read(var Buffer; Count : Longint) : Longint; override; {-read from the stream into a buffer} function Seek(Offset : Longint; Origin : Word) : Longint; override; {-seek to a particular point in the stream} function Write(const Buffer; Count : Longint) : Longint; override; {-write to the stream from a buffer} end; implementation const ChunkSize = 8192; {cannot be greater than MaxInt} {===Helper routines==================================================} procedure RaiseException(const S : string); begin raise Exception.Create(S); end; {====================================================================} {===TabSlidingWindowStream===========================================} constructor TabSlidingWindowStream.Create(aStream : TStream); var i : integer; begin inherited Create; {save the actual stream} bsStream := aStream; {allocate the chunks-they must be set to binary zeros} for i := 0 to pred(abSWChunkCount) do bsChunks[i] := AllocMem(ChunkSize); {set the page/buffer variables to the start of the stream; remember we only write to the last chunk--the previous chunks are set to binary zeros} aStream.Position := 0; bsSize := 0; bsBufferStart := -ChunkSize * pred(abSWChunkCount); bsPosInBuffer := ChunkSize * pred(abSWChunkCount); bsCurChunk := pred(abSWChunkCount); bsPosInChunk := 0; bsDirty := false; {$IFDEF DebugTrace} System.Assign(bsF, 'c:\SlideWin.LOG'); if FileExists('c:\SlideWin.LOG') then System.Append(bsF) else System.Rewrite(bsF); writeln(bsF, '---NEW LOG---'); {$ENDIF} end; {--------} destructor TabSlidingWindowStream.Destroy; var i : integer; begin {destroy the buffer, after writing it to the actual stream} if bsDirty then Flush; for i := 0 to pred(abSWChunkCount) do if (bsChunks[i] <> nil) then FreeMem(bsChunks[i], ChunkSize); {$IFDEF DebugTrace} System.Close(bsF); {$ENDIF} {let our ancestor clean up} inherited Destroy; end; {--------} procedure TabSlidingWindowStream.bsSlide; var SavePtr : PByteArray; i : integer; begin {write out the first chunk} bsWriteChunk(0); {slide the chunks around} SavePtr := bsChunks[0]; for i := 0 to abSWChunkCount-2 do bsChunks[i] := bsChunks[i+1]; bsChunks[pred(abSWChunkCount)] := SavePtr; {advance the buffer start position} inc(bsBufferStart, ChunkSize); {reset the write position} bsPosInChunk := 0; bsPosInBuffer := ChunkSize * pred(abSWChunkCount); bsLastPos := 0; end; {--------} procedure TabSlidingWindowStream.bsWriteChunk(aIndex : integer); var SeekResult : longint; BytesWrit : longint; Offset : longint; BytesToWrite : integer; begin Offset := bsBufferStart + (longint(aIndex) * ChunkSize); if (Offset >= 0) then begin SeekResult := bsStream.Seek(Offset, 0); if (SeekResult = -1) then RaiseException('TabSlidingWindowStream.bsWriteChunk: seek failed'); if (aIndex <> pred(abSWChunkCount)) then BytesToWrite := ChunkSize else BytesToWrite := bsLastPos; BytesWrit := bsStream.Write(bsChunks[aIndex]^, BytesToWrite); if (BytesWrit <> BytesToWrite) then RaiseException('TabSlidingWindowStream.bsWriteChunk: write failed'); end; end; {--------} procedure TabSlidingWindowStream.Flush; var i : integer; begin if bsDirty then begin for i := 0 to pred(abSWChunkCount) do bsWriteChunk(i); bsDirty := false; end; end; {--------} function TabSlidingWindowStream.Read(var Buffer; Count : Longint) : Longint; var BufPtr : PByte; BytesToGo : Longint; BytesToRead : integer; begin BufPtr := @Buffer; {$IFDEF DebugTrace} System.Writeln(bsF, 'Read: ', Count, ' bytes'); {$ENDIF} {we do not support reads greater than 32KB bytes} if (Count > 32*1024) then Count := 32*1024; {reading is complicated by the fact we can only read in chunks of ChunkSize: we need to partition out the overall read into a read from part of the chunk, zero or more reads from complete chunks and then a possible read from part of a chunk} {calculate the actual number of bytes we can read - this depends on the current position and size of the stream as well as the number of bytes requested} BytesToGo := Count; if (bsSize < (bsBufferStart + bsPosInBuffer + Count)) then BytesToGo := bsSize - (bsBufferStart + bsPosInBuffer); if (BytesToGo <= 0) then begin Result := 0; Exit; end; {remember to return the result of our calculation} Result := BytesToGo; {calculate the number of bytes we can read prior to the loop} BytesToRead := ChunkSize - bsPosInChunk; if (BytesToRead > BytesToGo) then BytesToRead := BytesToGo; {copy from the stream buffer to the caller's buffer} if (BytesToRead = 1) then BufPtr^ := bsChunks[bsCurChunk]^[bsPosInChunk] else Move(bsChunks[bsCurChunk]^[bsPosInChunk], BufPtr^, BytesToRead); {calculate the number of bytes still to read} dec(BytesToGo, BytesToRead); {while we have bytes to read, read them} while (BytesToGo > 0) do begin {advance the pointer for the caller's buffer} inc(BufPtr, BytesToRead); {as we've exhausted this chunk, advance to the next} inc(bsCurChunk); bsPosInChunk := 0; {calculate the number of bytes we can read in this cycle} BytesToRead := ChunkSize; if (BytesToRead > BytesToGo) then BytesToRead := BytesToGo; {copy from the stream buffer to the caller's buffer} Move(bsChunks[bsCurChunk]^, BufPtr^, BytesToRead); {calculate the number of bytes still to read} dec(BytesToGo, BytesToRead); end; {remember our new position} inc(bsPosInChunk, BytesToRead); end; {--------} function TabSlidingWindowStream.Seek(Offset : Longint; Origin : Word) : Longint; {$IFDEF DebugTrace} const OriginStr : array [0..2] of string[7] = ('start', 'current', 'end'); {$ENDIF} var NewPos : Longint; begin {$IFDEF DebugTrace} System.Writeln(bsF, 'Seek: ', Offset, ' bytes from ', OriginStr[Origin]); {$ENDIF} {calculate the new position} case Origin of soFromBeginning : NewPos := Offset; soFromCurrent : NewPos := bsBufferStart + bsPosInBuffer + Offset; soFromEnd : NewPos := bsSize + Offset; else NewPos := 0; RaiseException('TabSlidingWindowStream.Seek: invalid origin'); end; {if the new position is invalid, say so} if (NewPos < bsBufferStart) or (NewPos > bsSize) then RaiseException('TabSlidingWindowStream.Seek: invalid new position'); {calculate the chunk number and the position in buffer & chunk} bsPosInBuffer := NewPos - bsBufferStart; bsCurChunk := bsPosInBuffer div ChunkSize; bsPosInChunk := bsPosInBuffer mod ChunkSize; {return the new position} Result := NewPos; end; {--------} function TabSlidingWindowStream.Write(const Buffer; Count : Longint) : Longint; var BufPtr : PByte; BytesToGo : Longint; BytesToWrite: integer; begin BufPtr := @Buffer; {$IFDEF DebugTrace} System.Writeln(bsF, 'Write: ', Count, ' bytes'); {$ENDIF} {we ONLY write at the end of the stream} if ((bsBufferStart + bsPosInBuffer) <> bsSize) then RaiseException('TabSlidingWindowStream.Write: Not at end of stream'); {we do not support writes greater than 32KB bytes} if (Count > 32*1024) then Count := 32*1024; {writing is complicated by the fact we write in chunks of Chunksize bytes: we need to partition out the overall write into a write to part of the chunk, zero or more writes to complete chunks and then a possible write to part of a chunk; every time we fill a chunk we have toi slide the buffer} {when we write to this stream we always assume that we can write the requested number of bytes: if we can't (eg, the disk is full) we'll get an exception somewhere eventually} BytesToGo := Count; {remember to return the result of our calculation} Result := BytesToGo; {calculate the number of bytes we can write prior to the loop} BytesToWrite := ChunkSize - bsPosInChunk; if (BytesToWrite > BytesToGo) then BytesToWrite := BytesToGo; {copy from the caller's buffer to the stream buffer} if (BytesToWrite = 1) then bsChunks[pred(abSWChunkCount)]^[bsPosInChunk] := BufPtr^ else Move(BufPtr^, bsChunks[pred(abSWChunkCount)]^[bsPosInChunk], BytesToWrite); {mark our buffer as requiring a save to the actual stream} bsDirty := true; {calculate the number of bytes still to write} dec(BytesToGo, BytesToWrite); {while we have bytes to write, write them} while (BytesToGo > 0) do begin {slide the buffer} bsSlide; {advance the pointer for the caller's buffer} inc(BufPtr, BytesToWrite); {calculate the number of bytes we can write in this cycle} BytesToWrite := ChunkSize; if (BytesToWrite > BytesToGo) then BytesToWrite := BytesToGo; {copy from the caller's buffer to our buffer} Move(BufPtr^, bsChunks[pred(abSWChunkCount)]^, BytesToWrite); {calculate the number of bytes still to write} dec(BytesToGo, BytesToWrite); end; {remember our new position} inc(bsPosInChunk, BytesToWrite); bsPosInBuffer := (longint(ChunkSize) * pred(abSWChunkCount)) + bsPosInChunk; bsLastPos := bsPosInChunk; {make sure the stream size is correct} inc(bsSize, Result); {if we're at the end of the chunk, slide the buffer ready for next time we write} if (bsPosInChunk = ChunkSize) then bsSlide; end; {====================================================================} end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/lib/����������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016345� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/src/����������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016366� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/src/ZipConfDlg.pas��������������������������������������������������0000644�0001750�0001750�00000012141�12204103540�021053� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ Double commander ------------------------------------------------------------------------- WCX plugin for working with *.zip, *.gz, *.bz2, *.tar, *.tgz, *.tbz archives Copyright (C) 2008-2013 Alexander Koblov (alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License in a file called COPYING along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. } unit ZipConfDlg; {$mode objfpc}{$H+} {$include calling.inc} {$R ZipConfDlg.lfm} interface uses SysUtils, Extension; procedure CreateZipConfDlg; procedure LoadConfig; procedure SaveConfig; implementation uses ZipFunc, AbZipTyp, DCClassesUtf8; function DlgProc (pDlg: PtrUInt; DlgItemName: PAnsiChar; Msg, wParam, lParam: PtrInt): PtrInt; dcpcall; var iIndex: Integer; begin Result:= 0; with gStartupInfo do begin case Msg of DN_INITDIALOG: begin case gCompressionMethodToUse of smStored: SendDlgMsg(pDlg, 'cbCompressionMethodToUse', DM_LISTSETITEMINDEX, 0, 0); smDeflated: SendDlgMsg(pDlg, 'cbCompressionMethodToUse', DM_LISTSETITEMINDEX, 1, 0); smBestMethod: SendDlgMsg(pDlg, 'cbCompressionMethodToUse', DM_LISTSETITEMINDEX, 2, 0); end; // case case gDeflationOption of doNormal: SendDlgMsg(pDlg, 'cbDeflationOption', DM_LISTSETITEMINDEX, 0, 0); doMaximum: SendDlgMsg(pDlg, 'cbDeflationOption', DM_LISTSETITEMINDEX, 1, 0); doFast: SendDlgMsg(pDlg, 'cbDeflationOption', DM_LISTSETITEMINDEX, 2, 0); doSuperFast: SendDlgMsg(pDlg, 'cbDeflationOption', DM_LISTSETITEMINDEX, 3, 0); end; // case SendDlgMsg(pDlg, 'chkTarAutoHandle', DM_SETCHECK, PtrInt(gTarAutoHandle), 0); end; DN_CLICK: if DlgItemName = 'btnOK' then begin iIndex:= SendDlgMsg(pDlg, 'cbCompressionMethodToUse', DM_LISTGETITEMINDEX, 0, 0); case iIndex of 0: gCompressionMethodToUse:= smStored; 1: gCompressionMethodToUse:= smDeflated; 2: gCompressionMethodToUse:= smBestMethod; end; // case iIndex:= SendDlgMsg(pDlg, 'cbDeflationOption', DM_LISTGETITEMINDEX, 0, 0); case iIndex of 0: gDeflationOption:= doNormal; 1: gDeflationOption:= doMaximum; 2: gDeflationOption:= doFast; 3: gDeflationOption:= doSuperFast; end; // case gTarAutoHandle:= Boolean(SendDlgMsg(pDlg, 'chkTarAutoHandle', DM_GETCHECK, 0, 0)); SaveConfig; SendDlgMsg(pDlg, DlgItemName, DM_CLOSE, 1, 0); end else if DlgItemName = 'btnCancel' then SendDlgMsg(pDlg, DlgItemName, DM_CLOSE, 2, 0); end;// case end; // with end; procedure CreateZipConfDlg; var ResHandle: TFPResourceHandle = 0; ResGlobal: TFPResourceHGLOBAL = 0; ResData: Pointer = nil; ResSize: LongWord; begin try ResHandle := FindResource(HINSTANCE, PChar('TDIALOGBOX'), MAKEINTRESOURCE(10) {RT_RCDATA}); if ResHandle <> 0 then begin ResGlobal := LoadResource(HINSTANCE, ResHandle); if ResGlobal <> 0 then begin ResData := LockResource(ResGlobal); ResSize := SizeofResource(HINSTANCE, ResHandle); with gStartupInfo do begin DialogBoxLRS(ResData, ResSize, @DlgProc); end; end; end; finally if ResGlobal <> 0 then begin UnlockResource(ResGlobal); FreeResource(ResGlobal); end; end; end; procedure LoadConfig; var gIni: TIniFileEx; begin gIni:= TIniFileEx.Create(gStartupInfo.PluginConfDir + IniFileName); try gCompressionMethodToUse:= TAbZipSupportedMethod(gIni.ReadInteger('Configuration', 'CompressionMethodToUse', 2)); gDeflationOption:= TAbZipDeflationOption(gIni.ReadInteger('Configuration', 'DeflationOption', 0)); gTarAutoHandle:= gIni.ReadBool('Configuration', 'TarAutoHandle', True); finally gIni.Free; end; end; procedure SaveConfig; var gIni: TIniFileEx; begin gIni:= TIniFileEx.Create(gStartupInfo.PluginConfDir + IniFileName); try gIni.WriteInteger('Configuration', 'CompressionMethodToUse', Integer(gCompressionMethodToUse)); gIni.WriteInteger('Configuration', 'DeflationOption', Integer(gDeflationOption)); gIni.WriteBool('Configuration', 'TarAutoHandle', gTarAutoHandle); finally gIni.Free; end; end; end. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/src/ZipFunc.pas�����������������������������������������������������0000644�0001750�0001750�00000061624�12204103540�020444� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ Double commander ------------------------------------------------------------------------- WCX plugin for working with *.zip, *.gz, *.tar, *.tgz archives Copyright (C) 2007-2013 Alexander Koblov (alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License in a file called COPYING along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. } unit ZipFunc; {$mode objfpc}{$H+} {$include calling.inc} interface uses Classes, WcxPlugin, AbArcTyp, AbZipTyp, Extension, AbExcept, AbUtils, AbConst, ZipApp; type { TAbZipKitEx } TAbZipKitEx = class (TAbZipKit) private FOperationResult: LongInt; FProcessDataProc : TProcessDataProc; FProcessDataProcW : TProcessDataProcW; procedure AbArchiveItemProgressEvent(Sender : TObject; Item : TAbArchiveItem; Progress : Byte; var Abort : Boolean); procedure AbArchiveProgressEvent (Sender : TObject; Progress : Byte; var Abort : Boolean); procedure AbNeedPasswordEvent(Sender : TObject; var NewPassword : AnsiString); procedure AbProcessItemFailureEvent(Sender: TObject; Item: TAbArchiveItem; ProcessType: TAbProcessType; ErrorClass: TAbErrorClass; ErrorCode: Integer); public constructor Create(AOwner: TComponent); override; function GetFileName(aFileIndex: Integer): String; end; {Mandatory functions} function OpenArchive (var ArchiveData : tOpenArchiveData) : TArcHandle;dcpcall; function OpenArchiveW(var ArchiveData : tOpenArchiveDataW) : TArcHandle;dcpcall; function ReadHeader(hArcData : TArcHandle; var HeaderData: THeaderData) : Integer;dcpcall; function ReadHeaderEx(hArcData : TArcHandle; var HeaderData: THeaderDataEx) : Integer;dcpcall; function ReadHeaderExW(hArcData : TArcHandle; var HeaderData: THeaderDataExW) : Integer;dcpcall; function ProcessFile (hArcData : TArcHandle; Operation : Integer; DestPath, DestName : PChar) : Integer;dcpcall; function ProcessFileW(hArcData : TArcHandle; Operation : Integer; DestPath, DestName : PWideChar) : Integer;dcpcall; function CloseArchive (hArcData : TArcHandle) : Integer;dcpcall; procedure SetChangeVolProc (hArcData : TArcHandle; pChangeVolProc : PChangeVolProc);dcpcall; procedure SetChangeVolProcW(hArcData : TArcHandle; pChangeVolProc : TChangeVolProcW);dcpcall; procedure SetProcessDataProc (hArcData : TArcHandle; pProcessDataProc : TProcessDataProc);dcpcall; procedure SetProcessDataProcW(hArcData : TArcHandle; pProcessDataProc : TProcessDataProcW);dcpcall; {Optional functions} function PackFiles(PackedFile: PChar; SubPath: PChar; SrcPath: PChar; AddList: PChar; Flags: Integer): Integer;dcpcall; function PackFilesW(PackedFile: PWideChar; SubPath: PWideChar; SrcPath: PWideChar; AddList: PWideChar; Flags: Integer): Integer;dcpcall; function DeleteFiles(PackedFile, DeleteList : PChar) : Integer;dcpcall; function DeleteFilesW(PackedFile, DeleteList : PWideChar) : Integer;dcpcall; function GetPackerCaps : Integer;dcpcall; procedure ConfigurePacker (Parent: HWND; DllInstance: THandle);dcpcall; function CanYouHandleThisFile(FileName: PAnsiChar): Boolean; dcpcall; function CanYouHandleThisFileW(FileName: PWideChar): Boolean; dcpcall; {Extension API} procedure ExtensionInitialize(StartupInfo: PExtensionStartupInfo); dcpcall; const IniFileName = 'zip.ini'; var gProcessDataProc : TProcessDataProc; gProcessDataProcW : TProcessDataProcW; gStartupInfo: TExtensionStartupInfo; gCompressionMethodToUse : TAbZipSupportedMethod; gDeflationOption : TAbZipDeflationOption; gTarAutoHandle : Boolean; implementation uses SysUtils, ZipConfDlg, AbBrowse, DCOSUtils, DCStrUtils, DCConvertEncoding; procedure StringToArrayW(src: WideString; pDst: PWideChar; MaxDstLength: Integer); begin if Length(src) < MaxDstLength then MaxDstLength := Length(src) else MaxDstLength := MaxDstLength - 1; // for ending #0 if Length(src) > 0 then Move(src[1], pDst^, SizeOf(WideChar) * MaxDstLength); pDst[MaxDstLength] := WideChar(0); end; function StrEndsWith(S : String; SearchPhrase : String) : Boolean; begin Result := (RightStr(S, Length(SearchPhrase)) = SearchPhrase); end; // -- Exported functions ------------------------------------------------------ function OpenArchive (var ArchiveData : tOpenArchiveData) : TArcHandle;dcpcall; var Arc : TAbZipKitEx; begin Result := 0; Arc := TAbZipKitEx.Create(nil); try Arc.OnArchiveItemProgress := @Arc.AbArchiveItemProgressEvent; Arc.OnArchiveProgress := @Arc.AbArchiveProgressEvent; Arc.OnProcessItemFailure := @Arc.AbProcessItemFailureEvent; Arc.OnNeedPassword:= @Arc.AbNeedPasswordEvent; Arc.TarAutoHandle := gTarAutoHandle; Arc.OpenArchive(ArchiveData.ArcName); Arc.Tag := 0; Result := TArcHandle(Arc); except on EAbUnhandledType do ArchiveData.OpenResult := E_UNKNOWN_FORMAT; on EAbFileNotFound do ArchiveData.OpenResult := E_EOPEN; on EAbUnhandledType do ArchiveData.OpenResult := E_NOT_SUPPORTED; on EFCreateError do ArchiveData.OpenResult := E_ECREATE; on EFOpenError do ArchiveData.OpenResult := E_EOPEN; on EReadError do ArchiveData.OpenResult := E_EREAD; on EWriteError do ArchiveData.OpenResult := E_EWRITE; else ArchiveData.OpenResult := -1; end; if (Result = 0) and Assigned(Arc) then Arc.Free; end; function OpenArchiveW(var ArchiveData : tOpenArchiveDataW) : TArcHandle;dcpcall; var Arc : TAbZipKitEx; begin Result := 0; Arc := TAbZipKitEx.Create(nil); try Arc.OnArchiveItemProgress := @Arc.AbArchiveItemProgressEvent; Arc.OnArchiveProgress := @Arc.AbArchiveProgressEvent; Arc.OnProcessItemFailure := @Arc.AbProcessItemFailureEvent; Arc.OnNeedPassword:= @Arc.AbNeedPasswordEvent; Arc.TarAutoHandle := gTarAutoHandle; Arc.OpenArchive(UTF8Encode(WideString(ArchiveData.ArcName))); Arc.Tag := 0; Result := TArcHandle(Arc); except on EAbUnhandledType do ArchiveData.OpenResult := E_UNKNOWN_FORMAT; on EAbFileNotFound do ArchiveData.OpenResult := E_EOPEN; on EAbUnhandledType do ArchiveData.OpenResult := E_NOT_SUPPORTED; on EFCreateError do ArchiveData.OpenResult := E_ECREATE; on EFOpenError do ArchiveData.OpenResult := E_EOPEN; on EReadError do ArchiveData.OpenResult := E_EREAD; on EWriteError do ArchiveData.OpenResult := E_EWRITE; else ArchiveData.OpenResult := -1; end; if (Result = 0) and Assigned(Arc) then Arc.Free; end; function ReadHeader(hArcData : TArcHandle; var HeaderData: THeaderData) : Integer;dcpcall; var Arc : TAbZipKitEx; sFileName : String; begin Arc := TAbZipKitEx(Pointer(hArcData)); if Arc.Tag > Arc.Count - 1 then Exit(E_END_ARCHIVE); sFileName := Arc.GetFileName(Arc.Tag); StrPLCopy(HeaderData.FileName, sFileName, SizeOf(HeaderData.FileName) - 1); with Arc.Items[Arc.Tag] do begin HeaderData.PackSize := CompressedSize; HeaderData.UnpSize := UncompressedSize; HeaderData.FileCRC := CRC32; HeaderData.FileTime := NativeLastModFileTime; HeaderData.FileAttr := NativeFileAttributes; end; Result := E_SUCCESS; end; function ReadHeaderEx(hArcData : TArcHandle; var HeaderData: THeaderDataEx) : Integer;dcpcall; var Arc : TAbZipKitEx; sFileName : String; begin Arc := TAbZipKitEx(Pointer(hArcData)); if Arc.Tag > Arc.Count - 1 then Exit(E_END_ARCHIVE); sFileName := Arc.GetFileName(Arc.Tag); StrPLCopy(HeaderData.FileName, sFileName, SizeOf(HeaderData.FileName) - 1); with Arc.Items[Arc.Tag] do begin HeaderData.PackSize := Lo(CompressedSize); HeaderData.PackSizeHigh := Hi(CompressedSize); HeaderData.UnpSize := Lo(UncompressedSize); HeaderData.UnpSizeHigh := Hi(UncompressedSize); HeaderData.FileCRC := CRC32; HeaderData.FileTime := NativeLastModFileTime; HeaderData.FileAttr := NativeFileAttributes; end; Result := E_SUCCESS; end; function ReadHeaderExW(hArcData : TArcHandle; var HeaderData: THeaderDataExW) : Integer;dcpcall; var Arc : TAbZipKitEx; sFileName : String; begin Arc := TAbZipKitEx(Pointer(hArcData)); if Arc.Tag > Arc.Count - 1 then Exit(E_END_ARCHIVE); sFileName := Arc.GetFileName(Arc.Tag); StringToArrayW(UTF8Decode(sFileName), @HeaderData.FileName, SizeOf(HeaderData.FileName)); with Arc.Items[Arc.Tag] do begin HeaderData.PackSize := Lo(CompressedSize); HeaderData.PackSizeHigh := Hi(CompressedSize); HeaderData.UnpSize := Lo(UncompressedSize); HeaderData.UnpSizeHigh := Hi(UncompressedSize); HeaderData.FileCRC := CRC32; HeaderData.FileTime := NativeLastModFileTime; HeaderData.FileAttr := NativeFileAttributes; end; Result := E_SUCCESS; end; function ProcessFile (hArcData : TArcHandle; Operation : Integer; DestPath, DestName : PChar) : Integer;dcpcall; var Arc : TAbZipKitEx; begin Arc := TAbZipKitEx(Pointer(hArcData)); try Arc.FOperationResult := E_SUCCESS; case Operation of PK_TEST: begin Arc.TestItemAt(Arc.Tag); // Show progress and ask if aborting. if Assigned(Arc.FProcessDataProc) then begin if Arc.FProcessDataProc(PChar(Arc.Items[Arc.Tag].FileName), Arc.Items[Arc.Tag].UncompressedSize) = 0 then Arc.FOperationResult := E_EABORTED; end; end; PK_EXTRACT: begin if (DestPath <> nil) and (DestPath[0] <> #0) then Arc.BaseDirectory := DestPath else Arc.BaseDirectory := ExtractFilePath(DestName); Arc.ExtractAt(Arc.Tag, DestName); // Show progress and ask if aborting. if Assigned(Arc.FProcessDataProc) then begin if Arc.FProcessDataProc(PChar(Arc.Items[Arc.Tag].FileName), Arc.Items[Arc.Tag].UncompressedSize) = 0 then Arc.FOperationResult := E_EABORTED; end; end; PK_SKIP: begin end; end; {case} except on EAbUserAbort do Arc.FOperationResult := E_EABORTED; else Arc.FOperationResult := E_BAD_DATA; end; Result:= Arc.FOperationResult; Arc.Tag := Arc.Tag + 1; end; function ProcessFileW(hArcData : TArcHandle; Operation : Integer; DestPath, DestName : PWideChar) : Integer;dcpcall; var Arc : TAbZipKitEx; DestNameUtf8: UTF8String; begin Arc := TAbZipKitEx(Pointer(hArcData)); try Arc.FOperationResult := E_SUCCESS; case Operation of PK_TEST: begin Arc.TestItemAt(Arc.Tag); // Show progress and ask if aborting. if Assigned(Arc.FProcessDataProcW) then begin if Arc.FProcessDataProcW(PWideChar(UTF8Decode(Arc.Items[Arc.Tag].FileName)), Arc.Items[Arc.Tag].UncompressedSize) = 0 then Arc.FOperationResult := E_EABORTED; end; end; PK_EXTRACT: begin DestNameUtf8 := UTF8Encode(WideString(DestName)); if (DestPath <> nil) and (DestPath[0] <> #0) then Arc.BaseDirectory := DestPath else Arc.BaseDirectory := ExtractFilePath(DestNameUtf8); Arc.ExtractAt(Arc.Tag, DestNameUtf8); // Show progress and ask if aborting. if Assigned(Arc.FProcessDataProcW) then begin if Arc.FProcessDataProcW(PWideChar(UTF8Decode(Arc.Items[Arc.Tag].FileName)), Arc.Items[Arc.Tag].UncompressedSize) = 0 then Arc.FOperationResult := E_EABORTED; end; end; PK_SKIP: begin end; end; {case} except on EAbUserAbort do Arc.FOperationResult := E_EABORTED; else Arc.FOperationResult := E_BAD_DATA; end; Result:= Arc.FOperationResult; Arc.Tag := Arc.Tag + 1; end; function CloseArchive (hArcData : TArcHandle) : Integer;dcpcall; var Arc : TAbZipKitEx; begin Arc := TAbZipKitEx(Pointer(hArcData)); Arc.CloseArchive; FreeAndNil(Arc); Result := E_SUCCESS; end; procedure SetChangeVolProc (hArcData : TArcHandle; pChangeVolProc : PChangeVolProc);dcpcall; begin end; procedure SetChangeVolProcW(hArcData : TArcHandle; pChangeVolProc : TChangeVolProcW);dcpcall; begin end; procedure SetProcessDataProc (hArcData : TArcHandle; pProcessDataProc : TProcessDataProc);dcpcall; var Arc : TAbZipKitEx; begin if (hArcData <> wcxInvalidHandle) then // if archive is open begin Arc := TAbZipKitEx(Pointer(hArcData)); Arc.FProcessDataProc := pProcessDataProc; end else // if archive is close gProcessDataProc := pProcessDataProc; end; procedure SetProcessDataProcW(hArcData : TArcHandle; pProcessDataProc : TProcessDataProcW);dcpcall; var Arc : TAbZipKitEx; begin if (hArcData <> wcxInvalidHandle) then // if archive is open begin Arc := TAbZipKitEx(Pointer(hArcData)); Arc.FProcessDataProcW := pProcessDataProc; end else // if archive is close gProcessDataProcW := pProcessDataProc; end; {Optional functions} function PackFiles(PackedFile: PChar; SubPath: PChar; SrcPath: PChar; AddList: PChar; Flags: Integer): Integer;dcpcall; var Arc : TAbZipKitEx; FilePath: AnsiString; FileName: AnsiString; sPassword: AnsiString; begin try try Arc := TAbZipKitEx.Create(nil); Arc.AutoSave := False; Arc.CompressionMethodToUse:= gCompressionMethodToUse; Arc.DeflationOption:= gDeflationOption; Arc.FProcessDataProc := gProcessDataProc; Arc.OnProcessItemFailure := @Arc.AbProcessItemFailureEvent; Arc.StoreOptions := Arc.StoreOptions + [soReplace]; if ((Flags and PK_PACK_ENCRYPT) <> 0) and (LowerCase(ExtractFileExt(PackedFile)) = '.zip') then // only zip supports encryption begin Arc.AbNeedPasswordEvent(Arc, sPassword); Arc.Password:= sPassword; end; Arc.TarAutoHandle:=True; Arc.OpenArchive(PackedFile); Arc.OnArchiveItemProgress := @Arc.AbArchiveItemProgressEvent; Arc.OnArchiveProgress := @Arc.AbArchiveProgressEvent; Arc.BaseDirectory := SrcPath; FilePath:= AnsiString(SubPath); while True do begin FileName := AnsiString(AddList); Arc.Archive.AddEntry(FileName, FilePath); if (AddList + Length(FileName) + 1)^ = #0 then Break; Inc(AddList, Length(FileName) + 1); end; Arc.Save; Arc.CloseArchive; Result := E_SUCCESS; except on EAbUserAbort do Result := E_EABORTED; on EAbFileNotFound do Result := E_EOPEN; on EAbUnhandledType do Result := E_NOT_SUPPORTED; on EFCreateError do Result := E_ECREATE; on EFOpenError do Result := E_EOPEN; on EReadError do Result := E_EREAD; on EWriteError do Result := E_EWRITE; else begin Result := E_BAD_DATA; end; end; finally FreeAndNil(Arc); end; end; function PackFilesW(PackedFile: PWideChar; SubPath: PWideChar; SrcPath: PWideChar; AddList: PWideChar; Flags: Integer): Integer;dcpcall; var Arc : TAbZipKitEx; FilePath: UTF8String; FileName: WideString; sPassword: AnsiString; sPackedFile: UTF8String; begin try try Arc := TAbZipKitEx.Create(nil); Arc.AutoSave := False; Arc.CompressionMethodToUse:= gCompressionMethodToUse; Arc.DeflationOption:= gDeflationOption; Arc.FProcessDataProcW := gProcessDataProcW; Arc.OnProcessItemFailure := @Arc.AbProcessItemFailureEvent; Arc.StoreOptions := Arc.StoreOptions + [soReplace]; sPackedFile := UTF8Encode(WideString(PackedFile)); if ((Flags and PK_PACK_ENCRYPT) <> 0) and (LowerCase(ExtractFileExt(sPackedFile)) = '.zip') then // only zip supports encryption begin Arc.AbNeedPasswordEvent(Arc, sPassword); Arc.Password:= sPassword; end; Arc.TarAutoHandle:=True; Arc.OpenArchive(sPackedFile); Arc.OnArchiveItemProgress := @Arc.AbArchiveItemProgressEvent; Arc.OnArchiveProgress := @Arc.AbArchiveProgressEvent; Arc.BaseDirectory := UTF8Encode(WideString(SrcPath)); FilePath:= UTF8Encode(WideString(SubPath)); while True do begin FileName := WideString(AddList); Arc.Archive.AddEntry(UTF8Encode(FileName), FilePath); if (AddList + Length(FileName) + 1)^ = #0 then Break; Inc(AddList, Length(FileName) + 1); end; Arc.Save; Arc.CloseArchive; Result := E_SUCCESS; except on EAbUserAbort do Result := E_EABORTED; on EAbFileNotFound do Result := E_EOPEN; on EAbUnhandledType do Result := E_NOT_SUPPORTED; on EFCreateError do Result := E_ECREATE; on EFOpenError do Result := E_EOPEN; on EReadError do Result := E_EREAD; on EWriteError do Result := E_EWRITE; else begin Result := E_BAD_DATA; end; end; finally FreeAndNil(Arc); end; end; function DeleteFiles (PackedFile, DeleteList : PChar) : Integer;dcpcall; var Arc : TAbZipKitEx; pFileName : PChar; FileName : String; begin try try Arc := TAbZipKitEx.Create(nil); Arc.FProcessDataProc := gProcessDataProc; Arc.OnProcessItemFailure := @Arc.AbProcessItemFailureEvent; Arc.OnNeedPassword:= @Arc.AbNeedPasswordEvent; Arc.TarAutoHandle:=True; Arc.OpenArchive(PackedFile); // Set this after opening archive, to get only progress of deleting. Arc.OnArchiveItemProgress := @Arc.AbArchiveItemProgressEvent; Arc.OnArchiveProgress := @Arc.AbArchiveProgressEvent; // Parse file list. pFileName := DeleteList; while pFileName^ <> #0 do begin FileName := pFileName; // Convert PChar to String (up to first #0). // If ends with '.../*.*' or '.../' then delete directory. if StrEndsWith(FileName, PathDelim + '*.*') or StrEndsWith(FileName, PathDelim) then Arc.DeleteDirectoriesRecursively(ExtractFilePath(FileName)) else Arc.DeleteFiles(FileName); pFileName := pFileName + Length(FileName) + 1; // move after filename and ending #0 if pFileName^ = #0 then Break; // end of list end; Arc.Save; Arc.CloseArchive; Result := E_SUCCESS; except on EAbUserAbort do Result := E_EABORTED; on EAbFileNotFound do Result := E_EOPEN; on EAbUnhandledType do Result := E_NOT_SUPPORTED; on EFCreateError do Result := E_ECREATE; on EFOpenError do Result := E_EOPEN; on EReadError do Result := E_EREAD; on EWriteError do Result := E_EWRITE; else Result := E_BAD_DATA; end; finally FreeAndNil(Arc); end; end; function DeleteFilesW(PackedFile, DeleteList : PWideChar) : Integer;dcpcall; var Arc : TAbZipKitEx; pFileName : PWideChar; FileName : WideString; FileNameUTF8 : UTF8String; begin try try Arc := TAbZipKitEx.Create(nil); Arc.FProcessDataProcW := gProcessDataProcW; Arc.OnProcessItemFailure := @Arc.AbProcessItemFailureEvent; Arc.OnNeedPassword:= @Arc.AbNeedPasswordEvent; Arc.TarAutoHandle:=True; Arc.OpenArchive(UTF8Encode(WideString(PackedFile))); // Set this after opening archive, to get only progress of deleting. Arc.OnArchiveItemProgress := @Arc.AbArchiveItemProgressEvent; Arc.OnArchiveProgress := @Arc.AbArchiveProgressEvent; // Parse file list. pFileName := DeleteList; while pFileName^ <> #0 do begin FileName := pFileName; // Convert PWideChar to WideString (up to first #0). FileNameUTF8 := UTF8Encode(FileName); // If ends with '.../*.*' or '.../' then delete directory. if StrEndsWith(FileNameUTF8, PathDelim + '*.*') or StrEndsWith(FileNameUTF8, PathDelim) then Arc.DeleteDirectoriesRecursively(ExtractFilePath(FileNameUTF8)) else Arc.DeleteFiles(FileNameUTF8); pFileName := pFileName + Length(FileName) + 1; // move after filename and ending #0 if pFileName^ = #0 then Break; // end of list end; Arc.Save; Arc.CloseArchive; Result := E_SUCCESS; except on EAbUserAbort do Result := E_EABORTED; on EAbFileNotFound do Result := E_EOPEN; on EAbUnhandledType do Result := E_NOT_SUPPORTED; on EFCreateError do Result := E_ECREATE; on EFOpenError do Result := E_EOPEN; on EReadError do Result := E_EREAD; on EWriteError do Result := E_EWRITE; else Result := E_BAD_DATA; end; finally FreeAndNil(Arc); end; end; function GetPackerCaps : Integer;dcpcall; begin Result := PK_CAPS_NEW or PK_CAPS_DELETE or PK_CAPS_MODIFY or PK_CAPS_MULTIPLE or PK_CAPS_OPTIONS or PK_CAPS_BY_CONTENT or PK_CAPS_ENCRYPT; // or PK_CAPS_MEMPACK end; procedure ConfigurePacker(Parent: HWND; DllInstance: THandle);dcpcall; begin CreateZipConfDlg; end; function CanYouHandleThisFile(FileName: PAnsiChar): Boolean; dcpcall; begin try Result:= (AbDetermineArcType(SysToUTF8(AnsiString(FileName)), atUnknown) <> atUnknown); except Result := False; end; end; function CanYouHandleThisFileW(FileName: PWideChar): Boolean; dcpcall; begin try Result:= (AbDetermineArcType(UTF8Encode(WideString(FileName)), atUnknown) <> atUnknown); except Result := False; end; end; procedure ExtensionInitialize(StartupInfo: PExtensionStartupInfo); dcpcall; begin gStartupInfo:= StartupInfo^; // Load configuration from ini file LoadConfig; end; { TAbZipKitEx } constructor TAbZipKitEx.Create(AOwner: TComponent); begin inherited Create(AOwner); FOperationResult := E_SUCCESS; FProcessDataProc := nil; FProcessDataProcW := nil; TempDirectory := GetTempDir; end; function TAbZipKitEx.GetFileName(aFileIndex: Integer): String; begin Result := Items[aFileIndex].FileName; if (ArchiveType in [atGzip, atGzippedTar]) and (Result = 'unknown') then begin Result := ExtractOnlyFileName(FileName); if (ArchiveType = atGzippedTar) then begin if (TarAutoHandle = False) and (ExtractOnlyFileExt(Result) <> 'tar') then Result := Result + '.tar'; end; end; DoDirSeparators(Result); Result := ExcludeTrailingPathDelimiter(Result); end; procedure TAbZipKitEx.AbProcessItemFailureEvent(Sender: TObject; Item: TAbArchiveItem; ProcessType: TAbProcessType; ErrorClass: TAbErrorClass; ErrorCode: Integer); begin case ErrorCode of AbUserAbort: FOperationResult:= E_EABORTED; AbZipBadCRC: FOperationResult:= E_BAD_ARCHIVE; AbFileNotFound: FOperationResult:= E_NO_FILES; AbReadError: FOperationResult:= E_EREAD; else FOperationResult:= E_BAD_DATA; end; end; procedure TAbZipKitEx.AbArchiveItemProgressEvent(Sender: TObject; Item: TAbArchiveItem; Progress: Byte; var Abort: Boolean); begin try if Assigned(FProcessDataProcW) then begin if Assigned(Item) then Abort := (FProcessDataProcW(PWideChar(UTF8Decode(Item.FileName)), -(Progress)) = 0) else Abort := (FProcessDataProcW(nil, -(Progress)) = 0); end else if Assigned(FProcessDataProc) then begin if Assigned(Item) then Abort := (FProcessDataProc(PAnsiChar(Item.FileName), -(Progress)) = 0) else Abort := (FProcessDataProc(nil, -(Progress)) = 0); end; except Abort := True; end; end; procedure TAbZipKitEx.AbArchiveProgressEvent(Sender: TObject; Progress: Byte; var Abort: Boolean); begin try if Assigned(FProcessDataProcW) then Abort := (FProcessDataProcW(nil, -(Progress + 1000)) = 0) else if Assigned(FProcessDataProc) then Abort := (FProcessDataProc(nil, -(Progress + 1000)) = 0); except Abort := True; end; end; procedure TAbZipKitEx.AbNeedPasswordEvent(Sender: TObject; var NewPassword: AnsiString); var aNewPassword: array[0..MAX_PATH-1] of AnsiChar; Result: Boolean; begin aNewPassword := Copy(NewPassword, 1, MAX_PATH); Result:= gStartupInfo.InputBox('Zip', 'Please enter the password:', True, PAnsiChar(aNewPassword), MAX_PATH); if Result then begin NewPassword := aNewPassword; end else begin raise EAbUserAbort.Create; end; end; end. ������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/src/ZipApp.pas������������������������������������������������������0000644�0001750�0001750�00000011026�12014201074�020260� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower Abbrevia * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1997-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {*********************************************************} {* ABBREVIA: ZipApp.pas *} {*********************************************************} {* ABBREVIA: Additional classes and routines *} {*********************************************************} unit ZipApp; {$mode objfpc}{$H+} interface uses Classes, SysUtils, AbArcTyp, AbZipKit, AbUtils; type { TAbArchiveItemHelper } TAbArchiveItemHelper = class helper for TAbArchiveItem function MatchesPath(const Path : String; Recursive : Boolean = False) : Boolean; function MatchesPathEx(const Paths : String; Recursive : Boolean = False) : Boolean; end; { TAbArchiveAccess } TAbArchiveAccess = class(TAbArchive) end; { TAbZipKit } TAbZipKit = class(TAbCustomZipKit) public {en Delete directory entry and all file and directory entries matching the same path recursively } procedure DeleteDirectoriesRecursively(const Paths : String); {en Test specific item in the archive } procedure TestItemAt(Index : Integer); end; {en See if DirPath matches PathToMatch. If Recursive=True it is allowed for DirPath to point to a subdirectory of PathToMatch, for example: PathToMatch = 'dir/', DirPath = 'dir/subdir' - Result is True. } function AbDirMatch(DirPath : String; PathToMatch : String; Recursive : Boolean) : Boolean; {en From a list of paths separated with AbPathSep (';') extracts a path from the position StartPos (counted from 1) and modifies StartPos to point to next entry. When no more entries are found, returns empty string. } function AbExtractEntry(const Entries : String; var StartPos : Integer) : String; implementation uses AbExcept; { TAbArchiveItemHelper } function TAbArchiveItemHelper.MatchesPath(const Path: String; Recursive: Boolean): Boolean; var Value : string; Drive, Dir, Name : string; begin Value := Path; if (Value <> '') and (RightStr(Value, 1) <> AbPathDelim) then Value := Value + AbPathDelim; AbUnfixName(Value); AbParseFileName(Path, Drive, Dir, Name); Value := Dir + Name; Name := FileName; AbUnfixName(Name); Result := AbDirMatch(Name, Value, Recursive); end; function TAbArchiveItemHelper.MatchesPathEx(const Paths: String; Recursive: Boolean): Boolean; var Position: Integer; Path: String; begin Result := True; Position := 1; while True do begin Path := AbExtractEntry(Paths, Position); if Path = '' then Break; if MatchesPath(Path, Recursive) then Exit; end; Result := False; end; { TAbZipKit } procedure TAbZipKit.DeleteDirectoriesRecursively(const Paths: String); var I : Integer; begin TAbArchiveAccess(Archive).CheckValid; if Count > 0 then begin for I := Pred(Count) downto 0 do begin with Archive.ItemList[I] do if MatchesPathEx(Paths, True) then DeleteAt(I); end; end; end; procedure TAbZipKit.TestItemAt(Index: Integer); begin if (Archive <> nil) then TAbArchiveAccess(Archive).TestItemAt(Index) else raise EAbNoArchive.Create; end; function AbDirMatch(DirPath : String; PathToMatch : String; Recursive : Boolean) : Boolean; begin if Recursive then PathToMatch := PathToMatch + '*'; // append wildcard Result := AbPatternMatch(DirPath, 1, PathToMatch, 1); end; function AbExtractEntry(const Entries : String; var StartPos : Integer) : String; var I : Integer; Len: Integer; begin Result := ''; Len := Length(Entries); I := StartPos; if (I >= 1) and (I <= Len) then begin while (I <= Len) and (Entries[I] <> AbPathSep) do Inc(I); Result := Copy(Entries, StartPos, I - StartPos); if (I <= Len) and (Entries[I] = AbPathSep) then Inc(I); StartPos := I; end; end; end. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/src/fpc-extra.cfg���������������������������������������������������0000644�0001750�0001750�00000000157�11673054716�020750� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#IFDEF CPU64 #IFDEF FPC_CROSSCOMPILING -Fl/usr/lib/gcc/i486-linux-gnu/4.6/64 -Fl/usr/local/lib64 #ENDIF #ENDIF �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/src/Zip.dpr���������������������������������������������������������0000644�0001750�0001750�00000001115�12014201074�017617� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library Zip; uses SysUtils, Classes, ZipFunc in 'ZipFunc.pas'; exports { Mandatory } OpenArchive, OpenArchiveW, ReadHeader, ReadHeaderEx, ReadHeaderExW, ProcessFile, ProcessFileW, CloseArchive, SetChangeVolProc, SetChangeVolProcW, SetProcessDataProc, SetProcessDataProcW, { Optional } PackFiles, PackFilesW, DeleteFiles, DeleteFilesW, GetPackerCaps, ConfigurePacker, CanYouHandleThisFile, CanYouHandleThisFileW, { Extension API } ExtensionInitialize; {$R *.res} begin {$IFDEF UNIX} WriteLN('Zip plugin is loaded'); {$ENDIF} end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/src/ZipConfDlg.lfm��������������������������������������������������0000644�0001750�0001750�00000010576�12002451220�021055� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������object DialogBox: TDialogBox Left = 526 Height = 299 Top = 165 Width = 424 AutoSize = True BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Zip plugin configuration' ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ClientHeight = 299 ClientWidth = 424 OnShow = DialogBoxShow Position = poScreenCenter LCLVersion = '0.9.31' object lblAbout: TLabel Left = 6 Height = 109 Top = 6 Width = 412 Align = alClient Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = 'Zip plugin supports PKZIP-compatible, TAR, GZip and BZip2 data compression and archiving.'#13#10#13#10'Copyright (C) 2006-2012 Alexander Koblov (alexx2000@mail.ru)' ParentColor = False WordWrap = True end object gbCompression: TGroupBox Left = 6 Height = 158 Top = 135 Width = 412 Align = alBottom AutoSize = True BorderSpacing.Top = 20 Caption = 'Compression' ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ClientHeight = 140 ClientWidth = 408 TabOrder = 0 object lblCompressionMethodToUse: TLabel AnchorSideLeft.Control = gbCompression AnchorSideTop.Control = gbCompression Left = 6 Height = 16 Top = 6 Width = 154 Caption = 'Compression method to use:' ParentColor = False end object lblDeflationOption: TLabel AnchorSideLeft.Control = gbCompression AnchorSideTop.Control = lblCompressionMethodToUse AnchorSideTop.Side = asrBottom Left = 6 Height = 16 Top = 40 Width = 90 BorderSpacing.Top = 18 Caption = 'Deflation option:' ParentColor = False end object cbCompressionMethodToUse: TComboBox AnchorSideLeft.Control = lblCompressionMethodToUse AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblCompressionMethodToUse AnchorSideTop.Side = asrCenter Left = 172 Height = 23 Top = 3 Width = 156 BorderSpacing.Left = 12 BorderSpacing.Right = 6 ItemHeight = 15 ItemIndex = 2 Items.Strings = ( 'smStored' 'smDeflated' 'smBestMethod' ) OnChange = ComboBoxChange Style = csDropDownList TabOrder = 0 Text = 'smBestMethod' end object cbDeflationOption: TComboBox AnchorSideLeft.Control = cbCompressionMethodToUse AnchorSideTop.Control = lblDeflationOption AnchorSideTop.Side = asrCenter AnchorSideRight.Control = cbCompressionMethodToUse AnchorSideRight.Side = asrBottom Left = 172 Height = 23 Top = 37 Width = 156 Anchors = [akTop, akLeft, akRight] ItemHeight = 15 ItemIndex = 0 Items.Strings = ( 'doNormal' 'doMaximum' 'doFast' 'doSuperFast' ) OnChange = ComboBoxChange Style = csDropDownList TabOrder = 1 Text = 'doNormal' end object btnOK: TButton AnchorSideTop.Control = btnCancel AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnCancel Left = 216 Height = 25 Top = 109 Width = 42 Anchors = [akTop, akRight] AutoSize = True BorderSpacing.Right = 8 Caption = 'OK' OnClick = ButtonClick TabOrder = 3 end object btnCancel: TButton AnchorSideTop.Control = chkTarAutoHandle AnchorSideTop.Side = asrBottom AnchorSideRight.Control = cbDeflationOption AnchorSideRight.Side = asrBottom Left = 266 Height = 25 Top = 109 Width = 62 Anchors = [akTop, akRight] AutoSize = True BorderSpacing.Top = 24 Caption = 'Cancel' OnClick = ButtonClick TabOrder = 4 end object chkTarAutoHandle: TCheckBox AnchorSideLeft.Control = lblDeflationOption AnchorSideTop.Control = cbDeflationOption AnchorSideTop.Side = asrBottom AnchorSideRight.Control = cbDeflationOption AnchorSideRight.Side = asrBottom Left = 6 Height = 19 Top = 66 Width = 322 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = 'Open *.tar.xxx archives at one step (slowly for big archives)' TabOrder = 2 end end end ����������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/src/Zip.lpi���������������������������������������������������������0000644�0001750�0001750�00000005026�12247124203�017631� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <CONFIG> <ProjectOptions> <Version Value="9"/> <PathDelim Value="\"/> <General> <SessionStorage Value="InProjectDir"/> <MainUnit Value="0"/> <ResourceType Value="res"/> </General> <VersionInfo> <UseVersionInfo Value="True"/> <MinorVersionNr Value="1"/> <StringTable FileDescription="ZIP WCX plugin for Double Commander" LegalCopyright="Copyright (C) 2006-2012 Koblov Alexander" ProductVersion=""/> </VersionInfo> <BuildModes Count="1"> <Item1 Name="default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <RequiredPackages Count="1"> <Item1> <PackageName Value="doublecmd_common"/> <MinVersion Minor="2" Valid="True"/> </Item1> </RequiredPackages> <Units Count="1"> <Unit0> <Filename Value="Zip.dpr"/> <IsPartOfProject Value="True"/> </Unit0> </Units> </ProjectOptions> <CompilerOptions> <Version Value="11"/> <Target> <Filename Value="../lib/zip.wcx" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir);../../../../sdk"/> <OtherUnitFiles Value="../fparchive;../../../../sdk"/> <UnitOutputDirectory Value="../lib"/> </SearchPaths> <Conditionals Value="if (TargetCPU <> 'arm') then begin CustomOptions += '-fPIC'; end; if (TargetOS = 'linux') then begin LinkerOptions += ' -z relro'; end; if (TargetOS = 'darwin') then begin LinkerOptions += ' -no_order_inits'; end;"/> <Linking> <Debugging> <DebugInfoType Value="dsStabs"/> </Debugging> <LinkSmart Value="True"/> <Options> <PassLinkerOptions Value="True"/> <ExecutableType Value="Library"/> </Options> </Linking> <Other> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <ConfigFile> <CustomConfigFile Value="True"/> <ConfigFilePath Value="fpc-extra.cfg"/> </ConfigFile> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> </CONFIG> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/zip/COPYING.txt���������������������������������������������������������0000644�0001750�0001750�00000043131�12014201074�017434� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. <one line to give the program's name and a brief idea of what it does.> Copyright (C) <year> <name of author> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. <signature of Ty Coon>, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unbz2/������������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016035� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unbz2/bzip2/������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�017063� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unbz2/bzip2/bzip2i386.inc�����������������������������������������������0000644�0001750�0001750�00000001620�12014201074�021177� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{$ASMMODE intel} {$define HAVE_DETRANSFORM} { procedure Tbzip2_decode_stream.detransform; var a:cardinal; p,q,r:Pcardinal; begin a:=0; p:=@tt^[0]; q:=p+tt_count; while p<>q do begin r:=@tt^[cftab[p^ and $ff]]; inc(cftab[p^ and $ff]); r^:=r^ or a; inc(a,256); inc(p); end; end; } {const c:cardinal=0; procedure mcount;external name 'mcount';} procedure Tbzip2_decode_stream.detransform;assembler; asm { mov edx,offset c call mcount} xor edx,edx lea ebx,[esi+Tbzip2_decode_stream.cftab] mov ecx,[esi+Tbzip2_decode_stream.tt_count] push esi push ebp mov esi,[esi+Tbzip2_decode_stream.tt] mov edi,esi lea ebp,[4*ecx+esi] jmp @a2 @a1: movzx eax,byte [esi] mov ecx,[ebx+4*eax] inc dword [ebx+4*eax] or [edi+4*ecx],edx add edx,$100 add esi,4 @a2: cmp esi,ebp jne @a1 pop ebp pop esi end ['eax','ebx','ecx','edx','edi']; ����������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unbz2/bzip2/bzip2.pas���������������������������������������������������0000644�0001750�0001750�00000042367�12014201074�020614� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit bzip2; {**************************************************************************** BZIP2 decompression unit Copyright (C) 2002 by Daniel Mantione This unit provides a decompression stream to decode .bz2 files. It is inpired by Julian R. Seward's libbzip2 library and therefore you should send credits to him and bug reports to me :) This code is licensed under the same terms as the original libbz2 library, which is decsribed in the file LICENSE. If you don't have this file, look at http://www.freepascal.org for this bzip2 unit, the LICENSE file will be included. In case of problems, contact the author. E-mail addresses: Daniel Mantione <daniel.mantione@freepascal.org> Julian R. Seward <jseward@acm.org> Please do not contact Julian about this Pascal library, he didn't wrote it. ****************************************************************************} interface {$goto on} {$pointermath on} uses objects; const max_groups=6; max_alpha_size=258; max_code_len=23; group_size=50; iter_count=4; max_selectors=2+(900000 div group_size); const mtfa_size=4096; mtfl_size=16; type Tcardinal_array=array [0..899999] of cardinal; Pcardinal_array=^Tcardinal_array; Pcardinal=^cardinal; Thuffarray=array[0..max_alpha_size] of cardinal; Phuffarray=^Thuffarray; Tbzip2_decode_stream=object(Tstream) short:cardinal; readstream:Pstream; block_randomized:boolean; blocksize:byte; tt:Pcardinal_array; tt_count:cardinal; rle_run_left,rle_run_data:byte; nextrle:Pbyte; decode_available:cardinal; block_origin:cardinal; current_block:cardinal; read_data,bits_available:byte; inuse16:set of 0..15; inuse:set of 0..255; inuse_count:cardinal; seq_to_unseq:array[0..255] of byte; alphasize:cardinal; group_count,group_pos,gsel,gminlen:byte; group_no:cardinal; glimit,gperm,gbase:Phuffarray; selector_count:cardinal; selector,selector_mtf:array[0..max_selectors] of byte; len:array[0..max_groups,0..max_alpha_size] of byte; limit:array[0..max_groups,0..max_alpha_size] of cardinal; base:array[0..max_groups,0..max_alpha_size] of cardinal; perm:array[0..max_groups,0..max_alpha_size] of cardinal; minlens:array[0..max_groups] of byte; cftab:array[0..257] of cardinal; mtfbase:array[0..256 div mtfl_size-1] of cardinal; mtfa:array[0..mtfa_size-1] of byte; constructor init(Areadstream:Pstream); function get_bits(n:byte):byte; function get_boolean:boolean; function get_byte:byte; function get_cardinal24:cardinal; function get_cardinal:cardinal; procedure receive_mapping_table; procedure receive_selectors; procedure undo_mtf_values; procedure receive_coding_tables; procedure make_hufftab; procedure init_mtf; function get_mtf_value:cardinal; procedure move_mtf_block; procedure receive_mtf_values; procedure detransform; function decode_block:boolean; procedure read(var buf;count:Longint);virtual; procedure new_block; procedure consume_rle;inline; procedure rle_read(bufptr:Pbyte;var count:Longint); destructor done;virtual; end; {A bzip2 stream starts with this:} const bzip2_stream_magic='BZh'; {Error codes for stream errorinfo.} const bzip2_bad_header_magic =1; bzip2_bad_block_magic =2; bzip2_endoffile =3; bzip2_data_error =4; implementation {$ifdef i386} {$i bzip2i386.inc} {$endif} procedure hb_create_decode_tables(var limit,base,perm:array of cardinal; var length:array of byte; minlen,maxlen:byte;alphasize:cardinal); var pp,i,j,vec:cardinal; begin pp:=0; for i:=minlen to maxlen do for j:=0 to alphasize-1 do if length[j]=i then begin perm[pp]:=j; inc(pp); end; for i:=0 to max_code_len-1 do begin base[i]:=0; limit[i]:=0; end; for i:=0 to alphasize-1 do inc(base[length[i]+1]); for i:=1 to max_code_len-1 do inc(base[i],base[i-1]); vec:=0; for i:=minlen to maxlen do begin inc(vec,base[i+1]-base[i]); limit[i]:=vec-1; vec:=vec shl 1; end; for i:=minlen+1 to maxlen do base[i]:=((limit[i-1]+1) shl 1)-base[i]; end; {***************************************************************************** Tbzip2_decode_stream *****************************************************************************} constructor Tbzip2_decode_stream.init(Areadstream:Pstream); var magic:array[1..3] of char; c:char; begin readstream:=Areadstream; {Read the magic.} readstream^.read(magic,sizeof(magic)); if magic<>bzip2_stream_magic then begin error(stiniterror,bzip2_bad_header_magic); exit; end; {Read the block size and allocate the working array.} readstream^.read(c,1); blocksize:=byte(c)-byte('0'); getmem(tt,blocksize*100000*sizeof(cardinal)); decode_available:=high(decode_available); end; function Tbzip2_decode_stream.get_bits(n:byte):byte; var data:byte; begin if n>bits_available then begin readstream^.read(data,1); get_bits:=(read_data shr (8-n)) or data shr (8-(n-bits_available)); read_data:=data shl (n-bits_available); inc(bits_available,8); end else begin get_bits:=read_data shr (8-n); read_data:=read_data shl n; end; dec(bits_available,n); end; function Tbzip2_decode_stream.get_boolean:boolean; begin get_boolean:=boolean(get_bits(1)); end; function Tbzip2_decode_stream.get_byte:byte; begin get_byte:=get_bits(8); end; function Tbzip2_decode_stream.get_cardinal24:cardinal; begin get_cardinal24:=get_bits(8) shl 16 or get_bits(8) shl 8 or get_bits(8); end; function Tbzip2_decode_stream.get_cardinal:cardinal; begin get_cardinal:=get_bits(8) shl 24 or get_bits(8) shl 16 or get_bits(8) shl 8 or get_bits(8); end; procedure Tbzip2_decode_stream.receive_mapping_table; {Receive the mapping table. To save space, the inuse set is stored in pieces of 16 bits. First 16 bits are stored which pieces of 16 bits are used, then the pieces follow.} var i,j:byte; begin inuse16:=[]; {Receive the first 16 bits which tell which pieces are stored.} for i:=0 to 15 do if get_boolean then include(inuse16,i); {Receive the used pieces.} inuse:=[]; inuse_count:=0; for i:=0 to 15 do if i in inuse16 then for j:=0 to 15 do if get_boolean then begin include(inuse,16*i+j); seq_to_unseq[inuse_count]:=16*i+j; inc(inuse_count); end; { system.write('Mapping table: '); for i:=0 to 255 do if i in inuse then system.write(i,' '); writeln;} end; procedure Tbzip2_decode_stream.receive_selectors; {Receives the selectors.} var i:cardinal; j:byte; begin group_count:=get_bits(3); selector_count:=get_bits(8) shl 7 or get_bits(7); for i:=0 to selector_count-1 do begin j:=0; while get_boolean do begin inc(j); if j>5 then error(streaderror,bzip2_data_error); end; selector_mtf[i]:=j; end; { system.write('Selector_mtf: '); for i:=0 to selector_count-1 do system.write(selector_mtf[i],' '); writeln;} end; procedure Tbzip2_decode_stream.undo_mtf_values; {Undo the MTF values for the selectors.} var pos:array[0..max_groups] of byte; i:cardinal; v,tmp:byte; begin for v:=0 to group_count-1 do pos[v]:=v; for i:=0 to selector_count-1 do begin v:=selector_mtf[i]; tmp:=pos[v]; while v<>0 do begin pos[v]:=pos[v-1]; dec(v); end; pos[0]:=tmp; selector[i]:=tmp; end; end; procedure Tbzip2_decode_stream.receive_coding_tables; var t,curr:byte; i:cardinal; begin for t:=0 to group_count-1 do begin curr:=get_bits(5); for i:=0 to alphasize-1 do begin repeat if not(curr in [1..20]) then begin error(streaderror,bzip2_data_error); exit; end; if not get_boolean then break; if get_boolean then dec(curr) else inc(curr); until false; len[t,i]:=curr; end; end; { writeln('Coding tables:'); for t:=0 to group_count-1 do begin for i:=0 to alphasize-1 do system.write(len[t,i],' '); writeln; end;} end; procedure Tbzip2_decode_stream.make_hufftab; {Builds the Huffman tables.} var i:cardinal; t,minlen,maxlen:byte; begin for t:=0 to group_count-1 do begin minlen:=32; maxlen:=0; for i:=0 to alphasize-1 do begin if len[t,i]>maxlen then maxlen:=len[t,i]; if len[t,i]<minlen then minlen:=len[t,i]; end; hb_create_decode_tables(limit[t],base[t],perm[t],len[t], minlen,maxlen,alphasize); minlens[t]:=minlen; end; end; procedure Tbzip2_decode_stream.init_mtf; var i,j:byte; k:cardinal; begin k:=mtfa_size-1; for i:=256 div mtfl_size-1 downto 0 do begin for j:=mtfl_size-1 downto 0 do begin mtfa[k]:=i*mtfl_size+j; dec(k); end; mtfbase[i]:=k+1; end; end; function Tbzip2_decode_stream.get_mtf_value:cardinal; var zn:byte; zvec:cardinal; begin if group_pos=0 then begin inc(group_no); group_pos:=group_size; gsel:=selector[group_no]; gminlen:=minlens[gsel]; glimit:=@limit[gsel]; gperm:=@perm[gsel]; gbase:=@base[gsel]; end; dec(group_pos); zn:=gminlen; zvec:=get_bits(zn); while zvec>glimit^[zn] do begin inc(zn); zvec:=zvec shl 1 or byte(get_boolean); end; get_mtf_value:=gperm^[zvec-gbase^[zn]]; end; procedure Tbzip2_decode_stream.move_mtf_block; var i:byte; j,k:cardinal; begin k:=MTFA_SIZE; for i:=256 div MTFL_SIZE-1 downto 0 do begin j:=mtfbase[i]; Pcardinal(@mtfa[k- 4])^:=Pcardinal(@mtfa[j+12])^; Pcardinal(@mtfa[k- 8])^:=Pcardinal(@mtfa[j+ 8])^; Pcardinal(@mtfa[k-12])^:=Pcardinal(@mtfa[j+ 4])^; dec(k,16); Pcardinal(@mtfa[k ])^:=Pcardinal(@mtfa[j ])^; mtfbase[i]:=k; end; end; procedure Tbzip2_decode_stream.receive_mtf_values; const run_a=0; run_b=1; var t,next_sym:cardinal; es:cardinal; n:byte; nn,i:cardinal; p,q:Pbyte; u,v:Pcardinal; lno,off:cardinal; begin group_no:=high(group_no); group_pos:=0; t:=0; for i:=0 to 257 do cftab[i]:=0; init_mtf; next_sym:=get_mtf_value; while next_sym<>inuse_count+1 do begin { writeln(t,' ',next_sym); if t=22296 then t:=t; } if next_sym<=run_b then begin es:=0; n:=0; repeat inc(es,(next_sym+1) shl n); inc(n); next_sym:=get_mtf_value; until next_sym>run_b; n:=seq_to_unseq[mtfa[mtfbase[0]]]; inc(cftab[n],es); if t+es>100000*blocksize then begin error(streaderror,bzip2_data_error); exit; end; while es>0 do begin tt^[t]:=n; dec(es); inc(t); end; end else begin nn:=next_sym-1; if nn<mtfl_size then begin {Avoid the costs of the general case.} p:=@mtfa[mtfbase[0]]; q:=p+nn; n:=q^; repeat q^:=(q-1)^; dec(q); until q=p; q^:=n; end else begin {General case.} lno:=nn div MTFL_SIZE; off:=nn and (MTFL_SIZE-1); p:=@mtfa[mtfbase[lno]]; q:=p+off; n:=q^; while(q<>p) do begin q^:=(q-1)^; dec(q); end; u:=@mtfbase; v:=u+lno; repeat mtfa[v^]:=mtfa[(v-1)^+MTFL_SIZE-1]; dec(v); dec(v^); until v=u; mtfa[v^]:=n; if v^=0 then move_mtf_block; end; inc(cftab[seq_to_unseq[n]]); tt^[t]:=cardinal(seq_to_unseq[n]); inc(t); if t>100000*blocksize then begin error(streaderror,bzip2_data_error); exit; end; next_sym:=get_mtf_value; end; end; tt_count:=t; {Setup cftab to facilitate generation of T^(-1).} t:=0; for i:=0 to 256 do begin nn:=cftab[i]; cftab[i]:=t; { writeln(i,' ',t);} inc(t,nn); end; end; {$ifndef HAVE_DETRANSFORM} procedure Tbzip2_decode_stream.detransform; var a:cardinal; p,q,r:Pcardinal; begin a:=0; p:=@tt^[0]; q:=p+tt_count; while p<>q do begin r:=@tt^[cftab[p^ and $ff]]; inc(cftab[p^ and $ff]); r^:=r^ or a; inc(a,256); inc(p); end; end; {$endif} function Tbzip2_decode_stream.decode_block:boolean; {Decode a new compressed block.} var magic:array[1..6] of char; stored_blockcrc:cardinal; i:byte; begin for i:=1 to 6 do magic[i]:=char(get_byte); if magic='1AY&SY' then begin inc(current_block); { writeln('Block ',current_block,': Header ok');} stored_blockcrc:=get_cardinal; block_randomized:=get_boolean; block_origin:=get_cardinal24; {Receive the mapping table.} receive_mapping_table; alphasize:=cardinal(inuse_count)+2; { writeln('Mapping table ok.');} {Receive the selectors.} receive_selectors; if status<>0 then exit; { writeln('Selectors ok.');} {Undo the MTF values for the selectors.} undo_mtf_values; { writeln('Undo mtf ok.');} {Receive the coding tables.} receive_coding_tables; if status<>0 then exit; { writeln('Coding tables ok');} {Build the Huffman tables.} make_hufftab; { writeln('Huffman ok.');} {Receive the MTF values.} receive_mtf_values; { writeln('MTF OK');} {Undo the Burrows Wheeler transformation.} detransform; { writeln('Detransform OK');} decode_available:=tt_count; end else begin if magic<>#$17'rE8P'#$90 then error(streaderror,bzip2_bad_block_magic); decode_block:=false; end; end; procedure Tbzip2_decode_stream.new_block; begin if decode_block then nextrle:=@tt^[tt^[block_origin] shr 8] else begin error(streaderror,bzip2_endoffile); nextrle:=nil; end; end; procedure Tbzip2_decode_stream.consume_rle;inline; {Make nextrle point to the next decoded byte. If nextrle did point to the last byte in the current block, decode the next block.} begin { Pcardinal(nextrle)^:=Pcardinal(nextrle)^ shr 8;} nextrle:=@tt^[Pcardinal(nextrle)^ shr 8]; dec(decode_available); if decode_available=0 then new_block; end; procedure Tbzip2_decode_stream.rle_read(bufptr:Pbyte;var count:Longint); var rle_len:cardinal; data:byte; label rle_write; begin rle_len:=rle_run_left; data:=rle_run_data; if block_randomized then {Not yet implemented.} runerror(212) else begin if rle_len<>0 then {Speed is important. Instead of an if statement within the repeat loop use a goto outside the loop.} goto rle_write; repeat if decode_available=0 then break; rle_len:=1; data:=nextrle^; consume_rle; if (decode_available>0) and (data=nextrle^) then begin inc(rle_len); consume_rle; if (decode_available>0) and (data=nextrle^) then begin inc(rle_len); consume_rle; if (decode_available>0) and (data=nextrle^) then begin consume_rle; inc(rle_len,nextrle^+1); consume_rle; end; end; end; rle_write: repeat bufptr^:=data; inc(bufptr); dec(count); dec(rle_len); until (rle_len=0) or (count=0); until count=0; short:=count; end; rle_run_data:=data; rle_run_left:=rle_len; end; procedure Tbzip2_decode_stream.read(var buf;count:Longint); var bufptr:Pbyte; begin short:=0; bufptr:=@buf; if decode_available=high(decode_available) then begin {Initialize the rle process: - Decode a block - Initialize pointer.} if not decode_block then begin error(streaderror,bzip2_endoffile); nextrle:=nil; end; nextrle:=@tt^[tt^[block_origin] shr 8]; end; rle_read(bufptr,count); end; destructor Tbzip2_decode_stream.done; begin if tt<>nil then freemem(tt,blocksize*100000*sizeof(cardinal)); inherited done; end; end. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unbz2/bzip2/pasbzip.pas�������������������������������������������������0000644�0001750�0001750�00000001563�12014201074�021227� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������program pasbzip; uses objects,bzip2; var infile,outfile:Tbufstream; decoder:Tbzip2_decode_stream; a:array[1..4096] of byte; i,readsize:cardinal; begin assign(output,'pasbzip.out'); rewrite(output); if paramcount<>1 then writeln('Usage: pasbunzip <file>') else begin infile.init(paramstr(1),stopenread,4096); outfile.init('OUTFILE',stcreate,4096); decoder.init(@infile); if decoder.status<>stok then writeln('Fout: ',decoder.status,' ',decoder.errorinfo); repeat readsize:=4096; decoder.read(a,readsize); dec(readsize,decoder.short); outfile.write(a,readsize); until decoder.status<>0; if decoder.status<>stok then writeln('Fout: ',decoder.status,' ',decoder.errorinfo); decoder.done; infile.done; outfile.done; end; close(output); end. ���������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unbz2/bzip2/LICENSE�����������������������������������������������������0000644�0001750�0001750�00000003424�10606265634�020076� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������This Pascal unit "bzip2.pas" is copyright (C) 2002 by Daniel Mantione It is inspired by "bzip2" and associated library "libbzip2", copyright (C) 1996-2002 by Julian R Seward. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Daniel Mantione, Delft, the Netherlans daniel.mantione@freepascal.org Pascal bzip2 unit, version 0.0.1 of 10 October 2002 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unbz2/lib/��������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016603� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unbz2/src/��������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016624� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unbz2/src/unbz2.dpr�����������������������������������������������������0000644�0001750�0001750�00000000470�12014201074�020356� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library unbz2; uses bz2func in 'bz2func.pas'; {$E wcx} {$R *.res} exports { Mandatory } OpenArchive, ReadHeader, ProcessFile, CloseArchive, SetChangeVolProc, SetProcessDataProc, { Optional } CanYouHandleThisFile; begin {$IFDEF UNIX} WriteLN('unbz2 plugin is loaded'); {$ENDIF} end. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unbz2/src/bz2func.pas���������������������������������������������������0000644�0001750�0001750�00000012756�12014201074�020677� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ Double commander ------------------------------------------------------------------------- WCX plugin for extract *.bz2 archives Copyright (C) 2007-2009 Koblov Alexander (Alexx2000@mail.ru) based on: pasbzip.pas from FPC sources This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License in a file called COPYING along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. } unit bz2func; {$mode delphi} {$include calling.inc} interface uses WcxPlugin; { Mandatory functions } function OpenArchive (var ArchiveData : tOpenArchiveData) : TArcHandle;dcpcall; function ReadHeader (hArcData : TArcHandle; var HeaderData : THeaderData) : Integer;dcpcall; function ProcessFile (hArcData : TArcHandle; Operation : Integer; DestPath, DestName : PChar) : Integer;dcpcall; function CloseArchive (hArcData : TArcHandle) : Integer;dcpcall; procedure SetChangeVolProc (hArcData : TArcHandle; pChangeVolProc : TChangeVolProc);dcpcall; procedure SetProcessDataProc (hArcData : TArcHandle; pProcessDataProc : TProcessDataProc);dcpcall; { Optional functions } function CanYouHandleThisFile(FileName: PChar): Boolean;dcpcall; implementation uses bzip2, SysUtils, Objects; var sArcName : String; Count : Integer = 0; ProcessDataProc : TProcessDataProc; function ExtractOnlyFileName(const FileName: string): string; var iDotIndex, I: longint; begin (* Find a dot index *) I := Length(FileName); while (I > 0) and not (FileName[I] in ['.', '/', '\', ':']) do Dec(I); if (I > 0) and (FileName[I] = '.') then iDotIndex := I else iDotIndex := MaxInt; (* Find file name index *) I := Length(FileName); while (I > 0) and not (FileName[I] in ['/', '\', ':']) do Dec(I); Result := Copy(FileName, I + 1, iDotIndex - I - 1); end; function OpenArchive (var ArchiveData : tOpenArchiveData) : TArcHandle; begin if FileExists(ArchiveData.ArcName) then begin sArcName := ArchiveData.ArcName; Count := 0; Result := 1985; end else Result := E_EOPEN; end; function ReadHeader (hArcData : TArcHandle; var HeaderData : THeaderData) : Integer; var sr : TSearchRec; begin if Count > 0 then begin Result := E_END_ARCHIVE; exit; end; with HeaderData do begin FindFirst(sArcName, faAnyFile, sr); FileName := ExtractOnlyFileName(sArcName); PackSize := sr.Size; UnpSize := sr.Size; // we don't know real file size FileTime := sr.Time; FileAttr := sr.Attr; FindClose(sr); end; Result := 0; end; function ProcessFile (hArcData : TArcHandle; Operation : Integer; DestPath, DestName : PChar) : Integer; var infile,outfile:Tbufstream; decoder:Tbzip2_decode_stream; a:array[1..4096] of byte; i,readsize:cardinal; sOutputFileName : String; iLastPos : LongInt; begin Result := E_SUCCESS; case Operation of PK_TEST: begin Result := E_NOT_SUPPORTED; end; PK_EXTRACT: begin sOutputFileName := DestPath; if sOutputFileName <> '' then sOutputFileName := sOutputFileName + ExtractOnlyFileName(sArcName) else sOutputFileName := DestName; { // Debug assign(output, DestPath + 'unbz2.log'); rewrite(output); } begin infile.init(sArcName,stopenread,4096); outfile.init(sOutputFileName,stcreate,4096); decoder.init(@infile); { // Debug if decoder.status<>stok then writeln(output, 'Fout: ',decoder.status,' ',decoder.errorinfo); } iLastPos := infile.Position; repeat readsize:=4096; decoder.read(a,readsize); dec(readsize,decoder.short); outfile.write(a,readsize); if Assigned(ProcessDataProc) and (infile.Position <> iLastPos) then begin ProcessDataProc(PChar(sOutputFileName), infile.Position - iLastPos); iLastPos := infile.Position; end; until decoder.status<>0; { // Debug if decoder.status<>stok then writeln(output, 'Fout: ',decoder.status,' ',decoder.errorinfo); } decoder.done; infile.done; outfile.done; end; { // Debug close(output); } end; PK_SKIP: begin end; end; {case} Count := Count + 1; end; function CloseArchive (hArcData : TArcHandle) : Integer; begin Result := 0; end; procedure SetChangeVolProc (hArcData : TArcHandle; pChangeVolProc : TChangeVolProc); begin end; procedure SetProcessDataProc (hArcData : TArcHandle; pProcessDataProc : TProcessDataProc); begin if Assigned(pProcessDataProc) then ProcessDataProc := pProcessDataProc else ProcessDataProc := nil; end; function CanYouHandleThisFile(FileName: PChar): Boolean;dcpcall; var bz2bs : TBufStream; Buffer : array[1..5] of Char; begin try bz2bs.Init(FileName, stOpenRead, SizeOf(Buffer)); bz2bs.Read(Buffer, SizeOf(Buffer)); finally bz2bs.Done; end; Result := (Buffer = 'BZh91'); end; end. ������������������doublecmd-0.5.8/plugins/wcx/unbz2/src/unbz2.lpi�����������������������������������������������������0000644�0001750�0001750�00000004433�12210604521�020362� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <CONFIG> <ProjectOptions> <Version Value="9"/> <PathDelim Value="\"/> <General> <Flags> <LRSInOutputDirectory Value="False"/> </Flags> <SessionStorage Value="InProjectDir"/> <MainUnit Value="0"/> </General> <VersionInfo> <UseVersionInfo Value="True"/> <MinorVersionNr Value="1"/> <StringTable FileDescription="UnBZ2 WCX plugin for Double Commander" LegalCopyright="Copyright (C) 2006-2012 Koblov Alexander" ProductVersion=""/> </VersionInfo> <BuildModes Count="1"> <Item1 Name="default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <Units Count="1"> <Unit0> <Filename Value="unbz2.dpr"/> <IsPartOfProject Value="True"/> </Unit0> </Units> </ProjectOptions> <CompilerOptions> <Version Value="11"/> <PathDelim Value="\"/> <Target> <Filename Value="..\lib\unbz2.wcx" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="..\..\..\..\sdk"/> <OtherUnitFiles Value="..\bzip2;..\..\..\..\sdk"/> <UnitOutputDirectory Value="..\lib"/> </SearchPaths> <Conditionals Value="if (TargetCPU <> 'arm') then begin CustomOptions += '-fPIC'; end; if (TargetOS = 'darwin') then begin LinkerOptions += ' -no_order_inits'; end;"/> <Parsing> <SyntaxOptions> <SyntaxMode Value="Delphi"/> <UseAnsiStrings Value="False"/> </SyntaxOptions> </Parsing> <Linking> <LinkSmart Value="True"/> <Options> <PassLinkerOptions Value="True"/> <ExecutableType Value="Library"/> </Options> </Linking> <Other> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> </CONFIG> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/unbz2/COPYING.txt�������������������������������������������������������0000644�0001750�0001750�00000043131�12014201074�017672� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. <one line to give the program's name and a brief idea of what it does.> Copyright (C) <year> <name of author> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. <signature of Ty Coon>, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/lzma/�������������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�015740� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/lzma/COPYING.LESSER.txt�������������������������������������������������0000644�0001750�0001750�00000063514�12014201074�020600� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. <one line to give the library's name and a brief idea of what it does.> Copyright (C) <year> <name of author> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. <signature of Ty Coon>, 1 April 1990 Ty Coon, President of Vice That's all there is to it! ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/lzma/lib/���������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016506� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/lzma/src/���������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016527� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/lzma/src/lzma.lpr�������������������������������������������������������0000644�0001750�0001750�00000000372�12014201074�020175� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������library lzma; {$mode objfpc}{$H+} uses lzmafunc; exports { Mandatory } OpenArchive, ReadHeader, ProcessFile, CloseArchive, SetChangeVolProc, SetProcessDataProc, { Optional } PackFiles, GetPackerCaps; {$R *.res} begin end. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/lzma/src/lzma.lpi�������������������������������������������������������0000644�0001750�0001750�00000004454�12210604521�020173� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <CONFIG> <ProjectOptions> <Version Value="9"/> <PathDelim Value="\"/> <General> <SessionStorage Value="InProjectDir"/> <MainUnit Value="0"/> <ResourceType Value="res"/> </General> <VersionInfo> <UseVersionInfo Value="True"/> <MinorVersionNr Value="1"/> <StringTable FileDescription="LZMA WCX plugin for Double Commander" LegalCopyright="Copyright (C) 2006-2012 Koblov Alexander" ProductVersion=""/> </VersionInfo> <BuildModes Count="1"> <Item1 Name="default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <Units Count="1"> <Unit0> <Filename Value="lzma.lpr"/> <IsPartOfProject Value="True"/> <UnitName Value="lzma"/> </Unit0> </Units> </ProjectOptions> <CompilerOptions> <Version Value="11"/> <Target> <Filename Value="../lib/lzma.wcx" ApplyConventions="False"/> </Target> <SearchPaths> <IncludeFiles Value="$(ProjOutDir);../../../../sdk"/> <OtherUnitFiles Value="../../../../sdk;../LZMA;../LZMA/compression/LZ;../LZMA/compression/LZMA;../LZMA/compression/RangeCoder"/> <UnitOutputDirectory Value="../lib"/> </SearchPaths> <Conditionals Value="if (TargetCPU <> 'arm') then begin CustomOptions += '-fPIC'; end; if (TargetOS = 'darwin') then begin LinkerOptions += ' -no_order_inits'; end;"/> <Parsing> <SyntaxOptions> <UseAnsiStrings Value="False"/> </SyntaxOptions> </Parsing> <Linking> <LinkSmart Value="True"/> <Options> <PassLinkerOptions Value="True"/> <ExecutableType Value="Library"/> </Options> </Linking> <Other> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> </CONFIG> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/lzma/src/lzmafunc.pas���������������������������������������������������0000644�0001750�0001750�00000021345�12014201074�021042� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ Double commander ------------------------------------------------------------------------- WCX plugin for extract *.lzma archives Copyright (C) 2009-2011 Koblov Alexander (Alexx2000@mail.ru) Based on: LZMAAlone from Pascal LZMA SDK This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit lzmafunc; {$mode delphi}{$H+} {$include calling.inc} interface uses WcxPlugin, ULZMACommon; type TEncoderOptions = record DictionarySize: Integer; Lc: Integer; Lp: Integer; Pb: Integer; Fb: Integer; Eos: Boolean; Algorithm: Integer; MatchFinder: Integer; end; { TProgressProc } TProgressProc = class procedure LZMAProgress(const Action: TLZMAProgressAction; const Value: Int64); end; { Mandatory functions } function OpenArchive (var ArchiveData: TOpenArchiveData): TArcHandle; dcpcall; function ReadHeader (hArcData: TArcHandle; var HeaderData: THeaderData): Integer; dcpcall; function ProcessFile (hArcData: TArcHandle; Operation: Integer; DestPath, DestName: PChar): Integer; dcpcall; function CloseArchive (hArcData: TArcHandle): Integer; dcpcall; procedure SetChangeVolProc (hArcData: TArcHandle; pChangeVolProc: TChangeVolProc); dcpcall; procedure SetProcessDataProc (hArcData: TArcHandle; pProcessDataProc: TProcessDataProc); dcpcall; { Optional functions } function PackFiles(PackedFile: PChar; SubPath: PChar; SrcPath: PChar; AddList: PChar; Flags: Integer): Integer; dcpcall; function GetPackerCaps: Integer; dcpcall; implementation uses Classes, SysUtils, ULZMADecoder, ULZMAEncoder, UBufferedFS; const PropertiesSize = 5; type { TLzmaHandle } TLzmaHandle = class inStream: TBufferedFS; outSize: Int64; Properties: array[0..Pred(PropertiesSize)] of Byte; function Open(const FileName: String): LongInt; destructor Destroy; override; end; { TLzmaHandle } function TLzmaHandle.Open(const FileName: String): LongInt; begin Result:= E_SUCCESS; try inStream:= nil; inStream:= TBufferedFS.Create(FileName, fmOpenRead or fmShareDenyNone); except on EFOpenError do Result:= E_EOPEN; end; if Result <> E_SUCCESS then Exit; if inStream.Read(Properties, PropertiesSize) <> PropertiesSize then Exit(E_BAD_DATA); outSize := LEtoN(inStream.ReadQWord); if (outSize = DWORD(-1)) then outSize := 0; end; destructor TLzmaHandle.Destroy; begin if Assigned(inStream) then FreeAndNil(inStream); inherited Destroy; end; var sArcName: String; Count: Integer = 0; ProgressPos: Int64 = 0; EncoderOptions: TEncoderOptions; ProcessDataProc: TProcessDataProc; function ExtractOnlyFileName(const FileName: String): String; var iDotIndex, I: LongInt; begin // Find a dot index I:= Length(FileName); while (I > 0) and not (FileName[I] in ['.', '/', '\', ':']) do Dec(I); if (I > 0) and (FileName[I] = '.') then iDotIndex:= I else iDotIndex:= MaxInt; // Find file name index I := Length(FileName); while (I > 0) and not (FileName[I] in ['/', '\', ':']) do Dec(I); Result:= Copy(FileName, I + 1, iDotIndex - I - 1); end; procedure ApplyDefaultEncoderOptions; begin with EncoderOptions do begin DictionarySize:= 1 shl 23; Lc:= 3; Lp:= 0; Pb:= 2; Fb:= 128; Eos:= False; Algorithm:= 2; MatchFinder:= 1; end; end; function OpenArchive (var ArchiveData: TOpenArchiveData): TArcHandle; var lzmaHandle: TLzmaHandle; begin Result:= 0; if FileExists(ArchiveData.ArcName) then begin sArcName:= ArchiveData.ArcName; lzmaHandle:= TLzmaHandle.Create; ArchiveData.OpenResult:= lzmaHandle.Open(sArcName); if ArchiveData.OpenResult <> E_SUCCESS then Exit; Count:= 0; Result:= TArcHandle(lzmaHandle); end; end; function ReadHeader (hArcData: TArcHandle; var HeaderData: THeaderData): Integer; var lzmaHandle: TLzmaHandle absolute hArcData; sr: TSearchRec; begin if Count > 0 then begin Result:= E_END_ARCHIVE; Exit; end; with HeaderData do begin FindFirst(sArcName, faAnyFile, sr); FileName := ExtractOnlyFileName(sArcName); PackSize := sr.Size; UnpSize := Lo(lzmaHandle.outSize); FileTime := sr.Time; FileAttr := sr.Attr; FindClose(sr); end; Result:= E_SUCCESS; end; function ProcessFile (hArcData: TArcHandle; Operation: Integer; DestPath, DestName: PChar): Integer; var lzmaHandle: TLzmaHandle absolute hArcData; outStream: TBufferedFS = nil; decoder: TLZMADecoder = nil; sOutputFileName: String; begin Result:= E_SUCCESS; ProgressPos:= 0; case Operation of PK_TEST: begin Result := E_NOT_SUPPORTED; end; PK_EXTRACT: begin sOutputFileName:= DestPath; if sOutputFileName <> '' then sOutputFileName:= sOutputFileName + ExtractOnlyFileName(sArcName) else sOutputFileName:= DestName; try try outStream:= TBufferedFS.Create(sOutputFileName, fmCreate); except on EFCreateError do Result:= E_ECREATE; end; if Result <> E_SUCCESS then Exit; decoder:= TLZMADecoder.Create; decoder.OnProgress:= TProgressProc.LZMAProgress; if not decoder.SetDecoderProperties(lzmaHandle.Properties) then Exit(E_BAD_DATA); if not decoder.Code(lzmaHandle.inStream, outStream, lzmaHandle.outSize) then Exit(E_BAD_DATA); finally if Assigned(decoder) then FreeAndNil(decoder); if Assigned(outStream) then FreeAndNil(outStream); end; end; PK_SKIP: begin end; end; // case Count:= Count + 1; end; function CloseArchive (hArcData: TArcHandle): Integer; var lzmaHandle: TLzmaHandle absolute hArcData; begin if Assigned(lzmaHandle) then FreeAndNil(lzmaHandle); Result:= E_SUCCESS; end; procedure SetChangeVolProc (hArcData: TArcHandle; pChangeVolProc: TChangeVolProc); begin end; procedure SetProcessDataProc (hArcData: TArcHandle; pProcessDataProc: TProcessDataProc); begin if Assigned(pProcessDataProc) then ProcessDataProc:= pProcessDataProc else ProcessDataProc:= nil; end; function PackFiles(PackedFile: PChar; SubPath: PChar; SrcPath: PChar; AddList: PChar; Flags: Integer): Integer; var inStream: TBufferedFS = nil; outStream: TBufferedFS = nil; encoder: TLZMAEncoder = nil; filesize: Int64; sInputFileName: String; begin Result:= E_SUCCESS; ProgressPos:= 0; sInputFileName:= StrPas(SrcPath) + StrPas(AddList); sArcName:= PackedFile; try try inStream:= TBufferedFS.Create(sInputFileName, fmOpenRead or fmShareDenyNone); outStream:= TBufferedFS.Create(sArcName, fmCreate); except on EFOpenError do Result:= E_EOPEN; on EFCreateError do Result:= E_ECREATE; end; if Result <> E_SUCCESS then Exit; ApplyDefaultEncoderOptions; encoder:= TLZMAEncoder.Create; encoder.OnProgress:= TProgressProc.LZMAProgress; with EncoderOptions do begin if not encoder.SetAlgorithm(Algorithm) then Exit(E_BAD_DATA); if not encoder.SetDictionarySize(DictionarySize) then Exit(E_BAD_DATA); if not encoder.SeNumFastBytes(Fb) then Exit(E_BAD_DATA); if not encoder.SetMatchFinder(MatchFinder) then Exit(E_BAD_DATA); if not encoder.SetLcLpPb(Lc, Lp, Pb) then Exit(E_BAD_DATA); encoder.SetEndMarkerMode(Eos); encoder.WriteCoderProperties(outStream); if Eos then fileSize:= -1 else fileSize:= inStream.Size; end; outStream.WriteQWord(NtoLE(fileSize)); encoder.Code(inStream, outStream, -1, -1); finally FreeAndNil(encoder); {$IFDEF CPU64} outStream.Flush; FileClose(outStream.Handle); {$ELSE} FreeAndNil(outStream); {$ENDIF} FreeAndNil(inStream); end; end; function GetPackerCaps: Integer; begin Result:= PK_CAPS_NEW; end; { TProgressProc } procedure TProgressProc.LZMAProgress(const Action: TLZMAProgressAction; const Value: Int64); begin if (Action = LPAPos) and Assigned(ProcessDataProc) then begin ProcessDataProc(PChar(sArcName), (Value - ProgressPos)); ProgressPos:= Value; end; end; end. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/lzma/LZMA/��������������������������������������������������������������0000755�0001750�0001750�00000000000�12257501472�016503� 5����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/lzma/LZMA/ULZMAAlone.pas������������������������������������������������0000644�0001750�0001750�00000022213�12014201074�021041� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit ULZMAAlone; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} interface uses ULZMABench,ULZMAEncoder,ULZMADecoder,UBufferedFS,ULZMACommon,Classes; const kEncode=0; kDecode=1; kBenchmark=2; type TCommandLine=class public command:integer; NumBenchMarkPasses:integer; DictionarySize:integer; DictionarySizeIsDefined:boolean; Lc:integer; Lp:integer; Pb:integer; Fb:integer; FbIsDefined:boolean; Eos:boolean; Algorithm:integer; MatchFinder:integer; InFile:string; OutFile:string; constructor Create; function ParseSwitch(const s:string):boolean; function Parse:boolean; end; TLZMAAlone=class public procedure PrintHelp; procedure Main; end; implementation uses SysUtils; constructor TCommandLine.Create; begin Command:=-1; NumBenchMarkPasses:=10; DictionarySize:=1 shl 23; DictionarySizeIsDefined:= false; Lc:= 3; Lp:= 0; Pb:= 2; Fb:= 128; FbIsDefined:= false; Eos:= false; Algorithm:= 2; MatchFinder:= 1; end; function GetStr(const str:string;const offset:integer):string; var i:integer; begin result:=''; for i:=offset to length(str) do result:=result+str[i]; end; function GetInt(const str:string;const offset:integer):integer; var s:string; begin s:=GetStr(s,offset); result:=strtoint(s); end; function TCommandLine.ParseSwitch(const s:string):boolean; var l:integer; mfs:string; begin result:=false; l:=length(s); if l=0 then exit; case s[1] of 'd': begin DictionarySize := 1 shl GetInt(s,2); DictionarySizeIsDefined := true; result:=true; end; 'f': begin if (l>=2)and(s[2]='b') then begin fb:=GetInt(s,3); FbIsDefined := true; result:=true; end; end; 'a': begin Algorithm := GetInt(s,2); result:=true; end; 'l': begin if (l>=2) then begin if s[2]='c' then begin Lc:=GetInt(s,3); result:=true; end; if s[2]='p' then begin Lp:=GetInt(s,3); result:=true; end; end; end; 'p': begin if (l>=2)and(s[2]='b') then begin Pb:=GetInt(s,3); result:=true; end; end; 'e': begin if (l>=3)and(s[2]='o')and(s[3]='s') then begin eos:=true; result:=true; end; end; 'm': begin if (l>=2)and(s[2]='f') then begin mfs:=GetStr(s,3); if mfs='bt2' then MatchFinder:=0 else if mfs='bt4' then MatchFinder:=1 else if mfs='bt4b' then MatchFinder:=2 else begin result:=false; exit; end; end; end; else result:=false; end; end; function TCommandLine.Parse:boolean; var pos:integer; switchMode:boolean; i,l:integer; s,sw:string; begin pos := 1; switchMode := true; l:=ParamCount; for i := 1 to l do begin s := ParamStr(i); if length(s) = 0 then begin result:=false; exit; end; if switchMode then begin if comparestr(s,'--')= 0 then begin switchMode := false; continue; end; if s[1]='-' then begin sw := AnsiLowerCase(GetStr(s,2)); if length(sw) = 0 then begin result:=false; exit; end; try if not ParseSwitch(sw) then begin result:=false; exit; end; except on e:EConvertError do begin result:=false; exit; end; end; continue; end; end; if pos = 1 then begin if comparetext(s,'e')=0 then Command := kEncode else if comparetext(s,'d')=0 then Command := kDecode else if comparetext(s,'b')=0 then Command := kBenchmark else begin result:=false; exit; end; end else if pos = 2 then begin if Command = kBenchmark then begin try NumBenchmarkPasses := strtoint(s); if NumBenchmarkPasses < 1 then begin result:=false; exit; end; except on e:EConvertError do begin result:=false; exit; end; end; end else InFile := s; end else if pos = 3 then OutFile := s else begin result:=false; exit; end; inc(pos); continue; end; result:=true; exit; end; procedure TLZMAAlone.PrintHelp; begin writeln( #10'Usage: LZMA <e|d> [<switches>...] inputFile outputFile'#10 + ' e: encode file'#10 + ' d: decode file'#10 + ' b: Benchmark'#10 + '<Switches>'#10 + // ' -a{N}: set compression mode - [0, 1], default: 1 (max)\n' + ' -d{N}: set dictionary - [0,28], default: 23 (8MB)'#10 + ' -fb{N}: set number of fast bytes - [5, 273], default: 128'#10 + ' -lc{N}: set number of literal context bits - [0, 8], default: 3'#10 + ' -lp{N}: set number of literal pos bits - [0, 4], default: 0'#10 + ' -pb{N}: set number of pos bits - [0, 4], default: 2'#10 + ' -mf{MF_ID}: set Match Finder: [bt2, bt4], default: bt4'#10 + ' -eos: write End Of Stream marker'#10 ); end; procedure TLZMAAlone.Main; var params:TCommandLine; dictionary:integer; lzmaBench:tlzmabench; inStream:TBufferedFS; outStream:TBufferedFS; eos:boolean; encoder:TLZMAEncoder; filesize:int64; i:integer; properties:array[0..4] of byte; decoder:TLZMADecoder; outSize:int64; v:byte; const propertiessize=5; begin writeln(#10'LZMA (Pascal) 4.42 Copyright (c) 1999-2006 Igor Pavlov 2006-05-15'#10); if paramcount<1 then begin PrintHelp; exit; end; params:=TCommandLine.Create; if not params.Parse then begin writeln(#10'Incorrect command'); exit; end; if params.command=kBenchmark then begin dictionary:=1 shl 21; if params.DictionarySizeIsDefined then dictionary:=params.DictionarySize; if params.MatchFinder>1 then raise Exception.Create('Unsupported match finder'); lzmaBench:=TLZMABench.Create; lzmaBench.LzmaBenchmark(params.NumBenchMarkPasses,dictionary); lzmaBench.Free; end else if (params.command=kEncode)or(params.command=kDecode) then begin inStream:=TBufferedFS.Create(params.InFile,fmOpenRead or fmsharedenynone); outStream:=TBufferedFS.Create(params.OutFile,fmcreate); eos := false; if params.Eos then eos := true; if params.Command = kEncode then begin encoder:=TLZMAEncoder.Create; if not encoder.SetAlgorithm(params.Algorithm) then raise Exception.Create('Incorrect compression mode'); if not encoder.SetDictionarySize(params.DictionarySize) then raise Exception.Create('Incorrect dictionary size'); if not encoder.SeNumFastBytes(params.Fb) then raise Exception.Create('Incorrect -fb value'); if not encoder.SetMatchFinder(params.MatchFinder) then raise Exception.Create('Incorrect -mf value'); if not encoder.SetLcLpPb(params.Lc, params.Lp, params.Pb) then raise Exception.Create('Incorrect -lc or -lp or -pb value'); encoder.SetEndMarkerMode(eos); encoder.WriteCoderProperties(outStream); if eos then fileSize := -1 else fileSize := inStream.Size; for i := 0 to 7 do WriteByte(outStream,(fileSize shr (8 * i)) and $FF); encoder.Code(inStream, outStream, -1, -1); encoder.free; end else begin if inStream.read(properties, propertiesSize) <> propertiesSize then raise Exception.Create('input .lzma file is too short'); decoder := TLZMADecoder.Create; if not decoder.SetDecoderProperties(properties) then raise Exception.Create('Incorrect stream properties'); outSize := 0; for i := 0 to 7 do begin v := {shortint}(ReadByte(inStream)); if v < 0 then raise Exception.Create('Can''t read stream size'); outSize := outSize or v shl (8 * i); end; if not decoder.Code(inStream, outStream, outSize) then raise Exception.Create('Error in data stream'); decoder.Free; end; outStream.Free; inStream.Free; end else raise Exception.Create('Incorrect command'); params.Free; end; end. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/lzma/LZMA/LZMAAlone.dpr�������������������������������������������������0000644�0001750�0001750�00000001760�12014201074�020722� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������program LZMAAlone; {$MODE Delphi} uses UCRC in 'UCRC.pas', ULZBinTree in 'compression\LZ\ULZBinTree.pas', ULZInWindow in 'compression\LZ\ULZInWindow.pas', ULZOutWindow in 'compression\LZ\ULZOutWindow.pas', ULZMABase in 'compression\LZMA\ULZMABase.pas', ULZMACommon in 'compression\LZMA\ULZMACommon.pas', ULZMADecoder in 'compression\LZMA\ULZMADecoder.pas', ULZMAEncoder in 'compression\LZMA\ULZMAEncoder.pas', UBitTreeDecoder in 'compression\RangeCoder\UBitTreeDecoder.pas', UBitTreeEncoder in 'compression\RangeCoder\UBitTreeEncoder.pas', URangeDecoder in 'compression\RangeCoder\URangeDecoder.pas', URangeEncoder in 'compression\RangeCoder\URangeEncoder.pas', UBufferedFS in 'UBufferedFS.pas', ULZMAAlone in 'ULZMAAlone.pas', ULZMABench in 'ULZMABench.pas',SysUtils; var lz:TLZMAAlone; {$IFDEF MSWINDOWS} {$APPTYPE CONSOLE} {$ENDIF} begin try lz:=TLZMAAlone.Create; lz.Main; lz.Free; except on e:exception do writeln(e.message); end; end. ����������������doublecmd-0.5.8/plugins/wcx/lzma/LZMA/LZMAAlone.dof�������������������������������������������������0000644�0001750�0001750�00000015015�11222206571�020712� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������[FileVersion] Version=7.0 [Compiler] A=8 B=0 C=1 D=1 E=0 F=0 G=1 H=1 I=1 J=0 K=0 L=1 M=0 N=1 O=1 P=1 Q=0 R=0 S=0 T=0 U=0 V=1 W=0 X=1 Y=1 Z=1 ShowHints=1 ShowWarnings=1 UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; NamespacePrefix= SymbolDeprecated=1 SymbolLibrary=1 SymbolPlatform=1 UnitLibrary=1 UnitPlatform=1 UnitDeprecated=1 HResultCompat=1 HidingMember=1 HiddenVirtual=1 Garbage=1 BoundsError=1 ZeroNilCompat=1 StringConstTruncated=1 ForLoopVarVarPar=1 TypedConstVarPar=1 AsgToTypedConst=1 CaseLabelRange=1 ForVariable=1 ConstructingAbstract=1 ComparisonFalse=1 ComparisonTrue=1 ComparingSignedUnsigned=1 CombiningSignedUnsigned=1 UnsupportedConstruct=1 FileOpen=1 FileOpenUnitSrc=1 BadGlobalSymbol=1 DuplicateConstructorDestructor=1 InvalidDirective=1 PackageNoLink=1 PackageThreadVar=1 ImplicitImport=1 HPPEMITIgnored=1 NoRetVal=1 UseBeforeDef=1 ForLoopVarUndef=1 UnitNameMismatch=1 NoCFGFileFound=1 MessageDirective=1 ImplicitVariants=1 UnicodeToLocale=1 LocaleToUnicode=1 ImagebaseMultiple=1 SuspiciousTypecast=1 PrivatePropAccessor=1 UnsafeType=0 UnsafeCode=0 UnsafeCast=0 [Linker] MapFile=0 OutputObjs=0 ConsoleApp=1 DebugInfo=0 RemoteSymbols=0 MinStackSize=16384 MaxStackSize=1048576 ImageBase=4194304 ExeDescription= [Directories] OutputDir= UnitOutputDir= PackageDLLOutputDir= PackageDCPOutputDir= SearchPath= Packages=PFMod;PDirDialog;pamixer;PMedia;DJcl;JvStdCtrlsD7R;JvAppFrmD7R;JvCoreD7R;JvBandsD7R;JvBDED7R;JvDBD7R;JvDlgsD7R;JvCmpD7R;JvCryptD7R;JvCtrlsD7R;JvCustomD7R;JvDockingD7R;JvDotNetCtrlsD7R;JvEDID7R;qrpt;JvGlobusD7R;JvHMID7R;JvInspectorD7R;JvInterpreterD7R;JvJansD7R;JvManagedThreadsD7R;JvMMD7R;JvNetD7R;JvPageCompsD7R;JvPluginD7R;JvPrintPreviewD7R;JvSystemD7R;JvTimeFrameworkD7R;JvUIBD7R;JvValidatorsD7R;JvWizardD7R;JvXPCtrlsD7R;ppsvApplicationHook Conditionals= DebugSourceDirs= UsePackages=0 [Parameters] RunParams=e "c:\desktop\badlzma\dgaport.inf" "c:\desktop\test.lz" HostApplication=C:\Program Files\Borland\Delphi7\Projects\lzmabench\Project1.exe Launcher= UseLauncher=0 DebugCWD= [Version Info] IncludeVerInfo=0 AutoIncBuild=0 MajorVer=1 MinorVer=0 Release=0 Build=0 Debug=0 PreRelease=0 Special=0 Private=0 DLL=0 Locale=2057 CodePage=1252 [Version Info Keys] CompanyName= FileDescription= FileVersion=1.0.0.0 InternalName= LegalCopyright= LegalTrademarks= OriginalFilename= ProductName= ProductVersion=1.0.0.0 Comments= [Excluded Packages] C:\Program Files\Borland\Delphi7\Bin\dbx70.bpl=Borland SQL Explorer UI Package c:\program files\borland\delphi7\Bin\dclshlctrls70.bpl=Shell Control Property and Component Editors c:\program files\borland\delphi7\bin\dclRave70.bpl=Rave Reports BE 5.0 Package c:\program files\borland\delphi7\Projects\Bpl\L207vd70.bpl=TurboPower LockBox 2.07 Design-time package - VCL60 C:\Program Files\Borland\Delphi7\Bin\dclstd70.bpl=Borland Standard Components c:\program files\borland\delphi7\Bin\dclie70.bpl=Internet Explorer Components c:\program files\borland\delphi7\Bin\dcl31w70.bpl=Delphi 1.0 Compatibility Components c:\program files\borland\delphi7\Bin\dclIntraweb_50_70.bpl=Intraweb 5.0 Design Package for Delphi 7 c:\program files\borland\delphi7\Bin\dclofficexp70.bpl=Microsoft Office XP Sample Automation Server Wrapper Components c:\program files\borland\delphi7\Projects\Bpl\CrossKylix.bpl=CrossKylix IDE Plugin c:\program files\borland\delphi7\Projects\Bpl\VirtualTreesD7D.bpl=Virtual Treeview design time package c:\program files\borland\delphi7\Projects\Bpl\dclIndyCore70.bpl=Indy 10 Core Design Time c:\program files\borland\delphi7\Projects\Bpl\dclIndyProtocols70.bpl=Indy 10 Protocols Design Time c:\program files\borland\delphi7\Projects\Bpl\Png Delphi for Delphi 7.bpl=PNG Delphi (http://pngdelphi.sourceforge.net) c:\program files\borland\delphi7\Projects\Bpl\PDAB.bpl=(untitled) C:\Program Files\Borland\Delphi7\Projects\Bpl\Plinklists.bpl=(untitled) C:\Program Files\Borland\Delphi7\Projects\Bpl\PGIF.bpl=(untitled) c:\program files\borland\delphi7\Bin\idl2paswizardpkg.bpl=Borland IDL2PAS wizard package c:\program files\borland\delphi7\Bin\dclite70.bpl=Borland Integrated Translation Environment c:\program files\borland\delphi7\Bin\dclnet70.bpl=Borland Internet Components c:\program files\borland\delphi7\Bin\dclmcn70.bpl=Borland DataSnap Connection Components C:\Program Files\Borland\Delphi7\Bin\dclmid70.bpl=Borland MyBase DataAccess Components C:\Program Files\Borland\Delphi7\Bin\dcldb70.bpl=Borland Database Components c:\program files\borland\delphi7\Bin\dclsoap70.bpl=Borland SOAP Components c:\program files\borland\delphi7\Bin\dclocx70.bpl=Borland Sample Imported ActiveX Controls c:\program files\borland\delphi7\Bin\dclsmp70.bpl=Borland Sample Components c:\program files\borland\delphi7\Bin\dcldbx70.bpl=Borland dbExpress Components c:\program files\borland\delphi7\Bin\dcldbxcds70.bpl=Borland SimpleDataset Component (DBX) c:\program files\borland\delphi7\Bin\DBWEBXPRT.BPL=Borland Web Wizard Package C:\Program Files\Borland\Delphi7\Bin\dclbde70.bpl=Borland BDE DB Components c:\program files\borland\delphi7\Bin\dclwbm70.bpl=Borland InternetExpress Components c:\program files\borland\delphi7\Bin\dclwebsnap70.bpl=Borland WebSnap Components c:\program files\borland\delphi7\Bin\dclado70.bpl=Borland ADO DB Components c:\program files\borland\delphi7\Bin\DCLIB70.bpl=InterBase Data Access Components c:\program files\borland\delphi7\Bin\dcltee70.bpl=TeeChart Components c:\program files\borland\delphi7\Bin\dcldss70.bpl=Borland Decision Cube Components c:\program files\borland\delphi7\Bin\dclclxdb70.bpl=Borland CLX Database Components C:\Program Files\Borland\Delphi7\Bin\dclclxstd70.bpl=Borland CLX Standard Components c:\program files\borland\delphi7\Bin\dclsmpedit70.bpl=Borland Editor Script Enhancements c:\program files\borland\delphi7\Bin\applet70.bpl=Borland Control Panel Applet Package c:\program files\borland\delphi7\Bin\dclemacsedit70.bpl=Borland Editor Emacs Enhancements c:\program files\borland\delphi7\Bin\dclact70.bpl=Borland ActionBar Components c:\program files\borland\delphi7\Bin\dclmlwiz70.bpl=Borland Markup Language Wizards D:\WINDOWS\system32\ibevnt70.bpl=Borland Interbase Event Alerter Component c:\program files\borland\delphi7\Bin\dclindy70.bpl=Internet Direct (Indy) for D7 Property and Component Editors [HistoryLists\hlUnitAliases] Count=1 Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; [HistoryLists\hlSearchPath] Count=1 Item0=C:\Program Files\Promixis\Girder\includes �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/lzma/LZMA/history.txt���������������������������������������������������0000644�0001750�0001750�00000001710�12014201074�020726� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������HISTORY of the LZMA SDK ----------------------- Version 4.42b 2006-06-13 -------------------------------------- - Fixed bug in ULZBinTree which caused an infinite loop on some files - Fixed bug in ULZMAEncoder which caused encoding to fail on some files - Fixed code layout problems caused by a mixture of tabs and spaces Version 4.42a 2006-06-05 -------------------------------------- - Added port of LZMA benchmark Version 4.42 2006-06-01 -------------------------------------- - First version of Pascal SDK ported from Java SDK HISTORY of the LZMA ------------------- 2001-2004: Improvements to LZMA compressing/decompressing code, keeping compatibility with original LZMA format 1996-2001: Development of LZMA compression format Some milestones: 2001-08-30: LZMA compression was added to 7-Zip 1999-01-02: First version of 7-Zip was released End of document ��������������������������������������������������������doublecmd-0.5.8/plugins/wcx/lzma/LZMA/UCRC.pas������������������������������������������������������0000644�0001750�0001750�00000002663�12014201074�017735� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit UCRC; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} interface type TCRC=class public Value:integer; constructor Create; procedure Init; procedure Update(const data: array of byte;const offset,size:integer);overload; procedure Update(const data: array of byte);overload; procedure UpdateByte(const b:integer); function GetDigest:integer; end; implementation var Table: array [0..255] of integer; constructor TCRC.Create; begin Value:=-1; end; procedure TCRC.Init; begin Value:=-1; end; procedure TCRC.Update(const data: array of byte;const offset,size:integer); var i:integer; begin for i := 0 to size-1 do value := Table[(value xor data[offset + i]) and $FF] xor (value shr 8); end; procedure TCRC.Update(const data: array of byte); var size:integer; i:integer; begin size := length(data); for i := 0 to size - 1 do value := Table[(value xor data[i]) and $FF] xor (value shr 8); end; procedure TCRC.UpdateByte(const b:integer); begin value := Table[(value xor b) and $FF] xor (value shr 8); end; function TCRC.GetDigest:integer; begin result:=value xor (-1); end; procedure InitCRC; var i,j,r:integer; begin for i := 0 to 255 do begin r := i; for j := 0 to 7 do begin if ((r and 1) <> 0) then r := (r shr 1) xor integer($EDB88320) else r := r shr 1; end; Table[i] := r; end; end; initialization InitCRC; end. �����������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/lzma/LZMA/UBufferedFS.pas�����������������������������������������������0000644�0001750�0001750�00000011605�12014201074�021275� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit UBufferedFS; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} interface uses Classes,Math; const BufferSize=$10000;//64K type TBFSMode=(BFMRead,BFMWrite); TBufferedFS=class(TFileStream) private membuffer:array [0..BufferSize-1] of byte; bytesinbuffer:integer; bufferpos:integer; bufferdirty:boolean; Mode:TBFSMode; procedure Init; procedure ReadBuffer; public constructor Create(const FileName: string; Mode: Word); overload; constructor Create(const FileName: string; Mode: Word; Rights: Cardinal); overload; destructor Destroy; override; procedure Flush; {$IF (FPC_VERSION <= 2) and (FPC_RELEASE <= 4) and (FPC_PATCH <= 0)} function ReadQWord: QWord; procedure WriteQWord(q: QWord); {$ENDIF} function Read(var Buffer; Count: Longint): Longint; override; function Write(const Buffer; Count: Longint): Longint; override; function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override; end; type TByteArray = array of byte; PByteArray = ^TByteArray; implementation function MovePointer(const P: Pointer; const dist: PtrInt): Pointer; begin Result:= Pointer(PtrInt(p) + dist); end; procedure TBufferedFS.Init; begin bytesinbuffer:=0; bufferpos:=0; bufferdirty:=false; mode:=BFMWrite; end; procedure TBufferedFS.Flush; begin if bufferdirty then inherited Write(membuffer[0],bufferpos); bufferdirty:=false; bytesinbuffer:=0; bufferpos:=0; end; constructor TBufferedFS.Create(const FileName: string; Mode: Word); begin inherited Create(FileName, Mode); init; end; constructor TBufferedFS.Create(const FileName: string; Mode: Word; Rights: Cardinal); begin inherited Create(FileName, Mode, Rights); init; end; destructor TBufferedFS.Destroy; begin flush; inherited Destroy; end; procedure TBufferedFS.ReadBuffer; begin flush; bytesinbuffer:=inherited Read(membuffer,buffersize); bufferpos:=0; end; {$IF (FPC_VERSION <= 2) and (FPC_RELEASE <= 4) and (FPC_PATCH <= 0)} function TBufferedFS.ReadQWord: QWord; var q: QWord; begin ReadBuffer(q, SizeOf(QWord)); ReadQWord:= q; end; procedure TBufferedFS.WriteQWord(q: QWord); begin WriteBuffer(q, SizeOf(QWord)); end; {$ENDIF} function TBufferedFS.Read(var Buffer; Count: Longint): Longint; var p:PByteArray; bytestoread:integer; b:PtrInt; begin if Mode=BFMWrite then flush; mode:=BFMRead; result:=0; if count<=bytesinbuffer then begin //all data already in buffer move(membuffer[bufferpos],buffer,count); bytesinbuffer:=bytesinbuffer-count; bufferpos:=bufferpos+count; result:=count; end else begin bytestoread:=count; if (bytestoread<>0)and(bytesinbuffer<>0) then begin //read data remaining in buffer and increment data pointer b:=Read(buffer,bytesinbuffer); p:=PByteArray(@(TByteArray(buffer)[b])); bytestoread:=bytestoread-b; result:=b; end else p:=@buffer; if bytestoread>=BufferSize then begin //data to read is larger than the buffer, read it directly result:=result+inherited Read(p^,bytestoread); end else begin //refill buffer ReadBuffer; //recurse result:=result+Read(p^,math.Min(bytestoread,bytesinbuffer)); end; end; end; function TBufferedFS.Write(const Buffer; Count: Longint): Longint; var p:pointer; bytestowrite:integer; b:PtrInt; begin if mode=BFMRead then begin seek(-BufferSize+bufferpos,soFromCurrent); bytesinbuffer:=0; bufferpos:=0; end; mode:=BFMWrite; result:=0; if count<=BufferSize-bytesinbuffer then begin //all data fits in buffer bufferdirty:=true; move(buffer,membuffer[bufferpos],count); bytesinbuffer:=bytesinbuffer+count; bufferpos:=bufferpos+count; result:=count; end else begin bytestowrite:=count; if (bytestowrite<>0)and(bytesinbuffer<>BufferSize)and(bytesinbuffer<>0) then begin //write data to remaining space in buffer and increment data pointer b:=Write(buffer,BufferSize-bytesinbuffer); p:=MovePointer(@buffer,b); bytestowrite:=bytestowrite-b; result:=b; end else p:=@buffer; if bytestowrite>=BufferSize then begin //empty buffer Flush; //data to write is larger than the buffer, write it directly result:=result+inherited Write(p^,bytestowrite); end else begin //empty buffer Flush; //recurse result:=result+Write(p^,bytestowrite); end; end; end; function TBufferedFS.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; begin if (Origin=soCurrent)and(Offset=0) then result:=inherited seek(Offset,origin)+bufferpos else begin flush; result:=inherited Seek(offset,origin); end; end; end. ���������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/plugins/wcx/lzma/LZMA/CPL.html������������������������������������������������������0000644�0001750�0001750�00000035531�11222206571�020007� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML><HEAD><TITLE>Common Public License - v 1.0

Common Public License - v 1.0

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.

1. DEFINITIONS

"Contribution" means:

    a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
    b) in the case of each subsequent Contributor:
    i) changes to the Program, and
    ii) additions to the Program;
    where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.

"Contributor" means any person or entity that distributes the Program.

"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.

"Program" means the Contributions distributed in accordance with this Agreement.

"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.

2. GRANT OF RIGHTS

    a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
    b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
    c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
    d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.

3. REQUIREMENTS

A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:

    a) it complies with the terms and conditions of this Agreement; and
    b) its license agreement:
    i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
    ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
    iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
    iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.

When the Program is made available in source code form:

    a) it must be made available under this Agreement; and
    b) a copy of this Agreement must be included with each copy of the Program.

Contributors may not remove or alter any copyright notices contained within the Program.

Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.

4. COMMERCIAL DISTRIBUTION

Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.

For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.

5. NO WARRANTY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.

6. DISCLAIMER OF LIABILITY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. GENERAL

If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.

If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.

All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.

Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.

This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.

doublecmd-0.5.8/plugins/wcx/lzma/LZMA/LZMAAlone.lpi0000644000175000017500000001454111222206571020731 0ustar alexxalexx doublecmd-0.5.8/plugins/wcx/lzma/LZMA/compression/0000755000175000017500000000000012257501472021044 5ustar alexxalexxdoublecmd-0.5.8/plugins/wcx/lzma/LZMA/compression/LZ/0000755000175000017500000000000012257501472021371 5ustar alexxalexxdoublecmd-0.5.8/plugins/wcx/lzma/LZMA/compression/LZ/ULZOutWindow.pas0000644000175000017500000000410712014201074024414 0ustar alexxalexxunit ULZOutWindow; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} interface uses Classes; type TLZOutWindow=class public buffer: array of byte; pos:integer; windowSize:integer; streamPos:integer; stream:TStream; procedure _Create(const windowSize:integer); procedure SetStream(const stream:TStream); procedure ReleaseStream; procedure Init(const solid:boolean); procedure Flush; procedure CopyBlock(const distance:integer; len:integer); procedure PutByte(const b:byte); function GetByte(const distance:integer):byte; end; implementation procedure TLZOutWindow._Create(const windowSize:integer); begin if (length(buffer)=0) or (self.windowSize <> windowSize) then setlength(buffer,windowSize); self.windowSize := windowSize; pos := 0; streamPos := 0; end; procedure TLZOutWindow.SetStream(const stream:TStream); begin ReleaseStream; self.stream:=stream; end; procedure TLZOutWindow.ReleaseStream; begin flush; self.stream:=nil; end; procedure TLZOutWindow.Init(const solid:boolean); begin if not solid then begin streamPos:=0; Pos:=0; end; end; procedure TLZOutWindow.Flush; var size:integer; begin size := pos - streamPos; if (size = 0) then exit; stream.write(buffer[streamPos], size); if (pos >= windowSize) then pos := 0; streamPos := pos; end; procedure TLZOutWindow.CopyBlock(const distance:integer;len:integer); var pos:integer; begin pos := self.pos - distance - 1; if pos < 0 then pos := pos + windowSize; while len<>0 do begin if pos >= windowSize then pos := 0; buffer[self.pos] := buffer[pos]; inc(self.pos); inc(pos); if self.pos >= windowSize then Flush(); dec(len); end; end; procedure TLZOutWindow.PutByte(const b:byte); begin buffer[pos] := b; inc(pos); if (pos >= windowSize) then Flush(); end; function TLZOutWindow.GetByte(const distance:integer):byte; var pos:integer; begin pos := self.pos - distance - 1; if (pos < 0) then pos := pos + windowSize; result:=buffer[pos]; end; end. doublecmd-0.5.8/plugins/wcx/lzma/LZMA/compression/LZ/ULZInWindow.pas0000644000175000017500000001116512014201074024215 0ustar alexxalexxunit ULZInWindow; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} interface uses Classes; type TLZInWindow=class public bufferBase: array of byte;// pointer to buffer with data stream:TStream; posLimit:integer; // offset (from _buffer) of first byte when new block reading must be done streamEndWasReached:boolean; // if (true) then _streamPos shows real end of stream pointerToLastSafePosition:integer; bufferOffset:integer; blockSize:integer; // Size of Allocated memory block pos:integer; // offset (from _buffer) of curent byte keepSizeBefore:integer; // how many BYTEs must be kept in buffer before _pos keepSizeAfter:integer; // how many BYTEs must be kept buffer after _pos streamPos:integer; // offset (from _buffer) of first not read byte from Stream procedure MoveBlock; procedure ReadBlock; procedure _Free; procedure _Create(const keepSizeBefore, keepSizeAfter, keepSizeReserv:integer);virtual; procedure SetStream(const stream:TStream); procedure ReleaseStream; procedure Init;virtual; procedure MovePos;virtual; function GetIndexByte(const index:integer):byte; // index + limit have not to exceed _keepSizeAfter; function GetMatchLen(const index:integer;distance,limit:integer):integer; function GetNumAvailableBytes:integer; procedure ReduceOffsets(const subValue:integer); end; implementation procedure TLZInWindow.MoveBlock; var offset,numbytes,i:integer; begin offset := bufferOffset + pos - keepSizeBefore; // we need one additional byte, since MovePos moves on 1 byte. if (offset > 0) then dec(offset); numBytes := bufferOffset + streamPos - offset; // check negative offset ???? for i := 0 to numBytes -1 do bufferBase[i] := bufferBase[offset + i]; bufferOffset := bufferOffset - offset; end; procedure TLZInWindow.ReadBlock; var size,numreadbytes,pointerToPostion:integer; begin if streamEndWasReached then exit; while (true) do begin size := (0 - bufferOffset) + blockSize - streamPos; if size = 0 then exit; numReadBytes := stream.Read(bufferBase[bufferOffset + streamPos], size); if (numReadBytes = 0) then begin posLimit := streamPos; pointerToPostion := bufferOffset + posLimit; if (pointerToPostion > pointerToLastSafePosition) then posLimit := pointerToLastSafePosition - bufferOffset; streamEndWasReached := true; exit; end; streamPos := streamPos + numReadBytes; if (streamPos >= pos + keepSizeAfter) then posLimit := streamPos - keepSizeAfter; end; end; procedure TLZInWindow._Free; begin setlength(bufferBase,0); end; procedure TLZInWindow._Create(const keepSizeBefore, keepSizeAfter, keepSizeReserv:integer); var blocksize:integer; begin self.keepSizeBefore := keepSizeBefore; self.keepSizeAfter := keepSizeAfter; blockSize := keepSizeBefore + keepSizeAfter + keepSizeReserv; if (length(bufferBase) = 0) or (self.blockSize <> blockSize) then begin _Free; self.blockSize := blockSize; setlength(bufferBase,self.blockSize); end; pointerToLastSafePosition := self.blockSize - keepSizeAfter; end; procedure TLZInWindow.SetStream(const stream:TStream); begin self.stream:=stream; end; procedure TLZInWindow.ReleaseStream; begin stream:=nil; end; procedure TLZInWindow.Init; begin bufferOffset := 0; pos := 0; streamPos := 0; streamEndWasReached := false; ReadBlock; end; procedure TLZInWindow.MovePos; var pointerToPostion:integer; begin inc(pos); if pos > posLimit then begin pointerToPostion := bufferOffset + pos; if pointerToPostion > pointerToLastSafePosition then MoveBlock; ReadBlock; end; end; function TLZInWindow.GetIndexByte(const index:integer):byte; begin result:=bufferBase[bufferOffset + pos + index]; end; function TLZInWindow.GetMatchLen(const index:integer;distance,limit:integer):integer; var pby,i:integer; begin if streamEndWasReached then if (pos + index) + limit > streamPos then limit := streamPos - (pos + index); inc(distance); // Byte *pby = _buffer + (size_t)_pos + index; pby := bufferOffset + pos + index; i:=0; while (i 2); if HASH_ARRAY then begin kNumHashDirectBytes := 0; kMinMatchCheck := 4; kFixHashSize := kHash2Size + kHash3Size; end else begin kNumHashDirectBytes := 2; kMinMatchCheck := 2 + 1; kFixHashSize := 0; end; end; procedure TLZBinTree.Init; var i:integer; begin inherited init; for i := 0 to hashSizeSum - 1 do hash[i] := kEmptyHashValue; cyclicBufferPos := 0; ReduceOffsets(-1); end; procedure TLZBinTree.MovePos; begin inc(cyclicBufferPos); if cyclicBufferPos >= cyclicBufferSize then cyclicBufferPos := 0; inherited MovePos; if pos = kMaxValForNormalize then Normalize; end; function TLZBinTree._Create(const historySize,keepAddBufferBefore,matchMaxLen,keepAddBufferAfter:integer):boolean; var windowReservSize:integer; cyclicBufferSize:integer; hs:integer; begin if (historySize > kMaxValForNormalize - 256) then begin result:=false; exit; end; cutValue := 16 + (matchMaxLen shr 1); windowReservSize := (historySize + keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) div 2 + 256; inherited _Create(historySize + keepAddBufferBefore, matchMaxLen + keepAddBufferAfter, windowReservSize); self.matchMaxLen := matchMaxLen; cyclicBufferSize := historySize + 1; if self.cyclicBufferSize <> cyclicBufferSize then begin self.cyclicBufferSize:=cyclicBufferSize; setlength(son,cyclicBufferSize * 2); end; hs := kBT2HashSize; if HASH_ARRAY then begin hs := historySize - 1; hs := hs or (hs shr 1); hs := hs or (hs shr 2); hs := hs or (hs shr 4); hs := hs or (hs shr 8); hs := hs shr 1; hs := hs or $FFFF; if (hs > (1 shl 24)) then hs := hs shr 1; hashMask := hs; inc(hs); hs := hs + kFixHashSize; end; if (hs <> hashSizeSum) then begin hashSizeSum := hs; setlength(hash,hashSizeSum); end; result:=true; end; function TLZBinTree.GetMatches(var distances:array of integer):integer; var lenLimit:integer; offset,matchMinPos,cur,maxlen,hashvalue,hash2value,hash3value:integer; temp,curmatch,curmatch2,curmatch3,ptr0,ptr1,len0,len1,count:integer; delta,cyclicpos,pby1,len:integer; begin if pos + matchMaxLen <= streamPos then lenLimit := matchMaxLen else begin lenLimit := streamPos - pos; if lenLimit < kMinMatchCheck then begin MovePos(); result:=0; exit; end; end; offset := 0; if (pos > cyclicBufferSize) then matchMinPos:=(pos - cyclicBufferSize) else matchMinPos:=0; cur := bufferOffset + pos; maxLen := kStartMaxLen; // to avoid items for len < hashSize; hash2Value := 0; hash3Value := 0; if HASH_ARRAY then begin temp := CrcTable[bufferBase[cur] and $FF] xor (bufferBase[cur + 1] and $FF); hash2Value := temp and (kHash2Size - 1); temp := temp xor ((bufferBase[cur + 2] and $FF) shl 8); hash3Value := temp and (kHash3Size - 1); hashValue := (temp xor (CrcTable[bufferBase[cur + 3] and $FF] shl 5)) and hashMask; end else hashValue := ((bufferBase[cur] and $FF) xor ((bufferBase[cur + 1] and $FF) shl 8)); curMatch := hash[kFixHashSize + hashValue]; if HASH_ARRAY then begin curMatch2 := hash[hash2Value]; curMatch3 := hash[kHash3Offset + hash3Value]; hash[hash2Value] := pos; hash[kHash3Offset + hash3Value] := pos; if curMatch2 > matchMinPos then if bufferBase[bufferOffset + curMatch2] = bufferBase[cur] then begin maxLen := 2; distances[offset] := maxLen; inc(offset); distances[offset] := pos - curMatch2 - 1; inc(offset); end; if curMatch3 > matchMinPos then if bufferBase[bufferOffset + curMatch3] = bufferBase[cur] then begin if curMatch3 = curMatch2 then offset := offset - 2; maxLen := 3; distances[offset] := maxlen; inc(offset); distances[offset] := pos - curMatch3 - 1; inc(offset); curMatch2 := curMatch3; end; if (offset <> 0) and (curMatch2 = curMatch) then begin offset := offset - 2; maxLen := kStartMaxLen; end; end; hash[kFixHashSize + hashValue] := pos; ptr0 := (cyclicBufferPos shl 1) + 1; ptr1 := (cyclicBufferPos shl 1); len0 := kNumHashDirectBytes; len1 := len0; if kNumHashDirectBytes <> 0 then begin if (curMatch > matchMinPos) then begin if (bufferBase[bufferOffset + curMatch + kNumHashDirectBytes] <> bufferBase[cur + kNumHashDirectBytes]) then begin maxLen := kNumHashDirectBytes; distances[offset] := maxLen; inc(offset); distances[offset] := pos - curMatch - 1; inc(offset); end; end; end; count := cutValue; while (true) do begin if (curMatch <= matchMinPos) or (count = 0) then begin son[ptr1] := kEmptyHashValue; son[ptr0] := son[ptr1]; break; end; dec(count); delta := pos - curMatch; if delta<=cyclicBufferPos then cyclicpos:=(cyclicBufferPos - delta) shl 1 else cyclicpos:=(cyclicBufferPos - delta + cyclicBufferSize) shl 1; pby1 := bufferOffset + curMatch; len := min(len0, len1); if bufferBase[pby1 + len] = bufferBase[cur + len] then begin inc(len); while (len <> lenLimit) do begin if (bufferBase[pby1 + len] <> bufferBase[cur + len]) then break; inc(len); end; if maxLen < len then begin maxLen := len; distances[offset] := maxlen; inc(offset); distances[offset] := delta - 1; inc(offset); if (len = lenLimit) then begin son[ptr1] := son[cyclicPos]; son[ptr0] := son[cyclicPos + 1]; break; end; end; end; if (bufferBase[pby1 + len] and $FF) < (bufferBase[cur + len] and $FF) then begin son[ptr1] := curMatch; ptr1 := cyclicPos + 1; curMatch := son[ptr1]; len1 := len; end else begin son[ptr0] := curMatch; ptr0 := cyclicPos; curMatch := son[ptr0]; len0 := len; end; end; MovePos; result:=offset; end; procedure TLZBinTree.Skip(num:integer); var lenLimit,matchminpos,cur,hashvalue,temp,hash2value,hash3value,curMatch:integer; ptr0,ptr1,len,len0,len1,count,delta,cyclicpos,pby1:integer; begin repeat if pos + matchMaxLen <= streamPos then lenLimit := matchMaxLen else begin lenLimit := streamPos - pos; if lenLimit < kMinMatchCheck then begin MovePos(); dec(num); continue; end; end; if pos>cyclicBufferSize then matchminpos:=(pos - cyclicBufferSize) else matchminpos:=0; cur := bufferOffset + pos; if HASH_ARRAY then begin temp := CrcTable[bufferBase[cur] and $FF] xor (bufferBase[cur + 1] and $FF); hash2Value := temp and (kHash2Size - 1); hash[hash2Value] := pos; temp := temp xor ((bufferBase[cur + 2] and $FF) shl 8); hash3Value := temp and (kHash3Size - 1); hash[kHash3Offset + hash3Value] := pos; hashValue := (temp xor (CrcTable[bufferBase[cur + 3] and $FF] shl 5)) and hashMask; end else hashValue := ((bufferBase[cur] and $FF) xor ((bufferBase[cur + 1] and $FF) shl 8)); curMatch := hash[kFixHashSize + hashValue]; hash[kFixHashSize + hashValue] := pos; ptr0 := (cyclicBufferPos shl 1) + 1; ptr1 := (cyclicBufferPos shl 1); len0 := kNumHashDirectBytes; len1 := kNumHashDirectBytes; count := cutValue; while true do begin if (curMatch <= matchMinPos) or (count = 0) then begin son[ptr1] := kEmptyHashValue; son[ptr0] := son[ptr1]; break; end else dec(count); delta := pos - curMatch; if (delta <= cyclicBufferPos) then cyclicpos:=(cyclicBufferPos - delta) shl 1 else cyclicpos:=(cyclicBufferPos - delta + cyclicBufferSize) shl 1; pby1 := bufferOffset + curMatch; len := min(len0, len1); if bufferBase[pby1 + len] = bufferBase[cur + len] then begin inc(len); while (len <> lenLimit) do begin if bufferBase[pby1 + len] <> bufferBase[cur + len] then break; inc(len); end; if len = lenLimit then begin son[ptr1] := son[cyclicPos]; son[ptr0] := son[cyclicPos + 1]; break; end; end; if ((bufferBase[pby1 + len] and $FF) < (bufferBase[cur + len] and $FF)) then begin son[ptr1] := curMatch; ptr1 := cyclicPos + 1; curMatch := son[ptr1]; len1 := len; end else begin son[ptr0] := curMatch; ptr0 := cyclicPos; curMatch := son[ptr0]; len0 := len; end; end; MovePos; dec(num); until num=0; end; procedure TLZBinTree.NormalizeLinks(var items:array of integer;const numItems,subValue:integer); var i,value:integer; begin for i:=0 to NumItems-1 do begin value := items[i]; if value <= subValue then value := kEmptyHashValue else value := value - subValue; items[i] := value; end; end; procedure TLZBinTree.Normalize; var subvalue:integer; begin subValue := pos - cyclicBufferSize; NormalizeLinks(son, cyclicBufferSize * 2, subValue); NormalizeLinks(hash, hashSizeSum, subValue); ReduceOffsets(subValue); end; procedure TLZBinTree.SetCutValue(const cutvalue:integer); begin self.cutValue:=cutValue; end; procedure InitCRC; var i,r,j:integer; begin for i := 0 to 255 do begin r := i; for j := 0 to 7 do if ((r and 1) <> 0) then r := (r shr 1) xor integer($EDB88320) else r := r shr 1; CrcTable[i] := r; end; end; initialization InitCRC; end. doublecmd-0.5.8/plugins/wcx/lzma/LZMA/compression/RangeCoder/0000755000175000017500000000000012257501472023055 5ustar alexxalexxdoublecmd-0.5.8/plugins/wcx/lzma/LZMA/compression/RangeCoder/URangeEncoder.pas0000644000175000017500000001032312014201074026224 0ustar alexxalexxunit URangeEncoder; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} interface uses Classes,ULZMACommon; const kNumBitPriceShiftBits = 6; kTopMask = not ((1 shl 24) - 1); kNumBitModelTotalBits = 11; kBitModelTotal = (1 shl kNumBitModelTotalBits); kNumMoveBits = 5; kNumMoveReducingBits = 2; type TRangeEncoder=class private ProbPrices: array [0..kBitModelTotal shr kNumMoveReducingBits-1] of integer; public Stream:TStream; Low,Position:int64; Range,cacheSize,cache:integer; procedure SetStream(const stream:TStream); procedure ReleaseStream; procedure Init; procedure FlushData; procedure FlushStream; procedure ShiftLow; procedure EncodeDirectBits(const v,numTotalBits:integer); function GetProcessedSizeAdd:int64; procedure Encode(var probs: array of smallint;const index,symbol:integer); constructor Create; function GetPrice(const Prob,symbol:integer):integer; function GetPrice0(const Prob:integer):integer; function GetPrice1(const Prob:integer):integer; end; var RangeEncoder:TRangeEncoder; procedure InitBitModels(var probs:array of smallint); implementation procedure TRangeEncoder.SetStream(const stream:TStream); begin self.Stream:=Stream; end; procedure TRangeEncoder.ReleaseStream; begin stream:=nil; end; procedure TRangeEncoder.Init; begin position := 0; Low := 0; Range := -1; cacheSize := 1; cache := 0; end; procedure TRangeEncoder.FlushData; var i:integer; begin for i:=0 to 4 do ShiftLow(); end; procedure TRangeEncoder.FlushStream; begin //stream.flush; end; procedure TRangeEncoder.ShiftLow; var LowHi:integer; temp:integer; begin LowHi := (Low shr 32); if (LowHi <> 0) or (Low < int64($FF000000)) then begin position := position + cacheSize; temp := cache; repeat WriteByte(stream,byte(temp + LowHi)); temp := $FF; dec(cacheSize); until(cacheSize = 0); cache := (Low shr 24); end; inc(cacheSize); Low := (Low and integer($FFFFFF)) shl 8; end; procedure TRangeEncoder.EncodeDirectBits(const v,numTotalBits:integer); var i:integer; begin for i := numTotalBits - 1 downto 0 do begin Range := Range shr 1; if (((v shr i) and 1) = 1) then Low := Low + Range; if ((Range and kTopMask) = 0) then begin Range := range shl 8; ShiftLow; end; end; end; function TRangeEncoder.GetProcessedSizeAdd:int64; begin result:=cacheSize + position + 4; end; procedure InitBitModels(var probs:array of smallint); var i:integer; begin for i := 0 to length(probs) -1 do probs[i] := kBitModelTotal shr 1; end; procedure TRangeEncoder.Encode(var probs: array of smallint;const index,symbol:integer); var prob,newbound:integer; begin prob := probs[index]; newBound := integer((Range shr kNumBitModelTotalBits) * prob); if (symbol = 0) then begin Range := newBound; probs[index] := (prob + ((kBitModelTotal - prob) shr kNumMoveBits)); end else begin Low := Low + (newBound and int64($FFFFFFFF)); Range := integer(Range - newBound); probs[index] := (prob - ((prob) shr kNumMoveBits)); end; if ((Range and kTopMask) = 0) then begin Range := Range shl 8; ShiftLow; end; end; constructor TRangeEncoder.Create; var kNumBits:integer; i,j,start,_end:integer; begin kNumBits := (kNumBitModelTotalBits - kNumMoveReducingBits); for i := kNumBits - 1 downto 0 do begin start := 1 shl (kNumBits - i - 1); _end := 1 shl (kNumBits - i); for j := start to _end -1 do ProbPrices[j] := (i shl kNumBitPriceShiftBits) + (((_end - j) shl kNumBitPriceShiftBits) shr (kNumBits - i - 1)); end; end; function TRangeEncoder.GetPrice(const Prob,symbol:integer):integer; begin result:=ProbPrices[(((Prob - symbol) xor ((-symbol))) and (kBitModelTotal - 1)) shr kNumMoveReducingBits]; end; function TRangeEncoder.GetPrice0(const Prob:integer):integer; begin result:= ProbPrices[Prob shr kNumMoveReducingBits]; end; function TRangeEncoder.GetPrice1(const Prob:integer):integer; begin result:= ProbPrices[(kBitModelTotal - Prob) shr kNumMoveReducingBits]; end; initialization RangeEncoder:=TRangeEncoder.Create; finalization RangeEncoder.Free; end. doublecmd-0.5.8/plugins/wcx/lzma/LZMA/compression/RangeCoder/URangeDecoder.pas0000644000175000017500000000474212014201074026222 0ustar alexxalexxunit URangeDecoder; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} interface uses Classes,ULZMACommon; type TRangeDecoder=class public Range,Code:integer; Stream:TStream; procedure SetStream(const Stream:TStream); procedure ReleaseStream; procedure Init; function DecodeDirectBits(const numTotalBits:integer):integer; function DecodeBit(var probs: array of smallint;const index:integer):integer; end; procedure InitBitModels(var probs: array of smallint); implementation const kTopMask = not ((1 shl 24) - 1); kNumBitModelTotalBits = 11; kBitModelTotal = (1 shl kNumBitModelTotalBits); kNumMoveBits = 5; procedure TRangeDecoder.SetStream(const Stream:TStream); begin self.Stream:=Stream; end; procedure TRangeDecoder.ReleaseStream; begin stream:=nil; end; procedure TRangeDecoder.Init; var i:integer; begin code:=0; Range:=-1; for i:=0 to 4 do begin code:=(code shl 8) or byte(ReadByte(stream)); end; end; function TRangeDecoder.DecodeDirectBits(const numTotalBits:integer):integer; var i,t:integer; begin result:=0; for i := numTotalBits downto 1 do begin range:=range shr 1; t := (cardinal(Code - Range) shr 31); Code := integer(Code - Range and (t - 1)); result := (result shl 1) or (1 - t); if ((Range and kTopMask) = 0) then begin Code := (Code shl 8) or ReadByte(stream); Range := Range shl 8; end; end; end; function TRangeDecoder.DecodeBit(var probs: array of smallint;const index:integer):integer; var prob,newbound:integer; begin prob:=probs[index]; newbound:= integer((Range shr kNumBitModelTotalBits) * prob); if (integer((integer(Code) xor integer($80000000))) < integer((integer(newBound) xor integer($80000000)))) then begin Range := newBound; probs[index] := (prob + ((kBitModelTotal - prob) shr kNumMoveBits)); if ((Range and kTopMask) = 0) then begin Code := (Code shl 8) or ReadByte(stream); Range := Range shl 8; end; result:=0; end else begin Range := integer(Range - newBound); Code := integer(Code - newBound); probs[index] := (prob - ((prob) shr kNumMoveBits)); if ((Range and kTopMask) = 0) then begin Code := (Code shl 8) or ReadByte(stream); Range := Range shl 8; end; result:=1; end; end; procedure InitBitModels(var probs: array of smallint); var i:integer; begin for i:=0 to length(probs)-1 do probs[i] := kBitModelTotal shr 1; end; end. doublecmd-0.5.8/plugins/wcx/lzma/LZMA/compression/RangeCoder/UBitTreeDecoder.pas0000644000175000017500000000350712014201074026522 0ustar alexxalexxunit UBitTreeDecoder; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} interface uses URangeDecoder; type TBitTreeDecoder=class public Models: array of smallint; NumBitLevels:integer; constructor Create(const numBitLevels:integer); procedure Init; function Decode(const rangeDecoder:TRangeDecoder):integer; function ReverseDecode(const rangeDecoder:TRangeDecoder):integer;overload; end; function ReverseDecode(var Models: array of smallint; const startIndex:integer;const rangeDecoder:TRangeDecoder; const NumBitLevels:integer):integer;overload; implementation constructor TBitTreeDecoder.Create(const numBitLevels:integer); begin self.NumBitLevels := numBitLevels; setlength(Models,1 shl numBitLevels); end; procedure TBitTreeDecoder.Init; begin urangedecoder.InitBitModels(Models); end; function TBitTreeDecoder.Decode(const rangeDecoder:TRangeDecoder):integer; var m,bitIndex:integer; begin m:=1; for bitIndex := NumBitLevels downto 1 do begin m:=m shl 1 + rangeDecoder.DecodeBit(Models, m); end; result:=m - (1 shl NumBitLevels); end; function TBitTreeDecoder.ReverseDecode(const rangeDecoder:TRangeDecoder):integer; var m,symbol,bitindex,bit:integer; begin m:=1; symbol:=0; for bitindex:=0 to numbitlevels-1 do begin bit:=rangeDecoder.DecodeBit(Models, m); m:=(m shl 1) + bit; symbol:=symbol or (bit shl bitIndex); end; result:=symbol; end; function ReverseDecode(var Models: array of smallint;const startIndex:integer; const rangeDecoder:TRangeDecoder;const NumBitLevels:integer):integer; var m,symbol,bitindex,bit:integer; begin m:=1; symbol:=0; for bitindex:=0 to numbitlevels -1 do begin bit := rangeDecoder.DecodeBit(Models, startIndex + m); m := (m shl 1) + bit; symbol := symbol or bit shl bitindex; end; result:=symbol; end; end. doublecmd-0.5.8/plugins/wcx/lzma/LZMA/compression/RangeCoder/UBitTreeEncoder.pas0000644000175000017500000000612212014201074026530 0ustar alexxalexxunit UBitTreeEncoder; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} interface uses URangeDecoder,URangeEncoder; type TBitTreeEncoder=class public Models: array of smallint; NumBitLevels:integer; constructor Create(const numBitLevels:integer); procedure Init; procedure Encode(const rangeEncoder:TRangeEncoder;const symbol:integer); procedure ReverseEncode(const rangeEncoder:TRangeEncoder;symbol:integer); function GetPrice(const symbol:integer):integer; function ReverseGetPrice(symbol:integer):integer;overload; end; procedure ReverseEncode(var Models:array of smallint;const startIndex:integer;const rangeEncoder:TRangeEncoder;const NumBitLevels:integer; symbol:integer); function ReverseGetPrice(var Models:array of smallint;const startIndex,NumBitLevels:integer; symbol:integer):integer; implementation constructor TBitTreeEncoder.Create(const numBitLevels:integer); begin self.NumBitLevels:=numBitLevels; setlength(Models,1 shl numBitLevels); end; procedure TBitTreeEncoder.Init; begin URangeDecoder.InitBitModels(Models); end; procedure TBitTreeEncoder.Encode(const rangeEncoder:TRangeEncoder;const symbol:integer); var m,bitindex,bit:integer; begin m := 1; for bitIndex := NumBitLevels -1 downto 0 do begin bit := (symbol shr bitIndex) and 1; rangeEncoder.Encode(Models, m, bit); m := (m shl 1) or bit; end; end; procedure TBitTreeEncoder.ReverseEncode(const rangeEncoder:TRangeEncoder;symbol:integer); var m,i,bit:integer; begin m:=1; for i:= 0 to NumBitLevels -1 do begin bit := symbol and 1; rangeEncoder.Encode(Models, m, bit); m := (m shl 1) or bit; symbol := symbol shr 1; end; end; function TBitTreeEncoder.GetPrice(const symbol:integer):integer; var price,m,bitindex,bit:integer; begin price := 0; m := 1; for bitIndex := NumBitLevels - 1 downto 0 do begin bit := (symbol shr bitIndex) and 1; price := price + RangeEncoder.GetPrice(Models[m], bit); m := (m shl 1) + bit; end; result:=price; end; function TBitTreeEncoder.ReverseGetPrice(symbol:integer):integer; var price,m,i,bit:integer; begin price := 0; m := 1; for i:= NumBitLevels downto 1 do begin bit := symbol and 1; symbol := symbol shr 1; price :=price + RangeEncoder.GetPrice(Models[m], bit); m := (m shl 1) or bit; end; result:=price; end; function ReverseGetPrice(var Models:array of smallint;const startIndex,NumBitLevels:integer;symbol:integer):integer; var price,m,i,bit:integer; begin price := 0; m := 1; for i := NumBitLevels downto 1 do begin bit := symbol and 1; symbol := symbol shr 1; price := price + RangeEncoder.GetPrice(Models[startIndex + m], bit); m := (m shl 1) or bit; end; result:=price; end; procedure ReverseEncode(var Models:array of smallint;const startIndex:integer;const rangeEncoder:TRangeEncoder;const NumBitLevels:integer;symbol:integer); var m,i,bit:integer; begin m:=1; for i := 0 to NumBitLevels -1 do begin bit := symbol and 1; rangeEncoder.Encode(Models, startIndex + m, bit); m := (m shl 1) or bit; symbol := symbol shr 1; end; end; end. doublecmd-0.5.8/plugins/wcx/lzma/LZMA/compression/LZMA/0000755000175000017500000000000012257501472021607 5ustar alexxalexxdoublecmd-0.5.8/plugins/wcx/lzma/LZMA/compression/LZMA/ULZMAEncoder.pas0000644000175000017500000015275212014201074024502 0ustar alexxalexxunit ULZMAEncoder; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} interface uses UBitTreeEncoder,ULZMABase,ULZBinTree,URangeEncoder,Classes,Math,ULZMACommon; const EMatchFinderTypeBT2 = 0; EMatchFinderTypeBT4 = 1; kIfinityPrice:integer = $FFFFFFF; kDefaultDictionaryLogSize = 22; kNumFastBytesDefault = $20; kNumLenSpecSymbols = ULZMABase.kNumLowLenSymbols + ULZMABase.kNumMidLenSymbols; kNumOpts = 1 shl 12; kPropSize = 5; type TLZMAEncoder2=class; TLZMALiteralEncoder=class; TLZMAOptimal=class; TLZMALenPriceTableEncoder=class; TLZMAEncoder=class private FOnProgress:TLZMAProgress; procedure DoProgress(const Action:TLZMAProgressAction;const Value:integer); public g_FastPos:array [0..1 shl 11-1] of byte; _state:integer; _previousByte:byte; _repDistances:array [0..ULZMABase.kNumRepDistances-1] of integer; _optimum: array [0..kNumOpts-1] of TLZMAOptimal; _matchFinder:TLZBinTree; _rangeEncoder:TRangeEncoder; _isMatch:array [0..ULZMABase.kNumStates shl ULZMABase.kNumPosStatesBitsMax-1]of smallint; _isRep:array [0..ULZMABase.kNumStates-1] of smallint; _isRepG0:array [0..ULZMABase.kNumStates-1] of smallint; _isRepG1:array [0..ULZMABase.kNumStates-1] of smallint; _isRepG2:array [0..ULZMABase.kNumStates-1] of smallint; _isRep0Long:array [0..ULZMABase.kNumStates shl ULZMABase.kNumPosStatesBitsMax-1]of smallint; _posSlotEncoder:array [0..ULZMABase.kNumLenToPosStates-1] of TBitTreeEncoder; // kNumPosSlotBits _posEncoders:array [0..ULZMABase.kNumFullDistances-ULZMABase.kEndPosModelIndex-1]of smallint; _posAlignEncoder:TBitTreeEncoder; _lenEncoder:TLZMALenPriceTableEncoder; _repMatchLenEncoder:TLZMALenPriceTableEncoder; _literalEncoder:TLZMALiteralEncoder; _matchDistances:array [0..ULZMABase.kMatchMaxLen*2+1] of integer; _numFastBytes:integer; _longestMatchLength:integer; _numDistancePairs:integer; _additionalOffset:integer; _optimumEndIndex:integer; _optimumCurrentIndex:integer; _longestMatchWasFound:boolean; _posSlotPrices:array [0..1 shl (ULZMABase.kNumPosSlotBits+ULZMABase.kNumLenToPosStatesBits)-1] of integer; _distancesPrices:array [0..ULZMABase.kNumFullDistances shl ULZMABase.kNumLenToPosStatesBits-1] of integer; _alignPrices:array [0..ULZMABase.kAlignTableSize-1] of integer; _alignPriceCount:integer; _distTableSize:integer; _posStateBits:integer; _posStateMask:integer; _numLiteralPosStateBits:integer; _numLiteralContextBits:integer; _dictionarySize:integer; _dictionarySizePrev:integer; _numFastBytesPrev:integer; nowPos64:int64; _finished:boolean; _inStream:TStream; _matchFinderType:integer; _writeEndMark:boolean; _needReleaseMFStream:boolean; reps:array [0..ULZMABase.kNumRepDistances-1]of integer; repLens:array [0..ULZMABase.kNumRepDistances-1] of integer; backRes:integer; processedInSize:int64; processedOutSize:int64; finished:boolean; properties:array [0..kPropSize] of byte; tempPrices:array [0..ULZMABase.kNumFullDistances-1]of integer; _matchPriceCount:integer; constructor Create; destructor Destroy;override; function GetPosSlot(const pos:integer):integer; function GetPosSlot2(const pos:integer):integer; procedure BaseInit; procedure _Create; procedure SetWriteEndMarkerMode(const writeEndMarker:boolean); procedure Init; function ReadMatchDistances:integer; procedure MovePos(const num:integer); function GetRepLen1Price(const state,posState:integer):integer; function GetPureRepPrice(const repIndex, state, posState:integer):integer; function GetRepPrice(const repIndex, len, state, posState:integer):integer; function GetPosLenPrice(const pos, len, posState:integer):integer; function Backward(cur:integer):integer; function GetOptimum(position:integer):integer; function ChangePair(const smallDist, bigDist:integer):boolean; procedure WriteEndMarker(const posState:integer); procedure Flush(const nowPos:integer); procedure ReleaseMFStream; procedure CodeOneBlock(var inSize,outSize:int64;var finished:boolean); procedure FillDistancesPrices; procedure FillAlignPrices; procedure SetOutStream(const outStream:TStream); procedure ReleaseOutStream; procedure ReleaseStreams; procedure SetStreams(const inStream, outStream:TStream;const inSize, outSize:int64); procedure Code(const inStream, outStream:TStream;const inSize, outSize:int64); procedure WriteCoderProperties(const outStream:TStream); function SetAlgorithm(const algorithm:integer):boolean; function SetDictionarySize(dictionarySize:integer):boolean; function SeNumFastBytes(const numFastBytes:integer):boolean; function SetMatchFinder(const matchFinderIndex:integer):boolean; function SetLcLpPb(const lc,lp,pb:integer):boolean; procedure SetEndMarkerMode(const endMarkerMode:boolean); property OnProgress:TLZMAProgress read FOnProgress write FOnProgress; end; TLZMALiteralEncoder=class public m_Coders: array of TLZMAEncoder2; m_NumPrevBits:integer; m_NumPosBits:integer; m_PosMask:integer; procedure _Create(const numPosBits,numPrevBits:integer); destructor Destroy;override; procedure Init; function GetSubCoder(const pos:integer;const prevByte:byte):TLZMAEncoder2; end; TLZMAEncoder2=class public m_Encoders: array[0..$300-1] of smallint; procedure Init; procedure Encode(const rangeEncoder:TRangeEncoder;const symbol:byte); procedure EncodeMatched(const rangeEncoder:TRangeEncoder;const matchByte,symbol:byte); function GetPrice(const matchMode:boolean;const matchByte,symbol:byte):integer; end; TLZMALenEncoder=class public _choice:array[0..1] of smallint; _lowCoder: array [0..ULZMABase.kNumPosStatesEncodingMax-1] of TBitTreeEncoder; _midCoder: array [0..ULZMABase.kNumPosStatesEncodingMax-1] of TBitTreeEncoder; _highCoder:TBitTreeEncoder; constructor Create; destructor Destroy;override; procedure Init(const numPosStates:integer); procedure Encode(const rangeEncoder:TRangeEncoder;symbol:integer;const posState:integer);virtual; procedure SetPrices(const posState,numSymbols:integer;var prices:array of integer;const st:integer); end; TLZMALenPriceTableEncoder=class(TLZMALenEncoder) public _prices: array [0..ULZMABase.kNumLenSymbols shl ULZMABase.kNumPosStatesBitsEncodingMax-1] of integer; _tableSize:integer; _counters: array [0..ULZMABase.kNumPosStatesEncodingMax-1] of integer; procedure SetTableSize(const tableSize:integer); function GetPrice(const symbol,posState:integer):integer; procedure UpdateTable(const posState:integer); procedure UpdateTables(const numPosStates:integer); procedure Encode(const rangeEncoder:TRangeEncoder;symbol:integer;const posState:integer);override; end; TLZMAOptimal=class public State:integer; Prev1IsChar:boolean; Prev2:boolean; PosPrev2:integer; BackPrev2:integer; Price:integer; PosPrev:integer; BackPrev:integer; Backs0:integer; Backs1:integer; Backs2:integer; Backs3:integer; procedure MakeAsChar; procedure MakeAsShortRep; function IsShortRep:boolean; end; implementation constructor TLZMAEncoder.Create; var kFastSlots,c,slotFast,j,k:integer; begin kFastSlots := 22; c := 2; g_FastPos[0] := 0; g_FastPos[1] := 1; for slotFast := 2 to kFastSlots -1 do begin k := (1 shl ((slotFast shr 1) - 1)); for j := 0 to k -1 do begin g_FastPos[c] := slotFast; inc(c); end; end; _state := ULZMABase.StateInit(); _matchFinder:=nil; _rangeEncoder:=TRangeEncoder.Create; _posAlignEncoder:=TBitTreeEncoder.Create(ULZMABase.kNumAlignBits); _lenEncoder:=TLZMALenPriceTableEncoder.Create; _repMatchLenEncoder:=TLZMALenPriceTableEncoder.Create; _literalEncoder:=TLZMALiteralEncoder.Create; _numFastBytes:= kNumFastBytesDefault; _distTableSize:= (kDefaultDictionaryLogSize * 2); _posStateBits:= 2; _posStateMask:= (4 - 1); _numLiteralPosStateBits:= 0; _numLiteralContextBits:= 3; _dictionarySize:= (1 shl kDefaultDictionaryLogSize); _dictionarySizePrev:= -1; _numFastBytesPrev:= -1; _matchFinderType:= EMatchFinderTypeBT4; _writeEndMark:= false; _needReleaseMFStream:= false; end; destructor TLZMAEncoder.Destroy; var i:integer; begin _rangeEncoder.Free; _posAlignEncoder.Free; _lenEncoder.Free; _repMatchLenEncoder.Free; _literalEncoder.Free; if _matchFinder<>nil then _matchFinder.Free; for i := 0 to kNumOpts -1 do _optimum[i].Free; for i := 0 to ULZMABase.kNumLenToPosStates -1 do _posSlotEncoder[i].Free; end; procedure TLZMAEncoder._Create; var bt:TLZBinTree; numHashBytes,i:integer; begin if _matchFinder = nil then begin bt := TLZBinTree.Create; numHashBytes:= 4; if _matchFinderType = EMatchFinderTypeBT2 then numHashBytes := 2; bt.SetType(numHashBytes); _matchFinder := bt; end; _literalEncoder._Create(_numLiteralPosStateBits, _numLiteralContextBits); if (_dictionarySize = _dictionarySizePrev) and (_numFastBytesPrev = _numFastBytes) then exit; _matchFinder._Create(_dictionarySize, kNumOpts, _numFastBytes, ULZMABase.kMatchMaxLen + 1); _dictionarySizePrev := _dictionarySize; _numFastBytesPrev := _numFastBytes; for i := 0 to kNumOpts -1 do _optimum[i]:=TLZMAOptimal.Create; for i := 0 to ULZMABase.kNumLenToPosStates -1 do _posSlotEncoder[i] :=TBitTreeEncoder.Create(ULZMABase.kNumPosSlotBits); end; function TLZMAEncoder.GetPosSlot(const pos:integer):integer; begin if (pos < (1 shl 11)) then result:=g_FastPos[pos] else if (pos < (1 shl 21)) then result:=(g_FastPos[pos shr 10] + 20) else result:=(g_FastPos[pos shr 20] + 40); end; function TLZMAEncoder.GetPosSlot2(const pos:integer):integer; begin if (pos < (1 shl 17)) then result:=(g_FastPos[pos shr 6] + 12) else if (pos < (1 shl 27)) then result:=(g_FastPos[pos shr 16] + 32) else result:=(g_FastPos[pos shr 26] + 52); end; procedure TLZMAEncoder.BaseInit; var i:integer; begin _state := ulzmaBase.StateInit; _previousByte := 0; for i := 0 to ULZMABase.kNumRepDistances -1 do _repDistances[i] := 0; end; procedure TLZMAEncoder.SetWriteEndMarkerMode(const writeEndMarker:boolean); begin _writeEndMark := writeEndMarker; end; procedure TLZMAEncoder.Init; var i:integer; begin BaseInit; _rangeEncoder.Init; URangeEncoder.InitBitModels(_isMatch); URangeEncoder.InitBitModels(_isRep0Long); URangeEncoder.InitBitModels(_isRep); URangeEncoder.InitBitModels(_isRepG0); URangeEncoder.InitBitModels(_isRepG1); URangeEncoder.InitBitModels(_isRepG2); URangeEncoder.InitBitModels(_posEncoders); _literalEncoder.Init(); for i := 0 to ULZMABase.kNumLenToPosStates -1 do _posSlotEncoder[i].Init; _lenEncoder.Init(1 shl _posStateBits); _repMatchLenEncoder.Init(1 shl _posStateBits); _posAlignEncoder.Init; _longestMatchWasFound := false; _optimumEndIndex := 0; _optimumCurrentIndex := 0; _additionalOffset := 0; end; function TLZMAEncoder.ReadMatchDistances:integer; var lenRes:integer; begin lenRes := 0; _numDistancePairs := _matchFinder.GetMatches(_matchDistances); if _numDistancePairs > 0 then begin lenRes := _matchDistances[_numDistancePairs - 2]; if lenRes = _numFastBytes then lenRes := lenRes + _matchFinder.GetMatchLen(lenRes - 1, _matchDistances[_numDistancePairs - 1], ULZMABase.kMatchMaxLen - lenRes); end; inc(_additionalOffset); result:=lenRes; end; procedure TLZMAEncoder.MovePos(const num:integer); begin if num > 0 then begin _matchFinder.Skip(num); _additionalOffset := _additionalOffset + num; end; end; function TLZMAEncoder.GetRepLen1Price(const state,posState:integer):integer; begin result:=RangeEncoder.GetPrice0(_isRepG0[state]) + RangeEncoder.GetPrice0(_isRep0Long[(state shl ULZMABase.kNumPosStatesBitsMax) + posState]); end; function TLZMAEncoder.GetPureRepPrice(const repIndex, state, posState:integer):integer; var price:integer; begin if repIndex = 0 then begin price := RangeEncoder.GetPrice0(_isRepG0[state]); price := price + RangeEncoder.GetPrice1(_isRep0Long[(state shl ULZMABase.kNumPosStatesBitsMax) + posState]); end else begin price := RangeEncoder.GetPrice1(_isRepG0[state]); if repIndex = 1 then price := price + RangeEncoder.GetPrice0(_isRepG1[state]) else begin price := price + RangeEncoder.GetPrice1(_isRepG1[state]); price := price + RangeEncoder.GetPrice(_isRepG2[state], repIndex - 2); end; end; result:=price; end; function TLZMAEncoder.GetRepPrice(const repIndex, len, state, posState:integer):integer; var price:integer; begin price := _repMatchLenEncoder.GetPrice(len - ULZMABase.kMatchMinLen, posState); result := price + GetPureRepPrice(repIndex, state, posState); end; function TLZMAEncoder.GetPosLenPrice(const pos, len, posState:integer):integer; var price,lenToPosState:integer; begin lenToPosState := ULZMABase.GetLenToPosState(len); if pos < ULZMABase.kNumFullDistances then price := _distancesPrices[(lenToPosState * ULZMABase.kNumFullDistances) + pos] else price := _posSlotPrices[(lenToPosState shl ULZMABase.kNumPosSlotBits) + GetPosSlot2(pos)] + _alignPrices[pos and ULZMABase.kAlignMask]; result := price + _lenEncoder.GetPrice(len - ULZMABase.kMatchMinLen, posState); end; function TLZMAEncoder.Backward(cur:integer):integer; var posMem,backMem,posPrev,backCur:integer; begin _optimumEndIndex := cur; posMem := _optimum[cur].PosPrev; backMem := _optimum[cur].BackPrev; repeat if _optimum[cur].Prev1IsChar then begin _optimum[posMem].MakeAsChar; _optimum[posMem].PosPrev := posMem - 1; if _optimum[cur].Prev2 then begin _optimum[posMem - 1].Prev1IsChar := false; _optimum[posMem - 1].PosPrev := _optimum[cur].PosPrev2; _optimum[posMem - 1].BackPrev := _optimum[cur].BackPrev2; end; end; posPrev := posMem; backCur := backMem; backMem := _optimum[posPrev].BackPrev; posMem := _optimum[posPrev].PosPrev; _optimum[posPrev].BackPrev := backCur; _optimum[posPrev].PosPrev := cur; cur := posPrev; until not (cur > 0); backRes := _optimum[0].BackPrev; _optimumCurrentIndex := _optimum[0].PosPrev; result:=_optimumCurrentIndex; end; function TLZMAEncoder.GetOptimum(position:integer):integer; var lenRes,lenMain,numDistancePairs,numAvailableBytes,repMaxIndex,i:integer; matchPrice,repMatchPrice,shortRepPrice,lenEnd,len,repLen,price:integer; curAndLenPrice,normalMatchPrice,Offs,distance,cur,newLen:integer; posPrev,state,pos,curPrice,curAnd1Price,numAvailableBytesFull:integer; lenTest2,t,state2,posStateNext,nextRepMatchPrice,offset:integer; startLen,repIndex,lenTest,lenTestTemp,curAndLenCharPrice:integer; nextMatchPrice,curBack:integer; optimum,opt,nextOptimum:TLZMAOptimal; currentByte,matchByte,posState:byte; nextIsChar:boolean; begin if (_optimumEndIndex <> _optimumCurrentIndex) then begin lenRes := _optimum[_optimumCurrentIndex].PosPrev - _optimumCurrentIndex; backRes := _optimum[_optimumCurrentIndex].BackPrev; _optimumCurrentIndex := _optimum[_optimumCurrentIndex].PosPrev; result:=lenRes; exit; end;//if optimumendindex _optimumCurrentIndex := 0; _optimumEndIndex := 0; if not _longestMatchWasFound then begin lenMain := ReadMatchDistances(); end else begin //if not longest lenMain := _longestMatchLength; _longestMatchWasFound := false; end;//if not longest else numDistancePairs := _numDistancePairs; numAvailableBytes := _matchFinder.GetNumAvailableBytes + 1; if numAvailableBytes < 2 then begin backRes := -1; result:=1; exit; end;//if numavailable {if numAvailableBytes > ULZMABase.kMatchMaxLen then numAvailableBytes := ULZMABase.kMatchMaxLen;} repMaxIndex := 0; for i := 0 to ULZMABase.kNumRepDistances-1 do begin reps[i] := _repDistances[i]; repLens[i] := _matchFinder.GetMatchLen(0 - 1, reps[i], ULZMABase.kMatchMaxLen); if repLens[i] > repLens[repMaxIndex] then repMaxIndex := i; end;//for i if repLens[repMaxIndex] >= _numFastBytes then begin backRes := repMaxIndex; lenRes := repLens[repMaxIndex]; MovePos(lenRes - 1); result:=lenRes; exit; end;//if replens[] if lenMain >= _numFastBytes then begin backRes := _matchDistances[numDistancePairs - 1] + ULZMABase.kNumRepDistances; MovePos(lenMain - 1); result:=lenMain; exit; end;//if lenMain currentByte := _matchFinder.GetIndexByte(0 - 1); matchByte := _matchFinder.GetIndexByte(0 - _repDistances[0] - 1 - 1); if (lenMain < 2) and (currentByte <> matchByte) and (repLens[repMaxIndex] < 2) then begin backRes := -1; result:=1; exit; end;//if lenmain<2 _optimum[0].State := _state; posState := (position and _posStateMask); _optimum[1].Price := RangeEncoder.GetPrice0(_isMatch[(_state shl ULZMABase.kNumPosStatesBitsMax) + posState]) + _literalEncoder.GetSubCoder(position, _previousByte).GetPrice(not ULZMABase.StateIsCharState(_state), matchByte, currentByte); _optimum[1].MakeAsChar(); matchPrice := RangeEncoder.GetPrice1(_isMatch[(_state shl ULZMABase.kNumPosStatesBitsMax) + posState]); repMatchPrice := matchPrice + RangeEncoder.GetPrice1(_isRep[_state]); if matchByte = currentByte then begin shortRepPrice := repMatchPrice + GetRepLen1Price(_state, posState); if shortRepPrice < _optimum[1].Price then begin _optimum[1].Price := shortRepPrice; _optimum[1].MakeAsShortRep; end;//if shortrepprice end;//if matchbyte if lenMain >= repLens[repMaxIndex] then lenEnd:=lenMain else lenEnd:=repLens[repMaxIndex]; if lenEnd < 2 then begin backRes := _optimum[1].BackPrev; result:=1; exit; end;//if lenend<2 _optimum[1].PosPrev := 0; _optimum[0].Backs0 := reps[0]; _optimum[0].Backs1 := reps[1]; _optimum[0].Backs2 := reps[2]; _optimum[0].Backs3 := reps[3]; len := lenEnd; repeat _optimum[len].Price := kIfinityPrice; dec(len); until not (len >= 2); for i := 0 to ULZMABase.kNumRepDistances -1 do begin repLen := repLens[i]; if repLen < 2 then continue; price := repMatchPrice + GetPureRepPrice(i, _state, posState); repeat curAndLenPrice := price + _repMatchLenEncoder.GetPrice(repLen - 2, posState); optimum := _optimum[repLen]; if curAndLenPrice < optimum.Price then begin optimum.Price := curAndLenPrice; optimum.PosPrev := 0; optimum.BackPrev := i; optimum.Prev1IsChar := false; end;//if curandlenprice dec(replen); until not (repLen >= 2); end;//for i normalMatchPrice := matchPrice + RangeEncoder.GetPrice0(_isRep[_state]); if repLens[0] >= 2 then len:=repLens[0] + 1 else len:=2; if len <= lenMain then begin offs := 0; while len > _matchDistances[offs] do offs := offs + 2; while (true) do begin distance := _matchDistances[offs + 1]; curAndLenPrice := normalMatchPrice + GetPosLenPrice(distance, len, posState); optimum := _optimum[len]; if curAndLenPrice < optimum.Price then begin optimum.Price := curAndLenPrice; optimum.PosPrev := 0; optimum.BackPrev := distance + ULZMABase.kNumRepDistances; optimum.Prev1IsChar := false; end;//if curlenandprice if len = _matchDistances[offs] then begin offs := offs + 2; if offs = numDistancePairs then break; end;//if len=_match inc(len); end;//while (true) end;//if len<=lenmain cur := 0; while (true) do begin inc(cur); if cur = lenEnd then begin result:=Backward(cur); exit; end;//if cur=lenEnd newLen := ReadMatchDistances; numDistancePairs := _numDistancePairs; if newLen >= _numFastBytes then begin _longestMatchLength := newLen; _longestMatchWasFound := true; result:=Backward(cur); exit; end;//if newlen=_numfast inc(position); posPrev := _optimum[cur].PosPrev; if _optimum[cur].Prev1IsChar then begin dec(posPrev); if _optimum[cur].Prev2 then begin state := _optimum[_optimum[cur].PosPrev2].State; if _optimum[cur].BackPrev2 < ULZMABase.kNumRepDistances then state := ULZMABase.StateUpdateRep(state) else state := ULZMABase.StateUpdateMatch(state); end//if _optimum[cur].Prev2 else state := _optimum[posPrev].State; state := ULZMABase.StateUpdateChar(state); end//if _optimum[cur].Prev1IsChar else state := _optimum[posPrev].State; if posPrev = cur - 1 then begin if _optimum[cur].IsShortRep then state := ULZMABase.StateUpdateShortRep(state) else state := ULZMABase.StateUpdateChar(state); end //if posPrev = cur - 1 else begin if _optimum[cur].Prev1IsChar and _optimum[cur].Prev2 then begin posPrev := _optimum[cur].PosPrev2; pos := _optimum[cur].BackPrev2; state := ULZMABase.StateUpdateRep(state); end//if _optimum[cur].Prev1IsChar else begin pos := _optimum[cur].BackPrev; if pos < ULZMABase.kNumRepDistances then state := ULZMABase.StateUpdateRep(state) else state := ULZMABase.StateUpdateMatch(state); end;//if else _optimum[cur].Prev1IsChar opt := _optimum[posPrev]; if pos < ULZMABase.kNumRepDistances then begin if pos = 0 then begin reps[0] := opt.Backs0; reps[1] := opt.Backs1; reps[2] := opt.Backs2; reps[3] := opt.Backs3; end//if pos=0 else if pos = 1 then begin reps[0] := opt.Backs1; reps[1] := opt.Backs0; reps[2] := opt.Backs2; reps[3] := opt.Backs3; end //if pos=1 else if pos = 2 then begin reps[0] := opt.Backs2; reps[1] := opt.Backs0; reps[2] := opt.Backs1; reps[3] := opt.Backs3; end//if pos=2 else begin reps[0] := opt.Backs3; reps[1] := opt.Backs0; reps[2] := opt.Backs1; reps[3] := opt.Backs2; end;//else if pos= end// if pos < ULZMABase.kNumRepDistances else begin reps[0] := (pos - ULZMABase.kNumRepDistances); reps[1] := opt.Backs0; reps[2] := opt.Backs1; reps[3] := opt.Backs2; end;//if else pos < ULZMABase.kNumRepDistances end;//if else posPrev = cur - 1 _optimum[cur].State := state; _optimum[cur].Backs0 := reps[0]; _optimum[cur].Backs1 := reps[1]; _optimum[cur].Backs2 := reps[2]; _optimum[cur].Backs3 := reps[3]; curPrice := _optimum[cur].Price; currentByte := _matchFinder.GetIndexByte(0 - 1); matchByte := _matchFinder.GetIndexByte(0 - reps[0] - 1 - 1); posState := (position and _posStateMask); curAnd1Price := curPrice + RangeEncoder.GetPrice0(_isMatch[(state shl ULZMABase.kNumPosStatesBitsMax) + posState]) + _literalEncoder.GetSubCoder(position, _matchFinder.GetIndexByte(0 - 2)). GetPrice(not ULZMABase.StateIsCharState(state), matchByte, currentByte); nextOptimum := _optimum[cur + 1]; nextIsChar := false; if curAnd1Price < nextOptimum.Price then begin nextOptimum.Price := curAnd1Price; nextOptimum.PosPrev := cur; nextOptimum.MakeAsChar; nextIsChar := true; end;//if curand1price matchPrice := curPrice + RangeEncoder.GetPrice1(_isMatch[(state shl ULZMABase.kNumPosStatesBitsMax) + posState]); repMatchPrice := matchPrice + RangeEncoder.GetPrice1(_isRep[state]); if (matchByte = currentByte) and (not ((nextOptimum.PosPrev < cur) and (nextOptimum.BackPrev = 0))) then begin shortRepPrice := repMatchPrice + GetRepLen1Price(state, posState); if shortRepPrice <= nextOptimum.Price then begin nextOptimum.Price := shortRepPrice; nextOptimum.PosPrev := cur; nextOptimum.MakeAsShortRep; nextIsChar := true; end;//if shortRepPrice <= nextOptimum.Price end;//if (matchByte = currentByte) and numAvailableBytesFull := _matchFinder.GetNumAvailableBytes + 1; numAvailableBytesFull := min(kNumOpts - 1 - cur, numAvailableBytesFull); numAvailableBytes := numAvailableBytesFull; if numAvailableBytes < 2 then continue; if numAvailableBytes > _numFastBytes then numAvailableBytes := _numFastBytes; if (not nextIsChar) and (matchByte <> currentByte) then begin // try Literal + rep0 t := min(numAvailableBytesFull - 1, _numFastBytes); lenTest2 := _matchFinder.GetMatchLen(0, reps[0], t); if lenTest2 >= 2 then begin state2 := ULZMABase.StateUpdateChar(state); posStateNext := (position + 1) and _posStateMask; nextRepMatchPrice := curAnd1Price + RangeEncoder.GetPrice1(_isMatch[(state2 shl ULZMABase.kNumPosStatesBitsMax) + posStateNext]) + RangeEncoder.GetPrice1(_isRep[state2]); begin offset := cur + 1 + lenTest2; while lenEnd < offset do begin inc(lenEnd); _optimum[lenEnd].Price := kIfinityPrice; end;//while lenend curAndLenPrice := nextRepMatchPrice + GetRepPrice( 0, lenTest2, state2, posStateNext); optimum := _optimum[offset]; if curAndLenPrice < optimum.Price then begin optimum.Price := curAndLenPrice; optimum.PosPrev := cur + 1; optimum.BackPrev := 0; optimum.Prev1IsChar := true; optimum.Prev2 := false; end;//if curandlenprice end;//none end;//if lentest end;//if not nextischar and ... startLen := 2; // speed optimization for repIndex := 0 to ULZMABase.kNumRepDistances -1 do begin lenTest := _matchFinder.GetMatchLen(0 - 1, reps[repIndex], numAvailableBytes); if lenTest < 2 then continue; lenTestTemp := lenTest; repeat while lenEnd < cur + lenTest do begin inc(lenEnd); _optimum[lenEnd].Price := kIfinityPrice; end;//while lenEnd curAndLenPrice := repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState); optimum := _optimum[cur + lenTest]; if curAndLenPrice < optimum.Price then begin optimum.Price := curAndLenPrice; optimum.PosPrev := cur; optimum.BackPrev := repIndex; optimum.Prev1IsChar := false; end;//if curandlen dec(lenTest); until not (lenTest >= 2); lenTest := lenTestTemp; if repIndex = 0 then startLen := lenTest + 1; // if (_maxMode) if lenTest < numAvailableBytesFull then begin t := min(numAvailableBytesFull - 1 - lenTest, _numFastBytes); lenTest2 := _matchFinder.GetMatchLen(lenTest, reps[repIndex], t); if lenTest2 >= 2 then begin state2 := ULZMABase.StateUpdateRep(state); posStateNext := (position + lenTest) and _posStateMask; curAndLenCharPrice := repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState) + RangeEncoder.GetPrice0(_isMatch[(state2 shl ULZMABase.kNumPosStatesBitsMax) + posStateNext]) + _literalEncoder.GetSubCoder(position + lenTest, _matchFinder.GetIndexByte(lenTest - 1 - 1)).GetPrice(true, _matchFinder.GetIndexByte(lenTest - 1 - (reps[repIndex] + 1)), _matchFinder.GetIndexByte(lenTest - 1)); state2 := ULZMABase.StateUpdateChar(state2); posStateNext := (position + lenTest + 1) and _posStateMask; nextMatchPrice := curAndLenCharPrice + RangeEncoder.GetPrice1(_isMatch[(state2 shl ULZMABase.kNumPosStatesBitsMax) + posStateNext]); nextRepMatchPrice := nextMatchPrice + RangeEncoder.GetPrice1(_isRep[state2]); // for(; lenTest2 >= 2; lenTest2--) begin offset := lenTest + 1 + lenTest2; while lenEnd < cur + offset do begin inc(lenEnd); _optimum[lenEnd].Price := kIfinityPrice; end;//while lenEnd curAndLenPrice := nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); optimum := _optimum[cur + offset]; if curAndLenPrice < optimum.Price then begin optimum.Price := curAndLenPrice; optimum.PosPrev := cur + lenTest + 1; optimum.BackPrev := 0; optimum.Prev1IsChar := true; optimum.Prev2 := true; optimum.PosPrev2 := cur; optimum.BackPrev2 := repIndex; end;//if curAndLenPrice < optimum.Price end;//none end;//if lenTest2 >= 2 end;//if lenTest < numAvailableBytesFull end;//for repIndex if newLen > numAvailableBytes then begin newLen := numAvailableBytes; numDistancePairs := 0; while newLen > _matchDistances[numDistancePairs] do numDistancePairs := numDistancePairs + 2; _matchDistances[numDistancePairs] := newLen; numDistancePairs := numDistancePairs + 2; end;//if newLen > numAvailableBytes if newLen >= startLen then begin normalMatchPrice := matchPrice + RangeEncoder.GetPrice0(_isRep[state]); while lenEnd < cur + newLen do begin inc(lenEnd); _optimum[lenEnd].Price := kIfinityPrice; end;//while lenEnd offs := 0; while startLen > _matchDistances[offs] do offs := offs + 2; lenTest := startLen; while (true) do begin curBack := _matchDistances[offs + 1]; curAndLenPrice := normalMatchPrice + GetPosLenPrice(curBack, lenTest, posState); optimum := _optimum[cur + lenTest]; if curAndLenPrice < optimum.Price then begin optimum.Price := curAndLenPrice; optimum.PosPrev := cur; optimum.BackPrev := curBack + ULZMABase.kNumRepDistances; optimum.Prev1IsChar := false; end;//if curAndLenPrice < optimum.Price if lenTest = _matchDistances[offs] then begin if lenTest < numAvailableBytesFull then begin t := min(numAvailableBytesFull - 1 - lenTest, _numFastBytes); lenTest2 := _matchFinder.GetMatchLen(lenTest, curBack, t); if lenTest2 >= 2 then begin state2 := ULZMABase.StateUpdateMatch(state); posStateNext := (position + lenTest) and _posStateMask; curAndLenCharPrice := curAndLenPrice + RangeEncoder.GetPrice0(_isMatch[(state2 shl ULZMABase.kNumPosStatesBitsMax) + posStateNext]) + _literalEncoder.GetSubCoder(position + lenTest, _matchFinder.GetIndexByte(lenTest - 1 - 1)). GetPrice(true, _matchFinder.GetIndexByte(lenTest - (curBack + 1) - 1), _matchFinder.GetIndexByte(lenTest - 1)); state2 := ULZMABase.StateUpdateChar(state2); posStateNext := (position + lenTest + 1) and _posStateMask; nextMatchPrice := curAndLenCharPrice + RangeEncoder.GetPrice1(_isMatch[(state2 shl ULZMABase.kNumPosStatesBitsMax) + posStateNext]); nextRepMatchPrice := nextMatchPrice + RangeEncoder.GetPrice1(_isRep[state2]); offset := lenTest + 1 + lenTest2; while lenEnd < cur + offset do begin inc(lenEnd); _optimum[lenEnd].Price := kIfinityPrice; end;//while lenEnd curAndLenPrice := nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); optimum := _optimum[cur + offset]; if curAndLenPrice < optimum.Price then begin optimum.Price := curAndLenPrice; optimum.PosPrev := cur + lenTest + 1; optimum.BackPrev := 0; optimum.Prev1IsChar := true; optimum.Prev2 := true; optimum.PosPrev2 := cur; optimum.BackPrev2 := curBack + ULZMABase.kNumRepDistances; end;//if curAndLenPrice < optimum.Price end;//if lenTest2 >= 2 end;//lenTest < numAvailableBytesFull offs :=offs + 2; if offs = numDistancePairs then break; end;//if lenTest = _matchDistances[offs] inc(lenTest); end;//while(true) end;//if newLen >= startLen end;//while (true) end; function TLZMAEncoder.ChangePair(const smallDist, bigDist:integer):boolean; var kDif:integer; begin kDif := 7; result:= (smallDist < (1 shl (32 - kDif))) and (bigDist >= (smallDist shl kDif)); end; procedure TLZMAEncoder.WriteEndMarker(const posState:integer); var len,posSlot,lenToPosState,footerBits,posReduced:integer; begin if not _writeEndMark then exit; _rangeEncoder.Encode(_isMatch, (_state shl ULZMABase.kNumPosStatesBitsMax) + posState, 1); _rangeEncoder.Encode(_isRep, _state, 0); _state := ULZMABase.StateUpdateMatch(_state); len := ULZMABase.kMatchMinLen; _lenEncoder.Encode(_rangeEncoder, len - ULZMABase.kMatchMinLen, posState); posSlot := (1 shl ULZMABase.kNumPosSlotBits) - 1; lenToPosState := ULZMABase.GetLenToPosState(len); _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); footerBits := 30; posReduced := (1 shl footerBits) - 1; _rangeEncoder.EncodeDirectBits(posReduced shr ULZMABase.kNumAlignBits, footerBits - ULZMABase.kNumAlignBits); _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced and ULZMABase.kAlignMask); end; procedure TLZMAEncoder.Flush(const nowPos:integer); begin ReleaseMFStream; WriteEndMarker(nowPos and _posStateMask); _rangeEncoder.FlushData(); _rangeEncoder.FlushStream(); end; procedure TLZMAEncoder.CodeOneBlock(var inSize,outSize:int64;var finished:boolean); var progressPosValuePrev:int64; posState,len,pos,complexState,distance,i,posSlot,lenToPosState:integer; footerBits,baseVal,posReduced:integer; curByte,matchByte:byte; subcoder:TLZMAEncoder2; begin inSize := 0; outSize := 0; finished := true; if _inStream <>nil then begin _matchFinder.SetStream(_inStream); _matchFinder.Init; _needReleaseMFStream := true; _inStream := nil; end; if _finished then exit; _finished := true; progressPosValuePrev := nowPos64; if nowPos64 = 0 then begin if _matchFinder.GetNumAvailableBytes = 0 then begin Flush(nowPos64); exit; end; ReadMatchDistances; posState := integer(nowPos64) and _posStateMask; _rangeEncoder.Encode(_isMatch, (_state shl ULZMABase.kNumPosStatesBitsMax) + posState, 0); _state := ULZMABase.StateUpdateChar(_state); curByte := _matchFinder.GetIndexByte(0 - _additionalOffset); _literalEncoder.GetSubCoder(integer(nowPos64), _previousByte).Encode(_rangeEncoder, curByte); _previousByte := curByte; dec(_additionalOffset); inc(nowPos64); end; if _matchFinder.GetNumAvailableBytes = 0 then begin Flush(integer(nowPos64)); exit; end; while true do begin len := GetOptimum(integer(nowPos64)); pos := backRes; posState := integer(nowPos64) and _posStateMask; complexState := (_state shl ULZMABase.kNumPosStatesBitsMax) + posState; if (len = 1) and (pos = -1) then begin _rangeEncoder.Encode(_isMatch, complexState, 0); curByte := _matchFinder.GetIndexByte(0 - _additionalOffset); subCoder := _literalEncoder.GetSubCoder(integer(nowPos64), _previousByte); if not ULZMABase.StateIsCharState(_state) then begin matchByte := _matchFinder.GetIndexByte(0 - _repDistances[0] - 1 - _additionalOffset); subCoder.EncodeMatched(_rangeEncoder, matchByte, curByte); end else subCoder.Encode(_rangeEncoder, curByte); _previousByte := curByte; _state := ULZMABase.StateUpdateChar(_state); end else begin _rangeEncoder.Encode(_isMatch, complexState, 1); if pos < ULZMABase.kNumRepDistances then begin _rangeEncoder.Encode(_isRep, _state, 1); if pos = 0 then begin _rangeEncoder.Encode(_isRepG0, _state, 0); if len = 1 then _rangeEncoder.Encode(_isRep0Long, complexState, 0) else _rangeEncoder.Encode(_isRep0Long, complexState, 1); end else begin _rangeEncoder.Encode(_isRepG0, _state, 1); if pos = 1 then _rangeEncoder.Encode(_isRepG1, _state, 0) else begin _rangeEncoder.Encode(_isRepG1, _state, 1); _rangeEncoder.Encode(_isRepG2, _state, pos - 2); end; end; if len = 1 then _state := ULZMABase.StateUpdateShortRep(_state) else begin _repMatchLenEncoder.Encode(_rangeEncoder, len - ULZMABase.kMatchMinLen, posState); _state := ULZMABase.StateUpdateRep(_state); end; distance := _repDistances[pos]; if pos <> 0 then begin for i := pos downto 1 do _repDistances[i] := _repDistances[i - 1]; _repDistances[0] := distance; end; end else begin _rangeEncoder.Encode(_isRep, _state, 0); _state := ULZMABase.StateUpdateMatch(_state); _lenEncoder.Encode(_rangeEncoder, len - ULZMABase.kMatchMinLen, posState); pos := pos - ULZMABase.kNumRepDistances; posSlot := GetPosSlot(pos); lenToPosState := ULZMABase.GetLenToPosState(len); _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); if posSlot >= ULZMABase.kStartPosModelIndex then begin footerBits := integer((posSlot shr 1) - 1); baseVal := ((2 or (posSlot and 1)) shl footerBits); posReduced := pos - baseVal; if posSlot < ULZMABase.kEndPosModelIndex then UBitTreeEncoder.ReverseEncode(_posEncoders, baseVal - posSlot - 1, _rangeEncoder, footerBits, posReduced) else begin _rangeEncoder.EncodeDirectBits(posReduced shr ULZMABase.kNumAlignBits, footerBits - ULZMABase.kNumAlignBits); _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced and ULZMABase.kAlignMask); inc(_alignPriceCount); end; end; distance := pos; for i := ULZMABase.kNumRepDistances - 1 downto 1 do _repDistances[i] := _repDistances[i - 1]; _repDistances[0] := distance; inc(_matchPriceCount); end; _previousByte := _matchFinder.GetIndexByte(len - 1 - _additionalOffset); end; _additionalOffset := _additionalOffset - len; nowPos64 := nowPos64 + len; if _additionalOffset = 0 then begin // if (!_fastMode) if _matchPriceCount >= (1 shl 7) then FillDistancesPrices; if _alignPriceCount >= ULZMABase.kAlignTableSize then FillAlignPrices; inSize := nowPos64; outSize := _rangeEncoder.GetProcessedSizeAdd; if _matchFinder.GetNumAvailableBytes = 0 then begin Flush(integer(nowPos64)); exit; end; if (nowPos64 - progressPosValuePrev >= (1 shl 12)) then begin _finished := false; finished := false; exit; end; end; end; end; procedure TLZMAEncoder.ReleaseMFStream; begin if (_matchFinder <>nil) and _needReleaseMFStream then begin _matchFinder.ReleaseStream; _needReleaseMFStream := false; end; end; procedure TLZMAEncoder.SetOutStream(const outStream:TStream); begin _rangeEncoder.SetStream(outStream); end; procedure TLZMAEncoder.ReleaseOutStream; begin _rangeEncoder.ReleaseStream; end; procedure TLZMAEncoder.ReleaseStreams; begin ReleaseMFStream; ReleaseOutStream; end; procedure TLZMAEncoder.SetStreams(const inStream, outStream:TStream;const inSize, outSize:int64); begin _inStream := inStream; _finished := false; _Create(); SetOutStream(outStream); Init(); // if (!_fastMode) FillDistancesPrices; FillAlignPrices; _lenEncoder.SetTableSize(_numFastBytes + 1 - ULZMABase.kMatchMinLen); _lenEncoder.UpdateTables(1 shl _posStateBits); _repMatchLenEncoder.SetTableSize(_numFastBytes + 1 - ULZMABase.kMatchMinLen); _repMatchLenEncoder.UpdateTables(1 shl _posStateBits); nowPos64 := 0; end; procedure TLZMAEncoder.Code(const inStream, outStream:TStream;const inSize, outSize:int64); var lpos:int64; progint:int64; inputsize:int64; begin if insize=-1 then inputsize:=instream.Size-instream.Position else inputsize:=insize; progint:=inputsize div CodeProgressInterval; lpos:=progint; _needReleaseMFStream := false; DoProgress(LPAMax,inputsize); try SetStreams(inStream, outStream, inSize, outSize); while true do begin CodeOneBlock(processedInSize, processedOutSize, finished); if finished then begin DoProgress(LPAPos,inputsize); exit; end; if (processedInSize>=lpos) then begin DoProgress(LPAPos,processedInSize); lpos:=lpos+progint; end; end; finally ReleaseStreams(); end; end; procedure TLZMAEncoder.WriteCoderProperties(const outStream:TStream); var i:integer; begin properties[0] := (_posStateBits * 5 + _numLiteralPosStateBits) * 9 + _numLiteralContextBits; for i := 0 to 3 do properties[1 + i] := byte(_dictionarySize shr (8 * i)); outStream.write(properties, kPropSize); end; procedure TLZMAEncoder.FillDistancesPrices; var i,posSlot,footerBits,baseVal,lenToPosState,st,st2:integer; encoder:TBitTreeEncoder; begin for i := ULZMABase.kStartPosModelIndex to ULZMABase.kNumFullDistances -1 do begin posSlot := GetPosSlot(i); footerBits := integer((posSlot shr 1) - 1); baseVal := (2 or (posSlot and 1)) shl footerBits; tempPrices[i] := ReverseGetPrice(_posEncoders, baseVal - posSlot - 1, footerBits, i - baseVal); end; for lenToPosState := 0 to ULZMABase.kNumLenToPosStates -1 do begin encoder := _posSlotEncoder[lenToPosState]; st := (lenToPosState shl ULZMABase.kNumPosSlotBits); for posSlot := 0 to _distTableSize -1 do _posSlotPrices[st + posSlot] := encoder.GetPrice(posSlot); for posSlot := ULZMABase.kEndPosModelIndex to _distTableSize -1 do _posSlotPrices[st + posSlot] := _posSlotPrices[st + posSlot] + ((((posSlot shr 1) - 1) - ULZMABase.kNumAlignBits) shl kNumBitPriceShiftBits); st2 := lenToPosState * ULZMABase.kNumFullDistances; for i := 0 to ULZMABase.kStartPosModelIndex -1 do _distancesPrices[st2 + i] := _posSlotPrices[st + i]; for i := ULZMABase.kStartPosModelIndex to ULZMABase.kNumFullDistances-1 do _distancesPrices[st2 + i] := _posSlotPrices[st + GetPosSlot(i)] + tempPrices[i]; end; _matchPriceCount := 0; end; procedure TLZMAEncoder.FillAlignPrices; var i:integer; begin for i := 0 to ULZMABase.kAlignTableSize -1 do _alignPrices[i] := _posAlignEncoder.ReverseGetPrice(i); _alignPriceCount := 0; end; function TLZMAEncoder.SetAlgorithm(const algorithm:integer):boolean; begin { _fastMode = (algorithm == 0); _maxMode = (algorithm >= 2); } result:=true; end; function TLZMAEncoder.SetDictionarySize(dictionarySize:integer):boolean; var kDicLogSizeMaxCompress,dicLogSize:integer; begin kDicLogSizeMaxCompress := 29; if (dictionarySize < (1 shl ULZMABase.kDicLogSizeMin)) or (dictionarySize > (1 shl kDicLogSizeMaxCompress)) then begin result:=false; exit; end; _dictionarySize := dictionarySize; dicLogSize := 0; while dictionarySize > (1 shl dicLogSize) do inc(dicLogSize); _distTableSize := dicLogSize * 2; result:=true; end; function TLZMAEncoder.SeNumFastBytes(const numFastBytes:integer):boolean; begin if (numFastBytes < 5) or (numFastBytes > ULZMABase.kMatchMaxLen) then begin result:=false; exit; end; _numFastBytes := numFastBytes; result:=true; end; function TLZMAEncoder.SetMatchFinder(const matchFinderIndex:integer):boolean; var matchFinderIndexPrev:integer; begin if (matchFinderIndex < 0) or (matchFinderIndex > 2) then begin result:=false; exit; end; matchFinderIndexPrev := _matchFinderType; _matchFinderType := matchFinderIndex; if (_matchFinder <> nil) and (matchFinderIndexPrev <> _matchFinderType) then begin _dictionarySizePrev := -1; _matchFinder := nil; end; result:=true; end; function TLZMAEncoder.SetLcLpPb(const lc,lp,pb:integer):boolean; begin if (lp < 0) or (lp > ULZMABase.kNumLitPosStatesBitsEncodingMax) or (lc < 0) or (lc > ULZMABase.kNumLitContextBitsMax) or (pb < 0) or (pb > ULZMABase.kNumPosStatesBitsEncodingMax) then begin result:=false; exit; end; _numLiteralPosStateBits := lp; _numLiteralContextBits := lc; _posStateBits := pb; _posStateMask := ((1) shl _posStateBits) - 1; result:=true; end; procedure TLZMAEncoder.SetEndMarkerMode(const endMarkerMode:boolean); begin _writeEndMark := endMarkerMode; end; procedure TLZMAEncoder2.Init; begin URangeEncoder.InitBitModels(m_Encoders); end; procedure TLZMAEncoder2.Encode(const rangeEncoder:TRangeEncoder;const symbol:byte); var context:integer; bit,i:integer; begin context := 1; for i := 7 downto 0 do begin bit := ((symbol shr i) and 1); rangeEncoder.Encode(m_Encoders, context, bit); context := (context shl 1) or bit; end; end; procedure TLZMAEncoder2.EncodeMatched(const rangeEncoder:TRangeEncoder;const matchByte,symbol:byte); var context,i,bit,state,matchbit:integer; same:boolean; begin context := 1; same := true; for i := 7 downto 0 do begin bit := ((symbol shr i) and 1); state := context; if same then begin matchBit := ((matchByte shr i) and 1); state :=state + ((1 + matchBit) shl 8); same := (matchBit = bit); end; rangeEncoder.Encode(m_Encoders, state, bit); context := (context shl 1) or bit; end; end; function TLZMAEncoder2.GetPrice(const matchMode:boolean;const matchByte,symbol:byte):integer; var price,context,i,matchbit,bit:integer; begin price := 0; context := 1; i := 7; if matchMode then while i>=0 do begin matchBit := (matchByte shr i) and 1; bit := (symbol shr i) and 1; price := price + RangeEncoder.GetPrice(m_Encoders[((1 + matchBit) shl 8) + context], bit); context := (context shl 1) or bit; if (matchBit <> bit) then begin dec(i); break; end; dec(i); end; while i>=0 do begin bit := (symbol shr i) and 1; price := price + RangeEncoder.GetPrice(m_Encoders[context], bit); context := (context shl 1) or bit; dec(i); end; result:=price; end; procedure TLZMALiteralEncoder._Create(const numPosBits,numPrevBits:integer); var numstates:integer; i:integer; begin if (length(m_Coders)<>0) and (m_NumPrevBits = numPrevBits) and (m_NumPosBits = numPosBits) then exit; m_NumPosBits := numPosBits; m_PosMask := (1 shl numPosBits) - 1; m_NumPrevBits := numPrevBits; numStates := 1 shl (m_NumPrevBits + m_NumPosBits); setlength(m_coders,numStates); for i := 0 to numStates-1 do m_Coders[i] := TLZMAEncoder2.Create; end; destructor TLZMALiteralEncoder.Destroy; var i:integer; begin for i:=low(m_Coders) to high(m_Coders) do if m_Coders[i]<>nil then m_Coders[i].Free; inherited; end; procedure TLZMALiteralEncoder.Init; var numstates,i:integer; begin numStates := 1 shl (m_NumPrevBits + m_NumPosBits); for i := 0 to numStates-1 do m_Coders[i].Init; end; function TLZMALiteralEncoder.GetSubCoder(const pos:integer;const prevByte:byte):TLZMAEncoder2; begin result:=m_Coders[((pos and m_PosMask) shl m_NumPrevBits) + ((prevByte and $FF) shr (8 - m_NumPrevBits))]; end; constructor TLZMALenEncoder.Create; var posState:integer; begin _highCoder := TBitTreeEncoder.Create(ULZMABase.kNumHighLenBits); for posState := 0 to ULZMABase.kNumPosStatesEncodingMax-1 do begin _lowCoder[posState] := TBitTreeEncoder.Create(ULZMABase.kNumLowLenBits); _midCoder[posState] := TBitTreeEncoder.Create(ULZMABase.kNumMidLenBits); end; end; destructor TLZMALenEncoder.Destroy; var posState:integer; begin _highCoder.Free; for posState := 0 to ULZMABase.kNumPosStatesEncodingMax-1 do begin _lowCoder[posState].Free; _midCoder[posState].Free; end; inherited; end; procedure TLZMALenEncoder.Init(const numPosStates:integer); var posState:integer; begin URangeEncoder.InitBitModels(_choice); for posState := 0 to numPosStates -1 do begin _lowCoder[posState].Init; _midCoder[posState].Init; end; _highCoder.Init; end; procedure TLZMALenEncoder.Encode(const rangeEncoder:TRangeEncoder;symbol:integer;const posState:integer); begin if (symbol < ULZMABase.kNumLowLenSymbols) then begin rangeEncoder.Encode(_choice, 0, 0); _lowCoder[posState].Encode(rangeEncoder, symbol); end else begin symbol := symbol - ULZMABase.kNumLowLenSymbols; rangeEncoder.Encode(_choice, 0, 1); if symbol < ULZMABase.kNumMidLenSymbols then begin rangeEncoder.Encode(_choice, 1, 0); _midCoder[posState].Encode(rangeEncoder, symbol); end else begin rangeEncoder.Encode(_choice, 1, 1); _highCoder.Encode(rangeEncoder, symbol - ULZMABase.kNumMidLenSymbols); end; end; end; procedure TLZMALenEncoder.SetPrices(const posState,numSymbols:integer;var prices:array of integer;const st:integer); var a0,a1,b0,b1,i:integer; begin a0 := RangeEncoder.GetPrice0(_choice[0]); a1 := RangeEncoder.GetPrice1(_choice[0]); b0 := a1 + RangeEncoder.GetPrice0(_choice[1]); b1 := a1 + RangeEncoder.GetPrice1(_choice[1]); i:=0; while i= numSymbols then exit; prices[st + i] := a0 + _lowCoder[posState].GetPrice(i); inc(i); end; while i < ULZMABase.kNumLowLenSymbols + ULZMABase.kNumMidLenSymbols do begin if i >= numSymbols then exit; prices[st + i] := b0 + _midCoder[posState].GetPrice(i - ULZMABase.kNumLowLenSymbols); inc(i); end; while i < numSymbols do begin prices[st + i] := b1 + _highCoder.GetPrice(i - ULZMABase.kNumLowLenSymbols - ULZMABase.kNumMidLenSymbols); inc(i); end; end; procedure TLZMALenPriceTableEncoder.SetTableSize(const tableSize:integer); begin _tableSize := tableSize; end; function TLZMALenPriceTableEncoder.GetPrice(const symbol,posState:integer):integer; begin result:=_prices[posState * ULZMABase.kNumLenSymbols + symbol] end; procedure TLZMALenPriceTableEncoder.UpdateTable(const posState:integer); begin SetPrices(posState, _tableSize, _prices, posState * ULZMABase.kNumLenSymbols); _counters[posState] := _tableSize; end; procedure TLZMALenPriceTableEncoder.UpdateTables(const numPosStates:integer); var posState:integer; begin for posState := 0 to numPosStates -1 do UpdateTable(posState); end; procedure TLZMALenPriceTableEncoder.Encode(const rangeEncoder:TRangeEncoder;symbol:integer;const posState:integer); begin inherited Encode(rangeEncoder, symbol, posState); dec(_counters[posState]); if (_counters[posState] = 0) then UpdateTable(posState); end; procedure TLZMAOptimal.MakeAsChar; begin BackPrev := -1; Prev1IsChar := false; end; procedure TLZMAOptimal.MakeAsShortRep; begin BackPrev := 0; Prev1IsChar := false; end; function TLZMAOptimal.IsShortRep:boolean; begin result:=BackPrev = 0; end; procedure TLZMAEncoder.DoProgress(const Action:TLZMAProgressAction;const Value:integer); begin if assigned(fonprogress) then fonprogress(action,value); end; end. doublecmd-0.5.8/plugins/wcx/lzma/LZMA/compression/LZMA/ULZMABase.pas0000644000175000017500000000470612014201074023770 0ustar alexxalexxunit ULZMABase; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} interface function StateInit:integer; function StateUpdateChar(const index:integer):integer; function StateUpdateMatch(const index:integer):integer; function StateUpdateRep(const index:integer):integer; function StateUpdateShortRep(const index:integer):integer; function StateIsCharState(const index:integer):boolean; function GetLenToPosState(len:integer):integer; const kNumRepDistances = 4; kNumStates = 12; kNumPosSlotBits = 6; kDicLogSizeMin = 0; // kDicLogSizeMax = 28; // kDistTableSizeMax = kDicLogSizeMax * 2; kNumLenToPosStatesBits = 2; // it's for speed optimization kNumLenToPosStates = 1 shl kNumLenToPosStatesBits; kMatchMinLen = 2; kNumAlignBits = 4; kAlignTableSize = 1 shl kNumAlignBits; kAlignMask = (kAlignTableSize - 1); kStartPosModelIndex = 4; kEndPosModelIndex = 14; kNumPosModels = kEndPosModelIndex - kStartPosModelIndex; kNumFullDistances = 1 shl (kEndPosModelIndex div 2); kNumLitPosStatesBitsEncodingMax = 4; kNumLitContextBitsMax = 8; kNumPosStatesBitsMax = 4; kNumPosStatesMax = (1 shl kNumPosStatesBitsMax); kNumPosStatesBitsEncodingMax = 4; kNumPosStatesEncodingMax = (1 shl kNumPosStatesBitsEncodingMax); kNumLowLenBits = 3; kNumMidLenBits = 3; kNumHighLenBits = 8; kNumLowLenSymbols = 1 shl kNumLowLenBits; kNumMidLenSymbols = 1 shl kNumMidLenBits; kNumLenSymbols = kNumLowLenSymbols + kNumMidLenSymbols + (1 shl kNumHighLenBits); kMatchMaxLen = kMatchMinLen + kNumLenSymbols - 1; implementation function StateInit:integer; begin result:=0; end; function StateUpdateChar(const index:integer):integer; begin if (index < 4) then result:=0 else if (index < 10) then result:=index - 3 else result:=index - 6; end; function StateUpdateMatch(const index:integer):integer; begin if index<7 then result:=7 else result:=10; end; function StateUpdateRep(const index:integer):integer; begin if index<7 then result:=8 else result:=11; end; function StateUpdateShortRep(const index:integer):integer; begin if index<7 then result:=9 else result:=11; end; function StateIsCharState(const index:integer):boolean; begin result:=index<7; end; function GetLenToPosState(len:integer):integer; begin len := len - kMatchMinLen; if (len < kNumLenToPosStates) then result:=len else result:=(kNumLenToPosStates - 1); end; end. doublecmd-0.5.8/plugins/wcx/lzma/LZMA/compression/LZMA/ULZMACommon.pas0000644000175000017500000000115212014201074024336 0ustar alexxalexxunit ULZMACommon; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} interface uses Classes; type TLZMAProgressAction=(LPAMax,LPAPos); TLZMAProgress=procedure (const Action:TLZMAProgressAction;const Value:int64) of object; function ReadByte(const stream:TStream):byte; procedure WriteByte(const stream:TStream;const b:byte); const CodeProgressInterval = 50;//approx. number of times an OnProgress event will be fired during coding implementation function ReadByte(const stream:TStream):byte; begin stream.Read(result,1); end; procedure WriteByte(const stream:TStream;const b:byte); begin stream.Write(b,1); end; end. doublecmd-0.5.8/plugins/wcx/lzma/LZMA/compression/LZMA/ULZMADecoder.pas0000644000175000017500000003414012014201074024456 0ustar alexxalexxunit ULZMADecoder; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} interface uses ULZMABase,UBitTreeDecoder,ULZOutWindow,URangeDecoder,Math,Classes,ULZMACommon; type TLZMALenDecoder = class; TLZMALiteralDecoder = class; TLZMADecoder = class private FOnProgress:TLZMAProgress; procedure DoProgress(const Action:TLZMAProgressAction;const Value:integer); public m_OutWindow:TLZOutWindow; m_RangeDecoder:TRangeDecoder; m_IsMatchDecoders: array [0..ULZMABase.kNumStates shl ULZMABase.kNumPosStatesBitsMax-1] of smallint; m_IsRepDecoders: array [0..ULZMABase.kNumStates-1] of smallint; m_IsRepG0Decoders: array [0..ULZMABase.kNumStates-1] of smallint; m_IsRepG1Decoders: array [0..ULZMABase.kNumStates-1] of smallint; m_IsRepG2Decoders: array [0..ULZMABase.kNumStates-1] of smallint; m_IsRep0LongDecoders: array [0..ULZMABase.kNumStates shl ULZMABase.kNumPosStatesBitsMax-1] of smallint; m_PosSlotDecoder: array [0..ULZMABase.kNumLenToPosStates-1] of TBitTreeDecoder; m_PosDecoders: array [0..ULZMABase.kNumFullDistances - ULZMABase.kEndPosModelIndex-1] of smallint; m_PosAlignDecoder:TBitTreeDecoder; m_LenDecoder:TLZMALenDecoder; m_RepLenDecoder:TLZMALenDecoder; m_LiteralDecoder:TLZMALiteralDecoder; m_DictionarySize:integer; m_DictionarySizeCheck:integer; m_PosStateMask:integer; constructor Create; destructor Destroy;override; function SetDictionarySize(const dictionarySize:integer):boolean; function SetLcLpPb(const lc,lp,pb:integer):boolean; procedure Init; function Code(const inStream,outStream:TStream;outSize:int64):boolean; function SetDecoderProperties(const properties:array of byte):boolean; property OnProgress:TLZMAProgress read FOnProgress write FOnProgress; end; TLZMALenDecoder = class public m_Choice:array [0..1] of smallint; m_LowCoder: array[0..ULZMABase.kNumPosStatesMax-1] of TBitTreeDecoder; m_MidCoder: array[0..ULZMABase.kNumPosStatesMax-1] of TBitTreeDecoder; m_HighCoder: TBitTreeDecoder; m_NumPosStates:integer; constructor Create; destructor Destroy;override; procedure _Create(const numPosStates:integer); procedure Init; function Decode(const rangeDecoder:TRangeDecoder;const posState:integer):integer; end; TLZMADecoder2 = class public m_Decoders: array [0..$300-1] of smallint; procedure Init; function DecodeNormal(const rangeDecoder:TRangeDecoder):byte; function DecodeWithMatchByte(const rangeDecoder:TRangeDecoder;matchByte:byte):byte; end; TLZMALiteralDecoder = class public m_Coders: array of TLZMADecoder2; m_NumPrevBits:integer; m_NumPosBits:integer; m_PosMask:integer; procedure _Create(const numPosBits, numPrevBits:integer); procedure Init; function GetDecoder(const pos:integer;const prevByte:byte):TLZMADecoder2; destructor Destroy;override; end; implementation constructor TLZMALenDecoder.Create; begin m_HighCoder:=TBitTreeDecoder.Create(ULZMABase.kNumHighLenBits); m_NumPosStates:=0; end; destructor TLZMALenDecoder.Destroy; var i:integer; begin m_HighCoder.free; for i:=low(m_LowCoder) to high(m_LowCoder) do begin if m_LowCoder[i]<>nil then m_LowCoder[i].free; if m_MidCoder[i]<>nil then m_MidCoder[i].free; end; inherited; end; procedure TLZMALenDecoder._Create(const numPosStates:integer); begin while m_NumPosStates < numPosStates do begin m_LowCoder[m_NumPosStates] := TBitTreeDecoder.Create(ULZMABase.kNumLowLenBits); m_MidCoder[m_NumPosStates] := TBitTreeDecoder.Create(ULZMABase.kNumMidLenBits); inc(m_NumPosStates); end; end; procedure TLZMALenDecoder.Init; var posState:integer; begin URangeDecoder.InitBitModels(m_Choice); for posState := 0 to m_NumPosStates-1 do begin m_LowCoder[posState].Init; m_MidCoder[posState].Init; end; m_HighCoder.Init; end; function TLZMALenDecoder.Decode(const rangeDecoder:TRangeDecoder;const posState:integer):integer; var symbol:integer; begin if (rangeDecoder.DecodeBit(m_Choice, 0) = 0) then begin result:=m_LowCoder[posState].Decode(rangeDecoder); exit; end; symbol := ULZMABase.kNumLowLenSymbols; if (rangeDecoder.DecodeBit(m_Choice, 1) = 0) then symbol := symbol + m_MidCoder[posState].Decode(rangeDecoder) else symbol := symbol + ULZMABase.kNumMidLenSymbols + m_HighCoder.Decode(rangeDecoder); result:=symbol; end; procedure TLZMADecoder2.Init; begin URangeDecoder.InitBitModels(m_Decoders); end; function TLZMADecoder2.DecodeNormal(const rangeDecoder:TRangeDecoder):byte; var symbol:integer; begin symbol := 1; repeat symbol := (symbol shl 1) or rangeDecoder.DecodeBit(m_Decoders, symbol); until not (symbol < $100); result:= byte(symbol); end; function TLZMADecoder2.DecodeWithMatchByte(const rangeDecoder:TRangeDecoder;matchByte:byte):byte; var symbol:integer; matchbit:integer; bit:integer; begin symbol := 1; repeat matchBit := (matchByte shr 7) and 1; matchByte := byte(matchByte shl 1); bit := rangeDecoder.DecodeBit(m_Decoders, ((1 + matchBit) shl 8) + symbol); symbol := (symbol shl 1) or bit; if (matchBit <> bit) then begin while (symbol < $100) do begin symbol := (symbol shl 1) or rangeDecoder.DecodeBit(m_Decoders, symbol); end; break; end; until not (symbol < $100); result:= byte(symbol); end; procedure TLZMALiteralDecoder._Create(const numPosBits, numPrevBits:integer); var numStates,i:integer; begin if (length(m_Coders) <> 0) and (m_NumPrevBits = numPrevBits) and (m_NumPosBits = numPosBits) then exit; m_NumPosBits := numPosBits; m_PosMask := (1 shl numPosBits) - 1; m_NumPrevBits := numPrevBits; numStates := 1 shl (m_NumPrevBits + m_NumPosBits); setlength(m_Coders,numStates); for i :=0 to numStates-1 do m_Coders[i] := TLZMADecoder2.Create; end; destructor TLZMALiteralDecoder.Destroy; var i:integer; begin for i :=low(m_Coders) to high(m_Coders) do if m_Coders[i]<>nil then m_Coders[i].Free; inherited; end; procedure TLZMALiteralDecoder.Init; var numStates,i:integer; begin numStates := 1 shl (m_NumPrevBits + m_NumPosBits); for i := 0 to numStates -1 do m_Coders[i].Init; end; function TLZMALiteralDecoder.GetDecoder(const pos:integer;const prevByte:byte):TLZMADecoder2; begin result:=m_Coders[((pos and m_PosMask) shl m_NumPrevBits) + ((prevByte and $FF) shr (8 - m_NumPrevBits))]; end; constructor TLZMADecoder.Create; var i:integer; begin FOnProgress:=nil; m_OutWindow:=TLZOutWindow.Create; m_RangeDecoder:=TRangeDecoder.Create; m_PosAlignDecoder:=TBitTreeDecoder.Create(ULZMABase.kNumAlignBits); m_LenDecoder:=TLZMALenDecoder.Create; m_RepLenDecoder:=TLZMALenDecoder.Create; m_LiteralDecoder:=TLZMALiteralDecoder.Create; m_DictionarySize:= -1; m_DictionarySizeCheck:= -1; for i := 0 to ULZMABase.kNumLenToPosStates -1 do m_PosSlotDecoder[i] :=TBitTreeDecoder.Create(ULZMABase.kNumPosSlotBits); end; destructor TLZMADecoder.Destroy; var i:integer; begin m_OutWindow.Free; m_RangeDecoder.Free; m_PosAlignDecoder.Free; m_LenDecoder.Free; m_RepLenDecoder.Free; m_LiteralDecoder.Free; for i := 0 to ULZMABase.kNumLenToPosStates -1 do m_PosSlotDecoder[i].Free; end; function TLZMADecoder.SetDictionarySize(const dictionarySize:integer):boolean; begin if dictionarySize < 0 then result:=false else begin if m_DictionarySize <> dictionarySize then begin m_DictionarySize := dictionarySize; m_DictionarySizeCheck := max(m_DictionarySize, 1); m_OutWindow._Create(max(m_DictionarySizeCheck, (1 shl 12))); end; result:=true; end; end; function TLZMADecoder.SetLcLpPb(const lc,lp,pb:integer):boolean; var numPosStates:integer; begin if (lc > ULZMABase.kNumLitContextBitsMax) or (lp > 4) or (pb > ULZMABase.kNumPosStatesBitsMax) then begin result:=false; exit; end; m_LiteralDecoder._Create(lp, lc); numPosStates := 1 shl pb; m_LenDecoder._Create(numPosStates); m_RepLenDecoder._Create(numPosStates); m_PosStateMask := numPosStates - 1; result:=true; end; procedure TLZMADecoder.Init; var i:integer; begin m_OutWindow.Init(false); URangeDecoder.InitBitModels(m_IsMatchDecoders); URangeDecoder.InitBitModels(m_IsRep0LongDecoders); URangeDecoder.InitBitModels(m_IsRepDecoders); URangeDecoder.InitBitModels(m_IsRepG0Decoders); URangeDecoder.InitBitModels(m_IsRepG1Decoders); URangeDecoder.InitBitModels(m_IsRepG2Decoders); URangeDecoder.InitBitModels(m_PosDecoders); m_LiteralDecoder.Init(); for i := 0 to ULZMABase.kNumLenToPosStates -1 do m_PosSlotDecoder[i].Init; m_LenDecoder.Init; m_RepLenDecoder.Init; m_PosAlignDecoder.Init; m_RangeDecoder.Init; end; function TLZMADecoder.Code(const inStream,outStream:TStream;outSize:int64):boolean; var state,rep0,rep1,rep2,rep3:integer; nowPos64:int64; prevByte:byte; posState:integer; decoder2:TLZMADecoder2; len,distance,posSlot,numDirectBits:integer; lpos:int64; progint:int64; begin DoProgress(LPAMax,outSize); m_RangeDecoder.SetStream(inStream); m_OutWindow.SetStream(outStream); Init; state := ULZMABase.StateInit; rep0 := 0; rep1 := 0; rep2 := 0; rep3 := 0; nowPos64 := 0; prevByte := 0; progint:=outsize div CodeProgressInterval; lpos:=progint; while (outSize < 0) or (nowPos64 < outSize) do begin if (nowPos64 >=lpos) then begin DoProgress(LPAPos,nowPos64); lpos:=lpos+progint; end; posState := nowPos64 and m_PosStateMask; if (m_RangeDecoder.DecodeBit(m_IsMatchDecoders, (state shl ULZMABase.kNumPosStatesBitsMax) + posState) = 0) then begin decoder2 := m_LiteralDecoder.GetDecoder(nowPos64, prevByte); if not ULZMABase.StateIsCharState(state) then prevByte := decoder2.DecodeWithMatchByte(m_RangeDecoder, m_OutWindow.GetByte(rep0)) else prevByte := decoder2.DecodeNormal(m_RangeDecoder); m_OutWindow.PutByte(prevByte); state := ULZMABase.StateUpdateChar(state); inc(nowPos64); end else begin if (m_RangeDecoder.DecodeBit(m_IsRepDecoders, state) = 1) then begin len := 0; if (m_RangeDecoder.DecodeBit(m_IsRepG0Decoders, state) = 0) then begin if (m_RangeDecoder.DecodeBit(m_IsRep0LongDecoders, (state shl ULZMABase.kNumPosStatesBitsMax) + posState) = 0) then begin state := ULZMABase.StateUpdateShortRep(state); len := 1; end; end else begin if m_RangeDecoder.DecodeBit(m_IsRepG1Decoders, state) = 0 then distance := rep1 else begin if (m_RangeDecoder.DecodeBit(m_IsRepG2Decoders, state) = 0) then distance := rep2 else begin distance := rep3; rep3 := rep2; end; rep2 := rep1; end; rep1 := rep0; rep0 := distance; end; if len = 0 then begin len := m_RepLenDecoder.Decode(m_RangeDecoder, posState) + ULZMABase.kMatchMinLen; state := ULZMABase.StateUpdateRep(state); end; end else begin rep3 := rep2; rep2 := rep1; rep1 := rep0; len := ULZMABase.kMatchMinLen + m_LenDecoder.Decode(m_RangeDecoder, posState); state := ULZMABase.StateUpdateMatch(state); posSlot := m_PosSlotDecoder[ULZMABase.GetLenToPosState(len)].Decode(m_RangeDecoder); if posSlot >= ULZMABase.kStartPosModelIndex then begin numDirectBits := (posSlot shr 1) - 1; rep0 := ((2 or (posSlot and 1)) shl numDirectBits); if posSlot < ULZMABase.kEndPosModelIndex then rep0 := rep0 + UBitTreeDecoder.ReverseDecode(m_PosDecoders, rep0 - posSlot - 1, m_RangeDecoder, numDirectBits) else begin rep0 := rep0 + (m_RangeDecoder.DecodeDirectBits( numDirectBits - ULZMABase.kNumAlignBits) shl ULZMABase.kNumAlignBits); rep0 := rep0 + m_PosAlignDecoder.ReverseDecode(m_RangeDecoder); if rep0 < 0 then begin if rep0 = -1 then break; result:=false; exit; end; end; end else rep0 := posSlot; end; if (rep0 >= nowPos64) or (rep0 >= m_DictionarySizeCheck) then begin m_OutWindow.Flush(); result:=false; exit; end; m_OutWindow.CopyBlock(rep0, len); nowPos64 := nowPos64 + len; prevByte := m_OutWindow.GetByte(0); end; end; m_OutWindow.Flush(); m_OutWindow.ReleaseStream(); m_RangeDecoder.ReleaseStream(); DoProgress(LPAPos,nowPos64); result:=true; end; function TLZMADecoder.SetDecoderProperties(const properties:array of byte):boolean; var val,lc,remainder,lp,pb,dictionarysize,i:integer; begin if length(properties) < 5 then begin result:=false; exit; end; val := properties[0] and $FF; lc := val mod 9; remainder := val div 9; lp := remainder mod 5; pb := remainder div 5; dictionarySize := 0; for i := 0 to 3 do dictionarySize := dictionarysize + ((properties[1 + i]) and $FF) shl (i * 8); if (not SetLcLpPb(lc, lp, pb)) then begin result:=false; exit; end; result:=SetDictionarySize(dictionarySize); end; procedure TLZMADecoder.DoProgress(const Action:TLZMAProgressAction;const Value:integer); begin if assigned(fonprogress) then fonprogress(action,value); end; end. doublecmd-0.5.8/plugins/wcx/lzma/LZMA/7zC.txt0000644000175000017500000001511412014201074017673 0ustar alexxalexx7z ANSI-C Decoder 4.23 ---------------------- 7z ANSI-C Decoder 4.23 Copyright (C) 1999-2005 Igor Pavlov 7z ANSI-C provides 7z/LZMA decoding. 7z ANSI-C version is simplified version ported from C++ code. LZMA is default and general compression method of 7z format in 7-Zip compression program (www.7-zip.org). LZMA provides high compression ratio and very fast decompression. LICENSE ------- Read lzma.txt for information about license. Files --------------------- 7zAlloc.* - Allocate and Free 7zBuffer.* - Buffer structure 7zCrc.* - CRC32 code 7zDecode.* - Low level memory->memory decoding 7zExtract.* - High level stream->memory decoding 7zHeader.* - .7z format constants 7zIn.* - .7z archive opening 7zItem.* - .7z structures 7zMain.c - Test application 7zMethodID.* - MethodID structure 7zTypes.h - Base types and constants How To Use ---------- You must download 7-Zip program from www.7-zip.org. You can create .7z archive with 7z.exe or 7za.exe: 7za.exe a archive.7z *.htm -r -mx -m0fb=255 -mf=off If you have big number of files in archive, and you need fast extracting, you can use partly-solid archives: 7za.exe a archive.7z *.htm -ms=512K -r -mx -m0fb=255 -m0d=512K -mf=off In that example 7-Zip will use 512KB solid blocks. So it needs to decompress only 512KB for extracting one file from such archive. Limitations of current version of 7z ANSI-C Decoder --------------------------------------------------- - It reads only "FileName", "Size", and "CRC" information for each file in archive. - It supports only LZMA and Copy (no compression) methods. - It converts original UTF-16 Unicode file names to UTF-8 Unicode file names. These limitations will be fixed in future versions. Using 7z ANSI-C Decoder Test application: ----------------------------------------- Usage: 7zDec : e: Extract files from archive l: List contents of archive t: Test integrity of archive Example: 7zDec l archive.7z lists contents of archive.7z 7zDec e archive.7z extracts files from archive.7z to current folder. How to use .7z Decoder ---------------------- .7z Decoder can be compiled in one of two modes: 1) Default mode. In that mode 7z Decoder will read full compressed block to RAM before decompressing. 2) Mode with defined _LZMA_IN_CB. In that mode 7z Decoder can read compressed block by parts. And you can specify desired buffer size. So memory requirements can be reduced. But decompressing speed will be 5-10% lower and code size is slightly larger. Memory allocation ~~~~~~~~~~~~~~~~~ 7z Decoder uses two memory pools: 1) Temporary pool 2) Main pool Such scheme can allow you to avoid fragmentation of allocated blocks. Steps for using 7z decoder -------------------------- Use code at 7zMain.c as example. 1) Declare variables: inStream /* implements ISzInStream interface */ CArchiveDatabaseEx db; /* 7z archive database structure */ ISzAlloc allocImp; /* memory functions for main pool */ ISzAlloc allocTempImp; /* memory functions for temporary pool */ 2) call InitCrcTable(); function to initialize CRC structures. 3) call SzArDbExInit(&db); function to initialize db structures. 4) call SzArchiveOpen(inStream, &db, &allocMain, &allocTemp) to open archive This function opens archive "inStream" and reads headers to "db". All items in "db" will be allocated with "allocMain" functions. SzArchiveOpen function allocates and frees temporary structures by "allocTemp" functions. 5) List items or Extract items Listing code: ~~~~~~~~~~~~~ { UInt32 i; for (i = 0; i < db.Database.NumFiles; i++) { CFileItem *f = db.Database.Files + i; printf("%10d %s\n", (int)f->Size, f->Name); } } Extracting code: ~~~~~~~~~~~~~~~~ SZ_RESULT SzExtract( ISzInStream *inStream, CArchiveDatabaseEx *db, UInt32 fileIndex, /* index of file */ UInt32 *blockIndex, /* index of solid block */ Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */ size_t *outBufferSize, /* buffer size for output buffer */ size_t *offset, /* offset of stream for required file in *outBuffer */ size_t *outSizeProcessed, /* size of file in *outBuffer */ ISzAlloc *allocMain, ISzAlloc *allocTemp); If you need to decompress more than one file, you can send these values from previous call: blockIndex, outBuffer, outBufferSize, You can consider "outBuffer" as cache of solid block. If your archive is solid, it will increase decompression speed. After decompressing you must free "outBuffer": allocImp.Free(outBuffer); 6) call SzArDbExFree(&db, allocImp.Free) to free allocated items in "db". Memory requirements for .7z decoding ------------------------------------ Memory usage for Archive opening: - Temporary pool: - Memory for compressed .7z headers (if _LZMA_IN_CB is not defined) - Memory for uncompressed .7z headers - some other temporary blocks - Main pool: - Memory for database: Estimated size of one file structures in solid archive: - Size (4 or 8 Bytes) - CRC32 (4 bytes) - Some file information (4 bytes) - File Name (variable length) + pointer + allocation structures Memory usage for archive Decompressing: - Temporary pool: - Memory for compressed solid block (if _LZMA_IN_CB is not defined) - Memory for LZMA decompressing structures - Main pool: - Memory for decompressed solid block If _LZMA_IN_CB is defined, 7z Decoder will not allocate memory for compressed blocks. Instead of this, you must allocate buffer with desired size before calling 7z Decoder. Use 7zMain.c as example. EXIT codes ----------- 7z Decoder functions can return one of the following codes: #define SZ_OK (0) #define SZE_DATA_ERROR (1) #define SZE_OUTOFMEMORY (2) #define SZE_CRC_ERROR (3) #define SZE_NOTIMPL (4) #define SZE_FAIL (5) #define SZE_ARCHIVE_ERROR (6) LZMA Defines ------------ _LZMA_IN_CB - Use special callback mode for input stream to reduce memory requirements _SZ_FILE_SIZE_64 - define it if you need support for files larger than 4 GB _SZ_NO_INT_64 - define it if your compiler doesn't support long long int _LZMA_PROB32 - it can increase LZMA decompressing speed on some 32-bit CPUs. _SZ_ONE_DIRECTORY - define it if you want to locate all source files to one directory _SZ_ALLOC_DEBUG - define it if you want to debug alloc/free operations to stderr. --- http://www.7-zip.org http://www.7-zip.org/support.html doublecmd-0.5.8/plugins/wcx/lzma/LZMA/LZMAAlone.lpr0000644000175000017500000000176012014201074020732 0ustar alexxalexxprogram LZMAAlone; {$MODE Delphi} uses UCRC in 'UCRC.pas', ULZBinTree in 'compression\LZ\ULZBinTree.pas', ULZInWindow in 'compression\LZ\ULZInWindow.pas', ULZOutWindow in 'compression\LZ\ULZOutWindow.pas', ULZMABase in 'compression\LZMA\ULZMABase.pas', ULZMACommon in 'compression\LZMA\ULZMACommon.pas', ULZMADecoder in 'compression\LZMA\ULZMADecoder.pas', ULZMAEncoder in 'compression\LZMA\ULZMAEncoder.pas', UBitTreeDecoder in 'compression\RangeCoder\UBitTreeDecoder.pas', UBitTreeEncoder in 'compression\RangeCoder\UBitTreeEncoder.pas', URangeDecoder in 'compression\RangeCoder\URangeDecoder.pas', URangeEncoder in 'compression\RangeCoder\URangeEncoder.pas', UBufferedFS in 'UBufferedFS.pas', ULZMAAlone in 'ULZMAAlone.pas', ULZMABench in 'ULZMABench.pas',SysUtils; var lz:TLZMAAlone; {$IFDEF MSWINDOWS} {$APPTYPE CONSOLE} {$ENDIF} begin try lz:=TLZMAAlone.Create; lz.Main; lz.Free; except on e:exception do writeln(e.message); end; end. doublecmd-0.5.8/plugins/wcx/lzma/LZMA/LGPL.txt0000644000175000017500000006351412014201074017775 0ustar alexxalexx GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! doublecmd-0.5.8/plugins/wcx/lzma/LZMA/ULZMABench.pas0000644000175000017500000003332212014201074021025 0ustar alexxalexxunit ULZMABench; {$IFDEF FPC} {$MODE Delphi} {$ENDIF} interface uses Classes,UCRC,ULZMACommon,windows,ULZMAEncoder,ULZMADecoder; type TLZMABench=class public function GetLogSize(const size:integer):integer; function MyMultDiv64(const value, elapsedTime:int64):int64; function GetCompressRating(const dictionarySize:integer;const elapsedTime,size:int64):int64; function GetDecompressRating(const elapsedTime:int64;const outSize,inSize:int64):int64; function GetTotalRating(const dictionarySize:int64;const elapsedTimeEn, sizeEn, elapsedTimeDe, inSizeDe, outSizeDe:int64):int64; procedure PrintValue(const v:int64); procedure PrintRating(const rating:int64); procedure PrintResults(const dictionarySize:integer;const elapsedTime, size:int64;const decompressMode:boolean;const secondSize:int64); function LzmaBenchmark(const numIterations, dictionarySize:integer):integer; end; TLZMARandomGenerator=class public A1:integer; A2:integer; constructor Create; procedure Init; function GetRnd:integer; end; TLZMABenchBitRandomGenerator=class public RG:TLZMARandomGenerator; Value:integer; NumBits:integer; constructor Create; destructor Destroy;override; procedure Init; function GetRnd(numBits:integer):integer; end; TLZMABenchRandomGenerator=class public RG:TLZMABenchBitRandomGenerator; Pos:integer; Rep0:integer; Buffer:array of byte; BufferSize:integer; constructor Create; destructor Destroy;override; procedure _Set(const bufferSize:integer); function GetRndBit:integer; function GetLogRandBits(const numBits:integer):integer; function GetOffset:integer; function GetLen1:integer; function GetLen2:integer; procedure Generate; end; TCRCStream=class(TStream) public CRC:TCRC; constructor Create; destructor Destroy;override; procedure Init; function GetDigest:integer; function Write(const Buffer; Count: Longint): Longint;override; end; TByteArray=array of byte; PByteArray=^TByteArray; TMyOutputStream=class(TStream) public _buffer:PByteArray; _size:integer; _pos:integer; constructor Create(const buffer:PByteArray); procedure Reset; function Write(const Buffer; Count: Longint): Longint;override; function Size:integer; end; TMyInputStream=class(TStream) public _buffer:PByteArray; _size:integer; _pos:integer; constructor Create(const buffer:PByteArray;const size:integer); procedure Reset; function Read(var Buffer; Count: Longint): Longint;override; end; TLZMAProgressInfo=class public ApprovedStart:int64; InSize:int64; Time:cardinal; procedure Init; procedure OnProgress(const Action:TLZMAProgressAction;const Value:int64); end; implementation uses SysUtils; const kAdditionalSize = (1 shl 21); kCompressedAdditionalSize = (1 shl 10); kSubBits = 8; constructor TLZMARandomGenerator.Create; begin Init; end; procedure TLZMARandomGenerator.Init; begin A1 := 362436069; A2 := 521288629; end; function TLZMARandomGenerator.GetRnd:integer; begin A1 := 36969 * (A1 and $ffff) + (A1 shr 16); A2 := 18000 * (A2 and $ffff) + (A2 shr 16); result:=(A1 shl 16) xor (A2); end; constructor TLZMABenchBitRandomGenerator.Create; begin RG:=TLZMARandomGenerator.Create; end; destructor TLZMABenchBitRandomGenerator.Destroy; begin RG.Free; end; procedure TLZMABenchBitRandomGenerator.Init; begin Value := 0; NumBits := 0; end; function TLZMABenchBitRandomGenerator.GetRnd(numBits:integer):integer; begin if self.NumBits > numBits then begin result := Value and ((1 shl numBits) - 1); Value := Value shr numBits; self.NumBits := self.NumBits - numBits; exit; end; numBits := numBits - self.NumBits; result := (Value shl numBits); Value := RG.GetRnd; result := result or (Value and ((1 shl numBits) - 1)); Value := value shr numBits; self.NumBits := 32 - numBits; end; constructor TLZMABenchRandomGenerator.Create; begin RG:=TLZMABenchBitRandomGenerator.Create; end; destructor TLZMABenchRandomGenerator.Destroy; begin RG.free; end; procedure TLZMABenchRandomGenerator._Set(const bufferSize:integer); begin setlength(Buffer,bufferSize); Pos := 0; self.BufferSize := bufferSize; end; function TLZMABenchRandomGenerator.GetLogRandBits(const numBits:integer):integer; var len:integer; begin len := RG.GetRnd(numBits); result:=RG.GetRnd(len); end; function TLZMABenchRandomGenerator.GetRndBit:integer; begin result:=RG.GetRnd(1); end; function TLZMABenchRandomGenerator.GetOffset:integer; begin if GetRndBit = 0 then result:=GetLogRandBits(4) else result:=(GetLogRandBits(4) shl 10) or RG.GetRnd(10); end; function TLZMABenchRandomGenerator.GetLen1:integer; begin result:=RG.GetRnd(1 + RG.GetRnd(2)); end; function TLZMABenchRandomGenerator.GetLen2:integer; begin result:=RG.GetRnd(2 + RG.GetRnd(2)); end; procedure TLZMABenchRandomGenerator.Generate; var len,i:integer; begin RG.Init; Rep0 := 1; while Pos < BufferSize do begin if (GetRndBit = 0) or (Pos < 1) then begin Buffer[Pos] := RG.GetRnd(8); inc(pos); end else begin if RG.GetRnd(3) = 0 then len := 1 + GetLen1 else begin repeat Rep0 := GetOffset; until not (Rep0 >= Pos); inc(Rep0); len := 2 + GetLen2; end; i:=0; while (i < len) and (Pos < BufferSize) do begin Buffer[Pos] := Buffer[Pos - Rep0]; inc(i); inc(pos); end; end; end; end; constructor TCRCStream.Create; begin CRC:=TCRC.Create; end; destructor TCRCStream.Destroy; begin CRC.Free; end; procedure TCRCStream.Init; begin CRC.Init; end; function TCRCStream.GetDigest:integer; begin result:=CRC.GetDigest; end; function TCRCStream.Write(const Buffer; Count: Longint): Longint; var p:^byte; i:integer; begin p:=@buffer; for i:=0 to count -1 do begin CRC.UpdateByte(p^); inc(p); end; result:=count; end; constructor TMyOutputStream.Create(const buffer:PByteArray); begin _buffer:=buffer; _size:=length(buffer^); end; procedure TMyOutputStream.Reset; begin _pos:=0; end; function TMyOutputStream.Write(const Buffer; Count: Longint): Longint; begin if _pos+count>=_size then raise Exception.Create('Error'); move(buffer,_buffer^[_pos],count); _pos:=_pos+count; result:=count; end; function TMyOutputStream.Size:integer; begin result:=_pos; end; constructor TMyInputStream.Create(const buffer:PByteArray;const size:integer); begin _buffer:=buffer; _size:=size; end; procedure TMyInputStream.Reset; begin _pos:=0; end; function TMyInputStream.Read(var Buffer; Count: Longint): Longint; var b:int64; begin try b:=_size-_pos; if b>count then b:=count; result:=b; move(_buffer^[_pos],buffer,b); _pos:=_pos+b; except writeln('inread error'); end; end; procedure TLZMAProgressInfo.Init; begin InSize:=0; end; procedure TLZMAProgressInfo.OnProgress(const Action:TLZMAProgressAction;const Value:int64); begin if Action=LPAMax then exit; if (value >= ApprovedStart) and (InSize = 0) then begin Time := GetTickCount; InSize := value; end; end; function TLZMABench.GetLogSize(const size:integer):integer; var i,j:integer; begin for i := kSubBits to 31 do for j := 0 to 1 shl kSubBits -1 do if (size <= (1 shl i) + (j shl (i - kSubBits))) then begin result:=(i shl kSubBits) + j; exit; end; result:=32 shl kSubBits; end; function TLZMABench.MyMultDiv64(const value, elapsedTime:int64):int64; var freq,elTime:int64; begin freq := 1000; // ms elTime := elapsedTime; while freq > 1000000 do begin freq := freq shr 1; elTime :=elTime shr 1; end; if elTime = 0 then elTime := 1; result:=value * freq div elTime; end; function TLZMABench.GetCompressRating(const dictionarySize:integer;const elapsedTime,size:int64):int64; var t,numCommandsForOne,numCommands:int64; begin t := GetLogSize(dictionarySize) - (18 shl kSubBits); numCommandsForOne := 1060 + ((t * t * 10) shr (2 * kSubBits)); numCommands := size * numCommandsForOne; result:=MyMultDiv64(numCommands, elapsedTime); end; function TLZMABench.GetDecompressRating(const elapsedTime:int64;const outSize,inSize:int64):int64; var numCommands:int64; begin numCommands := inSize * 220 + outSize * 20; result:=MyMultDiv64(numCommands, elapsedTime); end; function TLZMABench.GetTotalRating(const dictionarySize:int64;const elapsedTimeEn, sizeEn, elapsedTimeDe, inSizeDe, outSizeDe:int64):int64; begin result:=(GetCompressRating(dictionarySize, elapsedTimeEn, sizeEn) + GetDecompressRating(elapsedTimeDe, inSizeDe, outSizeDe)) div 2; end; procedure TLZMABench.PrintValue(const v:int64); var s:string; i:integer; begin s:=inttostr(v); i:=0; while i+length(s)<6 do begin write(' '); inc(i); end; write(s); end; procedure TLZMABench.PrintRating(const rating:int64); begin PrintValue(rating div 1000000); write(' MIPS'); end; procedure TLZMABench.PrintResults(const dictionarySize:integer;const elapsedTime, size:int64;const decompressMode:boolean;const secondSize:int64); var speed:int64; rating:int64; begin speed := MyMultDiv64(size, elapsedTime); PrintValue(speed div 1024); write(' KB/s '); if decompressMode then rating := GetDecompressRating(elapsedTime, size, secondSize) else rating := GetCompressRating(dictionarySize, elapsedTime, size); PrintRating(rating); end; function TLZMABench.LzmaBenchmark(const numIterations, dictionarySize:integer):integer; var encoder:TLZMAEncoder; decoder:TLZMADecoder; kBufferSize,kCompressedBufferSize:integer; propStream:TMemoryStream; proparray:array of byte; rg:TLZMABenchRandomGenerator; crc:TCRC; progressInfo:TLZMAProgressInfo; totalBenchSize,totalEncodeTime,totalDecodeTime,totalCompressedSize:int64; inStream:TMyInputStream; compressedBuffer:array of byte; compressedStream:TMyOutputStream; CrcOutStream:TCRCStream; inputCompressedStream:TMyInputStream; compressedSize,i,j:integer; encodeTime,decodeTime:cardinal; outSize,startTime,benchSize:int64; begin if numIterations <= 0 then begin result:=0; exit; end; if dictionarySize < (1 shl 18) then begin writeln(#10'Error: dictionary size for benchmark must be >= 18 (256 KB)'); result:=1; exit; end; write(#10' Compressing Decompressing'#10#10); encoder := TLZMAEncoder.Create; decoder := TLZMADecoder.Create; if not encoder.SetDictionarySize(dictionarySize) then raise Exception.Create('Incorrect dictionary size'); kBufferSize := dictionarySize + kAdditionalSize; kCompressedBufferSize := (kBufferSize div 2) + kCompressedAdditionalSize; propstream:=TMemoryStream.Create; encoder.WriteCoderProperties(propStream); setlength(proparray,propstream.size); propstream.Position:=0; propstream.Read(propArray[0],propstream.Size); decoder.SetDecoderProperties(propArray); rg := TLZMABenchRandomGenerator.Create; rg._Set(kBufferSize); rg.Generate; crc := TCRC.Create; crc.Init; crc.Update(rg.Buffer[0], 0, rg.BufferSize); progressInfo := TLZMAProgressInfo.Create; progressInfo.ApprovedStart := dictionarySize; totalBenchSize := 0; totalEncodeTime := 0; totalDecodeTime := 0; totalCompressedSize := 0; inStream := TMyInputStream.Create(@(rg.Buffer), rg.BufferSize); setlength(compressedBuffer,kCompressedBufferSize); compressedStream := TMyOutputStream.Create(@compressedBuffer); crcOutStream :=TCRCStream.Create; inputCompressedStream := nil; compressedSize := 0; for i := 0 to numIterations -1 do begin progressInfo.Init; inStream.reset; compressedStream.reset; encoder.OnProgress:=progressInfo.OnProgress; encoder.Code(inStream, compressedStream, rg.BufferSize, -1); encodeTime := GetTickCount - progressInfo.Time; if i = 0 then begin compressedSize := compressedStream.size; inputCompressedStream := TMyInputStream.Create(@compressedBuffer, compressedSize); end else if compressedSize <> compressedStream.size then raise Exception.Create('Encoding error'); if progressInfo.InSize = 0 then raise Exception.Create('Internal ERROR 1282'); decodeTime := 0; for j := 0 to 1 do begin inputCompressedStream.reset; crcOutStream.Init; outSize := kBufferSize; startTime := GetTickCount; if not decoder.Code(inputCompressedStream, crcOutStream, outSize) then raise Exception.Create('Decoding Error'); decodeTime := GetTickCount - startTime; if crcOutStream.GetDigest <> crc.GetDigest then raise Exception.Create('CRC Error'); end; benchSize := kBufferSize - progressInfo.InSize; PrintResults(dictionarySize, encodeTime, benchSize, false, 0); write(' '); PrintResults(dictionarySize, decodeTime, kBufferSize, true, compressedSize); writeln(''); totalBenchSize := totalBenchSize + benchSize; totalEncodeTime := totalEncodeTime + encodeTime; totalDecodeTime := totalDecodeTime + decodeTime; totalCompressedSize := totalCompressedSize + compressedSize; end; writeln('---------------------------------------------------'); PrintResults(dictionarySize, totalEncodeTime, totalBenchSize, false, 0); write(' '); PrintResults(dictionarySize, totalDecodeTime, kBufferSize * numIterations, true, totalCompressedSize); writeln(' Average'); result:=0; end; end. doublecmd-0.5.8/plugins/wcx/lzma/LZMA/LZMAAlone.cfg0000644000175000017500000000066211222206571020703 0ustar alexxalexx-$A8 -$B- -$C+ -$D+ -$E- -$F- -$G+ -$H+ -$I+ -$J- -$K- -$L+ -$M- -$N+ -$O+ -$P+ -$Q- -$R- -$S- -$T- -$U- -$V+ -$W- -$X+ -$YD -$Z1 -cg -AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -H+ -W+ -M -$M16384,1048576 -K$00400000 -LE"c:\program files\borland\delphi7\Projects\Bpl" -LN"c:\program files\borland\delphi7\Projects\Bpl" -w-UNSAFE_TYPE -w-UNSAFE_CODE -w-UNSAFE_CAST doublecmd-0.5.8/plugins/wcx/lzma/LZMA/7zFormat.txt0000644000175000017500000001617212014201074020746 0ustar alexxalexx7z Format description (2.30 Beta 25) ----------------------------------- This file contains description of 7z archive format. 7z archive can contain files compressed with any method. See "Methods.txt" for description for defined compressing methods. Format structure Overview ------------------------- Some fields can be optional. Archive structure ~~~~~~~~~~~~~~~~~ SignatureHeader [PackedStreams] [PackedStreamsForHeaders] [ Header or { Packed Header HeaderInfo } ] Header structure ~~~~~~~~~~~~~~~~ { ArchiveProperties AdditionalStreams { PackInfo { PackPos NumPackStreams Sizes[NumPackStreams] CRCs[NumPackStreams] } CodersInfo { NumFolders Folders[NumFolders] { NumCoders CodersInfo[NumCoders] { ID NumInStreams; NumOutStreams; PropertiesSize Properties[PropertiesSize] } NumBindPairs BindPairsInfo[NumBindPairs] { InIndex; OutIndex; } PackedIndices } UnPackSize[Folders][Folders.NumOutstreams] CRCs[NumFolders] } SubStreamsInfo { NumUnPackStreamsInFolders[NumFolders]; UnPackSizes[] CRCs[] } } MainStreamsInfo { (Same as in AdditionalStreams) } FilesInfo { NumFiles Properties[] { ID Size Data } } } HeaderInfo structure ~~~~~~~~~~~~~~~~~~~~ { (Same as in AdditionalStreams) } Notes about Notation and encoding --------------------------------- 7z uses little endian encoding. 7z archive format has optional headers that are marked as [] Header [] REAL_UINT64 means real UINT64. UINT64 means real UINT64 encoded with the following scheme: Size of encoding sequence depends from first byte: First_Byte Extra_Bytes Value (binary) 0xxxxxxx : ( xxxxxxx ) 10xxxxxx BYTE y[1] : ( xxxxxx << (8 * 1)) + y 110xxxxx BYTE y[2] : ( xxxxx << (8 * 2)) + y ... 1111110x BYTE y[6] : ( x << (8 * 6)) + y 11111110 BYTE y[7] : y 11111111 BYTE y[8] : y Property IDs ------------ 0x00 = kEnd, 0x01 = kHeader, 0x02 = kArchiveProperties, 0x03 = kAdditionalStreamsInfo, 0x04 = kMainStreamsInfo, 0x05 = kFilesInfo, 0x06 = kPackInfo, 0x07 = kUnPackInfo, 0x08 = kSubStreamsInfo, 0x09 = kSize, 0x0A = kCRC, 0x0B = kFolder, 0x0C = kCodersUnPackSize, 0x0D = kNumUnPackStream, 0x0E = kEmptyStream, 0x0F = kEmptyFile, 0x10 = kAnti, 0x11 = kName, 0x12 = kCreationTime, 0x13 = kLastAccessTime, 0x14 = kLastWriteTime, 0x15 = kWinAttributes, 0x16 = kComment, 0x17 = kEncodedHeader, 7z format headers ----------------- SignatureHeader ~~~~~~~~~~~~~~~ BYTE kSignature[6] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; ArchiveVersion { BYTE Major; // now = 0 BYTE Minor; // now = 2 }; UINT32 StartHeaderCRC; StartHeader { REAL_UINT64 NextHeaderOffset REAL_UINT64 NextHeaderSize UINT32 NextHeaderCRC } ........................... ArchiveProperties ~~~~~~~~~~~~~~~~~ BYTE NID::kArchiveProperties (0x02) while(true) { BYTE PropertyType; if (aType == 0) break; UINT64 PropertySize; BYTE PropertyData[PropertySize]; } Digests (NumStreams) ~~~~~~~~~~~~~~~~~~~~~ BYTE AllAreDefined if (AllAreDefined == 0) { for(NumStreams) BIT Defined } UINT32 CRCs[NumDefined] PackInfo ~~~~~~~~~~~~ BYTE NID::kPackInfo (0x06) UINT64 PackPos UINT64 NumPackStreams [] BYTE NID::kSize (0x09) UINT64 PackSizes[NumPackStreams] [] [] BYTE NID::kCRC (0x0A) PackStreamDigests[NumPackStreams] [] BYTE NID::kEnd Folder ~~~~~~ UINT64 NumCoders; for (NumCoders) { BYTE { 0:3 DecompressionMethod.IDSize 4: 0 - IsSimple 1 - Is not simple 5: 0 - No Attributes 1 - There Are Attributes 7: 0 - Last Method in Alternative_Method_List 1 - There are more alternative methods } BYTE DecompressionMethod.ID[DecompressionMethod.IDSize] if (!IsSimple) { UINT64 NumInStreams; UINT64 NumOutStreams; } if (DecompressionMethod[0] != 0) { UINT64 PropertiesSize BYTE Properties[PropertiesSize] } } NumBindPairs = NumOutStreamsTotal - 1; for (NumBindPairs) { UINT64 InIndex; UINT64 OutIndex; } NumPackedStreams = NumInStreamsTotal - NumBindPairs; if (NumPackedStreams > 1) for(NumPackedStreams) { UINT64 Index; }; Coders Info ~~~~~~~~~~~ BYTE NID::kUnPackInfo (0x07) BYTE NID::kFolder (0x0B) UINT64 NumFolders BYTE External switch(External) { case 0: Folders[NumFolders] case 1: UINT64 DataStreamIndex } BYTE ID::kCodersUnPackSize (0x0C) for(Folders) for(Folder.NumOutStreams) UINT64 UnPackSize; [] BYTE NID::kCRC (0x0A) UnPackDigests[NumFolders] [] BYTE NID::kEnd SubStreams Info ~~~~~~~~~~~~~~ BYTE NID::kSubStreamsInfo; (0x08) [] BYTE NID::kNumUnPackStream; (0x0D) UINT64 NumUnPackStreamsInFolders[NumFolders]; [] [] BYTE NID::kSize (0x09) UINT64 UnPackSizes[] [] [] BYTE NID::kCRC (0x0A) Digests[Number of streams with unknown CRC] [] BYTE NID::kEnd Streams Info ~~~~~~~~~~~~ [] PackInfo [] [] CodersInfo [] [] SubStreamsInfo [] BYTE NID::kEnd FilesInfo ~~~~~~~~~ BYTE NID::kFilesInfo; (0x05) UINT64 NumFiles while(true) { BYTE PropertyType; if (aType == 0) break; UINT64 Size; switch(PropertyType) { kEmptyStream: (0x0E) for(NumFiles) BIT IsEmptyStream kEmptyFile: (0x0F) for(EmptyStreams) BIT IsEmptyFile kAnti: (0x10) for(EmptyStreams) BIT IsAntiFile case kCreationTime: (0x12) case kLastAccessTime: (0x13) case kLastWriteTime: (0x14) BYTE AllAreDefined if (AllAreDefined == 0) { for(NumFiles) BIT TimeDefined } BYTE External; if(External != 0) UINT64 DataIndex [] for(Definded Items) UINT32 Time [] kNames: (0x11) BYTE External; if(External != 0) UINT64 DataIndex [] for(Files) { wchar_t Names[NameSize]; wchar_t 0; } [] kAttributes: (0x15) BYTE AllAreDefined if (AllAreDefined == 0) { for(NumFiles) BIT AttributesAreDefined } BYTE External; if(External != 0) UINT64 DataIndex [] for(Definded Attributes) UINT32 Attributes [] } } Header ~~~~~~ BYTE NID::kHeader (0x01) [] ArchiveProperties [] [] BYTE NID::kAdditionalStreamsInfo; (0x03) StreamsInfo [] [] BYTE NID::kMainStreamsInfo; (0x04) StreamsInfo [] [] FilesInfo [] BYTE NID::kEnd HeaderInfo ~~~~~~~~~~ [] BYTE NID::kEncodedHeader; (0x17) StreamsInfo for Encoded Header [] --- End of document doublecmd-0.5.8/plugins/wcx/lzma/LZMA/Methods.txt0000644000175000017500000000516212014201074020635 0ustar alexxalexxCompression method IDs (4.38) ----------------------------- Each compression method in 7z has unique binary value (ID). The length of ID in bytes is arbitrary but it can not exceed 15 bytes. If you want to add some new ID, you have two ways: 1) Write request for allocating IDs to 7-zip developers. 2) Use such random ID: 03 E0 ZZ ... ZZ MM ... MM VV ... VV ZZ != 0, MM != 0, VV != 0 03 E0 - Prefix for random IDs ZZ ... ZZ - Developer ID. (length >= 4). Use real random bytes. You can notify 7-Zip developers about your Developer ID. MM ... MM - Method ID (length >= 1) VV ... VV - Version (length >= 1) Note: Use new ID (MM ... MM VV .. VV) only if old codec can not decode data encoded with new version. List of defined IDs ------------------- 00 - Copy 01 - Reserved 02 - Common 03 Swap - 2 Swap2 - 4 Swap4 04 Delta (subject to change) 03 - 7z 01 - LZMA 01 - Version 03 - Branch 01 - x86 03 - BCJ 1B - BCJ2 02 - PPC 05 - BC_PPC_B (Big Endian) 03 - Alpha 01 - BC_Alpha 04 - IA64 01 - BC_IA64 05 - ARM 01 - BC_ARM 06 - M68 05 - BC_M68_B (Big Endian) 07 - ARM Thumb 01 - BC_ARMThumb 08 - SPARC 05 - BC_SPARC 04 - PPMD 01 - Version 80 - reserved for independent developers E0 - Random IDs 04 - Misc 00 - Reserved 01 - Zip 00 - Copy (not used). Use {00} instead 01 - Shrink 06 - Implode 08 - Deflate 09 - Deflate64 12 - BZip2 (not used). Use {04 02 02} instead 02 - BZip 02 - BZip2 03 - Rar 01 - Rar15 02 - Rar20 03 - Rar29 04 - Arj 01 - Arj (1,2,3) 02 - Arj 4 05 - Z 06 - Lzh 07 - Reserved for 7z 08 - Cab 09 - NSIS 01 - DeflateNSIS 02 - BZip2NSIS 06 - Crypto 00 - 01 - AES 0x - AES-128 4x - AES-192 8x - AES-256 x0 - ECB x1 - CBC x2 - CFB x3 - OFB 07 - Reserved 0F - Reserved F0 - Misc Ciphers (Real Ciphers without hashing algo) F1 - Misc Ciphers (Combine) 01 - Zip 01 - Main Zip crypto algo 03 - RAR 02 - 03 - Rar29 AES-128 + (modified SHA-1) 07 - 7z 01 - AES-256 + SHA-256 07 - Hash (subject to change) 00 - 01 - CRC 02 - SHA-1 03 - SHA-256 04 - SHA-384 05 - SHA-512 F0 - Misc Hash F1 - Misc 03 - RAR 03 - Rar29 Password Hashing (modified SHA1) 07 - 7z 01 - SHA-256 Password Hashing --- End of document doublecmd-0.5.8/plugins/wcx/lzma/LZMA/lzma.txt0000644000175000017500000005121212014201074020172 0ustar alexxalexxLZMA SDK 4.42 ------------- LZMA SDK Copyright (C) 1999-2006 Igor Pavlov LZMA SDK provides the documentation, samples, header files, libraries, and tools you need to develop applications that use LZMA compression. LZMA is default and general compression method of 7z format in 7-Zip compression program (www.7-zip.org). LZMA provides high compression ratio and very fast decompression. LZMA is an improved version of famous LZ77 compression algorithm. It was improved in way of maximum increasing of compression ratio, keeping high decompression speed and low memory requirements for decompressing. LICENSE ------- LZMA SDK is available under any of the following licenses: 1) GNU Lesser General Public License (GNU LGPL) 2) Common Public License (CPL) 3) Simplified license for unmodified code (read SPECIAL EXCEPTION) 4) Proprietary license It means that you can select one of these four options and follow rules of that license. 1,2) GNU LGPL and CPL licenses are pretty similar and both these licenses are classified as - "Free software licenses" at http://www.gnu.org/ - "OSI-approved" at http://www.opensource.org/ 3) SPECIAL EXCEPTION Igor Pavlov, as the author of this code, expressly permits you to statically or dynamically link your code (or bind by name) to the files from LZMA SDK without subjecting your linked code to the terms of the CPL or GNU LGPL. Any modifications or additions to files from LZMA SDK, however, are subject to the GNU LGPL or CPL terms. SPECIAL EXCEPTION allows you to use LZMA SDK in applications with closed code, while you keep LZMA SDK code unmodified. SPECIAL EXCEPTION #2: Igor Pavlov, as the author of this code, expressly permits you to use this code under the same terms and conditions contained in the License Agreement you have for any previous version of LZMA SDK developed by Igor Pavlov. SPECIAL EXCEPTION #2 allows owners of proprietary licenses to use latest version of LZMA SDK as update for previous versions. SPECIAL EXCEPTION #3: Igor Pavlov, as the author of this code, expressly permits you to use code of the following files: BranchTypes.h, LzmaTypes.h, LzmaTest.c, LzmaStateTest.c, LzmaAlone.cpp, LzmaAlone.cs, LzmaAlone.java as public domain code. 4) Proprietary license LZMA SDK also can be available under a proprietary license which can include: 1) Right to modify code without subjecting modified code to the terms of the CPL or GNU LGPL 2) Technical support for code To request such proprietary license or any additional consultations, send email message from that page: http://www.7-zip.org/support.html You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA You should have received a copy of the Common Public License along with this library. LZMA SDK Contents ----------------- LZMA SDK includes: - C++ source code of LZMA compressing and decompressing - ANSI-C compatible source code for LZMA decompressing - C# source code for LZMA compressing and decompressing - Java source code for LZMA compressing and decompressing - Compiled file->file LZMA compressing/decompressing program for Windows system ANSI-C LZMA decompression code was ported from original C++ sources to C. Also it was simplified and optimized for code size. But it is fully compatible with LZMA from 7-Zip. UNIX/Linux version ------------------ To compile C++ version of file->file LZMA, go to directory C/7zip/Compress/LZMA_Alone and type "make" or "make clean all" to recompile all. In some UNIX/Linux versions you must compile LZMA with static libraries. To compile with static libraries, change string in makefile LIB = -lm to string LIB = -lm -static Files --------------------- C - C / CPP source code CS - C# source code Java - Java source code lzma.txt - LZMA SDK description (this file) 7zFormat.txt - 7z Format description 7zC.txt - 7z ANSI-C Decoder description (this file) methods.txt - Compression method IDs for .7z LGPL.txt - GNU Lesser General Public License CPL.html - Common Public License lzma.exe - Compiled file->file LZMA encoder/decoder for Windows history.txt - history of the LZMA SDK Source code structure --------------------- C - C / CPP files Common - common files for C++ projects Windows - common files for Windows related code 7zip - files related to 7-Zip Project Common - common files for 7-Zip Compress - files related to compression/decompression LZ - files related to LZ (Lempel-Ziv) compression algorithm BinTree - Binary Tree Match Finder for LZ algorithm HashChain - Hash Chain Match Finder for LZ algorithm Patricia - Patricia Match Finder for LZ algorithm RangeCoder - Range Coder (special code of compression/decompression) LZMA - LZMA compression/decompression on C++ LZMA_Alone - file->file LZMA compression/decompression LZMA_C - ANSI-C compatible LZMA decompressor LzmaDecode.h - interface for LZMA decoding on ANSI-C LzmaDecode.c - LZMA decoding on ANSI-C (new fastest version) LzmaDecodeSize.c - LZMA decoding on ANSI-C (old size-optimized version) LzmaTest.c - test application that decodes LZMA encoded file LzmaTypes.h - basic types for LZMA Decoder LzmaStateDecode.h - interface for LZMA decoding (State version) LzmaStateDecode.c - LZMA decoding on ANSI-C (State version) LzmaStateTest.c - test application (State version) Branch - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code Archive - files related to archiving 7z_C - 7z ANSI-C Decoder CS - C# files 7zip Common - some common files for 7-Zip Compress - files related to compression/decompression LZ - files related to LZ (Lempel-Ziv) compression algorithm LZMA - LZMA compression/decompression LzmaAlone - file->file LZMA compression/decompression RangeCoder - Range Coder (special code of compression/decompression) Java - Java files SevenZip Compression - files related to compression/decompression LZ - files related to LZ (Lempel-Ziv) compression algorithm LZMA - LZMA compression/decompression RangeCoder - Range Coder (special code of compression/decompression) C/C++ source code of LZMA SDK is part of 7-Zip project. You can find ANSI-C LZMA decompressing code at folder C/7zip/Compress/LZMA_C 7-Zip doesn't use that ANSI-C LZMA code and that code was developed specially for this SDK. And files from LZMA_C do not need files from other directories of SDK for compiling. 7-Zip source code can be downloaded from 7-Zip's SourceForge page: http://sourceforge.net/projects/sevenzip/ LZMA features ------------- - Variable dictionary size (up to 1 GB) - Estimated compressing speed: about 1 MB/s on 1 GHz CPU - Estimated decompressing speed: - 8-12 MB/s on 1 GHz Intel Pentium 3 or AMD Athlon - 500-1000 KB/s on 100 MHz ARM, MIPS, PowerPC or other simple RISC - Small memory requirements for decompressing (8-32 KB + DictionarySize) - Small code size for decompressing: 2-8 KB (depending from speed optimizations) LZMA decoder uses only integer operations and can be implemented in any modern 32-bit CPU (or on 16-bit CPU with some conditions). Some critical operations that affect to speed of LZMA decompression: 1) 32*16 bit integer multiply 2) Misspredicted branches (penalty mostly depends from pipeline length) 3) 32-bit shift and arithmetic operations Speed of LZMA decompressing mostly depends from CPU speed. Memory speed has no big meaning. But if your CPU has small data cache, overall weight of memory speed will slightly increase. How To Use ---------- Using LZMA encoder/decoder executable -------------------------------------- Usage: LZMA inputFile outputFile [...] e: encode file d: decode file b: Benchmark. There are two tests: compressing and decompressing with LZMA method. Benchmark shows rating in MIPS (million instructions per second). Rating value is calculated from measured speed and it is normalized with AMD Athlon 64 X2 CPU results. Also Benchmark checks possible hardware errors (RAM errors in most cases). Benchmark uses these settings: (-a1, -d21, -fb32, -mfbt4). You can change only -d. Also you can change number of iterations. Example for 30 iterations: LZMA b 30 Default number of iterations is 10. -a{N}: set compression mode 0 = fast, 1 = normal default: 1 (normal) d{N}: Sets Dictionary size - [0, 30], default: 23 (8MB) The maximum value for dictionary size is 1 GB = 2^30 bytes. Dictionary size is calculated as DictionarySize = 2^N bytes. For decompressing file compressed by LZMA method with dictionary size D = 2^N you need about D bytes of memory (RAM). -fb{N}: set number of fast bytes - [5, 273], default: 128 Usually big number gives a little bit better compression ratio and slower compression process. -lc{N}: set number of literal context bits - [0, 8], default: 3 Sometimes lc=4 gives gain for big files. -lp{N}: set number of literal pos bits - [0, 4], default: 0 lp switch is intended for periodical data when period is equal 2^N. For example, for 32-bit (4 bytes) periodical data you can use lp=2. Often it's better to set lc0, if you change lp switch. -pb{N}: set number of pos bits - [0, 4], default: 2 pb switch is intended for periodical data when period is equal 2^N. -mf{MF_ID}: set Match Finder. Default: bt4. Algorithms from hc* group doesn't provide good compression ratio, but they often works pretty fast in combination with fast mode (-a0). Memory requirements depend from dictionary size (parameter "d" in table below). MF_ID Memory Description bt2 d * 9.5 + 4MB Binary Tree with 2 bytes hashing. bt3 d * 11.5 + 4MB Binary Tree with 3 bytes hashing. bt4 d * 11.5 + 4MB Binary Tree with 4 bytes hashing. hc4 d * 7.5 + 4MB Hash Chain with 4 bytes hashing. -eos: write End Of Stream marker. By default LZMA doesn't write eos marker, since LZMA decoder knows uncompressed size stored in .lzma file header. -si: Read data from stdin (it will write End Of Stream marker). -so: Write data to stdout Examples: 1) LZMA e file.bin file.lzma -d16 -lc0 compresses file.bin to file.lzma with 64 KB dictionary (2^16=64K) and 0 literal context bits. -lc0 allows to reduce memory requirements for decompression. 2) LZMA e file.bin file.lzma -lc0 -lp2 compresses file.bin to file.lzma with settings suitable for 32-bit periodical data (for example, ARM or MIPS code). 3) LZMA d file.lzma file.bin decompresses file.lzma to file.bin. Compression ratio hints ----------------------- Recommendations --------------- To increase compression ratio for LZMA compressing it's desirable to have aligned data (if it's possible) and also it's desirable to locate data in such order, where code is grouped in one place and data is grouped in other place (it's better than such mixing: code, data, code, data, ...). Using Filters ------------- You can increase compression ratio for some data types, using special filters before compressing. For example, it's possible to increase compression ratio on 5-10% for code for those CPU ISAs: x86, IA-64, ARM, ARM-Thumb, PowerPC, SPARC. You can find C/C++ source code of such filters in folder "7zip/Compress/Branch" You can check compression ratio gain of these filters with such 7-Zip commands (example for ARM code): No filter: 7z a a1.7z a.bin -m0=lzma With filter for little-endian ARM code: 7z a a2.7z a.bin -m0=bc_arm -m1=lzma With filter for big-endian ARM code (using additional Swap4 filter): 7z a a3.7z a.bin -m0=swap4 -m1=bc_arm -m2=lzma It works in such manner: Compressing = Filter_encoding + LZMA_encoding Decompressing = LZMA_decoding + Filter_decoding Compressing and decompressing speed of such filters is very high, so it will not increase decompressing time too much. Moreover, it reduces decompression time for LZMA_decoding, since compression ratio with filtering is higher. These filters convert CALL (calling procedure) instructions from relative offsets to absolute addresses, so such data becomes more compressible. Source code of these CALL filters is pretty simple (about 20 lines of C++), so you can convert it from C++ version yourself. For some ISAs (for example, for MIPS) it's impossible to get gain from such filter. LZMA compressed file format --------------------------- Offset Size Description 0 1 Special LZMA properties for compressed data 1 4 Dictionary size (little endian) 5 8 Uncompressed size (little endian). -1 means unknown size 13 Compressed data ANSI-C LZMA Decoder ~~~~~~~~~~~~~~~~~~~ To compile ANSI-C LZMA Decoder you can use one of the following files sets: 1) LzmaDecode.h + LzmaDecode.c + LzmaTest.c (fastest version) 2) LzmaDecode.h + LzmaDecodeSize.c + LzmaTest.c (old size-optimized version) 3) LzmaStateDecode.h + LzmaStateDecode.c + LzmaStateTest.c (zlib-like interface) Memory requirements for LZMA decoding ------------------------------------- LZMA decoder doesn't allocate memory itself, so you must allocate memory and send it to LZMA. Stack usage of LZMA decoding function for local variables is not larger than 200 bytes. How To decompress data ---------------------- LZMA Decoder (ANSI-C version) now supports 5 interfaces: 1) Single-call Decompressing 2) Single-call Decompressing with input stream callback 3) Multi-call Decompressing with output buffer 4) Multi-call Decompressing with input callback and output buffer 5) Multi-call State Decompressing (zlib-like interface) Variant-5 is similar to Variant-4, but Variant-5 doesn't use callback functions. Decompressing steps ------------------- 1) read LZMA properties (5 bytes): unsigned char properties[LZMA_PROPERTIES_SIZE]; 2) read uncompressed size (8 bytes, little-endian) 3) Decode properties: CLzmaDecoderState state; /* it's 24-140 bytes structure, if int is 32-bit */ if (LzmaDecodeProperties(&state.Properties, properties, LZMA_PROPERTIES_SIZE) != LZMA_RESULT_OK) return PrintError(rs, "Incorrect stream properties"); 4) Allocate memory block for internal Structures: state.Probs = (CProb *)malloc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb)); if (state.Probs == 0) return PrintError(rs, kCantAllocateMessage); LZMA decoder uses array of CProb variables as internal structure. By default, CProb is unsigned_short. But you can define _LZMA_PROB32 to make it unsigned_int. It can increase speed on some 32-bit CPUs, but memory usage will be doubled in that case. 5) Main Decompressing You must use one of the following interfaces: 5.1 Single-call Decompressing ----------------------------- When to use: RAM->RAM decompressing Compile files: LzmaDecode.h, LzmaDecode.c Compile defines: no defines Memory Requirements: - Input buffer: compressed size - Output buffer: uncompressed size - LZMA Internal Structures (~16 KB for default settings) Interface: int res = LzmaDecode(&state, inStream, compressedSize, &inProcessed, outStream, outSize, &outProcessed); 5.2 Single-call Decompressing with input stream callback -------------------------------------------------------- When to use: File->RAM or Flash->RAM decompressing. Compile files: LzmaDecode.h, LzmaDecode.c Compile defines: _LZMA_IN_CB Memory Requirements: - Buffer for input stream: any size (for example, 16 KB) - Output buffer: uncompressed size - LZMA Internal Structures (~16 KB for default settings) Interface: typedef struct _CBuffer { ILzmaInCallback InCallback; FILE *File; unsigned char Buffer[kInBufferSize]; } CBuffer; int LzmaReadCompressed(void *object, const unsigned char **buffer, SizeT *size) { CBuffer *bo = (CBuffer *)object; *buffer = bo->Buffer; *size = MyReadFile(bo->File, bo->Buffer, kInBufferSize); return LZMA_RESULT_OK; } CBuffer g_InBuffer; g_InBuffer.File = inFile; g_InBuffer.InCallback.Read = LzmaReadCompressed; int res = LzmaDecode(&state, &g_InBuffer.InCallback, outStream, outSize, &outProcessed); 5.3 Multi-call decompressing with output buffer ----------------------------------------------- When to use: RAM->File decompressing Compile files: LzmaDecode.h, LzmaDecode.c Compile defines: _LZMA_OUT_READ Memory Requirements: - Input buffer: compressed size - Buffer for output stream: any size (for example, 16 KB) - LZMA Internal Structures (~16 KB for default settings) - LZMA dictionary (dictionary size is encoded in stream properties) Interface: state.Dictionary = (unsigned char *)malloc(state.Properties.DictionarySize); LzmaDecoderInit(&state); do { LzmaDecode(&state, inBuffer, inAvail, &inProcessed, g_OutBuffer, outAvail, &outProcessed); inAvail -= inProcessed; inBuffer += inProcessed; } while you need more bytes see LzmaTest.c for more details. 5.4 Multi-call decompressing with input callback and output buffer ------------------------------------------------------------------ When to use: File->File decompressing Compile files: LzmaDecode.h, LzmaDecode.c Compile defines: _LZMA_IN_CB, _LZMA_OUT_READ Memory Requirements: - Buffer for input stream: any size (for example, 16 KB) - Buffer for output stream: any size (for example, 16 KB) - LZMA Internal Structures (~16 KB for default settings) - LZMA dictionary (dictionary size is encoded in stream properties) Interface: state.Dictionary = (unsigned char *)malloc(state.Properties.DictionarySize); LzmaDecoderInit(&state); do { LzmaDecode(&state, &bo.InCallback, g_OutBuffer, outAvail, &outProcessed); } while you need more bytes see LzmaTest.c for more details: 5.5 Multi-call State Decompressing (zlib-like interface) ------------------------------------------------------------------ When to use: file->file decompressing Compile files: LzmaStateDecode.h, LzmaStateDecode.c Compile defines: Memory Requirements: - Buffer for input stream: any size (for example, 16 KB) - Buffer for output stream: any size (for example, 16 KB) - LZMA Internal Structures (~16 KB for default settings) - LZMA dictionary (dictionary size is encoded in stream properties) Interface: state.Dictionary = (unsigned char *)malloc(state.Properties.DictionarySize); LzmaDecoderInit(&state); do { res = LzmaDecode(&state, inBuffer, inAvail, &inProcessed, g_OutBuffer, outAvail, &outProcessed, finishDecoding); inAvail -= inProcessed; inBuffer += inProcessed; } while you need more bytes see LzmaStateTest.c for more details: 6) Free all allocated blocks Note ---- LzmaDecodeSize.c is size-optimized version of LzmaDecode.c. But compiled code of LzmaDecodeSize.c can be larger than compiled code of LzmaDecode.c. So it's better to use LzmaDecode.c in most cases. EXIT codes ----------- LZMA decoder can return one of the following codes: #define LZMA_RESULT_OK 0 #define LZMA_RESULT_DATA_ERROR 1 If you use callback function for input data and you return some error code, LZMA Decoder also returns that code. LZMA Defines ------------ _LZMA_IN_CB - Use callback for input data _LZMA_OUT_READ - Use read function for output data _LZMA_LOC_OPT - Enable local speed optimizations inside code. _LZMA_LOC_OPT is only for LzmaDecodeSize.c (size-optimized version). _LZMA_LOC_OPT doesn't affect LzmaDecode.c (speed-optimized version) and LzmaStateDecode.c _LZMA_PROB32 - It can increase speed on some 32-bit CPUs, but memory usage will be doubled in that case _LZMA_UINT32_IS_ULONG - Define it if int is 16-bit on your compiler and long is 32-bit. _LZMA_SYSTEM_SIZE_T - Define it if you want to use system's size_t. You can use it to enable 64-bit sizes supporting C++ LZMA Encoder/Decoder ~~~~~~~~~~~~~~~~~~~~~~~~ C++ LZMA code use COM-like interfaces. So if you want to use it, you can study basics of COM/OLE. By default, LZMA Encoder contains all Match Finders. But for compressing it's enough to have just one of them. So for reducing size of compressing code you can define: #define COMPRESS_MF_BT #define COMPRESS_MF_BT4 and it will use only bt4 match finder. --- http://www.7-zip.org http://www.7-zip.org/support.html doublecmd-0.5.8/units-doc-unix.txt0000644000175000017500000000042212014201074016122 0ustar alexxalexxsrc/ufilelist.pas src/udcutils.pas src/platform/uOSUtils.pas src/platform/uosforms.pas src/uvfs.pas src/uexts.pas src/ufileprocs.pas src/udescr.pas src/platform/win/umywindows.pas src/platform/unix/umyunix.pas src/platform/unix/inotify.pp src/uvfsutil.pas src/uwcxmodule.pasdoublecmd-0.5.8/doublecmd.sh0000755000175000017500000000023711740433676015020 0ustar alexxalexx#!/bin/sh # Use this script for execute portable version of Double Commander cd "`dirname "$0"`" export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd) ./doublecmddoublecmd-0.5.8/doublecmd.app/0000755000175000017500000000000012257501472015230 5ustar alexxalexxdoublecmd-0.5.8/doublecmd.app/Contents/0000755000175000017500000000000012257501472017025 5ustar alexxalexxdoublecmd-0.5.8/doublecmd.app/Contents/PkgInfo0000644000175000017500000000001111324120113020254 0ustar alexxalexxAPPL???? doublecmd-0.5.8/doublecmd.app/Contents/Resources/0000755000175000017500000000000012257501472020777 5ustar alexxalexxdoublecmd-0.5.8/doublecmd.app/Contents/Resources/doublecmd.icns0000644000175000017500000003141311324120113023574 0ustar alexxalexxicns3 ih32"ѻ ˭ڜϲʾԲ޲EߴÀ"˻ Ȼ ʽ߂׿׃؂؃ׁ҂҂҂΁ƾтŃ´ςǁȿ΂ɂĩ΂ʂʩς ̀˴΂ ǃĦς ӄ ̴Յ тͶ҄ ҃ŨĽφ׃˺Ո؄Ӏ԰ӆӅԀѰ҉؉ҰӇ׆Ӱԅ؃Ար)԰zϯ6գ¿w֨~}||zyxwvvtllkjjlp҂Ѓυ݀Ѷslhhghhgffeeccbba`__^]]\[ZZYWUTSSRSS[w~}|zxwvusrqomlkga`_]\_iyjdn}}|zywvttrpomljjhgedcoa`_^\[YVS^`hg~~}zywvttsqonmkkihfdca`_^\[WTQMTAѱ~~}zywvttsqonmkkihfdca`_\VWh|Բ߀,ƥ|}~}zywvttsqonmkkihfdca_Zf޲"֧~|}zywvttsqonmkkihfdc_d̋{zywvttsqonmkkihfdbyyywvttsqonmkkihfdywvttsqonmkkihf vvttsqonmkkigߴ´݇t'sqonmkkg~=wttsqonmkjnœcPNLVꛒptsqonmkfܢdRVWVS[ꛒ yssqonmjrܕZXZXWVS[ꛒ ޜpsqonmf⣀[YXWVS[ꛒ؂ prqonlie\\[YXWVS[ꛒ|ށ {qqonkxڒZ^\[YXWVS[ꛒ؁ ͌pqoniЂi^^\[YXWVS[ꛒ{Ɂ ͙oqpniς[`^\[YXWVS[ꛒzЁ˛klhe\́ϢOWXXYYXWVS[ꛒ{ əRTPL@̀ʘ3;;<>AEIMOYꛒ~wȁō?B?<1ŁǕ!)(()*+-14Dꛒxpc z5963)}Ă+ꛒxne]^Ɂ οj031.&d+ꛒyog`ZǸ ζR01/-'G΀i ꛒ~tkc\WPR̂ 721/,*'΂! Ꚍ{qib[VQF́ Ȃ-31.,*ˁz ꘁpha\WQG~Ё оO231.,*%AЁe  xic\WNNт Β2531.,*(!q pa[SQs҂ F4531.,*(%5ȃ΢F ĦӃn46531.,*('!d؃ε\CDԄՎ686531.,*('% ك ԰Ӈ֣8:86531.,*('%#؆ԀѰ҉ӕ><:86531.,*('%# ֈҰӆ}=><:86531.,*('%#!kنӰԃ!ȤX>@><:86531.,*('%#!8؂ԱȷjCACA><:86531.,*('%#!I԰ҨvZFDEDCA><:86531.,*('%#! (Mi|_pWRLKJJIFDCA><:86531.,*('%#o! {djUROLIGEBA?=;86431/-*(&%#! doWnlca^[YXVTQONKIHGDB@?<;97531/.,*(&'+(%\ όVCFEEDBBA@??>=<<;:99887655442,+*-3RăԀųyoijikjihgffeeddcaa`beo~{|mfeeij ihhgffeeccb,a`__^\ZUTSRRVbrow{{lfhgfeeddcbaa``__]\\[ZYXXWVUTSSRPMXd{cmacdefeedcaa``__^]]\[\[ZYYWVWVUTTSPMKGNPӪqa`deedcaa``__^]]\[\[ZYYWVWVURMObxԲнk`ddcaa``__^]]\[\[ZYYWVWUP]޲"әebcaa``__^]]\[\[ZYYWVTZxaba``__^]]\[\[ZYYWUq`a``__^]]\[\[ZYYW莀`__^]]\[\[ZYY _`__^]]\[\[ZXEߴãv^`_^]]\[\[XsӾkdbbv=b__^]]\[\Z_Ð^JHHRpjihf`uZ_^]]\[\V۞]KPQQOWpjihhgbg f^^]]\[ZeۏQPSRRQOWpjihhgfcg ݑY^]]\\URRSSRRQOWpjihhgffbsւ Z^]]\[YTSSRRQOWpjihhgfef`ށ j\]]\YmڌOTSRRQOWpjihhgfefcvׁ ~Z]]\Wς_TTSRRQOWpjihhgfefeaƁ ̍Y]]\VցPVTTSSRRQOWpjihhgfefe`ЁʑVYVRÍϞDLNPQRQOWpjihhgfefe` ɏ9=96*̀ɓ%.0259=CHKVpjihhgfeec[ȁŃ$)&$ŁǏ #&*/?pjiihgeaZQA kq́'pjihf`WLD;>ǁ νX V΁  pjgaWLB;5(l̀ β:5΀b pe[OD=60).́ Ξ΂ iUJA93.)}ˁ u zʁt ZG?81-'fЁ ѻ6 /Ё^ O>71,!#sс · j D3,$&V҂ ҿ* !ƃ͟? ŪierӃ[ X؃ʹX?AԄՁ ڃ ԰Ӈ֙ ؆ԀѰ҈҈ ֈҰӆh cنӰԂ"×8 ,؂ԱĮL ?԰ѝuX5 FdxMC)$!! b ,İ{M;&%"   'vwQOC9644310/.-,,**)('&%%#""! #)6q؛gRQPPONNMLLKJIHGDCCDKg̀ʉȂۀh8mk  'EWbfffffffffffffffffffffffffffffffe_Q1 ]VjP;)TE#####"s u o p p p p p p p p p p p p p p pl i[#####%Ĥ GM #$ E> ?޶v7 2;GSH;99999999999999999999:@Saddc]K9)   il32 Çï¿ ߁ɸ=ẽ¿ހڀ¿ցŀցɴӁ¿ˀ̀ί̀Ƥށˀϴсрѳт Ɵт ՁӅ ՅȄلȁ؀ulstusrqppnnmmkkjjijbbaacŊt:utsqonmkjigfdbaZXWV^v}}|ywttqnmjigdba_\[WSbyU}|zwttqomkigeca_\ZUQOFҿ}~|zwttqomkigec`[r~|zwttqomkigechփywttqomkig` vttqomkigwttqomkhӷttqomkpbQO[<{tqomjfYXWTaqqomi{\[XWTa܀uqol~Y\[XWTaqoko^\[XWTaӀpkc\Z[[ZWTàxPJ?8569=DH\~r̀;`;7.&  #9~qdZN3/)uN&th]UVɀ92/*;Ӏ qe[TIҏ01.+&g uf\SPр@41.+'~Ӏa maZtς641.+(!ρ Ӭ% ׁ ն:641.+($?ԁµӄ ׿@:641.+(% bȄ֩@=:641.+(%";փȀ޺s@@=:641.+(%"wž]BEC@=:641.+(%" KkZTOKIEC@=:641.+(%" 0cf]XTQNKHEB@=9631.+'%"5EBCA?>>=<;;::898768215rԍύ|hhjlkjiihgffeddb\[Z[esggfedcba`_^]\[[YXWVWUSSQNegcdeffddbb`__]][\ZXXVWUSROKIU͵lbdbb`__]][\ZXXVVQkdbb`__]][\ZXXV^ma`__]][\ZXS p`__]][\ZXҵb__]][\YvҶjee__]][\bO]KJYmiigah^]][[^QRRO^miigfc[]][ZsSSRRO^miigffgۀa]]ZsNSSRRO^miigffe1,+*(&$#"!EbXYXVVUTSRQSQPSl8mk*7@@@@@@@@@@@@@@@@@@@@@;,Bt8 WXXY<nsssssssssssu"KXXXN":Sʇ+    is32 ջĵí3ÿʥƿžƿαЀ;ƿƿ϶ľ|{{zyyxxwwvzxsplf`\l̽z{vtokfbY}vtokfy{toiؤroqN_ooiZWkۆlֻ^]Ylm:ˢ),2XzbA,o4rX\а--Eӝ-X4-"bhc84-'"ƺR>94-'"N¤kSKF?94.(# Orpmkhfdm|rmqfjhfdca_\VUjίv_ba_\[XVOwg`_][Xog_]Zvטfh]]czH`mheY\_RQkmhf~vYָTUSkmido\!t"+XmW>m'a3K,7Ъ 2Ӛ+j? ]hIξ/D·O&#  Y~nmlkjigsz{s8mk$*********** Rnޫ/66664Z֫ {QXOOOOOOOWg`>doublecmd-0.5.8/doublecmd.app/Contents/Info.plist0000644000175000017500000000275411324120113020764 0ustar alexxalexx CFBundleDevelopmentRegion English CFBundleExecutable doublecmd CFBundleIconFile doublecmd CFBundleLocalizations en de es bg cs hu nl ru ua CFBundleName Double Commander CFBundleIdentifier com.company.doublecmd CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleSignature doub CFBundleShortVersionString 0.1 CFBundleVersion 1 CSResourcesFileMapped CFBundleDocumentTypes CFBundleTypeRole Viewer CFBundleTypeExtensions * CFBundleTypeOSTypes fold disk **** doublecmd-0.5.8/doublecmd.app/Contents/MacOS/0000755000175000017500000000000012257501472017767 5ustar alexxalexxdoublecmd-0.5.8/doublecmd.app/Contents/MacOS/doublecmd0000777000175000017500000000000012257501472024367 2../../../doublecmdustar alexxalexxdoublecmd-0.5.8/doc/0000755000175000017500000000000012257501472013260 5ustar alexxalexxdoublecmd-0.5.8/doc/INSTALL.RUS.txt0000644000175000017500000000327512014201074015570 0ustar alexxalexxКомпиляция Double commander Для компиляции вам понадобится компилятор FreePascal 2.4.0 (www.freepascal.org) и среда разработки Lazarus 0.9.30 (lazarus.freepascal.org) Компиляцию можно осуществить 2 способами: 1) Из среды разработки Lazarus. В первую очередь необходимо установить компоненты из подкаталога components, для этого откройте Lazarus и выберите пункт меню "Компоненты -> Открыть файл пакета *.lpk ...", далее выберите файл components\KASToolBar\kascomp.lpk и в появившемся окне нажмите кнопку "Установить". Повторите тоже самое для файла пакета components\viewer\viewerpackage.lpk, components\CmdLine\cmdbox.lpk, components\gifanim\pkg_gifanim.lpk и components\ZVDateTimeCtrls\zvdatetimectrls.lpk. После этого выберите пункт меню "Проект -> Открыть проект" и выберите файл doublecmd.lpi, далее выполните пункт меню "Запуск -> Собрать все" 2) С помощью командного файла build.bat/build.sh. Откройте данный файл в текстовом редакторе и пропишите в переменную lazpath, путь к каталогу Lazarus. Далее откройте командную строку, перейдите в каталог с исходниками DC и дайте команду: Windows: build.bat all Linux: ./build.sh all doublecmd-0.5.8/doc/COPYING.LGPL.txt0000644000175000017500000006144712137141242015672 0ustar alexxalexx GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! doublecmd-0.5.8/doc/COPYING.modifiedLGPL.txt0000644000175000017500000000235312014201074017354 0ustar alexxalexxThis is the file COPYING.modifiedLGPL, it applies to several units in the Lazarus sources distributed by members of the Lazarus Development Team. All files contains headers showing the appropriate license. See there if this modification can be applied. These files are distributed under the Library GNU General Public License (see the file COPYING.LGPL) with the following modification: As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. If you didn't receive a copy of the file COPYING.LGPL, contact: Free Software Foundation, Inc., 675 Mass Ave Cambridge, MA 02139 USA doublecmd-0.5.8/doc/README.RUS.txt0000644000175000017500000000156412014201074015416 0ustar alexxalexx Double Commander ******************************************************************************** Double Commander - это кросс платформенный open source файл менеджер, с двумя панелями. Целью данного проекта является создание файл менеджера аналогичного по функциональности Total Commander и совместимого с его плагинами. ******************************************************************************** Double Commander распространяется под лицензией GNU GPL 2 см. файл COPYING ******************************************************************************** Информация о порядке компиляции из исходников содержится в файле INSTALL.RUS doublecmd-0.5.8/doc/README.txt0000644000175000017500000000347112014201074014745 0ustar alexxalexx Double Commander ******************************************************************************** ** This program is free software; you can redistribute it and/or modify ** ** it under the terms of the GNU General Public License as published by ** ** the Free Software Foundation; either version 2 of the License, or ** ** (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, ** ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, write to the Free Software ** ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** ******************************************************************************** ** ** ** For more details about license see the file COPYING. ** ** ** ******************************************************************************** Double Commander is a cross platform open source file manager with two panels side by side. It is inspired by Total Commander and features some new ideas. ******************************************************************************** For details of compiling see the file INSTALL. doublecmd-0.5.8/doc/changelog.txt0000644000175000017500000002435112014201074015737 0ustar alexxalexx-------------------------------------------------------------------------------- 08.10.2011 Release Double Commander 0.5.1 beta -------------------------------------------------------------------------------- 08.10.2011 FIX: Access violation when open archive with symbolic links 05.10.2011 FIX: Bug [3417849] Typo in options section: thubnails->thumbnails. 01.10.2011 FIX: Bug [3402974] Problems with SAMBA resources with authorization 30.09.2011 FIX: Bug [3416235] Incorrect default path to Lua library 30.09.2011 FIX: Bug [3411184] Can not extract empty folder from archive 30.09.2011 FIX: Bug [3415942] Editor->Search&Replace field order is bad... 28.09.2011 FIX: List index out of bounds on deleting separator from toolbar (bug [3415074]). 27.09.2011 FIX: Copying full paths of filenames from search result. 22.09.2011 UPD: Czech language file from Martin Štrobl. 10.09.2011 UPD: Russian language file 09.09.2011 FIX: [Zip plugin] Slow opening of big archives; speed up test operation. 09.09.2011 FIX: Force date, time separators to /, : in case they are UTF-8 characters in current locale (Unix). 08.09.2011 FIX: Try to fix access violation when accessing empty DVD drive (bug [3404533]) 07.09.2011 UPD: Traditional Chinese language file by mlance_2 07.09.2011 FIX: Build libmime with large file support (bug [3403818]). 06.09.2011 FIX: Multi rename files with not ASCII names and using range 04.09.2011 FIX: Move files when can not copy attributes (e.g. move files from NTFS to EXT3 file system under Linux) 03.09.2011 FIX: Delete HotDir with item index = 0 02.09.2011 FIX: Access violation error with some wcx and wfx plugins -------------------------------------------------------------------------------- 28.08.2011 Release Double Commander 0.5.0 beta -------------------------------------------------------------------------------- 21.08.2010 Release Double Commander 0.4.5.2 beta -------------------------------------------------------------------------------- 15.08.2010 FIX: Use case insensitive compare for verify checksum operation 20.04.2010 FIX: Bug [2989234] Does not work with icloud 10.04.2010 ADD: Korean language file by Lee, Cheon-Pung 02.03.2010 UPD: Use Escape key to leave editing command line and focus files panel when command line is empty [2961106]. 01.03.2010 UPD: Ukrainian language file by Ma$terok 01.03.2010 UPD: Polish language file by Krzysztof Modelski 01.03.2010 FIX: Sorting files by size if size > 4GB (bug [2960850]). 25.02.2010 FIX: Bug [2957145] Directory hotlist hotkey issue 25.02.2010 FIX: Bug [2957145] Directory hotlist hotkey issue 25.02.2010 FIX: Bug [2957159] File type color dialog color selection 24.02.2010 ADD: Polish language file by Krzysztof Modelski 24.02.2010 FIX: Get content plugin name 24.02.2010 FIX: ContentGetDetectString function 23.02.2010 FIX: Cross compiling unrar plugin from Linux 32 to 64 -------------------------------------------------------------------------------- 22.02.2010 Release Double Commander 0.4.5.1 beta -------------------------------------------------------------------------------- 22.02.2010 UPD: Better error message when error in CopyFile. 22.02.2010 FIX: Crash in CopyFile when cannot read file. 21.02.2010 FIX: Bug [2955066] Split file 19.02.2010 FIX: Unneeded separator in Actions submenu if no actions were added. 19.02.2010 FIX: Some fixes for bug [2954358] error with write permissions 17.02.2010 UPD: Ukrainian language file by Ma$terok 17.02.2010 UPD: English help files by Rod J 14.02.2010 ADD: File search in multiply directories 13.02.2010 FIX: Hangs on load string from incorrect language file 13.02.2010 UPD: Czech language from Petr Stasiak 12.02.2010 FIX: Bug [2947859] "terminal window size+Apply in preferences". 11.02.2010 FIX: "Open with" under Windows 11.02.2010 UPD: Language files. 11.02.2010 FIX: Changed '=' TargetEqualSource to '>' RightEqualLeft and '<' LeftEqualRight (bug [2947845]). 10.02.2010 FIX: Bug [2947846] '..' item always becomes current if going up inside an archive 10.02.2010 FIX: Crash in drag&drop on Windows Vista/7. 07.02.2010 FIX: Create directory on empty disk 02.02.2010 FIX: Bug [2944649] Copy files 02.02.2010 FIX: Check if application is active instead of checking main form's focus if FileWatcher should not work when application is in the background. This fixes the issue where refreshing file list is not working even when DC is active. 29.01.2010 FIX: Don't execute hotkeys that coincide with quick search combination 27.01.2010 FIX: Drive panel alignment 27.01.2010 FIX: Encoding in Zip archives 27.01.2010 FIX: Rar stores file name in OEM encoding (from RAR documentation) 26.01.2010 FIX: Find files in hidden directories 26.01.2010 FIX: Find hidden folders 25.01.2010 FIX: Don't copy last LineEnding when copy file names to clipboard 24.01.2010 FIX: Bug [2938523] Console 23.01.2010 FIX: Case insensitive file search for non ACSII file names 23.01.2010 FIX: Debian package: Section name 23.01.2010 FIX: Debian package: add "Maintainer" and "Depends" fields 22.01.2010 FIX: Debian package architecture for Linux 64 bit 21.01.2010 FIX: Add Wfx plugins from options dialog 20.01.2010 FIX: Stretch bitmaps from file associations manager 19.01.2010 UPD: File properties dialog interface alignment 19.01.2010 UPD: Options dialog interface alignment 19.01.2010 FIX: Unpack multivolume archives 16.01.2010 FIX: Show only actions names in "Actions submenu" 16.01.2010 FIX: Incorrect save/load search/replace history 16.01.2010 UPD: Use new icon in About window. 15.01.2010 FIX: Case insensitive quick search for non ASCII symbols 15.01.2010 FIX: Viewer/editor window getting bigger every time it is opened (bug [2924166]). 15.01.2010 FIX: Error when can not read/write file description 15.01.2010 FIX: Delete to trash with file paths containing spaces. Fix reading error from gvfs-trash. 13.01.2010 FIX: Skip all files in move operation 13.01.2010 FIX: Bug [2930960] doublecmd.sh -------------------------------------------------------------------------------- 10.01.2009 Release Double Commander 0.4.5 beta -------------------------------------------------------------------------------- 17.05.2009 ADD: Feature Request [2777123] Show occupied space 14.03.2009 FIX: Bug [ 2650798 ] WCX plugins not work property... -------------------------------------------------------------------------------- 28.02.2009 Release Double Commander 0.4 beta -------------------------------------------------------------------------------- 31.01.2009 FIX: Bug [ 2513089 ] panel 18.01.2009 ADD: Drag&Drop to external applications under Windows 18.01.2009 FIX: Bug [ 2513084 ] tabs 12.01.2009 ADD: Pause/Start file operations 11.01.2009 FIX: Bug [ 2496645 ] sort files 05.01.2009 FIX: Bug [ 2403796 ] removing tabs 25.12.2008 FIX: Bug [ 2434007 ] translate mistakes 23.12.2008 FIX: Bug [ 2433957 ] hidden column 13.12.2008 FIX: Bug [ 2421650 ] colors submenu 13.12.2008 FIX: Bug [ 2423750 ] scrollbar in about window 12.12.2008 FIX: Bug [ 2421607 ] different fonts 12.12.2008 FIX: Bug [ 2421601 ] border 09.12.2008 FIX: Bug [ 2403863 ] rubbish after copying 07.12.2008 ADD: Feature Request [ 2404017 ] context menu for Drive button menu 05.12.2008 FIX: Bug [ 2383944 ] drive buttons 03.12.2008 FIX: Bug [ 2379193 ] font at first line 16.11.2008 FIX: Bug [ 1696012 ] Copying in Linux 26.10.2008 FIX: Bug [ 1989488 ] Don't change interface language 15.10.2008 FIX: Bug [ 1741043 ] Copying 13.10.2008 FIX: Bug [ 1874281 ] "No enough free space" instead "Permition denied" 07.09.2009 FIX: Bug [ 1971187 ] Don't work with user rights 07.09.2008 FIX: Bug [ 1934572 ] Zip plugin is down on open read only archive 21.08.2008 ADD: Feature Request [ 1938593 ] More suitable and powerful plugin configuration 18.08.2008 ADD: Feature Request [ 1870517 ] Don't show not critical error messages 09.07.2008 ADD: Feature Request [ 2014247 ] Drive context menu 06.07.2008 ADD: Feature Request [ 1996336 ] Drag&Drop support 06.07.2008 FIX: Bug [ 1947579 ] Quick search by letter and non-alpha characters 03.07.2008 FIX: Bug [ 1945378 ] Crash on changing icon size 17.05.2008 ADD: Feature Request [ 1951507 ] Wipe file 02.05.2008 ADD: Feature Request [ 1880894 ] Open in tab directory under cursor (Ctrl+Up) 28.04.2008 FIX: Bug [ 1953396 ] Error if "Directory hotlist" (Ctrl+D) is empty -------------------------------------------------------------------------------- 15.04.2008 Release Double Commander 0.3.5 alpha -------------------------------------------------------------------------------- 12.04.2008 FIX: Bug [ 1938948 ] Drive chooser shortcuts missing 08.04.2008 FIX: Bug [ 1870771 ] Remove plugin. 04.04.2008 FIX: Bug [ 1934290 ] It is impossible reassign icons for some types. 23.03.2008 FIX: Bug [ 1870551 ] F3 on directory. 23.03.2008 FIX: Bug [ 1921004 ] Error with display drive name on drive menu button. 12.03.2008 FIX: Bug [ 1888653 ] file panel and copy/move 06.03.2008 FIX: Bug [ 1860836 ] "Show" does not refresh 05.03.2008 FIX: Bug [ 1860660 ] Non-translatable strings 28.02.2008 FIX: The filedate of the copied file is <> to original file date (Windows) unlike TotalCmd. 17.02.2008 FIX: Bug [ 1880539 ] Context menu for directory. 04.02.2008 FIX: Bug [ 1886005 ] Быстрый поиск - завешивает. 03.02.2008 FIX: Bug [ 1869787 ] Options -> Colors -> File types and attributes 03.02.2008 ADD: Feature Request [1880515] Enhanced quick search 03.02.2008 FIX: Bug [ 1870552 ] Alt quick search 30.01.2008 FIX: Bug [ 1870808 ] Execute files under Linux 27.01.2008 ADD: Options page "Configuration storage" 26.01.2008 ADD: UnRAR plugin (now it working under Windows and Linux) 26.01.2008 ADD: Feature Request [ 1869250 ] Try to open archive by Ctrl+PageDown 18.01.2008 FIX: Bug [ 1869790 ] Options -> File types colors - illogical 17.01.2007 FIX: Bug [ 1869784 ] Directories and diff 17.01.2007 FIX: Bug [ 1870772 ] lynx navigation, "right" for "up level" 13.01.2007 FIX: Bug [ 1869757 ] External editor 13.01.2007 FIX: Bug [ 1869786 ] External diff - DC not send file. 11.01.2008 FIX: Bug [ 1869243 ] lynx navigation and enter in arhives. 11.01.2008 FIX: Bug [ 1860652 ] "Run Term" Opens terminal in last accessed directory, not in current panel's directory 11.01.2008 FIX: Bug [ 1861911 ] must add version.inc 10.01.2008 FIX: Bug [ 1860271 ] lynx navigation and archives -------------------------------------------------------------------------------- 26.12.2007 Release Double Commander 0.3 alpha doublecmd-0.5.8/doc/INSTALL.txt0000644000175000017500000000306012014201074015110 0ustar alexxalexxCompiling Double Commander 1) What you need? At first must download FreePascal. I use FPC 2.4.0 (or higher). After this download Lazarus. I use Lazarus 0.9.30 (or higher). 2) Using the IDE to develop and build DC. If you want to use Lazarus IDE to develop Double Commander, first you have to install a few additional components all of which reside in components directory of DC sources. You must open each .lpk package file (cmdbox.lpk, kascomp.lpk, viewerpackage.lpk, pkg_gifanim.lpk, zvdatetimectrls.lpk) and install it into Lazarus. Choose "No" when asked for rebuilding Lazarus after each package, and only rebuild when you have installed all of them. After rebuilding Lazarus open the project file doublecmd.lpi (in directory src). Compile. 3) Building DC from command line. There are two scripts that you can use to build DC from command line: build.bat for Windows and build.sh for Linux. First you need to edit the chosen script file and correct the path to your Lazarus installation (variable lazpath). To build DC without using the IDE you need a working lazbuild and lazres utilities (both are a part of Lazarus). Lazbuild should be in Lazarus directory set by and lazres should be in /tools. On Linux you may choose the target widgetset (GTK2 or QT4) by setting $LCL environment variable before executing the script to either gtk2 or qt, for example: # LCL=qt ./build.sh Execute the script to start the build process. Make sure you use all parameter if you're building for the first time, so that also components and plugins are built. doublecmd-0.5.8/doc/COPYING.txt0000644000175000017500000004325412137141242015131 0ustar alexxalexx GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. doublecmd-0.5.8/doublecmd.ext.example0000644000175000017500000001456511606362170016635 0ustar alexxalexx# Double Commander extension file # Based on Midnight Commander 3.0 extension file # # All lines starting with # or empty lines are thrown away. # All actions for file is showed in "Actions" submenu of file context popup menu # # File format: # # [extension1|extension2|...|extensionX] # Name=Category name # Icon=Path to icon # action1=command1 # action2=command2 # actionX=commandX # # Where: # # [extension] or [extension1|extension2 ...] - list of extensions (case insensitive !!no regular expression!!) # Also you can use "default" keyword as extension. In this case, if command had not found for sought file type, # then will be used command from this section. # # Name - Name of this category (showed in file association manager) # # Icon - Path to icon that displays for this file types in file panel # # Action can be: # Open - used with tap on Enter or DblClick # View - used with tap on F3 # Edit - used with tap on F4 # other actions only is showed in "Actions" submenu of file context popup menu # # Command is any one-line shell command, with the simple macro substitution. # # Macros should be (case sensitive): # {!VFS} - for archives - use virtual file system # {!EDITOR} - call editor (internal or external by configuration} # {!VIEWER} - call viewer (the same) # {!SHELL} - use shell from configuration to execute program (see mplayer) # - execute 'command' in system shell and save stdout output to file and transfer it as parameter to previous command (see rpm for example...) # %f - filename # %d - directory # %p - path(directory+filename) # Default commands [default] Open=xdg-open %p ### Sources ### # C [c] Open={!EDITOR} %p Compile={!SHELL} cc -O -c %f #Link={!SHELL} cc -O -o %d/`basename %f .c` %f # Fortran [f] Open={!EDITOR} %p Compile={!SHELL} f77 -O -c %f Compile and Link={!SHELL} f77 -O %f # Pascal and Object Pascal :) [dpr|pas|pp] Open={!EDITOR} %p #Compile={!SHELL} fpc %p # Asm [s] Open={!EDITOR} %p Assemble={!SHELL} cc -O -c %f #Link={!SHELL} cc -O -o %d/`basename %f .s` %f # C++ [C|c|cc] Open={!EDITOR} %p Compile={!SHELL} c++ -O -c %f #Link={!SHELL} c++ -O -o %d/`basename %f .c` %f ### Documentation ### # GNU Info page [info] Open={!SHELL} info -f %f # Manual page [man] Open={!SHELL} nroff -Tlatin2 -mandoc %f | less View={!SHELL} nroff -Tlatin2 -mandoc %f ### Sound files ### [wav|WAV|Wav|snd|SND|Snd|voc|VOC|Voc|au|AU|Au] Open={!SHELL} play %f [mod|s3m|xm] Open=xmms %f #Open=mikmod %f #Open=tracker %f [mp3] Open=xmms %p View=mpg123 -tn1 %f 2>&1|grep -E '^(Title|Album|Comment|MPEG|$)' ### Multimedia ### [mpg|mpeg|avi|asf|mov] Open=totem %p #Open=xanim %f #Open=aviplay %f #Open=mtv %f 2>/dev/null& #Open=gtv %f 2>/dev/null& #Open=plaympeg %f 2>/dev/null& #Open=mpeg_play %f & #Open(big)=mpeg_play -dither 2x2 %f & #Open(gray)=mpeg_play -dither gray %f & [rm|ram] Open={!SHELL} mplayer %f #Open=realplay %f& ### Documents ### # Postscript [ps] Open=gv %f View=ps2ascii %f View with GhostView=gv %f # PDF [pdf] Open=xpdf %f #Open=acroread %f #Open=ghostview %f View=pdftotext %f # html [html|htm|mht] Open=opera %p #Open=mozilla %p View=lynx -dump -force_html %p #txt [txt] Open={!EDITOR} %p # StarOffice and OpenOffice [sdw] Open=soffice %f # Open Document Format [odt|ods|odp] Name=Open Document Format View={!VIEWER} # AbiWord [abw] Open=abiword %f # Microsoft Word Document [doc|dot|wri] Open=soffice %f #Open=koffice %f View={!SHELL} catdoc -w %f || word2x -f text %f - || strings %f # Microsoft Excel Worksheet [xls|xlw] Open=soffice %f #Open=koffice %f View=xls2csv %f || strings %f # DVI [dvi] Open=xdvi %f & View=dvi2tty %f Convert file to Postscript=dvips %f # TeX [tex] Open={!EDITOR} %p TeX this file={!SHELL} tex %f LaTeX this file={!SHELL} latex %f csTeX this file={!SHELL} csplain %f csLaTeX this file={!SHELL} cslatex %f ### Miscellaneous ### # dbf [dbf] #Open={!VIEWER} View=dbview -b %f # BitTorrent [torrent] View={!VIEWER} ### Archives ### [tar] Open={!VFS} View={!VIEWER} Extract={!SHELL} tar xf %f [tgz] Open={!VFS} View={!VIEWER} /dev/null | tar tvvf -?> Extract={!SHELL} gzip -dc %f 2>/dev/null | tar xzf - [bz] Open={!VFS} View={!VIEWER} /dev/null?> Extract={!SHELL} bzip -dc %f 2>/dev/null [bz2] Open={!VFS} View={!VIEWER} /dev/null?> Extract={!SHELL} bzip2 -dc %f 2>/dev/null # zip [zip|jar] Open={!VFS} View={!VIEWER} Extract={!SHELL} unzip %f #Extract (with flags)=I=%{Enter any Unzip flags:}; if test -n "$I"; then unzip $I %f; fi Unzip={!SHELL} unzip %f '*' # zoo [zoo] Open={!VFS} View={!VIEWER} Extract={!SHELL} zoo x %f '*' # lha [lha] Open={!VFS} View={!VIEWER} Extract={!SHELL} lharc x %f '*' #Extract (with flags)=I=%{Enter any LHarc flags:}; if test -n "$I"; then lharc x $I %f; fi # arj [arj] Open={!VFS} View={!VIEWER} Extract={!SHELL} unarj x %f '*' #Extract (with flags)=I=%{Enter any Unarj flags:}; if test -n "$I"; then unarj x $I %f; fi # ha [ha] Open={!VFS} View={!VIEWER} Extract={!SHELL} ha xy %f '*' # Extract (with flags)=I=%{Enter any HA flags:}; if test -n "$I"; then ha xy $I %f; fi # rar [rar|r00|r02|r02|r03|r04|r05|r06|r07|r08|r09] Open={!VFS} View={!VIEWER} Extract={!SHELL} rar x -c- %f '*' # Extract (with flags)=I=%{Enter any RAR flags:}; if test -n "$I";then rar x $I %f; fi #compress [Z] Open={!VFS} View={!SHELL} compress -dc %f Extract={!SHELL} compress -dc %f # cpio [cpio] Open={!VFS} View={!SHELL} cat %f | cpio -ictv Extract={!SHELL} cat %f | cpio -ic # gzip [gz] Open={!VFS} View={!VIEWER} /dev/null?> Uncompress={!SHELL} gunzip %f # bzip2 [bz2|bzip2] Open={!VFS} View={!VIEWER} /dev/null?> Uncompress={!SHELL} bunzip2 %f # bzip [bz|bzip] Open={!VFS} View={!VIEWER} /dev/null?> Uncompress={!SHELL} bunzip %f # ace [ace] Open={!VFS} Uncompress={!SHELL} unace e %p # Source RPMs (SuSE uses *.spm, others use *.src.rpm) [spm|srcm] Open={!VFS} View={!VIEWER} Install this RPM={!SHELL} rpm -i %f Rebuild this RPM={!SHELL} rpm --rebuild %f Check signature={!SHELL} rpm --checksig %f # Compiled RPMs [rpm] Open={!VFS} View={!VIEWER} Install this RPM={!SHELL} rpm -i %p Upgrade this RPM={!SHELL} rpm -U %p Check signature={!SHELL} rpm --checksig %f # deb [deb] Open={!VFS} View={!VIEWER} doublecmd-0.5.8/sdk/0000755000175000017500000000000012257501472013274 5ustar alexxalexxdoublecmd-0.5.8/sdk/extension.pas0000644000175000017500000001446011740433676016030 0ustar alexxalexxunit Extension; interface const // dialog messages DM_FIRST = 0; DM_CLOSE = DM_FIRST+1; // A signal that the dialog is about to close DM_ENABLE = DM_FIRST+2; DM_GETDLGDATA = DM_FIRST+3; DM_GETDLGBOUNDS = DM_FIRST+4; DM_GETITEMBOUNDS = DM_FIRST+5; DM_GETTEXT = DM_FIRST+6; // Retrieve the text of an edit string or the caption of an item DM_KEYDOWN = DM_FIRST+7; DM_KEYUP = DM_FIRST+8; DM_SETDLGDATA = DM_FIRST+9; DM_SETFOCUS = DM_FIRST+10; // Set the keyboard focus to the given dialog item DM_REDRAW = DM_FIRST+11; // Redraw the whole dialog DM_SETTEXT = DM_FIRST+12; // Set a new string value for an edit line or a new caption for an item DM_SETMAXTEXTLENGTH = DM_FIRST+13; // Set the maximum length of an edit string DM_SHOWDIALOG = DM_FIRST+14; // Show/hide the dialog window DM_SHOWITEM = DM_FIRST+15; // Show/hide a dialog item DM_GETCHECK = DM_FIRST+16; // Retrieve the state of TCheckBox or TRadioButton items DM_SETCHECK = DM_FIRST+17; // Change the state of TCheckBox and TRadioButton items DM_LISTGETITEM = DM_FIRST+18; // Retrieve a list item DM_LISTGETITEMINDEX = DM_FIRST+19; // Get current item index in a list DM_LISTSETITEMINDEX = DM_FIRST+20; // Set current item index in a list DM_LISTDELETE = DM_FIRST+21; DM_LISTADD = DM_FIRST+22; DM_LISTADDSTR = DM_FIRST+23; DM_LISTUPDATE = DM_FIRST+24; DM_LISTINSERT = DM_FIRST+25; DM_LISTINDEXOF = DM_FIRST+26; DM_LISTGETCOUNT = DM_FIRST+27; DM_LISTGETDATA = DM_FIRST+28; DM_LISTSETDATA = DM_FIRST+29; DM_SETDLGBOUNDS = DM_FIRST+30; DM_SETITEMBOUNDS = DM_FIRST+31; DM_GETDROPPEDDOWN = DM_FIRST+32; DM_SETDROPPEDDOWN = DM_FIRST+33; DM_GETITEMDATA = DM_FIRST+34; DM_SETITEMDATA = DM_FIRST+35; DM_LISTSET = DM_FIRST+36; // events messages DN_FIRST = $1000; DN_CLICK = DN_FIRST+1; // Sent after mouse click DN_DBLCLICK = DN_FIRST+2; // Sent after mouse double click DN_CHANGE = DN_FIRST+3; // Sent after the dialog item is changed DN_GOTFOCUS = DN_FIRST+4; // Sent when the dialog item gets input focus DN_INITDIALOG = DN_FIRST+5; // Sent before showing the dialog DN_KILLFOCUS = DN_FIRST+6; // Sent before a dialog item loses the input focus DN_KEYDOWN = DM_KEYDOWN; DN_KEYUP = DM_KEYUP; DN_CLOSE = DM_CLOSE; // Sent before the dialog is closed DM_USER = $4000; // Starting value for user defined messages const // MessageBox: To indicate the buttons displayed in the message box, // specify one of the following values. MB_OK = $00000000; MB_OKCANCEL = $00000001; MB_ABORTRETRYIGNORE = $00000002; MB_YESNOCANCEL = $00000003; MB_YESNO = $00000004; MB_RETRYCANCEL = $00000005; MB_ICONHAND = $00000010; MB_ICONQUESTION = $00000020; MB_ICONEXCLAMATION = $00000030; MB_ICONASTERICK = $00000040; MB_ICONWARNING = MB_ICONEXCLAMATION; MB_ICONERROR = MB_ICONHAND; MB_ICONSTOP = MB_ICONHAND; MB_ICONINFORMATION = MB_ICONASTERICK; // MessageBox: To indicate the default button, specify one of the following values. MB_DEFBUTTON1 = $00000000; MB_DEFBUTTON2 = $00000100; MB_DEFBUTTON3 = $00000200; MB_DEFBUTTON4 = $00000300; // MessageBox: Return values ID_OK = 1; ID_CANCEL = 2; ID_ABORT = 3; ID_RETRY = 4; ID_IGNORE = 5; ID_YES = 6; ID_NO = 7; ID_CLOSE = 8; ID_HELP = 9; const EXT_MAX_PATH = 16384; // 16 Kb { For compatibility with Delphi use $IFDEF's to set calling convention } type { Dialog window callback function } TDlgProc = function(pDlg: PtrUInt; DlgItemName: PAnsiChar; Msg, wParam, lParam: PtrInt): PtrInt; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; { Definition of callback functions called by the DLL } TInputBoxProc = function(Caption, Prompt: PAnsiChar; MaskInput: LongBool; Value: PAnsiChar; ValueMaxLen: Integer): LongBool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; TMessageBoxProc = function(Text, Caption: PAnsiChar; Flags: Longint): Integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; TDialogBoxLFMProc = function(LFMData: Pointer; DataSize: LongWord; DlgProc: TDlgProc): LongBool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; TDialogBoxLRSProc = function(LRSData: Pointer; DataSize: LongWord; DlgProc: TDlgProc): LongBool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; TDialogBoxLFMFileProc = function(lfmFileName: PAnsiChar; DlgProc: TDlgProc): LongBool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; type PExtensionStartupInfo = ^TExtensionStartupInfo; TExtensionStartupInfo = packed record // The size of the structure, in bytes StructSize: LongWord; // Directory where plugin is located (UTF-8 encoded) PluginDir: packed array [0..Pred(EXT_MAX_PATH)] of AnsiChar; // Directory where plugin configuration file must be located (UTF-8 encoded) PluginConfDir: packed array [0..Pred(EXT_MAX_PATH)] of AnsiChar; // Dialog API InputBox: TInputBoxProc; MessageBox: TMessageBoxProc; DialogBoxLFM: TDialogBoxLFMProc; DialogBoxLRS: TDialogBoxLRSProc; DialogBoxLFMFile: TDialogBoxLFMFileProc; SendDlgMsg: TDlgProc; // Reserved for future API extension Reserved: packed array [0..Pred(4096 * SizeOf(Pointer))] of Byte; end; type TExtensionInitializeProc = procedure(StartupInfo: PExtensionStartupInfo); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; TExtensionFinalizeProc = procedure(Reserved: Pointer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; implementation (* Plugin must implement this function for working with Extension API procedure ExtensionInitialize(StartupInfo: PExtensionStartupInfo); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure ExtensionFinalize(Reserved: Pointer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; *) end. doublecmd-0.5.8/sdk/wlxplugin.pas0000644000175000017500000000700212117073164016026 0ustar alexxalexx// Lister API definitions. // This unit is written by Christian Ghisler, it's from Total Commander // Lister API Guide, which can be found at http://ghisler.com. // Version: 2.0. unit WlxPlugin; interface const lc_copy=1; lc_newparams=2; lc_selectall=3; lc_setpercent=4; lcp_wraptext=1; lcp_fittowindow=2; lcp_ansi=4; lcp_ascii=8; lcp_variable=12; lcp_forceshow=16; lcp_fitlargeronly=32; lcp_center=64; lcs_findfirst=1; lcs_matchcase=2; lcs_wholewords=4; lcs_backwards=8; itm_percent=$FFFE; itm_fontstyle=$FFFD; itm_wrap=$FFFC; itm_fit=$FFFB; itm_next=$FFFA; itm_center=$FFF9; LISTPLUGIN_OK=0; LISTPLUGIN_ERROR=1; const MAX_PATH=32000; type { Unsigned integer with pointer size } THandle = {$IFDEF CPU64}QWord{$ELSE}LongWord{$ENDIF}; const wlxInvalidHandle: THandle = THandle(0); type tListDefaultParamStruct=record size, PluginInterfaceVersionLow, PluginInterfaceVersionHi:longint; DefaultIniName:array[0..MAX_PATH-1] of char; end; pListDefaultParamStruct=^tListDefaultParamStruct; type tdateformat=record wYear,wMonth,wDay:word; end; pdateformat=^tdateformat; type ttimeformat=record wHour,wMinute,wSecond:word; end; ptimeformat=^ttimeformat; type HBITMAP = type THandle; { Function prototypes: Functions need to be defined exactly like this!} (* function ListLoad(ParentWin:thandle;FileToLoad:pchar;ShowFlags:integer):thandle; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ListLoadW(ParentWin:thandle;FileToLoad:pwidechar;ShowFlags:integer):thandle; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ListLoadNext(ParentWin,PluginWin:thandle;FileToLoad:pchar;ShowFlags:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ListLoadNextW(ParentWin,PluginWin:thandle;FileToLoad:pwidechar;ShowFlags:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure ListCloseWindow(ListWin:thandle); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure ListGetDetectString(DetectString:pchar;maxlen:integer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ListSearchText(ListWin:thandle;SearchString:pchar; SearchParameter:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ListSearchTextW(ListWin:thandle;SearchString:pwidechar; SearchParameter:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ListSearchDialog(ListWin:thandle;FindNext:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ListSendCommand(ListWin:thandle;Command,Parameter:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ListPrint(ListWin:thandle;FileToPrint,DefPrinter:pchar; PrintFlags:integer;var Margins:trect):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ListPrintW(ListWin:thandle;FileToPrint,DefPrinter:pwidechar; PrintFlags:integer;var Margins:trect):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ListNotificationReceived(ListWin:thandle;Message,wParam,lParam:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure ListSetDefaultParams(dps:pListDefaultParamStruct); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ListGetPreviewBitmap(FileToLoad:pchar;width,height:integer; contentbuf:pchar;contentbuflen:integer):hbitmap; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ListGetPreviewBitmapW(FileToLoad:pwidechar;width,height:integer; contentbuf:pchar;contentbuflen:integer):hbitmap; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; *) implementation end. doublecmd-0.5.8/sdk/common.h0000644000175000017500000000240111740433676014740 0ustar alexxalexx#ifdef __GNUC__ #if defined(__WIN32__) || defined(_WIN32) || defined(_WIN64) #define DCPCALL __attribute__((stdcall)) #else #define DCPCALL __attribute__((cdecl)) #endif #define MAX_PATH 260 typedef unsigned long DWORD; typedef unsigned short WORD; typedef void *HANDLE; typedef HANDLE HICON; typedef HANDLE HBITMAP; typedef HANDLE HWND; typedef int BOOL; typedef char CHAR; typedef wchar_t WCHAR; typedef struct _FILETIME { DWORD dwLowDateTime; DWORD dwHighDateTime; } FILETIME,*PFILETIME,*LPFILETIME; typedef struct _WIN32_FIND_DATAA { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; CHAR cFileName[MAX_PATH]; CHAR cAlternateFileName[14]; } WIN32_FIND_DATAA,*LPWIN32_FIND_DATAA; typedef struct _WIN32_FIND_DATAW { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; WCHAR cFileName[MAX_PATH]; WCHAR cAlternateFileName[14]; } WIN32_FIND_DATAW,*LPWIN32_FIND_DATAW; #else #if defined(_WIN32) || defined(_WIN64) #define DCPCALL __stdcall #else #define DCPCALL __cdecl #endif #endifdoublecmd-0.5.8/sdk/help/0000755000175000017500000000000012257501472014224 5ustar alexxalexxdoublecmd-0.5.8/sdk/help/pasdoc.css0000644000175000017500000001210311375744471016214 0ustar alexxalexxbody { font-family: Verdana,Arial; color: black; background-color: white; font-size: 12px; } body.navigationframe { font-family: Verdana,Arial; color: white; background-color: #787878; font-size: 12px; } img { border:0px; } a:link {color:#C91E0C; text-decoration: none; } a:visited {color:#7E5C31; text-decoration: none; } a:hover {text-decoration: underline; } a:active {text-decoration: underline; } a.navigation:link { color: white; text-decoration: none; font-size: 12px;} a.navigation:visited { color: white; text-decoration: none; font-size: 12px;} a.navigation:hover { color: white; font-weight: bold; text-decoration: none; font-size: 12px; } a.navigation:active { color: white; text-decoration: none; font-size: 12px;} a.bold:link {color:#C91E0C; text-decoration: none; font-weight:bold; } a.bold:visited {color:#7E5C31; text-decoration: none; font-weight:bold; } a.bold:hover {text-decoration: underline; font-weight:bold; } a.bold:active {text-decoration: underline; font-weight:bold; } a.section {color: green; text-decoration: none; font-weight: bold; } a.section:hover {color: green; text-decoration: underline; font-weight: bold; } ul.useslist a:link {color:#C91E0C; text-decoration: none; font-weight:bold; } ul.useslist a:visited {color:#7E5C31; text-decoration: none; font-weight:bold; } ul.useslist a:hover {text-decoration: underline; font-weight:bold; } ul.useslist a:active {text-decoration: underline; font-weight:bold; } ul.hierarchy { list-style-type:none; } ul.hierarchylevel { list-style-type:none; } p.unitlink a:link {color:#C91E0C; text-decoration: none; font-weight:bold; } p.unitlink a:visited {color:#7E5C31; text-decoration: none; font-weight:bold; } p.unitlink a:hover {text-decoration: underline; font-weight:bold; } p.unitlink a:active {text-decoration: underline; font-weight:bold; } tr.list { background: #FFBF44; } tr.list2 { background: #FFC982; } tr.listheader { background: #C91E0C; color: white; } table.wide_list { border-spacing:2px; width:100%; } table.wide_list td { vertical-align:top; padding:4px; } table.markerlegend { width:auto; } table.markerlegend td.legendmarker { text-align:center; } table.sections { background:white; } table.sections td {background:lightgray; } table.summary td.itemcode { width:100%; } table.detail td.itemcode { width:100%; } td.itemname {white-space:nowrap; } td.itemunit {white-space:nowrap; } td.itemdesc { width:100%; } div.nodescription { color:red; } dl.parameters dt { color:blue; } /* Various browsers have various default styles for
, sometimes ugly for our purposes, so it's best to set things like font-size and font-weight in out pasdoc.css explicitly. */ h6.description_section { /* font-size 100% means that it has the same font size as the parent element, i.e. normal description text */ font-size: 100%; font-weight: bold; /* By default browsers usually have some large margin-bottom and margin-top for tags. In our case, margin-bottom is unnecessary, we want to visually show that description_section is closely related to content below. In this situation (where the font size is just as a normal text), smaller bottom margin seems to look good. */ margin-bottom: 0em; } /* Style applied to Pascal code in documentation (e.g. produced by @longcode tag) } */ span.pascal_string { color: #000080; } span.pascal_keyword { font-weight: bolder; } span.pascal_comment { color: #000080; font-style: italic; } span.pascal_compiler_comment { color: #008000; } span.pascal_numeric { } span.pascal_hex { } p.hint_directive { color: red; } input#search_text { } input#search_submit_button { } acronym.mispelling { background-color: #ffa; } /* Actually this reduces vertical space between *every* paragraph inside list with @itemSpacing(compact). While we would like to reduce this space only for the top of 1st and bottom of last paragraph within each list item. But, well, user probably will not do any paragraph breaks within a list with @itemSpacing(compact) anyway, so it's acceptable solution. */ ul.compact_spacing p { margin-top: 0em; margin-bottom: 0em; } ol.compact_spacing p { margin-top: 0em; margin-bottom: 0em; } dl.compact_spacing p { margin-top: 0em; margin-bottom: 0em; } /* Style for table created by @table tags: just some thin border. This way we have some borders around the cells (so cells are visibly separated), but the border "blends with the background" so it doesn't look too ugly. Hopefully it looks satisfactory in most cases and for most people. We add padding for cells, otherwise they look too close. This is normal thing to do when border-collapse is set to collapse (because this eliminates spacing between cells). */ table.table_tag { border-collapse: collapse; } table.table_tag td { border: 1pt solid gray; padding: 0.3em; } table.table_tag th { border: 1pt solid gray; padding: 0.3em; } table.detail { border: 1pt solid gray; margin-top: 0.3em; margin-bottom: 0.3em; } doublecmd-0.5.8/sdk/help/dfxplugin.html0000644000175000017500000007503311451563402017116 0ustar alexxalexx Writing file system plugins for Double Commander

Writing file system plugins for Double Commander

Description Structures Functions and Procedures Types Constants

Description

This help file is about writing file system plugins for Double Commander.

Functions and Procedures

HANDLE __stdcall VfsOpen(char* Path);
void __stdcall VfsClose(HANDLE hInstance);
BOOL __stdcall VfsFindFirst(HANDLE hInstance, char* Path, VFS_FIND_DATA* FindData);
BOOL __stdcall VfsFindNext(HANDLE hInstance, VFS_FIND_DATA* FindData);
void __stdcall VfsFindClose(HANDLE hInstance, VFS_FIND_DATA* FindData);
int __stdcall VfsMoveFile(HANDLE hInstance, char* OldName, char* NewName, int CopyFlags);
int __stdcall VfsDeleteFile(HANDLE hInstance, char* RemotePath);
int __stdcall VfsGetFile(HANDLE hInstance, char* RemoteName, char* LocalName, int CopyFlags);
int __stdcall VfsPutFile(HANDLE hInstance, char* LocalName, char* RemoteName, int CopyFlags);
int __stdcall VfsExecuteFile(HANDLE hInstance, HWND MainWin, char* RemoteName, char* Verb);
int __stdcall VfsCreateFolder(HANDLE hInstance, char* RemotePath);
int __stdcall VfsRemoveFolder(HANDLE hInstance, char* RemotePath);
void __stdcall VfsNetworkGetSupportedProtocols(char* Protocols, int MaxLen);
int __stdcall VfsNetworkGetConnection(HANDLE hInstance, int Index, char* Connection, int MaxLen);
int __stdcall VfsNetworkManageConnection(HANDLE hInstance, HWND MainWin, char* Connection, int Action, int MaxLen);
int __stdcall VfsNetworkOpenConnection(HANDLE hInstance, char* Connection, char* RootDir, char* RemotePath, int MaxLen);
int __stdcall VfsNetworkCloseConnection(HANDLE hInstance, char* Connection);

Constants

VFS_NM_ACTION_ADD     = 0;
VFS_NM_ACTION_EDIT    = 1;
VFS_NM_ACTION_DELETE  = 2;
VFS_RET_OK    = 0;
VFS_RET_FAILED  = 1;
VFS_RET_ABORTED  = 2;
VFS_RET_NOT_SUPPORTED    = 3;
VFS_RET_FILE_NOT_FOUND  = 4;
VFS_RET_FILE_EXISTS  = 5;
VFS_RET_READ_ERROR    = 6;
VFS_RET_WRITE_ERROR  = 7;
VFS_EXEC_OK    = 0;
VFS_EXEC_ERROR  = 1;
VFS_EXEC_YOURSELF    = 2;
VFS_EXEC_SYMLINK  = 3;

Description

Functions and Procedures

HANDLE __stdcall VfsOpen(char* Path);

Initialize and open plugin file system.

Parameters
Path
Path that must be opened by plugin
Returns

The function returns plugin instance handle if successful, NULL otherwise

void __stdcall VfsClose(HANDLE hInstance);

Finalize and close plugin file system.

Parameters
Handle
Plugin file system instance handle that have been returned by FsOpen
BOOL __stdcall VfsMoveFile(HANDLE hInstance, char* OldName, char* NewName, int CopyFlags);

VfsMoveFile is called to transfer (copy or move) a file within the plugin's file system.

Parameters
hInstance
Plugin file system instance handle
OldName
Name of the remote source file, with full path
NewName
Name of the remote destination file, with full path
CopyFlags
Can be a combination of the VFS_COPYFLAGS_XXX flags
Returns

The function returns True if successful, False otherwise

BOOL __stdcall VfsGetFile(HANDLE hInstance, char* RemoteName,char* LocalName,int CopyFlags);

VfsGetFile is called to transfer a file from the plugin's file system to the normal file system.

Parameters
hInstance
Plugin file system instance handle
RemoteName
Name of the file to be retrieved, with full path
LocalName
Local file name with full path
CopyFlags
Can be a combination of the VFS_COPYFLAGS_XXX flags
Returns

The function returns True if successful, False otherwise

BOOL __stdcall VfsPutFile(HANDLE hInstance, char* LocalName, char* RemoteName, int CopyFlags);

VfsPutFile is called to transfer a file from the normal file system to the plugin's file system.

Parameters
hInstance
Plugin file system instance handle
LocalName
Local file name with full path
RemoteName
Name of the remote file, with full path
CopyFlags
Can be a combination of the VFS_COPYFLAGS_XXX flags
Returns

The function returns True if successful, False otherwise

BOOL __stdcall VfsDeleteFile(HANDLE hInstance, char* RemotePath);

VfsDeleteFile is called to delete a file from the plugin's file system.

Parameters
hInstance
Plugin file system instance handle
RemotePath
Name of the file to be deleted, with full path
Returns

The function returns True if successful, False otherwise

int __stdcall VfsExecuteFile(HANDLE hInstance, HWND MainWin, char* RemoteName, char* Verb);

VfsExecuteFile is called to execute a file on the plugin's file system, or show its property sheet.

Parameters
hInstance
Plugin file system instance handle
MainWin
Parent window which can be used for showing a property sheet
RemoteName
Name of the file to be executed, with full path
Verb
Plugin file system instance handle that have been returned by VfsOpen
Returns

The function returns True if successful, False otherwise

int __stdcall VfsCreateFolder(HANDLE hInstance, char* RemoteName);

VfsCreateFolder is called to create a directory on the plugin's file system.

Parameters
hInstance
Plugin file system instance handle
RemoteName
Name of the directory to be created, with full path
Returns

The function returns True if successful, False otherwise

int __stdcall VfsRemoveFolder(HANDLE hInstance, char* RemoteName);

VfsRemoveFolder is called to remove a directory from the plugin's file system.

Parameters
hInstance
Plugin file system instance handle
RemoteName
Name of the directory to be removed, with full path
Returns

The function returns True if successful, False otherwise

void __stdcall VfsNetworkGetSupportedProtocols(char* Protocols, int MaxLen);

VfsNetworkGetSupportedProtocols is called to retrieve protocols that supported by plugin.

Parameters
Protocols
Pointer to a buffer (allocated by the calling program) which can receive the semicolon separated protocol list, e.g. "http://;ftp://"
MaxLen
Maximum number of characters (including the final 0) which fit in the buffer.
BOOL __stdcall VfsNetworkGetConnection(int Index, char* Connection, int MaxLen);

VfsNetworkGetConnection is called to enumerate all connections that plugin has. Index is increased by 1 starting from 0 until the plugin returns False.

Parameters
Index
The index of the connection for which DC requests information. Starting with 0, the Index is increased until the plugin returns False.
Connection
Here the plugin has to return the name of the connection with index Index. You may return a maximum of maxlen characters, including the trailing 0.
MaxLen
The maximum number of characters, including the trailing 0, which may be returned in each of the connections.
Returns

The function returns True if successful, False otherwise

BOOL __stdcall VfsNetworkManageConnection(HWND MainWin, char* Connection, int Action, int MaxLen);

VfsNetworkManageConnection is called from "Connection manager" dialog when user wants to add/edit/delete connection.

Parameters
MainWin
Parent window which can be used for showing a connection configuration dialog.
Connection
In: Connection name for edit/delete action
Out: Connection name of new connection for add action
Action
Action type: FS_NM_ACTION_ADD or FS_NM_ACTION_EDIT or FS_NM_ACTION_DELETE
MaxLen
Maximum number of characters that you can return in Connection, including the final 0.
Returns

The function returns True if successful, False otherwise

BOOL __stdcall VfsNetworkOpenConnection(char* Connection, char* RootDir, char* RemotePath, int MaxLen);

VfsNetworkOpenConnection is called when the user wants to open a connection to the network.

Parameters
Connection
In: Connection name
Out: Server address, e.g. "ftp://ftp.chg.ru"
RootDir
Here the plugin has to return the root directory of the opening connection, e.g. "/"
RemotePath
Here the plugin has to return the remote path of the opening connection, e.g. "/pub/Linux"
MaxLen
Maximum number of characters that you can return in Connection, RootDir and RemotePath, including the final 0.
Returns

The function returns True if successful, False otherwise

BOOL __stdcall VfsNetworkCloseConnection(char* Connection);

VfsNetworkOpenConnection is called when the user wants to close a connection to the network.

Parameters
Connection
Connection name
Returns

The function returns True if successful, False otherwise

Constants

VFS_NM_ACTION_ADD     = 0;

Add connection action.

VFS_NM_ACTION_EDIT    = 1;

Edit connection action.

VFS_NM_ACTION_DELETE  = 2;

Delete connection action.

VFS_RET_OK  = 0;

Delete connection action.

VFS_NM_ACTION_DELETE  = 2;

Delete connection action.

VFS_NM_ACTION_DELETE  = 2;

Delete connection action.

VFS_NM_ACTION_DELETE  = 2;

Delete connection action.

VFS_NM_ACTION_DELETE  = 2;

Delete connection action.

VFS_NM_ACTION_DELETE  = 2;

Delete connection action.

VFS_NM_ACTION_DELETE  = 2;

Delete connection action.

VFS_NM_ACTION_DELETE  = 2;

Delete connection action.

VFS_NM_ACTION_DELETE  = 2;

Delete connection action.

VFS_NM_ACTION_DELETE  = 2;

Delete connection action.

VFS_NM_ACTION_DELETE  = 2;

Delete connection action.

VFS_NM_ACTION_DELETE  = 2;

Delete connection action.


Double Commander DFX plugin API doublecmd-0.5.8/sdk/wdxplugin.pas0000644000175000017500000001014511740433676016031 0ustar alexxalexxunit WdxPlugin; { Content plugins } interface uses SysUtils; const ft_nomorefields=0; ft_numeric_32=1; ft_numeric_64=2; ft_numeric_floating=3; ft_date=4; ft_time=5; ft_boolean=6; ft_multiplechoice=7; ft_string=8; ft_fulltext=9; ft_datetime=10; ft_stringw=11; // for ContentGetValue ft_nosuchfield=-1; ft_fileerror=-2; ft_fieldempty=-3; ft_ondemand=-4; ft_notsupported=-5; ft_setcancel=-6; ft_delayed=0; // for ContentSetValue ft_setsuccess=0; // setting of the attribute succeeded // for ContentGetSupportedFieldFlags contflags_edit=1; contflags_substsize=2; contflags_substdatetime=4; contflags_substdate=6; contflags_substtime=8; contflags_substattributes=10; contflags_substattributestr=12; contflags_passthrough_size_float=14; contflags_substmask=14; contflags_fieldedit=16; // for ContentSendStateInformation contst_readnewdir=1; contst_refreshpressed=2; contst_showhint=4; setflags_first_attribute=1; // First attribute of this file setflags_last_attribute=2; // Last attribute of this file setflags_only_date=4; // Only set the date of the datetime value! CONTENT_DELAYIFSLOW=1; // ContentGetValue called in foreground CONTENT_PASSTHROUGH=2; // If requested via contflags_passthrough_size_float: The size // is passed in as floating value, TC expects correct value // from the given units value, and optionally a text string type tContentDefaultParamStruct=record size, PluginInterfaceVersionLow, PluginInterfaceVersionHi:longint; DefaultIniName:array[0..MAX_PATH-1] of char; end; pContentDefaultParamStruct=^tContentDefaultParamStruct; type tdateformat=record wYear,wMonth,wDay:word; end; pdateformat=^tdateformat; type ttimeformat=record wHour,wMinute,wSecond:word; end; ptimeformat=^ttimeformat; { Function prototypes: } (* procedure ContentGetDetectString(DetectString:pchar;maxlen:integer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ContentGetSupportedField(FieldIndex:integer;FieldName:pchar; Units:pchar;maxlen:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ContentGetValue(FileName:pchar;FieldIndex,UnitIndex:integer; FieldValue:pbyte; maxlen,flags:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ContentGetValueW(FileName:pwidechar;FieldIndex,UnitIndex:integer; FieldValue:pbyte; maxlen,flags:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure ContentSetDefaultParams(dps:pContentDefaultParamStruct); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure ContentPluginUnloading; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure ContentStopGetValue(FileName:pchar); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure ContentStopGetValueW(FileName:pwidechar); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ContentGetDefaultSortOrder(FieldIndex:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ContentGetSupportedFieldFlags(FieldIndex:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ContentSetValue(FileName:pchar;FieldIndex,UnitIndex,FieldType:integer; FieldValue:pbyte;flags:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ContentSetValueW(FileName:pwidechar;FieldIndex,UnitIndex,FieldType:integer; FieldValue:pbyte;flags:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure ContentSendStateInformation(state:integer;path:pchar); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure ContentSendStateInformationW(state:integer;path:pwidechar); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function ContentEditValue(handle:thandle;FieldIndex,UnitIndex,FieldType:integer; FieldValue:pchar;maxlen:integer;flags:integer;langidentifier:pchar):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; *) implementation end. doublecmd-0.5.8/sdk/wcxplugin.pas0000644000175000017500000001522112065543106016017 0ustar alexxalexx{ Contents of file wcxhead.pas } { It contains definitions of error codes, flags and callbacks } { Ver. 2.20 with Unicode support } unit WcxPlugin; interface const {Error codes returned to calling application} E_SUCCESS= 0; {Success} E_END_ARCHIVE= 10; {No more files in archive} E_NO_MEMORY= 11; {Not enough memory} E_BAD_DATA= 12; {Data is bad} E_BAD_ARCHIVE= 13; {CRC error in archive data} E_UNKNOWN_FORMAT= 14; {Archive format unknown} E_EOPEN= 15; {Cannot open existing file} E_ECREATE= 16; {Cannot create file} E_ECLOSE= 17; {Error closing file} E_EREAD= 18; {Error reading from file} E_EWRITE= 19; {Error writing to file} E_SMALL_BUF= 20; {Buffer too small} E_EABORTED= 21; {Function aborted by user} E_NO_FILES= 22; {No files found} E_TOO_MANY_FILES= 23; {Too many files to pack} E_NOT_SUPPORTED= 24; {Function not supported} {Unpacking flags} PK_OM_LIST= 0; PK_OM_EXTRACT= 1; {Flags for ProcessFile} PK_SKIP= 0; {Skip file (no unpacking)} PK_TEST= 1; {Test file integrity} PK_EXTRACT= 2; {Extract file to disk} {Flags passed through ChangeVolProc} PK_VOL_ASK= 0; {Ask user for location of next volume} PK_VOL_NOTIFY= 1; {Notify app that next volume will be unpacked} {Packing flags} {For PackFiles} PK_PACK_MOVE_FILES= 1; {Delete original after packing} PK_PACK_SAVE_PATHS= 2; {Save path names of files} PK_PACK_ENCRYPT= 4; {Ask user for password, then encrypt} {Returned by GetPackCaps} PK_CAPS_NEW= 1; {Can create new archives} PK_CAPS_MODIFY= 2; {Can modify exisiting archives} PK_CAPS_MULTIPLE= 4; {Archive can contain multiple files} PK_CAPS_DELETE= 8; {Can delete files} PK_CAPS_OPTIONS= 16; {Supports the options dialogbox} PK_CAPS_MEMPACK= 32; {Supports packing in memory} PK_CAPS_BY_CONTENT= 64; {Detect archive type by content} PK_CAPS_SEARCHTEXT= 128; {Allow searching for text in archives} { created with this plugin} PK_CAPS_HIDE= 256; { Show as normal files (hide packer icon) } { open with Ctrl+PgDn, not Enter } PK_CAPS_ENCRYPT= 512; { Plugin supports PK_PACK_ENCRYPT option } BACKGROUND_UNPACK=1; { Which operations are thread-safe? } BACKGROUND_PACK=2; BACKGROUND_MEMPACK=4; { For tar.pluginext in background } {Flags for packing in memory} MEM_OPTIONS_WANTHEADERS=1; {Return archive headers with packed data} {Errors returned by PackToMem} MEMPACK_OK= 0; {Function call finished OK, but there is more data} MEMPACK_DONE= 1; {Function call finished OK, there is no more data} {Flags for PkCryptProc callback} PK_CRYPT_SAVE_PASSWORD=1; PK_CRYPT_LOAD_PASSWORD=2; PK_CRYPT_LOAD_PASSWORD_NO_UI=3; { Load password only if master password has already been entered!} PK_CRYPT_COPY_PASSWORD=4; { Copy encrypted password to new archive name} PK_CRYPT_MOVE_PASSWORD=5; { Move password when renaming an archive} PK_CRYPT_DELETE_PASSWORD=6; { Delete password} PK_CRYPTOPT_MASTERPASS_SET = 1; // The user already has a master password defined type { Unsigned integer with pointer size } TArcHandle = {$IFDEF CPU64}QWord{$ELSE}LongWord{$ENDIF}; {$IFNDEF LCL} HWND = type PtrUInt; // Defined as in LCL {$ENDIF} const wcxInvalidHandle = TArcHandle(-1); { For compatibility with Delphi use $IFDEF's to set calling convention } type {Definition of callback functions called by the DLL} {Ask to swap disk for multi-volume archive} PChangeVolProc=^TChangeVolProc; TChangeVolProc=function(ArcName:pchar;Mode:longint):longint; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; PChangeVolProcW=^TChangeVolProcW; TChangeVolProcW=function(ArcName:pwidechar;Mode:longint):longint; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; {Notify that data is processed - used for progress dialog} PProcessDataProc=^TProcessDataProc; TProcessDataProc=function(FileName:pchar;Size:longint):longint; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; PProcessDataProcW=^TProcessDataProcW; TProcessDataProcW=function(FileName:pwidechar;Size:longint):longint; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; PPkCryptProc = ^TPkCryptProc; TPkCryptProc = function(CryptoNr: Integer; Mode: Integer; ArchiveName, Password: PAnsiChar; MaxLen: Integer): Integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; PPkCryptProcW = ^TPkCryptProcW; TPkCryptProcW = function(CryptoNr: Integer; Mode: Integer; ArchiveName, Password: PWideChar; MaxLen: Integer): Integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; type PHeaderData = ^THeaderData; THeaderData=packed record ArcName:array [0..259] of char; FileName:array [0..259] of char; Flags, PackSize, UnpSize, HostOS, FileCRC, FileTime, UnpVer, Method, FileAttr:longint; CmtBuf:pchar; CmtBufSize, CmtSize, CmtState:longint; end; PHeaderDataEx = ^THeaderDataEx; THeaderDataEx=packed record ArcName:array [0..1023] of char; FileName:array [0..1023] of char; Flags:longint; PackSize, PackSizeHigh, UnpSize, UnpSizeHigh:longword; HostOS, FileCRC, FileTime, UnpVer, Method, FileAttr:longint; CmtBuf:pchar; CmtBufSize, CmtSize, CmtState:longint; Reserved:array[0..1023] of char; end; PHeaderDataExW=^THeaderDataExW; THeaderDataExW=packed record ArcName:array [0..1023] of widechar; FileName:array [0..1023] of widechar; Flags:longint; PackSize, PackSizeHigh, UnpSize, UnpSizeHigh:longword; HostOS, FileCRC, FileTime, UnpVer, Method, FileAttr:longint; CmtBuf:pchar; CmtBufSize, CmtSize, CmtState:longint; Reserved:array[0..1023] of char; end; tOpenArchiveData=packed record ArcName:pchar; OpenMode, OpenResult:longint; CmtBuf:pchar; CmtBufSize, CmtSize, CmtState:longint; end; tOpenArchiveDataW=packed record ArcName:pwidechar; OpenMode, OpenResult:longint; CmtBuf:pwidechar; CmtBufSize, CmtSize, CmtState:longint; end; tPackDefaultParamStruct=record size, PluginInterfaceVersionLow, PluginInterfaceVersionHi:longint; DefaultIniName:array[0..259] of char; end; pPackDefaultParamStruct=^tPackDefaultParamStruct; implementation end. doublecmd-0.5.8/sdk/dsxplugin.pas0000644000175000017500000000332111740433676016023 0ustar alexxalexxunit DsxPlugin; {$include calling.inc} interface uses SysUtils; type PDsxSearchRecord = ^TDsxSearchRecord; TDsxSearchRecord = record StartPath: array[0..1023] of AnsiChar; FileMask: array[0..1023] of AnsiChar; Attributes: Cardinal; AttribStr: array[0..127] of AnsiChar; CaseSensitive: Boolean; { Date/time search } IsDateFrom, IsDateTo, IsTimeFrom, IsTimeTo: Boolean; DateTimeFrom, DateTimeTo: TDateTime; { File size search } IsFileSizeFrom, IsFileSizeTo: Boolean; FileSizeFrom, FileSizeTo: Int64; { Find/replace text } IsFindText: Boolean; FindText: array[0..1023] of AnsiChar; IsReplaceText: Boolean; ReplaceText: array[0..1023] of AnsiChar; NotContainingText: Boolean; end; TDsxDefaultParamStruct = record Size, PluginInterfaceVersionLow, PluginInterfaceVersionHi: Longint; DefaultIniName: array[0..MAX_PATH - 1] of Char; end; PDsxDefaultParamStruct = ^TDsxDefaultParamStruct; { For compatibility with Delphi use $IFDEF's to set calling convention } {Prototypes} {Callbacks procs} TSAddFileProc = procedure(PluginNr: Integer; FoundFile: PChar); dcpcall; //if FoundFile='' then searching is finished TSUpdateStatusProc = procedure(PluginNr: Integer; CurrentFile: PChar; FilesScaned: Integer); dcpcall; {Mandatory (must be implemented)} TSInit = function(dps: PDsxDefaultParamStruct; pAddFileProc: TSAddFileProc; pUpdateStatus: TSUpdateStatusProc): Integer; dcpcall; TSStartSearch = procedure(PluginNr: Integer; pSearchRec: PDsxSearchRecord); dcpcall; TSStopSearch = procedure(PluginNr: Integer); dcpcall; TSFinalize = procedure(PluginNr: Integer); dcpcall; implementation end. doublecmd-0.5.8/sdk/wdxplugin.h0000644000175000017500000000716511740433676015505 0ustar alexxalexx#include "common.h" // Contents of file contplug.h version 2.0 #define ft_nomorefields 0 #define ft_numeric_32 1 #define ft_numeric_64 2 #define ft_numeric_floating 3 #define ft_date 4 #define ft_time 5 #define ft_boolean 6 #define ft_multiplechoice 7 #define ft_string 8 #define ft_fulltext 9 #define ft_datetime 10 #define ft_stringw 11 // for ContentGetValue #define ft_nosuchfield -1 // error, invalid field number given #define ft_fileerror -2 // file i/o error #define ft_fieldempty -3 // field valid, but empty #define ft_ondemand -4 // field will be retrieved only when user presses #define ft_notsupported -5 // function not supported #define ft_setcancel -6 // user clicked cancel in field editor #define ft_delayed 0 // field takes a long time to extract -> try again in background // for ContentSetValue #define ft_setsuccess 0 // setting of the attribute succeeded // for ContentGetSupportedFieldFlags #define contflags_edit 1 #define contflags_substsize 2 #define contflags_substdatetime 4 #define contflags_substdate 6 #define contflags_substtime 8 #define contflags_substattributes 10 #define contflags_substattributestr 12 #define contflags_passthrough_size_float 14 #define contflags_substmask 14 #define contflags_fieldedit 16 #define contst_readnewdir 1 #define contst_refreshpressed 2 #define contst_showhint 4 #define setflags_first_attribute 1 // First attribute of this file #define setflags_last_attribute 2 // Last attribute of this file #define setflags_only_date 4 // Only set the date of the datetime value! #define editflags_initialize 1 // The data passed to the plugin may be used to // initialize the edit dialog #define CONTENT_DELAYIFSLOW 1 // ContentGetValue called in foreground #define CONTENT_PASSTHROUGH 2 // If requested via contflags_passthrough_size_float: The size // is passed in as floating value, TC expects correct value // from the given units value, and optionally a text string typedef struct { int size; DWORD PluginInterfaceVersionLow; DWORD PluginInterfaceVersionHi; char DefaultIniName[MAX_PATH]; } ContentDefaultParamStruct; typedef struct { WORD wYear; WORD wMonth; WORD wDay; } tdateformat,*pdateformat; typedef struct { WORD wHour; WORD wMinute; WORD wSecond; } ttimeformat,*ptimeformat; int DCPCALL ContentGetDetectString(char* DetectString,int maxlen); int DCPCALL ContentGetSupportedField(int FieldIndex,char* FieldName,char* Units,int maxlen); int DCPCALL ContentGetValue(char* FileName,int FieldIndex,int UnitIndex,void* FieldValue,int maxlen,int flags); int DCPCALL ContentGetValueW(WCHAR* FileName,int FieldIndex,int UnitIndex,void* FieldValue,int maxlen,int flags); void DCPCALL ContentSetDefaultParams(ContentDefaultParamStruct* dps); void DCPCALL ContentPluginUnloading(void); void DCPCALL ContentStopGetValue(char* FileName); void DCPCALL ContentStopGetValueW(WCHAR* FileName); int DCPCALL ContentGetDefaultSortOrder(int FieldIndex); int DCPCALL ContentGetSupportedFieldFlags(int FieldIndex); int DCPCALL ContentSetValue(char* FileName,int FieldIndex,int UnitIndex,int FieldType,void* FieldValue,int flags); int DCPCALL ContentSetValueW(WCHAR* FileName,int FieldIndex,int UnitIndex,int FieldType,void* FieldValue,int flags); int DCPCALL ContentEditValue(HWND ParentWin,int FieldIndex,int UnitIndex,int FieldType, void* FieldValue,int maxlen,int flags,char* langidentifier); void DCPCALL ContentSendStateInformation(int state,char* path); void DCPCALL ContentSendStateInformationW(int state,WCHAR* path);doublecmd-0.5.8/sdk/extension.h0000644000175000017500000000775011740433676015500 0ustar alexxalexx#include "common.h" /* dialog messages */ #define DM_FIRST 0 #define DM_CLOSE DM_FIRST+1 /* A signal that the dialog is about to close */ #define DM_ENABLE DM_FIRST+2 #define DM_GETDLGDATA DM_FIRST+3 #define DM_GETDLGBOUNDS DM_FIRST+4 #define DM_GETITEMBOUNDS DM_FIRST+5 #define DM_GETTEXT DM_FIRST+6 /* Retrieve the text of an edit string or the caption of an item */ #define DM_KEYDOWN DM_FIRST+7 #define DM_KEYUP DM_FIRST+8 #define DM_SETDLGDATA DM_FIRST+9 #define DM_SETFOCUS DM_FIRST+10 /* Set the keyboard focus to the given dialog item */ #define DM_REDRAW DM_FIRST+11 /* Redraw the whole dialog */ #define DM_SETTEXT DM_FIRST+12 /* Set a new string value for an edit line or a new caption for an item */ #define DM_SETMAXTEXTLENGTH DM_FIRST+13 /* Set the maximum length of an edit string */ #define DM_SHOWDIALOG DM_FIRST+14 /* Show/hide the dialog window */ #define DM_SHOWITEM DM_FIRST+15 /* Show/hide a dialog item */ #define DM_GETCHECK DM_FIRST+16 /* Retrieve the state of TCheckBox or TRadioButton items */ #define DM_SETCHECK DM_FIRST+17 /* Change the state of TCheckBox and TRadioButton items */ #define DM_LISTGETITEM DM_FIRST+18 /* Retrieve a list item */ #define DM_LISTGETITEMINDEX DM_FIRST+19 /* Get current item index in a list */ #define DM_LISTSETITEMINDEX DM_FIRST+20 /* Set current item index in a list */ #define DM_LISTDELETE DM_FIRST+21 #define DM_LISTADD DM_FIRST+22 #define DM_LISTADDSTR DM_FIRST+23 #define DM_LISTUPDATE DM_FIRST+24 #define DM_LISTINSERT DM_FIRST+25 #define DM_LISTINDEXOF DM_FIRST+26 #define DM_LISTGETCOUNT DM_FIRST+27 #define DM_LISTGETDATA DM_FIRST+28 #define DM_LISTSETDATA DM_FIRST+29 #define DM_SETDLGBOUNDS DM_FIRST+30 #define DM_SETITEMBOUNDS DM_FIRST+31 #define DM_GETDROPPEDDOWN DM_FIRST+32 #define DM_SETDROPPEDDOWN DM_FIRST+33 #define DM_GETITEMDATA DM_FIRST+34 #define DM_SETITEMDATA DM_FIRST+35 #define DM_LISTSET DM_FIRST+36 /* events messages */ #define DN_FIRST 0x1000 #define DN_CLICK DN_FIRST+1 /* Sent after mouse click */ #define DN_DBLCLICK DN_FIRST+2 /* Sent after mouse double click */ #define DN_CHANGE DN_FIRST+3 /* Sent after the dialog item is changed */ #define DN_GOTFOCUS DN_FIRST+4 /* Sent when the dialog item gets input focus */ #define DN_INITDIALOG DN_FIRST+5 /* Sent before showing the dialog */ #define DN_KILLFOCUS DN_FIRST+6 /* Sent before a dialog item loses the input focus */ #define DN_KEYDOWN DM_KEYDOWN #define DN_KEYUP DM_KEYUP #define DN_CLOSE DM_CLOSE /* Sent before the dialog is closed */ #define DM_USER 0x4000 /* Starting value for user defined messages */ /* other */ #define EXT_MAX_PATH 16384 /* 16 Kb */ /* Dialog window callback function */ typedef intptr_t (DCPCALL *tDlgProc)(uintptr_t pDlg, char* DlgItemName, intptr_t Msg, intptr_t wParam, intptr_t lParam); /* Definition of callback functions called by the DLL */ typedef BOOL (DCPCALL *tInputBoxProc)(char* Caption, char* Prompt, BOOL MaskInput, char* Value, int ValueMaxLen); typedef int (DCPCALL *tMessageBoxProc)(char* Text, char* Caption, long Flags); typedef BOOL (DCPCALL *tDialogBoxLFMProc)(intptr_t LFMData, unsigned long DataSize, tDlgProc DlgProc); typedef BOOL (DCPCALL *tDialogBoxLRSProc)(intptr_t LRSData, unsigned long DataSize, tDlgProc DlgProc); typedef BOOL (DCPCALL *tDialogBoxLFMFileProc)(char* LFMFileName, tDlgProc DlgProc); #pragma pack(push) #pragma pack(1) typedef struct { unsigned long StructSize; char PluginDir[EXT_MAX_PATH]; char PluginConfDir[EXT_MAX_PATH]; tInputBoxProc InputBox; tMessageBoxProc MessageBox; tDialogBoxLFMProc DialogBoxLFM; tDialogBoxLRSProc DialogBoxLRS; tDialogBoxLFMFileProc DialogBoxLFMFile; tDlgProc SendDlgMsg; unsigned char Reserved[4096 * sizeof(void *)]; } tExtensionStartupInfo; #pragma pack(pop) typedef void (DCPCALL tExtensionInitializeProc)(tExtensionStartupInfo* StartupInfo); typedef void (DCPCALL tExtensionFinalizeProc)(void* Reserved); /* Plugin must implement this function for working with Extension API void DCPCALL ExtensionInitialize(tExtensionStartupInfo* StartupInfo); void DCPCALL ExtensionFinalize(void* Reserved); */ doublecmd-0.5.8/sdk/wfxplugin.h0000644000175000017500000002353011740433676015501 0ustar alexxalexx#include "common.h" // contents of fsplugin.h version 2.0 (30.Jan.2009) // ids for FsGetFile #define FS_FILE_OK 0 #define FS_FILE_EXISTS 1 #define FS_FILE_NOTFOUND 2 #define FS_FILE_READERROR 3 #define FS_FILE_WRITEERROR 4 #define FS_FILE_USERABORT 5 #define FS_FILE_NOTSUPPORTED 6 #define FS_FILE_EXISTSRESUMEALLOWED 7 #define FS_EXEC_OK 0 #define FS_EXEC_ERROR 1 #define FS_EXEC_YOURSELF -1 #define FS_EXEC_SYMLINK -2 #define FS_COPYFLAGS_OVERWRITE 1 #define FS_COPYFLAGS_RESUME 2 #define FS_COPYFLAGS_MOVE 4 #define FS_COPYFLAGS_EXISTS_SAMECASE 8 #define FS_COPYFLAGS_EXISTS_DIFFERENTCASE 16 // flags for tRequestProc #define RT_Other 0 #define RT_UserName 1 #define RT_Password 2 #define RT_Account 3 #define RT_UserNameFirewall 4 #define RT_PasswordFirewall 5 #define RT_TargetDir 6 #define RT_URL 7 #define RT_MsgOK 8 #define RT_MsgYesNo 9 #define RT_MsgOKCancel 10 // flags for tLogProc #define MSGTYPE_CONNECT 1 #define MSGTYPE_DISCONNECT 2 #define MSGTYPE_DETAILS 3 #define MSGTYPE_TRANSFERCOMPLETE 4 #define MSGTYPE_CONNECTCOMPLETE 5 #define MSGTYPE_IMPORTANTERROR 6 #define MSGTYPE_OPERATIONCOMPLETE 7 // flags for FsStatusInfo #define FS_STATUS_START 0 #define FS_STATUS_END 1 #define FS_STATUS_OP_LIST 1 #define FS_STATUS_OP_GET_SINGLE 2 #define FS_STATUS_OP_GET_MULTI 3 #define FS_STATUS_OP_PUT_SINGLE 4 #define FS_STATUS_OP_PUT_MULTI 5 #define FS_STATUS_OP_RENMOV_SINGLE 6 #define FS_STATUS_OP_RENMOV_MULTI 7 #define FS_STATUS_OP_DELETE 8 #define FS_STATUS_OP_ATTRIB 9 #define FS_STATUS_OP_MKDIR 10 #define FS_STATUS_OP_EXEC 11 #define FS_STATUS_OP_CALCSIZE 12 #define FS_STATUS_OP_SEARCH 13 #define FS_STATUS_OP_SEARCH_TEXT 14 #define FS_STATUS_OP_SYNC_SEARCH 15 #define FS_STATUS_OP_SYNC_GET 16 #define FS_STATUS_OP_SYNC_PUT 17 #define FS_STATUS_OP_SYNC_DELETE 18 #define FS_ICONFLAG_SMALL 1 #define FS_ICONFLAG_BACKGROUND 2 #define FS_ICON_USEDEFAULT 0 #define FS_ICON_EXTRACTED 1 #define FS_ICON_EXTRACTED_DESTROY 2 #define FS_ICON_DELAYED 3 #define FS_BITMAP_NONE 0 #define FS_BITMAP_EXTRACTED 1 #define FS_BITMAP_EXTRACT_YOURSELF 2 #define FS_BITMAP_EXTRACT_YOURSELF_ANDDELETE 3 #define FS_BITMAP_CACHE 256 #define FS_CRYPT_SAVE_PASSWORD 1 #define FS_CRYPT_LOAD_PASSWORD 2 #define FS_CRYPT_LOAD_PASSWORD_NO_UI 3 // Load password only if master password has already been entered! #define FS_CRYPT_COPY_PASSWORD 4 // Copy encrypted password to new connection name #define FS_CRYPT_MOVE_PASSWORD 5 // Move password when renaming a connection #define FS_CRYPT_DELETE_PASSWORD 6 // Delete password #define FS_CRYPTOPT_MASTERPASS_SET 1 // The user already has a master password defined // flags for FsFindFirst/FsFindNext #define FILE_ATTRIBUTE_DIRECTORY 16 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400 #define FILE_ATTRIBUTE_UNIX_MODE 0x80000000 typedef struct { DWORD SizeLow,SizeHigh; FILETIME LastWriteTime; int Attr; } RemoteInfoStruct; typedef struct { int size; DWORD PluginInterfaceVersionLow; DWORD PluginInterfaceVersionHi; char DefaultIniName[MAX_PATH]; } FsDefaultParamStruct; // callback functions typedef int (DCPCALL *tProgressProc)(int PluginNr,char* SourceName, char* TargetName,int PercentDone); typedef int (DCPCALL *tProgressProcW)(int PluginNr,WCHAR* SourceName, WCHAR* TargetName,int PercentDone); typedef void (DCPCALL *tLogProc)(int PluginNr,int MsgType,char* LogString); typedef void (DCPCALL *tLogProcW)(int PluginNr,int MsgType,WCHAR* LogString); typedef BOOL (DCPCALL *tRequestProc)(int PluginNr,int RequestType,char* CustomTitle, char* CustomText,char* ReturnedText,int maxlen); typedef BOOL (DCPCALL *tRequestProcW)(int PluginNr,int RequestType,WCHAR* CustomTitle, WCHAR* CustomText,WCHAR* ReturnedText,int maxlen); typedef int (DCPCALL *tCryptProc)(int PluginNr,int CryptoNr,int Mode, char* ConnectionName,char* Password,int maxlen); typedef int (DCPCALL *tCryptProcW)(int PluginNr,int CryptoNr,int Mode, WCHAR* ConnectionName,WCHAR* Password,int maxlen); // Function prototypes int DCPCALL FsInit(int PluginNr,tProgressProc pProgressProc, tLogProc pLogProc,tRequestProc pRequestProc); int DCPCALL FsInitW(int PluginNr,tProgressProcW pProgressProcW, tLogProcW pLogProcW,tRequestProcW pRequestProcW); void DCPCALL FsSetCryptCallback(tCryptProc pCryptProc,int CryptoNr,int Flags); void DCPCALL FsSetCryptCallbackW(tCryptProcW pCryptProcW,int CryptoNr,int Flags); HANDLE DCPCALL FsFindFirst(char* Path,WIN32_FIND_DATAA *FindData); HANDLE DCPCALL FsFindFirstW(WCHAR* Path,WIN32_FIND_DATAW *FindData); BOOL DCPCALL FsFindNext(HANDLE Hdl,WIN32_FIND_DATAA *FindData); BOOL DCPCALL FsFindNextW(HANDLE Hdl,WIN32_FIND_DATAW *FindData); int DCPCALL FsFindClose(HANDLE Hdl); BOOL DCPCALL FsMkDir(char* Path); BOOL DCPCALL FsMkDirW(WCHAR* Path); int DCPCALL FsExecuteFile(HWND MainWin,char* RemoteName,char* Verb); int DCPCALL FsExecuteFileW(HWND MainWin,WCHAR* RemoteName,WCHAR* Verb); int DCPCALL FsRenMovFile(char* OldName,char* NewName,BOOL Move, BOOL OverWrite,RemoteInfoStruct* ri); int DCPCALL FsRenMovFileW(WCHAR* OldName,WCHAR* NewName,BOOL Move, BOOL OverWrite,RemoteInfoStruct* ri); int DCPCALL FsGetFile(char* RemoteName,char* LocalName,int CopyFlags, RemoteInfoStruct* ri); int DCPCALL FsGetFileW(WCHAR* RemoteName,WCHAR* LocalName,int CopyFlags, RemoteInfoStruct* ri); int DCPCALL FsPutFile(char* LocalName,char* RemoteName,int CopyFlags); int DCPCALL FsPutFileW(WCHAR* LocalName,WCHAR* RemoteName,int CopyFlags); BOOL DCPCALL FsDeleteFile(char* RemoteName); BOOL DCPCALL FsDeleteFileW(WCHAR* RemoteName); BOOL DCPCALL FsRemoveDir(char* RemoteName); BOOL DCPCALL FsRemoveDirW(WCHAR* RemoteName); BOOL DCPCALL FsDisconnect(char* DisconnectRoot); BOOL DCPCALL FsDisconnectW(WCHAR* DisconnectRoot); BOOL DCPCALL FsSetAttr(char* RemoteName,int NewAttr); BOOL DCPCALL FsSetAttrW(WCHAR* RemoteName,int NewAttr); BOOL DCPCALL FsSetTime(char* RemoteName,FILETIME *CreationTime, FILETIME *LastAccessTime,FILETIME *LastWriteTime); BOOL DCPCALL FsSetTimeW(WCHAR* RemoteName,FILETIME *CreationTime, FILETIME *LastAccessTime,FILETIME *LastWriteTime); void DCPCALL FsStatusInfo(char* RemoteDir,int InfoStartEnd,int InfoOperation); void DCPCALL FsStatusInfoW(WCHAR* RemoteDir,int InfoStartEnd,int InfoOperation); void DCPCALL FsGetDefRootName(char* DefRootName,int maxlen); int DCPCALL FsExtractCustomIcon(char* RemoteName,int ExtractFlags,HICON* TheIcon); int DCPCALL FsExtractCustomIconW(WCHAR* RemoteName,int ExtractFlags,HICON* TheIcon); void DCPCALL FsSetDefaultParams(FsDefaultParamStruct* dps); int DCPCALL FsGetPreviewBitmap(char* RemoteName,int width,int height,HBITMAP* ReturnedBitmap); int DCPCALL FsGetPreviewBitmapW(WCHAR* RemoteName,int width,int height,HBITMAP* ReturnedBitmap); BOOL DCPCALL FsLinksToLocalFiles(void); BOOL DCPCALL FsGetLocalName(char* RemoteName,int maxlen); BOOL DCPCALL FsGetLocalNameW(WCHAR* RemoteName,int maxlen); // ************************** content plugin extension **************************** // #define ft_nomorefields 0 #define ft_numeric_32 1 #define ft_numeric_64 2 #define ft_numeric_floating 3 #define ft_date 4 #define ft_time 5 #define ft_boolean 6 #define ft_multiplechoice 7 #define ft_string 8 #define ft_fulltext 9 #define ft_datetime 10 #define ft_stringw 11 // Should only be returned by Unicode function // for FsContentGetValue #define ft_nosuchfield -1 // error, invalid field number given #define ft_fileerror -2 // file i/o error #define ft_fieldempty -3 // field valid, but empty #define ft_ondemand -4 // field will be retrieved only when user presses #define ft_delayed 0 // field takes a long time to extract -> try again in background // for FsContentSetValue #define ft_setsuccess 0 // setting of the attribute succeeded // for FsContentGetSupportedFieldFlags #define contflags_edit 1 #define contflags_substsize 2 #define contflags_substdatetime 4 #define contflags_substdate 6 #define contflags_substtime 8 #define contflags_substattributes 10 #define contflags_substattributestr 12 #define contflags_substmask 14 // for FsContentSetValue #define setflags_first_attribute 1 // First attribute of this file #define setflags_last_attribute 2 // Last attribute of this file #define setflags_only_date 4 // Only set the date of the datetime value! #define CONTENT_DELAYIFSLOW 1 // ContentGetValue called in foreground typedef struct { int size; DWORD PluginInterfaceVersionLow; DWORD PluginInterfaceVersionHi; char DefaultIniName[MAX_PATH]; } ContentDefaultParamStruct; typedef struct { WORD wYear; WORD wMonth; WORD wDay; } tdateformat,*pdateformat; typedef struct { WORD wHour; WORD wMinute; WORD wSecond; } ttimeformat,*ptimeformat; int DCPCALL FsContentGetSupportedField(int FieldIndex,char* FieldName,char* Units,int maxlen); int DCPCALL FsContentGetValue(char* FileName,int FieldIndex,int UnitIndex,void* FieldValue,int maxlen,int flags); int DCPCALL FsContentGetValueW(WCHAR* FileName,int FieldIndex,int UnitIndex,void* FieldValue,int maxlen,int flags); void DCPCALL FsContentStopGetValue(char* FileName); void DCPCALL FsContentStopGetValueW(WCHAR* FileName); int DCPCALL FsContentGetDefaultSortOrder(int FieldIndex); void DCPCALL FsContentPluginUnloading(void); int DCPCALL FsContentGetSupportedFieldFlags(int FieldIndex); int DCPCALL FsContentSetValue(char* FileName,int FieldIndex,int UnitIndex,int FieldType,void* FieldValue,int flags); int DCPCALL FsContentSetValueW(WCHAR* FileName,int FieldIndex,int UnitIndex,int FieldType,void* FieldValue,int flags); BOOL DCPCALL FsContentGetDefaultView(char* ViewContents,char* ViewHeaders,char* ViewWidths,char* ViewOptions,int maxlen); BOOL DCPCALL FsContentGetDefaultViewW(WCHAR* ViewContents,WCHAR* ViewHeaders,WCHAR* ViewWidths,WCHAR* ViewOptions,int maxlen);doublecmd-0.5.8/sdk/wfxplugin.pas0000644000175000017500000003470211740433676016040 0ustar alexxalexxunit WfxPlugin; { Plugin definitions version 2.0 } interface uses SysUtils {$IFDEF MSWINDOWS}, Windows{$ENDIF}; { ids for FsGetFile } const FS_FILE_OK=0; FS_FILE_EXISTS=1; FS_FILE_NOTFOUND=2; FS_FILE_READERROR=3; FS_FILE_WRITEERROR=4; FS_FILE_USERABORT=5; FS_FILE_NOTSUPPORTED=6; FS_FILE_EXISTSRESUMEALLOWED=7; FS_EXEC_OK=0; FS_EXEC_ERROR=1; FS_EXEC_YOURSELF=-1; FS_EXEC_SYMLINK=-2; FS_COPYFLAGS_OVERWRITE=1; FS_COPYFLAGS_RESUME=2; FS_COPYFLAGS_MOVE=4; FS_COPYFLAGS_EXISTS_SAMECASE=8; FS_COPYFLAGS_EXISTS_DIFFERENTCASE=16; { flags for tRequestProc } const RT_Other=0; RT_UserName=1; RT_Password=2; RT_Account=3; RT_UserNameFirewall=4; RT_PasswordFirewall=5; RT_TargetDir=6; RT_URL=7; RT_MsgOK=8; RT_MsgYesNo=9; RT_MsgOKCancel=10; { flags for tLogProc } const msgtype_connect=1; msgtype_disconnect=2; msgtype_details=3; msgtype_transfercomplete=4; msgtype_connectcomplete=5; msgtype_importanterror=6; msgtype_operationcomplete=7; { flags for FsStatusInfo } const FS_STATUS_START=0; FS_STATUS_END=1; FS_STATUS_OP_LIST=1; FS_STATUS_OP_GET_SINGLE=2; FS_STATUS_OP_GET_MULTI=3; FS_STATUS_OP_PUT_SINGLE=4; FS_STATUS_OP_PUT_MULTI=5; FS_STATUS_OP_RENMOV_SINGLE=6; FS_STATUS_OP_RENMOV_MULTI=7; FS_STATUS_OP_DELETE=8; FS_STATUS_OP_ATTRIB=9; FS_STATUS_OP_MKDIR=10; FS_STATUS_OP_EXEC=11; FS_STATUS_OP_CALCSIZE=12; FS_STATUS_OP_SEARCH=13; FS_STATUS_OP_SEARCH_TEXT=14; FS_STATUS_OP_SYNC_SEARCH=15; FS_STATUS_OP_SYNC_GET=16; FS_STATUS_OP_SYNC_PUT=17; FS_STATUS_OP_SYNC_DELETE=18; FS_STATUS_OP_GET_MULTI_THREAD=19; FS_STATUS_OP_PUT_MULTI_THREAD=20; {Flags for FsExtractCustomIcon} const FS_ICONFLAG_SMALL=1; FS_ICONFLAG_BACKGROUND=2; FS_ICON_USEDEFAULT=0; FS_ICON_EXTRACTED=1; FS_ICON_EXTRACTED_DESTROY=2; FS_ICON_DELAYED=3; const FS_BITMAP_NONE=0; FS_BITMAP_EXTRACTED=1; FS_BITMAP_EXTRACT_YOURSELF=2; FS_BITMAP_EXTRACT_YOURSELF_ANDDELETE=3; FS_BITMAP_CACHE=256; {Flags for crypto callback function} FS_CRYPT_SAVE_PASSWORD=1; FS_CRYPT_LOAD_PASSWORD=2; FS_CRYPT_LOAD_PASSWORD_NO_UI=3; {Load password only if master password has already been entered!} FS_CRYPT_COPY_PASSWORD=4; FS_CRYPT_MOVE_PASSWORD=5; FS_CRYPT_DELETE_PASSWORD=6; FS_CRYPTOPT_MASTERPASS_SET=1; {The user already has a master password defined} {Flags for FsGetBackgroundFlags} BG_DOWNLOAD=1; { Plugin supports downloads in background } BG_UPLOAD=2; { Plugin supports uploads in background } BG_ASK_USER=4; { Plugin requires separate connection for background transfers -> ask user first } type { Unsigned integer with pointer size } THandle = {$IFDEF CPU64}QWord{$ELSE}LongWord{$ENDIF}; const wfxInvalidHandle: THandle = THandle(-1); { Some Windows specific stuff } const MAXDWORD = DWORD($FFFFFFFF); FILE_ATTRIBUTE_NORMAL = 128; FILE_ATTRIBUTE_DIRECTORY = 16; FILE_ATTRIBUTE_REPARSE_POINT = $0400; FILE_ATTRIBUTE_UNIX_MODE = $80000000; type TInt64Rec = packed record case Boolean of True : (Value : Int64); False : (Low, High : DWORD); end; BOOL = LongBool; HBITMAP = THandle; HICON = THandle; HWND = THandle; type {$IFDEF MSWINDOWS} FILETIME = Windows.FILETIME; {$ELSE} FILETIME = packed record dwLowDateTime : DWORD; dwHighDateTime : DWORD; end; {$ENDIF} TFileTime = FILETIME; // for compatibility with all plugins PFileTime = ^FILETIME; TWfxFileTime = FILETIME; PWfxFileTime = ^FILETIME; {$IFDEF MSWINDOWS} WIN32_FIND_DATAA = Windows.WIN32_FIND_DATA; {$ELSE} WIN32_FIND_DATAA = packed record dwFileAttributes : DWORD; ftCreationTime : TFILETIME; ftLastAccessTime : TFILETIME; ftLastWriteTime : TFILETIME; nFileSizeHigh : DWORD; nFileSizeLow : DWORD; dwReserved0 : DWORD; dwReserved1 : DWORD; cFileName : array[0..(MAX_PATH)-1] of CHAR; cAlternateFileName : array[0..13] of CHAR; end; {$ENDIF} TWin32FindData = WIN32_FIND_DATAA; {$IFDEF MSWINDOWS} WIN32_FIND_DATAW = Windows.WIN32_FIND_DATAW; {$ELSE} WIN32_FIND_DATAW = packed record dwFileAttributes : DWORD; ftCreationTime : TFILETIME; ftLastAccessTime : TFILETIME; ftLastWriteTime : TFILETIME; nFileSizeHigh : DWORD; nFileSizeLow : DWORD; dwReserved0 : DWORD; dwReserved1 : DWORD; cFileName : array[0..(MAX_PATH)-1] of WCHAR; cAlternateFileName : array[0..13] of WCHAR; end; {$ENDIF} TWin32FindDataW = WIN32_FIND_DATAW; type tRemoteInfo=record SizeLow,SizeHigh:longint; LastWriteTime:TFileTime; Attr:longint; end; pRemoteInfo=^tRemoteInfo; type tFsDefaultParamStruct=record size, PluginInterfaceVersionLow, PluginInterfaceVersionHi:longint; DefaultIniName:array[0..MAX_PATH-1] of char; end; pFsDefaultParamStruct=^tFsDefaultParamStruct; { For compatibility with Delphi use $IFDEF's to set calling convention } { callback functions } type TProgressProc=function(PluginNr:integer;SourceName, TargetName:pchar;PercentDone:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; TProgressProcW=function(PluginNr:integer;SourceName, TargetName:pwidechar;PercentDone:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; TLogProc=procedure(PluginNr,MsgType:integer;LogString:pchar); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; TLogProcW=procedure(PluginNr,MsgType:integer;LogString:pwidechar); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; TRequestProc=function(PluginNr,RequestType:integer;CustomTitle,CustomText, ReturnedText:pchar;maxlen:integer):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; TRequestProcW=function(PluginNr,RequestType:integer;CustomTitle,CustomText, ReturnedText:pwidechar;maxlen:integer):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; TCryptProc=function(PluginNr,CryptoNumber:integer;mode:integer;ConnectionName, Password:pchar;maxlen:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; TCryptProcW=function(PluginNr,CryptoNumber:integer;mode:integer;ConnectionName, Password:pwidechar;maxlen:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; { Function prototypes - the callback functions MUST be implemented exactly like this! } (* function FsInit(PluginNr:integer;pProgressProc:tProgressProc;pLogProc:tLogProc; pRequestProc:tRequestProc):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsInitW(PluginNr:integer;pProgressProcW:tProgressProcW;pLogProcW:tLogProcW; pRequestProcW:tRequestProcW):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure FsSetCryptCallback(CryptProc:TCryptProc;CryptoNr,Flags:integer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure FsSetCryptCallbackW(CryptProcW:TCryptProcW;CryptoNr,Flags:integer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsFindFirst(path :pchar;var FindData:tWIN32FINDDATA):thandle; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsFindFirstW(path :pwidechar;var FindData:tWIN32FINDDATAW):thandle; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsFindNext(Hdl:thandle;var FindData:tWIN32FINDDATA):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsFindNextW(Hdl:thandle;var FindDataW:tWIN32FINDDATAW):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsFindClose(Hdl:thandle):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsMkDir(RemoteDir:pchar):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsMkDirW(RemoteDir:pwidechar):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsExecuteFile(MainWin:HWND;RemoteName,Verb:pchar):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsExecuteFileW(MainWin:HWND;RemoteName,Verb:pwidechar):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsRenMovFile(OldName,NewName:pchar;Move,OverWrite:bool; RemoteInfo:pRemoteInfo):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsRenMovFileW(OldName,NewName:pwidechar;Move,OverWrite:bool; RemoteInfo:pRemoteInfo):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsGetFile(RemoteName,LocalName:pchar;CopyFlags:integer; RemoteInfo:pRemoteInfo):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsGetFileW(RemoteName,LocalName:pwidechar;CopyFlags:integer; RemoteInfo:pRemoteInfo):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsPutFile(LocalName,RemoteName:pchar;CopyFlags:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsPutFileW(LocalName,RemoteName:pwidechar;CopyFlags:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsDeleteFile(RemoteName:pchar):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsDeleteFileW(RemoteName:pwidechar):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsRemoveDir(RemoteName:pchar):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsRemoveDirW(RemoteName:pwidechar):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsDisconnect(DisconnectRoot:pchar):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsDisconnectW(DisconnectRoot:pwidechar):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsSetAttr(RemoteName:pchar;NewAttr:integer):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsSetAttrW(RemoteName:pwidechar;NewAttr:integer):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsSetTime(RemoteName:pchar;CreationTime,LastAccessTime, LastWriteTime:PFileTime):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsSetTimeW(RemoteName:pwidechar;CreationTime,LastAccessTime, LastWriteTime:PFileTime):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure FsStatusInfo(RemoteDir:pchar;InfoStartEnd,InfoOperation:integer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure FsStatusInfoW(RemoteDir:pwidechar;InfoStartEnd,InfoOperation:integer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure FsGetDefRootName(DefRootName:pchar;maxlen:integer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsExtractCustomIcon(RemoteName:pchar;ExtractFlags:integer; var TheIcon:hicon):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsExtractCustomIconW(RemoteName:pwidechar;ExtractFlags:integer; var TheIcon:hicon):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure FsSetDefaultParams(dps:pFsDefaultParamStruct); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsGetPreviewBitmap(RemoteName:pchar;width,height:integer, var ReturnedBitmap:hbitmap):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsGetPreviewBitmapW(RemoteName:pwidechar;width,height:integer, var ReturnedBitmap:hbitmap):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsLinksToLocalFiles:bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsGetLocalName(RemoteName:pchar;maxlen:integer):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsGetLocalNameW(RemoteName:pwidechar;maxlen:integer):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; *) {****************************** content plugin part *****************************} const ft_nomorefields=0; ft_numeric_32=1; ft_numeric_64=2; ft_numeric_floating=3; ft_date=4; ft_time=5; ft_boolean=6; ft_multiplechoice=7; ft_string=8; ft_fulltext=9; ft_datetime=10; ft_stringw=11; // for ContentGetValue ft_nosuchfield=-1; ft_fileerror=-2; ft_fieldempty=-3; ft_ondemand=-4; ft_delayed=0; // for ContentSetValue ft_setsuccess=0; setflags_first_attribute=1; {First attribute of this file} setflags_last_attribute=2; setflags_only_date=4; CONTENT_DELAYIFSLOW=1; // ContentGetValue called in foreground type tContentDefaultParamStruct=record size, PluginInterfaceVersionLow, PluginInterfaceVersionHi:longint; DefaultIniName:array[0..MAX_PATH-1] of char; end; pContentDefaultParamStruct=^tContentDefaultParamStruct; type tdateformat=record wYear,wMonth,wDay:word; end; pdateformat=^tdateformat; type ttimeformat=record wHour,wMinute,wSecond:word; end; ptimeformat=^ttimeformat; { Function prototypes: } (* procedure FsContentGetDetectString(DetectString:pchar;maxlen:integer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsContentGetSupportedField(FieldIndex:integer;FieldName:pchar; Units:pchar;maxlen:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsContentGetValue(FileName:pchar;FieldIndex,UnitIndex:integer;FieldValue:pbyte; maxlen,flags:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsContentGetValueW(FileName:pwidechar;FieldIndex,UnitIndex:integer;FieldValue:pbyte; maxlen,flags:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure FsContentSetDefaultParams(dps:pContentDefaultParamStruct); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure FsContentStopGetValue(FileName:pchar); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; procedure FsContentStopGetValueW(FileName:pwidechar); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsContentGetDefaultSortOrder(FieldIndex:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsContentGetSupportedFieldFlags(FieldIndex:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsContentSetValue(FileName:pchar;FieldIndex,UnitIndex,FieldType:integer; FieldValue:pbyte;flags:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsContentSetValueW(FileName:pwidechar;FieldIndex,UnitIndex,FieldType:integer; FieldValue:pbyte;flags:integer):integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsContentGetDefaultView(ViewContents,ViewHeaders,ViewWidths, ViewOptions:pchar;maxlen:integer):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsContentGetDefaultViewW(ViewContents,ViewHeaders,ViewWidths, ViewOptions:pwidechar;maxlen:integer):bool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; function FsGetBackgroundFlags:integer; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF}; *) implementation end. doublecmd-0.5.8/sdk/wlxplugin.h0000644000175000017500000000416611740433676015513 0ustar alexxalexx#include "common.h" /* Contents of file listplug.h */ #define lc_copy 1 #define lc_newparams 2 #define lc_selectall 3 #define lc_setpercent 4 #define lcp_wraptext 1 #define lcp_fittowindow 2 #define lcp_ansi 4 #define lcp_ascii 8 #define lcp_variable 12 #define lcp_forceshow 16 #define lcp_fitlargeronly 32 #define lcp_center 64 #define lcs_findfirst 1 #define lcs_matchcase 2 #define lcs_wholewords 4 #define lcs_backwards 8 #define itm_percent 0xFFFE #define itm_fontstyle 0xFFFD #define itm_wrap 0xFFFC #define itm_fit 0xFFFB #define itm_next 0xFFFA #define itm_center 0xFFF9 #define LISTPLUGIN_OK 0 #define LISTPLUGIN_ERROR 1 typedef struct { int size; DWORD PluginInterfaceVersionLow; DWORD PluginInterfaceVersionHi; char DefaultIniName[MAX_PATH]; } ListDefaultParamStruct; HWND DCPCALL ListLoad(HWND ParentWin,char* FileToLoad,int ShowFlags); HWND DCPCALL ListLoadW(HWND ParentWin,WCHAR* FileToLoad,int ShowFlags); int DCPCALL ListLoadNext(HWND ParentWin,HWND PluginWin,char* FileToLoad,int ShowFlags); int DCPCALL ListLoadNextW(HWND ParentWin,HWND PluginWin,WCHAR* FileToLoad,int ShowFlags); void DCPCALL ListCloseWindow(HWND ListWin); void DCPCALL ListGetDetectString(char* DetectString,int maxlen); int DCPCALL ListSearchText(HWND ListWin,char* SearchString,int SearchParameter); int DCPCALL ListSearchTextW(HWND ListWin,WCHAR* SearchString,int SearchParameter); int DCPCALL ListSearchDialog(HWND ListWin,int FindNext); int DCPCALL ListSendCommand(HWND ListWin,int Command,int Parameter); int DCPCALL ListPrint(HWND ListWin,char* FileToPrint,char* DefPrinter, int PrintFlags,RECT* Margins); int DCPCALL ListPrintW(HWND ListWin,WCHAR* FileToPrint,WCHAR* DefPrinter, int PrintFlags,RECT* Margins); int DCPCALL ListNotificationReceived(HWND ListWin,int Message,WPARAM wParam,LPARAM lParam); void DCPCALL ListSetDefaultParams(ListDefaultParamStruct* dps); HBITMAP DCPCALL ListGetPreviewBitmap(char* FileToLoad,int width,int height, char* contentbuf,int contentbuflen); HBITMAP DCPCALL ListGetPreviewBitmapW(WCHAR* FileToLoad,int width,int height, char* contentbuf,int contentbuflen);doublecmd-0.5.8/sdk/calling.inc0000644000175000017500000000014411740433676015405 0ustar alexxalexx{$MACRO ON} {$IFDEF MSWINDOWS} {$DEFINE dcpcall:=stdcall} {$ELSE} {$DEFINE dcpcall:=cdecl} {$ENDIF} doublecmd-0.5.8/sdk/wcxplugin.h0000644000175000017500000001371611740433676015503 0ustar alexxalexx#include "common.h" /* Contents of file wcxhead.h */ /* It contains definitions of error codes, flags and callbacks */ /* Error codes returned to calling application */ #define E_SUCCESS 0 /* Success */ #define E_END_ARCHIVE 10 /* No more files in archive */ #define E_NO_MEMORY 11 /* Not enough memory */ #define E_BAD_DATA 12 /* Data is bad */ #define E_BAD_ARCHIVE 13 /* CRC error in archive data */ #define E_UNKNOWN_FORMAT 14 /* Archive format unknown */ #define E_EOPEN 15 /* Cannot open existing file */ #define E_ECREATE 16 /* Cannot create file */ #define E_ECLOSE 17 /* Error closing file */ #define E_EREAD 18 /* Error reading from file */ #define E_EWRITE 19 /* Error writing to file */ #define E_SMALL_BUF 20 /* Buffer too small */ #define E_EABORTED 21 /* Function aborted by user */ #define E_NO_FILES 22 /* No files found */ #define E_TOO_MANY_FILES 23 /* Too many files to pack */ #define E_NOT_SUPPORTED 24 /* Function not supported */ /* flags for unpacking */ #define PK_OM_LIST 0 #define PK_OM_EXTRACT 1 /* flags for ProcessFile */ #define PK_SKIP 0 /* Skip this file */ #define PK_TEST 1 /* Test file integrity */ #define PK_EXTRACT 2 /* Extract to disk */ /* Flags passed through ChangeVolProc */ #define PK_VOL_ASK 0 /* Ask user for location of next volume */ #define PK_VOL_NOTIFY 1 /* Notify app that next volume will be unpacked */ /* Flags for packing */ /* For PackFiles */ #define PK_PACK_MOVE_FILES 1 /* Delete original after packing */ #define PK_PACK_SAVE_PATHS 2 /* Save path names of files */ #define PK_PACK_ENCRYPT 4 /* Ask user for password, then encrypt */ /* Returned by GetPackCaps */ #define PK_CAPS_NEW 1 /* Can create new archives */ #define PK_CAPS_MODIFY 2 /* Can modify exisiting archives */ #define PK_CAPS_MULTIPLE 4 /* Archive can contain multiple files */ #define PK_CAPS_DELETE 8 /* Can delete files */ #define PK_CAPS_OPTIONS 16 /* Has options dialog */ #define PK_CAPS_MEMPACK 32 /* Supports packing in memory */ #define PK_CAPS_BY_CONTENT 64 /* Detect archive type by content */ #define PK_CAPS_SEARCHTEXT 128 /* Allow searching for text in archives */ /* created with this plugin} */ #define PK_CAPS_HIDE 256 /* Show as normal files (hide packer */ /* icon), open with Ctrl+PgDn, not Enter*/ #define PK_CAPS_ENCRYPT 512 /* Plugin supports PK_PACK_ENCRYPT option*/ /* Flags for packing in memory */ #define MEM_OPTIONS_WANTHEADERS 1 /* Return archive headers with packed data */ /* Errors returned by PackToMem */ #define MEMPACK_OK 0 /* Function call finished OK, but there is more data */ #define MEMPACK_DONE 1 /* Function call finished OK, there is no more data */ #define PK_CRYPT_SAVE_PASSWORD 1 #define PK_CRYPT_LOAD_PASSWORD 2 #define PK_CRYPT_LOAD_PASSWORD_NO_UI 3 // Load password only if master password has already been entered! #define PK_CRYPT_COPY_PASSWORD 4 // Copy encrypted password to new archive name #define PK_CRYPT_MOVE_PASSWORD 5 // Move password when renaming an archive #define PK_CRYPT_DELETE_PASSWORD 6 // Delete password #define PK_CRYPTOPT_MASTERPASS_SET 1 // The user already has a master password defined typedef struct { char ArcName[260]; char FileName[260]; int Flags; int PackSize; int UnpSize; int HostOS; int FileCRC; int FileTime; int UnpVer; int Method; int FileAttr; char* CmtBuf; int CmtBufSize; int CmtSize; int CmtState; } tHeaderData; typedef struct { char ArcName[1024]; char FileName[1024]; int Flags; unsigned int PackSize; unsigned int PackSizeHigh; unsigned int UnpSize; unsigned int UnpSizeHigh; int HostOS; int FileCRC; int FileTime; int UnpVer; int Method; int FileAttr; char* CmtBuf; int CmtBufSize; int CmtSize; int CmtState; char Reserved[1024]; } tHeaderDataEx; typedef struct { WCHAR ArcName[1024]; WCHAR FileName[1024]; int Flags; unsigned int PackSize; unsigned int PackSizeHigh; unsigned int UnpSize; unsigned int UnpSizeHigh; int HostOS; int FileCRC; int FileTime; int UnpVer; int Method; int FileAttr; char* CmtBuf; int CmtBufSize; int CmtSize; int CmtState; char Reserved[1024]; } tHeaderDataExW; typedef struct { char* ArcName; int OpenMode; int OpenResult; char* CmtBuf; int CmtBufSize; int CmtSize; int CmtState; } tOpenArchiveData; typedef struct { WCHAR* ArcName; int OpenMode; int OpenResult; WCHAR* CmtBuf; int CmtBufSize; int CmtSize; int CmtState; } tOpenArchiveDataW; typedef struct { int size; DWORD PluginInterfaceVersionLow; DWORD PluginInterfaceVersionHi; char DefaultIniName[MAX_PATH]; } PackDefaultParamStruct; /* Definition of callback functions called by the DLL Ask to swap disk for multi-volume archive */ typedef int (DCPCALL *tChangeVolProc)(char *ArcName,int Mode); typedef int (DCPCALL *tChangeVolProcW)(WCHAR *ArcName,int Mode); /* Notify that data is processed - used for progress dialog */ typedef int (DCPCALL *tProcessDataProc)(char *FileName,int Size); typedef int (DCPCALL *tProcessDataProcW)(WCHAR *FileName,int Size); typedef int (DCPCALL *tPkCryptProc)(int CryptoNr,int Mode, char* ArchiveName,char* Password,int maxlen); typedef int (DCPCALL *tPkCryptProcW)(int CryptoNr,int Mode, WCHAR* ArchiveName,WCHAR* Password,int maxlen); doublecmd-0.5.8/src/0000755000175000017500000000000012257501472013302 5ustar alexxalexxdoublecmd-0.5.8/src/umasks.pas0000644000175000017500000001510212014201074015273 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Modified version of standart Masks unit Copyright (C) 2010 Koblov Alexander (Alexx2000@mail.ru) This file is based on masks.pas from the Lazarus Component Library (LCL) See the file COPYING.modifiedLGPL.txt, included in this distribution, for details about the copyright. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. } unit uMasks; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Contnrs; type TMaskCharType = (mcChar, mcAnyChar, mcAnyText); TMaskChar = record case CharType: TMaskCharType of mcChar: (CharValue: Char); mcAnyChar, mcAnyText: (); end; TMaskString = record MinLength: Integer; MaxLength: Integer; Chars: Array of TMaskChar; end; { TMask } TMask = class private FMask: TMaskString; FCaseSensitive: Boolean; public constructor Create(const AValue: String; CaseSensitive: Boolean = False); function Matches(const AFileName: String): Boolean; end; { TParseStringList } TParseStringList = class(TStringList) public constructor Create(const AText, ASeparators: String); end; { TMaskList } TMaskList = class private FMasks: TObjectList; function GetCount: Integer; function GetItem(Index: Integer): TMask; public constructor Create(const AValue: String; ASeparator: Char = ';'); destructor Destroy; override; function Matches(const AFileName: String): Boolean; property Count: Integer read GetCount; property Items[Index: Integer]: TMask read GetItem; end; function MatchesMask(const FileName, Mask: String; CaseSensitive: Boolean = False): Boolean; function MatchesMaskList(const FileName, Mask: String; Separator: Char = ';'): Boolean; implementation function MatchesMask(const FileName, Mask: String; CaseSensitive: Boolean = False): Boolean; var AMask: TMask; begin if Mask <> '' then begin AMask := TMask.Create(Mask, CaseSensitive); try Result := AMask.Matches(FileName); finally AMask.Free; end; end else Result := False; end; function MatchesMaskList(const FileName, Mask: String; Separator: Char): Boolean; var AMaskList: TMaskList; begin if Mask <> '' then begin AMaskList := TMaskList.Create(Mask, Separator); try Result := AMaskList.Matches(FileName); finally AMaskList.Free; end; end else Result := False; end; { TMask } constructor TMask.Create(const AValue: String; CaseSensitive: Boolean = False); var I: Integer; SkipAnyText: Boolean; procedure AddAnyText; begin if SkipAnyText then begin Inc(I); Exit; end; SetLength(FMask.Chars, Length(FMask.Chars) + 1); FMask.Chars[High(FMask.Chars)].CharType := mcAnyText; FMask.MaxLength := MaxInt; SkipAnyText := True; Inc(I); end; procedure AddAnyChar; begin SkipAnyText := False; SetLength(FMask.Chars, Length(FMask.Chars) + 1); FMask.Chars[High(FMask.Chars)].CharType := mcAnyChar; Inc(FMask.MinLength); if FMask.MaxLength < MaxInt then Inc(FMask.MaxLength); Inc(I); end; procedure AddChar; begin SkipAnyText := False; SetLength(FMask.Chars, Length(FMask.Chars) + 1); with FMask.Chars[High(FMask.Chars)] do begin CharType := mcChar; CharValue := AValue[I]; if not FCaseSensitive then CharValue := upCase(CharValue); end; Inc(FMask.MinLength); if FMask.MaxLength < MaxInt then Inc(FMask.MaxLength); Inc(I); end; begin SetLength(FMask.Chars, 0); FMask.MinLength := 0; FMask.MaxLength := 0; SkipAnyText := False; FCaseSensitive := CaseSensitive; I := 1; while I <= Length(AValue) do begin case AValue[I] of '*': AddAnyText; '?': AddAnyChar; else AddChar; end; end; end; function TMask.Matches(const AFileName: String): Boolean; var L: Integer; S: String; function MatchToEnd(MaskIndex, CharIndex: Integer): Boolean; var I, J: Integer; begin Result := False; for I := MaskIndex to High(FMask.Chars) do begin case FMask.Chars[I].CharType of mcChar: begin if CharIndex > L then Exit; //DCDebug('Match ' + S[CharIndex] + '' + FMask.Chars[I].CharValue); if S[CharIndex] <> FMask.Chars[I].CharValue then Exit; Inc(CharIndex); end; mcAnyChar: begin if CharIndex > L then Exit; Inc(CharIndex); end; mcAnyText: begin if I = High(FMask.Chars) then begin Result := True; Exit; end; for J := CharIndex to L do if MatchToEnd(I + 1, J) then begin Result := True; Exit; end; end; end; end; Result := CharIndex > L; end; begin Result := False; L := Length(AFileName); if L = 0 then begin if FMask.MinLength = 0 then Result := True; Exit; end; if (L < FMask.MinLength) or (L > FMask.MaxLength) then Exit; S := AFileName; if not FCaseSensitive then S := UpperCase(S); Result := MatchToEnd(0, 1); end; { TParseStringList } constructor TParseStringList.Create(const AText, ASeparators: String); var I, S: Integer; begin inherited Create; S := 1; for I := 1 to Length(AText) do begin if Pos(AText[I], ASeparators) > 0 then begin if I > S then Add(Copy(AText, S, I - S)); S := I + 1; end; end; if Length(AText) >= S then Add(Copy(AText, S, Length(AText) - S + 1)); end; { TMaskList } function TMaskList.GetItem(Index: Integer): TMask; begin Result := TMask(FMasks.Items[Index]); end; function TMaskList.GetCount: Integer; begin Result := FMasks.Count; end; constructor TMaskList.Create(const AValue: String; ASeparator: Char); var S: TParseStringList; I: Integer; begin FMasks := TObjectList.Create(True); S := TParseStringList.Create(AValue, ASeparator); try for I := 0 to S.Count - 1 do FMasks.Add(TMask.Create(S[I])); finally S.Free; end; end; destructor TMaskList.Destroy; begin FMasks.Free; inherited Destroy; end; function TMaskList.Matches(const AFileName: String): Boolean; var I: Integer; begin Result := False; for I := 0 to FMasks.Count - 1 do begin if TMask(FMasks.Items[I]).Matches(AFileName) then begin Result := True; Exit; end; end; end; end. doublecmd-0.5.8/src/fchecksumverify.lrt0000644000175000017500000000013211740433676017224 0ustar alexxalexxTFRMCHECKSUMVERIFY.CAPTION=Verify check sum... TFRMCHECKSUMVERIFY.BTNCLOSE.CAPTION=&Close doublecmd-0.5.8/src/uwdxmodule.pas0000644000175000017500000010443012213067247016205 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- WDX-API implementation. (TC WDX-API v1.5) Copyright (C) 2008 Dmitry Kolomiets (B4rr4cuda@rambler.ru) Some ideas were found in sources of WdxGuide by Alexey Torgashin and SuperWDX by Pavel Dubrovsky and Dmitry Vorotilin. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uWDXModule; {$mode delphi}{$H+} interface uses {$IFDEF MSWINDOWS} Windows, {$ENDIF} Classes, SysUtils, DCClassesUtf8, uWdxPrototypes, WdxPlugin, dynlibs, uDetectStr, lua, uFile, DCXmlConfig; type { TWdxField } TWdxField = class FName: String; FUnits: String; FType: Integer; function GetUnitIndex(UnitName: String): Integer; end; { TWDXModule } TWDXModule = class private function GetAName: String; virtual; abstract; function GetAFileName: String; virtual; abstract; function GetADetectStr: String; virtual; abstract; procedure SetAName(AValue: String); virtual; abstract; procedure SetAFileName(AValue: String); virtual; abstract; procedure SetADetectStr(const AValue: String); virtual; abstract; public //--------------------- function LoadModule: Boolean; virtual; abstract; procedure UnloadModule; virtual; abstract; function IsLoaded: Boolean; virtual; abstract; //--------------------- function FieldList: TStringList; virtual; abstract; function WdxFieldType(n: Integer): String; function GetFieldIndex(FieldName: String): Integer; virtual; abstract; function FileParamVSDetectStr(const aFile: TFile): Boolean; virtual; abstract; //------------------------------------------------------ procedure CallContentGetSupportedField; virtual; abstract; procedure CallContentSetDefaultParams; virtual; abstract; procedure CallContentStopGetValue(FileName: String); virtual; abstract; //--------------------- function CallContentGetDefaultSortOrder(FieldIndex: Integer): Boolean; virtual; abstract; function CallContentGetDetectString: String; virtual; abstract; function CallContentGetValue(FileName: String; FieldName: String; UnitName: String; flags: Integer): String; overload; virtual; abstract; function CallContentGetValue(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): String; overload; virtual; abstract; function CallContentGetSupportedFieldFlags(FieldIndex: Integer): Integer; virtual; abstract; {ContentSetValue ContentEditValue ContentSendStateInformation} //------------------------------------------------------ property Name: String read GetAName write SetAName; property FileName: String read GetAFileName write SetAFileName; property DetectStr: String read GetADetectStr write SetADetectStr; //--------------------- end; { TPluginWDX } TPluginWDX = class(TWDXModule) private FFieldsList: TStringList; FModuleHandle: TLibHandle; // Handle to .DLL or .so FForce: Boolean; FParser: TParserControl; FName: String; FFileName: String; FDetectStr: String; function GetAName: String; override; function GetAFileName: String; override; function GetADetectStr: String; override; procedure SetAName(AValue: String); override; procedure SetAFileName(AValue: String); override; procedure SetADetectStr(const AValue: String); override; protected //a) Mandatory (must be implemented) ContentGetSupportedField: TContentGetSupportedField; ContentGetValue: TContentGetValue; //b) Optional (must NOT be implemented if unsupported!) ContentGetDetectString: TContentGetDetectString; ContentSetDefaultParams: TContentSetDefaultParams; ContentStopGetValue: TContentStopGetValue; ContentGetDefaultSortOrder: TContentGetDefaultSortOrder; ContentPluginUnloading: TContentPluginUnloading; ContentGetSupportedFieldFlags: TContentGetSupportedFieldFlags; ContentSetValue: TContentSetValue; ContentEditValue: TContentEditValue; ContentSendStateInformation: TContentSendStateInformation; //c) Unicode ContentGetValueW: TContentGetValueW; ContentStopGetValueW: TContentStopGetValueW; ContentSetValueW: TContentSetValueW; ContentSendStateInformationW: TContentSendStateInformationW; public //--------------------- constructor Create; destructor Destroy; override; //--------------------- function LoadModule: Boolean; override; procedure UnloadModule; override; function IsLoaded: Boolean; override; //--------------------- function FieldList: TStringList; override; function GetFieldIndex(FieldName: String): Integer; override; function FileParamVSDetectStr(const aFile: TFile): Boolean; override; //------------------------------------------------------ procedure CallContentGetSupportedField; override; procedure CallContentSetDefaultParams; override; procedure CallContentStopGetValue(FileName: String); override; //--------------------- function CallContentGetDefaultSortOrder(FieldIndex: Integer): Boolean; override; function CallContentGetDetectString: String; override; function CallContentGetValue(FileName: String; FieldName: String; UnitName: String; flags: Integer): String; overload; override; function CallContentGetValue(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): String; overload; override; function CallContentGetSupportedFieldFlags(FieldIndex: Integer): Integer; override; {ContentSetValue ContentEditValue ContentSendStateInformation} //------------------------------------------------------ property ModuleHandle: TLibHandle read FModuleHandle write FModuleHandle; property Force: Boolean read FForce write FForce; property Name: String read GetAName write SetAName; property FileName: String read GetAFileName write SetAFileName; property DetectStr: String read GetADetectStr write SetADetectStr; //--------------------- end; { TLuaWdx } TLuaWdx = class(TWdxModule) private L: Plua_State; FFieldsList: TStringList; FForce: Boolean; FParser: TParserControl; FName: String; FFileName: String; FDetectStr: String; function GetAName: String; override; function GetAFileName: String; override; function GetADetectStr: String; override; procedure SetAName(AValue: String); override; procedure SetAFileName(AValue: String); override; procedure SetADetectStr(const AValue: String); override; function DoScript(AName: String): Integer; function WdxLuaContentGetSupportedField(Index: Integer; var xFieldName, xUnits: String): Integer; procedure WdxLuaContentPluginUnloading; public constructor Create; destructor Destroy; override; //--------------------- function LoadModule: Boolean; override; procedure UnloadModule; override; function IsLoaded: Boolean; override; //--------------------- function FieldList: TStringList; override; function GetFieldIndex(FieldName: String): Integer; override; function FileParamVSDetectStr(const aFile: TFile): Boolean; override; //------------------------------------------------------ procedure CallContentGetSupportedField; override; procedure CallContentSetDefaultParams; override; procedure CallContentStopGetValue(FileName: String); override; //--------------------- function CallContentGetDefaultSortOrder(FieldIndex: Integer): Boolean; override; function CallContentGetDetectString: String; override; function CallContentGetValue(FileName: String; FieldName: String; UnitName: String; flags: Integer): String; overload; override; function CallContentGetValue(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): String; overload; override; function CallContentGetSupportedFieldFlags(FieldIndex: Integer): Integer; override; //--------------------- property Force: Boolean read FForce write FForce; property Name: String read GetAName write SetAName; property FileName: String read GetAFileName write SetAFileName; property DetectStr: String read GetADetectStr write SetADetectStr; end; { TWDXModuleList } TWDXModuleList = class private Flist: TStringList; function GetCount: Integer; public //--------------------- constructor Create; destructor Destroy; override; //--------------------- procedure Assign(Source: TWDXModuleList); procedure Clear; procedure Exchange(Index1, Index2: Integer); procedure Load(Ini: TIniFileEx); overload; procedure Load(AConfig: TXmlConfig; ANode: TXmlNode); overload; procedure Save(Ini: TIniFileEx); overload; procedure Save(AConfig: TXmlConfig; ANode: TXmlNode); overload; procedure DeleteItem(Index: Integer); //--------------------- function Add(Item: TWDXModule): Integer; overload; function Add(FileName: String): Integer; overload; function Add(AName, FileName, DetectStr: String): Integer; overload; function IsLoaded(AName: String): Boolean; overload; function IsLoaded(Index: Integer): Boolean; overload; function LoadModule(AName: String): Boolean; overload; function LoadModule(Index: Integer): Boolean; overload; function GetWdxModule(Index: Integer): TWDXModule; overload; function GetWdxModule(AName: String): TWDXModule; overload; //--------------------- //property WdxList:TStringList read Flist; property Count: Integer read GetCount; end; implementation uses StrUtils, uGlobs, uGlobsPaths, FileUtil, uDebug, uDCUtils, uOSUtils, DCOSUtils; const WdxIniFileName = 'wdx.ini'; { TWDXModuleList } function TWDXModuleList.GetCount: Integer; begin if Assigned(Flist) then Result := Flist.Count else Result := 0; end; constructor TWDXModuleList.Create; begin Flist := TStringList.Create; end; destructor TWDXModuleList.Destroy; begin Clear; FreeAndNil(Flist); inherited Destroy; end; procedure TWDXModuleList.Assign(Source: TWDXModuleList); var I: Integer; begin if Assigned(Source) then begin Clear; for I := 0 to Source.Flist.Count - 1 do begin with TWdxModule(Source.Flist.Objects[I]) do Add(Name, FileName, DetectStr); end; end; end; procedure TWDXModuleList.Clear; var i: Integer; begin for i := 0 to Flist.Count - 1 do TWDXModule(Flist.Objects[i]).Free; Flist.Clear; end; procedure TWDXModuleList.Exchange(Index1, Index2: Integer); begin FList.Exchange(Index1, Index2); end; procedure TWDXModuleList.Load(Ini: TIniFileEx); var Count, I: Integer; tmp, tp: String; begin Self.Clear; Count := Ini.ReadInteger('Content Plugins', 'PluginCount', 0); if Count = 0 then Exit; For i := 0 to Count - 1 do begin tmp := Ini.ReadString('Content Plugins', 'Plugin' + IntToStr(I + 1) + 'Name', ''); // читать FileName - читать расширение и создавать нужный обьект tp := GetCmdDirFromEnvVar(Ini.ReadString('Content Plugins', 'Plugin' + IntToStr(I + 1) + 'Path', '')); DCDebug('WDX:LOAD:' + tp); if UpCase(ExtractFileExt(tp)) = '.LUA' then Flist.AddObject(UpCase(tmp), TLuaWdx.Create) else Flist.AddObject(UpCase(tmp), TPluginWDX.Create); TWDXModule(Flist.Objects[I]).Name := tmp; TWDXModule(Flist.Objects[I]).DetectStr := Ini.ReadString('Content Plugins', 'Plugin' + IntToStr(I + 1) + 'Detect', ''); TWDXModule(Flist.Objects[I]).FileName := tp;//GetCmdDirFromEnvVar(Ini.ReadString('Content Plugins','Plugin'+IntToStr(I+1)+'Path','')); end; end; procedure TWDXModuleList.Load(AConfig: TXmlConfig; ANode: TXmlNode); var AName, APath: String; AWdxModule: TWDXModule; begin Self.Clear; ANode := ANode.FindNode('WdxPlugins'); if Assigned(ANode) then begin ANode := ANode.FirstChild; while Assigned(ANode) do begin if ANode.CompareName('WdxPlugin') = 0 then begin if AConfig.TryGetValue(ANode, 'Name', AName) and AConfig.TryGetValue(ANode, 'Path', APath) then begin // Create a correct object based on plugin file extension. APath := GetCmdDirFromEnvVar(APath); DCDebug('WDX: LOAD: ' + APath); if UpCase(ExtractFileExt(APath)) = '.LUA' then AWdxModule := TLuaWdx.Create else AWdxModule := TPluginWDX.Create; AWdxModule.Name := AName; AWdxModule.FileName := APath; AWdxModule.DetectStr := AConfig.GetValue(ANode, 'DetectString', ''); Flist.AddObject(UpCase(AName), AWdxModule); end else DCDebug('Invalid entry in configuration: ' + AConfig.GetPathFromNode(ANode) + '.'); end; ANode := ANode.NextSibling; end; end; end; procedure TWDXModuleList.Save(Ini: TIniFileEx); var i: Integer; begin Ini.EraseSection('Content Plugins'); Ini.WriteInteger('Content Plugins', 'PluginCount', Flist.Count); For i := 0 to Flist.Count - 1 do begin Ini.WriteString('Content Plugins', 'Plugin' + IntToStr(I + 1) + 'Name', TWDXModule(Flist.Objects[I]).Name); Ini.WriteString('Content Plugins', 'Plugin' + IntToStr(I + 1) + 'Detect', TWDXModule(Flist.Objects[I]).DetectStr); Ini.WriteString('Content Plugins', 'Plugin' + IntToStr(I + 1) + 'Path', SetCmdDirAsEnvVar(TWDXModule(Flist.Objects[I]).FileName)); end; end; procedure TWDXModuleList.Save(AConfig: TXmlConfig; ANode: TXmlNode); var i: Integer; SubNode: TXmlNode; begin ANode := AConfig.FindNode(ANode, 'WdxPlugins', True); AConfig.ClearNode(ANode); For i := 0 to Flist.Count - 1 do begin SubNode := AConfig.AddNode(ANode, 'WdxPlugin'); AConfig.AddValue(SubNode, 'Name', TWDXModule(Flist.Objects[I]).Name); AConfig.AddValue(SubNode, 'Path', SetCmdDirAsEnvVar(TWDXModule(Flist.Objects[I]).FileName)); AConfig.AddValue(SubNode, 'DetectString', TWDXModule(Flist.Objects[I]).DetectStr); end; end; procedure TWDXModuleList.DeleteItem(Index: Integer); begin if (Index > -1) and (Index < Flist.Count) then begin TWDXModule(Flist.Objects[Index]).Free; Flist.Delete(Index); end; end; function TWDXModuleList.Add(Item: TWDXModule): Integer; begin Result := Flist.AddObject(UpCase(item.Name), Item); end; function TWDXModuleList.Add(FileName: String): Integer; var s: String; begin s := ExtractFileName(FileName); if pos('.', s) > 0 then Delete(s, pos('.', s), length(s)); if UpCase(ExtractFileExt(FileName)) = '.LUA' then Result := Flist.AddObject(UpCase(s), TLuaWdx.Create) else Result := Flist.AddObject(UpCase(s), TPluginWDX.Create); TWDXModule(Flist.Objects[Result]).Name := s; TWDXModule(Flist.Objects[Result]).FileName := FileName; if TWDXModule(Flist.Objects[Result]).LoadModule then begin TWDXModule(Flist.Objects[Result]).DetectStr := TWDXModule(Flist.Objects[Result]).CallContentGetDetectString; TWDXModule(Flist.Objects[Result]).UnloadModule; end; end; function TWDXModuleList.Add(AName, FileName, DetectStr: String): Integer; begin if UpCase(ExtractFileExt(FileName)) = '.LUA' then Result := Flist.AddObject(UpCase(AName), TLuaWdx.Create) else Result := Flist.AddObject(UpCase(AName), TPluginWDX.Create); TWDXModule(Flist.Objects[Result]).Name := AName; TWDXModule(Flist.Objects[Result]).DetectStr := DetectStr; TWDXModule(Flist.Objects[Result]).FileName := FileName; end; function TWDXModuleList.IsLoaded(AName: String): Boolean; var x: Integer; begin x := Flist.IndexOf(AName); if x = -1 then Result := False else begin Result := GetWdxModule(x).IsLoaded; end; end; function TWDXModuleList.IsLoaded(Index: Integer): Boolean; begin Result := GetWdxModule(Index).IsLoaded; end; function TWDXModuleList.LoadModule(AName: String): Boolean; var x: Integer; begin x := Flist.IndexOf(UpCase(AName)); if x = -1 then Result := False else begin Result := GetWdxModule(x).LoadModule; end; end; function TWDXModuleList.LoadModule(Index: Integer): Boolean; begin Result := GetWdxModule(Index).LoadModule; end; function TWDXModuleList.GetWdxModule(Index: Integer): TWDXModule; begin if (Flist.Objects[Index] is TPluginWDX) then Result := TPluginWDX(Flist.Objects[Index]) else if (Flist.Objects[Index] is TLuaWdx) then Result := TLuaWdx(Flist.Objects[Index]); end; function TWDXModuleList.GetWdxModule(AName: String): TWDXModule; var tmp: Integer; begin tmp := Flist.IndexOf(upcase(AName)); if tmp > -1 then begin if (Flist.Objects[tmp] is TPluginWDX) then Result := TPluginWDX(Flist.Objects[tmp]) else if (Flist.Objects[tmp] is TLuaWdx) then Result := TLuaWdx(Flist.Objects[tmp]); end; end; { TPluginWDX } function TPluginWDX.IsLoaded: Boolean; begin Result := FModuleHandle <> 0; end; function TPluginWDX.FieldList: TStringList; begin Result := FFieldsList; end; function TPluginWDX.GetADetectStr: String; begin Result := FDetectStr; end; function TPluginWDX.GetAName: String; begin Result := FName; end; function TPluginWDX.GetAFileName: String; begin Result := FFileName; end; procedure TPluginWDX.SetADetectStr(const AValue: String); begin FDetectStr := AValue; end; procedure TPluginWDX.SetAName(AValue: String); begin FName := AValue; end; procedure TPluginWDX.SetAFileName(AValue: String); begin FFileName := AValue; end; constructor TPluginWDX.Create; begin FFieldsList := TStringList.Create; FParser := TParserControl.Create; end; destructor TPluginWDX.Destroy; var i: Integer; begin if assigned(FParser) then FParser.Free; if assigned(FFieldsList) then begin for i := 0 to FFieldsList.Count - 1 do TWdxField(FFieldsList.Objects[i]).Free; FFieldsList.Free; end; Self.UnloadModule; inherited Destroy; end; function TPluginWDX.LoadModule: Boolean; begin FModuleHandle := mbLoadLibrary(Self.FileName); Result := (FModuleHandle <> 0); if FModuleHandle = 0 then exit; { Mandatory } ContentGetSupportedField := TContentGetSupportedField(GetProcAddress(FModuleHandle, 'ContentGetSupportedField')); ContentGetValue := TContentGetValue(GetProcAddress(FModuleHandle, 'ContentGetValue')); { Optional (must NOT be implemented if unsupported!) } ContentGetDetectString := TContentGetDetectString(GetProcAddress(FModuleHandle, 'ContentGetDetectString')); ContentSetDefaultParams := TContentSetDefaultParams(GetProcAddress(FModuleHandle, 'ContentSetDefaultParams')); ContentStopGetValue := TContentStopGetValue(GetProcAddress(FModuleHandle, 'ContentStopGetValue')); ContentGetDefaultSortOrder := TContentGetDefaultSortOrder(GetProcAddress(FModuleHandle, 'ContentGetDefaultSortOrder')); ContentPluginUnloading := TContentPluginUnloading(GetProcAddress(FModuleHandle, 'ContentPluginUnloading')); ContentGetSupportedFieldFlags := TContentGetSupportedFieldFlags(GetProcAddress(FModuleHandle, 'ContentGetSupportedFieldFlags')); ContentSetValue := TContentSetValue(GetProcAddress(FModuleHandle, 'ContentSetValue')); ContentEditValue := TContentEditValue(GetProcAddress(FModuleHandle, 'ContentEditValue')); ContentSendStateInformation := TContentSendStateInformation(GetProcAddress(FModuleHandle, 'ContentSendStateInformation')); { Unicode } ContentGetValueW := TContentGetValueW(GetProcAddress(FModuleHandle, 'ContentGetValueW')); ContentStopGetValueW := TContentStopGetValueW(GetProcAddress(FModuleHandle, 'ContentStopGetValueW')); ContentSetValueW := TContentSetValueW(GetProcAddress(FModuleHandle, 'ContentSetValueW')); ContentSendStateInformationW := TContentSendStateInformationW(GetProcAddress(FModuleHandle, 'ContentSendStateInformationW')); CallContentSetDefaultParams; CallContentGetSupportedField; if Length(Self.DetectStr) = 0 then Self.DetectStr := CallContentGetDetectString; end; procedure TPluginWDX.CallContentSetDefaultParams; var dps: tContentDefaultParamStruct; begin if assigned(ContentSetDefaultParams) then begin dps.DefaultIniName := mbFileNameToSysEnc(gpCfgDir + WdxIniFileName); dps.PluginInterfaceVersionHi := 1; dps.PluginInterfaceVersionLow := 50; dps.size := SizeOf(tContentDefaultParamStruct); ContentSetDefaultParams(@dps); end; end; procedure TPluginWDX.CallContentStopGetValue(FileName: String); begin if Assigned(ContentStopGetValueW) then ContentStopGetValueW(PWideChar(UTF8Decode(FileName))) else if Assigned(ContentStopGetValue) then ContentStopGetValue(PAnsiChar(UTF8ToSys(FileName))); end; function TPluginWDX.CallContentGetDefaultSortOrder(FieldIndex: Integer): Boolean; var x: Integer; begin if Assigned(ContentGetDefaultSortOrder) then begin x := ContentGetDefaultSortOrder(FieldIndex); case x of 1: Result := False; //a..z 1..9 -1: Result := True; //z..a 9..1 end; end; end; procedure TPluginWDX.UnloadModule; begin if assigned(ContentPluginUnloading) then ContentPluginUnloading; {$IF (not DEFINED(LINUX)) or ((FPC_VERSION > 2) or ((FPC_VERSION=2) and (FPC_RELEASE >= 5)))} if FModuleHandle <> 0 then FreeLibrary(FModuleHandle); {$ENDIF} FModuleHandle := 0; { Mandatory } ContentGetSupportedField := nil; ContentGetValue := nil; { Optional (must NOT be implemented if unsupported!) } ContentGetDetectString := nil; ContentSetDefaultParams := nil; ContentStopGetValue := nil; ContentGetDefaultSortOrder := nil; ContentPluginUnloading := nil; ContentGetSupportedFieldFlags := nil; ContentSetValue := nil; ContentEditValue := nil; ContentSendStateInformation := nil; { Unicode } ContentGetValueW := nil; ContentStopGetValueW := nil; ContentSetValueW := nil; ContentSendStateInformationW := nil; end; procedure TPluginWDX.CallContentGetSupportedField; var Index, MaxLen, I, Rez: Integer; xFieldName: PAnsiChar; xUnits: PAnsiChar; sFieldName: UTF8String; begin if not Assigned(ContentGetSupportedField) then Exit; Index := 0; GetMem(xFieldName, MAX_PATH); GetMem(xUnits, MAX_PATH); maxlen := MAX_PATH; repeat Rez := ContentGetSupportedField(Index, xFieldName, xUnits, MaxLen); if Rez <> ft_nomorefields then begin sFieldName := SysToUTF8(StrPas(xFieldName)); I := FFieldsList.AddObject(sFieldName, TWdxField.Create); with TWdxField(FFieldsList.Objects[I]) do begin FName := sFieldName; FUnits := xUnits; FType := Rez; end; end; Inc(Index); until Rez = ft_nomorefields; FreeMem(xFieldName); FreeMem(xUnits); end; function TPluginWDX.CallContentGetDetectString: String; var pacDetectString: PAnsiChar; begin if Assigned(ContentGetDetectString) then begin GetMem(pacDetectString, MAX_PATH); FillChar(pacDetectString^, MAX_PATH, #0); ContentGetDetectString(pacDetectString, MAX_PATH); Result := StrPas(pacDetectString); FreeMem(pacDetectString); end else Result := ''; end; function TPluginWDX.CallContentGetValue(FileName: String; FieldName: String; UnitName: String; flags: Integer): String; var FieldIndex, UnitIndex: Integer; begin FieldIndex := GetFieldIndex(FieldName); if FieldIndex <> -1 then begin UnitIndex := TWdxField(FieldList.Objects[FieldIndex]).GetUnitIndex(UnitName); Result := CallContentGetValue(FileName, FieldIndex, UnitIndex, flags); end else Result := EmptyStr; end; function TPluginWDX.CallContentGetValue(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): String; var Rez: Integer; Buf: array[0..2 * 1024] of Byte; fnval: Integer absolute buf; fnval64: Int64 absolute buf; ffval: Double absolute buf; fdate: TDateFormat absolute buf; ftime: TTimeFormat absolute buf; {$IF DEFINED(MSWINDOWS)} xtime: Windows.FILETIME absolute buf; {$ELSEIF DEFINED(UNIX)} dtime: TDateTime absolute buf; {$ENDIF} stime: TSystemTime; begin if Assigned(ContentGetValueW) then Rez := ContentGetValueW(PWideChar(UTF8Decode(FileName)), FieldIndex, UnitIndex, @Buf, SizeOf(buf), flags) else if Assigned(ContentGetValue) then Rez := ContentGetValue(PAnsiChar(UTF8ToSys(FileName)), FieldIndex, UnitIndex, @Buf, SizeOf(buf), flags); case Rez of ft_fieldempty: Result := ''; ft_numeric_32: Result := IntToStr(fnval); ft_numeric_64: Result := IntToStr(fnval64); ft_numeric_floating: Result := FloatToStr(ffval); ft_date: Result := Format('%2.2d.%2.2d.%4.4d', [fdate.wDay, fdate.wMonth, fdate.wYear]); ft_time: Result := Format('%2.2d:%2.2d:%2.2d', [ftime.wHour, ftime.wMinute, ftime.wSecond]); ft_datetime: begin {$IF DEFINED(MSWINDOWS)} Windows.FileTimeToSystemTime(xtime, stime); Result := Format('%2.2d.%2.2d.%4.4d %2.2d:%2.2d:%2.2d', [stime.wDay, stime.wMonth, stime.wYear, stime.wHour, stime.wMinute, stime.wSecond]); {$ELSEIF DEFINED(UNIX)} DateTimeToSystemTime(dtime, stime); Result := Format('%2.2d.%2.2d.%4.4d %2.2d:%2.2d:%2.2d', [stime.Day, stime.Month, stime.Year, stime.Hour, stime.Minute, stime.Second]); {$ENDIF} end; ft_boolean: if fnval = 0 then Result := 'FALSE' else Result := 'TRUE'; ft_multiplechoice, ft_string, ft_fulltext: Result := SysToUTF8(AnsiString(PAnsiChar(@Buf[0]))); ft_stringw: Result := UTF8Encode(WideString(PWideChar(@Buf[0]))); //TODO: FT_DELAYED,ft_ondemand else Result := ''; end; end; function TPluginWDX.CallContentGetSupportedFieldFlags(FieldIndex: Integer): Integer; begin if assigned(ContentGetSupportedFieldFlags) then Result := ContentGetSupportedFieldFlags(FieldIndex); end; function TPluginWDX.GetFieldIndex(FieldName: String): Integer; begin Result := FFieldsList.IndexOf(FieldName); end; function TPluginWDX.FileParamVSDetectStr(const aFile: TFile): Boolean; begin FParser.DetectStr := Self.DetectStr; Result := FParser.TestFileResult(aFile); end; { TLuaWdx } function TLuaWdx.GetAName: String; begin Result := FName; end; function TLuaWdx.GetAFileName: String; begin Result := FFileName; end; function TLuaWdx.GetADetectStr: String; begin Result := FDetectStr; end; procedure TLuaWdx.SetAName(AValue: String); begin FName := AValue; end; procedure TLuaWdx.SetAFileName(AValue: String); begin FFileName := AValue; end; procedure TLuaWdx.SetADetectStr(const AValue: String); begin FDetectStr := AValue; end; function TLuaWdx.DoScript(AName: String): Integer; begin Result := LUA_ERRRUN; if not assigned(L) then exit; Result := luaL_dofile(L, PChar(AName)); end; constructor TLuaWdx.Create; begin if not IsLuaLibLoaded then LoadLuaLib(gLuaLib); //Todo вынести загрузку либы в VmClass FFieldsList := TStringList.Create; FParser := TParserControl.Create; end; destructor TLuaWdx.Destroy; begin if Assigned(FParser) then FParser.Free; if Assigned(FFieldsList) then begin while FFieldsList.Count > 0 do begin TWdxField(FFieldsList.Objects[0]).Free; FFieldsList.Delete(0); end; FreeAndNil(FFieldsList); end; Self.UnloadModule; //UnloadLuaLib; //Todo вынести выгрузку либы в VmClass inherited Destroy; end; function TLuaWdx.LoadModule: Boolean; begin Result := False; if not IsLuaLibLoaded then exit; L := lua_open; if not Assigned(L) then exit; luaL_openlibs(L); if DoScript(Self.FFileName) = 0 then Result := True else Result := False; CallContentSetDefaultParams; CallContentGetSupportedField; if Length(Self.DetectStr) = 0 then Self.DetectStr := CallContentGetDetectString; end; procedure TLuaWdx.UnloadModule; begin WdxLuaContentPluginUnloading; if Assigned(L) then begin lua_close(L); L := nil; end; end; function TLuaWdx.IsLoaded: Boolean; begin Result := IsLuaLibLoaded and Assigned(Self.L); end; function TLuaWdx.FieldList: TStringList; begin Result := FFieldsList; end; function TLuaWdx.GetFieldIndex(FieldName: String): Integer; begin Result := FFieldsList.IndexOf(FieldName); end; function TLuaWdx.FileParamVSDetectStr(const aFile: TFile): Boolean; begin FParser.DetectStr := Self.DetectStr; Result := FParser.TestFileResult(aFile); end; function TLuaWdx.WdxLuaContentGetSupportedField(Index: Integer; var xFieldName, xUnits: String): Integer; begin Result := ft_nomorefields; if not assigned(L) then exit; lua_getglobal(L, 'ContentGetSupportedField'); if not lua_isfunction(L, -1) then exit; lua_pushinteger(L, Index); lua_call(L, 1, 3); xFieldName := lua_tostring(L, -3); xUnits := lua_tostring(L, -2); Result := lua_tointeger(L, -1); lua_pop(L, 3); end; procedure TLuaWdx.WdxLuaContentPluginUnloading; begin if not assigned(L) then exit; lua_getglobal(L, 'ContentPluginUnloading'); if not lua_isfunction(L, -1) then exit; lua_call(L, 0, 0); end; procedure TLuaWdx.CallContentGetSupportedField; var Index, Rez, tmp: Integer; xFieldName, xUnits: String; begin Index := 0; repeat Rez := WdxLuaContentGetSupportedField(Index, xFieldName, xUnits); DCDebug('WDX:CallGetSupFields:' + IntToStr(Rez)); if Rez <> ft_nomorefields then begin tmp := FFieldsList.AddObject(xFieldName, TWdxField.Create); TWdxField(FFieldsList.Objects[tmp]).FName := xFieldName; TWdxField(FFieldsList.Objects[tmp]).FUnits := xUnits; TWdxField(FFieldsList.Objects[tmp]).FType := Rez; end; Inc(Index); until Rez = ft_nomorefields; end; procedure TLuaWdx.CallContentSetDefaultParams; begin if not assigned(L) then exit; lua_getglobal(L, 'ContentSetDefaultParams'); if not lua_isfunction(L, -1) then exit; lua_pushstring(L, PChar(gpCfgDir + WdxIniFileName)); lua_pushinteger(L, 1); lua_pushinteger(L, 50); lua_call(L, 3, 0); end; procedure TLuaWdx.CallContentStopGetValue(FileName: String); begin if not assigned(L) then exit; lua_getglobal(L, 'ContentStopGetValue'); if not lua_isfunction(L, -1) then exit; lua_pushstring(L, PChar(FileName)); lua_call(L, 1, 0); end; function TLuaWdx.CallContentGetDefaultSortOrder(FieldIndex: Integer): Boolean; var x: Integer; begin Result := False; if not assigned(L) then exit; lua_getglobal(L, 'ContentGetDefaultSortOrder'); if not lua_isfunction(L, -1) then exit; lua_pushinteger(L, FieldIndex); lua_call(L, 1, 1); x := lua_tointeger(L, -1); case x of 1: Result := False; //a..z 1..9 -1: Result := True; //z..a 9..1 end; lua_pop(L, 1); end; function TLuaWdx.CallContentGetDetectString: String; begin Result := ''; if not assigned(L) then exit; lua_getglobal(L, 'ContentGetDetectString'); if not lua_isfunction(L, -1) then exit; lua_call(L, 0, 1); Result := lua_tostring(L, -1); lua_pop(L, 1); end; function TLuaWdx.CallContentGetValue(FileName: String; FieldName: String; UnitName: String; flags: Integer): String; var FieldIndex, UnitIndex: Integer; begin FieldIndex := GetFieldIndex(FieldName); if FieldIndex <> -1 then begin UnitIndex := TWdxField(FieldList.Objects[FieldIndex]).GetUnitIndex(UnitName); Result := CallContentGetValue(FileName, FieldIndex, UnitIndex, flags); end else Result := EmptyStr; end; function TLuaWdx.CallContentGetValue(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): String; begin Result := ''; if not assigned(L) then exit; lua_getglobal(L, 'ContentGetValue'); if not lua_isfunction(L, -1) then exit; lua_pushstring(L, PChar(FileName)); lua_pushinteger(L, FieldIndex); lua_pushinteger(L, UnitIndex); lua_pushinteger(L, flags); lua_call(L, 4, 1); Result := lua_tostring(L, -1); lua_pop(L, 1); end; function TLuaWdx.CallContentGetSupportedFieldFlags(FieldIndex: Integer): Integer; begin Result := 0; if not assigned(L) then exit; lua_getglobal(L, 'ContentGetSupportedFieldFlags'); if not lua_isfunction(L, -1) then exit; lua_pushinteger(L, FieldIndex); lua_call(L, 1, 1); Result := lua_tointeger(L, -1); lua_pop(L, 1); end; { TWDXModule } function TWDXModule.WdxFieldType(n: Integer): String; begin case n of FT_NUMERIC_32: Result := 'FT_NUMERIC_32'; FT_NUMERIC_64: Result := 'FT_NUMERIC_64'; FT_NUMERIC_FLOATING: Result := 'FT_NUMERIC_FLOATING'; FT_DATE: Result := 'FT_DATE'; FT_TIME: Result := 'FT_TIME'; FT_DATETIME: Result := 'FT_DATETIME'; FT_BOOLEAN: Result := 'FT_BOOLEAN'; FT_MULTIPLECHOICE: Result := 'FT_MULTIPLECHOICE'; FT_STRING: Result := 'FT_STRING'; FT_FULLTEXT: Result := 'FT_FULLTEXT'; FT_NOSUCHFIELD: Result := 'FT_NOSUCHFIELD'; FT_FILEERROR: Result := 'FT_FILEERROR'; FT_FIELDEMPTY: Result := 'FT_FIELDEMPTY'; FT_DELAYED: Result := 'FT_DELAYED'; else Result := '?'; end; end; { TWdxField } function TWdxField.GetUnitIndex(UnitName: String): Integer; var sUnits: String; begin Result := -1; sUnits := FUnits; while sUnits <> EmptyStr do begin Inc(Result); if SameText(UnitName, Copy2SymbDel(sUnits, '|')) then Exit; end; Result := 0; end; end. doublecmd-0.5.8/src/uexts.pas0000644000175000017500000003223612045703752015165 0ustar alexxalexx{ Seksi Commander ---------------------------- Licence : GNU GPL v 2.0 Author : radek.cervinka@centrum.cz storing commands (by file extensions) contributors: Copyright (C) 2008-2011 Koblov Alexander (Alexx2000@mail.ru) } unit uExts; {$mode objfpc}{$H+} interface uses Classes, Contnrs, uFile; type {en Class for storage actions by file extensions } TExtAction = class SectionName: String; //en< Section name, for example "[htm|html|mht]" Name: String; //en< File type name, for example "Hyper text documents" Icon: String; //en< Path to icon IconIndex: Integer; //en< Icon index (used in configuration dialog for paint icons) Extensions: TStringList; //en< List of extensions Actions: TStringList; //en< List of actions, for example "Open=opera '%f'" IsChanged: Boolean; //en< True if item was changed public {en Constructs an object and initializes its data before the object is first used. } constructor Create; {en Destroys an object and frees its memory. } destructor Destroy; override; end; {en Main class for storage actions list by file extensions } TExts = class private {en Return the number of items @returns(The number of items) } function GetCount: Integer; {en Get item by index @param(Index Item index) @returns(TExtAction item) } function GetItems(Index: Integer): TExtAction; protected {en Internal ObjectList for storage items. } FExtList:TObjectList; {en Return new section name for item by index @param(Index Item index) @returns(New section name) } function GetNewSectionName(Index: Integer): String; {en Erase section from file by section line index @param(extFile StringList with loaded extension file) @param(SectionIndex Section line index) @param(SkipComments If @true then don't delete comments) } procedure EraseSection(extFile : TStringList; var SectionIndex: Integer; SkipComments : Boolean = False); public {en Constructs an object and initializes its data before the object is first used. } constructor Create; {en Destroys an object and frees its memory. } destructor Destroy; override; {en Deletes all items. } procedure Clear; {en Inserts a new item at the end of the list @param(AExtAction TExtAction item) @returns(The index of the new item) } function AddItem(AExtAction: TExtAction): Integer; {en Removes the item at the position given by the Index parameter @param(Index Item index) } procedure DeleteItem(Index: Integer); {en Fills the actions list from file @param(sName File name) } procedure LoadFromFile(const sName:String); {en Save the actions list to file @param(sName File name) } procedure SaveToFile(const sName:String); {en Return action command by file and action name @param(aFile File for which action is sought) @param(sActionName Action name) @returns(Action command) } function GetExtActionCmd(aFile: TFile; const sActionName:String):String; {en Return list of actions by extension @param(File File which actions to retrieve) @param(slActions Actions list) @returns(The function returns @true if successful, @false otherwise) } function GetExtActions(aFile: TFile; var slActions:TStringList):Boolean; {en Indicates the number of items } property Count: Integer read GetCount; {en Give access to items by index } property Items[Index: Integer]: TExtAction read GetItems; end; const cMaskDefault = 'default'; cMaskFolder = 'folder'; cMaskFile = 'file'; implementation uses SysUtils, uLog, DCClassesUtf8, DCOSUtils, uDebug; constructor TExtAction.Create; begin Extensions := TStringList.Create; Actions := TStringList.Create; Actions.CaseSensitive:= False; end; destructor TExtAction.Destroy; begin if Assigned(Extensions) then FreeAndNil(Extensions); if Assigned(Actions) then FreeAndNil(Actions); inherited end; procedure TExts.LoadFromFile(const sName:String); var extFile: TStringListEx; sLine, s, sExt: String; extcmd: TExtAction; I, iIndex: Integer; begin extFile:= TStringListEx.Create; try extFile.LoadFromFile(sName); extcmd:=nil; for I:= 0 to extFile.Count - 1 do begin sLine:= extFile.Strings[I]; sLine:= Trim(sLine); if (sLine='') or (sLine[1]='#') then Continue; // writeln(sLine); if sLine[1]='[' then begin extCmd:= TExtAction.Create; FExtList.Add(extcmd); iIndex:=pos(']', sLine); if iIndex>0 then sLine:=Copy(sLine,1,iIndex) else logWrite('] not found in line '+sLine); { add | for easy searching in two and more extensions now I can search for example |pas| or |z| } extCmd.SectionName:=LowerCase(sLine); // fill extensions list s := LowerCase(sLine); Delete(s, 1, 1); // Delete '[' Delete(s, Length(s), 1); // Delete ']' s := s + '|'; while Pos('|', s) <> 0 do begin iIndex := Pos('|',s); sExt := Copy(s,1,iIndex-1); Delete(s, 1, iIndex); extCmd.Extensions.Add(sExt); end; end // end if.. '[' else begin // this must be a command if not assigned(extCmd) then begin logWrite('Command '+sLine+' have not defined extension - ignored.'); Continue; end; // now set command to lowercase s := sLine; for iIndex:=1 to Length(s) do begin if s[iIndex]='=' then Break; s[iIndex]:= LowerCase(s[iIndex]); end; // DCDebug(sLine); if Pos('name', s) = 1 then // File type name extCmd.Name := Copy(sLine, iIndex + 1, Length(sLine)) else if Pos('icon', s) = 1 then // File type icon extCmd.Icon := Copy(sLine, iIndex + 1, Length(sLine)) else // action extCmd.Actions.Add(sLine); end; end; finally extFile.Free; end; end; function TExts.GetNewSectionName(Index: Integer): String; var I, iCount: Integer; begin with GetItems(Index) do begin iCount := Extensions.Count - 1; Result := Extensions[0]; for I:= 1 to iCount do Result := Result + '|' + Extensions[I]; end; Result := '[' + Result + ']'; end; procedure TExts.EraseSection(extFile : TStringList; var SectionIndex: Integer; SkipComments : Boolean = False); var sLine : String; begin repeat if SkipComments and (Pos('#', Trim(extFile.Strings[SectionIndex]))=1) then Inc(SectionIndex) else extFile.Delete(SectionIndex); if SectionIndex >= extFile.Count then Exit; sLine := extFile.Strings[SectionIndex]; //DCDebug('sLine = ', sLine); until ((Pos('[', sLine)<>0) and (Pos(']', sLine)<>0)) or ((Pos('#', sLine)<>0) and (Pos('[', extFile.Strings[SectionIndex+1])<>0) and (Pos(']', extFile.Strings[SectionIndex+1])<>0)); end; procedure TExts.SaveToFile(const sName: String); var I, J, iIndex, iCount, iBegin, iEnd : Integer; extFile : TStringListEx; sLine, sNewName, sSectionName: String; bExists: Boolean; begin extFile := TStringListEx.Create; if mbFileExists(sName) then begin extFile.LoadFromFile(sName); // first rename sections if needed iCount := Count - 1; for I := 0 to iCount do with GetItems(I) do begin sNewName := GetNewSectionName(I); if (SectionName <> sNewName) and // SectionName might be empty for new items (SectionName <> '') then begin iIndex := extFile.IndexOf(SectionName); if iIndex >= 0 then begin extFile.Strings[iIndex] := sNewName; // Update section name so it doesn't get deleted below. SectionName := sNewName; end; end; end; // second delete old sections I := 0; iCount := extFile.Count - 1; while I <= iCount do begin sLine := Trim(extFile.Strings[I]); iBegin := Pos('[', sLine); iEnd := Pos(']', sLine); if (iBegin = 1) and (iEnd <> 0) then begin sSectionName := LowerCase(Copy(extFile.Strings[I], iBegin, iEnd)); bExists := False; for J := 0 to Count - 1 do begin //DCDebug('sSectionName = ', sSectionName); //DCDebug('GetItems(J).SectionName = ', GetItems(J).SectionName); if sSectionName = GetItems(J).SectionName then begin bExists := True; Break; end; end; // for if not bExists then // delete section begin EraseSection(extFile, I); iCount := extFile.Count - 1; end; end; Inc(I); end; // while // third rewrite changed sections iCount := Count - 1; for I := 0 to iCount do with GetItems(I) do begin if IsChanged then begin sNewName := GetNewSectionName(I); iIndex := extFile.IndexOf(sNewName); if iIndex >= 0 then // if section exists then insert actions begin Inc(iIndex); // skip section name EraseSection(extFile, iIndex, True); if Name <> '' then begin extFile.Insert(iIndex, 'Name=' + Name); Inc(iIndex); end; if Icon <> '' then begin extFile.Insert(iIndex, 'Icon=' + Icon); Inc(iIndex); end; for J := 0 to Actions.Count - 1 do begin extFile.Insert(iIndex, Actions.Strings[J]); Inc(iIndex); end; extFile.Insert(iIndex, ''); // add empty line end else // else add new section begin extFile.Add(sNewName); // section if Name <> '' then extFile.Add('Name=' + Name); // file type name if Icon <> '' then extFile.Add('Icon=' + Icon); // icon path for J := 0 to Actions.Count - 1 do extFile.Add(Actions.Strings[J]); extFile.Add(''); // add empty line end; end; end; end // mbFileExists else begin iCount := Count - 1; for I := 0 to iCount do with GetItems(I) do begin extFile.Add(GetNewSectionName(I)); if Name <> '' then extFile.Add('Name=' + Name); // file type name if Icon <> '' then extFile.Add('Icon=' + Icon); // icon path for J := 0 to Actions.Count - 1 do extFile.Add(Actions.Strings[J]); extFile.Add(''); // add empty line end; end; try extFile.SaveToFile(sName); except on e: EStreamError do DCDebug(Format('Error saving file associations to "%s": %s', [sName, e.Message])); end; extFile.Free; end; function TExts.GetExtActions(aFile: TFile; var slActions:TStringList):Boolean; var I: Integer; sMask: String; begin Result:= False; if aFile.IsDirectory or aFile.IsLinkToDirectory then sMask:= cMaskFolder else sMask:= LowerCase(aFile.Extension); if Length(sMask) <> 0 then for I:= 0 to FExtList.Count - 1 do with GetItems(i) do begin if Extensions.IndexOf(sMask) >= 0 then begin slActions.Assign(Actions); Result:= True; Break; end; end; if sMask = cMaskFolder then Exit; for I:= 0 to FExtList.Count - 1 do with GetItems(i) do begin if Extensions.IndexOf(cMaskFile) >= 0 then begin slActions.AddStrings(Actions); Result:= True; Break; end; end; end; function TExts.GetCount: Integer; begin Result := FExtList.Count; end; function TExts.GetItems(Index: Integer): TExtAction; begin Result := TExtAction(FExtList.Items[Index]); end; constructor TExts.Create; begin FExtList:=TObjectList.Create; end; destructor TExts.Destroy; begin if assigned(FExtList) then FreeAndNil(FExtList); inherited end; procedure TExts.Clear; begin FExtList.Clear; end; function TExts.AddItem(AExtAction: TExtAction): Integer; begin Result := FExtList.Add(AExtAction); end; procedure TExts.DeleteItem(Index: Integer); begin FExtList.Delete(Index); end; function TExts.GetExtActionCmd(aFile: TFile; const sActionName:String):String; var I: Integer; sMask: String; begin Result:= EmptyStr; if aFile.IsDirectory or aFile.IsLinkToDirectory then sMask:= cMaskFolder else sMask:= LowerCase(aFile.Extension); if Length(sMask) <> 0 then for I:= 0 to FExtList.Count - 1 do with GetItems(I) do begin if Extensions.IndexOf(sMask) >= 0 then begin Result:= Actions.Values[sActionName]; Exit; end; end; // if command not found then try to find default command for I:= 0 to FExtList.Count - 1 do with GetItems(I) do begin if Extensions.IndexOf(cMaskDefault) >= 0 then begin Result:=Actions.Values[sActionName]; Break; end; end; end; end. doublecmd-0.5.8/src/fextractdlg.pas0000644000175000017500000002260112140163771016314 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- File unpacking window Copyright (C) 2007-2013 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fExtractDlg; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, StdCtrls, EditBtn, ExtCtrls, uFile, uFileSource, uArchiveFileSource; type { TfrmExtractDlg } TfrmExtractDlg = class(TForm) cbExtractPath: TCheckBox; cbInSeparateFolder: TCheckBox; cbOverwrite: TCheckBox; edtPassword: TEdit; edtExtractTo: TDirectoryEdit; lblExtractTo: TLabel; lblPassword: TLabel; cbFileMask: TComboBox; btnOK: TButton; btnCancel: TButton; btnHelp: TButton; lblFileMask: TLabel; pnlCheckBoxes: TPanel; pnlLabels: TPanel; procedure cbExtractPathChange(Sender: TObject); procedure FormCreate(Sender: TObject); private { private declarations } FArcType: UTF8String; procedure SwitchOptions; procedure ExtractArchive(ArchiveFileSource: IArchiveFileSource; TargetFileSource: IFileSource; const TargetPath: UTF8String); public { public declarations } end; // Frees 'SourceFiles'. procedure ShowExtractDlg(SourceFileSource: IFileSource; var SourceFiles: TFiles; TargetFileSource: IFileSource; sDestPath: UTF8String); implementation {$R *.lfm} uses Dialogs, uGlobs, uDCUtils, uShowMsg, uLng, DCStrUtils, uFileSourceOperation, uFileSystemFileSource, uArchiveFileSourceUtil, uFileSourceOperationTypes, uMultiArchiveFileSource, uMultiArchiveCopyOutOperation, uWcxArchiveFileSource, uWcxArchiveCopyOutOperation, uFileSourceOperationOptions, uOperationsManager, uMasks; procedure ShowExtractDlg(SourceFileSource: IFileSource; var SourceFiles: TFiles; TargetFileSource: IFileSource; sDestPath: UTF8String); var I: integer; Operation: TFileSourceOperation; ArchiveFileSource: IArchiveFileSource; extractDialog: TfrmExtractDlg; Result: boolean; begin if not TargetFileSource.IsClass(TFileSystemFileSource) then begin msgWarning(rsMsgErrNotSupported); Exit; end; extractDialog := TfrmExtractDlg.Create(nil); if Assigned(extractDialog) then try with extractDialog do begin edtExtractTo.Text := sDestPath; if SourceFileSource.IsClass(TArchiveFileSource) then cbInSeparateFolder.Visible := False; cbFileMask.Items.Assign(glsMaskHistory); EnableControl(edtPassword, False); // If one archive is selected if (SourceFiles.Count = 1) then begin FArcType:= SourceFiles[0].Extension; SwitchOptions; end; // Show form Result := (ShowModal = mrOk); if Result then begin if glsMaskHistory.IndexOf(cbFileMask.Text) < 0 then glsMaskHistory.Add(cbFileMask.Text); sDestPath := edtExtractTo.Text; // if in archive if SourceFileSource.IsClass(TArchiveFileSource) then begin if fsoCopyOut in SourceFileSource.GetOperationsTypes then begin // if destination path is null then extract to path there archive is located if Length(sDestPath) = 0 then sDestPath := ExtractFilePath((SourceFileSource as IArchiveFileSource).ArchiveFileName) else sDestPath := IncludeTrailingPathDelimiter(sDestPath); Operation := SourceFileSource.CreateCopyOutOperation(TargetFileSource, SourceFiles, sDestPath); if Assigned(Operation) then begin // Start operation. OperationsManager.AddOperation(Operation); end else msgWarning(rsMsgNotImplemented); end else msgWarning(rsMsgErrNotSupported); end else // if filesystem if SourceFileSource.IsClass(TFileSystemFileSource) then begin for I := 0 to SourceFiles.Count - 1 do // extract all selected archives begin try // Check if there is a ArchiveFileSource for possible archive. ArchiveFileSource := GetArchiveFileSource(SourceFileSource, SourceFiles[i]); // Extract current archive ExtractArchive(ArchiveFileSource, TargetFileSource, sDestPath); // Short pause, so that all operations are not spawned at once. Sleep(100); except on E: Exception do begin MessageDlg(E.Message, mtError, [mbOK], 0); end; end; end; // for end else msgWarning(rsMsgErrNotSupported); end; // if Result end; finally if Assigned(extractDialog) then FreeAndNil(extractDialog); if Assigned(SourceFiles) then FreeAndNil(SourceFiles); end; end; { TfrmExtractDlg } procedure TfrmExtractDlg.FormCreate(Sender: TObject); begin InitPropStorage(Self); end; procedure TfrmExtractDlg.cbExtractPathChange(Sender: TObject); begin SwitchOptions; end; procedure TfrmExtractDlg.SwitchOptions; var I: LongInt; begin // Check for this archive will be processed by MultiArc for I := 0 to gMultiArcList.Count - 1 do with gMultiArcList.Items[I] do begin if FEnabled and MatchesMaskList(FArcType, FExtension, ',') then begin // If addon supports unpacking without path if (Length(FExtractWithoutPath) <> 0) then cbExtractPath.Enabled:= True else begin cbExtractPath.Enabled:= False; cbExtractPath.Checked:= True; end; // If addon supports unpacking with password if cbExtractPath.Checked then EnableControl(edtPassword, (Pos('%W', FExtract) <> 0)) else EnableControl(edtPassword, (Pos('%W', FExtractWithoutPath) <> 0)); Break; end; end; end; procedure TfrmExtractDlg.ExtractArchive(ArchiveFileSource: IArchiveFileSource; TargetFileSource: IFileSource; const TargetPath: UTF8String); var FilesToExtract: TFiles; Operation: TFileSourceOperation; sTmpPath: string; begin if Assigned(ArchiveFileSource) then begin // Check if List and CopyOut are supported. if [fsoList, fsoCopyOut] * ArchiveFileSource.GetOperationsTypes = [fsoList, fsoCopyOut] then begin // Get files to extract. FilesToExtract := ArchiveFileSource.GetFiles(ArchiveFileSource.GetRootDir); if Assigned(FilesToExtract) then try // if destination path is null then extract to path there archive is located if Length(TargetPath) = 0 then sTmpPath := ExtractFilePath(ArchiveFileSource.ArchiveFileName) else sTmpPath := IncludeTrailingPathDelimiter(TargetPath); // if each archive in separate folder if cbInSeparateFolder.Checked then begin sTmpPath := sTmpPath + ExtractOnlyFileName(ArchiveFileSource.ArchiveFileName) + PathDelim; end; // extract all files Operation := ArchiveFileSource.CreateCopyOutOperation(TargetFileSource, FilesToExtract, sTmpPath); // Set operation specific options if Assigned(Operation) then begin if ArchiveFileSource.IsInterface(IMultiArchiveFileSource) then begin with Operation as TMultiArchiveCopyOutOperation do begin Password := edtPassword.Text; ExtractWithoutPath:= not cbExtractPath.Checked; end; end else if ArchiveFileSource.IsInterface(IWcxArchiveFileSource) then begin with Operation as TWcxArchiveCopyOutOperation do begin if cbOverwrite.Checked then FileExistsOption := fsoofeOverwrite; ExtractWithoutPath:= not cbExtractPath.Checked; end; end; // Start operation. OperationsManager.AddOperation(Operation); end else msgWarning(rsMsgNotImplemented); finally if Assigned(FilesToExtract) then FreeAndNil(FilesToExtract); end; end else msgWarning(rsMsgErrNotSupported); end; end; end. doublecmd-0.5.8/src/fAbout.pas0000644000175000017500000001353012110460122015211 0ustar alexxalexx{ Seksi Commander ---------------------------- Implementing of About dialog Licence : GNU GPL v 2.0 Author : radek.cervinka@centrum.cz contributors: Copyright (C) 2006-2008 Koblov Alexander (Alexx2000@mail.ru) } unit fAbout; {$mode objfpc}{$H+} interface uses Graphics, Forms, Controls, StdCtrls, ExtCtrls, Buttons, SysUtils, Classes, LCLType; type { TfrmAbout } TfrmAbout = class(TForm) btnClose: TBitBtn; btnCopyToClipboard: TButton; imgLogo: TImage; lblWidgetsetVer: TLabel; lblPlatform: TLabel; lblOperatingSystem: TLabel; lblRevision: TLabel; lblHomePageAddress: TLabel; lblHomePage: TLabel; lblFreePascalVer: TLabel; lblTitle: TLabel; lblLazarusVer: TLabel; lblBuild: TLabel; lblVersion: TLabel; pnlText: TPanel; memInfo: TMemo; pnlInfo: TPanel; pnlLogo: TPanel; procedure btnCopyToClipboardClick(Sender: TObject); procedure lblHomePageAddressClick(Sender: TObject); procedure lblHomePageAddressMouseEnter(Sender: TObject); procedure lblHomePageAddressMouseLeave(Sender: TObject); procedure OKButtonClick(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure frmAboutShow(Sender: TObject); private { Private declarations } public { Public declarations } end; procedure ShowAboutBox; implementation {$R *.lfm} uses Clipbrd, dmHelpManager, uDCVersion; const cIndention = LineEnding + #32#32; cAboutMsg = 'This program is free software under GNU GPL 2 license, see COPYING.txt file.' + LineEnding + LineEnding + 'Active developers: '+ cIndention + 'Alexander Koblov (Alexx2000@mail.ru) - author, core developer' + cIndention + 'Przemysław Nagay (cobines@gmail.com) - core developer' + LineEnding + LineEnding + 'Recent developers: ' + cIndention + 'Dmitry Kolomiets (B4rr4cuda@rambler.ru) - developer' + cIndention + 'Radek Cervinka (radek.cervinka@centrum.cz) - author of Seksi Commander' + LineEnding + LineEnding + 'Contributors:' + cIndention + 'Tolstov Igor (attid@yandex.ru)' + cIndention + 'Rustem Rakhimov (dok_rust@bk.ru)' + cIndention + 'Moroz Serhiy (frost.asm@gmail.com)' + cIndention + 'Vitaly Zotov (vitalyzotov@mail.ru)' + cIndention + 'Zolotov Alex (zolotov-alex@shamangrad.net)' + cIndention + 'Peter Cernoch (pcernoch@volny.cz) - author PFM' + cIndention + 'Pavel Letko (letcuv@centrum.cz) - multirename, split, linker' + cIndention + 'Jiri Karasek (jkarasek@centrum.cz)' + cIndention + 'Vladimir Pilny (vladimir@pilny.com)' + cIndention + 'Vaclav Juza (vaclavjuza@seznam.cz)' + cIndention + 'Martin Matusu (xmat@volny.cz) - chown, chgrp' + cIndention + 'Radek Polak - some viewer fixes' + cIndention + 'Dmytro Zheludko (doublecmd@zheludko.mail.ua)' + cIndention + 'Andryei Gudyak - main icon' + cIndention + 'translators (see details in language files) ' + LineEnding + LineEnding + 'Double Commander uses icons from:' + LineEnding + '- Tango Icon Library (http://tango.freedesktop.org/Tango_Icon_Library)' + LineEnding + '- Silk icon set 1.3 by Mark James (http://www.famfamfam.com/lab/icons/silk/)' + LineEnding + '- Farm-Fresh Web Icons (http://www.fatcow.com/free-icons)' + LineEnding + '- Oxygen icon theme (http://oxygen-icons.org)' + LineEnding + LineEnding + 'Big thanks to Lazarus and Free Pascal Team!'; procedure ShowAboutBox; begin with TfrmAbout.Create(Application) do try ShowModal; finally Free; end; end; procedure TfrmAbout.OKButtonClick(Sender: TObject); begin Close; end; procedure TfrmAbout.lblHomePageAddressMouseLeave(Sender: TObject); begin with Sender as TLabel do begin Font.Style:= []; Font.Color:= clBlue; Cursor:= crDefault; end; end; procedure TfrmAbout.lblHomePageAddressMouseEnter(Sender: TObject); begin with Sender as TLabel do begin Font.Style:= [fsUnderLine]; Font.Color:= clRed; Cursor:= crHandPoint; end; end; procedure TfrmAbout.lblHomePageAddressClick(Sender: TObject); var ErrMsg: String; begin dmHelpMgr.HTMLHelpDatabase.ShowURL('http://doublecmd.sourceforge.net','Double Commander Web Site', ErrMsg); end; procedure TfrmAbout.btnCopyToClipboardClick(Sender: TObject); var StrInfo: String; begin StrInfo := Format('Double Commander' + LineEnding + 'Version: %s' + LineEnding + 'Revision: %s' + LineEnding + 'Build date: %s' + LineEnding + 'Lazarus: %s' + LineEnding + 'FPC: %s' + LineEnding + 'Platform: %s' + LineEnding + 'OS version: %s' + LineEnding, [dcVersion, dcRevision, dcBuildDate, lazVersion + '-' + lazRevision, fpcVersion, TargetCPU + '-' + TargetOS + '-' + TargetWS, OSVersion]); if WSVersion <> EmptyStr then StrInfo := StrInfo + LineEnding + 'Widgetset library: ' + WSVersion; Clipboard.AsText := StrInfo; end; procedure TfrmAbout.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key = VK_Escape) then Close; end; procedure TfrmAbout.frmAboutShow(Sender: TObject); begin memInfo.Lines.Text := cAboutMsg; memInfo.CaretPos := Classes.Point(0, 0); lblVersion.Caption := lblVersion.Caption + #32 + dcVersion; lblRevision.Caption := lblRevision.Caption + #32 + dcRevision; lblBuild.Caption := lblBuild.Caption + #32 + dcBuildDate; lblLazarusVer.Caption := lblLazarusVer.Caption + #32 + lazVersion + '-' + lazRevision; lblFreePascalVer.Caption := lblFreePascalVer.Caption + #32 + fpcVersion; lblPlatform.Caption := TargetCPU + '-' + TargetOS + '-' + TargetWS; lblOperatingSystem.Caption := OSVersion; lblWidgetsetVer.Caption := WSVersion; end; end. doublecmd-0.5.8/src/ffileexecuteyourself.lfm0000644000175000017500000000474612045446211020250 0ustar alexxalexxobject frmFileExecuteYourSelf: TfrmFileExecuteYourSelf Left = 366 Height = 102 Top = 182 Width = 320 AutoSize = True BorderIcons = [biSystemMenu, biMinimize] BorderStyle = bsSingle Caption = 'Wait...' ChildSizing.LeftRightSpacing = 8 ChildSizing.TopBottomSpacing = 8 ClientHeight = 102 ClientWidth = 320 OnClose = FormClose ShowInTaskBar = stAlways LCLVersion = '1.0.1.3' object lblPrompt: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 8 Height = 14 Top = 8 Width = 304 Anchors = [akTop, akLeft, akRight] Caption = 'Click on Close when the temporary file can be deleted!' ParentColor = False end object btnClose: TBitBtn AnchorSideLeft.Control = Owner AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = lblFromPathValue AnchorSideTop.Side = asrBottom Left = 123 Height = 30 Top = 70 Width = 75 BorderSpacing.Top = 8 Caption = '&Close' Kind = bkClose TabOrder = 0 end object lblFileNameValue: TLabel AnchorSideLeft.Control = lblFileName AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblPrompt AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 64 Height = 14 Top = 28 Width = 248 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 BorderSpacing.Top = 6 ParentColor = False end object lblFromPathValue: TLabel AnchorSideLeft.Control = lblFromPath AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblFileNameValue AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 43 Height = 14 Top = 48 Width = 269 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 BorderSpacing.Top = 6 ParentColor = False end object lblFileName: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = lblPrompt AnchorSideTop.Side = asrBottom Left = 8 Height = 14 Top = 28 Width = 50 BorderSpacing.Top = 6 Caption = 'File name:' ParentColor = False end object lblFromPath: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = lblFileName AnchorSideTop.Side = asrBottom Left = 8 Height = 14 Top = 48 Width = 29 BorderSpacing.Top = 6 Caption = 'From:' ParentColor = False end end doublecmd-0.5.8/src/fcopymovedlg.pas0000644000175000017500000002703012014201074016471 0ustar alexxalexxunit fCopyMoveDlg; {$mode objfpc}{$H+} interface uses SysUtils, Classes, Controls, Forms, StdCtrls, Buttons, ExtCtrls, Menus, KASPathEdit, uFileSource, uFileViewNotebook, uFileSourceOperation, uFileSourceOperationOptionsUI, uOperationsManager, uFormCommands; type TCopyMoveDlgType = (cmdtCopy, cmdtMove); { TfrmCopyDlg } TfrmCopyDlg = class(TForm, IFormCommands) btnCancel: TBitBtn; btnOK: TBitBtn; btnAddToQueue: TBitBtn; btnOptions: TButton; btnSaveOptions: TButton; edtDst: TKASPathEdit; grpOptions: TGroupBox; lblCopySrc: TLabel; pnlButtons: TPanel; pnlOptions: TPanel; pnlSelector: TPanel; btnCreateSpecialQueue: TButton; procedure btnAddToQueueClick(Sender: TObject); procedure btnCancelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure btnAddToQueueMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure btnOKClick(Sender: TObject); procedure btnOKMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure btnOptionsClick(Sender: TObject); procedure btnOptionsMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure btnSaveOptionsClick(Sender: TObject); procedure btnStartModeClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure frmCopyDlgShow(Sender: TObject); procedure pnlOptionsResize(Sender: TObject); private FCommands: TFormCommands; FDialogType: TCopyMoveDlgType; FQueueIdentifier: TOperationsManagerQueueIdentifier; noteb: TFileViewNotebook; FFileSource: IFileSource; FOperationOptionsUIClass: TFileSourceOperationOptionsUIClass; FOperationOptionsUI: TFileSourceOperationOptionsUI; function ShowTabsSelector: integer; procedure TabsSelector(Sender: TObject); procedure TabsSelectorMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ShowOptions(bShow: Boolean); procedure UpdateSize; property Commands: TFormCommands read FCommands{$IF FPC_FULLVERSION >= 020501} implements IFormCommands{$ENDIF}; public constructor Create(TheOwner: TComponent; DialogType: TCopyMoveDlgType; AFileSource: IFileSource; AOperationOptionsUIClass: TFileSourceOperationOptionsUIClass); reintroduce; constructor Create(TheOwner: TComponent); override; procedure SetOperationOptions(Operation: TFileSourceOperation); property QueueIdentifier: TOperationsManagerQueueIdentifier read FQueueIdentifier; {$IF FPC_FULLVERSION < 020501} // "implements" does not work in FPC < 2.5.1 function ExecuteCommand(Command: string; const Params: array of String): TCommandFuncResult; function GetCommandCaption(Command: String; CaptionType: TCommandCaptionType): String; procedure GetCommandsList(List: TStrings); {$ENDIF} published procedure cm_AddToQueue(const Params: array of String); end; implementation {$R *.lfm} uses fMain, LCLType, LCLVersion, uGlobs, uLng, uHotkeyManager, DCStrUtils; const HotkeysCategory = 'Copy/Move Dialog'; constructor TfrmCopyDlg.Create(TheOwner: TComponent; DialogType: TCopyMoveDlgType; AFileSource: IFileSource; AOperationOptionsUIClass: TFileSourceOperationOptionsUIClass); begin FDialogType := DialogType; FFileSource := AFileSource; FOperationOptionsUIClass := AOperationOptionsUIClass; FQueueIdentifier := FreeOperationsQueueId; FCommands := TFormCommands.Create(Self); inherited Create(TheOwner); end; constructor TfrmCopyDlg.Create(TheOwner: TComponent); begin Create(TheOwner, cmdtCopy, nil, nil); end; procedure TfrmCopyDlg.SetOperationOptions(Operation: TFileSourceOperation); begin if Assigned(FOperationOptionsUI) then FOperationOptionsUI.SetOperationOptions(Operation); end; procedure TfrmCopyDlg.cm_AddToQueue(const Params: array of String); var Value: Integer; sQueueId: String; begin if GetParamValue(Params, 'queueid', sQueueId) and TryStrToInt(sQueueId, Value) then FQueueIdentifier := Value else FQueueIdentifier := SingleQueueId; ModalResult := btnAddToQueue.ModalResult; end; procedure TfrmCopyDlg.TabsSelector(Sender: TObject); begin edtDst.Text := noteb[(Sender as TButton).tag].CurrentPath; end; procedure TfrmCopyDlg.TabsSelectorMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin edtDst.Text := noteb[(Sender as TButton).tag].CurrentPath; end; function TfrmCopyDlg.ShowTabsSelector: integer; var btnS, btnL: TButton; i, tc: PtrInt; st: TStringList; s: String; begin noteb := frmMain.NotActiveNotebook; if noteb.PageCount = 1 then begin Result:=0; exit; end; tc := noteb.PageCount; st := TStringList.Create; try for i:=0 to tc-1 do if noteb.View[i].Visible then begin s:=noteb[i].CurrentPath; if st.IndexOf(s)=-1 then begin st.Add(s); st.Objects[st.Count-1]:=TObject(i); end; end; tc := st.Count; btnL := nil; if tc>10 then tc:=10; for i:=0 to tc-1 do begin btnS:= TButton.Create(Self); btns.Parent:=pnlSelector; btns.Tag:=PtrInt(st.Objects[i]); if i<9 then btns.Caption := '&' + IntToStr(i+1) + ' - ' + noteb.Page[PtrInt(st.Objects[i])].Caption else btns.Caption := '&0 - ' + noteb.Page[PtrInt(st.Objects[i])].Caption; btnS.OnClick := @TabsSelector; btnS.OnMouseDown := @TabsSelectorMouseDown; btns.AutoSize:=True; btns.Left := 2; btns.Top := 0; btns.Anchors :=[akLeft,akTop,akBottom]; btns.Visible := True; if btnL <> nil then begin btns.AnchorSideLeft.Control := btnL; btns.AnchorSideLeft.Side := asrRight; end; btnL := btnS; if (Self.Width < (btnL.Left+btnL.Width+200)) then // 200 = Ok + Cancel Self.Width := (btnL.Left+btnL.Width+200); end; finally st.Free; end; end; procedure TfrmCopyDlg.frmCopyDlgShow(Sender: TObject); begin case FDialogType of cmdtCopy: begin Caption := rsDlgCp; end; cmdtMove: begin Caption := rsDlgMv; end; end; if gShowCopyTabSelectPanel then ShowTabsSelector; edtDst.SelectAll; edtDst.SetFocus; end; procedure TfrmCopyDlg.pnlOptionsResize(Sender: TObject); begin UpdateSize; end; procedure TfrmCopyDlg.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if gShowCopyTabSelectPanel and (edtDst.Focused=false) and (key-49=VK_1) and (Key<=VK_9) then TButton(pnlSelector.Controls[key-49]).Click; if key=vk_0 then TButton(pnlSelector.Controls[9]).Click; end; {$IF lcl_fullversion < 093100} case Key of VK_ESCAPE: // Must handle before drag manager. Lazarus bug 0020676. begin ModalResult := mrCancel; Key := 0; end; end; {$ENDIF} end; procedure TfrmCopyDlg.btnCancelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin {$IF (DEFINED(LCLGTK) or DEFINED(LCLGTK2)) and (lcl_fullversion < 093100)} if (Button = mbLeft) and (Sender = FindLCLControl(Mouse.CursorPos)) then ModalResult := btnCancel.ModalResult; {$ENDIF} end; procedure TfrmCopyDlg.btnAddToQueueClick(Sender: TObject); begin {$IF NOT ((DEFINED(LCLGTK) or DEFINED(LCLGTK2)) and (lcl_fullversion < 093100))} FQueueIdentifier := SingleQueueId; {$ENDIF} end; procedure TfrmCopyDlg.btnAddToQueueMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin {$IF (DEFINED(LCLGTK) or DEFINED(LCLGTK2)) and (lcl_fullversion < 093100)} if (Button = mbLeft) and (Sender = FindLCLControl(Mouse.CursorPos)) then begin cm_AddToQueue([]); end; {$ENDIF} end; procedure TfrmCopyDlg.btnOKClick(Sender: TObject); begin {$IF NOT ((DEFINED(LCLGTK) or DEFINED(LCLGTK2)) and (lcl_fullversion < 093100))} FQueueIdentifier := FreeOperationsQueueId; {$ENDIF} end; procedure TfrmCopyDlg.btnOkMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin {$IF (DEFINED(LCLGTK) or DEFINED(LCLGTK2)) and (lcl_fullversion < 093100)} if (Button = mbLeft) and (Sender = FindLCLControl(Mouse.CursorPos)) then begin FQueueIdentifier := FreeOperationsQueueId; ModalResult := btnOk.ModalResult; end; {$ENDIF} end; procedure TfrmCopyDlg.btnOptionsClick(Sender: TObject); begin {$IF NOT ((DEFINED(LCLGTK) or DEFINED(LCLGTK2)) and (lcl_fullversion < 093100))} ShowOptions(not pnlOptions.Visible); {$ENDIF} end; procedure TfrmCopyDlg.btnOptionsMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin {$IF (DEFINED(LCLGTK) or DEFINED(LCLGTK2)) and (lcl_fullversion < 093100)} if (Button = mbLeft) and (Sender = FindLCLControl(Mouse.CursorPos)) then ShowOptions(not pnlOptions.Visible); {$ENDIF} end; procedure TfrmCopyDlg.btnSaveOptionsClick(Sender: TObject); begin if Assigned(FOperationOptionsUI) then FOperationOptionsUI.SaveOptions; end; procedure TfrmCopyDlg.btnStartModeClick(Sender: TObject); begin btnOK.PopupMenu.PopUp; end; procedure TfrmCopyDlg.FormCreate(Sender: TObject); var HMForm: THMForm; Hotkey: THotkey; begin pnlSelector.Visible := gShowCopyTabSelectPanel; // Fix align of options panel and dialog size at start. if not pnlSelector.Visible then pnlOptions.Top := pnlOptions.Top - (pnlSelector.Height + pnlSelector.BorderSpacing.Top + pnlSelector.BorderSpacing.Bottom); // Operation options. if Assigned(FOperationOptionsUIClass) then begin FOperationOptionsUI := FOperationOptionsUIClass.Create(Self, FFileSource); FOperationOptionsUI.Parent := grpOptions; FOperationOptionsUI.Align := alClient; end else btnOptions.Visible := False; ShowOptions(False); btnOK.Caption := rsDlgOpStart; FQueueIdentifier := FreeOperationsQueueId; HMForm := HotMan.Register(Self, HotkeysCategory); Hotkey := HMForm.Hotkeys.FindByCommand('cm_AddToQueue'); if Assigned(Hotkey) then btnAddToQueue.Caption := btnAddToQueue.Caption + ' (' + ShortcutsToText(Hotkey.Shortcuts) + ')'; end; procedure TfrmCopyDlg.FormDestroy(Sender: TObject); begin HotMan.UnRegister(Self); end; procedure TfrmCopyDlg.ShowOptions(bShow: Boolean); begin pnlOptions.Visible := bShow; UpdateSize; end; procedure TfrmCopyDlg.UpdateSize; begin if pnlOptions.Visible then Self.Height := pnlOptions.Top + pnlOptions.Height + pnlOptions.BorderSpacing.Top + pnlOptions.BorderSpacing.Bottom else Self.Height := pnlOptions.Top; end; {$IF FPC_FULLVERSION < 020501} function TfrmCopyDlg.ExecuteCommand(Command: string; const Params: array of String): TCommandFuncResult; begin Result := FCommands.ExecuteCommand(Command, Params); end; function TfrmCopyDlg.GetCommandCaption(Command: String; CaptionType: TCommandCaptionType): String; begin Result := FCommands.GetCommandCaption(Command, CaptionType); end; procedure TfrmCopyDlg.GetCommandsList(List: TStrings); begin FCommands.GetCommandsList(List); end; {$ENDIF} initialization TFormCommands.RegisterCommandsForm(TfrmCopyDlg, HotkeysCategory, @rsHotkeyCategoryCopyMoveDialog); end. doublecmd-0.5.8/src/feditor.pas0000644000175000017500000005543012247661727015463 0ustar alexxalexx{ Build-in Editor for Seksi Commander ---------------------------- Licence : GNU GPL v 2.0 Author : radek.cervinka@centrum.cz This form used SynEdit and his Highlighters contributors: Copyright (C) 2006-2013 Alexander Koblov (Alexx2000@mail.ru) } unit fEditor; {$mode objfpc}{$H+} interface uses SysUtils, Classes, Controls, Forms, ActnList, Menus, SynEdit, ComCtrls, SynEditSearch, SynEditHighlighter, uDebug, uOSForms; type { TfrmEditor } TfrmEditor = class(TAloneForm) actEditCut: TAction; actEditCopy: TAction; actEditSelectAll: TAction; actEditUndo: TAction; actEditRedo: TAction; actEditPaste: TAction; actEditDelete: TAction; actEditFindNext: TAction; actEditLineEndCrLf: TAction; actEditLineEndCr: TAction; actEditLineEndLf: TAction; ilImageList: TImageList; MainMenu1: TMainMenu; ActListEdit: TActionList; actAbout: TAction; actFileOpen: TAction; actFileClose: TAction; actFileSave: TAction; actFileSaveAs: TAction; actFileNew: TAction; actFileExit: TAction; miEditLineEndCr: TMenuItem; miEditLineEndLf: TMenuItem; miEditLineEndCrLf: TMenuItem; miLineEndType: TMenuItem; N5: TMenuItem; miEncodingOut: TMenuItem; miEncodingIn: TMenuItem; miEncoding: TMenuItem; miFindNext: TMenuItem; miDelete: TMenuItem; miSelectAll: TMenuItem; miRedo: TMenuItem; miDeleteContext: TMenuItem; miSelectAllContext: TMenuItem; miSeparator2: TMenuItem; miPasteContext: TMenuItem; miCopyContext: TMenuItem; miCutContext: TMenuItem; miSeparator1: TMenuItem; miUndoContext: TMenuItem; miFile: TMenuItem; New1: TMenuItem; Open1: TMenuItem; pmContextMenu: TPopupMenu; Save1: TMenuItem; SaveAs1: TMenuItem; N1: TMenuItem; Exit1: TMenuItem; miEdit: TMenuItem; miUndo: TMenuItem; N3: TMenuItem; miCut: TMenuItem; miCopy: TMenuItem; miPaste: TMenuItem; N4: TMenuItem; miFind: TMenuItem; miReplace: TMenuItem; Help1: TMenuItem; miAbout: TMenuItem; actSaveAll: TAction; StatusBar: TStatusBar; Editor: TSynEdit; miHighlight: TMenuItem; actEditFind: TAction; actEditRplc: TAction; actConfHigh: TAction; miDiv: TMenuItem; miConfHigh: TMenuItem; tbToolBar: TToolBar; tbNew: TToolButton; tbOpen: TToolButton; tbSave: TToolButton; tbSeparator1: TToolButton; tbCut: TToolButton; tbCopy: TToolButton; tbPaste: TToolButton; tbSeparator2: TToolButton; tbUndo: TToolButton; tbRedo: TToolButton; tbSeparator3: TToolButton; tbConfig: TToolButton; tbHelp: TToolButton; procedure actEditFindNextExecute(Sender: TObject); procedure actEditLineEndCrExecute(Sender: TObject); procedure actEditLineEndCrLfExecute(Sender: TObject); procedure actEditLineEndLfExecute(Sender: TObject); procedure FormCreate(Sender: TObject); procedure actEditDeleteExecute(Sender: TObject); procedure actEditRedoExecute(Sender: TObject); procedure EditorKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure EditorReplaceText(Sender: TObject; const ASearch, AReplace: string; Line, Column: integer; var ReplaceAction: TSynReplaceAction); procedure actAboutExecute(Sender: TObject); procedure actEditCopyExecute(Sender: TObject); procedure actEditCutExecute(Sender: TObject); procedure actEditPasteExecute(Sender: TObject); procedure actEditSelectAllExecute(Sender: TObject); procedure actFileNewExecute(Sender: TObject); procedure actFileOpenExecute(Sender: TObject); procedure actEditUndoExecute(Sender: TObject); procedure EditorChange(Sender: TObject); procedure actFileSaveExecute(Sender: TObject); procedure actFileSaveAsExecute(Sender: TObject); procedure EditorStatusChange(Sender: TObject; Changes: TSynStatusChanges); procedure actFileExitExecute(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure EditorKeyPress(Sender: TObject; var Key: Char); procedure actEditFindExecute(Sender: TObject); procedure actEditRplcExecute(Sender: TObject); procedure actSave2Execute(Sender: TObject); procedure actConfHighExecute(Sender: TObject); procedure frmEditorClose(Sender: TObject; var CloseAction: TCloseAction); private { Private declarations } bChanged:Boolean; bNoName: Boolean; bSearchBackwards:Boolean; bSearchCaseSensitive:Boolean; bSearchFromCaret:Boolean; bSearchSelectionOnly:Boolean; bSearchWholeWords:Boolean; bSearchRegExp:Boolean; FFileName: UTF8String; sSearchText, sReplaceText:String; sEncodingIn, sEncodingOut, sOriginalText: String; procedure ChooseEncoding(mnuMenuItem: TMenuItem; sEncoding: String); {en Saves editor content to a file. @returns(@true if successful) } function SaveFile(const aFileName: UTF8String): Boolean; procedure SetFileName(const AValue: UTF8String); public { Public declarations } SynEditSearch: TSynEditSearch; { Function CreateNewTab:Integer; // return tab number Function OpenFileNewTab(const sFileName:String):Integer; } {en Opens a file. @returns(@true if successful) } function OpenFile(const aFileName: UTF8String): Boolean; procedure UpdateStatus; procedure SetEncodingIn(Sender:TObject); procedure SetEncodingOut(Sender:TObject); procedure SetHighLighter(Sender:TObject); procedure UpdateHighlighter(Highlighter: TSynCustomHighlighter); procedure DoSearchReplaceText(AReplace: boolean; ABackwards: boolean); procedure ShowSearchReplaceDialog(AReplace: boolean); property FileName: UTF8String read FFileName write SetFileName; end; procedure ShowEditor(const sFileName:String); implementation {$R *.lfm} uses dmCommonData, dmHigh, SynEditTypes, SynEditLines, LCLType, LConvEncoding, uLng, uShowMsg, fEditSearch, uGlobs, fOptions, uOSUtils, uConvEncoding, uSynEditFiler, fOptionsEditorColors; procedure ShowEditor(const sFileName:String); var editor: TfrmEditor; begin editor := TfrmEditor.Create(Application); if sFileName = '' then editor.actFileNew.Execute else begin if not editor.OpenFile(sFileName) then Exit; end; editor.ShowOnTop; end; procedure TfrmEditor.FormCreate(Sender: TObject); var i:Integer; mi:TMenuItem; EncodingsList: TStringList; begin InitPropStorage(Self); FontOptionsToFont(gFonts[dcfEditor], Editor.Font); // update menu highlighting miHighlight.Clear; for i:=0 to dmHighl.SynHighlighterList.Count - 1 do begin mi:=TMenuItem.Create(miHighlight); mi.Caption:=TSynCustomHighlighter(dmHighl.SynHighlighterList.Objects[i]).GetLanguageName; mi.Tag:=i; // mi.Name:='miHigh'+IntToStr(i); mi.Enabled:=True; mi.OnClick:=@SetHighLighter; miHighlight.Add(mi); end; // update menu encoding miEncodingIn.Clear; miEncodingOut.Clear; EncodingsList:= TStringList.Create; GetSupportedEncodings(EncodingsList); for I:= 0 to EncodingsList.Count - 1 do begin mi:= TMenuItem.Create(miEncodingIn); mi.Caption:= EncodingsList[I]; mi.AutoCheck:= True; mi.RadioItem:= True; mi.GroupIndex:= 1; mi.OnClick:= @SetEncodingIn; miEncodingIn.Add(mi); end; for I:= 0 to EncodingsList.Count - 1 do begin mi:= TMenuItem.Create(miEncodingOut); mi.Caption:= EncodingsList[I]; mi.AutoCheck:= True; mi.RadioItem:= True; mi.GroupIndex:= 2; mi.OnClick:= @SetEncodingOut; miEncodingOut.Add(mi); end; EncodingsList.Free; // if we already search text then use last searched text if not gFirstTextSearch then begin if glsSearchHistory.Count > 0 then sSearchText:= glsSearchHistory[0]; end; FixFormIcon(Handle); end; procedure TfrmEditor.actEditFindNextExecute(Sender: TObject); begin if gFirstTextSearch then begin ShowSearchReplaceDialog(False); Exit; end; if sSearchText <> '' then begin DoSearchReplaceText(False, bSearchBackwards); bSearchFromCaret:= True; end; end; procedure TfrmEditor.actEditLineEndCrExecute(Sender: TObject); begin with (Editor.Lines as TSynEditLines) do FileWriteLineEndType:= sfleCr; end; procedure TfrmEditor.actEditLineEndCrLfExecute(Sender: TObject); begin with (Editor.Lines as TSynEditLines) do FileWriteLineEndType:= sfleCrLf; end; procedure TfrmEditor.actEditLineEndLfExecute(Sender: TObject); begin with (Editor.Lines as TSynEditLines) do FileWriteLineEndType:= sfleLf; end; function TfrmEditor.OpenFile(const aFileName: UTF8String): Boolean; var Reader: TSynEditFileReader; Highlighter: TSynCustomHighlighter; begin Result := False; try Reader := TSynEditFileReader.Create(aFileName); try Editor.Lines.BeginUpdate; try Editor.Lines.Clear; while not Reader.EOF do Editor.Lines.Add(Reader.ReadLine); finally Editor.Lines.EndUpdate; end; finally with (Editor.Lines as TSynEditLines) do FileWriteLineEndType:= Reader.LineEndType; case Reader.LineEndType of sfleCrLf: actEditLineEndCrLf.Checked:= True; sfleCr: actEditLineEndCr.Checked:= True; sfleLf: actEditLineEndLf.Checked:= True; end; Reader.Free; end; Result := True; except on E: EFCreateError do begin DCDebug(E.Message); msgWarning(rsMsgErrECreate + ' ' + aFileName); Exit; end; on E: EFOpenError do begin DCDebug(E.Message); msgWarning(rsMsgErrEOpen + ' ' + aFileName); Exit; end; end; // set up text encoding sOriginalText := Editor.Lines.Text; // save original text // try to detect encoding by first 4 kb of text sEncodingIn := DetectEncoding(Copy(sOriginalText, 1, 4096)); ChooseEncoding(miEncodingIn, sEncodingIn); sEncodingOut := sEncodingIn; // by default ChooseEncoding(miEncodingOut, sEncodingOut); if sEncodingIn <> EncodingUTF8 then Editor.Lines.Text := ConvertEncoding(sOriginalText, sEncodingIn, EncodingUTF8); // set up highlighter Highlighter := dmHighl.GetHighlighterByExt(ExtractFileExt(aFileName)); UpdateHighlighter(Highlighter); FileName := aFileName; bChanged := False; bNoname := False; UpdateStatus; end; function TfrmEditor.SaveFile(const aFileName: UTF8String): Boolean; var I: Integer; Encoding: String; Writer: TSynEditFileWriter; begin Result := False; try Writer := TSynEditFileWriter.Create(aFileName); try Encoding := NormalizeEncoding(sEncodingOut); Writer.LineEndType := (Editor.Lines as TSynEditLines).FileWriteLineEndType; // If file is empty and encoding UTF-8 with BOM then write only BOM if (Editor.Lines.Count = 0) and (Encoding = EncodingUTF8BOM) then Writer.Write(UTF8ToUTF8BOM(EmptyStr)) // If file has only one line then write it without line break else if Editor.Lines.Count = 1 then Writer.Write(ConvertEncoding(Editor.Lines[0], EncodingUTF8, sEncodingOut)) else if Editor.Lines.Count > 1 then begin Writer.WriteLine(ConvertEncoding(Editor.Lines[0], EncodingUTF8, sEncodingOut)); // Special case for UTF-8 and UTF-8 with BOM if (Encoding = EncodingUTF8) or (Encoding = EncodingUTF8BOM) then begin for I := 1 to Editor.Lines.Count - 2 do Writer.WriteLine(Editor.Lines[I]); // Write last line without line break Writer.Write(Editor.Lines[Editor.Lines.Count - 1]); end else begin for I := 1 to Editor.Lines.Count - 2 do Writer.WriteLine(ConvertEncoding(Editor.Lines[I], EncodingUTF8, sEncodingOut)); // Write last line without line break Writer.Write(ConvertEncoding(Editor.Lines[Editor.Lines.Count - 1], EncodingUTF8, sEncodingOut)); end; end; finally Writer.Free; end; Editor.Modified:= False; // needed for the undo stack Editor.MarkTextAsSaved; Result := True; except on e: EFCreateError do begin DCDebug(e.Message); msgWarning(rsMsgErrSaveFile + ' ' + aFileName); end; on e: EFOpenError do begin DCDebug(e.Message); msgWarning(rsMsgErrSaveFile + ' ' + aFileName); end; end; end; procedure TfrmEditor.SetFileName(const AValue: UTF8String); begin if FFileName = AValue then Exit; FFileName := AValue; Caption := FFileName; end; procedure TfrmEditor.actFileNewExecute(Sender: TObject); begin inherited; FileName := rsMsgNewFile; Editor.Lines.Clear; bChanged:=False; bNoname:=True; UpdateStatus; end; procedure TfrmEditor.EditorReplaceText(Sender: TObject; const ASearch, AReplace: string; Line, Column: integer; var ReplaceAction: TSynReplaceAction ); begin if ASearch = AReplace then ReplaceAction := raSkip else begin case MsgBox('Replace this text?',[msmbYes, msmbNo, msmbCancel, msmbAll], msmbYes, msmbNo) of mmrYes: ReplaceAction := raReplace; mmrAll: ReplaceAction := raReplaceAll; mmrNo: ReplaceAction := raSkip; else ReplaceAction := raCancel; end; end; end; procedure TfrmEditor.EditorKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin // this is hack, action hot key not work yet case Key of VK_F2: begin actFileSave.Execute; Key:=0; end; // To prevent else one editor or viewer open on key F4 in viewer VK_F4: begin if Shift <> [ssAlt] then Key:=0; end; VK_F3: begin actEditFindNext.Execute; Key:=0; end; VK_N: begin if Shift=[ssCtrl] then begin actFileNew.Execute; Key:=0; end; end; VK_S: begin if Shift=[ssCtrl] then begin actFileSave.Execute; Key:=0; end; end; VK_F: begin if Shift=[ssCtrl] then begin actEditFind.Execute; Key:=0; end; end; VK_ESCAPE: begin Close; Key:=0; end; end; end; procedure TfrmEditor.actAboutExecute(Sender: TObject); begin msgOK(rsEditAboutText); end; procedure TfrmEditor.actEditCopyExecute(Sender: TObject); begin editor.CopyToClipboard; end; procedure TfrmEditor.actEditCutExecute(Sender: TObject); begin Editor.CutToClipboard; end; procedure TfrmEditor.actEditPasteExecute(Sender: TObject); begin editor.PasteFromClipboard; end; procedure TfrmEditor.actEditDeleteExecute(Sender: TObject); begin Editor.ClearSelection; end; procedure TfrmEditor.actEditRedoExecute(Sender: TObject); begin editor.Redo; end; procedure TfrmEditor.actEditSelectAllExecute(Sender: TObject); begin editor.SelectAll; end; procedure TfrmEditor.actFileOpenExecute(Sender: TObject); begin dmComData.OpenDialog.Filter:='*.*'; if not dmComData.OpenDialog.Execute then Exit; if OpenFile(dmComData.OpenDialog.FileName) then UpdateStatus; end; procedure TfrmEditor.SetHighLighter(Sender:TObject); var Highlighter: TSynCustomHighlighter; begin Highlighter:= TSynCustomHighlighter(dmHighl.SynHighlighterList.Objects[TMenuItem(Sender).Tag]); UpdateHighlighter(Highlighter); end; (* This is code for multi tabs editor, it's buggy because Synedit bad handle scrollbars in page control, maybe in future, workaround: new tab must be visible and maybe must have focus procedure TfrmEditor.actFileNewExecute(Sender: TObject); var iPageIndex:Integer; begin inherited; iPageIndex:=CreateNewTab; with pgEditor.Pages[iPageIndex] do begin Caption:='New'+IntToStr(iPageIndex); Hint:=''; // filename end; end; Function TfrmEditor.CreateNewTab:Integer; // return tab number var iPageIndex:Integer; begin with TTabSheet.Create(pgEditor) do // create Tab begin PageControl:=pgEditor; iPageIndex:=PageIndex; // now create Editor with TSynEdit.Create(pgEditor.Pages[PageIndex]) do begin Parent:=pgEditor.Pages[PageIndex]; Align:=alClient; Lines.Clear; end; end; end; procedure TfrmEditor.actFileOpenExecute(Sender: TObject); var iPageIndex:Integer; begin inherited; dmDlg.OpenDialog.Filter:='*.*'; if dmDlg.OpenDialog.Execute then OpenFileNewTab(dmDlg.OpenDialog.FileName); end; Function TfrmEditor.OpenFileNewTab(const sFileName:String):Integer; var iPageIndex:Integer; begin inherited; iPageIndex:=CreateNewTab; pgEditor.ActivePageIndex:=iPageIndex; with pgEditor.Pages[iPageIndex] do begin Caption:=sFileName; Hint:=sFileName; TSynEdit(pgEditor.Pages[iPageIndex].Components[0]).Lines.LoadFromFile(sFileName); end; end; procedure ShowEditor(lsFiles:TStringList); var i:Integer; begin with TfrmEditor.Create(Application) do begin try for i:=0 to lsFiles.Count-1 do OpenFileNewTab(lsFiles.Strings[i]); ShowModal; finally Free; end; end; end; *) procedure TfrmEditor.actEditUndoExecute(Sender: TObject); begin inherited; Editor.Undo; UpdateStatus; end; procedure TfrmEditor.EditorChange(Sender: TObject); begin inherited; bChanged:=True; UpdateStatus; end; procedure TfrmEditor.actFileSaveExecute(Sender: TObject); begin if bNoname then actFileSaveAs.Execute else begin SaveFile(FileName); bChanged:=False; UpdateStatus; end; end; procedure TfrmEditor.actFileSaveAsExecute(Sender: TObject); var Highlighter: TSynCustomHighlighter; begin dmComData.SaveDialog.FileName := FileName; dmComData.SaveDialog.Filter:='*.*'; // rewrite for highlighter if not dmComData.SaveDialog.Execute then Exit; FileName := dmComData.SaveDialog.FileName; SaveFile(FileName); bChanged:=False; bNoname:=False; UpdateStatus; Highlighter:= dmHighl.GetHighlighterByExt(ExtractFileExt(FileName)); UpdateHighlighter(Highlighter); end; procedure TfrmEditor.UpdateStatus; begin if bChanged then StatusBar.Panels[0].Text:='*' else StatusBar.Panels[0].Text:=''; StatusBar.Panels[1].Text:=Format('%d:%d',[Editor.CaretX, Editor.CaretY]); // StatusBar.Panels[2].Text:=IntToStr(Length(Editor.Lines.Text)); end; procedure TfrmEditor.SetEncodingIn(Sender: TObject); begin sEncodingIn:= (Sender as TMenuItem).Caption; sEncodingOut:= sEncodingIn; ChooseEncoding(miEncodingOut, sEncodingOut); Editor.Lines.Text:= ConvertEncoding(sOriginalText, sEncodingIn, EncodingUTF8); end; procedure TfrmEditor.SetEncodingOut(Sender: TObject); begin sEncodingOut:= (Sender as TMenuItem).Caption; end; procedure TfrmEditor.EditorStatusChange(Sender: TObject; Changes: TSynStatusChanges); begin inherited; UpdateStatus; end; procedure TfrmEditor.UpdateHighlighter(Highlighter: TSynCustomHighlighter); begin dmHighl.SetHighlighter(Editor, Highlighter); StatusBar.Panels[3].Text:= Highlighter.GetLanguageName; end; procedure TfrmEditor.actFileExitExecute(Sender: TObject); begin Close; end; procedure TfrmEditor.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin inherited; CanClose:=False; if bChanged then case msgYesNoCancel(Format(rsMsgFileChangedSave,[FileName])) of mmrYes: actFileSave.Execute; mmrNo: bChanged:=False; else Exit; end; CanClose:=True; end; procedure TfrmEditor.EditorKeyPress(Sender: TObject; var Key: Char); begin // inherited; end; procedure TfrmEditor.DoSearchReplaceText(AReplace: boolean; ABackwards: boolean); var Options: TSynSearchOptions; begin Statusbar.SimpleText := ''; if AReplace then Options := [ssoPrompt, ssoReplace, ssoReplaceAll] else Options := []; if ABackwards then Include(Options, ssoBackwards); if bSearchCaseSensitive then Include(Options, ssoMatchCase); if not bSearchFromCaret then Include(Options, ssoEntireScope); if bSearchSelectionOnly then Include(Options, ssoSelectedOnly); if bSearchWholeWords then Include(Options, ssoWholeWord); if bSearchRegExp then Include(Options, ssoRegExpr); try if Editor.SearchReplace(sSearchText, sReplaceText, Options) = 0 then begin if ssoBackwards in Options then Editor.BlockEnd := Editor.BlockBegin else Editor.BlockBegin := Editor.BlockEnd; Editor.CaretXY := Editor.BlockBegin; end; except on E: Exception do msgError(E.Message); end; end; procedure TfrmEditor.ShowSearchReplaceDialog(AReplace: boolean); var dlg: TfrmEditSearchReplace; begin // Statusbar.SimpleText := ''; dlg := TfrmEditSearchReplace.Create(Self, AReplace); with dlg do try // assign search options SearchBackwards := bSearchBackwards; SearchCaseSensitive := bSearchCaseSensitive; SearchFromCursor := bSearchFromCaret; SearchInSelectionOnly := bSearchSelectionOnly; // start with last search text SearchText := sSearchText; { if fSearchTextAtCaret then begin} // if something is selected search for that text if Editor.SelAvail and (Editor.BlockBegin.Y = Editor.BlockEnd.Y) then SearchText := Editor.SelText else SearchText := Editor.GetWordAtRowCol(Editor.CaretXY); // end; SearchTextHistory := glsSearchHistory.Text; if AReplace then with dlg as TfrmEditSearchReplace do begin ReplaceText := sReplaceText; ReplaceTextHistory := glsReplaceHistory.Text; end; SearchWholeWords := bSearchWholeWords; if ShowModal = mrOK then begin bSearchBackwards := SearchBackwards; bSearchCaseSensitive := SearchCaseSensitive; bSearchFromCaret := SearchFromCursor; bSearchSelectionOnly := SearchInSelectionOnly; bSearchWholeWords := SearchWholeWords; bSearchRegExp := SearchRegExp; sSearchText := SearchText; glsSearchHistory.Text := SearchTextHistory; if AReplace then with dlg as TfrmEditSearchReplace do begin sReplaceText := ReplaceText; glsReplaceHistory.Text := ReplaceTextHistory; end; // bSearchFromCaret := gbSearchFromCaret; if sSearchText <> '' then begin DoSearchReplaceText(AReplace, bSearchBackwards); bSearchFromCaret:= True; gFirstTextSearch:= False; end; end; finally FreeAndNil(dlg); end; end; procedure TfrmEditor.actEditFindExecute(Sender: TObject); begin ShowSearchReplaceDialog(False); end; procedure TfrmEditor.actEditRplcExecute(Sender: TObject); begin ShowSearchReplaceDialog(True); end; procedure TfrmEditor.actSave2Execute(Sender: TObject); begin inherited; actFileSave.Execute; end; procedure TfrmEditor.actConfHighExecute(Sender: TObject); begin ShowOptions(TfrmOptionsEditorColors); end; procedure TfrmEditor.frmEditorClose(Sender: TObject; var CloseAction: TCloseAction); begin CloseAction:=caFree; end; procedure TfrmEditor.ChooseEncoding(mnuMenuItem: TMenuItem; sEncoding: String); var I: Integer; begin sEncoding:= NormalizeEncoding(sEncoding); for I:= 0 to mnuMenuItem.Count - 1 do if SameText(NormalizeEncoding(mnuMenuItem.Items[I].Caption), sEncoding) then mnuMenuItem.Items[I].Checked:= True; end; end. doublecmd-0.5.8/src/ulng.pas0000644000175000017500000006207612205645056014767 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Localization core unit Copyright (C) 2007-2009 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uLng; {$mode objfpc}{$H+} interface uses LResources; resourcestring // File operations. rsMsgNotDelete = 'Can not delete file %s'; rsMsgCannotDeleteDirectory = 'Cannot delete directory %s'; rsMsgErrDirExists = 'Directory %s exists!'; rsMsgErrRename = 'Cannot rename file %s to %s'; rsMsgErrCannotCopyFile = 'Cannot copy file %s to %s'; rsMsgFileExistsRwrt = 'File %s exists, overwrite?'; rsMsgFileChangedSave = 'File %s changed, save?'; rsMsgFolderExistsRwrt = 'Folder %s exists, overwrite?'; rsMsgFileReadOnly = 'File %s is marked as read-only. Delete it?'; rsMsgNewFile = 'New file'; rsMsgDelFlDr = 'Delete %d selected files/directories?'; rsMsgDelSel = 'Delete selected "%s"?'; // 12.05.2009 - another message, when deleting to trash rsMsgDelFlDrT = 'Delete %d selected files/directories into trash can?'; rsMsgDelSelT = 'Delete selected "%s" into trash can?'; rsMsgDelToTrashForce = 'Can not delete "%s" to trash! Delete directly?'; rsMsgFileNotFound = 'File "%s" not found.'; // --- rsMsgWipeFlDr = 'Wipe %d selected files/directories?'; rsMsgWipeSel = 'Wipe selected "%s"?'; rsMsgCpFlDr = 'Copy %d selected files/directories?'; rsMsgCpSel = 'Copy selected "%s"?'; rsMsgRenFlDr = 'Rename/move %d selected files/directories?'; rsMsgRenSel = 'Rename/move selected "%s"?'; rsMsgErrForceDir = 'Can not create directory %s!'; rsMsgSelectedInfo = 'Selected: %s of %s, files: %d of %d, folders: %d of %d'; rsMsgPopUpHotAdd = '&Add %s'; rsMsgPopUpHotCnf = '&Configure'; rsMsgCloseLockedTab = 'This tab (%s) is locked! Close anyway?'; rsSpaceMsg = 'Files: %d, Dirs: %d, Size: %s (%s bytes)'; rsSelectDir = 'Select a directory'; rsMarkPlus = 'Select mask'; rsMarkMinus = 'Unselect mask'; rsMaskInput = 'Input mask:'; rsFreeMsg = 'Free %s from %s bytes'; rsFreeMsgShort = '%s bytes free'; rsMsgPopUpHotDelete = '&Delete %s'; rsMsgDiskNotAvail = 'Disk is not available'; rsMsgChDirFailed = 'ChDir to [%s] failed!'; rsMsgNoFreeSpaceCont = 'No enough free space on target drive, Continue?'; rsMsgNoFreeSpaceRetry = 'No enough free space on target drive, Retry?'; rsMsgSetVolumeLabel = 'Set volume label'; rsMsgVolumeLabel = 'Volume label:'; rsMsgRestartForApplyChanges = 'Please, restart Double Commander in order to apply changes'; rsMsgEnterName = 'Enter name:'; rsMsgEnterFileExt = 'Enter file extension:'; rsMsgFollowSymlink = 'Follow symlink "%s"?'; rsMsgFileSizeTooBig = 'The file size of "%s" is too big for destination file system!'; rsMsgCloseAllInActiveTabs = 'Remove all inactive tabs?'; rsMsgErrRegExpSyntax = 'Syntax error in regular expression!'; rsMsgNoFilesSelected = 'No files selected.'; rsMsgTooManyFilesSelected = 'Too many files selected.'; rsMsgInvalidSelection = 'Invalid selection.'; rsMsgNotImplemented = 'Not implemented.'; rsMsgInvalidFilename = 'Invalid filename'; rsMsgInvalidPath = 'Invalid path'; rsMsgInvalidPathLong = 'Path %s contains forbidden characters.'; rsMsgSelectOnlyCheckSumFiles = 'Please select only check sum files!'; rsMsgPresetAlreadyExists = 'Preset "%s" already exists. Overwrite?'; rsMsgTitleNewEntryHotDir = 'New title for menu entry:'; rsMsgManualAddHotDir = 'Manually add hot path'; rsMsgManualEditHotDir = 'Manualy edit hot path'; rsMsgManualHotDirQuery = 'Enter name and path (format name=path):'; rsMsgVolumeSizeEnter = 'Please enter the volume size:'; rsMsgArchiverCustomParams = 'Additional parameters for archiver command-line:'; rsMsgMasterPassword = 'Master Password'; rsMsgMasterPasswordEnter = 'Please enter the master password:'; rsMsgPasswordEnter = 'Please enter the password:'; rsMsgPasswordVerify = 'Please re-enter the password for verification:'; rsMsgPasswordDiff = 'Passwords are different!'; rsMsgUserName = 'User name:'; rsMsgPassword = 'Password:'; rsMsgAccount = 'Account:'; rsMsgUserNameFirewall = 'User name (Firewall):'; rsMsgPasswordFirewall = 'Password (Firewall):'; rsMsgTargetDir = 'Target path:'; rsMsgURL = 'URL:'; rsMsgLoadingFileList = 'Loading file list...'; rsMsgNoFiles = 'No files'; rsMsgErrSetAttribute = 'Can not set attributes for "%s"'; rsMsgErrSetDateTime = 'Can not set date/time for "%s"'; rsMsgErrSetOwnership = 'Can not set owner/group for "%s"'; rsMsgErrDateNotSupported = 'Date %s is not supported'; rsMsgErrSaveFile = 'Cannot save file'; rsMsgErrCanNotConnect = 'Can not connect to server: "%s"'; rsMsgErrSaveAssociation = 'Can not save association!'; rsMsgFileOperationsActive = 'File operations active'; rsMsgFileOperationsActiveLong = 'Some file operations have not yet finished. Closing Double Commander may result in data loss.'; rsMsgConfirmQuit = 'Are you sure you want to quit?'; rsMsgCanNotCopyMoveItSelf = 'You can not copy/move a file "%s" to itself!'; rsMsgTabRenameCaption = 'Rename tab'; rsMsgTabRenamePrompt = 'New tab name:'; rsMsgInvalidPlugin = 'This is not a valid plugin!'; rsMsgInvalidPluginArchitecture = 'This plugin is built for Double Commander for %s.%sIt can not work with Double Commander for %s!'; rsMsgErrCreateFileDirectoryExists = 'There already exists a directory named "%s".'; rsMsgDeletePartiallyCopied = 'Delete the partially copied file ?'; rsMsgInvalidCommandLine = 'Error in command line'; rsMsgInvalidQuoting = 'Invalid quoting'; rsMsgErrorInContextMenuCommand = 'Error in context menu command'; rsMsgErrorLoadingConfiguration = 'Error when loading configuration'; rsMsgInvalidFormatOfConfigurationFile = 'Invalid format of configuration file'; // for context menu rsMnuActions = 'Actions'; rsMnuView = 'View'; rsMnuEdit = 'Edit'; rsMnuOpenWith = 'Open with'; rsMnuOpenWithOther = 'Other...'; rsMnuMount = 'Mount'; rsMnuUmount = 'Unmount'; rsMnuNoMedia = 'No media available'; rsMnuEject = 'Eject'; rsMnuSortBy = 'Sort by'; rsMnuNew = 'New'; // wcx module messages rsMsgSelLocNextVol = 'Please select location of next volume'; rsMsgNextVolUnpack = 'Next volume will be unpacked'; // wcx module errors messages rsMsgErrEndArchive = 'No more files in archive'; rsMsgErrNoMemory = 'Not enough memory'; rsMsgErrBadData = 'Data is bad'; rsMsgErrBadArchive = 'CRC error in archive data'; rsMsgErrUnknownFormat = 'Archive format unknown'; rsMsgErrEOpen = 'Cannot open existing file'; rsMsgErrECreate = 'Cannot create file'; rsMsgErrEClose = 'Error closing file'; rsMsgErrERead = 'Error reading from file'; rsMsgErrEWrite = 'Error writing to file'; rsMsgErrSmallBuf = 'Buffer too small'; rsMsgErrEAborted = 'Function aborted by user'; rsMsgErrNoFiles = 'No files found'; rsMsgErrTooManyFiles = 'Too many files to pack'; rsMsgErrNotSupported = 'Function not supported!'; rsMsgErrInvalidLink = 'Invalid link'; // Vfs rsVfsNetwork = 'Network'; // Buttons. rsDlgButtonOK = '&OK'; rsDlgButtonNo = '&No'; rsDlgButtonYes = '&Yes'; rsDlgButtonCancel = '&Cancel'; rsDlgButtonNone = 'Non&e'; rsDlgButtonAppend = 'A&ppend'; rsDlgButtonResume = '&Resume'; rsDlgButtonCopyInto = 'Copy &Into'; rsDlgButtonCopyIntoAll = 'Copy Into &All'; rsDlgButtonOverwrite = '&Overwrite'; rsDlgButtonOverwriteAll = 'Overwrite &All'; rsDlgButtonOverwriteOlder = 'Overwrite All Ol&der'; rsDlgButtonSkip = '&Skip'; rsDlgButtonSkipAll = 'S&kip All'; rsDlgButtonIgnoreAll = 'I&gnore All'; rsDlgButtonAll = 'A&ll'; rsDlgButtonRetry = 'Re&try'; rsDlgButtonAbort = 'Ab&ort'; rsDlgButtonContinue = '&Continue'; rsDlgButtonExitProgram = 'E&xit program'; // Log file rsMsgLogSuccess = 'Done: '; rsMsgLogError = 'Error: '; rsMsgLogInfo = 'Info: '; rsMsgLogCopy = 'Copy file %s'; rsMsgLogMove = 'Move file %s'; rsMsgLogDelete = 'Delete file %s'; rsMsgLogLink = 'Create link %s'; rsMsgLogSymLink = 'Create symlink %s'; rsMsgLogMkDir = 'Create directory %s'; rsMsgLogRmDir = 'Remove directory %s'; rsMsgLogPack = 'Pack to file %s'; rsMsgLogExtract = 'Extract file %s'; rsMsgLogTest = 'Test file integrity %s'; rsSearchResult = 'Search result'; rsShowHelpFor = '&Show help for %s'; rsClipboardContainsInvalidToolbarData = 'Clipboard doesn''t contain any valid toolbar data.'; // File operations dialog rsDlgAllOpComplete = 'All operations completed'; rsDlgAllOpProgress = 'Progress of all operations %d %%'; rsDlgCalcStatistics = 'Calculate files and folders'; rsDlgCheckSumCalc = 'Calculate check sum...'; rsDlgCheckSumVerify = 'Verify check sum...'; rsDlgCp = 'Copy file(s)'; rsDlgDel = 'Delete file(s)'; rsDlgMv = 'Move file(s)'; rsDlgOpPause = 'Pau&se'; rsDlgOpStart = '&Start'; rsDlgQueue = 'Queue'; rsDlgSpeed = 'Speed %s/s'; rsDlgSpeedTime = 'Speed %s/s, time remaining %s'; rsDlgSplit = 'Split'; rsDlgWipe = 'Wipe file(s)'; // File operations rsFileOpFileExistsOptions = 'Ask;Overwrite;Overwrite Older;Skip'; rsFileOpDirectoryExistsOptions = 'Ask;Overwrite;Copy into;Skip'; rsFileOpSetPropertyErrorOptions = 'Ask;Don''t set anymore;Ignore errors'; // Viewer rsViewAboutText = 'Internal Viewer of Double Commander.'; rsViewNotFound = '%s not found!'; rsViewEncoding = 'Encoding'; // Editor rsEditAboutText = 'Internal Editor of Double Commander.'; // Editor Highlighters rsSynLangPlainText = 'Plain text'; rsSynDefaultText = 'Default text'; // Columns in file panel rsColName = 'Name'; rsColExt = 'Ext'; rsColSize = 'Size'; rsColDate = 'Date'; rsColAttr = 'Attr'; // Filter status in file panel rsFilterStatus = 'FILTER'; // Cancel operations in file panel rsCancelFilter = 'Cancel Quick Filter'; rsCancelOperation = 'Cancel Current Operation'; // File function names rsFuncName = 'Name'; rsFuncExt = 'Extension'; rsFuncSize = 'Size'; rsFuncAttr = 'Attributes'; rsFuncPath = 'Path'; rsFuncGroup = 'Group'; rsFuncOwner = 'Owner'; rsFuncMTime = 'Modification date/time'; rsFuncCTime = 'Creation date/time'; rsFuncATime = 'Access date/time'; rsFuncLinkTo = 'Link to'; rsFuncNameNoExt = 'Name without extension'; rsFuncType = 'Type'; rsFuncComment = 'Comment'; rsFuncCompressedSize = 'Compressed size'; // Tools rsToolViewer = 'Viewer'; rsToolEditor = 'Editor'; rsToolDiffer = 'Differ'; rsToolTerminal = 'Terminal'; rsToolErrorOpeningViewer = 'Error opening viewer'; rsToolErrorOpeningEditor = 'Error opening editor'; rsToolErrorOpeningDiffer = 'Error opening differ'; rsToolErrorOpeningTerminal = 'Error opening terminal'; // Configure custom columns dialog rsConfColDelete = 'Delete'; rsConfColCaption = 'Caption'; rsConfColWidth = 'Width'; rsConfColAlign = 'Align'; rsConfColFieldCont = 'Field contents'; rsConfColMove='Move'; rsConfColConfig='Config'; rsConfCustHeader='Customize column'; // File properties dialog rsPropsYes = 'Yes (%s)'; rsPropsNo = 'No'; rsPropsFolder = 'Directory'; rsPropsFile = 'File'; rsPropsSpChrDev = 'Special character device'; rsPropsSpBlkDev = 'Special block device'; rsPropsNmdPipe = 'Named pipe'; rsPropsSymLink = 'Symbolic link'; rsPropsSocket = 'Socket'; rsPropsUnknownType = 'Unknown type'; rsPropsContains = 'Files: %d, folders: %d'; rsPropsErrChMod = 'Can not change access rights for "%s"'; rsPropsErrChOwn = 'Can not change owner for "%s"'; //Compare by content Dialog rsCompareDiffs = 'Number of changes:'; // Find files dialog rsFindSearchFiles = 'Find files'; rsFindDefineTemplate = 'Define template'; rsFindScanning = 'Scanning'; rsFindScanned = 'Scanned: %d'; rsFindFound = 'Found: %d'; rsFindWhereBeg = 'Begin at'; rsFindDirNoEx = 'Directory %s does not exist!'; rsFindDepthAll = 'all (unlimited depth)'; rsFindDepthCurDir = 'current dir only'; rsFindDepth = '%s level(s)'; rsFindSaveTemplateCaption = 'Save search template'; rsFindSaveTemplateTitle = 'Template name:'; rsSearchTemplateUnnamed = ''; rsTimeUnitSecond = 'Second(s)'; rsTimeUnitMinute = 'Minute(s)'; rsTimeUnitHour = 'Hour(s)'; rsTimeUnitDay = 'Day(s)'; rsTimeUnitWeek = 'Week(s)'; rsTimeUnitMonth = 'Month(s)'; rsTimeUnitYear = 'Year(s)'; rsSizeUnitBytes = 'Bytes'; rsSizeUnitKBytes = 'Kilobytes'; rsSizeUnitMBytes = 'Megabytes'; rsSizeUnitGBytes = 'Gigabytes'; rsSizeUnitTBytes = 'Terabytes'; // Other rsCopyNameTemplate = 'Copy (%d) %s'; // Symlink dialog rsSymErrCreate = 'Error creating symlink.'; // Hardlink dialog rsHardErrCreate = 'Error creating hardlink.'; // Linker dialog rsLinkMsgOK = 'Linker complete'; // Splitter dialog rsSplitSelDir = 'Select directory:'; rsSplitErrFileSize = 'Incorrect file size format!'; rsSplitErrDirectory = 'Unable to create target directory!'; rsSplitErrSplitFile = 'Unable to split the file!'; rsSplitMsgManyParts = 'The number of parts is more than 100! Continue?'; // MultiRename dialog rsMulRenFileNameStyleList = 'No change;UPPERCASE;lowercase;First char uppercase;' + 'First Char Of Every Word Uppercase;'; // Drive status rsDriveNoMedia = ''; rsDriveNoLabel = ''; // Edit rsEditNewFile = 'new.txt'; rsEditNewOpen = 'Open file'; rsEditNewFileName = 'Filename:'; // Edit search rsEditSearchCaption = 'Search'; rsEditSearchReplace ='Replace'; rsEditSearchFrw = '&Forward'; rsEditSearchBack = '&Backward'; // Options editors rsOptionsEditorArchivers = 'Archivers'; rsOptionsEditorAutoRefresh = 'Auto refresh'; rsOptionsEditorBehavior = 'Behaviors'; rsOptionsEditorColors = 'Colors'; rsOptionsEditorColumnsView = 'Columns'; rsOptionsEditorCustomColumns = 'Custom columns'; rsOptionsEditorConfiguration = 'Configuration'; rsOptionsEditorDragAndDrop = 'Drag & drop'; rsOptionsEditorDrivesListButton = 'Drives list button'; rsOptionsEditorFileOperations = 'File operations'; rsOptionsEditorFilePanels = 'File panels'; rsOptionsEditorFileTypes = 'File types'; rsOptionsEditorFilesViews = 'Files views'; rsOptionsEditorFolderTabs = 'Folder tabs'; rsOptionsEditorFonts = 'Fonts'; rsOptionsEditorHighlighters = 'Highlighters'; rsOptionsEditorHotKeys = 'Hot keys'; rsOptionsEditorIcons = 'Icons'; rsOptionsEditorIgnoreList = 'Ignore list'; rsOptionsEditorKeyboard = 'Keys'; rsOptionsEditorLanguage = 'Language'; rsOptionsEditorLayout = 'Layout'; rsOptionsEditorLog = 'Log'; rsOptionsEditorMiscellaneous = 'Miscellaneous'; rsOptionsEditorMouse = 'Mouse'; rsOptionsEditorPlugins = 'Plugins'; rsOptionsEditorQuickSearch = 'Quick search/filter'; rsOptionsEditorTerminal = 'Terminal'; rsOptionsEditorToolbar = 'Toolbar'; rsOptionsEditorTools = 'Tools'; rsOptionsEditorTooltips = 'Tooltips'; //------------------------------- rsOptArchiveParam = 'Parameter'; rsOptArchiveValue = 'Value'; rsOptArchiveDelete = 'Delete:'; rsOptArchiveTest = 'Test:'; rsOptArchiveExtractWithoutPath = 'Extract without path:'; rsOptArchiveSelfExtract = 'Create self extracting archive:'; rsOptArchiveID = 'ID:'; rsOptArchiveIDPos = 'ID Position:'; rsOptArchiveIDSeekRange = 'ID Seek Range:'; rsOptArchivePasswordQuery = 'Password query string:'; rsOptArchiveFormMode = 'Format parsing mode:'; //------------------------------- rsOptEnterExt = 'Enter extension'; rsOptAssocPluginWith = 'Associate plugin "%s" with:'; rsOptEnable = 'Enable'; rsOptDisable = 'Disable'; rsOptMouseSelectionButton = 'Left button;Right button;'; rsOptAutoSizeColumn = 'First;Last;'; rsOptTabsPosition = 'Top;Bottom;'; rsOptArchiveTypeName = 'Archive type name:'; //------------------------------- rsOptExampleMark = 'Mark'; rsOptExampleText = 'Text'; rsOptExampleCursor = 'Cursor'; rsOptExampleMarkCursor = 'Mark + Cursor'; // Hotkeys rsOptHotkeysAddDeleteShortcutLong = 'Shortcut %s for cm_Delete will be registered, so it can be used to reverse this setting.'; rsOptHotkeysAddShortcutButton = 'Add shortcut'; rsOptHotkeysCannotSetShortcut = 'Cannot set shortcut'; rsOptHotkeysChangeShortcut = 'Change shortcut'; rsOptHotkeysDeleteTrashCanOverrides = 'Shortcut %s for cm_Delete has a parameter that overrides this setting. Do you want to change this parameter to use the global setting?'; rsOptHotkeysDeleteTrashCanParameterExists = 'Shortcut %s for cm_Delete needs to have a parameter changed to match shortcut %s. Do you want to change it?'; rsOptHotkeysSetDeleteShortcut = 'Set shortcut to delete file'; rsOptHotkeysShortcutForDeleteAlreadyAssigned = 'For this setting to work with shortcut %s, shortcut %s must be assigned to cm_Delete but it is already assigned to %s. Do you want to change it?'; rsOptHotkeysShortcutForDeleteIsSequence = 'Shortcut %s for cm_Delete is a sequence shortcut for which a hotkey with reversed Shift cannot be assigned. This setting might not work.'; rsOptHotkeysCommand = 'Command'; rsOptHotkeysDescription = 'Description'; rsOptHotkeysFixParameter = 'Fix parameter'; rsOptHotkeysHotkeys = 'Hotkeys'; rsOptHotkeysHotkey = 'Hotkey'; rsOptHotkeysNoHotkey = ''; rsOptHotkeysParameters = 'Parameters'; rsOptHotkeysShortCutUsed = 'Shortcut in use'; rsOptHotkeysShortCutUsedText1 = 'Shortcut %s is already used.'; rsOptHotkeysShortCutUsedText2 = 'Change it to %s?'; rsOptHotkeysUsedBy = 'used for %s in %s'; rsOptHotkeysUsedWithDifferentParams = 'used for this command but with different parameters'; rsOptHotkeysAddHotkey = 'Add hotkey for %s'; rsOptHotkeysEditHotkey = 'Edit hotkey for %s'; rsHotkeyCategoryMain = 'Main'; rsHotkeyCategoryViewer = 'Viewer'; rsHotkeyCategoryDiffer = 'Differ'; rsHotkeyCategoryCopyMoveDialog = 'Copy/Move Dialog'; // Plugins rsOptPluginsActive = 'Active'; rsOptPluginsName = 'Name'; rsOptPluginsRegisteredFor = 'Registered for'; rsOptPluginsFileName = 'File name'; rsOptPluginAlreadyAssigned = 'Plugin %s is already assigned for the following extensions:'; //------------------------------- rsOptSortMethod = 'Alphabetical, considering accents;Natural sorting: alphabetical and numbers'; rsOptSortCaseSens = 'not case sensitive;according to locale settings (aAbBcC);first upper then lower case (ABCabc)'; rsOptSortFolderMode = 'sort by name and show first;sort like files and show first;sort like files'; rsOptNewFilesPosition = 'at the top of the file list;after directories (if directories are sorted before files);at sorted position;at the bottom of the file list'; rsOptUpdatedFilesPosition = 'don''t change position;use the same setting as for new files;to sorted position'; rsOptFileOperationsProgressKind = 'separate window;minimized separate window;operations panel'; rsOptFileSizeFormat = 'float;B;K;M;G'; // Keyboard rsOptLetters = 'None;Command Line;Quick Search;Quick Filter'; // Quick Search/Filter rsOptSearchItems = '&Files;Di&rectories;Files a&nd Directories'; rsOptSearchCase = '&Sensitive;&Insensitive'; rsOptSearchOpt = '&Hide filter panel when not focused'; // Toolbar rsOptToolbarButtonType = 'S&eparator;Inte&rnal command;E&xternal command;Men&u'; //Columns Menu rsMenuConfigureCustomColumns= 'Configure custom columns'; rsMenuConfigureThisCustomColumn= 'Configure this custom columns view'; // Operation states. rsOperNotStarted = 'Not started'; rsOperStarting = 'Starting'; rsOperRunning = 'Running'; rsOperPausing = 'Pausing'; rsOperPaused = 'Paused'; rsOperWaitingForFeedback = 'Waiting for user response'; rsOperWaitingForConnection = 'Waiting for access to file source'; rsOperStopping = 'Stopping'; rsOperStopped = 'Stopped'; rsOperFinished = 'Finished'; rsOperAborted = 'Aborted'; rsOperQueued = 'Queued'; // Operations descriptions. rsOperCalculatingCheckSum = 'Calculating check sum'; rsOperCalculatingCheckSumIn = 'Calculating check sum in "%s"'; rsOperCalculatingCheckSumOf = 'Calculating check sum of "%s"'; rsOperCalculatingStatictics = 'Calculating'; rsOperCalculatingStatisticsIn = 'Calculating "%s"'; rsOperCombining = 'Joining'; rsOperCombiningFromTo = 'Joining files in "%s" to "%s"'; rsOperCopying = 'Copying'; rsOperCopyingFromTo = 'Copying from "%s" to "%s"'; rsOperCopyingSomethingTo = 'Copying "%s" to "%s"'; rsOperCreatingDirectory = 'Creating directory'; rsOperCreatingSomeDirectory = 'Creating directory "%s"'; rsOperDeleting = 'Deleting'; rsOperDeletingIn = 'Deleting in "%s"'; rsOperDeletingSomething = 'Deleting "%s"'; rsOperExecuting = 'Executing'; rsOperExecutingSomething = 'Executing "%s"'; rsOperExtracting = 'Extracting'; rsOperExtractingFromTo = 'Extracting from "%s" to "%s"'; rsOperListing = 'Listing'; rsOperListingIn = 'Listing "%s"'; rsOperMoving = 'Moving'; rsOperMovingFromTo = 'Moving from "%s" to "%s"'; rsOperMovingSomethingTo = 'Moving "%s" to "%s"'; rsOperPacking = 'Packing'; rsOperPackingFromTo = 'Packing from "%s" to "%s"'; rsOperPackingSomethingTo = 'Packing "%s" to "%s"'; rsOperSettingProperty = 'Setting property'; rsOperSettingPropertyIn = 'Setting property in "%s"'; rsOperSettingPropertyOf = 'Setting property of "%s"'; rsOperSplitting = 'Splitting'; rsOperSplittingFromTo = 'Splitting "%s" to "%s"'; rsOperTesting = 'Testing'; rsOperTestingSomething = 'Testing "%s"'; rsOperTestingIn = 'Testing in "%s"'; rsOperVerifyingCheckSum = 'Verifying check sum'; rsOperVerifyingCheckSumIn = 'Verifying check sum in "%s"'; rsOperVerifyingCheckSumOf = 'Verifying check sum of "%s"'; rsOperWiping = 'Wiping'; rsOperWipingIn = 'Wiping in "%s"'; rsOperWipingSomething = 'Wiping "%s"'; rsOperWorking = 'Working'; // Generic description for unknown operation // Unhandled error. rsUnhandledExceptionMessage = 'Please report this error to the bug tracker with a description ' + 'of what you were doing and the following file:%s' + 'Press %s to continue or %s to abort the program.'; function GetLanguageName(poFileName : String) : String; procedure lngLoadLng(const sFileName:String); procedure DoLoadLng; implementation uses Classes, SysUtils, StrUtils, GetText, Translations, uGlobs, uGlobsPaths, uTranslator, uDebug, uFileProcs, DCOSUtils, DCStrUtils; function GetLanguageName(poFileName : String) : String; var poFile : Integer; sLine : String; iPos1, iPos2 : Integer; begin poFile:= mbFileOpen(poFileName, fmOpenRead); // find first msgid line FileReadLn(poFile, sLine); while Pos('msgid', sLine) = 0 do FileReadLn(poFile, sLine); // read msgstr line FileReadLn(poFile, sLine); repeat FileReadLn(poFile, sLine); // find language name line if Pos('X-Poedit-Language:', sLine) <> 0 then begin iPos1 := Pos(':', sLine) + 2; iPos2 := Pos('\n', sLine) - 1; Result := Copy(sLine, iPos1, (iPos2 - iPos1) + 1); FileClose(poFile); Exit; end; until Pos('msgid', sLine) = 1; FileClose(poFile); Result := 'Language name not found'; end; procedure TranslateLCL(poFileName: String); var UserLang, LCLLngDir: String; Lang, FallbackLang: String; begin LCLLngDir:= gpLngDir + PathDelim + 'lcl' + PathDelim; if NumCountChars('.', poFileName) >= 2 then begin UserLang:= ExtractDelimited(2, poFileName, ['.']); poFileName:= LCLLngDir + Format('lclstrconsts.%s.po', [UserLang]); if not mbFileExists(poFileName) then begin GetLanguageIDs(Lang,FallbackLang); poFileName:= LCLLngDir + Format('lclstrconsts.%s.po', [Lang]); end; if not mbFileExists(poFileName) then poFileName:= LCLLngDir + Format('lclstrconsts.%s.po', [FallbackLang]); if mbFileExists(poFileName) then Translations.TranslateUnitResourceStrings('LCLStrConsts', poFileName); end; end; procedure lngLoadLng(const sFileName:String); var Lang, FallbackLang : String; begin { Localization } if sFileName = 'doublecmd.po' then Exit; // default english interface gPOFileName := sFileName; if not mbFileExists(gpLngDir + gPOFileName) then begin gPOFileName := 'doublecmd.%s.po'; GetLanguageIDs(Lang, FallbackLang); gPOFileName := Format(gPOFileName,[FallbackLang]); end; if not mbFileExists(gpLngDir + gPOFileName) then begin gPOFileName := Format(gPOFileName,[Lang]); end; if mbFileExists(gpLngDir + gPOFileName) then begin DCDebug('Loading lng file: ' + gpLngDir + gPOFileName); TranslateLCL(gPOFileName); Translations.TranslateUnitResourceStrings('uLng', gpLngDir + gPOFileName); LRSTranslator := TTranslator.Create(gpLngDir + gPOFileName); end; end; procedure DoLoadLng; begin lngLoadLng(gPOFileName); end; finalization if Assigned(LRSTranslator) then FreeAndNil(LRSTranslator); end. doublecmd-0.5.8/src/ushowform.pas0000644000175000017500000001130612014201074016023 0ustar alexxalexx{ Seksi Commander ---------------------------- Licence : GNU GPL v 2.0 Author : radek.cervinka@centrum.cz showing editor or viewer by configuration dialog contributors: Copyright (C) 2006-2008 Koblov Alexander (Alexx2000@mail.ru) } unit uShowForm; interface uses Classes, uFileSource; type { TWaitThread } TWaitThread = class(TThread) private FFileList : TStringList; FFileSource: IFileSource; protected procedure Execute; override; public constructor Create(const FilesToView: TStringList; const aFileSource: IFileSource); destructor Destroy; override; end; procedure ShowEditorByGlob(sFileName:String); procedure ShowViewerByGlob(sFileName:String); procedure ShowViewerByGlobList(const FilesToView: TStringList; const aFileSource: IFileSource); implementation uses SysUtils, Process, UTF8Process, Dialogs, uGlobs, uOSUtils, fEditor, fViewer, uDCUtils, uTempFileSystemFileSource, uLng, uDebug, DCOSUtils; procedure RunExtTool(const ExtTool: TExternalToolOptions; sFileName: String); var CommandLine: String; begin CommandLine := QuoteStr(ReplaceEnvVars(ExtTool.Path)); if ExtTool.Parameters <> EmptyStr then CommandLine := CommandLine + ' ' + ExtTool.Parameters; CommandLine := CommandLine + ' ' + QuoteStr(sFileName); ExecCmdFork(CommandLine, ExtTool.RunInTerminal, '', ExtTool.KeepTerminalOpen); end; procedure ShowEditorByGlob(sFileName:String); begin if gExternalTools[etEditor].Enabled then begin try RunExtTool(gExternalTools[etEditor], sFileName); except on e: EInvalidCommandLine do MessageDlg(rsToolErrorOpeningEditor, rsMsgInvalidCommandLine + ' (' + rsToolEditor + '):' + LineEnding + e.Message, mtError, [mbOK], 0); end; end else ShowEditor(sFileName); end; procedure ShowViewerByGlob(sFileName:String); var sl:TStringList; begin if gExternalTools[etViewer].Enabled then begin try RunExtTool(gExternalTools[etViewer], sFileName); except on e: EInvalidCommandLine do MessageDlg(rsToolErrorOpeningViewer, rsMsgInvalidCommandLine + ' (' + rsToolViewer + '):' + LineEnding + e.Message, mtError, [mbOK], 0); end; end else begin sl:=TStringList.Create; try sl.Add(sFileName); ShowViewer(sl); finally FreeAndNil(sl); end; end; end; procedure ShowViewerByGlobList(const FilesToView : TStringList; const aFileSource: IFileSource); var I : Integer; WaitThread : TWaitThread; begin if gExternalTools[etViewer].Enabled then begin DCDebug('ShowViewerByGlobList - Use ExtView'); if aFileSource.IsClass(TTempFileSystemFileSource) then begin WaitThread := TWaitThread.Create(FilesToView, aFileSource); WaitThread.Start; end else begin // TODO: If possible should run one instance of external viewer // with multiple file names as parameters. for i:=0 to FilesToView.Count-1 do RunExtTool(gExternalTools[etViewer], FilesToView.Strings[i]); end; end // gUseExtView else ShowViewer(FilesToView, aFileSource); end; { TWaitThread } constructor TWaitThread.Create(const FilesToView: TStringList; const aFileSource: IFileSource); begin inherited Create(True); FreeOnTerminate := True; FFileList := TStringList.Create; // Make a copy of list elements. FFileList.Assign(FilesToView); FFileSource := aFileSource; end; destructor TWaitThread.Destroy; begin if Assigned(FFileList) then FreeAndNil(FFileList); // Delete the temporary file source and all files inside. FFileSource := nil; inherited Destroy; end; procedure TWaitThread.Execute; var I : Integer; Process : TProcessUTF8; sCmd: String; begin Process := TProcessUTF8.Create(nil); with gExternalTools[etViewer] do begin sCmd := ReplaceEnvVars(Path); // TProcess arguments must be enclosed with double quotes and not escaped. if RunInTerminal then begin sCmd := QuoteStr(sCmd); if Parameters <> EmptyStr then sCmd := sCmd + ' ' + Parameters; sCmd := sCmd + ' ' + QuoteStr(FFileList.Strings[0]); sCmd := FormatTerminal(sCmd, False); end else begin sCmd := '"' + sCmd + '"'; if Parameters <> EmptyStr then sCmd := sCmd + ' ' + Parameters; sCmd := sCmd + ' "' + FFileList.Strings[0] + '"'; end; end; Process.CommandLine := sCmd; Process.Options := [poWaitOnExit]; Process.Execute; Process.Free; if not FFileSource.IsClass(TTempFileSystemFileSource) then begin (* Delete temp files after view *) for I := 0 to FFileList.Count - 1 do mbDeleteFile(FFileList.Strings[I]); end; end; end. doublecmd-0.5.8/src/ffileproperties.lrt0000644000175000017500000000377312023046500017224 0ustar alexxalexxTFRMFILEPROPERTIES.CAPTION=Properties TFRMFILEPROPERTIES.TSPROPERTIES.CAPTION=Properties TFRMFILEPROPERTIES.LBLFILENAME.CAPTION=??? TFRMFILEPROPERTIES.LBLFOLDER.CAPTION=??? TFRMFILEPROPERTIES.LBLTYPE.CAPTION=??? TFRMFILEPROPERTIES.LBLSYMLINK.CAPTION=??? TFRMFILEPROPERTIES.LBLSIZE.CAPTION=??? TFRMFILEPROPERTIES.LBLLASTACCESS.CAPTION=??? TFRMFILEPROPERTIES.LBLLASTMODIF.CAPTION=??? TFRMFILEPROPERTIES.LBLLASTSTCHANGE.CAPTION=??? TFRMFILEPROPERTIES.LBLCONTAINS.CAPTION=??? TFRMFILEPROPERTIES.LBLFILENAMESTR.CAPTION=Name: TFRMFILEPROPERTIES.LBLFOLDERSTR.CAPTION=Path: TFRMFILEPROPERTIES.LBLTYPESTR.CAPTION=Type: TFRMFILEPROPERTIES.LBLSYMLINKSTR.CAPTION=Symlink to: TFRMFILEPROPERTIES.LBLSIZESTR.CAPTION=Size: TFRMFILEPROPERTIES.LBLLASTACCESSSTR.CAPTION=Last access: TFRMFILEPROPERTIES.LBLLASTMODIFSTR.CAPTION=Last modification: TFRMFILEPROPERTIES.LBLLASTSTCHANGESTR.CAPTION=Last status change: TFRMFILEPROPERTIES.LBLCONTAINSSTR.CAPTION=Contains: TFRMFILEPROPERTIES.TSATTRIBUTES.CAPTION=Attributes TFRMFILEPROPERTIES.LBLFILESTR.CAPTION=File name TFRMFILEPROPERTIES.LBLFILE.CAPTION=File name TFRMFILEPROPERTIES.LBLATTROWNERSTR.CAPTION=Owner TFRMFILEPROPERTIES.LBLWRITE.CAPTION=Write TFRMFILEPROPERTIES.LBLREAD.CAPTION=Read TFRMFILEPROPERTIES.LBLEXEC.CAPTION=Execute TFRMFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION=Group TFRMFILEPROPERTIES.LBLATTROTHERSTR.CAPTION=Other TFRMFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION=Text: TFRMFILEPROPERTIES.LBLATTRTEXT.CAPTION=----------- TFRMFILEPROPERTIES.LBLATTRBITSSTR.CAPTION=Bits: TFRMFILEPROPERTIES.LBLOCTAL.CAPTION=Octal: TFRMFILEPROPERTIES.CBSUID.CAPTION=SUID TFRMFILEPROPERTIES.CBSGID.CAPTION=SGID TFRMFILEPROPERTIES.CBSTICKY.CAPTION=Sticky TFRMFILEPROPERTIES.GBOWNER.CAPTION=Owner TFRMFILEPROPERTIES.LBLOWNERSTR.CAPTION=O&wner TFRMFILEPROPERTIES.LBLGROUPSTR.CAPTION=&Group TFRMFILEPROPERTIES.BTNSETPROPERTIES.CAPTION=&Set properties TFRMFILEPROPERTIES.BTNSETPROPERTIESTOALLFILES.CAPTION=Set to &all selected files TFRMFILEPROPERTIES.BTNSKIPFILE.CAPTION=Ski&p this file TFRMFILEPROPERTIES.BTNCLOSE.CAPTION=&Close doublecmd-0.5.8/src/ffileassoc.lfm0000644000175000017500000005271312023046500016113 0ustar alexxalexxobject frmFileAssoc: TfrmFileAssoc Left = 298 Height = 585 Top = 54 Width = 568 Caption = 'File associations' ClientHeight = 585 ClientWidth = 568 Constraints.MinHeight = 300 OnClose = FormClose OnCreate = FormCreate OnDestroy = FormDestroy Position = poScreenCenter SessionProperties = 'Height;Width;WindowState;Left;Top' ShowInTaskBar = stAlways LCLVersion = '1.1' object pnlButtonPanel: TPanel Left = 0 Height = 48 Top = 537 Width = 568 Align = alBottom AutoSize = True BevelInner = bvLowered ClientHeight = 48 ClientWidth = 568 TabOrder = 1 object btnOK: TBitBtn AnchorSideTop.Control = pnlButtonPanel AnchorSideRight.Control = btnCancel Left = 348 Height = 31 Top = 8 Width = 100 Anchors = [akTop, akRight] AutoSize = True BorderSpacing.Top = 6 BorderSpacing.Right = 6 BorderSpacing.Bottom = 6 Caption = '&OK' Constraints.MinWidth = 100 Kind = bkOK ModalResult = 1 OnClick = btnOKClick TabOrder = 0 end object btnCancel: TBitBtn AnchorSideTop.Control = pnlButtonPanel AnchorSideRight.Control = pnlButtonPanel AnchorSideRight.Side = asrBottom Left = 454 Height = 32 Top = 8 Width = 100 Anchors = [akTop, akRight] AutoSize = True BorderSpacing.Top = 6 BorderSpacing.Right = 12 BorderSpacing.Bottom = 6 Cancel = True Caption = '&Cancel' Constraints.MinWidth = 100 Kind = bkCancel ModalResult = 2 OnClick = btnCancelClick TabOrder = 1 end end object pnlSettings: TPanel Left = 0 Height = 532 Top = 0 Width = 568 Align = alClient BorderSpacing.Bottom = 5 BevelOuter = bvNone ClientHeight = 532 ClientWidth = 568 TabOrder = 0 OnResize = pnlSettingsResize object pnlRightSettings: TPanel AnchorSideLeft.Control = pnlLeftSettings AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlSettings AnchorSideRight.Control = pnlSettings AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = pnlSettings AnchorSideBottom.Side = asrBottom Left = 270 Height = 520 Top = 6 Width = 288 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 4 BorderSpacing.Right = 4 BorderSpacing.Around = 6 BevelOuter = bvNone ClientHeight = 520 ClientWidth = 288 Constraints.MinWidth = 200 TabOrder = 1 OnResize = pnlRightSettingsResize object gbActions: TGroupBox AnchorSideLeft.Control = pnlRightSettings AnchorSideTop.Control = gbExts AnchorSideTop.Side = asrBottom AnchorSideRight.Control = pnlRightSettings AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = gbIcon Left = 0 Height = 305 Top = 144 Width = 288 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Top = 4 BorderSpacing.Bottom = 4 Caption = 'Actions' ClientHeight = 282 ClientWidth = 284 TabOrder = 1 object lbActions: TListBox Left = 6 Height = 160 Top = 6 Width = 201 Align = alClient BorderSpacing.Around = 6 ItemHeight = 0 OnSelectionChange = lbActionsSelectionChange ScrollWidth = 199 TabOrder = 0 TopIndex = -1 end object pnlActsButtons: TPanel Left = 213 Height = 160 Top = 6 Width = 65 Align = alRight AutoSize = True BorderSpacing.Around = 6 BevelOuter = bvNone ChildSizing.Layout = cclLeftToRightThenTopToBottom ClientHeight = 160 ClientWidth = 65 TabOrder = 1 object btnUpAct: TButton Left = 0 Height = 35 Top = 0 Width = 65 AutoSize = True BorderSpacing.InnerBorder = 2 Caption = '&Up' OnClick = btnUpActClick TabOrder = 0 end object btnDownAct: TButton Left = 0 Height = 35 Top = 35 Width = 65 AutoSize = True BorderSpacing.InnerBorder = 2 Caption = '&Down' OnClick = btnDownActClick TabOrder = 1 end object btnAddAct: TButton Left = 0 Height = 35 Top = 70 Width = 65 AutoSize = True BorderSpacing.InnerBorder = 2 Caption = 'Add' OnClick = btnAddActClick TabOrder = 2 end object btnRemoveAct: TButton Left = 0 Height = 35 Top = 105 Width = 65 AutoSize = True BorderSpacing.InnerBorder = 2 Caption = 'Remo&ve' OnClick = btnRemoveActClick TabOrder = 3 end end object pnlActsEdits: TPanel Left = 0 Height = 110 Top = 172 Width = 284 Align = alBottom AutoSize = True BevelOuter = bvNone ClientHeight = 110 ClientWidth = 284 TabOrder = 2 object lblCommand: TLabel AnchorSideLeft.Control = lblAction AnchorSideTop.Control = edbAction AnchorSideTop.Side = asrBottom Left = 6 Height = 18 Top = 52 Width = 67 BorderSpacing.Top = 6 Caption = '&Command:' FocusControl = fneCommand ParentColor = False end object btnCommands: TSpeedButton AnchorSideLeft.Control = fneCommand AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = fneCommand AnchorSideRight.Control = pnlActsEdits AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = fneCommand AnchorSideBottom.Side = asrBottom Left = 258 Height = 28 Top = 76 Width = 20 Anchors = [akTop, akRight, akBottom] AutoSize = True BorderSpacing.Left = 24 BorderSpacing.Right = 6 Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534CCA46534FFA46534FFA465 34CC000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534FFE6CEB7FFE6CEB7FFA465 34FF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534FFE6CEB7FFD9AD86FFA465 34FF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534FFE6CEB7FFD9AD86FFA465 34FF000000000000000000000000000000000000000000000000000000000000 0000A46534CCA46534FFA46534FFA46534FFA46534FFD9AD86FFD9AD86FFA465 34FFA46534FFA46534FFA46534FFA46534CC0000000000000000000000000000 0000A46534FFE5CCB4FFDBB795FFDBB694FFDAB492FFDAB390FFD9AD86FFD8AA 83FFD7A87FFFD7A67DFFE0BE9FFFA46534FF0000000000000000000000000000 0000A46534FFE8D3C0FFE7D1BBFFE7D1BCFFE6CEB7FFE6CEB7FFE6CEB7FFE6CE B7FFE6CDB6FFE6CCB5FFE6CCB6FFA46534FF0000000000000000000000000000 0000A46534CCA46534FFA46534FFA46534FFA46534FFE6CEB7FFE6CEB7FFA465 34FFA46534FFA46534FFA46534FFA46534CC0000000000000000000000000000 000000000000000000000000000000000000A46534FFE6CEB7FFE6CEB7FFA465 34FF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534FFE6CEB7FFE6CEB7FFA465 34FF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534FFE6CEB7FFE6CEB7FFA465 34FF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534CCA46534FFA46534FFA465 34CC000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } OnClick = btnCommandsClick end object lblAction: TLabel AnchorSideLeft.Control = pnlActsEdits AnchorSideTop.Control = pnlActsEdits Left = 6 Height = 18 Top = 0 Width = 46 BorderSpacing.Left = 6 Caption = 'Action:' FocusControl = edbAction ParentColor = False end object fneCommand: TFileNameEdit AnchorSideLeft.Control = lblCommand AnchorSideTop.Control = lblCommand AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnCommands AnchorSideBottom.Control = pnlActsEdits AnchorSideBottom.Side = asrBottom Left = 6 Height = 28 Top = 76 Width = 228 OnAcceptFileName = fneCommandAcceptFileName DialogOptions = [] FilterIndex = 0 HideDirectories = False ButtonWidth = 23 NumGlyphs = 1 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Top = 6 BorderSpacing.Bottom = 6 MaxLength = 0 TabOrder = 1 OnChange = fneCommandChange end object edbAction: TEditButton AnchorSideLeft.Control = lblAction AnchorSideTop.Control = lblAction AnchorSideTop.Side = asrBottom AnchorSideRight.Control = fneCommand AnchorSideRight.Side = asrBottom Left = 6 Height = 28 Top = 18 Width = 228 Anchors = [akTop, akLeft, akRight] ButtonWidth = 23 CharCase = ecNormal Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534CCA46534FFA46534FFA465 34CC000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534FFE6CEB7FFE6CEB7FFA465 34FF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534FFE6CEB7FFD9AD86FFA465 34FF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534FFE6CEB7FFD9AD86FFA465 34FF000000000000000000000000000000000000000000000000000000000000 0000A46534CCA46534FFA46534FFA46534FFA46534FFD9AD86FFD9AD86FFA465 34FFA46534FFA46534FFA46534FFA46534CC0000000000000000000000000000 0000A46534FFE5CCB4FFDBB795FFDBB694FFDAB492FFDAB390FFD9AD86FFD8AA 83FFD7A87FFFD7A67DFFE0BE9FFFA46534FF0000000000000000000000000000 0000A46534FFE8D3C0FFE7D1BBFFE7D1BCFFE6CEB7FFE6CEB7FFE6CEB7FFE6CE B7FFE6CDB6FFE6CCB5FFE6CCB6FFA46534FF0000000000000000000000000000 0000A46534CCA46534FFA46534FFA46534FFA46534FFE6CEB7FFE6CEB7FFA465 34FFA46534FFA46534FFA46534FFA46534CC0000000000000000000000000000 000000000000000000000000000000000000A46534FFE6CEB7FFE6CEB7FFA465 34FF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534FFE6CEB7FFE6CEB7FFA465 34FF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534FFE6CEB7FFE6CEB7FFA465 34FF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534CCA46534FFA46534FFA465 34CC000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } MaxLength = 0 NumGlyphs = 1 OnButtonClick = btnActionsClick OnChange = edtActionChange TabOrder = 0 end end end object gbIcon: TGroupBox AnchorSideLeft.Control = pnlRightSettings AnchorSideRight.Control = pnlRightSettings AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = pnlRightSettings AnchorSideBottom.Side = asrBottom Left = 0 Height = 67 Top = 453 Width = 288 Anchors = [akLeft, akRight, akBottom] AutoSize = True Caption = 'Icon' ClientHeight = 44 ClientWidth = 284 TabOrder = 2 object sbtnIcon: TSpeedButton AnchorSideLeft.Control = gbIcon AnchorSideTop.Control = gbIcon Left = 6 Height = 38 Top = 2 Width = 38 BorderSpacing.Left = 6 BorderSpacing.Top = 2 BorderSpacing.Bottom = 4 OnClick = sbtnIconClick end object btnRemoveIcon: TSpeedButton AnchorSideTop.Control = edtIconFileName AnchorSideRight.Control = gbIcon AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = edtIconFileName AnchorSideBottom.Side = asrBottom Left = 255 Height = 28 Top = 7 Width = 23 Anchors = [akTop, akRight, akBottom] BorderSpacing.Right = 6 Caption = 'X' Font.Style = [fsBold] OnClick = btnRemoveIconClick ParentFont = False end object edtIconFileName: TEdit AnchorSideLeft.Control = sbtnIcon AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = sbtnIcon AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnRemoveIcon Left = 48 Height = 28 Top = 7 Width = 207 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 4 OnChange = edtIconFileNameChange TabOrder = 0 end end object gbExts: TGroupBox AnchorSideLeft.Control = pnlRightSettings AnchorSideTop.Control = pnlRightSettings AnchorSideRight.Control = pnlRightSettings AnchorSideRight.Side = asrBottom Left = 0 Height = 140 Top = 0 Width = 288 Anchors = [akTop, akLeft, akRight] BorderSpacing.InnerBorder = 20 Caption = 'Extensions' ClientHeight = 117 ClientWidth = 284 TabOrder = 0 object lbExts: TListBox Left = 6 Height = 105 Top = 6 Width = 201 Align = alClient BorderSpacing.Around = 6 ItemHeight = 0 OnSelectionChange = lbExtsSelectionChange ScrollWidth = 199 TabOrder = 0 TopIndex = -1 end object pnlExtsButtons: TPanel Left = 213 Height = 105 Top = 6 Width = 65 Align = alRight AutoSize = True BorderSpacing.Around = 6 BevelOuter = bvNone ChildSizing.Layout = cclLeftToRightThenTopToBottom ClientHeight = 105 ClientWidth = 65 TabOrder = 1 object btnAddExt: TButton Left = 0 Height = 35 Top = 0 Width = 65 AutoSize = True BorderSpacing.InnerBorder = 2 Caption = '&Add' OnClick = btnAddExtClick TabOrder = 0 end object btnRemoveExt: TButton Left = 0 Height = 35 Top = 35 Width = 65 AutoSize = True BorderSpacing.InnerBorder = 2 Caption = 'Re&move' OnClick = btnRemoveExtClick TabOrder = 1 end end end end object pnlLeftSettings: TPanel AnchorSideLeft.Control = pnlSettings AnchorSideTop.Control = pnlSettings AnchorSideBottom.Control = pnlSettings AnchorSideBottom.Side = asrBottom Left = 10 Height = 520 Top = 6 Width = 250 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Left = 4 BorderSpacing.Around = 6 BevelOuter = bvNone ClientHeight = 520 ClientWidth = 250 TabOrder = 0 object gbFileTypes: TGroupBox Left = 0 Height = 520 Top = 0 Width = 250 Align = alClient Caption = 'File types' ClientHeight = 497 ClientWidth = 246 TabOrder = 0 object lbFileTypes: TListBox AnchorSideLeft.Control = gbFileTypes AnchorSideTop.Control = gbFileTypes AnchorSideRight.Control = gbFileTypes AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = btnAddNewType Left = 6 Height = 407 Top = 6 Width = 234 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Around = 6 ItemHeight = 20 OnDrawItem = lbFileTypesDrawItem OnSelectionChange = lbFileTypesSelectionChange ScrollWidth = 232 Style = lbOwnerDrawFixed TabOrder = 0 TopIndex = -1 end object btnAddNewType: TButton AnchorSideLeft.Control = gbFileTypes AnchorSideTop.Control = lbFileTypes AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbFileTypes AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = btnRemoveType Left = 6 Height = 35 Top = 419 Width = 234 Anchors = [akLeft, akRight, akBottom] AutoSize = True BorderSpacing.Left = 6 BorderSpacing.Right = 6 BorderSpacing.Bottom = 2 BorderSpacing.InnerBorder = 2 Caption = 'A&dd' OnClick = btnAddNewTypeClick TabOrder = 1 end object btnRemoveType: TButton AnchorSideLeft.Control = btnAddNewType Left = 6 Height = 35 Top = 456 Width = 65 Anchors = [akLeft, akBottom] AutoSize = True BorderSpacing.InnerBorder = 2 Caption = '&Remove' OnClick = btnRemoveTypeClick OnResize = btnRemoveTypeResize TabOrder = 2 end object btnRenameType: TButton AnchorSideRight.Control = btnAddNewType AnchorSideRight.Side = asrBottom Left = 175 Height = 35 Top = 456 Width = 65 Anchors = [akRight, akBottom] AutoSize = True BorderSpacing.InnerBorder = 2 Caption = 'R&ename' OnClick = btnRenameTypeClick OnResize = btnRenameTypeResize TabOrder = 3 end end end end object OpenPictureDialog: TOpenPictureDialog left = 24 top = 536 end object pmActions: TPopupMenu left = 64 top = 536 object miOpen: TMenuItem Caption = 'Open' OnClick = miActionsClick end object miView: TMenuItem Caption = 'View' OnClick = miActionsClick end object miEdit: TMenuItem Caption = 'Edit' OnClick = miActionsClick end end object pmCommands: TPopupMenu left = 96 top = 536 object miVfs: TMenuItem Caption = 'Open in VFS' OnClick = miCommandsClick end object miViewer: TMenuItem Caption = 'Open in Viewer' OnClick = miCommandsClick end object miEditor: TMenuItem Caption = 'Open in Editor' OnClick = miCommandsClick end object miShell: TMenuItem Caption = 'Run in terminal' OnClick = miCommandsClick end object miGetOutputFromCommand: TMenuItem Caption = 'Get output from command' OnClick = miCommandsClick end object miFileName: TMenuItem Caption = 'File name' OnClick = miCommandsClick end object miFilePath: TMenuItem Caption = 'File path' OnClick = miCommandsClick end object miFullPath: TMenuItem Caption = 'Full path' OnClick = miCommandsClick end end end doublecmd-0.5.8/src/fselecttextrange.lrt0000644000175000017500000000044512023046500017362 0ustar alexxalexxTFRMSELECTTEXTRANGE.LBLSELECTTEXT.CAPTION=&Select the characters to insert: TFRMSELECTTEXTRANGE.BTPPANEL.OKBUTTON.CAPTION=&OK TFRMSELECTTEXTRANGE.BTPPANEL.HELPBUTTON.CAPTION=&Help TFRMSELECTTEXTRANGE.BTPPANEL.CLOSEBUTTON.CAPTION=&Close TFRMSELECTTEXTRANGE.BTPPANEL.CANCELBUTTON.CAPTION=Cancel doublecmd-0.5.8/src/ukastoolitemsextended.pas0000644000175000017500000002402512215301020020413 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Extended tool items types for KASToolBar Copyright (C) 2012 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uKASToolItemsExtended; {$mode objfpc}{$H+} interface uses Classes, SysUtils, KASToolItems, KASToolBar, IniFiles, DCXmlConfig, uDrive, DCBasicTypes, uFormCommands; type { TKASCommandItem } TKASCommandItem = class(TKASNormalItem) strict private FCommands: IFormCommands; strict protected procedure SaveHint(Config: TXmlConfig; Node: TXmlNode); override; public Command: String; Params: TDynamicStringArray; constructor Create(AFormCommands: IFormCommands); reintroduce; procedure Assign(OtherItem: TKASToolItem); override; function Clone: TKASToolItem; override; function ConfigNodeName: String; override; procedure Load(Config: TXmlConfig; Node: TXmlNode; Loader: TKASToolBarLoader); override; procedure SaveContents(Config: TXmlConfig; Node: TXmlNode); override; end; { TKASProgramItem } TKASProgramItem = class(TKASNormalItem) Command: String; Params: String; StartPath: String; procedure Assign(OtherItem: TKASToolItem); override; function Clone: TKASToolItem; override; function ConfigNodeName: String; override; procedure Load(Config: TXmlConfig; Node: TXmlNode; Loader: TKASToolBarLoader); override; procedure SaveContents(Config: TXmlConfig; Node: TXmlNode); override; end; { TKASDriveItem } TKASDriveItem = class(TKASNormalItem) Drive: PDrive; procedure Assign(OtherItem: TKASToolItem); override; function Clone: TKASToolItem; override; function ConfigNodeName: String; override; end; TKASToolBarIniLoader = class; TOnLoadIniItem = procedure (Loader: TKASToolBarIniLoader; var Item: TKASToolItem; const Shortcut: String) of object; TOnOpenIniFile = function (FileName: String): TIniFile of object; { TKASToolBarIniLoader } TKASToolBarIniLoader = class strict private FCommands: IFormCommands; FDepthLevel: Integer; // In case .bar files reference each other public constructor Create(AFormCommands: IFormCommands); reintroduce; procedure Load(IniFileName: String; ToolBar: TKASToolBar; ToolItemMenu: TKASMenuItem; OnLoadIniItem: TOnLoadIniItem); end; { TKASToolBarExtendedLoader } TKASToolBarExtendedLoader = class(TKASToolBarLoader) strict private FCommands: IFormCommands; protected function CreateItem(Node: TXmlNode): TKASToolItem; override; public constructor Create(AFormCommands: IFormCommands); reintroduce; end; implementation uses DCClassesUtf8, DCStrUtils; const CommandItemConfigNode = 'Command'; ProgramItemConfigNode = 'Program'; DriveItemConfigNode = 'Drive'; { TKASDriveItem } procedure TKASDriveItem.Assign(OtherItem: TKASToolItem); var DriveItem: TKASDriveItem; begin inherited Assign(OtherItem); if OtherItem is TKASDriveItem then begin DriveItem := TKASDriveItem(OtherItem); Drive := DriveItem.Drive; end; end; function TKASDriveItem.Clone: TKASToolItem; begin Result := TKASDriveItem.Create; Result.Assign(Self); end; function TKASDriveItem.ConfigNodeName: String; begin Result := DriveItemConfigNode; end; { TKASCommandItem } procedure TKASCommandItem.Assign(OtherItem: TKASToolItem); var CommandItem: TKASCommandItem; begin inherited Assign(OtherItem); if OtherItem is TKASCommandItem then begin CommandItem := TKASCommandItem(OtherItem); Command := CommandItem.Command; Params := Copy(CommandItem.Params); end; end; function TKASCommandItem.Clone: TKASToolItem; begin Result := TKASCommandItem.Create(FCommands); Result.Assign(Self); end; function TKASCommandItem.ConfigNodeName: String; begin Result := CommandItemConfigNode; end; constructor TKASCommandItem.Create(AFormCommands: IFormCommands); begin FCommands := AFormCommands; end; procedure TKASCommandItem.Load(Config: TXmlConfig; Node: TXmlNode; Loader: TKASToolBarLoader); begin inherited Load(Config, Node, Loader); Params := nil; Node := Node.FirstChild; while Assigned(Node) do begin if Node.CompareName('Command') = 0 then Command := Config.GetContent(Node) else if Node.CompareName('Param') = 0 then AddString(Params, Config.GetContent(Node)); Node := Node.NextSibling; end; if Hint = EmptyStr then begin Hint := FCommands.GetCommandCaption(Command, cctLong); end; end; procedure TKASCommandItem.SaveContents(Config: TXmlConfig; Node: TXmlNode); var AParam: String; begin inherited SaveContents(Config, Node); Config.AddValue(Node, 'Command', Command); for AParam in Params do Config.AddValueDef(Node, 'Param', AParam, ''); end; procedure TKASCommandItem.SaveHint(Config: TXmlConfig; Node: TXmlNode); begin if Hint <> FCommands.GetCommandCaption(Command, cctLong) then begin Config.AddValueDef(Node, 'Hint', Hint, ''); end; // else don't save default text for the hint so that a different text // can be loaded if the language changes. end; { TKASProgramItem } procedure TKASProgramItem.Assign(OtherItem: TKASToolItem); var ProgramItem: TKASProgramItem; begin inherited Assign(OtherItem); if OtherItem is TKASProgramItem then begin ProgramItem := TKASProgramItem(OtherItem); Command := ProgramItem.Command; Params := ProgramItem.Params; StartPath := ProgramItem.StartPath; end; end; function TKASProgramItem.Clone: TKASToolItem; begin Result := TKASProgramItem.Create; Result.Assign(Self); end; function TKASProgramItem.ConfigNodeName: String; begin Result := ProgramItemConfigNode; end; procedure TKASProgramItem.Load(Config: TXmlConfig; Node: TXmlNode; Loader: TKASToolBarLoader); begin inherited Load(Config, Node, Loader); Node := Node.FirstChild; while Assigned(Node) do begin if Node.CompareName('Command') = 0 then Command := Config.GetContent(Node) else if Node.CompareName('Params') = 0 then Params := Config.GetContent(Node) else if Node.CompareName('StartPath') = 0 then StartPath := Config.GetContent(Node); Node := Node.NextSibling; end; end; procedure TKASProgramItem.SaveContents(Config: TXmlConfig; Node: TXmlNode); begin inherited SaveContents(Config, Node); Config.AddValueDef(Node, 'Command', Command, ''); Config.AddValueDef(Node, 'Params', Params, ''); Config.AddValueDef(Node, 'StartPath', StartPath, ''); end; { TKASToolBarExtendedLoader } constructor TKASToolBarExtendedLoader.Create(AFormCommands: IFormCommands); begin FCommands := AFormCommands; end; function TKASToolBarExtendedLoader.CreateItem(Node: TXmlNode): TKASToolItem; begin Result := inherited CreateItem(Node); if not Assigned(Result) then begin if Node.CompareName(CommandItemConfigNode) = 0 then Result := TKASCommandItem.Create(FCommands) else if Node.CompareName(ProgramItemConfigNode) = 0 then Result := TKASProgramItem.Create else if Node.CompareName(DriveItemConfigNode) = 0 then Result := TKASDriveItem.Create; end; end; { TKASToolBarIniLoader } constructor TKASToolBarIniLoader.Create(AFormCommands: IFormCommands); begin FCommands := AFormCommands; end; procedure TKASToolBarIniLoader.Load(IniFileName: String; ToolBar: TKASToolBar; ToolItemMenu: TKASMenuItem; OnLoadIniItem: TOnLoadIniItem); var BtnCount, I: Integer; CommandItem: TKASCommandItem; ProgramItem: TKASProgramItem; Command, Menu, Button, Param, Path, Misk: String; Item: TKASToolItem; IniFile: TIniFileEx = nil; begin if (FDepthLevel < 10) then begin IniFile := TIniFileEx.Create(IniFileName, fmOpenRead or fmShareDenyNone); if Assigned(IniFile) then try Inc(FDepthLevel); BtnCount := IniFile.ReadInteger('Buttonbar', 'Buttoncount', 0); for I := 1 to BtnCount do begin Command := IniFile.ReadString('Buttonbar', 'cmd' + IntToStr(I), ''); Menu := IniFile.ReadString('Buttonbar', 'menu' + IntToStr(I), ''); Button := IniFile.ReadString('Buttonbar', 'button' + IntToStr(I), ''); Param := IniFile.ReadString('Buttonbar', 'param' + IntToStr(I), ''); Path := IniFile.ReadString('Buttonbar', 'path' + IntToStr(I), ''); Misk := IniFile.ReadString('Buttonbar', 'misk' + IntToStr(I), ''); Item := nil; if Menu = '-' then begin Item := TKASSeparatorItem.Create; end else if (Length(Command) > 3) and (Copy(Command, 1, 3) = 'cm_') then begin CommandItem := TKASCommandItem.Create(FCommands); CommandItem.Command := Command; CommandItem.Hint := Menu; CommandItem.Icon := Button; if Param <> EmptyStr then AddString(CommandItem.Params, Param); Item := CommandItem; end else begin ProgramItem := TKASProgramItem.Create; ProgramItem.Command := Command; ProgramItem.Hint := Menu; ProgramItem.Icon := Button; ProgramItem.Params := Param; ProgramItem.StartPath := Path; Item := ProgramItem; end; if Assigned(OnLoadIniItem) then OnLoadIniItem(Self, Item, Misk); if Assigned(ToolBar) then ToolBar.AddButton(Item); if Assigned(ToolItemMenu) then ToolItemMenu.SubItems.Add(Item); end; finally IniFile.Free; Dec(FDepthLevel); end; end; end; end. doublecmd-0.5.8/src/fcolumnssetconf.pas0000644000175000017500000010101311746227503017215 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Implementing of columns' configure dialog Copyright (C) 2008 Dmitry Kolomiets (B4rr4cuda@rambler.ru) contributors: Copyright (C) 2008-2012 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fColumnsSetConf; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, Buttons, Grids, ComCtrls, Menus, LCLType, uColumns, uGlobs, Spin, uColumnsFileView, ColorBox; type { TfColumnsSetConf } TfColumnsSetConf = class(TForm) btnAllBack: TButton; btnAllBack2: TButton; btnAllCurCol: TButton; btnAllCurText: TButton; btnAllFont: TButton; btnAllMarc: TButton; btnAllText: TButton; btnBackColor: TButton; btnBackColor2: TButton; btnCursorBorderColor: TButton; btnCursorColor: TButton; btnCursorText: TButton; btnFontSelect: TBitBtn; btnForeColor: TButton; btnMarkColor: TButton; btnOk: TBitBtn; btnCancel: TBitBtn; btnNext: TButton; btnPrev: TButton; cBackGrndLabel: TLabel; cbBackColor: TColorBox; cbBackColor2: TColorBox; cbCursorBorder: TCheckBox; cbCursorBorderColor: TColorBox; cbCursorColor: TColorBox; cbCursorText: TColorBox; cbMarkColor: TColorBox; cbOverColor: TCheckBox; cbTextColor: TColorBox; chkUseCustomView: TCheckBox; cTextLabel: TLabel; dlgcolor: TColorDialog; ComboBox1: TComboBox; edtFont: TEdit; edtNameofColumnsSet: TEdit; dlgfont: TFontDialog; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; lblBackground2: TLabel; lblConfigViewNr: TLabel; lblCursorColor: TLabel; lblCursorText: TLabel; lblMarkColor: TLabel; lblName: TLabel; lbNrOfColumnsSet: TLabel; miAddColumn: TMenuItem; Panel1: TPanel; Panel2: TPanel; Panel3: TPanel; pnlCustomView: TPanel; pnlGlobalSettings: TPanel; pnlCustCont: TPanel; pnlCustHead: TPanel; pnlPrevCont: TPanel; pnlPreviewHead: TPanel; pnlPreview: TPanel; pmStringGrid: TPopupMenu; pmFields: TPopupMenu; ResBack: TButton; ResBack2: TButton; ResCurCol: TButton; ResCurText: TButton; ResFont: TButton; ResMark: TButton; ResText: TButton; sneFontSize: TSpinEdit; SplitterPreview: TSplitter; SplitterCustomize: TSplitter; stgColumns: TStringGrid; procedure btnAllTextClick(Sender: TObject); procedure btnBackColor2Click(Sender: TObject); procedure btnBackColorClick(Sender: TObject); procedure btnCancelClick(Sender: TObject); procedure btnCursorColorClick(Sender: TObject); procedure btnCursorTextClick(Sender: TObject); procedure btnCursorBorderColorClick(Sender: TObject); procedure btnFontSelectClick(Sender: TObject); procedure btnForeColorClick(Sender: TObject); procedure btnMarkColorClick(Sender: TObject); procedure btnNextClick(Sender: TObject); procedure btnOkClick(Sender: TObject); procedure btnPrevClick(Sender: TObject); procedure cbCursorBorderChange(Sender: TObject); procedure cbCursorBorderColorChange(Sender: TObject); procedure cbOvercolorChange(Sender: TObject); procedure chkUseCustomViewChange(Sender: TObject); procedure ResFontClick(Sender: TObject); procedure ResBack2Click(Sender: TObject); procedure ResBackClick(Sender: TObject); procedure ResCurColClick(Sender: TObject); procedure ResMarkClick(Sender: TObject); procedure ResTextClick(Sender: TObject); procedure ResCurTextClick(Sender: TObject); procedure cbBackColor2Change(Sender: TObject); procedure cbBackColorChange(Sender: TObject); procedure cbCursorColorChange(Sender: TObject); procedure cbCursorTextChange(Sender: TObject); procedure cbMarkColorChange(Sender: TObject); procedure cbTextColorChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormResize(Sender: TObject); procedure FormShow(Sender: TObject); procedure miAddColumnClick(Sender: TObject); procedure MenuFieldsClick(Sender: TObject); procedure pnlCustHeadClick(Sender: TObject); procedure pnlPreviewHeadClick(Sender: TObject); procedure sneFontSizeChange(Sender: TObject); procedure SplitterCustomizeCanResize(Sender: TObject; var NewSize: Integer; var Accept: Boolean); procedure stgColumnsEditingDone(Sender: TObject); procedure stgColumnsKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure stgColumnsMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure stgColumnsMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure stgColumnsSelectEditor(Sender: TObject; aCol, aRow: Integer; var Editor: TWinControl); {Editors} procedure SpinEditExit(Sender: TObject); procedure SpinEditChange(Sender: TObject); procedure EditExit(Sender: TObject); procedure BitBtnDeleteFieldClick(Sender: TObject); procedure BtnCfgClick(Sender: TObject); procedure ButtonAddClick(Sender: TObject); procedure ComboBoxXSelect(Sender: TObject); procedure UpDownXClick(Sender: TObject; Button: TUDBtnType); procedure UpDownXChanging(Sender: TObject; var AllowChange: Boolean); private procedure EditorKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure UpdateColumnClass; procedure DGHeaderSized(Sender: TObject;IsColumn: Boolean; Index: Integer); { private declarations } procedure AddNewField; procedure CreateEditingControls; procedure EditorSaveResult(Sender: TObject); procedure LoadCustColumn(const Index:integer); procedure OpenColorsPanel; procedure UpdateColorsPanelHeader(const Index: Integer); private { Editing controls. } updWidth: TSpinEdit; cbbAlign: TComboBox; edtField: TEdit; btnAdd: TButton; btnDel: TBitBtn; updMove: TUpDown; btnCfg: TButton; ColPrm: TColPrm; // Make a custom TColumnsFileViewPreview = class(TColumnsFileView). PreviewPan: TColumnsFileView; ColumnClass:TPanelColumnsClass; IndexRaw: Integer; Showed: boolean; ColumnClassOwnership: Boolean; FUpdating: Boolean; public function GetColumnsClass: TPanelColumnsClass; procedure SetColumnsClass(AColumnsClass: TPanelColumnsClass); end; implementation {$R *.lfm} uses uLng, uFileSystemFileSource, DCOSUtils, uDCUtils, uFileFunctions; const pnlCustHeight: Integer = 154; PnlContHeight: Integer = 180; procedure TfColumnsSetConf.LoadCustColumn(const Index:integer); begin if (Index>=stgColumns.RowCount-1) or (Index<0) then exit; IndexRaw:=Index; ColPrm:= TColPrm(stgColumns.Objects[6, IndexRaw + 1]); FUpdating := True; UpdateColorsPanelHeader(IndexRaw); edtFont.Text:=ColumnClass.GetColumnFontName(IndexRaw); sneFontSize.Value:=ColumnClass.GetColumnFontSize(IndexRaw); SetColorInColorBox(cbTextColor, ColumnClass.GetColumnTextColor(IndexRaw)); SetColorInColorBox(cbBackColor, ColumnClass.GetColumnBackground(IndexRaw)); SetColorInColorBox(cbBackColor2, ColumnClass.GetColumnBackground2(IndexRaw)); SetColorInColorBox(cbMarkColor, ColumnClass.GetColumnMarkColor(IndexRaw)); SetColorInColorBox(cbCursorColor, ColumnClass.GetColumnCursorColor(IndexRaw)); SetColorInColorBox(cbCursorText, ColumnClass.GetColumnCursorText(IndexRaw)); cbOvercolor.Checked:=ColumnClass.GetColumnOvercolor(IndexRaw); FUpdating := False; end; procedure TfColumnsSetConf.EditorSaveResult(Sender: TObject); begin if not FUpdating then begin if Sender is TSpinEdit then stgColumns.Cells[2,(Sender as TSpinEdit).Tag]:=inttostr(updWidth.Value); if Sender is TComboBox then stgColumns.Cells[3,(Sender as TComboBox).Tag]:=(Sender as TComboBox).Text; if Sender is TEdit then stgColumns.Cells[4,(Sender as TEdit).Tag]:=(Sender as TEdit).Text; UpdateColumnClass; UpdateColorsPanelHeader(IndexRaw); end; end; { TfColumnsSetConf } procedure TfColumnsSetConf.UpdateColumnClass; var i,indx:integer; Tit, FuncString: string; Wid: integer; Ali: TAlignment; begin // Save fields ColumnClass.Clear; for i:=1 to stgColumns.RowCount-1 do begin with stgColumns do begin Tit:=Cells[1,i]; Wid:=StrToInt(Cells[2,i]); Ali:=StrToAlign(Cells[3,i]); FuncString:=Cells[4,i]; end; indx:=ColumnClass.Add(Tit,FuncString,Wid,Ali); if stgColumns.Objects[6,i]<>nil then ColumnClass.SetColumnPrm(Indx,TColPrm(stgColumns.Objects[6,i])); end; ColumnClass.CustomView:= chkUseCustomView.Checked; ColumnClass.SetCursorBorder(cbCursorBorder.Checked); ColumnClass.SetCursorBorderColor(cbCursorBorderColor.Selected); ColumnClass.Name := edtNameofColumnsSet.Text; PreviewPan.UpdateColumnsView; PreviewPan.Reload; end; procedure TfColumnsSetConf.stgColumnsSelectEditor(Sender: TObject; aCol, aRow: Integer; var Editor: TWinControl); begin // Hide '+' button in other columns than 4th (Field contents). if (aCol <> 4) and btnAdd.Visible then btnAdd.Hide; try FUpdating := True; case aCol of 0: begin // Only show delete button if there is more than one column. if (stgColumns.RowCount - stgColumns.FixedRows) > 1 then begin with btnDel do begin Height:=stgColumns.RowHeights[aRow]; Width:=stgColumns.ColWidths[aCol]-2; Left:=(Sender as TStringGrid).CellRect(aCol,aRow).Right-Width; Top:=(Sender as TStringGrid).CellRect(aCol,aRow).Top; end; Editor:=btnDel; end else Editor := nil; end; 2: begin with updWidth do begin Left:=(Sender as TStringGrid).CellRect(aCol,aRow).Left; Top:=(Sender as TStringGrid).CellRect(aCol,aRow).Top; Height:=(Sender as TStringGrid).RowHeights[aRow]; Width:=(Sender as TStringGrid).ColWidths[aCol]; Value:=StrToInt((Sender as TStringGrid).Cells[aCol,aRow]); end; Editor:=updWidth; end; 3: begin with cbbAlign do begin Width:=(Sender as TStringGrid).ColWidths[aCol]; Left:=(Sender as TStringGrid).CellRect(aCol,aRow).Left; Top:=(Sender as TStringGrid).CellRect(aCol,aRow).Top; Height:=(Sender as TStringGrid).RowHeights[aRow]; ItemIndex:=Items.IndexOf((Sender as TStringGrid).Cells[aCol,aRow]); end; Editor:=cbbAlign; end; 4: begin with btnAdd do begin Width:=20; Left:=(Sender as TStringGrid).CellRect(aCol,aRow).Right-Width; Top:=(Sender as TStringGrid).CellRect(aCol,aRow).Top; Height:=(Sender as TStringGrid).RowHeights[aRow]; Tag:=aRow; Show; end; with edtField do begin Width:=(Sender as TStringGrid).ColWidths[aCol]; Left:=(Sender as TStringGrid).CellRect(aCol,aRow).Left; Top:=(Sender as TStringGrid).CellRect(aCol,aRow).Top; Height:=(Sender as TStringGrid).RowHeights[aRow]; Text:=(Sender as TStringGrid).Cells[aCol,aRow]; end; Editor:=edtField; end; 5: begin with updMove do begin Height:=stgColumns.RowHeights[aRow]; Width:=stgColumns.ColWidths[aCol]-2; Min:=-((Sender as TStringGrid).RowCount-1); Max:=-1; Position:=-aRow; Left:=(Sender as TStringGrid).CellRect(aCol,aRow).Right-Width; Top:=(Sender as TStringGrid).CellRect(aCol,aRow).Top; end; Editor:=updMove; end; 6: begin with btnCfg do begin Height:=stgColumns.RowHeights[aRow]; Width:=stgColumns.ColWidths[aCol]-2; Left:=(Sender as TStringGrid).CellRect(aCol,aRow).Right-Width; Top:=(Sender as TStringGrid).CellRect(aCol,aRow).Top; end; Editor:=btnCfg; end; end; finally if Assigned(Editor) then begin Editor.Tag:= aRow; Editor.Hint:= IntToStr(aCol); end; FUpdating := False; end; end; procedure TfColumnsSetConf.stgColumnsKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key=vk_Down) and (stgColumns.Row=stgColumns.RowCount-1) then begin AddNewField; end; end; procedure TfColumnsSetConf.stgColumnsMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Col, Row: Integer; begin if Y < stgColumns.GridHeight then begin // Clicked on a cell, allow editing. stgColumns.Options := stgColumns.Options + [goEditing]; // Select clicked column in customize colors panel. stgColumns.MouseToCell(X, Y, Col, Row); LoadCustColumn(Row - stgColumns.FixedRows); end else begin // Clicked not on a cell, disable editing. stgColumns.Options := stgColumns.Options - [goEditing]; if btnAdd.Visible then btnAdd.Hide; end; end; type THackStringGrid = class(TCustomStringGrid) end; procedure TfColumnsSetConf.stgColumnsMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var iCol: Integer; StringGrid: THackStringGrid absolute Sender; begin if (StringGrid.fGridState = gsColSizing) then begin if StringGrid.EditorMode then with StringGrid.Editor do begin iCol:= StrToInt(Hint); Width:= StringGrid.ColWidths[iCol]; Left:= StringGrid.CellRect(iCol, StringGrid.Row).Left; end; if btnAdd.Visible then btnAdd.Left:= StringGrid.CellRect(4, StringGrid.Row).Right - btnAdd.Width; end; end; procedure TfColumnsSetConf.EditorKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key=VK_RETURN then begin EditorSaveResult(Sender); stgColumns.EditorMode:= False; Key:=0; end; end; procedure TfColumnsSetConf.AddNewField; begin stgColumns.RowCount:= stgColumns.RowCount + 1; stgColumns.Cells[1,stgColumns.RowCount-1]:= EmptyStr; stgColumns.Cells[2,stgColumns.RowCount-1]:= '50'; stgColumns.Cells[3,stgColumns.RowCount-1]:= '<-'; stgColumns.Cells[4,stgColumns.RowCount-1]:= ''; stgColumns.Objects[6,stgColumns.RowCount-1]:= TColPrm.Create; UpdateColumnClass; end; procedure TfColumnsSetConf.FormCreate(Sender: TObject); begin ColPrm:= nil; FUpdating := False; ColumnClass:=TPanelColumnsClass.Create; ColumnClassOwnership := True; // Initialize property storage InitPropStorage(Self); PreviewPan := TColumnsFileView.Create(pnlPreview, TFileSystemFileSource.Create, mbGetCurrentDir); CreateEditingControls; end; procedure TfColumnsSetConf.CreateEditingControls; begin // Editing controls are created with no parent-control. // TCustomGrid handles their visibility when they are assigned to Editor property. btnCfg:=TButton.Create(Self); with btnCfg do begin Caption := rsConfColConfig; OnClick := @BtnCfgClick; end; btnDel:=TBitBtn.Create(Self); with btnDel do begin Glyph.Assign(btnCancel.Glyph); Caption := ''; OnClick := @BitBtnDeleteFieldClick; end; cbbAlign:=TComboBox.Create(Self); with cbbAlign do begin Style := csDropDownList; AddItem('<-',nil); AddItem('->',nil); AddItem('=',nil); OnSelect := @ComboBoxXSelect; OnKeyDown := @EditorKeyDown; end; edtField:=TEdit.Create(Self); with edtField do begin OnExit := @EditExit; OnKeyDown := @EditorKeyDown; end; updMove:=TUpDown.Create(Self); with updMove do begin OnChanging := @UpDownXChanging; OnClick := @UpDownXClick; end; updWidth:=TSpinEdit.Create(Self); with updWidth do begin MinValue := 0; MaxValue := 1000; OnKeyDown := @EditorKeyDown; OnChange := @SpinEditChange; OnExit := @SpinEditExit; end; // Add button displayed in 'Field contents'. btnAdd:=TButton.Create(Self); with btnAdd do begin Visible := False; Parent := stgColumns; // set Parent, because this control is shown manually in stgColumns Caption := '+'; OnClick := @ButtonAddClick; end; end; procedure TfColumnsSetConf.FormDestroy(Sender: TObject); var i: Integer; begin showed:=false; if (ColumnClassOwnership = True) and Assigned(ColumnClass) then FreeAndNil(ColumnClass); // Free TColPrm objects assigned to each row. for i := 0 to stgColumns.RowCount-1 do begin if Assigned(stgColumns.Objects[6, i]) then begin (stgColumns.Objects[6, i] as TColPrm).Free; stgColumns.Objects[6, i] := nil; end; end; end; procedure TfColumnsSetConf.FormResize(Sender: TObject); var z,i:integer; begin if not showed then exit; //Size of content field z:=stgColumns.Width; for i:=0 to 3 do z:=z-stgColumns.ColWidths[i]; z:=z-stgColumns.ColWidths[5]*stgColumns.ColWidths[6]; stgColumns.ColWidths[4]:=z; end; procedure TfColumnsSetConf.FormShow(Sender: TObject); var I: Integer; begin pnlCustHeadClick(Sender); with PreviewPan do begin ActiveColmSlave:=ColumnClass; isSlave:=true; //dgPanel.OnHeaderSized:=@DGHeaderSized; end; if ColumnClass.ColumnsCount>0 then begin stgColumns.RowCount:=ColumnClass.ColumnsCount+1; for i:=0 to ColumnClass.ColumnsCount-1 do begin stgColumns.Cells[1,i+1]:=ColumnClass.GetColumnTitle(i); stgColumns.Cells[2,i+1]:=inttostr(ColumnClass.GetColumnWidth(i)); stgColumns.Cells[3,i+1]:=ColumnClass.GetColumnAlignString(i); stgColumns.Cells[4,i+1]:=ColumnClass.GetColumnFuncString(i); stgColumns.Objects[6,i+1]:=ColumnClass.GetColumnPrm(i); end; end else begin stgColumns.RowCount:=1; AddNewField; end; PreviewPan.UpdateColumnsView; FUpdating := True; chkUseCustomView.Checked:= ColumnClass.CustomView; cbCursorBorder.Checked := ColumnClass.GetCursorBorder; SetColorInColorBox(cbCursorBorderColor, ColumnClass.GetCursorBorderColor); FUpdating := False; // Localize StringGrid header stgColumns.Cells[0,0]:= rsConfColDelete; stgColumns.Cells[1,0]:= rsConfColCaption; stgColumns.Cells[2,0]:= rsConfColWidth; stgColumns.Cells[3,0]:= rsConfColAlign; stgColumns.Cells[4,0]:= rsConfColFieldCont; stgColumns.Cells[5,0]:= rsConfColMove; stgColumns.Cells[6,0]:= rsOptionsEditorColors; LoadCustColumn(0); Showed:=true; end; procedure TfColumnsSetConf.miAddColumnClick(Sender: TObject); begin AddNewField; end; procedure TfColumnsSetConf.SpinEditExit(Sender: TObject); begin EditorSaveResult(Sender); end; procedure TfColumnsSetConf.SpinEditChange(Sender: TObject); begin EditorSaveResult(Sender); end; procedure TfColumnsSetConf.EditExit(Sender: TObject); begin EditorSaveResult(Sender); end; procedure TfColumnsSetConf.ComboBoxXSelect(Sender: TObject); begin EditorSaveResult(Sender); end; procedure TfColumnsSetConf.UpDownXClick(Sender: TObject; Button: TUDBtnType); begin stgColumns.ExchangeColRow(False,updMove.Tag,abs(updMove.Position)); with updMove do begin Left:=stgColumns.CellRect(5,abs(updMove.Position)).Right-Width; Top:=stgColumns.CellRect(5,abs(updMove.Position)).Top; end; EditorSaveResult(Sender); LoadCustColumn(abs(updMove.Position) - 1); end; procedure TfColumnsSetConf.UpDownXChanging(Sender: TObject; var AllowChange: Boolean); begin updMove.tag:=abs(updMove.Position); EditorSaveResult(Sender); end; procedure TfColumnsSetConf.BitBtnDeleteFieldClick(Sender: TObject); var RowNr: Integer; begin RowNr := (Sender as TBitBtn).Tag; // Free TColPrm object assigned to the row. if Assigned(stgColumns.Objects[6, RowNr]) then begin (stgColumns.Objects[6, RowNr] as TColPrm).Free; stgColumns.Objects[6, RowNr] := nil; end; stgColumns.DeleteColRow(false, RowNr); EditorSaveResult(Sender); if RowNr = stgColumns.RowCount then // The last row was deleted, load previous column. LoadCustColumn(RowNr - stgColumns.FixedRows - 1) else // Load next column (RowNr will point to it after deleting). LoadCustColumn(RowNr - stgColumns.FixedRows); end; procedure TfColumnsSetConf.BtnCfgClick(Sender: TObject); begin LoadCustColumn((Sender as TButton).Tag-1); OpenColorsPanel; end; procedure TfColumnsSetConf.DGHeaderSized(Sender: TObject; IsColumn: Boolean; Index: Integer); begin { stgColumns.Cells[2,Index+1]:=inttostr(PreviewPan.dgPanel.ColWidths[index]); ColumnClass.SetColumnWidth(Index,PreviewPan.dgPanel.ColWidths[index]) } end; procedure TfColumnsSetConf.btnOkClick(Sender: TObject); begin if edtNameofColumnsSet.Text='' then edtNameofColumnsSet.Text:=DateTimeToStr(now); UpdateColumnClass; case Self.Tag of -1: ColSet.Add(ColumnClass); else begin ColSet.DeleteColumnSet(Self.Tag); Colset.Insert(Self.Tag,ColumnClass); end; end; // Release ownership of ColumnClass (ColSet is now responsible for it). ColumnClassOwnership := False; end; procedure TfColumnsSetConf.btnPrevClick(Sender: TObject); begin LoadCustColumn(IndexRaw-1); OpenColorsPanel; end; procedure TfColumnsSetConf.cbCursorBorderChange(Sender: TObject); begin EditorSaveResult(nil); end; procedure TfColumnsSetConf.cbOvercolorChange(Sender: TObject); begin TColPrm(stgColumns.Objects[6,IndexRaw+1]).Overcolor:=cbOvercolor.Checked; EditorSaveResult(nil); end; procedure TfColumnsSetConf.chkUseCustomViewChange(Sender: TObject); begin pnlCustomView.Enabled:= chkUseCustomView.Checked; end; procedure TfColumnsSetConf.ResFontClick(Sender: TObject); begin TColPrm(stgColumns.Objects[6,IndexRaw+1]).FontName:= gFonts[dcfMain].Name; TColPrm(stgColumns.Objects[6,IndexRaw+1]).FontSize:= gFonts[dcfMain].Size; TColPrm(stgColumns.Objects[6,IndexRaw+1]).FontStyle:= gFonts[dcfMain].Style; edtFont.Text:= gFonts[dcfMain].Name; sneFontSize.Value:= gFonts[dcfMain].Size; EditorSaveResult(nil); end; procedure TfColumnsSetConf.ResBack2Click(Sender: TObject); begin TColPrm(stgColumns.Objects[6,IndexRaw+1]).Background2:=gBackColor2; SetColorInColorBox(cbBackColor2,gBackColor2); EditorSaveResult(nil); end; procedure TfColumnsSetConf.ResBackClick(Sender: TObject); begin TColPrm(stgColumns.Objects[6,IndexRaw+1]).Background:=gBackColor; SetColorInColorBox(cbBackColor,gBackColor); EditorSaveResult(nil); end; procedure TfColumnsSetConf.ResCurColClick(Sender: TObject); begin TColPrm(stgColumns.Objects[6,IndexRaw+1]).CursorColor:=gCursorColor; SetColorInColorBox(cbCursorColor,gCursorColor); EditorSaveResult(nil); end; procedure TfColumnsSetConf.ResMarkClick(Sender: TObject); begin TColPrm(stgColumns.Objects[6,IndexRaw+1]).MarkColor:=gMarkColor; SetColorInColorBox(cbMarkColor,gMarkColor); EditorSaveResult(nil); end; procedure TfColumnsSetConf.ResTextClick(Sender: TObject); begin TColPrm(stgColumns.Objects[6,IndexRaw+1]).TextColor:=gForeColor; SetColorInColorBox(cbTextColor,gForeColor); EditorSaveResult(nil); end; procedure TfColumnsSetConf.ResCurTextClick(Sender: TObject); begin TColPrm(stgColumns.Objects[6,IndexRaw+1]).CursorText:= gCursorText; SetColorInColorBox(cbCursorText, gCursorText); EditorSaveResult(nil); end; procedure TfColumnsSetConf.cbBackColor2Change(Sender: TObject); begin if Assigned(ColPrm) then begin ColPrm.Background2:= (Sender as TColorBox).Selected; EditorSaveResult(nil); end; end; procedure TfColumnsSetConf.cbBackColorChange(Sender: TObject); begin if Assigned(ColPrm) then begin ColPrm.Background:= (Sender as TColorBox).Selected; EditorSaveResult(nil); end; end; procedure TfColumnsSetConf.cbCursorColorChange(Sender: TObject); begin if Assigned(ColPrm) then begin ColPrm.CursorColor:= (Sender as TColorBox).Selected; EditorSaveResult(nil); end; end; procedure TfColumnsSetConf.cbCursorTextChange(Sender: TObject); begin if Assigned(ColPrm) then begin ColPrm.CursorText:= (Sender as TColorBox).Selected; EditorSaveResult(nil); end; end; procedure TfColumnsSetConf.cbMarkColorChange(Sender: TObject); begin if Assigned(ColPrm) then begin ColPrm.MarkColor:= (Sender as TColorBox).Selected; EditorSaveResult(nil); end; end; procedure TfColumnsSetConf.cbTextColorChange(Sender: TObject); begin if Assigned(ColPrm) then begin ColPrm.TextColor:= (Sender as TColorBox).Selected; EditorSaveResult(nil); end; end; procedure TfColumnsSetConf.cbCursorBorderColorChange(Sender: TObject); begin if Assigned(ColPrm) then begin EditorSaveResult(nil); end; end; procedure TfColumnsSetConf.btnCancelClick(Sender: TObject); begin close; end; procedure TfColumnsSetConf.btnCursorColorClick(Sender: TObject); begin dlgcolor.Color:= cbCursorColor.Selected; if dlgcolor.Execute then begin SetColorInColorBox(cbCursorColor, dlgcolor.Color); TColPrm(stgColumns.Objects[6,IndexRaw+1]).CursorColor:= cbCursorColor.Selected; EditorSaveResult(nil); end; end; procedure TfColumnsSetConf.btnCursorTextClick(Sender: TObject); begin dlgcolor.Color:= cbCursorText.Selected; if dlgcolor.Execute then begin SetColorInColorBox(cbCursorText, dlgcolor.Color); TColPrm(stgColumns.Objects[6,IndexRaw+1]).CursorText:= cbCursorText.Selected; EditorSaveResult(nil); end; end; procedure TfColumnsSetConf.btnCursorBorderColorClick(Sender: TObject); begin dlgcolor.Color:= cbCursorBorderColor.Selected; if dlgcolor.Execute then begin SetColorInColorBox(cbCursorBorderColor,dlgcolor.Color); EditorSaveResult(nil); end; end; procedure TfColumnsSetConf.btnBackColorClick(Sender: TObject); begin dlgcolor.Color:= cbBackColor.Selected; if dlgcolor.Execute then begin SetColorInColorBox(cbBackColor,dlgcolor.Color); TColPrm(stgColumns.Objects[6,IndexRaw+1]).Background:=cbBackColor.Selected; EditorSaveResult(nil); end; end; procedure TfColumnsSetConf.btnBackColor2Click(Sender: TObject); begin dlgcolor.Color:= cbBackColor2.Selected; if dlgcolor.Execute then begin SetColorInColorBox(cbBackColor2,dlgcolor.Color); TColPrm(stgColumns.Objects[6,IndexRaw+1]).Background2:=cbBackColor2.Selected; EditorSaveResult(nil); end; end; procedure TfColumnsSetConf.btnAllTextClick(Sender: TObject); var i:integer; begin for i:= 1 to stgColumns.RowCount-1 do case (Sender as TButton).tag of 0:begin TColPrm(stgColumns.Objects[6,i]).FontName :=TColPrm(stgColumns.Objects[6,IndexRaw+1]).FontName; TColPrm(stgColumns.Objects[6,i]).FontSize :=TColPrm(stgColumns.Objects[6,IndexRaw+1]).FontSize; TColPrm(stgColumns.Objects[6,i]).FontStyle :=TColPrm(stgColumns.Objects[6,IndexRaw+1]).FontStyle; end; 1:begin TColPrm(stgColumns.Objects[6,i]).TextColor :=cbTextColor.Selected; end; 2:begin TColPrm(stgColumns.Objects[6,i]).Background :=cbBackColor.Selected; end; 3:begin TColPrm(stgColumns.Objects[6,i]).Background2 :=cbBackColor2.Selected; end; 4:begin TColPrm(stgColumns.Objects[6,i]).MarkColor :=cbMarkColor.Selected; end; 5:begin TColPrm(stgColumns.Objects[6,i]).CursorColor :=cbCursorColor.Selected; end; 6:begin TColPrm(stgColumns.Objects[6,i]).CursorText :=cbCursorText.Selected; end; end; UpdateColumnClass; end; procedure TfColumnsSetConf.btnFontSelectClick(Sender: TObject); begin with TColPrm(stgColumns.Objects[6,IndexRaw+1]) do begin dlgfont.Font.Name := FontName; dlgfont.Font.Size := FontSize; dlgfont.Font.Style := FontStyle; if dlgfont.Execute then begin edtFont.Text := dlgfont.Font.Name; sneFontSize.Value := dlgfont.Font.Size; FontName := dlgfont.Font.Name; FontSize := dlgfont.Font.Size; FontStyle := dlgfont.Font.Style; EditorSaveResult(nil); end; end; end; procedure TfColumnsSetConf.btnForeColorClick(Sender: TObject); begin dlgcolor.Color:= cbTextColor.Selected; if dlgcolor.Execute then begin SetColorInColorBox(cbTextColor,dlgcolor.Color); TColPrm(stgColumns.Objects[6,IndexRaw+1]).TextColor:=cbTextColor.Selected; EditorSaveResult(nil); end; end; procedure TfColumnsSetConf.btnMarkColorClick(Sender: TObject); begin dlgcolor.Color:= cbMarkColor.Selected; if dlgcolor.Execute then begin SetColorInColorBox(cbMarkColor,dlgcolor.Color); TColPrm(stgColumns.Objects[6,IndexRaw+1]).MarkColor:=cbMarkColor.Selected; EditorSaveResult(nil); end; end; procedure TfColumnsSetConf.btnNextClick(Sender: TObject); begin LoadCustColumn(IndexRaw+1); OpenColorsPanel; end; procedure TfColumnsSetConf.MenuFieldsClick(Sender: TObject); var MenuItem: TMenuItem absolute Sender; begin if Length(stgColumns.Cells[1,btnAdd.Tag]) = 0 then begin if MenuItem.Tag = 0 then stgColumns.Cells[1,btnAdd.Tag]:= Copy(MenuItem.Caption, 1, Pos('(', MenuItem.Caption) - 3) else stgColumns.Cells[1,btnAdd.Tag]:= MenuItem.Caption; end; case MenuItem.Tag of 0: begin stgColumns.Cells[4,btnAdd.Tag]:= stgColumns.Cells[4,btnAdd.Tag]+'[DC().'+MenuItem.Hint+'{}] '; end; 1: begin stgColumns.Cells[4,btnAdd.Tag]:= stgColumns.Cells[4,btnAdd.Tag]+'[Plugin('+MenuItem.Parent.Caption+').'+MenuItem.Caption+'{}] '; end; 2: begin stgColumns.Cells[4,btnAdd.Tag]:= stgColumns.Cells[4,btnAdd.Tag]+'[Plugin('+MenuItem.Parent.Parent.Caption+').'+MenuItem.Parent.Caption+'{' + MenuItem.Caption + '}] '; end; end; EditorSaveResult(Sender); end; procedure TfColumnsSetConf.pnlCustHeadClick(Sender: TObject); begin if SplitterCustomize.Height+1>pnlCustCont.Height then begin //open panel if pnlCustHead.Top<250 then SplitterPreview.MoveSplitter(100); pnlCustCont.Constraints.MinHeight:=pnlCustHeight; pnlCustCont.Constraints.MaxHeight:=pnlCustHeight; SplitterCustomize.MoveSplitter(-pnlCustHeight); end else begin //Hide panel pnlCustCont.Constraints.MinHeight:=1; pnlCustCont.Constraints.MaxHeight:=1; SplitterCustomize.MoveSplitter(pnlCustCont.Height); end; end; procedure TfColumnsSetConf.pnlPreviewHeadClick(Sender: TObject); begin if SplitterPreview.Height>pnlPrevCont.Height then //open panel SplitterPreview.MoveSplitter(-PnlContHeight) else begin //Hide panel PnlContHeight:=pnlPrevCont.Height; SplitterPreview.MoveSplitter(pnlPrevCont.Height); end; end; procedure TfColumnsSetConf.sneFontSizeChange(Sender: TObject); begin // edtFont.Font.Size:=sneFontSize.Value; TColPrm(stgColumns.Objects[6,IndexRaw+1]).FontSize:=sneFontSize.Value; UpdateColumnClass; end; procedure TfColumnsSetConf.SplitterCustomizeCanResize(Sender: TObject; var NewSize: Integer; var Accept: Boolean); begin { if NewSize=130 then Accept:=true else Accept:=false; } end; procedure TfColumnsSetConf.stgColumnsEditingDone(Sender: TObject); begin EditorSaveResult(sender); end; procedure TfColumnsSetConf.ButtonAddClick(Sender: TObject); var Point: TPoint; begin // Fill column fields menu FillContentFieldMenu(pmFields.Items, @MenuFieldsClick); // Show popup menu Point.x:= (Sender as TButton).Left - 25; Point.y:= (Sender as TButton).Top + (Sender as TButton).Height + 40; Point:= ClientToScreen(Point); pmFields.PopUp(Point.X, Point.Y); end; procedure TfColumnsSetConf.OpenColorsPanel; begin //open pblCustCont if it is hidden if SplitterCustomize.Height+1>pnlCustCont.Height then pnlCustHeadClick(nil); end; procedure TfColumnsSetConf.UpdateColorsPanelHeader(const Index: Integer); begin pnlCustHead.Caption := rsConfCustHeader + ' ' + IntToStr(Index+1) + ': ' + #39 + ColumnClass.GetColumnTitle(Index) + #39; end; function TfColumnsSetConf.GetColumnsClass: TPanelColumnsClass; begin Result := ColumnClass; end; procedure TfColumnsSetConf.SetColumnsClass(AColumnsClass: TPanelColumnsClass); begin ColumnClass.Assign(AColumnsClass); end; end. doublecmd-0.5.8/src/udsxmodule.pas0000644000175000017500000002562012132053450016173 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- (DSX) Search plugin API implementation. DSX - Double commander Search eXtentions. Copyright (C) 2008 Dmitry Kolomiets (B4rr4cuda@rambler.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uDsxModule; {$mode objfpc}{$H+} interface uses Classes, SysUtils, dynlibs, LCLProc, DsxPlugin, DCClassesUtf8, uDCUtils, DCXmlConfig; type { TDsxModule } TDsxModule = class protected SStartSearch: TSStartSearch; SStopSearch: TSStopSearch; SAddFileProc: TSAddFileProc; SUpdateStatusProc: TSUpdateStatusProc; SInit: TSInit; SFinalize: TSFinalize; private FPluginNr: integer; FModuleHandle: TLibHandle; // Handle to .DLL or .so function GIsLoaded: boolean; public Name: string; FileName: string; Descr: string; //--------------------- constructor Create; destructor Destroy; override; //--------------------- function LoadModule: boolean; procedure UnloadModule; //--------------------- function CallInit(pAddFileProc: TSAddFileProc; pUpdateStatus: TSUpdateStatusProc): integer; procedure CallStartSearch(SearchRec: TDsxSearchRecord); procedure CallStopSearch; procedure CallFinalize; //--------------------- property IsLoaded: boolean read GIsLoaded; property ModuleHandle: TLibHandle read FModuleHandle write FModuleHandle; end; { TDSXModuleList } TDSXModuleList = class private Flist: TStringList; function GetCount: integer; public //--------------------- constructor Create; destructor Destroy; override; //--------------------- procedure Clear; procedure Exchange(Index1, Index2: Integer); procedure Load(Ini: TIniFileEx); overload; procedure Load(AConfig: TXmlConfig; ANode: TXmlNode); overload; procedure Save(Ini: TIniFileEx); overload; procedure Save(AConfig: TXmlConfig; ANode: TXmlNode); overload; procedure DeleteItem(Index: integer); //--------------------- function Add(Item: TDSXModule): integer; overload; function Add(FileName: string): integer; overload; function Add(AName, FileName, Descr: string): integer; overload; //--------------------- procedure Assign(OtherList: TDSXModuleList); //--------------------- function IsLoaded(AName: string): boolean; overload; function IsLoaded(Index: integer): boolean; overload; function LoadModule(AName: string): boolean; overload; function LoadModule(Index: integer): boolean; overload; //--------------------- function GetDSXModule(Index: integer): TDSXModule; overload; function GetDSXModule(AName: string): TDSXModule; overload; //--------------------- property Count: integer read GetCount; end; implementation uses DCOSUtils, uDebug, uGlobs, uGlobsPaths; const DsxIniFileName = 'dsx.ini'; { TDsxModule } function TDsxModule.GIsLoaded: boolean; begin Result := FModuleHandle <> 0; end; constructor TDsxModule.Create; begin FModuleHandle := 0; inherited Create; end; destructor TDsxModule.Destroy; begin if GIsLoaded then UnloadModule; inherited Destroy; end; function TDsxModule.LoadModule: boolean; begin FModuleHandle := mbLoadLibrary(Self.FileName); Result := (FModuleHandle <> 0); if FModuleHandle = 0 then exit; SStopSearch := TSStopSearch(GetProcAddress(FModuleHandle, 'StopSearch')); SStartSearch := TSStartSearch(GetProcAddress(FModuleHandle, 'StartSearch')); SInit := TSInit(GetProcAddress(FModuleHandle, 'Init')); SFinalize := TSFinalize(GetProcAddress(FModuleHandle, 'Finalize')); end; procedure TDsxModule.UnloadModule; begin if Assigned(SFinalize) then SFinalize(FPluginNr); {$IF (not DEFINED(LINUX)) or ((FPC_VERSION > 2) or ((FPC_VERSION=2) and (FPC_RELEASE >= 5)))} if FModuleHandle <> 0 then FreeLibrary(FModuleHandle); {$ENDIF} FModuleHandle := 0; SStartSearch := nil; SStopSearch := nil; SInit := nil; SFinalize := nil; end; function TDsxModule.CallInit(pAddFileProc: TSAddFileProc; pUpdateStatus: TSUpdateStatusProc): integer; var dps: TDsxDefaultParamStruct; begin if Assigned(SInit) then begin dps.DefaultIniName := gpCfgDir + DsxIniFileName; dps.PluginInterfaceVersionHi := 0; dps.PluginInterfaceVersionLow := 10; dps.size := SizeOf(TDsxDefaultParamStruct); FPluginNr := Sinit(@dps, pAddFileProc, pUpdateStatus); Result := FPluginNr; end; end; procedure TDsxModule.CallStartSearch(SearchRec: TDsxSearchRecord); begin if Assigned(SStartSearch) then SStartSearch(FPluginNr, @SearchRec); end; procedure TDsxModule.CallStopSearch; begin if Assigned(SStopSearch) then SStopSearch(FPluginNr); end; procedure TDsxModule.CallFinalize; begin if Assigned(SFinalize) then SFinalize(FPluginNr); end; { TDSXModuleList } function TDSXModuleList.GetCount: integer; begin if Assigned(Flist) then Result := Flist.Count else Result := 0; end; constructor TDSXModuleList.Create; begin Flist := TStringList.Create; end; destructor TDSXModuleList.Destroy; begin Clear; FreeAndNil(Flist); inherited Destroy; end; procedure TDSXModuleList.Clear; begin while Flist.Count > 0 do begin TDSXModule(Flist.Objects[0]).Free; Flist.Delete(0); end; end; procedure TDSXModuleList.Exchange(Index1, Index2: Integer); begin FList.Exchange(Index1, Index2); end; procedure TDSXModuleList.Load(Ini: TIniFileEx); var xCount, I: integer; tmp: string; begin Self.Clear; xCount := Ini.ReadInteger('Search Plugins', 'PluginCount', 0); if xCount = 0 then Exit; for i := 0 to xCount - 1 do begin tmp := Ini.ReadString('Search Plugins', 'Plugin' + IntToStr(I + 1) + 'Name', ''); Flist.AddObject(UpCase(tmp), TDSXModule.Create); TDSXModule(Flist.Objects[I]).Name := tmp; TDSXModule(Flist.Objects[I]).Descr := Ini.ReadString('Search Plugins', 'Plugin' + IntToStr(I + 1) + 'Description', ''); TDSXModule(Flist.Objects[I]).FileName := GetCmdDirFromEnvVar(Ini.ReadString('Search Plugins', 'Plugin' + IntToStr(I + 1) + 'Path', '')); end; end; procedure TDSXModuleList.Load(AConfig: TXmlConfig; ANode: TXmlNode); var AName, APath: String; ADsxModule: TDSXModule; begin Clear; ANode := ANode.FindNode('DsxPlugins'); if Assigned(ANode) then begin ANode := ANode.FirstChild; while Assigned(ANode) do begin if ANode.CompareName('DsxPlugin') = 0 then begin if AConfig.TryGetValue(ANode, 'Name', AName) and AConfig.TryGetValue(ANode, 'Path', APath) then begin ADsxModule := TDsxModule.Create; Flist.AddObject(UpCase(AName), ADsxModule); ADsxModule.Name := AName; ADsxModule.FileName := GetCmdDirFromEnvVar(APath); ADsxModule.Descr := AConfig.GetValue(ANode, 'Description', ''); end else DCDebug('Invalid entry in configuration: ' + AConfig.GetPathFromNode(ANode) + '.'); end; ANode := ANode.NextSibling; end; end; end; procedure TDSXModuleList.Save(Ini: TIniFileEx); var i: integer; begin Ini.EraseSection('Search Plugins'); Ini.WriteInteger('Search Plugins', 'PluginCount', Flist.Count); for i := 0 to Flist.Count - 1 do begin Ini.WriteString('Search Plugins', 'Plugin' + IntToStr(I + 1) + 'Name', TDSXModule(Flist.Objects[I]).Name); Ini.WriteString('Search Plugins', 'Plugin' + IntToStr(I + 1) + 'Description', TDSXModule(Flist.Objects[I]).Descr); Ini.WriteString('Search Plugins', 'Plugin' + IntToStr(I + 1) + 'Path', SetCmdDirAsEnvVar(TDSXModule(Flist.Objects[I]).FileName)); end; end; procedure TDSXModuleList.Save(AConfig: TXmlConfig; ANode: TXmlNode); var i: Integer; SubNode: TXmlNode; begin ANode := AConfig.FindNode(ANode, 'DsxPlugins', True); AConfig.ClearNode(ANode); for i := 0 to Flist.Count - 1 do begin SubNode := AConfig.AddNode(ANode, 'DsxPlugin'); AConfig.AddValue(SubNode, 'Name', TDSXModule(Flist.Objects[I]).Name); AConfig.AddValue(SubNode, 'Path', SetCmdDirAsEnvVar(TDSXModule(Flist.Objects[I]).FileName)); AConfig.AddValue(SubNode, 'Description', TDSXModule(Flist.Objects[I]).Descr); end; end; procedure TDSXModuleList.DeleteItem(Index: integer); begin if (Index > -1) and (Index < Flist.Count) then begin TDSXModule(Flist.Objects[Index]).Free; Flist.Delete(Index); end; end; function TDSXModuleList.Add(Item: TDSXModule): integer; begin Result := Flist.AddObject(UpCase(item.Name), Item); end; function TDSXModuleList.Add(FileName: string): integer; var s: string; begin s := ExtractFileName(FileName); if pos('.', s) > 0 then Delete(s, pos('.', s), length(s)); Result := Flist.AddObject(UpCase(s), TDSXModule.Create); TDSXModule(Flist.Objects[Result]).Name := s; TDSXModule(Flist.Objects[Result]).FileName := FileName; end; function TDSXModuleList.Add(AName, FileName, Descr: string): integer; begin Result := Flist.AddObject(UpCase(AName), TDSXModule.Create); TDSXModule(Flist.Objects[Result]).Name := AName; TDSXModule(Flist.Objects[Result]).Descr := Descr; TDSXModule(Flist.Objects[Result]).FileName := FileName; end; procedure TDSXModuleList.Assign(OtherList: TDSXModuleList); var i: Integer; begin Clear; for i := 0 to OtherList.Flist.Count - 1 do begin with TDSXModule(OtherList.Flist.Objects[I]) do Add(Name, FileName, Descr); end; end; function TDSXModuleList.IsLoaded(AName: string): boolean; var x: integer; begin x := Flist.IndexOf(AName); if x = -1 then Result := False else begin Result := GetDSXModule(x).IsLoaded; end; end; function TDSXModuleList.IsLoaded(Index: integer): boolean; begin Result := GetDSXModule(Index).IsLoaded; end; function TDSXModuleList.LoadModule(AName: string): boolean; var x: integer; begin x := Flist.IndexOf(UpCase(AName)); if x = -1 then Result := False else begin Result := GetDSXModule(x).LoadModule; end; end; function TDSXModuleList.LoadModule(Index: integer): boolean; begin Result := GetDSXModule(Index).LoadModule; end; function TDSXModuleList.GetDSXModule(Index: integer): TDSXModule; begin Result := TDSXModule(Flist.Objects[Index]); end; function TDSXModuleList.GetDSXModule(AName: string): TDSXModule; var tmp: integer; begin tmp := Flist.IndexOf(upcase(AName)); if tmp > -1 then Result := TDSXModule(Flist.Objects[tmp]); end; end. doublecmd-0.5.8/src/udebug.pas0000644000175000017500000001201511740433676015267 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- This unit contains functions used for debugging. Copyright (C) 2011 Przemysław Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uDebug; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LCLVersion; // For Lazarus < 0.9.31. // Thread-safe DebugLn via DCDebug functions. // Still not fully safe because may conflict with DebugLn called by LCL. procedure DCDebug(Args: array of const); procedure DCDebug(const S: String; Args: array of const);// similar to Format(s,Args) procedure DCDebug(const s: String); procedure DCDebug(const s1,s2: String); procedure DCDebug(const s1,s2,s3: String); procedure DCDebug(const s1,s2,s3,s4: String); procedure DCDebug(const s1,s2,s3,s4,s5: String); // For Lazarus >= 0.9.31. // DebugLn and DbgOut are thread-safe due to TDCLogger but since TLazLogger // itself is designed for single-thread then DebugLnEnter, DebugLnExit cannot // be used from multiple threads. implementation uses LCLProc, syncobjs {$IF lcl_fullversion >= 093100} , LazLogger, LazLoggerBase, LazClasses {$ENDIF} ; {$IF lcl_fullversion >= 093100} type {en Logger with thread-safe DebugLn and DbgOut. } TDCLogger = class(TLazLoggerFile) private DebugLnLock: TCriticalSection; protected procedure DoDbgOut(const s: string); override; procedure DoDebugLn(const s: string); override; public constructor Create; destructor Destroy; override; end; function CreateDCLogger: TRefCountedObject; begin Result := TDCLogger.Create; TDCLogger(Result).Assign(GetExistingDebugLogger); end; { TDCLogger } procedure TDCLogger.DoDbgOut(const s: string); begin DebugLnLock.Acquire; try inherited DoDbgOut(s); finally DebugLnLock.Release; end; end; procedure TDCLogger.DoDebugLn(const s: string); begin DebugLnLock.Acquire; try inherited DoDebugLn(s); finally DebugLnLock.Release; end; end; constructor TDCLogger.Create; begin DebugLnLock := TCriticalSection.Create; inherited Create; end; destructor TDCLogger.Destroy; begin inherited Destroy; DebugLnLock.Free; end; procedure DCDebug(Args: array of const); begin DebugLn(Args); end; procedure DCDebug(const S: String; Args: array of const);// similar to Format(s,Args) begin DebugLn(S, Args); end; procedure DCDebug(const s: String); begin DebugLn(s); end; procedure DCDebug(const s1,s2: String); begin DebugLn(s1, s2); end; procedure DCDebug(const s1,s2,s3: String); begin DebugLn(s1, s2, s3); end; procedure DCDebug(const s1,s2,s3,s4: String); begin DebugLn(s1, s2, s3, s4); end; procedure DCDebug(const s1,s2,s3,s4,s5: String); begin DebugLn(s1, s2, s3, s4, s5); end; procedure DCDebug(const s1,s2,s3,s4,s5,s6: String); begin DebugLn(s1, s2, s3, s4, s5, s6); end; {$ELSE} var DebugLnLock: TCriticalSection; procedure DCDebug(Args: array of const); begin DebugLnLock.Acquire; try DebugLn(Args); finally DebugLnLock.Release; end; end; procedure DCDebug(const S: String; Args: array of const);// similar to Format(s,Args) begin DebugLnLock.Acquire; try DebugLn(S, Args); finally DebugLnLock.Release; end; end; procedure DCDebug(const s: String); begin DebugLnLock.Acquire; try DebugLn(s); finally DebugLnLock.Release; end; end; procedure DCDebug(const s1,s2: String); begin DebugLnLock.Acquire; try DebugLn(s1, s2); finally DebugLnLock.Release; end; end; procedure DCDebug(const s1,s2,s3: String); begin DebugLnLock.Acquire; try DebugLn(s1, s2, s3); finally DebugLnLock.Release; end; end; procedure DCDebug(const s1,s2,s3,s4: String); begin DebugLnLock.Acquire; try DebugLn(s1, s2, s3, s4); finally DebugLnLock.Release; end; end; procedure DCDebug(const s1,s2,s3,s4,s5: String); begin DebugLnLock.Acquire; try DebugLn(s1, s2, s3, s4, s5); finally DebugLnLock.Release; end; end; procedure DCDebug(const s1,s2,s3,s4,s5,s6: String); begin DebugLnLock.Acquire; try DebugLn(s1, s2, s3, s4, s5, s6); finally DebugLnLock.Release; end; end; {$ENDIF} initialization {$IF lcl_fullversion >= 093100} LazDebugLoggerCreator := @CreateDCLogger; RecreateDebugLogger; {$ELSE} DebugLnLock := TCriticalSection.Create; {$ENDIF} {$IF lcl_fullversion < 093100} finalization DebugLnLock.Free; {$ENDIF} end. doublecmd-0.5.8/src/utypes.pas0000644000175000017500000000313412024554637015344 0ustar alexxalexx{ Double commander ------------------------------------------------------------------------- Definitions of some common types. Copyright (C) 2012 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uTypes; // This unit should depend on as little other units as possible. interface type // plugin types TPluginType = (ptDSX, ptWCX, ptWDX, ptWFX, ptWLX); TCaseSensitivity = ( cstNotSensitive, // According to locale collation specs. Usually it means linguistic sorting // of character case "aAbBcC" taking numbers into consideration (aa1, aa2, aa10, aA1, aA2, aA10, ...). cstLocale, // Depending on character value, direct comparison of bytes, so usually ABCabc. // Might not work correctly for Unicode, just for Ansi. cstCharValue); TRange = record First: Integer; Last: Integer; end; TFileSizeFormat = (fsfFloat, fsfB, fsfK, fsfM, fsfG); implementation end. doublecmd-0.5.8/src/fFindDlg.pas0000644000175000017500000012661012250630256015466 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Find dialog, with searching in thread Copyright (C) 2003-2004 Radek Cervinka (radek.cervinka@centrum.cz) Copyright (C) 2006-2013 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fFindDlg; {$mode objfpc}{$H+} {$include calling.inc} interface uses Graphics, SysUtils, Classes, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, Menus, EditBtn, Spin, Buttons, ZVDateTimePicker, KASComboBox, fAttributesEdit, uDsxModule, DsxPlugin, uFindThread, uFindFiles, uSearchTemplate, uFileView; type { TfrmFindDlg } TfrmFindDlg = class(TForm) Bevel2: TBevel; btnAddAttribute: TButton; btnAttrsHelp: TButton; btnClose: TButton; btnGoToPath: TButton; btnNewSearch: TButton; btnLastSearch: TButton; btnSaveTemplate: TButton; btnSearchDelete: TButton; btnSearchLoad: TButton; btnSearchSave: TButton; btnSearchSaveWithStartingPath: TButton; btnStart: TButton; btnUseTemplate: TButton; btnStop: TButton; btnView: TButton; btnEdit: TButton; btnWorkWithFound: TButton; cbFindText: TCheckBox; cbNotContainingText: TCheckBox; cbDateFrom: TCheckBox; cbNotOlderThan: TCheckBox; cbFileSizeFrom: TCheckBox; cbDateTo: TCheckBox; cbFileSizeTo: TCheckBox; cbReplaceText: TCheckBox; cbTimeFrom: TCheckBox; cbTimeTo: TCheckBox; cbPartialNameSearch: TCheckBox; cbFollowSymLinks: TCheckBox; cbUsePlugin: TCheckBox; cbSelectedFiles: TCheckBox; cmbExcludeDirectories: TComboBoxWithDelItems; cmbNotOlderThanUnit: TComboBox; cmbFileSizeUnit: TComboBox; cmbEncoding: TComboBox; cmbSearchDepth: TComboBox; cbRegExp: TCheckBox; cmbPlugin: TComboBox; cmbReplaceText: TComboBoxWithDelItems; cmbFindText: TComboBoxWithDelItems; cmbExcludeFiles: TComboBoxWithDelItems; edtAttrib: TEdit; edtFindPathStart: TDirectoryEdit; gbDirectories: TGroupBox; gbFiles: TGroupBox; lblAttributes: TLabel; lblExcludeDirectories: TLabel; lblCurrent: TLabel; lblExcludeFiles: TLabel; lblFound: TLabel; lblStatus: TLabel; lblTemplateHeader: TLabel; lbSearchTemplates: TListBox; lblSearchContents: TPanel; lblSearchDepth: TLabel; lblEncoding: TLabel; lsFoundedFiles: TListBox; CheksPanel: TPanel; miShowAllFound: TMenuItem; miRemoveFromLlist: TMenuItem; pnlDirectoriesDepth: TPanel; pnlLoadSaveBottomButtons: TPanel; pnlLoadSaveBottom: TPanel; pnlButtons: TPanel; pnlResultsBottomButtons: TPanel; pnlResults: TPanel; pnlStatus: TPanel; pnlResultsBottom: TPanel; seNotOlderThan: TSpinEdit; seFileSizeFrom: TSpinEdit; seFileSizeTo: TSpinEdit; pnlFindFile: TPanel; pgcSearch: TPageControl; tsPlugins: TTabSheet; tsResults: TTabSheet; tsLoadSave: TTabSheet; tsStandard: TTabSheet; lblFindPathStart: TLabel; lblFindFileMask: TLabel; cmbFindFileMask: TComboBoxWithDelItems; gbFindData: TGroupBox; cbCaseSens: TCheckBox; tsAdvanced: TTabSheet; PopupMenuFind: TPopupMenu; miShowInViewer: TMenuItem; ZVDateFrom: TZVDateTimePicker; ZVDateTo: TZVDateTimePicker; ZVTimeFrom: TZVDateTimePicker; ZVTimeTo: TZVDateTimePicker; procedure btnAddAttributeClick(Sender: TObject); procedure btnAttrsHelpClick(Sender: TObject); procedure btnEditClick(Sender: TObject); procedure btnLastSearchClick(Sender: TObject); procedure btnSearchDeleteClick(Sender: TObject); procedure btnSearchLoadClick(Sender: TObject); procedure btnSearchSaveWithStartingPathClick(Sender: TObject); procedure btnSearchSaveClick(Sender: TObject); procedure cbDateFromChange(Sender: TObject); procedure cbDateToChange(Sender: TObject); procedure cbPartialNameSearchChange(Sender: TObject); procedure cbRegExpChange(Sender: TObject); procedure cbSelectedFilesChange(Sender: TObject); procedure cmbEncodingSelect(Sender: TObject); procedure cbFindTextChange(Sender: TObject); procedure cbUsePluginChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure btnGoToPathClick(Sender: TObject); procedure btnNewSearchClick(Sender: TObject); procedure btnSelDirClick(Sender: TObject); procedure btnStartClick(Sender: TObject); procedure btnViewClick(Sender: TObject); procedure btnWorkWithFoundClick(Sender: TObject); procedure cbDirectoryChange(Sender: TObject); procedure cbFileSizeFromChange(Sender: TObject); procedure cbFileSizeToChange(Sender: TObject); procedure cbNotOlderThanChange(Sender: TObject); procedure cbReplaceTextChange(Sender: TObject); procedure cbTimeFromChange(Sender: TObject); procedure cbTimeToChange(Sender: TObject); procedure btnStopClick(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure btnCloseClick(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure frmFindDlgClose(Sender: TObject; var {%H-}CloseAction: TCloseAction); procedure frmFindDlgShow(Sender: TObject); procedure gbDirectoriesResize(Sender: TObject); procedure lbSearchTemplatesDblClick(Sender: TObject); procedure lbSearchTemplatesSelectionChange(Sender: TObject; {%H-}User: boolean); procedure lsFoundedFilesDblClick(Sender: TObject); procedure lsFoundedFilesKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure miRemoveFromLlistClick(Sender: TObject); procedure miShowAllFoundClick(Sender: TObject); procedure miShowInViewerClick(Sender: TObject); procedure pgcSearchChange(Sender: TObject); procedure seFileSizeFromChange(Sender: TObject); procedure seFileSizeToChange(Sender: TObject); procedure seNotOlderThanChange(Sender: TObject); procedure tsLoadSaveShow(Sender: TObject); procedure ZVDateFromChange(Sender: TObject); procedure ZVDateToChange(Sender: TObject); procedure ZVTimeFromChange(Sender: TObject); procedure ZVTimeToChange(Sender: TObject); private FSelectedFiles: TStringList; FFindThread:TFindThread; DsxPlugins: TDSXModuleList; FSearchingActive: Boolean; FFrmAttributesEdit: TfrmAttributesEdit; FLastTemplateName: UTF8String; FLastSearchTemplate: TSearchTemplate; FUpdating: Boolean; procedure DisableControlsForTemplate; procedure StopSearch; procedure AfterSearchStopped; procedure FillFindOptions(out FindOptions: TSearchTemplateRec; SetStartPath: Boolean); procedure FindOptionsToDSXSearchRec(const AFindOptions: TSearchTemplateRec; out SRec: TDsxSearchRecord); procedure FoundedStringCopyChanged(Sender: TObject); procedure LoadTemplate(const Template: TSearchTemplateRec); procedure LoadSelectedTemplate; procedure SaveTemplate(SaveStartingPath: Boolean); procedure SelectTemplate(const ATemplateName: String); procedure UpdateTemplatesList; procedure OnAddAttribute(Sender: TObject); function InvalidRegExpr(AChecked: Boolean; const ARegExpr: String): Boolean; public class function Instance: TfrmFindDlg; public constructor Create(TheOwner: TComponent); override; destructor Destroy; override; procedure ClearFilter; procedure ClearResults; procedure ThreadTerminate(Sender:TObject); end; var FoundedStringCopy: TStringlist = nil; {en Shows the find files dialog. Cannot store FileView reference as it might get destroyed while Find Dialog is running. We can store FileSource though, if needed in future (as it is reference counted). @param(FileView For which file view the find dialog is executed, to get file source, current path and a list of selected files.) } procedure ShowFindDlg(FileView: TFileView); function ShowDefineTemplateDlg(var TemplateName: UTF8String): Boolean; function ShowUseTemplateDlg(var Template: TSearchTemplate): Boolean; implementation {$R *.lfm} uses LCLProc, LCLType, LConvEncoding, StrUtils, HelpIntfs, fViewer, fMain, uLng, uGlobs, uShowForm, uDCUtils, uFileSource, uSearchResultFileSource, uFile, uFileSystemFileSource, uFileViewNotebook, uColumnsFileView, uKeyboard, DCOSUtils, SynRegExpr; const TimeUnitToComboIndex: array[TTimeUnit] of Integer = (0, 1, 2, 3, 4, 5, 6); ComboIndexToTimeUnit: array[0..6] of TTimeUnit = (tuSecond, tuMinute, tuHour, tuDay, tuWeek, tuMonth, tuYear); FileSizeUnitToComboIndex: array[TFileSizeUnit] of Integer = (0, 1, 2, 3, 4); ComboIndexToFileSizeUnit: array[0..4] of TFileSizeUnit = (suBytes, suKilo, suMega, suGiga, suTera); var GfrmFindDlgInstance: TfrmFindDlg = nil; procedure SAddFileProc({%H-}PlugNr: Integer; FoundFile: PChar); dcpcall; var s: string; begin s := string(FoundFile); if s='' then begin TfrmFindDlg.Instance.AfterSearchStopped; end else begin FoundedStringCopy.Add(s); Application.ProcessMessages; end; end; procedure SUpdateStatusProc({%H-}PlugNr: Integer; CurrentFile: PChar; FilesScanned: Integer); dcpcall; var sCurrentFile: String; begin sCurrentFile := String(CurrentFile); TfrmFindDlg.Instance.lblStatus.Caption:=Format(rsFindScanned,[FilesScanned]); if sCurrentFile = '' then TfrmFindDlg.Instance.lblCurrent.Caption := '' else TfrmFindDlg.Instance.lblCurrent.Caption:=rsFindScanning + ': ' + sCurrentFile; Application.ProcessMessages; end; procedure ShowFindDlg(FileView: TFileView); var ASelectedFiles: TFiles = nil; I: Integer; begin if not Assigned(FileView) then raise Exception.Create('ShowFindDlg: FileView=nil'); with TfrmFindDlg.Instance do begin // Prepare window for search files ClearFilter; Caption := rsFindSearchFiles; edtFindPathStart.Text := FileView.CurrentPath; // Get paths of selected files, if any. FSelectedFiles.Clear; ASelectedFiles := FileView.CloneSelectedFiles; if Assigned(ASelectedFiles) then try if ASelectedFiles.Count > 0 then begin for I := 0 to ASelectedFiles.Count - 1 do FSelectedFiles.Add(ASelectedFiles[I].FullPath); end; finally FreeAndNil(ASelectedFiles); end; ShowOnTop; end; end; function ShowDefineTemplateDlg(var TemplateName: UTF8String): Boolean; var AIndex: Integer; AForm: TfrmFindDlg; begin AForm := TfrmFindDlg.Create(nil); try with AForm do begin // Prepare window for define search template Caption := rsFindDefineTemplate; AForm.DisableControlsForTemplate; btnSaveTemplate.Visible := True; btnSaveTemplate.Default := True; BorderIcons := [biSystemMenu, biMaximize]; if Length(TemplateName) > 0 then begin UpdateTemplatesList; AIndex:= lbSearchTemplates.Items.IndexOf(TemplateName); if AIndex >= 0 then begin lbSearchTemplates.ItemIndex:= AIndex; AForm.LoadSelectedTemplate; end; end; Result:= (ShowModal = mrOK); if Result and (lbSearchTemplates.Count > 0) then begin TemplateName:= lbSearchTemplates.Items[lbSearchTemplates.Count - 1]; end; end; finally AForm.Free; end; end; function ShowUseTemplateDlg(var Template: TSearchTemplate): Boolean; var AForm: TfrmFindDlg; SearchRec: TSearchTemplateRec; begin AForm := TfrmFindDlg.Create(nil); try with AForm do begin // Prepare window for define search template Caption := rsFindDefineTemplate; DisableControlsForTemplate; btnUseTemplate.Visible := True; btnUseTemplate.Default := True; BorderIcons := [biSystemMenu, biMaximize]; if Assigned(Template) then AForm.LoadTemplate(Template.SearchRecord); Result:= (ShowModal = mrOK); if Result then begin if not Assigned(Template) then Template:= TSearchTemplate.Create; try Template.TemplateName := AForm.FLastTemplateName; AForm.FillFindOptions(SearchRec, False); Template.SearchRecord := SearchRec; except FreeAndNil(Template); raise; end; end; end; finally AForm.Free; end; end; procedure TfrmFindDlg.FormCreate(Sender: TObject); var I: Integer; begin Height:= pnlFindFile.Height + 22; DsxPlugins := TDSXModuleList.Create; DsxPlugins.Assign(gDSXPlugins); FoundedStringCopy := TStringlist.Create; FoundedStringCopy.OnChange:=@FoundedStringCopyChanged; // load language edtFindPathStart.DialogTitle:= rsFindWhereBeg; cmbNotOlderThanUnit.Items.Add(rsTimeUnitSecond); cmbNotOlderThanUnit.Items.Add(rsTimeUnitMinute); cmbNotOlderThanUnit.Items.Add(rsTimeUnitHour); cmbNotOlderThanUnit.Items.Add(rsTimeUnitDay); cmbNotOlderThanUnit.Items.Add(rsTimeUnitWeek); cmbNotOlderThanUnit.Items.Add(rsTimeUnitMonth); cmbNotOlderThanUnit.Items.Add(rsTimeUnitYear); cmbFileSizeUnit.Items.Add(rsSizeUnitBytes); cmbFileSizeUnit.Items.Add(rsSizeUnitKBytes); cmbFileSizeUnit.Items.Add(rsSizeUnitMBytes); cmbFileSizeUnit.Items.Add(rsSizeUnitGBytes); cmbFileSizeUnit.Items.Add(rsSizeUnitTBytes); // fill search depth combobox cmbSearchDepth.Items.Add(rsFindDepthAll); cmbSearchDepth.Items.Add(rsFindDepthCurDir); for I:= 1 to 100 do cmbSearchDepth.Items.Add(Format(rsFindDepth, [IntToStr(I)])); cmbSearchDepth.ItemIndex:= 0; // fill encoding combobox cmbEncoding.Clear; GetSupportedEncodings(cmbEncoding.Items); cmbEncoding.ItemIndex:= cmbEncoding.Items.IndexOf(EncodingAnsi); // gray disabled fields cbUsePluginChange(Sender); cbFindTextChange(Sender); cbReplaceTextChange(Sender); cbNotOlderThanChange(Sender); cbFileSizeFromChange(Sender); cbFileSizeToChange(Sender); ZVDateFrom.DateTime:=Now(); ZVDateTo.DateTime:=Now(); ZVTimeFrom.DateTime:=Now(); ZVTimeTo.DateTime:=Now(); cbDateFrom.Checked:=False; cbDateTo.Checked:=False; cbTimeFrom.Checked:=False; cbTimeTo.Checked:=False; {$IF NOT (DEFINED(LCLGTK) or DEFINED(LCLGTK2))} btnStart.Default := True; {$ENDIF} cmbNotOlderThanUnit.ItemIndex := 3; // Days cmbFileSizeUnit.ItemIndex := 1; // Kilobytes edtFindPathStart.ShowHidden := gShowSystemFiles; cbPartialNameSearch.Checked:= gPartialNameSearch; InitPropStorage(Self); end; procedure TfrmFindDlg.cbUsePluginChange(Sender: TObject); begin EnableControl(cmbPlugin, cbUsePlugin.Checked); if not FUpdating and cmbPlugin.Enabled and cmbPlugin.CanFocus and (Sender = cbUsePlugin) then begin cmbPlugin.SetFocus; cmbPlugin.SelectAll; end; end; procedure TfrmFindDlg.cmbEncodingSelect(Sender: TObject); begin if cmbEncoding.ItemIndex <> cmbEncoding.Items.IndexOf(EncodingAnsi) then begin cbCaseSens.Tag:= Integer(cbCaseSens.Checked); cbCaseSens.Checked:= True; cbCaseSens.Enabled:= False; end else begin cbCaseSens.Checked:= Boolean(cbCaseSens.Tag); cbCaseSens.Enabled:= True; end; end; constructor TfrmFindDlg.Create(TheOwner: TComponent); begin FSelectedFiles := TStringList.Create; inherited Create(TheOwner); end; destructor TfrmFindDlg.Destroy; begin inherited Destroy; FSelectedFiles.Free; FLastSearchTemplate.Free; end; procedure TfrmFindDlg.DisableControlsForTemplate; begin lblFindPathStart.Visible := False; edtFindPathStart.Visible := False; cbFollowSymLinks.Visible := False; cbSelectedFiles.Visible := False; cbPartialNameSearch.Visible := False; btnStart.Visible := False; btnStop.Visible := False; btnNewSearch.Visible := False; btnLastSearch.Visible := False; btnSearchSaveWithStartingPath.Visible := False; gbFindData.Visible := False; tsPlugins.TabVisible := False; tsResults.TabVisible := False; end; procedure TfrmFindDlg.cbFindTextChange(Sender: TObject); begin EnableControl(cmbFindText, cbFindText.Checked); EnableControl(cmbEncoding, cbFindText.Checked); EnableControl(cbCaseSens, cbFindText.Checked); EnableControl(cbReplaceText, cbFindText.Checked); EnableControl(cbNotContainingText, cbFindText.Checked); lblEncoding.Enabled:=cbFindText.Checked; cbReplaceText.Checked:= False; if not FUpdating and cmbFindText.Enabled and cmbFindText.CanFocus and (Sender = cbFindText) then begin cmbFindText.SetFocus; cmbFindText.SelectAll; end; end; procedure TfrmFindDlg.ClearFilter; begin FUpdating := True; FLastTemplateName := ''; edtFindPathStart.Text:= ''; edtFindPathStart.ShowHidden := gShowSystemFiles; cmbExcludeDirectories.Text := ''; cmbSearchDepth.ItemIndex := 0; cmbFindFileMask.Text:= '*'; cmbExcludeFiles.Text := ''; cbPartialNameSearch.Checked:= gPartialNameSearch; cbRegExp.Checked := False; // attributes edtAttrib.Text:= ''; // file date/time ZVDateFrom.DateTime:=Now(); ZVDateTo.DateTime:=Now(); ZVTimeFrom.DateTime:=Now(); ZVTimeTo.DateTime:=Now(); cbDateFrom.Checked:=False; cbDateTo.Checked:=False; cbTimeFrom.Checked:=False; cbTimeTo.Checked:=False; // not older then cbNotOlderThan.Checked:= False; seNotOlderThan.Value:= 1; cmbNotOlderThanUnit.ItemIndex := 3; // Days // file size cbFileSizeFrom.Checked:= False; cbFileSizeTo.Checked:= False; seFileSizeFrom.Value:= 0; seFileSizeTo.Value:= 10; cmbFileSizeUnit.ItemIndex := 1; // Kilobytes // find/replace text // do not clear search/replace text just clear checkbox cbFindText.Checked:= False; cbReplaceText.Checked:= False; cbCaseSens.Checked:= False; cbNotContainingText.Checked:= False; cmbEncoding.ItemIndex := 0; // plugins cmbPlugin.Text:= ''; FUpdating := False; end; procedure TfrmFindDlg.ClearResults; begin lsFoundedFiles.Clear; lsFoundedFiles.Tag:= 0; lsFoundedFiles.ScrollWidth:= 0; FoundedStringCopy.Clear; end; procedure TfrmFindDlg.btnSearchLoadClick(Sender: TObject); begin LoadSelectedTemplate; end; procedure TfrmFindDlg.btnSearchSaveWithStartingPathClick(Sender: TObject); begin SaveTemplate(True); end; procedure TfrmFindDlg.btnSearchDeleteClick(Sender: TObject); var OldIndex: Integer; begin OldIndex := lbSearchTemplates.ItemIndex; if OldIndex < 0 then Exit; gSearchTemplateList.DeleteTemplate(OldIndex); lbSearchTemplates.Items.Delete(OldIndex); if OldIndex < lbSearchTemplates.Count then lbSearchTemplates.ItemIndex := OldIndex else if lbSearchTemplates.Count > 0 then lbSearchTemplates.ItemIndex := lbSearchTemplates.Count - 1; end; procedure TfrmFindDlg.btnAttrsHelpClick(Sender: TObject); begin ShowHelpOrErrorForKeyword('', edtAttrib.HelpKeyword); end; procedure TfrmFindDlg.btnEditClick(Sender: TObject); begin if lsFoundedFiles.ItemIndex <> -1 then ShowEditorByGlob(lsFoundedFiles.Items[lsFoundedFiles.ItemIndex]); end; procedure TfrmFindDlg.btnAddAttributeClick(Sender: TObject); begin if not Assigned(FFrmAttributesEdit) then begin FFrmAttributesEdit := TfrmAttributesEdit.Create(Self); FFrmAttributesEdit.OnOk := @OnAddAttribute; end; FFrmAttributesEdit.Reset; FFrmAttributesEdit.Show; end; procedure TfrmFindDlg.btnSearchSaveClick(Sender: TObject); begin SaveTemplate(False); end; procedure TfrmFindDlg.cbDateFromChange(Sender: TObject); begin UpdateColor(ZVDateFrom, cbDateFrom.Checked); end; procedure TfrmFindDlg.cbDateToChange(Sender: TObject); begin UpdateColor(ZVDateTo, cbDateTo.Checked); end; procedure TfrmFindDlg.cbPartialNameSearchChange(Sender: TObject); begin if cbPartialNameSearch.Checked then cbRegExp.Checked:=False; end; procedure TfrmFindDlg.cbRegExpChange(Sender: TObject); begin if cbRegExp.Checked then cbPartialNameSearch.Checked:=False; end; procedure TfrmFindDlg.cbSelectedFilesChange(Sender: TObject); begin edtFindPathStart.Enabled := not cbSelectedFiles.Checked; end; procedure TfrmFindDlg.btnSelDirClick(Sender: TObject); var s:String; begin s:=edtFindPathStart.Text; if not mbDirectoryExists(s) then s:=''; SelectDirectory(rsFindWhereBeg,'',s, False); edtFindPathStart.Text:=s; end; procedure TfrmFindDlg.btnNewSearchClick(Sender: TObject); begin StopSearch; pgcSearch.PageIndex:= 0; ClearResults; miShowAllFound.Enabled:=False; lblStatus.Caption:= EmptyStr; lblCurrent.Caption:= EmptyStr; lblFound.Caption:= EmptyStr; if pgcSearch.ActivePage = tsStandard then cmbFindFileMask.SetFocus; end; procedure TfrmFindDlg.btnGoToPathClick(Sender: TObject); begin if lsFoundedFiles.ItemIndex <> -1 then begin StopSearch; frmMain.ActiveFrame.CurrentPath := ExtractFilePath(lsFoundedFiles.Items[lsFoundedFiles.ItemIndex]); frmMain.ActiveFrame.SetActiveFile(ExtractFileName(lsFoundedFiles.Items[lsFoundedFiles.ItemIndex])); Close; end; end; procedure TfrmFindDlg.btnLastSearchClick(Sender: TObject); begin if Assigned(FLastSearchTemplate) then begin LoadTemplate(FLastSearchTemplate.SearchRecord); pgcSearch.ActivePage := tsStandard; cmbFindFileMask.SetFocus; end; end; procedure TfrmFindDlg.FillFindOptions(out FindOptions: TSearchTemplateRec; SetStartPath: Boolean); begin with FindOptions do begin if SetStartPath then StartPath := edtFindPathStart.Text else StartPath := ''; ExcludeDirectories := cmbExcludeDirectories.Text; FilesMasks := cmbFindFileMask.Text; ExcludeFiles := cmbExcludeFiles.Text; SearchDepth := cmbSearchDepth.ItemIndex - 1; RegExp := cbRegExp.Checked; IsPartialNameSearch := cbPartialNameSearch.Checked; FollowSymLinks := cbFollowSymLinks.Checked; { File attributes } AttributesPattern := edtAttrib.Text; { Date/time } DateTimeFrom := 0; DateTimeTo := 0; IsDateFrom := False; IsDateTo := False; IsTimeFrom := False; IsTimeTo := False; if cbDateFrom.Checked then begin IsDateFrom := True; DateTimeFrom := ZVDateFrom.Date; end; if cbDateTo.Checked then begin IsDateTo := True; DateTimeTo := ZVDateTo.Date; end; if cbTimeFrom.Checked then begin IsTimeFrom := True; DateTimeFrom := DateTimeFrom + ZVTimeFrom.Time; end; if cbTimeTo.Checked then begin IsTimeTo := True; DateTimeTo := DateTimeTo + ZVTimeTo.Time; end; { Not Older Than } IsNotOlderThan := cbNotOlderThan.Checked; NotOlderThan := seNotOlderThan.Value; NotOlderThanUnit := ComboIndexToTimeUnit[cmbNotOlderThanUnit.ItemIndex]; { File size } IsFileSizeFrom := cbFileSizeFrom.Checked; IsFileSizeTo := cbFileSizeTo.Checked; FileSizeFrom := seFileSizeFrom.Value; FileSizeTo := seFileSizeTo.Value; FileSizeUnit := ComboIndexToFileSizeUnit[cmbFileSizeUnit.ItemIndex]; { Find/replace text } IsFindText := cbFindText.Checked; FindText := cmbFindText.Text; IsReplaceText := cbReplaceText.Checked; ReplaceText := cmbReplaceText.Text; CaseSensitive := cbCaseSens.Checked; NotContainingText := cbNotContainingText.Checked; TextEncoding := cmbEncoding.Text; SearchPlugin := cmbPlugin.Text; end; end; procedure TfrmFindDlg.FindOptionsToDSXSearchRec( const AFindOptions: TSearchTemplateRec; out SRec: TDsxSearchRecord); begin with AFindOptions do begin FillByte(SRec{%H-}, SizeOf(SRec), 0); SRec.StartPath:= Copy(StartPath, 1, SizeOf(SRec.StartPath)); if IsPartialNameSearch then SRec.FileMask:= '*' + Copy(FilesMasks, 1, SizeOf(SRec.FileMask) - 2) + '*' else SRec.FileMask:= Copy(FilesMasks, 1, SizeOf(SRec.FileMask)); SRec.Attributes:= faAnyFile; // AttrStrToFileAttr? SRec.AttribStr:= Copy(AttributesPattern, 1, SizeOf(SRec.AttribStr)); SRec.CaseSensitive:=CaseSensitive; {Date search} SRec.IsDateFrom:=IsDateFrom; SRec.IsDateTo:=IsDateTo; SRec.DateTimeFrom:=DateTimeFrom; SRec.DateTimeTo:=DateTimeTo; {Time search} SRec.IsTimeFrom:=IsTimeFrom; SRec.IsTimeTo:=IsTimeTo; (* File size search *) SRec.IsFileSizeFrom:=IsFileSizeFrom; SRec.IsFileSizeTo:=IsFileSizeTo; SRec.FileSizeFrom:=FileSizeFrom; SRec.FileSizeTo:=FileSizeTo; (* Find text *) SRec.NotContainingText:=NotContainingText; SRec.IsFindText:=IsFindText; SRec.FindText:= Copy(FindText, 1, SizeOf(SRec.FindText)); (* Replace text *) SRec.IsReplaceText:=IsReplaceText; SRec.ReplaceText:= Copy(ReplaceText, 1, SizeOf(SRec.ReplaceText)); end; end; procedure TfrmFindDlg.StopSearch; begin if FSearchingActive then begin if (cbUsePlugin.Checked) and (cmbPlugin.ItemIndex<>-1) then begin DSXPlugins.GetDSXModule(cmbPlugin.ItemIndex).CallStopSearch; DSXPlugins.GetDSXModule(cmbPlugin.ItemIndex).CallFinalize; AfterSearchStopped; end; if Assigned(FFindThread) then begin FFindThread.Terminate; FFindThread := nil; end; end; end; class function TfrmFindDlg.Instance: TfrmFindDlg; begin if not Assigned(GfrmFindDlgInstance) then GfrmFindDlgInstance := TfrmFindDlg.Create(nil); Result := GfrmFindDlgInstance; end; procedure TfrmFindDlg.lbSearchTemplatesDblClick(Sender: TObject); begin LoadSelectedTemplate; end; procedure TfrmFindDlg.AfterSearchStopped; begin btnStop.Enabled:= False; btnStart.Enabled:= True; {$IF NOT (DEFINED(LCLGTK) or DEFINED(LCLGTK2))} btnStart.Default:= True; {$ENDIF} btnClose.Enabled:= True; btnNewSearch.Enabled:= True; FSearchingActive := False; end; procedure TfrmFindDlg.btnStartClick(Sender: TObject); var sTemp, sPath : UTF8String; sr: TDsxSearchRecord; SearchTemplate, TmpTemplate: TSearchTemplateRec; PassedSelectedFiles: TStringList = nil; begin sTemp:= edtFindPathStart.Text; repeat sPath:= Copy2SymbDel(sTemp, ';'); if not mbDirectoryExists(sPath) then begin ShowMessage(Format(rsFindDirNoEx,[sPath])); Exit; end; until sTemp = EmptyStr; // add to find mask history InsertFirstItem(cmbFindFileMask.Text, cmbFindFileMask); // add to exclude directories history InsertFirstItem(cmbExcludeDirectories.Text, cmbExcludeDirectories); // add to exclude files history InsertFirstItem(cmbExcludeFiles.Text, cmbExcludeFiles); // add to search text history if cbFindText.Checked then begin InsertFirstItem(cmbFindText.Text, cmbFindText); // update search history, so it can be used in // Viewer/Editor opened from find files dialog gFirstTextSearch:= False; glsSearchHistory.Assign(cmbFindText.Items); end; // add to replace text history if cbReplaceText.Checked then begin InsertFirstItem(cmbReplaceText.Text, cmbReplaceText); // update replace history, so it can be used in // Editor opened from find files dialog (issue 0000539) glsReplaceHistory.Assign(cmbReplaceText.Items); end; if cbSelectedFiles.Checked and (FSelectedFiles.Count = 0) then begin ShowMessage(rsMsgNoFilesSelected); cbSelectedFiles.Checked:= False; Exit; end; // Show search results page pgcSearch.ActivePageIndex:= pgcSearch.PageCount - 1; if lsFoundedFiles.CanFocus then lsFoundedFiles.SetFocus; ClearResults; miShowAllFound.Enabled:=False; FSearchingActive := True; btnStop.Enabled:=True; {$IF NOT (DEFINED(LCLGTK) or DEFINED(LCLGTK2))} btnStop.Default:=True; {$ENDIF} btnStart.Enabled:= False; btnClose.Enabled:= False; btnNewSearch.Enabled:= False; FillFindOptions(SearchTemplate, True); if not Assigned(FLastSearchTemplate) then FLastSearchTemplate := TSearchTemplate.Create; TmpTemplate := SearchTemplate; TmpTemplate.StartPath := ''; // Don't remember starting path. FLastSearchTemplate.SearchRecord := TmpTemplate; try if (cbUsePlugin.Checked) and (cmbPlugin.ItemIndex<>-1) then begin if DSXPlugins.LoadModule(cmbPlugin.ItemIndex) then begin FindOptionsToDSXSearchRec(SearchTemplate, sr); DSXPlugins.GetDSXModule(cmbPlugin.ItemIndex).CallInit(@SAddFileProc,@SUpdateStatusProc); DSXPlugins.GetDSXModule(cmbPlugin.ItemIndex).CallStartSearch(sr); end else StopSearch; end else begin if cbSelectedFiles.Checked then PassedSelectedFiles := FSelectedFiles; FFindThread := TFindThread.Create(SearchTemplate, PassedSelectedFiles); with FFindThread do begin Items := FoundedStringCopy; Status := lblStatus; Current := lblCurrent; Found := lblFound; OnTerminate := @ThreadTerminate; // will update the buttons after search is finished end; FFindThread.Start; end; except StopSearch; raise; end; end; procedure TfrmFindDlg.FoundedStringCopyChanged(Sender: TObject); var sText: String; iTemp: Integer; begin if FoundedStringCopy.Count > 0 then begin sText:= FoundedStringCopy[FoundedStringCopy.Count - 1]; iTemp:= Length(sText); if iTemp > lsFoundedFiles.Tag then begin lsFoundedFiles.Tag:= iTemp; iTemp:= lsFoundedFiles.Canvas.TextWidth(sText); if iTemp > lsFoundedFiles.ScrollWidth then lsFoundedFiles.ScrollWidth:= iTemp + 32; end; lsFoundedFiles.Items.Add(sText); end; end; procedure TfrmFindDlg.btnViewClick(Sender: TObject); begin if lsFoundedFiles.ItemIndex <> -1 then ShowViewerByGlob(lsFoundedFiles.Items[lsFoundedFiles.ItemIndex]); end; procedure TfrmFindDlg.btnWorkWithFoundClick(Sender: TObject); var I: Integer; sFileName: String; SearchResultFS: ISearchResultFileSource; FileList: TFileTree; aFile: TFile; Notebook: TFileViewNotebook; NewPage: TFileViewPage; FileView: TFileView; begin StopSearch; FileList := TFileTree.Create; for i := 0 to lsFoundedFiles.Items.Count - 1 do begin sFileName:= lsFoundedFiles.Items[I]; try aFile := TFileSystemFileSource.CreateFileFromFile(sFileName); FileList.AddSubNode(aFile); except on EFileNotFound do; end; end; // Create search result file source. // Currently only searching FileSystem is supported. SearchResultFS := TSearchResultFileSource.Create; SearchResultFS.AddList(FileList, TFileSystemFileSource.GetFileSource); // Add new tab for search results. Notebook := frmMain.ActiveNotebook; NewPage := Notebook.NewEmptyPage; NewPage.PermanentTitle := rsSearchResult; // Hard-coded Columns file view for now (later user will be able to change default view). FileView := TColumnsFileView.Create(NewPage, SearchResultFS, SearchResultFS.GetRootDir); frmMain.AssignEvents(FileView); NewPage.MakeActive; Close; end; procedure TfrmFindDlg.cbDirectoryChange(Sender: TObject); begin end; procedure TfrmFindDlg.cbFileSizeFromChange(Sender: TObject); begin UpdateColor(seFileSizeFrom, cbFileSizeFrom.Checked); EnableControl(cmbFileSizeUnit,cbFileSizeFrom.Checked or cbFileSizeTo.Checked); end; procedure TfrmFindDlg.cbFileSizeToChange(Sender: TObject); begin UpdateColor(seFileSizeTo, cbFileSizeTo.Checked); EnableControl(cmbFileSizeUnit,cbFileSizeFrom.Checked or cbFileSizeTo.Checked); end; procedure TfrmFindDlg.cbNotOlderThanChange(Sender: TObject); begin UpdateColor(seNotOlderThan, cbNotOlderThan.Checked); EnableControl(cmbNotOlderThanUnit,cbNotOlderThan.Checked); end; procedure TfrmFindDlg.cbReplaceTextChange(Sender: TObject); begin EnableControl(cmbReplaceText, cbReplaceText.Checked and cbFindText.Checked); cbNotContainingText.Checked := False; cbNotContainingText.Enabled := (not cbReplaceText.Checked and cbFindText.Checked); if not FUpdating and cmbReplaceText.Enabled and cmbReplaceText.CanFocus then begin cmbReplaceText.SetFocus; cmbReplaceText.SelectAll; end; end; procedure TfrmFindDlg.cbTimeFromChange(Sender: TObject); begin UpdateColor(ZVTimeFrom, cbTimeFrom.Checked); end; procedure TfrmFindDlg.cbTimeToChange(Sender: TObject); begin UpdateColor(ZVTimeTo, cbTimeTo.Checked); end; procedure TfrmFindDlg.ThreadTerminate(Sender:TObject); begin FFindThread:= nil; AfterSearchStopped; end; procedure TfrmFindDlg.btnStopClick(Sender: TObject); begin StopSearch; end; procedure TfrmFindDlg.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose:= not Assigned(FFindThread); end; procedure TfrmFindDlg.btnCloseClick(Sender: TObject); begin Close; end; procedure TfrmFindDlg.FormDestroy(Sender: TObject); begin FreeThenNil(FoundedStringCopy); FreeThenNil(DsxPlugins); end; procedure TfrmFindDlg.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Key of {$IF DEFINED(LCLGTK) or DEFINED(LCLGTK2)} // On LCLGTK2 default button on Enter does not work. VK_RETURN, VK_SELECT: begin Key := 0; if btnStart.Enabled then btnStart.Click else btnStop.Click; end; {$ENDIF} VK_ESCAPE: begin Key := 0; if FSearchingActive then StopSearch else Close; end; VK_1..VK_5: begin if Shift * KeyModifiersShortcut = [ssAlt] then begin pgcSearch.PageIndex := Key - VK_1; Key := 0; end; end; VK_TAB: begin if Shift * KeyModifiersShortcut = [ssCtrl] then begin pgcSearch.SelectNextPage(True); Key := 0; end else if Shift * KeyModifiersShortcut = [ssCtrl, ssShift] then begin pgcSearch.SelectNextPage(False); Key := 0; end; end; end; end; procedure TfrmFindDlg.frmFindDlgClose(Sender: TObject; var CloseAction: TCloseAction); begin glsMaskHistory.Assign(cmbFindFileMask.Items); glsSearchExcludeFiles.Assign(cmbExcludeFiles.Items); glsSearchExcludeDirectories.Assign(cmbExcludeDirectories.Items); if Assigned(FFrmAttributesEdit) then begin FFrmAttributesEdit.Close; FreeAndNil(FFrmAttributesEdit); end; end; procedure TfrmFindDlg.frmFindDlgShow(Sender: TObject); var I: Integer; begin pgcSearch.PageIndex:= 0; if cmbFindFileMask.Visible then cmbFindFileMask.SelectAll; cmbFindFileMask.Items.Assign(glsMaskHistory); cmbFindText.Items.Assign(glsSearchHistory); // if we already search text then use last searched text if not gFirstTextSearch then begin if glsSearchHistory.Count > 0 then cmbFindText.Text:= glsSearchHistory[0]; end; cmbReplaceText.Items.Assign(glsReplaceHistory); cmbExcludeFiles.Items.Assign(glsSearchExcludeFiles); cmbExcludeDirectories.Items.Assign(glsSearchExcludeDirectories); cbFindText.Checked := False; lsFoundedFiles.Canvas.Font := lsFoundedFiles.Font; cmbPlugin.Clear; for I:= 0 to DSXPlugins.Count-1 do begin cmbPlugin.AddItem(DSXPlugins.GetDSXModule(i).Name+' (' + DSXPlugins.GetDSXModule(I).Descr+' )',nil); end; if (cmbPlugin.Items.Count>0) then cmbPlugin.ItemIndex:=0; if pgcSearch.ActivePage = tsStandard then if cmbFindFileMask.CanFocus then cmbFindFileMask.SetFocus; cbSelectedFiles.Checked := FSelectedFiles.Count > 0; cbSelectedFiles.Enabled := cbSelectedFiles.Checked; end; procedure TfrmFindDlg.gbDirectoriesResize(Sender: TObject); begin pnlDirectoriesDepth.Width := gbDirectories.Width div 3; end; procedure TfrmFindDlg.lbSearchTemplatesSelectionChange(Sender: TObject; User: boolean); begin if lbSearchTemplates.ItemIndex < 0 then lblSearchContents.Caption := '' else begin with gSearchTemplateList.Templates[lbSearchTemplates.ItemIndex].SearchRecord do begin if StartPath <> '' then lblSearchContents.Caption := '"' + FilesMasks + '" -> "' + StartPath + '"' else lblSearchContents.Caption := '"' + FilesMasks + '"'; end; end; end; procedure TfrmFindDlg.LoadSelectedTemplate; var SearchTemplate: TSearchTemplate; begin if lbSearchTemplates.ItemIndex < 0 then Exit; SearchTemplate:= gSearchTemplateList.Templates[lbSearchTemplates.ItemIndex]; if Assigned(SearchTemplate) then begin FLastTemplateName := SearchTemplate.TemplateName; LoadTemplate(SearchTemplate.SearchRecord); end; end; procedure TfrmFindDlg.LoadTemplate(const Template: TSearchTemplateRec); begin with Template do begin if StartPath <> '' then edtFindPathStart.Text:= StartPath; cmbExcludeDirectories.Text:= ExcludeDirectories; cmbFindFileMask.Text:= FilesMasks; cmbExcludeFiles.Text:= ExcludeFiles; if (SearchDepth + 1 >= 0) and (SearchDepth + 1 < cmbSearchDepth.Items.Count) then cmbSearchDepth.ItemIndex:= SearchDepth + 1 else cmbSearchDepth.ItemIndex:= 0; cbRegExp.Checked := RegExp; cbPartialNameSearch.Checked := IsPartialNameSearch; cbFollowSymLinks.Checked := FollowSymLinks; // attributes edtAttrib.Text:= AttributesPattern; // file date/time cbDateFrom.Checked:= IsDateFrom; if IsDateFrom then ZVDateFrom.Date:= DateTimeFrom; cbDateTo.Checked:= IsDateTo; if IsDateTo then ZVDateTo.Date:= DateTimeTo; cbTimeFrom.Checked:= IsTimeFrom; if IsTimeFrom then ZVTimeFrom.Time:= DateTimeFrom; cbTimeTo.Checked:= IsTimeTo; if IsTimeTo then ZVTimeTo.Time:= DateTimeTo; // not older then cbNotOlderThan.Checked:= IsNotOlderThan; seNotOlderThan.Value:= NotOlderThan; cmbNotOlderThanUnit.ItemIndex := TimeUnitToComboIndex[NotOlderThanUnit]; // file size cbFileSizeFrom.Checked:= IsFileSizeFrom; cbFileSizeTo.Checked:= IsFileSizeTo; seFileSizeFrom.Value:= FileSizeFrom; seFileSizeTo.Value:= FileSizeTo; cmbFileSizeUnit.ItemIndex := FileSizeUnitToComboIndex[FileSizeUnit]; // find/replace text cbFindText.Checked:= IsFindText; cmbFindText.Text:= FindText; cbReplaceText.Checked:= IsReplaceText; cmbReplaceText.Text:= ReplaceText; cbCaseSens.Checked:= CaseSensitive; cbNotContainingText.Checked:= NotContainingText; cmbEncoding.Text:= TextEncoding; cmbPlugin.Text:= SearchPlugin; end; end; procedure TfrmFindDlg.lsFoundedFilesDblClick(Sender: TObject); begin if not FSearchingActive then btnGoToPathClick(Sender); end; procedure TfrmFindDlg.lsFoundedFilesKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Shift = []) and (lsFoundedFiles.ItemIndex <> -1) then begin case Key of VK_F3: begin ShowViewerByGlob(lsFoundedFiles.Items[lsFoundedFiles.ItemIndex]); Key := 0; end; VK_F4: begin ShowEditorByGlob(lsFoundedFiles.Items[lsFoundedFiles.ItemIndex]); Key := 0; end; VK_DELETE: begin miRemoveFromLlistClick(Sender); Key := 0; end; VK_RETURN: begin if not FSearchingActive then begin btnGoToPathClick(Sender); Key := 0; end; end; end; end; end; procedure TfrmFindDlg.miRemoveFromLlistClick(Sender: TObject); var i:Integer; begin if lsFoundedFiles.ItemIndex=-1 then Exit; if lsFoundedFiles.SelCount = 0 then Exit; for i:=lsFoundedFiles.Items.Count-1 downto 0 do if lsFoundedFiles.Selected[i] then lsFoundedFiles.Items.Delete(i); miShowAllFound.Enabled:=True; end; procedure TfrmFindDlg.miShowAllFoundClick(Sender: TObject); begin lsFoundedFiles.Clear; lsFoundedFiles.Items.AddStrings(FoundedStringCopy); miShowAllFound.Enabled:=False; end; procedure TfrmFindDlg.miShowInViewerClick(Sender: TObject); var sl:TStringList; i:Integer; begin if lsFoundedFiles.ItemIndex=-1 then Exit; sl:=TStringList.Create; try for i:=0 to lsFoundedFiles.Items.Count-1 do if lsFoundedFiles.Selected[i] then sl.Add(lsFoundedFiles.Items[i]); ShowViewer(sl); finally sl.Free; end; end; procedure TfrmFindDlg.seFileSizeFromChange(Sender: TObject); begin if not FUpdating then cbFileSizeFrom.Checked:= (seFileSizeFrom.Value > 0); end; procedure TfrmFindDlg.seFileSizeToChange(Sender: TObject); begin if not FUpdating then cbFileSizeTo.Checked:= (seFileSizeTo.Value > 0); end; procedure TfrmFindDlg.SelectTemplate(const ATemplateName: String); var i: Integer; begin for i := 0 to lbSearchTemplates.Count - 1 do if lbSearchTemplates.Items[i] = ATemplateName then begin lbSearchTemplates.ItemIndex := i; Break; end; end; procedure TfrmFindDlg.seNotOlderThanChange(Sender: TObject); begin if not FUpdating then cbNotOlderThan.Checked:= (seNotOlderThan.Value > 0); end; procedure TfrmFindDlg.tsLoadSaveShow(Sender: TObject); begin UpdateTemplatesList; if (lbSearchTemplates.Count > 0) and (lbSearchTemplates.ItemIndex = -1) then lbSearchTemplates.ItemIndex := 0; end; procedure TfrmFindDlg.UpdateTemplatesList; var OldIndex: Integer; begin OldIndex := lbSearchTemplates.ItemIndex; gSearchTemplateList.LoadToStringList(lbSearchTemplates.Items); if OldIndex <> -1 then lbSearchTemplates.ItemIndex := OldIndex; end; procedure TfrmFindDlg.ZVDateFromChange(Sender: TObject); begin if not FUpdating then cbDateFrom.Checked:= True; end; procedure TfrmFindDlg.ZVDateToChange(Sender: TObject); begin if not FUpdating then cbDateTo.Checked:= True; end; procedure TfrmFindDlg.ZVTimeFromChange(Sender: TObject); begin if not FUpdating then cbTimeFrom.Checked:= True; end; procedure TfrmFindDlg.ZVTimeToChange(Sender: TObject); begin if not FUpdating then cbTimeTo.Checked:= True; end; procedure TfrmFindDlg.OnAddAttribute(Sender: TObject); var sAttr: String; begin sAttr := edtAttrib.Text; if edtAttrib.SelStart > 0 then // Insert at caret position. Insert((Sender as TfrmAttributesEdit).AttrsAsText, sAttr, edtAttrib.SelStart + 1) else sAttr := sAttr + (Sender as TfrmAttributesEdit).AttrsAsText; edtAttrib.Text := sAttr; end; function TfrmFindDlg.InvalidRegExpr(AChecked: Boolean; const ARegExpr: String): Boolean; var sMsg: UTF8String; begin Result:= False; if AChecked then try ExecRegExpr(ARegExpr, ''); except on E: Exception do begin Result:= True; sMsg:= StringReplace(cbRegExp.Caption, '&', '', [rfReplaceAll]); MessageDlg(sMsg + ': ' + E.Message, mtError, [mbOK], 0); end; end; end; procedure TfrmFindDlg.pgcSearchChange(Sender: TObject); begin if (pgcSearch.ActivePage = tsStandard) and not cmbFindFileMask.Focused then begin if cmbFindFileMask.CanFocus then cmbFindFileMask.SetFocus; end; end; procedure TfrmFindDlg.SaveTemplate(SaveStartingPath: Boolean); var sName: UTF8String; SearchTemplate: TSearchTemplate; SearchRec: TSearchTemplateRec; begin if InvalidRegExpr(cbRegExp.Checked, cmbFindFileMask.Text) then Exit; sName := FLastTemplateName; if not InputQuery(rsFindSaveTemplateCaption, rsFindSaveTemplateTitle, sName) then begin ModalResult:= mrCancel; Exit; end; FLastTemplateName := sName; SearchTemplate := gSearchTemplateList.TemplateByName[sName]; if Assigned(SearchTemplate) then begin // TODO: Ask for overwriting existing template. FillFindOptions(SearchRec, SaveStartingPath); SearchTemplate.SearchRecord := SearchRec; Exit; end; SearchTemplate:= TSearchTemplate.Create; try SearchTemplate.TemplateName:= sName; FillFindOptions(SearchRec, SaveStartingPath); SearchTemplate.SearchRecord := SearchRec; gSearchTemplateList.Add(SearchTemplate); except FreeAndNil(SearchTemplate); raise; end; UpdateTemplatesList; SelectTemplate(FLastTemplateName); end; finalization FreeAndNil(GfrmFindDlgInstance); end. doublecmd-0.5.8/src/ufilesorting.pas0000644000175000017500000010326311746530016016524 0ustar alexxalexxunit uFileSorting; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileFunctions, uFile, uFileProperty, uDisplayFile; type TSortDirection = (sdNone, sdAscending, sdDescending); TFileSorting = record SortFunctions: TFileFunctions; SortDirection: TSortDirection; end; TFileSortings = array of TFileSorting; { TBaseSorter } TBaseSorter = class private FSortings: TFileSortings; {en Checks the files list for supported properties and removes not supported sortings. Currently treats files as if they all had the same properties. } procedure CheckSupportedProperties(SupportedFileProperties: TFilePropertiesTypes); {en Compares two file records using file functions. @param(ptr1 First file) @param(ptr2 Second file) @returns(-1 lesser @br 0 equal @br 1 greater) } class function Compare(const FileSorting: TFileSorting; File1, File2: TFile): Integer; public constructor Create(const Sortings: TFileSortings); reintroduce; end; { TFileSorter } TFileSorter = class(TBaseSorter) private FSortList: TFiles; function MultiCompare(item1, item2: Pointer):Integer; procedure QuickSort(FList: PPointerList; L, R : Longint); public {en Creates the sorter. @param(Files List of files to be sorted.) @param(FileSorting Sorting which will be used to sort file records.) } constructor Create(Files: TFiles; Sortings: TFileSortings); procedure Sort; {en Sorts files in FilesToSort using ASorting. } class procedure Sort(FilesToSort: TFiles; const ASortings: TFileSortings); end; { TDisplayFileSorter } TDisplayFileSorter = class(TBaseSorter) private FDisplaySortList: TDisplayFiles; FFileToInsert: TDisplayFile; FFilesToInsert: TDisplayFiles; FFileIndexToResort: Integer; FResortSingle: Boolean; FSequentialSearch: Boolean; // Use sequential search instead of binary protected procedure BinaryInsertSingle(FileToInsert: TDisplayFile; List: TFPList; L, R: Longint); procedure BinaryResortSingle(UnsortedIndex: Integer; PList: PPointerList; L, R : Longint); function BinarySearch(DisplayFile: Pointer; PList: PPointerList; L, R: Longint; out FoundIndex: Longint): Integer; procedure InsertSort(FilesToInsert, AlreadySortedFiles: TDisplayFiles); procedure InsertSort(FileToInsert: TDisplayFile; AlreadySortedFiles: TDisplayFiles); function MultiCompare(item1, item2: Pointer):Integer; procedure QuickSort(FList: PPointerList; L, R : Longint); {en The single file at index IndexToResort should be repositioned in the SortedFiles list. All other elements, except for the element at IndexToResort, must be already sorted. } procedure ResortSingle(IndexToResort: Integer; SortedFiles: TDisplayFiles); procedure SequentialInsertSingle(FileToInsert: TDisplayFile; List: TFPList); public constructor Create(Files: TDisplayFiles; Sortings: TFileSortings); constructor Create(FilesToInsert, AlreadySortedFiles: TDisplayFiles; const Sortings: TFileSortings); constructor Create(FileToInsert: TDisplayFile; AlreadySortedFiles: TDisplayFiles; const Sortings: TFileSortings; ASequentialSearch: Boolean = False); constructor Create(IndexToResort: Integer; SortedFiles: TDisplayFiles; const Sortings: TFileSortings); procedure Sort; class procedure InsertSort(FilesToInsert, AlreadySortedFiles: TDisplayFiles; const ASortings: TFileSortings); class procedure InsertSort(FileToInsert: TDisplayFile; AlreadySortedFiles: TDisplayFiles; const ASortings: TFileSortings; ASequentialSearch: Boolean = False); class procedure ResortSingle(IndexToResort: Integer; SortedFiles: TDisplayFiles; const ASortings: TFileSortings); class procedure Sort(FilesToSort: TDisplayFiles; const ASortings: TFileSortings); end; {en Returns true if the file functions will sort by the given sort function. } function HasSortFunction(FileFunctions: TFileFunctions; SortFunction: TFileFunction): Boolean; function HasSortFunction(FileSortings: TFileSortings; SortFunction: TFileFunction): Boolean; function GetSortDirection(FileSortings: TFileSortings; SortFunction: TFileFunction): TSortDirection; function GetSortDirection(FileSortings: TFileSortings; SortFunctions: TFileFunctions): TSortDirection; {en Adds a function to the given list of functions. } procedure AddSortFunction(var FileFunctions: TFileFunctions; SortFunction: TFileFunction); {en Deletes a function from the given list of functions. } procedure DeleteSortFunction(var FileFunctions: TFileFunctions; SortFunction: TFileFunction); {en Adds sorting by functions with a given sorting direction to existing sorting. } procedure AddSorting(var Sortings: TFileSortings; SortFunctions: TFileFunctions; SortDirection: TSortDirection); procedure AddOrUpdateSorting(var Sortings: TFileSortings; SortFunctions: TFileFunctions; SortDirection: TSortDirection); {en Checks if there is a sorting by Name, NameNoExtension or Extension and adds such sortings if there isn't. } procedure AddSortingByNameIfNeeded(var FileSortings: TFileSortings); {en Creates a deep copy of sortings. } function CloneSortings(const Sortings: TFileSortings): TFileSortings; function ICompareByDirectory(item1, item2: TFile; bSortNegative: Boolean):Integer; function ICompareByName(item1, item2: TFile; bSortNegative: Boolean):Integer; function ICompareByNameNoExt(item1, item2: TFile; bSortNegative: Boolean):Integer; function ICompareByExt (item1, item2: TFile; bSortNegative: Boolean):Integer; function ICompareBySize(item1, item2: TFile; bSortNegative: Boolean):Integer; function ICompareByDate(date1, date2: TDateTime; bSortNegative: Boolean):Integer; function ICompareByAttr(item1, item2: TFile; bSortNegative: Boolean):Integer; function CloneAndAddSortByNameIfNeeded(const Sortings: TFileSortings): TFileSortings; function ReverseSortDirection(SortDirection: TSortDirection): TSortDirection; function ReverseSortDirection(Sortings: TFileSortings): TFileSortings; implementation uses DCBasicTypes, uGlobs, DCStrUtils, uDCUtils {$IFDEF fileSortingTime} , uDebug {$ENDIF} ; {$IFDEF fileSortingTime} var fileSortingTimer: TDateTime; {$ENDIF} procedure TFPListFastMove(CurIndex, NewIndex: Integer; PList: PPointerList); var Temp: Pointer; begin Temp := PList^[CurIndex]; if NewIndex > CurIndex then System.Move(PList^[CurIndex+1], PList^[CurIndex], (NewIndex - CurIndex) * SizeOf(Pointer)) else System.Move(PList^[NewIndex], PList^[NewIndex+1], (CurIndex - NewIndex) * SizeOf(Pointer)); PList^[NewIndex] := Temp; end; function HasSortFunction(FileFunctions: TFileFunctions; SortFunction: TFileFunction): Boolean; var i: Integer; begin for i := 0 to Length(FileFunctions) - 1 do begin if SortFunction = FileFunctions[i] then Exit(True); end; Result := False; end; function HasSortFunction(FileSortings: TFileSortings; SortFunction: TFileFunction): Boolean; var i: Integer; begin for i := 0 to Length(FileSortings) - 1 do begin if HasSortFunction(FileSortings[i].SortFunctions, SortFunction) then Exit(True); end; Result := False; end; function GetSortDirection(FileSortings: TFileSortings; SortFunction: TFileFunction): TSortDirection; var i: Integer; begin for i := 0 to Length(FileSortings) - 1 do begin if HasSortFunction(FileSortings[i].SortFunctions, SortFunction) then Exit(FileSortings[i].SortDirection); end; Result := sdNone; end; function GetSortDirection(FileSortings: TFileSortings; SortFunctions: TFileFunctions): TSortDirection; var i, j: Integer; Found: Boolean; begin for i := 0 to Length(FileSortings) - 1 do begin if Length(FileSortings[i].SortFunctions) = Length(SortFunctions) then begin Found := True; for j := 0 to Length(SortFunctions) - 1 do if FileSortings[i].SortFunctions[j] <> SortFunctions[j] then begin Found := False; Break; end; if Found then Exit(FileSortings[i].SortDirection); end; end; Result := sdNone; end; procedure AddSortFunction(var FileFunctions: TFileFunctions; SortFunction: TFileFunction); begin SetLength(FileFunctions, Length(FileFunctions) + 1); FileFunctions[Length(FileFunctions) - 1] := SortFunction; end; procedure DeleteSorting(var FileSortings: TFileSortings; Index: Integer); var Len: Integer; i: Integer; begin Len := Length(FileSortings); for i := Index + 1 to Len - 1 do FileSortings[i - 1] := FileSortings[i]; SetLength(FileSortings, Len - 1); end; procedure DeleteSortFunction(var FileFunctions: TFileFunctions; SortFunction: TFileFunction); var Len: Integer; i, j: Integer; begin for i := Low(FileFunctions) to High(FileFunctions) do if FileFunctions[i] = SortFunction then begin Len := Length(FileFunctions); for j := i + 1 to Len - 1 do FileFunctions[j - 1] := FileFunctions[j]; SetLength(FileFunctions, Len - 1); Break; end; end; procedure AddSorting(var Sortings: TFileSortings; SortFunctions: TFileFunctions; SortDirection: TSortDirection); var SortingIndex: Integer; begin if Length(SortFunctions) > 0 then begin SortingIndex := Length(Sortings); SetLength(Sortings, SortingIndex + 1); Sortings[SortingIndex].SortFunctions := SortFunctions; Sortings[SortingIndex].SortDirection := SortDirection; end; end; procedure AddSorting(var FileSortings: TFileSortings; SortFunction: TFileFunction; SortDirection: TSortDirection); var SortFunctions: TFileFunctions = nil; begin AddSortFunction(SortFunctions, SortFunction); AddSorting(FileSortings, SortFunctions, SortDirection); end; procedure AddOrUpdateSorting(var Sortings: TFileSortings; SortFunctions: TFileFunctions; SortDirection: TSortDirection); var i, j: Integer; RemainingFunctions: TFileFunctions; begin if Length(SortFunctions) = 0 then Exit; RemainingFunctions := SortFunctions; // Check if there is already sorting by the functions. // If it is then reverse direction of sorting. for i := Low(Sortings) to High(Sortings) do begin RemainingFunctions := SortFunctions; for j := Low(SortFunctions) to High(SortFunctions) do begin if HasSortFunction(Sortings[i].SortFunctions, SortFunctions[j]) then DeleteSortFunction(RemainingFunctions, SortFunctions[j]); end; if Length(RemainingFunctions) = 0 then begin // Sorting contains all functions - reverse direction. Sortings[i].SortDirection := ReverseSortDirection(Sortings[i].SortDirection); SortFunctions := nil; Break; end else if Length(RemainingFunctions) < Length(SortFunctions) then begin // Sorting contains some but not all functions - delete this one and later add sorting with all functions. Sortings[i].SortDirection := sdNone; end; end; for i := High(Sortings) downto Low(Sortings) do if Sortings[i].SortDirection = sdNone then DeleteSorting(Sortings, i); AddSorting(Sortings, SortFunctions, SortDirection); end; procedure AddSortingByNameIfNeeded(var FileSortings: TFileSortings); var bSortedByName: Boolean = False; bSortedByExtension: Boolean = False; i: Integer; begin for i := 0 to Length(FileSortings) - 1 do begin if HasSortFunction(FileSortings[i].SortFunctions, fsfName) then begin bSortedByName := True; bSortedByExtension := True; Exit; end else if HasSortFunction(FileSortings[i].SortFunctions, fsfNameNoExtension) then begin bSortedByName := True; end else if HasSortFunction(FileSortings[i].SortFunctions, fsfExtension) then begin bSortedByExtension := True; end; end; if not bSortedByName then begin if not bSortedByExtension then AddSorting(FileSortings, fsfName, sdAscending) else AddSorting(FileSortings, fsfNameNoExtension, sdAscending); end else if not bSortedByExtension then AddSorting(FileSortings, fsfExtension, sdAscending); // else // There is already a sorting by filename and extension. end; function CloneSortings(const Sortings: TFileSortings): TFileSortings; var i, j: Integer; begin SetLength(Result, Length(Sortings)); for i := 0 to Length(Sortings) - 1 do begin SetLength(Result[i].SortFunctions, Length(Sortings[i].SortFunctions)); for j := 0 to Length(Sortings[i].SortFunctions) - 1 do Result[i].SortFunctions[j] := Sortings[i].SortFunctions[j]; Result[i].SortDirection := Sortings[i].SortDirection; end; end; function CloneAndAddSortByNameIfNeeded(const Sortings: TFileSortings): TFileSortings; begin Result := CloneSortings(Sortings); // Add automatic sorting by name and/or extension if there wasn't any. AddSortingByNameIfNeeded(Result); end; function ICompareByDirectory(item1, item2: TFile; bSortNegative: Boolean):Integer; var IsDir1, IsDir2: Boolean; begin IsDir1 := item1.IsDirectory or item1.IsLinkToDirectory; IsDir2 := item2.IsDirectory or item2.IsLinkToDirectory; if (not IsDir1) and (not IsDir2) then Result := 0 else if (not IsDir1) and IsDir2 then Result := 1 else if IsDir1 and (not IsDir2) then Result := -1 // Put '..' first. else if item1.Name = '..' then Result := -1 else if item2.Name = '..' then Result := 1 else if (gSortFolderMode <> sfmSortNameShowFirst) then Result := 0 else Result := CompareStrings(item1.Name, item2.Name, gSortNatural, gSortCaseSensitivity); end; function ICompareByName(item1, item2: TFile; bSortNegative: Boolean):Integer; begin Result := CompareStrings(item1.Name, item2.Name, gSortNatural, gSortCaseSensitivity); if bSortNegative then Result := -Result; end; function ICompareByNameNoExt(item1, item2: TFile; bSortNegative: Boolean):Integer; begin // Don't sort directories only by name. if item1.IsDirectory or item1.IsLinkToDirectory or item2.IsDirectory or item2.IsLinkToDirectory then begin // Sort by full name. Result := ICompareByName(item1, item2, bSortNegative); end else begin Result := CompareStrings(item1.NameNoExt, item2.NameNoExt, gSortNatural, gSortCaseSensitivity); if bSortNegative then Result := -Result; end; end; function ICompareByExt(item1, item2: TFile; bSortNegative: Boolean):Integer; begin Result := CompareStrings(item1.Extension, item2.Extension, gSortNatural, gSortCaseSensitivity); if bSortNegative then Result := -Result; end; function ICompareByDate(date1, date2: TDateTime; bSortNegative: Boolean):Integer; begin if date1 = date2 then Result := 0 else begin if date1 < date2 then Result := -1 else Result := +1; if bSortNegative then Result := -Result; end; end; function ICompareByAttr(item1, item2: TFile; bSortNegative: Boolean):Integer; var Attr1, Attr2: TFileAttrs; begin Attr1 := item1.Attributes; Attr2 := item2.Attributes; if Attr1 = Attr2 then Result := 0 else begin if Attr1 > Attr2 then Result := -1 else Result := +1; if bSortNegative then Result := -Result; end; end; function ICompareBySize(item1, item2: TFile; bSortNegative: Boolean):Integer; var iSize1 : Int64; iSize2 : Int64; begin iSize1 := item1.Size; iSize2 := item2.Size; if iSize1 = iSize2 then Result := 0 else begin if iSize1 < iSize2 then Result := -1 else Result := +1; if bSortNegative then Result := -Result; end; end; function ReverseSortDirection(SortDirection: TSortDirection): TSortDirection; begin case SortDirection of sdAscending: Result := sdDescending; sdDescending: Result := sdAscending; end; end; function ReverseSortDirection(Sortings: TFileSortings): TFileSortings; var i: Integer; begin Result := CloneSortings(Sortings); for i := 0 to Length(Result) - 1 do Result[i].SortDirection := ReverseSortDirection(Result[i].SortDirection); end; { TBaseSorter } constructor TBaseSorter.Create(const Sortings: TFileSortings); begin FSortings := Sortings; inherited Create; end; procedure TBaseSorter.CheckSupportedProperties(SupportedFileProperties: TFilePropertiesTypes); var SortingIndex: Integer; FunctionIndex: Integer; i: Integer; begin // Check if each sort function is supported. SortingIndex := 0; while SortingIndex < Length(FSortings) do begin FunctionIndex := 0; while FunctionIndex < Length(FSortings[SortingIndex].SortFunctions) do begin if not (TFileFunctionToProperty[FSortings[SortingIndex].SortFunctions[FunctionIndex]] <= SupportedFileProperties) then begin for i := FunctionIndex to Length(FSortings[SortingIndex].SortFunctions) - 2 do FSortings[SortingIndex].SortFunctions[i] := FSortings[SortingIndex].SortFunctions[i+1]; SetLength(FSortings[SortingIndex].SortFunctions, Length(FSortings[SortingIndex].SortFunctions) - 1); end else Inc(FunctionIndex); end; if Length(FSortings[SortingIndex].SortFunctions) = 0 then begin for i := SortingIndex to Length(FSortings) - 2 do FSortings[i] := FSortings[i+1]; SetLength(FSortings, Length(FSortings) - 1); end else Inc(SortingIndex); end; end; class function TBaseSorter.Compare(const FileSorting: TFileSorting; File1, File2: TFile): Integer; var i: Integer; bNegative: Boolean; begin Result := 0; case FileSorting.SortDirection of sdAscending: bNegative := False; sdDescending: bNegative := True; else Exit; end; for i := 0 to Length(FileSorting.SortFunctions) - 1 do begin //------------------------------------------------------ // Only DC internal functions supported. case FileSorting.SortFunctions[i] of fsfName: Result := ICompareByName(File1, File2, bNegative); fsfExtension: Result := ICompareByExt(File1, File2, bNegative); fsfSize: Result := ICompareBySize(File1, File2, bNegative); fsfAttr: Result := ICompareByAttr(File1, File2, bNegative); fsfPath: begin Result := mbCompareText(File1.Path, File2.Path); if bNegative then Result := -Result; end; fsfGroup: begin Result := mbCompareText(File1.OwnerProperty.GroupStr, File2.OwnerProperty.GroupStr); if bNegative then Result := -Result; end; fsfOwner: begin Result := mbCompareText(File1.OwnerProperty.OwnerStr, File2.OwnerProperty.OwnerStr); if bNegative then Result := -Result; end; fsfModificationTime: Result := ICompareByDate(File1.ModificationTime, File2.ModificationTime, bNegative); fsfCreationTime: Result := ICompareByDate(File1.CreationTime, File2.CreationTime, bNegative); fsfLastAccessTime: Result := ICompareByDate(File1.LastAccessTime, File2.LastAccessTime, bNegative); fsfLinkTo: begin Result := mbCompareText(File1.LinkProperty.LinkTo, File2.LinkProperty.LinkTo); if bNegative then Result := -Result; end; fsfNameNoExtension: Result := ICompareByNameNoExt(File1, File2, bNegative); fsfType: Result := mbCompareText(File1.TypeProperty.Value, File2.TypeProperty.Value); end; if Result <> 0 then Exit; end; end; { TDisplayFileSorter } constructor TDisplayFileSorter.Create(Files: TDisplayFiles; Sortings: TFileSortings); begin inherited Create(Sortings); FDisplaySortList := Files; if Assigned(FDisplaySortList) and (FDisplaySortList.Count > 0) then CheckSupportedProperties(FDisplaySortList[0].FSFile.SupportedProperties); end; constructor TDisplayFileSorter.Create(FilesToInsert, AlreadySortedFiles: TDisplayFiles; const Sortings: TFileSortings); begin inherited Create(Sortings); FFilesToInsert := FilesToInsert; FDisplaySortList := AlreadySortedFiles; if Assigned(FDisplaySortList) and (FDisplaySortList.Count > 0) and Assigned(FFilesToInsert) and (FFilesToInsert.Count > 0) then begin CheckSupportedProperties(FDisplaySortList[0].FSFile.SupportedProperties); CheckSupportedProperties(FFilesToInsert[0].FSFile.SupportedProperties); end; end; constructor TDisplayFileSorter.Create(FileToInsert: TDisplayFile; AlreadySortedFiles: TDisplayFiles; const Sortings: TFileSortings; ASequentialSearch: Boolean); begin inherited Create(Sortings); FFileToInsert := FileToInsert; FDisplaySortList := AlreadySortedFiles; FSequentialSearch := ASequentialSearch; if Assigned(FDisplaySortList) and (FDisplaySortList.Count > 0) and Assigned(FFileToInsert) then begin CheckSupportedProperties(FDisplaySortList[0].FSFile.SupportedProperties); CheckSupportedProperties(FFileToInsert.FSFile.SupportedProperties); end; end; constructor TDisplayFileSorter.Create(IndexToResort: Integer; SortedFiles: TDisplayFiles; const Sortings: TFileSortings); begin inherited Create(Sortings); FFileIndexToResort := IndexToResort; FResortSingle := True; FDisplaySortList := SortedFiles; if Assigned(FDisplaySortList) and (FDisplaySortList.Count > 0) then CheckSupportedProperties(FDisplaySortList[0].FSFile.SupportedProperties); end; procedure TDisplayFileSorter.Sort; begin {$IFDEF fileSortingTime} fileSortingTimer := Now; {$ENDIF} // Restore this check when independent SortFunctions are implemented and sorting // by directory condition (gSortFolderMode <> sfmSortLikeFile) is removed from // the sorter and moved into Sortings. //if Length(FSortings) > 0 then begin if FResortSingle and Assigned(FDisplaySortList) then begin ResortSingle(FFileIndexToResort, FDisplaySortList); {$IFDEF fileSortingTime} DCDebug('FileSorter: Resort time: ', IntToStr(DateTimeToTimeStamp(Now - fileSortingTimer).Time)); {$ENDIF} end else if Assigned(FFileToInsert) and Assigned(FDisplaySortList) then begin InsertSort(FFileToInsert, FDisplaySortList); {$IFDEF fileSortingTime} DCDebug('FileSorter: Insert sort time: ', IntToStr(DateTimeToTimeStamp(Now - fileSortingTimer).Time)); {$ENDIF} end else if Assigned(FFilesToInsert) and Assigned(FDisplaySortList) then begin InsertSort(FFilesToInsert, FDisplaySortList); {$IFDEF fileSortingTime} DCDebug('FileSorter: Insert sort time: ', IntToStr(DateTimeToTimeStamp(Now - fileSortingTimer).Time)); {$ENDIF} end else if Assigned(FDisplaySortList) and (FDisplaySortList.Count > 1) then begin QuickSort(FDisplaySortList.List.List, 0, FDisplaySortList.List.Count-1); {$IFDEF fileSortingTime} DCDebug('FileSorter: Sorting DisplayFiles time: ', IntToStr(DateTimeToTimeStamp(Now - fileSortingTimer).Time)); {$ENDIF} end; end; end; class procedure TDisplayFileSorter.InsertSort(FilesToInsert, AlreadySortedFiles: TDisplayFiles; const ASortings: TFileSortings); var FileListSorter: TDisplayFileSorter; begin FileListSorter := TDisplayFileSorter.Create(FilesToInsert, AlreadySortedFiles, ASortings); try FileListSorter.Sort; finally FreeAndNil(FileListSorter); end; end; class procedure TDisplayFileSorter.InsertSort(FileToInsert: TDisplayFile; AlreadySortedFiles: TDisplayFiles; const ASortings: TFileSortings; ASequentialSearch: Boolean); var FileListSorter: TDisplayFileSorter; begin FileListSorter := TDisplayFileSorter.Create(FileToInsert, AlreadySortedFiles, ASortings, ASequentialSearch); try FileListSorter.Sort; finally FreeAndNil(FileListSorter); end; end; class procedure TDisplayFileSorter.ResortSingle(IndexToResort: Integer; SortedFiles: TDisplayFiles; const ASortings: TFileSortings); var FileListSorter: TDisplayFileSorter; begin FileListSorter := TDisplayFileSorter.Create(IndexToResort, SortedFiles, ASortings); try FileListSorter.Sort; finally FreeAndNil(FileListSorter); end; end; class procedure TDisplayFileSorter.Sort(FilesToSort: TDisplayFiles; const ASortings: TFileSortings); var FileListSorter: TDisplayFileSorter; begin FileListSorter := TDisplayFileSorter.Create(FilesToSort, ASortings); try FileListSorter.Sort; finally FreeAndNil(FileListSorter); end; end; procedure TDisplayFileSorter.BinaryInsertSingle(FileToInsert: TDisplayFile; List: TFPList; L, R: Longint); var CompareRes: Integer; FoundIndex: Longint; begin if List.Count = 0 then FoundIndex := 0 else begin CompareRes := BinarySearch(FileToInsert, List.List, L, R, FoundIndex); if CompareRes > 0 then Inc(FoundIndex); // Insert after because it's greater than FoundIndex item. end; List.Insert(FoundIndex, FileToInsert); end; procedure TDisplayFileSorter.BinaryResortSingle(UnsortedIndex: Integer; PList: PPointerList; L, R: Longint); var CompareRes: Integer; FoundIndex: Longint; begin CompareRes := BinarySearch(PList^[UnsortedIndex], PList, L, R, FoundIndex); if CompareRes = 0 then TFPListFastMove(UnsortedIndex, FoundIndex, PList) else begin if UnsortedIndex < FoundIndex then begin if CompareRes < 0 then Dec(FoundIndex); end else begin if CompareRes > 0 then Inc(FoundIndex); end; TFPListFastMove(UnsortedIndex, FoundIndex, PList); end; end; function TDisplayFileSorter.BinarySearch( DisplayFile: Pointer; PList: PPointerList; L, R: Longint; out FoundIndex: Longint): Integer; var I, J, K : Longint; begin I := L; J := R; repeat K := (I + J) div 2; Result := MultiCompare(DisplayFile, PList^[K]); if Result < 0 then J := K - 1 else if Result > 0 then I := K + 1 else Break; until I > J; FoundIndex := K; end; procedure TDisplayFileSorter.InsertSort(FilesToInsert, AlreadySortedFiles: TDisplayFiles); var i, j: PtrInt; L, R, FoundIndex: Longint; Psrc: PPointerList; Pcur: Pointer; SearchResult: Integer; DestList: TFPList; begin if FFilesToInsert.Count > 0 then begin if FFilesToInsert.Count = 1 then begin InsertSort(FFilesToInsert[0], AlreadySortedFiles); Exit; end else begin // First sort the files to insert of which there should be only a small number. QuickSort(FilesToInsert.List.List, 0, FilesToInsert.List.Count-1); end; Psrc := FilesToInsert.List.List; DestList := AlreadySortedFiles.List; L := 0; R := DestList.Count - 1; if R < 0 then begin // Add remaining files at the end. for j := 0 to FilesToInsert.Count - 1 do DestList.Add(Psrc^[j]); end else begin FoundIndex := 0; for i := 0 to FilesToInsert.Count - 1 do begin Pcur := Psrc^[i]; SearchResult := BinarySearch(Pcur, DestList.List, L, R, FoundIndex); // Insert Pcur after FoundIndex if it was greater. if SearchResult > 0 then Inc(FoundIndex); if FoundIndex > R then begin // Add remaining files at the end. for j := i to FilesToInsert.Count - 1 do DestList.Add(Psrc^[j]); Break; end; DestList.Insert(FoundIndex, Pcur); L := FoundIndex + 1; // Next time start searching from the next element after the one just inserted. Inc(R); // Number of elements has increased so also increase right boundary. end; end; end; end; procedure TDisplayFileSorter.InsertSort(FileToInsert: TDisplayFile; AlreadySortedFiles: TDisplayFiles); begin if FSequentialSearch then SequentialInsertSingle(FileToInsert, AlreadySortedFiles.List) else BinaryInsertSingle(FileToInsert, AlreadySortedFiles.List, 0, AlreadySortedFiles.Count - 1); end; function TDisplayFileSorter.MultiCompare(item1, item2: Pointer): Integer; var i : Integer; begin Result := 0; if item1 = item2 then Exit; // Put directories first. if (gSortFolderMode <> sfmSortLikeFile) then begin Result := ICompareByDirectory(TDisplayFile(item1).FSFile, TDisplayFile(item2).FSFile, False); // Ascending if Result <> 0 then Exit; end; for i := 0 to Length(FSortings) - 1 do begin Result := Compare(FSortings[i], TDisplayFile(item1).FSFile, TDisplayFile(item2).FSFile); if Result <> 0 then Exit; end; end; procedure TDisplayFileSorter.QuickSort(FList: PPointerList; L, R: Longint); var I, J : Longint; P, Q : Pointer; begin repeat I := L; J := R; P := FList^[ (L + R) div 2 ]; repeat while MultiCompare(P, FList^[i]) > 0 do I := I + 1; while MultiCompare(P, FList^[J]) < 0 do J := J - 1; If I <= J then begin Q := FList^[I]; Flist^[I] := FList^[J]; FList^[J] := Q; I := I + 1; J := J - 1; end; until I > J; if L < J then QuickSort(FList, L, J); L := I; until I >= R; end; procedure TDisplayFileSorter.ResortSingle(IndexToResort: Integer; SortedFiles: TDisplayFiles); var PUnsorted: Pointer; PSorted: PPointerList; begin PSorted := SortedFiles.List.List; PUnsorted := PSorted^[IndexToResort]; // The element at IndexToResort must either be moved left or right, // or should stay where it is. if (IndexToResort > 0) and (MultiCompare(PUnsorted, PSorted^[IndexToResort - 1]) < 0) then begin if IndexToResort = 1 then SortedFiles.List.Exchange(IndexToResort, IndexToResort - 1) else BinaryResortSingle(IndexToResort, PSorted, 0, IndexToResort - 1); end else if (IndexToResort < SortedFiles.List.Count - 1) and (MultiCompare(PUnsorted, PSorted^[IndexToResort + 1]) > 0) then begin if IndexToResort = SortedFiles.List.Count - 2 then SortedFiles.List.Exchange(IndexToResort, IndexToResort + 1) else BinaryResortSingle(IndexToResort, PSorted, IndexToResort + 1, SortedFiles.List.Count - 1); end; end; procedure TDisplayFileSorter.SequentialInsertSingle(FileToInsert: TDisplayFile; List: TFPList); var SortedIndex: PtrInt; Pdst: PPointerList; begin SortedIndex := 0; Pdst := List.List; while (SortedIndex < List.Count) and (MultiCompare(FileToInsert, Pdst^[SortedIndex]) > 0) do Inc(SortedIndex); List.Insert(SortedIndex, FileToInsert); end; { TFileSorter } constructor TFileSorter.Create(Files: TFiles; Sortings: TFileSortings); begin inherited Create(Sortings); FSortList := Files; if Assigned(FSortList) and (FSortList.Count > 0) then CheckSupportedProperties(FSortList.Items[0].SupportedProperties); end; procedure TFileSorter.Sort; begin {$IFDEF fileSortingTime} fileSortingTimer := Now; {$ENDIF} // Restore this check when independent SortFunctions are implemented and sorting // by directory condition (gSortFolderMode <> sfmSortLikeFile) is removed from // the sorter and moved into Sortings. //if Length(FSortings) > 0 then begin if Assigned(FSortList) and (FSortList.Count > 1) then begin QuickSort(FSortList.List.List, 0, FSortList.List.Count-1); {$IFDEF fileSortingTime} DCDebug('FileSorter: Sorting FSFiles time: ', IntToStr(DateTimeToTimeStamp(Now - fileSortingTimer).Time)); {$ENDIF} end; end; end; class procedure TFileSorter.Sort(FilesToSort: TFiles; const ASortings: TFileSortings); var FileListSorter: TFileSorter; begin FileListSorter := TFileSorter.Create(FilesToSort, ASortings); try FileListSorter.Sort; finally FreeAndNil(FileListSorter); end; end; { Return Values for ICompareByxxxx function > 0 (positive) Item1 is greater than Item2 0 Item1 is equal to Item2 < 0 (negative) Item1 is less than Item2 } { This function is simples support of sorting directory (handle uglobs.gDirSortFirst) Result is 0 if both parametres is directory and equal or not a directory (both). Else return +/- as ICompare**** } function TFileSorter.MultiCompare(item1, item2: Pointer):Integer; var i : Integer; begin Result := 0; if item1 = item2 then Exit; // Put directories first. if (gSortFolderMode <> sfmSortLikeFile) then begin Result := ICompareByDirectory(TFile(item1), TFile(item2), False); // Ascending if Result <> 0 then Exit; end; for i := 0 to Length(FSortings) - 1 do begin Result := Compare(FSortings[i], TFile(item1), TFile(item2)); if Result <> 0 then Exit; end; end; // From FPC: lists.inc. procedure TFileSorter.QuickSort(FList: PPointerList; L, R : Longint); var I, J : Longint; P, Q : Pointer; begin repeat I := L; J := R; P := FList^[ (L + R) div 2 ]; repeat while MultiCompare(P, FList^[i]) > 0 do I := I + 1; while MultiCompare(P, FList^[J]) < 0 do J := J - 1; If I <= J then begin Q := FList^[I]; Flist^[I] := FList^[J]; FList^[J] := Q; I := I + 1; J := J - 1; end; until I > J; if L < J then QuickSort(FList, L, J); L := I; until I >= R; end; end. doublecmd-0.5.8/src/fsymlink.lrt0000644000175000017500000000035112023046500015643 0ustar alexxalexxTFRMSYMLINK.CAPTION=Create symbolic link TFRMSYMLINK.LBLEXISTINGFILE.CAPTION=&Destination that the link will point to TFRMSYMLINK.LBLLINKTOCREATE.CAPTION=&Link name TFRMSYMLINK.BTNOK.CAPTION=&OK TFRMSYMLINK.BTNCANCEL.CAPTION=&Cancel doublecmd-0.5.8/src/fattributesedit.pas0000644000175000017500000001432211740433676017221 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Graphic control that allows choosing file attributes. Copyright (C) 2010 Przemysław Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fAttributesEdit; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, ExtCtrls, StdCtrls, Buttons; type { TfrmAttributesEdit } TfrmAttributesEdit = class(TForm) btnOk: TBitBtn; btnCancel: TBitBtn; btnReset: TButton; cbExecGroup: TCheckBox; cbExecOther: TCheckBox; cbExecOwner: TCheckBox; cbReadGroup: TCheckBox; cbReadOther: TCheckBox; cbReadOwner: TCheckBox; cbSgid: TCheckBox; cbSticky: TCheckBox; cbSuid: TCheckBox; cbWriteGroup: TCheckBox; cbWriteOther: TCheckBox; cbWriteOwner: TCheckBox; cbDirectory: TCheckBox; cbSymlink: TCheckBox; cbCompressed: TCheckBox; cbEncrypted: TCheckBox; cbTemporary: TCheckBox; cbSparse: TCheckBox; cbArchive: TCheckBox; cbHidden: TCheckBox; cbReadOnly: TCheckBox; cbSystem: TCheckBox; edtTextAttrs: TEdit; gbWinGeneral: TGroupBox; gbNtfsAttributes: TGroupBox; lblAttrBitsStr: TLabel; lblAttrGroupStr: TLabel; lblAttrOtherStr: TLabel; lblAttrOwnerStr: TLabel; lblTextAttrs: TLabel; lblExec: TLabel; lblRead: TLabel; lblWrite: TLabel; pnlTextAttrs: TPanel; pnlTopAttrs: TPanel; pnlUnixAttrs: TPanel; pnlWinAttrs: TPanel; pnlButtons: TPanel; procedure btnCancelClick(Sender: TObject); procedure btnOkClick(Sender: TObject); procedure btnResetClick(Sender: TObject); procedure cbAttrCheckBoxChanged(Sender: TObject); procedure cbAttrCheckBoxClicked(Sender: TObject); private FOnOk: TNotifyEvent; FUpdatingControls: Boolean; function GetAttrsAsText: String; procedure UpdateText; function GetCheckStr(CheckBox: TCheckBox; AttrStr: String): String; public constructor Create(TheOwner: TComponent); override; procedure Reset; property OnOk: TNotifyEvent read FOnOk write FOnOk; property AttrsAsText: String read GetAttrsAsText; end; implementation {$R *.lfm} procedure TfrmAttributesEdit.btnOkClick(Sender: TObject); begin if Assigned(FOnOk) then FOnOk(Self); Close; end; procedure TfrmAttributesEdit.btnCancelClick(Sender: TObject); begin Close; end; procedure TfrmAttributesEdit.btnResetClick(Sender: TObject); begin Reset; end; procedure TfrmAttributesEdit.cbAttrCheckBoxChanged(Sender: TObject); begin // Note: OnChange may work incorrectly with tri-state checkboxes, // so OnClick is also used. UpdateText; end; procedure TfrmAttributesEdit.cbAttrCheckBoxClicked(Sender: TObject); begin UpdateText; end; constructor TfrmAttributesEdit.Create(TheOwner: TComponent); begin FOnOk := nil; FUpdatingControls := False; inherited Create(TheOwner); {$IF DEFINED(MSWINDOWS)} pnlWinAttrs.Visible := True; {$ELSEIF DEFINED(UNIX)} pnlUnixAttrs.Visible := True; {$ENDIF} end; procedure TfrmAttributesEdit.Reset; begin FUpdatingControls := True; cbDirectory.State := cbGrayed; cbSymlink.State := cbGrayed; cbReadOwner.State := cbGrayed; cbWriteOwner.State := cbGrayed; cbExecOwner.State := cbGrayed; cbReadGroup.State := cbGrayed; cbWriteGroup.State := cbGrayed; cbExecGroup.State := cbGrayed; cbReadOther.State := cbGrayed; cbWriteOther.State := cbGrayed; cbExecOther.State := cbGrayed; cbSuid.State := cbGrayed; cbSgid.State := cbGrayed; cbSticky.State := cbGrayed; cbArchive.State := cbGrayed; cbReadOnly.State := cbGrayed; cbHidden.State := cbGrayed; cbSystem.State := cbGrayed; cbCompressed.State := cbGrayed; cbEncrypted.State := cbGrayed; cbTemporary.State := cbGrayed; cbSparse.State := cbGrayed; edtTextAttrs.Text := ''; edtTextAttrs.Text := ''; FUpdatingControls := False; end; function TfrmAttributesEdit.GetAttrsAsText: String; begin Result := edtTextAttrs.Text; end; procedure TfrmAttributesEdit.UpdateText; var s: string = ''; begin if not FUpdatingControls then begin FUpdatingControls := True; s := s + GetCheckStr(cbDirectory, 'd'); s := s + GetCheckStr(cbSymlink, 'l'); if pnlUnixAttrs.Visible then begin s := s + GetCheckStr(cbReadOwner, 'ur'); s := s + GetCheckStr(cbWriteOwner, 'uw'); s := s + GetCheckStr(cbExecOwner, 'ux'); s := s + GetCheckStr(cbReadGroup, 'gr'); s := s + GetCheckStr(cbWriteGroup, 'gw'); s := s + GetCheckStr(cbExecGroup, 'gx'); s := s + GetCheckStr(cbReadOther, 'or'); s := s + GetCheckStr(cbWriteOther, 'ow'); s := s + GetCheckStr(cbExecOther, 'ox'); s := s + GetCheckStr(cbSuid, 'us'); s := s + GetCheckStr(cbSgid, 'gs'); s := s + GetCheckStr(cbSticky, 'sb'); end; if pnlWinAttrs.Visible then begin s := s + GetCheckStr(cbArchive, 'a'); s := s + GetCheckStr(cbReadOnly, 'r'); s := s + GetCheckStr(cbHidden, 'h'); s := s + GetCheckStr(cbSystem, 's'); s := s + GetCheckStr(cbCompressed, 'c'); s := s + GetCheckStr(cbEncrypted, 'e'); s := s + GetCheckStr(cbTemporary, 't'); s := s + GetCheckStr(cbSparse, 's'); end; edtTextAttrs.Text := s; FUpdatingControls := False; end; end; function TfrmAttributesEdit.GetCheckStr(CheckBox: TCheckBox; AttrStr: String): String; begin case CheckBox.State of cbChecked: Result := AttrStr + '+'; cbUnchecked: Result := AttrStr + '-'; else Result := ''; end; end; end. doublecmd-0.5.8/src/fdescredit.lfm0000644000175000017500000000571012023046500016104 0ustar alexxalexxobject frmDescrEdit: TfrmDescrEdit Left = 290 Height = 300 Top = 175 Width = 400 ActiveControl = memDescr BorderIcons = [biSystemMenu, biMaximize] Caption = 'File/folder comment' ClientHeight = 300 ClientWidth = 400 OnCreate = FormCreate Position = poScreenCenter LCLVersion = '1.1' object lblEditCommentFor: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner Left = 12 Height = 18 Top = 12 Width = 115 BorderSpacing.Left = 12 BorderSpacing.Top = 12 Caption = 'E&dit comment for:' FocusControl = memDescr ParentColor = False end object lblEncoding: TLabel AnchorSideTop.Control = cbEncoding AnchorSideTop.Side = asrCenter AnchorSideRight.Control = cbEncoding Left = 214 Height = 18 Top = 216 Width = 62 Anchors = [akTop, akRight] BorderSpacing.Right = 12 Caption = '&Encoding:' FocusControl = cbEncoding ParentColor = False end object lblFileName: TLabel AnchorSideLeft.Control = lblEditCommentFor AnchorSideTop.Control = lblEditCommentFor AnchorSideTop.Side = asrBottom Left = 12 Height = 18 Top = 36 Width = 27 BorderSpacing.Top = 6 Caption = '???' Font.Style = [fsBold] ParentColor = False ParentFont = False end object memDescr: TMemo AnchorSideLeft.Control = Owner AnchorSideTop.Control = lblFileName AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = cbEncoding Left = 12 Height = 136 Top = 62 Width = 376 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 12 BorderSpacing.Top = 8 BorderSpacing.Right = 12 BorderSpacing.Bottom = 12 TabOrder = 0 end object cbEncoding: TComboBox AnchorSideTop.Side = asrBottom AnchorSideRight.Control = memDescr AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = btnCancel Left = 288 Height = 30 Top = 210 Width = 100 Anchors = [akRight, akBottom] BorderSpacing.Bottom = 12 ItemHeight = 0 OnChange = cbEncodingChange Style = csDropDownList TabOrder = 1 end object btnOK: TBitBtn AnchorSideTop.Control = btnCancel AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnCancel Left = 202 Height = 30 Top = 252 Width = 90 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = '&OK' Default = True Kind = bkOK ModalResult = 1 TabOrder = 2 end object btnCancel: TBitBtn AnchorSideTop.Side = asrBottom AnchorSideRight.Control = cbEncoding AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 298 Height = 30 Top = 252 Width = 90 Anchors = [akRight, akBottom] BorderSpacing.Bottom = 18 Cancel = True Caption = '&Cancel' Kind = bkCancel ModalResult = 2 TabOrder = 3 end end doublecmd-0.5.8/src/fchecksumverify.lfm0000644000175000017500000000225112045446211017171 0ustar alexxalexxobject frmCheckSumVerify: TfrmCheckSumVerify Left = 290 Height = 300 Top = 175 Width = 400 Caption = 'Verify check sum...' ClientHeight = 300 ClientWidth = 400 Constraints.MinHeight = 200 Constraints.MinWidth = 300 OnClose = FormClose Position = poScreenCenter ShowInTaskBar = stAlways LCLVersion = '1.0.1.3' object mmCheckSumVerify: TMemo AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = btnClose Left = 10 Height = 240 Top = 10 Width = 380 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 10 BorderSpacing.Top = 10 BorderSpacing.Right = 10 BorderSpacing.Bottom = 10 ReadOnly = True TabOrder = 0 end object btnClose: TBitBtn AnchorSideLeft.Control = mmCheckSumVerify AnchorSideLeft.Side = asrCenter AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 163 Height = 30 Top = 260 Width = 100 Anchors = [akLeft, akBottom] BorderSpacing.Bottom = 10 Caption = '&Close' Kind = bkClose TabOrder = 1 end end doublecmd-0.5.8/src/fdescredit.lrt0000644000175000017500000000040012023046500016116 0ustar alexxalexxTFRMDESCREDIT.CAPTION=File/folder comment TFRMDESCREDIT.LBLEDITCOMMENTFOR.CAPTION=E&dit comment for: TFRMDESCREDIT.LBLENCODING.CAPTION=&Encoding: TFRMDESCREDIT.LBLFILENAME.CAPTION=??? TFRMDESCREDIT.BTNOK.CAPTION=&OK TFRMDESCREDIT.BTNCANCEL.CAPTION=&Cancel doublecmd-0.5.8/src/fmain.lrt0000644000175000017500000002331312117125155015114 0ustar alexxalexxTFRMMAIN.CAPTION=Double Commander TFRMMAIN.BTNLEFTHOME.HINT=Go to home directory TFRMMAIN.BTNLEFTHOME.CAPTION=~ TFRMMAIN.BTNLEFTUP.HINT=Go to parent directory TFRMMAIN.BTNLEFTUP.CAPTION=.. TFRMMAIN.BTNLEFTROOT.HINT=Go to root directory TFRMMAIN.BTNLEFTROOT.CAPTION=/ TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.HINT=Directory hotlist TFRMMAIN.BTNLEFTDIRECTORYHOTLIST.CAPTION=* TFRMMAIN.BTNLEFTEQUALRIGHT.HINT=Show current directory of the right panel in the left panel TFRMMAIN.BTNLEFTEQUALRIGHT.CAPTION=< TFRMMAIN.BTNRIGHTHOME.CAPTION=~ TFRMMAIN.BTNRIGHTUP.CAPTION=.. TFRMMAIN.BTNRIGHTROOT.CAPTION=/ TFRMMAIN.BTNRIGHTDIRECTORYHOTLIST.CAPTION=* TFRMMAIN.BTNRIGHTEQUALLEFT.HINT=Show current directory of the left panel in the right panel TFRMMAIN.BTNRIGHTEQUALLEFT.CAPTION=> TFRMMAIN.LBLCOMMANDPATH.CAPTION=Path TFRMMAIN.BTNF8.CAPTION=Delete TFRMMAIN.BTNF9.CAPTION=Terminal TFRMMAIN.BTNF10.CAPTION=Exit TFRMMAIN.MNUFILES.CAPTION=&Files TFRMMAIN.MILINE1.CAPTION=- TFRMMAIN.MILINE2.CAPTION=- TFRMMAIN.MILINE4.CAPTION=- TFRMMAIN.MNUMARK.CAPTION=&Mark TFRMMAIN.MILINE47.CAPTION=- TFRMMAIN.MILINE5.CAPTION=- TFRMMAIN.MILINE37.CAPTION=- TFRMMAIN.MNUCMD.CAPTION=&Commands TFRMMAIN.MILINE6.CAPTION=- TFRMMAIN.MILINE9.CAPTION=- TFRMMAIN.MILINE22.CAPTION=- TFRMMAIN.MNUNETWORK.CAPTION=Network TFRMMAIN.MNUTABS.CAPTION=&Tabs TFRMMAIN.MILINE15.CAPTION=- TFRMMAIN.MILINE16.CAPTION=- TFRMMAIN.MNUTABOPTIONS.CAPTION=&Options TFRMMAIN.MILINE17.CAPTION=- TFRMMAIN.MNUSHOW.CAPTION=&Show TFRMMAIN.MILINE33.CAPTION=- TFRMMAIN.MILINE32.CAPTION=- TFRMMAIN.MILINE7.CAPTION=- TFRMMAIN.MILINE3.CAPTION=- TFRMMAIN.MILINE20.CAPTION=- TFRMMAIN.MILINE13.CAPTION=- TFRMMAIN.MNUCONFIG.CAPTION=C&onfiguration TFRMMAIN.MNUHELP.CAPTION=&Help TFRMMAIN.MILINE18.CAPTION=- TFRMMAIN.MNUALLOPERSTART.CAPTION=Start TFRMMAIN.MNUALLOPERPAUSE.CAPTION=|| TFRMMAIN.MNUALLOPERSTOP.CAPTION=Cancel TFRMMAIN.ACTEXIT.CAPTION=E&xit TFRMMAIN.ACTVIEW.CAPTION=View TFRMMAIN.ACTEDIT.CAPTION=Edit TFRMMAIN.ACTCOPY.CAPTION=Copy TFRMMAIN.ACTRENAME.CAPTION=Move TFRMMAIN.ACTMAKEDIR.CAPTION=MakeDir TFRMMAIN.ACTDELETE.CAPTION=Delete TFRMMAIN.ACTABOUT.CAPTION=&About TFRMMAIN.ACTSHOWSYSFILES.CAPTION=Show &Hidden/System Files TFRMMAIN.ACTOPTIONS.CAPTION=&Options... TFRMMAIN.ACTCOMPARECONTENTS.CAPTION=Compare by &Contents TFRMMAIN.ACTSHOWMAINMENU.CAPTION=Menu TFRMMAIN.ACTREFRESH.CAPTION=&Refresh TFRMMAIN.ACTSEARCH.CAPTION=&Search... TFRMMAIN.ACTDIRHOTLIST.CAPTION=Directory &Hotlist TFRMMAIN.ACTMARKMARKALL.CAPTION=&Select All TFRMMAIN.ACTMARKINVERT.CAPTION=&Invert Selection TFRMMAIN.ACTMARKUNMARKALL.CAPTION=&Unselect All TFRMMAIN.ACTMARKPLUS.CAPTION=Select a &Group... TFRMMAIN.ACTMARKMINUS.CAPTION=Unselect a Gro&up... TFRMMAIN.ACTSYMLINK.CAPTION=Create Symbolic &Link... TFRMMAIN.ACTHARDLINK.CAPTION=Create &Hard Link... TFRMMAIN.ACTREVERSEORDER.CAPTION=Re&verse Order TFRMMAIN.ACTSORTBYNAME.CAPTION=Sort by &Name TFRMMAIN.ACTSORTBYEXT.CAPTION=Sort by &Extension TFRMMAIN.ACTSORTBYSIZE.CAPTION=Sort by &Size TFRMMAIN.ACTSORTBYDATE.CAPTION=Sort by &Date TFRMMAIN.ACTSORTBYATTR.CAPTION=Sort by &Attributes TFRMMAIN.ACTMULTIRENAME.CAPTION=Multi &Rename Tool TFRMMAIN.ACTCOPYSAMEPANEL.CAPTION=Copy to same panel TFRMMAIN.ACTRENAMEONLY.CAPTION=Rename TFRMMAIN.ACTEDITNEW.CAPTION=Edit new file TFRMMAIN.ACTDIRHISTORY.CAPTION=Directory history TFRMMAIN.ACTSHOWCMDLINEHISTORY.CAPTION=Show command line history TFRMMAIN.ACTRUNTERM.CAPTION=Run &Terminal TFRMMAIN.ACTCALCULATESPACE.CAPTION=Calculate &Occupied Space TFRMMAIN.ACTFILEPROPERTIES.CAPTION=Show &File Properties TFRMMAIN.ACTFILELINKER.CAPTION=Com&bine Files... TFRMMAIN.ACTFILESPLITER.CAPTION=Spl&it File... TFRMMAIN.ACTNEWTAB.CAPTION=&New Tab TFRMMAIN.ACTPACKFILES.CAPTION=&Pack Files... TFRMMAIN.ACTEXTRACTFILES.CAPTION=&Extract Files... TFRMMAIN.ACTOPENVIRTUALFILESYSTEMLIST.CAPTION=Open &VFS List TFRMMAIN.ACTLEFTOPENDRIVES.CAPTION=Open left drive list TFRMMAIN.ACTRIGHTOPENDRIVES.CAPTION=Open right drive list TFRMMAIN.ACTADDPATHTOCMDLINE.CAPTION=Copy path to command line TFRMMAIN.ACTFOCUSCMDLINE.CAPTION=Focus command line TFRMMAIN.ACTTRANSFERLEFT.CAPTION=Transfer dir under cursor to left window TFRMMAIN.ACTTRANSFERRIGHT.CAPTION=Transfer dir under cursor to right window TFRMMAIN.ACTCONTEXTMENU.CAPTION=Show context menu TFRMMAIN.ACTOPENARCHIVE.CAPTION=Try open archive TFRMMAIN.ACTSHOWBUTTONMENU.CAPTION=Show button menu TFRMMAIN.ACTQUICKSEARCH.CAPTION=Quick search TFRMMAIN.ACTFILEASSOC.CAPTION=File &Associations... TFRMMAIN.ACTOPEN.CAPTION=Open TFRMMAIN.ACTCOPYNAMESTOCLIP.CAPTION=Copy &Filename(s) to Clipboard TFRMMAIN.ACTCUTTOCLIPBOARD.CAPTION=Cu&t TFRMMAIN.ACTCOPYTOCLIPBOARD.CAPTION=&Copy TFRMMAIN.ACTPASTEFROMCLIPBOARD.CAPTION=&Paste TFRMMAIN.ACTCOPYFULLNAMESTOCLIP.CAPTION=Copy Filename(s) with Full &Path TFRMMAIN.ACTTARGETEQUALSOURCE.CAPTION=Target &= Source TFRMMAIN.ACTEXCHANGE.CAPTION=Swap &Panels TFRMMAIN.ACTWIPE.CAPTION=Wipe TFRMMAIN.ACTMARKCURRENTEXTENSION.CAPTION=Select All with the Same E&xtension TFRMMAIN.ACTUNMARKCURRENTEXTENSION.CAPTION=Unselect All with the Same Ex&tension TFRMMAIN.ACTEDITCOMMENT.CAPTION=Edit Co&mment... TFRMMAIN.ACTKEYBOARD.CAPTION=&Keyboard TFRMMAIN.ACTVISITHOMEPAGE.CAPTION=&Visit Double Commander Website TFRMMAIN.ACTHELPINDEX.CAPTION=&Contents TFRMMAIN.ACTLEFTEQUALRIGHT.CAPTION=Left &= Right TFRMMAIN.ACTRIGHTEQUALLEFT.CAPTION=Right &= Left TFRMMAIN.ACTCHANGEDIRTOROOT.CAPTION=Change directory to root TFRMMAIN.ACTCOUNTDIRCONTENT.CAPTION=Sho&w Occupied Space TFRMMAIN.ACTCHECKSUMVERIFY.CAPTION=&Verify Checksum... TFRMMAIN.ACTCHECKSUMCALC.CAPTION=Calculate Check&sum... TFRMMAIN.ACTCLEARLOGFILE.CAPTION=Clear log file TFRMMAIN.ACTCLEARLOGWINDOW.CAPTION=Clear log window TFRMMAIN.ACTMINIMIZE.CAPTION=Minimize window TFRMMAIN.ACTCHANGEDIR.CAPTION=Change directory TFRMMAIN.ACTADDFILENAMETOCMDLINE.CAPTION=Add file name to command line TFRMMAIN.ACTADDPATHANDFILENAMETOCMDLINE.CAPTION=Add path and file name to command line TFRMMAIN.ACTPANELSSPLITTERPERPOS.CAPTION=Set splitter position TFRMMAIN.ACTCOPYNOASK.CAPTION=Copy files without asking for confirmation TFRMMAIN.ACTRENAMENOASK.CAPTION=Move/Rename files without asking for confirmation TFRMMAIN.ACTQUICKFILTER.CAPTION=Quick filter TFRMMAIN.ACTSETFILEPROPERTIES.CAPTION=Change &Attributes... TFRMMAIN.ACTOPENDIRINNEWTAB.CAPTION=Open &Folder in a New Tab TFRMMAIN.ACTCLOSETAB.CAPTION=&Close Tab TFRMMAIN.ACTCLOSEALLTABS.CAPTION=Close &All Tabs TFRMMAIN.ACTSETTABOPTIONNORMAL.CAPTION=&Normal TFRMMAIN.ACTSETTABOPTIONPATHLOCKED.CAPTION=&Locked TFRMMAIN.ACTSETTABOPTIONPATHRESETS.CAPTION=Locked with &Directory Changes Allowed TFRMMAIN.ACTSETTABOPTIONDIRSINNEWTAB.CAPTION=Locked with Directories Opened in New &Tabs TFRMMAIN.ACTNEXTTAB.CAPTION=Switch to Nex&t Tab TFRMMAIN.ACTPREVTAB.CAPTION=Switch to &Previous Tab TFRMMAIN.ACTOPENBAR.CAPTION=Open bar file TFRMMAIN.ACTQUICKVIEW.CAPTION=&Quick View Panel TFRMMAIN.ACTTESTARCHIVE.CAPTION=&Test Archive(s) TFRMMAIN.ACTSWITCHIGNORELIST.CAPTION=Enable/disable ignore list file to not show file names TFRMMAIN.ACTRESTORESELECTION.CAPTION=&Restore Selection TFRMMAIN.ACTSAVESELECTION.CAPTION=Sa&ve Selection TFRMMAIN.ACTSAVESELECTIONTOFILE.CAPTION=Save S&election to File... TFRMMAIN.ACTLOADSELECTIONFROMFILE.CAPTION=&Load Selection from File... TFRMMAIN.ACTLOADSELECTIONFROMCLIP.CAPTION=Load Selection from Clip&board TFRMMAIN.ACTCHANGEDIRTOPARENT.CAPTION=Change Directory To Parent TFRMMAIN.ACTEDITPATH.CAPTION=Edit path field above file list TFRMMAIN.ACTVIEWHISTORY.CAPTION=Show history of visited paths for active view TFRMMAIN.ACTVIEWHISTORYPREV.CAPTION=Go to previous entry in history TFRMMAIN.ACTVIEWHISTORYNEXT.CAPTION=Go to next entry in history TFRMMAIN.ACTNETWORKCONNECT.CAPTION=Network &Connect... TFRMMAIN.ACTNETWORKQUICKCONNECT.CAPTION=Network &Quick Connect... TFRMMAIN.ACTNETWORKDISCONNECT.CAPTION=Network &Disconnect TFRMMAIN.ACTHORIZONTALFILEPANELS.CAPTION=&Horizontal Panels Mode TFRMMAIN.ACTGOTOFIRSTFILE.CAPTION=Place cursor on first file in list TFRMMAIN.ACTGOTOLASTFILE.CAPTION=Place cursor on last file in list TFRMMAIN.ACTOPERATIONSVIEWER.CAPTION=Operations &Viewer TFRMMAIN.ACTRENAMETAB.CAPTION=&Rename Tab TFRMMAIN.ACTCOMPAREDIRECTORIES.CAPTION=Compare Directories TFRMMAIN.ACTCOMPAREDIRECTORIES.HINT=Compare Directories TFRMMAIN.ACTSHELLEXECUTE.CAPTION=Open TFRMMAIN.ACTSHELLEXECUTE.HINT=Open using system associations TFRMMAIN.ACTCMDLINENEXT.CAPTION=Next Command Line TFRMMAIN.ACTCMDLINENEXT.HINT=Set command line to next command in history TFRMMAIN.ACTCMDLINEPREV.CAPTION=Previous Command Line TFRMMAIN.ACTCMDLINEPREV.HINT=Set command line to previous command in history TFRMMAIN.ACTBRIEFVIEW.CAPTION=Brief TFRMMAIN.ACTBRIEFVIEW.HINT=Brief View TFRMMAIN.ACTCOLUMNSVIEW.CAPTION=Full TFRMMAIN.ACTCOLUMNSVIEW.HINT=Columns View TFRMMAIN.ACTTHUMBNAILSVIEW.CAPTION=Thumbnails TFRMMAIN.ACTTHUMBNAILSVIEW.HINT=Thumbnails View TFRMMAIN.TBEDIT.CAPTION=Edit TFRMMAIN.TBDELETE.CAPTION=Delete TFRMMAIN.TBCHANGEDIR.CAPTION=CD TFRMMAIN.TBSEPARATOR.CAPTION=- TFRMMAIN.TBCUT.CAPTION=Cut TFRMMAIN.TBCOPY.CAPTION=Copy TFRMMAIN.TBPASTE.CAPTION=Paste TFRMMAIN.MNUCONTEXTLINE1.CAPTION=- TFRMMAIN.MNUCONTEXTLINE2.CAPTION=- TFRMMAIN.MENUITEM2.CAPTION=- TFRMMAIN.MI2080.CAPTION=&20/80 TFRMMAIN.MI3070.CAPTION=&30/70 TFRMMAIN.MI4060.CAPTION=&40/60 TFRMMAIN.MI5050.CAPTION=&50/50 TFRMMAIN.MI6040.CAPTION=&60/40 TFRMMAIN.MI7030.CAPTION=&70/30 TFRMMAIN.MI8020.CAPTION=&80/20 TFRMMAIN.MICOPY.CAPTION=Copy... TFRMMAIN.MIMOVE.CAPTION=Move... TFRMMAIN.MIHARDLINK.CAPTION=Create link... TFRMMAIN.MISYMLINK.CAPTION=Create symlink... TFRMMAIN.MILINE12.CAPTION=- TFRMMAIN.MICANCEL.CAPTION=Cancel TFRMMAIN.MILINE14.CAPTION=- TFRMMAIN.MILINE19.CAPTION=- TFRMMAIN.MITABOPTIONS.CAPTION=Tab options TFRMMAIN.MITRAYICONRESTORE.CAPTION=Restore TFRMMAIN.MILINE8.CAPTION=- TFRMMAIN.MITRAYICONEXIT.CAPTION=E&xit TFRMMAIN.MILOGCOPY.CAPTION=Copy TFRMMAIN.MILINE24.CAPTION=- TFRMMAIN.MILOGSELECTALL.CAPTION=Select All TFRMMAIN.MILINE25.CAPTION=- TFRMMAIN.MILOGCLEAR.CAPTION=Clear TFRMMAIN.MILOGHIDE.CAPTION=Hide doublecmd-0.5.8/src/fsetfileproperties.lrt0000644000175000017500000000264112023046500017731 0ustar alexxalexxTFRMSETFILEPROPERTIES.CAPTION=Change attributes TFRMSETFILEPROPERTIES.BTNOK.CAPTION=&OK TFRMSETFILEPROPERTIES.BTNCANCEL.CAPTION=&Cancel TFRMSETFILEPROPERTIES.CHKRECURSIVE.CAPTION=Including subfolders TFRMSETFILEPROPERTIES.GBTIMESAMP.CAPTION=Timestamp properties TFRMSETFILEPROPERTIES.CHKCREATIONTIME.CAPTION=Created: TFRMSETFILEPROPERTIES.CHKLASTWRITETIME.CAPTION=Modified: TFRMSETFILEPROPERTIES.CHKLASTACCESSTIME.CAPTION=Accessed: TFRMSETFILEPROPERTIES.GBWINATTRIBUTES.CAPTION=Attributes TFRMSETFILEPROPERTIES.CHKSYSTEM.CAPTION=System TFRMSETFILEPROPERTIES.CHKHIDDEN.CAPTION=Hidden TFRMSETFILEPROPERTIES.CHKARCHIVE.CAPTION=Archive TFRMSETFILEPROPERTIES.CHKREADONLY.CAPTION=Read only TFRMSETFILEPROPERTIES.LBLATTRINFO.CAPTION=(gray field means unchanged value) TFRMSETFILEPROPERTIES.GBUNIXATTRIBUTES.CAPTION=Attributes TFRMSETFILEPROPERTIES.LBLREAD.CAPTION=Read TFRMSETFILEPROPERTIES.LBLWRITE.CAPTION=Write TFRMSETFILEPROPERTIES.LBLEXEC.CAPTION=Execute TFRMSETFILEPROPERTIES.LBLATTROWNERSTR.CAPTION=Owner TFRMSETFILEPROPERTIES.LBLATTRGROUPSTR.CAPTION=Group TFRMSETFILEPROPERTIES.LBLATTROTHERSTR.CAPTION=Other TFRMSETFILEPROPERTIES.CBSTICKY.CAPTION=Sticky TFRMSETFILEPROPERTIES.CBSGID.CAPTION=SGID TFRMSETFILEPROPERTIES.CBSUID.CAPTION=SUID TFRMSETFILEPROPERTIES.LBLATTRBITSSTR.CAPTION=Bits: TFRMSETFILEPROPERTIES.LBLOCTAL.CAPTION=Octal: TFRMSETFILEPROPERTIES.LBLATTRTEXTSTR.CAPTION=Text: TFRMSETFILEPROPERTIES.LBLATTRTEXT.CAPTION=----------- doublecmd-0.5.8/src/fileviews/0000755000175000017500000000000012257501472015277 5ustar alexxalexxdoublecmd-0.5.8/src/fileviews/uthumbfileview.pas0000644000175000017500000004542512135030027021041 0ustar alexxalexxunit uThumbFileView; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Controls, Grids, Types, DCXmlConfig, uFileSource, uOrderedFileView, uDisplayFile, uFileViewWorker, uThumbnails, uFileView, uTypes, uFileViewWithGrid, uFile; type { TFileThumbnailsRetriever } TFileThumbnailsRetriever = class(TFileViewWorker) private FWorkingFile: TDisplayFile; FWorkingUserData: Pointer; FFileList: TFVWorkerFileList; FThumbnailManager: TThumbnailManager; FUpdateFileMethod: TUpdateFileMethod; FFileSource: IFileSource; FBitmapList: TBitmapList; {en Updates file in the file view with new data from FWorkerData. It is called from GUI thread. } procedure DoUpdateFile; protected procedure Execute; override; public constructor Create(AFileSource: IFileSource; AThread: TThread; ABitmapList: TBitmapList; AUpdateFileMethod: TUpdateFileMethod; AThumbnailManager: TThumbnailManager; var AFileList: TFVWorkerFileList); reintroduce; destructor Destroy; override; end; TThumbFileView = class; { TThumbDrawGrid } TThumbDrawGrid = class(TFileViewGrid) private FThumbSize: TSize; FThumbView: TThumbFileView; FUpdateColCount: Integer; protected procedure KeyDown(var Key : Word; Shift : TShiftState); override; procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; protected procedure UpdateView; override; procedure CalculateColRowCount; override; procedure CalculateColumnWidth; override; function CellToIndex(ACol, ARow: Integer): Integer; override; procedure IndexToCell(Index: Integer; out ACol, ARow: Integer); override; public constructor Create(AOwner: TComponent; AParent: TWinControl); override; procedure DrawCell(aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); override; end; { TThumbFileView } TThumbFileView = class(TFileViewWithGrid) private FBitmapList: TBitmapList; FThumbnailManager: TThumbnailManager; procedure ThumbnailsRetrieverOnUpdate(const UpdatedFile: TDisplayFile; const UserData: Pointer); protected procedure CreateDefault(AOwner: TWinControl); override; procedure AfterChangePath; override; procedure EnsureDisplayProperties; override; function GetFileViewGridClass: TFileViewGridClass; override; function GetVisibleFilesIndexes: TRange; override; procedure ShowRenameFileEdit(aFile: TFile); override; public constructor Create(AOwner: TWinControl; AConfig: TXmlConfig; ANode: TXmlNode; AFlags: TFileViewFlags = []); override; constructor Create(AOwner: TWinControl; AFileView: TFileView; AFlags: TFileViewFlags = []); override; destructor Destroy; override; function Clone(NewParent: TWinControl): TThumbFileView; override; procedure SaveConfiguration(AConfig: TXmlConfig; ANode: TXmlNode); override; end; implementation uses LCLIntf, LCLType, LMessages, Graphics, Math, uFileSourceProperty, uGlobs, uPixMapManager; { TFileThumbnailsRetriever } procedure TFileThumbnailsRetriever.DoUpdateFile; begin if not Aborted and Assigned(FUpdateFileMethod) then FUpdateFileMethod(FWorkingFile, FWorkingUserData); end; procedure TFileThumbnailsRetriever.Execute; var I: Integer; Bitmap: TBitmap; begin for I := 0 to FFileList.Count - 1 do begin if Aborted then Exit; FWorkingFile := FFileList.Files[I]; FWorkingUserData := FFileList.Data[I]; try if FWorkingFile.Tag < 0 then begin Bitmap:= FThumbnailManager.CreatePreview(FWorkingFile.FSFile); if Assigned(Bitmap) then begin FWorkingFile.Tag := FBitmapList.Add(Bitmap); end; end; if Aborted then Exit; TThread.Synchronize(Thread, @DoUpdateFile); except on EFileNotFound do; end; end; end; constructor TFileThumbnailsRetriever.Create(AFileSource: IFileSource; AThread: TThread; ABitmapList: TBitmapList; AUpdateFileMethod: TUpdateFileMethod; AThumbnailManager: TThumbnailManager; var AFileList: TFVWorkerFileList); begin inherited Create(AThread); FWorkType := fvwtUpdate; FFileList := AFileList; AFileList := nil; FFileSource := AFileSource; FBitmapList := ABitmapList; FThumbnailManager := AThumbnailManager; FUpdateFileMethod := AUpdateFileMethod; end; destructor TFileThumbnailsRetriever.Destroy; begin FFileList.Free; inherited Destroy; end; { TThumbDrawGrid } procedure TThumbDrawGrid.KeyDown(var Key: Word; Shift: TShiftState); var SavedKey: Word; FileIndex: Integer; ACol, ARow: Integer; begin if FThumbView.IsLoadingFileList then begin FThumbView.HandleKeyDownWhenLoading(Key, Shift); Exit; end; SavedKey := Key; // Set RangeSelecting before cursor is moved. FThumbView.FRangeSelecting := (ssShift in Shift) and (SavedKey in [VK_UP, VK_DOWN, VK_HOME, VK_END, VK_PRIOR, VK_NEXT]); // Special case for selection with shift key (works like VK_INSERT) if (SavedKey in [VK_LEFT, VK_RIGHT]) and (ssShift in Shift) then FThumbView.InvertActiveFile; case Key of VK_LEFT: begin if (Col - 1 < 0) and (Row > 0) then begin MoveExtend(False, ColCount - 1, Row - 1); Key:= 0; end; end; VK_RIGHT: begin if (CellToIndex(Col + 1, Row) < 0) then begin if (Row + 1 < RowCount) then MoveExtend(False, 0, Row + 1) else begin IndexToCell(FThumbView.FFiles.Count - 1, ACol, ARow); MoveExtend(False, ACol, ARow); end; Key:= 0; end; end; VK_HOME: begin MoveExtend(False, 0, 0); Key:= 0; end; VK_END: begin IndexToCell(FThumbView.FFiles.Count - 1, ACol, ARow); MoveExtend(False, ACol, ARow); Key:= 0; end; VK_DOWN: begin if (CellToIndex(Col, Row + 1) < 0) then begin IndexToCell(FThumbView.FFiles.Count - 1, ACol, ARow); MoveExtend(False, ACol, ARow); Key:= 0; end end; end; inherited KeyDown(Key, Shift); if FThumbView.FRangeSelecting then begin FileIndex := CellToIndex(Col, Row); if FileIndex <> InvalidFileIndex then FThumbView.Selection(SavedKey, FileIndex); end; end; procedure TThumbDrawGrid.MouseMove(Shift: TShiftState; X, Y: Integer); const LastPos: Integer = 0; procedure Scroll(ScrollCode: SmallInt); var Msg: TLMVScroll; begin Msg.Msg := LM_VSCROLL; Msg.ScrollCode := ScrollCode; Msg.SmallPos := 1; // How many lines scroll Msg.ScrollBar := Handle; Dispatch(Msg); end; begin inherited MouseMove(Shift, X, Y); if DragManager.IsDragging or FThumbView.IsMouseSelecting then begin // Scroll at each 8 pixel mouse move if (Abs(LastPos - Y) > 8) then begin LastPos:= Y; if Y < DefaultRowHeight div 3 then Scroll(SB_LINEUP) else if Y > ClientHeight - DefaultRowHeight div 3 then Scroll(SB_LINEDOWN); end; end; end; procedure TThumbDrawGrid.UpdateView; var I: Integer; function CalculateDefaultRowHeight: Integer; var OldFont, NewFont: TFont; begin // Assign temporary font. OldFont := Canvas.Font; NewFont := TFont.Create; Canvas.Font := NewFont; // Search columns settings for the biggest font (in height). Canvas.Font.Name := gFonts[dcfMain].Name; Canvas.Font.Style := gFonts[dcfMain].Style; Canvas.Font.Size := gFonts[dcfMain].Size; Result := gThumbSize.cy + Canvas.GetTextHeight('Wg') + 6; // Restore old font. Canvas.Font := OldFont; FreeAndNil(NewFont); end; begin Flat := gInterfaceFlat; // Calculate row height. DefaultRowHeight := CalculateDefaultRowHeight; // Calculate column width CalculateColumnWidth; // Refresh thumbnails if (FThumbSize.cx <> gThumbSize.cx) or (FThumbSize.cy <> gThumbSize.cy) then begin FThumbSize:= gThumbSize; FThumbView.FBitmapList.Clear; if Assigned(FThumbView.FAllDisplayFiles) then begin // Clear thumbnail image index for I := 0 to FThumbView.FAllDisplayFiles.Count - 1 do FThumbView.FAllDisplayFiles[I].Tag:= -1; end; FThumbView.Notify([fvnVisibleFilePropertiesChanged]); end; end; procedure TThumbDrawGrid.CalculateColRowCount; var glw, bw, AColCount: Integer; AIndex, ACol, ARow: Integer; begin if (csDesigning in ComponentState) or (FUpdateColCount > 0) then Exit; if not Assigned(FFileView.DisplayFiles) then Exit; glw := Max(GridLineWidth, 1); bw := Max(BorderWidth, 1); BeginUpdate; Inc(FUpdateColCount); try if (Width > 0) and (DefaultColWidth > 0) then begin // Save active file index AIndex:= CellToIndex(Col, Row); AColCount := (Width - GetSystemMetrics(SM_CXVSCROLL) - glw - (2 * bw)) div (DefaultColWidth + glw); if AColCount > 0 then begin ColCount := AColCount; RowCount := (FFileView.DisplayFiles.Count + AColCount - 1) div AColCount; if ColCount > 0 then begin ARow := (Width - GetSystemMetrics(SM_CXVSCROLL) - glw - (2 * bw)) div ColCount - glw; // Update columns widths for ACol := 0 to ColCount - 1 do ColWidths[ACol]:= ARow; end; // Restore active file index IndexToCell(AIndex, ACol, ARow); MoveExtend(False, ACol, ARow); end; end; finally EndUpdate(True); Dec(FUpdateColCount); end; end; procedure TThumbDrawGrid.CalculateColumnWidth; begin DefaultColWidth:= gThumbSize.cx + 4; end; function TThumbDrawGrid.CellToIndex(ACol, ARow: Integer): Integer; begin if (ARow < 0) or (ARow >= RowCount) or (ACol < 0) or (ACol >= ColCount) then Exit(-1); Result:= ARow * ColCount + ACol; if (Result < 0) or (Result >= FFileView.DisplayFiles.Count) then Result:= -1; end; procedure TThumbDrawGrid.IndexToCell(Index: Integer; out ACol, ARow: Integer); begin if (Index < 0) or (Index >= FFileView.DisplayFiles.Count) then begin ACol:= -1; ARow:= -1; end else begin ARow:= Index div ColCount; ACol:= Index mod ColCount; end; end; constructor TThumbDrawGrid.Create(AOwner: TComponent; AParent: TWinControl); begin FThumbSize:= gThumbSize; FThumbView:= AParent as TThumbFileView; inherited Create(AOwner, AParent); end; procedure TThumbDrawGrid.DrawCell(aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); var Idx: Integer; //shared variables s: string; iTextTop: Integer; AFile: TDisplayFile; FileSourceDirectAccess: Boolean; //------------------------------------------------------ //begin subprocedures //------------------------------------------------------ procedure DrawIconCell; var X, Y: Integer; IconID: PtrInt; Bitmap: TBitmap; begin IconID := AFile.Tag; if (AFile.FSFile.IsDirectory = False) and (IconID >= 0) and (IconID < FThumbView.FBitmapList.Count) then begin Bitmap:= FThumbView.FBitmapList[IconID]; X:= aRect.Left + (aRect.Right - aRect.Left - Bitmap.Width) div 2; Y:= aRect.Top + (iTextTop - aRect.Top - Bitmap.Height) div 2; Canvas.Draw(X, Y, Bitmap); end else begin IconID := AFile.IconID; // Draw default icon if there is no icon for the file. if IconID = -1 then IconID := PixMapManager.GetDefaultIcon(AFile.FSFile); // Center icon X:= aRect.Left + (aRect.Right - aRect.Left - gIconsSize) div 2; Y:= aRect.Top + (iTextTop - aRect.Top - gIconsSize) div 2; // Draw icon for a file PixMapManager.DrawBitmap(IconID, Canvas, X, Y); end; // Draw overlay icon for a file if needed if gIconOverlays then begin PixMapManager.DrawBitmapOverlay(AFile, FileSourceDirectAccess, Canvas, aRect.Left + 2, iTextTop - gIconsSize - 2 ); end; s := AFile.DisplayStrings[0]; Y:= (ColWidths[ACol] - 4 - Canvas.TextWidth('W')); s:= FitFileName(s, Canvas, AFile.FSFile, Y); Canvas.TextOut(aRect.Left + 2, iTextTop, s); Canvas.Pen.Color:= InvertColor(gBackColor); Canvas.Frame(aRect.Left + 1, aRect.Top + 1, aRect.Right - 1, aRect.Bottom - Canvas.TextHeight('Pp') - 1); end; //of DrawIconCell //------------------------------------------------------ //end of subprocedures //------------------------------------------------------ begin Idx:= CellToIndex(aCol, aRow); if (Idx >= 0) and (FThumbView.FFiles.Count > 0) then begin AFile:= FThumbView.FFiles[Idx]; FileSourceDirectAccess:= fspDirectAccess in FFileView.FileSource.Properties; if AFile.DisplayStrings.Count = 0 then FThumbView.MakeColumnsStrings(AFile); PrepareColors(AFile, aCol, aRow, aRect, aState); iTextTop := aRect.Top + (RowHeights[aRow] - Canvas.TextHeight('Wg')); DrawIconCell; end else begin // Draw background. Canvas.Brush.Color := FThumbView.DimColor(gBackColor); Canvas.FillRect(aRect); end; DrawCellGrid(aCol, aRow, aRect, aState); DrawLines(Idx, aCol, aRow, aRect, aState); end; { TThumbFileView } procedure TThumbFileView.ThumbnailsRetrieverOnUpdate( const UpdatedFile: TDisplayFile; const UserData: Pointer); var OrigDisplayFile: TDisplayFile absolute UserData; begin if not IsReferenceValid(OrigDisplayFile) then Exit; // File does not exist anymore (reference is invalid). if UpdatedFile.Tag <> -1 then OrigDisplayFile.Tag := UpdatedFile.Tag; DoFileUpdated(OrigDisplayFile); end; procedure TThumbFileView.CreateDefault(AOwner: TWinControl); begin inherited CreateDefault(AOwner); FBitmapList:= TBitmapList.Create(True); FThumbnailManager:= TThumbnailManager.Create(gBackColor); end; procedure TThumbFileView.AfterChangePath; begin FBitmapList.Clear; inherited AfterChangePath; end; procedure TThumbFileView.EnsureDisplayProperties; var VisibleFiles: TRange; i: Integer; Bitmap: TBitmap; AFileList: TFVWorkerFileList = nil; Worker: TFileViewWorker; AFile: TDisplayFile; begin if (csDestroying in ComponentState) or (GetCurrentWorkType = fvwtCreate) or IsEmpty then Exit; if fspDirectAccess in FileSource.Properties then begin VisibleFiles := GetVisibleFilesIndexes; if not gListFilesInThread then begin for i := VisibleFiles.First to VisibleFiles.Last do begin AFile := FFiles[i]; if (AFile.Tag < 0) and (AFile.FSFile.IsDirectory = False) then begin Bitmap:= FThumbnailManager.CreatePreview(AFile.FSFile); if Assigned(Bitmap) then begin AFile.Tag := FBitmapList.Add(Bitmap); end; end; end; end else begin try for i := VisibleFiles.First to VisibleFiles.Last do begin AFile := FFiles[i]; if (AFile.Tag < 0) and (AFile.FSFile.IsDirectory = False) then begin if not Assigned(AFileList) then AFileList := TFVWorkerFileList.Create; AFileList.AddClone(AFile, AFile); end; end; if Assigned(AFileList) and (AFileList.Count > 0) then begin Worker := TFileThumbnailsRetriever.Create( FileSource, WorkersThread, FBitmapList, @ThumbnailsRetrieverOnUpdate, FThumbnailManager, AFileList); AddWorker(Worker, True); WorkersThread.QueueFunction(@Worker.StartParam); end; finally AFileList.Free; end; end; end; inherited EnsureDisplayProperties; end; function TThumbFileView.GetFileViewGridClass: TFileViewGridClass; begin Result:= TThumbDrawGrid; end; function TThumbFileView.GetVisibleFilesIndexes: TRange; begin with dgPanel do begin if (TopRow < 0) or (csLoading in ComponentState) then begin Result.First:= 0; Result.Last:= -1; end else begin Result.First:= (TopRow * VisibleColCount - 1); Result.Last:= (TopRow + VisibleRowCount + 1) * VisibleColCount - 1; if Result.First < 0 then Result.First:= 0; if Result.Last >= FFiles.Count then Result.Last:= FFiles.Count - 1; end; end; end; procedure TThumbFileView.ShowRenameFileEdit(aFile: TFile); var ARect: TRect; ALeft, ATop, AWidth, AHeight: Integer; begin if not edtRename.Visible then begin edtRename.Font.Name := gFonts[dcfMain].Name; edtRename.Font.Size := gFonts[dcfMain].Size;; edtRename.Font.Style := gFonts[dcfMain].Style; with dgPanel do begin ARect := CellRect(Col, Row); ATop := ARect.Bottom - Canvas.TextHeight('Wg') - 4; ALeft := ARect.Left; AWidth := ARect.Right - ALeft; AHeight := ARect.Bottom - ATop; end; edtRename.SetBounds(ALeft, ATop, AWidth, AHeight); end; inherited ShowRenameFileEdit(AFile); end; constructor TThumbFileView.Create(AOwner: TWinControl; AConfig: TXmlConfig; ANode: TXmlNode; AFlags: TFileViewFlags); begin inherited Create(AOwner, AConfig, ANode, AFlags); end; constructor TThumbFileView.Create(AOwner: TWinControl; AFileView: TFileView; AFlags: TFileViewFlags); var I: Integer; begin inherited Create(AOwner, AFileView, AFlags); if Assigned(FAllDisplayFiles) then begin // Clear thumbnail image index for I := 0 to FAllDisplayFiles.Count - 1 do FAllDisplayFiles[I].Tag:= -1; // Load thumbnails Notify([fvnVisibleFilePropertiesChanged]); end; end; destructor TThumbFileView.Destroy; begin inherited Destroy; FreeAndNil(FBitmapList); FreeAndNil(FThumbnailManager); end; function TThumbFileView.Clone(NewParent: TWinControl): TThumbFileView; begin Result := TThumbFileView.Create(NewParent, Self); end; procedure TThumbFileView.SaveConfiguration(AConfig: TXmlConfig; ANode: TXmlNode); begin inherited SaveConfiguration(AConfig, ANode); AConfig.SetAttr(ANode, 'Type', 'thumbnails'); end; end. doublecmd-0.5.8/src/fileviews/ubrieffileview.pas0000644000175000017500000003260012135030027021000 0ustar alexxalexxunit uBriefFileView; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Controls, LMessages, Grids, Graphics, uDisplayFile, DCXmlConfig, uTypes, uFileViewWithGrid, uFile, uFileSource; type TBriefFileView = class; { TBriefDrawGrid } TBriefDrawGrid = class(TFileViewGrid) protected FBriefView: TBriefFileView; protected procedure UpdateView; override; procedure CalculateColRowCount; override; procedure CalculateColumnWidth; override; function CellToIndex(ACol, ARow: Integer): Integer; override; procedure IndexToCell(Index: Integer; out ACol, ARow: Integer); override; protected procedure KeyDown(var Key : Word; Shift : TShiftState); override; procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; override; function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; override; public constructor Create(AOwner: TComponent; AParent: TWinControl); override; procedure DrawCell(aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); override; end; { TBriefFileView } TBriefFileView = class (TFileViewWithGrid) protected function GetFileViewGridClass: TFileViewGridClass; override; procedure ShowRenameFileEdit(aFile: TFile); override; function GetVisibleFilesIndexes: TRange; override; public function Clone(NewParent: TWinControl): TBriefFileView; override; procedure SaveConfiguration(AConfig: TXmlConfig; ANode: TXmlNode); override; end; implementation uses LCLIntf, LCLType, LCLVersion, LCLProc, Math, uGlobs, uPixmapManager, uKeyboard, fMain, uFileSourceProperty, uOrderedFileView; { TBriefDrawGrid } procedure TBriefDrawGrid.UpdateView; function CalculateDefaultRowHeight: Integer; var OldFont, NewFont: TFont; MaxFontHeight: Integer = 0; CurrentHeight: Integer; begin // Start with height of the icons. if gShowIcons <> sim_none then MaxFontHeight := gIconsSize; // Assign temporary font. OldFont := Canvas.Font; NewFont := TFont.Create; Canvas.Font := NewFont; // Search columns settings for the biggest font (in height). Canvas.Font.Name := gFonts[dcfMain].Name; Canvas.Font.Style := gFonts[dcfMain].Style; Canvas.Font.Size := gFonts[dcfMain].Size; CurrentHeight := Canvas.GetTextHeight('Wg'); MaxFontHeight := Max(MaxFontHeight, CurrentHeight); // Restore old font. Canvas.Font := OldFont; FreeAndNil(NewFont); Result := MaxFontHeight; end; var TempRowHeight: Integer; begin Flat := gInterfaceFlat; // Calculate row height. TempRowHeight := CalculateDefaultRowHeight; if TempRowHeight > 0 then DefaultRowHeight := TempRowHeight; // Calculate column width CalculateColumnWidth; end; procedure TBriefDrawGrid.CalculateColRowCount; var glw, bw, ARowCount: Integer; AIndex, ACol, ARow: Integer; begin if (csDesigning in ComponentState) then Exit; if not Assigned(FBriefView.FFiles) then Exit; glw := Max(GridLineWidth, 1); bw := Max(BorderWidth, 1); if (Height > 0) and (DefaultRowHeight > 0) then begin // Save active file index AIndex:= CellToIndex(Col, Row); ARowCount := (Height - GetSystemMetrics(SM_CYHSCROLL) - glw - (2 * bw)) div (DefaultRowHeight + glw); if ARowCount > 0 then begin RowCount := ARowCount; ColCount := (FBriefView.FFiles.Count + ARowCount - 1) div ARowCount; // Restore active file index IndexToCell(AIndex, ACol, ARow); MoveExtend(False, ACol, ARow); end; end; Invalidate; end; procedure TBriefDrawGrid.CalculateColumnWidth; var I, J, L, M: Integer; begin if not Assigned(FBriefView.FFiles) then Exit; if FBriefView.FFiles.Count < 2 then DefaultColWidth:= ClientWidth div 3 else begin J:= 0; M:= 0; for I:= 0 to FBriefView.FFiles.Count - 1 do begin L:= Length(FBriefView.FFiles[I].FSFile.Name); if L > M then begin M:= L; J:= I; end; end; Canvas.Font.Name := gFonts[dcfMain].Name; Canvas.Font.Size := gFonts[dcfMain].Size; Canvas.Font.Style := gFonts[dcfMain].Style; M:= Canvas.TextWidth(FBriefView.FFiles[J].FSFile.Name + 'WWW'); if (gShowIcons = sim_none) then M:= M + 2 else M:= M + gIconsSize + 4; if M > ClientWidth then M:= ClientWidth - 4; DefaultColWidth:= M; end; end; function TBriefDrawGrid.CellToIndex(ACol, ARow: Integer): Integer; begin if (ARow < 0) or (ARow >= RowCount) or (ACol < 0) or (ACol >= ColCount) then Exit(-1); Result:= ACol * RowCount + ARow; if (Result < 0) or (Result >= FBriefView.FFiles.Count) then Result:= -1; end; procedure TBriefDrawGrid.IndexToCell(Index: Integer; out ACol, ARow: Integer); begin if (Index < 0) or (Index >= FBriefView.FFiles.Count) then begin ACol:= -1; ARow:= -1; end else begin ACol:= Index div RowCount; ARow:= Index mod RowCount; end; end; procedure TBriefDrawGrid.KeyDown(var Key: Word; Shift: TShiftState); var SavedKey: Word; FileIndex: Integer; ACol, ARow: Integer; begin if FBriefView.IsLoadingFileList then begin FBriefView.HandleKeyDownWhenLoading(Key, Shift); Exit; end; SavedKey := Key; // Set RangeSelecting before cursor is moved. FBriefView.FRangeSelecting := (ssShift in Shift) and (SavedKey in [VK_LEFT, VK_RIGHT, VK_HOME, VK_END, VK_PRIOR, VK_NEXT]); // Special case for selection with shift key (works like VK_INSERT) if (SavedKey in [VK_UP, VK_DOWN]) and (ssShift in Shift) then FBriefView.InvertActiveFile; case Key of VK_LEFT: begin if (Col - 1 < 0) then begin MoveExtend(False, 0, 0); Key:= 0; end; end; VK_RIGHT: begin if (CellToIndex(Col + 1, Row) < 0) then begin IndexToCell(FBriefView.FFiles.Count - 1, ACol, ARow); MoveExtend(False, ACol, ARow); Key:= 0; end; end; VK_PRIOR: begin FileIndex:= CellToIndex(Col, Row) - (VisibleRowCount - 1); if FileIndex < 0 then FileIndex:= 0; IndexToCell(FileIndex, ACol, ARow); MoveExtend(False, ACol, ARow); Key:= 0; end; VK_NEXT: begin FileIndex:= CellToIndex(Col, Row) + (VisibleRowCount - 1); if FileIndex >= FBriefView.FFiles.Count then FileIndex:= FBriefView.FFiles.Count - 1; IndexToCell(FileIndex, ACol, ARow); MoveExtend(False, ACol, ARow); Key:= 0; end; VK_HOME: begin MoveExtend(False, 0, 0); Key:= 0; end; VK_END: begin IndexToCell(FBriefView.FFiles.Count - 1, ACol, ARow); MoveExtend(False, ACol, ARow); Key:= 0; end; VK_UP, VK_DOWN: begin if (CellToIndex(Col, Row) >= FBriefView.FFiles.Count - 1) and (Key = VK_DOWN) then begin Key:= 0; end else if ((Row = RowCount-1) and (Key = VK_DOWN)) then begin if (Col < ColCount - 1) then begin Row:= 0; Col:= Col + 1; end; Key:= 0; end else if (Row = FixedRows) and (Key = VK_UP) then begin if (Col > 0) then begin Row:= RowCount - 1; Col:= Col - 1; end; Key:= 0; end; end; end; inherited KeyDown(Key, Shift); if FBriefView.FRangeSelecting then begin FileIndex := CellToIndex(Col, Row); if FileIndex <> InvalidFileIndex then FBriefView.Selection(SavedKey, FileIndex); end; end; procedure TBriefDrawGrid.MouseMove(Shift: TShiftState; X, Y: Integer); procedure Scroll(ScrollCode: SmallInt); var Msg: TLMHScroll; begin Msg.Msg := LM_HSCROLL; Msg.ScrollCode := ScrollCode; Msg.SmallPos := 1; // How many lines scroll Msg.ScrollBar := Handle; Dispatch(Msg); end; begin inherited MouseMove(Shift, X, Y); if DragManager.IsDragging or FBriefView.IsMouseSelecting then begin if X < 25 then Scroll(SB_LINEUP) else if X > ClientWidth - 25 then Scroll(SB_LINEDOWN); end; end; function TBriefDrawGrid.DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; begin if not FBriefView.IsLoadingFileList then begin Result:= inherited DoMouseWheelDown(Shift, MousePos); Result:= Perform(LM_HSCROLL, SB_LINERIGHT, 0) = 0; end else Result := True; // Handled end; function TBriefDrawGrid.DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; begin if not FBriefView.IsLoadingFileList then begin Result:= inherited DoMouseWheelUp(Shift, MousePos); Result:= Perform(LM_HSCROLL, SB_LINELEFT, 0) = 0; end else Result := True; // Handled end; constructor TBriefDrawGrid.Create(AOwner: TComponent; AParent: TWinControl); begin FBriefView:= AParent as TBriefFileView; inherited Create(AOwner, AParent); end; procedure TBriefDrawGrid.DrawCell(aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); var Idx: Integer; //shared variables s: string; iTextTop: Integer; AFile: TDisplayFile; FileSourceDirectAccess: Boolean; //------------------------------------------------------ //begin subprocedures //------------------------------------------------------ procedure DrawIconCell; //------------------------------------------------------ var Y: Integer; IconID: PtrInt; begin if (gShowIcons <> sim_none) then begin IconID := AFile.IconID; // Draw default icon if there is no icon for the file. if IconID = -1 then IconID := PixMapManager.GetDefaultIcon(AFile.FSFile); // center icon vertically Y:= aRect.Top + (RowHeights[ARow] - gIconsSize) div 2; // Draw icon for a file PixMapManager.DrawBitmap(IconID, Canvas, aRect.Left + 1, Y ); // Draw overlay icon for a file if needed if gIconOverlays then begin PixMapManager.DrawBitmapOverlay(AFile, FileSourceDirectAccess, Canvas, aRect.Left + 1, Y ); end; end; s := AFile.DisplayStrings[0]; Y:= (DefaultColWidth - 4 - Canvas.TextWidth('W')); if (gShowIcons <> sim_none) then Y:= Y - gIconsSize; s:= FitFileName(s, Canvas, AFile.FSFile, Y); if (gShowIcons <> sim_none) then Canvas.TextOut(aRect.Left + gIconsSize + 4, iTextTop, s) else Canvas.TextOut(aRect.Left + 2, iTextTop, s); end; //of DrawIconCell //------------------------------------------------------ //end of subprocedures //------------------------------------------------------ begin Idx:= CellToIndex(aCol, aRow); if (Idx >= 0) and (FBriefView.FFiles.Count > 0) then begin AFile:= FBriefView.FFiles[Idx]; FileSourceDirectAccess:= fspDirectAccess in FBriefView.FileSource.Properties; if AFile.DisplayStrings.Count = 0 then FBriefView.MakeColumnsStrings(AFile); PrepareColors(aFile, aCol, aRow, aRect, aState); iTextTop := aRect.Top + (RowHeights[aRow] - Canvas.TextHeight('Wg')) div 2; DrawIconCell; end else begin // Draw background. Canvas.Brush.Color := FBriefView.DimColor(gBackColor); Canvas.FillRect(aRect); end; DrawCellGrid(aCol, aRow, aRect, aState); DrawLines(Idx, aCol, aRow, aRect, aState); end; { TBriefFileView } function TBriefFileView.GetFileViewGridClass: TFileViewGridClass; begin Result:= TBriefDrawGrid; end; procedure TBriefFileView.ShowRenameFileEdit(aFile: TFile); var ALeft, ATop, AWidth, AHeight: Integer; begin if not edtRename.Visible then begin edtRename.Font.Name := gFonts[dcfMain].Name; edtRename.Font.Size := gFonts[dcfMain].Size;; edtRename.Font.Style := gFonts[dcfMain].Style; dgPanel.LeftCol:= dgPanel.Col; ATop := dgPanel.CellRect(dgPanel.Col, dgPanel.Row).Top - 2; ALeft := dgPanel.CellRect(dgPanel.Col, dgPanel.Row).Left; if gShowIcons <> sim_none then Inc(ALeft, gIconsSize + 2); AWidth := dgPanel.ColWidths[dgPanel.Col] - ALeft; AHeight := dgPanel.RowHeights[dgPanel.Row] + 4; edtRename.SetBounds(ALeft, ATop, AWidth, AHeight); end; inherited ShowRenameFileEdit(AFile); end; function TBriefFileView.GetVisibleFilesIndexes: TRange; begin with dgPanel do begin if (TopRow < 0) or (csLoading in ComponentState) then begin Result.First:= 0; Result.Last:= -1; end else begin Result.First:= (LeftCol * VisibleRowCount - 1); Result.Last:= (LeftCol + VisibleColCount + 1) * VisibleRowCount - 1; if Result.First < 0 then Result.First:= 0; if Result.Last >= FFiles.Count then Result.Last:= FFiles.Count - 1; end; end; end; function TBriefFileView.Clone(NewParent: TWinControl): TBriefFileView; begin Result := TBriefFileView.Create(NewParent, Self); end; procedure TBriefFileView.SaveConfiguration(AConfig: TXmlConfig; ANode: TXmlNode); begin inherited SaveConfiguration(AConfig, ANode); AConfig.SetAttr(ANode, 'Type', 'brief'); end; end. doublecmd-0.5.8/src/fileviews/ufileviewwithmainctrl.pas0000644000175000017500000011361112257475470022444 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Base class for file views which have a main control with a list of files. Copyright (C) 2012 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uFileViewWithMainCtrl; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Controls, ExtCtrls, StdCtrls, LCLType, LMessages, uFile, uFileViewWorker, uOrderedFileView, uFileView, uDragDropEx; type { TFileViewWithMainCtrl } TFileViewWithMainCtrl = class(TOrderedFileView) private {$IFDEF LCLGTK2} FLastDoubleClickTime : TDateTime; {$ENDIF} FMainControl: TWinControl; { Events for drag&drop from external applications } function OnExDragBegin: Boolean; function OnExDragEnd: Boolean; function OnExDragEnter(var DropEffect: TDropEffect; ScreenPoint: TPoint): Boolean; function OnExDragOver(var DropEffect: TDropEffect; ScreenPoint: TPoint): Boolean; function OnExDrop(const FileNamesList: TStringList; DropEffect: TDropEffect; ScreenPoint: TPoint): Boolean; function OnExDragLeave: Boolean; procedure SetMainControl(AValue: TWinControl); procedure tmContextMenuTimer(Sender: TObject); // If internal dragging is currently in effect, this function // stops internal dragging and starts external. procedure TransformDraggingToExternal(ScreenPoint: TPoint); procedure edtRenameEnter(Sender: TObject); procedure edtRenameExit(Sender: TObject); procedure edtRenameKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); protected edtRename: TEdit; FWindowProc: TWndMethod; // Used to register as a drag and drop source and target. FDragDropSource: uDragDropEx.TDragDropSource; FDragDropTarget: uDragDropEx.TDragDropTarget; FHintFileIndex: PtrInt; FMainControlLastMouseButton: TMouseButton; // Mouse button that initiated dragging {en Used to check if button-up was received after button-down or after dropping something after dragging with right mouse button. } FMainControlMouseDown: Boolean; FMouseSelectionStartIndex: Integer; FMouseSelectionLastState: Boolean; FDragStartPoint: TPoint; FDragFileIndex: PtrInt; FDropFileIndex: PtrInt; FStartDrag: Boolean; tmContextMenu: TTimer; // Simulates releasing mouse button that started a dragging operation, // but was released in another window or another application. procedure ClearAfterDragDrop; virtual; procedure CreateDefault(AOwner: TWinControl); override; {en Changes drawing colors depending on if this panel is active. } procedure DoActiveChanged; override; procedure DoMainControlShowHint(FileIndex: PtrInt; X, Y: Integer); virtual; abstract; procedure DoLoadingFileListLongTime; override; procedure DoUpdateView; override; procedure FinalizeDragDropEx(AControl: TWinControl); {en Retrieves file index under mouse cursor. @param(X, Y Should be client coordinates of MainControl.) @param(AtFileList Whether X, Y point to the filelist, not at specific file but at empty space. If AtFileList is @false then X, Y point somewhere outside the file list.) } function GetFileIndexFromCursor(X, Y: Integer; out AtFileList: Boolean): PtrInt; virtual; abstract; procedure InitializeDragDropEx(AControl: TWinControl); {en Returns @true if currently selecting with right mouse button. } function IsMouseSelecting: Boolean; inline; procedure MainControlDblClick(Sender: TObject); procedure MainControlQuadClick(Sender: TObject); procedure MainControlDragDrop(Sender, Source: TObject; X, Y: Integer); procedure MainControlDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure MainControlEndDrag(Sender, Target: TObject; X, Y: Integer); procedure MainControlEnter(Sender: TObject); procedure MainControlExit(Sender: TObject); procedure MainControlKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure MainControlKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure MainControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure MainControlMouseLeave(Sender: TObject); procedure MainControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure MainControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure MainControlShowHint(Sender: TObject; HintInfo: PHintInfo); procedure MainControlUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char); procedure MainControlWindowProc(var TheMessage: TLMessage); {en Updates the drop row index, which is used to draw a rectangle on directories during drag&drop operations. } procedure SetDropFileIndex(NewFileIndex: PtrInt); procedure WorkerStarting(const Worker: TFileViewWorker); override; procedure WorkerFinished(const Worker: TFileViewWorker); override; procedure ShowRenameFileEdit(AFile: TFile); virtual; property MainControl: TWinControl read FMainControl write SetMainControl; {$IFDEF LCLGTK2} function TooManyDoubleClicks: Boolean; {$ENDIF} public destructor Destroy; override; procedure DoDragDropOperation(Operation: TDragDropOperation; var DropParams: TDropParams); override; function Focused: Boolean; override; procedure SetFocus; override; published procedure cm_RenameOnly(const Params: array of string); procedure cm_ContextMenu(const Params: array of string); end; implementation uses {$IF DEFINED(LCLGTK2)} Gtk2Proc, // for ReleaseMouseCapture GTK2Globals, // for DblClickTime {$ENDIF} LCLIntf, LCLProc, Forms, Dialogs, fMain, uShowMsg, uLng, uFileProperty, uFileSource, uFileSourceOperationTypes, uGlobs, uInfoToolTip, uDisplayFile, uFileSystemFileSource, uFileSourceUtil, uArchiveFileSourceUtil; type TControlHandlersHack = class(TWinControl) end; { TFileViewWithMainCtrl } procedure TFileViewWithMainCtrl.ClearAfterDragDrop; begin // Clear some control specific flags. MainControl.ControlState := MainControl.ControlState - [csClicked, csLButtonDown]; end; procedure TFileViewWithMainCtrl.cm_ContextMenu(const Params: array of string); var Rect: TRect; Point: TPoint; begin if IsLoadingFileList then Exit; Rect := GetFileRect(GetActiveFileIndex); Point.X := Rect.Left + ((Rect.Right - Rect.Left) div 2); Point.Y := Rect.Top + ((Rect.Bottom - Rect.Top) div 2); Point := MainControl.ClientToScreen(Point); frmMain.Commands.DoContextMenu(Self, Point.X, Point.Y, False); end; procedure TFileViewWithMainCtrl.CreateDefault(AOwner: TWinControl); begin FDropFileIndex := -1; FHintFileIndex := -1; {$IFDEF LCLGTK2} FLastDoubleClickTime := Now; {$ENDIF} FStartDrag := False; inherited CreateDefault(AOwner); edtRename := TEdit.Create(Self); edtRename.Visible := False; edtRename.TabStop := False; edtRename.AutoSize := False; edtRename.OnKeyDown := @edtRenameKeyDown; edtRename.OnEnter := @edtRenameEnter; edtRename.OnExit := @edtRenameExit; tmContextMenu := TTimer.Create(Self); tmContextMenu.Enabled := False; tmContextMenu.Interval := 500; tmContextMenu.OnTimer := @tmContextMenuTimer; end; destructor TFileViewWithMainCtrl.Destroy; begin if Assigned(HotMan) then HotMan.UnRegister(MainControl); inherited Destroy; end; procedure TFileViewWithMainCtrl.DoActiveChanged; begin inherited DoActiveChanged; MainControl.Color := DimColor(gBackColor); end; procedure TFileViewWithMainCtrl.DoDragDropOperation(Operation: TDragDropOperation; var DropParams: TDropParams); var AFile: TDisplayFile; ClientDropPoint: TPoint; FileIndex: PtrInt; AtFileList: Boolean; FileSourceIndex, PathIndex: Integer; begin try with DropParams do begin if Files.Count > 0 then begin ClientDropPoint := MainControl.ScreenToClient(ScreenDropPoint); FileIndex := GetFileIndexFromCursor(ClientDropPoint.X, ClientDropPoint.Y, AtFileList); // default to current active directory in the destination panel TargetPath := Self.CurrentPath; if (DropIntoDirectories = True) and IsFileIndexInRange(FileIndex) then begin AFile := FFiles[FileIndex]; // If dropped into a directory modify destination path and file source accordingly. if Assigned(AFile) and (AFile.FSFile.IsDirectory or AFile.FSFile.IsLinkToDirectory) then begin if AFile.FSFile.Name = '..' then begin if TargetFileSource.IsPathAtRoot(CurrentPath) then begin // Change to previous file source and last path. FileSourceIndex := History.CurrentFileSourceIndex - 1; if FileSourceIndex < 0 then TargetFileSource := nil // No parent file sources. else begin PathIndex := History.PathsCount[FileSourceIndex] - 1; if PathIndex < 0 then TargetFileSource := nil // No paths. else begin TargetFileSource := FileSources[FileSourceIndex]; TargetPath := History.Path[FileSourceIndex, PathIndex]; end; end; end else begin // Remove the last subdirectory in the path. TargetPath := TargetFileSource.GetParentDir(TargetPath); end; end else TargetPath := TargetPath + AFile.FSFile.Name + DirectorySeparator; end else if FileIsArchive(AFile.FSFile.FullPath) then begin TargetFileSource:= GetArchiveFileSource(FileSource, AFile.FSFile); if Assigned(TargetFileSource) then TargetPath:= TargetFileSource.GetRootDir; end; end; end; end; // Execute the operation. frmMain.DoDragDropOperation(Operation, DropParams); finally FreeAndNil(DropParams); end; end; procedure TFileViewWithMainCtrl.DoLoadingFileListLongTime; begin MainControl.Color := DimColor(gBackColor); inherited DoLoadingFileListLongTime; end; procedure TFileViewWithMainCtrl.DoUpdateView; begin inherited DoUpdateView; MainControl.Color := DimColor(gBackColor); MainControl.ShowHint := (gShowToolTipMode <> []); end; procedure TFileViewWithMainCtrl.FinalizeDragDropEx(AControl: TWinControl); begin FreeAndNil(FDragDropSource); FreeAndNil(FDragDropTarget); end; function TFileViewWithMainCtrl.Focused: Boolean; begin Result := Assigned(MainControl) and MainControl.Focused; end; procedure TFileViewWithMainCtrl.InitializeDragDropEx(AControl: TWinControl); begin // Register as drag&drop source and target. FDragDropSource := uDragDropEx.CreateDragDropSource(AControl); if Assigned(FDragDropSource) then FDragDropSource.RegisterEvents(nil, nil, @OnExDragEnd); FDragDropTarget := uDragDropEx.CreateDragDropTarget(AControl); if Assigned(FDragDropTarget) then FDragDropTarget.RegisterEvents(@OnExDragEnter, @OnExDragOver, @OnExDrop, @OnExDragLeave); end; function TFileViewWithMainCtrl.IsMouseSelecting: Boolean; begin Result := FMainControlMouseDown and (FMainControlLastMouseButton = mbRight) and gMouseSelectionEnabled and (gMouseSelectionButton = 1); end; procedure TFileViewWithMainCtrl.MainControlDblClick(Sender: TObject); var Point : TPoint; FileIndex : PtrInt; AtFileList: Boolean; begin if IsLoadingFileList then Exit; {$IFDEF LCLGTK2} // Workaround for two doubleclicks being sent on GTK. if TooManyDoubleClicks then Exit; {$ENDIF} FStartDrag := False; // don't start drag on double click Point := MainControl.ScreenToClient(Mouse.CursorPos); // If on a file/directory then choose it. FileIndex := GetFileIndexFromCursor(Point.x, Point.y, AtFileList); if IsFileIndexInRange(FileIndex) then ChooseFile(FFiles[FileIndex]); {$IFDEF LCLGTK2} FLastDoubleClickTime := Now; {$ENDIF} end; procedure TFileViewWithMainCtrl.MainControlDragDrop(Sender, Source: TObject; X, Y: Integer); var SourcePanel: TFileViewWithMainCtrl; SourceFiles: TFiles; DropParams: TDropParams; begin if not (Source is TWinControl) or not (TWinControl(Source).Parent is TFileViewWithMainCtrl) then Exit; SourcePanel := ((Source as TWinControl).Parent) as TFileViewWithMainCtrl; // Get file names from source panel. SourceFiles := SourcePanel.CloneSelectedOrActiveFiles; try // Drop onto target panel. DropParams := TDropParams.Create( SourceFiles, // Will be freed automatically. GetDropEffectByKeyAndMouse(GetKeyShiftState, SourcePanel.FMainControlLastMouseButton), MainControl.ClientToScreen(Classes.Point(X, Y)), True, SourcePanel, Self, Self.FileSource, Self.CurrentPath); frmMain.DropFiles(DropParams); SetDropFileIndex(-1); except FreeAndNil(SourceFiles); raise; end; end; procedure TFileViewWithMainCtrl.MainControlDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); var AFile: TDisplayFile; SourcePanel: TFileView; TargetPanel: TFileView; SourceDir, TargetDir: String; FileIndex: PtrInt; AtFileList: Boolean; begin Accept := False; if not (Source is TWinControl) or not (TWinControl(Source).Parent is TFileView) then Exit; SourcePanel := ((Source as TWinControl).Parent) as TFileView; TargetPanel := Self; FileIndex := GetFileIndexFromCursor(X, Y, AtFileList); // Always allow dropping into an empty panel. // And it is also allowed to drop onto header in case all visible items // are directories and the user wants to drop into panel's current directory. if FileIndex = InvalidFileIndex then begin SetDropFileIndex(-1); Accept := True; Exit; end; SourceDir := SourcePanel.CurrentPath; TargetDir := TargetPanel.CurrentPath; AFile := FFiles[FileIndex]; if AFile.FSFile.IsDirectory or AFile.FSFile.IsLinkToDirectory or FileIsArchive(AFile.FSFile.FullPath) then begin if State = dsDragLeave then // Mouse is leaving the control or drop will occur immediately. // Don't draw DropRow rectangle. SetDropFileIndex(-1) else SetDropFileIndex(FileIndex); if Sender = Source then begin if not ((FileIndex = FDragFileIndex) or (AFile.Selected = True)) then Accept := True; end else begin if Assigned(SourcePanel) and Assigned(TargetPanel) then begin if AFile.FSFile.Name = '..' then TargetDir := TargetPanel.FileSource.GetParentDir(TargetDir) else TargetDir := TargetDir + AFile.FSFile.Name + DirectorySeparator; if SourceDir <> TargetDir then Accept := True; end else Accept := True; end; end else if (Sender <> Source) then begin SetDropFileIndex(-1); if Assigned(SourcePanel) then begin if SourcePanel.CurrentPath <> TargetPanel.CurrentPath then Accept := True; end else Accept := True; end else begin SetDropFileIndex(-1); end; end; procedure TFileViewWithMainCtrl.MainControlEndDrag(Sender, Target: TObject; X, Y: Integer); procedure ClearDropNode(aFileView: TFileView); begin if aFileView is TFileViewWithMainCtrl then TFileViewWithMainCtrl(aFileView).SetDropFileIndex(-1); end; begin // If cancelled by the user, DragManager does not send drag-leave event // to the target, so we must clear the DropRow in both panels. ClearDropNode(frmMain.FrameLeft); ClearDropNode(frmMain.FrameRight); if uDragDropEx.TransformDragging = False then ClearAfterDragDrop; end; procedure TFileViewWithMainCtrl.MainControlEnter(Sender: TObject); begin Active := True; end; procedure TFileViewWithMainCtrl.MainControlExit(Sender: TObject); begin FRangeSelecting := False; end; procedure TFileViewWithMainCtrl.MainControlKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var ScreenPoint: TPoint; begin if IsLoadingFileList then Exit; case Key of VK_APPS: begin cm_ContextMenu([]); Key := 0; end; VK_MENU: // Alt key if MainControl.Dragging then begin // Force transform to external dragging in anticipation of user // pressing Alt+Tab to change active application window. // Disable flag, so that dragging isn't immediately transformed // back to internal before the other application window is shown. uDragDropEx.AllowTransformToInternal := False; GetCursorPos(ScreenPoint); TransformDraggingToExternal(ScreenPoint); end; end; DoHandleKeyDown(Key, Shift); end; procedure TFileViewWithMainCtrl.MainControlKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin FRangeSelecting := False; end; procedure TFileViewWithMainCtrl.MainControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var FileIndex: PtrInt; AtFileList: Boolean; AFile, APreviousFile: TDisplayFile; begin FileIndex := GetFileIndexFromCursor(X, Y, AtFileList); if not AtFileList then Exit; SetFocus; // history navigation for mice with extra buttons case Button of mbExtra1: begin GoToPrevHistory; Exit; end; mbExtra2: begin GoToNextHistory; Exit; end; end; if IsLoadingFileList then Exit; if IsFileIndexInRange(FileIndex) then begin AFile := FFiles[FileIndex]; FMainControlLastMouseButton := Button; case Button of mbRight: begin SetActiveFile(FileIndex); if gMouseSelectionEnabled and (gMouseSelectionButton = 1) then begin FMouseSelectionStartIndex := FileIndex; FMouseSelectionLastState := not AFile.Selected; tmContextMenu.Enabled:= True; // start context menu timer MarkFile(AFile, FMouseSelectionLastState, False); DoSelectionChanged(FileIndex); SetCaptureControl(MainControl); end; end; mbLeft: begin if gMouseSelectionEnabled then begin if ssCtrl in Shift then begin // if there is no selected files then select also previous file if not HasSelectedFiles then begin APreviousFile := GetActiveDisplayFile; if Assigned(APreviousFile) and (APreviousFile <> AFile) then MarkFile(APreviousFile, True, False); end; InvertFileSelection(AFile, False); DoSelectionChanged(FileIndex); end else if ssShift in Shift then begin FRangeSelecting := True; SelectRange(FileIndex); end else if (gMouseSelectionButton = 0) then begin if not AFile.Selected then MarkFiles(False); end; end;//of mouse selection handler end; else SetActiveFile(FileIndex); end; { Dragging } // Check if not already dragging (started by a different button) // and if the mouse button is not used for selection. if not MainControl.Dragging and not (gMouseSelectionEnabled and (Button = mbRight) and (gMouseSelectionButton = Integer(Button))) then begin // indicate that drag start at next mouse move event FStartDrag := True; FDragStartPoint.X := X; FDragStartPoint.Y := Y; FDragFileIndex := FileIndex; uDragDropEx.TransformDragging := False; uDragDropEx.AllowTransformToInternal := True; end; end else // if mouse on empty space begin if (Button = mbRight) and (gMouseSelectionEnabled) and (gMouseSelectionButton = 1) then tmContextMenu.Enabled:= True; // start context menu timer end; end; procedure TFileViewWithMainCtrl.MainControlMouseLeave(Sender: TObject); begin end; procedure TFileViewWithMainCtrl.MainControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var Point: TPoint; AFile: TDisplayFile; ExpectedButton: TShiftStateEnum; FileIndex: PtrInt; AtFileList: Boolean; SelStartIndex, SelEndIndex: Integer; begin if FMainControlMouseDown and MainControl.Dragging then begin // If dragging has started then clear MouseDown flag. if (Abs(FDragStartPoint.X - X) > DragManager.DragThreshold) or (Abs(FDragStartPoint.Y - Y) > DragManager.DragThreshold) then begin FMainControlMouseDown := False; end; end; // If dragging is currently in effect, the window has mouse capture and // we can retrieve the window over which the mouse cursor currently is. if MainControl.Dragging and uDragDropEx.IsExternalDraggingSupported then begin Point := MainControl.ClientToScreen(Classes.Point(X, Y)); // use specifically LCLIntf.WindowFromPoint to avoid confusion with Windows.WindowFromPoint if LCLIntf.WindowFromPoint(Point) = 0 then begin // If result is 0 then the window belongs to another process // and we transform intra-process dragging into inter-process dragging. TransformDraggingToExternal(Point); end; end else // if we are about to start dragging if FStartDrag then begin FStartDrag := False; case FMainControlLastMouseButton of mbLeft : ExpectedButton := ssLeft; mbMiddle : ExpectedButton := ssMiddle; mbRight : ExpectedButton := ssRight; else Exit; end; // Make sure the same mouse button is still pressed. if not (ExpectedButton in Shift) then begin ClearAfterDragDrop; end else if IsFileIndexInRange(FDragFileIndex) then begin AFile := FFiles[FDragFileIndex]; // Check if valid item is being dragged. if IsItemValid(AFile) then begin MainControl.BeginDrag(False); end; end; end; // Show file info tooltip. if ShowHint and not MainControl.Dragging and ([ssLeft, ssMiddle, ssRight] * Shift = []) then begin FileIndex := GetFileIndexFromCursor(X, Y, AtFileList); if FileIndex <> FHintFileIndex then begin FHintFileIndex := FileIndex; Application.CancelHint; MainControl.Hint:= EmptyStr; // don't show by default if IsFileIndexInRange(FileIndex) then DoMainControlShowHint(FHintFileIndex, X, Y); end; end; // Selection with right mouse button, if enabled. if FMainControlMouseDown and (FMainControlLastMouseButton = mbRight) and gMouseSelectionEnabled and (gMouseSelectionButton = 1) then begin FileIndex := GetFileIndexFromCursor(X, Y, AtFileList); if IsFileIndexInRange(FileIndex) and (GetActiveFileIndex <> FileIndex) then begin tmContextMenu.Enabled:= False; // stop context menu timer if FMouseSelectionStartIndex < FileIndex then begin SelStartIndex := FMouseSelectionStartIndex; SelEndIndex := FileIndex; end else begin SelStartIndex := FileIndex; SelEndIndex := FMouseSelectionStartIndex; end; SetActiveFile(FileIndex); MarkFiles(SelStartIndex, SelEndIndex, FMouseSelectionLastState); end; end; end; procedure TFileViewWithMainCtrl.MainControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if IsLoadingFileList then Exit; FStartDrag := False; FRangeSelecting := False; // Handle only if button-up was not lifted to finish drag&drop operation. if not FMainControlMouseDown then Exit; if IsMouseSelecting and (GetCaptureControl = MainControl) then SetCaptureControl(nil); FMainControlMouseDown := False; end; procedure TFileViewWithMainCtrl.MainControlQuadClick(Sender: TObject); begin MainControlDblClick(Sender); end; procedure TFileViewWithMainCtrl.MainControlShowHint(Sender: TObject; HintInfo: PHintInfo); var AFile: TDisplayFile; sHint: UTF8String; begin // Rewrite HintStr because when MainControl.Hint is empty // it would contain parent hint that is not correct behavior HintInfo^.HintStr:= MainControl.Hint; if (HintInfo^.HintStr = EmptyStr) or not IsFileIndexInRange(FHintFileIndex) then Exit; // don't show AFile := FFiles[FHintFileIndex]; if not AFile.FSFile.IsDirectory then begin sHint:= GetFileInfoToolTip(FileSource, AFile.FSFile); with HintInfo^ do begin if (sHint = EmptyStr) and (HintStr = #32) then // no tooltip HintStr:= EmptyStr else if (sHint <> EmptyStr) then // has tooltip begin if HintStr = #32 then // without name HintStr:= sHint else HintStr:= HintStr + LineEnding + sHint; end; end; end; end; procedure TFileViewWithMainCtrl.MainControlUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char); begin if IsLoadingFileList then Exit; // check if ShiftState is equal to quick search / filter modes if quickSearch.CheckSearchOrFilter(UTF8Key) then Exit; end; procedure TFileViewWithMainCtrl.MainControlWindowProc(var TheMessage: TLMessage); begin // Cancel rename if user scroll file list by mouse if (TheMessage.Msg = LM_VSCROLL) or (TheMessage.Msg = LM_HSCROLL) or (TheMessage.Msg = LM_MOUSEWHEEL) then begin edtRename.Hide; SetFocus; end; FWindowProc(TheMessage); end; function TFileViewWithMainCtrl.OnExDragBegin: Boolean; begin Result := True; end; function TFileViewWithMainCtrl.OnExDragEnd: Boolean; {$IF DEFINED(MSWINDOWS)} var startPoint: TPoint; currentPoint: TPoint; {$ENDIF} begin {$IF DEFINED(MSWINDOWS)} // On windows dragging can be transformed back into internal. // Check if drag was aborted due to mouse moving back into // the application window or the user just cancelled it. if TransformDragging and (FDragDropSource.GetLastStatus = DragDropAborted) then begin // Transform to internal dragging again. // Save current mouse position. GetCursorPos(currentPoint); // Temporarily set cursor position to the point where the drag was started // so that DragManager can properly read the control being dragged. startPoint := MainControl.ClientToScreen(FDragStartPoint); SetCursorPos(startPoint.X, startPoint.Y); // Begin internal dragging. MainControl.BeginDrag(True); // Move cursor back. SetCursorPos(currentPoint.X, currentPoint.Y); // Clear flag. TransformDragging := False; Exit(True); end; {$ENDIF} ClearAfterDragDrop; Result := True; end; function TFileViewWithMainCtrl.OnExDragEnter(var DropEffect: TDropEffect; ScreenPoint: TPoint): Boolean; begin Result := True; end; function TFileViewWithMainCtrl.OnExDragLeave: Boolean; begin SetDropFileIndex(-1); Result := True; end; function TFileViewWithMainCtrl.OnExDragOver(var DropEffect: TDropEffect; ScreenPoint: TPoint): Boolean; var ClientPoint: TPoint; AFile: TDisplayFile; FileIndex: PtrInt; AtFileList: Boolean; begin // Dropping into empty panel allowed. Result := True; ClientPoint := MainControl.ScreenToClient(ScreenPoint); FileIndex := GetFileIndexFromCursor(ClientPoint.x, ClientPoint.y, AtFileList); if IsFileIndexInRange(FileIndex) then begin // Get the file over which there is something dragged. AFile := FFiles[FileIndex]; // If it is a directory or link mark possibility of drop. if AFile.FSFile.IsDirectory or AFile.FSFile.IsLinkToDirectory or FileIsArchive(AFile.FSFile.FullPath) then SetDropFileIndex(FileIndex) else SetDropFileIndex(-1); end else SetDropFileIndex(-1); end; function TFileViewWithMainCtrl.OnExDrop(const FileNamesList: TStringList; DropEffect: TDropEffect; ScreenPoint: TPoint): Boolean; var AFiles: TFiles = nil; DropParams: TDropParams; begin Result := False; if FileNamesList.Count > 0 then try AFiles := TFileSystemFileSource.CreateFilesFromFileList( ExtractFilePath(FileNamesList[0]), FileNamesList); try DropParams := TDropParams.Create( AFiles, DropEffect, ScreenPoint, True, nil, Self, Self.FileSource, Self.CurrentPath); frmMain.DropFiles(DropParams); Result := True; finally FreeAndNil(AFiles); end; except on e: EFileNotFound do MessageDlg(e.Message, mtError, [mbOK], 0); end; SetDropFileIndex(-1); end; procedure TFileViewWithMainCtrl.SetDropFileIndex(NewFileIndex: PtrInt); var OldDropIndex: PtrInt; begin if FDropFileIndex <> NewFileIndex then begin OldDropIndex := FDropFileIndex; // Set new index before redrawing. FDropFileIndex := NewFileIndex; if IsFileIndexInRange(OldDropIndex) then RedrawFile(OldDropIndex); if IsFileIndexInRange(NewFileIndex) then RedrawFile(NewFileIndex); end; end; procedure TFileViewWithMainCtrl.SetFocus; begin // CanFocus checks parent controls, but not parent form. if GetParentForm(Self).CanFocus and MainControl.CanFocus then begin inherited SetFocus; MainControl.SetFocus; end; end; procedure TFileViewWithMainCtrl.cm_RenameOnly(const Params: array of string); var aFile: TFile; begin if not IsLoadingFileList and (fsoSetFileProperty in FileSource.GetOperationsTypes) then begin aFile:= CloneActiveFile; if Assigned(aFile) then try if aFile.IsNameValid then ShowRenameFileEdit(aFile) else ShowPathEdit; finally FreeAndNil(aFile); end; end; end; procedure TFileViewWithMainCtrl.SetMainControl(AValue: TWinControl); begin if FMainControl = AValue then Exit; FMainControl := AValue; FMainControl.ControlStyle := FMainControl.ControlStyle + [csQuadClicks]; FMainControl.OnEnter := @MainControlEnter; FMainControl.OnExit := @MainControlExit; FMainControl.OnKeyDown := @MainControlKeyDown; FMainControl.OnKeyUp := @MainControlKeyUp; FMainControl.OnShowHint := @MainControlShowHint; FMainControl.OnUTF8KeyPress := @MainControlUTF8KeyPress; TControlHandlersHack(FMainControl).OnDblClick := @MainControlDblClick; TControlHandlersHack(FMainControl).OnQuadClick := @MainControlQuadClick; TControlHandlersHack(FMainControl).OnDragDrop := @MainControlDragDrop; TControlHandlersHack(FMainControl).OnDragOver := @MainControlDragOver; TControlHandlersHack(FMainControl).OnEndDrag := @MainControlEndDrag; TControlHandlersHack(FMainControl).OnMouseDown := @MainControlMouseDown; TControlHandlersHack(FMainControl).OnMouseLeave := @MainControlMouseLeave; TControlHandlersHack(FMainControl).OnMouseMove := @MainControlMouseMove; TControlHandlersHack(FMainControl).OnMouseUp := @MainControlMouseUp; edtRename.Parent := FMainControl; HotMan.Register(MainControl, 'Files Panel'); end; procedure TFileViewWithMainCtrl.tmContextMenuTimer(Sender: TObject); var AFile: TDisplayFile; ClientPoint, MousePoint: TPoint; Background: Boolean; FileIndex: PtrInt; AtFileList: Boolean; begin FMainControlMouseDown:= False; tmContextMenu.Enabled:= False; // stop context menu timer MousePoint := Mouse.CursorPos; ClientPoint := MainControl.ScreenToClient(MousePoint); FileIndex := GetFileIndexFromCursor(ClientPoint.x, ClientPoint.y, AtFileList); Background := not IsFileIndexInRange(FileIndex); if not Background then begin AFile := FFiles[FileIndex]; MarkFile(AFile, not FMouseSelectionLastState, False); DoSelectionChanged(FileIndex); end; frmMain.Commands.DoContextMenu(Self, MousePoint.x, MousePoint.y, Background); end; procedure TFileViewWithMainCtrl.TransformDraggingToExternal(ScreenPoint: TPoint); begin // Set flag temporarily before stopping internal dragging, // so that triggered events will know that dragging is transforming. TransformDragging := True; // Stop internal dragging DragManager.DragStop(False); {$IF DEFINED(LCLGTK) or DEFINED(LCLGTK2)} // Under GTK, DragManager does not release it's mouse capture on // DragStop(). We must release it here manually or LCL will get confused // with who "owns" the capture after the GTK drag&drop finishes. ReleaseMouseCapture; {$ENDIF} // Clear flag before starting external dragging. TransformDragging := False; // Start external dragging. // On Windows it does not return until dragging is finished. if IsFileIndexInRange(FDragFileIndex) then begin BeginDragExternal(FFiles[FDragFileIndex], FDragDropSource, FMainControlLastMouseButton, ScreenPoint); end; end; procedure TFileViewWithMainCtrl.edtRenameEnter(Sender: TObject); begin FWindowProc:= MainControl.WindowProc; MainControl.WindowProc:= @MainControlWindowProc; end; procedure TFileViewWithMainCtrl.edtRenameExit(Sender: TObject); begin edtRename.Visible := False; MainControl.WindowProc:= FWindowProc; // OnEnter don't called automatically (bug?) // TODO: Check on which widgetset/OS this is needed. FMainControl.OnEnter(Self); end; procedure TFileViewWithMainCtrl.edtRenameKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var NewFileName: String; OldFileNameAbsolute: String; aFile: TFile = nil; 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; aFile := CloneActiveFile; try try if RenameFile(FileSource, aFile, NewFileName, True) = True then begin edtRename.Visible:=False; SetActiveFile(CurrentPath + NewFileName); SetFocus; end else msgError(Format(rsMsgErrRename, [ExtractFileName(OldFileNameAbsolute), NewFileName])); except on e: EInvalidFileProperty do msgError(Format(rsMsgErrRename + ':' + LineEnding + '%s (%s)', [ExtractFileName(OldFileNameAbsolute), NewFileName, rsMsgInvalidFileName, e.Message])); end; finally FreeAndNil(aFile); end; end; {$IFDEF LCLGTK2} // Workaround for GTK2 - up and down arrows moving through controls. VK_UP, VK_DOWN: Key := 0; {$ENDIF} end; end; {$IFDEF LCLGTK2} function TFileViewWithMainCtrl.TooManyDoubleClicks: Boolean; begin Result := ((Now - FLastDoubleClickTime) <= ((1/86400)*(DblClickTime/1000))); end; {$ENDIF} procedure TFileViewWithMainCtrl.WorkerFinished(const Worker: TFileViewWorker); begin inherited WorkerFinished(Worker); MainControl.Cursor := crDefault; // Update status line only if not (csDestroying in ComponentState) then UpdateInfoPanel; end; procedure TFileViewWithMainCtrl.ShowRenameFileEdit(AFile: TFile); var lenEdtText, lenEdtTextExt, i: Integer; seperatorSet: set of AnsiChar; begin if edtRename.Visible then begin lenEdtText := UTF8Length(edtRename.Text); lenEdtTextExt := UTF8Length(ExtractFileExt(edtRename.Text)); if (edtRename.SelLength = lenEdtText) then begin // Now all selected, change it to name-only. edtRename.SelStart:= 0; edtRename.SelLength:= lenEdtText - lenEdtTextExt; end else if (edtRename.SelStart = 0) and (edtRename.SelLength = lenEdtText - lenEdtTextExt) then begin // Now name-only selected, change it to ext-only. edtRename.SelStart:= edtRename.SelLength + 1; edtRename.SelLength:= lenEdtText - edtRename.SelStart; end else begin // Partial selection cycle. seperatorSet:= [' ', '-', '_', '.']; i:= edtRename.SelStart + edtRename.SelLength; while true do begin if (edtRename.Text[UTF8CharToByteIndex(PChar(edtRename.Text), length(edtRename.Text), i)] in seperatorSet) and not(edtRename.Text[UTF8CharToByteIndex(PChar(edtRename.Text), length(edtRename.Text), i+1)] in seperatorSet) then begin edtRename.SelStart:= i; Break; end; inc(i); if i >= lenEdtText then begin edtRename.SelStart:= 0; Break; end; end; i:= edtRename.SelStart + 1; while true do begin if (i >= lenEdtText) or (edtRename.Text[UTF8CharToByteIndex(PChar(edtRename.Text), length(edtRename.Text), i+1)] in seperatorSet) then begin edtRename.SelLength:= i - edtRename.SelStart; Break; end; inc(i); end; end; end else begin edtRename.Hint := aFile.FullPath; edtRename.Text := aFile.Name; edtRename.Visible := True; edtRename.SetFocus; if gRenameSelOnlyName and (aFile.Extension <> EmptyStr) and (aFile.Name <> EmptyStr) then begin {$IFDEF LCLGTK2} edtRename.SelStart:=1; {$ENDIF} edtRename.SelStart:=0; edtRename.SelLength:= UTF8Length(aFile.Name) - UTF8Length(aFile.Extension) - 1; end else edtRename.SelectAll; end; end; procedure TFileViewWithMainCtrl.WorkerStarting(const Worker: TFileViewWorker); begin inherited WorkerStarting(Worker); MainControl.Cursor := crHourGlass; UpdateInfoPanel; // Update status line only end; end. doublecmd-0.5.8/src/fileviews/ucolumnsfileviewvtv.pas0000644000175000017500000016454712071625742022166 0ustar alexxalexxunit uColumnsFileViewVtv; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Graphics, Controls, Forms, ExtCtrls, Grids, LMessages, LCLIntf, LCLType, Menus, uTypes, uFile, uFileProperty, uFileView, uFileViewWithMainCtrl, uFileSource, uDisplayFile, uColumns, uFileSorting, DCXmlConfig, DCClassesUtf8, VirtualTrees; type TColumnsSortDirections = array of uFileSorting.TSortDirection; TColumnsFileViewVTV = class; TNodeRange = record First: PVirtualNode; Last: PVirtualNode; end; TColumnsDrawTreeRecord = record end; // We don't need anything in it, just Node^.Index. PColumnsDrawTreeRecord = ^TColumnsDrawTreeRecord; { TColumnsDrawTree } TColumnsDrawTree = class(TVirtualDrawTree) private ColumnsView: TColumnsFileViewVTV; function GetGridHorzLine: Boolean; function GetGridVertLine: Boolean; procedure SetGridHorzLine(const AValue: Boolean); procedure SetGridVertLine(const AValue: Boolean); function GetNodeFile(Node: PVirtualNode): TDisplayFile; function GetVisibleNodes: TNodeRange; procedure SetAllRowsHeights(ARowHeight: Cardinal); protected function CanAutoScroll: Boolean; override; function CanScroll(const ClientMousePos: TPoint): Boolean; override; function DetermineScrollDirections(X, Y: Integer): TScrollDirections; override; function DoKeyAction(var CharCode: Word; var Shift: TShiftState): Boolean; override; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); override; procedure MouseUp(Button: TMouseButton; Shift:TShiftState; X,Y:Integer); override; procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW; procedure WMKeyDown(var Message: TLMKeyDown); message LM_KEYDOWN; procedure InitializeWnd; override; procedure FinalizeWnd; override; procedure DoPaintNode(var PaintInfo: TVTPaintInfo); override; public constructor Create(AOwner: TComponent; AParent: TWinControl); reintroduce; procedure AfterConstruction; override; procedure UpdateView; function MouseOnGrid(X, Y: LongInt): Boolean; // Returns height of all the header rows. function GetHeaderHeight: Integer; function GetVisibleIndexes: TRange; property GridVertLine: Boolean read GetGridVertLine write SetGridVertLine; property GridHorzLine: Boolean read GetGridHorzLine write SetGridHorzLine; end; { TColumnsFileViewVTV } TColumnsFileViewVTV = class(TFileViewWithMainCtrl) private FColumnsSortDirections: TColumnsSortDirections; FFileNameColumn: Integer; FExtensionColumn: Integer; pmColumnsMenu: TPopupMenu; dgPanel: TColumnsDrawTree; function GetColumnsClass: TPanelColumnsClass; procedure SetRowCount(Count: Integer); procedure SetFilesDisplayItems; procedure SetColumns; procedure MakeVisible(Node: PVirtualNode); procedure DoSelectionChanged(Node: PVirtualNode); overload; {en Format and cache all columns strings for the file. } procedure MakeColumnsStrings(AFile: TDisplayFile); procedure MakeColumnsStrings(AFile: TDisplayFile; ColumnsClass: TPanelColumnsClass); procedure ClearAllColumnsStrings; procedure EachViewUpdateColumns(AFileView: TFileView; UserData: Pointer); {en Translates file sorting by functions to sorting directions of columns. } procedure SetColumnsSortDirections; {en Checks which file properties are needed for displaying. } function GetFilePropertiesNeeded: TFilePropertiesTypes; // -- Events -------------------------------------------------------------- procedure dgPanelAdvancedHeaderDraw(Sender: TVTHeader; var PaintInfo: THeaderPaintInfo; const Elements: THeaderPaintElements); procedure dgPanelAfterItemPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; const ItemRect: TRect); procedure dgPanelBeforeItemErase(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; const ItemRect: TRect; var ItemColor: TColor; var EraseAction: TItemEraseAction); procedure dgPanelHeaderDrawQueryElements(Sender: TVTHeader; var PaintInfo: THeaderPaintInfo; var Elements: THeaderPaintElements); procedure dgPanelDragOver(Sender: TBaseVirtualTree; Source: TObject; Shift: TShiftState; State: TDragState; const Pt: TPoint; Mode: TDropMode; var Effect: LongWord; var Accept: Boolean); procedure dgPanelDragDrop(Sender: TBaseVirtualTree; Source: TObject; Formats: TFormatArray; Shift: TShiftState; const Pt: TPoint; var Effect: LongWord; Mode: TDropMode); procedure dgPanelFocusChanged(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex); procedure dgPanelFocusChanging(Sender: TBaseVirtualTree; OldNode, NewNode: PVirtualNode; OldColumn, NewColumn: TColumnIndex; var Allowed: Boolean); procedure dgPanelHeaderClick(Sender: TVTHeader; Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure dgPanelMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); procedure dgPanelMouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); procedure dgPanelScroll(Sender: TBaseVirtualTree; DeltaX, DeltaY: Integer); procedure dgPanelResize(Sender: TObject); procedure ColumnsMenuClick(Sender: TObject); protected procedure CreateDefault(AOwner: TWinControl); override; procedure BeforeMakeFileList; override; procedure ClearAfterDragDrop; override; procedure DisplayFileListChanged; override; procedure DoFileUpdated(AFile: TDisplayFile; UpdatedProperties: TFilePropertiesTypes = []); override; procedure DoHandleKeyDown(var Key: Word; Shift: TShiftState); override; procedure DoMainControlShowHint(FileIndex: PtrInt; X, Y: Integer); override; procedure DoUpdateView; override; function GetActiveFileIndex: PtrInt; override; function GetFileIndexFromCursor(X, Y: Integer; out AtFileList: Boolean): PtrInt; override; function GetFileRect(FileIndex: PtrInt): TRect; override; function GetVisibleFilesIndexes: TRange; override; procedure RedrawFile(FileIndex: PtrInt); override; procedure RedrawFile(DisplayFile: TDisplayFile); override; procedure RedrawFiles; override; procedure SetActiveFile(FileIndex: PtrInt); override; procedure SetSorting(const NewSortings: TFileSortings); override; procedure ShowRenameFileEdit(AFile: TFile); override; public ActiveColm: String; ActiveColmSlave: TPanelColumnsClass; isSlave:boolean; //--------------------- constructor Create(AOwner: TWinControl; AFileSource: IFileSource; APath: String; AFlags: TFileViewFlags = []); override; constructor Create(AOwner: TWinControl; AFileView: TFileView; AFlags: TFileViewFlags = []); override; constructor Create(AOwner: TWinControl; AConfig: TIniFileEx; ASectionName: String; ATabIndex: Integer; AFlags: TFileViewFlags = []); override; constructor Create(AOwner: TWinControl; AConfig: TXmlConfig; ANode: TXmlNode; AFlags: TFileViewFlags = []); override; destructor Destroy; override; function Clone(NewParent: TWinControl): TColumnsFileViewVTV; override; procedure CloneTo(FileView: TFileView); override; procedure AddFileSource(aFileSource: IFileSource; aPath: String); override; procedure LoadConfiguration(Section: String; TabIndex: Integer); override; procedure LoadConfiguration(AConfig: TXmlConfig; ANode: TXmlNode); override; procedure SaveConfiguration(AConfig: TXmlConfig; ANode: TXmlNode); override; procedure UpdateColumnsView; end; implementation uses LCLProc, Clipbrd, uLng, uGlobs, uPixmapManager, uDebug, uDCUtils, math, fMain, fOptions, uOrderedFileView, uFileSourceProperty, fColumnsSetConf, uKeyboard, uFileFunctions, uFormCommands, fOptionsCustomColumns; type TEachViewCallbackReason = (evcrUpdateColumns); TEachViewCallbackMsg = record Reason: TEachViewCallbackReason; UpdatedColumnsSetName: String; NewColumnsSetName: String; // If columns name renamed end; PEachViewCallbackMsg = ^TEachViewCallbackMsg; procedure TColumnsFileViewVTV.SetSorting(const NewSortings: TFileSortings); begin inherited SetSorting(NewSortings); SetColumnsSortDirections; end; procedure TColumnsFileViewVTV.LoadConfiguration(Section: String; TabIndex: Integer); var ColumnsClass: TPanelColumnsClass; SortCount: Integer; SortColumn: Integer; SortDirection: uFileSorting.TSortDirection; i: Integer; sIndex: String; NewSorting: TFileSortings = nil; Column: TPanelColumn; SortFunctions: TFileFunctions; begin sIndex := IntToStr(TabIndex); ActiveColm := gIni.ReadString(Section, sIndex + '_columnsset', 'Default'); // Load sorting options. ColumnsClass := GetColumnsClass; SortCount := gIni.ReadInteger(Section, sIndex + '_sortcount', 0); for i := 0 to SortCount - 1 do begin SortColumn := gIni.ReadInteger(Section, sIndex + '_sortcolumn' + IntToStr(i), -1); if (SortColumn >= 0) and (SortColumn < ColumnsClass.ColumnsCount) then begin Column := ColumnsClass.GetColumnItem(SortColumn); if Assigned(Column) then begin SortFunctions := Column.GetColumnFunctions; SortDirection := uFileSorting.TSortDirection(gIni.ReadInteger(Section, sIndex + '_sortdirection' + IntToStr(i), Integer(sdNone))); AddSorting(NewSorting, SortFunctions, SortDirection); end; end; end; inherited SetSorting(NewSorting); end; procedure TColumnsFileViewVTV.LoadConfiguration(AConfig: TXmlConfig; ANode: TXmlNode); var ColumnsClass: TPanelColumnsClass; SortColumn: Integer; SortDirection: uFileSorting.TSortDirection; ColumnsViewNode: TXmlNode; NewSorting: TFileSortings = nil; Column: TPanelColumn; SortFunctions: TFileFunctions; begin inherited LoadConfiguration(AConfig, ANode); // Try to read new view-specific node. ColumnsViewNode := AConfig.FindNode(ANode, 'ColumnsView'); if Assigned(ColumnsViewNode) then ANode := ColumnsViewNode; ActiveColm := AConfig.GetValue(ANode, 'ColumnsSet', 'Default'); // Load sorting options. ColumnsClass := GetColumnsClass; ANode := ANode.FindNode('Sorting'); if Assigned(ANode) then begin ANode := ANode.FirstChild; while Assigned(ANode) do begin if ANode.CompareName('Sort') = 0 then begin if AConfig.TryGetValue(ANode, 'Column', SortColumn) and (SortColumn >= 0) and (SortColumn < ColumnsClass.ColumnsCount) then begin Column := ColumnsClass.GetColumnItem(SortColumn); if Assigned(Column) then begin SortFunctions := Column.GetColumnFunctions; SortDirection := uFileSorting.TSortDirection(AConfig.GetValue(ANode, 'Direction', Integer(sdNone))); AddSorting(NewSorting, SortFunctions, SortDirection); end; end else DCDebug('Invalid entry in configuration: ' + AConfig.GetPathFromNode(ANode) + '.'); end; ANode := ANode.NextSibling; end; inherited SetSorting(NewSorting); end; end; procedure TColumnsFileViewVTV.SaveConfiguration(AConfig: TXmlConfig; ANode: TXmlNode); begin inherited SaveConfiguration(AConfig, ANode); AConfig.SetAttr(ANode, 'Type', 'columns'); ANode := AConfig.FindNode(ANode, 'ColumnsView', True); AConfig.ClearNode(ANode); AConfig.SetValue(ANode, 'ColumnsSet', ActiveColm); end; procedure TColumnsFileViewVTV.dgPanelDragOver(Sender: TBaseVirtualTree; Source: TObject; Shift: TShiftState; State: TDragState; const Pt: TPoint; Mode: TDropMode; var Effect: LongWord; var Accept: Boolean); begin MainControlDragOver(Sender, Source, Pt.x, Pt.y, State, Accept); end; procedure TColumnsFileViewVTV.dgPanelDragDrop(Sender: TBaseVirtualTree; Source: TObject; Formats: TFormatArray; Shift: TShiftState; const Pt: TPoint; var Effect: LongWord; Mode: TDropMode); begin MainControlDragDrop(Sender, Source, Pt.x, Pt.y); end; procedure TColumnsFileViewVTV.dgPanelFocusChanged(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex); begin dgPanel.TreeOptions.AutoOptions := dgPanel.TreeOptions.AutoOptions - [toDisableAutoscrollOnFocus]; if Assigned(Node) then DoFileIndexChanged(Node^.Index); end; procedure TColumnsFileViewVTV.dgPanelFocusChanging(Sender: TBaseVirtualTree; OldNode, NewNode: PVirtualNode; OldColumn, NewColumn: TColumnIndex; var Allowed: Boolean); begin if (OldColumn <> NewColumn) and (OldNode = NewNode) then dgPanel.TreeOptions.AutoOptions := dgPanel.TreeOptions.AutoOptions + [toDisableAutoscrollOnFocus] else dgPanel.TreeOptions.AutoOptions := dgPanel.TreeOptions.AutoOptions - [toDisableAutoscrollOnFocus]; end; procedure TColumnsFileViewVTV.dgPanelHeaderClick(Sender: TVTHeader; Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var ShiftState : TShiftState; SortingDirection : uFileSorting.TSortDirection; ColumnsClass: TPanelColumnsClass; PanelColumn: TPanelColumn; NewSorting: TFileSortings; SortFunctions: TFileFunctions; I : Integer; Point: TPoint; MI: TMenuItem; begin case Button of mbLeft: begin ColumnsClass := GetColumnsClass; PanelColumn := ColumnsClass.GetColumnItem(Column); if Assigned(PanelColumn) then begin NewSorting := Sorting; SortFunctions := PanelColumn.GetColumnFunctions; ShiftState := GetKeyShiftStateEx; if [ssShift, ssCtrl] * ShiftState = [] then begin SortingDirection := GetSortDirection(NewSorting, SortFunctions); if SortingDirection = sdNone then SortingDirection := uFileSorting.sdAscending else SortingDirection := ReverseSortDirection(SortingDirection); NewSorting := nil; end else begin SortingDirection := uFileSorting.sdAscending; end; AddOrUpdateSorting(NewSorting, SortFunctions, SortingDirection); SetSorting(NewSorting); end; end; mbRight: begin //Load Columns into menu pmColumnsMenu.Items.Clear; if ColSet.Items.Count>0 then begin For I:=0 to ColSet.Items.Count-1 do begin MI:=TMenuItem.Create(pmColumnsMenu); MI.Tag:=I; MI.Caption:=ColSet.Items[I]; MI.OnClick:=@ColumnsMenuClick; pmColumnsMenu.Items.Add(MI); end; end; //- MI:=TMenuItem.Create(pmColumnsMenu); MI.Caption:='-'; pmColumnsMenu.Items.Add(MI); //Configure this custom columns MI:=TMenuItem.Create(pmColumnsMenu); MI.Tag:=1000; MI.Caption:=rsMenuConfigureThisCustomColumn; MI.OnClick:=@ColumnsMenuClick; pmColumnsMenu.Items.Add(MI); //Configure custom columns MI:=TMenuItem.Create(pmColumnsMenu); MI.Tag:=1001; MI.Caption:=rsMenuConfigureCustomColumns; MI.OnClick:=@ColumnsMenuClick; pmColumnsMenu.Items.Add(MI); Point := dgPanel.ClientToScreen(Classes.Point(0,0)); Point.X := Point.X + X - 50; Point.Y := Point.Y + dgPanel.GetHeaderHeight; pmColumnsMenu.PopUp(Point.X, Point.Y); end; end; end; procedure TColumnsFileViewVTV.dgPanelAdvancedHeaderDraw(Sender: TVTHeader; var PaintInfo: THeaderPaintInfo; const Elements: THeaderPaintElements); var SortingDirection: uFileSorting.TSortDirection; TitleX: Integer; ColumnsSet: TPanelColumnsClass; aCol: Integer; iTextTop: Integer; s: String; aRect: TRect; begin aCol := PaintInfo.Column.Index; aRect := PaintInfo.PaintRectangle; // PaintRectangle is reduced by 2 pixels on each side even with owner draw, // so revert this change. InflateRect(aRect, 2, 2); ColumnsSet := GetColumnsClass; iTextTop := aRect.Top + (PaintInfo.Column.Owner.Header.Height - PaintInfo.TargetCanvas.TextHeight('Wg')) div 2; TitleX := 0; s := ColumnsSet.GetColumnTitle(ACol); SortingDirection := FColumnsSortDirections[ACol]; if SortingDirection <> sdNone then begin TitleX := TitleX + gIconsSize; PixMapManager.DrawBitmap( PixMapManager.GetIconBySortingDirection(SortingDirection), PaintInfo.TargetCanvas, aRect.Left, aRect.Top + (PaintInfo.Column.Owner.Header.Height - gIconsSize) div 2); end; TitleX := max(TitleX, 4); if gCutTextToColWidth then begin if (aRect.Right - aRect.Left) < TitleX then // Column too small to display text. Exit else while PaintInfo.TargetCanvas.TextWidth(s) - ((aRect.Right - aRect.Left) - TitleX) > 0 do UTF8Delete(s, UTF8Length(s), 1); end; PaintInfo.TargetCanvas.Brush.Style := bsClear; PaintInfo.TargetCanvas.TextOut(aRect.Left + TitleX, iTextTop, s); end; procedure TColumnsFileViewVTV.dgPanelAfterItemPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; const ItemRect: TRect); var ColumnsSet: TPanelColumnsClass; IsFocused: Boolean; procedure DrawLines; begin // Draw focus rect. if not gUseFrameCursor and IsFocused and Active then begin TargetCanvas.Pen.Color := ColumnsSet.GetCursorBorderColor; TargetCanvas.Brush.Color := ColumnsSet.GetCursorBorderColor; TargetCanvas.FrameRect(ItemRect); end; end; begin IsFocused := Node = dgPanel.FocusedNode; ColumnsSet := GetColumnsClass; DrawLines; end; procedure TColumnsFileViewVTV.dgPanelBeforeItemErase(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; const ItemRect: TRect; var ItemColor: TColor; var EraseAction: TItemEraseAction); begin EraseAction := eaNone; end; procedure TColumnsFileViewVTV.dgPanelHeaderDrawQueryElements(Sender: TVTHeader; var PaintInfo: THeaderPaintInfo; var Elements: THeaderPaintElements); begin Elements := [hpeSortGlyph, hpeText]; end; procedure TColumnsFileViewVTV.dgPanelMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); var I: Integer; begin Handled:= True; if not IsLoadingFileList then begin case gScrollMode of smLineByLine: for I:= 1 to gWheelScrollLines do dgPanel.Perform(LM_VSCROLL, SB_LINEUP, 0); smPageByPage: dgPanel.Perform(LM_VSCROLL, SB_PAGEUP, 0); else Handled:= False; end; end; end; procedure TColumnsFileViewVTV.dgPanelMouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); var I: Integer; begin Handled:= True; if not IsLoadingFileList then begin case gScrollMode of smLineByLine: for I:= 1 to gWheelScrollLines do dgPanel.Perform(LM_VSCROLL, SB_LINEDOWN, 0); smPageByPage: dgPanel.Perform(LM_VSCROLL, SB_PAGEDOWN, 0); else Handled:= False; end; end; end; procedure TColumnsFileViewVTV.dgPanelScroll(Sender: TBaseVirtualTree; DeltaX, DeltaY: Integer); begin if DeltaY <> 0 then Notify([fvnVisibleFilePropertiesChanged]); end; procedure TColumnsFileViewVTV.dgPanelResize(Sender: TObject); begin Notify([fvnVisibleFilePropertiesChanged]); end; procedure TColumnsFileViewVTV.ShowRenameFileEdit(AFile: TFile); var ALeft, ATop, AWidth, AHeight: Integer; aRect: TRect; begin if FFileNameColumn <> -1 then begin if not edtRename.Visible then begin edtRename.Font.Name := GetColumnsClass.GetColumnFontName(FFileNameColumn); edtRename.Font.Size := GetColumnsClass.GetColumnFontSize(FFileNameColumn); edtRename.Font.Style := GetColumnsClass.GetColumnFontStyle(FFileNameColumn); aRect := dgPanel.GetDisplayRect(dgPanel.FocusedNode, FFileNameColumn, False); ATop := aRect.Top - 2; ALeft := aRect.Left; if gShowIcons <> sim_none then Inc(ALeft, gIconsSize + 2); AWidth := aRect.Right - aRect.Left; if Succ(FFileNameColumn) = FExtensionColumn then Inc(AWidth, dgPanel.Header.Columns[FExtensionColumn].Width); AHeight := dgPanel.FocusedNode^.NodeHeight + 4; edtRename.SetBounds(ALeft, ATop, AWidth, AHeight); end; inherited ShowRenameFileEdit(AFile); end; end; procedure TColumnsFileViewVTV.RedrawFile(FileIndex: PtrInt); begin dgPanel.InvalidateNode(PVirtualNode(FFiles[FileIndex].DisplayItem)); end; procedure TColumnsFileViewVTV.RedrawFile(DisplayFile: TDisplayFile); begin dgPanel.InvalidateNode(PVirtualNode(DisplayFile.DisplayItem)); end; procedure TColumnsFileViewVTV.SetColumnsSortDirections; var Columns: TPanelColumnsClass; function SetSortDirection(ASortFunction: TFileFunction; ASortDirection: uFileSorting.TSortDirection; Overwrite: Boolean): Boolean; var k, l: Integer; ColumnFunctions: TFileFunctions; begin for k := 0 to Columns.Count - 1 do begin ColumnFunctions := Columns.GetColumnItem(k).GetColumnFunctions; for l := 0 to Length(ColumnFunctions) - 1 do if ColumnFunctions[l] = ASortFunction then begin if Overwrite or (FColumnsSortDirections[k] = sdNone) then begin FColumnsSortDirections[k] := ASortDirection; Exit(True); end; end; end; Result := False; end; var i, j: Integer; ASortings: TFileSortings; begin Columns := GetColumnsClass; ASortings := Sorting; SetLength(FColumnsSortDirections, Columns.Count); for i := 0 to Length(FColumnsSortDirections) - 1 do FColumnsSortDirections[i] := sdNone; for i := 0 to Length(ASortings) - 1 do begin for j := 0 to Length(ASortings[i].SortFunctions) - 1 do begin // Search for the column containing the sort function and add sorting // by that column. If function is Name and it is not found try searching // for NameNoExtension + Extension and vice-versa. if not SetSortDirection(ASortings[i].SortFunctions[j], ASortings[i].SortDirection, True) then begin if ASortings[i].SortFunctions[j] = fsfName then begin SetSortDirection(fsfNameNoExtension, ASortings[i].SortDirection, False); SetSortDirection(fsfExtension, ASortings[i].SortDirection, False); end else if ASortings[i].SortFunctions[j] in [fsfNameNoExtension, fsfExtension] then begin SetSortDirection(fsfName, ASortings[i].SortDirection, False); end; end; end; end; end; procedure TColumnsFileViewVTV.SetFilesDisplayItems; var Node: PVirtualNode; Index: Integer = 0; begin Node := dgPanel.GetFirstNoInit; while Assigned(Node) do begin FFiles[Index].DisplayItem := Node; Inc(Index); Node := Node^.NextSibling; end; end; function TColumnsFileViewVTV.GetFilePropertiesNeeded: TFilePropertiesTypes; var i, j: Integer; ColumnsClass: TPanelColumnsClass; Column: TPanelColumn; FileFunctionsUsed: TFileFunctions; begin // By default always use some properties. Result := [fpName, fpSize, // For info panel (total size, selected size) fpAttributes, // For distinguishing directories fpLink, // For distinguishing directories (link to dir) and link icons fpModificationTime // For selecting/coloring files (by SearchTemplate) ]; ColumnsClass := GetColumnsClass; FFileNameColumn := -1; FExtensionColumn := -1; // Scan through all columns. for i := 0 to ColumnsClass.Count - 1 do begin Column := ColumnsClass.GetColumnItem(i); FileFunctionsUsed := Column.GetColumnFunctions; if Length(FileFunctionsUsed) > 0 then begin // Scan through all functions in the column. for j := Low(FileFunctionsUsed) to High(FileFunctionsUsed) do begin // Add file properties needed to display the function. Result := Result + TFileFunctionToProperty[FileFunctionsUsed[j]]; if (FFileNameColumn = -1) and (FileFunctionsUsed[j] in [fsfName, fsfNameNoExtension]) then FFileNameColumn := i; if (FExtensionColumn = -1) and (FileFunctionsUsed[j] in [fsfExtension]) then FExtensionColumn := i; end; end; end; end; function TColumnsFileViewVTV.GetFileRect(FileIndex: PtrInt): TRect; begin Result := dgPanel.GetDisplayRect(PVirtualNode(FFiles[FileIndex].DisplayItem), 0, False); end; function TColumnsFileViewVTV.GetVisibleFilesIndexes: TRange; begin Result := dgPanel.GetVisibleIndexes; end; procedure TColumnsFileViewVTV.SetRowCount(Count: Integer); begin if Count <> dgPanel.RootNodeCount then begin FUpdatingActiveFile := True; dgPanel.BeginUpdate; // If new node count is less then first delete all nodes and then create // new ones, because deleting only some nodes is much slower then deleting all. if Count < dgPanel.RootNodeCount then dgPanel.RootNodeCount := 0; dgPanel.RootNodeCount := Count; dgPanel.EndUpdate; FUpdatingActiveFile := False; end; end; procedure TColumnsFileViewVTV.SetColumns; var x: Integer; ColumnsClass: TPanelColumnsClass; col: TVirtualTreeColumn; begin // setup column widths ColumnsClass := GetColumnsClass; dgPanel.Header.Columns.Clear; dgPanel.Header.Columns.BeginUpdate; try for x:= 0 to ColumnsClass.ColumnsCount - 1 do begin col := dgPanel.Header.Columns.Add; col.Width := ColumnsClass.GetColumnWidth(x); //col.Text := ColumnsClass.GetColumnTitle(x); // I think not needed, as we draw text ourselves. col.Margin := 0; col.Spacing := 0; end; if gAutoFillColumns then begin if (gAutoSizeColumn = 0) then dgPanel.Header.AutoSizeIndex := gAutoSizeColumn else dgPanel.Header.AutoSizeIndex := col.Index; end; finally dgPanel.Header.Columns.EndUpdate; end; end; procedure TColumnsFileViewVTV.MakeVisible(Node: PVirtualNode); begin dgPanel.ScrollIntoView(Node, False, False); end; procedure TColumnsFileViewVTV.SetActiveFile(FileIndex: PtrInt); begin dgPanel.FocusedNode := PVirtualNode(FFiles[FileIndex].DisplayItem); end; procedure TColumnsFileViewVTV.RedrawFiles; begin dgPanel.Invalidate; end; procedure TColumnsFileViewVTV.UpdateColumnsView; var ColumnsClass: TPanelColumnsClass; OldFilePropertiesNeeded: TFilePropertiesTypes; begin ClearAllColumnsStrings; // If the ActiveColm set doesn't exist this will retrieve either // the first set or the default set. ColumnsClass := GetColumnsClass; // Set name in case a different set was loaded. ActiveColm := ColumnsClass.Name; SetColumns; SetColumnsSortDirections; dgPanel.UpdateView; OldFilePropertiesNeeded := FilePropertiesNeeded; FilePropertiesNeeded := GetFilePropertiesNeeded; if FilePropertiesNeeded >= OldFilePropertiesNeeded then begin Notify([fvnVisibleFilePropertiesChanged]); end; end; procedure TColumnsFileViewVTV.ColumnsMenuClick(Sender: TObject); var frmColumnsSetConf: TfColumnsSetConf; Index: Integer; Msg: TEachViewCallbackMsg; begin Case (Sender as TMenuItem).Tag of 1000: //This begin frmColumnsSetConf := TfColumnsSetConf.Create(nil); try Msg.Reason := evcrUpdateColumns; Msg.UpdatedColumnsSetName := ActiveColm; {EDIT Set} frmColumnsSetConf.edtNameofColumnsSet.Text:=ColSet.GetColumnSet(ActiveColm).CurrentColumnsSetName; Index:=ColSet.Items.IndexOf(ActiveColm); frmColumnsSetConf.lbNrOfColumnsSet.Caption:=IntToStr(1 + Index); frmColumnsSetConf.Tag:=Index; frmColumnsSetConf.SetColumnsClass(GetColumnsClass); {EDIT Set} if frmColumnsSetConf.ShowModal = mrOK then begin // Force saving changes to config file. SaveGlobs; Msg.NewColumnsSetName := frmColumnsSetConf.GetColumnsClass.Name; frmMain.ForEachView(@EachViewUpdateColumns, @Msg); end; finally FreeAndNil(frmColumnsSetConf); end; end; 1001: //All columns begin ShowOptions(TfrmOptionsCustomColumns); end; else begin ActiveColm:=ColSet.Items[(Sender as TMenuItem).Tag]; UpdateColumnsView; RedrawFiles; end; end; end; constructor TColumnsFileViewVTV.Create(AOwner: TWinControl; AFileSource: IFileSource; APath: String; AFlags: TFileViewFlags = []); begin ActiveColm := 'Default'; inherited Create(AOwner, AFileSource, APath, AFlags); end; constructor TColumnsFileViewVTV.Create(AOwner: TWinControl; AFileView: TFileView; AFlags: TFileViewFlags = []); begin inherited Create(AOwner, AFileView, AFlags); end; constructor TColumnsFileViewVTV.Create(AOwner: TWinControl; AConfig: TIniFileEx; ASectionName: String; ATabIndex: Integer; AFlags: TFileViewFlags = []); begin inherited Create(AOwner, AConfig, ASectionName, ATabIndex, AFlags); end; constructor TColumnsFileViewVTV.Create(AOwner: TWinControl; AConfig: TXmlConfig; ANode: TXmlNode; AFlags: TFileViewFlags = []); begin inherited Create(AOwner, AConfig, ANode, AFlags); end; procedure TColumnsFileViewVTV.CreateDefault(AOwner: TWinControl); begin DCDebug('TColumnsFileViewVTV.Create components'); inherited CreateDefault(AOwner); FFileNameColumn := -1; FExtensionColumn := -1; // -- other components dgPanel:=TColumnsDrawTree.Create(Self, Self); MainControl := dgPanel; // --- dgPanel.OnDragOver := @dgPanelDragOver; dgPanel.OnDragDrop:= @dgPanelDragDrop; dgPanel.OnAdvancedHeaderDraw:=@dgPanelAdvancedHeaderDraw; dgPanel.OnAfterItemPaint := @dgPanelAfterItemPaint; dgPanel.OnBeforeItemErase := @dgPanelBeforeItemErase; dgPanel.OnFocusChanged:=@dgPanelFocusChanged; dgPanel.OnFocusChanging:=@dgPanelFocusChanging; dgPanel.OnHeaderDrawQueryElements:=@dgPanelHeaderDrawQueryElements; dgPanel.OnHeaderClick:=@dgPanelHeaderClick; dgPanel.OnMouseWheelUp := @dgPanelMouseWheelUp; dgPanel.OnMouseWheelDown := @dgPanelMouseWheelDown; dgPanel.OnScroll:= @dgPanelScroll; dgpanel.OnResize:= @dgPanelResize; pmColumnsMenu := TPopupMenu.Create(Self); pmColumnsMenu.Parent := Self; end; destructor TColumnsFileViewVTV.Destroy; begin inherited Destroy; end; function TColumnsFileViewVTV.Clone(NewParent: TWinControl): TColumnsFileViewVTV; begin Result := TColumnsFileViewVTV.Create(NewParent, Self); end; procedure TColumnsFileViewVTV.CloneTo(FileView: TFileView); begin if Assigned(FileView) then begin inherited CloneTo(FileView); if FileView is TColumnsFileViewVTV then with FileView as TColumnsFileViewVTV do begin FColumnsSortDirections := Self.FColumnsSortDirections; ActiveColm := Self.ActiveColm; ActiveColmSlave := nil; // set to nil because only used in preview? isSlave := Self.isSlave; end; end; end; procedure TColumnsFileViewVTV.AddFileSource(aFileSource: IFileSource; aPath: String); begin inherited AddFileSource(aFileSource, aPath); end; procedure TColumnsFileViewVTV.BeforeMakeFileList; begin inherited; if gListFilesInThread then begin // Display info that file list is being loaded. UpdateInfoPanel; end; end; procedure TColumnsFileViewVTV.ClearAfterDragDrop; begin inherited ClearAfterDragDrop; // Reset state. TODO: Check if this is needed on any widgetset. dgPanel.TreeStates := dgPanel.TreeStates - [tsLeftButtonDown, tsMiddleButtonDown, tsRightButtonDown, tsVCLDragging]; end; procedure TColumnsFileViewVTV.DisplayFileListChanged; var AFocused: Boolean = False; Node: PVirtualNode; begin // Update grid row count. SetRowCount(FFiles.Count); SetFilesDisplayItems; RedrawFiles; if SetActiveFileNow(RequestedActiveFile) then RequestedActiveFile := '' else begin // Requested file was not found, restore position to last active file. if not SetActiveFileNow(LastActiveFile) then begin if FLastActiveFileIndex >= dgPanel.RootNodeCount then begin FUpdatingActiveFile := True; dgPanel.FocusedNode := dgPanel.GetLastNoInit; FUpdatingActiveFile := False; SetLastActiveFile(FLastActiveFileIndex); AFocused := True; end else if FLastActiveFileIndex >= 0 then begin Node := dgPanel.GetFirstNoInit; while Assigned(Node) do begin if Node^.Index = FLastActiveFileIndex then begin FUpdatingActiveFile := True; dgPanel.FocusedNode := Node; FUpdatingActiveFile := False; SetLastActiveFile(Node^.Index); AFocused := True; Break; end; Node := Node^.NextSibling; end; end; if not AFocused then dgPanel.FocusedNode := dgPanel.GetFirstNoInit; // At creation the control has default size (100, 200). // If the first column is wider than ClientWidth then VTV scrolls // to the right edge of the column. So, we scroll back here. // dgPanel.OffsetX := 0; end; end; Notify([fvnVisibleFilePropertiesChanged]); inherited; end; procedure TColumnsFileViewVTV.MakeColumnsStrings(AFile: TDisplayFile); begin MakeColumnsStrings(AFile, GetColumnsClass); end; procedure TColumnsFileViewVTV.MakeColumnsStrings(AFile: TDisplayFile; ColumnsClass: TPanelColumnsClass); var ACol: Integer; begin AFile.DisplayStrings.Clear; for ACol := 0 to ColumnsClass.Count - 1 do begin AFile.DisplayStrings.Add(ColumnsClass.GetColumnItemResultString( ACol, AFile.FSFile, FileSource)); end; end; procedure TColumnsFileViewVTV.ClearAllColumnsStrings; var i: Integer; begin if Assigned(FAllDisplayFiles) then begin // Clear display strings in case columns have changed. for i := 0 to FAllDisplayFiles.Count - 1 do FAllDisplayFiles[i].DisplayStrings.Clear; end; end; procedure TColumnsFileViewVTV.EachViewUpdateColumns(AFileView: TFileView; UserData: Pointer); var ColumnsView: TColumnsFileViewVTV; PMsg: PEachViewCallbackMsg; begin if AFileView is TColumnsFileViewVTV then begin ColumnsView := TColumnsFileViewVTV(AFileView); PMsg := UserData; if ColumnsView.ActiveColm = PMsg^.UpdatedColumnsSetName then begin ColumnsView.ActiveColm := PMsg^.NewColumnsSetName; ColumnsView.UpdateColumnsView; ColumnsView.RedrawFiles; end; end; end; procedure TColumnsFileViewVTV.DoUpdateView; begin inherited DoUpdateView; UpdateColumnsView; end; function TColumnsFileViewVTV.GetActiveFileIndex: PtrInt; begin if Assigned(dgPanel.FocusedNode) then Result := dgPanel.FocusedNode^.Index else Result := InvalidFileIndex; end; function TColumnsFileViewVTV.GetColumnsClass: TPanelColumnsClass; begin if isSlave then Result := ActiveColmSlave else Result := ColSet.GetColumnSet(ActiveColm); end; function TColumnsFileViewVTV.GetFileIndexFromCursor(X, Y: Integer; out AtFileList: Boolean): PtrInt; var Node: PVirtualNode; begin Node := dgPanel.GetNodeAt(X, Y); if Assigned(Node) then Result := Node^.Index else Result := InvalidFileIndex; AtFileList := Y >= dgPanel.GetHeaderHeight; end; procedure TColumnsFileViewVTV.DoFileUpdated(AFile: TDisplayFile; UpdatedProperties: TFilePropertiesTypes); begin MakeColumnsStrings(AFile); inherited DoFileUpdated(AFile, UpdatedProperties); end; procedure TColumnsFileViewVTV.DoHandleKeyDown(var Key: Word; Shift: TShiftState); var Node, NextNode: PVirtualNode; aFile: TDisplayFile; begin case Key of VK_INSERT: begin if not IsEmpty then begin Node := dgPanel.FocusedNode; if IsActiveItemValid then begin InvertFileSelection(GetActiveDisplayFile, False); DoSelectionChanged(nil); end; NextNode := dgPanel.GetNextSiblingNoInit(Node); if (Node <> NextNode) and Assigned(NextNode) then dgPanel.FocusedNode := NextNode else dgPanel.InvalidateNode(Node); end; Key := 0; end; VK_LEFT: if (Shift = []) then begin if gLynxLike then ChangePathToParent(True) else dgPanel.OffsetX := dgPanel.OffsetX + 20; Key := 0; end; VK_RIGHT: if (Shift = []) then begin if gLynxLike then ChooseFile(GetActiveDisplayFile, True) else dgPanel.OffsetX := dgPanel.OffsetX - 20; Key := 0; end; VK_SPACE: if Shift * KeyModifiersShortcut = [] then begin Node := dgPanel.FocusedNode; if Assigned(Node) then begin aFile := dgPanel.GetNodeFile(Node); if IsItemValid(aFile) then begin if (aFile.FSFile.IsDirectory or aFile.FSFile.IsLinkToDirectory) and not aFile.Selected then begin CalculateSpace(aFile); end; InvertFileSelection(aFile, False); DoSelectionChanged(nil); end; if gSpaceMovesDown then begin NextNode := dgPanel.GetNextSiblingNoInit(Node); if (Node <> NextNode) and Assigned(NextNode) then dgPanel.FocusedNode := NextNode else dgPanel.InvalidateNode(Node); end else dgPanel.InvalidateNode(Node); Key := 0; end; end; end; inherited DoHandleKeyDown(Key, Shift); end; procedure TColumnsFileViewVTV.DoMainControlShowHint(FileIndex: PtrInt; X, Y: Integer); var aRect: TRect; iCol: Integer; AFile: TDisplayFile; begin AFile := FFiles[FileIndex]; aRect:= dgPanel.GetDisplayRect(PVirtualNode(AFile.DisplayItem), 0, False); iCol:= aRect.Right - aRect.Left - 8; if gShowIcons <> sim_none then Dec(iCol, gIconsSize); if iCol < dgPanel.Canvas.TextWidth(AFile.FSFile.Name) then // with file name dgPanel.Hint:= AFile.FSFile.Name else if (stm_only_large_name in gShowToolTipMode) then // don't show Exit else if not AFile.FSFile.IsDirectory then // without name dgPanel.Hint:= #32; end; procedure TColumnsFileViewVTV.DoSelectionChanged(Node: PVirtualNode); begin if Assigned(Node) then DoSelectionChanged(Node^.Index) else DoSelectionChanged(-1); end; { TColumnsDrawTree } constructor TColumnsDrawTree.Create(AOwner: TComponent; AParent: TWinControl); begin inherited Create(AOwner); ColumnsView := AParent as TColumnsFileViewVTV; DragType := dtVCL; HintMode := hmHint; Self.Parent := AParent; end; function TColumnsDrawTree.DetermineScrollDirections(X, Y: Integer): TScrollDirections; begin Result := inherited DetermineScrollDirections(X, Y) - [sdLeft, sdRight]; // Only scroll up, down. end; function TColumnsDrawTree.DoKeyAction(var CharCode: Word; var Shift: TShiftState): Boolean; begin Result := CharCode in [VK_HOME, VK_END, VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT]; end; procedure TColumnsDrawTree.AfterConstruction; begin inherited; RootNodeCount := 0; NodeDataSize := SizeOf(TColumnsDrawTreeRecord); Align := alClient; TreeOptions.AutoOptions := [toAutoScroll, toDisableAutoscrollHorizontal]; TreeOptions.MiscOptions := [toFullRowDrag]; // TODO: if no mouse action for middle button: include toWheelPanning TreeOptions.PaintOptions := [toShowBackground, toThemeAware, toUseBlendedImages, toGhostedIfUnfocused, toStaticBackground, toAlwaysHideSelection, toHideFocusRect]; TreeOptions.SelectionOptions := [toDisableDrawSelection, toExtendedFocus, toFullRowSelect]; TabStop := False; Margin := 0; TextMargin := 0; Indent := 0; AnimationDuration := 0; AutoScrollDelay := 500; // milliseconds AutoScrollInterval := 100; // milliseconds UpdateView; end; function TColumnsDrawTree.CanAutoScroll: Boolean; begin Result := inherited CanAutoScroll; if Header.States = [] then begin with ColumnsView do begin if IsMouseSelecting then Result := True; end; end; end; function TColumnsDrawTree.CanScroll(const ClientMousePos: TPoint): Boolean; begin Result := ColumnsView.IsMouseSelecting; end; procedure TColumnsDrawTree.CMHintShow(var Message: TCMHintShow); begin // Skip CMHintShow from VTV and do what TControl.CMHintShow does. DoOnShowHint(Message.HintInfo); end; procedure TColumnsDrawTree.UpdateView; function CalculateDefaultRowHeight: Integer; var OldFont, NewFont: TFont; i: Integer; MaxFontHeight: Integer = 0; CurrentHeight: Integer; ColumnsSet: TPanelColumnsClass; begin // Start with height of the icons. if gShowIcons <> sim_none then MaxFontHeight := gIconsSize; // Get columns settings. with (Parent as TColumnsFileViewVTV) do begin if not isSlave then ColumnsSet := ColSet.GetColumnSet(ActiveColm) else ColumnsSet := ActiveColmSlave; end; // Assign temporary font. OldFont := Canvas.Font; NewFont := TFont.Create; Canvas.Font := NewFont; // Search columns settings for the biggest font (in height). for i := 0 to ColumnsSet.Count - 1 do begin Canvas.Font.Name := ColumnsSet.GetColumnFontName(i); Canvas.Font.Style := ColumnsSet.GetColumnFontStyle(i); Canvas.Font.Size := ColumnsSet.GetColumnFontSize(i); CurrentHeight := Canvas.GetTextHeight('Wg'); MaxFontHeight := Max(MaxFontHeight, CurrentHeight); end; // Restore old font. Canvas.Font := OldFont; FreeAndNil(NewFont); Result := MaxFontHeight; end; function CalculateTabHeaderHeight: Integer; var OldFont: TFont; begin OldFont := Canvas.Font; Canvas.Font := Font; Result := Canvas.TextHeight('Wg'); Canvas.Font := OldFont; end; var TabHeaderHeight: Integer; TempRowHeight: Integer; Node: PVirtualNode; begin BeginUpdate; try if gInterfaceFlat then begin Header.Style := hsPlates; BorderStyle := bsNone; BorderWidth := 0; end else Header.Style := hsFlatButtons; GridVertLine:= gGridVertLine; GridHorzLine:= gGridHorzLine; // Calculate row height. TempRowHeight := CalculateDefaultRowHeight; if TempRowHeight > 0 then begin DefaultNodeHeight := TempRowHeight; // Set each node's height if changed. Node := GetFirstNoInit; if Assigned(Node) and (NodeHeight[Node] <> TempRowHeight) then SetAllRowsHeights(TempRowHeight); end; // Add additional space at the bottom so that the filelist doesn't jump at the end. // It happens when ClientHeight is not an exact multiplication of DefaultNodeHeight. BottomSpace := ClientHeight mod DefaultNodeHeight; Header.Options := [hoColumnResize, hoDblClickResize, hoDisableAnimatedResize, hoOwnerDraw]; // Set rows of header. if gTabHeader then begin Header.Options := Header.Options + [hoVisible]; TabHeaderHeight := Max(gIconsSize, CalculateTabHeaderHeight); TabHeaderHeight := TabHeaderHeight + 2; // for borders if not gInterfaceFlat then begin TabHeaderHeight := TabHeaderHeight + 2; // additional borders if not flat end; Header.DefaultHeight := TabHeaderHeight; end; if gAutoFillColumns then Header.Options := Header.Options + [hoAutoResize, hoAutoSpring]; finally EndUpdate; end; end; procedure TColumnsDrawTree.WMKeyDown(var Message: TLMKeyDown); var Node, Temp: PVirtualNode; Offset: Integer; SavedKey: Word; Shift: TShiftState; begin Shift := KeyDataToShiftState(Message.KeyData); SavedKey := Message.CharCode; if ColumnsView.IsLoadingFileList then begin ColumnsView.HandleKeyDownWhenLoading(Message.CharCode, Shift); Exit; end; // Set RangeSelecting before cursor is moved. ColumnsView.FRangeSelecting := (ssShift in Shift) and (SavedKey in [VK_HOME, VK_END, VK_PRIOR, VK_NEXT]); // Special case for selection with shift key (works like VK_INSERT) if (SavedKey in [VK_UP, VK_DOWN]) and (ssShift in Shift) then ColumnsView.InvertActiveFile; // Override scrolling with PageUp, PageDown because VirtualTreeView scrolls too much. case SavedKey of VK_PRIOR: begin Offset := 0; // If there's no focused node then just take the very first one. if FocusedNode = nil then Node := GetFirstNoInit else begin // Go up as many nodes as comprise together a size of ClientHeight. Node := FocusedNode; Temp := Node; while Assigned(Temp) do begin Inc(Offset, NodeHeight[Temp]); if Offset >= ClientHeight then Break; Node := Temp; Temp := GetPreviousSiblingNoInit(Temp); end; end; FocusedNode := Node; Message.CharCode := 0; end; VK_NEXT: begin Offset := 0; // If there's no focused node then just take the very last one. if FocusedNode = nil then Node := GetLastNoInit else begin // Go down as many nodes as comprise together a size of ClientHeight. Node := FocusedNode; Temp := Node; while Assigned(Temp) do begin Inc(Offset, NodeHeight[Temp]); if Offset >= ClientHeight then Break; Node := Temp; Temp := GetNextSiblingNoInit(Temp); end; end; FocusedNode := Node; //if OffsetY mod DefaultNodeHeight <> 0 then // OffsetY := OffsetY - ClientHeight mod DefaultNodeHeight; Message.CharCode := 0; end; {$IFDEF LCLGTK2} // Workaround for GTK2 - up and down arrows moving through controls. VK_UP, VK_DOWN: begin Node := FocusedNode; if ((Node = GetLastNoInit) and (Key = VK_DOWN)) or ((Node = GetFirstNoInit) and (Key = VK_UP)) then Message.CharCode := 0; end; {$ENDIF} end; inherited WMKeyDown(Message); if (ColumnsView.FRangeSelecting) and Assigned(FocusedNode) then ColumnsView.Selection(SavedKey, FocusedNode^.Index); end; procedure TColumnsDrawTree.InitializeWnd; begin inherited InitializeWnd; ColumnsView.InitializeDragDropEx(Self); end; procedure TColumnsDrawTree.FinalizeWnd; begin ColumnsView.FinalizeDragDropEx(Self); inherited FinalizeWnd; end; procedure TColumnsDrawTree.DoPaintNode(var PaintInfo: TVTPaintInfo); var //shared variables s: string; iTextTop: Integer; AFile: TDisplayFile; FileSourceDirectAccess: Boolean; ColumnsSet: TPanelColumnsClass; IsFocused: Boolean; aRect: TRect; aCol: TColumnIndex; //------------------------------------------------------ //begin subprocedures //------------------------------------------------------ procedure DrawIconCell; //------------------------------------------------------ var Y: Integer; IconID: PtrInt; oldClipping: Boolean; begin if (gShowIcons <> sim_none) then begin IconID := AFile.IconID; // Draw default icon if there is no icon for the file. if IconID = -1 then IconID := PixMapManager.GetDefaultIcon(AFile.FSFile); // center icon vertically Y:= aRect.Top + (PaintInfo.Node^.NodeHeight - gIconsSize) div 2; // Draw icon for a file PixMapManager.DrawBitmap(IconID, PaintInfo.Canvas, aRect.Left + 1, Y ); // Draw overlay icon for a file if needed if gIconOverlays then begin PixMapManager.DrawBitmapOverlay(AFile, FileSourceDirectAccess, PaintInfo.Canvas, aRect.Left + 1, Y ); end; end; s := AFile.DisplayStrings.Strings[ACol]; if gCutTextToColWidth then begin Y:= ((aRect.Right - aRect.Left) - 4 - PaintInfo.Canvas.TextWidth('W')); if (gShowIcons <> sim_none) then Y:= Y - gIconsSize; if PaintInfo.Canvas.TextWidth(s) - Y > 0 then begin repeat IconID:= UTF8Length(s); UTF8Delete(s, IconID, 1); until (PaintInfo.Canvas.TextWidth(s) - Y < 1) or (IconID = 0); if (IconID > 0) then begin s:= UTF8Copy(s, 1, IconID - 3); if gDirBrackets and (AFile.FSFile.IsDirectory or AFile.FSFile.IsLinkToDirectory) then s:= s + '..]' else s:= s + '...'; end; end; end; oldClipping := PaintInfo.Canvas.Clipping; //PaintInfo.Canvas.Clipping := False; if (gShowIcons <> sim_none) then PaintInfo.Canvas.TextOut(aRect.Left + gIconsSize + 4, iTextTop, s) else PaintInfo.Canvas.TextOut(aRect.Left + 2, iTextTop, s); // PaintInfo.Canvas.Clipping := oldClipping; end; //of DrawIconCell //------------------------------------------------------ procedure DrawOtherCell; //------------------------------------------------------ var tw, cw: Integer; oldClipping: Boolean; begin s := AFile.DisplayStrings.Strings[ACol]; if gCutTextToColWidth then begin while PaintInfo.Canvas.TextWidth(s) - (aRect.Right - aRect.Left) - 4 > 0 do Delete(s, Length(s), 1); end; oldClipping := PaintInfo.Canvas.Clipping; //PaintInfo.Canvas.Clipping := False; case ColumnsSet.GetColumnAlign(ACol) of taRightJustify: begin cw := Header.Columns.Items[ACol].Width; tw := PaintInfo.Canvas.TextWidth(s); PaintInfo.Canvas.TextOut(aRect.Right - tw - 3, iTextTop, s); end; taLeftJustify: begin PaintInfo.Canvas.TextOut(aRect.Left + 3, iTextTop, s); end; taCenter: begin cw := Header.Columns.Items[ACol].Width; tw := PaintInfo.Canvas.TextWidth(s); PaintInfo.Canvas.TextOut(aRect.Left + ((cw - tw - 3) div 2), iTextTop, s); end; end; //of case // PaintInfo.Canvas.Clipping := oldClipping; end; //of DrawOtherCell //------------------------------------------------------ procedure PrepareColors; //------------------------------------------------------ var TextColor: TColor = clDefault; BackgroundColor: TColor; IsCursor: Boolean; //--------------------- begin PaintInfo.Canvas.Font.Name := ColumnsSet.GetColumnFontName(ACol); PaintInfo.Canvas.Font.Size := ColumnsSet.GetColumnFontSize(ACol); PaintInfo.Canvas.Font.Style := ColumnsSet.GetColumnFontStyle(ACol); IsCursor := IsFocused and ColumnsView.Active and (not gUseFrameCursor); // Set up default background color first. if IsCursor then begin BackgroundColor := ColumnsSet.GetColumnCursorColor(ACol); end else begin // Alternate rows background color. if odd(PaintInfo.Node^.Index) then BackgroundColor := ColumnsSet.GetColumnBackground(ACol) else BackgroundColor := ColumnsSet.GetColumnBackground2(ACol); end; // Set text color. if ColumnsSet.GetColumnOvercolor(ACol) then TextColor := AFile.TextColor; if (TextColor = clDefault) or (TextColor = clNone) then TextColor := ColumnsSet.GetColumnTextColor(ACol); if AFile.Selected then begin if gUseInvertedSelection then begin //------------------------------------------------------ if IsCursor then begin TextColor := InvertColor(ColumnsSet.GetColumnCursorText(ACol)); end else begin BackgroundColor := ColumnsSet.GetColumnMarkColor(ACol); TextColor := ColumnsSet.GetColumnBackground(ACol); end; //------------------------------------------------------ end else begin TextColor := ColumnsSet.GetColumnMarkColor(ACol); end; end else if IsCursor then begin TextColor := ColumnsSet.GetColumnCursorText(ACol); end; BackgroundColor := ColumnsView.DimColor(BackgroundColor); if AFile.RecentlyUpdatedPct <> 0 then begin TextColor := LightColor(TextColor, AFile.RecentlyUpdatedPct); BackgroundColor := LightColor(BackgroundColor, AFile.RecentlyUpdatedPct); end; // Draw background. PaintInfo.Canvas.Brush.Color := BackgroundColor; PaintInfo.Canvas.FillRect(aRect); PaintInfo.Canvas.Font.Color := TextColor; end;// of PrepareColors; procedure DrawLines; begin // Draw frame cursor. if gUseFrameCursor and IsFocused and ColumnsView.Active then begin PaintInfo.Canvas.Pen.Color := ColumnsSet.GetColumnCursorColor(ACol); PaintInfo.Canvas.Line(aRect.Left, aRect.Top, aRect.Right, aRect.Top); PaintInfo.Canvas.Line(aRect.Left, aRect.Bottom - 1, aRect.Right, aRect.Bottom - 1); end; // Draw drop selection. if PaintInfo.Node^.Index = ColumnsView.FDropFileIndex then begin PaintInfo.Canvas.Pen.Color := ColumnsSet.GetColumnTextColor(ACol); PaintInfo.Canvas.Line(aRect.Left, aRect.Top + 1, aRect.Right, aRect.Top + 1); PaintInfo.Canvas.Line(aRect.Left, aRect.Bottom - 1, aRect.Right, aRect.Bottom - 1); end; end; //------------------------------------------------------ //end of subprocedures //------------------------------------------------------ begin aRect := PaintInfo.ContentRect; aCol := PaintInfo.Column; AFile := GetNodeFile(PaintInfo.Node); if not Assigned(AFile) then begin PaintInfo.Canvas.Brush.Color := Self.Color; PaintInfo.Canvas.FillRect(aRect); Exit; end; ColumnsSet := ColumnsView.GetColumnsClass; FileSourceDirectAccess := fspDirectAccess in ColumnsView.FileSource.Properties; if AFile.DisplayStrings.Count = 0 then ColumnsView.MakeColumnsStrings(AFile, ColumnsSet); IsFocused := PaintInfo.Node = FocusedNode; PrepareColors; // Paint on next column if it is empty. {if (ColumnsSet.GetColumnAlign(ACol) = taLeftJustify) and (ACol + 1 < ColumnsSet.ColumnsCount) and (AFile.DisplayStrings[ACol + 1] = EmptyStr) then aRect.Right := aRect.Right + Header.Columns.Items[ACol + 1].Width; // Paint on previous column if it is empty. if (ColumnsSet.GetColumnAlign(ACol) = taRightJustify) and (ACol - 1 >= 0) and (AFile.DisplayStrings[ACol - 1] = EmptyStr) then aRect.Left := aRect.Left - Header.Columns.Items[ACol - 1].Width; } iTextTop := aRect.Top + (PaintInfo.Node^.NodeHeight - PaintInfo.Canvas.TextHeight('Wg')) div 2; if PaintInfo.Column = 0 then DrawIconCell // Draw icon in the first column else DrawOtherCell; DrawLines; end; function TColumnsDrawTree.GetNodeFile(Node: PVirtualNode): TDisplayFile; begin if InRange(Node^.Index, 0, ColumnsView.FFiles.Count-1) then Result := ColumnsView.FFiles[Node^.Index] else Result := nil; end; procedure TColumnsDrawTree.SetAllRowsHeights(ARowHeight: Cardinal); var Node: PVirtualNode; begin BeginUpdate; try Node := GetFirstNoInit; while Assigned(Node) do begin NodeHeight[Node] := ARowHeight; Node := Node^.NextSibling; end; finally EndUpdate; end; end; procedure TColumnsDrawTree.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var BackgroundClick: Boolean; Point: TPoint; begin if ColumnsView.IsLoadingFileList then Exit; {$IFDEF LCLGTK2} // Workaround for two doubleclicks being sent on GTK. // MouseUp event is sent just after doubleclick, so if we drop // doubleclick events we have to also drop MouseUp events that follow them. if ColumnsView.TooManyDoubleClicks then Exit; {$ENDIF} // Handle only if button-up was not lifted to finish drag&drop operation. if not ColumnsView.FMainControlMouseDown then Exit; inherited MouseUp(Button, Shift, X, Y); ColumnsView.FMainControlMouseDown := False; if Button = mbRight then begin { If right click on file/directory } if ((gMouseSelectionButton<>1) or not gMouseSelectionEnabled) then begin BackgroundClick:= not MouseOnGrid(X, Y); Point := ClientToScreen(Classes.Point(X, Y)); frmMain.Commands.DoContextMenu(ColumnsView, Point.x, Point.y, BackgroundClick); end else if (gMouseSelectionEnabled and (gMouseSelectionButton = 1)) then begin ColumnsView.tmContextMenu.Enabled:= False; // stop context menu timer end; end { Open folder in new tab on middle click } else if (Button = mbMiddle) and (Y > GetHeaderHeight) then begin frmMain.Commands.cm_OpenDirInNewTab([]); end; end; procedure TColumnsDrawTree.MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); begin if ColumnsView.IsLoadingFileList then Exit; {$IFDEF LCLGTK2} // Workaround for two doubleclicks being sent on GTK. // MouseDown event is sent just before doubleclick, so if we drop // doubleclick events we have to also drop MouseDown events that precede them. if ColumnsView.TooManyDoubleClicks then Exit; {$ENDIF} ColumnsView.FMainControlMouseDown := True; inherited MouseDown(Button, Shift, X, Y); end; function TColumnsDrawTree.MouseOnGrid(X, Y: LongInt): Boolean; begin Result := Assigned(GetNodeAt(X, Y)); end; function TColumnsDrawTree.GetHeaderHeight: Integer; begin Result := Header.Height; end; function TColumnsDrawTree.GetGridHorzLine: Boolean; begin Result := toShowHorzGridLines in TreeOptions.PaintOptions; end; function TColumnsDrawTree.GetGridVertLine: Boolean; begin Result := toShowVertGridLines in TreeOptions.PaintOptions; end; procedure TColumnsDrawTree.SetGridHorzLine(const AValue: Boolean); begin if AValue then TreeOptions.PaintOptions := TreeOptions.PaintOptions + [toShowHorzGridLines] else TreeOptions.PaintOptions := TreeOptions.PaintOptions - [toShowHorzGridLines]; end; procedure TColumnsDrawTree.SetGridVertLine(const AValue: Boolean); begin if AValue then TreeOptions.PaintOptions := TreeOptions.PaintOptions + [toShowVertGridLines] else TreeOptions.PaintOptions := TreeOptions.PaintOptions - [toShowVertGridLines]; end; function TColumnsDrawTree.GetVisibleNodes: TNodeRange; var Offset: Integer = 0; Node: PVirtualNode; CH: Integer; begin Result.First := GetNodeAt(0, 0, True, Offset); Result.Last := Result.First; CH := ClientHeight; // Go down as many nodes as comprise together a size of ClientHeight. if Assigned(Result.Last) then begin while True do begin if Offset >= CH then Break; Node := GetNextSiblingNoInit(Result.Last); if not Assigned(Node) then Break; Result.Last := Node; Inc(Offset, NodeHeight[Node]); end; end; end; function TColumnsDrawTree.GetVisibleIndexes: TRange; begin if csLoading in ComponentState then begin Result.First := 0; Result.Last := -1; end else begin // This assumes each row has the same height = DefaultNodeHeight. Result.First := -OffsetY div DefaultNodeHeight; Result.Last := (-OffsetY + ClientHeight) div DefaultNodeHeight; // Account for the fact the BottomSpace might be > 0. if Result.Last >= RootNodeCount then Result.Last := RootNodeCount - 1; end; end; end. doublecmd-0.5.8/src/fileviews/ucolumnsfileview.pas0000644000175000017500000014167512071625742021423 0ustar alexxalexxunit uColumnsFileView; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Graphics, Controls, Forms, ExtCtrls, Grids, LMessages, LCLIntf, LCLType, Menus, LCLVersion, uFile, uFileProperty, uFileView, uFileViewWithMainCtrl, uFileSource, uDisplayFile, uColumns, uFileSorting, DCXmlConfig, DCClassesUtf8, uTypes; type TColumnsSortDirections = array of TSortDirection; TColumnsFileView = class; { TDrawGridEx } TDrawGridEx = class(TDrawGrid) private ColumnsView: TColumnsFileView; function GetGridHorzLine: Boolean; function GetGridVertLine: Boolean; procedure SetGridHorzLine(const AValue: Boolean); procedure SetGridVertLine(const AValue: Boolean); protected procedure KeyDown(var Key: Word; Shift: TShiftState); override; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); override; procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; procedure MouseUp(Button: TMouseButton; Shift:TShiftState; X,Y:Integer); override; procedure InitializeWnd; override; procedure FinalizeWnd; override; procedure DrawCell(aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); override; public constructor Create(AOwner: TComponent; AParent: TWinControl); reintroduce; procedure UpdateView; function MouseOnGrid(X, Y: LongInt): Boolean; // Returns height of all the header rows. function GetHeaderHeight: Integer; // Adapted from TCustomGrid.GetVisibleGrid only for visible rows. function GetVisibleRows: TRange; {en Retrieves first and last fully visible row number. } function GetFullVisibleRows: TRange; function IsRowVisible(aRow: Integer): Boolean; procedure ScrollHorizontally(ForwardDirection: Boolean); property GridVertLine: Boolean read GetGridVertLine write SetGridVertLine; property GridHorzLine: Boolean read GetGridHorzLine write SetGridHorzLine; end; { TColumnsFileView } TColumnsFileView = class(TFileViewWithMainCtrl) private FColumnsSortDirections: TColumnsSortDirections; FFileNameColumn: Integer; FExtensionColumn: Integer; pmColumnsMenu: TPopupMenu; dgPanel: TDrawGridEx; function GetColumnsClass: TPanelColumnsClass; procedure SetRowCount(Count: Integer); procedure SetFilesDisplayItems; procedure SetColumns; procedure MakeVisible(iRow: Integer); procedure MakeActiveVisible; {en Format and cache all columns strings. } procedure MakeColumnsStrings(AFile: TDisplayFile); procedure MakeColumnsStrings(AFile: TDisplayFile; ColumnsClass: TPanelColumnsClass); procedure ClearAllColumnsStrings; procedure EachViewUpdateColumns(AFileView: TFileView; UserData: Pointer); {en Translates file sorting by functions to sorting directions of columns. } procedure SetColumnsSortDirections; {en Checks which file properties are needed for displaying. } function GetFilePropertiesNeeded: TFilePropertiesTypes; // -- Events -------------------------------------------------------------- {$IF lcl_fullversion >= 093100} procedure dgPanelBeforeSelection(Sender: TObject; aCol, aRow: Integer); {$ENDIF} procedure dgPanelHeaderClick(Sender: TObject;IsColumn: Boolean; index: Integer); procedure dgPanelMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); procedure dgPanelMouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); procedure dgPanelSelection(Sender: TObject; aCol, aRow: Integer); procedure dgPanelTopLeftChanged(Sender: TObject); procedure dgPanelResize(Sender: TObject); procedure ColumnsMenuClick(Sender: TObject); protected procedure CreateDefault(AOwner: TWinControl); override; procedure BeforeMakeFileList; override; procedure ClearAfterDragDrop; override; procedure DisplayFileListChanged; override; procedure DoFileUpdated(AFile: TDisplayFile; UpdatedProperties: TFilePropertiesTypes = []); override; procedure DoHandleKeyDown(var Key: Word; Shift: TShiftState); override; procedure DoMainControlShowHint(FileIndex: PtrInt; X, Y: Integer); override; procedure DoUpdateView; override; procedure FileSourceFileListLoaded; override; function GetActiveFileIndex: PtrInt; override; function GetFileIndexFromCursor(X, Y: Integer; out AtFileList: Boolean): PtrInt; override; function GetFileRect(FileIndex: PtrInt): TRect; override; function GetVisibleFilesIndexes: TRange; override; procedure RedrawFile(FileIndex: PtrInt); override; procedure RedrawFile(DisplayFile: TDisplayFile); override; procedure RedrawFiles; override; procedure SetActiveFile(FileIndex: PtrInt); override; procedure SetSorting(const NewSortings: TFileSortings); override; procedure ShowRenameFileEdit(aFile: TFile); override; procedure AfterChangePath; override; public ActiveColm: String; ActiveColmSlave: TPanelColumnsClass; isSlave:boolean; //--------------------- constructor Create(AOwner: TWinControl; AFileSource: IFileSource; APath: String; AFlags: TFileViewFlags = []); override; constructor Create(AOwner: TWinControl; AFileView: TFileView; AFlags: TFileViewFlags = []); override; constructor Create(AOwner: TWinControl; AConfig: TIniFileEx; ASectionName: String; ATabIndex: Integer; AFlags: TFileViewFlags = []); override; constructor Create(AOwner: TWinControl; AConfig: TXmlConfig; ANode: TXmlNode; AFlags: TFileViewFlags = []); override; destructor Destroy; override; function Clone(NewParent: TWinControl): TColumnsFileView; override; procedure CloneTo(FileView: TFileView); override; procedure AddFileSource(aFileSource: IFileSource; aPath: String); override; procedure LoadConfiguration(Section: String; TabIndex: Integer); override; procedure LoadConfiguration(AConfig: TXmlConfig; ANode: TXmlNode); override; procedure SaveConfiguration(AConfig: TXmlConfig; ANode: TXmlNode); override; procedure UpdateColumnsView; end; implementation uses LCLProc, Clipbrd, uLng, uGlobs, uPixmapManager, uDebug, uDCUtils, math, fMain, fOptions, uOrderedFileView, uFileSourceProperty, fColumnsSetConf, uKeyboard, uFileFunctions, uFormCommands, fOptionsCustomColumns; type TEachViewCallbackReason = (evcrUpdateColumns); TEachViewCallbackMsg = record Reason: TEachViewCallbackReason; UpdatedColumnsSetName: String; NewColumnsSetName: String; // If columns name renamed end; PEachViewCallbackMsg = ^TEachViewCallbackMsg; procedure TColumnsFileView.SetSorting(const NewSortings: TFileSortings); begin inherited SetSorting(NewSortings); SetColumnsSortDirections; end; procedure TColumnsFileView.LoadConfiguration(Section: String; TabIndex: Integer); var ColumnsClass: TPanelColumnsClass; SortCount: Integer; SortColumn: Integer; SortDirection: TSortDirection; i: Integer; sIndex: String; NewSorting: TFileSortings = nil; Column: TPanelColumn; SortFunctions: TFileFunctions; begin sIndex := IntToStr(TabIndex); ActiveColm := gIni.ReadString(Section, sIndex + '_columnsset', 'Default'); // Load sorting options. ColumnsClass := GetColumnsClass; SortCount := gIni.ReadInteger(Section, sIndex + '_sortcount', 0); for i := 0 to SortCount - 1 do begin SortColumn := gIni.ReadInteger(Section, sIndex + '_sortcolumn' + IntToStr(i), -1); if (SortColumn >= 0) and (SortColumn < ColumnsClass.ColumnsCount) then begin Column := ColumnsClass.GetColumnItem(SortColumn); if Assigned(Column) then begin SortFunctions := Column.GetColumnFunctions; SortDirection := TSortDirection(gIni.ReadInteger(Section, sIndex + '_sortdirection' + IntToStr(i), Integer(sdNone))); AddSorting(NewSorting, SortFunctions, SortDirection); end; end; end; inherited SetSorting(NewSorting); end; procedure TColumnsFileView.LoadConfiguration(AConfig: TXmlConfig; ANode: TXmlNode); var ColumnsClass: TPanelColumnsClass; SortColumn: Integer; SortDirection: TSortDirection; ColumnsViewNode: TXmlNode; NewSorting: TFileSortings = nil; Column: TPanelColumn; SortFunctions: TFileFunctions; begin inherited LoadConfiguration(AConfig, ANode); // Try to read new view-specific node. ColumnsViewNode := AConfig.FindNode(ANode, 'ColumnsView'); if Assigned(ColumnsViewNode) then ANode := ColumnsViewNode; ActiveColm := AConfig.GetValue(ANode, 'ColumnsSet', 'Default'); // Load sorting options. ColumnsClass := GetColumnsClass; ANode := ANode.FindNode('Sorting'); if Assigned(ANode) then begin ANode := ANode.FirstChild; while Assigned(ANode) do begin if ANode.CompareName('Sort') = 0 then begin if AConfig.TryGetValue(ANode, 'Column', SortColumn) and (SortColumn >= 0) and (SortColumn < ColumnsClass.ColumnsCount) then begin Column := ColumnsClass.GetColumnItem(SortColumn); if Assigned(Column) then begin SortFunctions := Column.GetColumnFunctions; SortDirection := TSortDirection(AConfig.GetValue(ANode, 'Direction', Integer(sdNone))); AddSorting(NewSorting, SortFunctions, SortDirection); end; end else DCDebug('Invalid entry in configuration: ' + AConfig.GetPathFromNode(ANode) + '.'); end; ANode := ANode.NextSibling; end; inherited SetSorting(NewSorting); end; end; procedure TColumnsFileView.SaveConfiguration(AConfig: TXmlConfig; ANode: TXmlNode); begin inherited SaveConfiguration(AConfig, ANode); AConfig.SetAttr(ANode, 'Type', 'columns'); ANode := AConfig.FindNode(ANode, 'ColumnsView', True); AConfig.ClearNode(ANode); AConfig.SetValue(ANode, 'ColumnsSet', ActiveColm); end; procedure TColumnsFileView.dgPanelHeaderClick(Sender: TObject; IsColumn: Boolean; Index: Integer); var ShiftState : TShiftState; SortingDirection : TSortDirection; ColumnsClass: TPanelColumnsClass; Column: TPanelColumn; NewSorting: TFileSortings; SortFunctions: TFileFunctions; begin if not IsColumn then Exit; ColumnsClass := GetColumnsClass; Column := ColumnsClass.GetColumnItem(Index); if Assigned(Column) then begin NewSorting := Sorting; SortFunctions := Column.GetColumnFunctions; ShiftState := GetKeyShiftStateEx; if [ssShift, ssCtrl] * ShiftState = [] then begin SortingDirection := GetSortDirection(NewSorting, SortFunctions); if SortingDirection = sdNone then SortingDirection := sdAscending else SortingDirection := ReverseSortDirection(SortingDirection); NewSorting := nil; end else begin SortingDirection := sdAscending; end; AddOrUpdateSorting(NewSorting, SortFunctions, SortingDirection); SetSorting(NewSorting); end; end; procedure TColumnsFileView.dgPanelMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); var I: Integer; begin Handled:= True; if not IsLoadingFileList then begin case gScrollMode of smLineByLine: for I:= 1 to gWheelScrollLines do dgPanel.Perform(LM_VSCROLL, SB_LINEUP, 0); smPageByPage: dgPanel.Perform(LM_VSCROLL, SB_PAGEUP, 0); else Handled:= False; end; end; end; procedure TColumnsFileView.dgPanelMouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); var I: Integer; begin Handled:= True; if not IsLoadingFileList then begin case gScrollMode of smLineByLine: for I:= 1 to gWheelScrollLines do dgPanel.Perform(LM_VSCROLL, SB_LINEDOWN, 0); smPageByPage: dgPanel.Perform(LM_VSCROLL, SB_PAGEDOWN, 0); else Handled:= False; end; end; end; procedure TColumnsFileView.dgPanelSelection(Sender: TObject; aCol, aRow: Integer); begin {$IF lcl_fullversion >= 093100} dgPanel.Options := dgPanel.Options - [goDontScrollPartCell]; {$ENDIF} DoFileIndexChanged(aRow - dgPanel.FixedRows); end; procedure TColumnsFileView.dgPanelTopLeftChanged(Sender: TObject); begin Notify([fvnVisibleFilePropertiesChanged]); end; procedure TColumnsFileView.dgPanelResize(Sender: TObject); begin Notify([fvnVisibleFilePropertiesChanged]); end; procedure TColumnsFileView.AfterChangePath; begin inherited AfterChangePath; if not IsLoadingFileList then begin FUpdatingActiveFile := True; dgPanel.Row := 0; FUpdatingActiveFile := False; end; end; procedure TColumnsFileView.ShowRenameFileEdit(aFile: TFile); var ALeft, ATop, AWidth, AHeight: Integer; begin if FFileNameColumn <> -1 then begin if not edtRename.Visible then begin edtRename.Font.Name := GetColumnsClass.GetColumnFontName(FFileNameColumn); edtRename.Font.Size := GetColumnsClass.GetColumnFontSize(FFileNameColumn); edtRename.Font.Style := GetColumnsClass.GetColumnFontStyle(FFileNameColumn); ATop := dgPanel.CellRect(FFileNameColumn, dgPanel.Row).Top - 2; ALeft := dgPanel.CellRect(FFileNameColumn, dgPanel.Row).Left; if gShowIcons <> sim_none then Inc(ALeft, gIconsSize + 2); AWidth := dgPanel.ColWidths[FFileNameColumn] - ALeft; if Succ(FFileNameColumn) = FExtensionColumn then Inc(AWidth, dgPanel.ColWidths[FExtensionColumn]); AHeight := dgPanel.RowHeights[dgPanel.Row] + 4; edtRename.SetBounds(ALeft, ATop, AWidth, AHeight); end; inherited ShowRenameFileEdit(AFile); end; end; procedure TColumnsFileView.RedrawFile(FileIndex: PtrInt); begin dgPanel.InvalidateRow(FileIndex + dgPanel.FixedRows); end; procedure TColumnsFileView.SetColumnsSortDirections; var Columns: TPanelColumnsClass; function SetSortDirection(ASortFunction: TFileFunction; ASortDirection: TSortDirection; Overwrite: Boolean): Boolean; var k, l: Integer; ColumnFunctions: TFileFunctions; begin for k := 0 to Columns.Count - 1 do begin ColumnFunctions := Columns.GetColumnItem(k).GetColumnFunctions; for l := 0 to Length(ColumnFunctions) - 1 do if ColumnFunctions[l] = ASortFunction then begin if Overwrite or (FColumnsSortDirections[k] = sdNone) then begin FColumnsSortDirections[k] := ASortDirection; Exit(True); end; end; end; Result := False; end; var i, j: Integer; ASortings: TFileSortings; begin Columns := GetColumnsClass; ASortings := Sorting; SetLength(FColumnsSortDirections, Columns.Count); for i := 0 to Length(FColumnsSortDirections) - 1 do FColumnsSortDirections[i] := sdNone; for i := 0 to Length(ASortings) - 1 do begin for j := 0 to Length(ASortings[i].SortFunctions) - 1 do begin // Search for the column containing the sort function and add sorting // by that column. If function is Name and it is not found try searching // for NameNoExtension + Extension and vice-versa. if not SetSortDirection(ASortings[i].SortFunctions[j], ASortings[i].SortDirection, True) then begin if ASortings[i].SortFunctions[j] = fsfName then begin SetSortDirection(fsfNameNoExtension, ASortings[i].SortDirection, False); SetSortDirection(fsfExtension, ASortings[i].SortDirection, False); end else if ASortings[i].SortFunctions[j] in [fsfNameNoExtension, fsfExtension] then begin SetSortDirection(fsfName, ASortings[i].SortDirection, False); end; end; end; end; end; procedure TColumnsFileView.SetFilesDisplayItems; var i: Integer; begin for i := 0 to FFiles.Count - 1 do FFiles[i].DisplayItem := Pointer(i + dgPanel.FixedRows); end; function TColumnsFileView.GetFilePropertiesNeeded: TFilePropertiesTypes; var i, j: Integer; ColumnsClass: TPanelColumnsClass; Column: TPanelColumn; FileFunctionsUsed: TFileFunctions; begin // By default always use some properties. Result := [fpName, fpSize, // For info panel (total size, selected size) fpAttributes, // For distinguishing directories fpLink, // For distinguishing directories (link to dir) and link icons fpModificationTime // For selecting/coloring files (by SearchTemplate) ]; ColumnsClass := GetColumnsClass; FFileNameColumn := -1; FExtensionColumn := -1; // Scan through all columns. for i := 0 to ColumnsClass.Count - 1 do begin Column := ColumnsClass.GetColumnItem(i); FileFunctionsUsed := Column.GetColumnFunctions; if Length(FileFunctionsUsed) > 0 then begin // Scan through all functions in the column. for j := Low(FileFunctionsUsed) to High(FileFunctionsUsed) do begin // Add file properties needed to display the function. Result := Result + TFileFunctionToProperty[FileFunctionsUsed[j]]; if (FFileNameColumn = -1) and (FileFunctionsUsed[j] in [fsfName, fsfNameNoExtension]) then FFileNameColumn := i; if (FExtensionColumn = -1) and (FileFunctionsUsed[j] in [fsfExtension]) then FExtensionColumn := i; end; end; end; end; function TColumnsFileView.GetFileRect(FileIndex: PtrInt): TRect; begin Result := dgPanel.CellRect(0, FileIndex + dgPanel.FixedRows); end; procedure TColumnsFileView.SetRowCount(Count: Integer); begin FUpdatingActiveFile := True; dgPanel.RowCount := dgPanel.FixedRows + Count; FUpdatingActiveFile := False; end; procedure TColumnsFileView.SetColumns; var x: Integer; ColumnsClass: TPanelColumnsClass; begin ColumnsClass := GetColumnsClass; dgPanel.Columns.BeginUpdate; try dgPanel.Columns.Clear; for x:= 0 to ColumnsClass.ColumnsCount - 1 do begin with dgPanel.Columns.Add do begin // SizePriority = 0 means don't modify Width with AutoFill. // Last column is always modified if all columns have SizePriority = 0. if (x = 0) and (gAutoSizeColumn = 0) then SizePriority := 1 else SizePriority := 0; Width:= ColumnsClass.GetColumnWidth(x); Title.Caption:= ColumnsClass.GetColumnTitle(x); end; end; finally dgPanel.Columns.EndUpdate; end; end; procedure TColumnsFileView.MakeVisible(iRow:Integer); var AVisibleRows: TRange; begin with dgPanel do begin AVisibleRows := GetFullVisibleRows; if iRow < AVisibleRows.First then TopRow := AVisibleRows.First; if iRow > AVisibleRows.Last then TopRow := iRow - (AVisibleRows.Last - AVisibleRows.First); end; end; procedure TColumnsFileView.MakeActiveVisible; begin if dgPanel.Row>=0 then MakeVisible(dgPanel.Row); end; procedure TColumnsFileView.SetActiveFile(FileIndex: PtrInt); begin dgPanel.Row := FileIndex + dgPanel.FixedRows; MakeVisible(dgPanel.Row); end; {$IF lcl_fullversion >= 093100} procedure TColumnsFileView.dgPanelBeforeSelection(Sender: TObject; aCol, aRow: Integer); begin if dgPanel.IsRowVisible(aRow) then dgPanel.Options := dgPanel.Options + [goDontScrollPartCell]; end; {$ENDIF} procedure TColumnsFileView.RedrawFile(DisplayFile: TDisplayFile); begin dgPanel.InvalidateRow(PtrInt(DisplayFile.DisplayItem)); end; procedure TColumnsFileView.RedrawFiles; begin dgPanel.Invalidate; end; procedure TColumnsFileView.UpdateColumnsView; var ColumnsClass: TPanelColumnsClass; OldFilePropertiesNeeded: TFilePropertiesTypes; begin ClearAllColumnsStrings; // If the ActiveColm set doesn't exist this will retrieve either // the first set or the default set. ColumnsClass := GetColumnsClass; // Set name in case a different set was loaded. ActiveColm := ColumnsClass.Name; SetColumns; SetColumnsSortDirections; dgPanel.FocusRectVisible := ColumnsClass.GetCursorBorder and not gUseFrameCursor; dgPanel.FocusColor := ColumnsClass.GetCursorBorderColor; dgPanel.UpdateView; OldFilePropertiesNeeded := FilePropertiesNeeded; FilePropertiesNeeded := GetFilePropertiesNeeded; if FilePropertiesNeeded >= OldFilePropertiesNeeded then begin Notify([fvnVisibleFilePropertiesChanged]); end; end; procedure TColumnsFileView.ColumnsMenuClick(Sender: TObject); var frmColumnsSetConf: TfColumnsSetConf; Index: Integer; Msg: TEachViewCallbackMsg; begin Case (Sender as TMenuItem).Tag of 1000: //This begin frmColumnsSetConf := TfColumnsSetConf.Create(nil); try Msg.Reason := evcrUpdateColumns; Msg.UpdatedColumnsSetName := ActiveColm; {EDIT Set} frmColumnsSetConf.edtNameofColumnsSet.Text:=ColSet.GetColumnSet(ActiveColm).CurrentColumnsSetName; Index:=ColSet.Items.IndexOf(ActiveColm); frmColumnsSetConf.lbNrOfColumnsSet.Caption:=IntToStr(1 + Index); frmColumnsSetConf.Tag:=Index; frmColumnsSetConf.SetColumnsClass(GetColumnsClass); {EDIT Set} if frmColumnsSetConf.ShowModal = mrOK then begin // Force saving changes to config file. SaveGlobs; Msg.NewColumnsSetName := frmColumnsSetConf.GetColumnsClass.Name; frmMain.ForEachView(@EachViewUpdateColumns, @Msg); end; finally FreeAndNil(frmColumnsSetConf); end; end; 1001: //All columns begin ShowOptions(TfrmOptionsCustomColumns); end; else begin ActiveColm:=ColSet.Items[(Sender as TMenuItem).Tag]; UpdateColumnsView; RedrawFiles; end; end; end; constructor TColumnsFileView.Create(AOwner: TWinControl; AFileSource: IFileSource; APath: String; AFlags: TFileViewFlags = []); begin ActiveColm := 'Default'; inherited Create(AOwner, AFileSource, APath, AFlags); end; constructor TColumnsFileView.Create(AOwner: TWinControl; AFileView: TFileView; AFlags: TFileViewFlags = []); begin inherited Create(AOwner, AFileView, AFlags); end; constructor TColumnsFileView.Create(AOwner: TWinControl; AConfig: TIniFileEx; ASectionName: String; ATabIndex: Integer; AFlags: TFileViewFlags = []); begin inherited Create(AOwner, AConfig, ASectionName, ATabIndex, AFlags); end; constructor TColumnsFileView.Create(AOwner: TWinControl; AConfig: TXmlConfig; ANode: TXmlNode; AFlags: TFileViewFlags = []); begin inherited Create(AOwner, AConfig, ANode, AFlags); end; procedure TColumnsFileView.CreateDefault(AOwner: TWinControl); begin DCDebug('TColumnsFileView.Create components'); inherited CreateDefault(AOwner); FFileNameColumn := -1; FExtensionColumn := -1; // -- other components dgPanel:=TDrawGridEx.Create(Self, Self); MainControl := dgPanel; // --- dgPanel.OnHeaderClick:=@dgPanelHeaderClick; dgPanel.OnMouseWheelUp := @dgPanelMouseWheelUp; dgPanel.OnMouseWheelDown := @dgPanelMouseWheelDown; dgPanel.OnSelection:= @dgPanelSelection; {$IF lcl_fullversion >= 093100} dgPanel.OnBeforeSelection:= @dgPanelBeforeSelection; {$ENDIF} dgPanel.OnTopLeftChanged:= @dgPanelTopLeftChanged; dgpanel.OnResize:= @dgPanelResize; pmColumnsMenu := TPopupMenu.Create(Self); pmColumnsMenu.Parent := Self; end; destructor TColumnsFileView.Destroy; begin inherited Destroy; end; function TColumnsFileView.Clone(NewParent: TWinControl): TColumnsFileView; begin Result := TColumnsFileView.Create(NewParent, Self); end; procedure TColumnsFileView.CloneTo(FileView: TFileView); begin if Assigned(FileView) then begin inherited CloneTo(FileView); if FileView is TColumnsFileView then with FileView as TColumnsFileView do begin FColumnsSortDirections := Self.FColumnsSortDirections; ActiveColm := Self.ActiveColm; ActiveColmSlave := nil; // set to nil because only used in preview? isSlave := Self.isSlave; end; end; end; procedure TColumnsFileView.AddFileSource(aFileSource: IFileSource; aPath: String); begin inherited AddFileSource(aFileSource, aPath); if not IsLoadingFileList then begin FUpdatingActiveFile := True; dgPanel.Row := 0; FUpdatingActiveFile := False; end; end; procedure TColumnsFileView.BeforeMakeFileList; begin inherited; if gListFilesInThread then begin // Display info that file list is being loaded. UpdateInfoPanel; end; end; procedure TColumnsFileView.ClearAfterDragDrop; begin inherited ClearAfterDragDrop; // reset TCustomGrid state dgPanel.FGridState := gsNormal; end; procedure TColumnsFileView.FileSourceFileListLoaded; begin inherited; FUpdatingActiveFile := True; dgPanel.Row := 0; FUpdatingActiveFile := False; end; procedure TColumnsFileView.DisplayFileListChanged; begin // Update grid row count. SetRowCount(FFiles.Count); SetFilesDisplayItems; RedrawFiles; if SetActiveFileNow(RequestedActiveFile) then RequestedActiveFile := '' // Requested file was not found, restore position to last active file. else if not SetActiveFileNow(LastActiveFile) then // Make sure at least that the previously active file is still visible after displaying file list. MakeActiveVisible; Notify([fvnVisibleFilePropertiesChanged]); inherited; end; procedure TColumnsFileView.MakeColumnsStrings(AFile: TDisplayFile); begin MakeColumnsStrings(AFile, GetColumnsClass); end; procedure TColumnsFileView.MakeColumnsStrings(AFile: TDisplayFile; ColumnsClass: TPanelColumnsClass); var ACol: Integer; begin AFile.DisplayStrings.Clear; for ACol := 0 to ColumnsClass.Count - 1 do begin AFile.DisplayStrings.Add(ColumnsClass.GetColumnItemResultString( ACol, AFile.FSFile, FileSource)); end; end; procedure TColumnsFileView.ClearAllColumnsStrings; var i: Integer; begin if Assigned(FAllDisplayFiles) then begin // Clear display strings in case columns have changed. for i := 0 to FAllDisplayFiles.Count - 1 do FAllDisplayFiles[i].DisplayStrings.Clear; end; end; procedure TColumnsFileView.EachViewUpdateColumns(AFileView: TFileView; UserData: Pointer); var ColumnsView: TColumnsFileView; PMsg: PEachViewCallbackMsg; begin if AFileView is TColumnsFileView then begin ColumnsView := TColumnsFileView(AFileView); PMsg := UserData; if ColumnsView.ActiveColm = PMsg^.UpdatedColumnsSetName then begin ColumnsView.ActiveColm := PMsg^.NewColumnsSetName; ColumnsView.UpdateColumnsView; ColumnsView.RedrawFiles; end; end; end; procedure TColumnsFileView.DoUpdateView; begin inherited DoUpdateView; UpdateColumnsView; end; function TColumnsFileView.GetActiveFileIndex: PtrInt; begin Result := dgPanel.Row - dgPanel.FixedRows; end; function TColumnsFileView.GetVisibleFilesIndexes: TRange; begin Result := dgPanel.GetVisibleRows; Dec(Result.First, dgPanel.FixedRows); Dec(Result.Last, dgPanel.FixedRows); end; function TColumnsFileView.GetColumnsClass: TPanelColumnsClass; begin if isSlave then Result := ActiveColmSlave else Result := ColSet.GetColumnSet(ActiveColm); end; function TColumnsFileView.GetFileIndexFromCursor(X, Y: Integer; out AtFileList: Boolean): PtrInt; var bTemp: Boolean; iRow, iCol: LongInt; begin with dgPanel do begin bTemp:= AllowOutboundEvents; AllowOutboundEvents:= False; MouseToCell(X, Y, iCol, iRow); AllowOutboundEvents:= bTemp; Result:= IfThen(iRow < 0, InvalidFileIndex, iRow - FixedRows); AtFileList := Y >= GetHeaderHeight; end; end; procedure TColumnsFileView.DoFileUpdated(AFile: TDisplayFile; UpdatedProperties: TFilePropertiesTypes); begin MakeColumnsStrings(AFile); inherited DoFileUpdated(AFile, UpdatedProperties); end; procedure TColumnsFileView.DoHandleKeyDown(var Key: Word; Shift: TShiftState); var AFile: TDisplayFile; begin case Key of VK_INSERT: begin if not IsEmpty then begin if IsActiveItemValid then begin InvertFileSelection(GetActiveDisplayFile, False); DoSelectionChanged(dgPanel.Row - dgPanel.FixedRows); end; if dgPanel.Row < dgPanel.RowCount-1 then dgPanel.Row := dgPanel.Row + 1; MakeActiveVisible; end; Key := 0; end; // cursors keys in Lynx like mode VK_LEFT: if (Shift = []) then begin if gLynxLike then ChangePathToParent(True) else dgPanel.ScrollHorizontally(False); Key := 0; end; VK_RIGHT: if (Shift = []) then begin if gLynxLike then ChooseFile(GetActiveDisplayFile, True) else dgPanel.ScrollHorizontally(True); Key := 0; end; VK_SPACE: if Shift * KeyModifiersShortcut = [] then begin aFile := GetActiveDisplayFile; if IsItemValid(aFile) then begin if (aFile.FSFile.IsDirectory or aFile.FSFile.IsLinkToDirectory) and not aFile.Selected then begin CalculateSpace(aFile); end; InvertFileSelection(aFile, False); end; if gSpaceMovesDown then dgPanel.Row := dgPanel.Row + 1; MakeActiveVisible; DoSelectionChanged(dgPanel.Row - dgPanel.FixedRows); Key := 0; end; end; inherited DoHandleKeyDown(Key, Shift); end; procedure TColumnsFileView.DoMainControlShowHint(FileIndex: PtrInt; X, Y: Integer); var aRect: TRect; iCol: Integer; AFile: TDisplayFile; begin AFile := FFiles[FileIndex]; aRect:= dgPanel.CellRect(0, FileIndex + dgPanel.FixedRows); iCol:= aRect.Right - aRect.Left - 8; if gShowIcons <> sim_none then Dec(iCol, gIconsSize); if iCol < dgPanel.Canvas.TextWidth(AFile.FSFile.Name) then // with file name dgPanel.Hint:= AFile.FSFile.Name else if (stm_only_large_name in gShowToolTipMode) then // don't show Exit else if not AFile.FSFile.IsDirectory then // without name dgPanel.Hint:= #32; end; { TDrawGridEx } constructor TDrawGridEx.Create(AOwner: TComponent; AParent: TWinControl); begin inherited Create(AOwner); ColumnsView := AParent as TColumnsFileView; // Workaround for Lazarus issue 18832. // Set Fixed... before setting ...Count. FixedRows := 0; FixedCols := 0; // Override default values to start with no columns and no rows. RowCount := 0; ColCount := 0; DoubleBuffered := True; Align := alClient; Options := [goFixedVertLine, goFixedHorzLine, goTabs, goRowSelect, goColSizing, goThumbTracking, goSmoothScroll]; TitleStyle := tsStandard; TabStop := False; Self.Parent := AParent; UpdateView; end; procedure TDrawGridEx.UpdateView; function CalculateDefaultRowHeight: Integer; var OldFont, NewFont: TFont; i: Integer; MaxFontHeight: Integer = 0; CurrentHeight: Integer; ColumnsSet: TPanelColumnsClass; begin // Start with height of the icons. if gShowIcons <> sim_none then MaxFontHeight := gIconsSize; // Get columns settings. with (Parent as TColumnsFileView) do begin if not isSlave then ColumnsSet := ColSet.GetColumnSet(ActiveColm) else ColumnsSet := ActiveColmSlave; end; // Assign temporary font. OldFont := Canvas.Font; NewFont := TFont.Create; Canvas.Font := NewFont; // Search columns settings for the biggest font (in height). for i := 0 to ColumnsSet.Count - 1 do begin Canvas.Font.Name := ColumnsSet.GetColumnFontName(i); Canvas.Font.Style := ColumnsSet.GetColumnFontStyle(i); Canvas.Font.Size := ColumnsSet.GetColumnFontSize(i); CurrentHeight := Canvas.GetTextHeight('Wg'); MaxFontHeight := Max(MaxFontHeight, CurrentHeight); end; // Restore old font. Canvas.Font := OldFont; FreeAndNil(NewFont); Result := MaxFontHeight; end; function CalculateTabHeaderHeight: Integer; var OldFont: TFont; begin OldFont := Canvas.Font; Canvas.Font := Font; SetCanvasFont(GetColumnFont(0, True)); Result := Canvas.TextHeight('Wg'); Canvas.Font := OldFont; end; var TabHeaderHeight: Integer; TempRowHeight: Integer; begin Flat := gInterfaceFlat; AutoFillColumns:= gAutoFillColumns; GridVertLine:= gGridVertLine; GridHorzLine:= gGridHorzLine; // Calculate row height. TempRowHeight := CalculateDefaultRowHeight; if TempRowHeight > 0 then DefaultRowHeight := TempRowHeight; // Set rows of header. if gTabHeader then begin if RowCount < 1 then RowCount := 1; FixedRows := 1; TabHeaderHeight := Max(gIconsSize, CalculateTabHeaderHeight); TabHeaderHeight := TabHeaderHeight + 2; // for borders if not gInterfaceFlat then begin TabHeaderHeight := TabHeaderHeight + 2; // additional borders if not flat end; RowHeights[0] := TabHeaderHeight; end else begin if FixedRows > 0 then begin // First reduce number of rows so that the 0'th row, which will be changed // to not-fixed, won't be counted as a row having a file. if RowCount > 0 then RowCount := RowCount - 1; FixedRows := 0; end; end; FixedCols := 0; // Set column number to zero, must be called after fixed columns change MoveExtend(False, 0, Row); end; procedure TDrawGridEx.InitializeWnd; begin inherited InitializeWnd; ColumnsView.InitializeDragDropEx(Self); end; procedure TDrawGridEx.FinalizeWnd; begin ColumnsView.FinalizeDragDropEx(Self); inherited FinalizeWnd; end; function TDrawGridEx.GetFullVisibleRows: TRange; begin Result.First := GCache.FullVisibleGrid.Top; Result.Last := GCache.FullVisibleGrid.Bottom; end; procedure TDrawGridEx.DrawCell(aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); var //shared variables s: string; iTextTop: Integer; AFile: TDisplayFile; FileSourceDirectAccess: Boolean; ColumnsSet: TPanelColumnsClass; //------------------------------------------------------ //begin subprocedures //------------------------------------------------------ procedure DrawFixed; //------------------------------------------------------ var SortingDirection: TSortDirection; TitleX: Integer; begin // Draw background. Canvas.Brush.Color := GetColumnColor(ACol, True); Canvas.FillRect(aRect); SetCanvasFont(GetColumnFont(aCol, True)); iTextTop := aRect.Top + (RowHeights[aRow] - Canvas.TextHeight('Wg')) div 2; TitleX := 0; s := ColumnsSet.GetColumnTitle(ACol); SortingDirection := ColumnsView.FColumnsSortDirections[ACol]; if SortingDirection <> sdNone then begin TitleX := TitleX + gIconsSize; PixMapManager.DrawBitmap( PixMapManager.GetIconBySortingDirection(SortingDirection), Canvas, aRect.Left, aRect.Top + (RowHeights[aRow] - gIconsSize) div 2); end; TitleX := max(TitleX, 4); if gCutTextToColWidth then begin if (aRect.Right - aRect.Left) < TitleX then // Column too small to display text. Exit else while Canvas.TextWidth(s) - ((aRect.Right - aRect.Left) - TitleX) > 0 do UTF8Delete(s, UTF8Length(s), 1); end; Canvas.TextOut(aRect.Left + TitleX, iTextTop, s); end; // of DrawHeader //------------------------------------------------------ procedure DrawIconCell; //------------------------------------------------------ var Y: Integer; IconID: PtrInt; begin if (gShowIcons <> sim_none) then begin IconID := AFile.IconID; // Draw default icon if there is no icon for the file. if IconID = -1 then IconID := PixMapManager.GetDefaultIcon(AFile.FSFile); // center icon vertically Y:= aRect.Top + (RowHeights[ARow] - gIconsSize) div 2; // Draw icon for a file PixMapManager.DrawBitmap(IconID, Canvas, aRect.Left + 1, Y ); // Draw overlay icon for a file if needed if gIconOverlays then begin PixMapManager.DrawBitmapOverlay(AFile, FileSourceDirectAccess, Canvas, aRect.Left + 1, Y ); end; end; if AFile.DisplayStrings.Count = 0 then ColumnsView.MakeColumnsStrings(AFile, ColumnsSet); s := AFile.DisplayStrings.Strings[ACol]; if gCutTextToColWidth then begin Y:= ((aRect.Right - aRect.Left) - 4 - Canvas.TextWidth('W')); if (gShowIcons <> sim_none) then Y:= Y - gIconsSize; if Canvas.TextWidth(s) - Y > 0 then begin repeat IconID:= UTF8Length(s); UTF8Delete(s, IconID, 1); until (Canvas.TextWidth(s) - Y < 1) or (IconID = 0); if (IconID > 0) then begin s:= UTF8Copy(s, 1, IconID - 3); if gDirBrackets and (AFile.FSFile.IsDirectory or AFile.FSFile.IsLinkToDirectory) then s:= s + '..]' else s:= s + '...'; end; end; end; if (gShowIcons <> sim_none) then Canvas.TextOut(aRect.Left + gIconsSize + 4, iTextTop, s) else Canvas.TextOut(aRect.Left + 2, iTextTop, s); end; //of DrawIconCell //------------------------------------------------------ procedure DrawOtherCell; //------------------------------------------------------ var tw, cw: Integer; begin if AFile.DisplayStrings.Count = 0 then ColumnsView.MakeColumnsStrings(AFile, ColumnsSet); s := AFile.DisplayStrings.Strings[ACol]; if gCutTextToColWidth then begin while Canvas.TextWidth(s) - (aRect.Right - aRect.Left) - 4 > 0 do Delete(s, Length(s), 1); end; case ColumnsSet.GetColumnAlign(ACol) of taRightJustify: begin cw := ColWidths[ACol]; tw := Canvas.TextWidth(s); Canvas.TextOut(aRect.Left + cw - tw - 3, iTextTop, s); end; taLeftJustify: begin Canvas.TextOut(aRect.Left + 3, iTextTop, s); end; taCenter: begin cw := ColWidths[ACol]; tw := Canvas.TextWidth(s); Canvas.TextOut(aRect.Left + ((cw - tw - 3) div 2), iTextTop, s); end; end; //of case end; //of DrawOtherCell //------------------------------------------------------ procedure PrepareColors; //------------------------------------------------------ var TextColor: TColor = clDefault; BackgroundColor: TColor; IsCursor: Boolean; //--------------------- begin Canvas.Font.Name := ColumnsSet.GetColumnFontName(ACol); Canvas.Font.Size := ColumnsSet.GetColumnFontSize(ACol); Canvas.Font.Style := ColumnsSet.GetColumnFontStyle(ACol); IsCursor := (gdSelected in aState) and ColumnsView.Active and (not gUseFrameCursor); // Set up default background color first. if IsCursor then BackgroundColor := ColumnsSet.GetColumnCursorColor(ACol) else begin // Alternate rows background color. if odd(ARow) then BackgroundColor := ColumnsSet.GetColumnBackground(ACol) else BackgroundColor := ColumnsSet.GetColumnBackground2(ACol); end; // Set text color. if ColumnsSet.GetColumnOvercolor(ACol) then TextColor := AFile.TextColor; if (TextColor = clDefault) or (TextColor = clNone) then TextColor := ColumnsSet.GetColumnTextColor(ACol); if AFile.Selected then begin if gUseInvertedSelection then begin //------------------------------------------------------ if IsCursor then begin TextColor := InvertColor(ColumnsSet.GetColumnCursorText(ACol)); end else begin BackgroundColor := ColumnsSet.GetColumnMarkColor(ACol); TextColor := ColumnsSet.GetColumnBackground(ACol); end; //------------------------------------------------------ end else begin TextColor := ColumnsSet.GetColumnMarkColor(ACol); end; end else if IsCursor then begin TextColor := ColumnsSet.GetColumnCursorText(ACol); end; BackgroundColor := ColumnsView.DimColor(BackgroundColor); if AFile.RecentlyUpdatedPct <> 0 then begin TextColor := LightColor(TextColor, AFile.RecentlyUpdatedPct); BackgroundColor := LightColor(BackgroundColor, AFile.RecentlyUpdatedPct); end; // Draw background. Canvas.Brush.Color := BackgroundColor; Canvas.FillRect(aRect); Canvas.Font.Color := TextColor; end;// of PrepareColors; procedure DrawLines; begin // Draw frame cursor. if gUseFrameCursor and (gdSelected in aState) and ColumnsView.Active then begin Canvas.Pen.Color := ColumnsSet.GetColumnCursorColor(ACol); Canvas.Line(aRect.Left, aRect.Top, aRect.Right, aRect.Top); Canvas.Line(aRect.Left, aRect.Bottom - 1, aRect.Right, aRect.Bottom - 1); end; // Draw drop selection. if ARow - FixedRows = ColumnsView.FDropFileIndex then begin Canvas.Pen.Color := ColumnsSet.GetColumnTextColor(ACol); Canvas.Line(aRect.Left, aRect.Top, aRect.Right, aRect.Top); Canvas.Line(aRect.Left, aRect.Bottom - 1, aRect.Right, aRect.Bottom - 1); end; end; //------------------------------------------------------ //end of subprocedures //------------------------------------------------------ begin ColumnsSet := ColumnsView.GetColumnsClass; if gdFixed in aState then begin DrawFixed; // Draw column headers DrawCellGrid(aCol,aRow,aRect,aState); end else if ColumnsView.FFiles.Count > 0 then begin AFile := ColumnsView.FFiles[ARow - FixedRows]; // substract fixed rows (header) FileSourceDirectAccess := fspDirectAccess in ColumnsView.FileSource.Properties; PrepareColors; iTextTop := aRect.Top + (RowHeights[aRow] - Canvas.TextHeight('Wg')) div 2; if ACol = 0 then DrawIconCell // Draw icon in the first column else DrawOtherCell; DrawCellGrid(aCol,aRow,aRect,aState); DrawLines; end else begin Canvas.Brush.Color := Self.Color; Canvas.FillRect(aRect); end; end; procedure TDrawGridEx.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var I : Integer; Point: TPoint; MI: TMenuItem; Background: Boolean; begin if ColumnsView.IsLoadingFileList then Exit; {$IFDEF LCLGTK2} // Workaround for two doubleclicks being sent on GTK. // MouseUp event is sent just after doubleclick, so if we drop // doubleclick events we have to also drop MouseUp events that follow them. if ColumnsView.TooManyDoubleClicks then Exit; {$ENDIF} // Handle only if button-up was not lifted to finish drag&drop operation. if not ColumnsView.FMainControlMouseDown then Exit; inherited MouseUp(Button, Shift, X, Y); ColumnsView.FMainControlMouseDown := False; if Button = mbRight then begin { If right click on header } if (Y < GetHeaderHeight) then begin //Load Columns into menu ColumnsView.pmColumnsMenu.Items.Clear; if ColSet.Items.Count>0 then begin For I:=0 to ColSet.Items.Count-1 do begin MI:=TMenuItem.Create(ColumnsView.pmColumnsMenu); MI.Tag:=I; MI.Caption:=ColSet.Items[I]; MI.OnClick:=@ColumnsView.ColumnsMenuClick; ColumnsView.pmColumnsMenu.Items.Add(MI); end; end; //- MI:=TMenuItem.Create(ColumnsView.pmColumnsMenu); MI.Caption:='-'; ColumnsView.pmColumnsMenu.Items.Add(MI); //Configure this custom columns MI:=TMenuItem.Create(ColumnsView.pmColumnsMenu); MI.Tag:=1000; MI.Caption:=rsMenuConfigureThisCustomColumn; MI.OnClick:=@ColumnsView.ColumnsMenuClick; ColumnsView.pmColumnsMenu.Items.Add(MI); //Configure custom columns MI:=TMenuItem.Create(ColumnsView.pmColumnsMenu); MI.Tag:=1001; MI.Caption:=rsMenuConfigureCustomColumns; MI.OnClick:=@ColumnsView.ColumnsMenuClick; ColumnsView.pmColumnsMenu.Items.Add(MI); Point:=ClientToScreen(Classes.Point(0,0)); Point.Y:=Point.Y+GetHeaderHeight; Point.X:=Point.X+X-50; ColumnsView.pmColumnsMenu.PopUp(Point.X,Point.Y); end { If right click on file/directory } else if ((gMouseSelectionButton<>1) or not gMouseSelectionEnabled) then begin Background:= not MouseOnGrid(X, Y); Point := ClientToScreen(Classes.Point(X, Y)); frmMain.Commands.DoContextMenu(ColumnsView, Point.x, Point.y, Background); end else if (gMouseSelectionEnabled and (gMouseSelectionButton = 1)) then begin ColumnsView.tmContextMenu.Enabled:= False; // stop context menu timer end; end { Open folder in new tab on middle click } else if (Button = mbMiddle) and (Y > GetHeaderHeight) then begin frmMain.Commands.cm_OpenDirInNewTab([]); end; end; procedure TDrawGridEx.MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); begin if ColumnsView.IsLoadingFileList then Exit; {$IFDEF LCLGTK2} // Workaround for two doubleclicks being sent on GTK. // MouseDown event is sent just before doubleclick, so if we drop // doubleclick events we have to also drop MouseDown events that precede them. if ColumnsView.TooManyDoubleClicks then Exit; {$ENDIF} ColumnsView.FMainControlMouseDown := True; inherited MouseDown(Button, Shift, X, Y); end; procedure TDrawGridEx.MouseMove(Shift: TShiftState; X, Y: Integer); procedure Scroll(ScrollCode: SmallInt); var Msg: TLMVScroll; begin Msg.Msg := LM_VSCROLL; Msg.ScrollCode := ScrollCode; Msg.SmallPos := 1; // How many lines scroll Msg.ScrollBar := Handle; Dispatch(Msg); end; begin inherited MouseMove(Shift, X, Y); if DragManager.IsDragging or ColumnsView.IsMouseSelecting then begin if Y < DefaultRowHeight then Scroll(SB_LINEUP) else if Y > ClientHeight - DefaultRowHeight then Scroll(SB_LINEDOWN); end; end; function TDrawGridEx.MouseOnGrid(X, Y: LongInt): Boolean; var bTemp: Boolean; iRow, iCol: LongInt; begin bTemp:= AllowOutboundEvents; AllowOutboundEvents:= False; MouseToCell(X, Y, iCol, iRow); AllowOutboundEvents:= bTemp; Result:= not ((iCol < 0) and (iRow < 0)); end; function TDrawGridEx.GetHeaderHeight: Integer; var i : Integer; begin Result := 0; for i := 0 to FixedRows-1 do Result := Result + RowHeights[i]; if Flat and (BorderStyle = bsSingle) then // TCustomGrid.GetBorderWidth Result := Result + 1; end; function TDrawGridEx.GetGridHorzLine: Boolean; begin Result := goHorzLine in Options; end; function TDrawGridEx.GetGridVertLine: Boolean; begin Result := goVertLine in Options; end; procedure TDrawGridEx.SetGridHorzLine(const AValue: Boolean); begin if AValue then Options := Options + [goHorzLine] else Options := Options - [goHorzLine]; end; procedure TDrawGridEx.SetGridVertLine(const AValue: Boolean); begin if AValue then Options := Options + [goVertLine] else Options := Options - [goVertLine]; end; function TDrawGridEx.GetVisibleRows: TRange; var w: Integer; rc: Integer; begin if (TopRow<0)or(csLoading in ComponentState) then begin Result.First := 0; Result.Last := -1; Exit; end; // visible TopLeft Cell Result.First:=TopRow; Result.Last:=Result.First; rc := RowCount; // Top Margin of next visible Row and Bottom most visible cell if rc>FixedRows then begin w:=RowHeights[Result.First] + GCache.FixedHeight - GCache.TLRowOff; while (Result.Last= FixedRows) then ColumnsView.Selection(SavedKey, Row - FixedRows); end; procedure TDrawGridEx.ScrollHorizontally(ForwardDirection: Boolean); function TryMove(ACol: Integer): Boolean; begin Result := not IscellVisible(ACol, Row); if Result then MoveExtend(False, ACol, Row); end; var i: Integer; begin if ForwardDirection then begin for i := Col + 1 to ColCount - 1 do if TryMove(i) then Break; end else begin for i := Col - 1 downto 0 do if TryMove(i) then Break; end; end; end. doublecmd-0.5.8/src/fileviews/ufileview.pas0000644000175000017500000027236712243704276020026 0ustar alexxalexxunit uFileView; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Controls, ExtCtrls, Graphics, ComCtrls, contnrs, fgl, LMessages, uFile, uDisplayFile, uFileSource, uFormCommands, uDragDropEx, DCXmlConfig, DCClassesUtf8, uFileSorting, uFileViewHistory, uFileProperty, uFileViewWorker, uFunctionThread, uFileSystemWatcher, fQuickSearch, StringHashList, uGlobs; type TFileView = class; {en Called before path is changed. If it returns @true the paths is changed (and if successful, OnAfterChangePath is called). If it returns @false, the path is not changed. NewFileSource is @nil the last file source is to be removed. } TOnBeforeChangePath = function (FileView: TFileView; NewFileSource: IFileSource; const NewPath : String): Boolean of object; TOnAfterChangePath = procedure (FileView: TFileView) of object; TOnChangeActiveFile = procedure (FileView: TFileView; const aFile : TFile) of object; TOnActivate = procedure (aFileView: TFileView) of object; TOnFileListChanged = procedure (aFileView: TFileView) of object; TDropParams = class; TDragDropType = (ddtInternal, ddtExternal); // Lists all operations supported by dragging and dropping items // in the panel (external, internal and via menu). TDragDropOperation = (ddoCopy, ddoMove, ddoSymLink, ddoHardLink); TFileViewWorkers = specialize TFPGObjectList; TFileViewFlag = (fvfDelayLoadingFiles, fvfDontLoadFiles, fvfDontWatch); TFileViewFlags = set of TFileViewFlag; TFileViewRequest = (fvrqApplyPendingFilesChanges, // Pending files changes need to be applied to the file list fvrqHashFileList, // Files names need rehashing due to file list changes fvrqMakeDisplayFileList); // Filtered file list needs to be created TFileViewRequests = set of TFileViewRequest; TFileViewNotification = (fvnDisplayFileListChanged, // Filtered file list was created (filter changed, show/hide hidden files option changed, etc.) fvnFileSourceFileListLoaded, // File list was loaded from FileSource fvnFileSourceFileListUpdated, // File list was updated (files added, removed or updated) fvnSelectionChanged, // Files were selected/deselected fvnVisibleFilePropertiesChanged); // Different files or their properties are now visible TFileViewNotifications = set of TFileViewNotification; TFileViewApplyFilterResult = (fvaprRemoved, fvaprInserted, fvaprExisting, fvaprNotExisting); {en Base class for any view of a file or files. There should always be at least one file displayed on the view. } { TFileView } TFileView = class(TWinControl) private {en History of viewed paths and file sources. Contains: - File sources hierarchy associated with this view. Last element is the file source that is currently being viewed, parent file source is (index-1) and so on up to zero (first file source). - Visited paths history for each file source. Last path is the currently viewed path. } FHistory: TFileViewHistory; FSortings: TFileSortings; {en Which file properties are needed to be displayed for each file. } FFilePropertiesNeeded: TFilePropertiesTypes; FFileViewWorkers: TFileViewWorkers; FFlags: TFileViewFlags; FHashedFiles: TBucketList; // 0 then begin MakeFileSourceFileList; end; finally EnableAutoSizing; end; end; constructor TFileView.Create(AOwner: TWinControl; AConfig: TXmlConfig; ANode: TXmlNode; AFlags: TFileViewFlags = []); begin DisableAutoSizing; try FFlags := AFlags; CreateDefault(AOwner); LoadConfiguration(AConfig, ANode); // Update view before making file source file list, // so that file list isn't unnecessarily displayed twice. UpdateView; if FileSourcesCount > 0 then begin MakeFileSourceFileList; end; finally EnableAutoSizing; end; end; procedure TFileView.CreateDefault(AOwner: TWinControl); begin FMethods := TFormCommands.Create(Self); FHistory := TFileViewHistory.Create; FSavedSelection:= TStringListEx.Create; FLastMark := '*'; FFiles := TDisplayFiles.Create(False); FFilterOptions := gQuickSearchOptions; FHashedNames := TStringHashList.Create(True); FFileViewWorkers := TFileViewWorkers.Create(False); FReloadTimer := TTimer.Create(Self); FReloadTimer.Enabled := False; FReloadTimer.OnTimer := @ReloadTimerEvent; FLoadingFileListLongTimer := TTimer.Create(Self); FLoadingFileListLongTimer.Enabled := False; FLoadingFileListLongTimer.Interval := 2000; FLoadingFileListLongTimer.OnTimer := @LoadingFileListTimer; BorderStyle := bsNone; // Before Create or the window handle may be recreated inherited Create(AOwner); Align := alClient; Parent := AOwner; if Parent is TFileViewPage then (Parent as TFileViewPage).OnActivate := @ActivateEvent; end; destructor TFileView.Destroy; var i: Integer; DbgWorkersThread: TFunctionThread; begin Clear; if Assigned(FWorkersThread) then begin // Wait until all the workers finish. FWorkersThread.Finish; DCDebug('Waiting for workers thread ', hexStr(FWorkersThread)); DbgWorkersThread := FWorkersThread; TFunctionThread.Finalize(FWorkersThread); DCDebug('Finalized workers thread ', hexStr(DbgWorkersThread)); end; // Now all the workers can be safely freed. if Assigned(FFileViewWorkers) then begin for i := 0 to FFileViewWorkers.Count - 1 do begin with FFileViewWorkers[i] do begin if Working then DCDebug('Error: Worker still working.') else if not CanBeDestroyed then DCDebug('Error: Worker cannot be destroyed.'); Free; end; end; FreeAndNil(FFileViewWorkers); end; inherited Destroy; FreeAndNil(FHashedFiles); FreeAndNil(FHashedNames); FreeAndNil(FHistory); FreeAndNil(FSavedSelection); FreeAndNil(FPendingFilesChanges); FreeAndNil(FRecentlyUpdatedFiles); end; function TFileView.Clone(NewParent: TWinControl): TFileView; begin raise Exception.Create('Cannot create object of abstract class'); Result := nil; // For compiler warning. end; procedure TFileView.CloneTo(AFileView: TFileView); var I: Integer; begin if Assigned(AFileView) then begin AFileView.FFlags := FFlags; AFileView.FLastLoadedFileSource := FLastLoadedFileSource; AFileView.FLastLoadedPath := FLastLoadedPath; AFileView.FLastMark := FLastMark; // FFileSource should have been passed to FileView constructor already. // FMethods are created in FileView constructor. AFileView.OnBeforeChangePath := Self.OnBeforeChangePath; AFileView.OnAfterChangePath := Self.OnAfterChangePath; AFileView.OnActivate := Self.OnActivate; AFileView.OnFileListChanged := Self.OnFileListChanged; for I := 0 to FSavedSelection.Count - 1 do AFileView.FSavedSelection.Add(FSavedSelection.Strings[I]); AFileView.FHistory.Assign(Self.FHistory); AFileView.FSortings := CloneSortings(Self.FSortings); AFileView.FLastActiveFile := Self.FLastActiveFile; AFileView.FRequestedActiveFile := Self.FRequestedActiveFile; AFileView.FReloadNeeded := Self.FReloadNeeded; if Assigned(Self.FAllDisplayFiles) then begin AFileView.FAllDisplayFiles := Self.FAllDisplayFiles.Clone(True); AFileView.Notify([fvnFileSourceFileListLoaded]); AFileView.Request([fvrqHashFileList]); end; // FFiles need to be recreated because the filter is not cloned. // This is done in AFileView.UpdateView. end; end; procedure TFileView.AddEventToPendingFilesChanges(const EventData: TFSWatcherEventData); function CheckLast(const sFileName: String; const EventType: TFSWatcherEventTypes; bDelete: Boolean): Boolean; var i: Integer; pEvent: PFSWatcherEventData; begin Result := False; for i := FPendingFilesChanges.Count - 1 downto 0 do begin pEvent := PFSWatcherEventData(FPendingFilesChanges[i]); if pEvent^.FileName = sFileName then begin if pEvent^.EventType in EventType then begin Result := True; if bDelete then begin Dispose(pEvent); FPendingFilesChanges.Delete(i); end else Break; end else Break; end; end; end; var pEvent: PFSWatcherEventData; begin if not Assigned(FPendingFilesChanges) then FPendingFilesChanges := TFPList.Create; if (Assigned(FAllDisplayFiles) and (FAllDisplayFiles.Count > 0) and (FPendingFilesChanges.Count > FAllDisplayFiles.Count div 4)) or (FPendingFilesChanges.Count > 100) then begin // Too many changes. Reload the whole file list again. Reload(EventData.Path); end else begin // Remove obsolete events if they exist. case EventData.EventType of fswFileCreated: CheckLast(EventData.FileName, [fswFileChanged, fswFileCreated, fswFileDeleted], True); fswFileDeleted: CheckLast(EventData.FileName, [fswFileChanged, fswFileCreated, fswFileDeleted], True); fswFileChanged: // If FileChanged or FileCreated already exists then new one is not scheduled. // FileCreated will cause update anyway if a file already exists in the filelist. if CheckLast(EventData.FileName, [fswFileChanged, fswFileCreated], False) then Exit; fswFileRenamed: CheckLast(EventData.FileName, [fswFileChanged, fswFileCreated, fswFileDeleted], True); end; New(pEvent); FPendingFilesChanges.Add(pEvent); pEvent^ := EventData; end; end; procedure TFileView.ApplyPendingFilesChanges(NewFilesPosition: TNewFilesPosition; UpdatedFilesPosition: TUpdatedFilesPosition); var i: Integer; pEvent: PFSWatcherEventData; begin if Assigned(FPendingFilesChanges) then begin BeginUpdate; try // Check if another reload was not issued. if FileListLoaded and (GetCurrentWorkType <> fvwtCreate) then begin for i := 0 to FPendingFilesChanges.Count - 1 do begin pEvent := PFSWatcherEventData(FPendingFilesChanges[i]); // Insert new files at sorted position since the filelist hasn't been // shown to the user yet, so no need to use user setting. HandleFSWatcherEvent(pEvent^, NewFilesPosition, UpdatedFilesPosition); // HandleFSWatcherEvent might call Reload which clears FPendingFilesChanges, so check for it. if not Assigned(FPendingFilesChanges) then Break; end; end; ClearPendingFilesChanges; finally EndUpdate; end; end; end; procedure TFileView.ClearPendingFilesChanges; var pEvent: PFSWatcherEventData; i: Integer; begin if Assigned(FPendingFilesTimer) then FPendingFilesTimer.Enabled := False; if Assigned(FPendingFilesChanges) then begin for i := 0 to FPendingFilesChanges.Count - 1 do begin pEvent := PFSWatcherEventData(FPendingFilesChanges[i]); Dispose(pEvent); end; FreeAndNil(FPendingFilesChanges); end; end; procedure TFileView.ClearRecentlyUpdatedFiles; begin if Assigned(FRecentlyUpdatedFilesTimer) then FRecentlyUpdatedFilesTimer.Enabled := False; if Assigned(FRecentlyUpdatedFiles) then FRecentlyUpdatedFiles.Clear; end; function TFileView.DimColor(AColor: TColor): TColor; begin if (not Active) and (gInactivePanelBrightness < 100) then Result := ModColor(AColor, gInactivePanelBrightness) else if FLoadingFileListLongTime then Result := DarkColor(AColor, 25) else Result := AColor; end; procedure TFileView.DisplayFileListChanged; begin // Empty. end; procedure TFileView.DoActiveChanged; begin // Empty. end; procedure TFileView.DoFileUpdated(AFile: TDisplayFile; UpdatedProperties: TFilePropertiesTypes); begin RedrawFile(AFile); end; procedure TFileView.DoHandleKeyDown(var Key: Word; Shift: TShiftState); begin case Key of VK_BACK: begin ChangePathToParent(True); Key := 0; end; VK_RETURN, VK_SELECT: begin if (Shift * KeyModifiersShortcut = []) then begin // Only if there are items in the panel. if not IsEmpty then begin ChooseFile(GetActiveDisplayFile); Key := 0; end; end // execute active file in terminal (Shift+Enter) else if (Shift * KeyModifiersShortcut = [ssShift]) then begin if IsActiveItemValid then begin mbSetCurrentDir(CurrentPath); ExecCmdFork(CurrentPath + GetActiveDisplayFile.FSFile.Name, True, gRunInTerm); Key := 0; end; end; end; end; end; procedure TFileView.DoHandleKeyDownWhenLoading(var Key: Word; Shift: TShiftState); begin case Key of VK_BACK: begin ChangePathToParent(True); Key := 0; end; end; end; procedure TFileView.DoLoadingFileListLongTime; begin RedrawFiles; end; function TFileView.FileListLoaded: Boolean; begin Result := Assigned(FAllDisplayFiles); end; procedure TFileView.FileSourceFileListLoaded; begin FLoadingFileListLongTimer.Enabled := False; end; procedure TFileView.FileSourceFileListUpdated; begin // Empty. end; procedure TFileView.Clear; var i: Integer; begin StopWorkers; for i := 0 to FHistory.Count - 1 do FHistory.FileSource[i].RemoveReloadEventListener(@ReloadEvent); ClearRecentlyUpdatedFiles; ClearPendingFilesChanges; RemoveAllFileSources; FreeAndNil(FFiles); FreeAndNil(FAllDisplayFiles); HashFileList; end; procedure TFileView.ClearFiles; begin if Assigned(FAllDisplayFiles) then begin ClearRecentlyUpdatedFiles; ClearPendingFilesChanges; FFiles.Clear; FAllDisplayFiles.Clear; // Clear references to files from the source. HashFileList; Notify([fvnDisplayFileListChanged]); end; end; function TFileView.GetNotebookPage: TCustomPage; begin if Parent is TCustomPage then Result := Parent as TCustomPage else Result := nil; end; procedure TFileView.AddFile(const FileName, APath: String; NewFilesPosition: TNewFilesPosition; UpdatedFilesPosition: TUpdatedFilesPosition); var ADisplayFile: TDisplayFile; AFile: TFile; I: Integer; begin I := FHashedNames.Find(FileName); if I < 0 then begin AFile := TFile.Create(APath); AFile.Name := FileName; try FileSource.RetrieveProperties(AFile, FilePropertiesNeeded); except on EFileSourceException do begin FreeAndNil(AFile); Exit; end; end; ADisplayFile := TDisplayFile.Create(AFile); FHashedFiles.Add(ADisplayFile, nil); FHashedNames.Add(FileName, ADisplayFile); InsertFile(ADisplayFile, FAllDisplayFiles, NewFilesPosition); if not TFileListBuilder.MatchesFilter(ADisplayFile.FSFile, FileFilter, FFilterOptions) then begin InsertFile(ADisplayFile, FFiles, NewFilesPosition); VisualizeFileUpdate(ADisplayFile); Notify([fvnFileSourceFileListUpdated, fvnDisplayFileListChanged]); end else Notify([fvnFileSourceFileListUpdated]); end else UpdateFile(FileName, APath, NewFilesPosition, UpdatedFilesPosition); end; procedure TFileView.RemoveFile(const FileName: String); var I: Integer; begin I := FHashedNames.Find(FileName); if I >= 0 then RemoveFile(TDisplayFile(FHashedNames.List[I]^.Data)); end; procedure TFileView.RemoveFile(ADisplayFile: TDisplayFile); begin FHashedNames.Remove(ADisplayFile.FSFile.Name); FHashedFiles.Remove(ADisplayFile); FFiles.Remove(ADisplayFile); FAllDisplayFiles.Remove(ADisplayFile); if Assigned(FRecentlyUpdatedFiles) then FRecentlyUpdatedFiles.Remove(ADisplayFile); Notify([fvnFileSourceFileListUpdated, fvnDisplayFileListChanged]); end; procedure TFileView.RenameFile(const NewFileName, OldFileName, APath: String; NewFilesPosition: TNewFilesPosition; UpdatedFilesPosition: TUpdatedFilesPosition); var ADisplayFile: TDisplayFile; OldIndex, NewIndex: Integer; ANotifications: TFileViewNotifications; begin OldIndex := FHashedNames.Find(OldFileName); NewIndex := FHashedNames.Find(NewFileName); if OldIndex >= 0 then begin ADisplayFile := TDisplayFile(FHashedNames.List[OldIndex]^.Data); if NewIndex < 0 then begin ADisplayFile.FSFile.Name := NewFileName; FHashedNames.Remove(OldFileName); FHashedNames.Add(NewFileName, ADisplayFile); ADisplayFile.IconID := -1; ADisplayFile.IconOverlayID := -1; ADisplayFile.TextColor := clNone; ADisplayFile.DisplayStrings.Clear; ResortFile(ADisplayFile, FAllDisplayFiles); ANotifications := [fvnFileSourceFileListUpdated]; case ApplyFilter(ADisplayFile, NewFilesPosition) of fvaprInserted, fvaprRemoved: Include(ANotifications, fvnDisplayFileListChanged); fvaprExisting: begin if GetActiveDisplayFile = ADisplayFile then RequestedActiveFile := ADisplayFile.FSFile.FullPath; ResortFile(ADisplayFile, FFiles); VisualizeFileUpdate(ADisplayFile); Include(ANotifications, fvnDisplayFileListChanged); end; end; Notify(ANotifications); end else begin RemoveFile(ADisplayFile); UpdateFile(NewFileName, APath, NewFilesPosition, UpdatedFilesPosition); end; end else begin if NewIndex < 0 then AddFile(NewFileName, APath, NewFilesPosition, UpdatedFilesPosition) else UpdateFile(NewFileName, APath, NewFilesPosition, UpdatedFilesPosition); end; end; procedure TFileView.Request(NewRequests: TFileViewRequests); begin FRequests := FRequests + NewRequests; if FUpdateCount = 0 then HandleRequests; end; procedure TFileView.ResortFile(ADisplayFile: TDisplayFile; AFileList: TDisplayFiles); var I: Integer; begin I := AFileList.Find(ADisplayFile); if I >= 0 then TDisplayFileSorter.ResortSingle(I, AFileList, SortingForSorter); end; procedure TFileView.StartRecentlyUpdatedTimerIfNeeded; begin if Assigned(FRecentlyUpdatedFiles) and (FRecentlyUpdatedFiles.Count > 0) then begin if not Assigned(FRecentlyUpdatedFilesTimer) then begin FRecentlyUpdatedFilesTimer := TTimer.Create(Self); FRecentlyUpdatedFilesTimer.Interval := 50; FRecentlyUpdatedFilesTimer.OnTimer := @UpdatedFilesTimerEvent; end; FRecentlyUpdatedFilesTimer.Enabled := True; end; end; procedure TFileView.StartUpdatePendingTimer; begin if not Assigned(FPendingFilesTimer) then begin FPendingFilesTimer := TTimer.Create(Self); FPendingFilesTimer.Interval := UpdateFilelistInterval; FPendingFilesTimer.OnTimer := @UpdatePendingTimerEvent; end; FPendingFilesTimer.Enabled := True; end; procedure TFileView.UpdateFile(const FileName, APath: String; NewFilesPosition: TNewFilesPosition; UpdatedFilesPosition: TUpdatedFilesPosition); var AFile: TFile; ADisplayFile: TDisplayFile; I: Integer; ANotifications: TFileViewNotifications; procedure Resort; begin ResortFile(ADisplayFile, FAllDisplayFiles); ResortFile(ADisplayFile, FFiles); end; procedure Update; begin case UpdatedFilesPosition of ufpNoChange: ; // Do nothing ufpSameAsNewFiles: if NewFilesPosition = nfpSortedPosition then Resort else begin FAllDisplayFiles.OwnsObjects := False; FAllDisplayFiles.Remove(ADisplayFile); // Remove only temporarily FAllDisplayFiles.OwnsObjects := True; InsertFile(ADisplayFile, FAllDisplayFiles, NewFilesPosition); FFiles.Remove(ADisplayFile); InsertFile(ADisplayFile, FFiles, NewFilesPosition); end; ufpSortedPosition: Resort; else raise Exception.Create('Unsupported UpdatedFilesPosition setting.'); end; VisualizeFileUpdate(ADisplayFile); end; begin I := FHashedNames.Find(FileName); if I >= 0 then begin ADisplayFile := TDisplayFile(FHashedNames.List[I]^.Data); AFile := ADisplayFile.FSFile; AFile.ClearProperties; try FileSource.RetrieveProperties(AFile, FilePropertiesNeeded); except on EFileNotFound do begin RemoveFile(ADisplayFile); Exit; end; on EFileSourceException do begin Exit; end; end; ADisplayFile.TextColor := clNone; ADisplayFile.IconOverlayID := -1; ADisplayFile.DisplayStrings.Clear; ANotifications := [fvnFileSourceFileListUpdated]; case ApplyFilter(ADisplayFile, NewFilesPosition) of fvaprInserted, fvaprRemoved: Include(ANotifications, fvnDisplayFileListChanged); fvaprExisting: begin Update; Include(ANotifications, fvnDisplayFileListChanged); end; end; Notify(ANotifications); end else AddFile(FileName, APath, NewFilesPosition, UpdatedFilesPosition); end; procedure TFileView.UpdatedFilesTimerEvent(Sender: TObject); var AFile: TDisplayFile; i: Integer = 0; begin while i < FRecentlyUpdatedFiles.Count do begin AFile := FRecentlyUpdatedFiles[i]; if AFile.RecentlyUpdatedPct = 0 then begin FRecentlyUpdatedFiles.Delete(i); end else begin AFile.RecentlyUpdatedPct := AFile.RecentlyUpdatedPct - 10; Inc(i); RedrawFile(AFile); end; end; if i = 0 then FRecentlyUpdatedFilesTimer.Enabled := False; end; procedure TFileView.UpdatePath(UpdateAddressToo: Boolean); begin // Maybe better to do via some notification like FileSourceHasChanged. UpdateView; end; procedure TFileView.UpdatePendingTimerEvent(Sender: TObject); begin FPendingFilesTimer.Enabled := False; ApplyPendingFilesChanges(gNewFilesPosition, gUpdatedFilesPosition); end; procedure TFileView.UpdateTitle; begin if Parent is TFileViewPage then TFileViewPage(Parent).UpdateTitle; end; procedure TFileView.VisualizeFileUpdate(AFile: TDisplayFile); begin if gHighlightUpdatedFiles then begin if not Assigned(FRecentlyUpdatedFiles) then FRecentlyUpdatedFiles := TDisplayFiles.Create(False); if FRecentlyUpdatedFiles.Find(AFile) < 0 then begin FRecentlyUpdatedFiles.Add(AFile); AFile.RecentlyUpdatedPct := 100; end; end; end; function TFileView.GetCurrentAddress: String; begin if FileSourcesCount > 0 then Result := FileSource.CurrentAddress else Result := ''; end; procedure TFileView.AddWorker(const Worker: TFileViewWorker; SetEvents: Boolean = True); begin FFileViewWorkers.Add(Worker); if SetEvents then begin Worker.OnStarting := @WorkerStarting; Worker.OnFinished := @WorkerFinished; end; end; procedure TFileView.BeginUpdate; begin Inc(FUpdateCount); end; procedure TFileView.CalculateSpace(AFile: TDisplayFile); var AFileList: TFVWorkerFileList; begin AFileList := TFVWorkerFileList.Create; try if IsItemValid(AFile) and AFile.FSFile.IsDirectory then AFileList.AddClone(AFile, AFile); CalculateSpace(AFileList); finally FreeAndNil(AFileList); end; end; procedure TFileView.CalculateSpace(var AFileList: TFVWorkerFileList); var Worker: TFileViewWorker; begin if GetCurrentWorkType = fvwtCreate then Exit; if AFileList.Count > 0 then begin Worker := TCalculateSpaceWorker.Create( FileSource, WorkersThread, @CalculateSpaceOnUpdate, AFileList); AddWorker(Worker); WorkersThread.QueueFunction(@Worker.StartParam); end else FreeAndNil(AFileList); end; procedure TFileView.CalculateSpaceOfAllDirectories; var i: Integer; AFileList: TFVWorkerFileList; AFile: TDisplayFile; begin if IsLoadingFileList then Exit; AFileList := TFVWorkerFileList.Create; try for i := 0 to FFiles.Count - 1 do begin AFile := FFiles[i]; if IsItemValid(AFile) and AFile.FSFile.IsDirectory then AFileList.AddClone(AFile, AFile); end; CalculateSpace(AFileList); finally FreeAndNil(AFileList); end; end; procedure TFileView.CalculateSpaceOnUpdate(const UpdatedFile: TDisplayFile; const UserData: Pointer); var OrigDisplayFile: TDisplayFile; begin OrigDisplayFile := TDisplayFile(UserData); if not IsReferenceValid(OrigDisplayFile) then Exit; // File does not exist anymore (reference is invalid). OrigDisplayFile.FSFile.Size := UpdatedFile.FSFile.Size; DoFileUpdated(OrigDisplayFile, [fpSize]); end; procedure TFileView.CancelLastPathChange; var FSIndex, PathIndex: Integer; begin // Get previous entry in history. FSIndex := FHistory.CurrentFileSourceIndex; PathIndex := FHistory.CurrentPathIndex - 1; while PathIndex < 0 do begin Dec(FSIndex); if FSIndex < 0 then Break; PathIndex := FHistory.PathsCount[FSIndex] - 1; end; // Go to it if it is the same as last loaded file list. if (FSIndex >= 0) and FHistory.FileSource[FSIndex].Equals(FLastLoadedFileSource) and (FHistory.Path[FSIndex, PathIndex] = FLastLoadedPath) then begin // Don't reload file list because we already have it. Flags := Flags + [fvfDontLoadFiles]; GoToHistoryIndex(FSIndex, PathIndex); Flags := Flags - [fvfDontLoadFiles]; end else ClearFiles; end; procedure TFileView.DoOnFileListChanged; begin if Assigned(OnFileListChanged) then OnFileListChanged(Self); end; procedure TFileView.EndUpdate; begin Dec(FUpdateCount); if (FUpdateCount = 0) and // This condition prevents endless recursion. ((FRequests <> []) or (FNotifications <> [])) then begin BeginUpdate; try HandleRequests; HandleNotifications; finally EndUpdate; end; end; end; function TFileView.GetCurrentPath: String; begin Result := FHistory.CurrentPath; end; procedure TFileView.SetCurrentPath(NewPath: String); begin if (NewPath <> CurrentPath) and BeforeChangePath(FileSource, NewPath) then begin EnableWatcher(False); FHistory.AddPath(NewPath); // Sets CurrentPath. AfterChangePath; EnableWatcher(True); {$IFDEF DEBUG_HISTORY} FHistory.DebugShow; {$ENDIF} end; end; procedure TFileView.SetFlags(AValue: TFileViewFlags); var AddedFlags, RemovedFlags: TFileViewFlags; begin if FFlags = AValue then Exit; AddedFlags := AValue - FFlags; RemovedFlags := FFlags - AValue; FFlags := AValue; if fvfDontWatch in AddedFlags then EnableWatcher(False); if ([fvfDelayLoadingFiles, fvfDontLoadFiles] * RemovedFlags <> []) then begin if not (FileListLoaded or (GetCurrentWorkType = fvwtCreate)) then Reload; EnableWatcher(True); end; if fvfDontWatch in RemovedFlags then EnableWatcher(True); end; procedure TFileView.SetLoadingFileListLongTime(AValue: Boolean); begin FLoadingFileListLongTimer.Enabled := False; if FLoadingFileListLongTime <> AValue then begin FLoadingFileListLongTime := AValue; DoLoadingFileListLongTime; end; end; function TFileView.CloneActiveFile: TFile; var aFile: TDisplayFile; begin aFile := GetActiveDisplayFile; if Assigned(aFile) then Result := aFile.FSFile.Clone else Result := nil; end; function TFileView.CloneFiles: TFiles; var i: Integer; begin Result := TFiles.Create(CurrentPath); for i := 0 to FFiles.Count - 1 do begin Result.Add(FFiles[i].FSFile.Clone); end; end; function TFileView.CloneSelectedFiles: TFiles; var i: Integer; begin Result := TFiles.Create(CurrentPath); for i := 0 to FFiles.Count - 1 do begin if FFiles[i].Selected then Result.Add(FFiles[i].FSFile.Clone); end; end; function TFileView.CloneSelectedOrActiveFiles: TFiles; var aFile: TDisplayFile; begin Result := CloneSelectedFiles; // If no files are selected, add currently active file if it is valid. if (Result.Count = 0) then begin aFile := GetActiveDisplayFile; if IsItemValid(aFile) then Result.Add(aFile.FSFile.Clone); end; end; function TFileView.GetWorkersThread: TFunctionThread; begin if not Assigned(FWorkersThread) then FWorkersThread := TFunctionThread.Create(False); Result := FWorkersThread; end; procedure TFileView.SaveSelection; var I: Integer; begin FSavedSelection.Clear; for I := 0 to FFiles.Count - 1 do with FFiles[I] do begin if Selected then FSavedSelection.Add(FSFile.Name); end; end; procedure TFileView.SaveSelectionToFile(const AFileName: String); begin with dmComData do begin SaveDialog.DefaultExt := '.txt'; SaveDialog.Filter := '*.txt|*.txt'; SaveDialog.FileName := AFileName; if (AFileName <> EmptyStr) or SaveDialog.Execute then try SaveSelection; FSavedSelection.SaveToFile(SaveDialog.FileName); except on E: Exception do msgError(rsMsgErrSaveFile + '-' + E.Message); end; end; end; procedure TFileView.RestoreSelection; var I: Integer; begin BeginUpdate; try for I := 0 to FFiles.Count - 1 do with FFiles[I] do Selected:= (FSavedSelection.IndexOf(FSFile.Name) >= 0); Notify([fvnSelectionChanged]); finally EndUpdate; end; end; procedure TFileView.InvertFileSelection(AFile: TDisplayFile; bNotify: Boolean = True); begin MarkFile(AFile, not AFile.Selected, bNotify); end; procedure TFileView.InvertAll; var i: Integer; begin BeginUpdate; try for i := 0 to FFiles.Count-1 do InvertFileSelection(FFiles[i]); finally EndUpdate; end; end; procedure TFileView.MarkFile(AFile: TDisplayFile; bSelect: Boolean; bNotify: Boolean = True); begin // Don't check if valid when just unselecting. if not bSelect then begin if not Assigned(AFile) then Exit; end else if not IsItemValid(AFile) then Exit; AFile.Selected := bSelect; if bNotify then Notify([fvnSelectionChanged]); end; procedure TFileView.MarkFiles(bSelect: Boolean); begin MarkFiles(0, FFiles.Count - 1, bSelect); end; procedure TFileView.MarkFiles(FromIndex, ToIndex: PtrInt; bSelect: Boolean); var Index: PtrInt; begin BeginUpdate; try for Index := FromIndex to ToIndex do MarkFile(FFiles[Index], bSelect); finally EndUpdate; end; end; procedure TFileView.MarkGroup(const sMask: String; bSelect: Boolean); var I: Integer; SearchTemplate: TSearchTemplate = nil; bSelected: Boolean = False; begin BeginUpdate; try if IsMaskSearchTemplate(sMask) then begin SearchTemplate:= gSearchTemplateList.TemplateByName[sMask]; if Assigned(SearchTemplate) then for I := 0 to FFiles.Count - 1 do begin if FFiles[I].FSFile.Name = '..' then Continue; if SearchTemplate.CheckFile(FFiles[I].FSFile) then begin FFiles[I].Selected := bSelect; bSelected := True; end; end; end else for I := 0 to FFiles.Count - 1 do begin if FFiles[I].FSFile.Name = '..' then Continue; if MatchesMaskList(FFiles[I].FSFile.Name, sMask) then begin FFiles[I].Selected := bSelect; bSelected := True; end; end; if bSelected then Notify([fvnSelectionChanged]); finally EndUpdate; end; end; procedure TFileView.MarkGroup(bSelect: Boolean); var s, ADlgTitle: String; begin if not IsEmpty then begin if bSelect then ADlgTitle := rsMarkPlus else ADlgTitle := rsMarkMinus; s := FLastMark; if ShowMaskInputDlg(ADlgTitle, rsMaskInput, glsMaskHistory, s) then begin FLastMark := s; MarkGroup(s, bSelect); end; end; end; procedure TFileView.MarkCurrentExtension(bSelect: Boolean); var sGroup: String; begin if IsActiveItemValid then begin sGroup := GetActiveDisplayFile.FSFile.Extension; if sGroup <> '' then sGroup := '.' + sGroup; MarkGroup('*' + sGroup, bSelect); end; end; function TFileView.IsVisibleToUser: Boolean; begin if NotebookPage is TFileViewPage then Result := TFileViewPage(NotebookPage).IsActive else Result := True; end; procedure TFileView.PropertiesRetrieverOnUpdate(const UpdatedFile: TDisplayFile; const UserData: Pointer); var propType: TFilePropertyType; aFile: TFile; OrigDisplayFile: TDisplayFile; begin OrigDisplayFile := TDisplayFile(UserData); if not IsReferenceValid(OrigDisplayFile) then Exit; // File does not exist anymore (reference is invalid). aFile := OrigDisplayFile.FSFile; {$IF (fpc_version>2) or ((fpc_version=2) and (fpc_release>4))} // This is a bit faster. for propType in UpdatedFile.FSFile.AssignedProperties - aFile.AssignedProperties do {$ELSE} for propType := Low(TFilePropertyType) to High(TFilePropertyType) do if (propType in UpdatedFile.FSFile.AssignedProperties) and (not (propType in aFile.AssignedProperties)) then {$ENDIF} begin aFile.Properties[propType] := UpdatedFile.FSFile.ReleaseProperty(propType); end; if UpdatedFile.IconID <> -1 then OrigDisplayFile.IconID := UpdatedFile.IconID; if UpdatedFile.IconOverlayID <> -1 then OrigDisplayFile.IconOverlayID := UpdatedFile.IconOverlayID; if UpdatedFile.TextColor <> clNone then OrigDisplayFile.TextColor := UpdatedFile.TextColor; DoFileUpdated(OrigDisplayFile); end; procedure TFileView.SetActiveFile(const aFile: TFile); begin end; procedure TFileView.SetActiveFile(aFilePath: String); begin end; procedure TFileView.SetActive(bActive, bNotify: Boolean); begin if FActive <> bActive then begin FActive := bActive; DoActiveChanged; end; if bActive and bNotify then begin // Deactivate all other views. frmMain.ForEachView(@EachViewDeactivate, nil); if Assigned(OnActivate) then OnActivate(Self); end; end; procedure TFileView.SetActive(bActive: Boolean); begin SetActive(bActive, True); end; procedure TFileView.SetSorting(const NewSortings: TFileSortings); begin FSortings := CloneSortings(NewSortings); if not IsLoadingFileList then begin SortAllDisplayFiles; ReDisplayFileList; end; end; procedure TFileView.SortAllDisplayFiles; begin TDisplayFileSorter.Sort(FAllDisplayFiles, SortingForSorter); end; procedure TFileView.MakeFileSourceFileList; var Worker: TFileViewWorker; AThread: TFunctionThread = nil; ClonedDisplayFiles: TDisplayFiles = nil; DisplayFilesHashed: TStringHashList = nil; i: Integer; begin if (csDestroying in ComponentState) or (FileSourcesCount = 0) or ([fvfDelayLoadingFiles, fvfDontLoadFiles] * Flags <> []) then Exit; {$IFDEF timeFileView} filelistLoaderTime := Now; DCDebug('--------- Start ---------'); {$ENDIF} StopWorkers; if gListFilesInThread and not (fspListInMainThread in FileSource.GetProperties) then AThread := GetWorkersThread; if FileSource.Equals(FLastLoadedFileSource) and (FLastLoadedPath = CurrentPath) and (FAllDisplayFiles.Count > 0) then begin // Clone all properties of display files, but don't clone the FS files // themselves because new ones will be retrieved from FileSource. ClonedDisplayFiles := FAllDisplayFiles.Clone(False); DisplayFilesHashed := TStringHashList.Create(True); // Map filename to display file. for i := 0 to FAllDisplayFiles.Count - 1 do DisplayFilesHashed.Add(FAllDisplayFiles[i].FSFile.FullPath, ClonedDisplayFiles[i]); end; Worker := TFileListBuilder.Create( FileSource, CurrentFileSourceIndex, FileFilter, FilterOptions, CurrentPath, SortingForSorter, AThread, FilePropertiesNeeded, @SetFileList, ClonedDisplayFiles, DisplayFilesHashed); AddWorker(Worker); ClearPendingFilesChanges; if gListFilesInThread and not (fspListInMainThread in FileSource.GetProperties) then begin ClearRecentlyUpdatedFiles; BeforeMakeFileList; AThread.QueueFunction(@Worker.StartParam); end else begin BeforeMakeFileList; Worker.Start; end; end; function TFileView.ApplyFilter(ADisplayFile: TDisplayFile; NewFilesPosition: TNewFilesPosition): TFileViewApplyFilterResult; var bFilterOut: Boolean; FilteredFilesIndex: Integer; begin bFilterOut := TFileListBuilder.MatchesFilter(ADisplayFile.FSFile, FileFilter, FFilterOptions); FilteredFilesIndex := FFiles.Find(ADisplayFile); if FilteredFilesIndex >= 0 then begin if bFilterOut then begin FFiles.Delete(FilteredFilesIndex); if Assigned(FRecentlyUpdatedFiles) then FRecentlyUpdatedFiles.Remove(ADisplayFile); Result := fvaprRemoved; end else Result := fvaprExisting; end else if not bFilterOut then begin InsertFile(ADisplayFile, FFiles, NewFilesPosition); VisualizeFileUpdate(ADisplayFile); Result := fvaprInserted; end else Result := fvaprNotExisting; end; procedure TFileView.BeforeMakeFileList; begin FLoadingFileListLongTimer.Enabled := True; end; function TFileView.BeginDragExternal(DragFile: TDisplayFile; DragDropSource: uDragDropEx.TDragDropSource; MouseButton: TMouseButton; ScreenStartPoint: TPoint): Boolean; var fileNamesList: TStringList; i: Integer; begin Result := False; if Assigned(DragDropSource) then begin fileNamesList := TStringList.Create; try if IsItemValid(DragFile) = True then begin for i := 0 to FFiles.Count-1 do begin if FFiles[i].Selected then fileNamesList.Add(FFiles[i].FSFile.FullPath); end; // If there were no files selected add the dragged file. if fileNamesList.Count = 0 then fileNamesList.Add(DragFile.FSFile.FullPath); // Initiate external drag&drop operation. Result := DragDropSource.DoDragDrop(fileNamesList, MouseButton, ScreenStartPoint); // Refresh source file panel after drop to (possibly) another application // (files could have been moved for example). // 'draggedFileItem' is invalid after this. Reload; end; finally FreeAndNil(fileNamesList); end; end; end; procedure TFileView.ChooseFile(const AFile: TDisplayFile; FolderMode: Boolean = False); var FSFile: TFile; begin if Assigned(AFile) and not IsLoadingFileList then begin FSFile := AFile.FSFile.Clone; try if FSFile.Name = '..' then ChangePathToParent(True) else if FSFile.IsLinkToDirectory then ChooseSymbolicLink(Self, FSFile) else if FSFile.IsDirectory then ChangePathToChild(FSFile) else if not FolderMode then try uFileSourceUtil.ChooseFile(Self, FSFile); except on e: EInvalidCommandLine do MessageDlg(rsMsgInvalidCommandLine, rsMsgInvalidCommandLine + ': ' + e.Message, mtError, [mbOK], 0); on e: Exception do MessageDlg('Error', e.Message, mtError, [mbOK], 0); end; finally FSFile.Free; end; end; end; procedure TFileView.DoSelectionChanged; begin // Empty. end; procedure TFileView.DoUpdateView; begin // Empty. end; procedure TFileView.EachViewDeactivate(AFileView: TFileView; UserData: Pointer); var ThisFileViewPage, OtherFileViewPage: TFileViewPage; begin if AFileView <> Self then begin ThisFileViewPage := TFileViewPage(GetNotebookPage); OtherFileViewPage := TFileViewPage(AFileView.GetNotebookPage); // Pages on the same notebook set to active and others to not active. if Assigned(ThisFileViewPage) and Assigned(OtherFileViewPage) then AFileView.SetActive(ThisFileViewPage.Notebook = OtherFileViewPage.Notebook, False); end; end; function TFileView.GetCurrentWorkType: TFileViewWorkType; var i: Integer; begin if Assigned(FFileViewWorkers) then begin for i := 0 to FFileViewWorkers.Count - 1 do if FFileViewWorkers[i].Working then Exit(FFileViewWorkers[i].WorkType); end; Result := fvwtNone; end; procedure TFileView.HashFileList; var i: Integer; begin // Cannot use FHashedFiles.Clear because it also destroys the buckets. FHashedFiles.Free; // TBucketList seems to do fairly well without needing a proper hash table. FHashedFiles := TBucketList.Create(bl256); FHashedNames.Clear; if Assigned(FAllDisplayFiles) then begin for i := 0 to FAllDisplayFiles.Count - 1 do begin FHashedFiles.Add(FAllDisplayFiles[i], nil); FHashedNames.Add(FAllDisplayFiles[i].FSFile.Name, FAllDisplayFiles[i]); end; end; end; procedure TFileView.InsertFile(ADisplayFile: TDisplayFile; AFileList: TDisplayFiles; NewFilesPosition: TNewFilesPosition); procedure InsertAfterUpDir; var i, InsertPos: Integer; begin InsertPos := AFileList.Count; for i := 0 to AFileList.Count - 1 do begin if (AFileList[i].FSFile.Name <> '..') and (AFileList[i].FSFile.Name <> '.') then begin InsertPos := i; Break; end; end; AFileList.List.Insert(InsertPos, ADisplayFile); end; procedure InsertIntoSortedPosition; begin TDisplayFileSorter.InsertSort(ADisplayFile, AFileList, SortingForSorter); end; var EmptySortings: TFileSortings = nil; begin if ADisplayFile.FSFile.IsDirectory or ADisplayFile.FSFile.IsLinkToDirectory then InsertIntoSortedPosition else case NewFilesPosition of nfpTop: InsertAfterUpDir; nfpTopAfterDirectories: if gSortFolderMode <> sfmSortLikeFile then // Will only sort by directory attribute. TDisplayFileSorter.InsertSort(ADisplayFile, AFileList, EmptySortings, True) else InsertIntoSortedPosition; nfpSortedPosition: InsertIntoSortedPosition; nfpBottom: AFileList.Add(ADisplayFile); else raise Exception.Create('Unsupported NewFilesPosition setting.'); end; end; function TFileView.HasSelectedFiles: Boolean; var i: Integer; begin for i := 0 to FFiles.Count - 1 do begin if FFiles[i].Selected then Exit(True); end; Result := False; end; function TFileView.IsActiveItemValid:Boolean; begin Result := IsItemValid(GetActiveDisplayFile); end; function TFileView.IsReferenceValid(aFile: TDisplayFile): Boolean; begin Result := FHashedFiles.Exists(aFile); end; function TFileView.IsEmpty: Boolean; begin Result := (FFiles.Count = 0); end; function TFileView.IsItemValid(AFile: TDisplayFile): Boolean; begin if Assigned(AFile) and (AFile.FSFile.Name <> '..') then Result := True else Result := False; end; function TFileView.IsLoadingFileList: Boolean; begin Result := GetCurrentWorkType = fvwtCreate; end; function TFileView.Reload(const PathsToReload: TPathsArray = nil): Boolean; var i: Integer; begin if csDestroying in ComponentState then Exit(False); if Assigned(PathsToReload) then begin Result := False; for i := Low(PathsToReload) to High(PathsToReload) do if IsInPath(PathsToReload[i], CurrentPath, True, True) then begin Result := True; Break; end; if not Result then Exit; end; if FReloadTimer.Enabled then begin // Reload is already scheduled. Result := True; end else if CheckIfDelayReload then begin // Delay reloading. Result := False; FReloadNeeded := True; end else begin if GetCurrentWorkType = fvwtCreate then begin Result := False; // Allow interrupting loading a few times. if FLoadFilesNoDelayCount < 2 then begin Inc(FLoadFilesNoDelayCount); DoReload; end else begin // Let current loading finish and another will be scheduled after delay via timer. FReloadNeeded := True; end; end else begin Result := True; if DateTimeToTimeStamp(SysUtils.Now - FLoadFilesFinishTime).Time > MinimumReloadInterval then begin FLoadFilesNoDelayCount := 0; DoReload; end // Allow a few reloads in quick succession. else if FLoadFilesNoDelayCount < 4 then begin Inc(FLoadFilesNoDelayCount); DoReload; end else begin FReloadTimer.Interval := MinimumReloadInterval; FReloadTimer.Enabled := True; end; end; end; end; function TFileView.Reload(const PathToReload: String): Boolean; var Paths: TPathsArray; begin SetLength(Paths, 1); Paths[0] := PathToReload; Result := Reload(Paths); end; procedure TFileView.ReloadIfNeeded; begin if FReloadNeeded then Reload; end; procedure TFileView.StopWorkers; var i: Integer = 0; begin // Abort any working workers and destroy those that have finished. while i < FFileViewWorkers.Count do begin if FFileViewWorkers[i].CanBeDestroyed then begin FFileViewWorkers[i].Free; FFileViewWorkers.Delete(i); end else begin if FFileViewWorkers[i].Working then FFileViewWorkers[i].Abort; Inc(i); end; end; SetLoadingFileListLongTime(False); end; procedure TFileView.LoadConfiguration(Section: String; TabIndex: Integer); begin // Empty. For backward compatibility with loading from INI. end; procedure TFileView.SaveConfiguration(Section: String; TabIndex: Integer); begin // Empty. For backward compatibility with saving to INI. end; procedure TFileView.LoadConfiguration(AConfig: TXmlConfig; ANode: TXmlNode); var HistoryNode, EntryNode, FSNode, PathsNode: TXmlNode; SortingsNode, SortingSubNode, SortFunctionNode: TXmlNode; sFSType, sPath: String; aFileSource: IFileSource = nil; ActiveFSIndex: Integer = -1; ActivePathIndex: Integer = -1; NewSorting: TFileSortings = nil; SortDirection: TSortDirection; SortFunctions: TFileFunctions; SortFunctionInt: Integer; begin RemoveAllFileSources; // Sorting. SortingsNode := AConfig.FindNode(ANode, 'Sortings'); if Assigned(SortingsNode) then begin SortingSubNode := SortingsNode.FirstChild; while Assigned(SortingSubNode) do begin if SortingSubNode.CompareName('Sorting') = 0 then begin if AConfig.TryGetValue(SortingSubNode, 'Direction', Integer(SortDirection)) then begin SortFunctions := nil; SortFunctionNode := SortingSubNode.FirstChild; while Assigned(SortFunctionNode) do begin if SortFunctionNode.CompareName('Function') = 0 then begin if TryStrToInt(AConfig.GetContent(SortFunctionNode), SortFunctionInt) then AddSortFunction(SortFunctions, TFileFunction(SortFunctionInt)); end; SortFunctionNode := SortFunctionNode.NextSibling; end; AddSorting(NewSorting, SortFunctions, SortDirection); end; end; SortingSubNode := SortingSubNode.NextSibling; end; end; FSortings := NewSorting; // SetSorting not needed here, will be called in UpdateView // History. HistoryNode := AConfig.FindNode(ANode, 'History'); if Assigned(HistoryNode) then begin EntryNode := HistoryNode.FirstChild; while Assigned(EntryNode) do begin if EntryNode.CompareName('Entry') = 0 then begin FSNode := EntryNode.FindNode('FileSource'); if Assigned(FSNode) then begin if AConfig.TryGetAttr(FSNode, 'Type', sFSType) then begin // Create file source based on saved configuration or create empty and // allow it to read its configuration from FSNode. if sFSType = 'FileSystem' then aFileSource := TFileSystemFileSource.GetFileSource; if Assigned(aFileSource) then begin FHistory.AddFileSource(aFileSource); // Load paths history. PathsNode := AConfig.FindNode(EntryNode, 'Paths'); if Assigned(PathsNode) then begin PathsNode := PathsNode.FirstChild; while Assigned(PathsNode) do begin if PathsNode.CompareName('Path') = 0 then begin sPath := AConfig.GetContent(PathsNode); // Go to upper directory if it doesn't exist (filesystem only for now). if aFileSource.IsInterface(IFileSystemFileSource) then begin sPath := GetDeepestExistingPath(sPath); end; if sPath <> EmptyStr then begin FHistory.AddPath(sPath); if AConfig.GetAttr(PathsNode, 'Active', False) then ActivePathIndex := FHistory.PathsCount[FHistory.Count - 1] - 1; end; end; PathsNode := PathsNode.NextSibling; end; end; // Delete the file source if no paths loaded. if FHistory.PathsCount[FHistory.Count - 1] = 0 then FHistory.DeleteFromCurrentFileSource else begin // Check if the current history entry is active. if AConfig.GetAttr(EntryNode, 'Active', False) then ActiveFSIndex := FHistory.Count - 1; end; end; end; end; end; EntryNode := EntryNode.NextSibling; end; end; // Set current history position. if (ActiveFSIndex < 0) or (ActiveFSIndex > FHistory.Count - 1) then ActiveFSIndex := FHistory.Count - 1; if ActiveFSIndex <> -1 then begin if (ActivePathIndex < 0) or (ActivePathIndex > FHistory.PathsCount[ActiveFSIndex] - 1) then ActivePathIndex := FHistory.PathsCount[ActiveFSIndex] - 1; end else ActivePathIndex := -1; FHistory.SetIndexes(ActiveFSIndex, ActivePathIndex); if Assigned(FileSource) then FileSource.AddReloadEventListener(@ReloadEvent); // No automatic reload here. end; procedure TFileView.LoadingFileListTimer(Sender: TObject); begin SetLoadingFileListLongTime(True); end; procedure TFileView.LoadSelectionFromClipboard; begin FSavedSelection.Text:= Clipboard.AsText; RestoreSelection; end; procedure TFileView.LoadSelectionFromFile(const AFileName: String); begin with dmComData do begin OpenDialog.DefaultExt := '.txt'; OpenDialog.Filter := '*.txt|*.txt'; OpenDialog.FileName := AFileName; if ((AFileName <> EmptyStr) and mbFileExists(AFileName)) or OpenDialog.Execute then try FSavedSelection.LoadFromFile(OpenDialog.FileName); RestoreSelection; except on E: Exception do msgError(rsMsgErrEOpen + '-' + E.Message); end; end; end; procedure TFileView.SaveConfiguration(AConfig: TXmlConfig; ANode: TXmlNode); var HistoryNode, EntryNode, FSNode, PathsNode, PathNode: TXmlNode; SortingsNode, SortingSubNode: TXmlNode; i, j: Integer; PathIndex: Integer; ASorting: TFileSortings; begin AConfig.ClearNode(ANode); // Sorting. ASorting := Sorting; if Length(ASorting) > 0 then begin SortingsNode := AConfig.FindNode(ANode, 'Sortings', True); for i := Low(ASorting) to High(ASorting) do begin SortingSubNode := AConfig.AddNode(SortingsNode, 'Sorting'); AConfig.AddValue(SortingSubNode, 'Direction', Integer(ASorting[i].SortDirection)); for j := Low(ASorting[i].SortFunctions) to High(ASorting[i].SortFunctions) do AConfig.AddValue(SortingSubNode, 'Function', Integer(ASorting[i].SortFunctions[j])); end; end; // History. HistoryNode := AConfig.FindNode(ANode, 'History', True); AConfig.ClearNode(HistoryNode); for i := 0 to FileSourcesCount - 1 do begin // Currently saves only FileSystem. if TFileSystemFileSource.ClassNameIs(FHistory.FileSource[i].ClassName) then begin EntryNode := AConfig.AddNode(HistoryNode, 'Entry'); if FHistory.CurrentFileSourceIndex = i then AConfig.SetAttr(EntryNode, 'Active', True); FSNode := AConfig.AddNode(EntryNode, 'FileSource'); AConfig.SetAttr(FSNode, 'Type', 'FileSystem'); // Save paths history. PathsNode := AConfig.AddNode(EntryNode, 'Paths'); if gSaveDirHistory then begin for j := 0 to FHistory.PathsCount[i] - 1 do begin PathNode := AConfig.AddNode(PathsNode, 'Path'); // Mark path as active (don't need to if it is the last one). if (FHistory.CurrentFileSourceIndex = i) and (FHistory.CurrentPathIndex = j) and (j < FHistory.PathsCount[i] - 1) then begin AConfig.SetAttr(PathNode, 'Active', True); end; AConfig.SetContent(PathNode, FHistory.Path[i, j]); end; end else begin if FHistory.CurrentFileSourceIndex = i then PathIndex := FHistory.CurrentPathIndex else PathIndex := FHistory.PathsCount[i] - 1; AConfig.AddValue(PathsNode, 'Path', FHistory.Path[i, PathIndex]); end; end; end; end; procedure TFileView.UpdateView; var bLoadingFilelist: Boolean; begin bLoadingFilelist := GetCurrentWorkType = fvwtCreate; StopWorkers; DoUpdateView; if bLoadingFilelist then MakeFileSourceFileList else begin // Always recreate file list because things like ignore list might have changed. if Assigned(FAllDisplayFiles) then Request([fvrqMakeDisplayFileList]); end; EnableWatcher(IsFileSystemWatcher); UpdateTitle; end; function TFileView.BeforeChangePath(NewFileSource: IFileSource; NewPath: String): Boolean; begin if NewPath <> '' then begin if Assigned(OnBeforeChangePath) then if not OnBeforeChangePath(Self, NewFileSource, NewPath) then Exit(False); if Assigned(NewFileSource) and not NewFileSource.SetCurrentWorkingDirectory(NewPath) then begin msgError(Format(rsMsgChDirFailed, [NewPath])); Exit(False); end; Result := True; end else Result := False; end; procedure TFileView.AfterChangePath; begin LastActiveFile := ''; RequestedActiveFile := ''; FReloadNeeded := False; FReloadTimer.Enabled := False; FLoadFilesStartTime := 0; FLoadFilesFinishTime := 0; FLoadFilesNoDelayCount := 0; if Assigned(OnAfterChangePath) then OnAfterChangePath(Self); UpdateTitle; MakeFileSourceFileList; end; procedure TFileView.ChangePathToParent(AllowChangingFileSource: Boolean); var PreviousSubDirectory, sUpLevel: String; begin // Check if this is root level of the current file source. if FileSource.IsPathAtRoot(CurrentPath) then begin // If there is a higher level file source then change to it. if (FileSourcesCount > 1) and AllowChangingFileSource then begin RemoveCurrentFileSource; end; end else begin PreviousSubDirectory := ExtractFileName(ExcludeTrailingPathDelimiter(CurrentPath)); sUpLevel:= FileSource.GetParentDir(CurrentPath); if sUpLevel <> EmptyStr then begin CurrentPath := sUpLevel; SetActiveFile(PreviousSubDirectory); end; end; end; procedure TFileView.ChangePathToChild(const aFile: TFile); begin if Assigned(aFile) and aFile.IsNameValid and (aFile.IsDirectory or aFile.IsLinkToDirectory) then begin // Workaround for Search Result File Source if FileSource is TSearchResultFileSource then SetFileSystemPath(Self, aFile.FullPath) else CurrentPath := CurrentPath + IncludeTrailingPathDelimiter(aFile.Name); end; end; procedure TFileView.ExecuteCommand(CommandName: String; const Params: array of String); begin FMethods.ExecuteCommand(CommandName, Params); end; procedure TFileView.AddFileSource(aFileSource: IFileSource; aPath: String); var IsNewFileSource: Boolean; begin IsNewFileSource := not aFileSource.Equals(FileSource); if BeforeChangePath(aFileSource, aPath) then begin if Assigned(FileSource) and IsNewFileSource then FileSource.RemoveReloadEventListener(@ReloadEvent); EnableWatcher(False); // Workaround for Search Result File Source if FileSource is TSearchResultFileSource then begin FHistory.Clear; if NotebookPage is TFileViewPage then begin (NotebookPage as TFileViewPage).PermanentTitle:= EmptyStr; end; end; FHistory.Add(aFileSource, aPath); AfterChangePath; if Assigned(FileSource) and IsNewFileSource then begin UpdatePath(True); FileSource.AddReloadEventListener(@ReloadEvent); end; EnableWatcher(True); {$IFDEF DEBUG_HISTORY} FHistory.DebugShow; {$ENDIF} end; end; procedure TFileView.RemoveCurrentFileSource; var NewFileSource: IFileSource = nil; NewPath: String = ''; IsNewFileSource: Boolean; PrevIndex: Integer; FocusedFile: String; begin if FileSourcesCount > 0 then begin // TODO: Do this by remembering focused file name in a list? FocusedFile := ExtractFileName(FileSource.CurrentAddress); PrevIndex := FHistory.CurrentFileSourceIndex - 1; if PrevIndex < 0 then begin FileSource.RemoveReloadEventListener(@ReloadEvent); EnableWatcher(False); // Workaround for Search Result File Source if FileSource is TSearchResultFileSource then begin if NotebookPage is TFileViewPage then begin (NotebookPage as TFileViewPage).PermanentTitle:= EmptyStr; end; end; FHistory.Clear; AfterChangePath; end else begin NewFileSource := FHistory.FileSource[PrevIndex]; NewPath := FHistory.Path[PrevIndex, FHistory.PathsCount[PrevIndex] - 1]; if BeforeChangePath(NewFileSource, NewPath) then begin IsNewFileSource := not NewFileSource.Equals(FileSource); if IsNewFileSource then FileSource.RemoveReloadEventListener(@ReloadEvent); EnableWatcher(False); FHistory.DeleteFromCurrentFileSource; AfterChangePath; if Assigned(FileSource) and IsNewFileSource then begin UpdatePath(True); FileSource.AddReloadEventListener(@ReloadEvent); end; EnableWatcher(True); SetActiveFile(FocusedFile); {$IFDEF DEBUG_HISTORY} FHistory.DebugShow; {$ENDIF} end; end; end; end; procedure TFileView.RemoveAllFileSources; begin if FileSourcesCount > 0 then begin FileSource.RemoveReloadEventListener(@ReloadEvent); EnableWatcher(False); FHistory.Clear; if not (csDestroying in ComponentState) then AfterChangePath; {$IFDEF DEBUG_HISTORY} FHistory.DebugShow; {$ENDIF} end; end; procedure TFileView.AssignFileSources(const otherFileView: TFileView); begin FileSource.RemoveReloadEventListener(@ReloadEvent); EnableWatcher(False); FHistory.Assign(otherFileView.FHistory); UpdatePath(True); FileSource.AddReloadEventListener(@ReloadEvent); AfterChangePath; EnableWatcher(True); end; function TFileView.GetCurrentFileSource: IFileSource; begin Result := FHistory.CurrentFileSource; end; function TFileView.GetCurrentFileSourceIndex: Integer; begin Result := FHistory.CurrentFileSourceIndex; end; function TFileView.GetCurrentPathIndex: Integer; begin Result := FHistory.CurrentPathIndex; end; function TFileView.GetFileSource(Index: Integer): IFileSource; begin Result := FHistory.FileSource[Index]; end; function TFileView.GetFileSourcesCount: Integer; begin Result := FHistory.Count; end; function TFileView.GetFiltered: Boolean; begin Result := Self.FileFilter <> EmptyStr; end; function TFileView.GetPath(FileSourceIndex, PathIndex: Integer): UTF8String; begin with FHistory do begin if (Count > 0) and (PathIndex >= 0) and (PathIndex < PathsCount[FileSourceIndex]) then Result := Path[FileSourceIndex, PathIndex] else Result := EmptyStr; end; end; function TFileView.GetPathsCount(FileSourceIndex: Integer): Integer; begin with FHistory do begin if Count > 0 then Result := PathsCount[FileSourceIndex] else Result := 0; end; end; function TFileView.GetSortingForSorter: TFileSortings; begin Result := CloneAndAddSortByNameIfNeeded(Sorting); end; function TFileView.GetWatcherActive: Boolean; begin Result := FWatchPath <> EmptyStr; end; procedure TFileView.HandleNotifications; begin BeginUpdate; try while FNotifications <> [] do begin if fvnFileSourceFileListLoaded in FNotifications then begin FNotifications := FNotifications - [fvnFileSourceFileListLoaded]; FileSourceFileListLoaded; DoOnFileListChanged; end else if fvnFileSourceFileListUpdated in FNotifications then begin FNotifications := FNotifications - [fvnFileSourceFileListUpdated]; FileSourceFileListUpdated; DoOnFileListChanged; end else if fvnDisplayFileListChanged in FNotifications then begin FNotifications := FNotifications - [fvnDisplayFileListChanged]; DisplayFileListChanged; StartRecentlyUpdatedTimerIfNeeded; end else if fvnVisibleFilePropertiesChanged in FNotifications then begin FNotifications := FNotifications - [fvnVisibleFilePropertiesChanged]; EnsureDisplayProperties; end else if fvnSelectionChanged in FNotifications then begin FNotifications := FNotifications - [fvnSelectionChanged]; DoSelectionChanged; end; end; finally EndUpdate; end; end; procedure TFileView.HandleRequests; begin BeginUpdate; try while FRequests <> [] do begin // Order is important because of dependencies. // Remove request before acting on it, since a function called may request it again. if fvrqHashFileList in FRequests then begin FRequests := FRequests - [fvrqHashFileList]; HashFileList; end else if fvrqApplyPendingFilesChanges in FRequests then begin FRequests := FRequests - [fvrqApplyPendingFilesChanges]; ApplyPendingFilesChanges(nfpSortedPosition, ufpSortedPosition); end else if fvrqMakeDisplayFileList in FRequests then begin FRequests := FRequests - [fvrqMakeDisplayFileList]; ReDisplayFileList; end; end; finally EndUpdate; end; end; procedure TFileView.Notify(NewNotifications: TFileViewNotifications); begin FNotifications := FNotifications + NewNotifications; if FUpdateCount = 0 then HandleNotifications; end; procedure TFileView.OpenActiveFile; begin ChooseFile(GetActiveDisplayFile); end; procedure TFileView.SetFileFilter(NewFilter: String; NewFilterOptions: TQuickSearchOptions); begin // do not reload if filter has not changed if (FFileFilter = NewFilter) and (FFilterOptions = NewFilterOptions) then Exit; FFileFilter := NewFilter; FFilterOptions := NewFilterOptions; Request([fvrqMakeDisplayFileList]); end; procedure TFileView.SetFilelist(var NewAllDisplayFiles: TDisplayFiles; var NewFilteredDisplayFiles: TDisplayFiles); var ARequests: TFileViewRequests; begin ClearRecentlyUpdatedFiles; FFiles.Free; FFiles := NewFilteredDisplayFiles; NewFilteredDisplayFiles := nil; FAllDisplayFiles.Free; FAllDisplayFiles := NewAllDisplayFiles; NewAllDisplayFiles := nil; FLastLoadedFileSource := FileSource; FLastLoadedPath := CurrentPath; BeginUpdate; try ARequests := [fvrqHashFileList]; if not FReloadNeeded then Include(ARequests, fvrqApplyPendingFilesChanges) else ClearPendingFilesChanges; Request(ARequests); Notify([fvnFileSourceFileListLoaded, fvnDisplayFileListChanged]); finally EndUpdate; end; // We have just reloaded file list, so the requested file should be there. // Regardless if it is there or not it should be cleared so that it doesn't // get selected on further reloads. RequestedActiveFile := ''; end; procedure TFileView.EnableWatcher(Enable: Boolean); var WatchFilter: TFSWatchFilter; begin if Enable then begin if ([fvfDelayLoadingFiles, fvfDontWatch] * Flags = []) and Assigned(FileSource) and FileSource.IsClass(TFileSystemFileSource) and (FWatchPath <> CurrentPath) then begin if WatcherActive then EnableWatcher(False); // If current path is in exclude list then exit. if (watch_exclude_dirs in gWatchDirs) and (gWatchDirsExclude <> '') then begin if IsInPathList(gWatchDirsExclude, CurrentPath) then Exit; end; WatchFilter := []; if watch_file_name_change in gWatchDirs then Include(WatchFilter, wfFileNameChange); if watch_attributes_change in gWatchDirs then Include(WatchFilter, wfAttributesChange); if WatchFilter <> [] then begin FWatchPath := CurrentPath; if TFileSystemWatcher.AddWatch(FWatchPath, WatchFilter, @WatcherEvent) = False then FWatchPath := EmptyStr; end; end; end else begin TFileSystemWatcher.RemoveWatch(FWatchPath, @WatcherEvent); FWatchPath := EmptyStr; end; end; procedure TFileView.ActivateEvent(Sender: TObject); begin SetFlags(Flags - [fvfDelayLoadingFiles]); ReloadIfNeeded; end; function TFileView.CheckIfDelayReload: Boolean; begin Result := ((watch_only_foreground in gWatchDirs) and (not Application.Active)) or (not IsVisibleToUser); end; procedure TFileView.DoReload; begin FReloadNeeded := False; MakeFileSourceFileList; end; procedure TFileView.HandleFSWatcherEvent(const EventData: TFSWatcherEventData; NewFilesPosition: TNewFilesPosition; UpdatedFilesPosition: TUpdatedFilesPosition); begin case EventData.EventType of fswFileCreated: Self.AddFile(EventData.FileName, EventData.Path, NewFilesPosition, UpdatedFilesPosition); fswFileChanged: Self.UpdateFile(EventData.FileName, EventData.Path, NewFilesPosition, UpdatedFilesPosition); fswFileDeleted: Self.RemoveFile(EventData.FileName); fswFileRenamed: Self.RenameFile(EventData.NewFileName, EventData.FileName, EventData.Path, NewFilesPosition, UpdatedFilesPosition); else Reload(EventData.Path); end; end; procedure TFileView.HandleKeyDownWhenLoading(var Key: Word; Shift: TShiftState); begin // Only allow some keys and always zero Key (handled). DoHandleKeyDownWhenLoading(Key, Shift); Key := 0; end; procedure TFileView.ReloadEvent(const aFileSource: IFileSource; const ReloadedPaths: TPathsArray); begin // Reload file view but only if the file source is currently viewed // and FileSystemWatcher is not being used. if not WatcherActive and aFileSource.Equals(FileSource) then Reload(ReloadedPaths); end; procedure TFileView.ReloadTimerEvent(Sender: TObject); begin FReloadTimer.Enabled := False; DoReload; end; procedure TFileView.WatcherEvent(const EventData: TFSWatcherEventData); var CurrentTime: TDateTime; AddToPending: Boolean; begin if not (csDestroying in ComponentState) and not FReloadNeeded and (IncludeTrailingPathDelimiter(EventData.Path) = CurrentPath) then begin if GetCurrentWorkType = fvwtCreate then begin // If some unknown change then we can only reload the whole file list. if EventData.EventType <> fswUnknownChange then AddEventToPendingFilesChanges(EventData) else Reload(EventData.Path); end else begin if FileListLoaded then begin AddToPending := Assigned(FPendingFilesTimer) and FPendingFilesTimer.Enabled; if not AddToPending then begin CurrentTime := SysUtils.Now; if DateTimeToTimeStamp(CurrentTime - FWatcherEventLastTime).Time > UpdateFilelistInterval then FWatcherEventsApplied := 0; FWatcherEventLastTime := CurrentTime; if FWatcherEventsApplied < 5 then begin Inc(FWatcherEventsApplied); HandleFSWatcherEvent(EventData, gNewFilesPosition, gUpdatedFilesPosition); end else AddToPending := True; end; if AddToPending then begin AddEventToPendingFilesChanges(EventData); StartUpdatePendingTimer; end; end // else filelist not loaded and not even started loading - discard the event end; end; end; procedure TFileView.WMEraseBkgnd(var Message: TLMEraseBkgnd); begin Message.Result := 1; end; procedure TFileView.GoToHistoryIndex(aFileSourceIndex, aPathIndex: Integer); var IsNewFileSource: Boolean; begin IsNewFileSource := not FHistory.FileSource[aFileSourceIndex].Equals(FHistory.CurrentFileSource); if BeforeChangePath(FHistory.FileSource[aFileSourceIndex], FHistory.Path[aFileSourceIndex, aPathIndex]) then begin if Assigned(FileSource) and IsNewFileSource then FileSource.RemoveReloadEventListener(@ReloadEvent); EnableWatcher(False); FHistory.SetIndexes(aFileSourceIndex, aPathIndex); if Assigned(FileSource) and IsNewFileSource then begin UpdatePath(True); FileSource.AddReloadEventListener(@ReloadEvent); end; AfterChangePath; EnableWatcher(True); {$IFDEF DEBUG_HISTORY} FHistory.DebugShow; {$ENDIF} end; end; procedure TFileView.GoToPrevHistory; var aFileSourceIndex, aPathIndex: Integer; begin if FHistory.CurrentPathIndex > 0 then begin aFileSourceIndex := FHistory.CurrentFileSourceIndex; aPathIndex := FHistory.CurrentPathIndex - 1; end else if FHistory.CurrentFileSourceIndex > 0 then begin aFileSourceIndex := FHistory.CurrentFileSourceIndex - 1; aPathIndex := FHistory.PathsCount[aFileSourceIndex] - 1; end else Exit; GoToHistoryIndex(aFileSourceIndex, aPathIndex); end; procedure TFileView.GoToNextHistory; var aFileSourceIndex, aPathIndex: Integer; begin if FHistory.CurrentFileSourceIndex >= 0 then begin if FHistory.CurrentPathIndex < FHistory.PathsCount[FHistory.CurrentFileSourceIndex] - 1 then begin aFileSourceIndex := FHistory.CurrentFileSourceIndex; aPathIndex := FHistory.CurrentPathIndex + 1; end else if FHistory.CurrentFileSourceIndex < FHistory.Count - 1 then begin aFileSourceIndex := FHistory.CurrentFileSourceIndex + 1; aPathIndex := 0; end else Exit; GoToHistoryIndex(aFileSourceIndex, aPathIndex); end; end; procedure TFileView.ReDisplayFileList; begin case GetCurrentWorkType of fvwtNone: ; // Ok to continue. fvwtCreate: // File list is being loaded from file source - cannot display yet. Exit; fvwtUpdate: StopWorkers; else Exit; end; // Redisplaying file list is done in the main thread because it takes // relatively short time, so the user usually won't notice it and it is // a bit faster this way. TFileListBuilder.MakeDisplayFileList( FAllDisplayFiles, FFiles, FileFilter, FFilterOptions); Notify([fvnDisplayFileListChanged]); end; procedure TFileView.WorkerStarting(const Worker: TFileViewWorker); begin if (Worker.WorkType = fvwtCreate) and not Worker.Aborted then begin FLoadFilesStartTime := SysUtils.Now; end; end; procedure TFileView.WorkerFinished(const Worker: TFileViewWorker); var Interval: Integer; begin if (Worker.WorkType = fvwtCreate) and not Worker.Aborted then begin FLoadFilesFinishTime := SysUtils.Now; // Schedule another reload if needed. if FReloadNeeded and not CheckIfDelayReload then begin // Delay by half the time taken by previous loading. Interval := DateTimeToTimeStamp(SysUtils.Now - FLoadFilesStartTime).Time div 2; if Interval < MinimumReloadInterval then Interval := MinimumReloadInterval; FReloadTimer.Interval := Interval; FReloadTimer.Enabled := True; end; SetLoadingFileListLongTime(False); end; if (Worker is TCalculateSpaceWorker) and (Worker.Aborted = False) then begin if TCalculateSpaceWorker(Worker).CompletedCalculations > 1 then begin SortAllDisplayFiles; ReDisplayFileList; end; end; end; { TDropParams } constructor TDropParams.Create( var aFiles: TFiles; aDropEffect: TDropEffect; aScreenDropPoint: TPoint; aDropIntoDirectories: Boolean; aSourcePanel: TFileView; aTargetPanel: TFileView; aTargetFileSource: IFileSource; aTargetPath: String); begin Files := aFiles; aFiles := nil; DropEffect := aDropEffect; ScreenDropPoint := aScreenDropPoint; DropIntoDirectories := aDropIntoDirectories; SourcePanel := aSourcePanel; TargetPanel := aTargetPanel; TargetFileSource := aTargetFileSource; TargetPath := aTargetPath; end; destructor TDropParams.Destroy; begin inherited Destroy; FreeAndNil(Files); end; function TDropParams.GetDragDropType: TDragDropType; begin if Assigned(SourcePanel) then Result := ddtInternal else Result := ddtExternal; end; end. doublecmd-0.5.8/src/fileviews/uorderedfileview.pas0000644000175000017500000005436112240451020021342 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Base class for file views which display an ordered (indexed) list of files Copyright (C) 2012 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uOrderedFileView; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Controls, StdCtrls, Menus, uTypes, fQuickSearch, uFileView, uFileViewWithPanels, uDisplayFile; const InvalidFileIndex = PtrInt(-1); type { TOrderedFileView } TOrderedFileView = class(TFileViewWithPanels) private pmOperationsCancel: TPopupMenu; procedure lblFilterClick(Sender: TObject); procedure pmOperationsCancelClick(Sender: TObject); procedure quickSearchChangeSearch(Sender: TObject; ASearchText: UTF8String; const ASearchOptions: TQuickSearchOptions; ASearchDirection: TQuickSearchDirection); procedure quickSearchChangeFilter(Sender: TObject; AFilterText: UTF8String; const AFilterOptions: TQuickSearchOptions); procedure quickSearchExecute(Sender: TObject); procedure quickSearchHide(Sender: TObject); procedure UpdateRangeSelectionState; protected lblFilter: TLabel; quickSearch: TfrmQuickSearch; FLastActiveFileIndex: Integer; FRangeSelecting: Boolean; FRangeSelectionStartIndex: Integer; FRangeSelectionEndIndex: Integer; FRangeSelectionState: Boolean; FUpdatingActiveFile: Boolean; procedure InvertActiveFile; procedure AfterChangePath; override; procedure CreateDefault(AOwner: TWinControl); override; procedure DoFileIndexChanged(NewFileIndex: PtrInt); procedure DoHandleKeyDown(var Key: Word; Shift: TShiftState); override; procedure DoHandleKeyDownWhenLoading(var Key: Word; Shift: TShiftState); override; procedure DoSelectionChanged; override; overload; procedure DoSelectionChanged(FileIndex: PtrInt); overload; procedure EnsureDisplayProperties; override; function GetActiveDisplayFile: TDisplayFile; override; function GetActiveFileIndex: PtrInt; virtual; abstract; function GetFileRect(FileIndex: PtrInt): TRect; virtual; abstract; function GetVisibleFilesIndexes: TRange; virtual; abstract; function IsFileIndexInRange(FileIndex: PtrInt): Boolean; inline; {en If marking a single file only redraws that file. Otherwise files are marked and full update is performed. } procedure MarkFilesWithCheck(FromIndex, ToIndex: PtrInt; bSelect: Boolean); procedure RedrawFile(FileIndex: PtrInt); overload; virtual; abstract; {en Search and position in a file that matches name taking into account passed options. } procedure SearchFile(SearchTerm: UTF8String; SearchOptions: TQuickSearchOptions; SearchDirection: TQuickSearchDirection = qsdNone); procedure Selection(Key: Word; CurIndex: PtrInt); procedure SelectRange(FileIndex: PtrInt); procedure SetActiveFile(FileIndex: PtrInt); overload; virtual; abstract; procedure SetLastActiveFile(FileIndex: PtrInt); {en Sets a file as active if the file currently exists. @returns(@true if the file was found and selected.) } function SetActiveFileNow(aFilePath: String): Boolean; public procedure CloneTo(AFileView: TFileView); override; procedure SetActiveFile(aFilePath: String); override; overload; published // commands procedure cm_QuickSearch(const Params: array of string); procedure cm_QuickFilter(const Params: array of string); procedure cm_GoToFirstFile(const Params: array of string); procedure cm_GoToLastFile(const Params: array of string); end; implementation uses LCLProc, LCLType, math, Forms, Graphics, DCStrUtils, uLng, uGlobs, uMasks, uDCUtils, uFileSourceProperty, uPixMapManager, uFileViewWorker, uFileSource, uFile; const CANCEL_FILTER = 0; CANCEL_OPERATION = 1; { TOrderedFileView } procedure TOrderedFileView.AfterChangePath; begin if Filtered then begin FFileFilter:= EmptyStr; quickSearch.Finalize; end; FLastActiveFileIndex := -1; inherited AfterChangePath; end; procedure TOrderedFileView.CloneTo(AFileView: TFileView); begin if Assigned(AFileView) then begin inherited CloneTo(AFileView); with AFileView as TOrderedFileView do begin FLastActiveFileIndex := Self.FLastActiveFileIndex; FRangeSelectionStartIndex := Self.FRangeSelectionStartIndex; FRangeSelectionEndIndex := Self.FRangeSelectionEndIndex; FRangeSelectionState := Self.FRangeSelectionState; end; end; end; procedure TOrderedFileView.cm_GoToFirstFile(const Params: array of string); begin if not (IsEmpty or IsLoadingFileList) then begin SetFocus; SetActiveFile(0); end; end; procedure TOrderedFileView.cm_GoToLastFile(const Params: array of string); begin if not (IsEmpty or IsLoadingFileList) then begin SetFocus; SetActiveFile(FFiles.Count - 1); end; end; procedure TOrderedFileView.cm_QuickFilter(const Params: array of string); begin if not IsLoadingFileList then quickSearch.Execute(qsFilter, Params); end; procedure TOrderedFileView.cm_QuickSearch(const Params: array of string); begin if not IsLoadingFileList then quickSearch.Execute(qsSearch, Params); end; procedure TOrderedFileView.CreateDefault(AOwner: TWinControl); begin inherited CreateDefault(AOwner); FLastActiveFileIndex := -1; FRangeSelectionState := True; lblFilter := TLabel.Create(pnlFooter); lblFilter.Parent := pnlFooter; lblFilter.Align := alRight; lblFilter.Visible := False; lblFilter.OnClick := @lblFilterClick; quickSearch := TfrmQuickSearch.Create(Self); quickSearch.Parent := Self; quickSearch.Visible := False; quickSearch.Align := alBottom; quickSearch.OnChangeSearch := @quickSearchChangeSearch; quickSearch.OnChangeFilter := @quickSearchChangeFilter; quickSearch.OnExecute := @quickSearchExecute; quickSearch.OnHide := @quickSearchHide; pmOperationsCancel := TPopupMenu.Create(Self); pmOperationsCancel.Parent := Self; end; procedure TOrderedFileView.DoFileIndexChanged(NewFileIndex: PtrInt); begin if IsFileIndexInRange(NewFileIndex) and (FLastActiveFileIndex <> NewFileIndex) then begin if not FRangeSelecting then begin // Set range selection starting point. FRangeSelectionStartIndex := NewFileIndex; FRangeSelectionEndIndex := NewFileIndex; UpdateRangeSelectionState; end; if not FUpdatingActiveFile then begin SetLastActiveFile(NewFileIndex); if Assigned(OnChangeActiveFile) then OnChangeActiveFile(Self, FFiles[NewFileIndex].FSFile); end; end; end; procedure TOrderedFileView.DoHandleKeyDown(var Key: Word; Shift: TShiftState); var mi: TMenuItem; begin // check if ShiftState is equal to quick search / filter modes if quickSearch.CheckSearchOrFilter(Key) then Exit; case Key of VK_ESCAPE: begin if Filtered and (GetCurrentWorkType <> fvwtNone) then begin pmOperationsCancel.Items.Clear; mi := TMenuItem.Create(pmOperationsCancel); mi.Tag := CANCEL_FILTER; mi.Caption := rsCancelFilter; mi.OnClick := @pmOperationsCancelClick; pmOperationsCancel.Items.Add(mi); mi := TMenuItem.Create(pmOperationsCancel); mi.Tag := CANCEL_OPERATION; mi.Caption := rsCancelOperation; mi.OnClick := @pmOperationsCancelClick; pmOperationsCancel.Items.Add(mi); pmOperationsCancel.PopUp; Key := 0; end else if Filtered then begin quickSearch.Finalize; Key := 0; end else if GetCurrentWorkType <> fvwtNone then begin StopWorkers; Key := 0; end; end; end; inherited DoHandleKeyDown(Key, Shift); end; procedure TOrderedFileView.DoHandleKeyDownWhenLoading(var Key: Word; Shift: TShiftState); var bLoading: Boolean; begin case Key of VK_ESCAPE: if GetCurrentWorkType <> fvwtNone then begin bLoading := IsLoadingFileList; StopWorkers; if bLoading then CancelLastPathChange; Key := 0; end; end; inherited DoHandleKeyDownWhenLoading(Key, Shift); end; procedure TOrderedFileView.DoSelectionChanged; begin inherited DoSelectionChanged; RedrawFiles; UpdateRangeSelectionState; end; procedure TOrderedFileView.DoSelectionChanged(FileIndex: PtrInt); begin inherited DoSelectionChanged; if IsFileIndexInRange(FileIndex) then RedrawFile(FileIndex); UpdateRangeSelectionState; end; procedure TOrderedFileView.EnsureDisplayProperties; var VisibleFiles: TRange; i: Integer; AFileList: TFVWorkerFileList = nil; Worker: TFileViewWorker; AFile: TDisplayFile; HaveIcons: Boolean; DirectAccess: Boolean; begin if (csDestroying in ComponentState) or (GetCurrentWorkType = fvwtCreate) or IsEmpty then Exit; VisibleFiles := GetVisibleFilesIndexes; HaveIcons := gShowIcons <> sim_none; DirectAccess := fspDirectAccess in FileSource.Properties; if not gListFilesInThread then begin if HaveIcons and gIconsExclude and DirectAccess then begin DirectAccess := not IsInPathList(gIconsExcludeDirs, CurrentPath); end; for i := VisibleFiles.First to VisibleFiles.Last do begin AFile := FFiles[i]; if AFile.TextColor = clNone then AFile.TextColor:= gColorExt.GetColorBy(AFile.FSFile); if AFile.FSFile.Name <> '..' then begin if HaveIcons then begin if AFile.IconID < 0 then AFile.IconID := PixMapManager.GetIconByFile(AFile.FSFile, DirectAccess, True, gShowIcons, not gIconOverlays); {$IF DEFINED(MSWINDOWS)} if gIconOverlays and (AFile.IconOverlayID < 0) then begin AFile.IconOverlayID := PixMapManager.GetIconOverlayByFile(AFile.FSFile, DirectAccess); end; {$ENDIF} end; if FileSource.CanRetrieveProperties(AFile.FSFile, FilePropertiesNeeded) then try FileSource.RetrieveProperties(AFile.FSFile, FilePropertiesNeeded); except on EFileNotFound do; end; end; end; end else begin try for i := VisibleFiles.First to VisibleFiles.Last do begin AFile := FFiles[i]; if (AFile.FSFile.Name <> '..') and (FileSource.CanRetrieveProperties(AFile.FSFile, FilePropertiesNeeded) or (AFile.TextColor = clNone) or (HaveIcons and ((AFile.IconID < 0) {$IF DEFINED(MSWINDOWS)} or (gIconOverlays and (AFile.IconOverlayID < 0)) {$ENDIF} ))) then begin if not Assigned(AFileList) then AFileList := TFVWorkerFileList.Create; AFileList.AddClone(AFile, AFile); end; end; if Assigned(AFileList) and (AFileList.Count > 0) then begin Worker := TFilePropertiesRetriever.Create( FileSource, WorkersThread, FilePropertiesNeeded, @PropertiesRetrieverOnUpdate, AFileList); AddWorker(Worker, False); WorkersThread.QueueFunction(@Worker.StartParam); end; finally AFileList.Free; end; end; end; function TOrderedFileView.GetActiveDisplayFile: TDisplayFile; var Index: PtrInt; begin Index := GetActiveFileIndex; if IsFileIndexInRange(Index) then Result := FFiles[Index] else Result := nil; end; function TOrderedFileView.IsFileIndexInRange(FileIndex: PtrInt): Boolean; begin Result := InRange(FileIndex, 0, FFiles.Count - 1); end; procedure TOrderedFileView.lblFilterClick(Sender: TObject); begin quickSearch.Execute(qsFilter, []); end; procedure TOrderedFileView.MarkFilesWithCheck(FromIndex, ToIndex: PtrInt; bSelect: Boolean); begin if FromIndex = ToIndex then begin MarkFile(FFiles[FromIndex], bSelect, False); DoSelectionChanged(FromIndex); end else MarkFiles(FromIndex, ToIndex, bSelect); end; procedure TOrderedFileView.pmOperationsCancelClick(Sender: TObject); begin if (Sender is TMenuItem) then begin case (Sender as TMenuItem).Tag of CANCEL_FILTER: quickSearch.Finalize; CANCEL_OPERATION: StopWorkers; end; end; end; procedure TOrderedFileView.quickSearchChangeFilter(Sender: TObject; AFilterText: UTF8String; const AFilterOptions: TQuickSearchOptions); begin Active := True; // position in file before filtering, otherwise position could be lost if // current file is filtered out causing jumps SearchFile(AFilterText, AFilterOptions); SetFileFilter(AFilterText, AFilterOptions); lblFilter.Caption := Format('(%s: %s)', [rsFilterStatus, AFilterText]); lblFilter.Visible := Filtered; end; procedure TOrderedFileView.quickSearchChangeSearch(Sender: TObject; ASearchText: UTF8String; const ASearchOptions: TQuickSearchOptions; ASearchDirection: TQuickSearchDirection); begin Active := True; SearchFile(ASearchText, ASearchOptions, ASearchDirection); end; procedure TOrderedFileView.quickSearchExecute(Sender: TObject); begin Active := True; ChooseFile(GetActiveDisplayFile); end; procedure TOrderedFileView.quickSearchHide(Sender: TObject); begin if CanFocus then SetFocus; end; procedure TOrderedFileView.SearchFile(SearchTerm: UTF8String; SearchOptions: TQuickSearchOptions; SearchDirection: TQuickSearchDirection); var StartIndex, Index: PtrInt; Result: Boolean; sFileName, sSearchName, sSearchNameNoExt, sSearchExt : UTF8String; AFile: TFile; function NextIndexWrap(Index: PtrInt): PtrInt; begin Result := Index + 1; if Result = FFiles.Count then Result := 0; end; function PrevIndexWrap(Index: PtrInt): PtrInt; begin Result := Index - 1; if Result < 0 then Result := FFiles.Count - 1; end; begin if IsEmpty then Exit; if SearchOptions.SearchCase = qscInsensitive then sSearchName := UTF8LowerCase(SearchTerm) else sSearchName := SearchTerm; if Pos('.', sSearchName) <> 0 then begin sSearchNameNoExt := ExtractOnlyFileName(sSearchName); sSearchExt := ExtractFileExt(sSearchName); if not (qsmBeginning in SearchOptions.Match) then sSearchNameNoExt := '*' + sSearchNameNoExt; if not (qsmEnding in SearchOptions.Match) then sSearchNameNoExt := sSearchNameNoExt + '*'; sSearchName := sSearchNameNoExt + sSearchExt + '*'; end else begin if not (qsmBeginning in SearchOptions.Match) then sSearchName := '*' + sSearchName; sSearchName := sSearchName + '*'; end; Index := GetActiveFileIndex; // start search from current position if not IsFileIndexInRange(Index) then Index := 0; case SearchDirection of qsdFirst: Index := 0; // begin search from first file qsdLast: Index := FFiles.Count - 1; // begin search from last file qsdNext: Index := NextIndexWrap(Index); // begin search from next file qsdPrevious: Index := PrevIndexWrap(Index); // begin search from previous file end; StartIndex := Index; try repeat Result := True; AFile := FFiles[Index].FSFile; if (SearchOptions.Items = qsiFiles) and (AFile.IsDirectory or AFile.IsLinkToDirectory) then Result := False; if (SearchOptions.Items = qsiDirectories) and not AFile.IsDirectory and not AFile.IsLinkToDirectory then Result := False; sFileName := AFile.Name; if SearchOptions.SearchCase = qscInsensitive then sFileName := UTF8LowerCase(sFileName); if not MatchesMask(sFileName, sSearchName, SearchOptions.SearchCase = qscSensitive) then Result := False; if Result then begin SetActiveFile(Index); Exit; end; // check next file depending on search direction if SearchDirection in [qsdNone, qsdFirst, qsdNext] then Index := NextIndexWrap(Index) else Index := PrevIndexWrap(Index); until Index = StartIndex; except on EConvertError do; // bypass else raise; end; end; procedure TOrderedFileView.Selection(Key: Word; CurIndex: PtrInt); procedure OneLess; begin if CurIndex > FRangeSelectionStartIndex then Dec(CurIndex) else if CurIndex < FRangeSelectionStartIndex then Inc(CurIndex); end; begin // Key value doesn't neccessarily matter. // It just needs to correspond to scroll positions (similar to TScrollCode). case Key of VK_HOME, VK_END: ; VK_PRIOR, VK_UP, VK_LEFT: if CurIndex > 0 then OneLess; VK_NEXT, VK_DOWN, VK_RIGHT: if CurIndex < FFiles.Count - 1 then OneLess; else Exit; end; SelectRange(CurIndex); end; procedure TOrderedFileView.SelectRange(FileIndex: PtrInt); begin // Initially select file at starting point. if FRangeSelectionStartIndex = FRangeSelectionEndIndex then MarkFilesWithCheck(FRangeSelectionStartIndex, FRangeSelectionEndIndex, FRangeSelectionState); if FileIndex <> FRangeSelectionEndIndex then begin if FileIndex < FRangeSelectionStartIndex then begin // Focused file is before selection startpoint. // If previously selection was from startpoint forwards deselect all files after startpoint. if FRangeSelectionEndIndex > FRangeSelectionStartIndex then begin MarkFilesWithCheck(FRangeSelectionStartIndex + 1, FRangeSelectionEndIndex, not FRangeSelectionState); FRangeSelectionEndIndex := FRangeSelectionStartIndex; end; if FileIndex > FRangeSelectionEndIndex then // Decrease selection range. MarkFilesWithCheck(FRangeSelectionEndIndex, FileIndex - 1, not FRangeSelectionState) else if FileIndex < FRangeSelectionEndIndex then // Increase selection range. MarkFilesWithCheck(FileIndex, FRangeSelectionEndIndex - 1, FRangeSelectionState); end else begin // Focused file is after selection startpoint. // If previously selection was from startpoint backwards deselect all files before startpoint. if FRangeSelectionEndIndex < FRangeSelectionStartIndex then begin MarkFilesWithCheck(FRangeSelectionEndIndex, FRangeSelectionStartIndex - 1, not FRangeSelectionState); FRangeSelectionEndIndex := FRangeSelectionStartIndex; end; if FileIndex > FRangeSelectionEndIndex then // Increase selection range. MarkFilesWithCheck(FRangeSelectionEndIndex + 1, FileIndex, FRangeSelectionState) else if FileIndex < FRangeSelectionEndIndex then // Decrease selection range. MarkFilesWithCheck(FileIndex + 1, FRangeSelectionEndIndex, not FRangeSelectionState); end; FRangeSelectionEndIndex := FileIndex; end; end; procedure TOrderedFileView.SetActiveFile(aFilePath: String); begin if GetCurrentWorkType = fvwtCreate then begin // File list is currently loading - remember requested file for later. RequestedActiveFile := aFilePath; end else begin // First try to select the file in the current file list. // If not found save it for later selection (possibly after reload). if SetActiveFileNow(aFilePath) then RequestedActiveFile := '' else RequestedActiveFile := aFilePath; end; end; function TOrderedFileView.SetActiveFileNow(aFilePath: String): Boolean; var Index: PtrInt; begin if aFilePath <> '' then // find correct cursor position in Panel (drawgrid) begin if FileSource.GetPathType(aFilePath) = ptAbsolute then begin for Index := 0 to FFiles.Count - 1 do begin if FFiles[Index].FSFile.FullPath = aFilePath then begin FUpdatingActiveFile := True; SetActiveFile(Index); FUpdatingActiveFile := False; SetLastActiveFile(Index); Exit(True); end; end; end else begin for Index := 0 to FFiles.Count - 1 do begin if FFiles[Index].FSFile.Name = aFilePath then begin FUpdatingActiveFile := True; SetActiveFile(Index); FUpdatingActiveFile := False; SetLastActiveFile(Index); Exit(True); end; end; end; end; Result := False; end; procedure TOrderedFileView.SetLastActiveFile(FileIndex: PtrInt); begin if IsFileIndexInRange(FileIndex) then begin LastActiveFile := FFiles[FileIndex].FSFile.FullPath; FLastActiveFileIndex := FileIndex; end; end; procedure TOrderedFileView.UpdateRangeSelectionState; var NewSelectionState: Boolean; begin if not FRangeSelecting then begin if IsFileIndexInRange(FRangeSelectionStartIndex) then begin NewSelectionState := not FFiles[FRangeSelectionStartIndex].Selected; if (FRangeSelectionState <> NewSelectionState) and (FRangeSelectionStartIndex = FRangeSelectionEndIndex) then begin // Selection of starting point has changed. end else begin // Update was called but selection of starting point didn't change. // That means some other file's selection changed - reset starting point. FRangeSelectionStartIndex := GetActiveFileIndex; FRangeSelectionEndIndex := FRangeSelectionStartIndex; end; FRangeSelectionState := NewSelectionState; end; end; end; procedure TOrderedFileView.InvertActiveFile; var Index: PtrInt; begin if IsActiveItemValid then begin Index:= GetActiveFileIndex; if IsFileIndexInRange(Index) then begin InvertFileSelection(FFiles[Index], False); DoSelectionChanged(Index); end; end; end; end. doublecmd-0.5.8/src/fileviews/ufileviewheader.pas0000644000175000017500000002517012250573266021164 0ustar alexxalexxunit uFileViewHeader; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Controls, ExtCtrls, ComCtrls, uPathLabel, uFileView, KASPathEdit, uFileSorting; type { TFileViewHeader } TFileViewHeader = class(TPanel) private FFileView: TFileView; FAddressLabel: TPathLabel; FPathLabel: TPathLabel; FPathEdit: TKASPathEdit; procedure HeaderResize(Sender: TObject); procedure PathEditExit(Sender: TObject); procedure PathEditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure PathLabelClick(Sender: TObject); procedure PathLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); public constructor Create(AOwner: TFileView; AParent: TWinControl); reintroduce; procedure UpdateAddressLabel; procedure UpdatePathLabel; procedure ShowPathEdit; procedure SetActive(bActive: Boolean); end; { TFileViewFixedHeader } TFileViewFixedHeader = class(THeaderControl) private FFileView: TFileView; FDown: Boolean; FMouseInControl: Boolean; FSelectedSection: Integer; FSorting: TFileSortings; procedure UpdateState; protected procedure SectionClick(Section: THeaderSection); override; procedure MouseEnter; override; procedure MouseLeave; override; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; public constructor Create(AOwner: TFileView; AParent: TWinControl); reintroduce; destructor Destroy; override; procedure Click; override; procedure UpdateHeader; procedure UpdateSorting(Sorting: TFileSortings); end; implementation uses LCLType, ShellCtrls, uDCUtils, DCOSUtils, DCStrUtils, uKeyboard, fMain, uFileSourceUtil, uGlobs, uPixMapManager, uLng, uFileFunctions; const SortingImageIndex: array[TSortDirection] of Integer = (-1, 0, 1); { TFileViewHeader } procedure TFileViewHeader.PathEditExit(Sender: TObject); begin FPathEdit.Visible := False; end; procedure TFileViewHeader.PathEditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var NewPath: UTF8String; begin case Key of VK_ESCAPE: begin Key := 0; FPathEdit.Visible:=False; FFileView.SetFocus; end; VK_RETURN, VK_SELECT: begin Key := 0; // catch the enter NewPath:= NormalizePathDelimiters(FPathEdit.Text); NewPath:= ReplaceEnvVars(ReplaceTilde(NewPath)); if not mbFileExists(NewPath) then ChooseFileSource(FFileView, NewPath) else begin ChooseFileSource(FFileView, ExtractFileDir(NewPath)); FFileView.SetActiveFile(ExtractFileName(NewPath)); end; FPathEdit.Visible := False; FFileView.SetFocus; end; {$IFDEF LCLGTK2} // Workaround for GTK2 - up and down arrows moving through controls. VK_UP, VK_DOWN: Key := 0; {$ENDIF} end; end; procedure TFileViewHeader.PathLabelClick(Sender: TObject); var walkPath, dirNameToSelect: UTF8String; begin FFileView.SetFocus; if FPathLabel.SelectedDir <> '' then begin // User clicked on a subdirectory of the path. walkPath := FFileView.CurrentPath; FFileView.CurrentPath := FPathLabel.SelectedDir; while (Length(walkPath) > Length(FPathLabel.SelectedDir) + 1) do begin dirNameToSelect := ExtractFileName(ExcludeTrailingPathDelimiter(walkPath)); walkPath := FFileView.FileSource.GetParentDir(walkPath); end; FFileView.SetActiveFile(dirNameToSelect); end else frmMain.Commands.cm_ViewHistory([]); end; procedure TFileViewHeader.PathLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin case Button of mbMiddle: begin FFileView.SetFocus; frmMain.Commands.cm_DirHotList([]); end; mbRight: begin ShowPathEdit; end; end; end; constructor TFileViewHeader.Create(AOwner: TFileView; AParent: TWinControl); begin inherited Create(AOwner); FFileView:= AOwner; Parent:= AParent; Align:= alTop; BevelInner:= bvNone; BevelOuter:= bvNone; AutoSize:= True; DoubleBuffered:= True; FAddressLabel := TPathLabel.Create(Self, False); FAddressLabel.Parent := Self; FAddressLabel.BorderSpacing.Bottom := 1; FPathLabel := TPathLabel.Create(Self, True); FPathLabel.Parent := Self; // Display path below address. // For correct alignment, first put path at the top, then address at the top. FPathLabel.Align := alTop; FAddressLabel.Align := alTop; FPathEdit:= TKASPathEdit.Create(FPathLabel); FPathEdit.Parent:= Self; FPathEdit.Visible:= False; FPathEdit.TabStop:= False; FPathEdit.ObjectTypes:= [otFolders, otHidden]; OnResize:= @HeaderResize; FPathEdit.OnExit:= @PathEditExit; FPathEdit.OnKeyDown:= @PathEditKeyDown; FPathLabel.OnClick := @PathLabelClick; FPathLabel.OnMouseUp := @PathLabelMouseUp; end; procedure TFileViewHeader.HeaderResize(Sender: TObject); begin UpdateAddressLabel; UpdatePathLabel; end; procedure TFileViewHeader.UpdateAddressLabel; begin if FFileView.CurrentAddress = '' then begin FAddressLabel.Visible := False; end else begin FAddressLabel.Top:= 0; FAddressLabel.Visible := True; FAddressLabel.Caption := FFileView.CurrentAddress; end; end; procedure TFileViewHeader.UpdatePathLabel; begin FPathLabel.Caption := MinimizeFilePath(FFileView.CurrentPath, FPathLabel.Canvas, FPathLabel.Width); end; procedure TFileViewHeader.ShowPathEdit; begin with FPathLabel do begin FPathEdit.SetBounds(Left, Top, Width, Height); FPathEdit.Text := FFileView.CurrentPath; FPathEdit.Visible := True; FPathEdit.SetFocus; end; end; procedure TFileViewHeader.SetActive(bActive: Boolean); begin FAddressLabel.SetActive(bActive); FPathLabel.SetActive(bActive); end; { TFileViewFixedHeader } procedure TFileViewFixedHeader.UpdateState; var i, Index: Integer; MaxState: THeaderSectionState; P: TPoint; begin MaxState := hsNormal; if Enabled then if FDown then begin MaxState := hsPressed; Index := FSelectedSection; end else if FMouseInControl then begin MaxState := hsHot; P := ScreenToClient(Mouse.CursorPos); Index := GetSectionAt(P); end; for i := 0 to Sections.Count - 1 do if (i <> Index) then Sections[i].State := hsNormal else Sections[i].State := MaxState; end; procedure TFileViewFixedHeader.SectionClick(Section: THeaderSection); var SortingDirection : TSortDirection; NewSorting: TFileSortings; SortFunctions: TFileFunctions; begin with FFileView do begin NewSorting := Sorting; SortFunctions := FSorting[Section.Index].SortFunctions; if [ssShift, ssCtrl] * GetKeyShiftStateEx = [] then begin SortingDirection := GetSortDirection(NewSorting, SortFunctions); if SortingDirection = sdNone then SortingDirection := sdAscending else SortingDirection := ReverseSortDirection(SortingDirection); NewSorting := nil; end else begin SortingDirection := sdAscending; end; AddOrUpdateSorting(NewSorting, SortFunctions, SortingDirection); FFileView.Sorting:= NewSorting; end; inherited SectionClick(Section); end; procedure TFileViewFixedHeader.Click; var Index: Integer; begin if FDown then begin inherited Click; Index := GetSectionAt(ScreenToClient(Mouse.CursorPos)); if Index <> -1 then SectionClick(Sections[Index]); end; end; procedure TFileViewFixedHeader.UpdateHeader; var I: Integer; begin for I:= 0 to Sections.Count - 1 do begin Sections[I].ImageIndex:= SortingImageIndex[FSorting[I].SortDirection]; end; end; procedure TFileViewFixedHeader.UpdateSorting(Sorting: TFileSortings); var I, J: Integer; begin for I:= Low(FSorting) to High(FSorting) do begin FSorting[I].SortDirection:= sdNone; for J:= Low(Sorting) to High(Sorting) do begin if (FSorting[I].SortFunctions[0] = Sorting[J].SortFunctions[0]) or ((Sorting[J].SortFunctions[0] = fsfName) and (FSorting[I].SortFunctions[0] = fsfNameNoExtension))then begin FSorting[I].SortDirection:= Sorting[J].SortDirection; Break; end; end; end; UpdateHeader; end; procedure TFileViewFixedHeader.MouseEnter; begin inherited MouseEnter; if not (csDesigning in ComponentState) then begin FMouseInControl := True; UpdateState; end; end; procedure TFileViewFixedHeader.MouseLeave; begin inherited MouseLeave; if not (csDesigning in ComponentState) then begin FMouseInControl := False; FDown := False; UpdateState; end; end; procedure TFileViewFixedHeader.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if not (csDesigning in ComponentState) then begin FDown:= True; FSelectedSection:=GetSectionAt(Point(X, Y)); UpdateState; end; end; procedure TFileViewFixedHeader.MouseMove(Shift: TShiftState; X, Y: Integer); begin if not (csDesigning in ComponentState) then begin UpdateState; end; end; procedure TFileViewFixedHeader.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if not (csDesigning in ComponentState) then begin FDown:= False; UpdateState; end; end; constructor TFileViewFixedHeader.Create(AOwner: TFileView; AParent: TWinControl); var I: Integer; begin inherited Create(AOwner); FFileView:= AOwner; Parent:= AParent; Align:= alTop; DoubleBuffered:= True; Sections.Add.Text:= rsColName; Sections.Add.Text:= rsColExt; Sections.Add.Text:= rsColSize; Sections.Add.Text:= rsColDate; Sections.Add.Text:= rsColAttr; Images:= TImageList.CreateSize(gIconsSize, gIconsSize); Images.Add(PixMapManager.GetBitmap(PixMapManager.GetIconBySortingDirection(sdAscending)), nil); Images.Add(PixMapManager.GetBitmap(PixMapManager.GetIconBySortingDirection(sdDescending)), nil); SetLength(FSorting, 5); for I:= Low(FSorting) to High(FSorting) do SetLength(FSorting[I].SortFunctions, 1); FSorting[0].SortDirection:= sdNone; FSorting[0].SortFunctions[0]:= fsfNameNoExtension; FSorting[1].SortDirection:= sdNone; FSorting[1].SortFunctions[0]:= fsfExtension; FSorting[2].SortDirection:= sdNone; FSorting[2].SortFunctions[0]:= fsfSize; FSorting[3].SortDirection:= sdNone; FSorting[3].SortFunctions[0]:= fsfModificationTime; FSorting[4].SortDirection:= sdNone; FSorting[4].SortFunctions[0]:= fsfAttr; end; destructor TFileViewFixedHeader.Destroy; begin Images.Free; inherited Destroy; end; end. doublecmd-0.5.8/src/fileviews/ufileviewwithgrid.pas0000644000175000017500000005550612071773757021573 0ustar alexxalexxunit uFileViewWithGrid; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Controls, Grids, Graphics, StdCtrls, uDisplayFile, DCXmlConfig, uFileSorting, uFileProperty, uFileViewWithMainCtrl, uFile, uFileViewHeader, uFileView, uFileSource; type TFileViewWithGrid = class; { TFileViewGrid } TFileViewGrid = class(TDrawGrid) protected FFileView: TFileViewWithGrid; protected procedure RowHeightsChanged; override; procedure ColWidthsChanged; override; procedure FinalizeWnd; override; procedure InitializeWnd; override; function MouseOnGrid(X, Y: LongInt): Boolean; procedure DoOnResize; override; procedure KeyDown(var Key : Word; Shift : TShiftState); override; procedure MouseDown(Button: TMouseButton; Shift:TShiftState; X,Y: Integer); override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure TopLeftChanged; override; protected procedure DrawLines(aIdx, aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); procedure PrepareColors(aFile: TDisplayFile; aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); procedure UpdateView; virtual; abstract; procedure CalculateColRowCount; virtual; abstract; procedure CalculateColumnWidth; virtual; abstract; function CellToIndex(ACol, ARow: Integer): Integer; virtual; abstract; procedure IndexToCell(Index: Integer; out ACol, ARow: Integer); virtual; abstract; public constructor Create(AOwner: TComponent; AParent: TWinControl); reintroduce; virtual; end; { TFileViewGridClass } TFileViewGridClass = class of TFileViewGrid; { TFileViewWithGrid } TFileViewWithGrid = class (TFileViewWithMainCtrl) protected TabHeader: TFileViewFixedHeader; dgPanel: TFileViewGrid; lblDetails: TLabel; private procedure SetFilesDisplayItems; procedure UpdateFooterDetails; procedure dgPanelSelection(Sender: TObject; aCol, aRow: Integer); protected procedure MakeColumnsStrings(AFile: TDisplayFile); function GetFileViewGridClass: TFileViewGridClass; virtual; abstract; protected procedure CreateDefault(AOwner: TWinControl); override; procedure BeforeMakeFileList; override; procedure ClearAfterDragDrop; override; procedure AfterChangePath; override; procedure DisplayFileListChanged; override; procedure DoMainControlShowHint(FileIndex: PtrInt; X, Y: Integer); override; procedure DoOnResize; override; procedure FileSourceFileListLoaded; override; function GetActiveFileIndex: PtrInt; override; function GetFileIndexFromCursor(X, Y: Integer; out AtFileList: Boolean): PtrInt; override; function GetFileRect(FileIndex: PtrInt): TRect; override; procedure RedrawFile(FileIndex: PtrInt); override; procedure RedrawFile(DisplayFile: TDisplayFile); override; procedure RedrawFiles; override; procedure SetActiveFile(FileIndex: PtrInt); override; procedure DoFileUpdated(AFile: TDisplayFile; UpdatedProperties: TFilePropertiesTypes = []); override; procedure DoHandleKeyDown(var Key: Word; Shift: TShiftState); override; procedure UpdateInfoPanel; override; procedure DoUpdateView; override; procedure SetSorting(const NewSortings: TFileSortings); override; public constructor Create(AOwner: TWinControl; AFileSource: IFileSource; APath: String; AFlags: TFileViewFlags = []); override; constructor Create(AOwner: TWinControl; AConfig: TXmlConfig; ANode: TXmlNode; AFlags: TFileViewFlags = []); override; constructor Create(AOwner: TWinControl; AFileView: TFileView; AFlags: TFileViewFlags = []); override; destructor Destroy; override; procedure CloneTo(FileView: TFileView); override; procedure AddFileSource(aFileSource: IFileSource; aPath: String); override; procedure LoadConfiguration(AConfig: TXmlConfig; ANode: TXmlNode); override; end; function FitFileName(const AFileName: UTF8String; ACanvas: TCanvas; AFile: TFile; ATargetWidth: Integer): UTF8String; implementation uses LCLIntf, LCLType, LCLVersion, LCLProc, math, uGlobs, uPixmapManager, uKeyboard, uDCUtils, fMain, uFileFunctions; function FitFileName(const AFileName: UTF8String; ACanvas: TCanvas; AFile: TFile; ATargetWidth: Integer): UTF8String; var Index: Integer; begin Result:= AFileName; if ACanvas.TextWidth(AFileName) - ATargetWidth > 0 then begin repeat Index:= UTF8Length(Result); UTF8Delete(Result, Index, 1); until (ACanvas.TextWidth(Result) - ATargetWidth < 1) or (Index = 0); if (Index > 0) then begin Result:= UTF8Copy(Result, 1, Index - 3); if gDirBrackets and (AFile.IsDirectory or AFile.IsLinkToDirectory) then Result:= Result + '..]' else Result:= Result + '...'; end; end; end; { TFileViewGrid } procedure TFileViewGrid.InitializeWnd; begin inherited InitializeWnd; FFileView.InitializeDragDropEx(Self); end; procedure TFileViewGrid.DoOnResize; begin inherited DoOnResize; CalculateColRowCount; CalculateColumnWidth; end; procedure TFileViewGrid.KeyDown(var Key: Word; Shift: TShiftState); begin {$IFDEF LCLGTK2} // Workaround for GTK2 - up and down arrows moving through controls. if Key in [VK_UP, VK_DOWN] then begin if ((Row = RowCount-1) and (Key = VK_DOWN)) or ((Row = FixedRows) and (Key = VK_UP)) then Key := 0; end; {$ENDIF} inherited KeyDown(Key, Shift); end; procedure TFileViewGrid.RowHeightsChanged; begin inherited RowHeightsChanged; CalculateColRowCount; end; procedure TFileViewGrid.ColWidthsChanged; begin inherited ColWidthsChanged; CalculateColRowCount; end; function TFileViewGrid.MouseOnGrid(X, Y: LongInt): Boolean; var bTemp: Boolean; iRow, iCol: LongInt; begin bTemp:= AllowOutboundEvents; AllowOutboundEvents:= False; MouseToCell(X, Y, iCol, iRow); AllowOutboundEvents:= bTemp; Result:= not (CellToIndex(iCol, iRow) < 0); end; procedure TFileViewGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if FFileView.IsLoadingFileList then Exit; {$IF DECLARED(lcl_fullversion) and (lcl_fullversion >= 093100)} // Don't scroll partially visible cells on mouse click Options:= Options + [goDontScrollPartCell]; {$ENDIF} {$IFDEF LCLGTK2} // Workaround for two doubleclicks being sent on GTK. // MouseDown event is sent just before doubleclick, so if we drop // doubleclick events we have to also drop MouseDown events that precede them. if FFileView.TooManyDoubleClicks then Exit; {$ENDIF} FFileView.FMainControlMouseDown := True; if MouseOnGrid(X, Y) then inherited MouseDown(Button, Shift, X, Y) else begin if Assigned(OnMouseDown) then OnMouseDown(Self, Button, Shift, X, Y); end; end; procedure TFileViewGrid.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var BackgroundClick: Boolean; Point: TPoint; begin if FFileView.IsLoadingFileList then Exit; {$IF DECLARED(lcl_fullversion) and (lcl_fullversion >= 093100)} // Don't scroll partially visible cells on mouse click Options:= Options - [goDontScrollPartCell]; {$ENDIF} {$IFDEF LCLGTK2} // Workaround for two doubleclicks being sent on GTK. // MouseUp event is sent just after doubleclick, so if we drop // doubleclick events we have to also drop MouseUp events that follow them. if FFileView.TooManyDoubleClicks then Exit; {$ENDIF} // Handle only if button-up was not lifted to finish drag&drop operation. if not FFileView.FMainControlMouseDown then Exit; inherited MouseUp(Button, Shift, X, Y); FFileView.FMainControlMouseDown := False; if Button = mbRight then begin { If right click on file/directory } if ((gMouseSelectionButton <> 1) or not gMouseSelectionEnabled) then begin BackgroundClick:= not MouseOnGrid(X, Y); Point := ClientToScreen(Classes.Point(X, Y)); frmMain.Commands.DoContextMenu(FFileView, Point.x, Point.y, BackgroundClick); end else if (gMouseSelectionEnabled and (gMouseSelectionButton = 1)) then begin FFileView.tmContextMenu.Enabled:= False; // stop context menu timer end; end { Open folder in new tab on middle click } else if (Button = mbMiddle) then begin frmMain.Commands.cm_OpenDirInNewTab([]); end; end; procedure TFileViewGrid.TopLeftChanged; begin inherited TopLeftChanged; FFileView.Notify([fvnVisibleFilePropertiesChanged]); end; procedure TFileViewGrid.DrawLines(aIdx, aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); begin // Draw frame cursor. if gUseFrameCursor and (gdSelected in aState) and FFileView.Active then begin Canvas.Pen.Color := gCursorColor; Canvas.Line(aRect.Left, aRect.Top, aRect.Right, aRect.Top); Canvas.Line(aRect.Left, aRect.Bottom - 1, aRect.Right, aRect.Bottom - 1); end; // Draw drop selection. if (FFileView.FDropFileIndex >= 0) and (aIdx = FFileView.FDropFileIndex) then begin Canvas.Pen.Color := gForeColor; Canvas.Line(aRect.Left, aRect.Top, aRect.Right, aRect.Top); Canvas.Line(aRect.Left, aRect.Bottom - 1, aRect.Right, aRect.Bottom - 1); end; end; procedure TFileViewGrid.PrepareColors(AFile: TDisplayFile; aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); var TextColor: TColor = clDefault; BackgroundColor: TColor; IsCursor: Boolean; begin Canvas.Font.Name := gFonts[dcfMain].Name; Canvas.Font.Size := gFonts[dcfMain].Size; Canvas.Font.Style := gFonts[dcfMain].Style; IsCursor := (gdSelected in aState) and FFileView.Active and (not gUseFrameCursor); // Set up default background color first. if IsCursor then BackgroundColor := gCursorColor else begin // Alternate rows background color. if odd(ARow) then BackgroundColor := gBackColor else BackgroundColor := gBackColor2; end; // Set text color. TextColor := AFile.TextColor; if (TextColor = clDefault) or (TextColor = clNone) then TextColor := gForeColor; if AFile.Selected then begin if gUseInvertedSelection then begin //------------------------------------------------------ if IsCursor then begin TextColor := InvertColor(gCursorText); end else begin BackgroundColor := gMarkColor; TextColor := TextColor; end; //------------------------------------------------------ end else begin TextColor := gMarkColor; end; end else if IsCursor then begin TextColor := gCursorText; end; BackgroundColor := FFileView.DimColor(BackgroundColor); if AFile.RecentlyUpdatedPct <> 0 then begin TextColor := LightColor(TextColor, AFile.RecentlyUpdatedPct); BackgroundColor := LightColor(BackgroundColor, AFile.RecentlyUpdatedPct); end; // Draw background. Canvas.Brush.Color := BackgroundColor; Canvas.FillRect(aRect); Canvas.Font.Color := TextColor; end; constructor TFileViewGrid.Create(AOwner: TComponent; AParent: TWinControl); begin FFileView := AParent as TFileViewWithGrid; inherited Create(AOwner); // Workaround for Lazarus issue 18832. // Set Fixed... before setting ...Count. FixedRows := 0; FixedCols := 0; // Override default values to start with one column and one rows. RowCount := 1; ColCount := 1; DefaultColWidth:= 200; Self.Parent := AParent; DoubleBuffered := True; Align := alClient; MouseWheelOption:= mwGrid; Options := [goTabs, goThumbTracking, goSmoothScroll]; TabStop := False; UpdateView; end; procedure TFileViewGrid.FinalizeWnd; begin FFileView.FinalizeDragDropEx(Self); inherited FinalizeWnd; end; { TFileViewWithGrid } procedure TFileViewWithGrid.RedrawFile(DisplayFile: TDisplayFile); var ACol, ARow: Integer; begin dgPanel.IndexToCell(PtrInt(DisplayFile.DisplayItem), ACol, ARow); dgPanel.InvalidateCell(ACol, ARow); end; procedure TFileViewWithGrid.RedrawFiles; begin dgPanel.Invalidate; end; procedure TFileViewWithGrid.MakeColumnsStrings(AFile: TDisplayFile); begin AFile.DisplayStrings.Text:= FormatFileFunction('DC().GETFILENAME{}', AFile.FSFile, FileSource); end; procedure TFileViewWithGrid.RedrawFile(FileIndex: PtrInt); var ACol, ARow: Integer; begin dgPanel.IndexToCell(FileIndex, ACol, ARow); dgPanel.InvalidateCell(ACol, ARow); end; procedure TFileViewWithGrid.DisplayFileListChanged; begin dgPanel.CalculateColRowCount; dgPanel.CalculateColumnWidth; SetFilesDisplayItems; if SetActiveFileNow(RequestedActiveFile) then RequestedActiveFile := '' else // Requested file was not found, restore position to last active file. SetActiveFileNow(LastActiveFile); Notify([fvnVisibleFilePropertiesChanged]); inherited DisplayFileListChanged; end; procedure TFileViewWithGrid.CreateDefault(AOwner: TWinControl); begin inherited CreateDefault(AOwner); dgPanel:= GetFileViewGridClass.Create(Self, Self); MainControl := dgPanel; TabHeader:= TFileViewFixedHeader.Create(Self, Self); TabHeader.Top:= pnlHeader.Height; lblDetails:= TLabel.Create(pnlFooter); lblDetails.Align:= alRight; lblDetails.Alignment:= taRightJustify; lblDetails.Parent:= pnlFooter; dgPanel.OnSelection:= @dgPanelSelection; // By default always use some properties. FilePropertiesNeeded := [fpName, fpSize, // For info panel (total size, selected size) fpAttributes, // For distinguishing directories fpLink, // For distinguishing directories (link to dir) and link icons fpModificationTime // For selecting/coloring files (by SearchTemplate) ]; end; procedure TFileViewWithGrid.BeforeMakeFileList; begin inherited BeforeMakeFileList; end; procedure TFileViewWithGrid.FileSourceFileListLoaded; begin inherited; FUpdatingActiveFile := True; dgPanel.MoveExtend(False, 0, 0); FUpdatingActiveFile := False; end; procedure TFileViewWithGrid.ClearAfterDragDrop; begin inherited ClearAfterDragDrop; // reset TCustomGrid state dgPanel.FGridState := gsNormal; end; procedure TFileViewWithGrid.AfterChangePath; begin inherited AfterChangePath; if not IsLoadingFileList then begin FUpdatingActiveFile := True; dgPanel.MoveExtend(False, 0, 0); FUpdatingActiveFile := False; end; end; function TFileViewWithGrid.GetActiveFileIndex: PtrInt; begin Result := dgPanel.CellToIndex(dgPanel.Col, dgPanel.Row); end; function TFileViewWithGrid.GetFileIndexFromCursor(X, Y: Integer; out AtFileList: Boolean): PtrInt; var bTemp: Boolean; iRow, iCol: LongInt; begin with dgPanel do begin bTemp:= AllowOutboundEvents; AllowOutboundEvents:= False; MouseToCell(X, Y, iCol, iRow); AllowOutboundEvents:= bTemp; Result:= CellToIndex(iCol, iRow); AtFileList := True; // Always at file list because header in dgPanel not used end; end; function TFileViewWithGrid.GetFileRect(FileIndex: PtrInt): TRect; var ACol, ARow: Integer; begin dgPanel.IndexToCell(FileIndex, ACol, ARow); Result := dgPanel.CellRect(ACol, ARow); end; procedure TFileViewWithGrid.DoOnResize; var I: Integer; AWidth: Integer; begin inherited DoOnResize; if Assigned(TabHeader) then begin AWidth:= Width div TabHeader.Sections.Count; for I:= 0 to TabHeader.Sections.Count - 1 do TabHeader.Sections[I].Width:= AWidth; end; UpdateFooterDetails; Notify([fvnVisibleFilePropertiesChanged]); end; constructor TFileViewWithGrid.Create(AOwner: TWinControl; AConfig: TXmlConfig; ANode: TXmlNode; AFlags: TFileViewFlags = []); begin inherited Create(AOwner, AConfig, ANode, AFlags); end; constructor TFileViewWithGrid.Create(AOwner: TWinControl; AFileView: TFileView; AFlags: TFileViewFlags); var I: Integer; begin inherited Create(AOwner, AFileView, AFlags); if (not (AFileView is TFileViewWithGrid)) and Assigned(FAllDisplayFiles) then begin // Update display strings in case FileView type have changed. for I := 0 to FAllDisplayFiles.Count - 1 do MakeColumnsStrings(FAllDisplayFiles[I]); end; end; destructor TFileViewWithGrid.Destroy; begin inherited Destroy; end; procedure TFileViewWithGrid.CloneTo(FileView: TFileView); begin if Assigned(FileView) then begin inherited CloneTo(FileView); if FileView is TFileViewWithGrid then with FileView as TFileViewWithGrid do begin TabHeader.UpdateSorting(Self.Sorting); end; end; end; procedure TFileViewWithGrid.AddFileSource(aFileSource: IFileSource; aPath: String); begin inherited AddFileSource(aFileSource, aPath); if not IsLoadingFileList then begin FUpdatingActiveFile := True; dgPanel.MoveExtend(False, 0, 0); FUpdatingActiveFile := False; end; end; procedure TFileViewWithGrid.LoadConfiguration(AConfig: TXmlConfig; ANode: TXmlNode); begin inherited LoadConfiguration(AConfig, ANode); TabHeader.UpdateSorting(Sorting); end; procedure TFileViewWithGrid.SetActiveFile(FileIndex: PtrInt); var ACol, ARow: Integer; begin dgPanel.IndexToCell(FileIndex, ACol, ARow); dgPanel.Col := ACol; dgPanel.Row := ARow; end; procedure TFileViewWithGrid.SetFilesDisplayItems; var i: Integer; begin for i := 0 to FFiles.Count - 1 do FFiles[i].DisplayItem := Pointer(i); end; procedure TFileViewWithGrid.UpdateFooterDetails; var AFile: TFile; AFileName: UTF8String; begin if FSelectedCount > 0 then lblDetails.Caption:= EmptyStr else begin AFile:= CloneActiveFile; if Assigned(AFile) then try // Get details info about file AFileName:= #32#32 +FormatFileFunction('DC().GETFILEEXT{}', AFile, FileSource); AFileName:= AFileName + #32#32 + FormatFileFunction('DC().GETFILESIZE{}', AFile, FileSource); AFileName:= AFileName + #32#32 + FormatFileFunction('DC().GETFILETIME{}', AFile, FileSource); AFileName:= AFileName + #32#32 + FormatFileFunction('DC().GETFILEATTR{}', AFile, FileSource); lblDetails.Caption:= AFileName; // Get file name AFileName:= FormatFileFunction('DC().GETFILENAMENOEXT{}', AFile, FileSource); lblInfo.Caption:= FitFileName(AFileName, lblInfo.Canvas, AFile, lblInfo.ClientWidth); finally AFile.Free; end; end; end; procedure TFileViewWithGrid.dgPanelSelection(Sender: TObject; aCol, aRow: Integer); begin DoFileIndexChanged(dgPanel.CellToIndex(aCol, aRow)); UpdateFooterDetails; end; procedure TFileViewWithGrid.UpdateInfoPanel; begin inherited UpdateInfoPanel; UpdateFooterDetails; end; procedure TFileViewWithGrid.DoUpdateView; function CalculateTabHeaderHeight: Integer; var OldFont: TFont; begin with TabHeader do begin OldFont := Canvas.Font; Canvas.Font := Font; Result := Canvas.TextHeight('Wg'); Canvas.Font := OldFont; end; end; var TabHeaderHeight: Integer; begin inherited DoUpdateView; dgPanel.UpdateView; TabHeader.Visible := gTabHeader; // Set rows of header. if gTabHeader then begin TabHeader.UpdateHeader; TabHeaderHeight := Max(gIconsSize, CalculateTabHeaderHeight); TabHeaderHeight := TabHeaderHeight + 2; // for borders if not gInterfaceFlat then begin TabHeaderHeight := TabHeaderHeight + 2; // additional borders if not flat end; TabHeader.Height := TabHeaderHeight; end; Notify([fvnVisibleFilePropertiesChanged]); end; procedure TFileViewWithGrid.SetSorting(const NewSortings: TFileSortings); begin inherited SetSorting(NewSortings); TabHeader.UpdateSorting(NewSortings); end; constructor TFileViewWithGrid.Create(AOwner: TWinControl; AFileSource: IFileSource; APath: String; AFlags: TFileViewFlags); begin inherited Create(AOwner, AFileSource, APath, AFlags); end; procedure TFileViewWithGrid.DoFileUpdated(AFile: TDisplayFile; UpdatedProperties: TFilePropertiesTypes); begin MakeColumnsStrings(AFile); inherited DoFileUpdated(AFile, UpdatedProperties); end; procedure TFileViewWithGrid.DoHandleKeyDown(var Key: Word; Shift: TShiftState); var Index, aCol, aRow: Integer; AFile: TDisplayFile; begin case Key of VK_INSERT: begin if not IsEmpty then begin Index:= GetActiveFileIndex; if IsFileIndexInRange(Index) then begin AFile := FFiles[Index]; if IsItemValid(AFile) then begin InvertFileSelection(AFile, False); DoSelectionChanged(Index); end; dgPanel.IndexToCell(Index + 1, aCol, aRow); if not ((aCol < 0) and (aRow < 0)) then begin dgPanel.Col:= aCol; dgPanel.Row:= aRow; end; end; end; Key := 0; end; VK_SPACE: if Shift * KeyModifiersShortcut = [] then begin Index:= GetActiveFileIndex; if IsFileIndexInRange(Index) then begin AFile := FFiles[Index]; if IsItemValid(aFile) then begin if (aFile.FSFile.IsDirectory or aFile.FSFile.IsLinkToDirectory) and not aFile.Selected then begin CalculateSpace(aFile); end; InvertFileSelection(aFile, False); DoSelectionChanged(Index); if gSpaceMovesDown then begin dgPanel.IndexToCell(Index + 1, aCol, aRow); if not ((aCol < 0) and (aRow < 0)) then begin dgPanel.Col:= aCol; dgPanel.Row:= aRow; end; end; end; end; Key := 0; end; end; inherited DoHandleKeyDown(Key, Shift); end; procedure TFileViewWithGrid.DoMainControlShowHint(FileIndex: PtrInt; X, Y: Integer); var aRect: TRect; ACol, ARow, iCol: Integer; AFile: TDisplayFile; begin AFile := FFiles[FileIndex]; dgPanel.IndexToCell(FileIndex, ACol, ARow); aRect:= dgPanel.CellRect(ACol, ARow); iCol:= aRect.Right - aRect.Left - 8; if gShowIcons <> sim_none then Dec(iCol, gIconsSize); if iCol < dgPanel.Canvas.TextWidth(AFile.FSFile.Name) then // with file name dgPanel.Hint:= AFile.FSFile.Name else if (stm_only_large_name in gShowToolTipMode) then // don't show Exit else if not AFile.FSFile.IsDirectory then // without name dgPanel.Hint:= #32; end; end. doublecmd-0.5.8/src/fileviews/ufileviewworker.pas0000644000175000017500000006767212247124203021247 0ustar alexxalexxunit uFileViewWorker; {$mode objfpc}{$H+} interface uses Classes, SysUtils, contnrs, syncobjs, StringHashList, uDisplayFile, uFile, uFileSource, uFileSorting, uFileProperty, uFileSourceOperation, uFileSourceListOperation, fQuickSearch; type TFileViewWorkType = (fvwtNone, fvwtCreate, // Creates file list fvwtUpdate); // Updates file list TFileViewWorker = class; TStartingWorkMethod = procedure (const Worker: TFileViewWorker) of object; TFinishedWorkMethod = procedure (const Worker: TFileViewWorker) of object; { TFileViewWorker } TFileViewWorker = class strict private FAborted: Boolean; {en After FCanBeDestroyed is set to True the worker may be destroyed.} FCanBeDestroyed: Boolean; FWorking: Boolean; FOnStarting: TStartingWorkMethod; FOnFinished: TFinishedWorkMethod; FThread: TThread; procedure DoFinished; procedure DoStarting; protected FWorkType: TFileViewWorkType; procedure DoneWorking; procedure Execute; virtual; abstract; function IsWorking: Boolean; virtual; property Thread: TThread read FThread; public constructor Create(AThread: TThread); virtual; procedure Abort; virtual; procedure Start; procedure StartParam(Params: Pointer); property Aborted: Boolean read FAborted; property CanBeDestroyed: Boolean read FCanBeDestroyed; property OnFinished: TFinishedWorkMethod read FOnFinished write FOnFinished; property OnStarting: TStartingWorkMethod read FOnStarting write FOnStarting; property Working: Boolean read IsWorking; property WorkType: TFileViewWorkType read FWorkType; end; TFVWorkerFileList = class private FFiles: TFPObjectList; FUserData: TFPList; function GetCount: Integer; function GetFile(Index: Integer): TDisplayFile; function GetData(Index: Integer): Pointer; public constructor Create; destructor Destroy; override; function AddClone(const AFile: TDisplayFile; UserData: Pointer): Integer; property Count: Integer read GetCount; property Files[Index: Integer]: TDisplayFile read GetFile; property Data[Index: Integer]: Pointer read GetData; end; TSetFileListMethod = procedure (var NewAllDisplayFiles: TDisplayFiles; var NewFilteredDisplayFiles: TDisplayFiles) of object; TUpdateFileMethod = procedure (const UpdatedFile: TDisplayFile; const UserData: Pointer) of object; { TFileListBuilder } TFileListBuilder = class(TFileViewWorker) private FFilteredDisplayFiles: TDisplayFiles; FAllDisplayFiles: TDisplayFiles; FExistingDisplayFilesHashed: TStringHashList; FSetFileListMethod: TSetFileListMethod; FListOperation: TFileSourceListOperation; FListOperationLock: TCriticalSection; // Data captured from the file view before start. FFileSource: IFileSource; FFileSourceIndex: Integer; FFileFilter: String; FFilterOptions: TQuickSearchOptions; FCurrentPath: String; FSortings: TFileSortings; FFilePropertiesNeeded: TFilePropertiesTypes; {en Calls the update method with the new built lists. It is called from GUI thread. } procedure DoSetFileList; class function InternalMatchesFilter(aFile: TFile; const aFileFilter: String; const aFilterOptions: TQuickSearchOptions): Boolean; {en Prepare filter string based on options. } class function PrepareFilter(const aFileFilter: String; const aFilterOptions: TQuickSearchOptions): String; protected {en Retrieves file list from file source, sorts and creates a display file list. It may be run from a worker thread so it cannot access GUI directly. } procedure Execute; override; public constructor Create(AFileSource: IFileSource; AFileSourceIndex: Integer; const AFileFilter: String; const AFilterOptions: TQuickSearchOptions; const ACurrentPath: String; const ASorting: TFileSortings; AThread: TThread; AFilePropertiesNeeded: TFilePropertiesTypes; ASetFileListMethod: TSetFileListMethod; var ExistingDisplayFiles: TDisplayFiles; var ExistingDisplayFilesHashed: TStringHashList); reintroduce; destructor Destroy; override; procedure Abort; override; {en Fills aFiles with files from aFileSourceFiles. Filters out any files that shouldn't be shown using aFileFilter. } class procedure MakeDisplayFileList(allDisplayFiles: TDisplayFiles; filteredDisplayFiles: TDisplayFiles; aFileFilter: String; const aFilterOptions: TQuickSearchOptions); class procedure MakeAllDisplayFileList(aFileSource: IFileSource; aFileSourceFiles: TFiles; aDisplayFiles: TDisplayFiles; const aSortings: TFileSortings); class procedure MakeAllDisplayFileList(aFileSource: IFileSource; aFileSourceFiles: TFiles; aExistingDisplayFiles: TDisplayFiles; const aSortings: TFileSortings; aExistingDisplayFilesHashed: TStringHashList); class function MatchesFilter(aFile: TFile; aFileFilter: String; const aFilterOptions: TQuickSearchOptions): Boolean; end; { TFilePropertiesRetriever } TFilePropertiesRetriever = class(TFileViewWorker) private FWorkingFile: TDisplayFile; FWorkingUserData: Pointer; FFileList: TFVWorkerFileList; FUpdateFileMethod: TUpdateFileMethod; FFileSource: IFileSource; FFilePropertiesNeeded: TFilePropertiesTypes; {en Updates file in the file view with new data from FWorkerData. It is called from GUI thread. } procedure DoUpdateFile; protected procedure Execute; override; public constructor Create(AFileSource: IFileSource; AThread: TThread; AFilePropertiesNeeded: TFilePropertiesTypes; AUpdateFileMethod: TUpdateFileMethod; var AFileList: TFVWorkerFileList); reintroduce; destructor Destroy; override; end; { TCalculateSpaceWorker } TCalculateSpaceWorker = class(TFileViewWorker) private FWorkingFile: TDisplayFile; FWorkingUserData: Pointer; FFileList: TFVWorkerFileList; FCompletedCalculations: Integer; FUpdateFileMethod: TUpdateFileMethod; FFileSource: IFileSource; FOperation: TFileSourceOperation; FOperationLock: TCriticalSection; {en Updates file in the file view with new data. It is called from GUI thread. } procedure DoUpdateFile; protected procedure Execute; override; public constructor Create(AFileSource: IFileSource; AThread: TThread; AUpdateFileMethod: TUpdateFileMethod; var AFileList: TFVWorkerFileList); reintroduce; destructor Destroy; override; procedure Abort; override; property CompletedCalculations: Integer read FCompletedCalculations; end; {$IFDEF timeFileView} var filelistLoaderTime: TDateTime; {$ENDIF} implementation uses {$IFDEF timeFileView} uDebug, {$ENDIF} LCLProc, Graphics, DCFileAttributes, uFileSourceOperationTypes, uOSUtils, DCStrUtils, uDCUtils, uExceptions, uGlobs, uMasks, uPixMapManager, uFileSourceProperty, uFileSourceCalcStatisticsOperation, uFileSourceOperationOptions; { TFVWorkerFileList } constructor TFVWorkerFileList.Create; begin FFiles := TFPObjectList.Create(True); FUserData := TFPList.Create; inherited; end; destructor TFVWorkerFileList.Destroy; begin inherited; FFiles.Free; FUserData.Free; end; function TFVWorkerFileList.AddClone(const AFile: TDisplayFile; UserData: Pointer): Integer; var ClonedFile: TDisplayFile; begin ClonedFile := AFile.Clone(True); Result := FFiles.Add(ClonedFile); FUserData.Add(UserData); end; function TFVWorkerFileList.GetCount: Integer; begin Result := FFiles.Count; end; function TFVWorkerFileList.GetFile(Index: Integer): TDisplayFile; begin Result := TDisplayFile(FFiles.Items[Index]); end; function TFVWorkerFileList.GetData(Index: Integer): Pointer; begin Result := FUserData.Items[Index]; end; { TFileViewWorker } constructor TFileViewWorker.Create(AThread: TThread); begin // Set Working=True on creation because these workers are usually scheduled // to run by a non-main thread, so it might take a while for Execute to be called. FWorking := True; FWorkType := fvwtNone; FThread := AThread; end; procedure TFileViewWorker.Abort; begin FAborted := True; end; procedure TFileViewWorker.DoFinished; begin FWorking := False; try FOnFinished(Self); except on e: Exception do HandleException(e); end; end; procedure TFileViewWorker.DoStarting; begin try FOnStarting(Self); except on e: Exception do HandleException(e); end; end; procedure TFileViewWorker.DoneWorking; begin FWorking := False; end; function TFileViewWorker.IsWorking: Boolean; begin Result := FWorking and not FAborted; end; procedure TFileViewWorker.Start; begin try if not Aborted then begin if Assigned(FOnStarting) then TThread.Synchronize(Thread, @DoStarting); if not Aborted then Execute; // virtual call if Assigned(FOnFinished) then TThread.Synchronize(Thread, @DoFinished); end; finally FWorking := False; FCanBeDestroyed := True; end; end; procedure TFileViewWorker.StartParam(Params: Pointer); begin Start; end; { TFileListBuilder } constructor TFileListBuilder.Create(AFileSource: IFileSource; AFileSourceIndex: Integer; const AFileFilter: String; const AFilterOptions: TQuickSearchOptions; const ACurrentPath: String; const ASorting: TFileSortings; AThread: TThread; AFilePropertiesNeeded: TFilePropertiesTypes; ASetFileListMethod: TSetFileListMethod; var ExistingDisplayFiles: TDisplayFiles; var ExistingDisplayFilesHashed: TStringHashList); begin inherited Create(AThread); FAllDisplayFiles := ExistingDisplayFiles; ExistingDisplayFiles := nil; FExistingDisplayFilesHashed := ExistingDisplayFilesHashed; ExistingDisplayFilesHashed := nil; FWorkType := fvwtCreate; FListOperation := nil; FListOperationLock := TCriticalSection.Create; FFileSource := AFileSource; FFileSourceIndex := AFileSourceIndex; FFileFilter := AFileFilter; FFilterOptions := AFilterOptions; FCurrentPath := ACurrentPath; FSortings := CloneSortings(ASorting); FFilePropertiesNeeded := AFilePropertiesNeeded; FSetFileListMethod := ASetFileListMethod; end; destructor TFileListBuilder.Destroy; begin inherited Destroy; FListOperationLock.Free; FExistingDisplayFilesHashed.Free; FFilteredDisplayFiles.Free; FAllDisplayFiles.Free; end; procedure TFileListBuilder.Abort; begin inherited; FListOperationLock.Acquire; try if Assigned(FListOperation) then FListOperation.Stop; finally FListOperationLock.Release; end; end; procedure TFileListBuilder.Execute; var AFile: TFile; i: Integer; HaveUpDir: Boolean = False; FileSourceFiles: TFiles = nil; begin try if Aborted then Exit; if fsoList in FFileSource.GetOperationsTypes then begin FListOperationLock.Acquire; try FListOperation := FFileSource.CreateListOperation(FCurrentPath) as TFileSourceListOperation; finally FListOperationLock.Release; end; if Assigned(FListOperation) then try FListOperation.AssignThread(Thread); FListOperation.Execute; if FListOperation.Result = fsorFinished then FileSourceFiles := FListOperation.ReleaseFiles; finally FListOperationLock.Acquire; try FreeAndNil(FListOperation); finally FListOperationLock.Release; end; end; end; {$IFDEF timeFileView} DCDebug('Loaded files : ' + IntToStr(DateTimeToTimeStamp(Now - filelistLoaderTime).Time)); {$ENDIF} if Aborted then Exit; if Assigned(FileSourceFiles) then begin // Check if up-dir '..' is present. // If it is present it will usually be the first file. for i := 0 to FileSourceFiles.Count - 1 do begin if FileSourceFiles[i].Name = '..' then begin HaveUpDir := True; Break; end; end; if (not HaveUpDir) and ((not FFileSource.IsPathAtRoot(FCurrentPath)) or // Add '..' to go to higher level file source, if there is more than one. (FFileSourceIndex > 0)) then begin AFile := FFileSource.CreateFileObject(FCurrentPath); AFile.Name := '..'; if fpAttributes in AFile.SupportedProperties then begin if AFile.AttributesProperty is TNtfsFileAttributesProperty then AFile.Attributes := FILE_ATTRIBUTE_DIRECTORY else if AFile.AttributesProperty is TUnixFileAttributesProperty then AFile.Attributes := S_IFDIR else AFile.Attributes := faFolder; end; FileSourceFiles.Insert(AFile, 0); end; end; if Aborted then Exit; // Make display file list from file source file list. if Assigned(FAllDisplayFiles) and Assigned(FExistingDisplayFilesHashed) then begin // Updating existing list. MakeAllDisplayFileList( FFileSource, FileSourceFiles, FAllDisplayFiles, FSortings, FExistingDisplayFilesHashed); end else begin // Creating new list. if Assigned(FAllDisplayFiles) then FAllDisplayFiles.Clear else FAllDisplayFiles := TDisplayFiles.Create(True); MakeAllDisplayFileList(FFileSource, FileSourceFiles, FAllDisplayFiles, FSortings); end; // By now the TFile objects have been transfered to FAllDisplayFiles. if Assigned(FileSourceFiles) then FileSourceFiles.OwnsObjects := False; {$IFDEF timeFileView} DCDebug('Made sorted disp.lst: ' + IntToStr(DateTimeToTimeStamp(Now - filelistLoaderTime).Time)); {$ENDIF} FFilteredDisplayFiles := TDisplayFiles.Create(False); MakeDisplayFileList(FAllDisplayFiles, FFilteredDisplayFiles, FFileFilter, FFilterOptions); {$IFDEF timeFileView} DCDebug('Made filtered list : ' + IntToStr(DateTimeToTimeStamp(Now - filelistLoaderTime).Time)); {$ENDIF} if Aborted then Exit; // Loading file list is complete. Update grid with the new file list. TThread.Synchronize(Thread, @DoSetFilelist); {$IFDEF timeFileView} DCDebug('Grid files updated : ' + IntToStr(DateTimeToTimeStamp(Now - filelistLoaderTime).Time)); {$ENDIF} finally {$IFDEF timeFileView} DCDebug('Finished : ' + IntToStr(DateTimeToTimeStamp(Now - filelistLoaderTime).Time)); {$ENDIF} FreeAndNil(FFilteredDisplayFiles); FreeAndNil(FileSourceFiles); FreeAndNil(FAllDisplayFiles); end; end; class function TFileListBuilder.InternalMatchesFilter(aFile: TFile; const aFileFilter: String; const aFilterOptions: TQuickSearchOptions): Boolean; var sFileName: String; begin if (gShowSystemFiles = False) and AFile.IsSysFile and (AFile.Name <> '..') then Result := True // Ignore list else if gIgnoreListFileEnabled and MatchesMaskListEx(AFile, glsIgnoreList) then Result := True // Filter files. else if aFileFilter <> EmptyStr then begin Result := True; if (AFile.Name = '..') or (AFile.Name = '.') then Result := False else if (aFilterOptions.Items = qsiFiles) and (AFile.IsDirectory or AFile.IsLinkToDirectory) then Result := False else if (aFilterOptions.Items = qsiDirectories) and not AFile.IsDirectory and not AFile.IsLinkToDirectory then Result := False else begin if aFilterOptions.SearchCase = qscSensitive then sFileName := AFile.Name else sFileName := UTF8LowerCase(AFile.Name); if MatchesMask(sFileName, aFileFilter, aFilterOptions.SearchCase = qscSensitive) then Result := False; end; end else Result := False; end; class function TFileListBuilder.PrepareFilter(const aFileFilter: String; const aFilterOptions: TQuickSearchOptions): String; var sFilterNameNoExt: String; begin Result := aFileFilter; if Result <> EmptyStr then begin if Pos('.', Result) <> 0 then begin sFilterNameNoExt := ExtractOnlyFileName(Result); if not (qsmBeginning in aFilterOptions.Match) then sFilterNameNoExt := '*' + sFilterNameNoExt; if not (qsmEnding in aFilterOptions.Match) then sFilterNameNoExt := sFilterNameNoExt + '*'; Result := sFilterNameNoExt + ExtractFileExt(Result) + '*'; end else begin if not (qsmBeginning in aFilterOptions.Match) then Result := '*' + Result; Result := Result + '*'; end; end; end; class procedure TFileListBuilder.MakeDisplayFileList( allDisplayFiles: TDisplayFiles; filteredDisplayFiles: TDisplayFiles; aFileFilter: String; const aFilterOptions: TQuickSearchOptions); var i: Integer; AFile: TFile; filter: Boolean; begin filteredDisplayFiles.Clear; if Assigned(allDisplayFiles) then begin aFileFilter := PrepareFilter(aFileFilter, aFilterOptions); for i := 0 to allDisplayFiles.Count - 1 do begin AFile := allDisplayFiles[i].FSFile; try filter := InternalMatchesFilter(AFile, aFileFilter, aFilterOptions); except on EConvertError do aFileFilter := EmptyStr; end; if not filter then filteredDisplayFiles.Add(allDisplayFiles[i]); end; end; end; class procedure TFileListBuilder.MakeAllDisplayFileList( aFileSource: IFileSource; aFileSourceFiles: TFiles; aDisplayFiles: TDisplayFiles; const aSortings: TFileSortings); var i: PtrInt; AFile: TDisplayFile; HaveIcons: Boolean; DirectAccess: Boolean; begin aDisplayFiles.Clear; if Assigned(aFileSourceFiles) then begin HaveIcons := gShowIcons <> sim_none; DirectAccess := fspDirectAccess in aFileSource.Properties; if HaveIcons and gIconsExclude and DirectAccess then begin DirectAccess := not IsInPathList(gIconsExcludeDirs, aFileSourceFiles.Path); end; for i := 0 to aFileSourceFiles.Count - 1 do begin AFile := TDisplayFile.Create(aFileSourceFiles[i]); AFile.TextColor:= gColorExt.GetColorBy(AFile.FSFile); if HaveIcons then begin AFile.IconID := PixMapManager.GetIconByFile(AFile.FSFile, DirectAccess, not gLoadIconsSeparately, gShowIcons, not gIconOverlays); end; aDisplayFiles.Add(AFile); end; TDisplayFileSorter.Sort(aDisplayFiles, aSortings); end; end; class procedure TFileListBuilder.MakeAllDisplayFileList( aFileSource: IFileSource; aFileSourceFiles: TFiles; aExistingDisplayFiles: TDisplayFiles; const aSortings: TFileSortings; aExistingDisplayFilesHashed: TStringHashList); var i: PtrInt; j: Integer; AFile: TDisplayFile; aNewFiles: TDisplayFiles; HaveIcons: Boolean; DirectAccess: Boolean; begin if Assigned(aFileSourceFiles) then begin HaveIcons := gShowIcons <> sim_none; DirectAccess := fspDirectAccess in aFileSource.Properties; if HaveIcons and gIconsExclude and DirectAccess then begin DirectAccess := not IsInPathList(gIconsExcludeDirs, aFileSourceFiles.Path); end; aNewFiles := TDisplayFiles.Create(False); try for i := 0 to aFileSourceFiles.Count - 1 do begin j := aExistingDisplayFilesHashed.Find(aFileSourceFiles[i].FullPath); if j >= 0 then begin // Existing file. AFile := TDisplayFile(aExistingDisplayFilesHashed.List[j]^.Data); AFile.FSFile := aFileSourceFiles[i]; end else begin AFile := TDisplayFile.Create(aFileSourceFiles[i]); AFile.TextColor:= gColorExt.GetColorBy(AFile.FSFile); if HaveIcons then begin AFile.IconID := PixMapManager.GetIconByFile(AFile.FSFile, DirectAccess, not gLoadIconsSeparately, gShowIcons, not gIconOverlays); end; // New file. aNewFiles.Add(AFile); end; end; // Remove files that don't exist anymore. for i := aExistingDisplayFiles.Count - 1 downto 0 do begin if not Assigned(aExistingDisplayFiles[i].FSFile) then aExistingDisplayFiles.Delete(i); end; // Merge new files into existing files list. TDisplayFileSorter.InsertSort(aNewFiles, aExistingDisplayFiles, aSortings); finally aNewFiles.Free; end; end else begin aExistingDisplayFiles.Clear; end; end; class function TFileListBuilder.MatchesFilter(aFile: TFile; aFileFilter: String; const aFilterOptions: TQuickSearchOptions): Boolean; begin aFileFilter := PrepareFilter(aFileFilter, aFilterOptions); try Result := InternalMatchesFilter(AFile, aFileFilter, aFilterOptions); except on EConvertError do Result := False; end; end; procedure TFileListBuilder.DoSetFileList; begin DoneWorking; if not Aborted and Assigned(FSetFileListMethod) then FSetFileListMethod(FAllDisplayFiles, FFilteredDisplayFiles); end; { TFilePropertiesRetriever } constructor TFilePropertiesRetriever.Create(AFileSource: IFileSource; AThread: TThread; AFilePropertiesNeeded: TFilePropertiesTypes; AUpdateFileMethod: TUpdateFileMethod; var AFileList: TFVWorkerFileList); begin inherited Create(AThread); FWorkType := fvwtUpdate; FFileList := AFileList; AFileList := nil; FFileSource := AFileSource; FFilePropertiesNeeded := AFilePropertiesNeeded; FUpdateFileMethod := AUpdateFileMethod; end; destructor TFilePropertiesRetriever.Destroy; begin FFileList.Free; inherited Destroy; end; procedure TFilePropertiesRetriever.Execute; var i: Integer; HaveIcons: Boolean; DirectAccess: Boolean; begin HaveIcons := gShowIcons <> sim_none; DirectAccess := fspDirectAccess in FFileSource.Properties; if HaveIcons and gIconsExclude and DirectAccess then begin DirectAccess := not IsInPathList(gIconsExcludeDirs, FFileList.Files[0].FSFile.Path); end; for i := 0 to FFileList.Count - 1 do begin if Aborted then Exit; FWorkingFile := FFileList.Files[i]; FWorkingUserData := FFileList.Data[i]; try if FFileSource.CanRetrieveProperties(FWorkingFile.FSFile, FFilePropertiesNeeded) then FFileSource.RetrieveProperties(FWorkingFile.FSFile, FFilePropertiesNeeded); if FWorkingFile.TextColor = clNone then FWorkingFile.TextColor:= gColorExt.GetColorBy(FWorkingFile.FSFile); if HaveIcons then begin if FWorkingFile.IconID < 0 then FWorkingFile.IconID := PixMapManager.GetIconByFile( FWorkingFile.FSFile, DirectAccess, True, gShowIcons, not gIconOverlays); {$IF DEFINED(MSWINDOWS)} if gIconOverlays and (FWorkingFile.IconOverlayID < 0) then FWorkingFile.IconOverlayID := PixMapManager.GetIconOverlayByFile( FWorkingFile.FSFile, DirectAccess); {$ENDIF} end; if Aborted then Exit; TThread.Synchronize(Thread, @DoUpdateFile); except on EFileNotFound do; end; end; end; procedure TFilePropertiesRetriever.DoUpdateFile; begin if not Aborted and Assigned(FUpdateFileMethod) then FUpdateFileMethod(FWorkingFile, FWorkingUserData); end; { TCalculateSpaceWorker } constructor TCalculateSpaceWorker.Create(AFileSource: IFileSource; AThread: TThread; AUpdateFileMethod: TUpdateFileMethod; var AFileList: TFVWorkerFileList); begin inherited Create(AThread); FWorkType := fvwtUpdate; FFileList := AFileList; AFileList := nil; FFileSource := AFileSource; FUpdateFileMethod := AUpdateFileMethod; FOperation := nil; FOperationLock := TCriticalSection.Create; end; destructor TCalculateSpaceWorker.Destroy; begin FFileList.Free; inherited Destroy; FOperationLock.Free; end; procedure TCalculateSpaceWorker.Abort; begin inherited; FOperationLock.Acquire; try if Assigned(FOperation) then FOperation.Stop; finally FOperationLock.Release; end; end; procedure TCalculateSpaceWorker.Execute; var CalcStatisticsOperation: TFileSourceCalcStatisticsOperation; CalcStatisticsOperationStatistics: TFileSourceCalcStatisticsOperationStatistics; TargetFiles: TFiles = nil; AFile: TFile; i: Integer; begin if fsoCalcStatistics in FFileSource.GetOperationsTypes then begin for i := 0 to FFileList.Count - 1 do begin if Aborted then Exit; FWorkingFile := FFileList.Files[i]; FWorkingUserData := FFileList.Data[i]; AFile := FWorkingFile.FSFile; if (fpSize in AFile.SupportedProperties) and AFile.IsDirectory then begin TargetFiles := TFiles.Create(AFile.Path); try TargetFiles.Add(AFile.Clone); FOperationLock.Acquire; try FOperation := FFileSource.CreateCalcStatisticsOperation(TargetFiles); finally FOperationLock.Release; end; CalcStatisticsOperation := FOperation as TFileSourceCalcStatisticsOperation; CalcStatisticsOperation.SkipErrors := True; CalcStatisticsOperation.SymLinkOption := fsooslDontFollow; FOperation.Execute; // blocks until finished if FOperation.Result = fsorFinished then begin CalcStatisticsOperationStatistics := CalcStatisticsOperation.RetrieveStatistics; AFile.Size := CalcStatisticsOperationStatistics.Size; Inc(FCompletedCalculations); if Aborted then Exit; TThread.Synchronize(Thread, @DoUpdateFile); end; finally FreeAndNil(TargetFiles); FOperationLock.Acquire; try FreeAndNil(FOperation); finally FOperationLock.Release; end; end; end; end; end; end; procedure TCalculateSpaceWorker.DoUpdateFile; begin if not Aborted and Assigned(FUpdateFileMethod) then FUpdateFileMethod(FWorkingFile, FWorkingUserData); end; end. doublecmd-0.5.8/src/fileviews/ufileviewhistory.pas0000644000175000017500000001772412254131240021425 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- History of visited paths, file sources for a file view. Copyright (C) 2010 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uFileViewHistory; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSource; type { TFileViewHistory } TFileViewHistory = class private FCurrentFileSource: Integer; FCurrentPath: Integer; FHistory: TFPList; // of PFileViewHistoryEntry procedure Delete(Index: Integer); {en Delete history after current indexes. } procedure DeleteAfterCurrent; function GetCount: Integer; // = FileSourcesCount function GetCurrentFileSource: IFileSource; function GetCurrentPath: UTF8String; function GetFileSource(Index: Integer): IFileSource; function GetPath(FileSourceIndex, PathIndex: Integer): UTF8String; function GetPathsCount(Index: Integer): Integer; public constructor Create; destructor Destroy; override; procedure Clear; {$IFDEF DEBUG_HISTORY} procedure DebugShow; {$ENDIF} procedure Add(aFileSource: IFileSource; aPath: UTF8String); procedure AddFileSource(aFileSource: IFileSource); procedure AddPath(aPath: UTF8String); procedure Assign(otherHistory: TFileViewHistory); procedure DeleteFromCurrentFileSource; procedure SetIndexes(aFileSourceIndex: Integer; aCurrentPathIndex: Integer); property Count: Integer read GetCount; property CurrentFileSource: IFileSource read GetCurrentFileSource; property CurrentFileSourceIndex: Integer read FCurrentFileSource write FCurrentFileSource; property CurrentPath: UTF8String read GetCurrentPath; property CurrentPathIndex: Integer read FCurrentPath write FCurrentPath; property FileSource[Index: Integer]: IFileSource read GetFileSource; property Path[FileSourceIndex, PathIndex: Integer]: UTF8String read GetPath; property PathsCount[Index: Integer]: Integer read GetPathsCount; end; implementation type PFileViewHistoryEntry = ^TFileViewHistoryEntry; TFileViewHistoryEntry = record FileSource: IFileSource; PathsList : TStringList; // paths always include trailing path delimiter end; { TFileViewHistory } constructor TFileViewHistory.Create; begin FHistory := TFPList.Create; FCurrentFileSource := -1; FCurrentPath := -1; end; destructor TFileViewHistory.Destroy; begin inherited Destroy; Clear; FreeAndNil(FHistory); end; procedure TFileViewHistory.Clear; var i: Integer; begin for i := FHistory.Count - 1 downto 0 do Delete(i); FCurrentFileSource := -1; FCurrentPath := -1; end; {$IFDEF DEBUG_HISTORY} procedure TFileViewHistory.DebugShow; var i, j: Integer; HistEntry: PFileViewHistoryEntry; begin for i := 0 to FHistory.Count - 1 do begin HistEntry := PFileViewHistoryEntry(FHistory.Items[i]); WriteLn('--------------------------------------'); WriteLn(' ', HistEntry^.FileSource.ClassName); for j := 0 to HistEntry^.PathsList.Count - 1 do begin if (i = FCurrentFileSource) and (j = FCurrentPath) then Write('=> ') else Write(' '); WriteLn(HistEntry^.PathsList.Strings[j]); end; end; end; {$ENDIF} function TFileViewHistory.GetCount: Integer; begin Result := FHistory.Count; end; function TFileViewHistory.GetCurrentFileSource: IFileSource; begin if FCurrentFileSource >= 0 then Result := PFileViewHistoryEntry(FHistory[FCurrentFileSource])^.FileSource else Result := nil; end; function TFileViewHistory.GetCurrentPath: UTF8String; begin if (FCurrentFileSource >= 0) and (FCurrentPath >= 0) then Result := PFileViewHistoryEntry(FHistory[FCurrentFileSource])^.PathsList[FCurrentPath] else Result := EmptyStr; end; function TFileViewHistory.GetFileSource(Index: Integer): IFileSource; begin Result := PFileViewHistoryEntry(FHistory.Items[Index])^.FileSource; end; function TFileViewHistory.GetPath(FileSourceIndex, PathIndex: Integer): UTF8String; begin Result := PFileViewHistoryEntry(FHistory.Items[FileSourceIndex])^.PathsList.Strings[PathIndex]; end; function TFileViewHistory.GetPathsCount(Index: Integer): Integer; begin Result := PFileViewHistoryEntry(FHistory.Items[Index])^.PathsList.Count; end; procedure TFileViewHistory.Add(aFileSource: IFileSource; aPath: UTF8String); begin AddFileSource(aFileSource); AddPath(aPath); end; procedure TFileViewHistory.AddFileSource(aFileSource: IFileSource); var HistEntry: PFileViewHistoryEntry; begin if FCurrentFileSource >= 0 then begin DeleteAfterCurrent; HistEntry := PFileViewHistoryEntry(FHistory.Items[FCurrentFileSource]); // Don't add if the current file source is the same. if HistEntry^.FileSource.Equals(aFileSource) then Exit; end; New(HistEntry); FHistory.Add(HistEntry); HistEntry^.FileSource := aFileSource; HistEntry^.PathsList := TStringList.Create; Inc(FCurrentFileSource); FCurrentPath := -1; end; procedure TFileViewHistory.AddPath(aPath: UTF8String); var aPaths: TStringList; begin if FCurrentFileSource >= 0 then begin DeleteAfterCurrent; aPaths := PFileViewHistoryEntry(FHistory.Items[FCurrentFileSource])^.PathsList; if aPath <> '' then aPath := IncludeTrailingPathDelimiter(aPath); if (aPaths.Count = 0) or (aPaths.Strings[FCurrentPath] <> aPath) then begin aPaths.Add(aPath); if aPaths.Count > 50 then aPaths.Delete(0) else Inc(FCurrentPath); end; end; end; procedure TFileViewHistory.Assign(otherHistory: TFileViewHistory); var i: Integer; HistEntry, otherHistEntry: PFileViewHistoryEntry; begin Clear; for i := 0 to otherHistory.FHistory.Count - 1 do begin otherHistEntry := PFileViewHistoryEntry(otherHistory.FHistory.Items[i]); New(HistEntry); FHistory.Add(HistEntry); HistEntry^.FileSource := otherHistEntry^.FileSource; HistEntry^.PathsList := TStringList.Create; HistEntry^.PathsList.AddStrings(otherHistEntry^.PathsList); end; FCurrentFileSource := otherHistory.FCurrentFileSource; FCurrentPath := otherHistory.FCurrentPath; end; procedure TFileViewHistory.Delete(Index: Integer); var HistEntry: PFileViewHistoryEntry; begin HistEntry := PFileViewHistoryEntry(FHistory.Items[Index]); FHistory.Delete(Index); HistEntry^.FileSource := nil; HistEntry^.PathsList.Free; Dispose(HistEntry); end; procedure TFileViewHistory.DeleteAfterCurrent; var i: Integer; aPaths: TStringList; begin if FHistory.Count > 0 then begin for i := FHistory.Count - 1 downto FCurrentFileSource + 1 do Delete(i); aPaths := PFileViewHistoryEntry(FHistory.Items[FCurrentFileSource])^.PathsList; for i := aPaths.Count - 1 downto FCurrentPath + 1 do aPaths.Delete(i); end; end; procedure TFileViewHistory.DeleteFromCurrentFileSource; var i: Integer; begin if FHistory.Count > 0 then begin for i := FHistory.Count - 1 downto FCurrentFileSource do Delete(i); Dec(FCurrentFileSource); if FCurrentFileSource >= 0 then // Set to last entry. FCurrentPath := PathsCount[FCurrentFileSource] - 1 else FCurrentFileSource := -1; end; end; procedure TFileViewHistory.SetIndexes(aFileSourceIndex: Integer; aCurrentPathIndex: Integer); begin FCurrentFileSource := aFileSourceIndex; FCurrentPath := aCurrentPathIndex; end; end. doublecmd-0.5.8/src/fileviews/ufileviewwithpanels.pas0000644000175000017500000001363412051643445022110 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Generic file view containing default panels (header, footer, etc.) Copyright (C) 2012 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uFileViewWithPanels; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Controls, ExtCtrls, StdCtrls, uFileView, uFileViewHeader, uFileSource; type { TFileViewWithPanels } TFileViewWithPanels = class(TFileView) protected FSelectedCount: Integer; lblInfo: TLabel; pnlHeader: TFileViewHeader; pnlFooter: TPanel; procedure AfterChangePath; override; procedure CreateDefault(AOwner: TWinControl); override; procedure DisplayFileListChanged; override; procedure DoActiveChanged; override; procedure DoSelectionChanged; override; procedure DoUpdateView; override; procedure ShowPathEdit; procedure UpdateInfoPanel; virtual; public procedure AddFileSource(aFileSource: IFileSource; aPath: String); override; procedure RemoveCurrentFileSource; override; published procedure cm_EditPath(const Params: array of string); end; implementation uses uGlobs, uLng, uFileProperty, uFileViewWorker, uDCUtils; { TFileViewWithPanels } procedure TFileViewWithPanels.AddFileSource(aFileSource: IFileSource; aPath: String); begin inherited AddFileSource(aFileSource, aPath); pnlHeader.UpdateAddressLabel; end; procedure TFileViewWithPanels.AfterChangePath; begin inherited AfterChangePath; if FileSourcesCount > 0 then pnlHeader.UpdatePathLabel; end; procedure TFileViewWithPanels.cm_EditPath(const Params: array of string); begin ShowPathEdit; end; procedure TFileViewWithPanels.CreateDefault(AOwner: TWinControl); begin inherited CreateDefault(AOwner); pnlHeader := TFileViewHeader.Create(Self, Self); pnlFooter := TPanel.Create(Self); pnlFooter.Parent := Self; pnlFooter.Align := alBottom; pnlFooter.BevelInner := bvNone; pnlFooter.BevelOuter := bvNone; pnlFooter.AutoSize := True; lblInfo := TLabel.Create(pnlFooter); lblInfo.Parent := pnlFooter; lblInfo.AutoSize := False; lblInfo.Align := alClient; {$IF DEFINED(LCLGTK2)} // Workaround: "Layout and line" // http://doublecmd.sourceforge.net/mantisbt/view.php?id=573 pnlFooter.Visible := False; {$ELSE} lblInfo.Height := lblInfo.Canvas.TextHeight('Wg'); {$ENDIF} {$IFDEF LCLCARBON} // Under Carbon AutoSize don't work without it pnlHeader.ClientHeight:= 0; pnlFooter.ClientHeight:= 0; {$ENDIF} end; procedure TFileViewWithPanels.DisplayFileListChanged; begin inherited DisplayFileListChanged; UpdateInfoPanel; end; procedure TFileViewWithPanels.DoActiveChanged; begin inherited DoActiveChanged; pnlHeader.SetActive(Active); end; procedure TFileViewWithPanels.DoSelectionChanged; begin inherited DoSelectionChanged; UpdateInfoPanel; end; procedure TFileViewWithPanels.DoUpdateView; begin inherited DoUpdateView; pnlHeader.Visible := gCurDir; // Current directory pnlFooter.Visible := gStatusBar; // Status bar pnlHeader.UpdateAddressLabel; pnlHeader.UpdatePathLabel; end; procedure TFileViewWithPanels.RemoveCurrentFileSource; begin inherited RemoveCurrentFileSource; if FileSourcesCount > 0 then pnlHeader.UpdateAddressLabel; end; procedure TFileViewWithPanels.ShowPathEdit; begin pnlHeader.ShowPathEdit; end; procedure TFileViewWithPanels.UpdateInfoPanel; var i: Integer; FilesInDir, FilesSelected, FolderInDir, FolderSelected: Integer; SizeInDir, SizeSelected: Int64; SizeProperty: TFileSizeProperty; begin FSelectedCount := 0; if GetCurrentWorkType = fvwtCreate then begin lblInfo.Caption := rsMsgLoadingFileList; end else if not Assigned(FAllDisplayFiles) or (FAllDisplayFiles.Count = 0) then begin lblInfo.Caption := rsMsgNoFiles; end else if Assigned(FileSource) then begin FilesInDir := 0; FilesSelected := 0; SizeInDir := 0; SizeSelected := 0; FolderInDir := 0; FolderSelected := 0; for i := 0 to FFiles.Count - 1 do begin with FFiles[i] do begin if FSFile.Name = '..' then Continue; if FSFile.IsDirectory then inc(FolderInDir) else inc(FilesInDir); if Selected then begin if FSFile.IsDirectory then inc(FolderSelected) else inc(FilesSelected); end; // Count size if Size property exists. if fpSize in FSFile.AssignedProperties then begin SizeProperty := FSFile.SizeProperty; if Selected then SizeSelected := SizeSelected + SizeProperty.Value; SizeInDir := SizeInDir + SizeProperty.Value; end; end; end; FSelectedCount := FilesSelected + FolderSelected; lblInfo.Caption := Format(rsMsgSelectedInfo, [cnvFormatFileSize(SizeSelected), cnvFormatFileSize(SizeInDir), FilesSelected, FilesInDir, FolderSelected, FolderInDir]); end else if not (csDestroying in ComponentState) then lblInfo.Caption := ''; end; end. doublecmd-0.5.8/src/fchecksumcalc.lfm0000644000175000017500000000523412023046500016564 0ustar alexxalexxobject frmCheckSumCalc: TfrmCheckSumCalc Left = 290 Height = 136 Top = 175 Width = 460 BorderIcons = [biSystemMenu] Caption = 'Calculate check sum...' ClientHeight = 136 ClientWidth = 460 Constraints.MaxHeight = 200 Constraints.MaxWidth = 800 Constraints.MinHeight = 136 Constraints.MinWidth = 400 OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter SessionProperties = 'cbSeparateFile.Checked;cmbHashAlgorithm.ItemIndex' LCLVersion = '1.1' object lblSaveTo: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner Left = 10 Height = 18 Top = 8 Width = 166 BorderSpacing.Left = 10 BorderSpacing.Top = 8 Caption = '&Save check sum file(s) to:' FocusControl = edtSaveTo ParentColor = False end object edtSaveTo: TEdit AnchorSideLeft.Control = Owner AnchorSideTop.Control = lblSaveTo AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 10 Height = 28 Top = 32 Width = 440 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Top = 6 BorderSpacing.Right = 10 TabOrder = 0 end object cbSeparateFile: TCheckBox AnchorSideLeft.Control = edtSaveTo AnchorSideTop.Control = edtSaveTo AnchorSideTop.Side = asrBottom Left = 10 Height = 23 Top = 66 Width = 302 BorderSpacing.Top = 6 Caption = 'C&reate separate checksum file for each file' OnChange = cbSeparateFileChange TabOrder = 1 end object btnOK: TBitBtn AnchorSideRight.Control = btnCancel AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 244 Height = 32 Top = 94 Width = 100 Anchors = [akRight, akBottom] BorderSpacing.Right = 6 BorderSpacing.Bottom = 10 Caption = '&OK' Default = True Kind = bkOK ModalResult = 1 TabOrder = 3 end object btnCancel: TBitBtn AnchorSideRight.Control = edtSaveTo AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 350 Height = 32 Top = 94 Width = 100 Anchors = [akRight, akBottom] BorderSpacing.Bottom = 10 Cancel = True Caption = '&Cancel' Kind = bkCancel ModalResult = 2 TabOrder = 4 end object cmbHashAlgorithm: TComboBox AnchorSideLeft.Control = cbSeparateFile AnchorSideTop.Control = cbSeparateFile AnchorSideTop.Side = asrBottom Left = 10 Height = 30 Top = 95 Width = 132 BorderSpacing.Top = 6 ItemHeight = 0 OnChange = cmbHashAlgorithmChange Style = csDropDownList TabOrder = 2 end end doublecmd-0.5.8/src/fviewer.pas0000644000175000017500000021042412247664766015500 0ustar alexxalexx{ Seksi Commander ---------------------------- Integrated viewer form Licence : GNU GPL v 2.0 Author : radek.cervinka@centrum.cz contributors: Radek Polak ported to lazarus: changes: 23.7. - fixed: scroll bar had wrong max value until user pressed key (by Radek Polak) - fixed: wrong scrolling with scroll bar - now look at ScrollBarVertScroll (by Radek Polak) Dmitry Kolomiets 15.03.08 changes: - Added WLX api support (TC WLX api v 1.8) Rustem Rakhimov 25.04.10 changes: - fullscreen - function for edit image - slide show - some Viwer function } unit fViewer; {$mode objfpc}{$H+} interface uses SysUtils, Classes, Graphics, Controls, Forms, ExtCtrls, ComCtrls, LCLProc, Menus, Dialogs, ExtDlgs, StdCtrls, Buttons, ColorBox, Spin, Grids, ActnList, viewercontrol, GifAnim, fFindView, WLXPlugin, uWLXModule, uFileSource, fModView, Types, uThumbnails, uFormCommands, uOSForms; type { TfrmViewer } TfrmViewer = class(TAloneForm, IFormCommands) actAbout: TAction; actCopyFile: TAction; actDeleteFile: TAction; actMirror: TAction; actRotate270: TAction; actRotate180: TAction; actRotate90: TAction; actSaveAs: TAction; actStretchImage: TAction; actMoveFile: TAction; actLoadPrevFile: TAction; actLoadNextFile: TAction; actReload: TAction; actionList: TActionList; btnCopyFile1: TSpeedButton; btnDeleteFile1: TSpeedButton; btnMoveFile1: TSpeedButton; btnNext1: TSpeedButton; btnPrev1: TSpeedButton; btnReload1: TSpeedButton; cbSlideShow: TCheckBox; ColorBoxPaint: TColorBox; ComboBoxWidth: TComboBox; ComboBoxPaint: TComboBox; DrawPreview: TDrawGrid; gboxPaint: TGroupBox; gboxView: TGroupBox; gboxSlideShow: TGroupBox; GifAnim: TGifAnim; miReload: TMenuItem; miLookBook: TMenuItem; miDiv4: TMenuItem; miPreview: TMenuItem; miScreenshot: TMenuItem; miFullScreen: TMenuItem; miSave: TMenuItem; miSaveAs: TMenuItem; gboxHightlight: TGroupBox; Image: TImage; lblHightlight: TLabel; miZoomOut: TMenuItem; miZoomIn: TMenuItem; miRotate: TMenuItem; miMirror: TMenuItem; mi270: TMenuItem; mi180: TMenuItem; mi90: TMenuItem; miSearchPrev: TMenuItem; miPrint: TMenuItem; miSearchNext: TMenuItem; pnlFolder: TPanel; pnlPreview: TPanel; pnlEditFile: TPanel; PanelEditImage: TPanel; pmiSelectAll: TMenuItem; miDiv5: TMenuItem; pmiCopy: TMenuItem; pnlImage: TPanel; pnlText: TPanel; miDiv3: TMenuItem; miEncoding: TMenuItem; miPlugins: TMenuItem; miSeparator: TMenuItem; pmEditMenu: TPopupMenu; SavePictureDialog: TSavePictureDialog; sboxImage: TScrollBox; btnCutTuImage: TSpeedButton; btnResize: TSpeedButton; btnUndo: TSpeedButton; btnHightlight: TSpeedButton; btn270: TSpeedButton; btn90: TSpeedButton; btnMirror: TSpeedButton; btnZoomIn: TSpeedButton; btnZoomOut: TSpeedButton; btnReload: TSpeedButton; btnPaint: TSpeedButton; btnFullScreen: TSpeedButton; seTimeShow: TSpinEdit; btnRedEye: TSpeedButton; btnNext: TSpeedButton; btnPrev: TSpeedButton; btnMoveFile: TSpeedButton; btnDeleteFile: TSpeedButton; btnCopyFile: TSpeedButton; btnGifMove: TSpeedButton; btnGifToBmp: TSpeedButton; btnNextGifFrame: TSpeedButton; btnPrevGifFrame: TSpeedButton; Splitter: TSplitter; Status: TStatusBar; MainMenu: TMainMenu; miFile: TMenuItem; miPrev: TMenuItem; miNext: TMenuItem; miView: TMenuItem; miExit: TMenuItem; miImage: TMenuItem; miStretch: TMenuItem; miText: TMenuItem; miBin: TMenuItem; miHex: TMenuItem; miWrapText: TMenuItem; miAbout: TMenuItem; miAbout2: TMenuItem; miDiv1: TMenuItem; miSearch: TMenuItem; miDiv2: TMenuItem; miGraphics: TMenuItem; miEdit: TMenuItem; miSelectAll: TMenuItem; miCopyToClipboard: TMenuItem; TimerViewer: TTimer; ViewerControl: TViewerControl; procedure actExecute(Sender: TObject); procedure btnCopyMoveFileClick(Sender: TObject); procedure btnCutTuImageClick(Sender: TObject); procedure btnDeleteFileClick(Sender: TObject); procedure btnFullScreenClick(Sender: TObject); procedure btnGifMoveClick(Sender: TObject); procedure btnGifToBmpClick(Sender: TObject); procedure btnPaintHightlight(Sender: TObject); procedure btnPrevGifFrameClick(Sender: TObject); procedure btnRedEyeClick(Sender: TObject); procedure btnResizeClick(Sender: TObject); procedure btnUndoClick(Sender: TObject); procedure DrawPreviewDrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); procedure DrawPreviewSelection(Sender: TObject; aCol, aRow: Integer); procedure DrawPreviewTopleftChanged(Sender: TObject); procedure FormCreate(Sender : TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure FormResize(Sender: TObject); procedure FormShow(Sender: TObject); procedure GifAnimMouseEnter(Sender: TObject); procedure ImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ImageMouseEnter(Sender: TObject); procedure ImageMouseLeave(Sender: TObject); procedure ImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer ); procedure ImageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure miPreviewClick(Sender: TObject); procedure miSaveAsClick(Sender: TObject); procedure miSaveClick(Sender: TObject); procedure miScreenShotClick(Sender: TObject); procedure miFullScreenClick(Sender: TObject); procedure miPluginsClick(Sender: TObject); procedure miPrintClick(Sender: TObject); procedure miSearchNextClick(Sender: TObject); procedure miSearchPrevClick(Sender: TObject); procedure miZoomClick(Sender: TObject); procedure PanelEditImageMouseEnter(Sender: TObject); procedure pnlImageResize(Sender: TObject); procedure sboxImageMouseEnter(Sender: TObject); procedure sboxImageMouseLeave(Sender: TObject); procedure sboxImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure btnNextGifFrameClick(Sender: TObject); procedure SplitterChangeBounds(Sender: TObject); procedure TimerViewerTimer(Sender: TObject); procedure ViewerControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure frmViewerClose(Sender: TObject; var CloseAction: TCloseAction); procedure frmViewerKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure miExitClick(Sender: TObject); procedure miStretchClick(Sender: TObject); procedure miTextClick(Sender: TObject); procedure miAbout2Click(Sender: TObject); procedure miSearchClick(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure miProcessClick(Sender: TObject); procedure miGraphicsClick(Sender: TObject); procedure miCopyToClipboardClick(Sender: TObject); procedure miSelectAllClick(Sender: TObject); procedure miChangeEncodingClick(Sender:TObject); procedure ViewerPositionChanged(Sender:TObject); procedure miRotateClick(Sender: TObject); private FileList: TStringList; iActiveFile, tmpX, tmpY, startX, startY, endX, endY, UndoSX, UndoSY, UndoEX, UndoEY, cas, i_timer:Integer; bAnimation, bImage, bPlugin, bQuickView, MDFlag, ImgEdit: Boolean; FThumbSize: TSize; FFindDialog:TfrmFindView; FFileSource: IFileSource; FLastSearchPos: PtrInt; tmp_all: TCustomBitmap; FModSizeDialog: TfrmModView; FThumbnailManager: TThumbnailManager; FBitmapList: TBitmapList; FCommands: TFormCommands; //--------------------- WlxPlugins:TWLXModuleList; ActivePlugin:Integer; //--------------------- function GetListerRect: TRect; function CheckPlugins(const sFileName: UTF8String; bForce: Boolean = False): Boolean; function CheckGraphics(const sFileName:String):Boolean; function LoadGraphics(const sFileName:String): Boolean; procedure AdjustImageSize; procedure DoSearch(bQuickSearch: Boolean; bSearchBackwards: Boolean); procedure MakeTextEncodingsMenu; procedure ActivatePanel(Panel: TPanel); procedure ReopenAsTextIfNeeded; procedure CheckXY; procedure UndoTmp; procedure CreateTmp; procedure CutToImage; procedure Res(W, H: integer); procedure RedEyes; procedure SaveImageAs (Var sExt: String; senderSave: boolean; Quality: integer); procedure CreatePreview(FullPathToFile:string; index:integer; delete: boolean = false); property Commands: TFormCommands read FCommands{$IF FPC_FULLVERSION >= 020501} implements IFormCommands{$ENDIF}; public constructor Create(TheOwner: TComponent; aFileSource: IFileSource; aQuickView: Boolean = False); overload; constructor Create(TheOwner: TComponent); override; destructor Destroy; override; procedure LoadFile(const aFileName: UTF8String); procedure LoadNextFile(const aFileName: UTF8String); procedure LoadFile(iIndex:Integer); procedure ExitPluginMode; {$IF FPC_FULLVERSION < 020501} // "implements" does not work in FPC < 2.5.1 function ExecuteCommand(Command: string; const Params: array of string): TCommandFuncResult; function GetCommandCaption(Command: String; CaptionType: TCommandCaptionType): String; procedure GetCommandsList(List: TStrings); {$ENDIF} published // Commands for hotkey manager procedure cm_About(const Params: array of string); procedure cm_Reload(const Params: array of string); procedure cm_LoadNextFile(const Params: array of string); procedure cm_LoadPrevFile(const Params: array of string); procedure cm_MoveFile(const Params: array of string); procedure cm_CopyFile(const Params: array of string); procedure cm_DeleteFile(const Params: array of string); procedure cm_StretchImage(const Params: array of string); procedure cm_SaveAs(const Params: array of string); procedure cm_Rotate90(const Params: array of string); procedure cm_Rotate180(const Params: array of string); procedure cm_Rotate270(const Params: array of string); procedure cm_Mirror(const Params: array of string); end; procedure ShowViewer(const FilesToView:TStringList; const aFileSource: IFileSource = nil); implementation {$R *.lfm} uses FileUtil, IntfGraphics, Math, uLng, uShowMsg, uGlobs, LCLType, LConvEncoding, DCClassesUtf8, uFindMmap, DCStrUtils, uDCUtils, LCLIntf, uDebug, uHotkeyManager, uConvEncoding, DCBasicTypes, DCOSUtils, uOSUtils; const HotkeysCategory = 'Viewer'; // Status bar panels indexes. sbpFileName = 0; sbpFileNr = 1; // Text sbpPosition = 2; sbpFileSize = 3; sbpTextEncoding = 4; // WLX sbpPluginName = 2; // Graphics sbpCurrentResolution = 2; sbpFullResolution = 3; procedure ShowViewer(const FilesToView:TStringList; const aFileSource: IFileSource); var Viewer: TfrmViewer; begin //DCDebug('ShowViewer - Using Internal'); Viewer := TfrmViewer.Create(Application, aFileSource); Viewer.FileList.Assign(FilesToView);// Make a copy of the list Viewer.DrawPreview.RowCount:= Viewer.FileList.Count; with Viewer.ViewerControl do case gViewerMode of 1: ViewerMode:= vmText; 2: ViewerMode:= vmBin; 3: ViewerMode:= vmHex; 4: ViewerMode:= vmWrap; //5: ViewerMode:= vmBook; end; Viewer.LoadFile(0); Viewer.Show; if Viewer.miPreview.Checked then begin Viewer.miPreview.Checked := not(Viewer.miPreview.Checked); Viewer.miPreviewClick(Viewer); end; end; constructor TfrmViewer.Create(TheOwner: TComponent; aFileSource: IFileSource; aQuickView: Boolean); begin bQuickView:= aQuickView; inherited Create(TheOwner); FFileSource := aFileSource; FLastSearchPos := -1; FThumbnailManager:= nil; FBitmapList:= TBitmapList.Create(True); FCommands := TFormCommands.Create(Self, actionList); end; constructor TfrmViewer.Create(TheOwner: TComponent); begin Create(TheOwner, nil); end; destructor TfrmViewer.Destroy; begin FreeThenNil(FileList); FreeThenNil(FThumbnailManager); inherited Destroy; FreeAndNil(WlxPlugins); FFileSource := nil; // If this is temp file source, the files will be deleted. tmp_all.Free; end; procedure TfrmViewer.LoadFile(const aFileName: UTF8String); var i: Integer; dwFileAttributes: TFileAttrs; begin dwFileAttributes := mbFileGetAttr(aFileName); if dwFileAttributes = faInvalidAttributes then begin ShowMessage(rsMsgErrNoFiles); Exit; end; FLastSearchPos := -1; Caption := aFileName; if bQuickView then begin iActiveFile := 0; FileList.Text := aFileName; end; // Clear text on status bar. for i := 0 to Status.Panels.Count - 1 do Status.Panels[i].Text := ''; Screen.Cursor:= crHourGlass; try if FPS_ISDIR(dwFileAttributes) then begin ActivatePanel(pnlFolder); pnlFolder.Caption:= rsPropsFolder + ': ' + aFileName; end else begin if CheckPlugins(aFileName) then ActivatePanel(nil) else if CheckGraphics(aFileName) and LoadGraphics(aFileName) then ActivatePanel(pnlImage) else begin ViewerControl.FileName := aFileName; ActivatePanel(pnlText); end; Status.Panels[sbpFileName].Text:= aFileName; end; finally Screen.Cursor:= crDefault; end; end; procedure TfrmViewer.LoadNextFile(const aFileName: UTF8String); begin if bPlugin then with WlxPlugins.GetWlxModule(ActivePlugin) do begin if FileParamVSDetectStr(aFileName, False) then begin if CallListLoadNext(Self.Handle, aFileName, 0) <> LISTPLUGIN_ERROR then Exit; end; end; ExitPluginMode; LoadFile(aFileName); end; procedure TfrmViewer.LoadFile(iIndex: Integer); begin iActiveFile := iIndex; LoadFile(FileList.Strings[iIndex]); gboxPaint.Visible:=false; gboxHightlight.Visible:=false; Status.Panels[sbpFileNr].Text:=Format('%d/%d',[iIndex+1,FileList.Count]); end; procedure TfrmViewer.FormKeyPress(Sender: TObject; var Key: Char); begin // The following keys work only in QuickView mode because there is no menu there. // Otherwise this function is never called for those keys // because the menu shortcuts are automatically used. if bQuickView then case Key of 'N', 'n': begin cm_LoadNextFile([]); Key := #0; end; 'P', 'p': begin cm_LoadPrevFile([]); Key := #0; end; '1': begin miTextClick(Sender); Key := #0; end; '2': begin miTextClick(miBin); Key := #0; end; '3': begin miTextClick(miHex); Key := #0; end; '4': begin miTextClick(miWrapText); Key := #0; end; end; end; procedure TfrmViewer.FormResize(Sender: TObject); begin if bPlugin then WlxPlugins.GetWlxModule(ActivePlugin).ResizeWindow(GetListerRect); end; procedure TfrmViewer.FormShow(Sender: TObject); begin {$IF DEFINED(LCLGTK2)} if not pnlPreview.Visible then begin pnlPreview.Visible:= True; pnlPreview.Visible:= False; end; {$ENDIF} end; procedure TfrmViewer.GifAnimMouseEnter(Sender: TObject); begin if miFullScreen.Checked then TimerViewer.Enabled:=true; end; procedure TfrmViewer.ImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin MDFlag := true; X:=round(X*Image.Picture.Width/Image.Width); // for correct paint after zoom Y:=round(Y*Image.Picture.Height/Image.Height); cas:=0; if (button = mbLeft) and gboxHightlight.Visible then begin if (X>StartX) and (X<=StartX+10) then begin if (Y>StartY) and (Y<=StartY+10) then begin cas:=1; tmpX:=X-StartX; tmpY:=Y-StartY; end; if (Y>StartY+10) and (Y<=EndY-10) then begin cas:=2; tmpX:=X-StartX; end; if (Y>EndY-9) and (Y<=EndY) then begin cas:=3; tmpX:=X-StartX; tmpY:=EndY-Y; end; if (YEndY) then cas:=0; end; if (X>StartX+10) and (X<=EndX-10) then begin if (Y>StartY) and (Y<=StartY+10) then begin cas:=4; tmpY:=Y-StartY; end; if (Y>StartY+10) and (Y<=EndY-10)then begin cas:=5; tmpX:=X-StartX; tmpY:=Y-StartY; end; if (Y>EndY-9) and (Y<=EndY) then begin cas:=6; tmpY:=EndY-Y; end; If (YEndY) then cas:=0; end; if (X>EndX-10) and (X<=EndX) then begin if (Y>StartY) and (Y<=StartY+10) then begin cas:=7; tmpX := EndX-X; tmpY:=StartY-Y; end; if (Y>StartY+10) and (Y<=EndY-10) then begin cas:=8; tmpX := EndX-X; end; if (Y>EndY-9) and (Y<=EndY) then begin cas:=9; tmpX := EndX-X; tmpY:=EndY-Y; end; If (YEndY) then cas:=0; end; if (XEndX) then cas:=0; end; if cas=0 then begin StartX := X; StartY := Y; end; if gboxPaint.Visible then begin CreateTmp; Image.Picture.Bitmap.Canvas.MoveTo (x,y); end; if not (gboxHightlight.Visible) and not (gboxPaint.Visible) then begin tmpX:=x; tmpY:=y; Image.Cursor:=crHandPoint; end; end; procedure TfrmViewer.ImageMouseEnter(Sender: TObject); begin if miFullScreen.Checked then TimerViewer.Enabled:=true; end; procedure TfrmViewer.ImageMouseLeave(Sender: TObject); begin if miFullScreen.Checked then TimerViewer.Enabled:=false; end; procedure TfrmViewer.ImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var tmp: integer; begin if gboxHightlight.Visible then Image.Cursor:=crCross; if miFullScreen.Checked then begin sboxImage.Cursor:=crDefault; Image.Cursor:=crDefault; i_timer:=0; end; X:=round(X*Image.Picture.Width/Image.Width); // for correct paint after zoom Y:=round(Y*Image.Picture.Height/Image.Height); if MDFlag then begin if gboxHightlight.Visible then begin if cas=0 then begin EndX:=X; EndY:=Y; end; if cas=1 then begin StartX:= X-tmpX; StartY:=Y-tmpY; end; if cas=2 then StartX:= X-tmpX; if cas=3then begin StartX:= X-tmpX; EndY:=Y+tmpY; end; if cas=4 then StartY:=Y-tmpY; if cas=5 then begin tmp:=EndX-StartX; StartX:= X-tmpX; EndX:=StartX+tmp; tmp:=EndY-StartY; StartY:= Y-tmpY; EndY:=StartY+tmp; end; if cas=6 then EndY:=Y+tmpY; if cas=7 then begin EndX:=X+tmpX; StartY:=Y-tmpY; end; if cas=8 then endX:=X+tmpX; if cas=9 then begin EndX:=X+tmpX; EndY:=Y+tmpY; end; if StartX<0 then begin StartX:=0; EndX:= UndoEX; end; if StartY<0 then begin StartY:=0; EndY:= UndoEY; end; if endX> Image.Picture.Width then endX:=Image.Picture.Width; if endY> Image.Picture.Height then endY:=Image.Picture.Height; with Image.Picture.Bitmap.Canvas do begin DrawFocusRect(Rect(UndoSX,UndoSY,UndoEX,UndoEY)); DrawFocusRect(Rect(UndoSX+10,UndoSY+10,UndoEX-10,UndoEY-10)); DrawFocusRect(Rect(StartX,StartY,EndX,EndY)); DrawFocusRect(Rect(StartX+10,StartY+10,EndX-10,EndY-10));//Pen.Mode := pmNotXor; lblHightlight.Caption := IntToStr(EndX-StartX)+'x'+IntToStr(EndY-StartY); UndoSX:=StartX; UndoSY:=StartY; UndoEX:=EndX; UndoEY:=EndY; end; end; if gboxPaint.Visible then begin with Image.Picture.Bitmap.Canvas do begin Brush.Style:= bsClear; Pen.Width := StrToInt(ComboBoxWidth.Text); Pen.Color := ColorBoxPaint.Selected; Pen.Style := psSolid; tmp:= Pen.Width+10; if ComboBoxPaint.text='Pen' then LineTo (x,y) else begin if (startX>x) and (startYy) then CopyRect (Rect(UndoSX-tmp,UndoSY+tmp,UndoEX+tmp,UndoEY-tmp), tmp_all.canvas,Rect(UndoSX-tmp,UndoSY+tmp,UndoEX+tmp,UndoEY-tmp)); if (startX>x) and (startY>y) then CopyRect (Rect(UndoSX+tmp,UndoSY+tmp,UndoEX-tmp,UndoEY-tmp), tmp_all.canvas,Rect(UndoSX+tmp,UndoSY+tmp,UndoEX-tmp,UndoEY-tmp)) else CopyRect (Rect(UndoSX-tmp,UndoSY-tmp,UndoEX+tmp,UndoEY+tmp), tmp_all.canvas,Rect(UndoSX-tmp,UndoSY-tmp,UndoEX+tmp,UndoEY+tmp));//UndoTmp; if ComboBoxPaint.text='Rect' then Rectangle(Rect(StartX,StartY,X,Y))else Ellipse(StartX,StartY,X,Y); end; UndoSX:=StartX; UndoSY:=StartY; UndoEX:=X; UndoEY:=Y; end; end; if not (gboxHightlight.Visible) and not (gboxPaint.Visible) then begin sboxImage.VertScrollBar.Position:=sboxImage.VertScrollBar.Position+tmpY-y; sboxImage.HorzScrollBar.Position:=sboxImage.HorzScrollBar.Position+tmpX-x; end; end; end; procedure TfrmViewer.ImageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin X:=round(X*Image.Picture.Width/Image.Width); // for correct paint after zoom Y:=round(Y*Image.Picture.Height/Image.Height); MDFlag:=false; if PanelEditImage.Visible then begin if (button = mbLeft) and gboxHightlight.Visible then begin UndoTmp; CheckXY; with Image.Picture.Bitmap.Canvas do begin Brush.Style := bsClear; Pen.Style := psDot; Pen.Color := clHighlight; DrawFocusRect(Rect(StartX,StartY,EndX,EndY)); DrawFocusRect(Rect(StartX+10,StartY+10,EndX-10,EndY-10)); lblHightlight.Caption := IntToStr(EndX-StartX)+'x'+IntToStr(EndY-StartY); end; end; end; Image.Cursor:=crDefault; end; procedure TfrmViewer.CreatePreview(FullPathToFile: String; index: integer; delete: Boolean = false); var bmpThumb : TBitmap = nil; begin if pnlPreview.Visible or delete then begin if not Assigned(FThumbnailManager) then FThumbnailManager:= TThumbnailManager.Create(DrawPreview.Canvas.Brush.Color); if delete then begin FThumbnailManager.RemovePreview(FullPathToFile); // delete thumb if need if pnlPreview.Visible then FBitmapList.Delete(index); end else begin bmpThumb:= FThumbnailManager.CreatePreview(FullPathToFile); // Insert to the BitmapList FBitmapList.Insert(index, bmpThumb); end; end; end; procedure TfrmViewer.miPreviewClick(Sender: TObject); var i: integer; begin miPreview.Checked:= not (miPreview.Checked); pnlPreview.Visible := miPreview.Checked; Splitter.Visible := pnlPreview.Visible; if not pnlPreview.Visible then FBitmapList.Clear; Application.ProcessMessages; if miPreview.Checked then begin for i:=0 to FileList.Count-1 do CreatePreview(FileList.Strings[i], i); DrawPreview.FixedRows:= 0; DrawPreview.FixedCols:= 0; DrawPreview.Refresh; end; if bPlugin then WlxPlugins.GetWlxModule(ActivePlugin).ResizeWindow(GetListerRect); end; procedure TfrmViewer.miSaveAsClick(Sender: TObject); begin FModSizeDialog:= TfrmModView.Create(Application); try FModSizeDialog.pnlSize.Visible:=false; FModSizeDialog.pnlCopyMoveFile.Visible :=false; FModSizeDialog.pnlQuality.Visible:=true; FModSizeDialog.Caption:='Type of Image'; if FModSizeDialog.ShowModal = mrOk then begin if StrToInt(FModSizeDialog.teQuality.Text)<=100 then SaveImageAs(FModSizeDialog.sExt,false,StrToInt(FModSizeDialog.teQuality.Text)) else msgError('Bad Quality'); end finally FreeAndNil(FModSizeDialog); end; end; procedure TfrmViewer.miSaveClick(Sender: TObject); var sExt: String; begin DrawPreview.BeginUpdate; try CreatePreview(FileList.Strings[iActiveFile], iActiveFile, True); sExt:= ExtractFileExt(FileList.Strings[iActiveFile]); SaveImageAs(sExt, True, 80); CreatePreview(FileList.Strings[iActiveFile], iActiveFile); finally DrawPreview.EndUpdate; end; end; procedure TfrmViewer.miFullScreenClick(Sender: TObject); begin miFullScreen.Checked:= not (miFullScreen.Checked); if miFullScreen.Checked then begin WindowState:= wsMaximized; BorderStyle:= bsNone; MainMenu.Items.Visible:=false; gboxPaint.Visible:= false; gboxHightlight.Visible:=false; miStretch.Checked:= miFullScreen.Checked; if miPreview.Checked then miPreviewClick(Sender); end else begin WindowState:= wsNormal; BorderStyle:= bsSizeable; //Viewer.MainMenu.Items.Visible:=true; // why it work ??? PanelEditImage.Height:= 50; Height:= Height div 2; Width:= Width div 2; end; if ExtractOnlyFileExt(FileList.Strings[iActiveFile]) <> 'gif' then begin btnHightlight.Visible:=not(miFullScreen.Checked); btnPaint.Visible:=not(miFullScreen.Checked); btnResize.Visible:=not(miFullScreen.Checked); end; sboxImage.HorzScrollBar.Visible:= not(miFullScreen.Checked); sboxImage.VertScrollBar.Visible:= not(miFullScreen.Checked); TimerViewer.Enabled:=miFullScreen.Checked; btnReload.Visible:=not(miFullScreen.Checked); Status.Visible:=not(miFullScreen.Checked); gboxSlideShow.Visible:=miFullScreen.Checked; Image.Stretch:= miFullScreen.Checked; Image.AutoSize:= not Image.Stretch; Image.Proportional:= Image.Stretch; AdjustImageSize; ShowOnTop; end; procedure TfrmViewer.RedEyes; var tmp:TBitMap; x,y,r,g,b: integer; col: TColor; begin if (EndX=StartX) or (EndY=StartY) then Exit; UndoTmp; tmp:=TBitMap.Create; tmp.Width:= EndX-StartX; tmp.Height:= EndY-StartY; for x:=0 to (EndX-StartX) div 2 do begin for y:=0 to (EndY-StartY) div 2 do begin if y100) and (g<100) and (b<100) then r:=b; tmp.Canvas.Pixels[x+(EndX-StartX) div 2,y+(EndY-StartY) div 2]:= rgb(r,g,b); col:=Image.Picture.Bitmap.Canvas.Pixels[StartX-x+(EndX-StartX) div 2,y+StartY+(EndY-StartY) div 2]; r:=GetRValue(col); g:=GetGValue(col); b:=GetBValue(col); if (r>100) and (g<100) and (b<100) then r:=b; tmp.Canvas.Pixels[(EndX-StartX) div 2-x,y+(EndY-StartY) div 2]:= rgb(r,g,b); col:=Image.Picture.Bitmap.Canvas.Pixels[StartX+x+(EndX-StartX) div 2,StartY-y+(EndY-StartY) div 2]; r:=GetRValue(col); g:=GetGValue(col); b:=GetBValue(col); if (r>100) and (g<100) and (b<100) then r:=b; tmp.Canvas.Pixels[(EndX-StartX) div 2+x,(EndY-StartY) div 2-y]:= rgb(r,g,b); col:=Image.Picture.Bitmap.Canvas.Pixels[StartX-x+(EndX-StartX) div 2,StartY-y+(EndY-StartY) div 2]; r:=GetRValue(col); g:=GetGValue(col); b:=GetBValue(col); if (r>100) and (g<100) and (b<100) then r:=b; tmp.Canvas.Pixels[(EndX-StartX) div 2-x,(EndY-StartY) div 2-y]:= rgb(r,g,b); end else begin col:=Image.Picture.Bitmap.Canvas.Pixels[x+StartX+(EndX-StartX) div 2,y+StartY+(EndY-StartY) div 2]; tmp.Canvas.Pixels[x+(EndX-StartX) div 2,y+(EndY-StartY) div 2]:= col; col:=Image.Picture.Bitmap.Canvas.Pixels[StartX-x+(EndX-StartX) div 2,y+StartY+(EndY-StartY) div 2]; tmp.Canvas.Pixels[(EndX-StartX) div 2-x,y+(EndY-StartY) div 2]:= col; col:=Image.Picture.Bitmap.Canvas.Pixels[StartX+x+(EndX-StartX) div 2,StartY-y+(EndY-StartY) div 2]; tmp.Canvas.Pixels[(EndX-StartX) div 2+x,(EndY-StartY) div 2-y]:= col; col:=Image.Picture.Bitmap.Canvas.Pixels[StartX-x+(EndX-StartX) div 2,StartY-y+(EndY-StartY) div 2]; tmp.Canvas.Pixels[(EndX-StartX) div 2-x,(EndY-StartY) div 2-y]:= col; end; end; end; Image.Picture.Bitmap.Canvas.Draw (StartX,StartY,tmp); CreateTmp; tmp.Free; end; procedure TfrmViewer.CutToImage; begin UndoTmp; Image.Picture.Bitmap.Canvas.CopyRect(rect(0,0,EndX-StartX,EndY-StartY), Image.Picture.Bitmap.Canvas, rect(startX,StartY,EndX,EndY)); Image.Picture.Bitmap.SetSize (EndX-StartX,EndY-StartY); CreateTmp; StartX:=0;StartY:=0;EndX:=0;EndY:=0; end; procedure TfrmViewer.UndoTmp; begin Image.Picture.Bitmap.Canvas.Clear; Image.Picture.Bitmap.Canvas.Draw(0,0,tmp_all); end; procedure TfrmViewer.CreateTmp; begin tmp_all.Free; tmp_all:= TBitmap.Create; tmp_all.Assign(Image.Picture.Graphic); end; procedure TfrmViewer.CheckXY; var tmp: integer; begin if EndX0 then DrawPreview.ColCount:= DrawPreview.Width div (DrawPreview.DefaultColWidth + 6); if FileList.Count mod DrawPreview.ColCount > 0 then DrawPreview.RowCount:= FileList.Count div DrawPreview.ColCount + 1 else DrawPreview.RowCount:= FileList.Count div DrawPreview.ColCount; if bPlugin then WlxPlugins.GetWlxModule(ActivePlugin).ResizeWindow(GetListerRect); end; procedure TfrmViewer.DrawPreviewDrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); var i,z,t, X, Y: Integer; sExt, sName, shortName: UTF8String; bmpThumb: TBitmap; begin aRect:= Classes.Rect(aRect.Left + 2, aRect.Top + 2, aRect.Right - 2, aRect.Bottom - 2); i:= (aRow * DrawPreview.ColCount) + aCol; // Calculate FileList index if (i >= 0) and (i < FileList.Count) then begin sName:= ExtractOnlyFileName(FileList.Strings[i]); sExt:= ExtractFileExt(FileList.Strings[i]); DrawPreview.Canvas.FillRect(aRect); // Clear cell if (i >= 0) and (i < FBitmapList.Count) then begin bmpThumb:= FBitmapList[i]; z:= DrawPreview.Canvas.TextHeight('Pp') + 4; X:= aRect.Left + (aRect.Right - aRect.Left - bmpThumb.Width) div 2; Y:= aRect.Top + (aRect.Bottom - aRect.Top - bmpThumb.Height - z) div 2; // Draw thumbnail at center DrawPreview.Canvas.Draw(X, Y, bmpThumb); end; z:= (DrawPreview.Width - DrawPreview.ColCount * DrawPreview.DefaultColWidth) div DrawPreview.ColCount div 2; if DrawPreview.Canvas.GetTextWidth(sName+sExt) < DrawPreview.DefaultColWidth then begin t:= (DrawPreview.DefaultColWidth-DrawPreview.Canvas.GetTextWidth(sName+sExt)) div 2; DrawPreview.Canvas.TextOut(aRect.Left+z+t, aRect.Top + FThumbSize.cy + 2, sName+sExt); end else begin shortName:= ''; t:= 1; while DrawPreview.Canvas.GetTextWidth(shortName+'...'+sExt) < (DrawPreview.DefaultColWidth-15) do begin shortName:= shortName + sName[t]; Inc(t); end; DrawPreview.Canvas.TextOut(aRect.Left+z, aRect.Top + FThumbSize.cy + 2, shortName+'...'+sExt); end; end; end; procedure TfrmViewer.DrawPreviewSelection(Sender: TObject; aCol, aRow: Integer); var I: Integer; begin gboxHightlight.Visible:= False; gboxPaint.Visible:= False; I:= DrawPreview.Row * DrawPreview.ColCount + DrawPreview.Col; if I < Filelist.Count then LoadNextFile(FileList.Strings[I]); end; procedure TfrmViewer.DrawPreviewTopleftChanged(Sender: TObject); begin DrawPreview.LeftCol:= 0; end; procedure TfrmViewer.TimerViewerTimer(Sender: TObject); begin if (miFullScreen.Checked) and (PanelEditImage.Height>3) then PanelEditImage.Height := PanelEditImage.Height-1; i_timer:=i_timer+1; if (cbSlideShow.Checked) and (i_timer=60*seTimeShow.Value) then begin cm_LoadNextFile([]); i_timer:=0; end; if i_timer=180 then begin sboxImage.Cursor:=crNone; Image.Cursor:=crNone; end; end; procedure TfrmViewer.ViewerControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbRight then pmEditMenu.PopUp(); end; procedure TfrmViewer.frmViewerClose(Sender: TObject; var CloseAction: TCloseAction); begin CloseAction:=caFree; gImageStretch:= miStretch.Checked; gPreviewVisible := miPreview.Checked; gImagePaintMode := ComboBoxPaint.text; gImagePaintWidth := StrToInt(ComboBoxWidth.Text) ; gImagePaintColor := ColorBoxPaint.Selected; gTextPosition := ViewerControl.Position; case ViewerControl.ViewerMode of vmText: gViewerMode := 1; vmBin : gViewerMode := 2; vmHex : gViewerMode := 3; vmWrap: gViewerMode := 4; vmBook: gViewerMode := 4; end; if Assigned(WlxPlugins) then begin ExitPluginMode; end; end; procedure TfrmViewer.frmViewerKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (not bQuickView) and (Key in [VK_Q, VK_ESCAPE]) then begin Key := 0; Close; Exit; end; if (not (bImage or bAnimation)) then case Key of VK_F: if Shift = [ssCtrl] then begin DoSearch(False, False); Key:= 0; Exit; end; VK_F3: if Shift - [ssShift] = [] then begin DoSearch(True, Shift = [ssShift]); Key:= 0; Exit; end; end; end; procedure TfrmViewer.miExitClick(Sender: TObject); begin Close; end; procedure TfrmViewer.miStretchClick(Sender: TObject); begin miStretch.Checked:= not miStretch.Checked; Image.Stretch:= miStretch.Checked; Image.AutoSize:= not Image.Stretch; Image.Proportional:= Image.Stretch; if gboxHightlight.Visible then UndoTmp; if miStretch.Checked then begin gboxPaint.Visible:=false; gboxHightlight.Visible:=false; gboxView.Visible:=true; end; AdjustImageSize; end; procedure TfrmViewer.miTextClick(Sender: TObject); begin ExitPluginMode; ReopenAsTextIfNeeded; (Sender as TMenuItem).Checked:= True; if Sender = miText then ViewerControl.ViewerMode := vmText else if Sender = miBin then ViewerControl.ViewerMode := vmBin else if Sender = miHex then ViewerControl.ViewerMode := vmHex else if Sender = miWrapText then ViewerControl.ViewerMode := vmWrap; if Sender = miLookBook then begin with ViewerControl do begin ViewerMode := vmBook; Color:= gBookBackgroundColor; Font.Color:= gBookFontColor; Font.Quality:= fqAntialiased; ColCount:= gColCount; Position:= gTextPosition; end; FontOptionsToFont(gFonts[dcfViewerBook], ViewerControl.Font); end else begin with ViewerControl do begin Color:= clWindow; Font.Color:= clWindowText; Font.Quality:= fqDefault; ColCount:= 1; end; FontOptionsToFont(gFonts[dcfViewer], ViewerControl.Font); end; end; procedure TfrmViewer.miAbout2Click(Sender: TObject); begin MsgOK(rsViewAboutText); end; procedure TfrmViewer.miSearchClick(Sender: TObject); begin FLastSearchPos := -1; DoSearch(False, False); end; procedure TfrmViewer.FormCreate(Sender: TObject); var HMViewer: THMForm; begin if not bQuickView then InitPropStorage(Self); HMViewer := HotMan.Register(Self, HotkeysCategory); HMViewer.RegisterActionList(actionList); ViewerControl.OnGuessEncoding:= @DetectEncoding; FontOptionsToFont(gFonts[dcfViewer], ViewerControl.Font); FileList := TStringList.Create; WlxPlugins:=TWLXModuleList.Create; WlxPlugins.Assign(gWLXPlugins); DCDebug('WLX: Load - OK'); FFindDialog:=nil; // dialog is created in first use sboxImage.DoubleBuffered := True; miStretch.Checked := gImageStretch; miPreview.Checked := gPreviewVisible; ComboBoxPaint.Text := gImagePaintMode; ComboBoxWidth.Text := IntToStr(gImagePaintWidth); ColorBoxPaint.Selected := gImagePaintColor; FThumbSize := gThumbSize; DrawPreview.DefaultColWidth := FThumbSize.cx + 4; DrawPreview.DefaultRowHeight := FThumbSize.cy + DrawPreview.Canvas.TextHeight('Pp') + 6; MakeTextEncodingsMenu; Status.Panels[sbpFileNr].Alignment := taRightJustify; Status.Panels[sbpPosition].Alignment := taRightJustify; Status.Panels[sbpFileSize].Alignment := taRightJustify; ViewerPositionChanged(Self); FixFormIcon(Handle); end; procedure TfrmViewer.btnCutTuImageClick(Sender: TObject); begin CutToImage; end; procedure TfrmViewer.btnDeleteFileClick(Sender: TObject); begin if msgYesNo(Format(rsMsgDelSel, [FileList.Strings[iActiveFile]])) then begin CreatePreview(FileList.Strings[iActiveFile], iActiveFile, true); mbDeleteFile(FileList.Strings[iActiveFile]); FileList.Delete(iActiveFile); LoadFile(iActiveFile); DrawPreview.Repaint; SplitterChangeBounds(Sender); end; end; procedure TfrmViewer.btnCopyMoveFileClick(Sender: TObject); begin FModSizeDialog:= TfrmModView.Create(Application); try FModSizeDialog.pnlQuality.Visible:= False; FModSizeDialog.pnlSize.Visible:= False; FModSizeDialog.pnlCopyMoveFile.Visible:= True; if Sender = btnMoveFile then FModSizeDialog.Caption:= 'Move File' else FModSizeDialog.Caption:= 'Copy File' ; if FModSizeDialog.ShowModal = mrOk then begin if FModSizeDialog.Path = '' then msgError(rsMsgInvalidPath) else begin CopyFile(FileList.Strings[iActiveFile],FModSizeDialog.Path+PathDelim+ExtractFileName(FileList.Strings[iActiveFile])); if (Sender = btnMoveFile) or (Sender = btnMoveFile1) then begin CreatePreview(FileList.Strings[iActiveFile], iActiveFile, true); mbDeleteFile(FileList.Strings[iActiveFile]); FileList.Delete(iActiveFile); LoadFile(iActiveFile); DrawPreview.Repaint; SplitterChangeBounds(Sender); end; end; end; finally FreeAndNil(FModSizeDialog); end; end; procedure TfrmViewer.actExecute(Sender: TObject); var cmd: string; begin cmd := (Sender as TAction).Name; cmd := 'cm_' + Copy(cmd, 4, Length(cmd) - 3); Commands.ExecuteCommand(cmd, []); end; procedure TfrmViewer.btnFullScreenClick(Sender: TObject); begin miFullScreenClick(Sender); end; procedure TfrmViewer.btnGifMoveClick(Sender: TObject); begin GifAnim.Animate:=not GifAnim.Animate; btnNextGifFrame.Enabled:= not GifAnim.Animate; btnPrevGifFrame.Enabled:= not GifAnim.Animate; if GifAnim.Animate then btnGifMove.Caption:='||' else btnGifMove.Caption:='|>'; end; procedure TfrmViewer.btnGifToBmpClick(Sender: TObject); begin GifAnim.Animate:=False; Image.Picture.Bitmap.Create; Image.Picture.Bitmap.Width := GifAnim.Width; Image.Picture.Bitmap.Height := GifAnim.Height; Image.Picture.Bitmap.Canvas.CopyRect(Rect(0,0,GifAnim.Width,GifAnim.Height),GifAnim.Canvas,Rect(0,0,GifAnim.Width,GifAnim.Height)); miSaveAsClick(sender); end; procedure TfrmViewer.btnPaintHightlight(Sender: TObject); var bmp: TCustomBitmap = nil; GraphicClass: TGraphicClass; sExt: String; fsFileStream: TFileStreamEx = nil; begin if not ImgEdit then begin try sExt:= ExtractFileExt(FileList.Strings[iActiveFile]); fsFileStream:= TFileStreamEx.Create(FileList.Strings[iActiveFile], fmOpenRead or fmShareDenyNone); GraphicClass := GetGraphicClassForFileExtension(sExt); if (GraphicClass <> nil) and (GraphicClass.InheritsFrom(TCustomBitmap)) then begin Image.DisableAutoSizing; bmp := TCustomBitmap(GraphicClass.Create); bmp.LoadFromStream(fsFileStream); Image.Picture.Bitmap := TBitmap.Create; Image.Picture.Bitmap.Height:= bmp.Height; Image.Picture.Bitmap.Width:= bmp.Width; Image.Picture.Bitmap.Canvas.Draw(0, 0, bmp); Image.EnableAutoSizing; end; finally FreeThenNil(bmp); FreeThenNil(fsFileStream); end; {miStretch.Checked:= False; Image.Stretch:= miStretch.Checked; Image.Proportional:= Image.Stretch; Image.Autosize:= not(miStretch.Checked); AdjustImageSize; } end; if gboxHightlight.Visible then UndoTmp; if Sender = btnHightlight then begin gboxHightlight.Visible := not (gboxHightlight.Visible); gboxPaint.Visible:= False; end else begin gboxPaint.Visible:= not (gboxPaint.Visible); gboxHightlight.Visible:= False; end; ImgEdit:= True; CreateTmp; end; procedure TfrmViewer.btnPrevGifFrameClick(Sender: TObject); begin GifAnim.Animate:=False; GifAnim.PriorFrame; end; procedure TfrmViewer.btnRedEyeClick(Sender: TObject); begin RedEyes; end; procedure TfrmViewer.btnResizeClick(Sender: TObject); begin FModSizeDialog:= TfrmModView.Create(Application); try FModSizeDialog.pnlQuality.Visible:=false; FModSizeDialog.pnlCopyMoveFile.Visible :=false; FModSizeDialog.pnlSize.Visible:=true; FModSizeDialog.teHeight.Text:= IntToStr(Image.Picture.Bitmap.Height); FModSizeDialog.teWidth.Text := IntToStr(Image.Picture.Bitmap.Width); FModSizeDialog.Caption:= 'New Size'; if FModSizeDialog.ShowModal = mrOk then begin Res(StrToInt(FModSizeDialog.teWidth.Text), StrToInt(FModSizeDialog.teHeight.Text)); AdjustImageSize; end; finally FreeAndNil(FModSizeDialog); end; end; procedure TfrmViewer.btnUndoClick(Sender: TObject); begin UndoTmp; end; procedure TfrmViewer.FormDestroy(Sender: TObject); begin FreeAndNil(FFindDialog); FreeAndNil(FBitmapList); HotMan.UnRegister(Self); end; procedure TfrmViewer.miProcessClick(Sender: TObject); {var sViewCmd:String; sCurrName:String;} begin { DCDebug('TfrmViewer.miProcessClick'); inherited; miEdit.Visible:=True; if not miProcess.Checked then begin // if ViewerControl.DataAccess=dtNothing then ViewerControl.MapFile(FileList.Strings[iActiveFile]); miProcess.Checked:=not miProcess.Checked; end else begin sCurrName:=FileList.Strings[iActiveFile]; sViewCmd:=gExts.GetCommandText(lowercase(ExtractFileExt(sCurrName)),'view'); if (sViewCmd='') then Exit; sViewCmd:=Copy(sViewCmd, pos('=',sViewCmd)+1, length(sViewCmd)); // i known about range, but Copy correct this "bug" sViewCmd:=StringReplace(sViewCmd,'%f',ExtractFileName(sCurrName),[rfReplaceAll]); sViewCmd:=StringReplace(sViewCmd,'%d',ExtractFilePath(sCurrName),[rfReplaceAll]); sViewCmd:=Trim(StringReplace(sViewCmd,'%p',sCurrName,[rfReplaceAll])); ViewerControl.UnMapFile; Status.Panels[2].Text:=IntToStr(ViewerControl.FileSize); Status.Panels[3].Text:=sViewCmd; miProcess.Checked:=not miProcess.Checked; end; } end; procedure TfrmViewer.ReopenAsTextIfNeeded; begin if bImage or bAnimation or bPlugin then begin Image.Picture := nil; ViewerControl.FileName := FileList.Strings[iActiveFile]; ActivatePanel(pnlText); end; end; procedure TfrmViewer.miGraphicsClick(Sender: TObject); begin if CheckGraphics(FileList.Strings[iActiveFile]) then begin ViewerControl.FileName := ''; // unload current file if any is loaded if LoadGraphics(FileList.Strings[iActiveFile]) then ActivatePanel(pnlImage) else begin ViewerControl.FileName := FileList.Strings[iActiveFile]; ActivatePanel(pnlText); end; end; end; procedure TfrmViewer.miCopyToClipboardClick(Sender: TObject); begin if bPlugin then WlxPlugins.GetWLxModule(ActivePlugin).CallListSendCommand(lc_copy, 0) else ViewerControl.CopyToClipboard; end; procedure TfrmViewer.miSelectAllClick(Sender: TObject); begin if bPlugin then WlxPlugins.GetWLxModule(ActivePlugin).CallListSendCommand(lc_selectall, 0) else ViewerControl.SelectAll; end; procedure TfrmViewer.miChangeEncodingClick(Sender: TObject); begin ViewerControl.EncodingName := (Sender as TMenuItem).Caption; Status.Panels[4].Text := rsViewEncoding + ': ' + ViewerControl.EncodingName; end; function TfrmViewer.CheckGraphics(const sFileName:String):Boolean; var sExt: String; {$IFDEF LCLGTK2} fsBitmap: TFileStreamEx = nil; {$ENDIF} begin sExt:= LowerCase(ExtractFileExt(sFileName)); {$IFDEF LCLGTK2} // TImage crash on displaying monochrome bitmap on Linux/GTK2 // See details at http://bugs.freepascal.org/view.php?id=12362 if (sExt = '.bmp') then try fsBitmap:= TFileStreamEx.Create(sFileName, fmOpenRead or fmShareDenyNone); // Get the number of bits per pixel from bitmap header fsBitmap.Seek($1C, soFromBeginning); // Don't open monochrome bitmap as image if (fsBitmap.ReadWord = 1) then Exit(False); finally fsBitmap.Free; end; {$ENDIF} Result:= Image.Picture.FindGraphicClassWithFileExt(sExt, False) <> nil; end; // Adjust Image size (width and height) to sboxImage size procedure TfrmViewer.AdjustImageSize; const fmtImageInfo = '%s (%s %%)'; var sResolution: String; iScale: Integer = 0; begin if miStretch.Checked then begin Image.Stretch:=true; Image.AutoSize := true; //if gboxHightlight.Visible or gboxPaint.Visible then Image.Center:=false else Image.Center:=true; Image.Center:=true; if (Image.Picture.Width > sboxImage.ClientWidth) or (Image.Picture.Height > sboxImage.ClientHeight) then begin Image.Left:= 0; Image.Top:= 0; Image.AutoSize := false; Image.Width:= sboxImage.ClientWidth; Image.Height:= sboxImage.ClientHeight; sboxImage.HorzScrollBar.Visible:=false; sboxImage.VertScrollBar.Visible:=false; // show image resolution and scale if Image.Picture.Width < Image.Width then begin iScale:= 100*(Image.Picture.Width * Image.ClientHeight) div (Image.Picture.Width* Image.Picture.Height); sResolution:= IntToStr(Image.Picture.Width) + 'x' + IntToStr(Image.Height); end; if Image.Picture.Height < Image.Height then begin iScale:= 100*(Image.ClientWidth * Image.Picture.Height) div (Image.Picture.Width* Image.Picture.Height); sResolution:= IntToStr(Image.Width) + 'x' + IntToStr(Image.Picture.Height); end; if (Image.Picture.Width >= Image.Width) and (Image.Picture.Height >= Image.Height) then begin iScale:= 100*(Image.Width * Image.Height) div (Image.Picture.Width* Image.Picture.Height); sResolution:= IntToStr(Image.Width) + 'x' + IntToStr(Image.Height); end; Status.Panels[sbpCurrentResolution].Text:= Format(fmtImageInfo, [sResolution, IntToStr(iScale)]); sResolution:= IntToStr(Image.Picture.Width) + 'x' + IntToStr(Image.Picture.Height); Status.Panels[sbpFullResolution].Text:= Format(fmtImageInfo, [sResolution, '100']); end else begin Image.Left:= (sboxImage.ClientWidth-Image.Picture.Width) div 2; //move image to center Image.Top:= (sboxImage.ClientHeight-Image.Picture.Height) div 2; sResolution:= IntToStr(Image.Picture.Width) + 'x' + IntToStr(Image.Picture.Height); Status.Panels[sbpCurrentResolution].Text:= Format(fmtImageInfo, [sResolution, '100']); Status.Panels[sbpFullResolution].Text:= Status.Panels[2].Text; end; end else begin // show image resolution and scale Image.Left:= 0; Image.Top:= 0; if (Image.Picture.Width <> 0) and (Image.Picture.Height <> 0) then iScale:= 100 * (Image.Width * Image.Height) div (Image.Picture.Width * Image.Picture.Height); sResolution:= IntToStr(Image.Width) + 'x' + IntToStr(Image.Height); Status.Panels[sbpCurrentResolution].Text:= Format(fmtImageInfo, [sResolution, IntToStr(iScale)]); sResolution:= IntToStr(Image.Picture.Width) + 'x' + IntToStr(Image.Picture.Height); Status.Panels[sbpFullResolution].Text:= Format(fmtImageInfo, [sResolution, '100']); end; end; // Try to rotate image procedure TfrmViewer.miRotateClick(Sender: TObject); var x, y: Integer; xWidth, yHeight: Integer; SourceImg: TLazIntfImage = nil; TargetImg: TLazIntfImage = nil; begin TargetImg:= TLazIntfImage.Create(0, 0); SourceImg:= Image.Picture.Bitmap.CreateIntfImage; TargetImg.DataDescription:= SourceImg.DataDescription; // use the same image format xWidth:= Image.Picture.Bitmap.Width - 1; yHeight:= Image.Picture.Bitmap.Height - 1; if Sender = mi180 then begin TargetImg.SetSize(xWidth + 1, yHeight + 1); for y:= 0 to yHeight do begin for x:= 0 to xWidth do begin TargetImg.Colors[x, y]:= SourceImg.Colors[xWidth - x, yHeight - y]; end; end; end; if (Sender = mi270) or (Sender =btn270)then begin TargetImg.SetSize(yHeight + 1, xWidth + 1); for y:= 0 to xWidth do begin for x:= 0 to yHeight do begin TargetImg.Colors[x, y]:= SourceImg.Colors[xWidth - y, x]; end; end; x:= Image.Width; Image.Width:= Image.Height; Image.Height:= x; end; if (Sender = mi90) or (Sender=btn90) then begin TargetImg.SetSize(yHeight + 1, xWidth + 1); for y:= 0 to xWidth do begin for x:= 0 to yHeight do begin TargetImg.Colors[x, y]:= SourceImg.Colors[y, yHeight - x]; end; end; x:= Image.Width; Image.Width:= Image.Height; Image.Height:= x; end; if (Sender = miMirror) or (Sender = btnMirror)then begin TargetImg.SetSize(xWidth + 1, yHeight + 1); for y:= 0 to yHeight do begin for x:= 0 to xWidth do begin TargetImg.Colors[x, y]:= SourceImg.Colors[xWidth - x, y]; end; end; end; Image.Picture.Bitmap.LoadFromIntfImage(TargetImg); FreeThenNil(SourceImg); FreeThenNil(TargetImg); AdjustImageSize; CreateTmp; end; function TfrmViewer.GetListerRect: TRect; begin Result:= ClientRect; Dec(Result.Bottom, Status.Height); if Splitter.Visible then begin Inc(Result.Left, Splitter.Left + Splitter.Width); end; end; procedure TfrmViewer.miScreenShotClick(Sender: TObject); var ScreenDC: HDC; bmp: TCustomBitmap; begin Visible:= False; Application.ProcessMessages; // Hide viewer window bmp := TBitmap.Create; ScreenDC := GetDC(0); bmp.LoadFromDevice(ScreenDC); ReleaseDC(0, ScreenDC); Image.Picture.Bitmap.Height:= bmp.Height; Image.Picture.Bitmap.Width:= bmp.Width; Image.Picture.Bitmap.Canvas.Draw(0, 0, bmp); CreateTmp; bmp.Free; Visible:= True; ImgEdit:= True; end; function TfrmViewer.LoadGraphics(const sFileName:String): Boolean; var sExt: String; fsFileHandle: System.THandle; fsFileStream: TFileStreamEx = nil; gifHeader: array[0..5] of AnsiChar; begin sExt:= ExtractOnlyFileExt(sFilename); if SameText(sExt, 'gif') then begin fsFileHandle:= mbFileOpen(sFileName, fmOpenRead or fmShareDenyNone); if (fsFileHandle = feInvalidHandle) then Exit(False); FileRead(fsFileHandle, gifHeader, SizeOf(gifHeader)); FileClose(fsFileHandle); end; // GifAnim supports only GIF89a if gifHeader <> 'GIF89a' then begin Image.Visible:= True; GifAnim.Visible:= False; try fsFileStream:= TFileStreamEx.Create(sFileName, fmOpenRead or fmShareDenyNone); try Image.Picture.LoadFromStreamWithFileExt(fsFileStream, sExt); btnHightlight.Visible:= True; btnPaint.Visible:= True; btnResize.Visible:= True; miImage.Visible:= True; btnZoomIn.Visible:= True; btnZoomOut.Visible:= True; btn270.Visible:= True; btn90.Visible:= True; btnMirror.Visible:= True; btnGifMove.Visible:= False; btnGifToBmp.Visible:= False; btnNextGifFrame.Visible:= False; btnPrevGifFrame.Visible:= False; finally FreeAndNil(fsFileStream); end; miStretch.Checked:= not miStretch.Checked; miStretchClick(nil); except Exit(False); end; end else begin GifAnim.Visible:= True; Image.Visible:= False; try GifAnim.FileName:= UTF8ToSys(sFileName); btnHightlight.Visible:= False; btnPaint.Visible:= False; btnResize.Visible:= False; miImage.Visible:= False; btnZoomIn.Visible:= False; btnZoomOut.Visible:= False; btn270.Visible:= False; btn90.Visible:= False; btnMirror.Visible:= False; btnGifMove.Visible:= True; btnGifToBmp.Visible:= True; btnNextGifFrame.Visible:= True; btnPrevGifFrame.Visible:= True; except Exit(False); end; end; ImgEdit:= False; end; procedure TfrmViewer.DoSearch(bQuickSearch: Boolean; bSearchBackwards: Boolean); var PAdr: PChar; iSizeData: Integer; sSearchTextU: UTF8String; sSearchTextA: AnsiString; begin // in first use create dialog if not Assigned(FFindDialog) then FFindDialog:= TfrmFindView.Create(Application); if (bQuickSearch and gFirstTextSearch) or not bQuickSearch then begin if bPlugin then begin // if plugin has specific search dialog if WlxPlugins.GetWLxModule(ActivePlugin).CallListSearchDialog(0) = LISTPLUGIN_OK then Exit; end; // Load search history FFindDialog.cbDataToFind.Items.Assign(glsSearchHistory); if FFindDialog.ShowModal <> mrOK then Exit; if FFindDialog.cbDataToFind.Text = '' then Exit; sSearchTextU:= FFindDialog.cbDataToFind.Text; // Save search history glsSearchHistory.Assign(FFindDialog.cbDataToFind.Items); gFirstTextSearch:= False; end else begin if bPlugin then begin // if plugin has specific search dialog if WlxPlugins.GetWLxModule(ActivePlugin).CallListSearchDialog(1) = LISTPLUGIN_OK then Exit; end; if glsSearchHistory.Count > 0 then sSearchTextU:= glsSearchHistory[0]; end; if bPlugin then begin iSizeData:= 0; if FFindDialog.cbCaseSens.Checked then iSizeData:= lcs_matchcase; WlxPlugins.GetWLxModule(ActivePlugin).CallListSearchText(sSearchTextU, iSizeData); end else begin // Choose search start position. if not bSearchBackwards then begin if FLastSearchPos = -1 then FLastSearchPos := 0 else if FLastSearchPos < ViewerControl.FileSize - 1 then FLastSearchPos := FLastSearchPos + 1; end else begin if FLastSearchPos = -1 then FLastSearchPos := ViewerControl.FileSize - 1 else if FLastSearchPos > 0 then FLastSearchPos := FLastSearchPos - 1; end; sSearchTextA:= ViewerControl.ConvertFromUTF8(sSearchTextU); PAdr := PosMem(ViewerControl.GetDataAdr, ViewerControl.FileSize, FLastSearchPos, sSearchTextA, FFindDialog.cbCaseSens.Checked, bSearchBackwards); if (PAdr <> Pointer(-1)) then begin FLastSearchPos := PAdr - ViewerControl.GetDataAdr; // Text found, show it in ViewerControl if not visible ViewerControl.MakeVisible(FLastSearchPos); // Select found text. ViewerControl.SelectText(FLastSearchPos, FLastSearchPos + Length(sSearchTextA)); end else begin msgOK(Format(rsViewNotFound, ['"' + sSearchTextU + '"'])); FLastSearchPos := -1; end; end; end; procedure TfrmViewer.MakeTextEncodingsMenu; var I: Integer; mi: TMenuItem; EncodingsList: TStringList; begin miEncoding.Clear; EncodingsList := TStringList.Create; try ViewerControl.GetSupportedEncodings(EncodingsList); for I:= 0 to EncodingsList.Count - 1 do begin mi:= TMenuItem.Create(miEncoding); mi.Caption:= EncodingsList[I]; mi.AutoCheck:= True; mi.RadioItem:= True; mi.GroupIndex:= 1; mi.OnClick:= @miChangeEncodingClick; if ViewerControl.EncodingName = EncodingsList[I] then mi.Checked := True; miEncoding.Add(mi); end; finally FreeAndNil(EncodingsList); end; end; procedure TfrmViewer.ViewerPositionChanged(Sender:TObject); begin if ViewerControl.FileSize > 0 then begin Status.Panels[sbpPosition].Text := cnvFormatFileSize(ViewerControl.Position) + ' (' + IntToStr(ViewerControl.Percent) + ' %)'; end else Status.Panels[sbpPosition].Text:= cnvFormatFileSize(0) + ' (0 %)'; end; procedure TfrmViewer.ActivatePanel(Panel: TPanel); begin pnlFolder.Hide; pnlImage.Hide; pnlText.Hide; if Assigned(Panel) then Panel.Visible := True; bAnimation := (GifAnim.Visible); bImage := (Panel = pnlImage) and (bAnimation = False); bPlugin := (Panel = nil); miPlugins.Checked := (Panel = nil); miGraphics.Checked := (Panel = pnlImage); miEncoding.Visible := (Panel = pnlText); miEdit.Visible := (Panel = pnlText) or (Panel = nil); miImage.Visible := bImage; miSave.Visible := bImage; miSaveAs.Visible := bImage; if Panel = nil then begin Status.Panels[sbpPluginName].Text:= WlxPlugins.GetWLxModule(ActivePlugin).Name; end else if Panel = pnlText then begin if (not bQuickView) and CanFocus and ViewerControl.CanFocus then ViewerControl.SetFocus; case ViewerControl.ViewerMode of vmText: miText.Checked := True; vmWrap: miWrapText.Checked := True; vmBin: miBin.Checked := True; vmHex: miHex.Checked := True; vmBook: miLookBook.Checked := True; end; Status.Panels[sbpFileSize].Text:= cnvFormatFileSize(ViewerControl.FileSize) + ' (100 %)'; Status.Panels[sbpTextEncoding].Text := rsViewEncoding + ': ' + ViewerControl.EncodingName; end else if Panel = pnlImage then begin PanelEditImage.Visible:= not bQuickView; end; end; // Commands for hotkey manager {$IF FPC_FULLVERSION < 020501} function TfrmViewer.ExecuteCommand(Command: string; const Params: array of string): TCommandFuncResult; begin Result := FCommands.ExecuteCommand(Command, Params); end; function TfrmViewer.GetCommandCaption(Command: String; CaptionType: TCommandCaptionType): String; begin Result := FCommands.GetCommandCaption(Command, CaptionType); end; procedure TfrmViewer.GetCommandsList(List: TStrings); begin FCommands.GetCommandsList(List); end; {$ENDIF} procedure TfrmViewer.cm_About(const Params: array of string); begin miAbout2Click(Self); end; procedure TfrmViewer.cm_Reload(const Params: array of string); begin LoadFile(iActiveFile); end; procedure TfrmViewer.cm_LoadNextFile(const Params: array of string); var I: Integer; begin I:= iActiveFile + 1; if I >= FileList.Count then I:= 0; if bPlugin then begin if WlxPlugins.GetWlxModule(ActivePlugin).CallListLoadNext(Self.Handle, FileList[I], 0) <> LISTPLUGIN_ERROR then Exit; end; ExitPluginMode; if pnlPreview.Visible then begin if DrawPreview.Col = DrawPreview.ColCount-1 then begin DrawPreview.Col:=0; DrawPreview.Row:= DrawPreview.Row+1; end else DrawPreview.Col:=DrawPreview.Col+1 end else LoadFile(I); end; procedure TfrmViewer.cm_LoadPrevFile(const Params: array of string); var I: Integer; begin I:= iActiveFile - 1; if I < 0 then I:= FileList.Count - 1; if bPlugin then begin if WlxPlugins.GetWlxModule(ActivePlugin).CallListLoadNext(Self.Handle, FileList[I], 0) <> LISTPLUGIN_ERROR then Exit; end; if pnlPreview.Visible then begin if DrawPreview.Col = 0 then begin DrawPreview.Col:=DrawPreview.ColCount-1; DrawPreview.Row:= DrawPreview.Row-1; end else DrawPreview.Col:=DrawPreview.Col-1 end else LoadFile(I); end; procedure TfrmViewer.cm_MoveFile(const Params: array of string); begin btnCopyMoveFileClick(btnMoveFile); end; procedure TfrmViewer.cm_CopyFile(const Params: array of string); begin btnCopyMoveFileClick(Self); end; procedure TfrmViewer.cm_DeleteFile(const Params: array of string); begin btnDeleteFileClick(Self); end; procedure TfrmViewer.cm_StretchImage(const Params: array of string); begin if bImage then miStretchClick(Self); end; procedure TfrmViewer.cm_SaveAs(const Params: array of string); begin if bAnimation or bImage then miSaveAsClick(Self); end; procedure TfrmViewer.cm_Rotate90(const Params: array of string); begin if bImage then miRotateClick(mi90); end; procedure TfrmViewer.cm_Rotate180(const Params: array of string); begin if bImage then miRotateClick(mi180); end; procedure TfrmViewer.cm_Rotate270(const Params: array of string); begin if bImage then miRotateClick(mi270); end; procedure TfrmViewer.cm_Mirror(const Params: array of string); begin if bImage then miRotateClick(miMirror); end; initialization TFormCommands.RegisterCommandsForm(TfrmViewer, HotkeysCategory, @rsHotkeyCategoryViewer); end. doublecmd-0.5.8/src/dmcommondata.pas0000644000175000017500000000063211740433676016461 0ustar alexxalexxunit dmCommonData; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, Dialogs; type { TdmComData } TdmComData = class(TDataModule) ImageList: TImageList; OpenDialog: TOpenDialog; SaveDialog: TSaveDialog; private { private declarations } public { public declarations } end; var dmComData: TdmComData; implementation {$R *.lfm} end. doublecmd-0.5.8/src/fFindDlg.lfm0000644000175000017500000011764212045446211015464 0ustar alexxalexxobject frmFindDlg: TfrmFindDlg Left = 257 Height = 397 Top = 89 Width = 839 Caption = 'Find files' ClientHeight = 397 ClientWidth = 839 Constraints.MinHeight = 360 Constraints.MinWidth = 585 KeyPreview = True OnClose = frmFindDlgClose OnCloseQuery = FormCloseQuery OnCreate = FormCreate OnDestroy = FormDestroy OnKeyDown = FormKeyDown OnShow = frmFindDlgShow Position = poScreenCenter SessionProperties = 'Height;Left;Top;Width;WindowState' ShowInTaskBar = stAlways LCLVersion = '1.0.1.3' object pnlFindFile: TPanel Left = 3 Height = 391 Top = 3 Width = 833 Align = alClient BorderSpacing.Around = 3 BevelOuter = bvNone ClientHeight = 391 ClientWidth = 833 TabOrder = 0 object pgcSearch: TPageControl Left = 0 Height = 391 Top = 0 Width = 727 ActivePage = tsStandard Align = alClient TabIndex = 0 TabOrder = 0 OnChange = pgcSearchChange object tsStandard: TTabSheet Caption = 'Standard' ChildSizing.LeftRightSpacing = 3 ChildSizing.TopBottomSpacing = 3 ClientHeight = 365 ClientWidth = 719 object gbDirectories: TGroupBox AnchorSideLeft.Control = tsStandard AnchorSideTop.Control = tsStandard AnchorSideRight.Control = tsStandard AnchorSideRight.Side = asrBottom Left = 3 Height = 110 Top = 3 Width = 713 Anchors = [akTop, akLeft, akRight] AutoSize = True Caption = 'Directories' ChildSizing.LeftRightSpacing = 5 ClientHeight = 92 ClientWidth = 709 TabOrder = 0 OnResize = gbDirectoriesResize object lblFindPathStart: TLabel AnchorSideLeft.Control = gbDirectories AnchorSideBottom.Control = cbFollowSymLinks AnchorSideBottom.Side = asrBottom Left = 5 Height = 14 Top = 3 Width = 82 Anchors = [akLeft, akBottom] Caption = 'Start in &directory' FocusControl = edtFindPathStart ParentColor = False end object cbFollowSymLinks: TCheckBox AnchorSideTop.Control = gbDirectories AnchorSideRight.Control = gbDirectories AnchorSideRight.Side = asrBottom Left = 612 Height = 17 Top = 0 Width = 92 Anchors = [akTop, akRight] Caption = 'Follow s&ymlinks' TabOrder = 0 end object edtFindPathStart: TDirectoryEdit AnchorSideLeft.Control = lblFindPathStart AnchorSideTop.Control = cbFollowSymLinks AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 5 Height = 21 Top = 17 Width = 673 ShowHidden = False ButtonWidth = 23 NumGlyphs = 1 Anchors = [akTop, akLeft, akRight] MaxLength = 0 TabOrder = 1 end object lblExcludeDirectories: TLabel AnchorSideLeft.Control = edtFindPathStart AnchorSideTop.Control = edtFindPathStart AnchorSideTop.Side = asrBottom Left = 5 Height = 14 Top = 41 Width = 108 BorderSpacing.Top = 3 Caption = 'E&xclude subdirectories' FocusControl = cmbExcludeDirectories ParentColor = False end object cmbExcludeDirectories: TComboBoxWithDelItems AnchorSideLeft.Control = lblExcludeDirectories AnchorSideTop.Control = lblExcludeDirectories AnchorSideTop.Side = asrBottom AnchorSideRight.Control = pnlDirectoriesDepth Left = 5 Height = 21 Hint = 'Enter directories names that should be excluded from search separated with ";"' Top = 55 Width = 494 Anchors = [akTop, akLeft, akRight] BorderSpacing.Right = 5 BorderSpacing.Bottom = 5 ItemHeight = 13 ParentShowHint = False ShowHint = True TabOrder = 2 end object pnlDirectoriesDepth: TPanel AnchorSideTop.Control = lblExcludeDirectories AnchorSideRight.Control = gbDirectories AnchorSideRight.Side = asrBottom Left = 504 Height = 51 Top = 41 Width = 200 Anchors = [akTop, akRight] BevelOuter = bvNone ChildSizing.EnlargeHorizontal = crsHomogenousChildResize ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 51 ClientWidth = 200 TabOrder = 3 object lblSearchDepth: TLabel Left = 0 Height = 14 Top = 0 Width = 200 Caption = 'Search su&bdirectories:' FocusControl = cmbSearchDepth ParentColor = False end object cmbSearchDepth: TComboBox Left = 0 Height = 21 Top = 14 Width = 200 ItemHeight = 13 Style = csDropDownList TabOrder = 0 end end object cbSelectedFiles: TCheckBox AnchorSideTop.Side = asrBottom AnchorSideRight.Control = cbFollowSymLinks AnchorSideBottom.Control = cbFollowSymLinks AnchorSideBottom.Side = asrBottom Left = 449 Height = 17 Top = 0 Width = 157 Anchors = [akRight, akBottom] BorderSpacing.Right = 6 Caption = 'Selected directories and &files' OnChange = cbSelectedFilesChange TabOrder = 4 end end object gbFiles: TGroupBox AnchorSideLeft.Control = tsStandard AnchorSideTop.Control = gbDirectories AnchorSideTop.Side = asrBottom AnchorSideRight.Control = tsStandard AnchorSideRight.Side = asrBottom Left = 3 Height = 99 Top = 113 Width = 713 Anchors = [akTop, akLeft, akRight] AutoSize = True Caption = 'Files' ChildSizing.LeftRightSpacing = 5 ClientHeight = 81 ClientWidth = 709 TabOrder = 1 object lblFindFileMask: TLabel AnchorSideLeft.Control = gbFiles AnchorSideBottom.Control = cbPartialNameSearch AnchorSideBottom.Side = asrBottom Left = 5 Height = 14 Top = 3 Width = 54 Anchors = [akLeft, akBottom] Caption = '&File mask' FocusControl = cmbFindFileMask Font.Style = [fsBold] ParentColor = False ParentFont = False end object cmbFindFileMask: TComboBoxWithDelItems AnchorSideLeft.Control = gbFiles AnchorSideTop.Control = lblFindFileMask AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbFiles AnchorSideRight.Side = asrBottom Left = 5 Height = 21 Hint = 'Enter files names separated with ";"' Top = 17 Width = 699 Anchors = [akTop, akLeft, akRight] ItemHeight = 13 ParentShowHint = False ShowHint = True TabOrder = 0 Text = '*' end object lblExcludeFiles: TLabel AnchorSideLeft.Control = cmbFindFileMask AnchorSideTop.Control = cmbFindFileMask AnchorSideTop.Side = asrBottom Left = 5 Height = 14 Top = 41 Width = 60 BorderSpacing.Top = 3 Caption = '&Exclude files' FocusControl = cmbExcludeFiles ParentColor = False end object cmbExcludeFiles: TComboBoxWithDelItems AnchorSideLeft.Control = gbFiles AnchorSideTop.Control = lblExcludeFiles AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbFiles AnchorSideRight.Side = asrBottom Left = 5 Height = 21 Hint = 'Enter files names that should be excluded from search separated with ";"' Top = 55 Width = 699 Anchors = [akTop, akLeft, akRight] BorderSpacing.Bottom = 5 ItemHeight = 13 ParentShowHint = False ShowHint = True TabOrder = 1 end object cbPartialNameSearch: TCheckBox AnchorSideRight.Control = cbRegExp AnchorSideBottom.Control = cbRegExp AnchorSideBottom.Side = asrBottom Left = 434 Height = 17 Top = 0 Width = 152 Anchors = [akRight, akBottom] BorderSpacing.Right = 6 Caption = 'Searc&h for part of file name' Checked = True OnChange = cbPartialNameSearchChange State = cbChecked TabOrder = 2 end object cbRegExp: TCheckBox AnchorSideTop.Control = gbFiles AnchorSideRight.Control = gbFiles AnchorSideRight.Side = asrBottom Left = 592 Height = 17 Top = 0 Width = 112 Anchors = [akTop, akRight] Caption = '&Regular expression' OnChange = cbRegExpChange TabOrder = 3 end end object gbFindData: TGroupBox AnchorSideLeft.Control = tsStandard AnchorSideTop.Control = gbFiles AnchorSideTop.Side = asrBottom AnchorSideRight.Control = tsStandard AnchorSideRight.Side = asrBottom Left = 3 Height = 113 Top = 212 Width = 713 Anchors = [akTop, akLeft, akRight] AutoSize = True Caption = 'Find Data' ChildSizing.TopBottomSpacing = 2 ClientHeight = 95 ClientWidth = 709 TabOrder = 2 object lblEncoding: TLabel AnchorSideLeft.Control = gbFindData AnchorSideTop.Control = cmbEncoding AnchorSideTop.Side = asrCenter AnchorSideRight.Control = CheksPanel AnchorSideRight.Side = asrBottom Left = 6 Height = 14 Top = 74 Width = 48 BorderSpacing.Left = 6 BorderSpacing.Top = 6 BorderSpacing.Right = 6 Caption = 'Encodin&g:' FocusControl = cmbEncoding ParentColor = False end object cbCaseSens: TCheckBox AnchorSideLeft.Control = cbNotContainingText AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cbNotContainingText AnchorSideTop.Side = asrCenter Left = 222 Height = 17 Top = 51 Width = 89 BorderSpacing.Left = 36 BorderSpacing.Top = 4 BorderSpacing.Bottom = 8 Caption = 'Case sens&itive' TabOrder = 4 end object cbNotContainingText: TCheckBox AnchorSideLeft.Control = lblEncoding AnchorSideTop.Control = cmbReplaceText AnchorSideTop.Side = asrBottom Left = 6 Height = 17 Top = 51 Width = 180 BorderSpacing.Top = 4 Caption = 'Find files N&OT containing the text' TabOrder = 3 end object cmbEncoding: TComboBox AnchorSideLeft.Control = cmbReplaceText AnchorSideTop.Control = cbNotContainingText AnchorSideTop.Side = asrBottom Left = 106 Height = 21 Top = 71 Width = 100 BorderSpacing.Top = 3 BorderSpacing.Bottom = 3 ItemHeight = 13 OnSelect = cmbEncodingSelect Style = csDropDownList TabOrder = 5 end object cmbFindText: TComboBoxWithDelItems AnchorSideLeft.Control = CheksPanel AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = gbFindData AnchorSideRight.Control = gbFindData AnchorSideRight.Side = asrBottom Left = 106 Height = 21 Top = 2 Width = 600 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 3 BorderSpacing.Right = 3 ItemHeight = 13 TabOrder = 1 end object cmbReplaceText: TComboBoxWithDelItems AnchorSideLeft.Control = cmbFindText AnchorSideTop.Control = cmbFindText AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbFindData AnchorSideRight.Side = asrBottom Left = 106 Height = 21 Top = 26 Width = 600 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 3 BorderSpacing.Right = 3 ItemHeight = 13 TabOrder = 2 end object CheksPanel: TPanel AnchorSideLeft.Control = gbFindData AnchorSideTop.Control = cmbFindText AnchorSideBottom.Control = cmbReplaceText AnchorSideBottom.Side = asrBottom Left = 0 Height = 45 Top = 2 Width = 103 Anchors = [akTop, akLeft, akBottom] AutoSize = True BevelOuter = bvNone ClientHeight = 45 ClientWidth = 103 TabOrder = 0 object cbFindText: TCheckBox AnchorSideLeft.Control = CheksPanel AnchorSideTop.Control = CheksPanel AnchorSideRight.Side = asrBottom Left = 6 Height = 17 Top = 2 Width = 91 BorderSpacing.Left = 6 BorderSpacing.Top = 2 BorderSpacing.Right = 6 Caption = 'Find &text in file' OnChange = cbFindTextChange TabOrder = 0 end object cbReplaceText: TCheckBox AnchorSideLeft.Control = CheksPanel AnchorSideTop.Control = CheksPanel AnchorSideTop.Side = asrBottom AnchorSideBottom.Control = CheksPanel AnchorSideBottom.Side = asrBottom Left = 6 Height = 17 Top = 26 Width = 73 Anchors = [akLeft, akBottom] BorderSpacing.Left = 6 BorderSpacing.Top = 6 BorderSpacing.Bottom = 2 Caption = 'Re&place by' OnChange = cbReplaceTextChange TabOrder = 1 end end end end object tsAdvanced: TTabSheet Caption = 'Advanced' ChildSizing.LeftRightSpacing = 3 ChildSizing.TopBottomSpacing = 3 ClientHeight = 363 ClientWidth = 716 ImageIndex = 1 object cbDateFrom: TCheckBox AnchorSideLeft.Control = tsAdvanced AnchorSideTop.Control = seFileSizeFrom AnchorSideTop.Side = asrBottom Left = 6 Height = 19 Top = 127 Width = 76 BorderSpacing.Left = 6 BorderSpacing.Top = 13 Caption = '&Date from:' OnChange = cbDateFromChange TabOrder = 8 end object cbNotOlderThan: TCheckBox AnchorSideLeft.Control = seNotOlderThan AnchorSideTop.Control = tsAdvanced Left = 3 Height = 19 Top = 18 Width = 100 BorderSpacing.Top = 18 Caption = 'N&ot older than:' Color = clBtnFace OnChange = cbNotOlderThanChange ParentColor = False TabOrder = 0 end object seNotOlderThan: TSpinEdit AnchorSideLeft.Control = ZVDateFrom AnchorSideTop.Control = cbNotOlderThan AnchorSideTop.Side = asrBottom AnchorSideRight.Control = ZVDateFrom AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = cmbNotOlderThanUnit AnchorSideBottom.Side = asrBottom Left = 3 Height = 23 Top = 37 Width = 79 Anchors = [akTop, akLeft, akRight, akBottom] MaxValue = 999999999 OnChange = seNotOlderThanChange TabOrder = 1 end object cmbNotOlderThanUnit: TComboBox AnchorSideLeft.Control = ZVDateTo AnchorSideTop.Control = cbNotOlderThan AnchorSideTop.Side = asrBottom AnchorSideRight.Control = ZVDateTo AnchorSideRight.Side = asrBottom Left = 112 Height = 21 Top = 37 Width = 79 Anchors = [akTop, akLeft, akRight] Enabled = False ItemHeight = 13 Style = csDropDownList TabOrder = 2 end object cbFileSizeFrom: TCheckBox AnchorSideLeft.Control = ZVDateFrom AnchorSideTop.Control = seNotOlderThan AnchorSideTop.Side = asrBottom Left = 3 Height = 19 Top = 72 Width = 72 BorderSpacing.Top = 12 Caption = 'S&ize from:' OnChange = cbFileSizeFromChange TabOrder = 3 end object cbDateTo: TCheckBox AnchorSideLeft.Control = ZVDateTo AnchorSideTop.Control = cbDateFrom AnchorSideTop.Side = asrCenter Left = 112 Height = 19 Top = 127 Width = 61 BorderSpacing.Top = 18 Caption = 'Dat&e to:' OnChange = cbDateToChange TabOrder = 10 end object cbFileSizeTo: TCheckBox AnchorSideLeft.Control = ZVDateTo AnchorSideTop.Control = cbFileSizeFrom Left = 112 Height = 19 Top = 72 Width = 57 Caption = 'Si&ze to:' OnChange = cbFileSizeToChange TabOrder = 5 end object seFileSizeFrom: TSpinEdit AnchorSideLeft.Control = ZVDateFrom AnchorSideTop.Control = cbFileSizeFrom AnchorSideTop.Side = asrBottom AnchorSideRight.Control = ZVDateFrom AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = cmbFileSizeUnit AnchorSideBottom.Side = asrBottom Left = 3 Height = 23 Top = 91 Width = 79 Anchors = [akTop, akLeft, akRight, akBottom] MaxValue = 2147483647 OnChange = seFileSizeFromChange TabOrder = 4 end object seFileSizeTo: TSpinEdit AnchorSideLeft.Control = ZVDateTo AnchorSideTop.Control = cbFileSizeTo AnchorSideTop.Side = asrBottom AnchorSideRight.Control = ZVDateTo AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = cmbFileSizeUnit AnchorSideBottom.Side = asrBottom Left = 112 Height = 23 Top = 91 Width = 79 Anchors = [akTop, akLeft, akRight, akBottom] MaxValue = 2147483647 OnChange = seFileSizeToChange TabOrder = 6 end object cmbFileSizeUnit: TComboBox AnchorSideLeft.Control = ZVTimeFrom AnchorSideTop.Control = cbFileSizeTo AnchorSideTop.Side = asrBottom AnchorSideRight.Control = ZVTimeTo AnchorSideRight.Side = asrBottom Left = 221 Height = 21 Top = 91 Width = 160 Anchors = [akTop, akLeft, akRight] Enabled = False ItemHeight = 13 Style = csDropDownList TabOrder = 7 end object cbTimeFrom: TCheckBox AnchorSideLeft.Control = ZVTimeFrom AnchorSideTop.Control = cbDateFrom AnchorSideTop.Side = asrCenter Left = 221 Height = 19 Top = 127 Width = 79 BorderSpacing.Top = 12 Caption = '&Time from:' OnChange = cbTimeFromChange TabOrder = 12 end object cbTimeTo: TCheckBox AnchorSideLeft.Control = ZVTimeTo AnchorSideTop.Control = cbDateFrom AnchorSideTop.Side = asrCenter Left = 316 Height = 19 Top = 127 Width = 64 Caption = 'Ti&me to:' OnChange = cbTimeToChange TabOrder = 14 end object Bevel2: TBevel AnchorSideLeft.Control = tsAdvanced AnchorSideTop.Control = ZVDateFrom AnchorSideTop.Side = asrBottom AnchorSideRight.Control = tsAdvanced AnchorSideRight.Side = asrBottom Left = 6 Height = 4 Top = 181 Width = 704 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 BorderSpacing.Top = 12 BorderSpacing.Right = 6 Shape = bsTopLine Style = bsRaised end object ZVDateFrom: TZVDateTimePicker AnchorSideLeft.Control = tsAdvanced AnchorSideTop.Control = cbDateFrom AnchorSideTop.Side = asrBottom Left = 3 Height = 23 Top = 146 Width = 79 CenturyFrom = 1941 MaxDate = 2958465 MinDate = -53780 TabOrder = 9 BorderSpacing.Left = 3 TrailingSeparator = False TextForNullDate = 'NULL' LeadingZeros = True Kind = dtkDate TimeFormat = tf24 TimeDisplay = tdHMS DateMode = dmComboBox Date = 40598 Time = 0.92583748842299 UseDefaultSeparators = True OnChange = ZVDateFromChange end object ZVDateTo: TZVDateTimePicker AnchorSideLeft.Control = ZVDateFrom AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = ZVDateFrom AnchorSideTop.Side = asrCenter Left = 112 Height = 23 Top = 146 Width = 79 CenturyFrom = 1941 MaxDate = 2958465 MinDate = -53780 TabOrder = 11 BorderSpacing.Left = 30 TrailingSeparator = False TextForNullDate = 'NULL' LeadingZeros = True Kind = dtkDate TimeFormat = tf24 TimeDisplay = tdHMS DateMode = dmComboBox Date = 40598 Time = 0.92723487268813 UseDefaultSeparators = True OnChange = ZVDateToChange end object ZVTimeFrom: TZVDateTimePicker AnchorSideLeft.Control = ZVDateTo AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = ZVDateFrom AnchorSideBottom.Control = ZVDateFrom AnchorSideBottom.Side = asrBottom Left = 221 Height = 23 Top = 146 Width = 65 CenturyFrom = 1941 MaxDate = 2958465 MinDate = -53780 TabOrder = 13 BorderSpacing.Left = 30 TrailingSeparator = False TextForNullDate = 'NULL' LeadingZeros = True Anchors = [akTop, akLeft, akBottom] Kind = dtkTime TimeFormat = tf24 TimeDisplay = tdHMS DateMode = dmComboBox Date = 40598 Time = 0.93076533564454 UseDefaultSeparators = True OnChange = ZVTimeFromChange end object ZVTimeTo: TZVDateTimePicker AnchorSideLeft.Control = ZVTimeFrom AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = ZVDateFrom AnchorSideBottom.Control = ZVDateFrom AnchorSideBottom.Side = asrBottom Left = 316 Height = 23 Top = 146 Width = 65 CenturyFrom = 1941 MaxDate = 2958465 MinDate = -53780 TabOrder = 15 BorderSpacing.Left = 30 TrailingSeparator = False TextForNullDate = 'NULL' LeadingZeros = True Anchors = [akTop, akLeft, akBottom] Kind = dtkTime TimeFormat = tf24 TimeDisplay = tdHMS DateMode = dmComboBox Date = 40598 Time = 0.93076533564454 UseDefaultSeparators = True OnChange = ZVTimeToChange end object lblAttributes: TLabel AnchorSideLeft.Control = tsAdvanced AnchorSideTop.Control = Bevel2 AnchorSideTop.Side = asrBottom Left = 3 Height = 16 Top = 193 Width = 53 BorderSpacing.Left = 3 BorderSpacing.Top = 8 Caption = 'Attri&butes' FocusControl = edtAttrib ParentColor = False end object edtAttrib: TEdit AnchorSideLeft.Control = tsAdvanced AnchorSideTop.Control = lblAttributes AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnAddAttribute Left = 3 Height = 23 Top = 213 Width = 600 HelpType = htKeyword HelpKeyword = '/findfiles.html#attributes' Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 3 BorderSpacing.Top = 4 BorderSpacing.Right = 3 ParentShowHint = False ShowHint = True TabOrder = 16 end object btnAddAttribute: TButton AnchorSideLeft.Control = edtAttrib AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtAttrib AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnAttrsHelp Left = 606 Height = 26 Top = 211 Width = 48 Anchors = [akTop, akRight] AutoSize = True BorderSpacing.Around = 3 Caption = '&Add' Constraints.MinHeight = 26 OnClick = btnAddAttributeClick TabOrder = 17 end object btnAttrsHelp: TButton AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtAttrib AnchorSideTop.Side = asrCenter AnchorSideRight.Control = tsAdvanced AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 657 Height = 27 Top = 211 Width = 53 Anchors = [akTop, akRight] AutoSize = True BorderSpacing.Right = 6 BorderSpacing.InnerBorder = 1 Caption = '&Help' Constraints.MinHeight = 26 OnClick = btnAttrsHelpClick TabOrder = 18 end end object tsPlugins: TTabSheet Caption = 'Plugins' ChildSizing.LeftRightSpacing = 3 ChildSizing.TopBottomSpacing = 3 ClientHeight = 357 ClientWidth = 721 object cbUsePlugin: TCheckBox AnchorSideLeft.Control = tsPlugins AnchorSideTop.Control = cmbPlugin AnchorSideTop.Side = asrCenter Left = 3 Height = 20 Top = 12 Width = 110 Caption = '&Use search plugin:' OnChange = cbUsePluginChange TabOrder = 0 end object cmbPlugin: TComboBox AnchorSideLeft.Control = cbUsePlugin AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = tsPlugins AnchorSideRight.Control = tsPlugins AnchorSideRight.Side = asrBottom Left = 116 Height = 21 Top = 10 Width = 602 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 3 BorderSpacing.Top = 10 Enabled = False ItemHeight = 13 TabOrder = 1 end end object tsLoadSave: TTabSheet Caption = 'Load/Save' ChildSizing.LeftRightSpacing = 3 ChildSizing.TopBottomSpacing = 3 ClientHeight = 357 ClientWidth = 721 OnShow = tsLoadSaveShow object lblTemplateHeader: TLabel Left = 3 Height = 13 Top = 3 Width = 715 Align = alTop BorderSpacing.Left = 3 BorderSpacing.Top = 3 BorderSpacing.Right = 3 Caption = '&Previous searches:' FocusControl = lbSearchTemplates ParentColor = False end object lbSearchTemplates: TListBox Left = 3 Height = 275 Top = 16 Width = 715 Align = alClient BorderSpacing.Left = 3 BorderSpacing.Right = 3 BorderSpacing.Bottom = 3 ItemHeight = 0 OnDblClick = lbSearchTemplatesDblClick OnSelectionChange = lbSearchTemplatesSelectionChange ScrollWidth = 713 TabOrder = 0 end object lblSearchContents: TPanel Left = 3 Height = 21 Top = 297 Width = 715 Align = alBottom Alignment = taLeftJustify AutoSize = True BorderSpacing.Top = 3 BorderSpacing.Bottom = 3 BorderSpacing.Around = 3 BevelOuter = bvLowered Constraints.MinHeight = 21 TabOrder = 1 end object pnlLoadSaveBottom: TPanel Left = 3 Height = 30 Top = 324 Width = 715 Align = alBottom AutoSize = True BorderSpacing.Around = 3 BevelOuter = bvNone ClientHeight = 30 ClientWidth = 715 TabOrder = 2 object pnlLoadSaveBottomButtons: TPanel Left = 332 Height = 30 Top = 0 Width = 383 Align = alRight AutoSize = True BevelOuter = bvNone ChildSizing.Layout = cclTopToBottomThenLeftToRight ClientHeight = 30 ClientWidth = 383 TabOrder = 0 object btnSearchLoad: TButton Left = 0 Height = 30 Top = 0 Width = 75 AutoSize = True BorderSpacing.Right = 3 Caption = 'L&oad' Constraints.MinWidth = 75 OnClick = btnSearchLoadClick TabOrder = 0 end object btnSearchSave: TButton Left = 78 Height = 30 Top = 0 Width = 75 AutoSize = True BorderSpacing.Left = 3 BorderSpacing.Right = 3 Caption = 'S&ave' Constraints.MinWidth = 75 OnClick = btnSearchSaveClick TabOrder = 1 end object btnSearchSaveWithStartingPath: TButton Left = 156 Height = 30 Hint = 'If saved then "Start in directory" will be restored when loading template. Use it if you want to fix searching to a certain directory' Top = 0 Width = 149 AutoSize = True BorderSpacing.Left = 3 BorderSpacing.Right = 3 Caption = 'Sa&ve with "Start in directory"' Constraints.MinWidth = 75 OnClick = btnSearchSaveWithStartingPathClick ParentShowHint = False ShowHint = True TabOrder = 2 end object btnSearchDelete: TButton Left = 308 Height = 30 Top = 0 Width = 75 AutoSize = True BorderSpacing.Left = 3 Caption = '&Delete' Constraints.MinHeight = 30 Constraints.MinWidth = 75 OnClick = btnSearchDeleteClick TabOrder = 3 end end end end object tsResults: TTabSheet Caption = 'Results' ChildSizing.LeftRightSpacing = 3 ChildSizing.TopBottomSpacing = 3 ClientHeight = 357 ClientWidth = 721 object pnlResults: TPanel AnchorSideTop.Control = pnlFindFile Left = 3 Height = 449 Top = 3 Width = 715 Align = alClient BevelOuter = bvNone ClientHeight = 449 ClientWidth = 715 FullRepaint = False TabOrder = 0 object pnlStatus: TPanel Left = 0 Height = 8 Top = 0 Width = 715 Align = alTop AutoSize = True BevelOuter = bvNone ClientHeight = 8 ClientWidth = 715 FullRepaint = False TabOrder = 0 object lblStatus: TLabel AnchorSideLeft.Control = pnlStatus AnchorSideTop.Control = lblCurrent AnchorSideTop.Side = asrBottom Left = 3 Height = 1 Top = 7 Width = 1 BorderSpacing.Left = 3 BorderSpacing.Top = 3 ParentColor = False ParentFont = False end object lblCurrent: TLabel AnchorSideLeft.Control = pnlStatus AnchorSideTop.Control = pnlStatus Left = 3 Height = 1 Top = 3 Width = 1 BorderSpacing.Left = 3 BorderSpacing.Top = 3 ParentColor = False ParentFont = False end object lblFound: TLabel AnchorSideTop.Control = lblStatus AnchorSideTop.Side = asrCenter AnchorSideRight.Control = pnlStatus AnchorSideRight.Side = asrBottom Left = 711 Height = 1 Top = 7 Width = 1 Anchors = [akTop, akRight] BorderSpacing.Right = 3 ParentColor = False ParentFont = False end end object lsFoundedFiles: TListBox Left = 3 Height = 398 Top = 11 Width = 709 Align = alClient BorderSpacing.Around = 3 ItemHeight = 0 MultiSelect = True OnDblClick = lsFoundedFilesDblClick OnKeyDown = lsFoundedFilesKeyDown PopupMenu = PopupMenuFind ScrollWidth = 707 TabOrder = 1 end object pnlResultsBottom: TPanel Left = 3 Height = 34 Top = 412 Width = 709 Align = alBottom AutoSize = True BorderSpacing.Around = 3 BevelOuter = bvNone ClientHeight = 34 ClientWidth = 709 TabOrder = 2 object pnlResultsBottomButtons: TPanel Left = 447 Height = 34 Top = 0 Width = 262 Align = alRight AutoSize = True BevelOuter = bvNone ClientHeight = 34 ClientWidth = 262 TabOrder = 0 object btnWorkWithFound: TButton AnchorSideLeft.Side = asrBottom Left = 172 Height = 34 Top = 0 Width = 90 Align = alRight AutoSize = True BorderSpacing.InnerBorder = 4 Caption = 'Feed to &listbox' Constraints.MinWidth = 50 OnClick = btnWorkWithFoundClick TabOrder = 0 end object btnGoToPath: TButton Left = 106 Height = 34 Top = 0 Width = 63 Align = alRight AutoSize = True BorderSpacing.Left = 3 BorderSpacing.Right = 3 BorderSpacing.InnerBorder = 4 Caption = '&Go to file' Constraints.MinWidth = 50 OnClick = btnGoToPathClick TabOrder = 1 end object btnView: TButton Left = 0 Height = 34 Top = 0 Width = 50 Align = alRight AutoSize = True BorderSpacing.Right = 3 BorderSpacing.InnerBorder = 4 Caption = '&View' Constraints.MinWidth = 50 OnClick = btnViewClick TabOrder = 3 end object btnEdit: TButton Left = 53 Height = 34 Top = 0 Width = 50 Align = alRight AutoSize = True BorderSpacing.Right = 3 BorderSpacing.InnerBorder = 4 Caption = '&Edit' Constraints.MinWidth = 50 OnClick = btnEditClick TabOrder = 2 end end end end end end object pnlButtons: TPanel Left = 733 Height = 351 Top = 40 Width = 100 Align = alRight Anchors = [akTop, akRight] AutoSize = True BorderSpacing.Left = 6 BorderSpacing.Top = 40 BevelOuter = bvNone ChildSizing.VerticalSpacing = 6 ChildSizing.EnlargeHorizontal = crsHomogenousChildResize ChildSizing.ShrinkHorizontal = crsHomogenousChildResize ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 351 ClientWidth = 100 Constraints.MinWidth = 100 TabOrder = 1 object btnUseTemplate: TButton Left = 0 Height = 31 Top = 0 Width = 100 AutoSize = True BorderSpacing.InnerBorder = 4 Caption = 'Use template' ModalResult = 1 TabOrder = 0 Visible = False end object btnSaveTemplate: TButton AnchorSideBottom.Side = asrBottom Left = 0 Height = 31 Top = 37 Width = 100 AutoSize = True BorderSpacing.InnerBorder = 4 Caption = '&Save' ModalResult = 1 OnClick = btnSearchSaveClick TabOrder = 1 Visible = False end object btnStart: TButton Left = 0 Height = 31 Top = 74 Width = 100 AutoSize = True BorderSpacing.InnerBorder = 4 Caption = '&Start' OnClick = btnStartClick TabOrder = 2 end object btnStop: TButton Left = 0 Height = 31 Top = 111 Width = 100 AutoSize = True BorderSpacing.InnerBorder = 4 Caption = 'C&ancel' Enabled = False OnClick = btnStopClick TabOrder = 3 end object btnClose: TButton Left = 0 Height = 31 Top = 148 Width = 100 AutoSize = True BorderSpacing.InnerBorder = 4 Caption = '&Close' OnClick = btnCloseClick TabOrder = 4 end object btnNewSearch: TButton Left = 0 Height = 31 Top = 185 Width = 100 AutoSize = True BorderSpacing.Top = 30 BorderSpacing.InnerBorder = 4 Caption = '&New search' OnClick = btnNewSearchClick TabOrder = 5 end object btnLastSearch: TButton Left = 0 Height = 31 Top = 222 Width = 100 AutoSize = True BorderSpacing.InnerBorder = 4 Caption = '&Last search' OnClick = btnLastSearchClick TabOrder = 6 end end end object PopupMenuFind: TPopupMenu left = 336 object miShowInViewer: TMenuItem Caption = 'Show In Viewer' OnClick = miShowInViewerClick end object miRemoveFromLlist: TMenuItem Caption = 'Remove from list' OnClick = miRemoveFromLlistClick end object miShowAllFound: TMenuItem Caption = 'Show all found items' Enabled = False OnClick = miShowAllFoundClick end end end doublecmd-0.5.8/src/uGlobsPaths.pas0000644000175000017500000000344512154651644016253 0ustar alexxalexxunit uGlobsPaths; interface var gpExePath : String = ''; // executable directory gpCfgDir : String = ''; // directory from which configuration files are used gpGlobalCfgDir : String = ''; // config dir global for all user gpCmdLineCfgDir : String = ''; // config dir passed on the command line gpLngDir : String = ''; // path to language *.po files gpPixmapPath : String = ''; // path to pixmaps gpCacheDir : UTF8String = ''; // cache directory procedure LoadPaths; implementation uses SysUtils, FileUtil, uDebug, uOSUtils, DCOSUtils, DCStrUtils; function GetAppName : String; begin Result := 'doublecmd'; end; procedure LoadPaths; begin OnGetApplicationName := @GetAppName; gpExePath := ExtractFilePath(TryReadAllLinks(ParamStrU(0))); DCDebug('Executable directory: ', gpExePath); gpGlobalCfgDir := gpExePath; if gpCmdLineCfgDir <> EmptyStr then begin if GetPathType(gpCmdLineCfgDir) <> ptAbsolute then gpCmdLineCfgDir := IncludeTrailingPathDelimiter(mbGetCurrentDir) + gpCmdLineCfgDir; gpCmdLineCfgDir := ExpandAbsolutePath(gpCmdLineCfgDir); gpCfgDir := gpCmdLineCfgDir; end else begin gpCfgDir := GetAppConfigDir; if gpCfgDir = EmptyStr then begin DCDebug('Warning: Cannot get user config directory.'); gpCfgDir := gpGlobalCfgDir; end; end; gpCfgDir := IncludeTrailingPathDelimiter(gpCfgDir); gpLngDir := gpExePath + 'language' + DirectorySeparator; gpPixmapPath := gpExePath + 'pixmaps' + DirectorySeparator; gpCacheDir := GetAppCacheDir; // set up environment variables mbSetEnvironmentVariable('COMMANDER_INI', gpCfgDir + 'doublecmd.xml'); mbSetEnvironmentVariable('COMMANDER_DRIVE', ExtractRootDir(gpExePath)); mbSetEnvironmentVariable('COMMANDER_PATH', ExcludeTrailingBackslash(gpExePath)); end; end. doublecmd-0.5.8/src/ubinarycompare.pas0000644000175000017500000000733711742264573017047 0ustar alexxalexxunit uBinaryCompare; {$mode objfpc}{$H+} interface uses Classes; const cColumnSize = 8; cLineDiverg = 50; function BinaryCompare(const sLeftFileName, sRightFileName: UTF8String; lsLeft, lsRight: TStrings): Integer; implementation uses SysUtils, DCClassesUtf8; function ConvertByte(b:Byte):Char; begin if b in [32..255] then Result:=Chr(b) else Result:='.'; { case b of 0..31: Result:='.'; 32..127: Result:=Chr(b); else Result:='.'; end;} end; function Byte2Hex(b: Byte): String; begin Result:= IntToHex(b, 2) + ' '; end; function BinaryCompare(const sLeftFileName, sRightFileName: UTF8String; lsLeft, lsRight: TStrings): Integer; var fLeft, fRight:TFileStreamEx; bLeft:Byte; bRight:Byte; iColumnCount:Integer; sLeftLine, sRightLine:String; sLeftHexLine, sRightHexLine:String; iDif:Integer; iLineCount:Integer; iDiffed:PtrInt; procedure ClearLines; begin sLeftLine:=''; sRightLine:=''; sLeftHexLine:=''; sRightHexLine:=''; end; function LineFormat(const sHex, sAscii: String): String; var sDummy: String; begin sDummy:= EmptyStr; if Length(sHex) < (cColumnSize * 3) then sDummy:= StringOfChar('*', cColumnSize*3 - Length(sHex)); Result:= Format('%s%s %s',[sHex, sDummy, sAscii]); end; begin fLeft:=TFileStreamEx.Create(sLeftFileName,fmOpenRead); fRight:=TFileStreamEx.Create(sRightFileName,fmOpenRead); ClearLines; try iColumnCount:=0; iLineCount:=1; iDif:=0; // diferences count iDiffed:=0; while (fRight.PositionbRight then begin inc(iDif); inc(iDiffed); end; sLeftLine:=sLeftLine+ConvertByte(bLeft); sLeftHexLine:=sLeftHexLine+Byte2Hex(bLeft); sRightLine:=sRightLine+ConvertByte(bRight); sRightHexLine:=sRightHexLine+Byte2Hex(bRight); inc(iColumnCount); if iColumnCount>=cColumnSize then begin lsLeft.AddObject(LineFormat(sLeftHexLine,sLeftLine), TObject(iDiffed)); lsRight.AddObject(LineFormat(sRightHexLine,sRightLine),TObject(iDiffed)); iDiffed:=0; ClearLines; iColumnCount:=0; inc(iLineCount); end; end; // load other data if fLeft.Size>fRight.Size then begin while fLeft.Position=cColumnSize then begin lsLeft.AddObject(LineFormat(sLeftHexLine,sLeftLine),TObject(iDiffed)); iDiffed:=0; sLeftLine:=''; sLeftHexLine:=''; iColumnCount:=0; inc(iLineCount); end; end; end else begin // load other data while fRight.Position=cColumnSize then begin lsRight.AddObject(LineFormat(sRightHexLine,sRightLine),TObject(iDiffed)); iDiffed:=0; sRightLine:=''; sRightHexLine:=''; iColumnCount:=0; inc(iLineCount); end; end; end; if sRightLine<>'' then lsRight.AddObject(LineFormat(sRightHexLine,sRightLine),TObject(iDiffed)); if sLeftLine<>'' then lsLeft.AddObject(LineFormat(sLeftHexLine,sLeftLine),TObject(iDiffed)); Result:=iDif; finally FreeAndNil(fLeft); FreeAndNil(fRight); end; end; end. doublecmd-0.5.8/src/utranslator.pas0000644000175000017500000000472711740433676016405 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- This unit is needed for using translated form strings made by Lazarus IDE. It loads localized form strings from .po file. Copyright (C) 2007 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uTranslator; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, GetText, Controls, typinfo, Translations; type { TTranslator } TTranslator = class(TAbstractTranslator) private FFormClassName : String; FPOFile:TPOFile; public constructor Create(POFileName:string); destructor Destroy;override; procedure TranslateStringProperty(Sender:TObject; const Instance: TPersistent; PropInfo: PPropInfo; var Content:string);override; end; implementation uses Forms, LCLProc; { TTranslator } constructor TTranslator.Create(POFileName: string); begin inherited Create; FPOFile := TPOFile.Create(POFileName); end; destructor TTranslator.Destroy; begin FPOFile.Free; inherited Destroy; end; procedure TTranslator.TranslateStringProperty(Sender: TObject; const Instance: TPersistent; PropInfo: PPropInfo; var Content: string); begin if Instance.InheritsFrom(TForm) then begin FFormClassName := Instance.ClassName; //DCDebug(UpperCase(FFormClassName + '.'+PropInfo^.Name) + '=' + Content); Content := FPOFile.Translate(UpperCase(FFormClassName + '.' + PropInfo^.Name), Content); end else begin //DCDebug(UpperCase(FFormClassName + '.'+Instance.GetNamePath + '.' + PropInfo^.Name) + '=' + Content); Content := FPOFile.Translate(UpperCase(FFormClassName + '.'+Instance.GetNamePath + '.'+ PropInfo^.Name), Content); end; // convert UTF8 to current local Content := UTF8ToSystemCharSet(Content); end; end. doublecmd-0.5.8/src/dmhigh.lfm0000644000175000017500000002474712204103540015242 0ustar alexxalexxobject dmHighl: TdmHighl OnCreate = dmHighlCreate OnDestroy = dmHighlDestroy OldCreateOrder = False Height = 379 HorizontalOffset = 309 VerticalOffset = 86 Width = 457 object SynPasSyn1: TSynPasSyn Tag = 1 Enabled = False AsmAttri.Foreground = clGreen AsmAttri.FrameEdges = sfeAround CommentAttri.Foreground = clBlue CommentAttri.FrameEdges = sfeAround CommentAttri.Style = [fsBold] IDEDirectiveAttri.FrameEdges = sfeAround IdentifierAttri.FrameEdges = sfeAround KeyAttri.FrameEdges = sfeAround NumberAttri.Foreground = clNavy NumberAttri.FrameEdges = sfeAround SpaceAttri.FrameEdges = sfeAround StringAttri.Foreground = clBlue StringAttri.FrameEdges = sfeAround SymbolAttri.Foreground = clRed SymbolAttri.FrameEdges = sfeAround CaseLabelAttri.FrameEdges = sfeAround DirectiveAttri.Foreground = clRed DirectiveAttri.FrameEdges = sfeAround DirectiveAttri.Style = [fsBold] CompilerMode = pcmDelphi NestedComments = False left = 24 top = 8 end object SynCppSyn1: TSynCppSyn Tag = 1 Enabled = False AsmAttri.Foreground = clGreen AsmAttri.FrameEdges = sfeAround CommentAttri.Foreground = clBlue CommentAttri.FrameEdges = sfeAround CommentAttri.Style = [fsBold] DirecAttri.Foreground = clBlue DirecAttri.FrameEdges = sfeAround DirecAttri.Style = [fsBold] IdentifierAttri.FrameEdges = sfeAround InvalidAttri.FrameEdges = sfeAround KeyAttri.FrameEdges = sfeAround NumberAttri.Foreground = clNavy NumberAttri.FrameEdges = sfeAround SpaceAttri.FrameEdges = sfeAround StringAttri.Foreground = clBlue StringAttri.FrameEdges = sfeAround SymbolAttri.Foreground = clRed SymbolAttri.FrameEdges = sfeAround left = 96 top = 8 end object SynJavaSyn1: TSynJavaSyn Enabled = False CommentAttri.Foreground = clBlue CommentAttri.FrameEdges = sfeAround CommentAttri.Style = [fsBold] DocumentAttri.Foreground = clBlue DocumentAttri.FrameEdges = sfeAround DocumentAttri.Style = [fsBold] IdentifierAttri.FrameEdges = sfeAround InvalidAttri.FrameEdges = sfeAround KeyAttri.FrameEdges = sfeAround NumberAttri.Foreground = clNavy NumberAttri.FrameEdges = sfeAround SpaceAttri.FrameEdges = sfeAround StringAttri.Foreground = clBlue StringAttri.FrameEdges = sfeAround SymbolAttri.Foreground = clRed SymbolAttri.FrameEdges = sfeAround left = 168 top = 8 end object SynHTMLSyn1: TSynHTMLSyn Tag = 1 Enabled = False AndAttri.FrameEdges = sfeAround ASPAttri.FrameEdges = sfeAround CommentAttri.FrameEdges = sfeAround IdentifierAttri.FrameEdges = sfeAround KeyAttri.FrameEdges = sfeAround SpaceAttri.FrameEdges = sfeAround SymbolAttri.FrameEdges = sfeAround TextAttri.FrameEdges = sfeAround UndefKeyAttri.FrameEdges = sfeAround ValueAttri.FrameEdges = sfeAround left = 328 top = 8 end object SynXMLSyn1: TSynXMLSyn Tag = 1 Enabled = False ElementAttri.FrameEdges = sfeAround AttributeAttri.FrameEdges = sfeAround NamespaceAttributeAttri.FrameEdges = sfeAround AttributeValueAttri.FrameEdges = sfeAround NamespaceAttributeValueAttri.FrameEdges = sfeAround TextAttri.FrameEdges = sfeAround CDATAAttri.FrameEdges = sfeAround EntityRefAttri.FrameEdges = sfeAround ProcessingInstructionAttri.FrameEdges = sfeAround CommentAttri.FrameEdges = sfeAround DocTypeAttri.FrameEdges = sfeAround SpaceAttri.FrameEdges = sfeAround SymbolAttri.FrameEdges = sfeAround WantBracesParsed = False left = 24 top = 72 end object SynLFMSyn1: TSynLFMSyn Tag = 1 Enabled = False CommentAttri.Foreground = clBlue CommentAttri.FrameEdges = sfeAround CommentAttri.Style = [fsBold] IdentifierAttri.FrameEdges = sfeAround KeyAttri.FrameEdges = sfeAround NumberAttri.Foreground = clNavy NumberAttri.FrameEdges = sfeAround SpaceAttri.FrameEdges = sfeAround StringAttri.Foreground = clBlue StringAttri.FrameEdges = sfeAround left = 96 top = 72 end object SynUNIXShellScriptSyn1: TSynUNIXShellScriptSyn Tag = 1 Enabled = False CommentAttri.FrameEdges = sfeAround IdentifierAttri.FrameEdges = sfeAround KeyAttri.FrameEdges = sfeAround SecondKeyAttri.FrameEdges = sfeAround NumberAttri.FrameEdges = sfeAround SpaceAttri.FrameEdges = sfeAround StringAttri.FrameEdges = sfeAround SymbolAttri.FrameEdges = sfeAround VarAttri.FrameEdges = sfeAround left = 296 top = 72 end object SynPHPSyn1: TSynPHPSyn Tag = 1 Enabled = False CommentAttri.Foreground = clBlue CommentAttri.FrameEdges = sfeAround CommentAttri.Style = [fsBold] IdentifierAttri.FrameEdges = sfeAround InvalidSymbolAttri.FrameEdges = sfeAround KeyAttri.FrameEdges = sfeAround NumberAttri.Foreground = clNavy NumberAttri.FrameEdges = sfeAround SpaceAttri.FrameEdges = sfeAround StringAttri.Foreground = clBlue StringAttri.FrameEdges = sfeAround SymbolAttri.Foreground = clRed SymbolAttri.FrameEdges = sfeAround VariableAttri.FrameEdges = sfeAround left = 96 top = 136 end object SynTeXSyn1: TSynTeXSyn Tag = 1 Enabled = False CommentAttri.FrameEdges = sfeAround TextAttri.FrameEdges = sfeAround ControlSequenceAttri.FrameEdges = sfeAround MathmodeAttri.FrameEdges = sfeAround SpaceAttri.FrameEdges = sfeAround BraceAttri.FrameEdges = sfeAround BracketAttri.FrameEdges = sfeAround left = 168 top = 136 end object SynSQLSyn1: TSynSQLSyn Tag = 1 Enabled = False CommentAttri.Foreground = clBlue CommentAttri.FrameEdges = sfeAround CommentAttri.Style = [fsBold] DataTypeAttri.FrameEdges = sfeAround DefaultPackageAttri.FrameEdges = sfeAround ExceptionAttri.FrameEdges = sfeAround FunctionAttri.FrameEdges = sfeAround IdentifierAttri.FrameEdges = sfeAround KeyAttri.FrameEdges = sfeAround NumberAttri.Foreground = clNavy NumberAttri.FrameEdges = sfeAround PLSQLAttri.FrameEdges = sfeAround SpaceAttri.FrameEdges = sfeAround SQLPlusAttri.FrameEdges = sfeAround StringAttri.Foreground = clBlue StringAttri.FrameEdges = sfeAround SymbolAttri.Foreground = clRed SymbolAttri.FrameEdges = sfeAround TableNameAttri.FrameEdges = sfeAround VariableAttri.FrameEdges = sfeAround SQLDialect = sqlSybase left = 240 top = 136 end object SynPerlSyn1: TSynPerlSyn Tag = 1 Enabled = False CommentAttri.Foreground = clBlue CommentAttri.FrameEdges = sfeAround CommentAttri.Style = [fsBold] IdentifierAttri.FrameEdges = sfeAround InvalidAttri.FrameEdges = sfeAround KeyAttri.FrameEdges = sfeAround NumberAttri.Foreground = clNavy NumberAttri.FrameEdges = sfeAround OperatorAttri.FrameEdges = sfeAround PragmaAttri.FrameEdges = sfeAround SpaceAttri.FrameEdges = sfeAround StringAttri.Foreground = clNavy StringAttri.FrameEdges = sfeAround SymbolAttri.Foreground = clRed SymbolAttri.FrameEdges = sfeAround VariableAttri.FrameEdges = sfeAround left = 240 top = 8 end object SynCssSyn1: TSynCssSyn Tag = 1 Enabled = False CommentAttri.Foreground = clBlue CommentAttri.FrameEdges = sfeAround CommentAttri.Style = [fsBold] IdentifierAttri.FrameEdges = sfeAround KeyAttri.FrameEdges = sfeAround NumberAttri.Foreground = clNavy NumberAttri.FrameEdges = sfeAround SpaceAttri.FrameEdges = sfeAround StringAttri.Foreground = clBlue StringAttri.FrameEdges = sfeAround SymbolAttri.Foreground = clRed SymbolAttri.FrameEdges = sfeAround left = 24 top = 136 end object SynPythonSyn1: TSynPythonSyn Tag = 1 Enabled = False CommentAttri.FrameEdges = sfeAround IdentifierAttri.FrameEdges = sfeAround KeyAttri.FrameEdges = sfeAround NonKeyAttri.FrameEdges = sfeAround SystemAttri.FrameEdges = sfeAround NumberAttri.FrameEdges = sfeAround HexAttri.FrameEdges = sfeAround OctalAttri.FrameEdges = sfeAround FloatAttri.FrameEdges = sfeAround SpaceAttri.FrameEdges = sfeAround StringAttri.FrameEdges = sfeAround DocStringAttri.FrameEdges = sfeAround SymbolAttri.FrameEdges = sfeAround ErrorAttri.FrameEdges = sfeAround left = 328 top = 136 end object SynDiffSyn1: TSynDiffSyn Tag = 1 Enabled = False UnknownAttri.FrameEdges = sfeAround SpaceAttri.FrameEdges = sfeAround OrigFileAttri.FrameEdges = sfeAround NewFileAttri.FrameEdges = sfeAround ChunkMarkerAttri.FrameEdges = sfeAround ChunkNewAttri.FrameEdges = sfeAround ChunkOldAttri.FrameEdges = sfeAround ChunkMixedAttri.FrameEdges = sfeAround LineAddedAttri.FrameEdges = sfeAround LineRemovedAttri.FrameEdges = sfeAround LineChangedAttri.FrameEdges = sfeAround LineContextAttri.FrameEdges = sfeAround left = 168 top = 72 end object SynVBSyn1: TSynVBSyn Tag = 1 Enabled = False CommentAttri.Foreground = clBlue CommentAttri.FrameEdges = sfeAround CommentAttri.Style = [fsBold] IdentifierAttri.FrameEdges = sfeAround KeyAttri.FrameEdges = sfeAround NumberAttri.Foreground = clNavy NumberAttri.FrameEdges = sfeAround SpaceAttri.FrameEdges = sfeAround StringAttri.Foreground = clBlue StringAttri.FrameEdges = sfeAround SymbolAttri.Foreground = clRed SymbolAttri.FrameEdges = sfeAround left = 24 top = 200 end object SynBatSyn1: TSynBatSyn Tag = 1 Enabled = False CommentAttri.Foreground = clBlue CommentAttri.FrameEdges = sfeAround CommentAttri.Style = [fsBold] IdentifierAttri.FrameEdges = sfeAround KeyAttri.FrameEdges = sfeAround NumberAttri.Foreground = clNavy NumberAttri.FrameEdges = sfeAround SpaceAttri.FrameEdges = sfeAround VariableAttri.FrameEdges = sfeAround left = 96 top = 200 end object SynIniSyn1: TSynIniSyn Tag = 1 Enabled = False CommentAttri.FrameEdges = sfeAround TextAttri.FrameEdges = sfeAround SectionAttri.FrameEdges = sfeAround KeyAttri.FrameEdges = sfeAround NumberAttri.FrameEdges = sfeAround SpaceAttri.FrameEdges = sfeAround StringAttri.FrameEdges = sfeAround SymbolAttri.FrameEdges = sfeAround left = 168 top = 200 end object SynPoSyn1: TSynPoSyn Tag = 1 Enabled = False CommentAttri.FrameEdges = sfeAround TextAttri.FrameEdges = sfeAround KeyAttri.FrameEdges = sfeAround SpaceAttri.FrameEdges = sfeAround left = 240 top = 200 end end doublecmd-0.5.8/src/udcutils.pas0000644000175000017500000007401212137022170015635 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Several useful functions Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) contributors: Radek Cervinka (cnvFormatFileSize and DivFileName functions) Tomas Bzatek (QuoteStr, RemoveQuotation and SplitArgs functions) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uDCUtils; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Graphics, Controls, StdCtrls, ColorBox, {$IF DEFINED(UNIX)} DCBasicTypes, {$ENDIF} uFile, uTypes; const {$IF DEFINED(UNIX)} NoQuotesSpecialChars = [' ', '"', '''', '(', ')', ':', '&', '!', '$', '*', '?', '=', '`', '\', #10]; DoubleQuotesSpecialChars = ['$', '\', '`', '"', #10]; {$ENDIF} EnvVarCommanderPath = '%commander_path%'; EnvVarConfigPath = '%dc_config_path%'; function GetCmdDirFromEnvVar(const sPath : String) : String; function SetCmdDirAsEnvVar(const sPath : String) : String; {en Replaces environment variables of form %% with their values. Also replaces the internal "%commander_path%". } function ReplaceEnvVars(const sText: String): String; {en Replaces tilde ~ at the beginning of the string with home directory. } function ReplaceTilde(const Path: String): String; {en Expands the file name with environment variables by replacing them by absolute path. @param(sFileName File name to expand.) @returns(Absolute file name.) } function mbExpandFileName(const sFileName: UTF8String): UTF8String; {en Convert file size to string representation in floating format (Kb, Mb, Gb) @param(iSize File size) @param(ShortFormat If @true than short format is used, otherwise long format (bytes) is used.) @returns(File size in string representation) } function cnvFormatFileSize(iSize: Int64; FSF: TFileSizeFormat): String; function cnvFormatFileSize(iSize: Int64; FSF: Boolean): String; function cnvFormatFileSize(iSize: Int64): String; inline; {en Minimize file path @param(PathToMince File path) @param(Canvas Output canvas) @param(MaxLen Max length of path in pixels) @returns(Minimized file path) } function MinimizeFilePath(const PathToMince: String; Canvas: TCanvas; MaxLen: Integer): String; {en Checks if a filename matches any filename in the filelist or if it could be in any directory of the file list or any of their subdirectories. @param(Files List of files to which the filename must be matched.) @param(FileName Path to a file that will be matched. This may be absolute, relative or contain no path at all (only filename).) } function MatchesFileList(const Files: TFiles; FileName: String): Boolean; {en Checks if a file matches any mask in the masklist. @param(aFile File that will be matched.) @param(MaskList List of masks to which the file must be matched.) } function MatchesMaskListEx(const aFile: TFile; MaskList: TStringList): Boolean; {en Checks if a file or directory belongs in the specified path list. Only strings are compared, no file-system checks are done. @param(sBasePathList List of absolute paths where the path to check should be in.) @param(sPathToCheck Absolute path to file or directory to check.) @return(@true if sPathToCheck points to a directory or file in sBasePathList. @false otherwise.) } function IsInPathList(sBasePathList : String; sPathToCheck : String; ASeparator: AnsiChar = ';') : Boolean; {en Changes all the files' paths making them relative to 'sNewRootPath'. It is done by removing 'sNewRootPath' prefix from the paths and setting the general path (Files.Path) to sNewRootPath. @param(sNewRootPath Path that specifies new 'root' directory for all filenames.) @param(Files Contains list of files to change.) } procedure ChangeFileListRoot(sNewRootPath: String; Files: TFiles); {en Replace executable extension by system specific executable extension @param(sFileName File name) @returns(Executable name with system specific executable extension) } function FixExeExt(const sFileName: UTF8String): UTF8String; {en Delete quotes from string @param(Str String) } function TrimQuotes(const Str: String): String; function QuoteStr(const Str: String): String; {$IFDEF UNIX} function QuoteSingle(const Str: String): String; {$ENDIF} function QuoteDouble(const Str: String): String; {$IFDEF UNIX} {en Escapes characters to be inserted between single quotes (') and passed to shell command line. The resulting string is not enclosed with '', only escaped. For example needs to be escaped with this function: sh -c '' "" } function EscapeSingleQuotes(const Str: String): String; {en Escapes characters to be inserted between double quotes (") and passed to shell command line. The resulting string is not enclosed with "", only escaped. For example needs to be escaped with this function: sh -c '' "" } function EscapeDoubleQuotes(const Str: String): String; {en Escapes characters to be passed to shell command line when no quoting is used. For example needs to be escaped with this function: sh -c '' "" } function EscapeNoQuotes(const Str: String): String; {$ENDIF} {en Delete quotation characters from string @param(Str String) @returns(String without quotation characters) } function RemoveQuotation(const Str: String): String; {$IF DEFINED(UNIX)} {en Split command line to command and a list of arguments. Each argument is unquoted. @param(sCmdLine Command line) @param(sCommand Command) @param(Args List of arguments) } procedure SplitCmdLine(sCmdLine: String; out sCommand: String; out Args: TDynamicStringArray); {$ELSEIF DEFINED(MSWINDOWS)} {en Split command line to command and parameters @param(sCmdLine Command line) @param(sCmd Command) @param(sParams Parameters) } procedure SplitCmdLine(sCmdLine : String; var sCmd, sParams : String); {$ENDIF} function CompareStrings(const s1, s2: UTF8String; Natural: Boolean; CaseSensitivity: TCaseSensitivity): PtrInt; procedure InsertFirstItem(sLine: String; comboBox: TCustomComboBox); {en Compares two strings taking into account the numbers. Strings must have tailing zeros (#0). } function StrFloatCmpW(str1, str2: PWideChar; CaseSensitivity: TCaseSensitivity): PtrInt; function EstimateRemainingTime(StartValue, CurrentValue, EndValue: Int64; StartTime: TDateTime; CurrentTime: TDateTime; out SpeedPerSecond: Int64): TDateTime; function ModColor(AColor: TColor; APercent: Byte) : TColor; {en Makes a color some darker @param(AColor Source color) @param(APercent The percentage of brightness decrease) @returns(New some darker color) } function DarkColor(AColor: TColor; APercent: Byte): TColor; {en Makes a color some lighter @param(AColor Source color) @param(APercent The percentage of brightness increase) @returns(New some lighter color) } function LightColor(AColor: TColor; APercent: Byte): TColor; procedure SetColorInColorBox(const lcbColorBox: TColorBox; const lColor: TColor); procedure UpdateColor(Control: TControl; Checked: Boolean); procedure EnableControl(Control: TControl; Enabled: Boolean); implementation uses LCLProc, LCLType, uMasks, FileUtil, StrUtils, uOSUtils, uGlobs, uGlobsPaths, DCStrUtils, DCOSUtils; function GetCmdDirFromEnvVar(const sPath: String): String; begin Result := NormalizePathDelimiters(sPath); Result := StringReplace(Result, EnvVarCommanderPath, ExcludeTrailingPathDelimiter(gpExePath), [rfIgnoreCase]); Result := StringReplace(Result, EnvVarConfigPath, ExcludeTrailingPathDelimiter(gpCfgDir), [rfIgnoreCase]); end; function SetCmdDirAsEnvVar(const sPath: String): String; begin Result := NormalizePathDelimiters(sPath); Result := StringReplace(Result, ExcludeTrailingPathDelimiter(gpExePath), EnvVarCommanderPath, []); Result := StringReplace(Result, ExcludeTrailingPathDelimiter(gpCfgDir), EnvVarConfigPath, []); end; function ReplaceEnvVars(const sText: String): String; var I, X, EqualPos: Integer; EnvVar, EnvName, EnvValue: String; begin Result:= sText; if sText = EmptyStr then Exit; X:= GetEnvironmentVariableCount; if X = 0 then Exit; for I:= 1 to X do begin EnvVar:= mbGetEnvironmentString(I); EqualPos:= PosEx('=', EnvVar, 2); if EqualPos = 0 then Continue; EnvName:= Copy(EnvVar, 1, EqualPos - 1); EnvValue:= Copy(EnvVar, EqualPos + 1, MaxInt); {$IFDEF UNIX} Result:= StringReplace(Result, '$' + EnvName, EnvValue, [rfReplaceAll, rfIgnoreCase]); {$ELSE} Result:= StringReplace(Result, '%' + EnvName + '%', EnvValue, [rfReplaceAll, rfIgnoreCase]); {$ENDIF} end; Result := StringReplace(Result, EnvVarCommanderPath, ExcludeTrailingPathDelimiter(gpExePath), [rfReplaceAll, rfIgnoreCase]); Result := StringReplace(Result, EnvVarConfigPath, ExcludeTrailingPathDelimiter(gpCfgDir), [rfReplaceAll, rfIgnoreCase]); end; function ReplaceTilde(const Path: String): String; begin {$IFDEF UNIX} if StrBegins(Path, '~') and ((Length(Path) = 1) or (Path[2] = PathDelim)) then Result := GetHomeDir + Copy(Path, 2, MaxInt) else {$ENDIF} Result := Path; end; function mbExpandFileName(const sFileName: UTF8String): UTF8String; begin Result:= NormalizePathDelimiters(sFileName); Result:= ReplaceEnvVars(Result); if Pos(PathDelim, Result) <> 0 then Result:= ExpandFileName(Result); end; function cnvFormatFileSize(iSize: Int64; FSF: TFileSizeFormat): String; var d: Double; begin case FSF of fsfFloat: begin if iSize div (1024*1024*1024) > 0 then begin Result:=FloatToStrF((iSize*16 div (1024*1024*1024))/16, ffFixed, 15, 1)+' G' end else if iSize div (1024*1024) >0 then begin Result:=FloatToStrF((iSize*10 div (1024*1024))/10, ffFixed, 15, 1)+' M' end else if iSize div 1024 >0 then begin Result:=FloatToStrF((iSize*10 div 1024)/10, ffFixed, 15, 1)+' K' end else Result:=IntToStr(iSize); end; fsfB: begin d:=iSize; Result:=Format('%8.0n',[d]); end; fsfK: begin Result:=FloatToStrF((iSize*10 div 1024)/10, ffFixed, 15, 1)+' K' end; fsfM: begin Result:=FloatToStrF((iSize*10 div (1024*1024))/10, ffFixed, 15, 1)+' M' end; fsfG: begin Result:=FloatToStrF((iSize*16 div (1024*1024*1024))/16, ffFixed, 15, 1)+' G' end; end; end; function cnvFormatFileSize(iSize: Int64; FSF: Boolean): String; begin Result := cnvFormatFileSize(iSize, fsfFloat); end; function cnvFormatFileSize(iSize: Int64): String; begin Result := cnvFormatFileSize(iSize, gFileSizeFormat); end; { This function based on code from http://www.delphirus.com.ru } {=========================================================} function MinimizeFilePath(const PathToMince: String; Canvas: TCanvas; MaxLen: Integer): String; {=========================================================} // "C:\Program Files\Delphi\DDropTargetDemo\main.pas" // "C:\Program Files\..\main.pas" Var sl: TStringList; sHelp, sFile, sFirst: String; iPos: Integer; Begin if MaxLen <= 0 then Exit; sHelp := PathToMince; iPos := Pos(PathDelim, sHelp); If iPos = 0 Then Begin Result := PathToMince; End Else Begin sl := TStringList.Create; // Decode string While iPos <> 0 Do Begin sl.Add(Copy(sHelp, 1, (iPos - 1))); sHelp := Copy(sHelp, (iPos + 1), Length(sHelp)); iPos := Pos(PathDelim, sHelp); End; If sHelp <> '' Then Begin sl.Add(sHelp); End; // Encode string sFirst := sl[0]; sFile := sl[sl.Count - 1]; sl.Delete(sl.Count - 1); Result := ''; MaxLen := MaxLen - Canvas.TextWidth('XXX'); if (sl.Count <> 0) and (Canvas.TextWidth(Result + sl[0] + PathDelim + sFile) < MaxLen) then begin While (sl.Count <> 0) and (Canvas.TextWidth(Result + sl[0] + PathDelim + sFile) < MaxLen) Do Begin Result := Result + sl[0] + PathDelim; sl.Delete(0); End; If sl.Count = 0 Then Begin Result := Result + sFile; End Else Begin Result := Result + '..' + PathDelim + sFile; End; end else If sl.Count = 0 Then Begin Result := sFirst + PathDelim; End Else Begin Result := sFirst + PathDelim + '..' + PathDelim + sFile; End; sl.Free; End; //DCDebug('PathX ' , Result); if Canvas.TextWidth(Result) > MaxLen + Canvas.TextWidth('XXX') then begin while (Length(Result) > 0) and (Canvas.TextWidth(Result) > MaxLen) do begin Delete(Result, Length(Result), 1); end; Result := Copy(Result, 1, Length(Result) - 3) + '...'; end; End; function MatchesFileList(const Files: TFiles; FileName: String): Boolean; var i: Integer; aFile: TFile; begin for i := 0 to Files.Count - 1 do begin aFile := Files[i]; if aFile.IsDirectory then begin // Check if 'FileName' is in this directory or any of its subdirectories. if IsInPath(aFile.FullPath, FileName, True, True) then Exit(True); end else begin // Item in the list is a file, only compare names. if aFile.FullPath = FileName then Exit(True); end; end; Result := False; end; function MatchesMaskListEx(const aFile: TFile; MaskList: TStringList): Boolean; var I: Integer; sMask, sFileName: UTF8String; begin Result:= False; for I:= 0 to MaskList.Count - 1 do begin sMask:= MaskList[I]; case GetPathType(sMask) of ptAbsolute: sFileName:= aFile.FullPath; else sFileName:= aFile.Name; end; // When a mask is ended with a PathDelim, it will match only directories if (Length(sMask) > 1) and (sMask[Length(sMask)] = PathDelim) then begin if aFile.IsDirectory then sMask:= ExcludeTrailingPathDelimiter(sMask) else Continue; end; if MatchesMaskList(sFileName, sMask) then Exit(True); end; end; function IsInPathList(sBasePathList: String; sPathToCheck: String; ASeparator: AnsiChar = ';'): Boolean; var sBasePath: String; begin sBasePathList := UTF8UpperCase(sBasePathList); sPathToCheck := UTF8UpperCase(sPathToCheck); repeat sBasePath := Copy2SymbDel(sBasePathList, ASeparator); if IsInPath(sBasePath, sPathToCheck, True, True) then Exit(True); until Length(sBasePathList) = 0; Result := False end; procedure ChangeFileListRoot(sNewRootPath: String; Files: TFiles); var i: Integer; aFile: TFile; begin if IsInPath(sNewRootPath, Files.Path, True, True) then begin // Current path is a subpath of new root path. for i := 0 to Files.Count - 1 do begin aFile := Files[i]; aFile.Path := ExtractDirLevel(sNewRootPath, aFile.Path); end; Files.Path := ExtractDirLevel(sNewRootPath, Files.Path); end else begin // Current path has a different base than new root path. if sNewRootPath <> EmptyStr then sNewRootPath := IncludeTrailingPathDelimiter(sNewRootPath); for i := 0 to Files.Count - 1 do begin aFile := Files[i]; aFile.Path := sNewRootPath + ExtractDirLevel(Files.Path, aFile.Path); end; Files.Path := sNewRootPath; end; end; function FixExeExt(const sFileName: UTF8String): UTF8String; var ExeExt: UTF8String; begin Result:= sFileName; ExeExt:= GetExeExt; if not SameText(ExeExt, ExtractFileExt(sFileName)) then Result:= ChangeFileExt(sFileName, ExeExt); end; function TrimQuotes(const Str: String): String; begin Result:= TrimSet(Str, ['"', '''']); end; function QuoteStr(const Str: String): String; {$IF DEFINED(UNIX)} begin // Default method is to escape every special char with backslash. Result := EscapeNoQuotes(Str); end; {$ELSE} begin // On Windows only double quotes can be used for quoting. // The double quotes on Windows can be nested, e.g., // "cmd /C "type "Some long file name""" or // "cmd /C ""some long file.exe" "long param1" "long param2"" Result := QuoteDouble(Str); end; {$ENDIF} {$IF DEFINED(UNIX)} function QuoteSingle(const Str: String): String; begin Result := '''' + EscapeSingleQuotes(Str) + ''''; end; {$ENDIF} function QuoteDouble(const Str: String): String; begin {$IF DEFINED(UNIX)} Result := '"' + EscapeDoubleQuotes(Str) + '"'; {$ELSEIF DEFINED(MSWINDOWS)} // Nothing needs to be escaped on Windows, because only double quote (") itself // would need to be escaped but there's no standard mechanism for escaping it. // It seems every application handles it on their own and CMD doesn't support it at all. // Also double quote is a forbidden character on FAT, NTFS. Result := '"' + Str + '"'; {$ENDIF} end; {$IF DEFINED(UNIX)} function EscapeString(const Str: String; const EscapeChars: TCharSet; const EscapeWith: String): String; var StartPos: Integer = 1; CurPos: Integer = 1; begin Result := ''; while CurPos <= Length(Str) do begin if Str[CurPos] in EscapeChars then begin Result := Result + Copy(Str, StartPos, CurPos - StartPos) + EscapeWith; // The character being quoted will be copied later. StartPos := CurPos; end; Inc(CurPos); end; Result := Result + Copy(Str, StartPos, CurPos - StartPos); end; function EscapeSingleQuotes(const Str: String): String; begin // Single quotes are strong quotes - no special characters are recognized // inside those quotes, so only ' needs to be escaped. Result := EscapeString(Str, [''''], '''\'''); end; function EscapeDoubleQuotes(const Str: String): String; begin // Double quotes are weak quotes and a few special characters are allowed // which need to be escaped. Result := EscapeString(Str, DoubleQuotesSpecialChars, '\'); end; function EscapeNoQuotes(const Str: String): String; begin // When neither single nor double quotes are used several special characters // need to be escaped with backslash (single character quote). Result := EscapeString(Str, NoQuotesSpecialChars, '\'); end; // Helper for RemoveQuotation and SplitCmdLine. procedure RemoveQuotationOrSplitCmdLine(sCmdLine: String; out sCommand: String; out Args: TDynamicStringArray; bSplitArgs: Boolean); var I : Integer; QuoteChar : Char; CurrentArg: String = ''; DoubleQuotesEscape: Boolean = False; procedure AddArgument; begin if bSplitArgs then begin if sCommand = '' then sCommand := CurrentArg else begin SetLength(Args, Length(Args) + 1); Args[Length(Args) - 1] := CurrentArg; end; CurrentArg := ''; end; end; begin sCommand := ''; SetLength(Args, 0); QuoteChar := #0; for I := 1 to Length(sCmdLine) do case QuoteChar of '\': begin if sCmdLine[I] <> #10 then begin if not (sCmdLine[I] in NoQuotesSpecialChars) then CurrentArg := CurrentArg + '\'; CurrentArg := CurrentArg + sCmdLine[I]; end; QuoteChar := #0; end; '''': begin if sCmdLine[I] = '''' then QuoteChar := #0 else CurrentArg := CurrentArg + sCmdLine[I]; end; '"': begin if DoubleQuotesEscape then begin if not (sCmdLine[I] in DoubleQuotesSpecialChars) then CurrentArg := CurrentArg + '\'; CurrentArg := CurrentArg + sCmdLine[I]; DoubleQuotesEscape := False; end else begin case sCmdLine[I] of '\': DoubleQuotesEscape := True; '"': QuoteChar := #0; else CurrentArg := CurrentArg + sCmdLine[I]; end; end; end; else begin case sCmdLine[I] of '\', '''', '"': QuoteChar := sCmdLine[I]; ' ', #9: if CurrentArg <> '' then AddArgument; #10: AddArgument; else CurrentArg := CurrentArg + sCmdLine[I]; end; end; end; if QuoteChar <> #0 then raise EInvalidQuoting.Create; if CurrentArg <> '' then AddArgument; if (not bSplitArgs) then sCommand := CurrentArg; end; {$ENDIF} function RemoveQuotation(const Str: String): String; {$IF DEFINED(MSWINDOWS)} var TrimmedStr: String; begin if Length(Str) = 0 then Result := EmptyStr else begin TrimmedStr := Trim(Str); if (TrimmedStr[1] = '"') and (TrimmedStr[Length(TrimmedStr)] = '"') then Result := Copy(TrimmedStr, 2, Length(TrimmedStr) - 2) else Result := Str; end; end; {$ELSEIF DEFINED(UNIX)} var Args: TDynamicStringArray; begin RemoveQuotationOrSplitCmdLine(Str, Result, Args, False); end; {$ENDIF} {$IF DEFINED(UNIX)} procedure SplitCmdLine(sCmdLine: String; out sCommand: String; out Args: TDynamicStringArray); begin RemoveQuotationOrSplitCmdLine(sCmdLine, sCommand, Args, True); end; {$ELSEIF DEFINED(MSWINDOWS)} procedure SplitCmdLine(sCmdLine : String; var sCmd, sParams : String); var iPos : Integer; begin if Pos('"', sCmdLine) = 1 then begin iPos := CharPos('"', sCmdLine, 2); if iPos = 0 then raise EInvalidQuoting.Create; sCmd := Copy(sCmdLine, 2, iPos - 2); sParams := Copy(sCmdLine, iPos + 2, Length(sCmdLine) - iPos + 1) end else begin iPos := Pos(#32, sCmdLine); if iPos <> 0 then begin sCmd := Copy(sCmdLine, 1, iPos - 1); sParams := Copy(sCmdLine, iPos + 1, Length(sCmdLine) - iPos + 1) end else begin sCmd := sCmdLine; sParams := ''; end; end; end; {$ENDIF} function CompareStrings(const s1, s2: UTF8String; Natural: Boolean; CaseSensitivity: TCaseSensitivity): PtrInt; inline; begin if Natural then Result:= StrFloatCmpW(PWideChar(UTF8Decode(s1)), PWideChar(UTF8Decode(s2)), CaseSensitivity) else begin case CaseSensitivity of cstNotSensitive: Result := WideCompareText(UTF8Decode(s1), UTF8Decode(s2)); cstLocale: Result := WideCompareStr(UTF8Decode(s1), UTF8Decode(s2)); cstCharValue: Result := SysUtils.CompareStr(S1, S2); else raise Exception.Create('Invalid CaseSensitivity parameter'); end; end; end; procedure InsertFirstItem(sLine: String; comboBox: TCustomComboBox); var I: Integer = 0; begin if sLine = EmptyStr then Exit; with comboBox.Items do begin // Use case sensitive search while (I < Count) and (CompareStr(Strings[I], sLine) <> 0) do Inc(I); if (I < 0) or (I >= Count) then comboBox.Items.Insert(0, sLine) else if (I > 0) then begin comboBox.Items.Move(I, 0); // Reset selected item (and combobox text), because Move has destroyed it. comboBox.ItemIndex := 0; end; end; end; function WideStrComp(const Str1, Str2 : WideString): PtrInt; var counter: SizeInt = 0; pstr1, pstr2: PWideChar; Begin pstr1 := PWideChar(Str1); pstr2 := PWideChar(Str2); While pstr1[counter] = pstr2[counter] do Begin if (pstr2[counter] = #0) or (pstr1[counter] = #0) then break; Inc(counter); end; Result := ord(pstr1[counter]) - ord(pstr2[counter]); end; function StrFloatCmpW(str1, str2: PWideChar; CaseSensitivity: TCaseSensitivity): PtrInt; var is_digit1, is_digit2: boolean; string_result: ptrint = 0; number_result: ptrint = 0; number1_size: ptrint = 0; number2_size: ptrint = 0; str_cmp: function(const s1, s2: WideString): PtrInt; function is_digit(c: widechar): boolean; inline; begin result:= (c in ['0'..'9']); end; function is_point(c: widechar): boolean; inline; begin result:= (c in [',', '.']); end; begin // Set up compare function case CaseSensitivity of cstNotSensitive: str_cmp:= WideStringManager.CompareTextWideStringProc; cstLocale: str_cmp:= WideStringManager.CompareWideStringProc; cstCharValue: str_cmp:= @WideStrComp; else raise Exception.Create('Invalid CaseSensitivity parameter'); end; while (true) do begin // compare string part while (true) do begin if str1^ = #0 then begin if str2^ <> #0 then exit(-1) else exit(0); end; if str2^ = #0 then begin if str1^ <> #0 then exit(+1) else exit(0); end; is_digit1 := is_digit(str1^); is_digit2 := is_digit(str2^); if (is_digit1 and is_digit2) then break; if (is_digit1 and not is_digit2) then exit(-1); if (is_digit2 and not is_digit1) then exit(+1); string_result:= str_cmp(str1^, str2^); if (string_result <> 0) then exit(string_result); inc(str1); inc(str2); end; // skip leading zeroes for number while (str1^ = '0') do inc(str1); while (str2^ = '0') do inc(str2); // compare number before decimal point while (true) do begin is_digit1 := is_digit(str1^); is_digit2 := is_digit(str2^); if (not is_digit1 and not is_digit2) then break; if ((number_result = 0) and is_digit1 and is_digit2) then begin if (str1^ > str2^) then number_result := +1 else if (str1^ < str2^) then number_result := -1 else number_result := 0; end; if (is_digit1) then begin inc(str1); inc(number1_size); end; if (is_digit2) then begin inc(str2); inc(number2_size); end; end; if (number1_size <> number2_size) then exit(number1_size - number2_size); if (number_result <> 0) then exit(number_result); // if there is a decimal point, compare number after one if (is_point(str1^) or is_point(str2^)) then begin if (is_point(str1^)) then inc(str1); if (is_point(str2^)) then inc(str2); while (true) do begin is_digit1 := is_digit(str1^); is_digit2 := is_digit(str2^); if (not is_digit1 and not is_digit2) then break; if (is_digit1 and not is_digit2) then begin while (str1^ = '0') do inc(str1); if (is_digit(str1^)) then exit(+1) else break; end; if (is_digit2 and not is_digit1) then begin while (str2^ = '0') do inc(str2); if (is_digit(str2^)) then exit(-1) else break; end; if (str1^ > str2^) then exit(+1) else if (str1^ < str2^) then exit(-1); inc(str1); inc(str2); end; end; end; end; function EstimateRemainingTime(StartValue, CurrentValue, EndValue: Int64; StartTime: TDateTime; CurrentTime: TDateTime; out SpeedPerSecond: Int64): TDateTime; var Speed: Double; begin SpeedPerSecond := 0; Result := 0; if (CurrentValue > StartValue) and (CurrentTime > StartTime) then begin Speed := Double(CurrentValue - StartValue) / (CurrentTime - StartTime); Result := Double(EndValue - CurrentValue) / Speed; SpeedPerSecond := Trunc(Speed) div SecsPerDay; end; end; function ModColor(AColor: TColor; APercent: Byte) : TColor; var R, G, B : Byte; begin RedGreenBlue(ColorToRGB(AColor), R, G, B); R := R * APercent div 100; G := G * APercent div 100; B := B * APercent div 100; Result := RGBToColor(R, G, B); end; function DarkColor(AColor: TColor; APercent: Byte): TColor; var R, G, B: Byte; begin RedGreenBlue(ColorToRGB(AColor), R, G, B); R:= R - MulDiv(R, APercent, 100); G:= G - MulDiv(G, APercent, 100); B:= B - MulDiv(B, APercent, 100); Result:= RGBToColor(R, G, B); end; function LightColor(AColor: TColor; APercent: Byte): TColor; var R, G, B: Byte; begin RedGreenBlue(ColorToRGB(AColor), R, G, B); R:= R + MulDiv(255 - R, APercent, 100); G:= G + MulDiv(255 - G, APercent, 100); B:= B + MulDiv(255 - B, APercent, 100); Result:= RGBToColor(R, G, B); end; procedure SetColorInColorBox(const lcbColorBox: TColorBox; const lColor: TColor); //< select in lcbColorBox lColor if lColor in lcbColorBox else // add to lcbColorBox lColor and select him var I: LongInt; begin if (lcbColorBox = nil) then Exit; // if lcbColorBox not exist with lcbColorBox do begin // search lColor in colorbox colorlist for I:= 0 to Items.Count - 1 do if Colors[I] = lColor then // find color begin // select color Selected:= lColor; Exit; end;// if for //add items to colorbox list Items.Objects[Items.Add('$'+HexStr(lColor, 8))]:= TObject(PtrInt(lColor)); Selected:= lColor; end; // with end; procedure UpdateColor(Control: TControl; Checked: Boolean); begin if Checked then Control.Color:= clDefault else Control.Color:= $FFFFFFFF8000000F; end; procedure EnableControl(Control: TControl; Enabled: Boolean); begin Control.Enabled:= Enabled; {$IF DEFINED(LCLWIN32)} if Enabled then begin Control.Color:= clDefault; Control.Font.Color:= clDefault; end else begin Control.Color:= clBtnFace; Control.Font.Color:= clGrayText; end; {$ENDIF} end; end. doublecmd-0.5.8/src/uhash.pas0000644000175000017500000001054711740433676015134 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- General Hash Unit: This unit defines the common types, functions, and procedures Copyright (C) 2009-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uHash; {$mode objfpc}{$H+} interface uses Classes, SysUtils, DCPcrypt2, crc; type THashContext = TDCP_hash; THashAlgorithm = (HASH_HAVAL, HASH_MD4, HASH_MD5, HASH_RIPEMD128, HASH_RIPEMD160, HASH_SFV, HASH_SHA1, HASH_SHA256, HASH_SHA384, HASH_SHA512, HASH_TIGER ); var HashFileExt: array[THashAlgorithm] of String = ( 'haval', 'md4', 'md5', 'ripemd128', 'ripemd160', 'sfv', 'sha', 'sha256', 'sha384', 'sha512', 'tiger' ); procedure HashInit(out Context: THashContext; const Algorithm: THashAlgorithm); procedure HashUpdate(var Context: THashContext; const Buffer; BufLen: LongWord); procedure HashFinal(var Context: THashContext; out Hash: String); function HashString(const Line: String; IgnoreCase, IgnoreWhiteSpace: Boolean): Pointer; { Helper functions } function FileExtIsHash(const FileExt: String): Boolean; function FileExtToHashAlg(const FileExt: String): THashAlgorithm; implementation uses DCPhaval, DCPmd4, DCPmd5, DCPripemd128, DCPripemd160, DCPsfv, DCPsha1, DCPsha256, DCPsha512, DCPtiger; procedure HashInit(out Context: THashContext; const Algorithm: THashAlgorithm); begin case Algorithm of HASH_HAVAL: Context:= TDCP_haval.Create(nil); HASH_MD4: Context:= TDCP_md4.Create(nil); HASH_MD5: Context:= TDCP_md5.Create(nil); HASH_RIPEMD128: Context:= TDCP_ripemd128.Create(nil); HASH_RIPEMD160: Context:= TDCP_ripemd160.Create(nil); HASH_SFV: Context:= TDCP_sfv.Create(nil); HASH_SHA1: Context:= TDCP_sha1.Create(nil); HASH_SHA256: Context:= TDCP_sha256.Create(nil); HASH_SHA384: Context:= TDCP_sha384.Create(nil); HASH_SHA512: Context:= TDCP_sha512.Create(nil); HASH_TIGER: Context:= TDCP_tiger.Create(nil); end; Context.Init; end; procedure HashUpdate(var Context: THashContext; const Buffer; BufLen: LongWord); begin Context.Update(Buffer, BufLen); end; procedure HashFinal(var Context: THashContext; out Hash: String); var I, HashSize: LongWord; Digest: array of Byte; begin Hash:= EmptyStr; HashSize:= Context.HashSize div 8; SetLength(Digest, HashSize); Context.Final(Pointer(Digest)^); for I := 0 to HashSize - 1 do Hash := Hash + HexStr(Digest[I], 2); Hash := LowerCase(Hash); FreeAndNil(Context); end; function HashString(const Line: String; IgnoreCase, IgnoreWhiteSpace: Boolean): Pointer; var CRC: LongWord; I, J, L: Integer; S: String; begin S := Line; if IgnoreWhiteSpace then begin J := 1; L := Length(Line); for I:= 1 to L do begin // Skip white spaces if not (Line[I] in [#9, #32]) then begin S[J] := Line[I]; Inc(J); end; end; SetLength(S, J - 1); end; if IgnoreCase then S := AnsiLowerCase(S); CRC := crc32(0, nil, 0); // Return result as a pointer to save typecasting later... Result := Pointer(PtrUInt(crc32(CRC, PByte(S), Length(S)))); end; function FileExtIsHash(const FileExt: String): Boolean; var I: THashAlgorithm; begin Result:= False; for I:= Low(HashFileExt) to High(HashFileExt) do begin if SameText(FileExt, HashFileExt[I]) then Exit(True); end; end; function FileExtToHashAlg(const FileExt: String): THashAlgorithm; var I: THashAlgorithm; begin for I:= Low(HashFileExt) to High(HashFileExt) do begin if SameText(FileExt, HashFileExt[I]) then Exit(I); end; end; end. doublecmd-0.5.8/src/dmhelpmanager.pas0000644000175000017500000000453511740427612016621 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Help manager Copyright (C) 2008 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit dmHelpManager; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, Dialogs, LazHelpHTML; type { TdmHelpManager } TdmHelpManager = class(TDataModule) HTMLBrowserHelpViewer: THTMLBrowserHelpViewer; HTMLHelpDatabase: THTMLHelpDatabase; procedure DataModuleCreate(Sender: TObject); private { private declarations } public { public declarations } end; var dmHelpMgr: TdmHelpManager; implementation {$R *.lfm} uses {$IFDEF MSWindows} LCLIntf, {$ENDIF} uGlobsPaths, uGlobs, DCStrUtils, DCOSUtils, StrUtils; { TdmHelpManager } procedure TdmHelpManager.DataModuleCreate(Sender: TObject); {$IFDEF MSWindows} var ABrowser, AParams: String; {$ENDIF} begin if NumCountChars('.', gPOFileName) < 2 then gHelpLang:= 'en' else begin gHelpLang:= ExtractDelimited(2, gPOFileName, ['.']); if not mbDirectoryExists(gpExePath + 'doc' + PathDelim + gHelpLang) then gHelpLang:= 'en'; end; HTMLHelpDatabase.BaseURL:= 'file://' + gpExePath + 'doc' + PathDelim + gHelpLang; HTMLHelpDatabase.KeywordPrefix:= '/'; {$IFDEF MSWindows} // Lazarus issue #0021637. if FindDefaultBrowser(ABrowser, AParams) then begin HTMLBrowserHelpViewer.BrowserPath := ABrowser; HTMLBrowserHelpViewer.BrowserParams := StringReplace(AParams, '%s', '"%s"', [rfReplaceAll]); end; {$ENDIF} end; end. doublecmd-0.5.8/src/ufileprocs.pas0000644000175000017500000001567011742542461016174 0ustar alexxalexx{ Seksi Commander ---------------------------- Licence : GNU GPL v 2.0 Author : radek.cervinka@centrum.cz some file routines contributors: Mattias Gaertner (from Lazarus code) Copyright (C) 2007-2010 Koblov Alexander (Alexx2000@mail.ru) } unit uFileProcs; {$mode objfpc}{$H+} interface uses Classes; {en Create a chain of directories @param(DirectoryName The full path to directory) @returns(@true if DirectoryName already existed or was created succesfully. If it failed to create any of the parts, @false is returned.) } function mbForceDirectory(DirectoryName: string): boolean; {en Copies a file. @param(sSrc String expression that specifies the name of the file to be copied) @param(sDst String expression that specifies the target file name) @returns(The function returns @true if successful, @false otherwise) } function CopyFile(const sSrc, sDst: String; bAppend: Boolean = False): Boolean; {en Remove the contents of directory recursively @param(sFolderName String expression that specifies the name of the folder to be removed) } procedure DelTree(const sFolderName: String); {en Read string from a text file into variable and goto next line @param(hFile Handle of file) @param(S Stores the result string) } function FileReadLn(hFile: THandle; out S: String): Boolean; {en Write string to a text file and append newline @param(hFile Handle of file) @param(S String for writing) } procedure FileWriteLn(hFile: Integer; S: String); function GetNextCopyName(FileName: UTF8String): UTF8String; implementation uses LCLProc, Dialogs, SysUtils, uLng, uGlobs, DCClassesUtf8, DCStrUtils, DCOSUtils, uFileSystemFileSource, uFile, uFileSystemDeleteOperation, uFileSourceOperationOptions; const cBlockSize=16384; // size of block if copyfile // if pb is assigned > use, else work without pb :-) function CopyFile(const sSrc, sDst: String; bAppend: Boolean): Boolean; var src: TFileStreamEx = nil; dst: TFileStreamEx = nil; iDstBeg:Integer; // in the append mode we store original size Buffer: PChar = nil; CopyPropertiesOptions: TCopyAttributesOptions; begin Result:=False; if not mbFileExists(sSrc) then Exit; GetMem(Buffer,cBlockSize+1); try try src:=TFileStreamEx.Create(sSrc,fmOpenRead or fmShareDenyNone); if not Assigned(src) then Exit; if bAppend then begin dst:=TFileStreamEx.Create(sDst,fmOpenReadWrite); dst.Seek(0,soFromEnd); // seek to end end else dst:=TFileStreamEx.Create(sDst,fmCreate); if not Assigned(dst) then Exit; iDstBeg:=dst.Size; // we dont't use CopyFrom, because it's alocate and free buffer every time is called while (dst.Size+cBlockSize)<= (src.Size+iDstBeg) do begin Src.ReadBuffer(Buffer^, cBlockSize); dst.WriteBuffer(Buffer^, cBlockSize); end; if (iDstBeg+src.Size)>dst.Size then begin // dst.CopyFrom(src,src.Size-dst.size); src.ReadBuffer(Buffer^, src.Size+iDstBeg-dst.size); dst.WriteBuffer(Buffer^, src.Size+iDstBeg-dst.size); end; CopyPropertiesOptions := CopyAttributesOptionCopyAll; if gDropReadOnlyFlag then Include(CopyPropertiesOptions, caoRemoveReadOnlyAttr); Result := mbFileCopyAttr(sSrc, sDst, CopyPropertiesOptions) = []; // chmod, chgrp except on EStreamError do MessageDlg('Error', Format(rsMsgErrCannotCopyFile, [sSrc, sDst]), mtError, [mbOK], 0); end; finally if assigned(src) then FreeAndNil(src); if assigned(dst) then FreeAndNil(dst); if assigned(Buffer) then FreeMem(Buffer); end; end; procedure DelTree(const sFolderName: String); var DeleteOperation: TFileSystemDeleteOperation = nil; aFiles: TFiles = nil; begin aFiles := TFiles.Create(sFolderName); try aFiles.Add(TFileSystemFileSource.CreateFileFromFile(sFolderName)); DeleteOperation := TFileSystemDeleteOperation.Create( TFileSystemFileSource.GetFileSource, aFiles); DeleteOperation.DeleteReadOnly := fsoogYes; DeleteOperation.SymLinkOption := fsooslDontFollow; DeleteOperation.SkipErrors := True; DeleteOperation.Execute; finally FreeThenNil(aFiles); FreeThenNil(DeleteOperation); end; end; function FileReadLn(hFile: THandle; out S: String): Boolean; const cBufSize = 4096; var Buf: array[1..cBufSize] of Char; iNumRead, iCounter, iBufPos: Integer; bEOLFound: Boolean; iFilePos, iFileSize: Int64; begin S:=''; Result:= False; // get current position iFilePos:= FileSeek(hFile, 0, soFromCurrent); // get file size iFileSize:= FileSeek(hFile, 0, soFromEnd); // restore position FileSeek(hFile, iFilePos, soFromBeginning); bEOLFound:= False; while (iFilePos < iFileSize) and not bEOLFound do begin iNumRead:= FileRead(hFile, Buf, SizeOf(Buf)); for iCounter:= 1 to iNumRead do begin if Buf[iCounter] in [#13, #10] then begin bEOLFound:=True; iBufPos:=iCounter+1; if ((iBufPos) <= iNumRead) and (Buf[iBufPos] in [#13, #10]) then Inc(iBufPos); Buf[iCounter]:= #0; S:= StrPas(@Buf); FileSeek(hFile, iFilePos+iBufPos-1, soFromBeginning); Exit(True); end; end; // for if (not bEOLFound) then begin if (iNumRead < cBufSize) then Buf[iNumRead+1]:= #0; S:= StrPas(@Buf); end; Inc(iFilePos, iNumRead); end; // while end; procedure FileWriteLn(hFile: Integer; S: String); begin S:= S + LineEnding; FileWrite(hFile, PChar(S)[0], Length(S)); end; function mbForceDirectory(DirectoryName: string): boolean; var i: integer; sDir: string; begin if DirectoryName = '' then Exit; DirectoryName := IncludeTrailingPathDelimiter(DirectoryName); i:= 1; if Pos('\\', DirectoryName) = 1 then // if network path begin i := CharPos(PathDelim, DirectoryName, 3); // index of the end of computer name i := CharPos(PathDelim, DirectoryName, i + 1); // index of the end of first remote directory end; // Move past path delimiter at the beginning. if (i = 1) and (DirectoryName[i] = PathDelim) then i := i + 1; while i<=length(DirectoryName) do begin if DirectoryName[i]=PathDelim then begin sDir:=copy(DirectoryName,1,i-1); if not mbDirectoryExists(sDir) then begin Result:=mbCreateDir(sDir); if not Result then exit; end; end; Inc(i); end; Result := True; end; function GetNextCopyName(FileName: UTF8String): UTF8String; var CopyNumber: Int64 = 1; sFilePath, sFileName: UTF8String; begin sFilePath:= ExtractFilePath(FileName); sFileName:= ExtractFileName(FileName); repeat Result := sFilePath + Format(rsCopyNameTemplate, [CopyNumber, sFileName]); Inc(CopyNumber); until not mbFileSystemEntryExists(Result); end; end. doublecmd-0.5.8/src/foptions.pas0000644000175000017500000002262611747231502015655 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Implementing of Options dialog Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) contributors: Radek Cervinka This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptions; {$mode objfpc}{$H+} interface uses SysUtils, Classes, Controls, Forms, Dialogs, ExtCtrls, ComCtrls, Buttons, StdCtrls, fgl, uGlobs, fOptionsFrame; type { TOptionsEditorView } TOptionsEditorView = class EditorClass: TOptionsEditorClass; Instance: TOptionsEditor; TreeNode: TTreeNode; end; TOptionsEditorViews = specialize TFPGObjectList; { TfrmOptions } TfrmOptions = class(TForm, IOptionsDialog) lblEmptyEditor: TLabel; OptionsEditorsImageList: TImageList; Panel1: TPanel; Panel3: TPanel; pnlCaption: TPanel; btnOK: TBitBtn; btnApply: TBitBtn; btnCancel: TBitBtn; sboxOptionsEditor: TScrollBox; tvTreeView: TTreeView; splOptionsSplitter: TSplitter; procedure btnCancelClick(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormCreate(Sender: TObject); procedure btnOKClick(Sender: TObject); procedure btnApplyClick(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure tvTreeViewChange(Sender: TObject; Node: TTreeNode); private FOptionsEditorList: TOptionsEditorViews; FOldEditor: TOptionsEditorView; function CreateEditor(EditorClass: TOptionsEditorClass): TOptionsEditor; procedure CreateOptionsEditorList; function GetEditor(EditorClass: TOptionsEditorClass): TOptionsEditor; procedure LoadSettings; procedure SelectEditor(EditorClassName: String); public constructor Create(TheOwner: TComponent); override; constructor Create(TheOwner: TComponent; EditorClass: TOptionsEditorClass); overload; constructor Create(TheOwner: TComponent; EditorClassName: String); overload; procedure LoadConfig; procedure SaveConfig; end; function ShowOptions(EditorClass: TOptionsEditorClass = nil): IOptionsDialog; function ShowOptions(EditorClassName: String): IOptionsDialog; implementation {$R *.lfm} uses LCLProc, LCLVersion, uLng, fMain; var LastOpenedEditor: TOptionsEditorClass = nil; frmOptions: TfrmOptions = nil; function ShowOptions(EditorClass: TOptionsEditorClass): IOptionsDialog; begin Result := ShowOptions(EditorClass.ClassName); end; function ShowOptions(EditorClassName: String): IOptionsDialog; begin if Assigned(frmOptions) then begin if frmOptions.WindowState = wsMinimized then frmOptions.WindowState:= wsNormal else frmOptions.BringToFront; frmOptions.SelectEditor(EditorClassName); end else begin if EditorClassName = '' then frmOptions := TfrmOptions.Create(Application) else frmOptions := TfrmOptions.Create(Application, EditorClassName); frmOptions.Show; end; Result := frmOptions; end; procedure TfrmOptions.FormCreate(Sender: TObject); begin // Initialize property storage InitPropStorage(Self); end; procedure TfrmOptions.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin CloseAction:= caFree; frmOptions:= nil; end; procedure TfrmOptions.btnCancelClick(Sender: TObject); begin // close window Close; end; procedure TfrmOptions.btnOKClick(Sender: TObject); begin // save all configuration SaveConfig; // write to config file SaveGlobs; // close window Close; end; procedure TfrmOptions.btnApplyClick(Sender: TObject); begin // save all configuration SaveConfig; // write to config file SaveGlobs; end; procedure TfrmOptions.FormDestroy(Sender: TObject); begin FreeThenNil(FOptionsEditorList); end; procedure TfrmOptions.CreateOptionsEditorList; procedure AddEditors(EditorClassList: TOptionsEditorClassList; RootNode: TTreeNode); var I: LongInt; aOptionsEditorClass: TOptionsEditorClass; aOptionsEditorView: TOptionsEditorView; TreeNode: TTreeNode; IconIndex: Integer; begin for I:= 0 to EditorClassList.Count - 1 do begin aOptionsEditorClass := EditorClassList[I].EditorClass; aOptionsEditorView := TOptionsEditorView.Create; aOptionsEditorView.EditorClass := aOptionsEditorClass; aOptionsEditorView.Instance := nil; FOptionsEditorList.Add(aOptionsEditorView); TreeNode := tvTreeView.Items.AddChild(RootNode, {$IF lcl_fullversion >= 093100} aOptionsEditorClass.GetTitle {$ELSE} StringReplace(aOptionsEditorClass.GetTitle, '&', '&&', [rfReplaceAll]) {$ENDIF} ); if Assigned(TreeNode) then begin IconIndex := aOptionsEditorClass.GetIconIndex; TreeNode.ImageIndex := IconIndex; TreeNode.SelectedIndex := IconIndex; TreeNode.StateIndex := IconIndex; TreeNode.Data := aOptionsEditorView; end; aOptionsEditorView.TreeNode := TreeNode; if EditorClassList[I].HasChildren then AddEditors(EditorClassList[I].Children, TreeNode); end; end; begin FOptionsEditorList:= TOptionsEditorViews.Create; AddEditors(OptionsEditorClassList, nil); end; function TfrmOptions.GetEditor(EditorClass: TOptionsEditorClass): TOptionsEditor; var I: Integer; begin for I := 0 to FOptionsEditorList.Count - 1 do begin if FOptionsEditorList[I].EditorClass = EditorClass then begin if not Assigned(FOptionsEditorList[I].Instance) then FOptionsEditorList[I].Instance := CreateEditor(FOptionsEditorList[I].EditorClass); Result := FOptionsEditorList[I].Instance; Exit; end; end; Result := nil; end; procedure TfrmOptions.LoadSettings; begin LoadConfig; end; procedure TfrmOptions.SelectEditor(EditorClassName: String); var I: Integer; begin for I := 0 to FOptionsEditorList.Count - 1 do begin if (FOptionsEditorList[I].EditorClass.ClassName = EditorClassName) then if Assigned(FOptionsEditorList[I].TreeNode) then begin FOptionsEditorList[I].TreeNode.Selected := True; Break; end; end; end; constructor TfrmOptions.Create(TheOwner: TComponent); begin if not Assigned(LastOpenedEditor) and (OptionsEditorClassList.Count > 0) then LastOpenedEditor := OptionsEditorClassList[0].EditorClass; // Select first editor. Create(TheOwner, LastOpenedEditor); end; constructor TfrmOptions.Create(TheOwner: TComponent; EditorClass: TOptionsEditorClass); begin if Assigned(EditorClass) then Create(TheOwner, EditorClass.ClassName) else Create(TheOwner, ''); end; constructor TfrmOptions.Create(TheOwner: TComponent; EditorClassName: String); begin if (EditorClassName = '') and Assigned(LastOpenedEditor) then EditorClassName := LastOpenedEditor.ClassName; FOldEditor := nil; inherited Create(TheOwner); CreateOptionsEditorList; SelectEditor(EditorClassName); end; procedure TfrmOptions.tvTreeViewChange(Sender: TObject; Node: TTreeNode); var SelectedEditorView: TOptionsEditorView; begin SelectedEditorView := TOptionsEditorView(Node.Data); if Assigned(SelectedEditorView) and (FOldEditor <> SelectedEditorView) then begin if Assigned(FOldEditor) and Assigned(FOldEditor.Instance) then FOldEditor.Instance.Visible := False; if not Assigned(SelectedEditorView.Instance) then SelectedEditorView.Instance := CreateEditor(SelectedEditorView.EditorClass); if Assigned(SelectedEditorView.Instance) then SelectedEditorView.Instance.Visible := True; lblEmptyEditor.Visible := not Assigned(SelectedEditorView.Instance); FOldEditor := SelectedEditorView; LastOpenedEditor := SelectedEditorView.EditorClass; pnlCaption.Caption := SelectedEditorView.EditorClass.GetTitle; end; end; function TfrmOptions.CreateEditor(EditorClass: TOptionsEditorClass): TOptionsEditor; begin if Assigned(EditorClass) and not EditorClass.IsEmpty then begin Result := EditorClass.Create(Self); Result.Align := alClient; Result.Visible := False; Result.Init(sboxOptionsEditor, Self, [oeifLoad]); end else Result := nil; end; procedure TfrmOptions.LoadConfig; var I: LongInt; begin { Load options to frames } for I:= 0 to FOptionsEditorList.Count - 1 do begin if Assigned(FOptionsEditorList[I].Instance) then FOptionsEditorList[I].Instance.LoadSettings; end; end; procedure TfrmOptions.SaveConfig; var I: LongInt; NeedsRestart: Boolean = False; begin { Save options from frames } for I:= 0 to FOptionsEditorList.Count - 1 do if Assigned(FOptionsEditorList[I].Instance) then if oesfNeedsRestart in FOptionsEditorList[I].Instance.SaveSettings then NeedsRestart := True; if NeedsRestart then MessageDlg(rsMsgRestartForApplyChanges, mtInformation, [mbOK], 0); frmMain.UpdateWindowView; end; end. doublecmd-0.5.8/src/fmkdir.pas0000644000175000017500000000264611740433676015301 0ustar alexxalexxunit fMkDir; {$mode objfpc}{$H+} interface uses SysUtils, Classes, Controls, Forms, StdCtrls, Buttons, ExtCtrls; type { TfrmMkDir } TfrmMkDir = class(TForm) btnCancel: TBitBtn; btnOK: TBitBtn; cbMkDir: TComboBox; lblMakeDir: TLabel; pnlButtons: TPanel; pnlBottom: TPanel; procedure FormKeyPress(Sender: TObject; var Key: Char); public function ShowMkDir(var sPath:string):Boolean; // 21.05.2009 - перенес в public end; var frmMkDir: TfrmMkDir; // 21.05.2009 - создаем из файла проекта implementation {$R *.lfm} procedure TfrmMkDir.FormKeyPress(Sender: TObject; var Key: Char); begin inherited; if Key=#27 then begin ModalResult:=mrCancel; Key := #0; end else if Key=#13 then begin ModalResult:=mrOK; Key:=#0; end; end; Function TfrmMkDir.ShowMkDir(var sPath:string):Boolean; var Index: Integer; const MAX_LINES = 20; begin ActiveControl := cbMkDir; if (sPath <> '..') then cbMkDir.Text := sPath else cbMkDir.Text := ''; cbMkDir.SelectAll; Result := (ShowModal = mrOK); sPath := cbMkDir.Text; If Result then begin Index := cbMkDir.Items.IndexOf(cbMkDir.Text); if (Index = -1) then cbMkDir.Items.Insert(0, cbMkDir.Text) else cbMkDir.Items.Move(Index, 0); if (cbMkDir.Items.Count > MAX_LINES) then cbMkDir.Items.Delete(cbMkDir.Items.Count - 1); end; end; end. doublecmd-0.5.8/src/fselecttextrange.pas0000644000175000017500000000246211740433676017370 0ustar alexxalexxunit fSelectTextRange; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ButtonPanel, Buttons; type { TfrmSelectTextRange } TfrmSelectTextRange = class(TForm) btpPanel: TButtonPanel; edtSelectText: TEdit; lblSelectText: TLabel; procedure edtSelectTextExit(Sender: TObject); private FSelStart, FSelFinish: LongInt; public { public declarations } end; function ShowSelectTextRangeDlg(const ACaption, AText: UTF8String; out iSelStart, iSelFinish: LongInt): Boolean; implementation {$R *.lfm} function ShowSelectTextRangeDlg(const ACaption, AText: UTF8String; out iSelStart, iSelFinish: LongInt): Boolean; begin with TfrmSelectTextRange.Create(Application) do try Caption:= ACaption; edtSelectText.Text:= AText; Result:= (ShowModal = mrOK); if Result then begin iSelStart:= FSelStart; iSelFinish:= FSelFinish; Result:= (FSelFinish >= FSelStart); end; finally Free; end; end; { TfrmSelectTextRange } procedure TfrmSelectTextRange.edtSelectTextExit(Sender: TObject); begin FSelStart:= edtSelectText.SelStart + 1; FSelFinish:= edtSelectText.SelStart + edtSelectText.SelLength; end; end. doublecmd-0.5.8/src/uconnectionmanager.pas0000644000175000017500000000353011655407045017671 0ustar alexxalexxunit uConnectionManager; {$mode delphi} interface uses Classes, SysUtils, uFileSource; type TFileSourceRecord = record FileSource: IFileSource; end; PFileSourceRecord = ^TFileSourceRecord; function NewFileSourceRecord(FileSource: IFileSource): PFileSourceRecord; procedure DisposeFileSourceRecord(FileSourceRecord: PFileSourceRecord); procedure AddNetworkConnection(const ConnectionName: UTF8String; FileSource: IFileSource); procedure RemoveNetworkConnection(const ConnectionName: UTF8String); var WfxConnectionList: TStringList = nil; implementation uses Menus, fMain; function NewFileSourceRecord(FileSource: IFileSource): PFileSourceRecord; begin New(Result); Result^.FileSource:= FileSource; end; procedure DisposeFileSourceRecord(FileSourceRecord: PFileSourceRecord); begin FileSourceRecord^.FileSource:= nil; Dispose(FileSourceRecord); end; procedure AddNetworkConnection(const ConnectionName: UTF8String; FileSource: IFileSource); var miTemp: TMenuItem; begin WfxConnectionList.AddObject(ConnectionName, TObject(NewFileSourceRecord(FileSource))); with frmMain do begin miTemp:= TMenuItem.Create(miNetworkDisconnect); miTemp.Caption:= ConnectionName; miNetworkDisconnect.Add(miTemp); end; end; procedure RemoveNetworkConnection(const ConnectionName: UTF8String); var I: Integer; begin I:= WfxConnectionList.IndexOf(ConnectionName); if I >= 0 then with frmMain do begin DisposeFileSourceRecord(PFileSourceRecord(WfxConnectionList.Objects[I])); WfxConnectionList.Delete(I); miNetworkDisconnect.Remove(miNetworkDisconnect.Find(ConnectionName)); end; end; initialization WfxConnectionList:= TStringList.Create; finalization if Assigned(WfxConnectionList) then FreeAndNil(WfxConnectionList); end. doublecmd-0.5.8/src/ucmdlineparams.pas0000644000175000017500000000532012166246353017016 0ustar alexxalexxunit uCmdLineParams; {$mode objfpc}{$H+} interface type TCommandLineParams = packed record NewTab: Boolean; ActiveRight: Boolean; LeftPath: array[0..1023] of AnsiChar; RightPath: array[0..1023] of AnsiChar; end; procedure ProcessCommandLineParams; var CommandLineParams: TCommandLineParams; implementation uses Forms, Dialogs, SysUtils, uOSUtils, uDCUtils, uGlobsPaths, getopts, uDebug, uLng; procedure ProcessCommandLineParams; var Option: AnsiChar = #0; OptionIndex: LongInt = 0; Options: array[1..2] of TOption; OptionUnknown: UTF8String; begin with Options[1] do begin Name:= 'no-console'; Has_arg:= 0; Flag:= nil; Value:= #0; end; with Options[2] do begin Name:= 'config-dir'; Has_arg:= 1; Flag:= nil; Value:= #0; end; FillChar(CommandLineParams, SizeOf(TCommandLineParams), #0); repeat try Option:= GetLongOpts('L:l:R:r:P:p:Tt', @Options[1], OptionIndex); except MessageDlg(Application.Title, rsMsgInvalidCommandLine, mtError, [mbOK], 0, mbOK); Exit; end; case Option of #0: begin case OptionIndex of 1: begin {$IF DEFINED(NIGHTLY_BUILD)} HideConsoleWindow; {$ENDIF} end; 2: begin gpCmdLineCfgDir:= ParamStrU(TrimQuotes(OptArg)); end; end; end; 'L', 'l': CommandLineParams.LeftPath:= ParamStrU(TrimQuotes(OptArg)); 'R', 'r': CommandLineParams.RightPath:= ParamStrU(TrimQuotes(OptArg)); 'P', 'p': CommandLineParams.ActiveRight:= (UpperCase(OptArg) = 'R'); 'T', 't': CommandLineParams.NewTab:= True; '?', ':': DCDebug ('Error with opt : ', OptOpt); end; { case } until Option = EndOfOptions; if OptInd <= ParamCount then begin // If also found one parameter then use it as path of active panel if ParamCount - OptInd = 0 then begin if CommandLineParams.ActiveRight then CommandLineParams.RightPath:= ParamStrU(OptInd) else CommandLineParams.LeftPath:= ParamStrU(OptInd); Inc(OptInd, 1); end // If also found two parameters then use it as paths in panels else if ParamCount - OptInd = 1 then begin CommandLineParams.LeftPath:= ParamStrU(OptInd); CommandLineParams.RightPath:= ParamStrU(OptInd + 1); Inc(OptInd, 2); end; // Unknown options, print to console if OptInd <= ParamCount then begin while OptInd <= ParamCount do begin OptionUnknown:= ParamStrU(OptInd) + ' '; Inc(OptInd) end; DCDebug ('Non options : ', OptionUnknown); end; end; end; end. doublecmd-0.5.8/src/ftweakplugin.pas0000644000175000017500000002603411740433676016522 0ustar alexxalexx{ Double commander ------------------------------------------------------------------------- Plugin tweak window Copyright (C) 2008-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fTweakPlugin; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, ExtCtrls, StdCtrls, uWCXModule, uTypes; type { TfrmTweakPlugin } TfrmTweakPlugin = class(TForm) btnAdd: TButton; btnCancel: TButton; btnChange: TButton; btnDefault: TButton; btnOK: TButton; btnRemove: TButton; cbExt: TComboBox; cbPK_CAPS_BY_CONTENT: TCheckBox; cbPK_CAPS_DELETE: TCheckBox; cbPK_CAPS_ENCRYPT: TCheckBox; cbPK_CAPS_HIDE: TCheckBox; cbPK_CAPS_MEMPACK: TCheckBox; cbPK_CAPS_MODIFY: TCheckBox; cbPK_CAPS_MULTIPLE: TCheckBox; cbPK_CAPS_NEW: TCheckBox; cbPK_CAPS_OPTIONS: TCheckBox; cbPK_CAPS_SEARCHTEXT: TCheckBox; edtDescription: TEdit; edtDetectStr: TEdit; edtName: TEdit; edtPlugin: TEdit; pnlTweakOther: TPanel; lblDescription: TLabel; lblDetectStr: TLabel; lblName: TLabel; lblExtension: TLabel; lblFlags: TLabel; lblFlagsValue: TLabel; lblPlugin1: TLabel; lblPackerPlugin: TLabel; lblPlugin: TLabel; edtPlugin1: TEdit; nbTweakAll: TNotebook; pnlButtons: TPanel; pnlFlags: TPanel; pnlPackerExtsButtons: TPanel; pgTweakPacker: TPage; pgTweakOther: TPage; pnlTweak: TPanel; procedure btnAddClick(Sender: TObject); procedure btnChangeClick(Sender: TObject); procedure btnDefaultClick(Sender: TObject); procedure btnRemoveClick(Sender: TObject); procedure cbExtChange(Sender: TObject); procedure cbPackerFlagsClick(Sender: TObject); procedure FormCreate(Sender: TObject); private FWCXPlugins: TWCXModuleList; FPluginFileName: String; iPrevIndex: Integer; function GetDefaultFlags(PluginFileName: String): PtrInt; public constructor Create(TheOwner: TComponent); override; destructor Destroy; override; end; function ShowTweakPluginDlg(PluginType: TPluginType; PluginIndex: Integer): Boolean; implementation {$R *.lfm} uses Dialogs, fOptionsPlugins, WcxPlugin, uDCUtils, uLng, LCLVersion; function ShowTweakPluginDlg(PluginType: TPluginType; PluginIndex: Integer): Boolean; var I, iIndex: Integer; begin with TfrmTweakPlugin.Create(Application) do try case PluginType of ptDSX: begin nbTweakAll.PageIndex:= 1; edtPlugin1.Text:= tmpDSXPlugins.GetDsxModule(PluginIndex).FileName; edtDescription.Text:= tmpDSXPlugins.GetDsxModule(PluginIndex).Descr; edtName.Text:= tmpDSXPlugins.GetDsxModule(PluginIndex).Name; lblDetectStr.Visible:= False; edtDetectStr.Visible:= False; end; ptWCX: begin nbTweakAll.PageIndex:= 0; FWCXPlugins:= TWCXModuleList.Create; FWCXPlugins.Assign(tmpWCXPlugins); FPluginFileName := FWCXPlugins.FileName[PluginIndex]; edtPlugin.Text:= FPluginFileName; for I:= 0 to FWCXPlugins.Count - 1 do if FWCXPlugins.FileName[I] = edtPlugin.Text then cbExt.Items.AddObject(FWCXPlugins.Ext[I], TObject(FWCXPlugins.Flags[I])); iPrevIndex:= -1; cbExt.ItemIndex:= 0; cbExtChange(cbExt); btnRemove.Enabled:= (cbExt.Items.Count > 1); end; ptWDX: begin nbTweakAll.PageIndex:= 1; edtPlugin1.Text:= tmpWDXPlugins.GetWdxModule(PluginIndex).FileName; edtDetectStr.Text:= tmpWDXPlugins.GetWdxModule(PluginIndex).DetectStr; edtName.Text:= tmpWDXPlugins.GetWdxModule(PluginIndex).Name; lblDescription.Visible:= False; edtDescription.Visible:= False; end; ptWFX: begin nbTweakAll.PageIndex:= 1; edtPlugin1.Text:= tmpWFXPlugins.FileName[PluginIndex]; edtName.Text:= tmpWFXPlugins.Name[PluginIndex]; lblDetectStr.Visible:= False; edtDetectStr.Visible:= False; lblDescription.Visible:= False; edtDescription.Visible:= False; end; ptWLX: begin nbTweakAll.PageIndex:= 1; edtPlugin1.Text:= tmpWLXPlugins.GetWlxModule(PluginIndex).FileName; edtDetectStr.Text:= tmpWLXPlugins.GetWlxModule(PluginIndex).DetectStr; edtName.Text:= tmpWLXPlugins.GetWlxModule(PluginIndex).Name; lblDescription.Visible:= False; edtDescription.Visible:= False; end; end; Result:= (ShowModal = mrOK); if Result then case PluginType of ptDSX: begin tmpDSXPlugins.GetDsxModule(PluginIndex).FileName:= edtPlugin1.Text; tmpDSXPlugins.GetDsxModule(PluginIndex).Descr := edtDescription.Text; tmpDSXPlugins.GetDsxModule(PluginIndex).Name:= edtName.Text; end; ptWCX: begin for I:= 0 to cbExt.Items.Count - 1 do begin iIndex:= FWCXPlugins.Find(FPluginFileName, cbExt.Items[I]); if iIndex >= 0 then begin FWCXPlugins.FileName[iIndex]:= edtPlugin.Text; FWCXPlugins.Flags[iIndex]:= PtrInt(cbExt.Items.Objects[I]); end; end; tmpWCXPlugins.Assign(FWCXPlugins); end; ptWDX: begin tmpWDXPlugins.GetWdxModule(PluginIndex).FileName:= edtPlugin1.Text; tmpWDXPlugins.GetWdxModule(PluginIndex).DetectStr:= edtDetectStr.Text; tmpWDXPlugins.GetWdxModule(PluginIndex).Name:= edtName.Text; end; ptWFX: begin tmpWFXPlugins.FileName[PluginIndex]:= edtPlugin1.Text; tmpWFXPlugins.Name[PluginIndex]:= edtName.Text; end; ptWLX: begin tmpWLXPlugins.GetWlxModule(PluginIndex).FileName:= edtPlugin1.Text; tmpWLXPlugins.GetWlxModule(PluginIndex).DetectStr:= edtDetectStr.Text; tmpWLXPlugins.GetWlxModule(PluginIndex).Name:= edtName.Text; end; end; finally Free; end; end; { TfrmTweakPlugin } constructor TfrmTweakPlugin.Create(TheOwner: TComponent); begin FWCXPlugins := nil; iPrevIndex := -1; inherited; end; destructor TfrmTweakPlugin.Destroy; begin inherited; if Assigned(FWCXPlugins) then FreeAndNil(FWCXPlugins); end; procedure TfrmTweakPlugin.cbExtChange(Sender: TObject); var iFlags: PtrInt; begin iPrevIndex:= cbExt.ItemIndex; iFlags:= PtrInt(cbExt.Items.Objects[cbExt.ItemIndex]); lblFlagsValue.Caption:= '('+IntToStr(iFlags)+')'; cbPK_CAPS_NEW.Checked := (iFlags and PK_CAPS_NEW) <> 0; cbPK_CAPS_MODIFY.Checked := (iFlags and PK_CAPS_MODIFY) <> 0; cbPK_CAPS_MULTIPLE.Checked := (iFlags and PK_CAPS_MULTIPLE) <> 0; cbPK_CAPS_DELETE.Checked := (iFlags and PK_CAPS_DELETE) <> 0; cbPK_CAPS_OPTIONS.Checked := (iFlags and PK_CAPS_OPTIONS) <> 0; cbPK_CAPS_MEMPACK.Checked := (iFlags and PK_CAPS_MEMPACK) <> 0; cbPK_CAPS_BY_CONTENT.Checked := (iFlags and PK_CAPS_BY_CONTENT) <> 0; cbPK_CAPS_SEARCHTEXT.Checked := (iFlags and PK_CAPS_SEARCHTEXT) <> 0; cbPK_CAPS_HIDE.Checked := (iFlags and PK_CAPS_HIDE) <> 0; cbPK_CAPS_ENCRYPT.Checked := (iFlags and PK_CAPS_ENCRYPT) <> 0; end; procedure TfrmTweakPlugin.cbPackerFlagsClick(Sender: TObject); var iFlags: PtrInt; begin if iPrevIndex >= 0 then // save new flags begin iFlags:= 0; if cbPK_CAPS_NEW.Checked then iFlags:= iFlags or PK_CAPS_NEW; if cbPK_CAPS_MODIFY.Checked then iFlags:= iFlags or PK_CAPS_MODIFY; if cbPK_CAPS_MULTIPLE.Checked then iFlags:= iFlags or PK_CAPS_MULTIPLE; if cbPK_CAPS_DELETE.Checked then iFlags:= iFlags or PK_CAPS_DELETE; if cbPK_CAPS_OPTIONS.Checked then iFlags:= iFlags or PK_CAPS_OPTIONS; if cbPK_CAPS_MEMPACK.Checked then iFlags:= iFlags or PK_CAPS_MEMPACK; if cbPK_CAPS_BY_CONTENT.Checked then iFlags:= iFlags or PK_CAPS_BY_CONTENT; if cbPK_CAPS_SEARCHTEXT.Checked then iFlags:= iFlags or PK_CAPS_SEARCHTEXT; if cbPK_CAPS_HIDE.Checked then iFlags:= iFlags or PK_CAPS_HIDE; if cbPK_CAPS_ENCRYPT.Checked then iFlags:= iFlags or PK_CAPS_ENCRYPT; cbExt.Items.Objects[iPrevIndex]:= TObject(iFlags); lblFlagsValue.Caption:= '('+IntToStr(iFlags)+')'; end; end; procedure TfrmTweakPlugin.FormCreate(Sender: TObject); begin {$if not declared(lcl_fullversion) or (lcl_fullversion < 093100)} nbTweakAll.ShowTabs := False; nbTweakAll.TabStop := True; {$endif} end; procedure TfrmTweakPlugin.btnDefaultClick(Sender: TObject); begin cbExt.Items.Objects[cbExt.ItemIndex]:= TObject(GetDefaultFlags(edtPlugin.Text)); iPrevIndex:= -1; cbExtChange(cbExt); end; procedure TfrmTweakPlugin.btnRemoveClick(Sender: TObject); var I, OldIndex: Integer; begin iPrevIndex:= -1; // Must be before cbExt.Items.Delete, because it may trigger cbExtChange. OldIndex := cbExt.ItemIndex; I:= FWCXPlugins.Find(FPluginFileName, cbExt.Text); if I >= 0 then FWCXPlugins.Delete(I); cbExt.Items.Delete(cbExt.ItemIndex); if OldIndex >= cbExt.Items.Count then OldIndex := OldIndex - 1; cbExt.ItemIndex := OldIndex; if iPrevIndex = -1 then // Call only if not already triggerred. cbExtChange(cbExt); btnRemove.Enabled:= (cbExt.Items.Count > 1); end; procedure TfrmTweakPlugin.btnAddClick(Sender: TObject); var sExt: String = ''; iFlags: PtrInt; begin if InputQuery(rsOptEnterExt,Format(rsOptAssocPluginWith, [GetCmdDirFromEnvVar(edtPlugin.Text)]), sExt) then begin iFlags:= GetDefaultFlags(edtPlugin.Text); cbExt.ItemIndex:= cbExt.Items.AddObject(sExt, TObject(iFlags)); FWCXPlugins.Add(cbExt.Items[cbExt.ItemIndex], iFlags, FPluginFileName); iPrevIndex:= -1; cbExtChange(cbExt); end; end; procedure TfrmTweakPlugin.btnChangeClick(Sender: TObject); var I: Integer; sExt: String; begin sExt:= cbExt.Items[cbExt.ItemIndex]; I:= FWCXPlugins.Find(FPluginFileName, sExt); if (I >= 0) and InputQuery(rsOptEnterExt,Format(rsOptAssocPluginWith, [GetCmdDirFromEnvVar(edtPlugin.Text)]), sExt) then begin FWCXPlugins.Ext[I]:= sExt; cbExt.Items[cbExt.ItemIndex]:= sExt; end; end; function TfrmTweakPlugin.GetDefaultFlags(PluginFileName: String): PtrInt; var WCXmodule: TWCXmodule; begin Result:= 0; WCXmodule := TWCXmodule.Create; if WCXmodule.LoadModule(GetCmdDirFromEnvVar(PluginFileName)) then begin Result:= WCXmodule.GetPluginCapabilities; WCXModule.UnloadModule; end; WCXmodule.Free; end; end. doublecmd-0.5.8/src/fFileOpDlg.pas0000644000175000017500000010600012215335371015754 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Window displaying progress for file source operations and queues. Copyright (C) 2008-2011 Koblov Alexander (Alexx2000@mail.ru) Copyright (C) 2012 Przemysław Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fFileOpDlg; {$mode objfpc}{$H+} interface uses SysUtils, Classes, Controls, Forms, StdCtrls, ComCtrls, Buttons, ExtCtrls, KASProgressBar, uOperationsManager, uFileSourceOperation, uFileSourceOperationUI, uOSForms; type TFileOpDlgLook = set of (fodl_from_lbl, fodl_to_lbl, fodl_first_pb, fodl_second_pb); TOperationProgressWindowEvent = (opwevOpened, opwevClosed); TOperationProgressWindowEvents = set of TOperationProgressWindowEvent; TOperationProgressWindowEventProc = procedure(OperationHandle: TOperationHandle; Event: TOperationProgressWindowEvent) of object; TOperationProgressWindowOption = (opwoIfExistsBringToFront, opwoStartMinimized); TOperationProgressWindowOptions = set of TOperationProgressWindowOption; { TfrmFileOp } TfrmFileOp = class(TAloneForm) btnCancel: TBitBtn; btnPauseStart: TBitBtn; btnViewOperations: TBitBtn; btnMinimizeToPanel: TBitBtn; lblCurrentOperationText: TLabel; lblEstimated: TLabel; lblFileNameFrom: TLabel; lblFileNameTo: TLabel; lblFrom: TLabel; lblCurrentOperation: TLabel; lblTo: TLabel; pnlQueue: TPanel; pbFirst: TKASProgressBar; pbSecond: TKASProgressBar; pnlButtons: TPanel; pnlClient: TPanel; pnlFrom: TPanel; pnlTo: TPanel; procedure btnCancelClick(Sender: TObject); procedure btnMinimizeToPanelClick(Sender: TObject); procedure btnPauseStartClick(Sender: TObject); procedure btnViewOperationsClick(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormCreate(Sender: TObject); private FOperationHandle: TOperationHandle; FQueueIdentifier: TOperationsManagerQueueIdentifier; FUpdateTimer: TTimer; // 0) then Result := Queue.Items[0].Handle else Result := InvalidOperationHandle; end; class function TfrmFileOp.GetOpenedForm(AOperationHandle: TOperationHandle): TfrmFileOp; var Index: Integer; Item: POpenedForm; begin for Index := 0 to OpenedForms.Count - 1 do begin Item := OpenedForms[Index]; if Item^.OperationHandle = AOperationHandle then Exit(Item^.Form); end; Result := nil; end; class function TfrmFileOp.GetOpenedForm(AQueueIdentifier: TOperationsManagerQueueIdentifier): TfrmFileOp; var Index: Integer; Item: POpenedForm; begin for Index := 0 to OpenedForms.Count - 1 do begin Item := OpenedForms[Index]; if Item^.QueueIdentifier = AQueueIdentifier then Exit(Item^.Form); end; Result := nil; end; constructor TfrmFileOp.Create(OperationHandle: TOperationHandle); var OpManItem: TOperationsManagerItem; begin FOperationHandle := InvalidOperationHandle; inherited Create(Application); AutoSize := True; OpManItem := OperationsManager.GetItemByHandle(OperationHandle); if Assigned(OpManItem) then begin FStopOperationOnClose := True; FOperationHandle := OperationHandle; end else begin CloseDialog; end; end; constructor TfrmFileOp.Create(QueueIdentifier: TOperationsManagerQueueIdentifier); begin Create(GetFirstOperationHandle(QueueIdentifier)); end; destructor TfrmFileOp.Destroy; begin inherited Destroy; FreeAndNil(FUserInterface); end; procedure TfrmFileOp.FinalizeOperation; var OpManItem: TOperationsManagerItem; begin FUpdateTimer.Enabled := False; if FOperationHandle <> InvalidOperationHandle then begin if Assigned(FUserInterface) then begin OpManItem := OperationsManager.GetItemByHandle(FOperationHandle); if Assigned(OpManItem) then OpManItem.Operation.RemoveUserInterface(FUserInterface); end; RemoveFromOpenedForms; FOperationHandle := InvalidOperationHandle; end; end; function TfrmFileOp.CloseQuery: Boolean; begin Result := True; if FStopOperationOnClose then StopOperationOrQueue; end; class procedure TfrmFileOp.AddEventsListener(Events: TOperationProgressWindowEvents; FunctionToCall: TOperationProgressWindowEventProc); var Item: PEventsListItem; Event: TOperationProgressWindowEvent; begin for Event in Events do begin New(Item); Item^.EventFunction := FunctionToCall; EventsListeners[Event].Add(Item); end; end; function TfrmFileOp.AddToOpenedForms(OpManItem: TOperationsManagerItem): Boolean; var Index: Integer; Item: POpenedForm; Found: Boolean = False; begin for Index := 0 to OpenedForms.Count - 1 do begin Item := OpenedForms[Index]; // Check if another form is not already opened for the operation or queue. if (Item^.OperationHandle = FOperationHandle) or (not OpManItem.Queue.IsFree and (Item^.QueueIdentifier = FQueueIdentifier)) then begin Exit(False); end else if Item^.Form = Self then begin Found := True; Break; end; end; if not Found then begin New(Item); OpenedForms.Add(Item); end; Item^.Form := Self; Item^.OperationHandle := FOperationHandle; Item^.QueueIdentifier := FQueueIdentifier; NotifyEvents([opwevOpened]); Result := True; end; class procedure TfrmFileOp.RemoveEventsListener(Events: TOperationProgressWindowEvents; FunctionToCall: TOperationProgressWindowEventProc); var Item: PEventsListItem; Event: TOperationProgressWindowEvent; i: Integer; begin for Event in Events do begin for i := 0 to EventsListeners[Event].Count - 1 do begin Item := PEventsListItem(EventsListeners[Event].Items[i]); if Item^.EventFunction = FunctionToCall then begin EventsListeners[Event].Delete(i); Dispose(Item); Break; // break from one for only end; end; end; end; procedure TfrmFileOp.RemoveFromOpenedForms; var i: Integer; Item: POpenedForm; begin for i := 0 to OpenedForms.Count - 1 do begin Item := OpenedForms[i]; if Item^.Form = Self then begin Dispose(Item); OpenedForms.Delete(i); NotifyEvents([opwevClosed]); Break; end; end; end; class function TfrmFileOp.IsOpenedFor(AOperationHandle: TOperationHandle): Boolean; begin Result := Assigned(GetOpenedForm(AOperationHandle)); end; class function TfrmFileOp.IsOpenedFor(AQueueIdentifier: TOperationsManagerQueueIdentifier): Boolean; begin Result := Assigned(GetOpenedForm(AQueueIdentifier)); end; class procedure TfrmFileOp.ShowFor(AOperationHandle: TOperationHandle; Options: TOperationProgressWindowOptions); var OperationDialog: TfrmFileOp; OpManItem: TOperationsManagerItem; begin OpManItem := OperationsManager.GetItemByHandle(AOperationHandle); if Assigned(OpManItem) then begin if not OpManItem.Queue.IsFree then begin ShowFor(OpManItem.Queue.Identifier, Options); end else begin OperationDialog := GetOpenedForm(AOperationHandle); if Assigned(OperationDialog) then ShowExistingWindow(OperationDialog, Options) else begin OperationDialog := TfrmFileOp.Create(AOperationHandle); ShowNewWindow(OperationDialog, Options); end; end; end; end; class procedure TfrmFileOp.ShowFor(AQueueIdentifier: TOperationsManagerQueueIdentifier; Options: TOperationProgressWindowOptions); var OperationDialog: TfrmFileOp; begin OperationDialog := GetOpenedForm(AQueueIdentifier); if Assigned(OperationDialog) then begin ShowExistingWindow(OperationDialog, Options); end else begin OperationDialog := TfrmFileOp.Create(AQueueIdentifier); ShowNewWindow(OperationDialog, Options); end; end; class procedure TfrmFileOp.ShowExistingWindow(AWindow: TfrmFileOp; Options: TOperationProgressWindowOptions); begin if opwoIfExistsBringToFront in Options then AWindow.ShowOnTop; end; class procedure TfrmFileOp.ShowNewWindow(AWindow: TfrmFileOp; Options: TOperationProgressWindowOptions); begin if opwoStartMinimized in Options then begin {$IF lcl_fullversion >= 093100} // Workaround for bug in Lazarus 0.9.31 #0021603. AWindow.Visible := True; AWindow.WindowState := wsMinimized; {$ELSE} AWindow.WindowState := wsMinimized; AWindow.Visible := True; {$ENDIF} end else AWindow.Show; end; procedure TfrmFileOp.StopOperationOrQueue; var OpManItem: TOperationsManagerItem; begin OpManItem := OperationsManager.GetItemByHandle(FOperationHandle); if Assigned(OpManItem) then begin if OpManItem.Queue.IsFree then OpManItem.Operation.Stop else OpManItem.Queue.Stop; end; end; procedure TfrmFileOp.OnUpdateTimer(Sender: TObject); var OpManItem: TOperationsManagerItem; Queue: TOperationsManagerQueue; begin OpManItem := OperationsManager.GetItemByHandle(FOperationHandle); // Check if operation did not change queues. if Assigned(OpManItem) and (OpManItem.Queue.Identifier <> FQueueIdentifier) then begin Queue := OperationsManager.QueueByIdentifier[FQueueIdentifier]; FinalizeOperation; if Assigned(Queue) and not Queue.IsFree then begin // Queue was begin followed - switch to next operation from that queue. FQueueIdentifier := Queue.Identifier; FOperationHandle := GetFirstOperationHandle(Queue.Identifier); end else begin // Follow the operation to new queue either because previously followed // queue was free-operations queue or old queue was destroyed. FQueueIdentifier := OpManItem.Queue.Identifier; FOperationHandle := OpManItem.Handle; end; if not InitializeOperation then begin CloseDialog; Exit; end; OpManItem := OperationsManager.GetItemByHandle(FOperationHandle); end; // Check if first operation in the queue hasn't changed. if Assigned(OpManItem) and not OpManItem.Queue.IsFree and (GetFirstOperationHandle(FQueueIdentifier) <> FOperationHandle) then begin FinalizeOperation; FOperationHandle := GetFirstOperationHandle(FQueueIdentifier); if not InitializeOperation then begin CloseDialog; Exit; end; OpManItem := OperationsManager.GetItemByHandle(FOperationHandle); end; if Assigned(OpManItem) then begin UpdateOperation(OpManItem); end else // Operation was destroyed begin Queue := OperationsManager.QueueByIdentifier[FQueueIdentifier]; if not Assigned(Queue) or Queue.IsFree then begin // Single operation was being followed and it has finished // or all operations in queue have finished - close window. CloseDialog; end else begin // Queue was begin followed - switch to next operation from that queue. FOperationHandle := GetFirstOperationHandle(FQueueIdentifier); end; end; end; procedure TfrmFileOp.InitializeControls(OpManItem: TOperationsManagerItem; FileOpDlgLook: TFileOpDlgLook); begin pnlQueue.Visible := not OpManItem.Queue.IsFree; lblFrom.Visible := fodl_from_lbl in FileOpDlgLook; lblFileNameFrom.Visible := lblFrom.Visible; lblTo.Visible := fodl_to_lbl in FileOpDlgLook; lblFileNameTo.Visible := lblTo.Visible; pbFirst.Visible := fodl_first_pb in FileOpDlgLook; pbSecond.Visible := fodl_second_pb in FileOpDlgLook; pbFirst.ShowInTaskbar := [fodl_first_pb, fodl_second_pb] * FileOpDlgLook = [fodl_first_pb]; pbSecond.ShowInTaskbar := fodl_second_pb in FileOpDlgLook; lblFileNameFrom.Caption := ''; lblFileNameTo.Caption := ''; lblEstimated.Caption := #32; end; procedure TfrmFileOp.NotifyEvents(Events: TOperationProgressWindowEvents); var Item: PEventsListItem; Event: TOperationProgressWindowEvent; i: Integer; begin for Event in Events do begin for i := 0 to EventsListeners[Event].Count - 1 do begin Item := EventsListeners[Event].Items[i]; Item^.EventFunction(FOperationHandle, Event); end; end; end; procedure TfrmFileOp.SetPauseGlyph; begin dmComData.ImageList.GetBitmap(1, btnPauseStart.Glyph); end; procedure TfrmFileOp.SetPlayGlyph; begin dmComData.ImageList.GetBitmap(0, btnPauseStart.Glyph); end; procedure TfrmFileOp.SetProgressBytes(ProgressBar: TKASProgressBar; CurrentBytes: Int64; TotalBytes: Int64); begin ProgressBar.SetProgress(CurrentBytes, TotalBytes, cnvFormatFileSize(CurrentBytes, True) + 'B/' + cnvFormatFileSize(TotalBytes, True) + 'B'); end; procedure TfrmFileOp.SetSpeedAndTime(Operation: TFileSourceOperation; RemainingTime: TDateTime; Speed: String); var sEstimated: String; begin if Operation.State <> fsosRunning then sEstimated := #32 else begin if RemainingTime > 0 then begin sEstimated := FormatDateTime('HH:MM:SS', RemainingTime); sEstimated := Format(rsDlgSpeedTime, [Speed, sEstimated]); end else sEstimated := Format(rsDlgSpeed, [Speed]); end; lblEstimated.Caption := sEstimated; end; procedure TfrmFileOp.InitializeCopyOperation(OpManItem: TOperationsManagerItem); begin InitializeControls(OpManItem, [fodl_from_lbl, fodl_to_lbl, fodl_first_pb, fodl_second_pb]); end; procedure TfrmFileOp.InitializeMoveOperation(OpManItem: TOperationsManagerItem); begin InitializeControls(OpManItem, [fodl_from_lbl, fodl_to_lbl, fodl_first_pb, fodl_second_pb]); end; function TfrmFileOp.InitializeOperation: Boolean; var OpManItem: TOperationsManagerItem; begin Result := False; OpManItem := OperationsManager.GetItemByHandle(FOperationHandle); if Assigned(OpManItem) and not OpManItem.Queue.IsFree then begin FOperationHandle := GetFirstOperationHandle(OpManItem.Queue.Identifier); OpManItem := OperationsManager.GetItemByHandle(FOperationHandle); end; if Assigned(OpManItem) then begin FQueueIdentifier := OpManItem.Queue.Identifier; if AddToOpenedForms(OpManItem) then begin if not Assigned(FUserInterface) then FUserInterface := TFileSourceOperationMessageBoxesUI.Create; OpManItem.Operation.AddUserInterface(FUserInterface); ProgressBarStyle:= pbstMarquee; case OpManItem.Operation.ID of fsoCopy, fsoCopyIn, fsoCopyOut: InitializeCopyOperation(OpManItem); fsoMove: InitializeMoveOperation(OpManItem); fsoDelete: InitializeDeleteOperation(OpManItem); fsoWipe: InitializeWipeOperation(OpManItem); fsoSplit: InitializeSplitOperation(OpManItem); fsoCombine: InitializeCombineOperation(OpManItem); fsoCalcChecksum: InitializeCalcChecksumOperation(OpManItem); fsoTestArchive: InitializeTestArchiveOperation(OpManItem); fsoCalcStatistics: InitializeCalcStatisticsOperation(OpManItem); else begin InitializeControls(OpManItem, [fodl_first_pb]); end; end; UpdatePauseStartButton(OpManItem); Caption := EmptyStr; FUpdateTimer.Enabled := True; Result := True; end; end; if not Result then FOperationHandle := InvalidOperationHandle; end; procedure TfrmFileOp.InitializeDeleteOperation(OpManItem: TOperationsManagerItem); begin InitializeControls(OpManItem, [fodl_first_pb]); end; procedure TfrmFileOp.InitializeCalcStatisticsOperation(OpManItem: TOperationsManagerItem); begin InitializeControls(OpManItem, [fodl_from_lbl]); end; procedure TfrmFileOp.InitializeWipeOperation(OpManItem: TOperationsManagerItem); begin InitializeControls(OpManItem, [fodl_first_pb, fodl_second_pb]); end; procedure TfrmFileOp.InitializeSplitOperation(OpManItem: TOperationsManagerItem); begin InitializeControls(OpManItem, [fodl_from_lbl, fodl_to_lbl, fodl_first_pb, fodl_second_pb]); end; procedure TfrmFileOp.InitializeCombineOperation(OpManItem: TOperationsManagerItem); begin InitializeControls(OpManItem, [fodl_from_lbl, fodl_to_lbl, fodl_first_pb, fodl_second_pb]); end; procedure TfrmFileOp.InitializeCalcChecksumOperation(OpManItem: TOperationsManagerItem); begin InitializeControls(OpManItem, [fodl_first_pb, fodl_second_pb]); end; procedure TfrmFileOp.InitializeTestArchiveOperation(OpManItem: TOperationsManagerItem); begin InitializeControls(OpManItem, [fodl_from_lbl, fodl_to_lbl, fodl_first_pb, fodl_second_pb]); end; procedure TfrmFileOp.UpdateCopyOperation(Operation: TFileSourceOperation); var CopyOperation: TFileSourceCopyOperation; CopyStatistics: TFileSourceCopyOperationStatistics; begin CopyOperation := Operation as TFileSourceCopyOperation; CopyStatistics := CopyOperation.RetrieveStatistics; with CopyStatistics do begin lblFileNameFrom.Caption := MinimizeFilePath(CurrentFileFrom, lblFileNameFrom.Canvas, lblFileNameFrom.Width); lblFileNameTo.Caption := MinimizeFilePath(CurrentFileTo, lblFileNameTo.Canvas, lblFileNameTo.Width); SetProgressBytes(pbFirst, CurrentFileDoneBytes, CurrentFileTotalBytes); SetProgressBytes(pbSecond, DoneBytes, TotalBytes); SetSpeedAndTime(Operation, RemainingTime, cnvFormatFileSize(BytesPerSecond, True) + 'B'); end; end; procedure TfrmFileOp.UpdateMoveOperation(Operation: TFileSourceOperation); var MoveOperation: TFileSourceMoveOperation; MoveStatistics: TFileSourceMoveOperationStatistics; begin MoveOperation := Operation as TFileSourceMoveOperation; MoveStatistics := MoveOperation.RetrieveStatistics; with MoveStatistics do begin lblFileNameFrom.Caption := MinimizeFilePath(CurrentFileFrom, lblFileNameFrom.Canvas, lblFileNameFrom.Width); lblFileNameTo.Caption := MinimizeFilePath(CurrentFileTo, lblFileNameTo.Canvas, lblFileNameTo.Width); SetProgressBytes(pbFirst, CurrentFileDoneBytes, CurrentFileTotalBytes); SetProgressBytes(pbSecond, DoneBytes, TotalBytes); SetSpeedAndTime(Operation, RemainingTime, cnvFormatFileSize(BytesPerSecond, True) + 'B'); end; end; procedure TfrmFileOp.UpdateOperation(OpManItem: TOperationsManagerItem); var NewCaption: String; begin // Proceed with update. if (OpManItem.Operation.State = fsosRunning) and (ProgressBarStyle = pbstMarquee) then begin ProgressBarStyle:= pbstNormal; end; case OpManItem.Operation.ID of fsoCopy, fsoCopyIn, fsoCopyOut: UpdateCopyOperation(OpManItem.Operation); fsoMove: UpdateMoveOperation(OpManItem.Operation); fsoDelete: UpdateDeleteOperation(OpManItem.Operation); fsoWipe: UpdateWipeOperation(OpManItem.Operation); fsoSplit: UpdateSplitOperation(OpManItem.Operation); fsoCombine: UpdateCombineOperation(OpManItem.Operation); fsoCalcChecksum: UpdateCalcChecksumOperation(OpManItem.Operation); fsoCalcStatistics: UpdateCalcStatisticsOperation(OpManItem.Operation); fsoTestArchive: UpdateTestArchiveOperation(OpManItem.Operation); else begin // Operation not currently supported for display. // Only show general progress. pbFirst.Position := Round(OpManItem.Operation.Progress * pbFirst.Max); end; end; UpdatePauseStartButton(OpManItem); if OpManItem.Queue.IsFree then begin NewCaption := GetProgressString(OpManItem.Operation.Progress) + ' ' + OpManItem.Operation.GetDescription(fsoddJob) + GetOperationStateString(OpManItem.Operation.State); end else begin if OpManItem.Queue.Paused then NewCaption := '[' + IntToStr(OpManItem.Queue.Count) + '] ' + OpManItem.Queue.GetDescription(False) + GetOperationStateString(fsosPaused) else NewCaption := '[' + IntToStr(OpManItem.Queue.Count) + '] ' + GetProgressString(OpManItem.Operation.Progress) + ' ' + OpManItem.Operation.GetDescription(fsoddJob) + ' - ' + OpManItem.Queue.GetDescription(False); lblCurrentOperationText.Caption := OpManItem.Operation.GetDescription(fsoddJob) + ' ' + GetProgressString(OpManItem.Operation.Progress); end; Caption := NewCaption; end; procedure TfrmFileOp.UpdatePauseStartButton(OpManItem: TOperationsManagerItem); begin if OpManItem.Queue.IsFree then begin case OpManItem.Operation.State of fsosNotStarted, fsosStopped, fsosPaused: begin btnPauseStart.Enabled := True; SetPlayGlyph; end; fsosStarting, fsosStopping, fsosPausing, fsosWaitingForFeedback: begin btnPauseStart.Enabled := False; end; fsosRunning, fsosWaitingForConnection: begin btnPauseStart.Enabled := True; SetPauseGlyph; end; else btnPauseStart.Enabled := False; end; end else begin btnPauseStart.Enabled := True; if OpManItem.Queue.Paused then SetPlayGlyph else SetPauseGlyph; end; end; procedure TfrmFileOp.UpdateDeleteOperation(Operation: TFileSourceOperation); var DeleteOperation: TFileSourceDeleteOperation; DeleteStatistics: TFileSourceDeleteOperationStatistics; begin DeleteOperation := Operation as TFileSourceDeleteOperation; DeleteStatistics := DeleteOperation.RetrieveStatistics; with DeleteStatistics do begin lblFileNameFrom.Caption := MinimizeFilePath(CurrentFile, lblFileNameFrom.Canvas, lblFileNameFrom.Width); pbFirst.SetProgress(DoneFiles, TotalFiles, cnvFormatFileSize(DoneFiles, True) + '/' + cnvFormatFileSize(TotalFiles, True)); SetSpeedAndTime(Operation, RemainingTime, cnvFormatFileSize(FilesPerSecond, True)); end; end; procedure TfrmFileOp.UpdateWipeOperation(Operation: TFileSourceOperation); var WipeOperation: TFileSourceWipeOperation; WipeStatistics: TFileSourceWipeOperationStatistics; begin WipeOperation := Operation as TFileSourceWipeOperation; WipeStatistics := WipeOperation.RetrieveStatistics; with WipeStatistics do begin lblFileNameFrom.Caption := MinimizeFilePath(CurrentFile, lblFileNameFrom.Canvas, lblFileNameFrom.Width); SetProgressBytes(pbFirst, CurrentFileDoneBytes, CurrentFileTotalBytes); SetProgressBytes(pbSecond, DoneBytes, TotalBytes); SetSpeedAndTime(Operation, RemainingTime, cnvFormatFileSize(BytesPerSecond, True) + 'B'); end; end; procedure TfrmFileOp.UpdateSplitOperation(Operation: TFileSourceOperation); var SplitOperation: TFileSourceSplitOperation; SplitStatistics: TFileSourceSplitOperationStatistics; begin SplitOperation := Operation as TFileSourceSplitOperation; SplitStatistics := SplitOperation.RetrieveStatistics; with SplitStatistics do begin lblFileNameFrom.Caption := MinimizeFilePath(CurrentFileFrom, lblFileNameFrom.Canvas, lblFileNameFrom.Width); lblFileNameTo.Caption := MinimizeFilePath(CurrentFileTo, lblFileNameTo.Canvas, lblFileNameTo.Width); SetProgressBytes(pbFirst, CurrentFileDoneBytes, CurrentFileTotalBytes); SetProgressBytes(pbSecond, DoneBytes, TotalBytes); SetSpeedAndTime(Operation, RemainingTime, cnvFormatFileSize(BytesPerSecond, True) + 'B'); end; end; procedure TfrmFileOp.UpdateCombineOperation(Operation: TFileSourceOperation); var CombineOperation: TFileSourceCombineOperation; CombineStatistics: TFileSourceCombineOperationStatistics; begin CombineOperation := Operation as TFileSourceCombineOperation; CombineStatistics := CombineOperation.RetrieveStatistics; with CombineStatistics do begin lblFileNameFrom.Caption := MinimizeFilePath(CurrentFileFrom, lblFileNameFrom.Canvas, lblFileNameFrom.Width); lblFileNameTo.Caption := MinimizeFilePath(CurrentFileTo, lblFileNameTo.Canvas, lblFileNameTo.Width); SetProgressBytes(pbFirst, CurrentFileDoneBytes, CurrentFileTotalBytes); SetProgressBytes(pbSecond, DoneBytes, TotalBytes); SetSpeedAndTime(Operation, RemainingTime, cnvFormatFileSize(BytesPerSecond, True) + 'B'); end; end; procedure TfrmFileOp.UpdateCalcStatisticsOperation(Operation: TFileSourceOperation); var CalcStatisticsOperation: TFileSourceCalcStatisticsOperation; CalcStatisticsOperationStatistics: TFileSourceCalcStatisticsOperationStatistics; begin CalcStatisticsOperation := Operation as TFileSourceCalcStatisticsOperation; CalcStatisticsOperationStatistics := CalcStatisticsOperation.RetrieveStatistics; with CalcStatisticsOperationStatistics do begin lblFileNameFrom.Caption := MinimizeFilePath(CurrentFile, lblFileNameFrom.Canvas, lblFileNameFrom.Width); SetSpeedAndTime(Operation, 0, cnvFormatFileSize(FilesPerSecond, True)); end; end; procedure TfrmFileOp.UpdateCalcChecksumOperation(Operation: TFileSourceOperation); var CalcChecksumOperation: TFileSourceCalcChecksumOperation; CalcChecksumStatistics: TFileSourceCalcChecksumOperationStatistics; begin CalcChecksumOperation := Operation as TFileSourceCalcChecksumOperation; CalcChecksumStatistics := CalcChecksumOperation.RetrieveStatistics; with CalcChecksumStatistics do begin lblFileNameFrom.Caption := MinimizeFilePath(CurrentFile, lblFileNameFrom.Canvas, lblFileNameFrom.Width); SetProgressBytes(pbFirst, CurrentFileDoneBytes, CurrentFileTotalBytes); SetProgressBytes(pbSecond, DoneBytes, TotalBytes); SetSpeedAndTime(Operation, RemainingTime, cnvFormatFileSize(BytesPerSecond, True) + 'B'); end; end; procedure TfrmFileOp.UpdateTestArchiveOperation(Operation: TFileSourceOperation); var TestArchiveOperation: TFileSourceTestArchiveOperation; TestArchiveStatistics: TFileSourceTestArchiveOperationStatistics; begin TestArchiveOperation := Operation as TFileSourceTestArchiveOperation; TestArchiveStatistics := TestArchiveOperation.RetrieveStatistics; with TestArchiveStatistics do begin lblFileNameFrom.Caption := MinimizeFilePath(ArchiveFile, lblFileNameFrom.Canvas, lblFileNameFrom.Width); lblFileNameTo.Caption := MinimizeFilePath(CurrentFile, lblFileNameTo.Canvas, lblFileNameTo.Width); SetProgressBytes(pbFirst, CurrentFileDoneBytes, CurrentFileTotalBytes); SetProgressBytes(pbSecond, DoneBytes, TotalBytes); SetSpeedAndTime(Operation, RemainingTime, cnvFormatFileSize(BytesPerSecond, True) + 'B'); end; end; function TfrmFileOp.GetProgressBarStyle: TProgressBarStyle; begin if (pbFirst.Style = pbstMarquee) and (pbSecond.Style = pbstMarquee) then Result:= pbstMarquee else Result:= pbstNormal; end; procedure TfrmFileOp.SetProgressBarStyle(const AValue: TProgressBarStyle); begin pbFirst.Style:= AValue; pbSecond.Style:= AValue; end; initialization Initialize; finalization Finalize; end. doublecmd-0.5.8/src/ufunctionthread.pas0000644000175000017500000001036211747211345017213 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Executing functions in a thread. Copyright (C) 2009-2011 Przemysław Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uFunctionThread; {$mode objfpc}{$H+} interface uses Classes, SysUtils, syncobjs; type TFunctionThreadMethod = procedure(Params: Pointer) of object; PFunctionThreadItem = ^TFunctionThreadItem; TFunctionThreadItem = record Method: TFunctionThreadMethod; Params: Pointer; end; TFunctionThread = class(TThread) private FFunctionsToCall: TFPList; FWaitEvent: PRTLEvent; FLock: TCriticalSection; FFinished: Boolean; protected procedure Execute; override; public constructor Create(CreateSuspended: Boolean); reintroduce; destructor Destroy; override; procedure QueueFunction(AFunctionToCall: TFunctionThreadMethod; AParams: Pointer = nil); procedure Finish; class procedure Finalize(var AThread: TFunctionThread); property Finished: Boolean read FFinished; end; implementation uses LCLProc, uDebug, uExceptions {$IFDEF MSWINDOWS} , ActiveX {$ENDIF} ; constructor TFunctionThread.Create(CreateSuspended: Boolean); begin FWaitEvent := RTLEventCreate; FFunctionsToCall := TFPList.Create; FLock := TCriticalSection.Create; FFinished := False; FreeOnTerminate := False; inherited Create(CreateSuspended, DefaultStackSize); end; destructor TFunctionThread.Destroy; var i: Integer; begin RTLeventdestroy(FWaitEvent); FLock.Acquire; for i := 0 to FFunctionsToCall.Count - 1 do Dispose(PFunctionThreadItem(FFunctionsToCall[i])); FLock.Release; FreeThenNil(FFunctionsToCall); FreeThenNil(FLock); inherited Destroy; end; procedure TFunctionThread.QueueFunction(AFunctionToCall: TFunctionThreadMethod; AParams: Pointer); var pItem: PFunctionThreadItem; begin if (not Terminated) and Assigned(AFunctionToCall) then begin New(pItem); pItem^.Method := AFunctionToCall; pItem^.Params := AParams; FLock.Acquire; try FFunctionsToCall.Add(pItem); finally FLock.Release; end; RTLeventSetEvent(FWaitEvent); end; end; procedure TFunctionThread.Finish; begin Terminate; RTLeventSetEvent(FWaitEvent); end; procedure TFunctionThread.Execute; var pItem: PFunctionThreadItem; begin {$IFDEF MSWINDOWS} CoInitializeEx(nil, COINIT_APARTMENTTHREADED); {$ENDIF} try while (not Terminated) or (FFunctionsToCall.Count > 0) do begin RTLeventResetEvent(FWaitEvent); pItem := nil; FLock.Acquire; try if FFunctionsToCall.Count > 0 then begin pItem := PFunctionThreadItem(FFunctionsToCall[0]); FFunctionsToCall.Delete(0); end; finally FLock.Release; end; if Assigned(pItem) then begin try pItem^.Method(pItem^.Params); Dispose(pItem); except on e: Exception do begin Dispose(pItem); HandleException(e, Self); end; end; end else begin RTLeventWaitFor(FWaitEvent); end; end; finally {$IFDEF MSWINDOWS} CoUninitialize; {$ENDIF} FFinished := True; end; end; class procedure TFunctionThread.Finalize(var AThread: TFunctionThread); begin AThread.Finish; {$IF (fpc_version<2) or ((fpc_version=2) and (fpc_release<5))} If (MainThreadID=GetCurrentThreadID) then while not AThread.Finished do CheckSynchronize(100); {$ENDIF} AThread.WaitFor; AThread.Free; AThread := nil; end; end. doublecmd-0.5.8/src/fconnectionmanager.lfm0000644000175000017500000002745312023046500017640 0ustar alexxalexxobject frmConnectionManager: TfrmConnectionManager Left = 321 Height = 366 Top = 149 Width = 431 Caption = 'Connection manager' ClientHeight = 366 ClientWidth = 431 OnDestroy = FormDestroy Position = poScreenCenter LCLVersion = '1.1' object gbConnectTo: TGroupBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = btnConnect AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 6 Height = 360 Top = 0 Width = 281 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 6 BorderSpacing.Right = 12 BorderSpacing.Bottom = 6 Caption = 'Connect to:' ChildSizing.LeftRightSpacing = 4 ChildSizing.TopBottomSpacing = 4 ClientHeight = 337 ClientWidth = 277 TabOrder = 0 object tvConnections: TTreeView Left = 4 Height = 329 Top = 4 Width = 269 Align = alClient DefaultItemHeight = 24 ReadOnly = True StateImages = ImageList TabOrder = 0 OnSelectionChanged = tvConnectionsSelectionChanged Options = [tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips] end end object btnConnect: TBitBtn AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 299 Height = 30 Top = 16 Width = 120 Anchors = [akTop, akRight] BorderSpacing.Right = 12 Caption = 'C&onnect' Enabled = False OnClick = btnConnectClick TabOrder = 1 end object btnAdd: TBitBtn AnchorSideLeft.Control = btnConnect AnchorSideTop.Control = btnConnect AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnConnect AnchorSideRight.Side = asrBottom Left = 299 Height = 30 Top = 64 Width = 120 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 18 Caption = 'A&dd' Enabled = False OnClick = btnAddClick TabOrder = 2 end object btnEdit: TBitBtn AnchorSideLeft.Control = btnAdd AnchorSideTop.Control = btnAdd AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnAdd AnchorSideRight.Side = asrBottom Left = 299 Height = 30 Top = 100 Width = 120 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = '&Edit' Enabled = False OnClick = btnEditClick TabOrder = 3 end object btnDelete: TBitBtn AnchorSideLeft.Control = btnEdit AnchorSideTop.Control = btnEdit AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnEdit AnchorSideRight.Side = asrBottom Left = 299 Height = 30 Top = 136 Width = 120 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = '&Delete' Enabled = False OnClick = btnDeleteClick TabOrder = 4 end object btnCancel: TBitBtn AnchorSideLeft.Control = btnDelete AnchorSideTop.Control = btnDelete AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnDelete AnchorSideRight.Side = asrBottom Left = 299 Height = 30 Top = 172 Width = 120 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Cancel = True Caption = '&Cancel' Kind = bkCancel ModalResult = 2 TabOrder = 5 end object ImageList: TImageList Height = 22 Width = 22 left = 345 top = 253 Bitmap = { 4C69020000001600000016000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000373AD01000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000273 AD00000000000373AD00007AB9FF007AB9FF007AB9FF007AB9FF007AB9FF007A B9FF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000529A00007A B9FFA4FEFDFE9BF6FBFF96F1FDFF92EDFDFF8EE8FEFF8CE5FFFE0275B1FF0046 8A0F0373AD000000000000000000000000000000000000000000000000000000 0000000000000000000000000000006AA700007AB9FF93E6F2FF8FE4F3FF8CE1 F5FF89DFF6FF86DDF7FF83DBF8FF80D9F9FF80DAFDFF0275B1FF00000000006B A506006CA506006CA506006CA506006CA506006CA506006CA506006CA506006D A60400000000007AB9FFB8F5FEFEACEDFAFFA9EAF8FFA5E7F8FFA1E4F8FF9EE1 F7FF9ADEF6FF96DBF6FF92D9F5FE96DDFCFF0372ADFF0371ABFF0370A9FF046E A7FF056EA5FF056CA3FF056BA1FF066A9EFF06699DFF358DB900004B79140079 B8FFB7FBFFFFA4F5FEFFA2F3FDFF9FF1FCFF9DEEFCFF9AEDFBFF99EBFAFF95E9 F8FF94E6F8FF91E4F8FF8FE2F6FF8DE0F6FF8ADDF4FF88DBF4FF85D9F3FF82D7 F2FF80D4F1FF7ED3F1FF7BD1F0FF096395FF00507F000178B6FFB5FAFFFFA1F4 FDFF9FF1FDFF9DEFFCFF9AEDFBFF98EBF9FF96E9FAFF93E7F9FF91E5F7FF8EE2 F7FF8CE1F6FF8ADEF6FF88DCF4FF85DAF4FF83D7F3FF80D5F2FF7ED4F2FF7CD1 F0FF79D1F0FF096394FF00507F000177B4FFB2F8FFFF9FF3FCFF9EF0FDFF9BEF FCFF99ECFBFF97EAF9FF94E8F9FF92E5F9FF8FE3F7FF8DE1F6FF8ADFF6FF88DD F5FF85DAF4FF83D9F3FF81D6F2FF7FD5F2FF7DD3F1FF7AD0F0FF77CFF0FF0962 93FF00507F000176B2FFB0F7FFFF9FF1FCFF9CEFFBFF99EDFAFF97EBFAFF95E8 F9FF92E6F8FF90E3F8FF8EE2F7FF8CE0F6FF89DDF5FF87DCF4FF84D9F3FF82D7 F2FF7FD5F2FF7ED3F0FF7AD0F1FF78CEF0FF76CDEFFF0A6292FF00517F000275 B1FFAEF5FEFF9DEFFCFF9BEDFAFF98EBFBFF96E9F9FF93E7F9FF91E4F7FF8FE3 F7FF8CE0F6FF89DEF6FF87DCF4FF85DAF4FF83D8F2FF80D6F2FF7FD3F2FF7BD1 F0FF79CFF0FF77CCEFFF74CCEEFF0A6191FF00517F000274AFFFACF4FEFF9BEE FBFF98ECFBFF96E9F9FF93E7F8FF91E5F7FF8FE3F7FF8DE0F6FF8BDFF6FF88DC F5FF85DBF4FF83D9F3FF81D6F2FF7FD4F1FF7CD2F0FF7AD0F0FF77CDEFFF76CC EEFF73CAEEFF0A6090FF00517F000372AEFFAAF2FDFF9AECFAFF97EAFAFF94E8 F9FF92E6F8FF8FE3F7FF8EE1F7FF8BDFF6FF89DDF5FF86DBF5FF84D9F3FF82D7 F3FF7FD5F2FF7CD2F1FF7AD1F0FF78CEEFFF76CCEFFF73CAEDFF71C9EEFF0A5F 8FFF00517F000472ABFFA8F0FCFF98EBFAFF95E9FAFF92E6F8FF90E4F7FF8EE2 F7FF8CE0F6FF8ADFF6FF87DCF4FF85DAF3FF83D7F2FF80D6F2FF7ED3F1FF7BD1 F0FF79CFEFFF76CDEFFF73CAEDFF72C8EDFF70C7ECFF0A5F8EFF00527F000470 AAFFA5EEFBFF96EAFAFF93E7F9FF91E6F8FF8FE3F7FF8CE1F7FF8ADFF5FF88DC F5FF85DAF4FF83D8F3FF81D7F2FF7ED3F1FF7CD2F1FF7ACFF0FF77CEEFFF74CB EEFF72C9EEFF70C7ECFF6DC6EDFF0A5F8DFF00528000046FA8FFA4ECFBFF94E7 F8FF92E5F8FF8FE3F7FF8DE2F6FF8BDFF6FF89DDF5FF87DBF4FF84D8F3FF82D7 F2FF7FD5F2FF7CD3F1FF7AD0F0FF78CEEFFF75CBEEFF74CAEEFF71C8EDFF6EC5 ECFF6CC4EBFF0B5E8CFF00528000056EA7FFA1EBF9FF93E7F8FF90E4F7FF8EE2 F7FF8CE0F6FF89DEF4FF87DCF4FF84D9F4FF82D8F2FF80D5F2FF7ED3F1FF7BD0 F0FF78CFEFFF76CCEEFF74CAEDFF72C9EDFF6FC6ECFF6CC4EBFF6AC2ECFF0B5D 8BFF01528000056DA4FF9FE9F9FF91E5F7FF8FE2F7FF8CE0F7FF8ADEF6FF88DD F5FF85DAF4FF83D8F3FF80D5F1FF7ED4F1FF7BD1F1FF79D0F0FF77CCEFFF75CB EEFF72C9EEFF6FC6EDFF6EC5ECFF6BC3EBFF69C2EBFF0C5C89FF01528000066C A3FF9CE8F8FF8EE3F8FF8CE1F7FF8ADFF6FF88DDF5FF86DBF5FF83D9F4FF81D7 F3FF7ED5F3FF7CD3F1FF7AD1F1FF77CEF0FF75CCEFFF73CAEEFF71C8EEFF6EC6 EDFF6CC4EBFF69C1EBFF68C0ECFF0B5C89FF01538000066BA2FFB1E7F7FEA6E0 F3FFA2DDF1FF9EDBF0FF9AD9EEFF96D6EDFF92D3ECFF8FD0EAFF8ACDE9FF87CA E7FF82C8E6FF7FC5E4FF7BC2E4FF77BFE2FF73BCE0FF6FBADFFF6BB7DDFF67B4 DCFF63B2DBFF0B5B87FF025380000043761107679BFF07679AFF086699FF0865 98FF086597FF086496FF096395FF096393FF096293FF096191FF0A6191FF0A60 8FFF0A5F8EFF0B5E8DFF0B5E8CFF0B5D8CFF0B5D8AFF0B5C89FF0C5B88FF0352 7F00000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000C5B88000000 000000000000000000000000000000000000606060FF606060FF606060FF6060 60FF606060FF606060FF606060FF606060FF606060FF606060FF606060FF0000 0000000000000000000000000000000000000000000000000000000000000000 000000000000606060FFE4E4E4FFFDFDFDFFFDFDFDFFFCFCFCFFFAFAFAFFFAFA FAFFF9F9F9FFF8F8F8FFF7F7F7FFF7F7F7FFC6C6C6FF606060FF000000000000 0000000000000000000000000000000000000000000000000000606060FFF9F9 F9FFFDFDFDFFFDFDFDFFFCFCFCFFFCFCFCFFFAFAFAFFFAFAFAFFF9F9F9FFF9F9 F9FFF7F7F7FFF7F7F7FFF6F6F6FFEEEEEEFF606060FF00000000000000000000 000000000000000000000000000000000000606060FFFAFAFAFFBDBDBDFFBDBD BDFFBDBDBDFFBDBDBDFFBDBDBDFFBDBDBDFFBDBDBDFFBDBDBDFFBDBDBDFFBDBD BDFFBDBDBDFFFDFDFDFF606060FF000000000000000000000000000000000000 00000000000000000000606060FFFAFAFAFFB3B3B3FFE3E3E3FFE3E3E3FFE3E3 E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFB3B3B3FFF4F4 F4FF606060FF0000000000000000000000000000000000000000000000000000 0000606060FFFAFAFAFFBCBCBCFFDADADAFFD9D9D9FFD8D8D8FFD6D6D6FFD5D5 D5FFD4D4D4FFD3D3D3FFD2D2D2FFD2D2D2FFB7B7B7FFF2F2F2FF606060FF0000 0000000000000000000000000000000000000000000000000000606060FFFAFA FAFFB1B1B1FFB6B6B6FFB6B6B6FFB5B5B5FFB5B5B5FFB5B5B5FFB5B5B5FFB5B5 B5FFB4B4B4FFB4B4B4FFB1B1B1FFF2F2F2FF606060FF00000000000000000000 000000000000000000000000000000000000606060FFF8F8F8FFBCBCBCFFE6E6 E6FFE6E6E6FFE6E6E6FFE5E5E5FFE5E5E5FFE4E4E4FFE4E4E4FFE3E3E3FFE2E2 E2FFBBBBBBFFF4F4F4FF606060FF000000000000000000000000000000000000 00006060603E606060B3606060FFF8F8F8FFBBBBBBFFD1D1D1FFCFCFCFFFCECE CEFFCDCDCDFFCCCCCCFFCBCBCBFFCACACAFFC9C9C9FFC8C8C8FFB6B6B6FFF1F1 F1FF606060FF606060FF606060B30000000000000000CDCDCD10CDCDCD2FCDCD CD5E606060FFF8F8F8FFB2B2B2FFB7B7B7FFB7B7B7FFB6B6B6FFB6B6B6FFB6B6 B6FFB6B6B6FFB6B6B6FFB6B6B6FFB5B5B5FFB2B2B2FFF2F2F2FF606060FFCDCD CDBFCDCDCD76CDCDCD37CDCDCD170000000000000000606060B3606060FFFAFA FAFFE8E8E8FFE5E5E5FFE5E5E5FFE4E4E4FFE2E2E2FFE3E3E3FFDCDCDCFFDCDC DCFFE2E2E2FFD9D9D9FFDFDFDFFFF3F3F3FF606060FF606060FF606060B30000 000000000000000000000000000000000000606060FFFEFEFEFFA5A5A5FF8A8A 8AFFABABABFFD5D5D5FFBDBDBDFFBABABAFFB9B9B9FFB9B9B9FFB9B9B9FFB9B9 B9FFB8B8B8FFFCFCFCFF606060FF000000000000000000000000000000000000 00000000000000000000606060FFFEFEFEFF888888FFB2B2B2FF7E7E7EFFD6D6 D6FFC3C3C3FFDCDCDCFFDCDCDCFFDCDCDCFFDBDBDBFFDBDBDBFFB5B5B5FFFCFC FCFF606060FF0000000000000000000000000000000000000000000000000000 0000606060FFFDFDFDFFAAAAAAFF7C7C7CFFD3D3D3FFDEDEDEFFBDBDBDFFBDBD BDFFBCBCBCFFBCBCBCFFBCBCBCFFBCBCBCFFBDBDBDFFFCFCFCFF606060FF0000 0000000000000000000000000000000000000000000000000000606060FFFDFD FDFFDEDEDEFFDCDCDCFFDBDBDBFFDBDBDBFFDBDBDBFFDADADAFFDADADAFFDADA DAFFDADADAFFDADADAFFD9D9D9FFFCFCFCFF606060FF00000000000000000000 000000000000000000000000000000000000606060FFFDFDFDFFDADADAFFDADA DAFFAFAFAFFFC3C3C3FFA5A5A5FFC1C1C1FFADADADFFC3C3C3FFA3A3A3FFDCDC DCFFD7D7D7FFFCFCFCFF606060FF000000000000000000000000000000000000 00000000000000000000606060FFFDFDFDFFD7D7D7FFD6D6D6FFAEAEAEFFDBDB DBFFB6B6B6FFDADADAFFBBBBBBFFDCDCDCFFB4B4B4FFD7D7D7FFD3D3D3FFFCFC FCFF606060FF0000000000000000000000000000000000000000000000000000 0000606060FFFDFDFDFFD6D6D6FFD5D5D5FFB3B3B3FFD5D5D5FFAEAEAEFFD7D7 D7FFAFAFAFFFD6D6D6FFAAAAAAFFD4D4D4FFD3D3D3FFFCFCFCFF606060FF0000 0000000000000000000000000000000000000000000000000000606060FFFEFE FEFFFCFCFCFFFCFCFCFFFBFBFBFFFCFCFCFFFBFBFBFFFCFCFCFFFBFBFBFFFCFC FCFFFBFBFBFFFCFCFCFFFCFCFCFFFEFEFEFF606060FF00000000000000000000 00000000000000000000000000000000000053575591606060FF606060FF6060 60FF606060FF606060FF606060FF606060FF606060FF606060FF606060FF6060 60FF606060FF606060FF53575591000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000 } end end doublecmd-0.5.8/src/ucolumns.pas0000644000175000017500000010536711740433676015676 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Filepanel columns implementation unit Copyright (C) 2008 Dmitry Kolomiets (B4rr4cuda@rambler.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uColumns; {$mode objfpc}{$H+} interface uses Classes, SysUtils, DCClassesUtf8, Graphics, uFile, uFileSource, DCXmlConfig, uFileFunctions; type { TColPrm } TColPrm = class FontName: String; FontSize: Integer; FontStyle: TFontStyles; Overcolor: Boolean; TextColor, Background, Background2, MarkColor, CursorColor, CursorText: TColor; public constructor Create; end; { TPanelColumnsType } TPanelColumn = class private FFuncString: String; procedure SetFuncString(NewValue: String); public //--------------------- Title: String; {String is function or simpletext; TObject(integer)=indicator of function: 0 is simpletext; 1 is function;} FuncList: TStringList; Width: Integer; Align: TAlignment; //--------------------- FontName: String; FontSize: Integer; FontStyle: TFontStyles; Overcolor: Boolean; TextColor, Background, Background2, MarkColor, CursorColor, CursorText: TColor; //--------------------- constructor Create; destructor Destroy; override; //--------------------- function GetColumnResultString(AFile: TFile; const AFileSource: IFileSource): String; {en Converts string functions in the column into their integer values, so that they don't have to be compared by string during sorting. Call this before sorting then pass result to Compare in the sorting loop. } function GetColumnFunctions: TFileFunctions; //------------------------------------------------------ property FuncString: String read FFuncString write SetFuncString; end; { TPanelColumnsClass } TPanelColumnsClass = class //------------------------------------------------------ private FList: TList; fSetName: String; // Global settings for columns view. FCustomView: Boolean; FCursorBorder: Boolean; FCursorBorderColor: TColor; //------------------------------------------------------ public constructor Create; destructor Destroy; override; procedure Assign(const OtherColumnsClass: TPanelColumnsClass); //--------------------- function GetColumnTitle(const Index: Integer): String; function GetColumnFuncString(const Index: Integer): String; function GetColumnWidth(const Index: Integer): Integer; function GetColumnAlign(const Index: Integer): TAlignment; function GetColumnAlignString(const Index: Integer): String; //--------------------- function GetColumnFontName(const Index: Integer): String; function GetColumnFontSize(const Index: Integer): Integer; function GetColumnFontStyle(const Index: Integer): TFontStyles; function GetColumnOvercolor(const Index: Integer): Boolean; function GetColumnTextColor(const Index: Integer): TColor; function GetColumnBackground(const Index: Integer): TColor; function GetColumnBackground2(const Index: Integer): TColor; function GetColumnMarkColor(const Index: Integer): TColor; function GetColumnCursorColor(const Index: Integer): TColor; function GetColumnCursorText(const Index: Integer): TColor; //--------------------- function GetColumnPrm(const Index: Integer): TColPrm; //--------------------- function GetCursorBorder: Boolean; function GetCursorBorderColor: TColor; //--------------------- function GetColumnItem(const Index: Integer): TPanelColumn; function GetColumnItemResultString(const Index: Integer; const AFile: TFile; const AFileSource: IFileSource): String; function GetCount: Integer; function Add(Item: TPanelColumn): Integer; function Add(const Title, FuncString: String; const Width: Integer; const Align: TAlignment = taLeftJustify): Integer; overload; //--------------------- procedure SetColumnTitle(const Index: Integer; Title: String); procedure SetColumnFuncString(const Index: Integer; FuncString: String); procedure SetColumnWidth(Index, Width: Integer); procedure SetColumnAlign(const Index: Integer; Align: TAlignment); //--------------------- procedure SetColumnFontName(const Index: Integer; Value: String); procedure SetColumnFontSize(const Index: Integer; Value: Integer); procedure SetColumnFontStyle(const Index: Integer; Value: TFontStyles); procedure SetColumnTextColor(const Index: Integer; Value: TColor); procedure SetColumnBackground(const Index: Integer; Value: TColor); procedure SetColumnBackground2(const Index: Integer; Value: TColor); procedure SetColumnMarkColor(const Index: Integer; Value: TColor); procedure SetColumnCursorColor(const Index: Integer; Value: TColor); procedure SetColumnCursorText(const Index: Integer; Value: TColor); procedure SetColumnOvercolor(const Index: Integer; Value: Boolean); procedure SetColumnPrm(const Index: Integer; Value: TColPrm); //--------------------- procedure SetCursorBorder(ShowBorder: Boolean); procedure SetCursorBorderColor(Color: TColor); //--------------------- procedure Delete(const Index: Integer); procedure Clear; procedure AddDefaultColumns; //--------------------- procedure Load(Ini: TIniFileEx; SetName: String); overload; procedure Load(AConfig: TXmlConfig; ANode: TXmlNode); overload; //--------------------- procedure Save(Ini: TIniFileEx; ASetName: String); overload; procedure Save(AConfig: TXmlConfig; ANode: TXmlNode); overload; //--------------------- property ColumnsCount: Integer read GetCount; property Count: Integer read GetCount; property CustomView: Boolean read FCustomView write FCustomView; property CurrentColumnsSetName: String read fSetName write fSetName; property SetName: String read fSetName write fSetName; property Name: String read fSetName write fSetName; //------------------------------------------------------ end; { TPanelColumnsList } TPanelColumnsList = class private fSet: TStringList; function GetCount: Integer; public constructor Create; destructor Destroy; override; //--------------------- procedure Clear; procedure Load(Ini: TIniFileEx); overload; procedure Load(AConfig: TXmlConfig; ANode: TXmlNode); overload; procedure Save(Ini: TIniFileEx); overload; procedure Save(AConfig: TXmlConfig; ANode: TXmlNode); overload; function Add(Item: TPanelColumnsClass): Integer; procedure Insert(AIndex: Integer; Item: TPanelColumnsClass); procedure DeleteColumnSet(SetName: String); procedure DeleteColumnSet(SetIndex: Integer); overload; procedure CopyColumnSet(SetName, NewSetName: String); function GetColumnSet(const Index: Integer): TPanelColumnsClass; function GetColumnSet(Setname: String): TPanelColumnsClass; //--------------------- property Items: TStringList read fSet; property Count: Integer read GetCount; end; function StrToAlign(str: String): TAlignment; implementation uses uDebug, uLng, uGlobs; function StrToAlign(str: String): TAlignment; begin if str = '<-' then Result := taLeftJustify else if str = '->' then Result := taRightJustify else if str = '=' then Result := taCenter; end; { TPanelColumnsType } function TPanelColumnsClass.GetColumnTitle(const Index: Integer): String; begin if Index >= Flist.Count then Exit(EmptyStr); Result := TPanelColumn(Flist[Index]).Title; end; function TPanelColumnsClass.GetColumnFuncString(const Index: Integer): String; begin if Index >= Flist.Count then Exit(EmptyStr); Result := TPanelColumn(Flist[Index]).FuncString; end; function TPanelColumnsClass.GetColumnWidth(const Index: Integer): Integer; begin if Index >= Flist.Count then Exit(0); Result := TPanelColumn(Flist[Index]).Width; end; function TPanelColumnsClass.GetColumnAlign(const Index: Integer): TAlignment; begin if Index >= Flist.Count then Exit(taLeftJustify); Result := TPanelColumn(Flist[Index]).Align; end; function TPanelColumnsClass.GetColumnAlignString(const Index: Integer): String; begin if Index >= Flist.Count then Exit(EmptyStr); case TPanelColumn(Flist[Index]).Align of taLeftJustify: Result := '<-'; taRightJustify: Result := '->'; taCenter: Result := '='; end; end; function TPanelColumnsClass.GetColumnFontName(const Index: Integer): String; begin if FCustomView and (Index < Flist.Count) then Result := TPanelColumn(Flist[Index]).FontName else Result := gFonts[dcfMain].Name; end; function TPanelColumnsClass.GetColumnFontSize(const Index: Integer): Integer; begin if FCustomView and (Index < Flist.Count) then Result := TPanelColumn(Flist[Index]).FontSize else Result := gFonts[dcfMain].Size; end; function TPanelColumnsClass.GetColumnFontStyle(const Index: Integer): TFontStyles; begin if FCustomView and (Index < Flist.Count) then Result := TPanelColumn(Flist[Index]).FontStyle else Result := gFonts[dcfMain].Style; end; function TPanelColumnsClass.GetColumnOvercolor(const Index: Integer): Boolean; begin if FCustomView and (Index < Flist.Count) then Result := TPanelColumn(Flist[Index]).Overcolor else Result := True; end; function TPanelColumnsClass.GetColumnTextColor(const Index: Integer): TColor; begin if FCustomView and (Index < Flist.Count) then Result := TPanelColumn(Flist[Index]).TextColor else Result := gForeColor; end; function TPanelColumnsClass.GetColumnBackground(const Index: Integer): TColor; begin if FCustomView and (Index < Flist.Count) then Result := TPanelColumn(Flist[Index]).Background else Result := gBackColor; end; function TPanelColumnsClass.GetColumnBackground2(const Index: Integer): TColor; begin if FCustomView and (Index < Flist.Count) then Result := TPanelColumn(Flist[Index]).Background2 else Result := gBackColor2; end; function TPanelColumnsClass.GetColumnMarkColor(const Index: Integer): TColor; begin if FCustomView and (Index < Flist.Count) then Result := TPanelColumn(Flist[Index]).MarkColor else Result := gMarkColor; end; function TPanelColumnsClass.GetColumnCursorColor(const Index: Integer): TColor; begin if FCustomView and (Index < Flist.Count) then Result := TPanelColumn(Flist[Index]).CursorColor else Result := gCursorColor; end; function TPanelColumnsClass.GetColumnCursorText(const Index: Integer): TColor; begin if FCustomView and (Index < Flist.Count) then Result := TPanelColumn(Flist[Index]).CursorText else Result := gCursorText; end; function TPanelColumnsClass.GetColumnPrm(const Index: Integer): TColPrm; begin if Index >= Flist.Count then Exit(nil); Result := TColPrm.Create; Result.Overcolor := GetColumnOvercolor(Index); Result.Background := GetColumnBackground(Index); Result.Background2 := GetColumnBackground2(Index); Result.CursorColor := GetColumnCursorColor(Index); Result.CursorText := GetColumnCursorText(Index); Result.FontName := GetColumnFontName(Index); Result.FontSize := GetColumnFontSize(Index); Result.FontStyle := GetColumnFontStyle(Index); Result.MarkColor := GetColumnMarkColor(Index); Result.TextColor := GetColumnTextColor(Index); end; function TPanelColumnsClass.GetCursorBorder: Boolean; begin Result := FCursorBorder; end; function TPanelColumnsClass.GetCursorBorderColor: TColor; begin Result := FCursorBorderColor; end; function TPanelColumnsClass.GetColumnItem(const Index: Integer): TPanelColumn; begin if Index >= Flist.Count then Exit(nil); Result := TPanelColumn(Flist[Index]); end; function TPanelColumnsClass.GetColumnItemResultString(const Index: Integer; const AFile: TFile; const AFileSource: IFileSource): String; begin if Index >= Flist.Count then Exit(EmptyStr); Result := TPanelColumn(Flist[Index]).GetColumnResultString(AFile, AFileSource); end; constructor TPanelColumnsClass.Create; begin FList := TList.Create; end; procedure TPanelColumnsClass.Clear; begin while Flist.Count > 0 do begin TPanelColumn(Flist[0]).Free; FList.Delete(0); end; end; destructor TPanelColumnsClass.Destroy; begin Self.Clear; FreeAndNil(FList); inherited Destroy; end; procedure TPanelColumnsClass.Assign(const OtherColumnsClass: TPanelColumnsClass); var OldColumn, NewColumn: TPanelColumn; i: Integer; begin Clear; if not Assigned(OtherColumnsClass) then Exit; Name := OtherColumnsClass.Name; FCustomView := OtherColumnsClass.FCustomView; FCursorBorder := OtherColumnsClass.FCursorBorder; FCursorBorderColor := OtherColumnsClass.FCursorBorderColor; for i := 0 to OtherColumnsClass.ColumnsCount - 1 do begin OldColumn := OtherColumnsClass.GetColumnItem(i); NewColumn := TPanelColumn.Create; Add(NewColumn); NewColumn.Title := OldColumn.Title; NewColumn.FuncString := OldColumn.FuncString; NewColumn.Width := OldColumn.Width; NewColumn.Align := OldColumn.Align; NewColumn.FontName := OldColumn.FontName; NewColumn.FontSize := OldColumn.FontSize; NewColumn.FontStyle := OldColumn.FontStyle; NewColumn.Overcolor := OldColumn.Overcolor; NewColumn.TextColor := OldColumn.TextColor; NewColumn.Background := OldColumn.Background; NewColumn.Background2 := OldColumn.Background2; NewColumn.MarkColor := OldColumn.MarkColor; NewColumn.CursorColor := OldColumn.CursorColor; NewColumn.CursorText := OldColumn.CursorText; end; end; function TPanelColumnsClass.GetCount: Integer; begin Result := FList.Count; end; function TPanelColumnsClass.Add(Item: TPanelColumn): Integer; begin Result := FList.Add(Item); end; function TPanelColumnsClass.Add(const Title, FuncString: String; const Width: Integer; const Align: TAlignment): Integer; var AColumn: TPanelColumn; begin AColumn := TPanelColumn.Create; Result := FList.Add(AColumn); AColumn.Title := Title; AColumn.FuncString := FuncString; AColumn.Width := Width; AColumn.Align := Align; AColumn.FontName := gFonts[dcfMain].Name; AColumn.FontSize := gFonts[dcfMain].Size; AColumn.FontStyle := gFonts[dcfMain].Style; AColumn.Overcolor := True; AColumn.TextColor := gForeColor; AColumn.Background := gBackColor; AColumn.Background2 := gBackColor2; AColumn.MarkColor := gMarkColor; AColumn.CursorColor := gCursorColor; AColumn.CursorText := gCursorText; end; procedure TPanelColumnsClass.SetColumnTitle(const Index: Integer; Title: String); begin if Index > Flist.Count then Exit; TPanelColumn(Flist[Index]).Title := Title; end; procedure TPanelColumnsClass.SetColumnFuncString(const Index: Integer; FuncString: String); begin if Index > Flist.Count then Exit; TPanelColumn(Flist[Index]).FuncString := FuncString; end; procedure TPanelColumnsClass.SetColumnWidth(Index, Width: Integer); begin if Index > Flist.Count then Exit; TPanelColumn(Flist[Index]).Width := Width; end; procedure TPanelColumnsClass.SetColumnAlign(const Index: Integer; Align: TAlignment); begin if Index > Flist.Count then Exit; TPanelColumn(Flist[Index]).Align := Align; end; procedure TPanelColumnsClass.SetColumnFontName(const Index: Integer; Value: String); begin if Index > Flist.Count then Exit; TPanelColumn(Flist[Index]).FontName := Value; end; procedure TPanelColumnsClass.SetColumnFontSize(const Index: Integer; Value: Integer); begin if Index > Flist.Count then Exit; TPanelColumn(Flist[Index]).FontSize := Value; end; procedure TPanelColumnsClass.SetColumnFontStyle(const Index: Integer; Value: TFontStyles); begin if Index > Flist.Count then Exit; TPanelColumn(Flist[Index]).FontStyle := Value; end; procedure TPanelColumnsClass.SetColumnTextColor(const Index: Integer; Value: TColor); begin if Index > Flist.Count then Exit; TPanelColumn(Flist[Index]).TextColor := Value; end; procedure TPanelColumnsClass.SetColumnBackground(const Index: Integer; Value: TColor); begin if Index > Flist.Count then Exit; TPanelColumn(Flist[Index]).Background := Value; end; procedure TPanelColumnsClass.SetColumnBackground2(const Index: Integer; Value: TColor); begin if Index > Flist.Count then Exit; TPanelColumn(Flist[Index]).Background2 := Value; end; procedure TPanelColumnsClass.SetColumnMarkColor(const Index: Integer; Value: TColor); begin if Index > Flist.Count then Exit; TPanelColumn(Flist[Index]).MarkColor := Value; end; procedure TPanelColumnsClass.SetColumnCursorColor(const Index: Integer; Value: TColor); begin if Index > Flist.Count then Exit; TPanelColumn(Flist[Index]).CursorColor := Value; end; procedure TPanelColumnsClass.SetColumnCursorText(const Index: Integer; Value: TColor); begin if Index > Flist.Count then Exit; TPanelColumn(Flist[Index]).CursorText := Value; end; procedure TPanelColumnsClass.SetColumnOvercolor(const Index: Integer; Value: Boolean); begin if Index > Flist.Count then Exit; TPanelColumn(Flist[Index]).Overcolor := Value; end; procedure TPanelColumnsClass.SetColumnPrm(const Index: Integer; Value: TColPrm); begin if Index >= Flist.Count then Exit; SetColumnBackground(Index, Value.Background); SetColumnBackground2(Index, Value.Background2); SetColumnCursorColor(Index, Value.CursorColor); SetColumnCursorText(Index, Value.CursorText); SetColumnFontName(Index, Value.FontName); SetColumnFontSize(Index, Value.FontSize); SetColumnFontStyle(Index, Value.FontStyle); SetColumnMarkColor(Index, Value.MarkColor); SetColumnTextColor(Index, Value.TextColor); SetColumnOvercolor(Index, Value.Overcolor); end; procedure TPanelColumnsClass.SetCursorBorder(ShowBorder: Boolean); begin FCursorBorder := ShowBorder; end; procedure TPanelColumnsClass.SetCursorBorderColor(Color: TColor); begin FCursorBorderColor := Color; end; procedure TPanelColumnsClass.AddDefaultColumns; var DCFunc: String; begin SetName := 'Default'; DCFunc := '[' + sFuncTypeDC + '().%s{}]'; // file name Add(rsColName, Format(DCFunc, [TFileFunctionStrings[fsfNameNoExtension]]), 250, taLeftJustify); // file ext Add(rsColExt, Format(DCFunc, [TFileFunctionStrings[fsfExtension]]), 50, taLeftJustify); // file size Add(rsColSize, Format(DCFunc, [TFileFunctionStrings[fsfSize]]), 70, taRightJustify); // file date/time Add(rsColDate, Format(DCFunc, [TFileFunctionStrings[fsfModificationTime]]), 70, taRightJustify); // file attributes Add(rsColAttr, Format(DCFunc, [TFileFunctionStrings[fsfAttr]]), 175, taLeftJustify); end; procedure TPanelColumnsClass.Load(Ini: TIniFileEx; SetName: String); var aCount, I: Integer; begin fSetName := SetName; Self.Clear; aCount := Ini.ReadInteger(fSetName, 'ColumnCount', 0); //--------------------- if aCount = 0 then begin AddDefaultColumns; end else for I := 0 to aCount - 1 do begin Flist.Add(TPanelColumn.Create); TPanelColumn(FList[I]).Title:=Ini.ReadString(fSetName,'Column'+IntToStr(I+1)+'Title',''); //--------------------- TPanelColumn(FList[I]).FuncString:=Ini.ReadString(fSetName,'Column'+IntToStr(I+1)+'FuncsString',''); TPanelColumn(FList[I]).Width:=Ini.ReadInteger(fSetName,'Column'+IntToStr(I+1)+'Width',50); TPanelColumn(FList[I]).Align:=TAlignment(Ini.ReadInteger(fSetName,'Column'+IntToStr(I+1)+'Align',0)); //--------------------- TPanelColumn(FList[I]).FontName:=Ini.ReadString(fSetName,'Column'+IntToStr(I+1)+'FontName',gFonts[dcfMain].Name); TPanelColumn(FList[I]).FontSize:=Ini.ReadInteger(fSetName,'Column'+IntToStr(I+1)+'FontSize',gFonts[dcfMain].Size); TPanelColumn(FList[I]).FontStyle:=TFontStyles(Ini.ReadInteger(fSetName,'Column'+IntToStr(I+1)+'FontStyle',Integer(gFonts[dcfMain].Style))); TPanelColumn(FList[I]).Overcolor:=Ini.ReadBool(fSetName,'Column'+IntToStr(I+1)+'Overcolor',true ); TPanelColumn(FList[I]).TextColor:=Tcolor(Ini.ReadInteger(fSetName,'Column'+IntToStr(I+1)+'TextColor',gForeColor)); TPanelColumn(FList[I]).Background:=Tcolor(Ini.ReadInteger(fSetName,'Column'+IntToStr(I+1)+'Background',gBackColor )); TPanelColumn(FList[I]).Background2:=Tcolor(Ini.ReadInteger(fSetName,'Column'+IntToStr(I+1)+'Background2',gBackColor2 )); TPanelColumn(FList[I]).MarkColor:=Tcolor(Ini.ReadInteger(fSetName,'Column'+IntToStr(I+1)+'MarkColor',gMarkColor )); TPanelColumn(FList[I]).CursorColor:=Tcolor(Ini.ReadInteger(fSetName,'Column'+IntToStr(I+1)+'CursorColor',gCursorColor )); TPanelColumn(FList[I]).CursorText:=Tcolor(Ini.ReadInteger(fSetName,'Column'+IntToStr(I+1)+'CursorText',gCursorText )); //--------------------- end; //--------------------- FCustomView := Ini.ReadBool(fSetName, 'CustomView', False); SetCursorBorder(Ini.ReadBool(fSetName, 'CursorBorder', False)); SetCursorBorderColor(TColor(Ini.ReadInteger(fSetName, 'CursorBorderColor', gCursorColor))); end; procedure TPanelColumnsClass.Load(AConfig: TXmlConfig; ANode: TXmlNode); var AColumn: TPanelColumn; SubNode: TXmlNode; begin FCustomView := AConfig.GetValue(ANode, 'CustomView', False); SetCursorBorder(AConfig.GetAttr(ANode, 'CursorBorder/Enabled', False)); SetCursorBorderColor(TColor(AConfig.GetValue(ANode, 'CursorBorder/Color', gCursorColor))); Clear; SubNode := ANode.FindNode('Columns'); if Assigned(SubNode) then begin SubNode := SubNode.FirstChild; while Assigned(SubNode) do begin if SubNode.CompareName('Column') = 0 then begin AColumn := TPanelColumn.Create; FList.Add(AColumn); AColumn.Title := AConfig.GetValue(SubNode, 'Title', ''); AColumn.FuncString := AConfig.GetValue(SubNode, 'FuncString', ''); AColumn.Width := AConfig.GetValue(SubNode, 'Width', 50); AColumn.Align := TAlignment(AConfig.GetValue(SubNode, 'Align', Integer(0))); AConfig.GetFont(SubNode, 'Font', AColumn.FontName, AColumn.FontSize, Integer(AColumn.FontStyle), gFonts[dcfMain].Name, gFonts[dcfMain].Size, Integer(gFonts[dcfMain].Style)); AColumn.Overcolor := AConfig.GetValue(SubNode, 'Overcolor', True); AColumn.TextColor := TColor(AConfig.GetValue(SubNode, 'TextColor', gForeColor)); AColumn.Background := TColor(AConfig.GetValue(SubNode, 'Background', gBackColor)); AColumn.Background2 := TColor(AConfig.GetValue(SubNode, 'Background2', gBackColor2)); AColumn.MarkColor := TColor(AConfig.GetValue(SubNode, 'MarkColor', gMarkColor)); AColumn.CursorColor := TColor(AConfig.GetValue(SubNode, 'CursorColor', gCursorColor)); AColumn.CursorText := TColor(AConfig.GetValue(SubNode, 'CursorText', gCursorText)); end; SubNode := SubNode.NextSibling; end; end; if Count = 0 then AddDefaultColumns; end; procedure TPanelColumnsClass.Save(Ini: TIniFileEx; ASetName: String); var I: Integer; begin fSetName := ASetName; if fSetName = '' then Exit; Ini.EraseSection(fSetName); Ini.WriteInteger(fSetName, 'ColumnCount', FList.Count); for I := 0 to FList.Count - 1 do begin Ini.WriteString(fSetName,'Column'+IntToStr(I+1)+'Title',TPanelColumn(FList[I]).Title); Ini.WriteString(fSetName,'Column'+IntToStr(I+1)+'FuncsString',TPanelColumn(FList[I]).FuncString); Ini.WriteInteger(fSetName,'Column'+IntToStr(I+1)+'Width', TPanelColumn(FList[I]).Width); Ini.WriteInteger(fSetName,'Column'+IntToStr(I+1)+'Align', Integer(TPanelColumn(FList[I]).Align)); //--------------------- Ini.WriteString(fSetName,'Column'+IntToStr(I+1)+'FontName',TPanelColumn(FList[I]).FontName); Ini.WriteInteger(fSetName,'Column'+IntToStr(I+1)+'FontSize', TPanelColumn(FList[I]).FontSize); Ini.WriteInteger(fSetName,'Column'+IntToStr(I+1)+'FontStyle', Integer(TPanelColumn(FList[I]).FontStyle)); Ini.WriteBool(fSetName,'Column'+IntToStr(I+1)+'Overcolor', TPanelColumn(FList[I]).Overcolor); if TPanelColumn(FList[I]).TextColor <>clNone then Ini.WriteInteger(fSetName,'Column'+IntToStr(I+1)+'TextColor', TPanelColumn(FList[I]).TextColor); if TPanelColumn(FList[I]).Background <>clNone then Ini.WriteInteger(fSetName,'Column'+IntToStr(I+1)+'Background', TPanelColumn(FList[I]).Background); if TPanelColumn(FList[I]).Background2 <>clNone then Ini.WriteInteger(fSetName,'Column'+IntToStr(I+1)+'Background2', TPanelColumn(FList[I]).Background2); if TPanelColumn(FList[I]).MarkColor <>clNone then Ini.WriteInteger(fSetName,'Column'+IntToStr(I+1)+'MarkColor', TPanelColumn(FList[I]).MarkColor); if TPanelColumn(FList[I]).CursorColor <>clNone then Ini.WriteInteger(fSetName,'Column'+IntToStr(I+1)+'CursorColor', TPanelColumn(FList[I]).CursorColor); if TPanelColumn(FList[I]).CursorText <>clNone then Ini.WriteInteger(fSetName,'Column'+IntToStr(I+1)+'CursorText', TPanelColumn(FList[I]).CursorText); end; Ini.WriteBool(fSetName, 'CustomView', FCustomView); Ini.WriteBool(fSetName, 'CursorBorder', GetCursorBorder); if GetCursorBorderColor <> clNone then Ini.WriteInteger(fSetName, 'CursorBorderColor', GetCursorBorderColor); end; procedure TPanelColumnsClass.Save(AConfig: TXmlConfig; ANode: TXmlNode); var I: Integer; SubNode: TXmlNode; AColumn: TPanelColumn; begin AConfig.SetValue(ANode, 'CustomView', FCustomView); AConfig.SetAttr(ANode, 'CursorBorder/Enabled', GetCursorBorder); if GetCursorBorderColor <> clNone then AConfig.SetValue(ANode, 'CursorBorder/Color', GetCursorBorderColor); ANode := AConfig.FindNode(ANode, 'Columns', True); AConfig.ClearNode(ANode); for I := 0 to FList.Count - 1 do begin AColumn := TPanelColumn(FList[I]); SubNode := AConfig.AddNode(ANode, 'Column'); AConfig.AddValue(SubNode, 'Title', AColumn.Title); AConfig.AddValue(SubNode, 'FuncString', AColumn.FuncString); AConfig.AddValue(SubNode, 'Width', AColumn.Width); AConfig.AddValue(SubNode, 'Align', Integer(AColumn.Align)); AConfig.SetFont(SubNode, 'Font', AColumn.FontName, AColumn.FontSize, Integer(AColumn.FontStyle)); AConfig.AddValue(SubNode, 'Overcolor', AColumn.Overcolor); if AColumn.TextColor <> clNone then AConfig.AddValue(SubNode, 'TextColor', AColumn.TextColor); if AColumn.Background <> clNone then AConfig.AddValue(SubNode, 'Background', AColumn.Background); if AColumn.Background2 <> clNone then AConfig.AddValue(SubNode, 'Background2', AColumn.Background2); if AColumn.MarkColor <> clNone then AConfig.AddValue(SubNode, 'MarkColor', AColumn.MarkColor); if AColumn.CursorColor <> clNone then AConfig.AddValue(SubNode, 'CursorColor', AColumn.CursorColor); if AColumn.CursorText <> clNone then AConfig.AddValue(SubNode, 'CursorText', AColumn.CursorText); end; end; procedure TPanelColumnsClass.Delete(const Index: Integer); begin if Index > Flist.Count then Exit; TPanelColumn(Flist[Index]).Free; FList.Delete(Index); end; { TPanelColumn } constructor TPanelColumn.Create; begin FuncList := TStringList.Create; end; destructor TPanelColumn.Destroy; begin FreeAndNil(FuncList); inherited Destroy; end; function TPanelColumn.GetColumnFunctions: TFileFunctions; var FuncCount: Integer = 0; i: Integer; begin if Assigned(FuncList) and (FuncList.Count > 0) then begin SetLength(Result, FuncList.Count); // Start with all strings. for i := 0 to FuncList.Count - 1 do begin // Don't need to compare simple text, only functions. if PtrInt(FuncList.Objects[i]) = 1 then begin Result[FuncCount] := GetFileFunctionByName(FuncList.Strings[i]); // If the function was found, save it's number. if Result[FuncCount] <> fsfInvalid then FuncCount := FuncCount + 1; end; end; SetLength(Result, FuncCount); // Set the actual functions count. end else SetLength(Result, 0); end; function TPanelColumn.GetColumnResultString(AFile: TFile; const AFileSource: IFileSource): String; var i: Integer; s: String; begin s := ''; Result := ''; if (not Assigned(FuncList)) or (FuncList.Count = 0) then Exit; for i := 0 to FuncList.Count - 1 do begin //Item is simpletext if PtrInt(FuncList.Objects[i]) = 0 then s := s + FuncList[I] else //Item is function begin s := s + FormatFileFunction(FuncList[I], AFile, AFileSource); end; end; Result := s; end; procedure TPanelColumn.SetFuncString(NewValue: String); procedure FillListFromString(List: TStrings; FuncS: String); var p: Integer; begin while True do begin p := pos('[', FuncS); if p = 0 then Break else if p > 1 then List.AddObject(Copy(FuncS, 1, p - 1), TObject(0)); Delete(FuncS, 1, p); p := pos(']', FuncS); if p = 0 then Break else if p > 1 then List.AddObject(Copy(FuncS, 1, p - 1), TObject(1)); Delete(FuncS, 1, p); end; if FuncS <> '' then List.AddObject(FuncS, TObject(0)); end; begin FFuncString := NewValue; FillListFromString(FuncList, NewValue); end; { TPanelColumnsList } function TPanelColumnsList.GetCount: Integer; begin Result := fSet.Count; end; constructor TPanelColumnsList.Create; begin FSet := TStringList.Create; end; destructor TPanelColumnsList.Destroy; var i: Integer; begin if Assigned(FSet) then begin for i := 0 to Fset.Count - 1 do TPanelColumnsClass(Fset.Objects[i]).Free; FreeAndNil(FSet); end; inherited Destroy; end; procedure TPanelColumnsList.Clear; var i: Integer; begin for i := 0 to Fset.Count - 1 do TPanelColumnsClass(Fset.Objects[i]).Free; Fset.Clear; end; procedure TPanelColumnsList.Load(Ini: TIniFileEx); var aCount, I: Integer; begin Self.Clear; aCount := Ini.ReadInteger('ColumnsSet', 'ColumnsSetCount', 0); for I := 0 to aCount - 1 do begin fSet.AddObject(Ini.ReadString('ColumnsSet', 'ColumnsSet' + IntToStr(I + 1) + 'Name', ''), TPanelColumnsClass.Create); TPanelColumnsClass(fSet.Objects[I]).Load(ini, fset[i]); DCDebug('FsetName=' + Fset[i]); end; DCDebug('FsetCount=' + IntToStr(fset.Count)); end; procedure TPanelColumnsList.Load(AConfig: TXmlConfig; ANode: TXmlNode); var AName: String; AnObject: TPanelColumnsClass; begin Clear; ANode := ANode.FindNode('ColumnsSets'); if Assigned(ANode) then begin ANode := ANode.FirstChild; while Assigned(ANode) do begin if ANode.CompareName('ColumnsSet') = 0 then begin if AConfig.TryGetValue(ANode, 'Name', AName) then begin AnObject := TPanelColumnsClass.Create; fSet.AddObject(AName, AnObject); AnObject.Name := AName; AnObject.Load(AConfig, ANode); end else DCDebug('Invalid entry in configuration: ' + AConfig.GetPathFromNode(ANode) + '.'); end; ANode := ANode.NextSibling; end; end; end; procedure TPanelColumnsList.Save(Ini: TIniFileEx); var I: Integer; begin Ini.EraseSection('ColumnsSet'); Ini.WriteInteger('ColumnsSet', 'ColumnsSetCount', FSet.Count); for I := 0 to FSet.Count - 1 do begin Ini.WriteString('ColumnsSet', 'ColumnsSet' + IntToStr(I + 1) + 'Name', FSet[i]); TPanelColumnsClass(Fset.Objects[i]).Save(ini, FSet[i]); end; end; procedure TPanelColumnsList.Save(AConfig: TXmlConfig; ANode: TXmlNode); var I: Integer; SubNode: TXmlNode; begin ANode := AConfig.FindNode(ANode, 'ColumnsSets', True); AConfig.ClearNode(ANode); for I := 0 to FSet.Count - 1 do begin SubNode := AConfig.AddNode(ANode, 'ColumnsSet'); AConfig.AddValue(SubNode, 'Name', FSet[I]); TPanelColumnsClass(Fset.Objects[I]).Save(AConfig, SubNode); end; end; function TPanelColumnsList.Add(Item: TPanelColumnsClass): Integer; begin Result := Fset.AddObject(Item.Name, Item); end; procedure TPanelColumnsList.Insert(AIndex: Integer; Item: TPanelColumnsClass); begin Fset.InsertObject(AIndex, Item.Name, Item); end; procedure TPanelColumnsList.DeleteColumnSet(SetName: String); begin DeleteColumnSet(fSet.IndexOf(SetName)); end; procedure TPanelColumnsList.DeleteColumnSet(SetIndex: Integer); begin if (SetIndex >= Fset.Count) or (SetIndex < 0) then Exit; TPanelColumnsClass(fSet.Objects[SetIndex]).Free; fSet.Delete(SetIndex); end; procedure TPanelColumnsList.CopyColumnSet(SetName, NewSetName: String); var OldSetIndex, NewSetIndex: Integer; OldSet, NewSet: TPanelColumnsClass; begin OldSetIndex := fSet.IndexOf(SetName); if OldSetIndex <> -1 then begin OldSet := TPanelColumnsClass(fSet.Objects[OldSetIndex]); NewSetIndex := fSet.IndexOf(NewSetName); if NewSetIndex <> -1 then NewSet := TPanelColumnsClass(fSet.Objects[NewSetIndex]) else begin NewSet := TPanelColumnsClass.Create; fSet.AddObject(NewSetName, NewSet); end; NewSet.Assign(OldSet); // Set new name. NewSet.Name := NewSetName; end; end; function TPanelColumnsList.GetColumnSet(const Index: Integer): TPanelColumnsClass; begin //DCDebug('FsetCount='+inttostr(fset.Count)); if (Index > -1) and (Index < Fset.Count) then Result := TPanelColumnsClass(Fset.Objects[Index]) else begin if fset.Count = 0 then begin Fset.AddObject('Default', TPanelColumnsClass.Create); TPanelColumnsClass(Fset.Objects[0]).AddDefaultColumns; end; Result := TPanelColumnsClass(Fset.Objects[0]); end; end; function TPanelColumnsList.GetColumnSet(Setname: String): TPanelColumnsClass; begin //DCDebug('FsetCount='+inttostr(fset.Count)); if fset.IndexOf(Setname) > -1 then Result := TPanelColumnsClass(Fset.Objects[fset.IndexOf(Setname)]) else begin if fset.Count = 0 then begin Fset.AddObject('Default', TPanelColumnsClass.Create); TPanelColumnsClass(Fset.Objects[0]).AddDefaultColumns; end; Result := TPanelColumnsClass(Fset.Objects[0]); end; end; { TColPrm } constructor TColPrm.Create; begin Self.Overcolor := True; Self.FontName := gFonts[dcfMain].Name; Self.FontSize := gFonts[dcfMain].Size; Self.FontStyle := gFonts[dcfMain].Style; Self.TextColor := gForeColor; Self.Background := gBackColor; Self.Background2 := gBackColor2; Self.MarkColor := gMarkColor; Self.CursorColor := gCursorColor; Self.CursorText := gCursorText; end; end. doublecmd-0.5.8/src/uhighlighterprocs.pas0000644000175000017500000001035411740433676017552 0ustar alexxalexx{------------------------------------------------------------------------------- The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is: uHighlighterProcs.pas, released 2000-06-23. The Initial Author of the Original Code is Michael Hieke. All Rights Reserved. Contributors to the SynEdit project are listed in the Contributors.txt file. Alternatively, the contents of this file may be used under the terms of the GNU General Public License Version 2 or later (the "GPL"), in which case the provisions of the GPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. $Id: uHighlighterProcs.pas,v 1.3 2002/06/15 06:57:24 etrusco Exp $ You may retrieve the latest version of this file at the SynEdit home page, located at http://SynEdit.SourceForge.net Known Issues: -------------------------------------------------------------------------------} unit uHighlighterProcs; interface uses Classes, SynEditHighlighter; procedure GetHighlighters(AOwner: TComponent; AHighlighters: TStringList; AppendToList: boolean); function GetHighlightersFilter(AHighlighters: TStringList): string; function GetHighlighterFromFileExt(AHighlighters: TStringList; Extension: string): TSynCustomHighlighter; implementation uses SysUtils; procedure GetHighlighters(AOwner: TComponent; AHighlighters: TStringList; AppendToList: boolean); var i: integer; Highlighter: TSynCustomHighlighter; begin if Assigned(AOwner) and Assigned(AHighlighters) then begin if not AppendToList then AHighlighters.Clear; for i := AOwner.ComponentCount - 1 downto 0 do begin if not (AOwner.Components[i] is TSynCustomHighlighter) then continue; Highlighter := AOwner.Components[i] as TSynCustomHighlighter; // only one highlighter for each language if AHighlighters.IndexOf(Highlighter.GetLanguageName) = -1 then AHighlighters.AddObject(Highlighter.GetLanguageName, Highlighter); end; AHighlighters.Sort; end; end; function GetHighlightersFilter(AHighlighters: TStringList): string; var i: integer; Highlighter: TSynCustomHighlighter; begin Result := ''; if Assigned(AHighlighters) then for i := 0 to AHighlighters.Count - 1 do begin if not (AHighlighters.Objects[i] is TSynCustomHighlighter) then continue; Highlighter := TSynCustomHighlighter(AHighlighters.Objects[i]); if Highlighter.DefaultFilter = '' then continue; Result := Result + Highlighter.DefaultFilter; if Result[Length(Result)] <> '|' then Result := Result + '|'; end; end; function GetHighlighterFromFileExt(AHighlighters: TStringList; Extension: string): TSynCustomHighlighter; var ExtLen: integer; i, j: integer; Highlighter: TSynCustomHighlighter; Filter: string; begin Extension := LowerCase(Extension); ExtLen := Length(Extension); if Assigned(AHighlighters) and (ExtLen > 0) then begin for i := 0 to AHighlighters.Count - 1 do begin if not (AHighlighters.Objects[i] is TSynCustomHighlighter) then continue; Highlighter := TSynCustomHighlighter(AHighlighters.Objects[i]); Filter := LowerCase(Highlighter.DefaultFilter); j := Pos('|', Filter); if j > 0 then begin Delete(Filter, 1, j); j := Pos(Extension, Filter); if (j > 0) and ((j + ExtLen > Length(Filter)) or (Filter[j + ExtLen] = ';')) then begin Result := Highlighter; exit; end; end; end; end; Result := nil; end; end. doublecmd-0.5.8/src/uwfxmodule.pas0000644000175000017500000006712412217255050016212 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Virtual File System - class for manage WFX plugins (Version 1.3) Copyright (C) 2007-2013 Koblov Alexander (Alexx2000@mail.ru) Callback functions based on: Total Commander filesystem plugins debugger Author: Pavel Dubrovsky This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uWFXmodule; {$mode objfpc}{$H+} interface uses SysUtils, Classes, WfxPlugin, uWFXprototypes, dynlibs, DCClassesUtf8, Extension, DCBasicTypes, DCXmlConfig; const WFX_SUCCESS = 0; WFX_NOTSUPPORTED = -10; WFX_ERROR = -20; type { TWfxFindData } TWfxFindData = record FileAttributes : TFileAttrs; CreationTime, LastAccessTime, LastWriteTime : TDateTime; FileSize : Int64; Reserved0, Reserved1 : LongWord; FileName : UTF8String; AlternateFileName : UTF8String; case Boolean of True: ( FindDataA: TWin32FindData; ); False: ( FindDataW: TWin32FindDataW; ); end; { TWFXModule } TWFXModule = class private FModuleHandle: TLibHandle; // Handle to .DLL or .so FModuleFileName: UTF8String; FBackgroundFlags: Integer; public { Mandatory } FsInit : TFsInit; FsFindFirst : TFsFindFirst; FsFindNext : TFsFindNext; FsFindClose : TFsFindClose; { Optional } FsSetCryptCallback: TFsSetCryptCallback; FsGetDefRootName : TFsGetDefRootName; FsGetFile : TFsGetFile; FsPutFile : TFsPutFile; FsDeleteFile : TFsDeleteFile; FsRemoveDir : TFsRemoveDir; FsExecuteFile : TFsExecuteFile; FsMkDir : TFsMkDir; FsStatusInfo : TFsStatusInfo; FsSetDefaultParams : TFsSetDefaultParams; FsContentPluginUnloading : TFsContentPluginUnloading; //--------------------- FsSetAttr:TFsSetAttr; FsSetTime:TFsSetTime; FsExtractCustomIcon:TFsExtractCustomIcon; FsRenMovFile:TFsRenMovFile; FsDisconnect:TFsDisconnect; FsGetPreviewBitmap:TFsGetPreviewBitmap; FsLinksToLocalFiles:TFsLinksToLocalFiles; FsGetLocalName:TFsGetLocalName; //--------------------- FsGetBackgroundFlags: TFsGetBackgroundFlags; //--------------------- FsContentGetDetectString:TFsContentGetDetectString; FsContentGetSupportedField:TFsContentGetSupportedField; FsContentGetValue:TFsContentGetValue; FsContentSetDefaultParams:TFsContentSetDefaultParams; FsContentStopGetValue:TFsContentStopGetValue; FsContentGetDefaultSortOrder:TFsContentGetDefaultSortOrder; FsContentGetSupportedFieldFlags:TFsContentGetSupportedFieldFlags; FsContentSetValue:TFsContentSetValue; FsContentGetDefaultView:TFsContentGetDefaultView; { Unicode } FsInitW: TFsInitW; FsFindFirstW: TFsFindFirstW; FsFindNextW: TFsFindNextW; //--------------------- FsSetCryptCallbackW: TFsSetCryptCallbackW; FsMkDirW: TFsMkDirW; FsExecuteFileW: TFsExecuteFileW; FsRenMovFileW: TFsRenMovFileW; FsGetFileW: TFsGetFileW; FsPutFileW: TFsPutFileW; FsDeleteFileW: TFsDeleteFileW; FsRemoveDirW: TFsRemoveDirW; FsDisconnectW: TFsDisconnectW; FsSetAttrW: TFsSetAttrW; FsSetTimeW: TFsSetTimeW; FsStatusInfoW: TFsStatusInfoW; FsExtractCustomIconW: TFsExtractCustomIconW; FsGetPreviewBitmapW: TFsGetPreviewBitmapW; FsGetLocalNameW: TFsGetLocalNameW; //----------------------- FsContentGetValueW: TFsContentGetValueW; FsContentStopGetValueW: TFsContentStopGetValueW; FsContentSetValueW: TFsContentSetValueW; FsContentGetDefaultViewW: TFsContentGetDefaultViewW; { Extension API } ExtensionInitialize: TExtensionInitializeProc; ExtensionFinalize: TExtensionFinalizeProc; public function WfxFindFirst(Path: UTF8String; var FindData: TWfxFindData): THandle; function WfxFindNext(Hdl: THandle; var FindData: TWfxFindData): Boolean; procedure WfxStatusInfo(RemoteDir: UTF8String; InfoStartEnd, InfoOperation: Integer); function WfxExecuteFile(MainWin: HWND; var RemoteName: UTF8String; Verb: UTF8String): Integer; function WfxRenMovFile(OldName, NewName: UTF8String; Move, OverWrite: Boolean; RemoteInfo: PRemoteInfo): Integer; function WfxGetFile(RemoteName, LocalName: UTF8String; CopyFlags: Integer; RemoteInfo: PRemoteInfo): Integer; function WfxPutFile(LocalName, RemoteName: UTF8String; CopyFlags: Integer): Integer; function WfxSetAttr(RemoteName: UTF8String; NewAttr: LongInt): Boolean; {en Each of CreationTime, LastAccessTime, LastWriteTime may be @nil to leave the value unchanged. } function WfxSetTime(RemoteName: UTF8String; pCreationTime, pLastAccessTime, pLastWriteTime: PWfxFileTime): Boolean; function WfxMkDir(const sBasePath, sDirName: UTF8String): LongInt; function WfxRemoveDir(const sDirName: UTF8String): Boolean; function WfxDeleteFile(const sFileName: UTF8String): Boolean; function WfxGetLocalName(var sFileName: UTF8String): Boolean; public constructor Create; destructor Destroy; override; function LoadModule(const sName: String):Boolean; {Load plugin} procedure UnloadModule; procedure VFSInit(Data: PtrInt); function VFSConfigure(Parent: THandle):Boolean; function VFSRootName: UTF8String; function IsLoaded: Boolean; property BackgroundFlags: Integer read FBackgroundFlags write FBackgroundFlags; end; { TWFXModuleList } TWFXModuleList = class(TStringList) private function GetAEnabled(Index: Integer): Boolean; function GetAFileName(Index: Integer): String; function GetAName(Index: Integer): String; procedure SetAEnabled(Index: Integer; const AValue: Boolean); procedure SetAFileName(Index: Integer; const AValue: String); procedure SetAName(Index: Integer; const AValue: String); public procedure Load(Ini: TIniFileEx); overload; procedure Load(AConfig: TXmlConfig; ANode: TXmlNode); overload; procedure Save(Ini: TIniFileEx); overload; procedure Save(AConfig: TXmlConfig; ANode: TXmlNode); overload; function Add(Ext: String; FileName: String): Integer; reintroduce; function FindFirstEnabledByName(Name: String): Integer; property Name[Index: Integer]: String read GetAName write SetAName; property FileName[Index: Integer]: String read GetAFileName write SetAFileName; property Enabled[Index: Integer]: Boolean read GetAEnabled write SetAEnabled; end; function GetErrorMsg(iErrorMsg: LongInt): UTF8String; implementation uses uLng, FileUtil, uGlobsPaths, uOSUtils, uWfxPluginUtil, fDialogBox, uDebug, DCOSUtils, DCStrUtils; const WfxIniFileName = 'wfx.ini'; function GetErrorMsg(iErrorMsg: LongInt): UTF8String; begin case iErrorMsg of WFX_ERROR: Result:= 'Unknown error!'; WFX_NOTSUPPORTED, FS_FILE_NOTSUPPORTED: Result:= rsMsgErrNotSupported; FS_FILE_NOTFOUND: Result:= 'File not found!'; FS_FILE_READERROR: Result:= rsMsgErrERead; FS_FILE_WRITEERROR: Result:= rsMsgErrEWrite; FS_FILE_USERABORT: Result:= rsMsgErrEAborted; end; end; { TWfxFindData } procedure ConvertFindData(var FindData: TWfxFindData; AnsiData: Boolean); begin with FindData do begin // Convert file attributes FileAttributes:= FindDataW.dwFileAttributes; CreationTime:= WfxFileTimeToDateTime(FindDataW.ftCreationTime); LastAccessTime:= WfxFileTimeToDateTime(FindDataW.ftLastAccessTime); LastWriteTime:= WfxFileTimeToDateTime(FindDataW.ftLastWriteTime); Int64Rec(FileSize).Lo:= FindDataW.nFileSizeLow; Int64Rec(FileSize).Hi:= FindDataW.nFileSizeHigh; Reserved0:= FindDataW.dwReserved0; Reserved1:= FindDataW.dwReserved1; // Convert file name if AnsiData then begin FileName:= SysToUTF8(FindDataA.cFileName); AlternateFileName:= SysToUTF8(FindDataA.cAlternateFileName); end else begin FileName:= UTF8Encode(WideString(FindDataW.cFileName)); AlternateFileName:= UTF8Encode(WideString(FindDataW.cAlternateFileName)); end; end; end; { TWFXModule } function TWFXModule.WfxFindFirst(Path: UTF8String; var FindData: TWfxFindData): THandle; begin try if Assigned(FsFindFirstW) then begin Result:= FsFindFirstW(PWideChar(UTF8Decode(Path)), FindData.FindDataW); if Result <> wfxInvalidHandle then ConvertFindData(FindData, False); end else if Assigned(FsFindFirst) then begin Result:= FsFindFirst(PAnsiChar(UTF8ToSys(Path)), FindData.FindDataA); if Result <> wfxInvalidHandle then ConvertFindData(FindData, True); end; except on E: Exception do begin Result:= wfxInvalidHandle; DCDebug(ClassName + '.WfxFindFirst(). Error: ' + E.Message); end; end; end; function TWFXModule.WfxFindNext(Hdl: THandle; var FindData: TWfxFindData): Boolean; begin if Assigned(FsFindFirstW) then begin Result:= FsFindNextW(Hdl, FindData.FindDataW); if Result then ConvertFindData(FindData, False); end else if Assigned(FsFindFirst) then begin Result:= FsFindNext(Hdl, FindData.FindDataA); if Result then ConvertFindData(FindData, True); end; end; procedure TWFXModule.WFXStatusInfo(RemoteDir: UTF8String; InfoStartEnd, InfoOperation: Integer); begin if Assigned(FsStatusInfoW) then FsStatusInfoW(PWideChar(UTF8Decode(RemoteDir)), InfoStartEnd, InfoOperation) else if Assigned(FsStatusInfo) then FsStatusInfo(PAnsiChar(UTF8ToSys(RemoteDir)), InfoStartEnd, InfoOperation); end; function TWFXModule.WfxExecuteFile(MainWin: HWND; var RemoteName: UTF8String; Verb: UTF8String): Integer; var pacRemoteName: PAnsiChar; pwcRemoteName: PWideChar; begin Result:= WFX_NOTSUPPORTED; if Assigned(FsExecuteFileW) then begin pwcRemoteName:= GetMem(MAX_PATH * SizeOf(WideChar)); StrPCopyW(pwcRemoteName, UTF8Decode(RemoteName)); Result:= FsExecuteFileW(MainWin, pwcRemoteName, PWideChar(UTF8Decode(Verb))); if Result = FS_EXEC_SYMLINK then RemoteName:= UTF8Encode(WideString(pwcRemoteName)); FreeMem(pwcRemoteName); end else if Assigned(FsExecuteFile) then begin pacRemoteName:= GetMem(MAX_PATH); StrPCopy(pacRemoteName, UTF8ToSys(RemoteName)); Result:= FsExecuteFile(MainWin, pacRemoteName, PAnsiChar(UTF8ToSys(Verb))); if Result = FS_EXEC_SYMLINK then RemoteName:= SysToUTF8(StrPas(pacRemoteName)); FreeMem(pacRemoteName); end; end; function TWFXModule.WfxRenMovFile(OldName, NewName: UTF8String; Move, OverWrite: Boolean; RemoteInfo: PRemoteInfo): Integer; begin Result:= FS_FILE_NOTSUPPORTED; if Assigned(FsRenMovFileW) then Result:= FsRenMovFileW(PWideChar(UTF8Decode(OldName)), PWideChar(UTF8Decode(NewName)), Move, OverWrite, RemoteInfo) else if Assigned(FsRenMovFile) then Result:= FsRenMovFile(PAnsiChar(UTF8ToSys(OldName)), PAnsiChar(UTF8ToSys(NewName)), Move, OverWrite, RemoteInfo); end; function TWFXModule.WfxGetFile(RemoteName, LocalName: UTF8String; CopyFlags: Integer; RemoteInfo: PRemoteInfo): Integer; begin Result:= FS_FILE_NOTSUPPORTED; if Assigned(FsGetFileW) then Result:= FsGetFileW(PWideChar(UTF8Decode(RemoteName)), PWideChar(UTF8Decode(LocalName)), CopyFlags, RemoteInfo) else if Assigned(FsGetFile) then Result:= FsGetFile(PAnsiChar(UTF8ToSys(RemoteName)), PAnsiChar(UTF8ToSys(LocalName)), CopyFlags, RemoteInfo); end; function TWFXModule.WfxPutFile(LocalName, RemoteName: UTF8String; CopyFlags: Integer): Integer; begin Result:= FS_FILE_NOTSUPPORTED; if Assigned(FsPutFileW) then Result:= FsPutFileW(PWideChar(UTF8Decode(LocalName)), PWideChar(UTF8Decode(RemoteName)), CopyFlags) else if Assigned(FsPutFile) then Result:= FsPutFile(PAnsiChar(UTF8ToSys(LocalName)), PAnsiChar(UTF8ToSys(RemoteName)), CopyFlags); end; function TWFXModule.WfxSetAttr(RemoteName: UTF8String; NewAttr: LongInt): Boolean; begin Result:= False; if Assigned(FsSetAttrW) then Result:= FsSetAttrW(PWideChar(UTF8Decode(RemoteName)), NewAttr) else if Assigned(FsSetAttr) then Result:= FsSetAttr(PAnsiChar(UTF8ToSys(RemoteName)), NewAttr); end; function TWFXModule.WfxSetTime(RemoteName: UTF8String; pCreationTime, pLastAccessTime, pLastWriteTime: PWfxFileTime): Boolean; begin Result:= False; if Assigned(FsSetTimeW) then Result:= FsSetTimeW(PWideChar(UTF8Decode(RemoteName)), pCreationTime, pLastAccessTime, pLastWriteTime) else if Assigned(FsSetTime) then Result:= FsSetTime(PAnsiChar(UTF8ToSys(RemoteName)), pCreationTime, pLastAccessTime, pLastWriteTime); end; function TWFXModule.WfxMkDir(const sBasePath, sDirName: UTF8String): LongInt; begin Result:= WFX_NOTSUPPORTED; if Assigned(FsMkDirW) then begin WfxStatusInfo(sBasePath, FS_STATUS_START, FS_STATUS_OP_MKDIR); if FsMkDirW(PWideChar(UTF8Decode(sDirName))) then Result:= WFX_SUCCESS else Result:= WFX_ERROR; WfxStatusInfo(sBasePath, FS_STATUS_END, FS_STATUS_OP_MKDIR); end else if Assigned(FsMkDir) then begin WfxStatusInfo(sBasePath, FS_STATUS_START, FS_STATUS_OP_MKDIR); if FsMkDir(PAnsiChar(UTF8ToSys(sDirName))) then Result:= WFX_SUCCESS else Result:= WFX_ERROR; WfxStatusInfo(sBasePath, FS_STATUS_END, FS_STATUS_OP_MKDIR); end; end; function TWFXModule.WfxRemoveDir(const sDirName: UTF8String): Boolean; begin Result:= False; if Assigned(FsRemoveDirW) then Result:= FsRemoveDirW(PWideChar(UTF8Decode(sDirName))) else if Assigned(FsRemoveDir) then Result:= FsRemoveDir(PAnsiChar(UTF8ToSys(sDirName))); end; function TWFXModule.WfxDeleteFile(const sFileName: UTF8String): Boolean; begin Result:= False; if Assigned(FsDeleteFileW) then Result:= FsDeleteFileW(PWideChar(UTF8Decode(sFileName))) else if Assigned(FsDeleteFile) then Result:= FsDeleteFile(PAnsiChar(UTF8ToSys(sFileName))); end; function TWFXModule.WfxGetLocalName(var sFileName: UTF8String): Boolean; var pacRemoteName: PAnsiChar; pwcRemoteName: PWideChar; begin Result:= False; if Assigned(FsGetLocalNameW) then begin pwcRemoteName:= GetMem(MAX_PATH * SizeOf(WideChar)); StrPCopyW(pwcRemoteName, UTF8Decode(sFileName)); Result:= FsGetLocalNameW(pwcRemoteName, MAX_PATH); if Result = True then sFileName:= UTF8Encode(WideString(pwcRemoteName)); FreeMem(pwcRemoteName); end else if Assigned(FsGetLocalName) then begin pacRemoteName:= GetMem(MAX_PATH); StrPCopy(pacRemoteName, UTF8ToSys(sFileName)); Result:= FsGetLocalName(pacRemoteName, MAX_PATH); if Result = True then sFileName:= SysToUTF8(StrPas(pacRemoteName)); FreeMem(pacRemoteName); end; end; constructor TWFXModule.Create; begin inherited; end; destructor TWFXModule.Destroy; begin if IsLoaded then begin if Assigned(FsContentPluginUnloading) then FsContentPluginUnloading; if Assigned(ExtensionFinalize) then ExtensionFinalize(nil); //------------------------------------------------------ UnloadModule; end; inherited; end; function TWFXModule.LoadModule(const sName: String): Boolean; begin FModuleHandle := mbLoadLibrary(sName); if FModuleHandle = 0 then Exit(False); DCDebug('WFX module loaded ' + sName + ' at ' + hexStr(Pointer(FModuleHandle))); FModuleFileName:= sName; { Mandatory } FsInit := TFsInit(GetProcAddress(FModuleHandle,'FsInit')); FsFindFirst := TFsFindFirst(GetProcAddress(FModuleHandle,'FsFindFirst')); FsFindNext := TFsFindNext(GetProcAddress(FModuleHandle,'FsFindNext')); FsFindClose := TFsFindClose(GetProcAddress(FModuleHandle,'FsFindClose')); { Unicode } FsInitW := TFsInitW(GetProcAddress(FModuleHandle,'FsInitW')); FsFindFirstW := TFsFindFirstW(GetProcAddress(FModuleHandle,'FsFindFirstW')); FsFindNextW := TFsFindNextW(GetProcAddress(FModuleHandle,'FsFindNextW')); Result:= (FsInit <> nil) and (FsFindFirst <> nil) and (FsFindNext <> nil); if (Result = False) then begin FsInit:= nil; FsFindFirst:= nil; FsFindNext:= nil; Result:= (FsInitW <> nil) and (FsFindFirstW <> nil) and (FsFindNextW <> nil); end; if (Result = False) or (FsFindClose = nil) then begin FsInitW:= nil; FsFindFirstW:= nil; FsFindNextW:= nil; FsFindClose:= nil; Exit(False); end; { Optional } FsSetCryptCallback:= TFsSetCryptCallback(GetProcAddress(FModuleHandle,'FsSetCryptCallback')); FsGetDefRootName := TFsGetDefRootName(GetProcAddress(FModuleHandle,'FsGetDefRootName')); FsExecuteFile := TFsExecuteFile(GetProcAddress(FModuleHandle,'FsExecuteFile')); FsGetFile := TFsGetFile(GetProcAddress(FModuleHandle,'FsGetFile')); FsPutFile := TFsPutFile(GetProcAddress(FModuleHandle,'FsPutFile')); FsDeleteFile := TFsDeleteFile(GetProcAddress(FModuleHandle,'FsDeleteFile')); FsMkDir := TFsMkDir(GetProcAddress(FModuleHandle,'FsMkDir')); FsRemoveDir := TFsRemoveDir(GetProcAddress(FModuleHandle,'FsRemoveDir')); FsStatusInfo := TFsStatusInfo(GetProcAddress(FModuleHandle,'FsStatusInfo')); FsSetDefaultParams := TFsSetDefaultParams(GetProcAddress(FModuleHandle,'FsSetDefaultParams')); FsContentPluginUnloading := TFsContentPluginUnloading(GetProcAddress(FModuleHandle,'FsContentPluginUnloading')); //--------------------- FsSetAttr := TFsSetAttr (GetProcAddress(FModuleHandle,'FsSetAttr')); FsSetTime := TFsSetTime (GetProcAddress(FModuleHandle,'FsSetTime')); FsExtractCustomIcon := TFsExtractCustomIcon (GetProcAddress(FModuleHandle,'FsExtractCustomIcon')); FsRenMovFile := TFsRenMovFile (GetProcAddress(FModuleHandle,'FsRenMovFile')); FsDisconnect := TFsDisconnect (GetProcAddress(FModuleHandle,'FsDisconnect')); FsGetPreviewBitmap := TFsGetPreviewBitmap (GetProcAddress(FModuleHandle,'FsGetPreviewBitmap')); FsLinksToLocalFiles := TFsLinksToLocalFiles (GetProcAddress(FModuleHandle,'FsLinksToLocalFiles')); FsGetLocalName := TFsGetLocalName (GetProcAddress(FModuleHandle,'FsGetLocalName')); //--------------------- FsGetBackgroundFlags := TFsGetBackgroundFlags (GetProcAddress(FModuleHandle,'FsGetBackgroundFlags')); //--------------------- FsContentGetDetectString := TFsContentGetDetectString (GetProcAddress(FModuleHandle,'FsContentGetDetectString')); FsContentGetSupportedField := TFsContentGetSupportedField (GetProcAddress(FModuleHandle,'FsContentGetSupportedField')); FsContentGetValue := TFsContentGetValue (GetProcAddress(FModuleHandle,'FsContentGetValue')); FsContentSetDefaultParams := TFsContentSetDefaultParams (GetProcAddress(FModuleHandle,'FsContentSetDefaultParams')); FsContentStopGetValue := TFsContentStopGetValue (GetProcAddress(FModuleHandle,'FsContentStopGetValue')); FsContentGetDefaultSortOrder := TFsContentGetDefaultSortOrder (GetProcAddress(FModuleHandle,'FsContentGetDefaultSortOrder')); FsContentGetSupportedFieldFlags := TFsContentGetSupportedFieldFlags (GetProcAddress(FModuleHandle,'FsContentGetSupportedFieldFlags')); FsContentSetValue := TFsContentSetValue (GetProcAddress(FModuleHandle,'FsContentSetValue')); FsContentGetDefaultView := TFsContentGetDefaultView (GetProcAddress(FModuleHandle,'FsContentGetDefaultView')); { Unicode } FsSetCryptCallbackW:= TFsSetCryptCallbackW(GetProcAddress(FModuleHandle,'FsSetCryptCallbackW')); FsMkDirW := TFsMkDirW(GetProcAddress(FModuleHandle,'FsMkDirW')); FsExecuteFileW := TFsExecuteFileW(GetProcAddress(FModuleHandle,'FsExecuteFileW')); FsRenMovFileW := TFsRenMovFileW(GetProcAddress(FModuleHandle,'FsRenMovFileW')); FsGetFileW := TFsGetFileW(GetProcAddress(FModuleHandle,'FsGetFileW')); FsPutFileW := TFsPutFileW(GetProcAddress(FModuleHandle,'FsPutFileW')); FsDeleteFileW := TFsDeleteFileW(GetProcAddress(FModuleHandle,'FsDeleteFileW')); FsRemoveDirW := TFsRemoveDirW(GetProcAddress(FModuleHandle,'FsRemoveDirW')); FsDisconnectW := TFsDisconnectW(GetProcAddress(FModuleHandle,'FsDisconnectW')); FsSetAttrW := TFsSetAttrW (GetProcAddress(FModuleHandle,'FsSetAttrW')); FsSetTimeW := TFsSetTimeW (GetProcAddress(FModuleHandle,'FsSetTimeW')); FsStatusInfoW := TFsStatusInfoW(GetProcAddress(FModuleHandle,'FsStatusInfoW')); FsExtractCustomIconW := TFsExtractCustomIconW(GetProcAddress(FModuleHandle,'FsExtractCustomIconW')); FsGetLocalNameW := TFsGetLocalNameW(GetProcAddress(FModuleHandle,'FsGetLocalNameW')); { Extension API } ExtensionInitialize:= TExtensionInitializeProc(GetProcAddress(FModuleHandle,'ExtensionInitialize')); ExtensionFinalize:= TExtensionFinalizeProc(GetProcAddress(FModuleHandle,'ExtensionFinalize')); end; procedure TWFXModule.UnloadModule; begin {$IF (not DEFINED(LINUX)) or ((FPC_VERSION > 2) or ((FPC_VERSION=2) and (FPC_RELEASE >= 5)))} if FModuleHandle <> 0 then FreeLibrary(FModuleHandle); {$ENDIF} FModuleHandle := 0; { Mandatory } FsInit := nil; FsFindFirst := nil; FsFindNext := nil; FsFindClose := nil; { Optional } FsSetCryptCallback := nil; FsGetDefRootName := nil; FsGetFile := nil; FsPutFile := nil; FsDeleteFile := nil; FsRemoveDir := nil; FsExecuteFile := nil; FsMkDir := nil; FsStatusInfo := nil; FsSetDefaultParams:=nil; //--------------------- FsSetAttr := nil; FsSetTime := nil; FsExtractCustomIcon := nil; FsRenMovFile := nil; FsDisconnect := nil; FsGetPreviewBitmap := nil; FsLinksToLocalFiles := nil; FsGetLocalName := nil; //--------------------- FsGetBackgroundFlags := nil; //--------------------- FsContentGetDetectString := nil; FsContentGetSupportedField := nil; FsContentGetValue := nil; FsContentSetDefaultParams := nil; FsContentStopGetValue := nil; FsContentGetDefaultSortOrder := nil; FsContentGetSupportedFieldFlags := nil; FsContentSetValue := nil; FsContentGetDefaultView := nil; FsContentPluginUnloading := nil; { Unicode } FsInitW := nil; FsFindFirstW := nil; FsFindNextW := nil; //--------------------- FsSetCryptCallbackW:= nil; FsMkDirW := nil; FsExecuteFileW := nil; FsRenMovFileW := nil; FsGetFileW := nil; FsPutFileW := nil; FsDeleteFileW := nil; FsRemoveDirW := nil; FsDisconnectW := nil; FsSetAttrW := nil; FsSetTimeW := nil; FsStatusInfoW := nil; FsExtractCustomIconW := nil; FsGetLocalNameW := nil; // Extension API ExtensionInitialize:= nil; ExtensionFinalize:= nil; end; procedure TWFXModule.VFSInit(Data: PtrInt); var dps: tFsDefaultParamStruct; StartupInfo: TExtensionStartupInfo; begin if Assigned(FsSetDefaultParams) then begin dps.DefaultIniName := mbFileNameToSysEnc(gpCfgDir + WfxIniFileName); dps.PluginInterfaceVersionHi:= 2; dps.PluginInterfaceVersionLow:= 0; dps.Size:= SizeOf(dps); FsSetDefaultParams(@dps); end; if not Assigned(FsGetBackgroundFlags) then FBackgroundFlags:= 0 else FBackgroundFlags:= FsGetBackgroundFlags(); // Extension API if Assigned(ExtensionInitialize) then begin FillByte(StartupInfo, SizeOf(TExtensionStartupInfo), 0); with StartupInfo do begin StructSize:= SizeOf(TExtensionStartupInfo); PluginDir:= ExtractFilePath(FModuleFileName); PluginConfDir:= gpCfgDir; InputBox:= @fDialogBox.InputBox; MessageBox:= @fDialogBox.MessageBox; DialogBoxLFM:= @fDialogBox.DialogBoxLFM; DialogBoxLRS:= @fDialogBox.DialogBoxLRS; DialogBoxLFMFile:= @fDialogBox.DialogBoxLFMFile; SendDlgMsg:= @fDialogBox.SendDlgMsg; end; ExtensionInitialize(@StartupInfo); end; end; function TWFXModule.VFSConfigure(Parent: THandle): Boolean; var RemoteName: UTF8String; begin try RemoteName:= PathDelim; WFXStatusInfo(PathDelim, FS_STATUS_START, FS_STATUS_OP_EXEC); Result:= (WfxExecuteFile(Parent, RemoteName, 'properties') = FS_EXEC_OK); WFXStatusInfo(PathDelim, FS_STATUS_END, FS_STATUS_OP_EXEC); except on E: Exception do begin Result:= False; DCDebug(ClassName + '.VFSConfigure(). Error: ' + E.Message); end; end; end; function TWFXModule.VFSRootName: UTF8String; var pcRootName : PAnsiChar; begin Result:= EmptyStr; if Assigned(FsGetDefRootName) then begin pcRootName:= GetMem(MAX_PATH); Assert(Assigned(pcRootName)); try FsGetDefRootName(pcRootName, MAX_PATH); Result := StrPas(pcRootName); finally FreeMem(pcRootName); end; end; end; function TWFXModule.IsLoaded: Boolean; begin Result := (FModuleHandle <> 0); end; { TWFXModuleList } function TWFXModuleList.GetAEnabled(Index: Integer): Boolean; begin Result:= Boolean(PtrInt(Objects[Index])); end; function TWFXModuleList.GetAFileName(Index: Integer): String; begin Result:= ValueFromIndex[Index]; end; function TWFXModuleList.GetAName(Index: Integer): String; begin Result:= Names[Index]; end; procedure TWFXModuleList.SetAEnabled(Index: Integer; const AValue: Boolean); begin Objects[Index]:= TObject(PtrInt(AValue)); end; procedure TWFXModuleList.SetAFileName(Index: Integer; const AValue: String); begin ValueFromIndex[Index]:= AValue; end; procedure TWFXModuleList.SetAName(Index: Integer; const AValue: String); var sValue : String; begin sValue:= ValueFromIndex[Index]; Self[Index]:= AValue + '=' + sValue; end; procedure TWFXModuleList.Load(Ini: TIniFileEx); var I: Integer; sCurrPlugin: String; LEnabled: Boolean; begin Ini.ReadSectionRaw('FileSystemPlugins', Self); for I:= 0 to Count - 1 do begin sCurrPlugin := Name[I]; if (sCurrPlugin = '') then Continue; LEnabled := (sCurrPlugin[1] <> '#'); Enabled[I]:= LEnabled; if not LEnabled then Name[I]:= Copy(sCurrPlugin, 2, MaxInt); end; end; procedure TWFXModuleList.Load(AConfig: TXmlConfig; ANode: TXmlNode); var I: Integer; AName, APath: String; begin Clear; ANode := ANode.FindNode('WfxPlugins'); if Assigned(ANode) then begin ANode := ANode.FirstChild; while Assigned(ANode) do begin if ANode.CompareName('WfxPlugin') = 0 then begin if AConfig.TryGetValue(ANode, 'Name', AName) and AConfig.TryGetValue(ANode, 'Path', APath) then begin I := Add(AName, APath); Enabled[I] := AConfig.GetAttr(ANode, 'Enabled', True); end else DCDebug('Invalid entry in configuration: ' + AConfig.GetPathFromNode(ANode) + '.'); end; ANode := ANode.NextSibling; end; end; end; procedure TWFXModuleList.Save(Ini: TIniFileEx); var I: Integer; LName: String; begin Ini.EraseSection('FileSystemPlugins'); for I := 0 to Count - 1 do begin if Enabled[I] then LName := Name[I] else LName := '#' + Name[I]; Ini.WriteString('FileSystemPlugins', LName, FileName[I]); end; end; procedure TWFXModuleList.Save(AConfig: TXmlConfig; ANode: TXmlNode); var I: Integer; SubNode: TXmlNode; begin ANode := AConfig.FindNode(ANode, 'WfxPlugins', True); AConfig.ClearNode(ANode); for I := 0 to Count - 1 do begin SubNode := AConfig.AddNode(ANode, 'WfxPlugin'); AConfig.SetAttr(SubNode, 'Enabled', Enabled[I]); AConfig.AddValue(SubNode, 'Name', Name[I]); AConfig.AddValue(SubNode, 'Path', FileName[I]); end; end; function TWFXModuleList.Add(Ext: String; FileName: String): Integer; begin Result:= AddObject(Ext + '=' + FileName, TObject(True)); end; function TWFXModuleList.FindFirstEnabledByName(Name: String): Integer; begin for Result := 0 to Count - 1 do if Enabled[Result] and (DoCompareText(Names[Result], Name) = 0) then Exit; Result := -1; end; end. doublecmd-0.5.8/src/ufindthread.pas0000644000175000017500000002705312063016143016302 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Thread for search files (called from frmSearchDlg) Copyright (C) 2003-2004 Radek Cervinka (radek.cervinka@centrum.cz) Copyright (C) 2006-2012 Alexander Koblov (alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uFindThread; {$mode objfpc}{$H+} interface uses Classes, StdCtrls, SysUtils, uFindFiles, uFindEx; type { TFindThread } TFindThread = class(TThread) private FItems: TStrings; FStatus: TLabel; FFound: TLabel; FCurrent: TLabel; FCurrentDir:String; FFilesScanned:Integer; FFilesFound:Integer; FFoundFile:String; FCurrentDepth: Integer; FSearchTemplate: TSearchTemplateRec; FSelectedFiles: TStringList; FFileChecks: TFindFileChecks; FLinkTargets: TStringList; // A list of encountered directories (for detecting cycles) function CheckFile(const Folder : String; const sr : TSearchRecEx) : Boolean; function CheckDirectory(const CurrentDir, FolderName : String) : Boolean; function FindInFile(const sFileName:UTF8String; sData: String; bCase:Boolean): Boolean; protected procedure Execute; override; public constructor Create(const AFindOptions: TSearchTemplateRec; SelectedFiles: TStringList); destructor Destroy; override; procedure AddFile; procedure DoFile(const sNewDir: String; const sr : TSearchRecEx); procedure WalkAdr(const sNewDir: String); procedure UpDateProgress; function IsAborting: Boolean; property Items:TStrings write FItems; property Status:TLabel read FStatus write FStatus; property Found:TLabel read FFound write FFound; property Current:TLabel read FCurrent write FCurrent; // label current file end; implementation uses LCLProc, StrUtils, LConvEncoding, DCStrUtils, uLng, DCClassesUtf8, uFindMmap, uGlobs, uShowMsg, DCOSUtils, uOSUtils, uLog; { TFindThread } constructor TFindThread.Create(const AFindOptions: TSearchTemplateRec; SelectedFiles: TStringList); begin inherited Create(True); FLinkTargets := TStringList.Create; FSearchTemplate := AFindOptions; FSelectedFiles := SelectedFiles; with FSearchTemplate do begin if SearchDepth < 0 then SearchDepth := MaxInt; // use case insensitive mask because // MatchesMaskList work incorrect with non ASCII characters // since it uses UpCase function FilesMasks := UTF8UpperCase(FilesMasks); ExcludeFiles := UTF8UpperCase(ExcludeFiles); ExcludeDirectories := UTF8UpperCase(ExcludeDirectories); FindText := ConvertEncoding(FindText, EncodingUTF8, TextEncoding); ReplaceText := ConvertEncoding(ReplaceText, EncodingUTF8, TextEncoding); end; SearchTemplateToFindFileChecks(FSearchTemplate, FFileChecks); end; destructor TFindThread.Destroy; begin FreeThenNil(FLinkTargets); inherited Destroy; end; procedure TFindThread.Execute; var I: Integer; sr: TSearchRecEx; sTemp, sPath: UTF8String; begin FreeOnTerminate := True; try Assert(Assigned(FItems), 'Assert: FItems is empty'); Synchronize(@UpDateProgress); FCurrentDepth:= -1; if not Assigned(FSelectedFiles) or (FSelectedFiles.Count = 0) then begin // Normal search (all directories). sTemp:= FSearchTemplate.StartPath; while sTemp <> EmptyStr do begin sPath:= Copy2SymbDel(sTemp, ';'); sPath:= ExcludeBackPathDelimiter(sPath); WalkAdr(sPath); end; end else begin // Search only selected directories. for I := 0 to FSelectedFiles.Count - 1 do begin if FindFirstEx(FSelectedFiles[I], faAnyFile, sr) = 0 then begin if FPS_ISDIR(sr.Attr) then WalkAdr(FSelectedFiles[I]) else DoFile(ExtractFileDir(FSelectedFiles[I]), sr); end; FindCloseEx(sr); end; end; FCurrentDir:= rsOperFinished; Synchronize(@UpDateProgress); except on E:Exception do msgError(Self, E.Message); end; end; procedure TFindThread.AddFile; begin FItems.Add(FFoundFile); end; function TFindThread.CheckDirectory(const CurrentDir, FolderName : String): Boolean; begin with FSearchTemplate do begin Result := CheckDirectoryName(FFileChecks, UTF8UpperCase(FolderName)) and CheckDirectoryNameRelative(FFileChecks, UTF8UpperCase(CurrentDir + PathDelim + FolderName), UTF8UpperCase(FSearchTemplate.StartPath)); end; end; procedure TFindThread.UpDateProgress; begin FStatus.Caption:= Format(rsFindScanned, [FFilesScanned]); FFound.Caption := Format(rsFindFound, [FFilesFound]); FCurrent.Caption:= rsFindScanning + ': ' + FCurrentDir; end; function TFindThread.FindInFile(const sFileName:UTF8String; sData: String; bCase:Boolean): Boolean; var fs: TFileStreamEx; function FillBuffer(Buffer: PAnsiChar; BytesToRead: Longint): Longint; var DataRead: Longint; begin Result := 0; repeat DataRead := fs.Read(Buffer[Result], BytesToRead - Result); if DataRead = 0 then Break; Result := Result + DataRead; until Result >= BytesToRead; end; var lastPos, sDataLength, DataRead: Longint; Buffer: PAnsiChar = nil; BufferSize: Integer; begin Result := False; if sData = '' then Exit; if gUseMmapInSearch then begin // memory mapping should be slightly faster and use less memory case FindMmap(sFileName, sData, bCase, @IsAborting) of 0 : Exit(False); 1 : Exit(True); // else fall back to searching via stream reading end; end; BufferSize := gCopyBlockSize; sDataLength := Length(sData); if sDataLength > BufferSize then raise Exception.Create(rsMsgErrSmallBuf); fs := TFileStreamEx.Create(sFileName, fmOpenRead or fmShareDenyNone); try if sDataLength > fs.Size then // string longer than file, cannot search Exit; // Buffer is extended by sDataLength-1 and BufferSize + sDataLength - 1 // bytes are read. Then strings of length sDataLength are compared with // sData starting from offset 0 to BufferSize-1. The remaining part of the // buffer [BufferSize, BufferSize+sDataLength-1] is moved to the beginning, // buffer is filled up with BufferSize bytes and the search continues. GetMem(Buffer, BufferSize + sDataLength - 1); if Assigned(Buffer) then try if FillBuffer(Buffer, sDataLength-1) = sDataLength-1 then begin while not Terminated do begin DataRead := FillBuffer(@Buffer[sDataLength-1], BufferSize); if DataRead = 0 then Break; for lastPos := 0 to DataRead - 1 do begin if PosMem(@Buffer[lastPos], sDataLength, 0, sData, bCase, False) <> Pointer(-1) then Exit(True); // found end; // Copy last 'sDataLength-1' bytes to the beginning of the buffer // (to search 'on the boundary' - where previous buffer ends, // and the next buffer starts). Move(Buffer[DataRead], Buffer^, sDataLength-1); end; end; except end; finally FreeAndNil(fs); if Assigned(Buffer) then begin FreeMem(Buffer); Buffer := nil; end; end; end; procedure FileReplaceString(const FileName, SearchString, ReplaceString: string; bCase:Boolean); var fs: TFileStreamEx; S: string; Flags : TReplaceFlags = []; begin Include(Flags, rfReplaceAll); if not bCase then Include(Flags, rfIgnoreCase); fs := TFileStreamEx.Create(FileName, fmOpenread or fmShareDenyNone); try SetLength(S, fs.Size); fs.ReadBuffer(S[1], fs.Size); finally fs.Free; end; S := StringReplace(S, SearchString, replaceString, Flags); fs := TFileStreamEx.Create(FileName, fmCreate); try fs.WriteBuffer(S[1], Length(S)); finally fs.Free; end; end; function TFindThread.CheckFile(const Folder : String; const sr : TSearchRecEx) : Boolean; begin Result := True; with FSearchTemplate do begin if not CheckFileName(FFileChecks, UTF8UpperCase(sr.Name)) then Exit(False); if (IsDateFrom or IsDateTo or IsTimeFrom or IsTimeTo or IsNotOlderThan) then Result := CheckFileTime(FFileChecks, sr.Time); if (IsFileSizeFrom or IsFileSizeTo) and Result then Result := CheckFileSize(FFileChecks, sr.Size); if Result then Result := CheckFileAttributes(FFileChecks, sr.Attr); if (Result and IsFindText) then begin if FPS_ISDIR(sr.Attr) then Exit(False); try Result := FindInFile(Folder + PathDelim + sr.Name, FindText, CaseSensitive); if (Result and IsReplaceText) then FileReplaceString(Folder + PathDelim + sr.Name, FindText, ReplaceText, CaseSensitive); if NotContainingText then Result := not Result; except on e : EFOpenError do begin if (log_errors in gLogOptions) then logWrite(Self, rsMsgLogError + rsMsgErrEOpen + ' ' + Folder + PathDelim + sr.Name, lmtError); Result := False; end; end; end; end; end; procedure TFindThread.DoFile(const sNewDir: String; const sr : TSearchRecEx); begin if CheckFile(sNewDir, sr) then begin FFoundFile := sNewDir + PathDelim + sr.Name; Synchronize(@AddFile); Inc(FFilesFound); end; Inc(FFilesScanned); Synchronize(@UpDateProgress); end; procedure TFindThread.WalkAdr(const sNewDir:String); var sr: TSearchRecEx; Path, SubPath: UTF8String; IsLink: Boolean; begin if Terminated then Exit; Inc(FCurrentDepth); FCurrentDir := sNewDir; // Search all files to display statistics Path := sNewDir + PathDelim + '*'; if FindFirstEx(Path, faAnyFile, sr) = 0 then repeat if not FPS_ISDIR(sr.Attr) then DoFile(sNewDir, sr) else if (sr.Name <> '.') and (sr.Name <> '..') then begin DoFile(sNewDir, sr); // Search in sub folders if (FCurrentDepth < FSearchTemplate.SearchDepth) and CheckDirectory(sNewDir, sr.Name) then begin SubPath := sNewDir + PathDelim + sr.Name; IsLink := FPS_ISLNK(sr.Attr); if FSearchTemplate.FollowSymLinks then begin if IsLink then SubPath := mbReadAllLinks(SubPath); if FLinkTargets.IndexOf(SubPath) >= 0 then Continue; // Link already encountered - links form a cycle. // Add directory to already-searched list. FLinkTargets.Add(SubPath); end else if IsLink then Continue; WalkAdr(SubPath); FCurrentDir := sNewDir; end; end; until (FindNextEx(sr) <> 0) or Terminated; FindCloseEx(sr); Synchronize(@UpDateProgress); Dec(FCurrentDepth); end; function TFindThread.IsAborting: Boolean; begin Result := Terminated; end; end. doublecmd-0.5.8/src/ffileexecuteyourself.lrt0000644000175000017500000000044211740433676020274 0ustar alexxalexxTFRMFILEEXECUTEYOURSELF.CAPTION=Wait... TFRMFILEEXECUTEYOURSELF.LBLPROMPT.CAPTION=Click on Close when the temporary file can be deleted! TFRMFILEEXECUTEYOURSELF.BTNCLOSE.CAPTION=&Close TFRMFILEEXECUTEYOURSELF.LBLFILENAME.CAPTION=File name: TFRMFILEEXECUTEYOURSELF.LBLFROMPATH.CAPTION=From: doublecmd-0.5.8/src/fchecksumcalc.pas0000644000175000017500000000622611740433676016616 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Calculate check sum dialog Copyright (C) 2009-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fCheckSumCalc; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, StdCtrls, Buttons, uHash; type { TfrmCheckSumCalc } TfrmCheckSumCalc = class(TForm) btnOK: TBitBtn; btnCancel: TBitBtn; cbSeparateFile: TCheckBox; cmbHashAlgorithm: TComboBox; edtSaveTo: TEdit; lblSaveTo: TLabel; procedure cbSeparateFileChange(Sender: TObject); procedure cmbHashAlgorithmChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); private FFileName: UTF8String; FAlgorithm: THashAlgorithm; public { public declarations } end; function ShowCalcCheckSum(var sFileName: UTF8String; out SeparateFile: Boolean; out HashAlgorithm: THashAlgorithm): Boolean; implementation {$R *.lfm} uses uGlobs; function ShowCalcCheckSum(var sFileName: UTF8String; out SeparateFile: Boolean; out HashAlgorithm: THashAlgorithm): Boolean; begin with TfrmCheckSumCalc.Create(Application) do try FFileName:= sFileName; Result:= (ShowModal = mrOK); if Result then begin sFileName:= edtSaveTo.Text; SeparateFile:= cbSeparateFile.Checked; HashAlgorithm:= FAlgorithm; end; finally Free; end; end; { TfrmCheckSumCalc } procedure TfrmCheckSumCalc.cbSeparateFileChange(Sender: TObject); begin if cbSeparateFile.Checked then edtSaveTo.Text:= ExtractFilePath(edtSaveTo.Text) + '*.' + HashFileExt[FAlgorithm] else edtSaveTo.Text:= ExtractFilePath(edtSaveTo.Text) + ExtractFileName(FFileName) + '.' + HashFileExt[FAlgorithm]; end; procedure TfrmCheckSumCalc.cmbHashAlgorithmChange(Sender: TObject); begin FAlgorithm:= THashAlgorithm(cmbHashAlgorithm.ItemIndex); edtSaveTo.Text:= ChangeFileExt(edtSaveTo.Text, '.' + HashFileExt[FAlgorithm]); end; procedure TfrmCheckSumCalc.FormCreate(Sender: TObject); var I: THashAlgorithm; begin for I:= Low(HashFileExt) to High(HashFileExt) do begin cmbHashAlgorithm.Items.Add(UpperCase(HashFileExt[I])); end; cmbHashAlgorithm.ItemIndex:= 0; InitPropStorage(Self); end; procedure TfrmCheckSumCalc.FormShow(Sender: TObject); begin edtSaveTo.Text:= FFileName + ExtensionSeparator; cmbHashAlgorithmChange(cmbHashAlgorithm); end; end. doublecmd-0.5.8/src/fpackinfodlg.lrt0000644000175000017500000000120212023046500016432 0ustar alexxalexxTFRMPACKINFODLG.CAPTION=Properties of packed file TFRMPACKINFODLG.LBLPACKEDFILE.CAPTION=File: TFRMPACKINFODLG.LBLPACKER.CAPTION=Packer: TFRMPACKINFODLG.LBLORIGINALSIZE.CAPTION=Original size: TFRMPACKINFODLG.LBLPACKEDSIZE.CAPTION=Packed size: TFRMPACKINFODLG.LBLCOMPRESSIONRATIO.CAPTION=Compression ratio: TFRMPACKINFODLG.LBLMETHOD.CAPTION=Method: TFRMPACKINFODLG.LBLDATE.CAPTION=Date: TFRMPACKINFODLG.LBLTIME.CAPTION=Time: TFRMPACKINFODLG.LBLATTRIBUTES.CAPTION=Attributes: TFRMPACKINFODLG.BTNCLOSE.CAPTION=&Close TFRMPACKINFODLG.BTNUNPACKANDEXEC.CAPTION=&Unpack and execute TFRMPACKINFODLG.BTNUNPACKALLANDEXEC.CAPTION=Unpack &all and execute doublecmd-0.5.8/src/doublecmd.lpi0000644000175000017500000016117012247124203015744 0ustar alexxalexx <ResourceType Value="res"/> <UseXPManifest Value="True"/> <Icon Value="0"/> </General> <i18n> <EnableI18N Value="True"/> <OutDir Value="..\language"/> </i18n> <VersionInfo> <UseVersionInfo Value="True"/> <MinorVersionNr Value="5"/> <RevisionNr Value="7"/> <StringTable FileDescription="Double Commander is a cross platform open source file manager with two panels side by side" InternalName="DOUBLECMD" LegalCopyright="Copyright (C) 2006-2013 Koblov Alexander" ProductName="Double Commander" ProductVersion=""/> </VersionInfo> <BuildModes Count="5"> <Item1 Name="Debug" Default="True"/> <Item2 Name="Debug + HeapTrc"> <CompilerOptions> <Version Value="11"/> <PathDelim Value="\"/> <Target> <Filename Value="..\doublecmd"/> </Target> <SearchPaths> <IncludeFiles Value="$(LazarusDir)\ide;$(ProjOutDir);..\sdk"/> <Libraries Value="$(ProjPath)\..\libraries\$(TargetCPU)-$(TargetOS)"/> <OtherUnitFiles Value="platform;platform\$(SrcOS);..\sdk;frames;fileviews;filesources;filesources\filesystem;filesources\multiarchive;filesources\multilist;filesources\searchresult;filesources\tempfilesystem;filesources\vfs;filesources\wcxarchive;filesources\wfxplugin;filesources\winnet"/> <UnitOutputDirectory Value="..\units\$(TargetCPU)-$(TargetOS)-$(LCLWidgetType)"/> <SrcPath Value="$(LazarusDir)\lcl;$(LazarusDir)\lcl\interfaces\$(LCLWidgetType);$(fpcsrcdir)\packages\fcl-base\src"/> </SearchPaths> <Parsing> <SyntaxOptions> <IncludeAssertionCode Value="True"/> </SyntaxOptions> </Parsing> <CodeGeneration> <Checks> <IOChecks Value="True"/> <RangeChecks Value="True"/> <OverflowChecks Value="True"/> </Checks> <Optimizations> <OptimizationLevel Value="0"/> </Optimizations> </CodeGeneration> <Linking> <Debugging> <DebugInfoType Value="dsStabs"/> <UseHeaptrc Value="True"/> </Debugging> </Linking> <Other> <ConfigFile> <CustomConfigFile Value="True"/> <ConfigFilePath Value="fpc-extra.cfg"/> </ConfigFile> <CustomOptions Value="-dHEAPTRC -dHEAPTRC_EXTRA"/> <CompilerPath Value="$(CompPath)"/> <ExecuteBefore> <Command Value="$(ProjPath)\_getsvnrev$(ExeExt).cmd $MakeDir($(LazarusDir))"/> <CompileReasons Run="False"/> </ExecuteBefore> </Other> </CompilerOptions> </Item2> <Item3 Name="NoDebug Full Optimizations"> <CompilerOptions> <Version Value="11"/> <PathDelim Value="\"/> <Target> <Filename Value="..\doublecmd"/> </Target> <SearchPaths> <IncludeFiles Value="$(LazarusDir)\ide;$(ProjOutDir);..\sdk"/> <Libraries Value="$(ProjPath)\..\libraries\$(TargetCPU)-$(TargetOS)"/> <OtherUnitFiles Value="platform;platform\$(SrcOS);..\sdk;frames;fileviews;filesources;filesources\filesystem;filesources\multiarchive;filesources\multilist;filesources\searchresult;filesources\tempfilesystem;filesources\vfs;filesources\wcxarchive;filesources\wfxplugin;filesources\winnet"/> <UnitOutputDirectory Value="..\units\$(TargetCPU)-$(TargetOS)-$(LCLWidgetType)"/> <SrcPath Value="$(LazarusDir)\lcl;$(LazarusDir)\lcl\interfaces\$(LCLWidgetType);$(fpcsrcdir)\packages\fcl-base\src"/> </SearchPaths> <Parsing> <SyntaxOptions> <IncludeAssertionCode Value="True"/> </SyntaxOptions> </Parsing> <CodeGeneration> <Optimizations> <VariablesInRegisters Value="True"/> <UncertainOptimizations Value="True"/> <OptimizationLevel Value="3"/> </Optimizations> </CodeGeneration> <Linking> <Debugging> <GenerateDebugInfo Value="False"/> <UseLineInfoUnit Value="False"/> </Debugging> </Linking> <Other> <ConfigFile> <CustomConfigFile Value="True"/> <ConfigFilePath Value="fpc-extra.cfg"/> </ConfigFile> <CompilerPath Value="$(CompPath)"/> <ExecuteBefore> <Command Value="$(ProjPath)\_getsvnrev$(ExeExt).cmd $MakeDir($(LazarusDir))"/> <CompileReasons Run="False"/> </ExecuteBefore> </Other> </CompilerOptions> </Item3> <Item4 Name="Nightly"> <CompilerOptions> <Version Value="11"/> <PathDelim Value="\"/> <Target> <Filename Value="..\doublecmd"/> </Target> <SearchPaths> <IncludeFiles Value="$(LazarusDir)\ide;$(ProjOutDir);..\sdk"/> <Libraries Value="$(ProjPath)\..\libraries\$(TargetCPU)-$(TargetOS)"/> <OtherUnitFiles Value="platform;platform\$(SrcOS);..\sdk;frames;fileviews;filesources;filesources\filesystem;filesources\multiarchive;filesources\multilist;filesources\searchresult;filesources\tempfilesystem;filesources\vfs;filesources\wcxarchive;filesources\wfxplugin;filesources\winnet"/> <UnitOutputDirectory Value="..\units\$(TargetCPU)-$(TargetOS)-$(LCLWidgetType)"/> <SrcPath Value="$(LazarusDir)\lcl;$(LazarusDir)\lcl\interfaces\$(LCLWidgetType);$(fpcsrcdir)\packages\fcl-base\src"/> </SearchPaths> <Parsing> <SyntaxOptions> <IncludeAssertionCode Value="True"/> </SyntaxOptions> </Parsing> <CodeGeneration> <Checks> <IOChecks Value="True"/> </Checks> <Optimizations> <OptimizationLevel Value="0"/> </Optimizations> </CodeGeneration> <Linking> <Debugging> <DebugInfoType Value="dsDwarf2Set"/> <UseLineInfoUnit Value="False"/> <UseExternalDbgSyms Value="True"/> </Debugging> </Linking> <Other> <CustomOptions Value="-dNIGHTLY_BUILD"/> <CompilerPath Value="$(CompPath)"/> <ExecuteBefore> <Command Value="$(ProjPath)\_getsvnrev$(ExeExt).cmd $MakeDir($(LazarusDir))"/> <CompileReasons Run="False"/> </ExecuteBefore> </Other> </CompilerOptions> </Item4> <Item5 Name="Beta"> <CompilerOptions> <Version Value="11"/> <PathDelim Value="\"/> <Target> <Filename Value="..\doublecmd"/> </Target> <SearchPaths> <IncludeFiles Value="$(LazarusDir)\ide;$(ProjOutDir);..\sdk"/> <Libraries Value="$(ProjPath)\..\libraries\$(TargetCPU)-$(TargetOS)"/> <OtherUnitFiles Value="platform;platform\$(SrcOS);..\sdk;frames;fileviews;filesources;filesources\filesystem;filesources\multiarchive;filesources\multilist;filesources\searchresult;filesources\tempfilesystem;filesources\vfs;filesources\wcxarchive;filesources\wfxplugin;filesources\winnet"/> <UnitOutputDirectory Value="..\units\$(TargetCPU)-$(TargetOS)-$(LCLWidgetType)"/> <SrcPath Value="$(LazarusDir)\lcl;$(LazarusDir)\lcl\interfaces\$(LCLWidgetType);$(fpcsrcdir)\packages\fcl-base\src"/> </SearchPaths> <Conditionals Value="if (TargetOS = 'linux') then begin LinkerOptions += ' -z relro'; end; if LCLWidgetType <> GetIDEValue('LCLWidgetType') then begin UnitPath += '$(FallbackOutputRoot)/LazControls/lib/$(TargetCPU)-$(TargetOS)/$(LCLWidgetType);'; UnitPath += '$(FallbackOutputRoot)/SynEdit/units/$(TargetCPU)-$(TargetOS)/$(LCLWidgetType);'; end;"/> <Parsing> <SyntaxOptions> <IncludeAssertionCode Value="True"/> </SyntaxOptions> </Parsing> <CodeGeneration> <Checks> <IOChecks Value="True"/> </Checks> <Optimizations> <VariablesInRegisters Value="True"/> <OptimizationLevel Value="2"/> </Optimizations> </CodeGeneration> <Linking> <Debugging> <DebugInfoType Value="dsDwarf2Set"/> <UseLineInfoUnit Value="False"/> <UseExternalDbgSyms Value="True"/> </Debugging> <Options> <PassLinkerOptions Value="True"/> <Win32> <GraphicApplication Value="True"/> </Win32> </Options> </Linking> <Other> <Verbosity> <ShowNotes Value="False"/> <ShowHints Value="False"/> </Verbosity> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <ConfigFile> <CustomConfigFile Value="True"/> <ConfigFilePath Value="fpc-extra.cfg"/> </ConfigFile> <CustomOptions Value="-dNIGHTLY_BUILD"/> <CompilerPath Value="$(CompPath)"/> <ExecuteBefore> <Command Value="$(ProjPath)\_getsvnrev$(ExeExt).cmd $MakeDir($(LazarusDir))"/> <CompileReasons Run="False"/> </ExecuteBefore> </Other> </CompilerOptions> </Item5> </BuildModes> <PublishOptions> <Version Value="2"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <RequiredPackages Count="11"> <Item1> <PackageName Value="dcpcrypt"/> </Item1> <Item2> <PackageName Value="chsdet"/> </Item2> <Item3> <PackageName Value="LazControls"/> <MinVersion Valid="True"/> </Item3> <Item4> <PackageName Value="ZVDateTimeCtrls"/> <MinVersion Major="1" Minor="2" Valid="True"/> </Item4> <Item5> <PackageName Value="pkg_gifanim"/> <MinVersion Major="1" Minor="4" Valid="True"/> </Item5> <Item6> <PackageName Value="cmdbox"/> </Item6> <Item7> <PackageName Value="KASComp"/> <MinVersion Major="1" Minor="8" Valid="True"/> </Item7> <Item8> <PackageName Value="LCL"/> <MinVersion Major="1" Valid="True"/> </Item8> <Item9> <PackageName Value="SynEdit"/> <MinVersion Major="1" Valid="True"/> </Item9> <Item10> <PackageName Value="viewerpackage"/> </Item10> <Item11> <PackageName Value="doublecmd_common"/> <MinVersion Minor="3" Valid="True"/> </Item11> </RequiredPackages> <Units Count="207"> <Unit0> <Filename Value="doublecmd.lpr"/> <IsPartOfProject Value="True"/> <UnitName Value="doublecmd"/> </Unit0> <Unit1> <Filename Value="fmain.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmMain"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fMain"/> </Unit1> <Unit2> <Filename Value="uwcxprototypes.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uWCXprototypes"/> </Unit2> <Unit3> <Filename Value="fviewer.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmViewer"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fViewer"/> </Unit3> <Unit4> <Filename Value="feditor.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmEditor"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fEditor"/> </Unit4> <Unit5> <Filename Value="fMsg.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmMsg"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fMsg"/> </Unit5> <Unit6> <Filename Value="dmcommondata.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="dmComData"/> <HasResources Value="True"/> <ResourceBaseClass Value="DataModule"/> <UnitName Value="dmCommonData"/> </Unit6> <Unit7> <Filename Value="dmhigh.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="dmHighl"/> <HasResources Value="True"/> <ResourceBaseClass Value="DataModule"/> <UnitName Value="dmHigh"/> </Unit7> <Unit8> <Filename Value="ffindview.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmFindView"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fFindView"/> </Unit8> <Unit9> <Filename Value="fAbout.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmAbout"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fAbout"/> </Unit9> <Unit10> <Filename Value="foptions.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptions"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fOptions"/> </Unit10> <Unit11> <Filename Value="fFileOpDlg.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmFileOp"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fFileOpDlg"/> </Unit11> <Unit12> <Filename Value="fmkdir.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmMkDir"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fMkDir"/> </Unit12> <Unit13> <Filename Value="fcopymovedlg.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmCopyDlg"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fCopyMoveDlg"/> </Unit13> <Unit14> <Filename Value="fFindDlg.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmFindDlg"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fFindDlg"/> </Unit14> <Unit15> <Filename Value="fhotdir.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmHotDir"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fHotDir"/> </Unit15> <Unit16> <Filename Value="fsymlink.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmSymLink"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fSymLink"/> </Unit16> <Unit17> <Filename Value="fhardlink.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmHardLink"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fHardLink"/> </Unit17> <Unit18> <Filename Value="fmultirename.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmMultiRename"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fMultiRename"/> </Unit18> <Unit19> <Filename Value="fpackdlg.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmPackDlg"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fPackDlg"/> </Unit19> <Unit20> <Filename Value="flinker.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmLinker"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fLinker"/> </Unit20> <Unit21> <Filename Value="fsplitter.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmSplitter"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fSplitter"/> </Unit21> <Unit22> <Filename Value="ffileproperties.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmFileProperties"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fFileProperties"/> </Unit22> <Unit23> <Filename Value="fextractdlg.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmExtractDlg"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fExtractDlg"/> </Unit23> <Unit24> <Filename Value="ulng.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uLng"/> </Unit24> <Unit25> <Filename Value="ffileassoc.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmFileAssoc"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fFileAssoc"/> </Unit25> <Unit26> <Filename Value="fcolumnssetconf.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="fColumnsSetConf"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fColumnsSetConf"/> </Unit26> <Unit27> <Filename Value="fhackform.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmHackForm"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fHackForm"/> </Unit27> <Unit28> <Filename Value="fpackinfodlg.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmPackInfoDlg"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fPackInfoDlg"/> </Unit28> <Unit29> <Filename Value="ftweakplugin.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmTweakPlugin"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fTweakPlugin"/> </Unit29> <Unit30> <Filename Value="udescr.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uDescr"/> </Unit30> <Unit31> <Filename Value="fdescredit.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmDescrEdit"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fDescrEdit"/> </Unit31> <Unit32> <Filename Value="platform\win\ugdiplus.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uGdiPlus"/> </Unit32> <Unit33> <Filename Value="platform\win\umywindows.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uMyWindows"/> </Unit33> <Unit34> <Filename Value="platform\unix\umyunix.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uMyUnix"/> </Unit34> <Unit35> <Filename Value="dmhelpmanager.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="dmHelpManager"/> <HasResources Value="True"/> <ResourceBaseClass Value="DataModule"/> <UnitName Value="dmHelpManager"/> </Unit35> <Unit36> <Filename Value="feditsearch.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmEditSearchReplace"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fEditSearch"/> </Unit36> <Unit37> <Filename Value="platform\udragdropex.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uDragDropEx"/> </Unit37> <Unit38> <Filename Value="ushellexecute.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uShellExecute"/> </Unit38> <Unit39> <Filename Value="platform\uClipboard.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uClipboard"/> </Unit39> <Unit40> <Filename Value="platform\udragdropgtk.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uDragDropGtk"/> </Unit40> <Unit41> <Filename Value="usearchtemplate.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uSearchTemplate"/> </Unit41> <Unit42> <Filename Value="platform\ukeyboard.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uKeyboard"/> </Unit42> <Unit43> <Filename Value="platform\udragdropqt.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uDragDropQt"/> </Unit43> <Unit44> <Filename Value="fchecksumverify.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmCheckSumVerify"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fCheckSumVerify"/> </Unit44> <Unit45> <Filename Value="fchecksumcalc.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmCheckSumCalc"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fCheckSumCalc"/> </Unit45> <Unit46> <Filename Value="uformcommands.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uFormCommands"/> </Unit46> <Unit47> <Filename Value="ufileviewnotebook.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uFileViewNotebook"/> </Unit47> <Unit48> <Filename Value="platform\unix\umimeactions.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uMimeActions"/> </Unit48> <Unit49> <Filename Value="fsetfileproperties.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmSetFileProperties"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fSetFileProperties"/> </Unit49> <Unit50> <Filename Value="platform\upixmapgtk.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uPixMapGtk"/> </Unit50> <Unit51> <Filename Value="uquickviewpanel.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uQuickViewPanel"/> </Unit51> <Unit52> <Filename Value="fmaskinputdlg.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmMaskInputDlg"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fMaskInputDlg"/> </Unit52> <Unit53> <Filename Value="platform\uinfotooltip.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uInfoToolTip"/> </Unit53> <Unit54> <Filename Value="fattributesedit.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmAttributesEdit"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fAttributesEdit"/> </Unit54> <Unit55> <Filename Value="fmodview.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmModView"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fModView"/> </Unit55> <Unit56> <Filename Value="fdiffer.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmDiffer"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fDiffer"/> </Unit56> <Unit57> <Filename Value="fconnectionmanager.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmConnectionManager"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fConnectionManager"/> </Unit57> <Unit58> <Filename Value="ffileexecuteyourself.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmFileExecuteYourSelf"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fFileExecuteYourSelf"/> </Unit58> <Unit59> <Filename Value="uthumbnails.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uThumbnails"/> </Unit59> <Unit60> <Filename Value="platform\utrash.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uTrash"/> </Unit60> <Unit61> <Filename Value="uparitercontrols.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uPariterControls"/> </Unit61> <Unit62> <Filename Value="ucmdlineparams.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uCmdLineParams"/> </Unit62> <Unit63> <Filename Value="upathlabel.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uPathLabel"/> </Unit63> <Unit64> <Filename Value="frames\foptionstooltips.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsToolTips"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsToolTips"/> </Unit64> <Unit65> <Filename Value="frames\foptionsframe.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="OptionsEditor"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsFrame"/> </Unit65> <Unit66> <Filename Value="frames\foptionsplugins.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsPlugins"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsPlugins"/> </Unit66> <Unit67> <Filename Value="frames\foptionsfiletypescolors.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsFileTypesColors"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsFileTypesColors"/> </Unit67> <Unit68> <Filename Value="platform\utarwriter.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uTarWriter"/> </Unit68> <Unit69> <Filename Value="uconvencoding.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uConvEncoding"/> </Unit69> <Unit70> <Filename Value="uvfsmodule.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uVfsModule"/> </Unit70> <Unit71> <Filename Value="frames\foptionslanguage.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsLanguage"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsLanguage"/> </Unit71> <Unit72> <Filename Value="frames\foptionsbehavior.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsBehavior"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsBehavior"/> </Unit72> <Unit73> <Filename Value="frames\foptionstools.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsViewer"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsTools"/> </Unit73> <Unit74> <Filename Value="frames\foptionshotkeys.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsHotkeys"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsHotkeys"/> </Unit74> <Unit75> <Filename Value="frames\foptionslayout.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsLayout"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsLayout"/> </Unit75> <Unit76> <Filename Value="frames\foptionsfonts.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsFonts"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsFonts"/> </Unit76> <Unit77> <Filename Value="frames\foptionsfileoperations.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsFileOperations"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsFileOperations"/> </Unit77> <Unit78> <Filename Value="frames\foptionsquicksearchfilter.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsQuickSearchFilter"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsQuickSearchFilter"/> </Unit78> <Unit79> <Filename Value="frames\foptionstabs.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsTabs"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsTabs"/> </Unit79> <Unit80> <Filename Value="frames\foptionslog.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsLog"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsLog"/> </Unit80> <Unit81> <Filename Value="frames\foptionsconfiguration.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsConfiguration"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsConfiguration"/> </Unit81> <Unit82> <Filename Value="frames\foptionscustomcolumns.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsCustomColumns"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsCustomColumns"/> </Unit82> <Unit83> <Filename Value="frames\foptionsmisc.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsMisc"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsMisc"/> </Unit83> <Unit84> <Filename Value="frames\foptionsautorefresh.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsAutoRefresh"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsAutoRefresh"/> </Unit84> <Unit85> <Filename Value="frames\foptionsicons.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsIcons"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsIcons"/> </Unit85> <Unit86> <Filename Value="frames\foptionsignorelist.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsIgnoreList"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsIgnoreList"/> </Unit86> <Unit87> <Filename Value="frames\foptionsarchivers.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsArchivers"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsArchivers"/> </Unit87> <Unit88> <Filename Value="fselecttextrange.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmSelectTextRange"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fSelectTextRange"/> </Unit88> <Unit89> <Filename Value="frames\fquicksearch.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmQuickSearch"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fQuickSearch"/> </Unit89> <Unit90> <Filename Value="frames\foptionsgroups.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="fOptionsGroups"/> </Unit90> <Unit91> <Filename Value="frames\foptionsfilepanelscolors.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsFilePanelsColors"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsFilePanelsColors"/> </Unit91> <Unit92> <Filename Value="frames\foptionstoolbase.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsToolBase"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsToolBase"/> </Unit92> <Unit93> <Filename Value="frames\foptionsterminal.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsTerminal"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsTerminal"/> </Unit93> <Unit94> <Filename Value="frames\foptionsmouse.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsMouse"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsMouse"/> </Unit94> <Unit95> <Filename Value="frames\foptionskeyboard.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsKeyboard"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsKeyboard"/> </Unit95> <Unit96> <Filename Value="frames\foptionsdragdrop.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsDragDrop"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsDragDrop"/> </Unit96> <Unit97> <Filename Value="frames\foptionsfilesviews.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsFilesViews"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsFilesViews"/> </Unit97> <Unit98> <Filename Value="frames\foptionscolumnsview.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsColumnsView"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsColumnsView"/> </Unit98> <Unit99> <Filename Value="frames\foptionsdriveslistbutton.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsDrivesListButton"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsDrivesListButton"/> </Unit99> <Unit100> <Filename Value="platform\unix\uoverlayscrollbarfix.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uOverlayScrollBarFix"/> </Unit100> <Unit101> <Filename Value="umaincommands.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uMainCommands"/> </Unit101> <Unit102> <Filename Value="platform\win\uexceptionhandlerfix.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uExceptionHandlerFix"/> </Unit102> <Unit103> <Filename Value="usyneditfiler.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uSynEditFiler"/> </Unit103> <Unit104> <Filename Value="frames\foptionseditorcolors.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsEditorColors"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsEditorColors"/> </Unit104> <Unit105> <Filename Value="uoperationspanel.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uOperationsPanel"/> </Unit105> <Unit106> <Filename Value="foptionshotkeysedithotkey.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmEditHotkey"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fOptionsHotkeysEditHotkey"/> </Unit106> <Unit107> <Filename Value="ukastoolitemsextended.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uKASToolItemsExtended"/> </Unit107> <Unit108> <Filename Value="frames\foptionstoolbar.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOptionsToolbar"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> <UnitName Value="fOptionsToolbar"/> </Unit108> <Unit109> <Filename Value="fileviews\ufileviewwithmainctrl.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uFileViewWithMainCtrl"/> </Unit109> <Unit110> <Filename Value="filesources\uarchivefilesource.pas"/> <IsPartOfProject Value="True"/> </Unit110> <Unit111> <Filename Value="filesources\uarchivefilesourceutil.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uArchiveFileSourceUtil"/> </Unit111> <Unit112> <Filename Value="filesources\ufilesource.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uFileSource"/> </Unit112> <Unit113> <Filename Value="filesources\ufilesourcecalcchecksumoperation.pas"/> <IsPartOfProject Value="True"/> </Unit113> <Unit114> <Filename Value="filesources\ufilesourcecalcstatisticsoperation.pas"/> <IsPartOfProject Value="True"/> </Unit114> <Unit115> <Filename Value="filesources\ufilesourcecombineoperation.pas"/> <IsPartOfProject Value="True"/> </Unit115> <Unit116> <Filename Value="filesources\ufilesourcecopyoperation.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uFileSourceCopyOperation"/> </Unit116> <Unit117> <Filename Value="filesources\ufilesourcecreatedirectoryoperation.pas"/> <IsPartOfProject Value="True"/> </Unit117> <Unit118> <Filename Value="filesources\ufilesourcedeleteoperation.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uFileSourceDeleteOperation"/> </Unit118> <Unit119> <Filename Value="filesources\ufilesourceexecuteoperation.pas"/> <IsPartOfProject Value="True"/> </Unit119> <Unit120> <Filename Value="filesources\ufilesourcelistoperation.pas"/> <IsPartOfProject Value="True"/> </Unit120> <Unit121> <Filename Value="filesources\ufilesourcemoveoperation.pas"/> <IsPartOfProject Value="True"/> </Unit121> <Unit122> <Filename Value="filesources\ufilesourceoperation.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uFileSourceOperation"/> </Unit122> <Unit123> <Filename Value="filesources\ufilesourceoperationmessageboxesui.pas"/> <IsPartOfProject Value="True"/> </Unit123> <Unit124> <Filename Value="filesources\ufilesourceoperationmisc.pas"/> <IsPartOfProject Value="True"/> </Unit124> <Unit125> <Filename Value="filesources\ufilesourceoperationoptions.pas"/> <IsPartOfProject Value="True"/> </Unit125> <Unit126> <Filename Value="filesources\ufilesourceoperationoptionsui.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="FileSourceOperationOptionsUI"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> </Unit126> <Unit127> <Filename Value="filesources\ufilesourceoperationtypes.pas"/> <IsPartOfProject Value="True"/> </Unit127> <Unit128> <Filename Value="filesources\ufilesourceoperationui.pas"/> <IsPartOfProject Value="True"/> </Unit128> <Unit129> <Filename Value="filesources\ufilesourceproperty.pas"/> <IsPartOfProject Value="True"/> </Unit129> <Unit130> <Filename Value="filesources\ufilesourcesetfilepropertyoperation.pas"/> <IsPartOfProject Value="True"/> </Unit130> <Unit131> <Filename Value="filesources\ufilesourcesplitoperation.pas"/> <IsPartOfProject Value="True"/> </Unit131> <Unit132> <Filename Value="filesources\ufilesourcetestarchiveoperation.pas"/> <IsPartOfProject Value="True"/> </Unit132> <Unit133> <Filename Value="filesources\ufilesourceutil.pas"/> <IsPartOfProject Value="True"/> </Unit133> <Unit134> <Filename Value="filesources\ufilesourcewipeoperation.pas"/> <IsPartOfProject Value="True"/> </Unit134> <Unit135> <Filename Value="filesources\ulocalfilesource.pas"/> <IsPartOfProject Value="True"/> </Unit135> <Unit136> <Filename Value="filesources\uoperationthread.pas"/> <IsPartOfProject Value="True"/> </Unit136> <Unit137> <Filename Value="filesources\urealfilesource.pas"/> <IsPartOfProject Value="True"/> </Unit137> <Unit138> <Filename Value="filesources\uvirtualfilesource.pas"/> <IsPartOfProject Value="True"/> </Unit138> <Unit139> <Filename Value="filesources\filesystem\ffilesystemcopymoveoperationoptions.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="FileSystemCopyMoveOperationOptionsUI"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> </Unit139> <Unit140> <Filename Value="filesources\filesystem\ufilesystemcalcchecksumoperation.pas"/> <IsPartOfProject Value="True"/> </Unit140> <Unit141> <Filename Value="filesources\filesystem\ufilesystemcalcstatisticsoperation.pas"/> <IsPartOfProject Value="True"/> </Unit141> <Unit142> <Filename Value="filesources\filesystem\ufilesystemcombineoperation.pas"/> <IsPartOfProject Value="True"/> </Unit142> <Unit143> <Filename Value="filesources\filesystem\ufilesystemcopyoperation.pas"/> <IsPartOfProject Value="True"/> </Unit143> <Unit144> <Filename Value="filesources\filesystem\ufilesystemcreatedirectoryoperation.pas"/> <IsPartOfProject Value="True"/> </Unit144> <Unit145> <Filename Value="filesources\filesystem\ufilesystemdeleteoperation.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uFileSystemDeleteOperation"/> </Unit145> <Unit146> <Filename Value="filesources\filesystem\ufilesystemexecuteoperation.pas"/> <IsPartOfProject Value="True"/> </Unit146> <Unit147> <Filename Value="filesources\filesystem\ufilesystemfilesource.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uFileSystemFileSource"/> </Unit147> <Unit148> <Filename Value="filesources\filesystem\ufilesystemlistoperation.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uFileSystemListOperation"/> </Unit148> <Unit149> <Filename Value="filesources\filesystem\ufilesystemmoveoperation.pas"/> <IsPartOfProject Value="True"/> </Unit149> <Unit150> <Filename Value="filesources\filesystem\ufilesystemsetfilepropertyoperation.pas"/> <IsPartOfProject Value="True"/> </Unit150> <Unit151> <Filename Value="filesources\filesystem\ufilesystemsplitoperation.pas"/> <IsPartOfProject Value="True"/> </Unit151> <Unit152> <Filename Value="filesources\filesystem\ufilesystemutil.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uFileSystemUtil"/> </Unit152> <Unit153> <Filename Value="filesources\filesystem\ufilesystemwipeoperation.pas"/> <IsPartOfProject Value="True"/> </Unit153> <Unit154> <Filename Value="filesources\multiarchive\fmultiarchivecopyoperationoptions.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="MultiArchiveCopyOperationOptionsUI"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> </Unit154> <Unit155> <Filename Value="filesources\multiarchive\umultiarchivecalcstatisticsoperation.pas"/> <IsPartOfProject Value="True"/> </Unit155> <Unit156> <Filename Value="filesources\multiarchive\umultiarchivecopyinoperation.pas"/> <IsPartOfProject Value="True"/> </Unit156> <Unit157> <Filename Value="filesources\multiarchive\umultiarchivecopyoutoperation.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uMultiArchiveCopyOutOperation"/> </Unit157> <Unit158> <Filename Value="filesources\multiarchive\umultiarchivedeleteoperation.pas"/> <IsPartOfProject Value="True"/> </Unit158> <Unit159> <Filename Value="filesources\multiarchive\umultiarchiveexecuteoperation.pas"/> <IsPartOfProject Value="True"/> </Unit159> <Unit160> <Filename Value="filesources\multiarchive\umultiarchivefilesource.pas"/> <IsPartOfProject Value="True"/> </Unit160> <Unit161> <Filename Value="filesources\multiarchive\umultiarchivelistoperation.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uMultiArchiveListOperation"/> </Unit161> <Unit162> <Filename Value="filesources\multiarchive\umultiarchivetestarchiveoperation.pas"/> <IsPartOfProject Value="True"/> </Unit162> <Unit163> <Filename Value="filesources\multiarchive\umultiarchiveutil.pas"/> <IsPartOfProject Value="True"/> </Unit163> <Unit164> <Filename Value="filesources\multilist\umultilistfilesource.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uMultiListFileSource"/> </Unit164> <Unit165> <Filename Value="filesources\multilist\umultilistlistoperation.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uMultiListListOperation"/> </Unit165> <Unit166> <Filename Value="filesources\searchresult\usearchresultfilesource.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uSearchResultFileSource"/> </Unit166> <Unit167> <Filename Value="filesources\searchresult\usearchresultlistoperation.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uSearchResultListOperation"/> </Unit167> <Unit168> <Filename Value="filesources\tempfilesystem\utempfilesystemfilesource.pas"/> <IsPartOfProject Value="True"/> </Unit168> <Unit169> <Filename Value="filesources\vfs\uvfsexecuteoperation.pas"/> <IsPartOfProject Value="True"/> </Unit169> <Unit170> <Filename Value="filesources\vfs\uvfsfilesource.pas"/> <IsPartOfProject Value="True"/> </Unit170> <Unit171> <Filename Value="filesources\vfs\uvfslistoperation.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uVfsListOperation"/> </Unit171> <Unit172> <Filename Value="filesources\wcxarchive\fwcxarchivecopyoperationoptions.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="WcxArchiveCopyOperationOptionsUI"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> </Unit172> <Unit173> <Filename Value="filesources\wcxarchive\uwcxarchivecalcstatisticsoperation.pas"/> <IsPartOfProject Value="True"/> </Unit173> <Unit174> <Filename Value="filesources\wcxarchive\uwcxarchivecopyinoperation.pas"/> <IsPartOfProject Value="True"/> </Unit174> <Unit175> <Filename Value="filesources\wcxarchive\uwcxarchivecopyoutoperation.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uWcxArchiveCopyOutOperation"/> </Unit175> <Unit176> <Filename Value="filesources\wcxarchive\uwcxarchivedeleteoperation.pas"/> <IsPartOfProject Value="True"/> </Unit176> <Unit177> <Filename Value="filesources\wcxarchive\uwcxarchiveexecuteoperation.pas"/> <IsPartOfProject Value="True"/> </Unit177> <Unit178> <Filename Value="filesources\wcxarchive\uwcxarchivefilesource.pas"/> <IsPartOfProject Value="True"/> </Unit178> <Unit179> <Filename Value="filesources\wcxarchive\uwcxarchivelistoperation.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uWcxArchiveListOperation"/> </Unit179> <Unit180> <Filename Value="filesources\wcxarchive\uwcxarchivetestarchiveoperation.pas"/> <IsPartOfProject Value="True"/> </Unit180> <Unit181> <Filename Value="filesources\wfxplugin\fwfxplugincopymoveoperationoptions.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="WfxPluginCopyMoveOperationOptionsUI"/> <HasResources Value="True"/> <ResourceBaseClass Value="Frame"/> </Unit181> <Unit182> <Filename Value="filesources\wfxplugin\uwfxplugincopyinoperation.pas"/> <IsPartOfProject Value="True"/> </Unit182> <Unit183> <Filename Value="filesources\wfxplugin\uwfxplugincopyoperation.pas"/> <IsPartOfProject Value="True"/> </Unit183> <Unit184> <Filename Value="filesources\wfxplugin\uwfxplugincopyoutoperation.pas"/> <IsPartOfProject Value="True"/> </Unit184> <Unit185> <Filename Value="filesources\wfxplugin\uwfxplugincreatedirectoryoperation.pas"/> <IsPartOfProject Value="True"/> </Unit185> <Unit186> <Filename Value="filesources\wfxplugin\uwfxplugindeleteoperation.pas"/> <IsPartOfProject Value="True"/> </Unit186> <Unit187> <Filename Value="filesources\wfxplugin\uwfxpluginexecuteoperation.pas"/> <IsPartOfProject Value="True"/> </Unit187> <Unit188> <Filename Value="filesources\wfxplugin\uwfxpluginfilesource.pas"/> <IsPartOfProject Value="True"/> </Unit188> <Unit189> <Filename Value="filesources\wfxplugin\uwfxpluginlistoperation.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uWfxPluginListOperation"/> </Unit189> <Unit190> <Filename Value="filesources\wfxplugin\uwfxpluginmoveoperation.pas"/> <IsPartOfProject Value="True"/> </Unit190> <Unit191> <Filename Value="filesources\wfxplugin\uwfxpluginsetfilepropertyoperation.pas"/> <IsPartOfProject Value="True"/> </Unit191> <Unit192> <Filename Value="filesources\wfxplugin\uwfxpluginutil.pas"/> <IsPartOfProject Value="True"/> </Unit192> <Unit193> <Filename Value="filesources\winnet\uwinnetexecuteoperation.pas"/> <IsPartOfProject Value="True"/> </Unit193> <Unit194> <Filename Value="filesources\winnet\uwinnetfilesource.pas"/> <IsPartOfProject Value="True"/> </Unit194> <Unit195> <Filename Value="filesources\winnet\uwinnetlistoperation.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uWinNetListOperation"/> </Unit195> <Unit196> <Filename Value="fileviews\ubrieffileview.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uBriefFileView"/> </Unit196> <Unit197> <Filename Value="fileviews\ucolumnsfileview.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uColumnsFileView"/> </Unit197> <Unit198> <Filename Value="fileviews\ucolumnsfileviewvtv.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uColumnsFileViewVtv"/> </Unit198> <Unit199> <Filename Value="fileviews\ufileview.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uFileView"/> </Unit199> <Unit200> <Filename Value="fileviews\ufileviewheader.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uFileViewHeader"/> </Unit200> <Unit201> <Filename Value="fileviews\ufileviewhistory.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uFileViewHistory"/> </Unit201> <Unit202> <Filename Value="fileviews\ufileviewwithpanels.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uFileViewWithPanels"/> </Unit202> <Unit203> <Filename Value="fileviews\ufileviewworker.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uFileViewWorker"/> </Unit203> <Unit204> <Filename Value="fileviews\uorderedfileview.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uOrderedFileView"/> </Unit204> <Unit205> <Filename Value="fopenwith.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="frmOpenWith"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="fOpenWith"/> </Unit205> <Unit206> <Filename Value="platform\unix\ukeyfile.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="uKeyFile"/> </Unit206> </Units> </ProjectOptions> <CompilerOptions> <Version Value="11"/> <PathDelim Value="\"/> <Target> <Filename Value="..\doublecmd"/> </Target> <SearchPaths> <IncludeFiles Value="$(LazarusDir)\ide;$(ProjOutDir);..\sdk"/> <Libraries Value="$(ProjPath)\..\libraries\$(TargetCPU)-$(TargetOS)"/> <OtherUnitFiles Value="platform;platform\$(SrcOS);..\sdk;frames;fileviews;filesources;filesources\filesystem;filesources\multiarchive;filesources\multilist;filesources\searchresult;filesources\tempfilesystem;filesources\vfs;filesources\wcxarchive;filesources\wfxplugin;filesources\winnet"/> <UnitOutputDirectory Value="..\units\$(TargetCPU)-$(TargetOS)-$(LCLWidgetType)"/> <SrcPath Value="$(LazarusDir)\lcl;$(LazarusDir)\lcl\interfaces\$(LCLWidgetType);$(fpcsrcdir)\packages\fcl-base\src"/> </SearchPaths> <Conditionals Value="if TargetOS = 'darwin' then begin UsageCustomOptions += ' -k-macosx_version_min -k10.5'; UsageCustomOptions += ' -XR/Developer/SDKs/MacOSX10.5.sdk/'; end;"/> <Parsing> <SyntaxOptions> <IncludeAssertionCode Value="True"/> </SyntaxOptions> </Parsing> <CodeGeneration> <Checks> <IOChecks Value="True"/> <RangeChecks Value="True"/> <OverflowChecks Value="True"/> </Checks> <Optimizations> <OptimizationLevel Value="0"/> </Optimizations> </CodeGeneration> <Linking> <Debugging> <DebugInfoType Value="dsDwarf2Set"/> </Debugging> </Linking> <Other> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <ConfigFile> <CustomConfigFile Value="True"/> <ConfigFilePath Value="fpc-extra.cfg"/> </ConfigFile> <CompilerPath Value="$(CompPath)"/> <ExecuteBefore> <Command Value="$(ProjPath)\_getsvnrev$(ExeExt).cmd $MakeDir($(LazarusDir))"/> <CompileReasons Run="False"/> </ExecuteBefore> </Other> </CompilerOptions> </CONFIG> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/src/ufilefunctions.pas��������������������������������������������������������������0000644�0001750�0001750�00000032122�12005240233�017026� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ Double Commander ------------------------------------------------------------------------- Filepanel columns implementation unit Copyright (C) 2008 Dmitry Kolomiets (B4rr4cuda@rambler.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uFileFunctions; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Menus, uFile, uFileProperty, uFileSource; type TFileFunction = (fsfName, fsfExtension, fsfSize, fsfAttr, fsfPath, fsfGroup, fsfOwner, fsfModificationTime, fsfCreationTime, fsfLastAccessTime, fsfLinkTo, fsfNameNoExtension, fsfType, fsfComment, fsfCompressedSize, fsfInvalid); TFileFunctions = array of TFileFunction; const TFileFunctionStrings: array [TFileFunction] of string = ('GETFILENAME', 'GETFILEEXT', 'GETFILESIZE', 'GETFILEATTR', 'GETFILEPATH', 'GETFILEGROUP', 'GETFILEOWNER', 'GETFILETIME', 'GETFILECREATIONTIME', 'GETFILELASTACCESSTIME', 'GETFILELINKTO', 'GETFILENAMENOEXT', 'GETFILETYPE', 'GETFILECOMMENT', 'GETFILECOMPRESSEDSIZE', '' // fsfInvalid ); // Which file properties must be supported for each file function to work. const TFileFunctionToProperty: array [TFileFunction] of TFilePropertiesTypes = ([fpName], [fpName], [fpSize], [fpAttributes], [] { path }, [fpOwner], [fpOwner], [fpModificationTime], [fpCreationTime], [fpLastAccessTime], [fpLink], [fpName], [fpType], [fpComment], [fpCompressedSize], [] { invalid }); function FormatFileFunction(FuncS: string; AFile: TFile; const AFileSource: IFileSource; RetrieveProperties: Boolean = False): string; function FormatFileFunctions(FuncS: String; AFile: TFile; const AFileSource: IFileSource): String; function GetFileFunctionByName(FuncS: string): TFileFunction; procedure FillContentFieldMenu(MenuItem: TMenuItem; OnMenuItemClick: TNotifyEvent); procedure FillFileFuncList; const sFuncTypeDC = 'DC'; sFuncTypePlugin = 'PLUGIN'; var FileFunctionsStr: TStringList; implementation uses StrUtils, WdxPlugin, uWdxModule, uGlobs, uLng, uDefaultFilePropertyFormatter, uFileSourceProperty; //Return type (Script or DC or Plugin etc) function GetModType(str: String): String; begin if pos('(', Str) > 0 then Result := Copy(Str, 1, pos('(', Str) - 1) else Result := EmptyStr; end; //Return name in (). (SriptName or PluginName etc) function GetModName(str: String): String; var s: String; begin s := str; if pos('(', S) > 0 then Delete(s, 1, pos('(', S)) else Exit(EmptyStr); if pos(')', s) > 0 then Result := Copy(s, 1, pos(')', s) - 1); end; //Return function name (DCFunction,PluginFunction etc) function GetModFunctionName(str: String): String; var s: String; begin s := str; if pos('.', S) > 0 then Delete(s, 1, pos('.', S)) else Exit(EmptyStr); if pos('{', S) > 0 then Result := Copy(s, 1, pos('{', S) - 1); end; // Return function parameters function GetModFunctionParams(str: String): String; var I: Integer; S: String; begin S := str; I := pos('{', S); if I < 0 then Exit(EmptyStr); Delete(S, 1, I); I := pos('}', S); if I < 0 then Exit(EmptyStr); Result := Copy(S, 1, I - 1); end; function FormatFileFunction(FuncS: String; AFile: TFile; const AFileSource: IFileSource; RetrieveProperties: Boolean = False): String; var AIndex: Integer; AType, AName, AFunc, AParam: String; FileFunction: TFileFunction; FilePropertiesNeeded: TFilePropertiesTypes; begin Result := EmptyStr; //--------------------- AType := upcase(GetModType(FuncS)); AName := upcase(GetModName(FuncS)); AFunc := upcase(GetModFunctionName(FuncS)); AParam := upcase(GetModFunctionParams(FuncS)); //--------------------- //Internal doublecmd function //------------------------------------------------------ if AType = sFuncTypeDC then begin AIndex:= FileFunctionsStr.IndexOfName(AFunc); if AIndex < 0 then Exit; FileFunction:= TFileFunction(AIndex); // Retrieve additional properties if needed if RetrieveProperties then begin FilePropertiesNeeded:= TFileFunctionToProperty[FileFunction]; if aFileSource.CanRetrieveProperties(AFile, FilePropertiesNeeded) then aFileSource.RetrieveProperties(AFile, FilePropertiesNeeded); end; case FileFunction of fsfName: begin // Show square brackets around directories if gDirBrackets and (AFile.IsDirectory or AFile.IsLinkToDirectory) then Result := '[' + AFile.Name + ']' else Result := AFile.Name; end; fsfExtension: begin Result := AFile.Extension; end; fsfSize: begin if (AFile.IsDirectory or AFile.IsLinkToDirectory) and ((not (fpSize in AFile.SupportedProperties)) or (AFile.Size = 0)) then Result := '<DIR>' else if fpSize in AFile.SupportedProperties then Result := AFile.Properties[fpSize].Format(DefaultFilePropertyFormatter); end; fsfAttr: if fpAttributes in AFile.SupportedProperties then Result := AFile.Properties[fpAttributes].Format(DefaultFilePropertyFormatter); fsfPath: Result := AFile.Path; fsfGroup: if fpOwner in AFile.SupportedProperties then Result := AFile.OwnerProperty.GroupStr; fsfOwner: if fpOwner in AFile.SupportedProperties then Result := AFile.OwnerProperty.OwnerStr; fsfModificationTime: if fpModificationTime in AFile.SupportedProperties then Result := AFile.Properties[fpModificationTime].Format( DefaultFilePropertyFormatter); fsfCreationTime: if fpCreationTime in AFile.SupportedProperties then Result := AFile.Properties[fpCreationTime].Format( DefaultFilePropertyFormatter); fsfLastAccessTime: if fpLastAccessTime in AFile.SupportedProperties then Result := AFile.Properties[fpLastAccessTime].Format( DefaultFilePropertyFormatter); fsfLinkTo: if fpLink in AFile.SupportedProperties then Result := AFile.LinkProperty.LinkTo; fsfNameNoExtension: begin // Show square brackets around directories if gDirBrackets and (AFile.IsDirectory or AFile.IsLinkToDirectory) then Result := '[' + AFile.NameNoExt + ']' else Result := AFile.NameNoExt; end; fsfType: if fpType in AFile.SupportedProperties then Result := AFile.TypeProperty.Format(DefaultFilePropertyFormatter); fsfComment: if fpComment in AFile.SupportedProperties then Result := AFile.CommentProperty.Format(DefaultFilePropertyFormatter); fsfCompressedSize: begin if (AFile.IsDirectory or AFile.IsLinkToDirectory) and ((not (fpCompressedSize in AFile.SupportedProperties)) or (AFile.CompressedSize = 0)) then Result := '<DIR>' else if fpCompressedSize in AFile.SupportedProperties then Result := AFile.Properties[fpCompressedSize].Format(DefaultFilePropertyFormatter); end; end; end //------------------------------------------------------ //Plugin function //------------------------------------------------------ else if AType = sFuncTypePlugin then begin if fspDirectAccess in AFileSource.Properties then begin if not gWdxPlugins.IsLoaded(AName) then if not gWdxPlugins.LoadModule(AName) then Exit; if gWdxPlugins.GetWdxModule(AName).FileParamVSDetectStr(AFile) then begin Result := gWdxPlugins.GetWdxModule(AName).CallContentGetValue( AFile.FullPath, AFunc, AParam, 0); end; end; end; //------------------------------------------------------ end; function FormatFileFunctions(FuncS: String; AFile: TFile; const AFileSource: IFileSource): String; var P: Integer; begin Result:= EmptyStr; while True do begin P := Pos('[', FuncS); if P = 0 then Break else if P > 1 then Result:= Result + Copy(FuncS, 1, P - 1); Delete(FuncS, 1, P); P := Pos(']', FuncS); if P = 0 then Break else if P > 1 then Result:= Result + FormatFileFunction(Copy(FuncS, 1, P - 1), AFile, AFileSource, True); Delete(FuncS, 1, P); end; if Length(FuncS) <> 0 then Result:= Result + FuncS; end; function GetFileFunctionByName(FuncS: String): TFileFunction; var AIndex: Integer; AType, AFunc: String; begin AType := UpCase(GetModType(FuncS)); AFunc := UpCase(GetModFunctionName(FuncS)); // Only internal DC functions. if AType = sFuncTypeDC then begin AIndex := FileFunctionsStr.IndexOfName(AFunc); if AIndex >= 0 then Exit(TFileFunction(AIndex)); end; Result := fsfInvalid; end; procedure FillContentFieldMenu(MenuItem: TMenuItem; OnMenuItemClick: TNotifyEvent); var Mi, mi2: TMenuItem; i,j: Integer; sUnits: String; begin MenuItem.Clear; // DC commands MI:= TMenuItem.Create(MenuItem); MI.Caption:= 'DC'; MenuItem.Add(MI); for i:= 0 to FileFunctionsStr.Count-1 do begin MI:=TMenuItem.Create(MenuItem); MI.Tag:=0; MI.Hint:= FileFunctionsStr.Names[i]; MI.Caption:= FileFunctionsStr.ValueFromIndex[i] + ' (' + MI.Hint + ')'; MI.OnClick:= OnMenuItemClick; MenuItem.Items[0].Add(MI); end; // Plugins MI:=TMenuItem.Create(MenuItem); MI.Caption:= 'Plugins'; MenuItem.Add(MI); for i:=0 to gWdxPlugins.Count-1 do begin MI:=TMenuItem.Create(MenuItem); MI.Caption:=gWdxPlugins.GetWdxModule(i).Name; MenuItem.Items[1].Add(MI); // Load fields list if gWdxPlugins.GetWdxModule(i).IsLoaded=false then if not (gWdxPlugins.GetWdxModule(i).LoadModule) then Break; for j:=0 to gWdxPlugins.GetWdxModule(i).FieldList.Count-1 do begin with gWdxPlugins.GetWdxModule(i) do begin MI:=TMenuItem.Create(MenuItem); MI.Tag:=1; MI.Caption:=FieldList[j]; MI.OnClick:= OnMenuItemClick; MenuItem.Items[1].Items[i].Add(MI); with TWdxField(FieldList.Objects[j]) do if FType <> ft_multiplechoice then begin sUnits:= FUnits; while sUnits <> EmptyStr do begin MI2:=TMenuItem.Create(MenuItem); MI2.Tag:= 2; MI2.Caption:= Copy2SymbDel(sUnits, '|'); MI2.OnClick:= OnMenuItemClick; MI.Add(MI2); end; end; end; end; end; end; procedure FillFileFuncList; begin with FileFunctionsStr do begin Add(TFileFunctionStrings[fsfName] + '=' + rsFuncName); Add(TFileFunctionStrings[fsfExtension] + '=' + rsFuncExt); Add(TFileFunctionStrings[fsfSize] + '=' + rsFuncSize); Add(TFileFunctionStrings[fsfAttr] + '=' + rsFuncAttr); Add(TFileFunctionStrings[fsfPath] + '=' + rsFuncPath); Add(TFileFunctionStrings[fsfGroup] + '=' + rsFuncGroup); Add(TFileFunctionStrings[fsfOwner] + '=' + rsFuncOwner); Add(TFileFunctionStrings[fsfModificationTime] + '=' + rsFuncMTime); Add(TFileFunctionStrings[fsfCreationTime] + '=' + rsFuncCTime); Add(TFileFunctionStrings[fsfLastAccessTime] + '=' + rsFuncATime); Add(TFileFunctionStrings[fsfLinkTo] + '=' + rsFuncLinkTo); Add(TFileFunctionStrings[fsfNameNoExtension] + '=' + rsFuncNameNoExt); Add(TFileFunctionStrings[fsfType] + '=' + rsFuncType); Add(TFileFunctionStrings[fsfComment] + '=' + rsFuncComment); Add(TFileFunctionStrings[fsfCompressedSize] + '=' + rsFuncCompressedSize); end; end; initialization FileFunctionsStr := TStringList.Create; finalization FreeAndNil(FileFunctionsStr); end. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/src/flinker.lrt���������������������������������������������������������������������0000644�0001750�0001750�00000000656�12023046500�015451� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������TFRMLINKER.CAPTION=Linker TFRMLINKER.GBSAVETO.CAPTION=Save to... TFRMLINKER.LBLFILENAME.CAPTION=&File name TFRMLINKER.BTNSAVE.CAPTION=... TFRMLINKER.GRBXCONTROL.CAPTION=Item TFRMLINKER.SPBTNUP.HINT=Up TFRMLINKER.SPBTNUP.CAPTION=&Up TFRMLINKER.SPBTNDOWN.HINT=Down TFRMLINKER.SPBTNDOWN.CAPTION=Do&wn TFRMLINKER.SPBTNDEL.HINT=Delete TFRMLINKER.SPBTNDEL.CAPTION=&Delete TFRMLINKER.BTNOK.CAPTION=&OK TFRMLINKER.BTNEXIT.CAPTION=&Cancel ����������������������������������������������������������������������������������doublecmd-0.5.8/src/fMsg.pas������������������������������������������������������������������������0000644�0001750�0001750�00000004136�11756103143�014703� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit fMsg; interface uses SysUtils, Classes, Controls, Forms, StdCtrls, uOSForms; var cButtonWidth: Integer = 90; cButtonSpace: Integer = 15; type { TfrmMsg } TfrmMsg = class(TModalForm) lblMsg: TLabel; procedure FormCreate(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure frmMsgShow(Sender: TObject); private { Private declarations } public { Public declarations } Escape :Integer; iSelected:Integer; procedure ButtonClick(Sender:TObject); procedure MouseUpEvent(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); end; implementation {$R *.lfm} {$IF DEFINED(LCLGTK2)} uses LCLType, LCLVersion; {$ENDIF} procedure TfrmMsg.FormCreate(Sender: TObject); begin iSelected:=-1; end; procedure TfrmMsg.ButtonClick(Sender:TObject); begin iSelected:=(Sender as TButton).Tag; Close; end; procedure TfrmMsg.MouseUpEvent(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin {$IF DEFINED(LCLGTK) or DEFINED(LCLGTK2)} if (Button = mbLeft) and (Sender = FindLCLControl(Mouse.CursorPos)) then begin iSelected:=(Sender as TButton).Tag; Close; end; {$ENDIF} end; procedure TfrmMsg.FormKeyPress(Sender: TObject; var Key: Char); begin if (Key=#27) and (Escape>=0) then begin iSelected:=Escape; Close; end; end; procedure TfrmMsg.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin {$IF DEFINED(LCLGTK2) and (lcl_fullversion < 093100)} if Key = VK_RETURN then // Lazarus issue 0021483. ControlKeyUp not called after Enter pressed. Application.ControlKeyUp(ActiveControl, Key, Shift); {$ENDIF} end; procedure TfrmMsg.frmMsgShow(Sender: TObject); var x:Integer; begin for x:=0 to ComponentCount-1 do begin if Components[x] is TButton then begin with Components[x] as TButton do begin if Tag=0 then SetFocus; Continue; end; end; end; end; end. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/src/usyndiffcontrols.pas������������������������������������������������������������0000644�0001750�0001750�00000036511�11752211204�017416� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit uSynDiffControls; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Graphics, SynEdit, SynEditMiscClasses, SynGutterBase, SynTextDrawer, uDiff; const { Fake line kinds } lkFakeAdd = -1; lkFakeDelete = -2; { Default differ colors } clPaleGreen: TColor = $AAFFAA; clPaleRed : TColor = $AAAAFF; clPaleBlue : TColor = $FFAAAA; type TPaintStyle = (psForeground, psBackground); type { TDiffColors } TDiffColors = class(TPersistent) private fColors: array [TChangeKind] of TColor; fOnChange: TNotifyEvent; function GetColor(const AIndex: TChangeKind): TColor; procedure SetColor(const AIndex: TChangeKind; const AValue: TColor); public constructor Create; procedure Assign(aSource: TPersistent); override; property Colors[const aIndex: TChangeKind]: TColor read GetColor write SetColor; default; property OnChange: TNotifyEvent read fOnChange write fOnChange; published property Added: TColor index ckAdd read GetColor write SetColor; property Modified: TColor index ckModify read GetColor write SetColor; property Deleted: TColor index ckDelete read GetColor write SetColor; end; { TSynDiffGutterLineNumber } TSynDiffGutterLineNumber = class(TSynGutterPartBase) private FTextDrawer: TheTextDrawer; FDigitCount: integer; FAutoSizeDigitCount: integer; FLeadingZeros: boolean; procedure SetDigitCount(AValue : integer); procedure SetLeadingZeros(const AValue : boolean); function FormatLineNumber(Line: integer; IsFakeLine: boolean): string; protected procedure Init; override; function PreferedWidth: Integer; override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Assign(Source: TPersistent); override; procedure Paint(Canvas: TCanvas; AClip: TRect; FirstLine, LastLine: Integer); override; published property MarkupInfo; property DigitCount: integer read FDigitCount write SetDigitCount; property LeadingZeros: boolean read FLeadingZeros write SetLeadingZeros; end; { TSynDiffGutterChanges } TSynDiffGutterChanges = class(TSynGutterPartBase) private FColors: TDiffColors; protected function PreferedWidth: Integer; override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Paint(Canvas: TCanvas; AClip: TRect; FirstLine, LastLine: Integer); override; published property Colors: TDiffColors read FColors write FColors; end; { TSynDiffEdit } TSynDiffEdit = class(TCustomSynEdit) private FPaintStyle: TPaintStyle; FDiff: TDiff; FDiffCount: Integer; FEncoding: String; FColors: TDiffColors; FOriginalFile, FModifiedFile: TSynDiffEdit; private function GetDiffCount: Integer; function GetDiffKind(Index: Integer): TChangeKind; function GetLineNumber(Index: Integer): PtrInt; procedure SetLineNumber(Index: Integer; const AValue: PtrInt); procedure SetModifiedFile(const AValue: TSynDiffEdit); procedure SetOriginalFile(const AValue: TSynDiffEdit); procedure SetPaintStyle(const AValue: TPaintStyle); protected procedure SpecialLineMarkupEvent(Sender: TObject; Line: Integer; var Special: boolean; AMarkup: TSynSelectedColor); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure InsertFakeLine(AIndex: Integer; ADiffKind: PtrInt); procedure RemoveFakeLines(Strings: TStrings); procedure BeginCompare(ADiff: TDiff); procedure EndCompare(ADiffCount: Integer); function DiffBegin(ALine: Integer): Integer; function DiffEnd(ALine: Integer): Integer; property PaintStyle: TPaintStyle read FPaintStyle write SetPaintStyle; property Diff: TDiff read FDiff write FDiff; property DiffKind[Index: Integer]: TChangeKind read GetDiffKind; property DiffCount: Integer read GetDiffCount; property LineNumber[Index: Integer]: PtrInt read GetLineNumber write SetLineNumber; property Encoding: String read FEncoding write FEncoding; property Colors: TDiffColors read FColors write FColors; property OriginalFile: TSynDiffEdit read FOriginalFile write SetOriginalFile; property ModifiedFile: TSynDiffEdit read FModifiedFile write SetModifiedFile; published property OnStatusChange; end; implementation uses LCLIntf, LCLType, SynEditMiscProcs; { TDiffColors } function TDiffColors.GetColor(const AIndex: TChangeKind): TColor; begin Result:= fColors[AIndex]; end; procedure TDiffColors.SetColor(const AIndex: TChangeKind; const AValue: TColor); begin if fColors[AIndex] <> AValue then begin fColors[AIndex] := AValue; if Assigned(OnChange) then OnChange(Self); end; end; constructor TDiffColors.Create; begin fColors[ckAdd] := clPaleGreen; fColors[ckModify] := clPaleBlue; fColors[ckDelete] := clPaleRed; end; procedure TDiffColors.Assign(aSource: TPersistent); begin if (aSource is TDiffColors) then with (aSource as TDiffColors) do begin fColors[ckAdd]:= Added; fColors[ckModify]:= Modified; fColors[ckDelete]:= Deleted; end; end; { TSynDiffEdit } function TSynDiffEdit.GetDiffCount: Integer; begin if Assigned(FDiff) then Result:= FDiff.Count else Result:= FDiffCount; end; function TSynDiffEdit.GetDiffKind(Index: Integer): TChangeKind; begin if Assigned(FDiff) then Result:= FDiff.Compares[Index].Kind else begin if PtrInt(Lines.Objects[Index]) = 0 then Result:= ckNone else Result:= ckModify; end; end; function TSynDiffEdit.GetLineNumber(Index: Integer): PtrInt; begin Result:= PtrInt(Lines.Objects[Index]); end; procedure TSynDiffEdit.SetLineNumber(Index: Integer; const AValue: PtrInt); begin Lines.Objects[Index]:= TObject(AValue); end; procedure TSynDiffEdit.SetModifiedFile(const AValue: TSynDiffEdit); begin if FModifiedFile <> AValue then begin if (AValue <> nil) and (FOriginalFile <> nil) then raise Exception.Create('Having both ModifiedFile and OriginalFile is not supported'); FModifiedFile := AValue; end; end; procedure TSynDiffEdit.SetOriginalFile(const AValue: TSynDiffEdit); begin if FOriginalFile <> AValue then begin if (AValue <> nil) and (FModifiedFile <> nil) then raise Exception.Create('Having both OriginalFile and ModifiedFile is not supported'); FOriginalFile := AValue; end; end; procedure TSynDiffEdit.SetPaintStyle(const AValue: TPaintStyle); begin if FPaintStyle <> AValue then begin FPaintStyle := AValue; Invalidate; end; end; procedure TSynDiffEdit.SpecialLineMarkupEvent(Sender: TObject; Line: Integer; var Special: boolean; AMarkup: TSynSelectedColor); var Kind: TChangeKind; LineColor: TColor; begin if Line > DiffCount then Exit; Kind:= DiffKind[Line - 1]; if (Kind <> ckNone) then with AMarkup do begin case Kind of ckDelete: LineColor := FColors.Deleted; ckAdd: LineColor := FColors.Added; ckModify: if Assigned(Highlighter) then Exit else LineColor := FColors.Modified; end; Special:= True; if FPaintStyle = psForeground then begin Foreground := LineColor; Background := clWindow; end else begin Foreground:= clWindowText; Background := LineColor; end; end; end; procedure TSynDiffEdit.BeginCompare(ADiff: TDiff); begin FDiff:= ADiff; BeginUpdate; // Remove fake lines RemoveFakeLines(Lines); end; procedure TSynDiffEdit.EndCompare(ADiffCount: Integer); begin FDiffCount:= ADiffCount; EndUpdate; end; function TSynDiffEdit.DiffBegin(ALine: Integer): Integer; var Kind: TChangeKind; begin Result:= ALine; if ALine = 0 then Exit; // Skip lines with current difference type Kind := DiffKind[ALine]; while (ALine > 0) and (DiffKind[ALine] = Kind) do Dec(ALine); Result:= ALine + 1; end; function TSynDiffEdit.DiffEnd(ALine: Integer): Integer; var Kind: TChangeKind; begin Result:= ALine; if ALine = Lines.Count - 1 then Exit; // Skip lines with current difference type Kind := DiffKind[ALine]; while (ALine < Lines.Count - 1) and (DiffKind[ALine] = Kind) do Inc(ALine); Result:= ALine - 1; end; constructor TSynDiffEdit.Create(AOwner: TComponent); begin FDiff:= nil; inherited Create(AOwner); if not(csLoading in AOwner.ComponentState) then begin Gutter.Parts.Clear; with TSynDiffGutterLineNumber.Create(Gutter.Parts) do Name:= 'SynDiffGutterLineNumber'; with TSynDiffGutterChanges.Create(Gutter.Parts) do Name:= 'SynDiffGutterChanges'; end; FPaintStyle:= psBackground; FColors:= TDiffColors.Create; OnSpecialLineMarkup:= @SpecialLineMarkupEvent; end; destructor TSynDiffEdit.Destroy; begin if Assigned(FColors) then FreeAndNil(FColors); inherited Destroy; end; procedure TSynDiffEdit.InsertFakeLine(AIndex: Integer; ADiffKind: PtrInt); begin Lines.InsertObject(AIndex, EmptyStr, TObject(ADiffKind)); end; procedure TSynDiffEdit.RemoveFakeLines(Strings: TStrings); var I: Integer; begin for I:= Strings.Count - 1 downto 0 do begin if (PtrInt(Strings.Objects[I]) < 0) and (Strings[I] = EmptyStr) then Strings.Delete(I); end; end; { TSynDiffGutterChanges } function TSynDiffGutterChanges.PreferedWidth: Integer; begin Result := 4; end; constructor TSynDiffGutterChanges.Create(AOwner: TComponent); begin inherited Create(AOwner); FColors:= TDiffColors.Create; MarkupInfo.Background := clNone; end; destructor TSynDiffGutterChanges.Destroy; begin if Assigned(FColors) then FreeAndNil(FColors); inherited Destroy; end; procedure TSynDiffGutterChanges.Paint(Canvas: TCanvas; AClip: TRect; FirstLine, LastLine: Integer); var I, iLine: Integer; LineHeight: Integer; rcLine: TRect; SynDiffEdit: TSynDiffEdit; begin if not Visible then Exit; SynDiffEdit:= TSynDiffEdit(SynEdit); LineHeight := SynDiffEdit.LineHeight; if MarkupInfo.Background <> clNone then begin Canvas.Brush.Color := MarkupInfo.Background; Canvas.FillRect(AClip); end; Canvas.Pen.Width := Width; Canvas.Pen.EndCap:= pecFlat; rcLine := AClip; rcLine.Left := rcLine.Left + Width div 2; rcLine.Bottom := FirstLine * LineHeight; for I := FirstLine to LastLine do begin iLine := FoldView.TextIndex[I]; // next line rect rcLine.Top := rcLine.Bottom; Inc(rcLine.Bottom, LineHeight); if (iLine >= 0) and (iLine < SynDiffEdit.DiffCount) then begin case SynDiffEdit.DiffKind[iLine] of ckNone: Continue; ckAdd: Canvas.Pen.Color := FColors.Added; ckDelete: Canvas.Pen.Color := FColors.Deleted; ckModify: Canvas.Pen.Color := FColors.Modified; end; Canvas.Line(rcLine.Left, rcLine.Top + 1, rcLine.Left, rcLine.Bottom - 1); end; end; end; { TSynDiffGutterLineNumber } procedure TSynDiffGutterLineNumber.SetDigitCount(AValue: integer); begin AValue := MinMax(AValue, 2, 12); if FDigitCount <> AValue then begin FDigitCount := AValue; if AutoSize then begin FAutoSizeDigitCount := Max(FDigitCount, FAutoSizeDigitCount); DoAutoSize; end else FAutoSizeDigitCount := FDigitCount; DoChange(Self); end; end; procedure TSynDiffGutterLineNumber.SetLeadingZeros(const AValue: boolean); begin if FLeadingZeros <> AValue then begin FLeadingZeros := AValue; DoChange(Self); end; end; function TSynDiffGutterLineNumber.FormatLineNumber(Line: Integer; IsFakeLine: Boolean): String; var I: Integer; begin Result := EmptyStr; // if a symbol must be showed if IsFakeLine then begin case Line of lkFakeAdd: Result := StringOfChar(' ', FAutoSizeDigitCount-1) + '+'; lkFakeDelete: Result := StringOfChar(' ', FAutoSizeDigitCount-1) + '-'; else Result := StringOfChar(' ', FAutoSizeDigitCount-1) + '.'; end; end // else format the line number else begin Str(Line : FAutoSizeDigitCount, Result); if FLeadingZeros then for I := 1 to FAutoSizeDigitCount - 1 do begin if (Result[I] <> ' ') then Break; Result[I] := '0'; end; end; end; function TSynDiffGutterLineNumber.PreferedWidth: Integer; begin Result := FAutoSizeDigitCount * FTextDrawer.CharWidth + 1; end; procedure TSynDiffGutterLineNumber.Init; begin inherited Init; FTextDrawer := Gutter.TextDrawer; end; constructor TSynDiffGutterLineNumber.Create(AOwner: TComponent); begin FDigitCount := 4; FAutoSizeDigitCount := FDigitCount; FLeadingZeros := False; inherited Create(AOwner); end; destructor TSynDiffGutterLineNumber.Destroy; begin inherited Destroy; end; procedure TSynDiffGutterLineNumber.Assign(Source: TPersistent); var Src: TSynDiffGutterLineNumber; begin if Assigned(Source) and (Source is TSynDiffGutterLineNumber) then begin Src := TSynDiffGutterLineNumber(Source); FLeadingZeros := Src.FLeadingZeros; FDigitCount := Src.FDigitCount; FAutoSizeDigitCount := Src.FAutoSizeDigitCount; end; inherited Assign(Source); end; procedure TSynDiffGutterLineNumber.Paint(Canvas: TCanvas; AClip: TRect; FirstLine, LastLine: Integer); var I, iLine: Integer; rcLine: TRect; S: String; DC: HDC; FakeLine: Boolean; LineHeight: Integer; SynDiffEdit: TSynDiffEdit; begin if not Visible then Exit; SynDiffEdit:= TSynDiffEdit(SynEdit); LineHeight := SynDiffEdit.LineHeight; // Changed to use fTextDrawer.BeginDrawing and fTextDrawer.EndDrawing only // when absolutely necessary. Note: Never change brush / pen / font of the // canvas inside of this block (only through methods of fTextDrawer)! if MarkupInfo.Background <> clNone then Canvas.Brush.Color := MarkupInfo.Background else Canvas.Brush.Color := Gutter.Color; DC := Canvas.Handle; {$PUSH}{$R-} LCLIntf.SetBkColor(DC, Canvas.Brush.Color); {$POP} FTextDrawer.BeginDrawing(DC); try if MarkupInfo.Background <> clNone then FTextDrawer.SetBackColor(MarkupInfo.Background) else FTextDrawer.SetBackColor(Gutter.Color); if MarkupInfo.Foreground <> clNone then fTextDrawer.SetForeColor(MarkupInfo.Foreground) else fTextDrawer.SetForeColor(SynDiffEdit.Font.Color); fTextDrawer.SetFrameColor(MarkupInfo.FrameColor); fTextDrawer.Style := MarkupInfo.Style; // prepare the rect initially rcLine := AClip; rcLine.Bottom := FirstLine * LineHeight; for I := FirstLine to LastLine do begin iLine := FoldView.DisplayNumber[I]; // next line rect rcLine.Top := rcLine.Bottom; if Assigned(SynDiffEdit.FDiff) and (SynDiffEdit.DiffCount <> 0) then begin iLine:= SynDiffEdit.LineNumber[iLine - 1]; end; FakeLine := (iLine <= 0); // Get the formatted line number or dot S := FormatLineNumber(iLine, FakeLine); Inc(rcLine.Bottom, LineHeight); // erase the background and draw the line number string in one go fTextDrawer.ExtTextOut(rcLine.Left, rcLine.Top, ETO_OPAQUE or ETO_CLIPPED, rcLine, PChar(Pointer(S)),Length(S)); end; // now erase the remaining area if any if AClip.Bottom > rcLine.Bottom then begin rcLine.Top := rcLine.Bottom; rcLine.Bottom := AClip.Bottom; with rcLine do fTextDrawer.ExtTextOut(Left, Top, ETO_OPAQUE, rcLine, nil, 0); end; finally fTextDrawer.EndDrawing; end; end; end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/src/fmodview.pas��������������������������������������������������������������������0000644�0001750�0001750�00000016767�11756114400�015642� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit fModView; {$mode objfpc}{$H+} interface uses SysUtils, Classes, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, ButtonPanel, uOSForms; type { TfrmModView } TfrmModView = class(TModalForm) btnPath1: TSpeedButton; btnPath2: TSpeedButton; btnPath3: TSpeedButton; btnPath4: TSpeedButton; btnPath5: TSpeedButton; btnProportion: TSpeedButton; bplButtons: TButtonPanel; lblHeight: TLabel; lblPath1: TLabel; lblPath2: TLabel; lblPath3: TLabel; lblPath4: TLabel; lblPath5: TLabel; lblQuality: TLabel; lblWidth: TLabel; pnlMain: TPanel; pnlCopyMoveFile: TPanel; pnlQuality: TPanel; pnlSize: TPanel; rbBmp: TRadioButton; rbIco: TRadioButton; rbJpg: TRadioButton; rbPath1: TRadioButton; rbPath2: TRadioButton; rbPath3: TRadioButton; rbPath4: TRadioButton; rbPath5: TRadioButton; rbPng: TRadioButton; rbPnm: TRadioButton; sddCopyMoveFile: TSelectDirectoryDialog; tbQuality: TTrackBar; teHeight: TEdit; tePath1: TEdit; tePath2: TEdit; tePath3: TEdit; tePath4: TEdit; tePath5: TEdit; teQuality: TEdit; teWidth: TEdit; procedure btnCancelClick(Sender: TObject); procedure btnOkClick(Sender: TObject); procedure btnPathClick(Sender: TObject); procedure btnProportionClick(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormKeyPress(Sender: TObject; var Key: char); procedure FormShow(Sender: TObject); procedure rbBmpChange(Sender: TObject); procedure rbIcoChange(Sender: TObject); procedure rbJpgChange(Sender: TObject); procedure rbPngChange(Sender: TObject); procedure rbPnmChange(Sender: TObject); procedure tbQualityMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure teHeightKeyPress(Sender: TObject; var Key: char); procedure teHeightKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure teQualityKeyPress(Sender: TObject; var Key: char); procedure teQualityKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState ); procedure teWidthKeyPress(Sender: TObject; var Key: char); procedure teWidthKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); private { private declarations } prX, prY: integer; public Path, sExt : string; { public declarations } end; implementation {$R *.lfm} uses uGlobs; procedure TfrmModView.btnProportionClick(Sender: TObject); begin btnProportion.ShowCaption:= not (btnProportion.ShowCaption); end; procedure TfrmModView.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin gCopyMovePath1 := tePath1.Text; gCopyMovePath2 := tePath2.Text; gCopyMovePath3 := tePath3.Text; gCopyMovePath4 := tePath4.Text; gCopyMovePath5 := tePath5.Text; end; procedure TfrmModView.FormKeyPress(Sender: TObject; var Key: char); begin if pnlCopyMoveFile.Visible then begin rbPath1.Checked:= false; rbPath2.Checked:= false; rbPath3.Checked:= false; rbPath4.Checked:= false; rbPath5.Checked:= false; case Key of '1': begin rbPath1.Checked:= true; Key := #0; btnOkClick(Sender); end; '2': begin rbPath2.Checked:= true; Key := #0; btnOkClick(Sender); end; '3': begin rbPath3.Checked:= true; Key := #0; btnOkClick(Sender); end; '4': begin rbPath4.Checked:= true; Key := #0; btnOkClick(Sender); end; '5': begin rbPath5.Checked:= true; Key := #0; btnOkClick(Sender); end; end; end; end; procedure TfrmModView.FormShow(Sender: TObject); begin if pnlSize.Visible then begin prX:=StrToInt(teWidth.Text); prY:=StrToInt(teHeight.Text); end; if pnlCopyMoveFile.Visible then begin rbPath1.SetFocus; tePath1.Text := gCopyMovePath1; tePath2.Text := gCopyMovePath2; tePath3.Text := gCopyMovePath3; tePath4.Text := gCopyMovePath4; tePath5.Text := gCopyMovePath5; end; if pnlQuality.Visible then begin sExt:= '.jpg'; tbQuality.Enabled:=true; lblQuality.Enabled:=True; end; end; procedure TfrmModView.rbBmpChange(Sender: TObject); begin sExt:='.bmp'; tbQuality.Enabled:=False; teQuality.Enabled:=False; lblQuality.Enabled:=False; end; procedure TfrmModView.rbIcoChange(Sender: TObject); begin sExt:='.ico'; tbQuality.Enabled:=False; teQuality.Enabled:=False; lblQuality.Enabled:=False; end; procedure TfrmModView.rbJpgChange(Sender: TObject); begin sExt:='.jpg'; tbQuality.Enabled:=True; teQuality.Enabled:=True; lblQuality.Enabled:=True; end; procedure TfrmModView.rbPngChange(Sender: TObject); begin sExt:='.png'; tbQuality.Enabled:=False; teQuality.Enabled:=False; lblQuality.Enabled:=False; end; procedure TfrmModView.rbPnmChange(Sender: TObject); begin sExt:='.pnm'; tbQuality.Enabled:=False; teQuality.Enabled:=False; lblQuality.Enabled:=False; end; procedure TfrmModView.tbQualityMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin teQuality.Text:= intToStr(tbQuality.Position); end; procedure TfrmModView.btnOkClick(Sender: TObject); begin if pnlCopyMoveFile.Visible then begin if rbPath1.Checked then Path:=tePath1.Text; if rbPath2.Checked then Path:=tePath2.Text; if rbPath3.Checked then Path:=tePath3.Text; if rbPath4.Checked then Path:=tePath4.Text; if rbPath5.Checked then Path:=tePath5.Text; end; ModalResult:= mrOk; end; procedure TfrmModView.btnPathClick(Sender: TObject); begin if sddCopyMoveFile.Execute then begin if sender=btnPath1 then begin tePath1.Text:= sddCopyMoveFile.Filename; rbPath1.Checked:=true; end; if sender=btnPath2 then begin tePath2.Text:= sddCopyMoveFile.Filename; rbPath2.Checked:=true; end; if sender=btnPath3 then begin tePath3.Text:= sddCopyMoveFile.Filename; rbPath3.Checked:=true; end; if sender=btnPath4 then begin tePath4.Text:= sddCopyMoveFile.Filename; rbPath4.Checked:=true; end; if sender=btnPath5 then begin tePath5.Text:= sddCopyMoveFile.Filename; rbPath5.Checked:=true; end; end; end; procedure TfrmModView.btnCancelClick(Sender: TObject); begin ModalResult:= mrCancel; end; procedure TfrmModView.teHeightKeyPress(Sender: TObject; var Key: char); begin if not (key in ['0'..'9', #8]) then key:=#0; end; procedure TfrmModView.teHeightKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if btnProportion.ShowCaption then begin teWidth.Text := IntToStr(round(StrToInt(teHeight.Text)*prX/prY)); end; end; procedure TfrmModView.teQualityKeyPress(Sender: TObject; var Key: char); begin if not (key in ['0'..'9', #8]) then key:=#0; end; procedure TfrmModView.teQualityKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if StrToInt(teQuality.Text)<=100 then tbQuality.Position:=StrToInt(teQuality.Text); end; procedure TfrmModView.teWidthKeyPress(Sender: TObject; var Key: char); begin if not (key in ['0'..'9', #8]) then key:=#0; end; procedure TfrmModView.teWidthKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if btnProportion.ShowCaption then begin teHeight.Text := IntToStr(round(StrToInt(teWidth.Text)*prY/prX)); end; end; end. ���������doublecmd-0.5.8/src/ufileproperty.pas���������������������������������������������������������������0000644�0001750�0001750�00000056124�11767424216�016735� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit uFileProperty; {$mode objfpc}{$H+} interface uses Classes, SysUtils, DCBasicTypes; type TFilePropertyType = ( fpName, fpSize, // = fpUncompressedSize fpCompressedSize, fpAttributes, fpModificationTime, fpCreationTime, fpLastAccessTime, fpLink, fpOwner, fpType, fpComment ); const fpAll = [Low(TFilePropertyType) .. High(TFilePropertyType)]; type TFilePropertiesTypes = set of TFilePropertyType; TFilePropertiesDescriptions = array of String;//TFileProperty; EInvalidFileProperty = class(Exception); // Forward declarations. IFilePropertyFormatter = interface; { TFileProperty } TFileProperty = class private public constructor Create; virtual; function Clone: TFileProperty; virtual; procedure CloneTo(FileProperty: TFileProperty); virtual; // Text description of the property. // Don't know if it will be really needed. class function GetDescription: String; virtual abstract; class function GetID: TFilePropertyType; virtual abstract; function AsString: String; virtual; // Formats the property value as a string using some formatter object. function Format(Formatter: IFilePropertyFormatter): String; virtual abstract; end; TFileProperties = array [TFilePropertyType] of TFileProperty//class(TList) { A list of TFileProperty. It would allow to query properties by index and name and by TFilePropertyType. Implement Clone if made into a class. } //end ; // -- Concrete properties --------------------------------------------------- TFileNameProperty = class(TFileProperty) private FName: UTF8String; // only name, no path procedure SetName(NewName: UTF8String); public constructor Create; override; constructor Create(Name: UTF8String); virtual; overload; function Clone: TFileNameProperty; override; procedure CloneTo(FileProperty: TFileProperty); override; class function GetDescription: String; override; class function GetID: TFilePropertyType; override; function Format(Formatter: IFilePropertyFormatter): String; override; property Value: UTF8String read FName write SetName; end; TFileSizeProperty = class(TFileProperty) private FSize: Int64; public constructor Create; override; constructor Create(Size: Int64); virtual; overload; function Clone: TFileSizeProperty; override; procedure CloneTo(FileProperty: TFileProperty); override; class function GetDescription: String; override; class function GetID: TFilePropertyType; override; // Retrieve possible values for the property. function GetMinimumValue: Int64; function GetMaximumValue: Int64; function Format(Formatter: IFilePropertyFormatter): String; override; property Value: Int64 read FSize write FSize; end; { TFileCompressedSizeProperty } TFileCompressedSizeProperty = class(TFileSizeProperty) public function Clone: TFileCompressedSizeProperty; override; class function GetDescription: String; override; class function GetID: TFilePropertyType; override; end; TFileDateTimeProperty = class(TFileProperty) private FDateTime: TDateTime; public constructor Create; override; constructor Create(DateTime: TDateTime); virtual; overload; procedure CloneTo(FileProperty: TFileProperty); override; // Retrieve possible values for the property. function GetMinimumValue: TDateTime; function GetMaximumValue: TDateTime; property Value: TDateTime read FDateTime write FDateTime; end; TFileModificationDateTimeProperty = class(TFileDateTimeProperty) public function Clone: TFileModificationDateTimeProperty; override; class function GetDescription: String; override; class function GetID: TFilePropertyType; override; function Format(Formatter: IFilePropertyFormatter): String; override; end; TFileCreationDateTimeProperty = class(TFileDateTimeProperty) public function Clone: TFileCreationDateTimeProperty; override; class function GetDescription: String; override; class function GetID: TFilePropertyType; override; function Format(Formatter: IFilePropertyFormatter): String; override; end; TFileLastAccessDateTimeProperty = class(TFileDateTimeProperty) public function Clone: TFileLastAccessDateTimeProperty; override; class function GetDescription: String; override; class function GetID: TFilePropertyType; override; function Format(Formatter: IFilePropertyFormatter): String; override; end; {en File system attributes. } TFileAttributesProperty = class(TFileProperty) private FAttributes: TFileAttrs; public constructor Create; override; constructor Create(Attr: TFileAttrs); virtual; overload; class function CreateOSAttributes: TFileAttributesProperty; overload; class function CreateOSAttributes(Attr: TFileAttrs): TFileAttributesProperty; overload; function Clone: TFileAttributesProperty; override; procedure CloneTo(FileProperty: TFileProperty); override; class function GetID: TFilePropertyType; override; // Is the file a directory. function IsDirectory: Boolean; virtual; // Is this a system file. function IsSysFile: boolean; virtual abstract; // Is it a symbolic link. function IsLink: Boolean; virtual; // Retrieves raw attributes. function GetAttributes: TFileAttrs; virtual; // Sets raw attributes. procedure SetAttributes(Attributes: TFileAttrs); virtual; property Value: TFileAttrs read GetAttributes write SetAttributes; end; { TNtfsFileAttributesProperty } TNtfsFileAttributesProperty = class(TFileAttributesProperty) public function Clone: TNtfsFileAttributesProperty; override; // Is the file a directory. function IsDirectory: Boolean; override; // Is this a system file. function IsSysFile: boolean; override; // Is it a symbolic link. function IsLink: Boolean; override; function IsReadOnly: Boolean; function IsHidden: Boolean; class function GetDescription: String; override; function Format(Formatter: IFilePropertyFormatter): String; override; end; { TUnixFileAttributesProperty } TUnixFileAttributesProperty = class(TFileAttributesProperty) public function Clone: TUnixFileAttributesProperty; override; // Is the file a directory. function IsDirectory: Boolean; override; // Is this a system file. function IsSysFile: boolean; override; // Is it a symbolic link. function IsLink: Boolean; override; function IsOwnerRead: Boolean; function IsOwnerWrite: Boolean; function IsOwnerExecute: Boolean; // ... class function GetDescription: String; override; function Format(Formatter: IFilePropertyFormatter): String; override; end; { TFileLinkProperty } TFileLinkProperty = class(TFileProperty) private FIsLinkToDirectory: Boolean; FIsValid: Boolean; FLinkTo: String; public constructor Create; override; function Clone: TFileLinkProperty; override; procedure CloneTo(FileProperty: TFileProperty); override; class function GetDescription: String; override; class function GetID: TFilePropertyType; override; function Format(Formatter: IFilePropertyFormatter): String; override; property IsLinkToDirectory: Boolean read FIsLinkToDirectory write FIsLinkToDirectory; property IsValid: Boolean read FIsValid write FIsValid; property LinkTo: String read FLinkTo write FLinkTo; end; { TFileOwnerProperty } {en Owner of the file. } TFileOwnerProperty = class(TFileProperty) private FOwner: Cardinal; FGroup: Cardinal; FOwnerStr: String; FGroupStr: String; public constructor Create; override; function Clone: TFileOwnerProperty; override; procedure CloneTo(FileProperty: TFileProperty); override; class function GetDescription: String; override; class function GetID: TFilePropertyType; override; function Format(Formatter: IFilePropertyFormatter): String; override; property Owner: Cardinal read FOwner write FOwner; property Group: Cardinal read FGroup write FGroup; property OwnerStr: String read FOwnerStr write FOwnerStr; property GroupStr: String read FGroupStr write FGroupStr; end; { TFileTypeProperty } {en File type description. } TFileTypeProperty = class(TFileProperty) private FType: String; public constructor Create; override; function Clone: TFileTypeProperty; override; procedure CloneTo(FileProperty: TFileProperty); override; class function GetDescription: String; override; class function GetID: TFilePropertyType; override; function Format(Formatter: IFilePropertyFormatter): String; override; property Value: String read FType write FType; end; { TFileCommentProperty } TFileCommentProperty = class(TFileProperty) private FComment: String; public constructor Create; override; function Clone: TFileCommentProperty; override; procedure CloneTo(FileProperty: TFileProperty); override; class function GetDescription: String; override; class function GetID: TFilePropertyType; override; function Format(Formatter: IFilePropertyFormatter): String; override; property Value: String read FComment write FComment; end; // -- Property formatter interface ------------------------------------------ IFilePropertyFormatter = interface(IInterface) ['{18EF8E34-1010-45CD-8DC9-678C7C2DC89F}'] function FormatFileName(FileProperty: TFileNameProperty): String; function FormatFileSize(FileProperty: TFileSizeProperty): String; function FormatDateTime(FileProperty: TFileDateTimeProperty): String; function FormatModificationDateTime(FileProperty: TFileModificationDateTimeProperty): String; function FormatNtfsAttributes(FileProperty: TNtfsFileAttributesProperty): String; function FormatUnixAttributes(FileProperty: TUnixFileAttributesProperty): String; end; implementation uses DCOSUtils, DCFileAttributes, uDefaultFilePropertyFormatter; resourcestring rsSizeDescription = 'Size'; rsCompressedSizeDescription = 'Compressed size'; rsDateTimeDescription = 'DateTime'; rsModificationDateTimeDescription = 'Modification date/time'; // ---------------------------------------------------------------------------- constructor TFileProperty.Create; begin inherited; end; function TFileProperty.Clone: TFileProperty; begin Result:= nil; raise Exception.Create('Cannot create abstract class'); end; procedure TFileProperty.CloneTo(FileProperty: TFileProperty); begin end; function TFileProperty.AsString: String; begin Result := Format(DefaultFilePropertyFormatter); end; // ---------------------------------------------------------------------------- constructor TFileNameProperty.Create; begin Self.Create(''); end; constructor TFileNameProperty.Create(Name: UTF8String); begin inherited Create; Value := Name; end; function TFileNameProperty.Clone: TFileNameProperty; begin Result := TFileNameProperty.Create; CloneTo(Result); end; procedure TFileNameProperty.CloneTo(FileProperty: TFileProperty); begin if Assigned(FileProperty) then begin inherited CloneTo(FileProperty); with FileProperty as TFileNameProperty do begin FName := Self.FName; end; end; end; class function TFileNameProperty.GetDescription: String; begin Result := 'name'; end; class function TFileNameProperty.GetID: TFilePropertyType; begin Result := fpName; end; function TFileNameProperty.Format(Formatter: IFilePropertyFormatter): String; begin Result := Formatter.FormatFileName(Self); end; procedure TFileNameProperty.SetName(NewName: UTF8String); var i: Integer; begin for i := 1 to Length(NewName) do if NewName[i] in AllowDirectorySeparators then raise EInvalidFileProperty.CreateFmt('Name cannot have directory separators: "%s"', [NewName]); FName := NewName; end; // ---------------------------------------------------------------------------- constructor TFileSizeProperty.Create; begin Self.Create(0); end; constructor TFileSizeProperty.Create(Size: Int64); begin inherited Create; Value := Size; end; function TFileSizeProperty.Clone: TFileSizeProperty; begin Result := TFileSizeProperty.Create; CloneTo(Result); end; procedure TFileSizeProperty.CloneTo(FileProperty: TFileProperty); begin if Assigned(FileProperty) then begin inherited CloneTo(FileProperty); with FileProperty as TFileSizeProperty do begin FSize := Self.FSize; end; end; end; class function TFileSizeProperty.GetDescription: String; begin Result := rsSizeDescription; end; class function TFileSizeProperty.GetID: TFilePropertyType; begin Result := fpSize; end; function TFileSizeProperty.GetMinimumValue: Int64; begin Result := 0; end; function TFileSizeProperty.GetMaximumValue: Int64; begin Result := 0; // maximum file size end; function TFileSizeProperty.Format(Formatter: IFilePropertyFormatter): String; begin Result := Formatter.FormatFileSize(Self); end; // ---------------------------------------------------------------------------- function TFileCompressedSizeProperty.Clone: TFileCompressedSizeProperty; begin Result := TFileCompressedSizeProperty.Create; CloneTo(Result); end; class function TFileCompressedSizeProperty.GetDescription: String; begin Result:= rsCompressedSizeDescription; end; class function TFileCompressedSizeProperty.GetID: TFilePropertyType; begin Result := fpCompressedSize; end; // ---------------------------------------------------------------------------- constructor TFileDateTimeProperty.Create; begin Self.Create(SysUtils.Now); end; constructor TFileDateTimeProperty.Create(DateTime: TDateTime); begin inherited Create; Value := DateTime; end; procedure TFileDateTimeProperty.CloneTo(FileProperty: TFileProperty); begin if Assigned(FileProperty) then begin inherited CloneTo(FileProperty); with FileProperty as TFileDateTimeProperty do begin FDateTime := Self.FDateTime; end; end; end; function TFileDateTimeProperty.GetMinimumValue: TDateTime; begin Result := MinDateTime; end; function TFileDateTimeProperty.GetMaximumValue: TDateTime; begin Result := MaxDateTime; end; // ---------------------------------------------------------------------------- function TFileModificationDateTimeProperty.Clone: TFileModificationDateTimeProperty; begin Result := TFileModificationDateTimeProperty.Create; CloneTo(Result); end; class function TFileModificationDateTimeProperty.GetDescription: String; begin Result := rsModificationDateTimeDescription; end; class function TFileModificationDateTimeProperty.GetID: TFilePropertyType; begin Result := fpModificationTime; end; function TFileModificationDateTimeProperty.Format(Formatter: IFilePropertyFormatter): String; begin Result := Formatter.FormatModificationDateTime(Self); end; // ---------------------------------------------------------------------------- function TFileCreationDateTimeProperty.Clone: TFileCreationDateTimeProperty; begin Result := TFileCreationDateTimeProperty.Create; CloneTo(Result); end; class function TFileCreationDateTimeProperty.GetDescription: String; begin Result := rsDateTimeDescription; end; class function TFileCreationDateTimeProperty.GetID: TFilePropertyType; begin Result := fpCreationTime; end; function TFileCreationDateTimeProperty.Format(Formatter: IFilePropertyFormatter): String; begin Result := Formatter.FormatDateTime(Self); end; // ---------------------------------------------------------------------------- function TFileLastAccessDateTimeProperty.Clone: TFileLastAccessDateTimeProperty; begin Result := TFileLastAccessDateTimeProperty.Create; CloneTo(Result); end; class function TFileLastAccessDateTimeProperty.GetDescription: String; begin Result := rsDateTimeDescription; end; class function TFileLastAccessDateTimeProperty.GetID: TFilePropertyType; begin Result := fpLastAccessTime; end; function TFileLastAccessDateTimeProperty.Format(Formatter: IFilePropertyFormatter): String; begin Result := Formatter.FormatDateTime(Self); end; // ---------------------------------------------------------------------------- constructor TFileAttributesProperty.Create; begin Create(0); end; constructor TFileAttributesProperty.Create(Attr: TFileAttrs); begin inherited Create; FAttributes := Attr; end; class function TFileAttributesProperty.CreateOSAttributes: TFileAttributesProperty; begin Result := CreateOSAttributes(0); end; class function TFileAttributesProperty.CreateOSAttributes(Attr: TFileAttrs): TFileAttributesProperty; begin {$IF DEFINED(WINDOWS)} Result := TNtfsFileAttributesProperty.Create(Attr); {$ELSEIF DEFINED(UNIX)} Result := TUnixFileAttributesProperty.Create(Attr); {$ELSE} Result := nil; {$ENDIF} end; function TFileAttributesProperty.Clone: TFileAttributesProperty; begin Result:= nil; raise Exception.Create('Cannot create abstract class'); end; procedure TFileAttributesProperty.CloneTo(FileProperty: TFileProperty); begin if Assigned(FileProperty) then begin inherited CloneTo(FileProperty); with FileProperty as TFileAttributesProperty do begin FAttributes := Self.FAttributes; end; end; end; class function TFileAttributesProperty.GetID: TFilePropertyType; begin Result := fpAttributes; end; function TFileAttributesProperty.GetAttributes: TFileAttrs; begin Result := FAttributes; end; procedure TFileAttributesProperty.SetAttributes(Attributes: TFileAttrs); begin FAttributes := Attributes; end; function TFileAttributesProperty.IsDirectory: Boolean; begin Result := fpS_ISDIR(FAttributes); end; function TFileAttributesProperty.IsLink: Boolean; begin Result := fpS_ISLNK(FAttributes); end; // ---------------------------------------------------------------------------- function TNtfsFileAttributesProperty.Clone: TNtfsFileAttributesProperty; begin Result := TNtfsFileAttributesProperty.Create; CloneTo(Result); end; function TNtfsFileAttributesProperty.IsDirectory: Boolean; begin Result:= ((FAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0); end; function TNtfsFileAttributesProperty.IsSysFile: boolean; begin Result := ((FAttributes and faSysFile) <> 0) or ((FAttributes and faHidden) <> 0); end; function TNtfsFileAttributesProperty.IsLink: Boolean; begin Result:= ((FAttributes and FILE_ATTRIBUTE_REPARSE_POINT) <> 0); end; function TNtfsFileAttributesProperty.IsReadOnly: Boolean; begin Result := (FAttributes and faReadOnly) <> 0; end; function TNtfsFileAttributesProperty.IsHidden: Boolean; begin Result := (FAttributes and faHidden) <> 0; end; class function TNtfsFileAttributesProperty.GetDescription: String; begin Result:= EmptyStr; end; function TNtfsFileAttributesProperty.Format(Formatter: IFilePropertyFormatter): String; begin Result := Formatter.FormatNtfsAttributes(Self) end; // ---------------------------------------------------------------------------- function TUnixFileAttributesProperty.Clone: TUnixFileAttributesProperty; begin Result := TUnixFileAttributesProperty.Create; CloneTo(Result); end; function TUnixFileAttributesProperty.IsDirectory: Boolean; begin Result:= ((FAttributes and S_IFMT) = S_IFDIR); end; function TUnixFileAttributesProperty.IsSysFile: Boolean; begin Result := False; end; function TUnixFileAttributesProperty.IsLink: Boolean; begin Result:= ((FAttributes and S_IFMT) = S_IFLNK); end; function TUnixFileAttributesProperty.IsOwnerRead: Boolean; begin Result:= False; end; function TUnixFileAttributesProperty.IsOwnerWrite: Boolean; begin Result:= False; end; function TUnixFileAttributesProperty.IsOwnerExecute: Boolean; begin Result:= False; end; class function TUnixFileAttributesProperty.GetDescription: String; begin Result:= EmptyStr; end; function TUnixFileAttributesProperty.Format(Formatter: IFilePropertyFormatter): String; begin Result := Formatter.FormatUnixAttributes(Self); end; // ---------------------------------------------------------------------------- constructor TFileLinkProperty.Create; begin inherited Create; FIsLinkToDirectory := False; FIsValid := True; end; function TFileLinkProperty.Clone: TFileLinkProperty; begin Result := TFileLinkProperty.Create; CloneTo(Result); end; procedure TFileLinkProperty.CloneTo(FileProperty: TFileProperty); begin if Assigned(FileProperty) then begin inherited CloneTo(FileProperty); with FileProperty as TFileLinkProperty do begin FIsLinkToDirectory := Self.FIsLinkToDirectory; FIsValid := Self.FIsValid; FLinkTo := Self.FLinkTo; end; end; end; class function TFileLinkProperty.GetDescription: String; begin Result := ''; end; class function TFileLinkProperty.GetID: TFilePropertyType; begin Result := fpLink; end; function TFileLinkProperty.Format(Formatter: IFilePropertyFormatter): String; begin Result := ''; end; // ---------------------------------------------------------------------------- constructor TFileOwnerProperty.Create; begin inherited Create; end; function TFileOwnerProperty.Clone: TFileOwnerProperty; begin Result := TFileOwnerProperty.Create; CloneTo(Result); end; procedure TFileOwnerProperty.CloneTo(FileProperty: TFileProperty); begin if Assigned(FileProperty) then begin inherited CloneTo(FileProperty); with FileProperty as TFileOwnerProperty do begin FOwner := Self.FOwner; FGroup := Self.FGroup; FOwnerStr := Self.FOwnerStr; FGroupStr := Self.FGroupStr; end; end; end; class function TFileOwnerProperty.GetDescription: String; begin Result := ''; end; class function TFileOwnerProperty.GetID: TFilePropertyType; begin Result := fpOwner; end; function TFileOwnerProperty.Format(Formatter: IFilePropertyFormatter): String; begin Result := ''; end; { TFileTypeProperty } constructor TFileTypeProperty.Create; begin inherited Create; end; function TFileTypeProperty.Clone: TFileTypeProperty; begin Result := TFileTypeProperty.Create; CloneTo(Result); end; procedure TFileTypeProperty.CloneTo(FileProperty: TFileProperty); begin if Assigned(FileProperty) then begin inherited CloneTo(FileProperty); with FileProperty as TFileTypeProperty do begin FType := Self.FType; end; end; end; class function TFileTypeProperty.GetDescription: String; begin Result := ''; end; class function TFileTypeProperty.GetID: TFilePropertyType; begin Result := fpType; end; function TFileTypeProperty.Format(Formatter: IFilePropertyFormatter): String; begin Result := FType; end; { TFileCommentProperty } constructor TFileCommentProperty.Create; begin inherited Create; end; function TFileCommentProperty.Clone: TFileCommentProperty; begin Result := TFileCommentProperty.Create; CloneTo(Result); end; procedure TFileCommentProperty.CloneTo(FileProperty: TFileProperty); begin if Assigned(FileProperty) then begin inherited CloneTo(FileProperty); with FileProperty as TFileCommentProperty do begin FComment := Self.FComment; end; end; end; class function TFileCommentProperty.GetDescription: String; begin Result:= ''; end; class function TFileCommentProperty.GetID: TFilePropertyType; begin Result := fpComment; end; function TFileCommentProperty.Format(Formatter: IFilePropertyFormatter): String; begin Result:= FComment; end; end. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/src/fhardlink.pas�������������������������������������������������������������������0000644�0001750�0001750�00000004332�12076733100�015745� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit fHardLink; interface uses SysUtils, Classes, Controls, Forms, StdCtrls, Buttons; type { TfrmHardLink } TfrmHardLink = class(TForm) lblExistingFile: TLabel; lblLinkToCreate: TLabel; edtExistingFile: TEdit; edtLinkToCreate: TEdit; btnOK: TBitBtn; btnCancel: TBitBtn; procedure btnOKClick(Sender: TObject); procedure FormShow(Sender: TObject); private FCurrentPath: String; public constructor Create(TheOwner: TComponent; CurrentPath: String); reintroduce; end; function ShowHardLinkForm(const sExistingFile, sLinkToCreate, CurrentPath: String): Boolean; implementation {$R *.lfm} uses FileUtil, uLng, uGlobs, uLog, uShowMsg, uOSUtils, DCStrUtils; function ShowHardLinkForm(const sExistingFile, sLinkToCreate, CurrentPath: String): Boolean; begin with TfrmHardLink.Create(Application, CurrentPath) do begin try edtLinkToCreate.Text := sLinkToCreate; edtExistingFile.Text := sExistingFile; Result:= (ShowModal = mrOK); finally Free; end; end; end; constructor TfrmHardLink.Create(TheOwner: TComponent; CurrentPath: String); begin inherited Create(TheOwner); FCurrentPath := CurrentPath; end; procedure TfrmHardLink.btnOKClick(Sender: TObject); var sSrc,sDst:String; begin sSrc:=edtExistingFile.Text; sDst:=edtLinkToCreate.Text; if CompareFilenames(sSrc, sDst) = 0 then Exit; sSrc := GetAbsoluteFileName(FCurrentPath, sSrc); sDst := GetAbsoluteFileName(FCurrentPath, sDst); if CreateHardLink(sSrc, sDst) then begin // write log if (log_cp_mv_ln in gLogOptions) and (log_success in gLogOptions) then logWrite(Format(rsMsgLogSuccess+rsMsgLogLink,[sSrc+' -> '+sDst]), lmtSuccess); end else begin // write log if (log_cp_mv_ln in gLogOptions) and (log_errors in gLogOptions) then logWrite(Format(rsMsgLogError+rsMsgLogLink,[sSrc+' -> '+sDst]), lmtError); // Standart error modal dialog MsgError(rsHardErrCreate); end; end; procedure TfrmHardLink.FormShow(Sender: TObject); begin edtLinkToCreate.SelectAll; end; end. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/src/fpackdlg.lfm��������������������������������������������������������������������0000644�0001750�0001750�00000014621�12023046500�015544� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������object frmPackDlg: TfrmPackDlg Left = 341 Height = 319 Top = 210 Width = 598 HelpContext = 150 ActiveControl = edtPackCmd AutoSize = True BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Pack files' ChildSizing.LeftRightSpacing = 5 ChildSizing.TopBottomSpacing = 5 ClientHeight = 319 ClientWidth = 598 Constraints.MinHeight = 236 Constraints.MinWidth = 482 OnShow = FormShow Position = poScreenCenter LCLVersion = '1.1' object lblPrompt: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner Left = 5 Height = 18 Top = 5 Width = 145 Caption = 'Pack file(s) to the file:' FocusControl = edtPackCmd ParentColor = False ShowAccelChar = False end object btnOk: TButton AnchorSideTop.Control = pnlOptions AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnCancel Left = 304 Height = 32 Top = 244 Width = 90 Anchors = [akTop, akRight] BorderSpacing.Top = 24 BorderSpacing.Right = 6 BorderSpacing.InnerBorder = 4 Caption = '&OK' Default = True ModalResult = 1 TabOrder = 6 end object btnCancel: TButton AnchorSideTop.Control = btnOk AnchorSideRight.Control = btnHelp Left = 400 Height = 32 Top = 244 Width = 90 Anchors = [akTop, akRight] BorderSpacing.Right = 6 BorderSpacing.InnerBorder = 4 Cancel = True Caption = '&Cancel' ModalResult = 2 TabOrder = 7 end object btnHelp: TButton AnchorSideTop.Control = btnCancel AnchorSideRight.Control = rgPacker AnchorSideRight.Side = asrBottom Left = 496 Height = 32 Top = 244 Width = 90 Anchors = [akTop, akRight] BorderSpacing.InnerBorder = 4 Caption = '&Help' TabOrder = 8 end object edtPackCmd: TDirectoryEdit AnchorSideLeft.Control = lblPrompt AnchorSideTop.Control = lblPrompt AnchorSideTop.Side = asrBottom AnchorSideRight.Control = pnlOptions AnchorSideRight.Side = asrBottom Left = 5 Height = 28 Top = 23 Width = 351 OnAcceptDirectory = edtPackCmdAcceptDirectory ShowHidden = False ButtonWidth = 23 NumGlyphs = 1 Anchors = [akTop, akLeft, akRight] MaxLength = 0 TabOrder = 0 end object rgPacker: TRadioGroup AnchorSideLeft.Control = edtPackCmd AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblPrompt AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 388 Height = 100 Top = 5 Width = 198 Anchors = [akTop, akLeft, akRight] AutoFill = True AutoSize = True BorderSpacing.Left = 32 BorderSpacing.Right = 12 Caption = 'Packer' ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ChildSizing.EnlargeHorizontal = crsHomogenousSpaceResize ChildSizing.EnlargeVertical = crsHomogenousSpaceResize ChildSizing.ShrinkHorizontal = crsHomogenousSpaceResize ChildSizing.ShrinkVertical = crsHomogenousSpaceResize ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 3 Columns = 3 Constraints.MinHeight = 100 Constraints.MinWidth = 100 OnClick = arbChange TabOrder = 2 end object cbPackerList: TComboBox AnchorSideLeft.Control = cbOtherPlugins AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = rgPacker AnchorSideTop.Side = asrBottom AnchorSideRight.Control = rgPacker AnchorSideRight.Side = asrBottom Left = 442 Height = 30 Top = 111 Width = 136 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 BorderSpacing.Right = 8 Enabled = False ItemHeight = 0 OnChange = cbOtherPluginsChange ParentFont = False Style = csDropDownList TabOrder = 4 Visible = False end object btnConfig: TButton AnchorSideLeft.Control = rgPacker AnchorSideTop.Control = cbPackerList AnchorSideTop.Side = asrBottom AnchorSideRight.Control = rgPacker AnchorSideRight.Side = asrBottom Left = 394 Height = 32 Top = 147 Width = 186 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 BorderSpacing.Top = 6 BorderSpacing.Right = 6 BorderSpacing.InnerBorder = 4 Caption = 'Con&figure' OnClick = btnConfigClick TabOrder = 5 end object cbOtherPlugins: TCheckBox AnchorSideLeft.Control = rgPacker AnchorSideTop.Control = cbPackerList AnchorSideTop.Side = asrCenter Left = 394 Height = 20 Top = 116 Width = 48 BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = '=>' Enabled = False OnChange = cbOtherPluginsChange TabOrder = 3 Visible = False end object pnlOptions: TPanel AnchorSideLeft.Control = Owner AnchorSideTop.Control = edtPackCmd AnchorSideTop.Side = asrBottom Left = 5 Height = 161 Top = 59 Width = 351 AutoSize = True BorderSpacing.Top = 8 BevelOuter = bvNone ChildSizing.Layout = cclLeftToRightThenTopToBottom ClientHeight = 161 ClientWidth = 351 Constraints.MinWidth = 340 TabOrder = 1 object cbStoreDir: TCheckBox Left = 0 Height = 23 Top = 0 Width = 351 Caption = 'Also &pack path names (only recursed)' Checked = True State = cbChecked TabOrder = 0 end object cbMultivolume: TCheckBox Left = 0 Height = 23 Top = 23 Width = 351 Caption = '&Multiple disk archive' TabOrder = 1 end object cbMoveToArchive: TCheckBox Left = 0 Height = 23 Top = 46 Width = 351 Caption = 'Mo&ve to archive' TabOrder = 2 end object cbCreateSFX: TCheckBox Left = 0 Height = 23 Top = 69 Width = 351 Caption = 'Create self e&xtracting archive' OnClick = cbCreateSFXClick TabOrder = 3 end object cbEncrypt: TCheckBox Left = 0 Height = 23 Top = 92 Width = 351 Caption = 'Encr&ypt' TabOrder = 4 end object cbPutInTarFirst: TCheckBox Left = 0 Height = 23 Top = 115 Width = 351 Caption = 'P&ut in the TAR archive first' OnChange = cbPutInTarFirstChange TabOrder = 5 end object cbCreateSeparateArchives: TCheckBox Left = 0 Height = 23 Top = 138 Width = 351 Caption = 'C&reate separate archives, one per selected file/dir' OnChange = cbCreateSeparateArchivesChange TabOrder = 6 end end end ���������������������������������������������������������������������������������������������������������������doublecmd-0.5.8/src/dmhigh.pas����������������������������������������������������������������������0000644�0001750�0001750�00000037674�12243704276�015272� 0����������������������������������������������������������������������������������������������������ustar �alexx���������������������������alexx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit dmHigh; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, SynEdit, StringHashList, LCLVersion, SynEditHighlighter, SynHighlighterPas, SynHighlighterCPP, SynHighlighterJava, SynHighlighterHTML, SynHighlighterXML, SynHighlighterLFM, SynHighlighterUNIXShellScript, SynHighlighterPHP, SynHighlighterTeX, SynHighlighterSQL, SynHighlighterPerl, SynHighlighterCss, SynHighlighterPython, SynHighlighterDiff, SynHighlighterVB, SynHighlighterBat, SynHighlighterIni, SynHighlighterPo; const HighlighterConfig = 'highlighters.xml'; SYNS_XML_DefaultText = 'Default text'; type { TSynPlainTextHighlighter } TSynPlainTextHighlighter = class(TSynCustomHighlighter) public class function GetLanguageName: string; override; end; { TdmHighl } TdmHighl = class(TDataModule) SynBatSyn1: TSynBatSyn; SynCppSyn1: TSynCppSyn; SynCssSyn1: TSynCssSyn; SynDiffSyn1: TSynDiffSyn; SynHTMLSyn1: TSynHTMLSyn; SynIniSyn1: TSynIniSyn; SynJavaSyn1: TSynJavaSyn; SynLFMSyn1: TSynLFMSyn; SynPasSyn1: TSynPasSyn; SynPerlSyn1: TSynPerlSyn; SynPHPSyn1: TSynPHPSyn; SynPoSyn1: TSynPoSyn; SynPythonSyn1: TSynPythonSyn; SynSQLSyn1: TSynSQLSyn; SynTeXSyn1: TSynTeXSyn; SynUNIXShellScriptSyn1: TSynUNIXShellScriptSyn; SynVBSyn1: TSynVBSyn; SynXMLSyn1: TSynXMLSyn; procedure dmHighlCreate(Sender: TObject); procedure dmHighlDestroy(Sender: TObject); private FTemp: Boolean; FChanged: Boolean; procedure ImportFromOldFormat; public SynHighlighterList: TStringList; SynHighlighterHashList: TStringHashList; SynPlainTextHighlighter: TSynPlainTextHighlighter; function GetSampleSource(Highlighter: TSynCustomHighlighter): string; public constructor Create(AOwner: TComponent; ATemp: Boolean); overload; procedure Assign(Source: TPersistent); override; function LoadFromFile(const FileName: UTF8String): Boolean; function SaveToFile(const FileName: UTF8String): Boolean; function GetHighlighterByExt(const sExtension: string): TSynCustomHighlighter; procedure SetHighlighter(SynEdit: TCustomSynEdit; Highlighter: TSynCustomHighlighter); property Changed: Boolean read FChanged write FChanged; end; {$if lcl_fullversion >= 1010000} TSynHighlighterAttrFeature = ( hafBackColor, hafForeColor, hafFrameColor, hafStyle, hafStyleMask, hafFrameStyle, hafFrameEdges ); TSynHighlighterAttrFeatures = set of TSynHighlighterAttrFeature; { TSynHighlighterAttributesHelper } TSynHighlighterAttributesHelper = class helper for TSynHighlighterAttributes private function GetFeatures: TSynHighlighterAttrFeatures; procedure SetFeatures(AValue: TSynHighlighterAttrFeatures); public property Features: TSynHighlighterAttrFeatures read GetFeatures write SetFeatures; end; {$endif} var dmHighl: TdmHighl; implementation {$R *.lfm} uses Graphics, SynEditTypes, uHighlighterProcs, DCXmlConfig, uGlobsPaths, DCClassesUtf8, DCOSUtils, uLng; const csDefaultName = 'editor.col'; function SynHighlighterSortCompare(List: TStringList; Index1, Index2: Integer): Integer; begin if CompareStr(List[Index1], rsSynLangPlainText) = 0 then Result:= -1 else if CompareStr(List[Index2], rsSynLangPlainText) = 0 then Result:= 1 else Result:= CompareStr(List[Index1], List[Index2]); end; { TSynPlainTextHighlighter } class function TSynPlainTextHighlighter.GetLanguageName: string; begin Result:= rsSynLangPlainText; end; { TdmHighl } procedure TdmHighl.dmHighlCreate(Sender: TObject); var I: LongWord; HighLighter: TSynCustomHighlighter; begin SynHighlighterList:= TStringList.Create; SynHighlighterHashList:= TStringHashList.Create(True); {$PUSH}{$HINTS OFF}{$WARNINGS OFF} SynPlainTextHighlighter:= TSynPlainTextHighlighter.Create(Self); {$POP} GetHighlighters(Self, SynHighlighterList, False); for I:= 0 to SynHighlighterList.Count - 1 do begin HighLighter:= TSynCustomHighlighter(SynHighlighterList.Objects[I]); SynHighlighterHashList.Add(HighLighter.LanguageName, HighLighter); with HighLighter.AddSpecialAttribute(rsSynDefaultText, SYNS_XML_DefaultText) do begin Features:= [hafBackColor, hafForeColor]; Background:= clWindow; Foreground:= clWindowText; end; end; SynHighlighterList.CustomSort(@SynHighlighterSortCompare); if (FTemp = False) then begin if not mbFileExists(gpCfgDir + csDefaultName) then LoadFromFile(gpCfgDir + HighlighterConfig) else begin ImportFromOldFormat; SaveToFile(gpCfgDir + HighlighterConfig); mbRenameFile(gpCfgDir + csDefaultName, gpCfgDir + csDefaultName + '.obsolete'); end; end; end; procedure TdmHighl.dmHighlDestroy(Sender: TObject); begin if FChanged and (FTemp = False) then SaveToFile(gpCfgDir + HighlighterConfig); SynHighlighterList.Free; SynHighlighterHashList.Free; SynPlainTextHighlighter.Free; end; procedure TdmHighl.ImportFromOldFormat; var I: Integer = 0; J, K: Integer; aFile: TStringListEx; s, sValue: UTF8String; Highlighter: TSynCustomHighlighter; Attribute: TSynHighlighterAttributes; begin aFile:= TStringListEx.Create; try aFile.LoadFromFile(gpCfgDir + csDefaultName); while I < aFile.Count do begin; s:= Trim(aFile[I]); Inc(I, 1); if s = '' then Continue; if s[1] = '#' then Continue; if s[1] <> '[' then Continue; Inc(I, 3); sValue:= Copy(s, 2, Length(s) - 2); for J:= 0 to SynHighlighterList.Count - 1 do begin Highlighter:= TSynCustomHighlighter(SynHighlighterList.Objects[J]); for K:= 0 to Highlighter.AttrCount - 1 do begin Attribute:= Highlighter.Attribute[K]; if SameText(sValue, Attribute.StoredName) then begin Attribute.Background := TColor(StrToIntDef(aFile.ValueFromIndex[I - 3], 0)); Attribute.Foreground := TColor(StrToIntDef(aFile.ValueFromIndex[I - 2], 0)); Attribute.Style := TFontStyles(StrToIntDef(aFile.ValueFromIndex[I - 1], 0)); Break; end; end; end; end; finally aFile.Free; end; end; function TdmHighl.GetSampleSource(Highlighter: TSynCustomHighlighter): string; begin if (Highlighter is TSynPlainTextHighlighter) then Result := 'Double Commander is a cross platform open source file manager'#13 + 'with two panels side by side. It is inspired by Total Commander'#13 + 'and features some new ideas.'#13 else if (Highlighter is TSynPasSyn) then Result := '{ Comment }'#13 + '{$R- compiler directive}'#13 + 'procedure TForm1.Button1Click(Sender: TObject);'#13 + 'var // Delphi Comment'#13 + ' Number, I, X: Integer;'#13 + 'begin'#13 + ' Number := 12345 * (2 + 9) // << Matching Brackets ;'#13 + ' Caption := ''The number is '' + IntToStr(Number);'#13 + ' asm'#13 + ' MOV AX,1234h'#13 + ' MOV Number,AX'#13 + ' end;'#13 + ' case ModalResult of'#13+ ' mrOK: inc(X);'#13+ ' mrCancel, mrIgnore: dec(X);'#13+ ' end;'#13+ ' ListBox1.Items.Add(IntToStr(X));'#13 + 'end;'#13 + #13 else if (Highlighter is TSynCppSyn) then Result := '/* Comment */'#13 + '#include <stdio.h>'#13 + '#include <stdlib.h>'#13 + #13 + 'static char line_buf[LINE_BUF];'#13 + #13 + 'int main(int argc,char **argv){'#13 + ' FILE *file;'#13 + ' line_buf[0]=0;'#13 + ' printf("\n");'#13 + ' return 0;'#13 + '}'#13 + ''#13 + #13 else if (Highlighter is TSynDiffSyn) then Result := '*** /a/file'#13#10 + '--- /b/file'#13#10 + '***************'#13#10 + '*** 2,5 ****'#13#10 + '--- 2,5 ----'#13#10 + ' context'#13#10 + '- removed'#13#10 + '! Changed'#13#10 + '+ added'#13#10 + ' context'#13#10 else if (Highlighter is TSynHTMLSyn) then Result := '<html>'#13 + '<title>Lazarus Sample source for html'#13 + ''#13 + ''#13 + ''#13 + '

'#13 + ' Some Text'#13 + ' Ampersands:  F P C'#13 + '

'#13 + ''#13 + ''#13 + ''#13 + ''#13 + #13 else if (Highlighter is TSynPerlSyn) then Result := '#!/usr/bin/perl'#13 + '# Perl sample code'#13 + ''#13 + '$i = "10";'#13 + 'print "$ENV{PATH}\n";'#13 + '($i =~ /\d+/) || die "Error\n";'#13 + ''#13 + '# Text Block'#13 + ''#13 + #13 else if (Highlighter is TSynUNIXShellScriptSyn) then Result := '#!/bin/bash'#13#13 + '# Bash syntax highlighting'#13#10 + 'set -x'#13#10 + 'set -e'#13#10 + 'Usage="Usage: $0 devel|stable"'#13#10 + 'FPCVersion=$1'#13#10 + 'for ver in devel stable; do'#13#10 + ' if [ "x$FPCVersion" = "x$ver" ]; then'#13#10 + ' fi'#13#10 + 'done'#13#10 + '# Text Block'#13#10 + #13#10 else Result:= EmptyStr; end; constructor TdmHighl.Create(AOwner: TComponent; ATemp: Boolean); begin inherited Create(AOwner); FTemp:= ATemp; end; procedure TdmHighl.Assign(Source: TPersistent); var I: LongWord; Highl: TdmHighl absolute Source; procedure CopyAttributes(SourceHighlighter, TargetHighlighter: TSynCustomHighlighter); var J: LongWord; begin TargetHighlighter.Tag:= SourceHighlighter.Tag; for J:= 0 to SourceHighlighter.AttrCount - 1 do begin TargetHighlighter.Attribute[J].Background:= SourceHighlighter.Attribute[J].Background; TargetHighlighter.Attribute[J].Foreground:= SourceHighlighter.Attribute[J].Foreground; TargetHighlighter.Attribute[J].FrameColor:= SourceHighlighter.Attribute[J].FrameColor; TargetHighlighter.Attribute[J].FrameStyle:= SourceHighlighter.Attribute[J].FrameStyle; TargetHighlighter.Attribute[J].FrameEdges:= SourceHighlighter.Attribute[J].FrameEdges; TargetHighlighter.Attribute[J].Style := SourceHighlighter.Attribute[J].Style; TargetHighlighter.Attribute[J].StyleMask := SourceHighlighter.Attribute[J].StyleMask; end; end; begin FChanged:= True; for I:= 0 to SynHighlighterList.Count - 1 do begin CopyAttributes(TSynCustomHighlighter(Highl.SynHighlighterList.Objects[I]), TSynCustomHighlighter(SynHighlighterList.Objects[I]) ); end; end; function TdmHighl.LoadFromFile(const FileName: UTF8String): Boolean; var J: LongInt; Config: TXmlConfig = nil; Root, FormNode, AttributeNode: TXmlNode; Highlighter: TSynCustomHighlighter; Attribute: TSynHighlighterAttributes; LanguageName, AttributeName : String; begin try Result:= True; try Config:= TXmlConfig.Create(FileName, True); Root := Config.FindNode(Config.RootNode, 'Highlighters'); if Assigned(Root) then begin FormNode := Config.FindNode(Root, 'Highlighter'); if Assigned(FormNode) then begin while Assigned(FormNode) do begin LanguageName:= Config.GetAttr(FormNode, 'Name', EmptyStr); Highlighter:= TSynCustomHighlighter(SynHighlighterHashList.Data[LanguageName]); if Assigned(Highlighter) then begin Highlighter.Tag := Config.GetAttr(FormNode, 'Tag', 1); AttributeNode := Config.FindNode(FormNode, 'Attribute'); if Assigned(AttributeNode) then begin while Assigned(AttributeNode) do begin AttributeName:= Config.GetAttr(AttributeNode, 'Name', EmptyStr);; for J:= 0 to Highlighter.AttrCount - 1 do begin Attribute:= Highlighter.Attribute[J]; if SameText(Attribute.StoredName, AttributeName) then begin Attribute.Style := TFontStyles(Config.GetValue(AttributeNode, 'Style', Integer(Attribute.Style))); Attribute.StyleMask := TFontStyles(Config.GetValue(AttributeNode, 'StyleMask', Integer(Attribute.StyleMask))); Attribute.Foreground := TColor(Config.GetValue(AttributeNode, 'Foreground', Integer(Attribute.Foreground))); Attribute.Background := TColor(Config.GetValue(AttributeNode, 'Background', Integer(Attribute.Background))); Attribute.FrameColor := TColor(Config.GetValue(AttributeNode, 'FrameColor', Integer(Attribute.FrameColor))); Attribute.FrameStyle := TSynLineStyle(Config.GetValue(AttributeNode, 'FrameStyle', Integer(Attribute.FrameStyle))); Attribute.FrameEdges := TSynFrameEdges(Config.GetValue(AttributeNode, 'FrameEdges', Integer(Attribute.FrameEdges))); Break; end; end; AttributeNode := AttributeNode.NextSibling; end; end; end; FormNode := FormNode.NextSibling; end; end; end; except Result:= False; end; finally Config.Free; end; end; function TdmHighl.SaveToFile(const FileName: UTF8String): Boolean; var I: LongInt; Config: TXmlConfig; Root, FormNode, AttributeNode: TXmlNode; Attribute: TSynHighlighterAttributes; procedure SaveHighlighter(Highlighter: TSynCustomHighlighter); var J: LongWord; begin FormNode := Config.AddNode(Root, 'Highlighter'); Config.SetAttr(FormNode, 'Tag', Highlighter.Tag); Config.SetAttr(FormNode, 'Name', Highlighter.LanguageName); for J:= 0 to Highlighter.AttrCount - 1 do begin Attribute:= Highlighter.Attribute[J]; AttributeNode := Config.AddNode(FormNode, 'Attribute'); Config.SetAttr(AttributeNode, 'Name', Attribute.StoredName); Config.SetValue(AttributeNode, 'Style', Integer(Attribute.Style)); Config.SetValue(AttributeNode, 'StyleMask', Integer(Attribute.StyleMask)); Config.SetValue(AttributeNode, 'Foreground', Integer(Attribute.Foreground)); Config.SetValue(AttributeNode, 'Background', Integer(Attribute.Background)); Config.SetValue(AttributeNode, 'FrameColor', Integer(Attribute.FrameColor)); Config.SetValue(AttributeNode, 'FrameStyle', Integer(Attribute.FrameStyle)); Config.SetValue(AttributeNode, 'FrameEdges', Integer(Attribute.FrameEdges)); end; end; begin Result:= True; Config := TXmlConfig.Create; try Config.FileName := FileName; Root := Config.FindNode(Config.RootNode, 'Highlighters', True); Config.ClearNode(Root); Config.SetAttr(Root, 'Version', 1); try for I := 0 to SynHighlighterList.Count - 1 do begin SaveHighlighter(TSynCustomHighlighter(SynHighlighterList.Objects[I])); end; Config.Save; except Result:= False; end; finally Config.Free; end; end; function TdmHighl.GetHighlighterByExt(const sExtension: string): TSynCustomHighlighter; begin Result:= GetHighlighterFromFileExt(SynHighlighterList, sExtension); if (Result = nil) then Result:= SynPlainTextHighlighter; end; procedure TdmHighl.SetHighlighter(SynEdit: TCustomSynEdit; Highlighter: TSynCustomHighlighter); var I: LongInt; Attribute: TSynHighlighterAttributes; begin if (Highlighter is TSynPlainTextHighlighter) then SynEdit.Highlighter:= nil else SynEdit.Highlighter:= Highlighter; I:= Highlighter.AttrCount - 1; repeat Attribute:= Highlighter.Attribute[I]; Dec(I); until (I < 0) or SameText(Attribute.StoredName, SYNS_XML_DefaultText); SynEdit.Color:= Attribute.Background; SynEdit.Font.Color:= Attribute.Foreground; end; {$if lcl_fullversion >= 1010000} { TSynHighlighterAttributesHelper } function TSynHighlighterAttributesHelper.GetFeatures: TSynHighlighterAttrFeatures; begin if SameText(StoredName, SYNS_XML_DefaultText) then Result:= [hafBackColor, hafForeColor] else Result:= [hafBackColor, hafForeColor, hafFrameColor, hafStyle, hafFrameStyle, hafFrameEdges]; end; procedure TSynHighlighterAttributesHelper.SetFeatures(AValue: TSynHighlighterAttrFeatures); begin end; {$endif} end. doublecmd-0.5.8/src/fcolumnssetconf.lrt0000644000175000017500000000362211740433676017246 0ustar alexxalexxTFCOLUMNSSETCONF.CAPTION=Configure custom columns view TFCOLUMNSSETCONF.LBLCONFIGVIEWNR.CAPTION=Configure view nr: TFCOLUMNSSETCONF.LBNROFCOLUMNSSET.CAPTION=0 TFCOLUMNSSETCONF.LBLNAME.CAPTION=Name: TFCOLUMNSSETCONF.PNLPREVIEWHEAD.CAPTION=Preview TFCOLUMNSSETCONF.CHKUSECUSTOMVIEW.CAPTION=Use custom font and color TFCOLUMNSSETCONF.LABEL3.CAPTION=Font: TFCOLUMNSSETCONF.BTNFONTSELECT.CAPTION=... TFCOLUMNSSETCONF.LABEL4.CAPTION=Size: TFCOLUMNSSETCONF.RESFONT.CAPTION=R TFCOLUMNSSETCONF.BTNALLFONT.CAPTION=All TFCOLUMNSSETCONF.CBOVERCOLOR.CAPTION=Allow Overcolor TFCOLUMNSSETCONF.CTEXTLABEL.CAPTION=Text Color: TFCOLUMNSSETCONF.CBACKGRNDLABEL.CAPTION=BackGround: TFCOLUMNSSETCONF.LBLBACKGROUND2.CAPTION=Background 2: TFCOLUMNSSETCONF.BTNFORECOLOR.CAPTION=>> TFCOLUMNSSETCONF.BTNBACKCOLOR.CAPTION=>> TFCOLUMNSSETCONF.BTNBACKCOLOR2.CAPTION=>> TFCOLUMNSSETCONF.RESTEXT.CAPTION=R TFCOLUMNSSETCONF.RESBACK.CAPTION=R TFCOLUMNSSETCONF.RESBACK2.CAPTION=R TFCOLUMNSSETCONF.BTNALLTEXT.CAPTION=All TFCOLUMNSSETCONF.BTNALLBACK.CAPTION=All TFCOLUMNSSETCONF.BTNALLBACK2.CAPTION=All TFCOLUMNSSETCONF.LBLMARKCOLOR.CAPTION=Mark Color: TFCOLUMNSSETCONF.LBLCURSORCOLOR.CAPTION=Cursor Color: TFCOLUMNSSETCONF.LBLCURSORTEXT.CAPTION=Cursor Text: TFCOLUMNSSETCONF.BTNMARKCOLOR.CAPTION=>> TFCOLUMNSSETCONF.BTNCURSORCOLOR.CAPTION=>> TFCOLUMNSSETCONF.BTNCURSORTEXT.CAPTION=>> TFCOLUMNSSETCONF.RESMARK.CAPTION=R TFCOLUMNSSETCONF.RESCURCOL.CAPTION=R TFCOLUMNSSETCONF.RESCURTEXT.CAPTION=R TFCOLUMNSSETCONF.BTNALLMARC.CAPTION=All TFCOLUMNSSETCONF.BTNALLCURCOL.CAPTION=All TFCOLUMNSSETCONF.BTNALLCURTEXT.CAPTION=All TFCOLUMNSSETCONF.PNLCUSTHEAD.CAPTION=Customize column: TFCOLUMNSSETCONF.BTNNEXT.CAPTION=-> TFCOLUMNSSETCONF.BTNPREV.CAPTION=<- TFCOLUMNSSETCONF.BTNOK.CAPTION=&OK TFCOLUMNSSETCONF.BTNCANCEL.CAPTION=Cancel TFCOLUMNSSETCONF.CBCURSORBORDER.CAPTION=Cursor border TFCOLUMNSSETCONF.BTNCURSORBORDERCOLOR.CAPTION=>> TFCOLUMNSSETCONF.MIADDCOLUMN.CAPTION=Add column doublecmd-0.5.8/src/fdialogbox.pas0000644000175000017500000005154511740427612016136 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- This unit contains realization of Dialog API functions. Copyright (C) 2008-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fDialogBox; {$mode objfpc}{$H+} {$include calling.inc} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, Types, Buttons, ExtCtrls, Extension; type { TDialogBox } TDialogBox = class(TForm) DialogButton: TButton; DialogBitBtn: TBitBtn; DialogComboBox: TComboBox; DialogListBox: TListBox; DialogCheckBox: TCheckBox; DialogGroupBox: TGroupBox; DialogLabel: TLabel; DialogEdit: TEdit; DialogImage: TImage; // Dialog events procedure DialogBoxShow(Sender: TObject); // Button events procedure ButtonClick(Sender: TObject); procedure ButtonEnter(Sender: TObject); procedure ButtonExit(Sender: TObject); procedure ButtonKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure ButtonKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); // ComboBox events procedure ComboBoxClick(Sender: TObject); procedure ComboBoxDblClick(Sender: TObject); procedure ComboBoxChange(Sender: TObject); procedure ComboBoxEnter(Sender: TObject); procedure ComboBoxExit(Sender: TObject); procedure ComboBoxKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure ComboBoxKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); // Edit events procedure EditClick(Sender: TObject); procedure EditDblClick(Sender: TObject); procedure EditChange(Sender: TObject); procedure EditEnter(Sender: TObject); procedure EditExit(Sender: TObject); procedure EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure EditKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); // ListBox events procedure ListBoxClick(Sender: TObject); procedure ListBoxDblClick(Sender: TObject); procedure ListBoxSelectionChange(Sender: TObject; User: boolean); procedure ListBoxEnter(Sender: TObject); procedure ListBoxExit(Sender: TObject); procedure ListBoxKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure ListBoxKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); // CheckBox events procedure CheckBoxChange(Sender: TObject); private FDlgProc: TDlgProc; FResult: LongBool; protected procedure ShowDialogBox; public { public declarations } end; function InputBox(Caption, Prompt: PAnsiChar; MaskInput: LongBool; Value: PAnsiChar; ValueMaxLen: Integer): LongBool; dcpcall; function MessageBox(Text, Caption: PAnsiChar; Flags: Longint): Integer; dcpcall; function DialogBoxLFM(LFMData: Pointer; DataSize: LongWord; DlgProc: TDlgProc): LongBool; dcpcall; function DialogBoxLRS(LRSData: Pointer; DataSize: LongWord; DlgProc: TDlgProc): LongBool; dcpcall; function DialogBoxLFMFile(lfmFileName: PAnsiChar; DlgProc: TDlgProc): LongBool; dcpcall; function SendDlgMsg(pDlg: PtrUInt; DlgItemName: PAnsiChar; Msg, wParam, lParam: PtrInt): PtrInt; dcpcall; implementation uses uShowMsg, DCClassesUtf8; function InputBox(Caption, Prompt: PAnsiChar; MaskInput: LongBool; Value: PAnsiChar; ValueMaxLen: Integer): LongBool; dcpcall; var sValue: UTF8String; begin Result:= False; sValue:= StrPas(Value); if ShowInputQuery(Caption, Prompt, MaskInput, sValue) then begin StrLCopy(Value, PAnsiChar(sValue), ValueMaxLen); Result:= True; end; end; function MessageBox(Text, Caption: PAnsiChar; Flags: Longint): Integer; dcpcall; begin Result:= ShowMessageBox(Text, Caption, Flags); end; procedure SetDialogBoxResourceLRS(LRSData: UTF8String); var LResource: TLResource; begin LResource := LazarusResources.Find('TDialogBox','FORMDATA'); if Assigned(LResource) then LResource.Value:= LRSData else LazarusResources.Add('TDialogBox','FORMDATA', LRSData); end; procedure SetDialogBoxResourceLFM(LFMData: UTF8String); var LFMStream: TStringStream = nil; BinStream: TStringStream = nil; begin try LFMStream:= TStringStream.Create(LFMData); BinStream:= TStringStream.Create(''); LRSObjectTextToBinary(LFMStream, BinStream); SetDialogBoxResourceLRS(BinStream.DataString); finally if Assigned(LFMStream) then FreeAndNil(LFMStream); if Assigned(BinStream) then FreeAndNil(BinStream); end; end; function DialogBox(DlgProc: TDlgProc): LongBool; var Dialog: TDialogBox = nil; begin Dialog:= TDialogBox.Create(nil); try with Dialog do begin FDlgProc:= DlgProc; TThread.Synchronize(nil, @ShowDialogBox); Result:= FResult; end; finally if Assigned(Dialog) then FreeAndNil(Dialog); end; end; function DialogBoxLFM(LFMData: Pointer; DataSize: LongWord; DlgProc: TDlgProc): LongBool;dcpcall; var DataString: UTF8String; begin if Assigned(LFMData) and (DataSize > 0) then begin SetString(DataString, LFMData, DataSize); SetDialogBoxResourceLFM(DataString); Result := DialogBox(DlgProc); end else Result := False; end; function DialogBoxLRS(LRSData: Pointer; DataSize: LongWord; DlgProc: TDlgProc): LongBool; dcpcall; var DataString: UTF8String; begin if Assigned(LRSData) and (DataSize > 0) then begin SetString(DataString, LRSData, DataSize); SetDialogBoxResourceLRS(DataString); Result := DialogBox(DlgProc); end else Result := False; end; function DialogBoxLFMFile(lfmFileName: PAnsiChar; DlgProc: TDlgProc): LongBool;dcpcall; var lfmStringList: TStringListEx; begin if Assigned(lfmFileName) then begin lfmStringList:= TStringListEx.Create; try lfmStringList.LoadFromFile(lfmFileName); SetDialogBoxResourceLFM(lfmStringList.Text); Result := DialogBox(DlgProc); finally FreeAndNil(lfmStringList); end; end else Result := False; end; function SendDlgMsg(pDlg: PtrUInt; DlgItemName: PAnsiChar; Msg, wParam, lParam: PtrInt): PtrInt;dcpcall; var DialogBox: TDialogBox; Control: TControl; sText: UTF8String; I: Integer; Rect: TRect; Key: Word; begin DialogBox:= TDialogBox(Pointer(pDlg)); // find component by name for I:= 0 to DialogBox.ComponentCount - 1 do begin Control:= TControl(DialogBox.Components[I]); if CompareText(Control.Name, DlgItemName) = 0 then Break; end; // process message case Msg of DM_CLOSE: begin DialogBox.Close; if wParam <> -1 then DialogBox.ModalResult:= wParam; end; DM_ENABLE: begin Result:= PtrInt(Control.Enabled); if wParam <> -1 then Control.Enabled:= Boolean(wParam); end; DM_GETCHECK: begin if Control is TCheckBox then Result:= PtrInt((Control as TCheckBox).State); if Control is TRadioButton then Result := PtrInt((Control as TRadioButton).Checked); end; DM_GETDLGBOUNDS: begin Rect.Left:= DialogBox.Left; Rect.Top:= DialogBox.Top; Rect.Right:= DialogBox.Left + DialogBox.Width; Rect.Bottom:= DialogBox.Top + DialogBox.Height; Result:= PtrInt(@Rect); end; DM_GETDLGDATA: begin Result:= DialogBox.Tag; end; DM_GETDROPPEDDOWN: begin if Control is TComboBox then Result:= PtrInt((Control as TComboBox).DroppedDown); end; DM_GETITEMBOUNDS: begin Rect.Left:= Control.Left; Rect.Top:= Control.Top; Rect.Right:= Control.Left + Control.Width; Rect.Bottom:= Control.Top + Control.Height; Result:= PtrInt(@Rect); end; DM_GETITEMDATA: begin Result:= Control.Tag; end; DM_LISTADD: begin sText:= PAnsiChar(wParam); if Control is TComboBox then (Control as TComboBox).Items.AddObject(sText, TObject(Pointer(lParam))); if Control is TListBox then (Control as TListBox).Items.AddObject(sText, TObject(Pointer(lParam))); end; DM_LISTADDSTR: begin sText:= PAnsiChar(wParam); if Control is TComboBox then (Control as TComboBox).Items.Add(sText); if Control is TListBox then (Control as TListBox).Items.Add(sText); end; DM_LISTDELETE: begin if Control is TComboBox then (Control as TComboBox).Items.Delete(wParam); if Control is TListBox then (Control as TListBox).Items.Delete(wParam); end; DM_LISTINDEXOF: begin sText:= PAnsiChar(lParam); if Control is TComboBox then Result:= (Control as TComboBox).Items.IndexOf(sText); if Control is TListBox then Result:= (Control as TListBox).Items.IndexOf(sText); end; DM_LISTINSERT: begin sText:= PAnsiChar(lParam); if Control is TComboBox then (Control as TComboBox).Items.Insert(wParam, sText); if Control is TListBox then (Control as TListBox).Items.Insert(wParam, sText); end; DM_LISTGETCOUNT: begin if Control is TComboBox then Result:= (Control as TComboBox).Items.Count; if Control is TListBox then Result:= (Control as TListBox).Items.Count; end; DM_LISTGETDATA: begin if Control is TComboBox then Result:= PtrInt((Control as TComboBox).Items.Objects[wParam]); if Control is TListBox then Result:= PtrInt((Control as TListBox).Items.Objects[wParam]); end; DM_LISTGETITEM: begin if Control is TComboBox then sText:= (Control as TComboBox).Items[wParam]; if Control is TListBox then sText:= (Control as TListBox).Items[wParam]; Result:= PtrInt(PAnsiChar(sText)); end; DM_LISTGETITEMINDEX: begin Result:= -1; if Control is TComboBox then Result:= (Control as TComboBox).ItemIndex; if Control is TListBox then Result:= (Control as TListBox).ItemIndex; end; DM_LISTSETITEMINDEX: begin if Control is TComboBox then (Control as TComboBox).ItemIndex:= wParam; if Control is TListBox then (Control as TListBox).ItemIndex:= wParam; end; DM_LISTUPDATE : begin sText:= PAnsiChar(lParam); if Control is TComboBox then (Control as TComboBox).Items[wParam]:= sText; if Control is TListBox then (Control as TListBox).Items[wParam]:= sText; end; DM_GETTEXT: begin if Control is TButton then sText:= (Control as TButton).Caption; if Control is TComboBox then sText:= (Control as TComboBox).Text; if Control is TEdit then sText:= (Control as TEdit).Text; if Control is TGroupBox then sText:= (Control as TGroupBox).Caption; if Control is TLabel then sText:= (Control as TLabel).Caption; Result:= PtrInt(PAnsiChar(sText)); end; DM_KEYDOWN: begin Key:= wParam; DialogBox.KeyDown(Key, GetKeyShiftState); Result:= Key; end; DM_KEYUP: begin Key:= wParam; DialogBox.KeyUp(Key, GetKeyShiftState); Result:= Key; end; DM_REDRAW: begin DialogBox.Repaint; end; DM_SETCHECK: begin if Control is TCheckBox then begin Result:= PtrInt((Control as TCheckBox).State); (Control as TCheckBox).State:= TCheckBoxState(wParam) end; if Control is TRadioButton then begin Result := PtrInt((Control as TRadioButton).Checked); (Control as TRadioButton).Checked:= Boolean(wParam); end; end; DM_LISTSETDATA: begin if Control is TComboBox then (Control as TComboBox).Items.Objects[wParam]:= TObject(Pointer(lParam)); if Control is TListBox then (Control as TListBox).Items.Objects[wParam]:= TObject(Pointer(lParam)); end; DM_SETDLGBOUNDS: begin Rect:= PRect(wParam)^; DialogBox.Left:= Rect.Left; DialogBox.Top:= Rect.Top; DialogBox.Width:= Rect.Right - Rect.Left; DialogBox.Height:= Rect.Bottom - Rect.Top; end; DM_SETDLGDATA: begin Result:= DialogBox.Tag; DialogBox.Tag:= wParam; end; DM_SETDROPPEDDOWN: begin if Control is TComboBox then (Control as TComboBox).DroppedDown:= Boolean(wParam); end; DM_SETFOCUS: begin if Control.Visible then (Control as TWinControl).SetFocus; end; DM_SETITEMBOUNDS: begin Rect:= PRect(wParam)^; Control.Left:= Rect.Left; Control.Top:= Rect.Top; Control.Width:= Rect.Right - Rect.Left; Control.Height:= Rect.Bottom - Rect.Top; end; DM_SETITEMDATA: begin Control.Tag:= wParam; end; DM_SETMAXTEXTLENGTH: begin Result:= -1; if Control is TComboBox then begin Result:= (Control as TComboBox).MaxLength; (Control as TComboBox).MaxLength:= wParam; end; if Control is TEdit then begin Result:= (Control as TEdit).MaxLength; (Control as TEdit).MaxLength:= wParam; end; end; DM_SETTEXT: begin sText:= PAnsiChar(wParam); if Control is TButton then (Control as TButton).Caption:= sText; if Control is TComboBox then (Control as TComboBox).Text:= sText; if Control is TEdit then (Control as TEdit).Text:= sText; if Control is TGroupBox then (Control as TGroupBox).Caption:= sText; if Control is TLabel then (Control as TLabel).Caption:= sText; end; DM_SHOWDIALOG: begin if wParam = 0 then DialogBox.Hide; if wParam = 1 then DialogBox.Show; end; DM_SHOWITEM: begin Result:= PtrInt(Control.Visible); if wParam <> -1 then Control.Visible:= Boolean(wParam); end; end; end; { TDialogBox } procedure TDialogBox.ShowDialogBox; begin FResult:= (ShowModal = mrOK); end; procedure TDialogBox.DialogBoxShow(Sender: TObject); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_INITDIALOG,0,0); end; procedure TDialogBox.ButtonClick(Sender: TObject); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_CLICK,0,0); end; procedure TDialogBox.ButtonEnter(Sender: TObject); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_GOTFOCUS,0,0); end; procedure TDialogBox.ButtonExit(Sender: TObject); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_KILLFOCUS,0,0); end; procedure TDialogBox.ButtonKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_KEYDOWN,Key,0); end; procedure TDialogBox.ButtonKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_KEYUP,Key,0); end; procedure TDialogBox.ComboBoxClick(Sender: TObject); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_CLICK,PtrInt((Sender as TComboBox).ItemIndex),0); end; procedure TDialogBox.ComboBoxDblClick(Sender: TObject); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_DBLCLICK,PtrInt((Sender as TComboBox).ItemIndex),0); end; procedure TDialogBox.ComboBoxChange(Sender: TObject); begin if Assigned(fDlgProc) then begin fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_CHANGE, PtrInt((Sender as TComboBox).ItemIndex),0); end; end; procedure TDialogBox.ComboBoxEnter(Sender: TObject); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_GOTFOCUS,0,0); end; procedure TDialogBox.ComboBoxExit(Sender: TObject); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_KILLFOCUS,0,0); end; procedure TDialogBox.ComboBoxKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_KEYDOWN,Key,0); end; procedure TDialogBox.ComboBoxKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_KEYUP,Key,0); end; procedure TDialogBox.EditClick(Sender: TObject); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_CLICK,0,0); end; procedure TDialogBox.EditDblClick(Sender: TObject); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_DBLCLICK,0,0); end; procedure TDialogBox.EditChange(Sender: TObject); var sText: UTF8String; begin if Assigned(fDlgProc) then begin sText:= (Sender as TEdit).Text; fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_CHANGE, PtrInt(PAnsiChar(sText)), 0); end; end; procedure TDialogBox.EditEnter(Sender: TObject); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_GOTFOCUS,0,0); end; procedure TDialogBox.EditExit(Sender: TObject); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_KILLFOCUS,0,0); end; procedure TDialogBox.EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_KEYDOWN,Key,0); end; procedure TDialogBox.EditKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_KEYUP,Key,0); end; procedure TDialogBox.ListBoxClick(Sender: TObject); begin if Assigned(fDlgProc) then begin fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_CLICK, PtrInt((Sender as TListBox).ItemIndex),0); end; end; procedure TDialogBox.ListBoxDblClick(Sender: TObject); begin if Assigned(fDlgProc) then begin fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_DBLCLICK, PtrInt((Sender as TListBox).ItemIndex),0); end; end; procedure TDialogBox.ListBoxSelectionChange(Sender: TObject; User: boolean); begin if Assigned(fDlgProc) then begin fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_CHANGE, PtrInt((Sender as TListBox).ItemIndex),0); end; end; procedure TDialogBox.ListBoxEnter(Sender: TObject); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_GOTFOCUS,0,0); end; procedure TDialogBox.ListBoxExit(Sender: TObject); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_KILLFOCUS,0,0); end; procedure TDialogBox.ListBoxKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_KEYDOWN,Key,0); end; procedure TDialogBox.ListBoxKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Assigned(fDlgProc) then fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_KEYUP,Key,0); end; procedure TDialogBox.CheckBoxChange(Sender: TObject); begin if Assigned(fDlgProc) then begin fDlgProc(PtrUInt(Pointer(Self)), PAnsiChar((Sender as TControl).Name), DN_CHANGE, PtrInt((Sender as TCheckBox).Checked),0); end; end; initialization {.$I fdialogbox.lrs} end. doublecmd-0.5.8/src/ufilepanelselect.pas0000644000175000017500000000023111747211345017327 0ustar alexxalexxunit uFilePanelSelect; {$mode objfpc}{$H+} interface uses Classes, SysUtils; type TFilePanelSelect = (fpLeft, fpRight); implementation end. doublecmd-0.5.8/src/dmhelpmanager.lfm0000644000175000017500000000072612045446211016605 0ustar alexxalexxobject dmHelpManager: TdmHelpManager OnCreate = DataModuleCreate OldCreateOrder = False Height = 300 HorizontalOffset = 369 VerticalOffset = 200 Width = 400 object HTMLHelpDatabase: THTMLHelpDatabase BaseURL = 'file://doc/en/' AutoRegister = True KeywordPrefix = 'en/' left = 64 top = 48 end object HTMLBrowserHelpViewer: THTMLBrowserHelpViewer BrowserParams = '%s' AutoRegister = True left = 104 top = 48 end end doublecmd-0.5.8/src/flinker.pas0000644000175000017500000000636011740433676015454 0ustar alexxalexx{ Seksi Commander ---------------------------- Licence : GNU GPL v 2.0 Author : Pavel Letko (letcuv@centrum.cz) File combiner contributors: Radek Cervinka } unit fLinker; {$mode objfpc}{$H+} interface uses SysUtils, Classes, Forms, Dialogs, StdCtrls, uFileSource, uFile; type { TfrmLinker } TfrmLinker = class(TForm) lblFileName: TLabel; lstFile: TListBox; gbSaveTo: TGroupBox; edSave: TEdit; btnSave: TButton; grbxControl: TGroupBox; btnOK: TButton; btnExit: TButton; spbtnUp: TButton; spbtnDown: TButton; spbtnDel: TButton; dlgSaveAll: TSaveDialog; procedure spbtnUpClick(Sender: TObject); procedure spbtnDownClick(Sender: TObject); procedure spbtnDelClick(Sender: TObject); procedure btnSaveClick(Sender: TObject); private { Private declarations } public { Public declarations } end; function ShowLinkerFilesForm(aFileSource: IFileSource; aFiles: TFiles; TargetPath: UTF8String): Boolean; implementation {$R *.lfm} uses LCLProc, Controls, uFileProcs, uOperationsManager, uFileSourceCombineOperation; function ShowLinkerFilesForm(aFileSource: IFileSource; aFiles: TFiles; TargetPath: UTF8String): Boolean; var I: Integer; xFiles: TFiles = nil; Operation: TFileSourceCombineOperation = nil; begin with TfrmLinker.Create(Application) do begin try // Fill file list box for I:= 0 to aFiles.Count - 1 do with lstFile.Items do begin AddObject(aFiles[I].Name, aFiles[I]); end; // Use first file name without extension as target file name edSave.Text:= TargetPath + aFiles[0].NameNoExt; // Show form Result:= (ShowModal = mrOk); if Result then begin if mbForceDirectory(ExtractFileDir(edSave.Text)) then try // Fill file list with new file order xFiles:= TFiles.Create(aFiles.Path); for I:= 0 to lstFile.Count - 1 do with lstFile.Items do begin xFiles.Add(TFile(Objects[I]).Clone); end; Operation:= aFileSource.CreateCombineOperation(xFiles, edSave.Text) as TFileSourceCombineOperation; OperationsManager.AddOperation(Operation); finally FreeThenNil(xFiles); end; end; finally Free; end; end; end; procedure TfrmLinker.spbtnDownClick(Sender: TObject); var iSelected: Integer; begin with lstFile do begin if ItemIndex < 0 then Exit; if ItemIndex = Items.Count - 1 then Exit; iSelected:= ItemIndex; Items.Move(iSelected, iSelected + 1); ItemIndex:= iSelected + 1; end; end; procedure TfrmLinker.spbtnUpClick(Sender: TObject); var iSelected: Integer; begin with lstFile do begin if ItemIndex < 1 then Exit; iSelected:= ItemIndex; Items.Move(iSelected, iSelected - 1); ItemIndex:= iSelected - 1; end; end; procedure TfrmLinker.spbtnDelClick(Sender: TObject); begin with lstFile do begin if ItemIndex > -1 then Items.Delete(ItemIndex); end; end; procedure TfrmLinker.btnSaveClick(Sender: TObject); begin dlgSaveAll.InitialDir:= ExtractFileDir(edSave.Text); dlgSaveAll.FileName:= ExtractFileName(edSave.Text); if dlgSaveAll.Execute then edSave.Text:= dlgSaveAll.FileName; end; end. doublecmd-0.5.8/src/fchecksumverify.pas0000644000175000017500000000332212217255050017176 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Verify check sum dialog Copyright (C) 2009 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fCheckSumVerify; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, StdCtrls, Buttons, uOSForms; type { TfrmCheckSumVerify } TfrmCheckSumVerify = class(TAloneForm) btnClose: TBitBtn; mmCheckSumVerify: TMemo; procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); private { private declarations } public { public declarations } end; procedure ShowVerifyCheckSum(const VerifyResult: TStringList); implementation {$R *.lfm} procedure ShowVerifyCheckSum(const VerifyResult: TStringList); begin with TfrmCheckSumVerify.Create(Application) do begin mmCheckSumVerify.Lines.Assign(VerifyResult); Show; end; end; { TfrmCheckSumVerify } procedure TfrmCheckSumVerify.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin CloseAction:= caFree; end; end. doublecmd-0.5.8/src/fmodview.lrt0000644000175000017500000000137411756114400015644 0ustar alexxalexxTFRMMODVIEW.CAPTION=New Size TFRMMODVIEW.LBLQUALITY.CAPTION=Quality of compress to Jpg TFRMMODVIEW.TEQUALITY.TEXT=80 TFRMMODVIEW.RBJPG.CAPTION=JPG TFRMMODVIEW.RBBMP.CAPTION=BMP TFRMMODVIEW.RBPNG.CAPTION=PNG TFRMMODVIEW.RBICO.CAPTION=ICO TFRMMODVIEW.RBPNM.CAPTION=PNM TFRMMODVIEW.BTNPATH1.CAPTION=... TFRMMODVIEW.BTNPATH2.CAPTION=... TFRMMODVIEW.BTNPATH3.CAPTION=... TFRMMODVIEW.BTNPATH4.CAPTION=... TFRMMODVIEW.BTNPATH5.CAPTION=... TFRMMODVIEW.LBLPATH1.CAPTION=1 TFRMMODVIEW.LBLPATH2.CAPTION=2 TFRMMODVIEW.LBLPATH3.CAPTION=3 TFRMMODVIEW.LBLPATH4.CAPTION=4 TFRMMODVIEW.LBLPATH5.CAPTION=5 TFRMMODVIEW.LBLHEIGHT.CAPTION=Height : TFRMMODVIEW.LBLWIDTH.CAPTION=Width : TFRMMODVIEW.TEWIDTH.TEXT=Width TFRMMODVIEW.TEHEIGHT.TEXT=Height TFRMMODVIEW.BTNPROPORTION.CAPTION=Pr doublecmd-0.5.8/src/uformcommands.pas0000644000175000017500000003354512014201074016655 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Implements custom commands for a component Copyright (C) 2011-2012 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uFormCommands; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StringHashList, ActnList; type TCommandFuncResult = (cfrSuccess, cfrDisabled, cfrNotFound); TCommandFunc = procedure(const Params: array of string) of object; TCommandCaptionType = (cctShort, cctLong); (* The commands are 'user' functions which can be assigned to toolbar button, hotkey, menu item, executed by scripts, etc. Only published functions and procedures can by found by MethodAddress. How to set up a form to handle hotkeys: 1. Specify that the form class implements IFormCommands (class (TForm, IFormCommands)). 2. Add private FCommands: TFormCommands that will implement the interface. 3. Add property that will specify that FCommands implements the interface in place of the form. property Commands: TFormCommands read FCommands{$IF FPC_FULLVERSION >= 020501} implements IFormCommands{$ENDIF}; For FPC < 2.5.1 "implements" does not work correctly so the form must implement the interface itself. For example see fViewer. {$IF FPC_FULLVERSION < 020501} // "implements" does not work in FPC < 2.5.1 function ExecuteCommand(Command: string; Param: String=''): TCommandFuncResult; function GetCommandCaption(Command: String; CaptionType: TCommandCaptionType): String; procedure GetCommandsList(List: TStrings); {$ENDIF} 4. Make sure a default constructor Create(TheOwner: TComponent) is present which will create the FCommands on demand when it is needed to read the hotkeys when the form is not currently created. 5. Register the form and action list in HotkeyManager somewhere in constructor: const HotkeysCategory = ; HMForm := HotMan.Register(Self, HotkeysCategory); HMForm.RegisterActionList(actionList); And unregister in destructor: HotMan.UnRegister(Self); 6. Register form as commands form so that it is displayed in Options: initialization TFormCommands.RegisterCommandsForm(Tfrm..., HotkeysCategory, @rsHotkeyCategory...); *) { IFormCommands } {$interfaces corba} // If a form/object implements this interface then it can execute custom // commands with parameters. IFormCommands = interface ['{0464B1C0-BA98-4258-A286-F0F726FF66C4}'] function ExecuteCommand(Command: String; const Params: array of string): TCommandFuncResult; function GetCommandCaption(Command: String; CaptionType: TCommandCaptionType = cctShort): String; procedure GetCommandsList(List: TStrings); end; {$interfaces default} // Used to filter out commands. If this function returns True the command // is not included in the commands list. TCommandFilterFunc = function (Command: String): Boolean of object; TCommandRec = record Address: Pointer; //= 020501}, IFormCommands{$ENDIF}) private FCommands: TFormCommands; // Filters out commands. function CommandsFilter(Command: String): Boolean; procedure OnCopyOutStateChanged(Operation: TFileSourceOperation; State: TFileSourceOperationState); procedure OnCalcStatisticsStateChanged(Operation: TFileSourceOperation; State: TFileSourceOperationState); procedure OnCalcChecksumStateChanged(Operation: TFileSourceOperation; State: TFileSourceOperationState); public constructor Create(TheOwner: TComponent; ActionList: TActionList = nil); reintroduce; property Commands: TFormCommands read FCommands{$IF FPC_FULLVERSION >= 020501} implements IFormCommands{$ENDIF}; //--------------------- // The Do... functions are cm_... functions' counterparts which are to be // executed directly from the code with specific - especially non-string // - arguments (instead of calling cm_... functions, in which case // parameters would have to be converted to and from strings). // procedure DoOpenVirtualFileSystemList(Panel: TFileView); procedure DoPanelsSplitterPerPos(SplitPos: Integer); procedure DoCloseTab(Notebook: TFileViewNotebook; PageIndex: Integer); procedure DoCopySelectedFileNamesToClipboard(FileView: TFileView; FullNames: Boolean); procedure DoNewTab(Notebook: TFileViewNotebook); procedure DoRenameTab(Page: TFileViewPage); procedure DoContextMenu(Panel: TFileView; X, Y: Integer; Background: Boolean); procedure DoTransferPath(SourcePage: TFileViewPage; TargetPage: TFileViewPage; FromActivePanel: Boolean); procedure DoSortByFunctions(View: TFileView; FileFunctions: TFileFunctions); procedure DoShowMainMenu(bShow: Boolean); procedure DoShowCmdLineHistory(bNextCmdLine: Boolean); //--------------------- published //-------------------------------------------------------------------------- // All commands can be split into three groups: // 1. Commands intended for the application (cm_VisitHomePage, // cm_About, cm_Exit, ...). // // 2. Commands intended for file views (cm_QuickSearch, cm_EditPath, etc.). // Those commands are simply redirected to the currently active file view by calling: // frmMain.ActiveFrame.ExecuteCommand(CommandName, Param); // If they are supported by the given file view they are executed there. // // If in future there will be a need to pass specific parameters to the // commands, i.e. not string, they should be implemented by creating // an interface for each command, and each file view implementing those // interfaces which commands it supports. // // 3. Commands intended for file sources (cm_Copy, cm_Rename, cm_MakeDir). // The file operations will mostly work only for non-virtual file sources. // procedure cm_AddPathToCmdLine(const Params: array of string); procedure cm_AddFilenameToCmdLine(const Params: array of string); procedure cm_AddPathAndFilenameToCmdLine(const Params: array of string); procedure cm_CmdLineNext(const Params: array of string); procedure cm_CmdLinePrev(const Params: array of string); procedure cm_ContextMenu(const Params: array of string); procedure cm_CopyFullNamesToClip(const Params: array of string); procedure cm_Exchange(const Params: array of string); procedure cm_OpenArchive(const Params: array of string); procedure cm_TestArchive(const Params: array of string); procedure cm_OpenDirInNewTab(const Params: array of string); procedure cm_Open(const Params: array of string); procedure cm_ShellExecute(const Params: array of string); procedure cm_OpenVirtualFileSystemList(const Params: array of string); procedure cm_TargetEqualSource(const Params: array of string); procedure cm_LeftEqualRight(const Params: array of string); procedure cm_RightEqualLeft(const Params: array of string); procedure cm_PackFiles(const Params: array of string); procedure cm_ExtractFiles(const Params: array of string); procedure cm_QuickSearch(const Params: array of string); procedure cm_QuickFilter(const Params: array of string); procedure cm_LeftOpenDrives(const Params: array of string); procedure cm_RightOpenDrives(const Params: array of string); procedure cm_OpenBar(const Params: array of string); procedure cm_ShowButtonMenu(const Params: array of string); procedure cm_TransferLeft(const Params: array of string); procedure cm_TransferRight(const Params: array of string); procedure cm_GoToFirstFile(const Params: array of string); procedure cm_GoToLastFile(const Params: array of string); procedure cm_Minimize(const Params: array of string); procedure cm_Wipe(const Params: array of string); procedure cm_Exit(const Params: array of string); procedure cm_NewTab(const Params: array of string); procedure cm_RenameTab(const Params: array of string); procedure cm_CloseTab(const Params: array of string); procedure cm_CloseAllTabs(const Params: array of string); procedure cm_NextTab(const Params: array of string); procedure cm_PrevTab(const Params: array of string); procedure cm_SetTabOptionNormal(const Params: array of string); procedure cm_SetTabOptionPathLocked(const Params: array of string); procedure cm_SetTabOptionPathResets(const Params: array of string); procedure cm_SetTabOptionDirsInNewTab(const Params: array of string); procedure cm_Copy(const Params: array of string); procedure cm_CopyNoAsk(const Params: array of string); procedure cm_Delete(const Params: array of string); procedure cm_CheckSumCalc(const Params: array of string); procedure cm_CheckSumVerify(const Params: array of string); procedure cm_Edit(const Params: array of string); procedure cm_EditPath(const Params: array of string); procedure cm_MakeDir(const Params: array of string); procedure cm_Rename(const Params: array of string); procedure cm_RenameNoAsk(const Params: array of string); procedure cm_View(const Params: array of string); procedure cm_QuickView(const Params: array of string); procedure cm_BriefView(const Params: array of string); procedure cm_ColumnsView(const Params: array of string); procedure cm_ThumbnailsView(const Params: array of string); procedure cm_CopyNamesToClip(const Params: array of string); procedure cm_FocusCmdLine(const Params: array of string); procedure cm_FileAssoc(const Params: array of string); procedure cm_HelpIndex(const Params: array of string); procedure cm_Keyboard(const Params: array of string); procedure cm_VisitHomePage(const Params: array of string); procedure cm_About(const Params: array of string); procedure cm_ShowSysFiles(const Params: array of string); procedure cm_SwitchIgnoreList(const Params: array of string); procedure cm_Options(const Params: array of string); procedure cm_CompareContents(const Params: array of string); procedure cm_Refresh(const Params: array of string); procedure cm_ShowMainMenu(const Params: array of string); procedure cm_DirHotList(const Params: array of string); procedure cm_MarkInvert(const Params: array of string); procedure cm_MarkMarkAll(const Params: array of string); procedure cm_MarkUnmarkAll(const Params: array of string); procedure cm_MarkPlus(const Params: array of string); procedure cm_MarkMinus(const Params: array of string); procedure cm_MarkCurrentExtension(const Params: array of string); procedure cm_UnmarkCurrentExtension(const Params: array of string); procedure cm_SaveSelection(const Params: array of string); procedure cm_RestoreSelection(const Params: array of string); procedure cm_SaveSelectionToFile(const Params: array of string); procedure cm_LoadSelectionFromFile(const Params: array of string); procedure cm_LoadSelectionFromClip(const Params: array of string); procedure cm_Search(const Params: array of string); procedure cm_HardLink(const Params: array of string); procedure cm_MultiRename(const Params: array of string); procedure cm_ReverseOrder(const Params: array of string); procedure cm_SortByAttr(const Params: array of string); procedure cm_SortByDate(const Params: array of string); procedure cm_SortByExt(const Params: array of string); procedure cm_SortByName(const Params: array of string); procedure cm_SortBySize(const Params: array of string); procedure cm_SymLink(const Params: array of string); procedure cm_CopySamePanel(const Params: array of string); procedure cm_DirHistory(const Params: array of string); procedure cm_ViewHistory(const Params: array of string); procedure cm_ViewHistoryPrev(const Params: array of string); procedure cm_ViewHistoryNext(const Params: array of string); procedure cm_EditNew(const Params: array of string); procedure cm_RenameOnly(const Params: array of string); procedure cm_RunTerm(const Params: array of string); procedure cm_ShowCmdLineHistory(const Params: array of string); procedure cm_CalculateSpace(const Params: array of string); procedure cm_CountDirContent(const Params: array of string); procedure cm_SetFileProperties(const Params: array of string); procedure cm_FileProperties(const Params: array of string); procedure cm_FileLinker(const Params: array of string); procedure cm_FileSpliter(const Params: array of string); procedure cm_PanelsSplitterPerPos(const Params: array of string); procedure cm_EditComment(const Params: array of string); procedure cm_CopyToClipboard(const Params: array of string); procedure cm_CutToClipboard(const Params: array of string); procedure cm_PasteFromClipboard(const Params: array of string); procedure cm_ChangeDirToRoot(const Params: array of string); procedure cm_ChangeDirToParent(const Params: array of string); procedure cm_ChangeDir(const Params: array of string); procedure cm_ClearLogWindow(const Params: array of string); procedure cm_ClearLogFile(const Params: array of string); procedure cm_NetworkConnect(const Params: array of string); procedure cm_NetworkDisconnect(const Params: array of string); procedure cm_HorizontalFilePanels(const Params: array of string); procedure cm_OperationsViewer(const Params: array of string); procedure cm_CompareDirectories(const Params: array of string); // Internal commands procedure cm_ExecuteToolbarItem(const Params: array of string); end; implementation uses Forms, Controls, Dialogs, Clipbrd, strutils, LCLProc, HelpIntfs, StringHashList, dmHelpManager, typinfo, fMain, fPackDlg, fMkDir, fFileAssoc, fExtractDlg, fAbout, fOptions, fDiffer, fFindDlg, fSymLink, fHardLink, fMultiRename, fLinker, fSplitter, fDescrEdit, fCheckSumVerify, fCheckSumCalc, fSetFileProperties, uGlobs, uLng, uLog, uShowMsg, uOSForms, uOSUtils, uDCUtils, uBriefFileView, uShowForm, uShellExecute, uClipboard, uHash, uDisplayFile, uColumnsFileView, uFilePanelSelect, uFile, uFileSystemFileSource, uQuickViewPanel, uOperationsManager, uFileSourceOperationTypes, uWfxPluginFileSource, uFileSystemDeleteOperation, uFileSourceExecuteOperation, uSearchResultFileSource, uFileSourceOperationMessageBoxesUI, uFileSourceCalcChecksumOperation, uFileSourceCalcStatisticsOperation, uFileSource, uFileSourceProperty, uVfsFileSource, uFileSourceUtil, uArchiveFileSourceUtil, uThumbFileView, uTempFileSystemFileSource, uFileProperty, uFileSourceSetFilePropertyOperation, uFileSorting, uShellContextMenu, uTrash, uFileSystemCopyOperation, fViewOperations, uVfsModule, uMultiListFileSource, uExceptions, DCOSUtils, DCStrUtils, DCBasicTypes, uFileSourceCopyOperation {$IFDEF COLUMNSFILEVIEW_VTV} , uColumnsFileViewVtv {$ENDIF} ; procedure ReadCopyRenameParams( const Params: array of string; var Confirmation: Boolean; out HasQueueId: Boolean; out QueueIdentifier: TOperationsManagerQueueIdentifier); var Param, sQueueId: String; BoolValue: Boolean; iQueueId: Integer; begin HasQueueId := False; for Param in Params do begin if GetParamBoolValue(Param, 'confirmation', BoolValue) then Confirmation := BoolValue else if GetParamValue(Param, 'queueid', sQueueId) then begin HasQueueId := TryStrToInt(sQueueId, iQueueId); if HasQueueId then QueueIdentifier := iQueueId; end; end; end; { TMainCommands } constructor TMainCommands.Create(TheOwner: TComponent; ActionList: TActionList = nil); begin inherited Create(TheOwner); FCommands := TFormCommands.Create(Self, ActionList); FCommands.FilterFunc := @CommandsFilter; end; function TMainCommands.CommandsFilter(Command: String): Boolean; begin Result := Command = 'cm_ExecuteToolbarItem'; end; //------------------------------------------------------ procedure TMainCommands.OnCopyOutStateChanged(Operation: TFileSourceOperation; State: TFileSourceOperationState); var I: Integer; aFile: TFile; sViewCmd: String; aFileList: TStringList; aFileSource: ITempFileSystemFileSource; aCopyOutOperation: TFileSourceCopyOutOperation; begin if (State = fsosStopped) and (Operation.Result = fsorFinished) then begin aFileList := TStringList.Create; try aCopyOutOperation := Operation as TFileSourceCopyOutOperation; aFileSource := aCopyOutOperation.TargetFileSource as ITempFileSystemFileSource; ChangeFileListRoot(aFileSource.FileSystemRoot, aCopyOutOperation.SourceFiles); try for I := 0 to aCopyOutOperation.SourceFiles.Count - 1 do begin aFile := aCopyOutOperation.SourceFiles[I]; if not (aFile.IsDirectory or aFile.IsLinkToDirectory) then begin // Try to find 'view' command in internal associations sViewCmd:= gExts.GetExtActionCmd(aFile, 'view'); if Length(sViewCmd) = 0 then aFileList.Add(aFile.FullPath) else begin sViewCmd := PrepareParameter(sViewCmd, aFile); ProcessExtCommand(sViewCmd, aCopyOutOperation.SourceFiles.Path); // TODO: // If TempFileSource is used, create a wait thread that will // keep the TempFileSource alive until the command is finished. end; end; // if selected end; // for // if aFileList has files then view it if aFileList.Count > 0 then ShowViewerByGlobList(aFileList, aFileSource); except on e: EInvalidCommandLine do MessageDlg(rsToolErrorOpeningViewer, rsMsgInvalidCommandLine + ' (' + rsToolViewer + '):' + LineEnding + e.Message, mtError, [mbOK], 0); end; finally FreeAndNil(aFileList); end; end; end; procedure TMainCommands.OnCalcStatisticsStateChanged(Operation: TFileSourceOperation; State: TFileSourceOperationState); var CalcStatisticsOperation: TFileSourceCalcStatisticsOperation; CalcStatisticsOperationStatistics: TFileSourceCalcStatisticsOperationStatistics; begin if (State = fsosStopped) and (Operation.Result = fsorFinished) then begin CalcStatisticsOperation := Operation as TFileSourceCalcStatisticsOperation; CalcStatisticsOperationStatistics := CalcStatisticsOperation.RetrieveStatistics; with CalcStatisticsOperationStatistics do begin msgOK(Format(rsSpaceMsg, [Files, Directories, cnvFormatFileSize(Size), Numb2USA(IntToStr(Size))])); end; end; end; procedure TMainCommands.OnCalcChecksumStateChanged(Operation: TFileSourceOperation; State: TFileSourceOperationState); var CalcChecksumOperation: TFileSourceCalcChecksumOperation; begin if (State = fsosStopped) and (Operation.Result = fsorFinished) then begin CalcChecksumOperation := Operation as TFileSourceCalcChecksumOperation; if CalcChecksumOperation.Mode = checksum_verify then ShowVerifyCheckSum(CalcChecksumOperation.Result); end; end; //------------------------------------------------------ procedure TMainCommands.DoCloseTab(Notebook: TFileViewNotebook; PageIndex: Integer); begin with frmMain do begin RemovePage(Notebook, PageIndex); ActiveFrame.SetFocus; end; end; procedure TMainCommands.DoShowCmdLineHistory(bNextCmdLine: Boolean); begin with frmMain do begin if edtCommand.Visible then begin if not (gCmdLine and frmMain.IsCommandLineVisible) then pnlCommand.Show; edtCommand.SetFocus; if bNextCmdLine then begin if edtCommand.ItemIndex > 0 then edtCommand.ItemIndex := edtCommand.ItemIndex - 1; end else begin if edtCommand.ItemIndex < edtCommand.Items.Count - 1 then edtCommand.ItemIndex := edtCommand.ItemIndex + 1; end; end; end; end; procedure TMainCommands.DoCopySelectedFileNamesToClipboard(FileView: TFileView; FullNames: Boolean); var I: Integer; sl: TStringList = nil; SelectedFiles: TFiles = nil; PathToAdd: String; begin SelectedFiles := FileView.CloneSelectedOrActiveFiles; try if SelectedFiles.Count > 0 then begin sl := TStringList.Create; for I := 0 to SelectedFiles.Count - 1 do begin if FullNames then begin // Workaround for not fully implemented TMultiListFileSource. if not FileView.FileSource.IsClass(TMultiListFileSource) then PathToAdd := FileView.CurrentAddress else PathToAdd := ''; PathToAdd := PathToAdd + SelectedFiles[I].Path; end else PathToAdd := ''; sl.Add(PathToAdd + SelectedFiles[I].Name); end; Clipboard.Clear; // prevent multiple formats in Clipboard (specially synedit) Clipboard.AsText:= TrimRightLineEnding(sl.Text, sl.TextLineBreakStyle); end; finally if Assigned(sl) then FreeAndNil(sl); if Assigned(SelectedFiles) then FreeAndNil(SelectedFiles); end; end; procedure TMainCommands.DoNewTab(Notebook: TFileViewNotebook); var NewPage: TFileViewPage; begin NewPage := Notebook.NewPage(Notebook.ActiveView); NewPage.MakeActive; end; procedure TMainCommands.DoRenameTab(Page: TFileViewPage); var sCaption: UTF8String; begin sCaption := Page.CurrentTitle; if InputQuery(rsMsgTabRenameCaption, rsMsgTabRenamePrompt, sCaption) then Page.PermanentTitle := sCaption; end; procedure TMainCommands.DoOpenVirtualFileSystemList(Panel: TFileView); var FileSource: IFileSource; begin FileSource:= TVfsFileSource.Create(gWFXPlugins); if Assigned(FileSource) then Panel.AddFileSource(FileSource, FileSource.GetRootDir); end; procedure TMainCommands.DoPanelsSplitterPerPos(SplitPos: Integer); begin with frmMain do begin if (SplitPos >= 0) and (SplitPos <= 100) then begin // Calculate panel width if not gHorizontalFilePanels then pnlLeft.Width:= (pnlNoteBooks.Width - MainSplitter.Width) * SplitPos div 100 else pnlLeft.Height:= (pnlNoteBooks.Height - MainSplitter.Height) * SplitPos div 100; // Update splitter position MainSplitterPos:= SplitPos; end; end; end; procedure TMainCommands.DoContextMenu(Panel: TFileView; X, Y: Integer; Background: Boolean); var aFile: TFile = nil; aFiles: TFiles = nil; sPath, sName: UTF8String; begin with frmMain do begin if not (fspDirectAccess in Panel.FileSource.Properties) then begin if not Background then pmContextMenu.PopUp(X, Y); Exit; end; if Background then begin sName:= ExcludeTrailingPathDelimiter(Panel.CurrentPath); sPath:= ExtractFilePath(sName); aFiles:= TFiles.Create(sPath); aFile:= Panel.FileSource.CreateFileObject(sPath); aFile.Attributes:= faFolder; aFile.Name:= ExtractFileName(sName); aFiles.Add(aFile); end else begin aFiles:= Panel.CloneSelectedOrActiveFiles; end; if Assigned(aFiles) then try if aFiles.Count > 0 then try ShowContextMenu(frmMain, aFiles, X, Y, Background, nil); except on e: EContextMenuException do ShowException(e); end; finally if Assigned(aFiles) then FreeAndNil(aFiles); end; end; end; procedure TMainCommands.DoTransferPath(SourcePage: TFileViewPage; TargetPage: TFileViewPage; FromActivePanel: Boolean); var aFile: TFile; NewPath: String; begin if FromActivePanel then begin aFile := SourcePage.FileView.CloneActiveFile; if Assigned(aFile) then try if (fspLinksToLocalFiles in SourcePage.FileView.FileSource.GetProperties) and (SourcePage.FileView.FileSource.GetLocalName(aFile)) then begin if aFile.IsDirectory then ChooseFileSource(TargetPage.FileView, aFile.FullPath) else if not ChooseFileSource(TargetPage.FileView, aFile) then begin ChooseFileSource(TargetPage.FileView, aFile.Path); TargetPage.FileView.SetActiveFile(aFile.Name); end; end else if aFile.IsDirectory then begin if aFile.Name = '..' then begin NewPath := GetParentDir(SourcePage.FileView.CurrentPath) end else begin // Change to a subdirectory. NewPath := aFile.FullPath; end; if NewPath <> EmptyStr then TargetPage.FileView.AddFileSource(SourcePage.FileView.FileSource, NewPath); end else begin // Change file source, if the file under cursor can be opened as another file source. try if not ChooseFileSource(TargetPage.FileView, aFile) then TargetPage.FileView.AddFileSource(SourcePage.FileView.FileSource, SourcePage.FileView.CurrentPath); except on e: EFileSourceException do MessageDlg('Error', e.Message, mtError, [mbOK], 0); end; end; finally FreeAndNil(aFile); end; end else begin TargetPage.FileView.AddFileSource(SourcePage.FileView.FileSource, SourcePage.FileView.CurrentPath); end; end; procedure TMainCommands.DoSortByFunctions(View: TFileView; FileFunctions: TFileFunctions); var NewSorting: TFileSortings = nil; CurrentSorting: TFileSortings; SortDirection: TSortDirection = sdNone; i: Integer; begin if Length(FileFunctions) = 0 then Exit; CurrentSorting := View.Sorting; // Check if there is already sorting by one of the functions. // If it is then reverse direction of sorting. for i := 0 to Length(FileFunctions) - 1 do begin SortDirection := GetSortDirection(CurrentSorting, FileFunctions[i]); if SortDirection <> sdNone then begin SortDirection := ReverseSortDirection(SortDirection); Break; end; end; if SortDirection = sdNone then SortDirection := sdAscending; SetLength(NewSorting, 1); SetLength(NewSorting[0].SortFunctions, 1); NewSorting[0].SortFunctions[0] := FileFunctions[0]; // Sort by single function. NewSorting[0].SortDirection := SortDirection; View.Sorting := NewSorting; end; procedure TMainCommands.DoShowMainMenu(bShow: Boolean); begin gMainMenu := bShow; with frmMain do begin if bShow then begin Menu := mnuMain; end else if Assigned(Menu) then begin Menu := nil; {$IFDEF MSWINDOWS} // Workaround: on Windows need to recreate window to properly recalculate children sizes. RecreateWnd(frmMain); {$ENDIF} end; end; end; //------------------------------------------------------ //Published methods //------------------------------------------------------ procedure TMainCommands.cm_AddPathToCmdLine(const Params: array of string); var OldPosition: Integer; AddedString: String; begin with frmMain do begin OldPosition := edtCommand.SelStart; AddedString := QuoteStr(ActiveFrame.CurrentPath); edtCommand.Text := edtCommand.Text + AddedString; edtCommand.SelStart := OldPosition + Length(AddedString); end; end; procedure TMainCommands.cm_AddFilenameToCmdLine(const Params: array of string); var AddedString: String; OldPosition: Integer; aFile: TFile; begin with frmMain do begin aFile := ActiveFrame.CloneActiveFile; if Assigned(aFile) then try OldPosition := edtCommand.SelStart; AddedString := QuoteStr(aFile.Name) + ' '; edtCommand.Text := edtCommand.Text + AddedString; edtCommand.SelStart := OldPosition + Length(AddedString); finally FreeAndNil(aFile); end; end; end; procedure TMainCommands.cm_AddPathAndFilenameToCmdLine(const Params: array of string); var AddedString: String; OldPosition: Integer; aFile: TFile; begin with frmMain do begin aFile := ActiveFrame.CloneActiveFile; if Assigned(aFile) then try if aFile.Name = '..' then AddedString := QuoteStr(ActiveFrame.CurrentPath) + ' ' else AddedString := QuoteStr(aFile.FullPath) + ' '; OldPosition := edtCommand.SelStart; edtCommand.Text := edtCommand.Text + AddedString; edtCommand.SelStart := OldPosition + Length(AddedString); finally FreeAndNil(aFile); end; end; end; procedure TMainCommands.cm_ContextMenu(const Params: array of string); begin // Let file view handle displaying context menu at appropriate position. frmMain.ActiveFrame.ExecuteCommand('cm_ContextMenu', []); end; procedure TMainCommands.cm_CopyFullNamesToClip(const Params: array of string); begin DoCopySelectedFileNamesToClipboard(frmMain.ActiveFrame, True); end; procedure TMainCommands.cm_CopyNamesToClip(const Params: array of string); begin DoCopySelectedFileNamesToClipboard(frmMain.ActiveFrame, False); end; //------------------------------------------------------ procedure TMainCommands.cm_Exchange(const Params: array of string); var sDir: String; begin sDir:= FrmMain.ActiveFrame.CurrentPath; FrmMain.ActiveFrame.CurrentPath:= FrmMain.NotActiveFrame.CurrentPath; FrmMain.NotActiveFrame.CurrentPath:= sDir; end; procedure TMainCommands.cm_ExecuteToolbarItem(const Params: array of string); var ToolItemID: String; begin if GetParamValue(Params, 'ToolItemID', ToolItemID) then frmMain.MainToolBar.ClickItem(ToolItemID); end; procedure TMainCommands.cm_OpenDirInNewTab(const Params: array of string); procedure OpenTab(const aFullPath: string); var NewPage: TFileViewPage; begin NewPage := FrmMain.ActiveNotebook.NewPage(FrmMain.ActiveFrame); // Workaround for Search Result File Source if NewPage.FileView.FileSource is TSearchResultFileSource then SetFileSystemPath(NewPage.FileView, aFullPath) else NewPage.FileView.CurrentPath := aFullPath; if tb_open_new_in_foreground in gDirTabOptions then NewPage.MakeActive; end; var aFile: TFile; begin aFile := FrmMain.ActiveFrame.CloneActiveFile; if Assigned(aFile) then try if aFile.IsNameValid and (aFile.IsDirectory or aFile.IsLinkToDirectory) then OpenTab(aFile.FullPath) else OpenTab(FrmMain.ActiveFrame.CurrentPath); finally FreeAndNil(aFile); end else OpenTab(FrmMain.ActiveFrame.CurrentPath); end; procedure TMainCommands.cm_TargetEqualSource(const Params: array of string); begin with frmMain do begin NotActiveNotebook.ActivePage.FileView := nil; ActiveFrame.Clone(NotActiveNotebook.ActivePage); end; end; procedure TMainCommands.cm_LeftEqualRight(const Params: array of string); begin with frmMain do begin LeftTabs.ActivePage.FileView := nil; FrameRight.Clone(LeftTabs.ActivePage); // Destroying active view may have caused losing focus. Restore it if needed. if SelectedPanel = fpLeft then FrameLeft.SetFocus; end; end; procedure TMainCommands.cm_RightEqualLeft(const Params: array of string); begin with frmMain do begin RightTabs.ActivePage.FileView := nil; FrameLeft.Clone(RightTabs.ActivePage); // Destroying active view may have caused losing focus. Restore it if needed. if SelectedPanel = fpRight then FrameRight.SetFocus; end; end; procedure TMainCommands.cm_OpenArchive(const Params: array of string); var aFile: TFile; begin with frmMain.ActiveFrame do begin aFile := CloneActiveFile; if Assigned(aFile) then try if aFile.IsNameValid then begin if aFile.IsDirectory or aFile.IsLinkToDirectory then ChangePathToChild(aFile) else ChooseArchive(frmMain.ActiveFrame, aFile, True); end; finally FreeAndNil(aFile); end; end; end; procedure TMainCommands.cm_TestArchive(const Params: array of string); var SelectedFiles: TFiles; begin with frmMain do begin SelectedFiles := ActiveFrame.CloneSelectedOrActiveFiles; try TestArchive(ActiveFrame, SelectedFiles); finally if Assigned(SelectedFiles) then FreeAndNil(SelectedFiles); end; end; end; procedure TMainCommands.cm_Open(const Params: array of string); begin frmMain.ActiveFrame.OpenActiveFile; end; procedure TMainCommands.cm_ShellExecute(const Params: array of string); var aFile: TFile; begin if Length(Params) > 0 then with frmMain do ShellExecute(PrepareParameter(Params[0], FrameLeft, FrameRight, ActiveFrame, [])) else with frmMain.ActiveFrame do begin aFile := CloneActiveFile; if Assigned(aFile) then try if aFile.IsNameValid then begin ShellExecute(aFile.FullPath); end; finally FreeAndNil(aFile); end; end; end; procedure TMainCommands.cm_OpenVirtualFileSystemList(const Params: array of string); begin DoOpenVirtualFileSystemList(frmMain.ActiveFrame); end; //------------------------------------------------------ (* Pack files in archive by creating a new archive *) procedure TMainCommands.cm_PackFiles(const Params: array of string); var SelectedFiles: TFiles; begin with frmMain do begin SelectedFiles := ActiveFrame.CloneSelectedOrActiveFiles; try if SelectedFiles.Count > 0 then ShowPackDlg(ActiveFrame.FileSource, nil, // No specific target (create new) SelectedFiles, NotActiveFrame.CurrentPath, PathDelim { Copy to root of archive } {NotActiveFrame.FileSource.GetRootString} ) else msgWarning(rsMsgNoFilesSelected); finally FreeAndNil(SelectedFiles); end; end; end; // This command is needed for extracting whole archive by Alt+F9 (without opening it). procedure TMainCommands.cm_ExtractFiles(const Params: array of string); var SelectedFiles: TFiles; begin with frmMain do begin SelectedFiles := ActiveFrame.CloneSelectedOrActiveFiles; if Assigned(SelectedFiles) then try if SelectedFiles.Count > 0 then ShowExtractDlg(ActiveFrame.FileSource, SelectedFiles, NotActiveFrame.FileSource, NotActiveFrame.CurrentPath) else msgWarning(rsMsgNoFilesSelected); finally if Assigned(SelectedFiles) then FreeAndNil(SelectedFiles); end; end; end; procedure TMainCommands.cm_QuickSearch(const Params: array of string); begin FrmMain.ActiveFrame.ExecuteCommand('cm_QuickSearch', Params); end; procedure TMainCommands.cm_QuickFilter(const Params: array of string); begin FrmMain.ActiveFrame.ExecuteCommand('cm_QuickFilter', Params); end; procedure TMainCommands.cm_LeftOpenDrives(const Params: array of string); begin frmMain.ShowDrivesList(fpLeft); end; procedure TMainCommands.cm_RightOpenDrives(const Params: array of string); begin frmMain.ShowDrivesList(fpRight); end; procedure TMainCommands.cm_OpenBar(const Params: array of string); begin // Deprecated. end; procedure TMainCommands.cm_ShowButtonMenu(const Params: array of string); begin // Deprecated. end; procedure TMainCommands.cm_TransferLeft(const Params: array of string); begin DoTransferPath(frmMain.RightTabs.ActivePage, frmMain.LeftTabs.ActivePage, frmMain.SelectedPanel = fpRight); end; procedure TMainCommands.cm_TransferRight(const Params: array of string); begin DoTransferPath(frmMain.LeftTabs.ActivePage, frmMain.RightTabs.ActivePage, frmMain.SelectedPanel = fpLeft); end; procedure TMainCommands.cm_GoToFirstFile(const Params: array of string); begin frmMain.ActiveFrame.ExecuteCommand('cm_GoToFirstFile', []); end; procedure TMainCommands.cm_GoToLastFile(const Params: array of string); begin frmMain.ActiveFrame.ExecuteCommand('cm_GoToLastFile', []); end; procedure TMainCommands.cm_Minimize(const Params: array of string); begin FrmMain.MinimizeWindow; end; procedure TMainCommands.cm_Wipe(const Params: array of string); var theFilesToWipe: TFiles; Operation: TFileSourceOperation; begin with frmMain.ActiveFrame do begin if not (fsoWipe in FileSource.GetOperationsTypes) then begin msgWarning(rsMsgErrNotSupported); Exit; end; // ------------------------------------------------------ theFilesToWipe := CloneSelectedOrActiveFiles; // free at Thread end by thread if Assigned(theFilesToWipe) then try if theFilesToWipe.Count = 0 then Exit; if not msgYesNo(frmMain.GetFileDlgStr(rsMsgWipeSel, rsMsgWipeFlDr, theFilesToWipe)) then Exit; Operation := FileSource.CreateWipeOperation(theFilesToWipe); if Assigned(Operation) then begin // Start operation. OperationsManager.AddOperation(Operation); end else begin msgWarning(rsMsgNotImplemented); end; finally if Assigned(theFilesToWipe) then FreeAndNil(theFilesToWipe); end; end; end; procedure TMainCommands.cm_Exit(const Params: array of string); begin frmMain.Close; // application.Terminate not save settings. end; procedure TMainCommands.cm_NewTab(const Params: array of string); begin DoNewTab(frmMain.ActiveNotebook); end; procedure TMainCommands.cm_RenameTab(const Params: array of string); begin DoRenameTab(frmMain.ActiveNotebook.ActivePage); end; procedure TMainCommands.cm_CloseTab(const Params: array of string); begin with frmMain do DoCloseTab(ActiveNotebook, ActiveNotebook.PageIndex); end; procedure TMainCommands.cm_CloseAllTabs(const Params: array of string); var I: Integer; ANotebook: TFileViewNotebook; Param: String; begin with frmMain do begin if (tb_confirm_close_all in gDirTabOptions) then if not msgYesNo(rsMsgCloseAllInActiveTabs) then Exit; Param := GetDefaultParam(Params); if Param = 'LeftTabs' then ANotebook := LeftTabs else if Param = 'RightTabs' then ANotebook := RightTabs else ANotebook := ActiveNotebook; for I := ANotebook.PageCount - 1 downto 0 do if I <> ANotebook.PageIndex then case RemovePage(ANotebook, I, False) of 1: Continue; // skip tab 2: Break; // cancel operation end; ActiveFrame.SetFocus; end; end; procedure TMainCommands.cm_NextTab(const Params: array of string); begin frmMain.ActiveNotebook.ActivateNextTab; end; procedure TMainCommands.cm_PrevTab(const Params: array of string); begin frmMain.ActiveNotebook.ActivatePrevTab; end; procedure TMainCommands.cm_SetTabOptionNormal(const Params: array of string); begin with frmMain.ActiveNotebook.ActivePage do LockState := tlsNormal; end; procedure TMainCommands.cm_SetTabOptionPathLocked(const Params: array of string); begin with frmMain.ActiveNotebook.ActivePage do LockState := tlsPathLocked; end; procedure TMainCommands.cm_SetTabOptionPathResets(const Params: array of string); begin with frmMain.ActiveNotebook.ActivePage do LockState := tlsPathResets; end; procedure TMainCommands.cm_SetTabOptionDirsInNewTab(const Params: array of string); begin with frmMain.ActiveNotebook.ActivePage do LockState := tlsDirsInNewTab; end; //------------------------------------------------------ procedure TMainCommands.cm_View(const Params: array of string); var sl: TStringList = nil; i, n: Integer; sViewCmd: String; ActiveFile: TFile = nil; AllFiles: TFiles = nil; SelectedFiles: TFiles = nil; TempFiles: TFiles = nil; aFile: TFile; TempFileSource: ITempFileSystemFileSource = nil; Operation: TFileSourceOperation; aFileSource: IFileSource; begin with frmMain do try SelectedFiles := ActiveFrame.CloneSelectedOrActiveFiles; ActiveFile := ActiveFrame.CloneActiveFile; // Enter directories using View command. if Assigned(ActiveFile) and (ActiveFile.IsDirectory or ActiveFile.IsLinkToDirectory) then begin ActiveFrame.ExecuteCommand('cm_Open', []); Exit; end; if SelectedFiles.Count = 0 then begin msgWarning(rsMsgNoFilesSelected); Exit; end; // Default to using the file source directly. aFileSource := ActiveFrame.FileSource; // If files are links to local files if (fspLinksToLocalFiles in ActiveFrame.FileSource.Properties) then begin for I := 0 to SelectedFiles.Count - 1 do begin aFile := SelectedFiles[I]; ActiveFrame.FileSource.GetLocalName(aFile); end; end // If files not directly accessible copy them to temp file source. else if not (fspDirectAccess in ActiveFrame.FileSource.Properties) then begin if not (fsoCopyOut in ActiveFrame.FileSource.GetOperationsTypes) then begin msgWarning(rsMsgErrNotSupported); Exit; end; TempFiles := SelectedFiles.Clone; TempFileSource := TTempFileSystemFileSource.GetFileSource; Operation := ActiveFrame.FileSource.CreateCopyOutOperation( TempFileSource, TempFiles, TempFileSource.FileSystemRoot); if Assigned(Operation) then begin Operation.AddStateChangedListener([fsosStopped], @OnCopyOutStateChanged); OperationsManager.AddOperation(Operation); end else begin msgWarning(rsMsgErrNotSupported); end; Exit; end; try sl := TStringList.Create; for i := 0 to SelectedFiles.Count - 1 do begin aFile := SelectedFiles[i]; if not (aFile.IsDirectory or aFile.IsLinkToDirectory) then begin // Try to find 'view' command in internal associations sViewCmd:= gExts.GetExtActionCmd(aFile, 'view'); if Length(sViewCmd) = 0 then sl.Add(aFile.FullPath) else begin sViewCmd := PrepareParameter(sViewCmd, aFile); ProcessExtCommand(sViewCmd, ActiveFrame.CurrentPath); end; end; // if selected end; // for // If only one file was selected then add all files in panel to the list. // Works only for directly accessible files and only when using internal viewer. if (sl.Count=1) and (not gExternalTools[etViewer].Enabled) and ([fspDirectAccess, fspLinksToLocalFiles] * ActiveFrame.FileSource.Properties <> []) then begin AllFiles := ActiveFrame.CloneFiles; if (fspLinksToLocalFiles in ActiveFrame.FileSource.Properties) then begin for I := 0 to AllFiles.Count - 1 do begin aFile := AllFiles[I]; ActiveFrame.FileSource.GetLocalName(aFile); end; end; n:=0; for i := 0 to AllFiles.Count - 1 do begin aFile := AllFiles[i]; if not (aFile.IsDirectory or aFile.IsLinkToDirectory) then begin if n>0 then sl.Add(aFile.FullPath); if aFile.Name = ActiveFile.Name then n:=i; end; end; for i:=0 to n-1 do begin aFile := AllFiles[i]; if not (aFile.IsDirectory or aFile.IsLinkToDirectory) then sl.Add(aFile.FullPath); end; end; // if sl has files then view it if sl.Count > 0 then ShowViewerByGlobList(sl, aFileSource); except on e: EInvalidCommandLine do MessageDlg(rsToolErrorOpeningViewer, rsMsgInvalidCommandLine + ' (' + rsToolViewer + '):' + LineEnding + e.Message, mtError, [mbOK], 0); end; finally if Assigned(sl) then FreeAndNil(sl); if Assigned(AllFiles) then FreeAndNil(AllFiles); if Assigned(SelectedFiles) then FreeAndNil(SelectedFiles); if Assigned(TempFiles) then FreeAndNil(TempFiles); if Assigned(ActiveFile) then FreeAndNil(ActiveFile); end; end; procedure TMainCommands.cm_QuickView(const Params: array of string); var Param: String; begin with frmMain do begin Param := GetDefaultParam(Params); if Assigned(QuickViewPanel) then begin QuickViewClose; end else if (param <> 'Close') then begin QuickViewShow(NotActiveNotebook.ActivePage, ActiveFrame); end; end; end; procedure TMainCommands.cm_BriefView(const Params: array of string); var aFileView: TFileView; begin with frmMain do begin aFileView:= TBriefFileView.Create(ActiveNotebook.ActivePage, ActiveFrame); ActiveNotebook.ActivePage.FileView:= aFileView; ActiveFrame.SetFocus; end; end; procedure TMainCommands.cm_ColumnsView(const Params: array of string); var aFileView: TFileView; begin with frmMain do begin {$IFDEF COLUMNSFILEVIEW_VTV} aFileView:= TColumnsFileViewVTV.Create(ActiveNotebook.ActivePage, ActiveFrame); {$ELSE} aFileView:= TColumnsFileView.Create(ActiveNotebook.ActivePage, ActiveFrame); {$ENDIF} ActiveNotebook.ActivePage.FileView:= aFileView; ActiveFrame.SetFocus; end; end; procedure TMainCommands.cm_ThumbnailsView(const Params: array of string); var aFileView: TFileView; begin with frmMain do begin aFileView:= TThumbFileView.Create(ActiveNotebook.ActivePage, ActiveFrame); ActiveNotebook.ActivePage.FileView:= aFileView; ActiveFrame.SetFocus; end; end; procedure TMainCommands.cm_Edit(const Params: array of string); var i: Integer; sEditCmd: String; aFile: TFile; SelectedFiles: TFiles = nil; begin with frmMain do try // If files are links to local files if (fspLinksToLocalFiles in ActiveFrame.FileSource.Properties) then begin SelectedFiles := ActiveFrame.CloneSelectedOrActiveFiles; for I := 0 to SelectedFiles.Count - 1 do begin aFile := SelectedFiles[I]; ActiveFrame.FileSource.GetLocalName(aFile); end; end // If files not directly accessible copy them to temp file source. else if not (fspDirectAccess in ActiveFrame.FileSource.Properties) then begin msgWarning(rsMsgNotImplemented); Exit; end else begin SelectedFiles := ActiveFrame.CloneSelectedOrActiveFiles; end; try for i := 0 to SelectedFiles.Count - 1 do begin aFile := SelectedFiles[i]; // For now we only process one file. if not (aFile.IsDirectory or aFile.IsLinkToDirectory) then begin //now test if exists View command in doublecmd.ext :) sEditCmd:= gExts.GetExtActionCmd(aFile, 'edit'); if (sEditCmd <> '') then begin sEditCmd := PrepareParameter(sEditCmd, aFile); ProcessExtCommand(sEditCmd, aFile.Path); end else begin ShowEditorByGlob(aFile.FullPath); end; Break; end; end; except on e: EInvalidCommandLine do MessageDlg(rsToolErrorOpeningEditor, rsMsgInvalidCommandLine + ' (' + rsToolEditor + '):' + LineEnding + e.Message, mtError, [mbOK], 0); end; finally if Assigned(SelectedFiles) then FreeAndNil(SelectedFiles); end; end; procedure TMainCommands.cm_EditPath(const Params: array of string); begin frmMain.ActiveFrame.ExecuteCommand('cm_EditPath', Params); end; // Parameters: // confirmation= // 1/true - show confirmation // 0/false - don't show confirmation // queueid= - by default put to this queue // procedure TMainCommands.cm_Copy(const Params: array of string); var bConfirmation, HasQueueId: Boolean; QueueIdentifier: TOperationsManagerQueueIdentifier; begin bConfirmation := focCopy in gFileOperationsConfirmations; ReadCopyRenameParams(Params, bConfirmation, HasQueueId, QueueIdentifier); if HasQueueId then frmMain.CopyFiles(frmMain.NotActiveFrame.CurrentPath, bConfirmation, QueueIdentifier) else frmMain.CopyFiles(frmMain.NotActiveFrame.CurrentPath, bConfirmation); end; procedure TMainCommands.cm_CopyNoAsk(const Params: array of string); begin frmMain.CopyFiles(frmMain.NotActiveFrame.CurrentPath, False); end; // Parameters: // confirmation= // 1/true - show confirmation // 0/false - don't show confirmation // queueid= - by default put to this queue // procedure TMainCommands.cm_Rename(const Params: array of string); var bConfirmation, HasQueueId: Boolean; QueueIdentifier: TOperationsManagerQueueIdentifier; begin bConfirmation := focMove in gFileOperationsConfirmations; ReadCopyRenameParams(Params, bConfirmation, HasQueueId, QueueIdentifier); if HasQueueId then frmMain.MoveFiles(frmMain.NotActiveFrame.CurrentPath, bConfirmation, QueueIdentifier) else frmMain.MoveFiles(frmMain.NotActiveFrame.CurrentPath, bConfirmation); end; procedure TMainCommands.cm_RenameNoAsk(const Params: array of string); begin frmMain.MoveFiles(frmMain.NotActiveFrame.CurrentPath, False); end; procedure TMainCommands.cm_MakeDir(const Params: array of string); var sPath: UTF8String; ActiveFile: TFile = nil; Operation: TFileSourceOperation = nil; UI: TFileSourceOperationMessageBoxesUI = nil; begin with frmMain do try if not (fsoCreateDirectory in ActiveFrame.FileSource.GetOperationsTypes) then begin msgWarning(rsMsgErrNotSupported); Exit; end; ActiveFile := ActiveFrame.CloneActiveFile; if Assigned(ActiveFile) and ActiveFile.IsNameValid then sPath := ActiveFile.Name // 21.05.2009 - pass name from cursor to makedir form else sPath := EmptyStr; if not frmMkDir.ShowMkDir(sPath) then Exit; // show makedir dialog if (sPath = EmptyStr) then Exit; Operation := ActiveFrame.FileSource.CreateCreateDirectoryOperation(ActiveFrame.CurrentPath, sPath); if Assigned(Operation) then begin // Call directly - not through operations manager. UI := TFileSourceOperationMessageBoxesUI.Create; Operation.AddUserInterface(UI); Operation.Execute; sPath := ExtractFileName(ExcludeTrailingPathDelimiter(sPath)); ActiveFrame.SetActiveFile(sPath); end; finally FreeAndNil(Operation); FreeAndNil(UI); FreeAndNil(ActiveFile); end; end; // Parameters: // trashcan= // 1/true - delete to trash can // 0/false - delete directly // setting - if gUseTrash then delete to trash, otherwise delete directly // reversesetting - if gUseTrash then delete directly, otherwise delete to trash // confirmation= // 1/true - show confirmation // 0/false - don't show confirmation // // Deprecated: // "recycle" - delete to trash can // "norecycle" - delete directly // "recyclesetting" - if gUseTrash then delete to trash, otherwise delete directly // "recyclesettingrev" - if gUseTrash then delete directly, otherwise delete to trash procedure TMainCommands.cm_Delete(const Params: array of string); var I: Integer; theFilesToDelete: TFiles; // 12.05.2009 - if delete to trash, then show another messages MsgDelSel, MsgDelFlDr : string; Operation: TFileSourceOperation; bRecycle: Boolean; bConfirmation, HasConfirmationParam: Boolean; Param, ParamTrashCan: String; BoolValue: Boolean; begin with frmMain.ActiveFrame do begin if not (fsoDelete in FileSource.GetOperationsTypes) then begin msgWarning(rsMsgErrNotSupported); Exit; end; bRecycle := gUseTrash; HasConfirmationParam := False; for Param in Params do begin if Param = 'recycle' then bRecycle := True else if Param = 'norecycle' then bRecycle := False else if Param = 'recyclesetting' then bRecycle := gUseTrash else if Param = 'recyclesettingrev' then bRecycle := not gUseTrash else if GetParamValue(Param, 'trashcan', ParamTrashCan) then begin if ParamTrashCan = 'setting' then bRecycle := gUseTrash else if ParamTrashCan = 'reversesetting' then bRecycle := not gUseTrash else if GetBoolValue(ParamTrashCan, BoolValue) then bRecycle := BoolValue; end else if GetParamBoolValue(Param, 'confirmation', BoolValue) then begin HasConfirmationParam := True; bConfirmation := BoolValue; end; end; if bRecycle then bRecycle := FileSource.IsClass(TFileSystemFileSource) and mbCheckTrash(CurrentPath); if not HasConfirmationParam then begin if not bRecycle then bConfirmation := focDelete in gFileOperationsConfirmations else bConfirmation := focDeleteToTrash in gFileOperationsConfirmations; end; // 12.05.2009 // Showing delete dialog: to trash or to /dev/null :) If bRecycle then begin MsgDelSel := rsMsgDelSelT; MsgDelFlDr := rsMsgDelFlDrT; end else begin MsgDelSel := rsMsgDelSel; MsgDelFlDr := rsMsgDelFlDr; end; // ------------------------------------------------------ theFilesToDelete := CloneSelectedOrActiveFiles; // free at Thread end by thread if Assigned(theFilesToDelete) then try if (theFilesToDelete.Count > 0) and ((not bConfirmation) or (QuestionDlg('', frmMain.GetFileDlgStr(MsgDelSel,MsgDelFlDr,theFilesToDelete), mtConfirmation, [mrYes, mrNo], 0) = mrYes)) then begin if FileSource.IsClass(TFileSystemFileSource) and frmMain.NotActiveFrame.FileSource.IsClass(TFileSystemFileSource) then begin for I:= 0 to theFilesToDelete.Count - 1 do begin if (theFilesToDelete[I].IsDirectory or theFilesToDelete[I].IsLinkToDirectory) and IsInPath(theFilesToDelete[I].FullPath, frmMain.NotActiveFrame.CurrentPath, True, True) then begin frmMain.NotActiveFrame.CurrentPath:= theFilesToDelete.Path; Break; end; end; end; Operation := FileSource.CreateDeleteOperation(theFilesToDelete); if Assigned(Operation) then begin // Special case for filesystem - 'recycle' parameter. if Operation is TFileSystemDeleteOperation then with Operation as TFileSystemDeleteOperation do begin // 30.04.2009 - передаем параметр корзины в поток. Recycle := bRecycle; end; // Start operation. OperationsManager.AddOperation(Operation); end else begin msgWarning(rsMsgNotImplemented); end; end; finally if Assigned(theFilesToDelete) then FreeAndNil(theFilesToDelete); end; end; end; procedure TMainCommands.cm_CheckSumCalc(const Params: array of string); var I: Integer; bSeparateFile: Boolean; HashAlgorithm: THashAlgorithm; sFileName: UTF8String; SelectedFiles: TFiles; Operation: TFileSourceCalcChecksumOperation; begin // This will work only for filesystem. // For other file sources use temp file system when it's done. with frmMain do begin if not (fsoCalcChecksum in ActiveFrame.FileSource.GetOperationsTypes) then begin msgWarning(rsMsgNotImplemented); Exit; // Create temp file source. // CopyOut ActiveFrame.FileSource to TempFileSource. // Do command on TempFileSource and later delete it (or leave cached on disk?) end; SelectedFiles := ActiveFrame.CloneSelectedOrActiveFiles; try if SelectedFiles.Count = 0 then begin msgWarning(rsMsgNoFilesSelected); Exit; end; bSeparateFile:= False; for I := 0 to SelectedFiles.Count - 1 do // find files in selection if not SelectedFiles[I].IsDirectory then begin bSeparateFile:= True; Break; end; if SelectedFiles.Count > 1 then sFileName:= ActiveFrame.CurrentPath + MakeFileName(ActiveFrame.CurrentPath, 'checksum') else sFileName:= ActiveFrame.CurrentPath + SelectedFiles[0].Name; if ShowCalcCheckSum(sFileName, bSeparateFile, HashAlgorithm) then begin Operation := ActiveFrame.FileSource.CreateCalcChecksumOperation( SelectedFiles, ActiveFrame.CurrentPath, sFileName) as TFileSourceCalcChecksumOperation; if Assigned(Operation) then begin Operation.Mode := checksum_calc; Operation.OneFile := not bSeparateFile; Operation.Algorithm := HashAlgorithm; // Start operation. OperationsManager.AddOperation(Operation); end else begin msgWarning(rsMsgNotImplemented); end; end; finally if Assigned(SelectedFiles) then FreeAndNil(SelectedFiles); end; end; end; procedure TMainCommands.cm_CheckSumVerify(const Params: array of string); var I: Integer; SelectedFiles: TFiles; Operation: TFileSourceCalcChecksumOperation; begin // This will work only for filesystem. // For other file sources use temp file system when it's done. with frmMain do begin if not (fsoCalcChecksum in ActiveFrame.FileSource.GetOperationsTypes) then begin msgWarning(rsMsgNotImplemented); Exit; // Create temp file source. // CopyOut ActiveFrame.FileSource to TempFileSource. // Do command on TempFileSource and later delete it (or leave cached on disk?) end; SelectedFiles := ActiveFrame.CloneSelectedOrActiveFiles; try if SelectedFiles.Count = 0 then begin msgWarning(rsMsgNoFilesSelected); Exit; end; for I := 0 to SelectedFiles.Count - 1 do // find files in selection if not FileExtIsHash(SelectedFiles[I].Extension) then begin msgError(rsMsgSelectOnlyCheckSumFiles); Exit; end; Operation := ActiveFrame.FileSource.CreateCalcChecksumOperation( SelectedFiles, '', '') as TFileSourceCalcChecksumOperation; if Assigned(Operation) then begin Operation.AddStateChangedListener([fsosStopped], @OnCalcChecksumStateChanged); Operation.Mode := checksum_verify; // Start operation. OperationsManager.AddOperation(Operation); end else begin msgWarning(rsMsgNotImplemented); end; finally if Assigned(SelectedFiles) then FreeAndNil(SelectedFiles); end; end; end; procedure TMainCommands.cm_FocusCmdLine(const Params: array of string); begin if frmMain.edtCommand.Visible then begin // Show temporarily command line on user request. if (not gCmdLine) and (frmMain.IsCommandLineVisible = False) then begin frmMain.pnlCommand.Show; end; frmMain.edtCommand.SetFocus; end; end; procedure TMainCommands.cm_FileAssoc(const Params: array of string); begin ShowFileAssocDlg; end; procedure TMainCommands.cm_HelpIndex(const Params: array of string); begin ShowHelpOrErrorForKeyword('', '/index.html'); end; procedure TMainCommands.cm_Keyboard(const Params: array of string); begin ShowHelpOrErrorForKeyword('', '/shortcuts.html'); end; procedure TMainCommands.cm_VisitHomePage(const Params: array of string); var ErrMsg: String; begin dmHelpMgr.HTMLHelpDatabase.ShowURL('http://doublecmd.sourceforge.net','Double Commander Web Site', ErrMsg); end; procedure TMainCommands.cm_About(const Params: array of string); begin ShowAboutBox; end; procedure TMainCommands.cm_ShowSysFiles(const Params: array of string); begin with frmMain do begin uGlobs.gShowSystemFiles:= not uGlobs.gShowSystemFiles; actShowSysFiles.Checked:= uGlobs.gShowSystemFiles; //repaint both panels FrameLeft.Reload; FrameRight.Reload; end; end; procedure TMainCommands.cm_SwitchIgnoreList(const Params: array of string); begin with frmMain do begin gIgnoreListFileEnabled:= not gIgnoreListFileEnabled; actSwitchIgnoreList.Checked:= gIgnoreListFileEnabled; //repaint both panels FrameLeft.Reload; FrameRight.Reload; end; end; // Parameter is name of TOptionsEditorClass. procedure TMainCommands.cm_Options(const Params: array of string); begin ShowOptions(GetDefaultParam(Params)); end; procedure TMainCommands.cm_CompareContents(const Params: array of string); var FilesToCompare: TStringList = nil; DirsToCompare: TStringList = nil; procedure AddItem(const aFile: TFile); begin if not aFile.IsDirectory then FilesToCompare.Add(aFile.FullPath) else DirsToCompare.Add(aFile.FullPath); end; procedure RunExtDiffer(CompareList: TStringList); var i : Integer; sCommand: String; begin with gExternalTools[etDiffer] do begin sCommand := QuoteStr(ReplaceEnvVars(Path)); if Parameters <> EmptyStr then sCommand := sCommand + ' ' + Parameters; for i := 0 to CompareList.Count - 1 do sCommand := sCommand + ' ' + QuoteStr(CompareList.Strings[i]); try ExecCmdFork(sCommand, RunInTerminal, '', KeepTerminalOpen); except on e: EInvalidCommandLine do MessageDlg(rsToolErrorOpeningDiffer, rsMsgInvalidCommandLine + ' (' + rsToolDiffer + '):' + LineEnding + e.Message, mtError, [mbOK], 0); end; end; end; var i : Integer; ActiveSelectedFiles: TFiles = nil; NotActiveSelectedFiles: TFiles = nil; Param: String; begin with frmMain do begin // For now work only for filesystem. // Later use temporary file system for other file sources. try FilesToCompare := TStringList.Create; DirsToCompare := TStringList.Create; Param := GetDefaultParam(Params); if Param = 'dir' then begin DirsToCompare.Add(FrameLeft.CurrentPath); DirsToCompare.Add(FrameRight.CurrentPath); end else begin // For now work only for filesystem. if not (ActiveFrame.FileSource.IsClass(TFileSystemFileSource)) then begin msgWarning(rsMsgNotImplemented); Exit; end; try ActiveSelectedFiles := ActiveFrame.CloneSelectedOrActiveFiles; if ActiveSelectedFiles.Count = 1 then begin // If no files selected in the opposite panel then try to get file // with the same name. if not NotActiveFrame.HasSelectedFiles then begin for i := 0 to NotActiveFrame.DisplayFiles.Count - 1 do if NotActiveFrame.DisplayFiles[i].FSFile.Name = ActiveSelectedFiles[0].Name then begin NotActiveSelectedFiles := TFiles.Create(NotActiveFrame.CurrentPath); NotActiveSelectedFiles.Add(NotActiveFrame.DisplayFiles[i].FSFile.Clone); Break; end; end; if not Assigned(NotActiveSelectedFiles) then NotActiveSelectedFiles := NotActiveFrame.CloneSelectedOrActiveFiles; if NotActiveSelectedFiles.Count = 1 then begin // For now work only for filesystem. if not (NotActiveFrame.FileSource.IsClass(TFileSystemFileSource)) then begin msgWarning(rsMsgNotImplemented); Exit; end; { compare single selected files in both panels } AddItem(ActiveSelectedFiles[0]); AddItem(NotActiveSelectedFiles[0]); end else begin // Only one file selected in active panel. MsgWarning(rsMsgInvalidSelection); Exit; end; end else if ActiveSelectedFiles.Count > 1 then begin { compare all selected files in active frame } for i := 0 to ActiveSelectedFiles.Count - 1 do AddItem(ActiveSelectedFiles[i]); end; finally if Assigned(ActiveSelectedFiles) then FreeAndNil(ActiveSelectedFiles); if Assigned(NotActiveSelectedFiles) then FreeAndNil(NotActiveSelectedFiles); end; end; if ((FilesToCompare.Count > 0) and (DirsToCompare.Count > 0)) or ((FilesToCompare.Count = 1) or (DirsToCompare.Count = 1)) then begin // Either files or directories must be selected and more than one. MsgWarning(rsMsgInvalidSelection) end else if FilesToCompare.Count > 0 then begin if gExternalTools[etDiffer].Enabled then RunExtDiffer(FilesToCompare) else if FilesToCompare.Count = 2 then ShowDiffer(FilesToCompare.Strings[0], FilesToCompare.Strings[1]) else MsgWarning(rsMsgTooManyFilesSelected); end else if DirsToCompare.Count > 0 then begin if gExternalTools[etDiffer].Enabled then RunExtDiffer(DirsToCompare) else MsgWarning(rsMsgNotImplemented); end else msgWarning(rsMsgNoFilesSelected); finally if Assigned(FilesToCompare) then FreeAndNil(FilesToCompare); if Assigned(DirsToCompare) then FreeAndNil(DirsToCompare); end; end; end; procedure TMainCommands.cm_ShowMainMenu(const Params: array of string); begin DoShowMainMenu(not gMainMenu); end; procedure TMainCommands.cm_Refresh(const Params: array of string); begin frmMain.ActiveFrame.Reload; end; //------------------------------------------------------ procedure TMainCommands.cm_MarkInvert(const Params: array of string); begin frmMain.ActiveFrame.InvertAll; end; procedure TMainCommands.cm_MarkMarkAll(const Params: array of string); begin frmMain.ActiveFrame.MarkFiles(True); end; procedure TMainCommands.cm_MarkUnmarkAll(const Params: array of string); begin frmMain.ActiveFrame.MarkFiles(False); end; procedure TMainCommands.cm_MarkPlus(const Params: array of string); begin frmMain.ActiveFrame.MarkGroup(True); end; procedure TMainCommands.cm_MarkMinus(const Params: array of string); begin frmMain.ActiveFrame.MarkGroup(False); end; procedure TMainCommands.cm_MarkCurrentExtension(const Params: array of string); begin frmMain.ActiveFrame.MarkCurrentExtension(True); end; procedure TMainCommands.cm_UnmarkCurrentExtension(const Params: array of string); begin frmMain.ActiveFrame.MarkCurrentExtension(False); end; procedure TMainCommands.cm_SaveSelection(const Params: array of string); begin frmMain.ActiveFrame.SaveSelection; end; procedure TMainCommands.cm_RestoreSelection(const Params: array of string); begin frmMain.ActiveFrame.RestoreSelection; end; procedure TMainCommands.cm_SaveSelectionToFile(const Params: array of string); begin frmMain.ActiveFrame.SaveSelectionToFile(GetDefaultParam(Params)); end; procedure TMainCommands.cm_LoadSelectionFromFile(const Params: array of string); begin frmMain.ActiveFrame.LoadSelectionFromFile(GetDefaultParam(Params)); end; procedure TMainCommands.cm_LoadSelectionFromClip(const Params: array of string); begin frmMain.ActiveFrame.LoadSelectionFromClipboard; end; //------------------------------------------------------ procedure TMainCommands.cm_DirHotList(const Params: array of string); var p:TPoint; begin frmMain.CreatePopUpHotDir;// TODO: i thing in future this must call on create or change p:=frmMain.ActiveFrame.ClientToScreen(Classes.Point(0,0)); frmMain.pmHotList.Popup(p.X,p.Y); end; procedure TMainCommands.cm_Search(const Params: array of string); begin ShowFindDlg(frmMain.ActiveFrame); end; //------------------------------------------------------ procedure TMainCommands.cm_SymLink(const Params: array of string); var sExistingFile, sLinkToCreate: String; SelectedFiles: TFiles; begin with frmMain do begin // Symlinks work only for file system. if not (ActiveFrame.FileSource.IsClass(TFileSystemFileSource)) then begin msgWarning(rsMsgErrNotSupported); Exit; // Or create a symlink in temp filesystem and CopyIn to target file source. end; SelectedFiles := ActiveFrame.CloneSelectedOrActiveFiles; try if SelectedFiles.Count > 1 then msgWarning(rsMsgTooManyFilesSelected) else if SelectedFiles.Count = 0 then msgWarning(rsMsgNoFilesSelected) else begin sExistingFile := SelectedFiles[0].Path + SelectedFiles[0].Name; if Length(Params) > 0 then sLinkToCreate := Params[0] else begin if NotActiveFrame.FileSource.IsClass(TFileSystemFileSource) then sLinkToCreate := NotActiveFrame.CurrentPath else sLinkToCreate := ActiveFrame.CurrentPath end; sLinkToCreate := sLinkToCreate + SelectedFiles[0].Name; if ShowSymLinkForm(sExistingFile, sLinkToCreate, ActiveFrame.CurrentPath) then begin ActiveFrame.Reload; if NotActiveFrame.FileSource.IsClass(TFileSystemFileSource) then NotActiveFrame.Reload; end; end; finally FreeAndNil(SelectedFiles); end; end; end; procedure TMainCommands.cm_HardLink(const Params: array of string); var sExistingFile, sLinkToCreate: String; SelectedFiles: TFiles; begin with frmMain do begin // Hard links work only for file system. if not (ActiveFrame.FileSource.IsClass(TFileSystemFileSource)) then begin msgWarning(rsMsgErrNotSupported); Exit; end; SelectedFiles := ActiveFrame.CloneSelectedOrActiveFiles; try if SelectedFiles.Count > 1 then msgWarning(rsMsgTooManyFilesSelected) else if SelectedFiles.Count = 0 then msgWarning(rsMsgNoFilesSelected) else begin sExistingFile := SelectedFiles[0].Path + SelectedFiles[0].Name; if Length(Params) > 0 then sLinkToCreate := Params[0] else begin if NotActiveFrame.FileSource.IsClass(TFileSystemFileSource) then sLinkToCreate := NotActiveFrame.CurrentPath else sLinkToCreate := ActiveFrame.CurrentPath end; sLinkToCreate := sLinkToCreate + SelectedFiles[0].Name; if ShowHardLinkForm(sExistingFile, sLinkToCreate, ActiveFrame.CurrentPath) then begin ActiveFrame.Reload; if NotActiveFrame.FileSource.IsClass(TFileSystemFileSource) then NotActiveFrame.Reload; end; end; finally FreeAndNil(SelectedFiles); end; end; end; // Uses to change sort direction when columns header is disabled procedure TMainCommands.cm_ReverseOrder(const Params: array of string); begin with frmMain.ActiveFrame do Sorting := ReverseSortDirection(Sorting); end; procedure TMainCommands.cm_SortByName(const Params: array of string); var FileFunctions: TFileFunctions = nil; begin AddSortFunction(FileFunctions, fsfNameNoExtension); DoSortByFunctions(frmMain.ActiveFrame, FileFunctions); end; procedure TMainCommands.cm_SortByExt(const Params: array of string); var FileFunctions: TFileFunctions = nil; begin AddSortFunction(FileFunctions, fsfExtension); DoSortByFunctions(frmMain.ActiveFrame, FileFunctions); end; procedure TMainCommands.cm_SortBySize(const Params: array of string); var FileFunctions: TFileFunctions = nil; begin AddSortFunction(FileFunctions, fsfSize); DoSortByFunctions(frmMain.ActiveFrame, FileFunctions); end; procedure TMainCommands.cm_SortByDate(const Params: array of string); var FileFunctions: TFileFunctions = nil; begin AddSortFunction(FileFunctions, fsfModificationTime); DoSortByFunctions(frmMain.ActiveFrame, FileFunctions); end; procedure TMainCommands.cm_SortByAttr(const Params: array of string); var FileFunctions: TFileFunctions = nil; begin AddSortFunction(FileFunctions, fsfAttr); DoSortByFunctions(frmMain.ActiveFrame, FileFunctions); end; procedure TMainCommands.cm_MultiRename(const Params: array of string); var aFiles: TFiles; begin with frmMain do begin if not (fsoSetFileProperty in ActiveFrame.FileSource.GetOperationsTypes) then begin msgWarning(rsMsgErrNotSupported); Exit; end; aFiles:= ActiveFrame.CloneSelectedOrActiveFiles; if Assigned(aFiles) then try if aFiles.Count > 0 then ShowMultiRenameForm(ActiveFrame.FileSource, aFiles) else msgWarning(rsMsgNoFilesSelected); finally FreeAndNil(aFiles); end; end; end; //------------------------------------------------------ procedure TMainCommands.cm_CopySamePanel(const Params: array of string); begin frmMain.CopyFiles('', True); end; procedure TMainCommands.cm_RenameOnly(const Params: array of string); begin frmMain.ActiveFrame.ExecuteCommand('cm_RenameOnly', Params); end; procedure TMainCommands.cm_EditNew(const Params: array of string); var sNewFile: String; hFile: System.THandle = 0; aFile: TFile; Attrs: TFileAttrs; begin frmMain.ActiveFrame.ExecuteCommand('cm_EditNew', Params); // For now only works for FileSystem. with frmMain do if ActiveFrame.FileSource.IsClass(TFileSystemFileSource) then begin aFile := ActiveFrame.CloneActiveFile; if Assigned(aFile) then try if aFile.IsNameValid then sNewFile:= aFile.Name else sNewFile:= rsEditNewFile; finally FreeAndNil(aFile); end; if not InputQuery(rsEditNewOpen, rsEditNewFileName, sNewFile) then Exit; // If user entered only a filename prepend it with current directory. if ExtractFilePath(sNewFile) = '' then sNewFile:= ActiveFrame.CurrentPath + sNewFile; Attrs := mbFileGetAttr(sNewFile); if Attrs = faInvalidAttributes then begin hFile := mbFileCreate(sNewFile); if hFile = feInvalidHandle then begin MessageDlg(rsMsgErrECreate, mbSysErrorMessage(GetLastOSError), mtWarning, [mbOK], 0); Exit; end; FileClose(hFile); ActiveFrame.FileSource.Reload(ExtractFilePath(sNewFile)); end else if FPS_ISDIR(Attrs) then begin MessageDlg(rsMsgErrECreate, Format(rsMsgErrCreateFileDirectoryExists, [ExtractFileName(sNewFile)]), mtWarning, [mbOK], 0); Exit; end; aFile := TFileSystemFileSource.CreateFileFromFile(sNewFile); try // Try to find Edit command in doublecmd.ext sNewFile := gExts.GetExtActionCmd(aFile, 'edit'); // If command not found then use default editor if Length(sNewFile) = 0 then ShowEditorByGlob(aFile.FullPath) else begin sNewFile := PrepareParameter(sNewFile, aFile); ProcessExtCommand(sNewFile, aFile.Path); end; finally FreeAndNil(aFile); end; end else msgWarning(rsMsgNotImplemented); end; // Shows recently visited directories (global). procedure TMainCommands.cm_DirHistory(const Params: array of string); var p:TPoint; begin frmMain.CreatePopUpDirHistory; p:=frmMain.ActiveFrame.ClientToScreen(Classes.Point(0,0)); frmMain.pmDirHistory.Popup(p.X,p.Y); end; // Shows browser-like history for active file view. procedure TMainCommands.cm_ViewHistory(const Params: array of string); begin frmMain.ShowFileViewHistory; end; procedure TMainCommands.cm_ViewHistoryPrev(const Params: array of string); begin with frmMain do begin ActiveFrame.GoToPrevHistory; end; end; procedure TMainCommands.cm_ViewHistoryNext(const Params: array of string); begin with frmMain do begin ActiveFrame.GoToNextHistory; end; end; procedure TMainCommands.cm_ShowCmdLineHistory(const Params: array of string); begin with frmMain do begin if IsCommandLineVisible then begin edtCommand.SetFocus; if edtCommand.Items.Count>0 then edtCommand.DroppedDown:=True; end; end; end; procedure TMainCommands.cm_RunTerm(const Params: array of string); begin with frmMain do if not edtCommand.Focused then try mbSetCurrentDir(ActiveFrame.CurrentPath); ExecCmdFork(PrepareParameter(gRunTerm, FrameLeft, FrameRight, ActiveFrame, [])); except on e: EInvalidCommandLine do MessageDlg(rsToolErrorOpeningTerminal, rsMsgInvalidCommandLine + ' (' + rsToolTerminal + '):' + LineEnding + e.Message, mtError, [mbOK], 0); end; end; procedure TMainCommands.cm_CalculateSpace(const Params: array of string); var SelectedFiles: TFiles; Operation: TFileSourceOperation; begin with frmMain do begin if not (fsoCalcStatistics in ActiveFrame.FileSource.GetOperationsTypes) then begin msgWarning(rsMsgErrNotSupported); Exit; end; SelectedFiles := ActiveFrame.CloneSelectedOrActiveFiles; try Operation := ActiveFrame.FileSource.CreateCalcStatisticsOperation(SelectedFiles); if not Assigned(Operation) then msgWarning(rsMsgErrNotSupported) else begin Operation.AddStateChangedListener([fsosStopped], @OnCalcStatisticsStateChanged); OperationsManager.AddOperation(Operation); end; finally if Assigned(SelectedFiles) then FreeAndNil(SelectedFiles); end; end; end; procedure TMainCommands.cm_CountDirContent(const Params: array of string); begin frmMain.ActiveFrame.CalculateSpaceOfAllDirectories; end; procedure TMainCommands.cm_SetFileProperties(const Params: array of string); var ActiveFile: TFile = nil; SelectedFiles: TFiles = nil; aFileProperties: TFileProperties; Operation: TFileSourceSetFilePropertyOperation = nil; begin with frmMain do try if not (fsoSetFileProperty in ActiveFrame.FileSource.GetOperationsTypes) then begin msgWarning(rsMsgErrNotSupported); Exit; end; SelectedFiles := ActiveFrame.CloneSelectedOrActiveFiles; ActiveFile := ActiveFrame.CloneActiveFile; if Assigned(ActiveFile) then begin FillByte(aFileProperties, SizeOf(aFileProperties), 0); if fpAttributes in ActiveFile.SupportedProperties then aFileProperties[fpAttributes]:= ActiveFile.Properties[fpAttributes].Clone; if fpModificationTime in ActiveFile.SupportedProperties then aFileProperties[fpModificationTime]:= ActiveFile.Properties[fpModificationTime].Clone; if fpCreationTime in ActiveFile.SupportedProperties then aFileProperties[fpCreationTime]:= ActiveFile.Properties[fpCreationTime].Clone; if fpLastAccessTime in ActiveFile.SupportedProperties then aFileProperties[fpLastAccessTime]:= ActiveFile.Properties[fpLastAccessTime].Clone; Operation:= ActiveFrame.FileSource.CreateSetFilePropertyOperation( SelectedFiles, aFileProperties) as TFileSourceSetFilePropertyOperation; if Assigned(Operation) then begin if ShowChangeFilePropertiesDialog(Operation) then begin OperationsManager.AddOperation(Operation); Operation := nil; // So it doesn't get destroyed below. end; end; end; finally if Assigned(SelectedFiles) then FreeAndNil(SelectedFiles); if Assigned(ActiveFile) then FreeAndNil(ActiveFile); if Assigned(Operation) then FreeAndNil(Operation); end; end; procedure TMainCommands.cm_FileProperties(const Params: array of string); var SelectedFiles: TFiles; Operation: TFileSourceExecuteOperation; aFile: TFile; begin with frmMain do begin if ActiveFrame.FileSource.IsClass(TFileSystemFileSource) then begin SelectedFiles := ActiveFrame.CloneSelectedOrActiveFiles; if Assigned(SelectedFiles) then try if SelectedFiles.Count > 0 then try ShowFilePropertiesDialog(ActiveFrame.FileSource, SelectedFiles); except on e: EContextMenuException do ShowException(e); end; finally FreeAndNil(SelectedFiles); end; end else if (fsoExecute in ActiveFrame.FileSource.GetOperationsTypes) then begin aFile:= ActiveFrame.CloneActiveFile; if Assigned(aFile) then try Operation:= ActiveFrame.FileSource.CreateExecuteOperation( aFile, ActiveFrame.CurrentPath, 'properties') as TFileSourceExecuteOperation; if Assigned(Operation) then Operation.Execute; finally FreeThenNil(Operation); FreeThenNil(aFile); end; end; end; end; procedure TMainCommands.cm_FileLinker(const Params: array of string); var I: Integer; aSelectedFiles: TFiles = nil; aFile: TFile; begin with frmMain, frmMain.ActiveFrame do begin if not (fsoCombine in FileSource.GetOperationsTypes) then begin msgWarning(rsMsgErrNotSupported); Exit; end; try aSelectedFiles := CloneSelectedOrActiveFiles; for I := 0 to aSelectedFiles.Count - 1 do begin aFile := aSelectedFiles[I]; if (aFile.IsDirectory or aFile.IsLinkToDirectory) then begin msgWarning(rsMsgInvalidSelection); Exit; end; end; if aSelectedFiles.Count > 1 then ShowLinkerFilesForm(FileSource, aSelectedFiles, NotActiveFrame.CurrentPath) else msgWarning(rsMsgInvalidSelection); finally FreeThenNil(aSelectedFiles); end; // try end; // with end; procedure TMainCommands.cm_FileSpliter(const Params: array of string); var aFile: TFile = nil; begin with frmMain, frmMain.ActiveFrame do begin if not (fsoSplit in FileSource.GetOperationsTypes) then begin msgWarning(rsMsgErrNotSupported); Exit; end; try aFile := CloneActiveFile; if (not Assigned(aFile)) or (aFile.IsDirectory or aFile.IsLinkToDirectory) then msgWarning(rsMsgInvalidSelection) else ShowSplitterFileForm(FileSource, aFile, NotActiveFrame.CurrentPath); finally FreeThenNil(aFile); end; // try end; // with end; procedure TMainCommands.cm_PanelsSplitterPerPos(const Params: array of string); var Split: Integer = -1; Param, SplitPct: String; begin for Param in Params do begin if GetParamValue(Param, 'splitpct', SplitPct) then Split := StrToIntDef(SplitPct, Split) else if Split = -1 then Split := StrToIntDef(Param, Split); // deprecated end; DoPanelsSplitterPerPos(Split); end; procedure TMainCommands.cm_EditComment(const Params: array of string); var aFile: TFile; begin with frmMain.ActiveFrame do begin if (fspDirectAccess in FileSource.GetProperties) then begin aFile:= CloneActiveFile; if Assigned(aFile) then try if aFile.IsNameValid then ShowDescrEditDlg(CurrentPath + aFile.Name) else msgWarning(rsMsgNoFilesSelected); finally FreeAndNil(aFile); end; end else if (fspLinksToLocalFiles in FileSource.GetProperties) then begin aFile:= CloneActiveFile; if Assigned(aFile) then try if aFile.IsNameValid then begin if FileSource.GetLocalName(aFile) then ShowDescrEditDlg(aFile.FullPath) else msgWarning(rsMsgErrNotSupported); end else begin msgWarning(rsMsgNoFilesSelected); end; finally FreeAndNil(aFile); end; end else msgWarning(rsMsgErrNotSupported); end; end; function SendToClipboard(ClipboardMode: uClipboard.TClipboardOperation):Boolean; var sl: TStringList = nil; i : Integer; theSelectedFiles: TFiles = nil; begin // Only works for file system. Result := False; with frmMain.ActiveFrame do if FileSource.IsClass(TFileSystemFileSource) then begin sl := TStringList.Create; try theSelectedFiles := CloneSelectedOrActiveFiles; for i := 0 to theSelectedFiles.Count - 1 do sl.Add(CurrentPath + theSelectedFiles[i].Name); case ClipboardMode of uClipboard.ClipboardCut: Result := uClipboard.CutToClipboard(sl); uClipboard.ClipboardCopy: Result := uClipboard.CopyToClipboard(sl); end; finally if Assigned(sl) then FreeAndNil(sl); if Assigned(theSelectedFiles) then FreeAndNil(theSelectedFiles); end; end else msgWarning(rsMsgErrNotSupported); end; procedure TMainCommands.cm_CopyToClipboard(const Params: array of string); begin SendToClipboard(ClipboardCopy); end; procedure TMainCommands.cm_CutToClipboard(const Params: array of string); begin SendToClipboard(ClipboardCut); end; procedure TMainCommands.cm_PasteFromClipboard(const Params: array of string); var ClipboardOp: TClipboardOperation; filenamesList: TStringList; Files: TFiles = nil; Operation: TFileSourceOperation = nil; SourceFileSource: IFileSource = nil; begin with frmMain do begin if PasteFromClipboard(ClipboardOp, filenamesList) = True then try // fill file list with files Files := TFileSystemFileSource.CreateFilesFromFileList( ExtractFilePath(filenamesList[0]), fileNamesList, True); if Files.Count > 0 then begin case ClipboardOp of uClipboard.ClipboardCut: begin SourceFileSource := TFileSystemFileSource.GetFileSource; if ActiveFrame.FileSource.IsClass(TFileSystemFileSource) then begin if not (fsoMove in ActiveFrame.FileSource.GetOperationsTypes) then begin msgWarning(rsMsgErrNotSupported); Exit; end; Operation := SourceFileSource.CreateMoveOperation( Files, ActiveFrame.CurrentPath); end else begin if (not (fsoCopyIn in ActiveFrame.FileSource.GetOperationsTypes)) or (not (fsoDelete in SourceFileSource.GetOperationsTypes)) then begin msgWarning(rsMsgErrNotSupported); Exit; end; { // Meta-operation: CopyIn + Delete Operation := ActiveFrame.FileSource.CreateCopyInOperation( SourceFileSource, Files, ActiveFrame.CurrentPath); } end; end; uClipboard.ClipboardCopy: begin if not (fsoCopyIn in ActiveFrame.FileSource.GetOperationsTypes) then begin msgWarning(rsMsgErrNotSupported); Exit; end; SourceFileSource := TFileSystemFileSource.GetFileSource; if ActiveFrame.FileSource.IsClass(TFileSystemFileSource) then begin Operation := SourceFileSource.CreateCopyOutOperation( ActiveFrame.FileSource, Files, ActiveFrame.CurrentPath); end else begin Operation := ActiveFrame.FileSource.CreateCopyInOperation( SourceFileSource, Files, ActiveFrame.CurrentPath); end; end; else // Invalid clipboard operation. Exit; end; if Assigned(Operation) then begin if Operation is TFileSystemCopyOperation then (Operation as TFileSystemCopyOperation).AutoRenameItSelf:= True; OperationsManager.AddOperation(Operation); // Files have been moved so clear the clipboard because // the files location in the clipboard is invalid now. if ClipboardOp = uClipboard.ClipboardCut then uClipboard.ClearClipboard; end else msgWarning(rsMsgNotImplemented); end; finally FreeAndNil(fileNamesList); if Assigned(Files) then FreeAndNil(Files); end; end; end; procedure TMainCommands.cm_ChangeDirToRoot(const Params: array of string); begin with frmMain.ActiveFrame do begin CurrentPath := FileSource.GetRootDir(CurrentPath); end; end; procedure TMainCommands.cm_ChangeDirToParent(const Params: array of string); begin frmMain.ActiveFrame.ChangePathToParent(True); end; // Parameters: // Full path to a directory. procedure TMainCommands.cm_ChangeDir(const Params: array of string); begin if Length(Params) > 0 then ChooseFileSource(FrmMain.ActiveFrame, ReplaceEnvVars(Params[0])); end; procedure TMainCommands.cm_ClearLogWindow(const Params: array of string); begin frmMain.seLogWindow.Lines.Clear; end; procedure TMainCommands.cm_CmdLineNext(const Params: array of string); begin DoShowCmdLineHistory(True); end; procedure TMainCommands.cm_CmdLinePrev(const Params: array of string); begin DoShowCmdLineHistory(False); end; procedure TMainCommands.cm_ClearLogFile(const Params: array of string); begin mbDeleteFile(gLogFileName); end; procedure TMainCommands.cm_NetworkConnect(const Params: array of string); begin { ShowConnectionManager(frmMain.ActiveFrame); } end; procedure TMainCommands.cm_NetworkDisconnect(const Params: array of string); begin { if frmMain.ActiveFrame.FileSource.IsClass(TWfxPluginFileSource) then with frmMain.ActiveFrame.FileSource as IWfxPluginFileSource do begin if param <> EmptyStr then WfxModule.WfxNetworkCloseConnection(param); end; } end; procedure TMainCommands.cm_HorizontalFilePanels(const Params: array of string); begin gHorizontalFilePanels := not gHorizontalFilePanels; frmMain.actHorizontalFilePanels.Checked := gHorizontalFilePanels; frmMain.UpdateWindowView; end; procedure TMainCommands.cm_OperationsViewer(const Params: array of string); begin ShowOperationsViewer; end; procedure TMainCommands.cm_CompareDirectories(const Params: array of string); var I: LongWord; SourceFile: TDisplayFile; TargetFile: TDisplayFile; SourceList: TStringHashList; SourceFiles: TDisplayFiles = nil; TargetFiles: TDisplayFiles = nil; FileTimeDiff: TDateTime; begin SourceList:= TStringHashList.Create(FileNameCaseSensitive); with frmMain do try SourceFiles:= ActiveFrame.DisplayFiles; TargetFiles:= NotActiveFrame.DisplayFiles; for I:= 0 to SourceFiles.Count - 1 do begin SourceFile:= SourceFiles[I]; if SourceFile.FSFile.IsDirectory or SourceFile.FSFile.IsLinkToDirectory then Continue; ActiveFrame.MarkFile(SourceFile, True); SourceList.Add(SourceFile.FSFile.Name, SourceFile); end; for I:= 0 to TargetFiles.Count - 1 do begin TargetFile:= TargetFiles[I]; if TargetFile.FSFile.IsDirectory or TargetFile.FSFile.IsLinkToDirectory then Continue; SourceFile:= TDisplayFile(SourceList.Data[TargetFile.FSFile.Name]); if (SourceFile = nil) then NotActiveFrame.MarkFile(TargetFile, True) else begin FileTimeDiff:= SourceFile.FSFile.ModificationTime - TargetFile.FSFile.ModificationTime; if FileTimeDiff = 0 then ActiveFrame.MarkFile(SourceFile, False) else if FileTimeDiff > 0 then NotActiveFrame.MarkFile(TargetFile, False) else if FileTimeDiff < 0 then begin ActiveFrame.MarkFile(SourceFile, False); NotActiveFrame.MarkFile(TargetFile, True); end; end; end; finally SourceList.Free; ActiveFrame.UpdateView; NotActiveFrame.UpdateView; end; end; end. doublecmd-0.5.8/src/un_lineinfo.pp0000644000175000017500000007064512047417134016162 0ustar alexxalexx{ This file is part of the chelinfo library. Copyright (c) 2008 by Anton Rzheshevski Parts (c) 2006 Thomas Schatzl, member of the FreePascal Development team Parts (c) 2000 Peter Vreman (adapted from original stabs line reader) Dwarf LineInfo Extractor See the file COPYING.FPC, included in this distribution, for details about the copyright. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. **********************************************************************} { 2008, Anton Rzheshevski aka Cheb: Like dr. Frankenshtein I sewn this library together from the dead meat of the the FPC RTL modules lineinfo.pp and lnfodwrf.pp. These (as of Jan. 2008 / FPC 2.2.0) both didn't work and had several limitations (e.g. inability to be used from a DLL) SUPPORTED TARGETS: Linux-32, Linux-64, Win32, Win64. Based on lnfodwrf.pp from FreePascal RTL. Oct 2009, by cobines - Removed the structures holding debugging info. Now the state machine is run for each address requiring line info, like in lnfodwrf.pp. It uses less memory but is slower. But since it is usually called only on unhandled exceptions the speed doesn't matter much. - Updated the code to lnfodwrf.pp from FPC 2.5.1 (rev. 14154). } {--------------------------------------------------------------------------- Generic Dwarf lineinfo reader The line info reader is based on the information contained in DWARF Debugging Information Format Version 3 Chapter 6.2 "Line Number Information" from the DWARF Debugging Information Format Workgroup. For more information on this document see also http://dwarf.freestandards.org/ ---------------------------------------------------------------------------} {$mode delphi} {$longstrings on} {$codepage utf-8} {$coperators on} {$pointermath on} {.$DEFINE DEBUG_DWARF_PARSER} unit un_lineinfo; interface uses SysUtils, Classes; function GetLineInfo(addr: pointer; var moduleFile, sourceFile: ansistring; var line, column: integer): Boolean; { The format of returned information: "moduleFile" *always* receives the full name of the executable file (the main exe or one of dlls it uses) the addr belongs to. In Linux, it returns the real file name, with all symlinks resolved. "line" can be negative, which means no line info has been found for this address. See LineInfoError (below) for details. "sourceFile" returns the source file name. It either doesn't or does contain a full path. If the source was in the same directory as the program itself, there will be no path. If the source was in the different directory, there will be a full path (for the moment when the program was compiled, NOT for the current location of that source). "column" is positive ONLY when there is more than one address stored for the same source line. FreePascal generates this on VERY rare occasions, mostly for the arithmetic formulas spanning several lines. So most of the time column will receive -1. } procedure InitLineInfo; { Installs the custom BackTraceStr handler. } procedure AddLineInfoPath(const Path: String); { Adds a path that will be searched for .zdli files. Paths can be absolute or relative to the directory with the executable module. } procedure GetModuleByAddr(addr: pointer; var baseaddr: pointer; var filename: string); { This function allows you to know which executable (i.e. the main exe or one of the dlls loaded by it) owns this part of the virtual addres space. baseaddr receives the exe/dll base address (always NIL for the main exe in Linux). The mechnaism is made with possibility of a DLL relocation in mind, but that particular feature is untested. This function is used by GetLineInfo() to determine which executable to load line the info from. } var LineInfoError: WideString = ''; implementation uses {$ifdef unix} dl {$else} windows {$endif} , un_xtrctdwrflnfo, zstream; {$MACRO ON} {$ifdef DEBUG_DWARF_PARSER} {$define DEBUG_WRITELN := WriteLn} {$define DEBUG_COMMENT := } {$else} {$define DEBUG_WRITELN := //} {$define DEBUG_COMMENT := //} {$endif} var {You can store the .zdli files in a different folder than the Exe itself. Just fill in this array. Paths can be absolute or relative to BaseModulePath. For example: AddLineInfoPath('debug') - will search in /debug/ } LineInfoPaths: array of string = nil; {Path where the executable module is.} BaseModulePath: String; function ChelinfoBackTraceStr(addr : Pointer) : ShortString; var exe, src: ansistring; line, column: integer; Store : TBackTraceStrFunc; begin { reset to prevent infinite recursion if problems inside the code } Store := BackTraceStrFunc; BackTraceStrFunc := @SysBackTraceStr; GetLineInfo(addr, exe, src, line, column); { create string } Result := ' $' + HexStr(addr); if line >= 0 then begin Result += ' line ' + IntToStr(line); if column >= 0 then Result += ', column ' + IntToStr(column); Result += ' of ' + src; end; Result += ' in ' + exe; BackTraceStrFunc := Store; end; {$packrecords default} type Bool8 = ByteBool; { DWARF 2 default opcodes} const { Extended opcodes } DW_LNE_END_SEQUENCE = 1; DW_LNE_SET_ADDRESS = 2; DW_LNE_DEFINE_FILE = 3; { Standard opcodes } DW_LNS_COPY = 1; DW_LNS_ADVANCE_PC = 2; DW_LNS_ADVANCE_LINE = 3; DW_LNS_SET_FILE = 4; DW_LNS_SET_COLUMN = 5; DW_LNS_NEGATE_STMT = 6; DW_LNS_SET_BASIC_BLOCK = 7; DW_LNS_CONST_ADD_PC = 8; DW_LNS_FIXED_ADVANCE_PC = 9; DW_LNS_SET_PROLOGUE_END = 10; DW_LNS_SET_EPILOGUE_BEGIN = 11; DW_LNS_SET_ISA = 12; type { state record for the line info state machine } TMachineState = record address : QWord; // can hold 32-bit or 64-bit addresses (depending on DWARF type) file_id : DWord; line : QWord; column : DWord; is_stmt : Boolean; basic_block : Boolean; end_sequence : Boolean; prolouge_end : Boolean; epilouge_begin : Boolean; isa : QWord; append_row : Boolean; first_row : Boolean; end; { DWARF line number program header preceding the line number program, 64 bit version } TLineNumberProgramHeader64 = packed record magic : DWord; unit_length : QWord; version : Word; length : QWord; minimum_instruction_length : Byte; default_is_stmt : Bool8; line_base : ShortInt; line_range : Byte; opcode_base : Byte; end; { DWARF line number program header preceding the line number program, 32 bit version } TLineNumberProgramHeader32 = packed record unit_length : DWord; version : Word; length : DWord; minimum_instruction_length : Byte; default_is_stmt : Bool8; line_base : ShortInt; line_range : Byte; opcode_base : Byte; end; procedure GetModuleByAddr(addr: pointer; var baseaddr: pointer; var filename: string); {$ifdef unix} var dlinfo: dl_info; begin FillChar(dlinfo, sizeof(dlinfo), 0); dladdr(addr, @dlinfo); baseaddr:= dlinfo.dli_fbase; filename:= String(dlinfo.dli_fname); {$if not defined(darwin)} if ExtractFileName(filename) = ExtractFileName(ParamStr(0)) then baseaddr:= nil; {$endif} end; {$else} var Tmm: TMemoryBasicInformation; TST: array[0..Max_Path] of Char; begin if VirtualQuery(addr, @Tmm, SizeOf(Tmm)) <> sizeof(Tmm) then raise Exception.Create('The VirualQuery() call failed.'); baseaddr:=Tmm.AllocationBase; TST[0]:= #0; GetModuleFileName(THandle(Tmm.AllocationBase), TST, SizeOf(TST)); filename:= String(PChar(@TST)); end; {$endif} procedure InitLineInfo; begin BackTraceStrFunc := @ChelinfoBacktraceStr; BaseModulePath := ExtractFilePath(ParamStr(0)); end; procedure AddLineInfoPath(const Path: String); begin SetLength(LineInfoPaths, Length(LineInfoPaths) + 1); LineInfoPaths[Length(LineInfoPaths) - 1] := ExcludeTrailingPathDelimiter(Path); end; function GetLineInfo(addr: Pointer; var moduleFile, sourceFile: ansistring; var line, column: integer): Boolean; var dli: TStream = nil; // Stream holding uncompressed debug line info. unit_base, next_base : QWord; unit_length: QWord; { Returns the next Byte from the input stream, or -1 if there has been an error } function ReadNext() : Longint; overload; var bytesread : Longint; b : Byte; begin ReadNext := -1; if (dli.Position < next_base) then begin bytesread := dli.Read(b, sizeof(b)); ReadNext := b; if (bytesread <> 1) then ReadNext := -1; end; end; { Reads the next size bytes into dest. Returns true if successful, false otherwise. Note that dest may be partially overwritten after returning false. } function ReadNext(var dest; size : SizeInt) : Boolean; overload; var bytesread : SizeInt; begin bytesread := 0; if ((dli.Position + size) < next_base) then begin bytesread := dli.Read(dest, size); end; ReadNext := (bytesread = size); end; { Reads an unsigned LEB encoded number from the input stream } function ReadULEB128() : QWord; var shift : Byte; data : PtrInt; val : QWord; begin shift := 0; result := 0; data := ReadNext(); while (data <> -1) do begin val := data and $7f; result := result or (val shl shift); inc(shift, 7); if ((data and $80) = 0) then break; data := ReadNext(); end; end; { Reads a signed LEB encoded number from the input stream } function ReadLEB128() : Int64; var shift : Byte; data : PtrInt; val : Int64; begin shift := 0; result := 0; data := ReadNext(); while (data <> -1) do begin val := data and $7f; result := result or (val shl shift); inc(shift, 7); if ((data and $80) = 0) then break; data := ReadNext(); end; { extend sign. Note that we can not use shl/shr since the latter does not translate to arithmetic shifting for signed types } result := (not ((result and (1 shl (shift-1)))-1)) or result; end; procedure SkipULEB128(); var temp : QWord; begin temp := ReadULEB128(); DEBUG_WRITELN('Skipping ULEB128 : ', temp); end; procedure SkipLEB128(); var temp : Int64; begin temp := ReadLEB128(); DEBUG_WRITELN('Skipping LEB128 : ', temp); end; function ReadString(): ansistring; var a: ansichar; begin Result:= ''; while (true) do begin dli.Read(a, sizeof(a)); if a = #0 then Exit; Result+= a; end; end; function CalculateAddressIncrement(_opcode : Integer; const header : TLineNumberProgramHeader64) : Int64; begin Result := _opcode - header.opcode_base; // adjusted_opcode Result := (Result div header.line_range) * header.minimum_instruction_length; end; { initializes the line info state to the default values } procedure InitStateRegisters(var state : TMachineState; const header : TLineNumberProgramHeader64); begin with state do begin address := 0; file_id := 1; line := 1; column := 0; is_stmt := header.default_is_stmt; basic_block := false; end_sequence := false; prolouge_end := false; epilouge_begin := false; isa := 0; append_row := false; first_row := true; end; end; { Skips all line info directory entries } procedure SkipDirectories(); var s : ShortString; begin while (true) do begin s := ReadString(); if (s = '') then break; DEBUG_WRITELN('Skipping directory : ', s); end; end; { Skips the filename section from the current file stream } procedure SkipFilenames(); var s : ShortString; begin while (true) do begin s := ReadString(); if (s = '') then break; DEBUG_WRITELN('Skipping filename : ', s); SkipULEB128(); { skip the directory index for the file } SkipULEB128(); { skip last modification time for file } SkipULEB128(); { skip length of file } end; end; function GetFullFilename(const filenameStart, directoryStart : Int64; const file_id : DWord) : ShortString; var i : DWord; filename, directory : ShortString; dirindex : QWord; {$IFDEF DEBUG_DWARF_PARSER} oldPos: Int64; {$ENDIF} begin filename := ''; directory := ''; i := 1; {$IFDEF DEBUG_DWARF_PARSER} oldPos := dli.Position; {$ENDIF} dli.Seek(filenameStart, soBeginning); while (i <= file_id) do begin filename := ReadString(); DEBUG_WRITELN('Found "', filename, '"'); if (filename = '') then break; dirindex := ReadULEB128(); { read the directory index for the file } SkipULEB128(); { skip last modification time for file } SkipULEB128(); { skip length of file } inc(i); end; { if we could not find the file index, exit } if (filename = '') then begin GetFullFilename := ''; end else begin dli.Seek(directoryStart, soBeginning); i := 1; while (i <= dirindex) do begin directory := ReadString(); if (directory = '') then break; inc(i); end; if (directory<>'') and (directory[length(directory)]<>'/') then directory:=directory+'/'; GetFullFilename := directory + filename; end; {$IFDEF DEBUG_DWARF_PARSER} dli.Position := oldPos; {$ENDIF} end; function ParseCompilationUnit(const addr : PtrUInt) : Boolean; var state : TMachineState; { we need both headers on the stack, although we only use the 64 bit one internally } header64 : TLineNumberProgramHeader64; header32 : TLineNumberProgramHeader32; header_length: QWord; {$ifdef DEBUG_DWARF_PARSER}s : ShortString;{$endif} adjusted_opcode : Int64; opcode, extended_opcode : Integer; extended_opcode_length : PtrInt; addrIncrement, lineIncrement: PtrInt; numoptable : array[1..255] of Byte; { the offset into the file where the include directories are stored for this compilation unit } include_directories : Int64; { the offset into the file where the file names are stored for this compilation unit } file_names : Int64; i: integer; prev_line : QWord; prev_column : DWord; prev_file : DWord; { Reads an address from the current input stream } function ReadAddress() : PtrUInt; begin ReadNext(Result, sizeof(PtrUInt)); end; { Reads an unsigned Half from the current input stream } function ReadUHalf() : Word; begin dli.Read(Result, SizeOf(Result)); end; begin Result := False; // Not found yet. // First DWORD is either unit length of 32-bit or magic value of 64-bit DWARF. dli.Seek(unit_base, soBeginning); dli.Read(header64.magic, sizeof(header64.magic)); dli.Seek(-sizeof(header64.magic), soCurrent); if (header64.magic <> $ffffffff) then begin DEBUG_WRITELN('32 bit DWARF detected'); dli.Read(header32, sizeof(header32)); header64.magic := $ffffffff; header64.unit_length := header32.unit_length; header64.version := header32.version; header64.length := header32.length; header64.minimum_instruction_length := header32.minimum_instruction_length; header64.default_is_stmt := header32.default_is_stmt; header64.line_base := header32.line_base; header64.line_range := header32.line_range; header64.opcode_base := header32.opcode_base; header_length := QWord(header32.length) + sizeof(header32.length) + sizeof(header32.version) + sizeof(header32.unit_length); unit_length := QWord(header32.unit_length) + sizeof(header32.unit_length); end else begin DEBUG_WRITELN('64 bit DWARF detected'); dli.Read(header64, sizeof(header64)); header_length := header64.length + sizeof(header64.magic) + sizeof(header64.length) + sizeof(header64.version) + sizeof(header64.unit_length); unit_length := header64.unit_length + sizeof(header64.magic) + sizeof(header64.unit_length); end; next_base:= unit_base + unit_length; // Read opcodes lengths table. fillchar(numoptable, sizeof(numoptable), #0); if not ReadNext(numoptable, header64.opcode_base - 1) then Exit; DEBUG_WRITELN('Opcode parameter count table'); for i := 1 to header64.opcode_base - 1 do begin DEBUG_WRITELN('Opcode[', i, '] - ', numoptable[i], ' parameters'); end; DEBUG_WRITELN('Reading directories...'); include_directories := dli.Position; SkipDirectories(); DEBUG_WRITELN('Reading filenames...'); file_names := dli.Position; SkipFilenames(); // Position stream after header to read state machine code. dli.Seek(unit_base + header_length, soBeginning); InitStateRegisters(state, header64); opcode := ReadNext(); while (opcode <> -1) do begin case (opcode) of { extended opcode } 0 : begin extended_opcode_length := ReadULEB128(); extended_opcode := ReadNext(); if extended_opcode = -1 then break; case (extended_opcode) of DW_LNE_END_SEQUENCE : begin state.end_sequence := true; state.append_row := true; DEBUG_WRITELN('DW_LNE_END_SEQUENCE'); end; DW_LNE_SET_ADDRESS : begin // Size of address should be extended_opcode_length - 1. state.address := ReadAddress(); DEBUG_WRITELN('DW_LNE_SET_ADDRESS (', hexstr(pointer(state.address)), ')'); end; DW_LNE_DEFINE_FILE : begin {$ifdef DEBUG_DWARF_PARSER}s := {$endif}ReadString(); SkipULEB128(); SkipULEB128(); SkipULEB128(); DEBUG_WRITELN('DW_LNE_DEFINE_FILE (', s, ')'); end; else begin DEBUG_WRITELN('Unknown extended opcode ', extended_opcode, ' (length ', extended_opcode_length, ')'); dli.Position:= dli.Position + extended_opcode_length - 1; end; end; end; DW_LNS_COPY : begin state.basic_block := false; state.prolouge_end := false; state.epilouge_begin := false; state.append_row := true; DEBUG_WRITELN('DW_LNS_COPY'); end; DW_LNS_ADVANCE_PC : begin state.address := state.address + ReadULEB128() * header64.minimum_instruction_length; DEBUG_WRITELN('DW_LNS_ADVANCE_PC (', hexstr(state.address, sizeof(state.address)*2), ')'); end; DW_LNS_ADVANCE_LINE : begin state.line := state.line + ReadLEB128(); DEBUG_WRITELN('DW_LNS_ADVANCE_LINE (', state.line, ')'); end; DW_LNS_SET_FILE : begin state.file_id := ReadULEB128(); DEBUG_WRITELN('DW_LNS_SET_FILE (', state.file_id, ')'); end; DW_LNS_SET_COLUMN : begin state.column := ReadULEB128(); DEBUG_WRITELN('DW_LNS_SET_COLUMN (', state.column, ')'); end; DW_LNS_NEGATE_STMT : begin state.is_stmt := not state.is_stmt; DEBUG_WRITELN('DW_LNS_NEGATE_STMT (', state.is_stmt, ')'); end; DW_LNS_SET_BASIC_BLOCK : begin state.basic_block := true; DEBUG_WRITELN('DW_LNS_SET_BASIC_BLOCK'); end; DW_LNS_CONST_ADD_PC : begin state.address := state.address + CalculateAddressIncrement(255, header64); DEBUG_WRITELN('DW_LNS_CONST_ADD_PC (', hexstr(state.address, sizeof(state.address)*2), ')'); end; DW_LNS_FIXED_ADVANCE_PC : begin state.address := state.address + ReadUHalf(); DEBUG_WRITELN('DW_LNS_FIXED_ADVANCE_PC (', hexstr(state.address, sizeof(state.address)*2), ')'); end; DW_LNS_SET_PROLOGUE_END : begin state.prolouge_end := true; DEBUG_WRITELN('DW_LNS_SET_PROLOGUE_END'); end; DW_LNS_SET_EPILOGUE_BEGIN : begin state.epilouge_begin := true; DEBUG_WRITELN('DW_LNS_SET_EPILOGUE_BEGIN'); end; DW_LNS_SET_ISA : begin state.isa := ReadULEB128(); DEBUG_WRITELN('DW_LNS_SET_ISA (', state.isa, ')'); end; else begin { special opcode } if (opcode < header64.opcode_base) then begin DEBUG_WRITELN('Unknown standard opcode $', hexstr(opcode, 2), '; skipping'); for i := 1 to numoptable[opcode] do SkipLEB128(); end else begin adjusted_opcode := opcode - header64.opcode_base; addrIncrement := CalculateAddressIncrement(opcode, header64); state.address := state.address + addrIncrement; lineIncrement := header64.line_base + (adjusted_opcode mod header64.line_range); state.line := state.line + lineIncrement; DEBUG_WRITELN('Special opcode $', hexstr(opcode, 2), ' address increment: ', addrIncrement, ' new line: ', lineIncrement); state.basic_block := false; state.prolouge_end := false; state.epilouge_begin := false; state.append_row := true; end; end; end; //case if (state.append_row) then begin {$IFDEF DEBUG_DWARF_PARSER} Writeln('Address = ', hexstr(pointer(state.address)), ', file_id = ', state.file_id, ', file = ' , GetFullFilename(file_names, include_directories, state.file_id), ', line = ', state.line, ' column = ', state.column); {$ENDIF} if (state.first_row) then begin if (state.address > addr) then break; state.first_row := false; end; { when we have found the address we need to return the previous line because that contains the call instruction } if (state.address >= addr) then begin line := prev_line; column := prev_column; sourceFile := GetFullFilename(file_names, include_directories, prev_file); Exit(True); end else begin { save line information } prev_file := state.file_id; prev_line := state.line; prev_column := state.column; end; state.append_row := false; if (state.end_sequence) then begin // Reset state machine when sequence ends. InitStateRegisters(state, header64); end; end; opcode := ReadNext(); end; //while end; type TPathType = ( ptNone, ptRelative, ptAbsolute ); function GetPathType(sPath : String): TPathType; begin Result := ptNone; {$IFDEF MSWINDOWS} {check for drive/unc info} if ( Pos( '\\', sPath ) > 0 ) or ( Pos( DriveDelim, sPath ) > 0 ) then {$ENDIF MSWINDOWS} {$IFDEF UNIX} { UNIX absolute paths start with a slash } if (sPath[1] = PathDelim) then {$ENDIF UNIX} Result := ptAbsolute else if ( Pos( PathDelim, sPath ) > 0 ) then Result := ptRelative; end; function ExpandAbsolutePath(Path: String): String; var I, J: Integer; begin {First remove all references to '\.\'} I := Pos (DirectorySeparator + '.' + DirectorySeparator, Path); while I <> 0 do begin Delete (Path, I, 2); I := Pos (DirectorySeparator + '.' + DirectorySeparator, Path); end; {Then remove all references to '\..\'} I := Pos (DirectorySeparator + '..', Path); while (I <> 0) do begin J := Pred (I); while (J > 0) and (Path [J] <> DirectorySeparator) do Dec (J); if (J = 0) then Delete (Path, I, 3) else Delete (Path, J, I - J + 3); I := Pos (DirectorySeparator + '..', Path); end; Result := Path; end; function GetAbsoluteFileName(const sPath, sRelativeFileName : String) : String; begin case GetPathType(sRelativeFileName) of ptNone, ptRelative: Result := ExpandAbsolutePath(sPath + sRelativeFileName); else Result := sRelativeFileName; end; end; var i: Integer; dc, ts: TStream; DwarfLineInfo: Pointer; externalFile: AnsiString; DwarfSize: Qword; base_addr: Pointer; ExeImageBase: QWord; begin Result := False; moduleFile := ''; sourceFile := ''; line := -1; column := -1; LineInfoError:= ''; GetModuleByAddr(addr, base_addr, moduleFile); if moduleFile = '' then Exit(False); // No module found at this address. // Never read modules or .zdli files from current directory. // If module path is relative make it relative to BaseModulePath. // (for example ./doublecmd must be expanded). moduleFile := GetAbsoluteFileName(BaseModulePath, moduleFile); DEBUG_WRITELN('Module ', moduleFile, ' at $', hexStr(base_addr)); try try { First, try the external file with line information. Failing that, try to parse the executable itself } externalFile := DlnNameByExename(moduleFile); i:= -1; repeat DEBUG_WRITELN('Checking external file: ', externalFile); if FileExists(externalFile) then break else externalFile := ''; inc(i); if i > high(LineInfoPaths) then break; // Check additional paths. externalFile := GetAbsoluteFileName(BaseModulePath, LineInfoPaths[i]); externalFile := IncludeTrailingPathDelimiter(externalFile) + DlnNameByExename(ExtractFileName(moduleFile)); until False; if externalFile <> '' //and (FileAge(moduleFile) <= FileAge(externalFile)) then begin DEBUG_WRITELN('Reading debug info from external file ', externalFile); //the compression streams are unable to seek, //so we decompress to a memory stream first. ts := TFileStream.Create(externalFile, fmOpenRead or fmShareDenyNone); dc := TDecompressionStream.Create(ts); dli := TMemoryStream.Create; dc.Read(DwarfSize, SizeOf(DwarfSize)); // 8 bytes (QWORD) dc.Read(ExeImageBase, SizeOf(ExeImageBase)); // 8 bytes (QWORD) dli.CopyFrom(dc, DwarfSize); FreeAndNil(dc); FreeAndNil(ts); end else begin DEBUG_WRITELN('Reading debug info from ', moduleFile); if not ExtractDwarfLineInfo(moduleFile, DwarfLineInfo, DwarfSize, ExeImageBase) then begin DEBUG_WRITELN('Debug info not found.'); LineInfoError:= ExtractDwarfLineInfoError; Exit(false); end; dli:= TMemoryStream.Create; dli.Write(DwarfLineInfo^, DwarfSize); FreeMem(DwarfLineInfo); end; DEBUG_WRITELN('dwarf line info: ', dli.size, ' bytes.'); // Account for the possible relocation (in 99% cases ExeImagebase = base_addr) {$PUSH} {$overflowchecks off} {$rangechecks off} addr := addr - base_addr + Pointer(ExeImageBase); {$POP} next_base := 0; while next_base < dli.Size do begin unit_base := next_base; if ParseCompilationUnit(PtrUInt(addr)) then break; // Found line info end; Result := True; except LineInfoError := 'Crashed parsing the dwarf line info: ' + (ExceptObject as Exception).Message; Result := False; end; finally if Assigned(dli) then FreeAndNil(dli); end; if not Result then DEBUG_WRITELN('Cannot read DWARF debug line info: ', LineInfoError); end; initialization InitLineInfo; end. doublecmd-0.5.8/src/fFindDlg.lrt0000644000175000017500000000567712045446211015513 0ustar alexxalexxTFRMFINDDLG.CAPTION=Find files TFRMFINDDLG.TSSTANDARD.CAPTION=Standard TFRMFINDDLG.GBDIRECTORIES.CAPTION=Directories TFRMFINDDLG.LBLFINDPATHSTART.CAPTION=Start in &directory TFRMFINDDLG.CBFOLLOWSYMLINKS.CAPTION=Follow s&ymlinks TFRMFINDDLG.LBLEXCLUDEDIRECTORIES.CAPTION=E&xclude subdirectories TFRMFINDDLG.CMBEXCLUDEDIRECTORIES.HINT=Enter directories names that should be excluded from search separated with ";" TFRMFINDDLG.LBLSEARCHDEPTH.CAPTION=Search su&bdirectories: TFRMFINDDLG.CBSELECTEDFILES.CAPTION=Selected directories and &files TFRMFINDDLG.GBFILES.CAPTION=Files TFRMFINDDLG.LBLFINDFILEMASK.CAPTION=&File mask TFRMFINDDLG.CMBFINDFILEMASK.HINT=Enter files names separated with ";" TFRMFINDDLG.CMBFINDFILEMASK.TEXT=* TFRMFINDDLG.LBLEXCLUDEFILES.CAPTION=&Exclude files TFRMFINDDLG.CMBEXCLUDEFILES.HINT=Enter files names that should be excluded from search separated with ";" TFRMFINDDLG.CBPARTIALNAMESEARCH.CAPTION=Searc&h for part of file name TFRMFINDDLG.CBREGEXP.CAPTION=&Regular expression TFRMFINDDLG.GBFINDDATA.CAPTION=Find Data TFRMFINDDLG.LBLENCODING.CAPTION=Encodin&g: TFRMFINDDLG.CBCASESENS.CAPTION=Case sens&itive TFRMFINDDLG.CBNOTCONTAININGTEXT.CAPTION=Find files N&OT containing the text TFRMFINDDLG.CBFINDTEXT.CAPTION=Find &text in file TFRMFINDDLG.CBREPLACETEXT.CAPTION=Re&place by TFRMFINDDLG.TSADVANCED.CAPTION=Advanced TFRMFINDDLG.CBDATEFROM.CAPTION=&Date from: TFRMFINDDLG.CBNOTOLDERTHAN.CAPTION=N&ot older than: TFRMFINDDLG.CBFILESIZEFROM.CAPTION=S&ize from: TFRMFINDDLG.CBDATETO.CAPTION=Dat&e to: TFRMFINDDLG.CBFILESIZETO.CAPTION=Si&ze to: TFRMFINDDLG.CBTIMEFROM.CAPTION=&Time from: TFRMFINDDLG.CBTIMETO.CAPTION=Ti&me to: TFRMFINDDLG.LBLATTRIBUTES.CAPTION=Attri&butes TFRMFINDDLG.BTNADDATTRIBUTE.CAPTION=&Add TFRMFINDDLG.BTNATTRSHELP.CAPTION=&Help TFRMFINDDLG.TSPLUGINS.CAPTION=Plugins TFRMFINDDLG.CBUSEPLUGIN.CAPTION=&Use search plugin: TFRMFINDDLG.TSLOADSAVE.CAPTION=Load/Save TFRMFINDDLG.LBLTEMPLATEHEADER.CAPTION=&Previous searches: TFRMFINDDLG.BTNSEARCHLOAD.CAPTION=L&oad TFRMFINDDLG.BTNSEARCHSAVE.CAPTION=S&ave TFRMFINDDLG.BTNSEARCHSAVEWITHSTARTINGPATH.HINT=If saved then "Start in directory" will be restored when loading template. Use it if you want to fix searching to a certain directory TFRMFINDDLG.BTNSEARCHSAVEWITHSTARTINGPATH.CAPTION=Sa&ve with "Start in directory" TFRMFINDDLG.BTNSEARCHDELETE.CAPTION=&Delete TFRMFINDDLG.TSRESULTS.CAPTION=Results TFRMFINDDLG.BTNWORKWITHFOUND.CAPTION=Feed to &listbox TFRMFINDDLG.BTNGOTOPATH.CAPTION=&Go to file TFRMFINDDLG.BTNVIEW.CAPTION=&View TFRMFINDDLG.BTNEDIT.CAPTION=&Edit TFRMFINDDLG.BTNUSETEMPLATE.CAPTION=Use template TFRMFINDDLG.BTNSAVETEMPLATE.CAPTION=&Save TFRMFINDDLG.BTNSTART.CAPTION=&Start TFRMFINDDLG.BTNSTOP.CAPTION=C&ancel TFRMFINDDLG.BTNCLOSE.CAPTION=&Close TFRMFINDDLG.BTNNEWSEARCH.CAPTION=&New search TFRMFINDDLG.BTNLASTSEARCH.CAPTION=&Last search TFRMFINDDLG.MISHOWINVIEWER.CAPTION=Show In Viewer TFRMFINDDLG.MIREMOVEFROMLLIST.CAPTION=Remove from list TFRMFINDDLG.MISHOWALLFOUND.CAPTION=Show all found items doublecmd-0.5.8/src/feditsearch.lfm0000644000175000017500000001412012023046500016244 0ustar alexxalexxinherited frmEditSearchReplace: TfrmEditSearchReplace Left = 526 Height = 278 Top = 190 Width = 409 ActiveControl = cbSearchText AutoSize = True BorderIcons = [biSystemMenu] BorderStyle = bsDialog ChildSizing.TopBottomSpacing = 6 ClientHeight = 278 ClientWidth = 409 OnCloseQuery = FormCloseQuery OnShow = FormShow Position = poOwnerFormCenter object lblSearchFor: TLabel[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = cbSearchText AnchorSideTop.Side = asrCenter Left = 12 Height = 18 Top = 17 Width = 72 BorderSpacing.Left = 12 Caption = '&Search for:' FocusControl = cbSearchText ParentColor = False end object lblReplaceWith: TLabel[1] AnchorSideLeft.Control = Owner AnchorSideTop.Control = cbReplaceText AnchorSideTop.Side = asrCenter Left = 12 Height = 18 Top = 51 Width = 89 BorderSpacing.Left = 12 Caption = '&Replace with:' FocusControl = cbReplaceText ParentColor = False end object cbSearchText: TComboBox[2] AnchorSideLeft.Control = lblSearchFor AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 90 Height = 28 Top = 12 Width = 311 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 BorderSpacing.Top = 12 BorderSpacing.Right = 8 ItemHeight = 0 TabOrder = 0 end object gbSearchOptions: TGroupBox[3] AnchorSideLeft.Control = Owner AnchorSideTop.Control = cbReplaceText AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnOK Left = 12 Height = 148 Top = 86 Width = 197 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Left = 12 BorderSpacing.Top = 12 BorderSpacing.Right = 6 Caption = 'Option' ClientHeight = 125 ClientWidth = 193 TabOrder = 2 object cbSearchCaseSensitive: TCheckBox AnchorSideLeft.Control = gbSearchOptions AnchorSideTop.Control = gbSearchOptions Left = 8 Height = 23 Top = 2 Width = 123 BorderSpacing.Left = 8 BorderSpacing.Top = 2 Caption = 'C&ase sensitivity' TabOrder = 0 end object cbSearchWholeWords: TCheckBox AnchorSideLeft.Control = gbSearchOptions AnchorSideTop.Control = cbSearchCaseSensitive AnchorSideTop.Side = asrBottom Left = 8 Height = 23 Top = 27 Width = 143 BorderSpacing.Left = 8 BorderSpacing.Top = 2 Caption = '&Whole words only' TabOrder = 1 end object cbSearchSelectedOnly: TCheckBox AnchorSideLeft.Control = gbSearchOptions AnchorSideTop.Control = cbSearchWholeWords AnchorSideTop.Side = asrBottom Left = 8 Height = 23 Top = 52 Width = 145 BorderSpacing.Left = 8 BorderSpacing.Top = 2 Caption = 'Selected &text only' TabOrder = 2 end object cbSearchFromCursor: TCheckBox AnchorSideLeft.Control = gbSearchOptions AnchorSideTop.Control = cbSearchSelectedOnly AnchorSideTop.Side = asrBottom Left = 8 Height = 23 Top = 77 Width = 139 BorderSpacing.Left = 8 BorderSpacing.Top = 2 Caption = 'S&earch from caret' TabOrder = 3 end object cbSearchRegExp: TCheckBox AnchorSideLeft.Control = gbSearchOptions AnchorSideTop.Control = cbSearchFromCursor AnchorSideTop.Side = asrBottom Left = 8 Height = 23 Top = 102 Width = 155 BorderSpacing.Left = 8 BorderSpacing.Top = 2 Caption = '&Regular expressions' TabOrder = 4 end end object rgSearchDirection: TRadioGroup[4] AnchorSideLeft.Control = gbSearchOptions AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cbReplaceText AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 215 Height = 88 Top = 86 Width = 186 Anchors = [akTop, akLeft, akRight] AutoFill = True BorderSpacing.Left = 6 BorderSpacing.Top = 12 BorderSpacing.Right = 8 Caption = 'Direction' ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ChildSizing.EnlargeHorizontal = crsHomogenousChildResize ChildSizing.EnlargeVertical = crsHomogenousChildResize ChildSizing.ShrinkHorizontal = crsScaleChilds ChildSizing.ShrinkVertical = crsScaleChilds ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 65 ClientWidth = 182 Items.Strings = ( '&Forward' '&Backward' ) TabOrder = 3 end object cbReplaceText: TComboBox[5] AnchorSideLeft.Control = lblReplaceWith AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cbSearchText AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 107 Height = 28 Top = 46 Width = 294 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 BorderSpacing.Top = 6 BorderSpacing.Right = 8 ItemHeight = 0 TabOrder = 1 end object btnOK: TBitBtn[6] AnchorSideTop.Control = gbSearchOptions AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnCancel AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 215 Height = 31 Top = 234 Width = 90 Anchors = [akTop, akRight] BorderSpacing.Right = 6 BorderSpacing.Bottom = 4 Caption = '&OK' Default = True Kind = bkOK ModalResult = 1 OnClick = btnOKClick TabOrder = 4 end object btnCancel: TBitBtn[7] AnchorSideTop.Control = gbSearchOptions AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 311 Height = 31 Top = 234 Width = 90 Anchors = [akTop, akRight] BorderSpacing.Right = 8 BorderSpacing.Bottom = 4 Cancel = True Caption = '&Cancel' Kind = bkCancel ModalResult = 2 TabOrder = 5 end end doublecmd-0.5.8/src/usyneditfiler.pas0000644000175000017500000001501712014201074016663 0ustar alexxalexx{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. Alternatively, the contents of this file may be used under the terms of the GNU General Public License Version 2 or later (the "GPL"), in which case the provisions of the GPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. } unit uSynEditFiler; {$mode objfpc}{$H+} interface uses Classes, SysUtils, SynEditLines, FPCAdds, DCClassesUtf8; type { TSynEditFiler } TSynEditFiler = class(TObject) private FLineEndString: String; FLineEndLen: Integer; FLineEndType: TSynLinesFileLineEndType; procedure SetLineEndType(const AValue: TSynLinesFileLineEndType); protected fBuffer: PChar; fBufPtr: Cardinal; fBufSize: Cardinal; fFiler: TFileStreamEx; procedure Flush; virtual; procedure SetBufferSize(NewSize: Cardinal); public constructor Create; destructor Destroy; override; public property LineEndType: TSynLinesFileLineEndType read FLineEndType write SetLineEndType; end; { TSynEditFileReader } TSynEditFileReader = class(TSynEditFiler) protected fEOF: Boolean; fFilePos: TStreamSeekType; fFileSize: TStreamSeekType; procedure FillBuffer; public constructor Create(const aFileName: UTF8String); function ReadLine: string; property EOF: Boolean read fEOF; end; { TSynEditFileWriter } TSynEditFileWriter = class(TSynEditFiler) protected procedure Flush; override; public constructor Create(const FileName: string); procedure Write(const S: string); procedure WriteLine(const S: string); end; implementation constructor TSynEditFiler.Create; const kByte = 1024; begin inherited Create; LineEndType := sfleSystem; SetBufferSize(16 * kByte); fBuffer[0] := #0; end; destructor TSynEditFiler.Destroy; begin Flush; fFiler.Free; SetBufferSize(0); inherited Destroy; end; procedure TSynEditFiler.SetLineEndType(const AValue: TSynLinesFileLineEndType); begin FLineEndType := AValue; case FLineEndType of sfleCrLf: FLineEndString := #13#10; sfleCr: FLineEndString := #13; sfleLf: FLineEndString := #10; else FLineEndString := LineEnding; end; FLineEndLen := length(FLineEndString); end; procedure TSynEditFiler.Flush; begin end; procedure TSynEditFiler.SetBufferSize(NewSize: Cardinal); begin if NewSize <> fBufSize then begin ReallocMem(fBuffer, NewSize); fBufSize := NewSize; end; end; constructor TSynEditFileReader.Create(const aFileName: UTF8String); begin inherited Create; fEOF := False; fFiler := TFileStreamEx.Create(aFileName, fmOpenRead or fmShareDenyNone); fFileSize := fFiler.Size; fFiler.Seek(0, soFromBeginning); end; procedure TSynEditFileReader.FillBuffer; var Count: Cardinal; begin if fBufPtr >= fBufSize - 1 then fBufPtr := 0; Count := fFileSize - fFilePos; if Count >= fBufSize - fBufPtr then Count := fBufSize - fBufPtr - 1; fFiler.ReadBuffer(fBuffer[fBufPtr], Count); fBuffer[fBufPtr + Count] := #0; fFilePos := fFilePos + Count; fBufPtr := 0; end; function TSynEditFileReader.ReadLine: string; var E, P, S: PChar; begin Result := ''; repeat if (fBuffer[fBufPtr] = #0) and (fFilePos >= fFileSize) then begin fEOF := True; Result := EmptyStr; Exit; end; S := PChar(@fBuffer[fBufPtr]); if S[0] = #0 then begin FillBuffer; S := PChar(@fBuffer[0]); end; E := PChar(@fBuffer[fBufSize]); P := S; while P + 2 < E do begin case P[0] of #10, #13: begin SetString(Result, S, P - S); // a single #13 is used in Mac OS files if (P[0] = #13) then begin if (P[1] = #10) then begin FLineEndType := sfleCrLf; inc(P); end else FLineEndType := sfleCr; end else FLineEndType := sfleLf; Inc(P); fBufPtr := P - fBuffer; Exit; end; #0: if fFilePos >= fFileSize then begin fEOF := True; fBufPtr := P - fBuffer; SetString(Result, S, P - S); Exit; end; end; Inc(P); end; // put the partial string to the start of the buffer, and refill the buffer Inc(P); if S > fBuffer then StrLCopy(fBuffer, S, P - S); fBufPtr := P - S; fBuffer[fBufPtr] := #0; // if line is longer than half the buffer then grow it first if 2 * Cardinal(P - S) > fBufSize then SetBufferSize(fBufSize + fBufSize); until FALSE; end; constructor TSynEditFileWriter.Create(const FileName: string); begin inherited Create; fFiler := TFileStreamEx.Create(FileName, fmCreate); fFiler.Seek(0, soFromBeginning); end; procedure TSynEditFileWriter.Flush; begin if fBufPtr > 0 then begin fFiler.WriteBuffer(fBuffer[0], fBufPtr); fBufPtr := 0; end; end; procedure TSynEditFileWriter.Write(const S: string); var L: Cardinal; begin L := Length(S); repeat if fBufPtr + L <= fBufSize then begin if L > 0 then begin Move(S[1], fBuffer[fBufPtr], L); fBufPtr := fBufPtr + L; end; Exit; end; Flush; if L > fBufSize then SetBufferSize(L); until FALSE; end; procedure TSynEditFileWriter.WriteLine(const S: string); var L: Cardinal; begin L := Length(S); repeat if fBufPtr + L + FLineEndLen <= fBufSize then begin if L > 0 then begin Move(S[1], fBuffer[fBufPtr], L); fBufPtr := fBufPtr + L; end; Move(FLineEndString[1], fBuffer[fBufPtr], FLineEndLen); Inc(fBufPtr, FLineEndLen); exit; end; Flush; if L + FLineEndLen > fBufSize then SetBufferSize(L + FLineEndLen); until FALSE; end; end. doublecmd-0.5.8/src/uconvencoding.pas0000644000175000017500000002675311740433676016673 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Encoding conversion and related stuff Copyright (C) 2011 Alexander Koblov (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uConvEncoding; {$mode delphi} interface function DetectEncoding(const s: string): string; implementation uses SysUtils, Classes, LCLProc, LConvEncoding, GetText, nsCore, nsUniversalDetector; var Lang, FallbackLang: AnsiString; SupportedEncodings: TStringList = nil; type TMyCodePages = (cp1251, cpKOI8R, cp866); const scCodePage : array[TMyCodePages] of AnsiString = ( // CP1251 (WINDOWS) #$C0#$E0 + // Аа #$C1#$E1 + // Бб #$C2#$E2 + // Вв #$C3#$E3 + // Гг #$C4#$E4 + // Дд #$C5#$E5 + // Ее #$A8#$B8 + // Ёё #$C6#$E6 + // Жж #$C7#$E7 + // Зз #$C8#$E8 + // Ии #$C9#$E9 + // Йй #$CA#$EA + // Кк #$CB#$EB + // Лл #$CC#$EC + // Мм #$CD#$ED + // Нн #$CE#$EE + // Оо #$CF#$EF + // Пп #$D0#$F0 + // Рр #$D1#$F1 + // Сс #$D2#$F2 + // Тт #$D3#$F3 + // Уу #$D4#$F4 + // Фф #$D5#$F5 + // Хх #$D6#$F6 + // Цц #$D7#$F7 + // Чч #$D8#$F8 + // Шш #$D9#$F9 + // Щщ #$DA#$FA + // Ъъ #$DB#$FB + // Ыы #$DC#$FC + // Ьь #$DD#$FD + // Ээ #$DE#$FE + // Юю #$DF#$FF , // Яя // KOI8-R (UNIX) #$E1#$C1 + // Аа #$E2#$C2 + // Бб #$F7#$D7 + // Вв #$E7#$C7 + // Гг #$E4#$C4 + // Дд #$E5#$C5 + // Ее #$B3#$A3 + // Ёё #$F6#$D6 + // Жж #$FA#$DA + // Зз #$E9#$C9 + // Ии #$EA#$CA + // Йй #$EB#$CB + // Кк #$EC#$CC + // Лл #$ED#$CD + // Мм #$EE#$CE + // Нн #$EF#$CF + // Оо #$F0#$D0 + // Пп #$F2#$D2 + // Рр #$F3#$D3 + // Сс #$F4#$D4 + // Тт #$F5#$D5 + // Уу #$E6#$C6 + // Фф #$E8#$C8 + // Хх #$E3#$C3 + // Цц #$FE#$DE + // Чч #$FB#$DB + // Шш #$FD#$DD + // Щщ #$FF#$DF + // Ъъ #$F9#$D9 + // Ыы #$F8#$D8 + // Ьь #$FC#$DC + // Ээ #$E0#$C0 + // Юю #$F1#$D1 , // Яя // CP866 (DOS) #$80#$A0 + // Аа #$81#$A1 + // Бб #$82#$A2 + // Вв #$83#$A3 + // Гг #$84#$A4 + // Дд #$85#$A5 + // Ее #$F0#$F1 + // Ёё #$86#$A6 + // Жж #$87#$A7 + // Зз #$88#$A8 + // Ии #$89#$A9 + // Йй #$8A#$AA + // Кк #$8B#$AB + // Лл #$8C#$AC + // Мм #$8D#$AD + // Нн #$8E#$AE + // Оо #$8F#$AF + // Пп #$90#$E0 + // Рр #$91#$E1 + // Сс #$92#$E2 + // Тт #$93#$E3 + // Уу #$94#$E4 + // Фф #$95#$E5 + // Хх #$96#$E6 + // Цц #$97#$E7 + // Чч #$98#$E8 + // Шш #$99#$E9 + // Щщ #$9A#$EA + // Ъъ #$9B#$EB + // Ыы #$9C#$EC + // Ьь #$9D#$ED + // Ээ #$9E#$EE + // Юю #$9F#$EF // Яя ); var svStatistic : array[AnsiChar] of Single; procedure InitStatistic; begin FillChar(svStatistic, SizeOf(svStatistic), 0); // CP1251 (WINDOWS) svStatistic[#$C0] := 0.001; // 'А' svStatistic[#$C1] := 0; // 'Б' svStatistic[#$C2] := 0.002; // 'В' svStatistic[#$C3] := 0; // 'Г' svStatistic[#$C4] := 0.001; // 'Д' svStatistic[#$C5] := 0.001; // 'Е' svStatistic[#$C6] := 0; // 'Ж' svStatistic[#$C7] := 0; // 'З' svStatistic[#$C8] := 0.001; // 'И' svStatistic[#$C9] := 0; // 'Й' svStatistic[#$CA] := 0.001; // 'К' svStatistic[#$CB] := 0; // 'Л' svStatistic[#$CC] := 0.001; // 'М' svStatistic[#$CD] := 0.001; // 'Н' svStatistic[#$CE] := 0.001; // 'О' svStatistic[#$CF] := 0.002; // 'П' svStatistic[#$D0] := 0.002; // 'Р' svStatistic[#$D1] := 0.001; // 'С' svStatistic[#$D2] := 0.001; // 'Т' svStatistic[#$D3] := 0; // 'У' svStatistic[#$D4] := 0; // 'Ф' svStatistic[#$D5] := 0; // 'Х' svStatistic[#$D6] := 0; // 'Ц' svStatistic[#$D7] := 0.001; // 'Ч' svStatistic[#$D8] := 0.001; // 'Ш' svStatistic[#$D9] := 0; // 'Щ' svStatistic[#$DA] := 0; // 'Ъ' svStatistic[#$DB] := 0; // 'Ы' svStatistic[#$DC] := 0; // 'Ь' svStatistic[#$DD] := 0.001; // 'Э' svStatistic[#$DE] := 0; // 'Ю' svStatistic[#$DF] := 0; // 'Я' svStatistic[#$E0] := 0.057; // 'а' svStatistic[#$E1] := 0.01; // 'б' svStatistic[#$E2] := 0.031; // 'в' svStatistic[#$E3] := 0.011; // 'г' svStatistic[#$E4] := 0.021; // 'д' svStatistic[#$E5] := 0.067; // 'е' svStatistic[#$E6] := 0.007; // 'ж' svStatistic[#$E7] := 0.013; // 'з' svStatistic[#$E8] := 0.052; // 'и' svStatistic[#$E9] := 0.011; // 'й' svStatistic[#$EA] := 0.023; // 'к' svStatistic[#$EB] := 0.03; // 'л' svStatistic[#$EC] := 0.024; // 'м' svStatistic[#$ED] := 0.043; // 'н' svStatistic[#$EE] := 0.075; // 'о' svStatistic[#$EF] := 0.026; // 'п' svStatistic[#$F0] := 0.038; // 'р' svStatistic[#$F1] := 0.034; // 'с' svStatistic[#$F2] := 0.046; // 'т' svStatistic[#$F3] := 0.016; // 'у' svStatistic[#$F4] := 0.001; // 'ф' svStatistic[#$F5] := 0.006; // 'х' svStatistic[#$F6] := 0.002; // 'ц' svStatistic[#$F7] := 0.011; // 'ч' svStatistic[#$F8] := 0.004; // 'ш' svStatistic[#$F9] := 0.004; // 'щ' svStatistic[#$FA] := 0; // 'ъ' svStatistic[#$FB] := 0.012; // 'ы' svStatistic[#$FC] := 0.012; // 'ь' svStatistic[#$FD] := 0.003; // 'э' svStatistic[#$FE] := 0.005; // 'ю' svStatistic[#$FF] := 0.015; // 'я' end; function MyConvertString(const S: AnsiString; const FromCP, ToCP: TMyCodePages): AnsiString; var I: Integer; C: AnsiChar; Chars: array [AnsiChar] of AnsiChar; begin Result:= S; if FromCP = ToCP then Exit; for C := #0 to #255 do Chars[C] := C; for I := 1 to Length(scCodePage[cp1251]) do Chars[scCodePage[FromCP][I]] := scCodePage[ToCP][I]; for I := 1 to Length(s) do Result[I] := Chars[Result[I]]; end; function DetectCharsetCyrillic(const S: AnsiString): AnsiString; var I: Integer; J: LongWord; C: AnsiChar; D, M: Single; T: AnsiString; CodePage: TMyCodePages; CharCount: array [AnsiChar] of Integer; begin J := 0; M := 0; T := S; FillChar(CharCount, SizeOf(CharCount), 0); for I := 1 to Length(S) do Inc(CharCount[S[I]]); // Check for CP866 encoding for C := #$80 {'А'} to #$AF {'п'} do Inc(J, CharCount[C]); if J > (Length(S) div 3) then begin Result := 'CP866'; Exit; end; for C := #$C0 {'А'} to #$FF {'я'} do M := M + sqr(CharCount[C] / Length(S) - svStatistic[C]); for CodePage := Low(TMyCodePages) to High(TMyCodePages) do begin // Convert to cp1251, because statistic in this encoding T:= MyConvertString(S, CodePage, cp1251); FillChar(CharCount, SizeOf(CharCount), 0); for I := 1 to Length(T) do Inc(CharCount[T[I]]); D := 0; for C := #$C0 {'А'} to #$FF {'я'} do D := D + sqr(CharCount[C] / Length(S) - svStatistic[C]); if D <= M then begin M := D; case CodePage of cp1251 : Result:= 'CP1251'; cpKOI8R: Result:= 'KOI-8'; cp866 : Result:= 'CP866'; end; end; end; end; function MyDetectCodePageType(const S: AnsiString): AnsiString; var Detector: TnsUniversalDetector = nil; CharsetInfo: rCharsetInfo; begin Detector:= TnsUniversalDetector.Create; try Detector.Reset; Detector.HandleData(PChar(S), Length(S)); if not Detector.Done then Detector.DataEnd; CharsetInfo:= Detector.GetDetectedCharsetInfo; case CharsetInfo.CodePage of 866: Result:= 'CP866'; 932: Result:= 'CP932'; 950: Result:= 'CP950'; 1251: Result:= 'CP1251'; 1252: Result:= 'CP1252'; 1253: Result:= 'CP1253'; 1255: Result:= 'CP1255'; 20866: Result:= 'KOI-8'; else begin Result:= CharsetInfo.Name; // When unknown encoding then use system encoding if SupportedEncodings.IndexOf(Result) < 0 then begin if (FallbackLang = 'be') or (FallbackLang = 'bg') or (FallbackLang = 'ky') or (FallbackLang = 'mk') or (FallbackLang = 'mn') or (FallbackLang = 'ru') or (FallbackLang = 'tt') then Result:= DetectCharsetCyrillic(S) else begin Result:= GetDefaultTextEncoding; if NormalizeEncoding(Result) = EncodingUTF8 then begin // the system encoding is UTF-8, but it is not UTF-8 // use ISO-8859-1 instead. This encoding has a full 1:1 mapping to unicode, // so no character is lost during conversions. Result:= 'ISO-8859-1'; end; end; end; end; end; finally FreeAndNil(Detector); end; end; function DetectEncoding(const s: string): string; function CompareI(p1, p2: PChar; Count: integer): boolean; var i: Integer; Chr1: Byte; Chr2: Byte; begin for i:=1 to Count do begin Chr1 := byte(p1^); Chr2 := byte(p2^); if Chr1<>Chr2 then begin if Chr1 in [97..122] then dec(Chr1,32); if Chr2 in [97..122] then dec(Chr2,32); if Chr1<>Chr2 then exit(false); end; inc(p1); inc(p2); end; Result:=true; end; var l: Integer; p: Integer; EndPos: LongInt; i: LongInt; begin l:= Length(s); if l = 0 then begin Result:= GetDefaultTextEncoding; Exit; end; // try UTF-8 BOM (Byte Order Mark) if CompareI(@s[1],#$EF#$BB#$BF,3) then begin Result:=EncodingUTF8BOM; exit; end; // try ucs-2le BOM FF FE if (length(s)>=2) and (s[1]=#$FF) and (s[2]=#$FE) then begin Result:=EncodingUCS2LE; exit; end; // try ucs-2be BOM FE FF if (length(s)>=2) and (s[1]=#$FE) and (s[2]=#$FF) then begin Result:=EncodingUCS2BE; exit; end; // try {%encoding eee} if CompareI(@s[1],'{%encoding ',11) then begin p:=12; while (p<=l) and (s[p] in [' ',#9]) do inc(p); EndPos:=p; while (EndPos<=l) and (not (s[EndPos] in ['}',' ',#9])) do inc(EndPos); Result:=NormalizeEncoding(copy(s,p,EndPos-p)); exit; end; // try UTF-8 (this includes ASCII) p:=1; while (p<=l) do begin if ord(s[p])<128 then begin // ASCII inc(p); end else begin i:=UTF8CharacterStrictLength(@s[p]); //DebugLn(['GuessEncoding ',i,' ',DbgStr(s[p])]); if i=0 then begin break; end; inc(p,i); end; end; if p>l then begin Result:=EncodingUTF8; exit; end; // Try to detect encoding Result:= MyDetectCodePageType(s); end; initialization InitStatistic; GetLanguageIDs(Lang, FallbackLang); SupportedEncodings:= TStringList.Create; GetSupportedEncodings(SupportedEncodings); finalization FreeAndNil(SupportedEncodings); end. doublecmd-0.5.8/src/ffindview.lrt0000644000175000017500000000022312023046500015766 0ustar alexxalexxTFRMFINDVIEW.CAPTION=Find TFRMFINDVIEW.BTNFIND.CAPTION=&Find TFRMFINDVIEW.BTNCLOSE.CAPTION=&Cancel TFRMFINDVIEW.CBCASESENS.CAPTION=C&ase sensitive doublecmd-0.5.8/src/foptionshotkeysedithotkey.pas0000644000175000017500000004212311741223531021345 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Editor for hotkeys Copyright (C) 2012 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsHotkeysEditHotkey; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, Buttons, uHotkeyManager, DCBasicTypes; type TEditHotkeyOption = (ehoHideParams); TEditHotkeyOptions = set of TEditHotkeyOption; { TfrmEditHotkey } TfrmEditHotkey = class(TForm) btnOK: TBitBtn; btnCancel: TBitBtn; btnShowCommandHelp: TButton; cgHKControls: TCheckGroup; lblShortcuts: TLabel; lblHotKeyConflict: TLabel; lblParameters: TLabel; edtParameters: TMemo; pnlShortcuts: TPanel; btnAddShortcut: TSpeedButton; btnRemoveShortcut: TSpeedButton; procedure btnAddShortcutClick(Sender: TObject); procedure btnRemoveShortcutClick(Sender: TObject); procedure btnShowCommandHelpClick(Sender: TObject); procedure cgHKControlsItemClick(Sender: TObject; Index: integer); procedure edtShortcutKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure edtShortcutKeyPress(Sender: TObject; var Key: char); procedure edtShortcutKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); private FCommand: String; FEditMode: Boolean; FForm: String; FForms, FFormsTranslated: TStringList; FOldHotkey: THotkey; FOptions: TEditHotkeyOptions; function ApplyHotkey: Boolean; procedure AddShortcutEditor; {en Check if combination of pressed hotkey and checked controls are already in use. Conflicting hotkeys are deleted if DeleteConflicts parameter is true. } procedure CheckHotKeyConflicts(DeleteConflicts: Boolean = false); procedure FillHKControlList; function GetShortcutsEditorsCount: Integer; function GetParameters: TDynamicStringArray; function GetShortcuts: TDynamicStringArray; function GetTranslatedControlName(const AName: String): String; function GetTranslatedFormName(const AName: String): String; procedure RemoveLastShortcutEditor; procedure SetBitmapOrCaption(Button: TSpeedButton; const AIconName, ACaption: String); procedure SetCommand(NewCommand: String); procedure SetControls(const NewControls: TDynamicStringArray); procedure SetHotkey(Hotkey: THotkey); procedure SetParameters(const NewParameters: TDynamicStringArray); procedure SetShortcuts(const NewShortcuts: TDynamicStringArray); public destructor Destroy; override; function Execute(EditMode: Boolean; Form: String; Command: String; Hotkey: THotkey; AControls: TDynamicStringArray; Options: TEditHotkeyOptions = []): Boolean; function CloneNewHotkey: THotkey; end; implementation {$R *.lfm} uses HelpIntfs, LCLType, uKeyboard, uLng, uGlobs, uFormCommands, DCStrUtils, uPixMapManager; const MaxShortcutSequenceLength = 5; { TfrmEditHotkey } procedure TfrmEditHotkey.AddShortcutEditor; var EditControl: TEdit; begin if GetShortcutsEditorsCount < MaxShortcutSequenceLength then begin EditControl := TEdit.Create(Self); EditControl.Parent := pnlShortcuts; EditControl.OnKeyDown := @edtShortcutKeyDown; EditControl.OnKeyPress := @edtShortcutKeyPress; EditControl.OnKeyUp := @edtShortcutKeyUp; end; end; function TfrmEditHotkey.ApplyHotkey: Boolean; procedure UpdateHotkey(ShouldBePresent: Boolean; HotkeyOld, HotkeyNew: THotkey; Hotkeys: THotkeys); var hotkey: THotkey; begin if FEditMode then begin hotkey := Hotkeys.Find(HotkeyOld.Shortcuts); if Assigned(hotkey) and (hotkey.Command = FCommand) then begin if ShouldBePresent then begin hotkey.Assign(HotkeyNew); Hotkeys.UpdateHotkey(hotkey); end else if hotkey.SameParams(HotkeyOld.Params) then Hotkeys.Remove(hotkey); end else if ShouldBePresent then Hotkeys.Add(HotkeyNew.Shortcuts, HotkeyNew.Params, HotkeyNew.Command); end else if ShouldBePresent then begin // Overwrite old hotkey in Add mode too. hotkey := Hotkeys.Find(HotkeyNew.Shortcuts); if Assigned(hotkey) and (hotkey.Command = FCommand) then begin hotkey.Assign(HotkeyNew); Hotkeys.UpdateHotkey(hotkey); end else Hotkeys.Add(HotkeyNew.Shortcuts, HotkeyNew.Params, HotkeyNew.Command); end; end; var i: Integer; HMForm: THMForm; HMControl: THMControl; NewHotkey: THotkey; IsFormHotkey: Boolean; begin Result := False; NewHotkey := CloneNewHotkey; try // check for invalid hotkey if Length(NewHotkey.Shortcuts) = 0 then Exit; if (lblHotKeyConflict.Caption <> EmptyStr) then begin if (MessageDlg(rsOptHotkeysShortCutUsed, // delete command on assigned shortcut Format(rsOptHotkeysShortCutUsedText1, // if another was applied [ShortcutsToText(NewHotkey.Shortcuts)]) + LineEnding + Format(rsOptHotkeysShortCutUsedText2, [NewHotkey.Command]), mtConfirmation, mbYesNo, 0) = mrYes) then CheckHotKeyConflicts(True) else Exit; end; HMForm := HotMan.Forms.FindOrCreate(FForm); IsFormHotkey := True; for i := 0 to cgHKControls.Items.Count - 1 do begin HMControl := THMControl(cgHKControls.Items.Objects[i]); if Assigned(HMControl) then begin if cgHKControls.Checked[i] then IsFormHotkey := False; UpdateHotkey(cgHKControls.Checked[i], FOldHotkey, NewHotkey, HMControl.Hotkeys); end; end; UpdateHotkey(IsFormHotkey, FOldHotkey, NewHotkey, HMForm.Hotkeys); Result := True; finally NewHotkey.Free; end; end; procedure TfrmEditHotkey.btnAddShortcutClick(Sender: TObject); begin AddShortcutEditor; end; procedure TfrmEditHotkey.btnRemoveShortcutClick(Sender: TObject); begin RemoveLastShortcutEditor; end; procedure TfrmEditHotkey.btnShowCommandHelpClick(Sender: TObject); begin ShowHelpOrErrorForKeyword('', edtParameters.HelpKeyword); end; procedure TfrmEditHotkey.cgHKControlsItemClick(Sender: TObject; Index: integer); begin CheckHotKeyConflicts; end; procedure TfrmEditHotkey.CheckHotKeyConflicts(DeleteConflicts: Boolean); var ConflictsCount: Integer; ShortConflicts, LongConflicts: String; procedure AddCommandConflict(Hotkey: THotkey; const AName: String); var sConflict: String; begin sConflict := Format(rsOptHotkeysUsedBy, [Hotkey.Command, AName]); AddStrWithSep(ShortConflicts, sConflict, LineEnding); AddStrWithSep(LongConflicts, sConflict, LineEnding); end; procedure AddParamsConflict(Hotkey: THotkey); var sConflict: String; Param: String; begin sConflict := rsOptHotkeysUsedWithDifferentParams; AddStrWithSep(ShortConflicts, sConflict, LineEnding); if Length(Hotkey.Params) > 0 then begin sConflict := sConflict + ':'; for Param in Hotkey.Params do AddStrWithSep(sConflict, ' ' + Param, LineEnding); end; AddStrWithSep(LongConflicts, sConflict, LineEnding); end; procedure CheckHotkey(Hotkeys: THotkeys; const AObjectName: String; HotkeyToSearch: THotkey); var Hotkey: THotkey; begin Hotkey := Hotkeys.Find(HotkeyToSearch.Shortcuts); if Assigned(Hotkey) then begin if Hotkey.Command <> FCommand then begin Inc(ConflictsCount); if DeleteConflicts then Hotkeys.Remove(Hotkey) else AddCommandConflict(Hotkey, GetTranslatedControlName(AObjectName)); end else if not Hotkey.SameParams(HotkeyToSearch.Params) then begin Inc(ConflictsCount); if DeleteConflicts then Hotkeys.Remove(Hotkey) else AddParamsConflict(Hotkey); end; end; end; var HMForm: THMForm; HMControl: THMControl; i: Integer; IsFormHotKey: Boolean; Hotkey: THotkey; begin lblHotKeyConflict.Caption := EmptyStr; lblHotKeyConflict.Hint := EmptyStr; HMForm := HotMan.Forms.Find(FForm); if not Assigned(HMForm) then Exit; Hotkey := CloneNewHotkey; try ConflictsCount := 0; if Length(Hotkey.Shortcuts) > 0 then begin IsFormHotKey := True; // search if any checked control has same hotkey assigned somewhere else for i := 0 to cgHKControls.Items.Count - 1 do begin if cgHKControls.Checked[i] then begin IsFormHotKey := False; HMControl := THMControl(cgHKControls.Items.Objects[i]); if Assigned(HMControl) then CheckHotkey(HMControl.Hotkeys, HMControl.Name, Hotkey); end; end; if IsFormHotKey then CheckHotkey(HMForm.Hotkeys, HMForm.Name, Hotkey); lblHotKeyConflict.Caption := ShortConflicts; lblHotKeyConflict.Hint := LongConflicts; end; lblHotKeyConflict.Visible := ConflictsCount > 0; finally Hotkey.Free; end; end; function TfrmEditHotkey.CloneNewHotkey: THotkey; begin Result := THotkey.Create; Result.Shortcuts := GetShortcuts; Result.Params := GetParameters; Result.Command := FCommand; end; destructor TfrmEditHotkey.Destroy; begin inherited Destroy; FForms.Free; FFormsTranslated.Free; FOldHotkey.Free; end; procedure TfrmEditHotkey.edtShortcutKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var ShortCut: TShortCut; sShortCut: String; EditControl: TEdit; begin ShortCut := KeyToShortCutEx(Key, GetKeyShiftStateEx); sShortCut := ShortCutToTextEx(ShortCut); EditControl := Sender as TEdit; // Allow closing the dialog if Escape pressed twice. if (ShortCut <> VK_ESCAPE) or (EditControl.Text <> sShortCut) then begin EditControl.Text := sShortCut; Key := 0; btnOK.Enabled := GetShortcuts <> nil; lblHotKeyConflict.Caption := ''; CheckHotKeyConflicts; end; end; procedure TfrmEditHotkey.edtShortcutKeyPress(Sender: TObject; var Key: char); var EditControl: TEdit; begin EditControl := Sender as TEdit; EditControl.Text := ''; btnOK.Enabled := GetShortcuts <> nil; Key := #0; end; procedure TfrmEditHotkey.edtShortcutKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); var ShortCut: TShortCut; sShortCut: String; EditControl: TEdit; begin ShortCut := KeyToShortCutEx(Key, GetKeyShiftStateEx); sShortCut := ShortCutToTextEx(ShortCut); EditControl := Sender as TEdit; // Select next shortcut editor. if (ShortCut <> VK_ESCAPE) and (sShortCut <> '') and (EditControl.Text = sShortCut) then pnlShortcuts.SelectNext(EditControl, True, True); end; function TfrmEditHotkey.Execute( EditMode: Boolean; Form: String; Command: String; Hotkey: THotkey; AControls: TDynamicStringArray; Options: TEditHotkeyOptions = []): Boolean; begin FEditMode := EditMode; FForm := Form; FOptions := Options; SetHotkey(Hotkey); SetCommand(Command); SetControls(AControls); if EditMode then Caption := Format(rsOptHotkeysEditHotkey, [Command]) else Caption := Format(rsOptHotkeysAddHotkey, [Command]); lblParameters.Visible := not (ehoHideParams in Options); edtParameters.Visible := not (ehoHideParams in Options); btnShowCommandHelp.Visible := not (ehoHideParams in Options); btnOK.Enabled := GetShortcuts <> nil; lblHotKeyConflict.Caption := ''; lblHotKeyConflict.Hint := ''; lblHotKeyConflict.Visible := False; if ShowModal = mrOK then Result := ApplyHotkey else Result := False; end; procedure TfrmEditHotkey.FillHKControlList; var HMForm: THMForm; i: Integer; ControlsList: TStringList; begin ControlsList := TStringList.Create; try HMForm := HotMan.Forms.Find(FForm); if Assigned(HMForm) then begin for i := 0 to HMForm.Controls.Count - 1 do ControlsList.AddObject(HMForm.Controls[i].Name, HMForm.Controls[i]); end; ControlsList.Sort; cgHKControls.Items.Assign(ControlsList); cgHKControls.Visible := cgHKControls.Items.Count <> 0; finally ControlsList.Free; end; end; procedure TfrmEditHotkey.FormCreate(Sender: TObject); begin lblHotKeyConflict.Color := clHighlight; lblHotKeyConflict.Font.Color := clHighlightText; FForms := TStringList.Create; FFormsTranslated := TStringList.Create; TFormCommands.GetCategoriesList(FForms, FFormsTranslated); SetBitmapOrCaption(btnAddShortcut, 'list-add', '+'); SetBitmapOrCaption(btnRemoveShortcut, 'list-remove', '-'); AddShortcutEditor; end; procedure TfrmEditHotkey.FormShow(Sender: TObject); var EditControl: TEdit; begin if pnlShortcuts.ControlCount > 0 then begin EditControl := pnlShortcuts.Controls[0] as TEdit; EditControl.SetFocus; EditControl.SelStart := Length(EditControl.Text); EditControl.SelLength := 0; end; end; function TfrmEditHotkey.GetParameters: TDynamicStringArray; begin Result := GetArrayFromStrings(edtParameters.Lines); end; function TfrmEditHotkey.GetShortcuts: TDynamicStringArray; var i: Integer; EditControl: TEdit; begin Result := nil; for i := 0 to pnlShortcuts.ControlCount - 1 do begin EditControl := pnlShortcuts.Controls[i] as TEdit; if EditControl.Text <> '' then AddString(Result, EditControl.Text); end; end; function TfrmEditHotkey.GetShortcutsEditorsCount: Integer; begin Result := pnlShortcuts.ControlCount; end; function TfrmEditHotkey.GetTranslatedControlName(const AName: String): String; begin // TODO: Translate controls names. Result := AName; end; function TfrmEditHotkey.GetTranslatedFormName(const AName: String): String; var i: Integer; begin i := FForms.IndexOf(AName); if i >= 0 then Result := FFormsTranslated.Strings[i] else Result := AName; end; procedure TfrmEditHotkey.RemoveLastShortcutEditor; begin if pnlShortcuts.ControlCount > 1 then pnlShortcuts.Controls[pnlShortcuts.ControlCount - 1].Free; end; procedure TfrmEditHotkey.SetBitmapOrCaption(Button: TSpeedButton; const AIconName, ACaption: String); var Bmp: TBitmap = nil; IconIndex: PtrInt; begin IconIndex := PixMapManager.GetIconByName(AIconName); if IconIndex <> -1 then Bmp := PixMapManager.GetBitmap(IconIndex); if Assigned(Bmp) then begin Button.Glyph := Bmp; Button.Height := gIconsSize; Button.Width := gIconsSize; Bmp.Free; end else begin Button.Caption := ACaption; end; end; procedure TfrmEditHotkey.SetCommand(NewCommand: String); begin FCommand := NewCommand; btnShowCommandHelp.Caption := Format(rsShowHelpFor, [FCommand]); edtParameters.HelpKeyword := '/cmds.html#' + FCommand; end; procedure TfrmEditHotkey.SetControls(const NewControls: TDynamicStringArray); var sControl: String; i: Integer; begin FillHKControlList; // Mark controls to which hotkey applies. for i := 0 to cgHKControls.Items.Count - 1 do begin cgHKControls.Checked[i] := False; for sControl in NewControls do if cgHKControls.Items[i] = sControl then begin cgHKControls.Checked[i] := True; Break; end; end; end; procedure TfrmEditHotkey.SetHotkey(Hotkey: THotkey); begin FreeAndNil(FOldHotkey); if Assigned(Hotkey) then begin FOldHotkey := Hotkey.Clone; SetShortcuts(Hotkey.Shortcuts); SetParameters(Hotkey.Params); end else begin SetShortcuts(nil); SetParameters(nil); end; end; procedure TfrmEditHotkey.SetParameters(const NewParameters: TDynamicStringArray); begin SetStringsFromArray(edtParameters.Lines, NewParameters); end; procedure TfrmEditHotkey.SetShortcuts(const NewShortcuts: TDynamicStringArray); var Index: Integer; EditControl: TEdit; Shortcut: String; begin if Assigned(NewShortcuts) then begin while pnlShortcuts.ControlCount < Length(NewShortcuts) do AddShortcutEditor; while pnlShortcuts.ControlCount > Length(NewShortcuts) do RemoveLastShortcutEditor; Index := 0; for Shortcut in NewShortcuts do begin EditControl := pnlShortcuts.Controls[Index] as TEdit; EditControl.Text := Shortcut; Inc(Index); end; end else begin while pnlShortcuts.ControlCount > 1 do RemoveLastShortcutEditor; if pnlShortcuts.ControlCount > 0 then begin EditControl := pnlShortcuts.Controls[0] as TEdit; EditControl.Clear; end; end; end; end. doublecmd-0.5.8/src/uglobs.pas0000644000175000017500000030323212257475470015315 0ustar alexxalexx{ Double Commander ------------------------------------------------------------ Seksi Commander ---------------------------- Licence : GNU GPL v 2.0 Author : radek.cervinka@centrum.cz Globals variables and some consts contributors: Copyright (C) 2006-2012 Alexander Koblov (alexx2000@mail.ru) Copyright (C) 2008 Dmitry Kolomiets (B4rr4cuda@rambler.ru) Copyright (C) 2008 Vitaly Zotov (vitalyzotov@mail.ru) } unit uGlobs; {$mode objfpc}{$H+} interface uses Classes, Controls, Forms, Types, uExts, uColorExt, Graphics, DCClassesUtf8, uMultiArc, uColumns, uHotkeyManager, uSearchTemplate, uFileSourceOperationOptions, uWFXModule, uWCXModule, uWDXModule, uwlxmodule, udsxmodule, DCXmlConfig, uInfoToolTip, fQuickSearch, uTypes, uClassesEx; type { Log options } TLogOptions = set of (log_cp_mv_ln, log_delete, log_dir_op, log_arc_op, log_vfs_op, log_success, log_errors, log_info); { Watch dirs options } TWatchOptions = set of (watch_file_name_change, watch_attributes_change, watch_only_foreground, watch_exclude_dirs); { Tabs options } TTabsOptions = set of (tb_always_visible, tb_multiple_lines, tb_same_width, tb_text_length_limit, tb_confirm_close_all, tb_close_on_dbl_click, tb_open_new_in_foreground, tb_open_new_near_current, tb_show_asterisk_for_locked, tb_activate_panel_on_click, tb_show_close_button); TTabsPosition = (tbpos_top, tbpos_bottom); { Show icons mode } TShowIconsMode = (sim_none, sim_standart, sim_all, sim_all_and_exe); { Show tooltip mode } TShowToolTipMode = set of (stm_show_for_all, stm_only_large_name); TScrollMode = (smLineByLineCursor, smLineByLine, smPageByPage); { Sorting directories mode } TSortFolderMode = (sfmSortNameShowFirst, sfmSortLikeFileShowFirst, sfmSortLikeFile); { Where to insert new files in the filelist } TNewFilesPosition = (nfpTop, nfpTopAfterDirectories, nfpSortedPosition, nfpBottom); { Where to move updated files in the filelist } TUpdatedFilesPosition = (ufpSameAsNewFiles, ufpSortedPosition, ufpNoChange); { How initially progress is shown for file operations } TFileOperationsProgressKind = (fopkSeparateWindow, fopkSeparateWindowMinimized, fopkOperationsPanel); { Operations with confirmation } TFileOperationsConfirmation = (focCopy, focMove, focDelete, focDeleteToTrash); TFileOperationsConfirmations = set of TFileOperationsConfirmation; TExternalTool = (etViewer, etEditor, etDiffer); TExternalToolOptions = record Enabled: Boolean; Path: String; Parameters: String; RunInTerminal: Boolean; KeepTerminalOpen: Boolean; end; TExternalToolsOptions = array[TExternalTool] of TExternalToolOptions; TDCFont = (dcfMain, dcfViewer, dcfEditor, dcfLog, dcfViewerBook); TDCFontOptions = record Name: String; Size: Integer; Style: TFontStyles; end; TDCFontsOptions = array[TDCFont] of TDCFontOptions; // fswmPreventDelete - prevents deleting watched directories // fswmAllowDelete - does not prevent deleting watched directories // fswmWholeDrive - watch whole drives instead of single directories to omit problems with deleting watched directories TWatcherMode = (fswmPreventDelete, fswmAllowDelete, fswmWholeDrive); TDrivesListButtonOption = (dlbShowLabel, dlbShowFileSystem, dlbShowFreeSpace); TDrivesListButtonOptions = set of TDrivesListButtonOption; TKeyTypingModifier = (ktmNone, ktmAlt, ktmCtrlAlt); TKeyTypingAction = (ktaNone, ktaCommandLine, ktaQuickSearch, ktaQuickFilter); const { Default hotkey list version number } hkVersion = 17; // Previously existing names if reused must check for ConfigVersion >= X. // History: // 2 - removed Layout/SmallIcons // renamed Layout/SmallIconSize to Layout/IconSize // 3 - Layout/DriveMenuButton -> Layout/DrivesListButton and added subnodes: // ShowLabel, ShowFileSystem, ShowFreeSpace // 4 - changed QuickSearch/Enabled, QuickSearch/Mode and same for QuickFilter // to Keyboard/Typing. // 5 - changed Behaviours/SortCaseSensitive to FilesViews/Sorting/CaseSensitivity // changed Behaviours/SortNatural to FilesViews/Sorting/NaturalSorting // 6 - changed Behaviours/ShortFileSizeFormat to Behaviours/FileSizeFormat // 7 - changed Viewer/SaveThumbnails to Thumbnails/Save ConfigVersion = 7; TKeyTypingModifierToShift: array[TKeyTypingModifier] of TShiftState = ([], [ssAlt], [ssCtrl, ssAlt]); var { For localization } gPOFileName, gHelpLang: String; { DSX plugins } gDSXPlugins: TDSXModuleList; { WCX plugins } gWCXPlugins: TWCXModuleList; { WDX plugins } gWDXPlugins:TWDXModuleList; { WFX plugins } gWFXPlugins: TWFXModuleList; { WLX plugins } gWLXPlugins: TWLXModuleList; { MultiArc addons } gMultiArcList: TMultiArcList; { Columns Set } ColSet:TPanelColumnsList; { Layout page } gMainMenu, gButtonBar, gToolBarFlat, gDriveBar1, gDriveBar2, gDriveBarFlat, gDrivesListButton, gDirectoryTabs, gCurDir, gTabHeader, gStatusBar, gCmdLine, gLogWindow, gTermWindow, gKeyButtons, gInterfaceFlat, gDriveInd, gDriveFreeSpace, gProgInMenuBar, gPanelOfOp, gHorizontalFilePanels, gShortFormatDriveInfo: Boolean; gDrivesListButtonOptions: TDrivesListButtonOptions; { Toolbar } gToolBarButtonSize, gToolBarIconSize: Integer; gRepeatPassword:Boolean; // repeat password when packing files gDirHistoryCount:Integer; // how many history we remember gShowSystemFiles:Boolean; gRunInTerm: String; gRunTerm: String; gSortCaseSensitivity: TCaseSensitivity; gSortNatural: Boolean; gSortFolderMode: TSortFolderMode; gNewFilesPosition: TNewFilesPosition; gUpdatedFilesPosition: TUpdatedFilesPosition; gLynxLike:Boolean; gFirstTextSearch: Boolean; gMouseSelectionEnabled: Boolean; gMouseSelectionButton: Integer; gAutoFillColumns: Boolean; gAutoSizeColumn: Integer; glsHotDir:TStringListEx; glsDirHistory:TStringListEx; glsCmdLineHistory: TStringListEx; glsMaskHistory : TStringListEx; glsSearchHistory : TStringListEx; glsReplaceHistory : TStringListEx; glsSearchExcludeFiles: TStringList; glsSearchExcludeDirectories: TStringList; glsIgnoreList : TStringListEx; gOnlyOneAppInstance, gCutTextToColWidth : Boolean; gSpaceMovesDown: Boolean; gScrollMode: TScrollMode; gWheelScrollLines: Integer; gAlwaysShowTrayIcon: Boolean; gMinimizeToTray: Boolean; gFileSizeFormat: TFileSizeFormat; gDateTimeFormat : String; gDriveBlackList: String; gDriveBlackListUnmounted: Boolean; // Automatically black list unmounted devices gListFilesInThread: Boolean; gLoadIconsSeparately: Boolean; gDelayLoadingTabs: Boolean; gHighlightUpdatedFiles: Boolean; gLastUsedPacker: String; { Tools page } gExternalTools: TExternalToolsOptions; gLuaLib:String; gExts:TExts; gColorExt:TColorExt; gFileInfoToolTip: TFileInfoToolTip; { Fonts page } gFonts: TDCFontsOptions; { File panels color page } gBackColor, //Background color gBackColor2, //Background color 2 gForeColor, //text color gMarkColor, // Mark color gCursorColor, //Cursor color gCursorText, //text color under cursor gIndForeColor, // foreColor of use space on drive label gIndBackColor: TColor; // backColor of free space on drive label gUseInvertedSelection: Boolean; gInactivePanelBrightness: Integer; // 0 .. 100 (black .. full color) gUseFrameCursor: Boolean; gIndUseGradient : Boolean; // use gradient on drive label gShowIcons: TShowIconsMode; gShowIconsNew: TShowIconsMode; gIconOverlays : Boolean; gIconsSize, gIconsSizeNew : Integer; gIconsExclude: Boolean; gIconsExcludeDirs: String; gCustomDriveIcons : Boolean; // for use custom drive icons under windows gIconsInMenus: Boolean; gIconsInMenusSize, gIconsInMenusSizeNew: Integer; { Keys page } gKeyTyping: array[TKeyTypingModifier] of TKeyTypingAction; { File operations page } gCopyBlockSize : Integer; gUseMmapInSearch : Boolean; gPartialNameSearch: Boolean; gSkipFileOpError: Boolean; gDropReadOnlyFlag : Boolean; gWipePassNumber: Integer; gProcessComments: Boolean; gShowCopyTabSelectPanel:boolean; gUseTrash : Boolean; // if using delete to trash by default gRenameSelOnlyName:boolean; gShowDialogOnDragDrop: Boolean; gOverwriteFolder: Boolean; gFileOperationsProgressKind: TFileOperationsProgressKind; gFileOperationsConfirmations: TFileOperationsConfirmations; { Folder tabs page } gDirTabOptions : TTabsOptions; gDirTabLimit : Integer; gDirTabPosition : TTabsPosition; { Log page } gLogFile : Boolean; gLogFileName : String; gLogOptions : TLogOptions; { Configuration page } gUseConfigInProgramDir, gUseConfigInProgramDirNew, gSaveConfiguration, gSaveSearchReplaceHistory, gSaveDirHistory, gSaveCmdLineHistory, gSaveFileMaskHistory : Boolean; { Quick Search page } gQuickSearchOptions: TQuickSearchOptions; gQuickFilterAutoHide: Boolean; { Misc page } gGridVertLine, gGridHorzLine, gShowWarningMessages, gDirBrackets, gGoToRoot: Boolean; gShowToolTipMode: TShowToolTipMode; gThumbSize: TSize; gThumbSave: Boolean; { Auto refresh page } gWatchDirs: TWatchOptions; gWatchDirsExclude: String; gWatcherMode: TWatcherMode; { Ignore list page } gIgnoreListFileEnabled: Boolean; gIgnoreListFile: UTF8String; gSearchTemplateList: TSearchTemplateList; {HotKey Manager} HotMan:THotKeyManager; gNameSCFile: string; {Copy/Move operation options} gOperationOptionSymLinks: TFileSourceOperationOptionSymLink; gOperationOptionCorrectLinks: Boolean; gOperationOptionFileExists: TFileSourceOperationOptionFileExists; gOperationOptionDirectoryExists: TFileSourceOperationOptionDirectoryExists; gOperationOptionSetPropertyError: TFileSourceOperationOptionSetPropertyError; gOperationOptionReserveSpace: Boolean; gOperationOptionCheckFreeSpace: Boolean; gOperationOptionCopyAttributes: Boolean; gOperationOptionCopyTime: Boolean; gOperationOptionCopyOwnership: Boolean; {Error file} gErrorFile: String; {Viewer} gPreviewVisible, gImageStretch: Boolean; gCopyMovePath1, gCopyMovePath2, gCopyMovePath3, gCopyMovePath4, gCopyMovePath5, gImagePaintMode: String; gImagePaintWidth, gColCount, gViewerMode: Integer; gImagePaintColor, gBookBackgroundColor, gBookFontColor: TColor; gTextPosition:PtrInt; gUseShellForFileOperations: Boolean; function LoadConfig: Boolean; function InitGlobs: Boolean; function LoadGlobs: Boolean; procedure SaveGlobs; procedure LoadIniConfig; procedure SaveIniConfig; procedure LoadXmlConfig; procedure SaveXmlConfig; procedure ConvertIniToXml; procedure LoadDefaultHotkeyBindings; function InitPropStorage(Owner: TComponent): TIniPropStorageEx; procedure FontToFontOptions(Font: TFont; out Options: TDCFontOptions); procedure FontOptionsToFont(Options: TDCFontOptions; Font: TFont); function GetKeyTypingAction(ShiftStateEx: TShiftState): TKeyTypingAction; function IsFileSystemWatcher: Boolean; function GetValidDateTimeFormat(const aFormat, ADefaultFormat: string): string; const cMaxStringItems=50; var gIni: TIniFileEx = nil; gConfig: TXmlConfig = nil; implementation uses LCLProc, Dialogs, SysUtils, XMLRead, uGlobsPaths, uLng, uShowMsg, uFileProcs, uOSUtils, uDCUtils, fMultiRename, uFile, uDCVersion, uDebug, uFileFunctions, uDefaultPlugins, Lua, uKeyboard, DCOSUtils, DCStrUtils {$IF DEFINED(MSWINDOWS)} , win32proc {$ENDIF} ; const TKeyTypingModifierToNodeName: array[TKeyTypingModifier] of String = ('NoModifier', 'Alt', 'CtrlAlt'); DefaultDateTimeFormat = 'dd/mm/yy'; type TLoadConfigProc = function(var ErrorMessage: String): Boolean; var // Double Commander version // loaded from configuration file gPreviousVersion: UTF8String = ''; function LoadConfigCheckErrors(LoadConfigProc: TLoadConfigProc; ConfigFileName: String; var ErrorMessage: String): Boolean; procedure AddMsg(Msg, eMsg: String); begin AddStrWithSep(ErrorMessage, Msg + ':', LineEnding + LineEnding); AddStrWithSep(ErrorMessage, ConfigFileName, LineEnding); if eMsg <> EmptyStr then AddStrWithSep(ErrorMessage, eMsg, LineEnding); end; begin Result := False; try Result := LoadConfigProc(ErrorMessage); except // If the file does not exist or is empty, // simply default configuration is applied. on EXmlConfigNotFound do Result := True; on EXmlConfigEmpty do Result := True; on e: EFOpenError do AddMsg(rsMsgErrEOpen, e.Message); on e: EStreamError do AddMsg(rsMsgErrERead, e.Message); on e: EXMLReadError do AddMsg(rsMsgInvalidFormatOfConfigurationFile, e.Message); end; end; type TSaveCfgProc = procedure; procedure SaveWithCheck(SaveProc: TSaveCfgProc; CfgDescription: String; var ErrMsg: String); begin try SaveProc; except on E: EStreamError do ErrMsg := ErrMsg + 'Cannot save ' + CfgDescription + ': ' + e.Message; end; end; procedure SaveCfgExts; begin gExts.SaveToFile(gpCfgDir + 'doublecmd.ext'); end; procedure SaveCfgIgnoreList; var FileName: UTF8String; begin if gIgnoreListFileEnabled then begin FileName:= ReplaceEnvVars(gIgnoreListFile); mbForceDirectory(ExtractFileDir(FileName)); glsIgnoreList.SaveToFile(FileName); end; end; procedure SaveCfgMultiArcList; begin gMultiArcList.SaveToFile(gpCfgDir + 'multiarc.ini'); end; procedure SaveCfgHotkeys; begin HotMan.Save(gpCfgDir + gNameSCFile); end; procedure SaveCfgMainConfig; begin if Assigned(gIni) then SaveIniConfig; SaveXmlConfig; // Force saving config to file. gConfig.Save; end; function AskUserOnError(var ErrorMessage: String): Boolean; begin // Show error messages. if ErrorMessage <> EmptyStr then begin Result := QuestionDlg(Application.Title + ' - ' + rsMsgErrorLoadingConfiguration, ErrorMessage, mtWarning, [1, rsDlgButtonContinue, 'isdefault', 2, rsDlgButtonExitProgram], 0) = 1; // Reset error message. ErrorMessage := ''; end else Result := True; end; function LoadGlobalConfig(var ErrorMessage: String): Boolean; begin Result := gConfig.Load; end; function LoadExtsConfig(var ErrorMessage: String): Boolean; begin gExts.LoadFromFile(gpCfgDir + 'doublecmd.ext'); Result := True; end; function LoadHotManConfig(var ErrorMessage: String): Boolean; begin HotMan.Load(gpCfgDir + gNameSCFile); Result := True; end; function LoadMultiArcConfig(var ErrorMessage: String): Boolean; begin gMultiArcList.LoadFromFile(gpCfgDir + 'multiarc.ini'); Result := True; end; function LoadHistoryConfig(var ErrorMessage: String): Boolean; var Root: TXmlNode; History: TXmlConfig; procedure LoadHistory(const NodeName: UTF8String; HistoryList: TStrings); var Node: TXmlNode; begin Node := History.FindNode(Root, NodeName); if Assigned(Node) then begin HistoryList.Clear; Node := Node.FirstChild; while Assigned(Node) do begin if Node.CompareName('Item') = 0 then begin HistoryList.Add(History.GetContent(Node)); if HistoryList.Count >= cMaxStringItems then Break; end; Node := Node.NextSibling; end; end; end; begin Result:= False; History:= TXmlConfig.Create(gpCfgDir + 'history.xml', True); try Root:= History.FindNode(History.RootNode, 'History'); if Assigned(Root) then begin LoadHistory('Navigation', glsDirHistory); LoadHistory('CommandLine', glsCmdLineHistory); LoadHistory('FileMask', glsMaskHistory); LoadHistory('SearchText', glsSearchHistory); LoadHistory('ReplaceText', glsReplaceHistory); LoadHistory('SearchExcludeFiles', glsSearchExcludeFiles); LoadHistory('SearchExcludeDirectories', glsSearchExcludeDirectories); end; Result:= True; finally History.Free; end; end; procedure SaveHistoryConfig; var Root: TXmlNode; History: TXmlConfig; procedure SaveHistory(const NodeName: UTF8String; HistoryList: TStrings); var I: Integer; Node, SubNode: TXmlNode; begin Node := History.FindNode(Root, NodeName, True); History.ClearNode(Node); for I:= 0 to HistoryList.Count - 1 do begin SubNode := History.AddNode(Node, 'Item'); History.SetContent(SubNode, HistoryList[I]); if I >= cMaxStringItems then Break; end; end; begin History:= TXmlConfig.Create(gpCfgDir + 'history.xml'); try Root:= History.FindNode(History.RootNode, 'History', True); if gSaveDirHistory then SaveHistory('Navigation', glsDirHistory); if gSaveCmdLineHistory then SaveHistory('CommandLine', glsCmdLineHistory); if gSaveFileMaskHistory then SaveHistory('FileMask', glsMaskHistory); if gSaveSearchReplaceHistory then begin SaveHistory('SearchText', glsSearchHistory); SaveHistory('ReplaceText', glsReplaceHistory); SaveHistory('SearchExcludeFiles', glsSearchExcludeFiles); SaveHistory('SearchExcludeDirectories', glsSearchExcludeDirectories); end; History.Save; finally History.Free; end; end; function GetValidDateTimeFormat(const aFormat, ADefaultFormat: string): string; begin try SysUtils.FormatDateTime(aFormat, Now); Result := aFormat; except on EConvertError do Result := ADefaultFormat; end; end; procedure LoadDefaultHotkeyBindings; var HMForm: THMForm; HMControl: THMControl; begin // Note: Increase hkVersion if you change default hotkeys list // Shortcuts that can conflict with default OS shortcuts for some controls // should be put only to Files Panel. // For a list of such possible shortcuts see THotKeyManager.IsShortcutConflictingWithOS. // If adding multiple shortcuts for the same command use: // AddIfNotExists([Shortcut1, Param1, Shortcut2, Param2, ...], Command); // // Shortcuts Ctrl+Alt+ should not be added as the combinations may be // used to enter international characters on Windows (where Ctrl+Alt = AltGr). HMForm := HotMan.Forms.FindOrCreate('Main'); with HMForm.Hotkeys do begin AddIfNotExists(['F1'],[],'cm_About'); AddIfNotExists(['F2','','', 'Shift+F6','',''],'cm_RenameOnly'); AddIfNotExists(['F3'],[],'cm_View'); AddIfNotExists(['F4'],[],'cm_Edit'); AddIfNotExists(['F5'],[],'cm_Copy'); AddIfNotExists(['F6'],[],'cm_Rename'); AddIfNotExists(['F7'],[],'cm_MakeDir'); AddIfNotExists(['F8','','', 'Shift+F8','','trashcan=reversesetting',''], 'cm_Delete'); AddIfNotExists(['F9'],[],'cm_RunTerm'); AddIfNotExists(['Ctrl+7'],[],'cm_ShowCmdLineHistory'); AddIfNotExists(['Ctrl+D'],[],'cm_DirHotList'); AddIfNotExists(['Ctrl+F'],[],'cm_QuickFilter'); AddIfNotExists(['Ctrl+H'],[],'cm_DirHistory'); AddIfNotExists(['Ctrl+L'],[],'cm_CalculateSpace'); AddIfNotExists(['Ctrl+M'],[],'cm_MultiRename'); AddIfNotExists(['Ctrl+P'],[],'cm_AddPathToCmdLine'); AddIfNotExists(['Ctrl+Q'],[],'cm_QuickView'); AddIfNotExists(['Ctrl+S'],[],'cm_QuickSearch'); AddIfNotExists(['Ctrl+R'],[],'cm_Refresh'); AddIfNotExists(['Ctrl+T'],[],'cm_NewTab'); AddIfNotExists(['Ctrl+U'],[],'cm_Exchange'); AddIfNotExists(['Ctrl+W'],[],'cm_CloseTab'); AddIfNotExists(['Ctrl+Z'],[],'cm_EditComment'); AddIfNotExists(['Ctrl+F1'],[],'cm_BriefView'); AddIfNotExists(['Ctrl+F2'],[],'cm_ColumnsView'); AddIfNotExists(['Ctrl+F3'],[],'cm_SortByName'); AddIfNotExists(['Ctrl+F4'],[],'cm_SortByExt'); AddIfNotExists(['Ctrl+F5'],[],'cm_SortByDate'); AddIfNotExists(['Ctrl+F6'],[],'cm_SortBySize'); AddIfNotExists(['Ctrl+Down'],[],'cm_ShowCmdLineHistory'); AddIfNotExists(['Ctrl+Enter'],[],'cm_AddFilenameToCmdLine'); AddIfNotExists(['Ctrl+PgDn'],[],'cm_OpenArchive'); AddIfNotExists(['Ctrl+PgUp'],[],'cm_ChangeDirToParent'); AddIfNotExists(['Ctrl+Alt+Enter'],[],'cm_ShellExecute'); AddIfNotExists(['Ctrl+Shift+C'],[],'cm_CopyFullNamesToClip'); AddIfNotExists(['Ctrl+Shift+H'],[],'cm_HorizontalFilePanels'); AddIfNotExists(['Ctrl+Shift+X'],[],'cm_CopyNamesToClip'); AddIfNotExists(['Ctrl+Shift+F1'],[],'cm_ThumbnailsView'); AddIfNotExists(['Ctrl+Shift+Enter'],[],'cm_AddPathAndFilenameToCmdLine'); AddIfNotExists(['Ctrl+Shift+Tab'],[],'cm_PrevTab'); AddIfNotExists(['Ctrl+Tab'],[],'cm_NextTab'); AddIfNotExists(['Ctrl+Up'],[],'cm_OpenDirInNewTab'); AddIfNotExists(['Ctrl+\'],[],'cm_ChangeDirToRoot'); AddIfNotExists(['Ctrl+.'],[],'cm_ShowSysFiles'); AddIfNotExists(['Shift+F2'],[],'cm_FocusCmdLine'); AddIfNotExists(['Shift+F4'],[],'cm_EditNew'); AddIfNotExists(['Shift+F5'],[],'cm_CopySamePanel'); AddIfNotExists(['Shift+F10'],[],'cm_ContextMenu'); AddIfNotExists(['Alt+V'],[],'cm_OperationsViewer'); AddIfNotExists(['Alt+X'],[],'cm_Exit'); AddIfNotExists(['Alt+Z'],[],'cm_TargetEqualSource'); AddIfNotExists(['Alt+F1'],[],'cm_LeftOpenDrives'); AddIfNotExists(['Alt+F2'],[],'cm_RightOpenDrives'); AddIfNotExists(['Alt+F5'],[],'cm_PackFiles'); AddIfNotExists(['Alt+F7'],[],'cm_Search'); AddIfNotExists(['Alt+F9'],[],'cm_ExtractFiles'); AddIfNotExists(['Alt+Del'],[],'cm_Wipe'); AddIfNotExists(['Alt+Down'],[],'cm_DirHistory'); AddIfNotExists(['Alt+Enter'],[],'cm_FileProperties'); AddIfNotExists(['Alt+Left'],[],'cm_ViewHistoryPrev'); AddIfNotExists(['Alt+Right'],[],'cm_ViewHistoryNext'); AddIfNotExists(['Alt+Shift+Enter'],[],'cm_CountDirContent'); AddIfNotExists(['Alt+Shift+F9'],[],'cm_TestArchive'); end; HMControl := HMForm.Controls.FindOrCreate('Files Panel'); with HMControl.Hotkeys do begin AddIfNotExists(['Del','','', 'Shift+Del','','trashcan=reversesetting',''], 'cm_Delete'); AddIfNotExists(['Ctrl+A','','', 'Ctrl+Num+','',''],'cm_MarkMarkAll', ['Ctrl+A'], []); AddIfNotExists(['Num+'],[],'cm_MarkPlus'); AddIfNotExists(['Shift+Num+'],[],'cm_MarkCurrentExtension'); AddIfNotExists(['Ctrl+Num-'],[],'cm_MarkUnmarkAll'); AddIfNotExists(['Num-'],[],'cm_MarkMinus'); AddIfNotExists(['Shift+Num-'],[],'cm_UnmarkCurrentExtension'); AddIfNotExists(['Num*'],[],'cm_MarkInvert'); AddIfNotExists(['Ctrl+C'],[],'cm_CopyToClipboard'); AddIfNotExists(['Ctrl+V'],[],'cm_PasteFromClipboard'); AddIfNotExists(['Ctrl+X'],[],'cm_CutToClipboard'); AddIfNotExists(['Ctrl+Left'],[],'cm_TransferLeft'); AddIfNotExists(['Ctrl+Right'],[],'cm_TransferRight'); end; HMForm := HotMan.Forms.FindOrCreate('Viewer'); with HMForm.Hotkeys do begin AddIfNotExists(['F1'],[],'cm_About'); AddIfNotExists(['F2'],[],'cm_Reload'); AddIfNotExists(['N'],[],'cm_LoadNextFile'); AddIfNotExists(['P'],[],'cm_LoadPrevFile'); end; HMForm := HotMan.Forms.FindOrCreate('Differ'); with HMForm.Hotkeys do begin AddIfNotExists(['Ctrl+R'],[],'cm_Reload'); AddIfNotExists(['Alt+Down'],[],'cm_NextDifference'); AddIfNotExists(['Alt+Up'],[],'cm_PrevDifference'); AddIfNotExists(['Alt+Home'],[],'cm_FirstDifference'); AddIfNotExists(['Alt+End'],[],'cm_LastDifference'); AddIfNotExists(['Alt+X'],[],'cm_Exit'); AddIfNotExists(['Alt+Left'],[],'cm_CopyRightToLeft'); AddIfNotExists(['Alt+Right'],[],'cm_CopyLeftToRight'); end; HMForm := HotMan.Forms.FindOrCreate('Copy/Move Dialog'); with HMForm.Hotkeys do begin AddIfNotExists(['F2'],[],'cm_AddToQueue'); end; if not mbFileExists(gpCfgDir + gNameSCFile) then gNameSCFile := 'shortcuts.scf'; HotMan.Save(gpCfgDir + gNameSCFile); end; function InitPropStorage(Owner: TComponent): TIniPropStorageEx; var sWidth, sHeight: String; begin Result:= TIniPropStorageEx.Create(Owner); Result.IniFileName:= gpCfgDir + 'session.ini'; if Owner is TCustomForm then with Owner as TCustomForm do begin if (Monitor = nil) then Result.IniSection:= ClassName else begin sWidth:= IntToStr(Monitor.Width); sHeight:= IntToStr(Monitor.Height); Result.IniSection:= ClassName + '(' + sWidth + 'x' + sHeight + ')'; end; end; end; procedure FontToFontOptions(Font: TFont; out Options: TDCFontOptions); begin with Options do begin Name := Font.Name; Size := Font.Size; Style := Font.Style; end; end; procedure FontOptionsToFont(Options: TDCFontOptions; Font: TFont); begin with Options do begin Font.Name := Name; Font.Size := Size; Font.Style := Style; end; end; procedure OldKeysToNew(ActionEnabled: Boolean; ShiftState: TShiftState; Action: TKeyTypingAction); var Modifier: TKeyTypingModifier; begin if ActionEnabled then begin for Modifier in TKeyTypingModifier do begin if TKeyTypingModifierToShift[Modifier] = ShiftState then gKeyTyping[Modifier] := Action else if gKeyTyping[Modifier] = Action then gKeyTyping[Modifier] := ktaNone; end; end else begin for Modifier in TKeyTypingModifier do begin if gKeyTyping[Modifier] = Action then begin gKeyTyping[Modifier] := ktaNone; Break; end; end; end; end; function LoadStringsFromFile(var list: TStringListEx; const sFileName:String; MaxStrings: Integer = 0): Boolean; var i:Integer; begin Assert(list <> nil,'LoadStringsFromFile: list=nil'); list.Clear; Result:=False; if mbFileExists(sFileName) then begin list.LoadFromFile(sFileName); if MaxStrings > 0 then begin for i:=list.Count-1 downto 0 do if i>MaxStrings then list.Delete(i) else Break; end; Result:=True; end; end; procedure LoadDirHotList(AConfig: TXmlConfig; Node: TXmlNode); var Name, Path: String; begin glsHotDir.Clear; Node := Node.FindNode('DirectoryHotList'); if Assigned(Node) then begin Node := Node.FirstChild; while Assigned(Node) do begin if Node.CompareName('HotDir') = 0 then begin if AConfig.TryGetAttr(Node, 'Name', Name) and AConfig.TryGetAttr(Node, 'Path', Path) then begin glsHotDir.Add(Name + '=' + Path); end else DCDebug('Invalid entry in configuration: ' + AConfig.GetPathFromNode(Node) + '.'); end; Node := Node.NextSibling; end; end; end; procedure ConvertIniToXml; var MultiRename: TfrmMultiRename = nil; tmpFiles: TFiles = nil; begin SaveXmlConfig; // Force loading Multi-rename config if it wasn't used yet. tmpFiles := TFiles.Create(mbGetCurrentDir); MultiRename := TfrmMultiRename.Create(nil, nil, tmpFiles); try MultiRename.LoadPresetsIni(gIni); MultiRename.PublicSavePresets; finally FreeThenNil(MultiRename); FreeThenNil(tmpFiles); end; FreeAndNil(gIni); if mbFileExists(gpGlobalCfgDir + 'doublecmd.ini') then mbRenameFile(gpGlobalCfgDir + 'doublecmd.ini', gpGlobalCfgDir + 'doublecmd.ini.obsolete'); if mbFileExists(gpCfgDir + 'doublecmd.ini') then mbRenameFile(gpCfgDir + 'doublecmd.ini', gpCfgDir + 'doublecmd.ini.obsolete'); end; procedure CopySettingsFiles; begin { Create default configuration files if need } if gpCfgDir <> gpGlobalCfgDir then begin // extension file if not mbFileExists(gpCfgDir + 'doublecmd.ext') then CopyFile(gpGlobalCfgDir + 'doublecmd.ext.example', gpCfgDir + 'doublecmd.ext.example'); // pixmaps file if not mbFileExists(gpCfgDir + 'pixmaps.txt') then CopyFile(gpGlobalCfgDir + 'pixmaps.txt', gpCfgDir + 'pixmaps.txt'); // multiarc configuration file if not mbFileExists(gpCfgDir + 'multiarc.ini') then CopyFile(gpGlobalCfgDir + 'multiarc.ini', gpCfgDir + 'multiarc.ini'); end; end; procedure CreateGlobs; begin gExts := TExts.Create; gColorExt := TColorExt.Create; gFileInfoToolTip := TFileInfoToolTip.Create; glsHotDir := TStringListEx.Create; glsDirHistory := TStringListEx.Create; glsCmdLineHistory := TStringListEx.Create; glsMaskHistory := TStringListEx.Create; glsSearchHistory := TStringListEx.Create; glsReplaceHistory := TStringListEx.Create; glsIgnoreList := TStringListEx.Create; glsSearchExcludeFiles:= TStringList.Create; glsSearchExcludeDirectories:= TStringList.Create; gSearchTemplateList := TSearchTemplateList.Create; gDSXPlugins := TDSXModuleList.Create; gWCXPlugins := TWCXModuleList.Create; gWDXPlugins := TWDXModuleList.Create; gWFXPlugins := TWFXModuleList.Create; gWLXPlugins := TWLXModuleList.Create; gMultiArcList := TMultiArcList.Create; ColSet := TPanelColumnsList.Create; HotMan := THotKeyManager.Create; end; procedure DestroyGlobs; begin FreeThenNil(gColorExt); FreeThenNil(gFileInfoToolTip); FreeThenNil(glsDirHistory); FreeThenNil(glsCmdLineHistory); FreeThenNil(glsHotDir); FreeThenNil(glsMaskHistory); FreeThenNil(glsSearchHistory); FreeThenNil(glsReplaceHistory); FreeThenNil(glsIgnoreList); FreeThenNil(glsSearchExcludeFiles); FreeThenNil(glsSearchExcludeDirectories); FreeThenNil(gExts); FreeThenNil(gIni); FreeThenNil(gConfig); FreeThenNil(gSearchTemplateList); FreeThenNil(gDSXPlugins); FreeThenNil(gWCXPlugins); FreeThenNil(gWDXPlugins); FreeThenNil(gWFXPlugins); FreeThenNil(gMultiArcList); FreeThenNil(gWLXPlugins); FreeThenNil(ColSet); FreeThenNil(HotMan); end; procedure SetDefaultConfigGlobs; procedure SetDefaultExternalTool(var ExternalToolOptions: TExternalToolOptions); begin with ExternalToolOptions do begin Enabled := False; Path := ''; Parameters := ''; RunInTerminal := False; KeepTerminalOpen := False; end; end; begin { Language page } gPOFileName := ''; { Behaviours page } gRunInTerm := RunInTerm; gRunTerm := RunTerm; gOnlyOneAppInstance := False; gLynxLike := True; gSortCaseSensitivity := cstNotSensitive; gSortNatural := False; gSortFolderMode := sfmSortNameShowFirst; gNewFilesPosition := nfpSortedPosition; gUpdatedFilesPosition := ufpNoChange; gFileSizeFormat := fsfFloat; gMinimizeToTray := False; gAlwaysShowTrayIcon := False; gMouseSelectionEnabled := True; gMouseSelectionButton := 0; // Left gScrollMode := smLineByLine; gWheelScrollLines:= Mouse.WheelScrollLines; gAutoFillColumns := False; gAutoSizeColumn := 1; gDateTimeFormat := DefaultDateTimeFormat; gCutTextToColWidth := True; gShowSystemFiles := False; // Under Mac OS X loading file list in separate thread are very very slow // so disable and hide this option under Mac OS X Carbon gListFilesInThread := {$IFDEF LCLCARBON}False{$ELSE}True{$ENDIF}; gLoadIconsSeparately := True; gDelayLoadingTabs := True; gHighlightUpdatedFiles := True; gDriveBlackList := ''; gDriveBlackListUnmounted := False; { Tools page } SetDefaultExternalTool(gExternalTools[etViewer]); SetDefaultExternalTool(gExternalTools[etEditor]); SetDefaultExternalTool(gExternalTools[etDiffer]); { Fonts page } gFonts[dcfMain].Name := 'default'; gFonts[dcfMain].Size := 10; gFonts[dcfMain].Style := [fsBold]; gFonts[dcfEditor].Name := MonoSpaceFont; gFonts[dcfEditor].Size := 14; gFonts[dcfEditor].Style := []; gFonts[dcfViewer].Name := MonoSpaceFont; gFonts[dcfViewer].Size := 14; gFonts[dcfViewer].Style := []; gFonts[dcfLog].Name := MonoSpaceFont; gFonts[dcfLog].Size := 12; gFonts[dcfLog].Style := []; gFonts[dcfViewerBook].Name := 'default'; gFonts[dcfViewerBook].Size := 16; gFonts[dcfViewerBook].Style := [fsBold]; { Colors page } gForeColor := clWindowText; gBackColor := clWindow; gBackColor2 := clWindow; gMarkColor := clRed; gCursorColor := clHighlight; gCursorText := clHighlightText; gIndForeColor := clBlack; gIndBackColor := clWhite; gUseInvertedSelection := False; gInactivePanelBrightness := 100; // Full brightness gIndUseGradient := True; { Layout page } gMainMenu := True; gButtonBar := True; gToolBarFlat := True; gToolBarButtonSize := 24; gToolBarIconSize := 16; gDriveBar1 := True; gDriveBar2 := True; gDriveBarFlat := True; gDrivesListButton := True; gDirectoryTabs := True; gCurDir := True; gTabHeader := True; gStatusBar := True; gCmdLine := True; gLogWindow := False; gTermWindow := False; gKeyButtons := True; gInterfaceFlat := True; gDriveInd := False; gDriveFreeSpace := True; gProgInMenuBar := False; gPanelOfOp := True; gShortFormatDriveInfo := True; gHorizontalFilePanels := False; gDrivesListButtonOptions := [dlbShowLabel, dlbShowFileSystem, dlbShowFreeSpace]; { Keys page } gKeyTyping[ktmNone] := ktaCommandLine; gKeyTyping[ktmAlt] := ktaNone; gKeyTyping[ktmCtrlAlt] := ktaQuickSearch; { File operations page } gCopyBlockSize := 524288; gUseMmapInSearch := False; gPartialNameSearch := True; gWipePassNumber := 1; gDropReadOnlyFlag := False; gProcessComments := True; gRenameSelOnlyName := False; gShowCopyTabSelectPanel := False; gUseTrash := True; gSkipFileOpError := False; gShowDialogOnDragDrop := False; gOverwriteFolder := False; gFileOperationsProgressKind := fopkSeparateWindow; gFileOperationsConfirmations := [focCopy, focMove, focDelete, focDeleteToTrash]; // Operations options gOperationOptionSymLinks := fsooslNone; gOperationOptionCorrectLinks := False; gOperationOptionFileExists := fsoofeNone; gOperationOptionDirectoryExists := fsoodeNone; gOperationOptionSetPropertyError := fsoospeNone; gOperationOptionReserveSpace := False; gOperationOptionCheckFreeSpace := True; gOperationOptionCopyAttributes := True; gOperationOptionCopyTime := True; gOperationOptionCopyOwnership := True; { Tabs page } gDirTabOptions := [tb_always_visible, tb_confirm_close_all, tb_show_asterisk_for_locked, tb_activate_panel_on_click]; gDirTabLimit := 32; gDirTabPosition := tbpos_top; { Log page } gLogFile := False; gLogFileName := gpCfgDir + 'doublecmd.log'; gLogOptions := [log_cp_mv_ln, log_delete, log_dir_op, log_arc_op, log_vfs_op, log_success, log_errors, log_info]; { Configuration page } gSaveConfiguration := True; gSaveSearchReplaceHistory := True; gSaveDirHistory := True; gSaveCmdLineHistory := True; gSaveFileMaskHistory := True; { Quick Search/Filter page } gQuickSearchOptions.Match := [qsmBeginning, qsmEnding]; gQuickSearchOptions.Items := qsiFilesAndDirectories; gQuickSearchOptions.SearchCase := qscInsensitive; gQuickFilterAutoHide := True; { Miscellaneous page } gGridVertLine := False; gGridHorzLine := False; gShowWarningMessages := True; gSpaceMovesDown := False; gDirBrackets := True; gShowToolTipMode := [stm_show_for_all]; gThumbSave := True; gThumbSize.cx := 128; gThumbSize.cy := 128; { Auto refresh page } gWatchDirs := [watch_file_name_change, watch_attributes_change]; gWatchDirsExclude := ''; gWatcherMode := fswmPreventDelete; { Icons page } gShowIcons := sim_all_and_exe; gShowIconsNew := gShowIcons; gIconOverlays := False; gIconsSize := 16; gIconsSizeNew := gIconsSize; gIconsExclude := False; gIconsExcludeDirs := EmptyStr; gCustomDriveIcons := False; gIconsInMenus := False; gIconsInMenusSize := 16; gIconsInMenusSizeNew := gIconsInMenusSize; { Ignore list page } gIgnoreListFileEnabled := False; gIgnoreListFile := gpCfgDir + 'ignorelist.txt'; {Viewer} gImageStretch := False; gPreviewVisible := False; gCopyMovePath1 := ''; gCopyMovePath2 := ''; gCopyMovePath3 := ''; gCopyMovePath4 := ''; gCopyMovePath5 := ''; gImagePaintMode := 'Pen'; gImagePaintWidth := 5; gColCount := 1; gImagePaintColor := clRed; gBookBackgroundColor := clBlack; gBookFontColor := clWhite; gTextPosition:= 0; gViewerMode:= 0; { - Other - } gGoToRoot := False; gLuaLib := LuaDLL; gNameSCFile := 'shortcuts.scf'; gLastUsedPacker := 'zip'; gUseShellForFileOperations := {$IF DEFINED(MSWINDOWS)}WindowsVersion >= wvVista{$ELSE}False{$ENDIF}; gExts.Clear; gColorExt.Clear; gFileInfoToolTip.Clear; glsHotDir.Clear; glsDirHistory.Clear; glsMaskHistory.Clear; glsSearchHistory.Clear; glsReplaceHistory.Clear; glsIgnoreList.Clear; gSearchTemplateList.Clear; gDSXPlugins.Clear; gWCXPlugins.Clear; gWDXPlugins.Clear; gWFXPlugins.Clear; gWLXPlugins.Clear; gMultiArcList.Clear; ColSet.Clear; end; procedure SetDefaultNonConfigGlobs; begin { - Not in config - } gHelpLang := ''; gRepeatPassword := True; gDirHistoryCount := 30; gFirstTextSearch := True; gErrorFile := gpCfgDir + ExtractOnlyFileName(Application.ExeName) + '.err'; end; function OpenConfig(var ErrorMessage: String): Boolean; begin if Assigned(gConfig) then Exit(True); // Check global directory for XML config. if (gpCmdLineCfgDir = EmptyStr) and mbFileExists(gpGlobalCfgDir + 'doublecmd.xml') then begin gConfig := TXmlConfig.Create(gpGlobalCfgDir + 'doublecmd.xml'); gUseConfigInProgramDir := True; if mbFileAccess(gpGlobalCfgDir + 'doublecmd.xml', fmOpenRead or fmShareDenyWrite) then begin LoadConfigCheckErrors(@LoadGlobalConfig, gpGlobalCfgDir + 'doublecmd.xml', ErrorMessage); gUseConfigInProgramDir := gConfig.GetValue(gConfig.RootNode, 'Configuration/UseConfigInProgramDir', False); if not gUseConfigInProgramDir then begin if mbFileExists(gpCfgDir + 'doublecmd.xml') then // Close global config so that the local config is opened below. FreeAndNil(gConfig) else // Local config is used but it doesn't exist. Use global config that has just // been read but set file name accordingly and later save to local config. gConfig.FileName := gpCfgDir + 'doublecmd.xml'; end; end else begin // Configuration file is not readable. AddStrWithSep(ErrorMessage, 'Config file "' + gpGlobalCfgDir + 'doublecmd.xml' + '" exists but is not readable.', LineEnding); Exit(False); end; end; // Check user directory for XML config. if not Assigned(gConfig) and mbFileExists(gpCfgDir + 'doublecmd.xml') then begin gConfig := TXmlConfig.Create(gpCfgDir + 'doublecmd.xml'); gUseConfigInProgramDir := False; if mbFileAccess(gpCfgDir + 'doublecmd.xml', fmOpenRead or fmShareDenyWrite) then begin LoadConfigCheckErrors(@LoadGlobalConfig, gpCfgDir + 'doublecmd.xml', ErrorMessage); end else begin // Configuration file is not readable. AddStrWithSep(ErrorMessage, 'Config file "' + gpCfgDir + 'doublecmd.xml' + '" exists but is not readable.', LineEnding); Exit(False); end; end; if not Assigned(gConfig) then begin // Open INI config if present. // Check global directory for INI config. if not Assigned(gIni) and mbFileAccess(gpGlobalCfgDir + 'doublecmd.ini', fmOpenRead or fmShareDenyWrite) then begin gIni := TIniFileEx.Create(gpGlobalCfgDir + 'doublecmd.ini', fmOpenRead or fmShareDenyWrite); gUseConfigInProgramDir := gIni.ReadBool('Configuration', 'UseIniInProgramDir', False); if not gUseConfigInProgramDir then FreeAndNil(gIni) else begin if mbFileAccess(gpGlobalCfgDir + 'doublecmd.ini', fmOpenWrite or fmShareDenyWrite) then begin FreeAndNil(gIni); gIni := TIniFileEx.Create(gpGlobalCfgDir + 'doublecmd.ini', fmOpenWrite or fmShareDenyWrite); end else begin DCDebug('Warning: Config file "' + gpGlobalCfgDir + 'doublecmd.ini' + '" is not accessible for writing. Configuration will not be saved.'); end; end; end; // Check user directory for INI config. if not Assigned(gIni) and mbFileAccess(gpCfgDir + 'doublecmd.ini', fmOpenRead or fmShareDenyWrite) then begin gIni := TIniFileEx.Create(gpCfgDir + 'doublecmd.ini', fmOpenRead or fmShareDenyWrite); gUseConfigInProgramDir := False; end; if Assigned(gIni) then begin DebugLn('Converted old configuration from ' + gIni.FileName); if gUseConfigInProgramDir then gConfig := TXmlConfig.Create(gpGlobalCfgDir + 'doublecmd.xml') else gConfig := TXmlConfig.Create(gpCfgDir + 'doublecmd.xml'); end; end; // By default use config in user directory. if not Assigned(gConfig) then begin gConfig := TXmlConfig.Create(gpCfgDir + 'doublecmd.xml'); gUseConfigInProgramDir := False; end; gUseConfigInProgramDirNew := gUseConfigInProgramDir; // If global config is used then set config directory as global config directory. if gUseConfigInProgramDir then gpCfgDir := gpGlobalCfgDir; if mbFileExists(gpCfgDir + 'doublecmd.xml') and (not mbFileAccess(gpCfgDir + 'doublecmd.xml', fmOpenWrite or fmShareDenyWrite)) then begin DCDebug('Warning: Config file "' + gpCfgDir + 'doublecmd.xml' + '" is not accessible for writing. Configuration will not be saved.'); end; if not mbDirectoryExists(gpCfgDir) then mbForceDirectory(gpCfgDir); Result := True; end; function LoadGlobs: Boolean; var ErrorMessage: String = ''; begin Result := False; if not OpenConfig(ErrorMessage) then Exit; DCDebug('Loading configuration from ', gpCfgDir); SetDefaultConfigGlobs; if Assigned(gIni) then LoadIniConfig else if Assigned(gConfig) then LoadXmlConfig else begin DCDebug('Error: No config created.'); Exit(False); end; // Update plugins if DC version is changed if (gPreviousVersion <> dcVersion) then UpdatePlugins; // Set secondary variables for options that need restart. gShowIconsNew := gShowIcons; gIconsSizeNew := gIconsSize; gIconsInMenusSizeNew := gIconsInMenusSize; CopySettingsFiles; { Internal associations } if mbFileExists(gpCfgDir + 'doublecmd.ext') then LoadConfigCheckErrors(@LoadExtsConfig, gpCfgDir + 'doublecmd.ext', ErrorMessage); if mbFileExists(gpCfgDir + 'dirhistory.txt') then begin LoadStringsFromFile(glsDirHistory, gpCfgDir + 'dirhistory.txt', cMaxStringItems); mbRenameFile(gpCfgDir + 'dirhistory.txt', gpCfgDir + 'dirhistory.txt.obsolete'); end; if mbFileExists(gpCfgDir + 'cmdhistory.txt') then begin LoadStringsFromFile(glsCmdLineHistory, gpCfgDir + 'cmdhistory.txt', cMaxStringItems); mbRenameFile(gpCfgDir + 'cmdhistory.txt', gpCfgDir + 'cmdhistory.txt.obsolete'); end; if mbFileExists(gpCfgDir + 'maskhistory.txt') then begin LoadStringsFromFile(glsMaskHistory, gpCfgDir + 'maskhistory.txt', cMaxStringItems); mbRenameFile(gpCfgDir + 'maskhistory.txt', gpCfgDir + 'maskhistory.txt.obsolete'); end; if mbFileExists(gpCfgDir + 'searchhistory.txt') then begin LoadStringsFromFile(glsSearchHistory, gpCfgDir + 'searchhistory.txt', cMaxStringItems); mbRenameFile(gpCfgDir + 'searchhistory.txt', gpCfgDir + 'searchhistory.txt.obsolete'); end; if mbFileExists(gpCfgDir + 'replacehistory.txt') then begin LoadStringsFromFile(glsReplaceHistory, gpCfgDir + 'replacehistory.txt', cMaxStringItems); mbRenameFile(gpCfgDir + 'replacehistory.txt', gpCfgDir + 'replacehistory.txt.obsolete'); end; LoadStringsFromFile(glsIgnoreList, ReplaceEnvVars(gIgnoreListFile)); { Hotkeys } if not mbFileExists(gpCfgDir + gNameSCFile) then gNameSCFile := 'shortcuts.scf'; // Rename old shortcuts file to new name. if mbFileExists(gpCfgDir + 'shortcuts.ini') and not mbFileExists(gpCfgDir + gNameSCFile) then mbRenameFile(gpCfgDir + 'shortcuts.ini', gpCfgDir + gNameSCFile); LoadConfigCheckErrors(@LoadHotManConfig, gpCfgDir + gNameSCFile, ErrorMessage); { MultiArc addons } if mbFileExists(gpCfgDir + 'multiarc.ini') then LoadConfigCheckErrors(@LoadMultiArcConfig, gpCfgDir + 'multiarc.ini', ErrorMessage); { Various history } if mbFileExists(gpCfgDir + 'history.xml') then LoadConfigCheckErrors(@LoadHistoryConfig, gpCfgDir + 'history.xml', ErrorMessage); { Localization } DoLoadLng; msgLoadLng; FillFileFuncList; Result := AskUserOnError(ErrorMessage); end; procedure SaveGlobs; var TmpConfig: TXmlConfig; Ini: TIniFileEx = nil; ErrMsg: String = ''; begin if (gUseConfigInProgramDirNew <> gUseConfigInProgramDir) and (gpCmdLineCfgDir = EmptyStr) then begin LoadPaths; if gUseConfigInProgramDirNew then gpCfgDir := gpGlobalCfgDir; { Save location of configuration files } if Assigned(gIni) then begin // Still using INI config. FreeThenNil(gIni); try Ini:= TIniFileEx.Create(gpGlobalCfgDir + 'doublecmd.ini'); Ini.WriteBool('Configuration', 'UseIniInProgramDir', gUseConfigInProgramDirNew); finally FreeThenNil(Ini); end; gIni := TIniFileEx.Create(gpCfgDir + 'doublecmd.ini'); end; if mbFileAccess(gpGlobalCfgDir + 'doublecmd.xml', fmOpenWrite or fmShareDenyWrite) then begin TmpConfig := TXmlConfig.Create(gpGlobalCfgDir + 'doublecmd.xml', True); try TmpConfig.SetValue(TmpConfig.RootNode, 'Configuration/UseConfigInProgramDir', gUseConfigInProgramDirNew); TmpConfig.Save; finally TmpConfig.Free; end; end; gConfig.FileName := gpCfgDir + 'doublecmd.xml'; end; if not mbFileExists(gpCfgDir + gNameSCFile) then gNameSCFile := 'shortcuts.scf'; if mbFileAccess(gpCfgDir, fmOpenWrite or fmShareDenyNone) then begin SaveWithCheck(@SaveCfgExts, 'extensions configuration', ErrMsg); SaveWithCheck(@SaveCfgIgnoreList, 'ignore list', ErrMsg); SaveWithCheck(@SaveCfgMultiArcList, 'multi arc list', ErrMsg); SaveWithCheck(@SaveCfgHotkeys, 'hotkeys', ErrMsg); SaveWithCheck(@SaveCfgMainConfig, 'main configuration', ErrMsg); SaveWithCheck(@SaveHistoryConfig, 'various history', ErrMsg); if ErrMsg <> EmptyStr then DebugLn(ErrMsg); end else DebugLn('Not saving configuration - no write access to ', gpCfgDir); end; procedure LoadIniConfig; var oldQuickSearch: Boolean = True; oldQuickFilter: Boolean = False; oldQuickSearchMode: TShiftState = [ssCtrl, ssAlt]; oldQuickFilterMode: TShiftState = []; begin { Layout page } gButtonBar := gIni.ReadBool('Layout', 'ButtonBar', True); gToolBarFlat := gIni.ReadBool('ButtonBar', 'FlatIcons', True); gToolBarButtonSize := gIni.ReadInteger('ButtonBar', 'ButtonHeight', 16); gToolBarIconSize := gIni.ReadInteger('ButtonBar', 'SmallIconSize', 16); gDriveBar1 := gIni.ReadBool('Layout', 'DriveBar1', True); gDriveBar2 := gIni.ReadBool('Layout', 'DriveBar2', True); gDriveBarFlat := gIni.ReadBool('Layout', 'DriveBarFlat', True); gDrivesListButton := gIni.ReadBool('Layout', 'DriveMenuButton', True); gDirectoryTabs := gIni.ReadBool('Layout', 'DirectoryTabs', True); gCurDir := gIni.ReadBool('Layout', 'CurDir', True); gTabHeader := gIni.ReadBool('Layout', 'TabHeader', True); gStatusBar := gIni.ReadBool('Layout', 'StatusBar', True); gCmdLine := gIni.ReadBool('Layout', 'CmdLine', True); gLogWindow := gIni.ReadBool('Layout', 'LogWindow', True); gTermWindow := gIni.ReadBool('Layout', 'TermWindow', False); gKeyButtons := gIni.ReadBool('Layout', 'KeyButtons', True); gInterfaceFlat := gIni.ReadBool('Layout', 'InterfaceFlat', True); gShowSystemFiles := gIni.ReadBool('Configuration', 'ShowSystemFiles', False); gPOFileName := gIni.ReadString('Configuration', 'Language', '?'); gRunInTerm := gIni.ReadString('Configuration', 'RunInTerm', RunInTerm); gOnlyOneAppInstance:= gIni.ReadBool('Configuration', 'OnlyOnce', False); if gIni.ReadBool('Configuration', 'CaseSensitiveSort', False) = False then gSortCaseSensitivity := cstNotSensitive else gSortCaseSensitivity := cstLocale; gLynxLike := gIni.ReadBool('Configuration', 'LynxLike', True); if gIni.ValueExists('Configuration', 'ShortFileSizeFormat') then begin if gIni.ReadBool('Configuration', 'ShortFileSizeFormat', True) then gFileSizeFormat := fsfFloat else gFileSizeFormat := fsfB; end else gFileSizeFormat := TFileSizeFormat(gIni.ReadInteger('Configuration', 'FileSizeFormat', Ord(fsfFloat))); gScrollMode := TScrollMode(gIni.ReadInteger('Configuration', 'ScrollMode', Integer(gScrollMode))); gMinimizeToTray := gIni.ReadBool('Configuration', 'MinimizeToTray', False); gAlwaysShowTrayIcon := gIni.ReadBool('Configuration', 'AlwaysShowTrayIcon', False); gDateTimeFormat := GetValidDateTimeFormat(gIni.ReadString('Configuration', 'DateTimeFormat', DefaultDateTimeFormat), DefaultDateTimeFormat); gDriveBlackList:= gIni.ReadString('Configuration', 'DriveBlackList', ''); gSpaceMovesDown := gIni.ReadBool('Configuration', 'SpaceMovesDown', False); {$IFNDEF LCLCARBON} // Under Mac OS X loading file list in separate thread are very very slow // so disable and hide this option under Mac OS X Carbon gListFilesInThread := gIni.ReadBool('Configuration', 'ListFilesInThread', gListFilesInThread); {$ENDIF} gLoadIconsSeparately := gIni.ReadBool('Configuration', 'LoadIconsSeparately', gLoadIconsSeparately); gMouseSelectionEnabled:= gIni.ReadBool('Configuration', 'MouseSelectionEnabled', True); gMouseSelectionButton := gIni.ReadInteger('Configuration', 'MouseSelectionButton', 0); gAutoFillColumns:= gIni.ReadBool('Configuration', 'AutoFillColumns', False); gAutoSizeColumn := gIni.ReadInteger('Configuration', 'AutoSizeColumn', 1); gDirTabOptions := TTabsOptions(gIni.ReadInteger('Configuration', 'DirTabOptions', Integer(gDirTabOptions))); gDirTabLimit := gIni.ReadInteger('Configuration', 'DirTabLimit', 32); gDirTabPosition := TTabsPosition(gIni.ReadInteger('Configuration', 'DirTabPosition', Integer(gDirTabPosition))); gExternalTools[etEditor].Enabled := gIni.ReadBool('Configuration', 'UseExtEdit', False); gExternalTools[etViewer].Enabled := gIni.ReadBool('Configuration', 'UseExtView', False); gExternalTools[etDiffer].Enabled := gIni.ReadBool('Configuration', 'UseExtDiff', False); gExternalTools[etEditor].Path := gIni.ReadString('Configuration', 'ExtEdit', ''); gExternalTools[etViewer].Path := gIni.ReadString('Configuration', 'ExtView', ''); gExternalTools[etDiffer].Path := gIni.ReadString('Configuration', 'ExtDiff', ''); gRunTerm := gIni.ReadString('Configuration', 'RunTerm', RunTerm); gLuaLib:=gIni.ReadString('Configuration', 'LuaLib', gLuaLib); { Fonts } gFonts[dcfMain].Name:=gIni.ReadString('Configuration', 'Font.Name', 'default'); gFonts[dcfEditor].Name:=gIni.ReadString('Editor', 'Font.Name', MonoSpaceFont); gFonts[dcfViewer].Name:=gIni.ReadString('Viewer', 'Font.Name', MonoSpaceFont); gFonts[dcfMain].Size:=gIni.ReadInteger('Configuration', 'Font.Size', 10); gFonts[dcfEditor].Size:=gIni.ReadInteger('Editor', 'Font.Size', 14); gFonts[dcfViewer].Size:=gIni.ReadInteger('Viewer', 'Font.Size', 14); gFonts[dcfMain].Style := TFontStyles(gIni.ReadInteger('Configuration', 'Font.Style', 1)); gFonts[dcfEditor].Style := TFontStyles(gIni.ReadInteger('Editor', 'Font.Style', 0)); gFonts[dcfViewer].Style := TFontStyles(gIni.ReadInteger('Viewer', 'Font.Style', 0)); { Colors } gForeColor := gIni.ReadInteger('Colors', 'ForeColor', clWindowText); gBackColor := gIni.ReadInteger('Colors', 'BackColor', clWindow); gBackColor2 := gIni.ReadInteger('Colors', 'BackColor2', clWindow); gMarkColor := gIni.ReadInteger('Colors', 'MarkColor', clRed); gCursorColor := gIni.ReadInteger('Colors', 'CursorColor', clHighlight); gCursorText := gIni.ReadInteger('Colors', 'CursorText', clHighlightText); gUseInvertedSelection:= gIni.ReadBool('Colors', 'UseInvertedSelection', False); gInactivePanelBrightness:= gIni.ReadInteger('Colors', 'InactivePanelBrightness', gInactivePanelBrightness); gUseFrameCursor:= gIni.ReadBool('Colors', 'UseFrameCursor', gUseFrameCursor); { File operations } gCopyBlockSize := gIni.ReadInteger('Configuration', 'CopyBlockSize', 65536); gSkipFileOpError:= gIni.ReadBool('Configuration', 'SkipFileOpError', False); gDropReadOnlyFlag := gIni.ReadBool('Configuration', 'DropReadOnlyFlag', True); gUseMmapInSearch := gIni.ReadBool('Configuration', 'UseMmapInSearch', False); gWipePassNumber:= gIni.ReadInteger('Configuration', 'WipePassNumber', 1); gProcessComments := gIni.ReadBool('Configuration', 'ProcessComments', True); gRenameSelOnlyName:= gIni.ReadBool('Configuration', 'RenameSelOnlyName', false); gShowCopyTabSelectPanel:= gIni.ReadBool('Configuration', 'ShowCopyTabSelectPanel', false); gUseTrash := gIni.ReadBool('Configuration', 'UseTrash', True); // 05.05.2009 - read global trash option from configuration file gShowDialogOnDragDrop := gIni.ReadBool('Configuration', 'ShowDialogOnDragDrop', gShowDialogOnDragDrop); { Log } gLogFile := gIni.ReadBool('Configuration', 'LogFile', True); gLogFileName := gIni.ReadString('Configuration', 'LogFileName', gpCfgDir + 'doublecmd.log'); gLogOptions := TLogOptions(gIni.ReadInteger('Configuration', 'LogOptions', Integer(gLogOptions))); { Configuration page } gSaveDirHistory := gIni.ReadBool('Configuration', 'SaveDirHistory', True); gSaveCmdLineHistory := gIni.ReadBool('Configuration', 'SaveCmdLineHistory', True); gSaveFileMaskHistory := gIni.ReadBool('Configuration', 'SaveFileMaskHistory', True); { Quick Search page} oldQuickSearch := gIni.ReadBool('Configuration', 'QuickSearch', oldQuickSearch); oldQuickSearchMode := TShiftState(gIni.ReadInteger('Configuration', 'QuickSearchMode', Integer(oldQuickSearchMode))); OldKeysToNew(oldQuickSearch, oldQuickSearchMode, ktaQuickSearch); oldQuickFilter := gIni.ReadBool('Configuration', 'QuickFilter', oldQuickFilter); oldQuickFilterMode := TShiftState(gIni.ReadInteger('Configuration', 'QuickFilterMode', Integer(oldQuickFilterMode))); OldKeysToNew(oldQuickFilter, oldQuickFilterMode, ktaQuickFilter); if gIni.ReadBool('Configuration', 'QuickSearchMatchBeginning', qsmBeginning in gQuickSearchOptions.Match) then Include(gQuickSearchOptions.Match, qsmBeginning) else Exclude(gQuickSearchOptions.Match, qsmBeginning); if gIni.ReadBool('Configuration', 'QuickSearchMatchEnding', qsmEnding in gQuickSearchOptions.Match) then Include(gQuickSearchOptions.Match, qsmEnding) else Exclude(gQuickSearchOptions.Match, qsmEnding); { Misc page } gGridVertLine:= gIni.ReadBool('Configuration', 'GridVertLine', False); gGridHorzLine:= gIni.ReadBool('Configuration', 'GridHorzLine', False); gShowWarningMessages := gIni.ReadBool('Configuration', 'ShowWarningMessages', True); gDirBrackets:= gIni.ReadBool('Configuration', 'DirBrackets', True); gShowToolTipMode:= TShowToolTipMode(gIni.ReadInteger('Configuration', 'ShowToolTipMode', Integer(gShowToolTipMode))); { Auto refresh page } gWatchDirs := TWatchOptions(gIni.ReadInteger('Configuration', 'WatchDirs', Integer(gWatchDirs))); gWatchDirsExclude := gIni.ReadString('Configuration', 'WatchDirsExclude', ''); { Icons page } gShowIcons := TShowIconsMode(gIni.ReadInteger('Configuration', 'ShowIcons', Integer(gShowIcons))); gIconOverlays:= gIni.ReadBool('Configuration', 'IconOverlays', True); gIconsSize := gIni.ReadInteger('Configuration', 'IconsSize', 16); gCustomDriveIcons := gIni.ReadBool('Configuration', 'CustomDriveIcons', False); { Ignore list page } gIgnoreListFileEnabled:= gIni.ReadBool('Configuration', 'IgnoreListFileEnabled', False); gIgnoreListFile:= gIni.ReadString('Configuration', 'IgnoreListFile', gpCfgDir + 'ignorelist.txt'); gCutTextToColWidth := gIni.ReadBool('Configuration', 'CutTextToColWidth', True); gImageStretch:= gIni.ReadBool('Viewer', 'Image.Stretch', False); { Operations options } gOperationOptionSymLinks := TFileSourceOperationOptionSymLink( gIni.ReadInteger('Operations', 'Symlink', Integer(gOperationOptionSymLinks))); gOperationOptionCorrectLinks := gIni.ReadBool('Operations', 'CorrectLinks', gOperationOptionCorrectLinks); gOperationOptionFileExists := TFileSourceOperationOptionFileExists( gIni.ReadInteger('Operations', 'FileExists', Integer(gOperationOptionFileExists))); gOperationOptionDirectoryExists := TFileSourceOperationOptionDirectoryExists( gIni.ReadInteger('Operations', 'DirectoryExists', Integer(gOperationOptionDirectoryExists))); gOperationOptionCheckFreeSpace := gIni.ReadBool('Operations', 'CheckFreeSpace', gOperationOptionCheckFreeSpace); gIni.ReadSectionRaw('DirectoryHotList', glsHotDir); gColorExt.LoadIni; { Search template list } gSearchTemplateList.LoadFromIni(gIni); { Columns sets } ColSet.Load(gIni); { Plugins } gDSXPlugins.Load(gIni); gWCXPlugins.Load(gIni); gWDXPlugins.Load(gIni); gWFXPlugins.Load(gIni); gWLXPlugins.Load(gIni); end; procedure SaveIniConfig; var I: LongInt; begin gIni.EraseSection('DirectoryHotList'); for I:= 0 to glsHotDir.Count - 1 do gIni.WriteString('DirectoryHotList', glsHotDir.Names[I], glsHotDir.ValueFromIndex[I]); { Layout page } gIni.WriteBool('Layout', 'ButtonBar', gButtonBar); gIni.WriteBool('ButtonBar', 'FlatIcons', gToolBarFlat); gIni.WriteInteger('ButtonBar', 'ButtonHeight', gToolBarButtonSize); gIni.WriteInteger('ButtonBar', 'SmallIconSize', gToolBarIconSize); gIni.WriteBool('Layout', 'DriveBar1', gDriveBar1); gIni.WriteBool('Layout', 'DriveBar2', gDriveBar2); gIni.WriteBool('Layout', 'DriveBarFlat', gDriveBarFlat); gIni.WriteBool('Layout', 'DriveMenuButton', gDrivesListButton); gIni.WriteBool('Layout', 'DirectoryTabs', gDirectoryTabs); gIni.WriteBool('Layout', 'CurDir', gCurDir); gIni.WriteBool('Layout', 'TabHeader', gTabHeader); gIni.WriteBool('Layout', 'StatusBar', gStatusBar); gIni.WriteBool('Layout', 'CmdLine', gCmdLine); gIni.WriteBool('Layout', 'LogWindow', gLogWindow); gIni.WriteBool('Layout', 'TermWindow', gTermWindow); gIni.WriteBool('Layout', 'KeyButtons', gKeyButtons); gIni.WriteBool('Layout', 'InterfaceFlat', gInterfaceFlat); gIni.WriteBool('Configuration', 'ShowSystemFiles', gShowSystemFiles); gIni.WriteString('Configuration', 'Language', gPOFileName); gIni.WriteString('Configuration', 'RunInTerm', gRunInTerm); gIni.WriteBool('Configuration', 'OnlyOnce', gOnlyOneAppInstance); if gSortCaseSensitivity = cstNotSensitive then gIni.WriteBool('Configuration', 'CaseSensitiveSort', False) else gIni.WriteBool('Configuration', 'CaseSensitiveSort', True); gIni.WriteBool('Configuration', 'LynxLike', gLynxLike); gIni.WriteInteger('Configuration', 'FileSizeFormat', Ord(gFileSizeFormat)); gIni.WriteInteger('Configuration', 'ScrollMode', Integer(gScrollMode)); gIni.WriteBool('Configuration', 'MinimizeToTray', gMinimizeToTray); gIni.WriteBool('Configuration', 'AlwaysShowTrayIcon', gAlwaysShowTrayIcon); gIni.WriteString('Configuration', 'DateTimeFormat', gDateTimeFormat); gIni.WriteString('Configuration', 'DriveBlackList', gDriveBlackList); gIni.WriteBool('Configuration', 'SpaceMovesDown', gSpaceMovesDown); {$IFNDEF LCLCARBON} // Under Mac OS X loading file list in separate thread are very very slow // so disable and hide this option under Mac OS X Carbon gIni.WriteBool('Configuration', 'ListFilesInThread', gListFilesInThread); {$ENDIF} gIni.WriteBool('Configuration', 'LoadIconsSeparately', gLoadIconsSeparately); gIni.WriteBool('Configuration', 'MouseSelectionEnabled', gMouseSelectionEnabled); gIni.WriteInteger('Configuration', 'MouseSelectionButton', gMouseSelectionButton); gIni.WriteBool('Configuration', 'AutoFillColumns', gAutoFillColumns); gIni.WriteInteger('Configuration', 'AutoSizeColumn', gAutoSizeColumn); gIni.WriteInteger('Configuration', 'DirTabOptions', Integer(gDirTabOptions)); gIni.WriteInteger('Configuration', 'DirTabLimit', gDirTabLimit); gIni.WriteInteger('Configuration', 'DirTabPosition', Integer(gDirTabPosition)); gIni.WriteBool('Configuration', 'UseExtEdit', gExternalTools[etEditor].Enabled); gIni.WriteBool('Configuration', 'UseExtView', gExternalTools[etViewer].Enabled); gIni.WriteBool('Configuration', 'UseExtDiff', gExternalTools[etDiffer].Enabled); gIni.WriteString('Configuration', 'ExtEdit', gExternalTools[etEditor].Path); gIni.WriteString('Configuration', 'ExtView', gExternalTools[etViewer].Path); gIni.WriteString('Configuration', 'ExtDiff', gExternalTools[etDiffer].Path); gIni.WriteString('Configuration', 'RunTerm', gRunTerm); gIni.WriteString('Configuration', 'LuaLib', gLuaLib); { Fonts } gIni.WriteString('Configuration', 'Font.Name', gFonts[dcfMain].Name); gIni.WriteString('Editor', 'Font.Name', gFonts[dcfEditor].Name); gIni.WriteString('Viewer', 'Font.Name', gFonts[dcfViewer].Name); gIni.WriteInteger('Configuration', 'Font.Size', gFonts[dcfMain].Size); gIni.WriteInteger('Editor', 'Font.Size', gFonts[dcfEditor].Size); gIni.WriteInteger('Viewer', 'Font.Size', gFonts[dcfViewer].Size); gIni.WriteInteger('Configuration', 'Font.Style', Integer(gFonts[dcfMain].Style)); gIni.WriteInteger('Editor', 'Font.Style', Integer(gFonts[dcfEditor].Style)); gIni.WriteInteger('Viewer', 'Font.Style', Integer(gFonts[dcfViewer].Style)); { Colors } gIni.WriteInteger('Colors', 'ForeColor', gForeColor); gIni.WriteInteger('Colors', 'BackColor', gBackColor); gIni.WriteInteger('Colors', 'BackColor2', gBackColor2); gIni.WriteInteger('Colors', 'MarkColor', gMarkColor); gIni.WriteInteger('Colors', 'CursorColor', gCursorColor); gIni.WriteInteger('Colors', 'CursorText', gCursorText); gIni.WriteBool('Colors', 'UseInvertedSelection', gUseInvertedSelection); gIni.WriteInteger('Colors', 'InactivePanelBrightness', gInactivePanelBrightness); gIni.WriteBool('Colors', 'UseFrameCursor', gUseFrameCursor); { File operations } gIni.WriteInteger('Configuration', 'CopyBlockSize', gCopyBlockSize); gIni.WriteBool('Configuration', 'SkipFileOpError', gSkipFileOpError); gIni.WriteBool('Configuration', 'DropReadOnlyFlag', gDropReadOnlyFlag); gIni.WriteBool('Configuration', 'UseMmapInSearch', gUseMmapInSearch); gIni.WriteInteger('Configuration', 'WipePassNumber', gWipePassNumber); gIni.WriteBool('Configuration', 'ProcessComments', gProcessComments); gIni.WriteBool('Configuration', 'RenameSelOnlyName', gRenameSelOnlyName); gIni.WriteBool('Configuration', 'ShowCopyTabSelectPanel', gShowCopyTabSelectPanel); gIni.WriteBool('Configuration', 'UseTrash', gUseTrash); gIni.WriteBool('Configuration', 'ShowDialogOnDragDrop', gShowDialogOnDragDrop); { Log } gIni.WriteBool('Configuration', 'LogFile', gLogFile); gIni.WriteString('Configuration', 'LogFileName', gLogFileName); gIni.WriteInteger('Configuration', 'LogOptions', Integer(gLogOptions)); { Configuration page } gIni.WriteBool('Configuration', 'SaveDirHistory', gSaveDirHistory); gIni.WriteBool('Configuration', 'SaveCmdLineHistory', gSaveCmdLineHistory); gIni.WriteBool('Configuration', 'SaveFileMaskHistory', gSaveFileMaskHistory); { Quick Search page} gIni.WriteBool('Configuration', 'QuickSearchMatchBeginning', qsmBeginning in gQuickSearchOptions.Match); gIni.WriteBool('Configuration', 'QuickSearchMatchEnding', qsmEnding in gQuickSearchOptions.Match); { Misc page } gIni.WriteBool('Configuration', 'GridVertLine', gGridVertLine); gIni.WriteBool('Configuration', 'GridHorzLine', gGridHorzLine); gIni.WriteBool('Configuration', 'ShowWarningMessages', gShowWarningMessages); gIni.WriteBool('Configuration', 'DirBrackets', gDirBrackets); gIni.WriteInteger('Configuration', 'ShowToolTipMode', Integer(gShowToolTipMode)); { Auto refresh page } gIni.WriteInteger('Configuration', 'WatchDirs', Integer(gWatchDirs)); gIni.WriteString('Configuration', 'WatchDirsExclude', gWatchDirsExclude); { Icons page } gIni.WriteInteger('Configuration', 'ShowIcons', Integer(gShowIconsNew)); gIni.WriteBool('Configuration', 'IconOverlays', gIconOverlays); gIni.WriteInteger('Configuration', 'IconsSize', gIconsSizeNew); { Ignore list page } gIni.WriteBool('Configuration', 'IgnoreListFileEnabled', gIgnoreListFileEnabled); gIni.WriteString('Configuration', 'IgnoreListFile', gIgnoreListFile); gIni.WriteBool('Configuration', 'CutTextToColWidth', gCutTextToColWidth); gIni.WriteBool('Viewer', 'Image.Stretch', gImageStretch); { Operations options } gIni.WriteInteger('Operations', 'Symlink', Integer(gOperationOptionSymLinks)); gIni.WriteBool('Operations', 'CorrectLinks', gOperationOptionCorrectLinks); gIni.WriteInteger('Operations', 'FileExists', Integer(gOperationOptionFileExists)); gIni.WriteInteger('Operations', 'DirectoryExists', Integer(gOperationOptionDirectoryExists)); gIni.WriteBool('Operations', 'CheckFreeSpace', gOperationOptionCheckFreeSpace); gColorExt.SaveIni; { Search template list } gSearchTemplateList.SaveToIni(gIni); { Plugins } gDSXPlugins.Save(gIni); gWCXPlugins.Save(gIni); gWDXPlugins.Save(gIni); gWFXPlugins.Save(gIni); gWLXPlugins.Save(gIni); end; procedure LoadXmlConfig; procedure GetExtTool(Node: TXmlNode; var ExternalToolOptions: TExternalToolOptions); begin if Assigned(Node) then with ExternalToolOptions do begin Enabled := gConfig.GetAttr(Node, 'Enabled', Enabled); Path := gConfig.GetValue(Node, 'Path', Path); Parameters := gConfig.GetValue(Node, 'Parameters', Parameters); RunInTerminal := gConfig.GetValue(Node, 'RunInTerminal', RunInTerminal); KeepTerminalOpen := gConfig.GetValue(Node, 'KeepTerminalOpen', KeepTerminalOpen); end; end; procedure GetDCFont(Node: TXmlNode; var FontOptions: TDCFontOptions); begin if Assigned(Node) then gConfig.GetFont(Node, '', FontOptions.Name, FontOptions.Size, Integer(FontOptions.Style), FontOptions.Name, FontOptions.Size, Integer(FontOptions.Style)); end; procedure LoadOption(Node: TXmlNode; var Options: TDrivesListButtonOptions; Option: TDrivesListButtonOption; AName: String); var Value: Boolean; begin if gConfig.TryGetValue(Node, AName, Value) then begin if Value then Include(Options, Option) else Exclude(Options, Option); end; end; var Root, Node, SubNode: TXmlNode; LoadedConfigVersion: Integer; oldQuickSearch: Boolean = True; oldQuickFilter: Boolean = False; oldQuickSearchMode: TShiftState = [ssCtrl, ssAlt]; oldQuickFilterMode: TShiftState = []; KeyTypingModifier: TKeyTypingModifier; begin with gConfig do begin Root := gConfig.RootNode; { Double Commander Version } gPreviousVersion:= GetAttr(Root, 'DCVersion', EmptyStr); LoadedConfigVersion := GetAttr(Root, 'ConfigVersion', ConfigVersion); { Language page } gPOFileName := GetValue(Root, 'Language/POFileName', gPOFileName); { Behaviours page } Node := Root.FindNode('Behaviours'); if Assigned(Node) then begin gGoToRoot := GetValue(Node, 'GoToRoot', gGoToRoot); gRunInTerm := GetValue(Node, 'RunInTerminal', gRunInTerm); gRunTerm := GetValue(Node, 'RunTerminal', gRunTerm); gOnlyOneAppInstance := GetValue(Node, 'OnlyOneAppInstance', gOnlyOneAppInstance); gLynxLike := GetValue(Node, 'LynxLike', gLynxLike); if LoadedConfigVersion < 5 then begin if GetValue(Node, 'SortCaseSensitive', False) = False then gSortCaseSensitivity := cstNotSensitive else gSortCaseSensitivity := cstLocale; gSortNatural := GetValue(Node, 'SortNatural', gSortNatural); end; if LoadedConfigVersion < 6 then begin if GetValue(Node, 'ShortFileSizeFormat', True) then gFileSizeFormat := fsfFloat else gFileSizeFormat := fsfB; end else begin gFileSizeFormat := TFileSizeFormat(GetValue(Node, 'FileSizeFormat', Ord(gFileSizeFormat))); end; gMinimizeToTray := GetValue(Node, 'MinimizeToTray', gMinimizeToTray); gAlwaysShowTrayIcon := GetValue(Node, 'AlwaysShowTrayIcon', gAlwaysShowTrayIcon); gMouseSelectionEnabled := GetAttr(Node, 'Mouse/Selection/Enabled', gMouseSelectionEnabled); gMouseSelectionButton := GetValue(Node, 'Mouse/Selection/Button', gMouseSelectionButton); gScrollMode := TScrollMode(GetValue(Node, 'Mouse/ScrollMode', Integer(gScrollMode))); gWheelScrollLines:= GetValue(Node, 'Mouse/WheelScrollLines', gWheelScrollLines); gAutoFillColumns := GetValue(Node, 'AutoFillColumns', gAutoFillColumns); gAutoSizeColumn := GetValue(Node, 'AutoSizeColumn', gAutoSizeColumn); gDateTimeFormat := GetValidDateTimeFormat(GetValue(Node, 'DateTimeFormat', gDateTimeFormat), DefaultDateTimeFormat); gCutTextToColWidth := GetValue(Node, 'CutTextToColumnWidth', gCutTextToColWidth); gShowSystemFiles := GetValue(Node, 'ShowSystemFiles', gShowSystemFiles); {$IFNDEF LCLCARBON} // Under Mac OS X loading file list in separate thread are very very slow // so disable and hide this option under Mac OS X Carbon gListFilesInThread := GetValue(Node, 'ListFilesInThread', gListFilesInThread); {$ENDIF} gLoadIconsSeparately := GetValue(Node, 'LoadIconsSeparately', gLoadIconsSeparately); gDelayLoadingTabs := GetValue(Node, 'DelayLoadingTabs', gDelayLoadingTabs); gHighlightUpdatedFiles := GetValue(Node, 'HighlightUpdatedFiles', gHighlightUpdatedFiles); gDriveBlackList := GetValue(Node, 'DriveBlackList', gDriveBlackList); gDriveBlackListUnmounted := GetValue(Node, 'DriveBlackListUnmounted', gDriveBlackListUnmounted); end; { Tools page } GetExtTool(gConfig.FindNode(Root, 'Tools/Viewer'), gExternalTools[etViewer]); GetExtTool(gConfig.FindNode(Root, 'Tools/Editor'), gExternalTools[etEditor]); GetExtTool(gConfig.FindNode(Root, 'Tools/Differ'), gExternalTools[etDiffer]); { Fonts page } GetDCFont(gConfig.FindNode(Root, 'Fonts/Main'), gFonts[dcfMain]); GetDCFont(gConfig.FindNode(Root, 'Fonts/Editor'), gFonts[dcfEditor]); GetDCFont(gConfig.FindNode(Root, 'Fonts/Viewer'), gFonts[dcfViewer]); GetDCFont(gConfig.FindNode(Root, 'Fonts/Log'), gFonts[dcfLog]); GetDCFont(gConfig.FindNode(Root, 'Fonts/ViewerBook'), gFonts[dcfViewerBook]); { Colors page } Node := Root.FindNode('Colors'); if Assigned(Node) then begin gForeColor := GetValue(Node, 'Foreground', gForeColor); gBackColor := GetValue(Node, 'Background', gBackColor); gBackColor2 := GetValue(Node, 'Background2', gBackColor2); gMarkColor := GetValue(Node, 'Mark', gMarkColor); gCursorColor := GetValue(Node, 'Cursor', gCursorColor); gCursorText := GetValue(Node, 'CursorText', gCursorText); gUseInvertedSelection := GetValue(Node, 'UseInvertedSelection', gUseInvertedSelection); gInactivePanelBrightness := GetValue(Node, 'InactivePanelBrightness', gInactivePanelBrightness); gUseFrameCursor:= GetValue(Node,'UseFrameCursor', gUseFrameCursor); gIndForeColor := GetValue(Node, 'FreeSpaceIndicator/ForeColor', gIndForeColor); gIndBackColor := GetValue(Node, 'FreeSpaceIndicator/BackColor', gIndBackColor); gIndUseGradient := GetValue(Node, 'FreeSpaceIndicator/UseGradient', gIndUseGradient); gColorExt.Load(gConfig, Node); end; { ToolTips page } Node := Root.FindNode('ToolTips'); if Assigned(Node) then begin gShowToolTipMode := TShowToolTipMode(GetValue(Node, 'ShowToolTipMode', Integer(gShowToolTipMode))); gFileInfoToolTip.Load(gConfig, Node); end; { Layout page } Node := Root.FindNode('Layout'); if Assigned(Node) then begin gMainMenu := GetValue(Node, 'MainMenu', gMainMenu); SubNode := Node.FindNode('ButtonBar'); if Assigned(SubNode) then begin gButtonBar := GetAttr(SubNode, 'Enabled', gButtonBar); gToolBarFlat := GetValue(SubNode, 'FlatIcons', gToolBarFlat); gToolBarButtonSize := GetValue(SubNode, 'ButtonHeight', gToolBarButtonSize); if LoadedConfigVersion <= 1 then gToolBarIconSize := GetValue(SubNode, 'SmallIconSize', gToolBarIconSize) else gToolBarIconSize := GetValue(SubNode, 'IconSize', gToolBarIconSize); end; gDriveBar1 := GetValue(Node, 'DriveBar1', gDriveBar1); gDriveBar2 := GetValue(Node, 'DriveBar2', gDriveBar2); gDriveBarFlat := GetValue(Node, 'DriveBarFlat', gDriveBarFlat); if LoadedConfigVersion < 3 then gDrivesListButton := GetValue(Node, 'DriveMenuButton', gDrivesListButton) else begin SubNode := Node.FindNode('DrivesListButton'); if Assigned(SubNode) then begin gDrivesListButton := GetAttr(SubNode, 'Enabled', gDrivesListButton); LoadOption(SubNode, gDrivesListButtonOptions, dlbShowLabel, 'ShowLabel'); LoadOption(SubNode, gDrivesListButtonOptions, dlbShowFileSystem, 'ShowFileSystem'); LoadOption(SubNode, gDrivesListButtonOptions, dlbShowFreeSpace, 'ShowFreeSpace'); end; end; gDirectoryTabs := GetValue(Node, 'DirectoryTabs', gDirectoryTabs); gCurDir := GetValue(Node, 'CurrentDirectory', gCurDir); gTabHeader := GetValue(Node, 'TabHeader', gTabHeader); gStatusBar := GetValue(Node, 'StatusBar', gStatusBar); gCmdLine := GetValue(Node, 'CmdLine', gCmdLine); gLogWindow := GetValue(Node, 'LogWindow', gLogWindow); gTermWindow := GetValue(Node, 'TermWindow', gTermWindow); gKeyButtons := GetValue(Node, 'KeyButtons', gKeyButtons); gInterfaceFlat := GetValue(Node, 'InterfaceFlat', gInterfaceFlat); gDriveFreeSpace := GetValue(Node, 'DriveFreeSpace', gDriveFreeSpace); gDriveInd := GetValue(Node, 'DriveIndicator', gDriveInd); gProgInMenuBar := GetValue(Node, 'ProgressInMenuBar', gProgInMenuBar); gPanelOfOp := GetValue(Node, 'PanelOfOperationsInBackground', gPanelOfOp); gHorizontalFilePanels := GetValue(Node, 'HorizontalFilePanels', gHorizontalFilePanels); gShortFormatDriveInfo := GetValue(Node, 'ShortFormatDriveInfo', gShortFormatDriveInfo); end; { Files views } Node := Root.FindNode('FilesViews'); if Assigned(Node) then begin SubNode := Node.FindNode('Sorting'); if Assigned(SubNode) then begin gSortCaseSensitivity := TCaseSensitivity(GetValue(SubNode, 'CaseSensitivity', Integer(gSortCaseSensitivity))); gSortNatural := GetValue(SubNode, 'NaturalSorting', gSortNatural); gSortFolderMode:= TSortFolderMode(GetValue(SubNode, 'SortFolderMode', Integer(gSortFolderMode))); gNewFilesPosition := TNewFilesPosition(GetValue(SubNode, 'NewFilesPosition', Integer(gNewFilesPosition))); gUpdatedFilesPosition := TUpdatedFilesPosition(GetValue(SubNode, 'UpdatedFilesPosition', Integer(gUpdatedFilesPosition))); end; end; { Keys page } Node := Root.FindNode('Keyboard'); if Assigned(Node) then begin SubNode := FindNode(Node, 'Typing/Actions'); if Assigned(SubNode) then begin for KeyTypingModifier in TKeyTypingModifier do gKeyTyping[KeyTypingModifier] := TKeyTypingAction(GetValue(SubNode, TKeyTypingModifierToNodeName[KeyTypingModifier], Integer(gKeyTyping[KeyTypingModifier]))); end; end; { File operations page } Node := Root.FindNode('FileOperations'); if Assigned(Node) then begin gCopyBlockSize := GetValue(Node, 'BufferSize', gCopyBlockSize); gUseMmapInSearch := GetValue(Node, 'UseMmapInSearch', gUseMmapInSearch); gPartialNameSearch := GetValue(Node, 'PartialNameSearch', gPartialNameSearch); gWipePassNumber := GetValue(Node, 'WipePassNumber', gWipePassNumber); gDropReadOnlyFlag := GetValue(Node, 'DropReadOnlyFlag', gDropReadOnlyFlag); gProcessComments := GetValue(Node, 'ProcessComments', gProcessComments); gRenameSelOnlyName := GetValue(Node, 'RenameSelOnlyName', gRenameSelOnlyName); gShowCopyTabSelectPanel := GetValue(Node, 'ShowCopyTabSelectPanel', gShowCopyTabSelectPanel); gUseTrash := GetValue(Node, 'UseTrash', gUseTrash); gSkipFileOpError := GetValue(Node, 'SkipFileOpError', gSkipFileOpError); gShowDialogOnDragDrop := GetValue(Node, 'ShowDialogOnDragDrop', gShowDialogOnDragDrop); gOverwriteFolder := GetValue(Node, 'OverwriteFolder', gOverwriteFolder); gFileOperationsProgressKind := TFileOperationsProgressKind(GetValue(Node, 'ProgressKind', Integer(gFileOperationsProgressKind))); gFileOperationsConfirmations := TFileOperationsConfirmations(GetValue(Node, 'Confirmations', Integer(gFileOperationsConfirmations))); // Operations options SubNode := Node.FindNode('Options'); if Assigned(SubNode) then begin gOperationOptionSymLinks := TFileSourceOperationOptionSymLink(GetValue(SubNode, 'Symlink', Integer(gOperationOptionSymLinks))); gOperationOptionCorrectLinks := GetValue(SubNode, 'CorrectLinks', gOperationOptionCorrectLinks); gOperationOptionFileExists := TFileSourceOperationOptionFileExists(GetValue(SubNode, 'FileExists', Integer(gOperationOptionFileExists))); gOperationOptionDirectoryExists := TFileSourceOperationOptionDirectoryExists(GetValue(SubNode, 'DirectoryExists', Integer(gOperationOptionDirectoryExists))); gOperationOptionSetPropertyError := TFileSourceOperationOptionSetPropertyError(GetValue(SubNode, 'SetPropertyError', Integer(gOperationOptionSetPropertyError))); gOperationOptionReserveSpace := GetValue(SubNode, 'ReserveSpace', gOperationOptionReserveSpace); gOperationOptionCheckFreeSpace := GetValue(SubNode, 'CheckFreeSpace', gOperationOptionCheckFreeSpace); gOperationOptionCopyAttributes := GetValue(SubNode, 'CopyAttributes', gOperationOptionCopyAttributes); gOperationOptionCopyTime := GetValue(SubNode, 'CopyTime', gOperationOptionCopyTime); gOperationOptionCopyOwnership := GetValue(SubNode, 'CopyOwnership', gOperationOptionCopyOwnership); end; end; { Tabs page } Node := Root.FindNode('Tabs'); if Assigned(Node) then begin gDirTabOptions := TTabsOptions(GetValue(Node, 'Options', Integer(gDirTabOptions))); gDirTabLimit := GetValue(Node, 'CharacterLimit', gDirTabLimit); gDirTabPosition := TTabsPosition(GetValue(Node, 'Position', Integer(gDirTabPosition))); end; { Log page } Node := Root.FindNode('Log'); if Assigned(Node) then begin gLogFile := GetAttr(Node, 'Enabled', gLogFile); gLogFileName := GetValue(Node, 'FileName', gLogFileName); gLogOptions := TLogOptions(GetValue(Node, 'Options', Integer(gLogOptions))); end; { Configuration page } gSaveConfiguration := GetAttr(Root, 'Configuration/Save', gSaveConfiguration); gSaveSearchReplaceHistory:= GetAttr(Root, 'History/SearchReplaceHistory/Save', gSaveSearchReplaceHistory); gSaveDirHistory := GetAttr(Root, 'History/DirHistory/Save', gSaveDirHistory); gSaveCmdLineHistory := GetAttr(Root, 'History/CmdLineHistory/Save', gSaveCmdLineHistory); gSaveFileMaskHistory := GetAttr(Root, 'History/FileMaskHistory/Save', gSaveFileMaskHistory); { Quick Search/Filter page } Node := Root.FindNode('QuickSearch'); if Assigned(Node) then begin if LoadedConfigVersion < 4 then begin oldQuickSearch := GetAttr(Node, 'Enabled', oldQuickSearch); oldQuickSearchMode := TShiftState(GetValue(Node, 'Mode', Integer(oldQuickSearchMode))); OldKeysToNew(oldQuickSearch, oldQuickSearchMode, ktaQuickSearch); end; if GetValue(Node, 'MatchBeginning', qsmBeginning in gQuickSearchOptions.Match) then Include(gQuickSearchOptions.Match, qsmBeginning) else Exclude(gQuickSearchOptions.Match, qsmBeginning); if GetValue(Node, 'MatchEnding', qsmEnding in gQuickSearchOptions.Match) then Include(gQuickSearchOptions.Match, qsmEnding) else Exclude(gQuickSearchOptions.Match, qsmEnding); gQuickSearchOptions.SearchCase := TQuickSearchCase(GetValue(Node, 'Case', Integer(gQuickSearchOptions.SearchCase))); gQuickSearchOptions.Items := TQuickSearchItems(GetValue(Node, 'Items', Integer(gQuickSearchOptions.Items))); end; Node := Root.FindNode('QuickFilter'); if Assigned(Node) then begin if LoadedConfigVersion < 4 then begin oldQuickFilter := GetAttr(Node, 'Enabled', oldQuickFilter); oldQuickFilterMode := TShiftState(GetValue(Node, 'Mode', Integer(oldQuickFilterMode))); OldKeysToNew(oldQuickFilter, oldQuickFilterMode, ktaQuickFilter); end; gQuickFilterAutoHide := GetValue(Node, 'AutoHide', gQuickFilterAutoHide); end; { Miscellaneous page } Node := Root.FindNode('Miscellaneous'); if Assigned(Node) then begin gGridVertLine := GetValue(Node, 'GridVertLine', gGridVertLine); gGridHorzLine := GetValue(Node, 'GridHorzLine', gGridHorzLine); gShowWarningMessages := GetValue(Node, 'ShowWarningMessages', gShowWarningMessages); gSpaceMovesDown := GetValue(Node, 'SpaceMovesDown', gSpaceMovesDown); gDirBrackets := GetValue(Node, 'DirBrackets', gDirBrackets); end; { Thumbnails } Node := Root.FindNode('Thumbnails'); if Assigned(Node) then begin gThumbSave := GetAttr(Node, 'Save', gThumbSave); gThumbSize.cx := GetValue(Node, 'Width', gThumbSize.cx); gThumbSize.cy := GetValue(Node, 'Height', gThumbSize.cy); end; { Auto refresh page } Node := Root.FindNode('AutoRefresh'); if Assigned(Node) then begin gWatchDirs := TWatchOptions(GetValue(Node, 'Options', Integer(gWatchDirs))); gWatchDirsExclude := GetValue(Node, 'ExcludeDirs', gWatchDirsExclude); gWatcherMode := TWatcherMode(GetValue(Node, 'Mode', Integer(gWatcherMode))); end; { Icons page } Node := Root.FindNode('Icons'); if Assigned(Node) then begin gShowIcons := TShowIconsMode(GetValue(Node, 'ShowMode', Integer(gShowIcons))); gIconOverlays := GetValue(Node, 'ShowOverlays', gIconOverlays); gIconsSize := GetValue(Node, 'Size', gIconsSize); gIconsExclude := GetValue(Node, 'Exclude', gIconsExclude); gIconsExcludeDirs := GetValue(Node, 'ExcludeDirs', gIconsExcludeDirs); gCustomDriveIcons := GetValue(Node, 'CustomDriveIcons', gCustomDriveIcons); gIconsInMenus := GetAttr(Node, 'ShowInMenus/Enabled', gIconsInMenus); gIconsInMenusSize := GetValue(Node, 'ShowInMenus/Size', gIconsInMenusSize); end; { Ignore list page } Node := Root.FindNode('IgnoreList'); if Assigned(Node) then begin gIgnoreListFileEnabled:= GetAttr(Node, 'Enabled', gIgnoreListFileEnabled); gIgnoreListFile:= GetValue(Node, 'IgnoreListFile', gIgnoreListFile); end; { Directories HotList } LoadDirHotList(gConfig, Root); { Viewer } Node := Root.FindNode('Viewer'); if Assigned(Node) then begin gImageStretch := GetValue(Node, 'ImageStretch', gImageStretch); gPreviewVisible := GetValue(Node, 'PreviewVisible', gPreviewVisible); gCopyMovePath1 := GetValue(Node, 'CopyMovePath1', gCopyMovePath1); gCopyMovePath2 := GetValue(Node, 'CopyMovePath2', gCopyMovePath2); gCopyMovePath3 := GetValue(Node, 'CopyMovePath3', gCopyMovePath3); gCopyMovePath4 := GetValue(Node, 'CopyMovePath4', gCopyMovePath4); gCopyMovePath5 := GetValue(Node, 'CopyMovePath5', gCopyMovePath5); gImagePaintMode := GetValue(Node, 'PaintMode', gImagePaintMode); gImagePaintWidth := GetValue(Node, 'PaintWidth', gImagePaintWidth); gColCount := GetValue(Node, 'NumberOfColumns', gColCount); gViewerMode := GetValue(Node, 'ViewerMode', gViewerMode); gImagePaintColor := GetValue(Node, 'PaintColor', gImagePaintColor); gBookBackgroundColor := GetValue(Node, 'BackgroundColor', gBookBackgroundColor); gBookFontColor := GetValue(Node, 'FontColor', gBookFontColor); gTextPosition := GetValue(Node, 'TextPosition', gTextPosition); if LoadedConfigVersion < 7 then begin gThumbSave := GetValue(Node, 'SaveThumbnails', gThumbSave); end; end; { - Other - } gLuaLib := GetValue(Root, 'Lua/PathToLibrary', gLuaLib); gNameSCFile:= GetValue(Root, 'NameShortcutFile', gNameSCFile); gLastUsedPacker:= GetValue(Root, 'LastUsedPacker', gLastUsedPacker); gUseShellForFileOperations:= GetValue(Root, 'UseShellForFileOperations', gUseShellForFileOperations); end; { Search template list } gSearchTemplateList.LoadFromXml(gConfig, Root); { Columns sets } ColSet.Load(gConfig, Root); { Plugins } Node := gConfig.FindNode(Root, 'Plugins'); if Assigned(Node) then begin gDSXPlugins.Load(gConfig, Node); gWCXPlugins.Load(gConfig, Node); gWDXPlugins.Load(gConfig, Node); gWFXPlugins.Load(gConfig, Node); gWLXPlugins.Load(gConfig, Node); end; end; procedure SaveXmlConfig; procedure SetExtTool(Node: TXmlNode; const ExternalToolOptions: TExternalToolOptions); begin if Assigned(Node) then with ExternalToolOptions do begin gConfig.SetAttr(Node, 'Enabled', Enabled); gConfig.SetValue(Node, 'Path', Path); gConfig.SetValue(Node, 'Parameters', Parameters); gConfig.SetValue(Node, 'RunInTerminal', RunInTerminal); gConfig.SetValue(Node, 'KeepTerminalOpen', KeepTerminalOpen); end; end; procedure SetDCFont(Node: TXmlNode; const FontOptions: TDCFontOptions); begin if Assigned(Node) then gConfig.SetFont(Node, '', FontOptions.Name, FontOptions.Size, Integer(FontOptions.Style)); end; var I: Integer; Root, Node, SubNode: TXmlNode; KeyTypingModifier: TKeyTypingModifier; begin with gConfig do begin Root := gConfig.RootNode; SetAttr(Root, 'DCVersion', dcVersion); SetAttr(Root, 'ConfigVersion', ConfigVersion); SetValue(Root, 'Configuration/UseConfigInProgramDir', gUseConfigInProgramDirNew); { Language page } SetValue(Root, 'Language/POFileName', gPOFileName); { Behaviours page } Node := FindNode(Root, 'Behaviours', True); ClearNode(Node); SetValue(Node, 'GoToRoot', gGoToRoot); SetValue(Node, 'RunInTerminal', gRunInTerm); SetValue(Node, 'RunTerminal', gRunTerm); SetValue(Node, 'OnlyOneAppInstance', gOnlyOneAppInstance); SetValue(Node, 'LynxLike', gLynxLike); SetValue(Node, 'FileSizeFormat', Ord(gFileSizeFormat)); SetValue(Node, 'MinimizeToTray', gMinimizeToTray); SetValue(Node, 'AlwaysShowTrayIcon', gAlwaysShowTrayIcon); SubNode := FindNode(Node, 'Mouse', True); SetAttr(SubNode, 'Selection/Enabled', gMouseSelectionEnabled); SetValue(SubNode, 'Selection/Button', gMouseSelectionButton); SetValue(SubNode, 'ScrollMode', Integer(gScrollMode)); SetValue(SubNode, 'WheelScrollLines', gWheelScrollLines); SetValue(Node, 'AutoFillColumns', gAutoFillColumns); SetValue(Node, 'AutoSizeColumn', gAutoSizeColumn); SetValue(Node, 'DateTimeFormat', gDateTimeFormat); SetValue(Node, 'CutTextToColumnWidth', gCutTextToColWidth); SetValue(Node, 'ShowSystemFiles', gShowSystemFiles); {$IFNDEF LCLCARBON} // Under Mac OS X loading file list in separate thread are very very slow // so disable and hide this option under Mac OS X Carbon SetValue(Node, 'ListFilesInThread', gListFilesInThread); {$ENDIF} SetValue(Node, 'LoadIconsSeparately', gLoadIconsSeparately); SetValue(Node, 'DelayLoadingTabs', gDelayLoadingTabs); SetValue(Node, 'HighlightUpdatedFiles', gHighlightUpdatedFiles); SetValue(Node, 'DriveBlackList', gDriveBlackList); SetValue(Node, 'DriveBlackListUnmounted', gDriveBlackListUnmounted); { Tools page } SetExtTool(gConfig.FindNode(Root, 'Tools/Viewer', True), gExternalTools[etViewer]); SetExtTool(gConfig.FindNode(Root, 'Tools/Editor', True), gExternalTools[etEditor]); SetExtTool(gConfig.FindNode(Root, 'Tools/Differ', True), gExternalTools[etDiffer]); { Fonts page } SetDCFont(gConfig.FindNode(Root, 'Fonts/Main', True), gFonts[dcfMain]); SetDCFont(gConfig.FindNode(Root, 'Fonts/Editor', True), gFonts[dcfEditor]); SetDCFont(gConfig.FindNode(Root, 'Fonts/Viewer', True), gFonts[dcfViewer]); SetDCFont(gConfig.FindNode(Root, 'Fonts/Log', True), gFonts[dcfLog]); SetDCFont(gConfig.FindNode(Root, 'Fonts/ViewerBook', True), gFonts[dcfViewerBook]); { Colors page } Node := FindNode(Root, 'Colors', True); SetValue(Node, 'Foreground', gForeColor); SetValue(Node, 'Background', gBackColor); SetValue(Node, 'Background2', gBackColor2); SetValue(Node, 'Mark', gMarkColor); SetValue(Node, 'Cursor', gCursorColor); SetValue(Node, 'CursorText', gCursorText); SetValue(Node, 'UseInvertedSelection', gUseInvertedSelection); SetValue(Node, 'InactivePanelBrightness', gInactivePanelBrightness); SetValue(Node, 'UseFrameCursor', gUseFrameCursor); SetValue(Node, 'FreeSpaceIndicator/ForeColor', gIndForeColor); SetValue(Node, 'FreeSpaceIndicator/BackColor', gIndBackColor); SetValue(Node, 'FreeSpaceIndicator/UseGradient', gIndUseGradient); gColorExt.Save(gConfig, Node); { ToolTips page } Node := FindNode(Root, 'ToolTips', True); SetValue(Node, 'ShowToolTipMode', Integer(gShowToolTipMode)); gFileInfoToolTip.Save(gConfig, Node); { Layout page } Node := FindNode(Root, 'Layout', True); ClearNode(Node); SetValue(Node, 'MainMenu', gMainMenu); SubNode := FindNode(Node, 'ButtonBar', True); SetAttr(SubNode, 'Enabled', gButtonBar); SetValue(SubNode, 'FlatIcons', gToolBarFlat); SetValue(SubNode, 'ButtonHeight', gToolBarButtonSize); SetValue(SubNode, 'IconSize', gToolBarIconSize); SetValue(Node, 'DriveBar1', gDriveBar1); SetValue(Node, 'DriveBar2', gDriveBar2); SetValue(Node, 'DriveBarFlat', gDriveBarFlat); SubNode := FindNode(Node, 'DrivesListButton', True); SetAttr(SubNode, 'Enabled', gDrivesListButton); SetValue(SubNode, 'ShowLabel', dlbShowLabel in gDrivesListButtonOptions); SetValue(SubNode, 'ShowFileSystem', dlbShowFileSystem in gDrivesListButtonOptions); SetValue(SubNode, 'ShowFreeSpace', dlbShowFreeSpace in gDrivesListButtonOptions); SetValue(Node, 'DirectoryTabs', gDirectoryTabs); SetValue(Node, 'CurrentDirectory', gCurDir); SetValue(Node, 'TabHeader', gTabHeader); SetValue(Node, 'StatusBar', gStatusBar); SetValue(Node, 'CmdLine', gCmdLine); SetValue(Node, 'LogWindow', gLogWindow); SetValue(Node, 'TermWindow', gTermWindow); SetValue(Node, 'KeyButtons', gKeyButtons); SetValue(Node, 'InterfaceFlat', gInterfaceFlat); SetValue(Node, 'DriveFreeSpace', gDriveFreeSpace); SetValue(Node, 'DriveIndicator', gDriveInd); SetValue(Node, 'ProgressInMenuBar', gProgInMenuBar); SetValue(Node, 'PanelOfOperationsInBackground', gPanelOfOp); SetValue(Node, 'HorizontalFilePanels', gHorizontalFilePanels); SetValue(Node, 'ShortFormatDriveInfo', gShortFormatDriveInfo); { Files views } Node := FindNode(Root, 'FilesViews', True); SubNode := FindNode(Node, 'Sorting', True); SetValue(SubNode, 'CaseSensitivity', Integer(gSortCaseSensitivity)); SetValue(SubNode, 'NaturalSorting', gSortNatural); SetValue(SubNode, 'SortFolderMode', Integer(gSortFolderMode)); SetValue(SubNode, 'NewFilesPosition', Integer(gNewFilesPosition)); SetValue(SubNode, 'UpdatedFilesPosition', Integer(gUpdatedFilesPosition)); { Keys page } Node := FindNode(Root, 'Keyboard', True); SubNode := FindNode(Node, 'Typing/Actions', True); for KeyTypingModifier in TKeyTypingModifier do SetValue(SubNode, TKeyTypingModifierToNodeName[KeyTypingModifier], Integer(gKeyTyping[KeyTypingModifier])); { File operations page } Node := FindNode(Root, 'FileOperations', True); SetValue(Node, 'BufferSize', gCopyBlockSize); SetValue(Node, 'UseMmapInSearch', gUseMmapInSearch); SetValue(Node, 'PartialNameSearch', gPartialNameSearch); SetValue(Node, 'WipePassNumber', gWipePassNumber); SetValue(Node, 'DropReadOnlyFlag', gDropReadOnlyFlag); SetValue(Node, 'ProcessComments', gProcessComments); SetValue(Node, 'RenameSelOnlyName', gRenameSelOnlyName); SetValue(Node, 'ShowCopyTabSelectPanel', gShowCopyTabSelectPanel); SetValue(Node, 'UseTrash', gUseTrash); SetValue(Node, 'SkipFileOpError', gSkipFileOpError); SetValue(Node, 'ShowDialogOnDragDrop', gShowDialogOnDragDrop); SetValue(Node, 'OverwriteFolder', gOverwriteFolder); SetValue(Node, 'ProgressKind', Integer(gFileOperationsProgressKind)); SetValue(Node, 'Confirmations', Integer(gFileOperationsConfirmations)); // Operations options SubNode := FindNode(Node, 'Options', True); SetValue(SubNode, 'Symlink', Integer(gOperationOptionSymLinks)); SetValue(SubNode, 'CorrectLinks', gOperationOptionCorrectLinks); SetValue(SubNode, 'FileExists', Integer(gOperationOptionFileExists)); SetValue(SubNode, 'DirectoryExists', Integer(gOperationOptionDirectoryExists)); SetValue(SubNode, 'SetPropertyError', Integer(gOperationOptionSetPropertyError)); SetValue(SubNode, 'ReserveSpace', gOperationOptionReserveSpace); SetValue(SubNode, 'CheckFreeSpace', gOperationOptionCheckFreeSpace); SetValue(SubNode, 'CopyAttributes', gOperationOptionCopyAttributes); SetValue(SubNode, 'CopyTime', gOperationOptionCopyTime); SetValue(SubNode, 'CopyOwnership', gOperationOptionCopyOwnership); { Tabs page } Node := FindNode(Root, 'Tabs', True); SetValue(Node, 'Options', Integer(gDirTabOptions)); SetValue(Node, 'CharacterLimit', gDirTabLimit); SetValue(Node, 'Position', Integer(gDirTabPosition)); { Log page } Node := FindNode(Root, 'Log', True); SetAttr(Node, 'Enabled', gLogFile); SetValue(Node, 'FileName', gLogFileName); SetValue(Node, 'Options', Integer(gLogOptions)); { Configuration page } SetAttr(Root, 'Configuration/Save', gSaveConfiguration); SetAttr(Root, 'History/SearchReplaceHistory/Save', gSaveSearchReplaceHistory); SetAttr(Root, 'History/DirHistory/Save', gSaveDirHistory); SetAttr(Root, 'History/CmdLineHistory/Save', gSaveCmdLineHistory); SetAttr(Root, 'History/FileMaskHistory/Save', gSaveFileMaskHistory); { Quick Search/Filter page } Node := FindNode(Root, 'QuickSearch', True); SetValue(Node, 'MatchBeginning', qsmBeginning in gQuickSearchOptions.Match); SetValue(Node, 'MatchEnding', qsmEnding in gQuickSearchOptions.Match); SetValue(Node, 'Case', Integer(gQuickSearchOptions.SearchCase)); SetValue(Node, 'Items', Integer(gQuickSearchOptions.Items)); Node := FindNode(Root, 'QuickFilter', True); SetValue(Node, 'AutoHide', gQuickFilterAutoHide); { Misc page } Node := FindNode(Root, 'Miscellaneous', True); SetValue(Node, 'GridVertLine', gGridVertLine); SetValue(Node, 'GridHorzLine', gGridHorzLine); SetValue(Node, 'ShowWarningMessages', gShowWarningMessages); SetValue(Node, 'SpaceMovesDown', gSpaceMovesDown); SetValue(Node, 'DirBrackets', gDirBrackets); { Thumbnails } Node := FindNode(Root, 'Thumbnails', True); SetAttr(Node, 'Save', gThumbSave); SetValue(Node, 'Width', gThumbSize.cx); SetValue(Node, 'Height', gThumbSize.cy); { Auto refresh page } Node := FindNode(Root, 'AutoRefresh', True); SetValue(Node, 'Options', Integer(gWatchDirs)); SetValue(Node, 'ExcludeDirs', gWatchDirsExclude); SetValue(Node, 'Mode', Integer(gWatcherMode)); { Icons page } Node := FindNode(Root, 'Icons', True); SetValue(Node, 'ShowMode', Integer(gShowIconsNew)); SetValue(Node, 'ShowOverlays', gIconOverlays); SetValue(Node, 'Size', gIconsSizeNew); SetValue(Node, 'Exclude', gIconsExclude); SetValue(Node, 'ExcludeDirs', gIconsExcludeDirs); SetValue(Node, 'CustomDriveIcons', gCustomDriveIcons); SetAttr(Node, 'ShowInMenus/Enabled', gIconsInMenus); SetValue(Node, 'ShowInMenus/Size', gIconsInMenusSizeNew); { Ignore list page } Node := FindNode(Root, 'IgnoreList', True); SetAttr(Node, 'Enabled', gIgnoreListFileEnabled); SetValue(Node, 'IgnoreListFile', gIgnoreListFile); { Directories HotList } Node := FindNode(Root, 'DirectoryHotList', True); gConfig.ClearNode(Node); for I:= 0 to glsHotDir.Count - 1 do begin SubNode := AddNode(Node, 'HotDir'); SetAttr(SubNode, 'Name', glsHotDir.Names[I]); SetAttr(SubNode, 'Path', glsHotDir.ValueFromIndex[I]); end; { Viewer } Node := FindNode(Root, 'Viewer',True); SetValue(Node, 'PreviewVisible',gPreviewVisible); SetValue(Node, 'ImageStretch',gImageStretch); SetValue(Node, 'CopyMovePath1', gCopyMovePath1); SetValue(Node, 'CopyMovePath2', gCopyMovePath2); SetValue(Node, 'CopyMovePath3', gCopyMovePath3); SetValue(Node, 'CopyMovePath4', gCopyMovePath4); SetValue(Node, 'CopyMovePath5', gCopyMovePath5); SetValue(Node, 'PaintMode', gImagePaintMode); SetValue(Node, 'PaintWidth', gImagePaintWidth); SetValue(Node, 'NumberOfColumns', gColCount); SetValue(Node, 'ViewerMode', gViewerMode); SetValue(Node, 'PaintColor', gImagePaintColor); SetValue(Node, 'BackgroundColor', gBookBackgroundColor); SetValue(Node, 'FontColor', gBookFontColor); SetValue(Node, 'TextPosition', gTextPosition); { - Other - } SetValue(Root, 'Lua/PathToLibrary', gLuaLib); SetValue(Root, 'NameShortcutFile', gNameSCFile); SetValue(Root, 'LastUsedPacker', gLastUsedPacker); SetValue(Root, 'UseShellForFileOperations', gUseShellForFileOperations); end; { Search template list } gSearchTemplateList.SaveToXml(gConfig, Root); { Columns sets } ColSet.Save(gConfig, Root); { Plugins } Node := gConfig.FindNode(Root, 'Plugins', True); gDSXPlugins.Save(gConfig, Node); gWCXPlugins.Save(gConfig, Node); gWDXPlugins.Save(gConfig, Node); gWFXPlugins.Save(gConfig, Node); gWLXPlugins.Save(gConfig, Node); end; function LoadConfig: Boolean; var ErrorMessage: String = ''; begin Result := LoadConfigCheckErrors(@LoadGlobalConfig, gConfig.FileName, ErrorMessage); if not Result then Result := AskUserOnError(ErrorMessage); end; function InitGlobs: Boolean; var ErrorMessage: String = ''; begin CreateGlobs; if not OpenConfig(ErrorMessage) then begin if not AskUserOnError(ErrorMessage) then Exit(False); end; SetDefaultNonConfigGlobs; if not LoadGlobs then begin if not AskUserOnError(ErrorMessage) then Exit(False); end; Result := AskUserOnError(ErrorMessage); end; function GetKeyTypingAction(ShiftStateEx: TShiftState): TKeyTypingAction; var Modifier: TKeyTypingModifier; begin for Modifier in TKeyTypingModifier do if ShiftStateEx * KeyModifiersShortcutNoText = TKeyTypingModifierToShift[Modifier] then Exit(gKeyTyping[Modifier]); Result := ktaNone; end; function IsFileSystemWatcher: Boolean; begin Result := ([watch_file_name_change, watch_attributes_change] * gWatchDirs <> []); end; initialization finalization DestroyGlobs; end. doublecmd-0.5.8/src/fmaskinputdlg.lfm0000644000175000017500000000671512023046500016646 0ustar alexxalexxobject frmMaskInputDlg: TfrmMaskInputDlg Left = 404 Height = 231 Top = 176 Width = 339 AutoSize = True BorderIcons = [biSystemMenu] BorderStyle = bsDialog ChildSizing.LeftRightSpacing = 10 ChildSizing.TopBottomSpacing = 10 ClientHeight = 231 ClientWidth = 339 OnCreate = FormCreate Position = poScreenCenter LCLVersion = '1.1' object lblPrompt: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 10 Height = 1 Top = 10 Width = 319 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Right = 10 ParentColor = False WordWrap = True end object lblSearchTemplate: TLabel AnchorSideLeft.Control = cmbMask AnchorSideTop.Control = cmbMask AnchorSideTop.Side = asrBottom Left = 10 Height = 18 Top = 51 Width = 238 BorderSpacing.Top = 6 Caption = 'O&r select predefined selection type:' FocusControl = lbxSearchTemplate ParentColor = False WordWrap = True end object cmbMask: TComboBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = lblPrompt AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 10 Height = 28 Top = 17 Width = 319 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Top = 6 BorderSpacing.Right = 10 DropDownCount = 10 ItemHeight = 0 TabOrder = 0 end object btnOK: TBitBtn AnchorSideTop.Control = lbxSearchTemplate AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnCancel Left = 123 Height = 35 Top = 174 Width = 100 Anchors = [akTop, akRight] AutoSize = True BorderSpacing.Top = 6 BorderSpacing.Right = 6 BorderSpacing.InnerBorder = 2 Caption = '&OK' Constraints.MinWidth = 100 Default = True Kind = bkOK ModalResult = 1 TabOrder = 3 end object btnCancel: TBitBtn AnchorSideTop.Control = lbxSearchTemplate AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 229 Height = 36 Top = 174 Width = 100 Anchors = [akTop, akRight] AutoSize = True BorderSpacing.Top = 6 BorderSpacing.Right = 10 BorderSpacing.InnerBorder = 2 Cancel = True Caption = '&Cancel' Constraints.MinWidth = 100 Kind = bkCancel ModalResult = 2 TabOrder = 4 end object lbxSearchTemplate: TListBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = lblSearchTemplate AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 10 Height = 93 Top = 75 Width = 319 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Top = 6 BorderSpacing.Right = 10 ItemHeight = 0 OnClick = lbxSearchTemplateClick OnDblClick = lbxSearchTemplateDblClick ScrollWidth = 317 Sorted = True TabOrder = 1 TopIndex = -1 end object btnDefineTemplate: TBitBtn AnchorSideTop.Control = btnOK AnchorSideRight.Control = btnOK Left = 17 Height = 35 Top = 174 Width = 100 Anchors = [akTop, akRight] AutoSize = True BorderSpacing.Right = 6 BorderSpacing.InnerBorder = 2 Caption = '&Define...' Constraints.MinWidth = 100 OnClick = btnDefineTemplateClick TabOrder = 2 end end doublecmd-0.5.8/src/ffileexecuteyourself.pas0000644000175000017500000001022212217255050020237 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Copy out, execute and delete files from non FileSystemFileSource Copyright (C) 2010 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fFileExecuteYourSelf; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, StdCtrls, Buttons, uFile, uFileSource, uFileView, uOSForms; type { TfrmFileExecuteYourSelf } TfrmFileExecuteYourSelf = class(TAloneForm) btnClose: TBitBtn; lblFromPath: TLabel; lblFileName: TLabel; lblFromPathValue: TLabel; lblFileNameValue: TLabel; lblPrompt: TLabel; procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); private FFileSource: IFileSource; public constructor Create(TheOwner: TComponent; aFileSource: IFileSource; const FileName, FromPath: UTF8String); reintroduce; destructor Destroy; override; end; function ShowFileExecuteYourSelf(aFileView: TFileView; aFile: TFile; bWithAll: Boolean): Boolean; implementation {$R *.lfm} uses LCLProc, uTempFileSystemFileSource, uFileSourceOperation, uShellExecute, DCOSUtils; function ShowFileExecuteYourSelf(aFileView: TFileView; aFile: TFile; bWithAll: Boolean): Boolean; var TempFiles: TFiles = nil; TempFileSource: ITempFileSystemFileSource = nil; Operation: TFileSourceOperation = nil; CurrentDir, FileName: UTF8String; begin Result:= False; try TempFileSource:= TTempFileSystemFileSource.GetFileSource; if bWithAll then begin FileName:= TempFileSource.FileSystemRoot + aFile.FullPath; TempFiles:= aFileView.FileSource.GetFiles(aFileView.FileSource.GetRootDir); end else begin FileName:= TempFileSource.FileSystemRoot + aFile.Name; TempFiles:= TFiles.Create(aFileView.CurrentPath); TempFiles.Add(aFile.Clone); end; Operation := aFileView.FileSource.CreateCopyOutOperation( TempFileSource, TempFiles, TempFileSource.FileSystemRoot); if not Assigned(Operation) then Exit; // Execute operation Operation.Execute; // Create wait window with TfrmFileExecuteYourSelf.Create(Application, TempFileSource, aFile.Name, aFileView.CurrentAddress + aFileView.CurrentPath) do begin // Show wait window Show; // Save current directory CurrentDir:= mbGetCurrentDir; Result:= ShellExecuteEx('open', FileName, TempFileSource.FileSystemRoot + aFile.Path); // Restore current directory mbSetCurrentDir(CurrentDir); // If file can not be opened then close wait window if not Result then Close; end; finally FreeThenNil(Operation); FreeThenNil(TempFiles); end; end; { TfrmFileExecuteYourSelf } procedure TfrmFileExecuteYourSelf.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin CloseAction:= caFree; end; constructor TfrmFileExecuteYourSelf.Create(TheOwner: TComponent; aFileSource: IFileSource; const FileName, FromPath: UTF8String); begin inherited Create(TheOwner); FFileSource:= aFileSource; lblFileNameValue.Caption:= FileName; lblFromPathValue.Caption:= FromPath; end; destructor TfrmFileExecuteYourSelf.Destroy; begin // Delete the temporary file source and all files inside. FFileSource:= nil; inherited Destroy; end; end. doublecmd-0.5.8/src/fviewer.lfm0000644000175000017500000041571312117061137015456 0ustar alexxalexxinherited frmViewer: TfrmViewer Left = 292 Height = 480 Top = 46 Width = 640 HorzScrollBar.Page = 951 VertScrollBar.Page = 491 Caption = 'Viewer' ClientHeight = 460 ClientWidth = 640 Constraints.MinHeight = 100 Constraints.MinWidth = 200 Icon.Data = { 7E04000000000100010010100000010020006804000016000000280000001000 0000200000000100200000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000959595B4818181FF818181FF818181FF818181FF818181FF818181FF8181 81FF818181FF818181FF818181FF818181FF818181FF959595A8000000000000 0000818181FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF818181FF000000000000 0000818181FFFFFFFFFFEDEDEDFFEDEDEDFFEEEEEEFFEFEFEFFFEFEFEFFFF0F0 F0FFF0F0F0FFF1F1F1FFF2F2F2FFF2F2F2FFFFFFFFFF818181FF000000000000 0000818181FFFFFFFFFFEDEDEDFFCF9F72FFCF9F72FFCF9F72FFCF9F72FFCF9F 72FFCF9F72FFCF9F72FFCF9F72FFF2F2F2FFFFFFFFFF818181FF000000000000 0000818181FFFFFFFFFFECECECFFCF9F72FF927A6DFF927B6EFF937B6EFF8F79 6DFF867469FF847368FFCF9F72FFF1F1F1FFFFFFFFFF818181FF000000000000 0000818181FFFFFFFFFFECECECFFCF9F72FFAD9889FFAE9989FFAF9A8AFF948C 86FF948C86FFA29489FFCF9F72FFF0F0F0FFFFFFFFFF818181FF000000000000 0000818181FFFFFFFFFFECECECFFCF9F72FFCCC2A8FFD6F1EDFFC4D4C0FFD8B8 9AFFD8B89AFFD8B89AFFCF9F72FFF0F0F0FFFFFFFFFF818181FF000000000000 0000818181FFFFFFFFFFEBEBEBFFCF9F72FFCF9F72FFCF9F72FFCF9F72FFCF9F 72FFCF9F72FFCF9F72FFCF9F72FFF0F0F0FFFFFFFFFF818181FF000000000000 0000818181FFFFFFFFFFEBEBEBFFEBEBEBFFECECECFFECECECFFEDEDEDFFEDED EDFFE5EDEDFFECECECFFEEEEEEFFF0F0F0FFFFFFFFFF818181FF000000000000 0000818181FFFFFFFFFFEBEBEBFFC5C5C5FFC6C6C6FFC6C6C6FFC6C6C6FFC6C6 C6FFC6C6C6FFC6C6C6FFC7C7C7FFF0F0F0FFFFFFFFFF818181FF000000000000 0000818181FFFFFFFFFFEAEAEAFFEBEBEBFFEBEBEBFFECECECFFECECECFFECEC ECFFEDEDEDFFEDEDEDFFEEEEEEFFF0F0F0FFFFFFFFFF818181FF000000000000 0000818181FFFFFFFFFFEAEAEAFFC4C4C4FFC5C5C5FFC5C5C5FFC6C6C6FFC6C6 C6FFC6C6C6FFC6C6C6FFC7C7C7FFF0F0F0FFFFFFFFFF818181FF000000000000 0000818181FFFFFFFFFFECECECFFEAEAEAFFEAEAEAFFEBEBEBFFEBEBEBFFEBEB EBFFECECECFFECECECFFEDEDEDFFF0F0F0FFFFFFFFFF818181FF000000000000 0000818181FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF818181FF000000000000 0000999999AC818181FF818181FF818181FF818181FF818181FF818181FF8181 81FF818181FF818181FF818181FF818181FF818181FF81818156000000000000 0000FFFF00000003000000030000000300000003000000030000000300000003 0000000300000003000000030000000300000003000000030000000300000007 0000 } KeyPreview = True Menu = MainMenu OnClose = frmViewerClose OnCreate = FormCreate OnDestroy = FormDestroy OnKeyDown = frmViewerKeyDown OnKeyPress = FormKeyPress OnResize = FormResize OnShow = FormShow Position = poDefault SessionProperties = 'Height;Width;Left;Top;WindowState' ShowInTaskBar = stAlways object pnlFolder: TPanel[0] Left = 179 Height = 441 Top = 0 Width = 461 Align = alClient BevelOuter = bvNone TabOrder = 6 Visible = False end object Status: TStatusBar[1] Left = 0 Height = 23 Top = 437 Width = 640 Panels = < item Width = 200 end item Width = 50 end item Width = 100 end item Width = 100 end item Width = 100 end> SimplePanel = False end object pnlText: TPanel[2] Left = 179 Height = 437 Top = 0 Width = 461 Align = alClient BevelOuter = bvNone ClientHeight = 437 ClientWidth = 461 TabOrder = 2 Visible = False object ViewerControl: TViewerControl Left = 0 Height = 437 Top = 0 Width = 461 ViewerMode = vmText OnPositionChanged = ViewerPositionChanged OnMouseUp = ViewerControlMouseUp Align = alClient Color = clWindow Font.Color = clWindowText end end object pnlImage: TPanel[3] Left = 179 Height = 437 Top = 0 Width = 461 Align = alClient BevelOuter = bvNone ClientHeight = 437 ClientWidth = 461 TabOrder = 3 Visible = False OnResize = pnlImageResize object sboxImage: TScrollBox Left = 0 Height = 387 Top = 50 Width = 461 Align = alClient ClientHeight = 366 ClientWidth = 440 Color = clWhite ParentColor = False TabOrder = 0 OnMouseEnter = sboxImageMouseEnter OnMouseLeave = sboxImageMouseLeave object Image: TImage Left = 85 Height = 434 Top = 76 Width = 1037 Align = alCustom BorderSpacing.CellAlignHorizontal = ccaCenter BorderSpacing.CellAlignVertical = ccaCenter OnMouseDown = ImageMouseDown OnMouseEnter = ImageMouseEnter OnMouseLeave = ImageMouseLeave OnMouseMove = ImageMouseMove OnMouseUp = ImageMouseUp Proportional = True end object GifAnim: TGifAnim Left = 0 Height = 90 Top = 0 Width = 90 OnMouseEnter = GifAnimMouseEnter end end object PanelEditImage: TPanel AnchorSideLeft.Control = pnlImage AnchorSideTop.Control = pnlImage AnchorSideRight.Control = pnlImage AnchorSideBottom.Control = sboxImage Left = 0 Height = 50 Top = 0 Width = 461 Align = alTop Alignment = taLeftJustify ClientHeight = 50 ClientWidth = 461 ParentShowHint = False ShowHint = True TabOrder = 1 OnMouseEnter = PanelEditImageMouseEnter object gboxHightlight: TGroupBox Left = 435 Height = 47 Top = 1 Width = 91 Align = alLeft AutoSize = True BorderSpacing.Left = 5 BorderSpacing.Bottom = 1 Caption = 'Highlight' ChildSizing.LeftRightSpacing = 4 ClientHeight = 29 ClientWidth = 87 TabOrder = 0 Visible = False object lblHightlight: TLabel AnchorSideLeft.Control = gboxHightlight AnchorSideTop.Control = btnCutTuImage AnchorSideTop.Side = asrCenter Left = 6 Height = 14 Top = 5 Width = 19 BorderSpacing.Left = 6 Caption = '0x0' ParentColor = False end object btnCutTuImage: TSpeedButton AnchorSideLeft.Control = lblHightlight AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = gboxHightlight Left = 30 Height = 24 Hint = 'Crop' Top = 0 Width = 24 AutoSize = True BorderSpacing.Left = 5 Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FF7315FFFF73 15FF000000000000000000000000000000000000000000000000000000000000 000000000000FF7315FFFF7315FF000000000000000000000000FFA263FFFFB8 73FFE39D6C17DFA884FCF0A36D17DEA884FCF0A36D17DEA884FCF0A36D17DEA8 84FCE29C6D17FFB873FFFFC57CFF00000000000000000000000000000000E69B 6717BC8A681EDC8F5B17D98F5C17D48F5F17D38F5F17D28F6017D38F5F17D28F 6017D18E5F17D99464170000000000000000000000000000000000000000E3A8 81FC818A8E7D757F82A4A08F833BDB8D5717D88D5817D78C5817D88C5817D88C 5817D78B5617D89F78F7F4B48C0500000000000000000000000000000000F3A2 6A17D4A07F20BCC3CAF38E9499FF858D91EDA8ACB1D1A5A5AAC597989CC59899 9FC5A1A6ACC5BEC1C5BB0000000000000000000000000000000000000000DFA7 83FCD4865117D4D5D9CBDDDEE0FFC9CBCCFF929494FF939695FFE9E9E9FFFFFF FFFFFFFFFFFFE29C6FFE0000000000000000000000000000000000000000F0A3 6D17D3865117CCCED3C5FFFFFFFFE4E4E4FFDEDEDDFFCBCBCCFF848788FF7477 75FFD3D9D9FFCBC7C8C60000000000000000000000000000000000000000DEA8 84FCD3875217CBCCD1C5FFFFFFFFFDFDFDFFD6D6D7FFCDCDD0FFC6C6C9FFB3B3 BAFF666869FF5B4B3CFF302F270D00000000000000000000000000000000F0A3 6D17D3865117CBCCD1C5FFFFFFFFFFFFFFFFF0F0F1FFB8B8BDFFB2B3B7FF8989 8CFF35332CFF3D3D36FF8F908FDA50505114000000000000000000000000DEA8 84FCD3875217CBCCD1C5FFFFFFFFFFFFFFFFFFFFFFFFD9DADDFF7F7E81FF2522 1BFF3E3C3AFF84848CFFA7A7AAFF90908FC2939393070000000000000000F0A3 6D17D3865117CBCDD2C5FFFFFFFFF7F7F7FFF4F4F4FFFBFBFBFF9E9E9BFF7875 72FFAFAFB5FF72737CFF8B8B90FFC7C7C7FFBFBFBE9D5858580000000000D1A4 87FCD18A5917CED2D8C5FDFFFFFFF6F9FBFFF5FAFDFFF8FBFCFFF7FCFFFFD7D6 DBFFECEDF0FFA2A2A9FFAAAAB0FFC0C0C2FFD0D0D1F0B1B1B13CFF7315FFFF75 04FFE3996717DDA075FEE9E6E8C5DC9869FEC9C4C5C5DE996CFEAFACACC5CF92 69FEE2E0E3F9E6E6E7FFBFBFC3FFB2B2B7FFC2C2C4F0CBCBCB57FFA263FFFFC5 7CFF000000000000000000000000000000000000000000000000000000000000 0000DEDFE239F0EDF0F7E2E2E3FFBABAC0FFB6B6BAF0C3C3C657000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000E4E2E459F3F2F3F2DDDDDEF2B9B9BDE4BBBBBF52000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000D2D0D23EE7E7E85ED0D0D358BABABF1E } NumGlyphs = 0 OnClick = btnCutTuImageClick end object btnRedEye: TSpeedButton AnchorSideLeft.Control = btnCutTuImage AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = gboxHightlight Left = 59 Height = 24 Hint = 'Red Eyes' Top = 0 Width = 24 BorderSpacing.Left = 5 Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000484D503ACED2D67CC5C7C7A3AAAA AAB28C8C8CAF6D6D6D995C5C5C5B000000048D8D8D0000000000000000000000 000000000000000000064D4E4E7E817C8DED493D98FF3F3279FFA29189FEF1F3 F4FFECECECFFD8D8D8FFA7A7A7FF8D8D8DEF4E4E4E3B1A1A1A00000000004A4A 4A00343434316C6D6DEDC5C6C9FF5143A6FE4E43C0FF3F36A1FF5343A2FFA194 8FFFECEEEEFFE6E6E6FFD2D2D2FF9B9B9BFE999999FF00000002666666003232 3227727272FFD1D2D2FE968ED4FF7D74D0FF241E5BFF292369FF736ACDFF4D40 A1FFF0F2F4FFEAEAEAFFC0C0C0FF8C8C8CFF8B8B8B7000000000000000007878 78D5959595FEEEEEF0FF928BD8FF4137A6FF3C3299FF221D58FF5F55C6FF6459 C1FFE0E0E2FFD0D0D0FF7E7E7EFF969696BA0000000000000000000000008A8A 8ABF6E6E6EFFDEDFDFFF9D97DCFF8C85D6FF958ED9FF4E43C0FF7E76D1FF564A C1FFCDCED0FF727272FE929292E0000000084444440500000000000000000000 0009848484DE646464FFC8C4C5FFB6B1E3FFB0ABE2FF9F98DDFFAFAAE1FF6E60 66FF6A6A6AFE8B8B8BE82929291300000002464646330000000000000000FFFF FF000000000C808080CD575757FF6A6465FE5A50C1FF4A3FBAFF585656FE6C6C 6CFF858586D11212121000000000484848740000000000000000131313014141 410B000000000000000077777774727273F06A6A6AFF6C6C6EFF777777F37E7E 7E7700000000000000004F4F4F7A686868380000000000000000000000004242 42500000000A000000000000000000000000313131203C3C3C23000000000000 0000000000003D3D3D7888888891000000000202020000000000000000000000 0000656565AF0000001F00000000000000000000000000000000000000000000 000C444444AC8F8F8FCC000000007E7E7E000000000000000000000000000000 00006565650A767676E9393939990D0D0D43010101250D0D0D413434348F5B5B 5BFB919191CD0000000100000000000000000000000000000000000000000000 0000000000003D3D3D08878787B86F6F6FFF575757FF616161FF7D7D7DFF8E8E 8E8D00000000FFFFFF0000000000000000000000000000000000000000000000 000000000000FFFFFF00000000009595952399999964A0A0A0587272720C0000 0000E2E2E2000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 OnClick = btnRedEyeClick end end object gboxPaint: TGroupBox Left = 462 Height = 47 Top = 1 Width = 203 Align = alLeft BorderSpacing.Left = 5 BorderSpacing.Bottom = 1 Caption = 'Paint' ChildSizing.LeftRightSpacing = 2 ChildSizing.TopBottomSpacing = 2 ClientHeight = 29 ClientWidth = 199 TabOrder = 1 Visible = False object ColorBoxPaint: TColorBox AnchorSideLeft.Control = ComboBoxWidth AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = gboxPaint Left = 158 Height = 22 Top = 2 Width = 39 DefaultColorColor = clRed NoneColorColor = clRed BorderSpacing.Left = 6 ItemHeight = 16 TabOrder = 0 end object btnUndo: TSpeedButton AnchorSideTop.Control = ComboBoxPaint AnchorSideTop.Side = asrCenter Left = 2 Height = 22 Hint = 'Undo' Top = 1 Width = 24 AutoSize = True Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002EBC D70119A7D50217A2DC010080D500FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002EC0D1012ABB D20424B3D30C20ABD70B1895C90C056DA302FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0016A2D601FFFFFF00FFFFFF0025B5D30126B5D30423B2 D40A1EACD51A17A5D620119BD71D057CA573007FA66AFFFFFF00FFFFFF00FFFF FF00FFFFFF000994D901109CD701FFFFFF001DA5CE011C98B8040F8FB1131DA3 CA1617A4D62A119ED7340B96D83C0787C44902779EEB007FA633FFFFFF00FFFF FF00FFFFFF00048DDA010994D9061484AE051A7E9101007FA611007FA6980180 A7EB088FB9920B96D849058FD9540089DA5F046B97A8007FA692FFFFFF00FFFF FF00FFFFFF000381C7010484C90516758D03FFFFFF00FFFFFF00FFFFFF00007F A61B0485ADEF088ED06C0089DA6F0089DA7B036BA2AB01789FCC007FA63C007F A6B4007FA6FC007FA6FF017FA6FF007FA6FF007FA6FF007FA6E9007FA62AFFFF FF000180A89F0688C1B8048BDB890B8FDC9F0882C7B802698EF90585A9EF169C C2F8179FC4FD26AACAFD28B2D0FE20B9D5FE18B2D1FC0382A9E8007FA62AFFFF FF000181A89C078BC5CA1A96DEAE39A8E4C5349DD6DF03688CFA0D90B0F440BB E3FF50C8E6FF4ECFE7FF2EC9E1FF11BAD7FF0E89ABF4007FA651FFFFFF00007F A615067EA5F30384CAD633A7E3E348B4E8F33693C3FE03769CD40D91B1F45DCB EBFF5CCFEBFF56CEE9FF16B3DAFF119DC3FE0D7895F6027DA3B1037BA0A60867 85F7056599F91F9CE0FA56C1ECFD55C1ECFF3388AEFE007EA5950D91B0F464D1 EEFF63D3EFFF63D4EFFF55CDEBFF21AADEFF0E9CD5FF1496C8FE1990C5FE0688 CDFF27A2E2FF5CCAEEFF5FCCEFFF5BC6EAFF12789EF6007FA6370D91B0F369D9 F3FF69D9F3FF68DCF3FF66DBF3FF65DAF3FF5FCCEFFF3EB7E8FF3AB7E8FF54C8 EEFF66D9F3FF65D9F3FF68DAF3FF35A2C9F9017FA689FFFFFF000D91B0F367D9 F1FF27ACC5F948C5DDFA67DFF5FF67E5F7FF67E5F7FF67E5F7FF67E5F7FF67E5 F7FF67E5F7FF69E0F5FF3FB9E0F90383AACD007FA606FFFFFF000C8AADDC1D9C B9F5007FA6550283A86C24A9C4F754D3EBFF64DEF3FF71ECF9FF72ECF9FF69DF F4FF59D1EEFF21A3C8F50180A87E007FA604FFFFFF00FFFFFF00007FA61B007F A621FFFFFF00FFFFFF00007FA6220283A9811092B4C035A9C3EF44ADC8F31993 B7C60181A788007FA62BFFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = btnUndoClick end object ComboBoxPaint: TComboBox AnchorSideLeft.Control = btnUndo AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = gboxPaint Left = 36 Height = 21 Top = 2 Width = 63 BorderSpacing.Left = 10 ItemHeight = 13 ItemIndex = 0 Items.Strings = ( 'Pen' 'Rect' 'Ellipse' ) Style = csDropDownList TabOrder = 1 Text = 'Pen' end object ComboBoxWidth: TComboBox AnchorSideLeft.Control = ComboBoxPaint AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = gboxPaint Left = 105 Height = 21 Top = 2 Width = 47 BorderSpacing.Left = 6 ItemHeight = 13 ItemIndex = 0 Items.Strings = ( '1' '2' '3' '4' '5' '6' '7' '8' '9' '10' '11' '12' '13' '14' '15' '16' '17' '18' '19' '20' '21' '22' '23' '24' '25' ) TabOrder = 2 Text = '1' end end object btnHightlight: TSpeedButton Left = 398 Height = 46 Hint = 'Highlight' Top = 1 Width = 32 Align = alLeft BorderSpacing.Left = 6 BorderSpacing.Bottom = 2 Glyph.Data = { 36090000424D3609000000000000360000002800000018000000180000000100 200000000000000900006400000064000000000000000000000000769A000076 9A0000769A0000769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A0000769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A0000769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A0000769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A0000769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A0000769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A0000769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A0000769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A0000769A0000769A0000769A0000769A0000769A0000769A00AEAE AEFF949494FF00769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A00AEAEAEFF949494FF00769A0000769A0000769A0000769A000076 9A0000769A0000769A0000769A00AEAEAEFF949494FF00769A0000769A00AEAE AEFF949494FFDCC299FFDCC299FFDCC299FFDCC299FFDCC299FFDCC299FFDCC2 99FFDCC299FFAEAEAEFF949494FFDCC299FFDCC299FFDCC299FFDCC299FFDCC2 99FFDCC299FFDCC299FFDCC299FFAEAEAEFF949494FF00769A0000769A000076 9A00DCC299FF00769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A0000769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A0000769A0000769A00DCC299FF00769A0000769A0000769A000076 9A00DCC299FF00769A00C4C4C4FFBBBBBBFFBBBBBBFF929292FFA2A4A5FFADAD ADFF9B9B9BFF9C9C9CFFA5A5A5FFAFAFAFFFB8B8B8FFBBBBBBFFBBBBBBFFBBBB BBFFBBBBBBFFC4C4C4FF00769A00DCC299FF00769A0000769A0000769A000076 9A00DCC299FF00769A00BBBBBBFFFFFFFFFFFFFFFFFFFBFBFBFF303537FFA6B3 B8FFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9FFE6E6E6FFE1E1E1FFE7E7E7FFF2F2 F2FFFBFBFBFFBBBBBBFF00769A00DCC299FF00769A0000769A0000769A000076 9A00DCC299FF00769A00BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFC3C6C8FFADC9 D4FF678C98FFFAFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFBBBBBBFF00769A00DCC299FF00769A0000769A0000769A000076 9A00DCC299FF00769A00BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AA4 A9FFB0CBD5FF4793AAFFF4FAFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFBBBBBBFF00769A00DCC299FF00769A0000769A0000769A000076 9A00DCC299FF00769A00BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9EA EBFF488DA3FF354A51FF5AC4E5FFF9FCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFBBBBBBFF00769A00DCC299FF00769A0000769A0000769A00AEAE AEFF949494FF00769A00BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFCBE3EAFF3FA1C0FF395760FF69CBE9FFFDFEFEFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFBBBBBBFF00769A00AEAEAEFF949494FF00769A0000769A00AEAE AEFF949494FF00769A00BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFBCDBE4FF3793AFFF3E636FFF7BD1EDFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFBBBBBBFF00769A00AEAEAEFF949494FF00769A0000769A000076 9A00DCC299FF00769A00BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFACD2DEFF34768BFF467280FF8EDDF4FFFFFFFFFFFFFF FFFFFFFFFFFFBBBBBBFF00769A00DCC299FF00769A0000769A0000769A000076 9A00DCC299FF00769A00BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFF98C7D5FF336C7EFF4A8A9DFF9EE4F9FFFFFF FFFFFFFFFFFFBBBBBBFF00769A00DCC299FF00769A0000769A0000769A000076 9A00DCC299FF00769A00BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85C0D2FF356474FF5097AEFFADEA FDFFFFFFFFFFBBBBBBFF00769A00DCC299FF00769A0000769A0000769A000076 9A00DCC299FF00769A00BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72CDEAFF395E6AFF51A5 BFFFBBEEFDFFBBBBBBFF00769A00DCC299FF00769A0000769A0000769A000076 9A00DCC299FF00769A00C4C4C4FFBBBBBBFFBBBBBBFFBBBBBBFFBBBBBBFFBBBB BBFFBBBBBBFFBBBBBBFFBBBBBBFFBBBBBBFFBBBBBBFFBABBBBFF4CB1D0FF314F 58FF49A5C1FF98C4D1FF00769A00DCC299FF00769A0000769A0000769A000076 9A00DCC299FF00769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A0000769A0000769A0000769A0000769A0000769A0000769A0011AE DFFF1D3840FF24A7D0FF00769A00DCC299FF00769A0000769A0000769A00AEAE AEFF949494FFDCC299FFDCC299FFDCC299FFDCC299FFDCC299FFDCC299FFDCC2 99FFDCC299FFAEAEAEFF949494FFDCC299FFDCC299FFDCC299FFDCC299FFD5C0 99FF51B7CDFF26393DFF49AEC5FF97AFB7FF949494FF00769A0000769A00AEAE AEFF949494FF00769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A00AEAEAEFF949494FF00769A0000769A0000769A0000769A000076 9A0000769A0021B5E4FF1A2E33FF90BDCBFF86979DFF00769A0000769A000076 9A0000769A0000769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A0000769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A0000769A0083B0BEFF424F53FF043D4FFF00769A0000769A000076 9A0000769A0000769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A0000769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A0000769A0000769A00093542FF00769A0000769A0000769A000076 9A0000769A0000769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A0000769A0000769A0000769A0000769A0000769A0000769A000076 9A0000769A0000769A0000769A0000769A0000769A0000769A00 } NumGlyphs = 0 OnClick = btnPaintHightlight end object gboxView: TGroupBox Left = 214 Height = 47 Top = 1 Width = 178 Align = alLeft BorderSpacing.Left = 5 BorderSpacing.Right = 6 BorderSpacing.Bottom = 1 Caption = 'View' ChildSizing.LeftRightSpacing = 2 ChildSizing.TopBottomSpacing = 2 ChildSizing.ControlsPerLine = 1 ClientHeight = 29 ClientWidth = 174 TabOrder = 2 object btn270: TSpeedButton AnchorSideLeft.Side = asrBottom Left = 72 Height = 22 Hint = '- 90' Top = -1 Width = 32 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 6 BorderSpacing.Right = 6 Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00AA555500842F4A00792B430070273E0070273E00792B 4300842F4A00AA555500FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF0095395500812D4800884258FFB58293FFD1ACB9FFD1ACB9FFB582 93FF884258FF812D480095395500FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF008D314E009D586EFFCA9DADFFD6B1BFFFE2C4D0FFE2C4D0FFD6B1 BFFFCA9DADFF9D586EFF8C314E00FF808000FFFFFF00FFFFFF00FFFFFF00FFFF FF00A23C550094405900BF879900C99AAAFFBD7C91FFA04762FFA04762FFBD7C 91FFC99AAAFFBF889AFF94405AFF9C375600FFFFFF00FFFFFF00FFFFFF00FFFF FF00AA405500A75C7400BB849800B36E83008825420081213C0081213C008825 4200B46D84FFBC8497FFA75D75FF9F385A00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00AF608000B77C8F00983B57007C213B00FFFFFF00FFFFFF007B1E 3800973B57FFB87C90FFAB657CFFA4385B00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF009F3050008522450066192D0057102100570F2200741A 320097425BFFC28F9FFFB06D82FFAD3C5F00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF008000800080223E0078283F00B88A99FF5E1024FF731A 3300BD8596FFD1AAB7FFC08699FFB73F6500FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00B83D66009E325200A95E75FFD3AFBBFFDABBC5FF8A4056FFBA84 95FFD6B4BFFFD4B1BCFFB95B78FFC4456C00FFFFFF00FFFFFF00FFFFFF00FFFF FF00C94A7200BA4A6C00C690A1FFDABCC6FFDCBFC8FFDCC0C9FFDCC0C9FFDCBF C8FFDABCC6FFBD798FFFB83D6300FF808000FFFFFF00FFFFFF00FFFFFF00FFFF FF00CB487400C14E7300CD9BAAFFE0C7CFFFE0C7CFFFE1C8D0FFDABCC6FFCDA0 AEFFB05A75FFB13A5E00BD426800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00CA467200BC3F6700BF7089FFE2CAD2FFE8D6DCFFA23254FFA735 5800B13B5D0080808000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00C6557100C0416900BA4D6E00D7AFBCFFB33B60FFFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C6466E00C4446C00C4446C00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = miRotateClick end object btn90: TSpeedButton AnchorSideLeft.Side = asrBottom Left = 104 Height = 22 Hint = '+ 90' Top = -1 Width = 32 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 6 BorderSpacing.Right = 6 Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00AA555500842F4A00792B430070273E0070273E00792B 4300842F4A00AA555500FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF0095395500812D4800884258FFB58293FFD1ACB9FFD1ACB9FFB582 93FF884258FF812D480095395500FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FF8080008C314E009D586EFFCA9DADFFD6B1BFFFE2C4D0FFE2C4D0FFD6B1 BFFFCA9DADFF9D586EFF8D314E00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF009C37560094405AFFBF889AFFC99AAAFFBD7C91FFA04762FFA04762FFBD7C 91FFC99AAAFFBF87990094405900A23C5500FFFFFF00FFFFFF00FFFFFF00FFFF FF009F385A00A75D75FFBC8497FFB46D84FF8825420081213C0081213C008825 4200B36E8300BB849800A75C7400AA405500FFFFFF00FFFFFF00FFFFFF00FFFF FF00A4385B00AB657CFFB87C90FF973B57FF7B1E3800FFFFFF00FFFFFF007C21 3B00983B5700B77C8F00AF608000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00AD3C5F00B06D82FFC28F9FFF97425BFF741A320057102200570F21006619 2D00852245009F305000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00B73F6500C08699FFD1AAB7FFBD8596FF731A33005E1024FFB88A99FF7828 3F0080223E0080008000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00C4456C00B95B78FFD4B1BCFFD6B4BFFFBA8495FF8A4056FFDABBC5FFD3AF BBFFA95E75FF9E325200B83D6600FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FF808000B83D6300BD798FFFDABCC6FFDCBFC8FFDCC0C9FFDCC0C9FFDCBF C8FFDABCC6FFC690A1FFBA4A6C00C94A7200FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00BD426800B13A5E00B05A75FFCDA0AEFFDABCC6FFE1C8D0FFE0C7 CFFFE0C7CFFFCD9BAAFFC14E7300CC477200FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0080808000B13B5D00A7355800A23254FFE8D6DCFFE2CA D2FFBF7089FFBC3F6700CA467200FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B33B60FFD7AFBCFFBA4D 6E00C0416900C6557100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C5446C00C4446C00C646 6E00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = miRotateClick end object btnMirror: TSpeedButton AnchorSideLeft.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 136 Height = 22 Hint = 'Mirror' Top = -1 Width = 35 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 6 BorderSpacing.Right = 4 Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000A4A4A402ACA6 A603AAAAAA02A5A5A501FFFFFF00000000000000000000000000F2813218F17D 2A6C00000000FFFF0000C8916E01CC915D02D3906403CC995D02ACA9A9C8ABA7 A7E4A9A5A5E4B0ADADE7D3D1D1F1E9E8E8F7F3F2F2EEDDCBCB02F2803020F17B 28FFF9C9A6FFF1DECFF6CF9462E4CF9462E4CF9462E4CF9361CCACA8A883C7C5 C5E4EDEDEDEAFEFCFAFEFCDAC2FFF8B98DFFF6A56BFFF38A40C9F282328DF288 3DFFF0741DFFFBDCC6FFF9F7F6F2F2EFEDE4E1C1A7E4CF936186ABA8A81DAEAA AAE1EAEAEAECFDECE0FFF7AA74FFF9C5A0FFFACFB1FFF2893E84F27F2FCFF078 22FFEF6F14FFF0751FFFFDEDE1FFF1EBE7EBD19A6BE2CF93612000000000AAA6 A695CCCACAE6FBFBFBFBFEFCFAFEF7F7F7F4C9C7C7EFA0A0A000F17C2A64F076 20FFF07823FFF8BA8EFFFDF8F5FEE3C8B2EACF9463990000000000000000A9A5 A52DB0ADADE4EBEBEBECEDEDEDECE8E8E8E4B4B0B0E9F1813318F17D2BEFF7B7 8AFFFEF6F0FFF7F5F4F8E8E1DDEAD29E74E4D095643000000000000000000000 0000A8A4A4A8D4D3D3EAEFEFEFEFEAEAEAE9A29D9DE400000000F17C2B0BF0DD CDF4F1EEECF4EEEAE7F2E4CEBEECD09667AC0000000000000000000000000000 0000A7A3A33FB1AEAEE5EEEEEEEFF2F2F2F1A29D9DE40000000000000000D29A 6DE0F2EFEDF5F2EEECF4D8AA86E7D1986A430000000000000000000000000000 0000B3999901A6A2A2BAD1D0D0E6F1F1F1F2A29D9DE30000000000000000D39D 70DFF6F4F2F6EDDED3F1D39B6EBDD59C71010000000000000000000000000000 000000000000A5A1A152B3B0B0E4E2E2E2E6A29D9DE30000000000000000D49F 73DFFAF8F7F9DFBA9BE9D49D7156000000000000000000000000000000000000 000000000000A8A1A104A49F9FC9D2D1D1E4A29D9DE20000000000000000D6A1 77DFF6EEE7F6D5A176CCD4A17405000000000000000000000000000000000000 00000000000000000000A39F9F65B6B3B3E4A29D9DE20000000000000000D7A4 7ADEE6C7AEECD6A3786800000000000000000000000000000000000000000000 00000000000000000000A49F9F0BA39E9ED5A29D9DE10000000000000000D8A7 7FDED8A881D7D8A57C0D00000000000000000000000000000000000000000000 0000000000000000000000000000A29D9D78A29D9DE10000000000000000D9AB 84DDD9AA837B0000000000000000000000000000000000000000000000000000 0000000000000000000000000000A19D9D16A29D9DC00000000000000000DBAE 88BFDBAD86180000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 OnClick = miRotateClick end object btnZoomIn: TSpeedButton Left = 4 Height = 22 Hint = 'Zoom In' Top = -1 Width = 28 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 4 BorderSpacing.Right = 6 Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000003E3E3E171B1B1B00000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000848484439B9B9BEF8C8C8C6C000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000F0F0F0076767654939393F6B4B4B4FFC7C7C7AF000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000222222006767676A858585FBBEBEBDFFCBCBCB9C65656506000000000000 0000000000000000000000000000000000000000000000000000000000002121 21015B5B5B7E7C7C7CFDCAC9C8FEC8C8C8834F4F4F0200000000000000000000 0000000000001716161B6F6D6D5A7F7D7C726F6D6C5A1716161B1D1D1D035252 528B7E7E7DFED2D2D0FAC0C0C0683A3A3A000000000000000000000000000000 00067A79787DBAB1AAECD2BA9BDAD9BE92CAD4BC9AD9BDB2A8EC717070C08787 86FFD7D6D5F3B4B4B44E1D1D1D00000000000000000000000000000000017877 7788BCA490EBD6A54999F3D35F71F9E07869F4D5616FDAAB4994C2A68DE7BEBD BCF2A2A2A23900000000000000000000000000000000000000004342422DA392 8AF5C8903BA4F3D25973FAE38265A16F30FFFAE38364F5D55D71CF9B3E9CA692 85F24443432D00000000000000000000000000000000000000007171717CA57C 5DE5DFB0458DF6D76474F9E1816CA25718FFF8DF806CF6D86672E3B74788A97C 57DD7473737C000000000000000000000000000000000000000078787898A36F 49DEDFAF4992A05215FFC86619FFA75616FF7B4011FF63340EFFE2B54B8EA56D 3FD77C7C7C9800000000000000000000000000000000000000007A7A7A809667 4BEED29E46A3ECC86294F8E088A89E652DFFF8E085A9EECB6592D5A2449C9764 42E87C7C7C8000000000000000000000000000000000000000006C6C6B31957E 73FAAD7341DCE5C480C8F5E1A5D39B713DFFF5E0A0CEE8C781BFB37C48D49478 69F96D6D6D310000000000000000000000000000000000000000000000019D9C 9B97956D59FBB07B50EEDFC08FF0E6C88CECE0C28FEBB58256E990644DFA9997 9797000000010000000000000000000000000000000000000000000000005D5C 5C05B5B4B391A58F84FB956B53FD96694AFC93684FFC9E8579FBADACAB915B5A 5A05000000000000000000000000000000000000000000000000000000000000 000005050500B4B3B224CCCACA6FCECDCC88CBCAC96FB3B2B224000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 OnClick = miZoomClick end object btnZoomOut: TSpeedButton AnchorSideLeft.Side = asrBottom Left = 34 Height = 22 Hint = 'Zoom Out' Top = -1 Width = 28 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 6 BorderSpacing.Right = 6 Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000003E3E3E171B1B1B00000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000848484439B9B9BEF8C8C8C6C000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000F0F0F0076767654939393F6B4B4B4FFC7C7C7AF000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000222222006767676A858585FBBEBEBDFFCBCBCB9C65656506000000000000 0000000000000000000000000000000000000000000000000000000000002121 21015B5B5B7E7C7C7CFDCAC9C8FEC8C8C8834F4F4F0200000000000000000000 0000000000001716161B6F6D6D5A7F7D7C726F6D6C5A1716161B1D1D1D035252 528B7E7E7DFED2D2D0FAC0C0C0683A3A3A000000000000000000000000000000 00067A79787DBAB1AAECD2BA9BDAD9BE92CAD4BC9AD9BDB2A8EC717070C08787 86FFD7D6D5F3B4B4B44E1D1D1D00000000000000000000000000000000017877 7788BCA490EBD6A54999F3D35F71F9E07463F4D5616FDAAB4994C2A68DE7BEBD BCF2A2A2A23900000000000000000000000000000000000000004342422DA392 8AF5C8903BA4F3D25973FAE47E60FCED9355FAE5805FF5D55D71CF9B3E9CA692 85F24443432D00000000000000000000000000000000000000007171717CA57C 5DE5DFB0458DF0CD5E7AF6D7756FF4DA7E6AEFD5756EEBCB6078E3B74788A97C 57DD7473737C000000000000000000000000000000000000000078787898A36F 49DEDEAE4892A55A1CFCCC7022FEAF6523FE864E1CFE693B13FEDEB14A91A56D 3FD77C7C7C9800000000000000000000000000000000000000007A7A7A809667 4BEED29E46A3ECC86193F8E185A5F9E076A6F8E183A6EECB6491D5A2449C9764 42E87C7C7C8000000000000000000000000000000000000000006C6C6B31957E 73FAAD7341DCE5C480C8F5E1A4D2F4DB81C3F5E19FCCE8C781BFB37C48D49478 69F96D6D6D310000000000000000000000000000000000000000000000019D9C 9B97956D59FBB07B50EEDFC08FF0E6C88BEBE0C28FEBB58256E990644DFA9997 9797000000010000000000000000000000000000000000000000000000005D5C 5C05B5B4B391A58F84FB956B53FD96694AFC93684FFC9E8579FBADACAB915B5A 5A05000000000000000000000000000000000000000000000000000000000000 000005050500B4B3B224CCCACA6FCECDCC88CBCAC96FB3B2B224000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 OnClick = miZoomClick end object btnGifMove: TSpeedButton AnchorSideLeft.Side = asrBottom Left = 4 Height = 22 Top = -1 Width = 32 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 6 BorderSpacing.Right = 6 Caption = '||' NumGlyphs = 0 OnClick = btnGifMoveClick end object btnGifToBmp: TSpeedButton Left = 139 Height = 21 Top = 0 Width = 32 Caption = 'S' NumGlyphs = 0 OnClick = btnGifToBmpClick end object btnNextGifFrame: TSpeedButton Left = 96 Height = 22 Top = -1 Width = 31 Caption = '||>' NumGlyphs = 0 OnClick = btnNextGifFrameClick end object btnPrevGifFrame: TSpeedButton Left = 48 Height = 22 Top = -1 Width = 28 Caption = '<||' NumGlyphs = 0 OnClick = btnPrevGifFrameClick end end object btnResize: TSpeedButton AnchorSideLeft.Side = asrBottom Left = 413 Height = 46 Hint = 'Resize' Top = 1 Width = 48 Align = alRight AutoSize = True BorderSpacing.Left = 5 BorderSpacing.Right = 3 BorderSpacing.Bottom = 2 Glyph.Data = { 36090000424D3609000000000000360000002800000018000000180000000100 2000000000000009000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000001D00000054000000540000005400000054000000540000 0054000000540000005400000054000000540000003800000001000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000049FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFDFDFDFFE8E8E8FFAAABABEF23232355000000010000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000049FBFBFBFFF9F9F9FFFAFAFAFFFAF1EBFFFCFCFCFFFCFC FCFFFDFDFDFFFEFEFEFFFCFCFCFFE4E4E4FFEEEFEFFFA2A3A3EF1C1C1C570000 0001000000000000000000000000000000000000000000000000000000000000 00000000000000000049FBFBFBFFF8F8F8FFFAF7F4FFF1863BFFFBF5F0FFFCFC FCFFFDFDFDFFFEFEFEFFFCFCFCFFE4E4E4FFFDFDFDFFEEEFEFFF999A9AEF1919 1957000000020000000000000000000000000000000000000000000000000000 00000000000000000049FBFBFBFFF8F8F8FFF7D3BAFFF18438FFF8CFB2FFFCFC FCFFFDFDFDFFFEFEFEFFFDFDFDFFE1E1E1FFFEFEFEFFFDFDFDFFEEEFEFFF999A 9AF01C1C1C590000000200000000000000000000000000000000000000000000 00000000000000000049FBFBFBFFF8F8F8FFF9F9F9FFF3A46DFFFBFBFBFFFCFC FCFFFDFDFDFFFDFDFDFFFEFEFEFFDADBDBFFFEFEFEFFFEFEFEFFFDFDFDFFEEEF EFFFA2A3A2F02121215A00000002000000000000000000000000000000000000 00000000000000000049FBFBFBFFF7F7F7FFF9F9F9FFF3A771FFFBFBFBFFFCFC FCFFFCFCFCFFFDFDFDFFFEFEFEFFD1D2D2FFFEFEFEFFFEFEFEFFFEFEFEFFFDFD FDFFEEEFEFFFA9AAAAF000000038000000000000000000000000000000000000 00000000000000000049FBFBFBFFF7F7F6FFF8F8F8FFF4AD7BFFFAFAFAFFFBFB FBFFFCFCFCFFFDFDFDFFFDFDFDFFEDEEEDFFD0D0D0FFD9D9D9FFE0E0E0FFE4E4 E4FFE4E4E4FFE8E8E8FF0101014E000000000000000000000000000000000000 00000000000000000049FBFBFBFFF6F6F6FFF7F7F7FFF4B384FFFAFAFAFFFBFB FBFFFBFBFBFFFCFCFCFFFDFDFDFFFDFDFDFFFEFEFEFFFEFEFEFFFDFDFDFFFDFD FDFFFCFCFCFFFDFDFDFF0000004E000000000000000000000000000000000000 00000000000000000049FBFBFBFFF5F5F5FFF6F6F6FFF5B98EFFFAFAFAFFFAFA FAFFFBFBFBFFFCFCFCFFFCFCFCFFFDFDFDFFFDFDFDFFFDFDFDFFFEFEFEFFFEFE FEFFFEFEFEFFFFFFFFFF0000004E000000000000000000000000000000000000 0000000000000000004AFBFBFBFFF4F4F4FFF5F5F5FFF5BE97FFF8F8F8FFFAFA FAFFFAFAFAFFFBFBFBFFFBFBFBFFFCFCFCFFFCFCFCFFFDFDFDFFFDFDFDFFFDFD FDFFFDFDFDFFFFFFFFFF0000004E000000000000000000000000000000000000 0000000000000000004AFBFBFBFFF3F3F2FFF4F4F4FFF6C4A0FFF7F7F7FFF9F9 F9FFFAFAFAFFFAFAFAFFFBFBFBFFFBFBFBFFFCFCFCFFFCFCFCFFFCFCFCFFFCFC FCFFFCFCFCFFFFFFFFFF0000004E000000000000000000000000000000000000 0000000000000000004AFBFBFBFFF2F2F1FFF3F3F2FFF6CAA9FFF6F6F6FFF7F7 F7FFF8F8F8FFFAFAFAFFFAFAFAFFFAFAFAFFFBFBFBFFFBFBFBFFFBFBFBFFFBFB FBFFFBFBFBFFFEFEFEFF0000004E000000000000000000000000000000000000 0000000000000000004AFBFBFBFFF0F0F0FFF2F2F1FFF6CFB2FFF4F4F4FFF6F6 F6FFF7F7F7FFF8F8F8FFF9F9F9FFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAFA FAFFFAFAFAFFFEFEFEFF0000004E000000000000000000000000000000000000 0000000000000000004AFBFBFBFFB8B8B7FF9B9B9BFF9D938BFF9C9C9CFFB8B8 B8FFF5F5F5FFF6F6F6FFF7F7F7FFF8F8F8FFF9F9F9FFF9F9F9FFFAFAFAFFFAFA FAFFFAFAFAFFFEFEFEFF0000004E000000000000000000000000000000000000 0000000000000000004AFBFBFBFFA1A1A1FFEFEFEEFFF0F0F0FFF2F2F1FF9F9F 9FFFF4F4F3FFF5F5F4FFF6F6F5FFF6F6F6FFF7F7F7FFF7F7F7FFF8F8F8FFF6CD B0FFF8F3F0FFFEFEFEFF0000004E000000000000000000000000000000000000 0000000000000000004AFBFBFBFFA0A0A0FFEEEEEDFFEFEFEEFFF0F0EFFFA096 8EFFF6D1B6FFF5CBACFFF5C4A1FFF4BE96FFF4B78CFFF3B081FFF2A976FFF083 35FFF1883EFFFDF6F0FF0000004E000000000000000000000000000000000000 0000000000000000004AFBFBFBFFA0A09FFFECECEBFFEDEDECFFEEEEEEFF9E9E 9EFFF0F0F0FFF1F1F1FFF2F2F1FFF3F3F2FFF3F3F3FFF4F4F3FFF4F4F4FFF2CD B3FFF4F1EFFFFDFDFDFF0000004E000000000000000000000000000000000000 0000000000000000004BFBFBFBFFBBBBBAFFA3A3A3FFA4A4A3FFA4A4A4FFBBBB BBFFEFEFEEFFEFEFEFFFF0F0EFFFF1F1F0FFF1F1F1FFF2F2F1FFF2F2F2FFF2F2 F2FFF2F2F2FFFDFDFDFF0000004E000000000000000000000000000000000000 0000000000000000004BF0F0F0FEF4F4F4FEF4F4F4FEF4F4F4FEF3F3F3FEF3F3 F3FEF3F3F3FEF3F3F3FEF3F3F3FEF3F3F3FEF3F3F3FEF3F3F3FEF3F3F3FEF3F3 F2FEF2F2F2FEF4F4F4FE0000004E000000000000000000000000000000000000 000000000000000000160000003E0000003E0000003E0000003E0000003E0000 003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000 003E0000003E0000003E00000017000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 OnClick = btnResizeClick end object btnReload: TSpeedButton Left = 1 Height = 46 Top = 1 Width = 48 Action = actReload Align = alLeft BorderSpacing.Bottom = 2 Glyph.Data = { 36090000424D3609000000000000360000002800000018000000180000000100 2000000000000009000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000005B0007004E006C0050 01AB095E12DB015B01F5005D00F7095F11E2015102BA004F007F004A00110000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000050004C075D0DEB076B0DFF0A92 30FF15B125FF0AD113FF06E60BFF0DD317FF17B12CFF06790BFF05580AEE004E 006D004E00090000000000000000000000000000000000000000000000000000 00000000000000000000004E0009015002BB0B6515FD159227FF18A72DFF1AB1 31FF14C226FF0FD11DFF0CDA17FF0CDA17FF0FD11DFF14C226FF21AD3EFF1274 22F2005001C2004A001B00000000000000000000000000000000000000000000 00000000000000000000025003B80F721DFF0A9513FF0F9D1DFF15A427FF1AAA 31FF18B52FFF15C027FF12C723FF12C723FF14C027FF18B52EFF1AAA32F016A5 2ACD137923C0004F00A700550008000000000000000000000000000000000000 0000000000000051005C085B0FFE028D05FF07940DFF0C9A17FF119F20FF16A5 29FF19A931FF1BAE33FF19B330FF19B330FF1AAE33FF1AA931EF16A529D1119F 21AD0F9C1C8D0B68139B00540030000000000000000000000000000000000000 0000004D000F045108F505750AFF008C01FF049108FF08950FFF0D9A18FF17A2 2AFF0D7B19FF0B6A14FD0A6413FD0D7019FF189F2EEB14A326D3119F20B10D9A 1890089510730B95155809651137000000000000000000000000000000000000 00000255057B06530CFF007000FF008100FF018D02FF049109FF0F8E1CFF075F 0EF00253048F004C0041004E003B02500474045208D70D8019B00B99167E0895 0F6305910949018D02350D731824046A07020000000000000000000000000000 0000035306C1045109FF006300FF007300FF008300FF068E0AFF05590AF5004D 014F00000000000000000000000000000000004C0026025004B106880B490490 0730018D02230083001709770F0D05620B020000000000000000000000000000 0000045108E8014D01FF005500FF006400FF007300FF06660CFF015103AB0000 00000000000000000000000000000000000000000000004E01290A6211160263 040F02540609044F07050A5B140100000000000000000000000000000000004D 0001054D07F9085508FF0B570BFF0A5D0AFF006200FF055207FE014F015A0000 0000000000000000000000000000000000000000000000000000065210050957 1303000000000000000000000000000000000000000000000000000000000000 0000065108FB267026FF287228FF277127FF005000FF034B06FE014D015A0000 00000000000000000000004D0004125E1BEC025C03FF045C04FF045B05FF0459 06FF015503FF025304FF025405FF07600DA90000000000000000000000000000 000008550CE62B752BFF357E35FF357E35FF085408FF034B06FF035306870000 00000000000000000000004D0008024E04D1028004FF13C813FF2DC72DFF35BD 35FF34AF34FF249824FF127B12FF055A08FF0000000000000000000000000000 0000095B10BE266E27FF418A41FF418A41FF266F26FF014C01FF045107F30351 0311000000000000000000000000004D0033034F07E2027704FF019601FF20A1 20FF41AD41FF41A641FF419D41FF0B5F0EFF0000000000000000000000000000 000007610F7D1C641DFF4F964FFF4F964FFF4F964FFF166016FF014E03FF044F 08F30758105900802B030064140605540A6B034D05F7016A02FF017A01FF3CA2 3CFF4FAB4FFF4FA64FFF4FA24FFF0C610FFF0000000000000000000000000000 00000057000A09560BF4498F49FF5BA15BFF5BA15BFF549A54FF1B641BFF014D 01FF024C03FF024B04FE044C06FE024C03FF015401FF086508FF3F963FFF5BAC 5BFF5BAB5BFF5BA95BFF5BA75BFF0D610FFF0000000000000000000000000000 000000000000045C0852155F17FE66AA66FF68AD68FF68AD68FF69AE69FF468B 46FF226A22FF085408FF045004FF176017FF307930FF5FA75FFF68B068FF68B0 68FF68B068FF68AF68FF68AF68FF0E6210FF0000000000000000000000000000 00000000000000000000035A06BB337933FF70B570FF74B974FF74B974FF74B9 74FF74B974FF77BA77FF75B875FF74B974FF74B974FF74B974FF74B974FF76BA 76FF61A361FF539A55FF75B975FF0F6311FF0000000000000000000000000000 0000000000000000000000540007035D05B71C691DFE65A865FF81C581FF81C5 81FF81C581FF81C581FF81C581FF81C581FF81C581FF81C581FF80BF80FF367E 38FE025703D5015903D7479147FF116612FF0000000000000000000000000000 0000000000000000000000000000000000000060024D0E620EF1347C34FF5799 57FF74B474FF7FC47FFF84C984FF80BF80FF6EAA6EFF4A8E4AFF0D5E0DF40056 018C004D0010004D001F005C01B8458E45E60000000000000000000000000000 00000000000000000000000000000000000000000000006000080063007A0160 01B5216F21E6337633FD347634FE2D732DEF166816CA015C0194005000290000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 ShowCaption = False end object btnPaint: TSpeedButton Left = 462 Height = 46 Hint = 'Paint' Top = 1 Width = 32 Align = alLeft BorderSpacing.Left = 5 BorderSpacing.Bottom = 2 Glyph.Data = { 36090000424D3609000000000000360000002800000018000000180000000100 2000000000000009000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000082E4D5933284A5765183B467C092027690105074D000000480000 004600000043000000410000003B000000340000002D00000027000000200000 001B00000015000000100000000A00000004000000010000000000000000689D B416689DB4AF679CB3FF5C8FA3FF4D8598FF2C6578FF134555D9134555370000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000689DB408689DB47378A7BCF88EBBCBFF7FBBCDFF5794A7FF205263D70000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000689DB43E6EA1B6F1ADCCD7FFA9CDDAFF6992A1FF1035 414A000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000689DB43082AEC1E9C4D8E0FF85949BFF344A 53A9555555030000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000689DB413698E9FCA717A7EFFA2A5 A6E48F8F8F8B0000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000078899103A2A5A6C2B0B0 B0C3A9A9A9E65555558F00000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000AFAFAF369898 98EA545454FF202020FB1D1D1DA0000000050000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000002A2A 2A99151515FF080808FF0E0E0EFF1C1C1CB20000000300000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000404 0426030303F0141414FF161616FF161616FF191919A800000002000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000A1191919FF252525FF222222FF1A1A1AFF1313138F000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000220D0D0DE62E2E2EFF333333FF292929FF171717ED080808370000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000084242424FF424242FF3A3A3AFF2C2C2CFF111111BA0000 0001000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000006020202BB333333FF4A4A4AFF3B3B3BFF292929FE0B0B 0B71000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000111D1D1DCA424242FF414141FF353535FF1D1D 1DDE0404041B0000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000015151520555555DC4A4A4AFF343434FF3333 33FF212121AB0000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000020202031606060E7424242FF2626 26FF323232F91515155600000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000303030456B6B6BEF3434 34FF191919FF232323D300000008000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000003D3D3D5B7878 78F5202020FF414141FF6B6B6BB8000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000004B4B 4B73969696FC6B6B6BFF030303EB000000320000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000737373A37B7B7BFC060606FF0707079D0000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000006A6A6AA1909090DE2F2F2F670000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 OnClick = btnPaintHightlight end object btnFullScreen: TSpeedButton AnchorSideRight.Control = btnResize Left = 410 Height = 45 Hint = 'Full Screen' Top = 1 Width = 48 Align = alRight AutoSize = True BorderSpacing.Right = 3 BorderSpacing.Bottom = 3 Glyph.Data = { 36090000424D3609000000000000360000002800000018000000180000000100 2000000000000009000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 0000FFFFFFFF4343CBFF6262D4FFA0A0E5FFDEDEF6FFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDE F6FFA0A0E5FF6262D4FF4343CBFFFFFFFFFF0000000000000000000000000000 0000FFFFFFFF6262D4FF0505BAFF0505BAFF4B4BCDFFF3F3FCFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3FCFF4B4B CDFF0505BAFF0505BAFF6262D4FFFFFFFFFF0000000000000000000000000000 0000FFFFFFFFA0A0E5FF0505BAFF0505BAFF8787DEFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8787 DEFF0505BAFF0505BAFFA0A0E5FFFFFFFFFF0000000000000000000000000000 0000FFFFFFFFDEDEF6FF4B4BCDFF8787DEFF0505BAFF8A8ADEFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A8ADEFF0505 BAFF8787DEFF4B4BCDFFDEDEF6FFFFFFFFFF0000000000000000000000000000 0000FFFFFFFFFFFFFFFFF3F3FCFFFFFFFFFF8A8ADEFF9C9CE4FFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C9CE4FF8A8A DEFFFFFFFFFFF3F3FCFFFFFFFFFFFFFFFFFF0000000000000000000000000000 0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 0000FFFFFFFFFFFFFFFFF3F3FCFFFFFFFFFF8A8ADEFF9C9CE4FFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C9CE4FF8A8A DEFFFFFFFFFFF3F3FCFFFFFFFFFFFFFFFFFF0000000000000000000000000000 0000FFFFFFFFDEDEF6FF4B4BCDFF8787DEFF0505BAFF8A8ADEFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A8ADEFF0505 BAFF8787DEFF4B4BCDFFDEDEF6FFFFFFFFFF0000000000000000000000000000 0000FFFFFFFFA0A0E5FF0505BAFF0505BAFF8787DEFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8787 DEFF0505BAFF0505BAFFA0A0E5FFFFFFFFFF0000000000000000000000000000 0000FFFFFFFF6262D4FF0505BAFF0505BAFF4B4BCDFFF3F3FCFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3FCFF4B4B CDFF0505BAFF0505BAFF6262D4FFFFFFFFFF0000000000000000000000000000 0000FFFFFFFF4343CBFF6262D4FFA0A0E5FFDEDEF6FFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDE F6FFA0A0E5FF6262D4FF4343CBFFFFFFFFFF0000000000000000000000000000 0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000 0000DCDBDBFFD1CFCFFFD1CFCFFFD1CFCFFFD1CFCFFFD1CFCFFFD1CFCFFFD1CF CFFFD1CFCFFFD1CFCFFFD1CFCFFFD1CFCFFFD1CFCFFFD1CFCFFFD1CFCFFFD1CF CFFFD1CFCFFFD1CFCFFFD1CFCFFFDCDBDBFF0000000000000000000000000000 0000E1E0E0FFD7D5D5FFD7D5D5FFD7D5D5FFD7D5D5FFD7D5D5FFD7D5D5FFD7D5 D5FFD7D5D5FFD7D5D5FFD7D5D5FFD7D5D5FFD7D5D5FFD7D5D5FFD7D5D5FFD7D5 D5FFD7D5D5FFD7D5D5FFD7D5D5FFE1E0E0FF0000000000000000000000000000 0000E5E4E4FFCAC9C9FFCAC9C9FFDCDADAFFDCDADAFFDCDADAFFDCDADAFFDCDA DAFFDCDADAFFDCDADAFFDCDADAFFCAC9C9FFCAC9C9FFDCDADAFFCAC9C9FFCAC9 C9FFDCDADAFFCAC9C9FFCAC9C9FFE5E4E4FF0000000000000000000000000000 0000E9E8E8FFEEEEEEFFEEEEEEFFE2E0E0FFE2E0E0FFE2E0E0FFE2E0E0FFE2E0 E0FFE2E0E0FFE2E0E0FFE2E0E0FFEEEEEEFFEEEEEEFFE2E0E0FFEEEEEEFFEEEE EEFFE2E0E0FFEEEEEEFFEEEEEEFFE9E8E8FF0000000000000000000000000000 0000F6F6F6FFF5F4F4FFF5F4F4FFF5F4F4FFF5F4F4FFF5F4F4FFF5F4F4FFF5F4 F4FFF5F4F4FFF5F4F4FFF5F4F4FFF5F4F4FFF5F4F4FFF5F4F4FFF5F4F4FFF5F4 F4FFF5F4F4FFF5F4F4FFF5F4F4FFF6F6F6FF0000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 OnClick = btnFullScreenClick end object gboxSlideShow: TGroupBox AnchorSideRight.Control = btnFullScreen Left = 331 Height = 48 Top = 1 Width = 124 Align = alRight AutoSize = True BorderSpacing.Right = 6 Caption = 'Slide Show' ClientHeight = 30 ClientWidth = 120 TabOrder = 3 Visible = False object seTimeShow: TSpinEdit AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = gboxSlideShow AnchorSideRight.Control = gboxSlideShow AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 73 Height = 21 Top = 0 Width = 43 Anchors = [akTop, akRight] BorderSpacing.Right = 4 BorderSpacing.Bottom = 10 MinValue = 1 TabOrder = 0 Value = 1 end object cbSlideShow: TCheckBox AnchorSideTop.Control = seTimeShow AnchorSideTop.Side = asrCenter AnchorSideRight.Control = seTimeShow AnchorSideBottom.Side = asrBottom Left = 0 Height = 17 Top = 2 Width = 69 Anchors = [akTop, akRight] BorderSpacing.Top = 10 BorderSpacing.Right = 4 Caption = 'Slide Show' TabOrder = 1 end end object btnPrev: TSpeedButton Left = 49 Height = 48 Top = 1 Width = 32 Action = actLoadPrevFile Align = alLeft Glyph.Data = { 36090000424D3609000000000000360000002800000018000000180000000100 2000000000000009000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000383004F189514EB048A 008D000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000048200841D9819FB2CA92AFF048B 00BC000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000520005058501B5219E1EFE07A707FE18AF17FE048A 00BB000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000072001E0C8708DB1D9E1BFF01A701FF00B500FF16BE15FD0388 00B9000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000372004A10870DF1149413FE009E00FF00AF00FF00BF00FF13C712FD0384 00B7000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000026F 007D128310FA0B850BFE008F00FF009F00FF00B000FF00C000FF11C610FF0381 00B5000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000660004037100AE026C 00FE057005FE007D00FF008D00FF009C00FF00AB00FF00B800FF0EBB0DFF037D 00B3000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000006A001C076C05D510650FFF005A 00FF006900FF007900FF008700FF009500FF00A200FF00AC00FF0CAD0BFF017A 00B1000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000590018086406EE094B09FE004700FF0357 03FF076807FF057505FF018001FF008C00FF009600FF009E00FF08A008FF0176 00AF000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000005D00170B610AED316F31FE347434FF327E 32FF2E842EFF2D8C2DFF2B942BFF2A9A2AFF28A128FF26A426FF2CA62CFF0171 00AE000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000052001B045E03D02D722DFF4388 43FF408E40FF3D933DFF399739FF369B36FF329E32FF2FA12FFF319F31FF016D 00AC000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000260004005600A52671 25FE519651FE4F9B4FFF4B9E4BFF48A048FF44A244FF41A341FF3D9F3DFF0069 00AA000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000051 00711C671CFA5A9F5AFE5EA75EFF5AA85AFF57A857FF53A753FF499F49FF0061 00A9000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000004B0041105910EB5DA05DFE6CB16CFF69B169FF65AF65FF56A256FE005A 00A9000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000055001A085208D0579657FF7CBC7CFF78BA78FF65A765FD0052 00A9000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000260004004D00A4478447FE8AC78AFF71AE71FE004E 00A9000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000004C0070347234FA7AAF7AFF0451 04AA000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000004C0040115811E3447D 4493000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000010000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 ShowCaption = False end object btnNext: TSpeedButton Left = 81 Height = 48 Top = 1 Width = 32 Action = actLoadNextFile Align = alLeft Glyph.Data = { 36090000424D3609000000000000360000002800000018000000180000000100 2000000000000009000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000012950ED0169618D60078 0018000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000001F9C1BF31EA41DFF1492 0FEF047B00400000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000001B9C18F200AE00FF11AE 11FE199715FA027E007400000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000199C16F100C200FF00BD 00FF08B308FE1D9C1AFE037D00A8008000010000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000169B13EF00D600FF00CA 00FF00BA00FF01A901FF028E00FF0A8006D2006B001600000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000149911EF00D200FF00CA 00FF00BB00FF00AB00FF009A00FF129111FE0D7F0AEC046A003C000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000011930EEF00C300FF00BF 00FF00B400FF00A600FF009700FF008800FF0A7F0AFD0F7C0DF8026B006D0000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000E8D0CEE00B300FF00B1 00FF00A900FF009E00FF009100FF008300FF007400FF056905FE10720EFE0266 00A0008000010000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000B8709ED00A400FF00A2 00FF009C00FF009300FF028902FF067F06FF057105FF026102FF015101FF0D5E 0CFF046303BC0000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000188917ED23A723FF26A7 26FF28A428FF2BA12BFF2B9B2BFF2C922CFF2F8C2FFF338433FF377E37FF2770 27FF046003BA0000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000188418EC2DA22DFF30A3 30FF34A234FF37A037FF3A9C3AFF3D983DFF419441FF448D44FE217120FE0258 009B008000010000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000177C17EB3FA33FFF42A5 42FF46A546FF49A449FF4CA34CFF4FA04FFF4A964AFE166615F7005200650000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000177417EB51A751FF54A9 54FF58AB58FF5BAB5BFF5EAB5EFF4D964DFE0C5B0CE600500035000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000176C17EA63AE63FF67B1 67FF6AB36AFF6EB46EFF468B46FF025102C50045001300000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000186518EB75B875FF79BC 79FF7BBB7BFF387B38FE004D0098008000010000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000001A601AEB87C587FF80BC 80FE286B28F7004D006300000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000001C601CEC86B986FF165E 16E8004E00350000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000B550BC61E611EC80045 0013000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000001000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 ShowCaption = False end object btnCopyFile: TSpeedButton Left = 113 Height = 48 Hint = 'Copy' Top = 1 Width = 32 Align = alLeft Glyph.Data = { 36090000424D3609000000000000360000002800000018000000180000000100 2000000000000009000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000008A8F8DAE868B 89FF868B89FF858A88FF858A88FF858A88FF858A88FF858A88FF848A87FF848A 86FD858A88C3848A860A00000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000868B89FCF2F2 F2FFF2F2F2FFF1F1F1FFF0F0F0FFF1F1F1FFF4F4F4FFF7F7F7FFF6F6F6FF858A 86FFB9BBBAFF858A88FF868C8861000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000868B89FCF7F7 F7FFEAEAEAFFE9E9E9FFEDEEEEFFF1F1F1FFF1F1F1FFF3F3F3FFF4F4F4FF878D 89FFCFCFCFFFB4B5B4FF858A88FF8F9490920000000000000000000000000000 0000000000000000000000000000000000000000000000000000868B89FCFAFA FAFFEAEBEBFFEAEAEAFFE9EAEAFFECECECFFEFEFEFFFEFEFEFFFF1F1F1FF848A 86FFCFCFCFFFCFCFCFFFB9BBBAFF858A88FF858B876400000000000000008B90 8D57858A887F858A887F858A887F858A887F858A887F858A8883868B89FDFDFD FDFFEBECECFFEBEBEBFFEAEBEBFFEAEAEAFFECECECFFF0F0F0FFEEEEEEFF858A 88FF858A88FF858A88FF858A88FF858A88FF858A88CC0000000000000000858A 887EF2F2F27FF3F3F37FF1F1F17FF0F0F07FF1F1F17FEDEDED83878C8AFDFFFF FFFFECEDEDFFECECECFFEBECECFFEAEBEBFFEAEAEAFFEEEFEFFFF0F0F0FFEFEF EFFFF1F1F1FFF2F2F2FFF1F1F1FFBBBEBDFF868B89FC0000000000000000868B 897EF7F7F77FEAEAEA7FE9E9E97FE8E9E97FE8E8E87FE2E3E383878C8AFDFFFF FFFFEDEEEEFFEBECECFFEBEBEBFFEAEBEBFFEAEAEAFFE9EAEAFFECECECFFEFEF EFFFEDEDEDFFEFEFEFFFF2F2F2FFF7F7F7FF888D8BFC0000000000000000868B 897EFAFAFA7FEAEBEB7FEAEAEA7FE9EAEA7FE9E9E97FE1E2E283878C8AFDFFFF FFFFEEEFEFFFC5C5C5FFC5C5C5FFC4C5C5FFC4C4C4FFC3C4C4FFC3C3C3FFCDCD CDFFDCDCDCFFDCDCDCFFF2F2F2FFF9F9F9FF888D8BFC0000000000000000868B 897EFDFDFD7FEBECEC7FEBEBEB7FEAEBEB7FEAEAEA7FE2E3E383878C8AFDFFFF FFFFEFF0F0FFEEEFEFFFEEEEEEFFEDEEEEFFECEDEDFFECEDEDFFEBECECFFEBEB EBFFEFEFEFFFF2F2F2FFEFEFEFFFFCFCFCFF898E8CFC0000000000000000868B 897EFFFFFF7FECEDED7FC7C7C77FC6C7C77FC5C6C67FC1C1C183868B89FDFFFF FFFFEFF0F0FFC7C8C8FFC6C7C7FFC6C7C7FFC5C6C6FFC5C6C6FFC5C5C5FFC5C5 C5FFEDEEEEFFEDEDEDFFF4F4F4FFFEFEFEFF898E8CFC0000000000000000868B 897EFFFFFF7FEDEEEE7FECEDED7FECECEC7FEBECEC7FE4E5E483878C8AFDFFFF FFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEEEFEFFFEEEFEFFFEDEEEEFFEDED EDFFECEDEDFFEDEEEEFFEDEDEDFFFEFEFEFF898E8CFC0000000000000000868C 8A7EFFFFFF7FEEEFEF7FC8C9C97FC8C8C87FC7C8C87FC2C3C383868B89FDFFFF FFFFEFF0F0FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC5C6C6FFC5C5 C5FFC5C5C5FFC4C5C5FFEEEEEEFFFEFEFEFF898E8CFC0000000000000000868C 8A7EFFFFFF7FEFF0F07FEEEFEF7FEEEEEE7FEDEEEE7FE5E6E683878C8AFDFFFF FFFFEFF0F0FFEEEFEFFFEEEFEFFFEEEFEFFFEEEFEFFFEEEFEFFFEEEFEFFFEDEE EEFFEDEEEEFFECEDEDFFEDEDEDFFFEFEFEFF898E8CFC0000000000000000868C 8A7EFFFFFF7FEFF0F07FCACACA7FC9CACA7FC9CACA7FC3C5C583868B89FDFFFF FFFFEFF0F0FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7 C7FFC6C7C7FFC5C6C6FFEEEEEEFFFEFEFEFF898E8CFC0000000000000000868C 8A7EFFFFFF7FEFF0F07FEFF0F07FEFF0F07FEFF0F07FE7E8E883878C8AFDFFFF FFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFEFF0F0FFEFF0F0FFEEEFEFFFFEFEFEFF898E8CFC0000000000000000868C 8A7EFFFFFF7FEFF0F07FCACACA7FCACACA7FCACACA7FC5C6C583868B89FDFFFF FFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFEFF0F0FFEFF0F0FFEFF0F0FFFEFEFEFF898E8CFC0000000000000000868C 8A7EFFFFFF7FEFF0F07FEFF0F07FEFF0F07FEFF0F07FE8E9E983868B89FEFFFF FFFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFFFF898E8CFD0000000000000000868C 8A7EFFFFFF7FEFF0F07FCACACA7FCACACA7FCACACA7FC9C9C980959997DA898E 8CFE898E8CFD898E8CFD898E8CFD8A8E8CFD8A8F8DFD898E8CFD898E8CFC898E 8CFC898E8CFC898E8CFC898E8CFC898E8CFD8A8F8DB40000000000000000868C 8A7EFFFFFF7FEFF0F07FEFF0F07FEFF0F07FEFF0F07FEFF0F07FEEEFEF80E8E9 E983E8E9E983E8E9E983E8E9E983E7E8E883F6F6F6838D919082000000000000 000000000000000000000000000000000000000000000000000000000000868C 8A7EFFFFFF7FEFF0F07FEFF0F07FEFF0F07FEFF0F07FEFF0F07FEFF0F07FEFF0 F07FEFF0F07FEFF0F07FEFF0F07FEFF0F07FFEFEFE7F8E92917E000000000000 000000000000000000000000000000000000000000000000000000000000858A 887EFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7F8D91907E000000000000 0000000000000000000000000000000000000000000000000000000000008B90 8D57898E8C7F898E8C7F898E8C7F898E8C7F898E8C7F898E8C7F898E8C7F898E 8C7F898E8C7F898E8C7F898E8C7F898E8C7F898E8C7F8B908D57000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 OnClick = btnCopyMoveFileClick end object btnMoveFile: TSpeedButton Left = 145 Height = 48 Hint = 'Move' Top = 1 Width = 32 Align = alLeft Glyph.Data = { 36090000424D3609000000000000360000002800000018000000180000000100 2000000000000009000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000010000000200000004000000060000000A0000000F0000 001000000010000000100000001200000013000000110000000D0000000A0000 0006000000030000000300000002000000000000000000000000000000000000 000000000003000000070808AC7D0707AEC00606ACC10505937D0000002B0000 002E0000002C0000002C00000030000000300000002C04048F810606A9C40707 ADC10808A6810000000D00000009000000040000000100000000000000000000 0001000000040C0CB58A1212C5FF1A1AD8FF1818D0FF0A0AB6FF0808A0AF0000 00390000003700000036000000390000003908089FB00A0AB6FF1818D0FF1A1A D8FF1212C5FF0C0CAD9000000010000000070000000200000000000000000000 0000000000020808AFE82121E1FF1515CCFB1111C7FF2323E3FF0909B2EA0404 948E0000002500000024000000240404958D0909B3E92323E3FF1111C7FF1515 CCFB2121E1FF0808AFE800000009000000040000000100000000000000000000 0000000000000C0DAECC2929EFFF0D0DBEFB020299480707B1EA2222E2FF0808 B3E40000000A00000008000000070808B3E42222E2FF0707B1EA020299480D0D BEFB2929EFFF0B0CADCD00000001000000000000000000000000000000000000 0000000000001112AEA82525E7FF1313C9FF0505AE960303AA831C1CD7FF0707 B1FF0000A257000000000000A4560707B1FF1C1CD7FF0303AA830505AE961313 C9FF2525E7FF1112AEA800000000000000000000000000000000000000000000 0000000000001B1CAE440505ADDF1E1EDCFF1111C4EC0606B0EE1717CEFF1515 CBFF0000A4875558AE990000A4871515CBFF1717CEFF0606B0EE1111C4EC1E1E DCFF0505ADDF1B1CAE4400000000000000000000000000000000000000000000 000000000000000000000606B0680909B5E61A1AD4FF1F1FDCFF2121E1FF2121 E1FF0303AAFE0303AAFF0303AAFE2121E1FF2121E1FF1F1FDCFF1A1AD4FF0909 B5E60606B0680000000000000000000000000000000000000000000000000000 00000000000000000000000000000000A4200808B3A10909B5F60505AEFE3031 DAFF393AC7FF0303AAFF393AC7FF3031DAFF0505AEFE0909B5F60808B3A10000 A420000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000606B0816B6F 94FFB1B3B6FF00000000B1B3B6FF6B6F94FF0606B08100000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000858A88878B8F 9BFFE2E2E2FFD8D8D8FFBEC0BFFF9295A9FF0000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000858A881F878C8AFCDEE0 DFFFDADADAFFD8D8D8FFB1B4B3FFBABCBAFF989C9BD500000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000858A88C0ABAEADFDDFDF DFFFDBDBDBFFAFB2B0FFBDBFBEFFDCDCDCFF959997FF858A883C000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000858A8857878C8AFFE9EAEAFFDCDC DCFFD6D6D6FFA7ABA9FFC1C3C1FFDBDBDBFFDDDEDEFF929795F9000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000858A88EFC0C3C2FEE0E0E0FFDDDD DDFF9A9E9DFF9A9E9C90A2A5A4FFDCDCDCFFDCDCDCFFB0B2B1FF909593A80000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000858A889C8D9290FEEBEBEBFFDFDFDFFFC8C9 C9FFA8ABAAD900000000919694F1D3D5D4FFDDDDDDFFE2E2E2FF898E8CFF858A 881F000000000000000000000000000000000000000000000000000000000000 00000000000000000000858A881F858A88FEDFE0E0FFE0E0E0FFE0E0E0FF959A 98FF0000000000000000858A883C8F9492FFE1E1E1FFDEDEDEFFCBCCCBFF8F93 91EF000000000000000000000000000000000000000000000000000000000000 00000000000000000000858A88CF9A9E9DFDE8E8E8FFE1E1E1FFB1B3B2FFA2A6 A4BE000000000000000000000000929795CFC3C6C5FFDFDFDFFFE2E2E2FF959A 98FF858A88700000000000000000000000000000000000000000000000000000 000000000000000000008C918FF5EBEBEBFFE2E2E2FFDCDDDCFF989C9BFC0000 0000000000000000000000000000858A881F898E8CFFE2E3E3FFE0E0E0FFD8D9 D8FF929795F90000000000000000000000000000000000000000000000000000 00000000000000000000909593DAD6D8D7FFE2E2E2FF9C9F9FFF989C9B810000 000000000000000000000000000000000000909593A8A8ACABFFE3E3E3FFD0D1 D0FF9DA1A0DC0000000000000000000000000000000000000000000000000000 00000000000000000000858A88708E9391FEC1C4C2FF999D9CF7000000000000 000000000000000000000000000000000000000000008D9290FBD1D3D2FF9094 92FF858A88AF0000000000000000000000000000000000000000000000000000 00000000000000000000000000008C918FC78A8F8DFF858A883C000000000000 00000000000000000000000000000000000000000000858A8870858A88FF8E92 90E4000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 OnClick = btnCopyMoveFileClick end object btnDeleteFile: TSpeedButton Left = 177 Height = 48 Hint = 'Delete' Top = 1 Width = 32 Align = alLeft Glyph.Data = { 36090000424D3609000000000000360000002800000018000000180000000100 2000000000000009000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000972000009BC000009720000000000000 0000000000000000000000000000000000000000000000000000000097200000 9BC0000097200000000000000000000000000000000000000000000000000000 0000000000000000000000009F2001019DE02E2EB4FF05059FE000009F200000 0000000000000000000000000000000000000000000000009F2000009DE02525 B3FF01019EE100009F2000000000000000000000000000000000000000000000 00000000000000009F200101A1E03E3EBFFF2424C1FF4242C5FF0303A2E00000 9F200000000000000000000000000000000000009F200000A1E03838C4FF2C2C C9FF4242C4FF0101A2E100009F20000000000000000000000000000000000000 000000009F200101A3E04242C0FF1A1ABEFF0808C0FF1313C9FF4343CCFF0303 A4E000009F20000000000000000000009F200000A3E03A3ACBFF1C1CD1FF0707 C6FF1717C4FF4444C5FF0101A4E000009F200000000000000000000000000000 00000000A6C02525B5FF3232C3FF0808BEFF0707C4FF0606CCFF1313D4FF4444 D3FF0202A7E00000A7200000A7200101A6E03F3FD2FF1C1CDCFF0606D2FF0606 CCFF0707C4FF2424C5FF3636BDFF0000A6C00000000000000000000000000000 00000000A7200000A8E03D3DC4FF1F1FC7FF0606C8FF0606CFFF0505D7FF1414 E0FF4444D9FF0202A9E00101A8E04242D9FF1A1AE7FF0404DEFF0505D7FF0606 CFFF1313CBFF4848CBFF0505AAE00000A7200000000000000000000000000000 0000000000000000A7200000ABE03F3FCCFF1D1DD0FF0606D2FF0404DAFF0303 E1FF1414EAFF4545DFFF4444DFFF1818F1FF0202E8FF0303E1FF0404DAFF1515 D5FF4B4BD3FF0303ADE10000A720000000000000000000000000000000000000 000000000000000000000000AF200000AFE14343D2FF1C1CD8FF0404DCFF0303 E3FF0202E9FF1313F1FF1414F4FF0101F0FF0202E9FF0303E3FF1414DEFF4C4C DAFF0303B1E10000AF2000000000000000000000000000000000000000000000 00000000000000000000000000000000AF200000B1E14545D8FF1818DEFF0303 E1FF0202E7FF0202EBFF0101EDFF0202EBFF0202E7FF1515E3FF4D4DDFFF0303 B2E10000AF200000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000AF200101B4E14B4BDEFF4646 E6FF5858EDFF6162F0FF6465F1FF6666EFFF6C6CEEFF8080EAFF0303B6E20000 AF20000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000B7200606B9E19899EBFF7D7E EDFF5D5EE9FF5555EAFF4E4EEAFF4748E9FF5151E8FF9191ECFF0707B9E20000 B720000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000B7200202BAE09495E9FF8082E9FF696B E8FF6465E8FF5B5CEAFF5555E7FF4F4FE7FF4748E4FF5555E4FF8B8BE7FF0404 BCE10000B7200000000000000000000000000000000000000000000000000000 000000000000000000000000BF200101BBE08F8FE4FF8C8EEAFF797AE7FF7273 E6FF6A6CE7FF7374E9FF6E6EE8FF5656E3FF5050E1FF4849DFFF5556DFFF8484 E2FF0202BCE10000BF2000000000000000000000000000000000000000000000 0000000000000000BF200000BFE08989E0FF989AE9FF8687E7FF7F81E6FF797A E7FF7F81E7FF8B8BE7FF8585E5FF6F6FE5FF5757DFFF5050DDFF4949D9FF5758 D9FF7C7CDDFF0101BFE10000BF20000000000000000000000000000000000000 00000000BF200000C2E08182DEFFA3A4EBFF9596E8FF8E8FE7FF8687E6FF898B E8FF8B8BE5FF0303C4E00202C3E08282E4FF6F6FE1FF5757DAFF5050D8FF4949 D3FF595AD4FF7676D9FF0202C0E10000BF200000000000000000000000000000 00000000C5C0B6B6EDFFB3B5EEFFA1A3EAFF9B9CE8FF9596E8FF9596E8FF8B8C E5FF0404C6E00000C7200000C7200303C5E08182E1FF6D6DDDFF5858D6FF5252 D2FF4A4ACDFF6D6ED4FF5353D2FF0000C5C00000000000000000000000000000 00000000C7202A2ACDE4ABACEFFFAEB0EEFFA1A3EAFFA1A3E9FF8C8CE2FF0606 C4E00000C72000000000000000000000C7200303C5E07F7FDFFF6B6CDAFF5959 D1FF6666D3FF7D7EDEFF0808C6E10000C7200000000000000000000000000000 0000000000000000C7201212C8E2A9ABEDFFB3B4EFFF8C8CE1FF0505C4E00000 C720000000000000000000000000000000000000C7200505C5E07D7EDEFF7E7F DBFF8081DDFF0606C6E10000C720000000000000000000000000000000000000 000000000000000000000000C7201D1DCAE3C3C3F1FF0606C4E10000C7200000 000000000000000000000000000000000000000000000000C7200505C5E0AAAB EAFF2525CCE30000C72000000000000000000000000000000000000000000000 00000000000000000000000000000000C7200000C5C00000C720000000000000 00000000000000000000000000000000000000000000000000000000C7200000 C5C00000C7200000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 OnClick = btnDeleteFileClick end end end object Splitter: TSplitter[4] Left = 170 Height = 437 Top = 0 Width = 9 AutoSnap = False MinSize = 160 OnChangeBounds = SplitterChangeBounds Visible = False end object pnlPreview: TPanel[5] Left = 0 Height = 437 Top = 0 Width = 170 Align = alLeft BevelOuter = bvNone ClientHeight = 437 ClientWidth = 170 TabOrder = 5 Visible = False object pnlEditFile: TPanel Left = 0 Height = 30 Top = 0 Width = 170 Align = alTop Alignment = taLeftJustify ClientHeight = 30 ClientWidth = 170 TabOrder = 0 object btnReload1: TSpeedButton AnchorSideBottom.Control = btnPrev1 Left = 1 Height = 28 Top = 1 Width = 32 Action = actReload Align = alLeft Glyph.Data = { 36090000424D3609000000000000360000002800000018000000180000000100 2000000000000009000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000005B0007004E006C0050 01AB095E12DB015B01F5005D00F7095F11E2015102BA004F007F004A00110000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000050004C075D0DEB076B0DFF0A92 30FF15B125FF0AD113FF06E60BFF0DD317FF17B12CFF06790BFF05580AEE004E 006D004E00090000000000000000000000000000000000000000000000000000 00000000000000000000004E0009015002BB0B6515FD159227FF18A72DFF1AB1 31FF14C226FF0FD11DFF0CDA17FF0CDA17FF0FD11DFF14C226FF21AD3EFF1274 22F2005001C2004A001B00000000000000000000000000000000000000000000 00000000000000000000025003B80F721DFF0A9513FF0F9D1DFF15A427FF1AAA 31FF18B52FFF15C027FF12C723FF12C723FF14C027FF18B52EFF1AAA32F016A5 2ACD137923C0004F00A700550008000000000000000000000000000000000000 0000000000000051005C085B0FFE028D05FF07940DFF0C9A17FF119F20FF16A5 29FF19A931FF1BAE33FF19B330FF19B330FF1AAE33FF1AA931EF16A529D1119F 21AD0F9C1C8D0B68139B00540030000000000000000000000000000000000000 0000004D000F045108F505750AFF008C01FF049108FF08950FFF0D9A18FF17A2 2AFF0D7B19FF0B6A14FD0A6413FD0D7019FF189F2EEB14A326D3119F20B10D9A 1890089510730B95155809651137000000000000000000000000000000000000 00000255057B06530CFF007000FF008100FF018D02FF049109FF0F8E1CFF075F 0EF00253048F004C0041004E003B02500474045208D70D8019B00B99167E0895 0F6305910949018D02350D731824046A07020000000000000000000000000000 0000035306C1045109FF006300FF007300FF008300FF068E0AFF05590AF5004D 014F00000000000000000000000000000000004C0026025004B106880B490490 0730018D02230083001709770F0D05620B020000000000000000000000000000 0000045108E8014D01FF005500FF006400FF007300FF06660CFF015103AB0000 00000000000000000000000000000000000000000000004E01290A6211160263 040F02540609044F07050A5B140100000000000000000000000000000000004D 0001054D07F9085508FF0B570BFF0A5D0AFF006200FF055207FE014F015A0000 0000000000000000000000000000000000000000000000000000065210050957 1303000000000000000000000000000000000000000000000000000000000000 0000065108FB267026FF287228FF277127FF005000FF034B06FE014D015A0000 00000000000000000000004D0004125E1BEC025C03FF045C04FF045B05FF0459 06FF015503FF025304FF025405FF07600DA90000000000000000000000000000 000008550CE62B752BFF357E35FF357E35FF085408FF034B06FF035306870000 00000000000000000000004D0008024E04D1028004FF13C813FF2DC72DFF35BD 35FF34AF34FF249824FF127B12FF055A08FF0000000000000000000000000000 0000095B10BE266E27FF418A41FF418A41FF266F26FF014C01FF045107F30351 0311000000000000000000000000004D0033034F07E2027704FF019601FF20A1 20FF41AD41FF41A641FF419D41FF0B5F0EFF0000000000000000000000000000 000007610F7D1C641DFF4F964FFF4F964FFF4F964FFF166016FF014E03FF044F 08F30758105900802B030064140605540A6B034D05F7016A02FF017A01FF3CA2 3CFF4FAB4FFF4FA64FFF4FA24FFF0C610FFF0000000000000000000000000000 00000057000A09560BF4498F49FF5BA15BFF5BA15BFF549A54FF1B641BFF014D 01FF024C03FF024B04FE044C06FE024C03FF015401FF086508FF3F963FFF5BAC 5BFF5BAB5BFF5BA95BFF5BA75BFF0D610FFF0000000000000000000000000000 000000000000045C0852155F17FE66AA66FF68AD68FF68AD68FF69AE69FF468B 46FF226A22FF085408FF045004FF176017FF307930FF5FA75FFF68B068FF68B0 68FF68B068FF68AF68FF68AF68FF0E6210FF0000000000000000000000000000 00000000000000000000035A06BB337933FF70B570FF74B974FF74B974FF74B9 74FF74B974FF77BA77FF75B875FF74B974FF74B974FF74B974FF74B974FF76BA 76FF61A361FF539A55FF75B975FF0F6311FF0000000000000000000000000000 0000000000000000000000540007035D05B71C691DFE65A865FF81C581FF81C5 81FF81C581FF81C581FF81C581FF81C581FF81C581FF81C581FF80BF80FF367E 38FE025703D5015903D7479147FF116612FF0000000000000000000000000000 0000000000000000000000000000000000000060024D0E620EF1347C34FF5799 57FF74B474FF7FC47FFF84C984FF80BF80FF6EAA6EFF4A8E4AFF0D5E0DF40056 018C004D0010004D001F005C01B8458E45E60000000000000000000000000000 00000000000000000000000000000000000000000000006000080063007A0160 01B5216F21E6337633FD347634FE2D732DEF166816CA015C0194005000290000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 ShowCaption = False end object btnPrev1: TSpeedButton Left = 33 Height = 28 Top = 1 Width = 24 Action = actLoadPrevFile Align = alLeft Glyph.Data = { 36090000424D3609000000000000360000002800000018000000180000000100 2000000000000009000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000383004F189514EB048A 008D000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000048200841D9819FB2CA92AFF048B 00BC000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000520005058501B5219E1EFE07A707FE18AF17FE048A 00BB000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000072001E0C8708DB1D9E1BFF01A701FF00B500FF16BE15FD0388 00B9000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000372004A10870DF1149413FE009E00FF00AF00FF00BF00FF13C712FD0384 00B7000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000026F 007D128310FA0B850BFE008F00FF009F00FF00B000FF00C000FF11C610FF0381 00B5000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000660004037100AE026C 00FE057005FE007D00FF008D00FF009C00FF00AB00FF00B800FF0EBB0DFF037D 00B3000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000006A001C076C05D510650FFF005A 00FF006900FF007900FF008700FF009500FF00A200FF00AC00FF0CAD0BFF017A 00B1000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000590018086406EE094B09FE004700FF0357 03FF076807FF057505FF018001FF008C00FF009600FF009E00FF08A008FF0176 00AF000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000005D00170B610AED316F31FE347434FF327E 32FF2E842EFF2D8C2DFF2B942BFF2A9A2AFF28A128FF26A426FF2CA62CFF0171 00AE000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000052001B045E03D02D722DFF4388 43FF408E40FF3D933DFF399739FF369B36FF329E32FF2FA12FFF319F31FF016D 00AC000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000260004005600A52671 25FE519651FE4F9B4FFF4B9E4BFF48A048FF44A244FF41A341FF3D9F3DFF0069 00AA000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000051 00711C671CFA5A9F5AFE5EA75EFF5AA85AFF57A857FF53A753FF499F49FF0061 00A9000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000004B0041105910EB5DA05DFE6CB16CFF69B169FF65AF65FF56A256FE005A 00A9000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000055001A085208D0579657FF7CBC7CFF78BA78FF65A765FD0052 00A9000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000260004004D00A4478447FE8AC78AFF71AE71FE004E 00A9000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000004C0070347234FA7AAF7AFF0451 04AA000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000004C0040115811E3447D 4493000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000010000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 ShowCaption = False end object btnNext1: TSpeedButton Left = 57 Height = 28 Top = 1 Width = 24 Action = actLoadNextFile Align = alLeft Glyph.Data = { 36090000424D3609000000000000360000002800000018000000180000000100 2000000000000009000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000012950ED0169618D60078 0018000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000001F9C1BF31EA41DFF1492 0FEF047B00400000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000001B9C18F200AE00FF11AE 11FE199715FA027E007400000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000199C16F100C200FF00BD 00FF08B308FE1D9C1AFE037D00A8008000010000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000169B13EF00D600FF00CA 00FF00BA00FF01A901FF028E00FF0A8006D2006B001600000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000149911EF00D200FF00CA 00FF00BB00FF00AB00FF009A00FF129111FE0D7F0AEC046A003C000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000011930EEF00C300FF00BF 00FF00B400FF00A600FF009700FF008800FF0A7F0AFD0F7C0DF8026B006D0000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000E8D0CEE00B300FF00B1 00FF00A900FF009E00FF009100FF008300FF007400FF056905FE10720EFE0266 00A0008000010000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000B8709ED00A400FF00A2 00FF009C00FF009300FF028902FF067F06FF057105FF026102FF015101FF0D5E 0CFF046303BC0000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000188917ED23A723FF26A7 26FF28A428FF2BA12BFF2B9B2BFF2C922CFF2F8C2FFF338433FF377E37FF2770 27FF046003BA0000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000188418EC2DA22DFF30A3 30FF34A234FF37A037FF3A9C3AFF3D983DFF419441FF448D44FE217120FE0258 009B008000010000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000177C17EB3FA33FFF42A5 42FF46A546FF49A449FF4CA34CFF4FA04FFF4A964AFE166615F7005200650000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000177417EB51A751FF54A9 54FF58AB58FF5BAB5BFF5EAB5EFF4D964DFE0C5B0CE600500035000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000176C17EA63AE63FF67B1 67FF6AB36AFF6EB46EFF468B46FF025102C50045001300000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000186518EB75B875FF79BC 79FF7BBB7BFF387B38FE004D0098008000010000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000001A601AEB87C587FF80BC 80FE286B28F7004D006300000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000001C601CEC86B986FF165E 16E8004E00350000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000B550BC61E611EC80045 0013000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000001000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 ShowCaption = False end object btnCopyFile1: TSpeedButton Left = 81 Height = 28 Hint = 'Copy' Top = 1 Width = 32 Align = alLeft Glyph.Data = { 36090000424D3609000000000000360000002800000018000000180000000100 2000000000000009000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000008A8F8DAE868B 89FF868B89FF858A88FF858A88FF858A88FF858A88FF858A88FF848A87FF848A 86FD858A88C3848A860A00000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000868B89FCF2F2 F2FFF2F2F2FFF1F1F1FFF0F0F0FFF1F1F1FFF4F4F4FFF7F7F7FFF6F6F6FF858A 86FFB9BBBAFF858A88FF868C8861000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000868B89FCF7F7 F7FFEAEAEAFFE9E9E9FFEDEEEEFFF1F1F1FFF1F1F1FFF3F3F3FFF4F4F4FF878D 89FFCFCFCFFFB4B5B4FF858A88FF8F9490920000000000000000000000000000 0000000000000000000000000000000000000000000000000000868B89FCFAFA FAFFEAEBEBFFEAEAEAFFE9EAEAFFECECECFFEFEFEFFFEFEFEFFFF1F1F1FF848A 86FFCFCFCFFFCFCFCFFFB9BBBAFF858A88FF858B876400000000000000008B90 8D57858A887F858A887F858A887F858A887F858A887F858A8883868B89FDFDFD FDFFEBECECFFEBEBEBFFEAEBEBFFEAEAEAFFECECECFFF0F0F0FFEEEEEEFF858A 88FF858A88FF858A88FF858A88FF858A88FF858A88CC0000000000000000858A 887EF2F2F27FF3F3F37FF1F1F17FF0F0F07FF1F1F17FEDEDED83878C8AFDFFFF FFFFECEDEDFFECECECFFEBECECFFEAEBEBFFEAEAEAFFEEEFEFFFF0F0F0FFEFEF EFFFF1F1F1FFF2F2F2FFF1F1F1FFBBBEBDFF868B89FC0000000000000000868B 897EF7F7F77FEAEAEA7FE9E9E97FE8E9E97FE8E8E87FE2E3E383878C8AFDFFFF FFFFEDEEEEFFEBECECFFEBEBEBFFEAEBEBFFEAEAEAFFE9EAEAFFECECECFFEFEF EFFFEDEDEDFFEFEFEFFFF2F2F2FFF7F7F7FF888D8BFC0000000000000000868B 897EFAFAFA7FEAEBEB7FEAEAEA7FE9EAEA7FE9E9E97FE1E2E283878C8AFDFFFF FFFFEEEFEFFFC5C5C5FFC5C5C5FFC4C5C5FFC4C4C4FFC3C4C4FFC3C3C3FFCDCD CDFFDCDCDCFFDCDCDCFFF2F2F2FFF9F9F9FF888D8BFC0000000000000000868B 897EFDFDFD7FEBECEC7FEBEBEB7FEAEBEB7FEAEAEA7FE2E3E383878C8AFDFFFF FFFFEFF0F0FFEEEFEFFFEEEEEEFFEDEEEEFFECEDEDFFECEDEDFFEBECECFFEBEB EBFFEFEFEFFFF2F2F2FFEFEFEFFFFCFCFCFF898E8CFC0000000000000000868B 897EFFFFFF7FECEDED7FC7C7C77FC6C7C77FC5C6C67FC1C1C183868B89FDFFFF FFFFEFF0F0FFC7C8C8FFC6C7C7FFC6C7C7FFC5C6C6FFC5C6C6FFC5C5C5FFC5C5 C5FFEDEEEEFFEDEDEDFFF4F4F4FFFEFEFEFF898E8CFC0000000000000000868B 897EFFFFFF7FEDEEEE7FECEDED7FECECEC7FEBECEC7FE4E5E483878C8AFDFFFF FFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEEEFEFFFEEEFEFFFEDEEEEFFEDED EDFFECEDEDFFEDEEEEFFEDEDEDFFFEFEFEFF898E8CFC0000000000000000868C 8A7EFFFFFF7FEEEFEF7FC8C9C97FC8C8C87FC7C8C87FC2C3C383868B89FDFFFF FFFFEFF0F0FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC5C6C6FFC5C5 C5FFC5C5C5FFC4C5C5FFEEEEEEFFFEFEFEFF898E8CFC0000000000000000868C 8A7EFFFFFF7FEFF0F07FEEEFEF7FEEEEEE7FEDEEEE7FE5E6E683878C8AFDFFFF FFFFEFF0F0FFEEEFEFFFEEEFEFFFEEEFEFFFEEEFEFFFEEEFEFFFEEEFEFFFEDEE EEFFEDEEEEFFECEDEDFFEDEDEDFFFEFEFEFF898E8CFC0000000000000000868C 8A7EFFFFFF7FEFF0F07FCACACA7FC9CACA7FC9CACA7FC3C5C583868B89FDFFFF FFFFEFF0F0FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7 C7FFC6C7C7FFC5C6C6FFEEEEEEFFFEFEFEFF898E8CFC0000000000000000868C 8A7EFFFFFF7FEFF0F07FEFF0F07FEFF0F07FEFF0F07FE7E8E883878C8AFDFFFF FFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFEFF0F0FFEFF0F0FFEEEFEFFFFEFEFEFF898E8CFC0000000000000000868C 8A7EFFFFFF7FEFF0F07FCACACA7FCACACA7FCACACA7FC5C6C583868B89FDFFFF FFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFEFF0F0FFEFF0F0FFEFF0F0FFFEFEFEFF898E8CFC0000000000000000868C 8A7EFFFFFF7FEFF0F07FEFF0F07FEFF0F07FEFF0F07FE8E9E983868B89FEFFFF FFFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFFFF898E8CFD0000000000000000868C 8A7EFFFFFF7FEFF0F07FCACACA7FCACACA7FCACACA7FC9C9C980959997DA898E 8CFE898E8CFD898E8CFD898E8CFD8A8E8CFD8A8F8DFD898E8CFD898E8CFC898E 8CFC898E8CFC898E8CFC898E8CFC898E8CFD8A8F8DB40000000000000000868C 8A7EFFFFFF7FEFF0F07FEFF0F07FEFF0F07FEFF0F07FEFF0F07FEEEFEF80E8E9 E983E8E9E983E8E9E983E8E9E983E7E8E883F6F6F6838D919082000000000000 000000000000000000000000000000000000000000000000000000000000868C 8A7EFFFFFF7FEFF0F07FEFF0F07FEFF0F07FEFF0F07FEFF0F07FEFF0F07FEFF0 F07FEFF0F07FEFF0F07FEFF0F07FEFF0F07FFEFEFE7F8E92917E000000000000 000000000000000000000000000000000000000000000000000000000000858A 887EFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7F8D91907E000000000000 0000000000000000000000000000000000000000000000000000000000008B90 8D57898E8C7F898E8C7F898E8C7F898E8C7F898E8C7F898E8C7F898E8C7F898E 8C7F898E8C7F898E8C7F898E8C7F898E8C7F898E8C7F8B908D57000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 OnClick = btnCopyMoveFileClick end object btnMoveFile1: TSpeedButton Left = 145 Height = 28 Hint = 'Move' Top = 1 Width = 31 Align = alLeft Glyph.Data = { 36090000424D3609000000000000360000002800000018000000180000000100 2000000000000009000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000010000000200000004000000060000000A0000000F0000 001000000010000000100000001200000013000000110000000D0000000A0000 0006000000030000000300000002000000000000000000000000000000000000 000000000003000000070808AC7D0707AEC00606ACC10505937D0000002B0000 002E0000002C0000002C00000030000000300000002C04048F810606A9C40707 ADC10808A6810000000D00000009000000040000000100000000000000000000 0001000000040C0CB58A1212C5FF1A1AD8FF1818D0FF0A0AB6FF0808A0AF0000 00390000003700000036000000390000003908089FB00A0AB6FF1818D0FF1A1A D8FF1212C5FF0C0CAD9000000010000000070000000200000000000000000000 0000000000020808AFE82121E1FF1515CCFB1111C7FF2323E3FF0909B2EA0404 948E0000002500000024000000240404958D0909B3E92323E3FF1111C7FF1515 CCFB2121E1FF0808AFE800000009000000040000000100000000000000000000 0000000000000C0DAECC2929EFFF0D0DBEFB020299480707B1EA2222E2FF0808 B3E40000000A00000008000000070808B3E42222E2FF0707B1EA020299480D0D BEFB2929EFFF0B0CADCD00000001000000000000000000000000000000000000 0000000000001112AEA82525E7FF1313C9FF0505AE960303AA831C1CD7FF0707 B1FF0000A257000000000000A4560707B1FF1C1CD7FF0303AA830505AE961313 C9FF2525E7FF1112AEA800000000000000000000000000000000000000000000 0000000000001B1CAE440505ADDF1E1EDCFF1111C4EC0606B0EE1717CEFF1515 CBFF0000A4875558AE990000A4871515CBFF1717CEFF0606B0EE1111C4EC1E1E DCFF0505ADDF1B1CAE4400000000000000000000000000000000000000000000 000000000000000000000606B0680909B5E61A1AD4FF1F1FDCFF2121E1FF2121 E1FF0303AAFE0303AAFF0303AAFE2121E1FF2121E1FF1F1FDCFF1A1AD4FF0909 B5E60606B0680000000000000000000000000000000000000000000000000000 00000000000000000000000000000000A4200808B3A10909B5F60505AEFE3031 DAFF393AC7FF0303AAFF393AC7FF3031DAFF0505AEFE0909B5F60808B3A10000 A420000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000606B0816B6F 94FFB1B3B6FF00000000B1B3B6FF6B6F94FF0606B08100000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000858A88878B8F 9BFFE2E2E2FFD8D8D8FFBEC0BFFF9295A9FF0000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000858A881F878C8AFCDEE0 DFFFDADADAFFD8D8D8FFB1B4B3FFBABCBAFF989C9BD500000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000858A88C0ABAEADFDDFDF DFFFDBDBDBFFAFB2B0FFBDBFBEFFDCDCDCFF959997FF858A883C000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000858A8857878C8AFFE9EAEAFFDCDC DCFFD6D6D6FFA7ABA9FFC1C3C1FFDBDBDBFFDDDEDEFF929795F9000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000858A88EFC0C3C2FEE0E0E0FFDDDD DDFF9A9E9DFF9A9E9C90A2A5A4FFDCDCDCFFDCDCDCFFB0B2B1FF909593A80000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000858A889C8D9290FEEBEBEBFFDFDFDFFFC8C9 C9FFA8ABAAD900000000919694F1D3D5D4FFDDDDDDFFE2E2E2FF898E8CFF858A 881F000000000000000000000000000000000000000000000000000000000000 00000000000000000000858A881F858A88FEDFE0E0FFE0E0E0FFE0E0E0FF959A 98FF0000000000000000858A883C8F9492FFE1E1E1FFDEDEDEFFCBCCCBFF8F93 91EF000000000000000000000000000000000000000000000000000000000000 00000000000000000000858A88CF9A9E9DFDE8E8E8FFE1E1E1FFB1B3B2FFA2A6 A4BE000000000000000000000000929795CFC3C6C5FFDFDFDFFFE2E2E2FF959A 98FF858A88700000000000000000000000000000000000000000000000000000 000000000000000000008C918FF5EBEBEBFFE2E2E2FFDCDDDCFF989C9BFC0000 0000000000000000000000000000858A881F898E8CFFE2E3E3FFE0E0E0FFD8D9 D8FF929795F90000000000000000000000000000000000000000000000000000 00000000000000000000909593DAD6D8D7FFE2E2E2FF9C9F9FFF989C9B810000 000000000000000000000000000000000000909593A8A8ACABFFE3E3E3FFD0D1 D0FF9DA1A0DC0000000000000000000000000000000000000000000000000000 00000000000000000000858A88708E9391FEC1C4C2FF999D9CF7000000000000 000000000000000000000000000000000000000000008D9290FBD1D3D2FF9094 92FF858A88AF0000000000000000000000000000000000000000000000000000 00000000000000000000000000008C918FC78A8F8DFF858A883C000000000000 00000000000000000000000000000000000000000000858A8870858A88FF8E92 90E4000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 OnClick = btnCopyMoveFileClick end object btnDeleteFile1: TSpeedButton Left = 113 Height = 28 Hint = 'Delete' Top = 1 Width = 32 Align = alLeft Glyph.Data = { 36090000424D3609000000000000360000002800000018000000180000000100 2000000000000009000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000972000009BC000009720000000000000 0000000000000000000000000000000000000000000000000000000097200000 9BC0000097200000000000000000000000000000000000000000000000000000 0000000000000000000000009F2001019DE02E2EB4FF05059FE000009F200000 0000000000000000000000000000000000000000000000009F2000009DE02525 B3FF01019EE100009F2000000000000000000000000000000000000000000000 00000000000000009F200101A1E03E3EBFFF2424C1FF4242C5FF0303A2E00000 9F200000000000000000000000000000000000009F200000A1E03838C4FF2C2C C9FF4242C4FF0101A2E100009F20000000000000000000000000000000000000 000000009F200101A3E04242C0FF1A1ABEFF0808C0FF1313C9FF4343CCFF0303 A4E000009F20000000000000000000009F200000A3E03A3ACBFF1C1CD1FF0707 C6FF1717C4FF4444C5FF0101A4E000009F200000000000000000000000000000 00000000A6C02525B5FF3232C3FF0808BEFF0707C4FF0606CCFF1313D4FF4444 D3FF0202A7E00000A7200000A7200101A6E03F3FD2FF1C1CDCFF0606D2FF0606 CCFF0707C4FF2424C5FF3636BDFF0000A6C00000000000000000000000000000 00000000A7200000A8E03D3DC4FF1F1FC7FF0606C8FF0606CFFF0505D7FF1414 E0FF4444D9FF0202A9E00101A8E04242D9FF1A1AE7FF0404DEFF0505D7FF0606 CFFF1313CBFF4848CBFF0505AAE00000A7200000000000000000000000000000 0000000000000000A7200000ABE03F3FCCFF1D1DD0FF0606D2FF0404DAFF0303 E1FF1414EAFF4545DFFF4444DFFF1818F1FF0202E8FF0303E1FF0404DAFF1515 D5FF4B4BD3FF0303ADE10000A720000000000000000000000000000000000000 000000000000000000000000AF200000AFE14343D2FF1C1CD8FF0404DCFF0303 E3FF0202E9FF1313F1FF1414F4FF0101F0FF0202E9FF0303E3FF1414DEFF4C4C DAFF0303B1E10000AF2000000000000000000000000000000000000000000000 00000000000000000000000000000000AF200000B1E14545D8FF1818DEFF0303 E1FF0202E7FF0202EBFF0101EDFF0202EBFF0202E7FF1515E3FF4D4DDFFF0303 B2E10000AF200000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000AF200101B4E14B4BDEFF4646 E6FF5858EDFF6162F0FF6465F1FF6666EFFF6C6CEEFF8080EAFF0303B6E20000 AF20000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000B7200606B9E19899EBFF7D7E EDFF5D5EE9FF5555EAFF4E4EEAFF4748E9FF5151E8FF9191ECFF0707B9E20000 B720000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000B7200202BAE09495E9FF8082E9FF696B E8FF6465E8FF5B5CEAFF5555E7FF4F4FE7FF4748E4FF5555E4FF8B8BE7FF0404 BCE10000B7200000000000000000000000000000000000000000000000000000 000000000000000000000000BF200101BBE08F8FE4FF8C8EEAFF797AE7FF7273 E6FF6A6CE7FF7374E9FF6E6EE8FF5656E3FF5050E1FF4849DFFF5556DFFF8484 E2FF0202BCE10000BF2000000000000000000000000000000000000000000000 0000000000000000BF200000BFE08989E0FF989AE9FF8687E7FF7F81E6FF797A E7FF7F81E7FF8B8BE7FF8585E5FF6F6FE5FF5757DFFF5050DDFF4949D9FF5758 D9FF7C7CDDFF0101BFE10000BF20000000000000000000000000000000000000 00000000BF200000C2E08182DEFFA3A4EBFF9596E8FF8E8FE7FF8687E6FF898B E8FF8B8BE5FF0303C4E00202C3E08282E4FF6F6FE1FF5757DAFF5050D8FF4949 D3FF595AD4FF7676D9FF0202C0E10000BF200000000000000000000000000000 00000000C5C0B6B6EDFFB3B5EEFFA1A3EAFF9B9CE8FF9596E8FF9596E8FF8B8C E5FF0404C6E00000C7200000C7200303C5E08182E1FF6D6DDDFF5858D6FF5252 D2FF4A4ACDFF6D6ED4FF5353D2FF0000C5C00000000000000000000000000000 00000000C7202A2ACDE4ABACEFFFAEB0EEFFA1A3EAFFA1A3E9FF8C8CE2FF0606 C4E00000C72000000000000000000000C7200303C5E07F7FDFFF6B6CDAFF5959 D1FF6666D3FF7D7EDEFF0808C6E10000C7200000000000000000000000000000 0000000000000000C7201212C8E2A9ABEDFFB3B4EFFF8C8CE1FF0505C4E00000 C720000000000000000000000000000000000000C7200505C5E07D7EDEFF7E7F DBFF8081DDFF0606C6E10000C720000000000000000000000000000000000000 000000000000000000000000C7201D1DCAE3C3C3F1FF0606C4E10000C7200000 000000000000000000000000000000000000000000000000C7200505C5E0AAAB EAFF2525CCE30000C72000000000000000000000000000000000000000000000 00000000000000000000000000000000C7200000C5C00000C720000000000000 00000000000000000000000000000000000000000000000000000000C7200000 C5C00000C7200000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 OnClick = btnDeleteFileClick end end object DrawPreview: TDrawGrid Left = 0 Height = 407 Top = 30 Width = 170 Align = alClient AutoAdvance = aaNone AutoFillColumns = True BorderSpacing.CellAlignHorizontal = ccaCenter BorderSpacing.CellAlignVertical = ccaCenter BorderStyle = bsNone ColCount = 1 DefaultColWidth = 150 DefaultRowHeight = 140 ExtendedSelect = False FixedColor = clAppWorkspace FixedCols = 0 FixedRows = 0 Font.Style = [fsItalic] MouseWheelOption = mwGrid Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goDrawFocusSelected, goSmoothScroll] ParentFont = False RowCount = 1 ScrollBars = ssAutoVertical TabOrder = 1 TitleFont.Style = [fsItalic] TitleStyle = tsNative OnDrawCell = DrawPreviewDrawCell OnSelection = DrawPreviewSelection OnTopleftChanged = DrawPreviewTopleftChanged ColWidths = ( 170 ) end end object MainMenu: TMainMenu[6] ParentBidiMode = False left = 80 top = 64 object miFile: TMenuItem Caption = '&File' object miPrev: TMenuItem Action = actLoadPrevFile end object miNext: TMenuItem Action = actLoadNextFile end object miSave: TMenuItem Caption = 'Save' OnClick = miSaveClick end object miSaveAs: TMenuItem Caption = 'Save As...' OnClick = miSaveAsClick end object miPrint: TMenuItem Caption = 'Print...' Enabled = False ShortCut = 16464 OnClick = miPrintClick end object miReload: TMenuItem Action = actReload end object miSeparator: TMenuItem Caption = '-' end object miExit: TMenuItem Caption = 'E&xit' OnClick = miExitClick end end object miEdit: TMenuItem Caption = '&Edit' object miCopyToClipboard: TMenuItem Caption = 'Copy To Clipboard' ShortCut = 16451 OnClick = miCopyToClipboardClick end object miSelectAll: TMenuItem Caption = 'Select All' ShortCut = 16449 OnClick = miSelectAllClick end object miDiv3: TMenuItem Caption = '-' end object miSearch: TMenuItem Caption = 'Search' ShortCut = 16454 OnClick = miSearchClick end object miSearchNext: TMenuItem Caption = 'Search next' ShortCut = 114 OnClick = miSearchNextClick end object miSearchPrev: TMenuItem Caption = 'Search prev' ShortCut = 8306 OnClick = miSearchPrevClick end end object miView: TMenuItem Caption = '&View' object miPreview: TMenuItem Caption = 'Preview' OnClick = miPreviewClick end object miDiv4: TMenuItem Caption = '-' end object miText: TMenuItem AutoCheck = True Caption = 'Show as &Text' GroupIndex = 1 RadioItem = True ShortCut = 49 OnClick = miTextClick end object miBin: TMenuItem AutoCheck = True Caption = 'Show as &Bin' GroupIndex = 1 RadioItem = True ShortCut = 50 OnClick = miTextClick end object miHex: TMenuItem AutoCheck = True Caption = 'Show as &Hex' GroupIndex = 1 RadioItem = True ShortCut = 51 OnClick = miTextClick end object miWrapText: TMenuItem AutoCheck = True Caption = 'Show as &Wrap text' GroupIndex = 1 RadioItem = True ShortCut = 52 OnClick = miTextClick end object miLookBook: TMenuItem AutoCheck = True Caption = 'Show as B&ook' GroupIndex = 1 RadioItem = True ShortCut = 32781 OnClick = miTextClick end object miDiv2: TMenuItem Caption = '-' end object miGraphics: TMenuItem AutoCheck = True Caption = 'Graphics' GroupIndex = 1 RadioItem = True ShortCut = 54 OnClick = miGraphicsClick end object miDiv1: TMenuItem Caption = '-' end object miPlugins: TMenuItem AutoCheck = True Caption = 'Plugins' GroupIndex = 1 RadioItem = True ShortCut = 55 OnClick = miPluginsClick end end object miEncoding: TMenuItem Caption = 'En&coding' end object miImage: TMenuItem Caption = '&Image' object miStretch: TMenuItem Caption = 'Stretch' OnClick = miStretchClick end object miRotate: TMenuItem Caption = 'Rotate' object mi90: TMenuItem Caption = '+ 90' OnClick = miRotateClick end object mi180: TMenuItem Caption = '+ 180' OnClick = miRotateClick end object mi270: TMenuItem Caption = '- 90' OnClick = miRotateClick end object miMirror: TMenuItem Caption = 'Mirror' OnClick = miRotateClick end end object miZoomIn: TMenuItem Caption = 'Zoom In' OnClick = miZoomClick end object miZoomOut: TMenuItem Caption = 'Zoom Out' OnClick = miZoomClick end object miFullScreen: TMenuItem Caption = 'Full Screen' OnClick = miFullScreenClick end object miScreenshot: TMenuItem Caption = 'Screenshot' OnClick = miScreenshotClick end end object miAbout: TMenuItem Caption = 'About' object miAbout2: TMenuItem Action = actAbout end end end object pmEditMenu: TPopupMenu[7] left = 152 top = 64 object pmiCopy: TMenuItem Caption = 'Copy To Clipboard' OnClick = miCopyToClipboardClick end object miDiv5: TMenuItem Caption = '-' end object pmiSelectAll: TMenuItem Caption = 'Select All' OnClick = miSelectAllClick end end object SavePictureDialog: TSavePictureDialog[8] left = 304 top = 64 end object TimerViewer: TTimer[9] Enabled = False Interval = 10 OnTimer = TimerViewerTimer left = 224 top = 64 end object actionList: TActionList[10] left = 376 top = 64 object actAbout: TAction Category = 'Help' Caption = 'About Viewer...' Hint = 'Displays the About message' OnExecute = miAbout2Click end object actReload: TAction Category = 'File' Caption = 'Reload' Hint = 'Reload current file' OnExecute = actExecute end object actLoadNextFile: TAction Category = 'File' Caption = '&Next' Hint = 'Load Next File' OnExecute = actExecute end object actLoadPrevFile: TAction Category = 'File' Caption = '&Previous' Hint = 'Load Previous File' OnExecute = actExecute end object actMoveFile: TAction Category = 'File' Caption = 'Move File' Hint = 'Move File' OnExecute = actExecute end object actCopyFile: TAction Category = 'File' Caption = 'Copy File' Hint = 'Copy File' OnExecute = actExecute end object actDeleteFile: TAction Category = 'File' Caption = 'Delete File' Hint = 'Delete File' OnExecute = actExecute end object actStretchImage: TAction Category = 'Image' Caption = 'Stretch' Hint = 'Stretch Image' OnExecute = actExecute end object actSaveAs: TAction Category = 'File' Caption = 'Save As...' Hint = 'Save File As...' OnExecute = actExecute end object actRotate90: TAction Category = 'Image' Caption = 'Rotate 90' Hint = 'Rotate 90' OnExecute = actExecute end object actRotate180: TAction Category = 'Image' Caption = 'Rotate 180' Hint = 'Rotate 180' OnExecute = actExecute end object actRotate270: TAction Category = 'Image' Caption = 'Rotate 270' Hint = 'Rotate 270' OnExecute = actExecute end object actMirror: TAction Category = 'Image' Caption = 'Mirror' Hint = 'Mirror' OnExecute = actExecute end end end doublecmd-0.5.8/src/fviewoperations.lfm0000644000175000017500000001503512023046500017215 0ustar alexxalexxobject frmViewOperations: TfrmViewOperations Left = 18 Height = 353 Top = 117 Width = 507 ActiveControl = tvOperations Caption = 'File operations' ClientHeight = 353 ClientWidth = 507 Constraints.MinHeight = 100 Constraints.MinWidth = 300 OnClose = FormClose OnCreate = FormCreate OnDestroy = FormDestroy Position = poScreenCenter SessionProperties = 'Height;Left;Top;Width;WindowState;cbAlwaysOnTop.Checked' LCLVersion = '1.1' object pnlHeader: TPanel Left = 0 Height = 64 Top = 0 Width = 507 Align = alTop AutoSize = True BevelOuter = bvNone ClientHeight = 64 ClientWidth = 507 TabOrder = 0 object pnlTopHeader: TPanel AnchorSideLeft.Control = pnlHeader AnchorSideTop.Control = pnlHeader AnchorSideRight.Control = pnlHeader AnchorSideRight.Side = asrBottom Left = 0 Height = 40 Top = 0 Width = 507 Anchors = [akTop, akLeft, akRight] AutoSize = True BevelOuter = bvNone ClientHeight = 40 ClientWidth = 507 TabOrder = 0 object tbPauseAll: TToggleBox AnchorSideLeft.Control = pnlTopHeader AnchorSideTop.Control = pnlTopHeader AnchorSideBottom.Control = pnlTopHeader AnchorSideBottom.Side = asrBottom Left = 0 Height = 40 Top = 0 Width = 70 Anchors = [akTop, akLeft, akBottom] AutoSize = True BorderSpacing.Right = 40 Caption = '&Pause all' OnChange = tbPauseAllChange TabOrder = 0 end object btnStop: TBitBtn AnchorSideLeft.Control = tbPauseAll AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlTopHeader AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 110 Height = 40 Top = 0 Width = 80 AutoSize = True Caption = 'S&top' Constraints.MinHeight = 40 Constraints.MinWidth = 80 Enabled = False OnClick = btnStopClick TabOrder = 1 end object btnStartPause: TBitBtn AnchorSideLeft.Control = btnStop AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlTopHeader AnchorSideBottom.Side = asrBottom Left = 200 Height = 40 Top = 0 Width = 80 AutoSize = True BorderSpacing.Left = 10 Caption = '&Start' Constraints.MinHeight = 40 Constraints.MinWidth = 80 Enabled = False OnClick = btnStartPauseClick TabOrder = 2 end end object lblUseDragDrop: TLabel AnchorSideLeft.Control = pnlHeader AnchorSideTop.Control = pnlTopHeader AnchorSideTop.Side = asrBottom AnchorSideRight.Control = pnlHeader AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 43 Width = 487 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Top = 3 BorderSpacing.Right = 10 BorderSpacing.Bottom = 3 Caption = '&Use "drag && drop" to move operations between queues' FocusControl = tvOperations ParentColor = False end object cbAlwaysOnTop: TCheckBox AnchorSideTop.Control = pnlTopHeader AnchorSideTop.Side = asrCenter AnchorSideRight.Control = pnlTopHeader AnchorSideRight.Side = asrBottom Left = 391 Height = 23 Top = 9 Width = 116 Anchors = [akTop, akRight] Caption = 'Always on top' OnChange = cbAlwaysOnTopChange TabOrder = 1 end end object tvOperations: TTreeView AnchorSideLeft.Control = Owner AnchorSideTop.Control = pnlHeader AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 0 Height = 289 Top = 64 Width = 507 Anchors = [akTop, akLeft, akRight, akBottom] AutoExpand = True DefaultItemHeight = 24 DragMode = dmAutomatic ExpandSignType = tvestArrow MultiSelect = True MultiSelectStyle = [msControlSelect, msShiftSelect] ReadOnly = True RowSelect = True ScrollBars = ssAutoVertical ShowLines = False TabOrder = 1 OnCustomDrawItem = tvOperationsCustomDrawItem OnDeletion = tvOperationsDeletion OnDragDrop = tvOperationsDragDrop OnDragOver = tvOperationsDragOver OnKeyDown = tvOperationsKeyDown OnMouseDown = tvOperationsMouseDown OnSelectionChanged = tvOperationsSelectionChanged Options = [tvoAllowMultiselect, tvoAutoExpand, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoRowSelect, tvoShowButtons, tvoShowRoot, tvoShowSeparators, tvoToolTips, tvoNoDoubleClickExpand, tvoThemedDraw] end object UpdateTimer: TTimer Interval = 100 OnTimer = OnUpdateTimer left = 112 top = 136 end object pmOperationPopup: TPopupMenu left = 224 top = 136 object mnuQueue: TMenuItem Caption = 'Queue' object mnuQueue0: TMenuItem Caption = 'Out of queue' OnClick = mnuQueueNumberClick end object mnuQueue1: TMenuItem Caption = 'Queue 1' OnClick = mnuQueueNumberClick end object mnuQueue2: TMenuItem Caption = 'Queue 2' OnClick = mnuQueueNumberClick end object mnuQueue3: TMenuItem Caption = 'Queue 3' OnClick = mnuQueueNumberClick end object mnuQueue4: TMenuItem Caption = 'Queue 4' OnClick = mnuQueueNumberClick end object mnuQueue5: TMenuItem Caption = 'Queue 5' OnClick = mnuQueueNumberClick end object mnuNewQueue: TMenuItem Caption = 'New queue' OnClick = mnuNewQueueClick end end object mnuOperationShowDetached: TMenuItem Caption = 'Show in detached window' OnClick = mnuOperationShowDetachedClick end object mnuPutFirstInQueue: TMenuItem Caption = 'Put first in queue' OnClick = mnuPutFirstInQueueClick end object mnuPutLastInQueue: TMenuItem Caption = 'Put last in queue' OnClick = mnuPutLastInQueueClick end object mnuCancelOperation: TMenuItem Caption = 'Cancel' OnClick = mnuCancelOperationClick end end object pmQueuePopup: TPopupMenu left = 224 top = 208 object mnuQueueShowDetached: TMenuItem Caption = 'Show in detached window' OnClick = mnuQueueShowDetachedClick end object mnuCancelQueue: TMenuItem Caption = 'Cancel' OnClick = mnuCancelQueueClick end end end doublecmd-0.5.8/src/ulog.pas0000644000175000017500000001031011740427612014747 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- This unit contains log write functions. Copyright (C) 2008-2011 Koblov Alexander (Alexx2000@mail.ru) contributors: Radek Cervinka This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uLog; {$mode objfpc}{$H+} interface uses Classes; type TLogMsgType = (lmtInfo, lmtSuccess, lmtError); type { TLogWriteThread } TLogWriteThread = class private procedure LogWriteInTheThread; protected FThread: TThread; FMsg: String; FLogMsgType: TLogMsgType; FForce, FLogFile: Boolean; public constructor Create(Thread: TThread); destructor Destroy; override; procedure WriteLog(const sText: String; LogMsgType: TLogMsgType; bForce, bLogFile: Boolean); end; procedure ShowLogWindow(bShow: Boolean); procedure logWrite(const sText: String; LogMsgType: TLogMsgType = lmtInfo; bForce: Boolean = False; bLogFile: Boolean = True); overload; procedure logWrite(Thread: TThread; const sText: String; LogMsgType: TLogMsgType = lmtInfo; bForce: Boolean = False; bLogFile: Boolean = True); overload; implementation uses SysUtils, Forms, fMain, uDebug, uGlobs, uFileProcs, DCOSUtils; procedure ShowLogWindow(bShow: Boolean); begin if Assigned(fMain.frmMain) then with fMain.frmMain do begin LogSplitter.Visible:= bShow; seLogWindow.Visible:= bShow; LogSplitter.Top := seLogWindow.Top - LogSplitter.Height; end; end; procedure logWrite(const sText: String; LogMsgType: TLogMsgType; bForce, bLogFile: Boolean); begin logWrite(nil, sText, LogMsgType, bForce, bLogFile); end; procedure logWrite(Thread: TThread; const sText: String; LogMsgType: TLogMsgType; bForce, bLogFile: Boolean); var LogWriteThread: TLogWriteThread; begin try LogWriteThread:= TLogWriteThread.Create(Thread); LogWriteThread.WriteLog(sText, LogMsgType, bForce, bLogFile); finally LogWriteThread.Free; end end; { TLogWriteThread } procedure TLogWriteThread.LogWriteInTheThread; var hLogFile: THandle; LogMsgTypeObject: TObject; begin LogMsgTypeObject:= TObject(PtrInt(FLogMsgType)); if Assigned(fMain.frmMain) then with fMain.frmMain do begin if FForce and (not seLogWindow.Visible) then ShowLogWindow(True); if (gLogWindow or FForce) then // if write log to window seLogWindow.CaretY:= seLogWindow.Lines.AddObject(FMsg, LogMsgTypeObject) + 1; end; if gLogFile and FLogFile then // if write log to file try if mbFileExists(gLogFileName) then hLogFile:= mbFileOpen(gLogFileName, fmOpenReadWrite) else hLogFile:= mbFileCreate(gLogFileName); FileSeek(hLogFile, 0, soFromEnd); FileWriteLn(hLogFile, Format('%s %s', [DateTimeToStr(Now), FMsg])); DCDebug(Format('%s %s',[DateTimeToStr(Now), FMsg])); FileClose(hLogFile); except on E: Exception do DCDebug('Error writing to log: ' + E.Message); end; // gLogWriteFile end; constructor TLogWriteThread.Create(Thread: TThread); begin FThread:= Thread; end; destructor TLogWriteThread.Destroy; begin FMsg:= ''; inherited Destroy; end; procedure TLogWriteThread.WriteLog(const sText: String; LogMsgType: TLogMsgType; bForce, bLogFile: Boolean); begin FMsg:= sText; FLogMsgType:= LogMsgType; FForce:= bForce; FLogFile:= bLogFile; TThread.Synchronize(FThread, @LogWriteInTheThread); end; end. doublecmd-0.5.8/src/uresample.pas0000644000175000017500000004777312076506300016020 0ustar alexxalexx// ----------------------------------------------------------------------------- // Project: bitmap resampler // Module: resample // Description: Interpolated Bitmap Resampling using filters. // Version: 01.03 // Release: 1 // Date: 19-DEC-2009 // Target: Free Pascal 2.2.4, Lazarus 0.9.29 // Author(s): anme: Anders Melander, anders@melander.dk // Alexx2000: Alexander Koblov, Alexx2000@mail.ru // Copyright (c) 1997,98 by Anders Melander // Copyright (c) 2009 by Alexander Koblov // Formatting: 2 space indent, 8 space tabs, 80 columns. // ----------------------------------------------------------------------------- // This software is copyrighted as noted above. It may be freely copied, // modified, and redistributed, provided that the copyright notice(s) is // preserved on all copies. // // There is no warranty or other guarantee of fitness for this software, // it is provided solely "as is". Bug reports or fixes may be sent // to the author, who may or may not act on them as he desires. // // You may not include this software in a program or other software product // without supplying the source, or without informing the end-user that the // source is available for no extra charge. // // If you modify this software, you should include a notice in the "Revision // history" section giving the name of the person performing the modification, // the date of modification, and the reason for such modification. // ----------------------------------------------------------------------------- // Here's some additional copyrights for you: // // From filter.c: // The authors and the publisher hold no copyright restrictions // on any of these files; this source code is public domain, and // is freely available to the entire computer graphics community // for study, use, and modification. We do request that the // comment at the top of each file, identifying the original // author and its original publication in the book Graphics // Gems, be retained in all programs that use these files. // // ----------------------------------------------------------------------------- // Revision history: // // 0100 110997 anme - Adapted from fzoom v0.20 by Dale Schumacher. // // 0101 110198 anme - Added Lanczos3 and Mitchell filters. // - Fixed range bug. // Min value was not checked on conversion from Single to // byte. // - Numerous optimizations. // - Added TImage stretch on form resize. // - Added support for Delphi 2 via TCanvas.Pixels. // - Renamed module from stretch to resample. // - Moved demo code to separate module. // // 0102 150398 anme - Fixed a problem that caused all pixels to be shifted // 1/2 pixel down and to the right (in source // coordinates). Thanks to David Ullrich for the // solution. // 0103 191209 Alexx2000 - Ported to FreePascal/Lazarus // - Added alpha channel support // ----------------------------------------------------------------------------- // Credits: // The algorithms and methods used in this library are based on the article // "General Filtered Image Rescaling" by Dale Schumacher which appeared in the // book Graphics Gems III, published by Academic Press, Inc. // // The edge offset problem was fixed by: // * David Ullrich // ----------------------------------------------------------------------------- // To do (in rough order of priority): // * Implement Dale Schumacher's "Optimized Bitmap Scaling Routines". // * Fix BoxFilter. // * Optimize to use integer math instead of floating point where possible. // ----------------------------------------------------------------------------- unit uReSample; interface {$mode delphi}{$R-} {$IF (FPC_VERSION > 2) or ((FPC_VERSION = 2) and (FPC_RELEASE >= 5))} {$POINTERMATH ON} {$ENDIF} uses SysUtils, Classes, Graphics; type // Type of a filter for use with Stretch() TFilterProc = function(Value: Single): Single; // Sample filters for use with Stretch() function SplineFilter(Value: Single): Single; function BellFilter(Value: Single): Single; function TriangleFilter(Value: Single): Single; function BoxFilter(Value: Single): Single; function HermiteFilter(Value: Single): Single; function Lanczos3Filter(Value: Single): Single; function MitchellFilter(Value: Single): Single; // Interpolator // Src: Source bitmap // Dst: Destination bitmap // filter: Weight calculation filter // fwidth: Relative sample radius procedure Stretch(Src, Dst: TBitmap; filter: TFilterProc; fwidth: single); // ----------------------------------------------------------------------------- // // List of Filters // // ----------------------------------------------------------------------------- const ResampleFilters: array[0..6] of record Name: string; // Filter name Filter: TFilterProc;// Filter implementation Width: Single; // Suggested sampling width/radius end = ( (Name: 'Box'; Filter: BoxFilter; Width: 0.5), (Name: 'Triangle'; Filter: TriangleFilter; Width: 1.0), (Name: 'Hermite'; Filter: HermiteFilter; Width: 1.0), (Name: 'Bell'; Filter: BellFilter; Width: 1.5), (Name: 'B-Spline'; Filter: SplineFilter; Width: 2.0), (Name: 'Lanczos3'; Filter: Lanczos3Filter; Width: 3.0), (Name: 'Mitchell'; Filter: MitchellFilter; Width: 2.0) ); implementation uses Math, IntfGraphics, GraphType, FPImage; // ----------------------------------------------------------------------------- // // Filter functions // // ----------------------------------------------------------------------------- // Hermite filter function HermiteFilter(Value: Single): Single; begin // f(t) = 2|t|^3 - 3|t|^2 + 1, -1 <= t <= 1 if (Value < 0.0) then Value := -Value; if (Value < 1.0) then Result := (2.0 * Value - 3.0) * Sqr(Value) + 1.0 else Result := 0.0; end; // Box filter // a.k.a. "Nearest Neighbour" filter // anme: I have not been able to get acceptable // results with this filter for subsampling. function BoxFilter(Value: Single): Single; begin if (Value > -0.5) and (Value <= 0.5) then Result := 1.0 else Result := 0.0; end; // Triangle filter // a.k.a. "Linear" or "Bilinear" filter function TriangleFilter(Value: Single): Single; begin if (Value < 0.0) then Value := -Value; if (Value < 1.0) then Result := 1.0 - Value else Result := 0.0; end; // Bell filter function BellFilter(Value: Single): Single; begin if (Value < 0.0) then Value := -Value; if (Value < 0.5) then Result := 0.75 - Sqr(Value) else if (Value < 1.5) then begin Value := Value - 1.5; Result := 0.5 * Sqr(Value); end else Result := 0.0; end; // B-spline filter function SplineFilter(Value: Single): Single; var tt : single; begin if (Value < 0.0) then Value := -Value; if (Value < 1.0) then begin tt := Sqr(Value); Result := 0.5*tt*Value - tt + 2.0 / 3.0; end else if (Value < 2.0) then begin Value := 2.0 - Value; Result := 1.0/6.0 * Sqr(Value) * Value; end else Result := 0.0; end; // Lanczos3 filter function Lanczos3Filter(Value: Single): Single; function SinC(Value: Single): Single; begin if (Value <> 0.0) then begin Value := Value * Pi; Result := sin(Value) / Value end else Result := 1.0; end; begin if (Value < 0.0) then Value := -Value; if (Value < 3.0) then Result := SinC(Value) * SinC(Value / 3.0) else Result := 0.0; end; function MitchellFilter(Value: Single): Single; const B = (1.0 / 3.0); C = (1.0 / 3.0); var tt : single; begin if (Value < 0.0) then Value := -Value; tt := Sqr(Value); if (Value < 1.0) then begin Value := (((12.0 - 9.0 * B - 6.0 * C) * (Value * tt)) + ((-18.0 + 12.0 * B + 6.0 * C) * tt) + (6.0 - 2 * B)); Result := Value / 6.0; end else if (Value < 2.0) then begin Value := (((-1.0 * B - 6.0 * C) * (Value * tt)) + ((6.0 * B + 30.0 * C) * tt) + ((-12.0 * B - 48.0 * C) * Value) + (8.0 * B + 24 * C)); Result := Value / 6.0; end else Result := 0.0; end; // ----------------------------------------------------------------------------- // // Interpolator // // ----------------------------------------------------------------------------- type // Contributor for a pixel TContributor = record pixel: integer; // Source pixel weight: single; // Pixel weight end; TContributorList = array[0..0] of TContributor; PContributorList = ^TContributorList; // List of source pixels contributing to a destination pixel TCList = record n : integer; p : PContributorList; end; TCListList = array[0..0] of TCList; PCListList = ^TCListList; TRGBA = packed record r, g, b, a : single; end; // Physical bitmap pixel TColorRGBA = packed record r, g, b, a : BYTE; end; PColorRGBA = ^TColorRGBA; // Physical bitmap scanline (row) TRGBAList = packed array[0..0] of TColorRGBA; PRGBAList = ^TRGBAList; function CreateAlphaFromMask(Bitmap: TBitmap): TLazIntfImage; var SrcIntfImage: TLazIntfImage; x, y, xStop, yStop: Integer; Color: TFPColor; begin SrcIntfImage := TLazIntfImage.Create(Bitmap.RawImage, False); with SrcIntfImage do begin if MaskData = nil then Exit(SrcIntfImage); Result := TLazIntfImage.Create(Width, Height, [riqfRGB, riqfAlpha]); Result.CreateData; xStop := Width - 1; yStop := Height - 1; end; for x:= 0 to xStop do for y:= 0 to yStop do begin Color := SrcIntfImage.Colors[x, y]; if SrcIntfImage.Masked[x, y] then Color.Alpha := Low(Color.Alpha) else Color.Alpha := High(Color.Alpha); Result.Colors[x, y] := Color; end; SrcIntfImage.Free; end; procedure Stretch(Src, Dst: TBitmap; filter: TFilterProc; fwidth: single); var xscale, yscale : single; // Zoom scale factors i, j, k : integer; // Loop variables center : single; // Filter calculation variables width, fscale, weight : single; // Filter calculation variables left, right : integer; // Filter calculation variables n : integer; // Pixel number Work : PRGBAList; contrib : PCListList; rgba : TRGBA; color : TColorRGBA; SourceLine , DestLine : PRGBAList; SrcDelta : integer; SrcIntfImage, DstIntfImage : TLazIntfImage; ImgFormatDescription : TRawImageDescription; SrcWidth , SrcHeight , DstWidth , DstHeight : integer; function Color2RGBA(Color: TFPColor): TColorRGBA; begin Result.r := Color.Red shr 8; Result.g := Color.Green shr 8; Result.b := Color.Blue shr 8; Result.a := Color.Alpha shr 8; end; function RGBA2Color(Color: TColorRGBA): TFPColor; begin Result.Red := Color.r shl 8; Result.Green := Color.g shl 8; Result.Blue := Color.b shl 8; Result.Alpha := Color.a shl 8; end; begin DstWidth := Dst.Width; DstHeight := Dst.Height; SrcWidth := Src.Width; SrcHeight := Src.Height; if (SrcWidth < 1) or (SrcHeight < 1) then raise Exception.Create('Source bitmap too small'); // Create intermediate buffer to hold horizontal zoom Work := GetMem(DstWidth * SrcHeight * SizeOf(TColorRGBA)); try // xscale := DstWidth / SrcWidth; // yscale := DstHeight / SrcHeight; // Improvement suggested by David Ullrich: if (SrcWidth = 1) then xscale:= DstWidth / SrcWidth else xscale:= (DstWidth - 1) / (SrcWidth - 1); if (SrcHeight = 1) then yscale:= DstHeight / SrcHeight else yscale:= (DstHeight - 1) / (SrcHeight - 1); {++++++++++++++++++++} if Src.RawImage.Description.AlphaPrec = 0 then // if bitmap has not alpha channel SrcIntfImage := CreateAlphaFromMask(Src) else SrcIntfImage := TLazIntfImage.Create(Src.RawImage, False); DstIntfImage := TLazIntfImage.Create(Dst.RawImage, False); ImgFormatDescription.Init_BPP32_B8G8R8A8_BIO_TTB(DstWidth, DstHeight); DstIntfImage.DataDescription := ImgFormatDescription; {++++++++++++++++++++} // -------------------------------------------- // Pre-calculate filter contributions for a row // ----------------------------------------------- GetMem(contrib, DstWidth* sizeof(TCList)); // Horizontal sub-sampling // Scales from bigger to smaller width if (xscale < 1.0) then begin width := fwidth / xscale; fscale := 1.0 / xscale; for i := 0 to DstWidth-1 do begin contrib^[i].n := 0; GetMem(contrib^[i].p, trunc(width * 2.0 + 1) * sizeof(TContributor)); center := i / xscale; // Original code: // left := ceil(center - width); // right := floor(center + width); left := floor(center - width); right := ceil(center + width); for j := left to right do begin weight := filter((center - j) / fscale) / fscale; if (weight = 0.0) then continue; if (j < 0) then n := -j else if (j >= SrcWidth) then n := SrcWidth - j + SrcWidth - 1 else n := j; k := contrib^[i].n; contrib^[i].n := contrib^[i].n + 1; contrib^[i].p^[k].pixel := n; contrib^[i].p^[k].weight := weight; end; end; end else // Horizontal super-sampling // Scales from smaller to bigger width begin for i := 0 to DstWidth-1 do begin contrib^[i].n := 0; GetMem(contrib^[i].p, trunc(fwidth * 2.0 + 1) * sizeof(TContributor)); center := i / xscale; // Original code: // left := ceil(center - fwidth); // right := floor(center + fwidth); left := floor(center - fwidth); right := ceil(center + fwidth); for j := left to right do begin weight := filter(center - j); if (weight = 0.0) then continue; if (j < 0) then n := -j else if (j >= SrcWidth) then n := SrcWidth - j + SrcWidth - 1 else n := j; k := contrib^[i].n; contrib^[i].n := contrib^[i].n + 1; contrib^[i].p^[k].pixel := n; contrib^[i].p^[k].weight := weight; end; end; end; // ---------------------------------------------------- // Apply filter to sample horizontally from Src to Work // ---------------------------------------------------- for k := 0 to SrcHeight-1 do begin {++++++++++++++++++++} DestLine := Work + k * DstWidth; {++++++++++++++++++++} for i := 0 to DstWidth-1 do begin rgba.r := 0.0; rgba.g := 0.0; rgba.b := 0.0; rgba.a := 0.0; for j := 0 to contrib^[i].n-1 do begin {++++++++++++++++++++} color := Color2RGBA(SrcIntfImage.Colors[contrib^[i].p^[j].pixel, k]); {++++++++++++++++++++} weight := contrib^[i].p^[j].weight; if (weight = 0.0) then continue; rgba.r := rgba.r + color.r * weight; rgba.g := rgba.g + color.g * weight; rgba.b := rgba.b + color.b * weight; rgba.a := rgba.a + color.a * weight; end; if (rgba.r > 255.0) then color.r := 255 else if (rgba.r < 0.0) then color.r := 0 else color.r := round(rgba.r); if (rgba.g > 255.0) then color.g := 255 else if (rgba.g < 0.0) then color.g := 0 else color.g := round(rgba.g); if (rgba.b > 255.0) then color.b := 255 else if (rgba.b < 0.0) then color.b := 0 else color.b := round(rgba.b); if (rgba.a > 255.0) then color.a := 255 else if (rgba.a < 0.0) then color.a := 0 else color.a := round(rgba.a); {++++++++++++++++++++} // Set new pixel value DestLine^[i] := color; {++++++++++++++++++++} end; end; // Free the memory allocated for horizontal filter weights for i := 0 to DstWidth-1 do FreeMem(contrib^[i].p); FreeMem(contrib); // ----------------------------------------------- // Pre-calculate filter contributions for a column // ----------------------------------------------- GetMem(contrib, DstHeight* sizeof(TCList)); // Vertical sub-sampling // Scales from bigger to smaller height if (yscale < 1.0) then begin width := fwidth / yscale; fscale := 1.0 / yscale; for i := 0 to DstHeight-1 do begin contrib^[i].n := 0; GetMem(contrib^[i].p, trunc(width * 2.0 + 1) * sizeof(TContributor)); center := i / yscale; // Original code: // left := ceil(center - width); // right := floor(center + width); left := floor(center - width); right := ceil(center + width); for j := left to right do begin weight := filter((center - j) / fscale) / fscale; if (weight = 0.0) then continue; if (j < 0) then n := -j else if (j >= SrcHeight) then n := SrcHeight - j + SrcHeight - 1 else n := j; k := contrib^[i].n; contrib^[i].n := contrib^[i].n + 1; contrib^[i].p^[k].pixel := n; contrib^[i].p^[k].weight := weight; end; end end else // Vertical super-sampling // Scales from smaller to bigger height begin for i := 0 to DstHeight-1 do begin contrib^[i].n := 0; GetMem(contrib^[i].p, trunc(fwidth * 2.0 + 1) * sizeof(TContributor)); center := i / yscale; // Original code: // left := ceil(center - fwidth); // right := floor(center + fwidth); left := floor(center - fwidth); right := ceil(center + fwidth); for j := left to right do begin weight := filter(center - j); if (weight = 0.0) then continue; if (j < 0) then n := -j else if (j >= SrcHeight) then n := SrcHeight - j + SrcHeight - 1 else n := j; k := contrib^[i].n; contrib^[i].n := contrib^[i].n + 1; contrib^[i].p^[k].pixel := n; contrib^[i].p^[k].weight := weight; end; end; end; // -------------------------------------------------- // Apply filter to sample vertically from Work to Dst // -------------------------------------------------- {++++++++++++++++++++} SourceLine := Work; SrcDelta := DstWidth; {++++++++++++++++++++} for k := 0 to DstWidth-1 do begin for i := 0 to DstHeight-1 do begin rgba.r := 0; rgba.g := 0; rgba.b := 0; rgba.a := 0; // weight := 0.0; for j := 0 to contrib^[i].n-1 do begin {++++++++++++++++++++} color := PColorRGBA(SourceLine+contrib^[i].p^[j].pixel*SrcDelta)^; {++++++++++++++++++++} weight := contrib^[i].p^[j].weight; if (weight = 0.0) then continue; rgba.r := rgba.r + color.r * weight; rgba.g := rgba.g + color.g * weight; rgba.b := rgba.b + color.b * weight; rgba.a := rgba.a + color.a * weight; end; if (rgba.r > 255.0) then color.r := 255 else if (rgba.r < 0.0) then color.r := 0 else color.r := round(rgba.r); if (rgba.g > 255.0) then color.g := 255 else if (rgba.g < 0.0) then color.g := 0 else color.g := round(rgba.g); if (rgba.b > 255.0) then color.b := 255 else if (rgba.b < 0.0) then color.b := 0 else color.b := round(rgba.b); if (rgba.a > 255.0) then color.a := 255 else if (rgba.a < 0.0) then color.a := 0 else color.a := round(rgba.a); {++++++++++++++++++++} DstIntfImage.Colors[k, i]:= RGBA2Color(color); {++++++++++++++++++++} end; {++++++++++++++++++++} Inc(SourceLine); {++++++++++++++++++++} end; // Free the memory allocated for vertical filter weights for i := 0 to DstHeight-1 do FreeMem(contrib^[i].p); FreeMem(contrib); Dst.LoadFromIntfImage(DstIntfImage); finally FreeMem(Work); DstIntfImage.Free; SrcIntfImage.Free; end; end; end. doublecmd-0.5.8/src/doublecmd.lpr0000644000175000017500000001035412215276721015762 0ustar alexxalexx{ $threading on} program doublecmd; {%File 'doc/changelog.txt'} {.$APPTYPE GUI} uses {$IFDEF WIN64} uExceptionHandlerFix, {$ENDIF} {$IFDEF UNIX} cthreads, //cwstring, clocale, {$IFDEF LCLGTK2} uOverlayScrollBarFix, gtk2, Gtk2Int, {$ENDIF} {$ENDIF} Interfaces, LCLProc, SysUtils, Forms, LCLVersion, {$IF DEFINED(NIGHTLY_BUILD)} un_lineinfo, {$ENDIF} uGlobsPaths, uGlobs, fHackForm, fMain, fMkDir, dmHigh, dmHelpManager, dmCommonData, uShowMsg, uCryptProc, uPixMapManager, uKeyboard, uUniqueInstance, uDCVersion, uCmdLineParams, uDebug, uOSUtils {$IFDEF MSWINDOWS} , uMyWindows {$ENDIF} {$IFDEF UNIX} , uMyUnix {$ENDIF} ; {$R *.res} {$IFDEF HEAPTRC} var LogPath: String; {$ENDIF} begin DCDebug('Starting Double Commander'); // Initialize random number generator Randomize; {$IF DEFINED(NIGHTLY_BUILD)} InitLineInfo; AddLineInfoPath(ExtractFileDir(ParamStr(0))); {$ENDIF} {$IFDEF HEAPTRC} LogPath := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + 'logs'; CreateDir(LogPath); SetHeapTraceOutput(LogPath + '/heaptrc-' + FormatDateTime('yyyy-mm-dd hh.mm.ss', Now) + '.log'); {$ENDIF} {$IFDEF MSWINDOWS} uMyWindows.InitErrorMode; uMyWindows.FixCommandLineToUTF8; {$ENDIF} Application.Title:= 'Double Commander'; Application.Initialize; uDCVersion.InitializeVersionInfo; // Initializing keyboard module on GTK needs GTKProc.InitKeyboardTables // which is called by Application.Initialize. uKeyboard.InitializeKeyboard; // Use only current directory separator AllowDirectorySeparators:= [DirectorySeparator]; {$IF lcl_fullversion >= 093100} // Disable because we set a few of our own format settings and we don't want // them to be changed. There's no way currently to react to Application.IntfSettingsChange. // If in future we move to a Unicode RTL this could be removed. {$PUSH}{$WARN SYMBOL_PLATFORM OFF} Application.UpdateFormatSettings := False; {$POP} {$ENDIF} DefaultFormatSettings.ThousandSeparator:= ' '; {$IFDEF UNIX} uMyUnix.FixDateTimeSeparators; {$ENDIF} FixDateNamesToUTF8; DCDebug('Double Commander ' + dcVersion); DCDebug('Revision: ' + dcRevision); DCDebug('Build: ' + dcBuildDate); DCDebug('Lazarus: ' + lazVersion + '-' + lazRevision); DCDebug('Free Pascal: ' + fpcVersion); DCDebug('Platform: ' + TargetCPU + '-' + TargetOS + '-' + TargetWS); DCDebug('System: ' + OSVersion); if WSVersion <> EmptyStr then DCDebug('Widgetset library: ' + WSVersion); DCDebug('This program is free software released under terms of GNU GPL 2'); DCDebug('(C)opyright 2006-2012 Koblov Alexander (Alexx2000@mail.ru)'); DCDebug(' and contributors (see about dialog)'); ProcessCommandLineParams; // before load paths LoadPaths; // before loading config Application.ShowMainForm:= False; Application.CreateForm(TfrmHackForm, frmHackForm); if InitGlobs then if IsInstanceAllowed then begin InitPasswordStore; LoadPixMapManager; Application.CreateForm(TfrmMain, frmMain); // main form Application.CreateForm(TdmHighl, dmHighl); // highlighters Application.CreateForm(TdmComData, dmComData); // common data Application.CreateForm(TdmHelpManager, dmHelpMgr); // help manager Application.CreateForm(TfrmMkDir, frmMkDir); // 21.05.2009 - makedir form {$IF DEFINED(LCLGTK2) AND (lcl_fullversion >= 093100)} // LCLGTK2 uses Application.MainForm as the clipboard widget, however our // MainForm is TfrmHackForm and it never gets realized. GTK2 doesn't // seem to allow a not realized widget to have clipboard ownership. // We switch to frmMain instead which will be realized at some point. GTK2WidgetSet.SetClipboardWidget(PGtkWidget(frmMain.Handle)); {$ENDIF} // Calculate buttons width of message dialogs InitDialogButtonWidth; // Hooking on QT needs the handle of the main form which is created // in Application.CreateForm above. uKeyboard.HookKeyboardLayoutChanged; Application.Run; end else begin DCDebug('Another instance of DC is already running. Exiting.'); end; uKeyboard.CleanupKeyboard; DCDebug('Finished Double Commander'); end. doublecmd-0.5.8/src/fmultirename.lfm0000644000175000017500000004651212077543647016514 0ustar alexxalexxobject frmMultiRename: TfrmMultiRename Left = 299 Height = 465 Top = 143 Width = 803 Caption = 'MultiRename' ClientHeight = 465 ClientWidth = 803 OnClose = FormClose OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter SessionProperties = 'Height;Width;WindowState;Left;Top' ShowInTaskBar = stAlways LCLVersion = '1.0.4.0' object StringGrid: TStringGrid Left = 6 Height = 233 Top = 6 Width = 791 Align = alClient AutoFillColumns = True BorderSpacing.Left = 6 BorderSpacing.Top = 6 BorderSpacing.Right = 6 ColCount = 3 Columns = < item SizePriority = 0 Title.Caption = 'Old File Name' Width = 248 end item SizePriority = 0 Title.Caption = 'New File Name' Width = 249 end item Title.Caption = 'File Path' Width = 292 end> ExtendedSelect = False FixedCols = 0 Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goColSizing, goRowSelect, goSmoothScroll] RowCount = 1 TabOrder = 0 TitleStyle = tsNative OnKeyDown = StringGridKeyDown OnMouseDown = StringGridMouseDown OnMouseUp = StringGridMouseUp OnResize = StringGridTopLeftChanged OnSelection = StringGridSelection OnTopLeftChanged = StringGridTopLeftChanged ColWidths = ( 248 249 292 ) end object pnlOptions: TPanel Left = 6 Height = 214 Top = 245 Width = 791 Align = alBottom AutoSize = True BorderSpacing.Around = 6 BevelOuter = bvNone ClientHeight = 214 ClientWidth = 791 TabOrder = 1 object gbMaska: TGroupBox AnchorSideLeft.Control = pnlOptions AnchorSideTop.Control = pnlOptions AnchorSideRight.Side = asrBottom Left = 0 Height = 118 Top = 0 Width = 342 AutoSize = True Caption = 'Mask' ClientHeight = 101 ClientWidth = 338 TabOrder = 0 object lbName: TLabel AnchorSideLeft.Control = gbMaska AnchorSideTop.Control = gbMaska Left = 6 Height = 16 Top = 1 Width = 58 BorderSpacing.Left = 6 BorderSpacing.Top = 1 Caption = 'File &Name' FocusControl = edName ParentColor = False end object lbExt: TLabel AnchorSideLeft.Control = gbMaska AnchorSideTop.Control = cmbNameStyle AnchorSideTop.Side = asrBottom Left = 6 Height = 16 Top = 56 Width = 59 BorderSpacing.Left = 6 BorderSpacing.Top = 10 Caption = '&Extension' FocusControl = edExt ParentColor = False end object edName: TEdit AnchorSideLeft.Control = gbMaska AnchorSideTop.Control = lbName AnchorSideTop.Side = asrBottom Left = 6 Height = 25 Top = 19 Width = 136 BorderSpacing.Left = 6 BorderSpacing.Top = 2 OnChange = cmbNameStyleChange TabOrder = 0 end object edExt: TEdit Tag = 25 AnchorSideLeft.Control = gbMaska AnchorSideTop.Control = lbExt AnchorSideTop.Side = asrBottom Left = 6 Height = 25 Top = 74 Width = 136 BorderSpacing.Left = 6 BorderSpacing.Top = 2 OnChange = cmbNameStyleChange TabOrder = 3 end object btnNameMenu: TButton AnchorSideLeft.Control = edName AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edName AnchorSideBottom.Control = edName AnchorSideBottom.Side = asrBottom Left = 146 Height = 25 Top = 19 Width = 20 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Left = 4 BorderSpacing.InnerBorder = 4 Caption = '...' OnClick = btnNameMenuClick TabOrder = 1 end object btnExtMenu: TButton AnchorSideLeft.Control = edExt AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edExt AnchorSideBottom.Control = edExt AnchorSideBottom.Side = asrBottom Left = 146 Height = 25 Top = 74 Width = 20 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Left = 4 BorderSpacing.InnerBorder = 4 Caption = '...' OnClick = btnExtMenuClick TabOrder = 4 end object cmbNameStyle: TComboBox AnchorSideLeft.Control = btnNameMenu AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = btnNameMenu AnchorSideTop.Side = asrCenter AnchorSideRight.Control = gbMaska AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 170 Height = 29 Top = 17 Width = 164 BorderSpacing.Left = 4 BorderSpacing.Right = 4 ItemHeight = 0 OnChange = cmbNameStyleChange Style = csDropDownList TabOrder = 2 end object cmbExtensionStyle: TComboBox AnchorSideLeft.Control = btnExtMenu AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = btnExtMenu AnchorSideTop.Side = asrCenter AnchorSideRight.Control = gbMaska AnchorSideRight.Side = asrBottom Left = 170 Height = 29 Top = 72 Width = 164 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 4 BorderSpacing.Right = 4 ItemHeight = 0 OnChange = cmbNameStyleChange Style = csDropDownList TabOrder = 5 end end object gbFindReplace: TGroupBox AnchorSideLeft.Control = gbMaska AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = gbMaska AnchorSideRight.Control = gbCounter AnchorSideBottom.Side = asrBottom Left = 348 Height = 181 Top = 0 Width = 236 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Left = 6 Caption = 'Find && Replace' ChildSizing.TopBottomSpacing = 2 ClientHeight = 164 ClientWidth = 232 TabOrder = 2 object lbFind: TLabel AnchorSideLeft.Control = gbFindReplace AnchorSideTop.Control = gbFindReplace Left = 6 Height = 16 Top = 6 Width = 35 BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = '&Find...' FocusControl = edFind ParentColor = False end object lbReplace: TLabel AnchorSideLeft.Control = gbFindReplace AnchorSideTop.Control = edFind AnchorSideTop.Side = asrBottom Left = 6 Height = 16 Top = 55 Width = 56 BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = 'Re&place...' FocusControl = edReplace ParentColor = False end object edFind: TEdit AnchorSideLeft.Control = gbFindReplace AnchorSideTop.Control = lbFind AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbFindReplace AnchorSideRight.Side = asrBottom Left = 4 Height = 25 Top = 24 Width = 224 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 4 BorderSpacing.Top = 2 BorderSpacing.Right = 4 OnChange = cmbNameStyleChange TabOrder = 0 end object edReplace: TEdit AnchorSideLeft.Control = gbFindReplace AnchorSideTop.Control = lbReplace AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbFindReplace AnchorSideRight.Side = asrBottom Left = 4 Height = 25 Top = 73 Width = 224 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 4 BorderSpacing.Top = 2 BorderSpacing.Right = 4 OnChange = cmbNameStyleChange TabOrder = 1 end object cbRegExp: TCheckBox AnchorSideLeft.Control = gbFindReplace AnchorSideTop.Control = edReplace AnchorSideTop.Side = asrBottom Left = 4 Height = 22 Top = 108 Width = 143 BorderSpacing.Left = 4 BorderSpacing.Top = 10 Caption = 'Regular e&xpressions' OnChange = cbRegExpChange TabOrder = 2 end object cbUseSubs: TCheckBox AnchorSideLeft.Control = gbFindReplace AnchorSideTop.Control = cbRegExp AnchorSideTop.Side = asrBottom Left = 4 Height = 22 Top = 140 Width = 119 BorderSpacing.Left = 4 BorderSpacing.Top = 10 Caption = '&Use substitution' Enabled = False OnChange = cmbNameStyleChange TabOrder = 3 end end object gbCounter: TGroupBox AnchorSideLeft.Control = gbFindReplace AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = gbFindReplace AnchorSideRight.Control = pnlOptions AnchorSideRight.Side = asrBottom Left = 590 Height = 96 Top = 0 Width = 201 Anchors = [akTop, akRight] AutoSize = True BorderSpacing.Left = 6 Caption = 'Counter' ChildSizing.LeftRightSpacing = 6 ChildSizing.HorizontalSpacing = 5 ChildSizing.VerticalSpacing = 2 ChildSizing.EnlargeHorizontal = crsScaleChilds ChildSizing.EnlargeVertical = crsScaleChilds ChildSizing.ShrinkHorizontal = crsScaleChilds ChildSizing.ShrinkVertical = crsScaleChilds ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 ClientHeight = 79 ClientWidth = 197 TabOrder = 3 object lbStNb: TLabel Left = 6 Height = 16 Top = 4 Width = 80 BorderSpacing.CellAlignVertical = ccaCenter Caption = 'S&tart Number' FocusControl = edPoc ParentColor = False end object edPoc: TEdit Left = 91 Height = 25 Top = 0 Width = 100 MaxLength = 5 OnChange = edPocChange TabOrder = 0 Text = '1' end object lbInterval: TLabel Left = 6 Height = 16 Top = 31 Width = 80 BorderSpacing.CellAlignVertical = ccaCenter Caption = '&Interval' FocusControl = edInterval ParentColor = False end object edInterval: TEdit Left = 91 Height = 25 Top = 27 Width = 100 MaxLength = 5 OnChange = edIntervalChange TabOrder = 2 Text = '1' end object lbWidth: TLabel Left = 6 Height = 16 Top = 58 Width = 80 BorderSpacing.CellAlignVertical = ccaCenter Caption = '&Width' FocusControl = cmbxWidth ParentColor = False end object cmbxWidth: TComboBox Left = 91 Height = 25 Top = 54 Width = 100 ItemHeight = 0 ItemIndex = 0 Items.Strings = ( '01' '02' '03' '04' '05' '06' '07' '08' '09' '10' ) OnChange = cmbNameStyleChange Style = csDropDownList TabOrder = 1 Text = '01' end end object btnRename: TButton AnchorSideLeft.Control = btnRestore AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = btnRestore AnchorSideRight.Control = btnClose Left = 454 Height = 27 Top = 187 Width = 231 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Left = 6 Caption = '&Rename' Constraints.MinWidth = 100 Default = True OnClick = btnRenameClick TabOrder = 6 end object btnClose: TButton AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = btnRename AnchorSideRight.Control = gbCounter AnchorSideRight.Side = asrBottom Left = 691 Height = 27 Top = 187 Width = 100 Anchors = [akTop, akRight] AutoSize = True BorderSpacing.Left = 6 Cancel = True Caption = '&Close' Constraints.MinWidth = 100 OnClick = btnCloseClick TabOrder = 7 end object gbLog: TGroupBox AnchorSideLeft.Control = gbCounter AnchorSideTop.Control = gbCounter AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbCounter AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = gbFindReplace AnchorSideBottom.Side = asrBottom Left = 590 Height = 85 Top = 96 Width = 201 Anchors = [akTop, akLeft, akRight, akBottom] AutoSize = True Caption = 'Log Result' ClientHeight = 68 ClientWidth = 197 TabOrder = 4 object edFile: TEdit AnchorSideLeft.Control = gbLog AnchorSideTop.Control = cbLog AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbLog AnchorSideRight.Side = asrBottom Left = 4 Height = 25 Top = 28 Width = 189 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 4 BorderSpacing.Top = 4 BorderSpacing.Right = 4 TabOrder = 1 end object cbLog: TCheckBox AnchorSideLeft.Control = gbLog AnchorSideTop.Control = gbLog Left = 4 Height = 22 Top = 2 Width = 64 BorderSpacing.Left = 4 BorderSpacing.Top = 2 Caption = 'Ena&ble' OnClick = cbLogClick TabOrder = 0 end end object btnRestore: TButton AnchorSideLeft.Control = gbFindReplace AnchorSideTop.Control = gbFindReplace AnchorSideTop.Side = asrBottom Left = 348 Height = 27 Top = 187 Width = 100 AutoSize = True BorderSpacing.Top = 6 Caption = 'Reset &all' Constraints.MinWidth = 100 OnClick = btnRestoreClick TabOrder = 5 end object gbPresets: TGroupBox AnchorSideLeft.Control = gbMaska AnchorSideTop.Control = gbMaska AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbMaska AnchorSideRight.Side = asrBottom Left = 0 Height = 91 Top = 118 Width = 342 Anchors = [akTop, akLeft, akRight] AutoSize = True Caption = 'Presets' ClientHeight = 74 ClientWidth = 338 TabOrder = 1 object cbPresets: TComboBox AnchorSideLeft.Control = gbPresets AnchorSideTop.Control = gbPresets AnchorSideRight.Control = gbPresets AnchorSideRight.Side = asrBottom Left = 6 Height = 27 Top = 6 Width = 326 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 BorderSpacing.Top = 6 BorderSpacing.Right = 6 ItemHeight = 0 TabOrder = 0 end object btnLoadPreset: TButton AnchorSideLeft.Control = cbPresets AnchorSideTop.Control = cbPresets AnchorSideTop.Side = asrBottom Left = 6 Height = 27 Top = 41 Width = 100 AutoSize = True BorderSpacing.Top = 8 BorderSpacing.Bottom = 6 Caption = '&Load' Constraints.MinWidth = 100 OnClick = btnLoadPresetClick TabOrder = 1 end object btnSavePreset: TButton AnchorSideLeft.Control = cbPresets AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = btnLoadPreset Left = 119 Height = 27 Top = 41 Width = 100 AutoSize = True BorderSpacing.CellAlignHorizontal = ccaCenter BorderSpacing.CellAlignVertical = ccaCenter Caption = '&Save' Constraints.MinWidth = 100 OnClick = btnSavePresetClick TabOrder = 2 end object btnDeletePreset: TButton AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = btnSavePreset AnchorSideRight.Control = cbPresets AnchorSideRight.Side = asrBottom Left = 232 Height = 27 Top = 41 Width = 100 Anchors = [akTop, akRight] AutoSize = True Caption = '&Delete' Constraints.MinWidth = 100 OnClick = btnDeletePresetClick TabOrder = 3 end end end object ppNameMenu: TPopupMenu AutoPopup = False left = 784 top = 168 object miNextName: TMenuItem Caption = 'Name...' object miName: TMenuItem Caption = '[N] Name' OnClick = NameClick end object miNameX: TMenuItem Caption = '[Nx] Character at position x' OnClick = NameXClick end object miNameXX: TMenuItem Caption = '[Nx:y] Characters from position x to y' OnClick = NameXXClick end end object N1: TMenuItem Caption = '-' end object miNextExtension: TMenuItem Caption = 'Extension...' object Extension: TMenuItem Caption = '[E] Extension' OnClick = ExtensionClick end object miExtensionX: TMenuItem Caption = '[Ex] Character at position x' OnClick = ExtensionXClick end object miExtensionXX: TMenuItem Caption = '[Ex:y] Characters from position x to y' OnClick = ExtensionXXClick end end object N2: TMenuItem Caption = '-' end object miCounter: TMenuItem Caption = '[C] Counter' OnClick = CounterClick end object N3: TMenuItem Caption = '-' end object miNext: TMenuItem Caption = 'Time...' object miYear: TMenuItem Caption = '[Y] Year (2 digits)' OnClick = miYearClick end object miYear1: TMenuItem Caption = '[YYYY] Year (4 digits)' OnClick = miYear1Click end object miMonth: TMenuItem Caption = '[M] Month' OnClick = miMonthClick end object miMonth1: TMenuItem Caption = '[MM] Month (2 digits)' OnClick = miMonth1Click end object miMonth2: TMenuItem Caption = '[MMM] Month name (short, e.g., "jan")' OnClick = miMonth2Click end object miMonth3: TMenuItem Caption = '[MMMM] Month name (long, e.g., "january")' OnClick = miMonth3Click end object miDay: TMenuItem Caption = '[D] Day' OnClick = miDayClick end object miDay1: TMenuItem Caption = '[DD] Day (2 digits)' OnClick = miDay1Click end object miDay2: TMenuItem Caption = '[DDD] Day of the week (short, e.g., "mon")' OnClick = miDay2Click end object miDay3: TMenuItem Caption = '[DDDD] Day of the week (long, e.g., "monday")' OnClick = miDay3Click end object N4: TMenuItem Caption = '-' end object miHour: TMenuItem Caption = '[h] Hour' OnClick = miHourClick end object miHour1: TMenuItem Caption = '[hh] Hour (2 digits)' OnClick = miHour1Click end object miMinute: TMenuItem Caption = '[n] Minute' OnClick = miMinuteClick end object miMinute1: TMenuItem Caption = '[nn] Minute (2 digits)' OnClick = miMinute1Click end object miSecond: TMenuItem Caption = '[s] Second' OnClick = miSecondClick end object miSecond1: TMenuItem Caption = '[ss] Second (2 digits)' OnClick = miSecond1Click end end object N5: TMenuItem Caption = '-' end object miPlugin: TMenuItem Caption = 'Plugin' end end end doublecmd-0.5.8/src/uwcxmodule.pas0000644000175000017500000006463012217255050016206 0ustar alexxalexx{ Double commander ------------------------------------------------------------------------- Archive File support - class for manage WCX plugins (Version 2.20) Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uWCXmodule; {$mode objfpc}{$H+} interface uses LCLType, Classes, Dialogs, dynlibs, uWCXprototypes, WcxPlugin, Extension, DCClassesUtf8, DCBasicTypes, DCXmlConfig; Type TWCXOperation = (OP_EXTRACT, OP_PACK, OP_DELETE); { TWCXHeaderData } { Handles THeaderData and THeaderDataEx } TWCXHeader = class private function PCharLToUTF8(CharString: PChar; MaxSize: Integer): UTF8String; public ArcName: UTF8String; FileName: UTF8String; Flags, HostOS, FileCRC, FileTime, UnpVer, Method: Longint; FileAttr: TFileAttrs; PackSize, UnpSize: Int64; Cmt: UTF8String; CmtState: Longint; constructor Create(const Data: PHeaderData); overload; constructor Create(const Data: PHeaderDataEx); overload; constructor Create(const Data: PHeaderDataExW); overload; constructor Create; overload; // allows creating empty record end; { TWCXModule } TWCXModule = class private FModuleHandle: TLibHandle; // Handle to .DLL or .so FBackgroundFlags: Integer; public // module's functions { Mandatory } OpenArchive : TOpenArchive; ReadHeader : TReadHeader; ProcessFile : TProcessFile; CloseArchive : TCloseArchive; { Optional } ReadHeaderEx : TReadHeaderEx; PackFiles : TPackFiles; DeleteFiles : TDeleteFiles; GetPackerCaps : TGetPackerCaps; ConfigurePacker : TConfigurePacker; SetChangeVolProc : TSetChangeVolProc; SetProcessDataProc : TSetProcessDataProc; StartMemPack : TStartMemPack; PackToMem : TPackToMem; DoneMemPack : TDoneMemPack; CanYouHandleThisFile : TCanYouHandleThisFile; PackSetDefaultParams : TPackSetDefaultParams; PkSetCryptCallback : TPkSetCryptCallback; GetBackgroundFlags: TGetBackgroundFlags; { Unicode } OpenArchiveW: TOpenArchiveW; ReadHeaderExW: TReadHeaderExW; ProcessFileW: TProcessFileW; SetChangeVolProcW: TSetChangeVolProcW; SetProcessDataProcW:TSetProcessDataProcW; PackFilesW: TPackFilesW; DeleteFilesW: TDeleteFilesW; StartMemPackW: TStartMemPackW; CanYouHandleThisFileW: TCanYouHandleThisFileW; PkSetCryptCallbackW : TPkSetCryptCallbackW; { Extension API } ExtensionInitialize: TExtensionInitializeProc; ExtensionFinalize: TExtensionFinalizeProc; constructor Create; destructor Destroy; override; { Reads WCX header using ReadHeaderEx if available or ReadHeader. } function ReadWCXHeader(hArcData: TArcHandle; out HeaderData: TWCXHeader): Integer; function OpenArchiveHandle(FileName: String; anOpenMode: Longint; out OpenResult: Longint): TArcHandle; function WcxProcessFile(hArcData: TArcHandle; Operation: LongInt; DestPath, DestName: UTF8String): LongInt; function WcxPackFiles(PackedFile, SubPath, SrcPath, AddList: UTF8String; Flags: LongInt): LongInt; function WcxDeleteFiles(PackedFile, DeleteList: UTF8String): LongInt; function WcxCanYouHandleThisFile(FileName: UTF8String): Boolean; function WcxStartMemPack(Options: LongInt; FileName: UTF8String): TArcHandle; procedure WcxSetChangeVolProc(hArcData: TArcHandle; ChangeVolProcA: TChangeVolProc; ChangeVolProcW: TChangeVolProcW); procedure WcxSetProcessDataProc(hArcData: TArcHandle; ProcessDataProcA: TProcessDataProc; ProcessDataProcW: TProcessDataProcW); procedure WcxSetCryptCallback(CryptoNr, Flags: Integer; PkCryptProcA: TPkCryptProc; PkCryptProcW: TPkCryptProcW); function LoadModule(const sName:String):Boolean; {Load WCX plugin} procedure UnloadModule; {UnLoad WCX plugin} procedure VFSConfigure(Parent: HWND); function GetPluginCapabilities: Integer; function IsLoaded: Boolean; property BackgroundFlags: Integer read FBackgroundFlags write FBackgroundFlags; end; { TWCXModuleList } TWCXModuleList = class(TStringList) private function GetAEnabled(Index: Integer): Boolean; function GetAExt(Index: Integer): String; function GetAFileName(Index: Integer): String; function GetAFlags(Index: Integer): PtrInt; procedure SetAEnabled(Index: Integer; const AValue: Boolean); procedure SetAFileName(Index: Integer; const AValue: String); procedure SetAFlags(Index: Integer; const AValue: PtrInt); procedure SetExt(Index: Integer; const AValue: String); public procedure Load(Ini: TIniFileEx); procedure Load(AConfig: TXmlConfig; ANode: TXmlNode); procedure Save(Ini: TIniFileEx); procedure Save(AConfig: TXmlConfig; ANode: TXmlNode); function Add(Ext: String; Flags: PtrInt; FileName: String): Integer; reintroduce; function FindFirstEnabledByName(Name: String): Integer; function Find(const aFileName, aExt: String): Integer; overload; property FileName[Index: Integer]: String read GetAFileName write SetAFileName; property Flags[Index: Integer]: PtrInt read GetAFlags write SetAFlags; property Ext[Index: Integer]: String read GetAExt write SetExt; property Enabled[Index: Integer]: Boolean read GetAEnabled write SetAEnabled; end; function GetErrorMsg(iErrorMsg : Integer): String; function WcxFileTimeToDateTime(Header: TWCXHeader): TDateTime; implementation uses SysUtils, uLng, fDialogBox, uGlobsPaths, FileUtil, uOSUtils, DCOSUtils, DCDateTimeUtils, uDebug; const WcxIniFileName = 'wcx.ini'; constructor TWCXModule.Create; begin FModuleHandle := 0; end; destructor TWCXModule.Destroy; begin if IsLoaded then begin if Assigned(ExtensionFinalize) then ExtensionFinalize(nil); //------------------------------------------------------ UnloadModule; end; end; function TWCXModule.OpenArchiveHandle(FileName: String; anOpenMode: Longint; out OpenResult: Longint): TArcHandle; var ArcFile: tOpenArchiveData; ArcFileW: tOpenArchiveDataW; AnsiFileName: AnsiString; WideFileName: WideString; begin if (anOpenMode >= PK_OM_LIST) and (anOpenMode <= PK_OM_EXTRACT) then begin if Assigned(OpenArchiveW) then begin FillChar(ArcFileW, SizeOf(ArcFileW), #0); WideFileName := UTF8Decode(FileName); ArcFileW.ArcName := PWideChar(WideFileName); // Pointer to local variable. ArcFileW.OpenMode := anOpenMode; Result := OpenArchiveW(ArcFileW); if Result = 0 then OpenResult := ArcFileW.OpenResult else OpenResult := E_SUCCESS; end else if Assigned(OpenArchive) then begin FillChar(ArcFile, SizeOf(ArcFile), #0); AnsiFileName := mbFileNameToSysEnc(FileName); ArcFile.ArcName := PAnsiChar(AnsiFileName); // Pointer to local variable. ArcFile.OpenMode := anOpenMode; Result := OpenArchive(ArcFile); if Result = 0 then OpenResult := ArcFile.OpenResult else OpenResult := E_SUCCESS; end; end else raise Exception.Create('Invalid WCX open mode'); end; function TWCXModule.WcxProcessFile(hArcData: TArcHandle; Operation: LongInt; DestPath, DestName: UTF8String): LongInt; begin if Assigned(ProcessFileW) then begin if DestPath = EmptyStr then Result:= ProcessFileW(hArcData, Operation, nil, PWideChar(UTF8Decode(DestName))) else Result:= ProcessFileW(hArcData, Operation, PWideChar(UTF8Decode(DestPath)), PWideChar(UTF8Decode(DestName))); end else if Assigned(ProcessFile) then begin if DestPath = EmptyStr then Result:= ProcessFile(hArcData, Operation, nil, PAnsiChar(UTF8ToSys(DestName))) else Result:= ProcessFile(hArcData, Operation, PAnsiChar(UTF8ToSys(DestPath)), PAnsiChar(UTF8ToSys(DestName))); end; end; function TWCXModule.WcxPackFiles(PackedFile, SubPath, SrcPath, AddList: UTF8String; Flags: LongInt): LongInt; begin if Assigned(PackFilesW) then begin if SubPath = EmptyStr then Result:= PackFilesW(PWideChar(UTF8Decode(PackedFile)), nil, PWideChar(UTF8Decode(SrcPath)), PWideChar(UTF8Decode(AddList)), Flags) else Result:= PackFilesW(PWideChar(UTF8Decode(PackedFile)), PWideChar(UTF8Decode(SubPath)), PWideChar(UTF8Decode(SrcPath)), PWideChar(UTF8Decode(AddList)), Flags); end else if Assigned(PackFiles) then begin if SubPath = EmptyStr then Result:= PackFiles(PAnsiChar(UTF8ToSys(PackedFile)), nil, PAnsiChar(UTF8ToSys(SrcPath)), PAnsiChar(UTF8ToSys(AddList)), Flags) else Result:= PackFiles(PAnsiChar(UTF8ToSys(PackedFile)), PAnsiChar(UTF8ToSys(SubPath)), PAnsiChar(UTF8ToSys(SrcPath)), PAnsiChar(UTF8ToSys(AddList)), Flags); end; end; function TWCXModule.WcxDeleteFiles(PackedFile, DeleteList: UTF8String): LongInt; begin if Assigned(DeleteFilesW) then Result:= DeleteFilesW(PWideChar(UTF8Decode(PackedFile)), PWideChar(UTF8Decode(DeleteList))) else if Assigned(DeleteFiles) then Result:= DeleteFiles(PAnsiChar(UTF8ToSys(PackedFile)), PAnsiChar(UTF8ToSys(DeleteList))); end; function TWCXModule.WcxCanYouHandleThisFile(FileName: UTF8String): Boolean; begin if Assigned(CanYouHandleThisFileW) then Result:= CanYouHandleThisFileW(PWideChar(UTF8Decode(FileName))) else if Assigned(CanYouHandleThisFile) then Result:= CanYouHandleThisFile(PAnsiChar(UTF8ToSys(FileName))); end; function TWCXModule.WcxStartMemPack(Options: LongInt; FileName: UTF8String): TArcHandle; begin if Assigned(StartMemPackW) then Result:= StartMemPackW(Options, PWideChar(UTF8Decode(FileName))) else if Assigned(StartMemPack) then Result:= StartMemPack(Options, PAnsiChar(UTF8ToSys(FileName))); end; procedure TWCXModule.WcxSetChangeVolProc(hArcData: TArcHandle; ChangeVolProcA: TChangeVolProc; ChangeVolProcW: TChangeVolProcW); begin if Assigned(SetChangeVolProcW) then SetChangeVolProcW(hArcData, ChangeVolProcW) else if Assigned(SetChangeVolProc) then SetChangeVolProc(hArcData, ChangeVolProcA); end; procedure TWCXModule.WcxSetProcessDataProc(hArcData: TArcHandle; ProcessDataProcA: TProcessDataProc; ProcessDataProcW: TProcessDataProcW); begin if Assigned(SetProcessDataProcW) then SetProcessDataProcW(hArcData, ProcessDataProcW) else if Assigned(SetProcessDataProc) then SetProcessDataProc(hArcData, ProcessDataProcA); end; procedure TWCXModule.WcxSetCryptCallback(CryptoNr, Flags: Integer; PkCryptProcA: TPkCryptProc; PkCryptProcW: TPkCryptProcW); begin if Assigned(PkSetCryptCallbackW) then PkSetCryptCallbackW(PkCryptProcW, CryptoNr, Flags) else if Assigned(PkSetCryptCallback) then PkSetCryptCallback(PkCryptProcA, CryptoNr, Flags); end; function TWCXModule.LoadModule(const sName:String):Boolean; var PackDefaultParamStruct : TPackDefaultParamStruct; StartupInfo: TExtensionStartupInfo; begin FModuleHandle := mbLoadLibrary(sName); if FModuleHandle = 0 then Exit(False); DCDebug('WCX module loaded ' + sName + ' at ' + hexStr(Pointer(FModuleHandle))); // Mandatory functions OpenArchive:= TOpenArchive(GetProcAddress(FModuleHandle,'OpenArchive')); ReadHeader:= TReadHeader(GetProcAddress(FModuleHandle,'ReadHeader')); ReadHeaderEx:= TReadHeaderEx(GetProcAddress(FModuleHandle,'ReadHeaderEx')); ProcessFile:= TProcessFile(GetProcAddress(FModuleHandle,'ProcessFile')); CloseArchive:= TCloseArchive(GetProcAddress(FModuleHandle,'CloseArchive')); // Unicode OpenArchiveW:= TOpenArchiveW(GetProcAddress(FModuleHandle,'OpenArchiveW')); ReadHeaderExW:= TReadHeaderExW(GetProcAddress(FModuleHandle,'ReadHeaderExW')); ProcessFileW:= TProcessFileW(GetProcAddress(FModuleHandle,'ProcessFileW')); Result:= (OpenArchive <> nil) and (ReadHeader <> nil) and (ProcessFile <> nil); if (Result = False) then begin OpenArchive:= nil; ReadHeader:= nil; ProcessFile:= nil; Result:= (OpenArchiveW <> nil) and (ReadHeaderExW <> nil) and (ProcessFileW <> nil); end; if (Result = False) or (CloseArchive = nil) then begin OpenArchiveW:= nil; ReadHeaderExW:= nil; ProcessFileW:= nil; CloseArchive:= nil; Exit(False); end; // Optional functions PackFiles:= TPackFiles(GetProcAddress(FModuleHandle,'PackFiles')); DeleteFiles:= TDeleteFiles(GetProcAddress(FModuleHandle,'DeleteFiles')); GetPackerCaps:= TGetPackerCaps(GetProcAddress(FModuleHandle,'GetPackerCaps')); ConfigurePacker:= TConfigurePacker(GetProcAddress(FModuleHandle,'ConfigurePacker')); SetChangeVolProc:= TSetChangeVolProc(GetProcAddress(FModuleHandle,'SetChangeVolProc')); SetProcessDataProc:= TSetProcessDataProc(GetProcAddress(FModuleHandle,'SetProcessDataProc')); StartMemPack:= TStartMemPack(GetProcAddress(FModuleHandle,'StartMemPack')); PackToMem:= TPackToMem(GetProcAddress(FModuleHandle,'PackToMem')); DoneMemPack:= TDoneMemPack(GetProcAddress(FModuleHandle,'DoneMemPack')); CanYouHandleThisFile:= TCanYouHandleThisFile(GetProcAddress(FModuleHandle,'CanYouHandleThisFile')); PackSetDefaultParams:= TPackSetDefaultParams(GetProcAddress(FModuleHandle,'PackSetDefaultParams')); PkSetCryptCallback:= TPkSetCryptCallback(GetProcAddress(FModuleHandle,'PkSetCryptCallback')); GetBackgroundFlags:= TGetBackgroundFlags(GetProcAddress(FModuleHandle,'GetBackgroundFlags')); // Unicode SetChangeVolProcW:= TSetChangeVolProcW(GetProcAddress(FModuleHandle,'SetChangeVolProcW')); SetProcessDataProcW:= TSetProcessDataProcW(GetProcAddress(FModuleHandle,'SetProcessDataProcW')); PackFilesW:= TPackFilesW(GetProcAddress(FModuleHandle,'PackFilesW')); DeleteFilesW:= TDeleteFilesW(GetProcAddress(FModuleHandle,'DeleteFilesW')); StartMemPackW:= TStartMemPackW(GetProcAddress(FModuleHandle,'StartMemPackW')); CanYouHandleThisFileW:= TCanYouHandleThisFileW(GetProcAddress(FModuleHandle,'CanYouHandleThisFileW')); PkSetCryptCallbackW:= TPkSetCryptCallbackW(GetProcAddress(FModuleHandle,'PkSetCryptCallbackW')); // Extension API ExtensionInitialize:= TExtensionInitializeProc(GetProcAddress(FModuleHandle,'ExtensionInitialize')); ExtensionFinalize:= TExtensionFinalizeProc(GetProcAddress(FModuleHandle,'ExtensionFinalize')); if Assigned(PackSetDefaultParams) then begin with PackDefaultParamStruct do begin Size := SizeOf(PackDefaultParamStruct); PluginInterfaceVersionLow := 10; PluginInterfaceVersionHi := 2; DefaultIniName := mbFileNameToSysEnc(gpCfgDir + WcxIniFileName); end; PackSetDefaultParams(@PackDefaultParamStruct); end; if not Assigned(GetBackgroundFlags) then FBackgroundFlags:= 0 else FBackgroundFlags:= GetBackgroundFlags(); // Extension API if Assigned(ExtensionInitialize) then begin FillByte(StartupInfo, SizeOf(TExtensionStartupInfo), 0); with StartupInfo do begin StructSize:= SizeOf(TExtensionStartupInfo); PluginDir:= ExtractFilePath(sName); PluginConfDir:= gpCfgDir; InputBox:= @fDialogBox.InputBox; MessageBox:= @fDialogBox.MessageBox; DialogBoxLFM:= @fDialogBox.DialogBoxLFM; DialogBoxLRS:= @fDialogBox.DialogBoxLRS; DialogBoxLFMFile:= @fDialogBox.DialogBoxLFMFile; SendDlgMsg:= @fDialogBox.SendDlgMsg; end; ExtensionInitialize(@StartupInfo); end; end; procedure TWCXModule.UnloadModule; begin if FModuleHandle <> 0 then begin {$IF (not DEFINED(LINUX)) or ((FPC_VERSION > 2) or ((FPC_VERSION=2) and (FPC_RELEASE >= 5)))} FreeLibrary(FModuleHandle); {$ENDIF} FModuleHandle := 0; end; // Mandatory OpenArchive:= nil; ReadHeader:= nil; ReadHeaderEx:= nil; ProcessFile:= nil; CloseArchive:= nil; // Optional PackFiles:= nil; DeleteFiles:= nil; GetPackerCaps:= nil; ConfigurePacker:= nil; SetChangeVolProc:= nil; SetProcessDataProc:= nil; StartMemPack:= nil; PackToMem:= nil; DoneMemPack:= nil; CanYouHandleThisFile:= nil; PackSetDefaultParams:= nil; PkSetCryptCallback:= nil; GetBackgroundFlags:= nil; // Unicode OpenArchiveW:= nil; ReadHeaderExW:= nil; ProcessFileW:= nil; SetChangeVolProcW:= nil; SetProcessDataProcW:= nil; PackFilesW:= nil; DeleteFilesW:= nil; StartMemPackW:= nil; CanYouHandleThisFileW:= nil; PkSetCryptCallbackW:= nil; // Extension API ExtensionInitialize:= nil; ExtensionFinalize:= nil; end; function GetErrorMsg(iErrorMsg : Integer): String; begin case iErrorMsg of E_END_ARCHIVE : Result := rsMsgErrEndArchive; E_NO_MEMORY : Result := rsMsgErrNoMemory; E_BAD_DATA : Result := rsMsgErrBadData; E_BAD_ARCHIVE : Result := rsMsgErrBadArchive; E_UNKNOWN_FORMAT : Result := rsMsgErrUnknownFormat; E_EOPEN : Result := rsMsgErrEOpen; E_ECREATE : Result := rsMsgErrECreate; E_ECLOSE : Result := rsMsgErrEClose; E_EREAD : Result := rsMsgErrERead; E_EWRITE : Result := rsMsgErrEWrite; E_SMALL_BUF : Result := rsMsgErrSmallBuf; E_EABORTED : Result := rsMsgErrEAborted; E_NO_FILES : Result := rsMsgErrNoFiles; E_TOO_MANY_FILES : Result := rsMsgErrTooManyFiles; E_NOT_SUPPORTED : Result := rsMsgErrNotSupported; else Result := IntToStr(iErrorMsg); end; end; procedure TWCXModule.VFSConfigure(Parent: HWND); begin if Assigned(ConfigurePacker) then ConfigurePacker(Parent, FModuleHandle); end; function TWCXModule.ReadWCXHeader(hArcData: TArcHandle; out HeaderData: TWCXHeader): Integer; var ArcHeader : THeaderData; ArcHeaderEx : THeaderDataEx; ArcHeaderExW : THeaderDataExW; begin HeaderData := nil; if Assigned(ReadHeaderExW) then begin FillChar(ArcHeaderExW, SizeOf(ArcHeaderExW), #0); Result := ReadHeaderExW(hArcData, ArcHeaderExW); if Result = E_SUCCESS then begin HeaderData := TWCXHeader.Create(PHeaderDataExW(@ArcHeaderExW)); end; end else if Assigned(ReadHeaderEx) then begin FillChar(ArcHeaderEx, SizeOf(ArcHeaderEx), #0); Result := ReadHeaderEx(hArcData, ArcHeaderEx); if Result = E_SUCCESS then begin HeaderData := TWCXHeader.Create(PHeaderDataEx(@ArcHeaderEx)); end; end else if Assigned(ReadHeader) then begin FillChar(ArcHeader, SizeOf(ArcHeader), #0); Result := ReadHeader(hArcData, ArcHeader); if Result = E_SUCCESS then begin HeaderData := TWCXHeader.Create(PHeaderData(@ArcHeader)); end; end else begin Result := E_NOT_SUPPORTED; end; end; function TWCXModule.GetPluginCapabilities: Integer; begin if Assigned(GetPackerCaps) then Result := GetPackerCaps() else Result := 0; end; function TWCXModule.IsLoaded: Boolean; begin Result := (FModuleHandle <> 0); end; { TWCXModuleList } function TWCXModuleList.GetAEnabled(Index: Integer): Boolean; begin Result:= Boolean(PtrInt(Objects[Index])); end; function TWCXModuleList.GetAExt(Index: Integer): String; begin Result:= Names[Index]; end; function TWCXModuleList.GetAFileName(Index: Integer): String; var sCurrPlugin: String; iPosComma : Integer; begin sCurrPlugin:= ValueFromIndex[Index]; iPosComma:= Pos(',', sCurrPlugin); //get file name Result:= Copy(sCurrPlugin, iPosComma + 1, Length(sCurrPlugin) - iPosComma); end; function TWCXModuleList.GetAFlags(Index: Integer): PtrInt; var sCurrPlugin: String; iPosComma : Integer; begin sCurrPlugin:= ValueFromIndex[Index]; iPosComma:= Pos(',', sCurrPlugin); // get packer flags Result:= StrToInt(Copy(sCurrPlugin, 1, iPosComma-1)); end; procedure TWCXModuleList.SetAEnabled(Index: Integer; const AValue: Boolean); begin Objects[Index]:= TObject(PtrInt(AValue)); end; procedure TWCXModuleList.SetAFileName(Index: Integer; const AValue: String); begin ValueFromIndex[Index]:= IntToStr(GetAFlags(Index)) + #44 + AValue; end; procedure TWCXModuleList.SetAFlags(Index: Integer; const AValue: PtrInt); begin ValueFromIndex[Index]:= IntToStr(AValue) + #44 + GetAFileName(Index); end; procedure TWCXModuleList.SetExt(Index: Integer; const AValue: String); var sValue : String; begin sValue:= ValueFromIndex[Index]; Self[Index]:= AValue + '=' + sValue; end; procedure TWCXModuleList.Load(Ini: TIniFileEx); var I: Integer; sCurrPlugin, sValue: String; begin Ini.ReadSectionRaw('PackerPlugins', Self); for I:= 0 to Count - 1 do if Pos('#', Names[I]) = 0 then begin Enabled[I]:= True; end else begin sCurrPlugin:= Names[I]; sValue:= ValueFromIndex[I]; Self[I]:= Copy(sCurrPlugin, 2, Length(sCurrPlugin) - 1) + '=' + sValue; Enabled[I]:= False; end; end; procedure TWCXModuleList.Load(AConfig: TXmlConfig; ANode: TXmlNode); var I: Integer; AExt, APath: String; AFlags: Integer; begin Clear; ANode := ANode.FindNode('WcxPlugins'); if Assigned(ANode) then begin ANode := ANode.FirstChild; while Assigned(ANode) do begin if ANode.CompareName('WcxPlugin') = 0 then begin if AConfig.TryGetValue(ANode, 'ArchiveExt', AExt) and AConfig.TryGetValue(ANode, 'Path', APath) then begin AFlags := AConfig.GetValue(ANode, 'Flags', 0); I := Add(AExt, AFlags, APath); Enabled[I] := AConfig.GetAttr(ANode, 'Enabled', True); end else DCDebug('Invalid entry in configuration: ' + AConfig.GetPathFromNode(ANode) + '.'); end; ANode := ANode.NextSibling; end; end; end; procedure TWCXModuleList.Save(Ini: TIniFileEx); var I: Integer; begin Ini.EraseSection('PackerPlugins'); for I := 0 to Count - 1 do begin if Enabled[I] then begin Ini.WriteString('PackerPlugins', Names[I], ValueFromIndex[I]) end else begin Ini.WriteString('PackerPlugins', '#' + Names[I], ValueFromIndex[I]); end; end; end; procedure TWCXModuleList.Save(AConfig: TXmlConfig; ANode: TXmlNode); var I: Integer; SubNode: TXmlNode; begin ANode := AConfig.FindNode(ANode, 'WcxPlugins', True); AConfig.ClearNode(ANode); for I := 0 to Count - 1 do begin SubNode := AConfig.AddNode(ANode, 'WcxPlugin'); AConfig.SetAttr(SubNode, 'Enabled', Enabled[I]); AConfig.AddValue(SubNode, 'ArchiveExt', Ext[I]); AConfig.AddValue(SubNode, 'Path', FileName[I]); AConfig.AddValue(SubNode, 'Flags', Flags[I]); end; end; function TWCXModuleList.Add(Ext: String; Flags: PtrInt; FileName: String): Integer; begin Result:= AddObject(Ext + '=' + IntToStr(Flags) + #44 + FileName, TObject(True)); end; function TWCXModuleList.FindFirstEnabledByName(Name: String): Integer; begin Result:=0; while Result < Count do begin if Enabled[Result] and (DoCompareText(Names[Result], Name) = 0) then Exit else Result := Result + 1; end; if Result=Count then Result:=-1; end; function TWCXModuleList.Find(const aFileName, aExt: String): Integer; begin Result:=0; while Result < Count do begin if (DoCompareText(Ext[Result], aExt) = 0) and (DoCompareText(FileName[Result], aFileName) = 0) then Exit else Result := Result + 1; end; if Result=Count then Result:=-1; end; { TWCXHeader } constructor TWCXHeader.Create(const Data: PHeaderData); begin ArcName := PCharLToUTF8(Data^.ArcName, SizeOf(Data^.ArcName)); FileName := PCharLToUTF8(Data^.FileName, SizeOf(Data^.FileName)); Flags := Data^.Flags; HostOS := Data^.HostOS; FileCRC := Data^.FileCRC; FileTime := Data^.FileTime; UnpVer := Data^.UnpVer; Method := Data^.Method; FileAttr := TFileAttrs(Data^.FileAttr); PackSize := Data^.PackSize; UnpSize := Data^.UnpSize; if Assigned(Data^.CmtBuf) then Cmt := PCharLToUTF8(Data^.CmtBuf, Data^.CmtSize); CmtState := Data^.CmtState; end; constructor TWCXHeader.Create(const Data: PHeaderDataEx); function Combine64(High, Low: LongWord): Int64; begin Result := Int64(High) shl (SizeOf(Int64) shl 2); Result := Result + Int64(Low); end; begin ArcName := PCharLToUTF8(Data^.ArcName, SizeOf(Data^.ArcName)); FileName := PCharLToUTF8(Data^.FileName, SizeOf(Data^.FileName)); Flags := Data^.Flags; HostOS := Data^.HostOS; FileCRC := Data^.FileCRC; FileTime := Data^.FileTime; UnpVer := Data^.UnpVer; Method := Data^.Method; FileAttr := TFileAttrs(Data^.FileAttr); PackSize := Combine64(Data^.PackSizeHigh, Data^.PackSize); UnpSize := Combine64(Data^.UnpSizeHigh, Data^.UnpSize); if Assigned(Data^.CmtBuf) then Cmt := PCharLToUTF8(Data^.CmtBuf, Data^.CmtSize); CmtState := Data^.CmtState; end; constructor TWCXHeader.Create(const Data: PHeaderDataExW); function Combine64(High, Low: LongWord): Int64; begin Result := Int64(High) shl (SizeOf(Int64) shl 2); Result := Result + Int64(Low); end; begin ArcName := UTF8Encode(WideString(Data^.ArcName)); FileName := UTF8Encode(WideString(Data^.FileName)); Flags := Data^.Flags; HostOS := Data^.HostOS; FileCRC := Data^.FileCRC; FileTime := Data^.FileTime; UnpVer := Data^.UnpVer; Method := Data^.Method; FileAttr := TFileAttrs(Data^.FileAttr); PackSize := Combine64(Data^.PackSizeHigh, Data^.PackSize); UnpSize := Combine64(Data^.UnpSizeHigh, Data^.UnpSize); if Assigned(Data^.CmtBuf) then Cmt := PCharLToUTF8(Data^.CmtBuf, Data^.CmtSize); CmtState := Data^.CmtState; end; constructor TWCXHeader.Create; begin end; function TWCXHeader.PCharLToUTF8(CharString: PChar; MaxSize: Integer): UTF8String; var NameLength: Integer; TempString: AnsiString; begin NameLength := strlen(CharString); if NameLength > MaxSize then NameLength := MaxSize; SetString(TempString, CharString, NameLength); Result := SysToUTF8(TempString); end; // -- function WcxFileTimeToDateTime(Header: TWCXHeader): TDateTime; begin {$IF DEFINED(MSWINDOWS)} Result := DosFileTimeToDateTime(Header.FileTime); {$ELSEIF DEFINED(UNIX)} {$PUSH}{$R-} Result := FileTimeToDateTime(Header.FileTime); {$POP} {$ELSE} Result := 0; {$ENDIF} end; end. doublecmd-0.5.8/src/fmain.lfm0000644000175000017500000036774312215301020015075 0ustar alexxalexxobject frmMain: TfrmMain Left = 378 Height = 370 Top = 100 Width = 760 Caption = 'Double Commander' ClientHeight = 370 ClientWidth = 760 KeyPreview = True OnClose = frmMainClose OnCloseQuery = FormCloseQuery OnCreate = FormCreate OnDestroy = FormDestroy OnKeyDown = FormKeyDown OnKeyPress = FormKeyPress OnShow = frmMainShow OnUTF8KeyPress = FormUTF8KeyPress OnWindowStateChange = FormWindowStateChange SessionProperties = 'nbConsole.Height;seLogWindow.Height' ShowHint = True ShowInTaskBar = stAlways LCLVersion = '1.0.1.3' Visible = True object MainToolBar: TKASToolBar AnchorSideTop.Control = Owner Left = 0 Height = 20 Top = 0 Width = 760 AutoSize = True Constraints.MinHeight = 20 Flat = True TabOrder = 2 OnDragDrop = MainToolBarDragDrop OnDragOver = MainToolBarDragOver OnMouseUp = MainToolBarMouseUp OnLoadButtonGlyph = MainToolBarLoadButtonGlyph OnToolButtonMouseDown = MainToolBarToolButtonMouseDown OnToolButtonMouseUp = MainToolBarToolButtonMouseUp OnToolButtonDragDrop = MainToolBarToolButtonDragDrop OnToolButtonDragOver = MainToolBarToolButtonDragOver OnToolItemShortcutsHint = MainToolBarToolItemShortcutsHint GlyphSize = 16 end object pnlDisk: TPanel AnchorSideTop.Control = MainToolBar Left = 0 Height = 26 Top = 20 Width = 760 Align = alTop AutoSize = True ClientHeight = 26 ClientWidth = 760 FullRepaint = False TabOrder = 0 Visible = False object pnlDskLeft: TPanel AnchorSideLeft.Control = pnlDisk AnchorSideTop.Control = pnlDisk Left = 1 Height = 24 Top = 1 Width = 170 BevelOuter = bvNone ClientHeight = 24 ClientWidth = 170 TabOrder = 0 Visible = False object dskLeft: TKASToolBar Left = 0 Height = 20 Top = 0 Width = 170 AutoSize = True Constraints.MinHeight = 20 Flat = True ShowCaptions = True TabOrder = 0 OnResize = dskLeftResize OnToolButtonClick = dskLeftToolButtonClick OnToolButtonMouseUp = dskToolButtonMouseUp OnToolButtonDragDrop = dskLeftRightToolButtonDragDrop RadioToolBar = True GlyphSize = 16 end end object pnlDskRight: TPanel AnchorSideTop.Control = pnlDisk AnchorSideRight.Control = pnlDisk AnchorSideRight.Side = asrBottom Left = 171 Height = 24 Top = 1 Width = 588 Anchors = [akTop, akRight] BevelOuter = bvNone ClientHeight = 24 ClientWidth = 588 TabOrder = 1 Visible = False object dskRight: TKASToolBar Left = 0 Height = 20 Top = 0 Width = 588 AutoSize = True Constraints.MinHeight = 20 Flat = True ShowCaptions = True TabOrder = 0 OnResize = dskRightResize OnToolButtonClick = dskRightToolButtonClick OnToolButtonMouseUp = dskToolButtonMouseUp OnToolButtonDragDrop = dskLeftRightToolButtonDragDrop RadioToolBar = True GlyphSize = 16 end end end object pnlNotebooks: TPanel Left = 0 Height = 157 Top = 46 Width = 760 Align = alClient ClientHeight = 157 ClientWidth = 760 FullRepaint = False TabOrder = 1 OnResize = pnlNotebooksResize object pnlLeft: TPanel Left = 1 Height = 155 Top = 1 Width = 511 Align = alLeft BevelOuter = bvNone ClientHeight = 155 ClientWidth = 511 TabOrder = 0 OnDblClick = pnlLeftRightDblClick OnResize = pnlLeftResize object pnlDiskLeftInner: TPanel Left = 0 Height = 10 Top = 0 Width = 511 Align = alTop BevelOuter = bvNone TabOrder = 1 Visible = False end object pnlLeftTools: TPanel Left = 0 Height = 25 Top = 10 Width = 511 Align = alTop AutoSize = True BevelOuter = bvNone ClientHeight = 25 ClientWidth = 511 TabOrder = 0 object btnLeftDrive: TSpeedButton Left = 0 Height = 25 Top = 0 Width = 48 Action = actLeftOpenDrives Align = alLeft Constraints.MinHeight = 24 NumGlyphs = 0 OnMouseUp = btnDriveMouseUp end object btnLeftHome: TSpeedButton Left = 465 Height = 25 Hint = 'Go to home directory' Top = 0 Width = 23 Align = alRight Caption = '~' NumGlyphs = 0 OnClick = btnLeftClick end object btnLeftUp: TSpeedButton Left = 442 Height = 25 Hint = 'Go to parent directory' Top = 0 Width = 23 Align = alRight Caption = '..' NumGlyphs = 0 OnClick = btnLeftClick end object btnLeftRoot: TSpeedButton Left = 419 Height = 25 Hint = 'Go to root directory' Top = 0 Width = 23 Align = alRight Caption = '/' NumGlyphs = 0 OnClick = btnLeftClick end object btnLeftDirectoryHotlist: TSpeedButton Left = 396 Height = 25 Hint = 'Directory hotlist' Top = 0 Width = 23 Align = alRight Caption = '*' NumGlyphs = 0 OnClick = btnLeftDirectoryHotlistClick end object btnLeftEqualRight: TSpeedButton Left = 488 Height = 25 Hint = 'Show current directory of the right panel in the left panel' Top = 0 Width = 23 Action = actLeftEqualRight Align = alRight Caption = '<' NumGlyphs = 0 end object pbxLeftDrive: TPaintBox AnchorSideLeft.Control = lblLeftDriveInfo AnchorSideTop.Control = lblLeftDriveInfo AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblLeftDriveInfo AnchorSideRight.Side = asrBottom Left = 52 Height = 10 Top = 1 Width = 342 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 2 BorderSpacing.Right = 2 OnPaint = sboxDrivePaint end object lblLeftDriveInfo: TLabel AnchorSideLeft.Control = btnLeftDrive AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlLeftTools AnchorSideRight.Side = asrBottom Left = 50 Height = 1 Top = 0 Width = 346 Alignment = taCenter Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 2 BorderSpacing.Right = 2 ParentColor = False OnDblClick = lblDriveInfoDblClick end end end object pnlRight: TPanel Left = 512 Height = 155 Top = 1 Width = 247 Align = alClient BevelOuter = bvNone ClientHeight = 155 ClientWidth = 247 TabOrder = 1 OnDblClick = pnlLeftRightDblClick OnResize = pnlRightResize object pnlDiskRightInner: TPanel Left = 0 Height = 10 Top = 0 Width = 247 Align = alTop BevelOuter = bvNone TabOrder = 1 Visible = False end object pnlRightTools: TPanel Left = 0 Height = 25 Top = 10 Width = 247 Align = alTop AutoSize = True BevelOuter = bvNone ClientHeight = 25 ClientWidth = 247 TabOrder = 0 object btnRightDrive: TSpeedButton Left = 0 Height = 25 Top = 0 Width = 48 Action = actRightOpenDrives Align = alLeft Constraints.MinHeight = 24 NumGlyphs = 0 OnMouseUp = btnDriveMouseUp end object btnRightHome: TSpeedButton Left = 201 Height = 25 Top = 0 Width = 23 Align = alRight Caption = '~' NumGlyphs = 0 OnClick = btnRightClick end object btnRightUp: TSpeedButton Left = 178 Height = 25 Top = 0 Width = 23 Align = alRight Caption = '..' NumGlyphs = 0 OnClick = btnRightClick end object btnRightRoot: TSpeedButton Left = 155 Height = 25 Top = 0 Width = 23 Align = alRight Caption = '/' NumGlyphs = 0 OnClick = btnRightClick end object btnRightDirectoryHotlist: TSpeedButton Left = 132 Height = 25 Top = 0 Width = 23 Align = alRight Caption = '*' NumGlyphs = 0 OnClick = btnRightDirectoryHotlistClick end object btnRightEqualLeft: TSpeedButton Left = 224 Height = 25 Hint = 'Show current directory of the left panel in the right panel' Top = 0 Width = 23 Action = actRightEqualLeft Align = alRight Caption = '>' NumGlyphs = 0 end object pbxRightDrive: TPaintBox AnchorSideLeft.Control = lblRightDriveInfo AnchorSideTop.Control = lblRightDriveInfo AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblRightDriveInfo AnchorSideRight.Side = asrBottom Left = 52 Height = 10 Top = 1 Width = 78 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 2 BorderSpacing.Right = 2 OnPaint = sboxDrivePaint end object lblRightDriveInfo: TLabel AnchorSideLeft.Control = btnRightDrive AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlRightTools AnchorSideRight.Side = asrBottom Left = 50 Height = 1 Top = 0 Width = 82 Alignment = taCenter Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 2 BorderSpacing.Right = 2 ParentColor = False OnDblClick = lblDriveInfoDblClick end end end object MainSplitter: TPanel Cursor = crHSplit Left = 515 Height = 78 Top = -40 Width = 5 Anchors = [] BevelOuter = bvNone PopupMenu = pmSplitterPercent TabOrder = 2 OnDblClick = MainSplitterDblClick OnMouseDown = MainSplitterMouseDown OnMouseMove = MainSplitterMouseMove OnMouseUp = MainSplitterMouseUp end end object PanelAllProgress: TPanel Left = 0 Height = 0 Top = 203 Width = 760 Align = alBottom AutoSize = True BevelOuter = bvNone TabOrder = 6 end object ConsoleSplitter: TSplitter Cursor = crVSplit Left = 0 Height = 3 Top = 203 Width = 760 Align = alBottom AutoSnap = False OnCanResize = ConsoleSplitterCanResize ResizeAnchor = akBottom Visible = False end object pnlCommand: TPanel AnchorSideBottom.Control = LogSplitter Left = 0 Height = 89 Top = 206 Width = 760 Align = alBottom AutoSize = True BevelOuter = bvLowered ClientHeight = 89 ClientWidth = 760 FullRepaint = False TabOrder = 8 object pnlCmdLine: TPanel Left = 1 Height = 33 Top = 55 Width = 758 Align = alClient AutoSize = True BevelOuter = bvNone ChildSizing.TopBottomSpacing = 2 ClientHeight = 33 ClientWidth = 758 TabOrder = 1 object lblCommandPath: TLabel AnchorSideTop.Control = edtCommand AnchorSideTop.Side = asrCenter Left = 0 Height = 22 Top = 5 Width = 34 Caption = 'Path' ParentColor = False ShowAccelChar = False end object edtCommand: TComboBoxWithDelItems AnchorSideLeft.Control = lblCommandPath AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlCmdLine AnchorSideRight.Control = pnlCmdLine AnchorSideRight.Side = asrBottom Left = 38 Height = 29 Top = 2 Width = 720 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 4 ItemHeight = 21 OnExit = edtCommandExit OnKeyDown = edtCommandKeyDown TabOrder = 0 TabStop = False end end object nbConsole: TPageControl Left = 1 Height = 54 Top = 1 Width = 758 TabStop = False ActivePage = pgConsole Align = alTop ShowTabs = False TabIndex = 0 TabOrder = 0 Visible = False object pgConsole: TTabSheet end end end object LogSplitter: TSplitter AnchorSideBottom.Control = seLogWindow Cursor = crVSplit Left = 0 Height = 4 Top = 295 Width = 760 Align = alBottom AutoSnap = False ResizeAnchor = akBottom ResizeStyle = rsLine Visible = False end inline seLogWindow: TSynEdit AnchorSideBottom.Control = pnlKeys Left = 0 Height = 51 Top = 299 Width = 760 Align = alBottom Font.Height = -16 Font.Name = 'courier' Font.Pitch = fpFixed Font.Quality = fqNonAntialiased ParentColor = False ParentFont = False PopupMenu = pmLogMenu TabOrder = 4 TabStop = False Visible = False Gutter.Width = 0 Gutter.MouseActions = <> RightGutter.Width = 0 RightGutter.MouseActions = <> Keystrokes = < item Command = ecUp ShortCut = 38 end item Command = ecSelUp ShortCut = 8230 end item Command = ecScrollUp ShortCut = 16422 end item Command = ecDown ShortCut = 40 end item Command = ecSelDown ShortCut = 8232 end item Command = ecScrollDown ShortCut = 16424 end item Command = ecLeft ShortCut = 37 end item Command = ecSelLeft ShortCut = 8229 end item Command = ecWordLeft ShortCut = 16421 end item Command = ecSelWordLeft ShortCut = 24613 end item Command = ecRight ShortCut = 39 end item Command = ecSelRight ShortCut = 8231 end item Command = ecWordRight ShortCut = 16423 end item Command = ecSelWordRight ShortCut = 24615 end item Command = ecPageDown ShortCut = 34 end item Command = ecSelPageDown ShortCut = 8226 end item Command = ecPageBottom ShortCut = 16418 end item Command = ecSelPageBottom ShortCut = 24610 end item Command = ecPageUp ShortCut = 33 end item Command = ecSelPageUp ShortCut = 8225 end item Command = ecPageTop ShortCut = 16417 end item Command = ecSelPageTop ShortCut = 24609 end item Command = ecLineStart ShortCut = 36 end item Command = ecSelLineStart ShortCut = 8228 end item Command = ecEditorTop ShortCut = 16420 end item Command = ecSelEditorTop ShortCut = 24612 end item Command = ecLineEnd ShortCut = 35 end item Command = ecSelLineEnd ShortCut = 8227 end item Command = ecEditorBottom ShortCut = 16419 end item Command = ecSelEditorBottom ShortCut = 24611 end item Command = ecToggleMode ShortCut = 45 end item Command = ecCopy ShortCut = 16429 end item Command = ecPaste ShortCut = 8237 end item Command = ecDeleteChar ShortCut = 46 end item Command = ecCut ShortCut = 8238 end item Command = ecDeleteLastChar ShortCut = 8 end item Command = ecDeleteLastChar ShortCut = 8200 end item Command = ecDeleteLastWord ShortCut = 16392 end item Command = ecUndo ShortCut = 32776 end item Command = ecRedo ShortCut = 40968 end item Command = ecLineBreak ShortCut = 13 end item Command = ecSelectAll ShortCut = 16449 end item Command = ecCopy ShortCut = 16451 end item Command = ecBlockIndent ShortCut = 24649 end item Command = ecLineBreak ShortCut = 16461 end item Command = ecInsertLine ShortCut = 16462 end item Command = ecDeleteWord ShortCut = 16468 end item Command = ecBlockUnindent ShortCut = 24661 end item Command = ecPaste ShortCut = 16470 end item Command = ecCut ShortCut = 16472 end item Command = ecDeleteLine ShortCut = 16473 end item Command = ecDeleteEOL ShortCut = 24665 end item Command = ecUndo ShortCut = 16474 end item Command = ecRedo ShortCut = 24666 end item Command = ecGotoMarker0 ShortCut = 16432 end item Command = ecGotoMarker1 ShortCut = 16433 end item Command = ecGotoMarker2 ShortCut = 16434 end item Command = ecGotoMarker3 ShortCut = 16435 end item Command = ecGotoMarker4 ShortCut = 16436 end item Command = ecGotoMarker5 ShortCut = 16437 end item Command = ecGotoMarker6 ShortCut = 16438 end item Command = ecGotoMarker7 ShortCut = 16439 end item Command = ecGotoMarker8 ShortCut = 16440 end item Command = ecGotoMarker9 ShortCut = 16441 end item Command = ecSetMarker0 ShortCut = 24624 end item Command = ecSetMarker1 ShortCut = 24625 end item Command = ecSetMarker2 ShortCut = 24626 end item Command = ecSetMarker3 ShortCut = 24627 end item Command = ecSetMarker4 ShortCut = 24628 end item Command = ecSetMarker5 ShortCut = 24629 end item Command = ecSetMarker6 ShortCut = 24630 end item Command = ecSetMarker7 ShortCut = 24631 end item Command = ecSetMarker8 ShortCut = 24632 end item Command = ecSetMarker9 ShortCut = 24633 end item Command = ecNormalSelect ShortCut = 24654 end item Command = ecColumnSelect ShortCut = 24643 end item Command = ecLineSelect ShortCut = 24652 end item Command = ecTab ShortCut = 9 end item Command = ecShiftTab ShortCut = 8201 end item Command = ecMatchBracket ShortCut = 24642 end> MouseActions = <> MouseSelActions = <> VisibleSpecialChars = [vscSpace, vscTabAtLast] ReadOnly = True RightEdge = 0 ScrollBars = ssVertical BracketHighlightStyle = sbhsBoth BracketMatchColor.Background = clNone BracketMatchColor.Foreground = clNone BracketMatchColor.Style = [fsBold] FoldedCodeColor.Background = clNone FoldedCodeColor.Foreground = clGray FoldedCodeColor.FrameColor = clGray MouseLinkColor.Background = clNone MouseLinkColor.Foreground = clBlue LineHighlightColor.Background = clNone LineHighlightColor.Foreground = clNone OnSpecialLineColors = seLogWindowSpecialLineColors inline SynLeftGutterPartList1: TSynGutterPartList end end object pnlKeys: TPanel Left = 0 Height = 20 Top = 350 Width = 760 Align = alBottom BevelOuter = bvLowered ChildSizing.EnlargeHorizontal = crsHomogenousChildResize ChildSizing.EnlargeVertical = crsHomogenousChildResize ChildSizing.ShrinkHorizontal = crsHomogenousChildResize ChildSizing.ShrinkVertical = crsHomogenousChildResize ChildSizing.Layout = cclTopToBottomThenLeftToRight ClientHeight = 20 ClientWidth = 760 FullRepaint = False TabOrder = 3 Visible = False object btnF3: TSpeedButton Left = 0 Height = 20 Top = 0 Width = 87 Action = actView Flat = True NumGlyphs = 0 end object btnF4: TSpeedButton Left = 87 Height = 20 Top = 0 Width = 81 Action = actEdit Flat = True NumGlyphs = 0 end object btnF5: TSpeedButton Left = 168 Height = 20 Top = 0 Width = 89 Action = actCopy Flat = True NumGlyphs = 0 end object btnF6: TSpeedButton Left = 257 Height = 20 Top = 0 Width = 94 Action = actRename Flat = True NumGlyphs = 0 end object btnF7: TSpeedButton Left = 351 Height = 20 Top = 0 Width = 116 Action = actMakeDir Flat = True NumGlyphs = 0 end object btnF8: TSpeedButton Left = 467 Height = 20 Top = 0 Width = 101 Caption = 'Delete' Flat = True NumGlyphs = 0 OnClick = btnF8Click end object btnF9: TSpeedButton Left = 568 Height = 20 Top = 0 Width = 117 Action = actRunTerm Caption = 'Terminal' Flat = True NumGlyphs = 0 end object btnF10: TSpeedButton Left = 685 Height = 20 Top = 0 Width = 75 Action = actExit Caption = 'Exit' Flat = True NumGlyphs = 0 end end object mnuMain: TMainMenu ParentBidiMode = False left = 283 top = 8 object mnuFiles: TMenuItem Caption = '&Files' object mnuFilesSymLink: TMenuItem Action = actSymLink end object mnuFilesHardLink: TMenuItem Action = actHardLink end object miLine1: TMenuItem Caption = '-' end object mnuSetFileProperties: TMenuItem Action = actSetFileProperties end object mnuFilesProperties: TMenuItem Action = actFileProperties end object miEditComment: TMenuItem Action = actEditComment end object mnuFilesSpace: TMenuItem Action = actCalculateSpace end object mnuFilesCmpCnt: TMenuItem Action = actCompareContents end object miMultiRename: TMenuItem Action = actMultiRename end object miLine2: TMenuItem Caption = '-' end object mnuPackFiles: TMenuItem Action = actPackFiles end object mnuExtractFiles: TMenuItem Action = actExtractFiles end object mnuTestArchive: TMenuItem Action = actTestArchive end object mnuFilesSplit: TMenuItem Action = actFileSpliter end object mnuFilesCombine: TMenuItem Action = actFileLinker end object mnuCheckSumCalc: TMenuItem Action = actCheckSumCalc end object mnuCheckSumVerify: TMenuItem Action = actCheckSumVerify end object miLine4: TMenuItem Caption = '-' end object miExit: TMenuItem Action = actExit end end object mnuMark: TMenuItem Caption = '&Mark' object mnuMarkSGroup: TMenuItem Action = actMarkPlus end object mnuMarkUGroup: TMenuItem Action = actMarkMinus end object mnuMarkSAll: TMenuItem Action = actMarkMarkAll end object mnuMarkUAll: TMenuItem Action = actMarkUnmarkAll end object mnuMarkInvert: TMenuItem Action = actMarkInvert end object mnuMarkCurrentExtension: TMenuItem Action = actMarkCurrentExtension end object mnuUnmarkCurrentExtension: TMenuItem Action = actUnmarkCurrentExtension end object miLine47: TMenuItem Caption = '-' end object mnuSaveSelection: TMenuItem Action = actSaveSelection end object mnuRestoreSelection: TMenuItem Action = actRestoreSelection end object mnuSaveSelectionToFile: TMenuItem Action = actSaveSelectionToFile end object mnuLoadSelectionFromFile: TMenuItem Action = actLoadSelectionFromFile end object mnuLoadSelectionFromClip: TMenuItem Action = actLoadSelectionFromClip end object miLine5: TMenuItem Caption = '-' end object miCopyNamesToClip: TMenuItem Action = actCopyNamesToClip end object miCopyFullNamesToClip: TMenuItem Action = actCopyFullNamesToClip end object miLine37: TMenuItem Caption = '-' end object miCompareDirectories: TMenuItem Action = actCompareDirectories end end object mnuCmd: TMenuItem Caption = '&Commands' object mnuCmdSearch: TMenuItem Action = actSearch end object mnuCmdDirHotlist: TMenuItem Action = actDirHotList end object miLine6: TMenuItem Caption = '-' end object miRunTerm: TMenuItem Action = actRunTerm end object miLine9: TMenuItem Caption = '-' end object mnuOpenVFSList: TMenuItem Action = actOpenVirtualFileSystemList end object mnuCmdSwapSourceTarget: TMenuItem Action = actExchange end object mnuCmdTargetIsSource: TMenuItem Action = actTargetEqualSource end object miLine22: TMenuItem Caption = '-' end object mnuCountDirContent: TMenuItem Action = actCountDirContent end end object mnuNetwork: TMenuItem Caption = 'Network' Visible = False object miNetworkConnect: TMenuItem Action = actNetworkConnect end object miNetworkQuickConnect: TMenuItem Action = actNetworkQuickConnect end object miNetworkDisconnect: TMenuItem Action = actNetworkDisconnect end end object mnuTabs: TMenuItem Caption = '&Tabs' object mnuNewTab: TMenuItem Action = actNewTab end object mnuOpenDirInNewTab: TMenuItem Action = actOpenDirInNewTab end object miLine15: TMenuItem Caption = '-' end object mnuCloseTab: TMenuItem Action = actCloseTab end object mnuCloseAllTabs: TMenuItem Action = actCloseAllTabs end object miLine16: TMenuItem Caption = '-' end object mnuTabOptions: TMenuItem Caption = '&Options' object mnuTabOptionNormal: TMenuItem Action = actSetTabOptionNormal end object mnuTabOptionPathLocked: TMenuItem Action = actSetTabOptionPathLocked end object mnuTabOptionPathResets: TMenuItem Action = actSetTabOptionPathResets end object mnuTabOptionDirsInNewTabs: TMenuItem Action = actSetTabOptionDirsInNewTab end end object miLine17: TMenuItem Caption = '-' end object mnuNextTab: TMenuItem Action = actNextTab end object mnuPrevTab: TMenuItem Action = actPrevTab end end object mnuShow: TMenuItem Caption = '&Show' object mnuBriefView: TMenuItem Action = actBriefView end object mnuColumnsView: TMenuItem Action = actColumnsView end object mnuThumbnailsView: TMenuItem Action = actThumbnailsView end object miLine33: TMenuItem Caption = '-' end object mnuQuickView: TMenuItem Action = actQuickView end object miLine32: TMenuItem Caption = '-' end object mnuShowName: TMenuItem Action = actSortByName end object mnuShowExtension: TMenuItem Action = actSortByExt end object mnuShowSize: TMenuItem Action = actSortBySize end object mnuShowTime: TMenuItem Action = actSortByDate end object mnuShowAttrib: TMenuItem Action = actSortByAttr end object miLine7: TMenuItem Caption = '-' end object mnuShowReverse: TMenuItem Action = actReverseOrder end object mnuShowReread: TMenuItem Action = actRefresh end object miLine3: TMenuItem Caption = '-' end object mnuFilesShwSysFiles: TMenuItem Action = actShowSysFiles end object miLine20: TMenuItem Caption = '-' end object mnuShowHorizontalFilePanels: TMenuItem Action = actHorizontalFilePanels end object miLine13: TMenuItem Caption = '-' end object mnuShowOperations: TMenuItem Action = actOperationsViewer end end object mnuConfig: TMenuItem Caption = 'C&onfiguration' object mnuConfigOptions: TMenuItem Action = actOptions end object mnuFileAssoc: TMenuItem Action = actFileAssoc end end object mnuHelp: TMenuItem Caption = '&Help' object mnuHelpIndex: TMenuItem Action = actHelpIndex end object mnuHelpKeyboard: TMenuItem Action = actKeyboard end object mnuHelpVisitHomePage: TMenuItem Action = actVisitHomePage end object miLine18: TMenuItem Caption = '-' end object mnuHelpAbout: TMenuItem Action = actAbout end end object mnuAllOperProgress: TMenuItem RightJustify = True Visible = False OnClick = mnuAllOperProgressClick end object mnuAllOperStart: TMenuItem Caption = 'Start' RightJustify = True Visible = False OnClick = mnuAllOperStartClick end object mnuAllOperPause: TMenuItem Caption = '||' RightJustify = True Visible = False OnClick = mnuAllOperPauseClick end object mnuAllOperStop: TMenuItem Caption = 'Cancel' RightJustify = True Visible = False OnClick = mnuAllOperStopClick end end object actionLst: TActionList left = 336 top = 24 object actExit: TAction Category = 'File' Caption = 'E&xit' HelpType = htKeyword OnExecute = actExecute end object actView: TAction Category = 'Classic' Caption = 'View' HelpType = htKeyword OnExecute = actExecute end object actEdit: TAction Category = 'Classic' Caption = 'Edit' HelpType = htKeyword OnExecute = actExecute end object actCopy: TAction Category = 'Classic' Caption = 'Copy' HelpType = htKeyword OnExecute = actExecute end object actRename: TAction Category = 'Classic' Caption = 'Move' HelpType = htKeyword OnExecute = actExecute end object actMakeDir: TAction Category = 'Classic' Caption = 'MakeDir' HelpType = htKeyword OnExecute = actExecute end object actDelete: TAction Category = 'Classic' Caption = 'Delete' HelpType = htKeyword OnExecute = actExecute end object actAbout: TAction Category = 'Help' Caption = '&About' HelpType = htKeyword OnExecute = actExecute end object actShowSysFiles: TAction Category = 'File' Caption = 'Show &Hidden/System Files' Checked = True HelpType = htKeyword OnExecute = actExecute end object actOptions: TAction Category = 'Config' Caption = '&Options...' HelpType = htKeyword OnExecute = actExecute end object actCompareContents: TAction Category = 'File' Caption = 'Compare by &Contents' HelpType = htKeyword OnExecute = actExecute end object actShowMainMenu: TAction Category = 'Classic' Caption = 'Menu' HelpType = htKeyword OnExecute = actExecute end object actRefresh: TAction Category = 'Show' Caption = '&Refresh' HelpType = htKeyword OnExecute = actExecute end object actSearch: TAction Category = 'Commands' Caption = '&Search...' HelpType = htKeyword OnExecute = actExecute end object actDirHotList: TAction Category = 'Commands' Caption = 'Directory &Hotlist' HelpType = htKeyword OnExecute = actExecute end object actMarkMarkAll: TAction Category = 'Mark' Caption = '&Select All' HelpType = htKeyword OnExecute = actExecute end object actMarkInvert: TAction Category = 'Mark' Caption = '&Invert Selection' HelpType = htKeyword OnExecute = actExecute end object actMarkUnmarkAll: TAction Category = 'Mark' Caption = '&Unselect All' HelpType = htKeyword OnExecute = actExecute end object actMarkPlus: TAction Category = 'Mark' Caption = 'Select a &Group...' HelpType = htKeyword OnExecute = actExecute end object actMarkMinus: TAction Category = 'Mark' Caption = 'Unselect a Gro&up...' HelpType = htKeyword OnExecute = actExecute end object actSymLink: TAction Category = 'File' Caption = 'Create Symbolic &Link...' HelpType = htKeyword OnExecute = actExecute end object actHardLink: TAction Category = 'File' Caption = 'Create &Hard Link...' HelpType = htKeyword OnExecute = actExecute end object actReverseOrder: TAction Category = 'Show' Caption = 'Re&verse Order' HelpType = htKeyword OnExecute = actExecute end object actSortByName: TAction Category = 'Show' Caption = 'Sort by &Name' HelpType = htKeyword OnExecute = actExecute end object actSortByExt: TAction Category = 'Show' Caption = 'Sort by &Extension' HelpType = htKeyword OnExecute = actExecute end object actSortBySize: TAction Category = 'Show' Caption = 'Sort by &Size' HelpType = htKeyword OnExecute = actExecute end object actSortByDate: TAction Category = 'Show' Caption = 'Sort by &Date' HelpType = htKeyword OnExecute = actExecute end object actSortByAttr: TAction Category = 'Show' Caption = 'Sort by &Attributes' HelpType = htKeyword OnExecute = actExecute end object actMultiRename: TAction Category = 'File' Caption = 'Multi &Rename Tool' HelpType = htKeyword OnExecute = actExecute end object actCopySamePanel: TAction Category = 'Commands' Caption = 'Copy to same panel' HelpType = htKeyword OnExecute = actExecute end object actRenameOnly: TAction Category = 'Commands' Caption = 'Rename' HelpType = htKeyword OnExecute = actExecute end object actEditNew: TAction Category = 'Commands' Caption = 'Edit new file' HelpType = htKeyword OnExecute = actExecute end object actDirHistory: TAction Category = 'Commands' Caption = 'Directory history' HelpType = htKeyword OnExecute = actExecute end object actShowCmdLineHistory: TAction Category = 'Commands' Caption = 'Show command line history' HelpType = htKeyword OnExecute = actExecute end object actRunTerm: TAction Category = 'Commands' Caption = 'Run &Terminal' HelpType = htKeyword OnExecute = actExecute end object actCalculateSpace: TAction Category = 'File' Caption = 'Calculate &Occupied Space' HelpType = htKeyword OnExecute = actExecute end object actFileProperties: TAction Category = 'File' Caption = 'Show &File Properties' HelpType = htKeyword OnExecute = actExecute end object actFileLinker: TAction Category = 'File' Caption = 'Com&bine Files...' HelpType = htKeyword OnExecute = actExecute end object actFileSpliter: TAction Category = 'File' Caption = 'Spl&it File...' HelpType = htKeyword OnExecute = actExecute end object actNewTab: TAction Category = 'Tabs' Caption = '&New Tab' HelpType = htKeyword OnExecute = actExecute end object actPackFiles: TAction Category = 'File' Caption = '&Pack Files...' OnExecute = actExecute end object actExtractFiles: TAction Category = 'File' Caption = '&Extract Files...' OnExecute = actExecute end object actOpenVirtualFileSystemList: TAction Category = 'Commands' Caption = 'Open &VFS List' OnExecute = actExecute end object actLeftOpenDrives: TAction Category = 'Commands' Caption = 'Open left drive list' OnExecute = actExecute end object actRightOpenDrives: TAction Category = 'Commands' Caption = 'Open right drive list' OnExecute = actExecute end object actAddPathToCmdLine: TAction Category = 'Commands' Caption = 'Copy path to command line' OnExecute = actExecute end object actFocusCmdLine: TAction Category = 'Commands' Caption = 'Focus command line' OnExecute = actExecute end object actTransferLeft: TAction Category = 'Commands' Caption = 'Transfer dir under cursor to left window' OnExecute = actExecute end object actTransferRight: TAction Category = 'Commands' Caption = 'Transfer dir under cursor to right window' OnExecute = actExecute end object actContextMenu: TAction Category = 'Commands' Caption = 'Show context menu' OnExecute = actExecute end object actOpenArchive: TAction Category = 'File' Caption = 'Try open archive' OnExecute = actExecute end object actShowButtonMenu: TAction Category = 'Commands' Caption = 'Show button menu' OnExecute = actExecute end object actQuickSearch: TAction Category = 'Commands' Caption = 'Quick search' OnExecute = actExecute end object actFileAssoc: TAction Category = 'Config' Caption = 'File &Associations...' OnExecute = actExecute end object actOpen: TAction Category = 'File' Caption = 'Open' OnExecute = actExecute end object actCopyNamesToClip: TAction Category = 'Mark' Caption = 'Copy &Filename(s) to Clipboard' OnExecute = actExecute end object actCutToClipboard: TAction Category = 'File' Caption = 'Cu&t' OnExecute = actExecute end object actCopyToClipboard: TAction Category = 'File' Caption = '&Copy' OnExecute = actExecute end object actPasteFromClipboard: TAction Category = 'File' Caption = '&Paste' OnExecute = actExecute end object actCopyFullNamesToClip: TAction Category = 'Mark' Caption = 'Copy Filename(s) with Full &Path' OnExecute = actExecute end object actTargetEqualSource: TAction Category = 'Commands' Caption = 'Target &= Source' OnExecute = actExecute end object actExchange: TAction Category = 'Commands' Caption = 'Swap &Panels' OnExecute = actExecute end object actWipe: TAction Category = 'Commands' Caption = 'Wipe' OnExecute = actExecute end object actMarkCurrentExtension: TAction Category = 'Mark' Caption = 'Select All with the Same E&xtension' OnExecute = actExecute end object actUnmarkCurrentExtension: TAction Category = 'Mark' Caption = 'Unselect All with the Same Ex&tension' OnExecute = actExecute end object actEditComment: TAction Category = 'File' Caption = 'Edit Co&mment...' OnExecute = actExecute end object actKeyboard: TAction Category = 'Help' Caption = '&Keyboard' OnExecute = actExecute end object actVisitHomePage: TAction Category = 'Help' Caption = '&Visit Double Commander Website' OnExecute = actExecute end object actHelpIndex: TAction Category = 'Help' Caption = '&Contents' OnExecute = actExecute end object actLeftEqualRight: TAction Category = 'Commands' Caption = 'Left &= Right' OnExecute = actExecute end object actRightEqualLeft: TAction Category = 'Commands' Caption = 'Right &= Left' OnExecute = actExecute end object actChangeDirToRoot: TAction Category = 'Commands' Caption = 'Change directory to root' OnExecute = actExecute end object actCountDirContent: TAction Category = 'Commands' Caption = 'Sho&w Occupied Space' OnExecute = actExecute end object actCheckSumVerify: TAction Category = 'File' Caption = '&Verify Checksum...' OnExecute = actExecute end object actCheckSumCalc: TAction Category = 'File' Caption = 'Calculate Check&sum...' OnExecute = actExecute end object actClearLogFile: TAction Category = 'Commands' Caption = 'Clear log file' OnExecute = actExecute end object actClearLogWindow: TAction Category = 'Commands' Caption = 'Clear log window' OnExecute = actExecute end object actMinimize: TAction Category = 'Commands' Caption = 'Minimize window' OnExecute = actExecute end object actChangeDir: TAction Category = 'Commands' Caption = 'Change directory' OnExecute = actExecute end object actAddFilenameToCmdLine: TAction Category = 'Commands' Caption = 'Add file name to command line' OnExecute = actExecute end object actAddPathAndFilenameToCmdLine: TAction Category = 'Commands' Caption = 'Add path and file name to command line' OnExecute = actExecute end object actPanelsSplitterPerPos: TAction Category = 'Commands' Caption = 'Set splitter position' OnExecute = actExecute end object actCopyNoAsk: TAction Category = 'Commands' Caption = 'Copy files without asking for confirmation' OnExecute = actExecute end object actRenameNoAsk: TAction Category = 'Commands' Caption = 'Move/Rename files without asking for confirmation' OnExecute = actExecute end object actQuickFilter: TAction Category = 'Commands' Caption = 'Quick filter' OnExecute = actExecute end object actSetFileProperties: TAction Category = 'File' Caption = 'Change &Attributes...' OnExecute = actExecute end object actOpenDirInNewTab: TAction Category = 'Tabs' Caption = 'Open &Folder in a New Tab' OnExecute = actExecute end object actCloseTab: TAction Category = 'Tabs' Caption = '&Close Tab' HelpType = htKeyword OnExecute = actExecute end object actCloseAllTabs: TAction Category = 'Tabs' Caption = 'Close &All Tabs' OnExecute = actExecute end object actSetTabOptionNormal: TAction Category = 'Tabs' Caption = '&Normal' OnExecute = actExecute end object actSetTabOptionPathLocked: TAction Category = 'Tabs' Caption = '&Locked' OnExecute = actExecute end object actSetTabOptionPathResets: TAction Category = 'Tabs' Caption = 'Locked with &Directory Changes Allowed' OnExecute = actExecute end object actSetTabOptionDirsInNewTab: TAction Category = 'Tabs' Caption = 'Locked with Directories Opened in New &Tabs' OnExecute = actExecute end object actNextTab: TAction Category = 'Tabs' Caption = 'Switch to Nex&t Tab' OnExecute = actExecute end object actPrevTab: TAction Category = 'Tabs' Caption = 'Switch to &Previous Tab' OnExecute = actExecute end object actOpenBar: TAction Category = 'Commands' Caption = 'Open bar file' OnExecute = actExecute end object actQuickView: TAction Category = 'Show' Caption = '&Quick View Panel' OnExecute = actExecute end object actTestArchive: TAction Category = 'File' Caption = '&Test Archive(s)' OnExecute = actExecute end object actSwitchIgnoreList: TAction Category = 'Show' Caption = 'Enable/disable ignore list file to not show file names' OnExecute = actExecute end object actRestoreSelection: TAction Category = 'Mark' Caption = '&Restore Selection' OnExecute = actExecute end object actSaveSelection: TAction Category = 'Mark' Caption = 'Sa&ve Selection' OnExecute = actExecute end object actSaveSelectionToFile: TAction Category = 'Mark' Caption = 'Save S&election to File...' OnExecute = actExecute end object actLoadSelectionFromFile: TAction Category = 'Mark' Caption = '&Load Selection from File...' OnExecute = actExecute end object actLoadSelectionFromClip: TAction Category = 'Mark' Caption = 'Load Selection from Clip&board' OnExecute = actExecute end object actChangeDirToParent: TAction Category = 'Commands' Caption = 'Change Directory To Parent' OnExecute = actExecute end object actEditPath: TAction Category = 'Commands' Caption = 'Edit path field above file list' OnExecute = actExecute end object actViewHistory: TAction Category = 'Commands' Caption = 'Show history of visited paths for active view' OnExecute = actExecute end object actViewHistoryPrev: TAction Category = 'Commands' Caption = 'Go to previous entry in history' OnExecute = actExecute end object actViewHistoryNext: TAction Category = 'Commands' Caption = 'Go to next entry in history' OnExecute = actExecute end object actNetworkConnect: TAction Category = 'Network' Caption = 'Network &Connect...' OnExecute = actExecute end object actNetworkQuickConnect: TAction Category = 'Network' Caption = 'Network &Quick Connect...' OnExecute = actExecute end object actNetworkDisconnect: TAction Category = 'Network' Caption = 'Network &Disconnect' OnExecute = actExecute end object actHorizontalFilePanels: TAction Category = 'Show' Caption = '&Horizontal Panels Mode' OnExecute = actExecute end object actGoToFirstFile: TAction Category = 'Commands' Caption = 'Place cursor on first file in list' OnExecute = actExecute end object actGoToLastFile: TAction Category = 'Commands' Caption = 'Place cursor on last file in list' OnExecute = actExecute end object actOperationsViewer: TAction Category = 'Show' Caption = 'Operations &Viewer' OnExecute = actExecute end object actRenameTab: TAction Category = 'Tabs' Caption = '&Rename Tab' OnExecute = actExecute end object actCompareDirectories: TAction Category = 'Mark' Caption = 'Compare Directories' Hint = 'Compare Directories' OnExecute = actExecute end object actShellExecute: TAction Category = 'File' Caption = 'Open' Hint = 'Open using system associations' OnExecute = actExecute end object actCmdLineNext: TAction Category = 'Commands' Caption = 'Next Command Line' Hint = 'Set command line to next command in history' OnExecute = actExecute end object actCmdLinePrev: TAction Category = 'Commands' Caption = 'Previous Command Line' Hint = 'Set command line to previous command in history' OnExecute = actExecute end object actBriefView: TAction Category = 'Show' Caption = 'Brief' Hint = 'Brief View' OnExecute = actExecute end object actColumnsView: TAction Category = 'Show' Caption = 'Full' Hint = 'Columns View' OnExecute = actExecute end object actThumbnailsView: TAction Category = 'Show' Caption = 'Thumbnails' Hint = 'Thumbnails View' OnExecute = actExecute end end object pmHotList: TPopupMenu left = 120 top = 72 end object pmDirHistory: TPopupMenu AutoPopup = False left = 184 top = 104 end object pmToolBar: TPopupMenu OnPopup = pmToolBarPopup left = 48 top = 152 object tbEdit: TMenuItem Caption = 'Edit' OnClick = tbEditClick end object tbDelete: TMenuItem Caption = 'Delete' OnClick = tbDeleteClick end object tbChangeDir: TMenuItem Caption = 'CD' OnClick = tbChangeDirClick end object tbSeparator: TMenuItem Caption = '-' Visible = False end object tbCut: TMenuItem Caption = 'Cut' Visible = False OnClick = tbCopyClick end object tbCopy: TMenuItem Caption = 'Copy' Visible = False OnClick = tbCopyClick end object tbPaste: TMenuItem Caption = 'Paste' Visible = False OnClick = tbPasteClick end end object pmContextMenu: TPopupMenu left = 56 top = 96 object mnuContextOpen: TMenuItem Action = actOpen end object mnuContextView: TMenuItem Action = actView end object mnuContextLine1: TMenuItem Caption = '-' end object mnuContextCopy: TMenuItem Action = actCopy end object mnuContextRenameOnly: TMenuItem Action = actRenameOnly end object mnuContextDelete: TMenuItem Action = actDelete end object mnuContextLine2: TMenuItem Caption = '-' end object mnuContextFileProperties: TMenuItem Action = actFileProperties end end object pmColumnsMenu: TPopupMenu left = 344 top = 144 object MenuItem2: TMenuItem Caption = '-' end end object pmSplitterPercent: TPopupMenu left = 312 top = 96 object mi2080: TMenuItem Tag = 20 Caption = '&20/80' OnClick = mnuSplitterPercentClick end object mi3070: TMenuItem Tag = 30 Caption = '&30/70' OnClick = mnuSplitterPercentClick end object mi4060: TMenuItem Tag = 40 Caption = '&40/60' OnClick = mnuSplitterPercentClick end object mi5050: TMenuItem Tag = 50 Caption = '&50/50' OnClick = mnuSplitterPercentClick end object mi6040: TMenuItem Tag = 60 Caption = '&60/40' OnClick = mnuSplitterPercentClick end object mi7030: TMenuItem Tag = 70 Caption = '&70/30' OnClick = mnuSplitterPercentClick end object mi8020: TMenuItem Tag = 80 Caption = '&80/20' OnClick = mnuSplitterPercentClick end end object pmDropMenu: TPopupMenu left = 384 top = 72 object miCopy: TMenuItem Caption = 'Copy...' OnClick = mnuDropClick end object miMove: TMenuItem Caption = 'Move...' OnClick = mnuDropClick end object miHardLink: TMenuItem Caption = 'Create link...' OnClick = mnuDropClick end object miSymLink: TMenuItem Caption = 'Create symlink...' OnClick = mnuDropClick end object miLine12: TMenuItem Caption = '-' end object miCancel: TMenuItem Caption = 'Cancel' OnClick = mnuDropClick end end object MainTrayIcon: TTrayIcon PopUpMenu = pmTrayIconMenu Icon.Data = { 267D000000000100040010100000010020006804000046000000202000000100 2000A8100000AE0400003030000001002000A825000056150000404000000100 200028420000FE3A000028000000100000002000000001002000000000004004 00000000000000000000000000000000000000000000BCA3A51A8182BB517E82 C1586E72B94F6D70B64F6C6DB34F6B6BB14F6A68AE4F6966AB4F6764A84F736D AB57837CB1677A72AB607B6D9E3EFEEDD506B7A4B60D4F6BDAE62653E6FE234B DEFE2046D7FE1D3FD1FE1A39CAFE1834C4FE142EBEFE1228B8FE0F23B2FE0D1C ABFE0A17A4FF06109EFE050C97FE594F997BCECFD296BEC6DBFEB1BAD9FE889A D9FF2F52D7FF193ED2FF1939CCFF1634C6FF132DBFFF1127B9FF0E22B3FF0314 AAFF444EB3FF9295C4FFB1B2CCFFC2C2CFF7D1D0D0ABD7D7D5FFD6D6D5FFD6D6 D5FFD9D9D4FF4963D0FF1738CCFF1634C6FF132DBFFF1127B9FF0E22B3FF848B C5FFDBDBD7FFD6D6D5FFD7D7D6FED7D7D6FFAFB5D15A6A87E1FB8B9DD6FFD9D7 D2FFD3D3D3FFD1D1D2FF3F58CBFF1634C6FF132DBFFF0B22B8FF9299C8FFD7D6 D4FFD3D3D3FFC1C2CEFF5D62B1FF6868B0D69AA7E3344B72EDF92C58E9FF375C DDFFBFC2D0FFD0D0D0FFAAB0CAFF0D2DC6FF132DBFFF3245BDFFCECECFFFD3D3 D1FF9A9DC2FF040F9EFF000697FF2B2DA1C3A3ADE1366D8CF0F9577AECFF3E62 E3FF6D83D6FFCECECCFFD7D6CCFF2741C3FF122CBFFF616FC0FFCDCDCCFFC4C4 CAFF0514A5FF0712A0FF070E9AFF3334A3C4A3ADE1366D8CF0F96988EEFF6482 E9FF6F86DEFFCDCCCAFFD1D0CAFF5C6DC7FF213AC4FF8991C4FFCBCBCAFF9EA2 C3FF1C29ADFF222CAAFF2B32A9FF5858B3C4A3ADE1366D8CF0F96888EEFF6684 EAFF7E92E0FFD8D7D5FFDCDBD6FF7686D1FF596CD3FF9DA4CEFFD6D6D6FFB8BB D0FF545EC1FF555DBDFF5359BAFF6B6CBCC4A3ADE1366D8CF0F96888EEFF6583 EAFFAFBAE1FFE5E5E5FFE6E5E1FF596FD7FF5C6FD3FF8690D2FFE5E5E5FFE9E8 E5FF5F69C0FF525ABDFF5157B9FF6B6BBBC498A4E72F6687F1F96887EBFFA7B4 E3FFE6E6E5FFE6E6E6FFA5AFDCFF5D72D8FF5D6FD3FF6371CEFFE0E0E3FFE6E6 E6FFDBDCE1FF7A7FC4FF484EB5FF605FB4C2D9D9DC9CD8DAE1FFEAE8E3FFE7E7 E6FFE7E7E6FFD5D7E2FF677BDBFF5F74D8FF5D6FD3FF5A69CFFF7681CBFFE6E6 E5FFE6E6E6FFEBEBE8FFE6E6E3FFD7D8DEF9E0E0E0ABE8E8E8FFE9E9E8FFEEED E9FFB6BFE0FF677FE0FF6076DCFF5F74D8FF5D6FD3FF5B6BCFFF5866CBFF6F79 C9FFDBDCE0FFEEEDEAFFE9E9E8FEE8E8E8FFCECCD36EAFBDE9FD9BADE7FE768F E6FF5F7AE5FF627BE0FF6176DCFF5F74D8FF5C6FD3FF5B6BCFFF5866CBFF5662 C6FF4F59C0FF777DC4FF9699CBFFB5B2CCDEFFF0D5098283BBCA718EEFFC6683 E8FB6A82E4FB687FE0FB667ADCFB6478D7FB6373D3FB6170CEFB5F6CCBFB5C66 C5FB5660C0FB555CBCFB6A6CBDF9998DB15200000000FFFFFF0399839924917C 962A907B962A8F7B942A8F7A942A8F79942A8E79942A8E78932A8E78922A8F77 922A8F77922A8E76912A9D83921F000000008000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF8001FFFF2800000020000000400000000100 2000000000008010000000000000000000000000000000000000000000000000 000000000000FFFFFF03FFFFFF07FFFFFF0BFFFFFF14FFFFFF09FFFFFF07FFFF FF07FFFFFF07FFFFFF07FFFFFF07FFFFFF07FFFFFF07FFFFFF07FFFFFF07FFFF FF07FFFFFF07FFFFFF07FFFFFF07FFFFFF07FFFFFF0CFFFFFF1AFFFFFF1CFFFF FF1CFFFFFF17FFFFFF0AFFFFFF04000000000000000000000000000000000000 0000FFFFFF10E1D6D55362456CBA584273D6594374DD584175D3563F73D2563E 72D2553E71D2543D70D2543C70D2543B6ED2533B6ED2533A6DD2533A6DD25338 6BD252396BD252386AD252376AD2513669D253386AD5513262E6513262E85132 61E8503161E4533563CA89729187FFFFFF2BFCFCFC040000000000000000FFFF FF08948BB17F5263C1FF3E66E8FF315DEBFF2C58E7FF2B54E4FF2A51E1FF284E DDFF264BDAFF2448D7FF2345D4FF2242D0FF2140CDFF1F3DCAFF1E39C7FF1C36 C4FF1B33C1FF1A31BEFF192EBBFF172BB7FF1527B3FF1425B1FF1322AEFF121F ABFF101CA8FF141EA5FF191A92FF45357FE4FEF6EE3AFFFFFF0200000000FFFF FF22546BD1F12C5AEBFE2754E8FF224FE4FF224BE1FF2149DEFF1E45DAFF1D43 D6FF1B40D3FF1A3DD0FF183ACDFF1736C9FF1634C6FF1431C3FF132EC0FF112B BDFF1128BAFF0F25B6FF0D22B3FF0C1FB0FF0A1CACFF0A19A9FF0816A5FF0613 A2FF040F9FFF010A9BFF020A98FF0B139DFF453075C7FFFFFF0ECACACA4EDBDB DBE7C5C9D8FFC0C5D7FFB7BED6FF8598D7FF395DDCFF1842DFFF1E45DAFF1D43 D6FF1B40D3FF1A3DD0FF183ACDFF1736C9FF1634C6FF1431C3FF132EC0FF112B BDFF1128BAFF0F25B6FF0D22B3FF0C1FB0FF0A1CACFF0A19A9FF0615A5FF000C A0FF434BACFF9395C1FFB7B8CAFFBDBECFFFC7C6D1FDD6D6D6E3C8C8C858D7D7 D7FFD7D7D7FFD7D7D7FFD8D8D7FFDCDBD8FFE1DED5FFB3BAD4FF5873D6FF1940 D6FF1B40D3FF1A3DD0FF183ACDFF1736C9FF1634C6FF1431C3FF132EC0FF112B BDFF1128BAFF0F25B6FF0D22B3FF0C1FB0FF081AABFF0F1DA8FF7077BCFFCECE D4FFE2E2DBFFDADAD8FFD8D8D7FFD7D7D7FFD7D7D7FFD4D4D4FFC8C8C858D5D5 D5FFD5D5D5FFD5D5D5FFD5D5D5FFD5D5D5FFD5D5D5FFD5D5D5FFD7D6D6FF9FA9 D1FF1B40D3FF1A3DD0FF183ACDFF1736C9FF1634C6FF1431C3FF132EC0FF112B BDFF1128BAFF0F25B6FF0D22B3FF0B1FB0FF2D3BB0FFD7D8D9FFD6D6D5FFD5D5 D5FFD5D5D5FFD5D5D5FFD5D5D5FFD5D5D5FFD5D5D5FFD3D3D3FFC7C7C758D3D3 D3FFD4D4D4FFD4D4D4FFD4D4D4FFD4D4D4FFD4D4D4FFD4D4D4FFD4D4D4FFD8D7 D4FFBBBFD2FF1F40CFFF193ACDFF1736C9FF1634C6FF1431C3FF132EC0FF112B BDFF1128BAFF0F25B6FF0B20B3FF5662B9FFD4D4D5FFD4D4D4FFD4D4D4FFD4D4 D4FFD4D4D4FFD4D4D4FFD4D4D4FFD4D4D4FFD4D4D4FFD2D2D2FFC8C8C84BD1CF D0E9BBC3D9FFBDC2D4FFCCCDD1FFD8D7D3FFD4D3D3FFD3D3D3FFD3D3D3FFD3D3 D3FFD5D5D4FFB1B6CCFF193ACBFF1736C9FF1634C6FF1431C3FF132EC0FF112B BDFF1128BAFF0D24B6FF2E3FB6FFD3D4D5FFD2D3D3FFD3D3D3FFD3D3D3FFD3D3 D3FFD5D5D4FFD8D8D5FFC2C2CEFFB4B5CAFFB6B7CAFDD3D3D2DBFFFFFF05BAA4 AD75426DF1FF3461EBFF2E5AE8FF5874D4FFCECFD1FFD2D2D2FFD2D2D2FFD2D2 D2FFD2D2D2FFD3D2D2FF8491CAFF1736C9FF1634C6FF1431C3FF132EC0FF112B BDFF1128BAFF0A21B4FFCECFD2FFD2D2D2FFD2D2D2FFD2D2D2FFD2D2D2FFD3D3 D2FFAAACC6FF1D259FFF070F9AFF030996FF181B9CF4FAEEE322FFFFFF04B9A2 AD734B75F2FF3B66ECFF315CE8FF2753E6FF2750DEFF96A3D1FFD1D1D0FFD0D0 D0FFD0D0D0FFD0D0D0FFCDCDCDFF2240C7FF1534C6FF1431C3FF132EC0FF112B BDFF1027BAFF737EC3FFD3D3D1FFD0D0D0FFD0D0D0FFD0D0D0FFD7D6D1FF5961 B3FF000B9DFF020C9CFF030B99FF000695FF161A9BF4FFF4E71FFFFFFF04B7A1 AD735F84F3FF4971EDFF3C65E9FF325BE5FF2B54E2FF2049DEFFB5BACEFFD0CF CEFFCECECEFFCECECEFFD2D2CFFF848FC1FF1130C7FF1431C3FF132EC0FF112B BDFF0F26B9FFB6B9CBFFCECECEFFCECECEFFCECECEFFD0CFCFFF6067B4FF0411 A2FF05109FFF030D9CFF030B99FF010795FF171A9BF4FFF4E71FFFFFFF04B7A0 AC736D8FF5FF6384EFFF5074EBFF4268E7FF365DE3FF2E55E0FF3256DAFFC8C9 CCFFCDCDCDFFCDCDCDFFCDCDCDFFC4C4C6FF1C39C5FF1532C3FF142FC0FF112A BDFF273BB8FFD4D3CDFFCDCDCDFFCDCDCDFFCECDCDFFBABBC6FF0412A4FF0714 A2FF06119FFF050E9CFF040C99FF030896FF191D9CF4FFF3E71FFFFFFF04B7A0 AC736D90F5FF6A8AF0FF6887EEFF5D7EEAFF4E71E6FF4164E2FF375ADDFFA7B0 D0FFCCCCCCFFCDCDCDFFCDCDCDFFCCCCCDFF364EC3FF1733C3FF152FC0FF1029 BDFF6A75BCFFD2D1CEFFCDCDCDFFCDCDCDFFD3D3CEFF444EAFFF0715A6FF0915 A4FF0914A0FF09129EFF0A119BFF0A1099FF2226A0F4FDF1E61FFFFFFF04B7A0 AC736D90F5FF6989F0FF6988EFFF6786ECFF6684EAFF617EE7FF5372E3FF909D D3FFCCCCCAFFCACACAFFCACACAFFCACACAFF4B60C5FF213BC5FF1D37C2FF152E BFFF979DC1FFCDCDCBFFCACACAFFCACACAFFCCCCCAFF1626ACFF1220A9FF131F A7FF141EA5FF161FA2FF1920A2FF1D23A1FF3639A8F4F8ECE41FFFFFFF04B7A0 AC736D90F5FF6989F0FF6988EFFF6786ECFF6684EAFF6682E8FF6580E5FF94A1 D6FFCCCCCAFFCACACAFFCACACAFFCACACAFF6778CBFF3850CCFF324AC8FF293F C4FFB0B3C5FFCCCBCBFFCACACAFFCACACAFFC1C2C9FF2A38B4FF2935B1FF2C36 B0FF3039AFFF353DAFFF3D44B0FF4448B1FF595CB7F4EFE3E01FFFFFFF04B7A0 AC736D90F5FF6989F0FF6988EFFF6786ECFF6684EAFF6682E8FF647FE5FF9EA9 D6FFD3D3D2FFD2D2D2FFD2D2D2FFD1D2D2FF7988D1FF5C70D5FF586BD2FF5163 D0FFADB0C5FFD4D3D2FFD2D2D2FFD2D2D2FFCBCCCFFF515CC1FF505AC0FF525B BEFF535BBDFF535ABBFF5257B9FF5054B6FF5E61BAF4EEE1DF1FFFFFFF04B7A0 AC736D90F5FF6989F0FF6988EFFF6786ECFF6684EAFF6682E8FF6580E5FFBAC0 D9FFD9D9D9FFD9D9D9FFD9D9D9FFD9D9D9FF7182D3FF5D71D6FF5D6FD3FF596B D2FF989EC6FFDDDCDAFFD9D9D9FFD9D9D9FFDDDCD9FF656FC2FF545EC2FF535C BFFF535BBDFF5258BAFF5257B9FF4F54B6FF5E61BAF4EEE1DF1FFFFFFF04B7A0 AC736D90F5FF6989F0FF6988EFFF6786ECFF6684EAFF6682E8FF6781E3FFDBDC DEFFE2E2E2FFE2E2E2FFE2E2E2FFDDDDDDFF6175D5FF5D71D6FF5D6FD3FF5A6C D1FF737EC8FFE5E5E1FFE2E2E2FFE2E2E2FFE4E4E3FFB4B6CEFF4E59C0FF535C BFFF535BBDFF5258BAFF5257B9FF4F54B6FF5E61BAF4EEE1DF1FFFFFFF04B7A0 AC736D90F5FF6989F0FF6988EFFF6786ECFF6684EAFF637FE8FFB5BDD6FFE8E8 E7FFE6E6E6FFE6E6E6FFE8E8E7FFB5BAD4FF5B71D8FF5D71D6FF5D6FD3FF5B6D D1FF5A69CFFFD7D8DBFFE6E6E6FFE6E6E6FFE5E5E5FFEAE9E8FF737BC2FF535C BFFF535BBDFF5258BAFF5257B9FF4F54B6FF5E61BAF4EEE1DF1FFFFFFF04B7A0 AC736D90F5FF6989F0FF6988EFFF6786ECFF6180EBFFA4B0DCFFE6E6E5FFE5E5 E6FFE6E6E6FFE6E6E6FFE7E6E3FF687BD7FF5E74D8FF5D71D6FF5D6FD3FF5B6D D1FF5B6ACFFFA6ACD1FFE7E7E6FFE5E5E5FFE6E6E6FFE5E5E5FFDDDEE1FF5E66 BAFF5159BDFF5258BAFF5257B9FF4F54B6FF5E61BAF4EFE3E11FFFFFFF01B29F BC6E6A8DF6FF6586F1FF6584EDFF8097E4FFBDC4DDFFEBEAE5FFE5E5E5FFE6E6 E6FFE5E5E5FFE7E7E6FFB3BADAFF5F74DBFF5F74D8FF5D71D6FF5D6FD3FF5B6D D1FF5C6BCFFF6270C9FFE2E1DFFFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E5 E4FF9296C9FF5D62B8FF4B51B6FF4A4FB4FF595BB8F4D3B9BA1BCDCDCC3CD2CF D6CFB5C0E0FFC2C8DCFFE0E0DFFFE7E7E6FFE6E6E5FFE6E6E6FFE5E5E5FFE5E5 E5FFE6E6E6FFDFDFDFFF6277D8FF5F74DAFF5F74D8FF5D71D6FF5D6FD3FF5B6D D1FF5C6BCFFF5968CDFF7681C9FFE5E5E4FFE5E6E6FFE5E5E5FFE5E5E5FFE5E5 E5FFE6E6E6FFEAE9E8FFD2D3D7FFB6B7CFFFB0B0CEFBD5D4D4B3D2D2D259E6E6 E6FFE8E8E6FEE8E7E7FFE7E7E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6 E7FFE1E1E3FF7085DAFF6076DCFF5F74DAFF5F74D8FF5D71D6FF5D6FD3FF5B6D D1FF5C6BCFFF5A69CDFF5867CBFF9299CBFFEEEEE8FFE6E6E6FFE6E6E6FFE6E6 E6FFE6E6E6FFE6E6E6FFE7E7E7FFE8E8E7FFE8E8E7FFE2E2E2FFD2D2D258E6E6 E6FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE9E9E7FFD3D6 E0FF6D83D8FF6179DEFF6077DCFF5F74DAFF5F74D8FF5D71D6FF5D6FD3FF5B6D D1FF5C6BCFFF5A69CDFF5867CBFF5360C9FF8B92C9FFE1E1E3FFE9E9E8FFE7E7 E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE2E2E2FFD2D2D258E7E7 E7FFE8E8E8FFE8E8E8FFE7E7E7FFE7E7E7FFE8E8E8FFEAEAE6FF9BA8D8FF647E E2FF627CE0FF627ADEFF6077DCFF5F74DAFF5F74D8FF5D71D6FF5D6FD3FF5B6D D1FF5C6BCFFF5A69CDFF5867CBFF5865C9FF5663C5FF5E68C4FFC0C2D3FFECEC EBFFE8E8E8FFE7E7E7FFE8E8E8FFE8E8E8FFE8E8E8FFE3E3E3FFCECECE57E1E1 E1FFE1E1E3FFDEDFE0FFCDD2E1FFB5BFE2FF93A6E4FF6C86E3FF627DE6FF647E E3FF627CE0FF627ADEFF6077DCFF5F74DAFF5F74D8FF5D71D6FF5D6FD3FF5B6D D1FF5C6BCFFF5A69CDFF5867CBFF5865C9FF5663C5FF5660C4FF515BC0FF6B72 C1FF9498CAFFB8BAD2FFD1D1DAFFDEDFDFFEE1E1E2FFDBDBDBFC00000000EFE3 E3386779D2FF6385F2FE6485F0FF6585EDFF6684EAFF6682E8FF647FE5FF647D E3FF627CE0FF627ADEFF6077DCFF5F74DAFF5F74D8FF5D71D6FF5D6FD3FF5B6D D1FF5C6BCFFF5A69CDFF5867CBFF5865C9FF5663C5FF5761C4FF555FC1FF535C BFFF525ABDFF4F55BAFF4B51B7FF494FB7FF55468DEAFFFFFF0900000000FFFF FF1D837DAED37395F7FF6786EFFE6786ECFF6684EAFF6581E8FF647FE5FF637D E3FF627CE0FF6179DEFF6077DCFF5F74DAFF5E74D8FF5D71D6FF5C6ED3FF5B6D D1FF5B6ACEFF5969CDFF5867CBFF5764C9FF5662C5FF5761C4FF555FC1FF535C BFFF535BBDFF5157BAFF4E53B7FE6562ADFFA18DA574FFFFFF0400000000F6F5 F604CFC0C3428D85AFC27C84CAF46874C6FF6874C5FF6A74C4FF6C75C2FF6C74 C2FF6C73BFFF6B71BEFF6A6FBCFF696EBBFF696DB9FF686BB8FF676AB6FF6669 B5FF6667B3FF6566B2FF6464B1FF6462AEFF6261ACFF5C5AA9FF5B58A7FF5A57 A6FF5B56A4FF655EA5FF7F76ABEF95819C93FFFFFF1300000000000000000000 0000FBFAFB02FFFFFF11FFFFFF2AFFFFF937D4C5C340D4C5C340D4C5C340D4C5 C340D4C5C340D5C6C340D5C6C440D5C6C440D5C6C440D5C6C440D5C6C440D5C6 C440D5C6C440D5C6C440D5C6C440D5C6C440D5C6C540D5C6C440D5C7C540D5C7 C540D5C6C440EBE2DF3BFFFFFF2CFFFFFF0E0000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000E0000007C000 0001800000008000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000800000008000000080000001C0000003FFFFFFFF280000003000 0000600000000100200000000000802500000000000000000000000000000000 00000000000000000000000000000000000000000000FFFFFF01FFFFFF03FFFF FF04FFFFFF07FFFFFF0BFFFFFF08FFFFFF04FFFFFF03FFFFFF03FFFFFF03FFFF FF03FFFFFF03FFFFFF03FFFFFF03FFFFFF03FFFFFF03FFFFFF03FFFFFF03FFFF FF03FFFFFF03FFFFFF03FFFFFF03FFFFFF03FFFFFF03FFFFFF03FFFFFF03FFFF FF03FFFFFF03FFFFFF05FFFFFF0BFFFFFF0FFFFFFF10FFFFFF10FFFFFF10FFFF FF0EFFFFFF09FFFFFF04FFFFFF02000000000000000000000000000000000000 0000000000000000000000000000FFFFFF01FFFFFF0AF0EBEC1FD4CAD332CCC3 D03BD4CDD947D9D3DD53D4CDD948CCC4D23BCAC1D039CAC1D039CAC1D039C9C1 D039C9C1D039C9C1CF39C9C0D039C9C1CF39C9C0CF39C9C0CF39C9C0CF39C9C0 CF39C9C0CF39C9C0CE39C9C0CE39C8C0CE39C9BFCE39C9BFCE39C9BFCE39C9BF CE39C9C0CE3ACEC6D340D8D1DB53DBD4DD61DCD5DE64DCD5DE64DCD5DE63DAD2 DC5DD3CBD64BCDC4D039D7CFD829FBFAF916FFFFFF0700000000000000000000 00000000000000000000FFFFFF02FFFFFE12D8CFD63F9B8CA88B675687CC5243 81E7514688EF504586F2504588EE4F4487EB4E4286EB4E4285EB4D4185EB4C40 84EB4C3F83EB4B3F82EB4B3E82EB4B3D80EB4B3C7FEB4A3C7FEB4A3B7EEB4A3A 7DEB49397CEB49397CEB49387AEB48387AEB48377AEB483679EB483578EB4835 77EB473476EB473476EC473274F2442C6CFA442C6CFA442C6BFA432B6AFB432A 6AFA442D6CF04B3370DE675284B6A394AE76E1D9DE37FFFFFF0EFFFFFF020000 00000000000000000000FFFFFF0BD1CAD545776FA3BB5157ABFF4F6EDEFF436C F0FF3963EEFF3661EBFF345EE9FF345BE7FF3359E4FF3158E2FF3056E0FF2F54 DEFF2E51DBFF2D4FDAFF2C4ED8FF2C4BD6FF2A49D3FF2A48D1FF2947D0FF2844 CDFF2742CBFF2640CAFF253FC8FF253CC5FF233BC3FF2239C2FF2237BFFF2135 BDFF2033BBFF1F31B9FF1E2FB7FF1D2EB5FF1C2CB4FF1B2AB1FF1B28AFFF1926 ADFF1C27ADFF232BA8FF292894FF362577FF715C8AADDAD1D83EFFFFFF0C0000 000000000000FFFFFF02DEDAE7237B7BB79D4D64CCFF3B6AF5FF2655EAFE2552 E6FF224FE3FF204CE1FF2049DFFF1F47DDFF1E45DBFF1C42D8FF1B41D5FF193F D3FF183DD1FF173BCFFF1638CDFF1636CBFF1534C9FF1433C6FF1331C4FF122F C2FF112DC0FF102ABEFF0F28BCFF0F26B9FF0E25B7FF0D23B5FF0B21B3FF0A1F B1FF091CAFFF081AACFF0818A9FF0716A7FF0615A5FF0513A3FF0411A1FF030E 9FFF010C9CFF00099AFF000699FE09129FFF271F83FF7664939CEDE9F024FFFF FF0100000000BAB9B309B2B6D9474D5FC2F14370F4FF2957EAFE2452E9FF1D4C E6FF1D4BE4FF1F4AE2FF214ADFFF2149DDFF1F46DBFF1E44D8FF1D43D6FF1C41 D4FF1A3ED1FF193CCFFF183ACDFF1838CBFF1736C9FF1635C7FF1533C5FF1431 C3FF132EC0FF122CBEFF122ABCFF1128BAFF1027B8FF0F25B6FF0E23B4FF0D21 B2FF0B1EAFFF0A1CACFF0A1AAAFF0918A8FF0817A6FF0715A4FF0612A2FF010D 9FFF00079CFF000298FF000597FF000695FE09119CFF2C1F7AEFC4C1CF4DB0B0 AF0CB0B0B016D4D4D4A5D1D2DABD9DA8D5FF98A9E0FF92A4DCFF899CDCFF758D DCFF5876DBFF355ADDFF1B46DFFF1A44DEFF1E45DBFF1E44D8FF1D43D6FF1C41 D4FF1A3ED1FF193CCFFF183ACDFF1838CBFF1736C9FF1635C7FF1533C5FF1431 C3FF132EC0FF122CBEFF122ABCFF1128BAFF1027B8FF0F25B6FF0E23B4FF0D21 B2FF0B1EAFFF0A1CACFF0A1AAAFF0918A8FF0716A6FF000EA2FF000C9FFF1E28 A3FF464DAEFF6469B5FF787CB9FF8285BCFF8184BBFE8E8BB7FFD3D3D6C4D1D1 D1A4B1B1B125D5D5D5FFD9D9D9FFDDDCD8FEDEDCD7FEDDDBD5FFDCDBD5FFD4D5 D6FFC4C8D7FFAEB7D7FF8A9BD7FF4C6AD6FF1B43DAFF1A41D8FF1C43D6FF1C41 D4FF1A3ED1FF193CCFFF183ACDFF1838CBFF1736C9FF1635C7FF1533C5FF1431 C3FF132EC0FF122CBEFF122ABCFF1128BAFF1027B8FF0F25B6FF0E23B4FF0D21 B2FF0B1EAFFF0A1CACFF0A1AAAFF0414A7FF0615A4FF3F49ADFF8489C1FFABAE CBFFC2C3D1FFD4D5D5FFDDDDD8FFDFDFD9FFE0E0DBFEE0E1DCFEDADADAFFD4D4 D4FFB0B0B023D4D4D4FFD7D7D7FFD7D7D7FFD7D7D7FFD7D7D7FFD7D7D7FFD8D7 D7FFD9D9D7FFDBDAD7FFD5D5D5FFC3C8D7FF97A4D4FF3858D3FF173ED6FF1B40 D4FF1A3ED1FF193CCFFF183ACDFF1838CBFF1736C9FF1635C7FF1533C5FF1431 C3FF132EC0FF122CBEFF122ABCFF1128BAFF1027B8FF0F25B6FF0E23B4FF0D21 B2FF0B1EAFFF0A1CACFF0515A9FF2C38ACFF969AC6FFC5C6D3FFD7D7D6FFDDDC D9FFDAD9D8FFD8D8D7FFD7D7D7FFD7D7D7FFD7D7D7FFD7D7D7FFD7D7D7FFD4D4 D4FFB0B0B023D3D3D3FFD6D6D6FFD6D6D6FFD6D6D6FFD6D6D6FFD6D6D6FFD6D6 D6FFD6D6D6FFD6D6D6FFD6D6D6FFD8D8D6FFD4D5D5FFC3C6D5FF687DCFFF183D D4FF1A3ED1FF193CCFFF183ACDFF1838CBFF1736C9FF1635C7FF1533C5FF1431 C3FF132EC0FF122CBEFF122ABCFF1128BAFF1027B8FF0F25B6FF0E23B4FF0D21 B2FF0B1EAFFF091AABFF636BB9FFC6C8D4FFD5D5D5FFD9D9D7FFD6D6D6FFD6D6 D6FFD6D6D6FFD6D6D6FFD6D6D6FFD6D6D6FFD6D6D6FFD6D6D6FFD6D6D6FFD3D3 D3FFB0B0B023D2D2D2FFD5D5D5FFD5D5D5FFD5D5D5FFD5D5D5FFD5D5D5FFD5D5 D5FFD5D5D5FFD5D5D5FFD5D5D5FFD5D5D5FFD5D5D5FFD6D5D5FFD2D3D6FF8895 CCFF1A3ED1FF193CCFFF183ACDFF1838CBFF1736C9FF1635C7FF1533C5FF1431 C3FF132EC0FF122CBEFF122ABCFF1128BAFF1027B8FF0F25B6FF0E23B4FF0C20 B2FF0C1FAFFF888EC1FFD6D6D8FFD6D6D5FFD5D5D5FFD5D5D5FFD5D5D5FFD5D5 D5FFD5D5D5FFD5D5D5FFD5D5D5FFD5D5D5FFD5D5D5FFD5D5D5FFD5D5D5FFD2D2 D2FFB0B0B023D2D2D2FFD4D4D4FFD3D3D3FFD3D3D3FFD4D4D4FFD4D4D4FFD4D4 D4FFD4D4D4FFD4D4D4FFD4D4D4FFD4D4D4FFD4D4D4FFD4D4D4FFD4D4D3FFD6D6 D6FF99A3CBFF1438CFFF183ACDFF1838CBFF1736C9FF1635C7FF1533C5FF1431 C3FF132EC0FF122CBEFF122ABCFF1128BAFF1027B8FF0F25B6FF0E23B4FF0A1F B0FF989DC4FFD8D8D8FFD4D4D3FFD4D4D4FFD4D4D4FFD4D4D4FFD4D4D4FFD4D4 D4FFD4D4D4FFD4D4D4FFD4D4D4FFD3D3D3FFD3D3D3FFD3D3D3FFD4D4D4FFD1D1 D1FFB0B0B023D4D4D4FFD5D5D5FDD3D4D6FFD3D3D5FFD1D2D3FFD2D3D3FFD3D3 D3FFD4D4D3FFD3D3D3FFD3D3D3FFD3D3D3FFD3D3D3FFD3D3D3FFD3D3D3FFD3D3 D3FFD5D5D5FF818EC7FF1436CDFF1838CBFF1736C9FF1635C7FF1533C5FF1431 C3FF132EC0FF122CBEFF122ABCFF1128BAFF1027B8FF0F25B6FF0A20B3FF828A C0FFDAD9D8FFD3D3D3FFD3D3D3FFD3D3D3FFD3D3D3FFD3D3D3FFD3D3D3FFD4D4 D3FFD4D4D4FFD3D3D3FFD2D2D3FFD3D3D4FFD2D3D4FFD2D2D4FFD5D5D5FCD4D4 D4FBB5B5B50CC5C4C469AAA6BDB46989E5FF6583E0FF728AD8FF909FD0FFB6BC CFFFCBCCD2FFD1D2D2FFD3D3D2FFD2D2D2FFD2D2D2FFD2D2D2FFD2D2D2FFD2D2 D2FFD2D2D2FFD1D1D3FF5B6EC6FF1434CBFF1736C9FF1635C7FF1533C5FF1431 C3FF132EC0FF122CBEFF122ABCFF1128BAFF1027B8FF0B21B5FF5864BAFFD8D8 D7FFD2D2D2FFD2D2D2FFD2D2D2FFD2D2D2FFD2D2D2FFD2D2D2FFD3D3D3FFD2D2 D2FFCDCED3FFB4B5CBFF8084BAFF585CACFF3F43A3FF4144A3FFB1ACBF9DC1C1 C15B00000000FDF6F71A9B93BD914470F4FF3361EEFF2C5BECFF2453EBFF2651 E3FF5673D4FFA2ADD1FFCBCDD2FFD2D2D1FFD1D1D1FFD1D1D1FFD1D1D1FFD1D1 D1FFD1D1D1FFD2D2D1FFBFC2CDFF2A46C7FF1434C9FF1635C7FF1533C5FF1431 C3FF132EC0FF122CBEFF122ABCFF1128BAFF0D25B8FF2135B6FFC6C8D2FFD1D1 D1FFD1D1D1FFD1D1D1FFD1D1D1FFD1D1D1FFD1D1D1FFD2D2D2FFCDCED1FF9FA2 C5FF3F46A8FF000899FF000197FF000395FF000193FF060B97FFA59AC26CFFFF FF0AFFFFFF01F0EAEC209E96BD934F78F3FF3E69EEFF3763EBFF315CE9FF2C57 E7FF214EE6FF234EDEFF7389D5FFC1C4D0FFD1D1D0FFD0D0D0FFD0D0D0FFD0D0 D0FFD0D0D0FFD1D0D0FFCECED0FF8792C5FF1232C9FF1635C7FF1533C5FF1431 C3FF132EC0FF122CBEFF122ABCFF1128BAFF0921B7FF8B93C5FFD0D0D1FFD0D0 D0FFD0D0D0FFD0D0D0FFD0D0D0FFD0D0D0FFD2D2D1FFC4C5CDFF6A71B6FF0814 9EFF00069CFF020C9BFF030B99FF020997FF000694FF0A0F98FFA79CC270F9F8 F910FFFFFF01F0EAEC20A098BD935A81F3FF4770EEFF3F68ECFF3861E9FF315C E7FF2D57E4FF2751E3FF1C47DFFF667ED3FFC3C6CFFFD0D0CFFFCFCFCFFFCFCF CFFFCFCFCFFFCFCFCFFFD1D0CFFFBBBECBFF364FC4FF1232C7FF1533C5FF1431 C3FF132EC0FF122CBEFF122ABCFF0D25BAFF2F41B8FFC5C6CFFFD0D0CFFFCFCF CFFFCFCFCFFFCFCFCFFFCFCFCFFFD1D1CFFFC4C5CCFF5E65B4FF000D9FFF020E 9FFF040F9DFF030C9BFF020B99FF020997FF000694FF0B1098FFA79CC270F9F8 F910FFFFFF01EFEAEC20A39ABD93698CF5FF557BEFFF4A71EDFF4169EAFF3962 E8FF335BE5FF2E56E2FF2951E1FF1D46DDFF7D8FD1FFCBCCCFFFCECECEFFCECE CEFFCECECEFFCECECEFFCFCFCEFFC7C8CCFF7582C2FF0C2DC8FF1533C5FF1431 C3FF132EC0FF122CBEFF122ABCFF061EB9FF7A83C1FFCACBCEFFCECECEFFCECE CEFFCECECEFFCECECEFFCFCFCEFFCACACEFF747AB8FF020FA1FF0411A2FF0511 A0FF040F9DFF030D9BFF030B99FF020997FF000794FF0C1098FFA79CC270F9F8 F910FFFFFF01EFEAEC20A39BBD937092F5FF6587F1FF5B7EEEFF4F74EBFF446B E9FF3D63E6FF365CE3FF3057E1FF2950DFFF2E52D9FFACB3CEFFCCCCCDFFCDCD CDFFCDCDCDFFCDCDCDFFCDCDCDFFCECDCCFF9EA5C4FF1A37C5FF1432C5FF1531 C3FF132FC0FF122CBEFF112ABCFF0F27B8FFA9ADC7FFCECECDFFCDCDCDFFCDCD CDFFCDCDCDFFCDCDCDFFCDCDCDFFA7AAC4FF1421A6FF0412A3FF0713A2FF0611 9FFF050F9DFF040E9BFF040C9AFF040A98FF020895FF0D1299FFA79CC270F9F8 F910FFFFFF01EFEAEC20A39BBD937092F6FF6A8BF2FF6788F0FF6182EEFF5779 EBFF4C6FE8FF4267E5FF3B60E2FF355AE0FF284EDEFF6C81CFFFCACBCFFFCDCD CCFFCCCCCCFFCCCCCCFFCCCCCCFFCECECCFFB2B6C8FF3A52C1FF1230C5FF1631 C3FF152FC0FF132DBEFF0E27BCFF3547B8FFB9BCCAFFCECECDFFCCCCCCFFCCCC CCFFCCCCCCFFCDCDCDFFC5C6CBFF6269B4FF000EA5FF0916A4FF0814A2FF0712 A0FF06109EFF060F9CFF060E9AFF070D99FF060B96FF11179BFFA89DC270F9F8 F910FFFFFF01EFEAEC20A39BBD937092F6FF6A8AF2FF6989F0FF6888EFFF6685 EDFF6080EAFF5778E8FF4C6EE5FF4465E2FF3B5DDFFF3E5ED9FFC7C9CEFFCDCD CDFFCDCDCDFFCDCDCDFFCDCDCDFFCECECDFFBDBFC9FF586AC0FF1230C6FF1733 C3FF1631C0FF152EBFFF0D26BDFF5664BBFFBFC1CAFFCECDCDFFCDCDCDFFCDCD CDFFCDCDCDFFCDCDCDFFBDBECAFF1E2BA9FF0917A7FF0A17A6FF0A16A3FF0A15 A1FF0A149FFF0B139EFF0B139CFF0C129BFF0C1299FF191E9EFFA99EC370F9F8 F910FFFFFF01EFEAEC20A39BBD937092F6FF6A8AF2FF6989F0FF6988EFFF6887 EEFF6786EBFF6583EAFF617FE8FF5A78E6FF5170E2FF4163E0FFB1B7CEFFCBCB CBFFCBCBCBFFCBCBCBFFCBCBCBFFCCCCCBFFC1C2C8FF6B7AC1FF1835C8FF1E39 C4FF1C36C2FF1A33C0FF0F29BDFF717DBEFFC4C4C9FFCCCBCBFFCBCBCBFFCBCB CBFFCBCBCBFFCBCBCBFFABAFC4FF0617A9FF101EA9FF101DA7FF111DA5FF111C A4FF121BA3FF131CA1FF151CA0FF181E9FFF191F9FFF272BA4FFABA0C370F9F8 F910FFFFFF01EFEAEC20A39BBD937092F6FF6A8AF2FF6989F0FF6888EFFF6887 EEFF6786EBFF6684EAFF6583E9FF6581E7FF637EE5FF5B77E4FFA7B0CFFFC8C8 C9FFC9C9C9FFC9C9C9FFC9C9C9FFC9C9C9FFC5C5C6FF838DC3FF243FCBFF2942 C8FF263FC5FF243CC3FF1831C1FF838BC0FFC5C5C7FFC9C9C9FFC9C9C9FFC9C9 C9FFC9C9C9FFC7C7C8FF8F95BFFF1221ADFF1B29ACFF1B28ABFF1D28AAFF1E29 A9FF202AA8FF232BA7FF262DA7FF2A31A8FF2F34A8FF3F44AEFFAEA3C570F9F8 F910FFFFFF01EFEAEC20A39BBD937092F6FF6A8AF2FF6989F0FF6888EFFF6887 EEFF6786EBFF6684EAFF6583E9FF6681E7FF6580E6FF607BE5FFAAB1D1FFCBCB CBFFCBCBCBFFCBCBCBFFCBCBCBFFCCCCCBFFC9C9CAFF8F99C8FF3952D0FF3D54 CCFF3950CAFF364CC7FF2A40C5FF949AC5FFCACACBFFCCCCCBFFCBCBCBFFCBCB CBFFCBCBCBFFC9CACBFF9398C2FF2533B4FF2E3BB4FF303BB3FF323CB2FF353E B2FF3941B2FF3D45B2FF4349B3FF484DB4FF4B4FB4FF5659B8FFB1A6C670F9F7 F910FFFFFF01EFEAEC20A39BBD937092F6FF6A8AF2FF6989F0FF6888EFFF6887 EEFF6786EBFF6684EAFF6583E9FF6681E7FF6580E6FF607AE5FFB1B7D2FFD0D0 D1FFD1D1D1FFD1D1D1FFD1D1D1FFD1D1D1FFCACBCEFF919BCAFF566BD7FF596C D4FF5668D2FF5265D0FF495CCEFF959CC6FFCDCDCEFFD1D1D1FFD1D1D1FFD1D1 D1FFD1D1D1FFCFCFD0FF9EA2C6FF444FBEFF4C57BFFF4E58BDFF5058BCFF5159 BCFF5259BBFF5258BAFF5257B9FF5156B7FF4F53B5FF575BB9FFB1A6C670F9F7 F910FFFFFF01EFEAEC20A39BBD937092F6FF6A8AF2FF6989F0FF6888EFFF6887 EEFF6786EBFF6684EAFF6583E9FF6681E7FF6580E6FF617BE4FFC6C9D2FFD5D5 D5FFD5D5D5FFD5D5D5FFD5D5D5FFD6D6D5FFCCCDD2FF8D99CEFF596FD8FF5D71 D6FF5D70D3FF5C6ED2FF5669D2FF939BC8FFCFCFD2FFD6D5D5FFD5D5D5FFD5D5 D5FFD5D5D5FFD5D5D5FFBABCCEFF505BC3FF5660C2FF545EC0FF545CBFFF535B BDFF5359BBFF5258BAFF5257B9FF5156B7FF4F53B5FF575BB9FFB1A6C670F9F7 F910FFFFFF01EFEAEC20A39BBD937092F6FF6A8AF2FF6989F0FF6888EFFF6887 EEFF6786EBFF6684EAFF6583E9FF6681E7FF637FE7FF7689D8FFD7D8DBFFDBDB DBFFDBDBDBFFDBDBDBFFDBDBDBFFDCDCDBFFCBCDD7FF7E8CCFFF5A70D8FF5D71 D6FF5D6FD3FF5C6ED2FF5769D2FF818AC7FFCFD0D7FFDBDBDBFFDBDBDBFFDBDB DBFFDBDBDBFFDBDBDAFFCDCED6FF5F69C0FF545EC2FF545EC0FF535CBFFF535B BDFF5359BBFF5258BAFF5257B9FF5156B7FF4F53B5FF575BB9FFB1A6C670F9F7 F910FFFFFF01EFEAEC20A39BBD937092F6FF6A8AF2FF6989F0FF6888EFFF6887 EEFF6786EBFF6684EAFF6583E9FF6681E7FF607CE6FFA5AFD7FFDEDEE0FFE0E0 E0FFE0E0E0FFE0E0E0FFE0E0E0FFE2E2E0FFC7CADAFF6A7BD0FF5C71D8FF5D71 D6FF5D6FD3FF5C6ED2FF596BD2FF6D78C7FFCDCED8FFE1E1E0FFE0E0E0FFE0E0 E0FFE0E0E0FFE1E1E0FFDADADEFF8C92C6FF4F5AC1FF545EC0FF535CBFFF535B BDFF5359BBFF5258BAFF5257B9FF5156B7FF4F53B5FF575BB9FFB1A6C670F9F7 F910FFFFFF01EFEAEC20A39BBD937092F6FF6A8AF2FF6989F0FF6888EFFF6887 EEFF6786EBFF6684EAFF6683E9FF627FE8FF7389DDFFD6D8DFFFE5E5E5FFE5E5 E5FFE5E5E5FFE5E5E5FFE5E5E5FFE4E4E3FFB7BDD7FF5A70D7FF5E72D7FF5D71 D6FF5D6FD3FF5C6ED2FF5B6CD1FF5969CDFFBDC1D2FFE4E4E4FFE5E5E5FFE5E5 E5FFE5E5E5FFE5E5E5FFE5E5E5FFC6C8D7FF5B65BFFF525CC0FF545CBFFF535B BDFF5359BBFF5258BAFF5257B9FF5156B7FF4F53B5FF575BB9FFB1A6C670F9F7 F910FFFFFF01EFEAEC20A39BBD937092F6FF6A8AF2FF6989F0FF6888EFFF6887 EEFF6786EBFF6684EAFF6381EAFF6781E2FFB5BDDAFFE4E5E5FFE6E6E6FFE6E6 E6FFE6E6E6FFE6E6E6FFE6E6E6FFDDDEE3FF919CD3FF5970D9FF5E73D7FF5D71 D6FF5D6FD3FF5C6ED2FF5C6DD1FF5566D0FF969DC8FFE0E1E3FFE6E6E6FFE6E6 E6FFE6E6E6FFE6E6E6FFE6E6E6FFE1E2E4FF9EA3CAFF525BBDFF525BBFFF535B BDFF5359BBFF5258BAFF5257B9FF5156B7FF4F53B5FF575BB9FFB1A6C670F9F7 F910FFFFFF01EFEAEC20A39BBD937092F6FF6A8AF2FF6989F0FF6888EFFF6887 EEFF6786EBFF6282EBFF6783E4FFA6B1DCFFE1E2E3FFE6E6E5FFE5E5E5FFE6E6 E6FFE6E6E6FFE6E6E6FFE6E6E5FFCDD1DEFF6679D5FF5E73D9FF5E73D7FF5D71 D6FF5D6FD3FF5C6ED2FF5B6DD1FF5A6ACFFF6572C8FFCFD1DAFFE5E5E5FFE6E6 E6FFE6E6E6FFE6E6E6FFE5E5E6FFE7E7E6FFDBDCE0FF8F95C8FF515ABBFF5058 BDFF535ABBFF5258BAFF5257B9FF5156B7FF4F53B5FF575BB9FFB2A8C86FF9F8 F910FFFFFF01EFEAED20A39BC1937092F5FF6A8AF2FF6989F0FF6888EFFF6686 EFFF6081ECFF758DE1FFB1BADEFFE0E1E3FFE6E6E5FFE6E6E6FFE5E5E5FFE6E6 E6FFE5E5E5FFE6E6E6FFE2E3E5FF99A3D4FF5A70DAFF5F74D8FF5E73D7FF5D71 D6FF5D6FD3FF5C6ED2FF5B6DD1FF5C6BCFFF5666CDFF99A0C9FFE4E4E5FFE6E6 E6FFE6E6E6FFE6E6E6FFE5E5E5FFE6E6E6FFE7E7E6FFDBDCE0FF9EA2CBFF5D64 BBFF4B52BAFF5056BAFF5157B9FF5156B7FF4F53B5FF575BB9FFA596B775F7F5 F71000000000FDF6FF159D99CE8E6B8FF6FF6487F4FF6284F2FF6283EEFF768F E3FFA1AFDDFFCCD0E0FFE4E4E4FFE7E6E6FFE6E6E6FFE5E5E5FFE6E6E6FFE6E6 E6FFE6E6E6FFE5E5E5FFC5C8D9FF6277D9FF5F74DAFF5F74D8FF5E73D7FF5D71 D6FF5D6FD3FF5C6ED2FF5B6DD1FF5C6BCFFF5A6ACEFF5F6EC9FFC9CBD5FFE6E6 E6FFE5E5E5FFE6E6E6FFE6E6E6FFE5E5E5FFE6E6E6FFE7E7E6FFE2E2E3FFC3C5 D7FF9093C3FF5E63B5FF4A50B5FF484EB5FF484CB4FF5256B8FF9580A473FFFF FF05B4B4B413D7D6D793C3C2D6C9A3B4E5FFA7B5E0FFB2BCDEFFC5CBDEFFD5D9 E3FFE0E1E4FFE6E6E5FFE6E6E6FFE5E5E6FFE5E5E5FFE6E6E6FFE6E6E6FFE5E5 E5FFE6E6E6FFDCDDDFFF7687D5FF5E74DCFF6074DAFF5F74D8FF5E73D7FF5D71 D6FF5D6FD3FF5C6ED2FF5B6DD1FF5C6BCFFF5B6BCEFF5867CDFF737EC7FFE1E1 E0FFE6E6E6FFE5E5E5FFE6E6E6FFE6E6E6FFE5E5E5FFE5E5E5FFE6E6E6FFE6E6 E5FFDFDFE3FFD3D3DEFFBEC0D2FFABADCBFF9B9DC7FF9799C8FFC3BDC8BDD4D3 D487B2B2B222E0E0E0FFE4E4E5FCE1E2E5FFE2E3E5FFE3E3E4FFE5E5E5FFE6E6 E5FFE6E6E6FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE6E6 E6FFE4E4E2FF8897D4FF5F76DCFF6076DBFF5F74DAFF5F74D8FF5E73D7FF5D71 D6FF5D6FD3FF5C6ED2FF5B6DD1FF5C6BCFFF5B6BCEFF5A69CDFF5867CBFF888F C6FFE8E8E5FFE6E6E6FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5 E5FFE6E6E6FFE6E6E6FFE5E5E5FFE3E3E4FFE1E1E3FFE1E1E3FFE4E4E4FBDFDF DFF8B2B2B223E1E1E1FFE7E7E7FFE7E7E6FEE7E7E6FFE7E7E6FFE6E6E6FFE6E6 E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE7E7E7FFE8E7 E5FF8E9CD5FF6079DEFF6077DCFF6076DBFF5F74DAFF5F74D8FF5E73D7FF5D71 D6FF5D6FD3FF5C6ED2FF5B6DD1FF5C6BCFFF5B6BCEFF5A69CDFF5968CCFF5966 C9FF8C93C8FFE8E8E4FFE7E7E7FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6 E6FFE6E6E6FFE6E6E6FFE6E6E6FFE7E7E6FFE7E7E6FFE7E7E6FEE7E7E7FFE1E1 E1FFB2B2B223E1E1E1FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7 E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE6E7E7FFE1E1E2FF8797 D5FF6079E0FF6179DDFF6077DCFF6076DBFF5F74DAFF5F74D8FF5E73D7FF5D71 D6FF5D6FD3FF5C6ED2FF5B6DD1FF5C6BCFFF5B6BCEFF5A69CDFF5968CCFF5966 CAFF5764C8FF888EC5FFE3E3E2FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7 E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE1E1 E1FFB2B2B223E1E1E1FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8 E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E7FFE5E5E7FFC9CCDCFF788BDAFF617B E1FF627ADFFF6179DDFF6077DCFF6076DBFF5F74DAFF5F74D8FF5E73D7FF5D71 D6FF5D6FD3FF5C6ED2FF5B6DD1FF5C6BCFFF5B6BCEFF5A69CDFF5968CCFF5966 CAFF5764C8FF5562C5FF7179C3FFCBCCD9FFE6E6E7FFE8E8E7FFE8E8E8FFE8E8 E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE1E1 E1FFB2B2B223E2E2E2FFE8E8E8FFE8E8E8FEE8E8E8FFE8E8E8FFE8E8E8FFE9E9 E8FFE9E9E8FFE7E7E6FFE1E2E7FFD3D6E3FF99A7D9FF657EE1FF627CE3FF637D E1FF617ADFFF6179DDFF6077DCFF6076DBFF5F74DAFF5F74D8FF5E73D7FF5D71 D6FF5D6FD3FF5C6ED2FF5B6DD1FF5C6BCFFF5B6BCEFF5A69CDFF5968CCFF5966 CAFF5764C8FF5663C5FF545FC4FF5A64C2FF959AC9FFD0D1DCFFE1E1E5FFE7E7 E6FFE9E9E8FFE9E9E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FEE8E8E8FFE2E2 E2FFB2B2B223DFDFDFFFE5E5E5FEE4E5E6FFE5E5E5FEE2E3E4FFDEDFE5FFD9DC E6FFD0D5E5FFBDC6E2FF95A5DEFF6B84E2FF607CE6FF647DE4FF647EE3FF637D E1FF617ADFFF6179DDFF6077DCFF6076DBFF5F74DAFF5F74D8FF5E73D7FF5D71 D6FF5D6FD3FF5C6ED2FF5B6DD1FF5C6BCFFF5B6BCEFF5A69CDFF5968CCFF5966 CAFF5764C8FF5663C5FF5761C4FF555FC3FF505AC1FF5D66BFFF8C91C6FFB6B8 D2FFCACCDBFFD6D6DFFFDCDDE1FFE2E3E4FFE3E4E4FEE5E5E5FFE4E4E4FEDEDE DEFDB1B1B114D7D7D79CD3D1DAC0AAB1D5FFACBAE8FEA5B4E3FF97A9E3FF879C E2FF718BE3FF6180E9FF607FEAFF6480E7FF6580E6FF657EE4FF647EE3FF637D E1FF617ADFFF6179DDFF6077DCFF6076DBFF5F74DAFF5F74D8FF5E73D7FF5D71 D6FF5D6FD3FF5C6ED2FF5B6DD1FF5C6BCFFF5B6BCEFF5A69CDFF5968CCFF5966 CAFF5764C8FF5663C5FF5761C4FF5660C3FF555FC2FF525CC0FF4D56BEFF4F57 BBFF6268BAFF787CBEFF8B8EC3FF9A9DC9FF9B9ECAFEA09CBEFFD5D3D8BAD4D4 D4950000000000000000BBB4CF546367B2FF6D91FCFF6183F1FE6384F0FF6484 EFFF6585ECFF6684EAFF6683E9FF6681E7FF6580E6FF657EE4FF647EE3FF637D E1FF617ADFFF6179DDFF6077DCFF6076DBFF5F74DAFF5F74D8FF5E73D7FF5D71 D6FF5D6FD3FF5C6ED2FF5B6DD1FF5C6BCFFF5B6BCEFF5A69CDFF5968CCFF5966 CAFF5764C8FF5663C5FF5761C4FF5660C3FF555FC2FF545EC0FF545CBFFF535B BDFF5057BBFF4D54B9FF4B51B8FF474DB4FE4E54BBFF50418BF9D5CFE2450000 000000000000FFFFFF06D8D1DA3B7B6E9CCA7B8FE1FF6C8FF6FE6686EFFE6887 EEFF6786EBFF6684EAFF6583E9FF6581E7FF647FE6FF647DE4FF637DE2FF627C E0FF617ADFFF6179DDFF6077DCFF6076DBFF5F74DAFF5F74D8FF5D72D7FF5C70 D5FF5C6FD3FF5B6DD2FF5B6CD1FF5B6ACFFF5A6ACDFF5968CCFF5867CBFF5865 C9FF5764C8FF5663C5FF5661C4FF5660C3FF555FC2FF545EC0FF535CBFFF535B BDFF5259BBFF5056B9FF4D53B7FE585EBEFF6460ADFF7B6895AEE7E2E929FFFF FF0300000000FFFFFF02F8F4F419BBAEBE6A7E77A7E07B89D4FF7C9AF7FF6D8D F4FF6688F1FF6587F0FF6585EFFF6986EDFF6A88ECFF6A86EBFF6A85EAFF6984 E7FF6882E6FF6881E4FF677FE3FF667EE2FF667DE1FF657CDFFF657ADEFF6378 DCFF6377DAFF6276D9FF6275D7FF6273D6FF6172D4FF6071D3FF5F6FD2FF5F6D D0FF5E6CCFFF5C6BCCFF5A67CAFF5561C7FF5460C6FF535FC4FF525DC3FF525C C1FF565FC1FF6269C5FF7279CBFF6F6AADFF776491D3C4B8C650FCFAFA0E0000 00000000000000000000FFFFFF05F9F7F620BFB2C05D978DB2A47973A9DF6F6C ABFC6968AAFF6A68AAFF6967A9FF6B68A8FF6B68A7FF6B67A7FF6B66A7FF6B66 A5FF6A65A4FF6A65A4FF6A63A3FF6963A3FF6862A2FF6862A1FF6861A0FF6860 9FFF675F9EFF675F9EFF675E9DFF675D9CFF665D9CFF665C9BFF655B9AFF655A 99FF645A98FF645997FF635796FF615595FF615494FF605393FF605392FF6052 91FF625392FF65538DFF6F5B8BEA917F9EAEC0B2BF56FEFDFC17FFFFFF020000 0000000000000000000000000000FFFFFF04FFFFFF10DBD1D827C1B6C745C5BE D157B3A8BB62A696AA66A898AB66A797AB66A797AB66A797AA66A797AB66A797 AA66A796AA66A796AA66A796AA66A796AA66A696AA66A696A966A695A966A695 A966A695A966A695A866A695A866A694A866A694A866A694A866A694A866A694 A766A594A766A593A766A594A766A694A766A693A766A593A766A593A666A593 A666A593A665B5A7B95FC1B4C351DDD3D831FFFFFF11FFFFFF03000000000000 00000000000000000000000000000000000000000000FFFFFF02FFFFFF07FFFF FF0AFFFFFA0CF6EFEA0CF7F1EB0CF7F1EB0CF7F1EC0CF7F1EC0CF7F1EC0CF7F1 EC0CF7F1EC0CF7F1EC0CF7F1EC0CF7F1EC0CF7F1EC0CF7F1EC0CF7F2EC0CF7F2 EC0CF7F2EC0CF7F2EC0CF7F2ED0CF7F2ED0CF7F2ED0CF7F2ED0CF7F2ED0CF7F2 ED0CF8F2ED0CF8F2ED0CF8F2ED0CF8F2ED0CF8F3ED0CF8F3ED0CF8F3EE0CF8F2 ED0CF8F3EE0CFFFFFF0BFFFFFF09FFFFFF05FFFFFF0100000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000F8000000001FFFFFE00000000007FFFFC00000000001FFFFC00000000001 FFFF800000000000FFFF800000000000FFFF000000000000FFFF000000000000 FFFF000000000000FFFF000000000000FFFF000000000000FFFF000000000000 FFFF000000000000FFFF000000000000FFFF800000000000FFFF000000000000 FFFF000000000000FFFF000000000000FFFF000000000000FFFF000000000000 FFFF000000000000FFFF000000000000FFFF000000000000FFFF000000000000 FFFF000000000000FFFF000000000000FFFF000000000000FFFF000000000000 FFFF000000000000FFFF000000000000FFFF000000000000FFFF000000000000 FFFF800000000000FFFF000000000000FFFF000000000000FFFF000000000000 FFFF000000000000FFFF000000000000FFFF000000000000FFFF000000000000 FFFF000000000000FFFFC00000000001FFFF800000000000FFFF800000000001 FFFFC00000000001FFFFE00000000003FFFFF80000000007FFFFFFFFFFFFFFFF FFFF280000004000000080000000010020000000000000420000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000F7F7FA01FBFBFC04FCFCFC05FBFB FD03F6F6F90100000000F7F6FA0100000000F6F6F901F6F6F901F6F6F901F7F6 F901F6F6F901F6F6F901F7F6F901F6F6F901F7F6F901F6F5F901F6F5F901F6F5 F801F6F6F901F6F6F901F6F6F901F5F5F801F6F5F801F6F5F801F6F6F901F6F6 F901F6F5F801F6F5F801F6F5F801F6F6F901F6F5F801F6F5F801FCFCFD04FCFC FD07FDFDFD08FCFCFD08FCFCFD08FDFDFD08FDFDFD08FCFCFC07FCFCFD04F5F4 F701000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000FBFA FB01FBFBFC04FCFCFD0EFAF9F914F4F0F117F0EDF01BF4F1F325F4F1F32BF4F1 F324F1EDEF1BEEE9ED16EFEAED16EEEAED16EDE9EC15EFEAED16EDE9EC15EFEB ED16EFEAED16EFEBED16EFEAED16EEEAEC16EFEAED16EFEAED16EFEAED16EFEA ED16EFEAED16EFEAED16EEE9EC16EEEAED16EFEAED16EFEAED16EDE9EC15EFEA ED16EEEAED15EFEBEE16EFEBEE16EFEBED16EFEBEE17F2EEF01BF4F1F327F6F3 F533F5F3F438F5F3F438F5F3F438F5F3F438F5F3F438F4F2F333F4F2F326F4F1 F41AFBF9F913FCFCFC0DFBFBFB05F9F8F9020000000000000000000000000000 0000000000000000000000000000000000000000000000000000FDFDFD02FBFB FC0CF8F7F822E9E5E83ED5C8C95AA289927090748A80977C908A93778A979980 92879073897E8D6F867A8D6F867A8D70867A8D6F867A8D70867A8D70867A8C70 86798D70867A8D7086798D70857A8D70857A8D7085798D70857A8E6F867A8E6F 867A8E6F867A8E70867A8D6F857A8D70867A8D70867A8C6F867A8D7086798D70 857A8C70867A8D7086798D71867A8D71867A8D70867A92768B80977B908E9477 89A094788AA795788BA794778AA794788AA795788AA6917486A194788C8EA48E A275D7CACD58E4DEE53DF4F2F428FBFBFC16FAFAFB0600000000000000000000 00000000000000000000000000000000000000000000FCFCFD02F9F9F912F1EF F234C6BCCB696A4E72C4412B68F63B2E74FD48448DFD484793FE474693FD4645 92FE454391FE454290FE444190FE44408FFE443F8DFE433E8DFE433E8CFE423D 8BFD423C8AFE423B8AFE413B88FD413A87FE413986FE403985FE403785FE3F37 84FE3F3683FE3F3582FE3E3481FE3D3480FE3D3380FE3D337FFE3C327EFD3C31 7DFE3C317CFE3B307BFE3B2F7BFE3B2E7AFD3A2D79FE3A2C79FE3A2B78FD392A 77FE392A77FE392976FE382875FE382874FE382773FE372771FE372672FE2F16 59FD2B0C52FD4A2B63D7AB9CB085E0DAE14DF7F7F921FCFCFC09000000000000 00000000000000000000000000000000000000000000FAFAFB0DEFEDF034A699 B084493B7BEF6C79C9FD4C6EE1FD3E67EAFD355EE8FE325CE6FE3059E4FD2E57 E2FE2E55E1FE2D53DFFE2C52DEFE2B51DCFE2A50DAFE294DD8FE284CD7FE284A D5FD2748D4FE2647D2FE2645D0FD2544CFFE2543CEFE2442CCFE2340CBFE233F C9FE223DC7FE213CC6FE203AC4FE1F38C2FE1F37C1FE1E35BFFE1E34BEFD1D33 BCFE1C31BBFE1B30B9FE1B2EB8FE1A2DB6FD192BB4FE192AB2FE1828B1FD1727 AFFE1726AEFE1625ACFE1523AAFE1522A9FE1420A7FE131FA6FD121DA4FE1923 A6FD1C219EFD34339BFD4C3A7DFD553563CACCC3D055F8F7F921FBFAFB060000 000000000000000000000000000000000000F7F7F904F6F5F71FBFB7CC694946 93F76A8BF0FD315DE9FD2B57E6FE2854E5FE2550E3FE234EE0FF224CDFFE2149 DDFF2047DCFF1F46DAFF1F44D8FF1D43D6FF1D41D4FF1C40D3FF1A3ED1FF1A3D CFFE193BCEFF183ACCFF1839CBFE1737C9FF1736C7FF1635C6FF1533C4FF1532 C3FF1430C1FF132EBFFF122CBDFF112ABBFF1129BAFF1027B8FF0F26B7FE0E25 B5FF0D23B3FF0D22B2FF0C20B0FF0B1FAFFE0B1DACFF0A1BAAFF0A1AA9FE0918 A7FF0817A6FF0816A4FF0614A2FF0613A1FF05119FFF04109EFF040E9CFF030C 9AFE030B99FE000695FE070F9BFC38318AFD4F3265CDDCD6DE4DFAFAFA16F5F5 F70200000000000000000000000000000000FAFBFC0BD8D5E33C4A4592D95B82 F2FD315EEAFD2D59E8FE2A56E6FE2753E5FE2451E3FE234FE1FE214CE0FE2049 DEFE2048DDFE1F47DBFE1E44D9FE1D43D7FE1C42D5FE1C41D4FE1A3FD2FE1A3D D0FE193CCFFE183ACDFE1839CCFE1737CAFE1736C8FE1635C7FE1533C5FE1532 C4FE1430C2FE132EC0FE122CBEFE112ABCFE1129BBFE1027B9FE0F26B8FE0E25 B6FE0D23B4FE0D22B3FE0C20B1FE0B1FB0FE0B1DADFE0A1BABFE0A1AAAFE0918 A8FE0817A7FE0816A5FE0614A3FE0613A2FE0511A0FE04109FFE040E9DFE030C 9BFE020B9AFE020A98FE010895FE050A96FC302A8EFDA395AF87F3F1F429F8F8 FA05000000000000000000000000B6B6B608E2E2E419C2C4E05D4B69D7F65278 EDFD315EE9FE2E5AE8FE2956E6FF2652E4FD2350E2FF224DE0FF214BDFFD204A DDFF2049DCFF1E46DAFF1E44D9FF1D43D7FF1C42D4FF1C40D3FF193FD1FF1A3D D0FD193BCEFF173ACCFF1839CCFD1736C9FF1735C8FF1534C6FF1533C5FF1532 C4FF132FC2FF122EBFFF112BBDFF112ABBFF1129BAFF1026B8FF0F26B8FD0E24 B5FF0C23B3FF0C22B2FF0B20B0FF0B1FB0FD0A1DACFF091AABFF0A1AAAFD0818 A8FF0817A6FF0816A4FF0614A3FF0613A2FF0511A0FF04109FFF040E9DFF040C 9BFF030C9AFE040C99FF060B97FE060894FE1F229EFD3C2369DFD8D5DB40D2D2 D312B2B2B20300000000A6A6A605BDBDBD60C8C8C872B2B4CDA98597D5FD6B87 DEFE6D87DFFE6985DEFF4A6EE2FE3F65E1FD3860E0FF3158DEFF2850DEFD214A DDFF1F48DDFF1E46DAFF1E44D8FF1D43D6FF1C42D4FF1C40D4FF1A3FD2FF1A3D D0FD193CCFFF183ACDFF1839CCFD1737CAFF1735C8FF1635C6FF1533C4FF1532 C4FF1430C2FF132EC0FF122CBEFF112ABBFF1128BBFF1027B9FF0F26B8FD0E25 B6FF0D23B4FF0D22B3FF0C20B1FF0B1FB0FD0B1DADFF0A1AABFF0A1AAAFD0817 A8FF0817A7FF0816A5FF0614A3FF0512A1FF0814A0FF111BA0FF1821A2FF2027 A2FF252CA3FF3C42A8FE4F53ABFE4C4FA5FE5052A6FD564D8EFDC8C7C4A7C0C0 C07BB6B6B62D00000000A1A1A10CCFCFCFF7D8D8D8FCD8D8D6FCD8D8D7FED9D8 D6FED8D7D5FED9D8D6FED9D8D6FFD1D4D9FEBEC3D4FFA3ADD0FF7187D2FE3A5E DCFF274EDCFF2148DAFF1D44D9FF1D43D6FF1C42D4FF1B40D4FF1A3FD2FF193C CFFE193BCFFF1839CCFF1838CCFE1737CAFF1736C8FF1535C7FF1433C5FF1432 C4FF1330C1FF132EC0FF122BBEFF1129BCFF1128BBFF1027B9FF0E26B7FE0E25 B6FF0D23B4FF0D22B3FF0C20B1FF0B1EB0FE0A1CADFF091BABFF0A1AA9FE0918 A8FF0817A6FF0917A5FF0C19A4FF161DA4FF3840AAFF7E82B9FFACAEC8FFC6C7 D4FFD6D7D6FFD8D8D5FFD8D9D7FFD9D9D8FEDADAD9FEDCDBD9FDD9D9D9FCD8D8 D8FDC0C0C07400000000A1A1A10CCFCFCFF3D6D6D6FCD5D5D5FDD6D6D6FED6D6 D7FED5D5D6FED6D6D7FED4D5D6FED4D5D6FDD5D6D7FED8D9D9FED9D9D7FDC7C9 D0FE8596D2FE4A67D6FE2C4FD7FE1E44D6FE1C42D4FE1C41D3FE1A3FD2FE1A3D D0FD193CCFFE183ACDFE1839CCFD1737CAFE1735C8FE1635C7FE1532C5FE1532 C4FE1430C2FE132EC0FE112CBEFE112ABCFE1129BBFE1027B9FE0F26B8FD0E25 B6FE0D22B4FE0D22B3FE0C20B1FE0B1FB0FD0B1DADFE0A1BABFE0A1AAAFD0919 A8FE0D1CA6FE2530AAFE4B54B2FE9FA3C3FED9D9D8FEDDDDDCFED6D7D7FED5D5 D6FED5D5D6FED5D5D6FED5D5D6FED5D5D6FED5D5D6FED5D5D6FED5D5D5FDD6D6 D6FDC0C0C07300000000A1A1A10DCFCFCFF5D5D5D5FDD5D5D5FDD6D6D6FED6D6 D6FED6D6D6FED6D6D6FED6D6D6FED6D6D6FDD6D6D6FED5D5D5FED5D5D6FDD4D4 D6FED4D5D6FECCCED6FE909DCCFE3C5CD5FE2549D4FE1C41D3FE1A3FD1FE193D D0FD193BCEFE1739CCFE1839CBFD1636CAFE1635C8FE1535C7FE1532C4FE1532 C3FE142FC2FE122DBFFE122BBDFE112ABCFE1128BAFE1027B9FE0F26B8FD0E25 B5FE0D22B4FE0D22B2FE0C20B1FE0B1EAFFD0B1DADFE0A1BABFE0B1BA9FD1826 AAFE4650AFFEACAEC9FED5D6D9FED5D5D7FED5D5D6FED5D5D5FED5D5D5FED5D5 D5FED6D6D6FED6D6D6FED6D6D6FED6D6D6FED6D6D6FED5D5D5FED5D5D5FDD5D5 D5FEC0C0C07400000000A1A1A10DCFCFCFF5D4D4D4FED4D4D4FED5D5D5FFD5D5 D5FFD5D5D5FFD5D5D5FFD5D5D5FFD5D5D5FED5D5D5FFD4D4D4FFD4D4D4FED5D5 D5FFD4D4D4FFD4D3D5FFD5D5D7FFB7BCD0FF6379CFFF294CD2FF1C40D2FF193D CFFE193CCEFF183ACDFF1839CCFE1737CAFF1736C8FF1635C7FF1533C5FF1532 C4FF1430C2FF132EC0FF122CBEFF112ABCFF1129BBFF1027B9FF0F26B8FE0E25 B6FF0D23B4FF0D22B3FF0C20B1FF0B1FB0FE0B1DADFF0E20ABFF2B38ADFE7F84 BEFFCBCCD4FFD7D7D7FFD3D3D4FFD4D4D4FFD5D5D5FFD4D4D4FFD5D5D5FFD4D4 D4FFD5D5D5FFD5D5D5FFD5D5D5FFD5D5D5FFD5D5D5FFD4D4D4FFD4D4D4FED4D4 D4FFC0C0C07400000000A1A1A10DCECECEF5D3D3D3FED3D3D3FED4D4D4FFD4D4 D4FFD4D4D4FFD4D4D4FFD4D4D4FFD4D4D4FED3D3D3FFD3D3D3FFD4D4D4FED4D4 D4FFD4D4D4FFD3D3D4FFD2D2D3FFD3D3D4FFC8CAD4FF8290CBFF3252D1FF1C3F CFFE193CCEFF1739CDFF1839CCFE1737CAFF1736C8FF1635C6FF1532C4FF1532 C3FF1430C2FF132EC0FF122CBEFF112ABCFF1129BBFF1027B9FF0F26B8FE0E25 B6FF0D23B4FF0D22B3FF0C20B1FF0C1FB0FE1324AEFF3B48B3FFA8ACCBFED4D4 D7FFD3D3D4FFD2D2D3FFD3D3D3FFD3D3D3FFD4D4D4FFD3D3D3FFD4D4D4FFD3D3 D3FFD4D4D4FFD4D4D4FFD4D4D4FFD4D4D4FFD4D4D4FFD4D4D4FFD3D3D3FED4D4 D4FFC0C0C07400000000A2A2A20CCDCDCDF4D2D3D2FDD2D2D2FDD3D3D4FED3D3 D4FED3D3D3FED4D4D3FED4D4D4FED4D4D4FED3D3D3FED3D3D3FED4D4D4FED4D4 D4FED4D4D4FED4D4D4FED3D3D3FED2D2D3FED2D2D3FECCCDD3FE939FCEFE3855 CEFE1C3DCEFE183ACCFE1839CCFE1737CAFE1736C8FE1635C7FE1533C5FE1532 C4FE1430C2FE132EC0FE122CBEFE112ABCFE1129BBFE1027B9FE0F25B8FE0E25 B6FE0D23B4FE0D22B2FE0D21B1FE1426B0FE4955B5FEB3B6CEFED3D4D5FED2D2 D2FED2D2D3FED3D3D3FED3D3D3FED3D3D3FED4D4D4FED3D3D3FED4D4D4FED3D3 D3FED4D4D4FED4D4D4FED4D4D4FED3D3D3FED3D3D3FED3D3D3FED2D2D2FDD3D3 D3FEBFBFBF7300000000A2A2A20CCECECEF3D3D3D3FDD2D2D2FDD3D3D3FED3D3 D3FED3D3D3FFD3D3D3FFD3D3D3FFD3D3D3FED2D2D2FFD2D2D2FFD3D3D3FED3D3 D3FFD3D3D3FFD3D3D3FFD2D2D2FFD3D3D3FFD3D3D3FFD2D3D4FFCFD0D2FF9AA3 CBFE3552CCFF193BCDFF1839CBFE1736CAFF1735C7FF1635C6FF1533C4FF1531 C3FF1330C2FF132EC0FF122CBEFF112ABCFF1129BBFF1027B9FF0F26B8FE0E25 B6FF0D23B4FF0E22B3FF1226B2FF4956B8FEB5B8CEFFD2D2D3FFD1D2D2FED3D3 D3FFD3D3D3FFD3D3D3FFD3D3D3FFD2D2D2FFD3D3D3FFD3D3D3FFD4D4D4FFD2D2 D2FFD3D3D3FFD3D3D3FFD2D2D3FFD2D2D3FFD2D2D3FED2D2D2FED2D2D2FDD3D3 D3FDBFBFBF7300000000A2A2A20CCCCCCCEFD1D1D1F9CFCFCFFCCFD0D3FECFD0 D3FED0D0D0FFD3D2D1FFD4D4D3FFD3D3D4FED2D2D2FFD2D2D2FFD3D3D3FED3D3 D3FFD3D3D3FFD3D3D3FFD2D2D2FFD2D2D2FFD3D3D3FFD2D2D2FFD1D1D2FFC7C9 CFFE8893C9FF2947CCFF193ACBFE1737C9FF1736C8FF1635C7FF1533C5FF1532 C4FF1430C2FF132EC0FF122CBDFF112ABCFF1129BBFF1027B9FF0F26B8FE0E25 B6FF0D24B4FF1124B2FF3C4BB6FFAAAECFFED1D2D5FFD2D2D2FFD3D3D3FED2D2 D2FFD3D3D3FFD3D3D3FFD3D3D3FFD2D2D2FFD3D3D3FFD2D2D2FFD2D2D3FFD2D2 D2FFD4D4D4FFD5D5D4FFD4D4D2FFCECED1FFCCCCD0FECDCDD0FED0D0D0FAD1D1 D1F9BEBEBE7100000000A4A4A408C7C7C7A9CFD0CFC0B7B4C0E8A1B0DAFE9EAD D9FEA2ADD2FEACB5D1FEB9BED1FEC6C8D0FECECED0FED0D1D1FED1D1D2FED1D1 D1FED2D2D2FED2D2D2FED2D2D2FED2D2D2FED2D2D2FED2D2D2FED1D1D1FED1D1 D2FEC1C4D0FE7181C7FE203FCAFE1837C9FE1736C8FE1635C7FE1433C5FE1432 C4FE1430C2FE132EC0FE122CBEFE1129BCFE1129BAFE1027B8FE0F26B7FE0E25 B6FE1025B5FE2B3CB4FE959BC6FECCCDD1FED0D0D1FED1D1D1FED1D1D1FED2D2 D2FED2D2D2FED2D2D2FED2D2D2FED1D1D1FED1D1D1FED1D1D2FED2D2D3FECECE D1FEC0C1CEFEAFB0C9FEA4A4C3FE9292BDFE8C8CBAFE9293BCFECAC8CBCDCDCC CDB4BDBDBD4F0000000000000000EFF0F109ECEAF03B7C6C9CBB3E6BF1FE3361 ECFE2F5DEBFF335CE2FF516FD3FF7D8FCDFE9EAAD1FFB3BAD1FFCCCDCFFED2D2 D2FFD1D1D1FFD2D2D1FFD1D1D1FFD1D1D1FFD2D2D2FFD1D1D1FFD1D1D1FFD0D0 D0FED0D0D0FFABB1CDFF4B61C7FE1A39C9FF1736C8FF1635C6FF1533C4FF1532 C4FF1430C2FF132DC0FF122CBEFF112ABCFF1129BBFF1027B9FF0F26B7FE0F26 B6FF182CB5FF7780C0FFC5C7D0FFD1D1D3FED1D1D1FFD1D1D1FFD1D1D1FED1D1 D1FFD2D2D2FFD1D1D1FFD1D1D2FFD0D0D1FFD3D3D3FFC4C5CDFFACAECAFF9194 C1FF5458A9FF1B219AFF030695FF020494FF020392FE15199CFEC3B5C864F1F0 F113C9C9CA010000000000000000F4F4F50EEDEBF03F7E709DBC4570F0FD3A66 ECFD3562EAFE315DE8FE2D59E7FE2955E5FD3259DEFE5471D6FE96A3CEFDC1C4 D2FED0D0D1FED0D0D1FED0D0D0FED1D1D1FED1D1D1FED1D1D1FED1D1D1FED0D0 D0FDCFD0D0FECDCDCFFE959FC9FD2F4AC6FE1836C8FE1635C7FE1533C4FE1532 C3FE142FC2FE122DBFFE122CBDFE112ABBFE1128BBFE1027B9FE1027B8FD1027 B6FE4555B9FEABB0CAFED0D0D1FECFCFD0FDD1D1D1FED0D0D0FED0D0D0FDD1D1 D1FED1D1D1FED0D0D0FED0D0D1FECDCED0FEBABCCCFE777BB6FE2C34A3FE0811 9BFE020A99FE020A98FE020A96FE020895FE010593FD171C9DFDC3B5C868F3F2 F318D7D7DA020000000000000000FCFDFD0BEFECF13D7E6F9CBB4A73F1FD3F69 EDFD3864ECFF345EE9FF305BE7FF2D57E5FD2A55E3FF2651E2FF2E55DDFD7388 CFFFB2B9CFFFCFCECEFFCFCFCFFFD0D0CFFFCFCFCFFFD0D0D0FFCFCFCFFFCFCF CFFDCFCFCFFFCECED0FFB8BBCBFD6173C5FF1837C8FF1735C6FF1533C5FF1532 C4FF1430C1FF132DC0FF122CBEFF112ABCFF1129BBFF1027B9FF1128B8FD1F34 B7FF9097C6FFCECFD0FFCECECFFFD0D0CFFDCFCFCFFFD0D0D0FFCFCFCFFDCFCF D0FFCFCFD0FFCECECFFFCCCCCFFFA3A6C7FF4E55ACFF0D169FFF050F9DFF040D 9BFF030C9AFF010A98FF010795FF000694FF000392FD161B9CFDC3B4C766F7F6 F715000000000000000000000000FCFDFD0CEFEDF23E80709DBC527AF2FD466E EEFD3F68EBFF3862EAFF345EE8FF2F5AE6FD2B56E3FF2853E1FF2851E0FD2C53 DCFF5A75D1FFB4BACDFFCECECFFFCECFCEFFCFCFCFFFCFCFCFFFCFCFCFFFCECE CEFDCECFCFFFCDCDCEFFCCCDCCFD949DC6FF2E49C5FF1635C6FF1533C5FF1431 C4FF1330C1FF132EC0FF112BBEFF112ABCFF1129BBFF1128B9FF0F26B8FD4E5C BCFFAEB2CAFFCECECFFFCECECEFFCFCFCFFDCFCFCFFFCFCFCFFFCECECEFDCFCF CFFFCDCDCFFFCBCBCEFFA2A4C4FF323BA9FF0A16A1FF06119FFF040E9DFF030C 9BFF010A99FF010998FF000896FF010795FF000493FD171C9DFDC3B5C867F8F6 F815F4F4F9010000000000000000FDFDFE0BEFEDF13E81729DBB5C82F2FD4E75 EEFD466FECFF3F69EAFF3962E8FF345EE7FD2F59E4FF2B55E2FF2952E0FD2750 DEFF2C52DCFF627BD2FFBEC1CDFFCDCECEFFCECECEFFCECECEFFCECECEFFCECE CEFDCECECEFFCDCDCDFFCDCECEFDB8BBC8FF6273C1FF1837C6FF1633C5FF1532 C3FF142FC1FF132EBFFF122CBDFF112ABBFF1129BAFF1129B9FF172CB8FD7D86 C2FFC6C7CBFFCCCDCDFFCDCDCEFFCECECDFDCECECEFFCECECEFFCDCDCDFDCDCD CDFFCCCCCFFFA6A9C4FF3A43ABFF0C18A2FF0611A0FF04109EFF030D9DFF030C 9BFF020B9AFF010A98FF010896FF010795FF000593FD171C9DFDC3B4C866F8F6 F816F4F4FA010000000000000000FDFDFE0CF0EDF23E83739DBC668AF3FE5A7E EFFE5076EDFF486FEBFF4168E9FF3B63E7FE355EE5FF3159E3FF2D55E1FE2A52 DFFF274FDDFF3255D9FF7C8ECCFFC8CACEFFCCCCCCFFCDCDCDFFCDCDCDFFCDCD CDFECDCDCDFFCDCDCDFFCCCCCDFEC6C7CBFF808CC6FF213EC5FF1634C5FF1431 C3FF1330C2FF132EC0FF122CBEFF112ABCFF1129BBFF1028B9FF3C4DB9FEA3A8 C6FFCECECDFFCCCDCDFFCDCDCDFFCECECEFECECECEFFCECECEFFCDCDCDFECCCC CDFFBDBECAFF4F58B0FF101EA4FF0713A2FF0511A0FF04109FFF040E9DFF030C 9BFF030B9AFF020B98FF020996FF020895FF000593FE171C9DFEC2B5C867F8F6 F816F4F4F9010000000000000000FDFEFE0BF0EDF23D83739DBC6C8DF3FD6587 F0FD5D80EEFF5479ECFF4B71EAFF456BE8FD3E65E6FF385FE3FF335AE2FD2F56 E0FF2C52DEFF2A4FDCFF4464D6FFA6AECCFFCDCCCEFFCBCCCCFFCCCCCCFFCCCC CCFDCCCCCCFFCCCCCCFFCBCCCCFDCACACBFF969EC7FF364FC3FF1634C5FF1531 C3FF1330C1FF132EC0FF122CBEFF112ABCFF122ABBFF1229BAFF6672BDFDBCBE C9FFCCCCCCFFCCCCCCFFCDCDCDFFCCCCCCFDCDCDCDFFCCCCCCFFCBCBCCFDCACB CCFF787DB7FF1A27A7FF0615A3FF0613A2FF0511A0FF04109EFF040F9DFF040D 9BFF030C9AFF030B98FF020996FF020896FF010694FD191E9EFDC2B4C766F8F6 F815F5F5FA010000000000000000FDFEFE0CF0EDF23D83739DBC6C8DF3FE698A F0FE6688EFFF6082EDFF597CEBFF5174E9FE496DE7FF4167E5FF3C61E2FE365C E1FF3157DFFF2E53DDFF3457D8FF6C81CFFFCCCCCCFFCACBCBFFCBCCCCFFCBCB CBFECCCCCCFFCCCCCBFFCBCBCBFECACACBFFB0B4C5FF5669C0FF1432C5FF1733 C3FF1430C2FF142FC0FF132DBEFF122BBCFF122BBBFF1930B9FF7D87C2FEC5C6 CBFFCACACBFFCBCBCBFFCCCCCCFFCBCBCBFECCCCCCFFCBCBCBFFCACACBFEB8B8 C6FF3642ADFF0A18A5FF0815A3FF0714A2FF0612A0FF05109EFF050F9DFF040E 9CFF040D9BFF030C99FF040B98FF040A96FF040994FE1C219FFEC2B4C767F8F6 F816F5F5FA010000000000000000FDFEFE0CF0EEF23E84749DBC6D8EF4FE6989 F0FE6888EFFF6787EEFF6484ECFF5F7EEBFE5678E9FF4E71E6FF476AE4FE4064 E2FF3B5FE0FF375ADEFF3155DBFF4B68D7FFB2B7CAFFCBCBCCFFCBCBCBFFCCCC CBFECBCBCBFFCBCBCBFFCBCBCBFECACACBFFC2C2C4FF727EBFFF1734C5FF1733 C3FF1430C2FF142FC0FF132DBEFF122CBCFF132CBBFF253ABAFF8B93C5FEC9CA CCFFCACBCBFFCBCBCCFFCCCCCCFFCBCBCBFECCCCCCFFCBCBCBFFCDCDCDFE8B8F BBFF2431A9FF0A18A6FF0815A4FF0714A3FF0713A1FF06129FFF06119EFF0710 9CFF060F9BFF060E9AFF070E98FF080E97FF090D96FE2026A0FEC2B4C767F7F6 F716F5F5FA010000000000000000FDFDFD0CEFEDF13D84739DBC6D8EF4FE6A8A F1FE6888F0FE6787EEFE6886EDFE6785ECFE6281EAFE5D7DE8FE5676E6FE4F6F E4FE486AE2FE4264E0FE3C5EDEFE4766DAFE8B99D0FECACACBFECACACBFECBCB CAFECBCBCBFECBCBCBFECACACAFEC9C9CAFEC7C7C5FE838DC0FE2540C5FE1A36 C4FE1733C2FE1631C1FE152FBFFE152DBDFE142CBCFE3347BAFE969CC3FEC9C9 CAFEC9CACAFECACACAFECBCBCBFECACACAFECBCBCBFEC9C9CAFED0D0CDFE5860 B3FE1422A8FE0C19A6FE0B17A5FE0A16A3FE0A15A2FE0A15A0FE0A149FFE0B14 9EFE0B139DFE0B139CFE0C139BFE0E149AFE0F1499FE272CA3FEC2B3C766F8F6 F815F5F5FA010000000000000000FDFEFE0CEFEDF13E84749DBC6C8DF4FE6989 F0FE6988F0FF6788EEFF6886EDFF6785ECFE6685EAFF6584E9FF6280E8FE5D7C E6FF5876E4FF5270E2FF4B6BE0FF4C6ADDFF798CD4FFC9CACBFFC8C9CAFFCACA CAFECACACAFFCACACAFFCACAC9FEC9C9CAFFC8C7C7FF8D96C1FF334CC4FF1F3B C5FF1C37C3FF1A35C1FF1933BFFF1832BEFF162FBDFF4455B9FFA1A5C3FEC9C9 C9FFC9C9C9FFCACACAFFCACACAFFCACACAFECACACAFFC8C8C9FFC6C6C8FE3D48 B1FF0F1EA9FF0F1DA7FF0E1BA6FF0F1BA5FF0F1BA3FF0F1AA2FF101AA1FF111A A0FF111AA0FF131B9FFF151B9EFF171D9EFF191E9DFE3135A8FEC1B3C767F7F6 F816F5F6FA010000000000000000FDFEFE0CF0EEF23E84749DBC6D8EF3FE6A8A F1FE6989F0FF6888EFFF6887EDFF6785ECFE6585EAFF6584E9FF6482E8FE6481 E7FF637FE6FF5F7CE5FF5C78E3FF5A75DFFF7C8FD6FFC8C9CCFFC7C8C9FFC9C9 C9FEC9C9C9FFC9C9C9FFC9C9C8FEC8C8C8FFC7C7C7FF989FC3FF445AC3FF2741 C7FF243EC5FF223BC3FF1F39C1FF1F37BFFF1B33BEFF5564BBFFACAFC2FEC8C8 C8FFC8C8C8FFC9C9C8FFC9C9C9FFC9C9C9FEC8C8C8FFC7C8C9FFACAFC2FE3441 B1FF1422ABFF1523AAFF1522A9FF1623A8FF1723A6FF1723A5FF1923A5FF1A24 A4FF1C24A4FF1F26A4FF2128A4FF2429A4FF282CA4FE4145AEFEC1B2C667F7F5 F815F6F6FB010000000000000000FDFEFE0CEFEEF13D84749CBB6C8EF3FE6A8A F0FE6988F0FE6787EFFE6987EEFE6785ECFE6684EBFE6684E9FE6582E8FE6481 E7FE6480E6FE647FE5FE647EE4FE657DE1FE8394D8FEC8C9CDFEC7C8C9FEC9C9 C9FEC9C9C9FEC9C9C9FEC8C8C8FEC8C8C8FEC7C7C7FEA3A9C4FE576AC6FE334C CAFE2F48C8FE2D45C6FE2A42C4FE2A40C2FE243CC1FE6572BDFEB4B7C3FEC8C8 C8FEC8C8C8FEC9C9C8FEC9C9C9FEC9C9C9FEC8C8C8FEC7C8C9FE9C9FBFFE3844 B3FE1F2DAFFE202EAEFE212DADFE222EACFE242EABFE242FAAFE2730AAFE2932 ABFE2C34ABFE2F36ABFE3339ABFE383CACFE3D40ACFE5357B6FEC0B2C667F7F5 F816F7F7FB010000000000000000FDFEFE0CEFEEF23E84749DBC6C8DF4FE6989 F0FE6989F0FF6888EFFF6987EEFF6785ECFE6685EBFF6684EAFF6583E8FE6482 E8FF6480E6FF647EE5FF647EE3FF667EE1FF8596D9FFCACBCEFFCACACBFFCBCB CBFECBCBCBFFCBCBCBFFCBCBCBFECACACAFFCBCBCAFFA8AEC8FF6375C8FF445B CEFF4057CCFF3D53CBFF3A50C8FF394EC6FF3348C5FF7480C1FFBCBDC6FECACA CBFFCACACAFFCBCBCBFFCBCBCBFFCBCBCBFECACACAFFCACACBFF9FA3C2FE4550 B8FF303CB5FF313EB4FF333DB3FF343EB2FF3740B2FF3942B2FF3C44B2FF3E46 B3FF4148B2FF444AB2FF474CB3FF4A4EB3FF4C4FB3FE5E62BBFEBFB1C667F7F5 F816F7F7FB010000000000000000FDFEFE0CF0EEF23E84749DBC6D8EF3FE6A8A F1FE6989F0FF6888EFFF6987EDFF6886EDFE6685EBFF6684EAFF6583E9FE6582 E8FF6581E6FF647FE5FF647EE4FF677FE1FF8899DAFFCECFD2FFCECECFFFCFCF D0FECFCFCFFFD0D0D0FFCFCFCFFECFCFCFFFCECECEFFA9AFCAFF6A7BCDFF576B D3FF5368D1FF5165D0FF4E62CDFF4E60CCFF495CCBFF7984C4FFBBBDC8FECECF CFFFCFCFCFFFD0D0CFFFD0D0D0FFD0D0CFFECFCFCFFFCFCECFFFA5A8C4FE5761 BDFF4550BDFF4752BCFF4851BBFF4952BAFF4A53B9FF4C54B9FF4D54B8FF4E54 B8FF4E54B7FF4F54B7FF4F54B6FF4F53B5FF4E52B4FE5F63BBFEBFB1C667F7F5 F716F7F7FB010000000000000000FDFDFD0CEFEEF13E84739DBC6D8EF4FE6A8A F1FE6989EFFE6888EEFE6987EEFE6886EDFE6685EBFE6684EAFE6683E9FE6582 E7FE6581E7FE657FE5FE647EE4FE6981E1FE909FDAFED1D2D3FED2D2D3FED2D2 D3FED3D3D3FED3D3D3FED2D2D2FED2D2D2FED0D0D0FEA7ADCCFE697BD0FE5E71 D5FE5C6FD3FE5B6ED2FE5A6DD1FE5A6CD0FE5869D0FE7B86C7FEB9BCCBFED2D2 D2FED2D2D2FED3D3D2FED3D3D3FED3D3D2FED2D2D2FED2D2D2FEB8BAC8FE6770 C3FE525CC2FE535DC0FE525CBFFE525BBEFE525BBCFE525ABBFE5158BAFE5157 B9FE5056B8FE4F55B7FE4F54B5FE4E53B5FE4E52B4FE5F62BBFEBFB1C667F7F5 F716F7F7FB010000000000000000FDFEFE0CEFEDF23E84749DBC6D8EF4FE6A8A F1FE6989F0FF6887EFFF6987EEFF6886EDFE6585EBFF6584E9FF6683E9FE6582 E7FF6580E7FF657FE5FF647EE3FF6D84E0FFA0ABD6FFD5D5D6FFD6D6D6FFD6D6 D6FED7D7D7FFD7D7D7FFD6D6D6FED6D6D6FFD2D2D1FFA3ABCDFF6578D4FF5E71 D5FF5C6FD4FF5B6ED2FF5B6DD1FF5B6DD0FF5B6BD0FF7681CAFFB6BACEFED5D5 D6FFD6D6D6FFD6D6D6FFD7D7D7FFD6D6D6FED6D6D6FFD5D5D6FFD0D0D0FE767E C5FF5560C2FF545EC0FF525CBEFF525BBDFF525ABCFF5259BBFF5158BAFF5157 B9FF5056B8FF4F55B7FF5055B6FF4F54B6FF4F53B5FE6063BCFEBFB0C667F7F5 F815F8F8FC010000000000000000FCFDFD0CF0EEF13E84749CBC6C8EF4FE6A8A F1FE6989F0FE6787EFFE6987EEFE6886ECFE6685EAFE6683EAFE6683E9FE6582 E8FE6581E7FE657FE5FE637EE4FE758BDEFEBDC1D0FED9D9DAFED9D9D9FEDADA DAFEDADADAFEDADADAFED9D9D9FED9D9DAFED1D1D2FE98A2CDFE5E73D7FE5E72 D6FE5C70D4FE5B6ED3FE5B6DD1FE5B6CD0FE5B6CCFFE6A77CBFEAEB3D0FED8D8 D9FED9D9D9FED9D9D9FEDADADAFED9D9D9FEDADADAFED9D9D9FEDBDBD9FE8E94 C5FE5C66C1FE555FC0FE535CBFFE535CBEFE535BBDFE535ABCFE5259BBFE5258 BAFE5157B9FE5056B8FE5055B6FE4E54B6FE4F52B5FE6062BCFEBFB1C667F7F5 F816F8F8FC010000000000000000FCFDFD0CF0EEF23E84749DBC6D8EF4FD6A8A F1FD6889F0FE6888EFFE6887EEFE6786EDFD6685EBFE6684E9FE6583E9FD6582 E7FE6580E7FE6580E5FE6881E1FE8D9CD8FEDAD9DAFEDEDEDEFEDFDFDFFEDFDF DFFDDFDFDFFEDFDFDEFEDEDEDEFDDDDEDEFEC9CBD4FE8894CEFE5D71D7FE5E72 D6FE5C70D4FE5C6ED3FE5C6ED1FE5B6DD1FE5C6CD0FE6371CCFEA7ADD1FDD9D9 DBFEDEDEDEFEDEDEDEFEDFDFDFFEDFDFDFFDDFDFDFFEDEDEDEFEDFDFDFFDB4B7 CFFE6971C4FE555FC1FE535DBEFE535CBEFE535BBCFE5359BCFE5259BBFE5258 BAFE5157B9FE5056B8FE5055B6FE4F53B6FE4F53B5FD6063BCFDBFB1C666F7F5 F816F8F8FC010000000000000000FCFDFD0CEFEEF23E84749DBC6C8EF3FE6989 F0FE6989F0FF6888EFFF6987EDFF6785ECFE6685EBFF6684EAFF6582E8FE6582 E8FF6581E6FF6580E5FF768CE0FFB8BFD8FFE3E3E4FFE2E2E2FFE3E3E3FFE3E3 E3FEE3E3E3FFE3E3E2FFE2E2E2FEE0E1E2FFBBC0D9FF7585D2FF5E73D7FF5E72 D6FF5D70D5FF5C6FD3FF5C6ED2FF5B6DD1FF5C6CD0FF5E6ECEFF989FCBFED5D5 D9FFE2E2E3FFE2E2E2FFE3E3E3FFE3E3E3FEE3E3E3FFE2E2E2FFE1E1E2FED6D6 DBFF7D84C6FF5861C0FF535DBFFF525CBEFF535BBDFF535ABCFF5259BBFF5258 BAFF5157B9FF5056B8FF5055B6FF4F54B6FF4E52B4FE5F62BBFEBFB1C567F6F5 F816F8F8FC010000000000000000FDFEFE0CF0EEF23E84739DBC6D8EF4FE6A8A F1FE6888EFFF6888EFFF6887EEFF6886EDFE6685EBFF6683E9FF6583E9FE6581 E7FF6581E7FF6983E3FF92A1D8FFDADBE0FFE3E3E4FFE5E5E4FFE4E4E4FFE5E5 E5FEE5E5E5FFE4E4E4FFE4E4E4FEE0E0E2FFAEB6DAFF677AD4FF5E73D6FF5E72 D5FF5C6FD5FF5C6FD3FF5C6ED1FF5B6DD1FF5B6CD0FF5C6BCEFF828BC5FEC8C9 D5FFE3E3E4FFE4E4E4FFE4E4E4FFE4E4E4FEE5E5E5FFE5E5E5FFE4E4E4FEE3E3 E3FFB6B9D1FF6971C1FF545EBEFF535DBEFF535BBDFF535ABCFF5258BAFF5258 BAFF5157B8FF5056B8FF5055B6FF4F54B6FF4F53B4FE6063BCFEBFB1C667F6F5 F816F8F8FC010000000000000000FDFEFE0BF0EEF23D84739CBB6D8EF4FD698A F1FD6888EFFF6787EFFF6886EDFF6886EDFD6584EAFF6583EAFF6583E9FD6682 E7FF6883E6FF8296DDFFC8CCDAFFE3E4E4FFE4E4E4FFE5E5E5FFE5E5E5FFE5E5 E5FDE5E5E5FFE4E4E4FFE5E4E5FDD6D7DDFF98A2D2FF6175D6FF5E73D6FF5E71 D5FF5D6FD5FF5B6ED2FF5B6DD1FF5B6DD1FF5B6CCFFF5C6BCEFF6774CAFDAEB3 D0FFDFDFDFFFE4E4E4FFE4E4E4FFE4E4E4FDE5E5E5FFE5E5E5FFE5E5E5FDE4E4 E4FFDEDEE0FF999EC8FF5D66BFFF535DBFFF535BBCFF525ABBFF5259BAFF5258 BAFF5056B9FF4F55B7FF4F55B5FF4F54B5FF4F53B5FD6063BCFDBEB0C567F6F4 F716F7F7FB010000000000000000FDFEFE0CF0EDF23E83749DBC6D8EF3FE6A8A F1FE6989F0FF6888EFFF6887EEFF6786ECFE6685EBFF6684E9FF6683E8FE6783 E7FF788EDFFFBCC3D8FFE2E2E2FFE4E4E4FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5 E5FEE5E5E5FFE4E4E4FFE4E3E4FEBEC3DAFF7585D3FF5F74D7FF5E72D6FF5E72 D6FF5D70D5FF5C6FD3FF5C6ED2FF5B6DD1FF5B6CD0FF5B6BCEFF5B6ACDFE8E96 CBFFD0D1DAFFE4E4E4FFE4E4E4FFE5E5E5FEE5E5E5FFE5E5E5FFE5E5E5FEE5E5 E5FFE3E3E4FFD3D3DDFF8F94C4FF5B65BEFF545CBDFF535ABCFF5259BAFF5258 BAFF5157B9FF5056B8FF5055B6FF4F54B6FF4F53B5FE6063BCFEBEB0C567F6F4 F716F8F8FB010000000000000000FDFDFE0BEFEDF23D84749CBB6C8EF4FE6989 F1FE6888F0FE6787EFFE6886EDFE6886ECFE6685EAFE6684EAFE6784E8FE8195 DDFEBAC2DCFEE0E1E2FEE4E4E4FEE5E5E5FEE5E5E5FEE5E5E5FEE5E5E5FEE5E5 E5FEE5E5E5FEE4E4E4FED7D9E0FE9DA7D7FE6276D8FE5F74D7FE5E72D6FE5D71 D6FE5D6FD5FE5C6FD2FE5C6ED1FE5B6CD0FE5B6CD0FE5B6ACEFE5B6ACDFE6D7A C8FEB8BCD4FEE2E2E2FEE4E4E4FEE5E5E5FEE5E5E5FEE5E5E5FEE5E5E5FEE5E5 E5FEE5E5E5FEE4E4E4FED1D2DBFE9599C7FE5D65BCFE535BBCFE535ABBFE5258 B9FE5157B8FE4F55B7FE4F54B6FE4E53B6FE4E52B5FE5F63BCFEBAAABF68F6F4 F615000000000000000000000000F8F8F80DEFEDF33E8376AEBC6D8EF3FD6A8A F0FD6989EFFF6888EEFF6987EDFF6887ECFD6886EAFF6F8BE5FF96A5D8FDCBCF E1FFE0E0E2FFE5E5E6FFE5E5E5FFE5E5E5FFE5E5E5FFE6E6E6FFE5E5E5FFE5E5 E5FDE4E4E4FFE4E4E4FFC0C6DEFD7888D4FF6074D9FF5F74D8FF5E72D6FF5D71 D6FF5D70D4FF5C6FD3FF5C6ED1FF5B6CD1FF5B6CD0FF5B6ACEFF5B6ACDFD5B6B CCFF9198C7FFD1D2D9FFE3E3E4FFE5E4E4FDE5E5E5FFE5E5E5FFE5E5E5FDE5E5 E5FFE5E5E5FFE5E5E5FFE4E4E5FFD4D5DEFFAFB1CEFF6B72BEFF565DBAFF5359 BAFF5258B9FF5157B8FF5055B6FF4F54B6FF4F53B5FD6165BCFDA892A86FF1ED F017E1E1E3010000000000000000F5F5F60BEEECF43D8278BCBB6D8EF3FD698A F2FE6888F1FE6586F0FF6686EDFF768FE0FD9AAADBFFB9C2E1FFD3D6DEFDE4E4 E4FFE4E4E4FFE5E5E5FFE5E5E5FFE5E5E5FFE6E6E6FFE5E5E5FFE5E5E5FFE5E5 E5FDE4E4E4FFD1D4DDFF94A0D5FD6378D8FF6074D8FF5F74D8FF5E72D6FF5E71 D6FF5C70D5FF5B6FD3FF5B6ED2FF5B6CD1FF5B6CD0FF5B6ACEFF5A6ACDFD5969 CDFF6875C9FFAFB4D1FFDDDEE0FFE4E4E4FDE5E5E5FFE5E5E5FFE5E5E5FDE5E5 E5FFE5E5E5FFE5E5E5FFE5E5E5FFE4E4E5FFDFDFE1FFC2C4D8FFA4A6CBFF7A7D B9FF5A5EB3FF4E54B7FF4E53B6FF4E53B6FE4F53B5FE6064BEFDA28AA171EFEB EE15D0D0D10100000000A7A7A704C9C9C957DBDBDB7C9F99C2D18CA3E5FE8EA1 DFFE96A6DCFFA2B0DBFFB6BEDAFFC9CFE1FED7D9E1FFE0E1E3FFE5E5E5FEE4E4 E4FFE4E4E4FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E4FFE4E4 E4FEDCDDE2FFACB4D8FF6A7FD8FE6075DAFF5F74D9FF5F74D8FF5D71D7FF5D71 D5FF5D6FD4FF5B6ED3FF5B6DD1FF5B6CD0FF5B6CCFFF5B6ACDFF5A6ACDFE5A6A CCFF5A6ACCFF7A85C6FFC5C8D7FFE4E3E3FEE4E4E4FFE5E5E5FFE5E5E5FEE5E5 E5FFE5E5E5FFE5E5E5FFE5E5E5FFE4E4E4FFE5E5E5FFE4E4E4FFDBDBDFFFD0D0 DCFFBDBDD1FFA4A6C5FF9194BEFF8587BDFF797BBBFE8385C1FEB7ACB7A0D0D0 D062B9B9B927000000009F9F9F0BD7D7D7D1E2E2E2E1D6D5DCF4D0D5E3FED1D5 E2FED4D7E0FED9DADFFFE0E0DFFFE5E5E4FEE5E5E5FFE5E5E5FFE4E5E5FEE5E5 E5FFE5E5E5FFE6E6E6FFE6E6E6FFE6E6E6FFE5E5E5FFE5E5E5FFE4E4E4FFE0E0 E1FEBBC1D8FF7688D7FF6177DBFE6075D9FF5F74D8FF5F73D8FF5E72D7FF5E72 D6FF5D70D4FF5C6FD3FF5C6ED2FF5B6DD1FF5B6CD0FF5B6ACEFF5A6ACDFE5969 CDFF5868CBFF5D6CC8FF8991CAFFCDCFDCFEE3E3E4FFE5E4E4FFE6E6E6FEE5E5 E5FFE6E6E6FFE6E6E6FFE5E5E5FFE5E5E5FFE5E5E5FFE4E4E4FFE4E4E4FFE6E6 E6FFE4E4E3FFDCDCDEFFD5D5DBFFD1D1DBFECCCDDBFECDCEDBFEDCDADCE9E1E1 E1DCC4C4C462000000009E9E9E0CD8D8D8F3E5E5E5FDE3E3E4FDE4E4E5FEE4E4 E5FEE4E4E5FEE3E3E4FFE4E4E5FFE4E4E4FDE4E4E4FFE5E5E5FFE5E5E5FDE5E5 E5FFE5E5E5FFE4E4E4FFE5E5E5FFE5E5E5FFE4E4E4FFE3E3E4FFE2E2E3FFC6CA DBFD8292D5FF6279DBFF6077DAFD5F75DAFF5F74D9FF5F74D8FF5E72D7FF5E72 D6FF5D70D5FF5C6FD3FF5C6ED2FF5B6DD1FF5B6CCFFF5B6ACEFF5A6ACDFD5969 CDFF5868CBFF5968CAFF606DC8FF979ECBFDD5D6DDFFE3E4E4FFE4E4E4FDE5E5 E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE4E4E4FFE4E4 E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E5FEE4E4E5FEE4E4E4FEE4E4E4FDE5E5 E5FDC6C6C673000000009E9E9E0CD8D8D8F4E5E5E5FDE5E5E5FDE6E6E6FEE6E6 E6FEE6E6E6FFE5E5E5FFE5E5E5FFE6E6E6FEE6E6E6FFE6E6E6FFE6E6E6FEE6E6 E6FFE5E5E5FFE5E5E5FFE6E6E6FFE5E5E5FFE4E5E5FFE3E3E4FFC8CCDCFF8191 D5FE667CDBFF6078DCFF6077DBFE5F75DAFF5F74D9FF5F74D8FF5E72D7FF5E72 D6FF5D70D5FF5C6FD3FF5C6DD2FF5B6DD1FF5B6CD0FF5B6ACEFF5A69CDFE5969 CDFF5868CBFF5867CAFF5966C9FF636FC8FE9A9FCBFFD6D6DEFFE4E4E5FEE5E5 E5FFE6E6E6FFE6E6E6FFE5E5E5FFE6E6E6FFE6E6E6FFE5E5E5FFE6E6E6FFE6E6 E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FEE5E5E5FEE5E5E5FDE5E5 E5FEC6C6C673000000009E9E9E0DD9D9D9F5E6E6E6FEE6E6E6FEE7E7E7FEE7E7 E7FEE7E7E7FEE6E6E6FEE6E6E6FEE7E7E7FEE7E7E7FEE6E6E6FEE7E7E7FEE6E6 E6FEE6E6E6FEE6E6E6FEE5E6E6FEE5E5E5FEE3E3E2FEC3C7D8FE8092D9FE647C DCFE6179DCFE6077DBFE6076DBFE5F74DAFE5F74D9FE5F74D7FE5E72D7FE5E72 D6FE5D70D5FE5C6FD3FE5C6ED2FE5B6DD1FE5B6BD0FE5B6ACEFE596ACDFE5869 CDFE5868CBFE5867CBFE5865C8FE5865C8FE636FC6FE9198C9FED4D5DFFEE5E5 E6FEE4E4E5FEE6E6E6FEE6E6E6FEE6E6E6FEE6E6E6FEE6E6E6FEE6E6E6FEE7E7 E7FEE7E7E7FEE7E7E7FEE7E7E7FEE7E7E7FEE7E7E7FEE6E6E6FEE6E6E6FEE6E6 E6FEC6C6C674000000009E9E9E0DD8D8D8F5E6E6E6FEE6E6E6FEE7E7E7FFE7E7 E7FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FEE6E6E6FFE6E6E6FFE7E7E7FEE7E7 E6FFE6E6E5FFE5E5E6FFE4E5E5FFDDDEE2FFB3BBDAFF798CDCFF647DDEFF617A DEFE6179DCFF6077DCFF6077DBFE5F75DAFF5F74D9FF5F74D8FF5E72D7FF5E72 D6FF5D70D5FF5C6FD3FF5C6ED2FF5B6DD1FF5B6CD0FF5B6ACEFF5A6ACDFE5969 CDFF5868CBFF5867CAFF5865C9FF5864C7FE5764C6FF5E6AC5FF868CC4FEC7C8 D8FFE3E3E5FFE5E5E6FFE5E5E5FFE6E6E6FFE7E7E7FFE6E6E6FFE7E7E7FFE6E6 E6FFE6E6E6FFE7E7E7FFE6E6E6FFE7E7E7FFE7E7E7FFE6E6E6FFE6E6E6FEE6E6 E6FFC6C6C674000000009E9E9E0DD9D9D9F5E6E6E6FEE6E6E6FEE7E7E7FEE7E7 E7FFE7E7E7FEE6E6E6FFE7E7E7FFE7E7E7FEE7E7E7FFE6E6E6FFE7E7E7FEE6E6 E6FFE5E6E6FFE6E6E6FFCFD2DDFF919FD9FF7187DFFF647CE0FF627BDFFF617A DDFE6178DCFF6077DCFF5F77DAFE5F74D9FF5F74D8FF5F74D8FF5E72D6FF5E72 D6FF5D70D5FF5C6FD3FF5C6ED2FF5B6CD1FF5B6CD0FF5B6ACDFF5A6ACCFE5969 CDFF5868CBFF5866CBFF5865C8FF5764C8FE5764C6FF5662C5FF5C67C2FE7078 C6FFA4A8C8FFDCDDE0FFE6E6E6FFE4E5E6FFE6E6E6FFE7E7E7FFE6E6E6FFE7E7 E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FEE7E7E7FFE6E6E6FEE6E6E6FEE6E6 E6FFC7C7C774000000009E9E9E0CD8D8D8F4E6E6E6FDE6E6E6FDE7E7E7FEE7E7 E7FEE6E6E7FFE6E6E6FFE6E6E7FFE6E6E7FEE6E6E7FFE5E6E6FFE8E8E8FEE7E6 E7FFCDD0DCFFA4B1DCFF798EDDFF6780E1FF637DE1FF637CE0FF617BDEFF6079 DEFE6179DDFF6077DCFF5F76DBFE5F75DAFF5F74D9FF5F74D8FF5E72D7FF5E72 D6FF5D70D5FF5C6FD3FF5C6ED2FF5B6DD1FF5B6CD0FF5B6ACEFF5969CCFE5969 CDFF5868CBFF5867CBFF5865C9FF5864C8FE5764C6FF5662C4FF5661C4FE5761 C3FF5E68C2FF7D84C4FFB0B2CFFFD7D7DBFFE8E8E7FFE7E7E8FFE6E6E7FFE6E6 E6FFE6E6E6FFE7E7E7FFE6E6E6FFE7E7E7FFE7E7E7FEE6E6E6FEE6E6E6FDE6E6 E6FEC6C6C673000000009E9E9E0CD9D9D9F3E7E7E7FCE6E6E6FDE7E7E7FEE6E6 E7FEE6E7E7FEE6E6E7FEE5E6E7FEE6E7E7FDE6E7E9FEDEDFE3FEC3C8D6FD90A0 D8FE748DE4FE6C85E4FE657EE3FE647EE3FE637DE1FE637CE0FE617BDFFE617A DDFD6179DCFE5F77DBFE6076DBFD5E74D9FE5E73D8FE5E73D7FE5D72D6FE5D72 D5FE5D70D5FE5B6ED3FE5B6DD2FE5A6CD0FE5A6BCFFE5A69CDFE5A6ACDFD5869 CCFE5767CAFE5766CAFE5765C8FE5864C8FD5763C5FE5662C5FE5661C4FD5660 C3FE545FC2FE5862C0FE5F68C0FE6F76C4FE9DA0C5FEC7C8D1FEDCDCDFFEE4E4 E5FEE4E5E5FEE5E5E5FEE5E5E6FEE5E5E6FEE5E6E6FEE5E5E6FEE6E6E7FCE7E7 E7FDC7C7C77300000000A4A4A40CC6C6C6D8DADADAE6D2D1D6F2C9CCD7FDCCD0 DCFEC6CAD7FEB7BFD7FFAEB8D9FF9CACE0FD8A9EE3FF7C95E3FF718BE5FD6884 E6FF6481E7FF647FE5FF647EE3FF647EE2FF637CE1FF637CE1FF617BDFFF6179 DEFD6179DDFF6077DCFF6076DAFD5F75DAFF5F73D8FF5F73D7FF5E71D6FF5E71 D6FF5D70D5FF5B6FD3FF5B6ED2FF5B6DD1FF5B6BCFFF5B6ACDFF596ACCFD5969 CDFF5867CBFF5866CBFF5865C9FF5763C7FD5764C6FF5662C4FF5561C4FD5660 C3FF555FC2FF555FC1FF535DBFFF545DBEFF5A61BDFF646BBEFF7277C0FF8186 C3FF989AC7FFADAECAFFC1C2CFFFC0C0CCFEC7C8D3FEC7C6CFFDD0D0D1EBD2D2 D2E3BFBFBF6600000000A4A4A401C3C3C31CE0DFE235A599B894889AE0FD708F EFFE708EEEFE6F8CEDFF6E8BEBFE6C89EBFE6986E9FF6784E9FF6683E9FE6582 E8FF6581E6FF647FE4FF647EE3FF637DE3FF627CE2FF627CE1FF607BDFFF617A DEFE6078DDFF6077DCFF6077DBFE5F74D9FF5F73D9FF5F73D8FF5E72D7FF5E72 D5FF5D70D5FF5C6FD3FF5C6ED2FF5B6CD1FF5B6CD0FF5B6ACEFF5A6ACDFE5969 CDFF5868CBFF5867CBFF5865C9FF5864C8FE5764C5FF5762C5FF5661C5FE5660 C3FF545EC2FF555FC0FF535DBFFF535CBEFF535BBDFF535ABCFF545BBBFF565C BAFF575BBAFF585DB9FE595DB8FF585BB7FE5E63BBFE503C7CFDDCDAE05FD5D5 D523BEBEBE0D0000000000000000F2F2F402F7F5F81BC3BBCF6B696FB8FA7D9A F5FD6888F0FE6788EFFE6887EEFF6886ECFD6685EAFF6684E9FF6683E8FD6582 E7FF6481E7FF647EE5FF647EE4FF637DE3FF627CE2FF627CE1FF617BDEFF6179 DEFD6178DDFF6076DCFF6076DBFD5F74DAFF5F74D9FF5E73D8FF5D72D6FF5D71 D6FF5C70D5FF5C6FD3FF5B6ED2FF5B6DD1FF5A6CD0FF5A69CEFF5A6ACDFD5869 CDFF5868CAFF5867CAFF5765C9FF5764C8FD5663C6FF5662C4FF5661C5FD5560 C3FF555FC2FF555FC1FF525CBFFF535CBEFF535BBDFF535ABCFF5259BBFF5258 BAFF5156B9FF4F55B8FF4F54B6FE4D51B4FE5D5FB5FD593E75D8E6E1EA3BFCFC FD0C000000000000000000000000E9E8EA01FAFAFB13DBD4DD4D5C4678E08AA0 EDFD6786EEFD6889EEFE6887EEFE6886EDFD6685EAFE6584EAFE6582E9FD6481 E8FE6480E7FE657FE5FE657EE4FE647EE3FE637DE2FE637CE1FE617BDFFE617A DEFD6179DDFE6077DCFE6077DBFD5F75DAFE5F74D9FE5F74D8FE5E72D7FE5E72 D6FE5D70D5FE5C6FD3FE5C6ED2FE5B6DD1FE5B6CD0FE5B6ACEFE5A6ACDFD5969 CDFE5868CBFE5867CBFE5865C9FE5864C8FD5764C6FE5762C5FE5661C5FD5560 C3FE545EC2FE545EC1FE525CBFFE525BBEFE525ABDFE5259BCFE5259BBFE5258 BAFE5157B9FE5157B8FE4F54B5FE656AC0FC645B9EFDA99AB580F3F1F425F9F9 FA0600000000000000000000000000000000FBFBFC09F3F0F12EAD9BAA85645B 94FA93A8EFFD6989EEFD6787EDFE6785ECFD6684EAFE6683E9FE6682E8FD6581 E7FE6580E6FE647EE4FE647DE3FE637DE2FE627CE1FE627BE0FE617ADEFE6179 DDFD6178DCFE6076DBFE6076DAFD5F74D9FE5F73D8FE5E73D7FE5D71D5FE5D71 D5FE5C6FD4FE5C6ED2FE5B6DD1FE5B6CD0FE5A6BCFFE5A69CDFE5A69CCFD5968 CCFE5867CAFE5867CAFE5765C8FE5764C7FD5663C5FE5662C4FE5661C4FD5560 C2FE555FC1FE555FC0FE535DBEFE535CBDFE535BBCFE535ABBFE5259BAFE5258 B9FE5156B8FE5156B7FE6266BDFD7A74B2FD5D406CCFDCD6DF46FBFAFB100000 000000000000000000000000000000000000FBFAFB01FAFAFA14EBE7EA40A392 A791645388F48B97D7FD93ACF9FD7492F1FD6686ECFD6484EBFE6382EAFD6381 E9FE6581E9FE6D88E9FE6F89E8FE6F88E7FE6F88E6FE6F87E5FE6E86E3FE6E85 E2FD6D84E1FE6D82E0FE6C82DFFD6C81DEFE6C80DDFE6B7FDCFE6A7EDBFE6A7D DAFE697CD9FE687BD8FE687AD7FE6879D6FE6778D5FE6776D4FE6776D3FD6675 D2FE6574D1FE6573D0FE6471CEFE6470CDFD636FCCFE636ECBFE5E6AC8FD5560 C4FE535EC2FE525DC1FE515BBFFE505ABEFE515ABDFE5058BCFE5A61BFFE686E C4FE8186CFFE9297D5FD70649CFD6F5379CBCFC5CF5CF8F6F81FFBFAFB040000 00000000000000000000000000000000000000000000FDFCFD05FAF9FA16F0EE F137CFC7D560725A7FB365578BE5776EA0F47677B2FA7776B1F97775B2FA7775 B1FA7674B0FA7674AFFA7673AFFA7673AEFA7572AEFA7572ADFA7571ABFA7471 ABFA7571AAFA7470A9FA7470A9FA746FA9FA746EA8FA736EA8FA736DA7FA736D A7FA726DA6FA726CA6FA726BA5FA726BA4FA716AA4FA716AA3FA7169A3FA7168 A2FA7167A2FA7067A1FA7066A1FA7066A0FA7065A0FA70659FFA6F659EFA6F64 9DFA6F649DFA6F639CFA6E639CFA6D629BF96D629BFA6D619AFA6D6198F96C5F 97FA675384F6593B69E381647DA9D7CED753F8F6F824FBFBFB09000000000000 0000000000000000000000000000000000000000000000000000FBFBFB03FCFB FC0EF9F8FA1DE3DDE432DAD5DE4AD7D1DD5CCDC6D365A28D9C76A28D9C76A28D 9C76A18C9C77A28C9B77A18C9B77A28C9B76A28C9A77A28C9B77A18C9A77A28C 9B76A28C9B77A28C9A77A28C9A77A28C9A77A28C9A77A28C9A76A28B9A77A28C 9A77A18B9A76A18B9A77A28B9A77A28B9977A28A9977A28B9977A18A9977A28B 9877A28A9877A18B9876A18B9977A18B9976A18B9976A18A9877A18B9977A18B 9976A18B9977A18B9977A18B9976A18B9976A08A9877A18A9876A0899776B09E AB6FCFC6D161DCD5DD52EAE5E937FAF9FA1AFBFAFB09FCFCFC01000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000F7F7F903FCFCFC08FBFBFC10FAF9FA17F7F6F718EEEAED18EEEAEC19EEE9 EC18EFEBED19EFEBED19EFEBED19EEEAEC19EFEBED19EFEBED19EFEBED19EEEA ED18EFEBED19EFEBED19EDE9EB18EFEBED19EFEBED19EFEBED19EFEBED19EFEB ED19EFEBED19EFEBED19EFEBED19EEEAEC18EFEBED19EFEBED19EEEAEC19EEEA EC19EEEAEC18EEEAEC19EFEBED19EEEAEC18EFEBED19EFEBED19EFEBED19EEEA EC19EFEBED19EFEBED19EEEAEC19EFEBED19EEEAEC19EEEAEC19EEEAEC19F2F0 F119F9F8F918FBFBFC14FDFCFD0BFAF9FA030000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000F6F6F901F6F6F901F6F5 F801F7F6F901F6F6F901F6F6F901F6F5F801F6F6F901F6F6F901F6F6F901F6F6 F901F6F6F901F6F5F801F6F6F901F6F6F901F6F6F901F6F5F801F6F6F901F6F6 F901F6F6F901F6F6F901F6F6F901F6F6F901F6F5F801F6F5F801F6F5F801F6F5 F801F5F5F801F6F5F801F6F5F801F6F5F801F6F6F901F6F5F801F6F5F801F6F5 F801F6F6F801F6F5F801F6F5F801F6F5F801F6F5F801F6F5F801F6F5F801F6F5 F801000000000000000000000000000000000000000000000000000000000000 00000000000000000000FFFFFFFFFFFFFFFFFFC14000000003FFF80000000000 003FF00000000000001FE00000000000000FE000000000000007C00000000000 0003C00000000000000380000000000000010000000000000001000000000000 0001000000000000000100000000000000010000000000000001000000000000 0001000000000000000100000000000000010000000000000001000000000000 0001800000000000000180000000000000018000000000000003800000000000 0001800000000000000180000000000000018000000000000001800000000000 0001800000000000000180000000000000018000000000000001800000000000 0001800000000000000180000000000000018000000000000001800000000000 0001800000000000000180000000000000018000000000000001800000000000 0001800000000000000180000000000000018000000000000001800000000000 0003800000000000000180000000000000010000000000000001000000000000 0001000000000000000100000000000000010000000000000001000000000000 0001000000000000000100000000000000010000000000000001000000000000 0001000000000000000180000000000000038000000000000003C00000000000 0007C000000000000007E00000000000000FF00000000000000FFC0000000000 003FFFE00000000003FF } Hint = 'Double Commander - click to restore' OnClick = MainTrayIconClick OnDblClick = MainTrayIconClick left = 220 top = 168 end object pmTabMenu: TPopupMenu left = 374 top = 136 object miNewTab: TMenuItem Action = actNewTab OnClick = mnuTabMenuClick end object miRenameTab: TMenuItem Action = actRenameTab OnClick = mnuTabMenuClick end object miLine14: TMenuItem Caption = '-' end object miCloseTab: TMenuItem Action = actCloseTab OnClick = mnuTabMenuClick end object miCloseAllTabs: TMenuItem Action = actCloseAllTabs OnClick = mnuTabMenuClick end object miLine19: TMenuItem Caption = '-' end object miTabOptions: TMenuItem Caption = 'Tab options' object miTabOptionNormal: TMenuItem Action = actSetTabOptionNormal GroupIndex = 1 RadioItem = True OnClick = mnuTabMenuClick end object miTabOptionPathLocked: TMenuItem Action = actSetTabOptionPathLocked GroupIndex = 1 RadioItem = True OnClick = mnuTabMenuClick end object miTabOptionPathResets: TMenuItem Action = actSetTabOptionPathResets GroupIndex = 1 RadioItem = True OnClick = mnuTabMenuClick end object miTabOptionDirsInNewTab: TMenuItem Action = actSetTabOptionDirsInNewTab GroupIndex = 1 RadioItem = True OnClick = mnuTabMenuClick end end end object pmTrayIconMenu: TPopupMenu left = 294 top = 193 object miTrayIconRestore: TMenuItem Caption = 'Restore' OnClick = miTrayIconRestoreClick end object miLine8: TMenuItem Caption = '-' end object miTrayIconExit: TMenuItem Caption = 'E&xit' OnClick = miTrayIconExitClick end end object pmLogMenu: TPopupMenu left = 440 top = 136 object miLogCopy: TMenuItem Caption = 'Copy' OnClick = miLogMenuClick end object miLine24: TMenuItem Caption = '-' end object miLogSelectAll: TMenuItem Tag = 1 Caption = 'Select All' OnClick = miLogMenuClick end object miLine25: TMenuItem Caption = '-' end object miLogClear: TMenuItem Tag = 2 Caption = 'Clear' OnClick = miLogMenuClick end object miLogHide: TMenuItem Tag = 3 Caption = 'Hide' OnClick = miLogMenuClick end end object Timer: TTimer Enabled = False Interval = 100 OnTimer = AllProgressOnUpdateTimer left = 704 top = 152 end object imgLstActions: TImageList left = 24 top = 216 end end doublecmd-0.5.8/src/fviewer.lrt0000644000175000017500000000713512045446211015474 0ustar alexxalexxTFRMVIEWER.CAPTION=Viewer TFRMVIEWER.GBOXHIGHTLIGHT.CAPTION=Highlight TFRMVIEWER.LBLHIGHTLIGHT.CAPTION=0x0 TFRMVIEWER.BTNCUTTUIMAGE.HINT=Crop TFRMVIEWER.BTNREDEYE.HINT=Red Eyes TFRMVIEWER.GBOXPAINT.CAPTION=Paint TFRMVIEWER.BTNUNDO.HINT=Undo TFRMVIEWER.COMBOBOXPAINT.TEXT=Pen TFRMVIEWER.COMBOBOXWIDTH.TEXT=1 TFRMVIEWER.BTNHIGHTLIGHT.HINT=Highlight TFRMVIEWER.GBOXVIEW.CAPTION=View TFRMVIEWER.BTN270.HINT=- 90 TFRMVIEWER.BTN90.HINT=+ 90 TFRMVIEWER.BTNMIRROR.HINT=Mirror TFRMVIEWER.BTNZOOMIN.HINT=Zoom In TFRMVIEWER.BTNZOOMOUT.HINT=Zoom Out TFRMVIEWER.BTNGIFMOVE.CAPTION=|| TFRMVIEWER.BTNGIFTOBMP.CAPTION=S TFRMVIEWER.BTNNEXTGIFFRAME.CAPTION=||> TFRMVIEWER.BTNPREVGIFFRAME.CAPTION=<|| TFRMVIEWER.BTNRESIZE.HINT=Resize TFRMVIEWER.BTNPAINT.HINT=Paint TFRMVIEWER.BTNFULLSCREEN.HINT=Full Screen TFRMVIEWER.GBOXSLIDESHOW.CAPTION=Slide Show TFRMVIEWER.CBSLIDESHOW.CAPTION=Slide Show TFRMVIEWER.BTNCOPYFILE.HINT=Copy TFRMVIEWER.BTNMOVEFILE.HINT=Move TFRMVIEWER.BTNDELETEFILE.HINT=Delete TFRMVIEWER.BTNCOPYFILE1.HINT=Copy TFRMVIEWER.BTNMOVEFILE1.HINT=Move TFRMVIEWER.BTNDELETEFILE1.HINT=Delete TFRMVIEWER.MIFILE.CAPTION=&File TFRMVIEWER.MISAVE.CAPTION=Save TFRMVIEWER.MISAVEAS.CAPTION=Save As... TFRMVIEWER.MIPRINT.CAPTION=Print... TFRMVIEWER.MISEPARATOR.CAPTION=- TFRMVIEWER.MIEXIT.CAPTION=E&xit TFRMVIEWER.MIEDIT.CAPTION=&Edit TFRMVIEWER.MICOPYTOCLIPBOARD.CAPTION=Copy To Clipboard TFRMVIEWER.MISELECTALL.CAPTION=Select All TFRMVIEWER.MIDIV3.CAPTION=- TFRMVIEWER.MISEARCH.CAPTION=Search TFRMVIEWER.MISEARCHNEXT.CAPTION=Search next TFRMVIEWER.MISEARCHPREV.CAPTION=Search prev TFRMVIEWER.MIVIEW.CAPTION=&View TFRMVIEWER.MIPREVIEW.CAPTION=Preview TFRMVIEWER.MIDIV4.CAPTION=- TFRMVIEWER.MITEXT.CAPTION=Show as &Text TFRMVIEWER.MIBIN.CAPTION=Show as &Bin TFRMVIEWER.MIHEX.CAPTION=Show as &Hex TFRMVIEWER.MIWRAPTEXT.CAPTION=Show as &Wrap text TFRMVIEWER.MILOOKBOOK.CAPTION=Show as B&ook TFRMVIEWER.MIDIV2.CAPTION=- TFRMVIEWER.MIGRAPHICS.CAPTION=Graphics TFRMVIEWER.MIDIV1.CAPTION=- TFRMVIEWER.MIPLUGINS.CAPTION=Plugins TFRMVIEWER.MIENCODING.CAPTION=En&coding TFRMVIEWER.MIIMAGE.CAPTION=&Image TFRMVIEWER.MISTRETCH.CAPTION=Stretch TFRMVIEWER.MIROTATE.CAPTION=Rotate TFRMVIEWER.MI90.CAPTION=+ 90 TFRMVIEWER.MI180.CAPTION=+ 180 TFRMVIEWER.MI270.CAPTION=- 90 TFRMVIEWER.MIMIRROR.CAPTION=Mirror TFRMVIEWER.MIZOOMIN.CAPTION=Zoom In TFRMVIEWER.MIZOOMOUT.CAPTION=Zoom Out TFRMVIEWER.MIFULLSCREEN.CAPTION=Full Screen TFRMVIEWER.MISCREENSHOT.CAPTION=Screenshot TFRMVIEWER.MIABOUT.CAPTION=About TFRMVIEWER.PMICOPY.CAPTION=Copy To Clipboard TFRMVIEWER.MIDIV5.CAPTION=- TFRMVIEWER.PMISELECTALL.CAPTION=Select All TFRMVIEWER.ACTABOUT.CAPTION=About Viewer... TFRMVIEWER.ACTABOUT.HINT=Displays the About message TFRMVIEWER.ACTRELOAD.CAPTION=Reload TFRMVIEWER.ACTRELOAD.HINT=Reload current file TFRMVIEWER.ACTLOADNEXTFILE.CAPTION=&Next TFRMVIEWER.ACTLOADNEXTFILE.HINT=Load Next File TFRMVIEWER.ACTLOADPREVFILE.CAPTION=&Previous TFRMVIEWER.ACTLOADPREVFILE.HINT=Load Previous File TFRMVIEWER.ACTMOVEFILE.CAPTION=Move File TFRMVIEWER.ACTMOVEFILE.HINT=Move File TFRMVIEWER.ACTCOPYFILE.CAPTION=Copy File TFRMVIEWER.ACTCOPYFILE.HINT=Copy File TFRMVIEWER.ACTDELETEFILE.CAPTION=Delete File TFRMVIEWER.ACTDELETEFILE.HINT=Delete File TFRMVIEWER.ACTSTRETCHIMAGE.CAPTION=Stretch TFRMVIEWER.ACTSTRETCHIMAGE.HINT=Stretch Image TFRMVIEWER.ACTSAVEAS.CAPTION=Save As... TFRMVIEWER.ACTSAVEAS.HINT=Save File As... TFRMVIEWER.ACTROTATE90.CAPTION=Rotate 90 TFRMVIEWER.ACTROTATE90.HINT=Rotate 90 TFRMVIEWER.ACTROTATE180.CAPTION=Rotate 180 TFRMVIEWER.ACTROTATE180.HINT=Rotate 180 TFRMVIEWER.ACTROTATE270.CAPTION=Rotate 270 TFRMVIEWER.ACTROTATE270.HINT=Rotate 270 TFRMVIEWER.ACTMIRROR.CAPTION=Mirror TFRMVIEWER.ACTMIRROR.HINT=Mirror doublecmd-0.5.8/src/uthumbnails.pas0000644000175000017500000002620112140667506016345 0ustar alexxalexxunit uThumbnails; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Graphics, Types, fgl, DCClassesUtf8, uFile; type { TCreatePreviewHandler } TCreatePreviewHandler = function(const aFileName: UTF8String; aSize: TSize): TBitmap; { TBitmapList } TBitmapList = specialize TFPGObjectList; { TThumbnailManager } TThumbnailManager = class private FBitmap: TBitmap; FBackColor: TColor; FFileName: UTF8String; FThumbPath: UTF8String; FProviderList: array of TCreatePreviewHandler; static; private procedure DoCreatePreviewText; function GetPreviewFileExt(const sFileExt: UTF8String): UTF8String; function GetPreviewFileName(const sFileName: UTF8String): UTF8String; function CreatePreviewImage(const Graphic: TGraphic): TBitmap; function ReadMetaData(const aFile: TFile; FileStream: TFileStreamEx): Boolean; function WriteMetaData(const aFile: TFile; FileStream: TFileStreamEx): Boolean; class function ReadFileName(const aThumb: UTF8String; out aFileName: UTF8String): Boolean; public constructor Create(BackColor: TColor); function CreatePreview(const aFile: TFile): TBitmap; function CreatePreview(const FullPathToFile: UTF8String): TBitmap; function RemovePreview(const FullPathToFile: UTF8String): Boolean; public class procedure CompactCache; class procedure RegisterProvider(Provider: TCreatePreviewHandler); class function GetPreviewScaleSize(aWidth, aHeight: Integer): TSize; end; implementation uses LCLProc, FileUtil, Forms, uDebug, DCOSUtils, uFileProcs, DCStrUtils, uReSample, uGlobsPaths, uGlobs, uPixmapManager, URIParser, md5, uFileSystemFileSource; const ThumbSign: QWord = $0000235448554D42; // '#0 #0 # T H U M B' function TThumbnailManager.GetPreviewFileExt(const sFileExt: UTF8String): UTF8String; begin if (sFileExt = 'jpg') or (sFileExt = 'jpeg') or (sFileExt = 'bmp') then Result:= 'jpg' else Result:= 'png'; end; function TThumbnailManager.GetPreviewFileName(const sFileName: UTF8String): UTF8String; begin Result:= MD5Print(MD5String(sFileName)); end; function TThumbnailManager.CreatePreviewImage(const Graphic: TGraphic): TBitmap; var aSize: TSize; bmpTemp: TBitmap = nil; begin try // Calculate aspect width and height of thumb aSize:= GetPreviewScaleSize(Graphic.Width, Graphic.Height); bmpTemp:= TBitMap.Create; bmpTemp.Assign(Graphic); Result:= TBitMap.Create; Result.SetSize(aSize.cx, aSize.cy); Stretch(bmpTemp, Result, ResampleFilters[2].Filter, ResampleFilters[2].Width); finally FreeThenNil(bmpTemp); end; end; procedure TThumbnailManager.DoCreatePreviewText; var x: LongInt; ARect: TRect; sStr: String; tFile: THandle; begin FBitmap:= TBitmap.Create; with FBitmap do begin SetSize(gThumbSize.cx, gThumbSize.cy); Canvas.Brush.Color:= clWhite; Canvas.FillRect(Canvas.ClipRect); Canvas.Font.Color:= clBlack; Canvas.Font.Size := gThumbSize.cy div 16; tFile:= mbFileOpen(FFileName, fmOpenRead or fmShareDenyNone); if (tFile <> feInvalidHandle) then begin for x:= 0 to 8 do begin if not FileReadLn(tFile, sStr) then Break; Canvas.TextOut(0, x * Canvas.Font.Size * 3 div 2, sStr); end; FileClose(tFile); end; Application.ProcessMessages; end; end; function TThumbnailManager.ReadMetaData(const aFile: TFile; FileStream: TFileStreamEx): Boolean; var sFileName: AnsiString; begin Result:= True; try // Read metadata position from last 4 byte of file FileStream.Seek(-4, soEnd); FileStream.Seek(FileStream.ReadDWord, soBeginning); // Check signature if (FileStream.ReadQWord <> NtoBE(ThumbSign)) then Exit(False); // Read thumbnail metadata Result:= (URIToFilename(FileStream.ReadAnsiString, sFileName) and SameText(sFileName, aFile.FullPath)); if not Result then Exit; Result:= (aFile.Size = FileStream.ReadQWord) and (QWord(aFile.ModificationTime) = FileStream.ReadQWord); if not Result then Exit; Result:= (gThumbSize.cx = FileStream.ReadWord) and (gThumbSize.cy = FileStream.ReadWord); except Result:= False; end; end; function TThumbnailManager.WriteMetaData(const aFile: TFile; FileStream: TFileStreamEx): Boolean; var iEnd: Int64; begin Result:= True; try // Get original file size iEnd:= FileStream.Seek(0, soEnd); // Write signature FileStream.WriteQWord(NtoBE(ThumbSign)); // Write thumbnail meta data FileStream.WriteAnsiString(FilenameToURI(aFile.FullPath)); FileStream.WriteQWord(aFile.Size); FileStream.WriteQWord(QWord(aFile.ModificationTime)); FileStream.WriteWord(gThumbSize.cx); FileStream.WriteWord(gThumbSize.cy); // Write original file size FileStream.WriteDWord(iEnd); except Result:= False; end; end; class function TThumbnailManager.ReadFileName(const aThumb: UTF8String; out aFileName: UTF8String): Boolean; var fsFileStream: TFileStreamEx; begin try fsFileStream:= TFileStreamEx.Create(aThumb, fmOpenRead or fmShareDenyNone); try // Read metadata position from last 4 byte of file fsFileStream.Seek(-4, soEnd); fsFileStream.Seek(fsFileStream.ReadDWord, soBeginning); // Check signature if (fsFileStream.ReadQWord <> NtoBE(ThumbSign)) then Exit(False); // Read source file name Result:= URIToFilename(fsFileStream.ReadAnsiString, aFileName); finally fsFileStream.Free; end; except Result:= False; end; end; constructor TThumbnailManager.Create(BackColor: TColor); begin FBackColor:= BackColor; FThumbPath:= gpCacheDir + PathDelim + 'thumbnails'; // If directory not exists then create it if not mbDirectoryExists(FThumbPath) then mbForceDirectory(FThumbPath); end; function TThumbnailManager.RemovePreview(const FullPathToFile: UTF8String): Boolean; var sExt, sName: UTF8String; begin sExt:= GetPreviewFileExt(ExtractOnlyFileExt(FullPathToFile)); sName:= GetPreviewFileName(FullPathToFile); // Delete thumb from cache Result:= mbDeleteFile(FThumbPath + PathDelim + sName + '.' + sExt); end; function TThumbnailManager.CreatePreview(const aFile: TFile): TBitmap; var I: Integer; sFullPathToFile, sThumbFileName, sExt: UTF8String; fsFileStream: TFileStreamEx = nil; Picture: TPicture = nil; begin Result:= nil; try Picture:= TPicture.Create; try sFullPathToFile:= aFile.FullPath; sExt:= GetPreviewFileExt(ExtractOnlyFileExt(sFullPathToFile)); sThumbFileName:= FThumbPath + PathDelim + GetPreviewFileName(sFullPathToFile) + '.' + sExt; // If thumbnail already exists in cache for this file then load it if mbFileExists(sThumbFileName) then begin fsFileStream:= TFileStreamEx.Create(sThumbFileName, fmOpenRead or fmShareDenyNone); try if ReadMetaData(aFile, fsFileStream) then begin fsFileStream.Position:= 0; Picture.LoadFromStreamWithFileExt(fsFileStream, sExt); Result:= TBitmap.Create; Result.Assign(Picture.Graphic); Exit; end; finally FreeAndNil(fsFileStream); end; end; // Try to create thumnail using providers for I:= Low(FProviderList) to High(FProviderList) do begin Result:= FProviderList[I](sFullPathToFile, gThumbSize); if Assigned(Result) then Break; end; if not Assigned(Result) then begin sExt:= ExtractOnlyFileExt(sFullPathToFile); // Create thumb for image files if GetGraphicClassForFileExtension(sExt) <> nil then begin fsFileStream:= TFileStreamEx.Create(sFullPathToFile, fmOpenRead or fmShareDenyNone); with Picture do try LoadFromStreamWithFileExt(fsFileStream, sExt); if (Graphic.Width > gThumbSize.cx) or (Graphic.Height > gThumbSize.cy) then Result:= CreatePreviewImage(Graphic) else begin Result:= TBitmap.Create; Result.Assign(Graphic); Exit; // No need to save in cache end; finally FreeAndNil(fsFileStream); end end // Create thumb for text files else if (mbFileExists(sFullPathToFile)) and (FileIsText(sFullPathToFile)) then begin FFileName:= sFullPathToFile; // Some widgetsets can not draw from background // thread so call draw text function from main thread TThread.Synchronize(nil, @DoCreatePreviewText); Exit(FBitmap); // No need to save in cache end; end; // Save created thumb to cache if gThumbSave and Assigned(Result) then begin Picture.Bitmap.Assign(Result); sExt:= GetPreviewFileExt(sExt); try fsFileStream:= TFileStreamEx.Create(sThumbFileName, fmCreate); try Picture.SaveToStreamWithFileExt(fsFileStream, sExt); WriteMetaData(aFile, fsFileStream); finally FreeAndNil(fsFileStream); end; except on e: EStreamError do DCDebug(['Cannot save thumbnail to file "', sThumbFileName, '": ', e.Message]); end; end; if not Assigned(Result) then Raise Exception.Create(EmptyStr); finally FreeAndNil(Picture); end; except Result:= PixMapManager.LoadBitmapEnhanced(sFullPathToFile, gIconsSize, True, FBackColor); end; end; function TThumbnailManager.CreatePreview(const FullPathToFile: UTF8String): TBitmap; var aFile: TFile; begin aFile := TFileSystemFileSource.CreateFileFromFile(FullPathToFile); try Result:= CreatePreview(aFile); finally FreeAndNil(AFile); end; end; class procedure TThumbnailManager.CompactCache; var I: Integer; aFileName: UTF8String; aFileList: TStringList; begin aFileList:= FindAllFiles(gpCacheDir + PathDelim + 'thumbnails'); for I:= 0 to Pred(aFileList.Count) do begin if not (ReadFileName(aFileList[I], aFileName) and mbFileExists(aFileName)) then begin mbDeleteFile(aFileList[I]); end; end; aFileList.Free; end; class procedure TThumbnailManager.RegisterProvider(Provider: TCreatePreviewHandler); begin SetLength(FProviderList, Length(FProviderList) + 1); FProviderList[High(FProviderList)]:= Provider; end; class function TThumbnailManager.GetPreviewScaleSize(aWidth, aHeight: Integer): TSize; begin if aWidth > aHeight then begin Result.cx:= gThumbSize.cx; Result.cy:= Result.cx * aHeight div aWidth; if Result.cy > gThumbSize.cy then begin Result.cy:= gThumbSize.cy; Result.cx:= Result.cy * aWidth div aHeight; end; end else begin Result.cy:= gThumbSize.cy; Result.cx:= Result.cy * aWidth div aHeight; end; end; end. doublecmd-0.5.8/src/doublecmd.ico0000644000175000017500000007644611324050326015744 0ustar alexxalexx hF  00 %V@@ (B:(  @Q~XnrOmpOlmOkkOjhOifOgdOsmW|gzr`{m> Ok&S#K F?94.(#   YO{Җ/R>94-'"DNЫIc84-'"Zj?X4- "]bhh֚4Kr,X7\ --2E+-ã6mWz>bm'A,ao34ģ6mido\m!:)",+2XXģ6mhf~vYlT^U]SYklģ6mheYo\o_iRZQWkkĘ/fh]r]ocqzHN`_ܜg{_t]oZivg`v_t]o[kXfoynv_zb{av_t\o[kXfVbOYw} qfjhfzdxcsap_l\fV`U\jlR$|*{*{*z*y*y*x*x*w*w*v*( @     SbElXBsYCtXAuV?sV>rU>qT=pTf1],X+T*Q(N&K$H#E"B!@=9631.+'%"E5:"Tk,Z'T"O"K!IEC@=:641.+(% "     E0uN9]BEC@=:641.+(% "    CKXXs@@=:641.+(% " pwX@=:641.+(% " -;X@:641.+(% VbK:641.+( $.?uBm4a.ZXt641.+( !% "sKu;f1\'S'P"@41.+'s~Ya   s_IqK=K<J<J;~J:}I9|I9|I8zH8zH7zH6yH5xH5wG4vG4vG2tD,lD,lD,kC+jC*jD-lK3pgRv7 EwoQWOnCl9c6a4^4[3Y1X0V/T.Q-O,N,K*I*H)G(D'B&@%?%<#;"9"7!5 31/.,*(&'#+)(6%wq\> #{{Md;j&U%R"O L IGEBA?=;86431/-*(&% # !    'vd$ GM_Cp)W$RLKJ!J!IFDCA><:86531.,*('%# !      ,zM ԥڽuXv5ZFDEDCA><:86531.,*('%# !     (FMdix|Ѥ%LjCACA><:86531.,*('%# !   ?I#8X>@><:86531.,*('%# !  ,8#h}=><:86531.,*('%# !  ck#><:86531.,*('%# #8:86531.,*('%# #686531.,*('% iier[n46531.,*(' !XdX\?CAD[Dp3a,[$S&QVs*F4531.,*( %!5?F l  Ox>i7c1\,W!N#Ns2531.,*( !jq    p ZGp?h8a1\-W'QGf~6O231.,* %/A^e     p iU{JqAi9b3[.V)QF}u -31.,*ztz    p pe[~OtDk=c6\0W)P.R721/,*'!   p pjgaWyLoBg;`5Z(Nl:R01/-'5Gbi   p pjihf`WxLnDe;]>^Xj031. &Vd+         p pjiihgeaZxQpAckz5963)q}'+p pjihhgfeec~[w$?)B&?$<1!)(() *#+&-*1/4?Dp pjihhgfefe`{9R=T9P6L*@%3.;0;2<5>9A=ECIHMKOVYp pjihhgfefe`zVkYlVhReI\DOLWNXPXQYRYRXRWQVOSW[p pjihhgfefea{Yo]q]p\nViP[V`T^T\S[SYRXRWQVOSW[p pjihhgfefcv~Zp]q]o\nWi_iT^T^S\S[SYRXRWQVOSW[p pjihhgfef`|j{\q]q]o\nYkmxOZT^S\S[SYRXRWQVOSW[p pjihhgffbsZp^r]q]o\n[lYi[eR\T\S[SYRXRWQVOSW[p pjihhgfcgYp^s]q]o\n\mUfR[R[S[SYRXRWQVOSW[p pjihhgbgfy^s^s]q]o\n[mZjerQZPXSZRXRWQVOSW[o pjihf`uZp_t^s]q]o\n[m\kVf]dKRPVQWQVOSW[uΎkdbbvbw_t_t^s]q]o\n[m\kZj_n^cJPHNHLRVsדɣv^t`t_t^s]q]o\n[m\k[kXgs~ýȽԇ"_v`v_t_t^s]q]o\n[m\k[kZiXg#`y`w`v_t_t^s]q]o\n[m\k[kZiYhYf#`yay`w`v_t_t^s]q]o\n[m\k[kZiYhYfWd#xa{bzay`w`v_t_t^s]q]o\n[m\k[kZiYhYfWdUbqy#e~b|c}azay`w`v_t_t^s]q]o\n[m\k[kZiYhYfWdVcT_Zd#k`|d}d~c}azay`w`v_t_t^s]q]o\n[m\k[kZiYhYfWdVcWaU_PZ]fלqa`dee~d~c}azay`w`v_t_t^s]q]o\n[m\k[kZiYhYfWdVcWaV`U_R\MVOWbhx|غԕTcgmacdefffee~d~c}azay`w`v_t_t^s]q]o\n[m\k[kZiYhYfWdVcWaV`U_T^T\S[PWMTKQGMNTPAE;{n{lfhgfeedd}c}b|azay`w`v_t_t]r\p\o[m[l[jZjYhXgXeWdVcVaV`U_T^S\S[RYPVMSX^d`{h)j~w{|mfeeijjjihhgf~f}e|ezcxcwbvbubsar`q_o_m^l\kZgUaT`S_R]R\V_biryojwdĸP ]ysolihjhigkhkhkgkfkfjejejcichbhbhah`g_g_g^g]f]f\e[eZdZdYcWaUaT`S`S`RbSeSo[V'EžWbfffffffffffffffffffffffffffffffe_Q1 (@ B%+$'3888883&  ">Zpt|ws~ozozpzozpzpzpypzpypzpzpypzozozozpzozpzpzozpypzpzpyqzqzpzv{wxxwxxtxuX=(4ƼijNrA+h;.tHDHGGFFEECEBDAD@D?C>C>B=B4=4=3=3<2~<1}<1|;0{;/{;.z:-y:,y:+x9*w9*w9)v8(u8(t8's7'q7&r/Y+ RJ+c׫M! 4I;{lyLn>g5^2\0Y.W.U-S,R+Q*P)M(L(J'H&G&E%D%C$B#@#?"=!< :8754310.-+*('&%#" #!43L:}U5cU!iIFj1]+W(T%P#N"L!I GFDCA@>=;:9765320.,*)'&% # "       81O2eM k3a/]3\Qo}Ka965320-,*)'&&,wTX!õd?~pEp:f5b1]-Y)U2YTq/J6532/-,*('''EUw{,4   õh =~oJs?i8d4^0[-W*U&Q.Usas75320-,*)'(4NU    ôf >pRzFn?h8b4^/Z+V(S(Q,SZu.I5310.+*)(&N\2;    õg >r\NuFo?i9b4^/Y+U)R'P,Rb{bs732/.,*)),}:C     ôf >sfZ~PvHoAh;c5^1Y-U*R'O2U|!>410.,*)(e8_3Z/V,R*ODd6O410.,**)frx}'    ´f =slif`Y|QtImAgtmihgd_~VxNqGj@d;_7Z1UKhr~430/-,,%:$1  &´g =smjhghgb]}VvOoHjBd<^Gf%@631/-,3GX`"          ',³f >tliighgfeb]|XvRpKkLjy3L;7532/DU=H15g >tmjihhgeeddc_|\xZu|DZ'A$>";973Ud4A"#"####$$&!($)(,AEg =tljigigffedddd~e}Wj3L/H-E*B*@$tliihigffeddd~d~f~cuD[@W=S:P9N3HtEP0<1>3=4>7@9BFAHDJGLJNLO^bg >tmjihihffeeedd~gj{WkShQeNbN`I\yWaEPGRHQIRJSLTMTNTNTOTOTOSNR_cg >smjihihfffeeed~ii{^q\o[nZmZlXi{gpR\S]R\R[R[RZQXQWPVOUOTNSNR_bg >tmjihiheefeeed~mex^q\o[n[m[m[kvv~U`T^R\R[RZRYQXQWPVOUPUOTOS`cg >tljigihfffeeec~u^s^r\p[n[m[l[ljw\fU_S\S\S[SZRYRXQWPVPUNTOR`bg >tmjhhhgffeeeeh]q^r\p\n\n[m\lcqiqU_S]S\S[SYRYRXQWPVPUOSOS`cf >tliihigffeeeevu^s^r]p\o\n[m\l^n}XaS]R\S[SZRYRXQWPVPUOTNR_bg >smjhhhhffeeeigz^s^r\o\o\n[m[l\kiqT^S]S[SZRXRXQWPVPUOTOS`cg =smihghheeefhau^s^q]o[n[m[m[l\kgt]fS]S[RZRYRXPVOUOUOTOS`cg >tmjihhgfffgxu_t^r^r]p\o\n[m[l[k[j[eT\SZRYRXQWPVPUOTOS`cg =tlihghhffgbv_t^r]q]o\o\n[l[l[j[jmz]eS[SZRXQWOUOTNSNR_ch >vmjihihhox`t_t^r]q]p\o\n[l[l[j[j[kkrV]SYRXQWPUOTOSaeo =xmihefvcx`t_t^r^q\p[o[n[l[l[jZjYihuz}Z^NTNSNSOS`dqW|ьj`u_t_t]q]q]o[n[m[l[l[jZjZjZjzy{b' vaw`u_t_s^r^r]p\o\n[m[l[jZjYiXh]lb by`w_u_t_t^r^r]p\o\n[m[l[jZjYiXhYh`ms f|`x`w_u_t_t^r^r]p\o\m[m[l[jZiYiXhXgYfcos d|ay`w`v_t_t_t^r^r]p\o\n[m[k[jYjXiXhXgXeXecot yd}azay`w`w_u_t_t^r^r]p\o\n[m[l[jZjYiXhXgXeXdWd^jt qd|b{azax`w_w_t_t_t^r^r]p\o\n[l[l[jZjYiXhXfXeWdWdVb\gpxt ygc}c|a{`yay`w_v_u_t_t^r^r]p\o\n[m[l[jYiYiXhXgXeXdWdVbVaWa^h}s tle~d~c}c|a{azay_w`v^t^s^s]r]r]p[n[mZlZkZiZjXiWgWfWeXdWcVbVaV`T_Xb_hovs |qhddd~d~c|c|a{ayay`w`v_u_s_s^q^q]p[o[n[m[k[jYjYiXgXfXeWcWdVbUaV`U_U_S]T]Zadkrw㿿f5pponligfeedd~c}b|b|`{az`x`w`w_t_s_s^r^r]p\o\n[l[l[jZjYiXhXgXeXdWdWbVaV`T^U_S]S\S[SZT[V\W[X]Y]X[^cP<|_# ûkio}hghhfffedd~d~c}b|b|a{ayax`v`v_t_t^s]r]q\p\o[n[mZlZiZjXiXhXgWeWdVcVbVaU`U_U_R\S\S[SZRYRXQVOUOTMQ]_Y>u; M\Fxghhhfeeddee~d~c}c|a{azay`w`w_u_t_t^r^r]p\o\n[m[l[jZjYiXhXgXeXdWdWbVaU`T^T^R\R[RZRYRYRXQWQWOTejd[% .d[iggfffeed~d}c}b|b{azayax`v`v_t_s^s]q]q\o\n[m[lZkZiZiYhXgXgWeWdVcVbVaU`U_U_S]S\S[SZRYRXQVQVbfzt]@lF@dStfdccemoooonnmmlllkj~j}i|h{hzhygxgvgvfuetesdqdpcocn^jU`S^R]Q[PZQZPXZahnpdoSy\7`rZeWwnvwwvwuwuvtvtvsvsururuqtquqtptptotnsnsmsmrmrlrkrkqjqjqiqhqgpgpfpfpepeoeododocncmbmbmamal_gSY;id}S$ 2J\evvvwwwvwwwvwwwwwvwwvwwwwwwwwvwvvwwvwwvvwvvoaR7  @??doublecmd-0.5.8/src/uvfsmodule.pas0000644000175000017500000000362611740433676016215 0ustar alexxalexxunit uVfsModule; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSource; type { TFileSourceClass } TFileSourceClass = class of TFileSource; { TVfsModule } TVfsModule = class FileSourceClass: TFileSourceClass; end; { TVfsModuleList } TVfsModuleList = class(TStringList) private function GetVfsModule(const S: String): TVfsModule; public destructor Destroy; override; function GetFileSource(const Path: UTF8String): TFileSourceClass; property VfsModule[const S: String]: TVfsModule read GetVfsModule; end; procedure RegisterVirtualFileSource(AName: UTF8String; AFileSourceClass: TFileSourceClass); var // All of file sources from this list will be displayed // in the Virtual File System List. It can be used for example // for system specific virtual folders (Control Panel, Desktop, etc.) gVfsModuleList: TVfsModuleList; implementation procedure RegisterVirtualFileSource(AName: UTF8String; AFileSourceClass: TFileSourceClass); var VfsModule: TVfsModule; begin VfsModule:= TVfsModule.Create; VfsModule.FileSourceClass:= AFileSourceClass; gVfsModuleList.AddObject(AName, VfsModule); end; { TVfsModuleList } function TVfsModuleList.GetVfsModule(const S: String): TVfsModule; var I: Integer; begin I:= IndexOf(S); if I < 0 then Exit(nil); Result:= TVfsModule(Objects[I]); end; destructor TVfsModuleList.Destroy; var I: Integer; begin for I:= 0 to Count - 1 do TVfsModule(Objects[I]).Free; inherited Destroy; end; function TVfsModuleList.GetFileSource(const Path: UTF8String): TFileSourceClass; var I: Integer; begin Result:= nil; for I:= 0 to Count - 1 do with TVfsModule(Objects[I]) do begin if FileSourceClass.IsSupportedPath(Path) then begin Result:= FileSourceClass; Break; end; end; end; initialization gVfsModuleList := TVfsModuleList.Create; finalization FreeAndNil(gVfsModuleList); end. doublecmd-0.5.8/src/fmkdir.lfm0000644000175000017500000000450712023046500015247 0ustar alexxalexxobject frmMkDir: TfrmMkDir Left = 366 Height = 77 Top = 429 Width = 350 ActiveControl = cbMkDir AutoSize = True BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Create new directory' ClientHeight = 77 ClientWidth = 350 Constraints.MinHeight = 50 Constraints.MinWidth = 350 KeyPreview = True OnKeyPress = FormKeyPress Position = poScreenCenter LCLVersion = '1.1' object lblMakeDir: TLabel Left = 6 Height = 18 Top = 3 Width = 338 Align = alTop BorderSpacing.Left = 6 BorderSpacing.Top = 3 BorderSpacing.Right = 6 Caption = '&Input new directory name:' FocusControl = cbMkDir ParentColor = False end object cbMkDir: TComboBox Left = 6 Height = 28 Top = 21 Width = 338 Align = alTop AutoComplete = True AutoCompleteText = [cbactEnabled, cbactEndOfLineComplete, cbactRetainPrefixCase, cbactSearchAscending] BorderSpacing.Left = 6 BorderSpacing.Right = 6 BorderSpacing.Bottom = 3 DropDownCount = 5 ItemHeight = 0 TabOrder = 0 end object pnlBottom: TPanel Left = 6 Height = 36 Top = 55 Width = 338 Align = alTop AutoSize = True BorderSpacing.Left = 6 BorderSpacing.Top = 6 BorderSpacing.Right = 6 BorderSpacing.Bottom = 3 BevelOuter = bvNone ClientHeight = 36 ClientWidth = 338 TabOrder = 1 object pnlButtons: TPanel Left = 192 Height = 36 Top = 0 Width = 146 Align = alRight AutoSize = True BevelOuter = bvNone ClientHeight = 36 ClientWidth = 146 TabOrder = 0 object btnOK: TBitBtn Left = 0 Height = 36 Top = 0 Width = 59 Align = alRight AutoSize = True BorderSpacing.Right = 3 BorderSpacing.InnerBorder = 2 Caption = '&OK' Constraints.MinWidth = 50 Default = True Kind = bkOK ModalResult = 1 TabOrder = 0 end object btnCancel: TBitBtn Left = 62 Height = 36 Top = 0 Width = 84 Align = alRight AutoSize = True BorderSpacing.InnerBorder = 2 Cancel = True Caption = '&Cancel' Constraints.MinWidth = 50 Kind = bkCancel ModalResult = 2 TabOrder = 1 end end end end doublecmd-0.5.8/src/fhotdir.pas0000644000175000017500000001003412077545276015456 0ustar alexxalexxunit fHotDir; {$mode objfpc}{$H+} interface uses SysUtils, Classes, Controls, Forms, StdCtrls, Buttons; type { TfrmHotDir } TfrmHotDir = class(TForm) btnAddMan: TBitBtn; btnEdit: TBitBtn; lsHotDir: TListBox; btnOK: TBitBtn; btnCancel: TBitBtn; btnADD: TBitBtn; btnDelete: TBitBtn; procedure btnAddManClick(Sender: TObject); procedure btnEditClick(Sender: TObject); procedure btnOKClick(Sender: TObject); procedure btnDeleteClick(Sender: TObject); procedure btnADDClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure lsHotDirMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure lsHotDirMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure lsHotDirMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } fPivotIndex: integer; public { Public declarations } procedure LoadFromGlob; procedure SaveToGlob; end; implementation {$R *.lfm} uses Dialogs, DCStrUtils, uGlobs, uLng; procedure TfrmHotDir.LoadFromGlob; begin lsHotDir.Clear; lsHotDir.Items.Assign(glsHotDir); if glsHotDir.Count > 0 then lsHotDir.ItemIndex:= 0; btnDelete.Enabled:= (lsHotDir.Items.Count > 0); btnEdit.Enabled:= (lsHotDir.Items.Count > 0); end; procedure TfrmHotDir.SaveToGlob; begin glsHotDir.Assign(lsHotDir.Items); end; procedure TfrmHotDir.btnOKClick(Sender: TObject); begin SaveToGlob; end; procedure TfrmHotDir.btnAddManClick(Sender: TObject); var sDir: String; begin if InputQuery(rsMsgManualAddHotDir, rsMsgManualHotDirQuery, sDir) then lsHotDir.ItemIndex:= lsHotDir.Items.Add(IncludeTrailingBackSlash(sDir)); btnDelete.Enabled:= (lsHotDir.Items.Count > 0); btnEdit.Enabled:= (lsHotDir.Items.Count > 0); end; procedure TfrmHotDir.btnEditClick(Sender: TObject); var sDir: String; begin if lsHotDir.Items.Count < 1 then Exit; sDir:= lsHotDir.Items[lsHotDir.ItemIndex]; if InputQuery(rsMsgManualEditHotDir, rsMsgManualHotDirQuery, sDir) then lsHotDir.Items[lsHotDir.ItemIndex]:= IncludeTrailingBackSlash(sDir); btnDelete.Enabled:= (lsHotDir.Items.Count > 0); btnEdit.Enabled:= (lsHotDir.Items.Count > 0); end; procedure TfrmHotDir.btnDeleteClick(Sender: TObject); var iIndex:Integer; begin inherited; if lsHotDir.ItemIndex=-1 then Exit; iIndex:=lsHotDir.ItemIndex; lsHotDir.Items.Delete(iIndex); if (iIndex>=lsHotDir.Items.Count-1) then iIndex:=lsHotDir.Items.Count-1; lsHotDir.ItemIndex:=iIndex; btnDelete.Enabled:= (lsHotDir.Items.Count>0); btnEdit.Enabled:= (lsHotDir.Items.Count>0); end; procedure TfrmHotDir.btnADDClick(Sender: TObject); var sName, sPath: String; begin if SelectDirectory(rsSelectDir, '', sPath, False) then begin sName:= StringReplace(GetLastDir(sPath), '&', '&&', [rfReplaceAll]); if InputQuery('', rsMsgTitleNewEntryHotDir, sName) then lsHotDir.ItemIndex:= lsHotDir.Items.Add(sName + '=' + IncludeTrailingPathDelimiter(sPath)); end; btnDelete.Enabled:= (lsHotDir.Items.Count > 0); btnEdit.Enabled:= (lsHotDir.Items.Count > 0); end; procedure TfrmHotDir.FormCreate(Sender: TObject); begin fPivotIndex := -1; end; procedure TfrmHotDir.lsHotDirMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin fPivotIndex := lsHotDir.GetIndexAtXY(X,Y); end; procedure TfrmHotDir.lsHotDirMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var NewIndex: Integer; begin if (fPivotIndex>=0) and (Y>=0) then begin NewIndex := lsHotDir.GetIndexAtXY(X,Y); if (NewIndex>=0) and (NewIndex<>fPivotIndex) then begin lsHotDir.Items.Exchange(NewIndex, fPivotIndex); if fPivotIndex=lsHotDir.ItemIndex then lsHotDir.ItemIndex := NewIndex; fPivotIndex := NewIndex; end; end; end; procedure TfrmHotDir.lsHotDirMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin fPivotIndex := -1; end; end. doublecmd-0.5.8/src/fsplitter.lrt0000644000175000017500000000105012023046500016020 0ustar alexxalexxTFRMSPLITTER.CAPTION=Splitter TFRMSPLITTER.GRBXFILE.CAPTION=File name TFRMSPLITTER.LBFILESOURCE.CAPTION=File &source TFRMSPLITTER.LBDIRTARGET.CAPTION=Directory &target TFRMSPLITTER.BTNFTCHOICE.CAPTION=... TFRMSPLITTER.GRBXSIZE.CAPTION=Size and number of parts TFRMSPLITTER.CMBXSIZE.TEXT=1457664B - 3.5" TFRMSPLITTER.RBTNKILOB.CAPTION=&Kilobytes TFRMSPLITTER.RBTNMEGAB.CAPTION=&Megabytes TFRMSPLITTER.RBTNGIGAB.CAPTION=&Gigabytes TFRMSPLITTER.LBLNUMBERPARTS.CAPTION=&Number of parts TFRMSPLITTER.BTNOK.CAPTION=&OK TFRMSPLITTER.BTNCANCEL.CAPTION=&Cancel doublecmd-0.5.8/src/udisplayfile.pas0000644000175000017500000001522012070253712016473 0ustar alexxalexxunit uDisplayFile; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Graphics, uFile; type TDisplayItemPtr = Pointer; {en Describes the file displayed in the file view. } { TDisplayFile } TDisplayFile = class private FFSFile: TFile; //= 0 then Delete(i); end; function TDisplayFiles.Get(Index: Integer): TDisplayFile; begin Result := TDisplayFile(FList.Items[Index]); end; procedure TDisplayFiles.Put(Index: Integer; AFile: TDisplayFile); begin FList.Items[Index] := AFile; end; end. doublecmd-0.5.8/src/fpc-extra.cfg0000644000175000017500000000015711673054716015664 0ustar alexxalexx#IFDEF CPU64 #IFDEF FPC_CROSSCOMPILING -Fl/usr/lib/gcc/i486-linux-gnu/4.6/64 -Fl/usr/local/lib64 #ENDIF #ENDIF doublecmd-0.5.8/src/uoperationsmanager.pas0000644000175000017500000006511211747236270017723 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Manager that maintains a list of running file source operations and manages queues of operations. Copyright (C) 2010-2012 Przemysaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uOperationsManager; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uOperationThread, uFileSourceOperation; type {en Handle to OperationsManager's operation.} TOperationHandle = type Longint; {en Identifier of OperationsManager's queue.} TOperationsManagerQueueIdentifier = type Longint; const InvalidOperationHandle = TOperationHandle(0); FreeOperationsQueueId = 0; SingleQueueId = 1; // TODO: Hard-coded for now type TOperationsManagerQueue = class; { TOperationsManagerItem } TOperationsManagerItem = class strict private FHandle : TOperationHandle; FOperation : TFileSourceOperation; FQueue : TOperationsManagerQueue; FThread : TOperationThread; private function RemoveFromQueue: Boolean; {en Inserts the item into new queue at specific position. @param(NewQueue To which queue to insert the item. If it is the same queue in which the item is currently nothing is performed.) @param(TargetOperation Handle to another operation in NewQueue near which the item should be placed.) @param(PlaceBefore If @true then places item before TargetOperation. If @false then places item after TargetOperation.) } procedure SetQueue(NewQueue: TOperationsManagerQueue; TargetOperation: TOperationHandle; PlaceBefore: Boolean); public constructor Create(AHandle: TOperationHandle; AOperation: TFileSourceOperation; AThread: TOperationThread); destructor Destroy; override; {en Moves the item and places it before or after another operation. @param(TargetOperation Handle to another operation where item should be moved. If handle belongs to operation from a different queue then the item is moved to that queue and placed before or after the operation.) @param(PlaceBefore If @true then places item before TargetOperation. If @false then places item after TargetOperation.) } procedure Move(TargetOperation: TOperationHandle; PlaceBefore: Boolean); procedure MoveToBottom; function MoveToNewQueue: TOperationsManagerQueueIdentifier; procedure MoveToTop; procedure SetQueue(NewQueue: TOperationsManagerQueue; InsertAtFront: Boolean = False); property Handle: TOperationHandle read FHandle; property Operation: TFileSourceOperation read FOperation; property Queue: TOperationsManagerQueue read FQueue; property Thread: TOperationThread read FThread; end; { TOperationsManagerQueue } TOperationsManagerQueue = class strict private FIdentifier: TOperationsManagerQueueIdentifier; FList: TFPList; FPaused: Boolean; function GetIndexByHandle(Handle: TOperationHandle): Integer; function GetItem(Index: Integer): TOperationsManagerItem; function GetItemByHandle(Handle: TOperationHandle): TOperationsManagerItem; function GetOperationsCount: Integer; private {en Inserts new item into the queue. @param(InsertAt If -1 (default) it adds to the back of the queue. If 0 inserts at the front. If 0 < InsertAt < Count it inserts at specific position.) } function Insert(Item: TOperationsManagerItem; InsertAt: Integer = -1): Integer; {en Inserts new item into the queue. @param(InsertAtFront If @true then inserts at the front, if @false then inserts at the back.) } function Insert(Item: TOperationsManagerItem; TargetOperation: TOperationHandle; PlaceBefore: Boolean): Integer; {en Moves item within the queue. @param(SourceItem Which item should be moved.) @param(TargetItem SourceItem is moved placed either before or after TargetItem. If TargetItem is @nil then SourceItem is moved to the front if PlaceBefore is @true and to the back if PlaceBefore is @false.) @param(PlaceBefore If @true then SourceItem is placed before TargetItem. If @false then SourceItem is placed after TargetItem.) } procedure Move(SourceItem, TargetItem: TOperationsManagerItem; PlaceBefore: Boolean); function Remove(Item: TOperationsManagerItem): Boolean; public constructor Create(AIdentifier: TOperationsManagerQueueIdentifier); destructor Destroy; override; function GetDescription(IncludeCount: Boolean): String; {en Returns @true if this queue is a free operations queue. } function IsFree: Boolean; inline; procedure Pause; procedure Stop; procedure TogglePause; procedure UnPause; property Count: Integer read GetOperationsCount; property Identifier: TOperationsManagerQueueIdentifier read FIdentifier; property Items[Index: Integer]: TOperationsManagerItem read GetItem; property ItemByHandle[Handle: TOperationHandle]: TOperationsManagerItem read GetItemByHandle; property Paused: Boolean read FPaused; end; TOperationManagerEvent = (omevOperationAdded, omevOperationRemoved, omevOperationMoved); TOperationManagerEvents = set of TOperationManagerEvent; TOperationManagerEventNotify = procedure(Item: TOperationsManagerItem; Event: TOperationManagerEvent) of object; {en Manages file source operations. Executes them, stores threads, allows querying active operations (meaning operations being executed). } { TOperationsManager } TOperationsManager = class private FLastUsedHandle: TOperationHandle; FEventsListeners: array[TOperationManagerEvent] of TFPList; FQueues: TFPList; procedure ThreadTerminatedEvent(Sender: TObject); function GetItemByOperation(Operation: TFileSourceOperation): TOperationsManagerItem; function GetItemByIndex(Index: Integer): TOperationsManagerItem; function GetOperationsCount: Integer; function GetNextUnusedHandle: TOperationHandle; function GetQueueByIndex(Index: Integer): TOperationsManagerQueue; function GetQueueByIdentifier(Identifier: TOperationsManagerQueueIdentifier): TOperationsManagerQueue; function GetQueuesCount: Integer; function MoveToNewQueue(Item: TOperationsManagerItem): TOperationsManagerQueueIdentifier; procedure MoveToQueue(Item: TOperationsManagerItem; QueueIdentifier: TOperationsManagerQueueIdentifier); {en Notifies all listeners that an event has occurred (or multiple events). } procedure NotifyEvents(Item: TOperationsManagerItem; Events: TOperationManagerEvents); public constructor Create; destructor Destroy; override; {en Adds an operation to the manager. @param(ShowProgress If @true automatically shows progress window.) } function AddOperation(Operation: TFileSourceOperation; ShowProgress: Boolean = True): TOperationHandle; {en Adds an operation to the manager. @param(QueueIdentifier Specifies to which queue to put the operation.) @param(InsertAtFrontOfQueue If @true inserts the operation at the front of the queue, if @false inserts at the back of the queue.) @param(ShowProgress If @true automatically shows progress window.) } function AddOperation(Operation: TFileSourceOperation; QueueIdentifier: TOperationsManagerQueueIdentifier; InsertAtFrontOfQueue: Boolean; ShowProgress: Boolean = True): TOperationHandle; {en Operations retrieved this way can be safely used from the main GUI thread. But they should not be stored for longer use, because they may be destroyed by the Operations Manager when they finish. Operation handle can always be used to query OperationsManager if the operation item is still alive. } function GetItemByHandle(Handle: TOperationHandle): TOperationsManagerItem; function GetOrCreateQueue(Identifier: TOperationsManagerQueueIdentifier): TOperationsManagerQueue; procedure PauseAll; procedure StopAll; procedure UnPauseAll; function AllProgressPoint: Double; {en Adds a function to call on specific events. } procedure AddEventsListener(Events: TOperationManagerEvents; FunctionToCall: TOperationManagerEventNotify); {en Removes a registered function callback for events. } procedure RemoveEventsListener(Events: TOperationManagerEvents; FunctionToCall: TOperationManagerEventNotify); property OperationsCount: Integer read GetOperationsCount; property QueuesCount: Integer read GetQueuesCount; property QueueByIndex[Index: Integer]: TOperationsManagerQueue read GetQueueByIndex; property QueueByIdentifier[Identifier: TOperationsManagerQueueIdentifier]: TOperationsManagerQueue read GetQueueByIdentifier; end; var OperationsManager: TOperationsManager = nil; implementation uses uDebug, uLng, uFileSourceOperationMisc; type PEventsListItem = ^TEventsListItem; TEventsListItem = record EventFunction: TOperationManagerEventNotify; end; { TOperationsManagerItem } constructor TOperationsManagerItem.Create(AHandle: TOperationHandle; AOperation: TFileSourceOperation; AThread: TOperationThread); begin FHandle := AHandle; FOperation := AOperation; FThread := AThread; end; destructor TOperationsManagerItem.Destroy; begin inherited Destroy; FOperation.Free; end; procedure TOperationsManagerItem.Move(TargetOperation: TOperationHandle; PlaceBefore: Boolean); var TargetItem: TOperationsManagerItem; begin TargetItem := OperationsManager.GetItemByHandle(TargetOperation); if Assigned(TargetItem) then begin if Queue = TargetItem.Queue then Queue.Move(Self, TargetItem, PlaceBefore) else SetQueue(TargetItem.Queue, TargetOperation, PlaceBefore); end; end; procedure TOperationsManagerItem.MoveToBottom; begin Queue.Move(Self, nil, False); end; function TOperationsManagerItem.MoveToNewQueue: TOperationsManagerQueueIdentifier; begin Result := OperationsManager.MoveToNewQueue(Self); end; procedure TOperationsManagerItem.MoveToTop; begin Queue.Move(Self, nil, True); end; function TOperationsManagerItem.RemoveFromQueue: Boolean; begin Result := Queue.Remove(Self); if Queue.Count = 0 then begin OperationsManager.FQueues.Remove(Queue); Queue.Free; end; FQueue := nil; end; procedure TOperationsManagerItem.SetQueue(NewQueue: TOperationsManagerQueue; InsertAtFront: Boolean); begin if (Queue <> NewQueue) and Assigned(NewQueue) then begin if not Assigned(Queue) or RemoveFromQueue then begin FQueue := NewQueue; if InsertAtFront then NewQueue.Insert(Self, 0) // Insert at the front of the queue. else NewQueue.Insert(Self); // Add at the back of the queue. OperationsManager.NotifyEvents(Self, [omevOperationMoved]); end; end; end; procedure TOperationsManagerItem.SetQueue(NewQueue: TOperationsManagerQueue; TargetOperation: TOperationHandle; PlaceBefore: Boolean); begin if (Queue <> NewQueue) and Assigned(NewQueue) then begin if not Assigned(Queue) or RemoveFromQueue then begin FQueue := NewQueue; NewQueue.Insert(Self, TargetOperation, PlaceBefore); OperationsManager.NotifyEvents(Self, [omevOperationMoved]); end; end; end; { TOperationsManagerQueue } function TOperationsManagerQueue.GetIndexByHandle(Handle: TOperationHandle): Integer; begin for Result := 0 to Count - 1 do begin if TOperationsManagerItem(Items[Result]).Handle = Handle then Exit; end; Result := -1; end; function TOperationsManagerQueue.GetItem(Index: Integer): TOperationsManagerItem; begin Result := TOperationsManagerItem(FList.Items[Index]); end; function TOperationsManagerQueue.GetItemByHandle(Handle: TOperationHandle): TOperationsManagerItem; var Index: Integer; begin for Index := 0 to Count - 1 do begin Result := Items[Index]; if Result.Handle = Handle then Exit; end; Result := nil; end; function TOperationsManagerQueue.GetOperationsCount: Integer; begin Result := FList.Count; end; constructor TOperationsManagerQueue.Create(AIdentifier: TOperationsManagerQueueIdentifier); begin FList := TFPList.Create; FIdentifier := AIdentifier; end; destructor TOperationsManagerQueue.Destroy; var i: Integer; begin inherited Destroy; for i := 0 to FList.Count - 1 do Items[i].Free; FList.Free; end; function TOperationsManagerQueue.GetDescription(IncludeCount: Boolean): String; begin Result := rsDlgQueue + ' #' + IntToStr(Identifier); if IncludeCount then Result := Result + ' [' + IntToStr(Count) + ']'; end; procedure TOperationsManagerQueue.Move(SourceItem, TargetItem: TOperationsManagerItem; PlaceBefore: Boolean); var FromIndex, ToIndex: Integer; ShouldMove: Boolean = False; begin FromIndex := GetIndexByHandle(SourceItem.Handle); if FromIndex >= 0 then begin if not Assigned(TargetItem) then begin if PlaceBefore then ToIndex := 0 else ToIndex := FList.Count - 1; ShouldMove := True; end else begin ToIndex := GetIndexByHandle(TargetItem.Handle); if ToIndex >= 0 then begin if PlaceBefore then begin if FromIndex < ToIndex then Dec(ToIndex); end else begin if FromIndex > ToIndex then Inc(ToIndex); end; ShouldMove := True; end; end; end; if ShouldMove and (FromIndex <> ToIndex) then begin if (not Paused) and ((FromIndex = 0) or (ToIndex = 0)) and not IsFree then Items[0].Operation.Pause; FList.Move(FromIndex, ToIndex); if (not Paused) and ((FromIndex = 0) or (ToIndex = 0)) and not IsFree then Items[0].Operation.Start; OperationsManager.NotifyEvents(SourceItem, [omevOperationMoved]); end; end; function TOperationsManagerQueue.Insert(Item: TOperationsManagerItem; InsertAt: Integer): Integer; begin if InsertAt = -1 then InsertAt := FList.Count else begin if (not Paused) and (InsertAt = 0) and not IsFree then Items[0].Operation.Pause; end; FList.Insert(InsertAt, Item); Result := InsertAt; if (not Paused) and (IsFree or (InsertAt = 0)) then begin Item.Operation.Start; end else Item.Operation.Pause; end; function TOperationsManagerQueue.Insert(Item: TOperationsManagerItem; TargetOperation: TOperationHandle; PlaceBefore: Boolean): Integer; begin Result := GetIndexByHandle(TargetOperation); if Result >= 0 then begin if not PlaceBefore then Inc(Result); Insert(Item, Result); end; end; function TOperationsManagerQueue.IsFree: Boolean; begin Result := FIdentifier = FreeOperationsQueueId; end; procedure TOperationsManagerQueue.Pause; var Index: Integer; begin if IsFree then begin for Index := 0 to Count - 1 do Items[Index].Operation.Pause; end else begin FPaused := True; if Count > 0 then Items[0].Operation.Pause; end; end; function TOperationsManagerQueue.Remove(Item: TOperationsManagerItem): Boolean; var Index: Integer; begin Index := FList.Remove(Item); Result := Index <> -1; if Result and (not Paused) and (not IsFree) and (Index = 0) and (Count > 0) then begin Items[0].Operation.Start; end; end; procedure TOperationsManagerQueue.Stop; var i: Integer; begin for i := 0 to Count - 1 do Items[i].Operation.Stop; end; procedure TOperationsManagerQueue.TogglePause; begin if Paused then UnPause else Pause; end; procedure TOperationsManagerQueue.UnPause; var Index: Integer; begin if IsFree then begin for Index := 0 to Count - 1 do Items[Index].Operation.Start; end else begin if Count > 0 then Items[0].Operation.Start; FPaused := False; end; end; { TOperationsManager } constructor TOperationsManager.Create; var Event: TOperationManagerEvent; begin FQueues := TFPList.Create; FLastUsedHandle := InvalidOperationHandle; for Event := Low(FEventsListeners) to High(FEventsListeners) do FEventsListeners[Event] := TFPList.Create; inherited Create; end; destructor TOperationsManager.Destroy; var i: Integer; Event: TOperationManagerEvent; begin inherited Destroy; for Event := Low(FEventsListeners) to High(FEventsListeners) do begin for i := 0 to FEventsListeners[Event].Count - 1 do Dispose(PEventsListItem(FEventsListeners[Event].Items[i])); FreeAndNil(FEventsListeners[Event]); end; if QueuesCount > 0 then DCDebug('Warning: Destroying Operations Manager with active operations!'); FreeAndNil(FQueues); end; function TOperationsManager.AddOperation(Operation: TFileSourceOperation; ShowProgress: Boolean): TOperationHandle; begin Result := AddOperation(Operation, FreeOperationsQueueId, False, ShowProgress); end; function TOperationsManager.AddOperation( Operation: TFileSourceOperation; QueueIdentifier: TOperationsManagerQueueIdentifier; InsertAtFrontOfQueue: Boolean; ShowProgress: Boolean = True): TOperationHandle; var Thread: TOperationThread; Item: TOperationsManagerItem; begin Result := InvalidOperationHandle; if Assigned(Operation) then begin Thread := TOperationThread.Create(True, Operation); if Assigned(Thread) then begin if Assigned(Thread.FatalException) then raise Thread.FatalException; Item := TOperationsManagerItem.Create(GetNextUnusedHandle, Operation, Thread); if Assigned(Item) then try Operation.PreventStart; Result := Item.Handle; // Set OnTerminate event so that we can cleanup when thread finishes. // Or instead of this create a timer for each thread and do: // Thread.WaitFor (or WaitForThreadTerminate(Thread.ThreadID)) Thread.OnTerminate := @ThreadTerminatedEvent; Item.SetQueue(GetOrCreateQueue(QueueIdentifier), InsertAtFrontOfQueue); NotifyEvents(Item, [omevOperationAdded]); ShowOperation(Item); Thread.Start; except Item.Free; end; end; end; end; function TOperationsManager.GetOperationsCount: Integer; var QueueIndex: Integer; Queue: TOperationsManagerQueue; begin Result := 0; for QueueIndex := 0 to QueuesCount - 1 do begin Queue := QueueByIndex[QueueIndex]; Inc(Result, Queue.Count); end; end; function TOperationsManager.GetQueuesCount: Integer; begin Result := FQueues.Count; end; function TOperationsManager.MoveToNewQueue(Item: TOperationsManagerItem): TOperationsManagerQueueIdentifier; var NewQueueId: TOperationsManagerQueueIdentifier; NewQueue: TOperationsManagerQueue; begin for NewQueueId := Succ(FreeOperationsQueueId) to MaxInt do begin if not Assigned(QueueByIdentifier[NewQueueId]) then begin NewQueue := GetOrCreateQueue(NewQueueId); Item.SetQueue(NewQueue); Exit(NewQueueId); end; end; end; function TOperationsManager.GetItemByHandle(Handle: TOperationHandle): TOperationsManagerItem; var QueueIndex: Integer; Queue: TOperationsManagerQueue; begin if Handle <> InvalidOperationHandle then begin for QueueIndex := 0 to QueuesCount - 1 do begin Queue := QueueByIndex[QueueIndex]; Result := Queue.ItemByHandle[Handle]; if Assigned(Result) then Exit; end; end; Result := nil; end; function TOperationsManager.GetItemByOperation(Operation: TFileSourceOperation): TOperationsManagerItem; var OperIndex, QueueIndex: Integer; Item: TOperationsManagerItem; Queue: TOperationsManagerQueue; begin for QueueIndex := 0 to QueuesCount - 1 do begin Queue := QueueByIndex[QueueIndex]; for OperIndex := 0 to Queue.Count - 1 do begin Item := Queue.Items[OperIndex]; if Item.Operation = Operation then Exit(Item); end; end; Result := nil; end; function TOperationsManager.GetItemByIndex(Index: Integer): TOperationsManagerItem; var OperIndex, QueueIndex: Integer; Queue: TOperationsManagerQueue; Counter: Integer; begin Counter := 0; for QueueIndex := 0 to QueuesCount - 1 do begin Queue := QueueByIndex[QueueIndex]; for OperIndex := 0 to Queue.Count - 1 do begin if Counter = Index then Exit(Queue.Items[OperIndex]); Inc(Counter); end; end; Result := nil; end; function TOperationsManager.GetOrCreateQueue(Identifier: TOperationsManagerQueueIdentifier): TOperationsManagerQueue; begin Result := QueueByIdentifier[Identifier]; if not Assigned(Result) then begin Result := TOperationsManagerQueue.Create(Identifier); FQueues.Add(Result); end; end; procedure TOperationsManager.MoveToQueue(Item: TOperationsManagerItem; QueueIdentifier: TOperationsManagerQueueIdentifier); var Queue: TOperationsManagerQueue; begin Queue := GetOrCreateQueue(QueueIdentifier); Item.SetQueue(Queue); end; function TOperationsManager.GetNextUnusedHandle: TOperationHandle; begin // Handles are consecutively incremented. // Even if they overflow there is little probability that // there will be that many operations. Result := InterLockedIncrement(FLastUsedHandle); if Result = InvalidOperationHandle then Result := InterLockedIncrement(FLastUsedHandle); end; function TOperationsManager.GetQueueByIndex(Index: Integer): TOperationsManagerQueue; begin if (Index >= 0) and (Index < FQueues.Count) then Result := TOperationsManagerQueue(FQueues.Items[Index]) else Result := nil; end; function TOperationsManager.GetQueueByIdentifier(Identifier: TOperationsManagerQueueIdentifier): TOperationsManagerQueue; var i: Integer; Queue: TOperationsManagerQueue; begin for i := 0 to FQueues.Count - 1 do begin Queue := QueueByIndex[i]; if Queue.Identifier = Identifier then Exit(Queue); end; Result := nil; end; procedure TOperationsManager.ThreadTerminatedEvent(Sender: TObject); var Thread: TOperationThread; Item: TOperationsManagerItem; OperIndex, QueueIndex: Integer; Queue: TOperationsManagerQueue; begin // This function is executed from the GUI thread (through Synchronize). Thread := Sender as TOperationThread; // Search the terminated thread in the operations list. for QueueIndex := 0 to QueuesCount - 1 do begin Queue := QueueByIndex[QueueIndex]; for OperIndex := 0 to Queue.Count - 1 do begin Item := TOperationsManagerItem(Queue.Items[OperIndex]); if Item.Thread = Thread then begin Item.RemoveFromQueue; NotifyEvents(Item, [omevOperationRemoved]); // Here the operation should not be used anymore // (by the thread and by any operations viewer). Item.Free; Exit; end; end; end; end; procedure TOperationsManager.PauseAll; var i: Integer; begin for i := 0 to QueuesCount - 1 do OperationsManager.QueueByIndex[i].Pause; end; procedure TOperationsManager.StopAll; var i: Integer; begin for i := 0 to QueuesCount - 1 do OperationsManager.QueueByIndex[i].Stop; end; procedure TOperationsManager.UnPauseAll; var i: Integer; begin for i := 0 to QueuesCount - 1 do OperationsManager.QueueByIndex[i].UnPause; end; function TOperationsManager.AllProgressPoint: Double; var Item: TOperationsManagerItem; i: Integer; begin Result := 0; if OperationsManager.OperationsCount <> 0 then begin for i := 0 to OperationsCount - 1 do begin Item := OperationsManager.GetItemByIndex(i); if Assigned(Item) then Result := Result + Item.Operation.Progress; // calculate allProgressBar end; Result := Result / OperationsManager.OperationsCount; // end; end; procedure TOperationsManager.AddEventsListener(Events: TOperationManagerEvents; FunctionToCall: TOperationManagerEventNotify); var Item: PEventsListItem; Event: TOperationManagerEvent; begin for Event := Low(TOperationManagerEvent) to High(TOperationManagerEvent) do begin if Event in Events then begin Item := New(PEventsListItem); Item^.EventFunction := FunctionToCall; FEventsListeners[Event].Add(Item); end; end; end; procedure TOperationsManager.RemoveEventsListener(Events: TOperationManagerEvents; FunctionToCall: TOperationManagerEventNotify); var Item: PEventsListItem; Event: TOperationManagerEvent; i: Integer; begin for Event := Low(TOperationManagerEvent) to High(TOperationManagerEvent) do begin if Event in Events then begin for i := 0 to FEventsListeners[Event].Count - 1 do begin Item := PEventsListItem(FEventsListeners[Event].Items[i]); if Item^.EventFunction = FunctionToCall then begin FEventsListeners[Event].Delete(i); Dispose(Item); break; // break from one for only end; end; end; end; end; procedure TOperationsManager.NotifyEvents(Item: TOperationsManagerItem; Events: TOperationManagerEvents); var EventItem: PEventsListItem; Event: TOperationManagerEvent; i: Integer; begin for Event := Low(TOperationManagerEvent) to High(TOperationManagerEvent) do begin if Event in Events then begin // Call each listener function. for i := 0 to FEventsListeners[Event].Count - 1 do begin EventItem := PEventsListItem(FEventsListeners[Event].Items[i]); EventItem^.EventFunction(Item, Event); end; end; end; end; initialization OperationsManager := TOperationsManager.Create; finalization FreeAndNil(OperationsManager); end. doublecmd-0.5.8/src/foptions.lrt0000644000175000017500000000036312020403374015656 0ustar alexxalexxTFRMOPTIONS.CAPTION=Options TFRMOPTIONS.LBLEMPTYEDITOR.CAPTION=Please select one of the subpages, this page does not contain any settings. TFRMOPTIONS.BTNOK.CAPTION=&OK TFRMOPTIONS.BTNCANCEL.CAPTION=&Cancel TFRMOPTIONS.BTNAPPLY.CAPTION=&Apply doublecmd-0.5.8/src/fconnectionmanager.pas0000644000175000017500000001417511740433676017665 0ustar alexxalexxunit fConnectionManager; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, Buttons, ComCtrls, uFileView; type { TfrmConnectionManager } TfrmConnectionManager = class(TForm) btnCancel: TBitBtn; btnDelete: TBitBtn; btnEdit: TBitBtn; btnAdd: TBitBtn; btnConnect: TBitBtn; gbConnectTo: TGroupBox; ImageList: TImageList; tvConnections: TTreeView; procedure btnAddClick(Sender: TObject); procedure btnConnectClick(Sender: TObject); procedure btnDeleteClick(Sender: TObject); procedure btnEditClick(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure tvConnectionsSelectionChanged(Sender: TObject); private FFileView: TFileView; public constructor Create(TheOwner: TComponent; FileView: TFileView); reintroduce; end; function ShowConnectionManager(FileView: TFileView): Boolean; implementation {$R *.lfm} uses uGlobs, uDCUtils, uShowMsg, uWfxModule, WfxPlugin, uWfxPluginFileSource, uLng, uConnectionManager; function ShowConnectionManager(FileView: TFileView): Boolean; begin with TfrmConnectionManager.Create(Application, FileView) do begin try Result:= (ShowModal = mrOK); finally Free; end; end; end; { TfrmConnectionManager } procedure TfrmConnectionManager.tvConnectionsSelectionChanged(Sender: TObject); var bEnabled: Boolean; begin if not Assigned(tvConnections.Selected) then begin btnConnect.Enabled:= False; btnAdd.Enabled:= False; btnEdit.Enabled:= False; btnDelete.Enabled:= False; end else begin bEnabled:= Assigned(tvConnections.Selected.Data); btnConnect.Enabled:= not bEnabled; btnAdd.Enabled:= bEnabled; btnEdit.Enabled:= not bEnabled; btnDelete.Enabled:= not bEnabled; end; end; procedure TfrmConnectionManager.btnAddClick(Sender: TObject); var WfxPluginFileSource: IWfxPluginFileSource; Connection: UTF8String; begin { WfxPluginFileSource:= PFileSourceRecord(tvConnections.Selected.Data)^.FileSource as IWfxPluginFileSource; if Assigned(WfxPluginFileSource) then begin if WfxPluginFileSource.WfxModule.WfxNetworkManageConnection(Handle, Connection, FS_NM_ACTION_ADD) then begin with tvConnections.Items.AddChild(tvConnections.Selected, Connection) do StateIndex:= 1; end; end; } end; procedure TfrmConnectionManager.btnConnectClick(Sender: TObject); var WfxPluginFileSource: IWfxPluginFileSource; Connection, RemotePath, RootPath: UTF8String; begin { WfxPluginFileSource:= PFileSourceRecord(tvConnections.Selected.Parent.Data)^.FileSource as IWfxPluginFileSource; if Assigned(WfxPluginFileSource) then begin Connection:= tvConnections.Selected.Text; if WfxPluginFileSource.WfxModule.WfxNetworkOpenConnection(Connection, RootPath, RemotePath) then begin DoDirSeparators(RootPath); DoDirSeparators(RemotePath); WfxPluginFileSource.SetCurrentAddress(Connection); WfxPluginFileSource.SetRootDir(IncludeTrailingPathDelimiter(RootPath)); FFileView.AddFileSource(WfxPluginFileSource, ExcludeTrailingPathDelimiter(RootPath) + RemotePath); tvConnections.Selected.Parent.Data:= nil; Close; end else begin msgError(Format(rsMsgErrCanNotConnect, [Connection])); end; end; } end; procedure TfrmConnectionManager.btnDeleteClick(Sender: TObject); var WfxPluginFileSource: IWfxPluginFileSource; Connection: UTF8String; begin { WfxPluginFileSource:= PFileSourceRecord(tvConnections.Selected.Parent.Data)^.FileSource as IWfxPluginFileSource; if Assigned(WfxPluginFileSource) then begin Connection:= tvConnections.Selected.Text; if WfxPluginFileSource.WfxModule.WfxNetworkManageConnection(Handle, Connection, FS_NM_ACTION_DELETE) then begin tvConnections.Items.BeginUpdate; tvConnections.Items.Delete(tvConnections.Selected); tvConnections.Items.EndUpdate; end; end; } end; procedure TfrmConnectionManager.btnEditClick(Sender: TObject); var WfxPluginFileSource: IWfxPluginFileSource; Connection: UTF8String; begin { WfxPluginFileSource:= PFileSourceRecord(tvConnections.Selected.Parent.Data)^.FileSource as IWfxPluginFileSource; if Assigned(WfxPluginFileSource) then begin Connection:= tvConnections.Selected.Text; if WfxPluginFileSource.WfxModule.WfxNetworkManageConnection(Handle, Connection, FS_NM_ACTION_EDIT) then tvConnections.Selected.Text:= Connection; end; } end; procedure TfrmConnectionManager.FormDestroy(Sender: TObject); var I: Integer; begin { for I:= 0 to tvConnections.Items.Count - 1 do begin if Assigned(tvConnections.Items.Item[I].Data) then DisposeFileSourceRecord(tvConnections.Items.Item[I].Data); end; } end; constructor TfrmConnectionManager.Create(TheOwner: TComponent; FileView: TFileView); var I, J: Integer; WfxPluginFileSource: IWfxPluginFileSource = nil; sModuleFileName, Connection: UTF8String; Node, SubNode: TTreeNode; begin { FFileView:= FileView; inherited Create(TheOwner); for I:= 0 to gWfxPlugins.Count - 1 do begin if gWfxPlugins.Enabled[I] then begin sModuleFileName:= GetCmdDirFromEnvVar(gWfxPlugins.FileName[I]); WfxPluginFileSource:= TWfxPluginFileSource.Create(sModuleFileName, gWfxPlugins.Name[I]); try if Assigned(WfxPluginFileSource) then with WfxPluginFileSource do begin if WFXmodule.VFSNetworkSupport then begin Node:= tvConnections.Items.Add(nil, gWfxPlugins.Name[I]); Node.Data:= NewFileSourceRecord(WfxPluginFileSource); Node.StateIndex:= 0; J:= 0; while WfxModule.WfxNetworkGetConnection(J, Connection) do begin SubNode:= tvConnections.Items.AddChild(Node, Connection); SubNode.StateIndex:= 1; Inc(J); end; end else begin WfxPluginFileSource:= nil; end; end; except WfxPluginFileSource:= nil; end; end; end; } end; end. doublecmd-0.5.8/src/feditor.lrt0000644000175000017500000000424412045446211015457 0ustar alexxalexxTFRMEDITOR.CAPTION=Editor TFRMEDITOR.MIFILE.CAPTION=&File TFRMEDITOR.MIDIV.CAPTION=- TFRMEDITOR.N1.CAPTION=- TFRMEDITOR.MIEDIT.CAPTION=&Edit TFRMEDITOR.N3.CAPTION=- TFRMEDITOR.N4.CAPTION=- TFRMEDITOR.N5.CAPTION=- TFRMEDITOR.MILINEENDTYPE.CAPTION=End Of Line TFRMEDITOR.MIENCODING.CAPTION=En&coding TFRMEDITOR.MIENCODINGIN.CAPTION=Open as TFRMEDITOR.MIENCODINGOUT.CAPTION=Save as TFRMEDITOR.MIHIGHLIGHT.CAPTION=Syntax highlight TFRMEDITOR.HELP1.CAPTION=&Help TFRMEDITOR.ACTABOUT.CAPTION=About TFRMEDITOR.ACTABOUT.HINT=About TFRMEDITOR.ACTFILEOPEN.CAPTION=&Open TFRMEDITOR.ACTFILEOPEN.HINT=Open TFRMEDITOR.ACTFILECLOSE.CAPTION=&Close TFRMEDITOR.ACTFILECLOSE.HINT=Close TFRMEDITOR.ACTFILESAVE.CAPTION=&Save TFRMEDITOR.ACTFILESAVE.HINT=Save TFRMEDITOR.ACTFILESAVEAS.CAPTION=Save &As.. TFRMEDITOR.ACTFILESAVEAS.HINT=Save As TFRMEDITOR.ACTFILENEW.CAPTION=&New TFRMEDITOR.ACTFILENEW.HINT=New TFRMEDITOR.ACTFILEEXIT.CAPTION=E&xit TFRMEDITOR.ACTFILEEXIT.HINT=Exit TFRMEDITOR.ACTSAVEALL.CAPTION=Sa&ve All TFRMEDITOR.ACTSAVEALL.HINT=Save All TFRMEDITOR.ACTEDITFIND.CAPTION=&Find TFRMEDITOR.ACTEDITFIND.HINT=Find TFRMEDITOR.ACTEDITRPLC.CAPTION=&Replace TFRMEDITOR.ACTEDITRPLC.HINT=Replace TFRMEDITOR.ACTCONFHIGH.CAPTION=&Configuration TFRMEDITOR.ACTCONFHIGH.HINT=Configuration TFRMEDITOR.ACTEDITCUT.CAPTION=Cut TFRMEDITOR.ACTEDITCUT.HINT=Cut TFRMEDITOR.ACTEDITCOPY.CAPTION=Copy TFRMEDITOR.ACTEDITCOPY.HINT=Copy TFRMEDITOR.ACTEDITPASTE.CAPTION=Paste TFRMEDITOR.ACTEDITPASTE.HINT=Paste TFRMEDITOR.ACTEDITUNDO.CAPTION=Undo TFRMEDITOR.ACTEDITUNDO.HINT=Undo TFRMEDITOR.ACTEDITREDO.CAPTION=Redo TFRMEDITOR.ACTEDITREDO.HINT=Redo TFRMEDITOR.ACTEDITSELECTALL.CAPTION=Select&All TFRMEDITOR.ACTEDITSELECTALL.HINT=Select All TFRMEDITOR.ACTEDITDELETE.CAPTION=Delete TFRMEDITOR.ACTEDITDELETE.HINT=Delete TFRMEDITOR.ACTEDITFINDNEXT.CAPTION=Find next TFRMEDITOR.ACTEDITFINDNEXT.HINT=Find next TFRMEDITOR.ACTEDITLINEENDCR.CAPTION=Mac (CR) TFRMEDITOR.ACTEDITLINEENDCR.HINT=Mac (CR) TFRMEDITOR.ACTEDITLINEENDLF.CAPTION=Unix (LF) TFRMEDITOR.ACTEDITLINEENDLF.HINT=Unix (LF) TFRMEDITOR.ACTEDITLINEENDCRLF.CAPTION=Windows (CRLF) TFRMEDITOR.ACTEDITLINEENDCRLF.HINT=Windows (CRLF) TFRMEDITOR.MISEPARATOR1.CAPTION=- TFRMEDITOR.MISEPARATOR2.CAPTION=- doublecmd-0.5.8/src/udriveslist.pas0000644000175000017500000003656511743472321016402 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Control that shows drives list and allows selecting a drive. Copyright (C) 2009-2011 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uDrivesList; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Grids, Controls, LCLType, uFilePanelSelect, uDrive; type TDriveSelected = procedure (Sender: TObject; ADriveIndex: Integer; APanel: TFilePanelSelect) of object; { TDrivesListPopup } TDrivesListPopup = class(TStringGrid) private FDrivesList: TDrivesList; FPanel: TFilePanelSelect; FShortCuts: array of TUTF8Char; FAllowSelectDummyRow: Boolean; FOnDriveSelected: TDriveSelected; FOnClose: TNotifyEvent; {en @param(ARow Row nr in the grid (LowestRow..HighestRow).) } function GetDriveIndexByRow(ARow: Integer): Integer; function GetDrivesCount: Integer; function GetLowestRow: Integer; function GetHighestRow: Integer; procedure PrepareCanvasEvent(Sender: TObject; aCol, aRow: Integer; aState: TGridDrawState); procedure SelectCellEvent(Sender: TObject; aCol, aRow: Integer; var CanSelect: Boolean); procedure EnterEvent(Sender: TObject); procedure ExitEvent(Sender: TObject); procedure KeyDownEvent(Sender: TObject; var Key: Word; Shift: TShiftState); procedure KeyPressEvent(Sender: TObject; var Key: Char); procedure UTF8KeyPressEvent(Sender: TObject; var UTF8Key: TUTF8Char); procedure SelectDrive(ADriveIndex: Integer); procedure DoDriveSelected(ADriveIndex: Integer); procedure ShowContextMenu(ADriveIndex: Integer; X, Y: Integer); procedure ContextMenuClosed(Sender: TObject); {en Checks if the given shortcut is assigned to a drive. If it is then that drive is selected. @returns(@true if shortcut found, @false otherwise.) } function CheckShortcut(AShortcut: TUTF8Char): Boolean; procedure Close; procedure UpdateCells; procedure UpdateSize; property LowestRow: Integer read GetLowestRow; property HighestRow: Integer read GetHighestRow; protected procedure DrawCell(aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); override; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure Paint; override; public constructor Create(AOwner: TComponent; AParent: TWinControl); reintroduce; procedure UpdateDrivesList(ADrivesList: TDrivesList); procedure UpdateView; {en Shows the drive list. @param(AtPoint Position where to show the list.) @param(APanel For which panel the list is to be shown.) @param(ASelectedDriveIndex Which drive to pre-select (0..DrivesCount-1).) } procedure Show(AtPoint: TPoint; APanel: TFilePanelSelect; ASelectedDriveIndex: Integer = -1); procedure SetFocus; override; property Panel: TFilePanelSelect read FPanel; property DrivesCount: Integer read GetDrivesCount; property OnDriveSelected: TDriveSelected read FOnDriveSelected write FOnDriveSelected; property OnClose: TNotifyEvent read FOnClose write FOnClose; end; implementation uses StdCtrls, Graphics, LCLProc, uPixMapManager, uOSUtils, uDCUtils, uOSForms, uGlobs; const DriveIconSize = 16; // One dummy row is added, which is not displayed and cannot be selected. // It is used to simulate having no selection in the grid, because the // TCustomGrid forces at least one row/cell to be selected or focused. DummyRows = 1; constructor TDrivesListPopup.Create(AOwner: TComponent; AParent: TWinControl); begin inherited Create(AOwner); ControlStyle := ControlStyle + [csNoFocus]; Parent := AParent; FDrivesList := nil; FShortCuts := nil; FAllowSelectDummyRow := False; FOnDriveSelected := nil; FOnClose := nil; AllowOutboundEvents := False; AutoFillColumns := False; BorderStyle := bsNone; BorderWidth := 0; ExtendedSelect := False; Flat := False; FocusRectVisible := False; MouseWheelOption := mwGrid; Options := [goRowSelect, goThumbTracking]; ScrollBars := ssNone; Visible := False; while Columns.Count < 5 do Columns.Add; RowCount := 0 + DummyRows; FixedCols := 0; FixedRows := 0; if DummyRows > 0 then RowHeights[FixedRows] := 1; // Every row must have Height > 0 Color := clBtnFace; Font.Color := clWindowText; OnPrepareCanvas := @PrepareCanvasEvent; OnSelectCell := @SelectCellEvent; OnEnter := @EnterEvent; OnExit := @ExitEvent; OnKeyDown := @KeyDownEvent; OnKeyPress := @KeyPressEvent; OnUTF8KeyPress := @UTF8KeyPressEvent; end; procedure TDrivesListPopup.UpdateDrivesList(ADrivesList: TDrivesList); begin FDrivesList := ADrivesList; RowCount := LowestRow + ADrivesList.Count; Clean; SetLength(FShortCuts, ADrivesList.Count); // If currently visible update the grid. if IsVisible then begin UpdateCells; UpdateSize; end; end; procedure TDrivesListPopup.UpdateView; begin Columns.Items[2].Visible := dlbShowLabel in gDrivesListButtonOptions; Columns.Items[3].Visible := dlbShowFileSystem in gDrivesListButtonOptions; Columns.Items[4].Visible := dlbShowFreeSpace in gDrivesListButtonOptions; end; procedure TDrivesListPopup.Show(AtPoint: TPoint; APanel: TFilePanelSelect; ASelectedDriveIndex: Integer = -1); begin UpdateCells; UpdateSize; FPanel := APanel; Left := AtPoint.X; Top := AtPoint.Y; Visible := True; ASelectedDriveIndex := LowestRow + ASelectedDriveIndex; if (ASelectedDriveIndex >= LowestRow) and (ASelectedDriveIndex <= HighestRow) then Row := ASelectedDriveIndex else begin FAllowSelectDummyRow := True; Row := FixedRows; // Select dummy row to clear selection FAllowSelectDummyRow := False; end; // Set focus using parent procedure. inherited SetFocus; end; procedure TDrivesListPopup.SetFocus; begin // Empty - don't allow setting focus. end; procedure TDrivesListPopup.PrepareCanvasEvent(Sender: TObject; aCol, aRow: Integer; aState: TGridDrawState); var ts: TTextStyle; begin if aCol = 4 then begin // Right-align free space text in third column. ts := Canvas.TextStyle; ts.Alignment := taRightJustify; Canvas.TextStyle := ts; end else if aCol > 0 then begin // Left-align other columns (except column 0 which shows the icon). ts := Canvas.TextStyle; ts.Alignment := taLeftJustify; Canvas.TextStyle := ts; end; end; function TDrivesListPopup.GetDriveIndexByRow(ARow: Integer): Integer; begin if (ARow >= LowestRow) and (ARow <= HighestRow) then Result := ARow - LowestRow else Result := -1; end; function TDrivesListPopup.GetDrivesCount: Integer; begin Result := HighestRow - LowestRow + 1; end; function TDrivesListPopup.GetLowestRow: Integer; begin Result := FixedRows + DummyRows; end; function TDrivesListPopup.GetHighestRow: Integer; begin Result := RowCount - 1; end; procedure TDrivesListPopup.DrawCell(aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); var Drive: PDrive; BitmapTmp: TBitmap; begin if (aRow = FixedRows) and (DummyRows > 0) then // Don't draw the dummy row. Exit else if (aCol = 0) and (aRow >= LowestRow) then begin inherited; // Draw drive icon in the first column. Drive := FDrivesList.Items[GetDriveIndexByRow(aRow)]; // get disk icon BitmapTmp := PixMapManager.GetDriveIcon(Drive, DriveIconSize, Self.Color); if Assigned(BitmapTmp) then begin // Center icon in the cell. aRect.Left := aRect.Left + (ColWidths[aCol] - DriveIconSize) div 2; aRect.Top := aRect.Top + (RowHeights[aRow] - DriveIconSize) div 2; Canvas.Draw(aRect.Left, aRect.Top, BitmapTmp); FreeAndNil(BitmapTmp); end; end else begin inherited; // Draw vertical lines separating cells, but only in columns other than first. with Canvas, aRect do begin MoveTo(Right - 1, Top); LineTo(Right - 1, Bottom); end; end; end; procedure TDrivesListPopup.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var ACol, ARow: Integer; begin // Totally override MouseDown (don't call inherited). if (X < 0) or (Y < 0) or (X >= Width) or (Y >= Height) then Close else begin MouseToCell(X, Y, ACol, ARow); if (ACol < 0) or (ARow < 0) then Close else begin case Button of mbLeft: SelectDrive(GetDriveIndexByRow(ARow)); mbRight: ShowContextMenu(GetDriveIndexByRow(ARow), X, Y); end; end; end; end; procedure TDrivesListPopup.MouseMove(Shift: TShiftState; X, Y: Integer); var ACol, ARow: Integer; begin // Totally override MouseMove (don't call inherited). if (X < 0) or (Y < 0) or (X >= Width) or (Y >= Height) then Exit; MouseToCell(X, Y, ACol, ARow); if (ACol >= 0) and (ARow >= 0) then Row := ARow; end; procedure TDrivesListPopup.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var ACol, ARow: Integer; begin // Totally override MouseUp (don't call inherited). MouseToCell(X, Y, ACol, ARow); if (X < 0) or (Y < 0) or (X >= Width) or (Y >= Height) or (ACol < 0) or (ARow < 0) then Close; end; procedure TDrivesListPopup.Paint; var ARect: TRect; begin {$IFDEF LCLQT} // In QT Frame3d draws filled rectangle, so it must be drawn before // or it would overwrite all the painting done below. ARect := Classes.Rect(0, 0, Width, Height); Canvas.Frame3d(ARect, 1, bvRaised); {$ENDIF} inherited Paint; {$IFNDEF LCLQT} // This draws empty frame rectangle. ARect := Classes.Rect(0, 0, Width, Height); Canvas.Frame3d(ARect, 1, bvRaised); {$ENDIF} end; procedure TDrivesListPopup.SelectCellEvent(Sender: TObject; aCol, aRow: Integer; var CanSelect: Boolean); begin // Don't allow selecting dummy row. if (not FAllowSelectDummyRow) and (DummyRows > 0) then CanSelect := aRow > FixedRows else CanSelect := True; end; procedure TDrivesListPopup.EnterEvent(Sender: TObject); begin // Mouse capture is needed for detecting when mouse is clicked outside the control. // This also recaptures mouse if user switched to another application and back. MouseCapture := True; end; procedure TDrivesListPopup.ExitEvent(Sender: TObject); begin Close; end; procedure TDrivesListPopup.KeyDownEvent(Sender: TObject; var Key: Word; Shift: TShiftState); var Rect: TRect; begin case Key of VK_HOME: begin Row := LowestRow; Key := 0; end; VK_END: begin Row := HighestRow; Key := 0; end; VK_PRIOR, VK_NEXT: // Disable page-up, page-down. Key := 0; VK_UP, VK_LEFT: begin if Row > LowestRow then Row := Row - 1 // If dummy row selected then select the last row. else if Row = FixedRows then Row := HighestRow; Key := 0; end; VK_DOWN, VK_RIGHT: begin if Row < HighestRow then Row := Row + 1; Key := 0; end; VK_RETURN, VK_SELECT, VK_SPACE: begin SelectDrive(GetDriveIndexByRow(Row)); Key := 0; end; VK_ESCAPE: begin Close; Key := 0; end; VK_APPS: begin Rect := CellRect(2, Row); ShowContextMenu(GetDriveIndexByRow(Row), Rect.Left, Rect.Top); Key := 0; end; end; end; procedure TDrivesListPopup.KeyPressEvent(Sender: TObject; var Key: Char); begin if CheckShortcut(TUTF8Char(Key)) then Key := #0; end; procedure TDrivesListPopup.UTF8KeyPressEvent(Sender: TObject; var UTF8Key: TUTF8Char); begin if CheckShortcut(UTF8Key) then UTF8Key := ''; end; procedure TDrivesListPopup.SelectDrive(ADriveIndex: Integer); begin if (ADriveIndex >= 0) and (ADriveIndex < DrivesCount) then begin MouseCapture := False; DoDriveSelected(ADriveIndex); Close; end; end; procedure TDrivesListPopup.DoDriveSelected(ADriveIndex: Integer); begin if Assigned(FOnDriveSelected) then FOnDriveSelected(Self, ADriveIndex, FPanel); end; procedure TDrivesListPopup.ShowContextMenu(ADriveIndex: Integer; X, Y: Integer); var pt: TPoint; begin if (ADriveIndex >= 0) and (ADriveIndex < FDrivesList.Count) then begin pt.X := X; pt.Y := Y; pt := ClientToScreen(pt); // Context menu usually captures mouse so we have to disable ours. MouseCapture := False; ShowDriveContextMenu(Self, FDrivesList[ADriveIndex], pt.X, pt.Y, @ContextMenuClosed); end; end; procedure TDrivesListPopup.ContextMenuClosed(Sender: TObject); begin MouseCapture := True; end; function TDrivesListPopup.CheckShortcut(AShortcut: TUTF8Char): Boolean; var i: Integer; begin for i := 0 to Length(FShortCuts) - 1 do begin if FShortCuts[i] = AShortcut then begin SelectDrive(i); Exit(True); end; end; Result := False; end; procedure TDrivesListPopup.Close; begin MouseCapture := False; Visible := False; if Assigned(FOnClose) then FOnClose(Self); end; procedure TDrivesListPopup.UpdateCells; var I, RowNr : Integer; FreeSize, TotalSize: Int64; Drive: PDrive; begin for I := 0 to FDrivesList.Count - 1 do begin Drive := FDrivesList[I]; RowNr := LowestRow + I; if Length(Drive^.DisplayName) > 0 then begin Cells[1, RowNr] := Drive^.DisplayName; FShortCuts[I] := UTF8Copy(Drive^.DisplayName, 1, 1); end else begin Cells[1, RowNr] := Drive^.Path; FShortCuts[I] := ''; end; Cells[2, RowNr] := GetDriveLabelOrStatus(Drive); Cells[3, RowNr] := Drive^.FileSystem; // Display free space only for some drives // (removable, network, etc. may be slow). if (Drive^.DriveType in [dtHardDisk, dtOptical, dtRamDisk]) and IsAvailable(Drive, False) and GetDiskFreeSpace(Drive^.Path, FreeSize, TotalSize) then begin Cells[4, RowNr] := Format('%s/%s', [cnvFormatFileSize(FreeSize, True), cnvFormatFileSize(TotalSize, True)]) end; end; // for end; procedure TDrivesListPopup.UpdateSize; var I : Integer; w, h: Integer; begin // Needed for autosizing to work before the control is visible. HandleNeeded; AutoSizeColumns; // Add some space to the icon column. ColWidths[0] := DriveIconSize + 8; // Add some space to other columns. for I := 1 to ColCount - 1 do ColWidths[I] := ColWidths[I] + 4; w := GridWidth; h := GridHeight; if DummyRows > 0 then Inc(h, RowHeights[FixedRows] + GridLineWidth); Width := w; Height := h; end; end. doublecmd-0.5.8/src/ffindview.lfm0000644000175000017500000000364112023046500015752 0ustar alexxalexxinherited frmFindView: TfrmFindView Left = 365 Height = 104 Top = 311 Width = 344 HorzScrollBar.Page = 343 HorzScrollBar.Range = 103 VertScrollBar.Page = 96 VertScrollBar.Range = 90 ActiveControl = cbDataToFind BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Find' ClientHeight = 104 ClientWidth = 344 OnShow = FormShow Position = poScreenCenter object cbDataToFind: TComboBox[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 8 Height = 28 Top = 12 Width = 328 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 8 BorderSpacing.Top = 12 BorderSpacing.Right = 8 ItemHeight = 0 OnKeyUp = cbDataToFindKeyUp TabOrder = 0 end object btnFind: TBitBtn[1] AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnClose AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 150 Height = 32 Top = 68 Width = 90 Anchors = [akRight, akBottom] BorderSpacing.Right = 6 BorderSpacing.Bottom = 4 Caption = '&Find' Default = True OnClick = btnFindClick TabOrder = 2 end object btnClose: TBitBtn[2] AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 246 Height = 32 Top = 68 Width = 90 Anchors = [akRight, akBottom] BorderSpacing.Right = 8 BorderSpacing.Bottom = 4 Caption = '&Cancel' Kind = bkCancel ModalResult = 2 TabOrder = 3 end object cbCaseSens: TCheckBox[3] AnchorSideLeft.Control = cbDataToFind AnchorSideTop.Control = cbDataToFind AnchorSideTop.Side = asrBottom Left = 8 Height = 23 Top = 46 Width = 115 BorderSpacing.Top = 6 Caption = 'C&ase sensitive' TabOrder = 1 end end doublecmd-0.5.8/src/dcrevision.inc0000644000175000017500000000007112257501472016140 0ustar alexxalexx// Created by Svn2RevisionInc const dcRevision = '5390'; doublecmd-0.5.8/src/uwlxmodule.pas0000644000175000017500000005230412143646266016225 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- WLX-API implementation (TC WLX-API v2.0). Copyright (C) 2008 Dmitry Kolomiets (B4rr4cuda@rambler.ru) contributors: Copyright (C) 2009-2013 Alexander Koblov (alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uWlxModule; {$mode objfpc}{$H+} interface uses Classes, SysUtils, dynlibs, uDetectStr, uWlxPrototypes, WlxPlugin, DCClassesUtf8, uDCUtils, LCLProc, LCLType, DCXmlConfig {$IFDEF LCLWIN32} , Windows {$ENDIF} {$IFDEF LCLGTK} , gtk, glib, gdk, gtkproc {$ENDIF} {$IFDEF LCLGTK2} , gtk2, glib2, gtk2proc {$ENDIF} {$IFDEF LCLQT} , qt4, qtwidgets // The Qt widgetset must be used to load plugins on qt {$ENDIF} ; type { TWlxModule } TWlxModule = class protected // a) Mandatory (must be implemented) ListLoad: TListLoad; // b) Optional (must NOT be implemented if unsupported!) ListLoadNext: TListLoadNext; ListCloseWindow: TListCloseWindow; ListGetDetectString: TListGetDetectString; ListSearchText: TListSearchText; ListSearchDialog: TListSearchDialog; ListSendCommand: TListSendCommand; ListPrint: TListPrint; ListNotificationReceived: TListNotificationReceived; ListSetDefaultParams: TListSetDefaultParams; ListGetPreviewBitmap: TListGetPreviewBitmap; // c) Unicode ListLoadW: TListLoadW; ListLoadNextW: TListLoadNextW; ListSearchTextW: TListSearchTextW; ListPrintW: TListPrintW; ListGetPreviewBitmapW: TListGetPreviewBitmapW; private FModuleHandle: TLibHandle; // Handle to .DLL or .so FParser: TParserControl; FPluginWindow: HWND; function GetCanPrint: Boolean; function GIsLoaded: Boolean; public Name: String; FileName: String; DetectStr: String; pShowFlags: Integer; Enabled: Boolean; //--------------------- constructor Create; destructor Destroy; override; //--------------------- function LoadModule: Boolean; procedure UnloadModule; //--------------------- function CallListLoad(ParentWin: HWND; FileToLoad: String; ShowFlags: Integer): HWND; function CallListLoadNext(ParentWin: HWND; FileToLoad: String; ShowFlags: Integer): Integer; function CallListGetDetectString: String; procedure CallListSetDefaultParams; procedure CallListCloseWindow; function CallListGetPreviewBitmap(FileToLoad: String; Width, Height: Integer; contentbuf: String): hbitmap; function CallListNotificationReceived(Msg, wParam, lParam: Integer): Integer; function CallListPrint(FileToPrint, DefPrinter: String; PrintFlags: Integer; var Margins: trect): Integer; function CallListSearchDialog(FindNext: Integer): Integer; function CallListSearchText(SearchString: String; SearchParameter: Integer): Integer; function CallListSendCommand(Command, Parameter: Integer): Integer; //--------------------- function FileParamVSDetectStr(AFileName: String; bForce: Boolean): Boolean; //--------------------- procedure SetFocus; procedure ResizeWindow(aRect: TRect); //--------------------- property IsLoaded: Boolean read GIsLoaded; property ModuleHandle: TLibHandle read FModuleHandle write FModuleHandle; property PluginWindow: HWND read FPluginWindow; property CanPrint: Boolean read GetCanPrint; end; { TWLXModuleList } TWLXModuleList = class private Flist: TStringList; function GetCount: Integer; public //--------------------- constructor Create; destructor Destroy; override; //--------------------- procedure Clear; procedure Exchange(Index1, Index2: Integer); procedure Load(Ini: TIniFileEx); overload; procedure Load(AConfig: TXmlConfig; ANode: TXmlNode); overload; procedure Save(Ini: TIniFileEx); overload; procedure Save(AConfig: TXmlConfig; ANode: TXmlNode); overload; procedure DeleteItem(Index: Integer); //--------------------- function Add(Item: TWlxModule): Integer; overload; function Add(FileName: String): Integer; overload; function Add(AName, FileName, DetectStr: String): Integer; overload; //--------------------- procedure Assign(OtherList: TWLXModuleList); //--------------------- function IsLoaded(AName: String): Boolean; overload; function IsLoaded(Index: Integer): Boolean; overload; function LoadModule(AName: String): Boolean; overload; function LoadModule(Index: Integer): Boolean; overload; //--------------------- function GetWlxModule(Index: Integer): TWlxModule; overload; function GetWlxModule(AName: String): TWlxModule; overload; //--------------------- //--------------------- //property WlxList:TStringList read Flist; property Count: Integer read GetCount; end; implementation uses FileUtil, uDebug, DCOSUtils, uOSUtils, uGlobsPaths, uGlobs; const WlxIniFileName = 'wlx.ini'; {$IF DEFINED(LCLWIN32)} var WindowProcAtom: PWideChar; function PluginProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; var WindowProc: WNDPROC; begin if Msg = WM_KEYDOWN then begin PostMessage(GetParent(hWnd), Msg, wParam, lParam); end; WindowProc := WNDPROC(GetPropW(hWnd, WindowProcAtom)); if Assigned(WindowProc) then Result := CallWindowProc(WindowProc, hWnd, Msg, wParam, lParam) else Result := DefWindowProc(hWnd, Msg, wParam, lParam); end; {$ENDIF} procedure WlxPrepareContainer(var ParentWin: HWND); begin {$IF DEFINED(LCLGTK) or DEFINED(LCLGTK2)} ParentWin := HWND(GetFixedWidget(Pointer(ParentWin))); {$ELSEIF DEFINED(LCLQT)} ParentWin := HWND(TQtWidget(ParentWin).GetContainerWidget); {$ENDIF} end; { TWlxModule } function TWlxModule.GIsLoaded: Boolean; begin Result := FModuleHandle <> 0; end; function TWlxModule.GetCanPrint: Boolean; begin Result := Assigned(ListPrint) or Assigned(ListPrintW); end; constructor TWlxModule.Create; begin Enabled := True; FParser := TParserControl.Create; end; destructor TWlxModule.Destroy; begin {$IF NOT DEFINED(LCLWIN32)} if GIsLoaded then UnloadModule; {$ENDIF} if Assigned(FParser) then FParser.Free; inherited Destroy; end; function TWlxModule.LoadModule: Boolean; begin // DCDebug('WLXM LoadModule entered'); FModuleHandle := mbLoadLibrary(Self.FileName); Result := (FModuleHandle <> NilHandle); if FModuleHandle = NilHandle then Exit; { Mandatory } ListLoad := TListLoad(GetProcAddress(FModuleHandle, 'ListLoad')); { Optional } ListLoadNext := TListLoadNext(GetProcAddress(FModuleHandle, 'ListLoadNext')); ListCloseWindow := TListCloseWindow(GetProcAddress(FModuleHandle, 'ListCloseWindow')); ListGetDetectString := TListGetDetectString(GetProcAddress(FModuleHandle, 'ListGetDetectString')); ListSearchText := TListSearchText(GetProcAddress(FModuleHandle, 'ListSearchText')); ListSearchDialog := TListSearchDialog(GetProcAddress(FModuleHandle, 'ListSearchDialog')); ListSendCommand := TListSendCommand(GetProcAddress(FModuleHandle, 'ListSendCommand')); ListPrint := TListPrint(GetProcAddress(FModuleHandle, 'ListPrint')); ListNotificationReceived := TListNotificationReceived(GetProcAddress(FModuleHandle, 'ListNotificationReceived')); ListSetDefaultParams := TListSetDefaultParams(GetProcAddress(FModuleHandle, 'ListSetDefaultParams')); ListGetPreviewBitmap := TListGetPreviewBitmap(GetProcAddress(FModuleHandle, 'ListGetPreviewBitmap')); { Unicode } ListLoadW := TListLoadW(GetProcAddress(FModuleHandle, 'ListLoadW')); ListLoadNextW := TListLoadNextW(GetProcAddress(FModuleHandle, 'ListLoadNextW')); ListSearchTextW := TListSearchTextW(GetProcAddress(FModuleHandle, 'ListSearchTextW')); ListPrintW := TListPrintW(GetProcAddress(FModuleHandle, 'ListPrintW')); ListGetPreviewBitmapW := TListGetPreviewBitmapW(GetProcAddress(FModuleHandle, 'ListGetPreviewBitmapW')); // ListSetDefaultParams must be called immediately after loading the DLL, before ListLoad. CallListSetDefaultParams; // DCDebug('WLXM LoadModule Leaved'); end; procedure TWlxModule.UnloadModule; begin {$IF NOT DEFINED(LCLQT)} {$IF (not DEFINED(LINUX)) or ((FPC_VERSION > 2) or ((FPC_VERSION=2) and (FPC_RELEASE >= 5)))} if FModuleHandle <> 0 then FreeLibrary(FModuleHandle); {$ENDIF} FModuleHandle := 0; { Mandatory } ListLoad := nil; { Optional } ListLoadNext := nil; ListCloseWindow := nil; ListGetDetectString := nil; ListSearchText := nil; ListSearchDialog := nil; ListSendCommand := nil; ListPrint := nil; ListNotificationReceived := nil; ListSetDefaultParams := nil; ListGetPreviewBitmap := nil; { Unicode } ListLoadW := nil; ListLoadNextW := nil; ListSearchTextW := nil; ListPrintW := nil; ListGetPreviewBitmapW := nil; {$ENDIF} end; function TWlxModule.CallListLoad(ParentWin: HWND; FileToLoad: String; ShowFlags: Integer): HWND; begin WlxPrepareContainer(ParentWin); if Assigned(ListLoadW) then FPluginWindow := ListLoadW(ParentWin, PWideChar(UTF8Decode(FileToLoad)), ShowFlags) else if Assigned(ListLoad) then FPluginWindow := ListLoad(ParentWin, PAnsiChar(UTF8ToSys(FileToLoad)), ShowFlags) else Exit(wlxInvalidHandle); {$IF DEFINED(LCLWIN32)} // Subclass plugin window to catch some hotkeys like 'n' or 'p'. Result := SetWindowLongPtr(FPluginWindow, GWL_WNDPROC, LONG_PTR(@PluginProc)); Windows.SetPropW(FPluginWindow, WindowProcAtom, Result); {$ENDIF} Result := FPluginWindow; end; function TWlxModule.CallListLoadNext(ParentWin: HWND; FileToLoad: String; ShowFlags: Integer): Integer; begin WlxPrepareContainer(ParentWin); if Assigned(ListLoadNextW) then Result := ListLoadNextW(ParentWin, FPluginWindow, PWideChar(UTF8Decode(FileToLoad)), ShowFlags) else if Assigned(ListLoadNext) then Result := ListLoadNext(ParentWin, FPluginWindow, PAnsiChar(UTF8ToSys(FileToLoad)), ShowFlags) else Result := LISTPLUGIN_ERROR; end; procedure TWlxModule.CallListCloseWindow; begin // DCDebug('Try to call ListCloseWindow'); try {$IF DEFINED(LCLWIN32)} SetWindowLongPtr(FPluginWindow, GWL_WNDPROC, RemovePropW(FPluginWindow, WindowProcAtom)); {$ENDIF} if Assigned(ListCloseWindow) then ListCloseWindow(FPluginWindow) {$IF DEFINED(LCLWIN32)} else DestroyWindow(FPluginWindow) {$ELSEIF DEFINED(LCLGTK) or DEFINED(LCLGTK2)} else gtk_widget_destroy(PGtkWidget(FPluginWindow)); {$ELSEIF DEFINED(LCLQT)} else QWidget_Destroy(QWidgetH(FPluginWindow)); {$ENDIF} finally FPluginWindow := 0; end; // DCDebug('Call ListCloseWindow success'); end; function TWlxModule.CallListGetDetectString: String; begin // DCDebug('GetDetectstr Entered'); if Assigned(ListGetDetectString) then begin SetLength(Result, MAX_PATH); Result[1] := #0; ListGetDetectString(PAnsiChar(Result), MAX_PATH); Result := PAnsiChar(Result); end else Result := EmptyStr; // DCDebug('GetDetectStr Leaved'); end; function TWlxModule.CallListSearchText(SearchString: String; SearchParameter: Integer): Integer; begin if Assigned(ListSearchTextW) then Result := ListSearchTextW(FPluginWindow, PWideChar(UTF8Decode(SearchString)), SearchParameter) else if Assigned(ListSearchText) then Result := ListSearchText(FPluginWindow, PAnsiChar(UTF8ToSys(SearchString)), SearchParameter) else Result := LISTPLUGIN_ERROR; end; function TWlxModule.CallListSearchDialog(FindNext: Integer): Integer; begin if Assigned(ListSearchDialog) then begin Result := ListSearchDialog(FPluginWindow, FindNext); end else Result := LISTPLUGIN_ERROR; end; function TWlxModule.CallListSendCommand(Command, Parameter: Integer): Integer; begin if Assigned(ListSendCommand) then begin Result := ListSendCommand(FPluginWindow, Command, Parameter); end else Result := LISTPLUGIN_ERROR; end; function TWlxModule.FileParamVSDetectStr(AFileName: String; bForce: Boolean): Boolean; begin if not Enabled then Exit(False); FParser.IsForce:= bForce; FParser.DetectStr := Self.DetectStr; DCDebug('DetectStr = ' + FParser.DetectStr); DCDebug('AFileName = ' + AFileName); Result := FParser.TestFileResult(AFileName); end; procedure TWlxModule.SetFocus; begin {$IF DEFINED(LCLWIN32)} Windows.SetFocus(FPluginWindow); {$ELSEIF DEFINED(LCLQT)} QWidget_setFocus(QWidgetH(FPluginWindow)); {$ELSEIF DEFINED(LCLGTK2)} gtk_widget_grab_focus(PGtkWidget(FPluginWindow)); {$ENDIF} end; procedure TWlxModule.ResizeWindow(aRect: TRect); begin //ToDo: Implement for other widgetsets with aRect do begin {$IF DEFINED(LCLWIN32)} MoveWindow(FPluginWindow, Left, Top, Right - Left, Bottom - Top, True); {$ELSEIF DEFINED(LCLQT)} QWidget_move(QWidgetH(FPluginWindow), Left, Top); QWidget_resize(QWidgetH(FPluginWindow), Right - Left, Bottom - Top); {$ELSEIF DEFINED(LCLGTK2)} gtk_widget_set_uposition(PGtkWidget(FPluginWindow), Left, -1); gtk_widget_set_usize(PGtkWidget(FPluginWindow), Right - Left, Bottom - Top); {$ENDIF} end; end; function TWlxModule.CallListPrint(FileToPrint, DefPrinter: String; PrintFlags: Integer; var Margins: trect): Integer; begin if Assigned(ListPrintW) then Result := ListPrintW(FPluginWindow, PWideChar(UTF8Decode(FileToPrint)), PWideChar(UTF8Decode(DefPrinter)), PrintFlags, Margins) else if Assigned(ListPrint) then Result := ListPrint(FPluginWindow, PAnsiChar(UTF8ToSys(FileToPrint)), PAnsiChar(UTF8ToSys(DefPrinter)), PrintFlags, Margins) else Result := LISTPLUGIN_ERROR; end; function TWlxModule.CallListNotificationReceived(Msg, wParam, lParam: Integer): Integer; begin if Assigned(ListNotificationReceived) then begin Result := ListNotificationReceived(FPluginWindow, Msg, wParam, lParam); end; end; procedure TWlxModule.CallListSetDefaultParams; var dps: TListDefaultParamStruct; begin if Assigned(ListSetDefaultParams) then begin dps.DefaultIniName := mbFileNameToSysEnc(gpCfgDir + WlxIniFileName); dps.PluginInterfaceVersionHi := 2; dps.PluginInterfaceVersionLow := 0; dps.Size := SizeOf(TListDefaultParamStruct); ListSetDefaultParams(@dps); end; end; function TWlxModule.CallListGetPreviewBitmap(FileToLoad: String; Width, Height: Integer; contentbuf: String): hbitmap; begin if Assigned(ListGetPreviewBitmapW) then Result := ListGetPreviewBitmapW(PWideChar(UTF8Decode(FileToLoad)), Width, Height, PChar(contentbuf), length(contentbuf)) else if Assigned(ListGetPreviewBitmap) then Result := ListGetPreviewBitmap(PAnsiChar(UTF8ToSys(FileToLoad)), Width, Height, PChar(contentbuf), length(contentbuf)); end; { TWLXModuleList } function TWLXModuleList.GetCount: Integer; begin if Assigned(Flist) then Result := Flist.Count else Result := 0; end; constructor TWLXModuleList.Create; begin Flist := TStringList.Create; end; destructor TWLXModuleList.Destroy; begin Clear; FreeAndNil(Flist); inherited Destroy; end; procedure TWLXModuleList.Clear; begin while Flist.Count > 0 do begin TWlxModule(Flist.Objects[0]).Free; Flist.Delete(0); end; end; procedure TWLXModuleList.Exchange(Index1, Index2: Integer); begin FList.Exchange(Index1, Index2); end; procedure TWLXModuleList.Load(Ini: TIniFileEx); var xCount, I: Integer; tmp: String; begin Self.Clear; xCount := Ini.ReadInteger('Lister Plugins', 'PluginCount', 0); if xCount = 0 then Exit; for i := 0 to xCount - 1 do begin tmp := Ini.ReadString('Lister Plugins', 'Plugin' + IntToStr(I + 1) + 'Name', ''); Flist.AddObject(UpCase(tmp), TWlxModule.Create); TWlxModule(Flist.Objects[I]).Name := tmp; TWlxModule(Flist.Objects[I]).DetectStr := Ini.ReadString('Lister Plugins', 'Plugin' + IntToStr(I + 1) + 'Detect', ''); TWlxModule(Flist.Objects[I]).FileName := GetCmdDirFromEnvVar(Ini.ReadString('Lister Plugins', 'Plugin' + IntToStr(I + 1) + 'Path', '')); end; end; procedure TWLXModuleList.Load(AConfig: TXmlConfig; ANode: TXmlNode); var AName, APath: String; AWlxModule: TWlxModule; begin Clear; ANode := ANode.FindNode('WlxPlugins'); if Assigned(ANode) then begin ANode := ANode.FirstChild; while Assigned(ANode) do begin if ANode.CompareName('WlxPlugin') = 0 then begin if AConfig.TryGetValue(ANode, 'Name', AName) and AConfig.TryGetValue(ANode, 'Path', APath) then begin AWlxModule := TWlxModule.Create; Flist.AddObject(UpCase(AName), AWlxModule); AWlxModule.Name := AName; AWlxModule.FileName := GetCmdDirFromEnvVar(APath); AWlxModule.DetectStr := AConfig.GetValue(ANode, 'DetectString', ''); AWlxModule.Enabled:= AConfig.GetAttr(ANode, 'Enabled', True); end else DCDebug('Invalid entry in configuration: ' + AConfig.GetPathFromNode(ANode) + '.'); end; ANode := ANode.NextSibling; end; end; end; procedure TWLXModuleList.Save(Ini: TIniFileEx); var i: Integer; begin Ini.EraseSection('Lister Plugins'); Ini.WriteInteger('Lister Plugins', 'PluginCount', Flist.Count); for i := 0 to Flist.Count - 1 do begin Ini.WriteString('Lister Plugins', 'Plugin' + IntToStr(I + 1) + 'Name', TWlxModule(Flist.Objects[I]).Name); Ini.WriteString('Lister Plugins', 'Plugin' + IntToStr(I + 1) + 'Detect', TWlxModule(Flist.Objects[I]).DetectStr); Ini.WriteString('Lister Plugins', 'Plugin' + IntToStr(I + 1) + 'Path', SetCmdDirAsEnvVar(TWlxModule(Flist.Objects[I]).FileName)); end; end; procedure TWLXModuleList.Save(AConfig: TXmlConfig; ANode: TXmlNode); var i: Integer; SubNode: TXmlNode; begin ANode := AConfig.FindNode(ANode, 'WlxPlugins', True); AConfig.ClearNode(ANode); for i := 0 to Flist.Count - 1 do begin SubNode := AConfig.AddNode(ANode, 'WlxPlugin'); AConfig.SetAttr(SubNode, 'Enabled', TWlxModule(Flist.Objects[I]).Enabled); AConfig.AddValue(SubNode, 'Name', TWlxModule(Flist.Objects[I]).Name); AConfig.AddValue(SubNode, 'Path', SetCmdDirAsEnvVar(TWlxModule(Flist.Objects[I]).FileName)); AConfig.AddValue(SubNode, 'DetectString', TWlxModule(Flist.Objects[I]).DetectStr); end; end; procedure TWLXModuleList.DeleteItem(Index: Integer); begin if (Index > -1) and (Index < Flist.Count) then begin TWlxModule(Flist.Objects[Index]).Free; Flist.Delete(Index); end; end; function TWLXModuleList.Add(Item: TWlxModule): Integer; begin Result := Flist.AddObject(UpCase(item.Name), Item); end; function TWLXModuleList.Add(FileName: String): Integer; var s: String; begin // DCDebug('WLXLIST Add entered'); s := ExtractFileName(FileName); if pos('.', s) > 0 then Delete(s, pos('.', s), length(s)); Result := Flist.AddObject(UpCase(s), TWlxModule.Create); TWlxModule(Flist.Objects[Result]).Name := s; TWlxModule(Flist.Objects[Result]).FileName := FileName; if TWlxModule(Flist.Objects[Result]).LoadModule then begin TWlxModule(Flist.Objects[Result]).DetectStr := TWlxModule(Flist.Objects[Result]).CallListGetDetectString; TWlxModule(Flist.Objects[Result]).UnloadModule; end; // DCDebug('WLXLIST ADD Leaved'); end; function TWLXModuleList.Add(AName, FileName, DetectStr: String): Integer; begin Result := Flist.AddObject(UpCase(AName), TWlxModule.Create); TWlxModule(Flist.Objects[Result]).Name := AName; TWlxModule(Flist.Objects[Result]).DetectStr := DetectStr; TWlxModule(Flist.Objects[Result]).FileName := FileName; end; procedure TWLXModuleList.Assign(OtherList: TWLXModuleList); var I, J: Integer; begin Clear; for I := 0 to OtherList.Flist.Count - 1 do begin with TWlxModule(OtherList.Flist.Objects[I]) do begin J:= Add(Name, FileName, DetectStr); GetWlxModule(J).Enabled:= Enabled; end; end; end; function TWLXModuleList.IsLoaded(AName: String): Boolean; var x: Integer; begin x := Flist.IndexOf(AName); if x = -1 then Result := False else begin Result := GetWlxModule(x).IsLoaded; end; end; function TWLXModuleList.IsLoaded(Index: Integer): Boolean; begin Result := GetWlxModule(Index).IsLoaded; end; function TWLXModuleList.LoadModule(AName: String): Boolean; var x: Integer; begin x := Flist.IndexOf(UpCase(AName)); if x = -1 then Result := False else begin Result := GetWlxModule(x).LoadModule; end; end; function TWLXModuleList.LoadModule(Index: Integer): Boolean; begin Result := GetWlxModule(Index).LoadModule; end; function TWLXModuleList.GetWlxModule(Index: Integer): TWlxModule; begin Result := TWlxModule(Flist.Objects[Index]); end; function TWLXModuleList.GetWlxModule(AName: String): TWlxModule; var tmp: Integer; begin tmp := Flist.IndexOf(upcase(AName)); if tmp > -1 then Result := TWlxModule(Flist.Objects[tmp]); end; {$IF DEFINED(LCLWIN32)}{$WARNINGS OFF} initialization WindowProcAtom := Pointer(GlobalAddAtomW('Double Commander')); finalization Windows.GlobalDeleteAtom(ATOM(WindowProcAtom)); {$ENDIF} end. doublecmd-0.5.8/src/fsetfileproperties.lfm0000644000175000017500000006300012023046500017702 0ustar alexxalexxobject frmSetFileProperties: TfrmSetFileProperties Left = 734 Height = 593 Top = 80 Width = 309 AutoSize = True BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Change attributes' ClientHeight = 593 ClientWidth = 309 OnCreate = FormCreate Position = poScreenCenter LCLVersion = '1.1' object btnOK: TBitBtn AnchorSideTop.Control = chkRecursive AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnCancel AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 95 Height = 31 Top = 552 Width = 100 Anchors = [akTop, akRight] AutoSize = True BorderSpacing.Top = 6 BorderSpacing.Right = 6 BorderSpacing.Bottom = 10 Caption = '&OK' Constraints.MinWidth = 100 Default = True Kind = bkOK ModalResult = 1 OnClick = btnOKClick TabOrder = 4 end object btnCancel: TBitBtn AnchorSideTop.Control = btnOK AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 201 Height = 32 Top = 552 Width = 100 Anchors = [akTop, akRight] AutoSize = True BorderSpacing.Right = 8 BorderSpacing.Bottom = 10 Cancel = True Caption = '&Cancel' Constraints.MinWidth = 100 Kind = bkCancel ModalResult = 2 TabOrder = 5 end object chkRecursive: TCheckBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbUnixAttributes AnchorSideTop.Side = asrBottom Left = 12 Height = 23 Top = 523 Width = 156 BorderSpacing.Left = 12 BorderSpacing.Top = 8 Caption = 'Including subfolders' TabOrder = 3 end object gbTimeSamp: TGroupBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner Left = 6 Height = 125 Top = 6 Width = 395 AutoSize = True BorderSpacing.Around = 6 Caption = 'Timestamp properties' ClientHeight = 102 ClientWidth = 391 TabOrder = 0 object DatesPanel: TPanel AnchorSideLeft.Control = ChecksPanel AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = gbTimeSamp AnchorSideRight.Control = gbTimeSamp AnchorSideRight.Side = asrBottom Left = 112 Height = 90 Top = 6 Width = 279 AutoSize = True BorderSpacing.Left = 6 BorderSpacing.Around = 6 BevelOuter = bvNone ClientHeight = 90 ClientWidth = 279 TabOrder = 1 object ZVCreationDateTime: TZVDateTimePicker AnchorSideLeft.Control = DatesPanel AnchorSideTop.Control = DatesPanel AnchorSideRight.Control = DatesPanel AnchorSideRight.Side = asrBottom Left = 0 Height = 26 Top = 0 Width = 240 CenturyFrom = 1941 MaxDate = 2958465 MinDate = -53780 TabOrder = 0 Enabled = False TrailingSeparator = False TextForNullDate = 'NULL' LeadingZeros = True Kind = dtkDateTime TimeFormat = tf24 TimeDisplay = tdHMSMs DateMode = dmComboBox Date = 40608 Time = 0.0684693287039408 UseDefaultSeparators = True OnChange = ZVCreationDateTimeChange end object ZVLastWriteDateTime: TZVDateTimePicker AnchorSideLeft.Control = DatesPanel AnchorSideTop.Control = ZVCreationDateTime AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 0 Height = 26 Top = 32 Width = 240 CenturyFrom = 1941 MaxDate = 2958465 MinDate = -53780 TabOrder = 1 BorderSpacing.Top = 6 BorderSpacing.Right = 6 Enabled = False TrailingSeparator = False TextForNullDate = 'NULL' LeadingZeros = True Kind = dtkDateTime TimeFormat = tf24 TimeDisplay = tdHMSMs DateMode = dmComboBox Date = 40608 Time = 0.0684693287039408 UseDefaultSeparators = True OnChange = ZVLastWriteDateTimeChange end object ZVLastAccessDateTime: TZVDateTimePicker AnchorSideLeft.Control = DatesPanel AnchorSideTop.Control = ZVLastWriteDateTime AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 0 Height = 26 Top = 64 Width = 240 CenturyFrom = 1941 MaxDate = 2958465 MinDate = -53780 TabOrder = 2 BorderSpacing.Top = 6 Enabled = False TrailingSeparator = False TextForNullDate = 'NULL' LeadingZeros = True Kind = dtkDateTime TimeFormat = tf24 TimeDisplay = tdHMSMs DateMode = dmComboBox Date = 40608 Time = 0.0684693287039408 UseDefaultSeparators = True OnChange = ZVLastAccessDateTimeChange end object btnLastWriteTime: TSpeedButton AnchorSideLeft.Control = ZVLastWriteDateTime AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = ZVLastWriteDateTime AnchorSideTop.Side = asrCenter AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 246 Height = 21 Top = 35 Width = 23 BorderSpacing.Left = 6 BorderSpacing.Right = 10 Enabled = False Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 0000D5D5D40000000000FFFFFF00D1D5D4D7B2B2B3FFB3B4B4FFB3B4B4FFCACE CDFFC7C4C51900000000D4D4D400000000000000000000000000000000000000 000000000000E2E2E19D898B89D7A6A9A7FFCCCCCCFFD5DCDEFFCFD0CFFFB5B8 B7FE8E9291F9CCCCCDD900000000C0C1C1000000000000000000000000000000 0000CACAC964909392FFC2C5C3FFF4F6F6FFFAFEFEFFC27443FFFBFFFFFFF5F8 F9FFDDDFDEFF8B8E8CFDBBBCBCE6FFFFFF050000000000000000C3C3C3000000 0000A1A2A1FFCACCCCFEFCFEFFFFC98C64FFFDFFFFFFF3E5DCFFF8FCFEFFCB8E 67FFF0F8FAFFEAEAEAFF989A9AFF91939325C3C3C30100000000FFFFFF05BFBF BFE6A3A7A6FDFDFFFFFFD7CABEFFEDF6F7FFEDEFEEFFF1F3F2FFEDEFEEFFF4FC FEFFE7E6E1FFF7F4F1FFD0D1D0FEB1B2B1FFFFFFFF1900000000D0D1D1359395 94FFDDE0DFFFF0F4F3FFD3C7BBFFCDD1D0FFC9CECCFFE7EBE9FFECF0EEFFEBF0 EDFFEBEBE6FFE2E2DEFFF0F2F0FF949795FECECFCFD000000000CAC9C9338C90 8FFFEDEAE6FFD2C0B2FFC5CACAFFBFC4C2FFC4C8C8FFC3C6C5FF767778FF7677 78FFB6B9BAFFD4C9BDFFEADCD1FF969B99FFC8C7C8CB00000000CAC9C9338C90 8EFFECE9E6FFCABAACFFC1C7C6FFC5CBC9FFD2D8D6FF1C1D1DFF929495FF9C9F 9EFFCFD4D3FFD2C6BCFFECDED4FF959A98FFC8C8C8CB00000000D0D1D1359395 94FFE0E1E0FFE0E4E4FFC4B7ACFFBEC3C2FFCBCFCEFF1F1F1FFFB8BBBCFFCFD4 D3FFE5E3DFFFDFDEDAFFE6E9E9FF959796FECECFCFD000000000FFFFFF05BFBF BFE6A1A6A4FDF6F9FAFFCBBFB2FFC9D4D5FFC3C8C6FF1B1B1BFFBABCBDFFD6E0 E1FFDFDEDAFFF7F4F0FFD2D3D2FEB1B2B2FFFFFFFF1900000000C3C3C3000000 00009FA2A1FFD0D2D2FEF5F8F8FFCA8D66FFD8E3E4FF1A1D1EFFC4C8CAFFC68A 62FFEDF5F7FFE9EAEAFF979999FF92949325C3C3C30100000000000000000000 0000C9C9C964909392FFC0C2C1FFEFF3F3FFFCFEFFFFA0633BFFFAFFFFFFF2F5 F5FFDEDFDEFF919492FDBABBBAE6FFFFFF050000000000000000000000000000 000000000000E2E1E19D8E9090D7AAACABFFC6C9C8FFD2DADCFFCED0CEFFB6B9 B8FE909492F9CCCCCCD900000000C0C1C0000000000000000000000000000000 0000D5D4D40000000000FFFFFF00CFD2D1D7C0C5C3FFBFC4C2FF8D9390FFD2D5 D4FFC7C3C41900000000D4D4D400000000000000000000000000000000000000 0000000000000000000000000000E8ECEBCF777D7AFFC2C7C5FF7C827FFFCDD1 D0FF000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000E8EBEB297E8481337B827E3383898633CED3 D137000000000000000000000000000000000000000000000000 } OnClick = btnLastWriteTimeClick end object btnCreationTime: TSpeedButton AnchorSideLeft.Control = ZVCreationDateTime AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = ZVCreationDateTime AnchorSideTop.Side = asrCenter AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 246 Height = 20 Top = 3 Width = 23 BorderSpacing.Left = 6 BorderSpacing.Right = 10 Enabled = False Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 0000D5D5D40000000000FFFFFF00D1D5D4D7B2B2B3FFB3B4B4FFB3B4B4FFCACE CDFFC7C4C51900000000D4D4D400000000000000000000000000000000000000 000000000000E2E2E19D898B89D7A6A9A7FFCCCCCCFFD5DCDEFFCFD0CFFFB5B8 B7FE8E9291F9CCCCCDD900000000C0C1C1000000000000000000000000000000 0000CACAC964909392FFC2C5C3FFF4F6F6FFFAFEFEFFC27443FFFBFFFFFFF5F8 F9FFDDDFDEFF8B8E8CFDBBBCBCE6FFFFFF050000000000000000C3C3C3000000 0000A1A2A1FFCACCCCFEFCFEFFFFC98C64FFFDFFFFFFF3E5DCFFF8FCFEFFCB8E 67FFF0F8FAFFEAEAEAFF989A9AFF91939325C3C3C30100000000FFFFFF05BFBF BFE6A3A7A6FDFDFFFFFFD7CABEFFEDF6F7FFEDEFEEFFF1F3F2FFEDEFEEFFF4FC FEFFE7E6E1FFF7F4F1FFD0D1D0FEB1B2B1FFFFFFFF1900000000D0D1D1359395 94FFDDE0DFFFF0F4F3FFD3C7BBFFCDD1D0FFC9CECCFFE7EBE9FFECF0EEFFEBF0 EDFFEBEBE6FFE2E2DEFFF0F2F0FF949795FECECFCFD000000000CAC9C9338C90 8FFFEDEAE6FFD2C0B2FFC5CACAFFBFC4C2FFC4C8C8FFC3C6C5FF767778FF7677 78FFB6B9BAFFD4C9BDFFEADCD1FF969B99FFC8C7C8CB00000000CAC9C9338C90 8EFFECE9E6FFCABAACFFC1C7C6FFC5CBC9FFD2D8D6FF1C1D1DFF929495FF9C9F 9EFFCFD4D3FFD2C6BCFFECDED4FF959A98FFC8C8C8CB00000000D0D1D1359395 94FFE0E1E0FFE0E4E4FFC4B7ACFFBEC3C2FFCBCFCEFF1F1F1FFFB8BBBCFFCFD4 D3FFE5E3DFFFDFDEDAFFE6E9E9FF959796FECECFCFD000000000FFFFFF05BFBF BFE6A1A6A4FDF6F9FAFFCBBFB2FFC9D4D5FFC3C8C6FF1B1B1BFFBABCBDFFD6E0 E1FFDFDEDAFFF7F4F0FFD2D3D2FEB1B2B2FFFFFFFF1900000000C3C3C3000000 00009FA2A1FFD0D2D2FEF5F8F8FFCA8D66FFD8E3E4FF1A1D1EFFC4C8CAFFC68A 62FFEDF5F7FFE9EAEAFF979999FF92949325C3C3C30100000000000000000000 0000C9C9C964909392FFC0C2C1FFEFF3F3FFFCFEFFFFA0633BFFFAFFFFFFF2F5 F5FFDEDFDEFF919492FDBABBBAE6FFFFFF050000000000000000000000000000 000000000000E2E1E19D8E9090D7AAACABFFC6C9C8FFD2DADCFFCED0CEFFB6B9 B8FE909492F9CCCCCCD900000000C0C1C0000000000000000000000000000000 0000D5D4D40000000000FFFFFF00CFD2D1D7C0C5C3FFBFC4C2FF8D9390FFD2D5 D4FFC7C3C41900000000D4D4D400000000000000000000000000000000000000 0000000000000000000000000000E8ECEBCF777D7AFFC2C7C5FF7C827FFFCDD1 D0FF000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000E8EBEB297E8481337B827E3383898633CED3 D137000000000000000000000000000000000000000000000000 } OnClick = btnCreationTimeClick end object btnLastAccessTime: TSpeedButton AnchorSideLeft.Control = ZVLastAccessDateTime AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = ZVLastAccessDateTime AnchorSideTop.Side = asrCenter AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 246 Height = 21 Top = 67 Width = 23 BorderSpacing.Left = 6 BorderSpacing.Right = 10 Enabled = False Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 0000D5D5D40000000000FFFFFF00D1D5D4D7B2B2B3FFB3B4B4FFB3B4B4FFCACE CDFFC7C4C51900000000D4D4D400000000000000000000000000000000000000 000000000000E2E2E19D898B89D7A6A9A7FFCCCCCCFFD5DCDEFFCFD0CFFFB5B8 B7FE8E9291F9CCCCCDD900000000C0C1C1000000000000000000000000000000 0000CACAC964909392FFC2C5C3FFF4F6F6FFFAFEFEFFC27443FFFBFFFFFFF5F8 F9FFDDDFDEFF8B8E8CFDBBBCBCE6FFFFFF050000000000000000C3C3C3000000 0000A1A2A1FFCACCCCFEFCFEFFFFC98C64FFFDFFFFFFF3E5DCFFF8FCFEFFCB8E 67FFF0F8FAFFEAEAEAFF989A9AFF91939325C3C3C30100000000FFFFFF05BFBF BFE6A3A7A6FDFDFFFFFFD7CABEFFEDF6F7FFEDEFEEFFF1F3F2FFEDEFEEFFF4FC FEFFE7E6E1FFF7F4F1FFD0D1D0FEB1B2B1FFFFFFFF1900000000D0D1D1359395 94FFDDE0DFFFF0F4F3FFD3C7BBFFCDD1D0FFC9CECCFFE7EBE9FFECF0EEFFEBF0 EDFFEBEBE6FFE2E2DEFFF0F2F0FF949795FECECFCFD000000000CAC9C9338C90 8FFFEDEAE6FFD2C0B2FFC5CACAFFBFC4C2FFC4C8C8FFC3C6C5FF767778FF7677 78FFB6B9BAFFD4C9BDFFEADCD1FF969B99FFC8C7C8CB00000000CAC9C9338C90 8EFFECE9E6FFCABAACFFC1C7C6FFC5CBC9FFD2D8D6FF1C1D1DFF929495FF9C9F 9EFFCFD4D3FFD2C6BCFFECDED4FF959A98FFC8C8C8CB00000000D0D1D1359395 94FFE0E1E0FFE0E4E4FFC4B7ACFFBEC3C2FFCBCFCEFF1F1F1FFFB8BBBCFFCFD4 D3FFE5E3DFFFDFDEDAFFE6E9E9FF959796FECECFCFD000000000FFFFFF05BFBF BFE6A1A6A4FDF6F9FAFFCBBFB2FFC9D4D5FFC3C8C6FF1B1B1BFFBABCBDFFD6E0 E1FFDFDEDAFFF7F4F0FFD2D3D2FEB1B2B2FFFFFFFF1900000000C3C3C3000000 00009FA2A1FFD0D2D2FEF5F8F8FFCA8D66FFD8E3E4FF1A1D1EFFC4C8CAFFC68A 62FFEDF5F7FFE9EAEAFF979999FF92949325C3C3C30100000000000000000000 0000C9C9C964909392FFC0C2C1FFEFF3F3FFFCFEFFFFA0633BFFFAFFFFFFF2F5 F5FFDEDFDEFF919492FDBABBBAE6FFFFFF050000000000000000000000000000 000000000000E2E1E19D8E9090D7AAACABFFC6C9C8FFD2DADCFFCED0CEFFB6B9 B8FE909492F9CCCCCCD900000000C0C1C0000000000000000000000000000000 0000D5D4D40000000000FFFFFF00CFD2D1D7C0C5C3FFBFC4C2FF8D9390FFD2D5 D4FFC7C3C41900000000D4D4D400000000000000000000000000000000000000 0000000000000000000000000000E8ECEBCF777D7AFFC2C7C5FF7C827FFFCDD1 D0FF000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000E8EBEB297E8481337B827E3383898633CED3 D137000000000000000000000000000000000000000000000000 } OnClick = btnLastAccessTimeClick end end object ChecksPanel: TPanel AnchorSideTop.Control = DatesPanel AnchorSideBottom.Control = DatesPanel AnchorSideBottom.Side = asrBottom Left = 6 Height = 90 Top = 6 Width = 94 Anchors = [akTop, akLeft, akBottom] AutoSize = True BevelOuter = bvNone ClientHeight = 90 ClientWidth = 94 TabOrder = 0 object chkCreationTime: TCheckBox AnchorSideLeft.Control = ChecksPanel AnchorSideTop.Control = ChecksPanel Left = 6 Height = 23 Top = 6 Width = 79 BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = 'Created:' Enabled = False OnChange = chkCreationTimeChange TabOrder = 0 end object chkLastWriteTime: TCheckBox AnchorSideLeft.Control = ChecksPanel AnchorSideTop.Control = ChecksPanel AnchorSideTop.Side = asrCenter Left = 6 Height = 23 Top = 34 Width = 82 BorderSpacing.Left = 6 Caption = 'Modified:' Enabled = False OnChange = chkLastWriteTimeChange TabOrder = 1 end object chkLastAccessTime: TCheckBox AnchorSideLeft.Control = ChecksPanel AnchorSideTop.Side = asrCenter AnchorSideBottom.Control = ChecksPanel AnchorSideBottom.Side = asrBottom Left = 6 Height = 23 Top = 61 Width = 88 Anchors = [akLeft, akBottom] BorderSpacing.Left = 6 BorderSpacing.Bottom = 6 Caption = 'Accessed:' Enabled = False OnChange = chkLastAccessTimeChange TabOrder = 2 end end end object gbWinAttributes: TGroupBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbTimeSamp AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 111 Top = 137 Width = 297 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = 'Attributes' ClientHeight = 88 ClientWidth = 293 TabOrder = 1 Visible = False object chkSystem: TCheckBox AnchorSideLeft.Control = chkHidden AnchorSideTop.Control = chkReadOnly Left = 166 Height = 23 Top = 35 Width = 70 BorderSpacing.Bottom = 6 Caption = 'System' OnClick = chkChangeAttrClick TabOrder = 3 end object chkHidden: TCheckBox AnchorSideTop.Control = chkArchive Left = 166 Height = 23 Top = 6 Width = 68 Anchors = [akTop] Caption = 'Hidden' OnClick = chkChangeAttrClick TabOrder = 2 end object chkArchive: TCheckBox AnchorSideLeft.Control = gbWinAttributes AnchorSideTop.Control = gbWinAttributes Left = 6 Height = 23 Top = 6 Width = 71 BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = 'Archive' OnClick = chkChangeAttrClick TabOrder = 0 end object chkReadOnly: TCheckBox AnchorSideLeft.Control = chkArchive AnchorSideTop.Control = chkArchive AnchorSideTop.Side = asrBottom Left = 6 Height = 23 Top = 35 Width = 86 BorderSpacing.Top = 6 BorderSpacing.Bottom = 6 Caption = 'Read only' OnClick = chkChangeAttrClick TabOrder = 1 end object lblAttrInfo: TLabel AnchorSideLeft.Control = chkReadOnly AnchorSideTop.Control = chkReadOnly AnchorSideTop.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 6 Height = 20 Top = 64 Width = 229 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Top = 6 BorderSpacing.Bottom = 6 Caption = '(gray field means unchanged value)' ParentColor = False Visible = False end end object gbUnixAttributes: TGroupBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbWinAttributes AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 261 Top = 254 Width = 297 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = 'Attributes' ClientHeight = 238 ClientWidth = 293 TabOrder = 2 Visible = False object lblRead: TLabel AnchorSideLeft.Control = cbReadOwner AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = gbUnixAttributes Left = 91 Height = 18 Top = 0 Width = 32 Caption = 'Read' ParentColor = False end object lblWrite: TLabel AnchorSideLeft.Control = cbWriteOwner AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = lblRead Left = 163 Height = 18 Top = 0 Width = 38 Caption = 'Write' ParentColor = False end object lblExec: TLabel AnchorSideLeft.Control = cbExecOwner AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = lblRead Left = 229 Height = 18 Top = 0 Width = 53 Caption = 'Execute' ParentColor = False end object cbExecOwner: TCheckBox AnchorSideTop.Control = cbReadOwner Left = 245 Height = 20 Top = 24 Width = 20 Anchors = [akTop] OnClick = cbChangeModeClick TabOrder = 2 end object cbWriteOwner: TCheckBox AnchorSideTop.Control = cbReadOwner Left = 172 Height = 20 Top = 24 Width = 20 Anchors = [akTop] OnClick = cbChangeModeClick TabOrder = 1 end object cbReadOwner: TCheckBox AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = lblRead AnchorSideTop.Side = asrBottom Left = 97 Height = 20 Top = 24 Width = 20 Anchors = [akTop] BorderSpacing.Top = 6 OnClick = cbChangeModeClick TabOrder = 0 end object lblAttrOwnerStr: TLabel AnchorSideLeft.Control = gbUnixAttributes AnchorSideTop.Control = cbReadOwner AnchorSideTop.Side = asrCenter Left = 7 Height = 18 Top = 25 Width = 46 BorderSpacing.Left = 7 Caption = 'Owner' ParentColor = False end object lblAttrGroupStr: TLabel AnchorSideLeft.Control = lblAttrOwnerStr AnchorSideTop.Control = cbReadGroup AnchorSideTop.Side = asrCenter Left = 7 Height = 18 Top = 51 Width = 41 Caption = 'Group' ParentColor = False end object cbReadGroup: TCheckBox AnchorSideLeft.Control = cbReadOwner AnchorSideTop.Control = cbReadOwner AnchorSideTop.Side = asrBottom Left = 97 Height = 20 Top = 50 Width = 20 BorderSpacing.Top = 6 OnClick = cbChangeModeClick TabOrder = 3 end object cbWriteGroup: TCheckBox AnchorSideLeft.Control = cbWriteOwner AnchorSideTop.Control = cbReadGroup Left = 172 Height = 20 Top = 50 Width = 20 OnClick = cbChangeModeClick TabOrder = 4 end object cbExecGroup: TCheckBox AnchorSideLeft.Control = cbExecOwner AnchorSideTop.Control = cbReadGroup Left = 245 Height = 20 Top = 50 Width = 20 OnClick = cbChangeModeClick TabOrder = 5 end object lblAttrOtherStr: TLabel AnchorSideLeft.Control = lblAttrOwnerStr AnchorSideTop.Control = cbReadOther AnchorSideTop.Side = asrCenter Left = 7 Height = 18 Top = 77 Width = 40 Caption = 'Other' ParentColor = False end object cbReadOther: TCheckBox AnchorSideLeft.Control = cbReadOwner AnchorSideTop.Control = cbReadGroup AnchorSideTop.Side = asrBottom Left = 97 Height = 20 Top = 76 Width = 20 BorderSpacing.Top = 6 OnClick = cbChangeModeClick TabOrder = 6 end object cbWriteOther: TCheckBox AnchorSideLeft.Control = cbWriteOwner AnchorSideTop.Control = cbReadOther Left = 172 Height = 20 Top = 76 Width = 20 OnClick = cbChangeModeClick TabOrder = 7 end object cbExecOther: TCheckBox AnchorSideLeft.Control = cbExecOwner AnchorSideTop.Control = cbReadOther Left = 245 Height = 20 Top = 76 Width = 20 OnClick = cbChangeModeClick TabOrder = 8 end object Bevel1: TBevel AnchorSideTop.Control = cbReadOther AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 4 Height = 4 Top = 102 Width = 289 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 BorderSpacing.Top = 6 BorderSpacing.Right = 6 Shape = bsTopLine Style = bsRaised end object cbSticky: TCheckBox AnchorSideLeft.Control = cbSuid AnchorSideTop.Control = cbSuid AnchorSideTop.Side = asrBottom Left = 97 Height = 23 Top = 141 Width = 61 BorderSpacing.Top = 6 Caption = 'Sticky' OnClick = cbChangeModeClick TabOrder = 11 end object cbSgid: TCheckBox AnchorSideLeft.Control = cbWriteOwner AnchorSideTop.Control = Bevel1 AnchorSideTop.Side = asrBottom Left = 172 Height = 23 Top = 112 Width = 58 BorderSpacing.Top = 6 Caption = 'SGID' OnClick = cbChangeModeClick TabOrder = 10 end object cbSuid: TCheckBox AnchorSideLeft.Control = cbReadOwner AnchorSideTop.Control = Bevel1 AnchorSideTop.Side = asrBottom Left = 97 Height = 23 Top = 112 Width = 57 BorderSpacing.Top = 6 Caption = 'SUID' OnClick = cbChangeModeClick TabOrder = 9 end object lblAttrBitsStr: TLabel AnchorSideLeft.Control = lblAttrOwnerStr AnchorSideTop.Control = cbSuid AnchorSideTop.Side = asrCenter Left = 7 Height = 18 Top = 114 Width = 29 Caption = 'Bits:' ParentColor = False end object Bevel2: TBevel AnchorSideTop.Control = cbSticky AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 4 Height = 4 Top = 170 Width = 289 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 BorderSpacing.Top = 6 BorderSpacing.Right = 6 Shape = bsTopLine Style = bsRaised end object lblOctal: TLabel AnchorSideLeft.Control = lblAttrOtherStr AnchorSideTop.Control = edtOctal AnchorSideTop.Side = asrCenter Left = 7 Height = 18 Top = 185 Width = 41 Caption = 'Octal:' FocusControl = edtOctal ParentColor = False end object edtOctal: TEdit AnchorSideLeft.Control = cbSuid AnchorSideTop.Control = Bevel2 AnchorSideTop.Side = asrBottom Left = 97 Height = 28 Top = 180 Width = 80 BorderSpacing.Top = 6 MaxLength = 4 OnKeyPress = edtOctalKeyPress OnKeyUp = edtOctalKeyUp TabOrder = 12 end object lblAttrTextStr: TLabel AnchorSideLeft.Control = lblAttrOtherStr AnchorSideTop.Control = edtOctal AnchorSideTop.Side = asrBottom Left = 7 Height = 18 Top = 214 Width = 35 BorderSpacing.Top = 6 BorderSpacing.Bottom = 6 Caption = 'Text:' ParentColor = False end object lblAttrText: TLabel AnchorSideLeft.Control = edtOctal AnchorSideTop.Control = lblAttrTextStr AnchorSideTop.Side = asrCenter Left = 97 Height = 18 Top = 214 Width = 55 BorderSpacing.Bottom = 6 Caption = '-----------' Font.Color = clBlack ParentColor = False ParentFont = False end end end doublecmd-0.5.8/src/ufindmmap.pas0000644000175000017500000001113011740427612015762 0ustar alexxalexx{ Seksi Commander ---------------------------- Licence : GNU GPL v 2.0 Author : radek.cervinka@centrum.cz implementind memory searching with case and mmap file to memory contributors: Copyright (C) 2006-2007 Koblov Alexander (Alexx2000@mail.ru) } unit uFindMmap; {$mode objfpc}{$H+} interface type TAbortFunction = function: Boolean of object; {en Searches data in memory for a string. @param(pDataAddr Pointer to the beginning of the data buffer.) @param(iDataLength Length of the data buffer in bytes.) @param(iStartPos Position in the buffer from which to begin search.) @param(sSearchText Text that is searched for in the data buffer.) @param(bCaseSensitive If @true the search is case sensitive.) @param(bSearchBackwards If @true the search is done in iStartPos..0. If @false the search is done in iStartPos..(iLength-1).) @returns(If the string was not found it returns -1. If the string was found it returns pointer to the data buffer where the searched text begins.) } function PosMem(pDataAddr: PChar; iDataLength, iStartPos: PtrInt; const sSearchText: String; bCaseSensitive: Boolean; bSearchBackwards: Boolean): Pointer; {en Searches a file for a string using memory mapping. @param(sFileName File to search in.) @param(sFindData String to search for.) @param(bCase If @true the search is case-sensitive.) @param(Abort This function is called repeatedly during searching. If it returns @true the search is aborted.) @returns(-1 in case of error @br 0 if the string wasn't found @br 1 if the string was found) } function FindMmap(const sFileName:String; const sFindData:String; bCase:Boolean; Abort: TAbortFunction):Integer; implementation uses DCOSUtils; function PosMem(pDataAddr: PChar; iDataLength, iStartPos: PtrInt; const sSearchText: String; bCaseSensitive: Boolean; bSearchBackwards: Boolean): Pointer; var SearchTextLength: Integer; function sPos2(pAdr: PChar):Boolean; var i: Integer; begin Result := False; for i := 1 to SearchTextLength do begin case bCaseSensitive of False: if UpCase(pAdr^) <> UpCase(sSearchText[i]) then Exit; // Only for Ansi True : if pAdr^ <> sSearchText[i] then Exit; end; Inc(pAdr); end; Result:=True; end; var pCurrentAddr, pEndAddr: PAnsiChar; begin Result := Pointer(-1); SearchTextLength := Length(sSearchText); if (SearchTextLength <= 0) or (iDataLength <= 0) then Exit; pCurrentAddr := pDataAddr + iStartPos; pEndAddr := pDataAddr + iDataLength - SearchTextLength; if bSearchBackwards and (pCurrentAddr > pEndAddr) then // Move to the first possible position for searching backwards. pCurrentAddr := pEndAddr; if (pEndAddr < pDataAddr) or (pCurrentAddr < pDataAddr) or (pCurrentAddr > pEndAddr) then Exit; while True do begin if (pCurrentAddr > pEndAddr) or (pCurrentAddr < pDataAddr) then Exit; if sPos2(pCurrentAddr) then begin Result := pCurrentAddr; Exit; end; case bSearchBackwards of False: Inc(pCurrentAddr); True : Dec(pCurrentAddr); end; end; end; function FindMmap(const sFileName, sFindData:String; bCase:Boolean; Abort: TAbortFunction):Integer; function PosMem(pAdr:PChar; iLength:Integer):Pointer; var xIndex:Integer; DataLength: Integer; function sPos(pAdr:PChar):Boolean; var i:Integer; begin Result:=False; for i:=1 to DataLength do begin case bCase of False:if UpCase(pAdr^)<>UpCase(sFindData[i]) then Exit; True: if pAdr^<>sFindData[i] then Exit; end; inc(pAdr); end; Result:=True; end; begin Result:=pointer(-1); DataLength := Length(sFindData); for xIndex:=0 to iLength - DataLength do begin if sPos(pAdr) then begin Result:=pAdr; Exit; end; inc(pAdr); if Abort() then Exit; end; end; var fmr : TFileMapRec; begin Result := -1; if MapFile(sFileName, fmr) then begin try begin if PosMem(fmr.MappedFile, fmr.FileSize) <> Pointer(-1) then Result := 1 else Result := 0; end; finally UnMapFile(fmr); end; end; end; end. doublecmd-0.5.8/src/fmultirename.pas0000644000175000017500000011020312217255050016466 0ustar alexxalexx{ Seksi Commander ---------------------------- Licence : GNU GPL v 2.0 Author : Pavel Letko (letcuv@centrum.cz) Advanced multi rename tool contributors: Copyright (C) 2007-2013 Koblov Alexander (Alexx2000@mail.ru) } unit fMultiRename; {$mode objfpc}{$H+} interface uses SysUtils, Classes, Graphics, Forms, StdCtrls, Menus, SynRegExpr, Controls, LCLType, DCClassesUtf8, uClassesEx, uFile, uFileSource, StringHashList, Grids, ExtCtrls, DCXmlConfig, uOSForms; type PMultiRenamePreset = ^TMultiRenamePreset; TMultiRenamePreset = record FileName: String; Extension: String; FileNameStyle: Integer; ExtensionStyle: Integer; Find: String; Replace: String; RegExp: Boolean; UseSubs: Boolean; Counter: String; Interval: String; Width: Integer; Log: Boolean; LogFile: String; end; { TfrmMultiRename } TfrmMultiRename = class(TAloneForm) btnLoadPreset: TButton; btnSavePreset: TButton; btnDeletePreset: TButton; cbRegExp: TCheckBox; cbUseSubs: TCheckBox; cmbExtensionStyle: TComboBox; cbPresets: TComboBox; miDay2: TMenuItem; miHour1: TMenuItem; miMinute1: TMenuItem; miSecond1: TMenuItem; pnlOptions: TPanel; StringGrid: TStringGrid; gbPresets: TGroupBox; gbMaska: TGroupBox; lbName: TLabel; lbExt: TLabel; edName: TEdit; edExt: TEdit; btnNameMenu: TButton; btnExtMenu: TButton; gbFindReplace: TGroupBox; lbFind: TLabel; lbReplace: TLabel; edFind: TEdit; edReplace: TEdit; cmbNameStyle: TComboBox; gbCounter: TGroupBox; lbStNb: TLabel; lbInterval: TLabel; lbWidth: TLabel; edPoc: TEdit; edInterval: TEdit; cmbxWidth: TComboBox; btnRename: TButton; btnClose: TButton; gbLog: TGroupBox; edFile: TEdit; cbLog: TCheckBox; btnRestore: TButton; miPlugin: TMenuItem; N5: TMenuItem; miDay3: TMenuItem; miDay1: TMenuItem; miMonth3: TMenuItem; miMonth2: TMenuItem; miMonth1: TMenuItem; miYear1: TMenuItem; ppNameMenu: TPopupMenu; miNextName: TMenuItem; miName: TMenuItem; miNameX: TMenuItem; miNameXX: TMenuItem; N1: TMenuItem; miNextExtension: TMenuItem; Extension: TMenuItem; miExtensionX: TMenuItem; miExtensionXX: TMenuItem; N2: TMenuItem; miCounter: TMenuItem; N3: TMenuItem; miNext: TMenuItem; miYear: TMenuItem; miMonth: TMenuItem; miDay: TMenuItem; N4: TMenuItem; miHour: TMenuItem; miMinute: TMenuItem; miSecond: TMenuItem; procedure btnLoadPresetClick(Sender: TObject); procedure btnSavePresetClick(Sender: TObject); procedure btnDeletePresetClick(Sender: TObject); procedure cbRegExpChange(Sender: TObject); procedure cmbNameStyleChange(Sender: TObject); procedure StringGridKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure StringGridMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure StringGridMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure StringGridSelection(Sender: TObject; aCol, aRow: Integer); procedure StringGridTopLeftChanged(Sender: TObject); procedure edPocChange(Sender: TObject); procedure edIntervalChange(Sender: TObject); procedure btnRenameClick(Sender: TObject); procedure btnCloseClick(Sender: TObject); procedure btnRestoreClick(Sender: TObject); procedure btnNameMenuClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure miDay1Click(Sender: TObject); procedure miDay2Click(Sender: TObject); procedure miDay3Click(Sender: TObject); procedure miDayClick(Sender: TObject); procedure miHour1Click(Sender: TObject); procedure miHourClick(Sender: TObject); procedure miMinute1Click(Sender: TObject); procedure miMinuteClick(Sender: TObject); procedure miMonth1Click(Sender: TObject); procedure miMonth2Click(Sender: TObject); procedure miMonth3Click(Sender: TObject); procedure miMonthClick(Sender: TObject); procedure miSecond1Click(Sender: TObject); procedure miSecondClick(Sender: TObject); procedure miYear1Click(Sender: TObject); procedure miYearClick(Sender: TObject); procedure miPluginClick(Sender: TObject); procedure NameClick(Sender: TObject); procedure NameXClick(Sender: TObject); procedure NameXXClick(Sender: TObject); procedure ExtensionClick(Sender: TObject); procedure CounterClick(Sender: TObject); procedure btnExtMenuClick(Sender: TObject); procedure cbLogClick(Sender: TObject); procedure ExtensionXClick(Sender: TObject); procedure ExtensionXXClick(Sender: TObject); private IniPropStorage: TIniPropStorageEx; FLastPreset: String; FFileSource: IFileSource; FFiles: TFiles; FPresets: TStringHashList; // of PMultiRenamePreset FSourceRow: Integer; FMoveRow : Boolean; {Handles a single formatting string} function sHandleFormatString(const sFormatStr: string; ItemNr: Integer): string; {Function sReplace call sReplaceXX with parametres} function sReplace(sMask: string; ItemNr: Integer): string; {sReplaceXX doing N, Nx, Nx:y and E, Ex, Ex:y} function sReplaceXX(const sFormatStr, sOrig: string): string; {InsertMask is for write key symbols from buttons} procedure InsertMask(const Mask:string;edChoose:Tedit); procedure InsertMask(const Mask:string;editNr:PtrInt); {Get new file name for file with ItemIndex} function FreshText(ItemIndex: Integer): UTF8String; {Executes the main operation of renaming files} procedure RenameFiles; {Changes first char to uppercase and the rest to lowercase} function FirstCharToUppercaseUTF8(InputString: String): String; {Changes first char of first word to uppercase and the rest to lowercase} function FirstCharOfFirstWordToUppercaseUTF8(InputString: String): String; {Changes first char of every word to uppercase and the rest to lowercase} function FirstCharOfEveryWordToUppercaseUTF8(InputString: String): String; {Returns true if a byte represents a letter.} function IsLetter(AChar: AnsiChar): Boolean; {Applies style (uppercase, lowercase, etc.) to a string} function ApplyStyle(InputString: String; Style: Integer): String; {Load preset configuration} procedure LoadPresets; procedure LoadPresetsXml(AConfig: TXmlConfig); {Save preset configuration} procedure SavePresets; procedure SavePresetsXml(AConfig: TXmlConfig); {Loads specified preset from the configuration} procedure LoadPreset(PresetName: String); {Saves specified preset to the configuration} procedure SavePreset(PresetName: String); {Delete specified preset from configuration} procedure DeletePreset(PresetName: String); {Fills presets list with preset from configuration} procedure FillPresetsList; {Removes all presets from the presets list} procedure ClearPresetsList; public { Public declarations } constructor Create(TheOwner: TComponent; aFileSource: IFileSource; var aFiles: TFiles); reintroduce; destructor Destroy; override; // Temporary for switching configuration from INI to XML procedure PublicSavePresets; procedure LoadPresetsIni(IniFile: TIniFileEx); procedure SavePresetsIni(IniFile: TIniFileEx); end; {initialization function} function ShowMultiRenameForm(aFileSource: IFileSource; var aFiles: TFiles):Boolean; implementation {$R *.lfm} uses LCLProc, FileUtil, uDebug, uLng, uGlobs, uFileProcs, DCOSUtils, DCStrUtils, fSelectTextRange, uShowMsg, uFileSourceUtil, uFileProperty, uFileFunctions; const sPresetsSection = 'MultiRenamePresets'; function ShowMultiRenameForm(aFileSource: IFileSource; var aFiles: TFiles):Boolean; begin Result:= True; try with TfrmMultiRename.Create(Application, aFileSource, aFiles) do begin Show; end; except Result:= False; end; end; constructor TfrmMultiRename.Create(TheOwner: TComponent; aFileSource: IFileSource; var aFiles: TFiles); begin FPresets := TStringHashList.Create(False); FFileSource := aFileSource; FFiles := aFiles; aFiles := nil; FSourceRow := -1; FMoveRow := False; inherited Create(TheOwner); end; destructor TfrmMultiRename.Destroy; begin inherited Destroy; ClearPresetsList; FreeAndNil(FPresets); if Assigned(FFiles) then FreeAndNil(FFiles); end; procedure TfrmMultiRename.FormCreate(Sender: TObject); begin // Localize File name style ComboBox ParseLineToList(rsMulRenFileNameStyleList, cmbNameStyle.Items); ParseLineToList(rsMulRenFileNameStyleList, cmbExtensionStyle.Items); // Set row count StringGrid.RowCount:= FFiles.Count + 1; StringGrid.FocusRectVisible := False; // Initialize property storage IniPropStorage:= InitPropStorage(Self); IniPropStorage.StoredValues.Add.DisplayName:= 'lsvwFile_Columns.Item0_Width'; IniPropStorage.StoredValues.Add.DisplayName:= 'lsvwFile_Columns.Item1_Width'; IniPropStorage.StoredValues.Add.DisplayName:= 'lsvwFile_Columns.Item2_Width'; // Set default values for controls. btnRestoreClick(nil); // Initialize presets. LoadPresets; FillPresetsList; cbPresets.Text := FLastPreset; LoadPreset(FLastPreset); end; procedure TfrmMultiRename.FormShow(Sender: TObject); begin with StringGrid.Columns do begin Items[0].Width:= StrToIntDef(IniPropStorage.StoredValue['lsvwFile_Columns.Item0_Width'], Items[0].Width); Items[1].Width:= StrToIntDef(IniPropStorage.StoredValue['lsvwFile_Columns.Item1_Width'], Items[1].Width); Items[2].Width:= StrToIntDef(IniPropStorage.StoredValue['lsvwFile_Columns.Item2_Width'], Items[2].Width); end; end; procedure TfrmMultiRename.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin SavePresets; CloseAction:= caFree; with StringGrid.Columns do begin IniPropStorage.StoredValue['lsvwFile_Columns.Item0_Width']:= IntToStr(Items[0].Width); IniPropStorage.StoredValue['lsvwFile_Columns.Item1_Width']:= IntToStr(Items[1].Width); IniPropStorage.StoredValue['lsvwFile_Columns.Item2_Width']:= IntToStr(Items[2].Width); end; end; procedure TfrmMultiRename.miDay1Click(Sender: TObject); begin InsertMask('[DD]',ppNameMenu.Tag); end; procedure TfrmMultiRename.miDay2Click(Sender: TObject); begin InsertMask('[DDD]',ppNameMenu.Tag); end; procedure TfrmMultiRename.miDay3Click(Sender: TObject); begin InsertMask('[DDDD]',ppNameMenu.Tag); end; procedure TfrmMultiRename.miDayClick(Sender: TObject); begin InsertMask('[D]',ppNameMenu.Tag); end; procedure TfrmMultiRename.miHour1Click(Sender: TObject); begin InsertMask('[hh]',ppNameMenu.Tag); end; procedure TfrmMultiRename.miHourClick(Sender: TObject); begin InsertMask('[h]',ppNameMenu.Tag); end; procedure TfrmMultiRename.miMinute1Click(Sender: TObject); begin InsertMask('[nn]',ppNameMenu.Tag); end; procedure TfrmMultiRename.miMinuteClick(Sender: TObject); begin InsertMask('[n]',ppNameMenu.Tag); end; procedure TfrmMultiRename.miMonth1Click(Sender: TObject); begin InsertMask('[MM]',ppNameMenu.Tag); end; procedure TfrmMultiRename.miMonth2Click(Sender: TObject); begin InsertMask('[MMM]',ppNameMenu.Tag); end; procedure TfrmMultiRename.miMonth3Click(Sender: TObject); begin InsertMask('[MMMM]',ppNameMenu.Tag); end; procedure TfrmMultiRename.miMonthClick(Sender: TObject); begin InsertMask('[M]',ppNameMenu.Tag); end; procedure TfrmMultiRename.miSecond1Click(Sender: TObject); begin InsertMask('[ss]',ppNameMenu.Tag); end; procedure TfrmMultiRename.miSecondClick(Sender: TObject); begin InsertMask('[s]',ppNameMenu.Tag); end; procedure TfrmMultiRename.miYear1Click(Sender: TObject); begin InsertMask('[YYYY]',ppNameMenu.Tag); end; procedure TfrmMultiRename.miYearClick(Sender: TObject); begin InsertMask('[Y]',ppNameMenu.Tag); end; function TfrmMultiRename.FreshText(ItemIndex: Integer): UTF8String; var bError: Boolean; sTmpName, sTmpExt: UTF8String; begin bError:= False; // Use mask sTmpName:=sReplace(edName.Text, ItemIndex); sTmpExt:=sReplace(edExt.Text, ItemIndex); // Join Result := sTmpName; if sTmpExt <> '' then Result := Result + '.' + sTmpExt; // Find and replace if cbRegExp.Checked and (edFind.Text <> '') then try Result:= ReplaceRegExpr(edFind.Text, Result, edReplace.Text, cbUseSubs.Checked); except Result:= rsMsgErrRegExpSyntax; bError:= True; end else Result:=StringReplace(Result,edFind.Text,edReplace.Text,[rfReplaceAll,rfIgnoreCase]); // File name style sTmpName := ExtractOnlyFileName(Result); sTmpExt := ExtractFileExt(Result); sTmpName := ApplyStyle(sTmpName, cmbNameStyle.ItemIndex); sTmpExt := ApplyStyle(sTmpExt, cmbExtensionStyle.ItemIndex); Result := sTmpName + sTmpExt; btnRename.Enabled:= not bError; if bError then begin edFind.Color := clRed; edFind.Font.Color := clWhite; end else begin edFind.Color := clWindow; edFind.Font.Color := clWindowText; end; end; procedure TfrmMultiRename.cmbNameStyleChange(Sender: TObject); begin StringGridTopLeftChanged(StringGrid); end; procedure TfrmMultiRename.StringGridKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var tmpFile: TFile; DestRow: Integer; begin DestRow := StringGrid.Row; if (Shift = [ssShift]) then begin case Key of VK_UP: begin DestRow := StringGrid.Row - 1; end; VK_DOWN: begin DestRow := StringGrid.Row + 1 end; end; if (DestRow <> StringGrid.Row) and (0 < DestRow) and (DestRow < StringGrid.RowCount) then begin tmpFile := FFiles.Items[DestRow - 1]; FFiles.Items[DestRow - 1] := FFiles.Items[StringGrid.Row - 1]; FFiles.Items[StringGrid.Row - 1] := tmpFile; StringGridTopLeftChanged(StringGrid); end; end; end; procedure TfrmMultiRename.StringGridMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var SourceCol: Integer; begin if(Button = mbLeft) then begin StringGrid.MouseToCell(X, Y, SourceCol, FSourceRow); if (FSourceRow > 0) then begin FMoveRow := True; end; end; end; procedure TfrmMultiRename.StringGridMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin FMoveRow := False; end; end; procedure TfrmMultiRename.StringGridSelection(Sender: TObject; aCol, aRow: Integer); var tmpFile: TFile; begin if FMoveRow and (aRow <> FSourceRow)then begin tmpFile := FFiles.Items[aRow-1]; FFiles.Items[aRow-1] := FFiles.Items[FSourceRow-1]; FFiles.Items[FSourceRow-1] := tmpFile; FSourceRow := aRow; StringGridTopLeftChanged(StringGrid); end; end; procedure TfrmMultiRename.StringGridTopLeftChanged(Sender: TObject); var I, iRowCount: Integer; begin iRowCount:= StringGrid.TopRow + StringGrid.VisibleRowCount; if iRowCount > FFiles.Count then iRowCount:= FFiles.Count; for I:= StringGrid.TopRow to iRowCount do begin StringGrid.Cells[0, I]:= FFiles[I - 1].Name; StringGrid.Cells[1, I]:= FreshText(I - 1); StringGrid.Cells[2, I]:= FFiles[I - 1].Path; end; end; procedure TfrmMultiRename.cbRegExpChange(Sender: TObject); begin if cbRegExp.Checked then cbUseSubs.Checked:= Boolean(cbUseSubs.Tag) else begin cbUseSubs.Tag:= Integer(cbUseSubs.Checked); cbUseSubs.Checked:= False; end; cbUseSubs.Enabled:= cbRegExp.Checked; StringGridTopLeftChanged(StringGrid); end; procedure TfrmMultiRename.btnLoadPresetClick(Sender: TObject); begin LoadPreset(cbPresets.Text); end; procedure TfrmMultiRename.btnSavePresetClick(Sender: TObject); begin if cbPresets.Text <> '' then begin if FPresets.Find(cbPresets.Text) <> -1 then begin if msgYesNo(Format(rsMsgPresetAlreadyExists, [cbPresets.Text])) = False then Exit; end; SavePreset(cbPresets.Text); if cbPresets.Items.IndexOf(cbPresets.Text) = -1 then cbPresets.Items.Add(cbPresets.Text); end; end; procedure TfrmMultiRename.btnDeletePresetClick(Sender: TObject); var Index: Integer; begin if cbPresets.Text <> '' then begin DeletePreset(cbPresets.Text); Index := cbPresets.Items.IndexOf(cbPresets.Text); if Index <> -1 then cbPresets.Items.Delete(Index); cbPresets.Text := ''; end; end; procedure TfrmMultiRename.edPocChange(Sender: TObject); var c:integer; begin c:=StrToIntDef(edPoc.Text,maxint); if c=MaxInt then with edPoc do //editbox only for numbers begin Text:='1'; SelectAll; end; StringGridTopLeftChanged(StringGrid); end; procedure TfrmMultiRename.edIntervalChange(Sender: TObject); var c:integer; begin c:=StrToIntDef(edInterval.Text,maxint); if c=MaxInt then with edInterval do //editbox only for numbers begin Text:='1'; SelectAll; end; StringGridTopLeftChanged(StringGrid); end; procedure TfrmMultiRename.InsertMask(const Mask:string;edChoose:Tedit); var sTmp: String; I: Integer; begin if edChoose.SelLength > 0 then edChoose.SelText:= Mask // Replace selected text else begin sTmp:= edChoose.Text; I:= edChoose.SelStart + 1; // Insert on current position UTF8Insert(Mask, sTmp, I); Inc(I, UTF8Length(Mask)); edChoose.Text:= sTmp; edChoose.SelStart:= I - 1; end; end; procedure TfrmMultiRename.InsertMask(const Mask:string;editNr:PtrInt); begin if editNr = 0 then InsertMask(Mask, edName) else InsertMask(Mask, edExt); end; procedure TfrmMultiRename.btnRestoreClick(Sender: TObject); begin edName.Text:='[N]'; edName.SelStart:= UTF8Length(edName.Text); edExt.Text:='[E]'; edExt.SelStart:= UTF8Length(edExt.Text); edFind.Text:=''; edReplace.Text:=''; cbRegExp.Checked:=False; cbUseSubs.Checked:=False; cmbNameStyle.ItemIndex:=0; cmbExtensionStyle.ItemIndex:=0; edPoc.Text:='1'; edInterval.Text:='1'; cmbxWidth.ItemIndex:=0; cbLog.Checked:=False; edFile.Enabled:=cbLog.Checked; if (FFiles.Count > 0) then edFile.Text:= FFiles[0].Path + 'default.log' else edFile.Text:= 'default.log'; edFile.SelStart:= UTF8Length(edFile.Text); cbPresets.Text:=''; FLastPreset:=''; end; function TfrmMultiRename.sHandleFormatString(const sFormatStr: string; ItemNr: Integer): string; var aFile: TFile; Counter: Integer; begin Result := ''; if Length(sFormatStr) > 0 then begin aFile := FFiles[ItemNr]; case sFormatStr[1] of 'N': begin Result := sReplaceXX(sFormatStr, aFile.NameNoExt); end; 'E': begin Result := sReplaceXX(sFormatStr, aFile.Extension); end; 'C': begin Counter := StrToIntDef(edPoc.Text, 1) + StrToIntDef(edInterval.Text, 1) * ItemNr; Result := Format('%.' + cmbxWidth.Items[cmbxWidth.ItemIndex] + 'd', [Counter]); end; '=': begin Result := FormatFileFunction(UTF8Copy(sFormatStr, 2, UTF8Length(sFormatStr) - 1), FFiles.Items[ItemNr], FFileSource, True); for Counter := 1 to Length(Result) - 1 do begin if Result[Counter] in ['\', '/', ':', '*', '?', '"', '<', '>', '|'] then Result[Counter] := '.'; end; end; else begin // Assume it is date/time formatting string ([h][n][s][Y][M][D]). with FFiles.Items[ItemNr] do if fpModificationTime in SupportedProperties then try Result := SysToUTF8(FormatDateTime(sFormatStr, ModificationTime)); except Result := sFormatStr; end; end; end; end; end; function TfrmMultiRename.sReplace(sMask: string; ItemNr: Integer): string; var iStart, iEnd: Integer; begin Result := ''; while Length(sMask) > 0 do begin iStart := Pos('[', sMask); if iStart > 0 then begin iEnd := Pos(']', sMask); if iEnd > 0 then begin Result := Result + Copy(sMask, 1, iStart - 1) + sHandleFormatString(Copy(sMask, iStart + 1, iEnd - iStart - 1), ItemNr); Delete(sMask, 1, iEnd); end else Break; end else Break; end; Result := Result + sMask; end; function TfrmMultiRename.sReplaceXX(const sFormatStr, sOrig: string): string; var iFrom, iTo, iSemiColon: Integer; begin if Length(sFormatStr) = 1 then Result := sOrig else begin iSemiColon := Pos(':', sFormatStr); if iSemiColon = 0 then begin iFrom := StrToIntDef(Copy(sFormatStr, 2, MaxInt), 1); iTo := iFrom; end else begin iFrom := StrToIntDef(Copy(sFormatStr, 2, iSemiColon - 2), 1); iTo := StrToIntDef(Copy(sFormatStr, iSemiColon + 1, MaxInt), MaxInt); end; Result := UTF8Copy(sOrig, iFrom, iTo - iFrom + 1); end; end; procedure TfrmMultiRename.btnNameMenuClick(Sender: TObject); begin ppNameMenu.AutoPopup:= False; FillContentFieldMenu(miPlugin, @miPluginClick); ppNameMenu.Popup(gbMaska.Parent.Left+gbMaska.Left+ btnNameMenu.Left,gbMaska.Parent.Top+ gbMaska.Top+btnNameMenu.Top); ppNameMenu.Tag:= 0; end; procedure TfrmMultiRename.btnExtMenuClick(Sender: TObject); begin ppNameMenu.AutoPopup:= False; FillContentFieldMenu(miPlugin, @miPluginClick); ppNameMenu.Popup(gbMaska.Parent.Left+gbMaska.Left+ btnExtMenu.Left,gbMaska.Parent.Top+ gbMaska.Top+btnExtMenu.Top); ppNameMenu.Tag:= 1; end; procedure TfrmMultiRename.NameClick(Sender: TObject); begin InsertMask('[N]',ppNameMenu.Tag); end; procedure TfrmMultiRename.NameXClick(Sender: TObject); var iSelStart, iSelFinish: LongInt; begin if ShowSelectTextRangeDlg(Caption, FFiles[0].NameNoExt, iSelStart, iSelFinish) then begin InsertMask('[N' + IntToStr(iSelStart) + ']', ppNameMenu.Tag); end; end; procedure TfrmMultiRename.NameXXClick(Sender: TObject); var iSelStart, iSelFinish: LongInt; begin if ShowSelectTextRangeDlg(Caption, FFiles[0].NameNoExt, iSelStart, iSelFinish) then begin InsertMask('[N' + IntToStr(iSelStart) + ':' + IntToStr(iSelFinish) + ']', ppNameMenu.Tag); end; end; procedure TfrmMultiRename.ExtensionClick(Sender: TObject); begin InsertMask('[E]',ppNameMenu.Tag); end; procedure TfrmMultiRename.ExtensionXClick(Sender: TObject); var iSelStart, iSelFinish: LongInt; begin if ShowSelectTextRangeDlg(Caption, FFiles[0].Extension, iSelStart, iSelFinish) then begin InsertMask('[E' + IntToStr(iSelStart) + ']', ppNameMenu.Tag); end; end; procedure TfrmMultiRename.ExtensionXXClick(Sender: TObject); var iSelStart, iSelFinish: LongInt; begin if ShowSelectTextRangeDlg(Caption, FFiles[0].Extension, iSelStart, iSelFinish) then begin InsertMask('[E' + IntToStr(iSelStart) + ':' + IntToStr(iSelFinish) + ']', ppNameMenu.Tag); end; end; procedure TfrmMultiRename.miPluginClick(Sender: TObject); var sMask: String; MenuItem: TMenuItem absolute Sender; begin case MenuItem.Tag of 0: begin sMask := '[=DC().' + MenuItem.Hint + '{}]'; end; 1: begin sMask := '[=Plugin(' + MenuItem.Parent.Caption + ').' + MenuItem.Caption + '{}]'; end; 2: begin sMask := '[=Plugin(' + MenuItem.Parent.Parent.Caption + ').' + MenuItem.Parent.Caption + '{' + MenuItem.Caption + '}]'; end; end; InsertMask(sMask, ppNameMenu.Tag); end; procedure TfrmMultiRename.CounterClick(Sender: TObject); begin InsertMask('[C]',ppNameMenu.Tag); end; procedure TfrmMultiRename.cbLogClick(Sender: TObject); begin edFile.Enabled:=not edFile.Enabled; end; procedure TfrmMultiRename.btnRenameClick(Sender: TObject); begin RenameFiles; end; procedure TfrmMultiRename.btnCloseClick(Sender: TObject); begin Close; end; procedure TfrmMultiRename.RenameFiles; var hFile: THandle; c: Integer; sNewName, sResult: UTF8String; begin try if cbLog.Checked then begin if edFile.Text = EmptyStr then edFile.Text:= FFiles[0].Path + 'default.log'; mbForceDirectory(ExtractFileDir(edFile.Text)); if mbFileExists(edFile.Text) then begin hFile:= mbFileOpen(edFile.Text, fmOpenReadWrite); FileTruncate(hFile, 0); end else begin hFile:= mbFileCreate(edFile.Text); end; end; for c:= 0 to FFiles.Count - 1 do begin sResult:= FFiles[c].Name; sNewName:= FreshText(c); if RenameFile(FFileSource, FFiles[c], sNewName, True) = True then begin FFiles[c].Name := sNewName; // Write new name to the file object sResult := 'OK ' + sResult + ' -> ' + sNewName; end else begin sResult := 'FAILED' + sResult + ' -> ' + sNewName; end; if cbLog.Checked then FileWriteLn(hFile, sResult); end; finally if cbLog.Checked then FileClose(hFile); end; StringGridTopLeftChanged(StringGrid); end; function TfrmMultiRename.FirstCharToUppercaseUTF8(InputString: String): String; var FirstChar: String; begin if UTF8Length(InputString) > 0 then begin Result := UTF8LowerCase(InputString); FirstChar := UTF8Copy(Result, 1, 1); UTF8Delete(Result, 1, 1); Result := UTF8UpperCase(FirstChar) + Result; end else Result := ''; end; function TfrmMultiRename.FirstCharOfFirstWordToUppercaseUTF8(InputString: String): String; var SeparatorPos: Integer; begin InputString := UTF8LowerCase(InputString); Result := ''; // Search for first letter. for SeparatorPos := 1 to Length(InputString) do if IsLetter(InputString[SeparatorPos]) then break; Result := Copy(InputString, 1, SeparatorPos - 1) + FirstCharToUppercaseUTF8(Copy(InputString, SeparatorPos, Length(InputString) - SeparatorPos + 1)); end; function TfrmMultiRename.FirstCharOfEveryWordToUppercaseUTF8(InputString: String): String; var SeparatorPos: Integer; begin InputString := UTF8LowerCase(InputString); Result := ''; while InputString <> '' do begin // Search for first non-letter (word separator). for SeparatorPos := 1 to Length(InputString) do if not IsLetter(InputString[SeparatorPos]) then break; Result := Result + FirstCharToUppercaseUTF8(Copy(InputString, 1, SeparatorPos)); Delete(InputString, 1, SeparatorPos); end; end; function TfrmMultiRename.IsLetter(AChar: AnsiChar): Boolean; begin Result := // Ascii letters ( (AChar < #128) and (((AChar >= 'a') and (AChar <= 'z')) or ((AChar >= 'A') and (AChar <= 'Z'))) ) or // maybe Ansi or UTF8 (AChar >= #128); end; function TfrmMultiRename.ApplyStyle(InputString: String; Style: Integer): String; begin case Style of 1: Result := UTF8UpperCase(InputString); 2: Result := UTF8LowerCase(InputString); 3: Result := FirstCharOfFirstWordToUppercaseUTF8(InputString); 4: Result := FirstCharOfEveryWordToUppercaseUTF8(InputString); else Result := InputString; end; end; procedure TfrmMultiRename.LoadPresets; begin if Assigned(gIni) then LoadPresetsIni(gIni) else LoadPresetsXml(gConfig); end; procedure TfrmMultiRename.LoadPresetsIni(IniFile: TIniFileEx); var i: Integer; PresetIndex: Integer; PresetName: String; sPresetNr: String; PresetsCount: Integer; begin ClearPresetsList; FLastPreset := IniFile.ReadString(sPresetsSection, 'LastPreset', ''); PresetsCount := IniFile.ReadInteger(sPresetsSection, 'Presets', -1); for i := 0 to PresetsCount - 1 do begin sPresetNr := 'Preset' + IntToStr(I + 1); PresetName := IniFile.ReadString(sPresetsSection, sPresetNr + 'PresetName', ''); if PresetName <> '' then begin PresetIndex := FPresets.Add(PresetName, New(PMultiRenamePreset)); with PMultiRenamePreset(FPresets.List[PresetIndex]^.Data)^ do begin FileName := IniFile.ReadString(sPresetsSection, sPresetNr + 'Filename', '[N]'); Extension := IniFile.ReadString(sPresetsSection, sPresetNr + 'Extension', '[E]'); FileNameStyle := IniFile.ReadInteger(sPresetsSection, sPresetNr + 'FilenameStyle', 0); ExtensionStyle := IniFile.ReadInteger(sPresetsSection, sPresetNr + 'ExtensionStyle', 0); Find := IniFile.ReadString(sPresetsSection, sPresetNr + 'Find', ''); Replace := IniFile.ReadString(sPresetsSection, sPresetNr + 'Replace', ''); RegExp := IniFile.ReadBool(sPresetsSection, sPresetNr + 'RegExp', False); UseSubs := IniFile.ReadBool(sPresetsSection, sPresetNr + 'UseSubs', False); Counter := IniFile.ReadString(sPresetsSection, sPresetNr + 'Counter', '1'); Interval := IniFile.ReadString(sPresetsSection, sPresetNr + 'Interval', '1'); Width := IniFile.ReadInteger(sPresetsSection, sPresetNr + 'Width', 0); Log := IniFile.ReadBool(sPresetsSection, sPresetNr + 'Log', False); LogFile := IniFile.ReadString(sPresetsSection, sPresetNr + 'LogFile', ''); end; end; end; end; procedure TfrmMultiRename.LoadPresetsXml(AConfig: TXmlConfig); var PresetName: String; APreset: PMultiRenamePreset; ANode: TXmlNode; begin ClearPresetsList; ANode := AConfig.FindNode(AConfig.RootNode, sPresetsSection); FLastPreset := AConfig.GetValue(ANode, 'LastPreset', ''); ANode := AConfig.FindNode(ANode, 'Presets'); if Assigned(ANode) then begin ANode := ANode.FirstChild; while Assigned(ANode) do begin if ANode.CompareName('Preset') = 0 then begin if AConfig.TryGetValue(ANode, 'Name', PresetName) then begin APreset := New(PMultiRenamePreset); FPresets.Add(PresetName, APreset); with APreset^ do begin FileName := AConfig.GetValue(ANode, 'Filename', '[N]'); Extension := AConfig.GetValue(ANode, 'Extension', '[E]'); FileNameStyle := AConfig.GetValue(ANode, 'FilenameStyle', 0); ExtensionStyle := AConfig.GetValue(ANode, 'ExtensionStyle', 0); Find := AConfig.GetValue(ANode, 'Find', ''); Replace := AConfig.GetValue(ANode, 'Replace', ''); RegExp := AConfig.GetValue(ANode, 'RegExp', False); UseSubs := AConfig.GetValue(ANode, 'UseSubs', False); Counter := AConfig.GetValue(ANode, 'Counter', '1'); Interval := AConfig.GetValue(ANode, 'Interval', '1'); Width := AConfig.GetValue(ANode, 'Width', 0); Log := AConfig.GetValue(ANode, 'Log/Enabled', False); LogFile := AConfig.GetValue(ANode, 'Log/File', ''); end; end else DCDebug('Invalid entry in configuration: ' + AConfig.GetPathFromNode(ANode) + '.'); end; ANode := ANode.NextSibling; end; end; end; procedure TfrmMultiRename.SavePresets; begin if Assigned(gIni) then SavePresetsIni(gIni); SavePresetsXml(gConfig); gConfig.Save; end; procedure TfrmMultiRename.SavePresetsIni(IniFile: TIniFileEx); var i: Integer; sPresetNr: String; begin IniFile.EraseSection(sPresetsSection); IniFile.WriteString(sPresetsSection, 'LastPreset', FLastPreset); IniFile.WriteInteger(sPresetsSection, 'Presets', FPresets.Count); for i := 0 to FPresets.Count - 1 do with PMultiRenamePreset(FPresets.List[i]^.Data)^ do begin sPresetNr := 'Preset' + IntToStr(I + 1); IniFile.WriteString(sPresetsSection, sPresetNr + 'PresetName', FPresets.List[i]^.Key); IniFile.WriteString(sPresetsSection, sPresetNr + 'Filename', FileName); IniFile.WriteString(sPresetsSection, sPresetNr + 'Extension', Extension); IniFile.WriteInteger(sPresetsSection, sPresetNr + 'FilenameStyle', FileNameStyle); IniFile.WriteInteger(sPresetsSection, sPresetNr + 'ExtensionStyle', ExtensionStyle); IniFile.WriteString(sPresetsSection, sPresetNr + 'Find', Find); IniFile.WriteString(sPresetsSection, sPresetNr + 'Replace', Replace); IniFile.WriteBool(sPresetsSection, sPresetNr + 'RegExp', RegExp); IniFile.WriteBool(sPresetsSection, sPresetNr + 'UseSubs', UseSubs); IniFile.WriteString(sPresetsSection, sPresetNr + 'Counter', Counter); IniFile.WriteString(sPresetsSection, sPresetNr + 'Interval', Interval); IniFile.WriteInteger(sPresetsSection, sPresetNr + 'Width', Width); IniFile.WriteBool(sPresetsSection, sPresetNr + 'Log', Log); IniFile.WriteString(sPresetsSection, sPresetNr + 'LogFile', LogFile); end; end; procedure TfrmMultiRename.SavePresetsXml(AConfig: TXmlConfig); var i: Integer; ANode, SubNode: TXmlNode; begin ANode := AConfig.FindNode(AConfig.RootNode, sPresetsSection, True); AConfig.ClearNode(ANode); AConfig.SetValue(ANode, 'LastPreset', FLastPreset); ANode := AConfig.FindNode(ANode, 'Presets', True); for i := 0 to FPresets.Count - 1 do begin SubNode := AConfig.AddNode(ANode, 'Preset'); with PMultiRenamePreset(FPresets.List[i]^.Data)^ do begin AConfig.AddValue(SubNode, 'Name', FPresets.List[i]^.Key); AConfig.AddValue(SubNode, 'Filename', FileName); AConfig.AddValue(SubNode, 'Extension', Extension); AConfig.AddValue(SubNode, 'FilenameStyle', FileNameStyle); AConfig.AddValue(SubNode, 'ExtensionStyle', ExtensionStyle); AConfig.AddValue(SubNode, 'Find', Find); AConfig.AddValue(SubNode, 'Replace', Replace); AConfig.AddValue(SubNode, 'RegExp', RegExp); AConfig.AddValue(SubNode, 'UseSubs', UseSubs); AConfig.AddValue(SubNode, 'Counter', Counter); AConfig.AddValue(SubNode, 'Interval', Interval); AConfig.AddValue(SubNode, 'Width', Width); AConfig.SetValue(SubNode, 'Log/Enabled', Log); AConfig.SetValue(SubNode, 'Log/File', LogFile); end; end; end; procedure TfrmMultiRename.LoadPreset(PresetName: String); var PresetIndex: Integer; begin if PresetName <> '' then begin PresetIndex := FPresets.Find(PresetName); if PresetIndex = -1 then PresetIndex := FPresets.Add(PresetName, New(PMultiRenamePreset)); with PMultiRenamePreset(FPresets.List[PresetIndex]^.Data)^ do begin edName.Text := FileName; edExt.Text := Extension; cmbNameStyle.ItemIndex := FileNameStyle; cmbExtensionStyle.ItemIndex := ExtensionStyle; edFind.Text := Find; edReplace.Text := Replace; cbRegExp.Checked := RegExp; cbUseSubs.Checked := UseSubs; edPoc.Text := Counter; edInterval.Text := Interval; cmbxWidth.ItemIndex := Width; cbLog.Checked := Log; edFile.Text := LogFile; end; FLastPreset := PresetName; StringGridTopLeftChanged(StringGrid); end; end; procedure TfrmMultiRename.SavePreset(PresetName: String); var PresetIndex: Integer; begin if PresetName <> '' then begin PresetIndex := FPresets.Find(PresetName); if PresetIndex = -1 then PresetIndex := FPresets.Add(PresetName, New(PMultiRenamePreset)); with PMultiRenamePreset(FPresets.List[PresetIndex]^.Data)^ do begin FileName := edName.Text; Extension := edExt.Text; FileNameStyle := cmbNameStyle.ItemIndex; ExtensionStyle := cmbExtensionStyle.ItemIndex; Find := edFind.Text; Replace := edReplace.Text; RegExp := cbRegExp.Checked; UseSubs := cbUseSubs.Checked; Counter := edPoc.Text; Interval := edInterval.Text; Width := cmbxWidth.ItemIndex; Log := cbLog.Checked; LogFile := edFile.Text; end; FLastPreset := PresetName; SavePresets; end; end; procedure TfrmMultiRename.DeletePreset(PresetName: String); var PresetIndex: Integer; begin if PresetName <> '' then begin PresetIndex := FPresets.Find(PresetName); if PresetIndex <> -1 then begin Dispose(PMultiRenamePreset(FPresets.List[PresetIndex]^.Data)); FPresets.Remove(PresetName); FLastPreset := ''; SavePresets; end; end; end; procedure TfrmMultiRename.FillPresetsList; var i: Integer; PresetName: String; begin cbPresets.Clear; for i := 0 to FPresets.Count - 1 do begin PresetName := FPresets.List[i]^.Key; if cbPresets.Items.IndexOf(PresetName) = -1 then cbPresets.Items.Add(PresetName); end; end; procedure TfrmMultiRename.ClearPresetsList; var i: Integer; begin for i := 0 to FPresets.Count - 1 do Dispose(PMultiRenamePreset(FPresets.List[i]^.Data)); FPresets.Clear; end; // Temporary for switching configuration from INI to XML procedure TfrmMultiRename.PublicSavePresets; begin SavePresetsXml(gConfig); end; end. doublecmd-0.5.8/src/udefaultfilepropertyformatter.pas0000644000175000017500000001431511747211345022215 0ustar alexxalexxunit uDefaultFilePropertyFormatter; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileProperty; type TDefaultFilePropertyFormatter = class(TInterfacedObject, IFilePropertyFormatter) public function FormatFileName(FileProperty: TFileNameProperty): String; function FormatFileSize(FileProperty: TFileSizeProperty): String; function FormatDateTime(FileProperty: TFileDateTimeProperty): String; function FormatModificationDateTime(FileProperty: TFileModificationDateTimeProperty): String; function FormatNtfsAttributes(FileProperty: TNtfsFileAttributesProperty): String; function FormatUnixAttributes(FileProperty: TUnixFileAttributesProperty): String; end; TMaxDetailsFilePropertyFormatter = class(TInterfacedObject, IFilePropertyFormatter) public function FormatFileName(FileProperty: TFileNameProperty): String; function FormatFileSize(FileProperty: TFileSizeProperty): String; function FormatDateTime(FileProperty: TFileDateTimeProperty): String; function FormatModificationDateTime(FileProperty: TFileModificationDateTimeProperty): String; function FormatNtfsAttributes(FileProperty: TNtfsFileAttributesProperty): String; function FormatUnixAttributes(FileProperty: TUnixFileAttributesProperty): String; end; var DefaultFilePropertyFormatter: IFilePropertyFormatter = nil; MaxDetailsFilePropertyFormatter: IFilePropertyFormatter = nil; implementation uses uGlobs, uDCUtils, DCBasicTypes, DCFileAttributes, DCDateTimeUtils; function TDefaultFilePropertyFormatter.FormatFileName( FileProperty: TFileNameProperty): String; begin Result := FileProperty.Value; end; function TDefaultFilePropertyFormatter.FormatFileSize( FileProperty: TFileSizeProperty): String; begin Result := cnvFormatFileSize(FileProperty.Value); end; function TDefaultFilePropertyFormatter.FormatDateTime( FileProperty: TFileDateTimeProperty): String; begin Result := SysUtils.FormatDateTime(gDateTimeFormat, FileProperty.Value); end; function TDefaultFilePropertyFormatter.FormatModificationDateTime( FileProperty: TFileModificationDateTimeProperty): String; begin Result := FormatDateTime(FileProperty); end; function TDefaultFilePropertyFormatter.FormatNtfsAttributes(FileProperty: TNtfsFileAttributesProperty): String; { Format as decimal: begin Result := IntToStr(FileProperty.Value); end; } var iAttr: TFileAttrs; begin iAttr := FileProperty.Value; Result:= '--------'; if (iAttr and FILE_ATTRIBUTE_DIRECTORY ) <> 0 then Result[1] := 'd'; if (iAttr and FILE_ATTRIBUTE_REPARSE_POINT) <> 0 then Result[1] := 'l'; if (iAttr and FILE_ATTRIBUTE_READONLY ) <> 0 then Result[2] := 'r'; if (iAttr and FILE_ATTRIBUTE_ARCHIVE ) <> 0 then Result[3] := 'a'; if (iAttr and FILE_ATTRIBUTE_HIDDEN ) <> 0 then Result[4] := 'h'; if (iAttr and FILE_ATTRIBUTE_SYSTEM ) <> 0 then Result[5] := 's'; // These two are exclusive on NTFS. if (iAttr and FILE_ATTRIBUTE_COMPRESSED ) <> 0 then Result[6] := 'c'; if (iAttr and FILE_ATTRIBUTE_ENCRYPTED ) <> 0 then Result[6] := 'e'; if (iAttr and FILE_ATTRIBUTE_TEMPORARY ) <> 0 then Result[7] := 't'; if (iAttr and FILE_ATTRIBUTE_SPARSE_FILE ) <> 0 then Result[8] := 'p'; end; function TDefaultFilePropertyFormatter.FormatUnixAttributes(FileProperty: TUnixFileAttributesProperty): String; var iAttr: TFileAttrs; begin iAttr := FileProperty.Value; Result:= '----------'; if ((iAttr and S_IFMT) = S_IFDIR) then Result[1] := 'd'; if ((iAttr and S_IFMT) = S_IFLNK) then Result[1] := 'l'; if ((iAttr and S_IFMT) = S_IFSOCK) then Result[1] := 's'; if ((iAttr and S_IFMT) = S_IFIFO) then Result[1] := 'f'; if ((iAttr and S_IFMT) = S_IFBLK) then Result[1] := 'b'; if ((iAttr and S_IFMT) = S_IFCHR) then Result[1] := 'c'; if ((iAttr and S_IRUSR) = S_IRUSR) then Result[2] := 'r'; if ((iAttr and S_IWUSR) = S_IWUSR) then Result[3] := 'w'; if ((iAttr and S_IXUSR) = S_IXUSR) then Result[4] := 'x'; if ((iAttr and S_IRGRP) = S_IRGRP) then Result[5] := 'r'; if ((iAttr and S_IWGRP) = S_IWGRP) then Result[6] := 'w'; if ((iAttr and S_IXGRP) = S_IXGRP) then Result[7] := 'x'; if ((iAttr and S_IROTH) = S_IROTH) then Result[8] := 'r'; if ((iAttr and S_IWOTH) = S_IWOTH) then Result[9] := 'w'; if ((iAttr and S_IXOTH) = S_IXOTH) then Result[10] := 'x'; if ((iAttr and S_ISUID) = S_ISUID) then Result[4] := 's'; if ((iAttr and S_ISGID) = S_ISGID) then Result[7] := 's'; end; // ---------------------------------------------------------------------------- function TMaxDetailsFilePropertyFormatter.FormatFileName( FileProperty: TFileNameProperty): String; begin Result := FileProperty.Value; end; function TMaxDetailsFilePropertyFormatter.FormatFileSize( FileProperty: TFileSizeProperty): String; var d: Double; begin d := FileProperty.Value; Result := Format('%.0n', [d]); end; function TMaxDetailsFilePropertyFormatter.FormatDateTime( FileProperty: TFileDateTimeProperty): String; var Bias: LongInt = 0; Sign: String; begin Bias := -GetTimeZoneBias; if Bias >= 0 then Sign := '+' else Sign := '-'; Result := SysUtils.FormatDateTime('ddd, dd mmmm yyyy hh:nn:ss', FileProperty.Value) + ' UT' + Sign + Format('%.2D%.2D', [Bias div 60, Bias mod 60]); end; function TMaxDetailsFilePropertyFormatter.FormatModificationDateTime( FileProperty: TFileModificationDateTimeProperty): String; begin Result := FormatDateTime(FileProperty); end; function TMaxDetailsFilePropertyFormatter.FormatNtfsAttributes(FileProperty: TNtfsFileAttributesProperty): String; begin Result := DefaultFilePropertyFormatter.FormatNtfsAttributes(FileProperty); end; function TMaxDetailsFilePropertyFormatter.FormatUnixAttributes(FileProperty: TUnixFileAttributesProperty): String; begin Result := DefaultFilePropertyFormatter.FormatUnixAttributes(FileProperty); end; initialization DefaultFilePropertyFormatter := TDefaultFilePropertyFormatter.Create as IFilePropertyFormatter; MaxDetailsFilePropertyFormatter := TMaxDetailsFilePropertyFormatter.Create as IFilePropertyFormatter; finalization DefaultFilePropertyFormatter := nil; // frees the interface MaxDetailsFilePropertyFormatter := nil; end. doublecmd-0.5.8/src/fdiffer.pas0000644000175000017500000007715212162610121015413 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Internal diff and merge tool Copyright (C) 2010-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License in a file called COPYING along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. } unit fDiffer; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Dialogs, Menus, ComCtrls, ActnList, ExtCtrls, EditBtn, Buttons, SynEdit, uSynDiffControls, uPariterControls, uDiff, uFormCommands, uHotkeyManager, uOSForms; type { TfrmDiffer } TfrmDiffer = class(TAloneForm, IFormCommands) actBinaryCompare: TAction; actCopyLeftToRight: TAction; actCopyRightToLeft: TAction; actExit: TAction; actEditCut: TAction; actEditCopy: TAction; actEditDelete: TAction; actEditUndo: TAction; actEditRedo: TAction; actEditSelectAll: TAction; actEditPaste: TAction; actAbout: TAction; actAutoCompare: TAction; actLineDifferences: TAction; actSaveRightAs: TAction; actSaveLeftAs: TAction; actOpenRight: TAction; actOpenLeft: TAction; actReload: TAction; actSaveRight: TAction; actSaveLeft: TAction; actPaintBackground: TAction; actStartCompare: TAction; actFirstDifference: TAction; actIgnoreCase: TAction; actIgnoreWhiteSpace: TAction; actCancelCompare: TAction; actKeepScrolling: TAction; actPrevDifference: TAction; actLastDifference: TAction; actNextDifference: TAction; actSaveAs: TAction; actSave: TAction; ActionList: TActionList; edtFileNameLeft: TFileNameEdit; edtFileNameRight: TFileNameEdit; ImageList: TImageList; MainMenu: TMainMenu; miAutoCompare: TMenuItem; miDivider10: TMenuItem; miLineDifferences: TMenuItem; miEncodingRight: TMenuItem; miEncodingLeft: TMenuItem; miAbout: TMenuItem; mnuEncoding: TMenuItem; miSaveRightAs: TMenuItem; miSaveLeftAs: TMenuItem; miCopyContext: TMenuItem; miCutContext: TMenuItem; miDeleteContext: TMenuItem; miEditSelectAll: TMenuItem; miDivider9: TMenuItem; miEditDelete: TMenuItem; miEditPaste: TMenuItem; miEditCopy: TMenuItem; miEditCut: TMenuItem; miDivider8: TMenuItem; miEditRedo: TMenuItem; miEditUndo: TMenuItem; miDivider7: TMenuItem; miPasteContext: TMenuItem; miReload: TMenuItem; miDivider6: TMenuItem; miExit: TMenuItem; miSaveRight: TMenuItem; miOpenRight: TMenuItem; miOpenLeft: TMenuItem; miCopyRightToLeft: TMenuItem; miCopyLeftToRight: TMenuItem; miDivider5: TMenuItem; miPaintBackground: TMenuItem; miDivider4: TMenuItem; miBinaryCompare: TMenuItem; miKeepScrolling: TMenuItem; miDivider3: TMenuItem; miLastDiff: TMenuItem; miFirstDiff: TMenuItem; miDivider2: TMenuItem; miPrevDiff: TMenuItem; miNextDiff: TMenuItem; miDivider1: TMenuItem; miCancelCompare: TMenuItem; miSelectAllContext: TMenuItem; miSeparator1: TMenuItem; miSeparator2: TMenuItem; miStartCompare: TMenuItem; miUndoContext: TMenuItem; mnuActions: TMenuItem; miIgnoreCase: TMenuItem; miIgnoreWhiteSpace: TMenuItem; mnuOptions: TMenuItem; mnuEdit: TMenuItem; miSaveLeft: TMenuItem; mnuFile: TMenuItem; ContextMenu: TPopupMenu; pnlLeftBox: TPanel; pnlRight: TPanel; pnlLeft: TPanel; pnlRightBox: TPanel; btnLeftEncoding: TSpeedButton; btnRightEncoding: TSpeedButton; btnLeftSave: TSpeedButton; btnLeftSaveAs: TSpeedButton; btnRightSave: TSpeedButton; btnRightSaveAs: TSpeedButton; pmEncodingLeft: TPopupMenu; pmEncodingRight: TPopupMenu; Splitter: TSplitter; StatusBar: TStatusBar; ToolBar: TToolBar; btnSave: TToolButton; btnSaveAs: TToolButton; Divider1: TToolButton; btnCompare: TToolButton; btnLast: TToolButton; btnNext: TToolButton; btnPrev: TToolButton; btnFirst: TToolButton; Divider2: TToolButton; Divider3: TToolButton; btnCancelCompare: TToolButton; Divider4: TToolButton; btnReload: TToolButton; btnCopyRightToLeft: TToolButton; btnCopyLeftToRight: TToolButton; Divider5: TToolButton; procedure actAboutExecute(Sender: TObject); procedure actBinaryCompareExecute(Sender: TObject); procedure actCancelCompareExecute(Sender: TObject); procedure actExecute(Sender: TObject); procedure actEditCopyExecute(Sender: TObject); procedure actEditCutExecute(Sender: TObject); procedure actEditDeleteExecute(Sender: TObject); procedure actEditPasteExecute(Sender: TObject); procedure actEditRedoExecute(Sender: TObject); procedure actEditSelectAllExecute(Sender: TObject); procedure actEditUndoExecute(Sender: TObject); procedure actIgnoreCaseExecute(Sender: TObject); procedure actLineDifferencesExecute(Sender: TObject); procedure actOpenLeftExecute(Sender: TObject); procedure actOpenRightExecute(Sender: TObject); procedure actPaintBackgroundExecute(Sender: TObject); procedure actSaveAsExecute(Sender: TObject); procedure actSaveExecute(Sender: TObject); procedure actSaveLeftAsExecute(Sender: TObject); procedure actSaveRightAsExecute(Sender: TObject); procedure actStartCompareExecute(Sender: TObject); procedure actKeepScrollingExecute(Sender: TObject); procedure btnLeftEncodingClick(Sender: TObject); procedure btnRightEncodingClick(Sender: TObject); procedure edtFileNameLeftAcceptFileName(Sender: TObject; var Value: String); procedure edtFileNameRightAcceptFileName(Sender: TObject; var Value: String); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormResize(Sender: TObject); private Diff: TDiff; SynDiffEditActive: TSynDiffEdit; SynDiffEditLeft: TSynDiffEdit; SynDiffEditRight: TSynDiffEdit; SynDiffHighlighterLeft, SynDiffHighlighterRight: TSynDiffHighlighter; HashListLeft, HashListRight: TList; EncodingList: TStringList; ScrollLock: LongInt; FCommands: TFormCommands; procedure Clear(bLeft, bRight: Boolean); procedure BuildHashList(bLeft, bRight: Boolean); procedure ChooseEncoding(SynDiffEdit: TSynDiffEdit); procedure ChooseEncoding(MenuItem: TMenuItem; Encoding: String); procedure FillEncodingMenu(TheOwner: TMenuItem; MenuHandler: TNotifyEvent; GroupIndex: LongInt); procedure LoadFromFile(SynDiffEdit: TSynDiffEdit; const FileName: UTF8String); procedure SaveToFile(SynDiffEdit: TSynDiffEdit; const FileName: UTF8String); procedure OpenFileLeft(const FileName: UTF8String); procedure OpenFileRight(const FileName: UTF8String); procedure SetEncodingLeft(Sender: TObject); procedure SetEncodingRight(Sender: TObject); procedure SynDiffEditEnter(Sender: TObject); procedure SynDiffEditLeftStatusChange(Sender: TObject; Changes: TSynStatusChanges); procedure SynDiffEditRightStatusChange(Sender: TObject; Changes: TSynStatusChanges); property Commands: TFormCommands read FCommands{$IF FPC_FULLVERSION >= 020501} implements IFormCommands{$ENDIF}; public constructor Create(TheOwner: TComponent); override; destructor Destroy; override; {$IF FPC_FULLVERSION < 020501} // "implements" does not work in FPC < 2.5.1 function ExecuteCommand(Command: string; const Params: array of string): TCommandFuncResult; function GetCommandCaption(Command: String; CaptionType: TCommandCaptionType): String; procedure GetCommandsList(List: TStrings); {$ENDIF} published procedure cm_CopyLeftToRight(const Params: array of string); procedure cm_CopyRightToLeft(const Params: array of string); procedure cm_Exit(const Params: array of string); procedure cm_FirstDifference(const Params: array of string); procedure cm_LastDifference(const Params: array of string); procedure cm_NextDifference(const Params: array of string); procedure cm_PrevDifference(const Params: array of string); procedure cm_Reload(const Params: array of string); procedure cm_SaveLeft(const Params: array of string); procedure cm_SaveRight(const Params: array of string); end; procedure ShowDiffer(const FileNameLeft, FileNameRight: UTF8String); implementation {$R *.lfm} uses LCLType, LCLProc, LConvEncoding, SynEditTypes, uHash, uLng, uGlobs, uShowMsg, uBinaryCompare, DCClassesUtf8, dmCommonData, DCOSUtils; const HotkeysCategory = 'Differ'; procedure ShowDiffer(const FileNameLeft, FileNameRight: UTF8String); begin with TfrmDiffer.Create(Application) do begin edtFileNameLeft.Text:= FileNameLeft; edtFileNameRight.Text:= FileNameRight; actBinaryCompare.Checked:= not (FileIsText(FileNameLeft) or FileIsText(FileNameRight)); if not actBinaryCompare.Checked then begin OpenFileLeft(FileNameLeft); OpenFileRight(FileNameRight); if actAutoCompare.Checked then actStartCompare.Execute; end; ShowOnTop; end; end; { TfrmDiffer } procedure TfrmDiffer.actStartCompareExecute(Sender: TObject); var I, DiffCount: Integer; LineNumberLeft, LineNumberRight: PtrInt; begin try Inc(ScrollLock); Screen.Cursor := crHourGlass; if actBinaryCompare.Checked then begin SynDiffEditLeft.BeginCompare(nil); SynDiffEditRight.BeginCompare(nil); DiffCount := BinaryCompare(edtFileNameLeft.Text, edtFileNameRight.Text, SynDiffEditLeft.Lines, SynDiffEditRight.Lines); end else begin if (HashListLeft.Count = 0) or (HashListRight.Count = 0) then Exit; actCancelCompare.Enabled := True; //nb: TList.list is a pointer to the bottom of the list's integer array Diff.Execute( PInteger(HashListLeft.List), PInteger(HashListRight.List), HashListLeft.Count, HashListRight.Count ); if Diff.Cancelled then Exit; SynDiffEditLeft.BeginCompare(Diff); SynDiffEditRight.BeginCompare(Diff); for I := 0 to Diff.Count - 1 do with Diff.Compares[I] do begin LineNumberLeft:= oldIndex1 + 1; LineNumberRight:= oldIndex2 + 1; case Kind of ckAdd: begin SynDiffEditLeft.InsertFakeLine(I, lkFakeAdd); SynDiffEditRight.LineNumber[I]:= LineNumberRight; end; ckDelete: begin SynDiffEditLeft.LineNumber[I]:= LineNumberLeft; SynDiffEditRight.InsertFakeLine(I, lkFakeDelete); end; else begin SynDiffEditLeft.LineNumber[I]:= LineNumberLeft; SynDiffEditRight.LineNumber[I]:= LineNumberRight; end; end; end; DiffCount:= Diff.Count; with Diff.DiffStats do begin StatusBar.Panels[0].Text := ' Matches: ' + IntToStr(matches); StatusBar.Panels[1].Text := ' Modifies: ' + IntToStr(modifies); StatusBar.Panels[2].Text := ' Adds: ' + IntToStr(adds); StatusBar.Panels[3].Text := ' Deletes: ' + IntToStr(deletes); end; end; finally SynDiffEditLeft.EndCompare(DiffCount); SynDiffEditRight.EndCompare(DiffCount); SynDiffEditLeft.Invalidate; SynDiffEditRight.Invalidate; Screen.Cursor := crDefault; actCancelCompare.Enabled := False; Dec(ScrollLock); end; if actLineDifferences.Checked then begin SynDiffEditLeft.Highlighter:= SynDiffHighlighterLeft; SynDiffEditRight.Highlighter:= SynDiffHighlighterRight; end; //mnuEdit.Enabled := true; end; procedure TfrmDiffer.actOpenLeftExecute(Sender: TObject); begin dmComData.OpenDialog.FileName:= edtFileNameLeft.Text; dmComData.OpenDialog.Filter:= AllFilesMask; if dmComData.OpenDialog.Execute then begin edtFileNameLeft.Text:= dmComData.OpenDialog.FileName; actReload.Execute; end; end; procedure TfrmDiffer.actOpenRightExecute(Sender: TObject); begin dmComData.OpenDialog.FileName:= edtFileNameRight.Text; dmComData.OpenDialog.Filter:= AllFilesMask; if dmComData.OpenDialog.Execute then begin edtFileNameRight.Text:= dmComData.OpenDialog.FileName; actReload.Execute; end; end; procedure TfrmDiffer.actPaintBackgroundExecute(Sender: TObject); begin if actPaintBackground.Checked then begin SynDiffEditLeft.PaintStyle:= psBackground; SynDiffEditRight.PaintStyle:= psBackground; end else begin SynDiffEditLeft.PaintStyle:= psForeground; SynDiffEditRight.PaintStyle:= psForeground; end; SynDiffHighlighterLeft.UpdateColors; SynDiffHighlighterRight.UpdateColors; end; procedure TfrmDiffer.actSaveAsExecute(Sender: TObject); begin if SynDiffEditActive = SynDiffEditLeft then actSaveLeftAs.Execute else if SynDiffEditActive = SynDiffEditRight then actSaveRightAs.Execute; end; procedure TfrmDiffer.actSaveExecute(Sender: TObject); begin if SynDiffEditActive = SynDiffEditLeft then actSaveLeft.Execute else if SynDiffEditActive = SynDiffEditRight then actSaveRight.Execute; end; procedure TfrmDiffer.actSaveLeftAsExecute(Sender: TObject); begin dmComData.SaveDialog.FileName:= edtFileNameLeft.FileName; if dmComData.SaveDialog.Execute then begin SaveToFile(SynDiffEditLeft, dmComData.SaveDialog.FileName); edtFileNameLeft.FileName:= dmComData.SaveDialog.FileName; end; end; procedure TfrmDiffer.actSaveRightAsExecute(Sender: TObject); begin dmComData.SaveDialog.FileName:= edtFileNameRight.FileName; if dmComData.SaveDialog.Execute then begin SaveToFile(SynDiffEditLeft, dmComData.SaveDialog.FileName); edtFileNameRight.FileName:= dmComData.SaveDialog.FileName; end; end; procedure TfrmDiffer.actBinaryCompareExecute(Sender: TObject); begin mnuEdit.Enabled:= not actBinaryCompare.Checked; mnuEncoding.Enabled:= not actBinaryCompare.Checked; btnLeftEncoding.Enabled:= not actBinaryCompare.Checked; btnRightEncoding.Enabled:= not actBinaryCompare.Checked; SynDiffEditLeft.ReadOnly:= actBinaryCompare.Checked; SynDiffEditRight.ReadOnly:= actBinaryCompare.Checked; actCopyLeftToRight.Enabled:= not actBinaryCompare.Checked; actCopyRightToLeft.Enabled:= not actBinaryCompare.Checked; actSave.Enabled:= not actBinaryCompare.Checked; actSaveAs.Enabled:= not actBinaryCompare.Checked; actSaveLeft.Enabled:= not actBinaryCompare.Checked; actSaveLeftAs.Enabled:= not actBinaryCompare.Checked; actSaveRight.Enabled:= not actBinaryCompare.Checked; actSaveRightAs.Enabled:= not actBinaryCompare.Checked; actIgnoreCase.Enabled:= not actBinaryCompare.Checked; actIgnoreWhiteSpace.Enabled:= not actBinaryCompare.Checked; actLineDifferences.Enabled:= not actBinaryCompare.Checked; if actBinaryCompare.Checked then begin SynDiffEditLeft.Lines.Clear; SynDiffEditRight.Lines.Clear; end else begin OpenFileLeft(edtFileNameLeft.Text); OpenFileRight(edtFileNameRight.Text); end; if actAutoCompare.Checked then actStartCompare.Execute; end; procedure TfrmDiffer.actCancelCompareExecute(Sender: TObject); begin Diff.Cancel; end; procedure TfrmDiffer.actAboutExecute(Sender: TObject); begin ShowMessage('Internal Differ tool of Double Commander.' + LineEnding + LineEnding + 'It is inspired by Flavio Etrusco''s Pariter tool.' + LineEnding + 'You can find it on: http://sourceforge.net/projects/pariter/' + LineEnding + 'It is based on Angus Johnson''s excellent TDiff component.' + LineEnding + 'You can find it on: http://www.users.on.net/johnson/delphi/'); end; procedure TfrmDiffer.actEditCopyExecute(Sender: TObject); begin SynDiffEditActive.CopyToClipboard; end; procedure TfrmDiffer.actEditCutExecute(Sender: TObject); begin SynDiffEditActive.CutToClipboard; end; procedure TfrmDiffer.actEditDeleteExecute(Sender: TObject); begin SynDiffEditActive.ClearSelection; end; procedure TfrmDiffer.actEditPasteExecute(Sender: TObject); begin SynDiffEditActive.PasteFromClipboard; end; procedure TfrmDiffer.actEditRedoExecute(Sender: TObject); begin SynDiffEditActive.Redo; end; procedure TfrmDiffer.actEditSelectAllExecute(Sender: TObject); begin SynDiffEditActive.SelectAll; end; procedure TfrmDiffer.actEditUndoExecute(Sender: TObject); begin SynDiffEditActive.Undo; end; procedure TfrmDiffer.actExecute(Sender: TObject); var cmd: string; begin cmd := (Sender as TAction).Name; cmd := 'cm_' + Copy(cmd, 4, Length(cmd) - 3); Commands.ExecuteCommand(cmd, []); end; procedure TfrmDiffer.actIgnoreCaseExecute(Sender: TObject); begin if actAutoCompare.Checked then actStartCompare.Execute; end; procedure TfrmDiffer.actLineDifferencesExecute(Sender: TObject); begin if actLineDifferences.Checked and (Diff.Count <> 0) then begin SynDiffEditLeft.Highlighter:= SynDiffHighlighterLeft; SynDiffEditRight.Highlighter:= SynDiffHighlighterRight; end else begin SynDiffEditLeft.Highlighter:= nil; SynDiffEditRight.Highlighter:= nil; end; SynDiffEditLeft.Repaint; SynDiffEditRight.Repaint; end; procedure TfrmDiffer.actKeepScrollingExecute(Sender: TObject); begin end; procedure TfrmDiffer.btnLeftEncodingClick(Sender: TObject); begin pmEncodingLeft.PopUp(Mouse.CursorPos.X, Mouse.CursorPos.Y); end; procedure TfrmDiffer.btnRightEncodingClick(Sender: TObject); begin pmEncodingRight.PopUp(Mouse.CursorPos.X, Mouse.CursorPos.Y); end; procedure TfrmDiffer.edtFileNameLeftAcceptFileName(Sender: TObject; var Value: String); begin OpenFileLeft(Value); end; procedure TfrmDiffer.edtFileNameRightAcceptFileName(Sender: TObject; var Value: String); begin OpenFileRight(Value); end; procedure TfrmDiffer.FormCreate(Sender: TObject); begin ScrollLock:= 0; Diff:= TDiff.Create(Self); SynDiffEditLeft:= TSynDiffEdit.Create(Self); SynDiffEditRight:= TSynDiffEdit.Create(Self); SynDiffHighlighterLeft:= TSynDiffHighlighter.Create(SynDiffEditLeft); SynDiffHighlighterRight:= TSynDiffHighlighter.Create(SynDiffEditRight); HashListLeft:= TList.Create; HashListRight:= TList.Create; SynDiffEditLeft.Parent:= pnlLeft; SynDiffEditRight.Parent:= pnlRight; SynDiffEditLeft.Align:= alClient; SynDiffEditRight.Align:= alClient; SynDiffEditLeft.PopupMenu:= ContextMenu; SynDiffEditRight.PopupMenu:= ContextMenu; SynDiffEditLeft.ModifiedFile:= SynDiffEditRight; SynDiffEditRight.OriginalFile:= SynDiffEditLeft; SynDiffEditLeft.OnEnter:= @SynDiffEditEnter; SynDiffEditRight.OnEnter:= @SynDiffEditEnter; SynDiffEditLeft.OnStatusChange:= @SynDiffEditLeftStatusChange; SynDiffEditRight.OnStatusChange:= @SynDiffEditRightStatusChange; // Set active editor SynDiffEditActive:= SynDiffEditLeft; // Initialize property storage InitPropStorage(Self); // Fill encoding menu EncodingList:= TStringList.Create; GetSupportedEncodings(EncodingList); FillEncodingMenu(miEncodingLeft, @SetEncodingLeft, 1); FillEncodingMenu(miEncodingRight, @SetEncodingRight, 2); FillEncodingMenu(pmEncodingLeft.Items, @SetEncodingLeft, 1); FillEncodingMenu(pmEncodingRight.Items, @SetEncodingRight, 2); EncodingList.Free; end; procedure TfrmDiffer.FormDestroy(Sender: TObject); begin FreeThenNil(Diff); FreeThenNil(HashListLeft); FreeThenNil(HashListRight); end; procedure TfrmDiffer.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_ESCAPE then begin Key:= 0; Close; end; end; procedure TfrmDiffer.FormResize(Sender: TObject); begin pnlLeft.Width:= (ClientWidth div 2) - (Splitter.Width div 2); end; procedure TfrmDiffer.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin CloseAction:= caFree; end; procedure TfrmDiffer.Clear(bLeft, bRight: Boolean); begin if bLeft then begin SynDiffEditLeft.Lines.Clear; HashListLeft.Clear; end; if bRight then begin SynDiffEditRight.Lines.Clear; HashListRight.Clear; end; Diff.Clear; StatusBar.Panels[0].Text := EmptyStr; StatusBar.Panels[1].Text := EmptyStr; StatusBar.Panels[2].Text := EmptyStr; StatusBar.Panels[3].Text := EmptyStr; actStartCompare.Enabled := True; end; procedure TfrmDiffer.cm_CopyLeftToRight(const Params: array of string); var I, iStart, iFinish: Integer; begin I := SynDiffEditLeft.CaretY - 1; iStart:= SynDiffEditLeft.DiffBegin(I); iFinish:= SynDiffEditLeft.DiffEnd(I); for I:= iStart to iFinish do SynDiffEditRight.Lines[I]:= SynDiffEditLeft.Lines[I]; end; procedure TfrmDiffer.cm_CopyRightToLeft(const Params: array of string); var I, iStart, iFinish: Integer; begin I := SynDiffEditRight.CaretY - 1; iStart:= SynDiffEditRight.DiffBegin(I); iFinish:= SynDiffEditRight.DiffEnd(I); for I:= iStart to iFinish do SynDiffEditLeft.Lines[I]:= SynDiffEditRight.Lines[I]; end; procedure TfrmDiffer.cm_Exit(const Params: array of string); begin Close; end; procedure TfrmDiffer.cm_FirstDifference(const Params: array of string); var Line: Integer; Kind: TChangeKind; begin // Start at first line Line := 0; if Line = SynDiffEditLeft.Lines.Count then Exit; // Skip unmodified lines Kind := ckNone; while (Line < SynDiffEditLeft.Lines.Count - 1) and (SynDiffEditLeft.DiffKind[Line] = Kind) do Inc(Line); Inc(Line); SynDiffEditLeft.CaretY := Line; SynDiffEditLeft.TopLine := Line; if not actKeepScrolling.Checked then begin SynDiffEditRight.TopLine := Line; SynDiffEditRight.CaretY := Line; end; end; procedure TfrmDiffer.cm_LastDifference(const Params: array of string); var Line: Integer; Kind: TChangeKind; begin Line := SynDiffEditLeft.Lines.Count - 1; if Line = 0 then Exit; // Skip unmodified lines Kind := ckNone; while (Line > 0) and (SynDiffEditLeft.DiffKind[Line] = Kind) do Dec(Line); // Find top line of previous difference Kind:= SynDiffEditLeft.DiffKind[Line]; while (Line > 0) and (SynDiffEditLeft.DiffKind[Line] = Kind) do Dec(Line); if (Line <> 0) then Inc(Line, 2); SynDiffEditLeft.CaretY := Line; SynDiffEditLeft.TopLine := Line; if not actKeepScrolling.Checked then begin SynDiffEditRight.TopLine := Line; SynDiffEditRight.CaretY := Line; end; end; procedure TfrmDiffer.cm_NextDifference(const Params: array of string); var Line: Integer; Kind: TChangeKind; begin Line := SynDiffEditLeft.CaretY - 1; if Line = SynDiffEditLeft.Lines.Count - 1 then Exit; // Skip lines with current difference type Kind := SynDiffEditLeft.DiffKind[Line]; while (Line < SynDiffEditLeft.Lines.Count - 1) and (SynDiffEditLeft.DiffKind[Line] = Kind) do Inc(Line); if SynDiffEditLeft.DiffKind[Line] = ckNone then begin // Skip unmodified lines Kind := ckNone; while (Line < SynDiffEditLeft.Lines.Count - 1) and (SynDiffEditLeft.DiffKind[Line] = Kind) do Inc(Line); end; Inc(Line); SynDiffEditLeft.CaretY := Line; SynDiffEditLeft.TopLine := Line; if not actKeepScrolling.Checked then begin SynDiffEditRight.TopLine := Line; SynDiffEditRight.CaretY := Line; end; end; procedure TfrmDiffer.cm_PrevDifference(const Params: array of string); var Line: Integer; Kind: TChangeKind; begin Line := SynDiffEditLeft.CaretY - 1; if Line = 0 then Exit; // Skip lines with current difference type Kind := SynDiffEditLeft.DiffKind[Line]; while (Line > 0) and (SynDiffEditLeft.DiffKind[Line] = Kind) do Dec(Line); if SynDiffEditLeft.DiffKind[Line] = ckNone then begin // Skip unmodified lines Kind := ckNone; while (Line > 0) and (SynDiffEditLeft.DiffKind[Line] = Kind) do Dec(Line); end; // Find top line of previous difference Kind:= SynDiffEditLeft.DiffKind[Line]; while (Line > 0) and (SynDiffEditLeft.DiffKind[Line] = Kind) do Dec(Line); if (Line <> 0) then Inc(Line, 2); SynDiffEditLeft.CaretY := Line; SynDiffEditLeft.TopLine := Line; if not actKeepScrolling.Checked then begin SynDiffEditRight.TopLine := Line; SynDiffEditRight.CaretY := Line; end; end; procedure TfrmDiffer.cm_Reload(const Params: array of string); begin OpenFileLeft(edtFileNameLeft.FileName); OpenFileRight(edtFileNameRight.FileName); if actAutoCompare.Checked then actStartCompare.Execute; end; procedure TfrmDiffer.cm_SaveLeft(const Params: array of string); begin SaveToFile(SynDiffEditLeft, edtFileNameLeft.FileName); end; procedure TfrmDiffer.cm_SaveRight(const Params: array of string); begin SaveToFile(SynDiffEditRight, edtFileNameRight.FileName); end; constructor TfrmDiffer.Create(TheOwner: TComponent); var HMForm: THMForm; begin inherited Create(TheOwner); FCommands := TFormCommands.Create(Self, actionList); HMForm := HotMan.Register(Self, HotkeysCategory); HMForm.RegisterActionList(actionList); end; destructor TfrmDiffer.Destroy; begin HotMan.UnRegister(Self); inherited Destroy; end; procedure TfrmDiffer.BuildHashList(bLeft, bRight: Boolean); var I: Integer; begin if bLeft then begin HashListLeft.Clear; for I := 0 to SynDiffEditLeft.Lines.Count - 1 do HashListLeft.Add(HashString(SynDiffEditLeft.Lines[i], actIgnoreCase.Checked, actIgnoreWhiteSpace.Checked)); end; if bRight then begin HashListRight.Clear; for I := 0 to SynDiffEditRight.Lines.Count - 1 do HashListRight.Add(HashString(SynDiffEditRight.Lines[i], actIgnoreCase.Checked, actIgnoreWhiteSpace.Checked)); end; actStartCompare.Enabled := (HashListLeft.Count > 0) and (HashListRight.Count > 0); end; procedure TfrmDiffer.ChooseEncoding(SynDiffEdit: TSynDiffEdit); begin if SynDiffEdit = SynDiffEditLeft then begin ChooseEncoding(miEncodingLeft, SynDiffEdit.Encoding); ChooseEncoding(pmEncodingLeft.Items, SynDiffEdit.Encoding); end else begin ChooseEncoding(miEncodingRight, SynDiffEdit.Encoding); ChooseEncoding(pmEncodingRight.Items, SynDiffEdit.Encoding); end; end; procedure TfrmDiffer.ChooseEncoding(MenuItem: TMenuItem; Encoding: String); var I: Integer; begin Encoding:= NormalizeEncoding(Encoding); for I:= 0 to MenuItem.Count - 1 do if SameText(NormalizeEncoding(MenuItem.Items[I].Caption), Encoding) then MenuItem.Items[I].Checked:= True; end; procedure TfrmDiffer.FillEncodingMenu(TheOwner: TMenuItem; MenuHandler: TNotifyEvent; GroupIndex: LongInt); var I: Integer; mi: TMenuItem; begin for I:= 0 to EncodingList.Count - 1 do begin mi:= TMenuItem.Create(TheOwner); mi.Caption:= EncodingList[I]; mi.RadioItem:= True; mi.GroupIndex:= GroupIndex; mi.OnClick:= MenuHandler; TheOwner.Add(mi); end; end; procedure TfrmDiffer.LoadFromFile(SynDiffEdit: TSynDiffEdit; const FileName: UTF8String); var fsFileStream: TFileStreamEx = nil; begin try try fsFileStream:= TFileStreamEx.Create(FileName, fmOpenRead or fmShareDenyNone); SynDiffEdit.Lines.LoadFromStream(fsFileStream); if Length(SynDiffEdit.Encoding) = 0 then begin SynDiffEdit.Encoding:= GuessEncoding(SynDiffEdit.Lines.Text); ChooseEncoding(SynDiffEdit); end; SynDiffEdit.Lines.Text:= ConvertEncoding(SynDiffEdit.Lines.Text, SynDiffEdit.Encoding, EncodingUTF8); except on EFOpenError do begin msgError(rsMsgErrEOpen + ': ' + FileName); end; on EReadError do begin msgError(rsMsgErrERead + ': ' + FileName); end; end; finally FreeThenNil(fsFileStream); end; end; procedure TfrmDiffer.SaveToFile(SynDiffEdit: TSynDiffEdit; const FileName: UTF8String); var slStringList: TStringListEx; begin slStringList:= TStringListEx.Create; try slStringList.Assign(SynDiffEdit.Lines); // remove fake lines SynDiffEdit.RemoveFakeLines(slStringList); // restore encoding slStringList.Text:= ConvertEncoding(slStringList.Text, EncodingUTF8, SynDiffEdit.Encoding); try // save to file slStringList.SaveToFile(FileName); SynDiffEdit.Modified:= False; // needed for the undo stack except on EFCreateError do begin msgError(rsMsgErrECreate + ': ' + FileName); end; on EFOpenError do begin msgError(rsMsgErrEOpen + ': ' + FileName); end; on EWriteError do begin msgError(rsMsgErrEWrite + ': ' + FileName); end; end; finally slStringList.Free; end; end; procedure TfrmDiffer.OpenFileLeft(const FileName: UTF8String); begin if not mbFileExists(FileName) then Exit; try Clear(True, False); LoadFromFile(SynDiffEditLeft, FileName); HashListLeft.Capacity := SynDiffEditLeft.Lines.Count; BuildHashList(True, False); SynDiffEditLeft.Repaint; except on EFOpenError do msgWarning(rsMsgErrEOpen + ' ' + FileName); end; end; procedure TfrmDiffer.OpenFileRight(const FileName: UTF8String); begin if not mbFileExists(FileName) then Exit; try Clear(False, True); LoadFromFile(SynDiffEditRight, FileName); HashListRight.Capacity := SynDiffEditRight.Lines.Count; BuildHashList(False, True); SynDiffEditRight.Repaint; except on EFOpenError do msgWarning(rsMsgErrEOpen + ' ' + FileName); end; end; procedure TfrmDiffer.SetEncodingLeft(Sender: TObject); begin SynDiffEditLeft.Encoding:= (Sender as TMenuItem).Caption; ChooseEncoding(miEncodingLeft, SynDiffEditLeft.Encoding); ChooseEncoding(pmEncodingLeft.Items, SynDiffEditLeft.Encoding); actReload.Execute; end; procedure TfrmDiffer.SetEncodingRight(Sender: TObject); begin SynDiffEditRight.Encoding:= (Sender as TMenuItem).Caption; ChooseEncoding(miEncodingRight, SynDiffEditRight.Encoding); ChooseEncoding(pmEncodingRight.Items, SynDiffEditRight.Encoding); actReload.Execute; end; procedure TfrmDiffer.SynDiffEditEnter(Sender: TObject); begin SynDiffEditActive:= (Sender as TSynDiffEdit); end; procedure TfrmDiffer.SynDiffEditLeftStatusChange(Sender: TObject; Changes: TSynStatusChanges); begin if (actKeepScrolling.Checked) and (ScrollLock = 0) and ((scTopLine in Changes) or (scLeftChar in Changes)) then try Inc(ScrollLock); while (SynDiffEditRight.PaintLock <> 0) do Sleep(1); SynDiffEditRight.TopLine:= SynDiffEditLeft.TopLine; SynDiffEditRight.LeftChar:= SynDiffEditLeft.LeftChar; finally Dec(ScrollLock); end; end; procedure TfrmDiffer.SynDiffEditRightStatusChange(Sender: TObject; Changes: TSynStatusChanges); begin if (actKeepScrolling.Checked) and (ScrollLock = 0) and ((scTopLine in Changes) or (scLeftChar in Changes)) then try Inc(ScrollLock); while (SynDiffEditLeft.PaintLock <> 0) do Sleep(1); SynDiffEditLeft.TopLine:= SynDiffEditRight.TopLine; SynDiffEditLeft.LeftChar:= SynDiffEditRight.LeftChar; finally Dec(ScrollLock); end; end; {$IF FPC_FULLVERSION < 020501} function TfrmDiffer.ExecuteCommand(Command: string; const Params: array of string): TCommandFuncResult; begin Result := FCommands.ExecuteCommand(Command, Params); end; function TfrmDiffer.GetCommandCaption(Command: String; CaptionType: TCommandCaptionType): String; begin Result := FCommands.GetCommandCaption(Command, CaptionType); end; procedure TfrmDiffer.GetCommandsList(List: TStrings); begin FCommands.GetCommandsList(List); end; {$ENDIF} initialization TFormCommands.RegisterCommandsForm(TfrmDiffer, HotkeysCategory, @rsHotkeyCategoryDiffer); end. doublecmd-0.5.8/src/fhotdir.lrt0000644000175000017500000000036712023046500015455 0ustar alexxalexxTFRMHOTDIR.CAPTION=Directory Hotlist TFRMHOTDIR.BTNOK.CAPTION=&OK TFRMHOTDIR.BTNCANCEL.CAPTION=&Cancel TFRMHOTDIR.BTNADD.CAPTION=&Add TFRMHOTDIR.BTNDELETE.CAPTION=&Delete TFRMHOTDIR.BTNADDMAN.CAPTION=Add &manually TFRMHOTDIR.BTNEDIT.CAPTION=&Edit doublecmd-0.5.8/src/ufindfiles.pas0000644000175000017500000003143212141710020016121 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Structures and functions for searching files. Copyright (C) 2003-2004 Radek Cervinka (radek.cervinka@centrum.cz) Copyright (C) 2006-2010 Koblov Alexander (Alexx2000@mail.ru) Copyright (C) 2010 Przemysaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uFindFiles; {$mode objfpc}{$H+} interface uses Classes, SysUtils, DCBasicTypes, uFile; type TTimeUnit = (tuSecond, tuMinute, tuHour, tuDay, tuWeek, tuMonth, tuYear); TFileSizeUnit = (suBytes, suKilo, suMega, suGiga, suTera); TSearchTemplateRec = record StartPath: String; ExcludeDirectories: String; FilesMasks: String; ExcludeFiles: String; SearchDepth: Integer; // -1 = unlimited RegExp: Boolean; IsPartialNameSearch: Boolean; FollowSymLinks: Boolean; AttributesPattern: String; { Date/time } IsDateFrom, IsDateTo, IsTimeFrom, IsTimeTo : Boolean; DateTimeFrom, DateTimeTo : TDateTime; IsNotOlderThan: Boolean; NotOlderThan: Integer; NotOlderThanUnit: TTimeUnit; { File size } IsFileSizeFrom, IsFileSizeTo : Boolean; FileSizeFrom, FileSizeTo : Int64; FileSizeUnit: TFileSizeUnit; { Find/replace text } IsFindText: Boolean; FindText: String; IsReplaceText : Boolean; ReplaceText: String; CaseSensitive, NotContainingText: Boolean; TextEncoding: String; SearchPlugin: String; end; TFindFileAttrsCheck = record HaveAttrs: TFileAttrs; //en> what attributes files must have DontHaveAttrs: TFileAttrs; //en> what attributes files must not have Negated: Boolean; end; TFindFileChecks = record FilesMasks: String; ExcludeFiles: String; ExcludeDirectories: String; RegExp: Boolean; DateTimeFrom, DateTimeTo : TDateTime; FileSizeFrom, FileSizeTo : Int64; Attributes: array of TFindFileAttrsCheck; //en> Each entry is OR'ed. end; procedure SearchTemplateToFindFileChecks(const SearchTemplate: TSearchTemplateRec; out FileChecks: TFindFileChecks); procedure DateTimeOptionsToChecks(const SearchTemplate: TSearchTemplateRec; var FileChecks: TFindFileChecks); function CheckDirectoryName(const FileChecks: TFindFileChecks; const DirectoryName: String) : Boolean; function CheckDirectoryNameRelative(const FileChecks: TFindFileChecks; const FullPath, BasePath: String) : Boolean; function CheckFileName(const FileChecks: TFindFileChecks; const FileName: String) : Boolean; function CheckFileTime(const FileChecks: TFindFileChecks; FT : TFileTime) : Boolean; inline; function CheckFileDateTime(const FileChecks: TFindFileChecks; DT : TDateTime) : Boolean; function CheckFileSize(const FileChecks: TFindFileChecks; FileSize : Int64) : Boolean; function CheckFileAttributes(const FileChecks: TFindFileChecks; Attrs : TFileAttrs) : Boolean; function CheckFile(const SearchTemplate: TSearchTemplateRec; const FileChecks: TFindFileChecks; const AFile: TFile) : Boolean; implementation uses strutils, DateUtils, DCDateTimeUtils, DCFileAttributes, SynRegExpr, uMasks, DCStrUtils, uFileProperty; const cKilo = 1024; cMega = 1024 * cKilo; cGiga = 1024 * cMega; cTera = 1024 * cGiga; procedure FileMaskOptionsToChecks(const SearchTemplate: TSearchTemplateRec; var FileChecks: TFindFileChecks); var iMask: Integer; sMask, sTemp: String; begin FileChecks.FilesMasks := SearchTemplate.FilesMasks; if SearchTemplate.IsPartialNameSearch then begin while (Length(FileChecks.FilesMasks) > 0) do begin sMask:= Copy2SymbDel(FileChecks.FilesMasks, ';'); iMask:= Length(sMask); if (iMask > 0) then begin if sMask[iMask] <> '*' then sMask:= sMask + '*'; if sMask[1] <> '*' then sMask:= '*' + sMask; end; sTemp:= sTemp + sMask + ';'; end; if (Length(sTemp) = 0) then FileChecks.FilesMasks := AllFilesMask else FileChecks.FilesMasks := Copy(sTemp, 1, Length(sTemp) - 1); end; end; procedure DateTimeOptionsToChecks(const SearchTemplate: TSearchTemplateRec; var FileChecks: TFindFileChecks); begin with FileChecks do begin if SearchTemplate.IsNotOlderThan then begin DateTimeFrom := SysUtils.Now; DateTimeTo := DateTimeFrom; case SearchTemplate.NotOlderThanUnit of tuSecond: DateTimeFrom := IncSecond(DateTimeFrom, -SearchTemplate.NotOlderThan); tuMinute: DateTimeFrom := IncMinute(DateTimeFrom, -SearchTemplate.NotOlderThan); tuHour: DateTimeFrom := IncHour(DateTimeFrom, -SearchTemplate.NotOlderThan); tuDay: DateTimeFrom := IncDay(DateTimeFrom, -SearchTemplate.NotOlderThan); tuWeek: DateTimeFrom := IncWeek(DateTimeFrom, -SearchTemplate.NotOlderThan); tuMonth: DateTimeFrom := IncMonth(DateTimeFrom, -SearchTemplate.NotOlderThan); tuYear: DateTimeFrom := IncYear(DateTimeFrom, -SearchTemplate.NotOlderThan); end; end else begin if SearchTemplate.IsDateFrom then begin if SearchTemplate.IsTimeFrom then DateTimeFrom := SearchTemplate.DateTimeFrom else DateTimeFrom := Trunc(SearchTemplate.DateTimeFrom); end else if SearchTemplate.IsTimeFrom then DateTimeFrom := Frac(SearchTemplate.DateTimeFrom) else DateTimeFrom := 0; if SearchTemplate.IsDateTo then begin if SearchTemplate.IsTimeTo then DateTimeTo := SearchTemplate.DateTimeTo else DateTimeTo := Trunc(SearchTemplate.DateTimeTo) + Frac(MaxDateTime); end else if SearchTemplate.IsTimeTo then DateTimeFrom := Frac(SearchTemplate.DateTimeTo) else DateTimeFrom := 0; end; end; end; procedure FileSizeOptionsToChecks(const SearchTemplate: TSearchTemplateRec; var FileChecks: TFindFileChecks); function GetFileSizeWithUnit(Size: Int64): Int64; begin case SearchTemplate.FileSizeUnit of suBytes: Result := Size; suKilo: Result := Size * cKilo; suMega: Result := Size * cMega; suGiga: Result := Size * cGiga; suTera: Result := Size * cTera; end; end; begin if SearchTemplate.IsFileSizeFrom then FileChecks.FileSizeFrom := GetFileSizeWithUnit(SearchTemplate.FileSizeFrom) else FileChecks.FileSizeFrom := 0; if SearchTemplate.IsFileSizeTo then FileChecks.FileSizeTo := GetFileSizeWithUnit(SearchTemplate.FileSizeTo) else FileChecks.FileSizeTo := High(FileChecks.FileSizeTo); end; function AttrPatternToCheck(const AttrPattern: String): TFindFileAttrsCheck; var StartIndex, CurIndex: Integer; begin Result.HaveAttrs := 0; Result.DontHaveAttrs := 0; Result.Negated := False; StartIndex := 1; CurIndex := StartIndex; while CurIndex <= Length(AttrPattern) do begin case AttrPattern[CurIndex] of '+': begin Result.HaveAttrs := Result.HaveAttrs or SingleStrToFileAttr(Copy(AttrPattern, StartIndex, CurIndex - StartIndex)); StartIndex := CurIndex + 1; end; '-': begin Result.DontHaveAttrs := Result.DontHaveAttrs or SingleStrToFileAttr(Copy(AttrPattern, StartIndex, CurIndex - StartIndex)); StartIndex := CurIndex + 1; end; '!': begin if CurIndex = 1 then Result.Negated := True; StartIndex := CurIndex + 1; end; ' ': // omit spaces begin StartIndex := CurIndex + 1; end; end; Inc(CurIndex); end; end; procedure AttrsPatternOptionsToChecks(const SearchTemplate: TSearchTemplateRec; var FileChecks: TFindFileChecks); var AttrsPattern, CurPattern: String; begin FileChecks.Attributes := nil; AttrsPattern := SearchTemplate.AttributesPattern; while AttrsPattern <> '' do begin // For each pattern separated by '|' create a new TFindFileAttrsCheck. CurPattern := Copy2SymbDel(AttrsPattern, '|'); if CurPattern <> '' then with FileChecks do begin SetLength(Attributes, Length(Attributes) + 1); Attributes[Length(Attributes) - 1] := AttrPatternToCheck(CurPattern); end; end; end; procedure SearchTemplateToFindFileChecks(const SearchTemplate: TSearchTemplateRec; out FileChecks: TFindFileChecks); begin FileChecks.ExcludeFiles := SearchTemplate.ExcludeFiles; FileChecks.ExcludeDirectories := SearchTemplate.ExcludeDirectories; FileChecks.RegExp := SearchTemplate.RegExp; FileMaskOptionsToChecks(SearchTemplate, FileChecks); DateTimeOptionsToChecks(SearchTemplate, FileChecks); FileSizeOptionsToChecks(SearchTemplate, FileChecks); AttrsPatternOptionsToChecks(SearchTemplate, FileChecks); end; function CheckDirectoryName(const FileChecks: TFindFileChecks; const DirectoryName: String): Boolean; begin with FileChecks do begin Result := not MatchesMaskList(DirectoryName, ExcludeDirectories); end; end; function CheckDirectoryNameRelative(const FileChecks: TFindFileChecks; const FullPath, BasePath: String): Boolean; begin Result := True; with FileChecks do begin // Check if FullPath is a path relative to BasePath. if GetPathType(ExcludeDirectories) = ptRelative then begin Result := ExcludeDirectories <> ExtractDirLevel(BasePath, FullPath); end; end; end; function CheckFileName(const FileChecks: TFindFileChecks; const FileName: String): Boolean; begin with FileChecks do begin if RegExp then begin Result := ((FilesMasks = '') or ExecRegExpr(FilesMasks, FileName)) and ((ExcludeFiles = '') or not ExecRegExpr(ExcludeFiles, FileName)); end else begin Result := MatchesMaskList(FileName, FilesMasks) and not MatchesMaskList(FileName, ExcludeFiles); end; end; end; function CheckFileTime(const FileChecks: TFindFileChecks; FT : TFileTime) : Boolean; begin Result := CheckFileDateTime(FileChecks, FileTimeToDateTime(FT)); end; function CheckFileDateTime(const FileChecks: TFindFileChecks; DT : TDateTime) : Boolean; begin with FileChecks do Result := (DateTimeFrom <= DT) and (DT <= DateTimeTo); end; function CheckFileSize(const FileChecks: TFindFileChecks; FileSize: Int64): Boolean; begin with FileChecks do Result := (FileSizeFrom <= FileSize) and (FileSize <= FileSizeTo); end; function CheckFileAttributes(const FileChecks: TFindFileChecks; Attrs : TFileAttrs) : Boolean; var i: Integer; begin if Length(FileChecks.Attributes) = 0 then Result := True else begin for i := Low(FileChecks.Attributes) to High(FileChecks.Attributes) do begin with FileChecks.Attributes[i] do begin Result := ((Attrs and HaveAttrs) = HaveAttrs) and ((Attrs and DontHaveAttrs) = 0); if Negated then Result := not Result; if Result then Exit; end; end; Result := False; end; end; function CheckFile(const SearchTemplate: TSearchTemplateRec; const FileChecks: TFindFileChecks; const AFile: TFile): Boolean; var IsDir: Boolean; begin Result := True; with SearchTemplate do begin IsDir := AFile.IsDirectory or AFile.IsLinkToDirectory; if (fpName in AFile.SupportedProperties) then begin if IsDir then Result := CheckDirectoryName(FileChecks, AFile.Name) else Result := CheckFileName(FileChecks, AFile.Name); end; if Result and (fpModificationTime in AFile.SupportedProperties) then if (IsDateFrom or IsDateTo or IsTimeFrom or IsTimeTo or IsNotOlderThan) then Result:= CheckFileDateTime(FileChecks, AFile.ModificationTime); if Result and not IsDir and (fpSize in AFile.SupportedProperties) then if (IsFileSizeFrom or IsFileSizeTo) then Result:= CheckFileSize(FileChecks, AFile.Size); if Result and (fpAttributes in AFile.SupportedProperties) then Result:= CheckFileAttributes(FileChecks, AFile.Attributes); end; end; end. doublecmd-0.5.8/src/fopenwith.lfm0000755000175000017500000001562112054100376016006 0ustar alexxalexxobject frmOpenWith: TfrmOpenWith Left = 470 Height = 474 Top = 167 Width = 410 Caption = 'Choose an application' ClientHeight = 474 ClientWidth = 410 OnClose = FormClose OnCreate = FormCreate OnDestroy = FormDestroy LCLVersion = '1.0.2.0' object lblMimeType: TLabel Left = 6 Height = 16 Top = 6 Width = 404 Align = alTop BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = 'File type to be opened: %s' ParentColor = False end object pnlOpenWith: TPanel Left = 0 Height = 37 Top = 341 Width = 410 Align = alBottom AutoSize = True BevelOuter = bvNone ClientHeight = 37 ClientWidth = 410 Color = clForm Enabled = False ParentColor = False TabOrder = 0 object fneCommand: TFileNameEdit AnchorSideLeft.Control = pnlOpenWith AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnCommands AnchorSideBottom.Side = asrBottom Left = 6 Height = 25 Top = 7 Width = 354 DialogOptions = [] FilterIndex = 0 HideDirectories = False ButtonWidth = 23 NumGlyphs = 1 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 BorderSpacing.Top = 6 BorderSpacing.Bottom = 6 MaxLength = 0 TabOrder = 0 end object btnCommands: TSpeedButton AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = fneCommand AnchorSideRight.Control = pnlOpenWith AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = fneCommand AnchorSideBottom.Side = asrBottom Left = 384 Height = 25 Top = 7 Width = 20 Anchors = [akTop, akRight, akBottom] AutoSize = True BorderSpacing.Left = 24 BorderSpacing.Right = 6 Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534CCA46534FFA46534FFA465 34CC000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534FFE6CEB7FFE6CEB7FFA465 34FF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534FFE6CEB7FFD9AD86FFA465 34FF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534FFE6CEB7FFD9AD86FFA465 34FF000000000000000000000000000000000000000000000000000000000000 0000A46534CCA46534FFA46534FFA46534FFA46534FFD9AD86FFD9AD86FFA465 34FFA46534FFA46534FFA46534FFA46534CC0000000000000000000000000000 0000A46534FFE5CCB4FFDBB795FFDBB694FFDAB492FFDAB390FFD9AD86FFD8AA 83FFD7A87FFFD7A67DFFE0BE9FFFA46534FF0000000000000000000000000000 0000A46534FFE8D3C0FFE7D1BBFFE7D1BCFFE6CEB7FFE6CEB7FFE6CEB7FFE6CE B7FFE6CDB6FFE6CCB5FFE6CCB6FFA46534FF0000000000000000000000000000 0000A46534CCA46534FFA46534FFA46534FFA46534FFE6CEB7FFE6CEB7FFA465 34FFA46534FFA46534FFA46534FFA46534CC0000000000000000000000000000 000000000000000000000000000000000000A46534FFE6CEB7FFE6CEB7FFA465 34FF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534FFE6CEB7FFE6CEB7FFA465 34FF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534FFE6CEB7FFE6CEB7FFA465 34FF000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000A46534CCA46534FFA46534FFA465 34CC000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } NumGlyphs = 0 OnClick = btnCommandsClick PopupMenu = pmFieldCodes end end object ButtonPanel: TButtonPanel Left = 6 Height = 40 Top = 428 Width = 398 OKButton.Name = 'OKButton' OKButton.DefaultCaption = True OKButton.OnClick = OKButtonClick HelpButton.Name = 'HelpButton' HelpButton.DefaultCaption = True CloseButton.Name = 'CloseButton' CloseButton.DefaultCaption = True CancelButton.Name = 'CancelButton' CancelButton.DefaultCaption = True CancelButton.OnClick = CancelButtonClick TabOrder = 1 ShowButtons = [pbOK, pbCancel] end object tvApplications: TTreeView Left = 0 Height = 291 Top = 28 Width = 410 Align = alClient BorderSpacing.Top = 6 DefaultItemHeight = 18 Images = ImageList ReadOnly = True ScrollBars = ssAutoBoth TabOrder = 2 OnDeletion = tvApplicationsDeletion OnSelectionChanged = tvApplicationsSelectionChanged Options = [tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw] end object chkUseAsDefault: TCheckBox AnchorSideTop.Side = asrBottom Left = 6 Height = 22 Top = 400 Width = 404 Align = alBottom BorderSpacing.Left = 6 Caption = 'Set selected application as default action' Enabled = False TabOrder = 3 end object chkCustomCommand: TCheckBox AnchorSideLeft.Control = Owner AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 22 Top = 319 Width = 398 Align = alBottom Anchors = [akLeft, akRight] BorderSpacing.Left = 6 BorderSpacing.Right = 6 Caption = 'Custom command' OnChange = chkCustomCommandChange TabOrder = 4 end object chkSaveAssociation: TCheckBox Left = 6 Height = 22 Top = 378 Width = 404 Align = alBottom BorderSpacing.Left = 6 Caption = 'Save association' OnChange = chkSaveAssociationChange TabOrder = 5 end object ImageList: TImageList left = 208 top = 136 end object pmFieldCodes: TPopupMenu left = 123 top = 135 object miSingleFileName: TMenuItem Caption = 'Single file name' Hint = '%f' OnClick = miFieldCodeClick end object miListOfFiles: TMenuItem Caption = 'Multiple file names' Hint = '%F' OnClick = miFieldCodeClick end object miSingleURL: TMenuItem Caption = 'Single URI' Hint = '%u' OnClick = miFieldCodeClick end object miListOfURLs: TMenuItem Caption = 'Multiple URIs' Hint = '%U' OnClick = miFieldCodeClick end end end doublecmd-0.5.8/src/fdiffer.lfm0000644000175000017500000046341612050431060015407 0ustar alexxalexxobject frmDiffer: TfrmDiffer Left = 200 Height = 370 Top = 140 Width = 760 Caption = 'Compare files' ClientHeight = 350 ClientWidth = 760 Menu = MainMenu OnClose = FormClose OnCreate = FormCreate OnDestroy = FormDestroy OnKeyDown = FormKeyDown OnResize = FormResize SessionProperties = 'actAutoCompare.Checked;actIgnoreCase.Checked;actIgnoreWhiteSpace.Checked;actKeepScrolling.Checked;actLineDifferences.Checked;actPaintBackground.Checked;Height;Left;Top;Width;WindowState' ShowHint = True ShowInTaskBar = stAlways LCLVersion = '1.0.1.3' object ToolBar: TToolBar Left = 0 Height = 22 Top = 0 Width = 760 AutoSize = True ButtonHeight = 20 ButtonWidth = 20 Images = ImageList ParentShowHint = False ShowHint = True TabOrder = 0 object btnSave: TToolButton Left = 21 Top = 2 Action = actSave end object btnSaveAs: TToolButton Left = 41 Top = 2 Action = actSaveAs end object Divider1: TToolButton Left = 61 Top = 2 Width = 4 Style = tbsDivider end object btnCompare: TToolButton Left = 65 Top = 2 Action = actStartCompare end object btnLast: TToolButton Left = 153 Top = 2 Action = actLastDifference end object btnNext: TToolButton Left = 109 Top = 2 Action = actNextDifference end object btnPrev: TToolButton Left = 129 Top = 2 Action = actPrevDifference end object btnFirst: TToolButton Left = 173 Top = 2 Action = actFirstDifference end object Divider2: TToolButton Left = 105 Top = 2 Width = 4 Style = tbsDivider end object Divider3: TToolButton Left = 149 Top = 2 Width = 4 Style = tbsDivider end object btnCancelCompare: TToolButton Left = 85 Top = 2 Action = actCancelCompare end object Divider4: TToolButton Left = 193 Top = 2 Width = 4 Style = tbsDivider end object btnReload: TToolButton Left = 1 Top = 2 Action = actReload end object btnCopyRightToLeft: TToolButton Left = 197 Top = 2 Action = actCopyRightToLeft end object btnCopyLeftToRight: TToolButton Left = 217 Top = 2 Action = actCopyLeftToRight end object Divider5: TToolButton Left = 237 Top = 2 Width = 8 Style = tbsSeparator end end object pnlLeft: TPanel Left = 0 Height = 305 Top = 22 Width = 379 Align = alLeft BevelOuter = bvNone ClientHeight = 305 ClientWidth = 379 TabOrder = 1 object pnlLeftBox: TPanel Left = 0 Height = 22 Top = 0 Width = 379 Align = alTop AutoSize = True BevelOuter = bvNone ClientHeight = 22 ClientWidth = 379 FullRepaint = False ParentShowHint = False ShowHint = True TabOrder = 0 object edtFileNameLeft: TFileNameEdit AnchorSideLeft.Control = btnLeftEncoding AnchorSideLeft.Side = asrBottom Left = 69 Height = 21 Top = 0 Width = 285 OnAcceptFileName = edtFileNameLeftAcceptFileName DialogOptions = [] FilterIndex = 0 HideDirectories = False ButtonWidth = 23 NumGlyphs = 1 Anchors = [akTop, akLeft, akRight] MaxLength = 0 TabOrder = 0 end object btnLeftEncoding: TSpeedButton AnchorSideLeft.Control = btnLeftSaveAs AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlLeftBox AnchorSideBottom.Control = edtFileNameLeft AnchorSideBottom.Side = asrBottom Left = 46 Height = 21 Hint = 'Encoding' Top = 0 Width = 23 Anchors = [akTop, akLeft, akBottom] Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF FF00858A8802858A8808858A8808858A8808858A8808858A8808858A8808858A 8808858A8808858A8808858A8808858A8803FFFFFF00FFFFFF00FFFFFF00858A 8851868B89EF858A88FC858A88FC858A88FC858A88FC858A88FC858A88FC858A 88FC858A88FC858A88FC858A88FC868B89F4868C896AFFFFFF00FFFFFF00888D 8BD9C8CCCBFFD9DDDBFFD9DDDBFFD9DDDBFFD9DDDBFFD9DDDBFFD9DDDBFFD9DD DBFFD9DDDBFFD9DDDBFFD9DDDBFFCBCFCEFF868B89F3FFFFFF00FFFFFF00878C 8AECD5D8D7FFB7BEBBFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD BAFFB6BDBAFFB6BDBAFFB7BEBBFFD8DCDBFF858A88FFFFFFFF00FFFFFF00878C 8AECD5D8D7FFBAC0BEFFBCC3C0FFBCC3C0FFBCC3C0FFBCC3C0FFBCC3C0FFBCC3 C0FFBCC3C0FFBCC3C0FFBAC0BEFFD8DCDBFF858A88FFFFFFFF00FFFFFF00878C 8AECD5D8D7FFF4F5F5FFF5F7F7FFF5F8F7FFF6F8F8FFF6F8F8FFF6F8F8FFF6F8 F8FFF6F8F8FFF6F8F8FFF4F5F5FFD8DCDBFF858A88FFFFFFFF00FFFFFF00878C 8AECD5D8D7FFF3F4F4FFE2E7E4FFE5EAE7FFE8ECEAFFEBEFECFF969997FF7678 77FF7E807FFFE0E4E2FFF3F4F4FFD8DCDBFF858A88FFFFFFFF00FFFFFF00878C 8AECD5D9D7FFEBEEEDFFE1E6E4FFE4E9E6FFE7EBE8FFE9EDEBFF3B3C3CFFE3E6 E4FF2B2C2CFFD8DDDAFFEBEEEEFFDBDEDDFF858A88FFFFFFFF00FFFFFF00878C 8AECD9DDDBFFE5E7E7FFE0E5E2FFE2E7E4FFE4E9E6FFE6EAE8FF9A9C9BFF696C 6AFF232323FFD7DBD9FFE5E7E7FFE0E3E2FF858A88FFFFFFFF00FFFFFF00888D 8BECDDE0DFFFE0E3E3FFDDE3E0FFE0E5E2FFE1E7E4FFE3E8E5FF9C9F9DFF6E71 6FFF393B3AFFE2E7E4FFE0E3E3FFE5E7E7FF858A88FFFFFFFF00FFFFFF00888D 8BECE0E3E2FFD9DDDDFFDBE1DEFFDDE3E0FFDEE4E1FFE0E5E2FFDCE2DFFFBABF BCFFD5DAD7FFDFE4E1FFD9DDDDFFE9EBEBFF858A88FFFFFFFF00FFFFFF00888D 8BECE3E5E4FFD5D9D9FFD8DFDBFFDAE0DDFFDBE1DEFFDCE2DFFFDDE2DFFF6B6D 6CFF515453FFDBE2DEFFD5D9D9FFEDEEEEFF858A88FFFFFFFF00FFFFFF00888D 8BECE4E7E5FFD7DBDBFFD7DADAFFD8DCDBFFD8DCDBFFD8DCDBFFD8DDDCFFD8DD DCFFD8DCDBFFD8DCDBFFD9DDDCFFEFF0F0FF858A88FFFFFFFF00FFFFFF008A8E 8CD7D4D7D6FFECEEEDFFEEF0EFFFF1F2F2FFF3F4F4FFF5F6F6FFF7F7F7FFF7F7 F7FFF5F6F6FFF3F4F4FFF1F2F2FFDEE0E0FF888C8AF1FFFFFF00FFFFFF00858A 8849888D8BEB858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF858A88FF878C8AF1878C8A61FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = btnLeftEncodingClick end object btnLeftSave: TSpeedButton AnchorSideLeft.Control = pnlLeftBox AnchorSideTop.Control = pnlLeftBox Left = 0 Height = 22 Top = 0 Width = 23 Action = actSaveLeft Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001F1F 252F1D1D1FEC1C1B1EFF757575FF787878FF787878FF787878FF787878FF7878 78FF787878FF1A191BFF19191BFF1D1C1FFF1F1F21EFFFFFFF00FFFFFF002222 24ED2A2A2DFF323135FF8B8A8BFF29282BFF201F21FF909090FF909090FF9090 90FF909090FF343336FF201F21FF4E4D51FF212023FFFFFFFF00FFFFFF002524 26FF39383BFF39383BFF999999FF323134FF262528FF9F9F9FFF9F9F9FFF9F9F 9FFF9F9F9FFF3F3E41FF252426FF58575AFF252426FFFFFFFF00FFFFFF002A29 2BFF403F42FF403F42FFA7A7A7FF3D3C3FFF333335FFAEAEAEFFAEAEAEFFAEAE AEFFAEAEAEFF414042FF272728FF444346FF2A292BFFFFFFFF00FFFFFF002E2D 30FF464549FF464549FFCDCDCDFFD6D6D6FFD5D5D6FFD5D5D5FFD6D6D6FFD6D6 D6FFD3D3D3FF272629FF242326FF464549FF2E2D30FFFFFFFF00FFFFFF003130 32FF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A 4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF313032FFFFFFFF00FFFFFF003333 35FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E 51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF333335FFFFFFFF00FFFFFF003635 37FF535254FFE8DED4FFE8DDD0FFE8DDD0FFE8DDD0FFE7DCD0FFE7DCCFFFE7DB CFFFE6DBCEFFE6DACDFFE6DACFFF535254FF363537FFFFFFFF00FFFFFF003837 39FF565557FFF1EAE2FFB8A28BFFB8A28BFFB8A28BFFB8A28BFFB7A18AFFB7A1 8AFFB7A08AFFB6A089FFEDE5DCFF565557FF383739FFFFFFFF00FFFFFF003B3A 3BFF5A595BFFF7F3EEFFF7F3EFFFF7F3EFFFF7F3EFFFF7F3EEFFF6F2EEFFF6F1 EDFFF5F0EBFFF4EFE9FFF3EDE7FF5A595BFF3B3A3BFFFFFFFF00FFFFFF003D3C 3DFF5D5C5EFFFDFCFBFFFBF9F8FFFBF9F9FFFBF9F8FFFBF9F8FFFAF8F7FFFAF7 F5FFF9F6F4FFF8F4F2FFF9F6F2FF5D5C5EFF3D3C3DFFFFFFFF00FFFFFF003F3E 40FF616062FFFDFAF9FFCFB69CFFCFB69CFFCFB69CFFCFB69CFFCFB69DFFCFB7 9DFFD0B79EFFD0B89FFFFEFDFDFF616062FF3F3E40FFFFFFFF00FFFFFF004140 42FF59595AFFFAF4F1FFFAF4F0FFFAF4F0FFFAF4F0FFFAF4F1FFFAF5F2FFFBF6 F3FFFCF8F5FFFCF9F7FFFDFBF9FF646365FF414042FFFFFFFF00FFFFFF004B4B 4CEF444344FFB9B4B3FFB9B4B3FFB9B4B3FFB9B4B3FFB9B6B4FFBBB6B4FFBCB8 B6FFBCB9B7FFBCB9B8FFBCB9B9FF444344FF4B4B4CEFFFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 ShowCaption = False end object btnLeftSaveAs: TSpeedButton AnchorSideLeft.Control = btnLeftSave AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlLeftBox Left = 23 Height = 22 Top = 0 Width = 23 Action = actSaveLeftAs Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 20000000000000040000640000006400000000000000000000004864725A3654 6523FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006279867E3642 46FF44778DFB252D34FF757575FF787878FF787878FF787878FF787878FF7878 78FF787878FF1A191BFF19191BFF1D1C1FFF1F1F21EFFFFFFF00567181049DBC CAFF7AB8CCFF3C92AEFF1F6E89FF161517FF181719FF8A8A8AFF909090FF9090 90FF909090FF343336FF201F21FF4E4D51FF212023FFFFFFFF00FFFFFF0088A1 AFFFB0CAD6FF2C3A3EFF0B96C1FF0C6885FF070707FF404040FF9C9C9CFF9F9F 9FFF9F9F9FFF3F3E41FF252426FF58575AFF252426FFFFFFFF00FFFFFF004E60 6CFF2C9ABDFF242C2FFF213136FF0BA3D2FF0C5166FF2B2B2BFF606060FFAEAE AEFFAEAEAEFF414042FF272728FF444346FF2A292BFFFFFFFF00FFFFFF002E2D 30FF298FB2FF1695BDFF252829FF18343DFF0EADDFFF2E5E6CFF424242FF9595 95FFD3D3D3FF272629FF242326FF464549FF2E2D30FFFFFFFF00FFFFFF003130 32FF494B4FFF46ADCEFF1582A5FF262626FF0E3845FF0CABDDFF173641FF1D1C 1DFF3D3D3FFF4B4A4DFF4B4A4DFF4B4A4DFF313032FFFFFFFF00FFFFFF003333 35FF4F4E51FF4A5156FF67C6E4FF4E899CFF252525FF094558FF0DA4D5FF1E2F 36FF252426FF484749FF4F4E51FF4F4E51FF333335FFFFFFFF00FFFFFF003635 37FF535254FFE8DED4FFCCD0C9FF84DCF7FF54808CFF252525FF12617AFF1CA6 D1FF666867FF827B74FFDDD1C7FF535254FF363537FFFFFFFF00FFFFFF003837 39FF565557FFF1EAE2FFB8A28BFF979D92FF71D8F7FF34565FFF1D1D1DFF1173 90FF2199BCFF5E5449FF9F9A94FF555456FF383739FFFFFFFF00FFFFFF003B3A 3BFF5A595BFFF7F3EEFFF7F3EFFFF7F3EFFFAFCFD7FF33CAF9FF2C454CFF1518 19FF178BB0FF3DA2C1FF8F8B88FF464546FF3B3A3BFFFFFFFF00FFFFFF003D3C 3DFF5D5C5EFFFDFCFBFFFBF9F8FFFBF9F9FFFBF9F8FF94C3D1FF32C4F1FF2736 3BFF0E171AFF1598C1FF57A6BEFF3D3C3EFF3B3A3BFFFFFFFF00FFFFFF003F3E 40FF616062FFFDFAF9FFCFB69CFFCFB69CFFCFB69CFFCFB69CFF5E9FABFF2EB3 DBFF242B2DFF0B1C21FF11A0CDFF2E607AFF3E3D3FFFFFFFFF00FFFFFF004140 42FF59595AFFFAF4F1FFFAF4F0FFFAF4F0FFFAF4F0FFFAF4F1FFF9F5F2FF55C6 E9FF36AFD4FF1E2020FF1D2B85FF05079AFF3A394FFFFFFFFF00FFFFFF004B4B 4CEF444344FFB9B4B3FFB9B4B3FFB9B4B3FFB9B4B3FFB9B6B4FFBBB6B4FFB6B6 B5FF34B6DEFF446AC0FF1B1BCEFF1111A3FF4A4A4DEFFFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00186FAB174345D3D63A3ACFB25353D418FFFFFF00FFFFFF00 } NumGlyphs = 0 ShowCaption = False end end end object Splitter: TSplitter Left = 379 Height = 305 Top = 22 Width = 5 end object pnlRight: TPanel Left = 384 Height = 305 Top = 22 Width = 376 Align = alClient BevelOuter = bvNone ClientHeight = 305 ClientWidth = 376 TabOrder = 3 object pnlRightBox: TPanel Left = 0 Height = 22 Top = 0 Width = 376 Align = alTop AutoSize = True BevelOuter = bvNone ClientHeight = 22 ClientWidth = 376 FullRepaint = False ParentShowHint = False ShowHint = True TabOrder = 0 object edtFileNameRight: TFileNameEdit AnchorSideLeft.Control = btnRightEncoding AnchorSideLeft.Side = asrBottom Left = 69 Height = 21 Top = 0 Width = 282 OnAcceptFileName = edtFileNameRightAcceptFileName DialogOptions = [] FilterIndex = 0 HideDirectories = False ButtonWidth = 23 NumGlyphs = 1 Anchors = [akTop, akLeft, akRight] MaxLength = 0 TabOrder = 0 end object btnRightEncoding: TSpeedButton AnchorSideLeft.Control = btnRightSaveAs AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlRightBox AnchorSideBottom.Control = edtFileNameRight AnchorSideBottom.Side = asrBottom Left = 46 Height = 21 Hint = 'Encoding' Top = 0 Width = 23 Anchors = [akTop, akLeft, akBottom] Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF FF00858A8802858A8808858A8808858A8808858A8808858A8808858A8808858A 8808858A8808858A8808858A8808858A8803FFFFFF00FFFFFF00FFFFFF00858A 8851868B89EF858A88FC858A88FC858A88FC858A88FC858A88FC858A88FC858A 88FC858A88FC858A88FC858A88FC868B89F4868C896AFFFFFF00FFFFFF00888D 8BD9C8CCCBFFD9DDDBFFD9DDDBFFD9DDDBFFD9DDDBFFD9DDDBFFD9DDDBFFD9DD DBFFD9DDDBFFD9DDDBFFD9DDDBFFCBCFCEFF868B89F3FFFFFF00FFFFFF00878C 8AECD5D8D7FFB7BEBBFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD BAFFB6BDBAFFB6BDBAFFB7BEBBFFD8DCDBFF858A88FFFFFFFF00FFFFFF00878C 8AECD5D8D7FFBAC0BEFFBCC3C0FFBCC3C0FFBCC3C0FFBCC3C0FFBCC3C0FFBCC3 C0FFBCC3C0FFBCC3C0FFBAC0BEFFD8DCDBFF858A88FFFFFFFF00FFFFFF00878C 8AECD5D8D7FFF4F5F5FFF5F7F7FFF5F8F7FFF6F8F8FFF6F8F8FFF6F8F8FFF6F8 F8FFF6F8F8FFF6F8F8FFF4F5F5FFD8DCDBFF858A88FFFFFFFF00FFFFFF00878C 8AECD5D8D7FFF3F4F4FFE2E7E4FFE5EAE7FFE8ECEAFFEBEFECFF969997FF7678 77FF7E807FFFE0E4E2FFF3F4F4FFD8DCDBFF858A88FFFFFFFF00FFFFFF00878C 8AECD5D9D7FFEBEEEDFFE1E6E4FFE4E9E6FFE7EBE8FFE9EDEBFF3B3C3CFFE3E6 E4FF2B2C2CFFD8DDDAFFEBEEEEFFDBDEDDFF858A88FFFFFFFF00FFFFFF00878C 8AECD9DDDBFFE5E7E7FFE0E5E2FFE2E7E4FFE4E9E6FFE6EAE8FF9A9C9BFF696C 6AFF232323FFD7DBD9FFE5E7E7FFE0E3E2FF858A88FFFFFFFF00FFFFFF00888D 8BECDDE0DFFFE0E3E3FFDDE3E0FFE0E5E2FFE1E7E4FFE3E8E5FF9C9F9DFF6E71 6FFF393B3AFFE2E7E4FFE0E3E3FFE5E7E7FF858A88FFFFFFFF00FFFFFF00888D 8BECE0E3E2FFD9DDDDFFDBE1DEFFDDE3E0FFDEE4E1FFE0E5E2FFDCE2DFFFBABF BCFFD5DAD7FFDFE4E1FFD9DDDDFFE9EBEBFF858A88FFFFFFFF00FFFFFF00888D 8BECE3E5E4FFD5D9D9FFD8DFDBFFDAE0DDFFDBE1DEFFDCE2DFFFDDE2DFFF6B6D 6CFF515453FFDBE2DEFFD5D9D9FFEDEEEEFF858A88FFFFFFFF00FFFFFF00888D 8BECE4E7E5FFD7DBDBFFD7DADAFFD8DCDBFFD8DCDBFFD8DCDBFFD8DDDCFFD8DD DCFFD8DCDBFFD8DCDBFFD9DDDCFFEFF0F0FF858A88FFFFFFFF00FFFFFF008A8E 8CD7D4D7D6FFECEEEDFFEEF0EFFFF1F2F2FFF3F4F4FFF5F6F6FFF7F7F7FFF7F7 F7FFF5F6F6FFF3F4F4FFF1F2F2FFDEE0E0FF888C8AF1FFFFFF00FFFFFF00858A 8849888D8BEB858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF858A88FF878C8AF1878C8A61FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = btnRightEncodingClick end object btnRightSave: TSpeedButton AnchorSideLeft.Control = pnlRightBox AnchorSideTop.Control = pnlRightBox Left = 0 Height = 22 Top = 0 Width = 23 Action = actSaveRight Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001F1F 252F1D1D1FEC1C1B1EFF757575FF787878FF787878FF787878FF787878FF7878 78FF787878FF1A191BFF19191BFF1D1C1FFF1F1F21EFFFFFFF00FFFFFF002222 24ED2A2A2DFF323135FF8B8A8BFF29282BFF201F21FF909090FF909090FF9090 90FF909090FF343336FF201F21FF4E4D51FF212023FFFFFFFF00FFFFFF002524 26FF39383BFF39383BFF999999FF323134FF262528FF9F9F9FFF9F9F9FFF9F9F 9FFF9F9F9FFF3F3E41FF252426FF58575AFF252426FFFFFFFF00FFFFFF002A29 2BFF403F42FF403F42FFA7A7A7FF3D3C3FFF333335FFAEAEAEFFAEAEAEFFAEAE AEFFAEAEAEFF414042FF272728FF444346FF2A292BFFFFFFFF00FFFFFF002E2D 30FF464549FF464549FFCDCDCDFFD6D6D6FFD5D5D6FFD5D5D5FFD6D6D6FFD6D6 D6FFD3D3D3FF272629FF242326FF464549FF2E2D30FFFFFFFF00FFFFFF003130 32FF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A 4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF313032FFFFFFFF00FFFFFF003333 35FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E 51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF333335FFFFFFFF00FFFFFF003635 37FF535254FFE8DED4FFE8DDD0FFE8DDD0FFE8DDD0FFE7DCD0FFE7DCCFFFE7DB CFFFE6DBCEFFE6DACDFFE6DACFFF535254FF363537FFFFFFFF00FFFFFF003837 39FF565557FFF1EAE2FFB8A28BFFB8A28BFFB8A28BFFB8A28BFFB7A18AFFB7A1 8AFFB7A08AFFB6A089FFEDE5DCFF565557FF383739FFFFFFFF00FFFFFF003B3A 3BFF5A595BFFF7F3EEFFF7F3EFFFF7F3EFFFF7F3EFFFF7F3EEFFF6F2EEFFF6F1 EDFFF5F0EBFFF4EFE9FFF3EDE7FF5A595BFF3B3A3BFFFFFFFF00FFFFFF003D3C 3DFF5D5C5EFFFDFCFBFFFBF9F8FFFBF9F9FFFBF9F8FFFBF9F8FFFAF8F7FFFAF7 F5FFF9F6F4FFF8F4F2FFF9F6F2FF5D5C5EFF3D3C3DFFFFFFFF00FFFFFF003F3E 40FF616062FFFDFAF9FFCFB69CFFCFB69CFFCFB69CFFCFB69CFFCFB69DFFCFB7 9DFFD0B79EFFD0B89FFFFEFDFDFF616062FF3F3E40FFFFFFFF00FFFFFF004140 42FF59595AFFFAF4F1FFFAF4F0FFFAF4F0FFFAF4F0FFFAF4F1FFFAF5F2FFFBF6 F3FFFCF8F5FFFCF9F7FFFDFBF9FF646365FF414042FFFFFFFF00FFFFFF004B4B 4CEF444344FFB9B4B3FFB9B4B3FFB9B4B3FFB9B4B3FFB9B6B4FFBBB6B4FFBCB8 B6FFBCB9B7FFBCB9B8FFBCB9B9FF444344FF4B4B4CEFFFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 ShowCaption = False end object btnRightSaveAs: TSpeedButton AnchorSideLeft.Control = btnRightSave AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlRightBox Left = 23 Height = 22 Top = 0 Width = 23 Action = actSaveRightAs Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 20000000000000040000640000006400000000000000000000004864725A3654 6523FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006279867E3642 46FF44778DFB252D34FF757575FF787878FF787878FF787878FF787878FF7878 78FF787878FF1A191BFF19191BFF1D1C1FFF1F1F21EFFFFFFF00567181049DBC CAFF7AB8CCFF3C92AEFF1F6E89FF161517FF181719FF8A8A8AFF909090FF9090 90FF909090FF343336FF201F21FF4E4D51FF212023FFFFFFFF00FFFFFF0088A1 AFFFB0CAD6FF2C3A3EFF0B96C1FF0C6885FF070707FF404040FF9C9C9CFF9F9F 9FFF9F9F9FFF3F3E41FF252426FF58575AFF252426FFFFFFFF00FFFFFF004E60 6CFF2C9ABDFF242C2FFF213136FF0BA3D2FF0C5166FF2B2B2BFF606060FFAEAE AEFFAEAEAEFF414042FF272728FF444346FF2A292BFFFFFFFF00FFFFFF002E2D 30FF298FB2FF1695BDFF252829FF18343DFF0EADDFFF2E5E6CFF424242FF9595 95FFD3D3D3FF272629FF242326FF464549FF2E2D30FFFFFFFF00FFFFFF003130 32FF494B4FFF46ADCEFF1582A5FF262626FF0E3845FF0CABDDFF173641FF1D1C 1DFF3D3D3FFF4B4A4DFF4B4A4DFF4B4A4DFF313032FFFFFFFF00FFFFFF003333 35FF4F4E51FF4A5156FF67C6E4FF4E899CFF252525FF094558FF0DA4D5FF1E2F 36FF252426FF484749FF4F4E51FF4F4E51FF333335FFFFFFFF00FFFFFF003635 37FF535254FFE8DED4FFCCD0C9FF84DCF7FF54808CFF252525FF12617AFF1CA6 D1FF666867FF827B74FFDDD1C7FF535254FF363537FFFFFFFF00FFFFFF003837 39FF565557FFF1EAE2FFB8A28BFF979D92FF71D8F7FF34565FFF1D1D1DFF1173 90FF2199BCFF5E5449FF9F9A94FF555456FF383739FFFFFFFF00FFFFFF003B3A 3BFF5A595BFFF7F3EEFFF7F3EFFFF7F3EFFFAFCFD7FF33CAF9FF2C454CFF1518 19FF178BB0FF3DA2C1FF8F8B88FF464546FF3B3A3BFFFFFFFF00FFFFFF003D3C 3DFF5D5C5EFFFDFCFBFFFBF9F8FFFBF9F9FFFBF9F8FF94C3D1FF32C4F1FF2736 3BFF0E171AFF1598C1FF57A6BEFF3D3C3EFF3B3A3BFFFFFFFF00FFFFFF003F3E 40FF616062FFFDFAF9FFCFB69CFFCFB69CFFCFB69CFFCFB69CFF5E9FABFF2EB3 DBFF242B2DFF0B1C21FF11A0CDFF2E607AFF3E3D3FFFFFFFFF00FFFFFF004140 42FF59595AFFFAF4F1FFFAF4F0FFFAF4F0FFFAF4F0FFFAF4F1FFF9F5F2FF55C6 E9FF36AFD4FF1E2020FF1D2B85FF05079AFF3A394FFFFFFFFF00FFFFFF004B4B 4CEF444344FFB9B4B3FFB9B4B3FFB9B4B3FFB9B4B3FFB9B6B4FFBBB6B4FFB6B6 B5FF34B6DEFF446AC0FF1B1BCEFF1111A3FF4A4A4DEFFFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00186FAB174345D3D63A3ACFB25353D418FFFFFF00FFFFFF00 } NumGlyphs = 0 ShowCaption = False end end end object StatusBar: TStatusBar Left = 0 Height = 23 Top = 327 Width = 760 Panels = < item Width = 100 end item Width = 100 end item Width = 100 end item Width = 100 end> SimplePanel = False end object MainMenu: TMainMenu Images = ImageList left = 72 top = 136 object mnuFile: TMenuItem Caption = '&File' object miOpenLeft: TMenuItem Action = actOpenLeft Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 20000000000000040000640000006400000000000000000000002C86D8002D88 D8F72D87D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88 D8F72D88D8F72D87D8F72D88D8F72C86D800FFFFFF00FFFFFF00338ED9FBDCF0 FAFF98E1F6FF95E0F6FF92DFF6FF8EDEF5FF89DCF5FF85DAF4FF80D9F4FF7AD7 F3FF74D5F3FF70D3F2FFC2EAF8FF3594DAFFFFFFFF00FFFFFF003594DAF7EFFA FEFF93E5F8FF8FE4F8FF89E3F8FF82E1F7FF7ADFF7FF71DEF6FF67DBF5FF5BD8 F4FF4DD4F3FF40D1F2FFCAF2FBFF3594DAFFFFFFFF00FFFFFF00369ADAF8F2FA FDFF94E6F8FF92E5F8FF90E5F8FF8BE3F8FF86E2F7FF7FE1F7FF77DEF6FF6CDC F6FF5ED9F4FF4FD5F3FFCCF2FBFF3594DAFFFFFFFF00FFFFFF0036A1DAF9F6FC FEFF94E5F8FF93E5F8FF93E5F8FF91E5F8FF93DBE9FF93D7E3FF93D2DCFF90CE D7FF8CC8CFFF86C1C6FFC9D8D6FF3594DAFFC57444E8CA7F53F137A6DAFAFEFF FFFFF8FDFFFFF6FDFFFFF5FCFFFFF3FCFEFF9AE4F4FF9AE6F7FF9BE6F6FF9DE5 F5FF9EE5F5FF9FE5F4FFDAF3F8FF3594DAFFFDF4EEFFCA8054F935ABDAFAE8F6 FBFF70BCE7FF55AAE2FF4DA5E0FF91C9EBFFFAF3EFFFFDFEFDFFFFFDFCFFFFFD FCFFFEFDFCFFFEFCFBFFFEFEFDFF3594DAFFEFF2E8FFCE8156FF36AADAF2F1FA FDFF94DEF5FF93DCF4FF64BCE9FF3594DAFF3594DAFF3594DAFF3594DAFF3594 DAFF3594DAFF3594DAFF3594DAFF3594DAFFFBF6EFFFCC8355FE35AFDAF0F7FC FEFF8EE4F8FF91DEF5FF9FE0F5FFACE1F6FFCA8452FFFFF7F1FFFFE9D9FFFFEA DBFFFFE9D9FFFFE7D7FFFFE5D2FFFFE2CBFFFFF7F1FFCB8555FE36B3DAF8FDFE FEFFFEFFFFFFFEFEFFFFFDFEFFFFFEFFFFFFE4BA91FFFFF7F0FFFFE7D5FFFDE7 D6FFFDE6D4FFFCE4D0FFFBE3CBFFFADCC2FFFEF3E8FFCC8656FE34B4D9D05EC2 E1FA60C3E2FA60C3E2FA60C3E2FA5FC3E2FAE4BB91FFFFF7F2FFFEE7D5FFFEE7 D5FFFDE5D1FFFAE0CAFFF9DEC4FFF7D9BCFFFDF2E7FFCC8757FEFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E4BB92FFFEF7F1FFFCE5D2FFFCE4 D1FFFBE2CCFFF9DDC4FFF6D7BBFFF3D1AFFFFAEFE4FFCC8758FEFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E4BB92FFFEF6F0FFFCE2CDFFFCE3 CDFFFADFC8FFF7D9BCFFF5E9DDFFFAF3EBFFFBF8F3FFCA8353FEFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E4BB93FFFEF5EDFFFCDEC5FFFBE0 C7FFF9DCC2FFF5D3B4FFFEF9F3FFFAE2C4FFECC193FFC37D4893FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E5BE96FFFFFFFEFFFDF3E9FFFDF3 EAFFFCF2E8FFFAEFE3FFFAF2E7FFEABB88FFCF8555B3B4693D0CFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EAC39DFFE6BF96FFE4BB92FFE4BB 92FFD1A06CF5D09E6DF6CC965FDAC479427EB2673C09FFFFFF00 } OnClick = actOpenLeftExecute end object miOpenRight: TMenuItem Action = actOpenRight Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 20000000000000040000640000006400000000000000000000002C86D8002D88 D8F72D87D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88 D8F72D88D8F72D87D8F72D88D8F72C86D800FFFFFF00FFFFFF00338ED9FBDCF0 FAFF98E1F6FF95E0F6FF92DFF6FF8EDEF5FF89DCF5FF85DAF4FF80D9F4FF7AD7 F3FF74D5F3FF70D3F2FFC2EAF8FF3594DAFFFFFFFF00FFFFFF003594DAF7EFFA FEFF93E5F8FF8FE4F8FF89E3F8FF82E1F7FF7ADFF7FF71DEF6FF67DBF5FF5BD8 F4FF4DD4F3FF40D1F2FFCAF2FBFF3594DAFFFFFFFF00FFFFFF00369ADAF8F2FA FDFF94E6F8FF92E5F8FF90E5F8FF8BE3F8FF86E2F7FF7FE1F7FF77DEF6FF6CDC F6FF5ED9F4FF4FD5F3FFCCF2FBFF3594DAFFFFFFFF00FFFFFF0036A1DAF9F6FC FEFF94E5F8FF93E5F8FF93E5F8FF91E5F8FF93DBE9FF93D7E3FF93D2DCFF90CE D7FF8CC8CFFF86C1C6FFC9D8D6FF3594DAFFC57444E8CA7F53F137A6DAFAFEFF FFFFF8FDFFFFF6FDFFFFF5FCFFFFF3FCFEFF9AE4F4FF9AE6F7FF9BE6F6FF9DE5 F5FF9EE5F5FF9FE5F4FFDAF3F8FF3594DAFFFDF4EEFFCA8054F935ABDAFAE8F6 FBFF70BCE7FF55AAE2FF4DA5E0FF91C9EBFFFAF3EFFFFDFEFDFFFFFDFCFFFFFD FCFFFEFDFCFFFEFCFBFFFEFEFDFF3594DAFFEFF2E8FFCE8156FF36AADAF2F1FA FDFF94DEF5FF93DCF4FF64BCE9FF3594DAFF3594DAFF3594DAFF3594DAFF3594 DAFF3594DAFF3594DAFF3594DAFF3594DAFFFBF6EFFFCC8355FE35AFDAF0F7FC FEFF8EE4F8FF91DEF5FF9FE0F5FFACE1F6FFCA8452FFFFF7F1FFFFE9D9FFFFEA DBFFFFE9D9FFFFE7D7FFFFE5D2FFFFE2CBFFFFF7F1FFCB8555FE36B3DAF8FDFE FEFFFEFFFFFFFEFEFFFFFDFEFFFFFEFFFFFFE4BA91FFFFF7F0FFFFE7D5FFFDE7 D6FFFDE6D4FFFCE4D0FFFBE3CBFFFADCC2FFFEF3E8FFCC8656FE34B4D9D05EC2 E1FA60C3E2FA60C3E2FA60C3E2FA5FC3E2FAE4BB91FFFFF7F2FFFEE7D5FFFEE7 D5FFFDE5D1FFFAE0CAFFF9DEC4FFF7D9BCFFFDF2E7FFCC8757FEFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E4BB92FFFEF7F1FFFCE5D2FFFCE4 D1FFFBE2CCFFF9DDC4FFF6D7BBFFF3D1AFFFFAEFE4FFCC8758FEFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E4BB92FFFEF6F0FFFCE2CDFFFCE3 CDFFFADFC8FFF7D9BCFFF5E9DDFFFAF3EBFFFBF8F3FFCA8353FEFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E4BB93FFFEF5EDFFFCDEC5FFFBE0 C7FFF9DCC2FFF5D3B4FFFEF9F3FFFAE2C4FFECC193FFC37D4893FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E5BE96FFFFFFFEFFFDF3E9FFFDF3 EAFFFCF2E8FFFAEFE3FFFAF2E7FFEABB88FFCF8555B3B4693D0CFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EAC39DFFE6BF96FFE4BB92FFE4BB 92FFD1A06CF5D09E6DF6CC965FDAC479427EB2673C09FFFFFF00 } OnClick = actOpenRightExecute end object miReload: TMenuItem Action = actReload Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FFFFFF00A465 34A2A4653401FFFFFF00FFFFFF00A4653405A4653453A76A3ABEA66938E9A466 35FAA76A3AE4A76B3BAAA4653424FFFFFF00FFFFFF00FFFFFF00FFFFFF00A465 34FFA5673693FFFFFF00A4653454A66737EEB58055F3CEA684FFD8B697FFDBB9 99FFD3AC8AFFC2946DFCA66838F6A466355BFFFFFF00FFFFFF00FFFFFF00A567 37FEB7845BF7A56736D4B17A4EF4E3CAB4FFECDAC9FFE7D1BCFFE3C9B0FFDEBE A0FFD2AB88FFCEA582FFD3AE8EFFA66838F5A465342AFFFFFF00FFFFFF00A668 38FDF1E4D8FFD4B295FEF4E9E0FFF3E8DDFFEDDCCCFFD2AD8FFEB0784CF5A566 35FBA66939FFA66939FEA96D3DFFB0784CFFA76A3AA8FFFFFF00FFFFFF00A567 37FDF6EEE6FFF5ECE3FFF5EDE4FFE6D2C1FFB0794DF5A66938CAA4653436FFFF FF00A465346AA96B3CEDB67C4FFFA76A3AFEA56837FAFFFFFF00FFFFFF00A466 35FCF6EEE6FFEBD7C4FFEAD9C9FFA46534FEA465346AFFFFFF00FFFFFF00FFFF FF00A465340BA56635E9C9956C8DB77F53C2A46534FFA4653405FFFFFF00A465 34FCF5EDE5FFF6EDE5FFF5ECE4FFD7B79CFDA66837E0A4653410FFFFFF00FFFF FF00FFFFFF00FFFFFF00D5A47E1ACD997239A46534FCA465340CFFFFFF00A465 34F9A46534FEA46534FEA46534FDA46534FCA46534FBA46534B9A465341DA465 3418A4653418A4653418A4653418A4653418A465341CFFFFFF00FFFFFF00A465 340DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A46534A0A465 34FFAD7447F8AF774CF7AF774CF7AF784CF7A46534FFA4653408FFFFFF00A465 34FCB3794C7ECF9D762BBB835713A4653402FFFFFF00FFFFFF00A4653404A668 38C4D0AC8FFAF6EEE7FFF2E6DBFFF6EEE6FFA66A3AFBA4653409FFFFFF00A465 35FEA76A3AFBC791689DA56737E6A4653423FFFFFF00FFFFFF00FFFFFF00A465 3460A46635FFE9D7C7FFEBD8C6FFF5ECE3FFA66A3AFAA465340AFFFFFF00A668 38F3AB7041FFA96C3CFEA76A3AF5A4653475A4653419A4653445A66938CDB988 61F5EBDBCDFFF5EBE2FFF6EEE6FFF6EEE6FFA76A3AFAA465340BFFFFFF00A769 399BC09069FDC59872FFA86B3CFFA46635FFA76A3AFCB7855DF3D9BBA1FEF1E4 D8FFF2E6DBFFF3E8DDFFCEA788FDEAD8C8FFA76A3AF9A465340DFFFFFF00A465 3429A66939F5D3AD8CFFDCBD9DFFDDBEA1FFE5CBB4FFE9D3BFFFEEDDCCFFF0E2 D5FFE7D2BFFFAF774BF5A56736C0AB7143F7A46635FCA465340EFFFFFF00FFFF FF00A4653550A66838F6C09068FAD3B08FFFDFC2A8FFDEC1A8FFD4B193FFB987 5FF4A56737F0A4653458FFFFFF00A4663566A46534FFA465340FFFFFFF00FFFF FF00FFFFFF00A465341DA7693A9FA76A3ADEA56736F6A76939E5A76A3ABCA465 3453A4653405FFFFFF00FFFFFF00FFFFFF00A4653479A4653410 } end object miDivider7: TMenuItem Caption = '-' end object miSaveLeft: TMenuItem Action = actSaveLeft Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001F1F 252F1D1D1FEC1C1B1EFF757575FF787878FF787878FF787878FF787878FF7878 78FF787878FF1A191BFF19191BFF1D1C1FFF1F1F21EFFFFFFF00FFFFFF002222 24ED2A2A2DFF323135FF8B8A8BFF29282BFF201F21FF909090FF909090FF9090 90FF909090FF343336FF201F21FF4E4D51FF212023FFFFFFFF00FFFFFF002524 26FF39383BFF39383BFF999999FF323134FF262528FF9F9F9FFF9F9F9FFF9F9F 9FFF9F9F9FFF3F3E41FF252426FF58575AFF252426FFFFFFFF00FFFFFF002A29 2BFF403F42FF403F42FFA7A7A7FF3D3C3FFF333335FFAEAEAEFFAEAEAEFFAEAE AEFFAEAEAEFF414042FF272728FF444346FF2A292BFFFFFFFF00FFFFFF002E2D 30FF464549FF464549FFCDCDCDFFD6D6D6FFD5D5D6FFD5D5D5FFD6D6D6FFD6D6 D6FFD3D3D3FF272629FF242326FF464549FF2E2D30FFFFFFFF00FFFFFF003130 32FF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A 4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF313032FFFFFFFF00FFFFFF003333 35FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E 51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF333335FFFFFFFF00FFFFFF003635 37FF535254FFE8DED4FFE8DDD0FFE8DDD0FFE8DDD0FFE7DCD0FFE7DCCFFFE7DB CFFFE6DBCEFFE6DACDFFE6DACFFF535254FF363537FFFFFFFF00FFFFFF003837 39FF565557FFF1EAE2FFB8A28BFFB8A28BFFB8A28BFFB8A28BFFB7A18AFFB7A1 8AFFB7A08AFFB6A089FFEDE5DCFF565557FF383739FFFFFFFF00FFFFFF003B3A 3BFF5A595BFFF7F3EEFFF7F3EFFFF7F3EFFFF7F3EFFFF7F3EEFFF6F2EEFFF6F1 EDFFF5F0EBFFF4EFE9FFF3EDE7FF5A595BFF3B3A3BFFFFFFFF00FFFFFF003D3C 3DFF5D5C5EFFFDFCFBFFFBF9F8FFFBF9F9FFFBF9F8FFFBF9F8FFFAF8F7FFFAF7 F5FFF9F6F4FFF8F4F2FFF9F6F2FF5D5C5EFF3D3C3DFFFFFFFF00FFFFFF003F3E 40FF616062FFFDFAF9FFCFB69CFFCFB69CFFCFB69CFFCFB69CFFCFB69DFFCFB7 9DFFD0B79EFFD0B89FFFFEFDFDFF616062FF3F3E40FFFFFFFF00FFFFFF004140 42FF59595AFFFAF4F1FFFAF4F0FFFAF4F0FFFAF4F0FFFAF4F1FFFAF5F2FFFBF6 F3FFFCF8F5FFFCF9F7FFFDFBF9FF646365FF414042FFFFFFFF00FFFFFF004B4B 4CEF444344FFB9B4B3FFB9B4B3FFB9B4B3FFB9B4B3FFB9B6B4FFBBB6B4FFBCB8 B6FFBCB9B7FFBCB9B8FFBCB9B9FF444344FF4B4B4CEFFFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } end object miSaveRight: TMenuItem Action = actSaveRight Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001F1F 252F1D1D1FEC1C1B1EFF757575FF787878FF787878FF787878FF787878FF7878 78FF787878FF1A191BFF19191BFF1D1C1FFF1F1F21EFFFFFFF00FFFFFF002222 24ED2A2A2DFF323135FF8B8A8BFF29282BFF201F21FF909090FF909090FF9090 90FF909090FF343336FF201F21FF4E4D51FF212023FFFFFFFF00FFFFFF002524 26FF39383BFF39383BFF999999FF323134FF262528FF9F9F9FFF9F9F9FFF9F9F 9FFF9F9F9FFF3F3E41FF252426FF58575AFF252426FFFFFFFF00FFFFFF002A29 2BFF403F42FF403F42FFA7A7A7FF3D3C3FFF333335FFAEAEAEFFAEAEAEFFAEAE AEFFAEAEAEFF414042FF272728FF444346FF2A292BFFFFFFFF00FFFFFF002E2D 30FF464549FF464549FFCDCDCDFFD6D6D6FFD5D5D6FFD5D5D5FFD6D6D6FFD6D6 D6FFD3D3D3FF272629FF242326FF464549FF2E2D30FFFFFFFF00FFFFFF003130 32FF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A 4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF313032FFFFFFFF00FFFFFF003333 35FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E 51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF333335FFFFFFFF00FFFFFF003635 37FF535254FFE8DED4FFE8DDD0FFE8DDD0FFE8DDD0FFE7DCD0FFE7DCCFFFE7DB CFFFE6DBCEFFE6DACDFFE6DACFFF535254FF363537FFFFFFFF00FFFFFF003837 39FF565557FFF1EAE2FFB8A28BFFB8A28BFFB8A28BFFB8A28BFFB7A18AFFB7A1 8AFFB7A08AFFB6A089FFEDE5DCFF565557FF383739FFFFFFFF00FFFFFF003B3A 3BFF5A595BFFF7F3EEFFF7F3EFFFF7F3EFFFF7F3EFFFF7F3EEFFF6F2EEFFF6F1 EDFFF5F0EBFFF4EFE9FFF3EDE7FF5A595BFF3B3A3BFFFFFFFF00FFFFFF003D3C 3DFF5D5C5EFFFDFCFBFFFBF9F8FFFBF9F9FFFBF9F8FFFBF9F8FFFAF8F7FFFAF7 F5FFF9F6F4FFF8F4F2FFF9F6F2FF5D5C5EFF3D3C3DFFFFFFFF00FFFFFF003F3E 40FF616062FFFDFAF9FFCFB69CFFCFB69CFFCFB69CFFCFB69CFFCFB69DFFCFB7 9DFFD0B79EFFD0B89FFFFEFDFDFF616062FF3F3E40FFFFFFFF00FFFFFF004140 42FF59595AFFFAF4F1FFFAF4F0FFFAF4F0FFFAF4F0FFFAF4F1FFFAF5F2FFFBF6 F3FFFCF8F5FFFCF9F7FFFDFBF9FF646365FF414042FFFFFFFF00FFFFFF004B4B 4CEF444344FFB9B4B3FFB9B4B3FFB9B4B3FFB9B4B3FFB9B6B4FFBBB6B4FFBCB8 B6FFBCB9B7FFBCB9B8FFBCB9B9FF444344FF4B4B4CEFFFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } end object miSaveLeftAs: TMenuItem Action = actSaveLeftAs Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000486472003654 6523FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006279867E3642 46FF44778DFB252D34FF757575FF787878FF787878FF787878FF787878FF7878 78FF787878FF1A191BFF19191BFF1D1C1FFF1F1F21EFFFFFFF00567181049DBC CAFF7AB8CCFF3C92AEFF1F6E89FF161517FF181719FF8A8A8AFF909090FF9090 90FF909090FF343336FF201F21FF4E4D51FF212023FFFFFFFF00FFFFFF0088A1 AFFFB0CAD6FF2C3A3EFF0B96C1FF0C6885FF070707FF404040FF9C9C9CFF9F9F 9FFF9F9F9FFF3F3E41FF252426FF58575AFF252426FFFFFFFF00FFFFFF004E60 6CFF2C9ABDFF242C2FFF213136FF0BA3D2FF0C5166FF2B2B2BFF606060FFAEAE AEFFAEAEAEFF414042FF272728FF444346FF2A292BFFFFFFFF00FFFFFF002E2D 30FF298FB2FF1695BDFF252829FF18343DFF0EADDFFF2E5E6CFF424242FF9595 95FFD3D3D3FF272629FF242326FF464549FF2E2D30FFFFFFFF00FFFFFF003130 32FF494B4FFF46ADCEFF1582A5FF262626FF0E3845FF0CABDDFF173641FF1D1C 1DFF3D3D3FFF4B4A4DFF4B4A4DFF4B4A4DFF313032FFFFFFFF00FFFFFF003333 35FF4F4E51FF4A5156FF67C6E4FF4E899CFF252525FF094558FF0DA4D5FF1E2F 36FF252426FF484749FF4F4E51FF4F4E51FF333335FFFFFFFF00FFFFFF003635 37FF535254FFE8DED4FFCCD0C9FF84DCF7FF54808CFF252525FF12617AFF1CA6 D1FF666867FF827B74FFDDD1C7FF535254FF363537FFFFFFFF00FFFFFF003837 39FF565557FFF1EAE2FFB8A28BFF979D92FF71D8F7FF34565FFF1D1D1DFF1173 90FF2199BCFF5E5449FF9F9A94FF555456FF383739FFFFFFFF00FFFFFF003B3A 3BFF5A595BFFF7F3EEFFF7F3EFFFF7F3EFFFAFCFD7FF33CAF9FF2C454CFF1518 19FF178BB0FF3DA2C1FF8F8B88FF464546FF3B3A3BFFFFFFFF00FFFFFF003D3C 3DFF5D5C5EFFFDFCFBFFFBF9F8FFFBF9F9FFFBF9F8FF94C3D1FF32C4F1FF2736 3BFF0E171AFF1598C1FF57A6BEFF3D3C3EFF3B3A3BFFFFFFFF00FFFFFF003F3E 40FF616062FFFDFAF9FFCFB69CFFCFB69CFFCFB69CFFCFB69CFF5E9FABFF2EB3 DBFF242B2DFF0B1C21FF11A0CDFF2E607AFF3E3D3FFFFFFFFF00FFFFFF004140 42FF59595AFFFAF4F1FFFAF4F0FFFAF4F0FFFAF4F0FFFAF4F1FFF9F5F2FF55C6 E9FF36AFD4FF1E2020FF1D2B85FF05079AFF3A394FFFFFFFFF00FFFFFF004B4B 4CEF444344FFB9B4B3FFB9B4B3FFB9B4B3FFB9B4B3FFB9B6B4FFBBB6B4FFB6B6 B5FF34B6DEFF446AC0FF1B1BCEFF1111A3FF4A4A4DEFFFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00186FAB174345D3D63A3ACFB25353D418FFFFFF00FFFFFF00 } OnClick = actSaveLeftAsExecute end object miSaveRightAs: TMenuItem Action = actSaveRightAs Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000486472003654 6523FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006279867E3642 46FF44778DFB252D34FF757575FF787878FF787878FF787878FF787878FF7878 78FF787878FF1A191BFF19191BFF1D1C1FFF1F1F21EFFFFFFF00567181049DBC CAFF7AB8CCFF3C92AEFF1F6E89FF161517FF181719FF8A8A8AFF909090FF9090 90FF909090FF343336FF201F21FF4E4D51FF212023FFFFFFFF00FFFFFF0088A1 AFFFB0CAD6FF2C3A3EFF0B96C1FF0C6885FF070707FF404040FF9C9C9CFF9F9F 9FFF9F9F9FFF3F3E41FF252426FF58575AFF252426FFFFFFFF00FFFFFF004E60 6CFF2C9ABDFF242C2FFF213136FF0BA3D2FF0C5166FF2B2B2BFF606060FFAEAE AEFFAEAEAEFF414042FF272728FF444346FF2A292BFFFFFFFF00FFFFFF002E2D 30FF298FB2FF1695BDFF252829FF18343DFF0EADDFFF2E5E6CFF424242FF9595 95FFD3D3D3FF272629FF242326FF464549FF2E2D30FFFFFFFF00FFFFFF003130 32FF494B4FFF46ADCEFF1582A5FF262626FF0E3845FF0CABDDFF173641FF1D1C 1DFF3D3D3FFF4B4A4DFF4B4A4DFF4B4A4DFF313032FFFFFFFF00FFFFFF003333 35FF4F4E51FF4A5156FF67C6E4FF4E899CFF252525FF094558FF0DA4D5FF1E2F 36FF252426FF484749FF4F4E51FF4F4E51FF333335FFFFFFFF00FFFFFF003635 37FF535254FFE8DED4FFCCD0C9FF84DCF7FF54808CFF252525FF12617AFF1CA6 D1FF666867FF827B74FFDDD1C7FF535254FF363537FFFFFFFF00FFFFFF003837 39FF565557FFF1EAE2FFB8A28BFF979D92FF71D8F7FF34565FFF1D1D1DFF1173 90FF2199BCFF5E5449FF9F9A94FF555456FF383739FFFFFFFF00FFFFFF003B3A 3BFF5A595BFFF7F3EEFFF7F3EFFFF7F3EFFFAFCFD7FF33CAF9FF2C454CFF1518 19FF178BB0FF3DA2C1FF8F8B88FF464546FF3B3A3BFFFFFFFF00FFFFFF003D3C 3DFF5D5C5EFFFDFCFBFFFBF9F8FFFBF9F9FFFBF9F8FF94C3D1FF32C4F1FF2736 3BFF0E171AFF1598C1FF57A6BEFF3D3C3EFF3B3A3BFFFFFFFF00FFFFFF003F3E 40FF616062FFFDFAF9FFCFB69CFFCFB69CFFCFB69CFFCFB69CFF5E9FABFF2EB3 DBFF242B2DFF0B1C21FF11A0CDFF2E607AFF3E3D3FFFFFFFFF00FFFFFF004140 42FF59595AFFFAF4F1FFFAF4F0FFFAF4F0FFFAF4F0FFFAF4F1FFF9F5F2FF55C6 E9FF36AFD4FF1E2020FF1D2B85FF05079AFF3A394FFFFFFFFF00FFFFFF004B4B 4CEF444344FFB9B4B3FFB9B4B3FFB9B4B3FFB9B4B3FFB9B6B4FFBBB6B4FFB6B6 B5FF34B6DEFF446AC0FF1B1BCEFF1111A3FF4A4A4DEFFFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00186FAB174345D3D63A3ACFB25353D418FFFFFF00FFFFFF00 } OnClick = actSaveRightAsExecute end object miDivider6: TMenuItem Caption = '-' end object miExit: TMenuItem Action = actExit Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00B7B7 B7FFAEAEAEFF3071A9FF2C6EA6FF286BA3FF2468A0FF21669EFF1D639BFF1A61 99FF175F97FF145C94FF115B93FF6C6C6CFF6C6C6CFFFFFFFF00FFFFFF00FFFF FF00FFFFFF003675ADFF86B6D8FF83B3D7FF81B2D6FF7DAFD5FF7BADD4FF79AB D3FF76AAD2FF74A8D1FF155D95FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF003C79B1FF8BB9DAFF66A2CEFF62A0CDFF5F9DCBFF5B9AC9FF5897 C8FF5495C7FF77ABD3FF196098FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00427DB5FF8FBDDCFF6CA7D0FF67A4CFFF64A1CDFF609ECCFF5C9B CAFF5999C9FF7BADD4FF1E649CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF004882BAFF93C0DDFF71ABD2FF6DA8D1FF69A5CFFF66A2CEFF629F CCFF5E9CCBFF7FB0D5FF23679FFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF004E86BEFF98C3DFFF77AFD5FF73ACD3FF6FA9D2FF6BA7D0FF5BB7 E3FF54C2EDFF81B4D7FF286BA3FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00538AC2FF9CC6E1FF7CB3D7FF79B1D5FF75ADD4FF71ABD2FF5FBA E4FF4BD4FFFF7CBBE0FF2E6FA7FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00598EC6FFA0C9E3FF82B8D9FF7EB5D8FF7AB2D6FF77AFD5FF73AC D3FF6DABD4FF8CBADAFF3373ABFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF005E91C9FFA4CCE4FF87BBDBFF84B9DAFF80B6D8FF7CB3D7FF79B0 D5FF74ADD4FF8FBDDCFF3977AFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF006395CDFFA8CFE5FF8CBFDDFF88BDDCFF85BADBFF81B7D9FF7EB4 D7FF7AB2D6FF94C1DDFF3F7CB4FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF006798D0FFABD1E7FF90C2DFFF8DC0DEFF8ABEDCFF87BBDBFF83B8 DAFF80B6D8FF99C4E0FF4580B8FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF006B9BD3FFAED4E8FFABD3E8FFAAD1E7FFA8CFE5FFA5CDE4FFA2CB E4FFA0C9E2FF9DC7E1FF4B84BCFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF006E9DD5FF6C9BD3FF699AD2FF6697CFFF6395CDFF6093CBFF5C90 C8FF598EC6FF558BC3FF5188C0FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } end end object mnuEdit: TMenuItem Caption = '&Edit' object miEditUndo: TMenuItem Action = actEditUndo Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000018A6C3691AA7C46900A0C4180000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000A0C45D66DBEAB211A6C2AE0000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000A0C42243C4DBFC43C5D8FE23A6C07F00000000000000000000 00000000000000000000000000000000000000A0C4FF00000000000000000000 000000000000000000000EAACBFE5DDAE9FE23A6C0EF00000000000000000000 000000000000000000000000000000A0C4FF00A0C4FF00000000000000000000 000000000000009EC11A02ACC8FF88E7F2FE11A2C2FF00000000000000000000 00000000000005797D1100A0C4FF76EDFBFF00A0C4FF000000000000000000A0 C4300099B95000A0C4C96DE6F5FF76E2EFFF19A3C1FF00000000000000000000 000005797D1100A0C4FF76EDFBFF76EDFBFF00A0C4FF00A0C4FF00A0C4FF00A0 C4FF01A9C4FF6EE1EEFF0FC9DFFF69E4F2FF1AA4C0F800000000000000000579 7D1100A0C4FF76EDFBFF04C3DAFF76EDFBFF69EAF9FF69EAF9FF69EAF9FF69EA F9FF05DDF7FF0AC8DFFF07C2D8FF6FDCEBFF1BA3BFF40000000005797E1100A0 C4FF79EDFBFF32E2F8FF2CDFF4FF04C0D6FF04C0D6FF04C0D6FF1DD2E8FF1DD2 E8FF1DD2E8FF0BC8DFFF6AE5F3FF1BABC5F815A0BCCB0000000000A0C4FFADF3 FBFF2FE0F6FF32E2F8FF32E2F7FF32E2F7FF2FE0F5FF29DBF1FF1DD2E8FF1DD2 E8FF1DD2E8FF36D9ECFF40CDE1FF16A1BDCA05797D0A0000000005797D0A00A0 C4FFADF3FBFF2FE0F6FF32E2F7FF29DBF1FF2FE0F5FF29DBF1FF16CDE3FF36D9 ECFF69E7F6FF41CEE3FE13A3C1E405797D320000000000000000000000000579 7D1100A0C4FFADF3FBFF31E1F6FF20E3FAFF73ECFAFF6FEBFAFF6EE8F7FF6CE8 F7F814A1BCD414A3C1D505797D1C000000000000000000000000000000000000 000005797D1100A0C4FFADF3FBFF25E4FBFF00A0C4FF00A0C4FF13A1BEE7159F BBCF1BA1BBA4067A7C0B00000000000000000000000000000000000000000000 00000000000005797D1100A0C4FFADF3FBFF00A0C4FF00000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000009DBF1400A0C4FF00A0C4FF00000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000A0C4FF00000000000000000000 0000000000000000000000000000000000000000000000000000 } OnClick = actEditUndoExecute end object miEditRedo: TMenuItem Action = actEditRedo Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 0000069A4E20069A4E6A069A4E5B069A4E1D04A8B70404A8B803000000000000 000000000000000000000000000000000000000000000000000000000000069A 4E5E0FA85A862CD6C09602999A8C069A4E0C0000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000069A 4EC123C7AFC6059D91CE069A4E48000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000069A 4EFF3ADDB8F5069A4EFE0000000000000000000000000000000000000000069A 4EFF069A4E33000000000000000000000000000000000000000000000000069A 4EFF37D9B3FD069A4EFF069A4E4800000000000000000000000000000000069A 4EFF069A4EFF069A4E330000000000000000000000000000000000000000069A 4EFF46E2BEFF05A699FF069A4EF1069A4E73069A4E300000000000000000069A 4EFF34E28AFF069A4EFF069A4E41000000000000000000000000000000000A9D 52F164ECB2FF24D6CDFF0BA193FE069A4EFF069A4EFF069A4EFF069A4EFF069A 4EFF1ED4CCFF34E28AFF069A4EFF069A4E410000000000000000000000000C9F 55DA63E9B1FF31E0BAFF17D4CBFF22D69BFF23DAA1FF23DAA1FF23DAA1FF23DA A1FF23DED9FF16D273FF34E28AFF069A4EFF069A4E410000000000000000069A 4E9E30C29DEA60EDB1FF26DFA5FF1AD7AFFF1AD7AFFF09D0C8FF14D077FF16D2 73FF16D273FF16D273FF16D273FF34E28AFF069A4EFF069A4E4100000000069A 4E2B069A4EBA46D8A9FF65EFB1FF24DEA4FF2ADD97FF24DBA0FF24DBA0FF1AD7 AFFF16D273FF16D273FF16D273FF18D375FF6CF3AEFF069A4EFF000000000000 0000069A4E4A069A4EC845D9ACFD67EFAFFF50E9A1FF24DBA0FF24DBA0FF24DB A0FF24DBA0FF16D273FF16D273FF6CF3AEFF069A4EFF0084773B000000000000 000000000000069A4E36069A4EB10C9B8FC449DEA9DD6AF1AEFF6BF2AEFF73F5 B3FF61EFA6FF16D273FF6CF3AEFF069A4EFF069A4E4100000000000000000000 00000000000000000000069A4E07069A4E46069A4E9E069A4ECF069A4EFF069A 4EFF6CF3AEFF6CF3AEFF069A4EFF069A4E410000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000069A 4EFF6CF3AEFF069A4EFF069A4E41000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000069A 4EFF069A4EFF069A4E4300000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000069A 4EFF069A4E330000000000000000000000000000000000000000 } OnClick = actEditRedoExecute end object miDivider8: TMenuItem Caption = '-' end object miEditCut: TMenuItem Action = actEditCut Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000001A1A AF5C0E0EAAE71010ABF41616ABF71A1AAF330000000000000000000000000000 00001A1AAF5C0D0DAAC30B0BAAEE0B0BA9E21A1AAF3300000000000000001313 ABDF2727DBFD1F1FD0F91D1DCEFD0707A8E61A1AAF3300000000000000001A1A AF330808AAE92222D4FD1D1DCFF91D1DCEFD1313ABE900000000000000000D0D ABF91D1DCFFA000000000B0BB5902121D3FD0C0CAAD500000000000000000909 AACB2323D6FD0D0DB895000000001F1FD1FB1111ABFA00000000000000001414 ABE62323D5FD0303A87A000000001D1DCEF50A0AA9FC00000000000000000303 A8FD1A1BCAF2000000000202A7772020D1FD1414ABE600000000000000001A1A AF5C0606A8FE1F1FD0FB0303A8B81415C0F80101A6FF00000000000AA00E1C1D CDFD1315C0F90303A8B71D1DCDFA0606A7FE1A1AAF7D00000000000000000000 00001919AE7D0707A9FD2020D2FD1E1ECEFE0E0FB7FD0205A4A40304A8FC1A1A C9FF2020D1FD1F1FCBFD0A0AA9FD1919AE5D0000000000000000000000000000 000000000000000000001818AE8D1616ABF30606A6FF454AA3FE0202A6FF191A C7FF1717ADF01818AE8900000000000000000000000000000000000000000000 0000000000000000000000000000888D8B5C848989FFC3C6C5FFAFB2B3FF2C2F 9CF5888D8B330000000000000000000000000000000000000000000000000000 00000000000000000000000000008A8F8DA1B7BBBAFDE6E8E7FFA7ACAAFF8B90 8EFE878C8A970000000000000000000000000000000000000000000000000000 00000000000000000000888D8B33888D8BFEDFE1E1FFF5F6F5FD979C9AFFA5A9 A8FF888D8BF7888D8B3300000000000000000000000000000000000000000000 000000000000000000008A8F8DE1B2B6B5FFF7F7F7FF888D8BF29CA09FFEB3B6 B5FFB5BAB8FD888D8BB200000000000000000000000000000000000000000000 000000000000878C8A39888D8BFFD9DCDBFFEFF0EFFE8E9391BD898E8C99B3B8 B6FFCBCECDFF888D8BFD888D8B7D000000000000000000000000000000000000 0000000000008A8F8DF3B0B5B3FFF6F7F7FE888D8BD79297957D000000008B90 8EFAC9CECCFFABAFAEFD888D8BD4000000000000000000000000000000000000 000000000000888D8BFED0D4D2FFEFF0EFFD8F9492AC0000000000000000878C 8A3FA7ACAAFFC3C8C6FF8A8F8DF7000000000000000000000000000000000000 0000000000008B908EF6F7F7F7FD888D8BB79297957D00000000000000000000 00008D9190E6D0D3D2FE8C918FBF000000000000000000000000000000000000 000000000000888D8B48888D8BEC909593D50000000000000000000000000000 0000888D8B978C918FEE00000000000000000000000000000000 } OnClick = actEditCutExecute end object miEditCopy: TMenuItem Action = actEditCopy Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 00000000000000000000898E8CA3868B89FF858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF858A88BF858A887F0000000000000000000000000000 00000000000000000000868B89FBF4F4F4FFF6F7F7FFF5F6F6FFFBFCFCFFFBFB FBFFD4D4D4FF969A98FFE2E4E3FF858A88FF858A887F00000000000000000000 00000000000000000000868B89FBF9FAFAFFEFF0F0FFEFF0F0FFEFF0F0FFFAFA FAFFFAFAFAFF959A98FFFAFAFAFFE2E3E3FF858A88FF858A88CC8B908F50868B 897F868B897F868B897F868B89FDFDFEFEFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFFAFAFAFF959A98FFFAFAFAFFF7F8F8FFE2E4E3FF858A88FF868B897DF2F3 F37FF3F4F47FF2F2F27F878C8AFDFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFEFF0F0FF898E8CFF898E8CFF898E8CFF898E8CFF858A88FF868B897DF9F9 F97FEBEBEB7FEAEAEA7F878C8AFDFFFFFFFFEFF0F0FFC6C7C7FFC6C7C7FFC6C7 C7FFC6C7C7FFC6C7C7FFEEEEEEFFF6F7F7FFC3C4C3FF858A88FF868B897DFEFE FE7FECECEC7FC3C4C47F868B89FDFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFEFF0F0FFEFF0F0FFEFF0F0FFFAFAFAFFF3F3F3FF858A88FF868B897DFFFF FF7FEDEEEE7FECEDED7F878C8AFDFFFFFFFFEFF0F0FFC6C7C7FFC6C7C7FFC6C7 C7FFC6C7C7FFC6C7C7FFEFF0F0FFEFF0F0FFFFFFFFFF858A88FF868B897DFFFF FF7FEEEFEF7FC5C6C67F868B89FDFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFFFFFFFFF858A88FF868B897DFFFF FF7FEFF0F07FEEEFEF7F878C8AFDFFFFFFFFEFF0F0FFC6C7C7FFC6C7C7FFC6C7 C7FFC6C7C7FFC6C7C7FFC6C7C7FFEFF0F0FFFFFFFFFF858A88FF868B897DFFFF FF7FEFF0F07FC7C8C87F868B89FDFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFFFFFFFFF858A88FF868B897DFFFF FF7FEFF0F07FEFF0F07F878C8AFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF858A88FF868B897DFFFF FF7FEFF0F07FC7C8C87F979B9AD0858A88FF858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF858A88FF858A88FF858A88FF8A8F8DAB868B897DFFFF FF7FEFF0F07FEEEFEF7FEEEFEF7FEEEFEF7FEEEFEF7FEEEFEF7FEFF0F07FEFF0 F07FFFFFFF7F858A887F00000000000000000000000000000000868B897DFFFF FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFF FF7FFFFFFF7F858A887F000000000000000000000000000000008A8F8D4F858A 887F858A887F858A887F858A887F858A887F858A887F858A887F858A887F858A 887F858A887F89918E5300000000000000000000000000000000 } OnClick = actEditCopyExecute end object miEditPaste: TMenuItem Action = actEditPaste Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000143 6B6401436CEE01446CFF01446CFF01446CFF01446CFF01446CFF01446CFF0144 6CFF01446CFF01446CFF01446CFF01436BED00426A5D0000000000426A040143 6CF3237FBAFF3B7DA7FF646F73FF686C6AFF686C6AFF686C6AFF686C6AFF686C 6AFF3D7CA3FF3D7CA3FF3D7CA3FF227BB3FF01436BF000426A0200426A100245 6EF82687C5FF636D70FFEDEEEDFFFEFEFEFFFEFEFEFFFEFEFEFFEEEFEFFFFDFE FEFF646967FF2787C5FF2787C5FF2787C5FF00426AFC00426A0800426A100245 6EF82687C5FF646866FFFFFFFFFFE4E7E7FFD5D8D8FFBEC2C1FFB4B7B7FFFFFF FFFFFFFFFFFF646967FF2787C5FF2886C2FF00426AFC00426A0800426A100245 6EF82687C5FF646866FFFFFFFFFFE7E9E9FFE5E7E7FFD6D9D9FFB6B9B9FFFFFF FFFFFFFFFFFFFFFFFFFF646967FF2886C2FF00426AFC00426A0800426A100246 6EF82687C5FF646866FFFFFFFFFFEAECECFFE8EAEAFFE6E8E8FFCBCECDFFB6BA B9FFB5B9B8FFFFFFFFFF646967FF2886C2FF00426AFC00426A0800426A100246 6EF82687C5FF646866FFFFFFFFFFEDEEEEFFEBECECFFE9EBEBFFE7E9E9FFD8DA DAFFCACDCCFFFFFFFFFF646967FF2886C2FF00426AFC00426A0800426A100246 6EF82687C5FF646866FFFFFFFFFFEFF0F0FFEEEFEFFFECEDEDFFEAEBEBFFE8EA EAFFD9DBDBFFFFFFFFFF646967FF2886C2FF00426AFC00426A0800426A100246 6EF82687C5FF646866FFFFFFFFFFEFF0F0FFB5B5B3FFB5B5B3FFB4B4B2FFB2B2 B1FFE8EAEAFFFFFFFFFF646967FF2886C2FF00426AFC00426A0800426A100246 6FF82687C5FF646866FFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEDEF EFFFEBEDEDFFFFFFFFFF646967FF2886C2FF00426AFC00426A0800426A100246 6FF82687C5FF646866FFFFFFFFFFEFF0F0FFB5B5B3FFB5B5B3FFB5B5B3FFB5B5 B3FFEEEFEFFFFFFFFFFF646967FF2886C2FF00426AFC00426A0800426A100246 6FF82788C6FF646866FFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFEFF0F0FFFFFFFFFF646967FF2886C2FF00426AFC00426A0800426A100246 6FF82788C6FF646F71FFF1F1F1FFE0E0E0FFBBBBBBFFBBBBBBFFBBBBBBFFBBBB BBFFE0E0E0FFF2F2F2FF646D6EFF2787C5FF00426AFC00426A0800426A040144 6DF32484C0FF3E7EA4FF646D70FF5E5E5EFF7C7F7FFF7D8080FF7D8080FF7B7E 7EFF5E5E5EFF646C6EFF407CA1FF237FB9FF01436CF000426A02000000000144 6C6401446DEE01446CFF03446BFF5B5C5CFF899595FF8A9797FF8A9797FF8995 95FF5B5C5CFF03446BFF01446CFF01446CED00436B5D00000000000000000000 000000000000000000005C5C5C015E5F5FBB5C5C5CFF5C5C5CFF5C5C5CFF5C5C 5CFF5E5F5FBB5C5C5C0100000000000000000000000000000000 } OnClick = actEditPasteExecute end object miEditDelete: TMenuItem Action = actEditDelete Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000008C90 8F99919493FFADB0AFFF0000000000000000909492FF9DA09FFD989C9AE50000 000000000000A5A8A7677B7E7DC9989B9AA40000000000000000000000008C90 8FFDFAFAFAFF949897F9999C9BD6999C9BEF969A98FFEDEEEEF1949997CB9B9E 9DFF989B9AFF8B8E8DFFFFFFFFDE8F9392BC0000000000000000000000008C90 8F99858988ECF6F6F6FB999C9BFFABADACFF838885E7DEDFDEED9C9F9EC6CCCE CDDB989B9AFFEBEBEBF0969998E6959797670000000000000000000000000000 0000858988EFC9CBCAA2838885E8C4C4C4E9838885F0CACCCBEB9B9D9CE8C0C0 C0DF7C807FFFE2E3E3F28B8E8DF0000000000000000000000000000000000000 0000727675FAC7C9C8EB797E7BE89E9F9EE98E8F8FF6ADAEADED8C8D8CF1AEAF AEE77C807FFFB7B8B7EB767978F5000000000000000000000000000000000000 00006A6E6DFFCCCDCDFA656968F4AAACABF96C6F6EFEAEB0AFFB6B6E6DFDB0B2 B1FA6E7271FDB2B3B3FB6C706FFD000000000000000000000000874920C0874A 20FF874A20FF874A20FF874A20FF874A20FF874A20FF874A20FF874A20FF874A 20FF874A20FF874A20FF874A20FF874A20FF874A20FF874920C0874A20FFDDBB 9CFFCF9F72FFCF9F72FFCF9F72FFCF9F72FFCF9F72FFCF9F72FFCF9F72FFCF9F 72FFCF9F72FFCF9F72FFCF9F72FFCF9F72FFDDBB9CFF874A20FF874A20FFDDBB 9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB 9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB9CFF874A20FF874A20FFDDBB 9CFFCA8A58FFCA8A58FFCA8A58FFCA8A58FFCA8A58FFCA8A58FFCA8A58FFCA8A 58FFCA8A58FFCA8A58FFCA8A58FFCA8A58FFDDBB9CFF874A20FF874A20FFDDBB 9CFF86522CFF86512BFF86512BFF86512BFF86512BFF86512BFF86522CFF8652 2CFF86522CFF86522CFF86522CFF86522CFFDDBB9CFF874A20FF874A20FFDDBB 9CFF6A5B4EFFC9C9C9FF9C9C9CFF9C9C9CFF9C9C9CFF9B9B9BFF9B9B9BFF9B9B 9BFF9B9B9BFF9B9B9BFF9B9B9BFF6A5B4EFFDDBB9CFF874A20FF874A20FFDDBB 9CFF777C7AFFD9D9D9FFBDBDBDFFBDBDBDFFBDBDBDFFBDBDBDFFBCBCBCFFBCBC BCFFBCBCBCFFBFBFBFFFC0C0C0FF777C7AFFDDBB9CFF874A20FF874A207F874A 20FF858A88FFE7E7E7FFD7D7D7FFD6D6D6FFD6D6D6FFD6D6D6FFD6D6D6FFD5D5 D5FFD5D5D5FFDADADAFFDCDCDCFF858A88FF874A20FF874A207F000000000000 0000858A88FFF1F1F1FFEBEBEBFFEBEBEBFFEBEBEBFFEAEAEAFFEAEAEAFFEAEA EAFFEAEAEAFFEAEAEAFFE9E9E9FF858A88FF0000000000000000000000000000 00008F9391BF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF858A88FF8F9391BF0000000000000000 } OnClick = actEditDeleteExecute end object miDivider9: TMenuItem Caption = '-' end object miEditSelectAll: TMenuItem Action = actEditSelectAll Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FFFFFF00898E 8C94858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF858A88FF858A88FF8A8F8D94FFFFFF00FFFFFF00858A 88FEF8F8F8FFF8F8F8FFF8F8F8FFF8F8F8FFF8F8F8FFF8F8F8FF000000FFF8F8 F8FF000000FFF8F8F8FFF8F8F8FFF8F8F8FF888D8BFEFFFFFF00FFFFFF00858A 88FFF9F9F9FFDBC3ADFFDCC4AEFFDDC5AFFFDEC6B0FFDFC7B1FFE0C8B2FF0000 00FFF7F7F7FFF9F9F9FFF8F8F8FFF7F7F7FF888D8BFFFFFFFF00FFFFFF00858A 88FFF9F9F9FFDBC3ADFFB09882FFB09882FFB09882FFB09882FFE0C8B2FF0000 00FFF7F7F7FFF8F8F8FFF7F7F7FFF7F7F7FF888D8BFFFFFFFF00FFFFFF00858A 88FFFAFAFAFFDBC3ADFFDCC4AEFFDDC5AFFFDEC6B0FFDFC7B1FFE0C8B2FF0000 00FFF5F5F5FFF6F6F6FFF6F6F6FFF7F7F7FF888D8BFFFFFFFF00FFFFFF00858A 88FFFBFBFBFFDBC3ADFFDCC4AEFFDDC5AFFFDEC6B0FFDEC6B0FF000000FFE0C8 B2FF000000FFE1C9B3FFF4F4F4FFF7F7F7FF888D8BFFFFFFFF00FFFFFF00858A 88FFFBFBFBFFDAC2ACFFAF9781FFAF9781FFAF9781FFAF9781FFAF9781FFAF97 81FFAF9781FFE0C8B2FFF2F2F2FFF7F7F7FF888D8BFFFFFFFF00FFFFFF00858A 88FFFCFCFCFFDAC2ACFFDBC3ADFFDCC4AEFFDDC5AFFFDDC5AFFFDEC6B0FFDEC6 B0FFDFC7B1FFDFC7B1FFF0F0F0FFF8F8F8FF888D8BFFFFFFFF00FFFFFF00858A 88FFFCFCFCFFDAC2ACFFDAC2ACFFDBC3ADFFDCC4AEFFDDC5AFFFDDC5AFFFDEC6 B0FFDEC6B0FFDEC6B0FFEEEEEEFFF8F8F8FF888D8BFFFFFFFF00FFFFFF00858A 88FFFCFCFCFFD9C1ABFFAF9781FFAF9781FFAF9781FFAF9781FFDCC4AEFFAF97 81FFAF9781FFDDC5AFFFECECECFFF8F8F8FF888D8BFFFFFFFF00FFFFFF00858A 88FFFDFDFDFFD8C0AAFFAF9781FFAF9781FFAF9781FFAF9781FFDBC3ADFFDCC4 AEFFDCC4AEFFDCC4AEFFEBEBEBFFF8F8F8FF888D8BFFFFFFFF00FFFFFF00858A 88FFFDFDFDFFD8C0AAFFAF9781FFAF9781FFAF9781FFAF9781FFDBC3ADFFDBC3 ADFFDBC3ADFFDBC3ADFFDBC3ADFFF8F8F8FF888D8BFFFFFFFF00FFFFFF00858A 88FFFEFEFEFFD7BFA9FFAF9781FFAF9781FFAF9781FFAF9781FFDAC2ACFFAF97 81FFAF9781FFAF9781FFDAC2ACFFF8F8F8FF888D8BFFFFFFFF00FFFFFF00858A 88FFFDFDFDFFD6BEA8FFD7BFA9FFD7BFA9FFD8C0AAFFD8C0AAFFD9C1ABFFD9C1 ABFFD9C1ABFFD9C1ABFFD9C1ABFFF8F8F8FF888D8BFFFFFFFF00FFFFFF00858A 88FEFDFDFDFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFDFFFCFCFCFFFCFCFCFFFBFB FBFFFBFBFBFFFAFAFAFFFAFAFAFFF9F9F9FF888D8BFEFFFFFF00FFFFFF00898D 8B94858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF858A88FF858A88FF898E8C94FFFFFF00 } OnClick = actEditSelectAllExecute end end object mnuOptions: TMenuItem Caption = '&Options' object miAutoCompare: TMenuItem Action = actAutoCompare AutoCheck = True end object miDivider10: TMenuItem Caption = '-' end object miIgnoreWhiteSpace: TMenuItem Action = actIgnoreWhiteSpace AutoCheck = True end object miIgnoreCase: TMenuItem Action = actIgnoreCase AutoCheck = True end object miDivider4: TMenuItem Caption = '-' end object miPaintBackground: TMenuItem Action = actPaintBackground AutoCheck = True OnClick = actPaintBackgroundExecute end object miLineDifferences: TMenuItem Action = actLineDifferences AutoCheck = True end object miDivider3: TMenuItem Caption = '-' end object miBinaryCompare: TMenuItem Action = actBinaryCompare AutoCheck = True OnClick = actBinaryCompareExecute end object miKeepScrolling: TMenuItem Action = actKeepScrolling AutoCheck = True OnClick = actKeepScrollingExecute end end object mnuActions: TMenuItem Caption = '&Actions' object miStartCompare: TMenuItem Action = actStartCompare Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004753BC504733A65FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004733AFF18844DF504763BAB04733A0CFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004733AFF7BD3A6FF36A16AF804763CE10473 3A2DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004733AFF81D7ABFF6CD5A0FF58C18BFE0A79 40F504743A65FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004743AE80473 3AFF04733AFF04733AFF04733AFF04783CF781D6ABFF11BA64FF52D392FF73D7 A5FF1E8B53F504763CAC04733A0CFFFFFF00FFFFFF00FFFFFF0004733AFF7ECA A3FF7ECAA3FF7ECAA3FF7ECCA4FF7FD1A7FF81D5AAFF0EB761FF10BF66FF34CB 7FFF78DAA8FF3EA671F904763BE104733A2DFFFFFF00FFFFFF0004733AFF7ECA A3FF069A4EFF069A4EFF069C4FFF08A454FF0BAC5AFF0DB35EFF0EB962FF0FBC 64FF1CBF6CFF67D29CFF5DBB8BFE0E7A42F504733A65FFFFFF0004733AFF7ECA A3FF069A4EFF069A4EFF069A4EFF07A052FF09A757FF0BAE5BFF0EB25FFF17B8 66FF1FBA6CFF26BA6FFF55C68DFF76C99EFF268956F504753B9D04733AFF9CD7 B9FF3BAF74FF33AC6EFF2BA968FF2FAC6BFF3DB678FF49BE82FF50C389FF4DC4 88FF49C284FF44BE80FF6DCA9BFF89CEAAFF308F5EF604753B9D04733AFFA3D9 BDFF54B985FF58BB88FF5BBC8BFF5CBD8BFF5CBE8CFF5CC18DFF5AC28DFF55C2 8AFF58C38CFF8CD4AFFF7AC39CFE147C46F504733A65FFFFFF0004733AFFA7DB C0FFAADCC2FFADDDC5FFAFDEC6FFB0DEC7FFB0DEC7FF64C191FF61C18FFF73C8 9DFF9FD9BBFF5AAB81FA05743AE104733A2DFFFFFF00FFFFFF0004743AE80473 3AFF04733AFF04733AFF04733AFF04763BF7B6E0CBFF6FC499FF91D2B1FF9CD4 B7FF318F5FF604743BAC04733A0CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004733AFFBBE3CEFFABDCC3FF84C6A4FE107A 43F504733A65FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004733AFFB7E1CBFF5AAB82F904743AE10473 3A2DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004733AFF2A8C59F604743AAB04733A0CFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004753BC504733A65FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } end object miCancelCompare: TMenuItem Action = actCancelCompare Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 00000000000000008606000089BB000086FF000086FF000086FF000086FF0000 86FF000086FF000088CF0000860F000000000000000000000000000000000000 000000008606000089BB1A1AB1F84A4AECFF4747EDFF4343EBFF3F3FEAFF3B3B E8FF3737E7FF1818BCFB000088D8000086140000000000000000000000000000 8606000089BB1D1DB4F84C4CEBFF0F0FCCFF0000C3FF0000C1FF0000BFFF0000 BDFF0505BFFF2D2DDFFF1919BFFC000088DF0000861A00000000000086060000 89BB2121B7F85252EDFF1010D0FF0000C7FF0000C5FF0000C3FF0000C1FF0000 BFFF0000BDFF0505BEFF2C2CDFFF1B1BC4FC000088E600008620000089BC2424 B8F95A5AEFFF1111D3FF0101CBFF5858D6FF0303C7FF0000C5FF0000C3FF0101 C1FF5F5FD6FF0202BDFF0404BEFF2B2BDFFF1D1DC7FD000087EB020288FF6969 F2FF2323D5FF1F1FD2FF9292DEFFECECECFFAAAAE4FF2F2FD0FF2828CEFFA5A5 E9FFFEFEFEFF9696E3FF0000BDFF0303BDFF3434E6FF020289FF030389FF8585 F5FF2F2FD5FF2F2FD5FF5B5BD7FFDFDFE5FFECECECFFAAAAE4FFA5A5E6FFF9F9 F9FFF7F7FCFF6767DAFF1A1AC5FF0202BDFF3737E8FF020289FF030389FF8888 F6FF2F2FD5FF2F2FD5FF2F2FD5FF5B5BD8FFDFDFE6FFECECECFFF1F1F1FFEDED F3FF6464DAFF2F2FCEFF2F2FCCFF2929C9FF4545E9FF020289FF030389FF8888 F6FF2F2FD5FF2F2FD5FF2F2FD5FF3030D5FFACACDEFFE8E8E8FFECECECFFBCBC E8FF3131D1FF2F2FCFFF2F2FCEFF2F2FCCFF6161ECFF020289FF030389FF8888 F6FF2F2FD5FF2F2FD5FF3030D5FF9999D8FFDFDFDFFFDEDEE2FFDFDFE6FFECEC ECFFABABE6FF3131D2FF2F2FD0FF2F2FCEFF6565EDFF020289FF020288FF8989 F6FF4040DBFF2F2FD5FF9292D8FFDBDBDBFFD6D6DAFF6060D7FF5A5AD8FFE0E0 E6FFEDEDEDFFA5A5E5FF2F2FD2FF3B3BD6FF6868EEFF020288FF000089B42626 B3F78383F3FF4141DBFF5757D7FFCDCDDAFF5F5FD7FF2F2FD5FF2F2FD5FF5C5C D8FFD9D9E6FF5F5FDBFF3B3BD9FF6A6AEFFF1818B0F7000089AE33339E050000 89B22424B2F78383F3FF4242DCFF3737D5FF2F2FD5FF2F2FD5FF2F2FD5FF2F2F D5FF3737D5FF3B3BDAFF6F6FF0FF1B1BB1F7000089B13F3FA404000000003F3F A404000089B12222B1F78383F3FF4242DCFF2F2FD5FF2F2FD5FF2F2FD5FF2F2F D5FF3C3CDBFF7575F1FF1F1FB4F8000089B50000860400000000000000000000 00003F3FA404000089AF2222AFF78888F6FF8B8BF7FF8B8BF7FF8A8AF6FF8787 F6FF8383F5FF2323B8F8000089B8000086040000000000000000000000000000 0000000000003F3FA404000089AD000086FF000086FF000086FF000086FF0000 86FF000086FF000089BC00008605000000000000000000000000 } end object miDivider1: TMenuItem Caption = '-' end object miNextDiff: TMenuItem Action = actNextDifference Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004763C9D04763C9DFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733A65248B56F5248B56F50473 3A65FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004733A2D0E7A42F674D1A2FF75D3A3FF0E7B 42F604733A2DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733A0C04763BE15DBF8DFE4CD18DFF4ED590FF5FC5 92FE04763CE104733A0CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004753BAC4CAA7AFA6DD6A0FF12C469FF14CB6EFF6CE0 A5FF3FA872F904763CABFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF0004733A65268C57F594DBB7FF31C379FF11C067FF12C56AFF1FC9 73FF78DBA8FF1E8952F504733A65FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF0004733A2D0D7840F690D3B1FF65CC98FF3BC27DFF0FB962FF0FBC65FF10BD 65FF32C57BFF71CE9FFF0A783FF604733A2DFFFFFF00FFFFFF00FFFFFF000473 3A0C04743AE175BF99FE83D1A9FF52C289FF4DC387FF1EB669FF0DB45FFF0DB4 5FFF0DB35EFF4EC589FF55B784FE04753BE104733A0CFFFFFF00FFFFFF000474 3BAC4FA57AF89BD6B8FF5DBE8DFF58C08AFF51C087FF42BC7EFF0CAB5AFF0BAB 59FF0AAA59FF0CA958FF68C797FF349A65F804743BABFFFFFF0004733A652789 56F6AADBC2FFAFDEC6FFADDDC5FFAADCC2FF56BD88FF4DBA82FF1FAA63FF08A2 53FF7FCEA5FF7ECDA4FF7ECCA4FF78C79FFF18824BF504733A6504753BC50473 3AFF04733AFF04733AFF04763BF7ADDDC5FF59BC89FF50B882FF34AD6FFF069A 4EFF7ECAA3FF04763BF704733AFF04733AFF04733AFF04753BC5FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733AFFB0DEC7FF5DBD8CFF54B985FF47B47CFF069A 4EFF7ECAA3FF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733AFFB1DFC7FF5FBE8DFF55BA86FF41B278FF069A 4EFF7ECAA3FF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733AFFB1DFC8FF5FBE8DFF55BA86FF37AE71FF069A 4EFF7ECAA3FF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733AFFB0DEC7FFABDCC3FFA6DABFFF91D2B1FF7ECA A3FF7ECAA3FF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004743AE804733AFF04733AFF04733AFF04733AFF0473 3AFF04733AFF04743AE8FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } end object miPrevDiff: TMenuItem Action = actPrevDifference Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF0004743AE804733AFF04733AFF04733AFF04733AFF0473 3AFF04733AFF04743BE8FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733AFFA5DFC1FF81D5AAFF81D7ABFF82D9ACFF82DA ADFF82D9ADFF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733AFFA9E2C5FF16B665FF0FBA63FF10BE66FF11C1 67FF83DEB0FF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733AFFADE4C8FF1FBD6DFF10BF66FF12C56AFF13C9 6DFF84E3B3FF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733AFFB0E5CAFF31C378FF11C067FF13C86CFF15CF 71FF85E5B4FF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF0004753BC50473 3AFF04733AFF04733AFF04783CF7B2E6CBFF4BC989FF10BD65FF11C369FF12C7 6BFF84E1B2FF057A3EF704733AFF04733AFF04733AFF04753BC504733A65288B 58F6B5E0CAFFBCE5D0FFB8E5CEFFB3E5CBFF63CD97FF19BA68FF0FBC64FF10BE 65FF83DCAFFF82DBAEFF82D9ACFF7BD3A6FF18844CF504733A65FFFFFF000474 3BAC56A97FF9B0DFC7FF77CBA0FF6CCA9AFF63CA96FF43C181FF0DB35EFF0DB5 5FFF0DB45FFF0FB25FFF6ACE9BFF359C67F804753BABFFFFFF00FFFFFF000473 3A0C04743AE180C4A1FE97D5B5FF69C596FF60C591FF56C38BFF1DB066FF0BAC 59FF0BAB59FF4DC185FF55B484FE04753BE104733A0CFFFFFF00FFFFFF00FFFF FF0004733A2D0D7840F69CD4B7FF7AC9A0FF5ABE8BFF51BC86FF38B474FF08A3 53FF2CAF6CFF6EC397FF0A773EF604733A2DFFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF0004733A65288A57F6A0D7BBFF5FBD8CFF4DB680FF44B37AFF1AA2 5CFF71C49AFF1D844FF504733A65FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004743BAC4EA578FA91D2B0FF48B47DFF3FB176FF6AC2 95FF3B9C6AF904743AABFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733A0C04743AE172BD96FE72C59AFF6AC295FF5BB3 86FE04743AE104733A0CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004733A2D0F7941F687CAA7FF7EC7A2FF0E79 41F604733A2DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733A65288957F5268956F50473 3A65FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004753B9D04753B9DFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } end object miDivider2: TMenuItem Caption = '-' end object miFirstDiff: TMenuItem Action = actFirstDifference Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF0004743AE804733AFF04733AFF04733AFF04733AFF0473 3AFF04733AFF04753BE8FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733AFFA1DCBEFF81D3A9FF81D5AAFF81D7ACFF82D9 ADFF82DAADFF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733AFFA5DEC1FF14B161FF0DB560FF0FBB63FF10BF 66FF83DEB0FF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733AFFA9E1C5FF1BB668FF0EB962FF10C067FF12C6 6BFF84E3B3FF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733AFFADE2C7FF2EBD74FF0FBA63FF11C168FF13C8 6CFF85E6B5FF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF0004753BC50473 3AFF04733AFF04733AFF04773CF7AFE3C8FF47C384FF0EB861FF10BE66FF11C3 69FF84E1B2FF057A3EF704733AFF04733AFF04733AFF04763BC504733A65288B 58F6B3DFC9FFB9E2CDFFB5E2CBFFB1E2C9FF5FC992FF18B665FF0EB861FF0FBB 64FF83DCAFFF83DCAFFF82DBAEFF7CD5A8FF19844DF504733A65FFFFFF000474 3BAC57A97FF9B0DFC7FF75C79DFF6AC697FF60C692FF41BE7EFF0CB05CFF0DB3 5EFF0DB45FFF0FB460FF6ACF9BFF359D68F804753BABFFFFFF00FFFFFF000473 3A0C04743AE183C5A3FE99D5B6FF69C395FF5FC18FFF56C18AFF1CAE63FF0AAA 58FF0BAB59FF4DC286FF55B584FE04753BE104733A0CFFFFFF00FFFFFF00FFFF FF0004733A2D0D7840F69ED4B8FF7CCAA2FF5CBD8BFF53BB85FF37B173FF08A1 53FF2CAF6CFF6EC397FF0A773EF604733A2DFFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF0004733A65298B58F6A2D8BCFF62BE8FFF4FB782FF45B37BFF1AA2 5CFF71C49AFF1D844FF504733A65FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004743BAC4FA679FA93D3B2FF4BB67FFF42B279FF6BC2 96FF3B9C6AF904743AABFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733A0C04743AE173BD97FE74C69CFF6CC396FF5CB3 86FE04743AE104733A0CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004733A2D0F7941F689CCA9FF7FC8A2FF0E79 41F604733A2DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733AFF0473 3AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF0473 3AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF0473 3AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF0473 3AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF } end object miLastDiff: TMenuItem Action = actLastDifference Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 200000000000000400006400000064000000000000000000000004733AFF0473 3AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF0473 3AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF0473 3AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF0473 3AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFFFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004733A000E7A42F674D1A2FF75D3A3FF0E7B 42F604733A00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733A0004763BE15DBF8DFE4CD18DFF4ED590FF5FC5 92FE04763CE104733A00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004753BAC3DA36FF969D59EFF12C469FF14CB6EFF6CE0 A5FF3FA872F904763CABFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF0004733A00238A56F578D2A5FF1CBD6BFF11C067FF12C56AFF1FC9 73FF78DBA8FF1E8952F504733A00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF0004733A000B773EF68FD3B0FF5BC891FF0DB45FFF0FB962FF0FBC65FF10BD 65FF32C57BFF71CE9FFF0A783FF604733A00FFFFFF00FFFFFF00FFFFFF000473 3A0004743AE173BF98FE87D2ACFF56C38CFF30BA74FF0CB15DFF0DB45FFF0DB4 5FFF0DB35EFF4EC589FF55B784FE04753BE104733A00FFFFFF00FFFFFF000474 3BAC4DA478F89ED7BAFF61C090FF5BC18DFF55C18AFF3AB978FF11AD5EFF0BAB 59FF0AAA59FF0CA958FF68C797FF349A65F804743BABFFFFFF0004733A002789 56F6ACDCC4FFB2DFC8FFB0DEC7FFACDDC4FF58BD89FF4EBB84FF43B87CFF0FA4 58FF7FCEA5FF7ECDA4FF7ECCA4FF78C79FFF18824BF504733A0004753BC50473 3AFF04733AFF04733AFF04763BF7AFDEC6FF5BBC8BFF52B884FF47B47CFF35AD 70FF7FCBA4FF04763BF704733AFF04733AFF04733AFF04753BC5FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733AFFB0DFC7FF5EBE8DFF54B985FF49B57DFF3EB0 76FF85CDA9FF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733AFFB1DFC7FF5EBE8DFF55BA86FF4AB57EFF3FB1 76FF8ACFACFF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733AFFB0DFC7FF5DBD8CFF54B985FF49B57DFF3EB0 76FF8FD1AFFF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004733AFFAEDEC6FFAADCC2FFA4DABEFF9FD8BBFF9AD6 B7FF93D3B2FF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004743AE804733AFF04733AFF04733AFF04733AFF0473 3AFF04733AFF04743AE8FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } end object miDivider5: TMenuItem Caption = '-' end object miCopyLeftToRight: TMenuItem Action = actCopyLeftToRight Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004763BC504733A00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733AFF04733AFFFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004733AFF19854DF504763CAB04733A00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733AFF04733AFFFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004733AFF7DD9AAFF36A46CF804763CE10473 3A00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733AFF04733AFFFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004733AFF83DDAFFF6EDCA5FF59C48DFE0A79 3FF504733A00FFFFFF00FFFFFF00FFFFFF0004733AFF04733AFF04743AE80473 3AFF04733AFF04733AFF04733AFF04793DF783DDAFFF15C86DFF55DC97FF73D6 A3FF1E8952F504763BAC04733A00FFFFFF0004733AFF04733AFF04733AFF7ECA A3FF7ECAA3FF7FCFA6FF80D4A9FF81D8ACFF83DCAFFF12C46AFF13C86CFF35CC 80FF77D7A6FF3DA36EF904753BE104733A0004733AFF04733AFF04733AFF7ECA A3FF069A4EFF08A152FF0AA958FF0CB15DFF0EB862FF10BE66FF11C067FF10BE 66FF1BBB6AFF66CE99FF5BB889FE0E7942F504733AFF04733AFF04733AFF7ECA A3FF069A4EFF079E50FF09A656FF0BAD5AFF0DB35EFF0EB761FF16BB66FF1FBC 6CFF2ABC71FF30B973FF60C592FF7FC9A3FF04733AFF04733AFF04733AFF8ACF ACFF16A059FF149F58FF18A75EFF26B26AFF35BB76FF45C283FF4BC688FF4DC5 88FF4DC387FF4CBF84FF76CB9FFF92D0B0FF04733AFF04733AFF04733AFF90D1 B0FF30AB6CFF37AE71FF3DB276FF45B87DFF4BBE83FF50C187FF53C38BFF56C3 8CFF60C591FF94D6B4FF81C5A2FE177E49F504733AFF04733AFF04733AFF93D3 B2FF96D4B4FF9AD6B7FF9ED7BAFFA1D9BDFFA4DCC0FF58C08AFF5CC28EFF76CB 9FFFA4DBBFFF60AF86FA06753BE104733A0004733AFF04733AFF04743AE80473 3AFF04733AFF04733AFF04733AFF04763BF7A9DBC1FF5FBE8EFF8DD2AFFFA0D6 BAFF359162F604743BAC04733A00FFFFFF0004733AFF04733AFFFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004733AFFABDCC3FFA0D8BCFF84C6A4FE117B 44F504733A00FFFFFF00FFFFFF00FFFFFF0004733AFF04733AFFFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004733AFFA7DBC0FF55A97EF804743AE10473 3A00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733AFF04733AFFFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004733AFF278956F604743AAB04733A00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733AFF04733AFFFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004753BC504733A00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733AFF04733AFF } end object miCopyRightToLeft: TMenuItem Action = actCopyRightToLeft Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 200000000000000400006400000064000000000000000000000004733AFF0473 3AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3A0004763CC5FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733AFF0473 3AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733A0004763BAC1986 4EF504733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733AFF0473 3AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF0004733A0004753BE136A16AF87EDB ACFF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733AFF0473 3AFFFFFFFF00FFFFFF00FFFFFF0004733A000A783FF555B987FE6CD59FFF84E0 B1FF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733AFF0473 3AFFFFFFFF0004733A0004743BAC1D8550F56EC699FF4EC78AFF11BB64FF84E0 B1FF057B3FF704733AFF04733AFF04733AFF04733AFF04743AE804733AFF0473 3AFF04733A0004743AE13B9C6AF972C79CFF2DB470FF0CB05CFF0EB962FF83DE B0FF84E1B2FF84E1B2FF83DEB0FF82DAADFF81D6AAFF04733AFF04733AFF0473 3AFF0E7941F65AB285FE62BF8FFF13A259FF09A555FF0BAD5AFF0DB55FFF0FBB 64FF10BF66FF10BF66FF0FBB63FF0DB45FFF80D4A9FF04733AFF04733AFF0473 3AFF7EC7A1FF5DBD8CFF2BA968FF23A562FF1AA85FFF11AB5DFF0CB05CFF0DB5 60FF0EB862FF0EB861FF0DB55FFF0CAF5CFF80D2A8FF04733AFF04733AFF0473 3AFF8FCEAEFF73C69CFF48B47DFF49B57DFF4BB780FF4BBC83FF46BF81FF37BC 79FF2ABA71FF1EB569FF1BB365FF1DB065FF8ED5B0FF04733AFF04733AFF0473 3AFF177E48F680C3A0FE92D2B1FF5DBC8BFF55BA86FF54BD87FF52BF87FF4FC0 87FF4CC085FF46BE81FF3FBA7CFF39B576FF94D5B4FF04733AFF04733AFF0473 3AFF04733A0006753BE15FAE86FAA3D9BDFF75C79DFF5DBD8CFF5BBE8BFFA8DD C2FFA5DDC0FFA2DBBEFF9ED9BBFF9AD7B8FF96D4B4FF04733AFF04733AFF0473 3AFFFFFFFF0004733A0004743BAC359162F6A1D6BBFF90D2B0FF64C091FFABDD C3FF04763BF704733AFF04733AFF04733AFF04733AFF04743AE804733AFF0473 3AFFFFFFFF00FFFFFF00FFFFFF0004733A00127C45F587C7A6FEA5DABEFFAFDE C6FF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733AFF0473 3AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF0004733A0004743AE158AA81F9ACDC C4FF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733AFF0473 3AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733A0004743BAC288B 58F604733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733AFF0473 3AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3A0004753BC5FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } end end object mnuEncoding: TMenuItem Caption = 'En&coding' object miEncodingLeft: TMenuItem Caption = '&Left' end object miEncodingRight: TMenuItem Caption = '&Right' end end object miAbout: TMenuItem Action = actAbout end end object ActionList: TActionList Images = ImageList left = 16 top = 136 object actSave: TAction Caption = 'Save' Hint = 'Save' ImageIndex = 0 OnExecute = actSaveExecute end object actSaveAs: TAction Caption = 'Save as...' Hint = 'Save as...' ImageIndex = 1 OnExecute = actSaveAsExecute end object actStartCompare: TAction Caption = 'Compare' Hint = 'Compare' ImageIndex = 2 OnExecute = actStartCompareExecute end object actLastDifference: TAction Caption = 'Last Difference' Hint = 'Last Difference' ImageIndex = 3 OnExecute = actExecute end object actNextDifference: TAction Caption = 'Next Difference' Hint = 'Next Difference' ImageIndex = 4 OnExecute = actExecute end object actPrevDifference: TAction Caption = 'Previous Difference' Hint = 'Previous Difference' ImageIndex = 5 OnExecute = actExecute end object actFirstDifference: TAction Caption = 'First Difference' Hint = 'First Difference' ImageIndex = 6 OnExecute = actExecute end object actIgnoreCase: TAction Category = 'Options' AutoCheck = True Caption = 'Ignore Case' DisableIfNoHandler = False OnExecute = actIgnoreCaseExecute end object actIgnoreWhiteSpace: TAction Category = 'Options' AutoCheck = True Caption = 'Ignore Blanks' DisableIfNoHandler = False OnExecute = actIgnoreCaseExecute end object actKeepScrolling: TAction AutoCheck = True Caption = 'Keep Scrolling' Checked = True OnExecute = actKeepScrollingExecute end object actCancelCompare: TAction Caption = 'Cancel' Hint = 'Cancel' ImageIndex = 7 OnExecute = actCancelCompareExecute end object actBinaryCompare: TAction Category = 'Options' AutoCheck = True Caption = 'Binary Mode' OnExecute = actBinaryCompareExecute end object actPaintBackground: TAction Category = 'Options' AutoCheck = True Caption = 'Paint Background' Checked = True OnExecute = actPaintBackgroundExecute end object actCopyLeftToRight: TAction Caption = 'Copy Block Right' Hint = 'Copy Block Right' ImageIndex = 21 OnExecute = actExecute end object actCopyRightToLeft: TAction Caption = 'Copy Block Left' Hint = 'Copy Block Left' ImageIndex = 20 OnExecute = actExecute end object actSaveLeft: TAction Caption = 'Save Left' Hint = 'Save Left' ImageIndex = 9 OnExecute = actExecute end object actSaveRight: TAction Caption = 'Save Right' Hint = 'Save Right' ImageIndex = 9 OnExecute = actExecute end object actReload: TAction Caption = '&Reload' Hint = 'Reload' ImageIndex = 8 OnExecute = actExecute end object actOpenLeft: TAction Caption = 'Open Left...' ImageIndex = 11 OnExecute = actOpenLeftExecute end object actOpenRight: TAction Caption = 'Open Right...' ImageIndex = 11 OnExecute = actOpenRightExecute end object actExit: TAction Caption = 'E&xit' ImageIndex = 12 OnExecute = actExecute end object actEditCut: TAction Category = 'Edit' Caption = 'Cut' ImageIndex = 15 OnExecute = actEditCutExecute end object actEditCopy: TAction Category = 'Edit' Caption = 'Copy' ImageIndex = 16 OnExecute = actEditCopyExecute end object actEditPaste: TAction Category = 'Edit' Caption = 'Paste' ImageIndex = 17 OnExecute = actEditPasteExecute end object actEditDelete: TAction Category = 'Edit' Caption = 'Delete' ImageIndex = 18 OnExecute = actEditDeleteExecute end object actEditSelectAll: TAction Category = 'Edit' Caption = 'Select &All' ImageIndex = 19 OnExecute = actEditSelectAllExecute end object actEditRedo: TAction Category = 'Edit' Caption = 'Redo' ImageIndex = 14 OnExecute = actEditRedoExecute end object actEditUndo: TAction Category = 'Edit' Caption = 'Undo' ImageIndex = 13 OnExecute = actEditUndoExecute end object actSaveLeftAs: TAction Caption = 'Save Left As...' Hint = 'Save Left As...' ImageIndex = 10 OnExecute = actSaveLeftAsExecute end object actSaveRightAs: TAction Caption = 'Save Right As...' Hint = 'Save Right As...' ImageIndex = 10 OnExecute = actSaveRightAsExecute end object actAbout: TAction Caption = 'About' OnExecute = actAboutExecute end object actLineDifferences: TAction Category = 'Options' AutoCheck = True Caption = 'Line Differences' OnExecute = actLineDifferencesExecute end object actAutoCompare: TAction Category = 'Options' AutoCheck = True Caption = 'Auto Compare' DisableIfNoHandler = False end end object ImageList: TImageList left = 200 top = 136 Bitmap = { 4C6916000000100000001000000077856C7C91794D7E8B67386F8B67388C8B67 38D48B6738FF8A693DF880714AE57A7858850000000000000000000000000000 00000000000000000000000000009270425EBB96627ED1AD815DE6CEB1CDEFDF D0FFECDBC5FFDFC29BFFA08B68FD886E43FD5A7F6A1B00000000000000000000 0000000000000000000000000000887F6B96737166FF757062FF856D4AFF9A74 41FF9F7844FFD9BF9EFFEBD9C1FFAF8651FF7D6A4EFF6B706E006B706E006B70 6E006B706E006B706E006B706E006E716BFFDDE6E2FFFFFFFFFFD6E1DDFFDDD6 C9FFB6996EFF8B6738FFE2CBABFFD3B792FF9B7D54FFE5DFD5FFFFFFFFFFFFFF FFFFFFFFFFFFF4F4F4FF6B706E006B7572FFFDFDFDFFEEEEEEFFEDEDEDFFDEE2 DFFFB09877FF8B6738FFCAA779FFCEB38FFF8E6B3DFFC3BCACFFEEEDEDFFEEEE EDFFEDEEEDFFF3F4F3FF6B706E006B706E00FCFBFCFFECECEBFF8B6738FF8B67 38FF8B6738FF8B6738FFCAA779FFBD9258FF8B6738FF8B6738FF8B6738FF8B67 38FFECECECFFF3F3F3FF6B706E006B706E00FAFAFAFFEAE9E9FFC4CFCAFF8B67 38FFDCBF98FFBF9F71FFBF9F71FFBF9F71FFC09F73FFD8BB96FF8B6738FFAFA9 95FFEAE9EAFFF2F2F2FF6B706E006B706E00F9F9F9FFFAFAFAFFE4E4E4FFBFCB C5FF8B6738FFDCBF98FFC09F73FFC09F73FFDFC8ABFF8B6738FFACA692FFE4E4 E4FFF4F4F4FFF1F1F1FF6B706E006B706E00F9F9F9FFEEEEEEFFFAFAFAFFE4E4 E4FFBFCBC5FF8B6738FFE3CBACFFDCBF98FF8F6B3BFFACA692FFE4E4E4FFFAFA FAFFEEEEEEFFF1F1F1FF6B706E006B706E00F7F7F7FFE3E3E3FFEEEEEEFFFAFA FAFFFAFAFAFFC8D4CEFF8E6C3FFF8B6738FFB4AE9AFFFAFAFAFFFCFCFCFFEEEE EEFFE3E3E3FFF0F0F0FF6B706E006B706E00FEFEFEFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4FFF4F4F4FFEBEBEBFFEBEB EBFFE3E3E3FFF0F0F0FF6B706E006B706E00CECECEFFC9C9C9FFC9C9C9FFC9C9 C9FFC9C9C9FFC5C5C5FFC9C9C9FFC9C9C9FFC5C5C5FFC5C5C5FFC5C5C5FFC5C5 C5FFC5C5C5FFD6D6D6FF6B706E006B706E00CECECEFFC5C5C5FF9F9F9FFFAFAF AFFFBCBCBCFFC4C4C4FFC8C8C8FFD0D0D0FFA9A9A9FFD2D2D2FFA9A9A9FFD2D2 D2FFB9B9B9FFCACACAFF6B706E006B706E00CDCDCDFFC3C3C3FFA9AAAAFFB4B4 B4FFC2C2C2FFC4C4C4FFC8C8C8FFCBCBCBFFA8A7A8FFD1D1D1FFA7A7A8FFD1D1 D1FFB6B6B7FFCACACAFF6B706E006B706E00DDDDDDFFDCDCDCFFDCDCDCFFDCDC DCFFD5D5D5FFD5D5D5FFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCF CFFFCFCFCFFFCACACAFF6B706E006B706E006B706E006B706E006B706E006B70 6E006B706E006B706E006B706E006B706E006B706E006B706E006B706E006B70 6E006B706E006B706E006B706E0077856C7C91794D7E8B67386F8B67388C8B67 38D48B6738FF8A693DF880714AE57A7858850000000000000000000000000000 00000000000000000000000000009270425EBB96627ED1AD815DE6CEB1CDEFDF D0FFECDBC5FFDFC29BFFA08B68FD886E43FD5A7F6A1B00000000000000000000 0000000000000000000000000000887F6B96737166FF757062FF856D4AFF9A74 41FF9F7844FFD9BF9EFFEBD9C1FFAF8651FF7D6A4EFF6B706E006B706E006B70 6E006B706E006B706E006B706E006E716BFFDDE6E2FFFFFFFFFFD6E1DDFFDDD6 C9FFB6996EFF8B6738FFE2CBABFFD3B792FF9B7D54FFE5DFD5FFFFFFFFFFFFFF FFFFFFFFFFFFF4F4F4FF6B706E006B7572FFFDFDFDFFEEEEEEFFEDEDEDFFDEE2 DFFFB09877FF8B6738FFCAA779FFCEB38FFF8E6B3DFFC3BCACFFEEEDEDFFEEEE EDFFEDEEEDFFF3F4F3FF6B706E006B706E00FCFBFCFFECECEBFF8B6738FF8B67 38FF8B6738FF8B6738FFCAA779FFBD9258FF8B6738FF8B6738FF8B6738FF8B67 38FFECECECFFF3F3F3FF6B706E006B706E00FAFAFAFFEAE9E9FFC4CFCAFF8B67 38FFDCBF98FFBF9F71FFBF9F71FFBF9F71FFC09F73FFD8BB96FF8B6738FFAFA9 95FFEAE9EAFFF2F2F2FF6B706E006B706E00F9F9F9FFFAFAFAFFE4E4E4FFBFCB C5FF8B6738FFDCBF98FFC09F73FFC09F73FFDFC8ABFF8B6738FFACA692FFE4E4 E4FFF4F4F4FFF1F1F1FF6B706E006B706E00F9F9F9FFEEEEEEFFFAFAFAFFE4E4 E4FFBFCBC5FF8B6738FFE3CBACFFDCBF98FF8F6B3BFFACA692FFE4E4E4FFFAFA FAFFEEEEEEFFF1F1F1FF6B706E006B706E00F7F7F7FFE3E3E3FFEEEEEEFFFAFA FAFFFAFAFAFFC8D4CEFF8E6C3FFF8B6738FFB4AE9AFFFAFAFAFFFCFCFCFFEEEE EEFFE3E3E3FFF0F0F0FF6B706E006B706E00A1A4A3FFA1A4A2FFA1A4A3FFA1A4 A3FFA1A4A3FFA1A4A3FFA1A4A3FFA1A4A3FFA1A4A3FFA1A4A3FFA1A4A3FFA1A4 A3FFA1A4A3FFA1A4A3FF6B706E006B706E00DCDCDCFFDBDBDCFFDBDCDCFFDCDC DCFFDCDBDCFFDBDCDCFFDCDBDCFFDCDCDCFFDBDCDBFFDCDCDBFF000000FFDBDC DCFFDCDCDBFFDCDCDCFF6B706E006B706E00EFEFEFFFADB0AFFFAEB0AEFFAEB0 AFFFADB0AEFFADB0AFFFADB0AFFFADB0AFFFADB0AFFFEFEEEFFF000000FFEEEF EEFFEFEEEEFFEFEEEFFF6B706E006B706E00FFFFFFFFB6B8B7FFB6B8B7FFB6B8 B7FFB6B8B7FFB6B8B7FFB6B8B7FFB6B8B7FFB6B8B7FFFFFFFFFF000000FFFFFF FFFFFFFFFFFFFFFFFFFF6B706E006B706E00FFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF FFFFFFFFFFFFFFFFFFFF6B706E006B706E006B706E006B706E006B706E006B70 6E006B706E006B706E006B706E006B706E006B706E006B706E006B706E006B70 6E006B706E006B706E006B706E00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF0004753BC504733A65FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF0004733AFF2A8C59F604743AAB04733A0CFFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF0004733AFFB7E1CBFF5AAB82F904743AE104733A2DFFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF0004733AFFBBE3CEFFABDCC3FF84C6A4FE107A43F504733A65FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004743AE804733AFF04733AFF04733AFF0473 3AFF04763BF7B6E0CBFF6FC499FF91D2B1FF9CD4B7FF318F5FF604743BAC0473 3A0CFFFFFF00FFFFFF00FFFFFF0004733AFFA7DBC0FFAADCC2FFADDDC5FFAFDE C6FFB0DEC7FFB0DEC7FF64C191FF61C18FFF73C89DFF9FD9BBFF5AAB81FA0574 3AE104733A2DFFFFFF00FFFFFF0004733AFFA3D9BDFF54B985FF58BB88FF5BBC 8BFF5CBD8BFF5CBE8CFF5CC18DFF5AC28DFF55C28AFF58C38CFF8CD4AFFF7AC3 9CFE147C46F504733A65FFFFFF0004733AFF9CD7B9FF3BAF74FF33AC6EFF2BA9 68FF2FAC6BFF3DB678FF49BE82FF50C389FF4DC488FF49C284FF44BE80FF6DCA 9BFF89CEAAFF308F5EF604753B9D04733AFF7ECAA3FF069A4EFF069A4EFF069A 4EFF07A052FF09A757FF0BAE5BFF0EB25FFF17B866FF1FBA6CFF26BA6FFF55C6 8DFF76C99EFF268956F504753B9D04733AFF7ECAA3FF069A4EFF069A4EFF069C 4FFF08A454FF0BAC5AFF0DB35EFF0EB962FF0FBC64FF1CBF6CFF67D29CFF5DBB 8BFE0E7A42F504733A65FFFFFF0004733AFF7ECAA3FF7ECAA3FF7ECAA3FF7ECC A4FF7FD1A7FF81D5AAFF0EB761FF10BF66FF34CB7FFF78DAA8FF3EA671F90476 3BE104733A2DFFFFFF00FFFFFF0004743AE804733AFF04733AFF04733AFF0473 3AFF04783CF781D6ABFF11BA64FF52D392FF73D7A5FF1E8B53F504763CAC0473 3A0CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF0004733AFF81D7ABFF6CD5A0FF58C18BFE0A7940F504743A65FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF0004733AFF7BD3A6FF36A16AF804763CE104733A2DFFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF0004733AFF18844DF504763BAB04733A0CFFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF0004753BC504733A65FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000474 3AE804733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04743AE8FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3AFFAEDEC6FFAADCC2FFA4DABEFF9FD8BBFF9AD6B7FF93D3B2FF04733AFFFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3AFFB0DFC7FF5DBD8CFF54B985FF49B57DFF3EB076FF8FD1AFFF04733AFFFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3AFFB1DFC7FF5EBE8DFF55BA86FF4AB57EFF3FB176FF8ACFACFF04733AFFFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3AFFB0DFC7FF5EBE8DFF54B985FF49B57DFF3EB076FF85CDA9FF04733AFFFFFF FF00FFFFFF00FFFFFF00FFFFFF0004753BC504733AFF04733AFF04733AFF0476 3BF7AFDEC6FF5BBC8BFF52B884FF47B47CFF35AD70FF7FCBA4FF04763BF70473 3AFF04733AFF04733AFF04753BC504733A00278956F6ACDCC4FFB2DFC8FFB0DE C7FFACDDC4FF58BD89FF4EBB84FF43B87CFF0FA458FF7FCEA5FF7ECDA4FF7ECC A4FF78C79FFF18824BF504733A00FFFFFF0004743BAC4DA478F89ED7BAFF61C0 90FF5BC18DFF55C18AFF3AB978FF11AD5EFF0BAB59FF0AAA59FF0CA958FF68C7 97FF349A65F804743BABFFFFFF00FFFFFF0004733A0004743AE173BF98FE87D2 ACFF56C38CFF30BA74FF0CB15DFF0DB45FFF0DB45FFF0DB35EFF4EC589FF55B7 84FE04753BE104733A00FFFFFF00FFFFFF00FFFFFF0004733A000B773EF68FD3 B0FF5BC891FF0DB45FFF0FB962FF0FBC65FF10BD65FF32C57BFF71CE9FFF0A78 3FF604733A00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733A00238A 56F578D2A5FF1CBD6BFF11C067FF12C56AFF1FC973FF78DBA8FF1E8952F50473 3A00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000475 3BAC3DA36FF969D59EFF12C469FF14CB6EFF6CE0A5FF3FA872F904763CABFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3A0004763BE15DBF8DFE4CD18DFF4ED590FF5FC592FE04763CE104733A00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF0004733A000E7A42F674D1A2FF75D3A3FF0E7B42F604733A00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0004733AFF04733AFF04733AFF04733AFF0473 3AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF0473 3AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF0473 3AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF0473 3AFF04733AFF04733AFF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF000474 3AE804733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04743AE8FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3AFFB0DEC7FFABDCC3FFA6DABFFF91D2B1FF7ECAA3FF7ECAA3FF04733AFFFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3AFFB1DFC8FF5FBE8DFF55BA86FF37AE71FF069A4EFF7ECAA3FF04733AFFFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3AFFB1DFC7FF5FBE8DFF55BA86FF41B278FF069A4EFF7ECAA3FF04733AFFFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3AFFB0DEC7FF5DBD8CFF54B985FF47B47CFF069A4EFF7ECAA3FF04733AFFFFFF FF00FFFFFF00FFFFFF00FFFFFF0004753BC504733AFF04733AFF04733AFF0476 3BF7ADDDC5FF59BC89FF50B882FF34AD6FFF069A4EFF7ECAA3FF04763BF70473 3AFF04733AFF04733AFF04753BC504733A65278956F6AADBC2FFAFDEC6FFADDD C5FFAADCC2FF56BD88FF4DBA82FF1FAA63FF08A253FF7FCEA5FF7ECDA4FF7ECC A4FF78C79FFF18824BF504733A65FFFFFF0004743BAC4FA57AF89BD6B8FF5DBE 8DFF58C08AFF51C087FF42BC7EFF0CAB5AFF0BAB59FF0AAA59FF0CA958FF68C7 97FF349A65F804743BABFFFFFF00FFFFFF0004733A0C04743AE175BF99FE83D1 A9FF52C289FF4DC387FF1EB669FF0DB45FFF0DB45FFF0DB35EFF4EC589FF55B7 84FE04753BE104733A0CFFFFFF00FFFFFF00FFFFFF0004733A2D0D7840F690D3 B1FF65CC98FF3BC27DFF0FB962FF0FBC65FF10BD65FF32C57BFF71CE9FFF0A78 3FF604733A2DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733A65268C 57F594DBB7FF31C379FF11C067FF12C56AFF1FC973FF78DBA8FF1E8952F50473 3A65FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000475 3BAC4CAA7AFA6DD6A0FF12C469FF14CB6EFF6CE0A5FF3FA872F904763CABFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3A0C04763BE15DBF8DFE4CD18DFF4ED590FF5FC592FE04763CE104733A0CFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF0004733A2D0E7A42F674D1A2FF75D3A3FF0E7B42F604733A2DFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF0004733A65248B56F5248B56F504733A65FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004763C9D04763C9DFFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0004753B9D04753B9DFFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF0004733A65288957F5268956F504733A65FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF0004733A2D0F7941F687CAA7FF7EC7A2FF0E7941F604733A2DFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3A0C04743AE172BD96FE72C59AFF6AC295FF5BB386FE04743AE104733A0CFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000474 3BAC4EA578FA91D2B0FF48B47DFF3FB176FF6AC295FF3B9C6AF904743AABFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733A65288A 57F6A0D7BBFF5FBD8CFF4DB680FF44B37AFF1AA25CFF71C49AFF1D844FF50473 3A65FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733A2D0D7840F69CD4 B7FF7AC9A0FF5ABE8BFF51BC86FF38B474FF08A353FF2CAF6CFF6EC397FF0A77 3EF604733A2DFFFFFF00FFFFFF00FFFFFF0004733A0C04743AE180C4A1FE97D5 B5FF69C596FF60C591FF56C38BFF1DB066FF0BAC59FF0BAB59FF4DC185FF55B4 84FE04753BE104733A0CFFFFFF00FFFFFF0004743BAC56A97FF9B0DFC7FF77CB A0FF6CCA9AFF63CA96FF43C181FF0DB35EFF0DB55FFF0DB45FFF0FB25FFF6ACE 9BFF359C67F804753BABFFFFFF0004733A65288B58F6B5E0CAFFBCE5D0FFB8E5 CEFFB3E5CBFF63CD97FF19BA68FF0FBC64FF10BE65FF83DCAFFF82DBAEFF82D9 ACFF7BD3A6FF18844CF504733A6504753BC504733AFF04733AFF04733AFF0478 3CF7B2E6CBFF4BC989FF10BD65FF11C369FF12C76BFF84E1B2FF057A3EF70473 3AFF04733AFF04733AFF04753BC5FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3AFFB0E5CAFF31C378FF11C067FF13C86CFF15CF71FF85E5B4FF04733AFFFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3AFFADE4C8FF1FBD6DFF10BF66FF12C56AFF13C96DFF84E3B3FF04733AFFFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3AFFA9E2C5FF16B665FF0FBA63FF10BE66FF11C167FF83DEB0FF04733AFFFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3AFFA5DFC1FF81D5AAFF81D7ABFF82D9ACFF82DAADFF82D9ADFF04733AFFFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000474 3AE804733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04743BE8FFFF FF00FFFFFF00FFFFFF00FFFFFF0004733AFF04733AFF04733AFF04733AFF0473 3AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF0473 3AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF0473 3AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04733AFF0473 3AFF04733AFF04733AFF04733AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF0004733A2D0F7941F689CCA9FF7FC8A2FF0E7941F604733A2DFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3A0C04743AE173BD97FE74C69CFF6CC396FF5CB386FE04743AE104733A0CFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000474 3BAC4FA679FA93D3B2FF4BB67FFF42B279FF6BC296FF3B9C6AF904743AABFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733A65298B 58F6A2D8BCFF62BE8FFF4FB782FF45B37BFF1AA25CFF71C49AFF1D844FF50473 3A65FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0004733A2D0D7840F69ED4 B8FF7CCAA2FF5CBD8BFF53BB85FF37B173FF08A153FF2CAF6CFF6EC397FF0A77 3EF604733A2DFFFFFF00FFFFFF00FFFFFF0004733A0C04743AE183C5A3FE99D5 B6FF69C395FF5FC18FFF56C18AFF1CAE63FF0AAA58FF0BAB59FF4DC286FF55B5 84FE04753BE104733A0CFFFFFF00FFFFFF0004743BAC57A97FF9B0DFC7FF75C7 9DFF6AC697FF60C692FF41BE7EFF0CB05CFF0DB35EFF0DB45FFF0FB460FF6ACF 9BFF359D68F804753BABFFFFFF0004733A65288B58F6B3DFC9FFB9E2CDFFB5E2 CBFFB1E2C9FF5FC992FF18B665FF0EB861FF0FBB64FF83DCAFFF83DCAFFF82DB AEFF7CD5A8FF19844DF504733A6504753BC504733AFF04733AFF04733AFF0477 3CF7AFE3C8FF47C384FF0EB861FF10BE66FF11C369FF84E1B2FF057A3EF70473 3AFF04733AFF04733AFF04763BC5FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3AFFADE2C7FF2EBD74FF0FBA63FF11C168FF13C86CFF85E6B5FF04733AFFFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3AFFA9E1C5FF1BB668FF0EB962FF10C067FF12C66BFF84E3B3FF04733AFFFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3AFFA5DEC1FF14B161FF0DB560FF0FBB63FF10BF66FF83DEB0FF04733AFFFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000473 3AFFA1DCBEFF81D3A9FF81D5AAFF81D7ACFF82D9ADFF82DAADFF04733AFFFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000474 3AE804733AFF04733AFF04733AFF04733AFF04733AFF04733AFF04753BE8FFFF FF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000003F3FA4040000 89AD000086FF000086FF000086FF000086FF000086FF000086FF000089BC0000 860500000000000000000000000000000000000000003F3FA404000089AF2222 AFF78888F6FF8B8BF7FF8B8BF7FF8A8AF6FF8787F6FF8383F5FF2323B8F80000 89B8000086040000000000000000000000003F3FA404000089B12222B1F78383 F3FF4242DCFF2F2FD5FF2F2FD5FF2F2FD5FF2F2FD5FF3C3CDBFF7575F1FF1F1F B4F8000089B5000086040000000033339E05000089B22424B2F78383F3FF4242 DCFF3737D5FF2F2FD5FF2F2FD5FF2F2FD5FF2F2FD5FF3737D5FF3B3BDAFF6F6F F0FF1B1BB1F7000089B13F3FA404000089B42626B3F78383F3FF4141DBFF5757 D7FFCDCDDAFF5F5FD7FF2F2FD5FF2F2FD5FF5C5CD8FFD9D9E6FF5F5FDBFF3B3B D9FF6A6AEFFF1818B0F7000089AE020288FF8989F6FF4040DBFF2F2FD5FF9292 D8FFDBDBDBFFD6D6DAFF6060D7FF5A5AD8FFE0E0E6FFEDEDEDFFA5A5E5FF2F2F D2FF3B3BD6FF6868EEFF020288FF030389FF8888F6FF2F2FD5FF2F2FD5FF3030 D5FF9999D8FFDFDFDFFFDEDEE2FFDFDFE6FFECECECFFABABE6FF3131D2FF2F2F D0FF2F2FCEFF6565EDFF020289FF030389FF8888F6FF2F2FD5FF2F2FD5FF2F2F D5FF3030D5FFACACDEFFE8E8E8FFECECECFFBCBCE8FF3131D1FF2F2FCFFF2F2F CEFF2F2FCCFF6161ECFF020289FF030389FF8888F6FF2F2FD5FF2F2FD5FF2F2F D5FF5B5BD8FFDFDFE6FFECECECFFF1F1F1FFEDEDF3FF6464DAFF2F2FCEFF2F2F CCFF2929C9FF4545E9FF020289FF030389FF8585F5FF2F2FD5FF2F2FD5FF5B5B D7FFDFDFE5FFECECECFFAAAAE4FFA5A5E6FFF9F9F9FFF7F7FCFF6767DAFF1A1A C5FF0202BDFF3737E8FF020289FF020288FF6969F2FF2323D5FF1F1FD2FF9292 DEFFECECECFFAAAAE4FF2F2FD0FF2828CEFFA5A5E9FFFEFEFEFF9696E3FF0000 BDFF0303BDFF3434E6FF020289FF000089BC2424B8F95A5AEFFF1111D3FF0101 CBFF5858D6FF0303C7FF0000C5FF0000C3FF0101C1FF5F5FD6FF0202BDFF0404 BEFF2B2BDFFF1D1DC7FD000087EB00008606000089BB2121B7F85252EDFF1010 D0FF0000C7FF0000C5FF0000C3FF0000C1FF0000BFFF0000BDFF0505BEFF2C2C DFFF1B1BC4FC000088E6000086200000000000008606000089BB1D1DB4F84C4C EBFF0F0FCCFF0000C3FF0000C1FF0000BFFF0000BDFF0505BFFF2D2DDFFF1919 BFFC000088DF0000861A00000000000000000000000000008606000089BB1A1A B1F84A4AECFF4747EDFF4343EBFF3F3FEAFF3B3BE8FF3737E7FF1818BCFB0000 88D8000086140000000000000000000000000000000000000000000086060000 89BB000086FF000086FF000086FF000086FF000086FF000086FF000088CF0000 860F000000000000000000000000FFFFFF00FFFFFF00FFFFFF00A465341DA769 3A9FA76A3ADEA56736F6A76939E5A76A3ABCA4653453A4653405FFFFFF00FFFF FF00FFFFFF00A4653479A4653410FFFFFF00FFFFFF00A4653550A66838F6C090 68FAD3B08FFFDFC2A8FFDEC1A8FFD4B193FFB9875FF4A56737F0A4653458FFFF FF00A4663566A46534FFA465340FFFFFFF00A4653429A66939F5D3AD8CFFDCBD 9DFFDDBEA1FFE5CBB4FFE9D3BFFFEEDDCCFFF0E2D5FFE7D2BFFFAF774BF5A567 36C0AB7143F7A46635FCA465340EFFFFFF00A769399BC09069FDC59872FFA86B 3CFFA46635FFA76A3AFCB7855DF3D9BBA1FEF1E4D8FFF2E6DBFFF3E8DDFFCEA7 88FDEAD8C8FFA76A3AF9A465340DFFFFFF00A66838F3AB7041FFA96C3CFEA76A 3AF5A4653475A4653419A4653445A66938CDB98861F5EBDBCDFFF5EBE2FFF6EE E6FFF6EEE6FFA76A3AFAA465340BFFFFFF00A46535FEA76A3AFBC791689DA567 37E6A4653423FFFFFF00FFFFFF00FFFFFF00A4653460A46635FFE9D7C7FFEBD8 C6FFF5ECE3FFA66A3AFAA465340AFFFFFF00A46534FCB3794C7ECF9D762BBB83 5713A4653402FFFFFF00FFFFFF00A4653404A66838C4D0AC8FFAF6EEE7FFF2E6 DBFFF6EEE6FFA66A3AFBA4653409FFFFFF00A465340DFFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00A46534A0A46534FFAD7447F8AF774CF7AF77 4CF7AF784CF7A46534FFA4653408FFFFFF00A46534F9A46534FEA46534FEA465 34FDA46534FCA46534FBA46534B9A465341DA4653418A4653418A4653418A465 3418A4653418A465341CFFFFFF00FFFFFF00A46534FCF5EDE5FFF6EDE5FFF5EC E4FFD7B79CFDA66837E0A4653410FFFFFF00FFFFFF00FFFFFF00FFFFFF00D5A4 7E1ACD997239A46534FCA465340CFFFFFF00A46635FCF6EEE6FFEBD7C4FFEAD9 C9FFA46534FEA465346AFFFFFF00FFFFFF00FFFFFF00A465340BA56635E9C995 6C8DB77F53C2A46534FFA4653405FFFFFF00A56737FDF6EEE6FFF5ECE3FFF5ED E4FFE6D2C1FFB0794DF5A66938CAA4653436FFFFFF00A465346AA96B3CEDB67C 4FFFA76A3AFEA56837FAFFFFFF00FFFFFF00A66838FDF1E4D8FFD4B295FEF4E9 E0FFF3E8DDFFEDDCCCFFD2AD8FFEB0784CF5A56635FBA66939FFA66939FEA96D 3DFFB0784CFFA76A3AA8FFFFFF00FFFFFF00A56737FEB7845BF7A56736D4B17A 4EF4E3CAB4FFECDAC9FFE7D1BCFFE3C9B0FFDEBEA0FFD2AB88FFCEA582FFD3AE 8EFFA66838F5A465342AFFFFFF00FFFFFF00A46534FFA5673693FFFFFF00A465 3454A66737EEB58055F3CEA684FFD8B697FFDBB999FFD3AC8AFFC2946DFCA668 38F6A466355BFFFFFF00FFFFFF00FFFFFF00A46534A2A4653401FFFFFF00FFFF FF00A4653405A4653453A76A3ABEA66938E9A46635FAA76A3AE4A76B3BAAA465 3424FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004B4B4CEF444344FFB9B4B3FFB9B4 B3FFB9B4B3FFB9B4B3FFB9B6B4FFBBB6B4FFBCB8B6FFBCB9B7FFBCB9B8FFBCB9 B9FF444344FF4B4B4CEFFFFFFF00FFFFFF00414042FF59595AFFFAF4F1FFFAF4 F0FFFAF4F0FFFAF4F0FFFAF4F1FFFAF5F2FFFBF6F3FFFCF8F5FFFCF9F7FFFDFB F9FF646365FF414042FFFFFFFF00FFFFFF003F3E40FF616062FFFDFAF9FFCFB6 9CFFCFB69CFFCFB69CFFCFB69CFFCFB69DFFCFB79DFFD0B79EFFD0B89FFFFEFD FDFF616062FF3F3E40FFFFFFFF00FFFFFF003D3C3DFF5D5C5EFFFDFCFBFFFBF9 F8FFFBF9F9FFFBF9F8FFFBF9F8FFFAF8F7FFFAF7F5FFF9F6F4FFF8F4F2FFF9F6 F2FF5D5C5EFF3D3C3DFFFFFFFF00FFFFFF003B3A3BFF5A595BFFF7F3EEFFF7F3 EFFFF7F3EFFFF7F3EFFFF7F3EEFFF6F2EEFFF6F1EDFFF5F0EBFFF4EFE9FFF3ED E7FF5A595BFF3B3A3BFFFFFFFF00FFFFFF00383739FF565557FFF1EAE2FFB8A2 8BFFB8A28BFFB8A28BFFB8A28BFFB7A18AFFB7A18AFFB7A08AFFB6A089FFEDE5 DCFF565557FF383739FFFFFFFF00FFFFFF00363537FF535254FFE8DED4FFE8DD D0FFE8DDD0FFE8DDD0FFE7DCD0FFE7DCCFFFE7DBCFFFE6DBCEFFE6DACDFFE6DA CFFF535254FF363537FFFFFFFF00FFFFFF00333335FF4F4E51FF4F4E51FF4F4E 51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E51FF4F4E 51FF4F4E51FF333335FFFFFFFF00FFFFFF00313032FF4B4A4DFF4B4A4DFF4B4A 4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A4DFF4B4A 4DFF4B4A4DFF313032FFFFFFFF00FFFFFF002E2D30FF464549FF464549FFCDCD CDFFD6D6D6FFD5D5D6FFD5D5D5FFD6D6D6FFD6D6D6FFD3D3D3FF272629FF2423 26FF464549FF2E2D30FFFFFFFF00FFFFFF002A292BFF403F42FF403F42FFA7A7 A7FF3D3C3FFF333335FFAEAEAEFFAEAEAEFFAEAEAEFFAEAEAEFF414042FF2727 28FF444346FF2A292BFFFFFFFF00FFFFFF00252426FF39383BFF39383BFF9999 99FF323134FF262528FF9F9F9FFF9F9F9FFF9F9F9FFF9F9F9FFF3F3E41FF2524 26FF58575AFF252426FFFFFFFF00FFFFFF00222224ED2A2A2DFF323135FF8B8A 8BFF29282BFF201F21FF909090FF909090FF909090FF909090FF343336FF201F 21FF4E4D51FF212023FFFFFFFF00FFFFFF001F1F252F1D1D1FEC1C1B1EFF7575 75FF787878FF787878FF787878FF787878FF787878FF787878FF1A191BFF1919 1BFF1D1C1FFF1F1F21EFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00186FAB174345D3D63A3A CFB25353D418FFFFFF00FFFFFF00FFFFFF004B4B4CEF444344FFB9B4B3FFB9B4 B3FFB9B4B3FFB9B4B3FFB9B6B4FFBBB6B4FFB6B6B5FF34B6DEFF446AC0FF1B1B CEFF1111A3FF4A4A4DEFFFFFFF00FFFFFF00414042FF59595AFFFAF4F1FFFAF4 F0FFFAF4F0FFFAF4F0FFFAF4F1FFF9F5F2FF55C6E9FF36AFD4FF1E2020FF1D2B 85FF05079AFF3A394FFFFFFFFF00FFFFFF003F3E40FF616062FFFDFAF9FFCFB6 9CFFCFB69CFFCFB69CFFCFB69CFF5E9FABFF2EB3DBFF242B2DFF0B1C21FF11A0 CDFF2E607AFF3E3D3FFFFFFFFF00FFFFFF003D3C3DFF5D5C5EFFFDFCFBFFFBF9 F8FFFBF9F9FFFBF9F8FF94C3D1FF32C4F1FF27363BFF0E171AFF1598C1FF57A6 BEFF3D3C3EFF3B3A3BFFFFFFFF00FFFFFF003B3A3BFF5A595BFFF7F3EEFFF7F3 EFFFF7F3EFFFAFCFD7FF33CAF9FF2C454CFF151819FF178BB0FF3DA2C1FF8F8B 88FF464546FF3B3A3BFFFFFFFF00FFFFFF00383739FF565557FFF1EAE2FFB8A2 8BFF979D92FF71D8F7FF34565FFF1D1D1DFF117390FF2199BCFF5E5449FF9F9A 94FF555456FF383739FFFFFFFF00FFFFFF00363537FF535254FFE8DED4FFCCD0 C9FF84DCF7FF54808CFF252525FF12617AFF1CA6D1FF666867FF827B74FFDDD1 C7FF535254FF363537FFFFFFFF00FFFFFF00333335FF4F4E51FF4A5156FF67C6 E4FF4E899CFF252525FF094558FF0DA4D5FF1E2F36FF252426FF484749FF4F4E 51FF4F4E51FF333335FFFFFFFF00FFFFFF00313032FF494B4FFF46ADCEFF1582 A5FF262626FF0E3845FF0CABDDFF173641FF1D1C1DFF3D3D3FFF4B4A4DFF4B4A 4DFF4B4A4DFF313032FFFFFFFF00FFFFFF002E2D30FF298FB2FF1695BDFF2528 29FF18343DFF0EADDFFF2E5E6CFF424242FF959595FFD3D3D3FF272629FF2423 26FF464549FF2E2D30FFFFFFFF00FFFFFF004E606CFF2C9ABDFF242C2FFF2131 36FF0BA3D2FF0C5166FF2B2B2BFF606060FFAEAEAEFFAEAEAEFF414042FF2727 28FF444346FF2A292BFFFFFFFF00FFFFFF0088A1AFFFB0CAD6FF2C3A3EFF0B96 C1FF0C6885FF070707FF404040FF9C9C9CFF9F9F9FFF9F9F9FFF3F3E41FF2524 26FF58575AFF252426FFFFFFFF00567181049DBCCAFF7AB8CCFF3C92AEFF1F6E 89FF161517FF181719FF8A8A8AFF909090FF909090FF909090FF343336FF201F 21FF4E4D51FF212023FFFFFFFF006279867E364246FF44778DFB252D34FF7575 75FF787878FF787878FF787878FF787878FF787878FF787878FF1A191BFF1919 1BFF1D1C1FFF1F1F21EFFFFFFF004864720036546523FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00EAC39DFFE6BF96FFE4BB92FFE4BB92FFD1A06CF5D09E6DF6CC96 5FDAC479427EB2673C09FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00E5BE96FFFFFFFEFFFDF3E9FFFDF3EAFFFCF2E8FFFAEFE3FFFAF2 E7FFEABB88FFCF8555B3B4693D0CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00E4BB93FFFEF5EDFFFCDEC5FFFBE0C7FFF9DCC2FFF5D3B4FFFEF9 F3FFFAE2C4FFECC193FFC37D4893FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00E4BB92FFFEF6F0FFFCE2CDFFFCE3CDFFFADFC8FFF7D9BCFFF5E9 DDFFFAF3EBFFFBF8F3FFCA8353FEFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00E4BB92FFFEF7F1FFFCE5D2FFFCE4D1FFFBE2CCFFF9DDC4FFF6D7 BBFFF3D1AFFFFAEFE4FFCC8758FE34B4D9D05EC2E1FA60C3E2FA60C3E2FA60C3 E2FA5FC3E2FAE4BB91FFFFF7F2FFFEE7D5FFFEE7D5FFFDE5D1FFFAE0CAFFF9DE C4FFF7D9BCFFFDF2E7FFCC8757FE36B3DAF8FDFEFEFFFEFFFFFFFEFEFFFFFDFE FFFFFEFFFFFFE4BA91FFFFF7F0FFFFE7D5FFFDE7D6FFFDE6D4FFFCE4D0FFFBE3 CBFFFADCC2FFFEF3E8FFCC8656FE35AFDAF0F7FCFEFF8EE4F8FF91DEF5FF9FE0 F5FFACE1F6FFCA8452FFFFF7F1FFFFE9D9FFFFEADBFFFFE9D9FFFFE7D7FFFFE5 D2FFFFE2CBFFFFF7F1FFCB8555FE36AADAF2F1FAFDFF94DEF5FF93DCF4FF64BC E9FF3594DAFF3594DAFF3594DAFF3594DAFF3594DAFF3594DAFF3594DAFF3594 DAFF3594DAFFFBF6EFFFCC8355FE35ABDAFAE8F6FBFF70BCE7FF55AAE2FF4DA5 E0FF91C9EBFFFAF3EFFFFDFEFDFFFFFDFCFFFFFDFCFFFEFDFCFFFEFCFBFFFEFE FDFF3594DAFFEFF2E8FFCE8156FF37A6DAFAFEFFFFFFF8FDFFFFF6FDFFFFF5FC FFFFF3FCFEFF9AE4F4FF9AE6F7FF9BE6F6FF9DE5F5FF9EE5F5FF9FE5F4FFDAF3 F8FF3594DAFFFDF4EEFFCA8054F936A1DAF9F6FCFEFF94E5F8FF93E5F8FF93E5 F8FF91E5F8FF93DBE9FF93D7E3FF93D2DCFF90CED7FF8CC8CFFF86C1C6FFC9D8 D6FF3594DAFFC57444E8CA7F53F1369ADAF8F2FAFDFF94E6F8FF92E5F8FF90E5 F8FF8BE3F8FF86E2F7FF7FE1F7FF77DEF6FF6CDCF6FF5ED9F4FF4FD5F3FFCCF2 FBFF3594DAFFFFFFFF00FFFFFF003594DAF7EFFAFEFF93E5F8FF8FE4F8FF89E3 F8FF82E1F7FF7ADFF7FF71DEF6FF67DBF5FF5BD8F4FF4DD4F3FF40D1F2FFCAF2 FBFF3594DAFFFFFFFF00FFFFFF00338ED9FBDCF0FAFF98E1F6FF95E0F6FF92DF F6FF8EDEF5FF89DCF5FF85DAF4FF80D9F4FF7AD7F3FF74D5F3FF70D3F2FFC2EA F8FF3594DAFFFFFFFF00FFFFFF002C86D8002D88D8F72D87D8F72D88D8F72D88 D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88D8F72D87D8F72D88 D8F72C86D800FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006E9DD5FF6C9B D3FF699AD2FF6697CFFF6395CDFF6093CBFF5C90C8FF598EC6FF558BC3FF5188 C0FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006B9BD3FFAED4 E8FFABD3E8FFAAD1E7FFA8CFE5FFA5CDE4FFA2CBE4FFA0C9E2FF9DC7E1FF4B84 BCFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006798D0FFABD1 E7FF90C2DFFF8DC0DEFF8ABEDCFF87BBDBFF83B8DAFF80B6D8FF99C4E0FF4580 B8FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006395CDFFA8CF E5FF8CBFDDFF88BDDCFF85BADBFF81B7D9FF7EB4D7FF7AB2D6FF94C1DDFF3F7C B4FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005E91C9FFA4CC E4FF87BBDBFF84B9DAFF80B6D8FF7CB3D7FF79B0D5FF74ADD4FF8FBDDCFF3977 AFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00598EC6FFA0C9 E3FF82B8D9FF7EB5D8FF7AB2D6FF77AFD5FF73ACD3FF6DABD4FF8CBADAFF3373 ABFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00538AC2FF9CC6 E1FF7CB3D7FF79B1D5FF75ADD4FF71ABD2FF5FBAE4FF4BD4FFFF7CBBE0FF2E6F A7FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004E86BEFF98C3 DFFF77AFD5FF73ACD3FF6FA9D2FF6BA7D0FF5BB7E3FF54C2EDFF81B4D7FF286B A3FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004882BAFF93C0 DDFF71ABD2FF6DA8D1FF69A5CFFF66A2CEFF629FCCFF5E9CCBFF7FB0D5FF2367 9FFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00427DB5FF8FBD DCFF6CA7D0FF67A4CFFF64A1CDFF609ECCFF5C9BCAFF5999C9FF7BADD4FF1E64 9CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003C79B1FF8BB9 DAFF66A2CEFF62A0CDFF5F9DCBFF5B9AC9FF5897C8FF5495C7FF77ABD3FF1960 98FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003675ADFF86B6 D8FF83B3D7FF81B2D6FF7DAFD5FF7BADD4FF79ABD3FF76AAD2FF74A8D1FF155D 95FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00B7B7B7FFAEAEAEFF3071A9FF2C6E A6FF286BA3FF2468A0FF21669EFF1D639BFF1A6199FF175F97FF145C94FF115B 93FF6C6C6CFF6C6C6CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 00000000000000A0C4FF00000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000009D BF1400A0C4FF00A0C4FF00000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000005797D1100A0 C4FFADF3FBFF00A0C4FF00000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000005797D1100A0C4FFADF3 FBFF25E4FBFF00A0C4FF00A0C4FF13A1BEE7159FBBCF1BA1BBA4067A7C0B0000 00000000000000000000000000000000000005797D1100A0C4FFADF3FBFF31E1 F6FF20E3FAFF73ECFAFF6FEBFAFF6EE8F7FF6CE8F7F814A1BCD414A3C1D50579 7D1C00000000000000000000000005797D0A00A0C4FFADF3FBFF2FE0F6FF32E2 F7FF29DBF1FF2FE0F5FF29DBF1FF16CDE3FF36D9ECFF69E7F6FF41CEE3FE13A3 C1E405797D32000000000000000000A0C4FFADF3FBFF2FE0F6FF32E2F8FF32E2 F7FF32E2F7FF2FE0F5FF29DBF1FF1DD2E8FF1DD2E8FF1DD2E8FF36D9ECFF40CD E1FF16A1BDCA05797D0A0000000005797E1100A0C4FF79EDFBFF32E2F8FF2CDF F4FF04C0D6FF04C0D6FF04C0D6FF1DD2E8FF1DD2E8FF1DD2E8FF0BC8DFFF6AE5 F3FF1BABC5F815A0BCCB000000000000000005797D1100A0C4FF76EDFBFF04C3 DAFF76EDFBFF69EAF9FF69EAF9FF69EAF9FF69EAF9FF05DDF7FF0AC8DFFF07C2 D8FF6FDCEBFF1BA3BFF400000000000000000000000005797D1100A0C4FF76ED FBFF76EDFBFF00A0C4FF00A0C4FF00A0C4FF00A0C4FF01A9C4FF6EE1EEFF0FC9 DFFF69E4F2FF1AA4C0F80000000000000000000000000000000005797D1100A0 C4FF76EDFBFF00A0C4FF000000000000000000A0C4300099B95000A0C4C96DE6 F5FF76E2EFFF19A3C1FF00000000000000000000000000000000000000000000 000000A0C4FF00A0C4FF00000000000000000000000000000000009EC11A02AC C8FF88E7F2FE11A2C2FF00000000000000000000000000000000000000000000 00000000000000A0C4FF00000000000000000000000000000000000000000EAA CBFE5DDAE9FE23A6C0EF00000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000A0C42243C4 DBFC43C5D8FE23A6C07F00000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000A0C45D66DB EAB211A6C2AE0000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000018A6C3691AA7 C46900A0C4180000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000069A4EFF069A4E33000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000069A4EFF069A4EFF069A4E430000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000069A4EFF6CF3AEFF069A4EFF069A 4E4100000000000000000000000000000000000000000000000000000000069A 4E07069A4E46069A4E9E069A4ECF069A4EFF069A4EFF6CF3AEFF6CF3AEFF069A 4EFF069A4E410000000000000000000000000000000000000000069A4E36069A 4EB10C9B8FC449DEA9DD6AF1AEFF6BF2AEFF73F5B3FF61EFA6FF16D273FF6CF3 AEFF069A4EFF069A4E41000000000000000000000000069A4E4A069A4EC845D9 ACFD67EFAFFF50E9A1FF24DBA0FF24DBA0FF24DBA0FF24DBA0FF16D273FF16D2 73FF6CF3AEFF069A4EFF0084773B00000000069A4E2B069A4EBA46D8A9FF65EF B1FF24DEA4FF2ADD97FF24DBA0FF24DBA0FF1AD7AFFF16D273FF16D273FF16D2 73FF18D375FF6CF3AEFF069A4EFF00000000069A4E9E30C29DEA60EDB1FF26DF A5FF1AD7AFFF1AD7AFFF09D0C8FF14D077FF16D273FF16D273FF16D273FF16D2 73FF34E28AFF069A4EFF069A4E41000000000C9F55DA63E9B1FF31E0BAFF17D4 CBFF22D69BFF23DAA1FF23DAA1FF23DAA1FF23DAA1FF23DED9FF16D273FF34E2 8AFF069A4EFF069A4E4100000000000000000A9D52F164ECB2FF24D6CDFF0BA1 93FE069A4EFF069A4EFF069A4EFF069A4EFF069A4EFF1ED4CCFF34E28AFF069A 4EFF069A4E41000000000000000000000000069A4EFF46E2BEFF05A699FF069A 4EF1069A4E73069A4E300000000000000000069A4EFF34E28AFF069A4EFF069A 4E4100000000000000000000000000000000069A4EFF37D9B3FD069A4EFF069A 4E4800000000000000000000000000000000069A4EFF069A4EFF069A4E330000 000000000000000000000000000000000000069A4EFF3ADDB8F5069A4EFE0000 000000000000000000000000000000000000069A4EFF069A4E33000000000000 000000000000000000000000000000000000069A4EC123C7AFC6059D91CE069A 4E48000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000069A4E5E0FA85A862CD6C0960299 9A8C069A4E0C0000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000069A4E20069A4E6A069A 4E5B069A4E1D04A8B70404A8B803000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000888D8B48888D 8BEC909593D500000000000000000000000000000000888D8B978C918FEE0000 00000000000000000000000000000000000000000000000000008B908EF6F7F7 F7FD888D8BB79297957D0000000000000000000000008D9190E6D0D3D2FE8C91 8FBF000000000000000000000000000000000000000000000000888D8BFED0D4 D2FFEFF0EFFD8F9492AC0000000000000000878C8A3FA7ACAAFFC3C8C6FF8A8F 8DF70000000000000000000000000000000000000000000000008A8F8DF3B0B5 B3FFF6F7F7FE888D8BD79297957D000000008B908EFAC9CECCFFABAFAEFD888D 8BD4000000000000000000000000000000000000000000000000878C8A39888D 8BFFD9DCDBFFEFF0EFFE8E9391BD898E8C99B3B8B6FFCBCECDFF888D8BFD888D 8B7D000000000000000000000000000000000000000000000000000000008A8F 8DE1B2B6B5FFF7F7F7FF888D8BF29CA09FFEB3B6B5FFB5BAB8FD888D8BB20000 000000000000000000000000000000000000000000000000000000000000888D 8B33888D8BFEDFE1E1FFF5F6F5FD979C9AFFA5A9A8FF888D8BF7888D8B330000 0000000000000000000000000000000000000000000000000000000000000000 00008A8F8DA1B7BBBAFDE6E8E7FFA7ACAAFF8B908EFE878C8A97000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000888D8B5C848989FFC3C6C5FFAFB2B3FF2C2F9CF5888D8B33000000000000 0000000000000000000000000000000000000000000000000000000000001818 AE8D1616ABF30606A6FF454AA3FE0202A6FF191AC7FF1717ADF01818AE890000 000000000000000000000000000000000000000000001919AE7D0707A9FD2020 D2FD1E1ECEFE0E0FB7FD0205A4A40304A8FC1A1AC9FF2020D1FD1F1FCBFD0A0A A9FD1919AE5D0000000000000000000000001A1AAF5C0606A8FE1F1FD0FB0303 A8B81415C0F80101A6FF00000000000AA00E1C1DCDFD1315C0F90303A8B71D1D CDFA0606A7FE1A1AAF7D00000000000000001414ABE62323D5FD0303A87A0000 00001D1DCEF50A0AA9FC00000000000000000303A8FD1A1BCAF2000000000202 A7772020D1FD1414ABE600000000000000000D0DABF91D1DCFFA000000000B0B B5902121D3FD0C0CAAD500000000000000000909AACB2323D6FD0D0DB8950000 00001F1FD1FB1111ABFA00000000000000001313ABDF2727DBFD1F1FD0F91D1D CEFD0707A8E61A1AAF3300000000000000001A1AAF330808AAE92222D4FD1D1D CFF91D1DCEFD1313ABE900000000000000001A1AAF5C0E0EAAE71010ABF41616 ABF71A1AAF33000000000000000000000000000000001A1AAF5C0D0DAAC30B0B AAEE0B0BA9E21A1AAF33000000008A8F8D4F858A887F858A887F858A887F858A 887F858A887F858A887F858A887F858A887F858A887F858A887F89918E530000 0000000000000000000000000000868B897DFFFFFF7FFFFFFF7FFFFFFF7FFFFF FF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFF7F858A887F0000 0000000000000000000000000000868B897DFFFFFF7FEFF0F07FEEEFEF7FEEEF EF7FEEEFEF7FEEEFEF7FEEEFEF7FEFF0F07FEFF0F07FFFFFFF7F858A887F0000 0000000000000000000000000000868B897DFFFFFF7FEFF0F07FC7C8C87F979B 9AD0858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF8A8F8DAB868B897DFFFFFF7FEFF0F07FEFF0F07F878C 8AFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFF858A88FF868B897DFFFFFF7FEFF0F07FC7C8C87F868B 89FDFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFEFF0F0FFFFFFFFFF858A88FF868B897DFFFFFF7FEFF0F07FEEEFEF7F878C 8AFDFFFFFFFFEFF0F0FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7 C7FFEFF0F0FFFFFFFFFF858A88FF868B897DFFFFFF7FEEEFEF7FC5C6C67F868B 89FDFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFEFF0F0FFFFFFFFFF858A88FF868B897DFFFFFF7FEDEEEE7FECEDED7F878C 8AFDFFFFFFFFEFF0F0FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFEFF0 F0FFEFF0F0FFFFFFFFFF858A88FF868B897DFEFEFE7FECECEC7FC3C4C47F868B 89FDFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFFAFAFAFFF3F3F3FF858A88FF868B897DF9F9F97FEBEBEB7FEAEAEA7F878C 8AFDFFFFFFFFEFF0F0FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFEEEE EEFFF6F7F7FFC3C4C3FF858A88FF868B897DF2F3F37FF3F4F47FF2F2F27F878C 8AFDFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FF898E8CFF898E 8CFF898E8CFF898E8CFF858A88FF8B908F50868B897F868B897F868B897F868B 89FDFDFEFEFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFFAFAFAFF959A98FFFAFA FAFFF7F8F8FFE2E4E3FF858A88FF00000000000000000000000000000000868B 89FBF9FAFAFFEFF0F0FFEFF0F0FFEFF0F0FFFAFAFAFFFAFAFAFF959A98FFFAFA FAFFE2E3E3FF858A88FF858A88CC00000000000000000000000000000000868B 89FBF4F4F4FFF6F7F7FFF5F6F6FFFBFCFCFFFBFBFBFFD4D4D4FF969A98FFE2E4 E3FF858A88FF858A887F0000000000000000000000000000000000000000898E 8CA3868B89FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A 88BF858A887F0000000000000000000000000000000000000000000000005C5C 5C015E5F5FBB5C5C5CFF5C5C5CFF5C5C5CFF5C5C5CFF5E5F5FBB5C5C5C010000 00000000000000000000000000000000000001446C6401446DEE01446CFF0344 6BFF5B5C5CFF899595FF8A9797FF8A9797FF899595FF5B5C5CFF03446BFF0144 6CFF01446CED00436B5D0000000000426A0401446DF32484C0FF3E7EA4FF646D 70FF5E5E5EFF7C7F7FFF7D8080FF7D8080FF7B7E7EFF5E5E5EFF646C6EFF407C A1FF237FB9FF01436CF000426A0200426A1002466FF82788C6FF646F71FFF1F1 F1FFE0E0E0FFBBBBBBFFBBBBBBFFBBBBBBFFBBBBBBFFE0E0E0FFF2F2F2FF646D 6EFF2787C5FF00426AFC00426A0800426A1002466FF82788C6FF646866FFFFFF FFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFFFFFFFFF6469 67FF2886C2FF00426AFC00426A0800426A1002466FF82687C5FF646866FFFFFF FFFFEFF0F0FFB5B5B3FFB5B5B3FFB5B5B3FFB5B5B3FFEEEFEFFFFFFFFFFF6469 67FF2886C2FF00426AFC00426A0800426A1002466FF82687C5FF646866FFFFFF FFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEDEFEFFFEBEDEDFFFFFFFFFF6469 67FF2886C2FF00426AFC00426A0800426A1002466EF82687C5FF646866FFFFFF FFFFEFF0F0FFB5B5B3FFB5B5B3FFB4B4B2FFB2B2B1FFE8EAEAFFFFFFFFFF6469 67FF2886C2FF00426AFC00426A0800426A1002466EF82687C5FF646866FFFFFF FFFFEFF0F0FFEEEFEFFFECEDEDFFEAEBEBFFE8EAEAFFD9DBDBFFFFFFFFFF6469 67FF2886C2FF00426AFC00426A0800426A1002466EF82687C5FF646866FFFFFF FFFFEDEEEEFFEBECECFFE9EBEBFFE7E9E9FFD8DADAFFCACDCCFFFFFFFFFF6469 67FF2886C2FF00426AFC00426A0800426A1002466EF82687C5FF646866FFFFFF FFFFEAECECFFE8EAEAFFE6E8E8FFCBCECDFFB6BAB9FFB5B9B8FFFFFFFFFF6469 67FF2886C2FF00426AFC00426A0800426A1002456EF82687C5FF646866FFFFFF FFFFE7E9E9FFE5E7E7FFD6D9D9FFB6B9B9FFFFFFFFFFFFFFFFFFFFFFFFFF6469 67FF2886C2FF00426AFC00426A0800426A1002456EF82687C5FF646866FFFFFF FFFFE4E7E7FFD5D8D8FFBEC2C1FFB4B7B7FFFFFFFFFFFFFFFFFF646967FF2787 C5FF2886C2FF00426AFC00426A0800426A1002456EF82687C5FF636D70FFEDEE EDFFFEFEFEFFFEFEFEFFFEFEFEFFEEEFEFFFFDFEFEFF646967FF2787C5FF2787 C5FF2787C5FF00426AFC00426A0800426A0401436CF3237FBAFF3B7DA7FF646F 73FF686C6AFF686C6AFF686C6AFF686C6AFF686C6AFF3D7CA3FF3D7CA3FF3D7C A3FF227BB3FF01436BF000426A020000000001436B6401436CEE01446CFF0144 6CFF01446CFF01446CFF01446CFF01446CFF01446CFF01446CFF01446CFF0144 6CFF01436BED00426A5D0000000000000000000000008F9391BF858A88FF858A 88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A 88FF8F9391BF00000000000000000000000000000000858A88FFF1F1F1FFEBEB EBFFEBEBEBFFEBEBEBFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFE9E9 E9FF858A88FF0000000000000000874A207F874A20FF858A88FFE7E7E7FFD7D7 D7FFD6D6D6FFD6D6D6FFD6D6D6FFD6D6D6FFD5D5D5FFD5D5D5FFDADADAFFDCDC DCFF858A88FF874A20FF874A207F874A20FFDDBB9CFF777C7AFFD9D9D9FFBDBD BDFFBDBDBDFFBDBDBDFFBDBDBDFFBCBCBCFFBCBCBCFFBCBCBCFFBFBFBFFFC0C0 C0FF777C7AFFDDBB9CFF874A20FF874A20FFDDBB9CFF6A5B4EFFC9C9C9FF9C9C 9CFF9C9C9CFF9C9C9CFF9B9B9BFF9B9B9BFF9B9B9BFF9B9B9BFF9B9B9BFF9B9B 9BFF6A5B4EFFDDBB9CFF874A20FF874A20FFDDBB9CFF86522CFF86512BFF8651 2BFF86512BFF86512BFF86512BFF86522CFF86522CFF86522CFF86522CFF8652 2CFF86522CFFDDBB9CFF874A20FF874A20FFDDBB9CFFCA8A58FFCA8A58FFCA8A 58FFCA8A58FFCA8A58FFCA8A58FFCA8A58FFCA8A58FFCA8A58FFCA8A58FFCA8A 58FFCA8A58FFDDBB9CFF874A20FF874A20FFDDBB9CFFDDBB9CFFDDBB9CFFDDBB 9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB 9CFFDDBB9CFFDDBB9CFF874A20FF874A20FFDDBB9CFFCF9F72FFCF9F72FFCF9F 72FFCF9F72FFCF9F72FFCF9F72FFCF9F72FFCF9F72FFCF9F72FFCF9F72FFCF9F 72FFCF9F72FFDDBB9CFF874A20FF874920C0874A20FF874A20FF874A20FF874A 20FF874A20FF874A20FF874A20FF874A20FF874A20FF874A20FF874A20FF874A 20FF874A20FF874A20FF874920C000000000000000006A6E6DFFCCCDCDFA6569 68F4AAACABF96C6F6EFEAEB0AFFB6B6E6DFDB0B2B1FA6E7271FDB2B3B3FB6C70 6FFD0000000000000000000000000000000000000000727675FAC7C9C8EB797E 7BE89E9F9EE98E8F8FF6ADAEADED8C8D8CF1AEAFAEE77C807FFFB7B8B7EB7679 78F50000000000000000000000000000000000000000858988EFC9CBCAA28388 85E8C4C4C4E9838885F0CACCCBEB9B9D9CE8C0C0C0DF7C807FFFE2E3E3F28B8E 8DF0000000000000000000000000000000008C908F99858988ECF6F6F6FB999C 9BFFABADACFF838885E7DEDFDEED9C9F9EC6CCCECDDB989B9AFFEBEBEBF09699 98E6959797670000000000000000000000008C908FFDFAFAFAFF949897F9999C 9BD6999C9BEF969A98FFEDEEEEF1949997CB9B9E9DFF989B9AFF8B8E8DFFFFFF FFDE8F9392BC0000000000000000000000008C908F99919493FFADB0AFFF0000 000000000000909492FF9DA09FFD989C9AE50000000000000000A5A8A7677B7E 7DC9989B9AA40000000000000000FFFFFF00898D8B94858A88FF858A88FF858A 88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A 88FF858A88FF898E8C94FFFFFF00FFFFFF00858A88FEFDFDFDFFFEFEFEFFFEFE FEFFFDFDFDFFFDFDFDFFFCFCFCFFFCFCFCFFFBFBFBFFFBFBFBFFFAFAFAFFFAFA FAFFF9F9F9FF888D8BFEFFFFFF00FFFFFF00858A88FFFDFDFDFFD6BEA8FFD7BF A9FFD7BFA9FFD8C0AAFFD8C0AAFFD9C1ABFFD9C1ABFFD9C1ABFFD9C1ABFFD9C1 ABFFF8F8F8FF888D8BFFFFFFFF00FFFFFF00858A88FFFEFEFEFFD7BFA9FFAF97 81FFAF9781FFAF9781FFAF9781FFDAC2ACFFAF9781FFAF9781FFAF9781FFDAC2 ACFFF8F8F8FF888D8BFFFFFFFF00FFFFFF00858A88FFFDFDFDFFD8C0AAFFAF97 81FFAF9781FFAF9781FFAF9781FFDBC3ADFFDBC3ADFFDBC3ADFFDBC3ADFFDBC3 ADFFF8F8F8FF888D8BFFFFFFFF00FFFFFF00858A88FFFDFDFDFFD8C0AAFFAF97 81FFAF9781FFAF9781FFAF9781FFDBC3ADFFDCC4AEFFDCC4AEFFDCC4AEFFEBEB EBFFF8F8F8FF888D8BFFFFFFFF00FFFFFF00858A88FFFCFCFCFFD9C1ABFFAF97 81FFAF9781FFAF9781FFAF9781FFDCC4AEFFAF9781FFAF9781FFDDC5AFFFECEC ECFFF8F8F8FF888D8BFFFFFFFF00FFFFFF00858A88FFFCFCFCFFDAC2ACFFDAC2 ACFFDBC3ADFFDCC4AEFFDDC5AFFFDDC5AFFFDEC6B0FFDEC6B0FFDEC6B0FFEEEE EEFFF8F8F8FF888D8BFFFFFFFF00FFFFFF00858A88FFFCFCFCFFDAC2ACFFDBC3 ADFFDCC4AEFFDDC5AFFFDDC5AFFFDEC6B0FFDEC6B0FFDFC7B1FFDFC7B1FFF0F0 F0FFF8F8F8FF888D8BFFFFFFFF00FFFFFF00858A88FFFBFBFBFFDAC2ACFFAF97 81FFAF9781FFAF9781FFAF9781FFAF9781FFAF9781FFAF9781FFE0C8B2FFF2F2 F2FFF7F7F7FF888D8BFFFFFFFF00FFFFFF00858A88FFFBFBFBFFDBC3ADFFDCC4 AEFFDDC5AFFFDEC6B0FFDEC6B0FF000000FFE0C8B2FF000000FFE1C9B3FFF4F4 F4FFF7F7F7FF888D8BFFFFFFFF00FFFFFF00858A88FFFAFAFAFFDBC3ADFFDCC4 AEFFDDC5AFFFDEC6B0FFDFC7B1FFE0C8B2FF000000FFF5F5F5FFF6F6F6FFF6F6 F6FFF7F7F7FF888D8BFFFFFFFF00FFFFFF00858A88FFF9F9F9FFDBC3ADFFB098 82FFB09882FFB09882FFB09882FFE0C8B2FF000000FFF7F7F7FFF8F8F8FFF7F7 F7FFF7F7F7FF888D8BFFFFFFFF00FFFFFF00858A88FFF9F9F9FFDBC3ADFFDCC4 AEFFDDC5AFFFDEC6B0FFDFC7B1FFE0C8B2FF000000FFF7F7F7FFF9F9F9FFF8F8 F8FFF7F7F7FF888D8BFFFFFFFF00FFFFFF00858A88FEF8F8F8FFF8F8F8FFF8F8 F8FFF8F8F8FFF8F8F8FFF8F8F8FF000000FFF8F8F8FF000000FFF8F8F8FFF8F8 F8FFF8F8F8FF888D8BFEFFFFFF00FFFFFF00898E8C94858A88FF858A88FF858A 88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A 88FF858A88FF8A8F8D94FFFFFF00808080FF808080FF808080FF808080FF8080 80FF808080FF808080FF0000000000000000000000003516E8FF000000000000 0000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF808080FF00000000583EE0FF2A0BE4FF1A00A8FF000000000000 0000000000000000000000000000808080FF808080FF808080FF808080FF8080 80FFFFFFFFFF808080FF1F00D3FF6E56E4FFCBC2F9FF1A00A8FF000000000000 0000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF1F00CCFF9F91F0FFC3BAF8FFCFC7F9FF1A00A8FF000000000000 0000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF583E E0FF3817EAFFBEB4F6FFAC9FF6FF7C66F0FFCAC2F9FF1B00B7FF1A00A8FF1A00 A8FF1A00A8FF1A00A8FF1E00CBFF808080FF808080FF808080FF1F01D5FF745D E6FFC1B7F8FF8F7CF2FF745DEFFF725BF0FFC8BFF9FFC5BBFAFFC2B7F9FFBDB2 F8FFB8ADF7FFB3A7F6FF1A00A8FFFFFFFFFFFFFFFFFF1E00D2FF9687EFFFAEA1 F6FF735CEFFF6B53EEFF6B52F1FF6A51F2FF694EF3FF664AF4FF5F43F3FF5537 F4FF4929F7FFB2A5F7FF1A00A8FF808080FF1E00D2FFAA9CF4FF8D79F2FF5B40 EEFF5B42EEFF6146EEFF6448F1FF5F43F4FF4C2BFAFF3B17FFFF2E06FFFF2701 FFFF2700FFFFAB9EF8FF1A00A8FFFFFFFFFF1A00A8FF9686F1FF745DEFFF2B07 FFFF2500FAFF2400F4FF2500EEFF2400EEFF2700F4FF2700F8FF2600F8FF2500 F4FF2500EDFF9E8DF8FF1A00A8FFFFFFFFFFFFFFFFFF1C00C4FF6D57E8FF7963 F0FF2300E7FF2200E0FF2300EAFF2500F4FF2800FCFF2902FFFF2902FFFF2600 FCFF2600F3FF9F8EF9FF1A00A8FF808080FF808080FFFFFFFFFF1F00D3FF4325 EBFF8D78F3FF3914FFFF2400EEFF2700F9FFA796FEFFA999FFFFA999FFFFA796 FEFFA393FCFFA090FAFF1A00A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF583E E0FF2302DEFF8873F3FF6B4FF8FF2700FEFFA898FFFF1E00BDFF1A00A8FF1A00 A8FF1A00A8FF1A00A8FF1E00CBFF808080FF808080FF808080FF808080FF8080 80FF808080FF1D00C0FF6D53EEFF8C77FCFFA898FFFF1A00A8FF000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000002000D4FF4022EFFFA08EFDFF1A00A8FF000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000005740E0FF2100DDFF1A00A8FF000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000003816E8FF000000000000 0000000000000000000000000000000000000000000000000000000000000000 00003516E8FF000000000000000000000000808080FF808080FF808080FF8080 80FF808080FF808080FF808080FF000000000000000000000000000000000000 00001A00A8FF280AE2FF5840E0FF00000000808080FFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 00001A00A8FFC5BDF8FF6953E4FF1F00D3FF808080FFFFFFFFFF808080FF8080 80FF808080FF808080FF808080FF000000000000000000000000000000000000 00001A00A8FFCAC1F9FFBFB4F7FF9C8DF0FF1F00CAFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFF1E00CBFF1A00A8FF1A00A8FF1A00A8FF1A00 A8FF1B00B7FFC7BFF8FF775FF0FFAA9CF6FFBDB3F6FF3817EAFF583EE0FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFF1A00A8FFB0A3F6FFB3A7F6FFB7ACF7FFBCB1 F7FFC0B5F8FFC4BAF9FF7058F2FF765DF3FF917EF5FFC3B9F9FF745FE6FF1F01 D5FF808080FF808080FF808080FF1A00A8FFAD9FF5FF3512FBFF4121F6FF4B2E F3FF593EF1FF6349F2FF694FF4FF6F53F5FF7157F4FF7A63F4FFB2A5F8FF9989 F0FF1F00D3FFFFFFFFFFFFFFFFFF1A00A8FFA697F5FF2200E8FF2300E5FF2500 F1FF2F0BFFFF4627FBFF6143F6FF684BF8FF694DF7FF684DF5FF654AF3FF917E F5FFADA1F4FF1F00D3FF808080FF1A00A8FF9887F3FF1F00D2FF2000D7FF2300 E1FF2300EAFF2500F2FF2600F7FF2904FFFF330EFFFF3B19FFFF3F1DFEFF7B63 F4FF9988F2FF1A00A8FFFFFFFFFF1A00A8FF9887F3FF1F00D2FF2000DBFF2300 E5FF2500EFFF2700F8FF2901FFFF2B04FFFF2901FFFF3009FFFF846DF9FF715A ECFF1F00C5FFFFFFFFFFFFFFFFFF1A00A8FF9887F3FF9887F3FF9B8AF6FF9F8E F9FFA291FBFFA695FDFF3009FFFF340EFFFF5634FFFF9884FCFF472DECFF2000 D4FFFFFFFFFF808080FF808080FF1E00CBFF1A00A8FF1A00A8FF1A00A8FF1A00 A8FF1D00BAFFA696FDFF3510FFFF7D64FFFF937FFCFF2302E3FF5740E0FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 00001A00A8FFA696FDFF937DFFFF735CF4FF1D00C1FF808080FF808080FF8080 80FF808080FF808080FF808080FF000000000000000000000000000000000000 00001A00A8FF9E8CFCFF4324F0FF2100D5FF0000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00001A00A8FF1F00DCFF5C41E0FF000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00003516E8FF0000000000000000000000000000000000000000000000000000 0000000000000000000000000000 } end object ContextMenu: TPopupMenu left = 136 top = 136 object miUndoContext: TMenuItem Action = actEditUndo Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000066DBEAFF11A6C2FF0000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000043C4DBFF43C5D8FF0000000000000000000000000000 00000000000000000000000000000000000000A0C4FF00000000000000000000 000000000000000000000EAACBFF5DDAE9FF23A6C0FF00000000000000000000 000000000000000000000000000000A0C4FF00A0C4FF00000000000000000000 0000000000000000000002ACC8FF88E7F2FF11A2C2FF00000000000000000000 0000000000000000000000A0C4FF76EDFBFF00A0C4FF00000000000000000000 00000000000000A0C4FF6DE6F5FF76E2EFFF19A3C1FF00000000000000000000 00000000000000A0C4FF76EDFBFF76EDFBFF00A0C4FF00A0C4FF00A0C4FF00A0 C4FF01A9C4FF6EE1EEFF0FC9DFFF69E4F2FF1AA4C0FF00000000000000000000 000000A0C4FF76EDFBFF04C3DAFF76EDFBFF69EAF9FF69EAF9FF69EAF9FF69EA F9FF05DDF7FF0AC8DFFF07C2D8FF6FDCEBFF1BA3BFFF000000000000000000A0 C4FF79EDFBFF32E2F8FF2CDFF4FF04C0D6FF04C0D6FF04C0D6FF1DD2E8FF1DD2 E8FF1DD2E8FF0BC8DFFF6AE5F3FF1BABC5FF15A0BCFF0000000000A0C4FFADF3 FBFF2FE0F6FF32E2F8FF32E2F7FF32E2F7FF2FE0F5FF29DBF1FF1DD2E8FF1DD2 E8FF1DD2E8FF36D9ECFF40CDE1FF16A1BDFF00000000000000000000000000A0 C4FFADF3FBFF2FE0F6FF32E2F7FF29DBF1FF2FE0F5FF29DBF1FF16CDE3FF36D9 ECFF69E7F6FF41CEE3FF13A3C1FF000000000000000000000000000000000000 000000A0C4FFADF3FBFF31E1F6FF20E3FAFF73ECFAFF6FEBFAFF6EE8F7FF6CE8 F7FF14A1BCFF14A3C1FF00000000000000000000000000000000000000000000 00000000000000A0C4FFADF3FBFF25E4FBFF00A0C4FF00A0C4FF13A1BEFF159F BBFF1BA1BBFF0000000000000000000000000000000000000000000000000000 0000000000000000000000A0C4FFADF3FBFF00A0C4FF00000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000A0C4FF00A0C4FF00000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000A0C4FF00000000000000000000 0000000000000000000000000000000000000000000000000000 } OnClick = actEditUndoExecute end object miSeparator1: TMenuItem Caption = '-' end object miCutContext: TMenuItem Action = actEditCut Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 00000E0EAAFF1010ABFF1616ABFF000000000000000000000000000000000000 0000000000000D0DAAFF0B0BAAFF0B0BA9FF0000000000000000000000001313 ABFF2727DBFF1F1FD0FF1D1DCEFF0707A8FF0000000000000000000000000000 00000808AAFF2222D4FF1D1DCFFF1D1DCEFF1313ABFF00000000000000000D0D ABFF1D1DCFFF000000000B0BB5FF2121D3FF0C0CAAFF00000000000000000909 AAFF2323D6FF0D0DB8FF000000001F1FD1FF1111ABFF00000000000000001414 ABFF2323D5FF00000000000000001D1DCEFF0A0AA9FF00000000000000000303 A8FF1A1BCAFF00000000000000002020D1FF1414ABFF00000000000000000000 00000606A8FF1F1FD0FF0303A8FF1415C0FF0101A6FF00000000000000001C1D CDFF1315C0FF0303A8FF1D1DCDFF0606A7FF0000000000000000000000000000 0000000000000707A9FF2020D2FF1E1ECEFF0E0FB7FF0205A4FF0304A8FF1A1A C9FF2020D1FF1F1FCBFF0A0AA9FF000000000000000000000000000000000000 000000000000000000001818AEFF1616ABFF0606A6FF454AA3FF0202A6FF191A C7FF1717ADFF1818AEFF00000000000000000000000000000000000000000000 000000000000000000000000000000000000848989FFC3C6C5FFAFB2B3FF2C2F 9CFF000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000008A8F8DFFB7BBBAFFE6E8E7FFA7ACAAFF8B90 8EFF878C8AFF0000000000000000000000000000000000000000000000000000 0000000000000000000000000000888D8BFFDFE1E1FFF5F6F5FF979C9AFFA5A9 A8FF888D8BFF0000000000000000000000000000000000000000000000000000 000000000000000000008A8F8DFFB2B6B5FFF7F7F7FF888D8BFF9CA09FFFB3B6 B5FFB5BAB8FF888D8BFF00000000000000000000000000000000000000000000 00000000000000000000888D8BFFD9DCDBFFEFF0EFFF8E9391FF898E8CFFB3B8 B6FFCBCECDFF888D8BFF00000000000000000000000000000000000000000000 0000000000008A8F8DFFB0B5B3FFF6F7F7FF888D8BFF00000000000000008B90 8EFFC9CECCFFABAFAEFF888D8BFF000000000000000000000000000000000000 000000000000888D8BFFD0D4D2FFEFF0EFFF8F9492FF00000000000000000000 0000A7ACAAFFC3C8C6FF8A8F8DFF000000000000000000000000000000000000 0000000000008B908EFFF7F7F7FF888D8BFF0000000000000000000000000000 00008D9190FFD0D3D2FF8C918FFF000000000000000000000000000000000000 00000000000000000000888D8BFF909593FF0000000000000000000000000000 0000888D8BFF8C918FFF00000000000000000000000000000000 } OnClick = actEditCutExecute end object miCopyContext: TMenuItem Action = actEditCopy Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 00000000000000000000898E8CFF868B89FF858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF858A88FF000000000000000000000000000000000000 00000000000000000000868B89FFF4F4F4FFF6F7F7FFF5F6F6FFFBFCFCFFFBFB FBFFD4D4D4FF969A98FFE2E4E3FF858A88FF0000000000000000000000000000 00000000000000000000868B89FFF9FAFAFFEFF0F0FFEFF0F0FFEFF0F0FFFAFA FAFFFAFAFAFF959A98FFFAFAFAFFE2E3E3FF858A88FF858A88FF000000000000 00000000000000000000868B89FFFDFEFEFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFFAFAFAFF959A98FFFAFAFAFFF7F8F8FFE2E4E3FF858A88FF000000000000 00000000000000000000878C8AFFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFEFF0F0FF898E8CFF898E8CFF898E8CFF898E8CFF858A88FF000000000000 00000000000000000000878C8AFFFFFFFFFFEFF0F0FFC6C7C7FFC6C7C7FFC6C7 C7FFC6C7C7FFC6C7C7FFEEEEEEFFF6F7F7FFC3C4C3FF858A88FF000000000000 00000000000000000000868B89FFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFEFF0F0FFEFF0F0FFEFF0F0FFFAFAFAFFF3F3F3FF858A88FF000000000000 00000000000000000000878C8AFFFFFFFFFFEFF0F0FFC6C7C7FFC6C7C7FFC6C7 C7FFC6C7C7FFC6C7C7FFEFF0F0FFEFF0F0FFFFFFFFFF858A88FF000000000000 00000000000000000000868B89FFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFFFFFFFFF858A88FF000000000000 00000000000000000000878C8AFFFFFFFFFFEFF0F0FFC6C7C7FFC6C7C7FFC6C7 C7FFC6C7C7FFC6C7C7FFC6C7C7FFEFF0F0FFFFFFFFFF858A88FF000000000000 00000000000000000000868B89FFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFFFFFFFFF858A88FF000000000000 00000000000000000000878C8AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF858A88FF000000000000 00000000000000000000979B9AFF858A88FF858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF858A88FF858A88FF858A88FF8A8F8DFF000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } OnClick = actEditCopyExecute end object miPasteContext: TMenuItem Action = actEditPaste Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 000001436CFF01446CFF01446CFF01446CFF01446CFF01446CFF01446CFF0144 6CFF01446CFF01446CFF01446CFF01436BFF0000000000000000000000000143 6CFF237FBAFF3B7DA7FF646F73FF686C6AFF686C6AFF686C6AFF686C6AFF686C 6AFF3D7CA3FF3D7CA3FF3D7CA3FF227BB3FF01436BFF00000000000000000245 6EFF2687C5FF636D70FFEDEEEDFFFEFEFEFFFEFEFEFFFEFEFEFFEEEFEFFFFDFE FEFF646967FF2787C5FF2787C5FF2787C5FF00426AFF00000000000000000245 6EFF2687C5FF646866FFFFFFFFFFE4E7E7FFD5D8D8FFBEC2C1FFB4B7B7FFFFFF FFFFFFFFFFFF646967FF2787C5FF2886C2FF00426AFF00000000000000000245 6EFF2687C5FF646866FFFFFFFFFFE7E9E9FFE5E7E7FFD6D9D9FFB6B9B9FFFFFF FFFFFFFFFFFFFFFFFFFF646967FF2886C2FF00426AFF00000000000000000246 6EFF2687C5FF646866FFFFFFFFFFEAECECFFE8EAEAFFE6E8E8FFCBCECDFFB6BA B9FFB5B9B8FFFFFFFFFF646967FF2886C2FF00426AFF00000000000000000246 6EFF2687C5FF646866FFFFFFFFFFEDEEEEFFEBECECFFE9EBEBFFE7E9E9FFD8DA DAFFCACDCCFFFFFFFFFF646967FF2886C2FF00426AFF00000000000000000246 6EFF2687C5FF646866FFFFFFFFFFEFF0F0FFEEEFEFFFECEDEDFFEAEBEBFFE8EA EAFFD9DBDBFFFFFFFFFF646967FF2886C2FF00426AFF00000000000000000246 6EFF2687C5FF646866FFFFFFFFFFEFF0F0FFB5B5B3FFB5B5B3FFB4B4B2FFB2B2 B1FFE8EAEAFFFFFFFFFF646967FF2886C2FF00426AFF00000000000000000246 6FFF2687C5FF646866FFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEDEF EFFFEBEDEDFFFFFFFFFF646967FF2886C2FF00426AFF00000000000000000246 6FFF2687C5FF646866FFFFFFFFFFEFF0F0FFB5B5B3FFB5B5B3FFB5B5B3FFB5B5 B3FFEEEFEFFFFFFFFFFF646967FF2886C2FF00426AFF00000000000000000246 6FFF2788C6FF646866FFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0 F0FFEFF0F0FFFFFFFFFF646967FF2886C2FF00426AFF00000000000000000246 6FFF2788C6FF646F71FFF1F1F1FFE0E0E0FFBBBBBBFFBBBBBBFFBBBBBBFFBBBB BBFFE0E0E0FFF2F2F2FF646D6EFF2787C5FF00426AFF00000000000000000144 6DFF2484C0FF3E7EA4FF646D70FF5E5E5EFF7C7F7FFF7D8080FF7D8080FF7B7E 7EFF5E5E5EFF646C6EFF407CA1FF237FB9FF01436CFF00000000000000000000 000001446DFF01446CFF03446BFF5B5C5CFF899595FF8A9797FF8A9797FF8995 95FF5B5C5CFF03446BFF01446CFF01446CFF0000000000000000000000000000 00000000000000000000000000005E5F5FFF5C5C5CFF5C5C5CFF5C5C5CFF5C5C 5CFF5E5F5FFF0000000000000000000000000000000000000000 } OnClick = actEditPasteExecute end object miDeleteContext: TMenuItem Action = actEditDelete Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000008C90 8FFF919493FFADB0AFFF0000000000000000909492FF9DA09FFF989C9AFF0000 000000000000000000007B7E7DFF989B9AFF0000000000000000000000008C90 8FFFFAFAFAFF949897FF999C9BFF999C9BFF969A98FFEDEEEEFF949997FF9B9E 9DFF989B9AFF8B8E8DFFFFFFFFFF8F9392FF0000000000000000000000008C90 8FFF858988FFF6F6F6FF999C9BFFABADACFF838885FFDEDFDEFF9C9F9EFFCCCE CDFF989B9AFFEBEBEBFF969998FF000000000000000000000000000000000000 0000858988FFC9CBCAFF838885FFC4C4C4FF838885FFCACCCBFF9B9D9CFFC0C0 C0FF7C807FFFE2E3E3FF8B8E8DFF000000000000000000000000000000000000 0000727675FFC7C9C8FF797E7BFF9E9F9EFF8E8F8FFFADAEADFF8C8D8CFFAEAF AEFF7C807FFFB7B8B7FF767978FF000000000000000000000000000000000000 00006A6E6DFFCCCDCDFF656968FFAAACABFF6C6F6EFFAEB0AFFF6B6E6DFFB0B2 B1FF6E7271FFB2B3B3FF6C706FFF000000000000000000000000874920FF874A 20FF874A20FF874A20FF874A20FF874A20FF874A20FF874A20FF874A20FF874A 20FF874A20FF874A20FF874A20FF874A20FF874A20FF874920FF874A20FFDDBB 9CFFCF9F72FFCF9F72FFCF9F72FFCF9F72FFCF9F72FFCF9F72FFCF9F72FFCF9F 72FFCF9F72FFCF9F72FFCF9F72FFCF9F72FFDDBB9CFF874A20FF874A20FFDDBB 9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB 9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB9CFFDDBB9CFF874A20FF874A20FFDDBB 9CFFCA8A58FFCA8A58FFCA8A58FFCA8A58FFCA8A58FFCA8A58FFCA8A58FFCA8A 58FFCA8A58FFCA8A58FFCA8A58FFCA8A58FFDDBB9CFF874A20FF874A20FFDDBB 9CFF86522CFF86512BFF86512BFF86512BFF86512BFF86512BFF86522CFF8652 2CFF86522CFF86522CFF86522CFF86522CFFDDBB9CFF874A20FF874A20FFDDBB 9CFF6A5B4EFFC9C9C9FF9C9C9CFF9C9C9CFF9C9C9CFF9B9B9BFF9B9B9BFF9B9B 9BFF9B9B9BFF9B9B9BFF9B9B9BFF6A5B4EFFDDBB9CFF874A20FF874A20FFDDBB 9CFF777C7AFFD9D9D9FFBDBDBDFFBDBDBDFFBDBDBDFFBDBDBDFFBCBCBCFFBCBC BCFFBCBCBCFFBFBFBFFFC0C0C0FF777C7AFFDDBB9CFF874A20FF00000000874A 20FF858A88FFE7E7E7FFD7D7D7FFD6D6D6FFD6D6D6FFD6D6D6FFD6D6D6FFD5D5 D5FFD5D5D5FFDADADAFFDCDCDCFF858A88FF874A20FF00000000000000000000 0000858A88FFF1F1F1FFEBEBEBFFEBEBEBFFEBEBEBFFEAEAEAFFEAEAEAFFEAEA EAFFEAEAEAFFEAEAEAFFE9E9E9FF858A88FF0000000000000000000000000000 00008F9391FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF858A88FF8F9391FF0000000000000000 } OnClick = actEditDeleteExecute end object miSeparator2: TMenuItem Caption = '-' end object miSelectAllContext: TMenuItem Action = actEditSelectAll Bitmap.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 200000000000000400006400000064000000000000000000000000000000898E 8CFF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF858A88FF858A88FF8A8F8DFF0000000000000000858A 88FFF8F8F8FFF8F8F8FFF8F8F8FFF8F8F8FFF8F8F8FFF8F8F8FF000000FFF8F8 F8FF000000FFF8F8F8FFF8F8F8FFF8F8F8FF888D8BFF0000000000000000858A 88FFF9F9F9FFDBC3ADFFDCC4AEFFDDC5AFFFDEC6B0FFDFC7B1FFE0C8B2FF0000 00FFF7F7F7FFF9F9F9FFF8F8F8FFF7F7F7FF888D8BFF0000000000000000858A 88FFF9F9F9FFDBC3ADFFB09882FFB09882FFB09882FFB09882FFE0C8B2FF0000 00FFF7F7F7FFF8F8F8FFF7F7F7FFF7F7F7FF888D8BFF0000000000000000858A 88FFFAFAFAFFDBC3ADFFDCC4AEFFDDC5AFFFDEC6B0FFDFC7B1FFE0C8B2FF0000 00FFF5F5F5FFF6F6F6FFF6F6F6FFF7F7F7FF888D8BFF0000000000000000858A 88FFFBFBFBFFDBC3ADFFDCC4AEFFDDC5AFFFDEC6B0FFDEC6B0FF000000FFE0C8 B2FF000000FFE1C9B3FFF4F4F4FFF7F7F7FF888D8BFF0000000000000000858A 88FFFBFBFBFFDAC2ACFFAF9781FFAF9781FFAF9781FFAF9781FFAF9781FFAF97 81FFAF9781FFE0C8B2FFF2F2F2FFF7F7F7FF888D8BFF0000000000000000858A 88FFFCFCFCFFDAC2ACFFDBC3ADFFDCC4AEFFDDC5AFFFDDC5AFFFDEC6B0FFDEC6 B0FFDFC7B1FFDFC7B1FFF0F0F0FFF8F8F8FF888D8BFF0000000000000000858A 88FFFCFCFCFFDAC2ACFFDAC2ACFFDBC3ADFFDCC4AEFFDDC5AFFFDDC5AFFFDEC6 B0FFDEC6B0FFDEC6B0FFEEEEEEFFF8F8F8FF888D8BFF0000000000000000858A 88FFFCFCFCFFD9C1ABFFAF9781FFAF9781FFAF9781FFAF9781FFDCC4AEFFAF97 81FFAF9781FFDDC5AFFFECECECFFF8F8F8FF888D8BFF0000000000000000858A 88FFFDFDFDFFD8C0AAFFAF9781FFAF9781FFAF9781FFAF9781FFDBC3ADFFDCC4 AEFFDCC4AEFFDCC4AEFFEBEBEBFFF8F8F8FF888D8BFF0000000000000000858A 88FFFDFDFDFFD8C0AAFFAF9781FFAF9781FFAF9781FFAF9781FFDBC3ADFFDBC3 ADFFDBC3ADFFDBC3ADFFDBC3ADFFF8F8F8FF888D8BFF0000000000000000858A 88FFFEFEFEFFD7BFA9FFAF9781FFAF9781FFAF9781FFAF9781FFDAC2ACFFAF97 81FFAF9781FFAF9781FFDAC2ACFFF8F8F8FF888D8BFF0000000000000000858A 88FFFDFDFDFFD6BEA8FFD7BFA9FFD7BFA9FFD8C0AAFFD8C0AAFFD9C1ABFFD9C1 ABFFD9C1ABFFD9C1ABFFD9C1ABFFF8F8F8FF888D8BFF0000000000000000858A 88FFFDFDFDFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFDFFFCFCFCFFFCFCFCFFFBFB FBFFFBFBFBFFFAFAFAFFFAFAFAFFF9F9F9FF888D8BFF0000000000000000898D 8BFF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF858A88FF858A88FF898E8CFF00000000 } OnClick = actEditSelectAllExecute end end object pmEncodingLeft: TPopupMenu left = 256 top = 144 end object pmEncodingRight: TPopupMenu left = 319 top = 144 end end doublecmd-0.5.8/src/fmkdir.lrt0000644000175000017500000000023712023046500015266 0ustar alexxalexxTFRMMKDIR.CAPTION=Create new directory TFRMMKDIR.LBLMAKEDIR.CAPTION=&Input new directory name: TFRMMKDIR.BTNOK.CAPTION=&OK TFRMMKDIR.BTNCANCEL.CAPTION=&Cancel doublecmd-0.5.8/src/ftweakplugin.lrt0000644000175000017500000000245212020403374016516 0ustar alexxalexxTFRMTWEAKPLUGIN.CAPTION=Tweak plugin TFRMTWEAKPLUGIN.LBLPLUGIN.CAPTION=&Plugin: TFRMTWEAKPLUGIN.LBLEXTENSION.CAPTION=&Extension: TFRMTWEAKPLUGIN.LBLFLAGS.CAPTION=Flags: TFRMTWEAKPLUGIN.BTNREMOVE.CAPTION=&Remove TFRMTWEAKPLUGIN.BTNADD.CAPTION=A&dd new TFRMTWEAKPLUGIN.BTNCHANGE.CAPTION=C&hange TFRMTWEAKPLUGIN.CBPK_CAPS_NEW.CAPTION=Can create new archi&ves TFRMTWEAKPLUGIN.CBPK_CAPS_MODIFY.CAPTION=Can &modify exisiting archives TFRMTWEAKPLUGIN.CBPK_CAPS_MULTIPLE.CAPTION=&Archive can contain multiple files TFRMTWEAKPLUGIN.CBPK_CAPS_DELETE.CAPTION=Can de&lete files TFRMTWEAKPLUGIN.CBPK_CAPS_OPTIONS.CAPTION=S&upports the options dialogbox TFRMTWEAKPLUGIN.CBPK_CAPS_MEMPACK.CAPTION=Supports pac&king in memory TFRMTWEAKPLUGIN.CBPK_CAPS_BY_CONTENT.CAPTION=De&tect archive type by content TFRMTWEAKPLUGIN.CBPK_CAPS_SEARCHTEXT.CAPTION=Allow searchin&g for text in archives TFRMTWEAKPLUGIN.CBPK_CAPS_HIDE.CAPTION=Sho&w as normal files (hide packer icon) TFRMTWEAKPLUGIN.CBPK_CAPS_ENCRYPT.CAPTION=Supports e&ncryption TFRMTWEAKPLUGIN.BTNDEFAULT.CAPTION=De&fault TFRMTWEAKPLUGIN.LBLNAME.CAPTION=&Name: TFRMTWEAKPLUGIN.LBLDETECTSTR.CAPTION=D&etect string: TFRMTWEAKPLUGIN.LBLDESCRIPTION.CAPTION=&Description: TFRMTWEAKPLUGIN.LBLPLUGIN1.CAPTION=&Plugin: TFRMTWEAKPLUGIN.BTNOK.CAPTION=&OK TFRMTWEAKPLUGIN.BTNCANCEL.CAPTION=&Cancel doublecmd-0.5.8/src/fviewoperations.pas0000644000175000017500000010742411747211345017243 0ustar alexxalexxunit fViewOperations; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, StdCtrls, ExtCtrls, LCLType, ComCtrls, Buttons, LCLIntf, Menus, uFileSourceOperation, uOperationsManager, Themes; type TViewBaseItem = class; TViewBaseItemClick = procedure(Item: TViewBaseItem; Button: TMouseButton; Shift: TShiftState; const Pt: TPoint) of object; TViewBaseItemContextMenu = procedure(Item: TViewBaseItem; const Point: TPoint) of object; TViewBaseItemSelected = procedure(Item: TViewBaseItem) of object; TViewOperationsStatusIcon = (vosiPlay, vosiPause, vosiHourglass); { TViewBaseItem } TViewBaseItem = class private FOnClick: TViewBaseItemClick; FOnContextMenu: TViewBaseItemContextMenu; FOnSelected: TViewBaseItemSelected; FTreeNode: TTreeNode; FText: String; FTextRect: TRect; procedure CalculateSizes(Canvas: TCanvas; NeedsStatusIcon, NeedsProgress: Boolean); procedure DrawProgress(Canvas: TCanvas; NodeRect: TRect; Progress: Double); procedure DrawStatusIcon(Canvas: TCanvas; NodeRect: TRect; Icon: TViewOperationsStatusIcon); procedure DrawThemedBackground(Canvas: TCanvas; Element: TThemedTreeview; ARect: TRect); procedure DrawThemedText(Canvas: TCanvas; Element: TThemedTreeview; NodeRect: TRect; Center: Boolean; AText: String); function GetStatusIconRect(NodeRect: TRect): TRect; function GetTextIndent: Integer; virtual; abstract; procedure UpdateView(Canvas: TCanvas); virtual; abstract; public constructor Create(ANode: TTreeNode); virtual; procedure Click(const Pt: TPoint; Button: TMouseButton; Shift: TShiftState); virtual; procedure Draw(Canvas: TCanvas; NodeRect: TRect); virtual; abstract; function GetBackgroundColor: TColor; virtual; abstract; procedure KeyDown(var Key: Word; Shift: TShiftState); virtual; procedure Selected; virtual; procedure StartPause; virtual; abstract; procedure Stop; virtual; abstract; property OnClick: TViewBaseItemClick read FOnClick write FOnClick; property OnContextMenu: TViewBaseItemContextMenu read FOnContextMenu write FOnContextMenu; property OnSelected: TViewBaseItemSelected read FOnSelected write FOnSelected; end; { TViewQueueItem } TViewQueueItem = class(TViewBaseItem) private FQueueIdentifier: TOperationsManagerQueueIdentifier; function GetTextIndent: Integer; override; procedure UpdateView(Canvas: TCanvas); override; public constructor Create(ANode: TTreeNode; AQueueId: TOperationsManagerQueueIdentifier); reintroduce; procedure Click(const Pt: TPoint; Button: TMouseButton; Shift: TShiftState); override; procedure Draw(Canvas: TCanvas; NodeRect: TRect); override; function GetBackgroundColor: TColor; override; procedure StartPause; override; procedure Stop; override; end; TViewOperationItem = class; { TViewOperationItem } TViewOperationItem = class(TViewBaseItem) private FOperationHandle: TOperationHandle; FProgress: Double; function GetTextIndent: Integer; override; procedure UpdateView(Canvas: TCanvas); override; public constructor Create(ANode: TTreeNode; AOperationHandle: TOperationHandle); reintroduce; procedure Click(const Pt: TPoint; Button: TMouseButton; Shift: TShiftState); override; procedure Draw(Canvas: TCanvas; NodeRect: TRect); override; function GetBackgroundColor: TColor; override; procedure StartPause; override; procedure Stop; override; end; { TfrmViewOperations } TfrmViewOperations = class(TForm) btnStop: TBitBtn; btnStartPause: TBitBtn; cbAlwaysOnTop: TCheckBox; lblUseDragDrop: TLabel; mnuCancelQueue: TMenuItem; mnuNewQueue: TMenuItem; mnuCancelOperation: TMenuItem; mnuPutFirstInQueue: TMenuItem; mnuPutLastInQueue: TMenuItem; mnuOperationShowDetached: TMenuItem; mnuQueue2: TMenuItem; mnuQueue3: TMenuItem; mnuQueue5: TMenuItem; mnuQueue4: TMenuItem; mnuQueue1: TMenuItem; mnuQueue0: TMenuItem; mnuQueue: TMenuItem; mnuQueueShowDetached: TMenuItem; pnlHeader: TPanel; pmQueuePopup: TPopupMenu; pnlTopHeader: TPanel; pmOperationPopup: TPopupMenu; tbPauseAll: TToggleBox; tvOperations: TTreeView; UpdateTimer: TTimer; procedure btnStopClick(Sender: TObject); procedure cbAlwaysOnTopChange(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure mnuCancelOperationClick(Sender: TObject); procedure mnuCancelQueueClick(Sender: TObject); procedure mnuNewQueueClick(Sender: TObject); procedure mnuPutFirstInQueueClick(Sender: TObject); procedure mnuPutLastInQueueClick(Sender: TObject); procedure mnuOperationShowDetachedClick(Sender: TObject); procedure mnuQueueShowDetachedClick(Sender: TObject); procedure OnOperationItemContextMenu(Item: TViewBaseItem; const Point: TPoint); procedure OnOperationItemSelected(Item: TViewBaseItem); procedure OnQueueContextMenu(Item: TViewBaseItem; const Point: TPoint); procedure OnQueueItemSelected(Item: TViewBaseItem); procedure OnUpdateTimer(Sender: TObject); procedure btnStartPauseClick(Sender: TObject); procedure mnuQueueNumberClick(Sender: TObject); procedure tbPauseAllChange(Sender: TObject); procedure tvOperationsCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); procedure tvOperationsDeletion(Sender: TObject; Node: TTreeNode); procedure tvOperationsDragDrop(Sender, Source: TObject; X, Y: Integer); procedure tvOperationsDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure tvOperationsKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure tvOperationsMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure tvOperationsResize(Sender: TObject); procedure tvOperationsSelectionChanged(Sender: TObject); private FDraggedOperation: TOperationHandle; FMenuOperation: TOperationHandle; FMenuQueueIdentifier: TOperationsManagerQueueIdentifier; procedure CreateNodes; function GetFocusedItem: TViewBaseItem; procedure MoveWithinQueue(MoveToTop: Boolean); procedure SetFocusItem(AOperationHandle: TOperationHandle); procedure SetFocusItem(AQueueIdentifier: TOperationsManagerQueueIdentifier); procedure SetNewQueue(Item: TViewOperationItem; NewQueue: TOperationsManagerQueueIdentifier); procedure SetStartPauseCaption(SetPause: Boolean); procedure UpdateView(Item: TOperationsManagerItem; Event: TOperationManagerEvent); procedure UpdateSizes; end; procedure ShowOperationsViewer; procedure ShowOperationsViewer(AOperationHandle: TOperationHandle); procedure ShowOperationsViewer(AQueueIdentifier: TOperationsManagerQueueIdentifier); implementation {$R *.lfm} uses GraphMath, GraphType, Math, fFileOpDlg, uLng, uGlobs, uFileSourceOperationMisc; const ExpandSignSize = 9; StatusIconPlay: array[0..2] of TPoint = ((x: 5; y: 1), (x: 13; y: 9), (x: 5; y: 17)); StatusIconPause1: array[0..3] of TPoint = ((x: 3; y: 2), (x: 3; y: 16), (x: 7; y: 16), (x: 7; y: 2)); StatusIconPause2: array[0..3] of TPoint = ((x: 10; y: 2), (x: 10; y: 16), (x: 14; y: 16), (x: 14; y: 2)); StatusIconHourglass1: array[0..2] of TPoint = ((x: 3; y: 4), (x: 13; y: 4), (x: 8; y: 10)); StatusIconHourglass2: array[0..2] of TPoint = ((x: 8; y: 10), (x: 13; y: 15), (x: 3; y: 15)); StatusIconFrame: TRect = (Left: 0; Top: 0; Right: 18; Bottom: 19); StatusIconRightMargin = 5; ProgressHeight = 16; ProgressWidth = 150; ProgressHorizontalMargin = 5; FreeOperationTextIndent = 3; MarginTopBottom = 2; var frmViewOperations: TfrmViewOperations = nil; ProgressRight: Integer; procedure ShowOperationsViewer; begin if not Assigned(frmViewOperations) then frmViewOperations := TfrmViewOperations.Create(Application); frmViewOperations.ShowOnTop; end; procedure ShowOperationsViewer(AOperationHandle: TOperationHandle); begin ShowOperationsViewer; if AOperationHandle <> InvalidOperationHandle then frmViewOperations.SetFocusItem(AOperationHandle); end; procedure ShowOperationsViewer(AQueueIdentifier: TOperationsManagerQueueIdentifier); begin ShowOperationsViewer; frmViewOperations.SetFocusItem(AQueueIdentifier); end; procedure ApplyProgress(var ARect: TRect; Progress: Double); begin ARect.Right := ARect.Left + Round((ARect.Right - ARect.Left) * Progress); end; function MoveRect(aRect: TRect; DeltaX, DeltaY: Integer): TRect; begin Result.Left := aRect.Left + DeltaX; Result.Right := aRect.Right + DeltaX; Result.Top := aRect.Top + DeltaY; Result.Bottom := aRect.Bottom + DeltaY; end; procedure DrawMovePolygon(Canvas: TCanvas; const Points: array of TPoint; DeltaX, DeltaY: Integer); var CopyPoints: PPoint; i: Integer; begin CopyPoints := GetMem(SizeOf(TPoint) * Length(Points)); for i := 0 to Length(Points) - 1 do begin CopyPoints[i].x := Points[i].x + DeltaX; CopyPoints[i].y := Points[i].y + DeltaY; end; Canvas.Polygon(CopyPoints, Length(Points), True); FreeMem(CopyPoints); end; { TViewBaseItem } procedure TViewBaseItem.DrawThemedBackground(Canvas: TCanvas; Element: TThemedTreeview; ARect: TRect); var Details: TThemedElementDetails; begin Details := ThemeServices.GetElementDetails(Element); if ThemeServices.HasTransparentParts(Details) then begin Canvas.Brush.Color := GetBackgroundColor; Canvas.FillRect(ARect); end; ThemeServices.DrawElement(Canvas.Handle, Details, ARect, nil); end; procedure TViewBaseItem.DrawProgress(Canvas: TCanvas; NodeRect: TRect; Progress: Double); var Details: TThemedElementDetails; begin if Progress > 0 then begin NodeRect.Right := NodeRect.Right - ProgressRight; NodeRect.Left := NodeRect.Right - ProgressWidth; NodeRect.Top := NodeRect.Top + (NodeRect.Bottom - NodeRect.Top - ProgressHeight) div 2; NodeRect.Bottom := NodeRect.Top + ProgressHeight; if ThemeServices.ThemesEnabled then begin Details := ThemeServices.GetElementDetails(tpBar); ThemeServices.DrawElement(Canvas.Handle, Details, NodeRect, nil); Details := ThemeServices.GetElementDetails(tpChunk); InflateRect(NodeRect, -2, -2); ApplyProgress(NodeRect, Progress); ThemeServices.DrawElement(Canvas.Handle, Details, NodeRect, nil); end else begin Canvas.Pen.Color := clWindowText; Canvas.Brush.Color := clForm; Canvas.RoundRect(NodeRect, 3, 3); Canvas.Brush.Color := clHighlight; ApplyProgress(NodeRect, Progress); Canvas.RoundRect(NodeRect, 3, 3); end; end; end; procedure TViewBaseItem.DrawStatusIcon(Canvas: TCanvas; NodeRect: TRect; Icon: TViewOperationsStatusIcon); var IconRect: TRect; begin Canvas.Brush.Color := GetBackgroundColor; Canvas.Pen.Color := clWindowText; IconRect := MoveRect(GetStatusIconRect(NodeRect), NodeRect.Left, NodeRect.Top); Canvas.Rectangle(IconRect); case Icon of vosiPlay: // Paint "Play" triangle begin Canvas.Brush.Color := RGBToColor(0, 200, 0); DrawMovePolygon(Canvas, StatusIconPlay, IconRect.Left, IconRect.Top); end; vosiPause: // Paint "Pause" double line begin Canvas.Brush.Color := RGBToColor(0, 0, 200); DrawMovePolygon(Canvas, StatusIconPause1, IconRect.Left, IconRect.Top); DrawMovePolygon(Canvas, StatusIconPause2, IconRect.Left, IconRect.Top); end; else // Paint "Hourglass" begin Canvas.Brush.Color := RGBToColor(255, 255, 255); DrawMovePolygon(Canvas, StatusIconHourglass1, IconRect.Left, IconRect.Top); DrawMovePolygon(Canvas, StatusIconHourglass2, IconRect.Left, IconRect.Top); end; end; end; procedure TViewBaseItem.DrawThemedText(Canvas: TCanvas; Element: TThemedTreeview; NodeRect: TRect; Center: Boolean; AText: String); var Details: TThemedElementDetails; Flags: Cardinal = DT_WORDBREAK or DT_NOPREFIX; begin Details := ThemeServices.GetElementDetails(Element); if Center then Flags := Flags + DT_VCENTER; ThemeServices.DrawText(Canvas, Details, AText, NodeRect, Flags, 0); end; function TViewBaseItem.GetStatusIconRect(NodeRect: TRect): TRect; begin Result := MoveRect(StatusIconFrame, (NodeRect.Right - NodeRect.Left) - (StatusIconFrame.Right - StatusIconFrame.Left) - StatusIconRightMargin, ((NodeRect.Bottom - NodeRect.Top) - (StatusIconFrame.Bottom - StatusIconFrame.Top)) div 2); end; constructor TViewBaseItem.Create(ANode: TTreeNode); begin FTreeNode := ANode; end; procedure TViewBaseItem.CalculateSizes(Canvas: TCanvas; NeedsStatusIcon, NeedsProgress: Boolean); var NodeRect: TRect; NeededHeight: Integer; begin // Calculate available width for text. NodeRect := FTreeNode.DisplayRect(False); FTextRect := Rect(0, 0, 0, 0); FTextRect.Right := (NodeRect.Right - NodeRect.Left) - GetTextIndent - (ProgressRight + ProgressWidth + ProgressHorizontalMargin); // Calculate text height. DrawText(Canvas.Handle, PChar(FText), Length(FText), FTextRect, DT_NOPREFIX + DT_CALCRECT + DT_WORDBREAK); // Take max of text, progress and status icon. NeededHeight := FTextRect.Bottom - FTextRect.Top; if NeedsProgress then NeededHeight := Max(NeededHeight, ProgressHeight); if NeedsStatusIcon then NeededHeight := Max(NeededHeight, StatusIconFrame.Bottom - StatusIconFrame.Top); Inc(NeededHeight, 2 * MarginTopBottom); FTextRect := MoveRect(FTextRect, NodeRect.Left + GetTextIndent, NodeRect.Top); FTreeNode.Height := NeededHeight; end; procedure TViewBaseItem.Click(const Pt: TPoint; Button: TMouseButton; Shift: TShiftState); var Handled: Boolean = False; begin case Button of mbRight: if Assigned(FOnContextMenu) then begin OnContextMenu(Self, Pt); Handled := True; end; end; if not Handled and Assigned(FOnClick) then FOnClick(Self, Button, Shift, Pt); end; procedure TViewBaseItem.KeyDown(var Key: Word; Shift: TShiftState); var Rect: TRect; Point: TPoint; begin case Key of VK_APPS: if Assigned(FOnContextMenu) then begin Rect := FTreeNode.DisplayRect(False); Point.x := Rect.Left + (Rect.Right - Rect.Left) div 2; Point.y := Rect.Top + (Rect.Bottom - Rect.Top) div 2; OnContextMenu(Self, Point); Key := 0; end; VK_SPACE: begin StartPause; Key := 0; end; VK_DELETE, VK_BACK: begin Stop; Key := 0; end; end; end; procedure TViewBaseItem.Selected; begin if Assigned(FOnSelected) then FOnSelected(Self); end; { TViewOperationItem } constructor TViewOperationItem.Create(ANode: TTreeNode; AOperationHandle: TOperationHandle); begin FOperationHandle := AOperationHandle; inherited Create(ANode); end; procedure TViewOperationItem.Click(const Pt: TPoint; Button: TMouseButton; Shift: TShiftState); var Handled: Boolean = False; OpManItem: TOperationsManagerItem; NodeRect: TRect; begin OpManItem := OperationsManager.GetItemByHandle(FOperationHandle); if Assigned(OpManItem) then begin case Button of mbLeft: if OpManItem.Queue.IsFree then begin NodeRect := FTreeNode.DisplayRect(False); if ((ssDouble in Shift) or PtInRect(GetStatusIconRect(NodeRect), Pt)) then begin StartPause; Handled := True; end; end; end; end; if not Handled then inherited Click(Pt, Button, Shift); end; procedure TViewOperationItem.Draw(Canvas: TCanvas; NodeRect: TRect); var OpManItem: TOperationsManagerItem; Element: TThemedTreeview; Icon: TViewOperationsStatusIcon; begin if FTreeNode.Selected then Element := ttItemSelected else Element := ttItemNormal; DrawThemedBackground(Canvas, Element, NodeRect); OpManItem := OperationsManager.GetItemByHandle(FOperationHandle); if Assigned(OpManItem) then begin DrawThemedText(Canvas, Element, FTextRect, True, FText); if OpManItem.Queue.IsFree then begin case OpManItem.Operation.State of fsosRunning: Icon := vosiPlay; fsosPaused: Icon := vosiPause; else Icon := vosiHourglass; end; DrawStatusIcon(Canvas, NodeRect, Icon); end; DrawProgress(Canvas, NodeRect, FProgress); end; end; function TViewOperationItem.GetBackgroundColor: TColor; begin Result := FTreeNode.TreeView.BackgroundColor; end; procedure TViewOperationItem.StartPause; var OpManItem: TOperationsManagerItem; begin OpManItem := OperationsManager.GetItemByHandle(FOperationHandle); if Assigned(OpManItem) and OpManItem.Queue.IsFree then OpManItem.Operation.TogglePause; end; procedure TViewOperationItem.Stop; var OpManItem: TOperationsManagerItem; begin OpManItem := OperationsManager.GetItemByHandle(FOperationHandle); if Assigned(OpManItem) then OpManItem.Operation.Stop; end; procedure TViewOperationItem.UpdateView(Canvas: TCanvas); var OpManItem: TOperationsManagerItem; begin OpManItem := OperationsManager.GetItemByHandle(FOperationHandle); if Assigned(OpManItem) then begin FText := IntToStr(OpManItem.Handle) + ': ' + OpManItem.Operation.GetDescription(fsoddJobAndTarget); FProgress := OpManItem.Operation.Progress; if FProgress > 0 then FText := FText + ' - ' + GetProgressString(FProgress); FText := FText + GetOperationStateString(OpManItem.Operation.State); CalculateSizes(Canvas, OpManItem.Queue.IsFree, FProgress > 0); end else begin FText := ''; FProgress := 0; FTreeNode.Height := 10; end; end; function TViewOperationItem.GetTextIndent: Integer; begin Result := FTreeNode.DisplayExpandSignLeft; if FTreeNode.Level = 0 then Inc(Result, FreeOperationTextIndent) else Dec(Result, TTreeView(FTreeNode.TreeView).Indent * (FTreeNode.Level - 1)); end; { TViewQueueItem } procedure TViewQueueItem.Click(const Pt: TPoint; Button: TMouseButton; Shift: TShiftState); var Handled: Boolean = False; NodeRect: TRect; begin case Button of mbLeft: begin NodeRect := FTreeNode.DisplayRect(False); if (ssDouble in Shift) or PtInRect(GetStatusIconRect(NodeRect), Pt) then begin StartPause; Handled := True; end; end; end; if not Handled then inherited Click(Pt, Button, Shift); end; constructor TViewQueueItem.Create(ANode: TTreeNode; AQueueId: TOperationsManagerQueueIdentifier); begin FQueueIdentifier := AQueueId; inherited Create(ANode); end; procedure TViewQueueItem.Draw(Canvas: TCanvas; NodeRect: TRect); var Element: TThemedTreeview; Queue: TOperationsManagerQueue; Icon: TViewOperationsStatusIcon; begin if FTreeNode.Selected then Element := ttItemSelected else Element := ttItemSelectedNotFocus; DrawThemedBackground(Canvas, Element, NodeRect); Queue := OperationsManager.QueueByIdentifier[FQueueIdentifier]; if Assigned(Queue) then begin DrawThemedText(Canvas, Element, FTextRect, True, FText); if Queue.Paused then Icon := vosiPause else Icon := vosiPlay; DrawStatusIcon(Canvas, NodeRect, Icon); end; end; function TViewQueueItem.GetBackgroundColor: TColor; begin Result := FTreeNode.TreeView.BackgroundColor; end; function TViewQueueItem.GetTextIndent: Integer; var ATreeView: TCustomTreeView; begin Result := FTreeNode.DisplayExpandSignLeft; ATreeView := FTreeNode.TreeView; if ATreeView is TTreeView then Inc(Result, TTreeView(ATreeView).Indent); end; procedure TViewQueueItem.StartPause; var Queue: TOperationsManagerQueue; begin Queue := OperationsManager.QueueByIdentifier[FQueueIdentifier]; if Assigned(Queue) then Queue.TogglePause; end; procedure TViewQueueItem.Stop; var Queue: TOperationsManagerQueue; begin Queue := OperationsManager.QueueByIdentifier[FQueueIdentifier]; if Assigned(Queue) then begin Queue.Stop; end; end; procedure TViewQueueItem.UpdateView(Canvas: TCanvas); var Queue: TOperationsManagerQueue; begin Queue := OperationsManager.QueueByIdentifier[FQueueIdentifier]; if Assigned(Queue) then begin FText := Queue.GetDescription(False); if Queue.Paused then FText := FText + GetOperationStateString(fsosPaused); CalculateSizes(Canvas, True, False); end else begin FText := ''; FTreeNode.Height := 10; end; end; { TfrmViewOperations } procedure TfrmViewOperations.FormCreate(Sender: TObject); begin InitPropStorage(Self); cbAlwaysOnTopChange(nil); FMenuOperation := InvalidOperationHandle; tvOperations.DoubleBuffered := True; DoubleBuffered := True; CreateNodes; OperationsManager.AddEventsListener( [omevOperationAdded, omevOperationRemoved, omevOperationMoved], @UpdateView); tvOperations.OnResize := @tvOperationsResize; end; procedure TfrmViewOperations.btnStopClick(Sender: TObject); var Item: TViewBaseItem; begin Item := GetFocusedItem; if Assigned(Item) then Item.Stop; end; procedure TfrmViewOperations.cbAlwaysOnTopChange(Sender: TObject); begin if cbAlwaysOnTop.Checked then begin FormStyle := fsStayOnTop; ShowInTaskBar := stDefault; end else begin FormStyle := fsNormal; ShowInTaskBar := stAlways; end; end; procedure TfrmViewOperations.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin CloseAction := caFree; frmViewOperations := nil; end; procedure TfrmViewOperations.FormDestroy(Sender: TObject); begin OperationsManager.RemoveEventsListener( [omevOperationAdded, omevOperationRemoved, omevOperationMoved], @UpdateView); end; procedure TfrmViewOperations.mnuNewQueueClick(Sender: TObject); var Item: TViewBaseItem; OpManItem: TOperationsManagerItem; begin Item := GetFocusedItem; if Assigned(Item) and (Item is TViewOperationItem) then begin OpManItem := OperationsManager.GetItemByHandle(TViewOperationItem(Item).FOperationHandle); if Assigned(OpManItem) then OpManItem.MoveToNewQueue; end; end; procedure TfrmViewOperations.mnuPutFirstInQueueClick(Sender: TObject); begin MoveWithinQueue(True); end; procedure TfrmViewOperations.mnuPutLastInQueueClick(Sender: TObject); begin MoveWithinQueue(False); end; procedure TfrmViewOperations.mnuOperationShowDetachedClick(Sender: TObject); var OpManItem: TOperationsManagerItem; begin OpManItem := OperationsManager.GetItemByHandle(FMenuOperation); if Assigned(OpManItem) and OpManItem.Queue.IsFree then TfrmFileOp.ShowFor(OpManItem.Handle, [opwoIfExistsBringToFront]); end; procedure TfrmViewOperations.OnOperationItemContextMenu(Item: TViewBaseItem; const Point: TPoint); var i: Integer; PopupPoint: TPoint; OpManItem: TOperationsManagerItem; begin FMenuOperation := (Item as TViewOperationItem).FOperationHandle; OpManItem := OperationsManager.GetItemByHandle(FMenuOperation); if Assigned(OpManItem) then begin for i := 0 to mnuQueue.Count - 1 do if i = OpManItem.Queue.Identifier then mnuQueue.Items[i].Checked := True else mnuQueue.Items[i].Checked := False; mnuOperationShowDetached.Enabled := OpManItem.Queue.IsFree; PopupPoint := tvOperations.ClientToScreen(Point); pmOperationPopup.PopUp(PopupPoint.x, PopupPoint.y); end; end; procedure TfrmViewOperations.OnOperationItemSelected(Item: TViewBaseItem); var OpManItem: TOperationsManagerItem; begin OpManItem := OperationsManager.GetItemByHandle(TViewOperationItem(Item).FOperationHandle); if Assigned(OpManItem) then begin SetStartPauseCaption(OpManItem.Operation.State in [fsosStarting, fsosRunning, fsosWaitingForConnection]); btnStartPause.Enabled := OpManItem.Queue.IsFree; btnStop.Enabled := True; end else begin btnStartPause.Enabled := False; btnStop.Enabled := False; end; end; procedure TfrmViewOperations.OnQueueContextMenu(Item: TViewBaseItem; const Point: TPoint); var PopupPoint: TPoint; begin FMenuQueueIdentifier := (Item as TViewQueueItem).FQueueIdentifier; PopupPoint := tvOperations.ClientToScreen(Point); pmQueuePopup.PopUp(PopupPoint.x, PopupPoint.y); end; procedure TfrmViewOperations.OnQueueItemSelected(Item: TViewBaseItem); var Queue: TOperationsManagerQueue; begin Queue := OperationsManager.QueueByIdentifier[TViewQueueItem(Item).FQueueIdentifier]; if Assigned(Queue) then begin SetStartPauseCaption(not Queue.Paused); btnStartPause.Enabled := True; end else begin btnStartPause.Enabled := False; end; btnStop.Enabled := btnStartPause.Enabled; end; procedure TfrmViewOperations.OnUpdateTimer(Sender: TObject); begin UpdateSizes; tvOperationsSelectionChanged(tvOperations); tvOperations.Invalidate; end; procedure TfrmViewOperations.mnuQueueNumberClick(Sender: TObject); var NewQueueNumber: integer; Item: TViewBaseItem; begin if TryStrToInt(Copy((Sender as TMenuItem).Name, 9, 1), NewQueueNumber) then begin Item := GetFocusedItem; if Assigned(Item) and (Item is TViewOperationItem) then SetNewQueue(TViewOperationItem(Item), NewQueueNumber); end; end; procedure TfrmViewOperations.mnuQueueShowDetachedClick(Sender: TObject); var Queue: TOperationsManagerQueue; begin Queue := OperationsManager.QueueByIdentifier[FMenuQueueIdentifier]; if Assigned(Queue) then TfrmFileOp.ShowFor(Queue.Identifier, [opwoIfExistsBringToFront]); end; procedure TfrmViewOperations.tbPauseAllChange(Sender: TObject); begin if tbPauseAll.State = cbChecked then OperationsManager.PauseAll else OperationsManager.UnPauseAll; end; procedure TfrmViewOperations.tvOperationsCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); var Item: TViewBaseItem; NodeRect: TRect; procedure DrawExpandSign(MidX, MidY: integer; CollapseSign: boolean); const ExpandSignColor = clWindowText; var HalfSize, ALeft, ATop, ARight, ABottom: integer; Points: array [0..2] of TPoint; R: TRect; begin with Sender.Canvas do begin Brush.Color := clWindow; Pen.Color := ExpandSignColor; Pen.Style := psSolid; HalfSize := ExpandSignSize shr 1; if ((ExpandSignSize and 1) = 0) then dec(HalfSize); ALeft := MidX - HalfSize; ATop := MidY - HalfSize; ARight := ALeft + ExpandSignSize; ABottom := ATop + ExpandSignSize; // draw an arrow. down for collapse and right for expand R := Rect(ALeft, ATop, ARight, ABottom); if CollapseSign then begin // draw an arrow down Points[0] := Point(R.Left, MidY); Points[1] := Point(R.Right - 1, MidY); Points[2] := Point(MidX, R.Bottom - 1); end else begin // draw an arrow right Points[0] := Point(MidX - 1, ATop); Points[1] := Point(R.Right - 2, MidY); Points[2] := Point(MidX - 1, R.Bottom - 1); end; Polygon(Points, False); end; end; var VertMid: Integer; begin if not Assigned(Node.Data) then Exit; Item := TViewBaseItem(Node.Data); NodeRect := Node.DisplayRect(False); Item.Draw(Sender.Canvas, NodeRect); if tvOperations.ShowButtons and Node.HasChildren and ((tvoShowRoot in tvOperations.Options) or (Node.Parent <> nil)) then begin VertMid := (NodeRect.Top + NodeRect.Bottom) div 2; DrawExpandSign(Node.DisplayExpandSignLeft + tvOperations.Indent shr 1, VertMid, Node.Expanded); end; // draw separator if (tvoShowSeparators in tvOperations.Options) then begin Sender.Canvas.Pen.Color:=tvOperations.SeparatorColor; Sender.Canvas.MoveTo(NodeRect.Left,NodeRect.Bottom-1); Sender.Canvas.LineTo(NodeRect.Right,NodeRect.Bottom-1); end; DefaultDraw := False; end; procedure TfrmViewOperations.tvOperationsDeletion(Sender: TObject; Node: TTreeNode); var Item: TViewBaseItem; begin Item := TViewBaseItem(Node.Data); Node.Data := nil; Item.Free; end; procedure TfrmViewOperations.tvOperationsDragDrop(Sender, Source: TObject; X, Y: Integer); var TargetNode: TTreeNode; NodeRect: TRect; TargetItem: TViewBaseItem; QueueItem: TViewQueueItem; OperItem: TViewOperationItem; SourceOpManItem, TargetOpManItem: TOperationsManagerItem; TargetQueue: TOperationsManagerQueue; TargetQueueId: TOperationsManagerQueueIdentifier; HitTopPart: Boolean; begin if Source = tvOperations then begin SourceOpManItem := OperationsManager.GetItemByHandle(FDraggedOperation); if Assigned(SourceOpManItem) then begin TargetNode := tvOperations.GetNodeAt(X, Y); if not Assigned(TargetNode) then begin SourceOpManItem.MoveToNewQueue; end else begin NodeRect := TargetNode.DisplayRect(False); TargetItem := TViewBaseItem(TargetNode.Data); HitTopPart := Y - NodeRect.Top < (NodeRect.Bottom - NodeRect.Top) div 2; if TargetItem is TViewQueueItem then begin QueueItem := TViewQueueItem(TargetItem); if HitTopPart and (TargetNode = tvOperations.Items.GetFirstNode) and (QueueItem.FQueueIdentifier <> FreeOperationsQueueId) then begin // There are no free operations and item was dropped at the top of the list // on some queue. Create a free operations queue and move to it. TargetQueueId := FreeOperationsQueueId; TargetQueue := OperationsManager.GetOrCreateQueue(TargetQueueId); end else begin TargetQueueId := QueueItem.FQueueIdentifier; TargetQueue := OperationsManager.QueueByIdentifier[TargetQueueId]; end; SourceOpManItem.SetQueue(TargetQueue); end else if (TargetItem is TViewOperationItem) and (FDraggedOperation <> TViewOperationItem(TargetItem).FOperationHandle) then begin OperItem := TViewOperationItem(TargetItem); TargetOpManItem := OperationsManager.GetItemByHandle(OperItem.FOperationHandle); if Assigned(TargetOpManItem) then SourceOpManItem.Move(TargetOpManItem.Handle, HitTopPart); end; end; end; end; end; procedure TfrmViewOperations.tvOperationsDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := True; end; procedure TfrmViewOperations.tvOperationsKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var Item: TViewBaseItem; begin Item := GetFocusedItem; if Assigned(Item) then Item.KeyDown(Key, Shift); end; procedure TfrmViewOperations.tvOperationsMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Node: TTreeNode; NodeRect: TRect; begin FDraggedOperation := InvalidOperationHandle; Node := tvOperations.GetNodeAt(X, Y); if Assigned(Node) then begin NodeRect := Node.DisplayRect(False); TViewBaseItem(Node.Data).Click(Point(X - NodeRect.Left, Y - NodeRect.Top), Button, Shift); if TViewBaseItem(Node.Data) is TViewOperationItem then FDraggedOperation := TViewOperationItem(Node.Data).FOperationHandle; end; end; procedure TfrmViewOperations.tvOperationsResize(Sender: TObject); begin UpdateSizes; end; procedure TfrmViewOperations.tvOperationsSelectionChanged(Sender: TObject); var Node: TTreeNode; begin Node := tvOperations.Selected; if Assigned(Node) then TViewBaseItem(Node.Data).Selected; end; function TfrmViewOperations.GetFocusedItem: TViewBaseItem; var Node: TTreeNode; begin Node := tvOperations.Selected; if Assigned(Node) then Result := TViewBaseItem(Node.Data) else Result := nil; end; procedure TfrmViewOperations.mnuCancelOperationClick(Sender: TObject); var OpManItem: TOperationsManagerItem; begin OpManItem := OperationsManager.GetItemByHandle(FMenuOperation); if Assigned(OpManItem) then OpManItem.Operation.Stop; end; procedure TfrmViewOperations.mnuCancelQueueClick(Sender: TObject); var Queue: TOperationsManagerQueue; begin Queue := OperationsManager.QueueByIdentifier[FMenuQueueIdentifier]; if Assigned(Queue) then Queue.Stop; end; procedure TfrmViewOperations.MoveWithinQueue(MoveToTop: Boolean); var Item: TViewBaseItem; OpManItem: TOperationsManagerItem; begin Item := GetFocusedItem; if Assigned(Item) and (Item is TViewOperationItem) then begin OpManItem := OperationsManager.GetItemByHandle(TViewOperationItem(Item).FOperationHandle); if Assigned(OpManItem) then begin if OpManItem.Queue.Identifier <> FreeOperationsQueueId then begin if MoveToTop then OpManItem.MoveToTop else OpManItem.MoveToBottom; end; end; end; end; procedure TfrmViewOperations.SetFocusItem(AOperationHandle: TOperationHandle); var Node: TTreeNode; begin for Node in tvOperations.Items do begin if (TViewBaseItem(Node.Data) is TViewOperationItem) and (TViewOperationItem(Node.Data).FOperationHandle = AOperationHandle) then begin Node.Selected := True; Exit; end; end; end; procedure TfrmViewOperations.SetFocusItem(AQueueIdentifier: TOperationsManagerQueueIdentifier); var Node: TTreeNode; begin for Node in tvOperations.Items do begin if (TViewBaseItem(Node.Data) is TViewQueueItem) and (TViewQueueItem(Node.Data).FQueueIdentifier = AQueueIdentifier) then begin Node.Selected := True; Exit; end; end; end; procedure TfrmViewOperations.SetNewQueue(Item: TViewOperationItem; NewQueue: TOperationsManagerQueueIdentifier); var OpManItem: TOperationsManagerItem; begin OpManItem := OperationsManager.GetItemByHandle(Item.FOperationHandle); if Assigned(OpManItem) then OpManItem.SetQueue(OperationsManager.GetOrCreateQueue(NewQueue)); end; procedure TfrmViewOperations.SetStartPauseCaption(SetPause: Boolean); begin if SetPause then btnStartPause.Caption := rsDlgOpPause else btnStartPause.Caption := rsDlgOpStart; end; procedure TfrmViewOperations.btnStartPauseClick(Sender: TObject); var Item: TViewBaseItem; begin Item := GetFocusedItem; if Assigned(Item) then Item.StartPause; end; procedure TfrmViewOperations.CreateNodes; procedure AddOperations(Queue: TOperationsManagerQueue; QueueNode: TTreeNode); var OperIndex: Integer; OpManItem: TOperationsManagerItem; OperNode: TTreeNode; Item: TViewBaseItem; begin for OperIndex := 0 to Queue.Count - 1 do begin OpManItem := Queue.Items[OperIndex]; OperNode := tvOperations.Items.AddChild(QueueNode, ''); Item := TViewOperationItem.Create(OperNode, OpManItem.Handle); OperNode.Data := Item; Item.UpdateView(tvOperations.Canvas); Item.OnContextMenu := @OnOperationItemContextMenu; Item.OnSelected := @OnOperationItemSelected; end; end; var QueueIndex: Integer; Queue: TOperationsManagerQueue; QueueNode: TTreeNode; Item: TViewBaseItem; begin tvOperations.Items.Clear; // First add all free operations. Queue := OperationsManager.QueueByIdentifier[FreeOperationsQueueId]; if Assigned(Queue) then AddOperations(Queue, nil); for QueueIndex := 0 to OperationsManager.QueuesCount - 1 do begin Queue := OperationsManager.QueueByIndex[QueueIndex]; if Queue.Identifier <> FreeOperationsQueueId then begin QueueNode := tvOperations.Items.AddChild(nil, ''); Item := TViewQueueItem.Create(QueueNode, Queue.Identifier); QueueNode.Data := Item; Item.UpdateView(tvOperations.Canvas); Item.OnContextMenu := @OnQueueContextMenu; Item.OnSelected := @OnQueueItemSelected; AddOperations(Queue, QueueNode); end; end; end; procedure TfrmViewOperations.UpdateSizes; var Node: TTreeNode; begin Node := tvOperations.Items.GetFirstNode; while Assigned(Node) do begin TViewBaseItem(Node.Data).UpdateView(tvOperations.Canvas); Node := Node.GetNext; end; end; procedure TfrmViewOperations.UpdateView(Item: TOperationsManagerItem; Event: TOperationManagerEvent); begin CreateNodes; tvOperations.Invalidate; end; initialization ProgressRight := ProgressHorizontalMargin + StatusIconRightMargin + (StatusIconFrame.Right - StatusIconFrame.Left); end. doublecmd-0.5.8/src/udetectstr.pas0000644000175000017500000002434712117271522016202 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Detect string parser. Copyright (C) 2008 Dmitry Kolomiets (B4rr4cuda@rambler.ru) Based on TMathControl by Vimil Saju This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uDetectStr; {$mode objfpc}{$H+} interface uses SysUtils, Classes, uMasks, uFile; type TMathtype=(mtnil,mtoperator,mtlbracket,mtrbracket,mtoperand); type TMathOperatortype=(monone, // NULL moequ, // = moneq, // != replaced with # moles, // < momor, // > moand, // & moor, // | monot // NOT ); type pmathchar = ^Tmathchar; TMathChar = record case mathtype: Tmathtype of mtoperand:(data:shortstring); mtoperator:(op:TMathOperatortype); end; type { TParserControl } TParserControl = class public function TestFileResult(const aFile: TFile): boolean; overload; function TestFileResult(const aFileName: UTF8String): boolean; overload; private input,output,stack:array of tmathchar; fmathstring:string; fforce:boolean; function getresult(const aFile: TFile):boolean; function calculate(aFile: TFile; operand1,operand2,Aoperator:Tmathchar):string; function getoperator(c:UTF8String):TMathOperatortype; function getoperand(mid:integer;var len:integer):string; procedure processstring; procedure convertinfixtopostfix; function isdigit(c:UTF8String):boolean; function isoperator(c:UTF8String):boolean; function getprecedence(mop:TMathOperatortype):integer; function BooleanToStr(x:boolean):string; function StrToBoolean(s:string):boolean; public destructor Destroy; override; published property DetectStr:string read fmathstring write fmathstring; property IsForce:boolean read fforce write fforce; end; implementation uses uDebug, uFileProperty, uFileSystemFileSource; function TParserControl.calculate(aFile: TFile; operand1,operand2,Aoperator:Tmathchar):string; var tmp, data1: String; begin result:='false'; data1:= UpperCase(operand1.data); //Not if (operand1.data='NOT') and ((operand2.data='true') or (operand2.data='false')) then begin Result:=BooleanToStr(Not StrToBoolean(operand2.data)); end; // & | if ((operand1.data='true') or (operand1.data='false')) and ((operand2.data='true') or (operand2.data='false')) then begin case Aoperator.op of moand: result:= BooleanToStr((StrToBoolean(operand1.data)) and (StrToBoolean(operand2.data))); moor: result:=BooleanToStr((StrToBoolean(operand1.data)) or (StrToBoolean(operand2.data))); end; end; //EXT= EXT!= if (data1 = 'EXT') then begin //--------------------- tmp:= aFile.Extension; tmp:= UpperCase(tmp); tmp:= '"'+tmp+'"'; //--------------------- case Aoperator.op of moequ: Result:=BooleanToStr(MatchesMask(tmp,operand2.data)); moneq: Result:=BooleanToStr(not MatchesMask(tmp,operand2.data)); end; end; //SIZE > < = != if (data1 = 'SIZE') and (fpSize in aFile.SupportedProperties) then begin tmp:= IntToStr(aFile.Size); case Aoperator.op of moequ: Result:= BooleanToStr(strtoint(tmp)=strtoint(operand2.data)); moneq: Result:= BooleanToStr(strtoint(tmp)<>strtoint(operand2.data)); moles: Result:= BooleanToStr(strtoint(tmp)strtoint(operand2.data)); end; end; { case Aoperator.op of moneq: ; moequ: ; moles: ; momor: ; moor: ; moand: ; monot: ; end;} end; function TParserControl.TestFileResult(const aFile: TFile):boolean; begin Result:= getresult(aFile); end; function TParserControl.TestFileResult(const aFileName: UTF8String): boolean; var aFile: TFile; begin aFile:= TFileSystemFileSource.CreateFileFromFile(aFileName); try DCDebug('aFile.Extension = ' + aFile.Extension); Result:= getresult(aFile); finally aFile.Free; end; end; function TParserControl.getresult(const aFile: TFile):boolean; var i:integer; tmp1,tmp2,tmp3:tmathchar; begin if fmathstring='' then begin Result:=true; exit; end; convertinfixtopostfix; setlength(stack,0); for i:=0 to length(output)-1 do begin if output[i].mathtype=mtoperand then begin setlength(stack,length(stack)+1); stack[length(stack)-1]:=output[i]; end else if output[i].mathtype=mtoperator then begin tmp1:=stack[length(stack)-1]; tmp2:=stack[length(stack)-2]; setlength(stack,length(stack)-2); tmp3.mathtype:=mtoperand; tmp3.data:=calculate(aFile, tmp2,tmp1,output[i]); setlength(stack,length(stack)+1); stack[length(stack)-1]:=tmp3; end; end; result:=strToBoolean(stack[0].data); setlength(stack,0); setlength(input,0); setlength(output,0); end; function TParserControl.getoperator(c:UTF8String):TMathOperatortype; begin result:=monone; if c='<' then result:=moles else if c='>' then result:=momor else if c='&' then result:=moand else if c='=' then result:=moequ else if c='#' then result:=moneq else if c='|' then result:=moor else if c='!' then result:=monot; end; function TParserControl.getoperand(mid:integer;var len:integer):string; var i,j:integer; begin Result := ''; j:=1; for i:=mid to length(fmathstring)-1 do begin if isdigit(fmathstring[i]) then begin if j<=20 then Result:=Result+fmathstring[i]; j:=j+1; end else break; end; len:=length(Result); end; procedure TParserControl.processstring; var i:integer; numlen:integer; begin //--------------------- while pos('!=',fmathstring)>0 do begin i:=pos('!=',fmathstring); delete(fmathstring,i,2); insert('#',fmathstring,i); end; //--------------------- fmathstring:= StringReplace(fmathstring, 'FORCE', BooleanToStr(fforce), [rfReplaceAll, rfIgnoreCase]); //--------------------- fmathstring:= StringReplace(fmathstring, 'MULTIMEDIA', 'true', [rfReplaceAll, rfIgnoreCase]); //--------------------- numlen:=1; while numlen < length(fmathstring) do if (fmathstring[numlen]='!') and (fmathstring[numlen+1]<>'=') then begin i:=numlen; delete(fmathstring,i,1); insert('NOT!',fmathstring,i); inc(numlen,4); end else inc(numlen); //--------------------- i:=0; numlen:=0; setlength(output,0); setlength(input,0); setlength(stack,0); fmathstring:='('+fmathstring+')'; setlength(input,length(fmathstring)); while i<=length(fmathstring)-1 do begin if fmathstring[i+1]='(' then begin input[i].mathtype:=mtlbracket; i:=i+1; end else if fmathstring[i+1]=')' then begin input[i].mathtype:=mtrbracket; i:=i+1; end else if isoperator(fmathstring[i+1]) then begin input[i].mathtype:=mtoperator; input[i].op:=getoperator(fmathstring[i+1]); i:=i+1; end else if isdigit(fmathstring[i+1]) then begin input[i].mathtype:=mtoperand; input[i].data:=getoperand(i+1,numlen); i:=i+numlen; end else {if fmathstring[i+1]=' ' then} inc(i); end; end; function TParserControl.isoperator(c:UTF8String):boolean; begin result:=false; if (c='=') or (c='#') or (c='!') or (c='&') or (c='<') or (c='>') or (c='|') then result:=true; end; function TParserControl.isdigit(c:UTF8String):boolean; begin result:=false; if pos(c,'=#!&<>|() ')<=0 then result:=true; end; function TParserControl.getprecedence(mop:TMathOperatortype):integer; begin result:=-1; case mop of moor:result:=1; moand:result:=1; moequ:result:=2; moneq:result:=2; moles:result:=2; momor:result:=2; monot:result:=2; end; end; function TParserControl.BooleanToStr(x: boolean): string; begin if x then Result:='true' else Result:='false'; end; function TParserControl.StrToBoolean(s: string): boolean; begin if s='true' then Result:=true else Result:=false; end; destructor TParserControl.Destroy; begin inherited Destroy; end; procedure TParserControl.convertinfixtopostfix; var i,j,prec:integer; begin processstring; for i:=0 to length(input)-1 do begin if input[i].mathtype=mtoperand then begin setlength(output,length(output)+1); output[length(output)-1]:=input[i]; end else if input[i].mathtype=mtlbracket then begin setlength(stack,length(stack)+1); stack[length(stack)-1]:=input[i]; end else if input[i].mathtype=mtoperator then begin prec:=getprecedence(input[i].op); j:=length(stack)-1; if j>=0 then begin while(getprecedence(stack[j].op)>=prec) and (j>=0) do begin setlength(output,length(output)+1); output[length(output)-1]:=stack[j]; setlength(stack,length(stack)-1); j:=j-1; end; setlength(stack,length(stack)+1); stack[length(stack)-1]:=input[i]; end; end else if input[i].mathtype=mtrbracket then begin j:=length(stack)-1; if j>=0 then begin while(stack[j].mathtype<>mtlbracket) and (j>=0) do begin setlength(output,length(output)+1); output[length(output)-1]:=stack[j]; setlength(stack,length(stack)-1); j:=j-1; end; if j>=0 then setlength(stack,length(stack)-1); end; end; end; end; end. doublecmd-0.5.8/src/uwdxprototypes.pas0000644000175000017500000000400711740433676017156 0ustar alexxalexxunit uwdxprototypes; {$mode objfpc}{$H+} interface uses Classes, SysUtils, WdxPlugin; {$IFDEF MSWINDOWS}{$CALLING STDCALL}{$ELSE}{$CALLING CDECL}{$ENDIF} type { Mandatory (must be implemented) } TContentGetSupportedField = function (FieldIndex:integer;FieldName:pchar; Units:pchar;maxlen:integer):integer; TContentGetValue = function (FileName:pchar;FieldIndex,UnitIndex:integer; FieldValue:pbyte; maxlen,flags:integer):integer; { Optional (must NOT be implemented if unsupported!) } TContentGetDetectString = procedure (DetectString:pchar;maxlen:integer); TContentSetDefaultParams = procedure (dps:pContentDefaultParamStruct); TContentStopGetValue = procedure (FileName:pchar); TContentGetDefaultSortOrder = function (FieldIndex:integer):integer; TContentPluginUnloading = procedure; TContentGetSupportedFieldFlags = function (FieldIndex:integer):integer; TContentSetValue = function (FileName:pchar;FieldIndex,UnitIndex,FieldType:integer; FieldValue:pbyte;flags:integer):integer; TContentEditValue = function (handle:thandle;FieldIndex,UnitIndex,FieldType:integer; FieldValue:pchar;maxlen:integer;flags:integer; langidentifier:pchar):integer; TContentSendStateInformation = procedure (state:integer;path:pchar); { Unicode } TContentGetValueW = function (FileName:pwidechar;FieldIndex,UnitIndex:integer; FieldValue:pbyte; maxlen,flags:integer):integer; TContentStopGetValueW = procedure (FileName:pwidechar); TContentSetValueW = function (FileName:pwidechar;FieldIndex,UnitIndex,FieldType:integer; FieldValue:pbyte;flags:integer):integer; TContentSendStateInformationW = procedure (state:integer;path:pwidechar); {$CALLING DEFAULT} implementation end. doublecmd-0.5.8/src/fattributesedit.lfm0000644000175000017500000003402212023046500017170 0ustar alexxalexxobject frmAttributesEdit: TfrmAttributesEdit Left = 388 Height = 284 Top = 144 Width = 329 AutoSize = True BorderIcons = [biSystemMenu] BorderStyle = bsSizeToolWin Caption = 'Choose attributes' ClientHeight = 284 ClientWidth = 329 FormStyle = fsStayOnTop Position = poOwnerFormCenter ShowInTaskBar = stNever LCLVersion = '1.1' object pnlTopAttrs: TPanel Left = 0 Height = 23 Top = 5 Width = 329 Align = alTop AutoSize = True BorderSpacing.Top = 5 BevelOuter = bvNone ChildSizing.EnlargeHorizontal = crsHomogenousSpaceResize ChildSizing.EnlargeVertical = crsHomogenousSpaceResize ChildSizing.ShrinkHorizontal = crsHomogenousSpaceResize ChildSizing.ShrinkVertical = crsHomogenousSpaceResize ChildSizing.Layout = cclTopToBottomThenLeftToRight ClientHeight = 23 ClientWidth = 329 TabOrder = 0 object cbSymlink: TCheckBox Left = 58 Height = 23 Top = 0 Width = 72 AllowGrayed = True Caption = '&Symlink' OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 0 end object cbDirectory: TCheckBox Left = 188 Height = 23 Top = 0 Width = 84 AllowGrayed = True Caption = '&Directory' OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 1 end end object pnlUnixAttrs: TPanel Left = 10 Height = 181 Top = 28 Width = 309 Align = alClient BorderSpacing.Left = 10 BorderSpacing.Right = 10 BevelOuter = bvNone ClientHeight = 181 ClientWidth = 309 TabOrder = 1 Visible = False object lblAttrOwnerStr: TLabel AnchorSideTop.Control = cbReadOwner AnchorSideTop.Side = asrCenter Left = 8 Height = 18 Top = 33 Width = 46 Caption = 'Owner' ParentColor = False end object lblWrite: TLabel AnchorSideTop.Side = asrBottom Left = 176 Height = 18 Top = 8 Width = 38 BorderSpacing.Top = 8 Caption = 'Write' ParentColor = False end object lblRead: TLabel AnchorSideTop.Side = asrBottom Left = 104 Height = 18 Top = 8 Width = 32 BorderSpacing.Top = 8 Caption = 'Read' ParentColor = False end object lblExec: TLabel AnchorSideTop.Side = asrBottom Left = 240 Height = 18 Top = 8 Width = 53 BorderSpacing.Top = 8 Caption = 'Execute' ParentColor = False end object lblAttrGroupStr: TLabel AnchorSideTop.Control = cbReadGroup AnchorSideTop.Side = asrCenter Left = 8 Height = 18 Top = 59 Width = 41 Caption = 'Group' ParentColor = False end object lblAttrOtherStr: TLabel AnchorSideTop.Control = cbReadOther AnchorSideTop.Side = asrCenter Left = 8 Height = 18 Top = 85 Width = 40 Caption = 'Other' ParentColor = False end object lblAttrBitsStr: TLabel AnchorSideTop.Control = cbSuid AnchorSideTop.Side = asrCenter Left = 8 Height = 18 Top = 112 Width = 29 Caption = 'Bits:' ParentColor = False end object cbReadOwner: TCheckBox AnchorSideTop.Control = lblRead AnchorSideTop.Side = asrBottom Left = 112 Height = 20 Top = 32 Width = 20 AllowGrayed = True BorderSpacing.Top = 6 OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 0 end object cbWriteOwner: TCheckBox AnchorSideTop.Control = lblWrite AnchorSideTop.Side = asrBottom Left = 184 Height = 20 Top = 32 Width = 20 AllowGrayed = True BorderSpacing.Top = 6 OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 1 end object cbExecOwner: TCheckBox AnchorSideTop.Control = lblExec AnchorSideTop.Side = asrBottom Left = 256 Height = 20 Top = 32 Width = 20 AllowGrayed = True BorderSpacing.Top = 6 OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 2 end object cbReadGroup: TCheckBox AnchorSideTop.Control = cbReadOwner AnchorSideTop.Side = asrBottom Left = 112 Height = 20 Top = 58 Width = 20 AllowGrayed = True BorderSpacing.Top = 6 OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 3 end object cbWriteGroup: TCheckBox AnchorSideTop.Control = cbWriteOwner AnchorSideTop.Side = asrBottom Left = 184 Height = 20 Top = 58 Width = 20 AllowGrayed = True BorderSpacing.Top = 6 OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 4 end object cbExecGroup: TCheckBox AnchorSideTop.Control = cbExecOwner AnchorSideTop.Side = asrBottom Left = 256 Height = 20 Top = 58 Width = 20 AllowGrayed = True BorderSpacing.Top = 6 OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 5 end object cbReadOther: TCheckBox AnchorSideTop.Control = cbReadGroup AnchorSideTop.Side = asrBottom Left = 112 Height = 20 Top = 84 Width = 20 AllowGrayed = True BorderSpacing.Top = 6 OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 6 end object cbWriteOther: TCheckBox AnchorSideTop.Control = cbWriteGroup AnchorSideTop.Side = asrBottom Left = 184 Height = 20 Top = 84 Width = 20 AllowGrayed = True BorderSpacing.Top = 6 OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 7 end object cbExecOther: TCheckBox AnchorSideTop.Control = cbReadGroup AnchorSideTop.Side = asrBottom Left = 256 Height = 20 Top = 84 Width = 20 AllowGrayed = True BorderSpacing.Top = 6 OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 8 end object cbSuid: TCheckBox AnchorSideTop.Control = cbReadOther AnchorSideTop.Side = asrBottom Left = 112 Height = 23 Top = 110 Width = 57 AllowGrayed = True BorderSpacing.Top = 6 Caption = 'SUID' OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 9 end object cbSgid: TCheckBox AnchorSideTop.Control = cbWriteOther AnchorSideTop.Side = asrBottom Left = 184 Height = 23 Top = 110 Width = 58 AllowGrayed = True BorderSpacing.Top = 6 Caption = 'SGID' OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 10 end object cbSticky: TCheckBox AnchorSideTop.Control = cbExecOther AnchorSideTop.Side = asrBottom Left = 256 Height = 23 Top = 110 Width = 61 AllowGrayed = True BorderSpacing.Top = 6 Caption = 'Sticky' OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 11 end end object pnlWinAttrs: TPanel Left = 10 Height = 181 Top = 28 Width = 309 Align = alClient AutoSize = True BorderSpacing.Left = 10 BorderSpacing.Right = 10 BevelOuter = bvNone ChildSizing.HorizontalSpacing = 10 ChildSizing.EnlargeHorizontal = crsHomogenousChildResize ChildSizing.EnlargeVertical = crsHomogenousChildResize ChildSizing.ShrinkHorizontal = crsHomogenousChildResize ChildSizing.ShrinkVertical = crsHomogenousChildResize ChildSizing.Layout = cclTopToBottomThenLeftToRight ClientHeight = 181 ClientWidth = 309 TabOrder = 2 Visible = False object gbWinGeneral: TGroupBox Left = 0 Height = 181 Top = 0 Width = 150 AutoSize = True Caption = 'General attributes' ChildSizing.LeftRightSpacing = 5 ChildSizing.TopBottomSpacing = 5 ChildSizing.EnlargeHorizontal = crsHomogenousSpaceResize ChildSizing.EnlargeVertical = crsHomogenousSpaceResize ChildSizing.ShrinkHorizontal = crsHomogenousSpaceResize ChildSizing.ShrinkVertical = crsHomogenousSpaceResize ChildSizing.Layout = cclLeftToRightThenTopToBottom ClientHeight = 158 ClientWidth = 146 Constraints.MinWidth = 150 TabOrder = 0 object cbArchive: TCheckBox Left = 30 Height = 23 Top = 12 Width = 86 AllowGrayed = True Caption = '&Archive' OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 0 end object cbReadOnly: TCheckBox Left = 30 Height = 23 Top = 47 Width = 86 AllowGrayed = True Caption = 'Read o&nly' OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 1 end object cbHidden: TCheckBox Left = 30 Height = 23 Top = 82 Width = 86 AllowGrayed = True Caption = '&Hidden' OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 2 end object cbSystem: TCheckBox Left = 30 Height = 23 Top = 117 Width = 86 AllowGrayed = True Caption = 'S&ystem' OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 3 end end object gbNtfsAttributes: TGroupBox Left = 160 Height = 181 Top = 0 Width = 150 AutoSize = True Caption = 'NTFS attributes' ChildSizing.LeftRightSpacing = 5 ChildSizing.TopBottomSpacing = 5 ChildSizing.EnlargeHorizontal = crsHomogenousSpaceResize ChildSizing.EnlargeVertical = crsHomogenousSpaceResize ChildSizing.ShrinkHorizontal = crsHomogenousSpaceResize ChildSizing.ShrinkVertical = crsHomogenousSpaceResize ChildSizing.Layout = cclLeftToRightThenTopToBottom ClientHeight = 158 ClientWidth = 146 Constraints.MinWidth = 150 TabOrder = 1 object cbCompressed: TCheckBox Left = 22 Height = 23 Top = 12 Width = 103 AllowGrayed = True Caption = 'Co&mpressed' OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 0 end object cbEncrypted: TCheckBox Left = 22 Height = 23 Top = 47 Width = 103 AllowGrayed = True Caption = '&Encrypted' OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 1 end object cbTemporary: TCheckBox Left = 22 Height = 23 Top = 82 Width = 103 AllowGrayed = True Caption = '&Temporary' OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 2 end object cbSparse: TCheckBox Left = 22 Height = 23 Top = 117 Width = 103 AllowGrayed = True Caption = 'S&parse' OnChange = cbAttrCheckBoxChanged OnClick = cbAttrCheckBoxClicked State = cbGrayed TabOrder = 3 end end end object pnlTextAttrs: TPanel Left = 10 Height = 28 Top = 214 Width = 309 Align = alBottom AutoSize = True BorderSpacing.Left = 10 BorderSpacing.Top = 5 BorderSpacing.Right = 10 BevelOuter = bvNone ClientHeight = 28 ClientWidth = 309 TabOrder = 3 object lblTextAttrs: TLabel AnchorSideLeft.Control = pnlTextAttrs AnchorSideTop.Control = pnlTextAttrs AnchorSideTop.Side = asrCenter Left = 0 Height = 18 Top = 5 Width = 53 Caption = 'As te&xt:' FocusControl = edtTextAttrs ParentColor = False end object edtTextAttrs: TEdit AnchorSideLeft.Control = lblTextAttrs AnchorSideLeft.Side = asrBottom AnchorSideTop.Side = asrCenter AnchorSideRight.Control = pnlTextAttrs AnchorSideRight.Side = asrBottom Left = 63 Height = 28 Top = 0 Width = 246 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 ReadOnly = True TabOrder = 0 end end object pnlButtons: TPanel Left = 5 Height = 32 Top = 247 Width = 319 Align = alBottom AutoSize = True BorderSpacing.Around = 5 BevelOuter = bvNone ChildSizing.HorizontalSpacing = 10 ChildSizing.EnlargeHorizontal = crsHomogenousChildResize ChildSizing.EnlargeVertical = crsHomogenousChildResize ChildSizing.ShrinkHorizontal = crsHomogenousChildResize ChildSizing.ShrinkVertical = crsHomogenousChildResize ChildSizing.Layout = cclTopToBottomThenLeftToRight ClientHeight = 32 ClientWidth = 319 TabOrder = 4 object btnReset: TButton Left = 0 Height = 32 Top = 0 Width = 87 Caption = '&Reset' OnClick = btnResetClick TabOrder = 0 end object btnOk: TBitBtn Left = 97 Height = 32 Top = 0 Width = 94 Caption = '&OK' Constraints.MinHeight = 30 Kind = bkOK ModalResult = 1 OnClick = btnOkClick TabOrder = 1 end object btnCancel: TBitBtn Left = 201 Height = 32 Top = 0 Width = 118 Caption = '&Cancel' Constraints.MinHeight = 30 Kind = bkCancel ModalResult = 2 OnClick = btnCancelClick TabOrder = 2 end end end doublecmd-0.5.8/src/fpackdlg.pas0000644000175000017500000004415011744266373015576 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- File packing window Copyright (C) 2007-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fPackDlg; {$mode objfpc}{$H+} interface uses SysUtils, Forms, Controls, Dialogs, StdCtrls, EditBtn, ExtCtrls, uWcxArchiveFileSource, uArchiveFileSource, uFile, uFileSource, Classes; type { TfrmPackDlg } TfrmPackDlg = class(TForm) btnConfig: TButton; btnHelp: TButton; btnCancel: TButton; cbCreateSeparateArchives: TCheckBox; cbCreateSFX: TCheckBox; cbEncrypt: TCheckBox; cbMoveToArchive: TCheckBox; cbMultivolume: TCheckBox; btnOk: TButton; cbPackerList: TComboBox; cbOtherPlugins: TCheckBox; cbPutInTarFirst: TCheckBox; edtPackCmd: TDirectoryEdit; lblPrompt: TLabel; cbStoreDir: TCheckBox; rgPacker: TRadioGroup; pnlOptions: TPanel; procedure btnConfigClick(Sender: TObject); procedure cbCreateSeparateArchivesChange(Sender: TObject); procedure cbCreateSFXClick(Sender: TObject); procedure cbOtherPluginsChange(Sender: TObject); procedure cbPutInTarFirstChange(Sender: TObject); procedure edtPackCmdAcceptDirectory(Sender: TObject; var Value: String); procedure FormShow(Sender: TObject); procedure arbChange(Sender: TObject); private FTarExt, FArchiveExt, FArchiveName, FArchiveType: UTF8String; FArchiveTypeCount: Integer; FHasFolder, FExistsArchive : Boolean; FSourceFileSource: IFileSource; FCustomParams: UTF8String; procedure SwitchOptions(ArcTypeChange: Boolean); procedure AddArchiveType(const FileExt, ArcType: UTF8String); public { public declarations } end; // Frees 'Files'. function ShowPackDlg(const SourceFileSource: IFileSource; const TargetFileSource: IArchiveFileSource; var Files: TFiles; TargetArchivePath: String; TargetPathInArchive: String; bNewArchive : Boolean = True): Boolean; implementation {$R *.lfm} uses StrUtils, WcxPlugin, uGlobs, uDCUtils, uFileSourceOperation, uLng, uOSUtils, uOperationsManager, uArchiveFileSourceUtil, uMultiArchiveFileSource, uWcxArchiveCopyInOperation, uMultiArchiveCopyInOperation, uMasks, DCStrUtils; function ShowPackDlg(const SourceFileSource: IFileSource; const TargetFileSource: IArchiveFileSource; var Files: TFiles; TargetArchivePath: String; TargetPathInArchive: String; bNewArchive : Boolean = True): Boolean; var I: Integer; NewTargetFileSource: IArchiveFileSource = nil; aFlags : PtrInt; Operation: TFileSourceOperation; PackDialog: TfrmPackDlg; aFile: TFile = nil; aFiles: TFiles = nil; procedure Pack(var FilesToPack: TFiles; QueueIdentifier: TOperationsManagerQueueIdentifier); var sPassword, sPasswordTmp: UTF8String; begin with PackDialog do begin if Assigned(NewTargetFileSource) then begin // Set flags according to user selection in the pack dialog. aFlags := 0; if cbMoveToArchive.Checked then aFlags := aFlags or PK_PACK_MOVE_FILES; if cbStoreDir.Checked then aFlags := aFlags or PK_PACK_SAVE_PATHS; if cbEncrypt.Checked then aFlags := aFlags or PK_PACK_ENCRYPT; Operation := NewTargetFileSource.CreateCopyInOperation( SourceFileSource, FilesToPack, TargetPathInArchive); if Assigned(Operation) then begin // TODO: Check if another operation is not running first (for WCX). if NewTargetFileSource.IsInterface(IWcxArchiveFileSource) then begin with Operation as TWcxArchiveCopyInOperation do begin PackingFlags := aFlags; TarBefore:= cbPutInTarFirst.Checked; end; end else if NewTargetFileSource.IsInterface(IMultiArchiveFileSource) then begin with Operation as TMultiArchiveCopyInOperation do begin if cbEncrypt.Checked then repeat if not InputQuery(Caption, rsMsgPasswordEnter, True, sPassword) then Exit; if gRepeatPassword then begin if not InputQuery(Caption, rsMsgPasswordVerify, True, sPasswordTmp) then Exit; end else sPasswordTmp:= sPassword; if sPassword <> sPasswordTmp then ShowMessage(rsMsgPasswordDiff) else Password:= sPassword; until sPassword = sPasswordTmp; if cbMultivolume.Checked then VolumeSize:= InputBox(Caption, rsMsgVolumeSizeEnter, EmptyStr); PackingFlags := aFlags; CustomParams:= FCustomParams; TarBefore:= cbPutInTarFirst.Checked; end; end; // Start operation. OperationsManager.AddOperation(Operation, QueueIdentifier, False, True); end; end; end; end; begin PackDialog := TfrmPackDlg.Create(nil); {$IF DEFINED(LCLGTK2)} // TRadioGroup.ItemIndex:= -1 will not work under Gtk2 // if items have been added dynamically, this workaround fixes it PackDialog.rgPacker.Items.Add(EmptyStr); PackDialog.rgPacker.Items.Clear; {$ENDIF} try with PackDialog do begin FArchiveType:= 'none'; FSourceFileSource:= SourceFileSource; if bNewArchive then // create new archive begin if Files.Count = 1 then // if one file selected begin FHasFolder:= Files[0].IsDirectory; FArchiveName:= Files[0].NameNoExt; edtPackCmd.Text := TargetArchivePath + FArchiveName + ExtensionSeparator + FArchiveType; end else // if some files selected begin FHasFolder:= False; for I:= 0 to Files.Count - 1 do begin if Files[I].IsDirectory then begin FHasFolder:= True; Break; end; end; FArchiveName:= MakeFileName(Files.Path, 'archive'); edtPackCmd.Text := TargetArchivePath + FArchiveName + ExtensionSeparator + FArchiveType; end end else // pack in exsists archive begin if Assigned(TargetFileSource) then edtPackCmd.Text := TargetFileSource.ArchiveFileName; end; Result:= (ShowModal = mrOK); if Result then begin if Assigned(TargetFileSource) then begin // Already have a target file source. // It must be an archive file source. if not (TargetFileSource.IsClass(TArchiveFileSource)) then raise Exception.Create('Invalid target file source type'); NewTargetFileSource := TargetFileSource; end else // Create a new target file source. begin // If create separate archives, one per selected file/dir if cbCreateSeparateArchives.Checked then try for I:= 0 to Files.Count - 1 do begin // Fill files to pack aFiles:= TFiles.Create(Files.Path); aFiles.Add(Files[I].Clone); try try // Check if there is an ArchiveFileSource for possible archive. aFile := SourceFileSource.CreateFileObject(ExtractFilePath(edtPackCmd.Text)); aFile.Name := Files[I].Name + FTarExt + FArchiveExt; NewTargetFileSource := GetArchiveFileSource(SourceFileSource, aFile, FArchiveType); except on e: EFileSourceException do begin MessageDlg(e.Message, mtError, [mbOK], 0); Exit; end; end; // Pack current item, if files count > 1 then put to queue if (I > 0) then Pack(aFiles, SingleQueueId) else Pack(aFiles, FreeOperationsQueueId); finally FreeAndNil(aFile); end; end; finally FreeAndNil(aFiles); end else begin try // Check if there is an ArchiveFileSource for possible archive. aFile := SourceFileSource.CreateFileObject(ExtractFilePath(edtPackCmd.Text)); aFile.Name := ExtractFileName(edtPackCmd.Text); NewTargetFileSource := GetArchiveFileSource(SourceFileSource, aFile, FArchiveType); except on e: EFileSourceException do begin MessageDlg(e.Message, mtError, [mbOK], 0); Exit; end; end; // Pack files Pack(Files, FreeOperationsQueueId); end; end; // Save last used packer gLastUsedPacker:= FArchiveType; end; end; finally FreeAndNil(PackDialog); if Assigned(Files) then FreeAndNil(Files); if Assigned(aFile) then FreeAndNil(aFile); end; end; const TAR_EXT = '.tar'; { TfrmPackDlg } procedure TfrmPackDlg.FormShow(Sender: TObject); var I, J : Integer; sExt : String; begin FArchiveTypeCount := 0; FExistsArchive := (FArchiveType <> 'none'); // WCX plugins for I:=0 to gWCXPlugins.Count - 1 do if gWCXPlugins.Enabled[I] then begin if (gWCXPlugins.Flags[I] and PK_CAPS_NEW) = PK_CAPS_NEW then begin AddArchiveType(FArchiveType, gWCXPlugins.Ext[I]); end; end; // MultiArc addons for I:= 0 to gMultiArcList.Count - 1 do if gMultiArcList[I].FEnabled and (gMultiArcList[I].FAdd <> EmptyStr) then begin J:= 1; repeat sExt:= ExtractDelimited(J, gMultiArcList[I].FExtension, [',']); if Length(sExt) = 0 then Break; AddArchiveType(FArchiveType, sExt); Inc(J); until False; end; if (rgPacker.Items.Count > 0) and (rgPacker.ItemIndex < 0) then rgPacker.ItemIndex := 0; if cbPackerList.Items.Count > 0 then begin cbOtherPlugins.Visible := True; cbPackerList.Visible := True; if FExistsArchive then cbPackerList.Enabled:= False else cbOtherPlugins.Enabled := True; if cbPackerList.ItemIndex < 0 then cbPackerList.ItemIndex := 0; end else btnConfig.AnchorToCompanion(akTop, 6, rgPacker); end; procedure TfrmPackDlg.btnConfigClick(Sender: TObject); var WcxFileSource: IWcxArchiveFileSource; begin try WcxFileSource := TWcxArchiveFileSource.CreateByArchiveName(FSourceFileSource, edtPackCmd.Text); if Assigned(WcxFileSource) then // WCX plugin try WcxFileSource.WcxModule.VFSConfigure(Handle); finally WcxFileSource := nil; // free interface end else // MultiArc addon begin FCustomParams:= InputBox(Caption, rsMsgArchiverCustomParams, FCustomParams); end; except on e: Exception do MessageDlg(e.Message, mtError, [mbOK], 0); end; end; procedure TfrmPackDlg.cbCreateSeparateArchivesChange(Sender: TObject); begin if cbCreateSeparateArchives.Checked then edtPackCmd.Text:= ExtractFilePath(edtPackCmd.Text) + '*.*' + FTarExt + FArchiveExt else edtPackCmd.Text:= ExtractFilePath(edtPackCmd.Text) + FArchiveName + FTarExt + FArchiveExt; end; procedure TfrmPackDlg.cbCreateSFXClick(Sender: TObject); var State: Boolean; begin if cbCreateSFX.Tag = 0 then begin cbCreateSFX.Tag:= 1; // Save check box state State:= cbCreateSFX.Checked; if State then FArchiveExt:= GetSfxExt else FArchiveExt:= ExtensionSeparator + FArchiveType; edtPackCmd.Text := ChangeFileExt(edtPackCmd.Text, FArchiveExt); // Switch archiver options SwitchOptions(False); // Restore check box state cbCreateSFX.Checked:= State; cbCreateSFX.Tag:= 0; end; end; procedure TfrmPackDlg.cbOtherPluginsChange(Sender: TObject); begin if cbOtherPlugins.Checked then begin FArchiveType:= cbPackerList.Text; FArchiveExt:= ExtensionSeparator + FArchiveType; edtPackCmd.Text := ChangeFileExt(edtPackCmd.Text, FArchiveExt); rgPacker.ItemIndex := -1; end else begin if rgPacker.ItemIndex = -1 then rgPacker.ItemIndex := 0; end; FCustomParams:= EmptyStr; cbPackerList.Enabled := cbOtherPlugins.Checked; SwitchOptions(True); end; procedure TfrmPackDlg.cbPutInTarFirstChange(Sender: TObject); begin if cbPutInTarFirst.Checked then begin FTarExt:= TAR_EXT; edtPackCmd.Text := ChangeFileExt(edtPackCmd.Text, TAR_EXT + FArchiveExt); end else begin FTarExt:= EmptyStr; edtPackCmd.Text := StringReplace(edtPackCmd.Text, TAR_EXT + FArchiveExt, FArchiveExt, [rfIgnoreCase]); end; end; procedure TfrmPackDlg.edtPackCmdAcceptDirectory(Sender: TObject; var Value: String); begin Value := IncludeTrailingPathDelimiter(Value) + ExtractFileName(edtPackCmd.Text); end; procedure TfrmPackDlg.arbChange(Sender: TObject); begin if rgPacker.ItemIndex >= 0 then begin FArchiveType:= rgPacker.Items[rgPacker.ItemIndex]; FArchiveExt:= ExtensionSeparator + FArchiveType; edtPackCmd.Text := ChangeFileExt(edtPackCmd.Text, FArchiveExt); cbOtherPlugins.Checked := False; end; FCustomParams:= EmptyStr; SwitchOptions(True); end; procedure TfrmPackDlg.SwitchOptions(ArcTypeChange: Boolean); // Ugly but working var I: LongInt; sCmd: String; begin if ArcTypeChange then begin // Reset some options cbCreateSFX.Checked:= False; end; // WCX plugins for I:= 0 to gWCXPlugins.Count - 1 do if gWCXPlugins.Enabled[I] and (gWCXPlugins.Ext[I] = FArchiveType) then begin // If plugin supports packing with password EnableControl(cbEncrypt, ((gWCXPlugins.Flags[I] and PK_CAPS_ENCRYPT) <> 0)); // If archive can not contain multiple files if ((gWCXPlugins.Flags[I] and PK_CAPS_MULTIPLE) = 0) then begin // If file list contain directory then // put to the tar archive first is needed if not FHasFolder then cbCreateSeparateArchives.Checked:= True else begin cbPutInTarFirst.Checked:= True; EnableControl(cbPutInTarFirst, False); end; end else begin cbPutInTarFirst.Checked:= False; EnableControl(cbPutInTarFirst, True); cbCreateSeparateArchives.Checked:= False; end; // Options that supported by plugins EnableControl(cbStoreDir, True); // Options that don't supported by plugins EnableControl(cbMultivolume, False); Exit; end; // MultiArc addons for I := 0 to gMultiArcList.Count - 1 do with gMultiArcList.Items[I] do begin if FEnabled and MatchesMaskList(FArchiveType, FExtension, ',') then begin // Archive can contain multiple files cbCreateSeparateArchives.Checked:= False; // If addon supports create self extracting archive EnableControl(cbCreateSFX, (Length(FAddSelfExtract) <> 0)); if cbCreateSFX.Enabled and cbCreateSFX.Checked then sCmd:= FAddSelfExtract else sCmd:= FAdd; // If addon supports create multi volume archive EnableControl(cbMultivolume, (Pos('%V', sCmd) <> 0)); // If addon supports packing with password EnableControl(cbEncrypt, (Pos('%W', sCmd) <> 0)); // Options that supported by addons EnableControl(cbPutInTarFirst, True); // Options that don't supported by addons cbStoreDir.Checked:= True; EnableControl(cbStoreDir, False); Exit; end; end; end; procedure TfrmPackDlg.AddArchiveType(const FileExt, ArcType: UTF8String); var iIndex: Integer; begin // First 9 plugins we display as RadioButtons if FArchiveTypeCount < 9 then begin iIndex := rgPacker.Items.Add(ArcType); if FExistsArchive then begin if (FileExt = ArcType) then rgPacker.ItemIndex := iIndex else rgPacker.Controls[iIndex + 1].Enabled := False; end else if (gLastUsedPacker = ArcType) then begin rgPacker.ItemIndex := iIndex; end; FArchiveTypeCount := FArchiveTypeCount + 1; end else // Other plugins we add in ComboBox begin iIndex := cbPackerList.Items.Add(ArcType); if (gLastUsedPacker = ArcType) or (FExistsArchive and (FileExt = ArcType)) then cbPackerList.ItemIndex := iIndex; end; end; end. doublecmd-0.5.8/src/filesources/0000755000175000017500000000000012257501472015625 5ustar alexxalexxdoublecmd-0.5.8/src/filesources/wfxplugin/0000755000175000017500000000000012257501472017650 5ustar alexxalexxdoublecmd-0.5.8/src/filesources/wfxplugin/uwfxpluginsetfilepropertyoperation.pas0000644000175000017500000001537711747211345027704 0ustar alexxalexxunit uWfxPluginSetFilePropertyOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceSetFilePropertyOperation, uFileSource, uFileSourceOperationOptions, uFile, uFileProperty, uWfxPluginFileSource; type TWfxPluginSetFilePropertyOperation = class(TFileSourceSetFilePropertyOperation) private FWfxPluginFileSource: IWfxPluginFileSource; FFullFilesTree: TFiles; // source files including all files/dirs in subdirectories FStatistics: TFileSourceSetFilePropertyOperationStatistics; // local copy of statistics // Options. FSymLinkOption: TFileSourceOperationOptionSymLink; protected function SetNewProperty(aFile: TFile; aTemplateProperty: TFileProperty): TSetFilePropertyResult; override; public constructor Create(aTargetFileSource: IFileSource; var theTargetFiles: TFiles; var theNewProperties: TFileProperties); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; end; implementation uses DCBasicTypes, DCStrUtils, WfxPlugin, uWfxPluginUtil, DCDateTimeUtils; constructor TWfxPluginSetFilePropertyOperation.Create(aTargetFileSource: IFileSource; var theTargetFiles: TFiles; var theNewProperties: TFileProperties); begin FSymLinkOption := fsooslNone; FFullFilesTree := nil; FWfxPluginFileSource:= aTargetFileSource as IWfxPluginFileSource; inherited Create(aTargetFileSource, theTargetFiles, theNewProperties); // Assign after calling inherited constructor. FSupportedProperties := [fpName, fpAttributes, fpModificationTime, fpCreationTime, fpLastAccessTime]; end; destructor TWfxPluginSetFilePropertyOperation.Destroy; begin inherited Destroy; if Recursive then begin if Assigned(FFullFilesTree) then FreeAndNil(FFullFilesTree); end; end; procedure TWfxPluginSetFilePropertyOperation.Initialize; var TotalBytes: Int64; begin with FWfxPluginFileSource do WfxModule.WfxStatusInfo(TargetFiles.Path, FS_STATUS_START, FS_STATUS_OP_ATTRIB); // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; if not Recursive then begin FFullFilesTree := TargetFiles; FStatistics.TotalFiles:= FFullFilesTree.Count; end else begin FWfxPluginFileSource.FillAndCount(TargetFiles, True, False, FFullFilesTree, FStatistics.TotalFiles, TotalBytes); // gets full list of files (recursive) end; end; procedure TWfxPluginSetFilePropertyOperation.MainExecute; var aFile: TFile; aTemplateFile: TFile; CurrentFileIndex: Integer; begin for CurrentFileIndex := 0 to FFullFilesTree.Count - 1 do begin aFile := FFullFilesTree[CurrentFileIndex]; FStatistics.CurrentFile := aFile.FullPath; UpdateStatistics(FStatistics); if Assigned(TemplateFiles) and (CurrentFileIndex < TemplateFiles.Count) then aTemplateFile := TemplateFiles[CurrentFileIndex] else aTemplateFile := nil; SetProperties(aFile, aTemplateFile); with FStatistics do begin DoneFiles := DoneFiles + 1; UpdateStatistics(FStatistics); end; CheckOperationState; end; end; procedure TWfxPluginSetFilePropertyOperation.Finalize; begin with FWfxPluginFileSource do WfxModule.WfxStatusInfo(TargetFiles.Path, FS_STATUS_END, FS_STATUS_OP_ATTRIB); end; function TWfxPluginSetFilePropertyOperation.SetNewProperty(aFile: TFile; aTemplateProperty: TFileProperty): TSetFilePropertyResult; var FileName: UTF8String; NewAttributes: TFileAttrs; ftTime: TFileTime; begin Result := sfprSuccess; case aTemplateProperty.GetID of fpName: if (aTemplateProperty as TFileNameProperty).Value <> aFile.Name then begin if not WfxRenameFile(FWfxPluginFileSource, aFile, (aTemplateProperty as TFileNameProperty).Value) then Result := sfprError; end else Result := sfprSkipped; fpAttributes: if (aTemplateProperty as TFileAttributesProperty).Value <> (aFile.Properties[fpAttributes] as TFileAttributesProperty).Value then begin NewAttributes := (aTemplateProperty as TFileAttributesProperty).Value; FileName := aFile.FullPath; with FWfxPluginFileSource.WfxModule do if aTemplateProperty is TNtfsFileAttributesProperty then begin if not WfxSetAttr(FileName, NewAttributes) then Result := sfprError; end else if aTemplateProperty is TUnixFileAttributesProperty then begin if WfxExecuteFile(0, FileName, 'chmod' + #32 + DecToOct(NewAttributes)) <> FS_EXEC_OK then Result := sfprError; end else raise Exception.Create('Unsupported file attributes type'); end else Result := sfprSkipped; fpModificationTime: if (aTemplateProperty as TFileModificationDateTimeProperty).Value <> (aFile.Properties[fpModificationTime] as TFileModificationDateTimeProperty).Value then begin ftTime := DateTimeToWfxFileTime((aTemplateProperty as TFileModificationDateTimeProperty).Value); with FWfxPluginFileSource.WfxModule do if not WfxSetTime(aFile.FullPath, nil, nil, @ftTime) then Result := sfprError; end else Result := sfprSkipped; fpCreationTime: if (aTemplateProperty as TFileCreationDateTimeProperty).Value <> (aFile.Properties[fpCreationTime] as TFileCreationDateTimeProperty).Value then begin ftTime := DateTimeToWfxFileTime((aTemplateProperty as TFileCreationDateTimeProperty).Value); with FWfxPluginFileSource.WfxModule do if not WfxSetTime(aFile.FullPath, @ftTime, nil, nil) then Result := sfprError; end else Result := sfprSkipped; fpLastAccessTime: if (aTemplateProperty as TFileLastAccessDateTimeProperty).Value <> (aFile.Properties[fpLastAccessTime] as TFileLastAccessDateTimeProperty).Value then begin ftTime := DateTimeToWfxFileTime((aTemplateProperty as TFileLastAccessDateTimeProperty).Value); with FWfxPluginFileSource.WfxModule do if not WfxSetTime(aFile.FullPath, nil, @ftTime, nil) then Result := sfprError; end else Result := sfprSkipped; else raise Exception.Create('Trying to set unsupported property'); end; end; end. doublecmd-0.5.8/src/filesources/wfxplugin/uwfxpluginfilesource.pas0000644000175000017500000010627712217255050024655 0ustar alexxalexxunit uWfxPluginFileSource; {$mode objfpc}{$H+} {$include calling.inc} interface uses Classes, SysUtils, uWFXModule, WfxPlugin, uFile, uFileSourceProperty, uFileSourceOperationTypes, uFileProperty, uFileSource, uFileSourceOperation; type TUpdateProgress = function(SourceName, TargetName: UTF8String; PercentDone: Integer): Integer of object; { IWfxPluginFileSource } IWfxPluginFileSource = interface(IFileSource) ['{F1F728C6-F718-4B17-8DE2-BE0134134ED8}'] procedure FillAndCount(Files: TFiles; CountDirs: Boolean; ExcludeRootDir: Boolean; out NewFiles: TFiles; out FilesCount: Int64; out FilesSize: Int64); function WfxCopyMove(sSourceFile, sTargetFile: UTF8String; Flags: LongInt; RemoteInfo: PRemoteInfo; Internal, CopyMoveIn: Boolean): LongInt; function GetPluginNumber: LongInt; function GetWfxModule: TWfxModule; property PluginNumber: LongInt read GetPluginNumber; property WfxModule: TWfxModule read GetWfxModule; end; { TWfxPluginFileSource } TWfxPluginFileSource = class; { TCallbackDataClass } TCallbackDataClass = class public // Must use class here instead of interface because of circular reference // between TWfxPluginFileSource and TCallbackDataClass, which would cause // the file source never to be destroyed. // TWfxPluginFileSource controls the lifetime of TCallbackDataClass though, // so it should be fine. FileSource: TWfxPluginFileSource; UpdateProgressFunction: TUpdateProgress; constructor Create(aFileSource: TWfxPluginFileSource); end; { TWfxPluginFileSource } TWfxPluginFileSource = class(TFileSource, IWfxPluginFileSource) private FModuleFileName, FPluginRootName: UTF8String; FWFXModule: TWFXModule; FPluginNumber: LongInt; FCallbackDataClass: TCallbackDataClass; function GetPluginNumber: LongInt; function GetWfxModule: TWfxModule; function CreateConnection: TFileSourceConnection; procedure CreateConnections; procedure AddToConnectionQueue(Operation: TFileSourceOperation); procedure RemoveFromConnectionQueue(Operation: TFileSourceOperation); procedure AddConnection(Connection: TFileSourceConnection); procedure RemoveConnection(Connection: TFileSourceConnection); {en Searches connections list for a connection assigned to operation. } function FindConnectionByOperation(operation: TFileSourceOperation): TFileSourceConnection; virtual; procedure NotifyNextWaitingOperation(allowedOps: TFileSourceOperationTypes); protected function GetSupportedFileProperties: TFilePropertiesTypes; override; function GetCurrentAddress: String; override; procedure OperationFinished(Operation: TFileSourceOperation); override; public procedure FillAndCount(Files: TFiles; CountDirs: Boolean; ExcludeRootDir: Boolean; out NewFiles: TFiles; out FilesCount: Int64; out FilesSize: Int64); function WfxCopyMove(sSourceFile, sTargetFile: UTF8String; Flags: LongInt; RemoteInfo: PRemoteInfo; Internal, CopyMoveIn: Boolean): LongInt; public constructor Create(aModuleFileName, aPluginRootName: UTF8String); reintroduce; destructor Destroy; override; class function CreateFile(const APath: String): TFile; override; class function CreateFile(const APath: String; FindData: TWfxFindData): TFile; overload; // Retrieve operations permitted on the source. = capabilities? function GetOperationsTypes: TFileSourceOperationTypes; override; // Retrieve some properties of the file source. function GetProperties: TFileSourceProperties; override; // These functions create an operation object specific to the file source. function CreateListOperation(TargetPath: String): TFileSourceOperation; override; function CreateCopyOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; override; function CreateCopyInOperation(SourceFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; override; function CreateCopyOutOperation(TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; override; function CreateMoveOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; override; function CreateDeleteOperation(var FilesToDelete: TFiles): TFileSourceOperation; override; function CreateCreateDirectoryOperation(BasePath: String; DirectoryPath: String): TFileSourceOperation; override; function CreateExecuteOperation(var ExecutableFile: TFile; BasePath, Verb: String): TFileSourceOperation; override; function CreateSetFilePropertyOperation(var theTargetFiles: TFiles; var theNewProperties: TFileProperties): TFileSourceOperation; override; function GetLocalName(var aFile: TFile): Boolean; override; class function CreateByRootName(aRootName: String): IWfxPluginFileSource; function GetConnection(Operation: TFileSourceOperation): TFileSourceConnection; override; procedure RemoveOperationFromQueue(Operation: TFileSourceOperation); override; property PluginNumber: LongInt read FPluginNumber; property WfxModule: TWfxModule read FWfxModule; end; { TWfxPluginFileSourceConnection } TWfxPluginFileSourceConnection = class(TFileSourceConnection) private FWfxModule: TWfxModule; public constructor Create(aWfxModule: TWfxModule); reintroduce; property WfxModule: TWfxModule read FWfxModule; end; var // Used in callback functions WfxOperationList: TStringList = nil; threadvar // Main operation progress callback function // Declared as threadvar so each operation has it own callback function UpdateProgressFunction: TUpdateProgress; implementation uses LCLProc, FileUtil, StrUtils, {} LCLType, uShowMsg, {} uGlobs, DCStrUtils, uDCUtils, uLog, uDebug, uLng, uCryptProc, DCFileAttributes, uConnectionManager, contnrs, syncobjs, uWfxPluginCopyInOperation, uWfxPluginCopyOutOperation, uWfxPluginMoveOperation, uWfxPluginExecuteOperation, uWfxPluginListOperation, uWfxPluginCreateDirectoryOperation, uWfxPluginDeleteOperation, uWfxPluginSetFilePropertyOperation, uWfxPluginCopyOperation; const connCopyIn = 0; connCopyOut = 1; connDelete = 2; connCopyMove = 3; var // Always use appropriate lock to access these lists. WfxConnections: TObjectList; // store connections created by Wcx file sources WfxOperationsQueue: TObjectList; // store queued operations, use only under FOperationsQueueLock WfxConnectionsLock: TCriticalSection; // used to synchronize access to connections WfxOperationsQueueLock: TCriticalSection; // used to synchronize access to operations queue { CallBack functions } function MainProgressProc(PluginNr: Integer; SourceName, TargetName: UTF8String; PercentDone: Integer): Integer; var CallbackDataClass: TCallbackDataClass; begin Result:= 0; DCDebug('MainProgressProc ('+IntToStr(PluginNr)+','+SourceName+','+TargetName+','+IntToStr(PercentDone)+')=' ,IntTostr(Result)); if Assigned(UpdateProgressFunction) then // Call operation progress function Result:= UpdateProgressFunction(SourceName, TargetName, PercentDone) else begin // Operation callback function not found, may be plugin call progress function // from non operation thread, call global progress function in this case DCDebug('Warning UpdateProgressFunction does not found for thread ' + hexStr(Pointer(GetCurrentThreadId))); CallbackDataClass:= TCallbackDataClass(WfxOperationList.Objects[PluginNr]); if Assigned(CallbackDataClass) and Assigned(CallbackDataClass.UpdateProgressFunction) then Result:= CallbackDataClass.UpdateProgressFunction(SourceName, TargetName, PercentDone) else // Global callback function not found, incorrect // FileSourceOperation implementation, notify about it DCDebug('Warning UpdateProgressFunction does not found for plugin number %d', [PluginNr]); end; end; function MainProgressProcA(PluginNr: Integer; SourceName, TargetName: PAnsiChar; PercentDone: Integer): Integer; dcpcall; var sSourceName, sTargetName: UTF8String; begin sSourceName:= SysToUTF8(StrPas(SourceName)); sTargetName:= SysToUTF8(StrPas(TargetName)); Result:= MainProgressProc(PluginNr, sSourceName, sTargetName, PercentDone); end; function MainProgressProcW(PluginNr: Integer; SourceName, TargetName: PWideChar; PercentDone: Integer): Integer; dcpcall; var sSourceName, sTargetName: UTF8String; begin sSourceName:= UTF8Encode(WideString(SourceName)); sTargetName:= UTF8Encode(WideString(TargetName)); Result:= MainProgressProc(PluginNr, sSourceName, sTargetName, PercentDone); end; procedure MainLogProc(PluginNr, MsgType: Integer; LogString: UTF8String); var I: Integer; sMsg: UTF8String; LogMsgType: TLogMsgType = lmtInfo; bLogFile: Boolean; sName: UTF8String; CallbackDataClass: TCallbackDataClass; Begin sMsg:= rsMsgLogInfo; bLogFile:= ((log_vfs_op in gLogOptions) and (log_info in gLogOptions)); CallbackDataClass:= TCallbackDataClass(WfxOperationList.Objects[PluginNr]); case MsgType of msgtype_connect: begin if Assigned(CallbackDataClass) then begin I:= Pos(#32, LogString); sName:= WfxOperationList[PluginNr] + ':' + Copy(LogString, I, MaxInt); AddNetworkConnection(sName, CallbackDataClass.FileSource); end; sMsg:= sMsg + '[' + IntToStr(MsgType) + ']'; ShowLogWindow(True); end; msgtype_disconnect: begin if Assigned(CallbackDataClass) then begin I:= Pos(#32, LogString); sName:= WfxOperationList[PluginNr] + Copy(LogString, I, MaxInt); RemoveNetworkConnection(sName); end; end; msgtype_details, msgtype_operationcomplete, msgtype_transfercomplete, msgtype_connectcomplete: sMsg:= sMsg + '[' + IntToStr(MsgType) + ']'; msgtype_importanterror: begin sMsg:= rsMsgLogError + '[' + IntToStr(MsgType) + ']'; LogMsgType:= lmtError; bLogFile:= (log_vfs_op in gLogOptions) and (log_errors in gLogOptions); end; end; // write log info logWrite(sMsg + ', ' + logString, LogMsgType, True, bLogFile); //DCDebug('MainLogProc ('+ sMsg + ',' + logString + ')'); end; procedure MainLogProcA(PluginNr, MsgType: Integer; LogString: PAnsiChar); dcpcall; begin MainLogProc(PluginNr, MsgType, SysToUTF8(StrPas(LogString))); end; procedure MainLogProcW(PluginNr, MsgType: Integer; LogString: PWideChar); dcpcall; begin MainLogProc(PluginNr, MsgType, UTF8Encode(WideString(LogString))); end; function MainRequestProc(PluginNr, RequestType: Integer; CustomTitle, CustomText: UTF8String; var ReturnedText: UTF8String): Bool; var sReq: UTF8String; begin Result:= False; // Use operation UI for this? if CustomTitle = '' then CustomTitle:= 'Double Commander'; case RequestType of RT_Other: begin sReq:= 'RT_Other'; Result:= ShowInputQuery(CustomTitle, CustomText, ReturnedText); end; RT_UserName: begin sReq:= 'RT_UserName'; Result:= ShowInputQuery(CustomTitle, IfThen(CustomText = EmptyStr, rsMsgUserName, CustomText), ReturnedText); end; RT_Password: begin sReq:= 'RT_Password'; Result:= ShowInputQuery(CustomTitle, IfThen(CustomText = EmptyStr, rsMsgPassword, CustomText), True, ReturnedText); end; RT_Account: begin sReq:= 'RT_Account'; Result:= ShowInputQuery(CustomTitle, IfThen(CustomText = EmptyStr, rsMsgAccount, CustomText), ReturnedText); end; RT_UserNameFirewall: begin sReq:= 'RT_UserNameFirewall'; Result:= ShowInputQuery(CustomTitle, IfThen(CustomText = EmptyStr, rsMsgUserNameFirewall, CustomText), ReturnedText); end; RT_PasswordFirewall: begin sReq:= 'RT_PasswordFirewall'; Result:= ShowInputQuery(CustomTitle, IfThen(CustomText = EmptyStr, rsMsgPasswordFirewall, CustomText), True, ReturnedText); end; RT_TargetDir: begin sReq:= 'RT_TargetDir'; Result:= ShowInputQuery(CustomTitle, IfThen(CustomText = EmptyStr, rsMsgTargetDir, CustomText), ReturnedText); end; RT_URL: begin sReq:= 'RT_URL'; Result:= ShowInputQuery(CustomTitle, IfThen(CustomText = EmptyStr, rsMsgURL, CustomText), ReturnedText); end; RT_MsgOK: begin sReq:= 'RT_MsgOK'; Result:= (ShowMessageBox(CustomText, CustomTitle, MB_OK) = IDOK); end; RT_MsgYesNo: begin sReq:= 'RT_MsgYesNo'; Result:= (ShowMessageBox(CustomText, CustomTitle, MB_YESNO) = IDYES); end; RT_MsgOKCancel: begin sReq:= 'RT_MsgOKCancel'; Result:= (ShowMessageBox(CustomText, CustomTitle, MB_OKCANCEL) = IDOK); end; end; DCDebug('MainRequestProc ('+IntToStr(PluginNr)+','+sReq+','+CustomTitle+','+CustomText+','+ReturnedText+')', BoolToStr(Result, True)); end; function MainRequestProcA(PluginNr, RequestType: Integer; CustomTitle, CustomText, ReturnedText: PAnsiChar; MaxLen: Integer): Bool; dcpcall; var sCustomTitle, sCustomText, sReturnedText: UTF8String; begin sCustomTitle:= SysToUTF8(StrPas(CustomTitle)); sCustomText:= SysToUTF8(StrPas(CustomText)); sReturnedText:= SysToUTF8(StrPas(ReturnedText)); Result:= MainRequestProc(PluginNr, RequestType, sCustomTitle, sCustomText, sReturnedText); if Result then begin if ReturnedText <> nil then StrPLCopy(ReturnedText, UTF8ToSys(sReturnedText), MaxLen); end; end; function MainRequestProcW(PluginNr, RequestType: Integer; CustomTitle, CustomText, ReturnedText: PWideChar; MaxLen: Integer): Bool; dcpcall; var sCustomTitle, sCustomText, sReturnedText: UTF8String; begin sCustomTitle:= UTF8Encode(WideString(CustomTitle)); sCustomText:= UTF8Encode(WideString(CustomText)); sReturnedText:= UTF8Encode(WideString(ReturnedText)); Result:= MainRequestProc(PluginNr, RequestType, sCustomTitle, sCustomText, sReturnedText); if Result then begin if ReturnedText <> nil then StrPLCopyW(ReturnedText, UTF8Decode(sReturnedText), MaxLen); end; end; function CryptProc(PluginNr, CryptoNumber: Integer; Mode: Integer; ConnectionName: UTF8String; var Password: UTF8String): Integer; const cPrefix = 'wfx'; var sGroup, sPassword: AnsiString; begin try sGroup:= WfxOperationList[CryptoNumber]; case Mode of FS_CRYPT_SAVE_PASSWORD: begin if PasswordStore.WritePassword(cPrefix, sGroup, ConnectionName, Password) then Result:= FS_FILE_OK else Result:= FS_FILE_WRITEERROR; end; FS_CRYPT_LOAD_PASSWORD, FS_CRYPT_LOAD_PASSWORD_NO_UI: begin Result:= FS_FILE_READERROR; if (Mode = FS_CRYPT_LOAD_PASSWORD_NO_UI) and (PasswordStore.HasMasterKey = False) then Exit(FS_FILE_NOTFOUND); if PasswordStore.ReadPassword(cPrefix, sGroup, ConnectionName, Password) then Result:= FS_FILE_OK; end; FS_CRYPT_COPY_PASSWORD, FS_CRYPT_MOVE_PASSWORD: begin Result:= FS_FILE_READERROR; if PasswordStore.ReadPassword(cPrefix, sGroup, ConnectionName, sPassword) then begin if not PasswordStore.WritePassword(cPrefix, sGroup, Password, sPassword) then Exit(FS_FILE_WRITEERROR); if Mode = FS_CRYPT_MOVE_PASSWORD then PasswordStore.DeletePassword(cPrefix, sGroup, ConnectionName); Result:= FS_FILE_OK; end; end; FS_CRYPT_DELETE_PASSWORD: begin PasswordStore.DeletePassword(cPrefix, sGroup, ConnectionName); Result:= FS_FILE_OK; end; end; except Result:= FS_FILE_NOTSUPPORTED; end; end; function CryptProcA(PluginNr, CryptoNumber: Integer; Mode: Integer; ConnectionName, Password: PAnsiChar; MaxLen: Integer): Integer; dcpcall; var sConnectionName, sPassword: UTF8String; begin sConnectionName:= SysToUTF8(StrPas(ConnectionName)); sPassword:= SysToUTF8(StrPas(Password)); Result:= CryptProc(PluginNr, CryptoNumber, Mode, sConnectionName, sPassword); if Result = FS_FILE_OK then begin if Password <> nil then StrPLCopy(Password, UTF8ToSys(sPassword), MaxLen); end; end; function CryptProcW(PluginNr, CryptoNumber: Integer; Mode: Integer; ConnectionName, Password: PWideChar; MaxLen: Integer): Integer; dcpcall; var sConnectionName, sPassword: UTF8String; begin sConnectionName:= UTF8Encode(WideString(ConnectionName)); sPassword:= UTF8Encode(WideString(Password)); Result:= CryptProc(PluginNr, CryptoNumber, Mode, sConnectionName, sPassword); if Result = FS_FILE_OK then begin if Password <> nil then StrPLCopyW(Password, UTF8Decode(sPassword), MaxLen); end; end; { TWfxPluginFileSource } constructor TWfxPluginFileSource.Create(aModuleFileName, aPluginRootName: UTF8String); begin inherited Create; FPluginNumber:= -1; FCallbackDataClass:= nil; FModuleFileName:= aModuleFileName; FPluginRootName:= aPluginRootName; FWfxModule:= TWfxModule.Create; if not FWfxModule.LoadModule(FModuleFileName) then raise EFileSourceException.Create('Cannot load WFX module ' + FModuleFileName); with FWfxModule do begin FCallbackDataClass:= TCallbackDataClass.Create(Self); FPluginNumber:= WfxOperationList.AddObject(FPluginRootName, FCallbackDataClass); if Assigned(FsInit) then FsInit(FPluginNumber, @MainProgressProcA, @MainLogProcA, @MainRequestProcA); if Assigned(FsInitW) then FsInitW(FPluginNumber, @MainProgressProcW, @MainLogProcW, @MainRequestProcW); if Assigned(FsSetCryptCallback) then FsSetCryptCallback(@CryptProcA, FPluginNumber, 0); if Assigned(FsSetCryptCallbackW) then FsSetCryptCallbackW(@CryptProcW, FPluginNumber, 0); VFSInit(0); end; FOperationsClasses[fsoList] := TWfxPluginListOperation.GetOperationClass; FOperationsClasses[fsoCopy] := TWfxPluginCopyOperation.GetOperationClass; FOperationsClasses[fsoCopyIn] := TWfxPluginCopyInOperation.GetOperationClass; FOperationsClasses[fsoCopyOut] := TWfxPluginCopyOutOperation.GetOperationClass; FOperationsClasses[fsoMove] := TWfxPluginMoveOperation.GetOperationClass; FOperationsClasses[fsoDelete] := TWfxPluginDeleteOperation.GetOperationClass; FOperationsClasses[fsoCreateDirectory] := TWfxPluginCreateDirectoryOperation.GetOperationClass; FOperationsClasses[fsoSetFileProperty] := TWfxPluginSetFilePropertyOperation.GetOperationClass; FOperationsClasses[fsoExecute] := TWfxPluginExecuteOperation.GetOperationClass; CreateConnections; end; destructor TWfxPluginFileSource.Destroy; begin if (FPluginNumber >= 0) and (FPluginNumber < WfxOperationList.Count) then WfxOperationList.Objects[FPluginNumber]:= nil; FreeThenNil(FCallbackDataClass); inherited Destroy; end; class function TWfxPluginFileSource.CreateFile(const APath: String): TFile; begin Result := TFile.Create(APath); with Result do begin AttributesProperty := TFileAttributesProperty.CreateOSAttributes; SizeProperty := TFileSizeProperty.Create; ModificationTimeProperty := TFileModificationDateTimeProperty.Create; LastAccessTimeProperty := TFileLastAccessDateTimeProperty.Create; CreationTimeProperty := TFileCreationDateTimeProperty.Create; LinkProperty := TFileLinkProperty.Create; end; end; class function TWfxPluginFileSource.CreateFile(const APath: String; FindData: TWfxFindData): TFile; begin Result := TFile.Create(APath); with Result do begin // Check that attributes is used if (FindData.FileAttributes and FILE_ATTRIBUTE_UNIX_MODE) = 0 then // Windows attributes begin LinkProperty := TFileLinkProperty.Create; LinkProperty.IsLinkToDirectory := ((FindData.FileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0) and ((FindData.FileAttributes and FILE_ATTRIBUTE_REPARSE_POINT) <> 0); AttributesProperty := TNtfsFileAttributesProperty.Create(FindData.FileAttributes); end else // Unix attributes begin LinkProperty := TFileLinkProperty.Create; LinkProperty.IsLinkToDirectory := (((FindData.FileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0) or ((FindData.FileAttributes and FILE_ATTRIBUTE_REPARSE_POINT) <> 0)) and ((FindData.Reserved0 and S_IFMT) = S_IFLNK); if ((FindData.FileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0) and ((FindData.Reserved0 and S_IFMT) <> S_IFDIR) then FindData.Reserved0:= FindData.Reserved0 or S_IFDIR; AttributesProperty := TUnixFileAttributesProperty.Create(FindData.Reserved0); end; SizeProperty := TFileSizeProperty.Create(FindData.FileSize); ModificationTimeProperty := TFileModificationDateTimeProperty.Create(FindData.LastWriteTime); LastAccessTimeProperty := TFileLastAccessDateTimeProperty.Create(FindData.LastAccessTime); CreationTimeProperty := TFileCreationDateTimeProperty.Create(FindData.CreationTime); // Set name after assigning Attributes property, because it is used to get extension. Name := FindData.FileName; end; end; function TWfxPluginFileSource.GetOperationsTypes: TFileSourceOperationTypes; begin with WfxModule do begin Result := [fsoList]; // supports by any plugin if Assigned(FsPutFile) or Assigned(FsPutFileW) then Result:= Result + [fsoCopyIn]; if Assigned(FsGetFile) or Assigned(FsGetFileW) then Result:= Result + [fsoCopyOut]; if Assigned(FsRenMovFile) or Assigned(FsRenMovFileW) then Result:= Result + [fsoCopy, fsoMove]; if Assigned(FsDeleteFile) or Assigned(FsDeleteFileW) then Result:= Result + [fsoDelete]; if Assigned(FsMkDir) or Assigned(FsMkDirW) then Result:= Result + [fsoCreateDirectory]; if Assigned(FsExecuteFile) or Assigned(FsExecuteFileW) then Result:= Result + [fsoExecute]; if Assigned(FsSetAttr) or Assigned(FsSetAttrW) or Assigned(FsExecuteFile) or Assigned(FsExecuteFileW) or Assigned(FsRenMovFile) or Assigned(FsRenMovFileW) then Result:= Result + [fsoSetFileProperty]; end; end; function TWfxPluginFileSource.GetProperties: TFileSourceProperties; begin Result := [fspUsesConnections, fspListInMainThread]; with FWfxModule do if Assigned(FsLinksToLocalFiles) and FsLinksToLocalFiles() then Result:= Result + [fspLinksToLocalFiles]; end; function TWfxPluginFileSource.GetSupportedFileProperties: TFilePropertiesTypes; begin Result := inherited GetSupportedFileProperties + [fpSize, fpAttributes, fpModificationTime, fpCreationTime, fpLastAccessTime, fpLink]; end; function TWfxPluginFileSource.GetCurrentAddress: String; begin Result:= 'wfx://' + FPluginRootName; end; function TWfxPluginFileSource.GetPluginNumber: LongInt; begin Result := FPluginNumber; end; function TWfxPluginFileSource.GetWfxModule: TWfxModule; begin Result := FWFXModule; end; procedure TWfxPluginFileSource.FillAndCount(Files: TFiles; CountDirs: Boolean; ExcludeRootDir: Boolean; out NewFiles: TFiles; out FilesCount: Int64; out FilesSize: Int64); procedure FillAndCountRec(const srcPath: UTF8String); var FindData: TWfxFindData; Handle: THandle; aFile: TFile; begin with FWfxModule do begin Handle := WfxFindFirst(srcPath, FindData); if Handle = wfxInvalidHandle then Exit; repeat if (FindData.FileName = '.') or (FindData.FileName = '..') then Continue; aFile:= TWfxPluginFileSource.CreateFile(srcPath, FindData); NewFiles.Add(aFile); if aFile.IsDirectory then begin if CountDirs then Inc(FilesCount); FillAndCountRec(srcPath + FindData.FileName + PathDelim); end else begin Inc(FilesSize, aFile.Size); Inc(FilesCount); end; until not WfxFindNext(Handle, FindData); FsFindClose(Handle); end; end; var I: Integer; aFile: TFile; begin FilesCount:= 0; FilesSize:= 0; if ExcludeRootDir then begin if Files.Count <> 1 then raise Exception.Create('Only a single directory can be set with ExcludeRootDir=True'); NewFiles := TFiles.Create(Files[0].FullPath); FillAndCountRec(Files[0].FullPath + DirectorySeparator); end else begin NewFiles := TFiles.Create(Files.Path); for I := 0 to Files.Count - 1 do begin aFile := Files[I]; NewFiles.Add(aFile.Clone); if aFile.AttributesProperty.IsDirectory and (not aFile.LinkProperty.IsLinkToDirectory) then begin if CountDirs then Inc(FilesCount); FillAndCountRec(aFile.Path + aFile.Name + DirectorySeparator); // recursive browse child dir end else begin Inc(FilesCount); Inc(FilesSize, aFile.Size); // in first level we know file size -> use it end; end; end; end; function TWfxPluginFileSource.WfxCopyMove(sSourceFile, sTargetFile: UTF8String; Flags: LongInt; RemoteInfo: PRemoteInfo; Internal, CopyMoveIn: Boolean): LongInt; var bMove, bOverWrite: Boolean; begin with FWfxModule do begin if Internal then begin bMove:= ((Flags and FS_COPYFLAGS_MOVE) <> 0); bOverWrite:= ((Flags and FS_COPYFLAGS_OVERWRITE) <> 0); Result:= WfxRenMovFile(sSourceFile, sTargetFile, bMove, bOverWrite, RemoteInfo); end else begin if CopyMoveIn then Result:= WfxPutFile(sSourceFile, sTargetFile, Flags) else Result:= WfxGetFile(sSourceFile, sTargetFile, Flags, RemoteInfo); end; end; end; function TWfxPluginFileSource.CreateListOperation(TargetPath: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TWfxPluginListOperation.Create(TargetFileSource, TargetPath); end; function TWfxPluginFileSource.CreateCopyOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; var FileSource: IFileSource; begin FileSource := Self; Result := TWfxPluginCopyOperation.Create(FileSource, FileSource, SourceFiles, TargetPath); end; function TWfxPluginFileSource.CreateCopyInOperation( SourceFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TWfxPluginCopyInOperation.Create(SourceFileSource, TargetFileSource, SourceFiles, TargetPath); end; function TWfxPluginFileSource.CreateCopyOutOperation( TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; var SourceFileSource: IFileSource; begin SourceFileSource := Self; Result := TWfxPluginCopyOutOperation.Create(SourceFileSource, TargetFileSource, SourceFiles, TargetPath); end; function TWfxPluginFileSource.CreateMoveOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TWfxPluginMoveOperation.Create(TargetFileSource, SourceFiles, TargetPath); end; function TWfxPluginFileSource.CreateDeleteOperation(var FilesToDelete: TFiles): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TWfxPluginDeleteOperation.Create(TargetFileSource, FilesToDelete); end; function TWfxPluginFileSource.CreateCreateDirectoryOperation(BasePath: String; DirectoryPath: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TWfxPluginCreateDirectoryOperation.Create(TargetFileSource, BasePath, DirectoryPath); end; function TWfxPluginFileSource.CreateExecuteOperation(var ExecutableFile: TFile; BasePath, Verb: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result:= TWfxPluginExecuteOperation.Create(TargetFileSource, ExecutableFile, BasePath, Verb); end; function TWfxPluginFileSource.CreateSetFilePropertyOperation( var theTargetFiles: TFiles; var theNewProperties: TFileProperties): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TWfxPluginSetFilePropertyOperation.Create( TargetFileSource, theTargetFiles, theNewProperties); end; function TWfxPluginFileSource.GetLocalName(var aFile: TFile): Boolean; var sFileName: UTF8String; begin Result:= False; sFileName:= aFile.FullPath; if FWfxModule.WfxGetLocalName(sFileName) then begin aFile.FullPath:= sFileName; Result:= True; end; end; class function TWfxPluginFileSource.CreateByRootName(aRootName: String): IWfxPluginFileSource; var sModuleFileName: UTF8String; begin Result:= nil; if gWFXPlugins.Count = 0 then Exit; // Check if there is a registered plugin for the name of the file system plugin. sModuleFileName:= gWFXPlugins.Values[aRootName]; if sModuleFileName <> EmptyStr then begin sModuleFileName:= GetCmdDirFromEnvVar(sModuleFileName); Result:= TWfxPluginFileSource.Create(sModuleFileName, aRootName); DCDebug('Found registered plugin ' + sModuleFileName + ' for file system ' + aRootName); end; end; procedure TWfxPluginFileSource.AddToConnectionQueue(Operation: TFileSourceOperation); begin WfxOperationsQueueLock.Acquire; try if WfxOperationsQueue.IndexOf(Operation) < 0 then WfxOperationsQueue.Add(Operation); finally WfxOperationsQueueLock.Release; end; end; procedure TWfxPluginFileSource.RemoveFromConnectionQueue(Operation: TFileSourceOperation); begin WfxOperationsQueueLock.Acquire; try WfxOperationsQueue.Remove(Operation); finally WfxOperationsQueueLock.Release; end; end; procedure TWfxPluginFileSource.AddConnection(Connection: TFileSourceConnection); begin WfxConnectionsLock.Acquire; try if WfxConnections.IndexOf(Connection) < 0 then WfxConnections.Add(Connection); finally WfxConnectionsLock.Release; end; end; procedure TWfxPluginFileSource.RemoveConnection(Connection: TFileSourceConnection); begin WfxConnectionsLock.Acquire; try WfxConnections.Remove(Connection); finally WfxConnectionsLock.Release; end; end; function TWfxPluginFileSource.GetConnection(Operation: TFileSourceOperation): TFileSourceConnection; begin Result := nil; case Operation.ID of fsoCopy, fsoMove: Result := WfxConnections[connCopyMove] as TFileSourceConnection; fsoCopyIn: Result := WfxConnections[connCopyIn] as TFileSourceConnection; fsoCopyOut: Result := WfxConnections[connCopyOut] as TFileSourceConnection; fsoDelete: Result := WfxConnections[connDelete] as TFileSourceConnection; else begin Result := CreateConnection; if Assigned(Result) then AddConnection(Result); end; end; if Assigned(Result) then Result := TryAcquireConnection(Result, Operation); // No available connection - wait. if not Assigned(Result) then AddToConnectionQueue(Operation) else // Connection acquired. // The operation may have been waiting in the queue // for the connection, so remove it from the queue. RemoveFromConnectionQueue(Operation); end; procedure TWfxPluginFileSource.RemoveOperationFromQueue(Operation: TFileSourceOperation); begin RemoveFromConnectionQueue(Operation); end; function TWfxPluginFileSource.CreateConnection: TFileSourceConnection; begin Result := TWfxPluginFileSourceConnection.Create(FWfxModule); end; procedure TWfxPluginFileSource.CreateConnections; begin WfxConnectionsLock.Acquire; try if WfxConnections.Count = 0 then begin // Reserve some connections (only once). WfxConnections.Add(CreateConnection); // connCopyIn WfxConnections.Add(CreateConnection); // connCopyOut WfxConnections.Add(CreateConnection); // connDelete WfxConnections.Add(CreateConnection); // connCopyMove end; finally WfxConnectionsLock.Release; end; end; function TWfxPluginFileSource.FindConnectionByOperation(operation: TFileSourceOperation): TFileSourceConnection; var i: Integer; connection: TFileSourceConnection; begin Result := nil; WfxConnectionsLock.Acquire; try for i := 0 to WfxConnections.Count - 1 do begin connection := WfxConnections[i] as TFileSourceConnection; if connection.AssignedOperation = operation then Exit(connection); end; finally WfxConnectionsLock.Release; end; end; procedure TWfxPluginFileSource.OperationFinished(Operation: TFileSourceOperation); var allowedIDs: TFileSourceOperationTypes = []; connection: TFileSourceConnection; begin connection := FindConnectionByOperation(Operation); if Assigned(connection) then begin connection.Release; // unassign operation WfxConnectionsLock.Acquire; try // If there are operations waiting, take the first one and notify // that a connection is available. // Only check operation types for which there are reserved connections. if Operation.ID in [fsoCopyIn, fsoCopyOut, fsoDelete, fsoCopy, fsoMove] then begin Include(allowedIDs, Operation.ID); NotifyNextWaitingOperation(allowedIDs); end else begin WfxConnections.Remove(connection); end; finally WfxConnectionsLock.Release; end; end; end; procedure TWfxPluginFileSource.NotifyNextWaitingOperation(allowedOps: TFileSourceOperationTypes); var i: Integer; operation: TFileSourceOperation; begin WfxOperationsQueueLock.Acquire; try for i := 0 to WfxOperationsQueue.Count - 1 do begin operation := WfxOperationsQueue.Items[i] as TFileSourceOperation; if (operation.State = fsosWaitingForConnection) and (operation.ID in allowedOps) then begin operation.ConnectionAvailableNotify; Exit; end; end; finally WfxOperationsQueueLock.Release; end; end; { TWfxPluginFileSourceConnection } constructor TWfxPluginFileSourceConnection.Create(aWfxModule: TWfxModule); begin FWfxModule := aWfxModule; inherited Create; end; { TCallbackDataClass } constructor TCallbackDataClass.Create(aFileSource: TWfxPluginFileSource); begin inherited Create; FileSource:= aFileSource; UpdateProgressFunction:= nil; end; initialization WfxOperationList:= TStringList.Create; WfxConnections := TObjectList.Create(True); // True = destroy objects when destroying list WfxConnectionsLock := TCriticalSection.Create; WfxOperationsQueue := TObjectList.Create(False); // False = don't destroy operations (only store references) WfxOperationsQueueLock := TCriticalSection.Create; finalization FreeThenNil(WfxOperationList); FreeThenNil(WfxConnections); FreeThenNil(WfxConnectionsLock); FreeThenNil(WfxOperationsQueue); FreeThenNil(WfxOperationsQueueLock); end. doublecmd-0.5.8/src/filesources/wfxplugin/uwfxplugindeleteoperation.pas0000644000175000017500000001436311747211345025700 0ustar alexxalexxunit uWfxPluginDeleteOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceDeleteOperation, uWfxPluginFileSource, uFileSource, uFileSourceOperationOptions, uFileSourceOperationUI, uFile, uGlobs, uLog; type TWfxPluginDeleteOperation = class(TFileSourceDeleteOperation) private FWfxPluginFileSource: IWfxPluginFileSource; FFullFilesTreeToDelete: TFiles; // source files including all files/dirs in subdirectories FStatistics: TFileSourceDeleteOperationStatistics; // local copy of statistics // Options. FSymLinkOption: TFileSourceOperationOptionSymLink; FSkipErrors: Boolean; FDeleteReadOnly: TFileSourceOperationOptionGeneral; protected function ProcessFile(aFile: TFile): Boolean; function ShowError(sMessage: String): TFileSourceOperationUIResponse; procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); public constructor Create(aTargetFileSource: IFileSource; var theFilesToDelete: TFiles); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; end; implementation uses DCOSUtils, uLng, WfxPlugin; constructor TWfxPluginDeleteOperation.Create(aTargetFileSource: IFileSource; var theFilesToDelete: TFiles); begin FSymLinkOption := fsooslNone; FSkipErrors := False; FDeleteReadOnly := fsoogNone; FFullFilesTreeToDelete := nil; FWfxPluginFileSource:= aTargetFileSource as IWfxPluginFileSource; inherited Create(aTargetFileSource, theFilesToDelete); end; destructor TWfxPluginDeleteOperation.Destroy; begin inherited Destroy; end; procedure TWfxPluginDeleteOperation.Initialize; begin with FWfxPluginFileSource do WfxModule.WfxStatusInfo(FilesToDelete.Path, FS_STATUS_START, FS_STATUS_OP_DELETE); // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; FWfxPluginFileSource.FillAndCount(FilesToDelete, True, False, FFullFilesTreeToDelete, FStatistics.TotalFiles, FStatistics.TotalBytes); // gets full list of files (recursive) end; procedure TWfxPluginDeleteOperation.MainExecute; var aFile: TFile; CurrentFileIndex: Integer; begin for CurrentFileIndex := FFullFilesTreeToDelete.Count - 1 downto 0 do begin aFile := FFullFilesTreeToDelete[CurrentFileIndex]; FStatistics.CurrentFile := aFile.Path + aFile.Name; UpdateStatistics(FStatistics); ProcessFile(aFile); with FStatistics do begin DoneFiles := DoneFiles + 1; DoneBytes := DoneBytes + aFile.Size; UpdateStatistics(FStatistics); end; CheckOperationState; end; end; procedure TWfxPluginDeleteOperation.Finalize; begin with FWfxPluginFileSource do WfxModule.WfxStatusInfo(FilesToDelete.Path, FS_STATUS_END, FS_STATUS_OP_DELETE); end; function TWfxPluginDeleteOperation.ProcessFile(aFile: TFile): Boolean; var FileName: String; bRetry: Boolean; sMessage, sQuestion: String; logOptions: TLogOptions; begin Result := False; FileName := aFile.Path + aFile.Name; if FileIsReadOnly(aFile.Attributes) then begin case FDeleteReadOnly of fsoogNone: case AskQuestion(Format(rsMsgFileReadOnly, [FileName]), '', [fsourYes, fsourAll, fsourSkip, fsourSkipAll], fsourYes, fsourSkip) of fsourAll: FDeleteReadOnly := fsoogYes; fsourSkip: Exit; fsourSkipAll: begin FDeleteReadOnly := fsoogNo; Exit; end; end; fsoogNo: Exit; end; end; repeat bRetry := False; //if FileIsReadOnly(aFile.Attributes) then // mbFileSetReadOnly(FileName, False); with FWfxPluginFileSource.WfxModule do if aFile.IsDirectory then // directory begin Result := WfxRemoveDir(FileName); end else begin // files and other stuff Result := WfxDeleteFile(FileName); end; if Result then begin // success if aFile.IsDirectory then begin LogMessage(Format(rsMsgLogSuccess + rsMsgLogRmDir, [FileName]), [log_vfs_op], lmtSuccess); end else begin LogMessage(Format(rsMsgLogSuccess + rsMsgLogDelete, [FileName]), [log_vfs_op], lmtSuccess); end; end else // error begin if aFile.IsDirectory then begin logOptions := [log_vfs_op]; sMessage := Format(rsMsgLogError + rsMsgLogRmDir, [FileName]); sQuestion := Format(rsMsgNotDelete, [FileName]); end else begin logOptions := [log_vfs_op]; sMessage := Format(rsMsgLogError + rsMsgLogDelete, [FileName]); sQuestion := Format(rsMsgNotDelete, [FileName]); end; if gSkipFileOpError or (FSkipErrors = True) then LogMessage(sMessage, logOptions, lmtError) else begin case AskQuestion(sQuestion, '', [fsourRetry, fsourSkip, fsourSkipAll, fsourAbort], fsourRetry, fsourSkip) of fsourRetry: bRetry := True; fsourSkipAll: FSkipErrors := True; fsourAbort: RaiseAbortOperation; end; end; end; until bRetry = False; end; function TWfxPluginDeleteOperation.ShowError(sMessage: String): TFileSourceOperationUIResponse; begin if gSkipFileOpError then begin logWrite(Thread, sMessage, lmtError, True); Result := fsourSkip; end else begin Result := AskQuestion(sMessage, '', [fsourSkip, fsourCancel], fsourSkip, fsourCancel); if Result = fsourCancel then RaiseAbortOperation; end; end; procedure TWfxPluginDeleteOperation.LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); begin case logMsgType of lmtError: if not (log_errors in gLogOptions) then Exit; lmtInfo: if not (log_info in gLogOptions) then Exit; lmtSuccess: if not (log_success in gLogOptions) then Exit; end; if logOptions <= gLogOptions then begin logWrite(Thread, sMessage, logMsgType); end; end; end. doublecmd-0.5.8/src/filesources/wfxplugin/uwfxpluginlistoperation.pas0000644000175000017500000000562411753503774025420 0ustar alexxalexxunit uWfxPluginListOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceListOperation, uWfxPluginFileSource, uFileSource; type { TWfxPluginListOperation } TWfxPluginListOperation = class(TFileSourceListOperation) private FWfxPluginFileSource: IWfxPluginFileSource; FCallbackDataClass: TCallbackDataClass; FCurrentPath: UTF8String; protected function UpdateProgress(SourceName, TargetName: UTF8String; PercentDone: Integer): Integer; public constructor Create(aFileSource: IFileSource; aPath: String); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; end; implementation uses uOSUtils, DCStrUtils, uFile, WfxPlugin, uWfxModule, uLog, uLng; function TWfxPluginListOperation.UpdateProgress(SourceName, TargetName: UTF8String; PercentDone: Integer): Integer; begin logWrite(rsMsgLoadingFileList + IntToStr(PercentDone) + '%', lmtInfo, False, False); Result := 0; end; constructor TWfxPluginListOperation.Create(aFileSource: IFileSource; aPath: String); begin FFiles := TFiles.Create(aPath); FWfxPluginFileSource := aFileSource as IWfxPluginFileSource; with FWfxPluginFileSource do FCallbackDataClass:= TCallbackDataClass(WfxOperationList.Objects[PluginNumber]); FCurrentPath:= ExcludeBackPathDelimiter(aPath); inherited Create(aFileSource, aPath); end; destructor TWfxPluginListOperation.Destroy; begin inherited Destroy; end; procedure TWfxPluginListOperation.Initialize; begin with FWfxPluginFileSource do begin WfxModule.WfxStatusInfo(FCurrentPath, FS_STATUS_START, FS_STATUS_OP_LIST); FCallbackDataClass.UpdateProgressFunction:= @UpdateProgress; UpdateProgressFunction:= @UpdateProgress; end; end; procedure TWfxPluginListOperation.MainExecute; var FindData : TWfxFindData; Handle: THandle; aFile: TFile; begin with FWfxPluginFileSource.WFXModule do begin FFiles.Clear; if not FileSource.IsPathAtRoot(Path) then begin aFile := TWfxPluginFileSource.CreateFile(Path); aFile.Name := '..'; aFile.Attributes := faFolder; FFiles.Add(aFile); end; Handle := WfxFindFirst(FCurrentPath, FindData); if Handle <> wfxInvalidHandle then try repeat CheckOperationState; if (FindData.FileName = '.') or (FindData.FileName = '..') then Continue; aFile := TWfxPluginFileSource.CreateFile(Path, FindData); FFiles.Add(aFile); until (not WfxFindNext(Handle, FindData)); finally FsFindClose(Handle); end; end; // with end; procedure TWfxPluginListOperation.Finalize; begin with FWfxPluginFileSource do begin WfxModule.WfxStatusInfo(FCurrentPath, FS_STATUS_END, FS_STATUS_OP_LIST); FCallbackDataClass.UpdateProgressFunction:= nil; UpdateProgressFunction:= nil; end; end; end. doublecmd-0.5.8/src/filesources/wfxplugin/uwfxpluginutil.pas0000644000175000017500000003115211747211345023465 0ustar alexxalexxunit uWfxPluginUtil; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LCLProc, uLog, uGlobs, WfxPlugin, uFile, uFileSource, uFileSourceOperation, uFileSourceOperationOptions, uFileSourceOperationUI, uFileSourceCopyOperation, uWfxPluginFileSource; type TWfxPluginOperationHelperMode = (wpohmCopy, wpohmCopyIn, wpohmCopyOut, wpohmMove); TUpdateStatisticsFunction = procedure(var NewStatistics: TFileSourceCopyOperationStatistics) of object; { TWfxPluginOperationHelper } TWfxPluginOperationHelper = class private FWfxPluginFileSource: IWfxPluginFileSource; FOperationThread: TThread; FMode: TWfxPluginOperationHelperMode; FRootTargetPath: String; FRenameMask: String; FRenameNameMask, FRenameExtMask: String; FLogCaption: String; FRenamingFiles, FRenamingRootDir, FInternal: Boolean; FFileExistsOption: TFileSourceOperationOptionFileExists; AskQuestion: TAskQuestionFunction; AbortOperation: TAbortOperationFunction; CheckOperationState: TCheckOperationStateFunction; UpdateStatistics: TUpdateStatisticsFunction; procedure ShowError(sMessage: String); procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); function ProcessDirectory(aFile: TFile; AbsoluteTargetFileName: String): LongInt; function ProcessFile(aFile: TFile; AbsoluteTargetFileName: String; var Statistics: TFileSourceCopyOperationStatistics): LongInt; function FileExists(aFile: TFile; AbsoluteTargetFileName: String; AllowAppend: Boolean): TFileSourceOperationOptionFileExists; public constructor Create(FileSource: IFileSource; AskQuestionFunction: TAskQuestionFunction; AbortOperationFunction: TAbortOperationFunction; CheckOperationStateFunction: TCheckOperationStateFunction; UpdateStatisticsFunction: TUpdateStatisticsFunction; OperationThread: TThread; Mode: TWfxPluginOperationHelperMode; TargetPath: String ); destructor Destroy; override; procedure Initialize; procedure ProcessFiles(aFiles: TFiles; var Statistics: TFileSourceCopyOperationStatistics); property FileExistsOption: TFileSourceOperationOptionFileExists read FFileExistsOption write FFileExistsOption; property RenameMask: String read FRenameMask write FRenameMask; end; function WfxRenameFile(aFileSource: IWfxPluginFileSource; const aFile: TFile; const NewFileName: UTF8String): Boolean; function WfxFileTimeToDateTime(FileTime : TWfxFileTime) : TDateTime; inline; function DateTimeToWfxFileTime(DateTime : TDateTime) : TWfxFileTime; inline; implementation uses uFileProcs, DCStrUtils, uLng, uWfxModule, uFileSystemUtil, uFileProperty, DCDateTimeUtils, DCBasicTypes; function WfxRenameFile(aFileSource: IWfxPluginFileSource; const aFile: TFile; const NewFileName: UTF8String): Boolean; var RemoteInfo: TRemoteInfo; iTemp: TInt64Rec; begin with aFileSource do begin with RemoteInfo do begin iTemp.Value := (aFile.Properties[fpSize] as TFileSizeProperty).Value; SizeLow := iTemp.Low; SizeHigh := iTemp.High; LastWriteTime := DateTimeToWfxFileTime((aFile.Properties[fpModificationTime] as TFileModificationDateTimeProperty).Value); Attr := LongInt((aFile.Properties[fpAttributes] as TFileAttributesProperty).Value); end; Result := (WfxCopyMove(aFile.Path + aFile.Name, aFile.Path + NewFileName, FS_COPYFLAGS_MOVE, @RemoteInfo, True, True) = FS_FILE_OK); end; end; function WfxFileTimeToDateTime(FileTime: TWfxFileTime): TDateTime; begin Result:= WinFileTimeToDateTime(TWinFileTime(FileTime)); end; function DateTimeToWfxFileTime(DateTime: TDateTime): TWfxFileTime; begin Result:= TWfxFileTime(DateTimeToWinFileTime(DateTime)); end; { TWfxPluginOperationHelper } procedure TWfxPluginOperationHelper.ShowError(sMessage: String); begin if gSkipFileOpError then begin if log_errors in gLogOptions then logWrite(FOperationThread, sMessage, lmtError, True); end else begin if AskQuestion(sMessage, '', [fsourSkip, fsourAbort], fsourSkip, fsourAbort) = fsourAbort then begin AbortOperation; end; end; end; procedure TWfxPluginOperationHelper.LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); begin case logMsgType of lmtError: if not (log_errors in gLogOptions) then Exit; lmtInfo: if not (log_info in gLogOptions) then Exit; lmtSuccess: if not (log_success in gLogOptions) then Exit; end; if logOptions <= gLogOptions then begin logWrite(FOperationThread, sMessage, logMsgType); end; end; function TWfxPluginOperationHelper.ProcessDirectory(aFile: TFile; AbsoluteTargetFileName: String): LongInt; begin Result:= WFX_ERROR; case FMode of wpohmCopy, wpohmCopyIn, wpohmMove: begin Result:= FWfxPluginFileSource.WfxModule.WfxMkDir('', AbsoluteTargetFileName); end; wpohmCopyOut: begin if mbForceDirectory(AbsoluteTargetFileName) then Result:= WFX_SUCCESS; end; end; end; function TWfxPluginOperationHelper.ProcessFile(aFile: TFile; AbsoluteTargetFileName: String; var Statistics: TFileSourceCopyOperationStatistics): LongInt; var iFlags: Integer; RemoteInfo: TRemoteInfo; iTemp: TInt64Rec; bCopyMoveIn: Boolean; OldDoneBytes: Int64; // for if there was an error begin // If there will be an error the DoneBytes value // will be inconsistent, so remember it here. OldDoneBytes := Statistics.DoneBytes; with FWfxPluginFileSource do begin { FCurrentFileSize:= aFile.Size; } iFlags:= 0; with RemoteInfo do begin iTemp.Value := (aFile.Properties[fpSize] as TFileSizeProperty).Value; SizeLow := iTemp.Low; SizeHigh := iTemp.High; LastWriteTime := DateTimeToWfxFileTime((aFile.Properties[fpModificationTime] as TFileModificationDateTimeProperty).Value); Attr := LongInt((aFile.Properties[fpAttributes] as TFileAttributesProperty).Value); end; if (FMode = wpohmMove) then iFlags:= iFlags + FS_COPYFLAGS_MOVE; bCopyMoveIn:= (FMode = wpohmCopyIn); Result := WfxCopyMove(aFile.Path + aFile.Name, AbsoluteTargetFileName, iFlags, @RemoteInfo, FInternal, bCopyMoveIn); case Result of FS_FILE_EXISTS, // The file already exists, and resume isn't supported FS_FILE_EXISTSRESUMEALLOWED: // The file already exists, and resume is supported begin case FileExists(aFile, AbsoluteTargetFileName, Result = FS_FILE_EXISTSRESUMEALLOWED) of fsoofeSkip: Exit(FS_FILE_OK); fsoofeOverwrite: iFlags:= iFlags + FS_COPYFLAGS_OVERWRITE; fsoofeAppend: iFlags:= iFlags + FS_COPYFLAGS_RESUME; else raise Exception.Create('Invalid file exists option'); end; Result := WfxCopyMove(aFile.Path + aFile.Name, AbsoluteTargetFileName, iFlags, @RemoteInfo, FInternal, bCopyMoveIn); end; end; end; with Statistics do begin DoneFiles := DoneFiles + 1; DoneBytes := OldDoneBytes + (aFile.Properties[fpSize] as TFileSizeProperty).Value; UpdateStatistics(Statistics); end; end; function TWfxPluginOperationHelper.FileExists(aFile: TFile; AbsoluteTargetFileName: String; AllowAppend: Boolean ): TFileSourceOperationOptionFileExists; const Responses: array[0..4] of TFileSourceOperationUIResponse = (fsourOverwrite, fsourSkip, fsourAppend, fsourOverwriteAll, fsourSkipAll); ResponsesNoAppend: array[0..3] of TFileSourceOperationUIResponse = (fsourOverwrite, fsourSkip, fsourOverwriteAll, fsourSkipAll); var PossibleResponses: array of TFileSourceOperationUIResponse; begin case FFileExistsOption of fsoofeNone: begin case AllowAppend of True : PossibleResponses := Responses; False: PossibleResponses := ResponsesNoAppend; end; case AskQuestion(Format(rsMsgFileExistsRwrt, [AbsoluteTargetFileName]), '', PossibleResponses, fsourOverwrite, fsourSkip) of fsourOverwrite: Result := fsoofeOverwrite; fsourSkip: Result := fsoofeSkip; fsourAppend: begin //FFileExistsOption := fsoofeAppend; - for AppendAll Result := fsoofeAppend; end; fsourOverwriteAll: begin FFileExistsOption := fsoofeOverwrite; Result := fsoofeOverwrite; end; fsourSkipAll: begin FFileExistsOption := fsoofeSkip; Result := fsoofeSkip; end; end; end; else Result := FFileExistsOption; end; end; constructor TWfxPluginOperationHelper.Create(FileSource: IFileSource; AskQuestionFunction: TAskQuestionFunction; AbortOperationFunction: TAbortOperationFunction; CheckOperationStateFunction: TCheckOperationStateFunction; UpdateStatisticsFunction: TUpdateStatisticsFunction; OperationThread: TThread; Mode: TWfxPluginOperationHelperMode; TargetPath: String ); begin FWfxPluginFileSource:= FileSource as IWfxPluginFileSource; AskQuestion := AskQuestionFunction; AbortOperation := AbortOperationFunction; CheckOperationState := CheckOperationStateFunction; UpdateStatistics := UpdateStatisticsFunction; FOperationThread:= OperationThread; FMode := Mode; FInternal:= (FMode in [wpohmCopy, wpohmMove]); FFileExistsOption := fsoofeNone; FRootTargetPath := TargetPath; FRenameMask := ''; FRenamingFiles := False; FRenamingRootDir := False; inherited Create; end; destructor TWfxPluginOperationHelper.Destroy; begin inherited Destroy; end; procedure TWfxPluginOperationHelper.Initialize; begin case FMode of wpohmCopy, wpohmCopyIn, wpohmCopyOut: FLogCaption := rsMsgLogCopy; wpohmMove: FLogCaption := rsMsgLogMove; end; SplitFileMask(FRenameMask, FRenameNameMask, FRenameExtMask); end; procedure TWfxPluginOperationHelper.ProcessFiles(aFiles: TFiles; var Statistics: TFileSourceCopyOperationStatistics); var I: Integer; iResult: LongInt; sTargetFile : UTF8String; aFile: TFile; begin FRenamingFiles := (FRenameMask <> '*.*') and (FRenameMask <> ''); // If there is a single root dir and rename mask doesn't have wildcards // treat is as a rename of the root dir. if (aFiles.Count = 1) and FRenamingFiles then begin aFile := aFiles[0]; if (aFile.IsDirectory or aFile.IsLinkToDirectory) and not ContainsWildcards(FRenameMask) then begin FRenamingFiles := False; FRenamingRootDir := True; end; end; for I:= 0 to aFiles.Count - 1 do with FWfxPluginFileSource do begin aFile:= aFiles.Items[I]; // Filenames must be relative to the current directory. sTargetFile := FRootTargetPath + ExtractDirLevel(aFiles.Path, aFile.Path); if FRenamingRootDir then sTargetFile := sTargetFile + FRenameMask else sTargetFile := sTargetFile + ApplyRenameMask(aFile, FRenameNameMask, FRenameExtMask); //DCDebug('Source name == ' + aFile.FullPath); //DCDebug('Target name == ' + sTargetFile); with Statistics do begin CurrentFileFrom := aFile.Path + aFile.Name; CurrentFileTo := sTargetFile; CurrentFileTotalBytes := (aFile.Properties[fpSize] as TFileSizeProperty).Value; CurrentFileDoneBytes := 0; end; UpdateStatistics(Statistics); if not aFile.IsDirectory then iResult := ProcessFile(aFile, sTargetFile, Statistics) else iResult := ProcessDirectory(aFile, sTargetFile); if iResult = FS_FILE_OK then begin LogMessage(Format(rsMsgLogSuccess+FLogCaption, [aFile.FullPath + ' -> ' + sTargetFile]), [log_vfs_op], lmtSuccess); end else begin ShowError(Format(rsMsgLogError + FLogCaption, [aFile.FullPath + ' -> ' + sTargetFile + ' - ' + GetErrorMsg(iResult)])); LogMessage(Format(rsMsgLogError+FLogCaption, [aFile.FullPath + ' -> ' + sTargetFile]), [log_vfs_op], lmtError); end; CheckOperationState; end; end; end. doublecmd-0.5.8/src/filesources/wfxplugin/uwfxplugincopyoperation.pas0000644000175000017500000001147211747211345025406 0ustar alexxalexxunit uWfxPluginCopyOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceCopyOperation, uFileSource, uFileSourceOperation, uFileSourceOperationOptions, uFileSourceOperationOptionsUI, uFile, uWfxPluginFileSource, uWfxPluginUtil; type { TWfxPluginCopyOperation } TWfxPluginCopyOperation = class(TFileSourceCopyOperation) private FWfxPluginFileSource: IWfxPluginFileSource; FOperationHelper: TWfxPluginOperationHelper; FCallbackDataClass: TCallbackDataClass; FFullFilesTreeToCopy: TFiles; // source files including all files/dirs in subdirectories FStatistics: TFileSourceCopyOperationStatistics; // local copy of statistics // Options FInfoOperation: LongInt; FFileExistsOption: TFileSourceOperationOptionFileExists; protected function UpdateProgress(SourceName, TargetName: UTF8String; PercentDone: Integer): Integer; public constructor Create(aSourceFileSource: IFileSource; aTargetFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; class function GetOptionsUIClass: TFileSourceOperationOptionsUIClass; override; property FileExistsOption: TFileSourceOperationOptionFileExists read FFileExistsOption write FFileExistsOption; end; implementation uses fWfxPluginCopyMoveOperationOptions, WfxPlugin; // -- TWfxPluginCopyOperation --------------------------------------------- function TWfxPluginCopyOperation.UpdateProgress(SourceName, TargetName: UTF8String; PercentDone: Integer): Integer; var iTemp: Int64; begin Result := 0; //DCDebug('SourceName=', SourceName, #32, 'TargetName=', TargetName, #32, 'PercentDone=', IntToStr(PercentDone)); if State = fsosStopping then // Cancel operation Exit(1); with FStatistics do begin FStatistics.CurrentFileFrom:= SourceName; FStatistics.CurrentFileTo:= TargetName; iTemp:= CurrentFileTotalBytes * PercentDone div 100; DoneBytes := DoneBytes + (iTemp - CurrentFileDoneBytes); CurrentFileDoneBytes:= iTemp; UpdateStatistics(FStatistics); end; CheckOperationState; end; constructor TWfxPluginCopyOperation.Create(aSourceFileSource: IFileSource; aTargetFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); begin FWfxPluginFileSource:= aSourceFileSource as IWfxPluginFileSource; with FWfxPluginFileSource do FCallbackDataClass:= TCallbackDataClass(WfxOperationList.Objects[PluginNumber]); if theSourceFiles.Count > 1 then FInfoOperation:= FS_STATUS_OP_RENMOV_MULTI else FInfoOperation:= FS_STATUS_OP_RENMOV_SINGLE; inherited Create(aSourceFileSource, aTargetFileSource, theSourceFiles, aTargetPath); end; destructor TWfxPluginCopyOperation.Destroy; begin inherited Destroy; end; procedure TWfxPluginCopyOperation.Initialize; begin with FWfxPluginFileSource do begin WfxModule.WfxStatusInfo(SourceFiles.Path, FS_STATUS_START, FInfoOperation); FCallbackDataClass.UpdateProgressFunction:= @UpdateProgress; UpdateProgressFunction:= @UpdateProgress; // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; FillAndCount(SourceFiles, False, False, FFullFilesTreeToCopy, FStatistics.TotalFiles, FStatistics.TotalBytes); // gets full list of files (recursive) end; if Assigned(FOperationHelper) then FreeAndNil(FOperationHelper); FOperationHelper := TWfxPluginOperationHelper.Create( FWfxPluginFileSource, @AskQuestion, @RaiseAbortOperation, @CheckOperationState, @UpdateStatistics, Thread, wpohmCopy, TargetPath); FOperationHelper.RenameMask := RenameMask; FOperationHelper.FileExistsOption := FileExistsOption; FOperationHelper.Initialize; end; procedure TWfxPluginCopyOperation.MainExecute; begin FOperationHelper.ProcessFiles(FFullFilesTreeToCopy, FStatistics); end; procedure TWfxPluginCopyOperation.Finalize; begin with FWfxPluginFileSource do begin WfxModule.WfxStatusInfo(SourceFiles.Path, FS_STATUS_END, FInfoOperation); FCallbackDataClass.UpdateProgressFunction:= nil; UpdateProgressFunction:= nil; end; end; class function TWfxPluginCopyOperation.GetOptionsUIClass: TFileSourceOperationOptionsUIClass; begin Result := TWfxPluginCopyOperationOptionsUI; end; end. doublecmd-0.5.8/src/filesources/wfxplugin/fwfxplugincopymoveoperationoptions.lfm0000644000175000017500000000342111747211345027660 0ustar alexxalexxinherited WfxPluginCopyMoveOperationOptionsUI: TWfxPluginCopyMoveOperationOptionsUI Height = 158 Width = 549 AutoSize = True BorderSpacing.Around = 6 ClientHeight = 158 ClientWidth = 549 TabOrder = 0 DesignLeft = 535 DesignTop = 391 object pnlComboBoxes: TPanel[0] AnchorSideLeft.Control = Owner Left = 0 Height = 21 Top = 0 Width = 182 AutoSize = True BevelOuter = bvNone ChildSizing.HorizontalSpacing = 5 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 ClientHeight = 21 ClientWidth = 182 TabOrder = 0 object lblFileExists: TLabel Left = 0 Height = 14 Top = 3 Width = 77 BorderSpacing.CellAlignVertical = ccaCenter Caption = 'When file exists' FocusControl = cmbFileExists ParentColor = False end object cmbFileExists: TComboBox Left = 82 Height = 21 Top = 0 Width = 100 ItemHeight = 13 Items.Strings = ( 'Ask' 'Overwrite' 'Skip' ) Style = csDropDownList TabOrder = 0 end end object pnlCheckboxes: TPanel[1] AnchorSideLeft.Control = pnlComboBoxes AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlComboBoxes Left = 190 Height = 17 Top = 0 Width = 224 AutoSize = True BorderSpacing.Left = 8 BevelOuter = bvNone BevelWidth = 8 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 17 ClientWidth = 224 TabOrder = 1 object cbWorkInBackground: TCheckBox Left = 0 Height = 17 Top = 0 Width = 224 Caption = 'Work in background (separate connection)' TabOrder = 0 Visible = False end end end doublecmd-0.5.8/src/filesources/wfxplugin/fwfxplugincopymoveoperationoptions.pas0000644000175000017500000001272711747211345027676 0ustar alexxalexxunit fWfxPluginCopyMoveOperationOptions; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, StdCtrls, ExtCtrls, uFileSourceOperationOptionsUI, uWfxPluginCopyOperation, uWfxPluginMoveOperation, uWfxPluginCopyInOperation, uWfxPluginCopyOutOperation; type { TWfxPluginCopyMoveOperationOptionsUI } TWfxPluginCopyMoveOperationOptionsUI = class(TFileSourceOperationOptionsUI) cbWorkInBackground: TCheckBox; cmbFileExists: TComboBox; grpOptions: TGroupBox; lblFileExists: TLabel; pnlCheckboxes: TPanel; pnlComboBoxes: TPanel; private procedure SetOperationOptions(CopyOperation: TWfxPluginCopyOperation); overload; procedure SetOperationOptions(MoveOperation: TWfxPluginMoveOperation); overload; procedure SetOperationOptions(CopyInOperation: TWfxPluginCopyInOperation); overload; procedure SetOperationOptions(CopyOutOperation: TWfxPluginCopyOutOperation); overload; public constructor Create(AOwner: TComponent; AFileSource: IInterface); override; procedure SaveOptions; override; procedure SetOperationOptions(Operation: TObject); override; end; TWfxPluginCopyOperationOptionsUI = class(TWfxPluginCopyMoveOperationOptionsUI) end; TWfxPluginMoveOperationOptionsUI = class(TWfxPluginCopyMoveOperationOptionsUI) end; { TWfxPluginCopyInOperationOptionsUI } TWfxPluginCopyInOperationOptionsUI = class(TWfxPluginCopyMoveOperationOptionsUI) public constructor Create(AOwner: TComponent; AFileSource: IInterface); override; end; { TWfxPluginCopyOutOperationOptionsUI } TWfxPluginCopyOutOperationOptionsUI = class(TWfxPluginCopyMoveOperationOptionsUI) public constructor Create(AOwner: TComponent; AFileSource: IInterface); override; end; implementation {$R *.lfm} uses WfxPlugin, uGlobs, uWfxPluginFileSource, uFileSourceOperationOptions; { TWfxPluginCopyMoveOperationOptionsUI } constructor TWfxPluginCopyMoveOperationOptionsUI.Create(AOwner: TComponent; AFileSource: IInterface); begin inherited Create(AOwner, AFileSource); // Load default options. case gOperationOptionFileExists of fsoofeNone : cmbFileExists.ItemIndex := 0; fsoofeOverwrite: cmbFileExists.ItemIndex := 1; fsoofeSkip : cmbFileExists.ItemIndex := 2; end; end; procedure TWfxPluginCopyMoveOperationOptionsUI.SaveOptions; begin // TODO: Saving options for each file source operation separately. end; procedure TWfxPluginCopyMoveOperationOptionsUI.SetOperationOptions(Operation: TObject); begin if Operation is TWfxPluginCopyOperation then SetOperationOptions(Operation as TWfxPluginCopyOperation) else if Operation is TWfxPluginMoveOperation then SetOperationOptions(Operation as TWfxPluginMoveOperation) else if Operation is TWfxPluginCopyInOperation then SetOperationOptions(Operation as TWfxPluginCopyInOperation) else if Operation is TWfxPluginCopyOutOperation then SetOperationOptions(Operation as TWfxPluginCopyOutOperation); end; procedure TWfxPluginCopyMoveOperationOptionsUI.SetOperationOptions(CopyOperation: TWfxPluginCopyOperation); begin with CopyOperation do begin case cmbFileExists.ItemIndex of 0: FileExistsOption := fsoofeNone; 1: FileExistsOption := fsoofeOverwrite; 2: FileExistsOption := fsoofeSkip; end; end; end; procedure TWfxPluginCopyMoveOperationOptionsUI.SetOperationOptions(MoveOperation: TWfxPluginMoveOperation); begin with MoveOperation do begin case cmbFileExists.ItemIndex of 0: FileExistsOption := fsoofeNone; 1: FileExistsOption := fsoofeOverwrite; 2: FileExistsOption := fsoofeSkip; end; end; end; procedure TWfxPluginCopyMoveOperationOptionsUI.SetOperationOptions(CopyInOperation: TWfxPluginCopyInOperation); begin with CopyInOperation do begin NeedsConnection:= not cbWorkInBackground.Checked; case cmbFileExists.ItemIndex of 0: FileExistsOption := fsoofeNone; 1: FileExistsOption := fsoofeOverwrite; 2: FileExistsOption := fsoofeSkip; end; end; end; procedure TWfxPluginCopyMoveOperationOptionsUI.SetOperationOptions(CopyOutOperation: TWfxPluginCopyOutOperation); begin with CopyOutOperation do begin NeedsConnection:= not cbWorkInBackground.Checked; case cmbFileExists.ItemIndex of 0: FileExistsOption := fsoofeNone; 1: FileExistsOption := fsoofeOverwrite; 2: FileExistsOption := fsoofeSkip; end; end; end; { TWfxPluginCopyInOperationOptionsUI } constructor TWfxPluginCopyInOperationOptionsUI.Create(AOwner: TComponent; AFileSource: IInterface); const CAN_UPLOAD = BG_UPLOAD or BG_ASK_USER; begin inherited Create(AOwner, AFileSource); with (AFileSource as IWfxPluginFileSource) do begin cbWorkInBackground.Visible:= (WfxModule.BackgroundFlags and CAN_UPLOAD <> 0); if cbWorkInBackground.Visible then cbWorkInBackground.Checked:= False else cbWorkInBackground.Checked:= (WfxModule.BackgroundFlags and BG_UPLOAD <> 0); end; end; { TWfxPluginCopyOutOperationOptionsUI } constructor TWfxPluginCopyOutOperationOptionsUI.Create(AOwner: TComponent; AFileSource: IInterface); const CAN_DOWNLOAD = BG_DOWNLOAD or BG_ASK_USER; begin inherited Create(AOwner, AFileSource); with (AFileSource as IWfxPluginFileSource) do begin cbWorkInBackground.Visible:= (WfxModule.BackgroundFlags and CAN_DOWNLOAD <> 0); if cbWorkInBackground.Visible then cbWorkInBackground.Checked:= False else cbWorkInBackground.Checked:= (WfxModule.BackgroundFlags and BG_DOWNLOAD <> 0); end; end; end. doublecmd-0.5.8/src/filesources/wfxplugin/uwfxplugincopyinoperation.pas0000644000175000017500000001200111747211345025722 0ustar alexxalexxunit uWfxPluginCopyInOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceCopyOperation, uFileSource, uFileSourceOperation, uFileSourceOperationOptions, uFileSourceOperationOptionsUI, uFile, uWfxPluginFileSource, uWfxPluginUtil; type { TWfxPluginCopyInOperation } TWfxPluginCopyInOperation = class(TFileSourceCopyInOperation) private FWfxPluginFileSource: IWfxPluginFileSource; FOperationHelper: TWfxPluginOperationHelper; FCallbackDataClass: TCallbackDataClass; FFullFilesTreeToCopy: TFiles; // source files including all files/dirs in subdirectories FStatistics: TFileSourceCopyOperationStatistics; // local copy of statistics // Options FInfoOperation: LongInt; FFileExistsOption: TFileSourceOperationOptionFileExists; protected function UpdateProgress(SourceName, TargetName: UTF8String; PercentDone: Integer): Integer; public constructor Create(aSourceFileSource: IFileSource; aTargetFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; class function GetOptionsUIClass: TFileSourceOperationOptionsUIClass; override; property FileExistsOption: TFileSourceOperationOptionFileExists read FFileExistsOption write FFileExistsOption; property NeedsConnection: Boolean read FNeedsConnection write FNeedsConnection; end; implementation uses fWfxPluginCopyMoveOperationOptions, WfxPlugin, uFileSystemUtil; // -- TWfxPluginCopyInOperation --------------------------------------------- function TWfxPluginCopyInOperation.UpdateProgress(SourceName,TargetName: UTF8String; PercentDone: Integer): Integer; var iTemp: Int64; begin Result := 0; //DCDebug('SourceName=', SourceName, #32, 'TargetName=', TargetName, #32, 'PercentDone=', IntToStr(PercentDone)); if State = fsosStopping then // Cancel operation Exit(1); with FStatistics do begin FStatistics.CurrentFileFrom:= SourceName; FStatistics.CurrentFileTo:= TargetName; iTemp:= CurrentFileTotalBytes * PercentDone div 100; DoneBytes := DoneBytes + (iTemp - CurrentFileDoneBytes); CurrentFileDoneBytes:= iTemp; UpdateStatistics(FStatistics); end; CheckOperationState; end; constructor TWfxPluginCopyInOperation.Create(aSourceFileSource: IFileSource; aTargetFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); begin FWfxPluginFileSource:= aTargetFileSource as IWfxPluginFileSource; with FWfxPluginFileSource do FCallbackDataClass:= TCallbackDataClass(WfxOperationList.Objects[PluginNumber]); inherited Create(aSourceFileSource, aTargetFileSource, theSourceFiles, aTargetPath); if (FNeedsConnection = False) then FInfoOperation:= FS_STATUS_OP_PUT_MULTI_THREAD else if (SourceFiles.Count > 1) then FInfoOperation:= FS_STATUS_OP_PUT_MULTI else FInfoOperation:= FS_STATUS_OP_PUT_SINGLE; end; destructor TWfxPluginCopyInOperation.Destroy; begin inherited Destroy; end; procedure TWfxPluginCopyInOperation.Initialize; begin with FWfxPluginFileSource do begin WfxModule.WfxStatusInfo(SourceFiles.Path, FS_STATUS_START, FInfoOperation); FCallbackDataClass.UpdateProgressFunction:= @UpdateProgress; UpdateProgressFunction:= @UpdateProgress; end; // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; FillAndCount(SourceFiles, False, False, FFullFilesTreeToCopy, FStatistics.TotalFiles, FStatistics.TotalBytes); // gets full list of files (recursive) if Assigned(FOperationHelper) then FreeAndNil(FOperationHelper); FOperationHelper := TWfxPluginOperationHelper.Create( FWfxPluginFileSource, @AskQuestion, @RaiseAbortOperation, @CheckOperationState, @UpdateStatistics, Thread, wpohmCopyIn, TargetPath); FOperationHelper.RenameMask := RenameMask; FOperationHelper.FileExistsOption := FileExistsOption; FOperationHelper.Initialize; end; procedure TWfxPluginCopyInOperation.MainExecute; begin FOperationHelper.ProcessFiles(FFullFilesTreeToCopy, FStatistics); end; procedure TWfxPluginCopyInOperation.Finalize; begin with FWfxPluginFileSource do begin WfxModule.WfxStatusInfo(SourceFiles.Path, FS_STATUS_END, FInfoOperation); FCallbackDataClass.UpdateProgressFunction:= nil; UpdateProgressFunction:= nil; end; end; class function TWfxPluginCopyInOperation.GetOptionsUIClass: TFileSourceOperationOptionsUIClass; begin Result := TWfxPluginCopyInOperationOptionsUI; end; end. doublecmd-0.5.8/src/filesources/wfxplugin/uwfxpluginexecuteoperation.pas0000644000175000017500000000432111747211345026071 0ustar alexxalexxunit uWfxPluginExecuteOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFile, uFileSource, uFileSourceExecuteOperation, uWfxPluginFileSource; type { TWfxPluginExecuteOperation } TWfxPluginExecuteOperation = class(TFileSourceExecuteOperation) private FWfxPluginFileSource: IWfxPluginFileSource; public {en @param(aTargetFileSource File source where the file should be executed.) @param(aExecutableFile File that should be executed.) @param(aCurrentPath Path of the file source where the execution should take place.) } constructor Create(aTargetFileSource: IFileSource; var aExecutableFile: TFile; aCurrentPath, aVerb: UTF8String); override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; end; implementation uses WfxPlugin; constructor TWfxPluginExecuteOperation.Create( aTargetFileSource: IFileSource; var aExecutableFile: TFile; aCurrentPath, aVerb: UTF8String); begin FWfxPluginFileSource := aTargetFileSource as IWfxPluginFileSource; inherited Create(aTargetFileSource, aExecutableFile, aCurrentPath, aVerb); end; procedure TWfxPluginExecuteOperation.Initialize; begin with FWfxPluginFileSource do WfxModule.WfxStatusInfo(CurrentPath, FS_STATUS_START, FS_STATUS_OP_EXEC); end; procedure TWfxPluginExecuteOperation.MainExecute; var RemoteName: UTF8String; iResult: LongInt; begin RemoteName:= AbsolutePath; iResult:= FWfxPluginFileSource.WfxModule.WfxExecuteFile(0, RemoteName, Verb); case iResult of FS_EXEC_OK: FExecuteOperationResult:= fseorSuccess; FS_EXEC_ERROR: FExecuteOperationResult:= fseorError; FS_EXEC_YOURSELF: FExecuteOperationResult:= fseorYourSelf; FS_EXEC_SYMLINK: begin FResultString:= RemoteName; FExecuteOperationResult:= fseorSymLink; end; end; end; procedure TWfxPluginExecuteOperation.Finalize; begin with FWfxPluginFileSource do WfxModule.WfxStatusInfo(CurrentPath, FS_STATUS_END, FS_STATUS_OP_EXEC); end; end. doublecmd-0.5.8/src/filesources/wfxplugin/uwfxpluginmoveoperation.pas0000644000175000017500000001120111747211345025370 0ustar alexxalexxunit uWfxPluginMoveOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceMoveOperation, uFileSource, uFileSourceOperation, uFileSourceOperationOptions, uFileSourceOperationOptionsUI, uFile, uWfxPluginFileSource, uWfxPluginUtil; type { TWfxPluginMoveOperation } TWfxPluginMoveOperation = class(TFileSourceMoveOperation) private FWfxPluginFileSource: IWfxPluginFileSource; FOperationHelper: TWfxPluginOperationHelper; FCallbackDataClass: TCallbackDataClass; FFullFilesTreeToCopy: TFiles; // source files including all files/dirs in subdirectories FStatistics: TFileSourceMoveOperationStatistics; // local copy of statistics // Options FInfoOperation: LongInt; FFileExistsOption: TFileSourceOperationOptionFileExists; protected function UpdateProgress(SourceName, TargetName: UTF8String; PercentDone: Integer): Integer; public constructor Create(aFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; class function GetOptionsUIClass: TFileSourceOperationOptionsUIClass; override; property FileExistsOption: TFileSourceOperationOptionFileExists read FFileExistsOption write FFileExistsOption; end; implementation uses fWfxPluginCopyMoveOperationOptions, WfxPlugin; // -- TWfxPluginMoveOperation --------------------------------------------- function TWfxPluginMoveOperation.UpdateProgress(SourceName, TargetName: UTF8String; PercentDone: Integer): Integer; var iTemp: Int64; begin Result := 0; //DCDebug('SourceName=', SourceName, #32, 'TargetName=', TargetName, #32, 'PercentDone=', IntToStr(PercentDone)); if State = fsosStopping then // Cancel operation Exit(1); with FStatistics do begin FStatistics.CurrentFileFrom:= SourceName; FStatistics.CurrentFileTo:= TargetName; iTemp:= CurrentFileTotalBytes * PercentDone div 100; DoneBytes := DoneBytes + (iTemp - CurrentFileDoneBytes); CurrentFileDoneBytes:= iTemp; UpdateStatistics(FStatistics); end; CheckOperationState; end; constructor TWfxPluginMoveOperation.Create(aFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); begin FWfxPluginFileSource:= aFileSource as IWfxPluginFileSource; with FWfxPluginFileSource do FCallbackDataClass:= TCallbackDataClass(WfxOperationList.Objects[PluginNumber]); if theSourceFiles.Count > 1 then FInfoOperation:= FS_STATUS_OP_RENMOV_MULTI else FInfoOperation:= FS_STATUS_OP_RENMOV_SINGLE; inherited Create(aFileSource, theSourceFiles, aTargetPath); end; destructor TWfxPluginMoveOperation.Destroy; begin inherited Destroy; end; procedure TWfxPluginMoveOperation.Initialize; begin with FWfxPluginFileSource do begin WfxModule.WfxStatusInfo(SourceFiles.Path, FS_STATUS_START, FInfoOperation); FCallbackDataClass.UpdateProgressFunction:= @UpdateProgress; UpdateProgressFunction:= @UpdateProgress; // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; FillAndCount(SourceFiles, False, False, FFullFilesTreeToCopy, FStatistics.TotalFiles, FStatistics.TotalBytes); // gets full list of files (recursive) end; if Assigned(FOperationHelper) then FreeAndNil(FOperationHelper); FOperationHelper := TWfxPluginOperationHelper.Create( FWfxPluginFileSource, @AskQuestion, @RaiseAbortOperation, @CheckOperationState, @UpdateStatistics, Thread, wpohmMove, TargetPath); FOperationHelper.RenameMask := RenameMask; FOperationHelper.FileExistsOption := FileExistsOption; FOperationHelper.Initialize; end; procedure TWfxPluginMoveOperation.MainExecute; begin FOperationHelper.ProcessFiles(FFullFilesTreeToCopy, FStatistics); end; procedure TWfxPluginMoveOperation.Finalize; begin with FWfxPluginFileSource do begin WfxModule.WfxStatusInfo(SourceFiles.Path, FS_STATUS_END, FInfoOperation); FCallbackDataClass.UpdateProgressFunction:= nil; UpdateProgressFunction:= nil; end; end; class function TWfxPluginMoveOperation.GetOptionsUIClass: TFileSourceOperationOptionsUIClass; begin Result := TWfxPluginMoveOperationOptionsUI; end; end. doublecmd-0.5.8/src/filesources/wfxplugin/fwfxplugincopymoveoperationoptions.lrt0000644000175000017500000000026511747211345027706 0ustar alexxalexxTWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION=When file exists TWFXPLUGINCOPYMOVEOPERATIONOPTIONSUI.CBWORKINBACKGROUND.CAPTION=Work in background (separate connection) doublecmd-0.5.8/src/filesources/wfxplugin/uwfxplugincreatedirectoryoperation.pas0000644000175000017500000000357611747211345027632 0ustar alexxalexxunit uWfxPluginCreateDirectoryOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceCreateDirectoryOperation, uFileSource, uWfxPluginFileSource; type TWfxPluginCreateDirectoryOperation = class(TFileSourceCreateDirectoryOperation) private FWfxPluginFileSource: IWfxPluginFileSource; public constructor Create(aTargetFileSource: IFileSource; aCurrentPath: String; aDirectoryPath: String); override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; end; implementation uses uFileSourceOperationUI, uLog, uLng, uGlobs, uWfxModule; constructor TWfxPluginCreateDirectoryOperation.Create( aTargetFileSource: IFileSource; aCurrentPath: String; aDirectoryPath: String); begin FWfxPluginFileSource := aTargetFileSource as IWfxPluginFileSource; inherited Create(aTargetFileSource, aCurrentPath, aDirectoryPath); end; procedure TWfxPluginCreateDirectoryOperation.Initialize; begin end; procedure TWfxPluginCreateDirectoryOperation.MainExecute; begin with FWfxPluginFileSource do begin case WfxModule.WfxMkDir(BasePath, AbsolutePath) of WFX_NOTSUPPORTED: AskQuestion(rsMsgErrNotSupported, '', [fsourOk], fsourOk, fsourOk); WFX_SUCCESS: begin // write log success if (log_vfs_op in gLogOptions) and (log_success in gLogOptions) then logWrite(Thread, Format(rsMsgLogSuccess+rsMsgLogMkDir, [AbsolutePath]), lmtSuccess) end; else begin // write log error if (log_vfs_op in gLogOptions) and (log_errors in gLogOptions) then logWrite(Thread, Format(rsMsgLogError+rsMsgLogMkDir, [AbsolutePath]), lmtError); end; end; // case end; // with end; procedure TWfxPluginCreateDirectoryOperation.Finalize; begin end; end. doublecmd-0.5.8/src/filesources/wfxplugin/uwfxplugincopyoutoperation.pas0000644000175000017500000001201611747211345026131 0ustar alexxalexxunit uWfxPluginCopyOutOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceCopyOperation, uFileSource, uFileSourceOperation, uFileSourceOperationOptions, uFileSourceOperationOptionsUI, uFile, uWfxPluginFileSource, uWfxPluginUtil; type { TWfxPluginCopyOutOperation } TWfxPluginCopyOutOperation = class(TFileSourceCopyOutOperation) private FWfxPluginFileSource: IWfxPluginFileSource; FOperationHelper: TWfxPluginOperationHelper; FCallbackDataClass: TCallbackDataClass; FFullFilesTreeToCopy: TFiles; // source files including all files/dirs in subdirectories FStatistics: TFileSourceCopyOperationStatistics; // local copy of statistics // Options FInfoOperation: LongInt; FFileExistsOption: TFileSourceOperationOptionFileExists; protected function UpdateProgress(SourceName, TargetName: UTF8String; PercentDone: Integer): Integer; public constructor Create(aSourceFileSource: IFileSource; aTargetFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; class function GetOptionsUIClass: TFileSourceOperationOptionsUIClass; override; property FileExistsOption: TFileSourceOperationOptionFileExists read FFileExistsOption write FFileExistsOption; property NeedsConnection: Boolean read FNeedsConnection write FNeedsConnection; end; implementation uses fWfxPluginCopyMoveOperationOptions, WfxPlugin; // -- TWfxPluginCopyOutOperation --------------------------------------------- function TWfxPluginCopyOutOperation.UpdateProgress(SourceName, TargetName: UTF8String; PercentDone: Integer): Integer; var iTemp: Int64; begin Result := 0; //DCDebug('SourceName=', SourceName, #32, 'TargetName=', TargetName, #32, 'PercentDone=', IntToStr(PercentDone)); if State = fsosStopping then // Cancel operation Exit(1); with FStatistics do begin FStatistics.CurrentFileFrom:= SourceName; FStatistics.CurrentFileTo:= TargetName; iTemp:= CurrentFileTotalBytes * PercentDone div 100; DoneBytes := DoneBytes + (iTemp - CurrentFileDoneBytes); CurrentFileDoneBytes:= iTemp; UpdateStatistics(FStatistics); end; CheckOperationState; end; constructor TWfxPluginCopyOutOperation.Create(aSourceFileSource: IFileSource; aTargetFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); begin FWfxPluginFileSource:= aSourceFileSource as IWfxPluginFileSource; with FWfxPluginFileSource do FCallbackDataClass:= TCallbackDataClass(WfxOperationList.Objects[PluginNumber]); inherited Create(aSourceFileSource, aTargetFileSource, theSourceFiles, aTargetPath); if (FNeedsConnection = False) then FInfoOperation:= FS_STATUS_OP_GET_MULTI_THREAD else if (SourceFiles.Count > 1) then FInfoOperation:= FS_STATUS_OP_GET_MULTI else FInfoOperation:= FS_STATUS_OP_GET_SINGLE; end; destructor TWfxPluginCopyOutOperation.Destroy; begin inherited Destroy; end; procedure TWfxPluginCopyOutOperation.Initialize; begin with FWfxPluginFileSource do begin WfxModule.WfxStatusInfo(SourceFiles.Path, FS_STATUS_START, FInfoOperation); FCallbackDataClass.UpdateProgressFunction:= @UpdateProgress; UpdateProgressFunction:= @UpdateProgress; // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; FillAndCount(SourceFiles, False, False, FFullFilesTreeToCopy, FStatistics.TotalFiles, FStatistics.TotalBytes); // gets full list of files (recursive) end; if Assigned(FOperationHelper) then FreeAndNil(FOperationHelper); FOperationHelper := TWfxPluginOperationHelper.Create( FWfxPluginFileSource, @AskQuestion, @RaiseAbortOperation, @CheckOperationState, @UpdateStatistics, Thread, wpohmCopyOut, TargetPath); FOperationHelper.RenameMask := RenameMask; FOperationHelper.FileExistsOption := FileExistsOption; FOperationHelper.Initialize; end; procedure TWfxPluginCopyOutOperation.MainExecute; begin FOperationHelper.ProcessFiles(FFullFilesTreeToCopy, FStatistics); end; procedure TWfxPluginCopyOutOperation.Finalize; begin with FWfxPluginFileSource do begin WfxModule.WfxStatusInfo(SourceFiles.Path, FS_STATUS_END, FInfoOperation); FCallbackDataClass.UpdateProgressFunction:= nil; UpdateProgressFunction:= nil; end; end; class function TWfxPluginCopyOutOperation.GetOptionsUIClass: TFileSourceOperationOptionsUIClass; begin Result := TWfxPluginCopyOutOperationOptionsUI; end; end. doublecmd-0.5.8/src/filesources/uoperationthread.pas0000644000175000017500000000211711747211345021710 0ustar alexxalexxunit uOperationThread; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceOperation; type {en Thread executing a file source operation. } TOperationThread = class(TThread) private FOperation: TFileSourceOperation; protected procedure Execute; override; public {en Creates a new thread for executing an operation. @param(CreateSuspended if @true the thread is not immediately started on creation.) @param(Operation is the file source operation that will be executed.) } constructor Create(CreateSuspended: Boolean; Operation: TFileSourceOperation); reintroduce; end; implementation uses uDebug, uExceptions; constructor TOperationThread.Create(CreateSuspended: Boolean; Operation: TFileSourceOperation); begin FreeOnTerminate := True; FOperation := Operation; FOperation.AssignThread(Self); inherited Create(CreateSuspended, DefaultStackSize); end; procedure TOperationThread.Execute; begin try FOperation.Execute; except on e: Exception do HandleException(e, Self); end; end; end. doublecmd-0.5.8/src/filesources/ufilesourcecreatedirectoryoperation.pas0000644000175000017500000000565511747211345025724 0ustar alexxalexxunit uFileSourceCreateDirectoryOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceOperation, uFileSourceOperationTypes, uFileSource; type { TFileSourceCreateDirectoryOperation } TFileSourceCreateDirectoryOperation = class(TFileSourceOperation) private FFileSource: IFileSource; FBasePath: String; FDirectoryPath: String; FAbsolutePath: String; FRelativePath: String; protected function GetID: TFileSourceOperationType; override; procedure UpdateStatisticsAtStartTime; override; procedure DoReloadFileSources; override; property BasePath: String read FBasePath; property DirectoryPath: String read FDirectoryPath; property AbsolutePath: String read FAbsolutePath; property RelativePath: String read FRelativePath; public {en @param(aTargetFileSource File source where the directory should be created.) @param(aCurrentPath Absolute path to current directory where the new directory should be created (if its path is not absolute).) @param(aDirectoryPath Absolute or relative (to TargetFileSource.CurrentPath) path to a directory that should be created.) } constructor Create(aTargetFileSource: IFileSource; aCurrentPath: String; aDirectoryPath: String); virtual reintroduce; destructor Destroy; override; function GetDescription(Details: TFileSourceOperationDescriptionDetails): String; override; end; implementation uses DCStrUtils, uLng; constructor TFileSourceCreateDirectoryOperation.Create( aTargetFileSource: IFileSource; aCurrentPath: String; aDirectoryPath: String); begin inherited Create(aTargetFileSource); FFileSource := aTargetFileSource; FBasePath := aCurrentPath; FDirectoryPath := aDirectoryPath; if FFileSource.GetPathType(FDirectoryPath) = ptAbsolute then begin FAbsolutePath := FDirectoryPath; FRelativePath := ExtractDirLevel(aCurrentPath, FDirectoryPath); end else begin FAbsolutePath := aCurrentPath + FDirectoryPath; FRelativePath := FDirectoryPath; end; end; destructor TFileSourceCreateDirectoryOperation.Destroy; begin inherited Destroy; end; procedure TFileSourceCreateDirectoryOperation.UpdateStatisticsAtStartTime; begin // empty end; function TFileSourceCreateDirectoryOperation.GetID: TFileSourceOperationType; begin Result := fsoCreateDirectory; end; procedure TFileSourceCreateDirectoryOperation.DoReloadFileSources; begin FFileSource.Reload(FFileSource.GetParentDir(FAbsolutePath)); end; function TFileSourceCreateDirectoryOperation.GetDescription(Details: TFileSourceOperationDescriptionDetails): String; begin case Details of fsoddJobAndTarget: Result := Format(rsOperCreatingSomeDirectory, [AbsolutePath]); else Result := rsOperCreatingDirectory; end; end; end. doublecmd-0.5.8/src/filesources/ufilesourcesetfilepropertyoperation.pas0000644000175000017500000002537711747211345025777 0ustar alexxalexxunit uFileSourceSetFilePropertyOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, syncobjs, uFileSourceOperation, uFileSourceOperationTypes, uFileSource, uFile, uFileProperty; type TSetFilePropertyResult = (sfprSuccess, sfprError, sfprSkipped); TFileSourceSetFilePropertyOperationStatistics = record CurrentFile: String; TotalFiles: Int64; DoneFiles: Int64; FilesPerSecond: Int64; RemainingTime: TDateTime; end; {en Operation that can set any of the file properties supported by a file source. It doesn't have to support all the file properties supported by the file source, it can be a subset. There are two methods of setting properties available: - NewProperties Set via constructor, this is a list of properties that should be set for each file. If a property in this list is not assigned it is not set. If a property in this list is not supported by the file source or by this operation it is also not set. - TemplateFiles Set by calling SetTemplateFiles. Template files describe 1 to 1 correspondence between files and their new properties. Each i-th file in the TargetFiles list will be assigned properties based on propertes of i-th template file. Template files need not be of the same type as target files, it is enough for them to have properties supported by the target files. If template file is not used for i-th file, then the i-th member of the list should be set to @nil, but should be present to maintain the correct correspondence between target and template files. In other words number of target files must be the same as number of template files. The two above methods can be used together. Template files, if present, always take precedence over NewProperties. If a template file is not present (= @nil), then theNewProperties are used as a template. Template files usually will not be used when Recursive is @true, although this behaviour is dependent on the concrete descendant operations. If template files list is @nil, to indicate that the template files are not used, then only the NewProperties are used.) } { TFileSourceSetFilePropertyOperation } TFileSourceSetFilePropertyOperation = class(TFileSourceOperation) private FStatistics: TFileSourceSetFilePropertyOperationStatistics; FStatisticsAtStartTime: TFileSourceSetFilePropertyOperationStatistics; FStatisticsLock: TCriticalSection; // NewStatistics.DoneFiles then begin with NewStatistics do begin RemainingTime := EstimateRemainingTime(FStatisticsAtStartTime.DoneFiles, DoneFiles, TotalFiles, StartTime, SysUtils.Now, FilesPerSecond); // Update overall progress. if TotalFiles <> 0 then UpdateProgress(DoneFiles/TotalFiles); end; end; FStatistics := NewStatistics; finally FStatisticsLock.Release; end; end; procedure TFileSourceSetFilePropertyOperation.UpdateStatisticsAtStartTime; begin FStatisticsLock.Acquire; try Self.FStatisticsAtStartTime := Self.FStatistics; finally FStatisticsLock.Release; end; end; function TFileSourceSetFilePropertyOperation.RetrieveStatistics: TFileSourceSetFilePropertyOperationStatistics; begin // Statistics have to be synchronized because there are multiple values // and they all have to be consistent at every moment. FStatisticsLock.Acquire; try Result := Self.FStatistics; finally FStatisticsLock.Release; end; end; procedure TFileSourceSetFilePropertyOperation.SetTemplateFiles(var theTemplateFiles: TFiles); begin if Assigned(FTemplateFiles) then FreeAndNil(FTemplateFiles); FTemplateFiles := theTemplateFiles; theTemplateFiles := nil; end; procedure TFileSourceSetFilePropertyOperation.SetProperties(aFile: TFile; aTemplateFile: TFile); var prop: TFilePropertyType; templateProperty: TFileProperty; bRetry: Boolean; sMessage, sQuestion: String; SetResult: TSetFilePropertyResult; ErrorString: String; begin // Iterate over all properties supported by this operation. for prop := Low(SupportedProperties) to High(SupportedProperties) do begin repeat bRetry := False; SetResult := sfprSuccess; // Double-check that the property really is supported by the file. if prop in aFile.SupportedProperties then begin // Get template property from template file (if exists) or NewProperties. if Assigned(aTemplateFile) then templateProperty := aTemplateFile.Properties[prop] else templateProperty := NewProperties[prop]; // Check if there is a new property to be set. if Assigned(templateProperty) then SetResult := SetNewProperty(aFile, templateProperty); end; if SetResult = sfprError then begin ErrorString := GetErrorString(aFile, templateProperty); sMessage := rsMsgLogError + ErrorString; sQuestion := ErrorString; if FSkipErrors then logWrite(Thread, sMessage, lmtError) else begin case AskQuestion(sQuestion, '', [fsourRetry, fsourSkip, fsourSkipAll, fsourAbort], fsourRetry, fsourSkip) of fsourRetry: bRetry := True; fsourSkipAll: FSkipErrors := True; fsourAbort: RaiseAbortOperation; end; end; end; until bRetry = False; end; end; function TFileSourceSetFilePropertyOperation.GetErrorString(aFile: TFile; aProperty: TFileProperty): String; begin case aProperty.GetID of fpName: Result := Format(rsMsgErrRename, [aFile.FullPath, (aProperty as TFileNameProperty).Value]); fpAttributes: Result := Format(rsMsgErrSetAttribute, [aFile.FullPath]); fpModificationTime, fpCreationTime, fpLastAccessTime: Result := Format(rsMsgErrSetDateTime, [aFile.FullPath]); else Result := rsMsgLogError; end; end; end. doublecmd-0.5.8/src/filesources/ufilesourceutil.pas0000644000175000017500000002470212136023216021551 0ustar alexxalexxunit uFileSourceUtil; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSource, uFileView, uFile; {en Decides what should be done when user chooses a file in a file view. This function may add/remove a file source from the view, change path, execute a file or a command, etc. } procedure ChooseFile(aFileView: TFileView; aFile: TFile); {en Checks if choosing the given file will change to another file source, and adds this new file source to the view if it does. @returns @true if the file matched any rules and a new file source was created, @false otherwise, which means no action was taken. } function ChooseFileSource(aFileView: TFileView; aFile: TFile): Boolean; overload; function ChooseFileSource(aFileView: TFileView; const aPath: UTF8String): Boolean; overload; function ChooseArchive(aFileView: TFileView; aFile: TFile; bForce: Boolean = False): Boolean; procedure ChooseSymbolicLink(aFileView: TFileView; aFile: TFile); procedure SetFileSystemPath(aFileView: TFileView; aPath: UTF8String); function RenameFile(aFileSource: IFileSource; const aFile: TFile; const NewFileName: UTF8String; Interactive: Boolean): Boolean; implementation uses LCLProc, fFileExecuteYourSelf, uGlobs, uShellExecute, uFindEx, uDebug, uOSUtils, uShowMsg, uLng, uVfsModule, DCOSUtils, DCStrUtils, uFileSourceOperation, uFileSourceSetFilePropertyOperation, uFileSourceExecuteOperation, uVfsFileSource, uFileSystemFileSource, uWfxPluginFileSource, uArchiveFileSourceUtil, uFileSourceOperationTypes, uFileSourceOperationMessageBoxesUI, uFileProperty; procedure ChooseFile(aFileView: TFileView; aFile: TFile); var sOpenCmd: String; Operation: TFileSourceExecuteOperation = nil; aFileCopy: TFile = nil; begin // First test for file sources. if ChooseFileSource(aFileView, aFile) then Exit; // For now work only for FileSystem until temporary file system is done. if aFileView.FileSource.IsClass(TFileSystemFileSource) then begin //now test if exists Open command in doublecmd.ext :) sOpenCmd:= gExts.GetExtActionCmd(aFile, 'open'); if (sOpenCmd<>'') then begin (* if Pos('{!VFS}',sOpenCmd)>0 then begin if fVFS.FindModule(sName) then begin LoadPanelVFS(pfri); Exit; end; end; *) sOpenCmd := PrepareParameter(sOpenCmd, aFile); if ProcessExtCommand(sOpenCmd, aFileView.CurrentPath) then Exit; end; end; if (fsoExecute in aFileView.FileSource.GetOperationsTypes) then try aFileCopy := aFile.Clone; Operation := aFileView.FileSource.CreateExecuteOperation( aFileCopy, aFileView.CurrentPath, 'open') as TFileSourceExecuteOperation; if Assigned(Operation) then begin Operation.Execute; case Operation.ExecuteOperationResult of fseorError: begin // Show error message if Length(Operation.ResultString) = 0 then msgError(rsMsgErrEOpen) else msgError(Operation.ResultString); end; fseorYourSelf: begin // Copy out file to temp file system and execute if not ShowFileExecuteYourSelf(aFileView, aFile, False) then DCDebug('Execution error!'); end; fseorWithAll: begin // Copy out all files to temp file system and execute chosen if not ShowFileExecuteYourSelf(aFileView, aFile, True) then DCDebug('Execution error!'); end; fseorSymLink: begin // change directory to new path (returned in Operation.ResultString) DCDebug('Change directory to ', Operation.ResultString); with aFileView do begin if (FileSource.IsClass(TFileSystemFileSource)) or (mbSetCurrentDir(ExcludeTrailingPathDelimiter(Operation.ResultString)) = False) then begin // Simply change path CurrentPath:= Operation.ResultString; end else begin // Get a new filesystem file source AddFileSource(TFileSystemFileSource.GetFileSource, Operation.ResultString); end; end; end; end; // case end; // assigned finally FreeAndNil(aFileCopy); FreeAndNil(Operation); end; end; function ChooseFileSource(aFileView: TFileView; aFile: TFile): Boolean; var FileSource: IFileSource; VfsModule: TVfsModule; begin Result := False; if ChooseArchive(aFileView, aFile) then Exit(True); // Work only for TVfsFileSource. if aFileView.FileSource.IsClass(TVfsFileSource) then begin // Check if there is a registered WFX plugin by file system root name. FileSource := FileSourceManager.Find(TWfxPluginFileSource, 'wfx://' + aFile.Name); if not Assigned(FileSource) then FileSource := TWfxPluginFileSource.CreateByRootName(aFile.Name); if not Assigned(FileSource) then begin // Check if there is a registered Vfs module by file system root name. VfsModule:= gVfsModuleList.VfsModule[aFile.Name]; if Assigned(VfsModule) then begin FileSource := FileSourceManager.Find(VfsModule.FileSourceClass, aFile.Name); if not Assigned(FileSource) then FileSource := VfsModule.FileSourceClass.Create; end; end; if Assigned(FileSource) then begin aFileView.AddFileSource(FileSource, FileSource.GetRootDir); Exit(True); end; end; end; function ChooseFileSource(aFileView: TFileView; const aPath: UTF8String): Boolean; var I: Integer; aFileSourceClass: TFileSourceClass; begin Result:= True; aFileSourceClass:= gVfsModuleList.GetFileSource(aPath); if Assigned(aFileSourceClass) then begin // If found FileSource is same as current then simply change path if aFileSourceClass.ClassNameIs(aFileView.FileSource.ClassName) then aFileView.CurrentPath := aPath else aFileView.AddFileSource(aFileSourceClass.Create, aPath); end else // Search for filesystem file source in this view, and remove others. with aFileView do begin for I := FileSourcesCount - 1 downto 0 do begin // Search FileSource with same class name, we can not use "is" // operator because it also works for descendant classes if TFileSystemFileSource.ClassNameIs(FileSources[I].ClassName) then begin CurrentPath := aPath; Break; end else RemoveCurrentFileSource; end; if FileSourcesCount = 0 then begin // If not found, get a new filesystem file source. AddFileSource(TFileSystemFileSource.GetFileSource, aPath); end; Result:= mbSetCurrentDir(aPath); end; end; function ChooseArchive(aFileView: TFileView; aFile: TFile; bForce: Boolean): Boolean; var FileSource: IFileSource; begin // Check if there is a ArchiveFileSource for possible archive. FileSource := GetArchiveFileSource(aFileView.FileSource, aFile, EmptyStr, bForce); if Assigned(FileSource) then begin aFileView.AddFileSource(FileSource, FileSource.GetRootDir); Exit(True); end; Result := False; end; procedure ChooseSymbolicLink(aFileView: TFileView; aFile: TFile); var SearchRec: TSearchRecEx; sPath: UTF8String; begin if not aFileView.FileSource.IsClass(TFileSystemFileSource) then begin aFileView.ChangePathToChild(aFile); Exit; end; sPath:= aFileView.CurrentPath + IncludeTrailingPathDelimiter(aFile.Name); try if FindFirstEx(sPath + AllFilesMask, faAnyFile, SearchRec) = 0 then begin with aFileView do CurrentPath := CurrentPath + IncludeTrailingPathDelimiter(aFile.Name); end else begin sPath:= ReadSymLink(aFile.FullPath); if sPath <> EmptyStr then aFileView.CurrentPath := IncludeTrailingPathDelimiter(GetAbsoluteFileName(aFileView.CurrentPath, sPath)) else msgError(Format(rsMsgChDirFailed, [aFile.FullPath])); end; finally FindCloseEx(SearchRec); end; end; procedure SetFileSystemPath(aFileView: TFileView; aPath: UTF8String); var i: Integer; begin // Search for filesystem file source in this view, and remove others. with aFileView do begin for i := FileSourcesCount - 1 downto 0 do begin // Search FileSource with same class name, we can not use "is" // operator because it also works for descendant classes if TFileSystemFileSource.ClassNameIs(FileSources[i].ClassName) then begin CurrentPath := aPath; Break; end else RemoveCurrentFileSource; end; if FileSourcesCount = 0 then begin // If not found, get a new filesystem file source. AddFileSource(TFileSystemFileSource.GetFileSource, aPath); end; end; end; function RenameFile(aFileSource: IFileSource; const aFile: TFile; const NewFileName: UTF8String; Interactive: Boolean): Boolean; var aFiles: TFiles = nil; Operation: TFileSourceSetFilePropertyOperation = nil; NewProperties: TFileProperties; UserInterface: TFileSourceOperationMessageBoxesUI = nil; begin Result:= False; if fsoSetFileProperty in aFileSource.GetOperationsTypes then begin FillByte(NewProperties, SizeOf(NewProperties), 0); NewProperties[fpName] := TFileNameProperty.Create(NewFileName); try aFiles := TFiles.Create(aFile.Path); aFiles.Add(aFile.Clone); Operation := aFileSource.CreateSetFilePropertyOperation( aFiles, NewProperties) as TFileSourceSetFilePropertyOperation; if Assigned(Operation) then begin // Only if the operation can change file name. if fpName in Operation.SupportedProperties then begin Operation.SkipErrors := not Interactive; if Interactive then begin UserInterface := TFileSourceOperationMessageBoxesUI.Create; Operation.AddUserInterface(UserInterface); end; Operation.Execute; Result := (Operation.Result = fsorFinished); end; end; finally FreeThenNil(NewProperties[fpName]); FreeThenNil(Operation); FreeThenNil(UserInterface); FreeThenNil(aFiles); end; end; end; end. doublecmd-0.5.8/src/filesources/uvirtualfilesource.pas0000644000175000017500000000066611747211345022276 0ustar alexxalexxunit uVirtualFileSource; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSource; type IVirtualFileSource = interface(IFileSource) end; {en Base class for any virtual file source (this can be any list of files, internal lists, temporary, links to favourite files, results from search queries, etc.). } TVirtualFileSource = class(TFileSource, IVirtualFileSource) end; implementation end. doublecmd-0.5.8/src/filesources/ufilesourcecopyoperation.pas0000644000175000017500000001707212065274254023504 0ustar alexxalexxunit uFileSourceCopyOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, syncobjs, uFileSourceOperation, uFileSourceOperationTypes, uFileSource, uFile; type // Statistics are the same for CopyIn and CopyOut operations. TFileSourceCopyOperationStatistics = record CurrentFileFrom: String; CurrentFileTo: String; CurrentFileTotalBytes: Int64; CurrentFileDoneBytes: Int64; TotalFiles: Int64; DoneFiles: Int64; TotalBytes: Int64; DoneBytes: Int64; BytesPerSecond: Int64; RemainingTime: TDateTime; end; {en Base class for CopyIn and CopyOut operations. } { TFileSourceCopyOperation } TFileSourceCopyOperation = class(TFileSourceOperation) private FStatistics: TFileSourceCopyOperationStatistics; FStatisticsAtStartTime: TFileSourceCopyOperationStatistics; FStatisticsLock: TCriticalSection; // NewStatistics.DoneBytes then begin with NewStatistics do begin RemainingTime := EstimateRemainingTime(FStatisticsAtStartTime.DoneBytes, DoneBytes, TotalBytes, StartTime, SysUtils.Now, BytesPerSecond); // Update overall progress. if TotalBytes <> 0 then UpdateProgress(DoneBytes / TotalBytes); end; end; FStatistics := NewStatistics; finally FStatisticsLock.Release; end; end; procedure TFileSourceCopyOperation.UpdateStatisticsAtStartTime; begin FStatisticsLock.Acquire; try Self.FStatisticsAtStartTime := Self.FStatistics; finally FStatisticsLock.Release; end; end; function TFileSourceCopyOperation.RetrieveStatistics: TFileSourceCopyOperationStatistics; begin // Statistics have to be synchronized because there are multiple values // and they all have to be consistent at every moment. FStatisticsLock.Acquire; try Result := Self.FStatistics; finally FStatisticsLock.Release; end; end; // -- TFileSourceCopyInOperation ---------------------------------------------- function TFileSourceCopyInOperation.GetID: TFileSourceOperationType; begin Result := fsoCopyIn; end; // -- TFileSourceCopyOutOperation --------------------------------------------- function TFileSourceCopyOutOperation.GetID: TFileSourceOperationType; begin Result := fsoCopyOut; end; end. doublecmd-0.5.8/src/filesources/ufilesourceoperation.pas0000644000175000017500000011110512123516776022604 0ustar alexxalexxunit uFileSourceOperation; {$mode objfpc}{$H+} // If defined causes to synchronize executing callback for events. // This ensures that the callbacks always have the operation in the current state, // which might be safer, but it is slower because the operation must wait // until all callbacks are executed. // If undefined then all events are sent asynchronously, which is faster. // However, it may result in those events to be reported much later after // they have happened in the operation and the operation state might // not be valid anymore. //{$DEFINE fsoSynchronizeEvents} // If defined it will only send one event and will not send more // until that event is processed (so some events may be lost). // This normally shouldn't be defined. //{$DEFINE fsoSendOnlyCurrentState} //{$DEFINE debugFileSourceOperation} interface uses Classes, SysUtils, syncobjs, uLng, uFileSourceOperationOptionsUI, uFileSourceOperationTypes, uFileSourceOperationUI; type TFileSourceOperationState = (fsosNotStarted, // 0 then // Get the UI that was most recently added. Result := PUserInterfacesEntry(FUserInterfaces.Last)^.UserInterface else Result := nil; end; end; procedure TFileSourceOperation.DoPauseIfNeeded(DesiredStates: TFileSourceOperationStates); begin FStateLock.Acquire; try if not (GetDesiredState in DesiredStates) then Exit; RTLeventResetEvent(FPauseEvent); finally FStateLock.Release; end; RTLeventWaitFor(FPauseEvent); // wait indefinitely end; procedure TFileSourceOperation.DoUnPause; begin RTLeventSetEvent(FPauseEvent); end; function TFileSourceOperation.DoWaitForConnection: TWaitResult; begin FConnectionAvailableEvent.ResetEvent; Result:= FConnectionAvailableEvent.WaitFor(FConnectionTimeout); end; function TFileSourceOperation.WaitForConnection: TWaitResult; begin UpdateState(fsosWaitingForConnection); Result:= DoWaitForConnection; UpdateStartTime(SysUtils.Now); UpdateState(fsosRunning); end; procedure TFileSourceOperation.ConnectionAvailableNotify; begin FConnectionAvailableEvent.SetEvent; end; function TFileSourceOperation.GetConnection: TObject; begin Result := (FileSource as IFileSource).GetConnection(Self); end; function TFileSourceOperation.GetDescription(Details: TFileSourceOperationDescriptionDetails): String; begin Result := rsOperWorking; end; procedure TFileSourceOperation.CheckOperationState; begin case GetDesiredState of fsosPaused: begin if UpdateState(fsosPaused, [fsosPausing]) then begin DoPauseIfNeeded([fsosPaused]); // Check if the operation was unpaused because it is being aborted. if GetDesiredState = fsosStopped then RaiseAbortOperation; UpdateStartTime(SysUtils.Now); if FOperationInitialized then UpdateState(fsosRunning) else UpdateState(fsosStarting); end; end; fsosStopped: // operation was asked to stop (via Stop function) begin RaiseAbortOperation; end; // else: we're left with fsosRunning end; end; procedure TFileSourceOperation.UpdateStartTime(NewStartTime: TDateTime); begin FStartTime := NewStartTime; UpdateStatisticsAtStartTime; end; procedure TFileSourceOperation.Start; var LocalState: TFileSourceOperationState; begin FStateLock.Acquire; try if FState in [fsosPausing] then // The operation didn't manage to pause yet, so simply go back to running state. FState := fsosRunning else if FState in [fsosNotStarted, fsosPaused] then FState := fsosStarting else Exit; LocalState := FState; finally FStateLock.Release; end; NotifyStateChanged(LocalState); FDesiredState := fsosRunning; DoUnPause; end; procedure TFileSourceOperation.Pause; begin FStateLock.Acquire; try if FState in [fsosStarting, fsosRunning, fsosWaitingForConnection] then FState := fsosPausing else Exit; finally FStateLock.Release; end; NotifyStateChanged(fsosPausing); FDesiredState := fsosPaused; // Also set "Connection available" event in case the operation is waiting // for a connection and the user wants to pause it // (this must be after setting desired state). ConnectionAvailableNotify; end; procedure TFileSourceOperation.Stop; begin FStateLock.Acquire; try if not (FState in [fsosStopping, fsosStopped]) then FState := fsosStopping else Exit; finally FStateLock.Release; end; NotifyStateChanged(fsosStopping); FDesiredState := fsosStopped; DoUnPause; // Also set "Connection available" event in case the operation is waiting // for a connection and the user wants to abort it // (this must be after setting desired state). ConnectionAvailableNotify; // The operation may be waiting for the user's response. // Wake it up then, because it is being aborted // (this must be after setting state to Stopping). RTLeventSetEvent(FUserInterfaceAssignedEvent); end; procedure TFileSourceOperation.TogglePause; begin if State in [fsosStarting, fsosRunning, fsosWaitingForConnection] then Pause else Start; end; procedure TFileSourceOperation.PreventStart; begin FDesiredState := fsosNotStarted; end; procedure TFileSourceOperation.AssignThread(AThread: TThread); begin FThread := AThread; end; procedure TFileSourceOperation.AddStateChangedListener( States: TFileSourceOperationStates; FunctionToCall: TFileSourceOperationStateChangedNotify); var Entry: PStateChangedEventEntry; i: Integer; begin FEventsLock.Acquire; try // Check if this function isn't already added. for i := 0 to FStateChangedEventListeners.Count - 1 do begin Entry := PStateChangedEventEntry(FStateChangedEventListeners.Items[i]); if Entry^.FunctionToCall = FunctionToCall then begin // Add states to listen for. Entry^.States := Entry^.States + States; Exit; end; end; // Add new listener. Entry := New(PStateChangedEventEntry); Entry^.FunctionToCall := FunctionToCall; Entry^.States := States; FStateChangedEventListeners.Add(Entry); finally FEventsLock.Release; end; end; procedure TFileSourceOperation.RemoveStateChangedListener( States: TFileSourceOperationStates; FunctionToCall: TFileSourceOperationStateChangedNotify); var Entry: PStateChangedEventEntry; i: Integer; begin FEventsLock.Acquire; try for i := 0 to FStateChangedEventListeners.Count - 1 do begin Entry := PStateChangedEventEntry(FStateChangedEventListeners.Items[i]); if Entry^.FunctionToCall = FunctionToCall then begin // Remove listening for states. Entry^.States := Entry^.States - States; // If all states removed - remove the callback function itself. if Entry^.States = [] then begin FStateChangedEventListeners.Delete(i); Dispose(Entry); end; break; end; end; finally FEventsLock.Release; end; end; procedure TFileSourceOperation.NotifyStateChanged(NewState: TFileSourceOperationState); var i: Integer; found: Boolean = False; begin FEventsLock.Acquire; try {$IFNDEF fsoSynchronizeEvents} {$IFDEF fsoSendOnlyCurrentState} // If we only want to notify about the current state, first check // if there already isn't scheduled (queued) a call to CallEventsListeners. if FScheduledEventsListenersCalls > 0 then Exit; {$ENDIF} {$ENDIF} // Check if there is at least one listener that wants the new state. for i := 0 to FStateChangedEventListeners.Count - 1 do begin if NewState in PStateChangedEventEntry(FStateChangedEventListeners.Items[i])^.States then begin found := True; break; end; end; if not found then Exit; {$IFNDEF fsoSynchronizeEvents} // This must be under the same lock as in CallEventsListeners. InterLockedIncrement(FScheduledEventsListenersCalls); RTLeventResetEvent(FNoEventsListenersCallsScheduledEvent); {$ENDIF} finally FEventsLock.Release; end; {$IFDEF debugFileSourceOperation} DCDebug('Op: ', hexStr(self), ' ', FormatDateTime('nnss.zzzz', Now), ': Before notify events'); {$ENDIF} if GetCurrentThreadID <> MainThreadID then // NotifyStateChanged() is run from the operation thread so we cannot // call event listeners directly, because they may update the GUI. {$IFDEF fsoSynchronizeEvents} // Call listeners through Synchronize. TThread.Synchronize(Thread, @CallEventsListeners) {$ELSE} // Schedule listeners through asynchronous message queue. GuiMessageQueue.QueueMethod(@CallEventsListeners, Pointer(PtrUInt(NewState))) {$ENDIF} else begin // The function was called from main thread - call directly. if GetCurrentThreadID <> MainThreadID then begin // The operation runs in a thread. // Handle exceptions for the GUI thread because it controls the operation // and in case of error the operation may be left in infinite waiting state. try {$IFDEF fsoSynchronizeEvents} CallEventsListeners; {$ELSE} CallEventsListeners(Pointer(PtrUInt(NewState))); {$ENDIF} except on Exception do begin WriteExceptionToErrorFile; DCDebug(ExceptionToString); ShowExceptionDialog; end; end; end else begin {$IFDEF fsoSynchronizeEvents} CallEventsListeners; {$ELSE} CallEventsListeners(Pointer(PtrUInt(NewState))); {$ENDIF} end; end; {$IFDEF debugFileSourceOperation} DCDebug('Op: ', hexStr(self), ' ', FormatDateTime('nnss.zzzz', Now), ': After notify events'); {$ENDIF} end; {$IFDEF fsoSynchronizeEvents} procedure TFileSourceOperation.CallEventsListeners; {$ELSE} procedure TFileSourceOperation.CallEventsListeners(Data: Pointer); {$ENDIF} var Entry: PStateChangedEventEntry; i: Integer; aState: TFileSourceOperationState; FunctionsToCall: array of TFileSourceOperationStateChangedNotify; FunctionsCount: Integer = 0; begin {$IFDEF debugFileSourceOperation} DCDebug('Op: ', hexStr(self), ' ', FormatDateTime('nnss.zzzz', Now), ': Before call events'); {$ENDIF} {$IFDEF fsoSynchronizeEvents} aState := Self.State; {$ELSE} {$IFDEF fsoSendOnlyCurrentState} aState := Self.State; {$ELSE} aState := TFileSourceOperationState(PtrUInt(Data)); {$ENDIF} InterLockedDecrement(FScheduledEventsListenersCalls); {$ENDIF} // First the listeners functions must be copied under lock before calling them, // because any function called may attempt to add/remove listeners from the list. FEventsLock.Acquire; try SetLength(FunctionsToCall, FStateChangedEventListeners.Count); for i := 0 to FStateChangedEventListeners.Count - 1 do begin Entry := PStateChangedEventEntry(FStateChangedEventListeners.Items[i]); // Check if the listener wants this state. if (aState in Entry^.States) then begin FunctionsToCall[FunctionsCount] := Entry^.FunctionToCall; Inc(FunctionsCount, 1); end; end; finally FEventsLock.Release; end; // Call each listener function (not under lock). for i := 0 to FunctionsCount - 1 do FunctionsToCall[i](Self, aState); {$IFNDEF fsoSynchronizeEvents} FEventsLock.Acquire; try // This must be under the same lock as in NotifyStateChanged. if FScheduledEventsListenersCalls = 0 then RTLeventSetEvent(FNoEventsListenersCallsScheduledEvent); finally FEventsLock.Release; end; {$ENDIF} {$IFDEF debugFileSourceOperation} DCDebug('Op: ', hexStr(Self), ' ', FormatDateTime('nnss.zzzz', Now), ': After call events'); {$ENDIF} end; procedure TFileSourceOperation.AddUserInterface(UserInterface: TFileSourceOperationUI); var Entry: PUserInterfacesEntry; begin Entry := New(PUserInterfacesEntry); Entry^.UserInterface := UserInterface; FUserInterfaces.Add(Entry); // Notify a possibly waiting operation thread that an UI was assigned. RTLeventSetEvent(FUserInterfaceAssignedEvent); end; procedure TFileSourceOperation.RemoveUserInterface(UserInterface: TFileSourceOperationUI); var Entry: PUserInterfacesEntry; i: Integer; begin for i := 0 to FUserInterfaces.Count - 1 do begin Entry := PUserInterfacesEntry(FUserInterfaces.Items[i]); if Entry^.UserInterface = UserInterface then begin FUserInterfaces.Delete(i); Dispose(Entry); break; end; end; if FUserInterfaces.Count = 0 then // Last interface was removed - reset event so that operation // thread will wait for an UI if it wants to ask a question. RTLeventResetEvent(FUserInterfaceAssignedEvent); end; class function TFileSourceOperation.GetOptionsUIClass: TFileSourceOperationOptionsUIClass; begin Result := nil; end; class function TFileSourceOperation.GetOperationClass: TFileSourceOperationClass; begin Result := Self; end; function TFileSourceOperation.AskQuestion( Msg: String; Question: String; PossibleResponses: array of TFileSourceOperationUIResponse; DefaultOKResponse: TFileSourceOperationUIResponse; DefaultCancelResponse: TFileSourceOperationUIResponse): TFileSourceOperationUIResponse; var i: Integer; bStateChanged: Boolean = False; OldState: TFileSourceOperationState; begin FStateLock.Acquire; try if FState in [fsosStopping, fsosStopped] then RaiseAbortOperation else begin OldState := FState; FState := fsosWaitingForFeedback; end; finally FStateLock.Release; end; NotifyStateChanged(fsosWaitingForFeedback); // Set up parameters through variables because // we cannot pass them via Synchronize call to TryAskQuestion. FUIMessage := Msg; FUIQuestion := Question; SetLength(FUIPossibleResponses, Length(PossibleResponses)); for i := 0 to Length(PossibleResponses) - 1 do FUIPossibleResponses[i] := PossibleResponses[i]; FUIDefaultOKResponse := DefaultOKResponse; FUIDefaultCancelResponse := DefaultCancelResponse; if GetCurrentThreadID <> MainThreadID then begin while True do begin TThread.Synchronize(Thread, @TryAskQuestion); // Check result of TryAskQuestion. if FTryAskQuestionResult = False then begin // There is no UI assigned - wait until it is assigned. RTLeventWaitFor(FUserInterfaceAssignedEvent); // Check why the event was set. // It is either because an UI was assigned or because the operation is being aborted. if State in [fsosStopping, fsosStopped] then begin // The operation is being aborted. RaiseAbortOperation; break; end; // else we got an UI assigned - retry asking question end else begin // Received answer from the user. Result := FUIResponse; break; end; end; end else begin // The operation is probably run from main thread - call directly. TryAskQuestion; if FTryAskQuestionResult = False then // There is no UI assigned - assume default OK answer. Result := DefaultOKResponse else Result := FUIResponse; end; FStateLock.Acquire; try // Check, if the state is still the same as before asking question. if FState = fsosWaitingForFeedback then begin UpdateStartTime(SysUtils.Now); FState := OldState; bStateChanged := True; end; finally FStateLock.Release; end; if bStateChanged then NotifyStateChanged(OldState); end; procedure TFileSourceOperation.TryAskQuestion; var UI: TFileSourceOperationUI; begin // This is run from GUI thread. FTryAskQuestionResult := False; // We have no answer yet. UI := GetUserInterface; if Assigned(UI) then begin FUIResponse := UI.AskQuestion( FUIMessage, FUIQuestion, FUIPossibleResponses, FUIDefaultOKResponse, FUIDefaultCancelResponse); FTryAskQuestionResult := True; // We do have an answer now. end; // else We have no UIs assigned - cannot ask question. end; procedure TFileSourceOperation.ReloadFileSources; begin TThread.Synchronize(Thread, @DoReloadFileSources); // Calls virtual function end; procedure TFileSourceOperation.DoReloadFileSources; begin // Nothing by default. end; class procedure TFileSourceOperation.RaiseAbortOperation; begin raise EFileSourceOperationAborting.Create; end; constructor EFileSourceOperationAborting.Create; begin inherited Create('aborting file source operation'); end; end. doublecmd-0.5.8/src/filesources/wcxarchive/0000755000175000017500000000000012257501472017770 5ustar alexxalexxdoublecmd-0.5.8/src/filesources/wcxarchive/uwcxarchivecopyinoperation.pas0000644000175000017500000003320311747211345026171 0ustar alexxalexxunit uWcxArchiveCopyInOperation; {$mode objfpc}{$H+} {$include calling.inc} interface uses Classes, SysUtils, StringHashList, WcxPlugin, uLog, uGlobs, uFileSourceCopyOperation, uFileSource, uFileSourceOperation, uFile, uWcxArchiveFileSource; type { TWcxArchiveCopyInOperation } TWcxArchiveCopyInOperation = class(TFileSourceCopyInOperation) private FWcxArchiveFileSource: IWcxArchiveFileSource; FStatistics: TFileSourceCopyOperationStatistics; // local copy of statistics FFullFilesTree: TFiles; FPackingFlags: Integer; // Packing flags passed to plugin FTarBefore: Boolean; // Create TAR archive first FTarFileName: UTF8String; // Temporary TAR archive name {en Convert TFiles into a string separated with #0 (format used by WCX). } function GetFileList(const theFiles: TFiles): String; procedure SetTarBefore(const AValue: Boolean); procedure ShowError(sMessage: String; logOptions: TLogOptions = []); procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); procedure DeleteFiles(const aFiles: TFiles); protected function Tar: Boolean; procedure SetChangeVolProc(hArcData: TArcHandle); procedure SetProcessDataProc(hArcData: TArcHandle); public constructor Create(aSourceFileSource: IFileSource; aTargetFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; class procedure ClearCurrentOperation; function GetDescription(Details: TFileSourceOperationDescriptionDetails): String; override; property PackingFlags: Integer read FPackingFlags write FPackingFlags; property TarBefore: Boolean read FTarBefore write SetTarBefore; end; implementation uses LCLProc, FileUtil, DCStrUtils, uWCXmodule, uLng, uShowMsg, uFileSystemFileSource, uFileSourceOperationUI, uFileSystemUtil, DCOSUtils, uTarWriter; // ---------------------------------------------------------------------------- // WCX callbacks var // This global variable is used to store currently running operation // for plugins that not supports background operations (see GetBackgroundFlags) WcxCopyInOperationG: TWcxArchiveCopyInOperation = nil; threadvar // This thread variable is used to store currently running operation // for plugins that supports background operations (see GetBackgroundFlags) WcxCopyInOperationT: TWcxArchiveCopyInOperation; function ChangeVolProc(var ArcName : UTF8String; Mode: LongInt): LongInt; begin Result:= 1; case Mode of PK_VOL_ASK: begin // Use operation UI for this? if not ShowInputQuery('Double Commander', rsMsgSelLocNextVol, ArcName) then Result := 0; // Abort operation end; PK_VOL_NOTIFY: if log_arc_op in gLogOptions then LogWrite(rsMsgNextVolUnpack + #32 + ArcName); end; end; function ChangeVolProcA(ArcName : PAnsiChar; Mode: LongInt): LongInt; dcpcall; var sArcName: UTF8String; begin sArcName:= SysToUTF8(StrPas(ArcName)); Result:= ChangeVolProc(sArcName, Mode); if Result <> 0 then StrPLCopy(ArcName, UTF8ToSys(sArcName), MAX_PATH); end; function ChangeVolProcW(ArcName : PWideChar; Mode: LongInt): LongInt; dcpcall; var sArcName: UTF8String; begin sArcName:= UTF8Encode(WideString(ArcName)); Result:= ChangeVolProc(sArcName, Mode); if Result <> 0 then StrPLCopyW(ArcName, UTF8Decode(sArcName), MAX_PATH); end; function ProcessDataProc(WcxCopyInOperation: TWcxArchiveCopyInOperation; FileName: UTF8String; Size: LongInt): LongInt; begin //DCDebug('Working (' + IntToStr(GetCurrentThreadId) + ') ' + FileName + ' Size = ' + IntToStr(Size)); Result := 1; if Assigned(WcxCopyInOperation) then begin if WcxCopyInOperation.State = fsosStopping then // Cancel operation Exit(0); with WcxCopyInOperation.FStatistics do begin CurrentFileFrom:= FileName; if Size >= 0 then begin CurrentFileDoneBytes := CurrentFileDoneBytes + Size; DoneBytes := DoneBytes + Size; end else // For plugins which unpack in CloseArchive begin if (Size >= -100) and (Size <= -1) then // first percent bar begin CurrentFileDoneBytes := CurrentFileTotalBytes * (-Size) div 100; CurrentFileTotalBytes := 100; { if Size = -100 then // File finished DoneBytes := DoneBytes + WcxCopyOutOperation.FCurrentFileSize;} //DCDebug('Working ' + FileName + ' Percent1 = ' + IntToStr(FFileOpDlg.iProgress1Pos)); end else if (Size >= -1100) and (Size <= -1000) then // second percent bar begin DoneBytes := TotalBytes * Int64(-Size - 1000) div 100; //DCDebug('Working ' + FileName + ' Percent2 = ' + IntToStr(FFileOpDlg.iProgress2Pos)); end else begin // DoneBytes := DoneBytes + WcxCopyOutOperation.FCurrentFileSize; end; end; WcxCopyInOperation.UpdateStatistics(WcxCopyInOperation.FStatistics); WcxCopyInOperation.CheckOperationState; end; end; end; function ProcessDataProcAG(FileName: PAnsiChar; Size: LongInt): LongInt; dcpcall; begin Result:= ProcessDataProc(WcxCopyInOperationG, SysToUTF8(StrPas(FileName)), Size); end; function ProcessDataProcWG(FileName: PWideChar; Size: LongInt): LongInt; dcpcall; begin Result:= ProcessDataProc(WcxCopyInOperationG, UTF8Encode(WideString(FileName)), Size); end; function ProcessDataProcAT(FileName: PAnsiChar; Size: LongInt): LongInt; dcpcall; begin Result:= ProcessDataProc(WcxCopyInOperationT, SysToUTF8(StrPas(FileName)), Size); end; function ProcessDataProcWT(FileName: PWideChar; Size: LongInt): LongInt; dcpcall; begin Result:= ProcessDataProc(WcxCopyInOperationT, UTF8Encode(WideString(FileName)), Size); end; // ---------------------------------------------------------------------------- constructor TWcxArchiveCopyInOperation.Create(aSourceFileSource: IFileSource; aTargetFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); begin FWcxArchiveFileSource := aTargetFileSource as IWcxArchiveFileSource; FFullFilesTree := nil; FPackingFlags := 0; FTarBefore:= False; inherited Create(aSourceFileSource, aTargetFileSource, theSourceFiles, aTargetPath); FNeedsConnection:= (FWcxArchiveFileSource.WcxModule.BackgroundFlags and BACKGROUND_PACK = 0); end; destructor TWcxArchiveCopyInOperation.Destroy; begin ClearCurrentOperation; inherited Destroy; FreeAndNil(FFullFilesTree); end; procedure TWcxArchiveCopyInOperation.Initialize; begin // Is plugin allow multiple Operations? if FNeedsConnection then WcxCopyInOperationG := Self else WcxCopyInOperationT := Self; // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; FillAndCount(SourceFiles, False, False, FFullFilesTree, FStatistics.TotalFiles, FStatistics.TotalBytes); // gets full list of files (recursive) end; procedure TWcxArchiveCopyInOperation.MainExecute; var sDestPath: String; WcxModule: TWcxModule; iResult: Longint; begin // Put to TAR archive if needed if FTarBefore and Tar then Exit; WcxModule := FWcxArchiveFileSource.WcxModule; sDestPath := ExcludeFrontPathDelimiter(TargetPath); sDestPath := ExcludeTrailingPathDelimiter(sDestPath); sDestPath := sDestPath; with FStatistics do begin CurrentFileTo:= FWcxArchiveFileSource.ArchiveFileName; UpdateStatistics(FStatistics); end; SetChangeVolProc(wcxInvalidHandle); SetProcessDataProc(wcxInvalidHandle); iResult := WcxModule.WcxPackFiles( FWcxArchiveFileSource.ArchiveFileName, sDestPath, // no trailing path delimiter here IncludeTrailingPathDelimiter(FFullFilesTree.Path), // end with path delimiter here GetFileList(FFullFilesTree), // Convert TFiles into UTF8String PackingFlags); // Check for errors. if iResult <> E_SUCCESS then begin ShowError(Format(rsMsgLogError + rsMsgLogPack, [FWcxArchiveFileSource.ArchiveFileName + ' - ' + GetErrorMsg(iResult)]), [log_arc_op]); end else begin LogMessage(Format(rsMsgLogSuccess + rsMsgLogPack, [FWcxArchiveFileSource.ArchiveFileName]), [log_arc_op], lmtSuccess); end; // Delete temporary TAR archive if needed if FTarBefore then mbDeleteFile(FTarFileName); end; procedure TWcxArchiveCopyInOperation.Finalize; begin ClearCurrentOperation; end; function TWcxArchiveCopyInOperation.GetDescription(Details: TFileSourceOperationDescriptionDetails): String; begin case Details of fsoddJobAndTarget: begin if SourceFiles.Count = 1 then Result := Format(rsOperPackingSomethingTo, [SourceFiles[0].Name, FWcxArchiveFileSource.ArchiveFileName]) else Result := Format(rsOperPackingFromTo, [SourceFiles.Path, FWcxArchiveFileSource.ArchiveFileName]); end; else Result := rsOperPacking; end; end; function TWcxArchiveCopyInOperation.GetFileList(const theFiles: TFiles): String; var I : Integer; FileName : String; begin Result := ''; for I := 0 to theFiles.Count - 1 do begin // Filenames must be relative to the current directory. FileName := ExtractDirLevel(theFiles.Path, theFiles[I].FullPath); // Special treatment of directories. if theFiles[i].IsDirectory then // TC ends paths to directories to be packed with '\'. FileName := IncludeTrailingPathDelimiter(FileName); Result := Result + FileName + #0; end; Result := Result + #0; end; procedure TWcxArchiveCopyInOperation.SetTarBefore(const AValue: Boolean); begin with FWcxArchiveFileSource, FWcxArchiveFileSource.WcxModule do begin FTarBefore:= AValue; if FTarBefore and Assigned(PackToMem) and (PluginCapabilities and PK_CAPS_MEMPACK <> 0) then FNeedsConnection:= (BackgroundFlags and BACKGROUND_MEMPACK = 0) else FNeedsConnection:= (BackgroundFlags and BACKGROUND_PACK = 0); end; end; procedure TWcxArchiveCopyInOperation.ShowError(sMessage: String; logOptions: TLogOptions); begin if not gSkipFileOpError then begin if AskQuestion(sMessage, '', [fsourSkip, fsourCancel], fsourSkip, fsourAbort) = fsourAbort then begin RaiseAbortOperation; end; end else begin LogMessage(sMessage, logOptions, lmtError); end; end; procedure TWcxArchiveCopyInOperation.LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); begin case logMsgType of lmtError: if not (log_errors in gLogOptions) then Exit; lmtInfo: if not (log_info in gLogOptions) then Exit; lmtSuccess: if not (log_success in gLogOptions) then Exit; end; if logOptions <= gLogOptions then begin logWrite(Thread, sMessage, logMsgType); end; end; procedure TWcxArchiveCopyInOperation.DeleteFiles(const aFiles: TFiles); var I: Integer; aFile: TFile; begin for I:= aFiles.Count - 1 downto 0 do begin aFile:= aFiles[I]; if aFile.IsDirectory then mbRemoveDir(aFile.FullPath) else mbDeleteFile(aFile.FullPath); end; end; procedure TWcxArchiveCopyInOperation.SetChangeVolProc(hArcData: TArcHandle); begin with FWcxArchiveFileSource.WcxModule do WcxSetChangeVolProc(hArcData, @ChangeVolProcA, @ChangeVolProcW); end; procedure TWcxArchiveCopyInOperation.SetProcessDataProc(hArcData: TArcHandle); begin with FWcxArchiveFileSource.WcxModule do begin if FNeedsConnection then WcxSetProcessDataProc(hArcData, @ProcessDataProcAG, @ProcessDataProcWG) else WcxSetProcessDataProc(hArcData, @ProcessDataProcAT, @ProcessDataProcWT); end; end; class procedure TWcxArchiveCopyInOperation.ClearCurrentOperation; begin WcxCopyInOperationG := nil; end; function TWcxArchiveCopyInOperation.Tar: Boolean; var TarWriter: TTarWriter = nil; begin with FWcxArchiveFileSource, FWcxArchiveFileSource.WcxModule do begin if Assigned(PackToMem) and (PluginCapabilities and PK_CAPS_MEMPACK <> 0) then begin FTarFileName:= ArchiveFileName; TarWriter:= TTarWriter.Create(FTarFileName, @AskQuestion, @RaiseAbortOperation, @CheckOperationState, @UpdateStatistics, WcxModule ); Result:= True; end else begin FTarFileName:= RemoveFileExt(ArchiveFileName); TarWriter:= TTarWriter.Create(FTarFileName, @AskQuestion, @RaiseAbortOperation, @CheckOperationState, @UpdateStatistics ); Result:= False; end; end; try if TarWriter.ProcessTree(FFullFilesTree, FStatistics) then begin if Result and (PackingFlags and PK_PACK_MOVE_FILES <> 0) then DeleteFiles(FFullFilesTree) else begin // Fill file list with tar archive file FFullFilesTree.Clear; FFullFilesTree.Path:= ExtractFilePath(FTarFileName); FFullFilesTree.Add(TFileSystemFileSource.CreateFileFromFile(FTarFileName)); end; end; finally FreeAndNil(TarWriter); end; end; end. doublecmd-0.5.8/src/filesources/wcxarchive/uwcxarchivelistoperation.pas0000644000175000017500000000275111753503774025656 0ustar alexxalexxunit uWcxArchiveListOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceListOperation, uWcxArchiveFileSource, uFileSource; type TWcxArchiveListOperation = class(TFileSourceListOperation) private FWcxArchiveFileSource: IWcxArchiveFileSource; public constructor Create(aFileSource: IFileSource; aPath: String); override; procedure MainExecute; override; end; implementation uses uOSUtils, DCStrUtils, uWCXmodule, uFile; constructor TWcxArchiveListOperation.Create(aFileSource: IFileSource; aPath: String); begin FFiles := TFiles.Create(aPath); FWcxArchiveFileSource := aFileSource as IWcxArchiveFileSource; inherited Create(aFileSource, aPath); end; procedure TWcxArchiveListOperation.MainExecute; var I : Integer; CurrFileName : String; // Current file name ArcFileList: TList; aFile: TFile; begin FFiles.Clear; if not FileSource.IsPathAtRoot(Path) then begin aFile := TWcxArchiveFileSource.CreateFile(Path); aFile.Name := '..'; aFile.Attributes := faFolder; FFiles.Add(AFile); end; ArcFileList := FWcxArchiveFileSource.ArchiveFileList; for I := 0 to ArcFileList.Count - 1 do begin CheckOperationState; CurrFileName := PathDelim + TWCXHeader(ArcFileList.Items[I]).FileName; if not IsInPath(Path, CurrFileName, False, False) then Continue; aFile := TWcxArchiveFileSource.CreateFile(Path, TWCXHeader(ArcFileList.Items[I])); FFiles.Add(aFile); end; end; end. doublecmd-0.5.8/src/filesources/wcxarchive/fwcxarchivecopyoperationoptions.pas0000644000175000017500000000463211747211345027243 0ustar alexxalexxunit fWcxArchiveCopyOperationOptions; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, StdCtrls, ExtCtrls, uFileSourceOperationOptionsUI, uWcxArchiveCopyInOperation, uWcxArchiveCopyOutOperation; type { TWcxArchiveCopyOperationOptionsUI } TWcxArchiveCopyOperationOptionsUI = class(TFileSourceOperationOptionsUI) cmbFileExists: TComboBox; grpOptions: TGroupBox; lblFileExists: TLabel; private procedure SetOperationOptions(CopyInOperation: TWcxArchiveCopyInOperation); overload; procedure SetOperationOptions(CopyOutOperation: TWcxArchiveCopyOutOperation); overload; public constructor Create(AOwner: TComponent; AFileSource: IInterface); override; procedure SaveOptions; override; procedure SetOperationOptions(Operation: TObject); override; end; implementation {$R *.lfm} uses uGlobs, uFileSourceOperationOptions; { TWcxArchiveCopyOperationOptionsUI } constructor TWcxArchiveCopyOperationOptionsUI.Create(AOwner: TComponent; AFileSource: IInterface); begin inherited; // Load default options. case gOperationOptionFileExists of fsoofeNone : cmbFileExists.ItemIndex := 0; fsoofeOverwrite: cmbFileExists.ItemIndex := 1; fsoofeSkip : cmbFileExists.ItemIndex := 2; end; end; procedure TWcxArchiveCopyOperationOptionsUI.SaveOptions; begin // TODO: Saving options for each file source operation separately. end; procedure TWcxArchiveCopyOperationOptionsUI.SetOperationOptions(Operation: TObject); begin if Operation is TWcxArchiveCopyInOperation then SetOperationOptions(Operation as TWcxArchiveCopyInOperation) else if Operation is TWcxArchiveCopyOutOperation then SetOperationOptions(Operation as TWcxArchiveCopyOutOperation); end; procedure TWcxArchiveCopyOperationOptionsUI.SetOperationOptions(CopyInOperation: TWcxArchiveCopyInOperation); begin { with CopyInOperation do begin case cmbFileExists.ItemIndex of 0: FileExistsOption := fsoofeNone; 1: FileExistsOption := fsoofeOverwrite; 2: FileExistsOption := fsoofeSkip; end; end; } end; procedure TWcxArchiveCopyOperationOptionsUI.SetOperationOptions(CopyOutOperation: TWcxArchiveCopyOutOperation); begin with CopyOutOperation do begin case cmbFileExists.ItemIndex of 0: FileExistsOption := fsoofeNone; 1: FileExistsOption := fsoofeOverwrite; 2: FileExistsOption := fsoofeSkip; end; end; end; end. doublecmd-0.5.8/src/filesources/wcxarchive/uwcxarchivetestarchiveoperation.pas0000644000175000017500000002503711747211345027217 0ustar alexxalexxunit uWcxArchiveTestArchiveOperation; {$mode objfpc}{$H+} {$include calling.inc} interface uses Classes, SysUtils, WcxPlugin, uLog, uGlobs, uFileSourceTestArchiveOperation, uFileSource, uFileSourceOperation, uFile, uWcxArchiveFileSource; type { TWcxArchiveTestArchiveOperation } TWcxArchiveTestArchiveOperation = class(TFileSourceTestArchiveOperation) private FWcxArchiveFileSource: IWcxArchiveFileSource; FStatistics: TFileSourceTestArchiveOperationStatistics; // local copy of statistics FCurrentFileSize: Int64; procedure ShowError(sMessage: String; logOptions: TLogOptions = []); procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); protected procedure SetChangeVolProc(hArcData: TArcHandle); procedure SetProcessDataProc(hArcData: TArcHandle); public constructor Create(aSourceFileSource: IFileSource; var theSourceFiles: TFiles); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; class procedure ClearCurrentOperation; end; implementation uses FileUtil, DCOSUtils, DCStrUtils, uDCUtils, uShowMsg, uFileSourceOperationUI, uWCXmodule, uLng; // ---------------------------------------------------------------------------- // WCX callbacks var // This global variable is used to store currently running operation // for plugins that not supports background operations (see GetBackgroundFlags) WcxTestArchiveOperationG: TWcxArchiveTestArchiveOperation = nil; threadvar // This thread variable is used to store currently running operation // for plugins that supports background operations (see GetBackgroundFlags) WcxTestArchiveOperationT: TWcxArchiveTestArchiveOperation; function ChangeVolProc(var ArcName : UTF8String; Mode: LongInt): LongInt; begin Result:= 1; case Mode of PK_VOL_ASK: begin // Use operation UI for this? if not ShowInputQuery('Double Commander', rsMsgSelLocNextVol, ArcName) then Result := 0; // Abort operation end; PK_VOL_NOTIFY: if log_arc_op in gLogOptions then LogWrite(rsMsgNextVolUnpack + #32 + ArcName); end; end; function ChangeVolProcA(ArcName : PAnsiChar; Mode: LongInt): LongInt; dcpcall; var sArcName: UTF8String; begin sArcName:= SysToUTF8(StrPas(ArcName)); Result:= ChangeVolProc(sArcName, Mode); if Result <> 0 then StrPLCopy(ArcName, UTF8ToSys(sArcName), MAX_PATH); end; function ChangeVolProcW(ArcName : PWideChar; Mode: LongInt): LongInt; dcpcall; var sArcName: UTF8String; begin sArcName:= UTF8Encode(WideString(ArcName)); Result:= ChangeVolProc(sArcName, Mode); if Result <> 0 then StrPLCopyW(ArcName, UTF8Decode(sArcName), MAX_PATH); end; function ProcessDataProc(WcxTestArchiveOperation: TWcxArchiveTestArchiveOperation; FileName: UTF8String; Size: LongInt): LongInt; begin //DCDebug('Working (' + IntToStr(GetCurrentThreadId) + ') ' + FileName + ' Size = ' + IntToStr(Size)); Result := 1; if Assigned(WcxTestArchiveOperation) then begin if WcxTestArchiveOperation.State = fsosStopping then // Cancel operation Exit(0); with WcxTestArchiveOperation.FStatistics do begin if Size >= 0 then begin CurrentFileDoneBytes := CurrentFileDoneBytes + Size; DoneBytes := DoneBytes + Size; end else // For plugins which unpack in CloseArchive begin if (Size >= -100) and (Size <= -1) then // first percent bar begin CurrentFileDoneBytes := CurrentFileTotalBytes * (-Size) div 100; CurrentFileTotalBytes := 100; if Size = -100 then // File finished DoneBytes := DoneBytes + WcxTestArchiveOperation.FCurrentFileSize; //DCDebug('Working ' + FileName + ' Percent1 = ' + IntToStr(FFileOpDlg.iProgress1Pos)); end else if (Size >= -1100) and (Size <= -1000) then // second percent bar begin DoneBytes := TotalBytes * Int64(-Size - 1000) div 100; //DCDebug('Working ' + FileName + ' Percent2 = ' + IntToStr(FFileOpDlg.iProgress2Pos)); end else begin DoneBytes := DoneBytes + WcxTestArchiveOperation.FCurrentFileSize; end; end; WcxTestArchiveOperation.UpdateStatistics(WcxTestArchiveOperation.FStatistics); WcxTestArchiveOperation.CheckOperationState; end; end; end; function ProcessDataProcAG(FileName: PAnsiChar; Size: LongInt): LongInt; dcpcall; begin Result:= ProcessDataProc(WcxTestArchiveOperationG, SysToUTF8(StrPas(FileName)), Size); end; function ProcessDataProcWG(FileName: PWideChar; Size: LongInt): LongInt; dcpcall; begin Result:= ProcessDataProc(WcxTestArchiveOperationG, UTF8Encode(WideString(FileName)), Size); end; function ProcessDataProcAT(FileName: PAnsiChar; Size: LongInt): LongInt; dcpcall; begin Result:= ProcessDataProc(WcxTestArchiveOperationT, SysToUTF8(StrPas(FileName)), Size); end; function ProcessDataProcWT(FileName: PWideChar; Size: LongInt): LongInt; dcpcall; begin Result:= ProcessDataProc(WcxTestArchiveOperationT, UTF8Encode(WideString(FileName)), Size); end; // ---------------------------------------------------------------------------- constructor TWcxArchiveTestArchiveOperation.Create(aSourceFileSource: IFileSource; var theSourceFiles: TFiles); begin FWcxArchiveFileSource := aSourceFileSource as IWcxArchiveFileSource; inherited Create(aSourceFileSource, theSourceFiles); FNeedsConnection:= (FWcxArchiveFileSource.WcxModule.BackgroundFlags and BACKGROUND_UNPACK = 0); end; destructor TWcxArchiveTestArchiveOperation.Destroy; begin ClearCurrentOperation; inherited Destroy; end; procedure TWcxArchiveTestArchiveOperation.Initialize; begin // Is plugin allow multiple Operations? if FNeedsConnection then WcxTestArchiveOperationG := Self else WcxTestArchiveOperationT := Self; // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; FStatistics.ArchiveFile:= FWcxArchiveFileSource.ArchiveFileName; end; procedure TWcxArchiveTestArchiveOperation.MainExecute; var ArcHandle: TArcHandle; Header: TWCXHeader; OpenResult: Longint; iResult: Integer; Files: TFiles = nil; WcxModule: TWcxModule; begin WcxModule := FWcxArchiveFileSource.WcxModule; ArcHandle := WcxModule.OpenArchiveHandle(FWcxArchiveFileSource.ArchiveFileName, PK_OM_EXTRACT, OpenResult); if ArcHandle = 0 then begin AskQuestion(uWcxModule.GetErrorMsg(OpenResult), '', [fsourOk], fsourOk, fsourOk); RaiseAbortOperation; end; // Convert file list so that filenames are relative to archive root. Files := SourceFiles.Clone; ChangeFileListRoot(PathDelim, Files); try SetChangeVolProc(ArcHandle); SetProcessDataProc(ArcHandle); while (WcxModule.ReadWCXHeader(ArcHandle, Header) = E_SUCCESS) do try CheckOperationState; // Now check if the file is to be extracted. if (not FPS_ISDIR(Header.FileAttr)) // Omit directories (we handle them ourselves). and MatchesFileList(Files, Header.FileName) // Check if it's included in the filelist then begin with FStatistics do begin CurrentFile := Header.FileName; CurrentFileTotalBytes := Header.UnpSize; CurrentFileDoneBytes := 0; UpdateStatistics(FStatistics); FCurrentFileSize := Header.UnpSize; end; iResult := WcxModule.WcxProcessFile(ArcHandle, PK_TEST, EmptyStr, EmptyStr); if iResult <> E_SUCCESS then begin ShowError(Format(rsMsgLogError + rsMsgLogTest, [FWcxArchiveFileSource.ArchiveFileName + PathDelim + Header.FileName + ' - ' + GetErrorMsg(iResult)]), [log_arc_op]); // User aborted operation. if iResult = E_EABORTED then Break; end // Error else begin LogMessage(Format(rsMsgLogSuccess + rsMsgLogTest, [FWcxArchiveFileSource.ArchiveFileName + PathDelim + Header.FileName]), [log_arc_op], lmtSuccess); end; // Success end // Extract else // Skip begin iResult := WcxModule.WcxProcessFile(ArcHandle, PK_SKIP, EmptyStr, EmptyStr); //Check for errors if iResult <> E_SUCCESS then begin ShowError(Format(rsMsgLogError + rsMsgLogTest, [FWcxArchiveFileSource.ArchiveFileName + PathDelim + Header.FileName + ' - ' + GetErrorMsg(iResult)]), [log_arc_op]); end; end; // Skip finally FreeAndNil(Header); end; WcxModule.CloseArchive(ArcHandle); finally if Assigned(Files) then FreeAndNil(Files); end; end; procedure TWcxArchiveTestArchiveOperation.Finalize; begin ClearCurrentOperation; end; procedure TWcxArchiveTestArchiveOperation.ShowError(sMessage: String; logOptions: TLogOptions); begin if not gSkipFileOpError then begin if AskQuestion(sMessage, '', [fsourSkip, fsourCancel], fsourSkip, fsourAbort) = fsourAbort then begin RaiseAbortOperation; end; end else begin LogMessage(sMessage, logOptions, lmtError); end; end; procedure TWcxArchiveTestArchiveOperation.LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); begin case logMsgType of lmtError: if not (log_errors in gLogOptions) then Exit; lmtInfo: if not (log_info in gLogOptions) then Exit; lmtSuccess: if not (log_success in gLogOptions) then Exit; end; if logOptions <= gLogOptions then begin logWrite(Thread, sMessage, logMsgType); end; end; procedure TWcxArchiveTestArchiveOperation.SetChangeVolProc(hArcData: TArcHandle); begin with FWcxArchiveFileSource.WcxModule do WcxSetChangeVolProc(hArcData, @ChangeVolProcA, @ChangeVolProcW); end; procedure TWcxArchiveTestArchiveOperation.SetProcessDataProc(hArcData: TArcHandle); begin with FWcxArchiveFileSource.WcxModule do begin if FNeedsConnection then WcxSetProcessDataProc(hArcData, @ProcessDataProcAG, @ProcessDataProcWG) else WcxSetProcessDataProc(hArcData, @ProcessDataProcAT, @ProcessDataProcWT); end; end; class procedure TWcxArchiveTestArchiveOperation.ClearCurrentOperation; begin WcxTestArchiveOperationG := nil; end; end. doublecmd-0.5.8/src/filesources/wcxarchive/uwcxarchivefilesource.pas0000644000175000017500000007307711747211345025124 0ustar alexxalexxunit uWcxArchiveFileSource; {$mode objfpc}{$H+} {$include calling.inc} interface uses Classes, SysUtils, contnrs, syncobjs, StringHashList, WcxPlugin, uWCXmodule, uFile, uFileSourceProperty, uFileSourceOperationTypes, uArchiveFileSource, uFileProperty, uFileSource, uFileSourceOperation; type TWcxArchiveFileSourceConnection = class; { IWcxArchiveFileSource } IWcxArchiveFileSource = interface(IArchiveFileSource) ['{DB32E8A8-486B-4053-9448-4C145C1A33FA}'] function GetArcFileList: TObjectList; function GetPluginCapabilities: PtrInt; function GetWcxModule: TWcxModule; property ArchiveFileList: TObjectList read GetArcFileList; property PluginCapabilities: PtrInt read GetPluginCapabilities; property WcxModule: TWCXModule read GetWcxModule; end; { TWcxArchiveFileSource } TWcxArchiveFileSource = class(TArchiveFileSource, IWcxArchiveFileSource) private FModuleFileName: String; FPluginCapabilities: PtrInt; FArcFileList : TObjectList; FWcxModule: TWCXModule; FOpenResult: LongInt; function LoadModule: Boolean; procedure UnloadModule; procedure SetCryptCallback; function ReadArchive: Boolean; function GetArcFileList: TObjectList; function GetPluginCapabilities: PtrInt; function GetWcxModule: TWcxModule; function CreateConnection: TFileSourceConnection; procedure CreateConnections; procedure AddToConnectionQueue(Operation: TFileSourceOperation); procedure RemoveFromConnectionQueue(Operation: TFileSourceOperation); procedure AddConnection(Connection: TFileSourceConnection); procedure RemoveConnection(Connection: TFileSourceConnection); {en Searches connections list for a connection assigned to operation. } function FindConnectionByOperation(operation: TFileSourceOperation): TFileSourceConnection; virtual; procedure NotifyNextWaitingOperation(allowedOps: TFileSourceOperationTypes); procedure ClearCurrentOperation(Operation: TFileSourceOperation); protected procedure OperationFinished(Operation: TFileSourceOperation); override; function GetSupportedFileProperties: TFilePropertiesTypes; override; function SetCurrentWorkingDirectory(NewDir: String): Boolean; override; procedure DoReload(const PathsToReload: TPathsArray); override; public constructor Create(anArchiveFileSource: IFileSource; anArchiveFileName: String; aWcxPluginFileName: String; aWcxPluginCapabilities: PtrInt); reintroduce; constructor Create(anArchiveFileSource: IFileSource; anArchiveFileName: String; aWcxPluginModule: TWcxModule; aWcxPluginCapabilities: PtrInt); reintroduce; destructor Destroy; override; class function CreateFile(const APath: String; WcxHeader: TWCXHeader): TFile; overload; // Retrieve operations permitted on the source. = capabilities? function GetOperationsTypes: TFileSourceOperationTypes; override; // Retrieve some properties of the file source. function GetProperties: TFileSourceProperties; override; // These functions create an operation object specific to the file source. function CreateListOperation(TargetPath: String): TFileSourceOperation; override; function CreateCopyInOperation(SourceFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; override; function CreateCopyOutOperation(TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; override; function CreateDeleteOperation(var FilesToDelete: TFiles): TFileSourceOperation; override; function CreateExecuteOperation(var ExecutableFile: TFile; BasePath, Verb: String): TFileSourceOperation; override; function CreateTestArchiveOperation(var theSourceFiles: TFiles): TFileSourceOperation; override; function CreateCalcStatisticsOperation(var theFiles: TFiles): TFileSourceOperation; override; class function CreateByArchiveSign(anArchiveFileSource: IFileSource; anArchiveFileName: String): IWcxArchiveFileSource; class function CreateByArchiveType(anArchiveFileSource: IFileSource; anArchiveFileName: String; anArchiveType: String): IWcxArchiveFileSource; class function CreateByArchiveName(anArchiveFileSource: IFileSource; anArchiveFileName: String): IWcxArchiveFileSource; {en Returns @true if there is a plugin registered for the archive type (only extension is checked). } class function CheckPluginByExt(anArchiveType: String): Boolean; function GetConnection(Operation: TFileSourceOperation): TFileSourceConnection; override; procedure RemoveOperationFromQueue(Operation: TFileSourceOperation); override; property ArchiveFileList: TObjectList read FArcFileList; property PluginCapabilities: PtrInt read FPluginCapabilities; property WcxModule: TWCXModule read FWcxModule; end; { TWcxArchiveFileSourceConnection } TWcxArchiveFileSourceConnection = class(TFileSourceConnection) private FWcxModule: TWCXModule; public constructor Create(aWcxModule: TWCXModule); reintroduce; property WcxModule: TWCXModule read FWcxModule; end; EModuleNotLoadedException = class(EFileSourceException); implementation uses LCLProc, uDebug, DCStrUtils, uDCUtils, uGlobs, DCOSUtils, uOSUtils, DCDateTimeUtils, FileUtil, uCryptProc, uWcxArchiveListOperation, uWcxArchiveCopyInOperation, uWcxArchiveCopyOutOperation, uWcxArchiveDeleteOperation, uWcxArchiveExecuteOperation, uWcxArchiveTestArchiveOperation, uWcxArchiveCalcStatisticsOperation; const connCopyIn = 0; connCopyOut = 1; connDelete = 2; connTestArchive = 3; var // Always use appropriate lock to access these lists. WcxConnections: TObjectList; // store connections created by Wcx file sources WcxOperationsQueue: TObjectList; // store queued operations, use only under FOperationsQueueLock WcxConnectionsLock: TCriticalSection; // used to synchronize access to connections WcxOperationsQueueLock: TCriticalSection; // used to synchronize access to operations queue function CryptProc(CryptoNumber: Integer; Mode: Integer; ArchiveName: UTF8String; var Password: UTF8String): Integer; const cPrefix = 'wcx'; var sGroup, sPassword: AnsiString; begin try sGroup:= ExtractOnlyFileExt(ArchiveName); case Mode of PK_CRYPT_SAVE_PASSWORD: begin if PasswordStore.WritePassword(cPrefix, sGroup, ArchiveName, Password) then Result:= E_SUCCESS else Result:= E_EWRITE; end; PK_CRYPT_LOAD_PASSWORD, PK_CRYPT_LOAD_PASSWORD_NO_UI: begin Result:= E_EREAD; if (Mode = PK_CRYPT_LOAD_PASSWORD_NO_UI) and (PasswordStore.HasMasterKey = False) then Exit(E_NO_FILES); if PasswordStore.ReadPassword(cPrefix, sGroup, ArchiveName, Password) then Result:= E_SUCCESS; end; PK_CRYPT_COPY_PASSWORD, PK_CRYPT_MOVE_PASSWORD: begin Result:= E_EREAD; if PasswordStore.ReadPassword(cPrefix, sGroup, ArchiveName, sPassword) then begin if not PasswordStore.WritePassword(cPrefix, sGroup, Password, sPassword) then Exit(E_EWRITE); if Mode = PK_CRYPT_MOVE_PASSWORD then PasswordStore.DeletePassword(cPrefix, sGroup, ArchiveName); Result:= E_SUCCESS; end; end; PK_CRYPT_DELETE_PASSWORD: begin PasswordStore.DeletePassword(cPrefix, sGroup, ArchiveName); Result:= E_SUCCESS; end; end; except Result:= E_ECREATE; end; end; function CryptProcA(CryptoNumber: Integer; Mode: Integer; ArchiveName, Password: PAnsiChar; MaxLen: Integer): Integer; dcpcall; var sArchiveName, sPassword: UTF8String; begin sArchiveName:= SysToUTF8(StrPas(ArchiveName)); sPassword:= SysToUTF8(StrPas(Password)); Result:= CryptProc(CryptoNumber, Mode, sArchiveName, sPassword); if Result = E_SUCCESS then begin if Password <> nil then StrPLCopy(Password, UTF8ToSys(sPassword), MaxLen); end; end; function CryptProcW(CryptoNumber: Integer; Mode: Integer; ArchiveName, Password: PWideChar; MaxLen: Integer): Integer; dcpcall; var sArchiveName, sPassword: UTF8String; begin sArchiveName:= UTF8Encode(WideString(ArchiveName)); sPassword:= UTF8Encode(WideString(Password)); Result:= CryptProc(CryptoNumber, Mode, sArchiveName, sPassword); if Result = E_SUCCESS then begin if Password <> nil then StrPLCopyW(Password, UTF8Decode(sPassword), MaxLen); end; end; //-------------------------------------------------------------------------------------------------- class function TWcxArchiveFileSource.CreateByArchiveSign( anArchiveFileSource: IFileSource; anArchiveFileName: String): IWcxArchiveFileSource; var I: Integer; ModuleFileName: String; WcxPlugin: TWcxModule; bFound: Boolean = False; hArchive: TArcHandle; lOpenResult: LongInt; begin Result := nil; WcxPlugin:= TWcxModule.Create; // Check if there is a registered plugin for the archive file by content. for I := 0 to gWCXPlugins.Count - 1 do begin if (gWCXPlugins.Enabled[I]) then begin ModuleFileName := GetCmdDirFromEnvVar(gWCXPlugins.FileName[I]); if WcxPlugin.LoadModule(ModuleFileName) then begin if Assigned(WcxPlugin.CanYouHandleThisFileW) or Assigned(WcxPlugin.CanYouHandleThisFile) then begin bFound:= WcxPlugin.WcxCanYouHandleThisFile(anArchiveFileName); if bFound then Break; end else if ((gWCXPlugins.Flags[I] and PK_CAPS_BY_CONTENT) = PK_CAPS_BY_CONTENT) then begin hArchive:= WcxPlugin.OpenArchiveHandle(anArchiveFileName, PK_OM_LIST, lOpenResult); if (hArchive <> 0) and (lOpenResult = E_SUCCESS) then begin WcxPlugin.CloseArchive(hArchive); bFound:= True; Break; end; end else if ((gWCXPlugins.Flags[I] and PK_CAPS_HIDE) = PK_CAPS_HIDE) then begin bFound:= SameText(ExtractOnlyFileExt(anArchiveFileName), gWCXPlugins.Ext[I]); if bFound then Break; end; WcxPlugin.UnloadModule; end; end; end; if not bFound then WcxPlugin.Free else begin Result := TWcxArchiveFileSource.Create(anArchiveFileSource, anArchiveFileName, WcxPlugin, gWCXPlugins.Flags[I]); DCDebug('Found registered plugin ' + ModuleFileName + ' for archive ' + anArchiveFileName); end; end; class function TWcxArchiveFileSource.CreateByArchiveType( anArchiveFileSource: IFileSource; anArchiveFileName: String; anArchiveType: String): IWcxArchiveFileSource; var i: Integer; ModuleFileName: String; begin Result := nil; // Check if there is a registered plugin for the extension of the archive file name. for i := 0 to gWCXPlugins.Count - 1 do begin if SameText(anArchiveType, gWCXPlugins.Ext[i]) and (gWCXPlugins.Enabled[i]) and ((gWCXPlugins.Flags[I] and PK_CAPS_HIDE) <> PK_CAPS_HIDE) then begin ModuleFileName := GetCmdDirFromEnvVar(gWCXPlugins.FileName[I]); Result := TWcxArchiveFileSource.Create(anArchiveFileSource, anArchiveFileName, ModuleFileName, gWCXPlugins.Flags[I]); DCDebug('Found registered plugin ' + ModuleFileName + ' for archive ' + anArchiveFileName); break; end; end; end; class function TWcxArchiveFileSource.CreateByArchiveName( anArchiveFileSource: IFileSource; anArchiveFileName: String): IWcxArchiveFileSource; begin Result:= CreateByArchiveType(anArchiveFileSource, anArchiveFileName, ExtractOnlyFileExt(anArchiveFileName)); end; class function TWcxArchiveFileSource.CheckPluginByExt(anArchiveType: String): Boolean; var i: Integer; begin for i := 0 to gWCXPlugins.Count - 1 do begin if SameText(anArchiveType, gWCXPlugins.Ext[i]) and (gWCXPlugins.Enabled[i]) then Exit(True); end; Result := False; end; // ---------------------------------------------------------------------------- constructor TWcxArchiveFileSource.Create(anArchiveFileSource: IFileSource; anArchiveFileName: String; aWcxPluginFileName: String; aWcxPluginCapabilities: PtrInt); begin inherited Create(anArchiveFileSource, anArchiveFileName); FModuleFileName := aWcxPluginFileName; FPluginCapabilities := aWcxPluginCapabilities; FArcFileList := TObjectList.Create(True); FWcxModule := TWCXModule.Create; if LoadModule = False then raise EModuleNotLoadedException.Create('Cannot load WCX module ' + FModuleFileName); FOperationsClasses[fsoCopyIn] := TWcxArchiveCopyInOperation.GetOperationClass; FOperationsClasses[fsoCopyOut] := TWcxArchiveCopyOutOperation.GetOperationClass; SetCryptCallback; if mbFileExists(anArchiveFileName) then begin if not ReadArchive then raise Exception.Create(GetErrorMsg(FOpenResult)); end; CreateConnections; end; constructor TWcxArchiveFileSource.Create(anArchiveFileSource: IFileSource; anArchiveFileName: String; aWcxPluginModule: TWcxModule; aWcxPluginCapabilities: PtrInt); begin inherited Create(anArchiveFileSource, anArchiveFileName); FPluginCapabilities := aWcxPluginCapabilities; FArcFileList := TObjectList.Create(True); FWcxModule := aWcxPluginModule; FOperationsClasses[fsoCopyIn] := TWcxArchiveCopyInOperation.GetOperationClass; FOperationsClasses[fsoCopyOut] := TWcxArchiveCopyOutOperation.GetOperationClass; SetCryptCallback; if mbFileExists(anArchiveFileName) then begin if not ReadArchive then raise Exception.Create(GetErrorMsg(FOpenResult)); end; CreateConnections; end; destructor TWcxArchiveFileSource.Destroy; begin UnloadModule; inherited; if Assigned(FArcFileList) then FreeAndNil(FArcFileList); if Assigned(FWcxModule) then FreeAndNil(FWcxModule); end; class function TWcxArchiveFileSource.CreateFile(const APath: String; WcxHeader: TWCXHeader): TFile; begin Result := TFile.Create(APath); with Result do begin { FileCRC, CompressionMethod, Comment, } AttributesProperty := {TNtfsFileAttributesProperty or Unix?} TFileAttributesProperty.CreateOSAttributes(WcxHeader.FileAttr); if AttributesProperty.IsDirectory then begin SizeProperty := TFileSizeProperty.Create(0); CompressedSizeProperty := TFileCompressedSizeProperty.Create(0); end else begin SizeProperty := TFileSizeProperty.Create(WcxHeader.UnpSize); CompressedSizeProperty := TFileCompressedSizeProperty.Create(WcxHeader.PackSize); end; ModificationTimeProperty := TFileModificationDateTimeProperty.Create(0); try ModificationTime := WcxFileTimeToDateTime(WcxHeader); except on EConvertError do; end; // Set name after assigning Attributes property, because it is used to get extension. Name := ExtractFileName(WcxHeader.FileName); end; end; function TWcxArchiveFileSource.GetOperationsTypes: TFileSourceOperationTypes; begin Result := [fsoList, fsoCopyOut, fsoTestArchive, fsoExecute, fsoCalcStatistics]; // by default with FWcxModule do begin if (((FPluginCapabilities and PK_CAPS_NEW) <> 0) or ((FPluginCapabilities and PK_CAPS_MODIFY) <> 0)) and (Assigned(PackFiles) or Assigned(PackFilesW)) then Result:= Result + [fsoCopyIn]; if ((FPluginCapabilities and PK_CAPS_DELETE) <> 0) and (Assigned(DeleteFiles) or Assigned(DeleteFilesW)) then Result:= Result + [fsoDelete]; end; end; function TWcxArchiveFileSource.GetProperties: TFileSourceProperties; begin Result := [fspUsesConnections]; end; function TWcxArchiveFileSource.GetSupportedFileProperties: TFilePropertiesTypes; begin Result := inherited GetSupportedFileProperties; end; function TWcxArchiveFileSource.SetCurrentWorkingDirectory(NewDir: String): Boolean; var I: Integer; Header: TWCXHeader; begin Result := False; if Length(NewDir) > 0 then begin if NewDir = GetRootDir() then Exit(True); NewDir := IncludeTrailingPathDelimiter(NewDir); // Search file list for a directory with name NewDir. for I := 0 to FArcFileList.Count - 1 do begin Header := TWCXHeader(FArcFileList.Items[I]); if FPS_ISDIR(Header.FileAttr) and (Length(Header.FileName) > 0) then begin if NewDir = IncludeTrailingPathDelimiter(GetRootDir() + Header.FileName) then Exit(True); end; end; end; end; function TWcxArchiveFileSource.LoadModule: Boolean; begin Result := WcxModule.LoadModule(FModuleFileName); end; procedure TWcxArchiveFileSource.UnloadModule; begin WcxModule.UnloadModule; end; procedure TWcxArchiveFileSource.SetCryptCallback; var iFlags: Integer; begin if not PasswordStore.HasMasterKey then iFlags:= 0 else iFlags:= PK_CRYPTOPT_MASTERPASS_SET; FWcxModule.WcxSetCryptCallback(0, iFlags, @CryptProcA, @CryptProcW); end; function TWcxArchiveFileSource.GetArcFileList: TObjectList; begin Result := FArcFileList; end; function TWcxArchiveFileSource.GetPluginCapabilities: PtrInt; begin Result := FPluginCapabilities; end; function TWcxArchiveFileSource.GetWcxModule: TWcxModule; begin Result := FWcxModule; end; function TWcxArchiveFileSource.CreateListOperation(TargetPath: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TWcxArchiveListOperation.Create(TargetFileSource, TargetPath); end; function TWcxArchiveFileSource.CreateCopyInOperation( SourceFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TWcxArchiveCopyInOperation.Create(SourceFileSource, TargetFileSource, SourceFiles, TargetPath); end; function TWcxArchiveFileSource.CreateCopyOutOperation( TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; var SourceFileSource: IFileSource; begin SourceFileSource := Self; Result := TWcxArchiveCopyOutOperation.Create(SourceFileSource, TargetFileSource, SourceFiles, TargetPath); end; function TWcxArchiveFileSource.CreateDeleteOperation(var FilesToDelete: TFiles): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TWcxArchiveDeleteOperation.Create(TargetFileSource, FilesToDelete); end; function TWcxArchiveFileSource.CreateExecuteOperation(var ExecutableFile: TFile; BasePath, Verb: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result:= TWcxArchiveExecuteOperation.Create(TargetFileSource, ExecutableFile, BasePath, Verb); end; function TWcxArchiveFileSource.CreateTestArchiveOperation(var theSourceFiles: TFiles): TFileSourceOperation; var SourceFileSource: IFileSource; begin SourceFileSource := Self; Result:= TWcxArchiveTestArchiveOperation.Create(SourceFileSource, theSourceFiles); end; function TWcxArchiveFileSource.CreateCalcStatisticsOperation( var theFiles: TFiles): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TWcxArchiveCalcStatisticsOperation.Create(TargetFileSource, theFiles); end; function TWcxArchiveFileSource.ReadArchive: Boolean; procedure CollectDirs(Path: PAnsiChar; var DirsList: TStringHashList); var I : Integer; Dir : AnsiString; begin // Scan from the second char from the end, to the second char from the beginning. for I := strlen(Path) - 2 downto 1 do begin if Path[I] = PathDelim then begin SetString(Dir, Path, I); if DirsList.Find(Dir) = -1 then // Add directory and continue scanning for parent directories. DirsList.Add(Dir) else // This directory is already in the list and we assume // that all parent directories are too. Exit; end end; end; var ArcHandle : TArcHandle; Header: TWCXHeader; AllDirsList, ExistsDirList : TStringHashList; I : Integer; NameLength: Integer; begin Result:= False; if not mbFileAccess(ArchiveFileName, fmOpenRead) then begin FOpenResult := E_EREAD; Exit; end; DCDebug('Open Archive'); (*Open Archive*) ArcHandle := WcxModule.OpenArchiveHandle(ArchiveFileName, PK_OM_LIST, FOpenResult); if ArcHandle = 0 then Exit; WcxModule.WcxSetChangeVolProc(ArcHandle, nil, nil {ChangeVolProc}); WcxModule.WcxSetProcessDataProc(ArcHandle, nil, nil {ProcessDataProc}); DCDebug('Get File List'); (*Get File List*) FArcFileList.Clear; ExistsDirList := TStringHashList.Create(True); AllDirsList := TStringHashList.Create(True); try while (WcxModule.ReadWCXHeader(ArcHandle, Header) = E_SUCCESS) do begin // Some plugins end directories with path delimiter. Delete it if present. if FPS_ISDIR(Header.FileAttr) then begin NameLength := Length(Header.FileName); if (Header.FileName[NameLength] = PathDelim) then Delete(Header.FileName, NameLength, 1); //**************************** (* Workaround for plugins that don't give a list of folders or the list does not include all of the folders. *) // Collect directories that the plugin supplies. if (ExistsDirList.Find(Header.FileName) < 0) then ExistsDirList.Add(Header.FileName); end; // Collect all directories. CollectDirs(PAnsiChar(Header.FileName), AllDirsList); //**************************** FArcFileList.Add(Header); // get next file FOpenResult := WcxModule.WcxProcessFile(ArcHandle, PK_SKIP, EmptyStr, EmptyStr); // Check for errors if FOpenResult <> E_SUCCESS then Exit; end; // while (* if plugin does not give a list of folders *) for I := 0 to AllDirsList.Count - 1 do begin // Add only those directories that were not supplied by the plugin. if ExistsDirList.Find(AllDirsList.List[I]^.Key) < 0 then begin Header := TWCXHeader.Create; try Header.FileName := AllDirsList.List[I]^.Key; Header.ArcName := ArchiveFileName; Header.FileAttr := faFolder; {$IFDEF MSWINDOWS} WinToDosTime(mbFileAge(ArchiveFileName), Header.FileTime); {$ELSE} {$PUSH}{$R-} Header.FileTime := LongInt(mbFileAge(ArchiveFileName)); {$POP} {$ENDIF} FArcFileList.Add(Header); except FreeAndNil(Header); end; end; end; Result:= True; finally AllDirsList.Free; ExistsDirList.Free; WcxModule.CloseArchive(ArcHandle); end; end; procedure TWcxArchiveFileSource.AddToConnectionQueue(Operation: TFileSourceOperation); begin WcxOperationsQueueLock.Acquire; try if WcxOperationsQueue.IndexOf(Operation) < 0 then WcxOperationsQueue.Add(Operation); finally WcxOperationsQueueLock.Release; end; end; procedure TWcxArchiveFileSource.RemoveFromConnectionQueue(Operation: TFileSourceOperation); begin WcxOperationsQueueLock.Acquire; try WcxOperationsQueue.Remove(Operation); finally WcxOperationsQueueLock.Release; end; end; procedure TWcxArchiveFileSource.AddConnection(Connection: TFileSourceConnection); begin WcxConnectionsLock.Acquire; try if WcxConnections.IndexOf(Connection) < 0 then WcxConnections.Add(Connection); finally WcxConnectionsLock.Release; end; end; procedure TWcxArchiveFileSource.RemoveConnection(Connection: TFileSourceConnection); begin WcxConnectionsLock.Acquire; try WcxConnections.Remove(Connection); finally WcxConnectionsLock.Release; end; end; function TWcxArchiveFileSource.GetConnection(Operation: TFileSourceOperation): TFileSourceConnection; begin Result := nil; case Operation.ID of fsoCopyIn: Result := WcxConnections[connCopyIn] as TFileSourceConnection; fsoCopyOut: Result := WcxConnections[connCopyOut] as TFileSourceConnection; fsoDelete: Result := WcxConnections[connDelete] as TFileSourceConnection; fsoTestArchive: Result := WcxConnections[connTestArchive] as TFileSourceConnection; else begin Result := CreateConnection; if Assigned(Result) then AddConnection(Result); end; end; if Assigned(Result) then Result := TryAcquireConnection(Result, Operation); // No available connection - wait. if not Assigned(Result) then AddToConnectionQueue(Operation) else // Connection acquired. // The operation may have been waiting in the queue // for the connection, so remove it from the queue. RemoveFromConnectionQueue(Operation); end; procedure TWcxArchiveFileSource.RemoveOperationFromQueue(Operation: TFileSourceOperation); begin RemoveFromConnectionQueue(Operation); end; function TWcxArchiveFileSource.CreateConnection: TFileSourceConnection; begin Result := TWcxArchiveFileSourceConnection.Create(FWcxModule); end; procedure TWcxArchiveFileSource.CreateConnections; begin WcxConnectionsLock.Acquire; try if WcxConnections.Count = 0 then begin // Reserve some connections (only once). WcxConnections.Add(CreateConnection); // connCopyIn WcxConnections.Add(CreateConnection); // connCopyOut WcxConnections.Add(CreateConnection); // connDelete WcxConnections.Add(CreateConnection); // connTestArchive end; finally WcxConnectionsLock.Release; end; end; function TWcxArchiveFileSource.FindConnectionByOperation(operation: TFileSourceOperation): TFileSourceConnection; var i: Integer; connection: TFileSourceConnection; begin Result := nil; WcxConnectionsLock.Acquire; try for i := 0 to WcxConnections.Count - 1 do begin connection := WcxConnections[i] as TFileSourceConnection; if connection.AssignedOperation = operation then Exit(connection); end; finally WcxConnectionsLock.Release; end; end; procedure TWcxArchiveFileSource.OperationFinished(Operation: TFileSourceOperation); var allowedIDs: TFileSourceOperationTypes = []; connection: TFileSourceConnection; begin ClearCurrentOperation(Operation); connection := FindConnectionByOperation(Operation); if Assigned(connection) then begin connection.Release; // unassign operation WcxConnectionsLock.Acquire; try // If there are operations waiting, take the first one and notify // that a connection is available. // Only check operation types for which there are reserved connections. if Operation.ID in [fsoCopyIn, fsoCopyOut, fsoDelete, fsoTestArchive] then begin Include(allowedIDs, Operation.ID); NotifyNextWaitingOperation(allowedIDs); end else begin WcxConnections.Remove(connection); end; finally WcxConnectionsLock.Release; end; end; end; procedure TWcxArchiveFileSource.NotifyNextWaitingOperation(allowedOps: TFileSourceOperationTypes); var i: Integer; operation: TFileSourceOperation; begin WcxOperationsQueueLock.Acquire; try for i := 0 to WcxOperationsQueue.Count - 1 do begin operation := WcxOperationsQueue.Items[i] as TFileSourceOperation; if (operation.State = fsosWaitingForConnection) and (operation.ID in allowedOps) then begin operation.ConnectionAvailableNotify; Exit; end; end; finally WcxOperationsQueueLock.Release; end; end; procedure TWcxArchiveFileSource.ClearCurrentOperation(Operation: TFileSourceOperation); begin case Operation.ID of fsoCopyIn: TWcxArchiveCopyInOperation.ClearCurrentOperation; fsoCopyOut: TWcxArchiveCopyOutOperation.ClearCurrentOperation; fsoDelete: TWcxArchiveDeleteOperation.ClearCurrentOperation; fsoTestArchive: TWcxArchiveTestArchiveOperation.ClearCurrentOperation; end; end; procedure TWcxArchiveFileSource.DoReload(const PathsToReload: TPathsArray); begin ReadArchive; end; { TWcxArchiveFileSourceConnection } constructor TWcxArchiveFileSourceConnection.Create(aWcxModule: TWCXModule); begin FWcxModule := aWcxModule; inherited Create; end; initialization WcxConnections := TObjectList.Create(True); // True = destroy objects when destroying list WcxConnectionsLock := TCriticalSection.Create; WcxOperationsQueue := TObjectList.Create(False); // False = don't destroy operations (only store references) WcxOperationsQueueLock := TCriticalSection.Create; finalization FreeThenNil(WcxConnections); FreeThenNil(WcxConnectionsLock); FreeThenNil(WcxOperationsQueue); FreeThenNil(WcxOperationsQueueLock); end. doublecmd-0.5.8/src/filesources/wcxarchive/uwcxarchivedeleteoperation.pas0000644000175000017500000002117211747211345026134 0ustar alexxalexxunit uWcxArchiveDeleteOperation; {$mode objfpc}{$H+} {$include calling.inc} interface uses Classes, SysUtils, uFileSourceDeleteOperation, uFileSource, uFileSourceOperation, uFileSourceOperationUI, uFile, uWcxArchiveFileSource, uGlobs, uLog; type TWcxArchiveDeleteOperation = class(TFileSourceDeleteOperation) private FWcxArchiveFileSource: IWcxArchiveFileSource; FStatistics: TFileSourceDeleteOperationStatistics; // local copy of statistics procedure CountFiles(const theFiles: TFiles; FileMask: String); {en Convert TFiles into a string separated with #0 (format used by WCX). } function GetFileList(const theFiles: TFiles): String; protected procedure ShowError(sMessage: String; logOptions: TLogOptions); procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); public constructor Create(aTargetFileSource: IFileSource; var theFilesToDelete: TFiles); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; class procedure ClearCurrentOperation; end; implementation uses DCOSUtils, DCStrUtils, uDCUtils, uLng, uShowMsg, uWCXmodule, WcxPlugin, uMasks, FileUtil, LCLProc; // ---------------------------------------------------------------------------- // WCX callbacks var // WCX interface cannot discern different operations (for reporting progress), // so this global variable is used to store currently running operation. // (There may be other running concurrently, but only one may report progress.) WcxDeleteOperation: TWcxArchiveDeleteOperation = nil; function ChangeVolProc(var ArcName : UTF8String; Mode: LongInt): LongInt; begin Result:= 1; case Mode of PK_VOL_ASK: begin // Use operation UI for this? if not ShowInputQuery('Double Commander', rsMsgSelLocNextVol, ArcName) then Result := 0; // Abort operation end; PK_VOL_NOTIFY: if log_arc_op in gLogOptions then LogWrite(rsMsgNextVolUnpack + #32 + ArcName); end; end; function ChangeVolProcA(ArcName : PAnsiChar; Mode: LongInt): LongInt; dcpcall; var sArcName: UTF8String; begin sArcName:= SysToUTF8(StrPas(ArcName)); Result:= ChangeVolProc(sArcName, Mode); if Result <> 0 then StrPLCopy(ArcName, UTF8ToSys(sArcName), MAX_PATH); end; function ChangeVolProcW(ArcName : PWideChar; Mode: LongInt): LongInt; dcpcall; var sArcName: UTF8String; begin sArcName:= UTF8Encode(WideString(ArcName)); Result:= ChangeVolProc(sArcName, Mode); if Result <> 0 then StrPLCopyW(ArcName, UTF8Decode(sArcName), MAX_PATH); end; function ProcessDataProc(FileName: UTF8String; Size: LongInt): LongInt; begin //DCDebug('Working ' + FileName + ' Size = ' + IntToStr(Size)); Result := 1; if Assigned(WcxDeleteOperation) then begin if WcxDeleteOperation.State = fsosStopping then // Cancel operation Exit(0); with WcxDeleteOperation.FStatistics do begin CurrentFile := FileName; if Size >= 0 then begin DoneBytes := DoneBytes + Size; DoneFiles := DoneFiles + 1; end else // For plugins which unpack in CloseArchive begin if (Size >= -100) and (Size <= -1) then // first percent bar begin if Size = -100 then // File finished begin //DoneBytes := DoneBytes + {FileSize(FileName)}; DoneFiles := DoneFiles + 1; end; end else if (Size >= -1100) and (Size <= -1000) then // second percent bar begin DoneBytes := TotalBytes * Int64(-Size - 1000) div 100; DoneFiles := DoneFiles + 1; end else begin DoneFiles := DoneFiles + 1; end; end; WcxDeleteOperation.UpdateStatistics(WcxDeleteOperation.FStatistics); WcxDeleteOperation.CheckOperationState; end; end; end; function ProcessDataProcA(FileName: PAnsiChar; Size: LongInt): LongInt; dcpcall; begin Result:= ProcessDataProc(SysToUTF8(StrPas(FileName)), Size); end; function ProcessDataProcW(FileName: PWideChar; Size: LongInt): LongInt; dcpcall; begin Result:= ProcessDataProc(UTF8Encode(WideString(FileName)), Size); end; // ---------------------------------------------------------------------------- constructor TWcxArchiveDeleteOperation.Create(aTargetFileSource: IFileSource; var theFilesToDelete: TFiles); begin FWcxArchiveFileSource := aTargetFileSource as IWcxArchiveFileSource; inherited Create(aTargetFileSource, theFilesToDelete); end; destructor TWcxArchiveDeleteOperation.Destroy; begin ClearCurrentOperation; inherited Destroy; end; procedure TWcxArchiveDeleteOperation.Initialize; begin if Assigned(WcxDeleteOperation) and (WcxDeleteOperation <> Self) then raise Exception.Create('Another WCX delete operation is already running'); WcxDeleteOperation := Self; // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; CountFiles(FilesToDelete, '*.*'); end; procedure TWcxArchiveDeleteOperation.MainExecute; var iResult: Integer; WcxModule: TWcxModule; begin WcxModule := FWcxArchiveFileSource.WcxModule; WcxModule.WcxSetChangeVolProc(wcxInvalidHandle, @ChangeVolProcA, @ChangeVolProcW); WcxModule.WcxSetProcessDataProc(wcxInvalidHandle, @ProcessDataProcA, @ProcessDataProcW); iResult := WcxModule.WcxDeleteFiles(FWcxArchiveFileSource.ArchiveFileName, GetFileList(FilesToDelete)); // Check for errors. if iResult <> E_SUCCESS then begin ShowError(Format(rsMsgLogError + rsMsgLogDelete, [FWcxArchiveFileSource.ArchiveFileName + ' - ' + GetErrorMsg(iResult)]), [log_arc_op]); end else begin LogMessage(Format(rsMsgLogSuccess + rsMsgLogDelete, [FWcxArchiveFileSource.ArchiveFileName]), [log_arc_op], lmtSuccess); end; end; procedure TWcxArchiveDeleteOperation.Finalize; begin ClearCurrentOperation; end; procedure TWcxArchiveDeleteOperation.ShowError(sMessage: String; logOptions: TLogOptions); begin if not gSkipFileOpError then begin if AskQuestion(sMessage, '', [fsourSkip, fsourCancel], fsourSkip, fsourAbort) = fsourAbort then begin RaiseAbortOperation; end; end else begin LogMessage(sMessage, logOptions, lmtError); end; end; procedure TWcxArchiveDeleteOperation.LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); begin case logMsgType of lmtError: if not (log_errors in gLogOptions) then Exit; lmtInfo: if not (log_info in gLogOptions) then Exit; lmtSuccess: if not (log_success in gLogOptions) then Exit; end; if logOptions <= gLogOptions then begin logWrite(Thread, sMessage, logMsgType); end; end; procedure TWcxArchiveDeleteOperation.CountFiles(const theFiles: TFiles; FileMask: String); var i: Integer; Header: TWCXHeader; ArcFileList: TList; begin ArcFileList := FWcxArchiveFileSource.ArchiveFileList; for i := 0 to ArcFileList.Count - 1 do begin Header := TWCXHeader(ArcFileList.Items[I]); // Check if the file from the archive fits the selection given via theFiles. if (not FPS_ISDIR(Header.FileAttr)) // Omit directories and MatchesFileList(theFiles, Header.FileName) // Check if it's included in the filelist and ((FileMask = '*.*') or (FileMask = '*') // And name matches file mask or MatchesMaskList(ExtractFileName(Header.FileName), FileMask)) then begin Inc(FStatistics.TotalBytes, Header.UnpSize); Inc(FStatistics.TotalFiles, 1); end; end; UpdateStatistics(FStatistics); end; function TWcxArchiveDeleteOperation.GetFileList(const theFiles: TFiles): String; var I : Integer; FileName : String; begin Result := ''; for I := 0 to theFiles.Count - 1 do begin // Filenames must be relative to archive root and shouldn't start with path delimiter. FileName := ExcludeFrontPathDelimiter(theFiles[I].FullPath); //ExtractDirLevel(FWcxArchiveFileSource.GetRootString, theFiles[I].FullPath) // Special treatment of directories. if theFiles[i].IsDirectory then // TC ends paths to directories to be deleted with '\*.*' // (which means delete this directory and all files in it). FileName := IncludeTrailingPathDelimiter(FileName) + '*.*'; Result := Result + FileName + #0; end; Result := Result + #0; end; class procedure TWcxArchiveDeleteOperation.ClearCurrentOperation; begin WcxDeleteOperation := nil; end; end. doublecmd-0.5.8/src/filesources/wcxarchive/uwcxarchiveexecuteoperation.pas0000644000175000017500000000314011747211345026327 0ustar alexxalexxunit uWcxArchiveExecuteOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFile, uFileSource, uFileSourceExecuteOperation, uWcxArchiveFileSource; type { TWcxArchiveExecuteOperation } TWcxArchiveExecuteOperation = class(TFileSourceExecuteOperation) private FWcxArchiveFileSource: IWcxArchiveFileSource; public {en @param(aTargetFileSource File source where the file should be executed.) @param(aExecutableFile File that should be executed.) @param(aCurrentPath Path of the file source where the execution should take place.) } constructor Create(aTargetFileSource: IFileSource; var aExecutableFile: TFile; aCurrentPath, aVerb: UTF8String); override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; end; implementation uses fPackInfoDlg; constructor TWcxArchiveExecuteOperation.Create( aTargetFileSource: IFileSource; var aExecutableFile: TFile; aCurrentPath, aVerb: UTF8String); begin FWcxArchiveFileSource := aTargetFileSource as IWcxArchiveFileSource; inherited Create(aTargetFileSource, aExecutableFile, aCurrentPath, aVerb); end; procedure TWcxArchiveExecuteOperation.Initialize; begin end; procedure TWcxArchiveExecuteOperation.MainExecute; begin FExecuteOperationResult:= ShowPackInfoDlg(FWcxArchiveFileSource, ExecutableFile); end; procedure TWcxArchiveExecuteOperation.Finalize; begin end; end. doublecmd-0.5.8/src/filesources/wcxarchive/uwcxarchivecalcstatisticsoperation.pas0000644000175000017500000000674611747211345027721 0ustar alexxalexxunit uWcxArchiveCalcStatisticsOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceCalcStatisticsOperation, uFileSource, uWcxArchiveFileSource, uFile; type TWcxArchiveCalcStatisticsOperation = class(TFileSourceCalcStatisticsOperation) private FWcxArchiveFileSource: IWcxArchiveFileSource; FStatistics: TFileSourceCalcStatisticsOperationStatistics; // local copy of statistics procedure ProcessFile(aFile: TFile); procedure ProcessSubDirs(const srcPath: String); public constructor Create(aTargetFileSource: IFileSource; var theFiles: TFiles); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; end; implementation uses DCOSUtils, uWcxModule, DCStrUtils; constructor TWcxArchiveCalcStatisticsOperation.Create( aTargetFileSource: IFileSource; var theFiles: TFiles); begin inherited Create(aTargetFileSource, theFiles); FWcxArchiveFileSource:= aTargetFileSource as IWcxArchiveFileSource; end; destructor TWcxArchiveCalcStatisticsOperation.Destroy; begin inherited Destroy; end; procedure TWcxArchiveCalcStatisticsOperation.Initialize; begin // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; end; procedure TWcxArchiveCalcStatisticsOperation.MainExecute; var CurrentFileIndex: Integer; begin for CurrentFileIndex := 0 to Files.Count - 1 do begin ProcessFile(Files[CurrentFileIndex]); CheckOperationState; end; end; procedure TWcxArchiveCalcStatisticsOperation.ProcessFile(aFile: TFile); begin FStatistics.CurrentFile := aFile.Path + aFile.Name; UpdateStatistics(FStatistics); if aFile.IsDirectory then begin Inc(FStatistics.Directories); ProcessSubDirs(aFile.Path + aFile.Name + DirectorySeparator); end else if aFile.IsLink then begin Inc(FStatistics.Links); end else begin // Not always this will be regular file (on Unix can be socket, FIFO, block, char, etc.) // Maybe check with: FPS_ISREG() on Unix? Inc(FStatistics.Files); FStatistics.Size := FStatistics.Size + aFile.Size; if aFile.ModificationTime < FStatistics.OldestFile then FStatistics.OldestFile := aFile.ModificationTime; if aFile.ModificationTime > FStatistics.NewestFile then FStatistics.NewestFile := aFile.ModificationTime; end; UpdateStatistics(FStatistics); end; procedure TWcxArchiveCalcStatisticsOperation.ProcessSubDirs(const srcPath: String); var I: Integer; Header: TWCXHeader; CurrFileName: UTF8String; ModificationTime: TDateTime; begin for I:= 0 to FWcxArchiveFileSource.ArchiveFileList.Count - 1 do begin Header := TWCXHeader(FWcxArchiveFileSource.ArchiveFileList.Items[I]); CurrFileName := PathDelim + Header.FileName; if not IsInPath(srcPath, CurrFileName, True, False) then Continue; if FPS_ISDIR(Header.FileAttr) then Inc(FStatistics.Directories) else if FPS_ISLNK(Header.FileAttr) then Inc(FStatistics.Links) else begin Inc(FStatistics.Files); FStatistics.Size := FStatistics.Size + Header.UnpSize; ModificationTime:= WcxFileTimeToDateTime(Header); if ModificationTime < FStatistics.OldestFile then FStatistics.OldestFile := ModificationTime; if ModificationTime > FStatistics.NewestFile then FStatistics.NewestFile := ModificationTime; end; end; end; end. doublecmd-0.5.8/src/filesources/wcxarchive/uwcxarchivecopyoutoperation.pas0000644000175000017500000005211711767323062026401 0ustar alexxalexxunit uWcxArchiveCopyOutOperation; {$mode objfpc}{$H+} {$include calling.inc} interface uses Classes, SysUtils, StringHashList, WcxPlugin, uLog, uGlobs, uFileSourceCopyOperation, uFileSource, uFileSourceOperation, uFileSourceOperationOptions, uFileSourceOperationOptionsUI, uFile, uWcxArchiveFileSource; type { TWcxArchiveCopyOutOperation } TWcxArchiveCopyOutOperation = class(TFileSourceCopyOutOperation) private FWcxArchiveFileSource: IWcxArchiveFileSource; FStatistics: TFileSourceCopyOperationStatistics; // local copy of statistics FCurrentFileSize: Int64; FRenamingFiles: Boolean; FRenameNameMask, FRenameExtMask: String; // Options. FFileExistsOption: TFileSourceOperationOptionFileExists; FExtractWithoutPath: Boolean; {en Creates neccessary paths before extracting files from archive. Also counts size of all files that will be extracted. @param(Files List of files/directories to extract (relative to archive root).) @param(FileMask Only directories containing files matching this mask will be created.) @param(sDestPath Destination path where the files will be extracted.) @param(CurrentArchiveDir Path inside the archive from where the files will be extracted.) @param(CreatedPaths This list will be filled with absolute paths to directories that were created, together with their attributes.)} procedure CreateDirsAndCountFiles(const theFiles: TFiles; FileMask: String; sDestPath: String; CurrentArchiveDir: String; var CreatedPaths: TStringHashList); {en Sets attributes for directories. @param(Paths The list of absolute paths, which attributes are to be set. Each list item's data field must be a pointer to THeaderData, from where the attributes are retrieved.} function SetDirsAttributes(const Paths: TStringHashList): Boolean; function DoFileExists(const AbsoluteTargetFileName: String): TFileSourceOperationOptionFileExists; procedure ShowError(sMessage: String; logOptions: TLogOptions = []); procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); protected procedure SetChangeVolProc(hArcData: TArcHandle); procedure SetProcessDataProc(hArcData: TArcHandle); public constructor Create(aSourceFileSource: IFileSource; aTargetFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; class procedure ClearCurrentOperation; function GetDescription(Details: TFileSourceOperationDescriptionDetails): String; override; class function GetOptionsUIClass: TFileSourceOperationOptionsUIClass; override; property FileExistsOption: TFileSourceOperationOptionFileExists read FFileExistsOption write FFileExistsOption; property ExtractWithoutPath: Boolean read FExtractWithoutPath write FExtractWithoutPath; end; implementation uses LCLProc, uMasks, FileUtil, contnrs, DCOSUtils, DCStrUtils, uDCUtils, uShowMsg, uFileSourceOperationUI, fWcxArchiveCopyOperationOptions, uWCXmodule, uFileProcs, uLng, DCDateTimeUtils, DCBasicTypes; // ---------------------------------------------------------------------------- // WCX callbacks var // This global variable is used to store currently running operation // for plugins that not supports background operations (see GetBackgroundFlags) WcxCopyOutOperationG: TWcxArchiveCopyOutOperation = nil; threadvar // This thread variable is used to store currently running operation // for plugins that supports background operations (see GetBackgroundFlags) WcxCopyOutOperationT: TWcxArchiveCopyOutOperation; function ChangeVolProc(var ArcName : UTF8String; Mode: LongInt): LongInt; begin Result:= 1; case Mode of PK_VOL_ASK: begin // Use operation UI for this? if not ShowInputQuery('Double Commander', rsMsgSelLocNextVol, ArcName) then Result := 0; // Abort operation end; PK_VOL_NOTIFY: if log_arc_op in gLogOptions then LogWrite(rsMsgNextVolUnpack + #32 + ArcName); end; end; function ChangeVolProcA(ArcName : PAnsiChar; Mode: LongInt): LongInt; dcpcall; var sArcName: UTF8String; begin sArcName:= SysToUTF8(StrPas(ArcName)); Result:= ChangeVolProc(sArcName, Mode); if Result <> 0 then StrPLCopy(ArcName, UTF8ToSys(sArcName), MAX_PATH); end; function ChangeVolProcW(ArcName : PWideChar; Mode: LongInt): LongInt; dcpcall; var sArcName: UTF8String; begin sArcName:= UTF8Encode(WideString(ArcName)); Result:= ChangeVolProc(sArcName, Mode); if Result <> 0 then StrPLCopyW(ArcName, UTF8Decode(sArcName), MAX_PATH); end; function ProcessDataProc(WcxCopyOutOperation: TWcxArchiveCopyOutOperation; FileName: UTF8String; Size: LongInt): LongInt; begin //DCDebug('Working (' + IntToStr(GetCurrentThreadId) + ') ' + FileName + ' Size = ' + IntToStr(Size)); Result := 1; if Assigned(WcxCopyOutOperation) then begin if WcxCopyOutOperation.State = fsosStopping then // Cancel operation Exit(0); with WcxCopyOutOperation.FStatistics do begin if Size >= 0 then begin CurrentFileDoneBytes := CurrentFileDoneBytes + Size; if CurrentFileDoneBytes > CurrentFileTotalBytes then CurrentFileDoneBytes := CurrentFileTotalBytes; DoneBytes := DoneBytes + Size; end else // For plugins which unpack in CloseArchive begin if (Size >= -100) and (Size <= -1) then // first percent bar begin CurrentFileDoneBytes := CurrentFileTotalBytes * (-Size) div 100; end else if (Size >= -1100) and (Size <= -1000) then // second percent bar begin DoneBytes := TotalBytes * Int64(-Size - 1000) div 100; end; end; //DCDebug('CurrentDone = ' + IntToStr(CurrentFileDoneBytes) + ' Done = ' + IntToStr(DoneBytes)); //DCDebug('CurrentTotal = ' + IntToStr(CurrentFileTotalBytes) + ' Total = ' + IntToStr(TotalBytes)); WcxCopyOutOperation.UpdateStatistics(WcxCopyOutOperation.FStatistics); WcxCopyOutOperation.CheckOperationState; end; end; end; function ProcessDataProcAG(FileName: PAnsiChar; Size: LongInt): LongInt; dcpcall; begin Result:= ProcessDataProc(WcxCopyOutOperationG, SysToUTF8(StrPas(FileName)), Size); end; function ProcessDataProcWG(FileName: PWideChar; Size: LongInt): LongInt; dcpcall; begin Result:= ProcessDataProc(WcxCopyOutOperationG, UTF8Encode(WideString(FileName)), Size); end; function ProcessDataProcAT(FileName: PAnsiChar; Size: LongInt): LongInt; dcpcall; begin Result:= ProcessDataProc(WcxCopyOutOperationT, SysToUTF8(StrPas(FileName)), Size); end; function ProcessDataProcWT(FileName: PWideChar; Size: LongInt): LongInt; dcpcall; begin Result:= ProcessDataProc(WcxCopyOutOperationT, UTF8Encode(WideString(FileName)), Size); end; // ---------------------------------------------------------------------------- constructor TWcxArchiveCopyOutOperation.Create(aSourceFileSource: IFileSource; aTargetFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); begin FWcxArchiveFileSource := aSourceFileSource as IWcxArchiveFileSource; FFileExistsOption := fsoofeNone; FExtractWithoutPath := False; inherited Create(aSourceFileSource, aTargetFileSource, theSourceFiles, aTargetPath); FNeedsConnection:= (FWcxArchiveFileSource.WcxModule.BackgroundFlags and BACKGROUND_UNPACK = 0); end; destructor TWcxArchiveCopyOutOperation.Destroy; begin ClearCurrentOperation; inherited Destroy; end; procedure TWcxArchiveCopyOutOperation.Initialize; begin // Is plugin allow multiple Operations? if FNeedsConnection then WcxCopyOutOperationG := Self else WcxCopyOutOperationT := Self; // Check rename mask FRenamingFiles := (RenameMask <> '*.*') and (RenameMask <> ''); if FRenamingFiles then SplitFileMask(RenameMask, FRenameNameMask, FRenameExtMask); // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; end; procedure TWcxArchiveCopyOutOperation.MainExecute; var ArcHandle: TArcHandle; Header: TWCXHeader; TargetFileName: String; FileMask: String; CreatedPaths: TStringHashList; OpenResult: Longint; iResult: Integer; Files: TFiles = nil; WcxModule: TWcxModule; begin WcxModule := FWcxArchiveFileSource.WcxModule; ArcHandle := WcxModule.OpenArchiveHandle(FWcxArchiveFileSource.ArchiveFileName, PK_OM_EXTRACT, OpenResult); if ArcHandle = 0 then begin AskQuestion(uWcxModule.GetErrorMsg(OpenResult), '', [fsourOk], fsourOk, fsourOk); RaiseAbortOperation; end; FileMask := ExtractFileName(TargetPath); if FileMask = '' then FileMask := '*'; // extract all selected files/folders // Convert file list so that filenames are relative to archive root. Files := SourceFiles.Clone; ChangeFileListRoot(PathDelim, Files); CreatedPaths := TStringHashList.Create(True); try // Count total files size and create needed directories. CreateDirsAndCountFiles(Files, FileMask, TargetPath, Files.Path, CreatedPaths); SetChangeVolProc(ArcHandle); SetProcessDataProc(ArcHandle); while (WcxModule.ReadWCXHeader(ArcHandle, Header) = E_SUCCESS) do try CheckOperationState; // Now check if the file is to be extracted. if (not FPS_ISDIR(Header.FileAttr)) // Omit directories (we handle them ourselves). and MatchesFileList(Files, Header.FileName) // Check if it's included in the filelist and ((FileMask = '*.*') or (FileMask = '*') // And name matches file mask or MatchesMaskList(ExtractFileName(Header.FileName), FileMask)) then begin if FExtractWithoutPath then TargetFileName := TargetPath + ExtractFileName(Header.FileName) else TargetFileName := TargetPath + ExtractDirLevel(Files.Path, Header.FileName); if FRenamingFiles then begin TargetFileName := ExtractFilePath(TargetFileName) + ApplyRenameMask(ExtractFileName(TargetFileName), FRenameNameMask, FRenameExtMask); end; with FStatistics do begin CurrentFileFrom := Header.FileName; CurrentFileTo := TargetFileName; CurrentFileTotalBytes := Header.UnpSize; CurrentFileDoneBytes := 0; UpdateStatistics(FStatistics); FCurrentFileSize := Header.UnpSize; end; if (DoFileExists(TargetFileName) = fsoofeOverwrite) then iResult := WcxModule.WcxProcessFile(ArcHandle, PK_EXTRACT, EmptyStr, TargetFileName) else iResult := WcxModule.WcxProcessFile(ArcHandle, PK_SKIP, EmptyStr, EmptyStr); if iResult <> E_SUCCESS then begin ShowError(Format(rsMsgLogError + rsMsgLogExtract, [FWcxArchiveFileSource.ArchiveFileName + PathDelim + Header.FileName + ' -> ' + TargetFileName + ' - ' + GetErrorMsg(iResult)]), [log_arc_op]); // User aborted operation. if iResult = E_EABORTED then Break; end // Error else begin LogMessage(Format(rsMsgLogSuccess + rsMsgLogExtract, [FWcxArchiveFileSource.ArchiveFileName + PathDelim + Header.FileName +' -> ' + TargetFileName]), [log_arc_op], lmtSuccess); end; // Success end // Extract else // Skip begin iResult := WcxModule.WcxProcessFile(ArcHandle, PK_SKIP, EmptyStr, EmptyStr); //Check for errors if iResult <> E_SUCCESS then begin ShowError(Format(rsMsgLogError + rsMsgLogExtract, [FWcxArchiveFileSource.ArchiveFileName + PathDelim + Header.FileName + ' -> ' + TargetFileName + ' - ' + GetErrorMsg(iResult)]), [log_arc_op]); end; end; // Skip finally FreeAndNil(Header); end; WcxModule.CloseArchive(ArcHandle); if (FExtractWithoutPath = False) then SetDirsAttributes(CreatedPaths); finally if Assigned(Files) then FreeAndNil(Files); FreeAndNil(CreatedPaths); end; end; procedure TWcxArchiveCopyOutOperation.Finalize; begin ClearCurrentOperation; end; function TWcxArchiveCopyOutOperation.GetDescription(Details: TFileSourceOperationDescriptionDetails): String; begin case Details of fsoddJobAndTarget: Result := Format(rsOperExtractingFromTo, [FWcxArchiveFileSource.ArchiveFileName, TargetPath]); else Result := rsOperExtracting; end; end; procedure TWcxArchiveCopyOutOperation.CreateDirsAndCountFiles( const theFiles: TFiles; FileMask: String; sDestPath: String; CurrentArchiveDir: String; var CreatedPaths: TStringHashList); var // List of paths that we know must be created. PathsToCreate: TStringHashList; // List of possible directories to create with their attributes. // This hash list is created to speed up searches for attributes in archive file list. DirsAttributes: TStringHashList; i: Integer; CurrentFileName: String; Header: TWCXHeader; Directories: TStringList = nil; PathIndex: Integer; ListIndex: Integer; TargetDir: String; FileList: TObjectList; begin FileList := FWcxArchiveFileSource.ArchiveFileList; { First, collect all the paths that need to be created and their attributes. } PathsToCreate := TStringHashList.Create(True); DirsAttributes := TStringHashList.Create(True); for i := 0 to FileList.Count - 1 do begin Header := TWCXHeader(FileList.Items[i]); // Check if the file from the archive fits the selection given via SourceFiles. if not MatchesFileList(theFiles, Header.FileName) then Continue; if FPS_ISDIR(Header.FileAttr) then begin CurrentFileName := ExtractDirLevel(CurrentArchiveDir, Header.FileName); // Save this directory and a pointer to its entry. DirsAttributes.Add(CurrentFileName, Header); // If extracting all files and directories, add this directory // to PathsToCreate so that empty directories are also created. if (FileMask = '*.*') or (FileMask = '*') then begin // Paths in PathsToCreate list must end with path delimiter. CurrentFileName := IncludeTrailingPathDelimiter(CurrentFileName); if PathsToCreate.Find(CurrentFileName) < 0 then PathsToCreate.Add(CurrentFileName); end; end else begin if ((FileMask = '*.*') or (FileMask = '*') or MatchesMaskList(ExtractFileName(Header.FileName), FileMask)) then begin Inc(FStatistics.TotalBytes, Header.UnpSize); Inc(FStatistics.TotalFiles, 1); CurrentFileName := ExtractDirLevel(CurrentArchiveDir, ExtractFilePath(Header.FileName)); // If CurrentFileName is empty now then it was a file in current archive // directory, therefore we don't have to create any paths for it. if Length(CurrentFileName) > 0 then if PathsToCreate.Find(CurrentFileName) < 0 then PathsToCreate.Add(CurrentFileName); end; end; end; if FExtractWithoutPath then Exit; { Second, create paths and save which paths were created and their attributes. } Directories := TStringList.Create; try sDestPath := IncludeTrailingPathDelimiter(sDestPath); // Create path to destination directory (we don't have attributes for that). mbForceDirectory(sDestPath); CreatedPaths.Clear; for PathIndex := 0 to PathsToCreate.Count - 1 do begin Directories.Clear; // Create also all parent directories of the path to create. // This adds directories to list in order from the outer to inner ones, // for example: dir, dir/dir2, dir/dir2/dir3. if GetDirs(PathsToCreate.List[PathIndex]^.Key, Directories) <> -1 then try for i := 0 to Directories.Count - 1 do begin TargetDir := sDestPath + Directories.Strings[i]; if (CreatedPaths.Find(TargetDir) = -1) and (not DirPathExists(TargetDir)) then begin if mbForceDirectory(TargetDir) = False then begin // Error, cannot create directory. Break; // Don't try to create subdirectories. end else begin // Retrieve attributes for this directory, if they are stored. ListIndex := DirsAttributes.Find(Directories.Strings[i]); if ListIndex <> -1 then Header := TWcxHeader(DirsAttributes.List[ListIndex]^.Data) else Header := nil; CreatedPaths.Add(TargetDir, Header); end; end; end; except end; end; finally FreeAndNil(PathsToCreate); FreeAndNil(DirsAttributes); FreeThenNil(Directories); end; end; function TWcxArchiveCopyOutOperation.SetDirsAttributes(const Paths: TStringHashList): Boolean; var PathIndex: Integer; TargetDir: String; Header: TWCXHeader; Time: TFileTime; begin Result := True; for PathIndex := 0 to Paths.Count - 1 do begin // Get attributes. Header := TWCXHeader(Paths.List[PathIndex]^.Data); if Assigned(Header) then begin TargetDir := Paths.List[PathIndex]^.Key; try {$IF DEFINED(MSWINDOWS)} // Restore attributes, e.g., hidden, read-only. // On Unix attributes value would have to be translated somehow. mbFileSetAttr(TargetDir, Header.FileAttr); DosToWinTime(TDosFileTime(Header.FileTime), Time); {$ELSE} {$PUSH}{$R-} Time := Header.FileTime; {$POP} {$ENDIF} // Set creation, modification time mbFileSetTime(TargetDir, Time, Time, Time); except Result := False; end; end; end; end; function TWcxArchiveCopyOutOperation.DoFileExists(const AbsoluteTargetFileName: String): TFileSourceOperationOptionFileExists; const PossibleResponses: array[0..4] of TFileSourceOperationUIResponse = (fsourOverwrite, fsourSkip, fsourOverwriteAll, fsourSkipAll, fsourCancel); begin case FFileExistsOption of fsoofeNone: begin if not mbFileExists(AbsoluteTargetFileName) then Result:= fsoofeOverwrite else case AskQuestion(Format(rsMsgFileExistsRwrt, [AbsoluteTargetFileName]), '', PossibleResponses, fsourOverwrite, fsourSkip) of fsourOverwrite: Result := fsoofeOverwrite; fsourSkip: Result := fsoofeSkip; fsourOverwriteAll: begin FFileExistsOption := fsoofeOverwrite; Result := fsoofeOverwrite; end; fsourSkipAll: begin FFileExistsOption := fsoofeSkip; Result := fsoofeSkip; end; fsourNone, fsourCancel: RaiseAbortOperation; end; end; else Result := FFileExistsOption; end; end; procedure TWcxArchiveCopyOutOperation.ShowError(sMessage: String; logOptions: TLogOptions); begin if not gSkipFileOpError then begin if AskQuestion(sMessage, '', [fsourSkip, fsourAbort], fsourSkip, fsourAbort) = fsourAbort then begin RaiseAbortOperation; end; end else begin LogMessage(sMessage, logOptions, lmtError); end; end; procedure TWcxArchiveCopyOutOperation.LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); begin case logMsgType of lmtError: if not (log_errors in gLogOptions) then Exit; lmtInfo: if not (log_info in gLogOptions) then Exit; lmtSuccess: if not (log_success in gLogOptions) then Exit; end; if logOptions <= gLogOptions then begin logWrite(Thread, sMessage, logMsgType); end; end; procedure TWcxArchiveCopyOutOperation.SetChangeVolProc(hArcData: TArcHandle); begin with FWcxArchiveFileSource.WcxModule do WcxSetChangeVolProc(hArcData, @ChangeVolProcA, @ChangeVolProcW); end; procedure TWcxArchiveCopyOutOperation.SetProcessDataProc(hArcData: TArcHandle); begin with FWcxArchiveFileSource.WcxModule do begin if FNeedsConnection then WcxSetProcessDataProc(hArcData, @ProcessDataProcAG, @ProcessDataProcWG) else WcxSetProcessDataProc(hArcData, @ProcessDataProcAT, @ProcessDataProcWT); end; end; class procedure TWcxArchiveCopyOutOperation.ClearCurrentOperation; begin WcxCopyOutOperationG := nil; end; class function TWcxArchiveCopyOutOperation.GetOptionsUIClass: TFileSourceOperationOptionsUIClass; begin Result:= TWcxArchiveCopyOperationOptionsUI; end; end. doublecmd-0.5.8/src/filesources/wcxarchive/fwcxarchivecopyoperationoptions.lfm0000644000175000017500000000167011747211345027235 0ustar alexxalexxinherited WcxArchiveCopyOperationOptionsUI: TWcxArchiveCopyOperationOptionsUI Height = 158 Width = 549 AutoSize = True BorderSpacing.Around = 6 ClientHeight = 158 ClientWidth = 549 TabOrder = 0 DesignLeft = 535 DesignTop = 391 object lblFileExists: TLabel[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = cmbFileExists AnchorSideTop.Side = asrCenter Left = 6 Height = 14 Top = 3 Width = 77 BorderSpacing.Around = 6 Caption = 'When file exists' FocusControl = cmbFileExists ParentColor = False end object cmbFileExists: TComboBox[1] AnchorSideLeft.Control = lblFileExists AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = Owner Left = 91 Height = 21 Top = 0 Width = 109 BorderSpacing.Left = 8 ItemHeight = 13 Items.Strings = ( 'Ask' 'Overwrite' 'Skip' ) Style = csDropDownList TabOrder = 0 end end doublecmd-0.5.8/src/filesources/wcxarchive/fwcxarchivecopyoperationoptions.lrt0000644000175000017500000000011111747211345027245 0ustar alexxalexxTWCXARCHIVECOPYOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION=When file exists doublecmd-0.5.8/src/filesources/ufilesourcemoveoperation.pas0000644000175000017500000001246111747211345023473 0ustar alexxalexxunit uFileSourceMoveOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, syncobjs, uFileSourceOperation, uFileSourceOperationTypes, uFileSource, uFile, uFileSourceCopyOperation; type TFileSourceMoveOperationStatistics = TFileSourceCopyOperationStatistics; {en Operation that moves or renames files within the same file source (for example: in the same archive, in the same ftp server). } { TFileSourceMoveOperation } TFileSourceMoveOperation = class(TFileSourceOperation) private FStatistics: TFileSourceMoveOperationStatistics; FStatisticsAtStartTime: TFileSourceMoveOperationStatistics; FStatisticsLock: TCriticalSection; // NewStatistics.DoneBytes then begin with NewStatistics do begin RemainingTime := EstimateRemainingTime(FStatisticsAtStartTime.DoneBytes, DoneBytes, TotalBytes, StartTime, SysUtils.Now, BytesPerSecond); // Update overall progress. if TotalBytes <> 0 then UpdateProgress(DoneBytes/TotalBytes); end; end; FStatistics := NewStatistics; finally FStatisticsLock.Release; end; end; procedure TFileSourceMoveOperation.UpdateStatisticsAtStartTime; begin FStatisticsLock.Acquire; try Self.FStatisticsAtStartTime := Self.FStatistics; finally FStatisticsLock.Release; end; end; function TFileSourceMoveOperation.RetrieveStatistics: TFileSourceMoveOperationStatistics; begin // Statistics have to be synchronized because there are multiple values // and they all have to be consistent at every moment. FStatisticsLock.Acquire; try Result := Self.FStatistics; finally FStatisticsLock.Release; end; end; function TFileSourceMoveOperation.GetID: TFileSourceOperationType; begin Result := fsoMove; end; procedure TFileSourceMoveOperation.DoReloadFileSources; var Paths: TPathsArray; begin SetLength(Paths, 2); Paths[0] := FSourceFiles.Path; // Move source path Paths[1] := FTargetPath; // Move target path FFileSource.Reload(Paths); end; function TFileSourceMoveOperation.GetDescription(Details: TFileSourceOperationDescriptionDetails): String; begin case Details of fsoddJobAndTarget: begin if SourceFiles.Count = 1 then Result := Format(rsOperMovingSomethingTo, [SourceFiles[0].Name, TargetPath]) else Result := Format(rsOperMovingFromTo, [SourceFiles.Path, TargetPath]); end; else Result := rsOperMoving; end; end; end. doublecmd-0.5.8/src/filesources/ufilesource.pas0000644000175000017500000007136512205645056020673 0ustar alexxalexxunit uFileSource; {$mode objfpc}{$H+} interface uses Classes, SysUtils, DCStrUtils, syncobjs, LCLProc, uFileSourceOperation, uFileSourceOperationTypes, uFileSourceProperty, uFileProperty, uFile; type TFileSource = class; TFileSourceConnection = class; IFileSource = interface; TPathsArray = array of string; TFileSourceOperationsClasses = array[TFileSourceOperationType] of TFileSourceOperationClass; TFileSourceReloadEventNotify = procedure(const aFileSource: IFileSource; const ReloadedPaths: TPathsArray) of object; { IFileSource } IFileSource = interface(IInterface) ['{B7F0C4C8-59F6-4A35-A54C-E8242F4AD809}'] function Equals(aFileSource: IFileSource): Boolean; function IsInterface(InterfaceGuid: TGuid): Boolean; function IsClass(ClassType: TClass): Boolean; function GetClassName: String; function GetRefCount: Integer; function GetCurrentAddress: String; function GetCurrentWorkingDirectory: String; function SetCurrentWorkingDirectory(NewDir: String): Boolean; function GetSupportedFileProperties: TFilePropertiesTypes; function GetRetrievableFileProperties: TFilePropertiesTypes; function GetOperationsTypes: TFileSourceOperationTypes; function GetProperties: TFileSourceProperties; function GetFiles(TargetPath: String): TFiles; function GetParentFileSource: IFileSource; procedure SetParentFileSource(NewValue: IFileSource); function CreateFileObject(const APath: String): TFile; procedure RetrieveProperties(AFile: TFile; PropertiesToSet: TFilePropertiesTypes); function CanRetrieveProperties(AFile: TFile; PropertiesToSet: TFilePropertiesTypes): Boolean; function CreateListOperation(TargetPath: String): TFileSourceOperation; function CreateCopyOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; function CreateCopyInOperation(SourceFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; function CreateCopyOutOperation(TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; function CreateMoveOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; function CreateDeleteOperation(var FilesToDelete: TFiles): TFileSourceOperation; function CreateWipeOperation(var FilesToWipe: TFiles): TFileSourceOperation; function CreateSplitOperation(var aSourceFile: TFile; aTargetPath: String): TFileSourceOperation; function CreateCombineOperation(var theSourceFiles: TFiles; aTargetFile: String): TFileSourceOperation; function CreateCreateDirectoryOperation(BasePath: String; DirectoryPath: String): TFileSourceOperation; function CreateExecuteOperation(var ExecutableFile: TFile; BasePath, Verb: String): TFileSourceOperation; function CreateTestArchiveOperation(var theSourceFiles: TFiles): TFileSourceOperation; function CreateCalcChecksumOperation(var theFiles: TFiles; aTargetPath: String; aTargetMask: String): TFileSourceOperation; function CreateCalcStatisticsOperation(var theFiles: TFiles): TFileSourceOperation; function CreateSetFilePropertyOperation(var theTargetFiles: TFiles; var theNewProperties: TFileProperties): TFileSourceOperation; function GetOperationClass(OperationType: TFileSourceOperationType): TFileSourceOperationClass; function IsPathAtRoot(Path: String): Boolean; function GetParentDir(sPath : String): String; function GetRootDir(sPath : String): String; overload; function GetRootDir: String; overload; function GetPathType(sPath : String): TPathType; function GetFreeSpace(Path: String; out FreeSize, TotalSize : Int64) : Boolean; function GetLocalName(var aFile: TFile): Boolean; function GetConnection(Operation: TFileSourceOperation): TFileSourceConnection; procedure RemoveOperationFromQueue(Operation: TFileSourceOperation); procedure Reload(const PathsToReload: TPathsArray); procedure Reload(const PathToReload: String); procedure AddReloadEventListener(FunctionToCall: TFileSourceReloadEventNotify); procedure RemoveReloadEventListener(FunctionToCall: TFileSourceReloadEventNotify); property ClassName: String read GetClassName; property CurrentAddress: String read GetCurrentAddress; property ParentFileSource: IFileSource read GetParentFileSource write SetParentFileSource; property Properties: TFileSourceProperties read GetProperties; property SupportedFileProperties: TFilePropertiesTypes read GetSupportedFileProperties; property RetrievableFileProperties: TFilePropertiesTypes read GetRetrievableFileProperties; end; { TFileSource } TFileSource = class(TInterfacedObject, IFileSource) private FReloadEventListeners: TMethodList; {en File source on which this file source is dependent on (files that it accesses are on the parent file source). } FParentFileSource: IFileSource; {en Callback called when an operation assigned to a connection finishes. It just redirects to a virtual function. } procedure OperationFinishedCallback(Operation: TFileSourceOperation; State: TFileSourceOperationState); protected FCurrentAddress: String; FOperationsClasses: TFileSourceOperationsClasses; {en Retrieves the full address of the file source (the CurrentPath is relative to this). This may be used for specifying address: - archive : path to archive - network : address of server etc. } function GetCurrentAddress: String; virtual; {en Retrieves the current directory of the file source. } function GetCurrentWorkingDirectory: String; virtual; {en Sets the current directory for the file source. @returns(@true if path change was successful, @false otherwise) } function SetCurrentWorkingDirectory(NewDir: String): Boolean; virtual; {en Returns all the properties supported by the file type of the given file source. } function GetSupportedFileProperties: TFilePropertiesTypes; virtual; {en Returns all the file properties that can be retrieved by the file source. } function GetRetrievableFileProperties: TFilePropertiesTypes; virtual; function GetParentFileSource: IFileSource; procedure SetParentFileSource(NewValue: IFileSource); {en Checks if the connection is available and, if it is, assigns it to the operation. @returns(Connection object if the connection is available, @nil otherwise.) } function TryAcquireConnection(connection: TFileSourceConnection; operation: TFileSourceOperation): TFileSourceConnection; virtual; procedure OperationFinished(Operation: TFileSourceOperation); virtual; {en Reloads any internal file lists/caches. @param(PathsToReload Describes paths in file source from which file lists should be reloaded. The function may also reload any subpaths, though that is dependent on the specific file source implementation.) } procedure DoReload(const PathsToReload: TPathsArray); virtual; function CreateFileObject(const APath: String): TFile; public constructor Create; virtual; destructor Destroy; override; function Equals(aFileSource: IFileSource): Boolean; overload; function IsInterface(InterfaceGuid: TGuid): Boolean; function IsClass(aClassType: TClass): Boolean; function GetClassName: String; // For debugging purposes. function GetRefCount: Integer; // For debugging purposes. // Retrieve operations permitted on the source. = capabilities? function GetOperationsTypes: TFileSourceOperationTypes; virtual; // Retrieve some properties of the file source. function GetProperties: TFileSourceProperties; virtual; // Retrieves a list of files. // This is the same as GetOperation(fsoList), executing it // and returning the result of Operation.ReleaseFiles. // Caller is responsible for freeing the result list. function GetFiles(TargetPath: String): TFiles; virtual; // Create an empty TFile object with appropriate properties for the file. class function CreateFile(const APath: String): TFile; virtual; procedure RetrieveProperties(AFile: TFile; PropertiesToSet: TFilePropertiesTypes); virtual; function CanRetrieveProperties(AFile: TFile; PropertiesToSet: TFilePropertiesTypes): Boolean; virtual; // These functions create an operation object specific to the file source. function CreateListOperation(TargetPath: String): TFileSourceOperation; virtual; function CreateCopyOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; virtual; function CreateCopyInOperation(SourceFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; virtual; function CreateCopyOutOperation(TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; virtual; function CreateMoveOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; virtual; function CreateDeleteOperation(var FilesToDelete: TFiles): TFileSourceOperation; virtual; function CreateWipeOperation(var FilesToWipe: TFiles): TFileSourceOperation; virtual; function CreateSplitOperation(var aSourceFile: TFile; aTargetPath: String): TFileSourceOperation; virtual; function CreateCombineOperation(var theSourceFiles: TFiles; aTargetFile: String): TFileSourceOperation; virtual; function CreateCreateDirectoryOperation(BasePath: String; DirectoryPath: String): TFileSourceOperation; virtual; function CreateExecuteOperation(var ExecutableFile: TFile; BasePath, Verb: String): TFileSourceOperation; virtual; function CreateTestArchiveOperation(var theSourceFiles: TFiles): TFileSourceOperation; virtual; function CreateCalcChecksumOperation(var theFiles: TFiles; aTargetPath: String; aTargetMask: String): TFileSourceOperation; virtual; function CreateCalcStatisticsOperation(var theFiles: TFiles): TFileSourceOperation; virtual; function CreateSetFilePropertyOperation(var theTargetFiles: TFiles; var theNewProperties: TFileProperties): TFileSourceOperation; virtual; function GetOperationClass(OperationType: TFileSourceOperationType): TFileSourceOperationClass; {en Returns @true if the given path is supported by the file source, @false otherwise. } class function IsSupportedPath(const Path: String): Boolean; virtual; {en Returns @true if the given path is the root path of the file source, @false otherwise. } function IsPathAtRoot(Path: String): Boolean; virtual; function GetParentDir(sPath : String): String; virtual; function GetRootDir(sPath : String): String; virtual; overload; function GetRootDir: String; virtual; overload; function GetPathType(sPath : String): TPathType; virtual; function GetFreeSpace(Path: String; out FreeSize, TotalSize : Int64) : Boolean; virtual; function GetLocalName(var aFile: TFile): Boolean; virtual; function GetConnection(Operation: TFileSourceOperation): TFileSourceConnection; virtual; {en This function is to ensure the operation does not stay in the queue when it's being destroyed. } procedure RemoveOperationFromQueue(Operation: TFileSourceOperation); virtual; {en Reloads the file list from the file source. This is used if a file source has any internal cache or file list. Overwrite DoReload in descendant classes. } procedure Reload(const PathsToReload: TPathsArray); virtual; procedure Reload(const PathToReload: String); procedure AddReloadEventListener(FunctionToCall: TFileSourceReloadEventNotify); procedure RemoveReloadEventListener(FunctionToCall: TFileSourceReloadEventNotify); property CurrentAddress: String read GetCurrentAddress; property ParentFileSource: IFileSource read GetParentFileSource write SetParentFileSource; property Properties: TFileSourceProperties read GetProperties; property SupportedFileProperties: TFilePropertiesTypes read GetSupportedFileProperties; property RetrievableFileProperties: TFilePropertiesTypes read GetRetrievableFileProperties; end; { TFileSourceConnection } TFileSourceConnection = class private FAssignedOperation: TFileSourceOperation; FOperationLock: TCriticalSection; function GetAssignedOperation: TFileSourceOperation; protected FCurrentPath: String; // Always includes trailing path delimiter. function GetCurrentPath: String; virtual; procedure SetCurrentPath(NewPath: String); virtual; public constructor Create; virtual; destructor Destroy; override; function IsAvailable: Boolean; function Acquire(Operation: TFileSourceOperation): Boolean; procedure Release; property CurrentPath: String read GetCurrentPath write SetCurrentPath; property AssignedOperation: TFileSourceOperation read GetAssignedOperation; end; { TFileSources } TFileSources = class(TInterfaceList) private function Get(I: Integer): IFileSource; public procedure Assign(otherFileSources: TFileSources); property Items[I: Integer]: IFileSource read Get; default; end; { TFileSourceManager } TFileSourceManager = class private FFileSources: TFileSources; // Only allow adding and removing to/from Manager by TFileSource constructor and destructor. procedure Add(aFileSource: IFileSource); procedure Remove(aFileSource: IFileSource); public constructor Create; destructor Destroy; override; function Find(FileSourceClass: TClass; Address: String): IFileSource; end; EFileSourceException = class(Exception); EFileNotFound = class(EFileSourceException) private FFilePath: String; public constructor Create(const AFilePath: string); reintroduce; property FilePath: String read FFilePath; end; var FileSourceManager: TFileSourceManager; implementation uses uDebug, uFileSourceListOperation, uLng; { TFileSource } constructor TFileSource.Create; begin if ClassType = TFileSource then raise Exception.Create('Cannot construct abstract class'); inherited Create; FReloadEventListeners := TMethodList.Create; FileSourceManager.Add(Self); // Increases RefCount // We don't want to count the reference in Manager, because we want to detect // when there are no more references other than this single one in the Manager. // So, we remove this reference here. // When RefCount reaches 0 Destroy gets called and the last remaining reference // (in the Manager) is removed there. InterLockedDecrement(frefcount); DCDebug('Creating ', ClassName); end; destructor TFileSource.Destroy; begin DCDebug('Destroying ', ClassName, ' when refcount=', DbgS(refcount)); if RefCount <> 0 then begin // There could have been an exception raised in the constructor // in which case RefCount will be 1, so only issue warning if there was no exception. // This will check for any exception, but it's enough for a warning. if not Assigned(ExceptObject) then DCDebug('Error: RefCount <> 0 for ', Self.ClassName); end; if Assigned(FileSourceManager) then begin // Restore reference removed in Create and // remove the instance remaining in Manager. // Increase refcount by 2, because we don't want removing the last instance // from Manager to trigger another Destroy. // RefCount = 0 InterLockedIncrement(frefcount); InterLockedIncrement(frefcount); // RefCount = 2 FileSourceManager.Remove(Self); // RefCount = 1 InterLockedDecrement(frefcount); // RefCount = 0 (back at the final value) end else DCDebug('Error: Cannot remove file source - manager already destroyed!'); FreeAndNil(FReloadEventListeners); inherited Destroy; end; function TFileSource.Equals(aFileSource: IFileSource): Boolean; begin // Both interface variables must be brought to the same interface. Result := (Self as IFileSource) = (aFileSource as IFileSource); end; function TFileSource.IsInterface(InterfaceGuid: TGuid): Boolean; var t: TObject; begin Result := (Self.QueryInterface(InterfaceGuid, t) = S_OK); if Result then _Release; // QueryInterface increases refcount. end; function TFileSource.IsClass(aClassType: TClass): Boolean; begin Result := Self is aClassType; end; function TFileSource.GetClassName: String; begin Result := ClassName; end; function TFileSource.GetRefCount: Integer; begin Result := RefCount; end; function TFileSource.GetOperationsTypes: TFileSourceOperationTypes; begin Result := []; end; function TFileSource.GetProperties: TFileSourceProperties; begin Result := []; end; function TFileSource.GetCurrentAddress: String; begin Result := FCurrentAddress; end; function TFileSource.GetCurrentWorkingDirectory: String; begin Result := ''; end; function TFileSource.SetCurrentWorkingDirectory(NewDir: String): Boolean; begin // By default every path setting succeeds. Result := True; end; function TFileSource.GetSupportedFileProperties: TFilePropertiesTypes; begin Result := [fpName]; end; function TFileSource.GetRetrievableFileProperties: TFilePropertiesTypes; begin Result := []; end; function TFileSource.GetParentFileSource: IFileSource; begin Result := FParentFileSource; end; procedure TFileSource.SetParentFileSource(NewValue: IFileSource); begin FParentFileSource := NewValue; end; function TFileSource.IsPathAtRoot(Path: String): Boolean; begin Result := (Path = GetRootDir(Path)); end; function TFileSource.GetParentDir(sPath : String): String; begin Result := DCStrUtils.GetParentDir(sPath); end; function TFileSource.GetRootDir(sPath : String): String; begin // Default root is '/'. Override in descendant classes for other. Result := PathDelim; end; function TFileSource.GetRootDir: String; begin Result := GetRootDir(''); end; function TFileSource.GetPathType(sPath : String): TPathType; begin Result := ptNone; if sPath <> '' then begin // Default root is '/'. Override in descendant classes for other. if (sPath[1] = PathDelim) then Result := ptAbsolute else if ( Pos( PathDelim, sPath ) > 0 ) then Result := ptRelative; end; end; function TFileSource.GetFreeSpace(Path: String; out FreeSize, TotalSize : Int64) : Boolean; begin Result := False; // not supported by default end; function TFileSource.GetLocalName(var aFile: TFile): Boolean; begin Result:= False; end; // Operations. function TFileSource.GetFiles(TargetPath: String): TFiles; var Operation: TFileSourceOperation; ListOperation: TFileSourceListOperation; begin Result := nil; if fsoList in GetOperationsTypes then begin Operation := CreateListOperation(TargetPath); if Assigned(Operation) then try ListOperation := Operation as TFileSourceListOperation; ListOperation.Execute; Result := ListOperation.ReleaseFiles; finally FreeAndNil(Operation); end; end; end; class function TFileSource.CreateFile(const APath: String): TFile; begin Result := TFile.Create(APath); end; function TFileSource.CreateFileObject(const APath: String): TFile; begin Result := CreateFile(APath); end; procedure TFileSource.RetrieveProperties(AFile: TFile; PropertiesToSet: TFilePropertiesTypes); begin // Does not set any properties by default. end; function TFileSource.CanRetrieveProperties(AFile: TFile; PropertiesToSet: TFilePropertiesTypes): Boolean; begin Result := ((PropertiesToSet - AFile.AssignedProperties) * RetrievableFileProperties) <> []; end; function TFileSource.CreateListOperation(TargetPath: String): TFileSourceOperation; begin Result := nil; end; function TFileSource.CreateCopyOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; begin Result := nil; end; function TFileSource.CreateCopyInOperation(SourceFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; begin Result := nil; end; function TFileSource.CreateCopyOutOperation(TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; begin Result := nil; end; function TFileSource.CreateMoveOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; begin Result := nil; end; function TFileSource.CreateDeleteOperation(var FilesToDelete: TFiles): TFileSourceOperation; begin Result := nil; end; function TFileSource.CreateWipeOperation(var FilesToWipe: TFiles): TFileSourceOperation; begin Result := nil; end; function TFileSource.CreateSplitOperation(var aSourceFile: TFile; aTargetPath: String): TFileSourceOperation; begin Result := nil; end; function TFileSource.CreateCombineOperation(var theSourceFiles: TFiles; aTargetFile: String): TFileSourceOperation; begin Result := nil; end; function TFileSource.CreateCreateDirectoryOperation(BasePath: String; DirectoryPath: String): TFileSourceOperation; begin Result := nil; end; function TFileSource.CreateExecuteOperation(var ExecutableFile: TFile; BasePath, Verb: String): TFileSourceOperation; begin Result := nil; end; function TFileSource.CreateTestArchiveOperation(var theSourceFiles: TFiles): TFileSourceOperation; begin Result:= nil; end; function TFileSource.CreateCalcChecksumOperation(var theFiles: TFiles; aTargetPath: String; aTargetMask: String): TFileSourceOperation; begin Result := nil; end; function TFileSource.CreateCalcStatisticsOperation(var theFiles: TFiles): TFileSourceOperation; begin Result := nil; end; function TFileSource.CreateSetFilePropertyOperation(var theTargetFiles: TFiles; var theNewProperties: TFileProperties): TFileSourceOperation; begin Result := nil; end; function TFileSource.GetOperationClass(OperationType: TFileSourceOperationType): TFileSourceOperationClass; begin Result := FOperationsClasses[OperationType]; end; class function TFileSource.IsSupportedPath(const Path: String): Boolean; begin Result:= True; end; function TFileSource.GetConnection(Operation: TFileSourceOperation): TFileSourceConnection; begin // By default connections are not supported. Result := nil; end; function TFileSource.TryAcquireConnection(connection: TFileSourceConnection; operation: TFileSourceOperation): TFileSourceConnection; begin if connection.Acquire(operation) then begin // We must know when the operation is finished, // that is when the connection is free again. operation.AddStateChangedListener([fsosStopped], @OperationFinishedCallback); Result := connection; end else begin Result := nil; end; end; procedure TFileSource.RemoveOperationFromQueue(Operation: TFileSourceOperation); begin // Nothing by default. end; procedure TFileSource.OperationFinishedCallback(Operation: TFileSourceOperation; State: TFileSourceOperationState); begin if State = fsosStopped then begin Operation.RemoveStateChangedListener([fsosStopped], @OperationFinishedCallback); OperationFinished(Operation); end; end; procedure TFileSource.OperationFinished(Operation: TFileSourceOperation); begin // Nothing by default. end; procedure TFileSource.DoReload(const PathsToReload: TPathsArray); begin // Nothing by default. end; procedure TFileSource.Reload(const PathsToReload: TPathsArray); var i: Integer; FunctionToCall: TFileSourceReloadEventNotify; begin DoReload(PathsToReload); if Assigned(FReloadEventListeners) then for i := 0 to FReloadEventListeners.Count - 1 do begin FunctionToCall := TFileSourceReloadEventNotify(FReloadEventListeners.Items[i]); FunctionToCall(Self, PathsToReload); end; end; procedure TFileSource.Reload(const PathToReload: String); var PathsToReload: TPathsArray; begin SetLength(PathsToReload, 1); PathsToReload[0] := PathToReload; Reload(PathsToReload); end; procedure TFileSource.AddReloadEventListener(FunctionToCall: TFileSourceReloadEventNotify); begin FReloadEventListeners.Add(TMethod(FunctionToCall)); end; procedure TFileSource.RemoveReloadEventListener(FunctionToCall: TFileSourceReloadEventNotify); begin FReloadEventListeners.Remove(TMethod(FunctionToCall)); end; { TFileSourceConnection } constructor TFileSourceConnection.Create; begin FOperationLock := TCriticalSection.Create; inherited Create; DCDebug('Creating connection ', ClassName); end; destructor TFileSourceConnection.Destroy; begin if Assigned(FAssignedOperation) and (FAssignedOperation.State <> fsosStopped) then DCDebug('Error: Destroying connection ', ClassName, ' with active operation ', FAssignedOperation.ClassName); inherited Destroy; DCDebug('Destroying connection ', ClassName); FreeAndNil(FOperationLock); end; function TFileSourceConnection.GetAssignedOperation: TFileSourceOperation; begin // For just reading lock is probably not needed here. Result := FAssignedOperation; end; function TFileSourceConnection.GetCurrentPath: String; begin Result := FCurrentPath; end; procedure TFileSourceConnection.SetCurrentPath(NewPath: String); begin if NewPath <> '' then NewPath := IncludeTrailingPathDelimiter(NewPath); FCurrentPath := NewPath; end; function TFileSourceConnection.IsAvailable: Boolean; begin Result := (GetAssignedOperation() = nil); end; function TFileSourceConnection.Acquire(Operation: TFileSourceOperation): Boolean; begin FOperationLock.Acquire; try Result := (FAssignedOperation = nil); if Result then FAssignedOperation := Operation; finally FOperationLock.Release; end; end; procedure TFileSourceConnection.Release; begin FOperationLock.Acquire; try FAssignedOperation := nil; finally FOperationLock.Release; end; end; { TFileSources } function TFileSources.Get(I: Integer): IFileSource; begin if (I >= 0) and (I < Count) then Result := inherited Items[I] as IFileSource else Result := nil; end; procedure TFileSources.Assign(otherFileSources: TFileSources); var i: Integer; begin Clear; for i := 0 to otherFileSources.Count - 1 do Add(otherFileSources.Items[i]); end; { TFileSourceManager } constructor TFileSourceManager.Create; begin FFileSources := TFileSources.Create; end; destructor TFileSourceManager.Destroy; var i: Integer; begin if FFileSources.Count > 0 then begin DCDebug('Warning: Destroying manager with existing file sources!'); for i := 0 to FFileSources.Count - 1 do begin // Restore the reference taken in TFileSource.Create before removing // all file sources from the list. FFileSources[i]._AddRef; // Free instance. FFileSources.put(i, nil); end; end; FreeAndNil(FFileSources); inherited Destroy; end; procedure TFileSourceManager.Add(aFileSource: IFileSource); begin if FFileSources.IndexOf(aFileSource) < 0 then begin FFileSources.Add(aFileSource); end else DCDebug('Error: File source already exists in manager!'); end; procedure TFileSourceManager.Remove(aFileSource: IFileSource); begin FFileSources.Remove(aFileSource); end; function TFileSourceManager.Find(FileSourceClass: TClass; Address: String): IFileSource; var i: Integer; begin for i := 0 to FFileSources.Count - 1 do begin if (FFileSources[i].IsClass(FileSourceClass)) and (FFileSources[i].CurrentAddress = Address) then begin Result := FFileSources[i]; Exit; end; end; Result := nil; end; constructor EFileNotFound.Create(const AFilePath: string); begin FFilePath := AFilePath; inherited Create(Format(rsMsgFileNotFound, [aFilePath])); end; initialization FileSourceManager := TFileSourceManager.Create; finalization FreeAndNil(FileSourceManager); end. doublecmd-0.5.8/src/filesources/tempfilesystem/0000755000175000017500000000000012257501472020677 5ustar alexxalexxdoublecmd-0.5.8/src/filesources/tempfilesystem/utempfilesystemfilesource.pas0000644000175000017500000000756011747211345026734 0ustar alexxalexxunit uTempFileSystemFileSource; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSystemFileSource; type ITempFileSystemFileSource = interface(IFileSystemFileSource) ['{1B6CFF05-15D5-45AF-A382-9C12C1A52024}'] function GetDeleteOnDestroy: Boolean; procedure SetDeleteOnDestroy(NewDeleteOnDestroy: Boolean); property DeleteOnDestroy: Boolean read GetDeleteOnDestroy write SetDeleteOnDestroy; property FileSystemRoot: String read GetRootDir; end; { TTempFileSystemFileSource } {en Filesystem file source that stores temporary files. Operations can be done like on a regular file system but all the contents can be deleted when the file source is destroyed, depending on DeleteOnDestroy property. } TTempFileSystemFileSource = class(TFileSystemFileSource, ITempFileSystemFileSource) private FDeleteOnDestroy: Boolean; FTempRootDir: String; function GetDeleteOnDestroy: Boolean; procedure SetDeleteOnDestroy(NewDeleteOnDestroy: Boolean); protected public constructor Create; override; constructor Create(const aPath: String); virtual; overload; destructor Destroy; override; class function GetFileSource: ITempFileSystemFileSource; function IsPathAtRoot(Path: String): Boolean; override; function GetParentDir(sPath: String): String; override; function GetRootDir(sPath: String): String; override; overload; function GetRootDir: String; override; overload; function GetFreeSpace(Path: String; out FreeSize, TotalSize : Int64) : Boolean; override; property DeleteOnDestroy: Boolean read FDeleteOnDestroy write FDeleteOnDestroy default True; property FilesystemRoot: String read FTempRootDir; end; ETempFileSourceException = class(Exception); ECannotCreateTempFileSourceException = class(ETempFileSourceException); implementation uses DCOSUtils, uOSUtils, DCStrUtils, uFileProcs; constructor TTempFileSystemFileSource.Create; begin Create(''); end; constructor TTempFileSystemFileSource.Create(const aPath: String); begin inherited Create; if (aPath <> EmptyStr) and mbDirectoryExists(aPath) then FTempRootDir := aPath else begin FTempRootDir := GetTempName(GetTempDir + '_dc'); if (FTempRootDir = EmptyStr) or (mbForceDirectory(FTempRootDir) = False) then begin FDeleteOnDestroy := False; raise ECannotCreateTempFileSourceException.Create('Cannot create temp file source'); end; end; FCurrentAddress := FTempRootDir; FDeleteOnDestroy := True; FTempRootDir := IncludeTrailingPathDelimiter(FTempRootDir); end; destructor TTempFileSystemFileSource.Destroy; begin inherited Destroy; if FDeleteOnDestroy and mbDirectoryExists(FTempRootDir) then begin DelTree(FCurrentAddress); mbRemoveDir(FCurrentAddress); end; end; function TTempFileSystemFileSource.GetDeleteOnDestroy: Boolean; begin Result := FDeleteOnDestroy; end; procedure TTempFileSystemFileSource.SetDeleteOnDestroy(NewDeleteOnDestroy: Boolean); begin FDeleteOnDestroy := NewDeleteOnDestroy; end; class function TTempFileSystemFileSource.GetFileSource: ITempFileSystemFileSource; begin Result := TTempFileSystemFileSource.Create; end; function TTempFileSystemFileSource.GetFreeSpace(Path: String; out FreeSize, TotalSize : Int64) : Boolean; begin Result := GetDiskFreeSpace(FTempRootDir, FreeSize, TotalSize); end; function TTempFileSystemFileSource.IsPathAtRoot(Path: String): Boolean; begin Result := (IncludeTrailingPathDelimiter(Path) = FTempRootDir); end; function TTempFileSystemFileSource.GetParentDir(sPath: String): String; begin if IsPathAtRoot(sPath) then Result := '' else Result := DCStrUtils.GetParentDir(sPath); end; function TTempFileSystemFileSource.GetRootDir(sPath: String): String; begin Result := FTempRootDir; end; function TTempFileSystemFileSource.GetRootDir: String; begin Result := FTempRootDir; end; end. doublecmd-0.5.8/src/filesources/ufilesourceoperationoptions.pas0000644000175000017500000000117511747211345024220 0ustar alexxalexxunit uFileSourceOperationOptions; {$mode objfpc}{$H+} interface uses Classes, SysUtils; type TFileSourceOperationOptionGeneral = (fsoogNone, fsoogYes, fsoogNo); TFileSourceOperationOptionSymLink = (fsooslNone, fsooslFollow, fsooslDontFollow); TFileSourceOperationOptionFileExists = (fsoofeNone, fsoofeSkip, fsoofeOverwrite, fsoofeOverwriteOlder, fsoofeAppend, fsoofeResume); TFileSourceOperationOptionDirectoryExists = (fsoodeNone, fsoodeSkip, fsoodeDelete, fsoodeCopyInto); TFileSourceOperationOptionSetPropertyError = (fsoospeNone, fsoospeDontSet, fsoospeIgnoreErrors); implementation end. doublecmd-0.5.8/src/filesources/ufilesourceoperationmisc.pas0000644000175000017500000000424111747211345023455 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Miscellaneous functions for file source operations and queues. Copyright (C) 2012 Przemysław Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uFileSourceOperationMisc; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceOperation, uOperationsManager; function GetOperationStateString(OperationState: TFileSourceOperationState): String; function GetProgressString(const Progress: Double): String; procedure ShowOperation(OpManItem: TOperationsManagerItem); implementation uses fFileOpDlg, uGlobs; function GetOperationStateString(OperationState: TFileSourceOperationState): String; begin if OperationState <> fsosRunning then Result := ' [' + FileSourceOperationStateText[OperationState] + ']' else Result := ''; end; function GetProgressString(const Progress: Double): String; begin Result := FloatToStrF(Progress * 100, ffFixed, 0, 0) + '%'; end; procedure ShowOperation(OpManItem: TOperationsManagerItem); var Options: TOperationProgressWindowOptions = []; begin if OpManItem.Queue.IsFree or (OpManItem.Queue.Count = 1) then begin if gFileOperationsProgressKind in [fopkSeparateWindow, fopkSeparateWindowMinimized] then begin if gFileOperationsProgressKind = fopkSeparateWindowMinimized then Options := Options + [opwoStartMinimized]; TfrmFileOp.ShowFor(OpManItem.Handle, Options); end; end; end; end. doublecmd-0.5.8/src/filesources/ufilesourcecalcstatisticsoperation.pas0000644000175000017500000001136111747211345025540 0ustar alexxalexxunit uFileSourceCalcStatisticsOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, syncobjs, uFileSourceOperation, uFileSourceOperationTypes, uFileSourceOperationOptions, uFileSource, uFileProperty, uFile; type TFileSourceCalcStatisticsOperationStatistics = record SupportedProperties: TFilePropertiesTypes; CurrentFile: String; Files: Int64; // only files, i.e., not directories Directories: Int64; Links: Int64; Size: Int64; // total size of all the files CompressedSize: Int64; // if fpCompressedSize supported OldestFile: TDateTime; // if fpModificationTime (or fpDateTime) supported NewestFile: TDateTime; FilesPerSecond: Int64; // Maybe some other: // SystemFiles // ReadOnlyFiles // ExecutableFiles end; {en Operation that calculates several statistics for a directory tree. } { TFileSourceCalcStatisticsOperation } TFileSourceCalcStatisticsOperation = class(TFileSourceOperation) private FStatistics: TFileSourceCalcStatisticsOperationStatistics; FStatisticsAtStartTime: TFileSourceCalcStatisticsOperationStatistics; FStatisticsLock: TCriticalSection; // NewStatistics.DoneBytes then begin with NewStatistics do begin RemainingTime := EstimateRemainingTime(FStatisticsAtStartTime.DoneBytes, DoneBytes, TotalBytes, StartTime, SysUtils.Now, BytesPerSecond); // Update overall progress. if TotalBytes <> 0 then UpdateProgress(DoneBytes/TotalBytes); end; end; FStatistics := NewStatistics; finally FStatisticsLock.Release; end; end; procedure TFileSourceTestArchiveOperation.UpdateStatisticsAtStartTime; begin FStatisticsLock.Acquire; try Self.FStatisticsAtStartTime := Self.FStatistics; finally FStatisticsLock.Release; end; end; function TFileSourceTestArchiveOperation.RetrieveStatistics: TFileSourceTestArchiveOperationStatistics; begin // Statistics have to be synchronized because there are multiple values // and they all have to be consistent at every moment. FStatisticsLock.Acquire; try Result := Self.FStatistics; finally FStatisticsLock.Release; end; end; end. doublecmd-0.5.8/src/filesources/ufilesourcewipeoperation.pas0000644000175000017500000001074411747211345023473 0ustar alexxalexxunit uFileSourceWipeOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, syncobjs, uFileSourceOperation, uFileSourceOperationTypes, uFileSource, uFile; type TFileSourceWipeOperationStatistics = record CurrentFile: String; CurrentFileTotalBytes: Int64; CurrentFileDoneBytes: Int64; TotalFiles: Int64; DoneFiles: Int64; TotalBytes: Int64; DoneBytes: Int64; BytesPerSecond: Int64; RemainingTime: TDateTime; end; {en Operation that wipes files from an arbitrary file source. File source should match the class type. } { TFileSourceWipeOperation } TFileSourceWipeOperation = class(TFileSourceOperation) private FStatistics: TFileSourceWipeOperationStatistics; FStatisticsAtStartTime: TFileSourceWipeOperationStatistics; FStatisticsLock: TCriticalSection; // NewStatistics.DoneBytes then begin with NewStatistics do begin RemainingTime := EstimateRemainingTime(FStatisticsAtStartTime.DoneBytes, DoneBytes, TotalBytes, StartTime, SysUtils.Now, BytesPerSecond); // Update overall progress. if TotalBytes <> 0 then UpdateProgress(DoneBytes/TotalBytes); end; end; FStatistics := NewStatistics; finally FStatisticsLock.Release; end; end; procedure TFileSourceWipeOperation.UpdateStatisticsAtStartTime; begin FStatisticsLock.Acquire; try Self.FStatisticsAtStartTime := Self.FStatistics; finally FStatisticsLock.Release; end; end; function TFileSourceWipeOperation.RetrieveStatistics: TFileSourceWipeOperationStatistics; begin // Statistics have to be synchronized because there are multiple values // and they all have to be consistent at every moment. FStatisticsLock.Acquire; try Result := Self.FStatistics; finally FStatisticsLock.Release; end; end; end. doublecmd-0.5.8/src/filesources/multiarchive/0000755000175000017500000000000012257501472020321 5ustar alexxalexxdoublecmd-0.5.8/src/filesources/multiarchive/umultiarchivelistoperation.pas0000644000175000017500000000311611753503774026534 0ustar alexxalexxunit uMultiArchiveListOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceListOperation, uMultiArchiveFileSource, uFileSource; type TMultiArchiveListOperation = class(TFileSourceListOperation) private FMultiArchiveFileSource: IMultiArchiveFileSource; public constructor Create(aFileSource: IFileSource; aPath: String); override; procedure MainExecute; override; end; implementation uses LCLProc, uOSUtils, DCStrUtils, uMultiArc, uFile; constructor TMultiArchiveListOperation.Create(aFileSource: IFileSource; aPath: String); begin FFiles := TFiles.Create(aPath); FMultiArchiveFileSource := aFileSource as IMultiArchiveFileSource; inherited Create(aFileSource, aPath); end; procedure TMultiArchiveListOperation.MainExecute; var I : Integer; CurrFileName : String; // Current file name ArcFileList: TList; aFile: TFile; begin FFiles.Clear; if not FileSource.IsPathAtRoot(Path) then begin aFile := TMultiArchiveFileSource.CreateFile(Path); aFile.Name := '..'; aFile.Attributes := faFolder; FFiles.Add(AFile); end; ArcFileList := FMultiArchiveFileSource.ArchiveFileList; for I := 0 to ArcFileList.Count - 1 do begin CheckOperationState; CurrFileName := PathDelim + TArchiveItem(ArcFileList.Items[I]).FileName; if not IsInPath(Path, CurrFileName, False, False) then Continue; with FMultiArchiveFileSource.MultiArcItem do aFile := TMultiArchiveFileSource.CreateFile(Path, TArchiveItem(ArcFileList.Items[I]), FFormMode); FFiles.Add(AFile); end; end; end. doublecmd-0.5.8/src/filesources/multiarchive/umultiarchivefilesource.pas0000644000175000017500000004670712204103540025770 0ustar alexxalexxunit uMultiArchiveFileSource; {$mode objfpc}{$H+} interface uses Classes, SysUtils, contnrs, StringHashList, uOSUtils, uMultiArc, uFile, uFileSourceProperty, uFileSourceOperationTypes, uArchiveFileSource, uFileProperty, uFileSource, uFileSourceOperation, uMultiArchiveUtil, DCBasicTypes; type { IMultiArchiveFileSource } IMultiArchiveFileSource = interface(IArchiveFileSource) ['{71BF41D3-1E40-4E84-83BB-B6D3E0DEB6FC}'] function GetPassword: UTF8String; function GetArcFileList: TObjectList; function GetMultiArcItem: TMultiArcItem; function FileIsLink(ArchiveItem: TArchiveItem): Boolean; function FileIsDirectory(ArchiveItem: TArchiveItem): Boolean; procedure FillAndCount(const FileMask: UTF8String; Files: TFiles; CountDirs: Boolean; out NewFiles: TFiles; out FilesCount: Int64; out FilesSize: Int64); property Password: UTF8String read GetPassword; property ArchiveFileList: TObjectList read GetArcFileList; property MultiArcItem: TMultiArcItem read GetMultiArcItem; end; { TMultiArchiveFileSource } TMultiArchiveFileSource = class(TArchiveFileSource, IMultiArchiveFileSource) private FPassword: UTF8String; FOutputParser: TOutputParser; FArcFileList : TObjectList; FMultiArcItem: TMultiArcItem; FAllDirsList, FExistsDirList: TStringHashList; FLinkAttribute, FDirectoryAttribute: TFileAttrs; function GetPassword: UTF8String; function GetMultiArcItem: TMultiArcItem; procedure OnGetArchiveItem(ArchiveItem: TArchiveItem); function ReadArchive(bCanYouHandleThisFile : Boolean = False): Boolean; function FileIsLink(ArchiveItem: TArchiveItem): Boolean; function FileIsDirectory(ArchiveItem: TArchiveItem): Boolean; function GetArcFileList: TObjectList; protected function GetSupportedFileProperties: TFilePropertiesTypes; override; function SetCurrentWorkingDirectory(NewDir: String): Boolean; override; procedure DoReload(const PathsToReload: TPathsArray); override; public procedure FillAndCount(const FileMask: UTF8String; Files: TFiles; CountDirs: Boolean; out NewFiles: TFiles; out FilesCount: Int64; out FilesSize: Int64); public constructor Create(anArchiveFileSource: IFileSource; anArchiveFileName: String; aMultiArcItem: TMultiArcItem); reintroduce; destructor Destroy; override; class function CreateFile(const APath: String; ArchiveItem: TArchiveItem; FormMode: Integer): TFile; overload; // Retrieve operations permitted on the source. = capabilities? function GetOperationsTypes: TFileSourceOperationTypes; override; // Retrieve some properties of the file source. function GetProperties: TFileSourceProperties; override; // These functions create an operation object specific to the file source. function CreateListOperation(TargetPath: String): TFileSourceOperation; override; function CreateCopyInOperation(SourceFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; override; function CreateCopyOutOperation(TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; override; function CreateDeleteOperation(var FilesToDelete: TFiles): TFileSourceOperation; override; function CreateExecuteOperation(var ExecutableFile: TFile; BasePath, Verb: String): TFileSourceOperation; override; function CreateTestArchiveOperation(var theSourceFiles: TFiles): TFileSourceOperation; override; function CreateCalcStatisticsOperation(var theFiles: TFiles): TFileSourceOperation; override; class function CreateByArchiveSign(anArchiveFileSource: IFileSource; anArchiveFileName: String): IMultiArchiveFileSource; class function CreateByArchiveType(anArchiveFileSource: IFileSource; anArchiveFileName, anArchiveType: String): IMultiArchiveFileSource; class function CreateByArchiveName(anArchiveFileSource: IFileSource; anArchiveFileName: String): IMultiArchiveFileSource; {en Returns @true if there is an addon registered for the archive type (only extension is checked). } class function CheckAddonByExt(anArchiveType: String): Boolean; property Password: UTF8String read GetPassword; property ArchiveFileList: TObjectList read GetArcFileList; property MultiArcItem: TMultiArcItem read GetMultiArcItem; end; implementation uses uDebug, uGlobs, DCFileAttributes, DCOSUtils, DCStrUtils, FileUtil, uMasks, uMultiArchiveListOperation, uMultiArchiveCopyInOperation, uMultiArchiveCopyOutOperation, uMultiArchiveDeleteOperation, uMultiArchiveExecuteOperation, uMultiArchiveTestArchiveOperation, uMultiArchiveCalcStatisticsOperation ; class function TMultiArchiveFileSource.CreateByArchiveSign(anArchiveFileSource: IFileSource; anArchiveFileName: String): IMultiArchiveFileSource; var I: Integer; aMultiArcItem: TMultiArcItem; begin Result := nil; // Check if there is a registered addon for the archive file by content. for I := 0 to gMultiArcList.Count - 1 do begin aMultiArcItem:= gMultiArcList.Items[I]; if (aMultiArcItem.FEnabled) and (aMultiArcItem.FID <> EmptyStr) then begin if aMultiArcItem.CanYouHandleThisFile(anArchiveFileName) then begin Result := TMultiArchiveFileSource.Create(anArchiveFileSource, anArchiveFileName, aMultiArcItem); DCDebug('Found registered addon "' + aMultiArcItem.FDescription + '" for archive ' + anArchiveFileName); Break; end; end; end; end; class function TMultiArchiveFileSource.CreateByArchiveType( anArchiveFileSource: IFileSource; anArchiveFileName, anArchiveType: String): IMultiArchiveFileSource; var I: Integer; aMultiArcItem: TMultiArcItem; begin Result := nil; // Check if there is a registered addon for the extension of the archive file name. for I := 0 to gMultiArcList.Count - 1 do begin aMultiArcItem:= gMultiArcList.Items[I]; if MatchesMaskList(anArchiveType, aMultiArcItem.FExtension, ',') and (aMultiArcItem.FEnabled) then begin Result := TMultiArchiveFileSource.Create(anArchiveFileSource, anArchiveFileName, aMultiArcItem); DCDebug('Found registered addon "' + aMultiArcItem.FDescription + '" for archive ' + anArchiveFileName); Break; end; end; end; class function TMultiArchiveFileSource.CreateByArchiveName( anArchiveFileSource: IFileSource; anArchiveFileName: String): IMultiArchiveFileSource; begin Result:= CreateByArchiveType(anArchiveFileSource, anArchiveFileName, ExtractOnlyFileExt(anArchiveFileName)); end; class function TMultiArchiveFileSource.CheckAddonByExt(anArchiveType: String): Boolean; var I: Integer; aMultiArcItem: TMultiArcItem; begin for I := 0 to gMultiArcList.Count - 1 do begin aMultiArcItem:= gMultiArcList.Items[I]; if MatchesMaskList(anArchiveType, aMultiArcItem.FExtension, ',') and (aMultiArcItem.FEnabled) then Exit(True); end; Result := False; end; // ---------------------------------------------------------------------------- constructor TMultiArchiveFileSource.Create(anArchiveFileSource: IFileSource; anArchiveFileName: String; aMultiArcItem: TMultiArcItem); begin inherited Create(anArchiveFileSource, anArchiveFileName); FMultiArcItem := aMultiArcItem; FArcFileList := TObjectList.Create(True); FOutputParser := TOutputParser.Create(aMultiArcItem, anArchiveFileName); FOutputParser.OnGetArchiveItem:= @OnGetArchiveItem; FOperationsClasses[fsoCopyIn] := TMultiArchiveCopyInOperation.GetOperationClass; FOperationsClasses[fsoCopyOut] := TMultiArchiveCopyOutOperation.GetOperationClass; with FMultiArcItem do begin if (FFormMode and MAF_UNIX_ATTR) <> 0 then begin FLinkAttribute:= S_IFLNK; FDirectoryAttribute:= S_IFDIR; end else if (FFormMode and MAF_WIN_ATTR) <> 0 then begin FLinkAttribute:= FILE_ATTRIBUTE_REPARSE_POINT; FDirectoryAttribute:= FILE_ATTRIBUTE_DIRECTORY; end else begin FLinkAttribute:= faSymLink; FDirectoryAttribute:= faFolder; end; end; ReadArchive; end; destructor TMultiArchiveFileSource.Destroy; begin inherited Destroy; if Assigned(FArcFileList) then FreeAndNil(FArcFileList); end; class function TMultiArchiveFileSource.CreateFile(const APath: String; ArchiveItem: TArchiveItem; FormMode: Integer): TFile; begin Result := TFile.Create(APath); with Result do begin { Comment, } SizeProperty := TFileSizeProperty.Create(ArchiveItem.UnpSize); CompressedSizeProperty := TFileCompressedSizeProperty.Create(ArchiveItem.PackSize); if (FormMode and MAF_UNIX_ATTR) <> 0 then AttributesProperty := TUnixFileAttributesProperty.Create(ArchiveItem.Attributes) else if (FormMode and MAF_WIN_ATTR) <> 0 then AttributesProperty := TNtfsFileAttributesProperty.Create(ArchiveItem.Attributes) else AttributesProperty := TFileAttributesProperty.CreateOSAttributes(ArchiveItem.Attributes); ModificationTimeProperty := TFileModificationDateTimeProperty.Create(0); try with ArchiveItem do ModificationTime := EncodeDate(Year, Month, Day) + EncodeTime(Hour, Minute, Second, 0); except on EConvertError do; end; if AttributesProperty.IsLink and (Length(ArchiveItem.FileLink) > 0) then begin LinkProperty := TFileLinkProperty.Create; LinkProperty.LinkTo := ArchiveItem.FileLink; end; // Set name after assigning Attributes property, because it is used to get extension. Name := ExtractFileName(ArchiveItem.FileName); if ArchiveItem.FileExt <> EmptyStr then Name:= Name + '.' + ArchiveItem.FileExt; end; end; function TMultiArchiveFileSource.GetOperationsTypes: TFileSourceOperationTypes; begin Result := [fsoExecute]; if FMultiArcItem.FList <> EmptyStr then Result := Result + [fsoList, fsoCalcStatistics]; if FMultiArcItem.FAdd <> EmptyStr then Result := Result + [fsoCopyIn]; if FMultiArcItem.FExtract <> EmptyStr then Result := Result + [fsoCopyOut]; if FMultiArcItem.FDelete <> EmptyStr then Result := Result + [fsoDelete]; if FMultiArcItem.FTest <> EmptyStr then Result := Result + [fsoTestArchive]; end; function TMultiArchiveFileSource.GetProperties: TFileSourceProperties; begin Result := []; end; function TMultiArchiveFileSource.GetSupportedFileProperties: TFilePropertiesTypes; begin Result := inherited GetSupportedFileProperties + [fpLink]; end; function TMultiArchiveFileSource.SetCurrentWorkingDirectory(NewDir: String): Boolean; var I: Integer; ArchiveItem: TArchiveItem; begin Result := False; if Length(NewDir) > 0 then begin if NewDir = GetRootDir() then Exit(True); NewDir := IncludeTrailingPathDelimiter(NewDir); // Search file list for a directory with name NewDir. for I := 0 to FArcFileList.Count - 1 do begin ArchiveItem := TArchiveItem(FArcFileList.Items[I]); if FileIsDirectory(ArchiveItem) and (Length(ArchiveItem.FileName) > 0) then begin if NewDir = IncludeTrailingPathDelimiter(GetRootDir() + ArchiveItem.FileName) then Exit(True); end; end; end; end; function TMultiArchiveFileSource.GetArcFileList: TObjectList; begin Result := FArcFileList; end; function TMultiArchiveFileSource.GetMultiArcItem: TMultiArcItem; begin Result := FMultiArcItem; end; function TMultiArchiveFileSource.CreateListOperation(TargetPath: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TMultiArchiveListOperation.Create(TargetFileSource, TargetPath); end; function TMultiArchiveFileSource.CreateCopyInOperation( SourceFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TMultiArchiveCopyInOperation.Create(SourceFileSource, TargetFileSource, SourceFiles, TargetPath); end; function TMultiArchiveFileSource.CreateCopyOutOperation( TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; var SourceFileSource: IFileSource; begin SourceFileSource := Self; Result := TMultiArchiveCopyOutOperation.Create(SourceFileSource, TargetFileSource, SourceFiles, TargetPath); end; function TMultiArchiveFileSource.CreateDeleteOperation(var FilesToDelete: TFiles): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TMultiArchiveDeleteOperation.Create(TargetFileSource, FilesToDelete); end; function TMultiArchiveFileSource.CreateExecuteOperation(var ExecutableFile: TFile; BasePath, Verb: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result:= TMultiArchiveExecuteOperation.Create(TargetFileSource, ExecutableFile, BasePath, Verb); end; function TMultiArchiveFileSource.CreateTestArchiveOperation(var theSourceFiles: TFiles): TFileSourceOperation; var SourceFileSource: IFileSource; begin SourceFileSource := Self; Result:= TMultiArchiveTestArchiveOperation.Create(SourceFileSource, theSourceFiles); end; function TMultiArchiveFileSource.CreateCalcStatisticsOperation( var theFiles: TFiles): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TMultiArchiveCalcStatisticsOperation.Create(TargetFileSource, theFiles); end; procedure TMultiArchiveFileSource.OnGetArchiveItem(ArchiveItem: TArchiveItem); procedure CollectDirs(Path: PAnsiChar; var DirsList: TStringHashList); var I : Integer; Dir : AnsiString; begin // Scan from the second char from the end, to the second char from the beginning. for I := strlen(Path) - 2 downto 1 do begin if Path[I] = PathDelim then begin SetString(Dir, Path, I); if DirsList.Find(Dir) = -1 then // Add directory and continue scanning for parent directories. DirsList.Add(Dir) else // This directory is already in the list and we assume // that all parent directories are too. Exit; end end; end; var NameLength: Integer; begin // Some archivers end directories with path delimiter. Delete it if present. if FileIsDirectory(ArchiveItem) then begin NameLength := Length(ArchiveItem.FileName); if (ArchiveItem.FileName[NameLength] = PathDelim) then Delete(ArchiveItem.FileName, NameLength, 1); //**************************** (* Workaround for archivers that don't give a list of folders or the list does not include all of the folders. *) // Collect directories that the plugin supplies. if (FExistsDirList.Find(ArchiveItem.FileName) < 0) then FExistsDirList.Add(ArchiveItem.FileName); end; // Collect all directories. CollectDirs(PAnsiChar(ArchiveItem.FileName), FAllDirsList); //**************************** FArcFileList.Add(ArchiveItem); end; function TMultiArchiveFileSource.GetPassword: UTF8String; begin Result:= FPassword; end; function TMultiArchiveFileSource.ReadArchive(bCanYouHandleThisFile : Boolean = False): Boolean; var I : Integer; ArchiveItem: TArchiveItem; begin if not mbFileAccess(ArchiveFileName, fmOpenRead) then begin Result := False; Exit; end; { if bCanYouHandleThisFile and (Assigned(WcxModule.CanYouHandleThisFile) or Assigned(WcxModule.CanYouHandleThisFileW)) then begin Result := WcxModule.WcxCanYouHandleThisFile(ArchiveFileName); if not Result then Exit; end; } { Get File List } FArcFileList.Clear; FExistsDirList := TStringHashList.Create(True); FAllDirsList := TStringHashList.Create(True); try DCDebug('Get File List'); FOutputParser.Prepare; FOutputParser.Execute; FPassword:= FOutputParser.Password; (* if archiver does not give a list of folders *) for I := 0 to FAllDirsList.Count - 1 do begin // Add only those directories that were not supplied by the plugin. if FExistsDirList.Find(FAllDirsList.List[I]^.Key) < 0 then begin ArchiveItem:= TArchiveItem.Create; try ArchiveItem.FileName := FAllDirsList.List[I]^.Key; ArchiveItem.Attributes := FDirectoryAttribute; FArcFileList.Add(ArchiveItem); except FreeAndNil(ArchiveItem); end; end; end; finally FreeAndNil(FAllDirsList); FreeAndNil(FExistsDirList); end; Result := True; end; function TMultiArchiveFileSource.FileIsLink(ArchiveItem: TArchiveItem): Boolean; begin Result:= (ArchiveItem.Attributes and FLinkAttribute <> 0); end; function TMultiArchiveFileSource.FileIsDirectory(ArchiveItem: TArchiveItem): Boolean; begin Result:= (ArchiveItem.Attributes and FDirectoryAttribute <> 0); end; procedure TMultiArchiveFileSource.DoReload(const PathsToReload: TPathsArray); begin ReadArchive; end; procedure TMultiArchiveFileSource.FillAndCount(const FileMask: UTF8String; Files: TFiles; CountDirs: Boolean; out NewFiles: TFiles; out FilesCount: Int64; out FilesSize: Int64); var I, J: Integer; ArchiveItem: TArchiveItem; sFileName: UTF8String; aFile: TFile; begin NewFiles:= TFiles.Create(Files.Path); FilesCount:= 0; FilesSize:= 0; for I := 0 to ArchiveFileList.Count - 1 do begin ArchiveItem := TArchiveItem(ArchiveFileList.Items[I]); sFileName:= PathDelim + ArchiveItem.FileName; if ((FileMask = '*.*') or (FileMask = '*') or // And name matches file mask MatchesMaskList(ExtractFileName(ArchiveItem.FileName), FileMask)) then for J := 0 to Files.Count - 1 do begin aFile := Files[J]; if (aFile.FullPath = sFileName) or // Item in the list is a file, only compare names. (aFile.AttributesProperty.IsDirectory and IsInPath(aFile.FullPath, sFileName, True, False)) then // Check if 'FileName' is in this directory or any of its subdirectories. begin if FileIsDirectory(ArchiveItem) then begin if CountDirs then Inc(FilesCount); end else begin Inc(FilesCount); Inc(FilesSize, aFile.Size); end; aFile:= TMultiArchiveFileSource.CreateFile(ExtractFilePath(ArchiveItem.FileName), ArchiveItem, FMultiArcItem.FFormMode); aFile.FullPath:= ExcludeFrontPathDelimiter(aFile.FullPath); NewFiles.Add(aFile); end; end; // for J end; // for I end; end. doublecmd-0.5.8/src/filesources/multiarchive/fmultiarchivecopyoperationoptions.pas0000644000175000017500000000470011747211345030121 0ustar alexxalexxunit fMultiArchiveCopyOperationOptions; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, StdCtrls, ExtCtrls, uFileSourceOperationOptionsUI, uMultiArchiveCopyInOperation, uMultiArchiveCopyOutOperation; type { TMultiArchiveCopyOperationOptionsUI } TMultiArchiveCopyOperationOptionsUI = class(TFileSourceOperationOptionsUI) cmbFileExists: TComboBox; grpOptions: TGroupBox; lblFileExists: TLabel; private procedure SetOperationOptions(CopyInOperation: TMultiArchiveCopyInOperation); overload; procedure SetOperationOptions(CopyOutOperation: TMultiArchiveCopyOutOperation); overload; public constructor Create(AOwner: TComponent; AFileSource: IInterface); override; procedure SaveOptions; override; procedure SetOperationOptions(Operation: TObject); override; end; implementation {$R *.lfm} uses uGlobs, uFileSourceOperationOptions; { TMultiArchiveCopyOperationOptionsUI } constructor TMultiArchiveCopyOperationOptionsUI.Create(AOwner: TComponent; AFileSource: IInterface); begin inherited; // Load default options. case gOperationOptionFileExists of fsoofeNone : cmbFileExists.ItemIndex := 0; fsoofeOverwrite: cmbFileExists.ItemIndex := 1; fsoofeSkip : cmbFileExists.ItemIndex := 2; end; end; procedure TMultiArchiveCopyOperationOptionsUI.SaveOptions; begin // TODO: Saving options for each file source operation separately. end; procedure TMultiArchiveCopyOperationOptionsUI.SetOperationOptions(Operation: TObject); begin if Operation is TMultiArchiveCopyInOperation then SetOperationOptions(Operation as TMultiArchiveCopyInOperation) else if Operation is TMultiArchiveCopyOutOperation then SetOperationOptions(Operation as TMultiArchiveCopyOutOperation); end; procedure TMultiArchiveCopyOperationOptionsUI.SetOperationOptions(CopyInOperation: TMultiArchiveCopyInOperation); begin { with CopyInOperation do begin case cmbFileExists.ItemIndex of 0: FileExistsOption := fsoofeNone; 1: FileExistsOption := fsoofeOverwrite; 2: FileExistsOption := fsoofeSkip; end; end; } end; procedure TMultiArchiveCopyOperationOptionsUI.SetOperationOptions(CopyOutOperation: TMultiArchiveCopyOutOperation); begin with CopyOutOperation do begin case cmbFileExists.ItemIndex of 0: FileExistsOption := fsoofeNone; 1: FileExistsOption := fsoofeOverwrite; 2: FileExistsOption := fsoofeSkip; end; end; end; end. doublecmd-0.5.8/src/filesources/multiarchive/umultiarchivecopyinoperation.pas0000644000175000017500000003001712161350542027045 0ustar alexxalexxunit uMultiArchiveCopyInOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uLog, uGlobs, un_process, uFileSourceOperation, uFileSourceCopyOperation, uFileSource, uFile, uMultiArchiveFileSource; type { TMultiArchiveCopyInOperation } TMultiArchiveCopyInOperation = class(TFileSourceCopyInOperation) private FMultiArchiveFileSource: IMultiArchiveFileSource; FStatistics: TFileSourceCopyOperationStatistics; // local copy of statistics FFullFilesTree, FRemoveFilesTree: TFiles; FPackingFlags: Integer; FPassword: UTF8String; FVolumeSize: UTF8String; FCustomParams: UTF8String; FCallResult, FTarBefore: Boolean; // Create TAR archive first FTarFileName: UTF8String; // Temporary TAR archive name procedure ShowError(sMessage: String; logOptions: TLogOptions = []); procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); function CheckForErrors(const FileName: UTF8String; ExitStatus: LongInt): Boolean; procedure DeleteFile(const BasePath: UTF8String; aFile: TFile); procedure DeleteFiles(const BasePath: UTF8String; aFiles: TFiles); protected FExProcess: TExProcess; FTempFile: UTF8String; FErrorLevel: LongInt; function Tar: Boolean; procedure OnReadLn(str: string); procedure OperationProgressHandler; procedure UpdateProgress(SourceName, TargetName: UTF8String; IncSize: Int64); procedure FileSourceOperationStateChangedNotify(Operation: TFileSourceOperation; AState: TFileSourceOperationState); public constructor Create(aSourceFileSource: IFileSource; aTargetFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; property PackingFlags: Integer read FPackingFlags write FPackingFlags; property Password: UTF8String read FPassword write FPassword; property VolumeSize: UTF8String read FVolumeSize write FVolumeSize; property CustomParams: UTF8String read FCustomParams write FCustomParams; property TarBefore: Boolean read FTarBefore write FTarBefore; end; implementation uses LCLProc, DCStrUtils, uDCUtils, uMultiArc, uLng, WcxPlugin, uFileSourceOperationUI, uFileSystemFileSource, uFileSystemUtil, uMultiArchiveUtil, DCOSUtils, uOSUtils, uTarWriter; constructor TMultiArchiveCopyInOperation.Create(aSourceFileSource: IFileSource; aTargetFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); begin FMultiArchiveFileSource := aTargetFileSource as IMultiArchiveFileSource; FFullFilesTree := nil; FRemoveFilesTree := nil; FPackingFlags := 0; FPassword := EmptyStr; FVolumeSize := EmptyStr; FTarBefore:= False; inherited Create(aSourceFileSource, aTargetFileSource, theSourceFiles, aTargetPath); end; destructor TMultiArchiveCopyInOperation.Destroy; begin inherited Destroy; FreeAndNil(FFullFilesTree); FreeAndNil(FRemoveFilesTree); end; procedure TMultiArchiveCopyInOperation.Initialize; begin FExProcess:= TExProcess.Create(EmptyStr); FExProcess.OnReadLn:= @OnReadLn; FExProcess.OnOperationProgress:= @OperationProgressHandler; FTempFile:= GetTempName(GetTempFolder); AddStateChangedListener([fsosStarting, fsosPausing, fsosStopping], @FileSourceOperationStateChangedNotify); // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; with FStatistics do begin if SourceFiles.Count = 1 then CurrentFileFrom:= SourceFiles[0].FullPath else CurrentFileFrom:= SourceFiles.Path + AllFilesMask; CurrentFileTo:= FMultiArchiveFileSource.ArchiveFileName; end; FillAndCount(SourceFiles, False, False, FFullFilesTree, FStatistics.TotalFiles, FStatistics.TotalBytes); // gets full list of files (recursive) end; procedure TMultiArchiveCopyInOperation.MainExecute; var I: Integer; sRootPath, sDestPath: String; MultiArcItem: TMultiArcItem; aFile: TFile; sReadyCommand, sCommandLine: UTF8String; begin // Put to TAR archive if needed if FTarBefore then Tar; MultiArcItem := FMultiArchiveFileSource.MultiArcItem; sDestPath := ExcludeFrontPathDelimiter(TargetPath); sDestPath := ExcludeTrailingPathDelimiter(sDestPath); sRootPath:= FFullFilesTree.Path; ChangeFileListRoot(EmptyStr, FFullFilesTree); with FMultiArchiveFileSource do begin if (ExtractFileExt(ArchiveFileName) = GetSfxExt) and (Length(MultiArcItem.FAddSelfExtract) <> 0) then sCommandLine:= MultiArcItem.FAddSelfExtract else sCommandLine:= MultiArcItem.FAdd; end; // Get maximum acceptable command errorlevel FErrorLevel:= ExtractErrorLevel(sCommandLine); if Pos('%F', sCommandLine) <> 0 then // pack file by file for I:= FFullFilesTree.Count - 1 downto 0 do begin aFile:= FFullFilesTree[I]; UpdateProgress(sRootPath + aFile.FullPath, sDestPath, 0); sReadyCommand:= FormatArchiverCommand( MultiArcItem.FArchiver, sCommandLine, FMultiArchiveFileSource.ArchiveFileName, nil, aFile.FullPath, sDestPath, FTempFile, Password, VolumeSize, CustomParams ); OnReadLn(sReadyCommand); // Set archiver current path to file list root FExProcess.Process.CurrentDirectory:= mbFileNameToSysEnc(sRootPath); FExProcess.SetCmdLine(sReadyCommand); FExProcess.Execute; UpdateProgress(sRootPath + aFile.FullPath, sDestPath, aFile.Size); // Check for errors. if CheckForErrors(sRootPath + aFile.FullPath, FExProcess.ExitStatus) then begin if (PackingFlags and PK_PACK_MOVE_FILES) <> 0 then DeleteFile(sRootPath, aFile); end; end else // pack whole file list begin sReadyCommand:= FormatArchiverCommand( MultiArcItem.FArchiver, sCommandLine, FMultiArchiveFileSource.ArchiveFileName, FFullFilesTree, EmptyStr, sDestPath, FTempFile, Password, VolumeSize, CustomParams ); OnReadLn(sReadyCommand); // Set archiver current path to file list root FExProcess.Process.CurrentDirectory:= mbFileNameToSysEnc(sRootPath); FExProcess.SetCmdLine(sReadyCommand); FExProcess.Execute; // Check for errors. if CheckForErrors(FMultiArchiveFileSource.ArchiveFileName, FExProcess.ExitStatus) then begin if (PackingFlags and PK_PACK_MOVE_FILES) <> 0 then DeleteFiles(sRootPath, FFullFilesTree); end; end; // Delete temporary TAR archive if needed if FTarBefore then begin mbDeleteFile(FTarFileName); if FCallResult and (PackingFlags and PK_PACK_MOVE_FILES <> 0) then DeleteFiles(EmptyStr, FRemoveFilesTree); end; end; procedure TMultiArchiveCopyInOperation.Finalize; begin FreeThenNil(FExProcess); with FMultiArchiveFileSource.MultiArcItem do if not FDebug then mbDeleteFile(FTempFile); end; procedure TMultiArchiveCopyInOperation.ShowError(sMessage: String; logOptions: TLogOptions); begin if not gSkipFileOpError then begin if AskQuestion(sMessage, '', [fsourSkip, fsourCancel], fsourSkip, fsourAbort) = fsourAbort then begin RaiseAbortOperation; end; end else begin LogMessage(sMessage, logOptions, lmtError); end; end; procedure TMultiArchiveCopyInOperation.LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); begin case logMsgType of lmtError: if not (log_errors in gLogOptions) then Exit; lmtInfo: if not (log_info in gLogOptions) then Exit; lmtSuccess: if not (log_success in gLogOptions) then Exit; end; if logOptions <= gLogOptions then begin logWrite(Thread, sMessage, logMsgType); end; end; function TMultiArchiveCopyInOperation.CheckForErrors(const FileName: UTF8String; ExitStatus: LongInt): Boolean; begin if ExitStatus > FErrorLevel then begin Result:= False; ShowError(Format(rsMsgLogError + rsMsgLogPack, [FileName + ' - Exit status: ' + IntToStr(ExitStatus)]), [log_arc_op]); end else begin Result:= True; LogMessage(Format(rsMsgLogSuccess + rsMsgLogPack, [FileName]), [log_arc_op], lmtSuccess); end; FCallResult:= Result; end; procedure TMultiArchiveCopyInOperation.DeleteFile(const BasePath: UTF8String; aFile: TFile); begin if aFile.IsDirectory then mbRemoveDir(BasePath + aFile.FullPath) else mbDeleteFile(BasePath + aFile.FullPath); end; procedure TMultiArchiveCopyInOperation.DeleteFiles(const BasePath: UTF8String; aFiles: TFiles); var I: Integer; aFile: TFile; begin for I:= aFiles.Count - 1 downto 0 do begin aFile:= aFiles[I]; if aFile.IsDirectory then mbRemoveDir(BasePath + aFile.FullPath) else mbDeleteFile(BasePath + aFile.FullPath); end; end; function TMultiArchiveCopyInOperation.Tar: Boolean; var TarWriter: TTarWriter = nil; begin Result:= False; FTarFileName:= RemoveFileExt(FMultiArchiveFileSource.ArchiveFileName); TarWriter:= TTarWriter.Create(FTarFileName, @AskQuestion, @RaiseAbortOperation, @CheckOperationState, @UpdateStatistics ); try if TarWriter.ProcessTree(FFullFilesTree, FStatistics) then begin // Fill file list with tar archive file FRemoveFilesTree:= FFullFilesTree; FFullFilesTree:= TFiles.Create(ExtractFilePath(FTarFileName)); FFullFilesTree.Add(TFileSystemFileSource.CreateFileFromFile(FTarFileName)); Result:= True; end; finally FreeAndNil(TarWriter); end; end; procedure TMultiArchiveCopyInOperation.OnReadLn(str: string); begin with FMultiArchiveFileSource.MultiArcItem do if FOutput or FDebug then logWrite(Thread, str, lmtInfo, True, False); end; procedure TMultiArchiveCopyInOperation.OperationProgressHandler; var ArchiveSize: Int64; begin Self.CheckOperationState; with FStatistics do begin ArchiveSize := mbFileSize(FMultiArchiveFileSource.ArchiveFileName); if ArchiveSize > DoneBytes then DoneBytes := ArchiveSize; UpdateStatistics(FStatistics); end; end; procedure TMultiArchiveCopyInOperation.UpdateProgress(SourceName, TargetName: UTF8String; IncSize: Int64); begin with FStatistics do begin FStatistics.CurrentFileFrom:= SourceName; FStatistics.CurrentFileTo:= TargetName; CurrentFileDoneBytes:= IncSize; DoneBytes := DoneBytes + CurrentFileDoneBytes; UpdateStatistics(FStatistics); end; end; procedure TMultiArchiveCopyInOperation.FileSourceOperationStateChangedNotify( Operation: TFileSourceOperation; AState: TFileSourceOperationState); begin case AState of fsosStarting: FExProcess.Process.Resume; fsosPausing: FExProcess.Process.Suspend; fsosStopping: FExProcess.Stop; end; end; end. doublecmd-0.5.8/src/filesources/multiarchive/umultiarchivetestarchiveoperation.pas0000644000175000017500000001606111747211345030076 0ustar alexxalexxunit uMultiArchiveTestArchiveOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceOperation, uFileSourceTestArchiveOperation, uFileSource, uFileSourceOperationUI, uFile, uMultiArchiveFileSource, uGlobs, uLog, un_process; type { TMultiArchiveTestArchiveOperation } TMultiArchiveTestArchiveOperation = class(TFileSourceTestArchiveOperation) private FMultiArchiveFileSource: IMultiArchiveFileSource; FStatistics: TFileSourceTestArchiveOperationStatistics; // local copy of statistics FFullFilesTreeToTest: TFiles; // source files including all files/dirs in subdirectories procedure ShowError(sMessage: String; logOptions: TLogOptions); procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); procedure CheckForErrors(const FileName: UTF8String; ExitStatus: LongInt); protected FExProcess: TExProcess; FTempFile: UTF8String; FErrorLevel: LongInt; procedure OnReadLn(str: string); procedure UpdateProgress(SourceName: UTF8String; IncSize: Int64); procedure FileSourceOperationStateChangedNotify(Operation: TFileSourceOperation; AState: TFileSourceOperationState); public constructor Create(aTargetFileSource: IFileSource; var theFilesToDelete: TFiles); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; end; implementation uses uOSUtils, DCOSUtils, uLng, uMultiArc, uMultiArchiveUtil, LCLProc; constructor TMultiArchiveTestArchiveOperation.Create(aTargetFileSource: IFileSource; var theFilesToDelete: TFiles); begin FMultiArchiveFileSource := aTargetFileSource as IMultiArchiveFileSource; FFullFilesTreeToTest:= nil; inherited Create(aTargetFileSource, theFilesToDelete); end; destructor TMultiArchiveTestArchiveOperation.Destroy; begin FreeThenNil(FFullFilesTreeToTest); inherited Destroy; end; procedure TMultiArchiveTestArchiveOperation.Initialize; begin FExProcess:= TExProcess.Create(EmptyStr); FExProcess.OnReadLn:= @OnReadLn; FExProcess.OnOperationProgress:= @CheckOperationState; FTempFile:= GetTempName(GetTempFolder); AddStateChangedListener([fsosStarting, fsosPausing, fsosStopping], @FileSourceOperationStateChangedNotify); // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; FStatistics.ArchiveFile:= FMultiArchiveFileSource.ArchiveFileName; with FMultiArchiveFileSource do FillAndCount('*.*', SourceFiles, True, FFullFilesTreeToTest, FStatistics.TotalFiles, FStatistics.TotalBytes); // gets full list of files (recursive) end; procedure TMultiArchiveTestArchiveOperation.MainExecute; var I: Integer; MultiArcItem: TMultiArcItem; aFile: TFile; sReadyCommand, sCommandLine: UTF8String; begin MultiArcItem := FMultiArchiveFileSource.MultiArcItem; sCommandLine:= MultiArcItem.FTest; // Get maximum acceptable command errorlevel FErrorLevel:= ExtractErrorLevel(sCommandLine); if Pos('%F', sCommandLine) <> 0 then // test file by file for I:=0 to FFullFilesTreeToTest.Count - 1 do begin aFile:= FFullFilesTreeToTest[I]; UpdateProgress(aFile.FullPath, 0); sReadyCommand:= FormatArchiverCommand( MultiArcItem.FArchiver, sCommandLine, FMultiArchiveFileSource.ArchiveFileName, nil, aFile.FullPath ); OnReadLn(sReadyCommand); FExProcess.SetCmdLine(sReadyCommand); FExProcess.Execute; UpdateProgress(aFile.FullPath, aFile.Size); // Check for errors. CheckForErrors(aFile.FullPath , FExProcess.ExitStatus); end else // test whole file list begin sReadyCommand:= FormatArchiverCommand( MultiArcItem.FArchiver, sCommandLine, FMultiArchiveFileSource.ArchiveFileName, FFullFilesTreeToTest, EmptyStr, EmptyStr, FTempFile ); OnReadLn(sReadyCommand); FExProcess.SetCmdLine(sReadyCommand); FExProcess.Execute; // Check for errors. CheckForErrors(FMultiArchiveFileSource.ArchiveFileName, FExProcess.ExitStatus); end; end; procedure TMultiArchiveTestArchiveOperation.Finalize; begin FreeThenNil(FExProcess); with FMultiArchiveFileSource.MultiArcItem do if not FDebug then mbDeleteFile(FTempFile); end; procedure TMultiArchiveTestArchiveOperation.ShowError(sMessage: String; logOptions: TLogOptions); begin if not gSkipFileOpError then begin if AskQuestion(sMessage, '', [fsourSkip, fsourCancel], fsourSkip, fsourAbort) = fsourAbort then begin RaiseAbortOperation; end; end else begin LogMessage(sMessage, logOptions, lmtError); end; end; procedure TMultiArchiveTestArchiveOperation.LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); begin case logMsgType of lmtError: if not (log_errors in gLogOptions) then Exit; lmtInfo: if not (log_info in gLogOptions) then Exit; lmtSuccess: if not (log_success in gLogOptions) then Exit; end; if logOptions <= gLogOptions then begin logWrite(Thread, sMessage, logMsgType); end; end; procedure TMultiArchiveTestArchiveOperation.OnReadLn(str: string); begin with FMultiArchiveFileSource.MultiArcItem do if FOutput or FDebug then logWrite(Thread, str, lmtInfo, True, False); end; procedure TMultiArchiveTestArchiveOperation.CheckForErrors(const FileName: UTF8String; ExitStatus: LongInt); begin if ExitStatus > FErrorLevel then begin ShowError(Format(rsMsgLogError + rsMsgLogDelete, [FileName + ' - Exit status: ' + IntToStr(ExitStatus)]), [log_arc_op]); end else begin LogMessage(Format(rsMsgLogSuccess + rsMsgLogDelete, [FileName]), [log_arc_op], lmtSuccess); end; end; procedure TMultiArchiveTestArchiveOperation.UpdateProgress(SourceName: UTF8String; IncSize: Int64); begin with FStatistics do begin FStatistics.CurrentFile:= SourceName; DoneBytes := DoneBytes + IncSize; UpdateStatistics(FStatistics); end; end; procedure TMultiArchiveTestArchiveOperation.FileSourceOperationStateChangedNotify (Operation: TFileSourceOperation; AState: TFileSourceOperationState); begin case AState of fsosStarting: FExProcess.Process.Resume; fsosPausing: FExProcess.Process.Suspend; fsosStopping: FExProcess.Stop; end; end; end. doublecmd-0.5.8/src/filesources/multiarchive/fmultiarchivecopyoperationoptions.lfm0000644000175000017500000000167411747211345030123 0ustar alexxalexxinherited MultiArchiveCopyOperationOptionsUI: TMultiArchiveCopyOperationOptionsUI Height = 158 Width = 549 AutoSize = True BorderSpacing.Around = 6 ClientHeight = 158 ClientWidth = 549 TabOrder = 0 DesignLeft = 535 DesignTop = 391 object lblFileExists: TLabel[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = cmbFileExists AnchorSideTop.Side = asrCenter Left = 6 Height = 14 Top = 3 Width = 77 BorderSpacing.Around = 6 Caption = 'When file exists' FocusControl = cmbFileExists ParentColor = False end object cmbFileExists: TComboBox[1] AnchorSideLeft.Control = lblFileExists AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = Owner Left = 91 Height = 21 Top = 0 Width = 109 BorderSpacing.Left = 8 ItemHeight = 13 Items.Strings = ( 'Ask' 'Overwrite' 'Skip' ) Style = csDropDownList TabOrder = 0 end end doublecmd-0.5.8/src/filesources/multiarchive/umultiarchivedeleteoperation.pas0000644000175000017500000001565511747211345027027 0ustar alexxalexxunit uMultiArchiveDeleteOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceOperation, uFileSourceDeleteOperation, uFileSource, uFileSourceOperationUI, uFile, uMultiArchiveFileSource, uGlobs, uLog, un_process; type { TMultiArchiveDeleteOperation } TMultiArchiveDeleteOperation = class(TFileSourceDeleteOperation) private FMultiArchiveFileSource: IMultiArchiveFileSource; FStatistics: TFileSourceDeleteOperationStatistics; // local copy of statistics FFullFilesTreeToDelete: TFiles; // source files including all files/dirs in subdirectories procedure ShowError(sMessage: String; logOptions: TLogOptions); procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); procedure CheckForErrors(const FileName: UTF8String; ExitStatus: LongInt); protected FExProcess: TExProcess; FTempFile: UTF8String; FErrorLevel: LongInt; procedure OnReadLn(str: string); procedure UpdateProgress(SourceName: UTF8String; IncSize: Int64); procedure FileSourceOperationStateChangedNotify(Operation: TFileSourceOperation; AState: TFileSourceOperationState); public constructor Create(aTargetFileSource: IFileSource; var theFilesToDelete: TFiles); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; end; implementation uses uOSUtils, DCOSUtils, uLng, uMultiArc, uMultiArchiveUtil, LCLProc; constructor TMultiArchiveDeleteOperation.Create(aTargetFileSource: IFileSource; var theFilesToDelete: TFiles); begin FMultiArchiveFileSource := aTargetFileSource as IMultiArchiveFileSource; FFullFilesTreeToDelete:= nil; inherited Create(aTargetFileSource, theFilesToDelete); end; destructor TMultiArchiveDeleteOperation.Destroy; begin FreeThenNil(FFullFilesTreeToDelete); inherited Destroy; end; procedure TMultiArchiveDeleteOperation.Initialize; begin FExProcess:= TExProcess.Create(EmptyStr); FExProcess.OnReadLn:= @OnReadLn; FExProcess.OnOperationProgress:= @CheckOperationState; FTempFile:= GetTempName(GetTempFolder); AddStateChangedListener([fsosStarting, fsosPausing, fsosStopping], @FileSourceOperationStateChangedNotify); // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; with FMultiArchiveFileSource do FillAndCount('*.*', FilesToDelete, True, FFullFilesTreeToDelete, FStatistics.TotalFiles, FStatistics.TotalBytes); // gets full list of files (recursive) end; procedure TMultiArchiveDeleteOperation.MainExecute; var I: Integer; MultiArcItem: TMultiArcItem; aFile: TFile; sReadyCommand, sCommandLine: UTF8String; begin MultiArcItem := FMultiArchiveFileSource.MultiArcItem; sCommandLine:= MultiArcItem.FDelete; // Get maximum acceptable command errorlevel FErrorLevel:= ExtractErrorLevel(sCommandLine); if Pos('%F', sCommandLine) <> 0 then // delete file by file for I:=0 to FFullFilesTreeToDelete.Count - 1 do begin aFile:= FFullFilesTreeToDelete[I]; UpdateProgress(aFile.FullPath, 0); sReadyCommand:= FormatArchiverCommand( MultiArcItem.FArchiver, sCommandLine, FMultiArchiveFileSource.ArchiveFileName, nil, aFile.FullPath ); OnReadLn(sReadyCommand); FExProcess.SetCmdLine(sReadyCommand); FExProcess.Execute; UpdateProgress(aFile.FullPath, aFile.Size); // Check for errors. CheckForErrors(aFile.FullPath , FExProcess.ExitStatus); end else // delete whole file list begin sReadyCommand:= FormatArchiverCommand( MultiArcItem.FArchiver, sCommandLine, FMultiArchiveFileSource.ArchiveFileName, FFullFilesTreeToDelete, EmptyStr, EmptyStr, FTempFile ); OnReadLn(sReadyCommand); FExProcess.SetCmdLine(sReadyCommand); FExProcess.Execute; // Check for errors. CheckForErrors(FMultiArchiveFileSource.ArchiveFileName, FExProcess.ExitStatus); end; end; procedure TMultiArchiveDeleteOperation.Finalize; begin FreeThenNil(FExProcess); with FMultiArchiveFileSource.MultiArcItem do if not FDebug then mbDeleteFile(FTempFile); end; procedure TMultiArchiveDeleteOperation.ShowError(sMessage: String; logOptions: TLogOptions); begin if not gSkipFileOpError then begin if AskQuestion(sMessage, '', [fsourSkip, fsourCancel], fsourSkip, fsourAbort) = fsourAbort then begin RaiseAbortOperation; end; end else begin LogMessage(sMessage, logOptions, lmtError); end; end; procedure TMultiArchiveDeleteOperation.LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); begin case logMsgType of lmtError: if not (log_errors in gLogOptions) then Exit; lmtInfo: if not (log_info in gLogOptions) then Exit; lmtSuccess: if not (log_success in gLogOptions) then Exit; end; if logOptions <= gLogOptions then begin logWrite(Thread, sMessage, logMsgType); end; end; procedure TMultiArchiveDeleteOperation.OnReadLn(str: string); begin with FMultiArchiveFileSource.MultiArcItem do if FOutput or FDebug then logWrite(Thread, str, lmtInfo, True, False); end; procedure TMultiArchiveDeleteOperation.CheckForErrors(const FileName: UTF8String; ExitStatus: LongInt); begin if ExitStatus > FErrorLevel then begin ShowError(Format(rsMsgLogError + rsMsgLogDelete, [FileName + ' - Exit status: ' + IntToStr(ExitStatus)]), [log_arc_op]); end else begin LogMessage(Format(rsMsgLogSuccess + rsMsgLogDelete, [FileName]), [log_arc_op], lmtSuccess); end; end; procedure TMultiArchiveDeleteOperation.UpdateProgress(SourceName: UTF8String; IncSize: Int64); begin with FStatistics do begin FStatistics.CurrentFile:= SourceName; DoneBytes := DoneBytes + IncSize; UpdateStatistics(FStatistics); end; end; procedure TMultiArchiveDeleteOperation.FileSourceOperationStateChangedNotify( Operation: TFileSourceOperation; AState: TFileSourceOperationState); begin case AState of fsosStarting: FExProcess.Process.Resume; fsosPausing: FExProcess.Process.Suspend; fsosStopping: FExProcess.Stop; end; end; end. doublecmd-0.5.8/src/filesources/multiarchive/umultiarchiveutil.pas0000644000175000017500000004661312215301020024574 0ustar alexxalexxunit uMultiArchiveUtil; {$mode objfpc}{$H+} {.$DEFINE DEBUG} interface uses Classes, SysUtils, uMultiArc, un_process, uFile, DCBasicTypes; const MAF_UNIX_PATH = 1; // Use Unix path delimiter (/) MAF_WIN_PATH = 2; // Use Windows path delimiter (\) MAF_UNIX_ATTR = 4; // Use Unix file attributes MAF_WIN_ATTR = 8; // Use Windows file attributes type TOnGetArchiveItem = procedure(ArchiveItem: TArchiveItem) of object; TGetFileAttr = function(sAttr: String): TFileAttrs; TGetFileName = function(const Str: String): UTF8String; TKeyPos = record Index, Start, Count: longint; end; { TOutputParser } TOutputParser = class FPassword: UTF8String; FMultiArcItem: TMultiArcItem; FExProcess: TExProcess; private FNamePos, FUnpSizePos, FPackSizePos, FYearPos, FMonthPos, FMonthNamePos, FDayPos, FHourPos, FHourModifierPos, FMinPos, FSecPos, FAttrPos: TKeyPos; private FOnGetArchiveItem: TOnGetArchiveItem; FStartParsing: boolean; FFormatIndex: longint; FArchiveItem: TArchiveItem; FArchiveName: UTF8String; FGetFileAttr: TGetFileAttr; FGetFileName: TGetFileName; protected procedure SplitFileName; function FixPosition(const Str: String; Key: TKeyPos): LongInt; function KeyPos(Key: char; out Position: TKeyPos): boolean; function GetKeyValue(const str: String; Key: TKeyPos): UTF8String; procedure OnReadLn(str: string); procedure OnQueryString(str: string); function CheckOut(const SubStr, Str: string): boolean; public constructor Create(aMultiArcItem: TMultiArcItem; const anArchiveName: UTF8String); destructor Destroy; override; procedure Prepare; procedure Execute; property Password: UTF8String read FPassword; property OnGetArchiveItem: TOnGetArchiveItem read FOnGetArchiveItem write FOnGetArchiveItem; end; function ExtractErrorLevel(var Command: UTF8String): LongInt; function FormatArchiverCommand(const Archiver, sCmd, anArchiveName: UTF8String; aFiles: TFiles = nil; sFileName: UTF8String = ''; aDestPath: UTF8String = ''; sTempFile: UTF8String = ''; sPassword: UTF8String = ''; sVolumeSize: UTF8String = ''; sCustomParams: UTF8String = ''): string; implementation uses LCLProc, FileUtil, StrUtils, DCClassesUtf8, uDCUtils, DCOSUtils, uOSUtils, DCDateTimeUtils, uDebug, uShowMsg, uLng, DCFileAttributes; function GetUnixFileName(const Str: String): UTF8String; var I: Integer; begin Result:= ConsoleToUTF8(Str); for I:= 1 to Length(Str) do if Result[I] = '/' then Result[I]:= PathDelim; end; function GetWinFileName(const Str: String): UTF8String; var I: Integer; begin Result:= ConsoleToUTF8(Str); for I:= 1 to Length(Str) do if Result[I] = '\' then Result[I]:= PathDelim; end; { TOutputParser } procedure TOutputParser.SplitFileName; var Index: Integer; begin Index:= Pos(' -> ', FArchiveItem.FileName); if Index > 0 then begin FArchiveItem.FileLink:= Copy(FArchiveItem.FileName, Index + 4, MaxInt); FArchiveItem.FileName:= Copy(FArchiveItem.FileName, 1, Index - 1); end end; function TOutputParser.FixPosition(const Str: String; Key: TKeyPos): LongInt; var I, K, U, C: LongInt; Format: String; begin I:= 0; U:= 0; Result:= Key.Start; Format:= FMultiArcItem.FFormat[Key.Index]; repeat C:= 0; I:= PosEx('*', Format, I + 1); if (I = 0) or (I >= Result) then Exit; if (I > 0) then begin I:= I + U; K:= I; while (K <= Length(Str)) and (Str[K] <> #32) do begin Inc(C); Inc(K); end; if C > 0 then U:= C - 1 else U:= 0; Result:= Result + U; end; until I = 0; end; function TOutputParser.KeyPos(Key: char; out Position: TKeyPos): boolean; var I: integer; Format: string; begin Result := False; Position.Index := -1; for I := 0 to FMultiArcItem.FFormat.Count - 1 do with FMultiArcItem do begin Format := FFormat[I]; Position.Start := Pos(Key, Format); if Position.Start = 0 then Continue; Position.Count:= Position.Start; while ((Position.Count <= Length(Format)) and (Format[Position.Count] = Key)) do Inc(Position.Count); Position.Count := Position.Count - Position.Start; Position.Index := I; {$IFDEF DEBUG} DCDebug('Key: ', Key, ' Format: ', IntToStr(I), ' Start: ', IntToStr(Position.Start), ' Count: ', IntToStr(Position.Count)); {$ENDIF} Result := True; Break; end; end; function TOutputParser.GetKeyValue(const str: String; Key: TKeyPos): UTF8String; begin Result:= Copy(str, FixPosition(str, Key), Key.Count); end; { TOutputParser } procedure TOutputParser.OnReadLn(str: string); begin if FMultiArcItem.FDebug then DCDebug(str); if (str = EmptyStr) or (Trim(str) = EmptyStr) then Exit; // skip empty lines if not FStartParsing then FStartParsing:= (FMultiArcItem.FStart = EmptyStr); // if not defined start line if FStartParsing and (FMultiArcItem.FEnd <> EmptyStr) and CheckOut(FMultiArcItem.FEnd, Str) then begin FExProcess.Stop; Exit; end; if FStartParsing then begin // if next item if FFormatIndex = 0 then FArchiveItem := TArchiveItem.Create; // get all file properties if FNamePos.Index = FFormatIndex then FArchiveItem.FileName := FGetFileName(Trim(GetKeyValue(str, FNamePos))); if FUnpSizePos.Index = FFormatIndex then FArchiveItem.UnpSize := StrToInt64Def(Trim(GetKeyValue(str, FUnpSizePos)), 0); if FPackSizePos.Index = FFormatIndex then FArchiveItem.PackSize := StrToInt64Def(Trim(GetKeyValue(str, FPackSizePos)), 0); if FYearPos.Index = FFormatIndex then FArchiveItem.Year := YearShortToLong(StrToIntDef(Trim(GetKeyValue(str, FYearPos)), 0)); if FMonthPos.Index = FFormatIndex then FArchiveItem.Month := StrToIntDef(Trim(GetKeyValue(str, FMonthPos)), 0); if FMonthNamePos.Index = FFormatIndex then FArchiveItem.Month := MonthToNumberDef(GetKeyValue(str, FMonthNamePos), 0); if FDayPos.Index = FFormatIndex then FArchiveItem.Day := StrToIntDef(Trim(GetKeyValue(str, FDayPos)), 0); if FHourPos.Index = FFormatIndex then FArchiveItem.Hour := StrToIntDef(Trim(GetKeyValue(str, FHourPos)), 0); if FHourModifierPos.Index = FFormatIndex then FArchiveItem.Hour := TwelveToTwentyFour(FArchiveItem.Hour, GetKeyValue(str, FHourModifierPos)); if FMinPos.Index = FFormatIndex then FArchiveItem.Minute := StrToIntDef(Trim(GetKeyValue(str, FMinPos)), 0); if FSecPos.Index = FFormatIndex then FArchiveItem.Second := StrToIntDef(Trim(GetKeyValue(str, FSecPos)), 0); if FAttrPos.Index = FFormatIndex then FArchiveItem.Attributes := FGetFileAttr(GetKeyValue(str, FAttrPos)); FFormatIndex := FFormatIndex + 1; if FFormatIndex >= FMultiArcItem.FFormat.Count then begin FFormatIndex := 0; {$IFDEF DEBUG} DCDebug('FileName: ', FArchiveItem.FileName); DCDebug('Size: ', IntToStr(FArchiveItem.UnpSize)); DCDebug('Pack size: ', IntToStr(FArchiveItem.PackSize)); DCDebug('Attributes: ', IntToStr(FArchiveItem.Attributes)); DCDebug('-------------------------------------'); {$ENDIF} with FArchiveItem do begin if ((Attributes and S_IFLNK) <> 0) or ((Attributes and FILE_ATTRIBUTE_REPARSE_POINT) <> 0) then SplitFileName; end; if Assigned(FOnGetArchiveItem) then FOnGetArchiveItem(FArchiveItem); end; end else begin FStartParsing := (FMultiArcItem.FStart = EmptyStr) or CheckOut(FMultiArcItem.FStart, Str); if FStartParsing then FFormatIndex := 0; end; end; procedure TOutputParser.OnQueryString(str: string); var pcPassword: PAnsiChar; begin ShowInputQuery(FMultiArcItem.FDescription, rsMsgPasswordEnter, True, FPassword); pcPassword:= PAnsiChar(UTF8ToConsole(FPassword + #13#10)); FExProcess.Process.Input.Write(pcPassword^, Length(pcPassword)); end; function TOutputParser.CheckOut(const SubStr, Str: string): boolean; begin if SubStr[1] = '^' then Result := (Pos(PChar(SubStr) + 1, Str) = 1) else Result := (Pos(SubStr, Str) > 0); end; constructor TOutputParser.Create(aMultiArcItem: TMultiArcItem; const anArchiveName: UTF8String); begin FMultiArcItem := aMultiArcItem; FArchiveName:= anArchiveName; FExProcess := nil; with FMultiArcItem do begin // Setup function to process file attributes if (FFormMode and MAF_UNIX_ATTR) <> 0 then FGetFileAttr:= @UnixStrToFileAttr else if (FFormMode and MAF_WIN_ATTR) <> 0 then FGetFileAttr:= @WinStrToFileAttr else FGetFileAttr:= @StrToFileAttr; // Setup function to process file name if ((FFormMode and MAF_UNIX_PATH) <> 0) and (PathDelim <> '/') then FGetFileName:= @GetUnixFileName else if ((FFormMode and MAF_WIN_PATH) <> 0) and (PathDelim <> '\') then FGetFileName:= @GetWinFileName else FGetFileName:= @ConsoleToUTF8; end; end; destructor TOutputParser.Destroy; begin FreeThenNil(FExProcess); inherited Destroy; end; procedure TOutputParser.Execute; begin // get positions of all properties KeyPos('n', FNamePos); // file name KeyPos('z', FUnpSizePos); // unpacked size KeyPos('p', FPackSizePos); // packed size KeyPos('y', FYearPos); KeyPos('t', FMonthPos); KeyPos('T', FMonthNamePos); KeyPos('d', FDayPos); KeyPos('h', FHourPos); KeyPos('H', FHourModifierPos); KeyPos('m', FMinPos); KeyPos('s', FSecPos); KeyPos('a', FAttrPos); // execute archiver FExProcess.Execute; end; procedure TOutputParser.Prepare; var sCommandLine: UTF8String; begin FStartParsing:= False; FFormatIndex:= 0; FreeThenNil(FExProcess); sCommandLine:= FormatArchiverCommand(FMultiArcItem.FArchiver, FMultiArcItem.FList, FArchiveName); if FMultiArcItem.FDebug then DCDebug(sCommandLine); FExProcess := TExProcess.Create(sCommandLine); FExProcess.OnReadLn := @OnReadLn; if Length(FMultiArcItem.FPasswordQuery) <> 0 then begin FExProcess.QueryString:= UTF8ToConsole(FMultiArcItem.FPasswordQuery); FExProcess.OnQueryString:= @OnQueryString; end; end; function ExtractErrorLevel(var Command: UTF8String): LongInt; var I, J: Integer; sErrorLevel: String; begin Result:= 0; I:= Pos('%E', Command); if I > 0 then begin J:= I + 2; while (J <= Length(Command)) and (Command[J] in ['0'..'9']) do Inc(J); sErrorLevel:= Copy(Command, I + 2, J - I - 2); Delete(Command, I, J - I); Result:= StrToIntDef(sErrorLevel, 0); end; end; function FormatArchiverCommand(const Archiver, sCmd, anArchiveName: UTF8String; aFiles: TFiles; sFileName: UTF8String; aDestPath: UTF8String; sTempFile: UTF8String; sPassword: UTF8String; sVolumeSize: UTF8String; sCustomParams: UTF8String): string; type TFunctType = (ftNone, ftArchiverLongName, ftArchiverShortName, ftArchiveLongName, ftArchiveShortName, ftFileListLongName, ftFileListShortName, ftFileName, ftTargetArchiveDir, ftVolumeSize, ftPassword, ftCustomParams); TStatePos = (spNone, spPercent, spFunction, spComplete); TFuncModifiers = set of (fmOnlyFiles, fmQuoteWithSpaces, fmQuoteAny, fmNameOnly, fmPathOnly, fmUTF8, fmAnsi); TState = record pos: TStatePos; functStartIndex, bracketStartIndex: integer; funct: TFunctType; FuncModifiers: TFuncModifiers; closeBracket: Boolean; end; var index: integer; state: Tstate; sOutput: string = ''; parseStartIndex: integer; function BuildName(const sFileName: UTF8String): UTF8String; begin Result := sFileName; if fmNameOnly in state.FuncModifiers then Result := ExtractFileName(Result); if fmPathOnly in state.FuncModifiers then Result := ExtractFilePath(Result); if (fmQuoteWithSpaces in state.FuncModifiers) and (Pos(#32, Result) <> 0) then Result := '"' + Result + '"'; if (fmQuoteAny in state.FuncModifiers) then Result := '"' + Result + '"'; if (fmUTF8 in state.FuncModifiers) then Exit; if (fmAnsi in state.FuncModifiers) then Result := UTF8ToSys(Result) else Result := UTF8ToConsole(Result); end; function BuildFileList(bShort: boolean): UTF8String; var I: integer; FileList: TStringListEx; begin if not Assigned(aFiles) then Exit(EmptyStr); Result := sTempFile; FileList := TStringListEx.Create; for I := 0 to aFiles.Count - 1 do begin if aFiles[I].IsDirectory and (fmOnlyFiles in state.FuncModifiers) then Continue; if bShort then FileList.Add(BuildName(mbFileNameToSysEnc(aFiles[I].FullPath))) else FileList.Add(BuildName(aFiles[I].FullPath)); end; try FileList.SaveToFile(Result); except Result := EmptyStr; end; FileList.Free; end; function BuildOutput: UTF8String; begin case state.funct of ftArchiverLongName: // TProcess arguments must be enclosed with double quotes and not escaped. Result := '"' + mbExpandFileName(Archiver) + '"'; ftArchiverShortName: // TProcess arguments must be enclosed with double quotes and not escaped. Result := '"' + mbFileNameToSysEnc(mbExpandFileName(Archiver)) + '"'; ftArchiveLongName: Result := BuildName(anArchiveName); ftArchiveShortName: Result := BuildName(mbFileNameToSysEnc(anArchiveName)); ftFileListLongName: Result := BuildFileList(False); ftFileListShortName: Result := BuildFileList(True); ftFileName: Result:= BuildName(sFileName); ftTargetArchiveDir: Result := BuildName(aDestPath); ftVolumeSize: Result:= sVolumeSize; ftPassword: Result:= UTF8ToConsole(sPassword); ftCustomParams: Result:= sCustomParams; else Exit(''); end; end; procedure ResetState(var aState: TState); begin with aState do begin pos := spNone; funct := ftNone; functStartIndex := 0; FuncModifiers := []; if closeBracket then begin closeBracket:= False; bracketStartIndex:= 0; end; end; end; procedure AddParsedText(limit: integer); begin // Copy [parseStartIndex .. limit - 1]. if limit > parseStartIndex then sOutput := sOutput + Copy(sCmd, parseStartIndex, limit - parseStartIndex); parseStartIndex := index; end; procedure AddBrackedText(limit: integer); begin // Copy [state.bracketStartIndex + 1 .. limit - 1]. if limit > state.bracketStartIndex then sOutput := sOutput + Copy(sCmd, state.bracketStartIndex + 1, limit - state.bracketStartIndex - 1); end; procedure DoFunction; var aOutput: UTF8String; begin aOutput:= BuildOutput; if (aOutput = EmptyStr) and (state.bracketStartIndex <> 0) then begin AddParsedText(state.bracketStartIndex); end else begin if (state.bracketStartIndex <> 0) then begin // add text before bracket AddParsedText(state.bracketStartIndex); //add text after bracket AddBrackedText(state.functStartIndex); end else AddParsedText(state.functStartIndex); sOutput := sOutput + aOutput; end; ResetState(state); end; begin try index := 1; parseStartIndex := index; FillByte(state, SizeOf(state), 0); ResetState(state); while index <= Length(sCmd) do begin case state.pos of spNone: case sCmd[index] of '%': begin state.pos := spPercent; state.functStartIndex := index; end; '{': begin state.bracketStartIndex := index; end; end; spPercent: case sCmd[index] of 'P': begin state.funct := ftArchiverLongName; state.pos := spFunction; end; 'p': begin state.funct := ftArchiverShortName; state.pos := spFunction; end; 'A': begin state.funct := ftArchiveLongName; state.pos := spFunction; end; 'a': begin state.funct := ftArchiveShortName; state.pos := spFunction; end; 'L': begin state.funct := ftFileListLongName; state.pos := spFunction; end; 'l': begin state.funct := ftFileListShortName; state.pos := spFunction; end; 'F': begin state.funct := ftFileName; state.pos := spFunction; end; 'R': begin state.funct := ftTargetArchiveDir; state.pos := spFunction; end; 'V': begin state.funct := ftVolumeSize; state.pos := spFunction; end; 'W': begin state.funct := ftPassword; state.pos := spFunction; end; 'S': begin state.funct := ftCustomParams; state.pos := spFunction; end; else state.pos := spFunction; end; spFunction: case sCmd[index] of 'F': begin state.FuncModifiers := state.FuncModifiers + [fmOnlyFiles]; state.pos := spFunction; end; 'Q': begin state.FuncModifiers := state.FuncModifiers + [fmQuoteWithSpaces]; state.pos := spFunction; end; 'q': begin state.FuncModifiers := state.FuncModifiers + [fmQuoteAny]; state.pos := spFunction; end; 'W': begin state.FuncModifiers := state.FuncModifiers + [fmNameOnly]; state.pos := spFunction; end; 'P': begin state.FuncModifiers := state.FuncModifiers + [fmPathOnly]; state.pos := spFunction; end; 'U': begin state.FuncModifiers := state.FuncModifiers + [fmUTF8]; state.pos := spFunction; end; 'A': begin state.FuncModifiers := state.FuncModifiers + [fmAnsi]; state.pos := spFunction; end; '}': begin state.closeBracket:= True; end else state.pos := spComplete; end; end; if state.pos <> spComplete then Inc(index) // check next character else // Process function and then check current character again after resetting state. DoFunction; end; // while // Finish current parse. if state.pos in [spFunction] then DoFunction else AddParsedText(index); Result := sOutput; finally end; end; end. doublecmd-0.5.8/src/filesources/multiarchive/umultiarchivecopyoutoperation.pas0000644000175000017500000004726212204103540027250 0ustar alexxalexxunit uMultiArchiveCopyOutOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StringHashList, uLog, uGlobs, un_process, uFileSourceOperation, uFileSourceCopyOperation, uFileSourceOperationOptions, uFileSourceOperationOptionsUI, uFileSource, uFile, uMultiArchiveFileSource; type { TMultiArchiveCopyOutOperation } TMultiArchiveCopyOutOperation = class(TFileSourceCopyOutOperation) private FMultiArchiveFileSource: IMultiArchiveFileSource; FStatistics: TFileSourceCopyOperationStatistics; // local copy of statistics FFullFilesTreeToExtract: TFiles; // source files including all files/dirs in subdirectories // Options FPassword: UTF8String; FExtractWithoutPath: Boolean; FFileExistsOption: TFileSourceOperationOptionFileExists; {en Creates neccessary paths before extracting files from archive. @param(Files List of files/directories to extract (relative to archive root).) @param(sDestPath Destination path where the files will be extracted.) @param(CurrentArchiveDir Path inside the archive from where the files will be extracted.) @param(CreatedPaths This list will be filled with absolute paths to directories that were created, together with their attributes.)} procedure CreateDirs(const theFiles: TFiles; sDestPath: String; CurrentArchiveDir: String; var CreatedPaths: TStringHashList); {en Sets attributes for directories. @param(Paths The list of absolute paths, which attributes are to be set. Each list item's data field must be a pointer to TMultiArchiveFile, from where the attributes are retrieved.} function SetDirsAttributes(const Paths: TStringHashList): Boolean; function DoFileExists(const AbsoluteTargetFileName: String): TFileSourceOperationOptionFileExists; procedure ShowError(sMessage: String; logOptions: TLogOptions = []); procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); procedure CheckForErrors(const SourceName, TargetName: UTF8String; ExitStatus: LongInt); protected FExProcess: TExProcess; FTempFile: UTF8String; FFileMask: UTF8String; FErrorLevel: LongInt; procedure OnReadLn(str: string); procedure OnQueryString(str: string); procedure UpdateProgress(SourceName, TargetName: UTF8String; IncSize: Int64); procedure FileSourceOperationStateChangedNotify(Operation: TFileSourceOperation; AState: TFileSourceOperationState); public constructor Create(aSourceFileSource: IFileSource; aTargetFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; class function GetOptionsUIClass: TFileSourceOperationOptionsUIClass; override; property Password: UTF8String read FPassword write FPassword; property FileExistsOption: TFileSourceOperationOptionFileExists read FFileExistsOption write FFileExistsOption; property ExtractWithoutPath: Boolean read FExtractWithoutPath write FExtractWithoutPath; end; implementation uses LCLProc, FileUtil, uOSUtils, DCOSUtils, DCStrUtils, uMultiArc, uFileSourceOperationUI, fMultiArchiveCopyOperationOptions, uMultiArchiveUtil, uFileProcs, uLng, DCDateTimeUtils, DCBasicTypes, uShowMsg; constructor TMultiArchiveCopyOutOperation.Create(aSourceFileSource: IFileSource; aTargetFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); begin FMultiArchiveFileSource := aSourceFileSource as IMultiArchiveFileSource; FPassword:= FMultiArchiveFileSource.Password; FFullFilesTreeToExtract:= nil; FFileExistsOption := fsoofeNone; FExtractWithoutPath:= False; inherited Create(aSourceFileSource, aTargetFileSource, theSourceFiles, aTargetPath); end; destructor TMultiArchiveCopyOutOperation.Destroy; begin FreeThenNil(FFullFilesTreeToExtract); inherited Destroy; end; procedure TMultiArchiveCopyOutOperation.Initialize; begin FExProcess:= TExProcess.Create(EmptyStr); FExProcess.OnReadLn:= @OnReadLn; FExProcess.OnOperationProgress:= @CheckOperationState; FTempFile:= GetTempName(GetTempFolder); with FMultiArchiveFileSource.MultiArcItem do if Length(FPasswordQuery) <> 0 then begin FExProcess.QueryString:= UTF8ToConsole(FPasswordQuery); FExProcess.OnQueryString:= @OnQueryString; end; AddStateChangedListener([fsosStarting, fsosPausing, fsosStopping], @FileSourceOperationStateChangedNotify); // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; FFileMask := ExtractFileName(TargetPath); if FFileMask = '' then FFileMask := '*'; // extract all selected files/folders with FMultiArchiveFileSource do FillAndCount(FFileMask, SourceFiles, True, FFullFilesTreeToExtract, FStatistics.TotalFiles, FStatistics.TotalBytes); // gets full list of files (recursive) end; procedure TMultiArchiveCopyOutOperation.MainExecute; var TargetFileName, SourcePath, sTempDir: UTF8String; CreatedPaths: TStringHashList = nil; I: Integer; aFile: TFile; MultiArcItem: TMultiArcItem; sReadyCommand, sCommandLine: UTF8String; FilesToExtract: TFiles = nil; begin MultiArcItem := FMultiArchiveFileSource.MultiArcItem; try // Archive current path SourcePath:= ExcludeFrontPathDelimiter(SourceFiles.Path); // Check ExtractWithoutPath option if FExtractWithoutPath then sCommandLine:= MultiArcItem.FExtractWithoutPath else begin // Create needed directories. CreatedPaths := TStringHashList.Create(True); CreateDirs(FFullFilesTreeToExtract, TargetPath, SourcePath, CreatedPaths); sCommandLine:= MultiArcItem.FExtract; end; // Get maximum acceptable command errorlevel FErrorLevel:= ExtractErrorLevel(sCommandLine); if Pos('%F', sCommandLine) <> 0 then // extract file by file for I:= 0 to FFullFilesTreeToExtract.Count - 1 do begin CheckOperationState; aFile:= FFullFilesTreeToExtract[I]; // Now check if the file is to be extracted. if (not aFile.AttributesProperty.IsDirectory) then // Omit directories (we handle them ourselves). begin // Check ExtractWithoutPath option if FExtractWithoutPath then TargetFileName := TargetPath + aFile.Name else TargetFileName := TargetPath + ExtractDirLevel(SourcePath, aFile.FullPath); // Check existence of target file if (DoFileExists(TargetFileName) <> fsoofeOverwrite) then Continue; // Get target directory sTempDir:= ExtractFileDir(TargetFileName); UpdateProgress(aFile.FullPath, TargetFileName, 0); sReadyCommand:= FormatArchiverCommand( MultiArcItem.FArchiver, sCommandLine, FMultiArchiveFileSource.ArchiveFileName, nil, aFile.FullPath, TargetPath, FTempFile, FPassword ); OnReadLn(sReadyCommand); // Set target directory as archiver current directory FExProcess.Process.CurrentDirectory:= mbFileNameToSysEnc(sTempDir); FExProcess.SetCmdLine(sReadyCommand); FExProcess.Execute; UpdateProgress(aFile.FullPath, TargetFileName, aFile.Size); // Check for errors. CheckForErrors(aFile.FullPath, TargetFileName, FExProcess.ExitStatus); end; end // for else // extract whole file list begin sTempDir:= TargetPath; // directory where files will be unpacked // if extract from not root directory and with path if (SourceFiles.Path <> PathDelim) and (FExtractWithoutPath = False) then begin sTempDir:= GetTempName(TargetPath); mbCreateDir(sTempDir); end; // Check existence of target files FilesToExtract:= TFiles.Create(FFullFilesTreeToExtract.Path); for I:= 0 to FFullFilesTreeToExtract.Count - 1 do begin aFile:= FFullFilesTreeToExtract[I]; if FExtractWithoutPath then TargetFileName := TargetPath + aFile.Name else TargetFileName := TargetPath + ExtractDirLevel(SourcePath, aFile.FullPath); if (DoFileExists(TargetFileName) = fsoofeOverwrite) then FilesToExtract.Add(aFile.Clone); end; sReadyCommand:= FormatArchiverCommand( MultiArcItem.FArchiver, sCommandLine, FMultiArchiveFileSource.ArchiveFileName, FilesToExtract, EmptyStr, TargetPath, FTempFile, FPassword ); OnReadLn(sReadyCommand); // Set target directory as archiver current directory FExProcess.Process.CurrentDirectory:= mbFileNameToSysEnc(sTempDir); FExProcess.SetCmdLine(sReadyCommand); FExProcess.Execute; // Check for errors. CheckForErrors(FMultiArchiveFileSource.ArchiveFileName, EmptyStr, FExProcess.ExitStatus); // if extract from not root directory and with path if (SourceFiles.Path <> PathDelim) and (FExtractWithoutPath = False) then begin // move files to real target directory for I:= 0 to FilesToExtract.Count - 1 do begin aFile:= FilesToExtract[I]; if not aFile.AttributesProperty.IsDirectory then begin TargetFileName := TargetPath + ExtractDirLevel(SourcePath, aFile.FullPath); UpdateProgress(aFile.FullPath, TargetFileName, 0); mbRenameFile(sTempDir + PathDelim + aFile.FullPath, TargetFileName); UpdateProgress(aFile.FullPath, TargetFileName, aFile.Size); end end; DelTree(sTempDir); end; end; if (FExtractWithoutPath = False) then SetDirsAttributes(CreatedPaths); finally FreeThenNil(CreatedPaths); FreeThenNil(FilesToExtract); end; end; procedure TMultiArchiveCopyOutOperation.Finalize; begin FreeThenNil(FExProcess); with FMultiArchiveFileSource.MultiArcItem do if not FDebug then mbDeleteFile(FTempFile); end; procedure TMultiArchiveCopyOutOperation.CreateDirs( const theFiles: TFiles; sDestPath: String; CurrentArchiveDir: String; var CreatedPaths: TStringHashList); var // List of paths that we know must be created. PathsToCreate: TStringHashList; // List of possible directories to create with their attributes. // This hash list is created to speed up searches for attributes in archive file list. DirsAttributes: TStringHashList; i: Integer; CurrentFileName: String; aFile: TFile; Directories: TStringList; PathIndex: Integer; ListIndex: Integer; TargetDir: String; begin { First, collect all the paths that need to be created and their attributes. } PathsToCreate := TStringHashList.Create(True); DirsAttributes := TStringHashList.Create(True); for I := 0 to theFiles.Count - 1 do begin aFile := theFiles[I]; if aFile.AttributesProperty.IsDirectory then begin CurrentFileName := ExtractDirLevel(CurrentArchiveDir, aFile.FullPath); // Save this directory and a pointer to its entry. DirsAttributes.Add(CurrentFileName, aFile); // Paths in PathsToCreate list must end with path delimiter. CurrentFileName := IncludeTrailingPathDelimiter(CurrentFileName); if PathsToCreate.Find(CurrentFileName) < 0 then PathsToCreate.Add(CurrentFileName); end else begin CurrentFileName := ExtractDirLevel(CurrentArchiveDir, aFile.Path); // If CurrentFileName is empty now then it was a file in current archive // directory, therefore we don't have to create any paths for it. if Length(CurrentFileName) > 0 then if PathsToCreate.Find(CurrentFileName) < 0 then PathsToCreate.Add(CurrentFileName); end; end; { Second, create paths and save which paths were created and their attributes. } Directories := TStringList.Create; try sDestPath := IncludeTrailingPathDelimiter(sDestPath); // Create path to destination directory (we don't have attributes for that). mbForceDirectory(sDestPath); CreatedPaths.Clear; for PathIndex := 0 to PathsToCreate.Count - 1 do begin Directories.Clear; // Create also all parent directories of the path to create. // This adds directories to list in order from the outer to inner ones, // for example: dir, dir/dir2, dir/dir2/dir3. if GetDirs(PathsToCreate.List[PathIndex]^.Key, Directories) <> -1 then try for i := 0 to Directories.Count - 1 do begin TargetDir := sDestPath + Directories.Strings[i]; if (CreatedPaths.Find(TargetDir) = -1) and (not DirPathExists(TargetDir)) then begin if mbForceDirectory(TargetDir) = False then begin // Error, cannot create directory. Break; // Don't try to create subdirectories. end else begin // Retrieve attributes for this directory, if they are stored. ListIndex := DirsAttributes.Find(Directories.Strings[i]); if ListIndex <> -1 then aFile := TFile(DirsAttributes.List[ListIndex]^.Data) else aFile := nil; CreatedPaths.Add(TargetDir, aFile); end; end; end; except end; end; finally FreeAndNil(PathsToCreate); FreeAndNil(DirsAttributes); FreeAndNil(Directories); end; end; function TMultiArchiveCopyOutOperation.SetDirsAttributes(const Paths: TStringHashList): Boolean; var PathIndex: Integer; TargetDir: String; aFile: TFile; Time: TFileTime; begin Result := True; for PathIndex := 0 to Paths.Count - 1 do begin // Get attributes. aFile := TFile(Paths.List[PathIndex]^.Data); if Assigned(aFile) then begin TargetDir := Paths.List[PathIndex]^.Key; try {$IF DEFINED(MSWINDOWS)} // Restore attributes, e.g., hidden, read-only. // On Unix attributes value would have to be translated somehow. mbFileSetAttr(TargetDir, aFile.Attributes); {$ENDIF} Time:= DateTimeToFileTime(aFile.ModificationTime); // Set creation, modification time mbFileSetTime(TargetDir, Time, Time, Time); except Result := False; end; end; end; end; function TMultiArchiveCopyOutOperation.DoFileExists( const AbsoluteTargetFileName: String): TFileSourceOperationOptionFileExists; const PossibleResponses: array[0..4] of TFileSourceOperationUIResponse = (fsourOverwrite, fsourSkip, fsourOverwriteAll, fsourSkipAll, fsourCancel); begin case FFileExistsOption of fsoofeNone: begin if not mbFileExists(AbsoluteTargetFileName) then Result:= fsoofeOverwrite else case AskQuestion(Format(rsMsgFileExistsRwrt, [AbsoluteTargetFileName]), '', PossibleResponses, fsourOverwrite, fsourSkip) of fsourOverwrite: Result := fsoofeOverwrite; fsourSkip: Result := fsoofeSkip; fsourOverwriteAll: begin FFileExistsOption := fsoofeOverwrite; Result := fsoofeOverwrite; end; fsourSkipAll: begin FFileExistsOption := fsoofeSkip; Result := fsoofeSkip; end; fsourNone, fsourCancel: RaiseAbortOperation; end; end; else Result := FFileExistsOption; end; end; procedure TMultiArchiveCopyOutOperation.ShowError(sMessage: String; logOptions: TLogOptions); begin if not gSkipFileOpError then begin if AskQuestion(sMessage, '', [fsourSkip, fsourCancel], fsourSkip, fsourAbort) = fsourAbort then begin RaiseAbortOperation; end; end else begin LogMessage(sMessage, logOptions, lmtError); end; end; procedure TMultiArchiveCopyOutOperation.LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); begin case logMsgType of lmtError: if not (log_errors in gLogOptions) then Exit; lmtInfo: if not (log_info in gLogOptions) then Exit; lmtSuccess: if not (log_success in gLogOptions) then Exit; end; if logOptions <= gLogOptions then begin logWrite(Thread, sMessage, logMsgType); end; end; procedure TMultiArchiveCopyOutOperation.CheckForErrors(const SourceName, TargetName: UTF8String; ExitStatus: LongInt); begin if ExitStatus > FErrorLevel then begin ShowError(Format(rsMsgLogError + rsMsgLogExtract, [FMultiArchiveFileSource.ArchiveFileName + PathDelim + SourceName + ' -> ' + TargetName + ' - Exit status: ' + IntToStr(ExitStatus)]), [log_arc_op]); end // Error else begin LogMessage(Format(rsMsgLogSuccess + rsMsgLogExtract, [FMultiArchiveFileSource.ArchiveFileName + PathDelim + SourceName +' -> ' + TargetName]), [log_arc_op], lmtSuccess); end; // Success end; procedure TMultiArchiveCopyOutOperation.OnReadLn(str: string); begin with FMultiArchiveFileSource.MultiArcItem do if FOutput or FDebug then logWrite(Thread, str, lmtInfo, True, False); end; procedure TMultiArchiveCopyOutOperation.OnQueryString(str: string); var pcPassword: PAnsiChar; begin ShowInputQuery(FMultiArchiveFileSource.MultiArcItem.FDescription, rsMsgPasswordEnter, True, FPassword); pcPassword:= PAnsiChar(UTF8ToConsole(FPassword + #13#10)); FExProcess.Process.Input.Write(pcPassword^, Length(pcPassword)); end; procedure TMultiArchiveCopyOutOperation.UpdateProgress(SourceName, TargetName: UTF8String; IncSize: Int64); begin with FStatistics do begin FStatistics.CurrentFileFrom:= SourceName; FStatistics.CurrentFileTo:= TargetName; CurrentFileDoneBytes:= IncSize; DoneBytes := DoneBytes + CurrentFileDoneBytes; UpdateStatistics(FStatistics); end; end; procedure TMultiArchiveCopyOutOperation.FileSourceOperationStateChangedNotify( Operation: TFileSourceOperation; AState: TFileSourceOperationState); begin case AState of fsosStarting: FExProcess.Process.Resume; fsosPausing: FExProcess.Process.Suspend; fsosStopping: FExProcess.Stop; end; end; class function TMultiArchiveCopyOutOperation.GetOptionsUIClass: TFileSourceOperationOptionsUIClass; begin Result:= TMultiArchiveCopyOperationOptionsUI; end; end. doublecmd-0.5.8/src/filesources/multiarchive/umultiarchiveexecuteoperation.pas0000644000175000017500000000317211747211345027216 0ustar alexxalexxunit uMultiArchiveExecuteOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFile, uFileSource, uFileSourceExecuteOperation, uMultiArchiveFileSource; type { TMultiArchiveExecuteOperation } TMultiArchiveExecuteOperation = class(TFileSourceExecuteOperation) private FMultiArchiveFileSource: IMultiArchiveFileSource; public {en @param(aTargetFileSource File source where the file should be executed.) @param(aExecutableFile File that should be executed.) @param(aCurrentPath Path of the file source where the execution should take place.) } constructor Create(aTargetFileSource: IFileSource; var aExecutableFile: TFile; aCurrentPath, aVerb: UTF8String); override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; end; implementation uses fPackInfoDlg; constructor TMultiArchiveExecuteOperation.Create( aTargetFileSource: IFileSource; var aExecutableFile: TFile; aCurrentPath, aVerb: UTF8String); begin FMultiArchiveFileSource := aTargetFileSource as IMultiArchiveFileSource; inherited Create(aTargetFileSource, aExecutableFile, aCurrentPath, aVerb); end; procedure TMultiArchiveExecuteOperation.Initialize; begin end; procedure TMultiArchiveExecuteOperation.MainExecute; begin FExecuteOperationResult:= ShowPackInfoDlg(FMultiArchiveFileSource, ExecutableFile); end; procedure TMultiArchiveExecuteOperation.Finalize; begin end; end. doublecmd-0.5.8/src/filesources/multiarchive/umultiarchivecalcstatisticsoperation.pas0000644000175000017500000000732411747211345030574 0ustar alexxalexxunit uMultiArchiveCalcStatisticsOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceCalcStatisticsOperation, uFileSource, uMultiArchiveFileSource, uFile; type TMultiArchiveCalcStatisticsOperation = class(TFileSourceCalcStatisticsOperation) private FMultiArchiveFileSource: IMultiArchiveFileSource; FStatistics: TFileSourceCalcStatisticsOperationStatistics; // local copy of statistics procedure ProcessFile(aFile: TFile); procedure ProcessSubDirs(const srcPath: String); public constructor Create(aTargetFileSource: IFileSource; var theFiles: TFiles); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; end; implementation uses uMultiArc, DCStrUtils; constructor TMultiArchiveCalcStatisticsOperation.Create( aTargetFileSource: IFileSource; var theFiles: TFiles); begin inherited Create(aTargetFileSource, theFiles); FMultiArchiveFileSource:= aTargetFileSource as IMultiArchiveFileSource; end; destructor TMultiArchiveCalcStatisticsOperation.Destroy; begin inherited Destroy; end; procedure TMultiArchiveCalcStatisticsOperation.Initialize; begin // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; end; procedure TMultiArchiveCalcStatisticsOperation.MainExecute; var CurrentFileIndex: Integer; begin for CurrentFileIndex := 0 to Files.Count - 1 do begin ProcessFile(Files[CurrentFileIndex]); CheckOperationState; end; end; procedure TMultiArchiveCalcStatisticsOperation.ProcessFile(aFile: TFile); begin FStatistics.CurrentFile := aFile.Path + aFile.Name; UpdateStatistics(FStatistics); if aFile.IsDirectory then begin Inc(FStatistics.Directories); ProcessSubDirs(aFile.Path + aFile.Name + DirectorySeparator); end else if aFile.IsLink then begin Inc(FStatistics.Links); end else begin // Not always this will be regular file (on Unix can be socket, FIFO, block, char, etc.) // Maybe check with: FPS_ISREG() on Unix? Inc(FStatistics.Files); FStatistics.Size := FStatistics.Size + aFile.Size; if aFile.ModificationTime < FStatistics.OldestFile then FStatistics.OldestFile := aFile.ModificationTime; if aFile.ModificationTime > FStatistics.NewestFile then FStatistics.NewestFile := aFile.ModificationTime; end; UpdateStatistics(FStatistics); end; procedure TMultiArchiveCalcStatisticsOperation.ProcessSubDirs(const srcPath: String); var I: Integer; ArchiveItem: TArchiveItem; CurrFileName: UTF8String; ModificationTime: TDateTime; begin for I:= 0 to FMultiArchiveFileSource.ArchiveFileList.Count - 1 do begin ArchiveItem := TArchiveItem(FMultiArchiveFileSource.ArchiveFileList.Items[I]); CurrFileName := PathDelim + ArchiveItem.FileName; if not IsInPath(srcPath, CurrFileName, True, False) then Continue; if FMultiArchiveFileSource.FileIsDirectory(ArchiveItem) then Inc(FStatistics.Directories) else if FMultiArchiveFileSource.FileIsLink(ArchiveItem) then Inc(FStatistics.Links) else begin Inc(FStatistics.Files); FStatistics.Size := FStatistics.Size + ArchiveItem.UnpSize; try with ArchiveItem do ModificationTime := EncodeDate(Year, Month, Day) + EncodeTime(Hour, Minute, Second, 0); if ModificationTime < FStatistics.OldestFile then FStatistics.OldestFile := ModificationTime; if ModificationTime > FStatistics.NewestFile then FStatistics.NewestFile := ModificationTime; except on EConvertError do; end; end; end; end; end. doublecmd-0.5.8/src/filesources/multiarchive/fmultiarchivecopyoperationoptions.lrt0000644000175000017500000000011311747211345030131 0ustar alexxalexxTMULTIARCHIVECOPYOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION=When file exists doublecmd-0.5.8/src/filesources/ufilesourcelistoperation.pas0000644000175000017500000000376011747211345023502 0ustar alexxalexxunit uFileSourceListOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceOperation, uFileSourceOperationTypes, uFile, uFileSource; type { TFileSourceListOperation } TFileSourceListOperation = class(TFileSourceOperation) private FFileSource: IFileSource; FPath: String; protected FFiles: TFiles; function GetFiles: TFiles; function GetID: TFileSourceOperationType; override; procedure UpdateStatisticsAtStartTime; override; property FileSource: IFileSource read FFileSource; public constructor Create(aFileSource: IFileSource; aPath: String); virtual reintroduce; destructor Destroy; override; function GetDescription(Details: TFileSourceOperationDescriptionDetails): String; override; // Retrieves files and revokes ownership of TFiles list. // The result of this function should be freed by the caller. function ReleaseFiles: TFiles; property Files: TFiles read GetFiles; property Path: String read FPath; end; implementation uses uLng; constructor TFileSourceListOperation.Create(aFileSource: IFileSource; aPath: String); begin FFileSource := aFileSource; FPath := aPath; inherited Create(FFileSource); end; destructor TFileSourceListOperation.Destroy; begin inherited Destroy; if Assigned(FFiles) then FreeAndNil(FFiles); end; function TFileSourceListOperation.GetDescription(Details: TFileSourceOperationDescriptionDetails): String; begin case Details of fsoddJobAndTarget: Result := Format(rsOperListingIn, [Path]); else Result := rsOperListing; end; end; function TFileSourceListOperation.GetID: TFileSourceOperationType; begin Result := fsoList; end; function TFileSourceListOperation.GetFiles: TFiles; begin Result := FFiles; end; function TFileSourceListOperation.ReleaseFiles: TFiles; begin Result := FFiles; FFiles := nil; // revoke ownership end; procedure TFileSourceListOperation.UpdateStatisticsAtStartTime; begin // Empty. end; end. doublecmd-0.5.8/src/filesources/ufilesourcecalcchecksumoperation.pas0000644000175000017500000001342511747211345025153 0ustar alexxalexxunit uFileSourceCalcChecksumOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, syncobjs, uFileSourceOperation, uFileSourceOperationTypes, uFileSource, uFile, uHash; type TCalcCheckSumOperationMode = (checksum_calc, checksum_verify); TFileSourceCalcChecksumOperationStatistics = record CurrentFile: String; CurrentFileTotalBytes: Int64; CurrentFileDoneBytes: Int64; TotalFiles: Int64; DoneFiles: Int64; TotalBytes: Int64; DoneBytes: Int64; BytesPerSecond: Int64; RemainingTime: TDateTime; end; {en Operation that calculates checksum of the files. } { TFileSourceCalcChecksumOperation } TFileSourceCalcChecksumOperation = class(TFileSourceOperation) private FStatistics: TFileSourceCalcChecksumOperationStatistics; FStatisticsAtStartTime: TFileSourceCalcChecksumOperationStatistics; FStatisticsLock: TCriticalSection; // NewStatistics.DoneBytes then begin with NewStatistics do begin RemainingTime := EstimateRemainingTime(FStatisticsAtStartTime.DoneBytes, DoneBytes, TotalBytes, StartTime, SysUtils.Now, BytesPerSecond); // Update overall progress. if TotalFiles <> 0 then UpdateProgress(DoneBytes/TotalBytes); end; end; FStatistics := NewStatistics; finally FStatisticsLock.Release; end; end; procedure TFileSourceCalcChecksumOperation.UpdateStatisticsAtStartTime; begin FStatisticsLock.Acquire; try Self.FStatisticsAtStartTime := Self.FStatistics; finally FStatisticsLock.Release; end; end; function TFileSourceCalcChecksumOperation.RetrieveStatistics: TFileSourceCalcChecksumOperationStatistics; begin // Statistics have to be synchronized because there are multiple values // and they all have to be consistent at every moment. FStatisticsLock.Acquire; try Result := Self.FStatistics; finally FStatisticsLock.Release; end; end; end. doublecmd-0.5.8/src/filesources/ufilesourceproperty.pas0000644000175000017500000000215512113430717022461 0ustar alexxalexxunit uFileSourceProperty; {$mode objfpc}{$H+} interface uses Classes, SysUtils; type TFileSourceProperty = ( {en Set, if the files are available directly (for example: real file system). Not sure what it would do yet, but I'll leave it for now. } fspDirectAccess, {en Set, if filenames are case sensitive. } fspCaseSensitive, {en Set, if the file source has virtual files (like a VFS list, or results from searching, etc.). Non-virtual files are all files that are physical (regardless if they are directly accessible). } fspVirtual, {en Set, if the files are links to local files that available directly (for example: results from searching, etc.). } fspLinksToLocalFiles, {en Set, if the file source uses TFileSourceConnection objects for access by operations. } fspUsesConnections, {en Set, if the file source supports file listing in main thread only. } fspListInMainThread ); TFileSourceProperties = set of TFileSourceProperty; implementation end. doublecmd-0.5.8/src/filesources/searchresult/0000755000175000017500000000000012257501472020331 5ustar alexxalexxdoublecmd-0.5.8/src/filesources/searchresult/usearchresultlistoperation.pas0000644000175000017500000000230611753503774026554 0ustar alexxalexxunit uSearchResultListOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceListOperation, uFileSource, uSearchResultFileSource; type TSearchResultListOperation = class(TFileSourceListOperation) private FFileSource: ISearchResultFileSource; public constructor Create(aFileSource: IFileSource; aPath: String); override; procedure MainExecute; override; end; implementation uses uFile; constructor TSearchResultListOperation.Create(aFileSource: IFileSource; aPath: String); begin FFiles := TFiles.Create(aPath); FFileSource := aFileSource as ISearchResultFileSource; inherited Create(aFileSource, aPath); end; procedure TSearchResultListOperation.MainExecute; procedure AddNode(aNode: TFileTreeNode); var i: Integer; begin if Assigned(aNode) then begin for i := 0 to aNode.SubNodesCount - 1 do begin CheckOperationState; FFiles.Add(aNode.SubNodes[i].TheFile.Clone); AddNode(aNode.SubNodes[i]); end; end; end; begin FFiles.Clear; // For now "flat mode" always enabled (add all files from the tree). if FileSource.IsPathAtRoot(Path) then AddNode(FFileSource.FileList); end; end. doublecmd-0.5.8/src/filesources/searchresult/usearchresultfilesource.pas0000644000175000017500000000315511747211345026014 0ustar alexxalexxunit uSearchResultFileSource; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFile, uMultiListFileSource, uFileSourceOperation, uFileSourceProperty; type ISearchResultFileSource = interface(IMultiListFileSource) ['{5076D4C2-3AB8-4029-9318-0AF115F7FDDD}'] end; {en File source for search results. } { TSearchResultFileSource } TSearchResultFileSource = class(TMultiListFileSource, ISearchResultFileSource) public constructor Create; override; function GetProperties: TFileSourceProperties; override; function SetCurrentWorkingDirectory(NewDir: String): Boolean; override; function CreateListOperation(TargetPath: String): TFileSourceOperation; override; function GetLocalName(var aFile: TFile): Boolean; override; end; implementation uses uSearchResultListOperation; constructor TSearchResultFileSource.Create; begin FCurrentAddress := 'SearchResult'; inherited Create; end; function TSearchResultFileSource.GetProperties: TFileSourceProperties; begin Result := [fspLinksToLocalFiles]; end; function TSearchResultFileSource.SetCurrentWorkingDirectory(NewDir: String): Boolean; begin // Only Root dir allowed (for flat mode). Result := IsPathAtRoot(NewDir); end; function TSearchResultFileSource.CreateListOperation(TargetPath: String): TFileSourceOperation; begin Result := TSearchResultListOperation.Create(Self, TargetPath); end; function TSearchResultFileSource.GetLocalName(var aFile: TFile): Boolean; begin if (fspLinksToLocalFiles in FileSource.Properties) then Result:= FileSource.GetLocalName(aFile) else Result:= True; end; end. doublecmd-0.5.8/src/filesources/ufilesourcedeleteoperation.pas0000644000175000017500000001072611747211345023771 0ustar alexxalexxunit uFileSourceDeleteOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, syncobjs, uFileSourceOperation, uFileSourceOperationTypes, uFileSource, uFile; type TFileSourceDeleteOperationStatistics = record CurrentFile: String; TotalFiles: Int64; DoneFiles: Int64; TotalBytes: Int64; DoneBytes: Int64; FilesPerSecond: Int64; RemainingTime: TDateTime; end; {en Operation that deletes files from an arbitrary file source. File source should match the class type. } { TFileSourceDeleteOperation } TFileSourceDeleteOperation = class(TFileSourceOperation) private FStatistics: TFileSourceDeleteOperationStatistics; FStatisticsAtStartTime: TFileSourceDeleteOperationStatistics; FStatisticsLock: TCriticalSection; // NewStatistics.DoneFiles then begin with NewStatistics do begin RemainingTime := EstimateRemainingTime(FStatisticsAtStartTime.DoneFiles, DoneFiles, TotalFiles, StartTime, SysUtils.Now, FilesPerSecond); // Update overall progress. if TotalFiles <> 0 then UpdateProgress(DoneFiles/TotalFiles); end; end; FStatistics := NewStatistics; finally FStatisticsLock.Release; end; end; procedure TFileSourceDeleteOperation.UpdateStatisticsAtStartTime; begin FStatisticsLock.Acquire; try Self.FStatisticsAtStartTime := Self.FStatistics; finally FStatisticsLock.Release; end; end; function TFileSourceDeleteOperation.RetrieveStatistics: TFileSourceDeleteOperationStatistics; begin // Statistics have to be synchronized because there are multiple values // and they all have to be consistent at every moment. FStatisticsLock.Acquire; try Result := Self.FStatistics; finally FStatisticsLock.Release; end; end; end. doublecmd-0.5.8/src/filesources/ufilesourceoperationui.pas0000644000175000017500000000266511747211345023147 0ustar alexxalexxunit uFileSourceOperationUI; {$mode objfpc}{$H+} interface uses Classes, SysUtils; type TFileSourceOperationUIResponse = (fsourInvalid, fsourOk, fsourNo, fsourYes, fsourCancel, fsourNone, fsourAppend, // for files fsourResume, // for files fsourCopyInto, // for directories fsourCopyIntoAll, // for directories fsourOverwrite, fsourOverwriteAll, fsourOverwriteOlder, fsourSkip, fsourSkipAll, fsourIgnoreAll, fsourAll, fsourRetry, fsourAbort); {en General interface for communication: operation <-> user. } TFileSourceOperationUI = class public constructor Create; virtual; destructor Destroy; override; function AskQuestion(Msg: String; Question: String; PossibleResponses: array of TFileSourceOperationUIResponse; DefaultOKResponse: TFileSourceOperationUIResponse; DefaultCancelResponse: TFileSourceOperationUIResponse ) : TFileSourceOperationUIResponse; virtual abstract; // Add possibility to display files properties (for example: to compare older - newer) // Add general option "remember this choice for all files of this type" (checkbox) end; implementation constructor TFileSourceOperationUI.Create; begin inherited; end; destructor TFileSourceOperationUI.Destroy; begin inherited; end; end. doublecmd-0.5.8/src/filesources/vfs/0000755000175000017500000000000012257501472016423 5ustar alexxalexxdoublecmd-0.5.8/src/filesources/vfs/uvfsexecuteoperation.pas0000644000175000017500000000415411747211345023423 0ustar alexxalexxunit uVfsExecuteOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFile, uFileSource, uFileSourceExecuteOperation, uVfsFileSource; type { TVfsExecuteOperation } TVfsExecuteOperation = class(TFileSourceExecuteOperation) private FVfsFileSource: IVfsFileSource; public {en @param(aTargetFileSource File source where the file should be executed.) @param(aExecutableFile File that should be executed.) @param(aCurrentPath Path of the file source where the execution should take place.) } constructor Create(aTargetFileSource: IFileSource; var aExecutableFile: TFile; aCurrentPath, aVerb: UTF8String); override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; end; implementation uses uWfxModule, uDCUtils; constructor TVfsExecuteOperation.Create( aTargetFileSource: IFileSource; var aExecutableFile: TFile; aCurrentPath, aVerb: UTF8String); begin FVfsFileSource := aTargetFileSource as IVfsFileSource; inherited Create(aTargetFileSource, aExecutableFile, aCurrentPath, aVerb); end; procedure TVfsExecuteOperation.Initialize; begin end; procedure TVfsExecuteOperation.MainExecute; var sFileName: UTF8String; WfxModule: TWfxModule = nil; begin FExecuteOperationResult:= fseorSuccess; if SameText(Verb, 'properties') then with FVfsFileSource do begin sFileName:= VfsFileList.Values[RelativePath]; if sFileName <> EmptyStr then try sFileName:= GetCmdDirFromEnvVar(sFileName); WfxModule:= TWfxModule.Create; if WfxModule.LoadModule(sFileName) then begin WfxModule.VFSInit(0); WfxModule.VFSConfigure(0); WfxModule.UnloadModule; end; finally if Assigned(WfxModule) then FreeAndNil(WfxModule); end; end; end; procedure TVfsExecuteOperation.Finalize; begin end; end. doublecmd-0.5.8/src/filesources/vfs/uvfsfilesource.pas0000644000175000017500000000601611747211345022177 0ustar alexxalexxunit uVfsFileSource; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uWFXModule, uFileSourceProperty, uFileSourceOperationTypes, uVirtualFileSource, uFileProperty, uFileSource, uFileSourceOperation, uFile; type IVfsFileSource = interface(IVirtualFileSource) ['{87D0A3EF-C168-44C1-8B10-3AEC0753846A}'] function GetWfxModuleList: TWFXModuleList; property VfsFileList: TWFXModuleList read GetWfxModuleList; end; { TVfsFileSource } TVfsFileSource = class(TVirtualFileSource, IVfsFileSource) private FWFXModuleList: TWFXModuleList; function GetWfxModuleList: TWFXModuleList; protected function GetSupportedFileProperties: TFilePropertiesTypes; override; public constructor Create(aWFXModuleList: TWFXModuleList); reintroduce; destructor Destroy; override; class function CreateFile(const APath: String): TFile; override; // Retrieve operations permitted on the source. = capabilities? function GetOperationsTypes: TFileSourceOperationTypes; override; // Retrieve some properties of the file source. function GetProperties: TFileSourceProperties; override; // These functions create an operation object specific to the file source. function CreateListOperation(TargetPath: String): TFileSourceOperation; override; function CreateExecuteOperation(var ExecutableFile: TFile; BasePath, Verb: String): TFileSourceOperation; override; property VfsFileList: TWFXModuleList read FWFXModuleList; end; implementation uses LCLProc, uVfsListOperation, uVfsExecuteOperation; constructor TVfsFileSource.Create(aWFXModuleList: TWFXModuleList); begin inherited Create; FWFXModuleList:= TWFXModuleList.Create; FWFXModuleList.Assign(aWFXModuleList); end; destructor TVfsFileSource.Destroy; begin FreeThenNil(FWFXModuleList); inherited Destroy; end; class function TVfsFileSource.CreateFile(const APath: String): TFile; begin Result := TFile.Create(APath); with Result do begin AttributesProperty := TFileAttributesProperty.CreateOSAttributes; end; end; function TVfsFileSource.GetOperationsTypes: TFileSourceOperationTypes; begin Result := [fsoList, fsoExecute]; end; function TVfsFileSource.GetProperties: TFileSourceProperties; begin Result := [fspVirtual]; end; function TVfsFileSource.GetSupportedFileProperties: TFilePropertiesTypes; begin Result := inherited GetSupportedFileProperties + [fpAttributes]; end; function TVfsFileSource.GetWfxModuleList: TWFXModuleList; begin Result := FWFXModuleList; end; function TVfsFileSource.CreateListOperation(TargetPath: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TVfsListOperation.Create(TargetFileSource, TargetPath); end; function TVfsFileSource.CreateExecuteOperation(var ExecutableFile: TFile; BasePath, Verb: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result:= TVfsExecuteOperation.Create(TargetFileSource, ExecutableFile, BasePath, Verb); end; end. doublecmd-0.5.8/src/filesources/vfs/uvfslistoperation.pas0000644000175000017500000000263612030541556022733 0ustar alexxalexxunit uVfsListOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceListOperation, uVfsFileSource, uFileSource; type TVfsListOperation = class(TFileSourceListOperation) private FVfsFileSource: IVfsFileSource; public constructor Create(aFileSource: IFileSource; aPath: String); override; procedure MainExecute; override; end; implementation uses LCLProc, uFile, uVfsModule; constructor TVfsListOperation.Create(aFileSource: IFileSource; aPath: String); begin FFiles := TFiles.Create(aPath); FVfsFileSource := aFileSource as IVfsFileSource; inherited Create(aFileSource, aPath); end; procedure TVfsListOperation.MainExecute; var I : Integer; aFile: TFile; begin FFiles.Clear; with FVfsFileSource do for I := 0 to VfsFileList.Count - 1 do begin CheckOperationState; if VfsFileList.Enabled[I] then begin aFile := TVfsFileSource.CreateFile(Path); aFile.Name:= VfsFileList.Name[I]; //aFile.ModificationTime:= FileDateToDateTime(mbFileAge(VfsFileList.FileName[I])); FFiles.Add(aFile); end; end; for I:= 0 to gVfsModuleList.Count - 1 do begin CheckOperationState; aFile := TVfsFileSource.CreateFile(Path); aFile.Name:= gVfsModuleList.Strings[I]; //aFile.ModificationTime:= FileDateToDateTime(mbFileAge(VfsFileList.FileName[I])); FFiles.Add(aFile); end; end; end. doublecmd-0.5.8/src/filesources/ufilesourcecombineoperation.pas0000644000175000017500000001170011747211345024134 0ustar alexxalexxunit uFileSourceCombineOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, syncobjs, uFileSourceOperation, uFileSourceOperationTypes, uFileSource, uFile, uFileSourceCopyOperation; type TFileSourceCombineOperationStatistics = TFileSourceCopyOperationStatistics; {en Operation that combine files within the same file source. } { TFileSourceCombineOperation } TFileSourceCombineOperation = class(TFileSourceOperation) private FStatistics: TFileSourceCombineOperationStatistics; FStatisticsAtStartTime: TFileSourceCombineOperationStatistics; FStatisticsLock: TCriticalSection; // NewStatistics.DoneBytes then begin with NewStatistics do begin RemainingTime := EstimateRemainingTime(FStatisticsAtStartTime.DoneBytes, DoneBytes, TotalBytes, StartTime, SysUtils.Now, BytesPerSecond); // Update overall progress. if TotalBytes <> 0 then UpdateProgress(DoneBytes/TotalBytes); end; end; FStatistics := NewStatistics; finally FStatisticsLock.Release; end; end; procedure TFileSourceCombineOperation.UpdateStatisticsAtStartTime; begin FStatisticsLock.Acquire; try Self.FStatisticsAtStartTime := Self.FStatistics; finally FStatisticsLock.Release; end; end; function TFileSourceCombineOperation.RetrieveStatistics: TFileSourceCombineOperationStatistics; begin // Statistics have to be synchronized because there are multiple values // and they all have to be consistent at every moment. FStatisticsLock.Acquire; try Result := Self.FStatistics; finally FStatisticsLock.Release; end; end; function TFileSourceCombineOperation.GetID: TFileSourceOperationType; begin Result := fsoCombine; end; procedure TFileSourceCombineOperation.DoReloadFileSources; var Paths: TPathsArray; begin SetLength(Paths, 1); Paths[0] := ExtractFilePath(FTargetFile); // Combine target path FFileSource.Reload(Paths); end; function TFileSourceCombineOperation.GetDescription(Details: TFileSourceOperationDescriptionDetails): String; begin case Details of fsoddJobAndTarget: Result := Format(rsOperCombiningFromTo, [SourceFiles.Path, TargetFile]); else Result := rsOperCombining; end; end; end. doublecmd-0.5.8/src/filesources/ufilesourcesplitoperation.pas0000644000175000017500000001211511747211345023654 0ustar alexxalexxunit uFileSourceSplitOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, syncobjs, uFileSourceOperation, uFileSourceOperationTypes, uFileSource, uFile, uFileSourceCopyOperation; type TFileSourceSplitOperationStatistics = TFileSourceCopyOperationStatistics; {en Operation that split file within the same file source. } { TFileSourceSplitOperation } TFileSourceSplitOperation = class(TFileSourceOperation) private FStatistics: TFileSourceSplitOperationStatistics; FStatisticsAtStartTime: TFileSourceSplitOperationStatistics; FStatisticsLock: TCriticalSection; // NewStatistics.DoneBytes then begin with NewStatistics do begin RemainingTime := EstimateRemainingTime(FStatisticsAtStartTime.DoneBytes, DoneBytes, TotalBytes, StartTime, SysUtils.Now, BytesPerSecond); // Update overall progress. if TotalBytes <> 0 then UpdateProgress(DoneBytes/TotalBytes); end; end; FStatistics := NewStatistics; finally FStatisticsLock.Release; end; end; procedure TFileSourceSplitOperation.UpdateStatisticsAtStartTime; begin FStatisticsLock.Acquire; try Self.FStatisticsAtStartTime := Self.FStatistics; finally FStatisticsLock.Release; end; end; function TFileSourceSplitOperation.RetrieveStatistics: TFileSourceSplitOperationStatistics; begin // Statistics have to be synchronized because there are multiple values // and they all have to be consistent at every moment. FStatisticsLock.Acquire; try Result := Self.FStatistics; finally FStatisticsLock.Release; end; end; function TFileSourceSplitOperation.GetID: TFileSourceOperationType; begin Result := fsoSplit; end; procedure TFileSourceSplitOperation.DoReloadFileSources; var Paths: TPathsArray; begin SetLength(Paths, 1); Paths[0] := FTargetPath; // Split target path FFileSource.Reload(Paths); end; function TFileSourceSplitOperation.GetDescription(Details: TFileSourceOperationDescriptionDetails): String; begin case Details of fsoddJobAndTarget: Result := Format(rsOperSplittingFromTo, [SourceFile.Path, TargetPath]); else Result := rsOperSplitting; end; end; end. doublecmd-0.5.8/src/filesources/multilist/0000755000175000017500000000000012257501472017653 5ustar alexxalexxdoublecmd-0.5.8/src/filesources/multilist/umultilistfilesource.pas0000644000175000017500000001747311747211345024670 0ustar alexxalexxunit uMultiListFileSource; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFile, uFileSource, uFileSourceProperty, uFileSourceOperation, uFileSourceOperationTypes, uFileProperty; type IMultiListFileSource = interface(IFileSource) ['{A64C591C-EBC6-4E06-89D2-9965E1A3009A}'] procedure AddList(var aFileList: TFileTree; aFileSource: IFileSource); function GetFileList: TFileTree; function GetFileSource: IFileSource; property FileList: TFileTree read GetFileList; property FileSource: IFileSource read GetFileSource; end; {en File source that generates files from file lists generated by other file sources. This virtual file source contains "links" to files from other file sources, e.g., paths to files on FileSystem file source, or paths to files within certain archive. Therefore properties of virtual file source and operations will depend on the underlying file source. It should be possible to store links to different file sources within the same virtual file source, in which case there has to be a file source associated with each file or a group of files, although presentation of such file lists should probably be different than that of a single file source. Files can be virtual (from virtual file sources). Currently can only use a single file source with a single file list. } TMultiListFileSource = class(TFileSource, IMultiListFileSource) private {en File list for the file source. } FFileList: TFileTree; {en File source from which files in FileList come from. Currently only single file source is supported. } FFileSource: IFileSource; function GetFileList: TFileTree; function GetFileSource: IFileSource; public constructor Create; override; destructor Destroy; override; {en Adds a list of files associated with a file source to the storage. Only single file source supported now (adding list will overwrite previous list). @param(aFileList List of files. Class takes ownership of the pointer.) @param(aFileSource The file source from which files in aFileList are from.) } procedure AddList(var aFileList: TFileTree; aFileSource: IFileSource); virtual; function GetSupportedFileProperties: TFilePropertiesTypes; override; function GetOperationsTypes: TFileSourceOperationTypes; override; function GetProperties: TFileSourceProperties; override; function CreateListOperation(TargetPath: String): TFileSourceOperation; override; function CreateCopyOutOperation(TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; override; function CreateMoveOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; override; function CreateDeleteOperation(var FilesToDelete: TFiles): TFileSourceOperation; override; function CreateWipeOperation(var FilesToWipe: TFiles): TFileSourceOperation; override; function CreateExecuteOperation(var ExecutableFile: TFile; BasePath, Verb: String): TFileSourceOperation; override; function CreateTestArchiveOperation(var theSourceFiles: TFiles): TFileSourceOperation; override; function CreateCalcChecksumOperation(var theFiles: TFiles; aTargetPath: String; aTargetMask: String): TFileSourceOperation; override; function CreateCalcStatisticsOperation(var theFiles: TFiles): TFileSourceOperation; override; function CreateSetFilePropertyOperation(var theTargetFiles: TFiles; var theNewProperties: TFileProperties): TFileSourceOperation; override; property FileList: TFileTree read FFileList; property FileSource: IFileSource read FFileSource; end; implementation uses uMultiListListOperation; constructor TMultiListFileSource.Create; begin FFileList := nil; FFileSource := nil; inherited Create; end; destructor TMultiListFileSource.Destroy; begin inherited Destroy; if Assigned(FFileList) then FreeAndNil(FFileList); FFileSource := nil; end; procedure TMultiListFileSource.AddList(var aFileList: TFileTree; aFileSource: IFileSource); begin if Assigned(FFileList) then FreeAndNil(FFileList); FFileList := aFileList; aFileList := nil; FFileSource := aFileSource; end; function TMultiListFileSource.GetSupportedFileProperties: TFilePropertiesTypes; begin Result := FFileSource.GetSupportedFileProperties; end; function TMultiListFileSource.GetOperationsTypes: TFileSourceOperationTypes; begin // Only fsoList is supported by default. // All other operations only if file source supports them. // However, this will work only for single file source. Result := [fsoList] + FFileSource.GetOperationsTypes * [fsoCopyOut, //fsoMove, fsoDelete, fsoWipe, fsoCalcChecksum, fsoCalcStatistics, fsoSetFileProperty, fsoExecute, fsoTestArchive]; end; function TMultiListFileSource.GetProperties: TFileSourceProperties; begin // Flags depend on the underlying file source. Result := FFileSource.GetProperties; end; function TMultiListFileSource.GetFileList: TFileTree; begin Result := FFileList; end; function TMultiListFileSource.GetFileSource: IFileSource; begin Result := FFileSource; end; function TMultiListFileSource.CreateListOperation(TargetPath: String): TFileSourceOperation; begin Result := TMultiListListOperation.Create(Self, TargetPath); end; function TMultiListFileSource.CreateCopyOutOperation(TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; begin Result := FFileSource.CreateCopyOutOperation(TargetFileSource, SourceFiles, TargetPath); end; function TMultiListFileSource.CreateMoveOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; begin Result := FFileSource.CreateMoveOperation(SourceFiles, TargetPath); end; function TMultiListFileSource.CreateDeleteOperation(var FilesToDelete: TFiles): TFileSourceOperation; begin Result := FFileSource.CreateDeleteOperation(FilesToDelete); end; function TMultiListFileSource.CreateWipeOperation(var FilesToWipe: TFiles): TFileSourceOperation; begin Result := FFileSource.CreateWipeOperation(FilesToWipe); end; function TMultiListFileSource.CreateExecuteOperation(var ExecutableFile: TFile; BasePath, Verb: String): TFileSourceOperation; begin Result := FFileSource.CreateExecuteOperation(ExecutableFile, ExecutableFile.Path, Verb); end; function TMultiListFileSource.CreateTestArchiveOperation(var theSourceFiles: TFiles): TFileSourceOperation; begin Result := FFileSource.CreateTestArchiveOperation(theSourceFiles); end; function TMultiListFileSource.CreateCalcChecksumOperation(var theFiles: TFiles; aTargetPath: String; aTargetMask: String): TFileSourceOperation; begin Result := FFileSource.CreateCalcChecksumOperation(theFiles, aTargetPath, aTargetMask); end; function TMultiListFileSource.CreateCalcStatisticsOperation(var theFiles: TFiles): TFileSourceOperation; begin Result := FFileSource.CreateCalcStatisticsOperation(theFiles); end; function TMultiListFileSource.CreateSetFilePropertyOperation(var theTargetFiles: TFiles; var theNewProperties: TFileProperties): TFileSourceOperation; begin Result := FFileSource.CreateSetFilePropertyOperation(theTargetFiles, theNewProperties); end; end. doublecmd-0.5.8/src/filesources/multilist/umultilistlistoperation.pas0000644000175000017500000000375311753503774025427 0ustar alexxalexxunit uMultiListListOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceListOperation, uFileSource, uMultiListFileSource; type TMultiListListOperation = class(TFileSourceListOperation) private FFileSource: IMultiListFileSource; public constructor Create(aFileSource: IFileSource; aPath: String); override; procedure MainExecute; override; end; implementation uses uOSUtils, DCStrUtils, uFile, uFileProperty; constructor TMultiListListOperation.Create(aFileSource: IFileSource; aPath: String); begin FFiles := TFiles.Create(aPath); FFileSource := aFileSource as IMultiListFileSource; inherited Create(aFileSource, aPath); end; procedure TMultiListListOperation.MainExecute; var AFile: TFile; IsRootPath: Boolean; CurrentNode: TFileTreeNode; CurrentPath: String; Found: Boolean; i: Integer; begin FFiles.Clear; IsRootPath := FileSource.IsPathAtRoot(Path); CurrentNode := FFileSource.FileList; CurrentPath := FileSource.GetRootDir; // Search for files in the given path. while (Path <> CurrentPath) and IsInPath(CurrentPath, Path, True, False) do begin CheckOperationState; Found := False; for i := 0 to CurrentNode.SubNodesCount - 1 do begin if IsInPath(IncludeTrailingPathDelimiter(CurrentPath) + CurrentNode.SubNodes[i].TheFile.Name, Path, True, False) then begin CurrentNode := CurrentNode.SubNodes[i]; Found := True; Break; end; end; if not Found then Break; end; if not IsRootPath then begin AFile := FileSource.CreateFileObject(Path); AFile.Name := '..'; if fpAttributes in AFile.SupportedProperties then AFile.Attributes := faFolder; FFiles.Add(AFile); end; if Path = CurrentPath then begin for i := 0 to CurrentNode.SubNodesCount - 1 do begin CheckOperationState; AFile := CurrentNode.SubNodes[i].TheFile; FFiles.Add(AFile); end; end; end; end. doublecmd-0.5.8/src/filesources/uarchivefilesourceutil.pas0000644000175000017500000002007612257475470023134 0ustar alexxalexxunit uArchiveFileSourceUtil; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileView, uFile, uArchiveFileSource, uFileSource; function GetArchiveFileSource(SourceFileSource: IFileSource; ArchiveFile: TFile; ArchiveType: String = ''; ArchiveSign: Boolean = False): IArchiveFileSource; procedure TestArchive(aFileView: TFileView; aFiles: TFiles); function FileIsArchive(const FileName: UTF8String): Boolean; implementation uses uShowMsg, uLng, DCStrUtils, uFileSourceProperty, uWcxArchiveFileSource, uMultiArchiveFileSource, uFileSystemFileSource, uTempFileSystemFileSource, uFileSourceOperation, uFileSourceOperationTypes, uOperationsManager; // Only for direct access file sources. function GetArchiveFileSourceDirect(SourceFileSource: IFileSource; ArchiveFileName: String; ArchiveType: String; ArchiveSign: Boolean = False): IArchiveFileSource; begin if not (fspDirectAccess in SourceFileSource.Properties) then Exit(nil); if (ArchiveType = EmptyStr) and (ArchiveSign = False) then begin ArchiveType := ExtractOnlyFileExt(ArchiveFileName); end; // Check if there is a registered WCX plugin for possible archive. Result := FileSourceManager.Find(TWcxArchiveFileSource, ArchiveFileName) as IArchiveFileSource; if not Assigned(Result) then begin if ArchiveSign then Result := TWcxArchiveFileSource.CreateByArchiveSign(SourceFileSource, ArchiveFileName) else Result := TWcxArchiveFileSource.CreateByArchiveType(SourceFileSource, ArchiveFileName, ArchiveType); end; // Check if there is a registered MultiArc addon for possible archive. if not Assigned(Result) then begin Result := FileSourceManager.Find(TMultiArchiveFileSource, ArchiveFileName) as IArchiveFileSource; if not Assigned(Result) then begin if ArchiveSign then Result := TMultiArchiveFileSource.CreateByArchiveSign(SourceFileSource, ArchiveFileName) else Result := TMultiArchiveFileSource.CreateByArchiveType(SourceFileSource, ArchiveFileName, ArchiveType); end; end; end; function GetArchiveFileSource(SourceFileSource: IFileSource; ArchiveFile: TFile; ArchiveType: String = ''; ArchiveSign: Boolean = False): IArchiveFileSource; var TempFS: ITempFileSystemFileSource = nil; Operation: TFileSourceOperation = nil; Files: TFiles = nil; LocalArchiveFile: TFile; begin if fspDirectAccess in SourceFileSource.Properties then begin Result := GetArchiveFileSourceDirect(SourceFileSource, ArchiveFile.FullPath, ArchiveType, ArchiveSign); Exit; end; Result := nil; if fspLinksToLocalFiles in SourceFileSource.Properties then begin LocalArchiveFile := ArchiveFile.Clone; try if SourceFileSource.GetLocalName(LocalArchiveFile) then begin TempFS := TTempFileSystemFileSource.Create(LocalArchiveFile.Path); // Source FileSource manages the files, not the TempFileSource. TempFS.DeleteOnDestroy := False; // The files on temp file source are valid as long as source FileSource is valid. TempFS.ParentFileSource := SourceFileSource; Result := GetArchiveFileSourceDirect(TempFS, LocalArchiveFile.FullPath, ArchiveType, ArchiveSign); // If not successful will try to get files through CopyOut below. end; finally FreeAndNil(LocalArchiveFile); end; end; if (not Assigned(Result)) and (fsoCopyOut in SourceFileSource.GetOperationsTypes) then begin if (ArchiveType = EmptyStr) and (ArchiveSign = False) then begin ArchiveType := ArchiveFile.Extension; end; // If checking by extension we don't have to unpack files yet. // First check if there is a registered plugin for the archive extension. if (not ArchiveSign) and (not (TWcxArchiveFileSource.CheckPluginByExt(ArchiveType) or TMultiArchiveFileSource.CheckAddonByExt(ArchiveType))) then begin // No registered handlers for the archive extension. Exit; end; // else either there is a handler for the archive extension // or we have to unpack files first to check // (if creating file source by archive signature). try TempFS := TTempFileSystemFileSource.Create; Files := TFiles.Create(ArchiveFile.Path); Files.Add(ArchiveFile.Clone); Operation := SourceFileSource.CreateCopyOutOperation(TempFS, Files, TempFS.FilesystemRoot); if Assigned(Operation) then begin Operation.Execute; if Operation.Result = fsorFinished then begin Result := GetArchiveFileSourceDirect( TempFS, IncludeTrailingPathDelimiter(TempFS.FilesystemRoot) + ArchiveFile.Name, ArchiveType, ArchiveSign); end; end; finally TempFS := nil; if Assigned(Files) then FreeAndNil(Files); if Assigned(Operation) then FreeAndNil(Operation); end; end; end; procedure TestArchive(aFileView: TFileView; aFiles: TFiles); var I: Integer; FilesToTest: TFiles = nil; Operation: TFileSourceOperation = nil; ArchiveFileSource: IArchiveFileSource; begin try // if in archive if aFileView.FileSource.IsClass(TArchiveFileSource) then begin FilesToTest := aFiles.Clone; if fsoTestArchive in aFileView.FileSource.GetOperationsTypes then begin Operation := aFileView.FileSource.CreateTestArchiveOperation(FilesToTest); if Assigned(Operation) then begin // Start operation. OperationsManager.AddOperation(Operation); end else msgWarning(rsMsgNotImplemented); end else msgWarning(rsMsgErrNotSupported); end else // if filesystem if aFileView.FileSource.IsClass(TFileSystemFileSource) then begin for I := 0 to aFiles.Count - 1 do // test all selected archives begin // Check if there is a ArchiveFileSource for possible archive. ArchiveFileSource := GetArchiveFileSource(aFileView.FileSource, aFiles[i]); if Assigned(ArchiveFileSource) then begin // Check if List and fsoTestArchive are supported. if [fsoList, fsoTestArchive] * ArchiveFileSource.GetOperationsTypes = [fsoList, fsoTestArchive] then begin // Get files to test. FilesToTest := ArchiveFileSource.GetFiles(ArchiveFileSource.GetRootDir); if Assigned(FilesToTest) then try // test all files Operation := ArchiveFileSource.CreateTestArchiveOperation(FilesToTest); if Assigned(Operation) then begin // Start operation. OperationsManager.AddOperation(Operation); end else msgWarning(rsMsgNotImplemented); finally if Assigned(FilesToTest) then FreeAndNil(FilesToTest); end; end else msgWarning(rsMsgErrNotSupported); end; // Short pause, so that all operations are not spawned at once. Sleep(100); end; // for end else msgWarning(rsMsgErrNotSupported); finally end; end; function FileIsArchive(const FileName: UTF8String): Boolean; var ArchiveType: UTF8String; begin ArchiveType:= ExtractOnlyFileExt(FileName); Result:= TWcxArchiveFileSource.CheckPluginByExt(ArchiveType) or TMultiArchiveFileSource.CheckAddonByExt(ArchiveType); end; end. doublecmd-0.5.8/src/filesources/urealfilesource.pas0000644000175000017500000000056611747211345021532 0ustar alexxalexxunit uRealFileSource; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSource; type IRealFileSource = interface(IFileSource) end; {en Base class for any real file source (filesystem, archive, network, ... - all sources able to produce real files). } TRealFileSource = class(TFileSource, IRealFileSource) end; implementation end. doublecmd-0.5.8/src/filesources/ufilesourceoperationtypes.pas0000644000175000017500000000142111747211345023663 0ustar alexxalexxunit uFileSourceOperationTypes; {$mode objfpc}{$H+} interface uses Classes, SysUtils; type // Capabilities. // (or make a separate type TFileSourceCapability with fsc... ?) TFileSourceOperationType = ( fsoList, fsoCopy, // Copy files within the same file source. fsoCopyIn, fsoCopyOut, fsoMove, // Move/rename files within the same file source. fsoDelete, fsoWipe, fsoSplit, fsoCombine, fsoCreateDirectory, //fsoCreateFile, //fsoCreateLink, fsoCalcChecksum, fsoCalcStatistics, // Should probably always be supported if fsoList is supported. fsoSetFileProperty, fsoExecute, fsoTestArchive ); TFileSourceOperationTypes = set of TFileSourceOperationType; implementation end. doublecmd-0.5.8/src/filesources/winnet/0000755000175000017500000000000012257501472017131 5ustar alexxalexxdoublecmd-0.5.8/src/filesources/winnet/uwinnetexecuteoperation.pas0000644000175000017500000000524411747211345024640 0ustar alexxalexxunit uWinNetExecuteOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFile, uFileSource, uWinNetFileSource, uFileSourceExecuteOperation; type { TWinNetExecuteOperation } TWinNetExecuteOperation = class(TFileSourceExecuteOperation) private FWinNetFileSource: IWinNetFileSource; public {en @param(aTargetFileSource File source where the file should be executed.) @param(aExecutableFile File that should be executed.) @param(aCurrentPath Path of the file source where the execution should take place.) } constructor Create(aTargetFileSource: IFileSource; var aExecutableFile: TFile; aCurrentPath, aVerb: UTF8String); override; procedure MainExecute; override; end; implementation uses Windows, JwaWinNetWk, DCStrUtils, DCOSUtils; constructor TWinNetExecuteOperation.Create(aTargetFileSource: IFileSource; var aExecutableFile: TFile; aCurrentPath, aVerb: UTF8String); begin FWinNetFileSource := aTargetFileSource as IWinNetFileSource; inherited Create(aTargetFileSource, aExecutableFile, aCurrentPath, aVerb); end; procedure TWinNetExecuteOperation.MainExecute; var nFile: TNetResourceW; lpBuffer: array [0..4095] of Byte; ResInfo: TNetResourceW absolute lpBuffer; pszSystem: PWideChar; dwBufferSize: DWORD; dwResult: DWORD; FileName: WideString; begin FExecuteOperationResult:= fseorError; FResultString:= IncludeFrontPathDelimiter(ExecutableFile.FullPath); // Workstation/Server if Pos('\\', FResultString) = 1 then begin FileName:= UTF8Decode(FResultString); with FWinNetFileSource do try dwBufferSize:= SizeOf(lpBuffer); FillChar(nFile, SizeOf(TNetResource), #0); nFile.dwScope:= RESOURCE_GLOBALNET; nFile.dwType:= RESOURCETYPE_ANY; nFile.lpRemoteName:= PWideChar(FileName); nFile.lpProvider:= PWideChar(ProviderName); dwResult:= WNetAddConnection2W(nFile, nil, nil, CONNECT_INTERACTIVE); if (dwResult <> NO_ERROR) then Exit; dwResult:= WNetGetResourceInformationW(nFile, @lpBuffer, dwBufferSize, pszSystem); if (dwResult <> NO_ERROR) then Exit; if (ResInfo.dwType = RESOURCETYPE_PRINT) then begin if (ShellExecuteW(0, 'open', ResInfo.lpRemoteName, nil, nil, SW_SHOW) > 32) then FExecuteOperationResult:= fseorSuccess; Exit; end; finally if (dwResult <> NO_ERROR) then FResultString:= mbSysErrorMessage(dwResult); end; end; FExecuteOperationResult:= fseorSymLink; end; end. doublecmd-0.5.8/src/filesources/winnet/uwinnetlistoperation.pas0000644000175000017500000001207212210604521024132 0ustar alexxalexxunit uWinNetListOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceListOperation, uWinNetFileSource, uFileSource; type { TWinNetListOperation } TWinNetListOperation = class(TFileSourceListOperation) private FWinNetFileSource: IWinNetFileSource; private procedure ShareEnum; procedure WorkgroupEnum; public constructor Create(aFileSource: IFileSource; aPath: String); override; procedure MainExecute; override; end; implementation uses LCLProc, uFile, Windows, JwaWinNetWk, JwaLmCons, JwaLmShare, JwaLmApiBuf, DCStrUtils, uShowMsg, DCOSUtils, uOSUtils; type PNetResourceArray = ^TNetResource; procedure TWinNetListOperation.WorkgroupEnum; var I: DWORD; aFile: TFile; nFile: TNetResourceW; nFileList: PNetResourceArray; dwResult: DWORD; dwCount, dwBufferSize: DWORD; hEnum: THandle = INVALID_HANDLE_VALUE; lpBuffer: Pointer = nil; FilePath: UTF8String; FileName: WideString; begin with FWinNetFileSource do try FillChar(nFile, SizeOf(TNetResource), #0); nFile.dwScope:= RESOURCE_GLOBALNET; nFile.dwType:= RESOURCETYPE_ANY; nFile.lpProvider:= PWideChar(ProviderName); if not IsPathAtRoot(Path) then begin FilePath:= ExcludeTrailingPathDelimiter(Path); FileName:= UTF8Decode(ExcludeFrontPathDelimiter(FilePath)); nFile.lpRemoteName:= PWideChar(FileName); end; dwResult := WNetOpenEnumW(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @nFile, hEnum); if (dwResult <> NO_ERROR) then Exit; dwCount := DWORD(-1); // 512 Kb must be enough dwBufferSize:= $80000; // Allocate output buffer GetMem(lpBuffer, dwBufferSize); // Enumerate all resources dwResult:= WNetEnumResource(hEnum, dwCount, lpBuffer, dwBufferSize); if dwResult = ERROR_NO_MORE_ITEMS then Exit; if (dwResult <> NO_ERROR) then Exit; nFileList:= PNetResourceArray(lpBuffer); for I := 0 to dwCount - 1 do begin CheckOperationState; aFile:= TWinNetFileSource.CreateFile(Path); aFile.FullPath:= UTF8Encode(WideString(nFileList^.lpRemoteName)); aFile.CommentProperty.Value:= UTF8Encode(WideString(nFileList^.lpComment)); if nFileList^.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE then aFile.Attributes:= faFolder; FFiles.Add(aFile); Inc(nFileList); end; finally if (hEnum <> INVALID_HANDLE_VALUE) then dwResult := WNetCloseEnum(hEnum); if (dwResult <> NO_ERROR) and (dwResult <> ERROR_NO_MORE_ITEMS) then msgError(Thread, mbSysErrorMessage(dwResult)); if Assigned(lpBuffer) then FreeMem(lpBuffer); end; end; procedure TWinNetListOperation.ShareEnum; var I: DWORD; aFile: TFile; ServerPath: WideString; dwResult: NET_API_STATUS; dwEntriesRead: DWORD = 0; dwTotalEntries: DWORD = 0; BufPtr, nFileList: PShareInfo1; begin ServerPath:= UTF8Decode(ExcludeTrailingPathDelimiter(Path)); repeat // Call the NetShareEnum function dwResult:= NetShareEnum (PWideChar(ServerPath), 1, PByte(BufPtr), MAX_PREFERRED_LENGTH, @dwEntriesRead, @dwTotalEntries, nil); // If the call succeeds if (dwResult = ERROR_SUCCESS) or (dwResult = ERROR_MORE_DATA) then begin nFileList:= BufPtr; // Loop through the entries for I:= 1 to dwEntriesRead do begin CheckOperationState; aFile:= TWinNetFileSource.CreateFile(Path); aFile.Name:= UTF8Encode(WideString(nFileList^.shi1_netname)); aFile.CommentProperty.Value:= UTF8Encode(WideString(nFileList^.shi1_remark)); case (nFileList^.shi1_type and $FF) of STYPE_DISKTREE: aFile.Attributes:= FILE_ATTRIBUTE_DIRECTORY; STYPE_IPC: aFile.Attributes:= FILE_ATTRIBUTE_SYSTEM; end; // Mark special items as hidden if (nFileList^.shi1_type and STYPE_SPECIAL = STYPE_SPECIAL) then aFile.Attributes:= aFile.Attributes or FILE_ATTRIBUTE_HIDDEN; // Mark special items as hidden if (lstrcmpiW(nFileList^.shi1_netname, 'FAX$') = 0) then aFile.Attributes:= aFile.Attributes or FILE_ATTRIBUTE_HIDDEN; // Mark special items as hidden if (lstrcmpiW(nFileList^.shi1_netname, 'PRINT$') = 0) then aFile.Attributes:= aFile.Attributes or FILE_ATTRIBUTE_HIDDEN; FFiles.Add(aFile); Inc(nFileList); end; // Free the allocated buffer NetApiBufferFree(BufPtr); end; // Continue to call NetShareEnum while there are more entries until (dwResult <> ERROR_MORE_DATA); // Show error if failed if (dwResult <> ERROR_SUCCESS) then msgError(Thread, mbSysErrorMessage(dwResult)); end; constructor TWinNetListOperation.Create(aFileSource: IFileSource; aPath: String); begin FFiles := TFiles.Create(aPath); FWinNetFileSource := aFileSource as IWinNetFileSource; inherited Create(aFileSource, aPath); end; procedure TWinNetListOperation.MainExecute; begin FFiles.Clear; with FWinNetFileSource do // Workstation/Server if (IsPathAtRoot(Path) = False) and (Pos('\\', Path) = 1) then ShareEnum // Root/Domain/Workgroup else WorkgroupEnum; end; end. doublecmd-0.5.8/src/filesources/winnet/uwinnetfilesource.pas0000644000175000017500000002400612063300204023373 0ustar alexxalexxunit uWinNetFileSource; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Dialogs, uFileSourceProperty, uVirtualFileSource, uFileSystemFileSource, uFileProperty, uFileSource, uFileSourceOperation, uFile; type { IWinNetFileSource } IWinNetFileSource = interface(IVirtualFileSource) ['{55329161-3CFC-4F15-B66D-6649B42E9357}'] function GetProviderName: WideString; property ProviderName: WideString read GetProviderName; end; { TWinNetFileSource } TWinNetFileSource = class(TFileSystemFileSource, IWinNetFileSource) private FProviderName: array[0..MAX_PATH-1] of WideChar; function GetProviderName: WideString; function IsNetworkPath(const Path: UTF8String): Boolean; protected function SetCurrentWorkingDirectory(NewDir: String): Boolean; override; public constructor Create; override; class function IsSupportedPath(const Path: String): Boolean; override; function GetParentDir(sPath : String): String; override; function IsPathAtRoot(Path: String): Boolean; override; function GetRootDir(sPath: String): String; override; overload; function GetRootDir: String; override; overload; // Retrieve some properties of the file source. function GetProperties: TFileSourceProperties; override; // These functions create an operation object specific to the file source. function CreateListOperation(TargetPath: String): TFileSourceOperation; override; function CreateCopyOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; override; function CreateCopyInOperation(SourceFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; override; function CreateCopyOutOperation(TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; override; function CreateMoveOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; override; function CreateDeleteOperation(var FilesToDelete: TFiles): TFileSourceOperation; override; function CreateWipeOperation(var FilesToWipe: TFiles): TFileSourceOperation; override; function CreateSplitOperation(var aSourceFile: TFile; aTargetPath: String): TFileSourceOperation; override; function CreateCombineOperation(var SourceFiles: TFiles; aTargetFile: String): TFileSourceOperation; override; function CreateCreateDirectoryOperation(BasePath: String; DirectoryPath: String): TFileSourceOperation; override; function CreateExecuteOperation(var ExecutableFile: TFile; BasePath, Verb: String): TFileSourceOperation; override; function CreateCalcChecksumOperation(var theFiles: TFiles; aTargetPath: String; aTargetMask: String): TFileSourceOperation; override; function CreateCalcStatisticsOperation(var theFiles: TFiles): TFileSourceOperation; override; function CreateSetFilePropertyOperation(var theTargetFiles: TFiles; var theNewProperties: TFileProperties): TFileSourceOperation; override; end; implementation uses LCLProc, uWinNetListOperation, uWinNetExecuteOperation, Windows, JwaWinNetWk, uVfsModule, uShowMsg, DCOSUtils, DCStrUtils; function TWinNetFileSource.GetParentDir(sPath: String): String; var nFile: TNetResourceW; lpBuffer: array [0..4095] of Byte; ParentPath: TNetResourceW absolute lpBuffer; dwBufferSize: DWORD; dwResult: DWORD; FilePath: WideString; begin Result:= GetRootDir; if Pos('\\', sPath) = 1 then begin FilePath:= UTF8Decode(ExcludeTrailingPathDelimiter(sPath)); FillByte(nFile, SizeOf(TNetResourceW), 0); with nFile do begin dwScope := RESOURCE_GLOBALNET; dwType := RESOURCETYPE_DISK; dwDisplayType := RESOURCEDISPLAYTYPE_SERVER; dwUsage := RESOURCEUSAGE_CONTAINER; lpRemoteName := PWideChar(FilePath); lpProvider := @FProviderName; end; dwBufferSize:= SizeOf(lpBuffer); dwResult := WNetGetResourceParentW(nFile, @lpBuffer, dwBufferSize); if dwResult <> NO_ERROR then msgError(mbSysErrorMessage(GetLastError)) else begin FilePath:= WideString(ParentPath.lpRemoteName); Result := IncludeFrontPathDelimiter(UTF8Encode(FilePath)); Result := IncludeTrailingPathDelimiter(Result); end; end; end; function TWinNetFileSource.IsPathAtRoot(Path: String): Boolean; begin Result := (DCStrUtils.GetParentDir(Path) = ''); end; function TWinNetFileSource.GetRootDir(sPath: String): String; begin Result:= PathDelim; end; function TWinNetFileSource.GetRootDir: String; begin Result:= PathDelim; end; function TWinNetFileSource.GetProperties: TFileSourceProperties; begin Result := inherited GetProperties + [fspVirtual]; end; function TWinNetFileSource.GetProviderName: WideString; begin Result:= WideString(FProviderName); end; function TWinNetFileSource.IsNetworkPath(const Path: UTF8String): Boolean; begin Result:= (NumCountChars(PathDelim, ExcludeTrailingPathDelimiter(Path)) < 3); end; function TWinNetFileSource.SetCurrentWorkingDirectory(NewDir: String): Boolean; begin if IsNetworkPath(NewDir) then Result:= True else Result:= mbSetCurrentDir(NewDir); end; constructor TWinNetFileSource.Create; var dwBufferSize: DWORD; begin inherited Create; dwBufferSize:= MAX_PATH; if WNetGetProviderNameW(WNNC_NET_LANMAN, @FProviderName, dwBufferSize) <> NO_ERROR then RaiseLastOSError; end; class function TWinNetFileSource.IsSupportedPath(const Path: String): Boolean; begin Result:= (Pos('\\', Path) = 1); end; function TWinNetFileSource.CreateListOperation(TargetPath: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; if IsNetworkPath(TargetPath) then Result:= TWinNetListOperation.Create(TargetFileSource, TargetPath) else Result:= inherited CreateListOperation(TargetPath); end; function TWinNetFileSource.CreateCopyOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; begin if IsNetworkPath(TargetPath) then Result:= nil else Result:= inherited CreateCopyOperation(SourceFiles, TargetPath); end; function TWinNetFileSource.CreateCopyInOperation(SourceFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; begin if IsNetworkPath(TargetPath) then Result:= nil else Result:=inherited CreateCopyInOperation(SourceFileSource, SourceFiles, TargetPath); end; function TWinNetFileSource.CreateCopyOutOperation(TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; begin if IsNetworkPath(SourceFiles.Path) then Result:= nil else Result:= inherited CreateCopyOutOperation(TargetFileSource, SourceFiles, TargetPath); end; function TWinNetFileSource.CreateMoveOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; begin if IsNetworkPath(SourceFiles.Path) then Result:= nil else Result:= inherited CreateMoveOperation(SourceFiles, TargetPath); end; function TWinNetFileSource.CreateDeleteOperation(var FilesToDelete: TFiles): TFileSourceOperation; begin if IsNetworkPath(FilesToDelete.Path) then Result:= nil else Result:= inherited CreateDeleteOperation(FilesToDelete); end; function TWinNetFileSource.CreateWipeOperation(var FilesToWipe: TFiles): TFileSourceOperation; begin if IsNetworkPath(FilesToWipe.Path) then Result:= nil else Result:= inherited CreateWipeOperation(FilesToWipe); end; function TWinNetFileSource.CreateSplitOperation(var aSourceFile: TFile; aTargetPath: String): TFileSourceOperation; begin if IsNetworkPath(aSourceFile.Path) then Result:= nil else Result:= inherited CreateSplitOperation(aSourceFile, aTargetPath); end; function TWinNetFileSource.CreateCombineOperation(var SourceFiles: TFiles; aTargetFile: String): TFileSourceOperation; begin if IsNetworkPath(SourceFiles.Path) then Result:= nil else Result:= inherited CreateCombineOperation(SourceFiles, aTargetFile); end; function TWinNetFileSource.CreateCreateDirectoryOperation(BasePath: String; DirectoryPath: String): TFileSourceOperation; begin if IsNetworkPath(BasePath) then Result:= nil else Result:= inherited CreateCreateDirectoryOperation(BasePath, DirectoryPath); end; function TWinNetFileSource.CreateExecuteOperation(var ExecutableFile: TFile; BasePath, Verb: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; if IsNetworkPath(BasePath) then Result:= TWinNetExecuteOperation.Create(TargetFileSource, ExecutableFile, BasePath, Verb) else Result:= inherited CreateExecuteOperation(ExecutableFile, BasePath, Verb); end; function TWinNetFileSource.CreateCalcChecksumOperation(var theFiles: TFiles; aTargetPath: String; aTargetMask: String): TFileSourceOperation; begin if IsNetworkPath(theFiles.Path) then Result:= nil else Result:= inherited CreateCalcChecksumOperation(theFiles, aTargetPath, aTargetMask); end; function TWinNetFileSource.CreateCalcStatisticsOperation(var theFiles: TFiles): TFileSourceOperation; begin if (NumCountChars(PathDelim, ExcludeTrailingPathDelimiter(theFiles.Path)) < 2) then Result:= nil else Result:= inherited CreateCalcStatisticsOperation(theFiles); end; function TWinNetFileSource.CreateSetFilePropertyOperation(var theTargetFiles: TFiles; var theNewProperties: TFileProperties ): TFileSourceOperation; begin if IsNetworkPath(theTargetFiles.Path) then Result:= nil else Result:= inherited CreateSetFilePropertyOperation(theTargetFiles, theNewProperties); end; end. doublecmd-0.5.8/src/filesources/filesystem/0000755000175000017500000000000012257501472020011 5ustar alexxalexxdoublecmd-0.5.8/src/filesources/filesystem/ufilesystemmoveoperation.pas0000644000175000017500000001426111771347314025706 0ustar alexxalexxunit uFileSystemMoveOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceMoveOperation, uFileSource, uFileSourceOperationOptions, uFileSourceOperationOptionsUI, uFile, uFileSystemUtil, DCOSUtils, uSearchTemplate; type { TFileSystemMoveOperation } TFileSystemMoveOperation = class(TFileSourceMoveOperation) private FCopyAttributesOptions: TCopyAttributesOptions; FOperationHelper: TFileSystemOperationHelper; FExcludeEmptyTemplateDirectories: Boolean; FSearchTemplate: TSearchTemplate; FSetPropertyError: TFileSourceOperationOptionSetPropertyError; FSourceFilesTree: TFileTree; // source files including all files/dirs in subdirectories FStatistics: TFileSourceMoveOperationStatistics; // local copy of statistics // Options. FReserveSpace, FCheckFreeSpace: Boolean; FSkipAllBigFiles: Boolean; FFileExistsOption: TFileSourceOperationOptionFileExists; FDirExistsOption: TFileSourceOperationOptionDirectoryExists; FCorrectSymlinks: Boolean; procedure SetSearchTemplate(AValue: TSearchTemplate); protected public constructor Create(aFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; class function GetOptionsUIClass: TFileSourceOperationOptionsUIClass; override; property CheckFreeSpace: Boolean read FCheckFreeSpace write FCheckFreeSpace; property ReserveSpace: Boolean read FReserveSpace write FReserveSpace; property CopyAttributesOptions: TCopyAttributesOptions read FCopyAttributesOptions write FCopyAttributesOptions; property SkipAllBigFiles: Boolean read FSkipAllBigFiles write FSkipAllBigFiles; property CorrectSymLinks: Boolean read FCorrectSymLinks write FCorrectSymLinks; property FileExistsOption: TFileSourceOperationOptionFileExists read FFileExistsOption write FFileExistsOption; property DirExistsOption: TFileSourceOperationOptionDirectoryExists read FDirExistsOption write FDirExistsOption; property SetPropertyError: TFileSourceOperationOptionSetPropertyError read FSetPropertyError write FSetPropertyError; property ExcludeEmptyTemplateDirectories: Boolean read FExcludeEmptyTemplateDirectories write FExcludeEmptyTemplateDirectories; {en Operation takes ownership of assigned template and will free it. } property SearchTemplate: TSearchTemplate read FSearchTemplate write SetSearchTemplate; end; implementation uses fFileSystemCopyMoveOperationOptions, uGlobs; constructor TFileSystemMoveOperation.Create(aFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); begin // Here we can read global settings if there are any. FCopyAttributesOptions := []; if gOperationOptionCopyAttributes then FCopyAttributesOptions := FCopyAttributesOptions + [caoCopyAttributes]; if gOperationOptionCopyTime then FCopyAttributesOptions := FCopyAttributesOptions + [caoCopyTime]; if gOperationOptionCopyOwnership then FCopyAttributesOptions := FCopyAttributesOptions + [caoCopyOwnership]; FFileExistsOption := gOperationOptionFileExists; FDirExistsOption := gOperationOptionDirectoryExists; FSetPropertyError := gOperationOptionSetPropertyError; FReserveSpace := gOperationOptionReserveSpace; FCheckFreeSpace := gOperationOptionCheckFreeSpace; FSkipAllBigFiles := False; FCorrectSymlinks := gOperationOptionCorrectLinks; FExcludeEmptyTemplateDirectories := True; inherited Create(aFileSource, theSourceFiles, aTargetPath); end; destructor TFileSystemMoveOperation.Destroy; begin inherited Destroy; FreeAndNil(FSourceFilesTree); FreeAndNil(FOperationHelper); FreeAndNil(FSearchTemplate); end; procedure TFileSystemMoveOperation.Initialize; var TreeBuilder: TFileSystemTreeBuilder; begin // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; TreeBuilder := TFileSystemTreeBuilder.Create( @AskQuestion, @CheckOperationState); try // In move operation don't follow symlinks. TreeBuilder.SymLinkOption := fsooslDontFollow; TreeBuilder.SearchTemplate := Self.SearchTemplate; TreeBuilder.ExcludeEmptyTemplateDirectories := Self.ExcludeEmptyTemplateDirectories; TreeBuilder.BuildFromFiles(SourceFiles); FSourceFilesTree := TreeBuilder.ReleaseTree; FStatistics.TotalFiles := TreeBuilder.FilesCount; FStatistics.TotalBytes := TreeBuilder.FilesSize; finally FreeAndNil(TreeBuilder); end; if Assigned(FOperationHelper) then FreeAndNil(FOperationHelper); FOperationHelper := TFileSystemOperationHelper.Create( @AskQuestion, @RaiseAbortOperation, @CheckOperationState, @UpdateStatistics, Thread, fsohmMove, TargetPath, FStatistics); FOperationHelper.RenameMask := RenameMask; FOperationHelper.ReserveSpace := FReserveSpace; FOperationHelper.CheckFreeSpace := CheckFreeSpace; FOperationHelper.CopyAttributesOptions := CopyAttributesOptions; FOperationHelper.SkipAllBigFiles := SkipAllBigFiles; FOperationHelper.CorrectSymLinks := CorrectSymLinks; FOperationHelper.FileExistsOption := FileExistsOption; FOperationHelper.DirExistsOption := DirExistsOption; FOperationHelper.SetPropertyError := SetPropertyError; FOperationHelper.Initialize; end; procedure TFileSystemMoveOperation.MainExecute; begin FOperationHelper.ProcessTree(FSourceFilesTree); end; procedure TFileSystemMoveOperation.SetSearchTemplate(AValue: TSearchTemplate); begin FSearchTemplate.Free; FSearchTemplate := AValue; end; procedure TFileSystemMoveOperation.Finalize; begin if Assigned(FOperationHelper) then FreeAndNil(FOperationHelper); end; class function TFileSystemMoveOperation.GetOptionsUIClass: TFileSourceOperationOptionsUIClass; begin Result := TFileSystemMoveOperationOptionsUI; end; end. doublecmd-0.5.8/src/filesources/filesystem/ufilesystemcombineoperation.pas0000644000175000017500000002236411747211345026354 0ustar alexxalexxunit uFileSystemCombineOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceCombineOperation, uFileSource, uFileSourceOperationUI, uFile, uGlobs, uLog, DCClassesUtf8; type { TFileSystemCombineOperation } TFileSystemCombineOperation = class(TFileSourceCombineOperation) private FFullFilesTreeToCombine: TFiles; // source files including all files FStatistics: TFileSourceCombineOperationStatistics; // local copy of statistics FTargetPath: UTF8String; FBuffer: Pointer; FBufferSize: LongWord; FCheckFreeSpace: Boolean; protected function Combine(aSourceFile: TFile; aTargetFileStream: TFileStreamEx): Boolean; procedure ShowError(sMessage: String); procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); public constructor Create(aFileSource: IFileSource; var theSourceFiles: TFiles; aTargetFile: String); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; end; implementation uses uOSUtils, DCOSUtils, uLng, uFileSystemUtil, LCLProc; constructor TFileSystemCombineOperation.Create(aFileSource: IFileSource; var theSourceFiles: TFiles; aTargetFile: String); begin FFullFilesTreeToCombine := nil; FCheckFreeSpace := True; FTargetPath := ExtractFilePath(aTargetFile); FBufferSize := gCopyBlockSize; GetMem(FBuffer, FBufferSize); inherited Create(aFileSource, theSourceFiles, aTargetFile); end; destructor TFileSystemCombineOperation.Destroy; begin inherited Destroy; if Assigned(FBuffer) then begin FreeMem(FBuffer); FBuffer := nil; end; if Assigned(FFullFilesTreeToCombine) then FreeAndNil(FFullFilesTreeToCombine); end; procedure TFileSystemCombineOperation.Initialize; begin // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; FStatistics.CurrentFileTo:= TargetFile; FillAndCount(SourceFiles, False, False, FFullFilesTreeToCombine, FStatistics.TotalFiles, FStatistics.TotalBytes); // count files end; procedure TFileSystemCombineOperation.MainExecute; var aFile: TFile; CurrentFileIndex: Integer; iTotalDiskSize, iFreeDiskSize: Int64; TargetFileStream: TFileStreamEx = nil; begin try { Check disk free space } if FCheckFreeSpace = True then begin GetDiskFreeSpace(FTargetPath, iFreeDiskSize, iTotalDiskSize); if FStatistics.TotalBytes > iFreeDiskSize then begin AskQuestion('', rsMsgNoFreeSpaceCont, [fsourAbort], fsourAbort, fsourAbort); RaiseAbortOperation; end; end; // Create destination file TargetFileStream := TFileStreamEx.Create(TargetFile, fmCreate); try for CurrentFileIndex := 0 to FFullFilesTreeToCombine.Count - 1 do begin aFile := FFullFilesTreeToCombine[CurrentFileIndex]; with FStatistics do begin CurrentFileFrom := aFile.FullPath; CurrentFileTotalBytes := aFile.Size; CurrentFileDoneBytes := 0; end; UpdateStatistics(FStatistics); // Combine with current file if not Combine(aFile, TargetFileStream) then Break; with FStatistics do begin DoneFiles := DoneFiles + 1; UpdateStatistics(FStatistics); end; CheckOperationState; end; finally if Assigned(TargetFileStream) then begin FreeAndNil(TargetFileStream); if (FStatistics.DoneBytes <> FStatistics.TotalBytes) then // There was some error, because not all files has been combined. // Delete the not completed target file. mbDeleteFile(TargetFile); end; end; except on EFCreateError do begin ShowError(rsMsgLogError + rsMsgErrECreate + ': ' + TargetFile); end; end; end; procedure TFileSystemCombineOperation.Finalize; begin end; function TFileSystemCombineOperation.Combine(aSourceFile: TFile; aTargetFileStream: TFileStreamEx): Boolean; var SourceFileStream: TFileStreamEx; iTotalDiskSize, iFreeDiskSize: Int64; bRetryRead, bRetryWrite: Boolean; BytesRead, BytesToRead, BytesWrittenTry, BytesWritten: Int64; TotalBytesToRead: Int64 = 0; begin Result := False; BytesToRead := FBufferSize; SourceFileStream := nil; // for safety exception handling try try SourceFileStream := TFileStreamEx.Create(aSourceFile.FullPath, fmOpenRead or fmShareDenyNone); TotalBytesToRead := SourceFileStream.Size; while TotalBytesToRead > 0 do begin // Without the following line the reading is very slow // if it tries to read past end of file. if TotalBytesToRead < BytesToRead then BytesToRead := TotalBytesToRead; repeat try bRetryRead := False; BytesRead := SourceFileStream.Read(FBuffer^, BytesToRead); if (BytesRead = 0) then Raise EReadError.Create(mbSysErrorMessage(GetLastOSError)); TotalBytesToRead := TotalBytesToRead - BytesRead; BytesWritten := 0; repeat try bRetryWrite := False; BytesWrittenTry := aTargetFileStream.Write((FBuffer + BytesWritten)^, BytesRead); BytesWritten := BytesWritten + BytesWrittenTry; if BytesWrittenTry = 0 then begin Raise EWriteError.Create(mbSysErrorMessage(GetLastOSError)); end else if BytesWritten < BytesRead then begin bRetryWrite := True; // repeat and try to write the rest end; except on E: EWriteError do begin { Check disk free space } GetDiskFreeSpace(FTargetPath, iFreeDiskSize, iTotalDiskSize); if BytesRead > iFreeDiskSize then begin case AskQuestion(rsMsgNoFreeSpaceRetry, '', [fsourYes, fsourNo], fsourYes, fsourNo) of fsourYes: bRetryWrite := True; fsourNo: RaiseAbortOperation; end; // case end else begin case AskQuestion(rsMsgErrEWrite + ' ' + TargetFile + ':', E.Message, [fsourRetry, fsourSkip, fsourAbort], fsourRetry, fsourSkip) of fsourRetry: bRetryWrite := True; fsourAbort: RaiseAbortOperation; fsourSkip: Exit; end; // case end; end; // on do end; // except until not bRetryWrite; except on E: EReadError do begin case AskQuestion(rsMsgErrERead + ' ' + aSourceFile.FullPath + ':', E.Message, [fsourRetry, fsourSkip, fsourAbort], fsourRetry, fsourSkip) of fsourRetry: bRetryRead := True; fsourAbort: RaiseAbortOperation; fsourSkip: Exit; end; // case end; end; until not bRetryRead; with FStatistics do begin CurrentFileDoneBytes := CurrentFileDoneBytes + BytesRead; DoneBytes := DoneBytes + BytesRead; UpdateStatistics(FStatistics); end; CheckOperationState; // check pause and stop end;//while finally if Assigned(SourceFileStream) then FreeAndNil(SourceFileStream); end; Result:= True; except on EFOpenError do begin ShowError(rsMsgLogError + rsMsgErrEOpen + ': ' + aSourceFile.FullPath); end; on EWriteError do begin ShowError(rsMsgLogError + rsMsgErrEWrite + ': ' + TargetFile); end; end; end; procedure TFileSystemCombineOperation.ShowError(sMessage: String); begin if gSkipFileOpError then logWrite(Thread, sMessage, lmtError, True) else begin AskQuestion(sMessage, '', [fsourAbort], fsourAbort, fsourAbort); RaiseAbortOperation; end; end; procedure TFileSystemCombineOperation.LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); begin case logMsgType of lmtError: if not (log_errors in gLogOptions) then Exit; lmtInfo: if not (log_info in gLogOptions) then Exit; lmtSuccess: if not (log_success in gLogOptions) then Exit; end; if logOptions <= gLogOptions then begin logWrite(Thread, sMessage, logMsgType); end; end; end. doublecmd-0.5.8/src/filesources/filesystem/ufilesystemexecuteoperation.pas0000644000175000017500000000473712142154036026377 0ustar alexxalexxunit uFileSystemExecuteOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSource, uFileSourceExecuteOperation, uFileSystemFileSource, uFile; type { TFileSystemExecuteOperation } TFileSystemExecuteOperation = class(TFileSourceExecuteOperation) private FFileSystemFileSource: IFileSystemFileSource; public {en @param(aTargetFileSource File source where the file should be executed.) @param(aExecutableFile File that should be executed.) @param(aCurrentPath Path of the file source where the execution should take place.) } constructor Create(aTargetFileSource: IFileSource; var aExecutableFile: TFile; aCurrentPath, aVerb: UTF8String); override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; end; implementation uses Forms, Controls, DCOSUtils, uOSUtils, uOSForms, uShellContextMenu, uExceptions; constructor TFileSystemExecuteOperation.Create( aTargetFileSource: IFileSource; var aExecutableFile: TFile; aCurrentPath, aVerb: UTF8String); begin FFileSystemFileSource := aTargetFileSource as IFileSystemFileSource; inherited Create(aTargetFileSource, aExecutableFile, aCurrentPath, aVerb); end; procedure TFileSystemExecuteOperation.Initialize; begin Screen.Cursor:= crHourGlass; end; procedure TFileSystemExecuteOperation.MainExecute; var aFiles: TFiles; begin if Verb = 'properties' then begin FExecuteOperationResult:= fseorSuccess; aFiles:= TFiles.Create(ExecutableFile.Path); try aFiles.Add(ExecutableFile.Clone); try Screen.Cursor:= crDefault; ShowFilePropertiesDialog(FFileSystemFileSource, aFiles); except on E: EContextMenuException do ShowException(E); end; finally FreeAndNil(aFiles); end; Exit; end; // if file is link to folder then return fseorSymLink if FileIsLinkToFolder(AbsolutePath, FResultString) then begin FExecuteOperationResult:= fseorSymLink; Exit; end; // try to open by system mbSetCurrentDir(CurrentPath); case ShellExecute(AbsolutePath) of True: FExecuteOperationResult:= fseorSuccess; False: FExecuteOperationResult:= fseorError; end; end; procedure TFileSystemExecuteOperation.Finalize; begin Screen.Cursor:= crDefault; end; end. doublecmd-0.5.8/src/filesources/filesystem/ufilesystemcopyoperation.pas0000644000175000017500000001717211771347314025716 0ustar alexxalexxunit uFileSystemCopyOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceCopyOperation, uFileSource, uFileSourceOperationTypes, uFileSourceOperationOptions, uFileSourceOperationOptionsUI, uFile, uFileSystemUtil, DCOSUtils, uSearchTemplate; type { TFileSystemCopyOperation } TFileSystemCopyOperation = class(TFileSourceCopyOperation) private FOperationHelper: TFileSystemOperationHelper; FExcludeEmptyTemplateDirectories: Boolean; FSearchTemplate: TSearchTemplate; FSetPropertyError: TFileSourceOperationOptionSetPropertyError; FSourceFilesTree: TFileTree; // source files including all files/dirs in subdirectories FStatistics: TFileSourceCopyOperationStatistics; // local copy of statistics // Options. FReserveSpace, FCheckFreeSpace: Boolean; FCopyAttributesOptions: TCopyAttributesOptions; FSkipAllBigFiles: Boolean; FAutoRenameItSelf: Boolean; FSymLinkOption: TFileSourceOperationOptionSymLink; FCorrectSymLinks: Boolean; FFileExistsOption: TFileSourceOperationOptionFileExists; FDirExistsOption: TFileSourceOperationOptionDirectoryExists; procedure SetSearchTemplate(AValue: TSearchTemplate); public constructor Create(aSourceFileSource: IFileSource; aTargetFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; class function GetOptionsUIClass: TFileSourceOperationOptionsUIClass; override; property CheckFreeSpace: Boolean read FCheckFreeSpace write FCheckFreeSpace; property ReserveSpace: Boolean read FReserveSpace write FReserveSpace; property CopyAttributesOptions: TCopyAttributesOptions read FCopyAttributesOptions write FCopyAttributesOptions; property SkipAllBigFiles: Boolean read FSkipAllBigFiles write FSkipAllBigFiles; property AutoRenameItSelf: Boolean read FAutoRenameItSelf write FAutoRenameItSelf; property SymLinkOption: TFileSourceOperationOptionSymLink read FSymLinkOption write FSymLinkOption; property CorrectSymLinks: Boolean read FCorrectSymLinks write FCorrectSymLinks; property FileExistsOption: TFileSourceOperationOptionFileExists read FFileExistsOption write FFileExistsOption; property DirExistsOption: TFileSourceOperationOptionDirectoryExists read FDirExistsOption write FDirExistsOption; property SetPropertyError: TFileSourceOperationOptionSetPropertyError read FSetPropertyError write FSetPropertyError; property ExcludeEmptyTemplateDirectories: Boolean read FExcludeEmptyTemplateDirectories write FExcludeEmptyTemplateDirectories; {en Operation takes ownership of assigned template and will free it. } property SearchTemplate: TSearchTemplate read FSearchTemplate write SetSearchTemplate; end; { Both operations are the same, just source and target reversed. Implement them in terms of the same functions, or have one use the other. } { TFileSystemCopyInOperation } TFileSystemCopyInOperation = class(TFileSystemCopyOperation) protected function GetID: TFileSourceOperationType; override; end; { TFileSystemCopyOutOperation } TFileSystemCopyOutOperation = class(TFileSystemCopyOperation) protected function GetID: TFileSourceOperationType; override; end; implementation uses fFileSystemCopyMoveOperationOptions, uGlobs; // -- TFileSystemCopyOperation --------------------------------------------- constructor TFileSystemCopyOperation.Create(aSourceFileSource: IFileSource; aTargetFileSource: IFileSource; var theSourceFiles: TFiles; aTargetPath: String); begin // Here we can read global settings if there are any. FCopyAttributesOptions := []; if gOperationOptionCopyAttributes then FCopyAttributesOptions := FCopyAttributesOptions + [caoCopyAttributes]; if gOperationOptionCopyTime then FCopyAttributesOptions := FCopyAttributesOptions + [caoCopyTime]; if gOperationOptionCopyOwnership then FCopyAttributesOptions := FCopyAttributesOptions + [caoCopyOwnership]; if gDropReadOnlyFlag then FCopyAttributesOptions := FCopyAttributesOptions + [caoRemoveReadOnlyAttr]; FSymLinkOption := gOperationOptionSymLinks; FFileExistsOption := gOperationOptionFileExists; FDirExistsOption := gOperationOptionDirectoryExists; FSetPropertyError := gOperationOptionSetPropertyError; FReserveSpace := gOperationOptionReserveSpace; FCheckFreeSpace := gOperationOptionCheckFreeSpace; FSkipAllBigFiles := False; FAutoRenameItSelf := False; FCorrectSymLinks := gOperationOptionCorrectLinks; FExcludeEmptyTemplateDirectories := True; inherited Create(aSourceFileSource, aTargetFileSource, theSourceFiles, aTargetPath); end; destructor TFileSystemCopyOperation.Destroy; begin inherited Destroy; FreeAndNil(FSourceFilesTree); FreeAndNil(FOperationHelper); FreeAndNil(FSearchTemplate); end; procedure TFileSystemCopyOperation.Initialize; var TreeBuilder: TFileSystemTreeBuilder; begin // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; TreeBuilder := TFileSystemTreeBuilder.Create( @AskQuestion, @CheckOperationState); try TreeBuilder.SymLinkOption := Self.SymLinkOption; TreeBuilder.SearchTemplate := Self.SearchTemplate; TreeBuilder.ExcludeEmptyTemplateDirectories := Self.ExcludeEmptyTemplateDirectories; TreeBuilder.BuildFromFiles(SourceFiles); FSourceFilesTree := TreeBuilder.ReleaseTree; FStatistics.TotalFiles := TreeBuilder.FilesCount; FStatistics.TotalBytes := TreeBuilder.FilesSize; finally FreeAndNil(TreeBuilder); end; if Assigned(FOperationHelper) then FreeAndNil(FOperationHelper); FOperationHelper := TFileSystemOperationHelper.Create( @AskQuestion, @RaiseAbortOperation, @CheckOperationState, @UpdateStatistics, Thread, fsohmCopy, TargetPath, FStatistics); FOperationHelper.RenameMask := RenameMask; FOperationHelper.ReserveSpace := FReserveSpace; FOperationHelper.CheckFreeSpace := CheckFreeSpace; FOperationHelper.CopyAttributesOptions := CopyAttributesOptions; FOperationHelper.SkipAllBigFiles := SkipAllBigFiles; FOperationHelper.AutoRenameItSelf := AutoRenameItSelf; FOperationHelper.CorrectSymLinks := CorrectSymLinks; FOperationHelper.FileExistsOption := FileExistsOption; FOperationHelper.DirExistsOption := DirExistsOption; FOperationHelper.SetPropertyError := SetPropertyError; FOperationHelper.Initialize; end; procedure TFileSystemCopyOperation.MainExecute; begin FOperationHelper.ProcessTree(FSourceFilesTree); end; procedure TFileSystemCopyOperation.SetSearchTemplate(AValue: TSearchTemplate); begin FSearchTemplate.Free; FSearchTemplate := AValue; end; procedure TFileSystemCopyOperation.Finalize; begin FreeAndNil(FOperationHelper); end; class function TFileSystemCopyOperation.GetOptionsUIClass: TFileSourceOperationOptionsUIClass; begin Result := TFileSystemCopyOperationOptionsUI; end; { TFileSystemCopyInOperation } function TFileSystemCopyInOperation.GetID: TFileSourceOperationType; begin Result:= fsoCopyIn; end; { TFileSystemCopyOutOperation } function TFileSystemCopyOutOperation.GetID: TFileSourceOperationType; begin Result:= fsoCopyOut; end; end. doublecmd-0.5.8/src/filesources/filesystem/ufilesystemcreatedirectoryoperation.pas0000644000175000017500000000362011747211345030122 0ustar alexxalexxunit uFileSystemCreateDirectoryOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceCreateDirectoryOperation, uFileSource, uFileSystemFileSource; type TFileSystemCreateDirectoryOperation = class(TFileSourceCreateDirectoryOperation) private FFileSystemFileSource: IFileSystemFileSource; public constructor Create(aTargetFileSource: IFileSource; aCurrentPath: String; aDirectoryPath: String); override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; end; implementation uses uFileSourceOperationUI, uFileProcs, uLog, uLng, uGlobs, DCOSUtils; constructor TFileSystemCreateDirectoryOperation.Create( aTargetFileSource: IFileSource; aCurrentPath: String; aDirectoryPath: String); begin FFileSystemFileSource := aTargetFileSource as IFileSystemFileSource; inherited Create(aTargetFileSource, aCurrentPath, aDirectoryPath); end; procedure TFileSystemCreateDirectoryOperation.Initialize; begin end; procedure TFileSystemCreateDirectoryOperation.MainExecute; begin if mbFileGetAttr(AbsolutePath) <> faInvalidAttributes then begin AskQuestion(Format(rsMsgErrDirExists, [AbsolutePath]), '', [fsourOk], fsourOk, fsourOk); end else if uFileProcs.mbForceDirectory(AbsolutePath) = False then begin if (log_dir_op in gLogOptions) and (log_errors in gLogOptions) then logWrite(Thread, Format(rsMsgLogError+rsMsgLogMkDir, [AbsolutePath]), lmtError); AskQuestion(Format(rsMsgErrForceDir, [AbsolutePath]), '', [fsourOk], fsourOk, fsourOk); end else begin if (log_dir_op in gLogOptions) and (log_success in gLogOptions) then logWrite(Thread, Format(rsMsgLogSuccess+rsMsgLogMkDir,[AbsolutePath]), lmtSuccess); end; end; procedure TFileSystemCreateDirectoryOperation.Finalize; begin end; end. doublecmd-0.5.8/src/filesources/filesystem/ufilesystemwipeoperation.pas0000644000175000017500000003100511770126200025663 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- This module implements a secure erase of disk media as per the Department of Defense clearing and sanitizing standard: DOD 5220.22-M The standard states that hard disk media is erased by overwriting with a character, then the character's complement, and then a random character. Note that the standard specicically states that this method is not suitable for TOP SECRET information. TOP SECRET data sanatizing is only achievable by a Type 1 or 2 degauss of the disk, or by disintegrating, incinerating, pulverizing, shreding, or melting the disk. Copyright (C) 2008-2012 Alexander Koblov (alexx2000@mail.ru) Based on: WP - wipes files in a secure way. version 3.2 - By Uri Fridman. urifrid@yahoo.com www.geocities.com/urifrid This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uFileSystemWipeOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceWipeOperation, uFileSource, uFileSourceOperationOptions, uFileSourceOperationUI, uFile, uDescr, uGlobs, uLog; type { TFileSystemWipeOperation } TFileSystemWipeOperation = class(TFileSourceWipeOperation) private FEverythingOK: Boolean; FErrors, files, directories: Integer; buffer: array [0..4095] of Byte; procedure Fill(chr: Integer); procedure SecureDelete(pass: Integer; FileName: String); procedure WipeDir(dir: string); procedure WipeFile(filename: String); private FFullFilesTreeToDelete: TFiles; // source files including all files/dirs in subdirectories FStatistics: TFileSourceWipeOperationStatistics; // local copy of statistics FDescription: TDescription; // Options. FSymLinkOption: TFileSourceOperationOptionSymLink; FSkipErrors: Boolean; FDeleteReadOnly: TFileSourceOperationOptionGeneral; protected procedure Wipe(aFile: TFile); function ShowError(sMessage: String): TFileSourceOperationUIResponse; procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); public constructor Create(aTargetFileSource: IFileSource; var theFilesToWipe: TFiles); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; end; implementation uses uDebug, uLng, uFindEx, DCClassesUtf8, uFileSystemUtil, DCOSUtils; constructor TFileSystemWipeOperation.Create(aTargetFileSource: IFileSource; var theFilesToWipe: TFiles); begin FSymLinkOption := fsooslNone; FSkipErrors := False; FDeleteReadOnly := fsoogNone; FFullFilesTreeToDelete := nil; if gProcessComments then FDescription := TDescription.Create(True) else FDescription := nil; inherited Create(aTargetFileSource, theFilesToWipe); end; destructor TFileSystemWipeOperation.Destroy; begin inherited Destroy; if Assigned(FDescription) then begin FDescription.SaveDescription; FreeAndNil(FDescription); end; if Assigned(FFullFilesTreeToDelete) then FreeAndNil(FFullFilesTreeToDelete); end; procedure TFileSystemWipeOperation.Initialize; begin // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; FillAndCount(FilesToWipe, True, False, FFullFilesTreeToDelete, FStatistics.TotalFiles, FStatistics.TotalBytes); // gets full list of files (recursive) if gProcessComments then FDescription.Clear; FEverythingOK := True; end; procedure TFileSystemWipeOperation.MainExecute; var aFile: TFile; CurrentFileIndex: Integer; OldDoneBytes: Int64; // for if there was an error begin for CurrentFileIndex := FFullFilesTreeToDelete.Count - 1 downto 0 do begin aFile := FFullFilesTreeToDelete[CurrentFileIndex]; FStatistics.CurrentFile := aFile.Path + aFile.Name; UpdateStatistics(FStatistics); // If there will be an error in Wipe the DoneBytes value // will be inconsistent, so remember it here. OldDoneBytes := FStatistics.DoneBytes; Wipe(aFile); with FStatistics do begin DoneFiles := DoneFiles + 1; // Correct statistics if file not correctly processed. if DoneBytes < (OldDoneBytes + aFile.Size) then DoneBytes := OldDoneBytes + aFile.Size; UpdateStatistics(FStatistics); end; CheckOperationState; end; end; procedure TFileSystemWipeOperation.Finalize; begin end; //fill buffer with characters //0 = with 0, 1 = with 1 and 2 = random procedure TFileSystemWipeOperation.Fill(chr: Integer); var I: Integer; begin case chr of 0: begin for I := Low(buffer) to High(buffer) do buffer[I] := $00; end; 1: begin for I := Low(buffer) to High(buffer) do buffer[I] := $FF; end; 2: begin for I := Low(buffer) to High(buffer) do buffer[I] := Random($100); end; end; end; procedure TFileSystemWipeOperation.SecureDelete(pass: Integer; FileName: String); var i, j, n: Integer; max: Int64; fs: TFileStreamEx; sTempFileName: String; // renames file to delete begin if mbFileAccess(FileName, fmOpenWrite) then begin sTempFileName:= GetTempName(ExtractFilePath(FileName)) + '.tmp'; if mbRenameFile(FileName, sTempFileName) then begin FileName:= sTempFileName; end else begin ShowError(Format(rsMsgErrRename, [FileName, sTempFileName])); Exit; end; end else begin ShowError(rsMsgErrEOpen + #32 + FileName); Exit; end; fs := TFilestreamEx.Create(FileName, fmOpenReadWrite or fmShareExclusive); try for i := 1 to pass do begin //---------------Progress-------------- CheckOperationState; // check pause and stop FStatistics.CurrentFileTotalBytes:= fs.Size * 3; FStatistics.CurrentFileDoneBytes:= 0; UpdateStatistics(FStatistics); //------------------------------------- for j:= 0 to 2 do begin fill(j); max := fs.Size; fs.Position := 0; while max > 0 do begin if max > SizeOf(buffer) then n := SizeOf(buffer) else n := max; fs.Write(Buffer, n); max := max - n; //---------------Progress-------------- with FStatistics do begin Inc(CurrentFileDoneBytes, n); Inc(DoneBytes, n div (3 * pass)); UpdateStatistics(FStatistics); CheckOperationState; // check pause and stop end; //------------------------------------- end; FileFlush(fs.Handle); CheckOperationState; // check pause and stop end; end; FileTruncate(fs.Handle, 0); FreeAndNil(fs); except on E: Exception do begin FreeAndNil(fs); ShowError(E.Message); Exit; end; end; if not mbDeleteFile(FileName) then begin ShowError(Format(rsMsgNotDelete, [FileName])); Exit; end; files:= files+1; DCDebug('OK'); FEverythingOK:= True; end; procedure TFileSystemWipeOperation.WipeDir(dir: string); var Search: TSearchRecEx; ok: Integer; sPath: String; begin sPath:= IncludeTrailingPathDelimiter(dir); ok:= FindFirstEx(sPath + '*', faAnyFile, Search); while ok = 0 do begin if ((Search.Name <> '.' ) and (Search.Name <> '..')) then begin //remove read-only attr try if not mbFileSetReadOnly(sPath + Search.Name, False) then DCDebug('wp: FAILED when trying to remove read-only attr on '+ sPath + Search.Name); except DCDebug('wp: FAILED when trying to remove read-only attr on '+ sPath + Search.Name); end; if fpS_ISDIR(Search.Attr) then begin DCDebug('Entering '+ sPath + Search.Name); WipeDir(sPath + Search.Name); end else begin DCDebug('Wiping '+ sPath + Search.Name); SecureDelete(gWipePassNumber, sPath + Search.Name); end; end; ok:= FindNextEx(Search); end; FindCloseEx(Search); try if FEverythingOK then begin DCDebug('Wiping ' + dir); if not mbRemoveDir(dir) then begin DCDebug('wp: error wiping directory ' + dir); // write log ------------------------------------------------------------------- LogMessage(Format(rsMsgLogError+rsMsgLogRmDir, [dir]), [log_dir_op, log_delete], lmtError); //------------------------------------------------------------------------------ end else begin directories:= directories + 1; DCDebug('OK'); // write log ------------------------------------------------------------------- LogMessage(Format(rsMsgLogSuccess+rsMsgLogRmDir, [dir]), [log_dir_op, log_delete], lmtSuccess); //------------------------------------------------------------------------------ end; end; except on EInOutError do DCDebug('Couldn''t remove '+ dir); end; end; procedure TFileSystemWipeOperation.WipeFile(filename: String); var Found: Integer; SRec: TSearchRecEx; sPath: String; begin sPath:= ExtractFilePath(filename); { Use FindFirst so we can specify wild cards in the filename } Found:= FindFirstEx(filename,faReadOnly or faSysFile or faArchive or faHidden, SRec); if Found <> 0 then begin DCDebug('wp: file not found: ', filename); FErrors:= FErrors + 1; Exit; end; while Found = 0 do begin //remove read-only attr try if not mbFileSetReadOnly(sPath + SRec.Name, False) then DCDebug('wp: FAILED when trying to remove read-only attr on '+ sPath + SRec.Name); except DCDebug('wp: can''t wipe '+ sPath + SRec.Name + ', file might be in use.'); FEverythingOK:= False; FErrors:= FErrors + 1; Exit; end; DCDebug('Wiping ' + sPath + SRec.Name); SecureDelete(gWipePassNumber, sPath + SRec.Name); // write log ------------------------------------------------------------------- if FEverythingOK then LogMessage(Format(rsMsgLogSuccess+rsMsgLogDelete, [sPath + SRec.Name]), [log_delete], lmtSuccess) else LogMessage(Format(rsMsgLogError+rsMsgLogDelete, [sPath + SRec.Name]), [log_delete], lmtError); // ----------------------------------------------------------------------------- Found:= FindNextEx(SRec); { Find the next file } end; FindCloseEx(SRec); end; procedure TFileSystemWipeOperation.Wipe(aFile: TFile); var FileName: String; begin try FileName:= aFile.Path + aFile.Name; if aFile.AttributesProperty.IsDirectory then // directory WipeDir(FileName) else // files WipeFile(FileName); // process comments if need if gProcessComments then FDescription.DeleteDescription(FileName); except DCDebug('Can not wipe ', FileName); end; end; function TFileSystemWipeOperation.ShowError(sMessage: String): TFileSourceOperationUIResponse; begin FEverythingOK:= False; Inc(FErrors); if gSkipFileOpError then begin logWrite(Thread, sMessage, lmtError, True); Result := fsourSkip; end else begin Result := AskQuestion(sMessage, '', [fsourSkip, fsourCancel], fsourSkip, fsourCancel); if Result = fsourCancel then RaiseAbortOperation; end; end; procedure TFileSystemWipeOperation.LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); begin case logMsgType of lmtError: if not (log_errors in gLogOptions) then Exit; lmtInfo: if not (log_info in gLogOptions) then Exit; lmtSuccess: if not (log_success in gLogOptions) then Exit; end; if logOptions <= gLogOptions then begin logWrite(Thread, sMessage, logMsgType); end; end; end. doublecmd-0.5.8/src/filesources/filesystem/ufilesystemdeleteoperation.pas0000644000175000017500000002360711747211345026203 0ustar alexxalexxunit uFileSystemDeleteOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceDeleteOperation, uFileSource, uFileSourceOperationOptions, uFileSourceOperationUI, uFile, uDescr, uGlobs, uLog; type { TFileSystemDeleteOperation } TFileSystemDeleteOperation = class(TFileSourceDeleteOperation) private FFullFilesTreeToDelete: TFiles; // source files including all files/dirs in subdirectories FStatistics: TFileSourceDeleteOperationStatistics; // local copy of statistics FDescription: TDescription; // Options. FSymLinkOption: TFileSourceOperationOptionSymLink; FSkipErrors: Boolean; FRecycle: Boolean; FDeleteReadOnly, FDeleteDirectly: TFileSourceOperationOptionGeneral; procedure DeleteSubDirectory(const aFile: TFile); protected procedure ProcessFile(aFile: TFile); procedure ProcessList(aFiles: TFiles); function ShowError(sMessage: String): TFileSourceOperationUIResponse; procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); public constructor Create(aTargetFileSource: IFileSource; var theFilesToDelete: TFiles); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; // For delete to trash property Recycle : boolean read FRecycle write FRecycle default false; property DeleteReadOnly: TFileSourceOperationOptionGeneral read FDeleteReadOnly write FDeleteReadOnly; property SymLinkOption: TFileSourceOperationOptionSymLink read FSymLinkOption write FSymLinkOption; property SkipErrors: Boolean read FSkipErrors write FSkipErrors; end; implementation uses DCOSUtils, uLng, uFileSystemUtil, uTrash; constructor TFileSystemDeleteOperation.Create(aTargetFileSource: IFileSource; var theFilesToDelete: TFiles); begin FSymLinkOption := fsooslNone; FSkipErrors := gSkipFileOpError; FRecycle := False; FDeleteReadOnly := fsoogNone; FDeleteDirectly:= fsoogNone; if gProcessComments then FDescription := TDescription.Create(True); inherited Create(aTargetFileSource, theFilesToDelete); end; destructor TFileSystemDeleteOperation.Destroy; begin inherited Destroy; if Assigned(FDescription) then begin FDescription.SaveDescription; FreeAndNil(FDescription); end; if not FRecycle then begin FreeAndNil(FFullFilesTreeToDelete); end; end; procedure TFileSystemDeleteOperation.Initialize; begin // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; if FRecycle then begin FFullFilesTreeToDelete:= FilesToDelete; FStatistics.TotalFiles:= FFullFilesTreeToDelete.Count; end else begin FillAndCount(FilesToDelete, True, False, FFullFilesTreeToDelete, FStatistics.TotalFiles, FStatistics.TotalBytes); // gets full list of files (recursive) end; if gProcessComments then FDescription.Clear; end; procedure TFileSystemDeleteOperation.MainExecute; begin ProcessList(FFullFilesTreeToDelete); end; procedure TFileSystemDeleteOperation.Finalize; begin end; procedure TFileSystemDeleteOperation.DeleteSubDirectory(const aFile: TFile); var RootFiles: TFiles = nil; SubFiles: TFiles = nil; FilesCount, BytesCount: Int64; begin RootFiles := TFiles.Create(aFile.Path); try RootFiles.Add(aFile.Clone); // Only count statistics for subfiles because statistics for the root dir // have already been counted. FillAndCount(RootFiles, True, True, SubFiles, FilesCount, BytesCount); FStatistics.TotalFiles := FStatistics.TotalFiles + FilesCount; FStatistics.TotalBytes := FStatistics.TotalBytes + BytesCount; // Only now insert root directory. SubFiles.Insert(aFile.Clone, 0); // This function will only be called if deleting to trash failed // so we can assume Recycle is True. Turn off temporarily as we delete this subdirectory. FRecycle := False; ProcessList(SubFiles); finally RootFiles.Free; SubFiles.Free; FRecycle := True; end; end; procedure TFileSystemDeleteOperation.ProcessFile(aFile: TFile); var FileName: String; bRetry: Boolean; RemoveDirectly: TFileSourceOperationOptionGeneral = fsoogNone; sMessage, sQuestion: String; logOptions: TLogOptions; DeleteResult: Boolean; begin FileName := aFile.FullPath; if FileIsReadOnly(aFile.Attributes) then begin case FDeleteReadOnly of fsoogNone: case AskQuestion(Format(rsMsgFileReadOnly, [FileName]), '', [fsourYes, fsourAll, fsourSkip, fsourSkipAll], fsourYes, fsourSkip) of fsourAll: FDeleteReadOnly := fsoogYes; fsourSkip: Exit; fsourSkipAll: begin FDeleteReadOnly := fsoogNo; Exit; end; end; fsoogNo: Exit; end; end; repeat bRetry := False; if (FRecycle = False) then begin if FileIsReadOnly(aFile.Attributes) then mbFileSetReadOnly(FileName, False); if aFile.IsDirectory then // directory begin DeleteResult := mbRemoveDir(FileName); end else begin // files and other stuff DeleteResult := mbDeleteFile(FileName); end; end else begin // Delete to trash (one function for file and folder) DeleteResult:= mbDeleteToTrash(FileName); if not DeleteResult then begin case FDeleteDirectly of fsoogNone: case AskQuestion(Format(rsMsgDelToTrashForce, [FileName]), '', [fsourYes, fsourAll, fsourSkip, fsourSkipAll, fsourAbort], fsourYes, fsourSkip) of fsourYes: RemoveDirectly:= fsoogYes; fsourAll: begin FDeleteDirectly := fsoogYes; RemoveDirectly:= fsoogYes; end; fsourSkip: RemoveDirectly:= fsoogNo; fsourSkipAll: begin FDeleteDirectly := fsoogNo; RemoveDirectly:= fsoogNo; end; fsourAbort: RaiseAbortOperation; end; fsoogYes: RemoveDirectly:= fsoogYes; fsoogNo: RemoveDirectly:= fsoogNo; end; if RemoveDirectly = fsoogYes then begin if aFile.IsLinkToDirectory then begin DeleteResult := mbRemoveDir(FileName); end else if aFile.IsDirectory then // directory begin DeleteSubDirectory(aFile); // This directory has already been processed. Exit; end else // files and other stuff begin DeleteResult := mbDeleteFile(FileName); end; end; end; end; if DeleteResult then begin // success // process comments if need if gProcessComments then FDescription.DeleteDescription(FileName); if aFile.IsDirectory then begin LogMessage(Format(rsMsgLogSuccess + rsMsgLogRmDir, [FileName]), [log_dir_op, log_delete], lmtSuccess); end else begin LogMessage(Format(rsMsgLogSuccess + rsMsgLogDelete, [FileName]), [log_delete], lmtSuccess); end; end else // error begin if aFile.IsDirectory then begin logOptions := [log_dir_op, log_delete]; sMessage := Format(rsMsgLogError + rsMsgLogRmDir, [FileName]); sQuestion := Format(rsMsgCannotDeleteDirectory, [FileName]); end else begin logOptions := [log_delete]; sMessage := Format(rsMsgLogError + rsMsgLogDelete, [FileName]); sQuestion := Format(rsMsgNotDelete, [FileName]); end; if FSkipErrors or (RemoveDirectly = fsoogNo) then LogMessage(sMessage, logOptions, lmtError) else begin case AskQuestion(sQuestion, '', [fsourRetry, fsourSkip, fsourSkipAll, fsourAbort], fsourRetry, fsourSkip) of fsourRetry: bRetry := True; fsourSkipAll: FSkipErrors := True; fsourAbort: RaiseAbortOperation; end; end; end; until bRetry = False; end; procedure TFileSystemDeleteOperation.ProcessList(aFiles: TFiles); var aFile: TFile; CurrentFileIndex: Integer; begin for CurrentFileIndex := aFiles.Count - 1 downto 0 do begin aFile := aFiles[CurrentFileIndex]; FStatistics.CurrentFile := aFile.FullPath; UpdateStatistics(FStatistics); ProcessFile(aFile); with FStatistics do begin DoneFiles := DoneFiles + 1; DoneBytes := DoneBytes + aFile.Size; end; UpdateStatistics(FStatistics); CheckOperationState; end; end; function TFileSystemDeleteOperation.ShowError(sMessage: String): TFileSourceOperationUIResponse; begin if FSkipErrors then begin logWrite(Thread, sMessage, lmtError, True); Result := fsourSkip; end else begin Result := AskQuestion(sMessage, '', [fsourSkip, fsourCancel], fsourSkip, fsourCancel); if Result = fsourCancel then RaiseAbortOperation; end; end; procedure TFileSystemDeleteOperation.LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); begin case logMsgType of lmtError: if not (log_errors in gLogOptions) then Exit; lmtInfo: if not (log_info in gLogOptions) then Exit; lmtSuccess: if not (log_success in gLogOptions) then Exit; end; if logOptions <= gLogOptions then begin logWrite(Thread, sMessage, logMsgType); end; end; end. doublecmd-0.5.8/src/filesources/filesystem/ufilesystemsetfilepropertyoperation.pas0000644000175000017500000003060411747211345030174 0ustar alexxalexxunit uFileSystemSetFilePropertyOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceSetFilePropertyOperation, uFileSource, uFileSourceOperationOptions, uFile, uFileProperty; type TFileSystemSetFilePropertyOperation = class(TFileSourceSetFilePropertyOperation) private FFullFilesTree: TFiles; // source files including all files/dirs in subdirectories FStatistics: TFileSourceSetFilePropertyOperationStatistics; // local copy of statistics // Options. FSymLinkOption: TFileSourceOperationOptionSymLink; function RenameFile(const OldName: UTF8String; NewName: UTF8String): TSetFilePropertyResult; protected function SetNewProperty(aFile: TFile; aTemplateProperty: TFileProperty): TSetFilePropertyResult; override; public constructor Create(aTargetFileSource: IFileSource; var theTargetFiles: TFiles; var theNewProperties: TFileProperties); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; end; implementation uses uGlobs, uLng, DCDateTimeUtils, uFileSystemUtil, uFileSourceOperationUI, DCOSUtils, DCStrUtils, DCBasicTypes {$IF DEFINED(MSWINDOWS)} , Windows, ShellAPI, LCLProc {$ELSEIF DEFINED(UNIX)} , BaseUnix, FileUtil {$ENDIF} ; constructor TFileSystemSetFilePropertyOperation.Create(aTargetFileSource: IFileSource; var theTargetFiles: TFiles; var theNewProperties: TFileProperties); begin FSymLinkOption := fsooslNone; FFullFilesTree := nil; inherited Create(aTargetFileSource, theTargetFiles, theNewProperties); // Assign after calling inherited constructor. FSupportedProperties := [fpName, fpAttributes, fpModificationTime, fpCreationTime, fpLastAccessTime]; end; destructor TFileSystemSetFilePropertyOperation.Destroy; begin inherited Destroy; if Recursive then begin if Assigned(FFullFilesTree) then FreeAndNil(FFullFilesTree); end; end; procedure TFileSystemSetFilePropertyOperation.Initialize; var TotalBytes: Int64; begin // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; if not Recursive then begin FFullFilesTree := TargetFiles; FStatistics.TotalFiles := FFullFilesTree.Count; end else begin FillAndCount(TargetFiles, True, False, FFullFilesTree, FStatistics.TotalFiles, TotalBytes); // gets full list of files (recursive) end; end; procedure TFileSystemSetFilePropertyOperation.MainExecute; var aFile: TFile; aTemplateFile: TFile; CurrentFileIndex: Integer; begin for CurrentFileIndex := 0 to FFullFilesTree.Count - 1 do begin aFile := FFullFilesTree[CurrentFileIndex]; FStatistics.CurrentFile := aFile.FullPath; UpdateStatistics(FStatistics); if Assigned(TemplateFiles) and (CurrentFileIndex < TemplateFiles.Count) then aTemplateFile := TemplateFiles[CurrentFileIndex] else aTemplateFile := nil; SetProperties(aFile, aTemplateFile); with FStatistics do begin DoneFiles := DoneFiles + 1; UpdateStatistics(FStatistics); end; CheckOperationState; end; end; procedure TFileSystemSetFilePropertyOperation.Finalize; begin end; function TFileSystemSetFilePropertyOperation.SetNewProperty(aFile: TFile; aTemplateProperty: TFileProperty): TSetFilePropertyResult; begin Result := sfprSuccess; try case aTemplateProperty.GetID of fpName: if (aTemplateProperty as TFileNameProperty).Value <> aFile.Name then begin Result := RenameFile( aFile.FullPath, (aTemplateProperty as TFileNameProperty).Value); end else Result := sfprSkipped; fpAttributes: if (aTemplateProperty as TFileAttributesProperty).Value <> (aFile.Properties[fpAttributes] as TFileAttributesProperty).Value then begin if mbFileSetAttr( aFile.FullPath, (aTemplateProperty as TFileAttributesProperty).Value) <> 0 then begin Result := sfprError; end; end else Result := sfprSkipped; fpModificationTime: if (aTemplateProperty as TFileModificationDateTimeProperty).Value <> (aFile.Properties[fpModificationTime] as TFileModificationDateTimeProperty).Value then begin if not mbFileSetTime( aFile.FullPath, DateTimeToFileTime((aTemplateProperty as TFileModificationDateTimeProperty).Value), 0, 0) then begin Result := sfprError; end; end else Result := sfprSkipped; fpCreationTime: if (aTemplateProperty as TFileCreationDateTimeProperty).Value <> (aFile.Properties[fpCreationTime] as TFileCreationDateTimeProperty).Value then begin if not mbFileSetTime( aFile.FullPath, 0, DateTimeToFileTime((aTemplateProperty as TFileCreationDateTimeProperty).Value), 0) then begin Result := sfprError; end; end else Result := sfprSkipped; fpLastAccessTime: if (aTemplateProperty as TFileLastAccessDateTimeProperty).Value <> (aFile.Properties[fpLastAccessTime] as TFileLastAccessDateTimeProperty).Value then begin if not mbFileSetTime( aFile.FullPath, 0, 0, DateTimeToFileTime((aTemplateProperty as TFileLastAccessDateTimeProperty).Value)) then begin Result := sfprError; end; end else Result := sfprSkipped; else raise Exception.Create('Trying to set unsupported property'); end; except on e: EDateOutOfRange do begin if not gSkipFileOpError then case AskQuestion(rsMsgLogError + Format(rsMsgErrDateNotSupported, [DateTimeToStr(e.DateTime)]), '', [fsourSkip, fsourAbort], fsourSkip, fsourAbort) of fsourSkip: Result := sfprSkipped; fsourAbort: RaiseAbortOperation; end; end; on e: EConvertError do begin if not gSkipFileOpError then case AskQuestion(rsMsgLogError + e.Message, '', [fsourSkip, fsourAbort], fsourSkip, fsourAbort) of fsourSkip: Result := sfprSkipped; fsourAbort: RaiseAbortOperation; end; end; end; end; function TFileSystemSetFilePropertyOperation.RenameFile(const OldName: UTF8String; NewName: UTF8String): TSetFilePropertyResult; function AskIfOverwrite(Attrs: TFileAttrs): TFileSourceOperationUIResponse; var sQuestion: String; begin if DCOSUtils.FPS_ISDIR(Attrs) then sQuestion := rsMsgFolderExistsRwrt else sQuestion := rsMsgFileExistsRwrt; Result := AskQuestion(Format(sQuestion, [NewName]), '', [fsourYes, fsourNo, fsourAbort], fsourYes, fsourNo); end; {$IFDEF MSWINDOWS} function ShellRename: Boolean; var wsFromName, wsToName: WideString; FileOpStruct: TSHFileOpStructW; begin wsFromName := UTF8Decode(OldName) + #0; wsToName := UTF8Decode(NewName) + #0; FillByte(FileOpStruct, SizeOf(FileOpStruct), 0); with FileOpStruct do begin Wnd := GetForegroundWindow; // Use rename operation when only file name case is changed if UTF8LowerCase(OldName) = UTF8LowerCase(NewName) then wFunc := FO_RENAME else wFunc := FO_MOVE; pFrom := PWideChar(wsFromName); pTo := PWideChar(wsToName); end; Result := (SHFileOperationW(@FileOpStruct) = 0) and (not FileOpStruct.fAnyOperationsAborted); end; {$ENDIF} var {$IFDEF UNIX} tmpFileName: UTF8String; OldFileStat, NewFileStat: stat; {$ELSE} NewFileAttrs: TFileAttrs; {$ENDIF} begin if FileSource.GetPathType(NewName) <> ptAbsolute then NewName := ExtractFilePath(OldName) + NewName; if OldName = NewName then Exit(sfprSkipped); {$IFDEF UNIX} if fpLstat(UTF8ToSys(OldName), OldFileStat) <> 0 then Exit(sfprError); // Check if target file exists. if fpLstat(UTF8ToSys(NewName), NewFileStat) = 0 then begin // Check if source and target are the same files (same inode and same device). if (OldFileStat.st_ino = NewFileStat.st_ino) and (OldFileStat.st_dev = NewFileStat.st_dev) then begin // Check number of links. // If it is 1 then source and target names most probably differ only // by case on a case-insensitive filesystem. Direct rename() in such case // fails on Linux, so we use a temporary file name and rename in two stages. // If number of links is more than 1 then it's enough to simply unlink // the source file, since both files are technically identical. // (On Linux rename() returns success but doesn't do anything // if renaming a file to its hard link.) // We cannot use st_nlink for directories because it means "number of // subdirectories"; hard links to directories are not supported on Linux // or Windows anyway (on MacOSX they are). Therefore we always treat // directories as if they were a single link and rename them using temporary name. if (NewFileStat.st_nlink = 1) or BaseUnix.fpS_ISDIR(NewFileStat.st_mode) then begin tmpFileName := GetTempName(OldName); if FpRename(UTF8ToSys(OldName), UTF8ToSys(tmpFileName)) = 0 then begin if fpLstat(UTF8ToSys(NewName), NewFileStat) = 0 then begin // We have renamed the old file but the new file name still exists, // so this wasn't a single file on a case-insensitive filesystem // accessible by two names that differ by case. FpRename(UTF8ToSys(tmpFileName), UTF8ToSys(OldName)); // Restore old file. {$IFDEF DARWIN} // If it was a directory with multiple hard links then fall through // to asking for overwrite and unlinking source link. if not (BaseUnix.fpS_ISDIR(NewFileStat.st_mode) and (NewFileStat.st_nlink > 1)) then {$ENDIF} Exit(sfprError); end else if FpRename(UTF8ToSys(tmpFileName), UTF8ToSys(NewName)) = 0 then begin Exit(sfprSuccess); end else begin FpRename(UTF8ToSys(tmpFileName), UTF8ToSys(OldName)); // Restore old file. Exit(sfprError); end; end else Exit(sfprError); end; // Both names are hard links to the same file. case AskIfOverwrite(NewFileStat.st_mode) of fsourYes: ; // continue fsourNo: Exit(sfprSkipped); fsourAbort: RaiseAbortOperation; end; // Multiple links - simply unlink the source file. if fpUnLink(UTF8ToSys(OldName)) = 0 then Result := sfprSuccess else Result := sfprError; Exit; end else begin case AskIfOverwrite(NewFileStat.st_mode) of fsourYes: ; // continue fsourNo: Exit(sfprSkipped); fsourAbort: RaiseAbortOperation; end; end; end; if FpRename(UTF8ToSys(OldName), UTF8ToSys(NewName)) = 0 then Result := sfprSuccess else Result := sfprError; {$ELSE} if gUseShellForFileOperations then begin if ShellRename then Result := sfprSuccess else Result := sfprError; end else begin // Windows XP doesn't allow two filenames that differ only by case (even on NTFS). if UTF8LowerCase(OldName) <> UTF8LowerCase(NewName) then begin NewFileAttrs := mbFileGetAttr(NewName); if NewFileAttrs <> faInvalidAttributes then // If target file exists. begin case AskIfOverwrite(NewFileAttrs) of fsourYes: ; // continue fsourNo: Exit(sfprSkipped); fsourAbort: RaiseAbortOperation; end; end; end; if mbRenameFile(OldName, NewName) then Result := sfprSuccess else Result := sfprError; end; {$ENDIF} end; end. doublecmd-0.5.8/src/filesources/filesystem/ffilesystemcopymoveoperationoptions.lrt0000644000175000017500000000246512023046500030177 0ustar alexxalexxTFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLFILEEXISTS.CAPTION=When &file exists TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLDIRECTORYEXISTS.CAPTION=When dir&ectory exists TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLSETPROPERTYERROR.CAPTION=When ca&nnot set property TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CMBSETPROPERTYERROR.HINT=What to do when cannot set file time, attributes, etc. TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBCHECKFREESPACE.CAPTION=C&heck free space TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBFOLLOWLINKS.CAPTION=Fo&llow links TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBCORRECTLINKS.CAPTION=Correct lin&ks TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBCOPYATTRIBUTES.CAPTION=Cop&y attributes TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBDROPREADONLYFLAG.CAPTION=Drop readonly fla&g TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBCOPYTIME.CAPTION=Copy d&ate/time TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBCOPYOWNERSHIP.CAPTION=Copy o&wnership TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBRESERVESPACE.CAPTION=&Reserve space TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.GBFILETEMPLATE.CAPTION=Use file template TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.BTNSEARCHTEMPLATE.HINT=Choose template... TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.LBLTEMPLATENAME.CAPTION= TFILESYSTEMCOPYMOVEOPERATIONOPTIONSUI.CBEXCLUDEEMPTYDIRECTORIES.CAPTION=E&xclude empty directories doublecmd-0.5.8/src/filesources/filesystem/ffilesystemcopymoveoperationoptions.pas0000644000175000017500000002624012042214366030166 0ustar alexxalexxunit fFileSystemCopyMoveOperationOptions; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, StdCtrls, ExtCtrls, Buttons, uFileSourceOperationOptionsUI, uFileSystemCopyOperation, uFileSystemMoveOperation, uSearchTemplate; type { TFileSystemCopyMoveOperationOptionsUI } TFileSystemCopyMoveOperationOptionsUI = class(TFileSourceOperationOptionsUI) btnSearchTemplate: TBitBtn; cbCheckFreeSpace: TCheckBox; cbCorrectLinks: TCheckBox; cbDropReadOnlyFlag: TCheckBox; cbFollowLinks: TCheckBox; cbCopyAttributes: TCheckBox; cbCopyTime: TCheckBox; cbCopyOwnership: TCheckBox; cbExcludeEmptyDirectories: TCheckBox; cbReserveSpace: TCheckBox; cmbDirectoryExists: TComboBox; cmbFileExists: TComboBox; cmbSetPropertyError: TComboBox; gbFileTemplate: TGroupBox; grpOptions: TGroupBox; lblSetPropertyError: TLabel; lblTemplateName: TLabel; lblDirectoryExists: TLabel; lblFileExists: TLabel; pnlComboBoxes: TPanel; pnlCheckboxes: TPanel; procedure btnSearchTemplateClick(Sender: TObject); procedure cbCopyAttributesChange(Sender: TObject); procedure cbReserveSpaceChange(Sender: TObject); private FTemplate: TSearchTemplate; procedure SetOperationOptions(CopyOperation: TFileSystemCopyOperation); overload; procedure SetOperationOptions(MoveOperation: TFileSystemMoveOperation); overload; public constructor Create(AOwner: TComponent; AFileSource: IInterface); override; destructor Destroy; override; procedure SaveOptions; override; procedure SetOperationOptions(Operation: TObject); override; end; TFileSystemCopyOperationOptionsUI = class(TFileSystemCopyMoveOperationOptionsUI) public constructor Create(AOwner: TComponent; AFileSource: IInterface); override; end; TFileSystemMoveOperationOptionsUI = class(TFileSystemCopyMoveOperationOptionsUI) end; implementation {$R *.lfm} uses uGlobs, uLng, uFileSourceOperationOptions, DCOSUtils, DCStrUtils, fFindDlg; procedure SetCopyOption(var Options: TCopyAttributesOptions; Option: TCopyAttributesOption; IsSet: Boolean); begin if IsSet then Options := Options + [Option] else Options := Options - [Option]; end; { TFileSystemCopyMoveOperationOptionsUI } procedure TFileSystemCopyMoveOperationOptionsUI.btnSearchTemplateClick(Sender: TObject); begin if ShowUseTemplateDlg(FTemplate) and Assigned(FTemplate) then begin if FTemplate.TemplateName = '' then lblTemplateName.Caption := rsSearchTemplateUnnamed else lblTemplateName.Caption := FTemplate.TemplateName; end; end; procedure TFileSystemCopyMoveOperationOptionsUI.cbCopyAttributesChange(Sender: TObject); begin cbDropReadOnlyFlag.Enabled := cbCopyAttributes.Checked; end; procedure TFileSystemCopyMoveOperationOptionsUI.cbReserveSpaceChange(Sender: TObject); begin if (cbReserveSpace.Checked = False) then cbCheckFreeSpace.Checked := Boolean(cbCheckFreeSpace.Tag) else begin cbCheckFreeSpace.Tag := PtrInt(cbCheckFreeSpace.Checked); cbCheckFreeSpace.Checked := cbReserveSpace.Checked; end; cbCheckFreeSpace.Enabled := not cbReserveSpace.Checked; end; constructor TFileSystemCopyMoveOperationOptionsUI.Create(AOwner: TComponent; AFileSource: IInterface); begin inherited; {$IFDEF MSWINDOWS} cbCopyOwnership.Visible := False; {$ENDIF} ParseLineToList(rsFileOpFileExistsOptions, cmbFileExists.Items); ParseLineToList(rsFileOpDirectoryExistsOptions, cmbDirectoryExists.Items); ParseLineToList(rsFileOpSetPropertyErrorOptions, cmbSetPropertyError.Items); if not gOverwriteFolder then cmbDirectoryExists.Items.Delete(1); // Load default options. case gOperationOptionFileExists of fsoofeNone : cmbFileExists.ItemIndex := 0; fsoofeOverwrite : cmbFileExists.ItemIndex := 1; fsoofeOverwriteOlder: cmbFileExists.ItemIndex := 2; fsoofeSkip : cmbFileExists.ItemIndex := 3; end; if gOverwriteFolder then case gOperationOptionDirectoryExists of fsoodeNone : cmbDirectoryExists.ItemIndex := 0; fsoodeDelete : cmbDirectoryExists.ItemIndex := 1; fsoodeCopyInto : cmbDirectoryExists.ItemIndex := 2; fsoodeSkip : cmbDirectoryExists.ItemIndex := 3; end else case gOperationOptionDirectoryExists of fsoodeNone : cmbDirectoryExists.ItemIndex := 0; fsoodeCopyInto : cmbDirectoryExists.ItemIndex := 1; fsoodeSkip : cmbDirectoryExists.ItemIndex := 2; end; case gOperationOptionSetPropertyError of fsoospeNone : cmbSetPropertyError.ItemIndex := 0; fsoospeDontSet : cmbSetPropertyError.ItemIndex := 1; fsoospeIgnoreErrors : cmbSetPropertyError.ItemIndex := 2; end; cbCopyAttributes.Checked := gOperationOptionCopyAttributes; cbCopyTime.Checked := gOperationOptionCopyTime; cbCopyOwnership.Checked := gOperationOptionCopyOwnership; cbDropReadOnlyFlag.Checked := gDropReadOnlyFlag; case gOperationOptionSymLinks of fsooslFollow : cbFollowLinks.State := cbChecked; fsooslDontFollow : cbFollowLinks.State := cbUnchecked; fsooslNone : cbFollowLinks.State := cbGrayed; end; cbCorrectLinks.Checked := gOperationOptionCorrectLinks; cbReserveSpace.Checked := gOperationOptionReserveSpace; cbCheckFreeSpace.Checked := gOperationOptionCheckFreeSpace; end; destructor TFileSystemCopyMoveOperationOptionsUI.Destroy; begin inherited Destroy; FTemplate.Free; end; procedure TFileSystemCopyMoveOperationOptionsUI.SaveOptions; begin case cmbFileExists.ItemIndex of 0: gOperationOptionFileExists := fsoofeNone; 1: gOperationOptionFileExists := fsoofeOverwrite; 2: gOperationOptionFileExists := fsoofeOverwriteOlder; 3: gOperationOptionFileExists := fsoofeSkip; end; if gOverwriteFolder then case cmbDirectoryExists.ItemIndex of 0: gOperationOptionDirectoryExists := fsoodeNone; 1: gOperationOptionDirectoryExists := fsoodeDelete; 2: gOperationOptionDirectoryExists := fsoodeCopyInto; 3: gOperationOptionDirectoryExists := fsoodeSkip; end else case cmbDirectoryExists.ItemIndex of 0: gOperationOptionDirectoryExists := fsoodeNone; 1: gOperationOptionDirectoryExists := fsoodeCopyInto; 2: gOperationOptionDirectoryExists := fsoodeSkip; end; case cmbSetPropertyError.ItemIndex of 0: gOperationOptionSetPropertyError := fsoospeNone; 1: gOperationOptionSetPropertyError := fsoospeDontSet; 2: gOperationOptionSetPropertyError := fsoospeIgnoreErrors; end; gOperationOptionCopyAttributes := cbCopyAttributes.Checked; gOperationOptionCopyTime := cbCopyTime.Checked; gOperationOptionCopyOwnership := cbCopyOwnership.Checked; gDropReadOnlyFlag := cbDropReadOnlyFlag.Checked; case cbFollowLinks.State of cbChecked : gOperationOptionSymLinks := fsooslFollow; cbUnchecked : gOperationOptionSymLinks := fsooslDontFollow; cbGrayed : gOperationOptionSymLinks := fsooslNone; end; gOperationOptionCorrectLinks := cbCorrectLinks.Checked; gOperationOptionReserveSpace := cbReserveSpace.Checked; gOperationOptionCheckFreeSpace := cbCheckFreeSpace.Checked; end; procedure TFileSystemCopyMoveOperationOptionsUI.SetOperationOptions(Operation: TObject); begin if Operation is TFileSystemCopyOperation then SetOperationOptions(Operation as TFileSystemCopyOperation) else if Operation is TFileSystemMoveOperation then SetOperationOptions(Operation as TFileSystemMoveOperation); end; procedure TFileSystemCopyMoveOperationOptionsUI.SetOperationOptions(CopyOperation: TFileSystemCopyOperation); var Options: TCopyAttributesOptions; begin with CopyOperation do begin case cmbFileExists.ItemIndex of 0: FileExistsOption := fsoofeNone; 1: FileExistsOption := fsoofeOverwrite; 2: FileExistsOption := fsoofeOverwriteOlder; 3: FileExistsOption := fsoofeSkip; end; if gOverwriteFolder then case cmbDirectoryExists.ItemIndex of 0: DirExistsOption := fsoodeNone; 1: DirExistsOption := fsoodeDelete; 2: DirExistsOption := fsoodeCopyInto; 3: DirExistsOption := fsoodeSkip; end else case cmbDirectoryExists.ItemIndex of 0: DirExistsOption := fsoodeNone; 1: DirExistsOption := fsoodeCopyInto; 2: DirExistsOption := fsoodeSkip; end; case cmbSetPropertyError.ItemIndex of 0: SetPropertyError := fsoospeNone; 1: SetPropertyError := fsoospeDontSet; 2: SetPropertyError := fsoospeIgnoreErrors; end; case cbFollowLinks.State of cbChecked : SymLinkOption := fsooslFollow; cbUnchecked: SymLinkOption := fsooslDontFollow; cbGrayed : SymLinkOption := fsooslNone; end; Options := CopyAttributesOptions; SetCopyOption(Options, caoCopyAttributes, cbCopyAttributes.Checked); SetCopyOption(Options, caoCopyTime, cbCopyTime.Checked); SetCopyOption(Options, caoCopyOwnership, cbCopyOwnership.Checked); SetCopyOption(Options, caoRemoveReadOnlyAttr, cbDropReadOnlyFlag.Checked); CopyAttributesOptions := Options; CorrectSymLinks := cbCorrectLinks.Checked; CheckFreeSpace := cbCheckFreeSpace.Checked; ReserveSpace := cbReserveSpace.Checked; if Assigned(FTemplate) then begin SearchTemplate := FTemplate; FTemplate := nil; end; ExcludeEmptyTemplateDirectories := cbExcludeEmptyDirectories.Checked; end; end; procedure TFileSystemCopyMoveOperationOptionsUI.SetOperationOptions(MoveOperation: TFileSystemMoveOperation); var Options: TCopyAttributesOptions; begin with MoveOperation do begin case cmbFileExists.ItemIndex of 0: FileExistsOption := fsoofeNone; 1: FileExistsOption := fsoofeOverwrite; 2: FileExistsOption := fsoofeOverwriteOlder; 3: FileExistsOption := fsoofeSkip; end; if gOverwriteFolder then case cmbDirectoryExists.ItemIndex of 0: DirExistsOption := fsoodeNone; 1: DirExistsOption := fsoodeDelete; 2: DirExistsOption := fsoodeCopyInto; 3: DirExistsOption := fsoodeSkip; end else case cmbDirectoryExists.ItemIndex of 0: DirExistsOption := fsoodeNone; 1: DirExistsOption := fsoodeCopyInto; 2: DirExistsOption := fsoodeSkip; end; case cmbSetPropertyError.ItemIndex of 0: SetPropertyError := fsoospeNone; 1: SetPropertyError := fsoospeDontSet; 2: SetPropertyError := fsoospeIgnoreErrors; end; CorrectSymLinks := cbCorrectLinks.Checked; CheckFreeSpace := cbCheckFreeSpace.Checked; ReserveSpace := cbReserveSpace.Checked; Options := CopyAttributesOptions; SetCopyOption(Options, caoCopyAttributes, cbCopyAttributes.Checked); SetCopyOption(Options, caoCopyTime, cbCopyTime.Checked); SetCopyOption(Options, caoCopyOwnership, cbCopyOwnership.Checked); CopyAttributesOptions := Options; if Assigned(FTemplate) then begin SearchTemplate := FTemplate; FTemplate := nil; end; ExcludeEmptyTemplateDirectories := cbExcludeEmptyDirectories.Checked; end; end; { TFileSystemCopyOperationOptionsUI } constructor TFileSystemCopyOperationOptionsUI.Create(AOwner: TComponent; AFileSource: IInterface); begin inherited; cbDropReadOnlyFlag.Visible := True; cbFollowLinks.Visible := True; end; end. doublecmd-0.5.8/src/filesources/filesystem/ffilesystemcopymoveoperationoptions.lfm0000644000175000017500000002423112023046500030147 0ustar alexxalexxinherited FileSystemCopyMoveOperationOptionsUI: TFileSystemCopyMoveOperationOptionsUI Height = 198 Width = 542 AutoSize = True BorderSpacing.Around = 6 ClientHeight = 198 ClientWidth = 542 TabOrder = 0 DesignLeft = 110 DesignTop = 239 object pnlComboBoxes: TPanel[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = pnlCheckboxes Left = 0 Height = 90 Top = 0 Width = 377 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Right = 10 BevelOuter = bvNone ChildSizing.TopBottomSpacing = 5 ChildSizing.HorizontalSpacing = 5 ChildSizing.VerticalSpacing = 10 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 90 ClientWidth = 377 TabOrder = 0 object lblFileExists: TLabel Left = 0 Height = 18 Top = 5 Width = 173 BorderSpacing.CellAlignVertical = ccaCenter Caption = 'When &file exists' FocusControl = cmbFileExists ParentColor = False end object cmbFileExists: TComboBox AnchorSideLeft.Control = lblFileExists AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblFileExists AnchorSideTop.Side = asrCenter AnchorSideRight.Control = pnlComboBoxes AnchorSideRight.Side = asrBottom Left = 178 Height = 30 Top = -1 Width = 199 Anchors = [akTop, akLeft, akRight] ItemHeight = 0 Style = csDropDownList TabOrder = 0 end object lblDirectoryExists: TLabel Left = 0 Height = 18 Top = 33 Width = 173 BorderSpacing.CellAlignVertical = ccaCenter Caption = 'When dir&ectory exists' FocusControl = cmbDirectoryExists ParentColor = False end object cmbDirectoryExists: TComboBox AnchorSideLeft.Control = lblDirectoryExists AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblDirectoryExists AnchorSideTop.Side = asrCenter AnchorSideRight.Control = pnlComboBoxes AnchorSideRight.Side = asrBottom Left = 178 Height = 30 Top = 27 Width = 199 Anchors = [akTop, akLeft, akRight] ItemHeight = 0 Style = csDropDownList TabOrder = 1 end object lblSetPropertyError: TLabel Left = 0 Height = 18 Top = 61 Width = 173 BorderSpacing.CellAlignVertical = ccaCenter Caption = 'When ca&nnot set property' FocusControl = cmbSetPropertyError ParentColor = False end object cmbSetPropertyError: TComboBox AnchorSideLeft.Control = lblSetPropertyError AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblSetPropertyError AnchorSideTop.Side = asrCenter AnchorSideRight.Control = pnlComboBoxes AnchorSideRight.Side = asrBottom Left = 178 Height = 30 Hint = 'What to do when cannot set file time, attributes, etc.' Top = 55 Width = 199 Anchors = [akTop, akLeft, akRight] ItemHeight = 0 ParentShowHint = False ShowHint = True Style = csDropDownList TabOrder = 2 end end object pnlCheckboxes: TPanel[1] AnchorSideTop.Control = pnlComboBoxes AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 387 Height = 184 Top = 0 Width = 155 Anchors = [akTop, akRight] AutoSize = True BevelOuter = bvNone BevelWidth = 8 ClientHeight = 184 ClientWidth = 155 TabOrder = 2 object cbCheckFreeSpace: TCheckBox AnchorSideLeft.Control = pnlCheckboxes AnchorSideTop.Control = pnlCheckboxes Left = 0 Height = 23 Top = 0 Width = 134 Caption = 'C&heck free space' TabOrder = 0 end object cbFollowLinks: TCheckBox AnchorSideLeft.Control = pnlCheckboxes AnchorSideTop.Control = cbReserveSpace AnchorSideTop.Side = asrBottom Left = 0 Height = 23 Top = 46 Width = 102 AllowGrayed = True Caption = 'Fo&llow links' TabOrder = 2 Visible = False end object cbCorrectLinks: TCheckBox AnchorSideLeft.Control = cbFollowLinks AnchorSideTop.Control = cbFollowLinks AnchorSideTop.Side = asrBottom Left = 0 Height = 23 Top = 69 Width = 107 Caption = 'Correct lin&ks' TabOrder = 3 end object cbCopyAttributes: TCheckBox AnchorSideLeft.Control = cbCorrectLinks AnchorSideTop.Control = cbCorrectLinks AnchorSideTop.Side = asrBottom Left = 0 Height = 23 Top = 92 Width = 124 Caption = 'Cop&y attributes' OnChange = cbCopyAttributesChange TabOrder = 4 end object cbDropReadOnlyFlag: TCheckBox AnchorSideLeft.Control = cbCopyAttributes AnchorSideTop.Control = cbCopyAttributes AnchorSideTop.Side = asrBottom Left = 10 Height = 23 Top = 115 Width = 145 BorderSpacing.Left = 10 Caption = 'Drop readonly fla&g' TabOrder = 5 Visible = False end object cbCopyTime: TCheckBox AnchorSideLeft.Control = cbCopyAttributes AnchorSideTop.Control = cbDropReadOnlyFlag AnchorSideTop.Side = asrBottom Left = 0 Height = 23 Top = 138 Width = 121 Caption = 'Copy d&ate/time' TabOrder = 6 end object cbCopyOwnership: TCheckBox AnchorSideLeft.Control = cbCopyTime AnchorSideTop.Control = cbCopyTime AnchorSideTop.Side = asrBottom Left = 0 Height = 23 Top = 161 Width = 127 Caption = 'Copy o&wnership' TabOrder = 7 end object cbReserveSpace: TCheckBox AnchorSideLeft.Control = pnlCheckboxes AnchorSideTop.Control = cbCheckFreeSpace AnchorSideTop.Side = asrBottom Left = 0 Height = 23 Top = 23 Width = 116 Caption = '&Reserve space' OnChange = cbReserveSpaceChange TabOrder = 1 end end object gbFileTemplate: TGroupBox[2] AnchorSideLeft.Control = Owner AnchorSideTop.Control = pnlComboBoxes AnchorSideTop.Side = asrBottom AnchorSideRight.Control = pnlComboBoxes AnchorSideRight.Side = asrBottom Left = 0 Height = 83 Top = 90 Width = 377 Anchors = [akTop, akLeft, akRight] AutoSize = True Caption = 'Use file template' ClientHeight = 60 ClientWidth = 373 TabOrder = 1 object btnSearchTemplate: TBitBtn AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = gbFileTemplate AnchorSideRight.Control = gbFileTemplate AnchorSideRight.Side = asrBottom Left = 336 Height = 32 Hint = 'Choose template...' Top = 0 Width = 32 Anchors = [akTop, akRight] BorderSpacing.Right = 5 Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000009700 00FF000000000000000000000000000000FF00000000000000FFC2B5B3E30000 00FF000000000000000000000000000000000000000000000000000000000000 0000970000FF00000000000000000000000000000000C5B8B570E3DBD9FF8975 7375000000000000000000000000000000000000000000000000000000000000 000000000000970000FF000000000000000000000000C2B4B26FE1D9D7FF8571 6E75000000000000000000000000000000000000000000000000000000000000 0000970000FF00000000000000000000000000000000B3A4A26FD6C9C7FF705E 5B75000000000000000000000000000000000000000000000000000000009700 00FF0000000000000000000000000000000000000000A798967DD9CBCAFF7362 6184000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000005B494812D4C6C5FFD1C2C1FE8F7E 7DFF5B4B4E160000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000C2B3B3C0EEE2E2FED5C8C7FFD6C9 C8FE746363C60000000000000000000000000000000000000000000000000000 00000000000000000000000000009D8B8B5CF9EEEFFFEDE1E0FFDED1D1FFEADE DCFFB1A1A0FF645455630000000000000000000000000000000000000000D2C6 C36CEEE5E2C3BEADABB100000002D2C4C3FBFDF5F4FEE0D4D3FFDACCCBFFE8DD DBFFD2C4C2FE796868FD61525509000000000000000000000000000000008B78 754B00000000000000007C6B6BFCF7ECECFFFEF6F4FFCFC2C0FFD4C7C7FFEDE3 E1FFCDBDBBFF998887FE605151BC00000000000000000000000000000000806F 6D350000000062514F4CCEBEBEFFFBF2F0FFFBF6F5FFC7B9B7FFD0C3C3FFF8F0 EFFFC7B7B4FFA69593FF665555FF5545464D000000000000000000000000D8CF CE59D1C5C299978484FFF4EBEBFEFEFDFDFFF4EEEDFFC3B5B3FFD8CBC9FFFFFC FCFFD8CBC9FFB2A1A0FF867474FE524343FA0000000200000000000000000000 00007767669CE0D3D1FFFFFEFEFFFFFFFFFFEFE7E6FFAF9E9BFFD6C6C4FFFCF7 F7FFD8CACAFFAE9D9EFF827173FF5B4A4EFF67595C9F00000000000000000000 00008E7F7ED8E2D7D6FFCCC2C2FFCDC6C6FFD0C9C9FFD7D1D2FFD6D1D2FFCEC6 C6FFCBC5C5FFC7C0C0FFC2B8B8FFA39698FF726468DC00000000000000000000 0000ACA2A3DEAC9C99FFC9BCBBFFDBCDCAFFF3E6E2FEFFFFFEFFF5EEECFFB9A7 A3FFF3EDEBFEF7F3F3FFA99998FFA49695FFB1A6A7E700000000000000000000 0000000000005F5054459C919391B7ADAFB4BBB2B2C3C0B5B6CFC0B6B7D2BBB2 B3D0BCB2B3C3BBB3B4B59D929592615156460000000000000000 } OnClick = btnSearchTemplateClick ParentShowHint = False ShowHint = True TabOrder = 0 end object lblTemplateName: TLabel AnchorSideLeft.Control = gbFileTemplate AnchorSideTop.Control = btnSearchTemplate AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnSearchTemplate Left = 5 Height = 18 Top = 7 Width = 321 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 5 BorderSpacing.Right = 10 Caption = '' ParentColor = False end object cbExcludeEmptyDirectories: TCheckBox AnchorSideLeft.Control = gbFileTemplate AnchorSideTop.Control = btnSearchTemplate AnchorSideTop.Side = asrBottom Left = 5 Height = 23 Top = 37 Width = 192 BorderSpacing.Left = 5 BorderSpacing.Top = 5 BorderSpacing.Right = 5 Caption = 'E&xclude empty directories' Checked = True State = cbChecked TabOrder = 1 end end end doublecmd-0.5.8/src/filesources/filesystem/ufilesystemsplitoperation.pas0000644000175000017500000002277511747211345026101 0ustar alexxalexxunit uFileSystemSplitOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceSplitOperation, uFileSource, uFileSourceOperationUI, uFile, uGlobs, uLog, DCClassesUtf8; type { TFileSystemSplitOperation } TFileSystemSplitOperation = class(TFileSourceSplitOperation) private FStatistics: TFileSourceSplitOperationStatistics; // local copy of statistics FTargetFile: UTF8String; FBuffer: Pointer; FBufferSize: LongWord; FCheckFreeSpace: Boolean; protected function Split(aSourceFileStream: TFileStreamEx; TargetFile: UTF8String): Boolean; procedure ShowError(sMessage: String); procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); public constructor Create(aFileSource: IFileSource; var aSourceFile: TFile; aTargetPath: String); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; end; implementation uses uOSUtils, DCOSUtils, uLng, LCLProc; constructor TFileSystemSplitOperation.Create(aFileSource: IFileSource; var aSourceFile: TFile; aTargetPath: String); begin FCheckFreeSpace := True; FTargetFile := IncludeTrailingPathDelimiter(aTargetPath) + aSourceFile.Name; FBufferSize := gCopyBlockSize; GetMem(FBuffer, FBufferSize); inherited Create(aFileSource, aSourceFile, aTargetPath); end; destructor TFileSystemSplitOperation.Destroy; begin inherited Destroy; if Assigned(FBuffer) then begin FreeMem(FBuffer); FBuffer := nil; end; end; procedure TFileSystemSplitOperation.Initialize; begin // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; with FStatistics do begin CurrentFileFrom:= SourceFile.FullPath; TotalFiles:= VolumeNumber; TotalBytes:= SourceFile.Size; end; end; procedure TFileSystemSplitOperation.MainExecute; var iExt, CurrentFileIndex: Integer; iTotalDiskSize, iFreeDiskSize: Int64; SourceFileStream: TFileStreamEx = nil; TargetFile: UTF8String; begin try { Check disk free space } if FCheckFreeSpace = True then begin GetDiskFreeSpace(TargetPath, iFreeDiskSize, iTotalDiskSize); if FStatistics.TotalBytes > iFreeDiskSize then begin AskQuestion('', rsMsgNoFreeSpaceCont, [fsourAbort], fsourAbort, fsourAbort); RaiseAbortOperation; end; end; // Open source file SourceFileStream := TFileStreamEx.Create(SourceFile.FullPath, fmOpenRead or fmShareDenyNone); try // Calculate extension length iExt:= 2; // Minimum length 3 symbols CurrentFileIndex:= FStatistics.TotalFiles; while CurrentFileIndex >= 1 do begin CurrentFileIndex:= CurrentFileIndex div 1000; Inc(iExt); end; for CurrentFileIndex := 1 to FStatistics.TotalFiles do begin TargetFile:= FTargetFile + ExtensionSeparator + Format('%.*d',[iExt, CurrentFileIndex]); with FStatistics do begin // Last file can be smaller then volume size if (TotalBytes - DoneBytes) < VolumeSize then VolumeSize:= TotalBytes - DoneBytes; CurrentFileTo := TargetFile; CurrentFileTotalBytes := VolumeSize; CurrentFileDoneBytes := 0; end; UpdateStatistics(FStatistics); // Split with current file if not Split(SourceFileStream, TargetFile) then Break; with FStatistics do begin DoneFiles := DoneFiles + 1; UpdateStatistics(FStatistics); end; CheckOperationState; end; finally if Assigned(SourceFileStream) then begin FreeAndNil(SourceFileStream); if (FStatistics.DoneBytes <> FStatistics.TotalBytes) then begin for CurrentFileIndex := 1 to FStatistics.TotalFiles do // There was some error, because not all files has been created. // Delete the not completed target files. mbDeleteFile(FTargetFile + ExtensionSeparator + Format('%.*d',[iExt, CurrentFileIndex])); end; end; end; except on EFOpenError do begin ShowError(rsMsgLogError + rsMsgErrEOpen + ': ' + SourceFile.FullPath); end; end; end; procedure TFileSystemSplitOperation.Finalize; begin end; function TFileSystemSplitOperation.Split(aSourceFileStream: TFileStreamEx; TargetFile: UTF8String): Boolean; var TargetFileStream: TFileStreamEx = nil; // for safety exception handling iTotalDiskSize, iFreeDiskSize: Int64; bRetryRead, bRetryWrite: Boolean; BytesRead, BytesToRead, BytesWrittenTry, BytesWritten: Int64; TotalBytesToRead: Int64 = 0; begin Result := False; BytesToRead := FBufferSize; try try TargetFileStream := TFileStreamEx.Create(TargetFile, fmCreate); TotalBytesToRead := VolumeSize; while TotalBytesToRead > 0 do begin // Without the following line the reading is very slow // if it tries to read past end of file. if TotalBytesToRead < BytesToRead then BytesToRead := TotalBytesToRead; repeat try bRetryRead := False; BytesRead := aSourceFileStream.Read(FBuffer^, BytesToRead); if (BytesRead = 0) then Raise EReadError.Create(mbSysErrorMessage(GetLastOSError)); TotalBytesToRead := TotalBytesToRead - BytesRead; BytesWritten := 0; repeat try bRetryWrite := False; BytesWrittenTry := TargetFileStream.Write((FBuffer + BytesWritten)^, BytesRead); BytesWritten := BytesWritten + BytesWrittenTry; if BytesWrittenTry = 0 then begin Raise EWriteError.Create(mbSysErrorMessage(GetLastOSError)); end else if BytesWritten < BytesRead then begin bRetryWrite := True; // repeat and try to write the rest end; except on E: EWriteError do begin { Check disk free space } GetDiskFreeSpace(TargetPath, iFreeDiskSize, iTotalDiskSize); if BytesRead > iFreeDiskSize then begin case AskQuestion(rsMsgNoFreeSpaceRetry, '', [fsourYes, fsourNo], fsourYes, fsourNo) of fsourYes: bRetryWrite := True; fsourNo: RaiseAbortOperation; end; // case end else begin case AskQuestion(rsMsgErrEWrite + ' ' + TargetFile + ':', E.Message, [fsourRetry, fsourSkip, fsourAbort], fsourRetry, fsourSkip) of fsourRetry: bRetryWrite := True; fsourAbort: RaiseAbortOperation; fsourSkip: Exit; end; // case end; end; // on do end; // except until not bRetryWrite; except on E: EReadError do begin case AskQuestion(rsMsgErrERead + ' ' + SourceFile.FullPath + ':', E.Message, [fsourRetry, fsourSkip, fsourAbort], fsourRetry, fsourSkip) of fsourRetry: bRetryRead := True; fsourAbort: RaiseAbortOperation; fsourSkip: Exit; end; // case end; end; until not bRetryRead; with FStatistics do begin CurrentFileDoneBytes := CurrentFileDoneBytes + BytesRead; DoneBytes := DoneBytes + BytesRead; UpdateStatistics(FStatistics); end; CheckOperationState; // check pause and stop end; //while finally if Assigned(TargetFileStream) then FreeAndNil(TargetFileStream); end; Result:= True; except on EFCreateError do begin ShowError(rsMsgLogError + rsMsgErrECreate + ': ' + TargetFile); end; on EWriteError do begin ShowError(rsMsgLogError + rsMsgErrEWrite + ': ' + TargetFile); end; end; end; procedure TFileSystemSplitOperation.ShowError(sMessage: String); begin if gSkipFileOpError then logWrite(Thread, sMessage, lmtError, True) else begin AskQuestion(sMessage, '', [fsourAbort], fsourAbort, fsourAbort); RaiseAbortOperation; end; end; procedure TFileSystemSplitOperation.LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); begin case logMsgType of lmtError: if not (log_errors in gLogOptions) then Exit; lmtInfo: if not (log_info in gLogOptions) then Exit; lmtSuccess: if not (log_success in gLogOptions) then Exit; end; if logOptions <= gLogOptions then begin logWrite(Thread, sMessage, logMsgType); end; end; end. doublecmd-0.5.8/src/filesources/filesystem/ufilesystemlistoperation.pas0000644000175000017500000000275211753503774025721 0ustar alexxalexxunit uFileSystemListOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceListOperation, uFileSource ; type TFileSystemListOperation = class(TFileSourceListOperation) public constructor Create(aFileSource: IFileSource; aPath: String); override; procedure MainExecute; override; end; implementation uses uFile, uFindEx, uOSUtils, uFileSystemFileSource; constructor TFileSystemListOperation.Create(aFileSource: IFileSource; aPath: String); begin FFiles := TFiles.Create(aPath); inherited Create(aFileSource, aPath); end; procedure TFileSystemListOperation.MainExecute; var AFile: TFile; sr: TSearchRecEx; IsRootPath, Found: Boolean; begin FFiles.Clear; IsRootPath := FileSource.IsPathAtRoot(Path); Found := FindFirstEx(FFiles.Path + '*', faAnyFile, sr) = 0; try if not Found then begin { No files have been found. } if not IsRootPath then begin AFile := TFileSystemFileSource.CreateFile(Path); AFile.Name := '..'; AFile.Attributes := faFolder; FFiles.Add(AFile); end; end else begin repeat CheckOperationState; if sr.Name='.' then Continue; // Don't include '..' in the root directory. if (sr.Name='..') and IsRootPath then Continue; AFile := TFileSystemFileSource.CreateFile(Path, @sr); FFiles.Add(AFile); until FindNextEx(sr)<>0; end; finally FindCloseEx(sr); end; end; end. doublecmd-0.5.8/src/filesources/filesystem/ufilesystemcalcstatisticsoperation.pas0000644000175000017500000001162711747211345027755 0ustar alexxalexxunit uFileSystemCalcStatisticsOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceCalcStatisticsOperation, uFileSource, uFileSourceOperationUI, uFile, uGlobs, uLog; type TFileSystemCalcStatisticsOperation = class(TFileSourceCalcStatisticsOperation) private FStatistics: TFileSourceCalcStatisticsOperationStatistics; // local copy of statistics procedure ProcessFile(aFile: TFile); procedure ProcessLink(aFile: TFile); procedure ProcessSubDirs(const srcPath: String); procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); public constructor Create(aTargetFileSource: IFileSource; var theFiles: TFiles); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; end; implementation uses uFileSourceOperationOptions, uOSUtils, uLng, uFindEx, uFileSystemFileSource; constructor TFileSystemCalcStatisticsOperation.Create( aTargetFileSource: IFileSource; var theFiles: TFiles); begin inherited Create(aTargetFileSource, theFiles); end; destructor TFileSystemCalcStatisticsOperation.Destroy; begin inherited Destroy; end; procedure TFileSystemCalcStatisticsOperation.Initialize; begin // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; end; procedure TFileSystemCalcStatisticsOperation.MainExecute; var CurrentFileIndex: Integer; begin for CurrentFileIndex := 0 to Files.Count - 1 do begin ProcessFile(Files[CurrentFileIndex]); CheckOperationState; end; end; procedure TFileSystemCalcStatisticsOperation.ProcessFile(aFile: TFile); begin FStatistics.CurrentFile := aFile.Path + aFile.Name; UpdateStatistics(FStatistics); if aFile.IsDirectory then begin Inc(FStatistics.Directories); ProcessSubDirs(aFile.Path + aFile.Name + DirectorySeparator); end else if aFile.IsLink then begin Inc(FStatistics.Links); case FSymLinkOption of fsooslFollow: ProcessLink(aFile); fsooslDontFollow: ; // do nothing fsooslNone: begin case AskQuestion('', Format(rsMsgFollowSymlink, [aFile.Name]), [fsourYes, fsourAll, fsourNo, fsourSkipAll], fsourYes, fsourNo) of fsourYes: ProcessLink(aFile); fsourAll: begin FSymLinkOption := fsooslFollow; ProcessLink(aFile); end; fsourNo: ; // do nothing fsourSkipAll: FSymLinkOption := fsooslDontFollow; end; end; end; end else begin // Not always this will be regular file (on Unix can be socket, FIFO, block, char, etc.) // Maybe check with: FPS_ISREG() on Unix? Inc(FStatistics.Files); FStatistics.Size := FStatistics.Size + aFile.Size; if aFile.ModificationTime < FStatistics.OldestFile then FStatistics.OldestFile := aFile.ModificationTime; if aFile.ModificationTime > FStatistics.NewestFile then FStatistics.NewestFile := aFile.ModificationTime; end; UpdateStatistics(FStatistics); end; procedure TFileSystemCalcStatisticsOperation.ProcessLink(aFile: TFile); var PathToFile: String; aLinkFile: TFile = nil; begin PathToFile := mbReadAllLinks(aFile.FullPath); if PathToFile <> '' then begin try aLinkFile := TFileSystemFileSource.CreateFileFromFile(PathToFile); try ProcessFile(aLinkFile); finally FreeAndNil(aLinkFile); end; except on EFileNotFound do begin LogMessage(rsMsgErrInvalidLink + ': ' + aFile.FullPath + ' -> ' + PathToFile, [log_errors], lmtError); end; end; end else begin LogMessage(rsMsgErrInvalidLink + ': ' + aFile.FullPath + ' -> ' + PathToFile, [log_errors], lmtError); end; end; procedure TFileSystemCalcStatisticsOperation.ProcessSubDirs(const srcPath: String); var sr: TSearchRecEx; aFile: TFile; FindResult: Longint; begin FindResult := FindFirstEx(srcPath + '*', faAnyFile, sr); try if FindResult = 0 then repeat if (sr.Name='.') or (sr.Name='..') then Continue; aFile := TFileSystemFileSource.CreateFile(srcPath, @sr); try ProcessFile(aFile); finally FreeAndNil(aFile); end; CheckOperationState; until FindNextEx(sr) <> 0; finally FindCloseEx(sr); end; end; procedure TFileSystemCalcStatisticsOperation.LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); begin case logMsgType of lmtError: if not (log_errors in gLogOptions) then Exit; lmtInfo: if not (log_info in gLogOptions) then Exit; lmtSuccess: if not (log_success in gLogOptions) then Exit; end; if logOptions <= gLogOptions then begin logWrite(Thread, sMessage, logMsgType); end; end; end. doublecmd-0.5.8/src/filesources/filesystem/ufilesystemfilesource.pas0000644000175000017500000007154012205645056025157 0ustar alexxalexxunit uFileSystemFileSource; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceOperation, uFileSourceOperationTypes, uLocalFileSource, uFileSource, uFileSourceProperty, uFileProperty, uFile, uDescr, DCBasicTypes, DCStrUtils, uFindEx ; type {en Real file system. } IFileSystemFileSource = interface(ILocalFileSource) ['{59EDCF45-F151-4AE2-9DCE-3586E6191496}'] end; { TFileSystemFileSource } TFileSystemFileSource = class(TLocalFileSource, IFileSystemFileSource) private FDescr: TDescription; protected function GetCurrentWorkingDirectory: String; override; function SetCurrentWorkingDirectory(NewDir: String): Boolean; override; public constructor Create; override; destructor Destroy; override; class function CreateFile(const APath: String): TFile; override; class function CreateFile(const APath: String; pSearchRecord: PSearchRecEx): TFile; overload; {en Creates a file object using an existing file/directory as a template. All the properties will reflect the existing file. @param(FilePath denotes absolute path to a file to use as a template.) } class function CreateFileFromFile(const aFilePath: String): TFile; {en Creates file list from a list of template files. @param(APath Path to which the files names are relative.) @param(FileNamesList A list of absolute paths to files.) @param(OmitNotExisting If @true then silently omits not existing files. If @false an exception is raised when file not exists.) } class function CreateFilesFromFileList(const APath: String; const FileNamesList: TStringList; OmitNotExisting: Boolean = False): TFiles; procedure RetrieveProperties(AFile: TFile; PropertiesToSet: TFilePropertiesTypes); override; class function GetFileSource: IFileSystemFileSource; function GetSupportedFileProperties: TFilePropertiesTypes; override; function GetRetrievableFileProperties: TFilePropertiesTypes; override; function GetOperationsTypes: TFileSourceOperationTypes; override; function GetProperties: TFileSourceProperties; override; function IsPathAtRoot(Path: String): Boolean; override; function GetRootDir(sPath: String): String; override; overload; function GetRootDir: String; override; overload; function GetPathType(sPath : String): TPathType; override; function GetFreeSpace(Path: String; out FreeSize, TotalSize : Int64) : Boolean; override; function CreateListOperation(TargetPath: String): TFileSourceOperation; override; function CreateCopyOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; override; function CreateCopyInOperation(SourceFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; override; function CreateCopyOutOperation(TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; override; function CreateMoveOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; override; function CreateDeleteOperation(var FilesToDelete: TFiles): TFileSourceOperation; override; function CreateWipeOperation(var FilesToWipe: TFiles): TFileSourceOperation; override; function CreateSplitOperation(var aSourceFile: TFile; aTargetPath: String): TFileSourceOperation; override; function CreateCombineOperation(var SourceFiles: TFiles; aTargetFile: String): TFileSourceOperation; override; function CreateCreateDirectoryOperation(BasePath: String; DirectoryPath: String): TFileSourceOperation; override; function CreateExecuteOperation(var ExecutableFile: TFile; BasePath, Verb: String): TFileSourceOperation; override; function CreateCalcChecksumOperation(var theFiles: TFiles; aTargetPath: String; aTargetMask: String): TFileSourceOperation; override; function CreateCalcStatisticsOperation(var theFiles: TFiles): TFileSourceOperation; override; function CreateSetFilePropertyOperation(var theTargetFiles: TFiles; var theNewProperties: TFileProperties): TFileSourceOperation; override; // ------------------------------------------------------ end; { TFileSystemFileSourceConnection } TFileSystemFileSourceConnection = class(TFileSourceConnection) protected procedure SetCurrentPath(NewPath: String); override; end; implementation uses uOSUtils, DCOSUtils, DCDateTimeUtils, uGlobs, {$IFDEF MSWINDOWS} uMyWindows, Windows, {$ENDIF} {$IFDEF UNIX} BaseUnix, uUsersGroups, FileUtil, uMyUnix, {$ENDIF} uFileSystemListOperation, uFileSystemCopyOperation, uFileSystemMoveOperation, uFileSystemDeleteOperation, uFileSystemWipeOperation, uFileSystemSplitOperation, uFileSystemCombineOperation, uFileSystemCreateDirectoryOperation, uFileSystemExecuteOperation, uFileSystemCalcChecksumOperation, uFileSystemCalcStatisticsOperation, uFileSystemSetFilePropertyOperation; {$IF DEFINED(MSWINDOWS)} procedure SetOwner(AFile: TFile); var sUser, sGroup: String; begin with AFile do begin OwnerProperty := TFileOwnerProperty.Create; if GetFileOwner(FullPath, sUser, sGroup) then begin OwnerProperty.OwnerStr := sUser; OwnerProperty.GroupStr := sGroup; end; end; end; procedure FillFromFindData( AFile: TFile; AFilePath: String; pFindData: PWIN32FINDDATAW); var LinkAttrs: TFileAttrs; begin with AFile do begin AttributesProperty := TNtfsFileAttributesProperty.Create( pFindData^.dwFileAttributes); SizeProperty := TFileSizeProperty.Create( QWord(pFindData^.nFileSizeHigh) shl 32 + pFindData^.nFileSizeLow); ModificationTimeProperty := TFileModificationDateTimeProperty.Create( WinFileTimeToDateTime(pFindData^.ftLastWriteTime)); CreationTimeProperty := TFileCreationDateTimeProperty.Create( WinFileTimeToDateTime(pFindData^.ftCreationTime)); LastAccessTimeProperty := TFileLastAccessDateTimeProperty.Create( WinFileTimeToDateTime(pFindData^.ftLastAccessTime)); LinkProperty := TFileLinkProperty.Create; if fpS_ISLNK(pFindData^.dwFileAttributes) then begin LinkAttrs := mbFileGetAttrNoLinks(AFilePath); LinkProperty.LinkTo := ReadSymLink(AFilePath); LinkProperty.IsValid := LinkAttrs <> faInvalidAttributes; if LinkProperty.IsValid then LinkProperty.IsLinkToDirectory := fpS_ISDIR(LinkAttrs) else // On Windows links to directories are marked with Directory flag on the link. LinkProperty.IsLinkToDirectory := fpS_ISDIR(pFindData^.dwFileAttributes); end; end; end; {$ELSEIF DEFINED(UNIX)} procedure FillFromStat( AFile: TFile; AFilePath: String; pStatInfo: BaseUnix.PStat); var LinkStatInfo: BaseUnix.Stat; begin with AFile do begin AttributesProperty := TUnixFileAttributesProperty.Create(pStatInfo^.st_mode); if fpS_ISDIR(pStatInfo^.st_mode) then // On Unix a size for directory entry on filesystem is returned in StatInfo. // We don't want to use it. SizeProperty := TFileSizeProperty.Create(0) else SizeProperty := TFileSizeProperty.Create(Int64(pStatInfo^.st_size)); ModificationTimeProperty := TFileModificationDateTimeProperty.Create( FileTimeToDateTime(pStatInfo^.st_mtime)); CreationTimeProperty := TFileCreationDateTimeProperty.Create( FileTimeToDateTime(pStatInfo^.st_ctime)); LastAccessTimeProperty := TFileLastAccessDateTimeProperty.Create( FileTimeToDateTime(pStatInfo^.st_atime)); LinkProperty := TFileLinkProperty.Create; if fpS_ISLNK(pStatInfo^.st_mode) then begin LinkProperty.LinkTo := ReadSymLink(AFilePath); // Stat (as opposed to Lstat) will take info of the file that the link points to (recursively). LinkProperty.IsValid := fpStat(PChar(UTF8ToSys(AFilePath)), LinkStatInfo) = 0; if LinkProperty.IsValid then begin LinkProperty.IsLinkToDirectory := FPS_ISDIR(LinkStatInfo.st_mode); end; end; end; end; {$ELSE} procedure FillFromSearchRecord( AFile: TFile; AFilePath: String; pSearchRecord: PSearchRecEx; PropertiesToSet: TFilePropertiesTypes = []); begin with AFile do begin AttributesProperty := TFileAttributesProperty.Create(pSearchRecord^.Attr); SizeProperty := TFileSizeProperty.Create(pSearchRecord^.Size); ModificationTimeProperty := TFileModificationDateTimeProperty.Create(pSearchRecord^.Time); CreationTimeProperty := TFileCreationDateTimeProperty.Create(pSearchRecord^.Time); LastAccessTimeProperty := TFileLastAccessDateTimeProperty.Create(pSearchRecord^.Time); LinkProperty := TFileLinkProperty.Create; end; end; {$ENDIF} // ---------------------------------------------------------------------------- constructor TFileSystemFileSource.Create; begin inherited Create; FDescr:= nil; FOperationsClasses[fsoList] := TFileSystemListOperation.GetOperationClass; FOperationsClasses[fsoCopy] := TFileSystemCopyOperation.GetOperationClass; FOperationsClasses[fsoCopyIn] := TFileSystemCopyInOperation.GetOperationClass; FOperationsClasses[fsoCopyOut] := TFileSystemCopyOutOperation.GetOperationClass; FOperationsClasses[fsoMove] := TFileSystemMoveOperation.GetOperationClass; FOperationsClasses[fsoDelete] := TFileSystemDeleteOperation.GetOperationClass; FOperationsClasses[fsoWipe] := TFileSystemWipeOperation.GetOperationClass; FOperationsClasses[fsoCombine] := TFileSystemCombineOperation.GetOperationClass; FOperationsClasses[fsoCreateDirectory] := TFileSystemCreateDirectoryOperation.GetOperationClass; FOperationsClasses[fsoCalcChecksum] := TFileSystemCalcChecksumOperation.GetOperationClass; FOperationsClasses[fsoCalcStatistics] := TFileSystemCalcStatisticsOperation.GetOperationClass; FOperationsClasses[fsoSetFileProperty] := TFileSystemSetFilePropertyOperation.GetOperationClass; FOperationsClasses[fsoExecute] := TFileSystemExecuteOperation.GetOperationClass; end; destructor TFileSystemFileSource.Destroy; begin inherited Destroy; FDescr.Free; end; class function TFileSystemFileSource.CreateFile(const APath: String): TFile; begin Result := TFile.Create(APath); with Result do begin AttributesProperty := TFileAttributesProperty.CreateOSAttributes; SizeProperty := TFileSizeProperty.Create; ModificationTimeProperty := TFileModificationDateTimeProperty.Create; CreationTimeProperty := TFileCreationDateTimeProperty.Create; LastAccessTimeProperty := TFileLastAccessDateTimeProperty.Create; LinkProperty := TFileLinkProperty.Create; OwnerProperty := TFileOwnerProperty.Create; TypeProperty := TFileTypeProperty.Create; CommentProperty := TFileCommentProperty.Create; end; end; class function TFileSystemFileSource.CreateFile(const APath: String; pSearchRecord: PSearchRecEx): TFile; begin Result := TFile.Create(APath); {$IF DEFINED(MSWINDOWS)} FillFromFindData(Result, APath + pSearchRecord^.Name, @(pSearchRecord^.FindData)); {$ELSEIF DEFINED(UNIX)} FillFromStat(Result, APath + pSearchRecord^.Name, @(PUnixFindData(pSearchRecord^.FindHandle)^.StatRec)); {$ELSE} FillFromSearchRecord(Result, APath + pSearchRecord^.Name, pSearchRecord); {$ENDIF} // Set name after assigning Attributes property, because it is used to get extension. Result.Name := pSearchRecord^.Name; end; class function TFileSystemFileSource.CreateFileFromFile(const aFilePath: String): TFile; var {$IF DEFINED(MSWINDOWS)} FindData: TWIN32FINDDATAW; FindHandle: THandle; {$ELSEIF DEFINED(UNIX)} StatInfo: BaseUnix.Stat; {$ELSE} SearchRecord: TSearchRecEx; FindResult: Longint; {$ENDIF} begin Result := nil; {$IF DEFINED(MSWINDOWS)} FindHandle := FindFirstFileW(PWideChar(UTF8Decode(aFilePath)), @FindData); if FindHandle = INVALID_HANDLE_VALUE then raise EFileNotFound.Create(aFilePath); Windows.FindClose(FindHandle); FindData.dwFileAttributes:= ExtractFileAttributes(FindData); Result := TFile.Create(ExtractFilePath(aFilePath)); FillFromFindData(Result, aFilePath, @FindData); {$ELSEIF DEFINED(UNIX)} if fpLStat(UTF8ToSys(AFilePath), StatInfo) = -1 then raise EFileNotFound.Create(aFilePath); Result := TFile.Create(ExtractFilePath(aFilePath)); FillFromStat(Result, aFilePath, @StatInfo); {$ELSE} FindResult := FindFirstEx(aFilePath, faAnyFile, SearchRecord); try if FindResult <> 0 then raise EFileNotFound.Create(aFilePath); Result := TFile.Create(ExtractFilePath(aFilePath)); FillFromSearchRecord(Result, aFilePath, @SearchRecord); finally FindCloseEx(SearchRecord); end; {$ENDIF} // Set name after assigning Attributes property, because it is used to get extension. Result.FullPath := aFilePath; end; class function TFileSystemFileSource.CreateFilesFromFileList( const APath: String; const FileNamesList: TStringList; OmitNotExisting: Boolean): TFiles; var i: Integer; begin Result := TFiles.Create(APath); if Assigned(FileNamesList) and (FileNamesList.Count > 0) then begin for i := 0 to FileNamesList.Count - 1 do begin try Result.Add(CreateFileFromFile(FileNamesList[i])); except on EFileNotFound do if not OmitNotExisting then begin FreeAndNil(Result); raise; end; on Exception do begin FreeAndNil(Result); raise; end; end; end; end; end; procedure TFileSystemFileSource.RetrieveProperties(AFile: TFile; PropertiesToSet: TFilePropertiesTypes); var sFullPath: String; Attrs: TFileAttrs; AProps: TFilePropertiesTypes; {$IF DEFINED(UNIX)} StatInfo, LinkInfo: BaseUnix.Stat; //buffer for stat info {$ELSEIF DEFINED(MSWINDOWS)} FindData: TWIN32FINDDATAW; FindHandle: THandle; LinkAttrs: TFileAttrs; {$ELSE} SearchRec: TSearchRecEx; {$ENDIF} begin AProps := AFile.AssignedProperties; // Omit properties that are already assigned. PropertiesToSet := PropertiesToSet - AProps; if PropertiesToSet = [] then Exit; // Already have requested properties. // Assume that Name property is always present. sFullPath := AFile.FullPath; with AFile do begin {$IF DEFINED(MSWINDOWS)} // Check if need to get file info record. if ([fpAttributes, fpSize, fpModificationTime, fpCreationTime, fpLastAccessTime] * PropertiesToSet <> []) or ((fpLink in PropertiesToSet) and (not (fpAttributes in AProps))) then begin FindHandle := FindFirstFileW(PWideChar(UTF8Decode(sFullPath)), @FindData); if FindHandle = INVALID_HANDLE_VALUE then raise EFileNotFound.Create(sFullPath); Windows.FindClose(FindHandle); FindData.dwFileAttributes:= ExtractFileAttributes(FindData); if not (fpAttributes in AProps) then AttributesProperty := TNtfsFileAttributesProperty.Create( FindData.dwFileAttributes); if not (fpSize in AProps) then SizeProperty := TFileSizeProperty.Create( QWord(FindData.nFileSizeHigh) shl 32 + FindData.nFileSizeLow); if not (fpModificationTime in AProps) then ModificationTimeProperty := TFileModificationDateTimeProperty.Create( WinFileTimeToDateTime(FindData.ftLastWriteTime)); if not (fpCreationTime in AProps) then CreationTimeProperty := TFileCreationDateTimeProperty.Create( WinFileTimeToDateTime(FindData.ftCreationTime)); if not (fpLastAccessTime in AProps) then LastAccessTimeProperty := TFileLastAccessDateTimeProperty.Create( WinFileTimeToDateTime(FindData.ftLastAccessTime)); end; if fpLink in PropertiesToSet then begin Attrs := Attributes; LinkProperty := TFileLinkProperty.Create; if fpS_ISLNK(Attrs) then begin LinkAttrs := mbFileGetAttrNoLinks(sFullPath); LinkProperty.LinkTo := ReadSymLink(sFullPath); LinkProperty.IsValid := LinkAttrs <> faInvalidAttributes; if LinkProperty.IsValid then LinkProperty.IsLinkToDirectory := fpS_ISDIR(LinkAttrs) else // On Windows links to directories are marked with Directory flag on the link. LinkProperty.IsLinkToDirectory := fpS_ISDIR(Attrs); end; end; if fpOwner in PropertiesToSet then begin SetOwner(AFile); end; if fpType in PropertiesToSet then begin TypeProperty := TFileTypeProperty.Create; TypeProperty.Value := GetFileDescription(sFullPath); end; if fpCompressedSize in PropertiesToSet then begin CompressedSizeProperty := TFileCompressedSizeProperty.Create; CompressedSizeProperty.Value := mbGetCompressedFileSize(sFullPath); end; {$ELSEIF DEFINED(UNIX)} if ([fpAttributes, fpSize, fpModificationTime, fpCreationTime, fpLastAccessTime, fpOwner] * PropertiesToSet <> []) or ((uFileProperty.fpLink in PropertiesToSet) and (not (fpAttributes in AssignedProperties))) then begin if fpLstat(UTF8ToSys(sFullPath), StatInfo) = -1 then raise EFileNotFound.Create(sFullPath); if not (fpAttributes in AssignedProperties) then AttributesProperty := TUnixFileAttributesProperty.Create(StatInfo.st_mode); if not (fpSize in AssignedProperties) then begin if fpS_ISDIR(StatInfo.st_mode) then // On Unix a size for directory entry on filesystem is returned in StatInfo. // We don't want to use it. SizeProperty := TFileSizeProperty.Create(0) else SizeProperty := TFileSizeProperty.Create(Int64(StatInfo.st_size)); end; if not (fpModificationTime in AssignedProperties) then ModificationTimeProperty := TFileModificationDateTimeProperty.Create( FileTimeToDateTime(StatInfo.st_mtime)); if not (fpCreationTime in AssignedProperties) then CreationTimeProperty := TFileCreationDateTimeProperty.Create( FileTimeToDateTime(StatInfo.st_ctime)); if not (fpLastAccessTime in AssignedProperties) then LastAccessTimeProperty := TFileLastAccessDateTimeProperty.Create( FileTimeToDateTime(StatInfo.st_atime)); end; if uFileProperty.fpLink in PropertiesToSet then begin Attrs := Attributes; LinkProperty := TFileLinkProperty.Create; if fpS_ISLNK(Attrs) then begin LinkProperty.LinkTo := ReadSymLink(sFullPath); // Stat (as opposed to Lstat) will take info of the file that the link points to (recursively). LinkProperty.IsValid := fpStat(PChar(UTF8ToSys(sFullPath)), LinkInfo) = 0; if LinkProperty.IsValid then begin LinkProperty.IsLinkToDirectory := FPS_ISDIR(LinkInfo.st_mode); end; end; end; if fpOwner in PropertiesToSet then begin OwnerProperty := TFileOwnerProperty.Create; OwnerProperty.Owner := StatInfo.st_uid; OwnerProperty.Group := StatInfo.st_gid; OwnerProperty.OwnerStr := UIDToStr(StatInfo.st_uid); OwnerProperty.GroupStr := GIDToStr(StatInfo.st_gid); end; if fpType in PropertiesToSet then begin TypeProperty := TFileTypeProperty.Create; TypeProperty.Value:= GetFileMimeType(sFullPath); end; {$ELSE} if FindFirstEx(sFullPath, 0, SearchRec) = -1 then raise EFileNotFound.Create(sFullPath); if not (fpAttributes in AssignedProperties) then AttributesProperty := TFileAttributesProperty.Create(SearchRec.Attr); if not (fpSize in AssignedProperties) then SizeProperty := TFileSizeProperty.Create(SearchRec.Size); if not (fpModificationTime in AssignedProperties) then ModificationTimeProperty := TFileModificationDateTimeProperty.Create(SearchRec.Time); if not (fpCreationTime in AssignedProperties) then CreationTimeProperty := TFileCreationDateTimeProperty.Create(SearchRec.Time); if not (fpLastAccessTime in AssignedProperties) then LastAccessTimeProperty := TFileLastAccessDateTimeProperty.Create(SearchRec.Time); FindCloseEx(SearchRec); if fpLink in PropertiesToSet then LinkProperty := TFileLinkProperty.Create; if fpOwner in PropertiesToSet then OwnerProperty := TFileOwnerProperty.Create; if fpType in PropertiesToSet then TypeProperty := TFileTypeProperty.Create; {$ENDIF} if fpComment in PropertiesToSet then begin CommentProperty := TFileCommentProperty.Create; if not Assigned(FDescr) then FDescr := TDescription.Create(False); CommentProperty.Value := FDescr.ReadDescription(sFullPath); end; end; end; class function TFileSystemFileSource.GetFileSource: IFileSystemFileSource; var aFileSource: IFileSource; begin aFileSource := FileSourceManager.Find(TFileSystemFileSource, ''); if not Assigned(aFileSource) then Result := TFileSystemFileSource.Create else Result := aFileSource as IFileSystemFileSource; end; function TFileSystemFileSource.GetOperationsTypes: TFileSourceOperationTypes; begin Result := [fsoList, fsoCopy, fsoCopyIn, fsoCopyOut, fsoMove, fsoDelete, fsoWipe, fsoSplit, fsoCombine, fsoCreateDirectory, fsoCalcChecksum, fsoCalcStatistics, fsoSetFileProperty, fsoExecute]; end; function TFileSystemFileSource.GetProperties: TFileSourceProperties; begin Result := [ fspDirectAccess {$IFDEF UNIX} , fspCaseSensitive {$ENDIF} ]; end; function TFileSystemFileSource.GetCurrentWorkingDirectory: String; begin Result := mbGetCurrentDir(); if Result <> '' then Result := IncludeTrailingPathDelimiter(Result); end; function TFileSystemFileSource.SetCurrentWorkingDirectory(NewDir: String): Boolean; begin if not mbDirectoryExists(NewDir) then Result := False else Result := mbSetCurrentDir(NewDir); end; function TFileSystemFileSource.IsPathAtRoot(Path: String): Boolean; var sPath: UTF8String; begin sPath := ExcludeTrailingPathDelimiter(Path); if (Pos('\\', sPath) = 1) and (NumCountChars(PathDelim, sPath) = 3) then Exit(True); Result := (DCStrUtils.GetParentDir(Path) = ''); end; function TFileSystemFileSource.GetRootDir(sPath : String): String; begin Result := DCStrUtils.GetRootDir(sPath); end; function TFileSystemFileSource.GetRootDir: String; begin Result := Self.GetRootDir(mbGetCurrentDir); end; function TFileSystemFileSource.GetPathType(sPath : String): TPathType; begin Result := DCStrUtils.GetPathType(sPath); end; function TFileSystemFileSource.GetFreeSpace(Path: String; out FreeSize, TotalSize : Int64) : Boolean; begin Result := uOSUtils.GetDiskFreeSpace(Path, FreeSize, TotalSize); end; function TFileSystemFileSource.GetSupportedFileProperties: TFilePropertiesTypes; begin Result := inherited GetSupportedFileProperties + [fpSize, fpAttributes, fpModificationTime, fpCreationTime, fpLastAccessTime, uFileProperty.fpLink ]; end; function TFileSystemFileSource.GetRetrievableFileProperties: TFilePropertiesTypes; begin Result := inherited GetRetrievableFileProperties + [fpSize, fpAttributes, fpModificationTime, fpCreationTime, fpLastAccessTime, uFileProperty.fpLink, fpOwner, fpType, fpComment {$IF DEFINED(MSWINDOWS)} , fpCompressedSize {$ENDIF} ]; end; function TFileSystemFileSource.CreateListOperation(TargetPath: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TFileSystemListOperation.Create(TargetFileSource, TargetPath); end; function TFileSystemFileSource.CreateCopyOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; var FileSource: IFileSource; begin FileSource := Self; Result := TFileSystemCopyOperation.Create(FileSource, FileSource, SourceFiles, TargetPath); end; function TFileSystemFileSource.CreateCopyInOperation(SourceFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TFileSystemCopyInOperation.Create( SourceFileSource, TargetFileSource, SourceFiles, TargetPath); end; function TFileSystemFileSource.CreateCopyOutOperation(TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; var SourceFileSource: IFileSource; begin SourceFileSource := Self; Result := TFileSystemCopyOutOperation.Create( SourceFileSource, TargetFileSource, SourceFiles, TargetPath); end; function TFileSystemFileSource.CreateMoveOperation(var SourceFiles: TFiles; TargetPath: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TFileSystemMoveOperation.Create(TargetFileSource, SourceFiles, TargetPath); end; function TFileSystemFileSource.CreateDeleteOperation(var FilesToDelete: TFiles): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TFileSystemDeleteOperation.Create(TargetFileSource, FilesToDelete); end; function TFileSystemFileSource.CreateWipeOperation(var FilesToWipe: TFiles): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TFileSystemWipeOperation.Create(TargetFileSource, FilesToWipe); end; function TFileSystemFileSource.CreateSplitOperation(var aSourceFile: TFile; aTargetPath: String): TFileSourceOperation; var SourceFileSource: IFileSource; begin SourceFileSource := Self; Result := TFileSystemSplitOperation.Create(SourceFileSource, aSourceFile, aTargetPath); end; function TFileSystemFileSource.CreateCombineOperation(var SourceFiles: TFiles; aTargetFile: String): TFileSourceOperation; var SourceFileSource: IFileSource; begin SourceFileSource := Self; Result := TFileSystemCombineOperation.Create(SourceFileSource, SourceFiles, aTargetFile); end; function TFileSystemFileSource.CreateCreateDirectoryOperation(BasePath: String; DirectoryPath: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TFileSystemCreateDirectoryOperation.Create(TargetFileSource, BasePath, DirectoryPath); end; function TFileSystemFileSource.CreateExecuteOperation(var ExecutableFile: TFile; BasePath, Verb: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result:= TFileSystemExecuteOperation.Create(TargetFileSource, ExecutableFile, BasePath, Verb); end; function TFileSystemFileSource.CreateCalcChecksumOperation(var theFiles: TFiles; aTargetPath: String; aTargetMask: String): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TFileSystemCalcChecksumOperation.Create( TargetFileSource, theFiles, aTargetPath, aTargetMask); end; function TFileSystemFileSource.CreateCalcStatisticsOperation(var theFiles: TFiles): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TFileSystemCalcStatisticsOperation.Create(TargetFileSource, theFiles); end; function TFileSystemFileSource.CreateSetFilePropertyOperation(var theTargetFiles: TFiles; var theNewProperties: TFileProperties): TFileSourceOperation; var TargetFileSource: IFileSource; begin TargetFileSource := Self; Result := TFileSystemSetFilePropertyOperation.Create( TargetFileSource, theTargetFiles, theNewProperties); end; { TFileSystemFileSourceConnection } procedure TFileSystemFileSourceConnection.SetCurrentPath(NewPath: String); begin if not mbDirectoryExists(NewPath) then NewPath := mbGetCurrentDir else mbSetCurrentDir(NewPath); inherited SetCurrentPath(NewPath); end; end. doublecmd-0.5.8/src/filesources/filesystem/ufilesystemcalcchecksumoperation.pas0000644000175000017500000002556111774527227027400 0ustar alexxalexxunit uFileSystemCalcChecksumOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, contnrs, uFileSourceCalcChecksumOperation, uFileSource, uFileSourceOperationOptions, uFileSourceOperationUI, uFile, uGlobs, uLog, uHash, DCClassesUtf8; type TFileSystemCalcChecksumOperation = class(TFileSourceCalcChecksumOperation) private FFullFilesTree: TFiles; // source files including all files/dirs in subdirectories FStatistics: TFileSourceCalcChecksumOperationStatistics; // local copy of statistics FCheckSumFile: TStringListEx; FBuffer: Pointer; FBufferSize: LongWord; FChecksumsList: TObjectList; // Options. FSymLinkOption: TFileSourceOperationOptionSymLink; FSkipErrors: Boolean; function CheckSumCalc(aFile: TFile): String; procedure InitializeVerifyMode; procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); function CalcChecksumProcessFile(aFile: TFile): Boolean; function VerifyChecksumProcessFile(aFile: TFile; ExpectedChecksum: String): Boolean; public constructor Create(aTargetFileSource: IFileSource; var theFiles: TFiles; aTargetPath: String; aTargetMask: String); override; destructor Destroy; override; procedure Initialize; override; procedure MainExecute; override; procedure Finalize; override; end; implementation uses LCLProc, StrUtils, FileUtil, uLng, uFileSystemUtil, uFileSystemFileSource, DCOSUtils, DCStrUtils; type TChecksumEntry = class public Checksum: String; Algorithm: THashAlgorithm; end; constructor TFileSystemCalcChecksumOperation.Create( aTargetFileSource: IFileSource; var theFiles: TFiles; aTargetPath: String; aTargetMask: String); begin FBuffer := nil; FSymLinkOption := fsooslNone; FSkipErrors := False; FFullFilesTree := nil; FCheckSumFile := TStringListEx.Create; FChecksumsList := TObjectList.Create(True); inherited Create(aTargetFileSource, theFiles, aTargetPath, aTargetMask); end; destructor TFileSystemCalcChecksumOperation.Destroy; begin inherited Destroy; if Assigned(FBuffer) then begin FreeMem(FBuffer); FBuffer := nil; end; if Assigned(FFullFilesTree) then FreeAndNil(FFullFilesTree); if Assigned(FCheckSumFile) then FreeAndNil(FCheckSumFile); if Assigned(FChecksumsList) then FreeAndNil(FChecksumsList); end; procedure TFileSystemCalcChecksumOperation.Initialize; begin FResult.Clear; // Get initialized statistics; then we change only what is needed. FStatistics := RetrieveStatistics; case Mode of checksum_calc: FillAndCount(Files, False, False, FFullFilesTree, FStatistics.TotalFiles, FStatistics.TotalBytes); // gets full list of files (recursive) checksum_verify: InitializeVerifyMode; end; FBufferSize := gCopyBlockSize; GetMem(FBuffer, FBufferSize); end; procedure TFileSystemCalcChecksumOperation.MainExecute; var aFile: TFile; CurrentFileIndex: Integer; OldDoneBytes: Int64; // for if there was an error Entry: TChecksumEntry; begin for CurrentFileIndex := 0 to FFullFilesTree.Count - 1 do begin aFile := FFullFilesTree[CurrentFileIndex]; with FStatistics do begin CurrentFile := aFile.Path + aFile.Name; CurrentFileTotalBytes := aFile.Size; CurrentFileDoneBytes := 0; end; UpdateStatistics(FStatistics); if not aFile.IsDirectory then begin // If there will be an error in ProcessFile the DoneBytes value // will be inconsistent, so remember it here. OldDoneBytes := FStatistics.DoneBytes; case Mode of checksum_calc: CalcChecksumProcessFile(aFile); checksum_verify: begin Entry := FChecksumsList.Items[CurrentFileIndex] as TChecksumEntry; Algorithm := Entry.Algorithm; VerifyChecksumProcessFile(aFile, Entry.Checksum); end; end; with FStatistics do begin DoneFiles := DoneFiles + 1; DoneBytes := OldDoneBytes + aFile.Size; UpdateStatistics(FStatistics); end; end; CheckOperationState; end; case Mode of checksum_calc: // make result if OneFile then try FCheckSumFile.SaveToFile(TargetMask); except on E: EFCreateError do AskQuestion(rsMsgErrECreate + ' ' + TargetMask + ':', E.Message, [fsourOk], fsourOk, fsourOk); on E: EWriteError do AskQuestion(rsMsgErrEWrite + ' ' + TargetMask + ':', E.Message, [fsourOk], fsourOk, fsourOk); end; checksum_verify: begin end; end; end; procedure TFileSystemCalcChecksumOperation.Finalize; begin end; procedure TFileSystemCalcChecksumOperation.InitializeVerifyMode; var CurrentFileIndex, I: Integer; aFile, aFileToVerify: TFile; anAlgorithm: THashAlgorithm; FileName: String; Entry: TChecksumEntry; begin FFullFilesTree := TFiles.Create(Files.Path); FChecksumsList.Clear; for CurrentFileIndex := 0 to Files.Count - 1 do begin aFile := Files[CurrentFileIndex]; FCheckSumFile.Clear; FCheckSumFile.NameValueSeparator:= #32; FCheckSumFile.LoadFromFile(aFile.FullPath); anAlgorithm := FileExtToHashAlg(aFile.Extension); for I := 0 to FCheckSumFile.Count - 1 do begin FileName := aFile.Path + Copy(FCheckSumFile.ValueFromIndex[I], 2, MaxInt); try aFileToVerify := TFileSystemFileSource.CreateFileFromFile(FileName); if not (aFileToVerify.IsDirectory or aFileToVerify.IsLinkToDirectory) then begin with FStatistics do begin TotalFiles := TotalFiles + 1; TotalBytes := TotalBytes + aFileToVerify.Size; end; FFullFilesTree.Add(aFileToVerify); Entry := TChecksumEntry.Create; FChecksumsList.Add(Entry); Entry.Checksum := FCheckSumFile.Names[I]; Entry.Algorithm := anAlgorithm; end else FreeAndNil(aFileToVerify); except on EFileNotFound do begin FResult.Add(Format(rsViewNotFound, [Copy(FCheckSumFile.ValueFromIndex[I], 2, MaxInt) + ': ']) ); end else begin FreeAndNil(aFileToVerify); raise; end; end; CheckOperationState; end; end; end; function TFileSystemCalcChecksumOperation.CalcChecksumProcessFile(aFile: TFile): Boolean; var FileName: String; sCheckSum: String; begin Result := False; FileName := aFile.Path + aFile.Name; if not OneFile then FCheckSumFile.Clear; sCheckSum := CheckSumCalc(aFile); FCheckSumFile.Add(sCheckSum + ' *' + ExtractDirLevel(FFullFilesTree.Path, aFile.Path) + aFile.Name); if not OneFile then try FCheckSumFile.SaveToFile(FileName + '.' + HashFileExt[Algorithm]); except on E: EFCreateError do AskQuestion(rsMsgErrECreate + ' ' + FileName + '.' + HashFileExt[Algorithm] + ':', E.Message, [fsourOk], fsourOk, fsourOk); on E: EWriteError do AskQuestion(rsMsgErrEWrite + ' ' + FileName + '.' + HashFileExt[Algorithm] + ':', E.Message, [fsourOk], fsourOk, fsourOk); end; end; function TFileSystemCalcChecksumOperation.VerifyChecksumProcessFile( aFile: TFile; ExpectedChecksum: String): Boolean; var sCheckSum: String; bResult: Boolean; begin Result := False; sCheckSum:= CheckSumCalc(aFile); bResult:= (CompareText(sCheckSum, ExpectedChecksum) = 0); FResult.Add(ExtractDirLevel(FFullFilesTree.Path, aFile.Path) + aFile.Name + ': ' + IfThen(bResult, 'True', 'False')); end; function TFileSystemCalcChecksumOperation.CheckSumCalc(aFile: TFile): String; var hFile: THandle; Context: THashContext; BytesRead, BytesToRead: Int64; bRetryRead: Boolean; TotalBytesToRead: Int64 = 0; begin Result:= EmptyStr; hFile := feInvalidHandle; BytesToRead := FBufferSize; HashInit(Context, Algorithm); try hFile:= mbFileOpen(aFile.FullPath, fmOpenRead or fmShareDenyNone); if hFile <> feInvalidHandle then begin TotalBytesToRead := mbFileSize(aFile.FullPath); while TotalBytesToRead > 0 do begin // Without the following line the reading is very slow // if it tries to read past end of file. if TotalBytesToRead < BytesToRead then BytesToRead := TotalBytesToRead; repeat try bRetryRead := False; BytesRead := FileRead(hFile, FBuffer^, BytesToRead); if (BytesRead = 0) then Raise EReadError.Create(mbSysErrorMessage(GetLastOSError)); TotalBytesToRead := TotalBytesToRead - BytesRead; HashUpdate(Context, FBuffer^, BytesRead); except on E: EReadError do begin if gSkipFileOpError then begin LogMessage(rsMsgErrERead + ' ' + aFile.FullPath + ': ' + E.Message, [], lmtError); Exit; end else case AskQuestion(rsMsgErrERead + ' ' + aFile.FullPath + ': ', E.Message, [fsourRetry, fsourSkip, fsourAbort], fsourRetry, fsourSkip) of fsourRetry: bRetryRead := True; fsourAbort: RaiseAbortOperation; fsourSkip: Exit; end; // case end; end; until not bRetryRead; with FStatistics do begin CurrentFileDoneBytes := CurrentFileDoneBytes + BytesRead; DoneBytes := DoneBytes + BytesRead; UpdateStatistics(FStatistics); end; CheckOperationState; // check pause and stop end;//while end; finally HashFinal(Context, Result); if hFile <> feInvalidHandle then begin FileClose(hFile); hFile := feInvalidHandle; end; end; end; procedure TFileSystemCalcChecksumOperation.LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); begin case logMsgType of lmtError: if not (log_errors in gLogOptions) then Exit; lmtInfo: if not (log_info in gLogOptions) then Exit; lmtSuccess: if not (log_success in gLogOptions) then Exit; end; if logOptions <= gLogOptions then begin logWrite(Thread, sMessage, logMsgType); end; end; end. doublecmd-0.5.8/src/filesources/filesystem/ufilesystemutil.pas0000644000175000017500000014604712254131240023766 0ustar alexxalexxunit uFileSystemUtil; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uDescr, uLog, uGlobs, DCOSUtils, uFile, uFileSourceOperation, uFileSourceOperationOptions, uFileSourceOperationUI, uFileSourceCopyOperation, uSearchTemplate, uFindFiles; function ApplyRenameMask(aFile: TFile; NameMask: String; ExtMask: String): String; overload; procedure FillAndCount(Files: TFiles; CountDirs: Boolean; ExcludeRootDir: Boolean; out NewFiles: TFiles; out FilesCount: Int64; out FilesSize: Int64); type // Additional data for the filesystem tree node. TFileTreeNodeData = class public // True if any of the subnodes (recursively) are links. SubnodesHaveLinks: Boolean; // Whether directory or subdirectories have any elements that will not be copied/moved. SubnodesHaveExclusions: Boolean; end; TUpdateStatisticsFunction = procedure(var NewStatistics: TFileSourceCopyOperationStatistics) of object; TFileSystemOperationTargetExistsResult = (fsoterNotExists, fsoterDeleted, fsoterAddToTarget, fsoterResume, fsoterSkip); TFileSystemOperationHelperMode = (fsohmCopy, fsohmMove); TFileSystemOperationHelperCopyMode = (fsohcmDefault, fsohcmAppend, fsohcmResume); TFileSystemOperationHelperMoveOrCopy = function(SourceFile: TFile; TargetFileName: String; Mode: TFileSystemOperationHelperCopyMode): Boolean of object; { TFileSystemTreeBuilder } TFileSystemTreeBuilder = class private FFilesTree: TFileTree; FFilesCount: Int64; FCurrentDepth: Integer; FDirectoriesCount: Int64; FFilesSize: Int64; FExcludeRootDir: Boolean; FFileTemplate: TSearchTemplate; FExcludeEmptyTemplateDirectories: Boolean; FSymlinkOption: TFileSourceOperationOptionSymLink; FRecursive: Boolean; FFileChecks: TFindFileChecks; FRootDir: String; AskQuestion: TAskQuestionFunction; CheckOperationState: TCheckOperationStateFunction; procedure AddItem(aFile: TFile; CurrentNode: TFileTreeNode); procedure AddFilesInDirectory(srcPath: String; CurrentNode: TFileTreeNode); procedure AddFile(aFile: TFile; CurrentNode: TFileTreeNode); procedure AddLink(aFile: TFile; CurrentNode: TFileTreeNode); procedure AddLinkTarget(aFile: TFile; CurrentNode: TFileTreeNode); procedure AddDirectory(aFile: TFile; CurrentNode: TFileTreeNode); procedure DecideOnLink(aFile: TFile; CurrentNode: TFileTreeNode); function GetItemsCount: Int64; public constructor Create(AskQuestionFunction: TAskQuestionFunction; CheckOperationStateFunction: TCheckOperationStateFunction); destructor Destroy; override; procedure BuildFromFiles(Files: TFiles); function ReleaseTree: TFileTree; property ExcludeRootDir: Boolean read FExcludeRootDir write FExcludeRootDir; property Recursive: Boolean read FRecursive write FRecursive; property SymLinkOption: TFileSourceOperationOptionSymLink read FSymlinkOption write FSymlinkOption; property FilesTree: TFileTree read FFilesTree; property FilesSize: Int64 read FFilesSize; property FilesCount: Int64 read FFilesCount; property DirectoriesCount: Int64 read FDirectoriesCount; property ItemsCount: Int64 read GetItemsCount; property ExcludeEmptyTemplateDirectories: Boolean read FExcludeEmptyTemplateDirectories write FExcludeEmptyTemplateDirectories; {en Does not take ownership of SearchTemplate and does not free it. } property SearchTemplate: TSearchTemplate read FFileTemplate write FFileTemplate; end; { TFileSystemOperationHelper } TFileSystemOperationHelper = class private FOperationThread: TThread; FMode: TFileSystemOperationHelperMode; FBuffer: Pointer; FBufferSize: LongWord; FRootTargetPath: String; FRenameMask: String; FRenameNameMask, FRenameExtMask: String; FSetPropertyError: TFileSourceOperationOptionSetPropertyError; FStatistics: TFileSourceCopyOperationStatistics; // local copy of statistics FDescription: TDescription; FLogCaption: String; FRenamingFiles: Boolean; FRenamingRootDir: Boolean; FRootDir: TFile; FReserveSpace, FCheckFreeSpace: Boolean; FSkipAllBigFiles: Boolean; FSkipOpenForReadingError: Boolean; FSkipOpenForWritingError: Boolean; FSkipReadError: Boolean; FSkipWriteError: Boolean; FAutoRenameItSelf: Boolean; FCorrectSymLinks: Boolean; FCopyAttributesOptions: TCopyAttributesOptions; FFileExistsOption: TFileSourceOperationOptionFileExists; FDirExistsOption: TFileSourceOperationOptionDirectoryExists; AskQuestion: TAskQuestionFunction; AbortOperation: TAbortOperationFunction; CheckOperationState: TCheckOperationStateFunction; UpdateStatistics: TUpdateStatisticsFunction; MoveOrCopy: TFileSystemOperationHelperMoveOrCopy; procedure ShowError(sMessage: String); procedure LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); function CopyFile(SourceFile: TFile; TargetFileName: String; Mode: TFileSystemOperationHelperCopyMode): Boolean; function MoveFile(SourceFile: TFile; TargetFileName: String; Mode: TFileSystemOperationHelperCopyMode): Boolean; procedure CopyProperties(SourceFileName, TargetFileName: String); function ProcessNode(aFileTreeNode: TFileTreeNode; CurrentTargetPath: String): Boolean; function ProcessDirectory(aNode: TFileTreeNode; AbsoluteTargetFileName: String): Boolean; function ProcessLink(aNode: TFileTreeNode; AbsoluteTargetFileName: String): Boolean; function ProcessFile(aNode: TFileTreeNode; AbsoluteTargetFileName: String): Boolean; function TargetExists(aNode: TFileTreeNode; AbsoluteTargetFileName: String) : TFileSystemOperationTargetExistsResult; function DirExists(aFile: TFile; AbsoluteTargetFileName: String; AllowCopyInto: Boolean; AllowDelete: Boolean): TFileSourceOperationOptionDirectoryExists; function FileExists(aFile: TFile; AbsoluteTargetFileName: String; AllowAppend: Boolean): TFileSourceOperationOptionFileExists; procedure CountStatistics(aNode: TFileTreeNode); public constructor Create(AskQuestionFunction: TAskQuestionFunction; AbortOperationFunction: TAbortOperationFunction; CheckOperationStateFunction: TCheckOperationStateFunction; UpdateStatisticsFunction: TUpdateStatisticsFunction; OperationThread: TThread; Mode: TFileSystemOperationHelperMode; TargetPath: String; StartingStatistics: TFileSourceCopyOperationStatistics); destructor Destroy; override; procedure Initialize; procedure ProcessTree(aFileTree: TFileTree); property FileExistsOption: TFileSourceOperationOptionFileExists read FFileExistsOption write FFileExistsOption; property DirExistsOption: TFileSourceOperationOptionDirectoryExists read FDirExistsOption write FDirExistsOption; property CheckFreeSpace: Boolean read FCheckFreeSpace write FCheckFreeSpace; property ReserveSpace: Boolean read FReserveSpace write FReserveSpace; property SetPropertyError: TFileSourceOperationOptionSetPropertyError read FSetPropertyError write FSetPropertyError; property SkipAllBigFiles: Boolean read FSkipAllBigFiles write FSkipAllBigFiles; property AutoRenameItSelf: Boolean read FAutoRenameItSelf write FAutoRenameItSelf; property CopyAttributesOptions: TCopyAttributesOptions read FCopyAttributesOptions write FCopyAttributesOptions; property CorrectSymLinks: Boolean read FCorrectSymLinks write FCorrectSymLinks; property RenameMask: String read FRenameMask write FRenameMask; end; implementation uses uDebug, uOSUtils, DCStrUtils, FileUtil, uFindEx, DCClassesUtf8, uFileProcs, uLng, DCBasicTypes, uFileSource, uFileSystemFileSource, uFileProperty, DCDateTimeUtils; function ApplyRenameMask(aFile: TFile; NameMask: String; ExtMask: String): String; overload; begin // Only change name for files. if aFile.IsDirectory or aFile.IsLink then Result := aFile.Name else Result := ApplyRenameMask(aFile.Name, NameMask, ExtMask); end; procedure FillAndCount(Files: TFiles; CountDirs: Boolean; ExcludeRootDir: Boolean; out NewFiles: TFiles; out FilesCount: Int64; out FilesSize: Int64); procedure FillAndCountRec(const srcPath: String); var sr: TSearchRecEx; aFile: TFile; begin if FindFirstEx(srcPath + '*', faAnyFile, sr) = 0 then begin repeat if (sr.Name='.') or (sr.Name='..') then Continue; aFile := TFileSystemFileSource.CreateFile(srcPath, @sr); NewFiles.Add(aFile); if aFile.IsLink then begin end else if aFile.IsDirectory then begin if CountDirs then Inc(FilesCount); FillAndCountRec(srcPath + sr.Name + DirectorySeparator); // go down to directory end else begin FilesSize:= FilesSize + aFile.Size; Inc(FilesCount); end; until FindNextEx(sr) <> 0; end; FindCloseEx(sr); end; var i: Integer; aFile: TFile; begin FilesCount:= 0; FilesSize:= 0; if ExcludeRootDir then begin if Files.Count <> 1 then raise Exception.Create('Only a single directory can be set with ExcludeRootDir=True'); NewFiles := TFiles.Create(Files[0].FullPath); FillAndCountRec(Files[0].FullPath + DirectorySeparator); end else begin NewFiles := TFiles.Create(Files.Path); for i := 0 to Files.Count - 1 do begin aFile := Files[i]; NewFiles.Add(aFile.Clone); if aFile.IsDirectory and (not aFile.IsLinkToDirectory) then begin if CountDirs then Inc(FilesCount); FillAndCountRec(aFile.Path + aFile.Name + DirectorySeparator); // recursive browse child dir end else begin Inc(FilesCount); FilesSize:= FilesSize + aFile.Size; // in first level we know file size -> use it end; end; end; end; // ---------------------------------------------------------------------------- constructor TFileSystemTreeBuilder.Create(AskQuestionFunction: TAskQuestionFunction; CheckOperationStateFunction: TCheckOperationStateFunction); begin AskQuestion := AskQuestionFunction; CheckOperationState := CheckOperationStateFunction; FRecursive := True; FSymlinkOption := fsooslNone; end; destructor TFileSystemTreeBuilder.Destroy; begin inherited Destroy; FFilesTree.Free; end; procedure TFileSystemTreeBuilder.BuildFromFiles(Files: TFiles); var i: Integer; begin FreeAndNil(FFilesTree); FFilesTree := TFileTreeNode.Create; FFilesTree.Data := TFileTreeNodeData.Create; FFilesSize := 0; FFilesCount := 0; FDirectoriesCount := 0; FCurrentDepth := 0; FRootDir := Files.Path; if Assigned(FFileTemplate) then SearchTemplateToFindFileChecks(FFileTemplate.SearchRecord, FFileChecks); if ExcludeRootDir then begin for i := 0 to Files.Count - 1 do if Files[i].IsDirectory then AddFilesInDirectory(Files[i].FullPath + DirectorySeparator, FFilesTree); end else begin for i := 0 to Files.Count - 1 do AddItem(Files[i].Clone, FFilesTree); end; end; procedure TFileSystemTreeBuilder.AddFile(aFile: TFile; CurrentNode: TFileTreeNode); var AddedNode: TFileTreeNode; AddedIndex: Integer; begin AddedIndex := CurrentNode.AddSubNode(aFile); AddedNode := CurrentNode.SubNodes[AddedIndex]; AddedNode.Data := TFileTreeNodeData.Create; Inc(FFilesCount); FFilesSize:= FFilesSize + aFile.Size; CheckOperationState; end; procedure TFileSystemTreeBuilder.AddLink(aFile: TFile; CurrentNode: TFileTreeNode); var AddedNode: TFileTreeNode; AddedIndex: Integer; begin AddedIndex := CurrentNode.AddSubNode(aFile); AddedNode := CurrentNode.SubNodes[AddedIndex]; AddedNode.Data := TFileTreeNodeData.Create; (CurrentNode.Data as TFileTreeNodeData).SubnodesHaveLinks := True; Inc(FFilesCount); end; procedure TFileSystemTreeBuilder.AddLinkTarget(aFile: TFile; CurrentNode: TFileTreeNode); var LinkedFilePath: String; LinkedFile: TFile = nil; AddedNode: TFileTreeNode; AddedIndex: Integer; begin LinkedFilePath := mbReadAllLinks(aFile.FullPath); if LinkedFilePath <> '' then begin try LinkedFile := TFileSystemFileSource.CreateFileFromFile(LinkedFilePath); // Add link to current node. AddedIndex := CurrentNode.AddSubNode(aFile); AddedNode := CurrentNode.SubNodes[AddedIndex]; AddedNode.Data := TFileTreeNodeData.Create; (CurrentNode.Data as TFileTreeNodeData).SubnodesHaveLinks := True; // Then add linked file/directory as a subnode of the link. AddItem(LinkedFile, AddedNode); except on EFileNotFound do begin // Link target doesn't exist - add symlink instead of target (or ask user). AddLink(aFile, CurrentNode); end; end; end else begin // error - cannot follow symlink - adding symlink instead of target (or ask user) AddLink(aFile, CurrentNode); end; end; procedure TFileSystemTreeBuilder.AddDirectory(aFile: TFile; CurrentNode: TFileTreeNode); var AddedNode: TFileTreeNode; AddedIndex: Integer; NodeData: TFileTreeNodeData; begin AddedIndex := CurrentNode.AddSubNode(aFile); AddedNode := CurrentNode.SubNodes[AddedIndex]; NodeData := TFileTreeNodeData.Create; AddedNode.Data := NodeData; Inc(FDirectoriesCount); if FRecursive then begin if not Assigned(FFileTemplate) or (FFileTemplate.SearchRecord.SearchDepth < 0) or (FCurrentDepth <= FFileTemplate.SearchRecord.SearchDepth) then begin Inc(FCurrentDepth); AddFilesInDirectory(aFile.FullPath + DirectorySeparator, AddedNode); Dec(FCurrentDepth); end; if Assigned(FFileTemplate) and FExcludeEmptyTemplateDirectories and (AddedNode.SubNodesCount = 0) then begin CurrentNode.RemoveSubNode(AddedIndex); (CurrentNode.Data as TFileTreeNodeData).SubnodesHaveExclusions := True; end else begin // Propagate flags to parent. if NodeData.SubnodesHaveLinks then (CurrentNode.Data as TFileTreeNodeData).SubnodesHaveLinks := True; if NodeData.SubnodesHaveExclusions then (CurrentNode.Data as TFileTreeNodeData).SubnodesHaveExclusions := True; end; end; end; procedure TFileSystemTreeBuilder.DecideOnLink(aFile: TFile; CurrentNode: TFileTreeNode); begin case FSymLinkOption of fsooslFollow: AddLinkTarget(aFile, CurrentNode); fsooslDontFollow: AddLink(aFile, CurrentNode); fsooslNone: begin case AskQuestion('', Format(rsMsgFollowSymlink, [aFile.Name]), [fsourYes, fsourAll, fsourNo, fsourSkipAll], fsourYes, fsourNo) of fsourYes: AddLinkTarget(aFile, CurrentNode); fsourAll: begin FSymLinkOption := fsooslFollow; AddLinkTarget(aFile, CurrentNode); end; fsourNo: AddLink(aFile, CurrentNode); fsourSkipAll: begin FSymLinkOption := fsooslDontFollow; AddLink(aFile, CurrentNode); end; else raise Exception.Create('Invalid user response'); end; end; else raise Exception.Create('Invalid symlink option'); end; end; procedure TFileSystemTreeBuilder.AddItem(aFile: TFile; CurrentNode: TFileTreeNode); var Matches: Boolean; begin if Assigned(FFileTemplate) then begin Matches := CheckFile(FFileTemplate.SearchRecord, FFileChecks, aFile); if Matches and (AFile.IsDirectory or AFile.IsLinkToDirectory) then Matches := CheckDirectoryNameRelative(FFileChecks, aFile.FullPath, FRootDir); if not Matches then begin (CurrentNode.Data as TFileTreeNodeData).SubnodesHaveExclusions := True; Exit; end; end; if aFile.IsDirectory then AddDirectory(aFile, CurrentNode) else if aFile.IsLink then DecideOnLink(aFile, CurrentNode) else AddFile(aFile, CurrentNode); end; procedure TFileSystemTreeBuilder.AddFilesInDirectory( srcPath: String; CurrentNode: TFileTreeNode); var sr: TSearchRecEx; aFile: TFile; begin if FindFirstEx(srcPath + '*', faAnyFile, sr) = 0 then begin repeat if (sr.Name = '.') or (sr.Name = '..') then Continue; aFile := TFileSystemFileSource.CreateFile(srcPath, @sr); AddItem(aFile, CurrentNode); until FindNextEx(sr) <> 0; end; FindCloseEx(sr); end; function TFileSystemTreeBuilder.ReleaseTree: TFileTree; begin Result := FFilesTree; FFilesTree := nil; end; function TFileSystemTreeBuilder.GetItemsCount: Int64; begin Result := FilesCount + DirectoriesCount; end; // ---------------------------------------------------------------------------- constructor TFileSystemOperationHelper.Create(AskQuestionFunction: TAskQuestionFunction; AbortOperationFunction: TAbortOperationFunction; CheckOperationStateFunction: TCheckOperationStateFunction; UpdateStatisticsFunction: TUpdateStatisticsFunction; OperationThread: TThread; Mode: TFileSystemOperationHelperMode; TargetPath: String; StartingStatistics: TFileSourceCopyOperationStatistics); begin AskQuestion := AskQuestionFunction; AbortOperation := AbortOperationFunction; CheckOperationState := CheckOperationStateFunction; UpdateStatistics := UpdateStatisticsFunction; FOperationThread := OperationThread; FMode := Mode; FBufferSize := gCopyBlockSize; GetMem(FBuffer, FBufferSize); FCheckFreeSpace := True; FSkipAllBigFiles := False; FSkipReadError := False; FSkipWriteError := False; FCopyAttributesOptions := CopyAttributesOptionCopyAll; FFileExistsOption := fsoofeNone; FDirExistsOption := fsoodeNone; FSetPropertyError := fsoospeNone; FRootTargetPath := TargetPath; FRenameMask := ''; FStatistics := StartingStatistics; FRenamingFiles := False; FRenamingRootDir := False; FRootDir := nil; if gProcessComments then FDescription := TDescription.Create(True) else FDescription := nil; case FMode of fsohmCopy: begin MoveOrCopy := @CopyFile; FLogCaption := rsMsgLogCopy; end; fsohmMove: begin MoveOrCopy := @MoveFile; FLogCaption := rsMsgLogMove; end; else raise Exception.Create('Invalid operation mode'); end; inherited Create; end; destructor TFileSystemOperationHelper.Destroy; begin inherited Destroy; if Assigned(FBuffer) then begin FreeMem(FBuffer); FBuffer := nil; end; if Assigned(FDescription) then begin FDescription.SaveDescription; FreeAndNil(FDescription); end; end; procedure TFileSystemOperationHelper.Initialize; begin SplitFileMask(FRenameMask, FRenameNameMask, FRenameExtMask); // Create destination path if it doesn't exist. if not mbDirectoryExists(FRootTargetPath) then if not mbForceDirectory(FRootTargetPath) then Exit; // do error end; procedure TFileSystemOperationHelper.ProcessTree(aFileTree: TFileTree); var aFile: TFile; begin FRenamingFiles := (FRenameMask <> '*.*') and (FRenameMask <> ''); // If there is a single root dir and rename mask doesn't have wildcards // treat is as a rename of the root dir. if (aFileTree.SubNodesCount = 1) and FRenamingFiles then begin aFile := aFileTree.SubNodes[0].TheFile; if (aFile.IsDirectory or aFile.IsLinkToDirectory) and not ContainsWildcards(FRenameMask) then begin FRenamingFiles := False; FRenamingRootDir := True; FRootDir := aFile; end; end; ProcessNode(aFileTree, FRootTargetPath); end; // ---------------------------------------------------------------------------- function TFileSystemOperationHelper.CopyFile( SourceFile: TFile; TargetFileName: String; Mode: TFileSystemOperationHelperCopyMode): Boolean; var SourceFileStream, TargetFileStream: TFileStreamEx; iTotalDiskSize, iFreeDiskSize: Int64; bRetryRead, bRetryWrite: Boolean; BytesRead, BytesToRead, BytesWrittenTry, BytesWritten: Int64; TotalBytesToRead: Int64 = 0; NewPos: Int64; DeleteFile: Boolean = False; procedure OpenSourceFile; var bRetry: Boolean = True; begin while bRetry do begin bRetry := False; SourceFileStream.Free; // In case stream was created but 'while' loop run again try SourceFileStream := TFileStreamEx.Create(SourceFile.FullPath, fmOpenRead or fmShareDenyNone); except on EFOpenError do begin if not FSkipOpenForReadingError then begin case AskQuestion(rsMsgErrEOpen + ': ' + SourceFile.FullPath, '', [fsourRetry, fsourSkip, fsourSkipAll, fsourAbort], fsourRetry, fsourSkip) of fsourRetry: bRetry := True; fsourAbort: AbortOperation; fsourSkip: ; // Do nothing fsourSkipAll: FSkipOpenForReadingError := True; end; end; end; end; end; if not Assigned(SourceFileStream) and (log_errors in gLogOptions) then logWrite(FOperationThread, rsMsgLogError + rsMsgErrEOpen + ': ' + SourceFile.FullPath, lmtError, True); end; procedure OpenTargetFile; function GetMsgByMode: String; begin if Mode in [fsohcmAppend, fsohcmResume] then Result := rsMsgErrEOpen else Result := rsMsgErrECreate; end; function HandleError: Boolean; begin Result := False; if not FSkipOpenForWritingError then begin case AskQuestion(GetMsgByMode + ': ' + TargetFileName, '', [fsourRetry, fsourSkip, fsourSkipAll, fsourAbort], fsourRetry, fsourSkip) of fsourRetry: Result := True; fsourAbort: AbortOperation; fsourSkip: ; // Do nothing fsourSkipAll: FSkipOpenForWritingError := True; end; end; end; var bRetry: Boolean = True; begin while bRetry do begin bRetry := False; try TargetFileStream.Free; // In case stream was created but 'while' loop run again case Mode of fsohcmAppend: begin TargetFileStream := TFileStreamEx.Create(TargetFileName, fmOpenReadWrite); TargetFileStream.Seek(0, soFromEnd); // seek to end TotalBytesToRead := SourceFileStream.Size; end; fsohcmResume: begin TargetFileStream := TFileStreamEx.Create(TargetFileName, fmOpenReadWrite); NewPos := TargetFileStream.Seek(0, soFromEnd); SourceFileStream.Seek(NewPos, soFromBeginning); TotalBytesToRead := SourceFileStream.Size - NewPos; end else begin TargetFileStream := TFileStreamEx.Create(TargetFileName, fmCreate); TotalBytesToRead := SourceFileStream.Size; if FReserveSpace then begin TargetFileStream.Size:= SourceFileStream.Size; TargetFileStream.Seek(0, fsFromBeginning); end; end; end; except on EFOpenError do bRetry := HandleError; on EFCreateError do bRetry := HandleError; end; end; if not Assigned(TargetFileStream) and (log_errors in gLogOptions) then logWrite(FOperationThread, rsMsgLogError + GetMsgByMode + ': ' + TargetFileName, lmtError, True); end; begin Result := False; { Check disk free space } if FCheckFreeSpace = True then begin GetDiskFreeSpace(ExtractFilePath(TargetFileName), iFreeDiskSize, iTotalDiskSize); if SourceFile.Size > iFreeDiskSize then begin if FSkipAllBigFiles = True then begin Exit; end else begin case AskQuestion('', rsMsgNoFreeSpaceCont, [fsourYes, fsourAll, fsourNo, fsourSkip, fsourSkipAll], fsourYes, fsourNo) of fsourNo: AbortOperation; fsourSkip: Exit; fsourAll: FCheckFreeSpace := False; fsourSkipAll: begin FSkipAllBigFiles := True; Exit; end; end; end; end; end; BytesToRead := FBufferSize; SourceFileStream := nil; TargetFileStream := nil; // for safety exception handling try try OpenSourceFile; if not Assigned(SourceFileStream) then Exit; OpenTargetFile; if not Assigned(TargetFileStream) then Exit; while TotalBytesToRead > 0 do begin // Without the following line the reading is very slow // if it tries to read past end of file. if TotalBytesToRead < BytesToRead then BytesToRead := TotalBytesToRead; repeat try bRetryRead := False; BytesRead := SourceFileStream.Read(FBuffer^, BytesToRead); if (BytesRead = 0) then Raise EReadError.Create(mbSysErrorMessage(GetLastOSError)); TotalBytesToRead := TotalBytesToRead - BytesRead; BytesWritten := 0; repeat try bRetryWrite := False; BytesWrittenTry := TargetFileStream.Write((FBuffer + BytesWritten)^, BytesRead); BytesWritten := BytesWritten + BytesWrittenTry; if BytesWrittenTry = 0 then begin Raise EWriteError.Create(mbSysErrorMessage(GetLastOSError)); end else if BytesWritten < BytesRead then begin bRetryWrite := True; // repeat and try to write the rest end; except on E: EWriteError do begin { Check disk free space } GetDiskFreeSpace(ExtractFilePath(TargetFileName), iFreeDiskSize, iTotalDiskSize); if BytesRead > iFreeDiskSize then begin case AskQuestion(rsMsgNoFreeSpaceRetry, '', [fsourYes, fsourNo, fsourSkip], fsourYes, fsourNo) of fsourYes: bRetryWrite := True; fsourNo: AbortOperation; fsourSkip: Exit; end; // case end else begin DeleteFile := FSkipWriteError and not (Mode in [fsohcmAppend, fsohcmResume]); if FSkipWriteError then Exit; case AskQuestion(rsMsgErrEWrite + ' ' + TargetFileName + ':', E.Message, [fsourRetry, fsourSkip, fsourSkipAll, fsourAbort], fsourRetry, fsourSkip) of fsourRetry: bRetryWrite := True; fsourAbort: AbortOperation; fsourSkip: Exit; fsourSkipAll: begin DeleteFile := not (Mode in [fsohcmAppend, fsohcmResume]); FSkipWriteError := True; Exit; end; end; // case end; end; // on do end; // except until not bRetryWrite; except on E: EReadError do begin DeleteFile := FSkipReadError and not (Mode in [fsohcmAppend, fsohcmResume]); if FSkipReadError then Exit; case AskQuestion(rsMsgErrERead + ' ' + SourceFile.FullPath + ':', E.Message, [fsourRetry, fsourSkip, fsourSkipAll, fsourAbort], fsourRetry, fsourSkip) of fsourRetry: bRetryRead := True; fsourAbort: AbortOperation; fsourSkip: Exit; fsourSkipAll: begin DeleteFile := not (Mode in [fsohcmAppend, fsohcmResume]); FSkipReadError := True; Exit; end; end; // case end; end; until not bRetryRead; with FStatistics do begin CurrentFileDoneBytes := CurrentFileDoneBytes + BytesRead; DoneBytes := DoneBytes + BytesRead; UpdateStatistics(FStatistics); end; CheckOperationState; // check pause and stop end;//while Result:= True; except on EFileSourceOperationAborting do begin // Always delete file when user aborted operation. DeleteFile := True; raise; end; end; finally FreeAndNil(SourceFileStream); if Assigned(TargetFileStream) then begin FreeAndNil(TargetFileStream); if TotalBytesToRead > 0 then begin // There was some error, because not all of the file has been copied. // Ask if delete the not completed target file. if DeleteFile or (AskQuestion('', rsMsgDeletePartiallyCopied, [fsourYes, fsourNo], fsourYes, fsourNo) = fsourYes) then begin mbDeleteFile(TargetFileName); end; end; end; end; CopyProperties(SourceFile.FullPath, TargetFileName); end; procedure TFileSystemOperationHelper.CopyProperties(SourceFileName, TargetFileName: String); var CopyAttrResult: TCopyAttributesOptions; Msg: String = ''; begin if FCopyAttributesOptions <> [] then begin CopyAttrResult := mbFileCopyAttr(SourceFileName, TargetFileName, FCopyAttributesOptions); if CopyAttrResult <> [] then begin case FSetPropertyError of fsoospeIgnoreErrors: ; // Do nothing fsoospeDontSet: FCopyAttributesOptions := FCopyAttributesOptions - CopyAttrResult; fsoospeNone: begin if caoCopyAttributes in CopyAttrResult then AddStrWithSep(Msg, Format(rsMsgErrSetAttribute, [SourceFileName]), LineEnding); if caoCopyTime in CopyAttrResult then AddStrWithSep(Msg, Format(rsMsgErrSetDateTime, [SourceFileName]), LineEnding); if caoCopyOwnership in CopyAttrResult then AddStrWithSep(Msg, Format(rsMsgErrSetOwnership, [SourceFileName]), LineEnding); case AskQuestion(Msg, '', [fsourSkip, fsourSkipAll, fsourIgnoreAll, fsourAbort], fsourSkip, fsourIgnoreAll) of //fsourSkip: do nothing fsourSkipAll: // Don't set properties that failed to be set anymore. FCopyAttributesOptions := FCopyAttributesOptions - CopyAttrResult; fsourIgnoreAll: FSetPropertyError := fsoospeIgnoreErrors; fsourAbort: AbortOperation; end; end else Assert(False, 'Invalid TFileSourceOperationOptionSetPropertyError value.'); end; end; end; end; function TFileSystemOperationHelper.MoveFile(SourceFile: TFile; TargetFileName: String; Mode: TFileSystemOperationHelperCopyMode): Boolean; begin if (Mode in [fsohcmAppend, fsohcmResume]) or (not mbRenameFile(SourceFile.FullPath, TargetFileName)) then begin if CopyFile(SourceFile, TargetFileName, Mode) then begin if FileIsReadOnly(SourceFile.Attributes) then mbFileSetReadOnly(SourceFile.FullPath, False); Result := mbDeleteFile(SourceFile.FullPath) end else Result := False; end else Result := True; end; function TFileSystemOperationHelper.ProcessNode(aFileTreeNode: TFileTreeNode; CurrentTargetPath: String): Boolean; var aFile: TFile; ProcessedOk: Boolean; TargetName: String; CurrentFileIndex: Integer; CurrentSubNode: TFileTreeNode; begin Result := True; for CurrentFileIndex := 0 to aFileTreeNode.SubNodesCount - 1 do begin CurrentSubNode := aFileTreeNode.SubNodes[CurrentFileIndex]; aFile := CurrentSubNode.TheFile; if FRenamingRootDir and (aFile = FRootDir) then TargetName := CurrentTargetPath + FRenameMask else if FRenamingFiles then TargetName := CurrentTargetPath + ApplyRenameMask(aFile, FRenameNameMask, FRenameExtMask) else TargetName := CurrentTargetPath + aFile.Name; with FStatistics do begin CurrentFileFrom := aFile.FullPath; CurrentFileTo := TargetName; CurrentFileTotalBytes := aFile.Size; CurrentFileDoneBytes := 0; end; UpdateStatistics(FStatistics); // Check if moving to the same file. if mbSameFile(TargetName, aFile.FullPath) then begin if (FMode = fsohmCopy) and FAutoRenameItSelf then TargetName := GetNextCopyName(TargetName) else case AskQuestion(Format(rsMsgCanNotCopyMoveItSelf, [TargetName]), '', [fsourAbort, fsourSkip], fsourAbort, fsourSkip) of fsourAbort: AbortOperation(); else begin Result := False; CountStatistics(CurrentSubNode); CheckOperationState; Continue; end; end; end; if aFile.IsDirectory then ProcessedOk := ProcessDirectory(CurrentSubNode, TargetName) else if aFile.IsLink then ProcessedOk := ProcessLink(CurrentSubNode, TargetName) else ProcessedOk := ProcessFile(CurrentSubNode, TargetName); if not ProcessedOk then Result := False; CheckOperationState; end; end; function TFileSystemOperationHelper.ProcessDirectory(aNode: TFileTreeNode; AbsoluteTargetFileName: String): Boolean; var bRemoveDirectory: Boolean; NodeData: TFileTreeNodeData; begin NodeData := aNode.Data as TFileTreeNodeData; // If some files will not be moved then source directory cannot be deleted. bRemoveDirectory := (FMode = fsohmMove) and (NodeData.SubnodesHaveExclusions = False); case TargetExists(aNode, AbsoluteTargetFileName) of fsoterSkip: begin Result := False; CountStatistics(aNode); end; fsoterDeleted, fsoterNotExists: begin // Try moving whole directory tree. It can be done only if we don't have // to process each subnode: if there are no links, or they're not being // processed, if the files are not being renamed or excluded. if (FMode = fsohmMove) and (not FRenamingFiles) and ((FCorrectSymlinks = False) or (NodeData.SubnodesHaveLinks = False)) and (NodeData.SubnodesHaveExclusions = False) and mbRenameFile(aNode.TheFile.FullPath, AbsoluteTargetFileName) then begin // Success. CountStatistics(aNode); Result := True; bRemoveDirectory := False; end else begin // Create target directory. if mbCreateDir(AbsoluteTargetFileName) then begin // Copy/Move all files inside. Result := ProcessNode(aNode, IncludeTrailingPathDelimiter(AbsoluteTargetFileName)); // Copy attributes after copy/move directory contents, because this operation can change date/time CopyProperties(aNode.TheFile.FullPath, AbsoluteTargetFileName); end else begin // Error - all files inside not copied/moved. ShowError(rsMsgLogError + Format(rsMsgErrForceDir, [AbsoluteTargetFileName])); Result := False; CountStatistics(aNode); end; end; end; fsoterAddToTarget: begin // Don't create existing directory, but copy files into it. Result := ProcessNode(aNode, IncludeTrailingPathDelimiter(AbsoluteTargetFileName)); end; else raise Exception.Create('Invalid TargetExists result'); end; if bRemoveDirectory and Result then begin if FileIsReadOnly(aNode.TheFile.Attributes) then mbFileSetReadOnly(aNode.TheFile.FullPath, False); mbRemoveDir(aNode.TheFile.FullPath); end; end; function TFileSystemOperationHelper.ProcessLink(aNode: TFileTreeNode; AbsoluteTargetFileName: String): Boolean; var LinkTarget, CorrectedLink: String; aFile: TFile; aSubNode: TFileTreeNode; begin Result := True; // If link was followed then it's target is stored in a subnode. if aNode.SubNodesCount > 0 then begin aSubNode := aNode.SubNodes[0]; //DCDebug('Link ' + aFile.FullPath + ' followed to ' // + (aSubNode.TheFile as TFileSystemFile).FullPath // + ' will be copied as: ' + AbsoluteTargetFileName); if aSubNode.TheFile.AttributesProperty.IsDirectory then Result := ProcessDirectory(aSubNode, AbsoluteTargetFileName) else Result := ProcessFile(aSubNode, AbsoluteTargetFileName); Exit; // exit without counting statistics, because they are not counted for followed links end; aFile := aNode.TheFile; case TargetExists(aNode, AbsoluteTargetFileName) of fsoterSkip: Result := False; fsoterDeleted, fsoterNotExists: begin if (FMode <> fsohmMove) or (not mbRenameFile(aFile.FullPath, AbsoluteTargetFileName)) then begin LinkTarget := ReadSymLink(aFile.FullPath); // use sLinkTo ? if LinkTarget <> '' then begin if FCorrectSymlinks then begin CorrectedLink := GetAbsoluteFileName(aFile.Path, LinkTarget); // If the link was relative - make also the corrected link relative. if GetPathType(LinkTarget) = ptRelative then LinkTarget := ExtractRelativepath(AbsoluteTargetFileName, CorrectedLink) else LinkTarget := CorrectedLink; end; if CreateSymlink(LinkTarget, AbsoluteTargetFileName) then begin CopyProperties(aFile.FullPath, AbsoluteTargetFileName); end else begin ShowError(rsMsgLogError + Format(rsMsgLogSymLink, [AbsoluteTargetFileName])); Result := False; end; end else begin DCDebug('Error reading link'); Result := False; end; end; end; fsoterAddToTarget: raise Exception.Create('Cannot add to link'); else raise Exception.Create('Invalid TargetExists result'); end; Inc(FStatistics.DoneFiles); UpdateStatistics(FStatistics); end; function TFileSystemOperationHelper.ProcessFile(aNode: TFileTreeNode; AbsoluteTargetFileName: String): Boolean; var OldDoneBytes: Int64; // for if there was an error begin Result:= False; // If there will be an error the DoneBytes value // will be inconsistent, so remember it here. OldDoneBytes := FStatistics.DoneBytes; if (aNode.TheFile.Size > GetDiskMaxFileSize(ExtractFileDir(AbsoluteTargetFileName))) then case AskQuestion('', Format(rsMsgFileSizeTooBig, [aNode.TheFile.Name]), [fsourSkip, fsourAbort], fsourSkip, fsourAbort) of fsourSkip: Result := False; else AbortOperation; end else case TargetExists(aNode, AbsoluteTargetFileName) of fsoterSkip: Result := False; fsoterDeleted, fsoterNotExists: Result := MoveOrCopy(aNode.TheFile, AbsoluteTargetFileName, fsohcmDefault); fsoterAddToTarget: Result := MoveOrCopy(aNode.TheFile, AbsoluteTargetFileName, fsohcmAppend); fsoterResume: Result := MoveOrCopy(aNode.TheFile, AbsoluteTargetFileName, fsohcmResume); else raise Exception.Create('Invalid TargetExists result'); end; if Result = True then begin LogMessage(Format(rsMsgLogSuccess+FLogCaption, [aNode.TheFile.FullPath + ' -> ' + AbsoluteTargetFileName]), [log_cp_mv_ln], lmtSuccess); // process comments if need if gProcessComments then begin case FMode of fsohmCopy: FDescription.CopyDescription(aNode.TheFile.FullPath, AbsoluteTargetFileName); fsohmMove: FDescription.MoveDescription(aNode.TheFile.FullPath, AbsoluteTargetFileName); end; end; end else begin LogMessage(Format(rsMsgLogError+FLogCaption, [aNode.TheFile.FullPath + ' -> ' + AbsoluteTargetFileName]), [log_cp_mv_ln], lmtError); end; with FStatistics do begin DoneFiles := DoneFiles + 1; DoneBytes := OldDoneBytes + aNode.TheFile.Size; UpdateStatistics(FStatistics); end; end; // ---------------------------------------------------------------------------- function TFileSystemOperationHelper.TargetExists( aNode: TFileTreeNode; AbsoluteTargetFileName: String): TFileSystemOperationTargetExistsResult; var Attrs, LinkTargetAttrs: TFileAttrs; SourceFile: TFile; function DoDirectoryExists(AllowCopyInto: Boolean; AllowDeleteDirectory: Boolean): TFileSystemOperationTargetExistsResult; begin case DirExists(SourceFile, AbsoluteTargetFileName, AllowCopyInto, AllowDeleteDirectory) of fsoodeSkip: Exit(fsoterSkip); fsoodeDelete: begin if FPS_ISLNK(Attrs) then mbDeleteFile(AbsoluteTargetFileName) else DelTree(AbsoluteTargetFileName); Exit(fsoterDeleted); end; fsoodeCopyInto: begin Exit(fsoterAddToTarget); end; else raise Exception.Create('Invalid dir exists option'); end; end; function DoFileExists(AllowAppend: Boolean): TFileSystemOperationTargetExistsResult; begin case FileExists(SourceFile, AbsoluteTargetFileName, AllowAppend) of fsoofeSkip: Exit(fsoterSkip); fsoofeOverwrite: begin if FileIsReadOnly(Attrs) then mbFileSetReadOnly(AbsoluteTargetFileName, False); if FPS_ISLNK(Attrs) or (FMode = fsohmMove) then begin mbDeleteFile(AbsoluteTargetFileName); Exit(fsoterDeleted); end; Exit(fsoterNotExists); end; fsoofeAppend: begin Exit(fsoterAddToTarget); end; fsoofeResume: begin Exit(fsoterResume); end; else raise Exception.Create('Invalid file exists option'); end; end; function IsLinkFollowed: Boolean; begin // If link was followed then it's target is stored in a subnode. Result := SourceFile.AttributesProperty.IsLink and (aNode.SubNodesCount > 0); end; function AllowAppendFile: Boolean; begin Result := (not SourceFile.AttributesProperty.IsDirectory) and (not FReserveSpace) and ((not SourceFile.AttributesProperty.IsLink) or (IsLinkFollowed and (not aNode.SubNodes[0].TheFile.AttributesProperty.IsDirectory))); end; function AllowCopyInto: Boolean; begin Result := SourceFile.AttributesProperty.IsDirectory or (IsLinkFollowed and aNode.SubNodes[0].TheFile.IsDirectory); end; function AllowDeleteDirectory: Boolean; begin Result := (not (SourceFile.AttributesProperty.IsDirectory or (IsLinkFollowed and aNode.SubNodes[0].TheFile.IsDirectory))) or gOverwriteFolder; end; begin Attrs := mbFileGetAttr(AbsoluteTargetFileName); if Attrs <> faInvalidAttributes then begin SourceFile := aNode.TheFile; // Target exists - ask user what to do. if FPS_ISDIR(Attrs) then begin Result := DoDirectoryExists(AllowCopyInto, AllowDeleteDirectory) end else if FPS_ISLNK(Attrs) then begin // Check if target of the link exists. LinkTargetAttrs := mbFileGetAttrNoLinks(AbsoluteTargetFileName); if (LinkTargetAttrs <> faInvalidAttributes) then begin if FPS_ISDIR(LinkTargetAttrs) then Result := DoDirectoryExists(AllowCopyInto, AllowDeleteDirectory) else Result := DoFileExists(AllowAppendFile); end else // Target of link doesn't exist. Treat link as file and don't allow append. Result := DoFileExists(False); end else // Existing target is a file. Result := DoFileExists(AllowAppendFile); end else Result := fsoterNotExists; end; function TFileSystemOperationHelper.DirExists( aFile: TFile; AbsoluteTargetFileName: String; AllowCopyInto: Boolean; AllowDelete: Boolean): TFileSourceOperationOptionDirectoryExists; var PossibleResponses: array of TFileSourceOperationUIResponse = nil; DefaultOkResponse: TFileSourceOperationUIResponse; procedure AddResponse(Response: TFileSourceOperationUIResponse); begin SetLength(PossibleResponses, Length(PossibleResponses) + 1); PossibleResponses[Length(PossibleResponses) - 1] := Response; end; begin case FDirExistsOption of fsoodeNone: begin if AllowDelete then AddResponse(fsourOverwrite); if AllowCopyInto then begin AddResponse(fsourCopyInto); AddResponse(fsourCopyIntoAll); end; AddResponse(fsourSkip); if AllowDelete then AddResponse(fsourOverwriteAll); AddResponse(fsourSkipAll); AddResponse(fsourCancel); if AllowCopyInto then DefaultOkResponse := fsourCopyInto else if AllowDelete then DefaultOkResponse := fsourOverwrite else DefaultOkResponse := fsourSkip; case AskQuestion(Format(rsMsgFolderExistsRwrt, [AbsoluteTargetFileName]), '', PossibleResponses, DefaultOkResponse, fsourSkip) of fsourOverwrite: Result := fsoodeDelete; fsourCopyInto: Result := fsoodeCopyInto; fsourCopyIntoAll: begin FDirExistsOption := fsoodeCopyInto; Result := fsoodeCopyInto; end; fsourSkip: Result := fsoodeSkip; fsourOverwriteAll: begin FDirExistsOption := fsoodeDelete; Result := fsoodeDelete; end; fsourSkipAll: begin FDirExistsOption := fsoodeSkip; Result := fsoodeSkip; end; fsourNone, fsourCancel: AbortOperation; end; end; else Result := FDirExistsOption; end; end; function TFileSystemOperationHelper.FileExists( aFile: TFile; AbsoluteTargetFileName: String; AllowAppend: Boolean): TFileSourceOperationOptionFileExists; const Responses: array[0..7] of TFileSourceOperationUIResponse = (fsourOverwrite, fsourSkip, fsourAppend, fsourOverwriteAll, fsourSkipAll, fsourResume, fsourOverwriteOlder, fsourCancel); ResponsesNoAppend: array[0..5] of TFileSourceOperationUIResponse = (fsourOverwrite, fsourSkip, fsourOverwriteAll, fsourSkipAll, fsourOverwriteOlder, fsourCancel); var PossibleResponses: array of TFileSourceOperationUIResponse; function OverwriteOlder: TFileSourceOperationOptionFileExists; begin if aFile.ModificationTime > FileTimeToDateTime(mbFileAge(AbsoluteTargetFileName)) then Result := fsoofeOverwrite else Result := fsoofeSkip; end; begin case FFileExistsOption of fsoofeNone: begin case AllowAppend of True : PossibleResponses := Responses; False: PossibleResponses := ResponsesNoAppend; end; case AskQuestion(Format(rsMsgFileExistsRwrt, [AbsoluteTargetFileName]), '', PossibleResponses, fsourOverwrite, fsourSkip) of fsourOverwrite: Result := fsoofeOverwrite; fsourSkip: Result := fsoofeSkip; fsourAppend: begin //FFileExistsOption := fsoofeAppend; - for AppendAll Result := fsoofeAppend; end; fsourResume: begin Result := fsoofeResume; end; fsourOverwriteAll: begin FFileExistsOption := fsoofeOverwrite; Result := fsoofeOverwrite; end; fsourSkipAll: begin FFileExistsOption := fsoofeSkip; Result := fsoofeSkip; end; fsourOverwriteOlder: begin FFileExistsOption := fsoofeOverwriteOlder; Result:= OverwriteOlder; end; fsourNone, fsourCancel: AbortOperation; end; end; fsoofeOverwriteOlder: begin Result:= OverwriteOlder; end; else Result := FFileExistsOption; end; end; procedure TFileSystemOperationHelper.ShowError(sMessage: String); begin if gSkipFileOpError then begin if log_errors in gLogOptions then logWrite(FOperationThread, sMessage, lmtError, True); end else begin if AskQuestion(sMessage, '', [fsourSkip, fsourAbort], fsourSkip, fsourAbort) <> fsourSkip then begin AbortOperation; end; end; end; procedure TFileSystemOperationHelper.LogMessage(sMessage: String; logOptions: TLogOptions; logMsgType: TLogMsgType); begin case logMsgType of lmtError: if not (log_errors in gLogOptions) then Exit; lmtInfo: if not (log_info in gLogOptions) then Exit; lmtSuccess: if not (log_success in gLogOptions) then Exit; end; if logOptions <= gLogOptions then begin logWrite(FOperationThread, sMessage, logMsgType); end; end; procedure TFileSystemOperationHelper.CountStatistics(aNode: TFileTreeNode); procedure CountNodeStatistics(aNode: TFileTreeNode); var aFileAttrs: TFileAttributesProperty; i: Integer; begin aFileAttrs := aNode.TheFile.AttributesProperty; with FStatistics do begin if aFileAttrs.IsDirectory then begin // No statistics for directory. // Go through subdirectories. for i := 0 to aNode.SubNodesCount - 1 do CountNodeStatistics(aNode.SubNodes[i]); end else if aFileAttrs.IsLink then begin // Count only not-followed links. if aNode.SubNodesCount = 0 then DoneFiles := DoneFiles + 1 else // Count target of link. CountNodeStatistics(aNode.SubNodes[0]); end else begin // Count files. DoneFiles := DoneFiles + 1; DoneBytes := DoneBytes + aNode.TheFile.Size; end; end; end; begin CountNodeStatistics(aNode); UpdateStatistics(FStatistics); end; end. doublecmd-0.5.8/src/filesources/ufilesourceexecuteoperation.pas0000644000175000017500000000707111747211345024170 0ustar alexxalexxunit uFileSourceExecuteOperation; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceOperation, uFileSourceOperationTypes, uFileSource, uFile; type TFileSourceExecuteOperationResult = (fseorSuccess, // fseorCancelled then FFileSource.Reload(FCurrentPath); end; function TFileSourceExecuteOperation.GetDescription(Details: TFileSourceOperationDescriptionDetails): String; begin case Details of fsoddJobAndTarget: Result := Format(rsOperExecutingSomething, [ExecutableFile.Name]); else Result := rsOperExecuting; end; end; end. doublecmd-0.5.8/src/filesources/ulocalfilesource.pas0000644000175000017500000000062411747211345021674 0ustar alexxalexxunit uLocalFileSource; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uRealFileSource; type ILocalFileSource = interface(IRealFileSource) end; {en Base for classes of local file sources. Empty placeholder for now, allows to check whether a certain file source is local. } TLocalFileSource = class(TRealFileSource, ILocalFileSource) end; implementation end. doublecmd-0.5.8/src/filesources/ufilesourceoperationmessageboxesui.pas0000644000175000017500000000505411747211345025550 0ustar alexxalexxunit uFileSourceOperationMessageBoxesUI; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileSourceOperationUI; type {en We assume here the UI is used only from the GUI thread. } TFileSourceOperationMessageBoxesUI = class(TFileSourceOperationUI) public constructor Create; override; destructor Destroy; override; function AskQuestion(Msg: String; Question: String; PossibleResponses: array of TFileSourceOperationUIResponse; DefaultOKResponse: TFileSourceOperationUIResponse; DefaultCancelResponse: TFileSourceOperationUIResponse ) : TFileSourceOperationUIResponse; override; end; implementation uses uShowMsg; const ResponseToButton: array[TFileSourceOperationUIResponse] of TMyMsgButton = (msmbOK, msmbOK, msmbNo, msmbYes, msmbCancel, msmbNone, msmbAppend, msmbResume, msmbCopyInto, msmbCopyIntoAll, msmbOverwrite, msmbOverwriteAll, msmbOverwriteOlder, msmbSkip, msmbSkipAll, msmbIgnoreAll, msmbAll, msmbRetry, msmbAbort); ResultToResponse: array[TMyMsgResult] of TFileSourceOperationUIResponse = (fsourOk, fsourNo, fsourYes, fsourCancel, fsourNone, fsourAppend, fsourResume, fsourCopyInto, fsourCopyIntoAll, fsourOverwrite, fsourOverwriteAll, fsourOverwriteOlder, fsourSkip, fsourSkipAll, fsourIgnoreAll, fsourAll, fsourRetry, fsourAbort); constructor TFileSourceOperationMessageBoxesUI.Create; begin inherited; end; destructor TFileSourceOperationMessageBoxesUI.Destroy; begin inherited; end; function TFileSourceOperationMessageBoxesUI.AskQuestion( Msg: String; Question: String; PossibleResponses: array of TFileSourceOperationUIResponse; DefaultOKResponse: TFileSourceOperationUIResponse; DefaultCancelResponse: TFileSourceOperationUIResponse ) : TFileSourceOperationUIResponse; var Buttons: array of TMyMsgButton; i: Integer; MsgResult: TMyMsgResult; TextMessage: String; begin SetLength(Buttons, Length(PossibleResponses)); for i := 0 to Length(PossibleResponses) - 1 do Buttons[i] := ResponseToButton[PossibleResponses[i]]; TextMessage := Msg; if (Msg <> '') and (Question <> '') then TextMessage := TextMessage { + LineEnding} + ' '; TextMessage := TextMessage + Question; MsgResult := MsgBox(TextMessage, Buttons, ResponseToButton[DefaultOKResponse], ResponseToButton[DefaultCancelResponse]); Result := ResultToResponse[MsgResult]; end; end. doublecmd-0.5.8/src/filesources/uarchivefilesource.pas0000644000175000017500000000376611747211345022235 0ustar alexxalexxunit uArchiveFileSource; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uLocalFileSource, uFileSource, uFile, uFileProperty; type IArchiveFileSource = interface(ILocalFileSource) ['{13A8637C-FFDF-46B0-B5B4-E7C6851C157A}'] {en Full path to the archive on the ParentFileSource. } property ArchiveFileName: String read GetCurrentAddress; end; TArchiveFileSource = class(TLocalFileSource, IArchiveFileSource) protected function GetSupportedFileProperties: TFilePropertiesTypes; override; public {en Creates an archive file source. @param(anArchiveFileSource File source that stores the archive. Usually it will be direct-access file source, like filesystem.) @param(anArchiveFileName Full path to the archive on the ArchiveFileSource.) } constructor Create(anArchiveFileSource: IFileSource; anArchiveFileName: String); virtual reintroduce overload; class function CreateFile(const APath: String): TFile; override; property ArchiveFileName: String read GetCurrentAddress; end; implementation constructor TArchiveFileSource.Create(anArchiveFileSource: IFileSource; anArchiveFileName: String); begin FCurrentAddress := anArchiveFileName; inherited Create; ParentFileSource := anArchiveFileSource; end; class function TArchiveFileSource.CreateFile(const APath: String): TFile; begin Result := TFile.Create(APath); with Result do begin SizeProperty := TFileSizeProperty.Create; CompressedSizeProperty := TFileCompressedSizeProperty.Create; AttributesProperty := TFileAttributesProperty.CreateOSAttributes; ModificationTimeProperty := TFileModificationDateTimeProperty.Create; end; end; function TArchiveFileSource.GetSupportedFileProperties: TFilePropertiesTypes; begin Result := inherited GetSupportedFileProperties + [fpSize, fpCompressedSize, fpAttributes, fpModificationTime]; end; end. doublecmd-0.5.8/src/udescr.pas0000644000175000017500000002722211740427612015300 0ustar alexxalexx{ Double commander ------------------------------------------------------------------------- This unit contains class for working with file comments. Copyright (C) 2008-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uDescr; {$mode objfpc}{$H+} interface uses Classes, SysUtils, DCClassesUtf8; type { TDescription } TDescription = class(TStringListEx) private FLastDescrFile, FEncoding: String; FModified: Boolean; FDestDescr: TDescription; procedure PrepareDescrFile(FileName: String); function GetDescription(Index: Integer): String; function GetDescription(const FileName: String): String; procedure SetDescription(Index: Integer; const AValue: String); procedure SetDescription(const FileName: String; const AValue: String); procedure SetEncoding(const AValue: String); public {en Create TDescription class @param(UseSubDescr @true if need Copy/Move functions) } constructor Create(UseSubDescr: Boolean); {en Destroy TDescription class } destructor Destroy; override; {en Load data from description file } procedure LoadFromFile(const FileName: String); override; {en Save data to description file } procedure SaveToFile(const FileName: String); override; {en Add description for file @param(FileName File name) @param(Descr Description) @returns(Index of added item) } function AddDescription(FileName, Descr: String): Integer; {en Read description by file name @param(FileName File name) @returns(Description of file) } function ReadDescription(FileName: String): String; {en Write description for file @param(FileName File name) @param(Descr Description) } procedure WriteDescription(FileName: String; const Descr: String); {en Delete description by file name @param(FileName File name) @returns(The function returns @true if successful, @false otherwise) } function DeleteDescription(const FileName: String): Boolean; {en Copy description for file @param(FileNameFrom Source file name) @param(FileNameTo Destination file name) @returns(The function returns @true if successful, @false otherwise) } function CopyDescription(const FileNameFrom, FileNameTo: String): Boolean; {en Move description for file @param(FileNameFrom Source file name) @param(FileNameTo Destination file name) @returns(The function returns @true if successful, @false otherwise) } function MoveDescription(const FileNameFrom, FileNameTo: String): Boolean; {en Save all changes to description file } procedure SaveDescription; {$IF (FPC_VERSION > 2) or ((FPC_VERSION = 2) and (FPC_RELEASE >= 5)) or ((FPC_VERSION = 2) and (FPC_RELEASE = 4) and (FPC_PATCH >= 4))} function Find(const S: string; out Index: Integer): Boolean; override; {$ELSE} function Find(const S: string; var Index: Integer): Boolean; override; {$ENDIF} {en File description encoding } property Encoding: String read FEncoding write SetEncoding; {en Get description by file name } property DescrByFileName[const FileName: String]: String read GetDescription write SetDescription; {en Get description by file name index } property DescrByIndex[Index: Integer]: String read GetDescription write SetDescription; end; implementation uses LConvEncoding, uDebug, DCOSUtils; { TDescription } procedure TDescription.PrepareDescrFile(FileName: String); var sDescrFile: String; begin sDescrFile:= ExtractFilePath(FileName) + 'descript.ion'; if sDescrFile <> FLastDescrFile then try // save previous decription file if need if FModified and (FLastDescrFile <> EmptyStr) and (Count > 0) then SaveToFile(FLastDescrFile); // load description file if exists FLastDescrFile:= sDescrFile; if mbFileExists(FLastDescrFile) then begin LoadFromFile(FLastDescrFile); FEncoding:= GuessEncoding(Text); // try to guess encoding if FEncoding = EmptyStr then // by default use UTF-8 FEncoding:= EncodingUTF8; if FEncoding <> EncodingUTF8 then Text:= ConvertEncoding(Text, FEncoding, EncodingUTF8); end; except on E: Exception do DCDebug('TDescription.PrepareDescrFile - ' + E.Message); end; end; {$IF (FPC_VERSION > 2) or ((FPC_VERSION = 2) and (FPC_RELEASE >= 5)) or ((FPC_VERSION = 2) and (FPC_RELEASE = 4) and (FPC_PATCH >= 4))} function TDescription.Find(const S: string; out Index: Integer): Boolean; {$ELSE} function TDescription.Find(const S: string; var Index: Integer): Boolean; {$ENDIF} var iIndex, iPosOfDivider, iLength, iFirstStringPos: Integer; sFileName, sIndexString: String; cSearchChar : Char; begin Result:= False; sFileName:= ExtractFileName(S); //DCDebug('#########################'); //DCDebug('sFileName: '+ sFileName); for iIndex:= Count - 1 downto 0 do begin sIndexString := Self[iIndex]; //DCDebug('Self[I]: '+ sIndexString); //DCDebug('iIndex: '+ IntToStr(iIndex)); //DCDebug('Count: '+ IntToStr(Count)); //DCDebug('Pos(sFileName, Self[I]): '+ IntToStr(Pos(sFileName, sIndexString))); // File comment length iLength := Length(sIndexString); if iLength = 0 then Continue; //at the first, look if first char a " if(sIndexString[1]='"')then begin // YES cSearchChar := '"'; iFirstStringPos := 2; end else begin //NO cSearchChar := ' '; iFirstStringPos := 1; end; // find position of next cSearchChar in sIndexString iPosOfDivider:= 2; while (iPosOfDivider < iLength) do // don't look above the strings length begin // is at this position the cSearchChar? if (sIndexString[iPosOfDivider] = cSearchChar) then begin // YES // found the sFileName in the sIndexString (no more, no less) if mbCompareFileNames(sFileName, Copy(sIndexString, iFirstStringPos, iPosOfDivider-iFirstStringPos)) then begin // YES Index := iIndex; Exit(True); end else begin // NO Break; end; end; Inc(iPosOfDivider); end; end; end; function TDescription.GetDescription(Index: Integer): String; var sLine: String; iDescrStart: Integer; begin sLine:= Self[Index]; if Pos(#34, sLine) <> 1 then begin iDescrStart:= Pos(#32, sLine); Result:= Copy(sLine, iDescrStart+1, Length(sLine) - iDescrStart); end else begin iDescrStart:= Pos(#34#32, sLine); Result:= Copy(sLine, iDescrStart+2, Length(sLine) - iDescrStart); end; end; function TDescription.GetDescription(const FileName: String): String; var I: Integer; begin Result:= ''; if Find(FileName, I) then Result:= GetDescription(I); end; procedure TDescription.SetDescription(Index: Integer; const AValue: String); var sLine, sFileName: String; iDescrStart: Integer; begin FModified:= True; sLine:= Self[Index]; if Pos('"', sLine) <> 1 then begin iDescrStart:= Pos(#32, sLine); sFileName:= Copy(sLine, 1, iDescrStart); Self[Index]:= sFileName + AValue; end else begin iDescrStart:= Pos(#34#32, sLine); sFileName:= Copy(sLine, 1, iDescrStart+1); Self[Index]:= sFileName + AValue; end; end; procedure TDescription.SetDescription(const FileName: String; const AValue: String); var I: Integer; begin if Find(FileName, I) then SetDescription(I, AValue) else AddDescription(FileName, AValue); end; procedure TDescription.SetEncoding(const AValue: String); begin if FEncoding <> AValue then begin FEncoding:= AValue; if mbFileExists(FLastDescrFile) then LoadFromFile(FLastDescrFile); end; end; constructor TDescription.Create(UseSubDescr: Boolean); begin FModified:= False; FEncoding:= EncodingUTF8; // by default if UseSubDescr then FDestDescr:= TDescription.Create(False) else FDestDescr:= nil; inherited Create; end; destructor TDescription.Destroy; begin if Assigned(FDestDescr) then FreeAndNil(FDestDescr); inherited Destroy; end; procedure TDescription.LoadFromFile(const FileName: String); begin FModified:= False; inherited LoadFromFile(FileName); if FEncoding <> EncodingUTF8 then Text:= ConvertEncoding(Text, FEncoding, EncodingUTF8); end; procedure TDescription.SaveToFile(const FileName: String); begin FModified:= False; if FEncoding <> EncodingUTF8 then Text:= ConvertEncoding(Text, EncodingUTF8, FEncoding); inherited SaveToFile(FileName); end; function TDescription.AddDescription(FileName, Descr: String): Integer; begin FModified:= True; FileName:= ExtractFileName(FileName); if Pos(#32, FileName) <> 0 then Result := Add(#34+FileName+#34#32+Descr) else Result := Add(FileName+#32+Descr); end; function TDescription.ReadDescription(FileName: String): String; begin PrepareDescrFile(FileName); Result:= GetDescription(FileName); end; procedure TDescription.WriteDescription(FileName: String; const Descr: String); begin PrepareDescrFile(FileName); SetDescription(FileName, Descr); end; function TDescription.DeleteDescription(const FileName: String): Boolean; var I: Integer; begin Result:= False; PrepareDescrFile(FileName); if Find(FileName, I) then begin Delete(I); FModified:= True; Result:= True; end; end; function TDescription.CopyDescription(const FileNameFrom, FileNameTo: String): Boolean; var I: Integer; begin Result:= False; PrepareDescrFile(FileNameFrom); if Find(FileNameFrom, I) then begin DCDebug(FileNameFrom, '=', DescrByIndex[I]); FDestDescr.WriteDescription(FileNameTo, DescrByIndex[I]); Result:= True; end; end; function TDescription.MoveDescription(const FileNameFrom, FileNameTo: String): Boolean; var I: Integer; begin Result:= False; PrepareDescrFile(FileNameFrom); if Find(FileNameFrom, I) then begin DCDebug(FileNameFrom, '=', DescrByIndex[I]); FDestDescr.WriteDescription(FileNameTo, DescrByIndex[I]); Delete(I); FModified:= True; Result:= True; end; end; procedure TDescription.SaveDescription; begin try if Count > 0 then SaveToFile(FLastDescrFile) else mbDeleteFile(FLastDescrFile); if Assigned(FDestDescr) then FDestDescr.SaveDescription; except on E: Exception do DCDebug('TDescription.SaveDescription - ' + E.Message); end; end; end. doublecmd-0.5.8/src/uparitercontrols.pas0000644000175000017500000002453611655407045017442 0ustar alexxalexx{ Copyright (C) 2004 Flavio Etrusco Copyright (C) 2011 Koblov Alexander (Alexx2000@mail.ru) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } unit uPariterControls; {$mode objfpc}{$H+} interface uses Controls, SysUtils, Classes, SynEditHighlighter, uSynDiffControls, uDiff; const SynSpaceGlyph = Chr($B7); //'·' SynTabGlyph = Chr($BB); //'»' type { TSynDiffHighlighter } TSynDiffHighlighter = class(TSynCustomHighlighter) private fWhitespaceAttribute: TSynHighlighterAttributes; fAddedAttribute: TSynHighlighterAttributes; fRemovedAttribute: TSynHighlighterAttributes; fModifiedAttribute: TSynHighlighterAttributes; fUnmodifiedAttribute: TSynHighlighterAttributes; fDiff: TDiff; fTokens: TStringList; {} fRun: Integer; fTokenPos: Integer; fTokenLen: Integer; fTokenKind: TChangeKind; {} fAddedAttriPointer: TSynHighlighterAttributes; fDefaultAttriPointer: TSynHighlighterAttributes; function GetEditor: TSynDiffEdit; procedure ComputeTokens(const aOldLine, aNewLine: String); protected function GetDefaultAttribute(Index: Integer): TSynHighlighterAttributes; override; public constructor Create(aOwner: TSynDiffEdit); reintroduce; overload; constructor Create(aOwner: TComponent); overload; override; destructor Destroy; override; procedure ResetRange; override; procedure SetLine(const aNewValue: String; aLineNumber: Integer); override; procedure UpdateColors; function GetEol: Boolean; override; function GetToken: String; override; procedure GetTokenEx(out TokenStart: PChar; out TokenLength: Integer); override; function GetTokenAttribute: TSynHighlighterAttributes; override; function GetTokenKind: Integer; override; function GetTokenPos: Integer; override; // 0-based procedure Next; override; property Editor: TSynDiffEdit read GetEditor; end; implementation uses Graphics; { TSynDiffHighlighter } procedure TSynDiffHighlighter.ComputeTokens(const aOldLine, aNewLine: String); const skipChar = #10; var I: Integer; lastKind: TChangeKind; lastToken: String; procedure AddTokenIfNeed(Symbol: Char; Kind: TChangeKind); begin if (Kind = lastKind) then // Same Kind, no need to change colors begin if Symbol = skipChar then lastToken:= #32 else lastToken := lastToken + Symbol; end else begin fTokens.AddObject(lastToken, TObject(PtrInt(lastKind))); if Symbol = skipChar then lastToken:= #32 else lastToken := Symbol; lastKind := Kind; end; end; begin // Compare lines if not Assigned(Editor.OriginalFile) then // Original file fDiff.Execute(PChar(aNewLine), PChar(aOldLine), Length(aNewLine), Length(aOldLine)) else if not Assigned(Editor.ModifiedFile) then // Modified file fDiff.Execute(PChar(aOldLine), PChar(aNewLine), Length(aOldLine), Length(aNewLine)); // Prepare diffs to display lastKind := ckNone; lastToken:= EmptyStr; for I := 0 to fDiff.Count - 1 do with fDiff.Compares[I] do begin if not Assigned(Editor.OriginalFile) then // Original file begin // Show changes for original file // with spaces for adds to align with modified file if Kind = ckAdd then AddTokenIfNeed(skipChar, Kind) else AddTokenIfNeed(chr1, Kind); end else if not Assigned(Editor.ModifiedFile) then // Modified file begin // Show changes for modified file // with spaces for deletes to align with original file if Kind = ckDelete then AddTokenIfNeed(skipChar, Kind) else AddTokenIfNeed(chr2, Kind); end; end; // Add last token fTokens.AddObject(lastToken, TObject(PtrInt(lastKind))); end; constructor TSynDiffHighlighter.Create(aOwner: TComponent); begin Create(aOwner as TSynDiffEdit); end; constructor TSynDiffHighlighter.Create(aOwner: TSynDiffEdit); begin inherited Create(aOwner); fDiff := TDiff.Create(Self); {} fWhitespaceAttribute := TSynHighlighterAttributes.Create('Whitespace'); AddAttribute(fWhitespaceAttribute); {} fAddedAttribute := TSynHighlighterAttributes.Create('Added'); fAddedAttribute.Style := [fsBold]; AddAttribute(fAddedAttribute); {} fRemovedAttribute := TSynHighlighterAttributes.Create('Removed'); fRemovedAttribute.Style := [fsBold]; AddAttribute(fRemovedAttribute); {} fModifiedAttribute := TSynHighlighterAttributes.Create('Modified'); fModifiedAttribute.Style := [fsBold]; AddAttribute(fModifiedAttribute); {} fUnmodifiedAttribute := TSynHighlighterAttributes.Create('Unmodified'); AddAttribute(fUnmodifiedAttribute); {} UpdateColors; SetAttributesOnChange(@DefHighlightChange); fTokens := TStringList.Create; end; destructor TSynDiffHighlighter.Destroy; begin inherited Destroy; fTokens.Free; end; function TSynDiffHighlighter.GetEditor: TSynDiffEdit; begin Result := TSynDiffEdit(inherited Owner); end; function TSynDiffHighlighter.GetDefaultAttribute(Index: Integer): TSynHighlighterAttributes; begin if Index = SYN_ATTR_WHITESPACE then Result := fDefaultAttriPointer else Result := nil; end; function TSynDiffHighlighter.GetEol: Boolean; begin Result := (fTokenLen = 0); end; function TSynDiffHighlighter.GetToken: String; var cChar: Integer; begin Result := fTokens[fRun]; if (Editor.PaintStyle = psForeground) and (fTokenKind <> ckNone) then for cChar := 1 to Length(Result) do if Result[cChar] = #32 then Result[cChar] := SynSpaceGlyph else if Result[cChar] = #9 then Result[cChar] := SynTabGlyph; end; function TSynDiffHighlighter.GetTokenAttribute: TSynHighlighterAttributes; begin case fTokenKind of ckAdd: Result := fAddedAttriPointer; ckModify: Result := fModifiedAttribute; ckDelete: Result := fAddedAttriPointer; else Result := fDefaultAttriPointer; end; end; function TSynDiffHighlighter.GetTokenKind: integer; begin Result := Ord(fTokenKind); end; procedure TSynDiffHighlighter.GetTokenEx(out TokenStart: PChar; out TokenLength: integer); begin TokenLength:= fTokenLen; if TokenLength > 0 then TokenStart:= PChar(fTokens[fRun]) else TokenStart:= nil; end; function TSynDiffHighlighter.GetTokenPos: Integer; begin Result := fTokenPos; end; procedure TSynDiffHighlighter.Next; begin Inc(fRun); if fRun = fTokens.Count then begin fTokenLen := 0; Exit; end; Inc(fTokenPos, fTokenLen); fTokenLen := Length(fTokens[fRun]); fTokenKind := TChangeKind(PtrInt(fTokens.Objects[fRun])); end; procedure TSynDiffHighlighter.ResetRange; begin fDefaultAttriPointer := fWhitespaceAttribute; end; procedure TSynDiffHighlighter.SetLine(const aNewValue: String; aLineNumber: Integer); var vOtherEdit: TSynDiffEdit; vOldLine: String; vNewLine: String; begin fDiff.Clear; fTokens.Clear; fRun := -1; fTokenPos := 0; fTokenLen := 0; if Editor.OriginalFile <> nil then begin fAddedAttriPointer := fAddedAttribute; vOtherEdit := Editor.OriginalFile; end else begin fAddedAttriPointer := fRemovedAttribute; vOtherEdit := Editor.ModifiedFile; end; if Editor.DiffKind[aLineNumber] = ckModify then fDefaultAttriPointer := fUnmodifiedAttribute else fDefaultAttriPointer := fWhitespaceAttribute; if (vOtherEdit <> nil) and (aLineNumber < vOtherEdit.Lines.Count) then vOldLine := vOtherEdit.Lines[aLineNumber]; vNewLine := aNewValue; if Length(vNewLine) <> 0 then begin if (Length(vOldLine) <> 0) and (Editor.DiffKind[aLineNumber] = ckModify) then ComputeTokens(vOldLine, vNewLine) else fTokens.Add(vNewLine); end; Next; end; procedure TSynDiffHighlighter.UpdateColors; begin BeginUpdate; try if Editor.PaintStyle = psForeground then begin fAddedAttribute.Foreground := Editor.Colors.Added; fAddedAttribute.Background := clBtnFace; fRemovedAttribute.Foreground := Editor.Colors.Deleted; fRemovedAttribute.Background := clBtnFace; fModifiedAttribute.Foreground := Editor.Colors.Modified; fModifiedAttribute.Background := clBtnFace; fUnmodifiedAttribute.Foreground := clNone; fUnmodifiedAttribute.Background := clNone; end else begin fAddedAttribute.Foreground := clNone; fAddedAttribute.Background := Editor.Colors.Added; fRemovedAttribute.Foreground := clNone; fRemovedAttribute.Background := Editor.Colors.Deleted; fModifiedAttribute.Foreground := clNone; fModifiedAttribute.Background := Editor.Colors.Modified; fUnmodifiedAttribute.Foreground := clNone; fUnmodifiedAttribute.Background := Editor.Colors.Modified; end; finally EndUpdate; end; end; end. doublecmd-0.5.8/src/fhotdir.lfm0000644000175000017500000000530412023046500015426 0ustar alexxalexxobject frmHotDir: TfrmHotDir Left = 285 Height = 423 Top = 127 Width = 437 ActiveControl = btnOK Caption = 'Directory Hotlist' ClientHeight = 423 ClientWidth = 437 OnCreate = FormCreate Position = poScreenCenter LCLVersion = '1.1' object lsHotDir: TListBox AnchorSideRight.Control = btnOK Left = 12 Height = 409 Top = 8 Width = 265 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Right = 12 ItemHeight = 0 OnMouseMove = lsHotDirMouseMove OnMouseDown = lsHotDirMouseDown OnMouseUp = lsHotDirMouseUp ScrollWidth = 263 TabOrder = 0 TopIndex = -1 end object btnOK: TBitBtn AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 289 Height = 32 Top = 8 Width = 142 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = '&OK' Kind = bkOK ModalResult = 1 OnClick = btnOKClick TabOrder = 1 end object btnCancel: TBitBtn AnchorSideTop.Control = btnDelete AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 289 Height = 32 Top = 128 Width = 142 Anchors = [akTop, akRight] BorderSpacing.Top = 8 BorderSpacing.Right = 6 Cancel = True Caption = '&Cancel' Kind = bkCancel ModalResult = 2 TabOrder = 4 end object btnADD: TBitBtn AnchorSideTop.Control = btnOK AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 289 Height = 32 Top = 48 Width = 142 Anchors = [akTop, akRight] BorderSpacing.Top = 8 BorderSpacing.Right = 6 Caption = '&Add' OnClick = btnADDClick TabOrder = 2 end object btnDelete: TBitBtn AnchorSideTop.Control = btnADD AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 289 Height = 32 Top = 88 Width = 142 Anchors = [akTop, akRight] BorderSpacing.Top = 8 BorderSpacing.Right = 6 Caption = '&Delete' OnClick = btnDeleteClick TabOrder = 3 end object btnAddMan: TBitBtn AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 289 Height = 32 Top = 168 Width = 142 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = 'Add &manually' OnClick = btnAddManClick TabOrder = 5 end object btnEdit: TBitBtn AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 289 Height = 32 Top = 208 Width = 142 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = '&Edit' OnClick = btnEditClick TabOrder = 6 end end doublecmd-0.5.8/src/fmodview.lfm0000644000175000017500000003346612045446211015630 0ustar alexxalexxinherited frmModView: TfrmModView Left = 395 Height = 319 Top = 104 Width = 488 AutoSize = True BorderIcons = [biSystemMenu] Caption = 'New Size' ChildSizing.LeftRightSpacing = 10 ChildSizing.TopBottomSpacing = 6 ClientHeight = 319 ClientWidth = 488 OnClose = FormClose OnKeyPress = FormKeyPress OnShow = FormShow Position = poOwnerFormCenter object bplButtons: TButtonPanel[0] Left = 10 Height = 34 Top = 279 Width = 468 OKButton.Name = 'OKButton' OKButton.DefaultCaption = True OKButton.OnClick = btnOkClick HelpButton.Name = 'HelpButton' HelpButton.DefaultCaption = True CloseButton.Name = 'CloseButton' CloseButton.DefaultCaption = True CancelButton.Name = 'CancelButton' CancelButton.DefaultCaption = True CancelButton.OnClick = btnCancelClick TabOrder = 0 ShowButtons = [pbOK, pbCancel] end object pnlMain: TPanel[1] Left = 10 Height = 267 Top = 6 Width = 468 Align = alClient AutoSize = True BevelOuter = bvNone ClientHeight = 267 ClientWidth = 468 TabOrder = 1 object pnlQuality: TPanel AnchorSideRight.Control = pnlSize AnchorSideRight.Side = asrBottom Left = 0 Height = 273 Top = 0 Width = 468 Anchors = [akTop, akLeft, akRight, akBottom] AutoSize = True BevelOuter = bvNone ClientHeight = 273 ClientWidth = 468 TabOrder = 2 object tbQuality: TTrackBar Left = 0 Height = 22 Top = 71 Width = 140 Max = 100 Min = 1 Position = 80 OnMouseMove = tbQualityMouseMove TabOrder = 0 end object lblQuality: TLabel Left = 32 Height = 16 Top = 47 Width = 142 Caption = 'Quality of compress to Jpg' Enabled = False ParentColor = False end object teQuality: TEdit Left = 144 Height = 23 Top = 71 Width = 43 OnKeyPress = teQualityKeyPress OnKeyUp = teQualityKeyUp TabOrder = 1 Text = '80' end object rbJpg: TRadioButton Left = 8 Height = 19 Top = 0 Width = 39 Caption = 'JPG' Checked = True OnChange = rbJpgChange TabOrder = 2 TabStop = True end object rbBmp: TRadioButton Left = 59 Height = 19 Top = 0 Width = 45 Caption = 'BMP' OnChange = rbBmpChange TabOrder = 3 end object rbPng: TRadioButton Left = 112 Height = 19 Top = 0 Width = 44 Caption = 'PNG' OnChange = rbPngChange TabOrder = 4 end object rbIco: TRadioButton Left = 29 Height = 19 Top = 22 Width = 40 Caption = 'ICO' OnChange = rbIcoChange TabOrder = 5 end object rbPnm: TRadioButton Left = 88 Height = 19 Top = 21 Width = 47 Caption = 'PNM' OnChange = rbPnmChange TabOrder = 6 end end object pnlCopyMoveFile: TPanel AnchorSideRight.Side = asrBottom Left = 0 Height = 273 Top = 0 Width = 468 Anchors = [akTop, akLeft, akRight, akBottom] AutoSize = True BevelOuter = bvNone ClientHeight = 273 ClientWidth = 468 Constraints.MinWidth = 300 TabOrder = 0 object tePath1: TEdit AnchorSideLeft.Control = rbPath1 AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlCopyMoveFile AnchorSideRight.Control = btnPath1 Left = 34 Height = 23 Top = 5 Width = 402 Alignment = taRightJustify Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 5 BorderSpacing.Right = 6 TabOrder = 0 end object tePath2: TEdit AnchorSideLeft.Control = tePath1 AnchorSideTop.Control = tePath1 AnchorSideTop.Side = asrBottom AnchorSideRight.Control = tePath1 AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 34 Height = 23 Top = 34 Width = 402 Alignment = taRightJustify Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 TabOrder = 1 end object tePath3: TEdit AnchorSideLeft.Control = tePath1 AnchorSideTop.Control = tePath2 AnchorSideTop.Side = asrBottom AnchorSideRight.Control = tePath1 AnchorSideRight.Side = asrBottom Left = 34 Height = 23 Top = 63 Width = 402 Alignment = taRightJustify Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 TabOrder = 2 end object btnPath1: TSpeedButton AnchorSideTop.Control = tePath1 AnchorSideRight.Control = pnlCopyMoveFile AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = tePath1 AnchorSideBottom.Side = asrBottom Left = 442 Height = 23 Top = 5 Width = 21 Anchors = [akTop, akRight, akBottom] BorderSpacing.Right = 5 Caption = '...' NumGlyphs = 0 OnClick = btnPathClick end object tePath4: TEdit AnchorSideLeft.Control = tePath1 AnchorSideTop.Control = tePath3 AnchorSideTop.Side = asrBottom AnchorSideRight.Control = tePath1 AnchorSideRight.Side = asrBottom Left = 34 Height = 23 Top = 92 Width = 402 Alignment = taRightJustify Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 TabOrder = 3 end object tePath5: TEdit AnchorSideLeft.Control = tePath1 AnchorSideTop.Control = tePath4 AnchorSideTop.Side = asrBottom AnchorSideRight.Control = tePath1 AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 34 Height = 23 Top = 121 Width = 402 Alignment = taRightJustify Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 BorderSpacing.Bottom = 10 TabOrder = 4 end object rbPath1: TRadioButton AnchorSideTop.Control = tePath1 AnchorSideBottom.Control = tePath1 AnchorSideBottom.Side = asrBottom Left = 14 Height = 23 Top = 5 Width = 20 Anchors = [akTop, akLeft, akBottom] Checked = True OnKeyPress = FormKeyPress ParentBidiMode = False TabOrder = 5 TabStop = True end object rbPath2: TRadioButton AnchorSideTop.Control = tePath2 AnchorSideBottom.Control = tePath2 AnchorSideBottom.Side = asrBottom Left = 14 Height = 23 Top = 34 Width = 20 Anchors = [akTop, akLeft, akBottom] OnKeyPress = FormKeyPress TabOrder = 6 end object rbPath3: TRadioButton AnchorSideTop.Control = tePath3 AnchorSideBottom.Control = tePath3 AnchorSideBottom.Side = asrBottom Left = 14 Height = 23 Top = 63 Width = 20 Anchors = [akTop, akLeft, akBottom] OnKeyPress = FormKeyPress TabOrder = 7 end object rbPath4: TRadioButton AnchorSideTop.Control = tePath4 AnchorSideBottom.Control = tePath4 AnchorSideBottom.Side = asrBottom Left = 14 Height = 23 Top = 92 Width = 20 Anchors = [akTop, akLeft, akBottom] OnKeyPress = FormKeyPress TabOrder = 8 end object rbPath5: TRadioButton AnchorSideTop.Control = tePath5 AnchorSideBottom.Control = tePath5 AnchorSideBottom.Side = asrBottom Left = 14 Height = 23 Top = 121 Width = 20 Anchors = [akTop, akLeft, akBottom] OnKeyPress = FormKeyPress TabOrder = 9 end object btnPath2: TSpeedButton AnchorSideLeft.Control = btnPath1 AnchorSideTop.Control = tePath2 AnchorSideRight.Control = btnPath1 AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = tePath2 AnchorSideBottom.Side = asrBottom Left = 442 Height = 23 Top = 34 Width = 21 Anchors = [akTop, akLeft, akRight, akBottom] Caption = '...' NumGlyphs = 0 OnClick = btnPathClick end object btnPath3: TSpeedButton AnchorSideLeft.Control = btnPath1 AnchorSideTop.Control = tePath3 AnchorSideRight.Control = btnPath1 AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = tePath3 AnchorSideBottom.Side = asrBottom Left = 442 Height = 23 Top = 63 Width = 21 Anchors = [akTop, akLeft, akRight, akBottom] Caption = '...' NumGlyphs = 0 OnClick = btnPathClick end object btnPath4: TSpeedButton AnchorSideLeft.Control = btnPath1 AnchorSideTop.Control = tePath4 AnchorSideRight.Control = btnPath1 AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = tePath4 AnchorSideBottom.Side = asrBottom Left = 442 Height = 23 Top = 92 Width = 21 Anchors = [akTop, akLeft, akRight, akBottom] Caption = '...' NumGlyphs = 0 OnClick = btnPathClick end object btnPath5: TSpeedButton AnchorSideLeft.Control = btnPath1 AnchorSideTop.Control = tePath5 AnchorSideRight.Control = btnPath1 AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = tePath5 AnchorSideBottom.Side = asrBottom Left = 442 Height = 23 Top = 121 Width = 21 Anchors = [akTop, akLeft, akRight, akBottom] Caption = '...' NumGlyphs = 0 OnClick = btnPathClick end object lblPath1: TLabel AnchorSideTop.Control = rbPath1 AnchorSideBottom.Control = rbPath1 AnchorSideBottom.Side = asrBottom Left = 1 Height = 20 Top = 6 Width = 7 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Left = 5 BorderSpacing.Top = 1 BorderSpacing.Bottom = 2 Caption = '1' ParentColor = False end object lblPath2: TLabel AnchorSideTop.Control = rbPath2 AnchorSideBottom.Control = rbPath2 AnchorSideBottom.Side = asrBottom Left = 1 Height = 20 Top = 35 Width = 7 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Top = 1 BorderSpacing.Bottom = 2 Caption = '2' ParentColor = False end object lblPath3: TLabel AnchorSideTop.Control = rbPath3 AnchorSideBottom.Control = rbPath3 AnchorSideBottom.Side = asrBottom Left = 1 Height = 20 Top = 64 Width = 7 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Top = 1 BorderSpacing.Bottom = 2 Caption = '3' ParentColor = False end object lblPath4: TLabel AnchorSideTop.Control = rbPath4 AnchorSideBottom.Control = rbPath4 AnchorSideBottom.Side = asrBottom Left = 1 Height = 20 Top = 93 Width = 7 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Top = 1 BorderSpacing.Bottom = 2 Caption = '4' ParentColor = False end object lblPath5: TLabel AnchorSideTop.Control = rbPath5 AnchorSideBottom.Control = rbPath5 AnchorSideBottom.Side = asrBottom Left = 1 Height = 20 Top = 122 Width = 7 Alignment = taCenter Anchors = [akTop, akLeft, akBottom] BorderSpacing.Top = 1 BorderSpacing.Bottom = 2 Caption = '5' ParentColor = False end end object pnlSize: TPanel AnchorSideRight.Side = asrBottom Left = 0 Height = 273 Top = 0 Width = 468 Anchors = [akTop, akLeft, akRight, akBottom] AutoSize = True BevelOuter = bvNone ChildSizing.LeftRightSpacing = 6 ClientHeight = 273 ClientWidth = 468 TabOrder = 1 object lblHeight: TLabel AnchorSideTop.Control = teHeight AnchorSideTop.Side = asrCenter Left = 4 Height = 16 Top = 31 Width = 43 Caption = 'Height :' ParentColor = False end object lblWidth: TLabel AnchorSideTop.Control = teWidth AnchorSideTop.Side = asrCenter Left = 4 Height = 16 Top = 4 Width = 39 Caption = 'Width :' ParentColor = False end object teWidth: TEdit AnchorSideLeft.Control = lblWidth AnchorSideLeft.Side = asrBottom Left = 53 Height = 23 Top = 1 Width = 82 BorderSpacing.Left = 10 OnKeyPress = teWidthKeyPress OnKeyUp = teWidthKeyUp TabOrder = 0 Text = 'Width' end object teHeight: TEdit AnchorSideLeft.Control = teWidth AnchorSideTop.Control = teWidth AnchorSideTop.Side = asrBottom Left = 53 Height = 23 Top = 28 Width = 82 BorderSpacing.Top = 4 OnKeyPress = teHeightKeyPress OnKeyUp = teHeightKeyUp TabOrder = 1 Text = 'Height' end object btnProportion: TSpeedButton AnchorSideLeft.Control = teWidth AnchorSideLeft.Side = asrBottom Left = 141 Height = 32 Top = 9 Width = 26 BorderSpacing.Left = 6 Caption = 'Pr' NumGlyphs = 0 OnClick = btnProportionClick end end end object sddCopyMoveFile: TSelectDirectoryDialog[2] left = 288 top = 40 end end doublecmd-0.5.8/src/foptions.lfm0000644000175000017500000023150712045446211015645 0ustar alexxalexxobject frmOptions: TfrmOptions Left = 71 Height = 203 Top = 101 Width = 517 ActiveControl = tvTreeView Caption = 'Options' ClientHeight = 203 ClientWidth = 517 OnClose = FormClose OnCreate = FormCreate OnDestroy = FormDestroy Position = poScreenCenter SessionProperties = 'Height;Width;WindowState;Left;Top' ShowInTaskBar = stAlways LCLVersion = '1.0.1.3' object tvTreeView: TTreeView Left = 0 Height = 160 Top = 0 Width = 193 Align = alLeft AutoExpand = True DefaultItemHeight = 24 Images = OptionsEditorsImageList ReadOnly = True ScrollBars = ssAutoBoth TabOrder = 0 OnChange = tvTreeViewChange Options = [tvoAutoExpand, tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips] end object Panel3: TPanel Left = 196 Height = 160 Top = 0 Width = 321 Align = alClient BevelOuter = bvNone ClientHeight = 160 ClientWidth = 321 TabOrder = 1 object pnlCaption: TPanel Left = 0 Height = 23 Top = 0 Width = 321 Align = alTop Color = clActiveCaption Font.Color = clCaptionText Font.Style = [fsBold] ParentColor = False ParentFont = False TabOrder = 0 end object sboxOptionsEditor: TScrollBox Left = 0 Height = 137 Top = 23 Width = 321 HorzScrollBar.Page = 321 HorzScrollBar.Smooth = True HorzScrollBar.Tracking = True VertScrollBar.Page = 137 VertScrollBar.Smooth = True VertScrollBar.Tracking = True Align = alClient BorderStyle = bsNone TabOrder = 1 object lblEmptyEditor: TLabel AnchorSideLeft.Control = sboxOptionsEditor AnchorSideTop.Control = sboxOptionsEditor Left = 10 Height = 22 Top = 10 Width = 504 BorderSpacing.Left = 10 BorderSpacing.Top = 10 Caption = 'Please select one of the subpages, this page does not contain any settings.' ParentColor = False Visible = False end end end object splOptionsSplitter: TSplitter Left = 193 Height = 160 Top = 0 Width = 3 end object Panel1: TPanel Left = 0 Height = 43 Top = 160 Width = 517 Align = alBottom ClientHeight = 43 ClientWidth = 517 FullRepaint = False TabOrder = 2 object btnOK: TBitBtn AnchorSideRight.Control = btnCancel Left = 198 Height = 31 Top = 5 Width = 98 Anchors = [akTop, akRight] BorderSpacing.Right = 8 BorderSpacing.InnerBorder = 2 Caption = '&OK' Default = True Kind = bkOK ModalResult = 1 OnClick = btnOKClick TabOrder = 0 end object btnCancel: TBitBtn AnchorSideRight.Control = btnApply Left = 304 Height = 31 Top = 5 Width = 98 Anchors = [akTop, akRight] BorderSpacing.Right = 8 BorderSpacing.InnerBorder = 2 Cancel = True Caption = '&Cancel' Kind = bkCancel ModalResult = 2 OnClick = btnCancelClick TabOrder = 1 end object btnApply: TBitBtn AnchorSideRight.Control = Panel1 AnchorSideRight.Side = asrBottom Left = 410 Height = 31 Top = 5 Width = 98 Anchors = [akTop, akRight] BorderSpacing.Right = 8 BorderSpacing.InnerBorder = 2 Caption = '&Apply' OnClick = btnApplyClick TabOrder = 2 end end object OptionsEditorsImageList: TImageList left = 72 top = 16 Bitmap = { 4C6921000000100000001000000066355CFF66355CFF66355CFF66355CFF6635 5CFF66355CFF66355CFF66355CFF66355CFF66355CFF66355CFF66355CFF6635 5CFF00000000000000000000000066355CFFB395AFFFC6ACC3FFD3BED0FFD1C0 CEFFC9BBC7FFAA97A7FF877184FF755871FF6A4565FF744B6FFF7E5278FF6635 5CFF00000000000000000000000066355CFFB395AFFFA1769BFFAB81A5FF956D 8FFF7E5A79FF684763FF563752FF603E5BFF6A4565FF744B6FFF7E5278FF6635 5CFF00000000000000000000000066355CFFB395AFFFA1769BFFAB81A5FF956D 8FFF7E5A79FF684763FF563752FF603E5BFF6A4565FF744B6FFF7E5278FF6635 5CFF00000000000000000000000066355CFFB395AFFFA1769BFFAB81A5FF956D 8FFF7E5A79FF684763FF563752FF603E5BFF6A4565FF744B6FFF7E5278FF6635 5CFF00000000000000000000000066355CFFB395AFFFA1769BFF069A4EFF069A 4EFF069A4EFF069A4EFF069A4EFF069A4EFF069A4EFF069A4EFF069A4EFF069A 4EFF069A4EFF069A4EFF069A4EFF66355CFFB395AFFFA1769BFF089B50FF68E7 A6FF73ECB0FF89F1BDFF9CEEC5FFAFEDCEFF71DAA5FF2EC176FF18BF6AFF1EC9 72FF24D27AFF28D980FF069A4EFF66355CFFB395AFFFA1769BFF089B50FF66E6 A6FF3EE692FF48EA99FF3BDE8CFF2FD280FF22C673FF15BA66FF18BF6AFF1EC9 72FF24D27AFF28D980FF069A4EFF66355CFFB395AFFFA1769BFF089B50FF66E6 A6FF3EE692FF48EA99FF3BDE8CFF2FD280FF22C673FF15BA66FF18BF6AFF1EC9 72FF24D27AFF28D980FF069A4EFF66355CFFB395AFFFC6ACC3FF089B50FF66E6 A6FF3EE692FF48EA99FF3BDE8CFF2FD280FF22C673FF15BA66FF18BF6AFF1EC9 72FF24D27AFF28D980FF069A4EFF66355CFF66355CFF66355CFF089B50FF66E6 A6FF3EE692FF48EA99FF3BDE8CFF2FD280FF22C673FF15BA66FF18BF6AFF1EC9 72FF24D27AFF28D980FF069A4EFF000000000000000000000000089B50FF66E6 A6FF3EE692FF48EA99FF3BDE8CFF2FD280FF22C673FF15BA66FF18BF6AFF1EC9 72FF24D27AFF28D980FF069A4EFF000000000000000000000000089B50FF66E6 A6FF3EE692FF48EA99FF3BDE8CFF2FD280FF22C673FF15BA66FF18BF6AFF1EC9 72FF24D27AFF28D980FF069A4EFF000000000000000000000000089B50FF66E6 A6FF40E693FF4AEA9AFF3EDE8DFF33D282FF24C674FF15BA66FF18BF6AFF1EC9 72FF24D27AFF28D980FF069A4EFF000000000000000000000000079A4FFF66E6 A6FF72ECAFFF87F1BCFF99EDC3FFAAECCBFF70DAA4FF2EC176FF18BF6AFF1EC9 72FF24D27AFF28D980FF069A4EFF000000000000000000000000069A4EFF069A 4EFF069A4EFF069A4EFF069A4EFF069A4EFF069A4EFF069A4EFF069A4EFF069A 4EFF069A4EFF069A4EFF069A4EFF00000000858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF00000000858A88FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFF858A88FF858A88FFFFFFFFFFE3E3E3FFE3E3E3FFE3E3 E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3 E3FFE3E3E3FFFDFDFDFF858A88FF858A88FFFFFFFFFFE3E3E3FFE3E3E3FFE3E3 E3FFC5C6C6FFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFC5C6C6FFE3E3E3FFE3E3 E3FFE3E3E3FFFDFDFDFF858A88FF858A88FFFFFFFFFFE3E3E3FFE3E3E3FFE3E3 E3FFA8ABAAFFC6C7C7FFE6E6E6FFE6E7E6FFC6C8C7FFA8ABAAFFE5E4E4FFE4E3 E4FFE3E3E3FFFDFDFDFF858A88FF858A88FFFFFFFFFFE3E3E3FFE4E4E4FFE5E6 E6FFA8ABAAFFE9E8E9FFE9E9E9FFE9E9E9FFE9E9EAFFA8ABAAFFE7E7E8FFE6E6 E6FFE4E5E4FFFBFBFBFF858A88FF858A88FFFFFFFFFFE4E4E4FFE6E7E6FFE8E8 E9FFA8ABAAFFEBECEBFFECECECFFECEDEDFFECEDECFFA8ABAAFFEBEBEAFFE9E9 E9FFE6E7E7FFFBFBFBFF858A88FF858A88FFFFFFFFFFE6E6E6FFE9E8E8FFA8AB AAFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFEBEC ECFFEAE9E9FFF8F8F8FF858A88FF858A88FFFFFFFFFFE8E8E8FFEBEBEAFFA8AB AAFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFEEEE EEFFECEBECFFF6F6F6FF858A88FF858A88FFFFFFFFFFE9E9EAFFECECECFFA8AB AAFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFF0F0 F0FFEDEDEDFFEFEFEFFF858A88FF858A88FFFFFFFFFFEAEBEAFFEEEDEDFFA8AB AAFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFF1F1 F2FFEFEEEFFFEFEFEFFF858A88FF858A88FFFFFFFFFFEBEBEBFFEEEEEEFFCCCD CDFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFA8ABAAFFCECFCFFFF3F3 F3FFEFF0EFFFEFEFEFFF858A88FF858A88FFFFFFFFFFEBEBEAFFEEEEEEFFF2F1 F2FFF5F5F5FFF8F8F8FFFBFBFBFFFEFEFEFFFCFCFCFFF9F9F9FFF6F6F5FFF3F3 F3FFEFEFEFFFEFEFEFFF858A88FF858A88FFFFFFFFFFEAEAEBFFEDEEEDFFF1F1 F1FFF4F4F4FFF6F6F7FFF9F9F9FFFBFAFBFFF9FAF9FFF8F8F8FFF5F5F4FFF2F2 F2FFEFEFEFFFEFEFEFFF858A88FF858A88FFFFFFFFFFFCFCFCFFFCFCFCFFFCFC FCFFFCFCFCFFFCFCFCFFFCFCFCFFFAFAFAFFFAFAFAFFFAFAFAFFF6F6F6FFF6F6 F6FFF6F6F6FFEFEFEFFF858A88FF00000000858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF00000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000858A 88FF000000000000000000000000000000000000000000000000000000000000 0000858A88FF0000000000000000000000000000000000000000858A88FFE9EB ECFF858A88FF000000000000000000000000000000000000000000000000858A 88FFEEEFEFFF858A88FF0000000000000000000000000000000000000000858A 88FFEEF0F0FF858A88FF00000000000000000000000000000000858A88FFF0F0 F0FF858A88FF000000000000000000000000858A88FF0000000000000000858A 88FFFAFAFAFF858A88FF00000000000000000000000000000000858A88FF878C 8AFF000000000000000000000000858A88FFF5F6F6FFA9ACABFF858A88FFF7F7 F7FFE2E3E5FFAAADADFFECEEEEFF0000000000000000858A88FF000000000000 000000000000000000000000000000000000858A88FFF3F3F3FFEFF0F0FFEDEE EEFFEAECECFFB6B9BAFF858A88FF00000000858A88FF00000000000000000000 00000000000000000000000000000000000000000000858A88FF858A88FF858A 88FF858A88FFD0D1D2FFA3A4A4FF858A88FF858A88FF00000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000B5B7B8FF858A88FFB7B8B9FF858A88FF00000000000000000000 0000000000000000000000000000000000000000000000000000874A20FF874A 20FF874A20FF85837DFFAAADADFFC8C9CAFFBDBEBFFF858A88FF000000000000 00000000000000000000000000000000000000000000874A20FFCCBBADFFCCBB ADFFB3937CFF874A20FF858A88FF858A88FFD3D3D4FFBDBEBFFF858A88FF0000 000000000000000000000000000000000000874A20FFD4C8BDFFA48D78FFA48D 78FFBEA592FF874A20FF0000000000000000858A88FFE2E3E4FFC2C4C6FF858A 88FF858A88FF0000000000000000874A20FFCCBBADFFA48D78FFA28A74FFB495 7AFFB3937CFF874A20FF000000000000000000000000858A88FFD2D3D4FFC2C3 C4FF858A88FF0000000000000000874A20FFCCBBADFFA7917DFFB5957AFFAE8B 72FF874A20FF0000000000000000000000000000000000000000858A88FF9EA1 A0FF858A88FF0000000000000000874A20FFBEA592FFB89C86FFB89C86FF874A 20FF000000000000000000000000000000000000000000000000858A88FF858A 88FF858A88FF000000000000000000000000874A20FF874A20FF874A20FF0000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF00000000858A88FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFF858A88FF858A88FFFFFFFFFFE3E3E3FFA7A7A7FF8282 82FF2F2F2FFF2F2F2FFFE3E3E3FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE3E3 E3FFE3E3E3FFFDFDFDFF858A88FF858A88FFFFFFFFFFE3E3E3FFE2E2E2FFDBDB DBFFCECECEFF2F2F2FFFE3E3E3FFE8E8E8FFE9E9E9FFE8E8E8FFE8E8E8FFE3E3 E3FFE3E3E3FFFDFDFDFF858A88FF858A88FFFFFFFFFFE3E3E3FFB1B1B1FF2F2F 2FFF747474FF2F2F2FFFE6E6E6FFE6E7E6FFE6E6E6FFE5E6E5FFE5E4E4FFE4E3 E4FFE3E3E3FFFDFDFDFF858A88FF858A88FFFFFFFFFFE3E3E3FF2F2F2FFFD3D3 D3FFBFBFBFFF2F2F2FFFE9E9E9FFE9E9E9FFE9E9EAFFE9E9E8FFE7E7E8FFE6E6 E6FFE4E5E4FFFBFBFBFF858A88FF858A88FFFFFFFFFFE4E4E4FF2F2F2FFF2F2F 2FFF2F2F2FFFB8B9B8FF4B4B4BFF2F2F2FFFECEDECFFECEBECFFEBEBEAFFE9E9 E9FFE6E7E7FFFBFBFBFF858A88FF858A88FFFFFFFFFFE6E6E6FFECECECFFEDED EDFFEEEEEEFFEFEFEFFF474747FF2C2C2CFFF0F0F0FFEFEFEFFFEEEEEEFFEBEC ECFFEAE9E9FFF8F8F8FF858A88FF858A88FFFFFFFFFFE8E8E8FFEDEDEDFFEFEF EFFFF0F0F0FFF1F1F1FF484848FF202020FF343434FF000000FF010101FF6262 62FFF2F2F2FFF6F6F6FF858A88FF858A88FFFFFFFFFFE9E9EAFFEFEFEFFFF0F0 F0FFF2F2F2FFF3F3F3FF484848FF000000FF767676FFF2F2F2FF666666FF0000 00FFB1B1B1FFEFEFEFFF858A88FF858A88FFFFFFFFFFEAEBEAFFF0F0F0FFF2F2 F2FFF3F3F3FFF5F5F5FF494949FF050505FFF3F3F3FFF9F9F9FFDBDBDBFF0000 00FF7C7C7CFFEFEFEFFF858A88FF858A88FFFFFFFFFFEBEBEBFFF1F1F1FFF3F3 F3FFF4F4F4FFF6F6F6FF494949FF060606FFF1F1F1FFFBFBFBFFD3D3D3FF0000 00FF767676FFEFEFEFFF858A88FF858A88FFFFFFFFFFEBEBEAFFF2F2F2FFF4F4 F4FFF6F6F6FFF7F7F7FF4A4A4AFF000000FF797979FFF7F7F7FF5F5F5FFF0000 00FFADADADFFEFEFEFFF858A88FF858A88FFFFFFFFFFEAEAEBFFF2F2F2FFF4F4 F4FFF6F6F6FFF8F8F8FF565656FF2E2E2EFF222222FF040404FF000000FF4D4D 4DFFF7F7F7FFEFEFEFFF858A88FF858A88FFFFFFFFFFFCFCFCFFFCFCFCFFFCFC FCFFFCFCFCFFFCFCFCFFFCFCFCFFFAFAFAFFFAFAFAFFFAFAFAFFF6F6F6FFF6F6 F6FFF6F6F6FFEFEFEFFF858A88FF00000000858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A 88FF858A88FF858A88FF00000000FFFFFF00FFFFFF00FFFFFF000DD8000004D0 13000CD135FF15D255FF18D474FF18D68CFF13D8A2FF0DDBB9FF06E4D900FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003AD5040020D009FF3AD7 3DFF6AE67CFF88F3AAFF96F9C4FF97FBD3FF87F7DBFF68EFE0FF1AE7E5FF0AD5 EBFF05BBF400FFFFFF00FFFFFF00FFFFFF0065D800004CD50EFF74E158FFA1F6 99FF9EFFA6FF7BFF9EFF70FFAEFF70FFC7FF7CFFE3FFA5FFFAFF98F4FBFF55D8 F5FF0DB7F9FF008DFC00FFFFFF0080DE000077DA09FF94E257FFBBF99DFF8AFF 6EFF79FF76FF82FF97FF89FFB6FF87FFD1FF7EFFECFF6DFBFEFF76E8FFFF9BDF FCFF54BAFBFF0782F6FFFFFFFF0096DF0000A0E138FFCBF697FFAEFF6CFFA4FF 7AFF9DFF8DFF9BFFA3FFA4FFC4FFA2FFDFFF97FFF8FF85EFFFFF6ED3FFFF78C5 FFFF92C5FCFF146EF4FF0052F000B2E608FFC6EB67FFDDFF9BFFC5FF6FFFC3FF 8CFFBEFFA1FFB9FFB3FFBDFFCFFFBDFFEEFFB0F8FFFF99DEFFFF7EC2FFFF63A3 FFFF9EBDFFFF5983F8FF0336E2FFCDEA0EFFE4F582FFE5FF6FFFE0FF79FFE0FF 95FFDFFFAFFFDCFFC7FFDCFFE0FFD9FEFAFFC5E9FFFFA7CAFFFF87AAFFFF698B FFFF788EFFFF7386FBFF0822DDFFEAEC0EFFF9FA92FFFAFD64FFFAFD7BFFF9FD 98FFFAFDB5FFFAFED3FFFAFEEFFFEFF3FFFFD0D5FFFFAFB3FFFF8D91FFFF6C6F FFFF6769FFFF8283FBFF090DD9FFF1DA0EFFFFF290FFFFE962FFFFE876FFFFE7 93FFFFE7B0FFFFE6CAFFFFE5E5FFFCDEFDFFE1C6FFFFC2A6FFFFA184FFFF7E66 FFFF7664FFFF887BF6FF1A08D5FFF5BF09FFFEDD80FFFFD16CFFFFC76BFFFFC7 85FFFFC49EFFFFBDB3FFFFBFD0FFFFBFF1FFF4B0FFFFD696FFFFB679FFFF955E FFFF9977FFFF8265ECFF2A04D0FFFBA600FFFDBE60FFFFD09CFFFFA55BFFFFA2 71FFFF9A84FFFF979BFFFF9FBFFFFF9FE0FFFE92FBFFE77CFFFFC966FFFFA84F FFFFBE95FDFF7240DDFF3600CC00FA820000F87C0BFFFBB98EFFFF976AFFFF79 5BFFFF716BFFFF7689FFFF7CADFFFF7BCDFFFF71EDFFF763FFFFD952FFFFCF7C FFFFB373ECFF5906CCFF4600CC00FFFFFF00F05600FFF07744FFFCA692FFFF7B 6FFFFF5158FFFF5A79FFFF5E9BFFFF5CBCFFFF57DAFFFF4CF7FFF17BFFFFD685 F1FF9734CFFF6100C200FFFFFF00FFFFFF00EB470000E22A00FFE95240FFF885 84FFFF969FFFFF7491FFFF609AFFFF60B7FFFF78D8FFFC92EFFFE871EAFFB632 CCFF8900BDFF6D00CE00FFFFFF00FFFFFF00FFFFFF00E51E0000D30400FFD404 0CFFE14059FFEE6384FFF373A1FFF071B2FFE45AB6FFD236B4FFBE02B4FFAD00 BA009700CC00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D000 0700C3001C00BF0031FFBE0144FFBB005AFFB90072FFB8008A00C100AF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 000000000000894D25FF884C23FF884C23FF884C23FF884C23FF884C23FF884C 23FF884C23FF894F26FF00000000000000000000000000000000000000000000 00008B5129FFE2DFDAFFEDEFEEFFF0F2F1FFF4F5F4FFF6F7F7FFF7F8F8FFF5F6 F6FFF3F4F4FFE1DAD4FF894F26FF000000000000000000000000874A20FF874A 20FF8E5630FFE8EBEAFFD6DADAFFD6DADAFFD7DADAFFD8DCDBFFD8DCDBFFD7DC DBFFDADEDEFFEFF0F0FF874A20FF0000000000000000874A20FF874A20FF874A 20FF8E562FFFE6E8E7FFD6DBDBFFDAE0DDFFDCE2DFFFDDE3E0FFDEE4E1FFDCE2 E0FFD8DCDCFFEAECECFF874A20FF00000000874A20FF874A20FF874A20FF0000 00008E562FFFE0E3E2FFDEE2E1FFDDE3E0FFE0E6E3FFE2E7E5FFE3E8E5FFE2E7 E4FFDFE2E2FFE4E7E6FF874A20FF00000000874A20FF874A20FF000000000000 00008D562FFFDBDEDCFFE7E9E9FFE1E6E3FFE4E9E6FFE7EBE9FFE8ECE9FFE6EB E8FFE6E8E8FFDEE0DFFF874A20FF00000000894F27FF874B21FF874B22FF874A 21FF8D552FFFD7DBD9FFEFF2F2FFE4E9E6FFE8ECEAFFEBEFEDFFEDF0EEFFEBEF EDFFEDEFEFFFD7DBD9FF874A20FF895028FFC1B6ABFFD5D9D8FFD6DAD9FFD1D0 CDFF8F5933FFD6DAD8FFEFF1F0FFF8F9F9FFF8F9F9FFF8F9F9FFF8F9F9FFF8F9 F9FFE9EBEBFFD7DBD9FF874A20FF874B22FFD6DAD9FFD7DBDBFFD8DCDCFFD2D3 D0FF8F5933FFD6DAD8FFB7BEBBFFB7BEBBFFB7BEBBFFB7BEBBFFB7BEBBFFB7BE BBFFB9BFBCFFD7DBD9FF874A20FF874B22FFD6DAD9FFE4E6E6FFD0D8D4FFD3D8 D3FF8C542EFFCECBC5FFD7DAD8FFD7DAD8FFD7DAD8FFD7DAD8FFD7DAD8FFD7DA D8FFD7DAD8FFC8C2B9FF884E25FF874B22FFD6DAD9FFEEEFEFFFD3DAD6FFD7DE DBFFB7A18DFF8E5731FF884D24FF884D24FF884D24FF884D24FF884D24FF884D 24FF884D24FF8F5A34FF874D25FF874B22FFD6DAD9FFF8F8F8FFD4DBD8FFD9E0 DDFFDFE4E1FFE3E8E5FFE7ECE9FFEAEEEBFFE8ECEAFFE4E9E6FFE0E5E2FFDBE1 DEFFEDEFEEFFDCDFDFFF884D25FF874B22FFD6DAD9FFFCFCFCFFF5F7F7FFF6F7 F7FFF6F8F8FFF7F8F8FFF7F9F8FFF8F9F9FFF7F9F9FFF7F8F8FFF6F8F8FFF6F8 F7FFFCFCFCFFDEE1E0FF884D25FF874B22FFD6DAD9FFBEC4C1FFC1C7C4FFC1C7 C4FFC1C7C4FFC1C7C4FFC1C7C4FFC1C7C4FFC1C7C4FFC1C7C4FFC1C7C4FFC1C7 C4FFC0C6C4FFD6DAD9FF884D24FF895028FFC0B4A8FFD6DAD8FFD6DAD9FFD6DA D9FFD6DAD9FFD6DAD9FFD6DAD9FFD6DAD9FFD6DAD9FFD6DAD9FFD6DAD9FFD6DA D9FFD6DAD8FFBFB4A7FF895028FF00000000895029FF874A20FF874A20FF874A 20FF874A20FF874A20FF874A20FF874A20FF874A20FF874A20FF874A20FF874A 20FF874A20FF895028FF00000000000000009D9D9DFF9C9C9CFF9C9C9CFF9C9C 9CFF9C9C9CFF9C9C9CFF9C9C9CFF9C9C9CFF9C9C9CFF9C9C9CFF9C9C9CFF9C9C 9CFF9C9C9CFF9D9D9DFF9F9F9FFF9D9D9DFFFAFAFAFFFBFBFBFFFBFBFBFFFBFB FBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFB FBFFFBFBFBFFFBFBFBFF9C9C9CFF9C9C9CFFFFFFFFFFE2E2E2FFE3E3E3FFE4E4 E4FFE4E4E4FFE5E5E5FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE5E5 E5FFE5E5E5FFFFFFFFFF9C9C9CFF9C9C9CFFFFFFFFFF9B9B9BFF9B9B9BFF9B9B 9BFF9B9B9BFF9B9B9BFF9B9B9BFFE6E6E6FF4F4E48FF4F4E48FF4F4E48FF4F4E 48FFE5E5E5FFFFFFFFFF9C9C9CFF9C9C9CFFFFFFFFFF9B9B9BFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFF9B9B9BFFE8E8E8FF57554EFF57554EFF57554EFF5755 4EFFE6E6E6FFFFFFFFFF9C9C9CFF9C9C9CFFFFFFFFFF9B9B9BFFFFFFFFFFECEE EEFFECEEEEFFFFFFFFFF9B9B9BFFEAEAEAFF5F5D54FF5F5D54FF5F5D54FF5F5D 54FFE8E8E8FFFFFFFFFF9C9C9CFF9C9C9CFFFFFFFFFF9B9B9BFFFFFFFFFFECEE EEFFECEEEEFFFFFFFFFF9B9B9BFFECECECFF67645AFF67645AFF67645AFF6764 5AFFEAEAEAFFFFFFFFFF9C9C9CFF9C9C9CFFFFFFFFFF9B9B9BFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFF9B9B9BFF9B9B9BFF9B9B9BFF9B9B9BFF9B9B9BFF9B9B 9BFFA0A0A0FFFFFFFFFF9C9C9CFF9C9C9CFFFFFFFFFF9B9B9BFF9B9B9BFF9B9B 9BFF9B9B9BFF9B9B9BFF9B9B9BFFA5A5A5FFFFFFFFFFFFFFFFFFFFFFFFFFFDFD FDFF9F9F9FFFFFFFFFFF9C9C9CFF9D9D9DFFFFFFFFFFEAEAEAFF666359FF6663 59FF666359FF666359FFECECECFFA5A5A5FFFDFEFEFFECEEEEFFEDEFEFFFFDFD FDFF9F9F9FFFFFFFFFFF9C9C9CFF9D9D9DFFFFFFFFFFEBEBEBFF6E6A5FFF6E6A 5FFF6E6A5FFF6E6A5FFFEDEDEDFFA5A5A5FFFDFEFEFFECEEEEFFEDEFEFFFFDFD FDFF9F9F9FFFFFFFFFFF9C9C9CFF9D9D9DFFFFFFFFFFECECECFF757164FF7571 64FF757164FF757164FFEFEFEFFFA5A5A5FFFFFFFFFFFFFFFFFFFFFFFFFFFDFD FDFF9F9F9FFFFFFFFFFF9C9C9CFF9D9D9DFFFFFFFFFFEDEDEDFF797567FF7975 67FF797567FF797567FFF1F1F1FF9B9B9BFF9B9B9BFF9B9B9BFF9B9B9BFF9B9B 9BFFA0A0A0FFFFFFFFFF9C9C9CFF9D9D9DFFFFFFFFFFEEEEEEFFF0F0F0FFF2F2 F2FFF4F4F4FFF6F6F6FFF8F8F8FFFAFAFAFFFBFBFBFFFAFAFAFFF9F9F9FFF7F7 F7FFF5F5F5FFFFFFFFFF9C9C9CFF9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFF9C9C9CFFA0A0A0FF9B9B9BFF9B9B9BFF9B9B9BFF9B9B 9BFF9B9B9BFF9B9B9BFF9B9B9BFF9B9B9BFF9B9B9BFF9B9B9BFF9B9B9BFF9B9B 9BFF9B9B9BFF9B9B9BFFA1A1A1FF00000000B6BDBAFFB6BDBAFFB6BDBAFFB6BD BAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFF000000000000 0000000000000000000000000000B6BDBAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6BDBAFF0000 0000000000000000000000000000B6BDBAFFFEFEFEFF874A20FF874A20FF874A 20FF874A20FF874A20FF874A20FF874A20FF874A20FFFDFDFDFFB6BDBAFF0000 0000000000000000000000000000B6BDBAFFFBFCFCFFA46534FFA46534FFA465 34FFA46534FFA46534FFA46534FFA46534FFA46534FFFBFBFBFFB6BDBAFF0000 0000000000000000000000000000B6BDBAFFFAFBFAFFF9F9F9FFF9F9F9FFE0E3 E2FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD BAFFB6BDBAFFB6BDBAFF00000000B6BDBAFFF8F8F8FFF6F6F6FFF6F6F5FFB6BD BAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFB6BDBAFFB6BDBAFFF7F7F7FFF3F3F4FFF3F3F3FFB6BD BAFFFEFEFEFF874A20FF874A20FF874A20FF874A20FF874A20FF874A20FF874A 20FF874A20FFFDFDFDFFB6BDBAFFB6BDBAFFF2F2F2FFEEEEEEFFEFEFEFFFB6BD BAFFFBFCFCFFA46534FFA46534FFA46534FFA46534FFA46534FFA46534FFA465 34FFA46534FFFBFBFBFFB6BDBAFFB6BDBAFFF0EFEFFFEAEAEBFFEAEAEAFFB6BD BAFFFAFBFAFFF9F9F9FFF9F9F9FFF9F9F9FFF8F9F8FFF8F8F8FFF8F8F8FFF8F8 F8FFF8F8F8FFF8F9F8FFB6BDBAFFB6BDBAFFEEEFEEFFE6E5E5FFE5E5E5FFB6BD BAFFF8F8F8FFF6F6F6FFF6F6F5FFF6F5F6FFF6F6F6FFF5F5F6FFF5F5F5FFF5F5 F6FFF5F5F6FFF7F7F7FFB6BDBAFFB6BDBAFFF2F2F3FFEFF0EFFFEFEFF0FFB6BD BAFFF7F7F7FFF3F3F4FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F2FFF3F3F3FFF3F2 F2FFF3F2F3FFF6F6F6FFB6BDBAFF00000000B6BDBAFFB6BDBAFFB6BDBAFFB6BD BAFFF2F2F2FFEEEEEEFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEF EFFFEEEEEEFFF1F2F1FFB6BDBAFF00000000000000000000000000000000B6BD BAFFF0EFEFFFEAEAEBFFEAEAEAFFEAEAEAFFEAEAEAFFE9E9E9FFEAEAEAFFE9E9 EAFFEAE9EAFFEFEFEFFFB6BDBAFF00000000000000000000000000000000B6BD BAFFEEEFEEFFE6E5E5FFE5E5E5FFE5E6E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5 E5FFE5E5E5FFEDEEEEFFB6BDBAFF00000000000000000000000000000000B6BD BAFFF2F2F3FFEFF0EFFFEFEFF0FFEFEFEFFFF0F0EFFFEFEFEFFFEFEFEFFFEFEF F0FFEFEFEFFFEFEFEFFFB6BDBAFF000000000000000000000000000000000000 0000B6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD BAFFB6BDBAFFB6BDBAFF00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00EAC39DFFE6BF96FFE4BB92FFE4BB92FFD1A06CF5D09E6DF6CC96 5FDAC479427EB2673C09FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00E5BE96FFFFFFFEFFFDF3E9FFFDF3EAFFFCF2E8FFFAEFE3FFFAF2 E7FFEABB88FFCF8555B3B4693D0CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00E4BB93FFFEF5EDFFFCDEC5FFFBE0C7FFF9DCC2FFF5D3B4FFFEF9 F3FFFAE2C4FFECC193FFC37D4893FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00E4BB92FFFEF6F0FFFCE2CDFFFCE3CDFFFADFC8FFF7D9BCFFF5E9 DDFFFAF3EBFFFBF8F3FFCA8353FEFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00E4BB92FFFEF7F1FFFCE5D2FFFCE4D1FFFBE2CCFFF9DDC4FFF6D7 BBFFF3D1AFFFFAEFE4FFCC8758FE34B4D9D05EC2E1FA60C3E2FA60C3E2FA60C3 E2FA5FC3E2FAE4BB91FFFFF7F2FFFEE7D5FFFEE7D5FFFDE5D1FFFAE0CAFFF9DE C4FFF7D9BCFFFDF2E7FFCC8757FE36B3DAF8FDFEFEFFFEFFFFFFFEFEFFFFFDFE FFFFFEFFFFFFE4BA91FFFFF7F0FFFFE7D5FFFDE7D6FFFDE6D4FFFCE4D0FFFBE3 CBFFFADCC2FFFEF3E8FFCC8656FE35AFDAF0F7FCFEFF8EE4F8FF91DEF5FF9FE0 F5FFACE1F6FFCA8452FFFFF7F1FFFFE9D9FFFFEADBFFFFE9D9FFFFE7D7FFFFE5 D2FFFFE2CBFFFFF7F1FFCB8555FE36AADAF2F1FAFDFF94DEF5FF93DCF4FF64BC E9FF3594DAFF3594DAFF3594DAFF3594DAFF3594DAFF3594DAFF3594DAFF3594 DAFF3594DAFFFBF6EFFFCC8355FE35ABDAFAE8F6FBFF70BCE7FF55AAE2FF4DA5 E0FF91C9EBFFFAF3EFFFFDFEFDFFFFFDFCFFFFFDFCFFFEFDFCFFFEFCFBFFFEFE FDFF3594DAFFEFF2E8FFCE8156FF37A6DAFAFEFFFFFFF8FDFFFFF6FDFFFFF5FC FFFFF3FCFEFF9AE4F4FF9AE6F7FF9BE6F6FF9DE5F5FF9EE5F5FF9FE5F4FFDAF3 F8FF3594DAFFFDF4EEFFCA8054F936A1DAF9F6FCFEFF94E5F8FF93E5F8FF93E5 F8FF91E5F8FF93DBE9FF93D7E3FF93D2DCFF90CED7FF8CC8CFFF86C1C6FFC9D8 D6FF3594DAFFC57444E8CA7F53F1369ADAF8F2FAFDFF94E6F8FF92E5F8FF90E5 F8FF8BE3F8FF86E2F7FF7FE1F7FF77DEF6FF6CDCF6FF5ED9F4FF4FD5F3FFCCF2 FBFF3594DAFFFFFFFF00FFFFFF003594DAF7EFFAFEFF93E5F8FF8FE4F8FF89E3 F8FF82E1F7FF7ADFF7FF71DEF6FF67DBF5FF5BD8F4FF4DD4F3FF40D1F2FFCAF2 FBFF3594DAFFFFFFFF00FFFFFF00338ED9FBDCF0FAFF98E1F6FF95E0F6FF92DF F6FF8EDEF5FF89DCF5FF85DAF4FF80D9F4FF7AD7F3FF74D5F3FF70D3F2FFC2EA F8FF3594DAFFFFFFFF00FFFFFF002C86D8D12D88D8F72D87D8F72D88D8F72D88 D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88D8F72D87D8F72D88 D8F72C86D8D1FFFFFF00FFFFFF00000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000008F3FF3F10F4 FF7310F4FF760AF3FF4900000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000007F3FF3716F4FFA126F5 FFE42CF5FFE518F4FFAE0AF3FF36000000000000000000000000000000000000 000000000000000000000000000000000000000000000EF3FF6722F5FFE490FA FFF19BFAFFF333F5FFE611F4FF730000000000000000858A888F888D8BFC888D 8BFC868B89FC868B89FD868B89FD858A88FD858A88FD51B7BBFE36EAF2FFA8F6 F9FFB8F7FAFF46ECF5FD12F4FF6D00000000858A889AA5AAA8FFFDFDFDFFFDFD FDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFB4FAFDFF53F6FEFF5CF7 FEFF61F7FEFF31DFE7FF0FF1FC2D00000000858A88FFFDFDFDFFDBDFDFFFD1D5 D5FFCFD3D3FFCFD3D3FFCFD3D3FFCFD3D3FFCFD3D3FFCFD3D3FFC6E4E5FFB7E4 E6FF6AF6FDFF65A7A9FF59ADAF0300000000858A88FFFDFDFDFFD1D5D5FFCFD3 D3FFCFD3D3FFCFD3D3FFCFD3D3FFCFD3D3FFCFD3D3FFCFD3D3FFCFD3D3FFCFD3 D3FFF6FBFCFF868B89FE858A880300000000858A88FFF0F2F2FFD1D5D5FFD2D6 D6FFD2D6D6FFD2D6D6FFD2D6D6FFD2D6D6FFD1D5D5FFD1D5D5FFD1D5D5FFD1D5 D5FFF7F7F7FF868B89FD858A880400000000858A88FFEFF0F0FFD4D8D8FFD4D8 D8FFD4D8D8FFD4D8D8FFD4D8D8FFD4D8D8FFD4D8D8FFD4D8D8FFD4D8D8FFD4D8 D8FFEFF0F0FF878C8AFD858A8806858A8844858A88FFEBEDEDFFD5D9D9FFD5D9 D9FFD5D9D9FFD5D9D9FFD5D9D9FFD5D9D9FFD5D9D9FFD5D9D9FFD5D9D9FFD5D9 D9FFEFF0F0FF878C8AFC858A8835858A88A48E9391F7E9EBEBFFDADEDEFFDBDF DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF DFFFECEDEDFF919694F6858A889A858A88FEC9CBCAFFECEDEDFFDBDFDFFFDBDF DFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF DFFFECEDEDFFD1D3D2FF858A88FF858A88FDECEDEDFFD9DDDDFFDADEDEFFDADE DEFFDADEDEFFDADEDEFFDADEDEFFDADEDEFFDBDFDFFFDBDFDFFFDBDFDFFFDBDF DFFFDBDFDFFFEFF0F0FF858A88FF858A88FCEFF0F0FFE9EAEAFFECEDEDFFECED EDFFECEDEDFFECEDEDFFECEDEDFFE9EAEAFFE9EAEAFFE9EAEAFFE9EAEAFFE9EA EAFFE9EAEAFFE9EAEAFF858A88FF888D8BE5868B89FC868B89FC868B89FC868B 89FC868B89FC868B89FC868B89FC868B89FC868B89FC868B89FC868B89FC868B 89FC868B89FC868B89FC888D8BEAFFFFFF00C17D4460C88B4DBBC88C4FEEC88C 4FF6C88C4FF7C88C4FF7C88D4FF7C98C4FF7C78B4FF7C5894BD4C4763B91B368 3C06FFFFFF00FFFFFF00FFFFFF00FFFFFF00C48549C3F7F2ECECF8F4EEFCF8F4 EDFFF8F3EDFFF8F3EDFFF8F3EDFFF8F2ECFFF7F2ECFFF2E6D7FFE2B27DFFDB94 65F5B3683B07FFFFFF00FFFFFF00FFFFFF00C5884BEAFAF6F2FCFAE0C7FFFBE1 C9FFFBE2C9FFFBE0C8FFF9DFC5FFF8DBC1FFF4D6B8FFFFFBF8FFB6CBC2FF58A5 D8FF85B1DBFF469DD0FF2B95D15EFFFFFF00C6894CF6F9F5F1FFFCE3CDFFFBE3 CEFFFBE3CDFFFBE2CBFFF9E0C8FFF8DCC2FFF5D6BAFFAFE3F1FF77BEE7FFB4D2 F0FFE5F3FFFFACD2EFFF488CC7E8FFFFFF00C6894BF7F9F5F1FFFCE3CFFFFBE4 D0FFFCE4CFFFFCE3CDFFFAE1CAFFF9DDC4FFAFCDC9FF81D5EEFFB2E3F9FF8BC0 E7FFAED3F6FFC4E0FCFF669FD3F7FFFFFF00C6894BF7F9F4F0FFFCE6D3FFFCE6 D4FFFDE7D3FFFCE4D1FFFBE3CDFFBED4D0FF7DD4EEFFC4F6FDFF6CDDF6FF6DCA EDFF63A3D7FF6499C8FE5192CA26FFFFFF00C6884AF7F9F4EFFFFEE7D7FFFDE7 D6FFFDE7D5FFFDE6D4FFBDD6D5FF79D3EEFFC7F7FDFF5FDCF5FF5BE2F7FF7AD6 F2FF51A1E0FFAD8560F9FFFFFF00FFFFFF00C68849F7F9F4EDFFFEE8D8FFFEE8 D8FFFEE8D7FFB0C6CCFF77CBE7FFC7F7FDFF5EDCF5FF5AE1F7FF7BD4F1FF4B99 DBFFD2DFE9FFC68245F7FFFFFF00FFFFFF00C68447F7F9F3ECFFFEE8D6FFFEE8 D7FFB3C6CCFF76B9D6FFC2F6FDFF63DFF7FF5DE2F8FF79D3F0FF4998DAFFE2D5 C8FFFAF2EAFFC68042F7FFFFFF00FFFFFF00C58245F7F8F2EBFFFEE7D6FFA6B6 BFFF7AB6D5FF90B7D1FF55C9E4FF5BDFF5FF78D0EDFF519BD9FFE1D6CDFFFBE1 C9FFFBF7F2FFC57C3FF7FFFFFF00FFFFFF00C58042F7F8F1E8FFFEE5D5FF4389 AAFFE0F2FFFF549AD8FF1A7ABEFF4998C5FF488CC2FFDAD2CDFFFBE0C9FFFBE1 C8FFFDFAF7FFC1763BF7FFFFFF00FFFFFF00C47C40F7F7F0E6FFF8B455FF2E66 82FF94C7F9FF91C9F9FF4185C9FF2668A6FFD2A865FFF7B251FFF7B24FFFF7B2 4FFFFCF9F5FFBF6F36F7FFFFFF00FFFFFF00C1783CF7F7EDE3FFFDC26EFF1842 57FF2B6187FF4C89BCFF709FB3FFE3C99AFFFFD695FFFFD594FFFFD493FFFBBE 65FFFBF7F4FFBB6731F7FFFFFF00FFFFFF00BF7138F5F5EBDFFEFDBF68FFFCBD 67FFFBBE65FFFCBE64FFFCBE64FFFCBD62FFFBBD63FFFBBC61FFFCBE60FFFCBC 62FFFDFBF8FDB9642DF3FFFFFF00FFFFFF00BC6933DEF8F1EAF2F7ECDFFDF6EB DEFFF6EADEFFF6EADCFFF6EADCFFFAF3EBFFFAF3EBFFFAF2EAFFFCF7F3FFFCF8 F4FDFEFEFDF0B7602AD5FFFFFF00FFFFFF00BB6A346BBA6530BCBB6631EDBA66 30F7BA6630F7BA6630F7BA6530F7BA652FF7B9652EF7B9652EF7B9642EF7B964 2EEFB7622CBDB7622E63FFFFFF00C17D4460C88B4DBBC88C4FEEC88C4FFFC88C 4FF7C88D4FF7C98C4FF7C78B4FF7C5894BD4C4763B91B3683C06FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00C48549C3F7F2ECECF8F4EEFCF8F3EDFFF8F3 EDFFF8F3EDFFF8F2ECFFF7F2ECFFF2E6D7FFE2B27DFFDB9465F5B3683B07FFFF FF00FFFFFF00FFFFFF00FFFFFF00C5884BEAFAF6F2FCFAE0C7FFFBE2C9FFFBE0 C8FFF9DFC5FFF8DBC1FFF4D6B8FFFFFBF8FFF6D8B4FFE1B07DFFDB9264F6B46B 3E07FFFFFF00FFFFFF00FFFFFF00C6894CF6F9F5F1FFFCE3CDFFFBE3CDFFFBE2 CBFFF9E0C8FFF8DCC2FFF5D6BAFFFDFBF8FFFCE6CDFFFAE5C9FFE2B684FFBF79 42A6FFFFFF00FFFFFF00FFFFFF00C6894BF7F9F5F1FFFCE3CFFFFCE4CFFFFCE3 CDFFFAE1CAFFF9DDC4FFF6D9BCFFF4E9DFFFF7F2ECFFFBF7F3FFF5EFE9FFC27E 45FBFFFFFF00FFFFFF00FFFFFF00C6894BF7F9F4F0FFFCE6D3FFFDE7D3FFFCE4 D1FFFBE3CDFFFAE0C8FFF8DCC2FFF5D6BBFFF3D4B5FFF1D2B3FFF8F4F0FFC482 46F7FFFFFF00FFFFFF00FFFFFF00C6884AF7F9F4EFFFFEE7D7FFFDE7D5FFFDE6 D4FFFCE6D2FFD4976EFFD49E7BFFD09871FFD6A482FFCD8E68FFCD9069FFD09A 75FFD19973FFC88B62FFAD5A2036C68849F7F9F4EDFFFEE8D8FFFEE8D7FFFEE7 D6FFFDE5D3FFCC8D65FFF3CDB0FFFFFFFFFFE3C7B3FFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFEABFA1FFC98960FFC68447F7F9F3ECFFFEE8D6FFFDE7D6FFFDE7 D6FFFDE7D5FFC7865BFFEFC09EFFFFFFFFFFCC936EFFFFFFFFFFFFFFFFFFFFFB F7FFFFF8F1FFE4AF8CFFC78A61FFC58245FFF8F2EBFFFEE7D6FFFDE7D6FFFDE7 D6FFFDE6D5FFC8885DFFEFBFA1FFFDFCFAFFFEFCFBFFFEFDFDFFFEFDFCFFFDFB FAFFFDFCFBFFDDA885FFC17F53FFC47C40F7F7F0E6FFF8B455FFF7B554FFF8B4 53FFF8B253FFCA8D65FFEAB899FFDDA57EFFDDA680FFDBA37CFFD9A07AFFD9A0 79FFD89F78FFD89E78FFBF845DFFC1783CF7F7EDE3FFFDC26EFFFFD79EFFFFD6 9BFFFFD798FFC98B61FFE6B592FFE2A781FFE1A781FFDEA37DFFDCA17BFFDB9F 79FFD99E77FFD49A73FFBB7E57FFBF7138F5F5EBDFFEFDBF68FFFBBE65FFFCBE 64FFFCBE64FFC48154FFEAB697FFF3F3EAFFEDF1E6FFEFF1E6FFEFF0E6FFEDF1 E5FFF3F5EDFFD59C79FFB07044FFBC6933DEF8F1EAF2F7ECDFFDF6EADEFFF6EA DCFFF6EADCFFC37F51FFEFB69AFFEAF3E8FF51BF84FF6FC998FF71C999FF54BF 84FFE4F4E9FFDD9C7BFFAA693AFFBB6A346BBA6530BCBB6631EDBA6630FFBA66 30F7BA6530F7C68355FFEFCEBAFFDDFFFFFF87EEC7FFA2F4D7FFA2F6D7FF8CEE C7FFE0FFFFFFDDA285FFAB6A3EFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00BA6833C5C38458FFD38B68FFE18F70FFDC8D6CFFDA8B6DFFD78A 6EFFCD8B6CFFAB6D44FFA65F2EFFFFFFFF00FFFFFF00C17D4460C88B4DBBC88C 4FEEC88C4FF6C88C4FF7C88C4FF7C88D4FF7C98C4FF7C78B4FF7C5894BD4C476 3B91B3683C06FFFFFF00FFFFFF00FFFFFF00FFFFFF00C48549C3F7F2ECECF8F4 EEFCF8F4EDFFF8F3EDFFF8F3EDFFF8F3EDFFF8F2ECFFF7F2ECFFF2E6D7FFE2B2 7DFFDB9465F5B3683B07FFFFFF00FFFFFF00FFFFFF00C5884BEAFAF6F2FCFAE0 C7FFFBE1C9FFFBE2C9FFFBE0C8FFF9DFC5FFF8DBC1FFF4D6B8FFFFFBF8FFF6D8 B4FFE1B07DFFDB9264F6B46B3E07FFFFFF0092877B12776D62FF756D65FFDDC8 B5FF6F665EFF6C6259FFFBE2CBFFF9E0C8FFF8DCC2FFF5D6BAFFFDFBF8FFFCE6 CDFFFAE5C9FFE2B684FFBF7942A6756C630F988C808F9C8F83FF524C47FFCBB7 A7FF544D47FF908579FF9A8C7FFFF5DDC6FFF9DDC4FFF6D9BCFFF4E9DFFFF7F2 ECFFFBF7F3FFF5EFE9FFC27E45FB95897D1D665E56F385786FFF4A413BFF9586 7AFF564A40FF928374FF4F4740FFE4CFBBFFFAE0C8FFF8DCC2FFF5D6BBFFF3D4 B5FFF1D2B3FFF8F4F0FFC48246F73E3934855B544DFFB0A090FF695D51FF8674 65FF63584EFFAA9888FF5A514AFF85796EFFFBE1CCFFFADFC7FFF8DCC2FFF6DA BDFFF6D8BBFFFAF4EFFFC68346F7665E56EF696158FF564F48FF4D4946FF8C80 77FF403B37FF46423CFF3D3833FF2C2825FFFCE4D1FFFBE1CCFFFAE0C7FFF9DD C3FFF8DCC2FFFAF4EDFFC68245F7756C63F8C4B9AFFFA79A8DFF807A73FFD6C3 B4FF6C635CFFBBAFA4FFA6988BFF534D46FFFDE5D3FFFBE4D0FFFBE3CCFFFADF C7FFFADFC6FFFAF2EAFFC68042F771685FFFC1B6ABFF797066FF625C56FFBAA9 9CFF6E665DFFBDB1A5FF7E746AFF332E2BFFFDE5D3FFFCE4D1FFFCE2CDFFFBE1 CBFFFBE1C9FFFBF7F2FFC57C3FF7635B54FFA79A8DFF70675EFF453F3AFFAD9C 91FF5C554EFF968A7FFF665E56FF1B1918FFFCE4D1FFFCE2CEFFFCE2CCFFFBE0 C9FFFBE1C8FFFDFAF7FFC1763BF7423D38D948423CD94B3E31FE58544FFFB686 42FF3D3020FF413524FF372B1BFF3B2C15FFF7B352FFF7B352FFF7B251FFF7B2 4FFFF7B24FFFFCF9F5FFBF6F36F7FFFFFF00FFFFFF00C1783CF7F7EDE3FFFDC2 6EFFFFD8A0FFFFD79EFFFFD69BFFFFD798FFFFD696FFFFD695FFFFD594FFFFD4 93FFFBBE65FFFBF7F4FFBB6731F7FFFFFF00FFFFFF00BF7138F5F5EBDFFEFDBF 68FFFCBD67FFFBBE65FFFCBE64FFFCBE64FFFCBD62FFFBBD63FFFBBC61FFFCBE 60FFFCBC62FFFDFBF8FDB9642DF3FFFFFF00FFFFFF00BC6933DEF8F1EAF2F7EC DFFDF6EBDEFFF6EADEFFF6EADCFFF6EADCFFFAF3EBFFFAF3EBFFFAF2EAFFFCF7 F3FFFCF8F4FDFEFEFDF0B7602AD5FFFFFF00FFFFFF00BB6A346BBA6530BCBB66 31EDBA6630F7BA6630F7BA6630F7BA6530F7BA652FF7B9652EF7B9652EF7B964 2EF7B9642EEFB7622CBDB7622E63FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00A971516BDDB18DF4DCA77BFFDCA67AFFDAA4 7AFFD8A279FFD5A076FFD49E75FFD29D73FFCF9A72FFCE9970FFCB966FFFC994 6CFFC49A7AF4A971516BFFFFFF00DDAC85FDE8B992FFE8B992FFE8B992FFE8B9 92FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B9 92FFE8B992FFC1906FFDFFFFFF00DCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 7BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 7BFFDCA77BFFC08B66FFFFFFFF00DBA47AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFBD8763FFFFFFFF00D9A379FFFFFFFFFFCCCCCCFFCACACAFFC6C6 C6FFFEFAF7FFBDBDBDFFBBBBBBFFB7B7B7FFFEFAF7FFB1B1B1FFB0B0B0FFADAD ADFFFFFFFFFFBA8560FFFFFFFF00D8A279FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB7815EFFFFFFFF00D5A076FFFFFFFFFFC8C8C8FFC6C6C6FFC0C0 C0FFFEFAF7FFBABABAFFB8B8B8FFB2B2B2FFFEFAF7FFA9A9A9FFA7A7A7FFA5A5 A5FFFFFFFFFFB57E5CFFFFFFFF00D49E75FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB27C5AFFFFFFFF00D19C73FFFFFFFFFFC2C2C2FFC0C0C0FFB9B9 B9FFFEFAF7FFB5B5B5FFB3B3B3FFABABABFFFEFAF7FFA2A2A2FF9E9E9EFF9B9B 9BFFFFFFFFFFB07A58FFFFFFFF00CC976FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFAC7554FFFFFFFF00CA946EFFFFFFFFFFBEBEBEFFBABABAFFB2B2 B2FFFEFAF7FFB2B2B2FFAEAEAEFFA5A5A5FFFEFAF7FF989898FF959595FF9191 91FFFFFFFFFFAA7353FFFFFFFF00C8926CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFA97251FFFFFFFF00A97151A9C38E68FFC08B66FFBE8864FFBB85 61FFB9835FFFB47E5CFFB27C5AFFB17B58FFAE7957FFAD7656FFAB7554FFA973 53FFA97151FFA97151A9FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000000000A0 C41B02A1C5A404A2C5EA02A1C4FD02A1C4FD03A2C5EA01A1C49800A0C41B0000 000000000000000000000000000000000000000000000000000000A0C46401A0 C4FBEEF8FAFFF4FBFCFFE4F9FCFFE4F9FCFFC3EDF4FF18AACAFA00A0C4F800A0 C464000000000000000000000000000000000000000000A0C46800A0C4FF83D4 E5FEEFFCFDFFCEF7FCFFAFF4FCFFA9F4FCFF9CF0FAFF4ECCDEFF5ECBDFFA00A0 C4FF00A0C46400000000000000000000000000A0C41B01A0C4FC7DD5E5FFCDF6 FAFFEAFBFDFFB8F4FBFFB5F4FCFFADF3FBFF9CEEF8FF52CFE0FFA7EFF8FF61CD E0FC00A0C4FA00A0C41B000000000000000001A1C49D1AACCBFEC4F3F8FFAEEF F7FFE0F9FCFFBDF3F9FFAEF1F9FFA4EFF8FF8EE6F2FF54D2E1FFC1F4F9FF6FE3 EFFF13A9C9F900A0C48A000000000000000005A3C6EC91DEEBFF93E8F2FFA1EB F4FFCDF4F9FFAEEEF6FFA1ECF5FF96EAF4FF81E2EFFF4ECFDFFF9EEBF4FF59DC EBFF54CDE0FE01A0C4E2000000000000000002A1C4FEA4E8F1FF80E2EDFF8BE5 F0FF90E6F1FF90E7F1FF8BE6F0FF82E4EFFF74DFEDFF6CDEECFF63DCEAFF3BD2 E4FF40D1E3FF01A0C4FD000000000000000003A1C4FF9BE6F0FF66DAE8FF69DB E9FF5CD9E7FF50D6E6FF51D6E7FF4FD6E6FF42D3E3FF32CDE1FF29CCE0FF24CA DEFF1FC8DDFF00A0C4FF000000000000000000A0C4FF79DDE8FF23C7DCFF16C5 DAFF65D9E7FF55D5E5FF47D2E3FF38CEE1FF28C9DDFF13B7CBFF16C5DAFF13C3 D9FF11C2D8FF00A0C4FF000000000000000000A0C4FF8BE1EBFF01BCD3FF04BE D4FF31C9DDFF08BFD5FF09BFD6FF09BFD6FF08BFD5FF05B0C5FF04BED4FF01BC D3FFFFFFFFFF00A0C4FF000000000000000000A0C4FFC9F1F6FF8AE1EBFF00BC D3FF22C5D9FF00BCD3FF00BCD3FF00BCD3FF00BCD3FF00AFC4FF01BCD3FF87DF EAFFFFFFFFFF00A0C4FF000000000000000001A0C4FCE3F4F8FFA3E7EFFFBAED F3FF84DEEAFF75DBE7FF3FCCDEFF0BBFD5FF4CD0E0FF9BE1EAFFC9F0F6FFC9F1 F6FFE3F4F8FF019FC3FC000000000000000000A0C4BB00A0C4FFDDF2F7FF93E3 EDFF9AE5EEFFA0E6EFFFA6E8F0FFABEAF1FFAFEAF1FFB1EAF1FFAFEAF1FFDDF2 F7FF00A0C4FF00A0C4AB00000000000000000000000006A2C4CE00A0C4FF5AC1 D8FFC7EAF2FFF0F9FBFFFDFEFEFFFDFEFEFFF0F9FBFFC7EAF2FF5AC1D8FF00A0 C4FF039FC0C80000000000000000000000000000000000000000009EC150019B BBCD11A4C4F407A2C4FC01A0C4FF01A0C4FF08A1C4FC0EA1C1F3049BBBCF0098 BA4A000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00A465341DA769 3A9FA76A3ADEA56736F6A76939E5A76A3ABCA4653453A4653405FFFFFF00FFFF FF00FFFFFF00A4653479A4653410FFFFFF00FFFFFF00A4653550A66838F6C090 68FAD3B08FFFDFC2A8FFDEC1A8FFD4B193FFB9875FF4A56737F0A4653458FFFF FF00A4663566A46534FFA465340FFFFFFF00A4653429A66939F5D3AD8CFFDCBD 9DFFDDBEA1FFE5CBB4FFE9D3BFFFEEDDCCFFF0E2D5FFE7D2BFFFAF774BF5A567 36C0AB7143F7A46635FCA465340EFFFFFF00A769399BC09069FDC59872FFA86B 3CFFA46635FFA76A3AFCB7855DF3D9BBA1FEF1E4D8FFF2E6DBFFF3E8DDFFCEA7 88FDEAD8C8FFA76A3AF9A465340DFFFFFF00A66838F3AB7041FFA96C3CFEA76A 3AF5A4653475A4653419A4653445A66938CDB98861F5EBDBCDFFF5EBE2FFF6EE E6FFF6EEE6FFA76A3AFAA465340BFFFFFF00A46535FEA76A3AFBC791689DA567 37E6A4653423FFFFFF00FFFFFF00FFFFFF00A4653460A46635FFE9D7C7FFEBD8 C6FFF5ECE3FFA66A3AFAA465340AFFFFFF00A46534FCB3794C7ECF9D762BBB83 5713A4653402FFFFFF00FFFFFF00A4653404A66838C4D0AC8FFAF6EEE7FFF2E6 DBFFF6EEE6FFA66A3AFBA4653409FFFFFF00A465340DFFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00A46534A0A46534FFAD7447F8AF774CF7AF77 4CF7AF784CF7A46534FFA4653408FFFFFF00A46534F9A46534FEA46534FEA465 34FDA46534FCA46534FBA46534B9A465341DA4653418A4653418A4653418A465 3418A4653418A465341CFFFFFF00FFFFFF00A46534FCF5EDE5FFF6EDE5FFF5EC E4FFD7B79CFDA66837E0A4653410FFFFFF00FFFFFF00FFFFFF00FFFFFF00D5A4 7E1ACD997239A46534FCA465340CFFFFFF00A46635FCF6EEE6FFEBD7C4FFEAD9 C9FFA46534FEA465346AFFFFFF00FFFFFF00FFFFFF00A465340BA56635E9C995 6C8DB77F53C2A46534FFA4653405FFFFFF00A56737FDF6EEE6FFF5ECE3FFF5ED E4FFE6D2C1FFB0794DF5A66938CAA4653436FFFFFF00A465346AA96B3CEDB67C 4FFFA76A3AFEA56837FAFFFFFF00FFFFFF00A66838FDF1E4D8FFD4B295FEF4E9 E0FFF3E8DDFFEDDCCCFFD2AD8FFEB0784CF5A56635FBA66939FFA66939FEA96D 3DFFB0784CFFA76A3AA8FFFFFF00FFFFFF00A56737FEB7845BF7A56736D4B17A 4EF4E3CAB4FFECDAC9FFE7D1BCFFE3C9B0FFDEBEA0FFD2AB88FFCEA582FFD3AE 8EFFA66838F5A465342AFFFFFF00FFFFFF00A46534FFA5673693FFFFFF00A465 3454A66737EEB58055F3CEA684FFD8B697FFDBB999FFD3AC8AFFC2946DFCA668 38F6A466355BFFFFFF00FFFFFF00FFFFFF00A46534A2A4653401FFFFFF00FFFF FF00A4653405A4653453A76A3ABEA66938E9A46635FAA76A3AE4A76B3BAAA465 3424FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00884A2086874A20F9884B 21C6874A2025FFFFFF00FFFFFF00FFFFFF00FFFFFF00A5673686A46635F9A668 38C6A4653425FFFFFF00FFFFFF00FFFFFF00874A206B8B4E23F49F6131FF9658 2AFD884B20E1874A200BFFFFFF00FFFFFF00A466356BAA6E3DF4C89669FFBA83 54FDA66736E1A465340BFFFFFF00FFFFFF00884B20ED9F6030FFA46534FFA465 34FF8C4F23F2874A204DFFFFFF00FFFFFF00A56736EDC79567FFCF9F72FFCF9F 72FFAC7040F2A465344DFFFFFF00874A2018884B20F7A46534FFA46534FFA465 34FF945629FC874A2087FFFFFF00A4653418A56736F7CF9F72FFCF9F72FFCF9F 72FFB88050FCA4663587FFFFFF00874A204D8D5024F0A46534FFA46534FFA465 34FF9A5C2DFF894B21C9FFFFFF00A465344DAD7242F0CF9F72FFCF9F72FFCF9F 72FFC18C5EFFA76938C9FFFFFF00874A2082945629FCA46534FFA46534FFA465 34FFA06231FF874A20F6FFFFFF00A4653482B88051FCCF9F72FFCF9F72FFCF9F 72FFCA986BFFA56635F6FFFFFF00874A2079945629FAA46534FFA46534FFA465 34FF9F6030FF884B20EDFFFFFF00A4653479B77F50FACF9F72FFCF9F72FFCF9F 72FFC89568FFA56736EDFFFFFF00874A20518E5025F0A46534FFA46534FFA465 34FF995B2CFF894B21BAFFFFFF00A4653451AF7444F0CF9F72FFCF9F72FFCF9F 72FFBF8A5BFFA76938BAFFFFFF00874A2029894C21F3A46534FFA46534FFA465 34FF935528F9874A207AFFFFFF00A4653429A86A3AF3CF9F72FFCF9F72FFCF9F 72FFB67D4EF9A465347AFFFFFF00874A2006874A20FD874A20FF874A20FF874A 20FF874A20FF874A2044FFFFFF00A4653406A46534FDA46534FFA46534FFA465 34FFA46534FFA4653444FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00874A20E4874A20FF874A20FF874A 20FF874A20FAFFFFFF00FFFFFF00FFFFFF00A56635E4A46534FFA46534FFA465 34FFA46534FAFFFFFF00FFFFFF00FFFFFF00884B21C69A5C2DFFA46534FF9D5F 2FFF884B21E1FFFFFF00FFFFFF00FFFFFF00A66838C6C08B5DFFCF9F72FFC592 64FFA66837E1FFFFFF00FFFFFF00FFFFFF00874A20668C4F24F69E5F2FFF8F51 25F9884B208AFFFFFF00FFFFFF00FFFFFF00A4653466AC7040F6C69365FFB075 45F9A567368AFFFFFF00FFFFFF00FFFFFF00874A2008874A2082874A20F3884B 2096874A2010FFFFFF00FFFFFF00FFFFFF00A4653408A5663582A56635F3A667 3696A4653410FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00874A2002FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C5C5C575CCCCCC99BCBCBC3CFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF007373733C72727286979797DAE8E8E8FFF1F1F1FFCFCFCFF77373 738C6C6C6C3CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF007373735C727272DCBABABAFFD8D8D8FFF4F4F4FFFDFDFDFFEAEAEAFFBCBC BCFF6B6B6BDC6A6A6A5CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00757575C6C4C4C4FFDFDFDFFFEBEBEBFFE8E8E8FFF6F6F6FFF0F0F0FFE9E9 E9FFABABABFF6C6C6CC6FFFFFF00FFFFFF00FFFFFF00FFFFFF00B0B0B001ADAD AD01A1A1A1F2EFEFEFFFF0F0F0FFE6E6E6FFEDEDEDFFEEEEEEFFF9F9F9FFDDDD DDFFDEDEDEFF898989F6FFFFFF00FFFFFF00B1B1B103AFAFAF22ACACAC3CA9A9 A942B0B0B0FECBCBCBFFEFEFEFFFEFEFEFFFEDEDEDFFEFEFEFFFEFEFEFFFEFEF EFFFA6A6A6FF898989FFFFFFFF00FFFFFF00AFAFAF2AACACACA6A8A8A8E6A4A4 A4F2A1A1A1FFB9B9B9FFC7C7C7FFBEBEBEFFBFBFBFFFBBBBBBFFC2C2C2FFBABA BAFFC6C6C6FF848484FFFFFFFF00AEAEAE0CABABABB6D7D7D7FFEEEEEEFFF3F3 F3FFE3E3E3FFB6B6B6FFA9A9A9FFCCCCCCFFCDCDCDFFCACACAFFC6C6C6FFB6B6 B6FFB6B6B6FF7E7E7EFFFFFFFF00AAAAAA52C1C1C1FFEFEFEFFFE5E5E5FFEBEB EBFFF1F1F1FFEEEEEEFFB6B6B6FFA9A9A9FFD8D8D8FFCBCBCBFFD0D0D0FF9D9D 9DFFB5B5B5FF797979FFFFFFFF00A5A5A5BBE2E2E2FFDCDCDCFFD8D8D8FFDDDD DDFFE5E5E5FFEFEFEFFFE9E9E9FF868686FFD7D7D7FFCDCDCDFFD3D3D3FF9797 97FFB4B4B4FF747474FFFFFFFF00A0A0A0D0E6E6E6FFBFBFBFFFD0D0D0FFD5D5 D5FFDADADAFFE5E5E5FFF5F5F5FF787878FFC6C6C6FFCDCDCDFFD3D3D3FF9191 91FFB1B1B1FF6F6F6FFFFFFFFF009A9A9AB2DBDBDBFFE8E8E8FFB7B7B7FFA9A9 A9FFCCCCCCFFDADADAFFF5F5F5FF717171FFBFBFBFFFCBCBCBFFD1D1D1FF8C8C 8CFFAFAFAFFF6B6B6BFFFFFFFF009494945AB5B5B5FFF4F4F4FFE5E5E5FFDBDB DBFFDADADAFFDADADAFFF0F0F0FF6E6E6EFFCFCFCFFFC9C9C9FFD0D0D0FF8F8F 8FFFB9B9B9FF666666FFFFFFFF00FFFFFF00888888ACB5B5B5FFF3F3F3FFE9E9 E9FFE3E3E3FFE4E4E4FFB6B6B6FF929292FFE5E5E5FFE4E4E4FFDEDEDEFFD4D4 D4FFA0A0A0FF626262E5FFFFFF00FFFFFF00828282017C7C7CAEA7A7A7FFDADA DAFFD8D8D8FFD3D3D3FF666666FE727272FF707070FF6C6C6CFF686868FF6565 65FA626262E05F5F5F13FFFFFF00FFFFFF00FFFFFF00FFFFFF007171715D6C6C 6CE2686868C9646464BC60606061FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000007AB9FF007AB9FF007A B9FF007AB9FF007AB9FF00000000000000000000000000000000000000000000 000000000000000000000000000000000000007AB9FF9AEFFEFF9AEFFEFF9292 92FF97ECFEFF96ECFEFF0178B6FF000000000000000000000000000000000000 0000000000000000000000000000007AB9FF9DF2FEFF9DF2FEFF929292FFB6B6 B6FF0E0E0EFF99EEFEFF98EEFEFF0373ADFF0471AAFF056EA5FF066AA0FF0767 9BFF086597FF00000000000000000179B7FFC5F8FFFFC1F4FDFF929292FFC5F8 FFFF0E0E0EFFA7E0EEFFA0D9EBFF9BD5E7FF94CFE3FF8DCADFFF87C4DCFF81BF D9FF7ABAD5FF0B5D8AFF000000000277B4FFC3F6FDFF9CF3FEFF929292FFB6B6 B6FF0E0E0EFF92EBFDFF90E9FDFF8DE7FDFF8AE4FDFF88E2FDFF86E0FDFF83DE FDFF76B6D2FF0B5D8AFF000000000175B2FFBEF3FBFF9CF2FEFFB6B6B6FF0000 0000B6B6B6FF91E9FDFF8EE8FDFF8CE5FDFF89E3FDFF87E1FDFF84DEFDFF81DC FCFF72B3CFFF0B5D8AFF000000000374AFFFBAEFF9FF9AF1FEFF000000009292 92FF0000000090E8FDFF8DE6FEFF8BE3FDFF87E1FDFF85DFFDFF82DDFDFF7FDB FDFF6DAFCDFF0B5D8AFF000000000373ADFFB5ECF6FF98F0FEFFB6B6B6FF9292 92FFB6B6B6FF8EE7FDFF8BE4FEFF89E2FDFF85DFFDFF84DEFDFF80DBFDFF7ED9 FCFF69ABCBFF0B5D8AFF000000000471AAFFB1E7F4FF97EFFEFF000000009292 92FF000000008CE5FEFF8AE3FEFF87E1FDFF84DEFDFF81DCFDFF80DAFDFF7CD8 FDFF65A8C8FF0B5D8AFF00000000056FA7FFADE4F2FF95EDFDFFB6B6B6FF9292 92FFB6B6B6FF8AE4FDFF88E2FDFF85DFFDFF83DDFDFF80DBFDFF7DD9FDFF7BD6 FCFF60A4C6FF0B5D8AFF00000000056EA4FFA8E0EFFF94ECFDFF000000009292 92FF0000000089E2FDFF86E0FDFF84DEFCFF81DCFDFF7FD9FDFF7CD7FCFF79D5 FCFF5CA1C3FF0B5D8AFF00000000056CA1FFA4DDEDFF9ED7E8FF97D2E6FF90CD E1FF8AC8DEFF84C2DAFF7EBDD7FF77B8D3FF71B2D0FF6AADCCFF64A7C9FF5DA3 C4FF579DC1FF0B5D8AFF0000000000000000086597FF096496FF086495FF0963 94FF096292FF096291FF0A608FFF0B608FFF0A5E8DFF0B5E8BFF0C5E8AFF0C5C 8AFF0C5C88FF0000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000774B3B86774A3AE1784938FC794A38FD774B3AE3764C3D8D000000000000 000000000000000000000000000000000000000000000000000077493821784C 3BE2C3ADA4FFF4EFEDFFFDFCFCFFFBF9F7FFEFE7E2FFBEA59AFF794E3EE9764D 3D26000000000000000000000000000000000000000000000000784D3CE6E0D5 D0FFFAF8F5D5F4EFE8AAF3EAE2A4EEE3D9A8EBDFD3B2EDE2D8D9D6C4B9FF7B51 41F00000000000000000000000000000000000000000764D3D8EC3ADA4FFFAF8 F5D6F7F3EFA0FAF7F49FF6F0EBA2F2E8DFA6EDE0D4AAE4D3C2A7E5D5C5D3B89C 8DFF775143A2000000000000000000000000000000007A5040EDF4EFEDFFF5EF E8ACFAF7F39FFDFCFA9DF7F1ECA1F2E7DFA4EBDDD0A4E4D2C1A5C49D788AE1D2 C5FF7F5546F600000000000000000000000000000000794A39FDFDFBFAFFF2E9 E0A5F8F3EEB2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7CCC1C1B988597BE9DB CEFF7A4B39FE716461020000000000000000000000007A4B3AFEFAF7F4FFEDE1 D6A7F1E7DEA7FFFFFFFFF5F0EBC9ECE6E0CCE2DAD2C8CDAE9191B682537DE7D6 C9FF7A4B39FE7164610B0000000000000000000000007E5445F4EDE5E0FFE8D9 CBADE8D7C89EFFFFFFFFE3D0C097E0CAB596D6B99D90BA895C7BBC8E608CDBC7 B5FF835848F9000000000000000000000000000000007A574ABABDA498FFECE0 D4D7D8BEA693FFFFFFFFD8BEA594CCA88787B9895B7AB27E4B80D9C1AAD6B191 7EFF836054D7000000000000000000000000000000007164610A805747F7D5C2 B7FFE4D3C3D3C59D778AFFFFFFFFB581527EBA8D5E8DD9C0A9D6C8AE9BFF8559 49FA7164611B000000000000000000000000000000000000000073584F4D8057 47F9B89B8CFFE0D0C2FFE8D9CCFFE5D6C7FFDAC6B5FFB2907EFF865A4AFB7C62 596A000000000000000000000000000000000000000000000000000000007164 6113836358DD835B4BFC98ACA6FF98ADA7FF98B1ABFF80685EF37164611F0000 0000000000000000000000000000000000000000000000000000000000000000 00004259590C3E5E5EFFC1EDEBFFCAF8F5FFABDFDDFF3E5E5EFF000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000425959073E5E5EFF5C8080FF84AAA8FF668B8AFF3E5E5EFF000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000003E5E5EFFBAE6E3FEC9F6F3FFB0D5D3FE3E5E5EFF000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000003E5E5E4C363939A5464646EC303030A93E5E5E4C000000000000 0000000000000000000000000000699A2FFF412323FF412323FF412323FF4123 23FF412323FF412323FF412323FF412323FF412323FF412323FF412323FF4123 23FF412323FF412323FFFF0000FF412323FFD8E9ECFFD8E9ECFFD8E9ECFFD8E9 ECFFD8E9ECFFD8E9ECFFD8E9ECFFD8E9ECFFD8E9ECFFD8E9ECFFD8E9ECFFD8E9 ECFFD8E9ECFFD8E9ECFF412323FF412323FF412323FF412323FF412323FF4123 23FF412323FF412323FF412323FF412323FF412323FF412323FF412323FF4123 23FF412323FF412323FF412323FF412323FFFFF8F1FFFFF8F1FFFFF8F1FFFFF8 F1FFFFF8F1FFFFF8F1FFFFF8F1FF412323FFFFF8F1FFFFF8F1FFFFF8F1FFFFF8 F1FFFFF8F1FFFFF8F1FF412323FF412323FFFFF8F1FF412323FF412323FF4123 23FF412323FFFFF8F1FFFFF8F1FF412323FFFFF8F1FF412323FF412323FF4123 23FFFFF8F1FFFFF8F1FF412323FF412323FFFFF8F1FFFFF8F1FFFFF8F1FFFFF8 F1FFFFF8F1FFFFF8F1FFFFF8F1FF412323FFFFF8F1FFFFF8F1FFFFF8F1FFFFF8 F1FFFFF8F1FFFFF8F1FF412323FF412323FFFFF8F1FF0000FFFF0000FFFF0000 FFFF0000FFFFFFF8F1FFFFF8F1FF412323FFFFF8F1FFFF0000FFFF0000FFFF00 00FFFFF8F1FFFFF8F1FF412323FF412323FFFFF8F1FFFFF8F1FFFFF8F1FFFFF8 F1FFFFF8F1FFFFF8F1FFFFF8F1FF412323FFFFF8F1FFFFF8F1FFFFF8F1FFFFF8 F1FFFFF8F1FFFFF8F1FF412323FF412323FFFFF8F1FFFF00FF00FF00FF00FF00 FF00FF00FF00FFF8F1FFFFF8F1FF412323FFFFF8F1FFFFFF00FFFFFF00FFFFFF 00FFFFF8F1FFFFF8F1FF412323FF412323FFFFF8F1FFFFF8F1FFFFF8F1FFFFF8 F1FFFFF8F1FFFFF8F1FFFFF8F1FF412323FFFFF8F1FFFFF8F1FFFFF8F1FFFFF8 F1FFFFF8F1FFFFF8F1FF412323FF412323FFFFF8F1FF00FF00FF00FF00FF00FF 00FF00FF00FFFFF8F1FFFFF8F1FF412323FFFFF8F1FF00FFFFFF00FFFFFF00FF FFFFFFF8F1FFFFF8F1FF412323FF412323FFFFF8F1FFFFF8F1FFFFF8F1FFFFF8 F1FFFFF8F1FFFFF8F1FFFFF8F1FF412323FFFFF8F1FFFFF8F1FFFFF8F1FFFFF8 F1FFFFF8F1FFFFF8F1FF412323FF412323FFFFF8F1FFFFF8F1FFFFF8F1FFFFF8 F1FFFFF8F1FFFFF8F1FFFFF8F1FF412323FFFFF8F1FFFFF8F1FFFFF8F1FFFFF8 F1FFFFF8F1FFFFF8F1FF412323FF412323FF412323FF412323FF412323FF4123 23FF412323FF412323FF412323FF412323FF412323FF412323FF412323FF4123 23FF412323FF412323FF412323FF412323FFFFFFFFFFFFFFFFFF412323FF4123 23FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFF412323FF412323FF412323FF412323FF412323FF4123 23FF412323FF412323FF412323FF412323FF412323FF412323FF412323FF4123 23FF412323FF412323FF412323FF000000008A8F8DFF858A88FF858A88FF858A 88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF858A 88FF858A88FF8A8F8DFF0000000000000000858A88FFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF888D8BFF0000000000000000858A88FFFFFFFFFFF7F8F8FFF7F8 F8FFF7F8F8FFF7F8F8FFF7F8F8FFF7F8F8FFF7F8F8FFF7F8F8FFF7F8F8FFF7F8 F8FFFEFEFEFF888D8BFF0000000000000000858A88FFFFFFFFFFF7F8F8FF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFF7F8 F8FFFEFEFEFF888D8BFF0000000000000000858A88FFFFFFFFFFF7F8F8FFF4F5 F5FFF4F5F5FFF4F5F5FFF4F5F5FFF4F5F5FFF4F5F5FFF4F5F5FFF4F5F5FFF7F8 F8FFFEFEFEFF888D8BFF0000000000000000858A88FFFFFFFFFFF7F8F8FFF7F8 F8FFF7F8F8FFF7F8F8FFF7F8F8FFF7F8F8FFF7F8F8FFF7F8F8FFF7F8F8FFF7F8 F8FFFEFEFEFF888D8BFF0000000000000000858A88FFFFFFFFFFF7F8F8FFFF00 FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFF5F6 F6FFFEFEFEFF888D8BFF0000000000000000858A88FFFFFFFFFFF7F8F8FFF7F8 F8FFF7F8F8FFF7F8F8FFF7F8F8FFF7F8F8FFF7F8F8FFF6F7F7FFF5F6F6FFF4F5 F5FFFEFEFEFF888D8BFF0000000000000000858A88FFFFFFFFFFF7F8F8FFF7F8 F8FFF7F8F8FFF7F8F8FFF7F8F8FFF6F7F7FFF5F6F6FFF4F5F5FFF3F4F4FFF3F3 F3FFFEFEFEFF888D8BFF0000000000000000858A88FFFFFFFFFFF7F8F8FF007F 00FF007F00FF007F00FF007F00FF007F00FF007F00FF007F00FF007F00FFF1F2 F2FFFEFEFEFF888D8BFF0000000000000000858A88FFFFFFFFFFF7F8F8FFF3F4 F4FFF3F4F4FFF2F3F3FFF1F2F2FFF0F1F1FFEFF0F0FFEEEFEFFFEDEEEEFFF0F0 F0FFFEFEFEFF888D8BFF0000000000000000858A88FFFFFFFFFFF6F7F7FFF5F6 F6FFF4F5F5FFF3F4F4FFF2F3F3FFF2F2F2FFF1F1F1FFF0F0F0FFEFF0F0FFEEEF EFFFFEFEFEFF888D8BFF0000000000000000858A88FFFFFFFFFFF4F5F5FF9999 99FF999999FF999999FF999999FF999999FF999999FF999999FF999999FFEDED EDFFFEFEFEFF888D8BFF0000000000000000858A88FFFFFFFFFFF3F4F4FFEFF0 F0FFEEEFEFFFEDEEEEFFEDEDEDFFECECECFFEBEBEBFFEAEAEAFFE9E9E9FFEBEC ECFFFEFEFEFF888D8BFF0000000000000000858A88FFFFFFFFFFFEFEFEFFFEFE FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE FEFFFFFFFFFF888D8BFF00000000000000008A8F8DFF888D8BFF888D8BFF888D 8BFF888D8BFF888D8BFF888D8BFF888D8BFF888D8BFF888D8BFF888D8BFF888D 8BFF888D8BFF8A8E8CFF00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C99B6433C99B6433C99B6433C698 6233C3955F33C0925C33FFFFFF00FFFFFF00B3855033AE804C33A97B4733A376 42339E703D33986B3833FFFFFF00C99B6433C99B64FFD3AE82FFD0AC80FFCEA9 7DFFCBA67BFFC6A074FFB789532DB2844F2DBB956AFFB8946AFFB49066FFAF8B 62FFAB875EFF926432FF996C3933C69963FFC89A63FFFAFAFAFFFAFAFAFFFAFA FAFFF8F8F8FFD9C6B1FFB1834EE6AC7E4AE6D7C4AFFFF9F9F9FFF9F9F9FFF9F9 F9FFF9F9F9FF8B5D2CFF976938FFC69963FFC59760FFFAFAFAFFCDCDCDFFCACA CAFFC6C6C6FFF2F2F2FFDDD8D2FFEBE5DFFFFCFCFCFFCCCCCCFFC9C9C9FFBDBD BDFFF9F9F9FF845726FF916333FFC69963FFC1935CFFFAFAFAFFF2F2F2FFEFEF EFFFEAEAEAFFD5D5D5FFB5B5B5FFDFDFDFFFF5F5F5FFF1F1F1FFECECECFFDEDE DEFFF9F9F9FF7D5020FF8A5E2DFFC69862FFBC8E58FFFAFAFAFFCCCCCCFFCACA CAFFC5C5C5FFD4D4D4FFA7A7A7FFD8D8D8FFF5F5F5FFCBCBCBFFC7C7C7FFBBBB BBFFF8F8F8FF774A1AFF845828FFC29560FFB78953FFFAFAFAFFF1F1F1FFEDED EDFFE9E9E9FFD4D4D4FFA6A6A6FFD8D8D8FFF5F5F5FFEFEFEFFFEBEBEBFFDCDC DCFFF8F8F8FF714415FF7F5323FFBE915CFFB1834EFFF9F9F9FFCCCCCCFFC9C9 C9FFC5C5C5FFD3D3D3FFA6A6A6FFD8D8D8FFF4F4F4FFCACACAFFC6C6C6FFBABA BAFFF8F8F8FF6B3E10FF7A4D1EFFBA8D58FFAB7D49FFF9F9F9FFF1F1F1FFEDED EDFFE7E7E7FFD3D3D3FFA5A5A5FFD7D7D7FFF4F4F4FFEEEEEEFFEAEAEAFFDCDC DCFFF8F8F8FF66390BFF74481AFFB68854FFA57743FFF9F9F9FFF9F9F9FFF9F9 F9FFF8F8F8FFF1F1F1FFE3E3E3FFF3F3F3FFF8F8F8FFF9F9F9FFF8F8F8FFE9E9 E9FFF8F8F8FF623507FF704416FFB0834FFF9E703DFF986B38FF936533FF8D60 2EFF875A29FF825424FFAB9074FFAA8F73FF724516FF6D4011FF693C0DFF6538 0AFF613406FF5E3103FF6C3F12FFAB7E4AFFB38B5DFFB38B5DFFB38B5DFFB38B 5DFFB38B5DFFB38B5DFF7D5121FF794C1DFFB38B5DFFB38B5DFFB38B5DFFB38B 5DFFB38B5DFFB38B5DFF683C0EFFA37642FF9E703DFF986B38FF936533FF8D60 2EFF875A29FF825424FF936839FF906536FF724516FF6D4011FF693C0DFF6538 0AFF613406FF5E3103FF5B2E01FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF008254249F764919E1714415E1825424BAFFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00CFCFCF48648BC2FF4978BEFF2861 BAFF000000360000003600000036000000360000003600000036000000360000 0036000000360000003600000020CFCFCF2ECCCCCCF4C4C7CAFFC1C7CDFF275F B8FFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFC FCFFFCFCFCFFFCFCFCFF0000003678787806B1B1B1606787B9FF679AC5FF275E B8FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF5F5F5FFF4F4F4FFF4F4F4FFF4F4 F4FFF2F2F2FFFBFBFBFF00000036CFCFCF2ECCCCCCF4C4C7CAFFC0C7CDFF265B B7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF7F7F7FFF5F5F5FFF5F5F5FFF5F5 F5FFF3F3F3FFFAFAFAFF0000003678787806B1B1B1606783B7FF6699C4FF2659 B7FFF8F8F8FFF8F8F8FFE1A57AFFE1A378FFE1A377FFE0A276FFE0A076FFE0A0 74FFF4F4F4FFFAFAFAFF00000036CFCFCF2ECCCCCCF4C4C6CAFFC0C7CDFF2656 B5FFF9F9F9FFF9F9F9FFE1A378FFEAC0A3FFEAC0A2FFEABFA1FFEABEA0FFDF9E 71FFF4F4F4FFF7F7F7FF0000003678787806B1B1B1606682B5FF6596C3FF2555 B4FFFAFAFAFFFAFAFAFFE0A276FFE0A076FFE0A074FFDF9E73FFDC9C72FFDC9B 6FFFF2F2F2FFF6F6F6FD00000036CFCFCF2ECCCCCCF4C4C6CAFFC0C7CDFF2552 B2FFFBFBFBFFFAFAFAFFF8F8F8FFF8F8F8FFF8F8F8FFF7F7F7FFF3F3F3FFF2F2 F2FFF0F0F0FFEEEEEEF40000003378787806B1B1B160657FB5FF6494C2FF2451 B2FFFAFAFAFFF8F8F8FFE09F73FFDD9D71FFDC9A6EFFDA996BFFD9986AFFD493 6AFFEAEAEAFFECECECFF00000036CFCFCF2ECCCCCCF4C4C6CAFFC0C6CDFF234E B1FFFAFAFAFFF9F9F9FFF8F8F8FFF7F7F7FFF6F6F6FFFAFAFAFFFAFAFAFFFAFA FAFFF2F2F2FFD1D1D1FF0303033878787806B1B1B160647CB3FF6392C1FF234B AFFFF9F9F9FFF9F9F9FFF9F9F9FFF6F6F6FFF3F3F3FFFAFAFAFFFAFAFAFFF2F2 F2FFC9C9C9FFE8E8E8FF00000036CFCFCF2ECCCCCCF4C4C6CAFFC0C6CCFF2249 AEFFFAFAFAFFFAFAFAFFF8F8F8FFF4F4F4FFF1F1F1FFFBFBFBFFF2F2F2FFCACA CAFFE6E6E6FFFCFCFCFF0000003678787806B1B1B1606379B3FF618FBFFF2246 AEFFFAFAFAFFFAFAFAFFF6F6F6FFF3F3F3FFEEEEEEFFF3F3F3FFCACACAFFE6E6 E6FFFBFBFBFFFCFCFCFF00000036CFCFCF2ECCCCCCF4C4C6CAFFC0C6CCFF2143 ACFFFDFDFDFFFBFBFBFFF8F8F8FFF4F4F4FFEDEDEDFFD5D5D5FFE9E9E9FFFFFF FF00FFFFFF00FFFFFF000000003678787806747474212C4BA5FF355DAFFF2142 ABFFDCDCDCFFD8D8D8FFD4D4D4FFD2D2D2FFD1D1D1FFD3D3D3FFD1D1D1FFCBCB CBFFCDCDCDFFC7C7C7FF00000036FFFFFF00FFFFFF001225603F18317E811326 6364000000360000003600000036000000360000003600000036000000360000 0036000000360000003600000020FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00AAA39E99C3BFBBFAC8C4BFFFC8C2BEFFC5C0 BAFFC1BAB5FFBDB6B1FFB9B2ABFFB5ACA5FFB0A79FFFABA098FFA69B92FFA195 8BFF9C8F85FF94877CFA7E736B6EC3BFBBFE4A4FD3FF17ADE2FF3EB042FFE1DB D6FFE1DBD6FFE1DBD6FFE1DBD6FFE1DBD6FFE1DBD6FFE1DBD6FFE1DBD6FFE1DB D6FFE1DCD7FFEDEAE7FF8B7B6E93C9C3BFFFB8BBF1FF94E4F6FFB2E5B4FFEDE9 E6FFEDE9E6FFEDE9E6FFEDE9E6FFEDE9E6FFEDE9E6FFEDE9E6FFEDE9E6FFEDE9 E6FFEDE9E6FFF5F4F2FF86776994C5C0BAFF313131FF323232FF333333FF3434 34FF353535FF363636FF373737FF393939FF3B3B3BFF3C3C3CFF3D3D3DFF3F3F 3FFF414141FF434343FF7F706494C3BEB9FF343434FF202020FF212121FF2222 22FF242424FF252525FF262626FF282828FF2A2A2AFF2C2C2CFF2D2D2DFF2F2F 2FFF313131FF464646FF8F7F7394C1BAB5FF343434FF202020FFCFCFCFFFA8A8 A8FF242424FF252525FF262626FF282828FF2A2A2AFF2C2C2CFF2D2D2DFF2F2F 2FFF313131FF464646FF8B7B6E94BEB7B2FF393939FF252525FF262626FFDEDE DEFF747474FF2A2A2AFF2C2C2CFF2D2D2DFF2F2F2FFF313131FF323232FF3434 34FF353535FF4B4B4BFF85766894BAB2ACFF3D3D3DFF292929FFD1D1D1FFADAD ADFF2E2E2EFF2F2F2FFF313131FF323232FF343434FF363636FF373737FF3838 38FF3A3A3AFF4E4E4EFF7E6F6394B6AEA7FF424242FF2F2F2FFF303030FF3131 31FF333333FF343434FF363636FF363636FF383838FF3A3A3AFF3B3B3BFF3D3D 3DFF3D3D3DFF525252FF786B5F94B2A9A1FF474747FF333333FF343434FF3636 36FF373737FF393939FF3A3A3AFF3B3B3BFF3C3C3CFF3E3E3EFF3F3F3FFF4040 40FF414141FF555555FF73665B94AEA49CFF4B4B4BFF383838FF393939FF3A3A 3AFF3C3C3CFF3D3D3DFF3F3F3FFF3F3F3FFF414141FF424242FF424242FF4444 44FF454545FF575757FF6E615694A99F96FF4E4E4EFF3D3D3DFF3D3D3DFF3E3E 3EFF3F3F3FFF414141FF424242FF434343FF444444FF454545FF464646FF4646 46FF484848FF5A5A5AFF695D53949D938AF2525252FF535353FF545454FF5555 55FF565656FF575757FF575757FF585858FF595959FF5A5A5AFF5B5B5BFF5C5C 5CFF5C5C5CFF5D5D5DFF61564C8C82786F6F91857CD293857CDF8F8276DF8C7E 72DF88796DDF847569DF7F7065DF7A6D61DF76695DDF71645ADF6E6156DF695D 53DF665A51DF61554CD2554C4440FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000001C000000330000 0036000000360000003600000036000000360000003600000036000000360000 002000000002FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000033F8F8F8F0FBFB FBFDFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFF8F8F8FF9494 94910000002000000002FFFFFF00FFFFFF00FFFFFF0000000036FBFBFBFDF4F4 F4FFF5F5F5FFF5F5F5FFF5F5F5FFF1F1F1FFEFEFEFFFE9E9E9FFFCFCFCFFE7E7 E7FF959595910000002000000002FFFFFF000000000100000036FCFCFCFFF7F7 F7FFF9F9F9FFF7F7F7FFF7F7F7FFF3F3F3FFF0F0F0FFEAEAEAFFFCFCFCFFF6F6 F6FFF4F4F4FF9999999100000020FFFFFF000000000100000036EFF0FBFFF9F9 F9FFF9F9F9FFF9F9F9FFF7F7F7FFF6F6F6FFF2F2F2FFEBEBEBFFFCFCFCFFFCFC FCFFFCFCFCFFFCFCFCFF00000036FFFFFF0000000001070A3642646AF3FF5253 F2FFFCFCFCFF5A57F4FF6568F4FFEBECF7FFF5F5F5FFF1F1F1FFECECECFFEAEA EAFFE6E6E6FFFCFCFCFF00000036FFFFFF001B2DE013343EE3D26366F2FF565F F2FFFCFCFCFF5A5BF4FF6868F3FF636BF3FFE8EAF7FFF5F5F5FFF2F2F2FFEFEF EFFFEDEDEDFFFCFCFCFF000000361B2FEC584A4DF2F76265F1FF5562F2FFE3E7 FAFFFCFCFCFFE4E6FAFF575CF2FF6265F1FF4D53F1FFA9B5F2FFF6F6F6FFF3F3 F3FFF2F2F2FFFCFCFCFF00000036464AF1F16B70F3FF474EEEFCCDD5F7FFFCFC FCFFFCFCFCFFFCFCFCFFCED4F8FF4A51EFFF676EF0FF4A59EFFFF3F5F8FFF6F6 F6FFF6F6F6FFFCFCFCFF000000361334E7584450F0F75B65F0FF5065EDFFE2E8 F9FFFCFCFCFFE3E7FAFF5362EFFF5B65F0FF4755EDFFA8B9F2FFF9F9F9FFF9F9 F9FFF8F8F8FFFCFCFCFF00000036FFFFFF000C36D6132847DAD25565EEFF4E6A EBFFFCFCFCFF5264EFFF5964EFFF5972ECFFEAEEF9FFFAFAFAFFFAFAFAFFF8F8 F8FFF8F8F8FFFCFCFCFF00000036FFFFFF0000000001020E32425773EAFF4662 EAFFFCFCFCFF495CEDFF5972ECFFEDF0F9FFFAFAFAFFFAFAFAFFFAFAFAFFFAFA FAFFFAFAFAFFFCFCFCFF00000036FFFFFF000000000100000036FCFCFCFFFCFC FCFFFCFCFCFFFCFCFCFFFCFCFCFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFB FBFFFBFBFBFFFCFCFCFF00000036FFFFFF000000000100000036FCFCFCFEFCFC FCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFC FCFFFCFCFCFFFCFCFCFD00000036FFFFFF00FFFFFF0000000034F9F9F9F5FCFC FCFDFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFC FCFFFCFCFCFDF9F9F9F300000033FFFFFF00FFFFFF000000001D000000340000 0036000000360000003600000036000000360000003600000036000000360000 003600000036000000330000001DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D9D9D967D4D4D4F6CFCF CFEFC8C8C8E5C0C0C0D8B7B7B7C3AEAEAE93A4A4A47D9B9B9B6E919191498787 8704FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D0D0D0F8C9C9C9F8C2C2 C267FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C4C4C4FDBCBCBCB4B3B3 B310FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FCDEC1E3FCDEC1FFBBB9B6FFB3B1AEFFFADB BEFFF8D8BBFFF6D5B7FFF3D2B3FFF0CEAEFFEDC9AAFFEAC5A4FFE7C09FFFE3BC 9AFFE0B795FFDDB28FFFD9AE8AE3FCDEC1FFEFE2D8FFEFE2D8FFEFE2D8FFEEE1 D7FFEEE0D6FFEEDFD4FFEDDDD2FFECDCD1FFEBDACEFFEAD8CCFFEAD7CAFFE8D5 C7FFE7D3C5FFE7D1C2FFD5A883FFFCDEC1FFEFE2D8FFFCFCFCFFE4CCBCFFFCFC FCFFE1C9B7FFFCFCFCFFDFC3B0FFFCFCFCFFDCBEA9FFFCFCFCFFD9B8A1FFFCFC FCFFF7F3F0FFE5CEBEFFD1A27DFFFADCBFFFEEE0D6FFE3CBBAFFE2C9B8FFE0C6 B4FFDFC4B1FFDEC2ADFFDCBFAAFFDABCA6FFD9B9A2FFD7B69EFFD6B39AFFE9D6 CAFFFCFCFCFFE3CBBAFFCE9D77FFF8D8BBFFEDDED4FFFCFCFCFFFCFCFCFFDEC2 AEFFFCFCFCFFDBBCA6FFFCFCFCFFD8B69EFFFCFCFCFFD5B097FFFCFCFCFFFCFC FCFFFCFCFCFFE1C8B6FFCA9972FFF5D4B6FFECDCD0FFDEC3AFFFDDBFABFFDBBD A7FFD9BAA3FFD8B79FFFD6B49CFFD5B197FFD3AE94FFD1AB8FFFD0A88CFFCFA6 88FFCDA385FFE0C5B3FFC7956EFFF2D0B1FFEAD8CCFFFCFCFCFFDABAA4FFFCFC FCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFCCA1 82FFFCFCFCFFDFC3B0FFC5926AFFEECBABFFE8D5C8FFE8D4C5FFE7D2C3FFE5D0 C1FFE5CEBEFFE3CCBCFFE3CAB9FFE2C9B7FFE1C7B5FFE0C5B3FFDFC4B1FFDFC4 B0FFDEC2AFFFDEC2AEFFC49068FFEAC5A4EBE7C09FFFE3BC9AFFE0B795FFDDB2 8FFFD9AE8AFFD6A985FFD3A57FFFD0A07BFFCD9C76FFCA9972FFC8966EFFC693 6BFFC49069FFC49068FFC49068EBFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000000000000000ACAC AC1DACACAC8FA4A4A4E7A3A3A3F3A3A3A3F2AEB0AF8A00000000000000000000 000000000000AFB1B04CA5A6A6B200000000000000000000000000000000ACAC AC4AA3A4A3ECAFB1B0C100000000AEB0AF519F9F9FD4A4A4A4E8A4A5A4E4AEB0 AF4F00000000AFB1B0D3AFB1B081000000000000000000000000000000008383 8394909191F0818181E5818181A1000000000000000000000000ACACAC1FA6A7 A7D2A6A7A6C8ADAFAEA0000000008083847F828586FF838886FF858A88FF8181 81FFBDBDBDFFA1A4A3FF828382FF858A88FF818685FF7F8283EF818485A40000 0000000000000000000000000000848788FFEDEDEDFEF0F0F0FFFAFAFAFF8383 83FFBABABAFFAAAAAAFF838383FFFAFAFAFFECECECFFD8D9DAFE848788FF0000 0000000000000000000000000000848788FFE7E7E6FFD3D3D2FFFAFAFAFF8383 83FFA0A0A0FFA3A3A3FF838383FFFAFAFAFFD3D3D2FFE7E7E6FF848788FF0000 0000000000000000000000000000848788FFE7E7E6FFD3D3D2FFFAFAFAFFFAFA FAFF878787FF878787FFFAFAFAFFFAFAFAFFD3D3D2FFE7E7E6FF848788FF0000 0000000000000000000000000000848788FFE7E7E6FFD3D3D2FFE5E5E5FFFAFA FAFFFAFAFAFFFAFAFAFFFAFAFAFFE5E5E5FFD3D3D2FFE7E7E6FF848788FF0000 0000000000000000000000000000848788FFE7E7E6FFD3D3D2FFD3D3D2FFD3D3 D2FFE0E0DFFFFCFCFCFFD3D3D2FFD3D3D2FFD3D3D2FFE7E7E6FF848788FF0000 0000000000000000000000000000848788FFDAD9DAFFE6E5E6FFE6E5E6FFE6E5 E6FFE1E1E1FFE6E5E6FFE6E5E6FFE6E5E6FFE6E5E6FFDAD9DAFF848788FF0000 0000000000000000000000000000848788FFE5E5E6FFD1D0D1FFD1D1D1FFD2D1 D2FFD0D0D1FFCECECEFFCCCDCCFFC9CACAFFC7C8C7FFDFDFDFFF848788FF0000 0000000000000000000000000000848788CCE4E4E4FFCECFCEFFCECFCFFFCECE CFFFCDCECEFFCCCCCCFFCACACAFFC8C8C8FFC5C6C6FFDFDFDFFF848788CC0000 0000000000000000000000000000848788A3E1E1E1FFD1D1D1FFCCCBCBFFCBCB CCFFCACACBFFC9CACAFFC8C8C7FFC6C6C6FFCCCBCCFFDFDFDFFF8487889B0000 000000000000000000000000000084878864B9BABAFFDDDDDDFFD4D4D4FFCDCD CDFFC8C8C8FFC7C7C7FFC5C5C5FFD1D1D1FFDBDBDBFFB4B5B5FF848788770000 00000000000000000000000000008487880E8A8D8EC3C0C1C1FFE1E1E1FFE0E0 E0FFE0E0DFFFDFDFDFFFDFDFDFFFDEDEDEFFBDBFBFFF9A9D9DFF848788160000 0000000000000000000000000000848788098487882184878895848788C78487 88FF848788FF848788FF848788FF848788FF848788E08487881B848788070000 0000000000000000000000000000FFFFFF00C17D4460C88B4DBBC88C4FEEC88C 4FF6C88C4FF7C88C4FF7C88D4FF7C98C4FF7C78B4FF7C5894BD4C4763B91B368 3C06FFFFFF00FFFFFF00FFFFFF00FFFFFF00C48549C3F7F2ECECF8F4EEFCF8F4 EDFFF8F3EDFFF8F3EDFFF8F3EDFFF8F2ECFFF7F2ECFFF2E6D7FFE2B27DFFDB94 65F5B3683B07FFFFFF00FFFFFF00FFFFFF00C5884BEAFAF6F2FCFAE0C7FFFBE1 C9FFFBE2C9FFFBE0C8FFF9DFC5FFF8DBC1FFF4D6B8FFFFFBF8FFF6D8B4FFE1B0 7DFFDB9264F6B46B3E07FFFFFF00FFFFFF00C6894CF6F9F5F1FFFCE3CDFFFBE3 CEFFFBE3CDFFFBE2CBFFF9E0C8FFF8DCC2FFF5D6BAFFFDFBF8FFFCE6CDFFFAE5 C9FFE2B684FFBF7942A6FFFFFF00FFFFFF00C6894BF7F9F5F1FFFCE3CFFFFBE4 D0FFFCE4CFFFFCE3CDFFFAE1CAFFF9DDC4FFF6D9BCFFF4E9DFFFF7F2ECFFFBF7 F3FFF5EFE9FFC27E45FBFFFFFF00FFFFFF00C6894BF7F9F4F0FFFCE6D3FFFCE6 D4FFFDE7D3FFFCE4D1FFFBE3CDFFFAE0C8FFF8DCC2FFF5D6BBFFF3D4B5FFF1D2 B3FFF8F4F0FFC48246F7FFFFFF00FFFFFF00C6884AF7F9F4EFFFFEE7D7FFFDE7 D6FFFDE7D5FFFDE6D4FFFCE6D2FFFBE1CCFFFADFC7FFF8DCC2FFF6DABDFFF6D8 BBFFFAF4EFFFC68346F7FFFFFF00FFFFFF00C68849F7F9F4EDFFFEE8D8FFFEE8 D8FFFEE8D7FFFEE7D6FFFDE5D3FFFCE4D1FFFBE1CCFF46A872FF319F65FFF8DC C2FFFAF4EDFFC68245F7FFFFFF00FFFFFF00C68447F7F9F3ECFFFEE8D6FFFEE8 D7FFFDE7D6FFFDE7D6FFFDE7D5FFFDE5D3FFFBE4D0FF41A46BFF5AB381FF2898 57FFFAF2EAFFC68042F7FFFFFF00FFFFFF00C58245F7F8F2EBFFFEE7D6FFFDE7 D6FFFDE7D6FF3DA56FFF3AA46FFF36A269FF329E63FF55AF7CFF91CBAAFF4FAB 74FF1B9148FFC47C3FF7FFFFFF00FFFFFF00C58042F7F8F1E8FFFEE5D5FFFDE5 D3FFFDE5D3FF37A36BFF96CEB0FF94CDADFF91CBAAFF90CBA8FF74BC90FF8AC7 A1FF46A568FF0A8735FF01832D01FFFFFF00C47C40F7F7F0E6FFF8B455FFF7B4 56FFF7B554FF319F63FF94CDADFF6FBA8EFF6BB889FF66B685FF61B380FF67B5 82FF83C298FF3CA05CFF007F25F9FFFFFF00C1783CF7F7EDE3FFFDC26EFFFFD8 A0FFFFD79EFF299B5BFF90CAA9FF8DC8A5FF8AC6A1FF88C59EFF6AB685FF82C2 97FF48A566FF1D7A23FE00791B09FFFFFF00BF7138F5F5EBDFFEFDBF68FFFCBD 67FFFBBE65FF239751FF1D9149FF178F43FF118B3BFF3A9F5EFF80C196FF46A3 62FF2E9446FFB4652CF3FFFFFF00FFFFFF00BC6933DEF8F1EAF2F7ECDFFDF6EB DEFFF6EADEFFF6EADCFFF6EADCFFFAF3EBFFFAF3EBFF158C3AFF43A15FFF3294 4AFFF8FBF8F0B7602AD5FFFFFF00FFFFFF00BB6A346BBA6530BCBB6631EDBA66 30F7BA6630F7BA6630F7BA6530F7BA652FF7B9652EF70E7B22FE037B1EFFB664 2EEFB7622CBDB7622E63FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00BB89626BE4C2A5F4E3BA95FFD8AF88FFD6AB 86FFD4A981FFCFAD90F4B8845FA9E2BD9FF4E1B48DFFE1B28AFFD1A27CFFCE9F 77FFC9A284F4AF78566BFFFFFF00E4BE9FFDEDC8A9FFEDC7A8FFEDC7A8FFECC6 A7FFECC5A5FFECC4A4FFE2B897FFEBC3A1FFEBC19FFFEAC09DFFEABF9CFFEABE 9AFFE9BD98FFC39473FDFFFFFF00E3B995FFE3B994FFE3B893FFE2B791FFE2B6 90FFE2B58EFFE1B38CFFE0B28AFFE0B189FFDFAF87FFDFAE85FFDEAC82FFDDAB 80FFDDA97EFFC08C67FFFFFFFF00E2B692FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFDFAD86FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFBB8461FFFFFFFF00E0B48FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFDCAA82FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB67F5BFFFFFFFF00DEB18CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFDAA67EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB17756FFFFFFFF00DBAD86FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFD6A178FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFAD7052FFFFFFFF00D9A982FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFD39D73FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFA86B4EFFFFFFFF00D5A47CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFCF986EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFA4674AFFFFFFFF00CF9D75FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFC89067FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF9D6045FFFFFFFF00CB9771FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFC58963FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF995D43FFFFFFFF00C8916BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFC1845EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF975A40FFFFFFFF00A66D4EA9C08862FFBC835FFFA66C4FFFA269 4BFF9F6549FF9D6246FF9C6045E2B97C57FFB57654FFB27251FF9A5E43FF975B 42FF975940FF975940A9FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000A971516BDDB18DF4DCA77BFFDCA67AFFDAA4 7AFFD8A279FFD5A076FFD49E75FFD29D73FFCF9A72FFCE9970FFCB966FFFC994 6CFFC49A7AF4A971516B00000000DDAC85FDE8B992FFE8B992FFE8B992FFE8B9 92FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B992FFE8B9 92FFE8B992FFC1906FFD00000000DCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 7BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA77BFFDCA7 7BFFDCA77BFFC08B66FF00000000DBA47AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFBD8763FF00000000D9A379FFFFFFFFFFCCCCCCFFCACACAFFC6C6 C6FFFEFAF7FFBDBDBDFFBBBBBBFFB7B7B7FFFEFAF7FFB1B1B1FFB0B0B0FFADAD ADFFFFFFFFFFBA8560FF00000000D8A279FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB7815EFF00000000D5A076FFFFFFFFFFC8C8C8FFC6C6C6FFC0C0 C0FFFEFAF7FFBABABAFFB8B8B8FFB2B2B2FFFEFAF7FFA9A9A9FFA7A7A7FFA5A5 A5FFFFFFFFFFB57E5CFF00000000D49E75FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFD4EAF6FF808691FF309ED33ED19C73FFFFFFFFFFC2C2C2FFC0C0C0FFB9B9 B9FFFEFAF7FFB5B5B5FFB3B3B3FFABABABFFFEFAF7FFA2A2A2FF9E9E9EFF7FA2 ADFF8AC1E7FFCBE3F8FF64A3D4EACC976FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCAEDF8FF9AE2 F4FF7BCEEFFF86BAE5FF75ABD9BDCA946EFFFFFFFFFFBEBEBEFFBABABAFFB2B2 B2FFFEFAF7FFB2B2B2FFAEAEAEFFA5A5A5FFFEFAF7FF7DA0ABFF9AE2F4FF6EE1 F7FF6FDAF4FF5F90BAFF00000000C8926CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8E1EDFF97D6E9FF6EE1F7FF6FDA F4FF74B4E5FFA97251FF00000000A97151A9C38E68FFC08B66FFBE8864FFBB85 61FFB9835FFFB47E5CFFB27C5AFF877668FF9CC7E2FF4BA7CDFF62C9E6FF5D8D B5FFA97151FFA97151A900000000000000000000000000000000000000000000 0000000000000000000000000000185876808CBEECFF5296D6FF256FB1BF0000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000134058401D567D80327EB66B000000000000 000000000000000000000000000000000000D8D8D847D6D6D6B3D1D1D1BFCBCB CBBFC5C5C5BFBEBEBEBFB6B6B6BFAFAFAFBFA5A5A5B3A0A0A047000000000000 0000000000000000000000000000D6D6D618DEDEDEAFEAEAEAFFEAEAEAFFEAEA EAFFEAEAEAFFEAEAEAFFE9E9E9FFE3E3E3FFDDDDDDFFADADADB08E8E8E180000 0000000000000000000000000000D6D6D64FE1E1E1EFE0E0E0FFDCDCDCFFD8D8 D8FFD5D5D5FFD4D4D4FFD5D5D5FFCCCCCCFFD9D9D9FFBCBCBCEE8E8E8E500000 0000000000000000000000000000D7D7D7B6E6E6E6FFE2E2E2FFDEDEDEFFDBDB DBFFDADADAFFD8D8D8FFD8D8D8FFD9D9D9FFDDDDDDFFD2D2D2FF909090B60000 0000000000000000000000000000CECECEDAD2D2D2FFC2C2C2FFB4B4B4FFB2B2 B2FFB0B0B0FFAEAEAEFFACACACFFA9A9A9FFB0B0B0FFBBBBBBFF948D87FFE8B9 92FFE8B992FFE8B992FFC1906FFDC6C6C6FFCECECEFFBDBDBDFF909090FF9191 91FF929292FF919191FF909090FF8E8E8EFFABABABFFBCBCBCFF808080FFDCA7 7BFFDCA77BFFDCA77BFFC08B66FFBFBFBFFFC9C9C9FFBABABAFFACACACFFAAAA AAFFA9A9A9FFA6A6A6FFA4A4A4FFA2A2A2FFA8A8A8FFB8B8B8FF7A7A7AFFFFFF FFFFFFFFFFFFFFFFFFFFBD8763FFB8B8B8F1CECECEFFC3C3C3FFBFBFBFFFBCBC BCFFB9B9B9FFB6B6B6FFB3B3B3FFB1B1B1FFAFAFAFFFB7B7B7FF797979FFB9B9 B9FFB9B9B9FFFFFFFFFFBA8560FFA4A4A4649D9D9D80959595808B8B8B80AD92 7EFFBDBDBDFFB8B8B8FFB5B5B5FFB2B2B2FFAFAFAFFFADADADFFBDBDBDFFFDFD FDFFFDFDFDFFFFFFFFFFB7815EFF00000000000000000000000000000000D5A0 76FFFFFFFFFFC1C1C1FFBEBEBEFFBABABAFFB7B7B7FFB5B5B5FFB2B2B2FFAEAE AEFFADADADFFFFFFFFFFB57E5CFF00000000000000000000000000000000D49E 75FFFFFFFFFFFFFFFFFFFEFEFEFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFDFFFDFD FDFFFCFCFCFFFFFFFFFFB27C5AFF00000000000000000000000000000000D19C 73FFFFFFFFFFB9B9B9FFB5B5B5FFB1B1B1FFADADADFFA9A9A9FFA6A6A6FFA2A2 A2FFA1A1A1FFFFFFFFFFB07A58FF00000000000000000000000000000000CC97 6FFFFFFFFFFFFDFDFDFFFDFDFDFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFBFB FBFFFBFBFBFFFFFFFFFFAC7554FF00000000000000000000000000000000CA94 6EFFFFFFFFFFB2B2B2FFADADADFFA8A8A8FFA4A4A4FF9F9F9FFF9D9D9DFF9999 99FF999999FFFFFFFFFFAA7353FF00000000000000000000000000000000C892 6CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFA97251FF00000000000000000000000000000000A971 51A9C38E68FFBB8561FFB9835FFFB47E5CFFB27C5AFFB17B58FFAE7957FFAB75 54FFA97353FFA97151FFA97151A90000000000000000888D8B48888D8BEC9095 93D500000000000000000000000000000000888D8B978C918FEE000000000000 0000000000000000000000A0C45D00000000000000008B908EF6F7F7F7FD888D 8BB79297957D00000000000000008D9190E6D0D3D2FE8C918FBF000000000000 00000000000000A0C43D00A0C4FA0000000000000000888D8BFED0D4D2FFEFF0 EFFD8F9492AC00000000878C8A3FA7ACAAFFC3C8C6FF8A8F8DF7000000000000 000000A0C42403A2C5F203A1C5FF00000000000000008A8F8DF3B0B5B3FFF6F7 F7FE888D8BD79297957D8B908EFAC9CECCFFABAFAEFD888D8BD40000000000A0 C41103A3C6E375DAEBFE10A6C8FC0000000000000000878C8A39888D8BFFD9DC DBFFEFF0EFFE8A8F8DE5B3B8B6FFCBCECDFF888D8BFD888D8B7D00A0C40503A3 C6C857CEE3FABCF6FDFF10A6C8FC0000000000000000000000008A8F8DE1B2B6 B5FFF7F7F7FF9B9F9EFFB3B6B5FFB5BAB8FD888D8BB20000000003A3C6A53ABE D9F7ADF4FDFFB1F5FDFF0FA5C7FC000000000000000000000000888D8B33888D 8BFEDFE1E1FF979C9AFFA5A9A8FF888D8BF7888D8B3302A2C57B22B3D0F5A7F1 FBFF62E8F9FFA4F1FBFF0EA5C7FC000000000000000000000000000000008A8F 8DA1B7BBBAFDA7ACAAFF8B908EFE878C8A9700A0C45310A8CAF69BEBF7FF6BE6 F7FF44DFF4FF9CEEF9FF0DA4C7FC0000000000000000000000001818AE8D1717 AAF70606A6FF0202A6FF191AC7FF1719ACF50F57B8FB88E3F2FF74E5F6FF37D2 EAFF3FDAF1FF94EAF7FF0CA4C7FC000000001919AE7D0707A9FD2020D2FD1E1E CEFE0E0FB7FD0204A7FE1A1AC9FF1F21D0FF1F20CBFF0A0BA9FF2C8ED4FF08A7 CAFF3AD6EDFF8BE6F4FF0BA3C7FC1A1AAF5C0606A8FE1F1FD0FB0303A8B81415 C0F80101A6FF004FB01A1B1ECCFF1419C0FF2742BDFF1D20CDFF0606A7FF0C5E B9FF34D0E8FF84E2F2FF0AA3C6FC1414ABE62323D5FD0303A87A000000001D1D CEF50A0AA9FC02A2C6BF0304A8FF1F25CCFF3CD1E8FF095CBCFB1F20D0FE1221 ADFF2FCBE5FF7ADEEEFF09A2C6FC0D0DABF91D1DCFFA000000000B0BB5902121 D3FD0A1BACEE26B3D0F62134B8FF2324D6FF1052C3FF00A0C4FF1E21D0FF1013 ABFF29C5E1FF70D9EBFF08A2C6FC1313ABDF2727DBFD1F1FD0F91D1DCEFD060D A9F1158CC4F87ADCECFF3BAADBFF0A18AEFF2223D4FF1D20CFFF1D1ECEFF1421 AFFF25C3DEFF66D4E8FF08A2C6FC1A1AAF5C0E0EAAE71010ABF41517ABF90B86 C2F86BD4E8FF77DAECFF6DD7EAFF4D91D3FF223BB8FF1118AEFF1421AFFF52AC DAFF5DD0E5FF62D1E5FF07A2C6FC000000000000000000A0C42D00A0C4F404A1 C5FC0EA5C8F60DA5C8F60CA4C8F60CA4C8F60BA4C8F60BA4C8F60BA4C8F60AA4 C7F60AA4C7F609A3C7F601A0C4FF } end end doublecmd-0.5.8/src/fmaskinputdlg.pas0000644000175000017500000000723312011106054016645 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- File mask input dialog Copyright (C) 2010-2012 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fMaskInputDlg; {$mode objfpc}{$H+} interface uses Classes, Forms, Controls, StdCtrls, Buttons; type { TfrmMaskInputDlg } TfrmMaskInputDlg = class(TForm) btnDefineTemplate: TBitBtn; lblPrompt: TLabel; lblSearchTemplate: TLabel; cmbMask: TComboBox; btnOK: TBitBtn; btnCancel: TBitBtn; lbxSearchTemplate: TListBox; procedure btnDefineTemplateClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure lbxSearchTemplateClick(Sender: TObject); procedure lbxSearchTemplateDblClick(Sender: TObject); private { private declarations } public { public declarations } end; function ShowMaskInputDlg(const sCaption, sPrompt: UTF8String; slValueList: TStringList; var sValue: UTF8String): Boolean; implementation {$R *.lfm} uses fFindDlg, uGlobs, uSearchTemplate; function ShowMaskInputDlg(const sCaption, sPrompt: UTF8String; slValueList: TStringList; var sValue: UTF8String): Boolean; var Index: Integer; begin Result:= False; with TfrmMaskInputDlg.Create(Application) do try Caption:= sCaption; lblPrompt.Caption:= sPrompt; cmbMask.Items.Assign(slValueList); cmbMask.Text:= sValue; if IsMaskSearchTemplate(sValue) then begin Index:= lbxSearchTemplate.Items.IndexOf(PAnsiChar(sValue) + 1); if Index >= 0 then lbxSearchTemplate.ItemIndex:= Index; end; if ShowModal = mrOK then begin if not IsMaskSearchTemplate(cmbMask.Text) then if slValueList.IndexOf(cmbMask.Text) < 0 then slValueList.Add(cmbMask.Text); sValue:= cmbMask.Text; Result:= True; end; finally Free; end; end; { TfrmMaskInputDlg } procedure TfrmMaskInputDlg.lbxSearchTemplateClick(Sender: TObject); begin if lbxSearchTemplate.ItemIndex < 0 then Exit; cmbMask.Text:= cTemplateSign + lbxSearchTemplate.Items[lbxSearchTemplate.ItemIndex]; end; procedure TfrmMaskInputDlg.lbxSearchTemplateDblClick(Sender: TObject); begin if lbxSearchTemplate.ItemIndex < 0 then Exit; cmbMask.Text:= cTemplateSign + lbxSearchTemplate.Items[lbxSearchTemplate.ItemIndex]; Close; ModalResult:= mrOK; end; procedure TfrmMaskInputDlg.FormCreate(Sender: TObject); var I: Integer; begin for I:= 0 to gSearchTemplateList.Count - 1 do lbxSearchTemplate.Items.Add(gSearchTemplateList.Templates[I].TemplateName); end; procedure TfrmMaskInputDlg.btnDefineTemplateClick(Sender: TObject); var sTemplateName: UTF8String; begin if lbxSearchTemplate.ItemIndex >= 0 then sTemplateName:= lbxSearchTemplate.Items[lbxSearchTemplate.ItemIndex]; if ShowDefineTemplateDlg(sTemplateName) then begin lbxSearchTemplate.ItemIndex:= lbxSearchTemplate.Items.Add(sTemplateName); cmbMask.Text:= cTemplateSign + sTemplateName; end; end; end. doublecmd-0.5.8/src/uhotkeymanager.pas0000644000175000017500000011324512172444104017032 0ustar alexxalexx { Double Commander ------------------------------------------------------------------------- HotKey Manager. Allow to set it's own bindings to each TWinControl on form. Copyright (C) 2008 Dmitry Kolomiets (B4rr4cuda@rambler.ru) Copyright (C) 2011-2012 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uHotkeyManager; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Controls, LCLProc, LCLType, LCLIntf, Forms, ActnList, DCClassesUtf8, fgl, contnrs, DCXmlConfig, DCBasicTypes; type generic THMObjectInstance = class Instance: InstanceClass; KeyDownProc: TKeyEvent; end; THMFormInstance = specialize THMObjectInstance; THMControlInstance = specialize THMObjectInstance; { THotkey } THotkey = class Shortcuts: array of String; Command: String; Params: array of String; procedure Assign(Hotkey: THotkey); function Clone: THotkey; function HasParam(const aParam: String): Boolean; overload; function HasParam(const aParams: array of String): Boolean; overload; function SameAs(Hotkey: THotkey): Boolean; function SameParams(const aParams: array of String): Boolean; function SameShortcuts(const aShortcuts: array of String): Boolean; end; TBaseHotkeysList = specialize TFPGObjectList; { TFreeNotifier } TFreeNotifier = class(TComponent) private FFreeEvent: TNotifyEvent; protected procedure Notification(AComponent: TComponent; Operation: TOperation); override; public property OnFree: TNotifyEvent read FFreeEvent write FFreeEvent; end; THotkeyOperation = (hopAdd, hopRemove, hopClear, hopUpdate); THotkeyEvent = procedure (hotkey: THotkey; operation: THotkeyOperation) of object; { THotkeys } THotkeys = class(TBaseHotkeysList) private FOnChange: THotkeyEvent; procedure DoOnChange(hotkey: THotkey; operation: THotkeyOperation); public constructor Create(AFreeObjects: Boolean = True); reintroduce; function Add(const Shortcuts, Params: array of String; Command: String): THotkey; overload; function AddIfNotExists(const Shortcuts, Params: array of String; Command: String): THotkey; overload; {en Adds multiple shortcuts to the same command. @param(ShortcutsWithParams Array of shortcuts followed by any number of parameters. Each shortcuts array must end with an empty string, and similarly each parameters must end with an empty string. [Shortcut1A, Shortcut1B, '', S1ParamA, '', Shortcut2, '', S2ParamA, S2ParamB, '', ...]) @param(Command Command to which the shortcuts should be added.) @param(OldShortcuts, OldParams Adds new shortcuts even if old shortcut exists. If a different shortcuts exists however then doesn't add new one.) } procedure AddIfNotExists(const ShortcutsWithParams: array of String; Command: String; const OldShortcuts, OldParams: array of String); overload; procedure AddIfNotExists(const ShortcutsWithParams: array of String; Command: String); overload; procedure Clear; reintroduce; procedure Remove(var hotkey: THotkey); reintroduce; function Find(const Shortcuts: TDynamicStringArray): THotkey; {en Find hotkey which shortcuts begin with Shortcuts parameter. If BothWays=@true then also looks for shortcuts which are the beginning of Shortcuts parameter. } function FindByBeginning(const Shortcuts: TDynamicStringArray; BothWays: Boolean): THotkey; function FindByCommand(Command: String): THotkey; function FindByContents(Hotkey: THotkey): THotkey; {en Should be called whenever a hotkey has shortcut updated to update the shortcuts in ActionLists. } procedure UpdateHotkey(Hotkey: THotkey); property OnChange: THotkeyEvent read FOnChange write FOnChange; end; { THMBaseObject } generic THMBaseObject = class private FObjects: TFPObjectList; FHotkeys: THotkeys; FName: String; public constructor Create(AName: String); virtual; destructor Destroy; override; function Add(AInstanceInfo: InstanceInfoClass): Integer; procedure Delete(AInstance: InstanceClass); function Find(AInstance: InstanceClass): InstanceInfoClass; property Hotkeys: THotkeys read FHotkeys; property Name: String read FName; end; THMControl = specialize THMBaseObject; THMBaseControls = specialize TFPGObjectList; { THMControls } THMControls = class(THMBaseControls) procedure Delete(AName: String); overload; function Find(AName: String): THMControl; function Find(AControl: TWinControl): THMControl; function FindOrCreate(AName: String): THMControl; end; THMBaseForm = specialize THMBaseObject; TActionLists = specialize TFPGObjectList; { THMForm } THMForm = class(THMBaseForm) private {en Used for notifying when an ActionList is destroyed. } FFreeNotifier: TFreeNotifier; FActionLists: TActionLists; function GetActionByCommand(ActionList: TActionList; Command: String): TAction; procedure OnActionListFree(Sender: TObject); procedure OnHotkeyEvent(hotkey: THotkey; operation: THotkeyOperation); procedure RemoveActionShortcut(hotkey: THotkey; AssignNextShortcut: Boolean); procedure SetActionShortcut(hotkey: THotkey; OverridePrevious: Boolean); public Controls: THMControls; constructor Create(AName: String); override; destructor Destroy; override; procedure RegisterActionList(ActionList: TActionList); procedure UnregisterActionList(ActionList: TActionList); end; TBaseForms = specialize TFPGObjectList; { THMForms } THMForms = class(TBaseForms) procedure Delete(AName: String); overload; function Find(AName: String): THMForm; function Find(AForm: TCustomForm): THMForm; function FindOrCreate(AName: String): THMForm; end; { THotKeyManager } THotKeyManager = class private FForms: THMForms; FLastShortcutTime: Double; // When last shortcut was received (used for sequences of shortcuts) FSequenceStep: Integer; // Which hotkey we are waiting for (from 0) FShortcutsSequence: TDynamicStringArray; // Sequence of shortcuts that has been processed since last key event FVersion: Integer; //--------------------- procedure ClearAllHotkeys; //Hotkey Handler procedure KeyDownHandler(Sender: TObject; var Key: Word; Shift: TShiftState); //--------------------- //This function is called from KeyDownHandler to find registered hotkey and execute assigned action function HotKeyEvent(Form: TCustomForm; Hotkeys: THotkeys): Boolean; //--------------------- function RegisterForm(AFormName: String): THMForm; function RegisterControl(AFormName: String; AControlName: String): THMControl; //--------------------- procedure Save(Config: TXmlConfig; Root: TXmlNode); procedure Load(Config: TXmlConfig; Root: TXmlNode); procedure LoadIni(FileName: String); //--------------------- function IsShortcutConflictingWithOS(Shortcut: String): Boolean; public constructor Create; destructor Destroy; override; //--------------------- procedure Save(FileName: String); procedure Load(FileName: String); //--------------------- function Register(AForm: TCustomForm; AFormName: String): THMForm; function Register(AControl: TWinControl; AControlName: String): THMControl; procedure UnRegister(AForm: TCustomForm); procedure UnRegister(AControl: TWinControl); //--------------------- property Forms: THMForms read FForms; property Version: Integer read FVersion; end; implementation uses XMLRead, uKeyboard, uGlobs, uDebug, uDCVersion, uFormCommands, DCOSUtils, DCStrUtils; const MaxShortcutSequenceInterval = 1000; // in ms { THotkey } procedure THotkey.Assign(Hotkey: THotkey); begin Shortcuts := Copy(Hotkey.Shortcuts); Params := Copy(Hotkey.Params); Command := Hotkey.Command; end; function THotkey.Clone: THotkey; begin Result := THotkey.Create; Result.Assign(Self); end; function THotkey.HasParam(const aParams: array of String): Boolean; begin Result := ContainsOneOf(Params, aParams); end; function THotkey.HasParam(const aParam: String): Boolean; begin Result := Contains(Params, aParam); end; function THotkey.SameAs(Hotkey: THotkey): Boolean; begin Result := (Command = Hotkey.Command) and (SameShortcuts(Hotkey.Shortcuts)) and (SameParams(Hotkey.Params)); end; function THotkey.SameParams(const aParams: array of String): Boolean; begin Result := Compare(Params, aParams); end; function THotkey.SameShortcuts(const aShortcuts: array of String): Boolean; begin Result := Compare(Shortcuts, aShortcuts); end; { TFreeNotifier } procedure TFreeNotifier.Notification(AComponent: TComponent; Operation: TOperation); begin if (Operation = opRemove) and Assigned(FFreeEvent) then FFreeEvent(AComponent); inherited Notification(AComponent, Operation); end; { THotkeys } constructor THotkeys.Create(AFreeObjects: Boolean); begin FOnChange := nil; inherited Create(AFreeObjects); end; function THotkeys.Add(const Shortcuts, Params: array of String; Command: String): THotkey; begin if (Command <> EmptyStr) and (Length(Shortcuts) > 0) then begin Result := THotkey.Create; Result.Shortcuts := CopyArray(Shortcuts); Result.Params := CopyArray(Params); Result.Command := Command; Add(Result); DoOnChange(Result, hopAdd); end else Result := nil; end; function THotkeys.AddIfNotExists(const Shortcuts, Params: array of String; Command: String): THotkey; var i: Integer; begin // Check if the shortcuts aren't already assigned to a different command // or if a different shortcut isn't already assigned to the command. // Also check if the shortucts aren't a partial match to another shortcuts. for i := 0 to Count - 1 do begin if ArrBegins(Items[i].Shortcuts, Shortcuts, True) or (Items[i].Command = Command) then Exit(nil); end; Result := Add(Shortcuts, Params, Command); end; procedure THotkeys.AddIfNotExists(const ShortcutsWithParams: array of String; Command: String); begin AddIfNotExists(ShortcutsWithParams, Command, [], []); end; procedure THotkeys.AddIfNotExists(const ShortcutsWithParams: array of String; Command: String; const OldShortcuts, OldParams: array of String); var s: String; StartIndex: Integer; function GetArray: TDynamicStringArray; var i: Integer; begin Result := nil; for i := StartIndex to High(ShortcutsWithParams) do begin s := ShortcutsWithParams[i]; if s <> '' then AddString(Result, s) else Break; end; StartIndex := i + 1; end; function CheckIfOldOrEmpty: Boolean; var i: Integer; begin for i := 0 to Count - 1 do if Items[i].Command = Command then begin if not (Items[i].SameShortcuts(OldShortcuts) and Items[i].SameParams(OldParams)) then Exit(False); end; Result := True; end; var Shortcuts, Params: array of String; begin // Check if a different shortcut isn't already assigned to the command. // If there is only the old shortcut then allow adding new one. if not CheckIfOldOrEmpty then Exit; StartIndex := Low(ShortcutsWithParams); while True do begin Shortcuts := GetArray; Params := GetArray; if Length(Shortcuts) > 0 then begin // Check if the shortcuts aren't already assigned to a different command. if not Assigned(FindByBeginning(Shortcuts, True)) then Add(Shortcuts, Params, Command); end else Break; end; end; procedure THotkeys.Clear; var i: Integer; begin for i := 0 to Count - 1 do begin DoOnChange(Items[0], hopClear); inherited Delete(0); end; end; procedure THotkeys.Remove(var hotkey: THotkey); begin if Assigned(hotkey) then begin DoOnChange(hotkey, hopRemove); inherited Remove(hotkey); if FreeObjects then hotkey := nil; end; end; procedure THotkeys.UpdateHotkey(Hotkey: THotkey); begin DoOnChange(Hotkey, hopUpdate); end; function THotkeys.Find(const Shortcuts: TDynamicStringArray): THotkey; var i: Integer; begin for i := 0 to Count - 1 do if Items[i].SameShortcuts(Shortcuts) then Exit(Items[i]); Result := nil; end; function THotkeys.FindByBeginning(const Shortcuts: TDynamicStringArray; BothWays: Boolean): THotkey; var i: Integer; begin for i := 0 to Count - 1 do if ArrBegins(Items[i].Shortcuts, Shortcuts, BothWays) then Exit(Items[i]); Result := nil; end; function THotkeys.FindByCommand(Command: String): THotkey; var i: Integer; begin for i := 0 to Count - 1 do if Items[i].Command = Command then Exit(Items[i]); Result := nil; end; function THotkeys.FindByContents(Hotkey: THotkey): THotkey; var i: Integer; begin for i := 0 to Count - 1 do begin Result := Items[i]; if Result.SameAs(Hotkey) then Exit; end; Result := nil; end; procedure THotkeys.DoOnChange(hotkey: THotkey; operation: THotkeyOperation); begin if Assigned(FOnChange) then FOnChange(hotkey, operation); end; { THMForm } constructor THMForm.Create(AName: String); begin FFreeNotifier := nil; inherited; Controls := THMControls.Create(True); FActionLists := TActionLists.Create(False); end; destructor THMForm.Destroy; begin inherited; Controls.Free; FActionLists.Free; FFreeNotifier.Free; end; procedure THMForm.RegisterActionList(ActionList: TActionList); var i: Integer; begin if FActionLists.IndexOf(ActionList) < 0 then begin FActionLists.Add(ActionList); Hotkeys.OnChange := @OnHotkeyEvent; if not Assigned(FFreeNotifier) then begin FFreeNotifier := TFreeNotifier.Create(nil); FFreeNotifier.OnFree := @OnActionListFree; end; ActionList.FreeNotification(FFreeNotifier); // Initialize actionlist with shortcuts. for i := 0 to hotkeys.Count - 1 do SetActionShortcut(hotkeys[i], False); end; end; procedure THMForm.UnregisterActionList(ActionList: TActionList); begin if FActionLists.Remove(ActionList) >= 0 then ActionList.RemoveFreeNotification(FFreeNotifier); end; function THMForm.GetActionByCommand(ActionList: TActionList; Command: String): TAction; var action: TContainedAction; begin action := ActionList.ActionByName('act' + Copy(Command, 4, Length(Command) - 3)); if action is TAction then Result := action as TAction else Result := nil; end; procedure THMForm.OnActionListFree(Sender: TObject); begin if Sender is TActionList then UnregisterActionList(Sender as TActionList); end; procedure THMForm.OnHotkeyEvent(hotkey: THotkey; operation: THotkeyOperation); begin case operation of hopAdd: SetActionShortcut(hotkey, False); hopRemove: RemoveActionShortcut(hotkey, True); hopClear: RemoveActionShortcut(hotkey, False); hopUpdate: SetActionShortcut(hotkey, True); end; end; procedure THMForm.RemoveActionShortcut(hotkey: THotkey; AssignNextShortcut: Boolean); var action: TAction; i, j: Integer; shortcut, newShortcut: TShortCut; begin shortcut := TextToShortCutEx(hotkey.Shortcuts[0]); for i := 0 to FActionLists.Count - 1 do begin action := GetActionByCommand(FActionLists[i], hotkey.Command); if Assigned(action) then begin if action.Shortcut = shortcut then begin newShortcut := VK_UNKNOWN; if AssignNextShortcut then begin // Search for another possible hotkey assigned for the same command. for j := 0 to hotkeys.Count - 1 do if (hotkeys[j].Command = hotkey.Command) and (hotkeys[j] <> hotkey) then begin newShortcut := TextToShortCutEx(hotkeys[j].Shortcuts[0]); Break; end; end; action.ShortCut := newShortcut; end; end; end; end; procedure THMForm.SetActionShortcut(hotkey: THotkey; OverridePrevious: Boolean); var action: TAction; i: Integer; shortcut: TShortCut; begin shortcut := TextToShortCutEx(hotkey.Shortcuts[0]); for i := 0 to FActionLists.Count - 1 do begin action := GetActionByCommand(FActionLists[i], hotkey.Command); if Assigned(action) then begin if OverridePrevious or (action.Shortcut = VK_UNKNOWN) then action.ShortCut := shortcut; end; end; end; { THMBaseObject } constructor THMBaseObject.Create(AName: String); begin FName := AName; FHotkeys := THotkeys.Create(True); FObjects := TFPObjectList.Create(True); end; destructor THMBaseObject.Destroy; begin inherited Destroy; FHotkeys.Free; FObjects.Free; end; function THMBaseObject.Add(AInstanceInfo: InstanceInfoClass): Integer; begin Result := FObjects.Add(AInstanceInfo); end; procedure THMBaseObject.Delete(AInstance: InstanceClass); var i: Integer; begin for i := 0 to FObjects.Count - 1 do if InstanceInfoClass(FObjects[i]).Instance = AInstance then begin FObjects.Delete(i); Exit; end; end; function THMBaseObject.Find(AInstance: InstanceClass): InstanceInfoClass; var i: Integer; begin for i := 0 to FObjects.Count - 1 do begin if InstanceInfoClass(FObjects[i]).Instance = AInstance then Exit(InstanceInfoClass(FObjects[i])); end; Result := nil; end; { THMControls } procedure THMControls.Delete(AName: String); var i: Integer; begin for i := 0 to Count - 1 do if SameText(Items[i].Name, AName) then begin Delete(i); Exit; end; end; function THMControls.Find(AName: String): THMControl; var i: Integer; begin for i := 0 to Count - 1 do if SameText(Items[i].Name, AName) then Exit(Items[i]); Result := nil; end; function THMControls.Find(AControl: TWinControl): THMControl; var i: Integer; begin for i := 0 to Count - 1 do begin if Assigned(Items[i].Find(AControl)) then Exit(Items[i]); end; Result := nil; end; function THMControls.FindOrCreate(AName: String): THMControl; begin Result := Find(AName); if not Assigned(Result) then begin Result := THMControl.Create(AName); Add(Result); end; end; { THMForms } procedure THMForms.Delete(AName: String); var i: Integer; begin for i := 0 to Count - 1 do if SameText(Items[i].Name, AName) then begin Delete(i); Exit; end; end; function THMForms.Find(AName: String): THMForm; var i: Integer; begin for i := 0 to Count - 1 do begin if SameText(Items[i].Name, AName) then Exit(Items[i]); end; Result := nil; end; function THMForms.Find(AForm: TCustomForm): THMForm; var i: Integer; begin for i := 0 to Count - 1 do begin if Assigned(Items[i].Find(AForm)) then Exit(Items[i]); end; Result := nil; end; function THMForms.FindOrCreate(AName: String): THMForm; begin Result := Find(AName); if not Assigned(Result) then begin Result := THMForm.Create(AName); Add(Result); end; end; { THotKeyManager } constructor THotKeyManager.Create; begin FForms := THMForms.Create(True); FSequenceStep := 0; end; destructor THotKeyManager.Destroy; begin inherited Destroy; FForms.Free; end; procedure THotKeyManager.Save(FileName: String); var Config: TXmlConfig = nil; begin try Config := TXmlConfig.Create(FileName, True); Config.SetAttr(Config.RootNode, 'DCVersion', dcVersion); Save(Config, Config.RootNode); Config.Save; finally Config.Free; end; end; procedure THotKeyManager.Load(FileName: String); var Config: TXmlConfig = nil; NotAnXML: Boolean = False; begin try Config := TXmlConfig.Create(FileName); try if Config.Load then Load(Config, Config.RootNode); finally Config.Free; end; except on EXMLReadError do NotAnXML := True; end; if NotAnXML then begin LoadIni(FileName); // Immediately save as xml so that configuration isn't lost. if mbRenameFile(FileName, FileName + '.ini.obsolete') then Save(FileName); end; end; procedure THotKeyManager.Save(Config: TXmlConfig; Root: TXmlNode); var SavedHotkeys: THotkeys; procedure SaveHotkeys(Form: THMForm; Hotkeys: THotkeys; ControlIndex: Integer; Node: TXmlNode); var i, j: Integer; HotkeyNode, ControlNode: TXmlNode; Control: THMControl; procedure AddControl(AName: String); begin ControlNode := Config.AddNode(HotkeyNode, 'Control'); Config.SetContent(ControlNode, AName); end; begin for i := 0 to Hotkeys.Count - 1 do begin // Save Form's hotkeys and hotkeys which have not been saved yet. if (ControlIndex < 0) or (not Assigned(SavedHotkeys.FindByContents(Hotkeys[i]))) then begin HotkeyNode := Config.AddNode(Node, 'Hotkey'); for j := Low(Hotkeys[i].Shortcuts) to High(Hotkeys[i].Shortcuts) do Config.AddValue(HotkeyNode, 'Shortcut', Hotkeys[i].Shortcuts[j]); Config.AddValue(HotkeyNode, 'Command', Hotkeys[i].Command); for j := Low(Hotkeys[i].Params) to High(Hotkeys[i].Params) do Config.AddValue(HotkeyNode, 'Param', Hotkeys[i].Params[j]); if ControlIndex >= 0 then AddControl(Form.Controls[ControlIndex].Name); // Search all successive controls for the same hotkey. for j := Succ(ControlIndex) to Form.Controls.Count - 1 do begin Control := Form.Controls[j]; if Assigned(Control.Hotkeys.FindByContents(Hotkeys[i])) then AddControl(Control.Name); end; SavedHotkeys.Add(Hotkeys[i]); end; end; end; var i, j: Integer; FormNode: TXmlNode; Form: THMForm; begin Root := Config.FindNode(Root, 'Hotkeys', True); Config.ClearNode(Root); Config.SetAttr(Root, 'Version', hkVersion); SavedHotkeys := THotkeys.Create(False); try for i := 0 to FForms.Count - 1 do begin Form := FForms[i]; FormNode := Config.AddNode(Root, 'Form'); Config.SetAttr(FormNode, 'Name', Form.Name); SaveHotkeys(Form, Form.Hotkeys, -1, FormNode); for j := 0 to Form.Controls.Count - 1 do SaveHotkeys(Form, Form.Controls[j].Hotkeys, j, FormNode); end; finally SavedHotkeys.Free; end; end; procedure THotKeyManager.Load(Config: TXmlConfig; Root: TXmlNode); var Form: THMForm; procedure AddIfNotEmpty(var Arr: TDynamicStringArray; const Value: String); begin if Value <> '' then AddString(Arr, Value); end; procedure LoadHotkey(FormName: String; Hotkeys: THotkeys; Node: TXmlNode); const RenamedCommandsMain: array [0..1] of record OldName, NewName: String; SinceVersion: Integer end = ( (OldName: 'cm_RemoveTab'; NewName: 'cm_CloseTab'; SinceVersion: 14), (OldName: 'cm_RemoveAllTabs'; NewName: 'cm_CloseAllTabs'; SinceVersion: 14) ); var Shortcut, Command, Param: String; Shortcuts: array of String = nil; Params: array of String = nil; Controls: array of String = nil; HMControl: THMControl; i: Integer; begin // These checks for version may be removed after 0.5.5 release because // the XML format for hotkeys has only been added in development version 0.5.5. // Only Command needs to be retrieved here. if FVersion <= 1 then Command := Config.GetAttr(Node, 'Command', '') else Command := Config.GetValue(Node, 'Command', ''); // Leave only this or move this to the loop "while Assigned(Node) do" below if FVersion <= 1 then Param := Config.GetAttr(Node, 'Params', '') else if FVersion < 9 then Param := Config.GetValue(Node, 'Params', ''); if FVersion < 10 then begin Shortcut := Config.GetAttr(Node, 'Key', ''); if Shortcut <> '' then begin Shortcut := NormalizeModifiers(Shortcut); AddIfNotEmpty(Shortcuts, Shortcut); end; end; if (FVersion < 9) then AddIfNotEmpty(Params, Param); // Up to here may be deleted after 0.5.5 release. Node := Node.FirstChild; while Assigned(Node) do begin if Node.CompareName('Shortcut') = 0 then AddIfNotEmpty(Shortcuts, NormalizeModifiers(Config.GetContent(Node))) else if Node.CompareName('Control') = 0 then AddIfNotEmpty(Controls, Config.GetContent(Node)) else if Node.CompareName('Param') = 0 then AddIfNotEmpty(Params, Config.GetContent(Node)); Node := Node.NextSibling; end; if Command <> EmptyStr then begin // Rename commands that have changed names. if FormName = 'Main' then begin for i := Low(RenamedCommandsMain) to High(RenamedCommandsMain) do begin if (FVersion <= RenamedCommandsMain[i].SinceVersion) and (Command = RenamedCommandsMain[i].OldName) then Command := RenamedCommandsMain[i].NewName; end; end; if Length(Shortcuts) > 0 then begin if Length(Controls) = 0 then begin // This "if" block may also be deleted after 0.5.5 release. if (FVersion <= 3) and IsShortcutConflictingWithOS(Shortcuts[0]) then begin HMControl := Form.Controls.FindOrCreate('Files Panel'); HMControl.Hotkeys.AddIfNotExists(Shortcuts, Params, Command); end else Hotkeys.Add(Shortcuts, Params, Command); // Leave only this end else begin for i := Low(Controls) to High(Controls) do begin HMControl := Form.Controls.FindOrCreate(Controls[i]); HMControl.Hotkeys.Add(Shortcuts, Params, Command); end; end; end; end; end; var FormNode, HotkeyNode: TXmlNode; AName: String; begin ClearAllHotkeys; Root := Config.FindNode(Root, 'Hotkeys'); if Assigned(Root) then begin FVersion := Config.GetAttr(Root, 'Version', hkVersion); FormNode := Root.FirstChild; while Assigned(FormNode) do begin if (FormNode.CompareName('Form') = 0) and (Config.TryGetAttr(FormNode, 'Name', AName)) and (AName <> EmptyStr) then begin Form := FForms.FindOrCreate(AName); HotkeyNode := FormNode.FirstChild; while Assigned(HotkeyNode) do begin if HotkeyNode.CompareName('Hotkey') = 0 then LoadHotkey(Form.Name, Form.Hotkeys, HotkeyNode); HotkeyNode := HotkeyNode.NextSibling; end; end; FormNode := FormNode.NextSibling; end; end; end; procedure THotKeyManager.LoadIni(FileName: String); var st: TStringList; ini: TIniFileEx; i, j: Integer; section: String; shortCut: String; hotkeys: THotkeys; form: THMForm; control: THMControl; Command, Param, FormName, ControlName: String; Params: array of String = nil; procedure RemoveFrmPrexif(var s: String); begin if SameText(Copy(s, 1, 3), 'Frm') then Delete(s, 1, 3); end; begin ClearAllHotkeys; st := TStringList.Create; ini := TIniFileEx.Create(FileName); ini.ReadSections(st); for i := 0 to st.Count - 1 do begin section := st[i]; shortCut := NormalizeModifiers(section); if shortCut <> '' then begin j := 0; while ini.ValueExists(section, 'Command' + IntToStr(j)) do begin Command := ini.ReadString(section, 'Command' + IntToStr(j), ''); Param := ini.ReadString(section, 'Param' + IntToStr(j), ''); ControlName := ini.ReadString(section, 'Object' + IntToStr(j), ''); FormName := ini.ReadString(section, 'Form' + IntToStr(j), ''); RemoveFrmPrexif(FormName); RemoveFrmPrexif(ControlName); form := FForms.FindOrCreate(FormName); if IsShortcutConflictingWithOS(shortCut) then ControlName := 'Files Panel'; // Old config had FormName=ControlName for main form. if SameText(FormName, ControlName) then begin hotkeys := form.Hotkeys; end else begin control := form.Controls.FindOrCreate(ControlName); hotkeys := control.Hotkeys; end; if Param <> '' then begin SetLength(Params, 1); Params[0] := Param; end else Params := nil; hotkeys.Add([shortcut], Params, Command); j := j + 1; end; end; end; FreeAndNil(st); FreeAndNil(ini); end; function THotKeyManager.IsShortcutConflictingWithOS(Shortcut: String): Boolean; const ConflictingShortcuts: array [0..27] of String = (SmkcBkSp, // Delete previous character SmkcDel, // Delete next character SmkcLeft, // Move cursor left SmkcRight, // Move cursor right SmkcSpace, // Space SmkcWin, // Context menu SmkcShift + 'F10', // Context menu SmkcShift + SmkcDel, // Cut text SmkcShift + SmkcIns, // Paste text SmkcShift + SmkcHome, // Select to beginning SmkcShift + SmkcEnd, // Select to end SmkcShift + SmkcLeft, // Select previous character SmkcShift + SmkcRight, // Select next character SmkcCtrl + 'A', // Select all SmkcCtrl + 'C', // Copy text SmkcCtrl + 'V', // Paste text SmkcCtrl + 'X', // Cut text SmkcCtrl + 'Z', // Undo SmkcCtrl + SmkcBkSp, // Delete previous word SmkcCtrl + SmkcDel, // Delete next word SmkcCtrl + SmkcIns, // Copy text SmkcCtrl + SmkcHome, // Move to beginning SmkcCtrl + SmkcEnd, // Move to end SmkcCtrl + SmkcLeft, // Move to beginning of word SmkcCtrl + SmkcRight, // Move to end of word SmkcCtrl + SmkcShift + 'Z', // Redo SmkcCtrl + SmkcShift + SmkcLeft, // Select to beginning of word SmkcCtrl + SmkcShift + SmkcRight); // Select to end of word var i: Integer; begin for i := Low(ConflictingShortcuts) to High(ConflictingShortcuts) do if Shortcut = ConflictingShortcuts[i] then Exit(True); Result := False; end; function THotKeyManager.Register(AForm: TCustomForm; AFormName: String): THMForm; var formInstance: THMFormInstance; begin Result := RegisterForm(AFormName); formInstance := Result.Find(AForm); if not Assigned(formInstance) then begin formInstance := THMFormInstance.Create; formInstance.Instance := AForm; formInstance.KeyDownProc := AForm.OnKeyDown; Result.Add(formInstance); AForm.OnKeyDown := @KeyDownHandler; AForm.KeyPreview := True; end; end; function THotKeyManager.Register(AControl: TWinControl; AControlName: String): THMControl; var ParentForm: TCustomForm; form: THMForm; controlInstance: THMControlInstance; begin ParentForm := GetParentForm(AControl); if Assigned(ParentForm) then begin form := FForms.Find(ParentForm); if not Assigned(form) then begin DCDebug('HotMan: Failed registering ' + AControlName + ': Form ' + ParentForm.ClassName + ':' + ParentForm.Name + ' not registered.'); Exit(nil); end; Result := form.Controls.Find(AControlName); if not Assigned(Result) then begin Result := THMControl.Create(AControlName); form.Controls.Add(Result); end; controlInstance := Result.Find(AControl); if not Assigned(controlInstance) then begin controlInstance := THMControlInstance.Create; controlInstance.Instance := AControl; controlInstance.KeyDownProc := AControl.OnKeyDown; Result.Add(controlInstance); //AControl.OnKeyDown := @KeyDownHandler; end; end; end; function THotKeyManager.RegisterForm(AFormName: String): THMForm; begin Result := FForms.Find(AFormName); if not Assigned(Result) then begin Result := THMForm.Create(AFormName); FForms.Add(Result); end; end; function THotKeyManager.RegisterControl(AFormName: String; AControlName: String): THMControl; var form: THMForm; begin form := RegisterForm(AFormName); Result := form.Controls.Find(AControlName); if not Assigned(Result) then begin Result := THMControl.Create(AControlName); form.Controls.Add(Result); end; end; procedure THotKeyManager.UnRegister(AForm: TCustomForm); var form: THMForm; formInstance: THMFormInstance; begin form := FForms.Find(AForm); if Assigned(form) then begin formInstance := form.Find(AForm); AForm.OnKeyDown := formInstance.KeyDownProc; form.Delete(AForm); end; end; procedure THotKeyManager.UnRegister(AControl: TWinControl); var ParentForm: TCustomForm; form: THMForm; control: THMControl; i: Integer; begin ParentForm := GetParentForm(AControl); if Assigned(ParentForm) then begin form := FForms.Find(ParentForm); if Assigned(form) then begin control := form.Controls.Find(AControl); if Assigned(control) then control.Delete(AControl); end; end else begin // control lost its parent, find through all forms for i := 0 to FForms.Count - 1 do begin form := FForms[i]; control := form.Controls.Find(AControl); if Assigned(control) then control.Delete(AControl); end; end; end; function THotKeyManager.HotKeyEvent(Form: TCustomForm; Hotkeys: THotkeys): Boolean; var hotkey: THotkey; FormCommands: IFormCommands; begin hotkey := Hotkeys.FindByBeginning(FShortcutsSequence, False); if Assigned(hotkey) then begin if High(hotkey.Shortcuts) > FSequenceStep then begin // There are more shortcuts to match. FLastShortcutTime := SysUtils.Now; Inc(FSequenceStep); Result := True; end else begin FSequenceStep := 0; FormCommands := Form as IFormCommands; Result := Assigned(FormCommands) and (FormCommands.ExecuteCommand(hotkey.Command, hotkey.Params) = cfrSuccess); end; end else Result := False; end; procedure THotKeyManager.ClearAllHotkeys; var i, j: Integer; Form: THMForm; begin for i := 0 to FForms.Count - 1 do begin Form := FForms[i]; Form.Hotkeys.Clear; for j := 0 to Form.Controls.Count - 1 do Form.Controls[j].Hotkeys.Clear; end; end; procedure THotKeyManager.KeyDownHandler(Sender: TObject; var Key: Word; Shift: TShiftState); //------------------------------------------------------ var i: Integer; Shortcut: TShortCut; TextShortcut: String; Form: TCustomForm; Control: TWinControl; HMForm: THMForm; HMControl: THMControl; HMFormInstance: THMFormInstance; HMControlInstance: THMControlInstance; ShiftEx: TShiftState; function OrigKeyDown(AKeyDownProc: TKeyEvent): Boolean; begin if Assigned(AKeyDownProc) then begin AKeyDownProc(Sender, Key, ShiftEx); Result := True; end else Result := False; end; begin Form := GetParentForm(Sender as TWinControl); HMForm := FForms.Find(Form); if not Assigned(HMForm) then Exit; ShiftEx := GetKeyShiftStateEx; Shortcut := KeyToShortCutEx(Key, ShiftEx); TextShortcut := ShortCutToTextEx(Shortcut); Control := Form.ActiveControl; // Don't execute hotkeys that coincide with key typing actions. if (TextShortcut <> '') and ((FSequenceStep > 0) or (not (((GetKeyTypingAction(ShiftEx) <> ktaNone) {$IFDEF MSWINDOWS} // Don't execute hotkeys with Ctrl+Alt = AltGr on Windows. or (HasKeyboardAltGrKey and (ShiftEx * KeyModifiersShortcutNoText = [ssCtrl, ssAlt]) and (gKeyTyping[ktmNone] <> ktaNone)) // Don't execute hotkeys with AltGr on Windows. or (ShiftEx = [ssAltGr]) {$ENDIF} ) and (Key in [VK_0..VK_9, VK_A..VK_Z])))) then begin // If too much time has passed reset sequence. if (FSequenceStep > 0) and (DateTimeToTimeStamp(SysUtils.Now - FLastShortcutTime).Time > MaxShortcutSequenceInterval) then FSequenceStep := 0; // Add shortcut to sequence. if Length(FShortcutsSequence) <> FSequenceStep + 1 then SetLength(FShortcutsSequence, FSequenceStep + 1); FShortcutsSequence[FSequenceStep] := TextShortcut; if Assigned(Control) then begin for i := 0 to HMForm.Controls.Count - 1 do begin HMControl := HMForm.Controls[i]; HMControlInstance := HMControl.Find(Control); if Assigned(HMControlInstance) then begin if HotKeyEvent(Form, HMControl.Hotkeys) then begin Key := VK_UNKNOWN; Exit; end else Break; end; end; end; // Hotkey for the whole form if (Key <> VK_UNKNOWN) and HotKeyEvent(Form, HMForm.Hotkeys) then begin Key := VK_UNKNOWN; Exit; end; FSequenceStep := 0; // Hotkey was not matched - reset sequence. end; if Key <> VK_UNKNOWN then begin HMFormInstance := HMForm.Find(Form); OrigKeyDown(HMFormInstance.KeyDownProc); end; end; end. doublecmd-0.5.8/src/foptionshotkeysedithotkey.lfm0000644000175000017500000001263312020403374021337 0ustar alexxalexxobject frmEditHotkey: TfrmEditHotkey Left = 337 Height = 465 Top = 120 Width = 458 BorderIcons = [biSystemMenu] ClientHeight = 465 ClientWidth = 458 Constraints.MinHeight = 200 Constraints.MinWidth = 200 OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter LCLVersion = '1.1' object lblShortcuts: TLabel AnchorSideLeft.Control = pnlShortcuts AnchorSideTop.Control = Owner Left = 8 Height = 13 Top = 6 Width = 50 BorderSpacing.Top = 6 Caption = 'Shortcuts:' ParentColor = False end object pnlShortcuts: TPanel AnchorSideLeft.Control = Owner AnchorSideTop.Control = btnAddShortcut AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 8 Height = 1 Top = 28 Width = 442 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Left = 8 BorderSpacing.Right = 8 BevelOuter = bvNone ChildSizing.EnlargeHorizontal = crsHomogenousChildResize ChildSizing.EnlargeVertical = crsHomogenousChildResize ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 TabOrder = 0 end object lblHotKeyConflict: TLabel AnchorSideLeft.Control = pnlShortcuts AnchorSideTop.Control = pnlShortcuts AnchorSideTop.Side = asrBottom AnchorSideRight.Control = pnlShortcuts AnchorSideRight.Side = asrBottom Left = 8 Height = 1 Top = 33 Width = 442 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 4 BorderSpacing.Bottom = 4 ParentColor = False ParentShowHint = False ShowHint = True Visible = False WordWrap = True end object lblParameters: TLabel AnchorSideLeft.Control = pnlShortcuts AnchorSideTop.Control = lblHotKeyConflict AnchorSideTop.Side = asrBottom Left = 8 Height = 22 Top = 39 Width = 247 BorderSpacing.Top = 6 Caption = '&Parameters (each in a separate line):' FocusControl = edtParameters ParentColor = False end object edtParameters: TMemo AnchorSideLeft.Control = pnlShortcuts AnchorSideTop.Control = lblParameters AnchorSideTop.Side = asrBottom AnchorSideRight.Control = pnlShortcuts AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = btnShowCommandHelp Left = 8 Height = 331 Top = 53 Width = 442 HelpType = htKeyword Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Bottom = 2 ScrollBars = ssAutoBoth TabOrder = 1 WordWrap = False end object btnShowCommandHelp: TButton AnchorSideLeft.Control = pnlShortcuts AnchorSideRight.Control = pnlShortcuts AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = cgHKControls Left = 8 Height = 23 Top = 388 Width = 442 Anchors = [akLeft, akRight, akBottom] AutoSize = True BorderSpacing.Top = 4 OnClick = btnShowCommandHelpClick TabOrder = 2 end object cgHKControls: TCheckGroup AnchorSideLeft.Control = pnlShortcuts AnchorSideRight.Control = pnlShortcuts AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = btnOK Left = 8 Height = 4 Top = 411 Width = 442 Anchors = [akLeft, akRight, akBottom] AutoFill = True AutoSize = True Caption = 'Only for these controls' ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ChildSizing.EnlargeHorizontal = crsHomogenousChildResize ChildSizing.EnlargeVertical = crsHomogenousChildResize ChildSizing.ShrinkHorizontal = crsScaleChilds ChildSizing.ShrinkVertical = crsScaleChilds ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 OnItemClick = cgHKControlsItemClick TabOrder = 3 Visible = False end object btnOK: TBitBtn AnchorSideLeft.Control = pnlShortcuts AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 8 Height = 40 Top = 419 Width = 120 Anchors = [akLeft, akBottom] AutoSize = True BorderSpacing.Top = 4 BorderSpacing.Bottom = 6 Caption = '&OK' Constraints.MinHeight = 40 Constraints.MinWidth = 120 Default = True Kind = bkOK ModalResult = 1 TabOrder = 4 end object btnCancel: TBitBtn AnchorSideRight.Control = pnlShortcuts AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 330 Height = 40 Top = 419 Width = 120 Anchors = [akRight, akBottom] AutoSize = True BorderSpacing.Bottom = 6 Cancel = True Caption = '&Cancel' Constraints.MinHeight = 40 Constraints.MinWidth = 120 Kind = bkCancel ModalResult = 2 TabOrder = 5 end object btnAddShortcut: TSpeedButton AnchorSideTop.Control = btnRemoveShortcut AnchorSideRight.Control = btnRemoveShortcut Left = 406 Height = 22 Hint = 'Add new shortcut to sequence' Top = 6 Width = 22 Anchors = [akTop, akRight] OnClick = btnAddShortcutClick ShowHint = True ParentShowHint = False end object btnRemoveShortcut: TSpeedButton AnchorSideTop.Control = lblShortcuts AnchorSideRight.Control = pnlShortcuts AnchorSideRight.Side = asrBottom Left = 428 Height = 22 Hint = 'Remove last shortcut from sequence' Top = 6 Width = 22 Anchors = [akTop, akRight] OnClick = btnRemoveShortcutClick ShowHint = True ParentShowHint = False end end doublecmd-0.5.8/src/fattributesedit.lrt0000644000175000017500000000234712023046500017220 0ustar alexxalexxTFRMATTRIBUTESEDIT.CAPTION=Choose attributes TFRMATTRIBUTESEDIT.CBSYMLINK.CAPTION=&Symlink TFRMATTRIBUTESEDIT.CBDIRECTORY.CAPTION=&Directory TFRMATTRIBUTESEDIT.LBLATTROWNERSTR.CAPTION=Owner TFRMATTRIBUTESEDIT.LBLWRITE.CAPTION=Write TFRMATTRIBUTESEDIT.LBLREAD.CAPTION=Read TFRMATTRIBUTESEDIT.LBLEXEC.CAPTION=Execute TFRMATTRIBUTESEDIT.LBLATTRGROUPSTR.CAPTION=Group TFRMATTRIBUTESEDIT.LBLATTROTHERSTR.CAPTION=Other TFRMATTRIBUTESEDIT.LBLATTRBITSSTR.CAPTION=Bits: TFRMATTRIBUTESEDIT.CBSUID.CAPTION=SUID TFRMATTRIBUTESEDIT.CBSGID.CAPTION=SGID TFRMATTRIBUTESEDIT.CBSTICKY.CAPTION=Sticky TFRMATTRIBUTESEDIT.GBWINGENERAL.CAPTION=General attributes TFRMATTRIBUTESEDIT.CBARCHIVE.CAPTION=&Archive TFRMATTRIBUTESEDIT.CBREADONLY.CAPTION=Read o&nly TFRMATTRIBUTESEDIT.CBHIDDEN.CAPTION=&Hidden TFRMATTRIBUTESEDIT.CBSYSTEM.CAPTION=S&ystem TFRMATTRIBUTESEDIT.GBNTFSATTRIBUTES.CAPTION=NTFS attributes TFRMATTRIBUTESEDIT.CBCOMPRESSED.CAPTION=Co&mpressed TFRMATTRIBUTESEDIT.CBENCRYPTED.CAPTION=&Encrypted TFRMATTRIBUTESEDIT.CBTEMPORARY.CAPTION=&Temporary TFRMATTRIBUTESEDIT.CBSPARSE.CAPTION=S&parse TFRMATTRIBUTESEDIT.LBLTEXTATTRS.CAPTION=As te&xt: TFRMATTRIBUTESEDIT.BTNRESET.CAPTION=&Reset TFRMATTRIBUTESEDIT.BTNOK.CAPTION=&OK TFRMATTRIBUTESEDIT.BTNCANCEL.CAPTION=&Cancel doublecmd-0.5.8/src/_getsvnrev.exe.cmd0000755000175000017500000000025311742211012016716 0ustar alexxalexxrem @echo off rem get DC revision under Windows %1tools\svn2revisioninc.exe ..\ dcrevision.inc --c=dcRevision echo "This command is need for successful exit code" doublecmd-0.5.8/src/fcopymovedlg.lrt0000644000175000017500000000041712023046500016510 0ustar alexxalexxTFRMCOPYDLG.CAPTION=Copy file(s) TFRMCOPYDLG.BTNOPTIONS.CAPTION=O&ptions TFRMCOPYDLG.BTNADDTOQUEUE.CAPTION=A&dd To Queue TFRMCOPYDLG.BTNCREATESPECIALQUEUE.CAPTION=... TFRMCOPYDLG.BTNCANCEL.CAPTION=&Cancel TFRMCOPYDLG.BTNSAVEOPTIONS.CAPTION=Sa&ve these options as default doublecmd-0.5.8/src/uoperationspanel.pas0000644000175000017500000003243011740427612017400 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Panel displaying file operations. Copyright (C) 2012 Przemysław Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uOperationsPanel; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Controls, Forms, Graphics, fFileOpDlg, uFileSourceOperation, uOperationsManager; type { TOperationsPanel } TOperationsPanel = class(TScrollBox) private FOperations, FQueues: TFPList; FParentWidth: Integer; procedure ClearItems; procedure DeleteItem(List: TFPList; Index: Integer); procedure GetStateColor(State: TFileSourceOperationState; out ColorFrom, ColorTo: TColor); procedure OperationsManagerEvent(Item: TOperationsManagerItem; Event: TOperationManagerEvent); procedure ProgressWindowEvent(OperationHandle: TOperationHandle; Event: TOperationProgressWindowEvent); procedure UpdateItems; procedure UpdateVisibility; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure Paint; override; procedure ParentResized(Sender: TObject); procedure UpdateView; end; implementation uses LCLIntf, LCLType, Math, fViewOperations, uDCUtils, uFileSourceOperationMisc; const MinimumHeight = 25; MaximumItemWidth = 150; LeftRightTextMargin = 4; TopBottomTextMargin = 2; HorizontalSpaceBetween = 1; PanelBorderWidth = 1; type TOperationPanelItem = record Width: Integer; OperationHandle: TOperationHandle; QueueId: TOperationsManagerQueueIdentifier; end; POperationPanelItem = ^TOperationPanelItem; { TOperationsPanel } procedure TOperationsPanel.ParentResized(Sender: TObject); begin FParentWidth := (Sender as TControl).Width; UpdateItems; end; procedure TOperationsPanel.ClearItems; var p: Pointer; begin for p in FOperations do Dispose(POperationPanelItem(p)); for p in FQueues do Dispose(POperationPanelItem(p)); FOperations.Clear; FQueues.Clear; end; procedure TOperationsPanel.DeleteItem(List: TFPList; Index: Integer); begin Dispose(POperationPanelItem(List[Index])); List.Delete(Index); end; procedure TOperationsPanel.GetStateColor(State: TFileSourceOperationState; out ColorFrom, ColorTo: TColor); begin case State of // Green if running fsosRunning: begin ColorFrom:= RGB(203, 233, 171); ColorTo:= RGB(146, 208, 80); end; // Orange if in waiting fsosWaitingForFeedback, fsosWaitingForConnection: begin ColorFrom:= RGB(255, 202, 100); ColorTo:= RGB(255, 153, 4); end; // Red if paused, stopped fsosPaused, fsosStopped: begin ColorFrom:= RGB(255, 153, 149); ColorTo:= RGB(255, 110, 103); end; else begin ColorFrom:= RGB(0, 0, 0); ColorTo:= RGB(255, 255, 255); end; end; end; procedure TOperationsPanel.OperationsManagerEvent(Item: TOperationsManagerItem; Event: TOperationManagerEvent); begin UpdateItems; UpdateView; end; procedure TOperationsPanel.ProgressWindowEvent(OperationHandle: TOperationHandle; Event: TOperationProgressWindowEvent); begin UpdateVisibility; end; procedure TOperationsPanel.UpdateItems; var OpManItem: TOperationsManagerItem; QueueIndex, OperIndex: Integer; OutString: String; ItemRect: TRect; Queue: TOperationsManagerQueue; OperationItem: POperationPanelItem; OverallHeight: Integer = MinimumHeight; OverallWidth: Integer = 0; Visibility: Boolean = False; procedure SetSize; begin ItemRect := Rect(0, 0, 0, 0); DrawText(Canvas.Handle, PChar(OutString), Length(OutString), ItemRect, DT_NOPREFIX or DT_CALCRECT); OperationItem^.Width := Min(ItemRect.Right + (LeftRightTextMargin + PanelBorderWidth) * 2, MaximumItemWidth); OverallHeight := Max(ItemRect.Bottom + (TopBottomTextMargin + PanelBorderWidth) * 2, OverallHeight); OverallWidth := OverallWidth + OperationItem^.Width + HorizontalSpaceBetween; end; begin ClearItems; for QueueIndex := 0 to OperationsManager.QueuesCount - 1 do begin Queue := OperationsManager.QueueByIndex[QueueIndex]; if Queue.Count > 0 then begin if Queue.Identifier = FreeOperationsQueueId then begin for OperIndex := 0 to Queue.Count - 1 do begin OpManItem := Queue.Items[OperIndex]; if Assigned(OpManItem) then begin New(OperationItem); FOperations.Add(OperationItem); OperationItem^.QueueId := Queue.Identifier; OperationItem^.OperationHandle := OpManItem.Handle; OutString := IntToStr(OpManItem.Handle) + ': ' + OpManItem.Operation.GetDescription(fsoddJob) + ' - ' + GetProgressString(100); SetSize; if not TfrmFileOp.IsOpenedFor(OpManItem.Handle) and not (OpManItem.Operation.State in [fsosStopping, fsosStopped]) then Visibility := True; end; end; end else begin New(OperationItem); FQueues.Add(OperationItem); OperationItem^.QueueId := Queue.Identifier; OperationItem^.OperationHandle := InvalidOperationHandle; OutString := Queue.GetDescription(True) + LineEnding + Queue.Items[0].Operation.GetDescription(fsoddJob) + ' - ' + GetProgressString(100); SetSize; if not TfrmFileOp.IsOpenedFor(Queue.Identifier) then Visibility := True; end; end; end; ClientHeight := OverallHeight + 2; ClientWidth := Max(OverallWidth - HorizontalSpaceBetween, FParentWidth); Visible := Visibility; end; procedure TOperationsPanel.UpdateVisibility; var OpManItem: TOperationsManagerItem; QueueIndex, OperIndex: Integer; Queue: TOperationsManagerQueue; Visibility: Boolean = False; begin for QueueIndex := 0 to OperationsManager.QueuesCount - 1 do begin Queue := OperationsManager.QueueByIndex[QueueIndex]; if Queue.Count > 0 then begin if Queue.Identifier = FreeOperationsQueueId then begin for OperIndex := 0 to Queue.Count - 1 do begin OpManItem := Queue.Items[OperIndex]; if Assigned(OpManItem) then begin if not TfrmFileOp.IsOpenedFor(OpManItem.Handle) and not (OpManItem.Operation.State in [fsosStopping, fsosStopped]) then Visibility := True; end; end; end else begin if not TfrmFileOp.IsOpenedFor(Queue.Identifier) then Visibility := True; end; end; end; Visible := Visibility; end; constructor TOperationsPanel.Create(AOwner: TComponent); begin inherited Create(AOwner); FOperations := TFPList.Create; FQueues := TFPList.Create; OperationsManager.AddEventsListener( [omevOperationAdded, omevOperationRemoved, omevOperationMoved], @OperationsManagerEvent); TfrmFileOp.AddEventsListener([opwevOpened, opwevClosed], @ProgressWindowEvent); end; destructor TOperationsPanel.Destroy; begin OperationsManager.RemoveEventsListener( [omevOperationAdded, omevOperationRemoved, omevOperationMoved], @OperationsManagerEvent); TfrmFileOp.RemoveEventsListener([opwevOpened, opwevClosed], @ProgressWindowEvent); inherited Destroy; FOperations.Free; FQueues.Free; end; procedure TOperationsPanel.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var ClickPos: TPoint; OpManItem: TOperationsManagerItem; procedure HandleItem(Item: POperationPanelItem); var Queue: TOperationsManagerQueue; begin Queue := OperationsManager.QueueByIdentifier[Item^.QueueId]; if Assigned(Queue) and (Queue.Count > 0) then begin if Item^.OperationHandle = InvalidOperationHandle then begin case Button of mbLeft: TfrmFileOp.ShowFor(Item^.QueueId, [opwoIfExistsBringToFront]); mbMiddle: Queue.TogglePause; mbRight: ShowOperationsViewer(Item^.QueueId); end; end else begin OpManItem := Queue.ItemByHandle[Item^.OperationHandle]; if Assigned(OpManItem) then begin case Button of mbLeft: TfrmFileOp.ShowFor(OpManItem.Handle, [opwoIfExistsBringToFront]); mbMiddle: OpManItem.Operation.TogglePause; mbRight: ShowOperationsViewer(OpManItem.Handle); end; end; end; end; end; var ItemRect: TRect; Item: POperationPanelItem; begin inherited MouseDown(Button, Shift, X, Y); ClickPos := Point(X, Y); ItemRect := ClientRect; InflateRect(ItemRect, -PanelBorderWidth, -PanelBorderWidth); ItemRect.Right := ItemRect.Left - HorizontalSpaceBetween; for Item in FQueues do begin ItemRect.Left := ItemRect.Right + HorizontalSpaceBetween; ItemRect.Right := ItemRect.Left + Item^.Width; if PtInRect(ItemRect, ClickPos) then begin HandleItem(Item); Exit; end; end; for Item in FOperations do begin ItemRect.Left := ItemRect.Right + HorizontalSpaceBetween; ItemRect.Right := ItemRect.Left + Item^.Width; if PtInRect(ItemRect, ClickPos) then begin HandleItem(Item); Exit; end; end; end; procedure TOperationsPanel.Paint; var OpManItem: TOperationsManagerItem; ARect, ItemRect: TRect; ColorFrom, ColorTo: TColor; Queue: TOperationsManagerQueue; Item: POperationPanelItem; i: Integer; AProgress: Double; procedure DrawString(s: String); begin // Draw output string Canvas.Brush.Style := bsClear; ARect := ItemRect; InflateRect(ARect, -4, -2); DrawText(Canvas.Handle, PChar(s), Length(s), ARect, DT_LEFT or DT_VCENTER or DT_NOPREFIX); end; procedure DrawProgress(State: TFileSourceOperationState; Progress: Double); begin // Draw progress bar GetStateColor(State, ColorFrom, ColorTo); ARect := ItemRect; InflateRect(ARect, -1, -1); ARect.Right := ARect.Left + Round((ARect.Right - ARect.Left) * Progress); Canvas.GradientFill(ARect, ColorFrom, ColorTo, gdVertical); end; begin inherited Paint; ItemRect := ClientRect; Canvas.Pen.Color:= cl3DDkShadow; Canvas.Rectangle(ItemRect); InflateRect(ItemRect, -PanelBorderWidth, -PanelBorderWidth); Canvas.GradientFill(ItemRect, LightColor(clBtnHiLight, 20), clBtnFace, gdVertical); ItemRect.Right := ItemRect.Left - HorizontalSpaceBetween; i := 0; while i < FQueues.Count do begin Item := FQueues[i]; Queue := OperationsManager.QueueByIdentifier[Item^.QueueId]; if Assigned(Queue) and (Queue.Count > 0) then begin OpManItem := Queue.Items[0]; if Assigned(OpManItem) then begin ItemRect.Left := ItemRect.Right + HorizontalSpaceBetween; ItemRect.Right := ItemRect.Left + Item^.Width; // Draw border Canvas.Pen.Color := LightColor(cl3DDkShadow, 25); Canvas.Brush.Style := bsSolid; Canvas.Rectangle(ItemRect); AProgress := OpManItem.Operation.Progress; DrawProgress(OpManItem.Operation.State, AProgress); DrawString(Queue.GetDescription(True) + LineEnding + OpManItem.Operation.GetDescription(fsoddJob) + ' - ' + GetProgressString(AProgress)); Inc(i); end else DeleteItem(FQueues, i); end else DeleteItem(FQueues, i); end; i := 0; while i < FOperations.Count do begin Item := FOperations[i]; Queue := OperationsManager.QueueByIdentifier[Item^.QueueId]; if Assigned(Queue) and (Queue.Count > 0) then begin OpManItem := Queue.ItemByHandle[Item^.OperationHandle]; if Assigned(OpManItem) then begin ItemRect.Left := ItemRect.Right + HorizontalSpaceBetween; ItemRect.Right := ItemRect.Left + Item^.Width; if TfrmFileOp.IsOpenedFor(OpManItem.Handle) then Canvas.Pen.Color := clMenuHighlight else Canvas.Pen.Color := LightColor(cl3DDkShadow, 40); // Draw border Canvas.Brush.Style := bsSolid; Canvas.Rectangle(ItemRect); AProgress := OpManItem.Operation.Progress; DrawProgress(OpManItem.Operation.State, AProgress); DrawString(IntToStr(OpManItem.Handle) + ': ' + OpManItem.Operation.GetDescription(fsoddJob) + ' - ' + GetProgressString(AProgress)); Inc(i); end else DeleteItem(FOperations, i); end else DeleteItem(FOperations, i); end; end; procedure TOperationsPanel.UpdateView; begin Invalidate; end; end. doublecmd-0.5.8/src/fsymlink.lfm0000644000175000017500000000601212076733100015627 0ustar alexxalexxobject frmSymLink: TfrmSymLink Left = 311 Height = 193 Top = 267 Width = 602 HorzScrollBar.Page = 399 HorzScrollBar.Range = 344 VertScrollBar.Page = 151 VertScrollBar.Range = 128 ActiveControl = edtLinkToCreate AutoSize = True BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Create symbolic link' ClientHeight = 193 ClientWidth = 602 KeyPreview = True OnShow = FormShow Position = poScreenCenter LCLVersion = '1.0.4.0' object lblExistingFile: TLabel AnchorSideLeft.Control = edtExistingFile AnchorSideTop.Control = edtLinkToCreate AnchorSideTop.Side = asrBottom Left = 6 Height = 16 Top = 59 Width = 240 BorderSpacing.Top = 6 Caption = '&Destination that the link will point to' FocusControl = edtExistingFile ParentColor = False end object lblLinkToCreate: TLabel AnchorSideLeft.Control = edtLinkToCreate AnchorSideTop.Control = Owner Left = 6 Height = 16 Top = 6 Width = 69 BorderSpacing.Top = 6 Caption = '&Link name' FocusControl = edtLinkToCreate ParentColor = False end object edtExistingFile: TEdit AnchorSideLeft.Control = Owner AnchorSideTop.Control = lblExistingFile AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 25 Top = 81 Width = 590 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 BorderSpacing.Top = 6 BorderSpacing.Right = 6 Constraints.MinWidth = 400 TabOrder = 1 end object edtLinkToCreate: TEdit AnchorSideLeft.Control = Owner AnchorSideTop.Control = lblLinkToCreate AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 25 Top = 28 Width = 590 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 BorderSpacing.Top = 6 BorderSpacing.Right = 6 Constraints.MinWidth = 400 TabOrder = 0 end object btnOK: TBitBtn AnchorSideTop.Control = edtExistingFile AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnCancel Left = 390 Height = 36 Top = 118 Width = 100 Anchors = [akTop, akRight] AutoSize = True BorderSpacing.Top = 12 BorderSpacing.Right = 6 BorderSpacing.Bottom = 6 BorderSpacing.InnerBorder = 2 Caption = '&OK' Constraints.MinWidth = 100 Default = True Kind = bkOK ModalResult = 1 OnClick = btnOKClick TabOrder = 2 end object btnCancel: TBitBtn AnchorSideTop.Control = edtExistingFile AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtExistingFile AnchorSideRight.Side = asrBottom Left = 496 Height = 36 Top = 118 Width = 100 Anchors = [akTop, akRight] AutoSize = True BorderSpacing.Top = 12 BorderSpacing.Bottom = 6 BorderSpacing.InnerBorder = 2 Cancel = True Caption = '&Cancel' Constraints.MinWidth = 100 Kind = bkCancel ModalResult = 2 TabOrder = 3 end end doublecmd-0.5.8/src/fsplitter.lfm0000644000175000017500000001416712023046500016012 0ustar alexxalexxobject frmSplitter: TfrmSplitter Left = 283 Height = 293 Top = 122 Width = 399 HorzScrollBar.Page = 464 HorzScrollBar.Range = 369 VertScrollBar.Page = 301 VertScrollBar.Range = 227 ActiveControl = cmbxSize AutoSize = True BorderIcons = [biSystemMenu] Caption = 'Splitter' ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ClientHeight = 293 ClientWidth = 399 Position = poScreenCenter LCLVersion = '1.1' object grbxFile: TGroupBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = btnCancel AnchorSideRight.Side = asrBottom Left = 6 Height = 143 Top = 6 Width = 385 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Left = 6 BorderSpacing.Bottom = 6 Caption = 'File name' ChildSizing.LeftRightSpacing = 10 ChildSizing.TopBottomSpacing = 4 ClientHeight = 120 ClientWidth = 381 TabOrder = 0 object lbFileSource: TLabel Left = 10 Height = 18 Top = 4 Width = 72 Caption = 'File &source' FocusControl = edFileSource ParentColor = False end object lbDirTarget: TLabel AnchorSideTop.Control = edFileSource AnchorSideTop.Side = asrBottom Left = 10 Height = 18 Top = 66 Width = 107 BorderSpacing.Top = 12 Caption = 'Directory &target' FocusControl = edDirTarget ParentColor = False end object edFileSource: TEdit AnchorSideTop.Control = lbFileSource AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 10 Height = 28 Top = 26 Width = 360 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 4 ReadOnly = True TabOrder = 0 end object edDirTarget: TEdit AnchorSideTop.Control = lbDirTarget AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnFTChoice Left = 10 Height = 28 Top = 88 Width = 330 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 4 BorderSpacing.Right = 6 TabOrder = 1 end object btnFTChoice: TButton AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edDirTarget AnchorSideRight.Control = edFileSource AnchorSideRight.Side = asrBottom Left = 346 Height = 23 Top = 88 Width = 24 Anchors = [akTop, akRight] BorderSpacing.Left = 4 Caption = '...' OnClick = btnFTChoiceClick TabOrder = 2 end end object grbxSize: TGroupBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = grbxFile AnchorSideTop.Side = asrBottom Left = 6 Height = 128 Top = 155 Width = 300 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Left = 6 BorderSpacing.Right = 6 Caption = 'Size and number of parts' ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ClientHeight = 105 ClientWidth = 296 Constraints.MinWidth = 300 TabOrder = 1 object cmbxSize: TComboBox AnchorSideLeft.Control = grbxSize AnchorSideTop.Control = grbxSize AnchorSideRight.Side = asrBottom Left = 6 Height = 28 Top = 6 Width = 276 Anchors = [akTop, akLeft, akRight] ItemHeight = 0 ItemIndex = 0 Items.Strings = ( '1457664B - 3.5"' '98078KB - ZIP 100MB' '650MB - CD 650MB' '700MB - CD 700MB' '4482MB - DVD+R' ) OnCloseUp = cmbxSizeCloseUp OnKeyPress = cmbxSizeKeyPress OnKeyUp = cmbxSizeKeyUp TabOrder = 0 Text = '1457664B - 3.5"' end object rbtnKiloB: TRadioButton AnchorSideLeft.Control = cmbxSize AnchorSideTop.Control = cmbxSize AnchorSideTop.Side = asrBottom Left = 6 Height = 23 Top = 40 Width = 84 BorderSpacing.Top = 6 Caption = '&Kilobytes' Checked = True OnChange = rbtnKiloBChange TabOrder = 1 end object rbtnMegaB: TRadioButton AnchorSideLeft.Control = rbtnKiloB AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = rbtnKiloB Left = 92 Height = 23 Top = 40 Width = 94 BorderSpacing.Left = 2 Caption = '&Megabytes' OnChange = rbtnKiloBChange TabOrder = 2 end object rbtnGigaB: TRadioButton AnchorSideLeft.Control = rbtnMegaB AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = rbtnMegaB Left = 188 Height = 23 Top = 40 Width = 87 BorderSpacing.Left = 2 Caption = '&Gigabytes' OnChange = rbtnKiloBChange TabOrder = 3 end object teNumberParts: TEdit AnchorSideLeft.Control = lblNumberParts AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = rbtnMegaB AnchorSideTop.Side = asrBottom Left = 117 Height = 28 Top = 71 Width = 72 BorderSpacing.Left = 4 BorderSpacing.Top = 8 OnKeyPress = teNumberPartsKeyPress OnKeyUp = teNumberPartsKeyUp TabOrder = 4 end object lblNumberParts: TLabel AnchorSideLeft.Control = rbtnKiloB AnchorSideTop.Control = teNumberParts AnchorSideTop.Side = asrCenter Left = 6 Height = 18 Top = 76 Width = 107 Caption = '&Number of parts' FocusControl = teNumberParts ParentColor = False end end object btnOK: TButton AnchorSideRight.Control = btnCancel AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = btnCancel Left = 316 Height = 32 Top = 213 Width = 75 Anchors = [akRight, akBottom] BorderSpacing.Bottom = 6 Caption = '&OK' Default = True ModalResult = 1 TabOrder = 2 end object btnCancel: TButton AnchorSideLeft.Control = grbxSize AnchorSideLeft.Side = asrBottom AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = grbxSize AnchorSideBottom.Side = asrBottom Left = 316 Height = 32 Top = 251 Width = 75 Anchors = [akLeft, akBottom] BorderSpacing.Left = 10 Cancel = True Caption = '&Cancel' ModalResult = 2 TabOrder = 3 end end doublecmd-0.5.8/src/uexceptions.pas0000644000175000017500000001403312135034067016352 0ustar alexxalexxunit uExceptions; {$mode objfpc}{$H+} interface uses Classes, SysUtils; function ExceptionToString: String; procedure WriteExceptionToFile(const aFileName: UTF8String; const ExceptionText: String = ''); procedure WriteExceptionToErrorFile(const ExceptionText: String = ''); inline; procedure ShowExceptionDialog(const ExceptionText: String = ''); procedure ShowException(e: Exception); {en Log exception to file, show on console and show message dialog. Can be called from other threads. } procedure HandleException(e: Exception; AThread: TThread = nil); implementation uses Forms, Controls, Dialogs, LCLProc, LCLStrConsts, syncobjs, uDebug, uLng, uGlobs, uDCVersion, DCOSUtils; type THandleException = class private FHandleExceptionLock: TCriticalSection; FHandleExceptionMessage: String; FHandleExceptionBackTrace: String; procedure ShowException; public constructor Create; reintroduce; destructor Destroy; override; procedure HandleException(e: Exception; AThread: TThread = nil); end; var HandleExceptionObj: THandleException; function ExceptionToString: String; var FrameCount: Integer; FrameNumber: Integer; Frames: PPointer; begin Result := 'Unhandled exception:'; if Assigned(ExceptObject) and (ExceptObject is Exception) then begin Result := Result + ' ' + Exception(ExceptObject).ClassName + ': ' + Exception(ExceptObject).Message; end; Result := Result + LineEnding + ' Stack trace:' + LineEnding + BackTraceStrFunc(ExceptAddr) + LineEnding; FrameCount := ExceptFrameCount; Frames := ExceptFrames; for FrameNumber := 0 to FrameCount - 1 do Result := Result + BackTraceStrFunc(Frames[FrameNumber]) + LineEnding; end; procedure WriteExceptionToFile(const aFileName: UTF8String; const ExceptionText: String); var f: System.Text; begin if (aFileName <> EmptyStr) and not mbDirectoryExists(aFileName) then begin AssignFile(f, UTF8ToSys(aFileName)); {$PUSH}{$I-} if not mbFileExists(aFileName) then Rewrite(f) else if mbFileAccess(aFileName, fmOpenWrite or fmShareDenyNone) then Append(f); {$POP} if (TextRec(f).mode <> fmClosed) and (IOResult = 0) then begin WriteLn(f, '--------------- ', FormatDateTime('dd-mm-yyyy, hh:nn:ss', SysUtils.Now), ' ---------------'); WriteLn(f, '| DC v', dcVersion, ' Rev. ', dcRevision, ' -- ', TargetCPU + '-' + TargetOS + '-' + TargetWS); if WSVersion <> EmptyStr then WriteLn(f, '| ', OSVersion, ' -- ', WSVersion) else WriteLn(f, '| ', OSVersion); if ExceptionText = EmptyStr then begin if Assigned(ExceptObject) and (ExceptObject is Exception) then WriteLn(f, 'Unhandled exception: ', Exception(ExceptObject).ClassName, ': ', Exception(ExceptObject).Message) else WriteLn(f, 'Unhandled exception'); WriteLn(f, ' Stack trace:'); System.DumpExceptionBackTrace(f); end else WriteLn(f, ExceptionText); // Make one empty line. WriteLn(f); CloseFile(f); end; end; end; procedure WriteExceptionToErrorFile(const ExceptionText: String = ''); begin WriteExceptionToFile(gErrorFile, ExceptionText); end; procedure ShowExceptionDialog(const ExceptionText: String = ''); // Based on TApplication.ShowException. var Msg: string; MsgResult: Integer; begin if AppNoExceptionMessages in Application.Flags then exit; if ExceptionText = EmptyStr then begin if Assigned(ExceptObject) and (ExceptObject is Exception) then Msg := Exception(ExceptObject).Message else Msg := ''; end else Msg := ExceptionText; if FindInvalidUTF8Character(PChar(Msg), Length(Msg), False) > 0 then Msg := AnsiToUtf8(Msg); if (Msg <> '') and (Msg[length(Msg)] = LineEnding) then Delete(Msg, Length(Msg), 1); with Application do if (not Terminated) and (Application <> nil) and (AppInitialized in Flags) then begin DisableIdleHandler; try MsgResult := MessageDlg( Application.Title + ' - ' + rsMtError, rsMtError + ':' + LineEnding + Msg + LineEnding + LineEnding + Format(rsUnhandledExceptionMessage, [LineEnding + gErrorFile + LineEnding + LineEnding, StringReplace(rsMbIgnore, '&', '', [rfReplaceAll]), StringReplace(rsMbAbort, '&', '', [rfReplaceAll])]), mtError, [mbIgnore, mbAbort], 0, mbIgnore); finally EnableIdleHandler; end; if MsgResult = mrAbort then begin Flags := Flags + [AppNoExceptionMessages]; Halt; end; end; end; procedure ShowException(e: Exception); begin MessageDlg(Application.Title, rsMsgLogError + LineEnding + e.Message, mtError, [mbOK], 0); end; procedure HandleException(e: Exception; AThread: TThread); begin HandleExceptionObj.HandleException(e, AThread); end; constructor THandleException.Create; begin FHandleExceptionLock := TCriticalSection.Create; end; destructor THandleException.Destroy; begin inherited; FreeAndNil(FHandleExceptionLock); end; procedure THandleException.HandleException(e: Exception; AThread: TThread); var BackTrace: String; begin if MainThreadID = GetCurrentThreadId then begin BackTrace := ExceptionToString; DCDebug(BackTrace); WriteExceptionToErrorFile(BackTrace); ShowExceptionDialog(e.Message); end else begin FHandleExceptionLock.Acquire; try FHandleExceptionMessage := e.Message; FHandleExceptionBackTrace := ExceptionToString; if FHandleExceptionBackTrace <> EmptyStr then DCDebug(FHandleExceptionBackTrace); TThread.Synchronize(AThread, @ShowException); finally FHandleExceptionLock.Release; end; end; end; procedure THandleException.ShowException; begin WriteExceptionToErrorFile(FHandleExceptionBackTrace); ShowExceptionDialog(FHandleExceptionMessage); end; initialization HandleExceptionObj := THandleException.Create; finalization FreeAndNil(HandleExceptionObj); end. doublecmd-0.5.8/src/ffindview.pas0000644000175000017500000000277212076507125016000 0ustar alexxalexx{ Seksi Commander ---------------------------- Find dialog for Viewer Licence : GNU GPL v 2.0 Author : radek.cervinka@centrum.cz contributors: } unit fFindView; {$mode objfpc}{$H+} interface uses SysUtils, Classes, Controls, Forms, StdCtrls, Buttons, uOSForms; type TfrmFindView = class(TModalForm) cbDataToFind: TComboBox; btnFind: TBitBtn; btnClose: TBitBtn; cbCaseSens: TCheckBox; procedure FormShow(Sender: TObject); procedure btnFindClick(Sender: TObject); procedure cbDataToFindKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } public { Public declarations } end; implementation {$R *.lfm} uses LCLProc, LCLType, uDCUtils; procedure TfrmFindView.FormShow(Sender: TObject); begin if cbDataToFind.Text = EmptyStr then begin if cbDataToFind.Items.Count > 0 then cbDataToFind.Text:= cbDataToFind.Items[0]; end; cbDataToFind.SelectAll; cbDataToFind.SetFocus; end; procedure TfrmFindView.btnFindClick(Sender: TObject); begin InsertFirstItem(cbDataToFind.Text, cbDataToFind); ModalResult:= mrOk; end; procedure TfrmFindView.cbDataToFindKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin inherited; if (Key = VK_Down) and (cbDataToFind.Items.Count > 0) then cbDataToFind.DroppedDown:= True; if Key = 13 then begin Key:= 0; btnFind.Click; end; if Key = 27 then begin Key:= 0; ModalResult:= mrCancel; end; end; end. doublecmd-0.5.8/src/feditsearch.lrt0000644000175000017500000000122112023046500016265 0ustar alexxalexxTFRMEDITSEARCHREPLACE.LBLSEARCHFOR.CAPTION=&Search for: TFRMEDITSEARCHREPLACE.LBLREPLACEWITH.CAPTION=&Replace with: TFRMEDITSEARCHREPLACE.GBSEARCHOPTIONS.CAPTION=Option TFRMEDITSEARCHREPLACE.CBSEARCHCASESENSITIVE.CAPTION=C&ase sensitivity TFRMEDITSEARCHREPLACE.CBSEARCHWHOLEWORDS.CAPTION=&Whole words only TFRMEDITSEARCHREPLACE.CBSEARCHSELECTEDONLY.CAPTION=Selected &text only TFRMEDITSEARCHREPLACE.CBSEARCHFROMCURSOR.CAPTION=S&earch from caret TFRMEDITSEARCHREPLACE.CBSEARCHREGEXP.CAPTION=&Regular expressions TFRMEDITSEARCHREPLACE.RGSEARCHDIRECTION.CAPTION=Direction TFRMEDITSEARCHREPLACE.BTNOK.CAPTION=&OK TFRMEDITSEARCHREPLACE.BTNCANCEL.CAPTION=&Cancel doublecmd-0.5.8/src/fhardlink.lrt0000644000175000017500000000035212023046500015752 0ustar alexxalexxTFRMHARDLINK.CAPTION=Create hard link TFRMHARDLINK.LBLEXISTINGFILE.CAPTION=&Destination that the link will point to TFRMHARDLINK.LBLLINKTOCREATE.CAPTION=&Link name TFRMHARDLINK.BTNOK.CAPTION=&OK TFRMHARDLINK.BTNCANCEL.CAPTION=&Cancel doublecmd-0.5.8/src/ucryptproc.pas0000644000175000017500000001634412045505045016224 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- This unit contains Encrypt/Decrypt classes and functions. Copyright (C) 2009 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uCryptProc; {$mode objfpc}{$H+} interface uses Classes, SysUtils, DCClassesUtf8; type { TPasswordStore } TPasswordStore = class(TIniFileEx) private FMasterKey, FMasterKeyHash: AnsiString; FInitialized: Boolean; public constructor Create(const AFileName: String; Mode: Word); override; destructor Destroy; override; function HasMasterKey: Boolean; function CheckMasterKey: Boolean; function WritePassword(Prefix, Name, Connection: UTF8String; const Password: AnsiString): Boolean; function ReadPassword(Prefix, Name, Connection: UTF8String; out Password: AnsiString): Boolean; function DeletePassword(Prefix, Name, Connection: UTF8String): Boolean; end; { EEncryptDecryptFailed } EEncryptDecryptFailed = class(Exception) public constructor Create; reintroduce; end; function Encode(MasterKey, Data: AnsiString): AnsiString; function Decode(MasterKey, Data: AnsiString): AnsiString; procedure InitPasswordStore; var PasswordStore: TPasswordStore = nil; implementation uses LCLProc, LCLType, Base64, BlowFish, md5, uShowMsg, uGlobsPaths, uLng, uDebug, DCOSUtils; type TBlowFishKeyRec = record dwSize: LongWord; case Boolean of True: (bBlowFishKey: TBlowFishKey); False: (cBlowFishKey: array [0..SizeOf(TBlowFishKey)] of AnsiChar); end; function Encode(MasterKey, Data: AnsiString): AnsiString; var BlowFishKeyRec: TBlowFishKeyRec; StringStream: TStringStream = nil; Base64EncodingStream: TBase64EncodingStream = nil; BlowFishEncryptStream: TBlowFishEncryptStream = nil; begin Result:= EmptyStr; BlowFishKeyRec.cBlowFishKey:= MasterKey; BlowFishKeyRec.dwSize:= Length(MasterKey); try StringStream:= TStringStream.Create(EmptyStr); Base64EncodingStream:= TBase64EncodingStream.Create(StringStream); BlowFishEncryptStream:= TBlowFishEncryptStream.Create(BlowFishKeyRec.bBlowFishKey, BlowFishKeyRec.dwSize, Base64EncodingStream); BlowFishEncryptStream.Write(PAnsiChar(Data)^, Length(Data)); BlowFishEncryptStream.Flush; Base64EncodingStream.Flush; Result:= StringStream.DataString; finally FreeThenNil(BlowFishEncryptStream); FreeThenNil(Base64EncodingStream); FreeThenNil(StringStream); end; end; function Decode(MasterKey, Data: AnsiString): AnsiString; var BlowFishKeyRec: TBlowFishKeyRec; StringStream: TStringStream = nil; Base64DecodingStream: TBase64DecodingStream = nil; BlowFishDeCryptStream: TBlowFishDeCryptStream = nil; begin Result:= EmptyStr; BlowFishKeyRec.cBlowFishKey:= MasterKey; BlowFishKeyRec.dwSize:= Length(MasterKey); try StringStream:= TStringStream.Create(Data); Base64DecodingStream:= TBase64DecodingStream.Create(StringStream); SetLength(Result, Base64DecodingStream.Size); BlowFishDeCryptStream:= TBlowFishDeCryptStream.Create(BlowFishKeyRec.bBlowFishKey, BlowFishKeyRec.dwSize, Base64DecodingStream); BlowFishDeCryptStream.Read(PAnsiChar(Result)^, Base64DecodingStream.Size); finally FreeThenNil(BlowFishDeCryptStream); FreeThenNil(Base64DecodingStream); FreeThenNil(StringStream); end; end; { TPasswordStore } constructor TPasswordStore.Create(const AFileName: String; Mode: Word); begin inherited Create(AFileName, Mode); FMasterKeyHash:= ReadString('General', 'MasterKey', EmptyStr); // In case exception happens when opening file use this flag to // allow WriteString in Destroy only when Create has been successful. FInitialized := True; end; destructor TPasswordStore.Destroy; begin if FInitialized and not ReadOnly then WriteString('General', 'MasterKey', FMasterKeyHash); inherited Destroy; end; function TPasswordStore.HasMasterKey: Boolean; begin Result:= (Length(FMasterKey) <> 0); end; function TPasswordStore.CheckMasterKey: Boolean; var MasterKey, MasterKeyHash: AnsiString; begin Result:= False; if Length(FMasterKey) <> 0 then Exit(True); if not ShowInputQuery(rsMsgMasterPassword, rsMsgMasterPasswordEnter, True, MasterKey) then Exit; if Length(MasterKey) = 0 then Exit; MasterKeyHash:= MD5Print(MD5String(MasterKey)); MasterKeyHash:= Encode(MasterKey, MasterKeyHash); if FMasterKeyHash = EmptyStr then begin FMasterKeyHash:= MasterKeyHash; FMasterKey:= MasterKey; Result:= True; end else if SameText(FMasterKeyHash, MasterKeyHash) then begin FMasterKey:= MasterKey; Result:= True; end else begin ShowMessageBox('Wrong password!'#13'Please try again!', 'Error!', MB_OK or MB_ICONERROR); end; end; function TPasswordStore.WritePassword(Prefix, Name, Connection: UTF8String; const Password: AnsiString): Boolean; var Data: AnsiString; begin Result:= False; if CheckMasterKey = False then Exit; Data:= Encode(FMasterKey, Password); if Data = EmptyStr then raise EEncryptDecryptFailed.Create; WriteString(Prefix + '_' + Name, Connection, Data); Result:= True; end; function TPasswordStore.ReadPassword(Prefix, Name, Connection: UTF8String; out Password: AnsiString): Boolean; var Data: AnsiString = ''; begin Result:= False; if CheckMasterKey = False then Exit; Data:= ReadString(Prefix + '_' + Name, Connection, Data); if Data = EmptyStr then raise EEncryptDecryptFailed.Create; Password:= Decode(FMasterKey, Data); Result:= True; end; function TPasswordStore.DeletePassword(Prefix, Name, Connection: UTF8String): Boolean; begin DeleteKey(Prefix + '_' + Name, Connection); Result := True; end; procedure InitPasswordStore; var AFileName: String; Mode: Word; begin AFileName := gpCfgDir + 'pwd.ini'; try if mbFileAccess(AFileName, fmOpenReadWrite or fmShareDenyWrite) then Mode := fmOpenReadWrite or fmShareDenyWrite else Mode := fmOpenRead or fmShareDenyWrite; PasswordStore:= TPasswordStore.Create(AFileName, Mode); except DCDebug('Can not create secure password store!'); end; end; { EEncryptDecryptFailed } constructor EEncryptDecryptFailed.Create; begin inherited Create('Encrypt/Decrypt failed'); end; finalization FreeThenNil(PasswordStore); end. doublecmd-0.5.8/src/fextractdlg.lrt0000644000175000017500000000115112023056051016317 0ustar alexxalexxTFRMEXTRACTDLG.CAPTION=Unpack files TFRMEXTRACTDLG.LBLFILEMASK.CAPTION=&Extract files matching file mask: TFRMEXTRACTDLG.LBLPASSWORD.CAPTION=&Password for encrypted files: TFRMEXTRACTDLG.LBLEXTRACTTO.CAPTION=To the &directory: TFRMEXTRACTDLG.CBFILEMASK.TEXT=*.* TFRMEXTRACTDLG.CBEXTRACTPATH.CAPTION=&Unpack path names if stored with files TFRMEXTRACTDLG.CBOVERWRITE.CAPTION=O&verwrite existing files TFRMEXTRACTDLG.BTNOK.CAPTION=&OK TFRMEXTRACTDLG.BTNCANCEL.CAPTION=&Cancel TFRMEXTRACTDLG.BTNHELP.CAPTION=&Help TFRMEXTRACTDLG.CBINSEPARATEFOLDER.CAPTION=Unpack each archive to a &separate subdir (name of the archive) doublecmd-0.5.8/src/fMsg.lfm0000644000175000017500000000063012045446211014667 0ustar alexxalexxinherited frmMsg: TfrmMsg Left = 270 Height = 254 Top = 149 Width = 426 HorzScrollBar.Page = 425 VertScrollBar.Page = 253 ClientHeight = 254 ClientWidth = 426 KeyPreview = True OnCreate = FormCreate OnKeyPress = FormKeyPress OnKeyUp = FormKeyUp OnShow = frmMsgShow object lblMsg: TLabel[0] Left = 32 Height = 1 Top = 16 Width = 1 ParentColor = False end end doublecmd-0.5.8/src/uwlxprototypes.pas0000644000175000017500000000336611740433676017175 0ustar alexxalexxunit uwlxprototypes; {$mode objfpc}{$H+} interface uses Classes, SysUtils, WlxPlugin; {$IFDEF MSWINDOWS}{$CALLING STDCALL}{$ELSE}{$CALLING CDECL}{$ENDIF} type { Mandatory } TListLoad = function (ParentWin:thandle;FileToLoad:pchar;ShowFlags:integer):thandle; { Optional } TListLoadNext = function (ParentWin,PluginWin:thandle;FileToLoad:pchar;ShowFlags:integer):integer; TListCloseWindow = procedure (ListWin:thandle); TListGetDetectString = procedure (DetectString:pchar;maxlen:integer); TListSearchText = function (ListWin:thandle;SearchString:pchar; SearchParameter:integer):integer; TListSearchDialog = function (ListWin:thandle;FindNext:integer):integer; TListSendCommand = function (ListWin:thandle;Command,Parameter:integer):integer; TListPrint = function (ListWin:thandle;FileToPrint,DefPrinter:pchar; PrintFlags:integer;var Margins:trect):integer; TListNotificationReceived = function (ListWin:thandle;Message,wParam,lParam:integer):integer; TListSetDefaultParams = procedure (dps:pListDefaultParamStruct); TListGetPreviewBitmap = function (FileToLoad:pchar;width,height:integer; contentbuf:pchar;contentbuflen:integer):hbitmap; { Unicode } TListLoadW = function (ParentWin:thandle;FileToLoad:pwidechar;ShowFlags:integer):thandle; TListLoadNextW = function (ParentWin,PluginWin:thandle;FileToLoad:pwidechar;ShowFlags:integer):integer; TListSearchTextW = function (ListWin:thandle;SearchString:pwidechar; SearchParameter:integer):integer; TListPrintW = function (ListWin:thandle;FileToPrint,DefPrinter:pwidechar; PrintFlags:integer;var Margins:trect):integer; TListGetPreviewBitmapW = function (FileToLoad:pwidechar;width,height:integer; contentbuf:pchar;contentbuflen:integer):hbitmap; {$CALLING DEFAULT} implementation end. doublecmd-0.5.8/src/fopenwith.lrt0000755000175000017500000000117312054100376016026 0ustar alexxalexxTFRMOPENWITH.CAPTION=Choose an application TFRMOPENWITH.LBLMIMETYPE.CAPTION=File type to be opened: %s TFRMOPENWITH.CHKUSEASDEFAULT.CAPTION=Set selected application as default action TFRMOPENWITH.CHKCUSTOMCOMMAND.CAPTION=Custom command TFRMOPENWITH.CHKSAVEASSOCIATION.CAPTION=Save association TFRMOPENWITH.MISINGLEFILENAME.CAPTION=Single file name TFRMOPENWITH.MISINGLEFILENAME.HINT=%f TFRMOPENWITH.MILISTOFFILES.CAPTION=Multiple file names TFRMOPENWITH.MILISTOFFILES.HINT=%F TFRMOPENWITH.MISINGLEURL.CAPTION=Single URI TFRMOPENWITH.MISINGLEURL.HINT=%u TFRMOPENWITH.MILISTOFURLS.CAPTION=Multiple URIs TFRMOPENWITH.MILISTOFURLS.HINT=%U doublecmd-0.5.8/src/uguimessagequeue.pas0000644000175000017500000001433411747211345017377 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Thread-safe asynchronous call queue. It allows queueing methods that should be called by GUI thread. Copyright (C) 2009-2011 Przemysław Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uGuiMessageQueue; {$mode objfpc}{$H+} interface uses Classes, SysUtils, syncobjs; type TGuiMessageProc = procedure (Data: Pointer) of object; PMessageQueueItem = ^TMessageQueueItem; TMessageQueueItem = record Method: TGuiMessageProc; Data : Pointer; Next : PMessageQueueItem; end; TGuiMessageQueueThread = class(TThread) private FWakeThreadEvent: PRTLEvent; FMessageQueue: PMessageQueueItem; FMessageQueueLastItem: PMessageQueueItem; FMessageQueueLock: TCriticalSection; FFinished: Boolean; {en This method executes some queued functions. It is called from main thread through Synchronize. } procedure CallMethods; public constructor Create(CreateSuspended: Boolean = False); reintroduce; destructor Destroy; override; procedure Terminate; procedure Execute; override; {en @param(AllowDuplicates If @false then if the queue already has AMethod with AData parameter then it is not queued for a second time. If @true then the same methods with the same parameters are allowed to exists multiple times in the queue.) } procedure QueueMethod(AMethod: TGuiMessageProc; AData: Pointer; AllowDuplicates: Boolean = True); end; procedure InitializeGuiMessageQueue; procedure FinalizeGuiMessageQueue; var GuiMessageQueue: TGuiMessageQueueThread; implementation uses uDebug, uExceptions; const // How many functions maximum to call per one Synchronize. MaxMessages = 10; constructor TGuiMessageQueueThread.Create(CreateSuspended: Boolean = False); begin FWakeThreadEvent := RTLEventCreate; FMessageQueue := nil; FMessageQueueLastItem := nil; FMessageQueueLock := TCriticalSection.Create; FFinished := False; FreeOnTerminate := False; inherited Create(CreateSuspended, DefaultStackSize); end; destructor TGuiMessageQueueThread.Destroy; var item: PMessageQueueItem; begin // Make sure the thread is not running anymore. Terminate; FMessageQueueLock.Acquire; while Assigned(FMessageQueue) do begin item := FMessageQueue^.Next; Dispose(FMessageQueue); FMessageQueue := item; end; FMessageQueueLock.Release; RTLeventdestroy(FWakeThreadEvent); FreeAndNil(FMessageQueueLock); inherited Destroy; end; procedure TGuiMessageQueueThread.Terminate; begin inherited Terminate; // Wake after setting Terminate to True. RTLeventSetEvent(FWakeThreadEvent); end; procedure TGuiMessageQueueThread.Execute; begin try while not Terminated do begin if Assigned(FMessageQueue) then // Call some methods. Synchronize(@CallMethods) else // Wait for messages. RTLeventWaitFor(FWakeThreadEvent); end; finally FFinished := True; end; end; procedure TGuiMessageQueueThread.QueueMethod(AMethod: TGuiMessageProc; AData: Pointer; AllowDuplicates: Boolean = True); var item: PMessageQueueItem; begin FMessageQueueLock.Acquire; try if AllowDuplicates = False then begin // Search the queue for this method and parameter. item := FMessageQueue; while Assigned(item) do begin if (item^.Method = AMethod) and (item^.Data = AData) then Exit; item := item^.Next; end; end; New(item); item^.Method := AMethod; item^.Data := AData; item^.Next := nil; if not Assigned(FMessageQueue) then FMessageQueue := item else FMessageQueueLastItem^.Next := item; FMessageQueueLastItem := item; RTLeventSetEvent(FWakeThreadEvent); finally FMessageQueueLock.Release; end; end; procedure TGuiMessageQueueThread.CallMethods; var MessagesCount: Integer = MaxMessages; item: PMessageQueueItem; begin while Assigned(FMessageQueue) and (MessagesCount > 0) do begin try // Call method with parameter. FMessageQueue^.Method(FMessageQueue^.Data); except on e: Exception do begin HandleException(e, Self); end; end; FMessageQueueLock.Acquire; try item := FMessageQueue^.Next; Dispose(FMessageQueue); FMessageQueue := item; // If queue is empty then reset wait event (must be done under lock). if not Assigned(FMessageQueue) then RTLeventResetEvent(FWakeThreadEvent); finally FMessageQueueLock.Release; end; Dec(MessagesCount, 1); end; end; // ---------------------------------------------------------------------------- procedure InitializeGuiMessageQueue; begin DCDebug('Starting GuiMessageQueue'); {$IF (fpc_version<2) or ((fpc_version=2) and (fpc_release<5))} GuiMessageQueue := TGuiMessageQueueThread.Create(True); GuiMessageQueue.Resume; {$ELSE} GuiMessageQueue := TGuiMessageQueueThread.Create(False); {$ENDIF} end; procedure FinalizeGuiMessageQueue; begin GuiMessageQueue.Terminate; DCDebug('Finishing GuiMessageQueue'); {$IF (fpc_version<2) or ((fpc_version=2) and (fpc_release<5))} If (MainThreadID=GetCurrentThreadID) then while not GuiMessageQueue.FFinished do CheckSynchronize(100); {$ENDIF} GuiMessageQueue.WaitFor; FreeAndNil(GuiMessageQueue); end; initialization InitializeGuiMessageQueue; finalization FinalizeGuiMessageQueue; end. doublecmd-0.5.8/src/fdiffer.lrt0000644000175000017500000000554511752246222015441 0ustar alexxalexxTFRMDIFFER.CAPTION=Compare files TFRMDIFFER.BTNLEFTENCODING.HINT=Encoding TFRMDIFFER.BTNRIGHTENCODING.HINT=Encoding TFRMDIFFER.MNUFILE.CAPTION=&File TFRMDIFFER.MIDIVIDER7.CAPTION=- TFRMDIFFER.MIDIVIDER6.CAPTION=- TFRMDIFFER.MNUEDIT.CAPTION=&Edit TFRMDIFFER.MIDIVIDER8.CAPTION=- TFRMDIFFER.MIDIVIDER9.CAPTION=- TFRMDIFFER.MNUOPTIONS.CAPTION=&Options TFRMDIFFER.MIDIVIDER10.CAPTION=- TFRMDIFFER.MIDIVIDER4.CAPTION=- TFRMDIFFER.MIDIVIDER3.CAPTION=- TFRMDIFFER.MNUACTIONS.CAPTION=&Actions TFRMDIFFER.MIDIVIDER1.CAPTION=- TFRMDIFFER.MIDIVIDER2.CAPTION=- TFRMDIFFER.MIDIVIDER5.CAPTION=- TFRMDIFFER.MNUENCODING.CAPTION=En&coding TFRMDIFFER.MIENCODINGLEFT.CAPTION=&Left TFRMDIFFER.MIENCODINGRIGHT.CAPTION=&Right TFRMDIFFER.ACTSAVE.CAPTION=Save TFRMDIFFER.ACTSAVE.HINT=Save TFRMDIFFER.ACTSAVEAS.CAPTION=Save as... TFRMDIFFER.ACTSAVEAS.HINT=Save as... TFRMDIFFER.ACTSTARTCOMPARE.CAPTION=Compare TFRMDIFFER.ACTSTARTCOMPARE.HINT=Compare TFRMDIFFER.ACTLASTDIFFERENCE.CAPTION=Last Difference TFRMDIFFER.ACTLASTDIFFERENCE.HINT=Last Difference TFRMDIFFER.ACTNEXTDIFFERENCE.CAPTION=Next Difference TFRMDIFFER.ACTNEXTDIFFERENCE.HINT=Next Difference TFRMDIFFER.ACTPREVDIFFERENCE.CAPTION=Previous Difference TFRMDIFFER.ACTPREVDIFFERENCE.HINT=Previous Difference TFRMDIFFER.ACTFIRSTDIFFERENCE.CAPTION=First Difference TFRMDIFFER.ACTFIRSTDIFFERENCE.HINT=First Difference TFRMDIFFER.ACTIGNORECASE.CAPTION=Ignore Case TFRMDIFFER.ACTIGNOREWHITESPACE.CAPTION=Ignore Blanks TFRMDIFFER.ACTKEEPSCROLLING.CAPTION=Keep Scrolling TFRMDIFFER.ACTCANCELCOMPARE.CAPTION=Cancel TFRMDIFFER.ACTCANCELCOMPARE.HINT=Cancel TFRMDIFFER.ACTBINARYCOMPARE.CAPTION=Binary Mode TFRMDIFFER.ACTPAINTBACKGROUND.CAPTION=Paint Background TFRMDIFFER.ACTCOPYLEFTTORIGHT.CAPTION=Copy Block Right TFRMDIFFER.ACTCOPYLEFTTORIGHT.HINT=Copy Block Right TFRMDIFFER.ACTCOPYRIGHTTOLEFT.CAPTION=Copy Block Left TFRMDIFFER.ACTCOPYRIGHTTOLEFT.HINT=Copy Block Left TFRMDIFFER.ACTSAVELEFT.CAPTION=Save Left TFRMDIFFER.ACTSAVELEFT.HINT=Save Left TFRMDIFFER.ACTSAVERIGHT.CAPTION=Save Right TFRMDIFFER.ACTSAVERIGHT.HINT=Save Right TFRMDIFFER.ACTRELOAD.CAPTION=&Reload TFRMDIFFER.ACTRELOAD.HINT=Reload TFRMDIFFER.ACTOPENLEFT.CAPTION=Open Left... TFRMDIFFER.ACTOPENRIGHT.CAPTION=Open Right... TFRMDIFFER.ACTEXIT.CAPTION=E&xit TFRMDIFFER.ACTEDITCUT.CAPTION=Cut TFRMDIFFER.ACTEDITCOPY.CAPTION=Copy TFRMDIFFER.ACTEDITPASTE.CAPTION=Paste TFRMDIFFER.ACTEDITDELETE.CAPTION=Delete TFRMDIFFER.ACTEDITSELECTALL.CAPTION=Select &All TFRMDIFFER.ACTEDITREDO.CAPTION=Redo TFRMDIFFER.ACTEDITUNDO.CAPTION=Undo TFRMDIFFER.ACTSAVELEFTAS.CAPTION=Save Left As... TFRMDIFFER.ACTSAVELEFTAS.HINT=Save Left As... TFRMDIFFER.ACTSAVERIGHTAS.CAPTION=Save Right As... TFRMDIFFER.ACTSAVERIGHTAS.HINT=Save Right As... TFRMDIFFER.ACTABOUT.CAPTION=About TFRMDIFFER.ACTLINEDIFFERENCES.CAPTION=Line Differences TFRMDIFFER.ACTAUTOCOMPARE.CAPTION=Auto Compare TFRMDIFFER.MISEPARATOR1.CAPTION=- TFRMDIFFER.MISEPARATOR2.CAPTION=- doublecmd-0.5.8/src/udiff.pas0000644000175000017500000006074011740433676015121 0ustar alexxalexxunit uDiff; (******************************************************************************* * Component TDiff * * Version: 3.1 * * Date: 7 November 2009 * * Compilers: Delphi 7 - Delphi2009 * * Author: Angus Johnson - angusj-AT-myrealbox-DOT-com * * Copyright: 2001-200( Angus Johnson * * * * Licence to use, terms and conditions: * * The code in the TDiff component is released as freeware * * provided you agree to the following terms & conditions: * * 1. the copyright notice, terms and conditions are * * left unchanged * * 2. modifications to the code by other authors must be * * clearly documented and accompanied by the modifier's name. * * 3. the TDiff component may be freely compiled into binary * * format and no acknowledgement is required. However, a * * discrete acknowledgement would be appreciated (eg. in a * * program's 'About Box'). * * * * Description: Component to list differences between two integer arrays * * using a "longest common subsequence" algorithm. * * Typically, this component is used to diff 2 text files * * once their individuals lines have been hashed. * * * * Acknowledgements: The key algorithm in this component is based on: * * "An O(ND) Difference Algorithm and its Variations" * * By E Myers - Algorithmica Vol. 1 No. 2, 1986, pp. 251-266 * * http://www.cs.arizona.edu/people/gene/ * * http://www.cs.arizona.edu/people/gene/PAPERS/diff.ps * * * *******************************************************************************) (******************************************************************************* * History: * * 13 December 2001 - Original Release * * 22 April 2008 - Complete rewrite to greatly improve the code and * * provide a much simpler view of differences through a new * * 'Compares' property. * * 7 November 2009 - Updated so now compiles in newer versions of Delphi. * *******************************************************************************) {$mode delphi}{$H+} interface uses SysUtils, Classes, Math, Forms; const //Maximum realistic deviation from centre diagonal vector ... MAX_DIAGONAL = $FFFFFF; //~16 million type {$IFDEF UNICODE} P8Bits = PByte; {$ELSE} P8Bits = PAnsiChar; {$ENDIF} PDiags = ^TDiags; TDiags = array [-MAX_DIAGONAL .. MAX_DIAGONAL] of integer; PIntArray = ^TIntArray; TIntArray = array[0 .. MAXINT div sizeof(integer) -1] of Integer; PChrArray = ^TChrArray; TChrArray = array[0 .. MAXINT div sizeof(char) -1] of Char; TChangeKind = (ckNone, ckAdd, ckDelete, ckModify); PCompareRec = ^TCompareRec; TCompareRec = record Kind : TChangeKind; oldIndex1, oldIndex2 : integer; case boolean of false : (chr1, chr2 : Char); true : (int1, int2 : integer); end; TDiffStats = record matches : integer; adds : integer; deletes : integer; modifies : integer; end; TDiff = class(TComponent) private fCompareList: TList; fCancelled: boolean; fExecuting: boolean; fDiagBuffer, bDiagBuffer: pointer; Chrs1, Chrs2: PChrArray; Ints1, Ints2: PIntArray; LastCompareRec: TCompareRec; fDiag, bDiag: PDiags; fDiffStats: TDiffStats; procedure InitDiagArrays(MaxOscill, len1, len2: integer); //nb: To optimize speed, separate functions are called for either //integer or character compares ... procedure RecursiveDiffChr(offset1, offset2, len1, len2: integer); procedure AddChangeChrs(offset1, range: integer; ChangeKind: TChangeKind); procedure RecursiveDiffInt(offset1, offset2, len1, len2: integer); procedure AddChangeInts(offset1, range: integer; ChangeKind: TChangeKind); function GetCompareCount: integer; function GetCompare(index: integer): TCompareRec; public constructor Create(aOwner: TComponent); override; destructor Destroy; override; //compare either and array of characters or an array of integers ... function Execute(pints1, pints2: PInteger; len1, len2: integer): boolean; overload; function Execute(pchrs1, pchrs2: PChar; len1, len2: integer): boolean; overload; //Cancel allows interrupting excessively prolonged comparisons procedure Cancel; procedure Clear; property Cancelled: boolean read fCancelled; property Count: integer read GetCompareCount; property Compares[index: integer]: TCompareRec read GetCompare; default; property DiffStats: TDiffStats read fDiffStats; end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TDiff]); end; constructor TDiff.Create(aOwner: TComponent); begin inherited; fCompareList := TList.create; end; //------------------------------------------------------------------------------ destructor TDiff.Destroy; begin Clear; fCompareList.free; inherited; end; //------------------------------------------------------------------------------ function TDiff.Execute(pchrs1, pchrs2: PChar; len1, len2: integer): boolean; var maxOscill, x1,x2, savedLen: integer; compareRec: PCompareRec; begin result := not fExecuting; if not result then exit; fExecuting := true; fCancelled := false; try Clear; //save first string length for later (ie for any trailing matches) ... savedLen := len1-1; //setup the character arrays ... Chrs1 := pointer(pchrs1); Chrs2 := pointer(pchrs2); //ignore top matches ... x1:= 0; x2 := 0; while (len1 > 0) and (len2 > 0) and (Chrs1[len1-1] = Chrs2[len2-1]) do begin dec(len1); dec(len2); end; //if something doesn't match ... if (len1 <> 0) or (len2 <> 0) then begin //ignore bottom of matches too ... while (len1 > 0) and (len2 > 0) and (Chrs1[x1] = Chrs2[x2]) do begin dec(len1); dec(len2); inc(x1); inc(x2); end; maxOscill := min(max(len1,len2), MAX_DIAGONAL); fCompareList.Capacity := len1 + len2; //nb: the Diag arrays are extended by 1 at each end to avoid testing //for array limits. Hence '+3' because will also includes Diag[0] ... GetMem(fDiagBuffer, sizeof(integer)*(maxOscill*2+3)); GetMem(bDiagBuffer, sizeof(integer)*(maxOscill*2+3)); try RecursiveDiffChr(x1, x2, len1, len2); finally freeMem(fDiagBuffer); freeMem(bDiagBuffer); end; end; if fCancelled then begin result := false; Clear; exit; end; //finally, append any trailing matches onto compareList ... while (LastCompareRec.oldIndex1 < savedLen) do begin with LastCompareRec do begin Kind := ckNone; inc(oldIndex1); inc(oldIndex2); chr1 := Chrs1[oldIndex1]; chr2 := Chrs2[oldIndex2]; end; New(compareRec); compareRec^ := LastCompareRec; fCompareList.Add(compareRec); inc(fDiffStats.matches); end; finally fExecuting := false; end; end; //------------------------------------------------------------------------------ function TDiff.Execute(pints1, pints2: PInteger; len1, len2: integer): boolean; var maxOscill, x1,x2, savedLen: integer; compareRec: PCompareRec; begin result := not fExecuting; if not result then exit; fExecuting := true; fCancelled := false; try Clear; //setup the character arrays ... Ints1 := pointer(pints1); Ints2 := pointer(pints2); //save first string length for later (ie for any trailing matches) ... savedLen := len1-1; //ignore top matches ... x1:= 0; x2 := 0; while (len1 > 0) and (len2 > 0) and (Ints1[len1-1] = Ints2[len2-1]) do begin dec(len1); dec(len2); end; //if something doesn't match ... if (len1 <> 0) or (len2 <> 0) then begin //ignore bottom of matches too ... while (len1 > 0) and (len2 > 0) and (Ints1[x1] = Ints2[x2]) do begin dec(len1); dec(len2); inc(x1); inc(x2); end; maxOscill := min(max(len1,len2), MAX_DIAGONAL); fCompareList.Capacity := len1 + len2; //nb: the Diag arrays are extended by 1 at each end to avoid testing //for array limits. Hence '+3' because will also includes Diag[0] ... GetMem(fDiagBuffer, sizeof(integer)*(maxOscill*2+3)); GetMem(bDiagBuffer, sizeof(integer)*(maxOscill*2+3)); try RecursiveDiffInt(x1, x2, len1, len2); finally freeMem(fDiagBuffer); freeMem(bDiagBuffer); end; end; if fCancelled then begin result := false; Clear; exit; end; //finally, append any trailing matches onto compareList ... while (LastCompareRec.oldIndex1 < savedLen) do begin with LastCompareRec do begin Kind := ckNone; inc(oldIndex1); inc(oldIndex2); int1 := Ints1[oldIndex1]; int2 := Ints2[oldIndex2]; end; New(compareRec); compareRec^ := LastCompareRec; fCompareList.Add(compareRec); inc(fDiffStats.matches); end; finally fExecuting := false; end; end; //------------------------------------------------------------------------------ procedure TDiff.InitDiagArrays(MaxOscill, len1, len2: integer); var diag: integer; begin inc(maxOscill); //for the extra diag at each end of the arrays ... P8Bits(fDiag) := P8Bits(fDiagBuffer) - sizeof(integer)*(MAX_DIAGONAL-maxOscill); P8Bits(bDiag) := P8Bits(bDiagBuffer) - sizeof(integer)*(MAX_DIAGONAL-maxOscill); //initialize Diag arrays (assumes 0 based arrays) ... for diag := - maxOscill to maxOscill do fDiag[diag] := -MAXINT; fDiag[0] := -1; for diag := - maxOscill to maxOscill do bDiag[diag] := MAXINT; bDiag[len1 - len2] := len1-1; end; //------------------------------------------------------------------------------ procedure TDiff.RecursiveDiffChr(offset1, offset2, len1, len2: integer); var diag, lenDelta, Oscill, maxOscill, x1, x2: integer; begin //nb: the possible depth of recursion here is most unlikely to cause // problems with stack overflows. application.processmessages; if fCancelled then exit; if (len1 = 0) then begin AddChangeChrs(offset1, len2, ckAdd); exit; end else if (len2 = 0) then begin AddChangeChrs(offset1, len1, ckDelete); exit; end else if (len1 = 1) and (len2 = 1) then begin AddChangeChrs(offset1, 1, ckDelete); AddChangeChrs(offset1, 1, ckAdd); exit; end; maxOscill := min(max(len1,len2), MAX_DIAGONAL); InitDiagArrays(MaxOscill, len1, len2); lenDelta := len1 -len2; Oscill := 1; //ie assumes prior filter of top and bottom matches while Oscill <= maxOscill do begin if (Oscill mod 200) = 0 then begin application.processmessages; if fCancelled then exit; end; //do forward oscillation (keeping diag within assigned grid)... diag := Oscill; while diag > len1 do dec(diag,2); while diag >= max(- Oscill, -len2) do begin if fDiag[diag-1] < fDiag[diag+1] then x1 := fDiag[diag+1] else x1 := fDiag[diag-1]+1; x2 := x1 - diag; while (x1 < len1-1) and (x2 < len2-1) and (Chrs1[offset1+x1+1] = Chrs2[offset2+x2+1]) do begin inc(x1); inc(x2); end; fDiag[diag] := x1; //nb: (fDiag[diag] is always < bDiag[diag]) here when NOT odd(lenDelta) ... if odd(lenDelta) and (fDiag[diag] >= bDiag[diag]) then begin inc(x1);inc(x2); //save x1 & x2 for second recursive_diff() call by reusing no longer //needed variables (ie minimize variable allocation in recursive fn) ... diag := x1; Oscill := x2; while (x1 > 0) and (x2 > 0) and (Chrs1[offset1+x1-1] = Chrs2[offset2+x2-1]) do begin dec(x1); dec(x2); end; RecursiveDiffChr(offset1, offset2, x1, x2); x1 := diag; x2 := Oscill; RecursiveDiffChr(offset1+x1, offset2+x2, len1-x1, len2-x2); exit; //ALL DONE end; dec(diag,2); end; //do backward oscillation (keeping diag within assigned grid)... diag := lenDelta + Oscill; while diag > len1 do dec(diag,2); while diag >= max(lenDelta - Oscill, -len2) do begin if bDiag[diag-1] < bDiag[diag+1] then x1 := bDiag[diag-1] else x1 := bDiag[diag+1]-1; x2 := x1 - diag; while (x1 > -1) and (x2 > -1) and (Chrs1[offset1+x1] = Chrs2[offset2+x2]) do begin dec(x1); dec(x2); end; bDiag[diag] := x1; if bDiag[diag] <= fDiag[diag] then begin //flag return value then ... inc(x1);inc(x2); RecursiveDiffChr(offset1, offset2, x1, x2); while (x1 < len1) and (x2 < len2) and (Chrs1[offset1+x1] = Chrs2[offset2+x2]) do begin inc(x1); inc(x2); end; RecursiveDiffChr(offset1+x1, offset2+x2, len1-x1, len2-x2); exit; //ALL DONE end; dec(diag,2); end; inc(Oscill); end; //while Oscill <= maxOscill raise Exception.create('oops - error in RecursiveDiffChr()'); end; //------------------------------------------------------------------------------ procedure TDiff.RecursiveDiffInt(offset1, offset2, len1, len2: integer); var diag, lenDelta, Oscill, maxOscill, x1, x2: integer; begin //nb: the possible depth of recursion here is most unlikely to cause // problems with stack overflows. application.processmessages; if fCancelled then exit; if (len1 = 0) then begin assert(len2 > 0,'oops!'); AddChangeInts(offset1, len2, ckAdd); exit; end else if (len2 = 0) then begin AddChangeInts(offset1, len1, ckDelete); exit; end else if (len1 = 1) and (len2 = 1) then begin assert(Ints1[offset1] <> Ints2[offset2],'oops!'); AddChangeInts(offset1, 1, ckDelete); AddChangeInts(offset1, 1, ckAdd); exit; end; maxOscill := min(max(len1,len2), MAX_DIAGONAL); InitDiagArrays(MaxOscill, len1, len2); lenDelta := len1 -len2; Oscill := 1; //ie assumes prior filter of top and bottom matches while Oscill <= maxOscill do begin if (Oscill mod 200) = 0 then begin application.processmessages; if fCancelled then exit; end; //do forward oscillation (keeping diag within assigned grid)... diag := Oscill; while diag > len1 do dec(diag,2); while diag >= max(- Oscill, -len2) do begin if fDiag[diag-1] < fDiag[diag+1] then x1 := fDiag[diag+1] else x1 := fDiag[diag-1]+1; x2 := x1 - diag; while (x1 < len1-1) and (x2 < len2-1) and (Ints1[offset1+x1+1] = Ints2[offset2+x2+1]) do begin inc(x1); inc(x2); end; fDiag[diag] := x1; //nb: (fDiag[diag] is always < bDiag[diag]) here when NOT odd(lenDelta) ... if odd(lenDelta) and (fDiag[diag] >= bDiag[diag]) then begin inc(x1);inc(x2); //save x1 & x2 for second recursive_diff() call by reusing no longer //needed variables (ie minimize variable allocation in recursive fn) ... diag := x1; Oscill := x2; while (x1 > 0) and (x2 > 0) and (Ints1[offset1+x1-1] = Ints2[offset2+x2-1]) do begin dec(x1); dec(x2); end; RecursiveDiffInt(offset1, offset2, x1, x2); x1 := diag; x2 := Oscill; RecursiveDiffInt(offset1+x1, offset2+x2, len1-x1, len2-x2); exit; //ALL DONE end; dec(diag,2); end; //do backward oscillation (keeping diag within assigned grid)... diag := lenDelta + Oscill; while diag > len1 do dec(diag,2); while diag >= max(lenDelta - Oscill, -len2) do begin if bDiag[diag-1] < bDiag[diag+1] then x1 := bDiag[diag-1] else x1 := bDiag[diag+1]-1; x2 := x1 - diag; while (x1 > -1) and (x2 > -1) and (Ints1[offset1+x1] = Ints2[offset2+x2]) do begin dec(x1); dec(x2); end; bDiag[diag] := x1; if bDiag[diag] <= fDiag[diag] then begin //flag return value then ... inc(x1);inc(x2); RecursiveDiffInt(offset1, offset2, x1, x2); while (x1 < len1) and (x2 < len2) and (Ints1[offset1+x1] = Ints2[offset2+x2]) do begin inc(x1); inc(x2); end; RecursiveDiffInt(offset1+x1, offset2+x2, len1-x1, len2-x2); exit; //ALL DONE end; dec(diag,2); end; inc(Oscill); end; //while Oscill <= maxOscill raise Exception.create('oops - error in RecursiveDiffInt()'); end; //------------------------------------------------------------------------------ procedure TDiff.Clear; var i: integer; begin for i := 0 to fCompareList.Count-1 do dispose(PCompareRec(fCompareList[i])); fCompareList.clear; LastCompareRec.Kind := ckNone; LastCompareRec.oldIndex1 := -1; LastCompareRec.oldIndex2 := -1; fDiffStats.matches := 0; fDiffStats.adds := 0; fDiffStats.deletes :=0; fDiffStats.modifies :=0; Chrs1 := nil; Chrs2 := nil; Ints1 := nil; Ints2 := nil; end; //------------------------------------------------------------------------------ function TDiff.GetCompareCount: integer; begin result := fCompareList.count; end; //------------------------------------------------------------------------------ function TDiff.GetCompare(index: integer): TCompareRec; begin result := PCompareRec(fCompareList[index])^; end; //------------------------------------------------------------------------------ procedure TDiff.AddChangeChrs(offset1, range: integer; ChangeKind: TChangeKind); var i,j: integer; compareRec: PCompareRec; begin //first, add any unchanged items into this list ... while (LastCompareRec.oldIndex1 < offset1 -1) do begin with LastCompareRec do begin Kind := ckNone; inc(oldIndex1); inc(oldIndex2); chr1 := Chrs1[oldIndex1]; chr2 := Chrs2[oldIndex2]; end; New(compareRec); compareRec^ := LastCompareRec; fCompareList.Add(compareRec); inc(fDiffStats.matches); end; case ChangeKind of ckAdd : begin for i := 1 to range do begin with LastCompareRec do begin //check if a range of adds are following a range of deletes //and convert them to modifies ... if Kind = ckDelete then begin j := fCompareList.Count -1; while (j > 0) and (PCompareRec(fCompareList[j-1]).Kind = ckDelete) do dec(j); PCompareRec(fCompareList[j]).Kind := ckModify; dec(fDiffStats.deletes); inc(fDiffStats.modifies); inc(LastCompareRec.oldIndex2); PCompareRec(fCompareList[j]).oldIndex2 := LastCompareRec.oldIndex2; PCompareRec(fCompareList[j]).chr2 := Chrs2[oldIndex2]; if j = fCompareList.Count-1 then LastCompareRec.Kind := ckModify; continue; end; Kind := ckAdd; chr1 := #0; inc(oldIndex2); chr2 := Chrs2[oldIndex2]; //ie what we added end; New(compareRec); compareRec^ := LastCompareRec; fCompareList.Add(compareRec); inc(fDiffStats.adds); end; end; ckDelete : begin for i := 1 to range do begin with LastCompareRec do begin //check if a range of deletes are following a range of adds //and convert them to modifies ... if Kind = ckAdd then begin j := fCompareList.Count -1; while (j > 0) and (PCompareRec(fCompareList[j-1]).Kind = ckAdd) do dec(j); PCompareRec(fCompareList[j]).Kind := ckModify; dec(fDiffStats.adds); inc(fDiffStats.modifies); inc(LastCompareRec.oldIndex1); PCompareRec(fCompareList[j]).oldIndex1 := LastCompareRec.oldIndex1; PCompareRec(fCompareList[j]).chr1 := Chrs1[oldIndex1]; if j = fCompareList.Count-1 then LastCompareRec.Kind := ckModify; continue; end; Kind := ckDelete; chr2 := #0; inc(oldIndex1); chr1 := Chrs1[oldIndex1]; //ie what we deleted end; New(compareRec); compareRec^ := LastCompareRec; fCompareList.Add(compareRec); inc(fDiffStats.deletes); end; end; end; end; //------------------------------------------------------------------------------ procedure TDiff.AddChangeInts(offset1, range: integer; ChangeKind: TChangeKind); var i,j: integer; compareRec: PCompareRec; begin //first, add any unchanged items into this list ... while (LastCompareRec.oldIndex1 < offset1 -1) do begin with LastCompareRec do begin Kind := ckNone; inc(oldIndex1); inc(oldIndex2); int1 := Ints1[oldIndex1]; int2 := Ints2[oldIndex2]; end; New(compareRec); compareRec^ := LastCompareRec; fCompareList.Add(compareRec); inc(fDiffStats.matches); end; case ChangeKind of ckAdd : begin for i := 1 to range do begin with LastCompareRec do begin //check if a range of adds are following a range of deletes //and convert them to modifies ... if Kind = ckDelete then begin j := fCompareList.Count -1; while (j > 0) and (PCompareRec(fCompareList[j-1]).Kind = ckDelete) do dec(j); PCompareRec(fCompareList[j]).Kind := ckModify; dec(fDiffStats.deletes); inc(fDiffStats.modifies); inc(LastCompareRec.oldIndex2); PCompareRec(fCompareList[j]).oldIndex2 := LastCompareRec.oldIndex2; PCompareRec(fCompareList[j]).int2 := Ints2[oldIndex2]; if j = fCompareList.Count-1 then LastCompareRec.Kind := ckModify; continue; end; Kind := ckAdd; int1 := $0; inc(oldIndex2); int2 := Ints2[oldIndex2]; //ie what we added end; New(compareRec); compareRec^ := LastCompareRec; fCompareList.Add(compareRec); inc(fDiffStats.adds); end; end; ckDelete : begin for i := 1 to range do begin with LastCompareRec do begin //check if a range of deletes are following a range of adds //and convert them to modifies ... if Kind = ckAdd then begin j := fCompareList.Count -1; while (j > 0) and (PCompareRec(fCompareList[j-1]).Kind = ckAdd) do dec(j); PCompareRec(fCompareList[j]).Kind := ckModify; dec(fDiffStats.adds); inc(fDiffStats.modifies); inc(LastCompareRec.oldIndex1); PCompareRec(fCompareList[j]).oldIndex1 := LastCompareRec.oldIndex1; PCompareRec(fCompareList[j]).int1 := Ints1[oldIndex1]; if j = fCompareList.Count-1 then LastCompareRec.Kind := ckModify; continue; end; Kind := ckDelete; int2 := $0; inc(oldIndex1); int1 := Ints1[oldIndex1]; //ie what we deleted end; New(compareRec); compareRec^ := LastCompareRec; fCompareList.Add(compareRec); inc(fDiffStats.deletes); end; end; end; end; //------------------------------------------------------------------------------ procedure TDiff.Cancel; begin fCancelled := true; end; //------------------------------------------------------------------------------ end. doublecmd-0.5.8/src/ffileproperties.lfm0000644000175000017500000005014712023046500017176 0ustar alexxalexxobject frmFileProperties: TfrmFileProperties Left = 309 Height = 469 Top = 101 Width = 520 ActiveControl = pcPageControl Caption = 'Properties' ClientHeight = 469 ClientWidth = 520 Constraints.MinHeight = 432 Constraints.MinWidth = 458 KeyPreview = True OnCreate = FormCreate OnKeyDown = FormKeyDown Position = poScreenCenter LCLVersion = '1.1' object pcPageControl: TPageControl AnchorSideBottom.Control = gbOwner Left = 8 Height = 281 Top = 8 Width = 502 ActivePage = tsProperties Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Bottom = 6 TabIndex = 0 TabOrder = 0 object tsProperties: TTabSheet Caption = 'Properties' ClientHeight = 242 ClientWidth = 496 object pnlData: TPanel AnchorSideLeft.Control = pnlCaption AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = tsProperties AnchorSideRight.Control = tsProperties AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = tsProperties AnchorSideBottom.Side = asrBottom Left = 147 Height = 242 Top = 0 Width = 349 Anchors = [akTop, akLeft, akRight, akBottom] BevelOuter = bvNone ClientHeight = 242 ClientWidth = 349 TabOrder = 1 object lblFileName: TLabel AnchorSideLeft.Control = pnlData AnchorSideTop.Control = pnlData AnchorSideRight.Control = pnlData AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 12 Width = 329 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Top = 12 BorderSpacing.Right = 10 Caption = '???' ParentColor = False ShowAccelChar = False end object lblFolder: TLabel AnchorSideLeft.Control = lblFileName AnchorSideTop.Control = lblFileName AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblFileName AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 36 Width = 329 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = '???' ParentColor = False ShowAccelChar = False end object lblType: TLabel AnchorSideLeft.Control = lblFileName AnchorSideTop.Control = lblFolder AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblFileName AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 60 Width = 329 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = '???' ParentColor = False ShowAccelChar = False end object lblSymlink: TLabel AnchorSideLeft.Control = lblFileName AnchorSideTop.Control = lblType AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblFileName AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 84 Width = 329 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = '???' ParentColor = False ShowAccelChar = False end object lblSize: TLabel AnchorSideLeft.Control = lblFileName AnchorSideTop.Control = lblSymlink AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblFileName AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 108 Width = 329 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = '???' ParentColor = False ShowAccelChar = False end object lblLastAccess: TLabel AnchorSideLeft.Control = lblFileName AnchorSideTop.Control = lblContains AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblFileName AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 162 Width = 329 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 12 Caption = '???' ParentColor = False ShowAccelChar = False end object lblLastModif: TLabel AnchorSideLeft.Control = lblFileName AnchorSideTop.Control = lblLastAccess AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblFileName AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 186 Width = 329 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = '???' ParentColor = False ShowAccelChar = False end object lblLastStChange: TLabel AnchorSideLeft.Control = lblFileName AnchorSideTop.Control = lblLastModif AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblFileName AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 210 Width = 329 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = '???' ParentColor = False ShowAccelChar = False end object lblContains: TLabel AnchorSideLeft.Control = lblFileName AnchorSideTop.Control = lblSize AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblFileName AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 132 Width = 329 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = '???' ParentColor = False ShowAccelChar = False end end object pnlCaption: TPanel AnchorSideLeft.Control = tsProperties AnchorSideTop.Control = tsProperties AnchorSideBottom.Control = tsProperties AnchorSideBottom.Side = asrBottom Left = 0 Height = 242 Top = 0 Width = 147 Anchors = [akTop, akLeft, akBottom] AutoSize = True BevelOuter = bvNone ChildSizing.LeftRightSpacing = 10 ChildSizing.TopBottomSpacing = 10 ClientHeight = 242 ClientWidth = 147 TabOrder = 0 object lblFileNameStr: TLabel AnchorSideTop.Control = pnlCaption Left = 10 Height = 18 Top = 12 Width = 41 BorderSpacing.Top = 12 Caption = 'Name:' Font.Color = clBlack ParentColor = False ParentFont = False end object lblFolderStr: TLabel AnchorSideTop.Control = lblFileNameStr AnchorSideTop.Side = asrBottom Left = 10 Height = 18 Top = 36 Width = 34 BorderSpacing.Top = 6 Caption = 'Path:' ParentColor = False end object lblTypeStr: TLabel AnchorSideTop.Control = lblFolderStr AnchorSideTop.Side = asrBottom Left = 10 Height = 18 Top = 60 Width = 36 BorderSpacing.Top = 6 Caption = 'Type:' ParentColor = False end object lblSymlinkStr: TLabel AnchorSideTop.Control = lblTypeStr AnchorSideTop.Side = asrBottom Left = 10 Height = 18 Top = 84 Width = 72 BorderSpacing.Top = 6 Caption = 'Symlink to:' ParentColor = False end object lblSizeStr: TLabel AnchorSideTop.Control = lblSymlinkStr AnchorSideTop.Side = asrBottom Left = 10 Height = 18 Top = 108 Width = 32 BorderSpacing.Top = 6 Caption = 'Size:' ParentColor = False end object lblLastAccessStr: TLabel AnchorSideTop.Control = lblContainsStr AnchorSideTop.Side = asrBottom Left = 10 Height = 18 Top = 162 Width = 79 BorderSpacing.Top = 12 Caption = 'Last access:' ParentColor = False end object lblLastModifStr: TLabel AnchorSideTop.Control = lblLastAccessStr AnchorSideTop.Side = asrBottom Left = 10 Height = 18 Top = 186 Width = 113 BorderSpacing.Top = 6 Caption = 'Last modification:' ParentColor = False end object lblLastStChangeStr: TLabel AnchorSideTop.Control = lblLastModifStr AnchorSideTop.Side = asrBottom Left = 10 Height = 18 Top = 210 Width = 127 BorderSpacing.Top = 6 Caption = 'Last status change:' ParentColor = False end object lblContainsStr: TLabel AnchorSideTop.Control = lblSizeStr AnchorSideTop.Side = asrBottom Left = 10 Height = 18 Top = 132 Width = 61 BorderSpacing.Top = 6 Caption = 'Contains:' ParentColor = False end end end object tsAttributes: TTabSheet Caption = 'Attributes' ClientHeight = 242 ClientWidth = 496 object lblFileStr: TLabel AnchorSideTop.Control = tsAttributes Left = 8 Height = 18 Top = 12 Width = 62 BorderSpacing.Top = 12 Caption = 'File name' ParentColor = False end object lblFile: TLabel AnchorSideTop.Control = tsAttributes Left = 104 Height = 18 Top = 12 Width = 62 BorderSpacing.Top = 12 Caption = 'File name' Font.Color = clBlack ParentColor = False ParentFont = False end object lblAttrOwnerStr: TLabel AnchorSideTop.Control = cbReadOwner AnchorSideTop.Side = asrCenter Left = 8 Height = 18 Top = 63 Width = 46 Caption = 'Owner' ParentColor = False end object lblWrite: TLabel AnchorSideTop.Control = lblFile AnchorSideTop.Side = asrBottom Left = 176 Height = 18 Top = 38 Width = 38 BorderSpacing.Top = 8 Caption = 'Write' ParentColor = False end object lblRead: TLabel AnchorSideTop.Control = lblFile AnchorSideTop.Side = asrBottom Left = 104 Height = 18 Top = 38 Width = 32 BorderSpacing.Top = 8 Caption = 'Read' ParentColor = False end object lblExec: TLabel AnchorSideTop.Control = lblFile AnchorSideTop.Side = asrBottom Left = 240 Height = 18 Top = 38 Width = 53 BorderSpacing.Top = 8 Caption = 'Execute' ParentColor = False end object lblAttrGroupStr: TLabel AnchorSideTop.Control = cbReadGroup AnchorSideTop.Side = asrCenter Left = 8 Height = 18 Top = 89 Width = 41 Caption = 'Group' ParentColor = False end object lblAttrOtherStr: TLabel AnchorSideTop.Control = cbReadOther AnchorSideTop.Side = asrCenter Left = 8 Height = 18 Top = 115 Width = 40 Caption = 'Other' ParentColor = False end object lblAttrTextStr: TLabel AnchorSideLeft.Control = tsAttributes AnchorSideTop.Control = edtOctal AnchorSideTop.Side = asrBottom Left = 8 Height = 18 Top = 203 Width = 35 BorderSpacing.Left = 8 BorderSpacing.Top = 6 Caption = 'Text:' ParentColor = False end object lblAttrText: TLabel AnchorSideLeft.Control = edtOctal AnchorSideTop.Control = lblAttrTextStr AnchorSideTop.Side = asrCenter Left = 112 Height = 18 Top = 203 Width = 55 Caption = '-----------' Font.Color = clBlack ParentColor = False ParentFont = False end object lblAttrBitsStr: TLabel AnchorSideTop.Control = cbSuid AnchorSideTop.Side = asrCenter Left = 8 Height = 18 Top = 142 Width = 29 Caption = 'Bits:' ParentColor = False end object lblOctal: TLabel AnchorSideLeft.Control = tsAttributes AnchorSideTop.Control = edtOctal AnchorSideTop.Side = asrCenter Left = 8 Height = 18 Top = 174 Width = 41 BorderSpacing.Left = 8 Caption = 'Octal:' FocusControl = edtOctal ParentColor = False end object cbReadOwner: TCheckBox AnchorSideTop.Control = lblRead AnchorSideTop.Side = asrBottom Left = 112 Height = 20 Top = 62 Width = 20 BorderSpacing.Top = 6 OnClick = cbChangeModeClick TabOrder = 0 end object cbWriteOwner: TCheckBox AnchorSideTop.Control = lblWrite AnchorSideTop.Side = asrBottom Left = 184 Height = 20 Top = 62 Width = 20 BorderSpacing.Top = 6 OnClick = cbChangeModeClick TabOrder = 1 end object cbExecOwner: TCheckBox AnchorSideTop.Control = lblExec AnchorSideTop.Side = asrBottom Left = 256 Height = 20 Top = 62 Width = 20 BorderSpacing.Top = 6 OnClick = cbChangeModeClick TabOrder = 2 end object cbReadGroup: TCheckBox AnchorSideTop.Control = cbReadOwner AnchorSideTop.Side = asrBottom Left = 112 Height = 20 Top = 88 Width = 20 BorderSpacing.Top = 6 OnClick = cbChangeModeClick TabOrder = 3 end object cbWriteGroup: TCheckBox AnchorSideTop.Control = cbWriteOwner AnchorSideTop.Side = asrBottom Left = 184 Height = 20 Top = 88 Width = 20 BorderSpacing.Top = 6 OnClick = cbChangeModeClick TabOrder = 4 end object cbExecGroup: TCheckBox AnchorSideTop.Control = cbExecOwner AnchorSideTop.Side = asrBottom Left = 256 Height = 20 Top = 88 Width = 20 BorderSpacing.Top = 6 OnClick = cbChangeModeClick TabOrder = 5 end object cbReadOther: TCheckBox AnchorSideTop.Control = cbReadGroup AnchorSideTop.Side = asrBottom Left = 112 Height = 20 Top = 114 Width = 20 BorderSpacing.Top = 6 OnClick = cbChangeModeClick TabOrder = 6 end object cbWriteOther: TCheckBox AnchorSideTop.Control = cbWriteGroup AnchorSideTop.Side = asrBottom Left = 184 Height = 20 Top = 114 Width = 20 BorderSpacing.Top = 6 OnClick = cbChangeModeClick TabOrder = 7 end object cbExecOther: TCheckBox AnchorSideTop.Control = cbReadGroup AnchorSideTop.Side = asrBottom Left = 256 Height = 20 Top = 114 Width = 20 BorderSpacing.Top = 6 OnClick = cbChangeModeClick TabOrder = 8 end object cbSuid: TCheckBox AnchorSideTop.Control = cbReadOther AnchorSideTop.Side = asrBottom Left = 112 Height = 23 Top = 140 Width = 57 BorderSpacing.Top = 6 Caption = 'SUID' OnClick = cbChangeModeClick TabOrder = 9 end object cbSgid: TCheckBox AnchorSideTop.Control = cbWriteOther AnchorSideTop.Side = asrBottom Left = 184 Height = 23 Top = 140 Width = 58 BorderSpacing.Top = 6 Caption = 'SGID' OnClick = cbChangeModeClick TabOrder = 10 end object cbSticky: TCheckBox AnchorSideTop.Control = cbExecOther AnchorSideTop.Side = asrBottom Left = 256 Height = 23 Top = 140 Width = 61 BorderSpacing.Top = 6 Caption = 'Sticky' OnClick = cbChangeModeClick TabOrder = 11 end object edtOctal: TEdit AnchorSideLeft.Control = cbSuid AnchorSideTop.Control = cbSuid AnchorSideTop.Side = asrBottom Left = 112 Height = 28 Top = 169 Width = 80 BorderSpacing.Top = 6 MaxLength = 4 OnKeyPress = edtOctalKeyPress OnKeyUp = edtOctalKeyUp TabOrder = 12 end end end object gbOwner: TGroupBox AnchorSideBottom.Control = btnSetProperties Left = 8 Height = 95 Top = 295 Width = 502 Anchors = [akLeft, akRight, akBottom] AutoSize = True BorderSpacing.Bottom = 6 Caption = 'Owner' ClientHeight = 72 ClientWidth = 498 TabOrder = 1 object lblOwnerStr: TLabel AnchorSideLeft.Control = gbOwner AnchorSideTop.Control = cbxUsers AnchorSideTop.Side = asrCenter Left = 24 Height = 18 Top = 11 Width = 46 BorderSpacing.Left = 24 Caption = 'O&wner' FocusControl = cbxUsers ParentColor = False end object lblGroupStr: TLabel AnchorSideLeft.Control = gbOwner AnchorSideTop.Control = cbxGroups AnchorSideTop.Side = asrCenter Left = 24 Height = 18 Top = 43 Width = 41 BorderSpacing.Left = 24 Caption = '&Group' FocusControl = cbxGroups ParentColor = False end object cbxUsers: TComboBox AnchorSideTop.Control = gbOwner Left = 135 Height = 28 Top = 6 Width = 289 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 ItemHeight = 0 Sorted = True TabOrder = 0 end object cbxGroups: TComboBox AnchorSideTop.Control = cbxUsers AnchorSideTop.Side = asrBottom Left = 135 Height = 28 Top = 38 Width = 289 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 4 BorderSpacing.Bottom = 6 ItemHeight = 0 Sorted = True TabOrder = 1 end end object btnSetProperties: TBitBtn AnchorSideRight.Control = btnSetPropertiesToAllFiles AnchorSideBottom.Control = btnSetPropertiesToAllFiles AnchorSideBottom.Side = asrBottom Left = 67 Height = 31 Top = 396 Width = 128 Anchors = [akRight, akBottom] AutoSize = True BorderSpacing.Right = 6 Caption = '&Set properties' Default = True Kind = bkOK OnClick = btnSetPropertiesClick TabOrder = 2 end object btnSetPropertiesToAllFiles: TBitBtn AnchorSideRight.Control = btnSkipFile AnchorSideBottom.Control = btnSkipFile AnchorSideBottom.Side = asrBottom Left = 201 Height = 31 Top = 396 Width = 188 Anchors = [akRight, akBottom] AutoSize = True BorderSpacing.Right = 6 Caption = 'Set to &all selected files' Kind = bkAll OnClick = btnSetPropertiesToAllFilesClick TabOrder = 3 end object btnSkipFile: TBitBtn AnchorSideRight.Control = btnClose AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = btnClose Left = 395 Height = 32 Top = 395 Width = 115 Anchors = [akRight, akBottom] AutoSize = True BorderSpacing.Bottom = 4 Caption = 'Ski&p this file' Kind = bkIgnore ModalResult = 5 OnClick = btnSkipFileClick TabOrder = 4 end object btnClose: TBitBtn AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 437 Height = 32 Top = 431 Width = 73 Anchors = [akRight, akBottom] AutoSize = True BorderSpacing.Right = 10 BorderSpacing.Bottom = 6 Cancel = True Caption = '&Close' Kind = bkClose ModalResult = 2 OnClick = btnCloseClick TabOrder = 5 end object tmUpdateFolderSize: TTimer Enabled = False Interval = 500 OnTimer = tmUpdateFolderSizeTimer left = 350 top = 216 end end doublecmd-0.5.8/src/ushellexecute.pas0000644000175000017500000003766312034100460016666 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- This unit contains some functions for open files in associated applications. Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uShellExecute; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFile, uFileView; type TPrepareParameterOption = (ppoNormalizePathDelims, ppoReplaceTilde); TPrepareParameterOptions = set of TPrepareParameterOption; function PrepareParameter(sParam: String; leftPanel: TFileView; rightPanel: TFileView; activePanel: TFileView; options: TPrepareParameterOptions = []): String; overload; function PrepareParameter(sParam: String; aFile: TFile; options: TPrepareParameterOptions = []): String; overload; {en Replace variable parameters that depend on files in panels. } function ReplaceVarParams(sSourceStr: String; leftPanel: TFileView; rightPanel: TFileView; activePanel: TFileView): String; overload; {en Replace variable parameters that depend on the file in active dir. } function ReplaceVarParams(sSourceStr: String; aFile: TFile): String; overload; function ProcessExtCommand(sCmd:String; ActiveDir: String): Boolean; function ShellExecuteEx(sCmd, sFileName, sActiveDir: String): Boolean; implementation uses Process, UTF8Process, uDCUtils, uShowForm, uGlobs, uOSUtils, uFileSystemFileSource, DCOSUtils, DCStrUtils; function PrepareParameter(sParam: String; leftPanel: TFileView; rightPanel: TFileView; activePanel: TFileView; options: TPrepareParameterOptions = []): String; begin Result := sParam; if ppoNormalizePathDelims in Options then Result := NormalizePathDelimiters(Result); if ppoReplaceTilde in Options then Result := ReplaceTilde(Result); Result := ReplaceEnvVars(Result); Result := ReplaceVarParams(Result, leftPanel, rightPanel, activePanel); Result := Trim(Result); end; function PrepareParameter(sParam: String; aFile: TFile; options: TPrepareParameterOptions = []): String; begin Result := sParam; if ppoNormalizePathDelims in Options then Result := NormalizePathDelimiters(Result); if ppoReplaceTilde in Options then Result := ReplaceTilde(Result); Result := ReplaceEnvVars(Result); Result := ReplaceVarParams(Result, aFile); Result := Trim(Result); end; (* Functions (without parameters they give output for all selected files): %f - only filename %d - only path, without trailing delimiter %p - path+filename %D - current path in active or chosen panel Choosing panel (if not given, active panel is used): %X[l|r|s|t] - where X is function (l - left, r - right, s - source, t - target) Choosing selected files (only for %f, %d, %p): %X[] - where X is function is 1..n, where n is number of selected files. If there are no selected files, currently active file is nr 1. If is invalid or there is no selected file by that number the result for the whole function will be empty string. Adding prefix, postfix before or after the result string: %X[{}][{}] If applied to multiple files, each name is prefixed/postfixed. Above parameters can be combined together. Order of params: - %function - left or right or source or target panel (optional) - nr of file (optional) - prefix, postfix (optional) Examples: %f1 - first selected file in active panel %pr2 - full path of second selected file in right panel %fl - only filenames from left panel %pr - full filenames from right panel %Dl - current path in left panel %f{-f } - prepend each name with "-f " (ex.: -f -f ) %f{"}{"} - enclose each name in quotes (ex.: "" "") %f1{-first }%f2{ -second } - if only 1 file selected : -first - if 2 (or more) files selected: -first -second *) function ReplaceVarParams(sSourceStr: String; leftPanel: TFileView; rightPanel: TFileView; activePanel: TFileView): String; type TFunctType = (ftNone, ftName, ftDir, ftPath, ftSingleDir); TStatePos = (spNone, spPercent, spFunction, spPrefix, spPostfix, spGotPrefix, spSide, spIndex, spComplete); Tstate = record pos: TStatePos; functStartIndex: Integer; funct: TFunctType; files: TFiles; dir: String; sFileIndex: String; prefix, postfix: String; // a string to add before/after each output // (for functions giving output of multiple strings) end; var index: Integer; leftFiles: TFiles = nil; rightFiles: TFiles = nil; activeFiles: TFiles; inactiveFiles: TFiles; activeDir: String; inactiveDir: String; state: Tstate; sOutput: String = ''; parseStartIndex: Integer; function BuildName(aFile: TFile): String; begin case state.funct of ftName: Result := aFile.Name; ftDir: Result := ExcludeTrailingPathDelimiter(aFile.Path); ftPath: Result := aFile.FullPath; ftSingleDir: Result := ExcludeTrailingPathDelimiter(state.dir); else Exit(''); end; Result := state.prefix + QuoteStr(Result) + state.postfix; end; function BuildAllNames: String; var i: Integer; begin Result := ''; if Assigned(state.files) then begin for i := 0 to state.files.Count - 1 do begin if i > 0 then Result := Result + ' '; Result := Result + BuildName(state.files[i]); end; end; end; procedure ResetState(var aState: TState); begin with aState do begin pos := spNone; files := activeFiles; dir := activeDir; sFileIndex := ''; funct := ftNone; functStartIndex := 0; prefix := ''; postfix := ''; end; end; procedure AddParsedText(limit: Integer); begin // Copy [parseStartIndex .. limit - 1]. if limit > parseStartIndex then sOutput := sOutput + Copy(sSourceStr, parseStartIndex, limit - parseStartIndex); parseStartIndex := index; end; procedure DoFunction; var fileIndex: Integer = -1; begin AddParsedText(state.functStartIndex); if state.sFileIndex <> '' then try fileIndex := StrToInt(state.sFileIndex); fileIndex := fileIndex - 1; // Files are counted from 0, but user enters 1..n. except on EConvertError do fileIndex := -1; end; if fileIndex <> -1 then begin if Assigned(state.files) and (fileIndex >= 0) and (fileIndex < state.files.Count) then sOutput := sOutput + BuildName(state.files[fileIndex]); end else begin if state.funct in [ftName, ftPath, ftDir] then sOutput := sOutput + BuildAllNames else if state.funct in [ftSingleDir] then // only single current dir sOutput := sOutput + BuildName(nil); end; ResetState(state); end; procedure ProcessNumber; begin if state.funct = ftSingleDir then // Numbers not allowed for %D state.pos := spComplete else begin state.sFileIndex := state.sFileIndex + sSourceStr[index]; state.pos := spIndex; end; end; procedure ProcessOpenBracket; // '{' begin if state.pos <> spGotPrefix then state.pos := spPrefix else state.pos := spPostfix; end; begin try leftFiles := leftPanel.CloneSelectedOrActiveFiles; rightFiles := rightPanel.CloneSelectedOrActiveFiles; if activePanel = leftPanel then begin activeFiles := leftFiles; activeDir := leftPanel.CurrentPath; inactiveFiles := rightFiles; inactiveDir := rightPanel.CurrentPath; end else begin activeFiles := rightFiles; activeDir := rightPanel.CurrentPath; inactiveFiles := leftFiles; inactiveDir := leftPanel.CurrentPath; end; index := 1; parseStartIndex := index; ResetState(state); while index <= Length(sSourceStr) do begin case state.pos of spNone: if sSourceStr[index] = '%' then begin state.pos := spPercent; state.functStartIndex := index; end; spPercent: case sSourceStr[index] of 'f': begin state.funct := ftName; state.pos := spFunction; end; 'd': begin state.funct := ftDir; state.pos := spFunction; end; 'D': begin state.funct := ftSingleDir; state.pos := spFunction; end; 'p': begin state.funct := ftPath; state.pos := spFunction; end; else ResetState(state); end; spFunction: case sSourceStr[index] of 'l': begin state.files := leftFiles; state.dir := leftpanel.CurrentPath; state.pos := spSide; end; 'r': begin state.files := rightFiles; state.dir := rightPanel.CurrentPath; state.pos := spSide; end; 's': begin state.files := activeFiles; state.dir := activeDir; state.pos := spSide; end; 't': begin state.files := inactiveFiles; state.dir := inactiveDir; state.pos := spSide; end; '0'..'9': ProcessNumber; '{': ProcessOpenBracket; else state.pos := spComplete; end; spSide: case sSourceStr[index] of '0'..'9': ProcessNumber; '{': ProcessOpenBracket; else state.pos := spComplete; end; spIndex: case sSourceStr[index] of '0'..'9': ProcessNumber; '{': ProcessOpenBracket; else state.pos := spComplete; end; spPrefix, spPostfix: case sSourceStr[index] of '}': begin if state.pos = spPostfix then begin Inc(index); // include closing bracket in the function state.pos := spComplete; end else state.pos := spGotPrefix; end; else begin case state.pos of spPrefix: state.prefix := state.prefix + sSourceStr[index]; spPostfix: state.postfix := state.postfix + sSourceStr[index]; end; end; end; spGotPrefix: case sSourceStr[index] of '{': ProcessOpenBracket; else state.pos := spComplete; end; end; if state.pos <> spComplete then Inc(index) // check next character else // Process function and then check current character again after resetting state. DoFunction; end; // Finish current parse. if state.pos in [spFunction, spSide, spIndex, spGotPrefix] then DoFunction else AddParsedText(index); Result := sOutput; finally if Assigned(leftFiles) then FreeAndNil(leftFiles); if Assigned(rightFiles) then FreeAndNil(rightFiles); end; end; function ReplaceVarParams(sSourceStr: String; aFile: TFile): String; begin Result := StringReplace(sSourceStr,'%f',QuoteStr(aFile.Name),[rfReplaceAll]); Result := StringReplace(Result ,'%d',QuoteStr(aFile.Path),[rfReplaceAll]); Result := StringReplace(Result ,'%p',QuoteStr(aFile.FullPath),[rfReplaceAll]); end; function ProcessExtCommand(sCmd:String; ActiveDir: String): Boolean; var bTerm: Boolean; sTmpFile, sCmdLine: String; iStart, iCount: Integer; Process: TProcessUTF8; begin Result:= False; bTerm:= False; (* Check for command. This command is used to put output of some console program to a file so that the file can then be viewed. The command is between ''. The whole expression is replaced with a path to the temporary file containing output of the command. For example: {!VIEWER} Show in Viewer information about RPM package *) if Pos(' 0 then begin iStart:= Pos('', sCmd) - iStart; sTmpFile := GetTempName(GetTempFolder) + '.tmp'; sCmdLine := Copy(sCmd, iStart, iCount) + ' > ' + QuoteStr(sTmpFile); Process:= TProcessUTF8.Create(nil); try Process.CommandLine:= FormatShell(sCmdLine); Process.Options:= [poNoConsole, poWaitOnExit]; Process.Execute; finally Process.Free; end; sCmd:= Copy(sCmd, 1, iStart-3) + sTmpFile + Copy(sCmd, iStart + iCount + 2, MaxInt); end; if Pos('{!SHELL}', sCmd) > 0 then begin sCmd:= Trim(StringReplace(sCmd,'{!SHELL}','',[rfReplaceAll])); bTerm:= True; end; if Pos('{!EDITOR}',sCmd) > 0 then begin sCmd:= Trim(StringReplace(sCmd,'{!EDITOR}','',[rfReplaceAll])); uShowForm.ShowEditorByGlob(RemoveQuotation(sCmd)); Result:= True; Exit; end; if Pos('{!VIEWER}',sCmd) > 0 then begin sCmd:= Trim(StringReplace(sCmd,'{!VIEWER}','',[rfReplaceAll])); uShowForm.ShowViewerByGlob(RemoveQuotation(sCmd)); Result:= True; Exit; end; mbSetCurrentDir(ActiveDir); Result:= ExecCmdFork(sCmd, bTerm, gRunInTerm); end; function ShellExecuteEx(sCmd, sFileName, sActiveDir: String): Boolean; var aFile: TFile; sCommand: String; begin Result:= False; // Executing files directly only works for FileSystem. aFile := TFileSystemFileSource.CreateFileFromFile(sFileName); try sCommand:= gExts.GetExtActionCmd(aFile, sCmd); if sCommand <> '' then begin sCommand := PrepareParameter(sCommand, aFile); Result:= ProcessExtCommand(sCommand, sActiveDir); end; if not Result then begin mbSetCurrentDir(sActiveDir); Result:= ShellExecute(sFileName); end; finally FreeAndNil(aFile); end; end; end. doublecmd-0.5.8/src/fpackinfodlg.pas0000644000175000017500000001273111736421532016441 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Packed file information window Copyright (C) 2008-2010 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fPackInfoDlg; {$mode objfpc}{$H+} interface uses SysUtils, Classes, Forms, StdCtrls, ExtCtrls, Controls, uFile, uArchiveFileSource, uFileSourceExecuteOperation; type { TfrmPackInfoDlg } TfrmPackInfoDlg = class(TForm) Bevel1: TBevel; Bevel2: TBevel; btnClose: TButton; btnUnpackAllAndExec: TButton; btnUnpackAndExec: TButton; lblAttributes: TLabel; lblCompressionRatio: TLabel; lblDate: TLabel; lblMethod: TLabel; lblOriginalSize: TLabel; lblPackedFile: TLabel; lblPackedSize: TLabel; lblPacker: TLabel; lblTime: TLabel; lblPackedAttr: TLabel; lblPackedCompression: TLabel; lblPackedDate: TLabel; edtPackedFile: TEdit; lblPackedMethod: TLabel; lblPackedOrgSize: TLabel; lblPackedPackedSize: TLabel; lblPackedPacker: TLabel; lblPackedTime: TLabel; pnlInfoProperties: TPanel; pnlInfoFile: TPanel; pnlInfo: TPanel; pnlButtons: TPanel; procedure btnCloseKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); private { private declarations } public constructor Create(TheOwner: TComponent; aFileSource: IArchiveFileSource; aFile: TFile); reintroduce; end; function ShowPackInfoDlg(aFileSource: IArchiveFileSource; aFile: TFile): TFileSourceExecuteOperationResult; implementation {$R *.lfm} uses {$IF DEFINED(LCLGTK2)} LCLType, LCLVersion, {$ENDIF} uFileSourceOperationTypes; function ShowPackInfoDlg(aFileSource: IArchiveFileSource; aFile: TFile): TFileSourceExecuteOperationResult; begin Result:= fseorSuccess; with TfrmPackInfoDlg.Create(Application, aFileSource, aFile) do begin case ShowModal of mrCancel: Result:= fseorCancelled; mrOK: Result:= fseorYourSelf; mrAll: Result:= fseorWithAll; end; Free; end; end; { TfrmPackInfoDlg } procedure TfrmPackInfoDlg.btnCloseKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin {$IF DEFINED(LCLGTK2) and (lcl_fullversion < 093100)} if Key = VK_RETURN then // Lazarus issue 0021483. ControlKeyUp not called after Enter pressed. Application.ControlKeyUp(btnClose, Key, Shift); {$ENDIF} end; constructor TfrmPackInfoDlg.Create(TheOwner: TComponent; aFileSource: IArchiveFileSource; aFile: TFile); var sArcType: String; upperInfoControls: array[0..4] of TControl; i: Integer; foundDividingControl: Boolean = False; begin inherited Create(TheOwner); btnUnpackAndExec.Enabled:= (fsoCopyOut in aFileSource.GetOperationsTypes); btnUnpackAllAndExec.Enabled:= ([fsoList, fsoCopyOut] * aFileSource.GetOperationsTypes = [fsoList, fsoCopyOut]); edtPackedFile.Text:= aFile.FullPath; sArcType:= ExtractFileExt(aFileSource.ArchiveFileName); Delete(sArcType, 1, 1); lblPackedPacker.Caption:= sArcType; lblPackedOrgSize.Visible := not aFile.IsDirectory; lblPackedPackedSize.Visible := not aFile.IsDirectory; lblPackedCompression.Visible := False; lblPackedMethod.Visible := False; if not aFile.IsDirectory then begin lblPackedOrgSize.Caption := IntToStr(aFile.Size); lblPackedPackedSize.Caption := IntToStr(aFile.CompressedSize); if aFile.Size > 0 then begin lblPackedCompression.Caption := IntToStr(100 - (aFile.CompressedSize * 100 div aFile.Size)) + '%'; lblPackedCompression.Visible := True; end; end; // DateTime and Attributes lblPackedDate.Caption:= DateToStr(aFile.ModificationTime); lblPackedTime.Caption:= TimeToStr(aFile.ModificationTime); lblPackedAttr.Caption:= aFile.AttributesProperty.AsString; // Hide labels for not visible values. lblOriginalSize.Visible := lblPackedOrgSize.Visible; lblPackedSize.Visible := lblPackedPackedSize.Visible; lblCompressionRatio.Visible := lblPackedCompression.Visible; lblMethod.Visible := lblPackedMethod.Visible; // Controls from the dividing line to top. upperInfoControls[0] := lblMethod; upperInfoControls[1] := lblCompressionRatio; upperInfoControls[2] := lblPackedSize; upperInfoControls[3] := lblOriginalSize; upperInfoControls[4] := lblPacker; // Make space for the dividing line. for i := Low(upperInfoControls) to High(upperInfoControls) do begin if foundDividingControl then upperInfoControls[i].BorderSpacing.Bottom := 0 else if upperInfoControls[i].Visible then begin foundDividingControl := True; upperInfoControls[i].BorderSpacing.Bottom := 12; end; end; end; end. doublecmd-0.5.8/src/dmcommondata.lfm0000644000175000017500000002153312045446211016443 0ustar alexxalexxobject dmComData: TdmComData OldCreateOrder = False Height = 300 HorizontalOffset = 294 VerticalOffset = 172 Width = 400 object OpenDialog: TOpenDialog FilterIndex = 0 left = 65 top = 72 end object SaveDialog: TSaveDialog FilterIndex = 0 left = 65 top = 104 end object ImageList: TImageList Height = 22 Width = 22 left = 104 top = 72 Bitmap = { 4C69020000001600000016000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000001A0000001F0000000CFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0000000026454947783232324C0000001C00000007FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF0000000026555957F85B5F5DF8535654AE202020370000001800000004FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000026555A 57F8F7F8F7FFB0B4B2FC585B59F4494C4A87060606270000001300000001FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000026555A57F8FFFFFFFFFAFB FAFFF2F3F2FF909491F7585B5AE73B403D63000000220000000EFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0000000026555A57F8FFFFFFFFE6EAE8FFF0F2F1FFFCFC FCFFE3E6E5FF727673F6575A59CA2B2F2F460000001F0000000AFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF0000000026555A57F8FFFFFFFFE6EAE8FFE6EAE8FFE7EBE9FFF3F5F4FFFCFC FCFFCFD1CFFE5E6261F6515452A5191919330000001A00000006FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0008080825555A 57F8FFFFFFFFE6EAE8FFE6EAE8FFE7EAE9FFE7EBE9FFEAEDEBFFF6F8F7FFFAFA FAFFB2B6B3FA585C59F2484C4A7E131313260D0D0D150F0F0F03FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002A2A2A23565A58F8FFFFFFFFEAED EBFFEAEDECFFEAEEECFFEAEEECFFEAEEECFFEAEEECFFEFF1F0FFFAFBFAFFF3F4 F4FF919492F6595E5BE14A4A4A59303030213232320F33333301FFFFFF00FFFF FF00FFFFFF00FFFFFF004D4D4D21565A58F8FFFFFFFFEDF0EEFFEEF0EFFFEEF1 EFFFEEF1EFFFEEF1EFFFEDF0EEFFEAEEECFFE7EBE9FFEEF0EFFFFBFCFBFFE3E5 E4FF737775F55B5E5DC05353533354545418FFFFFF00FFFFFF00FFFFFF00FFFF FF006F6F6F1F565B58F8FFFFFFFFE7ECE9FFE8ECEAFFE8ECEAFFE8ECEAFFE6EA E8FFE6EAE8FFE6EAE8FFE5E9E7FFE4E9E7FFF3F5F4FFFCFDFDFFBFC2C0FD555A 58FA5D61614B76767617FFFFFF00FFFFFF00FFFFFF00FFFFFF009292921D565B 59F8FFFFFFFFE9ECEBFFEBEEECFFECEFEEFFEDF0EFFFEEF1EFFFEEF1EFFFEDF0 EFFFF3F5F4FFFDFDFDFFE3E4E3FF6E706FF65D625FB9707575369999990D9999 9901FFFFFF00FFFFFF00FFFFFF00FFFFFF00B3B3B31B575B59F7FFFFFFFFEDF0 EEFFEFF2F1FFF2F4F3FFF4F6F5FFF5F7F6FFF7F8F7FFFCFDFCFFF5F5F5FF9093 92F65C615FDC6D707050BABABA12BCBCBC03FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00D8D8D819575B59F7FFFFFFFFEEF1F0FFF1F4F3FFF5F6 F5FFF8F9F8FFFDFDFDFFFDFDFDFFBABBBAF95B5E5CF067696771D1D1D115DBDB DB06FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00F8F8F817575B59F7FFFFFFFFECEFEEFFEFF2F1FFF8F9F8FFFEFEFEFFD8D9 D8FD626564F665686799B8B8B821FFFFFF0AFFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF17575B 59F7FFFFFFFFEEF1F0FFFBFCFCFFECEDECFF7B7D7CF6606463C18F949437FFFF FF0EFFFFFF02FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF17575B59F7FFFFFFFFF7F7 F7FF9FA1A0F65D605EE174777755FFFFFF12FFFFFF05FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF17565B59F7BDC0BFFB5D605EF3686C6A7AE9E9 E918FFFFFF09FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF175E6260CC626664A2B6B6B626FFFFFF0EFFFFFF02FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF15FFFF FF17FFFFFF12FFFFFF04FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF06FFFFFF07FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000001600000026000000260000002600000026000000260000 002600000017000000000000001B000000260000002600000026000000260000 0026000000260000001500000000000000000000000000000000000000000202 0223505452D6535755FF535755FF535755FF535755FF565A58F9080808250000 000002020225525654F2535755FF535755FF535755FF535755FF5C615EEC0101 012100000000000000000000000000000000000000000C0C0C22525654F1FCFC FCFFFFFFFFFFFFFFFFFFFFFFFFFF6B6F6DFE16161626000000000C0C0C24565A 58FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF626665FD0B0B0B20000000000000 000000000000000000000000000017171720525654F1FCFCFCFFDFE3E1FFDFE4 E2FFF8F9F8FF6B6F6DFE1F2020250000000017171722565A58FFFEFEFEFFDFE4 E2FFDFE4E2FFFBFBFBFF626665FD1616161F0000000000000000000000000000 0000000000002222221F525654F1FCFCFCFFDFE3E1FFDFE4E2FFF8F9F8FF6B6F 6DFE292A29240000000022222221565A58FFFEFEFEFFDFE4E2FFDFE4E2FFFBFB FBFF636665FD2222221D00000000000000000000000000000000000000002F2F 2F1D525654F1FCFCFCFFE0E4E2FFE0E4E2FFF8F9F8FF6B6F6DFE343535230000 00003030301F565A58FFFEFEFEFFE0E4E2FFE0E4E2FFFBFBFBFF636665FD2E2E 2E1C00000000000000000000000000000000000000003E3E3E1C535755F1FCFD FDFFE3E7E5FFE3E6E5FFF8F9F9FF6B6F6DFE41424221000000003E3E3E1E565A 58FFFEFEFEFFE3E7E5FFE2E6E4FFFBFCFBFF636665FD3C3C3C1B000000000000 00000000000000000000000000004D4D4D1B535755F1FDFDFDFFE7EAE8FFE6E9 E7FFF9FAFAFF6B6F6DFE4E4F4E20000000004E4E4E1C565A58FFFEFEFEFFD9DE DBFFD4DBD8FFFCFCFCFF636665FD4C4C4C190000000000000000000000000000 0000000000005F5F5F19535755F1FDFDFDFFE2E5E4FFDCE1DFFFFAFBFAFF6B6F 6DFE5D5E5D1F000000005F5F5F1B565A58FFFEFEFEFFDCE1DFFFDBE0DEFFFCFC FCFF636665FD5D5D5D1800000000000000000000000000000000000000007171 7118535755F1FDFDFDFFE3E7E6FFE1E5E3FFFBFBFBFF6B6F6DFE6C6C6C1D0000 000071717119565A58FFFEFFFFFFE2E6E5FFE0E5E3FFFCFDFCFF636665FD7171 7117000000000000000000000000000000000000000087878717535755F1FDFE FDFFE9ECEBFFE6E9E8FFFBFCFCFF6B6F6DFE7D7E7E1C0000000088888818565A 58FFFFFFFFFFE8EBEAFFE6E9E7FFFDFDFDFF636665FD86868615000000000000 00000000000000000000000000009F9F9F15535755F0FEFEFEFFEEF0EFFFE9EC EBFFFCFCFCFF6B6F6DFE9091911B00000000A0A0A017565A58FFFFFFFFFFEDEE EEFFE9ECEBFFFDFDFDFF646765FD9F9F9F140000000000000000000000000000 000000000000BABABA14535755F0FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF6B6F 6DFEA4A5A51900000000BDBDBD15565A58FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFF646765FDBABABA130000000000000000000000000000000000000000DBDB DB12555957D4545856FF545856FF545856FF545856FF595D5BFCCACBCA150000 0000DCDCDC14545856F2545856FF545856FF545856FF545856FF656866F4D9D9 D9110000000000000000000000000000000000000000FFFFFF0BF8F8F813F0F0 F014F0F0F014F0F0F014F0F0F014F7F7F713FFFFFF0B00000000FFFFFF0BF7F7 F713F0F0F014F0F0F014F0F0F014F0F0F014F8F8F813FFFFFF0A000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000 } end end doublecmd-0.5.8/src/foptionshotkeysedithotkey.lrt0000644000175000017500000000061212020403374021354 0ustar alexxalexxTFRMEDITHOTKEY.LBLSHORTCUTS.CAPTION=Shortcuts: TFRMEDITHOTKEY.LBLPARAMETERS.CAPTION=&Parameters (each in a separate line): TFRMEDITHOTKEY.CGHKCONTROLS.CAPTION=Only for these controls TFRMEDITHOTKEY.BTNOK.CAPTION=&OK TFRMEDITHOTKEY.BTNCANCEL.CAPTION=&Cancel TFRMEDITHOTKEY.BTNADDSHORTCUT.HINT=Add new shortcut to sequence TFRMEDITHOTKEY.BTNREMOVESHORTCUT.HINT=Remove last shortcut from sequence doublecmd-0.5.8/src/platform/0000755000175000017500000000000012257501472015126 5ustar alexxalexxdoublecmd-0.5.8/src/platform/ufilesystemwatcher.pas0000644000175000017500000012176011772541354021575 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- This is a thread-component sends an event when a change in the file system occurs. Copyright (C) 2009 Koblov Alexander (Alexx2000@mail.ru) Copyright (C) 2011 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uFileSystemWatcher; {$mode objfpc}{$H+} interface uses Classes, SysUtils; //{$DEFINE DEBUG_WATCHER} type TFSWatchFilter = set of (wfFileNameChange, wfAttributesChange); TFSWatcherEventType = (fswFileCreated, fswFileChanged, fswFileDeleted, fswFileRenamed, fswUnknownChange); TFSWatcherEventTypes = set of TFSWatcherEventType; TFSWatcherEventData = record Path: UTF8String; EventType: TFSWatcherEventType; FileName: UTF8String; // Valid for fswFileCreated, fswFileChanged, fswFileDeleted, fswFileRenamed NewFileName: UTF8String; // Valid for fswFileRenamed UserData: Pointer; end; PFSWatcherEventData = ^TFSWatcherEventData; TFSWatcherEvent = procedure(const EventData: TFSWatcherEventData) of object; { TFileSystemWatcher } TFileSystemWatcher = class private class procedure CreateFileSystemWatcher; class procedure DestroyFileSystemWatcher; public {en Returns @true if watch has been successfully added or already exists. } class function AddWatch(aWatchPath: UTF8String; aWatchFilter: TFSWatchFilter; aWatcherEvent: TFSWatcherEvent; UserData: Pointer = nil): Boolean; class procedure RemoveWatch(aWatchPath: UTF8String; aWatcherEvent: TFSWatcherEvent); class procedure RemoveWatch(aWatcherEvent: TFSWatcherEvent); end; implementation uses LCLProc, uDebug, uExceptions, syncobjs, fgl {$IF DEFINED(MSWINDOWS)} ,Windows, JwaWinNT, JwaWinBase, DCStrUtils, uGlobs, uOSUtils {$ELSEIF DEFINED(LINUX)} ,inotify, BaseUnix, FileUtil {$ELSEIF DEFINED(BSD)} ,BSD, Unix, BaseUnix, UnixType, FileUtil {$ENDIF}; {$IF DEFINED(MSWINDOWS)} const // For each outstanding ReadDirectoryW a buffer of this size will be allocated // by kernel, so this value should be rather small. READDIRECTORYCHANGESW_BUFFERSIZE = 4096; READDIRECTORYCHANGESW_DRIVE_BUFFERSIZE = 32768; var VAR_READDIRECTORYCHANGESW_BUFFERSIZE: DWORD = READDIRECTORYCHANGESW_BUFFERSIZE; CREATEFILEW_SHAREMODE: DWORD = FILE_SHARE_READ or FILE_SHARE_WRITE; function GetTargetPath(const Path: UTF8String): UTF8String; begin Result := mbReadAllLinks(Path); if Result = EmptyStr then Result := Path; end; function GetDriveOfPath(const Path: UTF8String): UTF8String; begin Result := ExtractFileDrive(GetTargetPath(Path)) + PathDelim; end; {$ENDIF} type TOSWatchObserver = class UserData: Pointer; WatcherEvent: TFSWatcherEvent; WatchFilter: TFSWatchFilter; {$IF DEFINED(MSWINDOWS)} RegisteredWatchPath: UTF8String; // Path that was registered to watch (for watching whole drive mode). TargetWatchPath: UTF8String; // What path is actually to be watched (for watching whole drive mode). {$ENDIF} end; TOSWatchObservers = specialize TFPGObjectList; TOSWatch = class private FHandle: THandle; FObservers: TOSWatchObservers; FWatchFilter: TFSWatchFilter; FWatchPath: UTF8String; {$IF DEFINED(MSWINDOWS)} FOverlapped: OVERLAPPED; FBuffer: PByte; FNotifyFilter: DWORD; FReferenceCount: LongInt; FOldFileName: UTF8String; // for FILE_ACTION_RENAMED_OLD_NAME action {$ENDIF} {$IF DEFINED(UNIX)} FNotifyHandle: THandle; {$ENDIF} procedure CreateHandle; procedure DestroyHandle; {$IF DEFINED(MSWINDOWS)} procedure QueueCancelRead; procedure QueueRead; procedure SetFilter(aWatchFilter: TFSWatchFilter); {$ENDIF} public constructor Create(const aWatchPath: UTF8String {$IFDEF UNIX}; aNotifyHandle: THandle{$ENDIF}); reintroduce; destructor Destroy; override; procedure UpdateFilter; {$IF DEFINED(MSWINDOWS)} procedure Reference{$IFDEF DEBUG_WATCHER}(s: String){$ENDIF}; procedure Dereference{$IFDEF DEBUG_WATCHER}(s: String){$ENDIF}; {$ENDIF} property Handle: THandle read FHandle; property Observers: TOSWatchObservers read FObservers; property WatchPath: UTF8String read FWatchPath; end; TOSWatchs = specialize TFPGObjectList; { TFileSystemWatcherImpl } TFileSystemWatcherImpl = class(TThread) private FWatcherLock: syncobjs.TCriticalSection; FOSWatchers: TOSWatchs; {$IF DEFINED(UNIX)} FNotifyHandle: THandle; {$ENDIF} {$IF DEFINED(LINUX)} FEventPipe: TFilDes; {$ENDIF} FCurrentEventData: TFSWatcherEventData; FFinished: Boolean; procedure DoWatcherEvent; function GetWatchersCount: Integer; function GetWatchPath(var aWatchPath: UTF8String): Boolean; {$IF DEFINED(MSWINDOWS)} function IsPathObserved(Watch: TOSWatch; FileName: UTF8String): Boolean; {$ENDIF} {en Call only under FWatcherLock. } procedure RemoveObserverLocked(OSWatcherIndex: Integer; aWatcherEvent: TFSWatcherEvent); {en Call only under FWatcherLock. } procedure RemoveOSWatchLocked(Index: Integer); procedure RemoveOSWatch(Watch: TOSWatch); procedure TriggerTerminateEvent; protected procedure Execute; override; procedure ExecuteWatcher; public constructor Create; destructor Destroy; override; procedure Terminate; function AddWatch(aWatchPath: UTF8String; aWatchFilter: TFSWatchFilter; aWatcherEvent: TFSWatcherEvent; UserData: Pointer = nil): Boolean; procedure RemoveWatch(aWatchPath: UTF8String; aWatcherEvent: TFSWatcherEvent); procedure RemoveWatch(aWatcherEvent: TFSWatcherEvent); property WatchersCount: Integer read GetWatchersCount; end; var FileSystemWatcher: TFileSystemWatcherImpl = nil; { TFileSystemWatcher } class procedure TFileSystemWatcher.CreateFileSystemWatcher; begin if Assigned(FileSystemWatcher) and FileSystemWatcher.FFinished then // Thread finished prematurely maybe because of an error. // Destroy and recreate below. DestroyFileSystemWatcher; if not Assigned(FileSystemWatcher) then FileSystemWatcher := TFileSystemWatcherImpl.Create; end; class procedure TFileSystemWatcher.DestroyFileSystemWatcher; begin if Assigned(FileSystemWatcher) then begin DCDebug('Waiting for FileSystemWatcher thread'); FileSystemWatcher.Terminate; {$IF (fpc_version<2) or ((fpc_version=2) and (fpc_release<5))} If (MainThreadID=GetCurrentThreadID) then while not FileSystemWatcher.FFinished do CheckSynchronize(100); {$ENDIF} FileSystemWatcher.WaitFor; FreeAndNil(FileSystemWatcher); end; end; class function TFileSystemWatcher.AddWatch(aWatchPath: UTF8String; aWatchFilter: TFSWatchFilter; aWatcherEvent: TFSWatcherEvent; UserData: Pointer = nil): Boolean; begin CreateFileSystemWatcher; if Assigned(FileSystemWatcher) then Result := FileSystemWatcher.AddWatch(aWatchPath, aWatchFilter, aWatcherEvent, UserData) else Result := False; end; class procedure TFileSystemWatcher.RemoveWatch(aWatchPath: UTF8String; aWatcherEvent: TFSWatcherEvent); begin if Assigned(FileSystemWatcher) then begin FileSystemWatcher.RemoveWatch(aWatchPath, aWatcherEvent); if FileSystemWatcher.WatchersCount = 0 then DestroyFileSystemWatcher; end; end; class procedure TFileSystemWatcher.RemoveWatch(aWatcherEvent: TFSWatcherEvent); begin if Assigned(FileSystemWatcher) then begin FileSystemWatcher.RemoveWatch(aWatcherEvent); if FileSystemWatcher.WatchersCount = 0 then DestroyFileSystemWatcher; end; end; // ---------------------------------------------------------------------------- procedure ShowError(const sErrMsg: String); begin DCDebug('FSWatcher: ' + sErrMsg + ': (' + IntToStr(GetLastOSError) + ') ' + SysErrorMessage(GetLastOSError)); end; {$IF DEFINED(MSWINDOWS)} procedure NotifyRoutine(dwErrorCode: DWORD; dwNumberOfBytes: DWORD; Overlapped: LPOVERLAPPED); stdcall; forward; function StartReadDirectoryChanges(Watch: TOSWatch): Boolean; begin {$IFDEF DEBUG_WATCHER} DCDebug('FSWatcher: ReadChanges for ', Watch.FWatchPath); {$ENDIF} if Watch.Handle <> feInvalidHandle then begin Result := ReadDirectoryChangesW( Watch.Handle, Watch.FBuffer, VAR_READDIRECTORYCHANGESW_BUFFERSIZE, gWatcherMode = fswmWholeDrive, Watch.FNotifyFilter, nil, @Watch.FOverlapped, @NotifyRoutine) or // ERROR_IO_PENDING is a confirmation that the I/O operation has started. (GetLastError = ERROR_IO_PENDING); if Result then Watch.Reference{$IFDEF DEBUG_WATCHER}('StartReadDirectoryChanges'){$ENDIF} else begin // ERROR_INVALID_HANDLE will be when handle was destroyed // just before the call to ReadDirectoryChangesW. if GetLastError <> ERROR_INVALID_HANDLE then ShowError('ReadDirectoryChangesW error'); end; end else Result := False; end; procedure ProcessFileNotifyInfo(Watch: TOSWatch; dwBytesReceived: DWORD); var wFilename: Widestring; fnInfo: PFILE_NOTIFY_INFORMATION; begin with FileSystemWatcher do begin FCurrentEventData.Path := Watch.WatchPath; if dwBytesReceived = 0 then begin {$IFDEF DEBUG_WATCHER} DCDebug('FSWatcher: Process watch ', hexStr(Watch), ': Buffer overflowed. Some events happened though.'); {$ENDIF} // Buffer was not large enough to store all events. In this case it is only // known that something has changed but all specific events have been lost. FCurrentEventData.EventType := fswUnknownChange; FCurrentEventData.FileName := EmptyStr; FCurrentEventData.NewFileName := EmptyStr; Synchronize(@DoWatcherEvent); Exit; end; fnInfo := @Watch.FBuffer[0]; // FCurrentEventData can be accessed safely because only one ProcessFileNotifyInfo // is called at a time due to completion routines being in a queue. while True do begin SetString(wFilename, PWideChar(@fnInfo^.FileName), fnInfo^.FileNameLength div SizeOf(WideChar)); FCurrentEventData.NewFileName := EmptyStr; case fnInfo^.Action of FILE_ACTION_ADDED: begin FCurrentEventData.FileName := UTF8Encode(wFilename); FCurrentEventData.EventType := fswFileCreated; {$IFDEF DEBUG_WATCHER} DCDebug('FSWatcher: Process watch ', hexStr(Watch), ': Created file ', IncludeTrailingPathDelimiter(Watch.WatchPath) + FCurrentEventData.FileName); {$ENDIF} end; FILE_ACTION_REMOVED: begin FCurrentEventData.FileName := UTF8Encode(wFilename); FCurrentEventData.EventType := fswFileDeleted; {$IFDEF DEBUG_WATCHER} DCDebug('FSWatcher: Process watch ', hexStr(Watch), ': Deleted file ', IncludeTrailingPathDelimiter(Watch.WatchPath) + FCurrentEventData.FileName); {$ENDIF} end; FILE_ACTION_MODIFIED: begin FCurrentEventData.FileName := UTF8Encode(wFilename); FCurrentEventData.EventType := fswFileChanged; {$IFDEF DEBUG_WATCHER} DCDebug('FSWatcher: Process watch ', hexStr(Watch), ': Modified file ', IncludeTrailingPathDelimiter(Watch.WatchPath) + FCurrentEventData.FileName); {$ENDIF} end; FILE_ACTION_RENAMED_OLD_NAME: begin Watch.FOldFileName := UTF8Encode(wFilename); {$IFDEF DEBUG_WATCHER} DCDebug('FSWatcher: Process watch ', hexStr(Watch), ': Rename from ', IncludeTrailingPathDelimiter(Watch.WatchPath) + FCurrentEventData.FileName); {$ENDIF} end; FILE_ACTION_RENAMED_NEW_NAME: begin FCurrentEventData.FileName := Watch.FOldFileName; FCurrentEventData.NewFileName := UTF8Encode(wFilename); FCurrentEventData.EventType := fswFileRenamed; {$IFDEF DEBUG_WATCHER} DCDebug('FSWatcher: Process watch ', hexStr(Watch), ': Rename to ', IncludeTrailingPathDelimiter(Watch.WatchPath) + FCurrentEventData.FileName); {$ENDIF} end; else begin FCurrentEventData.EventType := fswUnknownChange; FCurrentEventData.FileName := EmptyStr; {$IFDEF DEBUG_WATCHER} DCDebug(['FSWatcher: Process watch ', hexStr(Watch), ': Action ', fnInfo^.Action, ' for ', IncludeTrailingPathDelimiter(Watch.WatchPath) + FCurrentEventData.FileName]); {$ENDIF} end; end; if (fnInfo^.Action <> FILE_ACTION_RENAMED_OLD_NAME) and ((gWatcherMode <> fswmWholeDrive) or IsPathObserved(Watch, FCurrentEventData.FileName)) then Synchronize(@DoWatcherEvent); if fnInfo^.NextEntryOffset = 0 then Break else fnInfo := PFILE_NOTIFY_INFORMATION(PByte(fnInfo) + fnInfo^.NextEntryOffset); end; end; end; procedure NotifyRoutine(dwErrorCode: DWORD; dwNumberOfBytes: DWORD; Overlapped: LPOVERLAPPED); stdcall; var Watch: TOSWatch; bReadStarted: Boolean = False; begin Watch := TOSWatch(Overlapped^.hEvent); {$IFDEF DEBUG_WATCHER} DCDebug(['FSWatcher: NotifyRoutine for watch ', hexStr(Watch), ' bytes=', dwNumberOfBytes, ' code=', dwErrorCode, ' handle=', Integer(Watch.Handle)]); {$ENDIF} case dwErrorCode of ERROR_SUCCESS: begin if Watch.FHandle <> feInvalidHandle then begin ProcessFileNotifyInfo(Watch, dwNumberOfBytes); bReadStarted := StartReadDirectoryChanges(Watch); end else begin {$IFDEF DEBUG_WATCHER} DCDebug('FSWatcher: NotifyRoutine Handle destroyed, not starting Read'); {$ENDIF}; end; end; ERROR_OPERATION_ABORTED: begin // I/O operation has been cancelled to change parameters. {$IFDEF DEBUG_WATCHER} DCDebug('FSWatcher: NotifyRoutine aborted, will restart'); {$ENDIF} bReadStarted := StartReadDirectoryChanges(Watch); end; ERROR_ACCESS_DENIED: begin // Most probably handle has been closed or become invalid. {$IFDEF DEBUG_WATCHER} DCDebug(['FSWatcher: NotifyRoutine ERROR_ACCESS_DENIED watch=', hexStr(Watch)]); {$ENDIF} end; else begin DCDebug(['FSWatcher: NotifyRoutine error=', dwErrorCode]); end; end; if not bReadStarted then begin if Watch.Handle <> feInvalidHandle then // This will destroy the handle. FileSystemWatcher.RemoveOSWatch(Watch); // If Handle = feInvalidHandle that means Watch has already been // removed from FileSystemWatcher by main thread. end; Watch.Dereference{$IFDEF DEBUG_WATCHER}('NotifyRoutine'){$ENDIF}; {$IFDEF DEBUG_WATCHER} DCDebug(['FSWatcher: NotifyRoutine for watch ', hexStr(Watch), ' done']); {$ENDIF} end; procedure ReadChangesProc(dwParam: ULONG_PTR); stdcall; var Watch: TOSWatch absolute dwParam; begin {$IFDEF DEBUG_WATCHER} DCDebug('FSWatcher: ReadChangesProc for watch ', hexStr(Watch)); {$ENDIF} if not StartReadDirectoryChanges(Watch) then begin if Watch.Handle <> feInvalidHandle then FileSystemWatcher.RemoveOSWatch(Watch); end; Watch.Dereference{$IFDEF DEBUG_WATCHER}('ReadChangesProc'){$ENDIF}; {$IFDEF DEBUG_WATCHER} DCDebug('FSWatcher: ReadChangesProc done for watch ', hexStr(Watch)); {$ENDIF} end; procedure CancelReadChangesProc(dwParam: ULONG_PTR); stdcall; var Watch: TOSWatch absolute dwParam; begin {$IFDEF DEBUG_WATCHER} DCDebug(['FSWatcher: CancelReadChangesProc for watch ', hexStr(Watch), ' handle ', Integer(Watch.Handle)]); {$ENDIF} // CancelIo will cause the completion routine to be called with ERROR_OPERATION_ABORTED. // Must be called from the same thread which started the I/O operation. if CancelIo(Watch.Handle) = False then begin if GetLastOSError <> ERROR_INVALID_HANDLE then ShowError('CancelReadChangesProc: CancelIo error'); end; Watch.Dereference{$IFDEF DEBUG_WATCHER}('CancelReadChangesProc'){$ENDIF}; {$IFDEF DEBUG_WATCHER} DCDebug('FSWatcher: CancelReadChangesProc done for watch ', hexStr(Watch)); {$ENDIF} end; procedure TerminateProc(dwParam: ULONG_PTR); stdcall; begin // This procedure does nothing. Simply queueing and executing it will cause // SleepEx to exit if there were no other APCs in the queue. end; {$ENDIF} { TFileSystemWatcherImpl } procedure TFileSystemWatcherImpl.Execute; begin DCDebug('FileSystemWatcher thread starting'); try try ExecuteWatcher; except on e: Exception do HandleException(e, Self); end; finally FFinished := True; DCDebug('FileSystemWatcher thread finished'); end; end; procedure TFileSystemWatcherImpl.ExecuteWatcher; {$IF DEFINED(MSWINDOWS)} begin while not Terminated do begin {$IFDEF DEBUG_WATCHER} DCDebug(['FSWatcher: SleepEx (', FOSWatchers.Count, ' watches)']); {$ENDIF} // Contrary to documentation: // SleepEx does not return until all APCs (including I/O completion routines) // in queue are called. Then it returns with WAIT_IO_COMPLETION. // Therefore there is no need to artificially flush queue. SleepEx(INFINITE, True); end; {$IFDEF DEBUG_WATCHER} DCDebug('FSWatcher: SleepEx loop done'); {$ENDIF} end; {$ELSEIF DEFINED(LINUX)} const // Buffer size passed to read() must be at least the size of the first event // to be read from the file descriptor, otherwise Invalid Parameter is returned. // Event record size is variable, we use maximum possible for a single event. // Usually it is big enough so that multiple events can be read with single read(). // The 'name' field is always padded up to multiple of 16 bytes with NULLs. buffer_size = sizeof(inotify_event) + MAX_PATH; var bytes_to_parse, p, i: Integer; buf: PChar = nil; ev: pinotify_event; fds: TFDSet; nfds: cint; begin if (FNotifyHandle = feInvalidHandle) or (FEventPipe[0] = -1) or (FEventPipe[1] = -1) then Exit; try buf := GetMem(buffer_size); // get maximum file descriptor nfds := FEventPipe[0] + 1; if FNotifyHandle >= nfds then nfds := FNotifyHandle + 1; while not Terminated do begin // clear and set file descriptors fpFD_ZERO(fds); fpFD_SET(FEventPipe[0], fds); fpFD_SET(FNotifyHandle, fds); // wait for events if fpSelect(nfds, @fds, nil, nil, nil) = -1 then begin ShowError('select() failed'); Exit; end; { if } if fpFD_ISSET(FEventPipe[0], fds) = 1 then begin // clear pipe while FpRead(FEventPipe[0], buf, 1) <> -1 do; end; { if } if fpFD_ISSET(FNotifyHandle, fds) = 0 then // inotify handle didn't change, so user triggered continue; // Read events. bytes_to_parse := fpread(FNotifyHandle, buf, buffer_size); if bytes_to_parse = -1 then begin ShowError('read(): failed'); continue; end; { if } // parse events and print them p := 0; while p < bytes_to_parse do begin ev := pinotify_event(buf + p); for i := 0 to FOSWatchers.Count - 1 do begin if ev^.wd = FOSWatchers[i].Handle then begin with FCurrentEventData do begin Path := FOSWatchers[i].WatchPath; FileName := StrPas(PChar(@ev^.name)); NewFileName := EmptyStr; // IN_MOVED_FROM is converted to FileDelete. // IN_MOVED_TO is converted to FileCreate. // There is no guarantee we will receive as sequence of // IN_MOVED_FROM, IN_MOVED_TO as the events are only sent // if the source and destination directories respectively // are being watched. if (ev^.mask and (IN_IGNORED or IN_Q_OVERFLOW)) <> 0 then begin // Ignore this event. Break; end else if (ev^.mask and (IN_ACCESS or IN_MODIFY or IN_ATTRIB or IN_CLOSE or IN_OPEN or IN_CLOSE_WRITE or IN_CLOSE_NOWRITE)) <> 0 then begin EventType := fswFileChanged; end else if (ev^.mask and (IN_CREATE or IN_MOVED_TO)) <> 0 then begin EventType := fswFileCreated; end else if (ev^.mask and (IN_DELETE or IN_MOVED_FROM)) <> 0 then begin EventType := fswFileDeleted; end else if (ev^.mask and (IN_DELETE_SELF or IN_MOVE_SELF)) <> 0 then begin // Watched file/directory was deleted or moved. end else EventType := fswUnknownChange; end; // call event handler Synchronize(@DoWatcherEvent); break; end; { if } end; { for } p := p + sizeof(inotify_event) + ev^.len; end; { while } end; { while } finally if Assigned(buf) then FreeMem(buf); end; { try - finally } end; {$ELSEIF DEFINED(BSD)} var ke: TKEvent; begin if FNotifyHandle = feInvalidHandle then exit; while not Terminated do begin FillByte(ke, SizeOf(ke), 0); if kevent(FNotifyHandle, nil, 0, @ke, 1, nil) = -1 then break; case ke.Filter of EVFILT_TIMER: // user triggered continue; EVFILT_VNODE: begin with FCurrentEventData do begin Path := TOSWatch(ke.uData).WatchPath; EventType := fswUnknownChange; FileName := EmptyStr; NewFileName := EmptyStr; end; Synchronize(@DoWatcherEvent); end; end; { case } end; { while } end; {$ELSE} begin end; {$ENDIF} procedure TFileSystemWatcherImpl.DoWatcherEvent; var i, j: Integer; begin if not Terminated then begin try FWatcherLock.Acquire; try for i := 0 to FOSWatchers.Count - 1 do begin if FOSWatchers[i].WatchPath = FCurrentEventData.Path then begin for j := 0 to FOSWatchers[i].Observers.Count - 1 do begin // TODO: Check filter. // Can be called under the lock because this function is run from // the main thread and the watcher thread is suspended anyway because // it's waiting until Synchronize call (thus this function) finishes. with FOSWatchers[i].Observers[j] do begin if Assigned(WatcherEvent) {$IFDEF MSWINDOWS} and ((gWatcherMode <> fswmWholeDrive) or IsInPath(TargetWatchPath, UTF8UpperCase(FOSWatchers[i].WatchPath + FCurrentEventData.FileName), False, False)) {$ENDIF} then begin FCurrentEventData.UserData := UserData; {$IFDEF MSWINDOWS} if gWatcherMode = fswmWholeDrive then FCurrentEventData.Path := RegisteredWatchPath; {$ENDIF} WatcherEvent(FCurrentEventData); end; end; end; Break; end; { if } end; { for } finally FWatcherLock.Release; end; { try - finally } except on e: Exception do HandleException(e, Self); end; end; { if } end; function TFileSystemWatcherImpl.GetWatchersCount: Integer; begin FWatcherLock.Acquire; try Result := FOSWatchers.Count; finally FWatcherLock.Release; end; { try - finally } end; function TFileSystemWatcherImpl.GetWatchPath(var aWatchPath: UTF8String): Boolean; begin Result := True; {$IFDEF UNIX} if aWatchPath <> PathDelim then {$ENDIF} aWatchPath := ExcludeTrailingPathDelimiter(aWatchPath); {$IFDEF MSWINDOWS} // Special check for network path if (Pos(PathDelim, aWatchPath) = 1) and (NumCountChars(PathDelim, aWatchPath) < 3) then Exit(False); // Special check for drive root if (Length(aWatchPath) = 2) and (aWatchPath[2] = ':') then aWatchPath := aWatchPath + PathDelim; {$ENDIF} end; {$IF DEFINED(MSWINDOWS)} function TFileSystemWatcherImpl.IsPathObserved(Watch: TOSWatch; FileName: UTF8String): Boolean; var j: Integer; Path: UTF8String; begin Path := UTF8UpperCase(Watch.WatchPath + FileName); FWatcherLock.Acquire; try for j := 0 to Watch.Observers.Count - 1 do begin if IsInPath(Watch.Observers[j].TargetWatchPath, Path, False, False) then Exit(True); end; finally FWatcherLock.Release; end; { try - finally } Result := False; end; {$ENDIF} constructor TFileSystemWatcherImpl.Create; begin {$IF (fpc_version<2) or ((fpc_version=2) and (fpc_release<5))} // Workaround for race condition, see FPC Mantis #16884. inherited Create(True); {$ELSE} inherited Create(False); {$ENDIF} FOSWatchers := TOSWatchs.Create({$IFDEF MSWINDOWS}False{$ELSE}True{$ENDIF}); FWatcherLock := syncobjs.TCriticalSection.Create; FreeOnTerminate := False; FFinished := False; {$IF DEFINED(MSWINDOWS)} case gWatcherMode of fswmPreventDelete: VAR_READDIRECTORYCHANGESW_BUFFERSIZE := READDIRECTORYCHANGESW_BUFFERSIZE; fswmAllowDelete: begin VAR_READDIRECTORYCHANGESW_BUFFERSIZE := READDIRECTORYCHANGESW_BUFFERSIZE; CREATEFILEW_SHAREMODE := CREATEFILEW_SHAREMODE or FILE_SHARE_DELETE; end; fswmWholeDrive: begin VAR_READDIRECTORYCHANGESW_BUFFERSIZE := READDIRECTORYCHANGESW_DRIVE_BUFFERSIZE; CREATEFILEW_SHAREMODE := CREATEFILEW_SHAREMODE or FILE_SHARE_DELETE; end; end; {$ELSEIF DEFINED(LINUX)} // create inotify instance FNotifyHandle := inotify_init(); if FNotifyHandle < 0 then ShowError('inotify_init() failed'); // create pipe for user triggered fake event FEventPipe[0] := -1; FEventPipe[1] := -1; if FpPipe(FEventPipe) = 0 then begin // set both ends of pipe non blocking FpFcntl(FEventPipe[0], F_SetFl, FpFcntl(FEventPipe[0], F_GetFl) or O_NONBLOCK); FpFcntl(FEventPipe[1], F_SetFl, FpFcntl(FEventPipe[1], F_GetFl) or O_NONBLOCK); end else ShowError('pipe() failed'); {$ELSEIF DEFINED(BSD)} FNotifyHandle := kqueue(); if FNotifyHandle = feInvalidHandle then ShowError('kqueue() failed'); {$ELSEIF DEFINED(UNIX)} FNotifyHandle := feInvalidHandle; {$ENDIF} {$IF (fpc_version<2) or ((fpc_version=2) and (fpc_release<5))} Resume; {$ENDIF} end; destructor TFileSystemWatcherImpl.Destroy; begin {$IF DEFINED(LINUX)} // close both ends of pipe if FEventPipe[0] <> -1 then begin FpClose(FEventPipe[0]); FEventPipe[0] := -1; end; if FEventPipe[1] <> -1 then begin FpClose(FEventPipe[1]); FEventPipe[1] := -1; end; if FNotifyHandle <> feInvalidHandle then begin FpClose(FNotifyHandle); FNotifyHandle := feInvalidHandle; end; {$ELSEIF DEFINED(BSD)} if FNotifyHandle <> feInvalidHandle then begin FpClose(FNotifyHandle); FNotifyHandle := feInvalidHandle; end; {$ENDIF} if Assigned(FOSWatchers) then FreeAndNil(FOSWatchers); if Assigned(FWatcherLock) then FreeAndNil(FWatcherLock); inherited Destroy; end; procedure TFileSystemWatcherImpl.Terminate; begin {$IF DEFINED(MSWINDOWS)} // Remove leftover watchers before queueing TerminateProc. // Their handles will be destroyed which will cause completion routines // to be called before Terminate is set and SleepEx loop breaks. while FOSWatchers.Count > 0 do RemoveOSWatch(FOSWatchers[0]); // Then queue TerminateProc in TriggerTerminateEvent. {$ENDIF} inherited Terminate; TriggerTerminateEvent; end; function TFileSystemWatcherImpl.AddWatch(aWatchPath: UTF8String; aWatchFilter: TFSWatchFilter; aWatcherEvent: TFSWatcherEvent; UserData: Pointer): Boolean; var OSWatcher: TOSWatch = nil; OSWatcherCreated: Boolean = False; Observer: TOSWatchObserver; i, j: Integer; WatcherIndex: Integer = -1; {$IFDEF MSWINDOWS} RegisteredPath: UTF8String; {$ENDIF} begin if (aWatchPath = '') or (aWatcherEvent = nil) then Exit(False); if not GetWatchPath(aWatchPath) then Exit(False); {$IFDEF MSWINDOWS} if gWatcherMode = fswmWholeDrive then begin RegisteredPath := aWatchPath; aWatchPath := GetDriveOfPath(aWatchPath); end; {$ENDIF} // Check if the path is not already watched. FWatcherLock.Acquire; try for i := 0 to FOSWatchers.Count - 1 do if FOSWatchers[i].WatchPath = aWatchPath then begin OSWatcher := FOSWatchers[i]; WatcherIndex := i; // Check if the observer is not already registered. for j := 0 to OSWatcher.Observers.Count - 1 do begin if CompareMethods(TMethod(OSWatcher.Observers[j].WatcherEvent), TMethod(aWatcherEvent)) then Exit(True); end; Break; end; finally FWatcherLock.Release; end; if not Assigned(OSWatcher) then begin OSWatcher := TOSWatch.Create(aWatchPath {$IFDEF UNIX}, FNotifyHandle {$ENDIF}); {$IF DEFINED(MSWINDOWS)} OSWatcher.Reference{$IFDEF DEBUG_WATCHER}('AddWatch'){$ENDIF}; // For usage by FileSystemWatcher (main thread) {$ENDIF} OSWatcherCreated := True; end; Observer := TOSWatchObserver.Create; Observer.WatchFilter := aWatchFilter; Observer.WatcherEvent := aWatcherEvent; Observer.UserData := UserData; {$IFDEF MSWINDOWS} if gWatcherMode = fswmWholeDrive then begin Observer.RegisteredWatchPath := RegisteredPath; Observer.TargetWatchPath := UTF8UpperCase(GetTargetPath(RegisteredPath)); end; {$ENDIF} FWatcherLock.Acquire; try if OSWatcherCreated then WatcherIndex := FOSWatchers.Add(OSWatcher); OSWatcher.Observers.Add(Observer); OSWatcher.UpdateFilter; // This creates or recreates handle. Result := OSWatcher.Handle <> feInvalidHandle; // Remove watcher if could not create notification handle. if not Result then RemoveOSWatchLocked(WatcherIndex); finally FWatcherLock.Release; end; end; procedure TFileSystemWatcherImpl.RemoveWatch(aWatchPath: UTF8String; aWatcherEvent: TFSWatcherEvent); var i: Integer; begin if not GetWatchPath(aWatchPath) then Exit; {$IFDEF MSWINDOWS} if gWatcherMode = fswmWholeDrive then aWatchPath := GetDriveOfPath(aWatchPath); {$ENDIF} FWatcherLock.Acquire; try for i := 0 to FOSWatchers.Count - 1 do begin if FOSWatchers[i].WatchPath = aWatchPath then begin RemoveObserverLocked(i, aWatcherEvent); Break; end; end; finally FWatcherLock.Release; end; end; procedure TFileSystemWatcherImpl.RemoveWatch(aWatcherEvent: TFSWatcherEvent); var i: Integer; begin FWatcherLock.Acquire; try for i := 0 to FOSWatchers.Count - 1 do begin RemoveObserverLocked(i, aWatcherEvent); end; finally FWatcherLock.Release; end; end; procedure TFileSystemWatcherImpl.RemoveObserverLocked(OSWatcherIndex: Integer; aWatcherEvent: TFSWatcherEvent); var j: Integer; begin for j := 0 to FOSWatchers[OSWatcherIndex].Observers.Count - 1 do begin if CompareMethods(TMethod(FOSWatchers[OSWatcherIndex].Observers[j].WatcherEvent), TMethod(aWatcherEvent)) then begin FOSWatchers[OSWatcherIndex].Observers.Delete(j); if FOSWatchers[OSWatcherIndex].Observers.Count = 0 then RemoveOSWatchLocked(OSWatcherIndex) else FOSWatchers[OSWatcherIndex].UpdateFilter; Break; end; end; end; procedure TFileSystemWatcherImpl.RemoveOSWatchLocked(Index: Integer); begin {$IF DEFINED(MSWINDOWS)} with FOSWatchers[Index] do begin DestroyHandle; Dereference{$IFDEF DEBUG_WATCHER}('RemoveOSWatchLocked'){$ENDIF}; // Not using anymore by FileSystemWatcher from main thread end; {$ENDIF} FOSWatchers.Delete(Index); end; procedure TFileSystemWatcherImpl.RemoveOSWatch(Watch: TOSWatch); var i: Integer; begin FWatcherLock.Acquire; try for i := 0 to FOSWatchers.Count - 1 do begin if FOSWatchers[i] = Watch then begin RemoveOSWatchLocked(i); Break; end; end; finally FWatcherLock.Release; end; end; procedure TFileSystemWatcherImpl.TriggerTerminateEvent; {$IF DEFINED(MSWINDOWS)} begin QueueUserAPC(@TerminateProc, Self.Handle, ULONG_PTR(Self)); end; {$ELSEIF DEFINED(LINUX)} var buf: Char; begin // check if thread has been started if Self.FNotifyHandle <> feInvalidHandle then begin buf := #0; FpWrite(FEventPipe[1], buf, 1); end; { if } end; {$ELSEIF DEFINED(BSD)} var ke: TKEvent; begin // check if thread has been started if Self.FNotifyHandle <> feInvalidHandle then begin FillByte(ke, SizeOf(ke), 0); EV_SET(@ke, 0, EVFILT_TIMER, EV_ADD or EV_ONESHOT, 0, 0, nil); if kevent(FNotifyHandle, @ke, 1, nil, 0, nil) = -1 then begin ShowError('ERROR: kevent()'); end; { if } end; { if } end; {$ELSE} begin end; {$ENDIF} // ---------------------------------------------------------------------------- { TOSWatch } constructor TOSWatch.Create(const aWatchPath: UTF8String {$IFDEF UNIX}; aNotifyHandle: THandle{$ENDIF}); begin FObservers := TOSWatchObservers.Create(True); FWatchFilter := []; FWatchPath := aWatchPath; {$IFDEF UNIX} FNotifyHandle := aNotifyHandle; {$ENDIF} {$IF DEFINED(MSWINDOWS)} FReferenceCount := 0; FBuffer := GetMem(VAR_READDIRECTORYCHANGESW_BUFFERSIZE); {$ENDIF} FHandle := feInvalidHandle; end; destructor TOSWatch.Destroy; begin DestroyHandle; inherited; {$IFDEF DEBUG_WATCHER} DCDebug(['FSWatcher: Destroying watch ', hexStr(Self)]); {$ENDIF} FObservers.Free; {$IF DEFINED(MSWINDOWS)} Freemem(FBuffer); {$ENDIF} end; procedure TOSWatch.UpdateFilter; var i: Integer; NewFilter: TFSWatchFilter = []; begin for i := 0 to Observers.Count - 1 do NewFilter := NewFilter + Observers[i].WatchFilter; if FWatchFilter <> NewFilter then begin FWatchFilter := NewFilter; // Change watcher filter or recreate watcher. {$IF DEFINED(MSWINDOWS)} SetFilter(FWatchFilter); if FHandle = feInvalidHandle then CreateHandle else QueueCancelRead; // Will cancel and restart Read {$ELSE} DestroyHandle; CreateHandle; {$ENDIF} end; end; {$IF DEFINED(MSWINDOWS)} procedure TOSWatch.Reference{$IFDEF DEBUG_WATCHER}(s: String){$ENDIF}; {$IFDEF DEBUG_WATCHER} var CurrentRefCount: LongInt; {$ENDIF} begin {$IFDEF DEBUG_WATCHER} CurrentRefCount := {$ENDIF} System.InterlockedIncrement(FReferenceCount); {$IFDEF DEBUG_WATCHER} DCDebug(['FSWatcher: Watch ', hexStr(Self), ' ++ref=', CurrentRefCount, ' ', s]); {$ENDIF} end; procedure TOSWatch.Dereference{$IFDEF DEBUG_WATCHER}(s: String){$ENDIF}; {$IFDEF DEBUG_WATCHER} var CurrentRefCount: LongInt; {$ENDIF} begin {$IFDEF DEBUG_WATCHER} CurrentRefCount := System.InterlockedDecrement(FReferenceCount); DCDebug(['FSWatcher: Watch ', hexStr(Self), ' --ref=', CurrentRefCount, ' ', s]); if CurrentRefCount = 0 then {$ELSE} if System.InterlockedDecrement(FReferenceCount) = 0 then {$ENDIF} Free; end; {$ENDIF} procedure TOSWatch.CreateHandle; {$IF DEFINED(MSWINDOWS)} begin FHandle := CreateFileW(PWideChar(UTF8Decode('\\?\' + FWatchPath)), FILE_LIST_DIRECTORY, CREATEFILEW_SHAREMODE, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS or FILE_FLAG_OVERLAPPED, 0); if FHandle = INVALID_HANDLE_VALUE then begin FHandle := feInvalidHandle; ShowError('CreateFileW failed for ' + FWatchPath); end else begin FillChar(FOverlapped, SizeOf(FOverlapped), 0); // Pass pointer to watcher to the notify routine via hEvent member. FOverlapped.hEvent := Windows.HANDLE(Self); QueueRead; end; end; {$ELSEIF DEFINED(LINUX)} var hNotifyFilter: uint32_t = 0; begin if wfFileNameChange in FWatchFilter then hNotifyFilter := hNotifyFilter or IN_CREATE or IN_DELETE or IN_DELETE_SELF or IN_MOVE or IN_MOVE_SELF; if wfAttributesChange in FWatchFilter then hNotifyFilter := hNotifyFilter or IN_ATTRIB or IN_MODIFY; FHandle := inotify_add_watch(FNotifyHandle, PChar(UTF8ToSys(FWatchPath)), hNotifyFilter); if FHandle < 0 then begin FHandle := feInvalidHandle; ShowError('inotify_add_watch() failed for ' + FWatchPath); end; end; {$ELSEIF DEFINED(BSD)} var ke: TKEvent; hNotifyFilter: cuint = 0; begin if wfFileNameChange in FWatchFilter then hNotifyFilter := hNotifyFilter or NOTE_DELETE or NOTE_WRITE or NOTE_EXTEND or NOTE_RENAME; if wfAttributesChange in FWatchFilter then hNotifyFilter := hNotifyFilter or NOTE_ATTRIB or NOTE_REVOKE; FHandle := fpOpen(PChar(UTF8ToSys(FWatchPath)), O_RDONLY); if FHandle < 0 then begin FHandle := feInvalidHandle; ShowError('failed to open file ' + FWatchPath); end else begin FillByte(ke, SizeOf(ke), 0); EV_SET(@ke, FHandle, EVFILT_VNODE, EV_ADD or EV_CLEAR, hNotifyFilter, 0, Self); if kevent(FNotifyHandle, @ke, 1, nil, 0, nil) = -1 then begin DestroyHandle; ShowError('kevent failed'); end; { if } end; end; {$ELSE} begin FHandle := feInvalidHandle; end; {$ENDIF} procedure TOSWatch.DestroyHandle; {$IF DEFINED(MSWINDOWS)} var tmpHandle: THandle; {$ENDIF} begin if FHandle <> feInvalidHandle then begin {$IF DEFINED(LINUX)} inotify_rm_watch(FNotifyHandle, FHandle); {$ENDIF} {$IF DEFINED(BSD)} FpClose(FHandle); {$ENDIF} {$IF DEFINED(MSWINDOWS)} // If there are outstanding I/O operations on the handle calling CloseHandle // will fail those operations and cause completion routines to be called // but with ErrorCode = 0. Clearing FHandle before the call allows to know // that handle has been destroyed and to not schedule new Reads. {$IFDEF DEBUG_WATCHER} DCDebug(['FSWatcher: Watch ', hexStr(Self),' DestroyHandle ', Integer(FHandle), ' done']); {$ENDIF} tmpHandle := FHandle; FHandle := feInvalidHandle; CloseHandle(tmpHandle); {$ELSE} FHandle := feInvalidHandle; {$ENDIF} end; end; {$IF DEFINED(MSWINDOWS)} procedure TOSWatch.QueueCancelRead; begin {$IFDEF DEBUG_WATCHER} DCDebug('FSWatcher: QueueCancelRead: Queueing Cancel APC'); {$ENDIF} Reference{$IFDEF DEBUG_WATCHER}('QueueCancelRead'){$ENDIF}; // For use by CancelReadChangesProc. QueueUserAPC(@CancelReadChangesProc, FileSystemWatcher.Handle, ULONG_PTR(Self)); {$IFDEF DEBUG_WATCHER} DCDebug('FSWatcher: QueueCancelRead: Queueing Cancel APC done'); {$ENDIF} end; procedure TOSWatch.QueueRead; begin {$IFDEF DEBUG_WATCHER} DCDebug('FSWatcher: QueueRead: Queueing Read APC'); {$ENDIF} Reference{$IFDEF DEBUG_WATCHER}('QueueRead'){$ENDIF}; // For use by ReadChangesProc. QueueUserAPC(@ReadChangesProc, FileSystemWatcher.Handle, ULONG_PTR(Self)); {$IFDEF DEBUG_WATCHER} DCDebug('FSWatcher: QueueRead: Queueing Read APC done'); {$ENDIF} end; procedure TOSWatch.SetFilter(aWatchFilter: TFSWatchFilter); var // Use temp variable so that assigning FNotifyFilter is coherent. dwFilter: DWORD = 0; begin if wfFileNameChange in aWatchFilter then dwFilter := dwFilter or FILE_NOTIFY_CHANGE_FILE_NAME or FILE_NOTIFY_CHANGE_DIR_NAME; if wfAttributesChange in aWatchFilter then dwFilter := dwFilter or FILE_NOTIFY_CHANGE_ATTRIBUTES or FILE_NOTIFY_CHANGE_SIZE or FILE_NOTIFY_CHANGE_LAST_WRITE; FNotifyFilter := dwFilter; end; {$ENDIF} finalization TFileSystemWatcher.DestroyFileSystemWatcher; end. doublecmd-0.5.8/src/platform/udefaultplugins.pas0000644000175000017500000001540612163512735021054 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Some useful functions to work with plugins Copyright (C) 2011-2013 Alexander Koblov (alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uDefaultPlugins; {$mode objfpc}{$H+} interface uses Classes, SysUtils; const WcxMask = '*.wcx'{$IFDEF CPU64} + ';*.wcx64'{$ENDIF}; WdxMask = '*.wdx'{$IFDEF CPU64} + ';*.wdx64'{$ENDIF}; WfxMask = '*.wfx'{$IFDEF CPU64} + ';*.wfx64'{$ENDIF}; WlxMask = '*.wlx'{$IFDEF CPU64} + ';*.wlx64'{$ENDIF}; type TBinaryType = (btUnknown, btPe32, btPe64, btElf32, btElf64, btMacho32, btMacho64); const PluginBinaryType = {$IF DEFINED(WIN32)} btPe32 {$ELSEIF DEFINED(WIN64)} btPe64 {$ELSEIF DEFINED(DARWIN) AND DEFINED(CPU32)} btMacho32 {$ELSEIF DEFINED(DARWIN) AND DEFINED(CPU64)} btMacho64 {$ELSEIF DEFINED(UNIX) AND DEFINED(CPU32)} btElf32 {$ELSEIF DEFINED(UNIX) AND DEFINED(CPU64)} btElf64 {$ELSE} btUnknown {$ENDIF} ; PluginBinaryTypeString: array[TBinaryType] of UTF8String = ( 'Unknown', 'Windows 32 bit', 'Windows 64 bit', 'Unix 32 bit', 'Unix 64 bit', 'Mac OS X 32 bit', 'Mac OS X 64 bit' ); procedure UpdatePlugins; function CheckPlugin(var FileName: UTF8String): Boolean; function GetPluginBinaryType(const FileName: UTF8String): TBinaryType; implementation uses Forms, Dialogs, DCOSUtils, DCStrUtils, DCClassesUtf8, uGlobs, uLng; procedure UpdatePlugins; var I: Integer; Folder: UTF8String; begin // Wcx plugins Folder:= '%commander_path%' + PathDelim + 'plugins' + PathDelim + 'wcx' + PathDelim; I:= gWCXPlugins.IndexOfName('zip'); if I < 0 then gWCXPlugins.Add('zip', 607, Folder + 'zip' + PathDelim + 'zip.wcx') else gWCXPlugins.Flags[I]:= 607; I:= gWCXPlugins.IndexOfName('tar'); if I < 0 then gWCXPlugins.Add('tar', 95, Folder + 'zip' + PathDelim + 'zip.wcx') else gWCXPlugins.Flags[I]:= 95; I:= gWCXPlugins.IndexOfName('bz2'); if I < 0 then gWCXPlugins.Add('bz2', 91, Folder + 'zip' + PathDelim + 'zip.wcx') else begin gWCXPlugins.Flags[I]:= 91; // For bz2 used another plugin, so update path too gWCXPlugins.FileName[I]:= Folder + 'zip' + PathDelim + 'zip.wcx'; end; I:= gWCXPlugins.IndexOfName('tbz'); if I < 0 then gWCXPlugins.Add('tbz', 95, Folder + 'zip' + PathDelim + 'zip.wcx') else gWCXPlugins.Flags[I]:= 95; I:= gWCXPlugins.IndexOfName('gz'); if I < 0 then gWCXPlugins.Add('gz', 91, Folder + 'zip' + PathDelim + 'zip.wcx') else gWCXPlugins.Flags[I]:= 91; I:= gWCXPlugins.IndexOfName('tgz'); if I < 0 then gWCXPlugins.Add('tgz', 95, Folder + 'zip' + PathDelim + 'zip.wcx') else gWCXPlugins.Flags[I]:= 95; I:= gWCXPlugins.IndexOfName('lzma'); if I < 0 then gWCXPlugins.Add('lzma', 1, Folder + 'lzma' + PathDelim + 'lzma.wcx') else gWCXPlugins.Flags[I]:= 1; I:= gWCXPlugins.IndexOfName('cpio'); if I < 0 then gWCXPlugins.Add('cpio', 0, Folder + 'cpio' + PathDelim + 'cpio.wcx') else gWCXPlugins.Flags[I]:= 0; I:= gWCXPlugins.IndexOfName('deb'); if I < 0 then gWCXPlugins.Add('deb', 4, Folder + 'deb' + PathDelim + 'deb.wcx') else gWCXPlugins.Flags[I]:= 4; I:= gWCXPlugins.IndexOfName('rpm'); if I < 0 then gWCXPlugins.Add('rpm', 4, Folder + 'rpm' + PathDelim + 'rpm.wcx') else gWCXPlugins.Flags[I]:= 4; I:= gWCXPlugins.IndexOfName('rar'); if I < 0 then gWCXPlugins.Add('rar', 68, Folder + 'unrar' + PathDelim + 'unrar.wcx') else gWCXPlugins.Flags[I]:= 68; // Wfx plugins Folder:= '%commander_path%' + PathDelim + 'plugins' + PathDelim + 'wfx' + PathDelim; if gWFXPlugins.IndexOfName('FTP') < 0 then begin gWFXPlugins.Add('FTP', Folder + 'ftp' + PathDelim + 'ftp.wfx'); end; {$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)} if gWFXPlugins.IndexOfName('Windows Network') < 0 then begin gWFXPlugins.Add('Windows Network', Folder + 'samba' + PathDelim + 'samba.wfx'); end; {$ENDIF} end; function CheckPlugin(var FileName: UTF8String): Boolean; var PluginType: TBinaryType; begin {$IF DEFINED(CPU64)} if (StrEnds(FileName, '64') = False) and mbFileExists(FileName + '64') then begin FileName:= FileName + '64'; end; {$ENDIF} PluginType:= GetPluginBinaryType(FileName); case PluginType of PluginBinaryType: Exit(True); btUnknown: MessageDlg(Application.Title, rsMsgInvalidPlugin, mtError, [mbOK], 0, mbOK); else MessageDlg(Application.Title, Format(rsMsgInvalidPluginArchitecture, [ PluginBinaryTypeString[PluginType], LineEnding, PluginBinaryTypeString[PluginBinaryType] ]), mtError, [mbOK], 0, mbOK); end; Result:= False; end; function GetPluginBinaryType(const FileName: UTF8String): TBinaryType; var fsFileStream: TFileStreamEx; begin try fsFileStream:= TFileStreamEx.Create(FileName, fmOpenRead or fmShareDenyNone); try // Check Windows executable if fsFileStream.ReadWord = $5A4D then // 'MZ' begin fsFileStream.Seek(60, soBeginning); fsFileStream.Seek(fsFileStream.ReadDWord, soBeginning); if fsFileStream.ReadDWord = $4550 then // 'PE' begin fsFileStream.Seek(20, soCurrent); case fsFileStream.ReadWord of $10B: Exit(btPe32); // 32 bit $20B: Exit(btPe64); // 64 bit end; end; end; fsFileStream.Seek(0, soBeginning); // Check Unix executable if fsFileStream.ReadDWord = $464C457F then // 'ELF' begin case fsFileStream.ReadByte of 1: Exit(btElf32); // 32 bit 2: Exit(btElf64); // 64 bit end; end; fsFileStream.Seek(0, soBeginning); // Check Darwin executable case fsFileStream.ReadDWord of $feedface, $cefaedfe: Exit(btMacho32); // 32 bit $feedfacf, $cffaedfe: Exit(btMacho64); // 64 bit end; Result:= btUnknown; finally fsFileStream.Free; end; except Result:= btUnknown; end; end; end. doublecmd-0.5.8/src/platform/ufindex.pas0000644000175000017500000002422212005220234017260 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- This unit contains UTF8 versions of Find(First, Next) functions and other stuff Copyright (C) 2006-2010 Koblov Alexander (Alexx2000@mail.ru) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uFindEx; {$mode objfpc}{$H+} interface uses SysUtils, DCBasicTypes {$IFDEF UNIX} , BaseUnix, uMasks {$ENDIF} {$IFDEF MSWINDOWS} , Windows {$ENDIF} {$IFDEF DARWIN} , MacOSAll {$ENDIF} ; type {$IFDEF UNIX} TUnixFindData = record DirPtr: PDir; //en> directory pointer for reading directory sPath: String; //en> file name path Mask: TMask; //en> object that will check mask StatRec: Stat; end; PUnixFindData = ^TUnixFindData; {$ENDIF} PSearchRecEx = ^TSearchRecEx; TSearchRecEx = Record Time : DCBasicTypes.TFileTime; // modification time Size : Int64; Attr : TFileAttrs; Name : UTF8String; ExcludeAttr : TFileAttrs; {$ifdef unix} FindHandle : Pointer; {$else unix} FindHandle : THandle; {$endif unix} {$if defined(Win32) or defined(WinCE) or defined(Win64)} FindData : Windows.TWin32FindDataW; {$endif} {$ifdef netware_clib} FindData : TNetwareFindData; {$endif} {$ifdef netware_libc} FindData : TNetwareLibcFindData; {$endif} {$ifdef MacOS} FindData : TMacOSFindData; {$endif} end; function FindFirstEx (const Path : UTF8String; Attr : TFileAttrs; out SearchRec : TSearchRecEx) : Longint; function FindNextEx (var SearchRec : TSearchRecEx) : Longint; procedure FindCloseEx(var SearchRec: TSearchRecEx); function CheckAttrMask(DefaultAttr : TFileAttrs; sAttr : String; Attr : TFileAttrs) : Boolean; implementation uses LCLProc, uDebug {$IFDEF MSWINDOWS} , uMyWindows {$ENDIF} {$IFDEF UNIX} , uMyUnix, Unix, FileUtil, DCOSUtils, DCFileAttributes {$ENDIF}; const faSpecial = faVolumeID or faDirectory; function mbFindMatchingFile(var SearchRec: TSearchRecEx): Integer; {$IFDEF MSWINDOWS} begin with SearchRec do begin while (FindData.dwFileAttributes and ExcludeAttr) <> 0 do if not FindNextFileW(FindHandle, FindData) then Exit(GetLastError); FindData.dwFileAttributes:= ExtractFileAttributes(FindData); Time:= TWinFileTime(FindData.ftLastWriteTime); Size:= (Int64(FindData.nFileSizeHigh) shl 32) + FindData.nFileSizeLow; Attr:= FindData.dwFileAttributes; Name:= UTF8Encode(WideString(FindData.cFileName)); end; Result:= 0; end; {$ELSE} var UnixFindData: PUnixFindData; WinAttr: LongInt; begin Result:= -1; UnixFindData:= PUnixFindData(SearchRec.FindHandle); if UnixFindData = nil then Exit; if not Assigned(UnixFindData^.Mask) or UnixFindData^.Mask.Matches(SearchRec.Name) then begin if fpLStat(UTF8ToSys(UnixFindData^.sPath + SearchRec.Name), @UnixFindData^.StatRec) >= 0 then begin with UnixFindData^.StatRec do begin WinAttr:= UnixToWinFileAttr(SearchRec.Name, TFileAttrs(UnixFindData^.StatRec.st_mode)); if (WinAttr and SearchRec.ExcludeAttr) <> 0 then Exit; SearchRec.Size:= Int64(st_size); SearchRec.Time:= DCBasicTypes.TFileTime(st_mtime); SearchRec.Attr:= DCBasicTypes.TFileAttrs(st_mode); end; Result:= 0; end; end; end; {$ENDIF} function FindFirstEx (const Path : UTF8String; Attr : TFileAttrs; out SearchRec : TSearchRecEx) : Longint; {$IFDEF MSWINDOWS} var wPath: WideString; begin wPath:= UTF8Decode(Path); SearchRec.ExcludeAttr:= not Attr and faSpecial; SearchRec.FindHandle:= FindFirstFileW(PWideChar(wPath), SearchRec.FindData); // if error then exit if SearchRec.FindHandle = INVALID_HANDLE_VALUE then Exit(GetLastError); Result:= mbFindMatchingFile(SearchRec); end; {$ELSE} var UnixFindData: PUnixFindData; begin //DCDebug('FindFirstEx with Path == ', Path); { Allocate UnixFindData } New(UnixFindData); FillChar(UnixFindData^, SizeOf(UnixFindData^), 0); SearchRec.FindHandle:= UnixFindData; SearchRec.ExcludeAttr:= not Attr and faSpecial; with UnixFindData^ do begin sPath:= ExtractFileDir(Path); if sPath = '' then sPath := mbGetCurrentDir; sPath:= IncludeTrailingBackSlash(sPath); // Assignment of SearchRec.Name also needed if the path points to a specific // file and only a single mbFindMatchingFile() check needs to be done below. SearchRec.Name:= ExtractFileName(Path); // Check if searching for all files. If yes don't need to use Mask. if (SearchRec.Name <> '*') and (SearchRec.Name <> '') then // '*.*' searches for files with a dot in name so mask needs to be checked. begin // If searching for single specific file, just check if it exists and exit. if (Pos('?', SearchRec.Name) = 0) and (Pos('*', SearchRec.Name) = 0) then begin if FileExists(UTF8ToSys(Path)) and (mbFindMatchingFile(SearchRec) = 0) then Exit(0) else Exit(-1); end; Mask := TMask.Create(SearchRec.Name); end; DirPtr:= fpOpenDir(PChar(UTF8ToSys(sPath))); end; Result:= FindNextEx(SearchRec); end; {$ENDIF} function FindNextEx (var SearchRec : TSearchRecEx) : Longint; {$IFDEF MSWINDOWS} begin if FindNextFileW(SearchRec.FindHandle, SearchRec.FindData) then begin Result:= mbFindMatchingFile(SearchRec); end else Result:= GetLastError; end; {$ELSE} var UnixFindData: PUnixFindData absolute SearchRec.FindHandle; PtrDirEnt: pDirent; begin Result:= -1; if UnixFindData = nil then Exit; if UnixFindData^.DirPtr = nil then Exit; PtrDirEnt:= fpReadDir(UnixFindData^.DirPtr); while PtrDirEnt <> nil do begin SearchRec.Name:= SysToUTF8(PtrDirEnt^.d_name); Result:= mbFindMatchingFile(SearchRec); if Result = 0 then // if found then exit Exit else // else read next PtrDirEnt:= fpReadDir(UnixFindData^.DirPtr); end; end; {$ENDIF} procedure FindCloseEx(var SearchRec: TSearchRecEx); {$IFDEF MSWINDOWS} begin if SearchRec.FindHandle <> INVALID_HANDLE_VALUE then Windows.FindClose(SearchRec.FindHandle); end; {$ELSE} var UnixFindData: PUnixFindData absolute SearchRec.FindHandle; begin if UnixFindData = nil then Exit; if UnixFindData^.DirPtr <> nil then fpCloseDir(UnixFindData^.DirPtr); if Assigned(UnixFindData^.Mask) then UnixFindData^.Mask.Free; Dispose(UnixFindData); SearchRec.FindHandle:= nil; end; {$ENDIF} function CheckAttrMask(DefaultAttr : TFileAttrs; sAttr : String; Attr : TFileAttrs) : Boolean; {$IFDEF WINDOWS} begin Result := True; if (DefaultAttr <> 0) and (DefaultAttr <> faAnyFile) then Result := (Attr and DefaultAttr) = DefaultAttr; if Length(sAttr) < 4 then Exit; if Result then begin if sAttr[1] = 'r' then Result := Result and ((Attr and faReadOnly) = faReadOnly) else if sAttr[1] = '-' then Result := Result and ((Attr and faReadOnly) <> faReadOnly); //WriteLN('After r == ', BoolToStr(Result)); if sAttr[2] = 'a' then Result := Result and ((Attr and faArchive) = faArchive) else if sAttr[2] = '-' then Result := Result and ((Attr and faArchive) <> faArchive); //WriteLN('After a == ', BoolToStr(Result)); if sAttr[3] = 'h' then Result := Result and ((Attr and faHidden) = faHidden) else if sAttr[3] = '-' then Result := Result and ((Attr and faHidden) <> faHidden); //WriteLN('After h == ', BoolToStr(Result)); if sAttr[4] = 's' then Result := Result and ((Attr and faSysFile) = faSysFile) else if sAttr[4] = '-' then Result := Result and ((Attr and faSysFile) <> faSysFile); end; end; {$ELSE} begin Result := True; if (DefaultAttr <> 0) and (DefaultAttr <> faAnyFile) then begin if Boolean(DefaultAttr and faDirectory) then Result := Result and fpS_ISDIR(Attr); DCDebug('Result do == ', BoolToStr(Result)); if Boolean(DefaultAttr and faSymLink) then Result := Result and ((Attr and S_IFLNK) = S_IFLNK); DCDebug('Result after == ', BoolToStr(Result)); end; if Length(sAttr) < 9 then Exit; if sAttr[1]='r' then Result:=Result and ((Attr AND S_IRUSR) = S_IRUSR) else if sAttr[1]='-' then Result:=Result and ((Attr AND S_IRUSR) <> S_IRUSR); if sAttr[2]='w' then Result:=Result and ((Attr AND S_IWUSR) = S_IWUSR) else if sAttr[2]='-' then Result:=Result and ((Attr AND S_IWUSR) <> S_IWUSR); if sAttr[3]='x' then Result:=Result and ((Attr AND S_IXUSR) = S_IXUSR) else if sAttr[3]='-' then Result:=Result and ((Attr AND S_IXUSR) <> S_IXUSR); if sAttr[4]='r' then Result:=Result and ((Attr AND S_IRGRP) = S_IRGRP) else if sAttr[4]='-' then Result:=Result and ((Attr AND S_IRGRP) <> S_IRGRP); if sAttr[5]='w' then Result:=Result and ((Attr AND S_IWGRP) = S_IWGRP) else if sAttr[5]='-' then Result:=Result and ((Attr AND S_IWGRP) <> S_IWGRP); if sAttr[6]='x' then Result:=Result and ((Attr AND S_IXGRP) = S_IXGRP) else if sAttr[6]='-' then Result:=Result and ((Attr AND S_IXGRP) <> S_IXGRP); if sAttr[7]='r' then Result:=Result and ((Attr AND S_IROTH) = S_IROTH) else if sAttr[7]='-' then Result:=Result and ((Attr AND S_IROTH) <> S_IROTH); if sAttr[8]='w' then Result:=Result and ((Attr AND S_IWOTH) = S_IWOTH) else if sAttr[8]='-' then Result:=Result and ((Attr AND S_IWOTH) <> S_IWOTH); if sAttr[9]='x' then Result:=Result and ((Attr AND S_IXOTH) = S_IXOTH) else if sAttr[9]='-' then Result:=Result and ((Attr AND S_IXOTH) <> S_IXOTH); if sAttr[3]='s' then Result:=Result and ((Attr AND STAT_ISUID) = STAT_ISUID); if sAttr[6]='s' then Result:=Result and ((Attr AND STAT_ISGID) = STAT_ISGID); end; {$ENDIF} end. doublecmd-0.5.8/src/platform/upixmapgtk.pas0000644000175000017500000000647611740433676020047 0ustar alexxalexxunit uPixMapGtk; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Graphics, IntfGraphics, gtk2def, gdk2pixbuf, gdk2, glib2; procedure DrawPixbufAtCanvas(Canvas: TCanvas; Pixbuf : PGdkPixbuf; SrcX, SrcY, DstX, DstY, Width, Height: Integer); function PixBufToBitmap(Pixbuf: PGdkPixbuf): TBitmap; implementation uses GraphType; procedure DrawPixbufAtCanvas(Canvas: TCanvas; Pixbuf : PGdkPixbuf; SrcX, SrcY, DstX, DstY, Width, Height: Integer); var gdkDrawable : PGdkDrawable; gdkGC : PGdkGC; gtkDC : TGtkDeviceContext; iPixbufWidth, iPixbufHeight: Integer; StretchedPixbuf: PGdkPixbuf; begin gtkDC := TGtkDeviceContext(Canvas.Handle); gdkDrawable := gtkDC.Drawable; gdkGC := gdk_gc_new(gdkDrawable); iPixbufWidth := gdk_pixbuf_get_width(Pixbuf); iPixbufHeight := gdk_pixbuf_get_height(Pixbuf); if (Width <> iPixbufWidth) or (Height <> iPixbufHeight) then begin StretchedPixbuf := gdk_pixbuf_scale_simple(Pixbuf, Width, Height, GDK_INTERP_BILINEAR); gdk_draw_pixbuf(gdkDrawable, gdkGC, StretchedPixbuf, SrcX, SrcY, DstX, DstY, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); gdk_pixbuf_unref(StretchedPixbuf); end else gdk_draw_pixbuf(gdkDrawable, gdkGC, Pixbuf, SrcX, SrcY, DstX, DstY, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); g_object_unref(gdkGC); end; function PixBufToBitmap(Pixbuf: PGdkPixbuf): TBitmap; var width, height, rowstride, n_channels, i, j: Integer; pixels: Pguchar; pSrc: PByte; pDst: PLongWord; BmpData: TLazIntfImage; hasAlphaChannel: Boolean; QueryFlags: TRawImageQueryFlags = [riqfRGB]; Description: TRawImageDescription; begin Result := nil; n_channels:= gdk_pixbuf_get_n_channels(Pixbuf); if ((n_channels <> 3) and (n_channels <> 4)) or // RGB or RGBA (gdk_pixbuf_get_colorspace(pixbuf) <> GDK_COLORSPACE_RGB) or (gdk_pixbuf_get_bits_per_sample(pixbuf) <> 8) then Exit; width:= gdk_pixbuf_get_width(Pixbuf); height:= gdk_pixbuf_get_height(Pixbuf); rowstride:= gdk_pixbuf_get_rowstride(Pixbuf); pixels:= gdk_pixbuf_get_pixels(Pixbuf); hasAlphaChannel:= gdk_pixbuf_get_has_alpha(Pixbuf); if hasAlphaChannel then Include(QueryFlags, riqfAlpha); BmpData := TLazIntfImage.Create(width, height, QueryFlags); try BmpData.CreateData; Description := BmpData.DataDescription; pDst := PLongWord(BmpData.PixelData); for j:= 0 to Height - 1 do begin pSrc := PByte(pixels) + j * rowstride; for i:= 0 to Width - 1 do begin pDst^ := pSrc[0] shl Description.RedShift + pSrc[1] shl Description.GreenShift + pSrc[2] shl Description.BlueShift; if hasAlphaChannel then pDst^ := pDst^ + pSrc[3] shl Description.AlphaShift; Inc(pSrc, n_channels); Inc(pDst); end; end; Result := TBitmap.Create; Result.LoadFromIntfImage(BmpData); if not hasAlphaChannel then Result.Transparent := True; finally BmpData.Free; end; end; // or use this { begin iPixbufWidth := gdk_pixbuf_get_width(pbPicture); iPixbufHeight := gdk_pixbuf_get_height(pbPicture); Result := TBitMap.Create; Result.SetSize(iPixbufWidth, iPixbufHeight); Result.Canvas.Brush.Color := clBackColor; Result.Canvas.FillRect(0, 0, iPixbufWidth, iPixbufHeight); DrawPixbufAtCanvas(Result.Canvas, pbPicture, 0, 0, 0, 0, iPixbufWidth, iPixbufHeight); end; } end. doublecmd-0.5.8/src/platform/udrivewatcher.pas0000644000175000017500000010610712162610121020477 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Enumerating and monitoring drives in the system. Copyright (C) 2006-2013 Koblov Alexander (Alexx2000@mail.ru) Copyright (C) 2010 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uDriveWatcher; {$mode objfpc}{$H+} interface uses Classes, SysUtils, fgl, LCLType, uDrive; type TDriveWatcherEvent = (dweDriveAdded, dweDriveRemoved, dweDriveChanged); TDriveWatcherEventNotify = procedure(EventType: TDriveWatcherEvent; const ADrive: PDrive) of object; TDriveWatcherObserverList = specialize TFPGList; TDriveWatcher = class class procedure Initialize(Handle: HWND); class procedure Finalize; class procedure AddObserver(Func: TDriveWatcherEventNotify); class procedure RemoveObserver(Func: TDriveWatcherEventNotify); class function GetDrivesList: TDrivesList; end; implementation uses {$IFDEF UNIX} Unix, uMyUnix, uDebug {$IFDEF BSD} , BSD, BaseUnix, StrUtils, FileUtil {$ENDIF} {$IFDEF LINUX} , uUDisks, uFileSystemWatcher, DCStrUtils, uOSUtils, FileUtil {$ENDIF} {$ENDIF} {$IFDEF MSWINDOWS} uMyWindows, Windows, JwaDbt {$ENDIF} ; {$IFDEF LINUX} type TFakeClass = class public procedure OnWatcherNotifyEvent(const EventData: TFSWatcherEventData); procedure OnUDisksNotify(Reason: TUDisksMethod; const ObjectPath: UTF8String); end; {$ENDIF} {$IFDEF BSD} const {$warning Remove this two constants when they are added to FreePascal} NOTE_MOUNTED = $0008; NOTE_UMOUNTED = $0010; type TKQueueDriveEvent = procedure(Event: TDriveWatcherEvent); TKQueueDriveEventWatcher = class(TThread) private kq: Longint; Event: TDriveWatcherEvent; FErrorMsg: String; FOnError: TNotifyEvent; FOnDriveEvent: TKQueueDriveEvent; FFinished: Boolean; procedure RaiseErrorEvent; procedure RaiseDriveEvent; protected procedure Execute; override; procedure DoTerminate; override; public property ErrorMsg: String read FErrorMsg; property OnError: TNotifyEvent read FOnError write FOnError; property OnDriveEvent: TKQueueDriveEvent read FOnDriveEvent write FOnDriveEvent; constructor Create(); destructor Destroy; override; end; {$ENDIF} var FObservers: TDriveWatcherObserverList = nil; InitializeCounter: Integer = 0; {$IFDEF LINUX} FakeClass: TFakeClass = nil; IsUDisksAvailable: Boolean = False; {$ENDIF} {$IFDEF MSWINDOWS} OldWProc: WNDPROC; {$ENDIF} {$IFDEF BSD} KQueueDriveWatcher: TKQueueDriveEventWatcher; {$ENDIF} procedure DoDriveAdded(const ADrive: PDrive); var i: Integer; begin for i := 0 to FObservers.Count - 1 do FObservers[i](dweDriveAdded, ADrive); end; procedure DoDriveRemoved(const ADrive: PDrive); var i: Integer; begin for i := 0 to FObservers.Count - 1 do FObservers[i](dweDriveRemoved, ADrive); end; procedure DoDriveChanged(const ADrive: PDrive); var i: Integer; begin for i := 0 to FObservers.Count - 1 do FObservers[i](dweDriveChanged, ADrive); end; {$IFDEF MSWINDOWS} function MyWndProc(hWnd: HWND; uiMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; var ADrive: PDrive = nil; begin case uiMsg of WM_DEVICECHANGE: case wParam of DBT_DEVICEARRIVAL: DoDriveAdded(ADrive); DBT_DEVICEREMOVECOMPLETE: DoDriveRemoved(ADrive); end; end; // case Result := CallWindowProc(OldWProc, hWnd, uiMsg, wParam, lParam); end; procedure SetMyWndProc(Handle : HWND); begin {$PUSH}{$HINTS OFF} OldWProc := WNDPROC(SetWindowLongPtr(Handle, GWL_WNDPROC, LONG_PTR(@MyWndProc))); {$POP} end; {$ENDIF} {$IFDEF BSD} procedure KQueueDriveWatcher_OnDriveEvent(Event: TDriveWatcherEvent); begin case Event of dweDriveAdded: DoDriveAdded(nil); dweDriveRemoved: DoDriveRemoved(nil); end; { case } end; {$ENDIF} class procedure TDriveWatcher.Initialize(Handle: HWND); begin Inc(InitializeCounter); if InitializeCounter > 1 then // Already initialized. Exit; FObservers := TDriveWatcherObserverList.Create; {$IFDEF LINUX} FakeClass := TFakeClass.Create; if uUDisks.Initialize then begin IsUDisksAvailable := True; uUDisks.AddObserver(@FakeClass.OnUDisksNotify); end else begin DCDebug('Detecting devices through /etc/mtab.'); TFileSystemWatcher.AddWatch('/etc', [wfFileNameChange], @FakeClass.OnWatcherNotifyEvent); end; {$ENDIF} {$IFDEF MSWINDOWS} SetMyWndProc(Handle); {$ENDIF} {$IFDEF BSD} KQueueDriveWatcher := TKQueueDriveEventWatcher.Create(); KQueueDriveWatcher.OnDriveEvent := @KQueueDriveWatcher_OnDriveEvent; KQueueDriveWatcher.Start; {$ENDIF} end; class procedure TDriveWatcher.Finalize; begin Dec(InitializeCounter); if InitializeCounter <> 0 then // Don't finalize yet. Exit; {$IFDEF LINUX} if IsUDisksAvailable then begin uUDisks.RemoveObserver(@FakeClass.OnUDisksNotify); uUDisks.Finalize; IsUDisksAvailable := False; end; TFileSystemWatcher.RemoveWatch('/etc', @FakeClass.OnWatcherNotifyEvent); if Assigned(FakeClass) then FreeAndNil(FakeClass); {$ENDIF} {$IFDEF BSD} KQueueDriveWatcher.Terminate; FreeAndNil(KQueueDriveWatcher); {$ENDIF} if Assigned(FObservers) then FreeAndNil(FObservers); end; class procedure TDriveWatcher.AddObserver(Func: TDriveWatcherEventNotify); begin if FObservers.IndexOf(Func) < 0 then FObservers.Add(Func); end; class procedure TDriveWatcher.RemoveObserver(Func: TDriveWatcherEventNotify); begin FObservers.Remove(Func); end; {$IFDEF LINUX} function BeginsWithString(const patterns: array of string; const strings: array of string): Boolean; var i, j: Integer; begin for i := Low(strings) to High(strings) do begin for j := Low(patterns) to High(patterns) do if StrBegins(strings[i], patterns[j]) then Exit(True); end; Result := False; end; function IsPartOfString(const patterns: array of string; const str: string): Boolean; var I: Integer; begin for I := Low(patterns) to High(patterns) do if Pos(patterns[I], str) > 0 then Exit(True); Result := False; end; function UDisksGetDeviceInfo(const DeviceObjectPath: UTF8String; const Devices: TUDisksDevicesInfos; out DeviceInfo: TUDisksDeviceInfo): Boolean; var i: Integer; begin if Assigned(Devices) then begin for i := Low(Devices) to High(Devices) do begin if Devices[i].DeviceObjectPath = DeviceObjectPath then begin DeviceInfo := Devices[i]; Exit(True); end; end; Result := False; end else begin // Devices not supplied, retrieve info from UDisks. Result := uUDisks.GetDeviceInfo(DeviceObjectPath, DeviceInfo); end; end; procedure UDisksDeviceToDrive(const Devices: TUDisksDevicesInfos; const DeviceInfo: TUDisksDeviceInfo; out Drive: PDrive); var OwnerDevice: TUDisksDeviceInfo; begin New(Drive); with DeviceInfo do begin Drive^.DeviceId := DeviceFile; Drive^.DisplayName := DevicePresentationName; if DeviceIsMounted and (Length(DeviceMountPaths) > 0) then begin Drive^.Path := DeviceMountPaths[0]; if Drive^.DisplayName = EmptyStr then begin if Drive^.Path <> PathDelim then Drive^.DisplayName := ExtractFileName(Drive^.Path) else Drive^.DisplayName := PathDelim; end; end else begin Drive^.Path := EmptyStr; if Drive^.DisplayName = EmptyStr then begin if (IdLabel <> EmptyStr) then Drive^.DisplayName := IdLabel else Drive^.DisplayName := ExtractFileName(DeviceFile); end; end; Drive^.DriveLabel := IdLabel; Drive^.FileSystem := IdType; if DeviceIsPartition then begin if UDisksGetDeviceInfo(PartitionSlave, Devices, OwnerDevice) and OwnerDevice.DeviceIsRemovable then begin // Removable partition usually means pen-drive type. if BeginsWithString(['usb'], OwnerDevice.DriveConnectionInterface) then Drive^.DriveType := dtRemovableUsb else Drive^.DriveType := dtRemovable; end else Drive^.DriveType := dtHardDisk; end else if DeviceIsDrive then begin if BeginsWithString(['flash'], DriveMediaCompatibility) then Drive^.DriveType := dtFlash else if BeginsWithString(['floppy'], DriveMediaCompatibility) then Drive^.DriveType := dtFloppy else if BeginsWithString(['optical'], DriveMediaCompatibility) then Drive^.DriveType := dtOptical else if BeginsWithString(['usb'], DriveConnectionInterface) then Drive^.DriveType := dtRemovableUsb else Drive^.DriveType := dtUnknown; end else if DeviceIsSystemInternal then Drive^.DriveType := dtHardDisk else Drive^.DriveType := dtUnknown; Drive^.IsMediaAvailable := DeviceIsMediaAvailable; Drive^.IsMediaEjectable := DeviceIsDrive and DriveIsMediaEjectable; Drive^.IsMediaRemovable := DeviceIsRemovable; Drive^.IsMounted := DeviceIsMounted; Drive^.AutoMount := (DeviceAutomountHint = EmptyStr) or (DeviceAutomountHint = 'always'); end; end; {$ENDIF} class function TDriveWatcher.GetDrivesList: TDrivesList; {$IF DEFINED(MSWINDOWS)} var Drive : PDrive; DriveNum: Integer; DriveBits: DWORD; WinDriveType: UINT; DriveLetter: AnsiChar; DrivePath: String; Key: HKEY; RegDrivePath: WideString; NetworkPath: array[0..Pred(MAX_PATH)] of WideChar; NetworkPathSize: DWORD = MAX_PATH * SizeOf(WideChar); begin Result := TDrivesList.Create; { fill list } DWORD(DriveBits) := GetLogicalDrives; for DriveNum := 0 to 25 do begin if ((DriveBits shr DriveNum) and $1) = 0 then begin // Try to find in mapped network drives DriveLetter := AnsiChar(DriveNum + Ord('a')); RegDrivePath := 'Network' + PathDelim + DriveLetter; if RegOpenKeyExW(HKEY_CURRENT_USER, PWideChar(RegDrivePath), 0, KEY_READ, Key) = ERROR_SUCCESS then begin if RegQueryValueExW(Key, 'RemotePath', nil, nil, @NetworkPath, @NetworkPathSize) = ERROR_SUCCESS then begin New(Drive); Result.Add(Drive); FillChar(Drive^, SizeOf(TDrive), #0); with Drive^ do begin Path := DriveLetter + ':\'; DisplayName := DriveLetter; DriveLabel := UTF8Encode(WideString(NetworkPath)); DriveType := dtNetwork; AutoMount := True; end; end; RegCloseKey(Key); end; Continue; end; DriveLetter := AnsiChar(DriveNum + Ord('a')); DrivePath := DriveLetter + ':\'; WinDriveType := GetDriveType(PChar(DrivePath)); if WinDriveType = DRIVE_NO_ROOT_DIR then Continue; New(Drive); Result.Add(Drive); with Drive^ do begin DeviceId := EmptyStr; Path := DrivePath; DisplayName := DriveLetter; DriveLabel := EmptyStr; FileSystem := EmptyStr; IsMediaAvailable := True; IsMediaEjectable := False; IsMediaRemovable := False; IsMounted := True; AutoMount := True; case WinDriveType of DRIVE_REMOVABLE: begin if DriveLetter in ['a', 'b'] then DriveType := dtFloppy else DriveType := dtFlash; IsMediaEjectable := True; IsMediaRemovable := True; end; DRIVE_FIXED: DriveType := dtHardDisk; DRIVE_REMOTE: DriveType := dtNetwork; DRIVE_CDROM: begin DriveType := dtOptical; IsMediaEjectable := True; IsMediaRemovable := True; end; DRIVE_RAMDISK: DriveType := dtRamDisk; else DriveType := dtUnknown; end; if IsMediaAvailable then begin case DriveType of dtFloppy: ; // Don't retrieve, it's slow. dtHardDisk: begin DriveLabel := mbGetVolumeLabel(Path, True); FileSystem := mbGetFileSystem(DrivePath); end; dtNetwork: DriveLabel := mbGetRemoteFileName(Path); else DriveLabel := mbGetVolumeLabel(Path, True); end; end; end; end; end; {$ELSEIF DEFINED(LINUX)} function CheckMountEntry(MountEntry: PMountEntry): Boolean; begin Result:= False; with MountEntry^ do begin // check filesystem if (mnt_fsname = 'proc') then Exit; // check mount dir if (mnt_dir = '') or (mnt_dir = '/') or (mnt_dir = 'none') or (mnt_dir = '/proc') or (StrBegins(mnt_dir, '/dev/')) or (StrBegins(mnt_dir, '/sys/')) or (StrBegins(mnt_dir, '/proc/')) then Exit; // check file system type if (mnt_type = 'ignore') or (mnt_type = 'none') or (mnt_type = 'cgroup') or (mnt_type = 'cpuset') or (mnt_type = 'tmpfs') or (mnt_type = 'proc') or (mnt_type = 'swap') or (mnt_type = 'sysfs') or (mnt_type = 'debugfs') or (mnt_type = 'devtmpfs') or (mnt_type = 'devpts') or (mnt_type = 'fusectl') or (mnt_type = 'securityfs') or (mnt_type = 'binfmt_misc') or (mnt_type = 'fuse.gvfs-fuse-daemon') or (mnt_type = 'fuse.truecrypt') or (mnt_type = 'nfsd') or (mnt_type = 'usbfs') or (mnt_type = 'mqueue') or (mnt_type = 'configfs') or (mnt_type = 'hugetlbfs') or (mnt_type = 'selinuxfs') or (mnt_type = 'rpc_pipefs') then Exit; end; Result:= True; end; function UDisksGetDeviceObjectByUUID(const UUID: String; const Devices: TUDisksDevicesInfos): String; var i: Integer; begin for i := Low(Devices) to High(Devices) do if Devices[i].IdUuid = UUID then Exit(Devices[i].DeviceObjectPath); Result := EmptyStr; end; function UDisksGetDeviceObjectByLabel(const DriveLabel: String; const Devices: TUDisksDevicesInfos): String; var i: Integer; begin for i := Low(Devices) to High(Devices) do if Devices[i].IdLabel = DriveLabel then Exit(Devices[i].DeviceObjectPath); Result := EmptyStr; end; function UDisksGetDeviceObjectByDeviceFile(const DeviceFile: String; const Devices: TUDisksDevicesInfos): String; var i: Integer; begin for i := Low(Devices) to High(Devices) do if Devices[i].DeviceFile = DeviceFile then Exit(Devices[i].DeviceObjectPath); Result := EmptyStr; end; var AddedDevices: TStringList = nil; AddedMountPoints: TStringList = nil; HaveUDisksDevices: Boolean = False; function CheckDevice(const Device: String): Boolean; begin // If UDisks is available name=value pair should have been handled, // so we are free to check the device name. Otherwise don't check it // if it is a known name=value pair. Result := HaveUDisksDevices or not (StrBegins(Device, 'UUID=') or StrBegins(Device, 'LABEL=')); end; // Checks if device on some mount point hasn't been added yet. function CanAddDevice(const Device, MountPoint: String): Boolean; var Idx: Integer; begin Idx := AddedMountPoints.IndexOf(MountPoint); Result := (Idx < 0) or (CheckDevice(Device) and CheckDevice(AddedDevices[Idx]) and (AddedDevices[Idx] <> Device)); end; function GetDrive(const DrivesList: TDrivesList; const Device, MountPoint: String): PDrive; var i: Integer; begin for i := 0 to DrivesList.Count - 1 do begin // If UDisks not available only check mount points. if (DrivesList[i]^.Path = MountPoint) and (not CheckDevice(Device) or not CheckDevice(DrivesList[i]^.DeviceId) or (DrivesList[i]^.DeviceId = Device)) then Exit(DrivesList[i]); end; Result := nil; end; function GetStrMaybeQuoted(const s: string): string; var i: Integer; begin Result := ''; if Length(s) > 0 then begin if s[1] in ['"', ''''] then begin for i := Length(s) downto 2 do begin if s[i] = s[1] then Exit(Copy(s, 2, i-2)); end; end else Result := s; end; end; function IsDeviceMountedAtRoot(const UDisksDevice: TUDisksDeviceInfo): Boolean; var i: Integer; begin if UDisksDevice.DeviceIsMounted then begin for i := Low(UDisksDevice.DeviceMountPaths) to High(UDisksDevice.DeviceMountPaths) do if UDisksDevice.DeviceMountPaths[i] = PathDelim then Exit(True); end; Result := False; end; const MntEntFileList: array[1..2] of PChar = (_PATH_FSTAB, _PATH_MOUNTED); var Drive : PDrive = nil; ExistingDrive : PDrive; fstab: PIOFile; pme: PMountEntry; I: Integer; UDisksDevices: TUDisksDevicesInfos; UDisksDevice: TUDisksDeviceInfo; UDisksDeviceObject: UTF8String; DeviceFile: String; MountPoint: String; HandledByUDisks: Boolean = False; begin Result := TDrivesList.Create; try AddedDevices := TStringList.Create; AddedMountPoints := TStringList.Create; if IsUDisksAvailable then HaveUDisksDevices := uUDisks.EnumerateDevices(UDisksDevices); // Storage devices have to be in fstab or mtab and reported by UDisks. for I:= Low(MntEntFileList) to High(MntEntFileList) do begin fstab:= setmntent(MntEntFileList[I],'r'); if not Assigned(fstab) then Continue; pme:= getmntent(fstab); while (pme <> nil) do begin if CheckMountEntry(pme) then begin DeviceFile := StrPas(pme^.mnt_fsname); MountPoint := SysToUTF8(StrPas(pme^.mnt_dir)); if MountPoint <> PathDelim then MountPoint := ExcludeTrailingPathDelimiter(MountPoint); if HaveUDisksDevices then begin // Handle "/dev/", "UUID=" and "LABEL=" through UDisks if available. if StrBegins(DeviceFile, 'UUID=') then begin UDisksDeviceObject := UDisksGetDeviceObjectByUUID( GetStrMaybeQuoted(Copy(DeviceFile, 6, MaxInt)), UDisksDevices); if UDisksDeviceObject <> EmptyStr then DeviceFile := '/dev/' + ExtractFileName(UDisksDeviceObject); HandledByUDisks := True; end else if StrBegins(DeviceFile, 'LABEL=') then begin UDisksDeviceObject := UDisksGetDeviceObjectByLabel( GetStrMaybeQuoted(Copy(DeviceFile, 7, MaxInt)), UDisksDevices); if UDisksDeviceObject <> EmptyStr then DeviceFile := '/dev/' + ExtractFileName(UDisksDeviceObject); HandledByUDisks := True; end else if StrBegins(DeviceFile, '/dev/') then begin DeviceFile := mbCheckReadLinks(DeviceFile); if StrBegins(DeviceFile, '/dev/') then UDisksDeviceObject := DeviceFileToUDisksObjectPath(DeviceFile) else UDisksDeviceObject := UDisksGetDeviceObjectByDeviceFile(DeviceFile, UDisksDevices); HandledByUDisks := True; end else HandledByUDisks := False; if HandledByUDisks then begin if CanAddDevice(DeviceFile, MountPoint) and UDisksGetDeviceInfo(UDisksDeviceObject, UDisksDevices, UDisksDevice) then begin if not UDisksDevice.DevicePresentationHide then begin UDisksDeviceToDrive(UDisksDevices, UDisksDevice, Drive); Drive^.Path := MountPoint; Drive^.DisplayName := UDisksDevice.DevicePresentationName; if Drive^.DisplayName = EmptyStr then begin if MountPoint <> PathDelim then Drive^.DisplayName := ExtractFileName(MountPoint) else Drive^.DisplayName := PathDelim; end; end; end // Even if mounted device is not listed by UDisks add it anyway the standard way. else if I = 2 then // MntEntFileList[2] = _PATH_MOUNTED HandledByUDisks := False; // Else don't add the device if it's not listed by UDisks. end; end; // Add by entry in fstab/mtab. if not HandledByUDisks then begin DeviceFile := mbCheckReadLinks(DeviceFile); if CanAddDevice(DeviceFile, MountPoint) then begin New(Drive); with Drive^ do begin DeviceId := DeviceFile; Path := MountPoint; if MountPoint <> PathDelim then DisplayName := ExtractFileName(Path) else DisplayName := PathDelim; DriveLabel := Path; FileSystem := StrPas(pme^.mnt_type); if IsPartOfString(['ISO9660', 'CDROM', 'CDRW', 'DVD', 'UDF'], UpperCase(FileSystem)) then // for external usb cdrom and dvd DriveType := dtOptical else if IsPartOfString(['ISO9660', 'CDROM', 'CDRW', 'DVD'], UpperCase(DeviceFile)) then DriveType := dtOptical else if IsPartOfString(['FLOPPY'], UpperCase(FileSystem)) then DriveType := dtFloppy else if IsPartOfString(['FLOPPY', '/DEV/FD'], UpperCase(DeviceFile)) then DriveType := dtFloppy else if IsPartOfString(['ZIP', 'USB', 'CAMERA'], UpperCase(FileSystem)) then DriveType := dtFlash else if IsPartOfString(['/MEDIA/'], UpperCase(MountPoint)) then DriveType := dtFlash else if IsPartOfString(['NFS', 'SMB', 'NETW', 'CIFS'], UpperCase(FileSystem)) then DriveType := dtNetwork else DriveType := dtHardDisk; IsMediaAvailable:= True; IsMediaEjectable:= (DriveType = dtOptical); IsMediaRemovable:= DriveType in [dtFloppy, dtOptical, dtFlash]; // If drive from /etc/mtab then it is mounted // else it will be checked via mtab below IsMounted:= (MntEntFileList[I] = _PATH_MOUNTED); AutoMount:= True; end; end // Mark drive as mounted if found in mtab. else if MntEntFileList[I] = _PATH_MOUNTED then begin ExistingDrive := GetDrive(Result, DeviceFile, MountPoint); if Assigned(ExistingDrive) then begin ExistingDrive^.IsMounted := True; if ExistingDrive^.FileSystem = EmptyStr then ExistingDrive^.FileSystem := StrPas(pme^.mnt_type); end; end; end; // If drive object has been created add it to the list. if Assigned(Drive) then begin Result.Add(Drive); Drive := nil; AddedDevices.Add(DeviceFile); AddedMountPoints.Add(MountPoint); {$IFDEF DEBUG} DCDebug('Adding drive "' + DeviceFile + '" with mount point "' + MountPoint + '"'); {$ENDIF} end; end; pme:= getmntent(fstab); end; endmntent(fstab); end; if HaveUDisksDevices then begin for i := Low(UDisksDevices) to High(UDisksDevices) do begin // Add drives not having a partition table which are usually devices // with removable media like CDROM, floppy - they can be mounted. // Don't add drives with partition table because they cannot be mounted. // Don't add drives with loop device because they cannot be mounted. // Add devices reported as "filesystem". if ((UDisksDevices[i].DeviceIsDrive and not UDisksDevices[i].DeviceIsPartitionTable) or (UDisksDevices[i].IdUsage = 'filesystem')) and (StrBegins(UDisksDevices[i].DeviceFile, '/dev/loop') = False) and (not UDisksDevices[i].DevicePresentationHide) then begin if (AddedDevices.IndexOf(UDisksDevices[i].DeviceFile) < 0) and (not IsDeviceMountedAtRoot(UDisksDevices[i])) then begin UDisksDeviceToDrive(UDisksDevices, UDisksDevices[i], Drive); Result.Add(Drive); Drive := nil; AddedDevices.Add(UDisksDevices[i].DeviceFile); AddedMountPoints.Add(EmptyStr); {$IFDEF DEBUG} DCDebug('Adding UDisks drive "' + UDisksDevices[i].DeviceFile + '"'); {$ENDIF} end; end; end; end; finally if Assigned(AddedDevices) then AddedDevices.Free; if Assigned(AddedMountPoints) then AddedMountPoints.Free; if Assigned(Drive) then Dispose(Drive); end; end; {$ELSEIF DEFINED(BSD)} function GetDriveTypeFromDeviceOrFSType(const DeviceId, FSType: String): TDriveType; begin // using filesystem type if FSType = 'swap' then Result := dtUnknown else if FSType = 'zfs' then Result := dtHardDisk else if FSType = 'nfs' then Result := dtNetwork else if FSType = 'smbfs' then Result := dtNetwork else if FSType = 'cifs' then Result := dtNetwork {$IF DEFINED(DARWIN)} else if FSType = 'hfs' then Result := dtHardDisk else if FSType = 'ntfs' then Result := dtHardDisk else if FSType = 'msdos' then Result := dtHardDisk else if FSType = 'exfat' then Result := dtHardDisk else if FSType = 'udf' then Result := dtOptical else if FSType = 'cd9660' then Result := dtOptical else if FSType = 'cddafs' then Result := dtOptical else if FSType = 'afpfs' then Result := dtNetwork else if FSType = 'webdav' then Result := dtNetwork {$ENDIF} // using device name else if AnsiStartsStr('/dev/ad', DeviceId) then Result := dtHardDisk else if AnsiStartsStr('/dev/acd', DeviceId) then Result := dtOptical // CD-ROM (IDE) else if AnsiStartsStr('/dev/da', DeviceId) then Result := dtFlash // USB else if AnsiStartsStr('/dev/cd', DeviceId) then Result := dtOptical // CD-ROM (SCSI) else if AnsiStartsStr('/dev/mcd', DeviceId) then Result := dtOptical // CD-ROM (other) else if AnsiStartsStr('/dev/fd', DeviceId) then Result := dtFloppy else if AnsiStartsStr('/dev/sa', DeviceId) then Result := dtUnknown // Tape (SCSI) else if AnsiStartsStr('/dev/ast', DeviceId) then Result := dtUnknown // Tape (IDE) else if AnsiStartsStr('/dev/fla', DeviceId) then Result := dtHardDisk // Flash drive else if AnsiStartsStr('/dev/aacd', DeviceId) or AnsiStartsStr('/dev/mlxd', DeviceId) or AnsiStartsStr('/dev/mlyd', DeviceId) or AnsiStartsStr('/dev/amrd', DeviceId) or AnsiStartsStr('/dev/idad', DeviceId) or AnsiStartsStr('/dev/idad', DeviceId) or AnsiStartsStr('/dev/twed', DeviceId) then Result := dtHardDisk else Result := dtUnknown; // devfs, nullfs, procfs, etc. end; const MAX_FS = 128; var drive: PDrive; fstab: PFSTab; fs: TStatFS; fsList: array[0..MAX_FS] of TStatFS; iMounted, iAdded, count: Integer; found: boolean; dtype: TDriveType; begin Result := TDrivesList.Create; fstab := getfsent(); while fstab <> nil do begin dtype := GetDriveTypeFromDeviceOrFSType(fstab^.fs_spec, fstab^.fs_vfstype); // only add known drive types and skip root directory if (dtype = dtUnknown) or (fstab^.fs_file = PathDelim) then begin fstab := getfsent(); Continue; end; { if } New(drive); Result.Add(drive); with drive^ do begin Path := SysToUTF8(fstab^.fs_file); DisplayName := ExtractFileName(Path); DriveLabel := Path; FileSystem := fstab^.fs_vfstype; DeviceId := fstab^.fs_spec; DriveType := dtype; IsMediaAvailable := false; IsMediaEjectable := false; IsMediaRemovable := false; IsMounted := false; AutoMount := true; end; { with } fstab := getfsent(); end; { while } endfsent(); count := getfsstat(@fsList, SizeOf(fsList), MNT_WAIT); for iMounted := 0 to count - 1 do begin fs := fsList[iMounted]; // check if already added using fstab found := false; for iAdded := 0 to Result.Count - 1 do begin if Result[iAdded]^.Path = fs.mountpoint then begin drive := Result[iAdded]; with drive^ do begin IsMounted := true; IsMediaAvailable := true; end; found := true; break; end; { if } end; { for } if found then continue; dtype := GetDriveTypeFromDeviceOrFSType( {$IF DEFINED(DARWIN)} fs.mntfromname {$ELSE} fs.mnfromname {$ENDIF}, fs.fstypename ); // only add known drive types and skip root directory if (dtype = dtUnknown) or (fs.mountpoint = PathDelim) then Continue; New(drive); Result.Add(drive); with drive^ do begin Path := SysToUTF8(fs.mountpoint); DisplayName := ExtractFileName(Path); DriveLabel := Path; FileSystem := fs.fstypename; DeviceId := {$IF DEFINED(DARWIN)}fs.mntfromname{$ELSE}fs.mnfromname{$ENDIF}; DriveType := dtype; IsMediaAvailable := true; IsMediaEjectable := false; IsMediaRemovable := false; IsMounted := true; AutoMount := true; end; { with } end; { for } end; {$ELSE} begin Result := TDrivesList.Create; end; {$ENDIF} {$IFDEF LINUX} procedure TFakeClass.OnWatcherNotifyEvent(const EventData: TFSWatcherEventData); var ADrive: PDrive = nil; begin if (EventData.EventType = fswFileDeleted) and (Pos('mtab', EventData.FileName) = 1) then DoDriveChanged(ADrive); end; procedure TFakeClass.OnUDisksNotify(Reason: TUDisksMethod; const ObjectPath: UTF8String); var ADrive: PDrive = nil; DeviceInfo: TUDisksDeviceInfo; begin if uUDisks.GetDeviceInfo(ObjectPath, DeviceInfo) then UDisksDeviceToDrive(nil, DeviceInfo, ADrive); try case Reason of UDisks_DeviceAdded: DoDriveAdded(ADrive); UDisks_DeviceRemoved: DoDriveRemoved(ADrive); UDisks_DeviceChanged: DoDriveChanged(ADrive); end; finally if Assigned(ADrive) then Dispose(ADrive); end; end; {$ENDIF} {$IFDEF BSD} { TKQueueDriveEventWatcher } procedure TKQueueDriveEventWatcher.RaiseErrorEvent; begin DCDebug(Self.ErrorMsg); if Assigned(Self.FOnError) then Self.FOnError(Self); end; procedure TKQueueDriveEventWatcher.RaiseDriveEvent; begin if Assigned(Self.FOnDriveEvent) then Self.FOnDriveEvent(Self.Event); end; procedure TKQueueDriveEventWatcher.Execute; const KQUEUE_ERROR = -1; var ke: TKEvent; begin try Self.kq := kqueue(); if Self.kq = KQUEUE_ERROR then begin Self.FErrorMsg := 'ERROR: kqueue()'; Synchronize(@Self.RaiseErrorEvent); exit; end; { if } try FillByte(ke, SizeOf(ke), 0); EV_SET(@ke, 1, EVFILT_FS, EV_ADD, 0, 0, nil); if kevent(kq, @ke, 1, nil, 0, nil) = KQUEUE_ERROR then begin Self.FErrorMsg := 'ERROR: kevent()'; Synchronize(@Self.RaiseErrorEvent); exit; end; { if } while not Terminated do begin FillByte(ke, SizeOf(ke), 0); if kevent(kq, nil, 0, @ke, 1, nil) = KQUEUE_ERROR then break; case ke.Filter of EVFILT_TIMER: // user triggered continue; EVFILT_FS: begin if (ke.FFlags and NOTE_MOUNTED <> 0) then begin Self.Event := dweDriveAdded; {$IFDEF DARWIN} Sleep(1 * 1000); // wait so drive gets available in MacOSX {$ENDIF} Synchronize(@Self.RaiseDriveEvent); end { if } else if (ke.FFlags and NOTE_UMOUNTED <> 0) then begin Self.Event := dweDriveRemoved; {$IFDEF DARWIN} Sleep(1 * 1000); // wait so drive disappears in MacOSX {$ENDIF} Synchronize(@Self.RaiseDriveEvent); end; { else if } end; end; { case } end; { while } finally FpClose(Self.kq); end; { try - finally } finally FFinished := True; end; { try - finally } end; procedure TKQueueDriveEventWatcher.DoTerminate; var ke: TKEvent; begin inherited DoTerminate; if Self.kq = -1 then Exit; FillByte(ke, SizeOf(ke), 0); EV_SET(@ke, 0, EVFILT_TIMER, EV_ADD or EV_ONESHOT, 0, 0, nil); kevent(Self.kq, @ke, 1, nil, 0, nil); end; constructor TKQueueDriveEventWatcher.Create(); begin Self.FreeOnTerminate := true; Self.FFinished := false; inherited Create(true); end; destructor TKQueueDriveEventWatcher.Destroy; begin if not Terminated then begin Self.Terminate; {$IF (fpc_version<2) or ((fpc_version=2) and (fpc_release<5))} If (MainThreadID=GetCurrentThreadID) then while not FFinished do CheckSynchronize(100); {$ENDIF} WaitFor; end; { if } end; {$ENDIF} end. doublecmd-0.5.8/src/platform/utarwriter.pas0000644000175000017500000005554212166246353020061 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Simple TAR archive writer Copyright (C) 2011 Koblov Alexander (Alexx2000@mail.ru) This unit is based on libtar.pp from the Free Component Library (FCL) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uTarWriter; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uGlobs, uWcxModule, WcxPlugin, DCClassesUtf8, uFile, uFileSource, uFileSourceOperationUI, uFileSourceOperation, uFileSourceCopyOperation; const RECORDSIZE = 512; NAMSIZ = 100; TUNMLEN = 32; TGNMLEN = 32; CHKBLANKS = #32#32#32#32#32#32#32#32; USTAR = 'ustar'#32#32; LONGLINK = '././@LongLink'; LONGLEN = RECORDSIZE * 64; LONGMAX = RECORDSIZE * 128; type TDataWriteProcedure = procedure(Buffer: Pointer; BytesToWrite: Int64) of object; TUpdateStatisticsFunction = procedure(var NewStatistics: TFileSourceCopyOperationStatistics) of object; { TTarHeader } TTarHeader = packed record Name: array [0..NAMSIZ - 1] of AnsiChar; Mode: array [0..7] of AnsiChar; UID: array [0..7] of AnsiChar; GID: array [0..7] of AnsiChar; Size: array [0..11] of AnsiChar; MTime: array [0..11] of AnsiChar; ChkSum: array [0..7] of AnsiChar; TypeFlag: AnsiChar; LinkName: array [0..NAMSIZ - 1] of AnsiChar; Magic: array [0..7] of AnsiChar; UName: array [0..TUNMLEN - 1] of AnsiChar; GName: array [0..TGNMLEN - 1] of AnsiChar; DevMajor: array [0..7] of AnsiChar; DevMinor: array [0..7] of AnsiChar; Prefix: array [0..154] of AnsiChar; end; { TTarHeaderEx } TTarHeaderEx = packed record case Boolean of True: (HR: TTarHeader); False: (HA: array [0..RECORDSIZE - 1] of AnsiChar); end; { TTarWriter } TTarWriter = class private FSourceStream, FTargetStream: TFileStreamEx; FWcxModule: TWcxModule; FTarHeader: TTarHeaderEx; FBasePath, FTargetPath, FArchiveFileName: UTF8String; FBufferIn, FBufferOut: Pointer; FBufferSize: LongWord; FMemPack: TArcHandle; FLongName: array[0..Pred(LONGMAX)] of AnsiChar; procedure WriteFakeHeader(const ItemName: UTF8String; IsFileName: Boolean; Offset: LongInt); function MakeLongName(const FileName, LinkName: UTF8String; NameLen, LinkLen: LongInt): LongInt; function ReadData(BytesToRead: Int64): Int64; procedure WriteData(Buffer: Pointer; BytesToWrite: Int64); procedure CompressData(BufferIn: Pointer; BytesToCompress: Int64); protected AskQuestion: TAskQuestionFunction; AbortOperation: TAbortOperationFunction; CheckOperationState: TCheckOperationStateFunction; UpdateStatistics: TUpdateStatisticsFunction; DataWrite: TDataWriteProcedure; procedure ShowError(sMessage: String); procedure AddFile(const FileName: UTF8String); function WriteFile(const FileName: UTF8String; var Statistics: TFileSourceCopyOperationStatistics): Boolean; public constructor Create(ArchiveFileName: UTF8String; AskQuestionFunction: TAskQuestionFunction; AbortOperationFunction: TAbortOperationFunction; CheckOperationStateFunction: TCheckOperationStateFunction; UpdateStatisticsFunction: TUpdateStatisticsFunction ); constructor Create(ArchiveFileName: UTF8String; AskQuestionFunction: TAskQuestionFunction; AbortOperationFunction: TAbortOperationFunction; CheckOperationStateFunction: TCheckOperationStateFunction; UpdateStatisticsFunction: TUpdateStatisticsFunction; WcxModule: TWcxModule ); destructor Destroy; override; function ProcessTree(var Files: TFiles; var Statistics: TFileSourceCopyOperationStatistics): Boolean; end; implementation uses {$IF DEFINED(MSWINDOWS)} Windows, DCFileAttributes, uMyWindows, {$ELSEIF DEFINED(UNIX)} BaseUnix, FileUtil, uUsersGroups, {$ENDIF} uLng, DCStrUtils, DCOSUtils, uOSUtils; {$IF DEFINED(MSWINDOWS)} const FILE_UNIX_MODE = S_IRUSR or S_IWUSR or S_IRGRP or S_IROTH; FOLDER_UNIX_MODE = S_IRUSR or S_IWUSR or S_IXUSR or S_IRGRP or S_IXGRP or S_IROTH or S_IXOTH; {$ENDIF} // Makes a string of octal digits // The string will always be "Len" characters long procedure Octal64(N : Int64; P : PAnsiChar; Len : Integer); var I : Integer; begin for I := Len - 1 downto 0 do begin (P + I)^ := AnsiChar (ORD ('0') + ORD (N and $07)); N := N shr 3; end; for I := 0 to Len - 1 do begin if (P + I)^ in ['0'..'7'] then Break; (P + I)^ := '0'; end; end; procedure OctalN(N : Int64; P : PAnsiChar; Len : Integer); begin Octal64(N, P, Len-1); (P + Len - 1)^ := #0; end; procedure CheckSum(var TarHeader: TTarHeaderEx); var I: Integer; ChkSum : Cardinal = 0; begin with TarHeader do begin StrMove(HR.ChkSum, CHKBLANKS, 8); for I := 0 to SizeOf(TTarHeader) - 1 do Inc(ChkSum, Ord(HA[I])); Octal64(ChkSum, HR.ChkSum, 6); HR.ChkSum[6] := #0; HR.ChkSum[7] := #32; end; end; {$IF DEFINED(MSWINDOWS)} function GetFileInfo(const FileName: UTF8String; out FileInfo: TWin32FindDataW): Boolean; var Handle: System.THandle; begin Result:= False; Handle := FindFirstFileW(PWideChar(UTF8Decode(FileName)), FileInfo); if Handle <> INVALID_HANDLE_VALUE then begin FileInfo.dwFileAttributes:= ExtractFileAttributes(FileInfo); Windows.FindClose(Handle); Result:= True; end; end; {$ELSEIF DEFINED(UNIX)} function GetFileInfo(const FileName: UTF8String; out FileInfo: BaseUnix.Stat): Boolean; begin Result:= fpLStat(PAnsiChar(UTF8ToSys(FileName)), FileInfo) >= 0; end; {$ENDIF} { TTarWriter } procedure TTarWriter.ShowError(sMessage: String); begin AskQuestion(sMessage, '', [fsourAbort], fsourAbort, fsourAbort); AbortOperation; end; constructor TTarWriter.Create(ArchiveFileName: UTF8String; AskQuestionFunction: TAskQuestionFunction; AbortOperationFunction: TAbortOperationFunction; CheckOperationStateFunction: TCheckOperationStateFunction; UpdateStatisticsFunction: TUpdateStatisticsFunction); begin AskQuestion := AskQuestionFunction; AbortOperation := AbortOperationFunction; CheckOperationState := CheckOperationStateFunction; UpdateStatistics := UpdateStatisticsFunction; DataWrite:= @WriteData; FArchiveFileName:= ArchiveFileName; FTargetPath:= ExtractFilePath(ArchiveFileName); // Allocate buffers FBufferSize := gCopyBlockSize; GetMem(FBufferIn, FBufferSize); FBufferOut:= nil; FWcxModule:= nil; FMemPack:= 0; end; constructor TTarWriter.Create(ArchiveFileName: UTF8String; AskQuestionFunction: TAskQuestionFunction; AbortOperationFunction: TAbortOperationFunction; CheckOperationStateFunction: TCheckOperationStateFunction; UpdateStatisticsFunction: TUpdateStatisticsFunction; WcxModule: TWcxModule); begin AskQuestion := AskQuestionFunction; AbortOperation := AbortOperationFunction; CheckOperationState := CheckOperationStateFunction; UpdateStatistics := UpdateStatisticsFunction; DataWrite:= @CompressData; FArchiveFileName:= ArchiveFileName; FTargetPath:= ExtractFilePath(ArchiveFileName); // Allocate buffers FBufferSize := gCopyBlockSize; GetMem(FBufferIn, FBufferSize); GetMem(FBufferOut, FBufferSize); FWcxModule:= WcxModule; // Starts packing into memory FMemPack:= FWcxModule.WcxStartMemPack(MEM_OPTIONS_WANTHEADERS, ExtractFileName(ArchiveFileName)); end; destructor TTarWriter.Destroy; begin inherited Destroy; if Assigned(FWcxModule) then begin // Ends packing into memory if (FMemPack <> 0) then FWcxModule.DoneMemPack(FMemPack); end; if Assigned(FBufferIn) then begin FreeMem(FBufferIn); FBufferIn := nil; end; if Assigned(FBufferOut) then begin FreeMem(FBufferOut); FBufferOut := nil; end; end; procedure TTarWriter.AddFile(const FileName: UTF8String); {$IF DEFINED(MSWINDOWS)} var FileInfo: TWin32FindDataW; LinkName, FileNameIn: UTF8String; FileMode: Cardinal; FileTime, FileSize: Int64; NameLen, LinkLen: LongInt; begin if GetFileInfo(FileName, FileInfo) then with FTarHeader do begin FillByte(HR, SizeOf(FTarHeader), 0); // File name FileNameIn:= ExtractDirLevel(FBasePath, FileName); FileNameIn:= StringReplace (FileNameIn, '\', '/', [rfReplaceAll]); if FPS_ISDIR(FileInfo.dwFileAttributes) then FileNameIn:= FileNameIn + '/'; StrLCopy (HR.Name, PAnsiChar(FileNameIn), NAMSIZ); // File mode if FPS_ISDIR(FileInfo.dwFileAttributes) then FileMode:= FOLDER_UNIX_MODE else FileMode:= FILE_UNIX_MODE; OctalN(FileMode, HR.Mode, 8); // File size FileSize:= (FileInfo.nFileSizeHigh shl 32) or FileInfo.nFileSizeLow; if FPS_ISLNK(FileInfo.dwFileAttributes) then OctalN(0, HR.Size, 12) else OctalN(FileSize, HR.Size, 12); // Modification time FileTime:= Round((Int64(FileInfo.ftLastWriteTime) - 116444736000000000) / 10000000); OctalN(FileTime, HR.MTime, 12); // File type if FPS_ISLNK(FileInfo.dwFileAttributes) then HR.TypeFlag := '2' else if FPS_ISDIR(FileInfo.dwFileAttributes) then HR.TypeFlag := '5' else HR.TypeFlag := '0'; // Link name if FPS_ISLNK(FileInfo.dwFileAttributes) then begin LinkName:= ReadSymLink(FileName); StrLCopy(HR.LinkName, PAnsiChar(LinkName), NAMSIZ); end; // Magic StrLCopy (HR.Magic, PAnsiChar(USTAR), 8); // Header checksum CheckSum(FTarHeader); // Get file name and link name length NameLen:= Length(FileNameIn); LinkLen:= Length(LinkName); // Write data if not ((NameLen > NAMSIZ) or (LinkLen > NAMSIZ)) then DataWrite(@HA, RECORDSIZE) else begin NameLen:= MakeLongName(FileNameIn, LinkName, NameLen, LinkLen); DataWrite(@FLongName, NameLen); end; end; end; {$ELSEIF DEFINED(UNIX)} var FileInfo: BaseUnix.Stat; LinkName, FileNameIn: UTF8String; NameLen, LinkLen: LongInt; begin if GetFileInfo(FileName, FileInfo) then with FTarHeader do begin FillByte(HR, SizeOf(FTarHeader), 0); // File name FileNameIn:= ExtractDirLevel(FBasePath, FileName); if fpS_ISDIR(FileInfo.st_mode) then FileNameIn:= FileNameIn + PathDelim; StrLCopy (HR.Name, PAnsiChar(FileNameIn), NAMSIZ); // File mode OctalN(FileInfo.st_mode and $FFF, HR.Mode, 8); // UID OctalN(FileInfo.st_uid, HR.UID, 8); // GID OctalN(FileInfo.st_gid, HR.GID, 8); // File size if fpS_ISLNK(FileInfo.st_mode) then OctalN(0, HR.Size, 12) else OctalN(FileInfo.st_size, HR.Size, 12); // Modification time OctalN(FileInfo.st_mtime, HR.MTime, 12); // File type if fpS_ISLNK(FileInfo.st_mode) then HR.TypeFlag:= '2' else if fpS_ISCHR(FileInfo.st_mode) then HR.TypeFlag:= '3' else if fpS_ISBLK(FileInfo.st_mode) then HR.TypeFlag:= '4' else if fpS_ISDIR(FileInfo.st_mode) then HR.TypeFlag:= '5' else if fpS_ISFIFO(FileInfo.st_mode) then HR.TypeFlag:= '6' else HR.TypeFlag:= '0'; // Link name if fpS_ISLNK(FileInfo.st_mode) then begin LinkName:= ReadSymLink(FileName); StrLCopy(HR.LinkName, PAnsiChar(LinkName), NAMSIZ); end; // Magic StrLCopy (HR.Magic, PAnsiChar(USTAR), 8); // User StrPLCopy(HR.UName, UIDToStr(FileInfo.st_uid), TUNMLEN); // Group StrPLCopy(HR.GName, GIDToStr(FileInfo.st_gid), TGNMLEN); // Header checksum CheckSum(FTarHeader); // Get file name and link name length NameLen:= Length(FileNameIn); LinkLen:= Length(LinkName); // Write data if not ((NameLen > NAMSIZ) or (LinkLen > NAMSIZ)) then DataWrite(@HA, RECORDSIZE) else begin NameLen:= MakeLongName(FileNameIn, LinkName, NameLen, LinkLen); DataWrite(@FLongName, NameLen); end; end; end; {$ENDIF} procedure TTarWriter.WriteFakeHeader(const ItemName: UTF8String; IsFileName: Boolean; Offset: LongInt); var TarHeader: TTarHeaderEx; begin with TarHeader do begin FillByte(TarHeader, SizeOf(TTarHeaderEx), 0); StrPLCopy (HR.Name, LONGLINK, NAMSIZ); if IsFileName then HR.TypeFlag:= 'L' else HR.TypeFlag:= 'K'; // File mode OctalN(0, HR.Mode, 8); // UID OctalN(0, HR.UID, 8); // GID OctalN(0, HR.GID, 8); // Name size OctalN(Length(ItemName) + 1, HR.Size, 12); // Modification time OctalN(0, HR.MTime, 12); // Magic StrLCopy (HR.Magic, PAnsiChar(USTAR), 8); // User StrPLCopy(HR.UName, 'root', TUNMLEN); // Group StrPLCopy(HR.GName, 'root', TGNMLEN); // Header checksum CheckSum(TarHeader); // Copy file record Move(HA, PByte(PAnsiChar(@FLongName) + Offset)^, RECORDSIZE); // Copy file name StrMove(PAnsiChar(@FLongName) + Offset + RECORDSIZE, PAnsiChar(ItemName), Length(ItemName)); end; end; function TTarWriter.MakeLongName(const FileName, LinkName: UTF8String; NameLen, LinkLen: LongInt): LongInt; begin with FTarHeader do begin Result:= 0; // Strip string length to maximum length if (NameLen + RECORDSIZE) > LONGLEN then NameLen:= LONGLEN - RECORDSIZE * 2; if (LinkLen + RECORDSIZE) > LONGLEN then LinkLen:= LONGLEN - RECORDSIZE * 2; // Clear output buffer FillChar(FLongName, NameLen + LinkLen + RECORDSIZE * 4, #0); // Write Header for long link name if LinkLen > NAMSIZ then begin WriteFakeHeader(LinkName, False, Result); // Align link name by RECORDSIZE (512) if (LinkLen mod RECORDSIZE) = 0 then Result:= Result + RECORDSIZE + Linklen else Result:= Result + RECORDSIZE * 2 + (LinkLen div RECORDSIZE) * RECORDSIZE; end; // Write Header for long file name if NameLen > NAMSIZ then begin WriteFakeHeader(FileName, True, Result); // Align file name by RECORDSIZE (512) if (NameLen mod RECORDSIZE) = 0 then Result:= Result + RECORDSIZE + NameLen else Result:= Result + RECORDSIZE * 2 + (NameLen div RECORDSIZE) * RECORDSIZE; end; // Copy file record Move(HA, PByte(PAnsiChar(@FLongName) + Result)^, RECORDSIZE); Result:= Result + RECORDSIZE; end; end; function TTarWriter.ReadData(BytesToRead: Int64): Int64; var bRetryRead: Boolean; BytesRead: Int64; begin repeat try bRetryRead := False; FillByte(FBufferIn^, FBufferSize, 0); BytesRead:= FSourceStream.Read(FBufferIn^, BytesToRead); if (BytesRead = 0) then Raise EReadError.Create(mbSysErrorMessage(GetLastOSError)); except on E: EReadError do begin case AskQuestion(rsMsgErrERead + ' ' + FSourceStream.FileName + ':', E.Message, [fsourRetry, fsourSkip, fsourAbort], fsourRetry, fsourSkip) of fsourRetry: bRetryRead := True; fsourAbort: AbortOperation; fsourSkip: Exit; end; // case end; end; until not bRetryRead; Result:= BytesRead; end; procedure TTarWriter.WriteData(Buffer: Pointer; BytesToWrite: Int64); var iTotalDiskSize, iFreeDiskSize: Int64; bRetryWrite: Boolean; BytesWrittenTry, BytesWritten: Int64; begin BytesWritten := 0; repeat try bRetryWrite := False; BytesWrittenTry := FTargetStream.Write((Buffer + BytesWritten)^, BytesToWrite - BytesWritten); BytesWritten := BytesWritten + BytesWrittenTry; if BytesWrittenTry = 0 then begin Raise EWriteError.Create(mbSysErrorMessage(GetLastOSError)); end else if BytesWritten < BytesToWrite then begin bRetryWrite := True; // repeat and try to write the rest end; except on E: EWriteError do begin { Check disk free space } GetDiskFreeSpace(FTargetPath, iFreeDiskSize, iTotalDiskSize); if BytesToWrite > iFreeDiskSize then begin case AskQuestion(rsMsgNoFreeSpaceRetry, '', [fsourYes, fsourNo], fsourYes, fsourNo) of fsourYes: bRetryWrite := True; fsourNo: AbortOperation; end; // case end else begin case AskQuestion(rsMsgErrEWrite + ' ' + FArchiveFileName + ':', E.Message, [fsourRetry, fsourSkip, fsourAbort], fsourRetry, fsourSkip) of fsourRetry: bRetryWrite := True; fsourAbort: AbortOperation; fsourSkip: Exit; end; // case end; end; // on do end; // except until not bRetryWrite; end; procedure TTarWriter.CompressData(BufferIn: Pointer; BytesToCompress: Int64); var InLen: LongInt; Written: LongInt = 0; Taken: LongInt = 0; SeekBy: LongInt = 0; OffSet: LongInt = 0; Result: LongInt; begin InLen:= BytesToCompress; // Do while not all data accepted repeat // Recalculate offset if (Taken <> 0) then begin OffSet:= OffSet + Taken; InLen:= InLen - Taken; end; // Compress input buffer {$PUSH}{$WARNINGS OFF} Result:= FWcxModule.PackToMem(FMemPack, PByte(PtrUInt(BufferIn) + OffSet), InLen, @Taken, FBufferOut, FBufferSize, @Written, @SeekBy); {$POP} if not (Result in [MEMPACK_OK, MEMPACK_DONE]) then begin ShowError(Format(rsMsgLogError + rsMsgLogPack, [FArchiveFileName + ' - ' + GetErrorMsg(Result)])); end; // Seek if needed if (SeekBy <> 0) then FTargetStream.Seek(SeekBy, soCurrent); // Write compressed data if Written > 0 then WriteData(FBufferOut, Written); until ((Taken = InLen) and (BytesToCompress <> 0)) or (Result = MEMPACK_DONE); end; function TTarWriter.WriteFile(const FileName: UTF8String; var Statistics: TFileSourceCopyOperationStatistics): Boolean; var BytesRead, BytesToRead, BytesToWrite: Int64; TotalBytesToRead: Int64 = 0; begin Result := False; BytesToRead := FBufferSize; try FSourceStream:= nil; try FSourceStream := TFileStreamEx.Create(FileName, fmOpenRead or fmShareDenyWrite); TotalBytesToRead := FSourceStream.Size; while TotalBytesToRead > 0 do begin // Without the following line the reading is very slow // if it tries to read past end of file. if TotalBytesToRead < BytesToRead then BytesToRead := TotalBytesToRead; BytesRead:= ReadData(BytesToRead); TotalBytesToRead := TotalBytesToRead - BytesRead; BytesToWrite:= BytesRead; if (BytesRead mod RECORDSIZE) <> 0 then begin // Align by TAR RECORDSIZE BytesToWrite:= (BytesRead div RECORDSIZE) * RECORDSIZE + RECORDSIZE; end; // Write data DataWrite(FBufferIn, BytesToWrite); with Statistics do begin CurrentFileDoneBytes := CurrentFileDoneBytes + BytesRead; DoneBytes := DoneBytes + BytesRead; UpdateStatistics(Statistics); end; CheckOperationState; // check pause and stop end; // while finally FreeAndNil(FSourceStream); end; Result:= True; except on EFOpenError do begin ShowError(rsMsgLogError + rsMsgErrEOpen + ': ' + FileName); end; on EWriteError do begin ShowError(rsMsgLogError + rsMsgErrEWrite + ': ' + FArchiveFileName); end; end; end; function TTarWriter.ProcessTree(var Files: TFiles; var Statistics: TFileSourceCopyOperationStatistics): Boolean; var aFile: TFile; CurrentFileIndex: Integer; iTotalDiskSize, iFreeDiskSize: Int64; begin try Result:= False; // Set base path FBasePath:= Files.Path; // Update progress with Statistics do begin TotalBytes:= TotalBytes * 2; UpdateStatistics(Statistics); end; // Check disk free space //if FCheckFreeSpace = True then begin GetDiskFreeSpace(FTargetPath, iFreeDiskSize, iTotalDiskSize); if Statistics.TotalBytes > iFreeDiskSize then begin AskQuestion('', rsMsgNoFreeSpaceCont, [fsourAbort], fsourAbort, fsourAbort); AbortOperation; end; end; // Create destination file FTargetStream := TFileStreamEx.Create(FArchiveFileName, fmCreate); try for CurrentFileIndex := 0 to Files.Count - 1 do begin aFile := Files[CurrentFileIndex]; if aFile.IsDirectory or aFile.IsLink then AddFile(aFile.FullPath) else begin // Update progress with Statistics do begin CurrentFileFrom := aFile.FullPath; CurrentFileTotalBytes := aFile.Size; CurrentFileDoneBytes := 0; end; UpdateStatistics(Statistics); // Add file record AddFile(aFile.FullPath); // TAR current file if not WriteFile(aFile.FullPath, Statistics) then Break; end; CheckOperationState; end; // Finish TAR archive with two null records FillByte(FBufferIn^, RECORDSIZE * 2, 0); DataWrite(FBufferIn, RECORDSIZE * 2); // Finish compression if needed if (FMemPack <> 0) then CompressData(FBufferIn, 0); finally if Assigned(FTargetStream) then begin FreeAndNil(FTargetStream); if (Statistics.DoneBytes <> Statistics.TotalBytes div 2) then // There was some error, because not all files has been archived. // Delete the not completed target file. mbDeleteFile(FArchiveFileName) else Result:= True; end; end; except on EFCreateError do begin ShowError(rsMsgLogError + rsMsgErrECreate + ': ' + FArchiveFileName); end; end; end; end. doublecmd-0.5.8/src/platform/udragdropex.pas0000644000175000017500000002712011740433676020167 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Interface unit for Drag&Drop to external applications. Copyright (C) 2009 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } {en Be aware that raw HWND handles are used to register controls for drag&drop in the system. Some LCL's functions may destroy a control's handle and create a new one during the lifetime of that control, making drag&drop invalid. Override TWinControl.InitializeWnd and TWinControl.FinalizeWnd to handle registration/unregistration in each control. } unit uDragDropEx; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Controls; type TDropEffect = (DropNoEffect, DropCopyEffect, DropMoveEffect, DropLinkEffect, DropAskEffect); TDragDropStatus = (DragDropAborted, DragDropSuccessful, DragDropError); { Source events } { Dragging has started } TDragBeginEvent = function:Boolean of object; { Drag destination has requested data } TRequestDataEvent = function( // This is the same as given to DoDragDrop. const FileNamesList: TStringList; // MIME-type format in which target requested data, e.g. text/plain. MimeType: string; // Effect chosen by target (may not be final). DropEffect: TDropEffect):string of object; { Dragging has ended } TDragEndEvent = function:Boolean of object; { Target events } { Mouse entered into the control when dragging something } TDragEnterEvent = function( // Proposed drop effect by the source (can be changed by the target to inform the source). var DropEffect: TDropEffect; // Screen coordinates of mouse cursor. ScreenPoint: TPoint):Boolean of object; { Mouse moved inside the control when dragging something } TDragOverEvent = function( // Proposed drop effect by the source (can be changed by the target to inform the source). var DropEffect: TDropEffect; // Screen coordinates of mouse cursor. ScreenPoint: TPoint):Boolean of object; { Mouse button has been lifted causing a drop event } TDropEvent = function( // List of filenames given by the source. const FileNamesList: TStringList; // Drop effect chosen by the source. DropEffect: TDropEffect; // Screen coordinates of mouse cursor. ScreenPoint: TPoint):Boolean of object; { Mouse has left the control when dragging something } TDragLeaveEvent = function:Boolean of object; { Base class for external source } TDragDropSource = class(TObject) public constructor Create(SourceControl: TWinControl); virtual; destructor Destroy; override; function RegisterEvents(DragBeginEvent : uDragDropEx.TDragBeginEvent; RequestDataEvent: uDragDropEx.TRequestDataEvent; DragEndEvent : uDragDropEx.TDragEndEvent): Boolean; virtual; procedure UnregisterEvents; virtual; function DoDragDrop(const FileNamesList: TStringList; MouseButton: TMouseButton; // button that initiated dragging ScreenStartPoint: TPoint // mouse position in screen coords ): Boolean; virtual; function GetLastStatus: TDragDropStatus; function GetFileNamesList: TStringList; function GetDragBeginEvent : TDragBeginEvent; function GetRequestDataEvent: TRequestDataEvent; function GetDragEndEvent : TDragEndEvent; private FDragDropControl: TWinControl; FDragBeginEvent : TDragBeginEvent; FRequestDataEvent : TRequestDataEvent; FDragEndEvent : TDragEndEvent; protected FLastStatus: TDragDropStatus; FFileNamesList: TStringList; function GetControl: TWinControl; end; { Base class for external target } TDragDropTarget = class(TObject) public constructor Create(TargetControl: TWinControl); virtual; destructor Destroy; override; function RegisterEvents(DragEnterEvent: uDragDropEx.TDragEnterEvent; DragOverEvent : uDragDropEx.TDragOverEvent; DropEvent : uDragDropEx.TDropEvent; DragLeaveEvent: uDragDropEx.TDragLeaveEvent): Boolean; virtual; procedure UnregisterEvents; virtual; function GetDragEnterEvent: TDragEnterEvent; function GetDragOverEvent : TDragOverEvent; function GetDropEvent : TDropEvent; function GetDragLeaveEvent: TDragLeaveEvent; private FDragDropControl: TWinControl; FDragEnterEvent: TDragEnterEvent; FDragOverEvent : TDragOverEvent; FDropEvent : TDropEvent; FDragLeaveEvent: TDragLeaveEvent; protected function GetControl: TWinControl; end; { These functions return system-appropriate DragDrop... object. } function CreateDragDropSource(Control: TWinControl): TDragDropSource; function CreateDragDropTarget(Control: TWinControl): TDragDropTarget; { Returns True if external dragging is supported based on operating system and LCLWidgetType (compile-time) } function IsExternalDraggingSupported: Boolean; { Analyzes keyboard modifier keys (Shift, Ctrl, etc.) and mouse button nr and returns the appropriate drop effect. } function GetDropEffectByKeyAndMouse(ShiftState: TShiftState; MouseButton: TMouseButton): TDropEffect; var { If set to True, then dragging is being transformed: internal to external or vice-versa. } TransformDragging : Boolean = False; { If set to True, then transforming from external back to internal dragging is enabled. } AllowTransformToInternal : Boolean = True; implementation {$IF DEFINED(MSWINDOWS)} uses uOleDragDrop; {$ELSEIF DEFINED(LCLGTK) or DEFINED(LCLGTK2)} uses uDragDropGtk; {$ELSEIF DEFINED(LCLQT)} uses uDragDropQt; {$ENDIF} { ---------- TDragDropSource ---------- } constructor TDragDropSource.Create(SourceControl: TWinControl); begin FDragDropControl := SourceControl; FDragBeginEvent := nil; FRequestDataEvent := nil; FDragEndEvent := nil; FFileNamesList := TStringList.Create; FLastStatus := DragDropSuccessful; end; destructor TDragDropSource.Destroy; begin UnregisterEvents; FDragDropControl := nil; if Assigned(FFileNamesList) then FreeAndNil(FFileNamesList); end; function TDragDropSource.GetControl:TWinControl; begin Result := FDragDropControl; end; function TDragDropSource.GetFileNamesList: TStringList; begin Result := FFileNamesList; end; function TDragDropSource.GetLastStatus: TDragDropStatus; begin Result := FLastStatus; end; function TDragDropSource.GetDragBeginEvent: TDragBeginEvent; begin Result := FDragBeginEvent; end; function TDragDropSource.GetRequestDataEvent: TRequestDataEvent; begin Result := FRequestDataEvent; end; function TDragDropSource.GetDragEndEvent: TDragEndEvent; begin Result := FDragEndEvent; end; function TDragDropSource.RegisterEvents(DragBeginEvent : uDragDropEx.TDragBeginEvent; RequestDataEvent: uDragDropEx.TRequestDataEvent; DragEndEvent : uDragDropEx.TDragEndEvent): Boolean; begin FDragBeginEvent := DragBeginEvent; FRequestDataEvent := RequestDataEvent; FDragEndEvent := DragEndEvent; Result := False; end; procedure TDragDropSource.UnregisterEvents; begin FDragBeginEvent := nil; FRequestDataEvent := nil; FDragEndEvent := nil; end; function TDragDropSource.DoDragDrop(const FileNamesList: TStringList; MouseButton: TMouseButton; ScreenStartPoint: TPoint): Boolean; begin FLastStatus := DragDropError; Result := False; end; { ---------- TDragDropTarget ---------- } constructor TDragDropTarget.Create(TargetControl: TWinControl); begin FDragDropControl := TargetControl; FDragEnterEvent := nil; FDragOverEvent := nil; FDropEvent := nil; FDragLeaveEvent := nil; end; destructor TDragDropTarget.Destroy; begin UnregisterEvents; FDragDropControl := nil; end; function TDragDropTarget.GetControl:TWinControl; begin Result := FDragDropControl; end; function TDragDropTarget.GetDragEnterEvent: TDragEnterEvent; begin Result := FDragEnterEvent; end; function TDragDropTarget.GetDragOverEvent: TDragOverEvent; begin Result := FDragOverEvent; end; function TDragDropTarget.GetDropEvent: TDropEvent; begin Result := FDropEvent; end; function TDragDropTarget.GetDragLeaveEvent: TDragLeaveEvent; begin Result := FDragLeaveEvent; end; function TDragDropTarget.RegisterEvents(DragEnterEvent: uDragDropEx.TDragEnterEvent; DragOverEvent : uDragDropEx.TDragOverEvent; DropEvent : uDragDropEx.TDropEvent; DragLeaveEvent: uDragDropEx.TDragLeaveEvent): Boolean; begin FDragEnterEvent := DragEnterEvent; FDragOverEvent := DragOverEvent; FDropEvent := DropEvent; FDragLeaveEvent := DragLeaveEvent; Result := False; end; procedure TDragDropTarget.UnregisterEvents; begin FDragEnterEvent := nil; FDragOverEvent := nil; FDropEvent := nil; FDragLeaveEvent := nil; end; { --------------------------------------------------------------------------- } function IsExternalDraggingSupported: Boolean; begin {$IF DEFINED(MSWINDOWS)} Result := True; {$ELSEIF DEFINED(LCLGTK) OR DEFINED(LCLGTK2)} Result := True; {$ELSEIF DEFINED(LCLQT)} Result := True; {$ELSE} Result := False; {$ENDIF} end; function CreateDragDropSource(Control: TWinControl): TDragDropSource; begin {$IF DEFINED(MSWINDOWS)} Result := TDragDropSourceWindows.Create(Control); {$ELSEIF DEFINED(LCLGTK) or DEFINED(LCLGTK2)} Result := TDragDropSourceGTK.Create(Control); {$ELSEIF DEFINED(LCLQT)} Result := TDragDropSourceQT.Create(Control); {$ELSE} Result := TDragDropSource.Create(Control); // Dummy {$ENDIF} end; function CreateDragDropTarget(Control: TWinControl): TDragDropTarget; begin {$IF DEFINED(MSWINDOWS)} Result := TDragDropTargetWindows.Create(Control); {$ELSEIF DEFINED(LCLGTK) or DEFINED(LCLGTK2)} Result := TDragDropTargetGTK.Create(Control); {$ELSEIF DEFINED(LCLQT)} Result := TDragDropTargetQT.Create(Control); {$ELSE} Result := TDragDropTarget.Create(Control); // Dummy {$ENDIF} end; function GetDropEffectByKeyAndMouse(ShiftState: TShiftState; MouseButton: TMouseButton): TDropEffect; begin case MouseButton of mbLeft: begin if ShiftState = [] then Result := DropCopyEffect // default to Copy when no keys pressed else if ShiftState = [ssShift] then Result := DropMoveEffect else if ShiftState = [ssCtrl] then Result := DropCopyEffect else if ShiftState = [ssCtrl, ssShift] then Result := DropLinkEffect else Result := DropNoEffect; // some other key combination pressed end; mbMiddle: Result := DropAskEffect; mbRight: Result := DropAskEffect; end; end; end. doublecmd-0.5.8/src/platform/uClipboard.pas0000644000175000017500000004050112257475470017727 0ustar alexxalexxunit uClipboard; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LCLType; type TClipboardOperation = ( ClipboardCopy, ClipboardCut ); function CopyToClipboard(const filenames:TStringList):Boolean; function CutToClipboard(const filenames:TStringList):Boolean; function PasteFromClipboard(out ClipboardOp: TClipboardOperation; out filenames:TStringList):Boolean; function URIDecode(encodedUri: String): String; function URIEncode(path: String): String; function ExtractFilenames(uriList: String): TStringList; function FileNameToURI(const FileName: String): String; function FormatUriList(FileNames: TStringList): String; function FormatTextPlain(FileNames: TStringList): String; procedure ClearClipboard; const // General MIME uriListMime = 'text/uri-list'; textPlainMime = 'text/plain'; fileScheme = 'file:'; // for URI {$IFDEF MSWINDOWS} CFSTR_PREFERRED_DROPEFFECT = 'Preferred DropEffect'; CFSTR_FILENAME = 'FileName'; CFSTR_FILENAMEW = 'FileNameW'; CFSTR_UNIFORM_RESOURCE_LOCATOR = 'UniformResourceLocator'; CFSTR_UNIFORM_RESOURCE_LOCATORW = 'UniformResourceLocatorW'; CFSTR_SHELL_IDLIST_ARRAY = 'Shell IDList Array'; {$ELSE IFDEF UNIX} // Gnome cutText = 'cut'; copyText = 'copy'; gnomeClipboardMime = 'x-special/gnome-copied-files'; // Kde kdeClipboardMime = 'application/x-kde-cutselection'; {$ENDIF} var {$IFDEF MSWINDOWS} CFU_PREFERRED_DROPEFFECT, CFU_FILENAME, CFU_FILENAMEW, CFU_UNIFORM_RESOURCE_LOCATOR, CFU_UNIFORM_RESOURCE_LOCATORW, CFU_SHELL_IDLIST_ARRAY, {$ELSE IFDEF UNIX} CFU_KDE_CUT_SELECTION, CFU_GNOME_COPIED_FILES, {$ENDIF} CFU_TEXT_PLAIN, CFU_URI_LIST: TClipboardFormat; implementation uses {$IFDEF MSWINDOWS} Windows, ActiveX, uOleDragDrop, fMain; {$ELSE IFDEF UNIX} LCLIntf, Clipbrd; {$ENDIF} procedure RegisterUserFormats; begin {$IF DEFINED(MSWINDOWS)} CFU_PREFERRED_DROPEFFECT := RegisterClipboardFormat(CFSTR_PREFERRED_DROPEFFECT); CFU_FILENAME := RegisterClipboardFormat(CFSTR_FILENAME); CFU_FILENAMEW := RegisterClipboardFormat(CFSTR_FILENAMEW); CFU_UNIFORM_RESOURCE_LOCATOR := RegisterClipboardFormat(CFSTR_UNIFORM_RESOURCE_LOCATOR); CFU_UNIFORM_RESOURCE_LOCATORW := RegisterClipboardFormat(CFSTR_UNIFORM_RESOURCE_LOCATORW); CFU_SHELL_IDLIST_ARRAY := RegisterClipboardFormat(CFSTR_SHELL_IDLIST_ARRAY); {$ELSEIF DEFINED(UNIX)} CFU_GNOME_COPIED_FILES := RegisterClipboardFormat(gnomeClipboardMime); CFU_KDE_CUT_SELECTION := RegisterClipboardFormat(kdeClipboardMime); {$ENDIF} CFU_TEXT_PLAIN := RegisterClipboardFormat(textPlainMime); CFU_URI_LIST := RegisterClipboardFormat(uriListMime); end; { Changes all '%XX' to bytes (XX is a hex number). } function URIDecode(encodedUri: String): String; var i, oldIndex: Integer; len: Integer; begin len := Length(encodedUri); Result := ''; oldIndex := 1; i := 1; while i <= len-2 do // must be at least 2 more characters after '%' begin if encodedUri[i] = '%' then begin Result := Result + Copy(encodedUri, oldIndex, i-oldIndex) + Chr(StrToInt('$' + Copy(encodedUri, i+1, 2))); i := i + 3; oldIndex := i; end else Inc(i); end; Result := Result + Copy(encodedUri, oldIndex, len - oldIndex + 1 ); end; { Escapes forbidden characters to '%XX' (XX is a hex number). } function URIEncode(path: String): String; const { Per RFC-3986, what's allowed in uri-encoded path. path-absolute = "/" [ segment-nz *( "/" segment ) ] segment = *pchar segment-nz = 1*pchar pchar = unreserved / pct-encoded / sub-delims / ":" / "@" <-- pct-encoded = "%" HEXDIG HEXDIG unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" reserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=" We'll also allow "/" in pchar, because it happens to also be the OS path delimiter. } allowed : set of char = [ '-', '.', '_', '~', // 'A'..'Z', 'a'..'z', '0'..'9', '!', '$', '&', #39 {'}, '(', ')', '*', '+', ',', ';', '=', ':', '@', '/' ]; var i, oldIndex: Integer; len: Integer; begin len := Length(path); Result := ''; oldIndex := 1; i := 1; for i := 1 to len do begin if not ((path[i] >= 'a') and (path[i] <= 'z')) and not ((path[i] >= 'A') and (path[i] <= 'Z')) and not ((path[i] >= '0') and (path[i] <= '9')) and not (path[i] in allowed) then begin Result := Result + Copy(path, oldIndex, i-oldIndex) + '%' + Format('%2x', [Ord(path[i])]); oldIndex := i + 1; end; end; Result := Result + Copy(path, oldIndex, len - oldIndex + 1 ); end; { Extracts a path from URI } function ExtractPath(uri: String): String; var len: Integer; i, j: Integer; begin len := Length(uri); if (len >= Length(fileScheme)) and (CompareChar(uri[1], fileScheme, Length(fileScheme)) = 0) then begin i := 1 + Length(fileScheme); // Omit case where we would have a root-less path - it is useless to us. if (i <= len) and (uri[i] = '/') then begin // Check if we have a: - "//" authority - part. if (i+1 <= len) and (uri[i+1] = '/') then begin // Authority (usually a hostname) may be empty. for j := i + 2 to len do if uri[j] = '/' then begin Result := Copy(uri, j, len - j + 1); Break; end; end else begin // We have only a path. Result := Copy(uri, i, len - i + 1); end; end; end else Result := ''; end; { Retrieves file names delimited by line ending characters. } function ExtractFilenames(uriList: String): TStringList; var i, oldIndex: Integer; len: Integer; path: String; begin // Format should be: file://hostname/path/to/file // Hostname may be empty. len := Length(uriList); Result := TStringList.Create; // For compatibility with apps that end the string with zero. while (len > 0) and (uriList[len] = #0) do Dec(len); if len = 0 then Exit; oldIndex := 1; for i := 1 to len do begin // Search for the end of line. if uriList[i] in [ #10, #13 ] then begin if i > oldIndex then begin path := ExtractPath(Copy(uriList, oldIndex, i - oldIndex)); if Length(path) > 0 then Result.Add(path); end; oldIndex := i + 1; end end; if i >= oldIndex then begin // copy including 'i'th character path := ExtractPath(Copy(uriList, oldIndex, i - oldIndex + 1)); if Length(path) > 0 then Result.Add(path); end; end; function FileNameToURI(const FileName: String): String; begin Result := fileScheme + '//' + URIEncode(FileName); end; function FormatUriList(FileNames: TStringList): String; var i : integer; begin Result := ''; for i := 0 to filenames.Count-1 do begin // Separate previous uris with line endings, // but do not end the whole string with it. if i > 0 then Result := Result + LineEnding; Result := Result + fileScheme + '//' { don't put hostname } + URIEncode(filenames[i]); end; end; function FormatTextPlain(FileNames: TStringList): String; var i : integer; begin Result := ''; for i := 0 to filenames.Count-1 do begin if i > 0 then Result := Result + LineEnding; Result := Result + fileScheme + '//' { don't put hostname } + filenames[i]; end; end; {$IFDEF UNIX} function GetClipboardFormatAsString(formatId: TClipboardFormat): String; var PBuffer: PChar = nil; stream: TMemoryStream; begin Result := ''; stream := TMemoryStream.Create; if stream <> nil then try Clipboard.GetFormat(formatId, stream); stream.Seek(0, soFromBeginning); PBuffer := AllocMem(stream.Size); if PBuffer <> nil then begin stream.Read(PBuffer^, stream.Size); SetString(Result, PBuffer, stream.Size); end; finally if PBuffer <> nil then begin FreeMem(PBuffer); PBuffer := nil; end; FreeAndNil(stream); end; end; function GetClipboardFormatAsString(formatName: String): String; var formatId: Integer; begin formatId := Clipboard.FindFormatID(formatName); if formatId <> 0 then Result := GetClipboardFormatAsString(formatId) else Result := ''; end; {$ENDIF} function SendToClipboard(const filenames:TStringList; ClipboardOp: TClipboardOperation):Boolean; {$IFDEF MSWINDOWS} var DragDropInfo: TDragDropInfo; i: Integer; hGlobalBuffer: HGLOBAL; PreferredEffect: DWORD = DROPEFFECT_COPY; formatEtc: TFormatEtc = (CfFormat: 0; Ptd: nil; dwAspect: 0; lindex: 0; tymed: TYMED_HGLOBAL); {$ENDIF} {$IFDEF UNIX} var s: String; uriList: String; plainList: String; {$ENDIF} begin Result := False; if filenames.Count = 0 then Exit; {$IFDEF MSWINDOWS} if OpenClipboard(frmMain.Handle) = False then Exit; // Empty clipboard, freeing handles to data inside it. // Assign ownership of clipboard to self (frmMain.Handle). EmptyClipboard; { Create a helper object. } DragDropInfo := TDragDropInfo.Create(PreferredEffect); try for i := 0 to filenames.Count - 1 do DragDropInfo.Add(filenames[i]); { Now, set preferred effect. } if CFU_PREFERRED_DROPEFFECT <> 0 then begin if ClipboardOp = ClipboardCopy then PreferredEffect := DROPEFFECT_COPY else if ClipboardOp = ClipboardCut then PreferredEffect := DROPEFFECT_MOVE; hGlobalBuffer := DragDropInfo.CreatePreferredDropEffect(PreferredEffect); if hGlobalBuffer <> 0 then begin if SetClipboardData(CFU_PREFERRED_DROPEFFECT, hGlobalBuffer) = 0 then begin // Failed. GlobalFree(hGlobalBuffer); CloseClipboard; Exit; end // else SetClipboardData succeeded, // so hGlobalBuffer is now owned by the operating system. end else begin CloseClipboard; Exit; end; end; { Now, set clipboard data. } formatEtc.CfFormat := CF_HDROP; hGlobalBuffer := DragDropInfo.MakeDataInFormat(formatEtc); if SetClipboardData(CF_HDROP, hGlobalBuffer) = 0 then GlobalFree(hGlobalBuffer); formatEtc.CfFormat := CFU_SHELL_IDLIST_ARRAY; hGlobalBuffer := DragDropInfo.MakeDataInFormat(formatEtc); if SetClipboardData(CFU_SHELL_IDLIST_ARRAY, hGlobalBuffer) = 0 then GlobalFree(hGlobalBuffer); CloseClipboard; Result := True; finally FreeAndNil(DragDropInfo); end; {$ENDIF} {$IFDEF UNIX} // Prepare filenames list. uriList := FormatUriList(filenames); plainList := FormatTextPlain(filenames); Clipboard.Open; Clipboard.Clear; { Gnome } if CFU_GNOME_COPIED_FILES <> 0 then begin case ClipboardOp of ClipboardCopy: s := copyText; ClipboardCut: s := cutText; else // unsupported operation s := ''; end; if s <> '' then begin s := s + LineEnding + uriList; Clipboard.AddFormat(CFU_GNOME_COPIED_FILES, s[1], Length(s)); end; end; { KDE } if CFU_KDE_CUT_SELECTION <> 0 then begin case ClipboardOp of ClipboardCopy: s := '0'; ClipboardCut: s := '1'; else // unsupported operation s := ''; end; if s <> '' then Clipboard.AddFormat(CFU_KDE_CUT_SELECTION, s[1], Length(s)); end; // Common to all, plain text. Clipboard.AddFormat(PredefinedClipboardFormat(pcfText), plainList[1], Length(plainList)); // Send also as URI-list. if CFU_URI_LIST <> 0 then Clipboard.AddFormat(CFU_URI_LIST, uriList[1], Length(uriList)); Clipboard.Close; Result := True; {$ENDIF} end; function CopyToClipboard(const filenames:TStringList):Boolean; begin Result := SendToClipboard(filenames, ClipboardCopy); end; function CutToClipboard(const filenames:TStringList):Boolean; begin Result := SendToClipboard(filenames, ClipboardCut); end; function PasteFromClipboard(out ClipboardOp: TClipboardOperation; out filenames:TStringList):Boolean; {$IFDEF MSWINDOWS} var hGlobalBuffer: HGLOBAL; pBuffer: LPVOID; PreferredEffect: DWORD; {$ELSE IF DEFINED(UNIX)} var formatId: TClipboardFormat; uriList: String; s: String; {$ENDIF} begin filenames := nil; Result := False; // Default to 'copy' if effect hasn't been given. ClipboardOp := ClipboardCopy; {$IFDEF MSWINDOWS} if OpenClipboard(0) = False then Exit; if CFU_PREFERRED_DROPEFFECT <> 0 then begin hGlobalBuffer := GetClipboardData(CFU_PREFERRED_DROPEFFECT); if hGlobalBuffer <> 0 then begin pBuffer := GlobalLock(hGlobalBuffer); if pBuffer <> nil then begin PreferredEffect := PDWORD(pBuffer)^; if PreferredEffect = DROPEFFECT_COPY then ClipboardOp := ClipboardCopy else if PreferredEffect = DROPEFFECT_MOVE then ClipboardOp := ClipboardCut; GlobalUnlock(hGlobalBuffer); end; end; end; { Now, retrieve file names. } hGlobalBuffer := GetClipboardData(CF_HDROP); filenames := uOleDragDrop.TFileDropTarget.GetDropFilenames(hGlobalBuffer); if Assigned(filenames) then Result := True; CloseClipboard; {$ELSE IF DEFINED(UNIX)} uriList := ''; // Check if clipboard is not empty. if Clipboard.FormatCount = 0 then Exit; { Gnome } formatId := Clipboard.FindFormatID(gnomeClipboardMime); if formatId <> 0 then begin s := GetClipboardFormatAsString(formatId); { Format is: 'cut' or 'copy' + line ending character, followed by an URI-list delimited with line ending characters. Filenames may be UTF-8 encoded. e.g. cut#10file://host/path/to/file/name%C4%85%C3%B3%C5%9B%C5%BA%C4%87 } { Check operation } if (Length(s) >= Length(CutText)) and (CompareChar(s[1], CutText, Length(CutText)) = 0) then begin ClipboardOp := ClipboardCut; uriList := Copy(s, 1 + Length(CutText), Length(s)-Length(CutText)); end else if (Length(s) >= Length(CopyText)) and (CompareChar(s[1], CopyText, Length(CopyText)) = 0) then begin ClipboardOp := ClipboardCopy; uriList := Copy(s, 1 + Length(CopyText), Length(s)-Length(CopyText)); end; if Length(uriList) > 0 then uriList := URIDecode(Trim(uriList)); end else { KDE } begin formatId := Clipboard.FindFormatID(kdeClipboardMime); if formatId <> 0 then begin s := GetClipboardFormatAsString(formatId); { We should have a single char: '1' if 'cut', '0' if 'copy'. } { No uri-list in this target. } if Length(s) > 0 then begin if s[1] = '1' then ClipboardOp := ClipboardCut else ClipboardOp := ClipboardCopy; end; end; end; { Common formats } if uriList = '' then begin // Try to read one of the text formats. // The URIs in targets like STRING, UTF8_STRING, etc. are not encoded. // First try default target choosing behaviour. // Some buggy apps, however, supply UTF8_STRING or other targets // with 0 size and it's not detected by this function under gtk. uriList := Clipboard.AsText; // Next, try URI encoded list. if uriList = '' then begin uriList := GetClipboardFormatAsString(uriListMime); if Length(uriList) > 0 then uriList := URIDecode(Trim(uriList)); end; // Try plain texts now. // On non-UTF8 systems these should be encoded in system locale, // and may be displayed badly, but will be copied successfully. if uriList = '' then begin uriList := GetClipboardFormatAsString('STRING'); end; if uriList = '' then begin uriList := GetClipboardFormatAsString(textPlainMime); end; // If still nothing, then maybe the clipboard has no data in text format. if uriList = '' then Exit; end; filenames := ExtractFilenames(uriList); if (filenames <> nil) and (filenames.Count > 0) then Result := True; {$ENDIF} end; procedure ClearClipboard; {$IFDEF MSWINDOWS} begin if OpenClipboard(0) then begin EmptyClipboard; CloseClipboard; end; end; {$ELSE} begin Clipboard.Open; Clipboard.AsText := ''; Clipboard.Close; end; {$ENDIF} initialization RegisterUserFormats; end. doublecmd-0.5.8/src/platform/uterminal.pas0000644000175000017500000000625511740433676017651 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Terminal emulator abstract class Copyright (C) 2009-2010 Koblov Alexander (Alexx2000@mail.ru) Based on terminal emulator implementation Copyright (C) 2008 Dmitry Kolomiets (B4rr4cuda@rambler.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uTerminal; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uCmdBox; type Cint = Integer; { TTerminal } TTerminal = class protected FChildPid: THandle; Fpty: LongInt; public {en Read info from pty } function Read_pty(var Output: UTF8String; const TimeOut: LongInt = 10): LongInt; virtual; abstract; {en Create new pty and start cmd } function Fork_pty(const RowCount, ColCount: Integer; const Command: UTF8String; const Params: UTF8String = ''): THandle; virtual; abstract; {en Write string to pty } function Write_pty(const Input: UTF8String): Boolean; virtual; abstract; //--------------------- function SendBreak_pty(): Boolean; virtual; abstract; // ^C function SendSignal_pty(Sig: Cint): Boolean; virtual; abstract; function SetScreenSize(ColCount, RowCount: Integer): Boolean; virtual; abstract; function SetCurrentDir(const NewDir: UTF8String): Boolean; virtual; abstract; //--------------------- function KillShell: LongInt; virtual; abstract; function CSI_GetTaskId(const buf:UTF8string):integer; virtual; abstract; //get index of sequence in CSILast list //---------------------} property ShellPid: THandle read FChildPid; property PtyPid: LongInt read Fpty; end; { TConsoleThread } TConsoleThread = class(TThread) protected FLock: System.TRTLCriticalSection; FTerm: TTerminal; FBuf: UTF8String; FRowsCount, FColsCount: Integer; FOut: TCmdBox; FShell: String; public property Terminal: TTerminal read FTerm; property RowsCount: Integer read FRowsCount write FRowsCount; property ColsCount: Integer read FColsCount write FColsCount; property CmdBox: TCmdBox read FOut write FOut; property Shell: String read FShell write FShell; end; function CreateConsoleThread: TConsoleThread; implementation uses {$IF DEFINED(WINDOWS)} uWinTerm; {$ELSEIF DEFINED(UNIX)} uUnixTerm; {$ENDIF} function CreateConsoleThread: TConsoleThread; {$IF DEFINED(WINDOWS)} begin Result:= TWinConThread.Create; end; {$ELSEIF DEFINED(UNIX)} begin Result:= TUnixConThread.Create; end; {$ENDIF} end. doublecmd-0.5.8/src/platform/uosforms.pas0000644000175000017500000003604712217353547017526 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- This unit contains platform depended functions. Copyright (C) 2006-2013 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uOSForms; {$mode delphi}{$H+} interface uses LCLType, Forms, Classes, SysUtils, Controls, uDrive, uFile, uFileSource; type { TAloneForm } TAloneForm = class(TForm) {$IF DEFINED(DARWIN) AND DEFINED(LCLQT)} protected procedure DoClose(var CloseAction: TCloseAction); override; {$ELSEIF DEFINED(LCLWIN32)} public constructor Create(TheOwner: TComponent); override; {$ENDIF} end; { TModalForm } TModalForm = class(TForm) {$IF DEFINED(LCLWIN32)} private FParentWindow: HWND; procedure CloseModal; protected procedure CreateParams(var Params: TCreateParams); override; public function ShowModal: Integer; override; {$ENDIF} end; {en Must be called on main form create @param(MainForm Main form) } procedure MainFormCreate(MainForm : TCustomForm); {en Show file/folder properties dialog @param(Files List of files to show properties for) } procedure ShowFilePropertiesDialog(aFileSource: IFileSource; const Files: TFiles); {en Show file/folder context menu @param(Parent Parent window) @param(Files List of files to show context menu for. It is freed by this function.) @param(X Screen X coordinate) @param(Y Screen Y coordinate) @param(CloseEvent Method called when popup menu is closed (optional)) } procedure ShowContextMenu(Parent: TWinControl; var Files : TFiles; X, Y : Integer; Background: Boolean; CloseEvent: TNotifyEvent); {en Show drive context menu @param(Parent Parent window) @param(sPath Path to drive) @param(X Screen X coordinate) @param(Y Screen Y coordinate) @param(CloseEvent Method called when popup menu is closed (optional)) } procedure ShowDriveContextMenu(Parent: TWinControl; ADrive: PDrive; X, Y : Integer; CloseEvent: TNotifyEvent); {en Show open icon dialog @param(Owner Owner) @param(sFileName Icon file name) @returns(The function returns @true if successful, @false otherwise) } function ShowOpenIconDialog(Owner: TCustomControl; var sFileName : String) : Boolean; implementation uses ExtDlgs, LCLProc, uShellContextMenu {$IF DEFINED(MSWINDOWS)} , Menus, Graphics, ComObj, fMain, DCOSUtils, uOSUtils, uFileSystemFileSource , uTotalCommander, InterfaceBase, FileUtil, Windows, ShlObj, uShlObjAdditional , uWinNetFileSource, uVfsModule, uLng, uMyWindows, LMessages, WSForms, LCLIntf , uThumbnailProvider {$ENDIF} {$IFDEF UNIX} , BaseUnix, fFileProperties, uJpegThumb {$IF NOT DEFINED(DARWIN)} , uMagickWand {$ELSE} , MacOSAll {$ENDIF} {$ENDIF}; { TAloneForm } {$IF DEFINED(DARWIN) AND DEFINED(LCLQT)} var FMain, FBefore, FCurrent: TCustomForm; procedure TAloneForm.DoClose(var CloseAction: TCloseAction); procedure TrySetFocus(Form: TCustomForm); inline; begin if Form.CanFocus then Form.SetFocus; end; var psnFront, psnCurrent: ProcessSerialNumber; begin inherited DoClose(CloseAction); if (GetCurrentProcess(psnCurrent) = noErr) and (GetFrontProcess(psnFront) = noErr) then begin // Check that our process is active if (psnCurrent.lowLongOfPSN = psnFront.lowLongOfPSN) and (psnCurrent.highLongOfPSN = psnFront.highLongOfPSN) then begin // Restore active form if (Screen.CustomFormIndex(FBefore) < 0) then TrySetFocus(FMain) else if (FBefore <> Self) then TrySetFocus(FBefore) else FBefore:= FMain; end; end; end; procedure ActiveFormChangedHandler(Self, Sender: TObject; Form: TCustomForm); begin if (Form is TAloneForm) or (FMain = Form) then begin if FCurrent <> Form then begin FBefore:= FCurrent; FCurrent:= Form; end; end; end; {$ELSEIF DEFINED(LCLWIN32)} constructor TAloneForm.Create(TheOwner: TComponent); begin inherited Create(TheOwner); if ShowInTaskBar = stAlways then // Set window owner to zero, so it will be really standalone window SetWindowLong(Handle, GWL_HWNDPARENT, 0); end; { TModalForm } procedure TModalForm.CloseModal; var CloseAction: TCloseAction; begin try CloseAction := caNone; if CloseQuery then begin CloseAction := caHide; DoClose(CloseAction); end; case CloseAction of caNone: ModalResult := 0; caFree: Release; end; { do not call widgetset CloseModal here, but in ShowModal to guarantee execution of it } except ModalResult := 0; Application.HandleException(Self); end; end; procedure TModalForm.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); if FParentWindow <> 0 then begin Params.Style := Params.Style or WS_POPUP; Params.WndParent := FParentWindow; end; end; function TModalForm.ShowModal: Integer; procedure RaiseShowModalImpossible; var s: String; begin DebugLn('TModalForm.ShowModal Visible=',dbgs(Visible),' Enabled=',dbgs(Enabled), ' fsModal=',dbgs(fsModal in FFormState),' MDIChild=',dbgs(FormStyle = fsMDIChild)); s:='TCustomForm.ShowModal for '+DbgSName(Self)+' impossible, because'; if Visible then s:=s+' already visible (hint for designer forms: set Visible property to false)'; if not Enabled then s:=s+' not enabled'; if fsModal in FFormState then s:=s+' already modal'; if FormStyle = fsMDIChild then s:=s+' FormStyle=fsMDIChild'; raise EInvalidOperation.Create(s); end; var SavedFocusState: TFocusState; ActiveWindow: HWnd; begin if Self = nil then raise EInvalidOperation.Create('TModalForm.ShowModal Self = nil'); if Application.Terminated then ModalResult := 0; // Cancel drags DragManager.DragStop(false); // Close popupmenus if ActivePopupMenu <> nil then ActivePopupMenu.Close; if Visible or (not Enabled) or (FormStyle = fsMDIChild) then RaiseShowModalImpossible; // Kill capture when opening another dialog if GetCapture <> 0 then SendMessage(GetCapture, LM_CANCELMODE, 0, 0); ReleaseCapture; ActiveWindow := GetActiveWindow; // If parent window is normal window then call inherited method if GetWindowLong(ActiveWindow, GWL_HWNDPARENT) <> 0 then Result:= inherited ShowModal else begin Include(FFormState, fsModal); FParentWindow := ActiveWindow; SavedFocusState := SaveFocusState; Screen.MoveFormToFocusFront(Self); ModalResult := 0; try EnableWindow(FParentWindow, False); // If window already created then recreate it to force // call CreateParams with appropriate parent window if HandleAllocated then RecreateWnd(Self); Show; try // Activate must happen after show Perform(CM_ACTIVATE, 0, 0); TWSCustomFormClass(WidgetSetClass).ShowModal(Self); repeat { Delphi calls Application.HandleMessage But HandleMessage processes all pending events and then calls idle, which will wait for new messages. Under Win32 there is always a next message, so it works there. The LCL is OS independent, and so it uses a better way: } try WidgetSet.AppProcessMessages; // process all events except if Application.CaptureExceptions then Application.HandleException(Self) else raise; end; if Application.Terminated then ModalResult := mrCancel; if ModalResult <> 0 then begin CloseModal; if ModalResult <> 0 then Break; end; Application.Idle(true); until False; Result := ModalResult; if HandleAllocated and (GetActiveWindow <> Handle) then ActiveWindow := 0; finally { Guarantee execution of widgetset CloseModal } TWSCustomFormClass(WidgetSetClass).CloseModal(Self); // Set our modalresult to mrCancel before hiding. if ModalResult = 0 then ModalResult := mrCancel; EnableWindow(FParentWindow, True); // Needs to be called only in ShowModal Perform(CM_DEACTIVATE, 0, 0); Exclude(FFormState, fsModal); end; finally RestoreFocusState(SavedFocusState); if LCLIntf.IsWindow(ActiveWindow) then SetActiveWindow(ActiveWindow); // Hide window when focus already changed back // to parent window to avoid blinking ShowWindow(Handle, SW_HIDE); Visible := False; end; end; end; {$ENDIF} var ShellContextMenu : TShellContextMenu = nil; {$IFDEF MSWINDOWS} procedure ActivateHandler(Self, Sender: TObject); var I: Integer = 0; begin with Screen do begin while (I < CustomFormCount) and (((CustomFormsZOrdered[I] is TModalForm) and ((CustomFormsZOrdered[I] as TModalForm).FParentWindow <> 0)) or not (fsModal in CustomFormsZOrdered[I].FormState)) do Inc(I); // If modal form exists then activate it if (I >= 0) and (I < CustomFormCount) then CustomFormsZOrdered[I].BringToFront; end; end; {$ENDIF} procedure MainFormCreate(MainForm : TCustomForm); {$IFDEF MSWINDOWS} var Handler: TMethod; begin Handler.Code:= @ActivateHandler; Handler.Data:= MainForm; // Setup application OnActivate handler Application.AddOnActivateHandler(TNotifyEvent(Handler), True); // Disable application button on taskbar with Widgetset do SetWindowLong(AppHandle, GWL_EXSTYLE, GetWindowLong(AppHandle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW); // Emulate Total Commander window CreateTotalCommanderWindow(MainForm.Handle); // Register network file source RegisterVirtualFileSource(rsVfsNetwork, TWinNetFileSource); if (Win32MajorVersion > 5) and IsUserAdmin then // if run under administrator MainForm.Caption:= MainForm.Caption + ' - Administrator'; end; {$ELSE} {$IF DEFINED(DARWIN) AND DEFINED(LCLQT)} var Handler: TMethod; {$ENDIF} begin if fpGetUID = 0 then // if run under root MainForm.Caption:= MainForm.Caption + ' - ROOT PRIVILEGES'; {$IF DEFINED(DARWIN) AND DEFINED(LCLQT)} FMain:= MainForm; Handler.Data:= MainForm; Handler.Code:= @ActiveFormChangedHandler; Screen.AddHandlerActiveFormChanged(TScreenFormEvent(Handler), True); {$ENDIF} end; {$ENDIF} procedure ShowContextMenu(Parent: TWinControl; var Files : TFiles; X, Y : Integer; Background: Boolean; CloseEvent: TNotifyEvent); {$IFDEF MSWINDOWS} begin if Files.Count = 0 then begin FreeAndNil(Files); Exit; end; try // Create new context menu ShellContextMenu:= TShellContextMenu.Create(Parent, Files, Background); ShellContextMenu.OnClose := CloseEvent; // Show context menu ShellContextMenu.PopUp(X, Y); finally // Free created menu FreeThenNil(ShellContextMenu); end; end; {$ELSE} begin if Files.Count = 0 then begin FreeAndNil(Files); Exit; end; // Free previous created menu FreeThenNil(ShellContextMenu); // Create new context menu ShellContextMenu:= TShellContextMenu.Create(nil, Files, Background); ShellContextMenu.OnClose := CloseEvent; // Show context menu ShellContextMenu.PopUp(X, Y); end; {$ENDIF} procedure ShowDriveContextMenu(Parent: TWinControl; ADrive: PDrive; X, Y : Integer; CloseEvent: TNotifyEvent); {$IFDEF MSWINDOWS} var aFile: TFile; Files: TFiles; begin aFile := TFileSystemFileSource.CreateFile(EmptyStr); aFile.FullPath := ADrive^.Path; aFile.Attributes := faFolder; Files:= TFiles.Create(EmptyStr); // free in ShowContextMenu Files.Add(aFile); ShowContextMenu(Parent, Files, X, Y, False, CloseEvent); end; {$ELSE} begin // Free previous created menu FreeThenNil(ShellContextMenu); // Create new context menu ShellContextMenu:= TShellContextMenu.Create(nil, ADrive); ShellContextMenu.OnClose := CloseEvent; // show context menu ShellContextMenu.PopUp(X, Y); end; {$ENDIF} (* Show file properties dialog *) procedure ShowFilePropertiesDialog(aFileSource: IFileSource; const Files: TFiles); {$IFDEF UNIX} begin ShowFileProperties(aFileSource, Files); end; {$ELSE} var cmici: TCMINVOKECOMMANDINFO; contMenu: IContextMenu; begin if Files.Count = 0 then Exit; try contMenu := GetShellContextMenu(frmMain.Handle, Files, False); if Assigned(contMenu) then begin FillChar(cmici, sizeof(cmici), #0); with cmici do begin cbSize := sizeof(cmici); hwnd := frmMain.Handle; lpVerb := sCmdVerbProperties; nShow := SW_SHOWNORMAL; end; OleCheckUTF8(contMenu.InvokeCommand(cmici)); end; except on e: EOleError do raise EContextMenuException.Create(e.Message); end; end; {$ENDIF} function ShowOpenIconDialog(Owner: TCustomControl; var sFileName : String) : Boolean; var opdDialog : TOpenPictureDialog; {$IFDEF MSWINDOWS} sFilter : String; iPos, iIconIndex: Integer; bAlreadyOpen : Boolean; {$ENDIF} begin opdDialog := nil; {$IFDEF MSWINDOWS} sFilter := GraphicFilter(TGraphic)+'|'+ 'Programs and Libraries (*.exe;*.dll)|*.exe;*.dll'+'|'+ Format('All files (%s)|%s',[GetAllFilesMask, GetAllFilesMask]); bAlreadyOpen := False; iPos :=Pos(',', sFileName); if iPos <> 0 then begin iIconIndex := StrToIntDef(Copy(sFileName, iPos + 1, Length(sFileName) - iPos), 0); sFileName := Copy(sFileName, 1, iPos - 1); end else begin opdDialog := TOpenPictureDialog.Create(Owner); opdDialog.Filter:= sFilter; opdDialog.FileName := sFileName; Result:= opdDialog.Execute; sFileName := opdDialog.FileName; bAlreadyOpen := True; end; if FileIsExeLib(sFileName) then begin Result := SHChangeIconDialog(Owner.Handle, sFileName, iIconIndex); if Result then sFileName := sFileName + ',' + IntToStr(iIconIndex); end else if not bAlreadyOpen then {$ENDIF} begin opdDialog := TOpenPictureDialog.Create(Owner); {$IFDEF MSWINDOWS} opdDialog.Filter:= sFilter; {$ENDIF} opdDialog.FileName := sFileName; Result:= opdDialog.Execute; sFileName := opdDialog.FileName; {$IFDEF MSWINDOWS} bAlreadyOpen := True; {$ENDIF} end; if Assigned(opdDialog) then FreeAndNil(opdDialog); end; finalization FreeThenNil(ShellContextMenu); end. doublecmd-0.5.8/src/platform/udragdropqt.pas0000644000175000017500000003032011740433676020173 0ustar alexxalexx{ Drag&Drop operations for QT. } unit uDragDropQt; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Controls, uDragDropEx, qt4, qtwidgets; type TDragDropSourceQT = class(TDragDropSource) function RegisterEvents(DragBeginEvent : uDragDropEx.TDragBeginEvent; RequestDataEvent: uDragDropEx.TRequestDataEvent; DragEndEvent : uDragDropEx.TDragEndEvent): Boolean; override; function DoDragDrop(const FileNamesList: TStringList; MouseButton: TMouseButton; ScreenStartPoint: TPoint): Boolean; override; private function GetWidget: QWidgetH; end; TDragDropTargetQT = class(TDragDropTarget) public constructor Create(TargetControl: TWinControl); override; function RegisterEvents(DragEnterEvent: uDragDropEx.TDragEnterEvent; DragOverEvent : uDragDropEx.TDragOverEvent; DropEvent : uDragDropEx.TDropEvent; DragLeaveEvent: uDragDropEx.TDragLeaveEvent): Boolean; override; procedure UnregisterEvents; override; private FEventHook : QObject_hookH; function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; // called by QT function GetWidget: QWidgetH; function HasSupportedFormat(DropEvent: QDropEventH): Boolean; function OnDragEnter(DragEnterEvent: QDragEnterEventH): Boolean; function OnDragOver(DragMoveEvent: QDragMoveEventH): Boolean; function OnDrop(DropEvent: QDropEventH): Boolean; function OnDragLeave(DragLeaveEvent: QDragLeaveEventH): Boolean; end; function QtActionToDropEffect(Action: QtDropAction): TDropEffect; function DropEffectToQtAction(DropEffect: TDropEffect): QtDropAction; function QtDropEventPointToLCLPoint(const PDropEventPoint: PQtPoint): TPoint; implementation uses uClipboard, LCLIntf; const uriListMimeW : WideString = uriListMime; textPlainMimeW : WideString = textPlainMime; function GetWidgetFromLCLControl(AWinControl: TWinControl): QWidgetH; inline; begin // Custom controls (TQtCustomControl) are created by LCL as // QAbstractScrollArea with a viewport (and two scrollbars). // We want the viewport to be the source/target of drag&drop, so we use // GetContainerWidget which returns the viewport widget for custom controls // and regular widget handle for others. Result := TQtWidget(AWinControl.Handle).GetContainerWidget; end; { ---------- TDragDropSourceQT ---------- } function TDragDropSourceQT.RegisterEvents(DragBeginEvent : uDragDropEx.TDragBeginEvent; RequestDataEvent: uDragDropEx.TRequestDataEvent; DragEndEvent : uDragDropEx.TDragEndEvent): Boolean; begin inherited; // RequestDataEvent is not handled in QT. Result := True; end; function TDragDropSourceQT.DoDragDrop(const FileNamesList: TStringList; MouseButton: TMouseButton; ScreenStartPoint: TPoint): Boolean; procedure SetMimeDataInFormat(MimeData: QMimeDataH; MimeType: WideString; DataString: AnsiString); var ByteArray: QByteArrayH; begin ByteArray := QByteArray_create(PAnsiChar(DataString)); try QMimeData_setData(MimeData, @MimeType, ByteArray); finally QByteArray_destroy(ByteArray); end; end; var DragObject: QDragH = nil; MimeData: QMimeDataH = nil; begin Result := False; // Simulate drag-begin event. if Assigned(GetDragBeginEvent) then begin Result := GetDragBeginEvent()(); if Result = False then Exit; end; DragObject := QDrag_create(GetWidget); // deleted automatically by QT try MimeData := QMimeData_create; QDrag_setMimeData(DragObject, MimeData); // MimeData owned by DragObject after this SetMimeDataInFormat(MimeData, uriListMimeW, FormatUriList(FileNamesList)); SetMimeDataInFormat(MimeData, textPlainMimeW, FormatTextPlain(FileNamesList)); except QDrag_destroy(DragObject); raise; end; // Start drag&drop operation (default to Copy action). QDrag_exec(DragObject, QtCopyAction or QtLinkAction or QtMoveAction, qtCopyAction); // Simulate drag-end event. if Assigned(GetDragEndEvent) then begin if Result = True then Result := GetDragEndEvent()() else GetDragEndEvent()() end; end; function TDragDropSourceQT.GetWidget: QWidgetH; begin Result := GetWidgetFromLCLControl(GetControl); end; { ---------- TDragDropTargetQT ---------- } constructor TDragDropTargetQT.Create(TargetControl: TWinControl); begin inherited; FEventHook := nil; end; function TDragDropTargetQT.RegisterEvents(DragEnterEvent: uDragDropEx.TDragEnterEvent; DragOverEvent : uDragDropEx.TDragOverEvent; DropEvent : uDragDropEx.TDropEvent; DragLeaveEvent: uDragDropEx.TDragLeaveEvent): Boolean; begin inherited; QWidget_setAcceptDrops(GetWidget, True); if Assigned(FEventHook) then QObject_hook_destroy(FEventHook); // Tap into target widget's events. FEventHook := QObject_hook_create(GetWidget); QObject_hook_hook_events(FEventHook, @EventFilter); Result := True; end; procedure TDragDropTargetQT.UnregisterEvents; begin QWidget_setAcceptDrops(GetWidget, False); if Assigned(FEventHook) then begin QObject_hook_destroy(FEventHook); FEventHook := nil; end; inherited; end; function TDragDropTargetQT.GetWidget: QWidgetH; begin Result := GetWidgetFromLCLControl(GetControl); end; function TDragDropTargetQT.HasSupportedFormat(DropEvent: QDropEventH): Boolean; var MimeData: QMimeDataH; begin MimeData := QDropEvent_mimeData(DropEvent); if Assigned(MimeData) then begin if QMimeData_hasFormat(mimedata, @urilistmimew) or QMimeData_hasFormat(mimedata, @textPlainMimeW) then Exit(True); end; Result := False; end; function TDragDropTargetQT.EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; begin Result := False; // False means the event is not filtered out. case QEvent_type(Event) of QEventDragEnter: begin QEvent_accept(Event); OnDragEnter(QDragEnterEventH(Event)); end; QEventDragMove: begin QEvent_accept(Event); OnDragOver(QDragMoveEventH(Event)); end; QEventDrop: begin QEvent_accept(Event); OnDrop(QDropEventH(Event)); end; QEventDragLeave: begin QEvent_accept(Event); OnDragLeave(QDragLeaveEventH(Event)); end; // QEventDragResponse - used internally by QT end; end; function TDragDropTargetQT.OnDragEnter(DragEnterEvent: QDragEnterEventH): Boolean; var CursorPosition: TPoint; DropEffect: TDropEffect; DropEvent: QDropEventH; QtAction: QtDropAction; begin // QDragEnterEvent inherits from QDragMoveEvent, which inherits from QDropEvent. DropEvent := QDropEventH(DragEnterEvent); if not HasSupportedFormat(DropEvent) then begin QDropEvent_setDropAction(DropEvent, QtIgnoreAction); Result := False; end else if Assigned(GetDragEnterEvent) then begin DropEffect := QtActionToDropEffect(QDropEvent_proposedAction(DropEvent)); CursorPosition := QtDropEventPointToLCLPoint(QDropEvent_pos(DropEvent)); CursorPosition := GetControl.ClientToScreen(CursorPosition); Result := GetDragEnterEvent()(DropEffect, CursorPosition); if Result then QtAction := DropEffectToQtAction(DropEffect) else QtAction := QtIgnoreAction; QDropEvent_setDropAction(DropEvent, QtAction); end else begin QDropEvent_acceptProposedAction(DropEvent); Result := True; end; end; function TDragDropTargetQT.OnDragOver(DragMoveEvent: QDragMoveEventH): Boolean; var CursorPosition: TPoint; DropEffect: TDropEffect; DropEvent: QDropEventH; QtAction: QtDropAction; begin // QDragMoveEvent inherits from QDropEvent. DropEvent := QDropEventH(DragMoveEvent); if not HasSupportedFormat(DropEvent) then begin QDropEvent_setDropAction(DropEvent, QtIgnoreAction); Result := False; end else if Assigned(GetDragOverEvent) then begin DropEffect := QtActionToDropEffect(QDropEvent_proposedAction(DropEvent)); CursorPosition := QtDropEventPointToLCLPoint(QDropEvent_pos(DropEvent)); CursorPosition := GetControl.ClientToScreen(CursorPosition); Result := GetDragOverEvent()(DropEffect, CursorPosition); if Result then QtAction := DropEffectToQtAction(DropEffect) else QtAction := QtIgnoreAction; QDropEvent_setDropAction(DropEvent, QtAction); end else begin QDropEvent_acceptProposedAction(DropEvent); Result := True; end; end; function TDragDropTargetQT.OnDrop(DropEvent: QDropEventH): Boolean; function GetMimeDataInFormat(MimeData: QMimeDataH; MimeType: WideString): AnsiString; var ByteArray: QByteArrayH; Size: Integer; Data: PAnsiChar; begin if QMimeData_hasFormat(MimeData, @MimeType) then begin ByteArray := QByteArray_create(); try QMimeData_data(MimeData, ByteArray, @MimeType); Size := QByteArray_size(ByteArray); Data := QByteArray_data(ByteArray); if (Size > 0) and Assigned(Data) then SetString(Result, Data, Size); finally QByteArray_destroy(ByteArray); end; end else Result := ''; end; var DropAction: QtDropAction; DropEffect: TDropEffect; CursorPosition: TPoint; uriList: String; FileNamesList: TStringList = nil; MimeData: QMimeDataH; begin Result := False; // QDropEvent_possibleActions() returns all actions allowed by the source. // QDropEvent_proposedAction() is the action proposed by the source. DropAction := QDropEvent_dropAction(DropEvent); // action to be performed by the target DropEffect := QtActionToDropEffect(DropAction); CursorPosition := QtDropEventPointToLCLPoint(QDropEvent_pos(dropEvent)); CursorPosition := GetControl.ClientToScreen(CursorPosition); QDropEvent_setDropAction(DropEvent, QtIgnoreAction); // default to ignoring the drop MimeData := QDropEvent_mimeData(DropEvent); if Assigned(GetDropEvent) and Assigned(MimeData) then begin if QMimeData_hasFormat(MimeData, @uriListMimeW) then uriList := URIDecode(Trim(GetMimeDataInFormat(MimeData, uriListMimeW))) else if QMimeData_hasFormat(MimeData, @textPlainMimeW) then // try decoding, as text/plain may also be percent-encoded uriList := URIDecode(Trim(GetMimeDataInFormat(MimeData, textPlainMimeW))) else Exit; // reject the drop try FileNamesList := ExtractFilenames(uriList); if Assigned(FileNamesList) and (FileNamesList.Count > 0) then Result := GetDropEvent()(FileNamesList, DropEffect, CursorPosition); finally if Assigned(FileNamesList) then FreeAndNil(FileNamesList); end; QDropEvent_setDropAction(DropEvent, DropAction); // accept the drop end; end; function TDragDropTargetQT.OnDragLeave(DragLeaveEvent: QDragLeaveEventH): Boolean; begin if Assigned(GetDragLeaveEvent) then Result := GetDragLeaveEvent()() else Result := True; end; { ---------------------------------------------------------------------------- } function QtActionToDropEffect(Action: QtDropAction): TDropEffect; begin case Action of QtCopyAction: Result := DropCopyEffect; QtMoveAction: Result := DropMoveEffect; QtTargetMoveAction: Result := DropMoveEffect; QtLinkAction: Result := DropLinkEffect; else Result := DropNoEffect; end; end; function DropEffectToQtAction(DropEffect: TDropEffect): QtDropAction; begin case DropEffect of DropCopyEffect: Result := QtCopyAction; DropMoveEffect: Result := QtMoveAction; DropLinkEffect: Result := QtLinkAction; else Result := QtIgnoreAction; end; end; function QtDropEventPointToLCLPoint(const PDropEventPoint: PQtPoint): TPoint; begin if Assigned(PDropEventPoint) then begin if (PDropEventPoint^.x <> 0) or (PDropEventPoint^.y <> 0) then begin Result.X := PDropEventPoint^.x; Result.Y := PDropEventPoint^.y; Exit; end; end; GetCursorPos(Result); end; end. doublecmd-0.5.8/src/platform/uinfotooltip.pas0000644000175000017500000001362611740427612020375 0ustar alexxalexxunit uInfoToolTip; {$mode objfpc}{$H+} interface uses Classes, SysUtils, fgl, DCXmlConfig, uFile, uFileSource; type { THintItem } THintItem = class Name: UTF8String; Mask: UTF8String; Hint: UTF8String; function Clone: THintItem; end; { THintItemList } THintItemList = specialize TFPGObjectList; { TFileInfoToolTip } TFileInfoToolTip = class(TPersistent) protected FHintItemList: THintItemList; public constructor Create; destructor Destroy; override; procedure Assign(Source: TPersistent); override; procedure Clear; function GetFileInfoToolTip(aFileSource: IFileSource; const aFile: TFile): UTF8String; procedure Load(AConfig: TXmlConfig; ANode: TXmlNode); procedure Save(AConfig: TXmlConfig; ANode: TXmlNode); property HintItemList: THintItemList read FHintItemList; end; function GetFileInfoToolTip(aFileSource: IFileSource; const aFile: TFile): UTF8String; implementation uses LCLProc, StrUtils, uMasks, uDebug, uGlobs, uFileProperty, uFileFunctions, uSearchTemplate, uFileSourceProperty {$IF DEFINED(MSWINDOWS)} , uShlObjAdditional {$ENDIF} ; function GetFileInfoToolTip(aFileSource: IFileSource; const aFile: TFile): UTF8String; function GetDefaultToolTip(const Hint: UTF8String): UTF8String; begin Result:= Hint; if fpModificationTime in aFile.SupportedProperties then with (aFile.Properties[fpModificationTime] as TFileModificationDateTimeProperty) do Result:= IfThen(Result = EmptyStr, EmptyStr, Result + LineEnding) + GetDescription + #58#32 + AsString; if fpSize in aFile.SupportedProperties then with (aFile.Properties[fpSize] as TFileSizeProperty) do Result:= IfThen(Result = EmptyStr, EmptyStr, Result + LineEnding) + GetDescription + #58#32 + AsString; if fpCompressedSize in aFile.SupportedProperties then with (aFile.Properties[fpCompressedSize] as TFileCompressedSizeProperty) do Result:= IfThen(Result = EmptyStr, EmptyStr, Result + LineEnding) + GetDescription + #58#32 + AsString; end; begin Result:= EmptyStr; if fspDirectAccess in aFileSource.Properties then begin Result:= StringReplace(gFileInfoToolTip.GetFileInfoToolTip(aFileSource, aFile), '\n', LineEnding, [rfReplaceAll]); {$IF DEFINED(MSWINDOWS)} Result:= IfThen(Result = EmptyStr, EmptyStr, Result + LineEnding) + SHGetInfoTip(aFile.Path, aFile.Name) {$ELSE} Result:= GetDefaultToolTip(Result); {$ENDIF} end else begin Result:= GetDefaultToolTip(Result); end; end; { THintItem } function THintItem.Clone: THintItem; begin Result:= THintItem.Create; Result.Name:= Name; Result.Mask:= Mask; Result.Hint:= Hint; end; { TFileInfoToolTip } constructor TFileInfoToolTip.Create; begin FHintItemList:= THintItemList.Create(True); end; destructor TFileInfoToolTip.Destroy; begin FreeThenNil(FHintItemList); inherited Destroy; end; procedure TFileInfoToolTip.Clear; begin begin while FHintItemList.Count > 0 do begin //FHintItemList[0].Free; FHintItemList.Delete(0); end; end; end; procedure TFileInfoToolTip.Assign(Source: TPersistent); var I: LongInt; From: TFileInfoToolTip; begin Clear; From:= Source as TFileInfoToolTip; for I:= 0 to From.FHintItemList.Count - 1 do FHintItemList.Add(From.FHintItemList[I].Clone); end; function TFileInfoToolTip.GetFileInfoToolTip(aFileSource: IFileSource; const aFile: TFile): UTF8String; var I, J: Integer; HintItem: THintItem; begin Result:= EmptyStr; for I:= 0 to FHintItemList.Count - 1 do begin HintItem:= FHintItemList[I]; // Get hint by search template if IsMaskSearchTemplate(HintItem.Mask) then for J:= 0 to gSearchTemplateList.Count - 1 do with gSearchTemplateList do begin if (Templates[J].TemplateName = PChar(HintItem.Mask)+1) and Templates[J].CheckFile(AFile) then begin Result:= FormatFileFunctions(HintItem.Hint, aFile, aFileSource); Exit; end; end; // Get hint by file mask if MatchesMaskList(AFile.Name, HintItem.Mask) then begin Result:= FormatFileFunctions(HintItem.Hint, aFile, aFileSource); Exit; end; end; end; procedure TFileInfoToolTip.Load(AConfig: TXmlConfig; ANode: TXmlNode); var sMask, sName, sHint: UTF8String; MaskItem: THintItem; begin Clear; ANode := ANode.FindNode('CustomFields'); if Assigned(ANode) then begin ANode := ANode.FirstChild; while Assigned(ANode) do begin if ANode.CompareName('CustomField') = 0 then begin if AConfig.TryGetValue(ANode, 'Name', sName) and AConfig.TryGetValue(ANode, 'Mask', sMask) and AConfig.TryGetValue(ANode, 'Hint', sHint) then begin MaskItem:= THintItem.Create; MaskItem.Name := sName; MaskItem.Mask := sMask; MaskItem.Hint := sHint; FHintItemList.Add(MaskItem); end else begin DCDebug('Invalid entry in configuration: ' + AConfig.GetPathFromNode(ANode) + '.'); end; end; ANode := ANode.NextSibling; end; end; end; procedure TFileInfoToolTip.Save(AConfig: TXmlConfig; ANode: TXmlNode); var I : Integer; SubNode: TXmlNode; begin ANode := AConfig.FindNode(ANode, 'CustomFields', True); AConfig.ClearNode(ANode); for I:=0 to FHintItemList.Count - 1 do begin SubNode := AConfig.AddNode(ANode, 'CustomField'); AConfig.AddValue(SubNode, 'Name', FHintItemList[I].Name); AConfig.AddValue(SubNode, 'Mask', FHintItemList[I].Mask); AConfig.AddValue(SubNode, 'Hint', FHintItemList[I].Hint); end; end; end. doublecmd-0.5.8/src/platform/utrash.pas0000644000175000017500000002503212154651644017146 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Some functions for working with trash Copyright (C) 2009-2013 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uTrash; {$mode objfpc}{$H+} interface uses Classes, SysUtils; // 30.04.2009 - this function move files and folders to trash can. function mbDeleteToTrash(const FileName: UTF8String): Boolean; // 14.05.2009 - this funсtion checks trash availability. function mbCheckTrash(sPath: UTF8String): Boolean; implementation uses DCOSUtils, {$IF DEFINED(MSWINDOWS)} Windows, ShellApi, Win32Int, InterfaceBase, uMyWindows {$ELSEIF DEFINED(UNIX)} BaseUnix, uMyUnix, DCStrUtils, uOSUtils, FileUtil {$IFDEF DARWIN} , MacOSAll, DynLibs, StrUtils {$ELSE} , uFileProcs, uClipboard {$ENDIF} {$ENDIF}; function mbDeleteToTrash(const FileName: UTF8String): Boolean; {$IF DEFINED(MSWINDOWS)} var wsFileName: WideString; FileOp: TSHFileOpStructW; dwFileAttributes: LongWord; begin wsFileName:= UTF8Decode(FileName); // Windows before Vista don't move symlink into recycle bin // correctly, so we return False in that case if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion < 6) then begin dwFileAttributes:= GetFileAttributesW(PWideChar(wsFileName)); if FPS_ISLNK(dwFileAttributes) and FPS_ISDIR(dwFileAttributes) then Exit(False); end; wsFileName:= wsFileName + #0; FillChar(FileOp, SizeOf(FileOp), 0); FileOp.Wnd := TWin32Widgetset(Widgetset).AppHandle; FileOp.wFunc := FO_DELETE; FileOp.pFrom := PWideChar(wsFileName); // Move without question FileOp.fFlags := FOF_ALLOWUNDO or FOF_NOERRORUI or FOF_SILENT or FOF_NOCONFIRMATION; Result := (SHFileOperationW(@FileOp) = 0) and (not FileOp.fAnyOperationsAborted); end; {$ELSEIF DEFINED(DARWIN)} type TFSMoveObjectToTrashSync = function( const (*var*) source: FSRef; var target: FSRef; options: OptionBits ): OSStatus; stdcall; var FSMoveObjectToTrash: TFSMoveObjectToTrashSync; CarbonLib: THandle; theSourceFSRef, theTargetFSRef: FSRef; newFileName: String; fullFileName: String; trashDir: String; dirList: array[0..100] of PChar; begin Result := False; CarbonLib := LoadLibrary('Carbon.framework/Versions/A/Carbon'); if CarbonLib <> NilHandle then begin try FSMoveObjectToTrash := TFSMoveObjectToTrashSync(GetProcedureAddress(CarbonLib, 'FSMoveObjectToTrashSync')); if Assigned(FSMoveObjectToTrash) then begin if (FSPathMakeRefWithOptions(PAnsiChar(FileName), kFSPathMakeRefDoNotFollowLeafSymlink, theSourceFSRef, nil) = noErr) then begin Result:= (FSMoveObjectToTrash(theSourceFSRef, theTargetFSRef, kFSFileOperationDefaultOptions) = noErr); Exit; end; end; { if } finally UnloadLibrary(CarbonLib); end; { try - finally } end; { if } { MacOSX 10.4 and below compatibility mode: - If file is in base drive, it gets moved to $HOME/.Trash - If file is in some other local drive, it gets moved to /Volumes/.Trashes/uid/ - If file is in network, it can't be moved to trash Trash folders are automatically created by OS at login and deleted if empty at logout. If a file with same name exists in trash folder, time is appended to filename } fullFileName := ExpandFileName(FileName); if AnsiStartsStr('/Volumes/', fullFileName) then begin // file is not located at base drive FillChar(dirList, SizeOf(dirList), 0); SysUtils.GetDirs(fullFileName, dirList); trashDir := Format('/Volumes/%s/.Trashes/%d/', [StrPas(dirList[1]), FpGetuid]); end { if } else trashDir := GetHomeDir + '/.Trash/'; // check if trash folder exists (e.g. network drives don't have one) if not mbDirectoryExists(trashDir) then begin Result := false; Exit; end; { if } newFileName := trashDir + ExtractFileName(FileName); if mbFileSystemEntryExists(newFileName) then newFileName := Format('%s %s', [newFileName, FormatDateTime('hh-nn-ss', Time)]); Result := mbRenameFile(FileName, newFileName); end; {$ELSEIF DEFINED(UNIX)} // This implementation is based on FreeDesktop.org "Trash Specification" // (http://www.freedesktop.org/wiki/Specifications/trash-spec) const trashFolder = '.Trash'; trashFiles = 'files'; trashInfo = 'info'; trashExt = '.trashinfo'; var sUserID: AnsiString; sTopDir, sFileName, sTemp, sNow, sHomeDir, sTrashInfoFile, sTrashDataFile: UTF8String; dtNow: TDateTime; st1, st2: Stat; function CreateTrashInfoFile: Boolean; var hFile: THandle; begin Result:= False; hFile:= mbFileCreate(sTrashInfoFile); if hFile <> feInvalidHandle then begin sTemp:= '[Trash Info]' + LineEnding; FileWrite(hFile, PChar(sTemp)[0], Length(sTemp)); sTemp:= 'Path=' + URIEncode(FileName) + LineEnding; FileWrite(hFile, PChar(sTemp)[0], Length(sTemp)); sTemp:= 'DeletionDate=' + FormatDateTime('YYYY-MM-DD', dtNow); sTemp:= sTemp + 'T' + FormatDateTime('hh:nn:ss', dtNow) + LineEnding; FileWrite(hFile, PChar(sTemp)[0], Length(sTemp)); FileClose(hFile); Result:= True; end; end; function TrashFile: Boolean; begin Result:= False; if CreateTrashInfoFile then begin Result:= (fpRename(UTF8ToSys(FileName), sTrashDataFile) >= 0); if not Result then mbDeleteFile(sTrashInfoFile); end; end; begin Result:= False; dtNow:= Now; sNow:= IntToStr(Trunc(dtNow * 86400000)); // The time in milliseconds sFileName:= ExtractOnlyFileName(FileName) + '_' + sNow + ExtractFileExt(FileName); // Get user home directory sHomeDir:= GetHomeDir; // Check if file in home directory if (fpLStat(PChar(UTF8ToSys(sHomeDir)), st1) >= 0) and (fpLStat(PChar(UTF8ToSys(FileName)), st2) >= 0) and (st1.st_dev = st2.st_dev) then begin // Get $XDG_DATA_HOME directory sTemp:= mbGetEnvironmentVariable('XDG_DATA_HOME'); if (Length(sTemp) = 0) then sTemp:= sHomeDir + '/.local/share/Trash' else sTemp:= IncludeTrailingPathDelimiter(sTemp) + 'Trash'; // Create destination directories if needed if (mbForceDirectory(sTemp + PathDelim + trashFiles) and mbForceDirectory(sTemp + PathDelim + trashInfo)) then begin sTrashInfoFile:= sTemp + PathDelim + trashInfo + PathDelim + sFileName + trashExt; sTrashDataFile:= sTemp + PathDelim + trashFiles + PathDelim + sFileName; Result:= TrashFile; Exit; end; end; sUserID:= IntToStr(fpGetUID); // Get “top directory” for file sTopDir:= FindMountPointPath(FileName); // Try to use "$topdir/.Trash/$uid" directory sTemp:= sTopDir + trashFolder; if (fpLStat(PChar(UTF8ToSys(sTemp)), st1) >= 0) and fpS_ISDIR(st1.st_mode) and not fpS_ISLNK(st1.st_mode) then begin sTemp:= sTemp + PathDelim + sUserID; // Create destination directories if needed if mbForceDirectory(sTemp + PathDelim + trashFiles) and mbForceDirectory(sTemp + PathDelim + trashInfo) then begin sTrashInfoFile:= sTemp + PathDelim + trashInfo + PathDelim + sFileName + trashExt; sTrashDataFile:= sTemp + PathDelim + trashFiles + PathDelim + sFileName; Result:= TrashFile; Exit; end; end; // Try to use "$topdir/.Trash-$uid" directory sTemp:= sTopDir + trashFolder + '-' + sUserID; if ((fpLStat(PChar(UTF8ToSys(sTemp)), st1) >= 0) and fpS_ISDIR(st1.st_mode) and not fpS_ISLNK(st1.st_mode)) or mbCreateDir(sTemp) then begin // Create destination directories if needed if mbForceDirectory(sTemp + PathDelim + trashFiles) and mbForceDirectory(sTemp + PathDelim + trashInfo) then begin sTrashInfoFile:= sTemp + PathDelim + trashInfo + PathDelim + sFileName + trashExt; sTrashDataFile:= sTemp + PathDelim + trashFiles + PathDelim + sFileName; Result:= TrashFile; Exit; end; end; end; {$ELSE} begin Result:= False; end; {$ENDIF} function mbCheckTrash(sPath: UTF8String): Boolean; {$IF DEFINED(MSWINDOWS)} const wsRoot: WideString = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\BitBucket\'; var Key: HKEY; Value: DWORD; ValueSize: LongInt; VolumeName: WideString; begin Result:= False; if not mbDirectoryExists(sPath) then Exit; ValueSize:= SizeOf(DWORD); // Windows Vista/Seven if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion >= 6) then begin VolumeName:= GetMountPointVolumeName(UTF8Decode(ExtractFileDrive(sPath))); VolumeName:= 'Volume' + PathDelim + ExtractVolumeGUID(VolumeName); if RegOpenKeyExW(HKEY_CURRENT_USER, PWideChar(wsRoot + VolumeName), 0, KEY_READ, Key) = ERROR_SUCCESS then begin if RegQueryValueExW(Key, 'NukeOnDelete', nil, nil, @Value, @ValueSize) <> ERROR_SUCCESS then Value:= 0; // delete to trash by default Result:= (Value = 0); RegCloseKey(Key); end; end // Windows 2000/XP else if RegOpenKeyExW(HKEY_LOCAL_MACHINE, PWideChar(wsRoot), 0, KEY_READ, Key) = ERROR_SUCCESS then begin if RegQueryValueExW(Key, 'UseGlobalSettings', nil, nil, @Value, @ValueSize) <> ERROR_SUCCESS then Value:= 1; // use global settings by default if (Value = 1) then begin if RegQueryValueExW(Key, 'NukeOnDelete', nil, nil, @Value, @ValueSize) <> ERROR_SUCCESS then Value:= 0; // delete to trash by default Result:= (Value = 0); RegCloseKey(Key); end else begin RegCloseKey(Key); if RegOpenKeyExW(HKEY_LOCAL_MACHINE, PWideChar(wsRoot + sPath[1]), 0, KEY_READ, Key) = ERROR_SUCCESS then begin if RegQueryValueExW(Key, 'NukeOnDelete', nil, nil, @Value, @ValueSize) <> ERROR_SUCCESS then Value:= 0; // delete to trash by default Result:= (Value = 0); RegCloseKey(Key); end; end; end; end; {$ELSE} begin Result := True; end; {$ENDIF} end. doublecmd-0.5.8/src/platform/upixmapmanager.pas0000644000175000017500000017137112121332035020646 0ustar alexxalexx{ File name: uPixMapManager.pas Date: 2004/04/xx Author: Radek Cervinka Fast pixmap memory manager a loader Copyright (C) 2004 contributors: Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License in a file called COPYING along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. } unit uPixMapManager; {$mode objfpc}{$H+} {$IFDEF DARWIN} {$modeswitch objectivec1} {$ENDIF} interface { GTK2 is used directly in PixmapManager, because FPC/Lazarus draws bitmaps without alpha channel under GTK2, so bitmaps looks ugly. If this problem will be fixed then GTK2 specific code could be dropped. } uses Classes, SysUtils, Graphics, syncobjs, uFileSorting, StringHashList, uFile, uIconTheme, uDrive, uDisplayFile, uGlobs {$IF DEFINED(UNIX)} {$IF NOT DEFINED(DARWIN)} , contnrs, uDCReadSVG {$IFDEF LCLGTK2} , gtk2 {$ELSE} , uUnixIconTheme {$ENDIF} {$ENDIF} {$ENDIF}; type TDriveIconList = record Size: Integer; bmMediaFloppy, bmDriveHardDisk, bmMediaFlash, bmMediaOptical, bmDriveNetwork, bmDriveVirtual, bmDriveRemovableMedia, bmDriveRemovableMediaUsb: TBitmap; end; { TPixMapManager } TPixMapManager = class private {en Maps file extension to index of bitmap (in FPixmapList) for this file extension. } FExtList : TStringHashList; {en Maps icon filename to index of bitmap (in FPixmapList) for this icon. Uses absolute file names. } FPixmapsFileNames : TStringHashList; {en A list of loaded bitmaps. Stores TBitmap objects (on GTK2 it stores PGdkPixbuf pointers). } FPixmapList : TFPList; {en Lock used to synchronize access to PixmapManager storage. } FPixmapsLock: TCriticalSection; FDriveIconList : array[0..2] of TDriveIconList; FiDirIconID : PtrInt; FiDirLinkIconID : PtrInt; FiDirLinkBrokenIconID : PtrInt; FiLinkIconID : PtrInt; FiLinkBrokenIconID : PtrInt; FiEmblemLinkID: PtrInt; FiEmblemUnreadableID: PtrInt; FiUpDirIconID : PtrInt; FiDefaultIconID : PtrInt; FiExeIconID : PtrInt; FiArcIconID : PtrInt; FiSortAscID : PtrInt; FiSortDescID : PtrInt; {$IF DEFINED(MSWINDOWS)} FSysImgList : THandle; {$ELSEIF DEFINED(DARWIN)} FUseSystemTheme: Boolean; {$ELSEIF DEFINED(UNIX)} {en Maps file extension to MIME icon name(s). } FExtToMimeIconName: TFPDataHashTable; {$IFDEF LCLGTK2} FIconTheme: PGtkIconTheme; {$ELSE} FIconTheme: TIconTheme; {$ENDIF} {$ENDIF} {en Maps theme icon name to index of bitmap (in FPixmapList) for this icon. } FThemePixmapsFileNames: TStringHashList; FDCIconTheme: TIconTheme; procedure CreateIconTheme; procedure DestroyIconTheme; {en Same as LoadBitmap but displays a warning if pixmap file doesn't exist. } function CheckLoadPixmapFromFile(const AIconName: String) : TBitmap; {en If path is absolute tries to load bitmap and add to storage. If path is relative it tries to load theme icon and add to storage. } function CheckAddPixmap(AIconName: String; AIconSize : Integer = 0): PtrInt; {en Loads a theme icon and adds it to storage. This function should only be called under FPixmapLock. } function CheckAddThemePixmapLocked(AIconName: String; AIconSize: Integer): PtrInt; {en Loads a theme icon and adds it to storage. Safe to call without a lock. } function CheckAddThemePixmap(const AIconName: String; AIconSize: Integer = 0) : PtrInt; {en Loads a theme icon. Returns TBitmap (on GTK2 convert GdkPixbuf to TBitmap). This function should only be called under FPixmapLock. } function LoadIconThemeBitmapLocked(AIconName: String; AIconSize: Integer): TBitmap; {$IF DEFINED(WINDOWS)} {en Checks if the AIconName points to an icon resource in a library, executable, etc. @param(AIconName Full path to the file with the icon with appended "," and icon index.) @param(IconFile Returns the full path to the file containing the icon resource.) @param(IconIndex Returns the index of the icon in the file.) @returns(@true if AIconName points to an icon resource, @false otherwise.) } function GetIconResourceIndex(const IconPath: String; out IconFile: String; out IconIndex: PtrInt): Boolean; function GetSystemFolderIcon: PtrInt; function GetSystemExecutableIcon: PtrInt; {$ENDIF} {$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)} {en Loads MIME icons names and creates a mapping: file extension -> MIME icon name. Doesn't need to be synchronized as long as it's only called from Load(). } procedure LoadMimeIconNames; {en Retrieves index of a theme icon based on file extension using Extension->MIME map. Loads the icon and adds it into PixmapManager, if not yet added. This function should only be called under FPixmapLock. } function GetMimeIcon(AFileExt: String; AIconSize: Integer): PtrInt; {en It is synchronized in GetIconByName->CheckAddPixmap. } function GetIconByDesktopFile(sFileName: UTF8String; iDefaultIcon: PtrInt): PtrInt; {$ENDIF} {$IF DEFINED(DARWIN)} function GetSystemFolderIcon: PtrInt; function GetMimeIcon(AFileExt: String; AIconSize: Integer): PtrInt; {$ENDIF} function GetBuiltInDriveIcon(Drive : PDrive; IconSize : Integer; clBackColor : TColor) : Graphics.TBitmap; public constructor Create; destructor Destroy; override; procedure Load(const sFileName : String); {en Loads a graphical file (if supported) to a bitmap. @param(AIconFileName must be a full path to the graphical file.) @param(ABitmap receives a new bitmap object.) @returns(@true if bitmap has been loaded, @false otherwise.) } function LoadBitmapFromFile(AIconFileName: String; out ABitmap: TBitmap): Boolean; {en Loads a graphical file as a bitmap if filename is full path. Environment variables in the filename are supported. If filename is not graphic file it tries to load some bitmap associated with the file (by extension, attributes, etc.). Loads an icon from a file's resources if filename ends with ",Nr" (on Windows). Loads a theme icon if filename is not a full path. Performs resize of the bitmap to x if Stretch = @true. If Stretch = @false then clBackColor is ignored. } function LoadBitmapEnhanced(sFileName : String; iIconSize : Integer; Stretch: Boolean; clBackColor : TColor) : Graphics.TBitmap; {en Loads a theme icon as bitmap. @param(AIconName is a MIME type name.) } function LoadIconThemeBitmap(AIconName: String; AIconSize: Integer): TBitmap; {en Retrieves a bitmap stored in PixmapManager by index (always returns a new copy). On Windows if iIndex points to system icon list it creates a new bitmap by loading system icon and drawing onto the bitmap. } function GetBitmap(iIndex : PtrInt) : TBitmap; function DrawBitmap(iIndex: PtrInt; Canvas : TCanvas; X, Y: Integer) : Boolean; {en Draws bitmap stretching it if needed to Width x Height. If Width is 0 then full bitmap width is used. If Height is 0 then full bitmap height is used. @param(iIndex Index of pixmap manager's bitmap.) } function DrawBitmap(iIndex: PtrInt; Canvas : TCanvas; X, Y, Width, Height: Integer) : Boolean; {en Draws overlay bitmap for a file. @param(AFile File for which is needed to draw the overlay icon.) @param(DirectAccess Whether the file is on a directly accessible file source.) } function DrawBitmapOverlay(AFile: TDisplayFile; DirectAccess: Boolean; Canvas : TCanvas; X, Y: Integer) : Boolean; function GetIconBySortingDirection(SortingDirection: TSortDirection): PtrInt; {en Retrieves icon index in FPixmapList table for a file. @param(AFile File for which to retrieve the icon.) @param(DirectAccess Whether the file is on a directly accessible file source.) @param(LoadIcon Only used when an icon for a file does not yet exist in FPixmapsList. If @true then it loads the icon into FPixmapsList table and returns the index of the loaded icon. If @false then it returns -1 to notify that an icon for the file does not exist in FPixmapsList. If the icon already exists for the file the function returns its index regardless of LoadIcon parameter.) @param(IconsMode Whether to retrieve only standard icon, also from file resources, etc.) @param(GetIconWithLink If the file is a link and GetLinkIcon is @true it retrieves icon with embedded link bitmap. If @false it only retrieves the file icon itself.) } function GetIconByFile(AFile: TFile; DirectAccess: Boolean; LoadIcon: Boolean; IconsMode: TShowIconsMode; GetIconWithLink: Boolean): PtrInt; {$IF DEFINED(MSWINDOWS)} {en Retrieves overlay icon index for a file. @param(AFile File for which to retrieve the overlay icon.) @param(DirectAccess Whether the file is on a directly accessible file source.) } function GetIconOverlayByFile(AFile: TFile; DirectAccess: Boolean): PtrInt; {$ELSEIF DEFINED(DARWIN)} function GetApplicationBundleIcon(sFileName: UTF8String; iDefaultIcon: PtrInt): PtrInt; {$ENDIF} function GetIconByName(const AIconName: UTF8String): PtrInt; function GetDriveIcon(Drive : PDrive; IconSize : Integer; clBackColor : TColor) : Graphics.TBitmap; function GetDefaultDriveIcon(IconSize : Integer; clBackColor : TColor) : Graphics.TBitmap; function GetVirtualDriveIcon(IconSize : Integer; clBackColor : TColor) : Graphics.TBitmap; function GetArchiveIcon(IconSize: Integer; clBackColor : TColor) : Graphics.TBitmap; {en Returns default icon for a file. For example default folder icon for folder, default executable icon for *.exe, etc. } function GetDefaultIcon(AFile: TFile): PtrInt; end; var PixMapManager: TPixMapManager = nil; procedure LoadPixMapManager; implementation uses LCLIntf, LCLType, LCLProc, Forms, uGlobsPaths, WcxPlugin, DCStrUtils, uDCUtils, uFileSystemFileSource, uReSample, uDebug, DCOSUtils {$IFDEF LCLGTK2} , uPixMapGtk, gdk2pixbuf, gdk2, glib2 {$ENDIF} {$IFDEF MSWINDOWS} , CommCtrl, ShellAPI, Windows, uIcoFiles, uGdiPlus, IntfGraphics, uShlObjAdditional {$ELSE} , StrUtils, DCBasicTypes, DCClassesUtf8 {$ENDIF} {$IFDEF DARWIN} , CocoaAll, MacOSAll, uClassesEx {$ENDIF} ; {$IFDEF MSWINDOWS} const SystemIconIndexStart: PtrInt = High(PtrInt) div 2; {$ENDIF} function StretchBitmap(var bmBitmap : Graphics.TBitmap; iIconSize : Integer; clBackColor : TColor; bFreeAtEnd : Boolean = False) : Graphics.TBitmap; var memstream: TMemoryStream; begin if (iIconSize <> bmBitmap.Height) or (iIconSize <> bmBitmap.Width) then begin Result := Graphics.TBitMap.Create; try Result.SetSize(iIconSize, iIconSize); if bmBitmap.RawImage.Description.AlphaPrec <> 0 then // if bitmap has alpha channel Stretch(bmBitmap, Result, ResampleFilters[2].Filter, ResampleFilters[2].Width) else with Result do begin Canvas.Brush.Color := clBackColor; Canvas.FillRect(Canvas.ClipRect); Canvas.StretchDraw(Canvas.ClipRect, bmBitmap); { For drawing color transparent bitmaps } memstream := TMemoryStream.Create; try SaveToStream(memstream); memstream.position := 0; LoadFromStream(memstream); finally memstream.free; end; Transparent := True; if bmBitmap.RawImage.Description.MaskBitsPerPixel = 0 then TransparentColor := clBackColor; end; // with if bFreeAtEnd then FreeAndNil(bmBitmap); except FreeAndNil(Result); raise; end; end else // Don't need to stretch. begin if bFreeAtEnd then begin Result := bmBitmap; bmBitmap := nil; end else begin Result := Graphics.TBitMap.Create; try Result.Assign(bmBitmap); except FreeAndNil(Result); raise; end; end; end; end; { TPixMapManager } function TPixMapManager.LoadBitmapFromFile(AIconFileName: String; out ABitmap: Graphics.TBitmap): Boolean; var Picture: TPicture; begin Result:= False; Picture := TPicture.Create; try ABitmap := Graphics.TBitmap.Create; try Picture.LoadFromFile(AIconFileName); //Picture.Graphic.Transparent := True; ABitmap.Assign(Picture.Bitmap); // if unsupported BitsPerPixel then exit if ABitmap.RawImage.Description.BitsPerPixel > 32 then raise EInvalidGraphic.Create('Unsupported bits per pixel'); Result:= True; except on E: Exception do begin FreeAndNil(ABitmap); DCDebug(Format('Error: Cannot load pixmap [%s] : %s',[AIconFileName, e.Message])); end; end; finally FreeAndNil(Picture); end; end; function TPixMapManager.LoadBitmapEnhanced(sFileName : String; iIconSize : Integer; Stretch: Boolean; clBackColor : TColor) : Graphics.TBitmap; var {$IFDEF MSWINDOWS} iIconIndex: PtrInt; iIconLarge, iIconSmall: Integer; phIcon: HICON = INVALID_HANDLE_VALUE; phIconLarge : HICON = 0; phIconSmall : HICON = 0; Icon : TIcon = nil; IconFileName: String; {$ENDIF} AFile: TFile; iIndex : PtrInt; sExtFilter, sGraphicFilter : String; bmStandartBitmap : Graphics.TBitMap = nil; {$IFDEF LCLGTK2} pbPicture : PGdkPixbuf; {$ENDIF} begin Result := nil; sFileName:= ReplaceEnvVars(sFileName); // If the name is not full path then treat it as MIME type. if GetPathType(sFileName) = ptNone then bmStandartBitmap := LoadIconThemeBitmap(sFileName, iIconSize) else {$IFDEF MSWINDOWS} if GetIconResourceIndex(sFileName, IconFileName, iIconIndex) then begin if ExtractIconExW(PWChar(UTF8Decode(IconFileName)), iIconIndex, phIconLarge, phIconSmall, 1) = 2 then // if extracted both icons begin // Get system metrics iIconSmall:= GetSystemMetrics(SM_CXSMICON); iIconLarge:= GetSystemMetrics(SM_CXICON); if (iIconSize = 16) and (iIconSmall = 16) then phIcon:= phIconSmall // Use small icon else if (iIconSize = 32) and (iIconLarge = 32) then phIcon:= phIconLarge // Use large icon else if iIconSize > iIconSmall then phicon := phIconLarge // Use large icon else phicon := phIconSmall; // Use small icon if phIcon <> INVALID_HANDLE_VALUE then try Icon:= CreateIconFromHandle(phIcon); bmStandartBitmap := Graphics.TBitMap.Create; bmStandartBitmap.Assign(Icon); bmStandartBitmap.Masked := True; // Need to explicitly set Masked=True, Lazarus issue #0019747 finally FreeThenNil(Icon); end; DestroyIcon(phIconLarge); DestroyIcon(phIconSmall); end; end // GetIconResourceIndex else {$ENDIF} begin sExtFilter := UTF8LowerCase(ExtractFileExt(sFileName)) + ';'; sGraphicFilter := GraphicFilter(TGraphic); // if file is graphic if (Length(sExtFilter) > 1) and (Pos(sExtFilter, sGraphicFilter) <> 0) and mbFileExists(sFileName) then begin {$IFDEF LCLGTK2} pbPicture := gdk_pixbuf_new_from_file(PChar(sFileName), nil); if pbPicture <> nil then begin bmStandartBitmap:= PixBufToBitmap(pbPicture); gdk_pixmap_unref(pbPicture); end else // Try loading the standard way. {$ELSE} LoadBitmapFromFile(sFileName, bmStandartBitmap); {$ENDIF} end; end; if not Assigned(bmStandartBitmap) then // get file icon by ext begin if mbFileSystemEntryExists(sFileName) then begin AFile := TFileSystemFileSource.CreateFileFromFile(sFileName); try iIndex := GetIconByFile(AFile, True, True, sim_all_and_exe, False); bmStandartBitmap := GetBitmap(iIndex); finally FreeAndNil(AFile); end; end else // file not found begin bmStandartBitmap := GetBitmap(FiDefaultIconID); end; end; if Stretch and Assigned(bmStandartBitmap) then Result := StretchBitmap(bmStandartBitmap, iIconSize, clBackColor, True) else Result := bmStandartBitmap; end; function TPixMapManager.LoadIconThemeBitmap(AIconName: String; AIconSize: Integer): Graphics.TBitmap; begin FPixmapsLock.Acquire; try Result := LoadIconThemeBitmapLocked(AIconName, AIconSize); finally FPixmapsLock.Release; end; end; function TPixMapManager.CheckLoadPixmapFromFile(const AIconName: String): Graphics.TBitmap; begin if not mbFileExists(AIconName) then begin DCDebug(Format('Warning: pixmap [%s] not exists!',[AIconName])); Exit(nil); end; LoadBitmapFromFile(AIconName, Result); end; function TPixMapManager.CheckAddThemePixmap(const AIconName: String; AIconSize : Integer) : PtrInt; begin if AIconSize = 0 then AIconSize := gIconsSize; FPixmapsLock.Acquire; try Result := CheckAddThemePixmapLocked(AIconName, AIconSize); finally FPixmapsLock.Release; end; end; function TPixMapManager.CheckAddPixmap(AIconName: String; AIconSize : Integer): PtrInt; var fileIndex: PtrInt; {$IFDEF LCLGTK2} pbPicture : PGdkPixbuf; {$ELSE} bmpBitmap: Graphics.TBitmap; {$ENDIF} begin Result:= -1; if AIconName = EmptyStr then Exit; if AIconSize = 0 then AIconSize := gIconsSize; AIconName := ReplaceEnvVars(AIconName); if GetPathType(AIconName) = ptAbsolute then begin FPixmapsLock.Acquire; try // Determine if this file is already loaded. fileIndex := FPixmapsFileNames.Find(AIconName); if fileIndex < 0 then begin {$IFDEF LCLGTK2} if not mbFileExists(AIconName) then begin DCDebug(Format('Warning: pixmap [%s] not exists!', [AIconName])); Exit; end; pbPicture := gdk_pixbuf_new_from_file_at_size(PChar(AIconName), AIconSize, AIconSize, nil); if Assigned(pbPicture) then begin Result := FPixmapList.Add(pbPicture); FPixmapsFileNames.Add(AIconName, Pointer(Result)); end else DCDebug(Format('Error: pixmap [%s] not loaded!', [AIconName])); {$ELSE} bmpBitmap := LoadBitmapEnhanced(AIconName, AIconSize, False, clNone); if Assigned(bmpBitmap) then begin // Shrink big bitmaps before putting them into PixmapManager, // to speed up later drawing. // // Note: Transparent bitmaps may lose transparency, because // they must drawn onto a background, so we allow smaller bitmaps // up to 48x48 (icons for example) to load in full size and they // are resized upon drawing. // // TODO: // This should resize any non-transparent, // non-alpha channel bitmaps to gIconsSize // (so if Width<>gIconsSize or Height<>gIconsSize then Resize). if (bmpBitmap.Width > 48) or (bmpBitmap.Height > 48) then begin bmpBitmap := StretchBitmap(bmpBitmap, AIconSize, clBlack, True); end; Result := FPixmapList.Add(bmpBitmap); FPixmapsFileNames.Add(AIconName, Pointer(Result)); end; {$ENDIF} end else begin Result:= PtrInt(FPixmapsFileNames.List[fileIndex]^.Data); end; finally FPixmapsLock.Release; end; end else begin Result := CheckAddThemePixmap(AIconName, AIconSize); end; end; procedure TPixMapManager.CreateIconTheme; var DirList: array of string; begin {$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)} {$IFDEF LCLGTK2} // get current gtk theme FIconTheme:= gtk_icon_theme_get_for_screen(gdk_screen_get_default); { // load custom theme FIconTheme:= gtk_icon_theme_new; gtk_icon_theme_set_custom_theme(FIconTheme, 'oxygen'); } {$ELSE} FIconTheme:= TIconTheme.Create(GetCurrentIconTheme, UnixIconThemesBaseDirList); {$ENDIF} {$ENDIF} // Create DC theme. SetLength(DirList, 1); DirList[0] := ExcludeTrailingPathDelimiter(gpPixmapPath); FDCIconTheme := TIconTheme.Create('dctheme', DirList); end; procedure TPixMapManager.DestroyIconTheme; begin {$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)} {$IFDEF LCLGTK2} FIconTheme:= nil; {$ELSE} if Assigned(FIconTheme) then FreeAndNil(FIconTheme); {$ENDIF} {$ENDIF} FreeThenNil(FDCIconTheme); end; {$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)} procedure TPixMapManager.LoadMimeIconNames; const mime_globs = '/usr/share/mime/globs'; mime_generic_icons = '/usr/share/mime/generic-icons'; pixmaps_cache = 'pixmaps.cache'; cache_signature: DWord = $44435043; // 'DCPC' cache_version: DWord = 1; var I, J, K: Integer; globs: TStringListEx = nil; generic_icons: TStringListEx = nil; cache: TFileStreamEx = nil; mTime: TFileTime; sMimeType, sMimeIconName, sExtension: String; node: THTDataNode = nil; iconsList: TStringList; EntriesCount, IconsCount: Cardinal; nodeList: TFPObjectList; begin try // Try to load from cache. mTime:= mbFileAge(mime_globs); if (mbFileAge(gpCfgDir + pixmaps_cache) = mTime) and (mbFileAccess(gpCfgDir + pixmaps_cache, fmOpenRead)) and (mbFileSize(gpCfgDir + pixmaps_cache) > SizeOf(DWord) * 2) then begin cache := TFileStreamEx.Create(gpCfgDir + pixmaps_cache, fmOpenRead); if (cache.ReadDWord <> NtoBE(cache_signature)) or (cache.ReadDWord <> cache_version) then begin FreeAndNil(cache); end; end; if Assigned(cache) then begin EntriesCount := cache.ReadDWord; FExtToMimeIconName.HashTableSize := EntriesCount; // Each entry is a file extension with a list of icon names. for I := 0 to EntriesCount - 1 do begin sExtension := cache.ReadAnsiString; IconsCount := cache.ReadDWord; iconsList := TStringList.Create; FExtToMimeIconName.Add(sExtension, iconsList); iconsList.Capacity := IconsCount; for J := 0 to IconsCount - 1 do iconsList.Add(cache.ReadAnsiString); end; end else if mbFileAccess(mime_globs, fmOpenRead) then begin // Load mapping: MIME type -> file extension. globs:= TStringListEx.Create; globs.NameValueSeparator:= ':'; globs.LoadFromFile(mime_globs); // Try to load mapping: MIME type -> generic MIME icon name. if mbFileExists(mime_generic_icons) then begin generic_icons:= TStringListEx.Create; generic_icons.NameValueSeparator:= ':'; generic_icons.LoadFromFile(mime_generic_icons); end; EntriesCount := 0; // Create mapping: file extension -> list of MIME icon names. for I:= 0 to globs.Count - 1 do if (globs.Strings[I] <> '') and // bypass empty lines (globs.Strings[I][1] <> '#') then // and comments begin sMimeType := globs.Names[I]; sMimeIconName:= StringReplace(sMimeType, '/', '-', []); sExtension:= ExtractFileExt(globs.ValueFromIndex[I]); // Support only extensions, not full file name masks. if (sExtension <> '') and (sExtension <> '.*') then begin Delete(sExtension, 1, 1); node := THTDataNode(FExtToMimeIconName.Find(sExtension)); if not Assigned(node) then begin iconsList := TStringList.Create; FExtToMimeIconName.Add(sExtension, iconsList); Inc(EntriesCount); end else iconsList := TStringList(node.Data); if iconsList.IndexOf(sMimeIconName) < 0 then iconsList.Add(sMimeIconName); // Shared-mime-info spec says: // "If [generic-icon] is not specified then the mimetype is used to generate the // generic icon by using the top-level media type (e.g. "video" in "video/ogg") // and appending "-x-generic" (i.e. "video-x-generic" in the previous example)." if Assigned(generic_icons) then begin J := generic_icons.IndexOfName(sMimeType); if J <> -1 then sMimeIconName := generic_icons.ValueFromIndex[J] // found generic icon else sMimeIconName := Copy2Symb(sMimeIconName, '-') + '-x-generic'; end else sMimeIconName := Copy2Symb(sMimeIconName, '-') + '-x-generic'; if iconsList.IndexOf(sMimeIconName) < 0 then iconsList.Add(sMimeIconName); end; end; // save to cache cache := TFileStreamEx.Create(gpCfgDir + pixmaps_cache, fmCreate); cache.WriteDWord(NtoBE(cache_signature)); cache.WriteDWord(cache_version); cache.WriteDWord(EntriesCount); for I := 0 to FExtToMimeIconName.HashTable.Count - 1 do begin nodeList := TFPObjectList(FExtToMimeIconName.HashTable.Items[I]); if Assigned(nodeList) then for J := 0 to nodeList.Count - 1 do begin node := THtDataNode(nodeList.Items[J]); iconsList := TStringList(node.Data); cache.WriteAnsiString(node.Key); cache.WriteDWord(iconsList.Count); for K := 0 to iconsList.Count - 1 do cache.WriteAnsiString(iconsList.Strings[K]); end; end; FreeAndNil(cache); // Close file mbFileSetTime(gpCfgDir + pixmaps_cache, mTime, 0, 0); end; finally if Assigned(globs) then FreeAndNil(globs); if Assigned(generic_icons) then FreeAndNil(generic_icons); if Assigned(cache) then FreeAndNil(cache); end; end; function TPixMapManager.GetMimeIcon(AFileExt: String; AIconSize: Integer): PtrInt; var I: Integer; node: THTDataNode; iconList: TStringList; begin // This function must be called under FPixmapsLock. Result := -1; // Search for an icon for this file extension. node := THTDataNode(FExtToMimeIconName.Find(AFileExt)); if Assigned(node) then begin iconList := TStringList(node.Data); // Try to load one of the icons in the list. for I := 0 to iconList.Count - 1 do begin Result := CheckAddThemePixmapLocked(iconList.Strings[I], AIconSize); if Result <> -1 then break; end; end; end; function TPixMapManager.GetIconByDesktopFile(sFileName: UTF8String; iDefaultIcon: PtrInt): PtrInt; var I: PtrInt; iniDesktop: TIniFileEx = nil; sIconName: UTF8String; begin try iniDesktop:= TIniFileEx.Create(sFileName, fmOpenRead); try sIconName:= iniDesktop.ReadString('Desktop Entry', 'Icon', EmptyStr); finally FreeAndNil(iniDesktop); end; except Exit(iDefaultIcon); end; { Some icon names in .desktop files are specified with an extension, even though it is not allowed by the standard unless an absolute path to the icon is supplied. We delete this extension here. } if GetPathType(sIconName) = ptNone then sIconName := TIconTheme.CutTrailingExtension(sIconName); I:= GetIconByName(sIconName); if I < 0 then Result:= iDefaultIcon else Result:= I; end; {$ELSEIF DEFINED(DARWIN)} function TPixMapManager.GetApplicationBundleIcon(sFileName: UTF8String; iDefaultIcon: PtrInt): PtrInt; var I, J: PtrInt; slInfoFile: TStringListEx = nil; sTemp, sIconName: UTF8String; begin Result:= iDefaultIcon; slInfoFile:= TStringListEx.Create; try try slInfoFile.LoadFromFile(sFileName + '/Contents/Info.plist'); sTemp:= slInfoFile.Text; I:= Pos('CFBundleIconFile', sTemp); if I <= 0 then Exit; I:= PosEx('', sTemp, I) + 8; J:= PosEx('', sTemp, I); sIconName:= Copy(sTemp, I, J - I); if not StrEnds(sIconName, '.icns') then sIconName:= sIconName + '.icns'; sIconName:= sFileName + '/Contents/Resources/' + sIconName; except Exit; end; finally slInfoFile.Free; end; I:= GetIconByName(sIconName); if I >= 0 then Result:= I; end; {$ENDIF} // Unix function TPixMapManager.CheckAddThemePixmapLocked(AIconName: String; AIconSize: Integer): PtrInt; var fileIndex: PtrInt; {$IFDEF LCLGTK2} pbPicture: PGdkPixbuf = nil; sIconFileName: String; {$ELSE} bmpBitmap: Graphics.TBitmap; {$ENDIF} begin // This function must be called under FPixmapsLock. fileIndex := FThemePixmapsFileNames.Find(AIconName); if fileIndex < 0 then begin {$IF DEFINED(LCLGTK2) AND DEFINED(UNIX) AND NOT DEFINED(DARWIN)} if gShowIcons > sim_standart then begin pbPicture:= gtk_icon_theme_load_icon(FIconTheme, Pgchar(AIconName), AIconSize, GTK_ICON_LOOKUP_USE_BUILTIN, nil); end; // If not found in system theme or using of system theme is disabled look in DC theme. if not Assigned(pbPicture) then begin sIconFileName := FDCIconTheme.FindIcon(AIconName, AIconSize); if sIconFileName <> EmptyStr then pbPicture := gdk_pixbuf_new_from_file_at_size( PChar(sIconFileName), AIconSize, AIconSize, nil); end; if Assigned(pbPicture) then begin Result := FPixmapList.Add(pbPicture); FThemePixmapsFileNames.Add(AIconName, Pointer(Result)); end else Result := -1; {$ELSE} bmpBitmap := LoadIconThemeBitmapLocked(AIconName, AIconSize); if Assigned(bmpBitmap) then begin Result := FPixmapList.Add(bmpBitmap); // add to list FThemePixmapsFileNames.Add(AIconName, Pointer(Result)); end else Result := -1; {$ENDIF} end else Result := PtrInt(FThemePixmapsFileNames.List[fileIndex]^.Data); end; function TPixMapManager.LoadIconThemeBitmapLocked(AIconName: String; AIconSize: Integer): Graphics.TBitmap; var sIconFileName: UTF8String; {$IFDEF LCLGTK2} pbPicture: PGdkPixbuf = nil; {$ENDIF} begin // This function must be called under FPixmapsLock. {$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)} Result := nil; {$IFDEF LCLGTK2} if gShowIcons > sim_standart then begin pbPicture:= gtk_icon_theme_load_icon(FIconTheme, Pgchar(PChar(AIconName)), AIconSize, GTK_ICON_LOOKUP_USE_BUILTIN, nil); if pbPicture <> nil then Result := PixBufToBitmap(pbPicture); end; {$ELSE} sIconFileName:= FIconTheme.FindIcon(AIconName, AIconSize); if sIconFileName <> EmptyStr then Result := CheckLoadPixmapFromFile(sIconFileName); {$ENDIF} if not Assigned(Result) then {$ENDIF} begin sIconFileName:= FDCIconTheme.FindIcon(AIconName, AIconSize); if sIconFileName <> EmptyStr then Result := CheckLoadPixmapFromFile(sIconFileName) else Result := nil; end; end; {$IFDEF DARWIN} function TPixMapManager.GetSystemFolderIcon: PtrInt; var FileType: UTF8String; begin FileType:= NSFileTypeForHFSTypeCode(kGenericFolderIcon).UTF8String; Result:= GetMimeIcon(FileType, gIconsSize); end; function TPixMapManager.GetMimeIcon(AFileExt: String; AIconSize: Integer): PtrInt; var I: Integer; nImage: NSImage; nData: NSData; nRepresentations: NSArray; nImageRep: NSImageRep; WorkStream: TBlobStream; tfBitmap: TTiffImage; bmBitmap: TBitmap; begin Result:= -1; if not FUseSystemTheme then Exit; nImage:= NSWorkspace.sharedWorkspace.iconForFileType(NSSTR(PChar(AFileExt))); nRepresentations:= nImage.Representations; if AIconSize = 22 then AIconSize:= 32; for I:= nRepresentations.Count - 1 downto 0 do begin nImageRep:= NSImageRep(nRepresentations.objectAtIndex(I)); if (AIconSize <> nImageRep.Size.Width) then nImage.removeRepresentation(nImageRep); end; if nImage.Representations.Count = 0 then Exit; nData:= nImage.TIFFRepresentation; tfBitmap:= TTiffImage.Create; WorkStream:= TBlobStream.Create(nData.Bytes, nData.Length); try tfBitmap.LoadFromStream(WorkStream); bmBitmap:= TBitmap.Create; try bmBitmap.Assign(tfBitmap); Result:= FPixmapList.Add(bmBitmap); except bmBitmap.Free; end; finally tfBitmap.Free; WorkStream.Free; end; end; {$ENDIF} {$IFDEF WINDOWS} function TPixMapManager.GetIconResourceIndex(const IconPath: String; out IconFile: String; out IconIndex: PtrInt): Boolean; var iPos, iIndex: Integer; begin iPos := Pos(',', IconPath); if iPos <> 0 then begin if TryStrToInt(Copy(IconPath, iPos + 1, Length(IconPath) - iPos), iIndex) and (iIndex >= 0) then begin IconIndex := iIndex; IconFile := Copy(IconPath, 1, iPos - 1); Result := FileIsExeLib(IconFile); end else Result := False; end else begin IconIndex := 0; IconFile := IconPath; Result := FileIsExeLib(IconFile); end; end; function TPixMapManager.GetSystemFolderIcon: PtrInt; var FileInfo: TSHFileInfo; begin if (SHGetFileInfo('nil', FILE_ATTRIBUTE_DIRECTORY, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES) = 0) then Result := -1 else Result := FileInfo.iIcon + SystemIconIndexStart; end; function TPixMapManager.GetSystemExecutableIcon: PtrInt; var FileInfo: TSHFileInfo; begin if (SHGetFileInfo(PAnsiChar('a.exe'), // Ansi version is enough. FILE_ATTRIBUTE_NORMAL, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES) = 0) then Result := -1 else Result := FileInfo.iIcon + SystemIconIndexStart; end; {$ENDIF} constructor TPixMapManager.Create; {$IF DEFINED(DARWIN)} var systemVersion: SInt32; {$ELSEIF DEFINED(MSWINDOWS)} var FileInfo : TSHFileInfoW; iIconSize : Integer; {$ENDIF} begin FExtList := TStringHashList.Create(True); FPixmapsFileNames := TStringHashList.Create(True); FPixmapList := TFPList.Create; {$IF DEFINED(DARWIN)} FUseSystemTheme:= (Gestalt(gestaltSystemVersion, systemVersion) <> noErr); if not FUseSystemTheme then FUseSystemTheme:= not (systemVersion < $1060); {$ELSEIF DEFINED(UNIX)} FExtToMimeIconName := TFPDataHashTable.Create; {$ENDIF} FThemePixmapsFileNames := TStringHashList.Create(True); CreateIconTheme; {$IFDEF MSWINDOWS} if gIconsSize = 16 then iIconSize := SHGFI_SMALLICON else iIconSize := SHGFI_LARGEICON; FSysImgList := SHGetFileInfoW(PWideChar(UTF8Decode(mbGetCurrentDir)), 0, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX or iIconSize); {$ENDIF} FPixmapsLock := syncobjs.TCriticalSection.Create; end; destructor TPixMapManager.Destroy; var I : Integer; {$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)} J : Integer; nodeList: TFPObjectList; {$ENDIF} begin if Assigned(FPixmapList) then begin for I := 0 to FPixmapList.Count - 1 do if Assigned(FPixmapList.Items[I]) then {$IFDEF LCLGTK2} g_object_unref(PGdkPixbuf(FPixmapList.Items[I])); {$ELSE} Graphics.TBitmap(FPixmapList.Items[I]).Free; {$ENDIF} FreeAndNil(FPixmapList); end; if Assigned(FExtList) then FreeAndNil(FExtList); if Assigned(FPixmapsFileNames) then FreeAndNil(FPixmapsFileNames); for I := Low(FDriveIconList) to High(FDriveIconList) do with FDriveIconList[I] do begin if Assigned(bmMediaFloppy) then FreeAndNil(bmMediaFloppy); if Assigned(bmDriveHardDisk) then FreeAndNil(bmDriveHardDisk); if Assigned(bmMediaFlash) then FreeAndNil(bmMediaFlash); if Assigned(bmMediaOptical) then FreeAndNil(bmMediaOptical); if Assigned(bmDriveNetwork) then FreeAndNil(bmDriveNetwork); if Assigned(bmDriveVirtual) then FreeAndNil(bmDriveVirtual); if Assigned(bmDriveRemovableMedia) then FreeAndNil(bmDriveRemovableMedia); if Assigned(bmDriveRemovableMediaUsb) then FreeAndNil(bmDriveRemovableMediaUsb); end; {$IF DEFINED(MSWINDOWS)} ImageList_Destroy(FSysImgList); {$ELSEIF DEFINED(UNIX) AND NOT DEFINED(DARWIN)} for I := 0 to FExtToMimeIconName.HashTable.Count - 1 do begin nodeList := TFPObjectList(FExtToMimeIconName.HashTable.Items[I]); if Assigned(nodeList) then for J := 0 to nodeList.Count - 1 do TStringList(THtDataNode(nodeList.Items[J]).Data).Free; end; FreeThenNil(FExtToMimeIconName); {$ENDIF} DestroyIconTheme; FreeThenNil(FThemePixmapsFileNames); FreeThenNil(FPixmapsLock); inherited Destroy; end; procedure TPixMapManager.Load(const sFileName: String); var slPixmapList: TStringList; s:String; sExt, sPixMap:String; iekv:integer; iPixMap:PtrInt; I : Integer; iPixmapSize: Integer; begin // This function doesn't need to be synchronized // as long as it is called before creating the main form // (via LoadPixMapManager in doublecmd.lpr). // Load icon themes. {$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)} if gShowIcons > sim_standart then begin LoadMimeIconNames; // For use with GetMimeIcon {$IFNDEF LCLGTK2} FIconTheme.Load; // Load system icon theme. {$ENDIF} end; {$ENDIF} FDCIconTheme.Load; // Load DC theme. // load all drive icons FDriveIconList[0].Size := 16; FDriveIconList[1].Size := 22; FDriveIconList[2].Size := 32; for I:= Low(FDriveIconList) to High(FDriveIconList) do with FDriveIconList[I] do begin iPixmapSize := FDriveIconList[I].Size; bmMediaFloppy := LoadIconThemeBitmapLocked('media-floppy', iPixmapSize); bmDriveHardDisk := LoadIconThemeBitmapLocked('drive-harddisk', iPixmapSize); bmMediaFlash := LoadIconThemeBitmapLocked('media-flash', iPixmapSize); bmMediaOptical := LoadIconThemeBitmapLocked('media-optical', iPixmapSize); bmDriveNetwork:= LoadIconThemeBitmapLocked('network-wired', iPixmapSize); bmDriveVirtual:= LoadIconThemeBitmapLocked('folder-virtual', iPixmapSize); bmDriveRemovableMedia:= LoadIconThemeBitmapLocked('drive-removable-media', iPixmapSize); bmDriveRemovableMediaUsb:= LoadIconThemeBitmapLocked('drive-removable-media-usb', iPixmapSize); end; // load emblems if gIconsSize = 22 then I:= 16 else I:= gIconsSize div 2; FiEmblemLinkID:= CheckAddThemePixmap('emblem-symbolic-link', I); FiEmblemUnreadableID:= CheckAddThemePixmap('emblem-unreadable', I); // add some standard icons FiDefaultIconID:=CheckAddThemePixmap('unknown'); {$IF DEFINED(MSWINDOWS) or DEFINED(DARWIN)} FiDirIconID := -1; if gShowIcons > sim_standart then FiDirIconID := GetSystemFolderIcon; if FiDirIconID = -1 then {$ENDIF} FiDirIconID:=CheckAddThemePixmap('folder'); FiDirLinkIconID:=CheckAddThemePixmap('folder-link'); FiDirLinkBrokenIconID:=CheckAddThemePixmap('folder-link-broken'); FiLinkIconID:=CheckAddThemePixmap('link'); FiLinkBrokenIconID:=CheckAddThemePixmap('link-broken'); FiUpDirIconID:=CheckAddThemePixmap('go-up'); FiArcIconID := CheckAddThemePixmap('package-x-generic'); {$IFDEF MSWINDOWS} FiExeIconID := -1; if gShowIcons > sim_standart then FiExeIconID := GetSystemExecutableIcon; if FiExeIconID = -1 then {$ENDIF} FiExeIconID:= CheckAddThemePixmap('application-x-executable'); FiSortAscID := CheckAddThemePixmap('view-sort-ascending'); FiSortDescID := CheckAddThemePixmap('view-sort-descending'); { Load icons from doublecmd.ext } for I := 0 to gExts.Count - 1 do begin iPixMap:= CheckAddPixmap(gExts.Items[I].Icon, gIconsSize); if iPixMap >= 0 then begin // set pixmap index for all extensions for iekv := 0 to gExts.Items[I].Extensions.Count - 1 do begin sExt := gExts.Items[I].Extensions[iekv]; if FExtList.Find(sExt) < 0 then FExtList.Add(sExt, TObject(iPixMap)); end; end else iPixMap:= FiDefaultIconID; gExts.Items[I].IconIndex:= iPixMap; end; {/ Load icons from doublecmd.ext } // Load icons from pixmaps.txt only if "Only standart icons" enabled if (gShowIcons = sim_standart) and mbFileExists(sFileName) then try slPixmapList:= TStringList.Create; try slPixmapList.LoadFromFile(sFileName); for I:= 0 to slPixmapList.Count - 1 do begin s:= Trim(slPixmapList.Strings[I]); iekv := Pos('=',s); if iekv = 0 then Continue; sPixMap := Copy(s, iekv+1, length(s)-iekv); // Since DC 0.4.6 filename without path is treated as a MIME type // and it shouldn't have an extension. Cut any extension here. // Only '.png' were used in previous versions of pixmaps.txt. if (GetPathType(sPixMap) = ptNone) and StrEnds(sPixMap, '.png') then Delete(sPixMap, Length(sPixMap) - 3, 4); iPixMap := CheckAddPixmap(sPixMap); if iPixMap >= 0 then begin sExt := Copy(s, 1, iekv-1); if FExtList.Find(sExt) < 0 then FExtList.Add(sExt, TObject(iPixMap)); end; end; except on E: Exception do with Application do MessageBox(PAnsiChar(E.Message), PAnsiChar(Title), MB_OK or MB_ICONERROR); end; finally slPixmapList.Free; end; (* Set archive icons *) for I:=0 to gWCXPlugins.Count - 1 do begin if gWCXPlugins.Enabled[I] and ((gWCXPlugins.Flags[I] and PK_CAPS_HIDE) <> PK_CAPS_HIDE) then begin sExt := gWCXPlugins.Ext[I]; if (Length(sExt) > 0) and (FExtList.Find(sExt) < 0) then FExtList.Add(sExt, TObject(FiArcIconID)); end; end; //for for I:= 0 to gMultiArcList.Count - 1 do begin if gMultiArcList.Items[I].FEnabled then begin sExt := gMultiArcList.Items[I].FExtension; if (Length(sExt) > 0) and (FExtList.Find(sExt) < 0) then FExtList.Add(sExt, TObject(FiArcIconID)); end; end; (* /Set archive icons *) end; function TPixMapManager.GetBitmap(iIndex: PtrInt): Graphics.TBitmap; var PPixmap: Pointer; PixmapFromList: Boolean = False; {$IFDEF MSWINDOWS} hicn: HICON; Icon: TIcon = nil; {$ENDIF} begin FPixmapsLock.Acquire; try if (iIndex >= 0) and (iIndex < FPixmapList.Count) then begin PPixmap := FPixmapList[iIndex]; PixmapFromList := True; end; finally FPixmapsLock.Release; end; if PixmapFromList then begin {$IFDEF LCLGTK2} Result:= PixBufToBitmap(PGdkPixbuf(PPixmap)); {$ELSE} // Make a new copy. Result := Graphics.TBitmap.Create; Result.Assign(Graphics.TBitmap(PPixmap)); {$ENDIF} end else {$IFDEF MSWINDOWS} if iIndex >= SystemIconIndexStart then begin Result:= nil; hicn:= ImageList_GetIcon(FSysImgList, iIndex - SystemIconIndexStart, ILD_NORMAL); if hicn <> 0 then try Icon := CreateIconFromHandle(hicn); Result := Graphics.TBitmap.Create; Result.Assign(Icon); Result.Masked := True; // Need to explicitly set Masked=True, Lazarus issue #0019747 finally FreeThenNil(Icon); DestroyIcon(hicn); end end else {$ENDIF} Result:= nil; end; function TPixMapManager.DrawBitmap(iIndex: PtrInt; Canvas : TCanvas; X, Y: Integer) : Boolean; begin Result := DrawBitmap(iIndex, Canvas, X, Y, gIconsSize, gIconsSize); // X, Y, 0, 0 - No bitmap stretching. end; function TPixMapManager.DrawBitmap(iIndex: PtrInt; Canvas: TCanvas; X, Y, Width, Height: Integer): Boolean; procedure TrySetSize(aWidth, aHeight: Integer); begin if Width = 0 then Width := aWidth; if Height = 0 then Height := aHeight; end; var PPixmap: Pointer; PixmapFromList: Boolean = False; {$IFDEF MSWINDOWS} hicn: HICON; cx, cy: Integer; {$ENDIF} {$IFDEF LCLGTK2} pbPicture : PGdkPixbuf; iPixbufWidth : Integer; iPixbufHeight : Integer; {$ELSE} Bitmap: Graphics.TBitmap; aRect: TRect; {$ENDIF} begin Result := True; FPixmapsLock.Acquire; try if (iIndex >= 0) and (iIndex < FPixmapList.Count) then begin PPixmap := FPixmapList[iIndex]; PixmapFromList := True; end; finally FPixmapsLock.Release; end; if PixmapFromList then begin {$IFDEF LCLGTK2} pbPicture := PGdkPixbuf(PPixmap); iPixbufWidth := gdk_pixbuf_get_width(pbPicture); iPixbufHeight := gdk_pixbuf_get_height(pbPicture); TrySetSize(iPixbufWidth, iPixbufHeight); DrawPixbufAtCanvas(Canvas, pbPicture, 0, 0, X, Y, Width, Height); {$ELSE} Bitmap := Graphics.TBitmap(PPixmap); TrySetSize(Bitmap.Width, Bitmap.Height); aRect := Classes.Bounds(X, Y, Width, Height); Canvas.StretchDraw(aRect, Bitmap); {$ENDIF} end else {$IFDEF MSWINDOWS} if iIndex >= SystemIconIndexStart then try if ImageList_GetIconSize(FSysImgList, @cx, @cy) then TrySetSize(cx, cy) else TrySetSize(gIconsSize, gIconsSize); if (Height in [16, 32]) and (cx = Width) and (cy = Height) then // for transparent ImageList_Draw(FSysImgList, iIndex - SystemIconIndexStart, Canvas.Handle, X, Y, ILD_TRANSPARENT) else begin hicn:= ImageList_GetIcon(FSysImgList, iIndex - SystemIconIndexStart, ILD_NORMAL); try if IsGdiPlusLoaded then Result:= GdiPlusStretchDraw(hicn, Canvas.Handle, X, Y, Width, Height) else Result:= DrawIconEx(Canvas.Handle, X, Y, hicn, Width, Height, 0, 0, DI_NORMAL); finally DestroyIcon(hicn); end; end; except Result:= False; end; {$ELSE} Result:= False; {$ENDIF} end; function TPixMapManager.DrawBitmapOverlay(AFile: TDisplayFile; DirectAccess: Boolean; Canvas: TCanvas; X, Y: Integer): Boolean; var I: Integer; begin if AFile.FSFile.IsLink then begin I:= gIconsSize div 2; Result:= DrawBitmap(FiEmblemLinkID, Canvas, X, Y + I, I, I); if Assigned(AFile.FSFile.LinkProperty) then begin if not AFile.FSFile.LinkProperty.IsValid then Result:= DrawBitmap(FiEmblemUnreadableID, Canvas, X + I, Y + I, I, I); end; end {$IFDEF MSWINDOWS} else // Windows XP doesn't draw link overlay icon for soft links (don't know about Vista or 7). if DirectAccess then begin if AFile.IconOverlayID >= SystemIconIndexStart then Result:= DrawBitmap(AFile.IconOverlayID, Canvas, X, Y); end; {$ENDIF} ; end; function TPixMapManager.GetIconBySortingDirection(SortingDirection: TSortDirection): PtrInt; begin case SortingDirection of sdDescending: begin Result := FiSortDescID; end; sdAscending: begin Result := FiSortAscID; end; else Result := -1; end; end; function TPixMapManager.GetIconByFile(AFile: TFile; DirectAccess: Boolean; LoadIcon: Boolean; IconsMode: TShowIconsMode; GetIconWithLink: Boolean): PtrInt; var Ext: String; {$IFDEF MSWINDOWS} sFileName: String; FileInfo: TSHFileInfoW; dwFileAttributes: DWORD; uFlags: UINT; {$ENDIF} begin Result := -1; if not Assigned(AFile) then Exit; with AFile do begin if Name = '..' then begin Result := FiUpDirIconID; Exit; end; if IsLinkToDirectory then begin if GetIconWithLink then begin if (LinkProperty = nil) or LinkProperty.IsValid then Result := FiDirLinkIconID else Result := FiDirLinkBrokenIconID; Exit; end; end; if IsDirectory or IsLinkToDirectory then begin {$IF DEFINED(MSWINDOWS)} if (IconsMode = sim_standart) or // Directory has special icon only if it has "read only" or "system" attributes // and contains desktop.ini file (not (DirectAccess and (IsSysFile or FileIsReadOnly(Attributes)) and mbFileExists(FullPath + '\desktop.ini'))) or (GetDeviceCaps(Application.MainForm.Canvas.Handle, BITSPIXEL) < 16) then {$ELSEIF DEFINED(UNIX) AND NOT DEFINED(DARWIN)} if (IconsMode = sim_all_and_exe) and (DirectAccess and mbFileAccess(Path + Name + '/.directory', fmOpenRead)) then begin if LoadIcon then Result := GetIconByDesktopFile(Path + Name + '/.directory', FiDirIconID) else Result := -1; Exit; end else {$ELSEIF DEFINED(DARWIN)} if (IconsMode = sim_all_and_exe) and (DirectAccess and (ExtractFileExt(FullPath) = '.app')) then begin if LoadIcon then Result := GetApplicationBundleIcon(FullPath, FiDirIconID) else Result := -1; Exit; end else {$ENDIF} begin Exit(FiDirIconID); end; end else // not directory begin if IsLink and GetIconWithLink then begin if (LinkProperty = nil) or LinkProperty.IsValid then Exit(FiLinkIconID) else Exit(FiLinkBrokenIconID); end; if (Extension = '') then Exit(FiDefaultIconID); Ext := UTF8LowerCase(Extension); {$IF DEFINED(MSWINDOWS)} if IconsMode <> sim_all_and_exe then begin if Ext = 'exe' then Exit(FiExeIconID) else if Ext = 'lnk' then Exit(FiLinkIconID) else if Ext = 'ico' then Exit(FiDefaultIconID) end; {$ELSEIF DEFINED(UNIX) AND NOT DEFINED(DARWIN)} if IconsMode = sim_all_and_exe then begin if DirectAccess and (Ext = 'desktop') then begin if LoadIcon then Result := GetIconByDesktopFile(Path + Name, FiDefaultIconID) else Result := -1; Exit; end; end; {$ENDIF} FPixmapsLock.Acquire; try Result := FExtList.Find(Ext); if Result >= 0 then Exit(PtrInt(PtrUInt(FExtList.List[Result]^.Data))); if IconsMode <= sim_standart then Exit(FiDefaultIconID); {$IF DEFINED(UNIX)} if LoadIcon = False then Exit(-1); Result := GetMimeIcon(Ext, gIconsSize); if Result < 0 then Result := FiDefaultIconID; // Default icon should also be associated with the extension // because it will be faster to find next time. FExtList.Add(Ext, Pointer(Result)); {$ENDIF} finally FPixmapsLock.Release; end; end; {$IF DEFINED(MSWINDOWS)} if DirectAccess then begin if LoadIcon = False then Exit(-1); dwFileAttributes := 0; uFlags := SHGFI_SYSICONINDEX; sFileName := FullPath; end else begin // This is fast, so do it even if LoadIcon is false. dwFileAttributes := FILE_ATTRIBUTE_NORMAL; uFlags := SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES; sFileName := Name; end; if (SHGetFileInfoW(PWideChar(UTF8Decode(sFileName)), dwFileAttributes, FileInfo, SizeOf(FileInfo), uFlags) = 0) then begin // Could not retrieve icon. if IsDirectory then Result := FiDirIconID else Result := FiDefaultIconID; end else begin Result := FileInfo.iIcon + SystemIconIndexStart; if (not IsDirectory) and (Ext <> 'exe') and (Ext <> 'ico') and (Ext <> 'lnk') then begin FPixmapsLock.Acquire; try FExtList.Add(Ext, Pointer(Result)); finally FPixmapsLock.Release; end; end; end; {$ENDIF} end; end; {$IF DEFINED(MSWINDOWS)} function TPixMapManager.GetIconOverlayByFile(AFile: TFile; DirectAccess: Boolean): PtrInt; begin if DirectAccess then Result:= SHGetOverlayIconIndex(AFile.Path, AFile.Name) + SystemIconIndexStart else Result:= -1; end; {$ENDIF} function TPixMapManager.GetIconByName(const AIconName: UTF8String): PtrInt; begin Result := CheckAddPixmap(AIconName, gIconsSize); end; function TPixMapManager.GetDriveIcon(Drive : PDrive; IconSize : Integer; clBackColor : TColor) : Graphics.TBitmap; {$IFDEF MSWINDOWS} var SFI: TSHFileInfoW; Icon: TIcon = nil; uFlags: UINT; iIconSmall, iIconLarge: Integer; {$ENDIF} begin Result := nil; {$IFDEF MSWINDOWS} if GetDeviceCaps(Application.MainForm.Canvas.Handle, BITSPIXEL) < 15 then Exit; if (not gCustomDriveIcons) and (GetDeviceCaps(Application.MainForm.Canvas.Handle, BITSPIXEL) > 16) then begin SFI.hIcon := 0; Result := Graphics.TBitMap.Create; iIconSmall:= GetSystemMetrics(SM_CXSMICON); iIconLarge:= GetSystemMetrics(SM_CXICON); if (IconSize = 16) and (iIconSmall = 16) then // standart small icon uFlags := SHGFI_SMALLICON // Use small icon else if (IconSize = 32) and (iIconLarge = 32) then // standart large icon uFlags := SHGFI_LARGEICON // Use large icon else if IconSize > iIconSmall then uFlags := SHGFI_LARGEICON // Use large icon else uFlags := SHGFI_SMALLICON; // Use small icon if (SHGetFileInfoW(PWideChar(UTF8Decode(Drive^.Path)), 0, SFI, SizeOf(SFI), uFlags or SHGFI_ICON) <> 0) and (SFI.hIcon <> 0) then begin if (IconSize = iIconSmall) or (IconSize = iIconLarge) then // standart icon size try Icon := CreateIconFromHandle(SFI.hIcon); Result.Assign(Icon); Result.Masked := True; // Need to explicitly set Masked=True, Lazarus issue #0019747 finally FreeThenNil(Icon); DestroyIcon(SFI.hIcon); end else // non standart icon size try Icon := CreateIconFromHandle(SFI.hIcon); Result.Assign(Icon); Result.Masked := True; // Need to explicitly set Masked=True, Lazarus issue #0019747 Result := StretchBitmap(Result, IconSize, clBackColor, True); finally FreeThenNil(Icon); DestroyIcon(SFI.hIcon); end end; end // not gCustomDriveIcons else {$ENDIF} begin Result := GetBuiltInDriveIcon(Drive, IconSize, clBackColor); end; end; function TPixMapManager.GetBuiltInDriveIcon(Drive : PDrive; IconSize : Integer; clBackColor : TColor) : Graphics.TBitmap; var DriveIconListIndex: Integer; Bitmap: Graphics.TBitmap; begin {$IFDEF MSWINDOWS} if GetDeviceCaps(Application.MainForm.Canvas.Handle, BITSPIXEL) < 15 then Exit(nil); {$ENDIF} case IconSize of 16: // Standart 16x16 icon size DriveIconListIndex := 0; 22: // Standart 22x22 icon size DriveIconListIndex := 1; 32: // Standart 32x32 icon size DriveIconListIndex := 2; else // for non standart icon size use more large icon for stretch DriveIconListIndex := 2; end; with FDriveIconList[DriveIconListIndex] do case Drive^.DriveType of dtFloppy: Bitmap := bmMediaFloppy; dtHardDisk: Bitmap := bmDriveHardDisk; dtFlash: Bitmap := bmMediaFlash; dtOptical: Bitmap := bmMediaOptical; dtNetwork: Bitmap := bmDriveNetwork; dtRemovable: Bitmap := bmDriveRemovableMedia; dtRemovableUsb: Bitmap := bmDriveRemovableMediaUsb; else Bitmap := bmDriveHardDisk; end; // if need stretch icon if (IconSize <> 16) and (IconSize <> 22) and (IconSize <> 32) then begin Result := StretchBitmap(Bitmap, IconSize, clBackColor, False); end else begin Result := Graphics.TBitmap.Create; Result.Assign(Bitmap); end; // 'Bitmap' should not be freed, because it only points to DriveIconList. end; function TPixMapManager.GetDefaultDriveIcon(IconSize : Integer; clBackColor : TColor) : Graphics.TBitmap; var Drive: TDrive = (DisplayName: ''; Path: ''; DriveLabel: ''; DeviceId: ''; DriveType: dtHardDisk; FileSystem: ''; IsMediaAvailable: True; IsMediaEjectable: False; IsMediaRemovable: False; IsMounted: True; AutoMount: True); begin Result := GetBuiltInDriveIcon(@Drive, IconSize, clBackColor); end; function TPixMapManager.GetVirtualDriveIcon(IconSize: Integer; clBackColor: TColor): Graphics.TBitmap; var DriveIconListIndex: Integer; begin case IconSize of 16: // Standart 16x16 icon size DriveIconListIndex := 0; 22: // Standart 22x22 icon size DriveIconListIndex := 1; 32: // Standart 32x32 icon size DriveIconListIndex := 2; else // for non standart icon size use more large icon for stretch DriveIconListIndex := 2; end; with FDriveIconList[DriveIconListIndex] do begin // if need stretch icon if (IconSize <> 16) and (IconSize <> 22) and (IconSize <> 32) then begin Result := StretchBitmap(bmDriveVirtual, IconSize, clBackColor, False); end else begin Result := Graphics.TBitmap.Create; Result.Assign(bmDriveVirtual); end; end; end; function TPixMapManager.GetArchiveIcon(IconSize: Integer; clBackColor : TColor) : Graphics.TBitmap; begin Result := GetBitmap(FiArcIconID); if Assigned(Result) then begin // if need stretch icon if (IconSize <> gIconsSize) then begin Result := StretchBitmap(Result, IconSize, clBackColor, True); end; end; end; function TPixMapManager.GetDefaultIcon(AFile: TFile): PtrInt; begin if AFile.IsDirectory then Result := FiDirIconID else if UTF8LowerCase(AFile.Extension) = 'exe' then Result := FiExeIconID else Result := FiDefaultIconID; end; procedure LoadPixMapManager; begin DCDebug('Creating PixmapManager'); PixMapManager:=TPixMapManager.Create; PixMapManager.Load(gpCfgDir + 'pixmaps.txt'); end; initialization finalization if Assigned(PixMapManager) then begin DCDebug('Shutting down PixmapManager'); FreeAndNil(PixMapManager); end; end. doublecmd-0.5.8/src/platform/uuniqueinstance.pas0000644000175000017500000001630311744454347021066 0ustar alexxalexxunit uUniqueInstance; {$mode objfpc}{$H+} interface uses Classes, SysUtils, SimpleIPC, uCmdLineParams; type TOnUniqueInstanceMessage = procedure (Sender: TObject; Params: TCommandLineParams) of object; { TUniqueInstance } TUniqueInstance = class private FHandle: THandle; FInstanceName: UTF8String; FServerIPC: TSimpleIPCServer; FClientIPC: TSimpleIPCClient; FOnMessage: TOnUniqueInstanceMessage; {$IF DEFINED(UNIX)} FMyProgramCreateSemaphore:Boolean; FPeekThread: TThreadID; {$ENDIF} procedure OnNative(Sender: TObject); procedure CreateServer; procedure CreateClient; function IsRunning: Boolean; procedure DisposeMutex; public constructor Create(aInstanceName: String); destructor Destroy; override; function IsRunInstance: Boolean; procedure SendParams; procedure RunListen; procedure StopListen; property OnMessage: TOnUniqueInstanceMessage read FOnMessage write FOnMessage; end; function IsUniqueInstance(aInstanceName: String): Boolean; {en Returns @true if current application instance is allowed to run. Returns @false if current instance should not be run. } function IsInstanceAllowed: Boolean; var UniqueInstance: TUniqueInstance = nil; implementation uses {$IF DEFINED(MSWINDOWS)} Windows, {$ELSEIF DEFINED(UNIX)} ipc, {$ENDIF} StrUtils, FileUtil, uGlobs, uDebug; {$IF DEFINED(UNIX)} type TUnixIPCServer = class(TSimpleIPCServer) end; function PeekMessage(Parameter: Pointer): PtrInt; var UnixIPC: TUnixIPCServer absolute Parameter; begin while UnixIPC.Active do begin if UnixIPC.PeekMessage(100, False) then TThread.Synchronize(nil, @UnixIPC.ReadMessage); end; end; {$ENDIF} { TUniqueInstance } procedure TUniqueInstance.OnNative(Sender: TObject); var Params: TCommandLineParams; begin if Assigned(FOnMessage) then begin FServerIPC.MsgData.Seek(0, soFromBeginning); FServerIPC.MsgData.ReadBuffer(Params, FServerIPC.MsgType); FOnMessage(Self, Params); end; end; procedure TUniqueInstance.CreateServer; begin if FServerIPC = nil then begin FServerIPC:= TSimpleIPCServer.Create(nil); FServerIPC.OnMessage:= @OnNative; end; if FClientIPC <> nil then FreeAndNil(FClientIPC); end; procedure TUniqueInstance.CreateClient; begin if FClientIPC = nil then FClientIPC:= TSimpleIPCClient.Create(nil); end; function TUniqueInstance.IsRunning: Boolean; {$IF DEFINED(MSWINDOWS)} var MutexName: AnsiString; begin Result:= False; MutexName:= ExtractFileName(ParamStr(0)); FHandle:= OpenMutex(MUTEX_MODIFY_STATE, False, PAnsiChar(MutexName)); if FHandle = 0 then FHandle:= CreateMutex(nil, True, PAnsiChar(MutexName)) else begin if WaitForSingleObject(FHandle, 0) <> WAIT_ABANDONED then Result:= True; end; end; {$ELSEIF DEFINED(UNIX)} const SEM_PERM = 6 shl 6 { 0600 }; var semkey: TKey; status: longint = 0; arg: tsemun; function semlock(semid: longint): boolean; // increase special Value in semaphore structure (value decreases automatically // when program completed incorrectly) var p_buf: tsembuf; begin p_buf.sem_num := 0; p_buf.sem_op := 1; p_buf.sem_flg := SEM_UNDO; Result:= semop(semid, @p_buf, 1) = 0; end; begin Result := False; semkey := ftok(PAnsiChar(ParamStr(0)), 0); // try create semapore for semkey // If semflg specifies both IPC_CREAT and IPC_EXCL and a semaphore set already // exists for semkey, then semget() return -1 and errno set to EEXIST FHandle := semget(semkey, 1, SEM_PERM or IPC_CREAT or IPC_EXCL); // if semaphore exists if FHandle = -1 then begin // get semaphore id FHandle := semget(semkey, 1, 0); // get special Value from semaphore structure status := semctl(FHandle, 0, SEM_GETVAL, arg); if status = 1 then // There is other running copy of the program begin Result := True; // Not to release semaphore when exiting from the program FMyProgramCreateSemaphore := false; end else begin // Other copy of the program has created a semaphore but has been completed incorrectly // increase special Value in semaphore structure (value decreases automatically // when program completed incorrectly) semlock(FHandle); // its one copy of program running, release semaphore when exiting from the program FMyProgramCreateSemaphore := true; end; end else begin // its one copy of program running, release semaphore when exiting from the program FMyProgramCreateSemaphore := true; // set special Value in semaphore structure to 0 arg.val := 0; status := semctl(FHandle, 0, SEM_SETVAL, arg); // increase special Value in semaphore structure (value decreases automatically // when program completed incorrectly) semlock(FHandle); end; end; {$ENDIF} procedure TUniqueInstance.DisposeMutex; {$IF DEFINED(MSWINDOWS)} begin ReleaseMutex(FHandle); end; {$ELSEIF DEFINED(UNIX)} var arg: tsemun; begin // If my copy of the program created a semaphore then released it if FMyProgramCreateSemaphore then semctl(FHandle, 0, IPC_RMID, arg); end; {$ENDIF} function TUniqueInstance.IsRunInstance: Boolean; begin CreateClient; FClientIPC.ServerID:= FInstanceName; Result:= IsRunning and FClientIPC.ServerRunning; end; procedure TUniqueInstance.SendParams; var Stream: TMemoryStream = nil; begin CreateClient; FClientIPC.ServerID:= FInstanceName; if not FClientIPC.ServerRunning then Exit; Stream:= TMemoryStream.Create; Stream.WriteBuffer(CommandLineParams, SizeOf(TCommandLineParams)); try FClientIPC.Connect; Stream.Seek(0, soFromBeginning); FClientIPC.SendMessage(SizeOf(TCommandLineParams), Stream); finally Stream.Free; FClientIPC.Disconnect; end; end; procedure TUniqueInstance.RunListen; begin CreateServer; FServerIPC.ServerID:= FInstanceName; FServerIPC.Global:= True; FServerIPC.StartServer; {$IF DEFINED(UNIX)} FPeekThread:= BeginThread(@PeekMessage, FServerIPC); {$ENDIF} end; procedure TUniqueInstance.StopListen; begin DisposeMutex; if FServerIPC = nil then Exit; FServerIPC.StopServer; {$IF DEFINED(UNIX)} DCDebug('Waiting for UniqueInstance thread'); WaitForThreadTerminate(FPeekThread, 0); DCDebug('Close UniqueInstance thread'); CloseThread(FPeekThread); {$ENDIF} end; constructor TUniqueInstance.Create(aInstanceName: String); begin FInstanceName:= aInstanceName; end; destructor TUniqueInstance.Destroy; begin if Assigned(FClientIPC) then FreeAndNil(FClientIPC); if Assigned(FServerIPC) then FreeAndNil(FServerIPC); inherited Destroy; end; function IsUniqueInstance(aInstanceName: String): Boolean; begin Result:= True; UniqueInstance:= TUniqueInstance.Create(aInstanceName); if UniqueInstance.IsRunInstance then begin UniqueInstance.SendParams; Exit(False); end; UniqueInstance.RunListen; end; function IsInstanceAllowed: Boolean; begin Result := (not gOnlyOneAppInstance) or IsUniqueInstance(ApplicationName); end; finalization if Assigned(UniqueInstance) then begin UniqueInstance.StopListen; FreeAndNil(UniqueInstance); end; end. doublecmd-0.5.8/src/platform/udcversion.pas0000644000175000017500000003113612255271322020014 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Version information about DC, building tools and running environment. Copyright (C) 2006-2013 Koblov Alexander (Alexx2000@mail.ru) Copyright (C) 2010 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uDCVersion; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LCLVersion; {$I dcrevision.inc} // Double Commander revision number {$I revision.inc} // Lazarus revision number const dcVersion = '0.5.8 beta'; dcBuildDate = {$I %DATE%}; lazVersion = lcl_version; // Lazarus version (major.minor.micro) lazRevision = RevisionStr; // Lazarus SVN revision fpcVersion = {$I %FPCVERSION%}; // FPC version (major.minor.micro) TargetCPU = {$I %FPCTARGETCPU%}; // Target CPU of FPC TargetOS = {$I %FPCTARGETOS%}; // Target Operating System of FPC var TargetWS, // Target WidgetSet of Lazarus OSVersion, // Operating System where DC is run WSVersion // WidgetSet library version where DC is run : String; procedure InitializeVersionInfo; implementation uses InterfaceBase {$IF DEFINED(UNIX)} , DCOSUtils, uDCUtils, DCClassesUtf8 {$IFDEF DARWIN} , MacOSAll {$ENDIF} {$ENDIF} {$IFDEF LCLQT} , qt4 {$ENDIF} {$IFDEF LCLGTK2} , gtk2 {$ENDIF} {$IFDEF MSWINDOWS} , Windows {$ENDIF} ; const // A custom version of InterfaceBase.LCLPlatformDirNames // because we make slight changes to names. LCLPlatform: array[TLCLPlatform] of string = ( 'gtk1', 'gtk2', {$if lcl_fullversion >= 1010000} 'gtk3', {$endif} 'win32/win64', 'wince', 'carbon', 'qt4', 'fpGUI', 'NoGUI', 'cocoa', 'customdrawn' ); {$IF DEFINED(UNIX)} {en Reads file into strings. Returns @false if file not found or cannot be read. } function GetStringsFromFile(FileName: UTF8String; out sl: TStringListEx): Boolean; begin Result := False; sl := nil; if mbFileAccess(FileName, fmOpenRead) then begin sl := TStringListEx.Create; try sl.LoadFromFile(FileName); Result := True; except on EFilerError do; // Bypass end; end; end; {en Reads first line of file into a string. Returns @false if file not found or cannot be read. } function GetStringFromFile(FileName: UTF8String; out str: String): Boolean; var sl: TStringListEx; begin str := EmptyStr; Result := GetStringsFromFile(FileName, sl); if Result then try if sl.Count > 0 then str := sl.Strings[0]; finally sl.Free; end; end; function GetOsFromLsbRelease: String; var sl: TStringListEx; begin Result := EmptyStr; if GetStringsFromFile('/etc/lsb-release', sl) then try if sl.Count > 0 then begin Result := sl.Values['DISTRIB_DESCRIPTION']; if Result <> EmptyStr then Result := TrimQuotes(Result) else Result := sl.Values['DISTRIB_ID'] + sl.Values['DISTRIB_RELEASE'] + sl.Values['DISTRIB_CODENAME']; end; finally sl.Free; end; end; function GetOsFromProcVersion: String; var i: Integer; s: String; begin Result := EmptyStr; if GetStringFromFile('/proc/version', s) then begin // Get first three strings separated by space. i := Pos(' ', s); if i > 0 then Result := Result + Copy(s, 1, i); Delete(s, 1, i); i := Pos(' ', s); if i > 0 then Result := Result + Copy(s, 1, i); Delete(s, 1, i); i := Pos(' ', s); if i > 0 then Result := Result + Copy(s, 1, i - 1); Delete(s, 1, i); end; end; function GetOsFromIssue: String; begin if not GetStringFromFile('/etc/issue', Result) then Result := EmptyStr; end; function GetDebianVersion: String; var s: String; begin if GetStringFromFile('/etc/debian_version', s) then begin Result := 'Debian'; if s <> EmptyStr then Result := Result + ' ' + s; end else Result := EmptyStr; end; function GetSuseVersion: String; begin if GetStringFromFile('/etc/SuSE-release', Result) or GetStringFromFile('/etc/suse-release', Result) then begin if Result = EmptyStr then Result := 'Suse'; end else Result := EmptyStr; end; function GetRedHatVersion: String; begin if GetStringFromFile('/etc/redhat-release', Result) then begin if Result = EmptyStr then Result := 'RedHat'; end else Result := EmptyStr; end; function GetMandrakeVersion: String; begin if GetStringFromFile('/etc/mandrake-release', Result) then begin if Result = EmptyStr then Result := 'Mandrake'; end else Result := EmptyStr; end; {$IFDEF DARWIN} function GetMacOSXVersion: String; var systemVersion, versionMajor, versionMinor, versionBugFix: SInt32; begin Result := EmptyStr; if (Gestalt(gestaltSystemVersion, systemVersion) <> noErr) then Exit; if (systemVersion < $1040) then begin versionMajor := ((systemVersion and $F000) shr 12) * 10 + ((systemVersion and $0F00) shr 8); versionMinor := (systemVersion and $00F0) shr 4; versionBugFix := (systemVersion and $000F); end else begin if (Gestalt(gestaltSystemVersionMajor, versionMajor) <> noErr) then Exit; if (Gestalt(gestaltSystemVersionMinor, versionMinor) <> noErr) then Exit; if (Gestalt(gestaltSystemVersionBugFix, versionBugFix) <> noErr) then Exit; end; Result:= Format('Mac OS X %d.%d.%d', [versionMajor, versionMinor, versionBugFix]); end; {$ENDIF} {$ENDIF} {$IF DEFINED(MSWINDOWS)} procedure TryGetNativeSystemInfo(var SystemInfo: TSystemInfo); type TGetNativeSystemInfo = procedure (var lpSystemInfo: TSystemInfo); stdcall; var hLib: HANDLE; GetNativeSystemInfoProc: TGetNativeSystemInfo; begin hLib := LoadLibrary(LPCTSTR('kernel32.dll')); if hLib <> 0 then begin try GetNativeSystemInfoProc := TGetNativeSystemInfo(GetProcAddress(hLib, 'GetNativeSystemInfo')); if Assigned(GetNativeSystemInfoProc) then GetNativeSystemInfoProc(SystemInfo) else GetSystemInfo(SystemInfo); finally FreeLibrary(hLib); end; end else GetSystemInfo(SystemInfo); end; {$ENDIF} procedure InitializeVersionInfo; {$IFDEF LCLQT} const qtLibQt4PasRev = '23858'; {$ENDIF} {$IF DEFINED(MSWINDOWS)} type OSVERSIONINFOEX = record dwOSVersionInfoSize : DWORD; dwMajorVersion : DWORD; dwMinorVersion : DWORD; dwBuildNumber : DWORD; dwPlatformId : DWORD; szCSDVersion : array[0..127] of Char; wServicePackMajor : WORD; wServicePackMinor : WORD; wSuiteMask : WORD; wProductType : BYTE; wReserved : BYTE; end; const VER_NT_WORKSTATION = $0000001; VER_NT_SERVER = $0000003; PROCESSOR_ARCHITECTURE_AMD64 = 9; var osvi: OSVERSIONINFOEX; si: SYSTEM_INFO; {$ENDIF} begin TargetWS := LCLPlatform[WidgetSet.LCLPlatform]; {$IF DEFINED(MSWINDOWS)} OSVersion := 'Windows'; ZeroMemory(@osvi, SizeOf(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize := SizeOf(OSVERSIONINFOEX); if GetVersionEx(@osvi) then begin ZeroMemory(@si, SizeOf(si)); TryGetNativeSystemInfo(si); case osvi.dwPlatformId of VER_PLATFORM_WIN32_WINDOWS: case osvi.dwMajorVersion of 4: case osvi.dwMinorVersion of 0: OSVersion := OSVersion + ' 95'; 10: OSVersion := OSVersion + ' 98'; 90: OSVersion := OSVersion + ' ME'; end; end; VER_PLATFORM_WIN32_NT: begin case osvi.dwMajorVersion of 3: OSVersion := OSVersion + ' NT 3.5'; 4: OSVersion := OSVersion + ' NT 4'; 5: case osvi.dwMinorVersion of 0: OSVersion := OSVersion + ' 2000'; 1: begin OSVersion := OSVersion + ' XP'; if osvi.wSuiteMask = $0000 then OSVersion := OSVersion + ' Home' else if osvi.wSuiteMask = $0200 then OSVersion := OSVersion + ' Professional'; end; 2: if (osvi.wProductType = VER_NT_WORKSTATION) and (si.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64) then begin OSVersion := OSVersion + ' XP Professional x64' end else if (osvi.wProductType = VER_NT_SERVER) then begin if osvi.wSuiteMask = $8000 then OSVersion := OSVersion + ' Home Server' else OSVersion := OSVersion + ' Server 2003'; end; end; 6: case osvi.dwMinorVersion of 0: if (osvi.wProductType = VER_NT_WORKSTATION) then begin OSVersion := OSVersion + ' Vista'; if osvi.wSuiteMask = $0000 then OSVersion := OSVersion + ' Ultimate' else if osvi.wSuiteMask = $0200 then OSVersion := OSVersion + ' Home'; end else if (osvi.wProductType = VER_NT_SERVER) then OSVersion := OSVersion + ' Server 2008'; 1: if (osvi.wProductType = VER_NT_WORKSTATION) then OSVersion := OSVersion + ' 7' else if (osvi.wProductType = VER_NT_SERVER) then OSVersion := OSVersion + ' Server 2008 R2'; 2: if (osvi.wProductType = VER_NT_WORKSTATION) then OSVersion := OSVersion + ' 8' else if (osvi.wProductType = VER_NT_SERVER) then OSVersion := OSVersion + ' Server 2012'; end; end; end; end; // If something detected then add service pack number and architecture. if OSVersion <> 'Windows' then begin if osvi.wServicePackMajor > 0 then begin OSVersion := OSVersion + ' SP' + IntToStr(osvi.wServicePackMajor); if osvi.wServicePackMinor > 0 then OSVersion := OSVersion + '.' + IntToStr(osvi.wServicePackMinor); end; if si.wProcessorArchitecture in [PROCESSOR_ARCHITECTURE_AMD64] then OSVersion := OSVersion + ' x86_64' else OSVersion := OSVersion + ' i386'; end else OSVersion := OSVersion + ' Build ' + IntToStr(osvi.dwBuildNumber); end; {$ELSEIF DEFINED(UNIX)} // Try using linux standard base. OSVersion := GetOsFromLsbRelease; // Try some distribution-specific files. if OSVersion = EmptyStr then OSVersion := GetDebianVersion; if OSVersion = EmptyStr then OSVersion := GetRedHatVersion; if OSVersion = EmptyStr then OSVersion := GetSuseVersion; if OSVersion = EmptyStr then OSVersion := GetMandrakeVersion; {$IFDEF DARWIN} if OSVersion = EmptyStr then OSVersion := GetMacOSXVersion; {$ENDIF} // Other methods. if OSVersion = EmptyStr then OSVersion := GetOsFromIssue; if OSVersion = EmptyStr then OSVersion := GetOsFromProcVersion; // Set default names. if OSVersion = EmptyStr then {$IF DEFINED(LINUX)} OSVersion := 'Linux'; {$ELSEIF DEFINED(DARWIN)} OSVersion := 'Darwin'; // MacOS {$ELSEIF DEFINED(BSD)} OSVersion := 'BSD'; {$ELSE} OSVersion := 'Unix'; {$ENDIF} {$ENDIF} {$IFDEF LCLQT} {$IF RevisionStr >= qtLibQt4PasRev} // Only since Lazarus 0.9.29 Qt bindings v2.1. WSVersion := 'Qt ' + QtVersion + ', libQt4Pas '; {$ELSE} WSVersion := 'libqt4intf '; {$ENDIF} WSVersion := WSVersion + IntToStr((QT_VERSION shr 16) and 255) + '.' + IntToStr((QT_VERSION shr 8) and 255) + '.' + IntToStr((QT_VERSION ) and 255); {$ENDIF} {$IFDEF LCLGTK2} WSVersion := 'GTK ' + IntToStr(gtk_major_version) + '.' + IntToStr(gtk_minor_version) + '.' + IntToStr(gtk_micro_version); {$ENDIF} end; end. doublecmd-0.5.8/src/platform/uOSUtils.pas0000644000175000017500000006427512257475470017410 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- This unit contains platform depended functions. Copyright (C) 2006-2013 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uOSUtils; {$mode delphi}{$H+} interface uses SysUtils, Classes, LCLType, uDrive, DCBasicTypes {$IF DEFINED(UNIX)} , DCFileAttributes {$IFDEF DARWIN} , MacOSAll {$ENDIF} {$ENDIF} ; const {$IF DEFINED(MSWINDOWS)} faFolder = faDirectory; RunTerm = 'cmd.exe'; // default terminal RunInTerm = 'cmd.exe /K'; // default run in terminal command fmtRunInTerm = '%s "%s"'; fmtRunInShell = '%s /C "%s"'; fmtCommandPath = '%s>'; MonoSpaceFont = 'Fixedsys'; {$ELSEIF DEFINED(UNIX)} faFolder = S_IFDIR; {$IFDEF DARWIN)} RunTerm = '/Applications/Utilities/Terminal.app'; // default terminal RunInTerm = ''; // default run in terminal command fmtRunInTerm = ''; {$ELSE} RunTerm = 'xterm'; // default terminal RunInTerm = 'xterm -e sh -c'; // default run in terminal command fmtRunInTerm = '%s ''%s ; echo -n Press ENTER to exit... ; read a'''; {$ENDIF} fmtRunInShell = '%s -c ''%s'''; fmtCommandPath = '[%s]$:'; MonoSpaceFont = 'Monospace'; {$ENDIF} type EInvalidCommandLine = class(Exception); EInvalidQuoting = class(EInvalidCommandLine) constructor Create; reintroduce; end; function FileIsLinkToFolder(const FileName: UTF8String; out LinkTarget: UTF8String): Boolean; function ExecCmdFork(sCmdLine:String; bTerm : Boolean = False; sTerm : String = ''; bKeepTerminalOpen: Boolean = True):Boolean; {en Opens a file or URL in the user's preferred application @param(URL File name or URL) @returns(The function returns @true if successful, @false otherwise) } function ShellExecute(URL: UTF8String): Boolean; function GetDiskFreeSpace(const Path : String; out FreeSize, TotalSize : Int64) : Boolean; {en Get maximum file size for a mounted file system @param(Path The pathname of any file within the mounted file system) @returns(The maximum file size for a mounted file system) } function GetDiskMaxFileSize(const Path : UTF8String) : Int64; {en Create a hard link to a file @param(Path Name of file) @param(LinkName Name of hard link) @returns(The function returns @true if successful, @false otherwise) } function CreateHardLink(const Path, LinkName: String) : Boolean; {en Create a symbolic link @param(Path Name of file) @param(LinkName Name of symbolic link) @returns(The function returns @true if successful, @false otherwise) } function CreateSymLink(const Path, LinkName: string) : Boolean; {en Read destination of symbolic link @param(LinkName Name of symbolic link) @returns(The file name/path the symbolic link name is pointing to. The path may be relative to link's location.) } function ReadSymLink(const LinkName : String) : String; {en Reads the concrete file's name that the link points to. If the link points to a link then it's resolved recursively until a valid file name that is not a link is found. @param(PathToLink Name of symbolic link (absolute path)) @returns(The absolute filename the symbolic link name is pointing to, or an empty string when the link is invalid or the file it points to does not exist.) } function mbReadAllLinks(const PathToLink : String) : String; {en If PathToLink points to a link then it returns file that the link points to (recursively). If PathToLink does not point to a link then PathToLink value is returned. } function mbCheckReadLinks(const PathToLink : String) : String; {en Get the user home directory @returns(The user home directory) } function GetHomeDir : String; {en Get the appropriate directory for the application's configuration files @returns(The directory for the application's configuration files) } function GetAppConfigDir: String; {en Get the appropriate directory for the application's cache files @returns(The directory for the application's cache files) } function GetAppCacheDir: UTF8String; function GetTempFolder: String; {en Get the system specific self extracting archive extension @returns(Self extracting archive extension) } function GetSfxExt: String; function IsAvailable(Drive: PDrive; TryMount: Boolean = True) : Boolean; function GetShell : String; {en Formats a string which will execute Command via shell. } function FormatShell(const Command: String): String; {en Formats a string which will execute Command in a terminal. } function FormatTerminal(Command: String; bKeepTerminalOpen: Boolean): String; {en Same as mbFileGetAttr, but dereferences any encountered links. } function mbFileGetAttrNoLinks(const FileName: UTF8String): TFileAttrs; {en Convert file name to system encoding, if name can not be represented in current locale then use short file name under Windows. } function mbFileNameToSysEnc(const LongPath: UTF8String): String; function mbGetEnvironmentVariable(const sName: UTF8String): UTF8String; function mbSetEnvironmentVariable(const sName, sValue: UTF8String): Boolean; {en Extract the root directory part of a file name. @returns(Drive letter under Windows and mount point under Unix) } function ExtractRootDir(const FileName: UTF8String): UTF8String; procedure FixFormIcon(Handle: LCLType.HWND); procedure HideConsoleWindow; procedure FixDateNamesToUTF8; function ParamStrU(Param: Integer): UTF8String; overload; function ParamStrU(const Param: String): UTF8String; overload; implementation uses FileUtil, uDCUtils, DCOSUtils, DCStrUtils, uGlobs, uLng {$IF DEFINED(MSWINDOWS)} , JwaWinCon, Windows, uNTFSLinks, uMyWindows, JwaWinNetWk, uShlObjAdditional , shlobj {$ENDIF} {$IF DEFINED(UNIX)} , BaseUnix, Unix, uMyUnix, dl {$IF NOT DEFINED(DARWIN)} , uGio, uClipboard {$ENDIF} {$ENDIF} ; {$IFDEF UNIX} type {en Waits for a child process to finish and collects its exit status, causing it to be released by the system (prevents defunct processes). Instead of the wait-thread we could just ignore or handle SIGCHLD signal for the process, but this way we don't interfere with the signal handling. The downside is that there's a thread for every child process running. Another method is to periodically do a cleanup, for example from OnIdle or OnTimer event. Remember PIDs of spawned child processes and when cleaning call FpWaitpid(PID, nil, WNOHANG) on each PID. Downside is they are not released immediately after the child process finish (may be relevant if we want to display exit status to the user). } TWaitForPidThread = class(TThread) private FPID: TPid; protected procedure Execute; override; public constructor Create(WaitForPid: TPid); overload; end; constructor TWaitForPidThread.Create(WaitForPid: TPid); begin inherited Create(True); FPID := WaitForPid; FreeOnTerminate := True; end; procedure TWaitForPidThread.Execute; begin while (FpWaitPid(FPID, nil, 0) = -1) and (fpgeterrno() = ESysEINTR) do; end; {$ENDIF} function FileIsLinkToFolder(const FileName: UTF8String; out LinkTarget: UTF8String): Boolean; {$IF DEFINED(MSWINDOWS)} begin Result:= False; if LowerCase(ExtractOnlyFileExt(FileName)) = 'lnk' then Result:= SHFileIsLinkToFolder(FileName, LinkTarget); end; {$ELSEIF DEFINED(UNIX)} begin Result:= False; if LowerCase(ExtractOnlyFileExt(FileName)) = 'desktop' then Result:= uMyUnix.FileIsLinkToFolder(FileName, LinkTarget); end; {$ENDIF} (* Execute external commands *) function ExecCmdFork(sCmdLine:String; bTerm : Boolean; sTerm : String; bKeepTerminalOpen: Boolean) : Boolean; {$IFDEF UNIX} var Command : String; pid : LongInt; Args : TDynamicStringArray; WaitForPidThread: TWaitForPidThread; begin if bTerm then sCmdLine := FormatTerminal(sCmdLine, bKeepTerminalOpen); SplitCmdLine(UTF8ToSys(sCmdLine), Command, Args); {$IFDEF DARWIN} // If we run application bundle (*.app) then // execute it by 'open -a' command (see 'man open' for details) if StrEnds(Command, '.app') then begin SetLength(Args, Length(Args) + 2); for pid := High(Args) downto Low(Args) + 2 do Args[pid]:= Args[pid - 2]; Args[0] := '-a'; Args[1] := Command; Command := 'open'; end; {$ENDIF} if Command = EmptyStr then Exit(False); pid := fpFork; if pid = 0 then begin { The child does the actual exec, and then exits } if FpExecLP(Command, Args) = -1 then Writeln(Format('Execute error %d: %s', [fpgeterrno, SysErrorMessageUTF8(fpgeterrno)])); { If the FpExecLP fails, we return an exitvalue of 127, to let it be known } fpExit(127); end else if pid = -1 then { Fork failed } begin raise Exception.Create('Fork failed: ' + Command); end else if pid > 0 then { Parent } begin WaitForPidThread := TWaitForPidThread.Create(pid); WaitForPidThread.Start; end; Result := (pid > 0); end; {$ELSE} var sFileName, sParams: String; wFileName, wParams, wWorkDir: WideString; begin wWorkDir:= UTF8Decode(mbGetCurrentDir); if bTerm then begin if sTerm = '' then sTerm := RunInTerm; sCmdLine := Format(fmtRunInTerm, [sTerm, sCmdLine]); end; SplitCmdLine(sCmdLine, sFileName, sParams); sFileName:= NormalizePathDelimiters(sFileName); wFileName:= UTF8Decode(sFileName); wParams:= UTF8Decode(sParams); Result := (ShellExecuteW(0, nil, PWChar(wFileName), PWChar(wParams), PWChar(wWorkDir), SW_SHOW) > 32); end; {$ENDIF} function ShellExecute(URL: UTF8String): Boolean; {$IF DEFINED(MSWINDOWS)} var Return: HINST; wsFileName: WideString; begin URL:= NormalizePathDelimiters(URL); wsFileName:= UTF8Decode(QuoteDouble(URL)); Return:= ShellExecuteW(0, nil, PWideChar(wsFileName), nil, nil, SW_SHOWNORMAL); if Return = SE_ERR_NOASSOC then Result:= ExecCmdFork('rundll32 shell32.dll OpenAs_RunDLL ' + URL) else Result:= Return > 32; end; {$ELSEIF DEFINED(DARWIN)} var theFileNameCFRef: CFStringRef = nil; theFileNameUrlRef: CFURLRef = nil; theFileNameFSRef: FSRef; begin Result:= False; try theFileNameCFRef:= CFStringCreateWithFileSystemRepresentation(nil, PAnsiChar(URL)); theFileNameUrlRef:= CFURLCreateWithFileSystemPath(nil, theFileNameCFRef, kCFURLPOSIXPathStyle, False); if (CFURLGetFSRef(theFileNameUrlRef, theFileNameFSRef)) then begin Result:= (LSOpenFSRef(theFileNameFSRef, nil) = noErr); end; finally if Assigned(theFileNameCFRef) then CFRelease(theFileNameCFRef); if Assigned(theFileNameUrlRef) then CFRelease(theFileNameUrlRef); end; end; {$ELSE} var DesktopEnv: Cardinal; sCmdLine: UTF8String; begin Result:= False; sCmdLine:= EmptyStr; if FileIsUnixExecutable(URL) then begin if GetPathType(URL) <> ptAbsolute then sCmdLine := './'; sCmdLine:= sCmdLine + QuoteStr(URL); end else begin DesktopEnv:= GetDesktopEnvironment; if (DesktopEnv = DE_KDE) and (FindDefaultExecutablePath('kioclient') <> EmptyStr) then sCmdLine:= 'kioclient exec ' + QuoteStr(URL) // Under KDE use "kioclient" to open files else if (DesktopEnv = DE_XFCE) and (FindDefaultExecutablePath('exo-open') <> EmptyStr) then sCmdLine:= 'exo-open ' + FileNameToURI(URL) // Under Xfce use "exo-open" to open files else if HasGio then Result:= GioOpen(URL) // Under GNOME, Unity and LXDE use "GIO" to open files else begin if GetPathType(URL) = ptAbsolute then sCmdLine:= URL else begin sCmdLine := IncludeTrailingPathDelimiter(mbGetCurrentDir); sCmdLine:= GetAbsoluteFileName(sCmdLine, URL) end; sCmdLine:= GetDefaultAppCmd(sCmdLine); end; end; if Length(sCmdLine) <> 0 then Result:= ExecCmdFork(sCmdLine); end; {$ENDIF} (* Get Disk Free Space *) function GetDiskFreeSpace(const Path : String; out FreeSize, TotalSize : Int64) : Boolean; {$IFDEF UNIX} var sbfs: TStatFS; begin Result:= (fpStatFS(PChar(UTF8ToSys(Path)), @sbfs) = 0); if not Result then Exit; FreeSize := (Int64(sbfs.bavail)*sbfs.bsize); {$IF DEFINED(CPU32) or (FPC_VERSION>2) or ((FPC_VERSION=2) and ((FPC_RELEASE>2) or ((FPC_RELEASE=2) and (FPC_PATCH>=3))))} TotalSize := (Int64(sbfs.blocks)*sbfs.bsize); {$ENDIF} end; {$ELSE} var wPath: WideString; begin wPath:= UTF8Decode(Path); Result:= GetDiskFreeSpaceExW(PWChar(wPath), FreeSize, TotalSize, nil); end; {$ENDIF} function GetDiskMaxFileSize(const Path: UTF8String): Int64; {$IFDEF UNIX} const MSDOS_SUPER_MAGIC = $4d44; var sbfs: TStatFS; begin Result := High(Int64); if (fpStatFS(PChar(UTF8ToSys(Path)), @sbfs) = 0) then begin {$IFDEF BSD} if (sbfs.ftype = MSDOS_SUPER_MAGIC) then {$ELSE} if (sbfs.fstype = MSDOS_SUPER_MAGIC) then {$ENDIF} Result:= $FFFFFFFF; // 4 Gb end; end; {$ELSE} var lpVolumeNameBuffer, lpFileSystemNameBuffer : array [0..255] of WideChar; lpMaximumComponentLength, lpFileSystemFlags : DWORD; begin Result := High(Int64); if GetVolumeInformationW(PWideChar(UTF8Decode(ExtractFileDrive(Path)) + PathDelim), lpVolumeNameBuffer, SizeOf(lpVolumeNameBuffer), nil, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, SizeOf(lpFileSystemNameBuffer)) then begin if SameText(lpFileSystemNameBuffer, 'FAT') then Result:= $80000000 // 2 Gb else if SameText(lpFileSystemNameBuffer, 'FAT32') then Result:= $FFFFFFFF; // 4 Gb end; end; {$ENDIF} function CreateHardLink(const Path, LinkName: String) : Boolean; {$IFDEF MSWINDOWS} var wsPath, wsLinkName: WideString; begin Result:= True; try wsPath:= UTF8Decode(Path); wsLinkName:= UTF8Decode(LinkName); Result:= uNTFSLinks.CreateHardlink(wsPath, wsLinkName); except Result:= False; end; end; {$ELSE} begin Result := (fplink(PChar(UTF8ToSys(Path)),PChar(UTF8ToSys(LinkName)))=0); end; {$ENDIF} function CreateSymLink(const Path, LinkName: string) : Boolean; {$IFDEF MSWINDOWS} var wsPath, wsLinkName: WideString; begin Result := True; try wsPath:= UTF8Decode(Path); wsLinkName:= UTF8Decode(LinkName); Result:= uNTFSLinks.CreateSymlink(wsPath, wsLinkName); except Result := False; end; end; {$ELSE} begin Result := (fpsymlink(PChar(UTF8ToSys(Path)),PChar(UTF8ToSys(LinkName)))=0); end; {$ENDIF} (* Get symlink target *) function ReadSymLink(const LinkName : String) : String; {$IFDEF MSWINDOWS} var wsLinkName, wsTarget: WideString; begin try wsLinkName:= UTF8Decode(LinkName); if uNTFSLinks.ReadSymLink(wsLinkName, wsTarget) then Result := UTF8Encode(wsTarget) else Result := ''; except Result := ''; end; end; {$ELSE} begin Result := SysToUTF8(fpReadlink(UTF8ToSys(LinkName))); end; {$ENDIF} function mbReadAllLinks(const PathToLink: String) : String; var Attrs: TFileAttrs; LinkTargets: TStringList; // A list of encountered filenames (for detecting cycles) function mbReadAllLinksRec(const PathToLink: String): String; begin Result := ReadSymLink(PathToLink); if Result <> '' then begin if GetPathType(Result) <> ptAbsolute then Result := GetAbsoluteFileName(ExtractFilePath(PathToLink), Result); if LinkTargets.IndexOf(Result) >= 0 then begin // Link already encountered - links form a cycle. Result := ''; {$IFDEF UNIX} fpseterrno(ESysELOOP); {$ENDIF} Exit; end; Attrs := mbFileGetAttr(Result); if (Attrs <> faInvalidAttributes) then begin if FPS_ISLNK(Attrs) then begin // Points to a link - read recursively. LinkTargets.Add(Result); Result := mbReadAllLinksRec(Result); end; // else points to a file/dir end else begin Result := ''; // Target of link doesn't exist {$IFDEF UNIX} fpseterrno(ESysENOENT); {$ENDIF} end; end; end; begin LinkTargets := TStringList.Create; try Result := mbReadAllLinksRec(PathToLink); finally FreeAndNil(LinkTargets); end; end; function mbCheckReadLinks(const PathToLink : String): String; var Attrs: TFileAttrs; begin Attrs := mbFileGetAttr(PathToLink); if (Attrs <> faInvalidAttributes) and FPS_ISLNK(Attrs) then Result := mbReadAllLinks(PathToLink) else Result := PathToLink; end; function GetHomeDir : String; {$IFDEF MSWINDOWS} var iSize: Integer; wHomeDir: WideString; begin iSize:= GetEnvironmentVariableW('USERPROFILE', nil, 0); if iSize > 0 then begin SetLength(wHomeDir, iSize); GetEnvironmentVariableW('USERPROFILE', PWChar(wHomeDir), iSize); end; Delete(wHomeDir, iSize, 1); Result:= ExcludeBackPathDelimiter(UTF8Encode(wHomeDir)); end; {$ELSE} begin Result:= ExcludeBackPathDelimiter(SysToUTF8(GetEnvironmentVariable('HOME'))); end; {$ENDIF} function GetShell : String; {$IFDEF MSWINDOWS} var iSize: Integer; wShell: WideString; begin iSize:= GetEnvironmentVariableW('ComSpec', nil, 0); if iSize > 0 then begin SetLength(wShell, iSize); GetEnvironmentVariableW('ComSpec', PWChar(wShell), iSize); end; Delete(wShell, iSize, 1); Result:= UTF8Encode(wShell); end; {$ELSE} begin Result:= SysToUTF8(GetEnvironmentVariable('SHELL')); end; {$ENDIF} function FormatShell(const Command: String): String; begin {$IF DEFINED(UNIX)} Result := Format('%s -c %s', [GetShell, QuoteSingle(Command)]); {$ELSEIF DEFINED(MSWINDOWS)} Result := Format('%s /C %s', [GetShell, QuoteDouble(Command)]); {$ENDIF} end; function FormatTerminal(Command: String; bKeepTerminalOpen: Boolean): String; begin {$IF DEFINED(UNIX)} if bKeepTerminalOpen then Command := Command + '; echo -n Press ENTER to exit... ; read a'; Result := Format('%s %s', [gRunInTerm, QuoteSingle(Command)]); {$ELSEIF DEFINED(MSWINDOWS)} // TODO: See if keeping terminal window open can be implemented on Windows. Result := Format('%s %s', [gRunInTerm, QuoteDouble(Command)]); {$ENDIF} end; function GetAppConfigDir: String; {$IF DEFINED(MSWINDOWS)} const SHGFP_TYPE_CURRENT = 0; var wPath: array[0..MAX_PATH-1] of WideChar; wUser: WideString; dwLength: DWORD; begin if SUCCEEDED(SHGetFolderPathW(0, CSIDL_APPDATA or CSIDL_FLAG_CREATE, 0, SHGFP_TYPE_CURRENT, @wPath[0])) or SUCCEEDED(SHGetFolderPathW(0, CSIDL_LOCAL_APPDATA or CSIDL_FLAG_CREATE, 0, SHGFP_TYPE_CURRENT, @wPath[0])) then begin Result := UTF8Encode(WideString(wPath)); end else begin dwLength := UNLEN + 1; SetLength(wUser, dwLength); if GetUserNameW(PWideChar(wUser), @dwLength) then begin SetLength(wUser, dwLength - 1); Result := GetTempDir + UTF8Encode(wUser); end else Result := EmptyStr; end; if Result <> '' then Result := Result + DirectorySeparator + ApplicationName; end; {$ELSEIF DEFINED(DARWIN)} begin Result:= GetHomeDir + '/Library/Preferences/' + ApplicationName; end; {$ELSE} var uinfo: PPasswordRecord; begin uinfo:= getpwuid(fpGetUID); if (uinfo <> nil) and (uinfo^.pw_dir <> '') then Result:= SysToUTF8(uinfo^.pw_dir) + '/.config/' + ApplicationName else Result:= ExcludeTrailingPathDelimiter(SysToUTF8(SysUtils.GetAppConfigDir(False))); end; {$ENDIF} function GetAppCacheDir: UTF8String; {$IF DEFINED(MSWINDOWS)} var APath: array[0..MAX_PATH] of WideChar; begin if SHGetSpecialFolderPathW(0, APath, CSIDL_LOCAL_APPDATA, True) then Result:= UTF8Encode(WideString(APath)) + DirectorySeparator + ApplicationName else Result:= GetAppConfigDir; end; {$ELSEIF DEFINED(DARWIN)} begin Result:= GetHomeDir + '/Library/Caches/' + ApplicationName; end; {$ELSE} var uinfo: PPasswordRecord; begin uinfo:= getpwuid(fpGetUID); if (uinfo <> nil) and (uinfo^.pw_dir <> '') then Result:= SysToUTF8(uinfo^.pw_dir) + '/.cache/' + ApplicationName else Result:= GetHomeDir + '/.cache/' + ApplicationName; end; {$ENDIF} function GetTempFolder: String; begin Result:= GetTempDir + '_dc'; if not mbDirectoryExists(Result) then mbCreateDir(Result); Result:= Result + PathDelim; end; function GetSfxExt: String; {$IFDEF MSWINDOWS} begin Result:= '.exe'; end; {$ELSE} begin Result:= '.run'; end; {$ENDIF} function IsAvailable(Drive: PDrive; TryMount: Boolean): Boolean; {$IF DEFINED(MSWINDOWS)} var Drv: String; DriveLabel: String; NetResource: TNetResourceW; wsLocalName, wsRemoteName: WideString; begin Drv:= ExtractFileDrive(Drive^.Path) + PathDelim; // Try to close CD/DVD drive if (GetDriveType(PChar(Drv)) = DRIVE_CDROM) and TryMount and (not mbDriveReady(Drv)) then begin DriveLabel:= mbGetVolumeLabel(Drv, False); mbCloseCD(Drv); if mbDriveReady(Drv) then mbWaitLabelChange(Drv, DriveLabel); end; // Try to connect to mapped network drive if (Drive^.DriveType = dtNetwork) and TryMount and (not mbDriveReady(Drv)) then begin wsLocalName := UTF8Decode(ExtractFileDrive(Drive^.Path)); wsRemoteName := UTF8Decode(Drive^.DriveLabel); FillChar(NetResource, SizeOf(NetResource), #0); NetResource.dwType:= RESOURCETYPE_DISK; NetResource.lpLocalName:= PWideChar(wsLocalName); NetResource.lpRemoteName:= PWideChar(wsRemoteName); WNetAddConnection2W(NetResource, nil, nil, CONNECT_INTERACTIVE); end; Result:= mbDriveReady(Drv); end; {$ELSEIF DEFINED(DARWIN)} begin // Because we show under Mac OS X only mounted volumes Result:= True; end; {$ELSEIF DEFINED(LINUX)} var mtab: PIOFile; pme: PMountEntry; begin Result:= False; mtab:= setmntent(_PATH_MOUNTED,'r'); if not Assigned(mtab) then exit; pme:= getmntent(mtab); while (pme <> nil) do begin if SysToUTF8(pme.mnt_dir) = Drive^.Path then begin Result:= True; Break; end; pme:= getmntent(mtab); end; endmntent(mtab); if not Result and TryMount then Result := MountDrive(Drive); end; {$ELSE} begin Result:= True; end; {$ENDIF} function mbFileGetAttrNoLinks(const FileName: UTF8String): TFileAttrs; {$IFDEF UNIX} var Info: BaseUnix.Stat; begin if fpStat(UTF8ToSys(FileName), Info) >= 0 then Result := Info.st_mode else Result := faInvalidAttributes; end; {$ELSE} var LinkTarget: UTF8String; begin LinkTarget := mbReadAllLinks(FileName); if LinkTarget <> '' then Result := mbFileGetAttr(LinkTarget) else Result := faInvalidAttributes; end; {$ENDIF} function mbFileNameToSysEnc(const LongPath: UTF8String): String; {$IFDEF MSWINDOWS} begin Result:= UTF8ToSys(LongPath); if Pos('?', Result) <> 0 then mbGetShortPathName(LongPath, Result); end; {$ELSE} begin Result:= UTF8ToSys(LongPath); end; {$ENDIF} function mbGetEnvironmentVariable(const sName: UTF8String): UTF8String; {$IFDEF MSWINDOWS} var wsName: WideString; smallBuf: array[0..1023] of WideChar; largeBuf: PWideChar; dwResult: DWORD; begin Result := EmptyStr; wsName := UTF8Decode(sName); dwResult := GetEnvironmentVariableW(PWideChar(wsName), @smallBuf[0], Length(smallBuf)); if dwResult > Length(smallBuf) then begin // Buffer not large enough. largeBuf := GetMem(SizeOf(WideChar) * dwResult); if Assigned(largeBuf) then try dwResult := GetEnvironmentVariableW(PWideChar(wsName), largeBuf, dwResult); if dwResult > 0 then Result := UTF8Encode(WideString(largeBuf)); finally FreeMem(largeBuf); end; end else if dwResult > 0 then Result := UTF8Encode(WideString(smallBuf)); end; {$ELSE} begin Result:= SysToUTF8(GetEnvironmentVariable(UTF8ToSys(sName))); end; {$ENDIF} function mbSetEnvironmentVariable(const sName, sValue: UTF8String): Boolean; {$IFDEF MSWINDOWS} var wsName, wsValue: WideString; begin wsName:= UTF8Decode(sName); wsValue:= UTF8Decode(sValue); Result:= SetEnvironmentVariableW(PWideChar(wsName), PWideChar(wsValue)); end; {$ELSE} begin Result:= (setenv(PChar(UTF8ToSys(sName)), PChar(UTF8ToSys(sValue)), 1) = 0); end; {$ENDIF} function ExtractRootDir(const FileName: UTF8String): UTF8String; {$IFDEF UNIX} begin Result:= ExcludeTrailingPathDelimiter(FindMountPointPath(ExcludeTrailingPathDelimiter(FileName))); end; {$ELSE} begin Result:= ExtractFileDrive(FileName); end; {$ENDIF} procedure FixFormIcon(Handle: LCLType.HWND); begin // Workaround for Lazarus issue 0018484. // Any form that sets its own icon should call this in FormCreate. {$IFDEF WINDOWS} Windows.SetClassLong(Handle, GCL_HICONSM, 0); Windows.SetClassLong(Handle, GCL_HICON, 0); {$ENDIF} end; procedure HideConsoleWindow; begin {$IFDEF WINDOWS} if isConsole then ShowWindow(GetConsoleWindow, SW_HIDE); {$ENDIF} end; procedure FixDateNamesToUTF8; var i: Integer; begin with DefaultFormatSettings do begin for i := Low(ShortMonthNames) to High(ShortMonthNames) do ShortMonthNames[i] := SysToUTF8(ShortMonthNames[i]); for i := Low(ShortDayNames) to High(ShortDayNames) do ShortDayNames[i] := SysToUTF8(ShortDayNames[i]); for i := Low(LongMonthNames) to High(LongMonthNames) do LongMonthNames[i] := SysToUTF8(LongMonthNames[i]); for i := Low(LongDayNames) to High(LongDayNames) do LongDayNames[i] := SysToUTF8(LongDayNames[i]); end; end; function ParamStrU(Param: Integer): UTF8String; {$IFDEF UNIX} begin Result:= SysToUTF8(ObjPas.ParamStr(Param)); end; {$ELSE} begin if (Param >= 0) and (Param < argc) then Result:= StrPas(argv[Param]) else Result:= EmptyStr; end; {$ENDIF} function ParamStrU(const Param: String): UTF8String; {$IFDEF UNIX} begin Result:= SysToUTF8(Param); end; {$ELSE} begin Result:= Param; end; {$ENDIF} { EInvalidQuoting } constructor EInvalidQuoting.Create; begin inherited Create(rsMsgInvalidQuoting); end; end. doublecmd-0.5.8/src/platform/win/0000755000175000017500000000000012257501472015723 5ustar alexxalexxdoublecmd-0.5.8/src/platform/win/uthumbnailprovider.pas0000644000175000017500000001171212120407452022345 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Windows thumbnail provider Copyright (C) 2012-2013 Alexander Koblov (alexx2000@mail.ru) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uThumbnailProvider; {$mode delphi} interface uses uThumbnails; implementation uses SysUtils, Forms, Graphics, Windows, ActiveX, ShlObj; const SIIGBF_RESIZETOFIT = $00000000; SIIGBF_BIGGERSIZEOK = $00000001; SIIGBF_MEMORYONLY = $00000002; SIIGBF_ICONONLY = $00000004; SIIGBF_THUMBNAILONLY = $00000008; SIIGBF_INCACHEONLY = $00000010; const IID_IExtractImage: TGUID = '{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}'; type SIIGBF = Integer; IShellItemImageFactory = interface(IUnknown) ['{BCC18B79-BA16-442F-80C4-8A59C30C463B}'] function GetImage(size: TSize; flags: SIIGBF; out phbm: HBITMAP): HRESULT; stdcall; end; IExtractImage = interface(IUnknown) ['{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}'] function GetLocation(pszPathBuffer: LPWSTR; cchMax: DWORD; out pdwPriority: DWORD; const prgSize: LPSIZE; dwRecClrDepth: DWORD; var pdwFlags: DWORD): HRESULT; stdcall; function Extract(out phBmpImage: HBITMAP): HRESULT; stdcall; end; var SHCreateItemFromParsingName: function(pszPath: LPCWSTR; const pbc: IBindCtx; const riid: TIID; out ppv): HRESULT; stdcall; function GetThumbnailOld(const aFileName: UTF8String; aSize: TSize; out Bitmap: HBITMAP): HRESULT; var Folder, DesktopFolder: IShellFolder; Pidl, ParentPidl: PItemIDList; Image: IExtractImage; pchEaten: ULONG; wsTemp: WideString; dwPriority: DWORD; Status: HRESULT; dwRecClrDepth: DWORD; dwAttributes: ULONG = 0; dwFlags: DWORD = IEIFLAG_SCREEN or IEIFLAG_QUALITY or IEIFLAG_ORIGSIZE; begin Result:= E_FAIL; if SHGetDesktopFolder(DesktopFolder) = S_OK then begin wsTemp:= UTF8Decode(ExtractFilePath(aFileName)); if DesktopFolder.ParseDisplayName(0, nil, PWideChar(wsTemp), pchEaten, ParentPidl, dwAttributes) = S_OK then begin if DesktopFolder.BindToObject(ParentPidl, nil, IID_IShellFolder, Folder) = S_OK then begin wsTemp:= UTF8Decode(ExtractFileName(aFileName)); if Folder.ParseDisplayName(0, nil, PWideChar(wsTemp), pchEaten, Pidl, dwAttributes) = S_OK then begin if Succeeded(Folder.GetUIObjectOf(0, 1, Pidl, IID_IExtractImage, nil, Image)) then begin SetLength(wsTemp, MAX_PATH * SizeOf(WideChar)); dwRecClrDepth:= GetDeviceCaps(Application.MainForm.Canvas.Handle, BITSPIXEL); Status:= Image.GetLocation(PWideChar(wsTemp), Length(wsTemp), dwPriority, @aSize, dwRecClrDepth, dwFlags); if (Status = NOERROR) or (Status = E_PENDING) then begin Result:= Image.Extract(Bitmap); end; end; CoTaskMemFree(Pidl); end; Folder:= nil; end; CoTaskMemFree(ParentPidl); end; DesktopFolder:= nil; end; // SHGetDesktopFolder end; function GetThumbnailNew(const aFileName: UTF8String; aSize: TSize; out Bitmap: HBITMAP): HRESULT; var ShellItemImage: IShellItemImageFactory; begin Result:= SHCreateItemFromParsingName(PWideChar(UTF8Decode(aFileName)), nil, IShellItemImageFactory, ShellItemImage); if Succeeded(Result) then begin Result:= ShellItemImage.GetImage(aSize, SIIGBF_THUMBNAILONLY, Bitmap); end; end; function GetThumbnail(const aFileName: UTF8String; aSize: TSize): Graphics.TBitmap; var Bitmap: HBITMAP; Status: HRESULT = E_FAIL; begin Result:= nil; if (Win32MajorVersion > 5) then begin Status:= GetThumbnailNew(aFileName, aSize, Bitmap); end; if Failed(Status) then begin Status:= GetThumbnailOld(aFileName, aSize, Bitmap); end; if Succeeded(Status) then begin Result:= Graphics.TBitmap.Create; Result.Handle:= Bitmap; end; end; initialization SHCreateItemFromParsingName:= GetProcAddress(GetModuleHandle('shell32.dll'), 'SHCreateItemFromParsingName'); TThumbnailManager.RegisterProvider(@GetThumbnail); end. doublecmd-0.5.8/src/platform/win/uwinterm.pas0000644000175000017500000001675411740433676020325 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Terminal emulator implementation for Windows Copyright (C) 2009-2010 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uWinTerm; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Windows, uTerminal; type { TWinTerm } TWinTerm = class(TTerminal) private FConsoleWindow: HWND; FSecurityAttributes: TSecurityAttributes; FStartupInfo: TStartupInfo; FProcessInformation: TProcessInformation; PipeStdInRead, PipeStdInWrite, PipeStdOutRead, PipeStdOutWrite: THandle; public constructor Create; destructor Destroy; override; //--------------------- function Read_Pty(var Output: UTF8String; const TimeOut: LongInt = 10): LongInt; override; // Read info from pty function Fork_pty(const RowCount, ColCount: Integer; const Command: UTF8String; const Params: UTF8String=''): THandle; override;//Create new pty and start cmd function Write_pty(const Input: UTF8String): Boolean; override; //write str to pty //--------------------- function SendBreak_pty(): Boolean; override; // ^C function SendSignal_pty(Sig: Cint): Boolean; override; function SetScreenSize(ColCount, RowCount: Integer): Boolean; override; function SetCurrentDir(const NewDir: UTF8String): Boolean; override; //--------------------- function KillShell: LongInt; override; function CSI_GetTaskId(const buf:UTF8string):integer; override; end; { TWinConThread } TWinConThread = class(TConsoleThread) private procedure AddSymbol; protected procedure Execute; override; public constructor Create; destructor Destroy; override; end; implementation uses FileUtil, JwaWinCon, uOSUtils; { TWinTerm } constructor TWinTerm.Create; begin if not isConsole then begin AllocConsole(); FConsoleWindow:= GetConsoleWindow(); ShowWindow(FConsoleWindow, SW_HIDE); end; end; destructor TWinTerm.Destroy; begin KillShell; if not isConsole then FreeConsole(); inherited Destroy; end; function TWinTerm.Read_Pty(var Output: UTF8String; const timeout: LongInt): LongInt; var I: Integer; dwRead, BufSize, DesBufSize: DWORD; Res: Boolean; pcOutput: PChar; begin try BufSize:= 0; dwRead:= 0; Output:= EmptyStr; repeat for I:= 0 to 9 do begin Res:= PeekNamedPipe(PipeStdOutRead, nil, 0, nil, @DesBufSize, nil); Res:= Res and (DesBufSize > 0); if Res then Break; Sleep(TimeOut); end; if Res then begin if DesBufSize > BufSize then begin GetMem(pcOutput, DesBufSize); BufSize:= DesBufSize; end; Res:= ReadFile(PipeStdOutRead, pcOutput^, BufSize, dwRead, nil); end; until not Res; except end; if dwRead > 0 then begin Output:= ConsoleToUTF8(Copy(pcOutput, 1, dwRead)); FreeMem(pcOutput); end; Result:= dwRead; end; function TWinTerm.Fork_pty(const RowCount, ColCount: Integer; const Command: UTF8String; const Params: UTF8String): THandle; var hTmp1, hTmp2: THandle; begin ZeroMemory(@FSecurityAttributes, SizeOf(FSecurityAttributes)); FSecurityAttributes.nLength:= SizeOf(FSecurityAttributes); FSecurityAttributes.bInheritHandle:= True; FSecurityAttributes.lpSecurityDescriptor:= nil; // create input/output pipes CreatePipe(PipeStdInRead, PipeStdInWrite, @FSecurityAttributes, 0); CreatePipe(PipeStdOutRead, PipeStdOutWrite, @FSecurityAttributes, 0); DuplicateHandle(GetCurrentProcess(), PipeStdInWrite, GetCurrentProcess(), @hTmp1, 0, False, DUPLICATE_SAME_ACCESS); DuplicateHandle(GetCurrentProcess(), PipeStdOutRead, GetCurrentProcess(), @hTmp2, 0, False, DUPLICATE_SAME_ACCESS); CloseHandle(PipeStdInWrite); CloseHandle(PipeStdOutRead); PipeStdInWrite:= hTmp1; PipeStdOutRead:= hTmp2; ZeroMemory(@FStartupInfo, SizeOf(FStartupInfo)); FStartupInfo.cb:= SizeOf(FStartupInfo); with FStartupInfo do begin dwFlags:= STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; wShowWindow:= SW_HIDE; hStdInput:= PipeStdInRead; hStdOutput:= PipeStdOutWrite; hStdError:= PipeStdOutWrite; end; ZeroMemory(@FProcessInformation, SizeOf(FProcessInformation)); CreateProcessW(nil, PWideChar(UTF8Decode(Command)), // command line nil, // process security attributes nil, // primary thread security attributes TRUE, // handles are inherited 0, // creation flags nil, // use parent's environment nil, // use parent's current directory FStartupInfo, // STARTUPINFO pointer FProcessInformation); // receives PROCESS_INFORMATION Result:= FProcessInformation.hProcess; end; function TWinTerm.Write_pty(const Input: UTF8String): Boolean; var dwWritten, BufSize: DWORD; pcCommand: PChar; begin pcCommand:= PChar(UTF8ToConsole(Input)); BufSize:= Length(pcCommand); Result:= WriteFile(PipeStdInWrite, pcCommand^, BufSize, dwWritten, nil); Result:= Result and (BufSize = dwWritten); end; function TWinTerm.SendBreak_pty(): Boolean; begin Result:= SendSignal_pty(CTRL_C_EVENT); end; function TWinTerm.SendSignal_pty(Sig: Cint): Boolean; begin SetConsoleCtrlHandler(nil, True); Result:= GenerateConsoleCtrlEvent(Sig, 0); end; function TWinTerm.SetScreenSize(ColCount, RowCount: Integer): Boolean; begin Result:= False; end; function TWinTerm.SetCurrentDir(const NewDir: UTF8String): Boolean; begin Result:= Write_pty('cd /D "' + NewDir + '"' + #13#10); end; function TWinTerm.KillShell: LongInt; begin try CloseHandle(PipeStdInRead); CloseHandle(PipeStdInWrite); CloseHandle(PipeStdOutRead); CloseHandle(PipeStdOutWrite); CloseHandle(FProcessInformation.hThread); CloseHandle(FProcessInformation.hProcess); Result := 0; except Result := -1; end; end; function TWinTerm.CSI_GetTaskId(const buf:UTF8string):integer; begin Result := 0; // Dummy end; { TWinConThread } procedure TWinConThread.AddSymbol; begin if Assigned(FOut) then FOut.Write(FBuf); end; procedure TWinConThread.Execute; begin FShell:= GetShell; if Length(FShell) = 0 then FShell:= RunTerm; if Assigned(FTerm) then FTerm.Fork_pty(FRowsCount, FColsCount, FShell); while True do begin if Assigned(FTerm) then begin if FTerm.Read_pty(FBuf, 0) > 0 then Synchronize(@AddSymbol) else Sleep(1); end else Break; end; end; constructor TWinConThread.Create; begin inherited Create(True); System.InitCriticalSection(FLock); FTerm:= TWinTerm.Create; FRowsCount:= 50; FColsCount:= 100; end; destructor TWinConThread.Destroy; begin FreeAndNil(FTerm); System.DoneCriticalSection(FLock); inherited Destroy; end; end. doublecmd-0.5.8/src/platform/win/uTotalCommander.pas0000644000175000017500000000542211740433676021537 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Creates Total Commander fake window (some plugins don't work without it) Copyright (C) 2009 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uTotalCommander; {$MODE DELPHI} {.$DEFINE DEBUG} interface uses Windows; procedure CreateTotalCommanderWindow(hWindow: HWND); implementation var wcFakeWndClass: TWndClassEx; //hMainWindow, {$IFDEF DEBUG} hFakeWindow: HWND; {$ENDIF} function WindowProc(hWnd: HWND; uiMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin { Resend message to DoubleCommander main window. Disabled currently, because it may interfere with LCL, especially since the fake TotalCmd window is also a main app window (WS_OVERLAPPEDWINDOW). May be enabled in future if any plugins need this, but following messages should be skipped because they are known to cause conflict: - WM_ACTIVATEAPP Confuses LCL about which main form (window) is currently active and it stops calling OnExit events for controls (see TWinControl.WMKillFocus). } //SendMessage(hMainWindow, uiMsg, wParam, lParam); {$IFDEF DEBUG} WriteLn(uiMsg); {$ENDIF} Result:= DefWindowProc(hWnd, uiMsg, wParam, lParam); end; procedure CreateTotalCommanderWindow(hWindow: HWND); begin // hMainWindow:= hWindow; FillByte(wcFakeWndClass, SizeOf(wcFakeWndClass), 0); wcFakeWndClass.cbSize:= SizeOf (wcFakeWndClass); wcFakeWndClass.Style:= CS_HREDRAW or CS_VREDRAW; wcFakeWndClass.lpfnWndProc:= @WindowProc; wcFakeWndClass.hInstance:= hInstance; wcFakeWndClass.hbrBackground:= Color_BtnFace + 12; wcFakeWndClass.lpszMenuName:= nil; wcFakeWndClass.lpszClassName:= 'TTOTAL_CMD'; RegisterClassEx(wcFakeWndClass); // Create Total Commander fake window {$IFDEF DEBUG} hFakeWindow:= {$ENDIF} CreateWindowEx(0, 'TTOTAL_CMD', 'Double Commander', WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, 0, 0, hInstance, nil); {$IFDEF DEBUG} // Show window (for debugging only) ShowWindow(hFakeWindow, SW_SHOW); {$ENDIF} end; end. doublecmd-0.5.8/src/platform/win/uNTFSLinks.pas0000644000175000017500000003233412005230707020364 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- This unit contains functions to work with hard and symbolic links on the NTFS file system. Copyright (C) 2012 Alexander Koblov (alexx2000@mail.ru) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uNTFSLinks; {$mode delphi} interface uses Windows, SysUtils; const // CreateSymbolicLink flags SYMBOLIC_LINK_FLAG_FILE = 0; SYMBOLIC_LINK_FLAG_DIRECTORY = 1; // CreateFile flags FILE_FLAG_OPEN_REPARSE_POINT = $00200000; // DeviceIoControl control codes FSCTL_SET_REPARSE_POINT = $000900A4; FSCTL_GET_REPARSE_POINT = $000900A8; FSCTL_DELETE_REPARSE_POINT = $000900AC; const REPARSE_DATA_HEADER_SIZE = 8; MOUNT_POINT_HEADER_SIZE = 8; FILE_DOES_NOT_EXIST = DWORD(-1); wsNativeFileNamePrefix : WideString = '\??\'; type {$packrecords c} TSymbolicLinkReparseBuffer = record SubstituteNameOffset: USHORT; SubstituteNameLength: USHORT; PrintNameOffset: USHORT; PrintNameLength: USHORT; Flags: ULONG; PathBuffer: array[0..0] of WCHAR; end; TMountPointReparseBuffer = record SubstituteNameOffset: USHORT; SubstituteNameLength: USHORT; PrintNameOffset: USHORT; PrintNameLength: USHORT; PathBuffer: array[0..0] of WCHAR; end; TGenericReparseBuffer = record DataBuffer: array[0..0] of UCHAR; end; REPARSE_DATA_BUFFER = record ReparseTag: ULONG; ReparseDataLength: USHORT; Reserved: USHORT; case Integer of 0: (SymbolicLinkReparseBuffer: TSymbolicLinkReparseBuffer); 1: (MountPointReparseBuffer: TMountPointReparseBuffer); 2: (GenericReparseBuffer: TGenericReparseBuffer); end; TReparseDataBuffer = REPARSE_DATA_BUFFER; PReparseDataBuffer = ^REPARSE_DATA_BUFFER; {$packrecords default} {en Creates a symbolic link. This function is only supported on the NTFS file system. On Windows 2000/XP it works for directories only On Windows Vista/Seven it works for directories and files (for files it works only with Administrator rights) @param(AFileName The name of the existing file) @param(ALinkName The name of the symbolic link) @returns(The function returns @true if successful, @false otherwise) } function CreateSymLink(ATargetName, ALinkName: WideString): Boolean; {en Established a hard link beetwen an existing file and new file. This function is only supported on the NTFS file system, and only for files, not directories. @param(AFileName The name of the existing file) @param(ALinkName The name of the new hard link) @returns(The function returns @true if successful, @false otherwise) } function CreateHardLink(AFileName, ALinkName: WideString): Boolean; {en Reads a symbolic link target. This function is only supported on the NTFS file system. @param(aSymlinkFileName The name of the symbolic link) @param(aTargetFileName The name of the target file/directory) @returns(The function returns @true if successful, @false otherwise) } function ReadSymLink(aSymlinkFileName: WideString; out aTargetFileName: WideString): Boolean; implementation uses LCLProc, uDebug; type TCreateSymbolicLinkW = function( pwcSymlinkFileName, pwcTargetFileName: PWideChar; dwFlags: DWORD): BOOL; stdcall; TCreateHardLinkW = function ( lpFileName, lpExistingFileName: LPCWSTR; lpSecurityAttributes: LPSECURITY_ATTRIBUTES): BOOL; stdcall; function HasNewApi: Boolean; begin Result:= (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion >= 6); end; function _CreateHardLink_New(AFileName : WideString; ALinkName: WideString): Boolean; var hLib: THandle; CreateHardLinkW: TCreateHardLinkW; begin Result:= False; hLib:= GetModuleHandle('kernel32.dll'); if hLib = 0 then begin DCDebug('Can not load library "kernel32.dll"'); Exit; end; CreateHardLinkW:= TCreateHardLinkW(GetProcAddress(hLib, 'CreateHardLinkW')); if not Assigned(CreateHardLinkW) then begin DCDebug('Can not get function address for "CreateHardLinkW"'); Exit; end; Result:= CreateHardLinkW(PWideChar(ALinkName), PWideChar(AFileName), nil); end; function _CreateHardLink_Old(aExistingFileName, aFileName: WideString): Boolean; var hFile: THandle; lpBuffer: TWin32StreamId; wcFileName: array[0..MAX_PATH] of WideChar; dwNumberOfBytesWritten: DWORD = 0; lpContext: LPVOID = nil; lpFilePart: LPWSTR = nil; begin Result:= GetFullPathNameW(PWideChar(aFileName), MAX_PATH, wcFileName, lpFilePart) > 0; if Result then begin hFile:= CreateFileW(PWideChar(aExistingFileName), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_EXISTING, 0, 0); Result:= (hFile <> INVALID_HANDLE_VALUE); end; if Result then try ZeroMemory(@lpBuffer, SizeOf(TWin32StreamId)); with lpBuffer do begin dwStreamId:= BACKUP_LINK; Size.LowPart:= (Length(aFileName) + 1) * SizeOf(WideChar); end; // Write stream header Result:= BackupWrite(hFile, @lpBuffer, SizeOf(TWin32StreamId) - SizeOf(PWideChar), dwNumberOfBytesWritten, False, False, lpContext); if not Result then Exit; // Write file name buffer Result:= BackupWrite(hFile, @wcFileName, lpBuffer.Size.LowPart, dwNumberOfBytesWritten, False, False, lpContext); if not Result then Exit; // Finish write operation Result:= BackupWrite(hFile, nil, 0, dwNumberOfBytesWritten, True, False, lpContext); finally CloseHandle(hFile); end; end; function CreateHardLink(AFileName, ALinkName: WideString): Boolean; var dwAttributes: DWORD; begin dwAttributes := Windows.GetFileAttributesW(PWideChar(AFileName)); if dwAttributes = FILE_DOES_NOT_EXIST then raise Exception.Create('File "' + AFileName + '" does not exist.'); if (dwAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0 then raise Exception.Create('Can''t create hardlink for directory (file "' + AFileName + '").'); dwAttributes := Windows.GetFileAttributesW(PWideChar(ALinkName)); if dwAttributes <> FILE_DOES_NOT_EXIST then raise Exception.Create('File "' + ALinkName + '" already exists.'); if HasNewApi then Result:= _CreateHardLink_New(AFileName, ALinkName) else Result:= _CreateHardLink_Old(AFileName, ALinkName) end; function _CreateSymLink_New(const ATargetFileName, ASymlinkFileName: WideString): boolean; var hLib: THandle; CreateSymbolicLinkW: TCreateSymbolicLinkW; begin Result:= False; hLib:= GetModuleHandle('kernel32.dll'); if hLib = 0 then begin DCDebug('Can not load library "kernel32.dll"'); Exit; end; CreateSymbolicLinkW:= TCreateSymbolicLinkW(GetProcAddress(hLib, 'CreateSymbolicLinkW')); if not Assigned(CreateSymbolicLinkW) then begin DCDebug('Can not get function address for "CreateSymbolicLinkW"'); Exit; end; Result:= CreateSymbolicLinkW(PWideChar(ASymlinkFileName), PWideChar(ATargetFileName), SYMBOLIC_LINK_FLAG_FILE); end; function _CreateSymLink_Old(aTargetFileName, aSymlinkFileName: WideString): Boolean; var hDevice: THandle; lpInBuffer: PReparseDataBuffer; nInBufferSize, dwPathBufferSize: DWORD; wsNativeFileName: WideString; lpBytesReturned: DWORD = 0; begin Result:= CreateDirectoryW(PWideChar(aSymlinkFileName), nil); if Result then try hDevice:= CreateFileW(PWideChar(aSymlinkFileName), GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS or FILE_FLAG_OPEN_REPARSE_POINT, 0); if hDevice = INVALID_HANDLE_VALUE then Exit; wsNativeFileName:= wsNativeFileNamePrefix + aTargetFileName; // File name length with trailing zero and zero for empty PrintName dwPathBufferSize:= Length(wsNativeFileName) * SizeOf(WideChar) + 4; nInBufferSize:= REPARSE_DATA_HEADER_SIZE + MOUNT_POINT_HEADER_SIZE + dwPathBufferSize; lpInBuffer:= GetMem(nInBufferSize); ZeroMemory(lpInBuffer, nInBufferSize); with lpInBuffer^, lpInBuffer^.MountPointReparseBuffer do begin ReparseTag:= IO_REPARSE_TAG_MOUNT_POINT; ReparseDataLength:= MOUNT_POINT_HEADER_SIZE + dwPathBufferSize; SubstituteNameLength:= Length(wsNativeFileName) * SizeOf(WideChar); PrintNameOffset:= SubstituteNameOffset + SubstituteNameLength + SizeOf(WideChar); CopyMemory(@PathBuffer[0], @wsNativeFileName[1], SubstituteNameLength); end; Result:= DeviceIoControl(hDevice, // handle to file or directory FSCTL_SET_REPARSE_POINT, // dwIoControlCode lpInBuffer, // input buffer nInBufferSize, // size of input buffer nil, // lpOutBuffer 0, // nOutBufferSize lpBytesReturned, // lpBytesReturned nil); // OVERLAPPED structure FreeMem(lpInBuffer); CloseHandle(hDevice); finally if not Result then RemoveDirectoryW(PWideChar(aSymlinkFileName)); end; end; function CreateSymLink(ATargetName, ALinkName: WideString): Boolean; var dwAttributes : DWORD; begin Result:= False; dwAttributes := Windows.GetFileAttributesW(PWideChar(ATargetName)); if (dwAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0 then Result:= _CreateSymLink_Old(ATargetName, ALinkName) else if HasNewApi then Result:= _CreateSymLink_New(ATargetName, ALinkName); end; function ReadSymLink(aSymlinkFileName: WideString; out aTargetFileName: WideString): Boolean; var hDevice: THandle; dwFileAttributes: DWORD; caOutBuffer: array[0..4095] of Byte; lpOutBuffer: TReparseDataBuffer absolute caOutBuffer; pwcTargetFileName: PWideChar; lpBytesReturned: DWORD = 0; dwFlagsAndAttributes: DWORD; begin dwFileAttributes:= GetFileAttributesW(PWideChar(aSymlinkFileName)); Result:= dwFileAttributes <> FILE_DOES_NOT_EXIST; if Result then begin if (dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then dwFlagsAndAttributes:= FILE_FLAG_OPEN_REPARSE_POINT else dwFlagsAndAttributes:= FILE_FLAG_BACKUP_SEMANTICS or FILE_FLAG_OPEN_REPARSE_POINT; // Open reparse point hDevice:= CreateFileW(PWideChar(aSymlinkFileName), 0, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, dwFlagsAndAttributes, 0); Result:= hDevice <> INVALID_HANDLE_VALUE; if not Result then Exit; Result:= DeviceIoControl(hDevice, // handle to file or directory FSCTL_GET_REPARSE_POINT, // dwIoControlCode nil, // input buffer 0, // size of input buffer @caOutBuffer, // lpOutBuffer SizeOf(caOutBuffer), // nOutBufferSize lpBytesReturned, // lpBytesReturned nil); // OVERLAPPED structure CloseHandle(hDevice); if Result then begin case lpOutBuffer.ReparseTag of IO_REPARSE_TAG_SYMLINK: with lpOutBuffer.SymbolicLinkReparseBuffer do begin pwcTargetFileName:= @PathBuffer[0]; pwcTargetFileName:= pwcTargetFileName + SubstituteNameOffset div SizeOf(WideChar); SetLength(aTargetFileName, SubstituteNameLength div SizeOf(WideChar)); CopyMemory(PWideChar(aTargetFileName), pwcTargetFileName, SubstituteNameLength); end; IO_REPARSE_TAG_MOUNT_POINT: with lpOutBuffer.MountPointReparseBuffer do begin pwcTargetFileName:= @PathBuffer[0]; pwcTargetFileName:= pwcTargetFileName + SubstituteNameOffset div SizeOf(WideChar); SetLength(aTargetFileName, SubstituteNameLength div SizeOf(WideChar)); CopyMemory(PWideChar(aTargetFileName), pwcTargetFileName, SubstituteNameLength); end; end; if Pos(wsNativeFileNamePrefix, aTargetFileName) = 1 then Delete(aTargetFileName, 1, Length(wsNativeFileNamePrefix)); end; end; end; end. doublecmd-0.5.8/src/platform/win/uicofiles.pas0000644000175000017500000006332611766020706020424 0ustar alexxalexx// Copyright (C) - .selfip.com // , // , . // "" , // , , // , png, , alpha-, // 32 true color . // // , , // // , http://janych.selfip.com/examples/Delphi/Icons/ // ********************************************************************************************* // Copyright (C) 2007 Koblov Alexander (Alexx2000@mail.ru) // Add some changes for compiling under FPC/Lazarus // Add function CreateIconFromHandle unit uIcoFiles; {$mode delphi} interface uses Classes,Graphics,Windows, JwaWinGDI; {$ASSERTIONS ON} const rc3_StockIcon = 0; rc3_Icon = 1; rc3_Cursor = 2; { currentlly defined blend function } AC_SRC_OVER = $00; AC_SRC_ALPHA = $01; type TCursorOrIcon = packed record Reserved: Word; wType: Word; Count: Word; end; TIconRec = packed record // Graphics Width: Byte; Height: Byte; Colors: Word; Reserved1: Word; Reserved2: Word; DIBSize: Longint; DIBOffset: Longint; end; TBits = array of Byte; TIconData = packed record // Info: TIconRec; // BitmapInfo, // , MaskBitmapInfo: PBitmapInfo; // - , needMaskBitmapInfo ImageLineWidth, // IsValidAlpha ConvertToPNG MaskLineWidth: Integer; // ConvertToPNG ImageBits: TBits; // MaskBits: TBits; // iRgbTable: integer; // , BitmapInfo end; TIcons = array of TIconData; // "" type TIcoFile = class(TComponent) private FIcons: TIcons; public destructor Destroy;override; procedure loadFromStream(Stream:TStream); procedure loadFromHandle(h:hicon); procedure saveTrueColorFrom32(icoNo:integer;out IconData:TIconData); procedure saveToStream(Stream:TStream); procedure check; procedure draw(icoNo,x,y:integer;dest:hdc;drawMask,drawImage,drawAlpha:boolean);overload; procedure draw(IconData:TIconData;x,y:integer;dest:hdc;drawMask,drawImage,drawAlpha:boolean);overload; function IsValidAlpha(icoNo:integer): boolean; // , - property Icons: TIcons read FIcons write FIcons; { procedure ConvertToPNG(icoNo:integer;Stream:TStream); procedure saveAsPng(icoNo:integer;fn:string); } procedure Add(IconData:TIconData); procedure AddCopy(IconData:TIconData); procedure DestroyIconData(IconData: TIconData); end; function getIconHandleForFile(fn:string;large:boolean): hicon; function CreateIconFromHandle(IconHandle : HIcon) : TIcon; implementation uses sysUtils, ShellAPI; // getIconHandleForFile //pngimage; // ConvertToPNG/saveAsPng, , type TRGBQuadArray = array[byte] of TRGBQuad; PRGBQuadArray = ^TRGBQuadArray; function BytesPerScanline(PixelsPerScanline, BitsPerPixel, Alignment: Longint): Longint; begin Dec(Alignment); Result := ((PixelsPerScanline * BitsPerPixel) + Alignment) and not Alignment; Result := Result div 8; end; { TIcoFile } destructor TIcoFile.Destroy; var i: integer; begin if Length(FIcons) > 0 then for i:=low(FIcons) to high(FIcons) do DestroyIconData(FIcons[i]); inherited; end; procedure TIcoFile.loadFromStream(Stream:TStream); var FileHeader: TCursorOrIcon; i,Size: integer; begin Stream.ReadBuffer(FileHeader,SizeOf(FileHeader)); // if (FileHeader.Reserved<>0) or not (FileHeader.wType in [RC3_ICON,RC3_CURSOR]) then raise Exception.Create('Invalid icon'); SetLength(FIcons,FileHeader.Count); // . Stream 1 for i:=0 to FileHeader.Count-1 do // - with FIcons[i] do Stream.ReadBuffer(Info,SizeOf(TIconRec)); for i:=0 to FileHeader.Count-1 do begin with FIcons[i] do begin Stream.Position := Info.DIBOffset; getMem(BitmapInfo,SizeOf(BitmapInfo^.bmiHeader)); Stream.ReadBuffer(BitmapInfo^.bmiHeader,SizeOf(BitmapInfo^.bmiHeader)); // with BitmapInfo^.bmiHeader do begin if biBitCount > 16 then iRgbTable := 0 else if (biBitCount < 16) then iRgbTable := (1 shl biBitCount)*sizeof(RGBQUAD) else Assert(false); // end; BitmapInfo := ReallocMemory(BitmapInfo,sizeof(BITMAPINFOHEADER)+iRgbTable); if iRgbTable <> 0 then Stream.ReadBuffer(BitmapInfo^.bmiColors,iRgbTable); with BitmapInfo^.bmiHeader do begin ImageLineWidth := BytesPerScanline(biWidth,biBitCount,32); // Assert((biWidth*biBitCount+31) div 32*4 = ImageLineWidth); Size := (biHeight div 2)*ImageLineWidth; // SetLength(ImageBits,Size); // Stream.ReadBuffer(ImageBits[0],Size); // MaskLineWidth := BytesPerScanline(biWidth,1,32); Size := (biHeight div 2)*MaskLineWidth; // (1-) Assert((biWidth+31) div 32*4*(biHeight div 2) = Size); end; SetLength(MaskBits,Size); Stream.ReadBuffer(MaskBits[0],Size); // end; end; end; function InternalGetDIB(Bitmap:HBITMAP;out iRgbTable:integer;out BitmapInfo:PBitmapInfo;var Bits:TBits): Boolean; var DC: HDC; DS: TDIBSection; Bytes: Integer; begin iRgbTable := 0; getMem(BitmapInfo,SizeOf(TBitmapInfo.bmiHeader)); try FillChar(BitmapInfo^.bmiHeader,sizeof(TBitmapInfo.bmiHeader),0); with BitmapInfo^ do begin DS.dsbmih.biSize := 0; Bytes := GetObject(Bitmap,SizeOf(DS),@DS); Assert(Bytes<>0); if (Bytes>=(sizeof(DS.dsbm)+sizeof(DS.dsbmih))) and (DS.dsbmih.biSize>=DWORD(sizeof(DS.dsbmih))) then bmiHeader := DS.dsbmih else begin bmiHeader.biSize := SizeOf(bmiHeader); bmiHeader.biWidth := DS.dsbm.bmWidth; bmiHeader.biHeight := DS.dsbm.bmHeight; bmiHeader.biBitCount := DS.dsbm.bmBitsPixel; bmiHeader.biPlanes := DS.dsbm.bmPlanes; end; if bmiHeader.biClrImportant > bmiHeader.biClrUsed then bmiHeader.biClrImportant := bmiHeader.biClrUsed; if bmiHeader.biSizeImage = 0 then bmiHeader.biSizeImage := BytesPerScanLine(bmiHeader.biWidth,bmiHeader.biBitCount,32)*Abs(bmiHeader.biHeight); Assert(bmiHeader.biCompression=0); if bmiHeader.biBitCount > 16 then iRgbTable := 0 else if bmiHeader.biClrUsed = 0 then iRgbTable := SizeOf(TRGBQuad)*(1 shl bmiHeader.biBitCount) else iRgbTable := SizeOf(TRGBQuad)*bmiHeader.biClrUsed; end; if iRgbTable > 0 then BitmapInfo := ReallocMemory(BitmapInfo,SizeOf(TBitmapInfoHeader)+iRgbTable); setLength(Bits,BitmapInfo^.bmiHeader.biSizeImage); DC := CreateCompatibleDC(0); try Result := GetDIBits(DC,Bitmap,0,BitmapInfo^.bmiHeader.biHeight,@Bits[0],BitmapInfo^,DIB_RGB_COLORS)<>0; finally DeleteDC(DC); end; except freeMem(BitmapInfo); BitmapInfo := nil; raise; end; end; procedure TIcoFile.loadFromHandle(h:hicon); var IconInfo: TIconInfo; Size: Cardinal; i: integer; begin if not GetIconInfo(h, IconInfo) then Exit; try try setLength(FIcons,length(FIcons)+1); with FIcons[high(FIcons)] do begin InternalGetDIB(IconInfo.hbmColor,iRgbTable,BitmapInfo,ImageBits); InternalGetDIB(IconInfo.hbmMask,i,MaskBitmapInfo,MaskBits); // MaskBitmapInfo , } with Info do begin Colors := 0; Width := BitmapInfo^.bmiHeader.biWidth; Height := BitmapInfo^.bmiHeader.biHeight; Reserved1 := MaskBitmapInfo^.bmiHeader.biBitCount; Reserved2 := BitmapInfo^.bmiHeader.biBitCount; DIBSize := MaskBitmapInfo^.bmiHeader.biSizeImage+DWORD(iRgbTable)+BitmapInfo^.bmiHeader.biSize+BitmapInfo^.bmiHeader.biSizeImage; DIBOffset := -1; // . end; with BitmapInfo^.bmiHeader do begin ImageLineWidth := BytesPerScanline(biWidth,biBitCount,32); // Assert((biWidth*biBitCount+31) div 32*4 = ImageLineWidth); Size := biHeight*ImageLineWidth; // Assert(Size=biSizeImage); biHeight := biHeight*2; // - end; with MaskBitmapInfo^.bmiHeader do begin MaskLineWidth := BytesPerScanline(biWidth,biBitCount,32); Assert((biWidth+31) div 32*4 = MaskLineWidth); // Size := biHeight*MaskLineWidth; // (1-) Assert(Size=biSizeImage); end; end; except setLength(FIcons,length(FIcons)-1); end; finally DeleteObject(IconInfo.hbmColor); DeleteObject(IconInfo.hbmMask); end; end; procedure TIcoFile.saveTrueColorFrom32(icoNo:integer;out IconData:TIconData); var useAlpha: boolean; Bitmap1,Bitmap2: Graphics.TBitmap; Size: integer; procedure setNewBitmap(h:HBITMAP); begin with IconData do begin if BitmapInfo <> nil then begin freeMem(BitmapInfo); BitmapInfo := nil; end; InternalGetDIB(h,iRgbTable,BitmapInfo,ImageBits); Assert(BitmapInfo <> nil); with Info do begin Colors := 0; Width := BitmapInfo^.bmiHeader.biWidth; Height := BitmapInfo^.bmiHeader.biHeight; Reserved1 := MaskBitmapInfo^.bmiHeader.biBitCount; Reserved2 := BitmapInfo^.bmiHeader.biBitCount; DIBSize := MaskBitmapInfo^.bmiHeader.biSizeImage+DWORD(iRgbTable)+BitmapInfo^.bmiHeader.biSize+BitmapInfo^.bmiHeader.biSizeImage; DIBOffset := -1; // . end; with BitmapInfo^.bmiHeader do begin ImageLineWidth := BytesPerScanline(biWidth,biBitCount,32); // Assert((biWidth*biBitCount+31) div 32*4 = ImageLineWidth); Size := biHeight*ImageLineWidth; // Assert(Size=biSizeImage); biHeight := biHeight*2; end; end; end; begin useAlpha := FIcons[icoNo].BitmapInfo.bmiHeader.biBitCount=32; if useAlpha then useAlpha := IsValidAlpha(icoNo); try IconData := FIcons[high(FIcons)]; Bitmap1 := Graphics.TBitmap.Create; Bitmap2 := Graphics.TBitmap.Create; try with IconData do begin MaskBits := copy(FIcons[high(FIcons)].MaskBits); getMem(MaskBitmapInfo,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*2); move(FIcons[high(FIcons)].MaskBitmapInfo^,MaskBitmapInfo^,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*2); with MaskBitmapInfo^.bmiHeader do begin Assert(MaskLineWidth=BytesPerScanline(biWidth,biBitCount,32)); MaskLineWidth := BytesPerScanline(biWidth,biBitCount,32); Assert((biWidth+31) div 32*4 = MaskLineWidth); Size := biHeight*MaskLineWidth; Assert(Size=biSizeImage); end; BitmapInfo := nil; // , with FIcons[high(FIcons)] do begin Bitmap2.Width := Info.Width; Bitmap2.Height := Info.Height; Bitmap2.PixelFormat := pf24bit; if useAlpha then begin Bitmap1.Width := Info.Width; Bitmap1.Height := Info.Height; Bitmap1.PixelFormat := pf24bit; Bitmap1.Canvas.Brush.Color := clWhite; Bitmap1.Canvas.FillRect(Classes.Rect(0,0,Bitmap1.Width,Bitmap1.Height)); // Bitmap1 setNewBitmap(Bitmap1.Handle); Bitmap2.Canvas.Brush.Color := clWhite; Bitmap2.Canvas.FillRect(Classes.Rect(0,0,Bitmap2.Width,Bitmap2.Height)); draw(IconData,0,0,Bitmap2.Canvas.Handle,true,true,false); // - draw(IcoNo,0,0,Bitmap2.Canvas.Handle,true,true,useAlpha); end else begin // , Bitmap2.Canvas.Brush.Color := clBlack; Bitmap2.Canvas.FillRect(Classes.Rect(0,0,Bitmap2.Width,Bitmap2.Height)); draw(IcoNo,0,0,Bitmap2.Canvas.Handle,true,true,useAlpha); end; setNewBitmap(Bitmap2.Handle); end; end; finally Bitmap1.Free; Bitmap2.Free; end; except setLength(FIcons,length(FIcons)-1); end; end; procedure TIcoFile.saveToStream(Stream:TStream); var FileHeader: TCursorOrIcon; i: integer; offset: integer; begin FileHeader.Reserved := 0; FileHeader.wType := RC3_ICON; FileHeader.Count := length(FIcons); Stream.WriteBuffer(FileHeader,SizeOf(FileHeader)); offset := Stream.Position+length(FIcons)*SizeOf(TIconRec); // if Length(FIcons) > 0 then begin for i:=low(FIcons) to high(FIcons) do with FIcons[i] do begin Info.DIBOffset := offset; Stream.WriteBuffer(Info,SizeOf(TIconRec)); offset := offset+SizeOf(BitmapInfo^.bmiHeader)+iRgbTable+length(ImageBits)+length(MaskBits); end; for i:=low(FIcons) to high(FIcons) do with FIcons[i] do begin Stream.WriteBuffer(BitmapInfo^.bmiHeader,SizeOf(BitmapInfo^.bmiHeader)+iRgbTable); Stream.WriteBuffer(ImageBits[0],length(ImageBits)); Stream.WriteBuffer(MaskBits[0],length(MaskBits)); end; end; end; procedure TIcoFile.check; var i: integer; begin // , , . // , // . // " - ." if Length(FIcons) > 0 then for i:=low(FIcons) to high(FIcons) do with FIcons[i] do begin Assert((Info.Reserved1=0) = (Info.Reserved2=0)); // Assert((Info.Colors<>0) or (Info.Reserved1<>0)); Assert(Info.Reserved1 in [0,1]); with BitmapInfo^.bmiHeader do begin Assert(biSize=sizeOf(BitmapInfo^.bmiHeader)); Assert(Info.Width=biWidth); Assert(Info.Height*2=biHeight); Assert(biPlanes=1); Assert(Info.Reserved2 in [0,biBitCount]); Assert(biBitCount in [1,4,8,16,24,32]); Assert(biCompression=BI_RGB{=0}); Assert(biXPelsPerMeter=0); Assert(biYPelsPerMeter=0); end; end; end; procedure TIcoFile.draw(icoNo,x,y:integer;dest:hdc;drawMask,drawImage,drawAlpha:boolean); begin draw(Icons[icoNo],x,y,dest,drawMask,drawImage,drawAlpha); end; procedure TIcoFile.draw(IconData:TIconData;x,y:integer;dest:hdc;drawMask,drawImage,drawAlpha:boolean); var h,hdcColor,hdcMask: hdc; pcolorBits: pointer; colorBitmap,hOldC,maskBitmap,hOldM: HBITMAP; pmaskBits: pointer; blend: BLENDFUNCTION; procedure needMaskBitmapInfo(var IconData:TIconData); begin with IconData do begin if MaskBitmapInfo <> nil then exit; // getMem(MaskBitmapInfo,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*2); FillChar(MaskBitmapInfo^,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*2,0); with MaskBitmapInfo^ do begin bmiHeader.biSize := sizeof(BITMAPINFOHEADER); bmiHeader.biWidth := BitmapInfo^.bmiHeader.biWidth; bmiHeader.biHeight := BitmapInfo^.bmiHeader.biHeight; bmiHeader.biPlanes := 1; bmiHeader.biBitCount := 1; bmiHeader.biSizeImage := length(MaskBits); bmiColors[0].rgbReserved := 0; bmiColors[0].rgbRed := 0; bmiColors[0].rgbBlue := 0; bmiColors[0].rgbGreen := 0; with PRGBQuadArray(@bmiColors)^[1] do begin rgbReserved := 0; rgbRed := 255; rgbBlue := 255; rgbGreen := 255; end; end; end; end; begin h := GetDC(0); pcolorBits := nil; colorBitmap := CreateDIBSection(h,IconData.BitmapInfo,DIB_RGB_COLORS,pcolorBits,0,0); hdcColor := CreateCompatibleDC(h); ReleaseDC(0,h); hOldC := SelectObject(hdcColor,colorBitmap); with IconData do begin if not drawAlpha then begin needMaskBitmapInfo(IconData); pmaskBits := nil; maskBitmap := CreateDIBSection(0,MaskBitmapInfo,DIB_RGB_COLORS,pmaskBits,0,0); hdcMask := CreateCompatibleDC(0); hOldM := SelectObject(hdcMask,maskBitmap); SetDIBitsToDevice(hdcMask,0,0,Info.Width,Info.Height,0,0,0,Info.Height,MaskBits,MaskBitmapInfo^,DIB_RGB_COLORS); if drawMask then BitBlt(dest,0,0,Info.Width,Info.Height,hdcMask,0,0,SRCAND); end else begin // hdcMask := 0; maskBitmap := 0; hOldM := 0; end; SetDIBitsToDevice(hdcColor,0,0,Info.Width,Info.Height,0,0,0,Info.Height,ImageBits,BitmapInfo^,DIB_RGB_COLORS); if drawImage then if not drawAlpha then BitBlt(dest,0,0,Info.Width,Info.Height,hdcColor,0,0,SRCINVERT) else begin // - blend.BlendOp := AC_SRC_OVER; blend.BlendFlags := 0; blend.SourceConstantAlpha := 255; blend.AlphaFormat := AC_SRC_ALPHA; AlphaBlend(dest,0,0,Info.Width,Info.Height,hdcColor,0,0,Info.Width,Info.Height,blend); end; end; // GDI , , . SelectObject(hdcColor,hOldC); if not drawAlpha then begin SelectObject(hdcMask,hOldM); DeleteObject(hdcMask); DeleteObject(maskBitmap); end; DeleteObject(hdcColor); DeleteObject(colorBitmap); end; function TIcoFile.IsValidAlpha(icoNo:integer): boolean; var X,Y: integer; Line32: PRGBQuadArray; begin with Icons[icoNo] do begin result := false; if BitmapInfo.bmiHeader.biBitCount <= 24 then exit; Result := true; for Y:=0 to Info.Height-1 do begin Line32 := @ImageBits[Y*ImageLineWidth]; for X:=0 to Info.Width-1 do // shGetFileInfo - if not Line32[X].rgbReserved=0 then exit; end; end; Result := false; end; function getIconHandleForFile(fn:string;large:boolean): hicon; var shfi: TShFileInfo; flag: integer; begin fillChar(shfi,SizeOf(TShFileInfo),0); if large then flag := SHGFI_LARGEICON else flag := SHGFI_SMALLICON; shGetFileInfo(pchar(fn),0,shfi,SizeOf(shfi),SHGFI_ICON or flag or SHGFI_SYSICONINDEX); Result := shfi.hIcon; end; function CreateIconFromHandle(IconHandle : HIcon) : TIcon; var I : Integer; IconData : TIconData; IcoFile : TIcoFile = nil; TempStream : TMemoryStream = nil; ColorDepth : Integer = 32; ActiveWindow: HWND; DeviceContext: HDC; begin Result := TIcon.Create; ActiveWindow := GetActiveWindow; DeviceContext := GetDC(ActiveWindow); // Get display color depth if (DeviceContext <> 0) then begin ColorDepth := GetDeviceCaps(DeviceContext, BITSPIXEL); ReleaseDC(ActiveWindow, DeviceContext); end; // Alpha channel can be used only with 24-32 bit color depth // otherwise use standard method to get icon from handle // because our method don't work in this case if (ColorDepth < 24) then Result.Handle:= IconHandle else begin IcoFile := TIcoFile.Create(nil); TempStream := TMemoryStream.Create; try IcoFile.loadFromHandle(IconHandle); if Length(IcoFile.Icons) = 0 then Result.Handle:= IconHandle else begin for I := Low(IcoFile.Icons) to High(IcoFile.Icons) do begin // If icon has invalid alpha channel // then display it as 24 bit icon if not IcoFile.IsValidAlpha(I) then begin IcoFile.saveTrueColorFrom32(I, IconData); IcoFile.DestroyIconData(IcoFile.Icons[I]); IcoFile.Icons[I] := IconData; end; end; IcoFile.saveToStream(TempStream); TempStream.Seek(0, soBeginning); Result.LoadFromStream(TempStream); end; finally FreeAndNil(IcoFile); FreeAndNil(TempStream); end; end; end; { type TChunkIHDRHack = class(TChunkIHDR); procedure Convert(const PNG:TPNGObject;const IconData:TIconData); var X,Y,Y2,BitCount: Integer; BitBuf: Byte; Line32: PRGBQuadArray; PNGLine: pRGBLine; Alpha: PByteArray; Mask: PByte; OnlyAlpha: boolean; begin with IconData do begin PNG.Header.Width := Info.Width; PNG.Header.Height := Info.Height; PNG.Header.BitDepth := 8; PNG.Header.ColorType := COLOR_RGBALPHA; TChunkIHDRHack(PNG.Header).PrepareImageData; BitBuf := 0; onlyAlpha := true; for Y:=0 to Info.Height-1 do begin Line32 := @ImageBits[Y*ImageLineWidth]; for X:=0 to Info.Width-1 do if Line32[X].rgbReserved=0 then begin onlyAlpha := false; break; end; if not onlyAlpha then break; end; for Y:=0 to Info.Height-1 do begin Line32 := @ImageBits[Y*ImageLineWidth]; Mask := @MaskBits[Y*MaskLineWidth]; Y2 := Info.Height-Y-1; Alpha := PNG.AlphaScanline[Y2]; PNGLine := PNG.ScanLine[Y2]; BitCount := 0; for X:=0 to Info.Width-1 do begin if BitCount=0 then begin BitCount := 8; BitBuf := Mask^; Inc(Mask); end; if BitBuf and $80=0 then with PNGLine[X],Line32[X] do begin rgbtRed := rgbRed; rgbtGreen := rgbGreen; rgbtBlue := rgbBlue; if not onlyAlpha then Alpha[X] := rgbReserved else Alpha[X] := $FF; end else with PNGLine[X] do begin rgbtRed := 0; rgbtGreen := 0; rgbtBlue := 0; Alpha[X] := 0; end; BitBuf := BitBuf shl 1; Dec(BitCount); end; end; end; end; procedure TIcoFile.ConvertToPNG(icoNo:integer;Stream:TStream); var PNG: TPNGObject; begin with Icons[icoNo] do begin Assert(BitmapInfo.bmiHeader.biBitCount>=24); if IsValidAlpha(icoNo) then PNG := TPNGObject.CreateBlank(COLOR_RGBALPHA,8,Info.Width,Info.Height) else PNG := TPNGObject.CreateBlank(COLOR_RGB,8,Info.Width,Info.Height); try Convert(PNG,Icons[icoNo]); PNG.CompressionLevel := 9; PNG.SaveToStream(Stream); finally PNG.Free; end; end; end; procedure TIcoFile.saveAsPng(icoNo:integer;fn:string); var Stream: TStream; begin Stream := TFileStream.Create(fn,fmCreate); try ConvertToPNG(icoNo,Stream); finally Stream.Free; end; end; } procedure TIcoFile.Add(IconData:TIconData); begin setLength(FIcons,length(FIcons)+1); Icons[high(FIcons)] := IconData; end; procedure TIcoFile.AddCopy(IconData:TIconData); begin setLength(FIcons,length(FIcons)+1); Icons[high(FIcons)] := IconData; with Icons[high(FIcons)] do begin ImageBits := copy(IconData.ImageBits); MaskBits := copy(IconData.MaskBits); getMem(BitmapInfo,sizeof(BITMAPINFOHEADER)+iRgbTable); getMem(MaskBitmapInfo,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*2); move(IconData.BitmapInfo^,BitmapInfo^,sizeof(BITMAPINFOHEADER)+iRgbTable); move(IconData.MaskBitmapInfo^,MaskBitmapInfo^,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*2); end; end; procedure TIcoFile.DestroyIconData(IconData: TIconData); begin with IconData do begin if BitmapInfo<>nil then FreeMem(BitmapInfo); BitmapInfo := nil; if MaskBitmapInfo<>nil then FreeMem(MaskBitmapInfo); MaskBitmapInfo := nil; end; end; end. doublecmd-0.5.8/src/platform/win/ugdiplus.pas0000644000175000017500000003755211740433676020306 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- This unit contains some GDI+ API functions Copyright (C) 2008 Koblov Alexander (Alexx2000@mail.ru) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uGdiPlus; {$mode objfpc}{$H+} interface uses Windows; type GPSTATUS = ( Ok, GenericError, InvalidParameter, OutOfMemory, ObjectBusy, InsufficientBuffer, NotImplemented, Win32Error, WrongState, Aborted, FileNotFound, ValueOverflow, AccessDenied, UnknownImageFormat, FontFamilyNotFound, FontStyleNotFound, NotTrueTypeFont, UnsupportedGdiplusVersion, GdiplusNotInitialized, PropertyNotFound, PropertyNotSupported ); GpColorAdjustType = ( ColorAdjustTypeDefault = 0, ColorAdjustTypeBitmap = 1, ColorAdjustTypeBrush = 2, ColorAdjustTypePen = 3, ColorAdjustTypeText = 4, ColorAdjustTypeCount = 5, ColorAdjustTypeAny = 6 ); GpUnit = ( UnitWorld = 0, UnitDisplay = 1, UnitPixel = 2, UnitPoint = 3, UnitInch = 4, UnitDocument = 5, UnitMillimeter = 6 ); const GdipPixelFormatIndexed = $00010000; // Indexes into a palette GdipPixelFormatGDI = $00020000; // Is a GDI-supported format GdipPixelFormatAlpha = $00040000; // Has an alpha component GdipPixelFormatPAlpha = $00080000; // Pre-multiplied alpha GdipPixelFormatExtended = $00100000; // Extended color 16 bits/channel GdipPixelFormatCanonical = $00200000; type GPPIXELFORMAT = ( // ... PixelFormat32bppRGB = ( 9 or (32 shl 8) or GdipPixelFormatGDI), PixelFormat32bppARGB = (10 or (32 shl 8) or GdipPixelFormatAlpha or GdipPixelFormatGDI or GdipPixelFormatCanonical), PixelFormat32bppPARGB = (11 or (32 shl 8) or GdipPixelFormatAlpha or GdipPixelFormatPAlpha or GdipPixelFormatGDI) // ... ); GpGraphics = Pointer; GpImage = Pointer; GpBitmap = Pointer; GpImageAttributes = Pointer; type TDebugEventLevel = (DebugEventLevelFatal, DebugEventLevelWarning); // Callback function that GDI+ can call, on debug builds, for assertions // and warnings. TDebugEventProc = procedure(level: TDebugEventLevel; message: PChar); stdcall; // Notification functions which the user must call appropriately if // "SuppressBackgroundThread" (below) is set. TNotificationHookProc = function(out token: ULONG): GPSTATUS; stdcall; TNotificationUnhookProc = procedure(token: ULONG); stdcall; // Input structure for GdiplusStartup GdiplusStartupInput = packed record GdiplusVersion : Cardinal; // Must be 1 DebugEventCallback : TDebugEventProc; // Ignored on free builds SuppressBackgroundThread: BOOL; // FALSE unless you're prepared to call // the hook/unhook functions properly SuppressExternalCodecs : BOOL; // FALSE unless you want GDI+ only to use end; // its internal image codecs. TGdiplusStartupInput = GdiplusStartupInput; PGdiplusStartupInput = ^TGdiplusStartupInput; // Output structure for GdiplusStartup() GdiplusStartupOutput = packed record NotificationHook : TNotificationHookProc; NotificationUnhook: TNotificationUnhookProc; end; TGdiplusStartupOutput = GdiplusStartupOutput; PGdiplusStartupOutput = ^TGdiplusStartupOutput; PGdiPlusBitmapData = ^GdiPlusBitmapData; GdiPlusBitmapData = packed record Width: UINT; Height: UINT; Stride: UINT; PixelFormat: GPPIXELFORMAT; Scan0: LPBYTE; Reserved: UINT_PTR; end; PARGBQUAD = ^ARGBQUAD; ARGBQUAD = record rgbBlue : BYTE; rgbGreen : BYTE; rgbRed : BYTE; rgbAlpha : BYTE; end; const GdipImageLockModeRead = 1; GdipImageLockModeWrite = 2; GdipImageLockModeUserInputBuf = 4; type // functions prototypes TGdiplusStartup = function (out token: ULONG; input: PGdiplusStartupInput; output: PGdiplusStartupOutput): GPSTATUS; stdcall; TGdiplusShutdown = procedure (token: ULONG); stdcall; TGdipCreateBitmapFromHICON = function (hicon: HICON; out bitmap: GPBITMAP): GPSTATUS; stdcall; TGdipCreateBitmapFromHBITMAP = function (hbitmap: HBITMAP; hpalette: HPALETTE; out bitmap: GPBITMAP): GPSTATUS; stdcall; TGdipCreateBitmapFromScan0 = function (Width, Height: Integer; Stride: Integer; PixelFormat: GPPIXELFORMAT; Scan0: LPBYTE; out bitmap: GPBITMAP): GPSTATUS; stdcall; TGdipCreateBitmapFromGraphics = function (Width, Height: Integer; graphics: GPGRAPHICS; out bitmap: GPBITMAP): GPSTATUS; stdcall; TGdipCreateFromHDC = function (hdc: HDC; out graphics: GPGRAPHICS): GPSTATUS; stdcall; TGdipDrawImageRectI = function (graphics: GPGRAPHICS; image: GPIMAGE; x: Integer; y: Integer; width: Integer; height: Integer): GPSTATUS; stdcall; TGdipDrawImageRectRectI = function (graphics: GPGRAPHICS; image: GPIMAGE; dstx, dsty, dstwidth, dstheight: Integer; srcx, srcy, srcwidth, srcheight: Integer; srcUnit: GpUnit; imageattr: GPIMAGEATTRIBUTES; abortCallback: Pointer = nil; callbackData: Pointer = nil): GPSTATUS; stdcall; TGdipDisposeImage = function (image: GPIMAGE): GPSTATUS; stdcall; TGdipDeleteGraphics = function (graphics: GPGRAPHICS): GPSTATUS; stdcall; TGdipGraphicsClear = function (graphics: GPGRAPHICS; color: Integer): GPSTATUS; stdcall; TGdipSetInterpolationMode = function (graphics: GPGRAPHICS; interpolation: Integer): GPSTATUS; stdcall; TGdipCreateImageAttributes = function (out imageattr: GPIMAGEATTRIBUTES): GPSTATUS; stdcall; TGdipDisposeImageAttributes = function (imageattr: GPIMAGEATTRIBUTES): GPSTATUS; stdcall; TGdipSetImageAttributesColorKeys = function (imageattr: GPIMAGEATTRIBUTES; ColorAdjustType: GpColorAdjustType; Enable: BOOL; ColorLow: LONG; ColorHigh: LONG): GPSTATUS; stdcall; TGdipBitmapLockBits = function (bitmap: GPBITMAP; rect: LPRECT; flags: UINT; PixelFormat: GPPIXELFORMAT; lockedData: PGdiPlusBitmapData): GPSTATUS; stdcall; TGdipBitmapUnlockBits = function (bitmap: GPBITMAP; lockedData: PGdiPlusBitmapData): GPSTATUS; stdcall; TGdipGetImagePixelFormat = function (image: GPIMAGE; out pixelFormat: GPPIXELFORMAT): GPSTATUS; stdcall; var IsGdiPlusLoaded: Boolean = False; GdiplusStartup: TGdiplusStartup; GdiplusShutdown: TGdiplusShutdown; GdipCreateBitmapFromHICON: TGdipCreateBitmapFromHICON; GdipCreateBitmapFromHBITMAP: TGdipCreateBitmapFromHBITMAP; GdipCreateBitmapFromScan0: TGdipCreateBitmapFromScan0; GdipCreateBitmapFromGraphics: TGdipCreateBitmapFromGraphics; GdipCreateFromHDC: TGdipCreateFromHDC; GdipDrawImageRectI: TGdipDrawImageRectI; GdipDrawImageRectRectI: TGdipDrawImageRectRectI; GdipDisposeImage: TGdipDisposeImage; GdipDeleteGraphics: TGdipDeleteGraphics; GdipGraphicsClear: TGdipGraphicsClear; GdipSetInterpolationMode: TGdipSetInterpolationMode; GdipCreateImageAttributes: TGdipCreateImageAttributes; GdipDisposeImageAttributes: TGdipDisposeImageAttributes; GdipSetImageAttributesColorKeys: TGdipSetImageAttributesColorKeys; GdipBitmapLockBits: TGdipBitmapLockBits; GdipBitmapUnlockBits: TGdipBitmapUnlockBits; GdipGetImagePixelFormat: TGdipGetImagePixelFormat; function GdiPlusStretchDraw(hicn: hIcon; hCanvas: HDC; X, Y, cxWidth, cyHeight: Integer): Boolean; function GdiPlusStretchDraw(himl: hImageList; ImageIndex: Integer; hCanvas: HDC; X, Y, cxWidth, cyHeight: Integer): Boolean; implementation uses CommCtrl; var StartupInput: TGDIPlusStartupInput; gdiplusToken: ULONG; function GetBitmapPixels(hDC: HDC; BitmapInfo: LPBITMAPINFO; hBitmap: HBITMAP): PBYTE; begin; // Buffer must be aligned to DWORD (it should automatically be on a 32-bit machine). Result := GetMem(BitmapInfo^.bmiHeader.biWidth * BitmapInfo^.bmiHeader.biHeight * BitmapInfo^.bmiHeader.biBitCount shr 3); if GetDIBits(hDC, hBitmap, 0, BitmapInfo^.bmiHeader.biHeight, Result, BitmapInfo, DIB_RGB_COLORS) = 0 then begin Freemem(Result); Result := nil; end; end; function GetBitmapFromARGBPixels(graphics: GPGRAPHICS; pixels: LPBYTE; Width, Height: Integer): GPBITMAP; var x, y: Integer; pSrc, pDst: LPDWORD; bmBounds: TRECT; bmData: GdiPlusBitmapData; begin if GdipCreateBitmapFromGraphics(Width, Height, graphics, Result) <> ok then Exit(nil); Windows.SetRect(@bmBounds, 0, 0, Width, Height); if GdipBitmapLockBits(Result, @bmBounds, GdipImageLockModeWrite, PixelFormat32bppARGB, @bmData) <> ok then begin GdipDisposeImage(Result); Exit(nil); end; pSrc := LPDWORD(pixels); pDst := LPDWORD(bmData.Scan0); // Pixels retrieved by GetDIBits are bottom-up, left-right. for x := 0 to Width - 1 do for y := 0 to Height - 1 do pDst[(Height - 1 - y) * Width + x] := pSrc[y * Width + x]; GdipBitmapUnlockBits(Result, @bmData); end; function HasAlphaChannel(pixels: LPBYTE; Width, Height: Integer): Boolean; var i: Integer; begin for i := 0 to Width * Height - 1 do begin if PARGBQUAD(pixels)[i].rgbAlpha <> 0 then Exit(True); end; Result := False; end; function GdiPlusStretchDraw(hicn: hIcon; hCanvas: HDC; X, Y, cxWidth, cyHeight: Integer): Boolean; var pIcon: GPIMAGE; pCanvas: GPGRAPHICS; IconInfo: TICONINFO; BitmapInfo: TBITMAPINFO; pixels: LPBYTE = nil; begin Result:= False; if GetIconInfo(hicn, IconInfo) = False then Exit; try GdipCreateFromHDC(hCanvas, pCanvas); // Prepare bitmap info structure. FillMemory(@BitmapInfo, sizeof(BitmapInfo), 0); BitmapInfo.bmiHeader.biSize := Sizeof(BitmapInfo.bmiHeader); GetDIBits(hCanvas, IconInfo.hbmColor, 0, 0, nil, @BitmapInfo, 0); if (BitmapInfo.bmiHeader.biBitCount = 32) then { only 32bpp } begin // Get pixels data. pixels := GetBitmapPixels(hCanvas, @BitmapInfo, IconInfo.hbmColor); // Check if the bitmap has alpha channel (have to be 32bpp to have ARGB format). if HasAlphaChannel(pixels, BitmapInfo.bmiHeader.biWidth, BitmapInfo.bmiHeader.biHeight) then begin // GdipCreateBitmapFromHICON and GdipCreateBitmapFromHBITMAP functions // destroy alpha channel (they write alpha=255 for each pixel). // Copy the ARGB values manually. pIcon := GetBitmapFromARGBPixels(pCanvas, pixels, BitmapInfo.bmiHeader.biWidth, BitmapInfo.bmiHeader.biHeight); end else // This is OK for bitmaps without alpha channel or < 32bpp. GdipCreateBitmapFromHICON(hicn, pIcon); end else // This is OK for bitmaps without alpha channel or < 32bpp. GdipCreateBitmapFromHICON(hicn, pIcon); Result:= GdipDrawImageRectI(pCanvas, pIcon, X, Y, cxWidth, cyHeight) = Ok; finally GdipDisposeImage(pIcon); GdipDeleteGraphics(pCanvas); DeleteObject(IconInfo.hbmColor); DeleteObject(IconInfo.hbmMask); if Assigned(pixels) then Freemem(pixels); end; end; function GdiPlusStretchDraw(himl: hImageList; ImageIndex: Integer; hCanvas: HDC; X, Y, cxWidth, cyHeight: Integer): Boolean; var hicn: HICON; begin Result:= False; try hicn:= ImageList_ExtractIcon(0, himl, ImageIndex); Result:= GdiPlusStretchDraw(hicn, hCanvas, X, Y, cxWidth, cyHeight); finally DestroyIcon(hicn); end; end; var hLib: HMODULE; initialization hLib:= LoadLibrary('gdiplus.dll'); IsGdiPlusLoaded:= (hLib <> 0); if IsGdiPlusLoaded then begin GdiplusStartup:= TGdiplusStartup(GetProcAddress(hLib, 'GdiplusStartup')); GdiplusShutdown:= TGdiplusShutdown(GetProcAddress(hLib, 'GdiplusShutdown')); GdipCreateBitmapFromHICON:= TGdipCreateBitmapFromHICON(GetProcAddress(hLib, 'GdipCreateBitmapFromHICON')); GdipCreateBitmapFromHBITMAP:= TGdipCreateBitmapFromHBITMAP(GetProcAddress(hLib, 'GdipCreateBitmapFromHBITMAP')); GdipCreateBitmapFromScan0:= TGdipCreateBitmapFromScan0(GetProcAddress(hLib, 'GdipCreateBitmapFromScan0')); GdipCreateBitmapFromGraphics:= TGdipCreateBitmapFromGraphics(GetProcAddress(hLib, 'GdipCreateBitmapFromGraphics')); GdipCreateFromHDC:= TGdipCreateFromHDC(GetProcAddress(hLib, 'GdipCreateFromHDC')); GdipDrawImageRectI:= TGdipDrawImageRectI(GetProcAddress(hLib, 'GdipDrawImageRectI')); GdipDrawImageRectRectI:= TGdipDrawImageRectRectI(GetProcAddress(hLib, 'GdipDrawImageRectRectI')); GdipDisposeImage:= TGdipDisposeImage(GetProcAddress(hLib, 'GdipDisposeImage')); GdipDeleteGraphics:= TGdipDeleteGraphics(GetProcAddress(hLib, 'GdipDeleteGraphics')); GdipGraphicsClear:= TGdipGraphicsClear(GetProcAddress(hLib, 'GdipGraphicsClear')); GdipSetInterpolationMode:= TGdipSetInterpolationMode(GetProcAddress(hLib, 'GdipSetInterpolationMode')); GdipCreateImageAttributes:= TGdipCreateImageAttributes(GetProcAddress(hLib, 'GdipCreateImageAttributes')); GdipDisposeImageAttributes:= TGdipDisposeImageAttributes(GetProcAddress(hLib, 'GdipDisposeImageAttributes')); GdipSetImageAttributesColorKeys:= TGdipSetImageAttributesColorKeys(GetProcAddress(hLib, 'GdipSetImageAttributesColorKeys')); GdipBitmapLockBits:= TGdipBitmapLockBits(GetProcAddress(hLib, 'GdipBitmapLockBits')); GdipBitmapUnlockBits:= TGdipBitmapUnlockBits(GetProcAddress(hLib, 'GdipBitmapUnlockBits')); GdipGetImagePixelFormat:= TGdipGetImagePixelFormat(GetProcAddress(hLib, 'GdipGetImagePixelFormat')); // Initialize GDI+ StartupInput structure StartupInput.DebugEventCallback:= nil; StartupInput.SuppressBackgroundThread:= False; StartupInput.SuppressExternalCodecs:= False; StartupInput.GdiplusVersion:= 1; // Initialize GDI+ GdiplusStartup(gdiplusToken, @StartupInput, nil); end; finalization if IsGdiPlusLoaded then begin // Close GDI + GdiplusShutdown(gdiplusToken); GdiplusStartup:= nil; GdiplusShutdown:= nil; GdipCreateBitmapFromHICON:= nil; GdipCreateBitmapFromHBITMAP:= nil; GdipCreateBitmapFromScan0:= nil; GdipCreateBitmapFromGraphics:= nil; GdipCreateFromHDC:= nil; GdipDrawImageRectI:= nil; GdipDrawImageRectRectI:= nil; GdipDisposeImage:= nil; GdipDeleteGraphics:= nil; GdipGraphicsClear:= nil; GdipSetInterpolationMode:= nil; GdipCreateImageAttributes:= nil; GdipDisposeImageAttributes:= nil; GdipSetImageAttributesColorKeys:= nil; GdipBitmapLockBits:= nil; GdipBitmapUnlockBits:= nil; GdipGetImagePixelFormat:= nil; FreeLibrary(hLib); end; end. doublecmd-0.5.8/src/platform/win/ushlobjadditional.pas0000644000175000017500000002105511740433676022140 0ustar alexxalexx(* Daniel U. Thibault 19 August 1999 Updated 15 September 1999 Constants, types that have appeared since ShlObj.pas. The values marked //MISSING VALUES remain unidentified (two sets). Koblov Alexander (Alexx2000@mail.ru) 15 July 2007 Add some functions, constants and types for Lazarus compability *) unit uShlObjAdditional; {$mode delphi} interface uses Windows, ShlObj, ActiveX; const { User canceled the current action } COPYENGINE_E_USER_CANCELLED: HRESULT = HRESULT($80270000); { IShellIconOverlay Interface } { Used to return the icon overlay index or its icon index for an IShellFolder object, this is always implemented with IShellFolder [Member functions] IShellIconOverlay::GetOverlayIndex Parameters: pidl object to identify icon overlay for. pdwIndex the Overlay Index in the system image list IShellIconOverlay::GetOverlayIconIndex This method is only used for those who are interested in seeing the real bits of the Overlay Icon Returns: S_OK, if the index of an Overlay is found S_FALSE, if no Overlay exists for this file E_FAIL, if pidl is bad Parameters: pdwIconIndex the Overlay Icon index in the system image list } const IID_IShellIconOverlay : TGUID = ( D1:$7D688A70; D2:$C613; D3:$11D0; D4:($99,$9B,$00,$C0,$4F,$D6,$55,$E1)); SID_IShellIconOverlay = '{7D688A70-C613-11D0-999B-00C04FD655E1}'; type IShellIconOverlay = interface(IUnknown) [SID_IShellIconOverlay] function GetOverlayIndex(pidl : PItemIDList; var Index : Integer) : HResult; stdcall; function GetOverlayIconIndex(pidl : PItemIDList; var IconIndex : Integer) : HResult; stdcall; end; { IShellIconOverlay } function SHChangeIconDialog(hOwner: THandle; var FileName: UTF8String; var IconIndex: Integer): Boolean; function SHGetOverlayIconIndex(const sFilePath, sFileName: UTF8String): Integer; function SHGetInfoTip(const sFilePath, sFileName: UTF8String): UTF8String; function SHFileIsLinkToFolder(const FileName: UTF8String; out LinkTarget: UTF8String): Boolean; function PathIsUNCA(pszPath: LPCSTR): WINBOOL; stdcall; external 'shlwapi' name 'PathIsUNCA'; function PathIsUNCW(pwszPath: LPCWSTR): WINBOOL; stdcall; external 'shlwapi' name 'PathIsUNCW'; function PathFindNextComponentA(pszPath: LPCSTR): LPSTR; stdcall; external 'shlwapi' name 'PathFindNextComponentA'; function PathFindNextComponentW(pwszPath: LPCWSTR): LPWSTR; stdcall; external 'shlwapi' name 'PathFindNextComponentW'; procedure OleErrorUTF8(ErrorCode: HResult); procedure OleCheckUTF8(Result: HResult); implementation uses SysUtils, JwaShlGuid, ComObj; const Shell32 = 'shell32.dll'; { **** UBPFD *********** by delphibase.endimus.com **** >> Calls icon selection dialog. Modified function for calling "Change icon" dialog. Dependencies: Windows, SysUtils Author: Alex Sal'nikov, alex-co@narod.ru, Moscow Copyright: Modified JVCL library Date: 15 july 2003 . ***************************************************** } function SHChangeIconDialog(hOwner: THandle; var FileName: UTF8String; var IconIndex: Integer): Boolean; type TSHChangeIconProc = function(Wnd: HWND; szFileName: PChar; Reserved: Integer; var lpIconIndex: Integer): DWORD; stdcall; TSHChangeIconProcW = function(Wnd: HWND; szFileName: PWideChar;Reserved: Integer; var lpIconIndex: Integer): DWORD; stdcall; var ShellHandle: THandle; SHChangeIcon: TSHChangeIconProc; SHChangeIconW: TSHChangeIconProcW; Buf: array[0..MAX_PATH] of AnsiChar; BufW: array[0..MAX_PATH] of WideChar; begin Result := False; SHChangeIcon := nil; SHChangeIconW := nil; ShellHandle := Windows.LoadLibrary(PChar(Shell32)); try if ShellHandle <> 0 then begin if Win32Platform = VER_PLATFORM_WIN32_NT then SHChangeIconW := TSHChangeIconProcW(Windows.GetProcAddress(ShellHandle, PChar(62))) else SHChangeIcon := TSHChangeIconProc(Windows.GetProcAddress(ShellHandle, PChar(62))); end; if Assigned(SHChangeIconW) then begin BufW := UTF8Decode(FileName); Result := SHChangeIconW(hOwner, BufW, SizeOf(BufW), IconIndex) = 1; if Result then FileName := UTF8Encode(WideString(BufW)); end else if Assigned(SHChangeIcon) then begin Buf := UTF8ToAnsi(FileName); Result := SHChangeIcon(hOwner, Buf, SizeOf(Buf), IconIndex) = 1; if Result then FileName := AnsiToUTF8(Buf); end else begin IconIndex := 0; Result := True; end; finally if ShellHandle <> 0 then FreeLibrary(ShellHandle); end; end; function SHGetOverlayIconIndex(const sFilePath, sFileName: UTF8String): Integer; var Folder, DesktopFolder: IShellFolder; Pidl, ParentPidl: PItemIDList; IconOverlay: IShellIconOverlay; pchEaten: ULONG; dwAttributes: ULONG = 0; wsTemp: WideString; begin Result:= -1; if SHGetDesktopFolder(DesktopFolder) = S_OK then begin wsTemp:= UTF8Decode(sFilePath); if DesktopFolder.ParseDisplayName(0, nil, PWideChar(wsTemp), pchEaten, ParentPidl, dwAttributes) = S_OK then begin if DesktopFolder.BindToObject(ParentPidl, nil, IID_IShellFolder, Folder) = S_OK then begin // Get an IShellIconOverlay interface for the folder. // If this fails then this version of // the shell does not have this // interface. if Folder.QueryInterface(IID_IShellIconOverlay, IconOverlay) = S_OK then begin // Get a pidl for the file. wsTemp:= UTF8Decode(sFileName); if Folder.ParseDisplayName(0, nil, PWideChar(wsTemp), pchEaten, Pidl, dwAttributes) = S_OK then begin // Get the overlay icon index. if IconOverlay.GetOverlayIconIndex(Pidl, Result) <> S_OK then Result:= -1; CoTaskMemFree(Pidl); end; end; end; CoTaskMemFree(ParentPidl); end; DesktopFolder:= nil; end; // SHGetDesktopFolder end; function SHGetInfoTip(const sFilePath, sFileName: UTF8String): UTF8String; var DesktopFolder, Folder: IShellFolder; pidlFolder: PItemIDList = nil; pidlFile: PItemIDList = nil; queryInfo: IQueryInfo; ppwszTip: PWideChar = nil; pchEaten: ULONG; dwAttributes: ULONG = 0; wsTemp: WideString; begin Result:= EmptyStr; if Succeeded(SHGetDesktopFolder(DesktopFolder)) then try wsTemp:= UTF8Decode(sFilePath); if Succeeded(DesktopFolder.ParseDisplayName(0, nil, PWideChar(wsTemp), pchEaten, pidlFolder, dwAttributes)) then if Succeeded(DesktopFolder.BindToObject(pidlFolder, nil, IID_IShellFolder, Folder)) then try wsTemp:= UTF8Decode(sFileName); if Succeeded(Folder.ParseDisplayName(0, nil, PWideChar(wsTemp), pchEaten, pidlFile, dwAttributes)) then if Succeeded(Folder.GetUIObjectOf(0, 1, pidlFile, IID_IQueryInfo, nil, queryInfo)) then if Succeeded(queryInfo.GetInfoTip(QITIPF_USESLOWTIP, ppwszTip)) then Result:= UTF8Encode(WideString(ppwszTip)); finally Folder:= nil; queryInfo:= nil; if Assigned(ppwszTip) then CoTaskMemFree(ppwszTip); if Assigned(pidlFile) then CoTaskMemFree(pidlFile); end; finally DesktopFolder:= nil; if Assigned(pidlFolder) then CoTaskMemFree(pidlFolder); end; end; function SHFileIsLinkToFolder(const FileName: UTF8String; out LinkTarget: UTF8String): Boolean; var Unknown: IUnknown; ShellLink: IShellLinkW; PersistFile: IPersistFile; FindData: TWin32FindDataW; pszFile:LPWSTR; begin Result := False; try Unknown := CreateComObject(CLSID_ShellLink); ShellLink := Unknown as IShellLinkW; PersistFile := Unknown as IPersistFile; if Failed(PersistFile.Load(PWideChar(UTF8Decode(FileName)), OF_READ)) then Exit; pszFile:= GetMem(MAX_PATH * 2); try if Failed(ShellLink.GetPath(pszFile, MAX_PATH, @FindData, 0)) then Exit; if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0 then begin LinkTarget := UTF8Encode(WideString(pszFile)); Result := (LinkTarget <> EmptyStr); end; finally FreeMem(pszFile); end; except LinkTarget := EmptyStr; end; end; procedure OleErrorUTF8(ErrorCode: HResult); begin raise EOleError.Create(UTF8Encode(SysErrorMessage(ErrorCode))); end; procedure OleCheckUTF8(Result: HResult); begin if not Succeeded(Result) then OleErrorUTF8(Result); end; end. { ShlObjAdditional } doublecmd-0.5.8/src/platform/win/ushellcontextmenu.pas0000644000175000017500000004432611747206510022225 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Shell context menu implementation. Copyright (C) 2006-2012 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uShellContextMenu; {$mode delphi}{$H+} {$IF (FPC_VERSION > 2) or ((FPC_VERSION = 2) and (FPC_RELEASE >= 5))} {$POINTERMATH ON} {$ENDIF} interface uses Classes, SysUtils, Controls, uFile, Windows, ComObj, ShlObj, ActiveX, JwaShlGuid, uShlObjAdditional; const sCmdVerbOpen = 'open'; sCmdVerbRename = 'rename'; sCmdVerbDelete = 'delete'; sCmdVerbCut = 'cut'; sCmdVerbCopy = 'copy'; sCmdVerbPaste = 'paste'; sCmdVerbLink = 'link'; sCmdVerbProperties = 'properties'; sCmdVerbNewFolder = 'NewFolder'; type { EContextMenuException } EContextMenuException = class(Exception); { TShellContextMenu } TShellContextMenu = class private FOnClose: TNotifyEvent; FParent: TWinControl; FFiles: TFiles; FBackground: Boolean; FShellMenu1: IContextMenu; FShellMenu: HMENU; public constructor Create(Parent: TWinControl; var Files : TFiles; Background: Boolean); reintroduce; destructor Destroy; override; procedure PopUp(X, Y: Integer); property OnClose: TNotifyEvent read FOnClose write FOnClose; end; function GetShellContextMenu(Handle: HWND; Files: TFiles; Background: Boolean): IContextMenu; implementation uses LCLProc, Dialogs, uGlobs, uLng, uMyWindows, uShellExecute, fMain, uDCUtils, uFormCommands, DCOSUtils, uOSUtils, uShowMsg; const USER_CMD_ID = $1000; var OldWProc: WNDPROC = nil; ShellMenu2: IContextMenu2 = nil; ShellMenu3: IContextMenu3 = nil; function MyWndProc(hWnd: HWND; uiMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin case uiMsg of (* For working with submenu of context menu *) WM_INITMENUPOPUP, WM_DRAWITEM, WM_MENUCHAR, WM_MEASUREITEM: if Assigned(ShellMenu3) then ShellMenu3.HandleMenuMsg2(uiMsg, wParam, lParam, @Result) else if Assigned(ShellMenu2) then begin ShellMenu2.HandleMenuMsg(uiMsg, wParam, lParam); Result := 0; end else Result := CallWindowProc(OldWProc, hWnd, uiMsg, wParam, lParam); else Result := CallWindowProc(OldWProc, hWnd, uiMsg, wParam, lParam); end; // case end; function GetForegroundContextMenu(Handle : HWND; Files : TFiles): IContextMenu; type PPIDLArray = ^PItemIDList; var Folder, DesktopFolder: IShellFolder; PathPIDL: PItemIDList = nil; tmpPIDL: PItemIDList = nil; S: WideString; List: PPIDLArray = nil; I : Integer; pchEaten: ULONG; dwAttributes: ULONG = 0; begin Result := nil; OleCheckUTF8(SHGetDesktopFolder(DesktopFolder)); try List := CoTaskMemAlloc(SizeOf(PItemIDList)*Files.Count); ZeroMemory(List, SizeOf(PItemIDList)*Files.Count); for I := 0 to Files.Count - 1 do begin if Files[I].Name = EmptyStr then S := EmptyStr else S := UTF8Decode(Files[I].Path); OleCheckUTF8(DeskTopFolder.ParseDisplayName(Handle, nil, PWideChar(S), pchEaten, PathPIDL, dwAttributes)); try OleCheckUTF8(DeskTopFolder.BindToObject(PathPIDL, nil, IID_IShellFolder, Folder)); finally CoTaskMemFree(PathPIDL); end; if Files[I].Name = EmptyStr then S := UTF8Decode(Files[I].Path) else S := UTF8Decode(Files[I].Name); OleCheckUTF8(Folder.ParseDisplayName(Handle, nil, PWideChar(S), pchEaten, tmpPIDL, dwAttributes)); (List + i)^ := tmpPIDL; end; Folder.GetUIObjectOf(Handle, Files.Count, PItemIDList(List^), IID_IContextMenu, nil, Result); finally if Assigned(List) then begin for I := 0 to Files.Count - 1 do if Assigned((List + i)^) then CoTaskMemFree((List + i)^); CoTaskMemFree(List); end; Folder:= nil; DesktopFolder:= nil; end; end; function GetBackgroundContextMenu(Handle : HWND; Files : TFiles): IContextMenu; var DesktopFolder, Folder: IShellFolder; wsFileName: WideString; PathPIDL: PItemIDList = nil; pchEaten: ULONG; dwAttributes: ULONG = 0; begin Result:= nil; if Files.Count > 0 then begin wsFileName:= UTF8Decode(Files[0].FullPath); OleCheckUTF8(SHGetDesktopFolder(DesktopFolder)); try OleCheckUTF8(DesktopFolder.ParseDisplayName(Handle, nil, PWideChar(wsFileName), pchEaten, PathPIDL, dwAttributes)); try OleCheckUTF8(DesktopFolder.BindToObject(PathPIDL, nil, IID_IShellFolder, Folder)); finally CoTaskMemFree(PathPIDL); end; OleCheckUTF8(Folder.CreateViewObject(Handle, IID_IContextMenu, Result)); finally Folder:= nil; DesktopFolder:= nil; end; end; end; function GetShellContextMenu(Handle: HWND; Files: TFiles; Background: Boolean): IContextMenu; inline; begin if Background then Result:= GetBackgroundContextMenu(Handle, Files) else Result:= GetForegroundContextMenu(Handle, Files); end; type { TShellThread } TShellThread = class(TThread) private FParent: HWND; FVerb: AnsiString; FShellMenu: IContextMenu; protected procedure Execute; override; public constructor Create(Parent: HWND; ShellMenu: IContextMenu; Verb: AnsiString); reintroduce; destructor Destroy; override; end; { TShellThread } procedure TShellThread.Execute; var Result: HRESULT; cmici: TCMINVOKECOMMANDINFO; begin CoInitializeEx(nil, COINIT_APARTMENTTHREADED); try FillByte(cmici, SizeOf(cmici), 0); with cmici do begin cbSize := SizeOf(cmici); hwnd := FParent; lpVerb := PAnsiChar(FVerb); nShow := SW_NORMAL; end; Result:= FShellMenu.InvokeCommand(cmici); if not (Succeeded(Result) or (Result = COPYENGINE_E_USER_CANCELLED)) then msgError(Self, mbSysErrorMessage(Result)); finally CoUninitialize; end; end; constructor TShellThread.Create(Parent: HWND; ShellMenu: IContextMenu; Verb: AnsiString); begin inherited Create(True); FVerb:= Verb; FParent:= Parent; FShellMenu:= ShellMenu; FreeOnTerminate:= True; end; destructor TShellThread.Destroy; begin FShellMenu:= nil; inherited Destroy; end; { TShellContextMenu } constructor TShellContextMenu.Create(Parent: TWinControl; var Files : TFiles; Background: Boolean); var UFlags: UINT = CMF_EXPLORE or CMF_CANRENAME; begin // Replace window procedure {$PUSH}{$HINTS OFF} OldWProc := WNDPROC(SetWindowLongPtr(Parent.Handle, GWL_WNDPROC, LONG_PTR(@MyWndProc))); {$POP} FParent:= Parent; FFiles:= Files; FBackground:= Background; FShellMenu:= 0; // Add extended verbs if shift key is down if (ssShift in GetKeyShiftState) then UFlags:= UFlags or CMF_EXTENDEDVERBS; try try FShellMenu1 := GetShellContextMenu(Parent.Handle, Files, Background); if Assigned(FShellMenu1) then begin FShellMenu := CreatePopupMenu; OleCheckUTF8(FShellMenu1.QueryContextMenu(FShellMenu, 0, 1, USER_CMD_ID - 1, UFlags)); FShellMenu1.QueryInterface(IID_IContextMenu2, ShellMenu2); // to handle submenus. FShellMenu1.QueryInterface(IID_IContextMenu3, ShellMenu3); // to handle submenus. end; except on e: EOleError do raise EContextMenuException.Create(e.Message); end; finally Files:= nil; end; end; destructor TShellContextMenu.Destroy; begin // Restore window procedure {$PUSH}{$HINTS OFF} SetWindowLongPtr(FParent.Handle, GWL_WNDPROC, LONG_PTR(@OldWProc)); {$POP} // Free global variables ShellMenu2:= nil; ShellMenu3:= nil; // Free internal objects FShellMenu1:= nil; FreeThenNil(FFiles); if FShellMenu <> 0 then DestroyMenu(FShellMenu); inherited Destroy; end; procedure TShellContextMenu.PopUp(X, Y: Integer); var aFile: TFile = nil; sl: TStringList = nil; i:Integer; sAct, sCmd: UTF8String; hActionsSubMenu: HMENU = 0; cmd: UINT = 0; iCmd: Integer; cmici: TCMINVOKECOMMANDINFO; bHandled : Boolean = False; ZVerb: array[0..255] of char; sVerb : String; Result: HRESULT; FormCommands: IFormCommands; begin try try if Assigned(FShellMenu1) then try FormCommands := frmMain as IFormCommands; aFile := FFiles[0]; if FBackground then // Add "Background" context menu specific items begin sl:= TStringList.Create; // Add commands to root of context menu sCmd:= 'cm_Refresh'; I:= sl.Add(sCmd); sAct:= FormCommands.GetCommandCaption(sCmd); InsertMenuItemEx(FShellMenu, 0, PWideChar(UTF8Decode(sAct)), 0, I + USER_CMD_ID, MFT_STRING); // Add "Sort by" submenu hActionsSubMenu := CreatePopupMenu; sCmd:= 'cm_ReverseOrder'; I:= sl.Add(sCmd); sAct:= FormCommands.GetCommandCaption(sCmd); InsertMenuItemEx(hActionsSubMenu,0, PWideChar(UTF8Decode(sAct)), 0, I + USER_CMD_ID, MFT_STRING); // Add separator InsertMenuItemEx(hActionsSubMenu, 0, nil, 0, 0, MFT_SEPARATOR); sCmd:= 'cm_SortByAttr'; I:= sl.Add(sCmd); sAct:= FormCommands.GetCommandCaption(sCmd); InsertMenuItemEx(hActionsSubMenu,0, PWideChar(UTF8Decode(sAct)), 0, I + USER_CMD_ID, MFT_STRING); sCmd:= 'cm_SortByDate'; I:= sl.Add(sCmd); sAct:= FormCommands.GetCommandCaption(sCmd); InsertMenuItemEx(hActionsSubMenu,0, PWideChar(UTF8Decode(sAct)), 0, I + USER_CMD_ID, MFT_STRING); sCmd:= 'cm_SortBySize'; I:= sl.Add(sCmd); sAct:= FormCommands.GetCommandCaption(sCmd); InsertMenuItemEx(hActionsSubMenu,0, PWideChar(UTF8Decode(sAct)), 0, I + USER_CMD_ID, MFT_STRING); sCmd:= 'cm_SortByExt'; I:= sl.Add(sCmd); sAct:= FormCommands.GetCommandCaption(sCmd); InsertMenuItemEx(hActionsSubMenu,0, PWideChar(UTF8Decode(sAct)), 0, I + USER_CMD_ID, MFT_STRING); sCmd:= 'cm_SortByName'; I:= sl.Add(sCmd); sAct:= FormCommands.GetCommandCaption(sCmd); InsertMenuItemEx(hActionsSubMenu,0, PWideChar(UTF8Decode(sAct)), 0, I + USER_CMD_ID, MFT_STRING); // Add submenu to context menu InsertMenuItemEx(FShellMenu, hActionsSubMenu, PWideChar(UTF8Decode(rsMnuSortBy)), 1, 333, MFT_STRING); // Add menu separator InsertMenuItemEx(FShellMenu, 0, nil, 2, 0, MFT_SEPARATOR); // Add commands to root of context menu sCmd:= 'cm_PasteFromClipboard'; I:= sl.Add(sCmd); sAct:= FormCommands.GetCommandCaption(sCmd); InsertMenuItemEx(FShellMenu, 0, PWideChar(UTF8Decode(sAct)), 3, I + USER_CMD_ID, MFT_STRING); // Add menu separator InsertMenuItemEx(FShellMenu, 0, nil, 4, 0, MFT_SEPARATOR); end else // Add "Actions" submenu begin hActionsSubMenu := CreatePopupMenu; // Read actions from doublecmd.ext sl:=TStringList.Create; if gExts.GetExtActions(aFile, sl) then begin for I:= 0 to sl.Count - 1 do begin sAct:= sl.Names[I]; if (CompareText('OPEN', sAct) = 0) or (CompareText('VIEW', sAct) = 0) or (CompareText('EDIT', sAct) = 0) then Continue; InsertMenuItemEx(hActionsSubMenu,0, PWChar(UTF8Decode(sAct)), 0, I + USER_CMD_ID, MFT_STRING); end; end; if (FFiles.Count = 1) and not (aFile.IsDirectory or aFile.IsLinkToDirectory) then begin // Add separator if needed. if GetMenuItemCount(hActionsSubMenu) > 0 then InsertMenuItemEx(hActionsSubMenu,0, nil, 0, 0, MFT_SEPARATOR); // now add VIEW item sCmd:= '{!VIEWER} ' + QuoteStr(aFile.FullPath); I := sl.Add(sCmd); InsertMenuItemEx(hActionsSubMenu,0, PWChar(UTF8Decode(rsMnuView)), 1, I + USER_CMD_ID, MFT_STRING); // now add EDIT item sCmd:= '{!EDITOR} ' + QuoteStr(aFile.FullPath); I := sl.Add(sCmd); InsertMenuItemEx(hActionsSubMenu,0, PWChar(UTF8Decode(rsMnuEdit)), 1, I + USER_CMD_ID, MFT_STRING); end; // Add Actions submenu if not empty. if GetMenuItemCount(hActionsSubMenu) > 0 then begin // Insert Actions submenu before first separator iCmd:= GetMenuItemCount(FShellMenu) - 1; for I:= 0 to iCmd do begin if GetMenuItemType(FShellMenu, I, True) = MFT_SEPARATOR then Break; end; InsertMenuItemEx(FShellMenu, hActionsSubMenu, PWideChar(UTF8Decode(rsMnuActions)), I, 333, MFT_STRING); end; end; { /Actions submenu } //------------------------------------------------------------------------------ cmd := UINT(TrackPopupMenu(FShellMenu, TPM_LEFTALIGN or TPM_LEFTBUTTON or TPM_RIGHTBUTTON or TPM_RETURNCMD, X, Y, 0, FParent.Handle, nil)); finally if hActionsSubMenu <> 0 then DestroyMenu(hActionsSubMenu); end; if (cmd > 0) and (cmd < USER_CMD_ID) then begin iCmd := LongInt(Cmd) - 1; if Succeeded(FShellMenu1.GetCommandString(iCmd, GCS_VERBA, nil, ZVerb, SizeOf(ZVerb))) then begin sVerb := StrPas(ZVerb); if SameText(sVerb, sCmdVerbRename) then begin if FFiles.Count = 1 then with FFiles[0] do begin if not SameText(FullPath, ExtractFileDrive(FullPath) + PathDelim) then frmMain.actRenameOnly.Execute else // change drive label begin sCmd:= mbGetVolumeLabel(FullPath, True); if InputQuery(rsMsgSetVolumeLabel, rsMsgVolumeLabel, sCmd) then mbSetVolumeLabel(FullPath, sCmd); end; end else frmMain.actRename.Execute; bHandled := True; end else if SameText(sVerb, sCmdVerbCut) then begin frmMain.actCutToClipboard.Execute; bHandled := True; end else if SameText(sVerb, sCmdVerbCopy) then begin frmMain.actCopyToClipboard.Execute; bHandled := True; end else if SameText(sVerb, sCmdVerbNewFolder) then begin frmMain.actMakeDir.Execute; bHandled := True; end else if SameText(sVerb, sCmdVerbPaste) or SameText(sVerb, sCmdVerbDelete) then begin TShellThread.Create(FParent.Handle, FShellMenu1, sVerb).Start; bHandled := True; end; end; if not bHandled then begin FillChar(cmici, SizeOf(cmici), #0); with cmici do begin cbSize := SizeOf(cmici); hwnd := FParent.Handle; {$PUSH}{$HINTS OFF} lpVerb := PAnsiChar(PtrUInt(cmd - 1)); {$POP} nShow := SW_NORMAL; end; Result:= FShellMenu1.InvokeCommand(cmici); if not (Succeeded(Result) or (Result = COPYENGINE_E_USER_CANCELLED)) then OleErrorUTF8(Result); // Reload after possible changes on the filesystem. if SameText(sVerb, sCmdVerbLink) or SameText(sVerb, sCmdVerbDelete) then frmMain.ActiveFrame.FileSource.Reload(frmMain.ActiveFrame.CurrentPath); end; end // if cmd > 0 else if (cmd >= USER_CMD_ID) then // actions sub menu begin sCmd:= sl.Strings[cmd - USER_CMD_ID]; if FBackground then begin if SameText(sCmd, 'cm_PasteFromClipboard') then TShellThread.Create(FParent.Handle, FShellMenu1, sCmdVerbPaste).Start else FormCommands.ExecuteCommand(sCmd, []); bHandled:= True; end else begin sCmd:= Copy(sCmd, Pos('=', sCmd) + 1, Length(sCmd)); sCmd:= PrepareParameter(sCmd, frmMain.FrameLeft, frmMain.FrameRight, frmMain.ActiveFrame); try with frmMain.ActiveFrame do begin (* VFS via another file source if (Pos('{!VFS}',sCmd)>0) and pnlFile.VFS.FindModule(CurrentPath + fri.sName) then begin pnlFile.LoadPanelVFS(@fri); Exit; end; *) try if not ProcessExtCommand(sCmd, CurrentPath) then frmMain.ExecCmd(sCmd); except on e: EInvalidCommandLine do MessageDlg(rsMsgErrorInContextMenuCommand, rsMsgInvalidCommandLine + ': ' + e.Message, mtError, [mbOK], 0); end; end; finally bHandled:= True; end; end; end; finally if Assigned(sl) then FreeAndNil(sl); end; except on e: EOleError do raise EContextMenuException.Create(e.Message); end; if Assigned(FOnClose) then FOnClose(Self); end; end. doublecmd-0.5.8/src/platform/win/umywindows.pas0000644000175000017500000005504012154651644020664 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- This unit contains specific WINDOWS functions. Copyright (C) 2006-2013 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uMyWindows; {$mode objfpc}{$H+} interface uses Classes, SysUtils, JwaWinBase, Windows; type tagMENUITEMINFOW = record cbSize: UINT; fMask: UINT; fType: UINT; // used if MIIM_TYPE (4.0) or MIIM_FTYPE (>4.0) fState: UINT; // used if MIIM_STATE wID: UINT; // used if MIIM_ID hSubMenu: HMENU; // used if MIIM_SUBMENU hbmpChecked: HBITMAP; // used if MIIM_CHECKMARKS hbmpUnchecked: HBITMAP; // used if MIIM_CHECKMARKS dwItemData: ULONG_PTR; // used if MIIM_DATA dwTypeData: LPWSTR; // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0) cch: UINT; // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0) hbmpItem: HBITMAP; // used if MIIM_BITMAP end; MENUITEMINFOW = tagMENUITEMINFOW; LPMENUITEMINFOW = ^MENUITEMINFOW; LPCMENUITEMINFOW = ^MENUITEMINFOW; TMenuItemInfoW = MENUITEMINFOW; PMenuItemInfoW = LPMENUITEMINFOW; function InsertMenuItemW(hMenu: HMENU; uItem: UINT; fByPosition: BOOL; const lpmii: MENUITEMINFOW): BOOL; stdcall; external 'user32' name 'InsertMenuItemW'; function GetMenuItemText(hMenu: HMENU; uItem: UINT; fByPosition: LongBool): WideString; function GetMenuItemType(hMenu: HMENU; uItem: UINT; fByPosition: LongBool): UINT; function InsertMenuItemEx(hMenu, SubMenu: HMENU; Caption: PWideChar; Position, ItemID, ItemType : UINT): boolean; {en Extracts volume GUID from a volume GUID path } function ExtractVolumeGUID(const VolumeName: WideString): WideString; {en Retrieves a volume GUID path for the volume that is associated with the specified volume mount point (drive letter, volume GUID path, or mounted folder) @param(Path The string that contains the path of a mounted folder or a drive letter) @returns(Volume GUID path) } function GetMountPointVolumeName(const Path: WideString): WideString; {en Checks readiness of a drive @param(sDrv String specifying the root directory of a file system volume) @returns(The function returns @true if drive is ready, @false otherwise) } function mbDriveReady(const sDrv: UTF8String): Boolean; {en Get the label of a file system volume @param(sDrv String specifying the root directory of a file system volume) @param(bVolReal @true if it a real file system volume) @returns(The function returns volume label) } function mbGetVolumeLabel(const sDrv: UTF8String; const bVolReal: Boolean): UTF8String; {en Set the label of a file system volume @param(sRootPathName String specifying the root directory of a file system volume) @param(sVolumeName String specifying a new name for the volume) @returns(The function returns @true if successful, @false otherwise) } function mbSetVolumeLabel(sRootPathName, sVolumeName: UTF8String): Boolean; {en Wait for change disk label @param(sDrv String specifying the root directory of a file system volume) @param(sCurLabel Current volume label) } procedure mbWaitLabelChange(const sDrv: UTF8String; const sCurLabel: UTF8String); {en Close CD/DVD drive @param(sDrv String specifying the root directory of a drive) } procedure mbCloseCD(const sDrv: UTF8String); {en Get remote file name by local file name @param(sLocalName String specifying the local file name) @returns(The function returns remote file name) } function mbGetRemoteFileName(const sLocalName: UTF8String): UTF8String; {en Retrieves the short path form of the specified path @param(sLongPath The path string) @param(sShortPath A string to receive the short form of the path that sLongPath specifies) @returns(The function returns @true if successful, @false otherwise) } function mbGetShortPathName(const sLongPath: UTF8String; out sShortPath: AnsiString): Boolean; {en Retrieves owner of the file (user and group). Both user and group contain computer name. @param(sPath Absolute path to the file. May be UNC path.) @param(sUser Returns user name of the file.) @param(sGroup Returns primary group of the file.) } function GetFileOwner(const sPath: String; out sUser, sGroup: String): Boolean; {en Retrieves a description of file's type. @param(sPath Absolute path to the file.) } function GetFileDescription(const sPath: String): String; {en Retrieves file system name of the volume that sRootPath points to. @param(sRootPath Root directory of the volume, for example C:\) } function mbGetFileSystem(const sRootPath: String): String; {en Retrieves the actual number of bytes of disk storage used to store a specified file. @param(FileName The name of the file.) } function mbGetCompressedFileSize(const FileName: UTF8String): Int64; {en This routine returns @true if the caller's process is a member of the Administrators local group. @returns(The function returns @true if caller has Administrators local group, @false otherwise) } function IsUserAdmin: LongBool; {en Extract file attributes from find data record. Removes reparse point attribute if a reparse point tag is not a name surrogate. @param(FindData Find data record from FindFirstFile/FindNextFile function.) } function ExtractFileAttributes(const FindData: TWin32FindDataW): DWORD; procedure InitErrorMode; procedure FixCommandLineToUTF8; implementation uses ShellAPI, MMSystem, JwaWinNetWk, uShlObjAdditional; function GetMenuItemText(hMenu: HMENU; uItem: UINT; fByPosition: LongBool): WideString; var miiw: TMenuItemInfoW; wca: array[0..Pred(MAX_PATH)] of WideChar; begin Result:= EmptyStr; FillChar(miiw, SizeOf(TMenuItemInfoW), 0); with miiw do begin cbSize:= SizeOf(TMenuItemInfoW); fMask:= MIIM_FTYPE or MIIM_STRING; dwTypeData:= @wca[0]; cch:= MAX_PATH; end; if GetMenuItemInfoW(hMenu, uItem, fByPosition, @miiw) then begin Result:= miiw.dwTypeData; end; end; function GetMenuItemType(hMenu: HMENU; uItem: UINT; fByPosition: LongBool): UINT; var miiw: TMenuItemInfoW; begin Result:= 0; FillChar(miiw, SizeOf(TMenuItemInfoW), 0); with miiw do begin cbSize:= SizeOf(TMenuItemInfoW); fMask:= MIIM_FTYPE; end; if GetMenuItemInfoW(hMenu, uItem, fByPosition, @miiw) then begin Result:= miiw.fType; end; end; function InsertMenuItemEx(hMenu, SubMenu: HMENU; Caption: PWideChar; Position, ItemID, ItemType : UINT): boolean; var mi: TMenuItemInfoW; begin FillChar(mi, SizeOf(mi), 0); with mi do begin cbSize := SizeOf(mi); fMask := MIIM_STATE or MIIM_TYPE or MIIM_SUBMENU or MIIM_ID; fType := ItemType; fState := MFS_ENABLED; wID := ItemID; hSubMenu := SubMenu; dwItemData := 0; dwTypeData := Caption; cch := SizeOf(Caption); end; Result := InsertMenuItemW(hMenu, Position, True, mi); end; function DisplayName(const wsDrv: WideString): WideString; var SFI: TSHFileInfoW; begin FillChar(SFI, SizeOf(SFI), 0); SHGetFileInfoW(PWChar(wsDrv), 0, SFI, SizeOf(SFI), SHGFI_DISPLAYNAME); Result:= SFI.szDisplayName; if Pos('(', Result) <> 0 then SetLength(Result, Pos('(', Result) - 2); end; function ExtractVolumeGUID(const VolumeName: WideString): WideString; var I, J: LongInt; begin I:= Pos('{', VolumeName); J:= Pos('}', VolumeName); if (I = 0) or (J = 0) then Exit(EmptyStr); Result:= Copy(VolumeName, I, J - I + 1); end; function GetMountPointVolumeName(const Path: WideString): WideString; const MAX_VOLUME_NAME = 50; var wsPath: WideString; wsVolumeName: array[0..Pred(MAX_VOLUME_NAME)] of WideChar; begin FillByte(wsVolumeName, MAX_VOLUME_NAME, 0); wsPath:= IncludeTrailingPathDelimiter(Path); if not GetVolumeNameForVolumeMountPointW(PWideChar(wsPath), wsVolumeName, MAX_VOLUME_NAME) then Result:= EmptyStr else Result:= WideString(wsVolumeName); end; (* Drive ready *) function mbDriveReady(const sDrv: UTF8String): Boolean; var NotUsed: DWORD; wsDrv: WideString; begin wsDrv:= UTF8Decode(sDrv); Result:= GetVolumeInformationW(PWChar(wsDrv), nil, 0, nil, NotUsed, NotUsed, nil, 0); end; (* Disk label *) function mbGetVolumeLabel(const sDrv: UTF8String; const bVolReal: Boolean): UTF8String; var WinVer: Byte; DriveType, NotUsed: DWORD; Buf: array [0..MAX_PATH - 1] of WideChar; wsDrv, wsResult: WideString; begin Result:= ''; wsDrv:= UTF8Decode(sDrv); WinVer:= LOBYTE(LOWORD(GetVersion)); DriveType:= GetDriveTypeW(PWChar(wsDrv)); if (WinVer <= 4) and (DriveType <> DRIVE_REMOVABLE) or bVolReal then begin // Win9x, Me, NT <= 4.0 Buf[0]:= #0; GetVolumeInformationW(PWChar(wsDrv), Buf, DWORD(SizeOf(Buf)), nil, NotUsed, NotUsed, nil, 0); wsResult:= Buf; if bVolReal and (WinVer >= 5) and (Result <> '') and (DriveType <> DRIVE_REMOVABLE) then // Win2k, XP and higher wsResult:= DisplayName(wsDrv) else if (Result = '') and (not bVolReal) then wsResult:= ''; end else wsResult:= DisplayName(wsDrv); Result:= UTF8Encode(wsResult); end; (* Wait for change disk label *) function mbSetVolumeLabel(sRootPathName, sVolumeName: UTF8String): Boolean; var wsRootPathName, wsVolumeName: WideString; begin wsRootPathName:= UTF8Decode(sRootPathName); wsVolumeName:= UTF8Decode(sVolumeName); Result:= SetVolumeLabelW(PWChar(wsRootPathName), PWChar(wsVolumeName)); end; procedure mbWaitLabelChange(const sDrv: UTF8String; const sCurLabel: UTF8String); var st1, st2: UTF8String; begin if mbGetVolumeLabel(sDrv, True) = '' then Exit; st1:= TrimLeft(sCurLabel); st2:= st1; while st1 = st2 do st2:= mbGetVolumeLabel(sDrv, FALSE); end; {$IF FPC_FULLVERSION < 020600} type // mmsystem unit has incorrect definition MCI_OPEN_PARMS = packed record dwCallback: DWORD_PTR; wDeviceID: MCIDEVICEID; lpstrDeviceType: LPCTSTR; lpstrElementName: LPCTSTR; lpstrAlias: LPCTSTR; end; {$ENDIF} function mciSendCommand(IDDevice: MCIDEVICEID; uMsg: UINT; fdwCommand: DWORD; dwParam: DWORD_PTR): MCIERROR; stdcall; external 'winmm.dll' name 'mciSendCommandA'; (* Close CD/DVD *) procedure mbCloseCD(const sDrv: UTF8String); var OpenParms: MCI_OPEN_PARMS; begin FillChar(OpenParms, SizeOf(OpenParms), 0); OpenParms.lpstrDeviceType:= 'CDAudio'; OpenParms.lpstrElementName:= PAnsiChar(ExtractFileDrive(sDrv)); mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE or MCI_OPEN_ELEMENT, DWORD_PTR(@OpenParms)); mciSendCommand(OpenParms.wDeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); mciSendCommand(OpenParms.wDeviceID, MCI_CLOSE, MCI_OPEN_TYPE or MCI_OPEN_ELEMENT, DWORD_PTR(@OpenParms)); end; function mbGetRemoteFileName(const sLocalName: UTF8String): UTF8String; var wsLocalName: WideString; dwResult, lpBufferSize: DWORD; lpBuffer: PUniversalNameInfoW; begin Result:= sLocalName; wsLocalName:= UTF8Decode(sLocalName); lpBufferSize:= SizeOf(TUniversalNameInfoW); GetMem(lpBuffer, lpBufferSize); try dwResult:= WNetGetUniversalNameW(PWideChar(wsLocalName), UNIVERSAL_NAME_INFO_LEVEL, lpBuffer, lpBufferSize); if dwResult = ERROR_MORE_DATA then begin lpBuffer:= ReallocMem(lpBuffer, lpBufferSize); dwResult:= WNetGetUniversalNameW(PWideChar(wsLocalName), UNIVERSAL_NAME_INFO_LEVEL, lpBuffer, lpBufferSize); end; if dwResult = NO_ERROR then Result:= UTF8Encode(WideString(lpBuffer^.lpUniversalName)); finally FreeMem(lpBuffer); end; end; function mbGetShortPathName(const sLongPath: UTF8String; out sShortPath: AnsiString): Boolean; var wsLongPath, wsShortPath: WideString; cchBuffer: DWORD; begin Result:= False; wsLongPath:= UTF8Decode(sLongPath); cchBuffer:= GetShortPathNameW(PWideChar(wsLongPath), nil, 0); if cchBuffer = 0 then Exit; SetLength(wsShortPath, cchBuffer); cchBuffer:= GetShortPathNameW(PWideChar(wsLongPath), PWideChar(wsShortPath), cchBuffer); if cchBuffer <> 0 then begin sShortPath:= wsShortPath; Result:= True; end; end; function GetFileOwner(const sPath: String; out sUser, sGroup: String): Boolean; var wsMachineName: WideString; function SidToDisplayString(sid: PSID; sidType: SID_NAME_USE): String; var pName: PWideChar = nil; pDomain: PWideChar = nil; NameLen: DWORD = 0; DomainLen: DWORD = 0; begin // We're expecting insufficient buffer error here. if (LookupAccountSidW(PWideChar(wsMachineName), sid, nil, @NameLen, nil, @DomainLen, @SidType) = False) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then begin pName := Getmem(NameLen * SizeOf(WideChar)); pDomain := Getmem(DomainLen * SizeOf(WideChar)); if Assigned(pName) and Assigned(pDomain) and LookupAccountSidW(PWideChar(wsMachineName), sid, pName, @NameLen, pDomain, @DomainLen, @SidType) then begin if pDomain[0] <> #0 then Result := UTF8Encode(WideString(pDomain) + PathDelim + WideString(pName)) else Result := UTF8Encode(WideString(pName)); end else Result := EmptyStr; Freemem(pName); Freemem(pDomain); end else Result := EmptyStr; end; // From UNC name extracts computer name. function GetMachineName(wPathName: LPCWSTR): WideString; var lpMachineName, lpMachineNameNext: PWideChar; begin lpMachineName := PathFindNextComponentW(wPathName); if Assigned(lpMachineName) then begin lpMachineNameNext := PathFindNextComponentW(lpMachineName); if Assigned(lpMachineNameNext) then SetString(Result, lpMachineName, lpMachineNameNext - lpMachineName - 1) else Result := lpMachineName; end else Result := EmptyWideStr; end; var wszUNCPathName: array[0..32767] of WideChar; wsPathName: WideString; pSecurityDescriptor: PSECURITY_DESCRIPTOR = nil; pOwnerSid: PSID = nil; pUNI: PUniversalNameInfoW; bDefault: Boolean; dwBufferSize: DWORD = 0; dwSizeNeeded: DWORD = 0; begin Result := False; if Length(sPath) = 0 then Exit; try wsPathName := UTF8Decode(sPath); // Check if the path is to remote share and get remote machine name. if PathIsUNCW(PWideChar(wsPathName)) then begin // Path is in full UNC format. wsMachineName := GetMachineName(PWideChar(wsPathName)); end else begin // Check if local path is mapped to network share. dwBufferSize := SizeOf(wszUNCPathName); pUNI := PUniversalNameInfoW(@wszUNCPathName[0]); if WNetGetUniversalNameW(PWideChar(wsPathName), UNIVERSAL_NAME_INFO_LEVEL, pUNI, dwBufferSize) = NO_ERROR then begin wsMachineName := GetMachineName(pUNI^.lpUniversalName); end; // else not a network share, no network connection, etc. end; { Get security descriptor. } // We're expecting insufficient buffer error here. if (GetFileSecurityW(PWideChar(wsPathName), OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION, nil, 0, @dwSizeNeeded) <> False) or (GetLastError <> ERROR_INSUFFICIENT_BUFFER) or (dwSizeNeeded = 0) then begin Exit; end; pSecurityDescriptor := GetMem(dwSizeNeeded); if not Assigned(pSecurityDescriptor) then Exit; if not GetFileSecurityW(PWideChar(wsPathName), OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION, pSecurityDescriptor, dwSizeNeeded, @dwSizeNeeded) then begin Exit; end; { Get Owner and Group. } if GetSecurityDescriptorOwner(pSecurityDescriptor, pOwnerSid, @bDefault) then sUser := SidToDisplayString(pOwnerSid, SidTypeUser) else sUser := EmptyStr; if GetSecurityDescriptorGroup(pSecurityDescriptor, pOwnerSid, @bDefault) then sGroup := SidToDisplayString(pOwnerSid, SidTypeGroup) else sGroup := EmptyStr; Result := True; finally if Assigned(pSecurityDescriptor) then Freemem(pSecurityDescriptor); end; end; function GetFileDescription(const sPath: String): String; var SFI: TSHFileInfoW; begin FillChar(SFI, SizeOf(SFI), 0); if SHGetFileInfoW(PWideChar(UTF8Decode(sPath)), 0, SFI, SizeOf(SFI), SHGFI_TYPENAME) <> 0 then Result := UTF8Encode(WideString(SFI.szTypeName)) else Result := EmptyStr; end; function mbGetFileSystem(const sRootPath: String): String; var Buf: array [0..MAX_PATH] of WideChar; NotUsed: DWORD; begin // Available since Windows XP. if ((Win32MajorVersion > 5) or ((Win32MajorVersion = 5) and (Win32MinorVersion >= 1))) and GetVolumeInformationW(PWideChar(UTF8Decode(sRootPath)), nil, 0, nil, NotUsed, NotUsed, Buf, SizeOf(Buf)) then begin Result:= UTF8Encode(WideString(Buf)); end else Result := EmptyStr; end; function mbGetCompressedFileSize(const FileName: UTF8String): Int64; begin Int64Rec(Result).Lo:= GetCompressedFileSizeW(PWideChar(UTF8Decode(FileName)), @Int64Rec(Result).Hi); end; type TOKEN_ELEVATION_TYPE = ( TokenElevationTypeDefault:= 1, TokenElevationTypeFull, TokenElevationTypeLimited ); TOKEN_INFORMATION_CLASS = ( TokenUser:= 1, TokenGroups, TokenPrivileges, TokenOwner, TokenPrimaryGroup, TokenDefaultDacl, TokenSource, TokenType, TokenImpersonationLevel, TokenStatistics, TokenRestrictedSids, TokenSessionId, TokenGroupsAndPrivileges, TokenSessionReference, TokenSandBoxInert, TokenAuditPolicy, TokenOrigin, TokenElevationType, TokenLinkedToken, TokenElevation, TokenHasRestrictions, TokenAccessInformation, TokenVirtualizationAllowed, TokenVirtualizationEnabled, TokenIntegrityLevel, TokenUIAccess, TokenMandatoryPolicy, TokenLogonSid, TokenIsAppContainer, TokenCapabilities, TokenAppContainerSid, TokenAppContainerNumber, TokenUserClaimAttributes, TokenDeviceClaimAttributes, TokenRestrictedUserClaimAttributes, TokenRestrictedDeviceClaimAttributes, TokenDeviceGroups, TokenRestrictedDeviceGroups, TokenSecurityAttributes, TokenIsRestricted, MaxTokenInfoClass ); function GetTokenInformation(TokenHandle: HANDLE; TokenInformationClass: TOKEN_INFORMATION_CLASS; TokenInformation: Pointer; TokenInformationLength: DWORD; out ReturnLength: DWORD): BOOL; stdcall; external 'advapi32' name 'GetTokenInformation'; function IsUserAdmin: LongBool; var ReturnLength: DWORD; TokenHandle: HANDLE = INVALID_HANDLE_VALUE; TokenInformation: array [0..1023] of Byte; ElevationType: TOKEN_ELEVATION_TYPE absolute TokenInformation; begin Result:= OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, TokenHandle); if not Result then begin if GetLastError = ERROR_NO_TOKEN then Result:= OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, TokenHandle); end; if Result then begin Result:= GetTokenInformation( TokenHandle, TokenElevationType, @TokenInformation, SizeOf(TokenInformation), ReturnLength ); CloseHandle(TokenHandle); if Result then begin case ElevationType of TokenElevationTypeDefault: Result:= False; // The token does not have a linked token. (UAC disabled) TokenElevationTypeFull: Result:= True; // The token is an elevated token. (Administrator) TokenElevationTypeLimited: Result:= False; // The token is a limited token. (User) end; end; end; end; function ExtractFileAttributes(const FindData: TWin32FindDataW): DWORD; inline; begin // If a reparse point tag is not a name surrogate then remove reparse point attribute // Fixes bug: http://doublecmd.sourceforge.net/mantisbt/view.php?id=531 if (FindData.dwFileAttributes and FILE_ATTRIBUTE_REPARSE_POINT <> 0) and (FindData.dwReserved0 and $20000000 = 0) then Result:= FindData.dwFileAttributes - FILE_ATTRIBUTE_REPARSE_POINT else Result:= FindData.dwFileAttributes; end; procedure InitErrorMode; begin SetErrorMode(SEM_FAILCRITICALERRORS or SEM_NOOPENFILEERRORBOX); end; procedure FixCommandLineToUTF8; var I, nArgs: Integer; sTemp: UTF8String; szArgList: PPWideChar; pwcCommandLine: PWideChar; lpFileName: array[0..Pred(MaxSmallInt)] of WideChar; begin pwcCommandLine:= GetCommandLineW(); for I:= 0 to lstrlenW(pwcCommandLine) - 1 do begin if (pwcCommandLine[I] = PathDelim) and (pwcCommandLine[I + 1] = '"') then begin pwcCommandLine[I]:= '"'; pwcCommandLine[I + 1]:= #32; end; end; szArgList:= CommandLineToArgvW(pwcCommandLine, @nArgs); if Assigned(szArgList) then begin if (nArgs > argc) then begin SysReAllocMem(argv, nArgs * SizeOf(Pointer)); FillChar(argv[argc], (nArgs - argc) * Sizeof(Pointer), #0); argc:= nArgs; end; // Special case for ParamStr(0) I:= GetModuleFileNameW(0, lpFileName, MaxSmallInt); lpFileName[I]:= #0; // to be safe sTemp:= UTF8Encode(WideString(lpFileName)); SysReAllocMem(argv[0], Length(sTemp) + 1); StrPCopy(argv[0], sTemp); // Process all other parameters for I:= 1 to nArgs - 1 do begin sTemp:= UTF8Encode(WideString(szArgList[I])); SysReAllocMem(argv[I], Length(sTemp) + 1); StrPCopy(argv[I], sTemp); end; LocalFree(HLOCAL(szArgList)); end; end; end. doublecmd-0.5.8/src/platform/win/uexceptionhandlerfix.pas0000644000175000017500000001375011740433676022674 0ustar alexxalexx{ Replaces Free Pascal exception handler Fixes bug: http://doublecmd.sourceforge.net/mantisbt/view.php?id=50 Uses workaround from: http://bugs.freepascal.org/view.php?id=17280 http://bugs.freepascal.org/view.php?id=12974 } unit uExceptionHandlerFix; {$mode delphi} interface implementation uses Windows, SysUtils; type M128A = record Low : QWord; High : Int64; end; PContext = ^TContext; TContext = record P1Home : QWord; P2Home : QWord; P3Home : QWord; P4Home : QWord; P5Home : QWord; P6Home : QWord; ContextFlags : DWord; MxCsr : DWord; SegCs : word; SegDs : word; SegEs : word; SegFs : word; SegGs : word; SegSs : word; EFlags : DWord; Dr0 : QWord; Dr1 : QWord; Dr2 : QWord; Dr3 : QWord; Dr6 : QWord; Dr7 : QWord; Rax : QWord; Rcx : QWord; Rdx : QWord; Rbx : QWord; Rsp : QWord; Rbp : QWord; Rsi : QWord; Rdi : QWord; R8 : QWord; R9 : QWord; R10 : QWord; R11 : QWord; R12 : QWord; R13 : QWord; R14 : QWord; R15 : QWord; Rip : QWord; Header : array[0..1] of M128A; Legacy : array[0..7] of M128A; Xmm0 : M128A; Xmm1 : M128A; Xmm2 : M128A; Xmm3 : M128A; Xmm4 : M128A; Xmm5 : M128A; Xmm6 : M128A; Xmm7 : M128A; Xmm8 : M128A; Xmm9 : M128A; Xmm10 : M128A; Xmm11 : M128A; Xmm12 : M128A; Xmm13 : M128A; Xmm14 : M128A; Xmm15 : M128A; VectorRegister : array[0..25] of M128A; VectorControl : QWord; DebugControl : QWord; LastBranchToRip : QWord; LastBranchFromRip : QWord; LastExceptionToRip : QWord; LastExceptionFromRip : QWord; end; type PExceptionRecord = ^TExceptionRecord; TExceptionRecord = record ExceptionCode : DWord; ExceptionFlags : DWord; ExceptionRecord : PExceptionRecord; ExceptionAddress : Pointer; NumberParameters : DWord; ExceptionInformation : array[0..EXCEPTION_MAXIMUM_PARAMETERS-1] of Pointer; end; PExceptionPointers = ^TExceptionPointers; TExceptionPointers = packed record ExceptionRecord : PExceptionRecord; ContextRecord : PContext; end; type PVectoredExceptionNode = ^TVectoredExceptionNode; TVectoredExceptionNode = record m_pNextNode: PVectoredExceptionNode; m_pPreviousNode: PVectoredExceptionNode; m_Unknown: Pointer; m_pfnVectoredHandler: Pointer; end; function AddVectoredExceptionHandler(FirstHandler: ULONG; VectoredHandler: Pointer): Pointer; stdcall; external 'kernel32.dll' name 'AddVectoredExceptionHandler'; function RemoveVectoredExceptionHandler(VectoredHandlerHandle: Pointer): ULONG; stdcall; external 'kernel32.dll' name 'RemoveVectoredExceptionHandler'; function GetModuleHandleEx(dwFlags: DWORD; lpModuleName: Pointer; var hModule: THandle): BOOL; stdcall; external 'kernel32.dll' name 'GetModuleHandleExA'; function RtlEncodePointer(pfnVectoredHandler: Pointer): Pointer; stdcall; external 'ntdll' name 'RtlEncodePointer'; const GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT = 2; GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS = 4; // These entries are linked from FPC's RTL. // If the RTL changes, the entries should be changed accordingly. function syswin64_x86_64_exception_handler(excep : pointer) : Longint; external name 'SYSTEM_SYSWIN64_X86_64_EXCEPTION_HANDLER$PEXCEPTIONPOINTERS$$LONGINT'; var _fltused: int64 external name '_fltused'; // Test if the exception address resides in our program. function CheckOurModule(p: Pointer): boolean; var ModuleWithException: THandle; OurModule: THandle; Flags: DWORD; begin Result := False; { It's necessary to keep refcount intact. } Flags := GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS or GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT; with PExceptionPointers(p)^.ExceptionRecord^ do Result := GetModuleHandleEx(Flags, ExceptionAddress, ModuleWithException) and GetModuleHandleEx(Flags, @CheckOurModule, OurModule) and (ModuleWithException = OurModule); end; function ProcessException(p: Pointer): longint; stdcall; var _SS: PCardinal; Saved: TExceptionRecord; begin Result := EXCEPTION_CONTINUE_SEARCH; if CheckOurModule(p) then begin Saved := PExceptionPointers(p)^.ExceptionRecord^; with PExceptionPointers(p)^.ExceptionRecord^ do begin // Dirty hack - in system.pp, private variable _SS is just after public _fltused. This might change in the future. _SS := @_fltused; inc(PBYTE(_SS), sizeof(int64)); _SS^ := PExceptionPointers(p)^.ContextRecord^.SegSs; // Trying to unwind the stack in FPC's way - by walking the linked list of exception handers. Result := syswin64_x86_64_exception_handler(p); end; if Result <> 0 then begin // The FPC's unwind failed for some reason. // Restoring the Exception record, so the program's exception handlers can try to recover from the exception. PExceptionPointers(p)^.ExceptionRecord^ := Saved; // You can insert some kind of logging etc here. // ... end; end; end; var VectoredExceptionHandler: PVectoredExceptionNode = nil; procedure InstallExceptionHandler; var HandlerAddress: Pointer; Node: PVectoredExceptionNode; begin // Get Free Pascal exception handler encoded address HandlerAddress := RtlEncodePointer(@syswin64_x86_64_exception_handler); VectoredExceptionHandler := AddVectoredExceptionHandler(1, @ProcessException); // Find Free Pascal exception handler and remove it Node:= VectoredExceptionHandler^.m_pNextNode; repeat if (Node^.m_pfnVectoredHandler = HandlerAddress) then begin RemoveVectoredExceptionHandler(Node); Break; end; Node := Node^.m_pNextNode; until (Node = nil); end; procedure UninstallExceptionHandler; begin if Assigned(VectoredExceptionHandler) then begin RemoveVectoredExceptionHandler(VectoredExceptionHandler); VectoredExceptionHandler := nil; end; end; initialization InstallExceptionHandler; finalization UninstallExceptionHandler; end. doublecmd-0.5.8/src/platform/uicontheme.pas0000644000175000017500000003415711740433676020013 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Simple implementation of Icon Theme based on FreeDesktop.org specification (http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html) Copyright (C) 2009-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uIconTheme; {$mode objfpc}{$H+} interface uses SysUtils, Classes, StringHashList, DCClassesUtf8; type TIconType = (itFixed, itScalable, itThreshold); TIconDirInfo = record IconSize: Integer; //IconContext: String; // currently not used IconType: TIconType; IconMaxSize, IconMinSize, IconThreshold: Integer; FileListCache: array of TStringHashList; end; PIconDirInfo = ^TIconDirInfo; { TIconDirList } TIconDirList = class (TStringList) private function GetIconDir(Index: Integer): PIconDirInfo; public destructor Destroy; override; function Add(IconDirName: String; IconDirInfo: PIconDirInfo): Integer; reintroduce; property Items[Index: Integer]: PIconDirInfo read GetIconDir; end; { TIconTheme } TIconTheme = class private FTheme, FThemeName: String; FComment: UTF8String; FInherits: TStringList; FOwnsInheritsObject: Boolean; FDirectories: TIconDirList; FBaseDirList: array of String; //en> List of directories that have this theme's icons. FBaseDirListAtCreate: array of String; //en> Base dir list passed to Create function LoadIconDirInfo(const IniFile: TIniFileEx; const sIconDirName: String): PIconDirInfo; function FindIconHelper(aIconName: String; AIconSize: Integer): UTF8String; function LoadThemeWithInherited(AInherits: TStringList): Boolean; procedure LoadParentTheme(AThemeName: String); procedure CacheDirectoryFiles(SubDirIndex: Integer; BaseDirIndex: Integer); protected function LookupIcon(AIconName: String; AIconSize: Integer): UTF8String; public constructor Create(sThemeName: String; BaseDirList: array of String); destructor Destroy; override; function Load: Boolean; function FindIcon(AIconName: String; AIconSize: Integer): UTF8String; function DirectoryMatchesSize(SubDirIndex: Integer; AIconSize: Integer): Boolean; function DirectorySizeDistance(SubDirIndex: Integer; AIconSize: Integer): Integer; class function CutTrailingExtension(const AIconName: String): String; property ThemeName: String read FThemeName; property Directories: TIconDirList read FDirectories; end; implementation uses LCLProc, StrUtils, uDebug, uFindEx, DCOSUtils, DCStrUtils {$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)} , uUnixIconTheme {$ENDIF} ; const IconExtensionList: array[0..1] of String = ('png', 'xpm'); { TIconTheme } function LookupFallbackIcon (AIconName: String): UTF8String; begin (* for each directory in $(basename list) { for extension in ("png", "svg", "xpm") { if exists directory/iconname.extension return directory/iconname.extension } } *) Result := EmptyStr; end; function TIconTheme.DirectoryMatchesSize(SubDirIndex: Integer; AIconSize: Integer): Boolean; begin Result:= False; // read Type and Size data from subdir if SubDirIndex < 0 then Exit; with FDirectories.Items[SubDirIndex]^ do case IconType of itFixed: Result:= (IconSize = AIconSize); itScalable: Result:= (IconMinSize <= AIconSize) and (AIconSize <= IconMaxSize); itThreshold: Result:= ((IconSize - IconThreshold) <= AIconSize) and (AIconSize <= (IconSize + IconThreshold)); end; end; function TIconTheme.DirectorySizeDistance(SubDirIndex: Integer; AIconSize: Integer): Integer; begin Result:= 0; // read Type and Size data from subdir if SubDirIndex < 0 then Exit; with FDirectories.Items[SubDirIndex]^ do case IconType of itFixed: Result:= abs(IconSize - AIconSize); itScalable: begin if AIconSize < IconMinSize then Result:= IconMinSize - AIconSize; if AIconSize > IconMaxSize then Result:= AIconSize - IconMaxSize; end; itThreshold: begin if AIconSize < IconSize - IconThreshold then Result:= IconMinSize - AIconSize; if AIconSize > IconSize + IconThreshold then Result:= AIconSize - IconMaxSize; end; end; end; constructor TIconTheme.Create(sThemeName: String; BaseDirList: array of String); var I, J: Integer; sElement: String; begin FTheme:= sThemeName; FInherits:= nil; FOwnsInheritsObject:= False; FDirectories:= nil; J:= 0; SetLength(FBaseDirList, Length(BaseDirList)); SetLength(FBaseDirListAtCreate, Length(BaseDirList)); for I:= Low(BaseDirList) to High(BaseDirList) do begin sElement:= BaseDirList[I]; // use only directories that has this theme if mbDirectoryExists(sElement + PathDelim + FTheme) then begin FBaseDirList[J]:= sElement; Inc(J); end; FBaseDirListAtCreate[I] := sElement; // Remember full base dir list. end; SetLength(FBaseDirList, J); end; destructor TIconTheme.Destroy; var I: Integer; begin if FOwnsInheritsObject and Assigned(FInherits) then begin for I:= FInherits.Count - 1 downto 0 do begin if Assigned(FInherits.Objects[I]) then begin TIconTheme(FInherits.Objects[I]).Free; FInherits.Objects[I]:= nil; end; end; FreeThenNil(FInherits); end; FreeThenNil(FDirectories); inherited Destroy; end; function TIconTheme.Load: Boolean; begin Result := LoadThemeWithInherited(FInherits); {$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)} // add default theme if needed if Result and Assigned(FInherits) then LoadParentTheme(DEFAULT_THEME_NAME); {$ENDIF} end; function TIconTheme.LoadThemeWithInherited(AInherits: TStringList): Boolean; var I: Integer; sValue: String; sElement: String; sThemeName: String; IniFile: TIniFileEx = nil; IconDirInfo: PIconDirInfo = nil; begin Result:= False; for I:= Low(FBaseDirList) to High(FBaseDirList) do begin sElement:= FBaseDirList[I] + PathDelim + FTheme + PathDelim + 'index.theme'; if mbFileExists(sElement) then begin sThemeName:= sElement; Result:= True; Break; end; end; // theme not found if Result = False then begin DCDebug('Theme ', FTheme, ' not found.'); Exit; end; FDirectories:= TIconDirList.Create; // list of parent themes if Assigned(AInherits) then // if this theme is child FInherits:= AInherits else // new theme begin FInherits:= TStringList.Create; FOwnsInheritsObject:= True; end; // load theme from file IniFile:= TIniFileEx.Create(sThemeName, fmOpenRead); try FThemeName:= IniFile.ReadString('Icon Theme', 'Name', EmptyStr); FComment:= IniFile.ReadString('Icon Theme', 'Comment', EmptyStr); DCDebug('Loading icon theme ', FThemeName); // read theme directories sValue:= IniFile.ReadString('Icon Theme', 'Directories', EmptyStr); repeat sElement:= Copy2SymbDel(sValue, ','); IconDirInfo:= LoadIconDirInfo(IniFile, sElement); if Assigned(IconDirInfo) then FDirectories.Add(sElement, IconDirInfo); until sValue = EmptyStr; // read parent themes sValue:= IniFile.ReadString('Icon Theme', 'Inherits', EmptyStr); if sValue <> EmptyStr then repeat sElement:= Copy2SymbDel(sValue, ','); LoadParentTheme(sElement); until sValue = EmptyStr; finally FreeAndNil(IniFile); end; end; procedure TIconTheme.LoadParentTheme(AThemeName: String); var I: Integer; ATheme: TIconTheme; begin if FInherits.IndexOf(AThemeName) < 0 then begin ATheme:= TIconTheme.Create(AThemeName, FBaseDirListAtCreate); I:= FInherits.AddObject(AThemeName, ATheme); if not ATheme.LoadThemeWithInherited(FInherits) then begin ATheme.Free; FInherits.Delete(I); end; end; end; function TIconTheme.FindIcon(AIconName: String; AIconSize: Integer): UTF8String; begin Result:= FindIconHelper(AIconName, AIconSize); { if Result = EmptyStr then Result:= LookupFallbackIcon(AIconName); } end; function TIconTheme.LookupIcon(AIconName: String; AIconSize: Integer): UTF8String; var I, J, FoundIndex: Integer; MinimalSize, NewSize: Integer; procedure MakeResult; inline; begin Result:= FBaseDirList[J] + PathDelim + FTheme + PathDelim + FDirectories.Strings[I] + PathDelim + AIconName + '.' + IconExtensionList[PtrInt(FDirectories.Items[I]^.FileListCache[J].List[FoundIndex]^.Data)]; end; begin Result:= EmptyStr; if not Assigned(FDirectories) then Exit; { This is a slightly more optimized version of the original algorithm from freedesktop.org. } MinimalSize:= MaxInt; for J:= Low(FBaseDirList) to High(FBaseDirList) do begin for I:= 0 to FDirectories.Count - 1 do begin NewSize:= DirectorySizeDistance(I, AIconSize); if NewSize < MinimalSize then begin if not Assigned(FDirectories.Items[I]^.FileListCache[J]) then CacheDirectoryFiles(I, J); FoundIndex:= FDirectories.Items[I]^.FileListCache[J].Find(AIconName); if FoundIndex >= 0 then begin MakeResult; if NewSize = 0 then // exact match Exit else MinimalSize:= NewSize; end; end; end; end; end; function TIconTheme.LoadIconDirInfo(const IniFile: TIniFileEx; const sIconDirName: String): PIconDirInfo; var IconTypeStr: String; I: Integer; begin New(Result); with Result^ do begin IconSize:= IniFile.ReadInteger(sIconDirName, 'Size', 48); //IconContext:= IniFile.ReadString(sIconDirName, 'Context', EmptyStr); // currently not used IconTypeStr:= IniFile.ReadString(sIconDirName, 'Type', 'Threshold'); IconMaxSize:= IniFile.ReadInteger(sIconDirName, 'MaxSize', IconSize); IconMinSize:= IniFile.ReadInteger(sIconDirName, 'MinSize', IconSize); IconThreshold:= IniFile.ReadInteger(sIconDirName, 'Threshold', 2); if SameText(IconTypeStr, 'Fixed') then IconType:= itFixed else if SameText(IconTypeStr, 'Scalable') then IconType:= itScalable else if SameText(IconTypeStr, 'Threshold') then IconType:= itThreshold else begin Dispose(Result); DCDebug('Theme directory "%s" has unsupported icon type "%s"', [sIconDirName, IconTypeStr]); Exit(nil); end; SetLength(FileListCache, Length(FBaseDirList)); for I:= 0 to Length(FBaseDirList) - 1 do FileListCache[I]:= nil; end; end; function TIconTheme.FindIconHelper(aIconName: String; AIconSize: Integer): UTF8String; var I: Integer; begin Result:= LookupIcon(AIconName, AIconSize); if Result <> EmptyStr then Exit; if Assigned(FInherits) then begin // find in parent themes for I:= 0 to FInherits.Count - 1 do begin Result:= TIconTheme(FInherits.Objects[I]).LookupIcon(aIconName, AIconSize); if Result <> EmptyStr then Exit; end; end; Result:= EmptyStr; end; procedure TIconTheme.CacheDirectoryFiles(SubDirIndex: Integer; BaseDirIndex: Integer); var SearchDir, FoundName, FoundExt: String; SearchRec: TSearchRecEx; DirList: TStringHashList; I: Integer; begin DirList:= TStringHashList.Create(True); FDirectories.Items[SubDirIndex]^.FileListCache[BaseDirIndex]:= DirList; SearchDir := FBaseDirList[BaseDirIndex] + PathDelim + FTheme + PathDelim + FDirectories.Strings[SubDirIndex]; if FindFirstEx(SearchDir + PathDelim + '*', 0, SearchRec) = 0 then repeat if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then begin FoundExt := ExtractFileExt(SearchRec.Name); if Length(FoundExt) > 0 then begin FoundName := Copy(SearchRec.Name, 1, Length(SearchRec.Name) - Length(FoundExt)); Delete(FoundExt, 1, 1); // remove the dot // Add only files with supported extensions. for I:= Low(IconExtensionList) to High(IconExtensionList) do if IconExtensionList[I] = FoundExt then begin DirList.Add(FoundName, Pointer(PtrInt(I))); break; end; end; end; until FindNextEx(SearchRec) <> 0; FindCloseEx(SearchRec); end; class function TIconTheme.CutTrailingExtension(const AIconName: String): String; var I: Integer; begin for I:= Low(IconExtensionList) to High(IconExtensionList) do if StrEnds(AIconName, '.' + IconExtensionList[I]) then Exit(Copy(AIconName, 1, Length(AIconName) - Length(IconExtensionList[I]) - 1)); Result := AIconName; end; { TIconDirList } function TIconDirList.Add(IconDirName: String; IconDirInfo: PIconDirInfo): Integer; begin Result:= AddObject(IconDirName, TObject(IconDirInfo)); end; function TIconDirList.GetIconDir(Index: Integer): PIconDirInfo; begin Result:= PIconDirInfo(Objects[Index]); end; destructor TIconDirList.Destroy; var I, J: Integer; IconDirInfo: PIconDirInfo; begin for I:= Count - 1 downto 0 do begin if Assigned(Objects[I]) then begin IconDirInfo:= PIconDirInfo(Objects[I]); for J := 0 to Length(IconDirInfo^.FileListCache) - 1 do IconDirInfo^.FileListCache[J].Free; Dispose(IconDirInfo); end; end; inherited Destroy; end; end. doublecmd-0.5.8/src/platform/unix/0000755000175000017500000000000012257501472016111 5ustar alexxalexxdoublecmd-0.5.8/src/platform/unix/inotify.pp0000644000175000017500000001042511740433676020143 0ustar alexxalexxunit inotify; interface uses SysCall, UnixType; {$IFDEF FPC} {$PACKRECORDS C} {$ENDIF} type uint32_t = cuint32; {en Structure describing an inotify event. } inotify_event = record wd: cint32; //en< Watch descriptor. mask: uint32_t; //en< Watch mask. cookie: uint32_t; //en< Cookie to synchronize two events. len: uint32_t; //en< Length (including NULs) of name. name: record end; //en< Stub for possible name (doesn't add to event size). end; {en Pointer to structure describing an inotify event. } pinotify_event = ^inotify_event; const { Supported events suitable for MASK parameter of INOTIFY_ADD_WATCH. } IN_ACCESS = $00000001; {en< File was accessed. } IN_MODIFY = $00000002; {en< File was modified. } IN_ATTRIB = $00000004; {en< Metadata changed. } IN_CLOSE_WRITE = $00000008; {en< Writtable file was closed. } IN_CLOSE_NOWRITE = $00000010; {en< Unwrittable file closed. } IN_CLOSE = IN_CLOSE_WRITE or IN_CLOSE_NOWRITE; {en< Close. } IN_OPEN = $00000020; {en< File was opened. } IN_MOVED_FROM = $00000040; {en< File was moved from X. } IN_MOVED_TO = $00000080; {en< File was moved to Y. } IN_MOVE = IN_MOVED_FROM or IN_MOVED_TO; {en< Moves. } IN_CREATE = $00000100; {en< Subfile was created. } IN_DELETE = $00000200; {en< Subfile was deleted. } IN_DELETE_SELF = $00000400; {en< Self was deleted. } IN_MOVE_SELF = $00000800; {en< Self was moved. } { Events sent by the kernel. } IN_UNMOUNT = $00002000; {en< Backing fs was unmounted. } IN_Q_OVERFLOW = $00004000; {en< Event queued overflowed. } IN_IGNORED = $00008000; {en< File was ignored. } { Helper events. } // IN_CLOSE = (IN_CLOSE_WRITE or IN_CLOSE_NOWRITE); {en< Close.} // IN_MOVE = (IN_MOVED_FROM or IN_MOVED_TO); {en< Moves.} { Special flags. } IN_ONLYDIR = $01000000; {en< Only watch the path if it is a directory. } IN_DONT_FOLLOW = $02000000; {en< Do not follow a sym link. } IN_MASK_ADD = $20000000; {en< Add to the mask of an already existing watch. } IN_ISDIR = $40000000; {en< Event occurred against dir. } IN_ONESHOT = $80000000; {en< Only send event once. } {en All events which a program can wait on. } IN_ALL_EVENTS = ((((((((((IN_ACCESS or IN_MODIFY) or IN_ATTRIB) or IN_CLOSE_WRITE) or IN_CLOSE_NOWRITE) or IN_OPEN) or IN_MOVED_FROM) or IN_MOVED_TO) or IN_CREATE) or IN_DELETE) or IN_DELETE_SELF) or IN_MOVE_SELF; {en Create and initialize inotify instance. } function inotify_init: LongInt; {en Add watch of object NAME to inotify instance FD. Notify about events specified by MASK. } function inotify_add_watch(__fd: LongInt; __name: PChar; __mask: uint32_t): LongInt; {en Remove the watch specified by WD from the inotify instance FD. } function inotify_rm_watch(__fd: LongInt; __wd: uint32_t): LongInt; implementation uses SysUtils, BaseUnix, StrUtils; var IsGoodKernelVersion: Boolean = False; function CheckKernelVersion: Boolean; var KernelName: TUtsName; sRelease: String; I, iVersion, iRelease, iPatch: Integer; begin fpUname(KernelName); sRelease:= KernelName.Release; iVersion:= StrToIntDef(Copy2SymbDel(sRelease, '.'), 0); iRelease:= StrToIntDef(Copy2SymbDel(sRelease, '.'), 0); I := 1; while I <= Length(sRelease) do begin if not (sRelease[I] in ['0'..'9']) then Break; I := I + 1; end; iPatch:= StrToIntDef(LeftStr(sRelease, I-1), 0); Result:= (iVersion > 2) or ((iVersion = 2) and (iRelease >= 6) and (iPatch >= 13)); end; function inotify_init: LongInt; begin inotify_init := -1; if IsGoodKernelVersion then inotify_init := do_syscall(syscall_nr_inotify_init); end; function inotify_add_watch(__fd: LongInt; __name: PChar; __mask: uint32_t): LongInt; begin inotify_add_watch := -1; if IsGoodKernelVersion then inotify_add_watch := do_syscall(syscall_nr_inotify_add_watch, TSysParam(__fd), TSysParam(__name), TSysParam(__mask)); end; function inotify_rm_watch(__fd: LongInt; __wd: uint32_t): LongInt; begin inotify_rm_watch := -1; if IsGoodKernelVersion then inotify_rm_watch := do_syscall(syscall_nr_inotify_rm_watch, TSysParam(__fd), TSysParam(__wd)); end; initialization IsGoodKernelVersion:= CheckKernelVersion; end. doublecmd-0.5.8/src/platform/unix/ukeyfile.pas0000755000175000017500000001111112054077342020430 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Simple key file parser Copyright (C) 2012 Alexander Koblov (alexx2000@mail.ru) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uKeyFile; {$mode objfpc}{$H+} interface uses Classes, SysUtils, GetText, DCBasicTypes, DCClassesUtf8; const { Constants for handling freedesktop.org Desktop files } DESKTOP_GROUP = 'Desktop Entry'; DESKTOP_KEY_CATEGORIES = 'Categories'; DESKTOP_KEY_COMMENT = 'Comment'; DESKTOP_KEY_EXEC = 'Exec'; DESKTOP_KEY_ICON = 'Icon'; DESKTOP_KEY_NAME = 'Name'; DESKTOP_KEY_NO_DISPLAY = 'NoDisplay'; DESKTOP_KEY_TERMINAL = 'Terminal'; type { TKeyFile } TKeyFile = class(TIniFileEx) public constructor Create(const AFileName: String; Mode: Word); override; function ReadBool(const Section, Ident: String; Default: Boolean): Boolean; override; procedure WriteBool(const Section, Ident: String; Value: Boolean); override; function ReadString(const Section, Ident, Default: String): String; override; function ReadLocaleString(const Section, Ident, Default: String): String; virtual; end; implementation uses DCStrUtils; var LocaleKeyList: TDynamicStringArray; procedure InitializeLocaleKeyList; var FLang, FFallbackLang: String; EncodingIndex, ModifierIndex: Integer; begin GetLanguageIDs(FLang, FFallbackLang); EncodingIndex:= Pos('.', FLang); ModifierIndex:= Pos('@', FLang); // Strip encoding part if EncodingIndex > 0 then begin if ModifierIndex = 0 then FLang:= Copy(FLang, 1, EncodingIndex - 1) else Delete(FLang, EncodingIndex, ModifierIndex - EncodingIndex); end; // Fill possible keys in order of matching AddString(LocaleKeyList, FLang); if FLang <> FFallbackLang then begin if (ModifierIndex > 0) and (Pos('_', FLang) > 0) then begin AddString(LocaleKeyList, Copy(FLang, 1, ModifierIndex - 1)); AddString(LocaleKeyList, FFallbackLang + Copy(FLang, ModifierIndex, MaxInt)); end; AddString(LocaleKeyList, FFallbackLang); end; end; function EscapeSequences(const S: UTF8String): UTF8String; var C: AnsiChar; R, P: PAnsiChar; begin P:= PAnsiChar(S); C:= P^; SetLength(Result, Length(S)); R:= PAnsiChar(Result); repeat Inc(P); if C = '\' then begin case P^ of #00: Exit; 't': C:= #09; 'n': C:= #10; 'r': C:= #13; 's': C:= #32; '\': begin R^:= C; Inc(P); C:= P^; end; end; end else begin R^:= C; C:= P^; Inc(R); end; until P^ = #00; end; { TKeyFile } constructor TKeyFile.Create(const AFileName: String; Mode: Word); begin inherited Create(AFileName, Mode); CaseSensitive:= True; end; function TKeyFile.ReadBool(const Section, Ident: String; Default: Boolean): Boolean; var S: String; begin Result := Default; S := inherited ReadString(Section, Ident, EmptyStr); if Length(S) > 0 then Result := (S[1] in ['1', 't']); end; procedure TKeyFile.WriteBool(const Section, Ident: String; Value: Boolean); var S: String; begin if Value then S := 'true' else S := 'false'; inherited WriteString(Section, Ident, S); end; function TKeyFile.ReadString(const Section, Ident, Default: String): String; begin Result:= inherited ReadString(Section, Ident, Default); if Length(Result) > 0 then Result := EscapeSequences(Result); end; function TKeyFile.ReadLocaleString(const Section, Ident, Default: String): String; const LocaleString: String = '%s[%s]'; var I: Integer; begin for I:= Low(LocaleKeyList) to High(LocaleKeyList) do begin Result:= ReadString(Section, Format(LocaleString, [Ident, LocaleKeyList[I]]), EmptyStr); if Length(Result) > 0 then Exit; end; Result:= ReadString(Section, Ident, Default); end; initialization InitializeLocaleKeyList; end. doublecmd-0.5.8/src/platform/unix/udcreadsvg.pas0000644000175000017500000001614612041015637020747 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Scalable Vector Graphics reader implementation (via rsvg and cairo) Copyright (C) 2012 Alexander Koblov (alexx2000@mail.ru) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uDCReadSVG; {$mode delphi} interface uses Classes, SysUtils, Graphics, FPImage; type { TDCReaderSVG } TDCReaderSVG = class (TFPCustomImageReader) private FRsvgHandle: Pointer; protected function InternalCheck (Stream:TStream):boolean;override; procedure InternalRead(Stream:TStream;Img:TFPCustomImage);override; end; { TScalableVectorGraphics } TScalableVectorGraphics = class(TFPImageBitmap) protected class function GetReaderClass: TFPCustomImageReaderClass; override; class function GetSharedImageClass: TSharedRasterImageClass; override; public class function GetFileExtensions: string; override; end; implementation uses DynLibs, IntfGraphics, GraphType, CTypes; type cairo_format_t = ( CAIRO_FORMAT_ARGB32, CAIRO_FORMAT_RGB24, CAIRO_FORMAT_A8, CAIRO_FORMAT_A1 ); type Pcairo_surface_t = Pointer; Pcairo_t = Pointer; PRsvgHandle = Pointer; PGError = Pointer; type PRsvgDimensionData = ^TRsvgDimensionData; TRsvgDimensionData = record width: cint; height: cint; em: cdouble; ex: cdouble; end; var cairo_image_surface_create: function(format: cairo_format_t; width, height: LongInt): Pcairo_surface_t; cdecl; cairo_surface_destroy: procedure(surface: Pcairo_surface_t); cdecl; cairo_image_surface_get_data: function(surface: Pcairo_surface_t): PByte; cdecl; cairo_create: function(target: Pcairo_surface_t): Pcairo_t; cdecl; cairo_destroy: procedure (cr: Pcairo_t); cdecl; rsvg_handle_new_from_data: function(data: PByte; data_len: SizeUInt; var error: PGError): PRsvgHandle; cdecl; rsvg_handle_get_dimensions: procedure(handle: PRsvgHandle; dimension_data: PRsvgDimensionData); cdecl; rsvg_handle_render_cairo: function(handle: PRsvgHandle; cr: Pcairo_t): LongBool; cdecl; g_type_init: procedure; cdecl; g_object_unref: procedure(anObject: Pointer); cdecl; type PBGRA = ^TBGRA; TBGRA = packed record Blue, Green, Red, Alpha: Byte; end; { TDCReaderSVG } function TDCReaderSVG.InternalCheck(Stream: TStream): boolean; var GError: PGError = nil; MemoryStream: TMemoryStream; begin MemoryStream:= Stream as TMemoryStream; FRsvgHandle:= rsvg_handle_new_from_data(MemoryStream.Memory, MemoryStream.Size, GError); Result:= Assigned(FRsvgHandle); end; procedure TDCReaderSVG.InternalRead(Stream: TStream; Img: TFPCustomImage); var X, Y: Integer; Cairo: Pcairo_t; ImageData: PBGRA; PixelColor: TFPColor; Desc: TRawImageDescription; CairoSurface: Pcairo_surface_t; RsvgDimensionData: TRsvgDimensionData; begin try // Get the SVG's size rsvg_handle_get_dimensions(FRsvgHandle, @RsvgDimensionData); // Creates an image surface of the specified format and dimensions CairoSurface:= cairo_image_surface_create(CAIRO_FORMAT_ARGB32, RsvgDimensionData.width, RsvgDimensionData.height); Cairo:= cairo_create(CairoSurface); // Draws a SVG to a Cairo surface if rsvg_handle_render_cairo(FRsvgHandle, Cairo) then begin // Get a pointer to the data of the image surface, for direct access ImageData:= PBGRA(cairo_image_surface_get_data(CairoSurface)); // Set output image size Img.SetSize(RsvgDimensionData.width, RsvgDimensionData.height); // Initialize image description Desc.Init_BPP32_B8G8R8A8_BIO_TTB(RsvgDimensionData.width, RsvgDimensionData.height); TLazIntfImage(Img).DataDescription:= Desc; // Read image data for Y:= 0 to Img.Height - 1 do for X:= 0 to Img.Width - 1 do with ImageData^ do begin PixelColor.alpha:= Alpha + Alpha shl 8; PixelColor.red:= Red + Red shl 8; PixelColor.green:= Green + Green shl 8; PixelColor.blue:= Blue + Blue shl 8; Img.Colors[X, Y]:= PixelColor; Inc(ImageData); end; end; finally g_object_unref(FRsvgHandle); cairo_destroy(Cairo); cairo_surface_destroy(CairoSurface); end; end; { TScalableVectorGraphics } class function TScalableVectorGraphics.GetReaderClass: TFPCustomImageReaderClass; begin Result:= TDCReaderSVG; end; class function TScalableVectorGraphics.GetSharedImageClass: TSharedRasterImageClass; begin Result:= TSharedBitmap; end; class function TScalableVectorGraphics.GetFileExtensions: string; begin Result:= 'svg;svgz'; end; const cairolib = 'libcairo.so.2'; rsvglib = 'librsvg-2.so.2'; gobjectlib = 'libgobject-2.0.so.0'; var libcairo, librsvg, libgobject: TLibHandle; function SafeGetProcAddress(Lib : TlibHandle; const ProcName : AnsiString) : Pointer; begin Result:= GetProcedureAddress(Lib, ProcName); if (Result = nil) then raise Exception.Create(EmptyStr); end; procedure Initialize; begin libcairo:= LoadLibrary(cairolib); librsvg:= LoadLibrary(rsvglib); libgobject:= LoadLibrary(gobjectlib); if (libcairo <> NilHandle) and (librsvg <> NilHandle) and (libgobject <> NilHandle) then try @cairo_image_surface_create:= SafeGetProcAddress(libcairo, 'cairo_image_surface_create'); @cairo_surface_destroy:= SafeGetProcAddress(libcairo, 'cairo_surface_destroy'); @cairo_image_surface_get_data:= SafeGetProcAddress(libcairo, 'cairo_image_surface_get_data'); @cairo_create:= SafeGetProcAddress(libcairo, 'cairo_create'); @cairo_destroy:= SafeGetProcAddress(libcairo, 'cairo_destroy'); @rsvg_handle_new_from_data:= SafeGetProcAddress(librsvg, 'rsvg_handle_new_from_data'); @rsvg_handle_get_dimensions:= SafeGetProcAddress(librsvg, 'rsvg_handle_get_dimensions'); @rsvg_handle_render_cairo:= SafeGetProcAddress(librsvg, 'rsvg_handle_render_cairo'); @g_type_init:= SafeGetProcAddress(libgobject, 'g_type_init'); @g_object_unref:= SafeGetProcAddress(libgobject, 'g_object_unref'); g_type_init(); // Register image handler and format ImageHandlers.RegisterImageReader ('Scalable Vector Graphics', 'SVG;SVGZ', TDCReaderSVG); TPicture.RegisterFileFormat('svg;svgz', 'Scalable Vector Graphics', TScalableVectorGraphics); except end; end; procedure Finalize; begin if (libcairo <> NilHandle) then FreeLibrary(libcairo); if (librsvg <> NilHandle) then FreeLibrary(librsvg); if (libgobject <> NilHandle) then FreeLibrary(libgobject); end; initialization Initialize; finalization Finalize; end. doublecmd-0.5.8/src/platform/unix/uhal.pas0000644000175000017500000002403111740433676017555 0ustar alexxalexxunit uHal; {$mode objfpc}{$H+} interface uses Classes, SysUtils, libhal, dbus; // create all Hal object function CreateHal: Boolean; // procedure where we get message add or remove procedure LibHalDeviceAdded(ctx: PLibHalContext; const udi: PChar);cdecl; procedure LibHalDeviceRemoved(ctx: PLibHalContext; const udi: PChar);cdecl; procedure LibHalDeviceNewCapability(ctx: PLibHalContext; const udi: PChar; const capability: PChar);cdecl; procedure LibHalDeviceLostCapability(ctx: PLibHalContext; const udi: PChar; const capability: PChar);cdecl; procedure LibHalDevicePropertyModified(ctx: PLibHalContext; const udi: PChar; const key: PChar; is_removed, is_added: dbus_bool_t);cdecl; procedure LibHalDeviceCondition(ctx: PLibHalContext; const udi: PChar; const condition_name: PChar; const condition_delta: PChar); cdecl; // dispach message and function CheckHalMsg: Boolean; // create all Hal object procedure FreeHal; function IsHal: Boolean; implementation uses LCLProc; var DcDbus : PDBusConnection = nil; DBusConnectionOpen : Boolean = False; DcHalCtx : PLibHalContext = nil; HalConnectionOpen : Boolean = False; DeviceWasChanged : Boolean = False; DeviceList : TStringList = nil; procedure PrintError(const sMessage: String; pError: PDBusError); begin if Assigned(pError) and (dbus_error_is_set(pError) <> 0) then DCDebug(sMessage + ': ' + pError^.name + ' ' + pError^.message) else DCDebug(sMessage); end; procedure CheckBlockDev(ctx: PLibHalContext; const udi: PChar; const CreateArray: boolean = False); var cap : PChar; s : string; DcDbusError : DBusError; IsBlockDevice, HasMountPoint: Boolean; begin { possible value what we can get (you can see that volume.label it will be mount point) for more key see "hal-device | less" volume.label = 'ATTID' (string) volume.mount_point = '/media/ATTID' (string) volume.is_mounted = true (bool) volume.is_mounted_read_only = false (bool) volume.linux.is_device_mapper = false (bool) volume.is_disc = false (bool) block.device = '/dev/sdc1' (string) volume.is_partition = true (bool) block.major = 8 (0x8) (int) volume.partition.number = 1 (0x1) (int) block.minor = 33 (0x21) (int) volume.block_size = 512 (0x200) (int) block.is_volume = true (bool) } // exit if bad udi if udi = nil then exit; // exit if not block dev dbus_error_init(@DcDbusError); IsBlockDevice := libhal_device_property_exists(ctx, udi, PChar('block.device'), @DcDbusError) <> 0; if dbus_error_is_set(@DcDbusError) <> 0 then begin PrintError('Cannot get block.device property for ' + udi, @DcDbusError); dbus_error_free(@DcDbusError); Exit; end; if not IsBlockDevice then Exit; // it is our dev if not CreateArray then begin DeviceWasChanged := True; end; s := StringReplace(StrPas(udi), '/org/freedesktop/Hal/devices/', '', [rfIgnoreCase]); // add to array DeviceList.Add(udi); // get dev name cap := libhal_device_get_property_string(ctx, udi, Pchar('block.device'), nil); s := s + ' is ' + cap; libhal_free_string(cap); // get mount point dbus_error_init(@DcDbusError); HasMountPoint := libhal_device_property_exists(ctx, udi, PChar('volume.mount_point'), @DcDbusError) <> 0; if dbus_error_is_set(@DcDbusError) <> 0 then begin PrintError('Cannot get volume.mount_point property for ' + udi, @DcDbusError); dbus_error_free(@DcDbusError); Exit; end; if HasMountPoint then begin cap := libhal_device_get_property_string(ctx, udi, Pchar('volume.mount_point'), nil); s := s + ' with mount point ' + cap; libhal_free_string(cap); end; //DCDebug(s); end; function CreateBlokDevArr: Boolean; var halDevices : PPChar = nil; numDevices,i : Integer; udi : PChar; DcDbusError : DBusError; begin Result:= False; // nil DeviceList; DeviceList.Clear; // Get List of all dev dbus_error_init(@DcDbusError); halDevices := libhal_get_all_devices(DcHalCtx, @numDevices, @DcDbusError); if (not Assigned(halDevices)) or (dbus_error_is_set(@DcDbusError) <> 0) then begin PrintError('Cannot get device list', @DcDbusError); dbus_error_free(@DcDbusError); Exit; end; //DCDebug('Number of devices: ' + IntToStr(numDevices)); // show info for all dev for i := 0 to numDevices - 1 do begin udi := (halDevices + i)^; CheckBlockDev(DcHalCtx, udi, True); end; // free mem libhal_free_string_array(halDevices); Result:= True; end; function CreateHal: Boolean; var DcDbusError : DBusError; begin Result := False; DCDebug('Initializing HAL'); // create new HAL DcHalCtx := libhal_ctx_new; if DcHalCtx = nil then begin DCDebug('Cannot create HAL context'); Exit; end; // new connection with D-Bus dbus_error_init(@DcDbusError); DcDbus := dbus_bus_get_private(DBUS_BUS_SYSTEM, @DcDbusError); if (not Assigned(DcDbus)) or (dbus_error_is_set(@DcDbusError) <> 0) then begin PrintError('Cannot get DBUS connection', @DcDbusError); FreeHal; dbus_error_free(@DcDbusError); Exit; end; DBusConnectionOpen := True; // Disable exiting the application when it is disconnected from DBUS. dbus_connection_set_exit_on_disconnect(DcDbus, 0); // Set dbus connection for the HAL context. if libhal_ctx_set_dbus_connection(DcHalCtx, DcDbus) = 0 then begin DCDebug('Cannot set DBUS connection for HAL context'); FreeHal; Exit; end; // init HAL dbus_error_init(@DcDbusError); if (libhal_ctx_init(DcHalCtx, @DcDbusError) = 0) or (dbus_error_is_set(@DcDbusError) <> 0) then begin PrintError('Cannot initialize HAL', @DcDbusError); FreeHal; dbus_error_free(@DcDbusError); Exit; end; HalConnectionOpen := True; if libhal_ctx_set_device_added(DcHalCtx, @LibHalDeviceAdded) = 0 then DCDebug('Cannot register LibHalDeviceAdded'); if libhal_ctx_set_device_removed(DcHalCtx, @LibHalDeviceRemoved) = 0 then DCDebug('Cannot register LibHalDeviceRemoved'); if libhal_ctx_set_device_new_capability(DcHalCtx, @LibHalDeviceNewCapability) = 0 then DCDebug('Cannot register LibHalDeviceNewCapability'); if libhal_ctx_set_device_lost_capability(DcHalCtx, @LibHalDeviceLostCapability) = 0 then DCDebug('Cannot register LibHalDeviceLostCapability'); if libhal_ctx_set_device_property_modified(DcHalCtx, @LibHalDevicePropertyModified) = 0 then DCDebug('Cannot register LibHalDevicePropertyModified'); if libhal_ctx_set_device_condition(DcHalCtx, @LibHalDeviceCondition) = 0 then DCDebug('Cannot register LibHalDeviceCondition'); // Watch all properties. dbus_error_init(@DcDbusError); if (libhal_device_property_watch_all(DcHalCtx, @DcDbusError) = 0) or (dbus_error_is_set(@DcDbusError) <> 0) then begin PrintError('Cannot watch all properties', @DcDbusError); FreeHal; dbus_error_free(@DcDbusError); Exit; end; DeviceList := TStringList.Create; if not CreateBlokDevArr then begin FreeHal; Exit; end; DCDebug('HAL initialized OK'); Result := True; end; procedure LibHalDeviceAdded(ctx: PLibHalContext; const udi: PChar); cdecl; begin DCDebug('HAL: new device added: ',udi); // sleep(1500); // if we dont do it we don`t see new dev CheckBlockDev(ctx,udi); // it return value 2 time on one flash like /dev/sda /dev/sda1 end; procedure LibHalDeviceRemoved(ctx: PLibHalContext; const udi: PChar); cdecl; begin // here we will when somebody remove flash or CD or may be other // when it will CD it will one time // when it will be flash it will 7 time or more // here we can know only UDI // UDI here don`t have mount point and dev name // DCDebug('remove dev ', udi); if DeviceList.IndexOf(udi) > -1 then begin DeviceWasChanged := True; DeviceList.Delete(DeviceList.IndexOf(udi)); //CreateBlokDevArr; or we can re create DeviceList end; DCDebug('HAL: Device was removed: ', udi); end; procedure LibHalDeviceNewCapability(ctx: PLibHalContext; const udi: PChar; const capability: PChar);cdecl; begin WriteLn('LibHalDeviceNewCapability'); DeviceWasChanged := True; end; procedure LibHalDeviceLostCapability(ctx: PLibHalContext; const udi: PChar; const capability: PChar);cdecl; begin WriteLn('LibHalDeviceLostCapability'); DeviceWasChanged := True; end; procedure LibHalDevicePropertyModified(ctx: PLibHalContext; const udi: PChar; const key: PChar; is_removed, is_added: dbus_bool_t);cdecl; begin WriteLn('LibHalDevicePropertyModified'); DeviceWasChanged := True; end; procedure LibHalDeviceCondition(ctx: PLibHalContext; const udi: PChar; const condition_name: PChar; const condition_delta: PChar); cdecl; begin WriteLn('LibHalDeviceCondition'); DeviceWasChanged := True; end; function CheckHalMsg: Boolean; begin if IsHal and DBusConnectionOpen then begin // for one disk i must dispatch ~9 msg try do it 3 times if dbus_connection_read_write_dispatch(DcDbus, 1) = 0 then DBusConnectionOpen := False else if dbus_connection_read_write_dispatch(DcDbus, 1) = 0 then DBusConnectionOpen := False else if dbus_connection_read_write_dispatch(DcDbus, 1) = 0 then DBusConnectionOpen := False; Result := DeviceWasChanged; DeviceWasChanged := False; end else Result := False; end; procedure FreeHal; begin if Assigned(DcHalCtx) then begin if HalConnectionOpen then begin DCDebug('Shutting down HAL'); libhal_ctx_shutdown(DcHalCtx, nil); HalConnectionOpen := False; end; libhal_ctx_free(DcHalCtx); DcHalCtx := nil; end; if Assigned(DcDbus) then begin if DBusConnectionOpen then begin DCDebug('Closing DBUS connection'); dbus_connection_close(DcDbus); DBusConnectionOpen := False; end; dbus_connection_unref(DcDbus); DcDbus := nil; end; FreeThenNil(DeviceList); end; function IsHal: Boolean; begin Result := Assigned(DcHalCtx) and Assigned(DcDbus); end; initialization CreateHal; finalization FreeHal; end. doublecmd-0.5.8/src/platform/unix/uusersgroups.pas0000644000175000017500000000644411740433676021422 0ustar alexxalexx{ File name: uUsersGroups.pas Date: 2003/07/03 Author: Martin Matusu Copyright (C) 2003 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License in a file called COPYING along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. } {mate} unit uUsersGroups; {$mode objfpc}{$H+} interface uses Classes, uMyUnix; const groupInfo = '/etc/group'; userInfo = '/etc/passwd'; function uidToStr(uid: Cardinal): String; function gidToStr(gid: Cardinal): String; function strToUID(uname: AnsiString): Cardinal; function strToGID(gname: AnsiString): Cardinal; procedure getUsrGroups(uid: Cardinal; List: TStrings); procedure getUsers(List: TStrings); procedure getGroups(List: TStrings); implementation uses SysUtils; function uidToStr(uid: Cardinal): String; var uinfo: PPasswordRecord; begin uinfo:= getpwuid(uid); if (uinfo = nil) then Result:= '' else Result:= String(uinfo^.pw_name); end; function gidToStr(gid: Cardinal): String; var ginfo: PGroupRecord; begin ginfo:= getgrgid(gid); if (ginfo = nil) then Result:= '' else Result:= String(ginfo^.gr_name); end; procedure getUsrGroups(uid: Cardinal; List: TStrings); var groups: TStrings; iC,iD: integer; sT: string; begin // parse groups records groups:= TStringlist.Create; try List.Clear; groups.LoadFromFile(groupInfo); for ic:= 0 to (groups.Count - 1) do begin st:= groups.Strings[ic]; //get one record to parse id:= Pos(UIDtoStr(uid), st); //get position of uname if ((id<>0) or (uid=0)) then begin st:= Copy(st, 1, Pos(':',st) - 1); List.Append(st); end; // if end; // for finally FreeAndNil(groups); end; end; procedure getGroups(List: TStrings); begin getUsrGroups(0, List); end; procedure GetUsers(List: TStrings); var Users: TStrings; iC: integer; sT: string; begin users:= TStringList.Create; try users.LoadFromFile(userInfo); List.Clear; for ic:= 0 to (users.Count - 1) do begin st:= users.Strings[ic]; //get one record (line) st:= copy(st, 1, Pos(':',st) - 1); //extract username List.Append(st); //append to the list end; finally FreeAndNil(users); end; end; function strToUID(uname: AnsiString): Cardinal; //Converts username to UID ('root' results to 0) var uinfo: PPasswordRecord; begin uinfo:= getpwnam(PChar(uname)); if (uinfo = nil) then Result:= High(Cardinal) else Result:= uinfo^.pw_uid; end; function strToGID(gname: AnsiString): Cardinal; var ginfo: PGroupRecord; begin ginfo:= getgrnam(PChar(gname)); if (ginfo = nil) then Result:= High(Cardinal) else Result:= ginfo^.gr_gid; end; {/mate} end. doublecmd-0.5.8/src/platform/unix/ujpegthumb.pas0000644000175000017500000000533612123526020020763 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Fast JPEG thumbnail provider Copyright (C) 2013 Alexander Koblov (alexx2000@mail.ru) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uJpegThumb; {$mode objfpc}{$H+} interface implementation uses Classes, SysUtils, Types, Graphics, FPReadJPEG, IntfGraphics, GraphType, DCClassesUtf8, uReSample, uThumbnails; function GetThumbnail(const aFileName: UTF8String; aSize: TSize): Graphics.TBitmap; var Bitmap: TBitmap; RawImage: TRawImage; FileStream: TFileStreamEx; FPReaderJPEG: TFPReaderJPEG; LazIntfImage: TLazIntfImage; begin Result:= nil; if TJPEGImage.IsFileExtensionSupported(ExtractFileExt(aFileName)) then begin Result:= TBitmap.Create; FPReaderJPEG:= TFPReaderJPEG.Create; FPReaderJPEG.MinWidth:= aSize.cx; FPReaderJPEG.MinHeight:= aSize.cy; try FileStream:= TFileStreamEx.Create(aFileName, fmOpenRead or fmShareDenyNone); LazIntfImage:= TLazIntfImage.Create(aSize.cx, aSize.cy, [riqfRGB]); try FPReaderJPEG.ImageRead(FileStream, LazIntfImage); LazIntfImage.GetRawImage(RawImage, True); if not ((LazIntfImage.Width > aSize.cx) or (LazIntfImage.Height > aSize.cy)) then Result.LoadFromRawImage(RawImage, True) else begin Bitmap:= TBitmap.Create; try Bitmap.LoadFromRawImage(RawImage, True); aSize:= TThumbnailManager.GetPreviewScaleSize(Bitmap.Width, Bitmap.Height); Result.SetSize(aSize.cx, aSize.cy); Stretch(Bitmap, Result, ResampleFilters[2].Filter, ResampleFilters[2].Width); finally Bitmap.Free; end; end; finally FPReaderJPEG.Free; LazIntfImage.Free; FileStream.Free; end; except FreeAndNil(Result); end; end; end; initialization TThumbnailManager.RegisterProvider(@GetThumbnail); end. doublecmd-0.5.8/src/platform/unix/umimeactions.pas0000644000175000017500000003567412213115233021316 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Handles actions associated with MIME types in .desktop files. Based on FreeDesktop.org specifications (http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html) (http://www.freedesktop.org/wiki/Specifications/mime-actions-spec) Copyright (C) 2009-2010 Przemyslaw Nagay (cobines@gmail.com) Copyright (C) 2011-2013 Alexander Koblov (alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uMimeActions; {$mode objfpc}{$H+} interface uses Classes, SysUtils, // for AnsiString version of StrPas function glib2; type PDesktopFileEntry = ^TDesktopFileEntry; TDesktopFileEntry = record DesktopFilePath: String; MimeType: String; DisplayName: String; Comment: String; ExecWithParams: String; // with %F, %U etc. Exec: String; // % params resolved IconName: String; Categories: String; Terminal: Boolean; Hidden: Boolean; end; {en Needs absolute file names. Returns a list of PDesktopFileEntry. } function GetDesktopEntries(FileNames: TStringList): TList; {en Needs absolute file names. Returns a default application command line. } function GetDefaultAppCmd(FileNames: TStringList): UTF8String; {en Get file MIME type. Returns a file MIME type. } function GetFileMimeType(const FileName: UTF8String): UTF8String; {en Get desktop entry by desktop file name. } function GetDesktopEntry(const FileName: UTF8String): PDesktopFileEntry; {en Adds a new action for given mimetype. @param(MimeType File mime type) @param(DesktopEntry Desktop file name or user command) @param(DefaultAction Set as default action for this mime type) @returns(The function returns @true if successful, @false otherwise) } function AddDesktopEntry(const MimeType, DesktopEntry: UTF8String; DefaultAction: Boolean): Boolean; function TranslateAppExecToCmdLine(const entry: PDesktopFileEntry; const fileList: TStringList): String; implementation uses DCClassesUtf8, DCStrUtils, uDCUtils, uIconTheme, uClipboard, DCOSUtils, uOSUtils, uKeyFile; const libmime = 'libmime'; procedure mime_type_init; cdecl; external libmime; procedure mime_type_finalize; cdecl; external libmime; procedure mime_type_add_action(mimeType, DesktopFileId: PChar; CustomDesktop: PPChar); cdecl; external libmime; function mime_type_get_by_filename(filename: PChar; stat: Pointer) : PChar; cdecl; external libmime; function mime_type_get_by_file(filepath: PChar; stat: Pointer; basename: PChar): PChar; cdecl; external libmime; function mime_type_get_actions(mimeType: PChar): PPChar; cdecl; external libmime; function mime_type_locate_desktop_file(DirectoryToCheck: PChar; DesktopFileId: PChar): PChar; cdecl; external libmime; function TranslateAppExecToCmdLine(const entry: PDesktopFileEntry; const fileList: TStringList): String; var StartPos: Integer = 1; CurPos: Integer = 1; i: Integer; filesAdded: Boolean = False; begin // The .desktop standard does not recommend using % parameters inside quotes // in the Exec entry (the behaviour is undefined), so all those parameters // can be quoted using any method. Result := ''; while CurPos <= Length(entry^.ExecWithParams) do begin if entry^.ExecWithParams[CurPos] = '%' then begin Result := Result + Copy(entry^.ExecWithParams, StartPos, CurPos - StartPos); Inc(CurPos); if CurPos <= Length(entry^.ExecWithParams) then case entry^.ExecWithParams[CurPos] of 'U': begin for i := 0 to fileList.Count - 1 do begin if i <> 0 then Result := Result + ' '; Result := Result + QuoteStr(fileScheme + '//' + URIEncode(fileList[i])); end; filesAdded := True; end; 'u': if fileList.Count > 0 then begin Result := Result + QuoteStr(fileScheme + '//' + URIEncode(fileList[0])); filesAdded := True; end; 'F': begin for i := 0 to fileList.Count - 1 do begin if i <> 0 then Result := Result + ' '; Result := Result + QuoteStr(fileList[i]); end; filesAdded := True; end; 'f': if fileList.Count > 0 then begin Result := Result + QuoteStr(fileList[0]); filesAdded := True; end; 'N': // deprecated begin for i := 0 to fileList.Count - 1 do begin if i <> 0 then Result := Result + ' '; Result := Result + QuoteStr(fileList[i]); end; filesAdded := True; end; 'n': // deprecated if fileList.Count > 0 then begin Result := Result + QuoteStr(fileList[0]); filesAdded := True; end; 'D': // deprecated begin for i := 0 to fileList.Count - 1 do begin if i <> 0 then Result := Result + ' '; Result := Result + QuoteStr(ExtractFilePath(fileList[i])); end; filesAdded := True; end; 'd': // deprecated if fileList.Count > 0 then begin Result := Result + QuoteStr(ExtractFilePath(fileList[0])); filesAdded := True; end; 'i': if entry^.IconName <> '' then Result := Result + '--icon ' + QuoteStr(entry^.IconName); 'c': Result := Result + QuoteStr(entry^.DisplayName); 'k': Result := Result + QuoteStr(entry^.DesktopFilePath); '%': Result := Result + '%'; end; Inc(CurPos); StartPos := CurPos; end else Inc(CurPos); end; if (StartPos <> CurPos) then Result := Result + Copy(entry^.ExecWithParams, StartPos, CurPos - StartPos); if not filesAdded then begin for i := 0 to fileList.Count - 1 do Result := Result + ' ' + QuoteStr(fileList[i]); end; end; procedure ReadMimeAppsList(const mimeType: String; out Added, Removed: TStringList); const mimeApps1 = '/.local/share/applications/mimeapps.list'; mimeApps2 = '/usr/share/applications/mimeapps.list'; var I: LongInt; sTemp: String; mimeApps: TIniFileEx = nil; mimeAppsList: array[1..2] of String = (mimeApps1, mimeApps2); function ParseActions(const Actions: String; var ActionList: TStringList): Boolean; var startIndex, finishIndex: LongInt; action: String; desktopFile: PChar = nil; begin startIndex:= 1; for finishIndex:= 1 to Length(Actions) do if (Actions[finishIndex] = ';') then begin action:= Copy(Actions, startIndex, finishIndex - startIndex); desktopFile := mime_type_locate_desktop_file(nil, PChar(action)); if (desktopFile <> nil) then begin if (ActionList.IndexOf(action) < 0) then ActionList.Add(action); g_free(desktopFile); end; startIndex:= finishIndex + 1; end; end; begin Added:= TStringList.Create; Removed:= TStringList.Create; mimeAppsList[1]:= GetHomeDir + mimeAppsList[1]; for I:= Low(mimeAppsList) to High(mimeAppsList) do if (mbFileExists(mimeAppsList[I])) then try mimeApps:= TIniFileEx.Create(mimeAppsList[I], fmOpenRead or fmShareDenyNone); try sTemp:= mimeApps.ReadString('Added Associations', mimeType, EmptyStr); if (Length(sTemp) <> 0) then ParseActions(sTemp, Added); sTemp:= mimeApps.ReadString('Removed Associations', mimeType, EmptyStr); if (Length(sTemp) <> 0) then ParseActions(sTemp, Removed); finally FreeAndNil(mimeApps); end; except // Continue end; end; function GetDesktopEntries(FileNames: TStringList): TList; var mimeType: PChar; actions: PPChar; desktopFile: PChar; i: Integer; Entry: PDesktopFileEntry; Added, Removed: TStringList; procedure AddAction(action: PChar); begin desktopFile := mime_type_locate_desktop_file(nil, action); if Assigned(desktopFile) then begin Entry := GetDesktopEntry(desktopFile); if Assigned(Entry) then begin Entry^.MimeType := StrPas(mimeType); // Set Exec as last because it uses other fields of Entry. Entry^.Exec := TranslateAppExecToCmdLine(Entry, Filenames); Result.Add(Entry); end; g_free(desktopFile); end; end; begin if FileNames.Count = 0 then Exit(nil); Result := TList.Create; // This string should not be freed. mimeType := mime_type_get_by_file(PChar(FileNames[0]), nil, nil); // Retrieve *.desktop identificators actions := mime_type_get_actions(mimeType); // Read actions from mimeapps.list ReadMimeAppsList(mimeType, Added, Removed); // Add actions from mimeapps.list for i := 0 to Added.Count - 1 do AddAction(PChar(Added[i])); // If find any actions for this mime if actions <> nil then begin i := 0; while (actions[i] <> nil) and (actions[i] <> '') do begin // Don't add actions where already in mimeapps.list if (Added.IndexOf(actions[i]) < 0) and (Removed.IndexOf(actions[i]) < 0) then AddAction(actions[i]); i := i + 1; end; end; // Free resources FreeAndNil(Added); FreeAndNil(Removed); if (actions <> nil) then g_strfreev(actions); end; function GetDefaultAppCmd(FileNames: TStringList): UTF8String; var i: Integer = 0; mimeType: PChar = nil; action: PChar = nil; actions: PPChar = nil; desktopFile: PChar; Entry: PDesktopFileEntry; Added, Removed: TStringList; begin Result:= EmptyStr; if FileNames.Count = 0 then Exit; // This string should not be freed. mimeType := mime_type_get_by_file(PChar(FileNames[0]), nil, nil); // Read actions from mimeapps.list ReadMimeAppsList(mimeType, Added, Removed); if (Added.Count > 0) then begin // First action is default action:= PChar(Added[0]); end else begin // Retrieve *.desktop identificators actions := mime_type_get_actions(mimeType); // If find any actions for this mime if (actions <> nil) then repeat action := actions[i]; inc(i); until ((action <> nil) or (action <> EmptyStr)) and (Removed.IndexOf(action) < 0); end; if (action <> nil) then begin desktopFile := mime_type_locate_desktop_file(nil, action); if Assigned(desktopFile) then begin Entry := GetDesktopEntry(desktopFile); if Assigned(Entry) then begin Entry^.MimeType := StrPas(mimeType); // Set Exec as last because it uses other fields of Entry. Result := TranslateAppExecToCmdLine(Entry, Filenames); Dispose(Entry); end; g_free(desktopFile); end; end; // Free resources FreeAndNil(Added); FreeAndNil(Removed); if (actions <> nil) then g_strfreev(actions) end; function GetFileMimeType(const FileName: UTF8String): UTF8String; var mimeType: PChar; begin // This string should not be freed. mimeType := mime_type_get_by_file(PChar(FileName), nil, nil); Result:= StrPas(mimeType); end; function GetDesktopEntry(const FileName: UTF8String): PDesktopFileEntry; var DesktopEntryFile: TKeyFile; begin try DesktopEntryFile:= TKeyFile.Create(FileName, fmOpenRead); if not DesktopEntryFile.SectionExists(DESKTOP_GROUP) then begin DesktopEntryFile.Free; Exit(nil); end; try New(Result); with Result^, DesktopEntryFile do begin DesktopFilePath := FileName; DisplayName := ReadLocaleString(DESKTOP_GROUP, DESKTOP_KEY_NAME, EmptyStr); Comment := ReadLocaleString(DESKTOP_GROUP, DESKTOP_KEY_COMMENT, EmptyStr); ExecWithParams := ReadString(DESKTOP_GROUP, DESKTOP_KEY_EXEC, EmptyStr); IconName := ReadString(DESKTOP_GROUP, DESKTOP_KEY_ICON, EmptyStr); Categories := ReadString(DESKTOP_GROUP, DESKTOP_KEY_CATEGORIES, EmptyStr); Terminal := ReadBool(DESKTOP_GROUP, DESKTOP_KEY_TERMINAL, False); Hidden := ReadBool(DESKTOP_GROUP, DESKTOP_KEY_NO_DISPLAY, False); { Some icon names in .desktop files are specified with an extension, even though it is not allowed by the standard unless an absolute path to the icon is supplied. We delete this extension here. } if GetPathType(IconName) = ptNone then IconName := TIconTheme.CutTrailingExtension(IconName); end; finally DesktopEntryFile.Free; end; except Result:= nil; end; end; function AddDesktopEntry(const MimeType, DesktopEntry: UTF8String; DefaultAction: Boolean): Boolean; var CustomFile: UTF8String; DesktopFile: TIniFileEx; MimeTypeValue: UTF8String; CustomDesktop: PAnsiChar = nil; MimeApps: UTF8String = '/.local/share/applications/mimeapps.list'; begin Result:= True; CustomFile:= DesktopEntry; if (DefaultAction = False) or (StrEnds(DesktopEntry, '.desktop') = False) then begin // Create new desktop entry file for user command mime_type_add_action(PAnsiChar(MimeType), PAnsiChar(DesktopEntry), @CustomDesktop); Result:= Assigned(CustomDesktop); if Result then begin CustomFile:= StrPas(CustomDesktop); g_free(CustomDesktop); end; end; // Set as default action if needed if DefaultAction and Result then begin CustomFile:= CustomFile + ';'; MimeApps:= GetHomeDir + MimeApps; try DesktopFile:= TIniFileEx.Create(MimeApps, fmOpenReadWrite); try // Read current actions of this mime type MimeTypeValue:= DesktopFile.ReadString('Added Associations', MimeType, EmptyStr); // Remove chosen action if it exists MimeTypeValue:= StringReplace(MimeTypeValue, CustomFile, EmptyStr, [rfReplaceAll]); // Set chosen action as default DesktopFile.WriteString('Added Associations', MimeType, CustomFile + MimeTypeValue); finally DesktopFile.Free; end; except Result:= False; end; end; end; initialization mime_type_init; finalization mime_type_finalize(); end. doublecmd-0.5.8/src/platform/unix/uoverlayscrollbarfix.pas0000644000175000017500000000037111740433676023106 0ustar alexxalexxunit uOverlayScrollBarFix; {$mode objfpc}{$H+} interface implementation function setenv(const name, value: pchar; overwrite: longint): longint; cdecl; external 'c' name 'setenv'; initialization setenv('LIBOVERLAY_SCROLLBAR', '0', 1); end.doublecmd-0.5.8/src/platform/unix/umagickwand.pas0000755000175000017500000001667212123562274021126 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- ImageMagick thumbnail provider Copyright (C) 2013 Alexander Koblov (alexx2000@mail.ru) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uMagickWand; {$mode delphi} interface implementation uses LCLIntf, Classes, SysUtils, GraphType, DynLibs, FileUtil, Types, Graphics, CTypes, uThumbnails, uDebug, uClassesEx; const MagickFalse = 0; MagickTrue = 1; const libMagickWand = 'libMagickWand.so.%d'; type PMagickWand = Pointer; MagickBooleanType = culong; ExceptionType = Word; PExceptionType = ^ExceptionType; type TRawAccess = class(TPortableNetworkGraphic) end; {$PACKENUM 4} type FilterTypes = ( UndefinedFilter, PointFilter, BoxFilter, TriangleFilter, HermiteFilter, HanningFilter, HammingFilter, BlackmanFilter, GaussianFilter, QuadraticFilter, CubicFilter, CatromFilter, MitchellFilter, LanczosFilter, BesselFilter, SincFilter ); var MagickWand: TLibHandle; var MagickWandGenesis: procedure(); cdecl; MagickWandTerminus: procedure(); cdecl; NewMagickWand: function(): PMagickWand; cdecl; DestroyMagickWand: function(wand: PMagickWand): PMagickWand; cdecl; MagickGetException: function(wand: PMagickWand; severity: PExceptionType): PAnsiChar; cdecl; MagickRelinquishMemory: function(resource: Pointer): Pointer; cdecl; MagickReadImage: function(wand: PMagickWand; const filename: PAnsiChar): MagickBooleanType; cdecl; MagickGetImageWidth: function(wand: PMagickWand): culong; cdecl; MagickGetImageHeight: function(wand: PMagickWand): culong; cdecl; MagickResizeImage: function(wand: PMagickWand; const columns, rows: culong; const filter: FilterTypes; const blur: double): MagickBooleanType; cdecl; MagickSetImageFormat: function(wand: PMagickWand; const format: PAnsiChar): MagickBooleanType; cdecl; MagickGetImageBlob: function(wand: PMagickWand; length: Pcsize_t): PByte; cdecl; procedure BitmapAssign(Bitmap: TBitmap; Image: TPortableNetworkGraphic); var RawImage: PRawImage; begin RawImage:= TRawAccess(Image).GetRawImagePtr; // Simply change raw image owner without data copy Bitmap.LoadFromRawImage(RawImage^, True); // Set image data pointer to nil, so it will not free double RawImage^.ReleaseData; end; procedure RaiseWandException(Wand: PMagickWand); var Description: PAnsiChar; Severity: ExceptionType; ExceptionMessage: AnsiString; begin Description:= MagickGetException(Wand, @Severity); ExceptionMessage:= AnsiString(Description); Description:= MagickRelinquishMemory(Description); Raise Exception.Create(ExceptionMessage); end; function GetThumbnail(const aFileName: UTF8String; aSize: TSize): Graphics.TBitmap; var Memory: PByte; Wand: PMagickWand; MemorySize: csize_t; Width, Height: culong; BlobStream: TBlobStream; Status: MagickBooleanType; Bitmap: TPortableNetworkGraphic; begin Result:= nil; if GetGraphicClassForFileExtension(ExtractFileExt(aFileName)) <> nil then begin // DCDebug('GetThumbnail start: ' + IntToStr(GetTickCount)); MagickWandGenesis; Wand:= NewMagickWand; try Status:= MagickReadImage(Wand, PAnsiChar(UTF8ToSys(aFileName))); try if (Status = MagickFalse) then RaiseWandException(Wand); // Get image width and height Width:= MagickGetImageWidth(Wand); Height:= MagickGetImageHeight(Wand); if (Width > aSize.cx) or (Height > aSize.cy) then begin // Calculate aspect width and height of thumb aSize:= TThumbnailManager.GetPreviewScaleSize(Width, Height); // Create image thumbnail Status:= MagickResizeImage(Wand, aSize.cx, aSize.cy, LanczosFilter, 1.0); if (Status = MagickFalse) then RaiseWandException(Wand); end; Status:= MagickSetImageFormat(Wand, 'PNG'); if (Status = MagickFalse) then RaiseWandException(Wand); Memory:= MagickGetImageBlob(Wand, @MemorySize); if Assigned(Memory) then try BlobStream:= TBlobStream.Create(Memory, MemorySize); Bitmap:= TPortableNetworkGraphic.Create; try Bitmap.LoadFromStream(BlobStream); Result:= Graphics.TBitmap.Create; BitmapAssign(Result, Bitmap); except FreeAndNil(Result); end; Bitmap.Free; BlobStream.Free; finally MagickRelinquishMemory(Memory); end; except on E: Exception do DCDebug('ImageMagick: ' + E.Message); end; finally Wand:= DestroyMagickWand(Wand); MagickWandTerminus; // DCDebug('GetThumbnail finish: ' + IntToStr(GetTickCount)); end; end; end; function SafeGetProcAddress(Lib : TlibHandle; const ProcName : AnsiString) : Pointer; begin Result:= GetProcedureAddress(Lib, ProcName); if (Result = nil) then raise Exception.Create(EmptyStr); end; procedure Initialize; var Version: Integer; LibraryName: AnsiString = 'libMagickWand-6.Q16.so.1'; begin MagickWand:= LoadLibrary(LibraryName); if (MagickWand = NilHandle) then for Version:= 7 downto 3 do begin LibraryName:= Format(libMagickWand, [Version]); MagickWand:= LoadLibrary(LibraryName); if (MagickWand <> NilHandle) then Break; end; if (MagickWand <> NilHandle) then try @MagickWandGenesis:= SafeGetProcAddress(MagickWand, 'MagickWandGenesis'); @MagickWandTerminus:= SafeGetProcAddress(MagickWand, 'MagickWandTerminus'); @NewMagickWand:= SafeGetProcAddress(MagickWand, 'NewMagickWand'); @DestroyMagickWand:= SafeGetProcAddress(MagickWand, 'DestroyMagickWand'); @MagickGetException:= SafeGetProcAddress(MagickWand, 'MagickGetException'); @MagickRelinquishMemory:= SafeGetProcAddress(MagickWand, 'MagickRelinquishMemory'); @MagickReadImage:= SafeGetProcAddress(MagickWand, 'MagickReadImage'); @MagickGetImageWidth:= SafeGetProcAddress(MagickWand, 'MagickGetImageWidth'); @MagickGetImageHeight:= SafeGetProcAddress(MagickWand, 'MagickGetImageHeight'); @MagickResizeImage:= SafeGetProcAddress(MagickWand, 'MagickResizeImage'); @MagickSetImageFormat:= SafeGetProcAddress(MagickWand, 'MagickSetImageFormat'); @MagickGetImageBlob:= SafeGetProcAddress(MagickWand, 'MagickGetImageBlob'); // Register thumbnail provider TThumbnailManager.RegisterProvider(@GetThumbnail); DCDebug('ImageMagick: ' + LibraryName); except end; end; procedure Finalize; begin if (MagickWand <> NilHandle) then FreeLibrary(MagickWand); end; initialization Initialize; finalization Finalize; end. doublecmd-0.5.8/src/platform/unix/ushellcontextmenu.pas0000644000175000017500000004543112223753207022411 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Shell context menu implementation. Copyright (C) 2006-2013 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uShellContextMenu; {$mode delphi}{$H+} interface uses Classes, SysUtils, Controls, Menus, uFile, uDrive; type { EContextMenuException } EContextMenuException = class(Exception); { TShellContextMenu } TShellContextMenu = class(TPopupMenu) private FFiles: TFiles; FDrive: TDrive; procedure ContextMenuSelect(Sender: TObject); procedure TemplateContextMenuSelect(Sender: TObject); procedure DriveMountSelect(Sender: TObject); procedure DriveUnmountSelect(Sender: TObject); procedure DriveEjectSelect(Sender: TObject); procedure OpenWithOtherSelect(Sender: TObject); procedure OpenWithMenuItemSelect(Sender: TObject); function FillOpenWithSubMenu: Boolean; public constructor Create(Owner: TWinControl; ADrive: PDrive); reintroduce; overload; constructor Create(Owner: TWinControl; var Files : TFiles; Background: Boolean); reintroduce; overload; destructor Destroy; override; end; implementation uses LCLProc, Dialogs, IniFiles, Graphics, uFindEx, uDCUtils, uOSUtils, uFileProcs, uShellExecute, uLng, uGlobs, uPixMapManager, uMyUnix, fMain, fFileProperties, DCOSUtils, DCStrUtils {$IF DEFINED(DARWIN)} , MacOSAll {$ELSEIF DEFINED(LINUX)} , uMimeActions, fOpenWith {$ENDIF} ; const sCmdVerbProperties = 'properties'; function GetGnomeTemplateMenu(out Items: TStringList): Boolean; var userDirs: TStringList = nil; templateDir: UTF8String; searchRec: TSearchRecEx; begin Result:= False; try Items:= nil; templateDir:= GetHomeDir + '/.config/user-dirs.dirs'; if not mbFileExists(templateDir) then Exit; userDirs:= TStringList.Create; userDirs.LoadFromFile(templateDir); templateDir:= userDirs.Values['XDG_TEMPLATES_DIR']; if Length(templateDir) = 0 then Exit; templateDir:= IncludeTrailingPathDelimiter(mbExpandFileName(TrimQuotes(templateDir))); if mbDirectoryExists(templateDir) then begin if FindFirstEx(templateDir, faAnyFile, searchRec) = 0 then begin Items:= TStringList.Create; repeat // Skip directories if FPS_ISDIR(searchRec.Attr) then Continue; Items.Add(ExtractOnlyFileName(searchRec.Name) + '=' + templateDir + searchRec.Name); until FindNextEx(searchRec) <> 0; Result:= Items.Count > 0; end; FindCloseEx(searchRec); end; finally if Assigned(Items) and (Items.Count = 0) then FreeAndNil(Items); FreeThenNil(userDirs); end; end; function GetKdeTemplateMenu(out Items: TStringList): Boolean; var I: Integer; desktopFile: TIniFile = nil; templateDir: array [0..1] of UTF8String; searchRec: TSearchRecEx; templateName, templatePath: UTF8String; begin Result:= False; try Items:= nil; templateDir[0]:= '/usr/share/templates'; templateDir[1]:= GetHomeDir + '/.kde/share/templates'; for I:= Low(templateDir) to High(templateDir) do if mbDirectoryExists(templateDir[I]) then begin if FindFirstEx(templateDir[I] + PathDelim + '*.desktop', faAnyFile, searchRec) = 0 then begin if not Assigned(Items) then Items:= TStringList.Create; repeat // Skip directories if FPS_ISDIR(searchRec.Attr) then Continue; try desktopFile:= TIniFile.Create(templateDir[I] + PathDelim + searchRec.Name); templateName:= desktopFile.ReadString('Desktop Entry', 'Name', EmptyStr); templatePath:= desktopFile.ReadString('Desktop Entry', 'URL', EmptyStr); templatePath:= GetAbsoluteFileName(templateDir[I] + PathDelim, templatePath); Items.Add(templateName + '=' + templatePath); finally FreeThenNil(desktopFile); end; until FindNextEx(searchRec) <> 0; Result:= Items.Count > 0; end; FindCloseEx(searchRec); end; finally if Assigned(Items) and (Items.Count = 0) then FreeAndNil(Items); end; end; function GetTemplateMenu(out Items: TStringList): Boolean; begin case GetDesktopEnvironment of DE_KDE: Result:= GetKdeTemplateMenu(Items); else Result:= GetGnomeTemplateMenu(Items); end; end; (* handling user commands from context menu *) procedure TShellContextMenu.ContextMenuSelect(Sender: TObject); var sCmd: String; begin // ShowMessage((Sender as TMenuItem).Hint); sCmd:= (Sender as TMenuItem).Hint; with frmMain.ActiveFrame do begin (* if (Pos('{!VFS}',sCmd)>0) and pnlFile.VFS.FindModule(ActiveDir + FileRecItem.sName) then begin pnlFile.LoadPanelVFS(@FileRecItem); Exit; end; *) if SameText(sCmd, sCmdVerbProperties) then ShowFileProperties(FileSource, FFiles); try if not ProcessExtCommand(sCmd, CurrentPath) then frmMain.ExecCmd(sCmd); except on e: EInvalidCommandLine do MessageDlg(rsMsgErrorInContextMenuCommand, rsMsgInvalidCommandLine + ': ' + e.Message, mtError, [mbOK], 0); end; end; end; (* handling user commands from template context menu *) procedure TShellContextMenu.TemplateContextMenuSelect(Sender: TObject); var SelectedItem: TMenuItem; FileName: UTF8String; begin // ShowMessage((Sender as TMenuItem).Hint); SelectedItem:= (Sender as TMenuItem); FileName:= SelectedItem.Caption; if InputQuery(rsMsgNewFile, rsMsgEnterName, FileName) then begin FileName:= FileName + ExtractFileExt(SelectedItem.Hint); if CopyFile(SelectedItem.Hint, frmMain.ActiveFrame.CurrentPath + FileName) then begin frmMain.ActiveFrame.Reload; frmMain.ActiveFrame.SetActiveFile(FileName); end; end; end; procedure TShellContextMenu.DriveMountSelect(Sender: TObject); begin MountDrive(@FDrive); end; procedure TShellContextMenu.DriveUnmountSelect(Sender: TObject); begin UnmountDrive(@FDrive); end; procedure TShellContextMenu.DriveEjectSelect(Sender: TObject); begin EjectDrive(@FDrive); end; procedure TShellContextMenu.OpenWithOtherSelect(Sender: TObject); var I: LongInt; FileNames: TStringList; begin {$IF DEFINED(LINUX)} FileNames := TStringList.Create; for I := 0 to FFiles.Count - 1 do FileNames.Add(FFiles[I].FullPath); ShowOpenWithDlg(FileNames); {$ENDIF} end; procedure TShellContextMenu.OpenWithMenuItemSelect(Sender: TObject); var ExecCmd: String; begin ExecCmd := (Sender as TMenuItem).Hint; try ExecCmdFork(ExecCmd); except on e: EInvalidCommandLine do MessageDlg(rsMsgErrorInContextMenuCommand, rsMsgInvalidCommandLine + ': ' + e.Message, mtError, [mbOK], 0); end; end; function TShellContextMenu.FillOpenWithSubMenu: Boolean; {$IF DEFINED(DARWIN)} var I: CFIndex; ImageIndex: PtrInt; bmpTemp: TBitmap = nil; mi, miOpenWith: TMenuItem; ApplicationArrayRef: CFArrayRef = nil; FileNameCFRef: CFStringRef = nil; FileNameUrlRef: CFURLRef = nil; ApplicationUrlRef: CFURLRef = nil; ApplicationNameCFRef: CFStringRef = nil; ApplicationCString: array[0..MAX_PATH-1] of Char; begin Result:= False; if (FFiles.Count <> 1) then Exit; try FileNameCFRef:= CFStringCreateWithFileSystemRepresentation(nil, PChar(FFiles[0].FullPath)); FileNameUrlRef:= CFURLCreateWithFileSystemPath(nil, FileNameCFRef, kCFURLPOSIXPathStyle, False); ApplicationArrayRef:= LSCopyApplicationURLsForURL(FileNameUrlRef, kLSRolesViewer or kLSRolesEditor or kLSRolesShell); if Assigned(ApplicationArrayRef) and (CFArrayGetCount(ApplicationArrayRef) > 0) then begin Result:= True; miOpenWith := TMenuItem.Create(Self); miOpenWith.Caption := rsMnuOpenWith; Self.Items.Add(miOpenWith); for I:= 0 to CFArrayGetCount(ApplicationArrayRef) - 1 do begin ApplicationUrlRef:= CFURLRef(CFArrayGetValueAtIndex(ApplicationArrayRef, I)); if CFURLGetFileSystemRepresentation(ApplicationUrlRef, True, ApplicationCString, SizeOf(ApplicationCString)) then begin mi := TMenuItem.Create(miOpenWith); mi.Caption := ExtractOnlyFileName(ApplicationCString); mi.Hint := QuoteStr(ApplicationCString) + #32 + QuoteStr(FFiles[0].FullPath); ImageIndex:= PixMapManager.GetApplicationBundleIcon(ApplicationCString, -1); if LSCopyDisplayNameForURL(ApplicationUrlRef, ApplicationNameCFRef) = noErr then begin if CFStringGetCString(ApplicationNameCFRef, ApplicationCString, SizeOf(ApplicationCString), kCFStringEncodingUTF8) then mi.Caption := ApplicationCString; CFRelease(ApplicationNameCFRef); end; if ImageIndex >= 0 then begin bmpTemp:= PixMapManager.GetBitmap(ImageIndex); if Assigned(bmpTemp) then begin mi.Bitmap.Assign(bmpTemp); FreeAndNil(bmpTemp); end; end; mi.OnClick := Self.OpenWithMenuItemSelect; miOpenWith.Add(mi); end; end; end; finally if Assigned(FileNameCFRef) then CFRelease(FileNameCFRef); if Assigned(FileNameUrlRef) then CFRelease(FileNameUrlRef); if Assigned(ApplicationArrayRef) then CFRelease(ApplicationArrayRef); end; end; {$ELSEIF DEFINED(LINUX)} var I: LongInt; ImageIndex: PtrInt; mi, miOpenWith: TMenuItem; FileNames: TStringList; DesktopEntries: TList = nil; bmpTemp: TBitmap = nil; begin Result := True; FileNames := TStringList.Create; try miOpenWith := TMenuItem.Create(Self); miOpenWith.Caption := rsMnuOpenWith; Self.Items.Add(miOpenWith); for i := 0 to FFiles.Count - 1 do FileNames.Add(FFiles[i].FullPath); DesktopEntries := GetDesktopEntries(FileNames); if Assigned(DesktopEntries) and (DesktopEntries.Count > 0) then begin for i := 0 to DesktopEntries.Count - 1 do begin mi := TMenuItem.Create(miOpenWith); mi.Caption := PDesktopFileEntry(DesktopEntries[i])^.DisplayName; mi.Hint := PDesktopFileEntry(DesktopEntries[i])^.Exec; ImageIndex:= PixMapManager.GetIconByName(PDesktopFileEntry(DesktopEntries[i])^.IconName); if ImageIndex >= 0 then begin bmpTemp:= PixMapManager.GetBitmap(ImageIndex); if Assigned(bmpTemp) then begin mi.Bitmap.Assign(bmpTemp); FreeAndNil(bmpTemp); end; end; mi.OnClick := Self.OpenWithMenuItemSelect; miOpenWith.Add(mi); end; miOpenWith.AddSeparator; end; mi := TMenuItem.Create(miOpenWith); mi.Caption := rsMnuOpenWithOther; mi.OnClick := Self.OpenWithOtherSelect; miOpenWith.Add(mi); finally FreeAndNil(FileNames); if Assigned(DesktopEntries) then begin for i := 0 to DesktopEntries.Count - 1 do Dispose(PDesktopFileEntry(DesktopEntries[i])); FreeAndNil(DesktopEntries); end; end; end; {$ELSE} begin Result:= False; end; {$ENDIF} constructor TShellContextMenu.Create(Owner: TWinControl; ADrive: PDrive); var mi: TMenuItem; begin inherited Create(Owner); FDrive := ADrive^; mi := TMenuItem.Create(Self); if not ADrive^.IsMounted then begin if ADrive^.IsMediaAvailable then begin mi.Caption := rsMnuMount; mi.OnClick := Self.DriveMountSelect; end else begin mi.Caption := rsMnuNoMedia; mi.Enabled := False; end; end else begin mi.Caption := rsMnuUmount; mi.OnClick := Self.DriveUnmountSelect; end; Self.Items.Add(mi); if ADrive^.IsMediaEjectable then begin mi :=TMenuItem.Create(Self); mi.Caption := rsMnuEject; mi.OnClick := Self.DriveEjectSelect; Self.Items.Add(mi); end; end; constructor TShellContextMenu.Create(Owner: TWinControl; var Files: TFiles; Background: Boolean); var aFile: TFile = nil; sl: TStringList = nil; I: Integer; sAct, sCmd: UTF8String; mi, miActions, miSortBy: TMenuItem; AddActionsMenu: Boolean = False; AddOpenWithMenu: Boolean = False; begin inherited Create(Owner); FFiles:= Files; try if not Background then begin mi:=TMenuItem.Create(Self); mi.Action := frmMain.actShellExecute; Self.Items.Add(mi); mi:=TMenuItem.Create(Self); mi.Caption:='-'; Self.Items.Add(mi); aFile := Files[0]; // Actions submenu begin miActions:=TMenuItem.Create(Self); miActions.Caption:= rsMnuActions; // Read actions from doublecmd.ext sl:=TStringList.Create; try if gExts.GetExtActions(aFile, sl) then begin AddActionsMenu := True; for I:= 0 to sl.Count - 1 do begin sAct:= sl.Names[I]; if (SysUtils.CompareText('OPEN', sAct) = 0) or (SysUtils.CompareText('VIEW', sAct) = 0) or (SysUtils.CompareText('EDIT', sAct) = 0) then Continue; sCmd:= sl.ValueFromIndex[I]; sCmd:= PrepareParameter(sCmd, frmMain.FrameLeft, frmMain.FrameRight, frmMain.ActiveFrame); mi:= TMenuItem.Create(miActions); mi.Caption:= sAct; mi.Hint:= sCmd; mi.OnClick:= Self.ContextMenuSelect; // handler miActions.Add(mi); end; end; if (Files.Count = 1) and not (aFile.IsDirectory or aFile.IsLinkToDirectory) then begin if sl.Count = 0 then AddActionsMenu := True else begin // now add delimiter mi:=TMenuItem.Create(miActions); mi.Caption:='-'; miActions.Add(mi); end; // now add VIEW item mi:=TMenuItem.Create(miActions); mi.Caption:= rsMnuView; mi.Hint:= '{!VIEWER} ' + QuoteStr(aFile.FullPath); mi.OnClick:=Self.ContextMenuSelect; // handler miActions.Add(mi); // now add EDITconfigure item mi:=TMenuItem.Create(miActions); mi.Caption:= rsMnuEdit; mi.Hint:= '{!EDITOR} ' + QuoteStr(aFile.FullPath); mi.OnClick:=Self.ContextMenuSelect; // handler miActions.Add(mi); end; finally FreeAndNil(sl); end; // Founded any commands if AddActionsMenu then Self.Items.Add(miActions) else miActions.Free; end; // Actions submenu // Add "Open with" submenu if needed AddOpenWithMenu:= FillOpenWithSubMenu; // Add separator after actions and openwith menu. if AddActionsMenu or AddOpenWithMenu then begin mi:=TMenuItem.Create(Self); mi.Caption:='-'; Self.Items.Add(mi); end; mi:=TMenuItem.Create(Self); mi.Action := frmMain.actRename; Self.Items.Add(mi); mi:=TMenuItem.Create(Self); mi.Action := frmMain.actCopy; Self.Items.Add(mi); mi:=TMenuItem.Create(Self); mi.Action := frmMain.actDelete; Self.Items.Add(mi); mi:=TMenuItem.Create(Self); mi.Action := frmMain.actRenameOnly; Self.Items.Add(mi); mi:=TMenuItem.Create(Self); mi.Caption:='-'; Self.Items.Add(mi); mi:=TMenuItem.Create(Self); mi.Action := frmMain.actCutToClipboard; Self.Items.Add(mi); mi:=TMenuItem.Create(Self); mi.Action := frmMain.actCopyToClipboard; Self.Items.Add(mi); mi:=TMenuItem.Create(Self); mi.Action := frmMain.actPasteFromClipboard; Self.Items.Add(mi); mi:=TMenuItem.Create(Self); mi.Caption:='-'; Self.Items.Add(mi); mi:=TMenuItem.Create(Self); mi.Action := frmMain.actFileProperties; Self.Items.Add(mi); end else begin mi:=TMenuItem.Create(Self); mi.Action := frmMain.actRefresh; Self.Items.Add(mi); // Add "Sort by" submenu miSortBy := TMenuItem.Create(Self); miSortBy.Caption := rsMnuSortBy; Self.Items.Add(miSortBy); mi:=TMenuItem.Create(miSortBy); mi.Action := frmMain.actSortByName; miSortBy.Add(mi); mi:=TMenuItem.Create(miSortBy); mi.Action := frmMain.actSortByExt; miSortBy.Add(mi); mi:=TMenuItem.Create(miSortBy); mi.Action := frmMain.actSortBySize; miSortBy.Add(mi); mi:=TMenuItem.Create(miSortBy); mi.Action := frmMain.actSortByDate; miSortBy.Add(mi); mi:=TMenuItem.Create(miSortBy); mi.Action := frmMain.actSortByAttr; miSortBy.Add(mi); mi:=TMenuItem.Create(miSortBy); mi.Caption := '-'; miSortBy.Add(mi); mi:=TMenuItem.Create(miSortBy); mi.Action := frmMain.actReverseOrder; miSortBy.Add(mi); mi:=TMenuItem.Create(Self); mi.Caption:='-'; Self.Items.Add(mi); mi:=TMenuItem.Create(Self); mi.Action := frmMain.actPasteFromClipboard; Self.Items.Add(mi); if GetTemplateMenu(sl) then begin mi:=TMenuItem.Create(Self); mi.Caption:='-'; Self.Items.Add(mi); // Add "New" submenu miSortBy := TMenuItem.Create(Self); miSortBy.Caption := rsMnuNew; Self.Items.Add(miSortBy); for I:= 0 to sl.Count - 1 do begin mi:=TMenuItem.Create(miSortBy); mi.Caption:= sl.Names[I]; mi.Hint:= sl.ValueFromIndex[I]; mi.OnClick:= Self.TemplateContextMenuSelect; miSortBy.Add(mi); end; FreeThenNil(sl); end; mi:=TMenuItem.Create(Self); mi.Caption:='-'; Self.Items.Add(mi); mi:=TMenuItem.Create(Self); mi.Caption:= frmMain.actFileProperties.Caption; mi.Hint:= sCmdVerbProperties; mi.OnClick:= Self.ContextMenuSelect; Self.Items.Add(mi); end; finally Files:= nil; end; end; destructor TShellContextMenu.Destroy; begin FreeThenNil(FFiles); inherited Destroy; end; end. doublecmd-0.5.8/src/platform/unix/uunixicontheme.pas0000644000175000017500000001341411740433676021673 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Some useful functions for Icon Theme implementation Copyright (C) 2009-2010 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uUnixIconTheme; {$mode objfpc}{$H+} interface uses Classes, SysUtils; const DEFAULT_THEME_NAME: String = 'hicolor'; var UnixIconThemesBaseDirList: array of String; function GetCurrentIconTheme: String; implementation uses DOM, XMLRead, IniFiles, uMyUnix, DCOSUtils, uOSUtils; function GetKdeIconTheme: String; const kde3Config = '/.kde/share/config/kdeglobals'; kde4Config = '/.kde4/share/config/kdeglobals'; var kdeConfig: array[1..2] of String = (kde4Config, kde3Config); I: Integer; iniCfg: TIniFile = nil; begin Result:= EmptyStr; for I:= Low(kdeConfig) to High(kdeConfig) do if (Result = EmptyStr) and mbFileExists(GetHomeDir + kdeConfig[I]) then try iniCfg:= TIniFile.Create(GetHomeDir + kdeConfig[I]); Result:= iniCfg.ReadString('Icons', 'Theme', EmptyStr); finally if Assigned(iniCfg) then iniCfg.Free; end; if (Result = EmptyStr) and mbDirectoryExists('/usr/share/icons/default.kde4') then Result:= 'default.kde4' else if (Result = EmptyStr) and mbDirectoryExists('/usr/share/icons/default.kde') then Result:= 'default.kde'; end; function GetGnomeIconTheme: String; const gnomeConfig = '/.gconf/desktop/gnome/interface/%gconf.xml'; var I: Integer; xmlCfg: TXMLDocument; ChildNode: TDOMNode; begin Result:= EmptyStr; xmlCfg:= nil; if mbFileExists(GetHomeDir + gnomeConfig) then try ReadXMLFile(xmlCfg, GetHomeDir + gnomeConfig); for I := 0 to xmlCfg.DocumentElement.ChildNodes.Count -1 do begin ChildNode := xmlCfg.DocumentElement.ChildNodes.Item[I]; if (ChildNode.NodeName = 'entry') then if (ChildNode.Attributes.Length > 0) and (ChildNode.Attributes[0].NodeValue = 'icon_theme') then begin Result:= ChildNode.FirstChild.FirstChild.NodeValue; Break; end; end; finally xmlCfg.Free; end; if Result = EmptyStr then Result:= 'gnome'; end; function GetXfceIconTheme: String; const xfceConfig = '/.config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml'; var J, I: Integer; xmlCfg: TXMLDocument; ChildNode1, ChildNode2: TDOMNode; begin Result:= EmptyStr; xmlCfg:= nil; if mbFileExists(GetHomeDir + xfceConfig) then try ReadXMLFile(xmlCfg, GetHomeDir + xfceConfig); for J := 0 to xmlCfg.DocumentElement.ChildNodes.Count -1 do begin ChildNode1:= xmlCfg.DocumentElement.ChildNodes.Item[J]; if (ChildNode1.NodeName = 'property') then if (ChildNode1.Attributes.Length > 0) and (ChildNode1.Attributes[0].NodeValue = 'Net') then for I:= 0 to ChildNode1.ChildNodes.Count - 1 do begin ChildNode2 := ChildNode1.ChildNodes.Item[I]; if (ChildNode2.NodeName = 'property') then if (ChildNode2.Attributes.Length > 2) and (ChildNode2.Attributes[0].NodeValue = 'IconThemeName') then begin Result:= ChildNode2.Attributes[2].NodeValue; Exit; end; end; end; finally xmlCfg.Free; end; end; function GetLxdeIconTheme: String; const lxdeConfig1 = '/.config/lxsession/%s/desktop.conf'; lxdeConfig2 = '/etc/xdg/lxsession/%s/desktop.conf'; var I: Integer; DesktopSession: String; iniCfg: TIniFile = nil; lxdeConfig: array[1..2] of String = (lxdeConfig1, lxdeConfig2); begin Result:= EmptyStr; DesktopSession:= mbGetEnvironmentVariable('DESKTOP_SESSION'); if Length(DesktopSession) <> 0 then begin lxdeConfig[1]:= GetHomeDir + Format(lxdeConfig[1], [DesktopSession]); lxdeConfig[2]:= Format(lxdeConfig[2], [DesktopSession]); for I:= Low(lxdeConfig) to High(lxdeConfig) do if (Length(Result) = 0) and mbFileExists(lxdeConfig[I]) then try iniCfg:= TIniFile.Create(lxdeConfig[I]); Result:= iniCfg.ReadString('GTK', 'sNet/IconThemeName', EmptyStr); finally if Assigned(iniCfg) then iniCfg.Free; end; end; end; function GetCurrentIconTheme: String; begin Result:= EmptyStr; case GetDesktopEnvironment of DE_UNKNOWN: Result:= DEFAULT_THEME_NAME; DE_KDE: Result:= GetKdeIconTheme; DE_GNOME: Result:= GetGnomeIconTheme; DE_XFCE: Result:= GetXfceIconTheme; DE_LXDE: Result:= GetLxdeIconTheme; end; if Result = EmptyStr then Result:= DEFAULT_THEME_NAME; end; procedure InitIconThemesBaseDirList; begin SetLength(UnixIconThemesBaseDirList, 5); UnixIconThemesBaseDirList[0] := GetHomeDir + '/.icons'; UnixIconThemesBaseDirList[1] := '/usr/local/share/icons'; UnixIconThemesBaseDirList[2] := '/usr/local/share/pixmaps'; UnixIconThemesBaseDirList[3] := '/usr/share/icons'; UnixIconThemesBaseDirList[4] := '/usr/share/pixmaps'; end; initialization InitIconThemesBaseDirList; end. doublecmd-0.5.8/src/platform/unix/ugio.pas0000644000175000017500000000755211742171244017570 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Interface to GIO - GLib Input, Output and Streaming Library This unit loads all libraries dynamically so it can work without it Copyright (C) 2011 Alexander Koblov (alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uGio; {$mode delphi} {$packrecords c} interface uses Classes, SysUtils; type gpointer = pointer; gboolean = longbool; Pgchar = PChar; PGFile = Pointer; PGAppInfo = Pointer; PGCancellable = Pointer; PGAppLaunchContext = Pointer; PPGError = Pointer; type PGList = ^TGList; TGList = record data: gpointer; next: PGList; prev: PGList; end; function GioOpen(const Uri: UTF8String): Boolean; var HasGio: Boolean = False; implementation uses DynLibs; const gobjectlib = 'libgobject-2.0.so.0'; giolib = 'libgio-2.0.so.0'; var hgobjectlib: TLibHandle = 0; hgiolib: TLibHandle = 0; var g_object_unref: procedure(anObject: gpointer); cdecl; g_file_is_native: function(AFile: PGFile): gboolean; cdecl; g_file_new_for_commandline_arg: function(arg: Pgchar): PGFile; cdecl; g_file_query_default_handler: function(AFile: PGFile; cancellable: PGCancellable; error: PPGError): PGAppInfo; cdecl; g_app_info_launch: function(AAppInfo: PGAppInfo; files: PGList; launch_context: PGAppLaunchContext; error: PPGError): gboolean; cdecl; g_app_info_launch_uris: function(AAppInfo: PGAppInfo; uris: PGList; launch_context: PGAppLaunchContext; error: PPGError): gboolean; cdecl; function GioOpen(const Uri: UTF8String): Boolean; var AFile: PGFile; AFileList: TGList; AppInfo: PGAppInfo; begin Result:= False; AFileList.next:= nil; AFileList.prev:= nil; if not HasGio then Exit; AFile:= g_file_new_for_commandline_arg(Pgchar(Uri)); try AppInfo:= g_file_query_default_handler(AFile, nil, nil); if (AppInfo = nil) then Exit; if g_file_is_native(AFile) then begin AFileList.data:= AFile; Result:= g_app_info_launch (AppInfo, @AFileList, nil, nil); end else begin AFileList.data:= Pgchar(Uri); Result:= g_app_info_launch_uris (AppInfo, @AFileList, nil, nil); end; g_object_unref(AppInfo); finally g_object_unref(AFile); end; end; initialization // Load GObject library hgobjectlib:= LoadLibrary(gobjectlib); if hgobjectlib <> 0 then begin @g_object_unref:= GetProcedureAddress(hgobjectlib, 'g_object_unref'); // Load GIO library hgiolib:= LoadLibrary(giolib); HasGio:= (hgiolib <> 0); if HasGio then begin @g_file_is_native:= GetProcedureAddress(hgiolib, 'g_file_is_native'); @g_file_new_for_commandline_arg:= GetProcedureAddress(hgiolib, 'g_file_new_for_commandline_arg'); @g_file_query_default_handler:= GetProcedureAddress(hgiolib, 'g_file_query_default_handler'); @g_app_info_launch:= GetProcedureAddress(hgiolib, 'g_app_info_launch'); @g_app_info_launch_uris:= GetProcedureAddress(hgiolib, 'g_app_info_launch_uris'); end; end; finalization if hgiolib <> 0 then FreeLibrary(hgiolib); if hgobjectlib <> 0 then FreeLibrary(hgobjectlib); end. doublecmd-0.5.8/src/platform/unix/libhal.pp0000644000175000017500000001675411472375445017731 0ustar alexxalexx{/*************************************************************************** * CVSID: $Id$ * * libhal.h : HAL daemon C convenience library headers * * Copyright (C) 2003 David Zeuthen, * Copyright (C) 2007 Codethink Ltd. Author Rob Taylor * * Licensed under the Academic Free License version 2.1 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/} unit libhal; {$mode objfpc}{$H+} interface uses Classes, SysUtils, dbus; type {/** * LibHalPropertyType: * * Possible types for properties on hal device objects */} LibHalPropertyType = ( LIBHAL_PROPERTY_TYPE_INVALID = DBUS_TYPE_INVALID, //** Used to report error condition */ LIBHAL_PROPERTY_TYPE_INT32 = DBUS_TYPE_INT32,//** Type for 32-bit signed integer property */ LIBHAL_PROPERTY_TYPE_UINT64 = DBUS_TYPE_UINT64,//** Type for 64-bit unsigned integer property */ LIBHAL_PROPERTY_TYPE_DOUBLE = DBUS_TYPE_DOUBLE,//** Type for double precision floating point property */ LIBHAL_PROPERTY_TYPE_BOOLEAN = DBUS_TYPE_BOOLEAN,//** Type for boolean property */ LIBHAL_PROPERTY_TYPE_STRING = DBUS_TYPE_STRING, //** Type for UTF-8 string property */ LIBHAL_PROPERTY_TYPE_STRLIST = (DBUS_TYPE_STRING shl 8) + (byte('l')) //** Type for list of UTF-8 strings property */ // LIBHAL_PROPERTY_TYPE_STRLIST = ((int) (DBUS_TYPE_STRING<<8)+('l')) ); LibHalContext = record end; PLibHalContext = ^LibHalContext; LibHalProperty = record end; PLibHalProperty = ^LibHalProperty; LibHalPropertySet = record end; PLibHalPropertySet = ^LibHalPropertySet; { * LibHalDeviceAdded: * @ctx: context for connection to hald * @udi: the Unique Device Id * * Type for callback when a device is added. } LibHalDeviceAdded = procedure(ctx: PLibHalContext; const udi: PChar);cdecl; { * LibHalDeviceRemoved: * @ctx: context for connection to hald * @udi: the Unique Device Id * * Type for callback when a device is removed. } LibHalDeviceRemoved = procedure(ctx: PLibHalContext; const udi: PChar);cdecl; LibHalDeviceNewCapability = procedure(ctx: PLibHalContext; const udi: PChar; const capability: PChar);cdecl; LibHalDeviceLostCapability = procedure(ctx: PLibHalContext; const udi: PChar; const capability: PChar);cdecl; LibHalDevicePropertyModified = procedure(ctx: PLibHalContext; const udi: PChar; const key: PChar; is_removed, is_added: dbus_bool_t);cdecl; LibHalDeviceCondition = procedure(ctx: PLibHalContext; const udi: PChar; const condition_name: PChar; const condition_delta: PChar); cdecl; //* Create a new context for a connection with hald */ function libhal_ctx_new:PLibHalContext; cdecl; external 'libhal'; //* Set DBus connection to use to talk to hald. */ function libhal_ctx_set_dbus_connection(ctx: PLibHalContext; conn: PDBusConnection):dbus_bool_t; cdecl; external 'libhal'; //* Initialize the connection to hald */ function libhal_ctx_init(ctx : PLibHalContext;error: PDBusError):dbus_bool_t; cdecl; external 'libhal'; //* Get all devices in the Global Device List (GDL). */ function libhal_get_all_devices(ctx: PLibHalContext; num_devices: PInteger; error: PDBusError):PPChar; cdecl; external 'libhal'; //* Frees a nul-terminated string */ procedure libhal_free_string(str :PChar); cdecl; external 'libhal'; //* Frees a NULL-terminated array of strings. If passed NULL, does nothing. */ procedure libhal_free_string_array(str_array: PPChar); cdecl; external 'libhal'; //* Shutdown a connection to hal */ function libhal_ctx_shutdown(ctx: PLibHalContext; error: PDBusError):dbus_bool_t; cdecl; external 'libhal'; //* Free a LibHalContext resource */ function libhal_ctx_free(ctx: PLibHalContext):dbus_bool_t; cdecl; external 'libhal'; //* Determine if a property on a device exists. */ function libhal_device_property_exists (ctx : PLibHalContext; const udi: PChar; const key: PChar; error: PDBusError):dbus_bool_t; cdecl; external 'libhal'; //* Get the value of a property of type string. */ function libhal_device_get_property_string (ctx: PLibHalContext; const udi: PChar; const key: PChar; error: PDBusError):PChar; cdecl; external 'libhal'; //* Get the value of a property of type string list. */ function libhal_device_get_property_strlist (ctx: PLibHalContext; const udi: PChar; const key: PChar; error: PDBusError): PPChar; cdecl; external 'libhal'; //* Retrieve all the properties on a device. */ function libhal_device_get_all_properties (ctx : PLibHalContext; const udi : Pchar; error : PDBusError):PLibHalPropertySet; cdecl; external 'libhal'; //* Get type of property. */ function libhal_ps_get_type (const set_ : PLibHalPropertySet; const key_ : PChar):LibHalPropertyType; cdecl; external 'libhal'; //* Get the value of a property of type string. */ function libhal_ps_get_string (const set_ :PLibHalPropertySet; const key_ :PChar):Pchar; cdecl; external 'libhal'; //* Get the number of properties in a property set. */ function libhal_property_set_get_num_elems (set_ : PLibHalPropertySet):integer; cdecl; external 'libhal'; //* Set the callback for when a device is added */ function libhal_ctx_set_device_added(ctx: PLibHalContext; callback: LibHalDeviceAdded):dbus_bool_t; cdecl; external 'libhal'; //* Set the callback for when a device is removed */ function libhal_ctx_set_device_removed(ctx: PLibHalContext; callback: LibHalDeviceRemoved):dbus_bool_t; cdecl; external 'libhal'; function libhal_ctx_set_device_new_capability(ctx: PLibHalContext; callback: LibHalDeviceNewCapability):dbus_bool_t; cdecl; external 'libhal'; function libhal_ctx_set_device_lost_capability(ctx: PLibHalContext; callback: LibHalDeviceLostCapability):dbus_bool_t; cdecl; external 'libhal'; function libhal_ctx_set_device_property_modified(ctx: PLibHalContext; callback: LibHalDevicePropertyModified):dbus_bool_t; cdecl; external 'libhal'; function libhal_ctx_set_device_condition(ctx: PLibHalContext; callback: LibHalDeviceCondition):dbus_bool_t; cdecl; external 'libhal'; function libhal_device_property_watch_all(ctx: PLibHalContext; error: PDBusError):dbus_bool_t; cdecl; external 'libhal'; implementation end. doublecmd-0.5.8/src/platform/unix/umyunix.pas0000644000175000017500000003675512243704276020356 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- This unit contains specific UNIX functions. Copyright (C) 2008-2013 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uMyUnix; {$mode objfpc}{$H+} {$IF NOT DEFINED(LINUX)} {$DEFINE FPC_USE_LIBC} {$ENDIF} interface uses Classes, SysUtils, BaseUnix, uDrive; const libc = 'c'; _PATH_FSTAB = '/etc/fstab'; _PATH_MOUNTED = '/etc/mtab'; const DE_UNKNOWN = 0; DE_KDE = 1; DE_GNOME = 2; DE_XFCE = 3; DE_LXDE = 4; type PIOFILE = Pointer; PFILE = PIOFILE; //en Mount entry record mntent = record mnt_fsname: PChar; //en< name of mounted file system mnt_dir: PChar; //en< file system path prefix mnt_type: PChar; //en< mount type mnt_opts: PChar; //en< mount options mnt_freq: LongInt; //en< dump frequency in days mnt_passno: LongInt; //en< pass number on parallel fsck end; TMountEntry = mntent; PMountEntry = ^TMountEntry; type __uid_t = DWORD; __gid_t = DWORD; //en Password file entry record passwd = record pw_name: PChar; //en< user name pw_passwd: PChar; //en< user password pw_uid: __uid_t; //en< user ID pw_gid: __gid_t; //en< group ID pw_gecos: PChar; //en< real name pw_dir: PChar; //en< home directory pw_shell: PChar; //en< shell program end; TPasswordRecord = passwd; PPasswordRecord = ^TPasswordRecord; //en Group file entry record group = record gr_name: PChar; //en< group name gr_passwd: PChar; //en< group password gr_gid: __gid_t; //en< group ID gr_mem: ^PChar; //en< group members end; TGroupRecord = group; PGroupRecord = ^TGroupRecord; {$IFDEF LINUX} {en Opens the file system description file @param(filename File system description file) @param(mode Type of access) @returns(The function returns a file pointer to file system description file) } function setmntent(const filename: PChar; const mode: PChar): PFILE; cdecl; external libc name 'setmntent'; {en Reads the next line from the file system description file @param(stream File pointer to file system description file) @returns(The function returns a pointer to a structure containing the broken out fields from a line in the file) } function getmntent(stream: PFILE): PMountEntry; cdecl; external libc name 'getmntent'; {en Closes the file system description file @param(stream File pointer to file system description file) @returns(The function always returns 1) } function endmntent(stream: PFILE): LongInt; cdecl; external libc name 'endmntent'; {$ENDIF} {en Get password file entry @param(uid User ID) @returns(The function returns a pointer to a structure containing the broken-out fields of the record in the password database that matches the user ID) } function getpwuid(uid: __uid_t): PPasswordRecord; cdecl; external libc name 'getpwuid'; {en Get password file entry @param(name User name) @returns(The function returns a pointer to a structure containing the broken-out fields of the record in the password database that matches the user name) } function getpwnam(const name: PChar): PPasswordRecord; cdecl; external libc name 'getpwnam'; {en Get group file entry @param(gid Group ID) @returns(The function returns a pointer to a structure containing the broken-out fields of the record in the group database that matches the group ID) } function getgrgid(gid: __gid_t): PGroupRecord; cdecl; external libc name 'getgrgid'; {en Get group file entry @param(name Group name) @returns(The function returns a pointer to a structure containing the broken-out fields of the record in the group database that matches the group name) } function getgrnam(name: PChar): PGroupRecord; cdecl; external libc name 'getgrnam'; {en Change or add an environment variable @param(name Environment variable name) @param(value Environment variable value) @param(overwrite Overwrite environment variable if exist) @returns(The function returns zero on success, or -1 if there was insufficient space in the environment) } function setenv(const name, value: PChar; overwrite: LongInt): LongInt; cdecl; external libc name 'setenv'; {en Change owner and group of a file (does not follow symbolic links) @param(path Full path to file) @param(owner User ID) @param(group Group ID) @returns(On success, zero is returned. On error, -1 is returned, and errno is set appropriately) } function fpLChown(path : pChar; owner : TUid; group : TGid): cInt; {$IFDEF FPC_USE_LIBC}cdecl; external libc name 'lchown';{$ENDIF} {$IFDEF LINUX} function fpOpenDir(__name: PChar): pDir; cdecl; external libc name 'opendir'; function fpReadDir(__dirp: pDir): pDirent; cdecl; external libc name 'readdir64'; function fpCloseDir(__dirp: pDir): cInt; cdecl; external libc name 'closedir'; {$ELSE} function fpReadDir(__dirp: pDir): pDirent; inline; function fpCloseDir(__dirp: pDir): cInt; inline; {$ENDIF} function fpSystemStatus(Command: string): cint; function GetDesktopEnvironment: Cardinal; function FileIsLinkToFolder(const FileName: UTF8String; out LinkTarget: UTF8String): Boolean; {en Checks if file is executable or script @param(FileName File name) @returns(The function returns @true if successful, @false otherwise) } function FileIsUnixExecutable(const Filename: UTF8String): Boolean; {en Find mount point of file system where file is located @param(FileName File name) @returns(Mount point of file system) } function FindMountPointPath(const FileName: UTF8String): UTF8String; function GetDefaultAppCmd(const FileName: UTF8String): UTF8String; function GetFileMimeType(const FileName: UTF8String): UTF8String; {en Fix separators in case they are broken UTF-8 characters (FPC takes only first byte as it doesn't support Unicode). } procedure FixDateTimeSeparators; function MountDrive(Drive: PDrive): Boolean; function UnmountDrive(Drive: PDrive): Boolean; function EjectDrive(Drive: PDrive): Boolean; {$IF DEFINED(BSD)} const MNT_WAIT = 1; // synchronously wait for I/O to complete MNT_NOWAIT = 2; // start all I/O, but do not wait for it MNT_LAZY = 3; // push data not written by filesystem syncer MNT_SUSPEND = 4; // suspend file system after sync type TFSTab = record fs_spec: PChar; // block special device name fs_file: PChar; // file system path prefix fs_vfstype: PChar; // file system type, ufs, nfs fs_mntops: PChar; // mount options ala -o fs_type: PChar; // FSTAB_* from fs_mntops fs_freq: longint; // dump frequency, in days fs_passno: longint; // pass number on parallel fsc end; PFSTab = ^TFSTab; PStatFS = ^TStatFS; {$IF DEFINED(DARWIN)} function getfsstat(buf: pstatfs; bufsize: cint; flags: cint): cint; cdecl; external libc name 'getfsstat'; {$ELSE} function getfsstat(struct_statfs: PStatFS; const buffsize: int64; const int_flags: integer): integer; {$ENDIF} function getfsent(): PFSTab; cdecl; external libc name 'getfsent'; procedure endfsent(); cdecl; external libc name 'endfsent'; {$ENDIF} implementation uses URIParser, Unix, FileUtil, DCClassesUtf8, DCStrUtils, uDCUtils, uOSUtils {$IF (NOT DEFINED(FPC_USE_LIBC)) or (DEFINED(BSD) AND NOT DEFINED(DARWIN))} , SysCall {$ENDIF} {$IFDEF LINUX} , uMimeActions, uUDisks {$ENDIF} ; {$IF DEFINED(BSD) AND NOT DEFINED(DARWIN)} function getfsstat(struct_statfs: PStatFS; const buffsize: int64; const int_flags: integer): integer; {$IF DEFINED(FREEBSD) AND ((fpc_version<2) OR ((fpc_version=2) AND (fpc_release<5)))} const syscall_nr_getfsstat = 18; // was not defined before fpc 2.5.1 {$ENDIF} begin Result := do_syscall(syscall_nr_getfsstat, TSysParam(struct_statfs), TSysParam(buffsize), TSysParam(int_flags)); end; {$ENDIF} {$IFNDEF FPC_USE_LIBC} function fpLChown(path : pChar; owner : TUid; group : TGid): cInt; begin fpLChown:=do_syscall(syscall_nr_lchown,TSysParam(path),TSysParam(owner),TSysParam(group)); end; {$ENDIF} {$IF NOT DEFINED(LINUX)} function fpReadDir(__dirp: pDir): pDirent; begin Result:= BaseUnix.FpReaddir(__dirp^); end; function fpCloseDir(__dirp: pDir): cInt; begin Result:= BaseUnix.FpClosedir(__dirp^); end; {$ENDIF} function fpSystemStatus(Command: string): cint; begin Result := fpSystem(UTF8ToSys(Command)); if wifexited(Result) then Result := wexitStatus(Result); end; {$IFDEF LINUX} var HavePMount: Boolean = False; procedure CheckPMount; begin HavePMount := (fpSystemStatus('pmount --version > /dev/null') = 0) and (fpSystemStatus('pumount --version > /dev/null') = 0); end; {$ENDIF LINUX} function GetDesktopEnvironment: Cardinal; var DesktopSession: String; begin Result:= DE_UNKNOWN; if GetEnvironmentVariable('KDE_FULL_SESSION') <> '' then Exit(DE_KDE); if GetEnvironmentVariable('GNOME_DESKTOP_SESSION_ID') <> '' then Exit(DE_GNOME); if GetEnvironmentVariable('_LXSESSION_PID') <> '' then Exit(DE_LXDE); if fpSystemStatus('pgrep xfce4-session > /dev/null') = 0 then Exit(DE_XFCE); DesktopSession:= GetEnvironmentVariable('DESKTOP_SESSION'); DesktopSession:= LowerCase(DesktopSession); if Pos('kde', DesktopSession) <> 0 then Exit(DE_KDE); if Pos('gnome', DesktopSession) <> 0 then Exit(DE_GNOME); if Pos('xfce', DesktopSession) <> 0 then Exit(DE_XFCE); if Pos('lxde', DesktopSession) <> 0 then Exit(DE_LXDE); end; function FileIsLinkToFolder(const FileName: UTF8String; out LinkTarget: UTF8String): Boolean; var iniDesktop: TIniFileEx = nil; StatInfo: BaseUnix.Stat; begin Result:= False; try iniDesktop:= TIniFileEx.Create(FileName, fmOpenRead); if iniDesktop.ReadString('Desktop Entry', 'Type', EmptyStr) = 'Link' then begin LinkTarget:= iniDesktop.ReadString('Desktop Entry', 'URL', EmptyStr); if not URIToFilename(LinkTarget, LinkTarget) then Exit; if fpLStat(PAnsiChar(UTF8ToSys(LinkTarget)), StatInfo) <> 0 then Exit; Result:= FPS_ISDIR(StatInfo.st_mode); end; finally if Assigned(iniDesktop) then FreeAndNil(iniDesktop); end; end; function FileIsUnixExecutable(const FileName: UTF8String): Boolean; var Info : Stat; dwSign : LongWord; fsExeScr : TFileStreamEx = nil; begin // First check FileName is not a directory and then check if executable Result:= (fpStat(UTF8ToSys(FileName), Info) <> -1) and FPS_ISREG(Info.st_mode) and (BaseUnix.fpAccess(UTF8ToSys(FileName), BaseUnix.X_OK) = 0); if Result and (Info.st_size >= SizeOf(dwSign)) then try fsExeScr := TFileStreamEx.Create(FileName, fmOpenRead or fmShareDenyNone); dwSign := fsExeScr.ReadDWord; // ELF or #! Result := ((dwSign = NtoBE($7F454C46)) or (Lo(dwSign) = NtoBE($2321))); finally if Assigned(fsExeScr) then fsExeScr.Free; end; end; function FindMountPointPath(const FileName: UTF8String): UTF8String; var I, J: LongInt; sTemp: UTF8String; recStat: Stat; st_dev: QWord; begin // Set root directory as mount point by default Result:= PathDelim; // Get stat info for original file if (fpLStat(PChar(UTF8ToSys(FileName)), recStat) < 0) then Exit; // Save device ID of original file st_dev:= recStat.st_dev; J:= Length(FileName); for I:= J downto 1 do begin if FileName[I] = PathDelim then begin if (I = 1) then sTemp:= PathDelim else sTemp:= Copy(FileName, 1, I - 1); // Stat for current directory if (fpLStat(PChar(UTF8ToSys(sTemp)), recStat) < 0) then Continue; // If it is a link then checking link destination if fpS_ISLNK(recStat.st_mode) then begin sTemp:= ReadSymLink(sTemp); Result:= FindMountPointPath(sTemp); Exit; end; // Check device ID if (recStat.st_dev <> st_dev) then begin Result:= Copy(FileName, 1, J); Exit; end; J:= I; end; end; end; function GetDefaultAppCmd(const FileName: UTF8String): UTF8String; {$IFDEF LINUX} var Filenames: TStringList; begin Filenames:= TStringList.Create; Filenames.Add(FileName); Result:= uMimeActions.GetDefaultAppCmd(Filenames); if Length(Result) = 0 then Result:= 'xdg-open ' + QuoteStr(FileName); FreeAndNil(Filenames); end; {$ELSE} begin Result:= 'xdg-open ' + QuoteStr(FileName); end; {$ENDIF} function GetFileMimeType(const FileName: UTF8String): UTF8String; {$IFDEF LINUX} begin Result:= uMimeActions.GetFileMimeType(FileName); end; {$ELSE} begin Result:= EmptyStr; end; {$ENDIF} procedure FixDateTimeSeparators; var TimeEnv: String; begin TimeEnv := GetEnvironmentVariable('LC_TIME'); if TimeEnv = EmptyStr then TimeEnv := GetEnvironmentVariable('LC_ALL'); if TimeEnv = EmptyStr then TimeEnv := GetEnvironmentVariable('LANG'); if TimeEnv <> EmptyStr then begin TimeEnv := upcase(TimeEnv); if StrEnds(TimeEnv, 'UTF-8') or StrEnds(TimeEnv, 'UTF8') then begin if Ord(DateSeparator) > $7F then DateSeparator := '/'; if Ord(TimeSeparator) > $7F then TimeSeparator := ':'; end; end; end; function MountDrive(Drive: PDrive): Boolean; {$IFDEF LINUX} var MountPath: UTF8String; {$ENDIF} begin if not Drive^.IsMounted then begin {$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)} Result := False; // If Path is not empty "mount" can mount it because it has a destination path from fstab. if Drive^.Path <> EmptyStr then {$ENDIF} Result := fpSystemStatus('mount ' + Drive^.DeviceId) = 0; {$IF DEFINED(LINUX)} if not Result and uUDisks.Initialize then begin Result := uUDisks.Mount(DeviceFileToUDisksObjectPath(Drive^.DeviceId), EmptyStr, nil, MountPath); if Result then Drive^.Path := MountPath; uUDisks.Finalize; end; if not Result and HavePMount and Drive^.IsMediaRemovable then Result := fpSystemStatus('pmount ' + Drive^.DeviceId) = 0; {$ELSE IF DEFINED(DARWIN)} if not Result then Result := fpSystemStatus('diskutil mount ' + Drive^.DeviceId) = 0; {$ENDIF} end else Result := True; end; function UnmountDrive(Drive: PDrive): Boolean; begin if Drive^.IsMounted then begin {$IF DEFINED(LINUX)} Result := False; if uUDisks.Initialize then begin Result := uUDisks.Unmount(DeviceFileToUDisksObjectPath(Drive^.DeviceId), nil); uUDisks.Finalize; end; if not Result and HavePMount and Drive^.IsMediaRemovable then Result := fpSystemStatus('pumount ' + Drive^.DeviceId) = 0; if not Result then {$ELSE IF DEFINED(DARWIN)} Result := fpSystemStatus('diskutil unmount ' + Drive^.DeviceId) = 0; if not Result then {$ENDIF} Result := fpSystemStatus('umount ' + Drive^.Path) = 0; end else Result := True; end; function EjectDrive(Drive: PDrive): Boolean; begin {$IF DEFINED(DARWIN)} Result := fpSystemStatus('diskutil eject ' + Drive^.DeviceId) = 0; if not Result then {$ENDIF} Result := fpSystemStatus('eject ' + Drive^.DeviceId) = 0; end; {$IFDEF LINUX} initialization CheckPMount; {$ENDIF} end. doublecmd-0.5.8/src/platform/unix/uudisks.pas0000644000175000017500000006607211740433676020326 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Interface to UDisks service via DBUS. Copyright (C) 2010-2012 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uUDisks; {$mode objfpc}{$H+} interface uses Classes, SysUtils; type TStringArray = array of string; TUDisksDeviceInfo = record DeviceObjectPath: UTF8String; DeviceFile: UTF8String; DeviceIsDrive, DeviceIsSystemInternal, DeviceIsPartition, DeviceIsPartitionTable, // Does the device have a partition table DeviceIsMounted, DeviceIsRemovable, // If contains removable media. DeviceIsOpticalDisc, // If is an optical drive and optical disk is inserted. DeviceIsMediaAvailable, DriveIsMediaEjectable: Boolean; DeviceMountPaths: TStringArray; DevicePresentationHide: Boolean; DevicePresentationName: UTF8String; DevicePresentationIconName: UTF8String; DeviceAutomountHint: UTF8String; // Whether automatically mount or not DriveConnectionInterface, DriveMedia: UTF8String; // Type of media currently in the drive. DriveMediaCompatibility: TStringArray; // Possible media types. DriveCanDetach: Boolean; // Hot-plugged device (USB, Firewire, etc.) IdUsage, IdType, IdVersion, IdUuid, IdLabel, PartitionSlave: UTF8String; // Owner device if this is a partition end; TUDisksDevicesInfos = array of TUDisksDeviceInfo; TUDisksMethod = (UDisks_DeviceAdded, UDisks_DeviceRemoved, UDisks_DeviceChanged); TUDisksDeviceNotify = procedure(Reason: TUDisksMethod; const ObjectPath: UTF8String) of object; const UDisksDevicePathPrefix = '/org/freedesktop/UDisks/devices/'; function UDisksObjectPathToDeviceFile(const ObjectPath: UTF8String): UTF8String; function DeviceFileToUDisksObjectPath(const DeviceFile: UTF8String): UTF8String; function GetObjectProperty(const ObjectPath: UTF8String; const PropertyName: UTF8String; out Value: UTF8String; IsPropertyAnObjectPath: Boolean = False): Boolean; function GetObjectProperty(const ObjectPath: UTF8String; const PropertyName: UTF8String; out Value: Boolean): Boolean; function GetObjectProperty(const ObjectPath: UTF8String; const PropertyName: UTF8String; out Value: TStringArray): Boolean; function GetDeviceInfo(const ObjectPath: UTF8String; out Info: TUDisksDeviceInfo): Boolean; function EnumerateDevices(out DevicesList: TStringArray): Boolean; function EnumerateDevices(out DevicesInfos: TUDisksDevicesInfos): Boolean; function Mount(const ObjectPath: UTF8String; const FileSystemType: UTF8String; const Options: TStringArray; out MountPath: UTF8String): Boolean; function Unmount(const ObjectPath: UTF8String; const Options: TStringArray): Boolean; function Initialize: Boolean; procedure Finalize; procedure DispatchMessages; procedure AddObserver(Func: TUDisksDeviceNotify); procedure RemoveObserver(Func: TUDisksDeviceNotify); implementation uses dbus, fgl, ExtCtrls; {$IF (FPC_VERSION <= 2) and (FPC_RELEASE <= 4) and (FPC_PATCH <= 2)} type DBusHandleMessageFunction = function(connection: PDBusConnection; message_: PDBusMessage; user_data: Pointer): DBusHandlerResult; cdecl; { Filters } function dbus_connection_add_filter(connection: PDBusConnection; function_: DBusHandleMessageFunction; user_data: Pointer; free_data_function: DBusFreeFunction): dbus_bool_t; cdecl; external LibDBus; procedure dbus_connection_remove_filter (connection: PDBusConnection; function_: DBusHandleMessageFunction; user_data: Pointer); cdecl; external LibDBus; {$ENDIF} type TUDisksObserverList = specialize TFPGList; TDummy = class procedure OnTimer(Sender: TObject); end; var DBusConnectionOpen: Boolean = False; DBusFilterInstalled: Boolean = False; conn: PDBusConnection; error: DBusError; Observers: TUDisksObserverList = nil; InitializeCounter: Integer = 0; ConnTimer: TTimer = nil; Dummy: TDummy = nil; const UDisksMethodStr: array[TUDisksMethod] of string = ('DeviceAdded', 'DeviceRemoved', 'DeviceChanged'); UDisksAddress = 'org.freedesktop.UDisks'; UDisksObject = '/org/freedesktop/UDisks'; UDisksInterface = 'org.freedesktop.UDisks'; UDisksDeviceInterface = 'org.freedesktop.UDisks.Device'; DBusPropertiesInterface = 'org.freedesktop.DBus.Properties'; UDisksFilterStr = 'type=''signal'',' + 'sender=''' + UDisksAddress + ''',' + 'path=''' + UDisksObject + ''',' + 'interface=''' + UDisksInterface + ''''; procedure Print(const sMessage: String); begin WriteLn('UDisks: ', sMessage); end; function CheckError(const sMessage: String; pError: PDBusError): Boolean; begin if (dbus_error_is_set(pError) <> 0) then begin Print(sMessage + ': ' + pError^.name + ' ' + pError^.message); dbus_error_free(pError); Result := True; end else Result := False; end; function UDisksObjectPathToDeviceFile(const ObjectPath: UTF8String): UTF8String; begin if LeftStr(ObjectPath, Length(UDisksDevicePathPrefix)) = UDisksDevicePathPrefix then Result := '/dev/' + Copy(ObjectPath, Length(UDisksDevicePathPrefix) + 1, MaxInt) else raise Exception.Create('Invalid object path: ' + ObjectPath); end; function DeviceFileToUDisksObjectPath(const DeviceFile: UTF8String): UTF8String; begin if LeftStr(DeviceFile, 5) = '/dev/' then Result := UDisksDevicePathPrefix + Copy(DeviceFile, 6, MaxInt) else raise Exception.Create('Invalid device file name: ' + DeviceFile); end; function GetObjectPath(message: PDBusMessage; out ObjectPath: UTF8String): Boolean; var object_path: PChar; got_args: dbus_bool_t; begin dbus_error_init(@error); got_args := dbus_message_get_args(message, @error, DBUS_TYPE_OBJECT_PATH, [@object_path, DBUS_TYPE_INVALID]); if CheckError('Cannot get object path', @error) then Result := False else if got_args = 0 then begin Print('Cannot get object path'); Result := False; end else begin ObjectPath := StrPas(object_path); Result := True; end; end; function GetBasicVal(pIter: PDBusMessageIter; dbus_type: Integer; Ptr: Pointer): Boolean; begin if dbus_message_iter_get_arg_type(pIter) <> dbus_type then begin Print('Not a valid type'); Result := False; end else begin dbus_message_iter_get_basic(pIter, Ptr); Result := True; end; end; function GetArrayOfString(pIter: PDBusMessageIter; dbus_string_type: Integer; out Arr: TStringArray): Boolean; var arrayIter: DBusMessageIter; counter: Integer; StringPtr: PChar; begin if (dbus_message_iter_get_arg_type(pIter) <> DBUS_TYPE_ARRAY) or (dbus_message_iter_get_element_type(pIter) <> dbus_string_type) then begin Print('Not a valid type'); Result := False; end else begin dbus_message_iter_recurse(pIter, @arrayIter); // Check if array is not empty (if the first element is there). if dbus_message_iter_get_arg_type(@arrayIter) <> DBUS_TYPE_INVALID then begin counter := 0; repeat if GetBasicVal(@arrayIter, dbus_string_type, @StringPtr) and Assigned(StringPtr) then begin SetLength(Arr, counter + 1); Arr[counter] := StrPas(StringPtr); Inc(counter); end else Exit(False); until (dbus_message_iter_next(@arrayIter) = 0); end; end; Result := True; end; function GetArrayOfString(pIter: PDBusMessageIter; out Arr: TStringArray): Boolean; begin Result := GetArrayOfString(pIter, DBUS_TYPE_STRING, Arr); end; function GetArrayOfObjectPath(pIter: PDBusMessageIter; out Arr: TStringArray): Boolean; begin // Object path is an utf-8 string in DBUS, but marked with a different type // than normal DBUS_TYPE_STRING. Result := GetArrayOfString(pIter, DBUS_TYPE_OBJECT_PATH, Arr); end; // reply needs to be freed by the caller. function SendWithReply(message: PDBusMessage; out reply: PDBusMessage; expectedReplyType: Integer; replyIter: PDBusMessageIter): Boolean; begin dbus_error_init (@error); reply := dbus_connection_send_with_reply_and_block(conn, message, -1, @error); if CheckError('Error sending message', @error) then Result := False else if not Assigned(reply) then begin Print('Reply not received'); Result := False; end else if dbus_message_iter_init(reply, replyIter) = 0 then begin Print('Reply has no arguments'); Result := False; end else if dbus_message_iter_get_arg_type(replyIter) <> expectedReplyType then begin Print('Invalid argument type in reply.'); Result := False; end else Result := True; if (not Result) and Assigned(reply) then dbus_message_unref(reply); end; function DBusListActivatableNames(out Names: TStringArray): Boolean; var message, reply: PDBusMessage; replyIter: DBusMessageIter; begin message := dbus_message_new_method_call(DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, 'ListActivatableNames'); if not Assigned(message) then begin Print('Cannot create message "ListActivatableNames"'); Result := False; end else begin Result := SendWithReply(message, reply, DBUS_TYPE_ARRAY, @replyIter); dbus_message_unref(message); if Result then begin Result := GetArrayOfString(@replyIter, Names); dbus_message_unref(reply); end; end; end; function Invoke_GetProperty(const ObjectPath: UTF8String; const PropertyName: UTF8String; out reply: PDBusMessage; // reply needs to be freed by the caller. pVariantIter: PDBusMessageIter): Boolean; var deviceInterfaceNamePChar: PChar; propertyNamePChar: PChar; message: PDBusMessage; replyIter: DBusMessageIter; begin message := dbus_message_new_method_call(UDisksAddress, PChar(ObjectPath), DBusPropertiesInterface, 'Get'); if not Assigned(message) then begin Print('Cannot create message "Get"'); Exit(False); end; deviceInterfaceNamePChar := PChar(UDisksDeviceInterface); propertyNamePChar := PChar(PropertyName); if dbus_message_append_args(message, DBUS_TYPE_STRING, [@deviceInterfaceNamePChar, DBUS_TYPE_STRING, @propertyNamePChar, DBUS_TYPE_INVALID]) = 0 then begin Print('Cannot append arguments'); Result := False; end else if SendWithReply(message, reply, DBUS_TYPE_VARIANT, @replyIter) then begin dbus_message_iter_recurse(@replyIter, pVariantIter); Result := True; end else Result := False; dbus_message_unref(message); end; function Invoke_EnumerateDevices(out reply: PDBusMessage; // reply needs to be freed by the caller. pReplyIter: PDBusMessageIter): Boolean; var message: PDBusMessage; begin message := dbus_message_new_method_call(UDisksAddress, UDisksObject, UDisksInterface, 'EnumerateDevices'); if not Assigned(message) then begin Print('Cannot create message "EnumerateDevices"'); Result := False; end else begin Result := SendWithReply(message, reply, DBUS_TYPE_ARRAY, pReplyIter); dbus_message_unref(message); end; end; function GetObjectProperty(const ObjectPath: UTF8String; const PropertyName: UTF8String; out Value: UTF8String; IsPropertyAnObjectPath: Boolean): Boolean; var reply: PDBusMessage; itVariant: DBusMessageIter; StringPtr: PChar; begin Result := Invoke_GetProperty(ObjectPath, PropertyName, reply, @itVariant); if Result then begin if IsPropertyAnObjectPath then Result := GetBasicVal(@itVariant, DBUS_TYPE_OBJECT_PATH, @StringPtr) else Result := GetBasicVal(@itVariant, DBUS_TYPE_STRING, @StringPtr); if Result and Assigned(StringPtr) then Value := StrPas(StringPtr); dbus_message_unref(reply); end; end; function GetObjectProperty(const ObjectPath: UTF8String; const PropertyName: UTF8String; out Value: Boolean): Boolean; var reply: PDBusMessage; itVariant: DBusMessageIter; DbusValue: dbus_bool_t; begin Result := Invoke_GetProperty(ObjectPath, PropertyName, reply, @itVariant); if Result then begin Result := GetBasicVal(@itVariant, DBUS_TYPE_BOOLEAN, @DbusValue); if Result then Value := DbusValue <> 0; dbus_message_unref(reply); end; end; function GetObjectProperty(const ObjectPath: UTF8String; const PropertyName: UTF8String; out Value: TStringArray): Boolean; var reply: PDBusMessage; itVariant: DBusMessageIter; begin Result := Invoke_GetProperty(ObjectPath, PropertyName, reply, @itVariant); if Result then begin Result := GetArrayOfString(@itVariant, Value); dbus_message_unref(reply); end; end; function GetDeviceInfo(const ObjectPath: UTF8String; out Info: TUDisksDeviceInfo): Boolean; begin // Description of properties: // http://hal.freedesktop.org/docs/udisks/Device.html with Info do begin DeviceObjectPath := ObjectPath; Result := GetObjectProperty(ObjectPath, 'DeviceFile', DeviceFile) and GetObjectProperty(ObjectPath, 'DeviceIsDrive', DeviceIsDrive) and GetObjectProperty(ObjectPath, 'DeviceIsSystemInternal', DeviceIsSystemInternal) and GetObjectProperty(ObjectPath, 'DeviceIsPartition', DeviceIsPartition) and GetObjectProperty(ObjectPath, 'DeviceIsPartitionTable', DeviceIsPartitionTable) and GetObjectProperty(ObjectPath, 'DeviceIsMounted', DeviceIsMounted) and GetObjectProperty(ObjectPath, 'DeviceIsRemovable', DeviceIsRemovable) and GetObjectProperty(ObjectPath, 'DeviceIsOpticalDisc', DeviceIsOpticalDisc) and GetObjectProperty(ObjectPath, 'DeviceIsMediaAvailable', DeviceIsMediaAvailable) and GetObjectProperty(ObjectPath, 'DevicePresentationHide', DevicePresentationHide) and GetObjectProperty(ObjectPath, 'DevicePresentationName', DevicePresentationName) and GetObjectProperty(ObjectPath, 'DevicePresentationIconName', DevicePresentationIconName) and GetObjectProperty(ObjectPath, 'DeviceAutomountHint', DeviceAutomountHint); if Result and DeviceIsPartition then Result := GetObjectProperty(ObjectPath, 'PartitionSlave', PartitionSlave, True); if Result and DeviceIsMounted then Result := GetObjectProperty(ObjectPath, 'DeviceMountPaths', DeviceMountPaths); if Result and DeviceIsDrive then begin Result := GetObjectProperty(ObjectPath, 'DriveIsMediaEjectable', DriveIsMediaEjectable) and GetObjectProperty(ObjectPath, 'DriveConnectionInterface', DriveConnectionInterface) and GetObjectProperty(ObjectPath, 'DriveMedia', DriveMedia) and GetObjectProperty(ObjectPath, 'DriveMediaCompatibility', DriveMediaCompatibility) and GetObjectProperty(ObjectPath, 'DriveCanDetach', DriveCanDetach); end; if Result then begin Result := GetObjectProperty(ObjectPath, 'IdUsage', IdUsage) and GetObjectProperty(ObjectPath, 'IdType', IdType) and GetObjectProperty(ObjectPath, 'IdVersion', IdVersion) and GetObjectProperty(ObjectPath, 'IdUuid', IdUuid) and GetObjectProperty(ObjectPath, 'IdLabel', IdLabel); end; end; end; function EnumerateDevices(out DevicesList: TStringArray): Boolean; var reply: PDBusMessage; replyIter: DBusMessageIter; begin Result := Invoke_EnumerateDevices(reply, @replyIter); if Result then begin Result := GetArrayOfObjectPath(@replyIter, DevicesList); dbus_message_unref(reply); end; end; function EnumerateDevices(out DevicesInfos: TUDisksDevicesInfos): Boolean; var DevicesList: TStringArray; i: Integer; begin Result := EnumerateDevices(DevicesList); if Result then begin SetLength(DevicesInfos, Length(DevicesList)); for i := 0 to Length(DevicesList) - 1 do begin if not GetDeviceInfo(DevicesList[i], DevicesInfos[i]) then Exit(False); end; end; end; function Mount(const ObjectPath: UTF8String; const FileSystemType: UTF8String; const Options: TStringArray; out MountPath: UTF8String): Boolean; var message, reply: PDBusMessage; argsIter, arrayIter, replyIter: DBusMessageIter; optsPChar: PChar; i: Integer; StringPtr: PChar; begin message := dbus_message_new_method_call(UDisksAddress, PChar(ObjectPath), UDisksDeviceInterface, 'FilesystemMount'); if not Assigned(message) then begin Print('Cannot create message "FilesystemMount"'); Result := False; end else begin dbus_message_iter_init_append(message, @argsIter); optsPChar := PChar(FileSystemType); Result := (dbus_message_iter_append_basic(@argsIter, DBUS_TYPE_STRING, @optsPChar) <> 0) and (dbus_message_iter_open_container(@argsIter, DBUS_TYPE_ARRAY, PChar(DBUS_TYPE_STRING_AS_STRING), @arrayIter) <> 0); if Result then begin for i := Low(Options) to High(Options) do begin optsPChar := PChar(Options[i]); if dbus_message_iter_append_basic(@arrayIter, DBUS_TYPE_STRING, @optsPChar) = 0 then begin Result := False; Break; end; end; if dbus_message_iter_close_container(@argsIter, @arrayIter) = 0 then Result := False; end; if not Result then begin Print('Cannot append arguments'); end else if SendWithReply(message, reply, DBUS_TYPE_STRING, @replyIter) then begin Result := GetBasicVal(@replyIter, DBUS_TYPE_STRING, @StringPtr) and Assigned(StringPtr); if Result then MountPath := StrPas(StringPtr); dbus_message_unref(reply); end else Result := False; dbus_message_unref(message); end; end; function Unmount(const ObjectPath: UTF8String; const Options: TStringArray): Boolean; var message, reply: PDBusMessage; argsIter, arrayIter: DBusMessageIter; optsPChar: PChar; i: Integer; begin message := dbus_message_new_method_call(UDisksAddress, PChar(ObjectPath), UDisksDeviceInterface, 'FilesystemUnmount'); if not Assigned(message) then begin Print('Cannot create message "FilesystemUnmount"'); Result := False; end else begin dbus_message_iter_init_append(message, @argsIter); Result := dbus_message_iter_open_container(@argsIter, DBUS_TYPE_ARRAY, PChar(DBUS_TYPE_STRING_AS_STRING), @arrayIter) <> 0; if Result then begin for i := Low(Options) to High(Options) do begin optsPChar := PChar(Options[i]); if dbus_message_iter_append_basic(@arrayIter, DBUS_TYPE_STRING, @optsPChar) = 0 then begin Result := False; Break; end; end; if dbus_message_iter_close_container(@argsIter, @arrayIter) = 0 then Result := False; end; if not Result then begin Print('Cannot append arguments'); end else begin dbus_error_init(@error); reply := dbus_connection_send_with_reply_and_block(conn, message, -1, @error); if CheckError('Error sending message', @error) then Result := False else if not Assigned(reply) then begin Print('Reply not received'); Result := False; end else Result := True; if Assigned(reply) then dbus_message_unref(reply); end; dbus_message_unref(message); end; end; function FilterFunc(connection: PDBusConnection; message: PDBusMessage; user_data: Pointer): DBusHandlerResult; cdecl; var DeviceObjectPath: UTF8String; i: Integer; begin if dbus_message_is_signal(message, 'org.freedesktop.DBus.Local', 'Disconnected') <> 0 then begin // The bus is disconnecting. "Disconnected" is the last signal in connection. Print('Disconnected from DBUS'); DBusConnectionOpen := False; Exit(DBUS_HANDLER_RESULT_HANDLED); end // DeviceAdded else if dbus_message_is_signal(message, UDisksInterface, PChar(UDisksMethodStr[UDisks_DeviceAdded])) <> 0 then begin if GetObjectPath(message, DeviceObjectPath) then begin Print('Device added: ' + DeviceObjectPath); for i := 0 to Observers.Count - 1 do Observers[i](UDisks_DeviceAdded, DeviceObjectPath); end; Exit(DBUS_HANDLER_RESULT_HANDLED); end // DeviceRemoved else if dbus_message_is_signal(message, UDisksInterface, PChar(UDisksMethodStr[UDisks_DeviceRemoved])) <> 0 then begin if GetObjectPath(message, DeviceObjectPath) then begin Print('Device removed: ' + DeviceObjectPath); for i := 0 to Observers.Count - 1 do Observers[i](UDisks_DeviceRemoved, DeviceObjectPath); end; Exit(DBUS_HANDLER_RESULT_HANDLED); end // DeviceChanged else if dbus_message_is_signal(message, UDisksInterface, PChar(UDisksMethodStr[UDisks_DeviceChanged])) <> 0 then begin if GetObjectPath(message, DeviceObjectPath) then begin Print('Device changed: ' + DeviceObjectPath); for i := 0 to Observers.Count - 1 do Observers[i](UDisks_DeviceChanged, DeviceObjectPath); end; Exit(DBUS_HANDLER_RESULT_HANDLED); end; Exit(DBUS_HANDLER_RESULT_NOT_YET_HANDLED); end; function IsUDisksActivatable: Boolean; var ServicesNames: TStringArray; i: Integer; begin Result := False; if DBusListActivatableNames(ServicesNames) then begin for i := Low(ServicesNames) to High(ServicesNames) do if ServicesNames[i] = UDisksAddress then Exit(True); end else Print('Cannot list activatable services on DBUS'); end; function CheckUDisksService: Boolean; var udisks_exists: dbus_bool_t; start_reply: dbus_uint32_t; daemon_version: UTF8String; begin // Check if UDisks service is running. dbus_error_init(@error); udisks_exists := dbus_bus_name_has_owner(conn, UDisksAddress, @error); if CheckError('Cannot query UDisks on DBUS', @error) then Exit(False); if udisks_exists = 0 then begin // Check if UDisks service is installed and can be activated. if not IsUDisksActivatable then Exit(False); dbus_error_init(@error); dbus_bus_start_service_by_name(conn, UDisksAddress, 0, @start_reply, @error); if CheckError('Cannot request service to start', @error) then Exit(False); case start_reply of DBUS_START_REPLY_SUCCESS: Print('Service successfully started.'); DBUS_START_REPLY_ALREADY_RUNNING: Print('Service already running.'); end; end else Print('Service found running.'); if GetObjectProperty(UDisksObject, 'DaemonVersion', daemon_version) then Print('Version ' + daemon_version); Result := True; end; function Initialize: Boolean; var i: TUDisksMethod; begin Result := False; Inc(InitializeCounter); try if InitializeCounter > 1 then begin // Already initialized. Result := True; Exit; end; dbus_error_init(@error); conn := dbus_bus_get(DBUS_BUS_SYSTEM, @error); if CheckError('Cannot acquire connection to DBUS system bus', @error) then Exit; if Assigned(conn) then DBusConnectionOpen := True else Exit; // Disable exiting the application when it is disconnected from DBUS. dbus_connection_set_exit_on_disconnect(conn, 0); // Check if UDisks is running. if not CheckUDisksService then Exit; Observers := TUDisksObserverList.Create; dbus_error_init(@error); for i := Low(UDisksMethodStr) to High(UDisksMethodStr) do begin dbus_bus_add_match( conn, PChar(UDisksFilterStr + ',member=''' + UDisksMethodStr[i] + ''''), @error); CheckError('Cannot add matching rule', @error); end; Result := dbus_connection_add_filter(conn, @FilterFunc, nil, nil) <> 0; if not Result then Print('Cannot add filter for DBUS connection') else begin DBusFilterInstalled := True; Dummy := TDummy.Create; ConnTimer := TTimer.Create(nil); ConnTimer.Interval := 500; ConnTimer.OnTimer := @Dummy.OnTimer; ConnTimer.Enabled := True; end; finally if not Result then Finalize; end; end; procedure Finalize; var i: TUDisksMethod; begin Dec(InitializeCounter); if InitializeCounter <> 0 then // Don't finalize yet. Exit; if Assigned(ConnTimer) then FreeAndNil(ConnTimer); if DBusConnectionOpen then begin if DBusFilterInstalled then begin for i := Low(UDisksMethodStr) to High(UDisksMethodStr) do begin dbus_error_init(@error); dbus_bus_remove_match( conn, PChar(UDisksFilterStr + ',member=''' + UDisksMethodStr[i] + ''''), @error); CheckError('Cannot remove matching rule', @error); end; dbus_connection_remove_filter(conn, @FilterFunc, nil); DBusFilterInstalled := False; end; dbus_connection_unref(conn); DBusConnectionOpen := False; end; if Assigned(Observers) then FreeAndNil(Observers); if Assigned(Dummy) then FreeAndNil(Dummy); end; procedure DispatchMessages; begin if dbus_connection_read_write_dispatch(conn, 1) = 0 then DBusConnectionOpen := False; end; procedure AddObserver(Func: TUDisksDeviceNotify); begin if Observers.IndexOf(Func) < 0 then Observers.Add(Func); end; procedure RemoveObserver(Func: TUDisksDeviceNotify); begin Observers.Remove(Func); end; procedure TDummy.OnTimer(Sender: TObject); begin DispatchMessages; end; end. doublecmd-0.5.8/src/platform/unix/uunixterm.pas0000644000175000017500000005010511740433676020665 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Terminal emulator implementation. Copyright (C) 2008 Dmitry Kolomiets (B4rr4cuda@rambler.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uUnixTerm; {$mode objfpc}{$H+} interface uses Classes, SysUtils, BaseUnix, ExtCtrls, LCLProc, cwstring, LCLType, Graphics, termio, uTerminal, uOSUtils; {$IF NOT DEFINED(DARWIN)} {$LINKLIB util} // under Linux and BSD forkpty is situated in libutil.so library {$ENDIF} const clib = 'c'; C_stdin = 0; C_stdout = 1; C_stderr = 2; const {c_cc characters} CDISABLE = 255; //key // xterm default bindings CINTR = 003; // ^C CQUIT = 034; // ^\ CERASE = 177; // ^? CKILL = 025; // ^U CEOF = 004; // ^D CSTART = 021; // ^Q CSTOP = 023; // ^S CSUSP = 032; // ^Z CREPRINT = 022; // ^R CWERASE = 027; // ^W CLNEXT = 026; // ^V CDISCARD = 017; // ^O //disabled CTIME = 0; CMIN = 1; CSWTC = CDISABLE; CEOL = CDISABLE; CEOL2 = CDISABLE; const CSIList= '@'+ // Вставить N пустых символов. 'A'+ //Переместить курсор вверх на N рядов. 'B'+ //Переместить курсор вниз на N рядов. 'C'+ //Переместить курсор вправо на N столбцов. 'D'+ //Переместить курсор влево на N столбцов. 'E'+ //Переместить курсор вниз на N рядов, в столбец #1. 'F'+ //Переместить курсор вверх на N рядов, в столбец #1. 'G'+ //Переместить курсор в указанный столбец текущего ряда. 'H'+ //Переместить курсор в указанный ряд и столбец (начало в 1,1). 'J'+ //"Очистить" экран (по умолчанию от курсора до конца экрана). ESC [ 1 J: "очистить" от начала столбца до курсора. ESC [ 2 J: "очистить" весь экран. 'K'+ //"Очистить" строку (по умолчанию от курсора до ее конца). ESC [ 1 K: "очистить" от начала строки до курсора. ESC [ 2 K: "очистить" всю строку. 'L'+ //Вставить N пустых строк. 'M'+ //Удалить N строк. 'P'+ //Удалить (со смещением в строке) N символов в текущей строке. 'X'+ //"Очистить" (без смещения в строке) N символов в текущей строке. 'a'+ //Переместить курсор вправо на N столбцов. 'c'+ //Ответить ESC [ ? 6 c: `Я являюсь VT102'. 'd'+ //Переместить курсор в указанный ряд текущего столбца. 'e'+ //Переместить курсор вниз на N рядов. 'f'+ //Переместить курсор в указанный ряд и столбец. 'g'+ //Без параметров: "очистить" текущую позицию табуляции. ESC [ 3 g: удалить все позиции табуляции. 'h'+ //Режим установки 'l'+ //Режим сброса 'm'+ //Установка атрибутов 'n'+ //Отчет о статусе 'q'+ //Установить режимы работы индикаторов на клавиатуре. ESC [ 0 q: выключить все индикаторы ESC [ 1 q: включить индикатор "Scroll Lock" ESC [ 2 q: включить индикатор "Num Lock" ESC [ 3 q: включить индикатор "Caps Lock" 'r'+ //Установить область прокрутки; параметрами будут верхний и нижний ряды. 's'+ //Сохранить местоположение курсора. 'u'; //Восстановить местоположение курсора. //'`'+ //Переместить курсор в указанный столбец текущего ряда. const NCCS = 32; type Pwinsize = ^winsize; winsize = record ws_row : word; ws_col : word; ws_xpixel : word; ws_ypixel : word; end; __pid_t = longint; Pcc_t = ^cc_t; cc_t = char; Pspeed_t = ^speed_t; speed_t = dword; Ptcflag_t = ^tcflag_t; tcflag_t = dword; Ptermios = ^termios; termios = record c_iflag : tcflag_t; c_oflag : tcflag_t; c_cflag : tcflag_t; c_lflag : tcflag_t; c_line : cc_t; c_cc : array[0..(NCCS)-1] of cc_t; c_ispeed : speed_t; c_ospeed : speed_t; end; type { TUnixTerm } TUnixTerm = class(TTerminal) private FCols,Frows:integer; //--------------------- //--------------------- public //--------------------- constructor Create; destructor Destroy; override; { \\---------------------} function Read_Pty(var str:UTF8String; const timeout: longint=10): longint; override; // Read info from pty function Fork_pty(const rows,cols:integer; const cmd:UTF8string; const params:UTF8string=''):System.THandle; override; //Create new pty and start cmd function Write_pty(const str:UTF8string):boolean; override; //write str to pty //--------------------- function SendBreak_pty():boolean; override; // ^C function SendSignal_pty(Sig:Cint):boolean; override; function SetScreenSize(aCols,aRows:integer):boolean; override; function SetCurrentDir(const NewDir: UTF8String): Boolean; override; //--------------------- function KillShell:LongInt; override; function CSI_GetTaskId(const buf:UTF8string):integer; override; //get index of sequence in CSILast list end; { TConThread } TUnixConThread = class(TConsoleThread) private procedure AddSymbol; procedure CSIProc(NCode, Param: integer; ExParam: integer=0); procedure CSI_CaretTo(Y, X: integer); procedure CSI_Colors(const Param: integer); procedure WriteS(const s: UTF8String); protected procedure Execute; override; public constructor Create; destructor Destroy; override; end; function forkpty(__amaster:Plongint; __name:Pchar; __termp:Ptermios; __winp:Pwinsize):longint;cdecl;external clib name 'forkpty'; function setenv(__name:Pchar; __value:Pchar; __replace:longint):longint;cdecl;external clib name 'setenv'; function execl(__path:Pchar; __arg:Pchar):longint;cdecl;varargs;external clib name 'execl'; implementation uses uDebug; { TUnixConThread } procedure TUnixConThread.WriteS(const s:UTF8String); begin if not assigned(FOut) then exit; //Form1.CmdBox1.StopRead; FOut.Write(s); //Form1.CmdBox1.StartRead(clWhite,clBlack,'',clWhite,clBlack); end; procedure TUnixConThread.CSI_Colors(const Param:integer); begin if not assigned(FOut) then exit; with FOut do begin case Param of 0: TextColors(clWhite,clBlack);// сбросить все атрибуты в их значения по умолчанию 1: ;// установить жирный шрифт 2: ;// установить более яркий (имитированное цветом на цветном дисплее) 4: ;// установить подчеркивание (имитированное цветом на цветном дисплее); //цвета, используемые для имитации затемнения или подчеркивания, устанавливаются //при помощи ESC ] ... 5: ;// включить мерцание 7: ;// включить режим инвертированного видео 10: ;// сбросить выбранное распределение, флаги управления экраном //и переключить метафлаг 11: ;// выбрать null-распределение, установить флаг управления экраном, //сбросить переключатель метафлага. 12: ;// выбрать null-распределение, установить флаг управления экраном, //включить переключатель метафлага. Переключение метафлага //задает переключение старшего бита в байте //до его трансформации согласно таблице распределения. 21: ;// включить режим нормальной интенсивности (несовместимо с ECMA-48) 22: ;// выключить режим нормальной интенсивности 24: ;// выключить подчеркивание 25: ;// выключить мерцание 27: ;// выключить инвертированное видео 30:TextColor(clGray) ;// установить черный цвет символов 31:TextColor(clRed) ;// установить красный цвет символов 32:TextColor($0024F947) ;// установить зеленый цвет символов 33:TextColor($003A85CF) ;// установить коричневый цвет символов 34:TextColor(clBlue) ;// установить синий цвет символов 35:TextColor(clPurple) ;// установить сиреневый цвет символов 36:TextColor(clSkyBlue) ;// установить голубой цвет символов 37:TextColor(clWhite);// установить белый цвет символов 38:TextColor(clWhite);// включить подчеркивание, установить цвет символов по умолчанию 39:TextColor(clWhite) ;// выключить подчеркивание, установить цвет символов по умолчанию 40:TextBackground(clBlack) ;// установить черный цвет фона 41:TextBackground(clRed) ;// установить красный цвет фона 42:TextBackground(clGreen) ;// установить зеленый цвет фона 43:TextBackground(clRed) ;// установить коричневый цвет фона 44:TextBackground(clBlue) ;// установить синий цвет фона 45:TextBackground(clPurple) ;// установить сиреневый цвет фона 46:TextBackground(clSkyBlue) ;// установить голубой цвет фона 47:TextBackground(clWhite) ;// установить белый цвет фона 49:TextBackground(clBlack) ;// установить цвет фона по умолчанию end; end; end; procedure TUnixConThread.CSI_CaretTo(Y,X:integer); //хз x y или y x. Надо проверить. begin DCDebug(' Y: '+inttostr(Y)+' X: '+inttostr(X)); //Fout.OutY:=Y; //Fout.OutX:=X; end; procedure TUnixConThread.CSIProc(NCode, Param:integer; ExParam:integer=0); begin //DCDebug('Code:'+Inttostr(NCode)+' Param: '+inttostr(Param)); case NCode of 9:CSI_CaretTo(Param,ExParam); 24:CSI_Colors(Param); end; end; constructor TUnixConThread.Create; begin inherited Create(true); System.InitCriticalSection(FLock); Fterm:=TUnixTerm.Create; FRowsCount:=50; FColsCount:=100; end; destructor TUnixConThread.Destroy; begin FreeAndNil(fTerm); System.DoneCriticalSection(FLock); inherited Destroy; end; procedure TUnixConThread.Execute; begin FShell:=GetShell; if length(FShell)=0 then FShell:='/bin/bash'; if Assigned(fterm) then Fterm.Fork_pty(FRowsCount,FColsCount,FShell); while true do begin if Assigned(fterm) then begin if Fterm.Read_Pty(fbuf,0)>0 then Synchronize(@AddSymbol) else Sleep(1); end else break; end; end; //------------------------------------------------------ procedure TUnixConThread.AddSymbol; var SeqCode,SeqPrm,i,x:integer; es,s:UTF8string; esnow,CSINow:boolean; begin s:=''; es:=''; esnow:=false; CSInow:=false; for i:=1 to length(fbuf) do begin //разбор //------------------------------------------------------ if esnow then begin //------------------------------------------------------ if CSINow then begin //Пытаемся определить управляющий символ CSI последовательности SeqCode:=(fTerm.CSI_GetTaskId(es)); if SeqCode>0 then begin //разбор управляющей последовательности. //------------------------------------------------------ WriteS(s); s:=''; delete(es,1,1); delete(es,length(es),1); x:=pos(';',es); while x>0 do begin if tryStrToInt(copy(es,1,x-1),SeqPrm) then begin CSIProc(SeqCode,SeqPrm); delete(es,1,x); x:=pos(';',es); end else begin WriteS(copy(es,1,x-1)); delete(es,1,x); x:=pos(';',es); end; end; if es<>'' then begin if tryStrToInt(es,SeqPrm) then CSIProc(SeqCode,SeqPrm) else WriteS(es); end; //------------------------------------------------------ es:=''; esnow:=false; CSINow:=False; end else es:=es+fbuf[i]; end else es:=es+fbuf[i]; //------------------------------------------------------ end; //Начало управляющей последовательности if (fbuf[i]=#155) or ((fbuf[i]=#27)) then begin esnow:=true; //Начало CSI последовательности if (i#31) or (fbuf[i]=#13) or (fbuf[i]=#10)) then begin if fbuf[i]=#10 then begin if s<>'' then if Assigned(FOut) then FOut.Write(s+#10); s:=''; continue; end; if (fbuf[i]=#13) then if Assigned(FOut) then FOut.Write(#13); s:=s+fbuf[i]; end; //------------------------------------------------------ end; if s<>'' then begin if Assigned(FOut) then FOut.Write(s); end; end; //------------------------------------------------------ { TUnixTerm } function TUnixTerm.CSI_GetTaskId(const buf:UTF8string):integer; var Rez,L,R,M:integer; begin result:=0; if buf='' then exit; if buf[length(buf)]='`' then begin result:=length(CSIList)+1; exit; end; //бинарный поиск L:=0; R:=Length(CSIList); while (L<=R) do begin M:=(L+R) div 2; Rez:=CompareChar(CSIList[M],buf[length(buf)],1); if Rez=0 then begin Result:=M; exit; end else if Rez<0 then L:=M+1 else R:=M-1; end; result:=0; end; function TUnixTerm.Fork_pty(const rows, cols: integer; const cmd:UTF8string; const params:UTF8string=''): System.THandle; var ws:TWinSize; ChildPid:System.THandle; begin FCols:=cols; Frows:=rows; ws.ws_row:=rows; ws.ws_col:=cols; ws.ws_xpixel:=0; ws.ws_ypixel:=0; ChildPid:=forkpty(@Fpty,nil,nil,@ws); if ChildPid<0 then begin Result:=-1; Exit; end; if ChildPid=0 then begin //Child setenv('TERM', 'linux', 1); execl(pchar(cmd), pchar(params), nil); //если execl не сработал и новый процесс не подменил форкнутый, то ошибка fpWrite(C_stderr, pchar('execl() failed. Command: '+ cmd),length('execl() failed. Command: '+ cmd)); exit(127); // error exec'ing end; FChildPid:=ChildPid; Result:=ChildPid; end; function TUnixTerm.Read_Pty(var str:UTF8String; const timeout:longint=10):longint; var ifs:TFdSet; BytesRead:longint; buf:array [0..512] of char; begin Result:=0; if Fpty<0 then exit; //check if pty has new info for us fpFD_ZERO(ifs); fpFD_SET(Fpty,ifs); if FPSelect(fpty+1,@ifs,nil,nil,timeout)<=0 then exit; bytesread := fpread(fpty, buf, 512); result:=bytesread; str:=''; if bytesread <= 0 then exit; str:=copy(buf,0,BytesRead); end; function TUnixTerm.Write_pty(const str: UTF8string): boolean; var BytesWritten:TSize; i:integer; begin i:=1; result:=true; while i<=length(str) do begin BytesWritten:=fpwrite(Fpty,str[i],length(str[i])); result:=result and (BytesWritten>0); i:=i+1; end; end; function TUnixTerm.SendBreak_pty(): boolean; begin result:=SendSignal_pty(CINTR); end; function TUnixTerm.SendSignal_pty(Sig: Cint): boolean; var BytesWritten:TSize; begin BytesWritten:=fpwrite(Fpty,Sig,sizeof(sig)); Result := (BytesWritten>0); end; function TUnixTerm.SetScreenSize(aCols, aRows: integer): boolean; var ws:TWinSize; begin ws.ws_row:=aRows; ws.ws_col:=aCols; ws.ws_xpixel:=0; ws.ws_ypixel:=0; if FpIOCtl(Fpty,TIOCSWINSZ,@ws)=0 then begin Result:=true; FCols:=aCols; Frows:=aRows; end else Result:=false; end; function TUnixTerm.SetCurrentDir(const NewDir: UTF8String): Boolean; begin Result:= Write_pty(' cd "' + NewDir + '"' + #13); end; function TUnixTerm.KillShell: LongInt; begin //FchildPid must be >0 in other case all processes in this group will be killed if FChildPid>0 then result:=fpkill(FChildPid,SIGKILL) else result:=-1; end; constructor TUnixTerm.Create; var tio:termio.termios; begin TCGetAttr(Fpty,tio); tio.c_iflag:=BRKINT or IGNPAR or ICRNL or IXON; tio.c_oflag:=OPOST or ONLCR; tio.c_cflag:=CS8 or CREAD; tio.c_lflag:=ISIG or ICANON or IEXTEN or ECHO or ECHOE or ECHOK or ECHOKE or ECHOCTL; tio.c_cc[VINTR]:=CINTR; tio.c_cc[VQUIT]:=CQUIT; tio.c_cc[VERASE]:=CERASE; tio.c_cc[VKILL]:=CKILL; tio.c_cc[VSTART]:=CSTART; tio.c_cc[VSTOP]:=CSTOP; tio.c_cc[VSUSP]:=CSUSP; tio.c_cc[VREPRINT]:=CREPRINT; tio.c_cc[VDISCARD]:=CDISCARD; tio.c_cc[VWERASE]:=CWERASE; tio.c_cc[VLNEXT]:=CLNEXT; tio.c_cc[VEOF]:=CEOF; tio.c_cc[VEOL]:=CEOL; tio.c_cc[VEOL2]:=CEOL2; {$IF DEFINED(LINUX)} tio.c_cc[VSWTC]:=CSWTC; {$ENDIF} tio.c_cc[VMIN]:=CMIN; tio.c_cc[VTIME]:=CTIME; TCSetAttr(Fpty,TCSANOW,tio); end; destructor TUnixTerm.Destroy; begin KillShell; inherited Destroy; end; end. {// thr.Terminal.Write_pty(#27+'[21~'); //F10 // thr.Terminal.Write_pty(#27+'[D'); //Left // thr.Terminal.Write_pty(#27+'[3~'); //delete } doublecmd-0.5.8/src/platform/ukeyboard.pas0000644000175000017500000010005112102526115017603 0ustar alexxalexx{ This unit handles anything regarding keyboard and keys. It is heavily dependent on operating system and widget set. For MSWINDOWS and Unix GTK1/2, QT. } unit uKeyboard; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LCLType; type TMenuKeyCap = (mkcBkSp, mkcTab, mkcEsc, mkcEnter, mkcSpace, mkcPgUp, mkcPgDn, mkcEnd, mkcHome, mkcLeft, mkcUp, mkcRight, mkcDown, mkcIns, mkcDel, mkcShift, mkcCtrl, mkcAlt, mkcWin, mkcNumDivide, mkcNumMultiply, mkcNumAdd, mkcNumSubstract); const SmkcBkSp = 'BkSp'; SmkcTab = 'Tab'; SmkcEsc = 'Esc'; SmkcEnter = 'Enter'; SmkcSpace = 'Space'; SmkcPgUp = 'PgUp'; SmkcPgDn = 'PgDn'; SmkcEnd = 'End'; SmkcHome = 'Home'; SmkcLeft = 'Left'; SmkcUp = 'Up'; SmkcRight = 'Right'; SmkcDown = 'Down'; SmkcIns = 'Ins'; SmkcDel = 'Del'; SmkcShift = 'Shift+'; SmkcCtrl = 'Ctrl+'; SmkcAlt = 'Alt+'; SmkcWin = 'WinKey+'; SmkcNumDivide = 'Num/'; SmkcNumMultiply = 'Num*'; SmkcNumAdd = 'Num+'; SmkcNumSubstract = 'Num-'; MenuKeyCaps: array[TMenuKeyCap] of string = ( SmkcBkSp, SmkcTab, SmkcEsc, SmkcEnter, SmkcSpace, SmkcPgUp, SmkcPgDn, SmkcEnd, SmkcHome, SmkcLeft, SmkcUp, SmkcRight, SmkcDown, SmkcIns, SmkcDel, SmkcShift, SmkcCtrl, SmkcAlt, SmkcWin, SmkcNumDivide, SmkcNumMultiply, SmkcNumAdd, SmkcNumSubstract); // Modifiers that can be used for shortcuts (non-toggable). KeyModifiersShortcut = [ssShift, ssAlt, ssCtrl, ssMeta, ssSuper, ssHyper, ssAltGr]; // Modifiers that change meaning of entered text (case, non-ASCII characters). KeyModifiersText = [ssShift, ssAltGr, ssCaps]; // Modifiers that can be used for shortcuts without taking into account text modifiers. KeyModifiersShortcutNoText = KeyModifiersShortcut - KeyModifiersText; {en Retrieves current modifiers state of the keyboard. } function GetKeyShiftStateEx: TShiftState; function KeyToShortCutEx(Key: Word; Shift: TShiftState): TShortCut; function ModifiersTextToShortcutEx(const ModifiersText: String; out ModLength: Integer): TShortCut; {en Changes order of modifiers in text to always be the same. } function NormalizeModifiers(ShortCutText: String): String; function ShiftToShortcutEx(ShiftState: TShiftState): TShortCut; function ShiftToTextEx(ShiftState: TShiftState): String; function ShortcutToShiftEx(Shortcut: TShortCut): TShiftState; function ShortCutToTextEx(ShortCut: TShortCut): String; function TextToShortCutEx(const ShortCutText: String): TShortCut; {en Tries to translate virtual key (VK_..) into a valid UTF8 character, taking into account modifiers state. @param(Key Virtual key code.) @param(ShiftState Keyboard modifiers that should be taken into account when determining the character.) } function VirtualKeyToUTF8Char(Key: Byte; ShiftState: TShiftState = []): TUTF8Char; {en Returns text description of a virtual key trying to take into account given modifiers state. For keys that have characters assigned it usually returns that character, for others some textual description. @param(Key Virtual key code.) @param(ShiftState Keyboard modifiers that should be taken into account when determining the description.) @return(UTF8 character assigned to Key or an empty string.) } function VirtualKeyToText(Key: Byte; ShiftState: TShiftState = []): string; {$IFDEF MSWINDOWS} {en If a virtual key with any modifiers produces valid ANSI or UNICODE character, that character is returned in UTF8 encoding. @param(Key Virtual key code.) @param(ExcludeShiftState Which modifiers should not be taken into account when determining possible character.) @return(UTF8 character assigned to Key or an empty string.) } function GetInternationalCharacter(Key: Word; ExcludeShiftState: TShiftState = []): TUTF8Char; {$ENDIF} {en Initializes keyboard module. Should be called after Application.Initialize. } procedure InitializeKeyboard; procedure CleanupKeyboard; {en Should be called after main form has been created. } procedure HookKeyboardLayoutChanged; {en Should be called whenever a keyboard layout modification is detected. } procedure OnKeyboardLayoutChanged; {$IFDEF MSWINDOWS} var // True, if the current keyboard layout's right Alt key is mapped as AltGr. HasKeyboardAltGrKey : Boolean = False; {$ENDIF} implementation {$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN)} {$DEFINE X11} {$ENDIF} uses LCLProc, LCLIntf {$IF DEFINED(MSWINDOWS)} , Windows, Win32Proc {$ENDIF} {$IF DEFINED(LCLGTK)} , Gdk, GLib , GtkProc , XLib, X {$ENDIF} {$IF DEFINED(LCLGTK2)} , Gdk2, GLib2, Gtk2Extra , Gtk2Proc {$ENDIF} {$IF DEFINED(X11) and DEFINED(LCLQT)} , qt4, qtwidgets , XLib, X , xutil, KeySym , Forms // for Application.MainForm {$ENDIF} ; const scWin = $1000; type TModifiersMap = record Shift: TShiftStateEnum; Shortcut: TShortCut; Text: TMenuKeyCap; end; const ModifiersMap: array [0..3] of TModifiersMap = ((Shift: ssCtrl; Shortcut: scCtrl; Text: mkcCtrl), (Shift: ssShift; Shortcut: scShift; Text: mkcShift), (Shift: ssAlt; Shortcut: scAlt; Text: mkcAlt), (Shift: ssSuper; Shortcut: scWin; Text: mkcWin)); {$IF DEFINED(X11)} var {$IF DEFINED(LCLGTK)} XDisplay: PDisplay = nil; {$ELSEIF DEFINED(LCLGTK2)} XDisplay: PGdkDisplay = nil; {$ELSEIF DEFINED(LCLQT)} XDisplay: PDisplay = nil; {$ENDIF} {$ENDIF} {$IF DEFINED(UNIX) and (DEFINED(LCLGTK) or DEFINED(LCLGTK2))} var // This is set to a virtual key number that AltGr is mapped on. VK_ALTGR: Byte = VK_UNDEFINED; {$IF DEFINED(LCLGTK2)} KeysChangesSignalHandlerId : gulong = 0; {$ENDIF} {$ENDIF} {$IF DEFINED(X11) and DEFINED(LCLQT)} type TKeyboardLayoutChangedHook = class private EventHook: QObject_hookH; function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; // called by QT public constructor Create(QObject: QObjectH); destructor Destroy; override; end; var // Used to catch "keyboard layout modified" event. KeyboardLayoutChangedHook: TKeyboardLayoutChangedHook = nil; ShiftMask : Cardinal = 0; AltGrMask : Cardinal = 0; {$ENDIF} var VKToCharArray: array[Low(Byte)..High(Byte)] of UTF8String; {$IF DEFINED(LCLGTK)} function XKeycodeToKeysym(para1:PDisplay; para2:TKeyCode; index:integer):TKeySym;cdecl;external libX11; {$ENDIF} procedure CacheVKToChar; var Key: Byte; begin for Key := Low(VKToCharArray) to High(VKToCharArray) do case Key of VK_BACK: VKToCharArray[Key] := MenuKeyCaps[mkcBkSp]; VK_TAB: VKToCharArray[Key] := MenuKeyCaps[mkcTab]; VK_RETURN: VKToCharArray[Key] := MenuKeyCaps[mkcEnter]; VK_ESCAPE: VKToCharArray[Key] := MenuKeyCaps[mkcEsc]; VK_SPACE..VK_DOWN: VKToCharArray[Key] := MenuKeyCaps[TMenuKeyCap(Ord(mkcSpace) + Key - VK_SPACE)]; VK_INSERT: VKToCharArray[Key] := MenuKeyCaps[mkcIns]; VK_DELETE: VKToCharArray[Key] := MenuKeyCaps[mkcDel]; VK_0..VK_9: VKToCharArray[Key] := Chr(Key - VK_0 + Ord('0')); VK_A..VK_Z: VKToCharArray[Key] := Chr(Key - VK_A + Ord('A')); VK_NUMPAD0..VK_NUMPAD9: VKToCharArray[Key] := Chr(Key - VK_NUMPAD0 + Ord('0')); VK_DIVIDE: VKToCharArray[Key] := MenuKeyCaps[mkcNumDivide]; VK_MULTIPLY: VKToCharArray[Key] := MenuKeyCaps[mkcNumMultiply]; VK_SUBTRACT: VKToCharArray[Key] := MenuKeyCaps[mkcNumSubstract]; VK_ADD: VKToCharArray[Key] := MenuKeyCaps[mkcNumAdd]; VK_F1..VK_F24: VKToCharArray[Key] := 'F' + IntToStr(Key - VK_F1 + 1); else VKToCharArray[Key] := VirtualKeyToUTF8Char(Key, []); end; end; {$IF DEFINED(X11) and DEFINED(LCLQT)} {en Retrieves the character and respective modifiers state for the given keysym and given level. } procedure XKeysymToUTF8Char(XKeysym: TKeySym; ShiftLevel: Cardinal; out ShiftState: TShiftState; out KeyChar: TUTF8Char); var XKeycode: TKeyCode; XKeyEvent: TXKeyEvent; KeySymChars: array[0..16] of Char; KeySymCharLen: Integer; Level: Integer; begin KeyChar := ''; ShiftState := []; XKeycode := XKeysymToKeycode(XDisplay, XKeysym); if XKeycode <> 0 then begin // 4 levels - two groups of two characters each (unshifted/shifted). // AltGr is usually the group switch. for Level := 0 to 3 do begin if XKeysym = XKeycodeToKeysym(XDisplay, XKeyCode, Level) then begin // Init dummy XEvent to retrieve the char corresponding to the keycode. FillChar(XKeyEvent, SizeOf(XKeyEvent), 0); XKeyEvent._Type := KeyPress; XKeyEvent.Display := XDisplay; XKeyEvent.Same_Screen := TBool(1); // True XKeyEvent.KeyCode := XKeyCode; case ShiftLevel of 0: XKeyEvent.State := 0; // 1st group 1: XKeyEvent.State := ShiftMask; // 1st group 2: XKeyEvent.State := AltGrMask; // 2nd group 3: XKeyEvent.State := AltGrMask or ShiftMask; // 2nd group else XKeyEvent.State := 0; end; // Retrieve the character for this KeySym. KeySymCharLen := XLookupString(@XKeyEvent, KeySymChars, SizeOf(KeySymChars), nil, nil); // Delete ending zero. if (KeySymCharLen > 0) and (KeySymChars[KeySymCharLen - 1] = #0) then Dec(KeySymCharLen); if KeySymCharLen > 0 then begin SetString(KeyChar, KeySymChars, KeySymCharLen); // Get modifier keys of the found keysym. case Level of 0: ShiftState := []; 1: ShiftState := [ssShift]; 2: ShiftState := [ssAltGr]; 3: ShiftState := [ssShift, ssAltGr]; end; end; Exit; end end; end; end; {$ENDIF} function GetKeyShiftStateEx: TShiftState; function IsKeyDown(Key: Integer): Boolean; begin Result := (GetKeyState(Key) and $8000)<>0; end; begin Result:=[]; {$IFDEF MSWINDOWS} if HasKeyboardAltGrKey then begin // Windows maps AltGr as Ctrl+Alt combination, so if AltGr is pressed, // it cannot be detected if Ctrl is pressed too. Therefore if AltGr // is pressed we don't include Ctrl in the result. Unless Left Alt is also // pressed - then we do include it under the assumption that the user // pressed Ctrl+Left Alt. The limitation is that a combination of // LeftAlt + AltGr is reported as [ssCtrl, ssAlt, ssAltGr]. if IsKeyDown(VK_LCONTROL) and ((not IsKeyDown(VK_RMENU)) or IsKeyDown(VK_LMENU)) then Include(Result,ssCtrl); if IsKeyDown(VK_RMENU) then Include(Result,ssAltGr); end else {$ENDIF} begin if IsKeyDown(VK_RMENU) or IsKeyDown(VK_MENU) then Include(Result,ssAlt); if IsKeyDown(VK_LCONTROL) or IsKeyDown(VK_CONTROL) then Include(Result,ssCtrl); end; {$IF DEFINED(UNIX) and (DEFINED(LCLGTK) or DEFINED(LCLGTK2))} if (VK_ALTGR <> VK_UNDEFINED) and IsKeyDown(VK_ALTGR) then Include(Result,ssAltGr); {$ENDIF} {$IF DEFINED(X11) and DEFINED(LCLQT)} // QtGroupSwitchModifier is only recognized on X11. if (QApplication_keyboardModifiers and QtGroupSwitchModifier) > 0 then Include(Result,ssAltGr); {$ENDIF} if IsKeyDown(VK_RCONTROL) then Include(Result,ssCtrl); if IsKeyDown(VK_LMENU) then Include(Result,ssAlt); if IsKeyDown(VK_SHIFT) then Include(Result,ssShift); if IsKeyDown(VK_LWIN) or IsKeyDown(VK_RWIN) then Include(Result,ssSuper); if (GetKeyState(VK_CAPITAL) and $1)<>0 then // Caps-lock toggled Include(Result,ssCaps); end; function KeyToShortCutEx(Key: Word; Shift: TShiftState): TShortCut; begin Result := (Key and $FF) or ShiftToShortcutEx(Shift); end; function ModifiersTextToShortcutEx(const ModifiersText: String; out ModLength: Integer): TShortCut; var StartPos: Integer; i: Integer = 0; Found: Boolean = True; function CompareFront(const Front: String): Boolean; begin if (Front <> '') and (StartPos + length(Front) - 1 <= length(ModifiersText)) and (AnsiStrLIComp(@ModifiersText[StartPos], PChar(Front), Length(Front)) = 0) then begin Result := True; Inc(StartPos, length(Front)); end else Result := False; end; begin Result := 0; StartPos := 1; while Found do begin Found := False; for i := Low(ModifiersMap) to High(ModifiersMap) do begin if CompareFront(MenuKeyCaps[ModifiersMap[i].Text]) then begin Result := Result or ModifiersMap[i].Shortcut; Found := True; Break; end; end; end; ModLength := StartPos - 1; end; function NormalizeModifiers(ShortCutText: String): String; var ModLength: Integer; Shortcut: TShortCut; begin Shortcut := ModifiersTextToShortcutEx(ShortCutText, ModLength); Result := ShiftToTextEx(ShortcutToShiftEx(Shortcut)) + Copy(ShortCutText, ModLength + 1, MaxInt); end; function ShiftToShortcutEx(ShiftState: TShiftState): TShortCut; var i: Integer; begin Result := 0; for i := Low(ModifiersMap) to High(ModifiersMap) do begin if ModifiersMap[i].Shift in ShiftState then Inc(Result, ModifiersMap[i].Shortcut); end; end; function ShiftToTextEx(ShiftState: TShiftState): String; var i: Integer; begin Result := EmptyStr; for i := Low(ModifiersMap) to High(ModifiersMap) do begin if ModifiersMap[i].Shift in ShiftState then Result := Result + MenuKeyCaps[ModifiersMap[i].Text]; end; end; function ShortcutToShiftEx(Shortcut: TShortCut): TShiftState; var i: Integer; begin Result := []; for i := Low(ModifiersMap) to High(ModifiersMap) do begin if Shortcut and ModifiersMap[i].Shortcut <> 0 then Include(Result, ModifiersMap[i].Shift); end; end; function ShortCutToTextEx(ShortCut: TShortCut): String; begin Result := VirtualKeyToText(Byte(ShortCut and $FF), ShortcutToShiftEx(ShortCut)); end; function TextToShortCutEx(const ShortCutText: String): TShortCut; var Key: TShortCut; Shift: TShortCut; Name: String; StartPos: Integer; begin Result := 0; Shift := ModifiersTextToShortcutEx(ShortCutText, StartPos); Inc(StartPos); // Get text for the key if anything left in the string. if StartPos <= Length(ShortCutText) then begin { Copy range from table in ShortCutToText } for Key := $08 to $FF do begin Name := VirtualKeyToText(Key); if (Name <> '') and (length(Name) = length(ShortCutText) - StartPos + 1) and (AnsiStrLIComp(@ShortCutText[StartPos], PChar(Name), length(Name)) = 0) then begin Exit(Key or Shift); end; end; end; end; function VirtualKeyToUTF8Char(Key: Byte; ShiftState: TShiftState): TUTF8Char; {$IF DEFINED(UNIX) and (DEFINED(LCLGTK) or DEFINED(LCLGTK2) or DEFINED(LCLQT))} function ShiftStateToXModifierLevel(ShiftState: TShiftState): Cardinal; begin Result := 0; if ssShift in ShiftState then Result := Result or 1; if ssAltGr in ShiftState then Result := Result or 2; end; {$ENDIF} var {$IF DEFINED(UNIX) and (DEFINED(LCLGTK) or DEFINED(LCLGTK2))} KeyInfo: TVKeyInfo; {$ENDIF} ShiftedChar: Boolean; {$IF DEFINED(X11) and DEFINED(LCLQT)} KeyChar:TUTF8Char; KeySym: TKeySym; TempShiftState: TShiftState; {$ENDIF} begin Result := ''; // Upper case if either caps-lock is toggled or shift pressed. ShiftedChar := (ssCaps in ShiftState) xor (ssShift in ShiftState); {$IF DEFINED(MSWINDOWS)} Result := GetInternationalCharacter(Key, GetKeyShiftStateEx - ShiftState); {$ELSEIF DEFINED(UNIX) and (DEFINED(LCLGTK) or DEFINED(LCLGTK2))} KeyInfo := GetVKeyInfo(Key); // KeyInfo.KeyChar contains characters according to modifiers: // [0] - unshifted [2] - unshifted + AltGr // [1] - shifted [3] - shifted + AltGr // Caps-lock is handled below with ShiftedChar variable. Result := KeyInfo.KeyChar[ShiftStateToXModifierLevel(ShiftState)]; {$ELSEIF DEFINED(X11) and DEFINED(LCLQT)} // For QT we'll use Xlib to get text for a key. KeySym := 0; case Key of VK_0..VK_9: Result := Char(Ord('0') + Key - VK_0); VK_A..VK_Z: Result := Char(Ord('A') + Key - VK_A); VK_NUMPAD0.. VK_NUMPAD9: Result := Char(Ord('0') + Key - VK_NUMPAD0); VK_MULTIPLY: KeySym := XK_KP_Multiply; VK_ADD: KeySym := XK_KP_Add; VK_SUBTRACT: KeySym := XK_KP_Subtract; VK_DIVIDE: KeySym := XK_KP_Divide; // These VKs might only work for US-layout keyboards. VK_OEM_PLUS: KeySym := XK_plus; VK_OEM_MINUS: KeySym := XK_minus; VK_OEM_COMMA: KeySym := XK_comma; VK_OEM_PERIOD: KeySym := XK_period; VK_SEPARATOR: KeySym := XK_comma; VK_DECIMAL: KeySym := XK_period; VK_OEM_1: KeySym := XK_semicolon; VK_OEM_3: KeySym := XK_quoteleft; VK_OEM_4: KeySym := XK_bracketleft; VK_OEM_5: KeySym := XK_backslash; VK_OEM_6: KeySym := XK_bracketright; VK_OEM_7: KeySym := XK_apostrophe; // Some additional keys for QT not mapped in TQtWidget.QtKeyToLCLKey. // Based on QT sources: src/gui/kernel/qkeymapper_x11.cpp. QtKey_Bar: KeySym := XK_bar; QtKey_Underscore: KeySym := XK_underscore; QtKey_Question: KeySym := XK_question; QtKey_AsciiCircum: KeySym := XK_asciicircum; // $C1 - $DA not used VK space // Some of these keys (not translated in QtKeyToLCLKey) are on international keyboards. QtKey_Aacute: KeySym := XK_aacute; QtKey_Acircumflex: KeySym := XK_acircumflex; QtKey_Atilde: KeySym := XK_atilde; QtKey_Adiaeresis: KeySym := XK_adiaeresis; QtKey_Aring: KeySym := XK_aring; QtKey_AE: KeySym := XK_ae; QtKey_Ccedilla: KeySym := XK_ccedilla; QtKey_Egrave: KeySym := XK_egrave; QtKey_Eacute: KeySym := XK_eacute; QtKey_Ecircumflex: KeySym := XK_ecircumflex; QtKey_Ediaeresis: KeySym := XK_ediaeresis; QtKey_Igrave: KeySym := XK_igrave; QtKey_Iacute: KeySym := XK_iacute; QtKey_Icircumflex: KeySym := XK_icircumflex; QtKey_Idiaeresis: KeySym := XK_idiaeresis; QtKey_ETH: KeySym := XK_eth; QtKey_Ntilde: KeySym := XK_ntilde; QtKey_Ograve: KeySym := XK_ograve; QtKey_Oacute: KeySym := XK_oacute; QtKey_Ocircumflex: KeySym := XK_ocircumflex; QtKey_Otilde: KeySym := XK_otilde; QtKey_Odiaeresis: KeySym := XK_odiaeresis; QtKey_multiply: KeySym := XK_multiply; QtKey_Ooblique: KeySym := XK_ooblique; QtKey_Ugrave: KeySym := XK_ugrave; QtKey_Uacute: KeySym := XK_uacute; end; if KeySym <> 0 then begin // Get character for a key with the given keysym // and with given modifiers applied. // Don't care about modifiers state, because we already have it. XKeysymToUTF8Char(KeySym, ShiftStateToXModifierLevel(ShiftState), TempShiftState, KeyChar); Result := KeyChar; end; {$ELSE} {$ENDIF} // Make upper case if either caps-lock is toggled or shift pressed. if Result <> '' then begin if ShiftedChar then Result := UTF8UpperCase(Result) else Result := UTF8LowerCase(Result); end; end; function VirtualKeyToText(Key: Byte; ShiftState: TShiftState): string; var Name: string; {$IF DEFINED(X11) and DEFINED(LCLQT)} KeyChar: TUTF8Char; KeySym: TKeySym; TempShiftState: TShiftState; {$ENDIF} begin {$IF DEFINED(X11) and DEFINED(LCLQT)} // Overwrite behaviour for some keys in QT. KeySym := 0; case Key of QtKey_Bar: KeySym := XK_bar; // VK_F13 QtKey_Underscore: KeySym := XK_underscore; // VK_SLEEP // '+' (XK_plus) and 'numpad +' (XK_KP_Add) are both reported as VK_ADD (QtKey_Plus) VK_ADD: KeySym := XK_KP_Add; // '*' (XK_multiply) and 'numpad *' (XK_KP_Multiply) are both reported as VK_MULTIPLY (QtKey_Asterisk) VK_MULTIPLY: KeySym := XK_KP_Multiply; end; if KeySym <> 0 then begin // Get base character for a key with the given keysym. // Don't care about modifiers state, because we already have it. XKeysymToUTF8Char(KeySym, 0, TempShiftState, KeyChar); Name := KeyChar; end else {$ENDIF} Name := VKToCharArray[Key]; if Name <> '' then Result := ShiftToTextEx(ShiftState) + Name else Result := ''; end; {$IF DEFINED(UNIX) and (DEFINED(LCLGTK) or DEFINED(LCLGTK2))} procedure UpdateGtkAltGrVirtualKeyCode; var VKNr: Byte; KeyInfo: TVKeyInfo; {$IFDEF LCLGTK2} GdkKey: TGdkKeymapKey = (KeyCode: 0; Group: 0; Level: 0); {$ENDIF} KeyVal: guint; begin VK_ALTGR := VK_UNDEFINED; // Search all virtual keys for a scancode of AltGraph. for VKNr := Low(Byte) to High(Byte) do begin KeyInfo := GetVKeyInfo(VKNr); if (KeyInfo.KeyCode[True] = 0) and // not extended (KeyInfo.KeyCode[False] <> 0) then begin {$IFDEF LCLGTK} KeyVal := XKeycodetoKeysym(XDisplay, KeyInfo.KeyCode[False], 0); if KeyVal = GDK_ISO_Level3_Shift then // AltGraph {$ELSE} GdkKey.keycode := KeyInfo.keycode[False]; KeyVal := gdk_keymap_lookup_key( gdk_keymap_get_for_display(XDisplay), @GdkKey); if KeyVal = GDK_KEY_ISO_Level3_Shift then // AltGraph {$ENDIF} begin VK_ALTGR := VKNr; Exit; end; end; end; end; {$ENDIF} {$IFDEF MSWINDOWS} function GetInternationalCharacter(Key: Word; ExcludeShiftState: TShiftState): TUTF8Char; var KeyboardState: array [0..255] of byte; wideChars: widestring; asciiChar: AnsiChar; IntResult: LongInt; function IsKeyDown(Key: Byte): Boolean; begin Result := (KeyboardState[Key] and $80)<>0; end; begin Result := ''; SetLength(wideChars, 16); // should be enough Windows.GetKeyboardState(KeyboardState); // Exclude not wanted modifiers. if ssCtrl in ExcludeShiftState then begin KeyboardState[VK_RCONTROL] := 0; if (not HasKeyboardAltGrKey) or (ssAltGr in ExcludeShiftState) or (not IsKeyDown(VK_RMENU)) // if AltGr not pressed then KeyboardState[VK_LCONTROL] := 0; end; if ssAlt in ExcludeShiftState then begin KeyboardState[VK_LMENU] := 0; if (not HasKeyboardAltGrKey) then KeyboardState[VK_RMENU] := 0; end; if ssAltGr in ExcludeShiftState then begin KeyboardState[VK_RMENU] := 0; if not IsKeyDown(VK_LMENU) then // if Left Alt not pressed KeyboardState[VK_LCONTROL] := 0; end; if ssCaps in ExcludeShiftState then KeyboardState[VK_CAPITAL] := 0; if ssShift in ExcludeShiftState then begin KeyboardState[VK_LSHIFT] := 0; KeyboardState[VK_RSHIFT] := 0; KeyboardState[VK_SHIFT] := 0; end; if (not IsKeyDown(VK_LCONTROL)) and (not IsKeyDown(VK_RCONTROL)) then KeyboardState[VK_CONTROL] := 0; if (not IsKeyDown(VK_LMENU)) and (not IsKeyDown(VK_RMENU)) then KeyboardState[VK_MENU] := 0; if Win32Proc.UnicodeEnabledOS then begin IntResult := Windows.ToUnicode(Key, 0, @KeyboardState, PWChar(wideChars), Length(wideChars), 0); if IntResult = 1 then Result := UTF8Copy(UTF16ToUTF8(wideChars), 1, 1); end else begin IntResult := Windows.ToAscii(Key, 0, @KeyboardState, @asciiChar, 0); if IntResult = 1 then Result := AnsiToUtf8(string(asciiChar)); end; end; procedure UpdateKeyboardLayoutAltGrFlag; type PKBDTABLES = ^KBDTABLES; KBDTABLES = record // not packed pCharModifers: Pointer; pVkToWCharTable: Pointer; pDeadKey: Pointer; pKeyNames: Pointer; pKeyNamesExt: Pointer; pKeyNamesDead: Pointer; pUsVscToVk: Pointer; MaxVscToVk: Byte; pVSCToVk_E0: Pointer; pVSCToVk_E1: Pointer; LocalFlags: DWORD; // <-- we only need this LgMaxD: Byte; cbLgEntry: Byte; pLigature: Pointer; end; const KBDTABLE_VERSION = 1; // Flags KLLF_ALTGR = 1; //KLLF_SHIFTLOCK = 2; //KLLF_LRM_RLM = 4; function GetKeyboardLayoutFileName: WideString; var KeyHandle: HKEY; KeyboardLayoutName: array [0..KL_NAMELENGTH-1] of WChar; RegistryKey : WideString = 'SYSTEM\CurrentControlSet\Control\Keyboard Layouts\'; RegistryValue: WideString = 'Layout File'; BytesNeeded: DWORD; begin Result := ''; // Get current keyboard layout ID. if GetKeyboardLayoutNameW(KeyboardLayoutName) then begin RegistryKey := RegistryKey + PWChar(KeyboardLayoutName); // Read corresponding layout dll name from registry. if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, PWChar(RegistryKey), 0, KEY_QUERY_VALUE, @KeyHandle) = ERROR_SUCCESS) and (KeyHandle <> 0) then begin if RegQueryValueExW(KeyHandle, PWChar(RegistryValue), nil, nil, nil, @BytesNeeded) = ERROR_SUCCESS then begin SetLength(Result, BytesNeeded div SizeOf(WChar)); if RegQueryValueExW(KeyHandle, PWChar(RegistryValue), nil, nil, PByte(PWChar(Result)), @BytesNeeded) = ERROR_SUCCESS then begin Result := Result + #0; // end with zero to be sure end; end; RegCloseKey(KeyHandle); end; end; end; function GetKeyboardLayoutAltGrFlag(LayoutDllFileName: WideString): Boolean; type TKbdLayerDescriptor = function: PKBDTABLES; stdcall; var Handle: HMODULE; KbdLayerDescriptor: TKbdLayerDescriptor; Tables: PKBDTABLES; begin Result := False; // Load the keyboard layout dll. Handle := LoadLibraryW(PWChar(LayoutDllFileName)); if Handle <> 0 then begin KbdLayerDescriptor := TKbdLayerDescriptor(GetProcAddress(Handle, 'KbdLayerDescriptor')); if Assigned(KbdLayerDescriptor) then begin // Get the layout tables. Tables := KbdLayerDescriptor(); if Assigned(Tables) and (HIWORD(Tables^.LocalFlags) = KBDTABLE_VERSION) then begin // Read AltGr flag. Result := Boolean(Tables^.LocalFlags and KLLF_ALTGR); end; end; FreeLibrary(Handle); end; end; var FileName: WideString; begin HasKeyboardAltGrKey := False; FileName := GetKeyboardLayoutFileName; if FileName <> '' then HasKeyboardAltGrKey := GetKeyboardLayoutAltGrFlag(FileName); end; {$ENDIF} {$IF DEFINED(X11) and DEFINED(LCLQT)} procedure UpdateModifiersMasks; var Map: PXModifierKeymap; KeyCode: PKeyCode; KeySym: TKeySym; ModifierNr, l, Level: Integer; begin ShiftMask := 0; AltGrMask := 0; if Assigned(XDisplay) then begin Map := XGetModifierMapping(XDisplay); if Assigned(Map) then begin KeyCode := Map^.modifiermap; for ModifierNr := 0 to 7 do // Xlib uses up to 8 modifiers. begin // Scan through possible keycodes for each modifier. // We're looking for the keycodes assigned to Shift and AltGr. for l := 1 to Map^.max_keypermod do begin if KeyCode^ <> 0 then // Omit zero keycodes. begin for Level := 0 to 3 do // Check group 1 and group 2 (each has 2 keysyms) begin // Translate each keycode to keysym and check // if this is the modifier we are looking for. KeySym := XKeycodeToKeysym(XDisplay, KeyCode^, Level); // If found, assign mask according the the modifier number // (Shift by default should be the first modifier). case KeySym of XK_Mode_switch: AltGrMask := 1 shl ModifierNr; XK_Shift_L, XK_Shift_R: ShiftMask := 1 shl ModifierNr; end; end; end; Inc(KeyCode); end; end; XFreeModifiermap(Map); end; end; end; {$ENDIF} procedure OnKeyboardLayoutChanged; begin {$IFDEF MSWINDOWS} UpdateKeyboardLayoutAltGrFlag; {$ENDIF} {$IF DEFINED(UNIX) and (DEFINED(LCLGTK) or DEFINED(LCLGTK2))} UpdateGtkAltGrVirtualKeyCode; {$ENDIF} {$IF DEFINED(X11) and DEFINED(LCLQT)} UpdateModifiersMasks; {$ENDIF} CacheVKToChar; end; {$IF DEFINED(X11) and DEFINED(LCLQT)} constructor TKeyboardLayoutChangedHook.Create(QObject: QObjectH); begin EventHook := QObject_hook_create(QObject); if Assigned(EventHook) then begin QObject_hook_hook_events(EventHook, @EventFilter); end; end; destructor TKeyboardLayoutChangedHook.Destroy; begin if Assigned(EventHook) then begin QObject_hook_destroy(EventHook); EventHook := nil; end; end; function TKeyboardLayoutChangedHook.EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; begin Result := False; // Don't filter any events. // Somehow this event won't be sent to the window, // unless the user first presses a key inside it. if QEvent_type(Event) = QEventKeyboardLayoutChange then begin OnKeyboardLayoutChanged; end; end; {$ENDIF} {$IF DEFINED(UNIX)} {$IF DEFINED(LCLGTK)} function EventHandler(GdkXEvent: PGdkXEvent; GdkEvent: PGdkEvent; Data: gpointer): TGdkFilterReturn; cdecl; var XEvent: xlib.PXEvent; XMappingEvent: PXMappingEvent; begin Result := GDK_FILTER_CONTINUE; // Don't filter any events. XEvent := xlib.PXEvent(GdkXEvent); case XEvent^._type of MappingNotify{, 112}: begin XMappingEvent := PXMappingEvent(XEvent); case XMappingEvent^.request of MappingModifier, MappingKeyboard: begin XRefreshKeyboardMapping(XMappingEvent); OnKeyboardLayoutChanged; end; // Don't care about MappingPointer. end; end; end; end; {$ELSEIF DEFINED(LCLGTK2)} procedure KeysChangedSignalHandler(keymap: PGdkKeymap; Data: gpointer); cdecl; begin OnKeyboardLayoutChanged; end; {$ENDIF} {$ENDIF} procedure UnhookKeyboardLayoutChanged; begin {$IF DEFINED(X11) and DEFINED(LCLQT)} if Assigned(KeyboardLayoutChangedHook) then FreeAndNil(KeyboardLayoutChangedHook); {$ELSEIF DEFINED(UNIX) and (DEFINED(LCLGTK) or DEFINED(LCLGTK2))} {$IF DEFINED(LCLGTK)} gdk_window_remove_filter(nil, @EventHandler, nil); {$ELSEIF DEFINED(LCLGTK2)} if (KeysChangesSignalHandlerId <> 0) and g_signal_handler_is_connected(gdk_keymap_get_for_display(XDisplay), KeysChangesSignalHandlerId) then begin g_signal_handler_disconnect(gdk_keymap_get_for_display(XDisplay), KeysChangesSignalHandlerId); KeysChangesSignalHandlerId := 0; end; {$ENDIF} {$ENDIF} end; procedure HookKeyboardLayoutChanged; begin UnhookKeyboardLayoutChanged; // On Unix (X server) the event for changing keyboard layout // is sent twice (on QT, GTK1 and GTK2). {$IF DEFINED(X11) and DEFINED(LCLQT)} KeyboardLayoutChangedHook := KeyboardLayoutChangedHook.Create( TQtWidget(Application.MainForm.Handle).TheObject); {$ELSEIF DEFINED(UNIX) and (DEFINED(LCLGTK) or DEFINED(LCLGTK2))} // On GTK1 XLib's MappingNotify event is used to detect keyboard mapping changes. // On GTK2 however (at least on my system), an event of type 112 instead of 34 // (which is a correct value for MappingNotify) is received, yet max value for // an event is 35. So, on GTK2 a GdkKeymap signal is used instead. {$IF DEFINED(LCLGTK)} gdk_window_add_filter(nil, @EventHandler, nil); // Filter events for all windows. {$ELSEIF DEFINED(LCLGTK2)} // Connect to GdkKeymap object for the given display. KeysChangesSignalHandlerId := g_signal_connect(gdk_keymap_get_for_display(XDisplay), 'keys-changed', TGCallback(@KeysChangedSignalHandler), nil); {$ENDIF} {$ENDIF} end; procedure InitializeKeyboard; begin OnKeyboardLayoutChanged; end; procedure CleanupKeyboard; begin UnhookKeyboardLayoutChanged; end; {$IF DEFINED(X11)} initialization // Get connection to X server. {$IF DEFINED(LCLGTK)} XDisplay := gdk_display; {$ELSEIF DEFINED(LCLGTK2)} XDisplay := gdk_display_get_default; {$ELSEIF DEFINED(LCLQT)} XDisplay := XOpenDisplay(nil); {$ENDIF} {$ENDIF} {$IF DEFINED(X11) and DEFINED(LCLQT)} finalization XCloseDisplay(XDisplay); {$ENDIF} end. doublecmd-0.5.8/src/platform/uOleDragDrop.pas0000644000175000017500000010731512170177271020171 0ustar alexxalexx{ DRAGDROP.PAS -- simple realization of OLE drag and drop. Author: Jim Mischel Last modification date: 30/05/97 Add some changes for compatibility with FPC/Lazarus Copyright (C) 2009 Alexander Koblov (Alexx2000@mail.ru) } unit uOleDragDrop; {$mode delphi}{$H+} interface uses Windows, ActiveX, Classes, Controls, uDragDropEx; type { IEnumFormatEtc } TEnumFormatEtc = class(TInterfacedObject, IEnumFormatEtc) private FIndex: Integer; public constructor Create(Index: Integer = 0); function Next(celt: LongWord; out elt: FormatEtc; pceltFetched: pULong): HResult; stdcall; function Skip(celt: LongWord): HResult; stdcall; function Reset: HResult; stdcall; function Clone(out enum: IEnumFormatEtc): HResult; stdcall; end; { TDragDropInfo } TDragDropInfo = class(TObject) private FFileList: TStringList; FPreferredWinDropEffect: DWORD; function CreateHDrop(bUnicode: Boolean): HGlobal; function CreateFileNames(bUnicode: Boolean): HGlobal; function CreateURIs(bUnicode: Boolean): HGlobal; function CreateShellIdListArray: HGlobal; function MakeHGlobal(ptr: Pointer; Size: LongWord): HGlobal; public constructor Create(PreferredWinDropEffect: DWORD); destructor Destroy; override; procedure Add(const s: string); function MakeDataInFormat(const formatEtc: TFormatEtc): HGlobal; function CreatePreferredDropEffect(WinDropEffect: DWORD): HGlobal; property Files: TStringList Read FFileList; end; TDragDropTargetWindows = class; // forward declaration { TFileDropTarget , } TFileDropTarget = class(TInterfacedObject, IDropTarget) private FHandle: HWND; FReleased: Boolean; FDragDropTarget: TDragDropTargetWindows; public constructor Create(DragDropTarget: TDragDropTargetWindows); {en Unregisters drag&drop target and releases the object (it is destroyed). This is the function that should be called to cleanup the object instead of Free. Do not use the object after calling it. } procedure FinalRelease; { IDropTarget } function DragEnter(const dataObj: IDataObject; grfKeyState: LongWord; pt: TPoint; var dwEffect: LongWord): HResult; stdcall; function DragOver(grfKeyState: LongWord; pt: TPoint; var dwEffect: LongWord): HResult; stdcall; function DragLeave: HResult; stdcall; function Drop(const dataObj: IDataObject; grfKeyState: LongWord; pt: TPoint; var dwEffect: LongWord): HResult; stdcall; {en Retrieves the filenames from the HDROP format as a list of UTF-8 strings. @returns(List of filenames or nil in case of an error.) } class function GetDropFilenames(hDropData: HDROP): TStringList; end; { TFileDropSource - } TFileDropSource = class(TInterfacedObject, IDropSource) constructor Create; {$IF FPC_FULLVERSION < 020601} function QueryContinueDrag(fEscapePressed: BOOL; grfKeyState: longint): HResult; stdcall; {$ELSE} function QueryContinueDrag(fEscapePressed: BOOL; grfKeyState: DWORD): HResult; stdcall; {$ENDIF} {$IF FPC_FULLVERSION < 020601} function GiveFeedback(dwEffect: longint): HResult; stdcall; {$ELSE} function GiveFeedback(dwEffect: DWORD): HResult; stdcall; {$ENDIF} end; { THDropDataObject - } THDropDataObject = class(TInterfacedObject, IDataObject) private FDropInfo: TDragDropInfo; public constructor Create(PreferredWinDropEffect: DWORD); destructor Destroy; override; procedure Add(const s: string); { IDataObject } function GetData(const formatetcIn: TFormatEtc; out medium: TStgMedium): HResult; stdcall; function GetDataHere(const formatetc: TFormatEtc; out medium: TStgMedium): HResult; stdcall; function QueryGetData(const formatetc: TFormatEtc): HResult; stdcall; function GetCanonicalFormatEtc(const formatetc: TFormatEtc; out formatetcOut: TFormatEtc): HResult; stdcall; function SetData(const formatetc: TFormatEtc; const medium: TStgMedium; fRelease: BOOL): HResult; stdcall; function EnumFormatEtc(dwDirection: LongWord; out enumFormatEtc: IEnumFormatEtc): HResult; stdcall; function DAdvise(const formatetc: TFormatEtc; advf: LongWord; const advSink: IAdviseSink; out dwConnection: LongWord): HResult; stdcall; function DUnadvise(dwConnection: LongWord): HResult; stdcall; function EnumDAdvise(out enumAdvise: IEnumStatData): HResult; stdcall; end; TDragDropSourceWindows = class(TDragDropSource) public function RegisterEvents(DragBeginEvent : uDragDropEx.TDragBeginEvent; RequestDataEvent: uDragDropEx.TRequestDataEvent;// not handled in Windows DragEndEvent : uDragDropEx.TDragEndEvent): Boolean; override; function DoDragDrop(const FileNamesList: TStringList; MouseButton: TMouseButton; ScreenStartPoint: TPoint ): Boolean; override; end; TDragDropTargetWindows = class(TDragDropTarget) public constructor Create(Control: TWinControl); override; destructor Destroy; override; function RegisterEvents(DragEnterEvent: uDragDropEx.TDragEnterEvent; DragOverEvent : uDragDropEx.TDragOverEvent; DropEvent : uDragDropEx.TDropEvent; DragLeaveEvent: uDragDropEx.TDragLeaveEvent): Boolean; override; procedure UnregisterEvents; override; private FDragDropTarget: TFileDropTarget; end; function GetEffectByKeyState(grfKeyState: LongWord) : Integer; { These functions convert Windows-specific effect value to { TDropEffect values and vice-versa. } function WinEffectToDropEffect(dwEffect: LongWord): TDropEffect; function DropEffectToWinEffect(DropEffect: TDropEffect): LongWord; { Query DROPFILES structure for [BOOL fWide] parameter } function DragQueryWide( hGlobalDropInfo: HDROP ): boolean; implementation uses SysUtils, ShellAPI, ShlObj, LCLIntf, Win32Proc, uClipboard, uLng; var // Supported formats by the source. DataFormats: TList = nil; // of TFormatEtc procedure InitDataFormats; procedure AddFormat(FormatId: Word); var FormatEtc: PFormatEtc; begin if FormatId > 0 then begin New(FormatEtc); if Assigned(FormatEtc) then begin DataFormats.Add(FormatEtc); with FormatEtc^ do begin CfFormat := FormatId; Ptd := nil; dwAspect := DVASPECT_CONTENT; lindex := -1; tymed := TYMED_HGLOBAL; end; end; end; end; begin DataFormats := TList.Create; AddFormat(CF_HDROP); AddFormat(CFU_PREFERRED_DROPEFFECT); AddFormat(CFU_FILENAME); AddFormat(CFU_FILENAMEW); // URIs disabled for now. This implementation does not work correct. // See bug http://doublecmd.sourceforge.net/mantisbt/view.php?id=692 { AddFormat(CFU_UNIFORM_RESOURCE_LOCATOR); AddFormat(CFU_UNIFORM_RESOURCE_LOCATORW); } AddFormat(CFU_SHELL_IDLIST_ARRAY); end; procedure DestroyDataFormats; var i : Integer; begin if Assigned(DataFormats) then begin for i := 0 to DataFormats.Count - 1 do if Assigned(DataFormats.Items[i]) then Dispose(PFormatEtc(DataFormats.Items[i])); FreeAndNil(DataFormats); end; end; { TEnumFormatEtc } constructor TEnumFormatEtc.Create(Index: Integer); begin inherited Create; FIndex := Index; end; { Next TFormatEtc elt. celt , . } function TEnumFormatEtc.Next(celt: LongWord; out elt: FormatEtc; pceltFetched: pULong): HResult; var i: Integer; eltout: PFormatEtc; begin // Support returning only 1 format at a time. if celt > 1 then celt := 1; eltout := @elt; i := 0; while (i < celt) and (FIndex < DataFormats.Count) do begin (eltout + i)^ := PFormatEtc(DataFormats.Items[FIndex])^; Inc(FIndex); Inc(i); end; if (pceltFetched <> nil) then pceltFetched^ := i; if (I = celt) then Result := S_OK else Result := S_FALSE; end; { Skip celt , (CurrentPointer + celt) . } function TEnumFormatEtc.Skip(celt: LongWord): HResult; begin if (celt <= DataFormats.Count - FIndex) then begin FIndex := FIndex + celt; Result := S_OK; end else begin FIndex := DataFormats.Count; Result := S_FALSE; end; end; { Reset } function TEnumFormatEtc.Reset: HResult; begin FIndex := 0; Result := S_OK; end; { Clone } function TEnumFormatEtc.Clone(out enum: IEnumFormatEtc): HResult; begin enum := TEnumFormatEtc.Create(FIndex); Result := S_OK; end; { TDragDropInfo } constructor TDragDropInfo.Create(PreferredWinDropEffect: DWORD); begin inherited Create; FFileList := TStringList.Create; FPreferredWinDropEffect := PreferredWinDropEffect; end; destructor TDragDropInfo.Destroy; begin FFileList.Free; inherited Destroy; end; procedure TDragDropInfo.Add(const s: string); begin Files.Add(s); end; function TDragDropInfo.MakeDataInFormat(const formatEtc: TFormatEtc): HGlobal; begin Result := 0; if (formatEtc.tymed = DWORD(-1)) or // Transport medium not specified. (Boolean(formatEtc.tymed and TYMED_HGLOBAL)) // Support only HGLOBAL medium. then begin if formatEtc.CfFormat = CF_HDROP then begin Result := CreateHDrop(Win32Proc.UnicodeEnabledOS) end else if formatEtc.CfFormat = CFU_PREFERRED_DROPEFFECT then begin Result := CreatePreferredDropEffect(FPreferredWinDropEffect); end else if (formatEtc.CfFormat = CFU_FILENAME) then begin Result := CreateFileNames(False); end else if (formatEtc.CfFormat = CFU_FILENAMEW) then begin Result := CreateFileNames(True); end // URIs disabled for now. This implementation does not work correct. // See bug http://doublecmd.sourceforge.net/mantisbt/view.php?id=692 { else if (formatEtc.CfFormat = CFU_UNIFORM_RESOURCE_LOCATOR) then begin Result := CreateURIs(False); end else if (formatEtc.CfFormat = CFU_UNIFORM_RESOURCE_LOCATORW) then begin Result := CreateURIs(True); end } else if (formatEtc.CfFormat = CFU_SHELL_IDLIST_ARRAY) then begin Result := CreateShellIdListArray; end; end; end; function TDragDropInfo.CreateFileNames(bUnicode: Boolean): HGlobal; var FileList: AnsiString; wsFileList: WideString; begin if Files.Count = 0 then Exit; if bUnicode then begin wsFileList := UTF8Decode(Self.Files[0]) + #0; Result := MakeHGlobal(PWideChar(wsFileList), Length(wsFileList) * SizeOf(WideChar)); end else begin FileList := Utf8ToAnsi(Self.Files[0]) + #0; Result := MakeHGlobal(PAnsiChar(FileList), Length(FileList) * SizeOf(AnsiChar)); end; end; function TDragDropInfo.CreateURIs(bUnicode: Boolean): HGlobal; var UriList: AnsiString; wsUriList: WideString; I: Integer; begin wsUriList := ''; for I := 0 to Self.Files.Count - 1 do begin if I > 0 then wsUriList := wsUriList + LineEnding; wsUriList := wsUriList + fileScheme + '//' { don't put hostname } + URIEncode(UTF8Decode( StringReplace(Files[I], '\', '/', [rfReplaceAll] ))); end; wsUriList := wsUriList + #0; if bUnicode then Result := MakeHGlobal(PWideChar(wsUriList), Length(wsUriList) * SizeOf(WideChar)) else begin // Wide to Ansi UriList := Utf8ToAnsi(UTF8Encode(wsUriList)); Result := MakeHGlobal(PAnsiChar(UriList), Length(UriList) * SizeOf(AnsiChar)); end; end; function TDragDropInfo.CreateShellIdListArray: HGlobal; var pidl: LPITEMIDLIST; pidlSize: Integer; pIdA: LPIDA = nil; // ShellIdListArray structure ShellDesktop: IShellFolder = nil; CurPosition: UINT; dwTotalSizeToAllocate: DWORD; I: Integer; function GetPidlFromPath(ShellFolder: IShellFolder; Path: WideString): LPITEMIDLIST; var chEaten: ULONG = 0; dwAttributes: ULONG = 0; begin if ShellFolder.ParseDisplayName(0, nil, PWideChar(Path), chEaten, Result, dwAttributes) <> S_OK then begin Result := nil; end; end; function GetPidlSize(Pidl: LPITEMIDLIST): Integer; var pidlTmp: LPITEMIDLIST; begin Result := 0; pidlTmp := pidl; while pidlTmp^.mkid.cb <> 0 do begin Result := Result + pidlTmp^.mkid.cb; pidlTmp := LPITEMIDLIST(LPBYTE(pidlTmp) + PtrInt(pidlTmp^.mkid.cb)); // Next Item. end; Inc(Result, SizeOf(BYTE) * 2); // PIDL ends with two zeros. end; begin Result := 0; // Get Desktop shell interface. if SHGetDesktopFolder(ShellDesktop) = S_OK then begin // Get Desktop PIDL, which will be the root PIDL for the files' PIDLs. if SHGetSpecialFolderLocation(0, CSIDL_DESKTOP, pidl) = S_OK then begin pidlSize := GetPidlSize(pidl); // How much memory to allocate for the whole structure. // We don't know how much memory each PIDL takes yet // (estimate using desktop pidl size). dwTotalSizeToAllocate := SizeOf(_IDA.cidl) + SizeOf(UINT) * (Files.Count + 1) // PIDLs' offsets + pidlSize * (Files.Count + 1); // PIDLs pIda := AllocMem(dwTotalSizeToAllocate); // Number of files PIDLs (without root). pIdA^.cidl := Files.Count; // Calculate offset for the first pidl (root). CurPosition := SizeOf(_IDA.cidl) + SizeOf(UINT) * (Files.Count + 1); // Write first PIDL. pIdA^.aoffset[0] := CurPosition; CopyMemory(LPBYTE(pIda) + PtrInt(CurPosition), pidl, pidlSize); Inc(CurPosition, pidlSize); CoTaskMemFree(pidl); for I := 0 to Self.Files.Count - 1 do begin // Get PIDL for each file (if Desktop is the root, then // absolute paths are acceptable). pidl := GetPidlFromPath(ShellDesktop, UTF8Decode(Files[i])); if pidl <> nil then begin pidlSize := GetPidlSize(pidl); // If not enough memory then reallocate. if dwTotalSizeToAllocate < CurPosition + pidlSize then begin // Estimate using current PIDL's size. Inc(dwTotalSizeToAllocate, (Files.Count - i) * pidlSize); pIdA := ReAllocMem(pIda, dwTotalSizeToAllocate); if not Assigned(pIda) then Break; end; // Write PIDL. {$R-} pIdA^.aoffset[i + 1] := CurPosition; {$R+} CopyMemory(LPBYTE(pIdA) + PtrInt(CurPosition), pidl, pidlSize); Inc(CurPosition, pidlSize); CoTaskMemFree(pidl); end; end; if Assigned(pIda) then begin // Current position it at the end of the structure. Result := MakeHGlobal(pIdA, CurPosition); Freemem(pIda); end; end; // SHGetSpecialFolderLocation ShellDesktop := nil; end; // SHGetDesktopFolder end; function TDragDropInfo.CreatePreferredDropEffect(WinDropEffect: DWORD) : HGlobal; begin Result := MakeHGlobal(@WinDropEffect, SizeOf(WinDropEffect)); end; function TDragDropInfo.MakeHGlobal(ptr: Pointer; Size: LongWord): HGlobal; var DataPointer : Pointer; DataHandle : HGLOBAL; begin Result := 0; if Assigned(ptr) then begin DataHandle := GlobalAlloc(GMEM_MOVEABLE or GMEM_ZEROINIT, Size); if (DataHandle <> 0) then begin DataPointer := GlobalLock(DataHandle); if Assigned(DataPointer) then begin CopyMemory(DataPointer, ptr, Size); GlobalUnlock(DataHandle); Result := DataHandle; end else begin GlobalFree(DataHandle); end; end; end; end; function TDragDropInfo.CreateHDrop(bUnicode: Boolean): HGlobal; var RequiredSize: Integer; I: Integer; hGlobalDropInfo: HGlobal; DropFiles: PDropFiles; FileList: AnsiString = ''; wsFileList: WideString = ''; begin { TDropFiles , GlobalAlloc. , , , . } { Bring the filenames in a form, separated by #0 and ending with a double #0#0 } if bUnicode then begin for I := 0 to Self.Files.Count - 1 do wsFileList := wsFileList + UTF8Decode(Self.Files[I]) + #0; wsFileList := wsFileList + #0; { } RequiredSize := SizeOf(TDropFiles) + Length(wsFileList) * SizeOf(WChar); end else begin for I := 0 to Self.Files.Count - 1 do FileList := FileList + Utf8ToAnsi(Self.Files[I]) + #0; FileList := FileList + #0; { } RequiredSize := SizeOf(TDropFiles) + Length(FileList) * SizeOf(AnsiChar); end; hGlobalDropInfo := GlobalAlloc(GMEM_MOVEABLE or GMEM_ZEROINIT, RequiredSize); if (hGlobalDropInfo <> 0) then begin { , } DropFiles := GlobalLock(hGlobalDropInfo); { DropFiles } { pFiles -- . } DropFiles.pFiles := SizeOf(TDropFiles); if Windows.GetCursorPos(@DropFiles.pt) = False then begin DropFiles.pt.x := 0; DropFiles.pt.y := 0; end; DropFiles.fNC := True; // Pass cursor coordinates as screen coords DropFiles.fWide := bUnicode; { . DropFiles + DropFiles.pFiles, . } { The pointer should be aligned nicely, because the TDropFiles record is not packed. } DropFiles := Pointer(DropFiles) + DropFiles.pFiles; if bUnicode then CopyMemory(DropFiles, PWideChar(wsFileList), Length(wsFileList) * SizeOf(WChar)) else CopyMemory(DropFiles, PAnsiChar(FileList), Length(FileList) * SizeOf(AnsiChar)); { } GlobalUnlock(hGlobalDropInfo); end; Result := hGlobalDropInfo; end; { TFileDropTarget } constructor TFileDropTarget.Create(DragDropTarget: TDragDropTargetWindows); begin inherited Create; // Here RefCount is 1 - as set in TInterfacedObject.NewInstance, // but it's decremented back in TInterfacedObject.AfterConstruction // (when this constructor finishes). So we must manually again increase it. _AddRef; FReleased := False; FDragDropTarget := DragDropTarget; // Increases RefCount. ActiveX.CoLockObjectExternal(Self, True, False); // Increases RefCount. if ActiveX.RegisterDragDrop(DragDropTarget.GetControl.Handle, Self) = S_OK then FHandle := DragDropTarget.GetControl.Handle else FHandle := 0; end; procedure TFileDropTarget.FinalRelease; begin if not FReleased then begin FReleased := True; // Decreases reference count. ActiveX.CoLockObjectExternal(Self, False, True); // Check if window was not already destroyed. if (FHandle <> 0) and (IsWindow(FHandle)) then begin // Decreases reference count. ActiveX.RevokeDragDrop(FHandle); FHandle := 0; end else _Release; // Cannot revoke - just release reference. _Release; // For _AddRef in Create. end; end; function TFileDropTarget.DragEnter(const dataObj: IDataObject; grfKeyState: LongWord; pt: TPoint; var dwEffect: LongWord): HResult; stdcall; var DropEffect: TDropEffect; begin // dwEffect parameter states which effects are allowed by the source. dwEffect := dwEffect and GetEffectByKeyState(grfKeyState); if Assigned(FDragDropTarget.GetDragEnterEvent) then begin DropEffect := WinEffectToDropEffect(dwEffect); if FDragDropTarget.GetDragEnterEvent()(DropEffect, pt) = True then begin dwEffect := DropEffectToWinEffect(DropEffect); Result := S_OK end else Result := S_FALSE; end else Result := S_OK; end; function TFileDropTarget.DragOver (grfKeyState: LongWord; pt: TPoint; var dwEffect: LongWord): HResult; stdcall; var DropEffect: TDropEffect; begin // dwEffect parameter states which effects are allowed by the source. dwEffect := dwEffect and GetEffectByKeyState(grfKeyState); if Assigned(FDragDropTarget.GetDragOverEvent) then begin DropEffect := WinEffectToDropEffect(dwEffect); if FDragDropTarget.GetDragOverEvent()(DropEffect, pt) = True then begin dwEffect := DropEffectToWinEffect(DropEffect); Result := S_OK end else Result := S_FALSE; end else Result := S_OK; end; function TFileDropTarget.DragLeave: HResult; stdcall; begin if Assigned(FDragDropTarget.GetDragLeaveEvent) then begin if FDragDropTarget.GetDragLeaveEvent() = True then Result := S_OK else Result := S_FALSE; end else Result := S_OK; end; { . } function TFileDropTarget.Drop(const dataObj: IDataObject; grfKeyState: LongWord; pt: TPoint; var dwEffect: LongWord): HResult; stdcall; var Medium: TSTGMedium; Format: TFormatETC; i: Integer; DropInfo: TDragDropInfo; FileNames: TStringList; DropEffect: TDropEffect; begin dataObj._AddRef; { . TFormatETC dataObj.GetData, ( TSTGMedium). } Format.cfFormat := CF_HDROP; Format.ptd := nil; Format.dwAspect := DVASPECT_CONTENT; Format.lindex := -1; Format.tymed := TYMED_HGLOBAL; { Medium } Result := dataObj.GetData(Format, Medium); { , , FMDD. } if (Result = S_OK) then begin case Medium.Tymed of TYMED_HGLOBAL: begin { TDragDropInfo } DropInfo := TDragDropInfo.Create(dwEffect); { Retrieve file names } FileNames := GetDropFilenames(Medium.hGlobal); if Assigned(FileNames) then begin for i := 0 to FileNames.Count - 1 do begin DropInfo.Add(FileNames[i]); end; FreeAndNil(FileNames); end; { , } if (Assigned(FDragDropTarget.GetDropEvent)) then begin // Set default effect by examining keyboard keys, taking into // consideration effects allowed by the source (dwEffect parameter). dwEffect := dwEffect and GetEffectByKeyState(grfKeyState); DropEffect := WinEffectToDropEffect(dwEffect); if FDragDropTarget.GetDropEvent()(DropInfo.Files, DropEffect, pt) = False then ; dwEffect := DropEffectToWinEffect(DropEffect); end; DropInfo.Free; end; // TYMED_HGLOBAL end; // case if (Medium.PUnkForRelease = nil) then // Drop target must release the medium allocated by GetData. // This does the same as DragFinish(Medium.hGlobal) in this case, // but can support other media. ReleaseStgMedium(@Medium) else // Drop source is responsible for releasing medium via this object. IUnknown(Medium.PUnkForRelease)._Release; end; dataObj._Release; end; class function TFileDropTarget.GetDropFilenames(hDropData: HDROP): TStringList; var NumFiles: Integer; i: Integer; wszFilename: PWideChar; FileName: WideString; RequiredSize: Cardinal; begin Result := nil; if hDropData <> 0 then begin Result := TStringList.Create; try NumFiles := DragQueryFileW(hDropData, $FFFFFFFF, nil, 0); for i := 0 to NumFiles - 1 do begin RequiredSize := DragQueryFileW(hDropData, i, nil, 0) + 1; // + 1 = terminating zero wszFilename := GetMem(RequiredSize * SizeOf(WideChar)); if Assigned(wszFilename) then try if DragQueryFileW(hDropData, i, wszFilename, RequiredSize) > 0 then begin FileName := wszFilename; // Windows inserts '?' character where Wide->Ansi conversion // of a character was not possible, in which case filename is invalid. // This may happen if a non-Unicode application was the source. if Pos('?', FileName) = 0 then Result.Add(UTF8Encode(FileName)) else raise Exception.Create(rsMsgInvalidFilename + ': ' + LineEnding + UTF8Encode(FileName)); end; finally FreeMem(wszFilename); end; end; except FreeAndNil(Result); raise; end; end; end; { TFileDropSource } constructor TFileDropSource.Create; begin inherited Create; _AddRef; end; { QueryContinueDrag . } {$IF FPC_FULLVERSION < 020601} function TFileDropSource.QueryContinueDrag(fEscapePressed: BOOL; grfKeyState: longint): HResult; {$ELSE} function TFileDropSource.QueryContinueDrag(fEscapePressed: BOOL; grfKeyState: DWORD): HResult; {$ENDIF} var Point:TPoint; begin if (fEscapePressed) then begin Result := DRAGDROP_S_CANCEL; // Set flag to notify that dragging was canceled by the user. uDragDropEx.TransformDragging := False; end else if ((grfKeyState and (MK_LBUTTON or MK_MBUTTON or MK_RBUTTON)) = 0) then begin Result := DRAGDROP_S_DROP; end else begin if uDragDropEx.AllowTransformToInternal then begin GetCursorPos(Point); // Call LCL function, not the Windows one. // LCL version will return 0 if mouse is over a window belonging to another process. if LCLIntf.WindowFromPoint(Point) <> 0 then begin // Mouse cursor has been moved back into the application window. // Cancel external dragging. Result := DRAGDROP_S_CANCEL; // Set flag to notify that dragging has not finished, // but rather it is to be transformed into internal dragging. uDragDropEx.TransformDragging := True; end else Result := S_OK; // Continue dragging end else Result := S_OK; // Continue dragging end; end; {$IF FPC_FULLVERSION < 020601} function TFileDropSource.GiveFeedback(dwEffect: longint): HResult; {$ELSE} function TFileDropSource.GiveFeedback(dwEffect: DWORD): HResult; {$ENDIF} begin case LongWord(dwEffect) of DROPEFFECT_NONE, DROPEFFECT_COPY, DROPEFFECT_MOVE, DROPEFFECT_LINK, DROPEFFECT_SCROLL: Result := DRAGDROP_S_USEDEFAULTCURSORS; else Result := S_OK; end; end; { THDropDataObject } constructor THDropDataObject.Create(PreferredWinDropEffect: DWORD); begin inherited Create; _AddRef; FDropInfo := TDragDropInfo.Create(PreferredWinDropEffect); end; destructor THDropDataObject.Destroy; begin if (FDropInfo <> nil) then FDropInfo.Free; inherited Destroy; end; procedure THDropDataObject.Add(const s: string); begin FDropInfo.Add(s); end; function THDropDataObject.GetData(const formatetcIn: TFormatEtc; out medium: TStgMedium): HResult; begin Result := DV_E_FORMATETC; { medium } medium.tymed := 0; medium.hGlobal := 0; medium.PUnkForRelease := nil; { , } if (QueryGetData(formatetcIn) = S_OK) then begin if (FDropInfo <> nil) then begin { Create data in specified format. } { The hGlobal will be released by the caller of GetData. } medium.hGlobal := FDropInfo.MakeDataInFormat(formatetcIn); if medium.hGlobal <> 0 then begin medium.tymed := TYMED_HGLOBAL; Result := S_OK; end; end; end; end; function THDropDataObject.GetDataHere(const formatetc: TFormatEtc; out medium: TStgMedium): HResult; begin Result := DV_E_FORMATETC; { , } end; function THDropDataObject.QueryGetData(const formatetc: TFormatEtc): HResult; var i:Integer; begin with formatetc do if dwAspect = DVASPECT_CONTENT then begin Result := DV_E_FORMATETC; // begin with 'format not supported' // See if the queried format is supported. for i := 0 to DataFormats.Count - 1 do begin if Assigned(DataFormats[i]) then begin if cfFormat = PFormatEtc(DataFormats[i])^.CfFormat then begin // Format found, see if transport medium is supported. if (tymed = DWORD(-1)) or (Boolean(tymed and PFormatEtc(DataFormats[i])^.tymed)) then begin Result := S_OK; end else Result := DV_E_TYMED; // transport medium not supported Exit; // exit if format found (regardless of transport medium) end end end end else Result := DV_E_DVASPECT; // aspect not supported end; function THDropDataObject.GetCanonicalFormatEtc(const formatetc: TFormatEtc; out formatetcOut: TFormatEtc): HResult; begin formatetcOut.ptd := nil; Result := E_NOTIMPL; end; function THDropDataObject.SetData(const formatetc: TFormatEtc; const medium: TStgMedium; fRelease: BOOL): HResult; begin Result := E_NOTIMPL; end; { EnumFormatEtc } function THDropDataObject.EnumFormatEtc(dwDirection: LongWord; out enumFormatEtc: IEnumFormatEtc): HResult; begin { Get. } if dwDirection = DATADIR_GET then begin enumFormatEtc := TEnumFormatEtc.Create; Result := S_OK; end else begin enumFormatEtc := nil; Result := E_NOTIMPL; end; end; { Advise } function THDropDataObject.DAdvise(const formatetc: TFormatEtc; advf: LongWord; const advSink: IAdviseSink; out dwConnection: LongWord): HResult; begin Result := OLE_E_ADVISENOTSUPPORTED; end; function THDropDataObject.DUnadvise(dwConnection: LongWord): HResult; begin Result := OLE_E_ADVISENOTSUPPORTED; end; function THDropDataObject.EnumDAdvise(out enumAdvise: IEnumStatData): HResult; begin Result := OLE_E_ADVISENOTSUPPORTED; end; function GetEffectByKeyState(grfKeyState: LongWord): Integer; begin Result := DROPEFFECT_COPY; { default effect } if (grfKeyState and MK_CONTROL) > 0 then begin if (grfKeyState and MK_SHIFT) > 0 then Result := DROPEFFECT_LINK else Result := DROPEFFECT_COPY; end else if (grfKeyState and MK_SHIFT) > 0 then Result := DROPEFFECT_MOVE; end; function WinEffectToDropEffect(dwEffect: LongWord): TDropEffect; begin case dwEffect of DROPEFFECT_COPY: Result := DropCopyEffect; DROPEFFECT_MOVE: Result := DropMoveEffect; DROPEFFECT_LINK: Result := DropLinkEffect; else Result := DropNoEffect; end; end; function DropEffectToWinEffect(DropEffect: TDropEffect): LongWord; begin case DropEffect of DropCopyEffect: Result := DROPEFFECT_COPY; DropMoveEffect: Result := DROPEFFECT_MOVE; DropLinkEffect: Result := DROPEFFECT_LINK; else Result := DROPEFFECT_NONE; end; end; function DragQueryWide( hGlobalDropInfo: HDROP ): boolean; var DropFiles: PDropFiles; begin DropFiles := GlobalLock( hGlobalDropInfo ); Result := DropFiles^.fWide; GlobalUnlock( hGlobalDropInfo ); end; { ---------------------------------------------------------} { TDragDropSourceWindows } function TDragDropSourceWindows.RegisterEvents( DragBeginEvent : uDragDropEx.TDragBeginEvent; RequestDataEvent: uDragDropEx.TRequestDataEvent; // not Handled in Windows DragEndEvent : uDragDropEx.TDragEndEvent): Boolean; begin inherited; // RequestDataEvent is not handled, because the system has control of all data transfer. Result := True; // confirm that events are registered end; function TDragDropSourceWindows.DoDragDrop(const FileNamesList: TStringList; MouseButton: TMouseButton; ScreenStartPoint: TPoint): Boolean; var DropSource: TFileDropSource; DropData: THDropDataObject; Rslt: HRESULT; dwEffect: LongWord; I: Integer; begin // Simulate drag-begin event. if Assigned(GetDragBeginEvent) then begin Result := GetDragBeginEvent()(); if Result = False then Exit; end; // Create source-object DropSource:= TFileDropSource.Create; // and data object DropData:= THDropDataObject.Create(DROPEFFECT_COPY { default effect } ); for I:= 0 to FileNamesList.Count - 1 do DropData.Add (FileNamesList[i]); // Start OLE Drag&Drop Rslt:= ActiveX.DoDragDrop(DropData, DropSource, DROPEFFECT_MOVE or DROPEFFECT_COPY or DROPEFFECT_LINK, // Allowed effects @dwEffect); case Rslt of DRAGDROP_S_DROP: begin FLastStatus := DragDropSuccessful; Result := True; end; DRAGDROP_S_CANCEL: begin FLastStatus := DragDropAborted; Result := False; end; E_OUTOFMEMORY: begin MessageBox(0, 'Out of memory', 'Error!', 16); FLastStatus := DragDropError; Result := False; end; else begin MessageBox(0, 'Something bad happened', 'Error!', 16); FLastStatus := DragDropError; Result := False; end; end; // Simulate drag-end event. This must be called here, // after DoDragDrop returns from the system. if Assigned(GetDragEndEvent) then begin if Result = True then Result := GetDragEndEvent()() else GetDragEndEvent()() end; // Release created objects. DropSource._Release; DropData._Release; end; { ---------------------------------------------------------} { TDragDropTargetWindows } constructor TDragDropTargetWindows.Create(Control: TWinControl); begin FDragDropTarget := nil; inherited Create(Control); end; destructor TDragDropTargetWindows.Destroy; begin inherited Destroy; if Assigned(FDragDropTarget) then begin FDragDropTarget.FinalRelease; FDragDropTarget := nil; end; end; function TDragDropTargetWindows.RegisterEvents( DragEnterEvent: uDragDropEx.TDragEnterEvent; DragOverEvent : uDragDropEx.TDragOverEvent; DropEvent : uDragDropEx.TDropEvent; DragLeaveEvent: uDragDropEx.TDragLeaveEvent): Boolean; begin // Unregister if registered before. UnregisterEvents; inherited; // Call inherited Register now. GetControl.HandleNeeded; // force creation of the handle if GetControl.HandleAllocated = True then begin FDragDropTarget := TFileDropTarget.Create(Self); Result := True; end; end; procedure TDragDropTargetWindows.UnregisterEvents; begin inherited; if Assigned(FDragDropTarget) then begin FDragDropTarget.FinalRelease; // Releasing will unregister events FDragDropTarget := nil; end; end; initialization OleInitialize(nil); InitDataFormats; finalization OleUninitialize; DestroyDataFormats; end. doublecmd-0.5.8/src/platform/lua.pas0000644000175000017500000015523011740433676016430 0ustar alexxalexxunit lua; (* * A complete Pascal wrapper for Lua 5.1 DLL module. * * Created by Geo Massar, 2006 * Distributed as free/open source. * 2008 Added dinamicly library loading by Dmitry Kolomiets (B4rr4cuda@rambler.ru) *) interface //{$I CallType.inc} {$DEFINE DINAMIC} {$IFDEF UNIX} uses dl; {$ENDIF} {$DEFINE LUA51} type size_t = type Cardinal; Psize_t = ^size_t; PPointer = ^Pointer; lua_State = record end; Plua_State = ^lua_State; const {$IF DEFINED(MSWINDOWS)} LuaDLL = 'lua5.1.dll'; {$ELSEIF DEFINED(UNIX)} {$IFDEF DARWIN} {$IF DEFINED(STATIC)} LuaDLL = 'lua5.1.dylib'; {$ELSEIF DEFINED(DINAMIC)} LuaDLL = 'liblua5.1.dylib'; {$ENDIF} {$ELSE} {$IF DEFINED(STATIC)} LuaDLL = 'lua5.1.so'; {$ELSEIF DEFINED(DINAMIC)} LuaDLL = 'liblua5.1.so.0'; {$ENDIF} {$ENDIF} {$ENDIF} (* formats for Lua numbers *) {$IFNDEF LUA_NUMBER_SCAN} const LUA_NUMBER_SCAN = '%lf'; {$ENDIF} {$IFNDEF LUA_NUMBER_FMT} const LUA_NUMBER_FMT = '%.14g'; {$ENDIF} {$IFDEF DINAMIC} function LoadLuaLib(filename:string):boolean; procedure UnloadLuaLib; function IsLuaLibLoaded:boolean; {$ENDIF} (*****************************************************************************) (* luaconfig.h *) (*****************************************************************************) (* ** $Id: luaconf.h,v 1.81 2006/02/10 17:44:06 roberto Exp $ ** Configuration file for Lua ** See Copyright Notice in lua.h *) (* ** {================================================================== @@ LUA_NUMBER is the type of numbers in Lua. ** CHANGE the following definitions only if you want to build Lua ** with a number type different from double. You may also need to ** change lua_number2int & lua_number2integer. ** =================================================================== *) type LUA_NUMBER_ = type Double; // ending underscore is needed in Pascal LUA_INTEGER_ = type Integer; (* @@ LUA_IDSIZE gives the maximum size for the description of the source @* of a function in debug information. ** CHANGE it if you want a different size. *) const LUA_IDSIZE = 60; (* @@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system. *) const LUAL_BUFFERSIZE = 1024; (* @@ LUA_PROMPT is the default prompt used by stand-alone Lua. @@ LUA_PROMPT2 is the default continuation prompt used by stand-alone Lua. ** CHANGE them if you want different prompts. (You can also change the ** prompts dynamically, assigning to globals _PROMPT/_PROMPT2.) *) const LUA_PROMPT = '> '; LUA_PROMPT2 = '>> '; (* @@ lua_readline defines how to show a prompt and then read a line from @* the standard input. @@ lua_saveline defines how to "save" a read line in a "history". @@ lua_freeline defines how to free a line read by lua_readline. ** CHANGE them if you want to improve this functionality (e.g., by using ** GNU readline and history facilities). *) function lua_readline(L : Plua_State; var b : PChar; p : PChar): Boolean; procedure lua_saveline(L : Plua_State; idx : Integer); procedure lua_freeline(L : Plua_State; b : PChar); (* @@ lua_stdin_is_tty detects whether the standard input is a 'tty' (that @* is, whether we're running lua interactively). ** CHANGE it if you have a better definition for non-POSIX/non-Windows ** systems. */ #include #include #define lua_stdin_is_tty() _isatty(_fileno(stdin)) *) const lua_stdin_is_tty = TRUE; (*****************************************************************************) (* lua.h *) (*****************************************************************************) (* ** $Id: lua.h,v 1.216 2006/01/10 12:50:13 roberto Exp $ ** Lua - An Extensible Extension Language ** Lua.org, PUC-Rio, Brazil (http://www.lua.org) ** See Copyright Notice at the end of this file *) const LUA_VERSION = 'Lua 5.1'; LUA_VERSION_NUM = 501; LUA_COPYRIGHT = 'Copyright (C) 1994-2006 Tecgraf, PUC-Rio'; LUA_AUTHORS = 'R. Ierusalimschy, L. H. de Figueiredo & W. Celes'; (* mark for precompiled code (`Lua') *) LUA_SIGNATURE = #27'Lua'; (* option for multiple returns in `lua_pcall' and `lua_call' *) LUA_MULTRET = -1; (* ** pseudo-indices *) LUA_REGISTRYINDEX = -10000; LUA_ENVIRONINDEX = -10001; LUA_GLOBALSINDEX = -10002; function lua_upvalueindex(idx : Integer) : Integer; // a marco const (* thread status; 0 is OK *) LUA_YIELD_ = 1; // Note: the ending underscore is needed in Pascal LUA_ERRRUN = 2; LUA_ERRSYNTAX = 3; LUA_ERRMEM = 4; LUA_ERRERR = 5; type lua_CFunction = function(L : Plua_State) : Integer; cdecl; (* ** functions that read/write blocks when loading/dumping Lua chunks *) lua_Reader = function (L : Plua_State; ud : Pointer; sz : Psize_t) : PChar; cdecl; lua_Writer = function (L : Plua_State; const p : Pointer; sz : size_t; ud : Pointer) : Integer; cdecl; (* ** prototype for memory-allocation functions *) lua_Alloc = function (ud, ptr : Pointer; osize, nsize : size_t) : Pointer; cdecl; const (* ** basic types *) LUA_TNONE = -1; LUA_TNIL = 0; LUA_TBOOLEAN = 1; LUA_TLIGHTUSERDATA = 2; LUA_TNUMBER = 3; LUA_TSTRING = 4; LUA_TTABLE = 5; LUA_TFUNCTION = 6; LUA_TUSERDATA = 7; LUA_TTHREAD = 8; (* minimum Lua stack available to a C function *) LUA_MINSTACK = 20; type (* type of numbers in Lua *) lua_Number = LUA_NUMBER_; (* type for integer functions *) lua_Integer = LUA_INTEGER_; (* ** state manipulation *) {$IFDEF STATIC} function lua_newstate(f : lua_Alloc; ud : Pointer) : Plua_State; cdecl; external LuaDLL; procedure lua_close(L: Plua_State); cdecl; external LuaDLL; function lua_newthread(L : Plua_State) : Plua_State; cdecl; external LuaDLL; function lua_atpanic(L : Plua_State; panicf : lua_CFunction) : lua_CFunction; cdecl; external LuaDLL; {$ENDIF} {$IFDEF DINAMIC} type Tlua_newstate= function (f : lua_Alloc; ud : Pointer) : Plua_State; cdecl; Tlua_close= procedure (L: Plua_State); cdecl; Tlua_newthread= function (L : Plua_State) : Plua_State; cdecl; Tlua_atpanic= function (L : Plua_State; panicf : lua_CFunction) : lua_CFunction; cdecl; {$ENDIF} (* ** basic stack manipulation *) {$IFDEF STATIC} function lua_gettop(L : Plua_State) : Integer; cdecl; external LuaDLL; procedure lua_settop(L : Plua_State; idx : Integer); cdecl; external LuaDLL; procedure lua_pushvalue(L : Plua_State; idx : Integer); cdecl; external LuaDLL; procedure lua_remove(L : Plua_State; idx : Integer); cdecl; external LuaDLL; procedure lua_insert(L : Plua_State; idx : Integer); cdecl; external LuaDLL; procedure lua_replace(L : Plua_State; idx : Integer); cdecl; external LuaDLL; function lua_checkstack(L : Plua_State; sz : Integer) : LongBool; cdecl; external LuaDLL; procedure lua_xmove(src, dest : Plua_State; n : Integer); cdecl; external LuaDLL; {$ENDIF} {$IFDEF DINAMIC} type Tlua_gettop= function (L : Plua_State) : Integer; cdecl; Tlua_settop= procedure (L : Plua_State; idx : Integer); cdecl; Tlua_pushvalue= procedure (L : Plua_State; idx : Integer); cdecl; Tlua_remove= procedure (L : Plua_State; idx : Integer); cdecl; Tlua_insert= procedure (L : Plua_State; idx : Integer); cdecl; Tlua_replace= procedure (L : Plua_State; idx : Integer); cdecl; Tlua_checkstack= function (L : Plua_State; sz : Integer) : LongBool; cdecl; Tlua_xmove= procedure (src, dest : Plua_State; n : Integer); cdecl; {$ENDIF} (* ** access functions (stack -> C) *) {$IFDEF STATIC} function lua_isnumber(L : Plua_State; idx : Integer) : LongBool; cdecl; external LuaDLL; function lua_isstring(L : Plua_State; idx : Integer) : LongBool; cdecl; external LuaDLL; function lua_iscfunction(L : Plua_State; idx : Integer) : LongBool; cdecl; external LuaDLL; function lua_isuserdata(L : Plua_State; idx : Integer) : LongBool; cdecl; external LuaDLL; function lua_type(L : Plua_State; idx : Integer) : Integer; cdecl; external LuaDLL; function lua_typename(L : Plua_State; tp : Integer) : PChar; cdecl; external LuaDLL; function lua_equal(L : Plua_State; idx1, idx2 : Integer) : LongBool; cdecl; external LuaDLL; function lua_rawequal(L : Plua_State; idx1, idx2 : Integer) : LongBool; cdecl; external LuaDLL; function lua_lessthan(L : Plua_State; idx1, idx2 : Integer) : LongBool; cdecl; external LuaDLL; function lua_tonumber(L : Plua_State; idx : Integer) : lua_Number; cdecl; external LuaDLL; function lua_tointeger(L : Plua_State; idx : Integer) : lua_Integer; cdecl; external LuaDLL; function lua_toboolean(L : Plua_State; idx : Integer) : LongBool; cdecl; external LuaDLL; function lua_tolstring(L : Plua_State; idx : Integer; len : Psize_t) : PChar; cdecl; external LuaDLL; function lua_objlen(L : Plua_State; idx : Integer) : size_t; cdecl; external LuaDLL; function lua_tocfunction(L : Plua_State; idx : Integer) : lua_CFunction; cdecl; external LuaDLL; function lua_touserdata(L : Plua_State; idx : Integer) : Pointer; cdecl; external LuaDLL; function lua_tothread(L : Plua_State; idx : Integer) : Plua_State; cdecl; external LuaDLL; function lua_topointer(L : Plua_State; idx : Integer) : Pointer; cdecl; external LuaDLL; {$ENDIF} {$IFDEF DINAMIC} Tlua_isnumber= function (L : Plua_State; idx : Integer) : LongBool; cdecl; Tlua_isstring= function (L : Plua_State; idx : Integer) : LongBool; cdecl; Tlua_iscfunction= function (L : Plua_State; idx : Integer) : LongBool; cdecl; Tlua_isuserdata= function (L : Plua_State; idx : Integer) : LongBool; cdecl; Tlua_type= function (L : Plua_State; idx : Integer) : Integer; cdecl; Tlua_typename= function (L : Plua_State; tp : Integer) : PChar; cdecl; Tlua_equal= function (L : Plua_State; idx1, idx2 : Integer) : LongBool; cdecl; Tlua_rawequal= function (L : Plua_State; idx1, idx2 : Integer) : LongBool; cdecl; Tlua_lessthan= function (L : Plua_State; idx1, idx2 : Integer) : LongBool; cdecl; Tlua_tonumber= function (L : Plua_State; idx : Integer) : lua_Number; cdecl; Tlua_tointeger= function (L : Plua_State; idx : Integer) : lua_Integer; cdecl; Tlua_toboolean= function (L : Plua_State; idx : Integer) : LongBool; cdecl; Tlua_tolstring= function (L : Plua_State; idx : Integer; len : Psize_t) : PChar; cdecl; Tlua_objlen= function (L : Plua_State; idx : Integer) : size_t; cdecl; Tlua_tocfunction= function (L : Plua_State; idx : Integer) : lua_CFunction; cdecl; Tlua_touserdata= function (L : Plua_State; idx : Integer) : Pointer; cdecl; Tlua_tothread= function (L : Plua_State; idx : Integer) : Plua_State; cdecl; Tlua_topointer= function (L : Plua_State; idx : Integer) : Pointer; cdecl; {$ENDIF} (* ** push functions (C -> stack) *) {$IFDEF STATIC} procedure lua_pushnil(L : Plua_State); cdecl; external LuaDLL; procedure lua_pushnumber(L : Plua_State; n : lua_Number); cdecl; external LuaDLL; procedure lua_pushinteger(L : Plua_State; n : lua_Integer); cdecl; external LuaDLL; procedure lua_pushlstring(L : Plua_State; const s : PChar; ls : size_t); cdecl; external LuaDLL; procedure lua_pushstring(L : Plua_State; const s : PChar); cdecl; external LuaDLL; function lua_pushvfstring(L : Plua_State; const fmt : PChar; argp : Pointer) : PChar; cdecl; external LuaDLL; function lua_pushfstring(L : Plua_State; const fmt : PChar) : PChar; varargs; cdecl; external LuaDLL; procedure lua_pushcclosure(L : Plua_State; fn : lua_CFunction; n : Integer); cdecl; external LuaDLL; procedure lua_pushboolean(L : Plua_State; b : LongBool); cdecl; external LuaDLL; procedure lua_pushlightuserdata(L : Plua_State; p : Pointer); cdecl; external LuaDLL; function lua_pushthread(L : Plua_state) : Cardinal; cdecl; external LuaDLL; {$ENDIF} {$IFDEF DINAMIC} Tlua_pushnil= procedure (L : Plua_State); cdecl; Tlua_pushnumber= procedure (L : Plua_State; n : lua_Number); cdecl; Tlua_pushinteger= procedure (L : Plua_State; n : lua_Integer); cdecl; Tlua_pushlstring= procedure (L : Plua_State; const s : PChar; ls : size_t); cdecl; Tlua_pushstring= procedure (L : Plua_State; const s : PChar); cdecl; Tlua_pushvfstring= function (L : Plua_State; const fmt : PChar; argp : Pointer) : PChar; cdecl; Tlua_pushfstring= function (L : Plua_State; const fmt : PChar) : PChar; {varargs;} cdecl; Tlua_pushcclosure= procedure (L : Plua_State; fn : lua_CFunction; n : Integer); cdecl; Tlua_pushboolean= procedure (L : Plua_State; b : LongBool); cdecl; Tlua_pushlightuserdata= procedure (L : Plua_State; p : Pointer); cdecl; Tlua_pushthread= function (L : Plua_state) : Cardinal; cdecl; {$ENDIF} (* ** get functions (Lua -> stack) *) {$IFDEF STATIC} procedure lua_gettable(L : Plua_State ; idx : Integer); cdecl; external LuaDLL; procedure lua_getfield(L : Plua_State; idx : Integer; k : PChar); cdecl; external LuaDLL; procedure lua_rawget(L : Plua_State; idx : Integer); cdecl; external LuaDLL; procedure lua_rawgeti(L : Plua_State; idx, n : Integer); cdecl; external LuaDLL; procedure lua_createtable(L : Plua_State; narr, nrec : Integer); cdecl; external LuaDLL; function lua_newuserdata(L : Plua_State; sz : size_t) : Pointer; cdecl; external LuaDLL; function lua_getmetatable(L : Plua_State; objindex : Integer) : LongBool; cdecl; external LuaDLL; procedure lua_getfenv(L : Plua_State; idx : Integer); cdecl; external LuaDLL; {$ENDIF} {$IFDEF DINAMIC} Tlua_gettable= procedure (L : Plua_State ; idx : Integer); cdecl; Tlua_getfield= procedure (L : Plua_State; idx : Integer; k : PChar); cdecl; Tlua_rawget= procedure (L : Plua_State; idx : Integer); cdecl; Tlua_rawgeti= procedure (L : Plua_State; idx, n : Integer); cdecl; Tlua_createtable= procedure (L : Plua_State; narr, nrec : Integer); cdecl; Tlua_newuserdata= function (L : Plua_State; sz : size_t) : Pointer; cdecl; Tlua_getmetatable= function (L : Plua_State; objindex : Integer) : LongBool; cdecl; Tlua_getfenv= procedure (L : Plua_State; idx : Integer); cdecl; {$ENDIF} (* ** set functions (stack -> Lua) *) {$IFDEF STATIC} procedure lua_settable(L : Plua_State; idx : Integer); cdecl; external LuaDLL; procedure lua_setfield(L : Plua_State; idx : Integer; const k : PChar); cdecl; external LuaDLL; procedure lua_rawset(L : Plua_State; idx : Integer); cdecl; external LuaDLL; procedure lua_rawseti(L : Plua_State; idx , n: Integer); cdecl; external LuaDLL; function lua_setmetatable(L : Plua_State; objindex : Integer): LongBool; cdecl; external LuaDLL; function lua_setfenv(L : Plua_State; idx : Integer): LongBool; cdecl; external LuaDLL; {$ENDIF} {$IFDEF DINAMIC} Tlua_settable= procedure (L : Plua_State; idx : Integer); cdecl; Tlua_setfield= procedure (L : Plua_State; idx : Integer; const k : PChar); cdecl; Tlua_rawset= procedure (L : Plua_State; idx : Integer); cdecl; Tlua_rawseti= procedure (L : Plua_State; idx , n: Integer); cdecl; Tlua_setmetatable= function (L : Plua_State; objindex : Integer): LongBool; cdecl; Tlua_setfenv= function (L : Plua_State; idx : Integer): LongBool; cdecl; {$ENDIF} (* ** `load' and `call' functions (load and run Lua code) *) {$IFDEF STATIC} procedure lua_call(L : Plua_State; nargs, nresults : Integer); cdecl; external LuaDLL; function lua_pcall(L : Plua_State; nargs, nresults, errfunc : Integer) : Integer; cdecl; external LuaDLL; function lua_cpcall(L : Plua_State; func : lua_CFunction; ud : Pointer) : Integer; cdecl; external LuaDLL; function lua_load(L : Plua_State; reader : lua_Reader; dt : Pointer; const chunkname : PChar) : Integer; cdecl; external LuaDLL; function lua_dump(L : Plua_State; writer : lua_Writer; data: Pointer) : Integer; cdecl; external LuaDLL; {$ENDIF} {$IFDEF DINAMIC} Tlua_call= procedure (L : Plua_State; nargs, nresults : Integer); cdecl; Tlua_pcall= function (L : Plua_State; nargs, nresults, errfunc : Integer) : Integer; cdecl; Tlua_cpcall= function (L : Plua_State; func : lua_CFunction; ud : Pointer) : Integer; cdecl; Tlua_load= function (L : Plua_State; reader : lua_Reader; dt : Pointer; const chunkname : PChar) : Integer; cdecl; Tlua_dump= function (L : Plua_State; writer : lua_Writer; data: Pointer) : Integer; cdecl; {$ENDIF} (* ** coroutine functions *) {$IFDEF STATIC} function lua_yield(L : Plua_State; nresults : Integer) : Integer; cdecl; external LuaDLL; function lua_resume(L : Plua_State; narg : Integer) : Integer; cdecl; external LuaDLL; function lua_status(L : Plua_State) : Integer; cdecl; external LuaDLL; {$ENDIF} {$IFDEF DINAMIC} Tlua_yield= function (L : Plua_State; nresults : Integer) : Integer; cdecl; Tlua_resume= function (L : Plua_State; narg : Integer) : Integer; cdecl; Tlua_status= function (L : Plua_State) : Integer; cdecl; {$ENDIF} (* ** garbage-collection functions and options *) const LUA_GCSTOP = 0; LUA_GCRESTART = 1; LUA_GCCOLLECT = 2; LUA_GCCOUNT = 3; LUA_GCCOUNTB = 4; LUA_GCSTEP = 5; LUA_GCSETPAUSE = 6; LUA_GCSETSTEPMUL = 7; {$IFDEF STATIC} function lua_gc(L : Plua_State; what, data : Integer) : Integer; cdecl; external LuaDLL; {$ENDIF} {$IFDEF DINAMIC} type Tlua_gc = function(L : Plua_State; what, data : Integer):Integer; cdecl; {$ENDIF} (* ** miscellaneous functions *) {$IFDEF STATIC} function lua_error(L : Plua_State) : Integer; cdecl; external LuaDLL; function lua_next(L : Plua_State; idx : Integer) : Integer; cdecl; external LuaDLL; procedure lua_concat(L : Plua_State; n : Integer); cdecl; external LuaDLL; function lua_getallocf(L : Plua_State; ud : PPointer) : lua_Alloc; cdecl; external LuaDLL; procedure lua_setallocf(L : Plua_State; f : lua_Alloc; ud : Pointer); cdecl; external LuaDLL; {$ENDIF} {$IFDEF DINAMIC} Tlua_error= function (L : Plua_State) : Integer; cdecl; Tlua_next= function (L : Plua_State; idx : Integer) : Integer; cdecl; Tlua_concat= procedure (L : Plua_State; n : Integer); cdecl; Tlua_getallocf= function (L : Plua_State; ud : PPointer) : lua_Alloc; cdecl; Tlua_setallocf= procedure (L : Plua_State; f : lua_Alloc; ud : Pointer); cdecl; {$ENDIF} (* ** =============================================================== ** some useful macros ** =============================================================== *) procedure lua_pop(L : Plua_State; n : Integer); procedure lua_newtable(L : Plua_State); procedure lua_register(L : Plua_State; n : PChar; f : lua_CFunction); procedure lua_pushcfunction(L : Plua_State; f : lua_CFunction); function lua_strlen(L : Plua_State; idx : Integer) : Integer; function lua_isfunction(L : Plua_State; n : Integer) : Boolean; function lua_istable(L : Plua_State; n : Integer) : Boolean; function lua_islightuserdata(L : Plua_State; n : Integer) : Boolean; function lua_isnil(L : Plua_State; n : Integer) : Boolean; function lua_isboolean(L : Plua_State; n : Integer) : Boolean; function lua_isthread(L : Plua_State; n : Integer) : Boolean; function lua_isnone(L : Plua_State; n : Integer) : Boolean; function lua_isnoneornil(L : Plua_State; n : Integer) : Boolean; procedure lua_pushliteral(L : Plua_State; s : PChar); procedure lua_setglobal(L : Plua_State; s : PChar); procedure lua_getglobal(L : Plua_State; s : PChar); function lua_tostring(L : Plua_State; idx : Integer) : PChar; (* ** compatibility macros and functions *) function lua_open : Plua_State; procedure lua_getregistry(L : Plua_State); function lua_getgccount(L : Plua_State) : Integer; type lua_Chuckreader = type lua_Reader; lua_Chuckwriter = type lua_Writer; (* ====================================================================== *) (* ** {====================================================================== ** Debug API ** ======================================================================= *) (* ** Event codes *) const LUA_HOOKCALL = 0; LUA_HOOKRET = 1; LUA_HOOKLINE = 2; LUA_HOOKCOUNT = 3; LUA_HOOKTAILRET = 4; (* ** Event masks *) LUA_MASKCALL = 1 shl LUA_HOOKCALL; LUA_MASKRET = 1 shl LUA_HOOKRET; LUA_MASKLINE = 1 shl LUA_HOOKLINE; LUA_MASKCOUNT = 1 shl LUA_HOOKCOUNT; type lua_Debug = packed record event : Integer; name : PChar; (* (n) *) namewhat : PChar; (* (n) `global', `local', `field', `method' *) what : PChar; (* (S) `Lua', `C', `main', `tail' *) source : PChar; (* (S) *) currentline : Integer; (* (l) *) nups : Integer; (* (u) number of upvalues *) linedefined : Integer; (* (S) *) short_src : array [0..LUA_IDSIZE-1] of Char; (* (S) *) (* private part *) i_ci : Integer; (* active function *) end; Plua_Debug = ^lua_Debug; (* Functions to be called by the debuger in specific events *) lua_Hook = procedure (L : Plua_State; ar : Plua_Debug); cdecl; {$IFDEF STATIC} function lua_getstack(L : Plua_State; level : Integer; ar : Plua_Debug) : Integer; cdecl; external LuaDLL; function lua_getinfo(L : Plua_State; const what : PChar; ar: Plua_Debug): Integer; cdecl; external LuaDLL; function lua_getlocal(L : Plua_State; ar : Plua_Debug; n : Integer) : PChar; cdecl; external LuaDLL; function lua_setlocal(L : Plua_State; ar : Plua_Debug; n : Integer) : PChar; cdecl; external LuaDLL; function lua_getupvalue(L : Plua_State; funcindex, n : Integer) : PChar; cdecl; external LuaDLL; function lua_setupvalue(L : Plua_State; funcindex, n : Integer) : PChar; cdecl; external LuaDLL; function lua_sethook(L : Plua_State; func : lua_Hook; mask, count: Integer): Integer; cdecl; external LuaDLL; { function lua_gethook(L : Plua_State) : lua_Hook; cdecl; external LuaDLL; } function lua_gethookmask(L : Plua_State) : Integer; cdecl; external LuaDLL; function lua_gethookcount(L : Plua_State) : Integer; cdecl; external LuaDLL; {$ENDIF} {$IFDEF DINAMIC} type Tlua_getstack= function (L : Plua_State; level : Integer; ar : Plua_Debug) : Integer; cdecl; Tlua_getinfo= function (L : Plua_State; const what : PChar; ar: Plua_Debug): Integer; cdecl; Tlua_getlocal= function (L : Plua_State; ar : Plua_Debug; n : Integer) : PChar; cdecl; Tlua_setlocal= function (L : Plua_State; ar : Plua_Debug; n : Integer) : PChar; cdecl; Tlua_getupvalue= function (L : Plua_State; funcindex, n : Integer) : PChar; cdecl; Tlua_setupvalue= function (L : Plua_State; funcindex, n : Integer) : PChar; cdecl; Tlua_sethook= function (L : Plua_State; func : lua_Hook; mask, count: Integer): Integer; cdecl; {function lua_gethook(L : Plua_State) : lua_Hook; cdecl;} Tlua_gethookmask= function (L : Plua_State) : Integer; cdecl; Tlua_gethookcount= function (L : Plua_State) : Integer; cdecl; {$ENDIF} (*****************************************************************************) (* lualib.h *) (*****************************************************************************) (* ** $Id: lualib.h,v 1.36 2005/12/27 17:12:00 roberto Exp $ ** Lua standard libraries ** See Copyright Notice at the end of this file *) const (* Key to file-handle type *) LUA_FILEHANDLE = 'FILE*'; LUA_COLIBNAME = 'coroutine'; LUA_TABLIBNAME = 'table'; LUA_IOLIBNAME = 'io'; LUA_OSLIBNAME = 'os'; LUA_STRLIBNAME = 'string'; LUA_MATHLIBNAME = 'math'; LUA_DBLIBNAME = 'debug'; LUA_LOADLIBNAME = 'package'; {$IFDEF STATIC} function luaopen_base(L : Plua_State) : Integer; cdecl; external LuaDLL; function luaopen_table(L : Plua_State) : Integer; cdecl; external LuaDLL; function luaopen_io(L : Plua_State) : Integer; cdecl; external LuaDLL; function luaopen_os(L : Plua_State) : Integer; cdecl; external LuaDLL; function luaopen_string(L : Plua_State) : Integer; cdecl; external LuaDLL; function luaopen_math(L : Plua_State) : Integer; cdecl; external LuaDLL; function luaopen_debug(L : Plua_State) : Integer; cdecl; external LuaDLL; function luaopen_package(L : Plua_State) : Integer; cdecl; external LuaDLL; procedure luaL_openlibs(L : Plua_State); cdecl; external LuaDLL; {$ENDIF} {$IFDEF DINAMIC} type Tluaopen_base= function (L : Plua_State) : Integer; cdecl; Tluaopen_table= function (L : Plua_State) : Integer; cdecl; Tluaopen_io= function (L : Plua_State) : Integer; cdecl; Tluaopen_os= function (L : Plua_State) : Integer; cdecl; Tluaopen_string= function (L : Plua_State) : Integer; cdecl; Tluaopen_math= function (L : Plua_State) : Integer; cdecl; Tluaopen_debug= function (L : Plua_State) : Integer; cdecl; Tluaopen_package= function (L : Plua_State) : Integer; cdecl; TluaL_openlibs= procedure (L : Plua_State); cdecl; {$ENDIF} procedure lua_assert(x : Boolean); // a macro (*****************************************************************************) (* lauxlib.h *) (*****************************************************************************) (* ** $Id: lauxlib.h,v 1.87 2005/12/29 15:32:11 roberto Exp $ ** Auxiliary functions for building Lua libraries ** See Copyright Notice at the end of this file. *) // not compatibility with the behavior of setn/getn in Lua 5.0 function luaL_getn(L : Plua_State; idx : Integer) : Integer; procedure luaL_setn(L : Plua_State; i, j : Integer); const LUA_ERRFILE = LUA_ERRERR + 1; type luaL_Reg = packed record name : PChar; func : lua_CFunction; end; PluaL_Reg = ^luaL_Reg; {$IFDEF STATIC} procedure luaL_openlib(L : Plua_State; const libname : PChar; const lr : PluaL_Reg; nup : Integer); cdecl; external LuaDLL; procedure luaL_register(L : Plua_State; const libname : PChar; const lr : PluaL_Reg); cdecl; external LuaDLL; function luaL_getmetafield(L : Plua_State; obj : Integer; const e : PChar) : Integer; cdecl; external LuaDLL; function luaL_callmeta(L : Plua_State; obj : Integer; const e : PChar) : Integer; cdecl; external LuaDLL; function luaL_typerror(L : Plua_State; narg : Integer; const tname : PChar) : Integer; cdecl; external LuaDLL; function luaL_argerror(L : Plua_State; numarg : Integer; const extramsg : PChar) : Integer; cdecl; external LuaDLL; function luaL_checklstring(L : Plua_State; numArg : Integer; ls : Psize_t) : PChar; cdecl; external LuaDLL; function luaL_optlstring(L : Plua_State; numArg : Integer; const def: PChar; ls: Psize_t) : PChar; cdecl; external LuaDLL; function luaL_checknumber(L : Plua_State; numArg : Integer) : lua_Number; cdecl; external LuaDLL; function luaL_optnumber(L : Plua_State; nArg : Integer; def : lua_Number) : lua_Number; cdecl; external LuaDLL; function luaL_checkinteger(L : Plua_State; numArg : Integer) : lua_Integer; cdecl; external LuaDLL; function luaL_optinteger(L : Plua_State; nArg : Integer; def : lua_Integer) : lua_Integer; cdecl; external LuaDLL; procedure luaL_checkstack(L : Plua_State; sz : Integer; const msg : PChar); cdecl; external LuaDLL; procedure luaL_checktype(L : Plua_State; narg, t : Integer); cdecl; external LuaDLL; procedure luaL_checkany(L : Plua_State; narg : Integer); cdecl; external LuaDLL; function luaL_newmetatable(L : Plua_State; const tname : PChar) : Integer; cdecl; external LuaDLL; function luaL_checkudata(L : Plua_State; ud : Integer; const tname : PChar) : Pointer; cdecl; external LuaDLL; procedure luaL_where(L : Plua_State; lvl : Integer); cdecl; external LuaDLL; function luaL_error(L : Plua_State; const fmt : PChar) : Integer; varargs; cdecl; external LuaDLL; function luaL_checkoption(L : Plua_State; narg : Integer; const def : PChar; const lst : array of PChar) : Integer; cdecl; external LuaDLL; function luaL_ref(L : Plua_State; t : Integer) : Integer; cdecl; external LuaDLL; procedure luaL_unref(L : Plua_State; t, ref : Integer); cdecl; external LuaDLL; function luaL_loadfile(L : Plua_State; const filename : PChar) : Integer; cdecl; external LuaDLL; function luaL_loadbuffer(L : Plua_State; const buff : PChar; sz : size_t; const name: PChar) : Integer; cdecl; external LuaDLL; function luaL_loadstring(L : Plua_State; const s : Pchar) : Integer; cdecl; external LuaDLL; function luaL_newstate : Plua_State; cdecl; external LuaDLL; function luaL_gsub(L : Plua_State; const s, p, r : PChar) : PChar; cdecl; external LuaDLL; function luaL_findtable(L : Plua_State; idx : Integer; const fname : PChar; szhint : Integer) : PChar; cdecl; external LuaDLL; {$ENDIF} {$IFDEF DINAMIC} type TluaL_openlib= procedure (L : Plua_State; const libname : PChar; const lr : PluaL_Reg; nup : Integer); cdecl; TluaL_register= procedure (L : Plua_State; const libname : PChar; const lr : PluaL_Reg); cdecl; TluaL_getmetafield= function (L : Plua_State; obj : Integer; const e : PChar) : Integer; cdecl; TluaL_callmeta= function (L : Plua_State; obj : Integer; const e : PChar) : Integer; cdecl; TluaL_typerror= function (L : Plua_State; narg : Integer; const tname : PChar) : Integer; cdecl; TluaL_argerror= function (L : Plua_State; numarg : Integer; const extramsg : PChar) : Integer; cdecl; TluaL_checklstring= function (L : Plua_State; numArg : Integer; ls : Psize_t) : PChar; cdecl; TluaL_optlstring= function (L : Plua_State; numArg : Integer; const def: PChar; ls: Psize_t) : PChar; cdecl; TluaL_checknumber= function (L : Plua_State; numArg : Integer) : lua_Number; cdecl; TluaL_optnumber= function (L : Plua_State; nArg : Integer; def : lua_Number) : lua_Number; cdecl; TluaL_checkinteger= function (L : Plua_State; numArg : Integer) : lua_Integer; cdecl; TluaL_optinteger= function (L : Plua_State; nArg : Integer; def : lua_Integer) : lua_Integer; cdecl; TluaL_checkstack= procedure (L : Plua_State; sz : Integer; const msg : PChar); cdecl; TluaL_checktype= procedure (L : Plua_State; narg, t : Integer); cdecl; TluaL_checkany= procedure (L : Plua_State; narg : Integer); cdecl; TluaL_newmetatable= function (L : Plua_State; const tname : PChar) : Integer; cdecl; TluaL_checkudata= function (L : Plua_State; ud : Integer; const tname : PChar) : Pointer; cdecl; TluaL_where= procedure (L : Plua_State; lvl : Integer); cdecl; TluaL_error= function (L : Plua_State; const fmt : PChar) : Integer; varargs; cdecl; TluaL_checkoption= function (L : Plua_State; narg : Integer; const def : PChar; const lst : array of PChar) : Integer; cdecl; TluaL_ref= function (L : Plua_State; t : Integer) : Integer; cdecl; TluaL_unref= procedure (L : Plua_State; t, ref : Integer); cdecl; TluaL_loadfile= function (L : Plua_State; const filename : PChar) : Integer; cdecl; TluaL_loadbuffer= function (L : Plua_State; const buff : PChar; sz : size_t; const name: PChar) : Integer; cdecl; TluaL_loadstring= function (L : Plua_State; const s : Pchar) : Integer; cdecl; TluaL_newstate= function : Plua_State; cdecl; TluaL_gsub= function (L : Plua_State; const s, p, r : PChar) : PChar; cdecl; TluaL_findtable= function (L : Plua_State; idx : Integer; const fname : PChar; szhint : Integer) : PChar; cdecl; {$ENDIF} (* ** =============================================================== ** some useful macros ** =============================================================== *) function luaL_argcheck(L : Plua_State; cond : Boolean; numarg : Integer; extramsg : PChar): Integer; function luaL_checkstring(L : Plua_State; n : Integer) : PChar; function luaL_optstring(L : Plua_State; n : Integer; d : PChar) : PChar; function luaL_checkint(L : Plua_State; n : Integer) : Integer; function luaL_optint(L : Plua_State; n, d : Integer): Integer; function luaL_checklong(L : Plua_State; n : LongInt) : LongInt; function luaL_optlong(L : Plua_State; n : Integer; d : LongInt) : LongInt; function luaL_typename(L : Plua_State; idx : Integer) : PChar; function luaL_dofile(L : Plua_State; fn : PChar) : Integer; function luaL_dostring(L : Plua_State; s : PChar) : Integer; procedure luaL_getmetatable(L : Plua_State; n : PChar); (* not implemented yet #define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n))) *) (* ** {====================================================== ** Generic Buffer manipulation ** ======================================================= *) type luaL_Buffer = packed record p : PChar; (* current position in buffer *) lvl : Integer; (* number of strings in the stack (level) *) L : Plua_State; buffer : array [0..LUAL_BUFFERSIZE-1] of Char; end; PluaL_Buffer = ^luaL_Buffer; procedure luaL_addchar(B : PluaL_Buffer; c : Char); (* compatibility only *) procedure luaL_putchar(B : PluaL_Buffer; c : Char); procedure luaL_addsize(B : PluaL_Buffer; n : Integer); {$IFDEF STATIC} procedure luaL_buffinit(L : Plua_State; B : PluaL_Buffer); cdecl; external LuaDLL; function luaL_prepbuffer(B : PluaL_Buffer) : PChar; cdecl; external LuaDLL; procedure luaL_addlstring(B : PluaL_Buffer; const s : PChar; ls : size_t); cdecl; external LuaDLL; procedure luaL_addstring(B : PluaL_Buffer; const s : PChar); cdecl; external LuaDLL; procedure luaL_addvalue(B : PluaL_Buffer); cdecl; external LuaDLL; procedure luaL_pushresult(B : PluaL_Buffer); cdecl; external LuaDLL; {$ENDIF} {$IFDEF DINAMIC} type TluaL_buffinit= procedure (L : Plua_State; B : PluaL_Buffer); cdecl; TluaL_prepbuffer= function (B : PluaL_Buffer) : PChar; cdecl; TluaL_addlstring= procedure (B : PluaL_Buffer; const s : PChar; ls : size_t); cdecl; TluaL_addstring= procedure (B : PluaL_Buffer; const s : PChar); cdecl; TluaL_addvalue= procedure (B : PluaL_Buffer); cdecl; TluaL_pushresult= procedure (B : PluaL_Buffer); cdecl; {$ENDIF} (* ====================================================== *) (* compatibility with ref system *) (* pre-defined references *) const LUA_NOREF = -2; LUA_REFNIL = -1; function lua_ref(L : Plua_State; lock : Boolean) : Integer; procedure lua_unref(L : Plua_State; ref : Integer); procedure lua_getref(L : Plua_State; ref : Integer); (******************************************************************************) (******************************************************************************) (******************************************************************************) {$IFDEF DINAMIC} type TLibHandle = PtrInt; var lua_newstate:Tlua_newstate; lua_close:Tlua_close; lua_newthread:Tlua_newthread; lua_atpanic:Tlua_atpanic; luaL_buffinit:TluaL_buffinit; luaL_prepbuffer:TluaL_prepbuffer; luaL_addlstring:TluaL_addlstring; luaL_addstring:TluaL_addstring; luaL_addvalue:TluaL_addvalue; luaL_pushresult:TluaL_pushresult; luaL_openlib:TluaL_openlib; luaL_register:TluaL_register; luaL_getmetafield:TluaL_getmetafield; luaL_callmeta:TluaL_callmeta; luaL_typerror:TluaL_typerror; luaL_argerror:TluaL_argerror; luaL_checklstring:TluaL_checklstring; luaL_optlstring:TluaL_optlstring; luaL_checknumber:TluaL_checknumber; luaL_optnumber:TluaL_optnumber; luaL_checkinteger:TluaL_checkinteger; luaL_optinteger:TluaL_optinteger; luaL_checkstack:TluaL_checkstack; luaL_checktype:TluaL_checktype; luaL_checkany:TluaL_checkany; luaL_newmetatable:TluaL_newmetatable; luaL_checkudata:TluaL_checkudata; luaL_where:TluaL_where; luaL_error:TluaL_error; luaL_checkoption:TluaL_checkoption; luaL_ref:TluaL_ref; luaL_unref:TluaL_unref; luaL_loadfile:TluaL_loadfile; luaL_loadbuffer:TluaL_loadbuffer; luaL_loadstring:TluaL_loadstring; luaL_newstate:TluaL_newstate; luaL_gsub:TluaL_gsub; luaL_findtable:TluaL_findtable; luaopen_base:Tluaopen_base; luaopen_table:Tluaopen_table; luaopen_io:Tluaopen_io; luaopen_os:Tluaopen_os; luaopen_string:Tluaopen_string; luaopen_math:Tluaopen_math; luaopen_debug:Tluaopen_debug; luaopen_package:Tluaopen_package; luaL_openlibs:TluaL_openlibs; lua_getstack:Tlua_getstack; lua_getinfo:Tlua_getinfo; lua_getlocal:Tlua_getlocal; lua_setlocal:Tlua_setlocal; lua_getupvalue:Tlua_getupvalue; lua_setupvalue:Tlua_setupvalue; lua_sethook:Tlua_sethook; {function lua_gethook(L : Plua_State) : lua_Hook; cdecl;} lua_gethookmask:Tlua_gethookmask; lua_gethookcount:Tlua_gethookcount; lua_error:Tlua_error; lua_next:Tlua_next; lua_concat:Tlua_concat; lua_getallocf:Tlua_getallocf; lua_setallocf:Tlua_setallocf; lua_gc:Tlua_gc; lua_yield:Tlua_yield; lua_resume:Tlua_resume; lua_status:Tlua_status; lua_call:Tlua_call; lua_pcall:Tlua_pcall; lua_cpcall:Tlua_cpcall; lua_load:Tlua_load; lua_dump:Tlua_dump; lua_settable:Tlua_settable; lua_setfield:Tlua_setfield; lua_rawset:Tlua_rawset; lua_rawseti:Tlua_rawseti; lua_setmetatable:Tlua_setmetatable; lua_setfenv:Tlua_setfenv; lua_gettable:Tlua_gettable; lua_getfield:Tlua_getfield; lua_rawget:Tlua_rawget; lua_rawgeti:Tlua_rawgeti; lua_createtable:Tlua_createtable; lua_newuserdata:Tlua_newuserdata; lua_getmetatable:Tlua_getmetatable; lua_getfenv:Tlua_getfenv; lua_pushnil:Tlua_pushnil; lua_pushnumber:Tlua_pushnumber; lua_pushinteger:Tlua_pushinteger; lua_pushlstring:Tlua_pushlstring; lua_pushstring:Tlua_pushstring; lua_pushvfstring:Tlua_pushvfstring; lua_pushfstring:Tlua_pushfstring; lua_pushcclosure:Tlua_pushcclosure; lua_pushboolean:Tlua_pushboolean; lua_pushlightuserdata:Tlua_pushlightuserdata; lua_pushthread:Tlua_pushthread; lua_isnumber:Tlua_isnumber; lua_isstring:Tlua_isstring; lua_iscfunction:Tlua_iscfunction; lua_isuserdata:Tlua_isuserdata; lua_type:Tlua_type; lua_typename:Tlua_typename; lua_equal:Tlua_equal; lua_rawequal:Tlua_rawequal; lua_lessthan:Tlua_lessthan; lua_tonumber:Tlua_tonumber; lua_tointeger:Tlua_tointeger; lua_toboolean:Tlua_toboolean; lua_tolstring:Tlua_tolstring; lua_objlen:Tlua_objlen; lua_tocfunction:Tlua_tocfunction; lua_touserdata:Tlua_touserdata; lua_tothread:Tlua_tothread; lua_topointer:Tlua_topointer; lua_gettop:Tlua_gettop; lua_settop:Tlua_settop; lua_pushvalue:Tlua_pushvalue; lua_remove:Tlua_remove; lua_insert:Tlua_insert; lua_replace:Tlua_replace; lua_checkstack:Tlua_checkstack; lua_xmove:Tlua_xmove; LuaLibD:TLibHandle; {$ENDIF} implementation uses SysUtils {$IFDEF DINAMIC} ,dynlibs {$ENDIF} ; {$IFDEF DINAMIC} procedure UnloadLuaLib; begin if LuaLibD<>0 then FreeLibrary(LuaLibD); end; function IsLuaLibLoaded: boolean; begin result:= (LuaLibD<>0); end; function LoadLuaLib(filename:string):boolean; begin result:=false; LuaLibD:=LoadLibrary(FileName); result:= (LuaLibD<>0); if LuaLibD=0 then exit; lua_newstate:=Tlua_newstate(GetProcAddress(LuaLibD,'lua_newstate')); lua_close:=Tlua_close(GetProcAddress(LuaLibD,'lua_close')); lua_newthread:=Tlua_newthread(GetProcAddress(LuaLibD,'lua_newthread')); lua_atpanic:=Tlua_atpanic(GetProcAddress(LuaLibD,'lua_atpanic')); luaL_buffinit:=TluaL_buffinit(GetProcAddress(LuaLibD,'luaL_buffinit')); luaL_prepbuffer:=TluaL_prepbuffer(GetProcAddress(LuaLibD,'luaL_prepbuffer')); luaL_addlstring:=TluaL_addlstring(GetProcAddress(LuaLibD,'luaL_addlstring')); luaL_addstring:=TluaL_addstring(GetProcAddress(LuaLibD,'luaL_addstring')); luaL_addvalue:=TluaL_addvalue(GetProcAddress(LuaLibD,'luaL_addvalue')); luaL_pushresult:=TluaL_pushresult(GetProcAddress(LuaLibD,'luaL_pushresult')); luaL_openlib:=TluaL_openlib(GetProcAddress(LuaLibD,'luaL_openlib')); luaL_register:=TluaL_register(GetProcAddress(LuaLibD,'luaL_register')); luaL_getmetafield:=TluaL_getmetafield(GetProcAddress(LuaLibD,'luaL_getmetafield')); luaL_callmeta:=TluaL_callmeta(GetProcAddress(LuaLibD,'luaL_callmeta')); luaL_typerror:=TluaL_typerror(GetProcAddress(LuaLibD,'luaL_typerror')); luaL_argerror:=TluaL_argerror(GetProcAddress(LuaLibD,'luaL_argerror')); luaL_checklstring:=TluaL_checklstring(GetProcAddress(LuaLibD,'luaL_checklstring')); luaL_optlstring:=TluaL_optlstring(GetProcAddress(LuaLibD,'luaL_optlstring')); luaL_checknumber:=TluaL_checknumber(GetProcAddress(LuaLibD,'luaL_checknumber')); luaL_optnumber:=TluaL_optnumber(GetProcAddress(LuaLibD,'luaL_optnumber')); luaL_checkinteger:=TluaL_checkinteger(GetProcAddress(LuaLibD,'luaL_checkinteger')); luaL_optinteger:=TluaL_optinteger(GetProcAddress(LuaLibD,'luaL_optinteger')); luaL_checkstack:=TluaL_checkstack(GetProcAddress(LuaLibD,'luaL_checkstack')); luaL_checktype:=TluaL_checktype(GetProcAddress(LuaLibD,'luaL_checktype')); luaL_checkany:=TluaL_checkany(GetProcAddress(LuaLibD,'luaL_checkany')); luaL_newmetatable:=TluaL_newmetatable(GetProcAddress(LuaLibD,'luaL_newmetatable')); luaL_checkudata:=TluaL_checkudata(GetProcAddress(LuaLibD,'luaL_checkudata')); luaL_where:=TluaL_where(GetProcAddress(LuaLibD,'luaL_where')); luaL_error:=TluaL_error(GetProcAddress(LuaLibD,'luaL_error')); luaL_checkoption:=TluaL_checkoption(GetProcAddress(LuaLibD,'luaL_checkoption')); luaL_ref:=TluaL_ref(GetProcAddress(LuaLibD,'luaL_ref')); luaL_unref:=TluaL_unref(GetProcAddress(LuaLibD,'luaL_unref')); luaL_loadfile:=TluaL_loadfile(GetProcAddress(LuaLibD,'luaL_loadfile')); luaL_loadbuffer:=TluaL_loadbuffer(GetProcAddress(LuaLibD,'luaL_loadbuffer')); luaL_loadstring:=TluaL_loadstring(GetProcAddress(LuaLibD,'luaL_loadstring')); luaL_newstate:=TluaL_newstate(GetProcAddress(LuaLibD,'luaL_newstate')); luaL_gsub:=TluaL_gsub(GetProcAddress(LuaLibD,'luaL_gsub')); luaL_findtable:=TluaL_findtable(GetProcAddress(LuaLibD,'luaL_findtable')); luaopen_base:=Tluaopen_base(GetProcAddress(LuaLibD,'luaopen_base')); luaopen_table:=Tluaopen_table(GetProcAddress(LuaLibD,'luaopen_table')); luaopen_io:=Tluaopen_io(GetProcAddress(LuaLibD,'luaopen_io')); luaopen_os:=Tluaopen_os(GetProcAddress(LuaLibD,'luaopen_os')); luaopen_string:=Tluaopen_string(GetProcAddress(LuaLibD,'luaopen_string')); luaopen_math:=Tluaopen_math(GetProcAddress(LuaLibD,'luaopen_math')); luaopen_debug:=Tluaopen_debug(GetProcAddress(LuaLibD,'luaopen_debug')); luaopen_package:=Tluaopen_package(GetProcAddress(LuaLibD,'luaopen_package')); luaL_openlibs:=TluaL_openlibs(GetProcAddress(LuaLibD,'luaL_openlibs')); lua_getstack:=Tlua_getstack(GetProcAddress(LuaLibD,'lua_getstack')); lua_getinfo:=Tlua_getinfo(GetProcAddress(LuaLibD,'lua_getinfo')); lua_getlocal:=Tlua_getlocal(GetProcAddress(LuaLibD,'lua_getlocal')); lua_setlocal:=Tlua_setlocal(GetProcAddress(LuaLibD,'lua_setlocal')); lua_getupvalue:=Tlua_getupvalue(GetProcAddress(LuaLibD,'lua_getupvalue')); lua_setupvalue:=Tlua_setupvalue(GetProcAddress(LuaLibD,'lua_setupvalue')); lua_sethook:=Tlua_sethook(GetProcAddress(LuaLibD,'lua_sethook')); //function lua_gethook(L := Plua_State) := lua_Hook; cdecl;')); lua_gethookmask:=Tlua_gethookmask(GetProcAddress(LuaLibD,'lua_gethookmask')); lua_gethookcount:=Tlua_gethookcount(GetProcAddress(LuaLibD,'lua_gethookcount')); lua_error:=Tlua_error(GetProcAddress(LuaLibD,'lua_error')); lua_next:=Tlua_next(GetProcAddress(LuaLibD,'lua_next')); lua_concat:=Tlua_concat(GetProcAddress(LuaLibD,'lua_concat')); lua_getallocf:=Tlua_getallocf(GetProcAddress(LuaLibD,'lua_getallocf')); lua_setallocf:=Tlua_setallocf(GetProcAddress(LuaLibD,'lua_setallocf')); lua_gc:=Tlua_gc(GetProcAddress(LuaLibD,'lua_gc')); lua_yield:=Tlua_yield(GetProcAddress(LuaLibD,'lua_yield')); lua_resume:=Tlua_resume(GetProcAddress(LuaLibD,'lua_resume')); lua_status:=Tlua_status(GetProcAddress(LuaLibD,'lua_status')); lua_call:=Tlua_call(GetProcAddress(LuaLibD,'lua_call')); lua_pcall:=Tlua_pcall(GetProcAddress(LuaLibD,'lua_pcall')); lua_cpcall:=Tlua_cpcall(GetProcAddress(LuaLibD,'lua_cpcall')); lua_load:=Tlua_load(GetProcAddress(LuaLibD,'lua_load')); lua_dump:=Tlua_dump(GetProcAddress(LuaLibD,'lua_dump')); lua_settable:=Tlua_settable(GetProcAddress(LuaLibD,'lua_settable')); lua_setfield:=Tlua_setfield(GetProcAddress(LuaLibD,'lua_setfield')); lua_rawset:=Tlua_rawset(GetProcAddress(LuaLibD,'lua_rawset')); lua_rawseti:=Tlua_rawseti(GetProcAddress(LuaLibD,'lua_rawseti')); lua_setmetatable:=Tlua_setmetatable(GetProcAddress(LuaLibD,'lua_setmetatable')); lua_setfenv:=Tlua_setfenv(GetProcAddress(LuaLibD,'lua_setfenv')); lua_gettable:=Tlua_gettable(GetProcAddress(LuaLibD,'lua_gettable')); lua_getfield:=Tlua_getfield(GetProcAddress(LuaLibD,'lua_getfield')); lua_rawget:=Tlua_rawget(GetProcAddress(LuaLibD,'lua_rawget')); lua_rawgeti:=Tlua_rawgeti(GetProcAddress(LuaLibD,'lua_rawgeti')); lua_createtable:=Tlua_createtable(GetProcAddress(LuaLibD,'lua_createtable')); lua_newuserdata:=Tlua_newuserdata(GetProcAddress(LuaLibD,'lua_newuserdata')); lua_getmetatable:=Tlua_getmetatable(GetProcAddress(LuaLibD,'lua_getmetatable')); lua_getfenv:=Tlua_getfenv(GetProcAddress(LuaLibD,'lua_getfenv')); lua_pushnil:=Tlua_pushnil(GetProcAddress(LuaLibD,'lua_pushnil')); lua_pushnumber:=Tlua_pushnumber(GetProcAddress(LuaLibD,'lua_pushnumber')); lua_pushinteger:=Tlua_pushinteger(GetProcAddress(LuaLibD,'lua_pushinteger')); lua_pushlstring:=Tlua_pushlstring(GetProcAddress(LuaLibD,'lua_pushlstring')); lua_pushstring:=Tlua_pushstring(GetProcAddress(LuaLibD,'lua_pushstring')); lua_pushvfstring:=Tlua_pushvfstring(GetProcAddress(LuaLibD,'lua_pushvfstring')); lua_pushfstring:=Tlua_pushfstring(GetProcAddress(LuaLibD,'lua_pushfstring')); lua_pushcclosure:=Tlua_pushcclosure(GetProcAddress(LuaLibD,'lua_pushcclosure')); lua_pushboolean:=Tlua_pushboolean(GetProcAddress(LuaLibD,'lua_pushboolean')); lua_pushlightuserdata:=Tlua_pushlightuserdata(GetProcAddress(LuaLibD,'lua_pushlightuserdata')); lua_pushthread:=Tlua_pushthread(GetProcAddress(LuaLibD,'lua_pushthread')); lua_isnumber:=Tlua_isnumber(GetProcAddress(LuaLibD,'lua_isnumber')); lua_isstring:=Tlua_isstring(GetProcAddress(LuaLibD,'lua_isstring')); lua_iscfunction:=Tlua_iscfunction(GetProcAddress(LuaLibD,'lua_iscfunction')); lua_isuserdata:=Tlua_isuserdata(GetProcAddress(LuaLibD,'lua_isuserdata')); lua_type:=Tlua_type(GetProcAddress(LuaLibD,'lua_type')); lua_typename:=Tlua_typename(GetProcAddress(LuaLibD,'lua_typename')); lua_equal:=Tlua_equal(GetProcAddress(LuaLibD,'lua_equal')); lua_rawequal:=Tlua_rawequal(GetProcAddress(LuaLibD,'lua_rawequal')); lua_lessthan:=Tlua_lessthan(GetProcAddress(LuaLibD,'lua_lessthan')); lua_tonumber:=Tlua_tonumber(GetProcAddress(LuaLibD,'lua_tonumber')); lua_tointeger:=Tlua_tointeger(GetProcAddress(LuaLibD,'lua_tointeger')); lua_toboolean:=Tlua_toboolean(GetProcAddress(LuaLibD,'lua_toboolean')); lua_tolstring:=Tlua_tolstring(GetProcAddress(LuaLibD,'lua_tolstring')); lua_objlen:=Tlua_objlen(GetProcAddress(LuaLibD,'lua_objlen')); lua_tocfunction:=Tlua_tocfunction(GetProcAddress(LuaLibD,'lua_tocfunction')); lua_touserdata:=Tlua_touserdata(GetProcAddress(LuaLibD,'lua_touserdata')); lua_tothread:=Tlua_tothread(GetProcAddress(LuaLibD,'lua_tothread')); lua_topointer:=Tlua_topointer(GetProcAddress(LuaLibD,'lua_topointer')); lua_gettop:=Tlua_gettop(GetProcAddress(LuaLibD,'lua_gettop')); lua_settop:=Tlua_settop(GetProcAddress(LuaLibD,'lua_settop')); lua_pushvalue:=Tlua_pushvalue(GetProcAddress(LuaLibD,'lua_pushvalue')); lua_remove:=Tlua_remove(GetProcAddress(LuaLibD,'lua_remove')); lua_insert:=Tlua_insert(GetProcAddress(LuaLibD,'lua_insert')); lua_replace:=Tlua_replace(GetProcAddress(LuaLibD,'lua_replace')); lua_checkstack:=Tlua_checkstack(GetProcAddress(LuaLibD,'lua_checkstack')); lua_xmove:=Tlua_xmove(GetProcAddress(LuaLibD,'lua_xmove')); end; {$ENDIF} (*****************************************************************************) (* luaconfig.h *) (*****************************************************************************) function lua_readline(L : Plua_State; var b : PChar; p : PChar): Boolean; var s : AnsiString; begin Write(p); // show prompt ReadLn(s); // get line b := PChar(s); // and return it lua_readline := (b[0] <> #4); // test for ctrl-D end; procedure lua_saveline(L : Plua_State; idx : Integer); begin end; procedure lua_freeline(L : Plua_State; b : PChar); begin end; (*****************************************************************************) (* lua.h *) (*****************************************************************************) function lua_upvalueindex(idx : Integer) : Integer; begin lua_upvalueindex := LUA_GLOBALSINDEX - idx; end; procedure lua_pop(L : Plua_State; n : Integer); begin lua_settop(L, -n - 1); end; procedure lua_newtable(L : Plua_State); begin lua_createtable(L, 0, 0); end; procedure lua_register(L : Plua_State; n : PChar; f : lua_CFunction); begin lua_pushcfunction(L, f); lua_setglobal(L, n); end; procedure lua_pushcfunction(L : Plua_State; f : lua_CFunction); begin lua_pushcclosure(L, f, 0); end; function lua_strlen(L : Plua_State; idx : Integer) : Integer; begin lua_strlen := lua_objlen(L, idx); end; function lua_isfunction(L : Plua_State; n : Integer) : Boolean; begin lua_isfunction := lua_type(L, n) = LUA_TFUNCTION; end; function lua_istable(L : Plua_State; n : Integer) : Boolean; begin lua_istable := lua_type(L, n) = LUA_TTABLE; end; function lua_islightuserdata(L : Plua_State; n : Integer) : Boolean; begin lua_islightuserdata := lua_type(L, n) = LUA_TLIGHTUSERDATA; end; function lua_isnil(L : Plua_State; n : Integer) : Boolean; begin lua_isnil := lua_type(L, n) = LUA_TNIL; end; function lua_isboolean(L : Plua_State; n : Integer) : Boolean; begin lua_isboolean := lua_type(L, n) = LUA_TBOOLEAN; end; function lua_isthread(L : Plua_State; n : Integer) : Boolean; begin lua_isthread := lua_type(L, n) = LUA_TTHREAD; end; function lua_isnone(L : Plua_State; n : Integer) : Boolean; begin lua_isnone := lua_type(L, n) = LUA_TNONE; end; function lua_isnoneornil(L : Plua_State; n : Integer) : Boolean; begin lua_isnoneornil := lua_type(L, n) <= 0; end; procedure lua_pushliteral(L : Plua_State; s : PChar); begin lua_pushlstring(L, s, StrLen(s)); end; procedure lua_setglobal(L : Plua_State; s : PChar); begin lua_setfield(L, LUA_GLOBALSINDEX, s); end; procedure lua_getglobal(L: Plua_State; s: PChar); begin lua_getfield(L, LUA_GLOBALSINDEX, s); end; function lua_tostring(L : Plua_State; idx : Integer) : PChar; begin lua_tostring := lua_tolstring(L, idx, nil); end; function lua_open : Plua_State; begin lua_open := luaL_newstate(); end; procedure lua_getregistry(L : Plua_State); begin lua_pushvalue(L, LUA_REGISTRYINDEX); end; function lua_getgccount(L : Plua_State) : Integer; begin lua_getgccount := lua_gc(L, LUA_GCCOUNT, 0); end; (*****************************************************************************) (* lualib.h *) (*****************************************************************************) procedure lua_assert(x : Boolean); begin end; (*****************************************************************************) (* lauxlib.h n *) (*****************************************************************************) function luaL_getn(L : Plua_State; idx : Integer) : Integer; begin luaL_getn := lua_objlen(L, idx); end; procedure luaL_setn(L : plua_State; i, j : Integer); begin (* no op *) end; function luaL_argcheck(L : Plua_State; cond : Boolean; numarg : Integer; extramsg : PChar): Integer; begin if not cond then luaL_argcheck := luaL_argerror(L, numarg, extramsg) else luaL_argcheck := 0; end; function luaL_checkstring(L : Plua_State; n : Integer) : PChar; begin luaL_checkstring := luaL_checklstring(L, n, nil); end; function luaL_optstring(L : Plua_State; n : Integer; d : PChar) : PChar; begin luaL_optstring := luaL_optlstring(L, n, d, nil); end; function luaL_checkint(L : Plua_State; n : Integer) : Integer; begin luaL_checkint := luaL_checkinteger(L, n); end; function luaL_optint(L : Plua_State; n, d : Integer): Integer; begin luaL_optint := luaL_optinteger(L, n, d); end; function luaL_checklong(L : Plua_State; n : LongInt) : LongInt; begin luaL_checklong := luaL_checkinteger(L, n); end; function luaL_optlong(L : Plua_State; n : Integer; d : LongInt) : LongInt; begin luaL_optlong := luaL_optinteger(L, n, d); end; function luaL_typename(L : Plua_State; idx : Integer) : PChar; begin luaL_typename := lua_typename( L, lua_type(L, idx) ); end; function luaL_dofile(L : Plua_State; fn : PChar) : Integer; Var Res : Integer; begin // WC 2007\03\22 - Updated for Delphi Res := luaL_loadfile(L, fn); if Res = 0 then Res := lua_pcall(L, 0, 0, 0); Result := Res; end; function luaL_dostring(L : Plua_State; s : PChar) : Integer; Var Res : Integer; begin // WC 2007\03\22 - Updated for Delphi Res := luaL_loadstring(L, s); if Res = 0 then Res := lua_pcall(L, 0, 0, 0); Result := Res; end; procedure luaL_getmetatable(L : Plua_State; n : PChar); begin lua_getfield(L, LUA_REGISTRYINDEX, n); end; procedure luaL_addchar(B : PluaL_Buffer; c : Char); begin if not(B^.p < B^.buffer + LUAL_BUFFERSIZE) then luaL_prepbuffer(B); B^.p^ := c; Inc(B^.p); end; procedure luaL_putchar(B : PluaL_Buffer; c : Char); begin luaL_addchar(B, c); end; procedure luaL_addsize(B : PluaL_Buffer; n : Integer); begin Inc(B^.p, n); end; function lua_ref(L : Plua_State; lock : Boolean) : Integer; begin if lock then lua_ref := luaL_ref(L, LUA_REGISTRYINDEX) else begin lua_pushstring(L, 'unlocked references are obsolete'); lua_error(L); lua_ref := 0; end; end; procedure lua_unref(L : Plua_State; ref : Integer); begin luaL_unref(L, LUA_REGISTRYINDEX, ref); end; procedure lua_getref(L : Plua_State; ref : Integer); begin lua_rawgeti(L, LUA_REGISTRYINDEX, ref); end; (****************************************************************************** * Original copyright for the lua source and headers: * 1994-2004 Tecgraf, PUC-Rio. * www.lua.org. * * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ******************************************************************************) end. doublecmd-0.5.8/src/platform/udragdropgtk.pas0000644000175000017500000003633411740433676020347 0ustar alexxalexx{ Drag&Drop operations for GTK. } unit uDragDropGtk; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Controls, uDragDropEx {$IF DEFINED(LCLGTK)} ,GLib, Gtk, Gdk {$ELSEIF DEFINED(LCLGTK2)} ,GLib2, Gtk2, Gdk2 {$ENDIF} ; type TDragDropSourceGTK = class(TDragDropSource) constructor Create(TargetControl: TWinControl); override; destructor Destroy; override; function RegisterEvents(DragBeginEvent : uDragDropEx.TDragBeginEvent; RequestDataEvent: uDragDropEx.TRequestDataEvent; DragEndEvent : uDragDropEx.TDragEndEvent): Boolean; override; procedure UnregisterEvents; override; function DoDragDrop(const FileNamesList: TStringList; MouseButton: TMouseButton; ScreenStartPoint: TPoint): Boolean; override; private procedure ConnectSignal(name: pgChar; func: Pointer); procedure DisconnectSignal(func: Pointer); end; TDragDropTargetGTK = class(TDragDropTarget) public constructor Create(TargetControl: TWinControl); override; destructor Destroy; override; function RegisterEvents(DragEnterEvent: uDragDropEx.TDragEnterEvent; DragOverEvent : uDragDropEx.TDragOverEvent; DropEvent : uDragDropEx.TDropEvent; DragLeaveEvent: uDragDropEx.TDragLeaveEvent): Boolean; override; procedure UnregisterEvents; override; private procedure ConnectSignal(name: pgChar; func: Pointer); procedure DisconnectSignal(func: Pointer); end; { Source events } function OnDragBegin(widget: PGtkWidget; context: PGdkDragContext; param: gPointer): GBoolean; cdecl; function OnDragDataGet(widget: PGtkWidget; context: PGdkDragContext; selection: PGtkSelectionData; info, time: guint; param: gPointer): GBoolean; cdecl; function OnDragDataDelete(widget: PGtkWidget; context: PGdkDragContext; param: gPointer): GBoolean; cdecl; function OnDragEnd(widget: PGtkWidget; context: PGdkDragContext; param: gPointer): GBoolean; cdecl; { Target events } function OnDragMotion(widget: PGtkWidget; context: PGdkDragContext; x, y: gint; time: guint; param: gPointer): GBoolean; cdecl; function OnDrop(widget: PGtkWidget; context: PGdkDragContext; x, y: gint; time: guint; param: gPointer): GBoolean; cdecl; function OnDataReceived(widget: PGtkWidget; context: PGdkDragContext; x, y: gint; selection: PGtkSelectionData; info, time: guint; param: gPointer): GBoolean; cdecl; function OnDragLeave(widget: PGtkWidget; context: PGdkDragContext; time: guint; param: gPointer): GBoolean; cdecl; function GtkActionToDropEffect(Action: TGdkDragAction):TDropEffect; function DropEffectToGtkAction(DropEffect: TDropEffect):TGdkDragAction; implementation uses uClipboard; // URI handling type // Order of these should be the same as in Targets array. TTargetId = (tidTextUriList, tidTextPlain); var Targets: array [0..1] of TGtkTargetEntry // 'info' field is a unique target id // Uri-list should be first so it can be catched before other targets, if available. = ((target: uriListMime ; flags: 0; info:LongWord(tidTextUriList)), (target: textPlainMime; flags: 0; info:LongWord(tidTextPlain))); // True, if the user is already dragging inside the target control. // Used to simulate drag-enter event in drag-motion handler. DragEntered: Boolean = False; { ---------- TDragDropSourceGTK ---------- } constructor TDragDropSourceGTK.Create(TargetControl: TWinControl); begin inherited Create(TargetControl); end; destructor TDragDropSourceGTK.Destroy; begin inherited; end; procedure TDragDropSourceGTK.ConnectSignal(name: pgChar; func: Pointer); begin gtk_signal_connect(PGtkObject(GetControl.Handle), name, TGtkSignalFunc(func), gPointer(Self)); // Pointer to class instance end; procedure TDragDropSourceGTK.DisconnectSignal(func: Pointer); begin gtk_signal_disconnect_by_func(PGtkObject(GetControl.Handle), TGtkSignalFunc(func), gPointer(Self)); end; function TDragDropSourceGTK.RegisterEvents(DragBeginEvent : uDragDropEx.TDragBeginEvent; RequestDataEvent: uDragDropEx.TRequestDataEvent; DragEndEvent : uDragDropEx.TDragEndEvent): Boolean; begin inherited; GetControl.HandleNeeded; if GetControl.HandleAllocated = True then begin // We don't set up as a drag source here, as we handle it manually. ConnectSignal('drag_begin', @OnDragBegin); ConnectSignal('drag_data_get', @OnDragDataGet); ConnectSignal('drag_data_delete', @OnDragDataDelete); ConnectSignal('drag_end', @OnDragEnd); //'drag-failed'(widget, context, result:guint); Result := True; end; end; procedure TDragDropSourceGTK.UnregisterEvents; begin DisconnectSignal(@OnDragBegin); DisconnectSignal(@OnDragDataGet); DisconnectSignal(@OnDragDataDelete); DisconnectSignal(@OnDragEnd); inherited; end; function TDragDropSourceGTK.DoDragDrop(const FileNamesList: TStringList; MouseButton: TMouseButton; ScreenStartPoint: TPoint): Boolean; var PList: PGtkTargetList; context: PGdkDragContext; ButtonNr: Integer; begin Result := False; FFileNamesList.Assign(FileNamesList); case MouseButton of mbLeft : ButtonNr := 1; mbMiddle: ButtonNr := 2; mbRight : ButtonNr := 3; else Exit; end; PList := gtk_target_list_new(@Targets[0], Length(Targets)); // Will be freed by GTK if Assigned(PList) then begin context := gtk_drag_begin( PGtkWidget(GetControl.Handle), PList, // Allowed effects GDK_ACTION_COPY or GDK_ACTION_MOVE or GDK_ACTION_LINK or GDK_ACTION_ASK, ButtonNr, nil // no event - we're starting manually ); if Assigned(context) then Result:=True; end; end; { ---------- TDragDropTargetGTK ---------- } constructor TDragDropTargetGTK.Create(TargetControl: TWinControl); begin inherited Create(TargetControl); end; destructor TDragDropTargetGTK.Destroy; begin inherited; end; procedure TDragDropTargetGTK.ConnectSignal(name: pgChar; func: Pointer); begin gtk_signal_connect(PGtkObject(GetControl.Handle), name, TGtkSignalFunc(func), gPointer(Self)); // Pointer to class instance end; procedure TDragDropTargetGTK.DisconnectSignal(func: Pointer); begin gtk_signal_disconnect_by_func(PGtkObject(GetControl.Handle), TGtkSignalFunc(func), gPointer(Self)); end; function TDragDropTargetGTK.RegisterEvents( DragEnterEvent: uDragDropEx.TDragEnterEvent; DragOverEvent : uDragDropEx.TDragOverEvent; DropEvent : uDragDropEx.TDropEvent; DragLeaveEvent: uDragDropEx.TDragLeaveEvent): Boolean; begin inherited; GetControl.HandleNeeded; if GetControl.HandleAllocated = True then begin // Set up as drag target. gtk_drag_dest_set( PGtkWidget(GetControl.Handle), // default handling of some signals GTK_DEST_DEFAULT_ALL, // What targets the drag source promises to supply. @Targets[0], Length(Targets), // Effects that target supports GDK_ACTION_COPY or GDK_ACTION_MOVE or GDK_ACTION_LINK or GDK_ACTION_ASK ); ConnectSignal('drag_motion', @OnDragMotion); ConnectSignal('drag_drop', @OnDrop); ConnectSignal('drag_data_received', @OnDataReceived); ConnectSignal('drag_leave', @OnDragLeave); Result := True; end; end; procedure TDragDropTargetGTK.UnregisterEvents; begin DisconnectSignal(@OnDragMotion); DisconnectSignal(@OnDrop); DisconnectSignal(@OnDataReceived); DisconnectSignal(@OnDragLeave); if GetControl.HandleAllocated = True then gtk_drag_dest_unset(PGtkWidget(GetControl.Handle)); inherited; end; { ---------- Source events ---------- } function OnDragBegin(widget: PGtkWidget; context: PGdkDragContext; param: gPointer): GBoolean; cdecl; var DragDropSource: TDragDropSourceGTK; begin DragDropSource := TDragDropSourceGTK(param); if Assigned(DragDropSource.GetDragBeginEvent) then Result := DragDropSource.GetDragBeginEvent()() else Result := True; end; function OnDragDataGet(widget: PGtkWidget; context: PGdkDragContext; selection: PGtkSelectionData; info, time: guint; param: gPointer): GBoolean; cdecl; var DragDropSource: TDragDropSourceGTK; dataString: string; begin DragDropSource := TDragDropSourceGTK(param); if (info < Low(Targets)) or (info > High(Targets)) then begin // Should not happen, as we didn't promise other targets in gtk_drag_begin. Result := False; Exit; end; if Assigned(DragDropSource.GetRequestDataEvent) then begin // Event has a handler assigned, so ask the control for data string. dataString := DragDropSource.GetRequestDataEvent()( DragDropSource.GetFileNamesList, Targets[info].target, // context^.action - the action chosen by the destination GtkActionToDropEffect(context^.action)); end else case TTargetId(info) of tidTextUriList: dataString := FormatUriList(DragDropSource.GetFileNamesList); tidTextPlain: dataString := FormatTextPlain(DragDropSource.GetFileNamesList); end; // gtk_selection_data_set makes a copy of passed data and zero-terminates it. gtk_selection_data_set(selection, gdk_atom_intern(Targets[info].target, gtk_true), Sizeof(dataString[1]) * 8, // nr of bits per unit (char) pguchar(@dataString[1]), Length(dataString)); Result := True; end; function OnDragDataDelete(widget: PGtkWidget; context: PGdkDragContext; param: gPointer): GBoolean; cdecl; var DragDropSource: TDragDropSourceGTK; begin DragDropSource := TDragDropSourceGTK(param); Result := True; end; function OnDragEnd(widget: PGtkWidget; context: PGdkDragContext; param: gPointer): GBoolean; cdecl; var DragDropSource: TDragDropSourceGTK; begin DragDropSource := TDragDropSourceGTK(param); if Assigned(DragDropSource.GetDragEndEvent) then Result := DragDropSource.GetDragEndEvent()() else Result := True; end; { ---------- Target events ---------- } function OnDragMotion(widget: PGtkWidget; context: PGdkDragContext; x, y: gint; time: guint; param: gPointer): GBoolean; cdecl; var DropEffect: TDropEffect; Action: TGdkDragAction; CursorPosition: TPoint; DragDropTarget: TDragDropTargetGTK; begin DragDropTarget := TDragDropTargetGTK(param); Result := True; // default to accepting drag movement // context^.suggested_action - the action suggested by the source // context^.actions - a bitmask of actions proposed by the source // when suggested_action is GDK_ACTION_ASK. DropEffect := GtkActionToDropEffect(context^.suggested_action); CursorPosition := DragDropTarget.GetControl.ClientToScreen(Point(X, Y)); if DragEntered = False then begin // This is the first time a cursor is moving inside the window // (possibly after a previous drag-leave event). DragEntered := True; if Assigned(DragDropTarget.GetDragEnterEvent) then Result := DragDropTarget.GetDragEnterEvent()(DropEffect, CursorPosition); end else begin if Assigned(DragDropTarget.GetDragOverEvent) then Result := DragDropTarget.GetDragOverEvent()(DropEffect, CursorPosition); end; if Result = True then Action := DropEffectToGtkAction(DropEffect) else Action := 0; // don't accept dragging // Reply with appropriate 'action'. gdk_drag_status(context, Action, time); end; function OnDataReceived(widget: PGtkWidget; context: PGdkDragContext; x, y: gint; selection: PGtkSelectionData; info, time: guint; param: gPointer): GBoolean; cdecl; var DragDropTarget: TDragDropTargetGTK; DropEffect: TDropEffect; FileNamesList: TStringList = nil; CursorPosition: TPoint; uriList: string; begin DragDropTarget := TDragDropTargetGTK(param); DropEffect := GtkActionToDropEffect(context^.suggested_action); CursorPosition := DragDropTarget.GetControl.ClientToScreen(Point(X, Y)); Result := False; if Assigned(DragDropTarget.GetDropEvent) and Assigned(selection) and Assigned(selection^.data) and (selection^.length > 0) // if selection length < 0 data is invalid then begin SetString(uriList, PChar(selection^.data), selection^.length); // 'info' denotes which target was matched by gtk_drag_get_data case TTargetId(info) of tidTextUriList: uriList := URIDecode(Trim(uriList)); tidTextPlain: // try decoding, as text/plain may also be percent-encoded uriList := URIDecode(Trim(uriList)); else Exit; // not what we hoped for end; try FileNamesList := ExtractFilenames(uriList); if Assigned(FileNamesList) and (FileNamesList.Count > 0) then Result := DragDropTarget.GetDropEvent()(FileNamesList, DropEffect, CursorPosition); finally if Assigned(FileNamesList) then FreeAndNil(FileNamesList); end; end; // gtk_drag_finish is called automatically, because // GTK_DEST_DEFAULT_DROP flag was passed to gtk_drag_dest_set. end; function OnDrop(widget: PGtkWidget; context: PGdkDragContext; x, y: gint; time: guint; param: gPointer): GBoolean; cdecl; var DragDropTarget: TDragDropTargetGTK; begin DragDropTarget := TDragDropTargetGTK(param); Result := True; end; function OnDragLeave(widget: PGtkWidget; context: PGdkDragContext; time: guint; param: gPointer): GBoolean; cdecl; var DragDropTarget: TDragDropTargetGTK; begin DragDropTarget := TDragDropTargetGTK(param); DragEntered := False; if Assigned(DragDropTarget.GetDragLeaveEvent) then Result := DragDropTarget.GetDragLeaveEvent()() else Result:= True; end; { ---------------------------------------------------------------------------- } function GtkActionToDropEffect(Action: TGdkDragAction):TDropEffect; begin case Action of GDK_ACTION_COPY: Result := DropCopyEffect; GDK_ACTION_MOVE: Result := DropMoveEffect; GDK_ACTION_LINK: Result := DropLinkEffect; GDK_ACTION_ASK : Result := DropAskEffect; else Result := DropNoEffect; end; end; function DropEffectToGtkAction(DropEffect: TDropEffect):TGdkDragAction; begin case DropEffect of DropCopyEffect: Result := GDK_ACTION_COPY; DropMoveEffect: Result := GDK_ACTION_MOVE; DropLinkEffect: Result := GDK_ACTION_LINK; DropAskEffect : Result := GDK_ACTION_ASK; else Result := 0; end; end; end. doublecmd-0.5.8/src/feditsearch.pas0000644000175000017500000002112411756114732016272 0ustar alexxalexx{ Search & Replace dialog for lazarus converted from SynEdit by Radek Cervinka, radek.cervinka@centrum.cz This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. based on SynEdit demo, original license: ------------------------------------------------------------------------------- Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is: dlgSearchText.pas, released 2000-06-23. The Original Code is part of the SearchReplaceDemo project, written by Michael Hieke for the SynEdit component suite. All Rights Reserved. Contributors to the SynEdit project are listed in the Contributors.txt file. Alternatively, the contents of this file may be used under the terms of the GNU General Public License Version 2 or later (the "GPL"), in which case the provisions of the GPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. $Id: dlgSearchText.pas,v 1.3 2002/08/01 05:44:05 etrusco Exp $ You may retrieve the latest version of this file at the SynEdit home page, located at http://SynEdit.SourceForge.net Known Issues: -------------------------------------------------------------------------------} unit fEditSearch; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, StdCtrls, ExtCtrls, Buttons, uOSForms; type { TfrmEditSearchReplace } TfrmEditSearchReplace = class(TModalForm) btnOK: TBitBtn; btnCancel: TBitBtn; cbSearchText: TComboBox; cbSearchCaseSensitive: TCheckBox; cbSearchWholeWords: TCheckBox; cbSearchSelectedOnly: TCheckBox; cbSearchFromCursor: TCheckBox; cbSearchRegExp: TCheckBox; cbReplaceText: TComboBox; gbSearchOptions: TGroupBox; lblReplaceWith: TLabel; lblSearchFor: TLabel; rgSearchDirection: TRadioGroup; procedure btnOKClick(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: boolean); procedure FormShow(Sender: TObject); private function GetSearchBackwards: boolean; function GetSearchCaseSensitive: boolean; function GetSearchFromCursor: boolean; function GetSearchInSelection: boolean; function GetSearchText: string; function GetSearchTextHistory: string; function GetSearchWholeWords: boolean; function GetSearchRegExp: boolean; function GetReplaceText: string; function GetReplaceTextHistory: string; procedure SetSearchBackwards(Value: boolean); procedure SetSearchCaseSensitive(Value: boolean); procedure SetSearchFromCursor(Value: boolean); procedure SetSearchInSelection(Value: boolean); procedure SetSearchText(Value: string); procedure SetSearchTextHistory(Value: string); procedure SetSearchWholeWords(Value: boolean); procedure SetSearchRegExp(Value: boolean); procedure SetReplaceText(Value: string); procedure SetReplaceTextHistory(Value: string); public constructor Create(AOwner: TComponent; AReplace: Boolean); reintroduce; property SearchBackwards: boolean read GetSearchBackwards write SetSearchBackwards; property SearchCaseSensitive: boolean read GetSearchCaseSensitive write SetSearchCaseSensitive; property SearchFromCursor: boolean read GetSearchFromCursor write SetSearchFromCursor; property SearchInSelectionOnly: boolean read GetSearchInSelection write SetSearchInSelection; property SearchText: string read GetSearchText write SetSearchText; property SearchTextHistory: string read GetSearchTextHistory write SetSearchTextHistory; property SearchWholeWords: boolean read GetSearchWholeWords write SetSearchWholeWords; property SearchRegExp: boolean read GetSearchRegExp write SetSearchRegExp; property ReplaceText: string read GetReplaceText write SetReplaceText; property ReplaceTextHistory: string read GetReplaceTextHistory write SetReplaceTextHistory; end; implementation {$R *.lfm} uses uLng, uDCUtils; { TfrmEditSearchReplace } procedure TfrmEditSearchReplace.btnOKClick(Sender: TObject); begin InsertFirstItem(cbSearchText.Text, cbSearchText); ModalResult := mrOK end; procedure TfrmEditSearchReplace.FormCloseQuery(Sender: TObject; var CanClose: boolean); begin if ModalResult = mrOK then InsertFirstItem(cbReplaceText.Text, cbReplaceText); end; procedure TfrmEditSearchReplace.FormShow(Sender: TObject); begin if cbSearchText.Text = EmptyStr then begin if cbSearchText.Items.Count > 0 then cbSearchText.Text:= cbSearchText.Items[0]; end; cbSearchText.SelectAll; end; function TfrmEditSearchReplace.GetSearchBackwards: boolean; begin Result := rgSearchDirection.ItemIndex = 1; end; function TfrmEditSearchReplace.GetSearchCaseSensitive: boolean; begin Result := cbSearchCaseSensitive.Checked; end; function TfrmEditSearchReplace.GetSearchFromCursor: boolean; begin Result := cbSearchFromCursor.Checked; end; function TfrmEditSearchReplace.GetSearchInSelection: boolean; begin Result := cbSearchSelectedOnly.Checked; end; function TfrmEditSearchReplace.GetSearchText: string; begin Result := cbSearchText.Text; end; function TfrmEditSearchReplace.GetSearchTextHistory: string; var i: integer; begin for i:= cbSearchText.Items.Count - 1 downto 25 do cbSearchText.Items.Delete(i); Result:=cbSearchText.Items.Text; end; function TfrmEditSearchReplace.GetSearchWholeWords: boolean; begin Result := cbSearchWholeWords.Checked; end; function TfrmEditSearchReplace.GetSearchRegExp: boolean; begin Result:= cbSearchRegExp.Checked; end; function TfrmEditSearchReplace.GetReplaceText: string; begin Result := cbReplaceText.Text; end; function TfrmEditSearchReplace.GetReplaceTextHistory: string; var i: integer; begin for i:= cbSearchText.Items.Count - 1 downto 25 do cbReplaceText.Items.Delete(i); Result:=cbReplaceText.Items.Text; end; procedure TfrmEditSearchReplace.SetSearchBackwards(Value: boolean); begin rgSearchDirection.ItemIndex := Ord(Value); end; procedure TfrmEditSearchReplace.SetSearchCaseSensitive(Value: boolean); begin cbSearchCaseSensitive.Checked := Value; end; procedure TfrmEditSearchReplace.SetSearchFromCursor(Value: boolean); begin cbSearchFromCursor.Checked := Value; end; procedure TfrmEditSearchReplace.SetSearchInSelection(Value: boolean); begin cbSearchSelectedOnly.Checked := Value; end; procedure TfrmEditSearchReplace.SetSearchText(Value: string); begin cbSearchText.Text := Value; end; procedure TfrmEditSearchReplace.SetSearchTextHistory(Value: string); begin cbSearchText.Items.Text := Value; end; procedure TfrmEditSearchReplace.SetSearchWholeWords(Value: boolean); begin cbSearchWholeWords.Checked := Value; end; procedure TfrmEditSearchReplace.SetSearchRegExp(Value: boolean); begin cbSearchRegExp.Checked:= Value; end; procedure TfrmEditSearchReplace.SetReplaceText(Value: string); begin cbReplaceText.Items.Text := Value; end; procedure TfrmEditSearchReplace.SetReplaceTextHistory(Value: string); begin cbReplaceText.Items.Text := Value; end; constructor TfrmEditSearchReplace.Create(AOwner: TComponent; AReplace: Boolean); begin inherited Create(AOwner); if AReplace then begin Caption:= rsEditSearchReplace; lblReplaceWith.Visible:= True; cbReplaceText.Visible:= True; end else begin Caption:= rsEditSearchCaption; lblReplaceWith.Visible:= False; cbReplaceText.Visible:= False; Height:= Height - cbReplaceText.Height; end; rgSearchDirection.Items.Strings[0]:= rsEditSearchFrw; rgSearchDirection.Items.Strings[1]:= rsEditSearchBack; end; end. doublecmd-0.5.8/src/fselecttextrange.lfm0000644000175000017500000000311112023046500017330 0ustar alexxalexxobject frmSelectTextRange: TfrmSelectTextRange Left = 326 Height = 112 Top = 236 Width = 320 BorderStyle = bsDialog ChildSizing.LeftRightSpacing = 10 ClientHeight = 112 ClientWidth = 320 Position = poOwnerFormCenter LCLVersion = '1.1' object edtSelectText: TEdit AnchorSideLeft.Control = lblSelectText AnchorSideTop.Control = lblSelectText AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 10 Height = 28 Top = 34 Width = 300 AutoSelect = False BorderSpacing.Top = 6 Constraints.MinWidth = 300 OnExit = edtSelectTextExit TabOrder = 0 end object lblSelectText: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 10 Width = 206 BorderSpacing.Left = 10 BorderSpacing.Top = 10 BorderSpacing.Right = 10 Caption = '&Select the characters to insert:' FocusControl = edtSelectText ParentColor = False end object btpPanel: TButtonPanel Left = 10 Height = 40 Top = 66 Width = 300 OKButton.Name = 'OKButton' OKButton.Caption = '&OK' OKButton.DefaultCaption = False HelpButton.Name = 'HelpButton' HelpButton.Caption = '&Help' HelpButton.DefaultCaption = False CloseButton.Name = 'CloseButton' CloseButton.Caption = '&Close' CloseButton.DefaultCaption = False CancelButton.Name = 'CancelButton' CancelButton.Caption = 'Cancel' CancelButton.DefaultCaption = False TabOrder = 1 ShowButtons = [pbOK, pbCancel] end end doublecmd-0.5.8/src/fopenwith.pas0000755000175000017500000001544512213115233016012 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Open with other application dialog Copyright (C) 2012 Alexander Koblov (alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOpenWith; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, EditBtn, Buttons, ButtonPanel, ComCtrls, Menus, Types; type { TfrmOpenWith } TfrmOpenWith = class(TForm) btnCommands: TSpeedButton; ButtonPanel: TButtonPanel; chkSaveAssociation: TCheckBox; chkCustomCommand: TCheckBox; chkUseAsDefault: TCheckBox; fneCommand: TFileNameEdit; ImageList: TImageList; lblMimeType: TLabel; miListOfURLs: TMenuItem; miSingleURL: TMenuItem; miListOfFiles: TMenuItem; miSingleFileName: TMenuItem; pnlOpenWith: TPanel; pmFieldCodes: TPopupMenu; tvApplications: TTreeView; procedure btnCommandsClick(Sender: TObject); procedure CancelButtonClick(Sender: TObject); procedure chkCustomCommandChange(Sender: TObject); procedure chkSaveAssociationChange(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure miFieldCodeClick(Sender: TObject); procedure OKButtonClick(Sender: TObject); procedure tvApplicationsDeletion(Sender: TObject; Node: TTreeNode); procedure tvApplicationsSelectionChanged(Sender: TObject); private FMimeType: UTF8String; FFileList: TStringList; procedure LoadApplicationList; public constructor Create(TheOwner: TComponent; AFileList: TStringList); reintroduce; end; procedure ShowOpenWithDlg(const FileList: TStringList); implementation {$R *.lfm} uses LCLProc, uOSUtils, uPixMapManager, uGlobs, uKeyFile, uMimeActions, uLng; procedure ShowOpenWithDlg(const FileList: TStringList); begin with TfrmOpenWith.Create(Application, FileList) do begin Show; end; end; { TfrmOpenWith } constructor TfrmOpenWith.Create(TheOwner: TComponent; AFileList: TStringList); begin FFileList:= AFileList; inherited Create(TheOwner); InitPropStorage(Self); end; procedure TfrmOpenWith.FormCreate(Sender: TObject); begin ImageList.Width:= gIconsSize; ImageList.Height:= gIconsSize; FMimeType:= GetFileMimeType(FFileList[0]); lblMimeType.Caption:= Format(lblMimeType.Caption, [FMimeType]); LoadApplicationList; end; procedure TfrmOpenWith.chkCustomCommandChange(Sender: TObject); begin pnlOpenWith.Enabled:= chkCustomCommand.Checked; end; procedure TfrmOpenWith.chkSaveAssociationChange(Sender: TObject); begin chkUseAsDefault.Enabled:= chkSaveAssociation.Checked; end; procedure TfrmOpenWith.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin CloseAction:= caFree; end; procedure TfrmOpenWith.btnCommandsClick(Sender: TObject); begin pmFieldCodes.PopUp(); end; procedure TfrmOpenWith.CancelButtonClick(Sender: TObject); begin Close; end; procedure TfrmOpenWith.FormDestroy(Sender: TObject); begin FFileList.Free; end; procedure TfrmOpenWith.miFieldCodeClick(Sender: TObject); begin fneCommand.Text:= fneCommand.Text + #32 + TMenuItem(Sender).Hint; fneCommand.SelStart:= UTF8Length(fneCommand.Text); end; procedure TfrmOpenWith.OKButtonClick(Sender: TObject); var DesktopEntry: TDesktopFileEntry; DesktopFile: PDesktopFileEntry = nil; begin if chkCustomCommand.Checked then begin DesktopFile:= @DesktopEntry; DesktopEntry.MimeType:= FMimeType; DesktopEntry.ExecWithParams:= fneCommand.Text; end else if tvApplications.SelectionCount > 0 then begin DesktopFile:= PDesktopFileEntry(tvApplications.Selected.Data); fneCommand.Text:= ExtractFileName(DesktopFile^.DesktopFilePath); end; if Assigned(DesktopFile) then begin if chkSaveAssociation.Checked then begin if not AddDesktopEntry(FMimeType, fneCommand.Text, chkUseAsDefault.Checked) then begin MessageDlg(rsMsgErrSaveAssociation, mtError, [mbOK], 0); end; end; fneCommand.Text:= TranslateAppExecToCmdLine(DesktopFile, FFileList); ExecCmdFork(fneCommand.Text); end; Close; end; procedure TfrmOpenWith.tvApplicationsDeletion(Sender: TObject; Node: TTreeNode); var DesktopFile: PDesktopFileEntry; begin DesktopFile:= PDesktopFileEntry(Node.Data); Dispose(DesktopFile); end; procedure TfrmOpenWith.tvApplicationsSelectionChanged(Sender: TObject); var DesktopFile: PDesktopFileEntry; begin if tvApplications.SelectionCount > 0 then begin chkCustomCommand.Checked:= False; DesktopFile:= PDesktopFileEntry(tvApplications.Selected.Data); fneCommand.Text:= DesktopFile^.ExecWithParams; end; end; procedure TfrmOpenWith.LoadApplicationList; const Folders: array [1..2] of UTF8String = ('/.local/share/applications', '/usr/share/applications'); var I, J: Integer; Bitmap: TBitmap; ImageIndex: PtrInt; TreeNode: TTreeNode; Applications: TStringList; DesktopFile: PDesktopFileEntry; begin Folders[1]:= GetHomeDir + Folders[1]; for I:= Low(Folders) to High(Folders) do begin Applications:= FindAllFiles(Folders[I], '*.desktop', True); for J:= 0 to Applications.Count - 1 do begin DesktopFile:= GetDesktopEntry(Applications[J]); if Assigned(DesktopFile) then begin if DesktopFile^.Hidden or (Pos('Screensaver', DesktopFile^.Categories) > 0) then begin Dispose(DesktopFile); Continue; end; TreeNode:= tvApplications.Items.AddChild(nil, DesktopFile^.DisplayName); TreeNode.Data:= DesktopFile; ImageIndex:= PixMapManager.GetIconByName(DesktopFile^.IconName); if ImageIndex >= 0 then begin Bitmap:= PixMapManager.GetBitmap(ImageIndex); if Assigned(Bitmap) then begin TreeNode.ImageIndex:= ImageList.Add(Bitmap, nil); TreeNode.SelectedIndex:= TreeNode.ImageIndex; TreeNode.StateIndex:= TreeNode.ImageIndex; Bitmap.Free; end; end; end; end; Applications.Free; end; end; end. doublecmd-0.5.8/src/upathlabel.pas0000644000175000017500000001346611740433676016150 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Label displaying a path, highlighting directories with mouse. Copyright (C) 2010-2011 Przemysław Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uPathLabel; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls; type { TPathLabel } TPathLabel = class(TLabel) private FHighlightStartPos: Integer; FHighlightText: String; {en How much space to leave between the text and left border. } FLeftSpacing: Integer; {en If a user clicks on a parent directory of the path, this stores the full path of that parent directory. } FSelectedDir: String; {en If a mouse if over some parent directory of the currently displayed path, it is highlighted, so that user can click on it. } procedure Highlight(MousePosX, MousePosY: Integer); procedure MouseEnterEvent(Sender: TObject); procedure MouseMoveEvent(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure MouseLeaveEvent(Sender: TObject); public constructor Create(AOwner: TComponent; AllowHighlight: Boolean = False); reintroduce; procedure Paint; override; {en Changes drawing colors depending active/inactive state. } procedure SetActive(Active: Boolean); property LeftSpacing: Integer read FLeftSpacing write FLeftSpacing; property SelectedDir: String read FSelectedDir; end; implementation uses Controls, Graphics, math; { TPathLabel } constructor TPathLabel.Create(AOwner: TComponent; AllowHighlight: Boolean); begin FLeftSpacing := 3; // set before painting inherited Create(AOwner); FSelectedDir := ''; FHighlightStartPos := -1; FHighlightText := ''; SetActive(False); if AllowHighlight then begin OnMouseEnter:=@MouseEnterEvent; OnMouseMove :=@MouseMoveEvent; OnMouseLeave:=@MouseLeaveEvent; end; end; procedure TPathLabel.Paint; var TextTop: Integer; begin Canvas.Brush.Color := Color; Canvas.Font.Color := Font.Color; // Center vertically. TextTop := (Height - Canvas.TextHeight(Text)) div 2; Canvas.FillRect(0, 0, Width, Height); // background Canvas.TextOut(LeftSpacing, TextTop, Text); // path // Highlight part of the path if mouse is over it. if FHighlightStartPos <> -1 then begin Canvas.Brush.Color := Font.Color; // reverse colors Canvas.Font.Color := Color; Canvas.TextOut(FHighlightStartPos, TextTop, FHighlightText); end; end; procedure TPathLabel.SetActive(Active: Boolean); begin case Active of False: begin Color := clBtnFace; Font.Color := clBtnText; end; True: begin Color := clHighlight; Font.Color := clHighlightText; end; end; end; procedure TPathLabel.Highlight(MousePosX, MousePosY: Integer); var PartText: String; StartPos, CurPos: Integer; PartWidth: Integer; CurrentHighlightPos, NewHighlightPos: Integer; TextLen: Integer; PathDelimWidth: Integer; begin CurrentHighlightPos := LeftSpacing; // start at the beginning of the path NewHighlightPos := -1; Canvas.Font := Self.Font; PathDelimWidth := Canvas.TextWidth(PathDelim); TextLen := Length(Text); // Start from the first character, but omit any path delimiters at the beginning. StartPos := 1; while (StartPos <= TextLen) and (Text[StartPos] = PathDelim) do Inc(StartPos); // Move the canvas position after the skipped text (if any). CurrentHighlightPos := CurrentHighlightPos + (StartPos - 1) * PathDelimWidth; for CurPos := StartPos + 1 to TextLen - 1 do begin if Text[CurPos] = PathDelim then begin PartText := Copy(Text, StartPos, CurPos - StartPos); PartWidth := Canvas.TextWidth(PartText); // If mouse is over this part of the path - highlight it. if InRange(MousePosX, CurrentHighlightPos, CurrentHighlightPos + PartWidth) then begin NewHighlightPos := CurrentHighlightPos; Break; end; CurrentHighlightPos := CurrentHighlightPos + PartWidth + PathDelimWidth; StartPos := CurPos + 1; end; end; // Repaint if highlighted part has changed. if NewHighlightPos <> FHighlightStartPos then begin // Omit minimized part of the displayed path. if PartText = '..' then FHighlightStartPos := -1 else FHighlightStartPos := NewHighlightPos; if FHighlightStartPos <> -1 then begin Cursor := crHandPoint; FHighlightText := PartText; // If clicked, this will be the new directory. FSelectedDir := Copy(Text, 1, CurPos - 1); end else begin Cursor := crDefault; FSelectedDir := ''; FHighlightText := ''; end; Self.Invalidate; end; end; procedure TPathLabel.MouseEnterEvent(Sender: TObject); begin Cursor := crDefault; Invalidate; end; procedure TPathLabel.MouseMoveEvent(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Highlight(X, Y); end; procedure TPathLabel.MouseLeaveEvent(Sender: TObject); begin FSelectedDir := ''; FHighlightStartPos := -1; FHighlightText := ''; Cursor := crDefault; Invalidate; end; end. doublecmd-0.5.8/src/fAbout.lrt0000644000175000017500000000072011740433676015252 0ustar alexxalexxTFRMABOUT.CAPTION=About TFRMABOUT.LBLHOMEPAGE.CAPTION=Home Page: TFRMABOUT.LBLHOMEPAGEADDRESS.CAPTION=http://doublecmd.sourceforge.net TFRMABOUT.LBLTITLE.CAPTION=Double Commander TFRMABOUT.LBLVERSION.CAPTION=Version TFRMABOUT.LBLREVISION.CAPTION=Revision TFRMABOUT.LBLBUILD.CAPTION=Build TFRMABOUT.LBLLAZARUSVER.CAPTION=Lazarus TFRMABOUT.LBLFREEPASCALVER.CAPTION=Free Pascal TFRMABOUT.BTNCOPYTOCLIPBOARD.CAPTION=Copy to clipboard TFRMABOUT.BTNCLOSE.CAPTION=&Close doublecmd-0.5.8/src/fmain.pas0000644000175000017500000046212712253602061015105 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Licence : GNU GPL v 2.0 Copyright (C) 2006-2012 Alexander Koblov (Alexx2000@mail.ru) Main Dialog window based on: Seksi Commander (radekc.regnet.cz) ---------------------------- Licence : GNU GPL v 2.0 Author : radek.cervinka@centrum.cz Main Dialog window and other stuff contributors: based on (heavy rewriten): main Unit of PFM : Peter's File Manager --------------------------------------- Copyright : Peter Cernoch 2002 Contact : pcernoch@volny.cz Licence : GNU GPL v 2.0 contributors: Copyright (C) 2008 Vitaly Zotov (vitalyzotov@mail.ru) } unit fMain; {$mode objfpc}{$H+} interface uses Graphics, Forms, Menus, Controls, StdCtrls, ExtCtrls, ActnList, Buttons, SysUtils, Classes, SynEdit, LCLType, ComCtrls, KASToolBar, KASComboBox, uCmdBox, uFilePanelSelect, uBriefFileView, uFileView, uColumnsFileView, uFileSource, uFileViewNotebook, uFile, uOperationsManager, uFileSourceOperation, uDrivesList, uTerminal, DCClassesUtf8, DCXmlConfig, uDrive, uDriveWatcher, uDCVersion, uMainCommands, uFormCommands, uOperationsPanel, KASToolItems, uKASToolItemsExtended, uCmdLineParams {$IF DEFINED(LCLQT)} , Qt4, QtWidgets {$ELSEIF DEFINED(LCLGTK2)} , Glib2, Gtk2 {$ENDIF} ; type TForEachViewFunction = procedure (AFileView: TFileView; UserData: Pointer) of object; { TfrmMain } TfrmMain = class(TForm, IFormCommands) actExtractFiles: TAction; actAddPathToCmdLine: TAction; actFileAssoc: TAction; actFocusCmdLine: TAction; actContextMenu: TAction; actCopyNamesToClip: TAction; actCopyFullNamesToClip: TAction; actCutToClipboard: TAction; actCopyToClipboard: TAction; actChangeDirToRoot: TAction; actCountDirContent: TAction; actCheckSumVerify: TAction; actCheckSumCalc: TAction; actClearLogFile: TAction; actClearLogWindow: TAction; actChangeDir: TAction; actAddFilenameToCmdLine: TAction; actAddPathAndFilenameToCmdLine: TAction; actCopyNoAsk: TAction; actChangeDirToParent: TAction; actEditPath: TAction; actHorizontalFilePanels: TAction; actGoToFirstFile: TAction; actGoToLastFile: TAction; actCompareDirectories: TAction; actCmdLineNext: TAction; actCmdLinePrev: TAction; actBriefView: TAction; actColumnsView: TAction; actThumbnailsView: TAction; actShellExecute: TAction; actRenameTab: TAction; actOperationsViewer: TAction; actNetworkDisconnect: TAction; actNetworkQuickConnect: TAction; actNetworkConnect: TAction; actViewHistory: TAction; actViewHistoryPrev: TAction; actViewHistoryNext: TAction; actLoadSelectionFromClip: TAction; actLoadSelectionFromFile: TAction; actSaveSelectionToFile: TAction; actSaveSelection: TAction; actRestoreSelection: TAction; actSwitchIgnoreList: TAction; actTestArchive: TAction; actQuickView: TAction; actOpenBar: TAction; actSetFileProperties: TAction; actQuickFilter: TAction; actRenameNoAsk: TAction; actPanelsSplitterPerPos: TAction; actMinimize: TAction; actRightEqualLeft: TAction; actLeftEqualRight: TAction; actPasteFromClipboard: TAction; actExchange: TAction; actEditComment: TAction; actHelpIndex: TAction; actVisitHomePage: TAction; actKeyboard: TAction; actPrevTab: TAction; actNextTab: TAction; actCloseAllTabs: TAction; actSetTabOptionNormal: TAction; actSetTabOptionPathLocked: TAction; actSetTabOptionPathResets: TAction; actSetTabOptionDirsInNewTab: TAction; actUnmarkCurrentExtension: TAction; actMarkCurrentExtension: TAction; actWipe: TAction; actOpenDirInNewTab: TAction; actTargetEqualSource: TAction; actOpen: TAction; actQuickSearch: TAction; actShowButtonMenu: TAction; actOpenArchive: TAction; actTransferRight: TAction; actTransferLeft: TAction; actRightOpenDrives: TAction; actLeftOpenDrives: TAction; actOpenVirtualFileSystemList: TAction; actPackFiles: TAction; actCloseTab: TAction; actNewTab: TAction; btnF10: TSpeedButton; btnF3: TSpeedButton; btnF4: TSpeedButton; btnF5: TSpeedButton; btnF6: TSpeedButton; btnF7: TSpeedButton; btnF8: TSpeedButton; btnF9: TSpeedButton; btnLeftDirectoryHotlist: TSpeedButton; btnRightDirectoryHotlist: TSpeedButton; dskLeft: TKASToolBar; dskRight: TKASToolBar; edtCommand: TComboBoxWithDelItems; imgLstActions: TImageList; lblRightDriveInfo: TLabel; lblLeftDriveInfo: TLabel; lblCommandPath: TLabel; mnuContextRenameOnly: TMenuItem; mnuContextCopy: TMenuItem; mnuContextOpen: TMenuItem; mnuContextLine1: TMenuItem; mnuContextLine2: TMenuItem; mnuContextFileProperties: TMenuItem; mnuContextDelete: TMenuItem; mnuContextView: TMenuItem; mnuThumbnailsView: TMenuItem; mnuColumnsView: TMenuItem; mnuBriefView: TMenuItem; miLine33: TMenuItem; mnuAllOperStart: TMenuItem; mnuAllOperStop: TMenuItem; mnuAllOperPause: TMenuItem; mnuAllOperProgress: TMenuItem; miCompareDirectories: TMenuItem; miLine37: TMenuItem; miRenameTab: TMenuItem; tbChangeDir: TMenuItem; mnuShowHorizontalFilePanels: TMenuItem; miLine20: TMenuItem; miNetworkDisconnect: TMenuItem; miNetworkQuickConnect: TMenuItem; miNetworkConnect: TMenuItem; mnuNetwork: TMenuItem; pnlDskLeft: TPanel; pnlDiskLeftInner: TPanel; pnlDskRight: TPanel; pnlDiskRightInner: TPanel; Timer: TTimer; PanelAllProgress: TPanel; pbxRightDrive: TPaintBox; pbxLeftDrive: TPaintBox; tbPaste: TMenuItem; tbCopy: TMenuItem; tbCut: TMenuItem; tbSeparator: TMenuItem; mnuLoadSelectionFromClip: TMenuItem; mnuLoadSelectionFromFile: TMenuItem; mnuSaveSelectionToFile: TMenuItem; mnuRestoreSelection: TMenuItem; mnuSaveSelection: TMenuItem; miLine47: TMenuItem; mnuTestArchive: TMenuItem; mnuQuickView: TMenuItem; miLine32: TMenuItem; miLine14: TMenuItem; mnuTabOptionNormal: TMenuItem; mnuTabOptionDirsInNewTabs: TMenuItem; mnuTabOptions: TMenuItem; miTabOptionPathResets: TMenuItem; miTabOptionDirsInNewTab: TMenuItem; miTabOptionPathLocked: TMenuItem; miTabOptionNormal: TMenuItem; miTabOptions: TMenuItem; miLine19: TMenuItem; mnuSetFileProperties: TMenuItem; mnuShowOperations: TMenuItem; miLine13: TMenuItem; miLogClear: TMenuItem; miLogHide: TMenuItem; miLine25: TMenuItem; miLogSelectAll: TMenuItem; miLogCopy: TMenuItem; miLine24: TMenuItem; miTrayIconRestore: TMenuItem; miLine8: TMenuItem; miTrayIconExit: TMenuItem; mnuCheckSumCalc: TMenuItem; mnuCheckSumVerify: TMenuItem; mnuCountDirContent: TMenuItem; miLine22: TMenuItem; miLine18: TMenuItem; mnuHelpIndex: TMenuItem; mnuHelpVisitHomePage: TMenuItem; mnuHelpKeyboard: TMenuItem; MenuItem2: TMenuItem; mnuPrevTab: TMenuItem; mnuNextTab: TMenuItem; miLine17: TMenuItem; miLine16: TMenuItem; mnuTabOptionPathLocked: TMenuItem; mnuTabOptionPathResets: TMenuItem; mnuCloseAllTabs: TMenuItem; mnuCloseTab: TMenuItem; miLine15: TMenuItem; mnuOpenDirInNewTab: TMenuItem; mnuNewTab: TMenuItem; miCloseAllTabs: TMenuItem; miCloseTab: TMenuItem; miNewTab: TMenuItem; miEditComment: TMenuItem; mnuMarkCurrentExtension: TMenuItem; mnuTabs: TMenuItem; mnuUnmarkCurrentExtension: TMenuItem; miSymLink: TMenuItem; miHardLink: TMenuItem; miCancel: TMenuItem; miLine12: TMenuItem; miCopy: TMenuItem; miMove: TMenuItem; mi8020: TMenuItem; mi7030: TMenuItem; mi6040: TMenuItem; mi5050: TMenuItem; mi4060: TMenuItem; mi3070: TMenuItem; mi2080: TMenuItem; miCopyFullNamesToClip: TMenuItem; miCopyNamesToClip: TMenuItem; mnuFileAssoc: TMenuItem; nbConsole: TPageControl; pgConsole: TTabSheet; pnlCmdLine: TPanel; MainSplitter: TPanel; MainToolBar: TKASToolBar; mnuOpenVFSList: TMenuItem; mnuExtractFiles: TMenuItem; pmContextMenu: TPopupMenu; pmSplitterPercent: TPopupMenu; pnlCommand: TPanel; pnlKeys: TPanel; pnlLeftTools: TPanel; pnlRightTools: TPanel; pnlRight: TPanel; pnlLeft: TPanel; btnLeftDrive: TSpeedButton; btnLeftHome: TSpeedButton; btnLeftUp: TSpeedButton; btnLeftRoot: TSpeedButton; btnRightDrive: TSpeedButton; btnRightHome: TSpeedButton; btnRightUp: TSpeedButton; btnRightRoot: TSpeedButton; LogSplitter: TSplitter; pmColumnsMenu: TPopupMenu; pmDropMenu: TPopupMenu; pmTabMenu: TPopupMenu; pmTrayIconMenu: TPopupMenu; pmLogMenu: TPopupMenu; seLogWindow: TSynEdit; btnRightEqualLeft: TSpeedButton; btnLeftEqualRight: TSpeedButton; ConsoleSplitter: TSplitter; tbDelete: TMenuItem; tbEdit: TMenuItem; mnuMain: TMainMenu; pnlNotebooks: TPanel; pnlDisk: TPanel; mnuHelp: TMenuItem; mnuHelpAbout: TMenuItem; mnuShow: TMenuItem; mnuShowName: TMenuItem; mnuShowExtension: TMenuItem; mnuShowTime: TMenuItem; mnuShowSize: TMenuItem; mnuShowAttrib: TMenuItem; miLine7: TMenuItem; mnuShowReverse: TMenuItem; mnuShowReread: TMenuItem; mnuFiles: TMenuItem; mnuPackFiles : TMenuItem; mnuFilesSplit: TMenuItem; mnuFilesCombine: TMenuItem; mnuCmd: TMenuItem; mnuCmdDirHotlist: TMenuItem; miLine2: TMenuItem; mnuFilesSpace: TMenuItem; mnuFilesAttrib: TMenuItem; mnuFilesProperties: TMenuItem; miLine6: TMenuItem; mnuCmdSwapSourceTarget: TMenuItem; mnuCmdTargetIsSource: TMenuItem; miLine3: TMenuItem; mnuFilesShwSysFiles: TMenuItem; miLine1: TMenuItem; mnuFilesHardLink: TMenuItem; mnuFilesSymLink: TMenuItem; mnuConfig: TMenuItem; mnuConfigOptions: TMenuItem; mnuMark: TMenuItem; mnuMarkSGroup: TMenuItem; mnuMarkUGroup: TMenuItem; mnuMarkSAll: TMenuItem; mnuMarkUAll: TMenuItem; mnuMarkInvert: TMenuItem; miLine5: TMenuItem; mnuCmdSearch: TMenuItem; actionLst: TActionList; actExit: TAction; actView: TAction; actEdit: TAction; actCopy: TAction; actRename: TAction; actMakeDir: TAction; actDelete: TAction; actAbout: TAction; actShowSysFiles: TAction; actOptions: TAction; mnuFilesCmpCnt: TMenuItem; actCompareContents: TAction; actShowMainMenu: TAction; actRefresh: TAction; actSearch: TAction; actDirHotList: TAction; actMarkMarkAll: TAction; actMarkInvert: TAction; actMarkUnmarkAll: TAction; pmHotList: TPopupMenu; actMarkPlus: TAction; actMarkMinus: TAction; actSymLink: TAction; actHardLink: TAction; actReverseOrder: TAction; actSortByName: TAction; actSortByExt: TAction; actSortBySize: TAction; actSortByDate: TAction; actSortByAttr: TAction; miLine4: TMenuItem; miExit: TMenuItem; actMultiRename: TAction; miMultiRename: TMenuItem; actCopySamePanel: TAction; actRenameOnly: TAction; actEditNew: TAction; actDirHistory: TAction; pmDirHistory: TPopupMenu; actShowCmdLineHistory: TAction; actRunTerm: TAction; miLine9: TMenuItem; miRunTerm: TMenuItem; actCalculateSpace: TAction; actFileProperties: TAction; actFileLinker: TAction; actFileSpliter: TAction; pmToolBar: TPopupMenu; MainTrayIcon: TTrayIcon; procedure actExecute(Sender: TObject); function MainToolBarToolItemShortcutsHint(ToolItem: TKASNormalItem): String; procedure mnuAllOperStartClick(Sender: TObject); procedure mnuAllOperStopClick(Sender: TObject); procedure mnuAllOperPauseClick(Sender: TObject); procedure mnuAllOperProgressClick(Sender: TObject); procedure btnF8Click(Sender: TObject); procedure btnLeftClick(Sender: TObject); procedure btnLeftDirectoryHotlistClick(Sender: TObject); procedure btnRightClick(Sender: TObject); procedure btnRightDirectoryHotlistClick(Sender: TObject); procedure btnDriveMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ConsoleSplitterCanResize(Sender: TObject; var NewSize: Integer; var Accept: Boolean); procedure dskLeftResize(Sender: TObject); procedure dskRightResize(Sender: TObject); procedure dskLeftRightToolButtonDragDrop(Sender, Source: TObject; X, Y: Integer); procedure dskToolButtonMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure lblAllProgressPctClick(Sender: TObject); procedure MainToolBarToolButtonDragDrop(Sender, Source: TObject; X, Y: Integer); procedure MainToolBarToolButtonDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean; NumberOfButton: Integer); procedure MainToolBarToolButtonMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure MainToolBarToolButtonMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure miLogMenuClick(Sender: TObject); procedure miTrayIconExitClick(Sender: TObject); procedure miTrayIconRestoreClick(Sender: TObject); procedure PanelButtonClick(Button: TSpeedButton; FileView: TFileView); procedure tbDeleteClick(Sender: TObject); procedure dskLeftToolButtonClick(Sender: TObject); procedure dskRightToolButtonClick(Sender: TObject); procedure btnVirtualDriveClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: boolean); procedure FormDropFiles(Sender: TObject; const FileNames: array of String); procedure FormUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char); procedure FormWindowStateChange(Sender: TObject); procedure MainSplitterDblClick(Sender: TObject); procedure MainSplitterMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure MainSplitterMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure MainSplitterMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure MainTrayIconClick(Sender: TObject); procedure lblDriveInfoDblClick(Sender: TObject); procedure MainToolBarDragDrop(Sender, Source: TObject; X, Y: Integer); procedure MainToolBarDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); function MainToolBarLoadButtonGlyph(ToolItem: TKASToolItem; iIconSize: Integer; clBackColor: TColor): TBitmap; procedure MainToolBarMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure frmMainClose(Sender: TObject; var CloseAction: TCloseAction); procedure frmMainAfterShow(Data: PtrInt); procedure frmMainShow(Sender: TObject); procedure mnuDropClick(Sender: TObject); procedure mnuSplitterPercentClick(Sender: TObject); procedure mnuTabMenuClick(Sender: TObject); procedure nbPageAfterMouseDown(Data: PtrInt); procedure nbPageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure nbPageChanged(Sender: TObject); procedure nbPageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure NotebookCloseTabClicked(Sender: TObject); procedure pmDropMenuClose(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure edtCommandKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure pmToolBarPopup(Sender: TObject); procedure pnlLeftResize(Sender: TObject); procedure pnlLeftRightDblClick(Sender: TObject); procedure pnlNotebooksResize(Sender: TObject); procedure pnlRightResize(Sender: TObject); procedure sboxDrivePaint(Sender: TObject); procedure seLogWindowSpecialLineColors(Sender: TObject; Line: integer; var Special: boolean; var FG, BG: TColor); function FileViewBeforeChangePath(FileView: TFileView; NewFileSource: IFileSource; const NewPath : String): Boolean; procedure FileViewAfterChangePath(FileView: TFileView); procedure FileViewActivate(FileView: TFileView); procedure FileViewFilesChanged(FileView: TFileView); procedure edtCommandKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure edtCommandExit(Sender: TObject); procedure tbChangeDirClick(Sender: TObject); procedure tbCopyClick(Sender: TObject); procedure tbEditClick(Sender: TObject); procedure OnUniqueInstanceMessage(Sender: TObject; Params: TCommandLineParams); procedure tbPasteClick(Sender: TObject); procedure AllProgressOnUpdateTimer(Sender: TObject); {$IFDEF LCLQT} private QEventHook: QObject_hookH; function QObjectEventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; {$ENDIF} private { Private declarations } FMainSplitterPos: Double; PanelSelected: TFilePanelSelect; DrivesList : TDrivesList; MainSplitterHintWnd: THintWindow; HiddenToTray: Boolean; HidingTrayIcon: Boolean; // @true if the icon is in the process of hiding nbLeft, nbRight: TFileViewNotebook; cmdConsole: TCmdBox; FCommands: TMainCommands; FInitializedView: Boolean; {en Used to pass drag&drop parameters to pmDropMenu. Single variable can be used, because the user can do only one menu popup at a time. } FDropParams: TDropParams; FDrivesListPopup: TDrivesListPopup; FOperationsPanel: TOperationsPanel; // frost_asm begin // mainsplitter MainSplitterLeftMouseBtnDown: Boolean; MainSplitterMouseDownX, MainSplitterMouseDownY: Integer; FResizingFilePanels: Boolean; // lastWindowState lastWindowState:TWindowState; // frost_asm end // for dragging buttons and etc NumberOfMoveButton, NumberOfNewMoveButton: integer; Draging : boolean; procedure CheckCommandLine(ShiftEx: TShiftState; var Key: Word); function ExecuteCommandFromEdit(sCmd: String; bRunInTerm: Boolean): Boolean; procedure SetMainSplitterPos(AValue: Double); procedure UpdateActionIcons; procedure TypeInCommandLine(Str: String); procedure AddVirtualDriveButton(dskPanel: TKASToolBar); procedure AddSpecialButtons(dskPanel: TKASToolBar); procedure HideToTray; procedure RestoreFromTray; procedure ShowTrayIcon(bShow: Boolean); procedure HideTrayIconDelayed(Data: PtrInt); procedure PopupDragDropMenu(var DropParams: TDropParams); procedure CloseNotebook(ANotebook: TFileViewNotebook); procedure DriveListDriveSelected(Sender: TObject; ADriveIndex: Integer; APanel: TFilePanelSelect); procedure DriveListClose(Sender: TObject); function FindMatchingDrive(Path: UTF8String): Integer; procedure UpdateDriveToolbarSelection(DriveToolbar: TKAStoolBar; FileView: TFileView); procedure UpdateDriveButtonSelection(DriveButton: TSpeedButton; FileView: TFileView); procedure UpdateSelectedDrive(ANoteBook: TFileViewNotebook); procedure UpdateSelectedDrives; procedure SetPanelDrive(aPanel: TFilePanelSelect; Drive: PDrive; ActivateIfNeeded: Boolean); procedure OnDriveWatcherEvent(EventType: TDriveWatcherEvent; const ADrive: PDrive); procedure AppActivate(Sender: TObject); procedure AppException(Sender: TObject; E: Exception); {en Convert toolbar configuration from .bar file to global config. } procedure ConvertToolbarBarConfig(BarFileName: String); procedure ConvertIniToolbarItem(Loader: TKASToolBarIniLoader; var Item: TKASToolItem; const Shortcut: String); procedure CreateDefaultToolbar; procedure EditToolbarButton(Button: TKASToolButton); procedure ToolbarExecuteCommand(ToolItem: TKASToolItem); procedure ToolbarExecuteProgram(ToolItem: TKASToolItem); procedure LeftDriveBarExecuteDrive(ToolItem: TKASToolItem); procedure RightDriveBarExecuteDrive(ToolItem: TKASToolItem); public constructor Create(TheOwner: TComponent); override; Function ActiveFrame: TFileView; // get Active frame Function NotActiveFrame: TFileView; // get NotActive frame :) function ActiveNotebook: TFileViewNotebook; function NotActiveNotebook: TFileViewNotebook; function FrameLeft: TFileView; function FrameRight: TFileView; procedure ForEachView(CallbackFunction: TForEachViewFunction; UserData: Pointer); //check selected count and generate correct msg, parameters is lng indexs Function GetFileDlgStr(sLngOne, sLngMulti : String; Files: TFiles):String; procedure HotDirSelected(Sender:TObject); procedure ViewHistorySelected(Sender:TObject); procedure ViewHistoryPrevSelected(Sender:TObject); procedure ViewHistoryNextSelected(Sender:TObject); procedure CreatePopUpHotDir; procedure CreatePopUpDirHistory; procedure ShowFileViewHistory; procedure ShowFileViewHistory(FromFileSourceIndex, FromPathIndex, ToFileSourceIndex, ToPathIndex: Integer); procedure miHotAddClick(Sender: TObject); procedure miHotDeleteClick(Sender: TObject); procedure miHotConfClick(Sender: TObject); {en Returns @true if copy operation has been successfully started. } function CopyFiles(SourceFileSource, TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String; bShowDialog: Boolean; QueueIdentifier: TOperationsManagerQueueIdentifier = FreeOperationsQueueId): Boolean; overload; {en Returns @true if move operation has been successfully started. } function MoveFiles(SourceFileSource, TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String; bShowDialog: Boolean; QueueIdentifier: TOperationsManagerQueueIdentifier = FreeOperationsQueueId): Boolean; overload; function CopyFiles(sDestPath: String; bShowDialog: Boolean; QueueIdentifier: TOperationsManagerQueueIdentifier = FreeOperationsQueueId): Boolean; overload; // this is for F5 and Shift+F5 function MoveFiles(sDestPath: String; bShowDialog: Boolean; QueueIdentifier: TOperationsManagerQueueIdentifier = FreeOperationsQueueId): Boolean; overload; procedure GetDestinationPathAndMask(SourceFiles: TFiles; TargetFileSource: IFileSource; EnteredPath: String; BaseDir: String; out DestPath, DestMask: String); overload; procedure GetDestinationPathAndMask(SourceFiles: TFiles; SourceFileSource: IFileSource; var TargetFileSource: IFileSource; EnteredPath: String; BaseDir: String; out DestPath, DestMask: String); overload; procedure SetActiveFrame(panel: TFilePanelSelect); procedure SetActiveFrame(FileView: TFileView); procedure UpdateDiskCount; procedure CreateDiskPanel(dskPanel : TKASToolBar); function CreateFileView(sType: String; Page: TFileViewPage; AConfig: TIniFileEx; ASectionName: String; ATabIndex: Integer): TFileView; function CreateFileView(sType: String; Page: TFileViewPage; AConfig: TXmlConfig; ANode: TXmlNode): TFileView; procedure AssignEvents(AFileView: TFileView); function RemovePage(ANoteBook: TFileViewNotebook; iPageIndex:Integer; CloseLocked: Boolean = True): LongInt; procedure LoadTabsIni(ANoteBook: TFileViewNotebook); procedure LoadTabsXml(ANoteBook: TFileViewNotebook); procedure SaveTabsXml(ANoteBook: TFileViewNotebook); function ExecCmd(Cmd: String; Param: String=''; StartPath: String='') : Boolean; procedure ToggleConsole; procedure UpdateWindowView; procedure MinimizeWindow; procedure LoadTabs; procedure LoadTabsCommandLine(Params: TCommandLineParams); procedure LoadWindowState; procedure SaveWindowState; procedure LoadMainToolbar; procedure SaveMainToolBar; function IsCommandLineVisible: Boolean; procedure ShowDrivesList(APanel: TFilePanelSelect); procedure ExecuteCommandLine(bRunInTerm: Boolean); procedure UpdatePrompt; procedure UpdateFreeSpace(Panel: TFilePanelSelect); procedure ReLoadTabs(ANoteBook: TFileViewNotebook); {en This function is called from various points to handle dropping files into the panel. It converts drop effects available on the system into TDragDropOperation operations. Handles freeing DropParams. } procedure DropFiles(var DropParams: TDropParams); {en Performs all drag&drop actions. Frees DropParams. } procedure DoDragDropOperation(Operation: TDragDropOperation; var DropParams: TDropParams); {$IF FPC_FULLVERSION < 020501} // "implements" does not work in FPC < 2.5.1 function ExecuteCommand(Command: string; const Params: array of string): TCommandFuncResult; function GetCommandCaption(Command: String; CaptionType: TCommandCaptionType): String; procedure GetCommandsList(List: TStrings); {$ENDIF} property Commands: TMainCommands read FCommands{$IF FPC_FULLVERSION >= 020501} implements IFormCommands{$ENDIF}; property SelectedPanel: TFilePanelSelect read PanelSelected; property LeftTabs: TFileViewNotebook read nbLeft; property RightTabs: TFileViewNotebook read nbRight; property MainSplitterPos: Double read FMainSplitterPos write SetMainSplitterPos; end; var frmMain: TfrmMain; Cons: TConsoleThread = nil; implementation {$R *.lfm} uses LCLIntf, LCLVersion, Dialogs, uGlobs, uLng, uMasks, fCopyMoveDlg, uQuickViewPanel, uShowMsg, fHotDir, uDCUtils, uLog, uGlobsPaths, LCLProc, uOSUtils, uOSForms, uPixMapManager, uDragDropEx, uKeyboard, uFileSystemFileSource, fViewOperations, uMultiListFileSource, uFileSourceOperationTypes, uFileSourceCopyOperation, uFileSourceMoveOperation, uFileSourceProperty, uFileSourceExecuteOperation, uArchiveFileSource, uThumbFileView, uShellExecute, fSymLink, fHardLink, uExceptions, uUniqueInstance, Clipbrd, uFileSourceOperationOptionsUI, uDebug, uHotkeyManager, uFileSourceUtil, XMLRead, DCOSUtils, DCStrUtils, fOptions, fOptionsFrame, fOptionsToolbar {$IFDEF COLUMNSFILEVIEW_VTV} , uColumnsFileViewVtv {$ENDIF} ; const HotkeysCategory = 'Main'; DCToolItemClipboardHeader = 'DOUBLECMD#TOOLBAR#XMLDATA'; TCToolbarClipboardHeader = 'TOTALCMD#BAR#DATA'; DCToolbarClipboardHeader = 'DOUBLECMD#BAR#DATA'; {$IF DEFINED(LCLGTK2) or DEFINED(LCLQT)} var LastActiveWindow: TCustomForm = nil; {$ENDIF} {$IFDEF LCLQT} var CloseQueryResult: Boolean = False; {$ENDIF} var FunctionButtonsCaptions: array[0..7] of record ACaption: String; ACommand: String; end = ((ACaption: ''; ACommand: 'cm_View'), (ACaption: ''; ACommand: 'cm_Edit'), (ACaption: ''; ACommand: 'cm_Copy'), (ACaption: ''; ACommand: 'cm_Rename'), (ACaption: ''; ACommand: 'cm_MakeDir'), (ACaption: ''; ACommand: 'cm_Delete'), (ACaption: ''; ACommand: 'cm_RunTerm'), (ACaption: ''; ACommand: 'cm_Exit')); function HistoryIndexesToTag(aFileSourceIndex, aPathIndex: Integer): Longint; begin Result := (aFileSourceIndex << 16) or aPathIndex; end; procedure HistoryIndexesFromTag(aTag: Longint; out aFileSourceIndex, aPathIndex: Integer); begin aFileSourceIndex := aTag >> 16; aPathIndex := aTag and ((1<<16) - 1); end; procedure TfrmMain.FormCreate(Sender: TObject); function CreateNotebook(aParent: TWinControl; aSide: TFilePanelSelect): TFileViewNotebook; begin Result := TFileViewNotebook.Create(aParent, aSide); Result.Align := alClient; Result.Options := [nboHidePageListPopup]; Result.OnCloseTabClicked := @NotebookCloseTabClicked; Result.OnMouseDown := @nbPageMouseDown; Result.OnMouseUp := @nbPageMouseUp; {$IF DECLARED(lcl_fullversion) and (lcl_fullversion >= 093100) and (lazRevision >= lazRevOnPageChangedRemoved)} Result.OnChange := @nbPageChanged; {$ELSE} Result.OnPageChanged := @nbPageChanged; {$ENDIF} Result.OnDblClick := @pnlLeftRightDblClick; end; function GenerateTitle():String; begin Result := Format('%s %s build %s; %s', ['Double Commander', dcVersion, dcRevision, dcBuildDate]); end; var HMMainForm: THMForm; I: Integer; begin Application.OnException := @AppException; Application.OnActivate := @AppActivate; // Use LCL's method of dropping files from external // applications if we don't support it ourselves. if not IsExternalDraggingSupported then frmMain.OnDropFiles := @FormDropFiles; {$IF DEFINED(DARWIN)} // MainForm receives in Mac OS closing events on system shortcut Command-Q // See details at http://doublecmd.sourceforge.net/mantisbt/view.php?id=712 Application.MainForm.OnClose := @frmMainClose; Application.MainForm.OnCloseQuery := @FormCloseQuery; {$ENDIF} ConvertToolbarBarConfig(gpCfgDir + 'default.bar'); CreateDefaultToolbar; //Caption of main window Self.Caption := GenerateTitle(); // Remove the initial caption of the button, which is just a text of the associated action. // The text would otherwise be briefly shown before the drive button was updated. btnLeftDrive.Caption := ''; btnRightDrive.Caption := ''; for I := 0 to pnlKeys.ControlCount - 1 do FunctionButtonsCaptions[I].ACaption := pnlKeys.Controls[I].Caption; {$IF DEFINED(LCLGTK2)} // Workaround: "Layout and line" // http://doublecmd.sourceforge.net/mantisbt/view.php?id=573 pnlLeftTools.Visible := False; pnlRightTools.Visible := False; {$ENDIF} InitPropStorage(Self); PanelSelected:=fpLeft; HMMainForm := HotMan.Register(Self, HotkeysCategory); HotMan.Register(edtCommand, 'Command Line'); nbLeft := CreateNotebook(pnlLeft, fpLeft); nbRight := CreateNotebook(pnlRight, fpRight); FDrivesListPopup := TDrivesListPopup.Create(Self, Self); FDrivesListPopup.OnDriveSelected := @DriveListDriveSelected; FDrivesListPopup.OnClose := @DriveListClose; TDriveWatcher.Initialize(Handle); TDriveWatcher.AddObserver(@OnDriveWatcherEvent); if gOnlyOneAppInstance and Assigned(UniqueInstance) then UniqueInstance.OnMessage:= @OnUniqueInstanceMessage; MainFormCreate(Self); // Load command line history edtCommand.Items.Assign(glsCmdLineHistory); // Initialize actions. actShowSysFiles.Checked := uGlobs.gShowSystemFiles; actHorizontalFilePanels.Checked := gHorizontalFilePanels; AllowDropFiles := not uDragDropEx.IsExternalDraggingSupported; MainToolBar.AddToolItemExecutor(TKASCommandItem, @ToolbarExecuteCommand); MainToolBar.AddToolItemExecutor(TKASProgramItem, @ToolbarExecuteProgram); // Use the same tooltips for some left and right panel butttons. btnRightDirectoryHotlist.Hint := btnLeftDirectoryHotlist.Hint; btnRightHome.Hint := btnLeftHome.Hint; btnRightRoot.Hint := btnLeftRoot.Hint; btnRightUp.Hint := btnLeftUp.Hint; { *HotKeys* } if (HotMan.Forms.Count = 0) or (HotMan.Version < hkVersion) then LoadDefaultHotkeyBindings; // Register action list for main form hotkeys. HMMainForm.RegisterActionList(actionlst); { *HotKeys* } LoadWindowState; // frost_asm begin lastWindowState:=WindowState; // frost_asm end UpdateWindowView; {$IFDEF LCLQT} // Fixes bug - [0000033] "DC cancels shutdown in KDE" // http://doublecmd.sourceforge.net/mantisbt/view.php?id=33 QEventHook:= QObject_hook_create(TQtWidget(Self.Handle).Widget); QObject_hook_hook_events(QEventHook, @QObjectEventFilter); {$ENDIF} LoadTabs; // Update selected drive and free space before main form is shown, // otherwise there is a bit of delay. UpdateSelectedDrives; UpdateFreeSpace(fpLeft); UpdateFreeSpace(fpRight); end; procedure TfrmMain.btnLeftClick(Sender: TObject); begin PanelButtonClick(Sender as TSpeedButton, FrameLeft); end; procedure TfrmMain.actExecute(Sender: TObject); var cmd: string; begin cmd := (Sender as TAction).Name; cmd := 'cm_' + Copy(cmd, 4, Length(cmd) - 3); Commands.Commands.ExecuteCommand(cmd, []); end; procedure TfrmMain.mnuAllOperStopClick(Sender: TObject); begin OperationsManager.StopAll; end; procedure TfrmMain.mnuAllOperPauseClick(Sender: TObject); begin OperationsManager.PauseAll; end; procedure TfrmMain.mnuAllOperProgressClick(Sender: TObject); begin ShowOperationsViewer; end; procedure TfrmMain.mnuAllOperStartClick(Sender: TObject); begin OperationsManager.UnPauseAll; end; procedure TfrmMain.btnF8Click(Sender: TObject); begin if GetKeyShiftStateEx * KeyModifiersShortcut = [ssShift] then Commands.cm_Delete(['trashcan=reversesetting']) else Commands.cm_Delete([]); end; procedure TfrmMain.btnLeftDirectoryHotlistClick(Sender: TObject); Var P:TPoint; begin if tb_activate_panel_on_click in gDirTabOptions then SetActiveFrame(fpLeft); CreatePopUpHotDir;// TODO: i thing in future this must call on create or change p := Classes.Point(btnLeftDirectoryHotlist.Left,btnLeftDirectoryHotlist.Height); p := pnlLeftTools.ClientToScreen(p); pmHotList.PopUp(P.x,P.y); end; procedure TfrmMain.btnRightClick(Sender: TObject); begin PanelButtonClick(Sender as TSpeedButton, FrameRight); end; procedure TfrmMain.btnRightDirectoryHotlistClick(Sender: TObject); Var P:TPoint; begin if tb_activate_panel_on_click in gDirTabOptions then SetActiveFrame(fpRight); CreatePopUpHotDir;// TODO: i thing in future this must call on create or change p := Classes.Point(btnRightDirectoryHotlist.Left,btnRightDirectoryHotlist.Height); p := pnlRightTools.ClientToScreen(p); pmHotList.PopUp(P.x,P.y); end; procedure TfrmMain.btnDriveMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var pt: TPoint; begin if Button = mbRight then with Sender as TSpeedButton do begin if (Tag >= 0) and (Tag < DrivesList.Count) then begin pt.X := X; pt.Y := Y; pt := ClientToScreen(pt); ShowDriveContextMenu(Parent, DrivesList[Tag], pt.X, pt.Y, nil); end; end; end; procedure TfrmMain.ConsoleSplitterCanResize(Sender: TObject; var NewSize: Integer; var Accept: Boolean); begin // ConsoleSplitter is trying to resize pnlCommand, // so NewSize is the new size of pnlCommand. // Instead, resize nbConsole by the same difference. nbConsole.Height := nbConsole.Height + NewSize - pnlCommand.Height; end; procedure TfrmMain.ConvertToolbarBarConfig(BarFileName: String); var ToolBarLoader: TKASToolBarIniLoader; MainToolBarNode: TXmlNode; begin MainToolBarNode := gConfig.FindNode(gConfig.RootNode, 'Toolbars/MainToolbar', False); if not Assigned(MainToolBarNode) then begin if mbFileExists(BarFileName) then begin ToolBarLoader := TKASToolBarIniLoader.Create(Commands.Commands); try ToolBarLoader.Load(BarFileName, MainToolBar, nil, @ConvertIniToolbarItem); SaveMainToolBar; SaveGlobs; // Save toolbar and hotkeys mbRenameFile(BarFileName, BarFileName + '.obsolete'); finally ToolBarLoader.Free; end; end; end; end; procedure TfrmMain.dskLeftResize(Sender: TObject); begin pnlDskLeft.ClientHeight := dskLeft.Height + pnlDskLeft.BevelWidth * 2; pnlDiskLeftInner.ClientHeight := dskLeft.Height + pnlDiskLeftInner.BevelWidth * 2; end; procedure TfrmMain.dskRightResize(Sender: TObject); begin pnlDskRight.ClientHeight := dskRight.Height + pnlDskRight.BevelWidth * 2; pnlDiskRightInner.ClientHeight := dskRight.Height + pnlDiskRightInner.BevelWidth * 2; end; procedure TfrmMain.dskRightToolButtonClick(Sender: TObject); var FileView : TFileView; begin if gDriveBar2 then FileView := FrameRight else FileView := ActiveFrame; PanelButtonClick(Sender as TKASToolButton, FileView); end; procedure TfrmMain.dskLeftRightToolButtonDragDrop(Sender, Source: TObject; X, Y: Integer); var ToolItem: TKASToolItem; DriveItem: TKASDriveItem; begin if Sender is TKASToolButton then begin ToolItem := TKASToolButton(Sender).ToolItem; if ToolItem is TKASDriveItem then begin DriveItem := TKASDriveItem(ToolItem); case GetDropEffectByKeyAndMouse(GetKeyShiftState, mbLeft) of DropCopyEffect: Self.CopyFiles(DriveItem.Drive^.Path, gShowDialogOnDragDrop); DropMoveEffect: Self.MoveFiles(DriveItem.Drive^.Path, gShowDialogOnDragDrop); end; end; end; end; procedure TfrmMain.dskToolButtonMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin btnDriveMouseUp(Sender, Button, Shift, X, Y); end; procedure TfrmMain.EditToolbarButton(Button: TKASToolButton); var Editor: TOptionsEditor; Options: IOptionsDialog; begin Options := ShowOptions(TfrmOptionsToolbar); if Assigned(Button) then begin Editor := Options.GetEditor(TfrmOptionsToolbar); (Editor as TfrmOptionsToolbar).SelectButton(Button.Tag); end; end; procedure TfrmMain.lblAllProgressPctClick(Sender: TObject); begin ShowOperationsViewer; end; procedure TfrmMain.MainToolBarToolButtonDragDrop(Sender, Source: TObject; X, Y: Integer); var I: LongWord; SelectedFiles: TFiles = nil; Param: string; ToolItem: TKASToolItem; begin if (ssShift in GetKeyShiftState) then // Button was moved. SaveMainToolBar else if Sender is TKASToolButton and not Draging then begin ToolItem := TKASToolButton(Sender).ToolItem; if ToolItem is TKASProgramItem then begin SelectedFiles := ActiveFrame.CloneSelectedOrActiveFiles; try if SelectedFiles.Count > 0 then begin Param:= EmptyStr; for I := 0 to SelectedFiles.Count - 1 do begin // Workaround for not fully implemented TMultiListFileSource. if ActiveFrame.FileSource.IsClass(TMultiListFileSource) then Param := Param + QuoteStr(SelectedFiles[I].FullPath) + ' ' else Param := Param + QuoteStr(ActiveFrame.CurrentAddress + SelectedFiles[I].FullPath) + ' '; end; ExecCmd(TKASProgramItem(ToolItem).Command, Param, TKASProgramItem(ToolItem).StartPath); end; finally FreeAndNil(SelectedFiles); end; end; end; end; procedure TfrmMain.MainToolBarToolButtonDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean; NumberOfButton: Integer); var aFile: TFile; tmp: Integer; ToolItem: TKASProgramItem; begin if (ssShift in GetKeyShiftState) then begin if not (Source is TKASToolButton) and not Draging then begin aFile := ActiveFrame.CloneActiveFile; try if Assigned(aFile) and aFile.IsNameValid then begin ToolItem := TKASProgramItem.Create; ToolItem.Command := aFile.FullPath; ToolItem.StartPath := aFile.Path; ToolItem.Icon := aFile.FullPath; ToolItem.Hint := ExtractOnlyFileName(aFile.Name); ToolItem.Text := ExtractOnlyFileName(aFile.Name); MainToolBar.InsertButton(Sender as TKASToolButton, ToolItem); NumberOfMoveButton := (Sender as TSpeedButton).Tag; NumberOfNewMoveButton := (Sender as TSpeedButton).Tag-1; Draging := True; Accept := True; end else begin Accept := False; Exit; end; finally FreeAndNil(aFile); end; end; if (NumberOfMoveButton <> (Sender as TSpeedButton).Tag) then begin Draging := True; if Source is TSpeedButton then MainToolBar.MoveButton((Source as TSpeedButton).Tag, (Sender as TSpeedButton).Tag) else begin tmp:= (Sender as TSpeedButton).Tag; MainToolBar.MoveButton(NumberOfNewMoveButton, (Sender as TSpeedButton).Tag); NumberOfNewMoveButton := tmp; end; NumberOfMoveButton := (Sender as TSpeedButton).Tag; Accept := True; end; end else begin Accept := not Draging and (Sender is TKASToolButton) and (TKASToolButton(Sender).ToolItem is TKASProgramItem); if Accept then begin aFile := ActiveFrame.CloneActiveFile; try Accept := Assigned(aFile) and aFile.IsNameValid; finally FreeAndNil(aFile); end; end; end; end; procedure TfrmMain.MainToolBarToolButtonMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (ssShift in Shift) and (Button = mbLeft) then begin (Sender as TKASToolButton).BeginDrag(False, 5); NumberOfMoveButton:= (Sender as TKASToolButton).Tag; end; Draging:= False; end; procedure TfrmMain.MainToolBarToolButtonMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbRight then MainToolBarMouseUp(Sender, Button, Shift, X, Y); end; function TfrmMain.MainToolBarToolItemShortcutsHint(ToolItem: TKASNormalItem): String; begin Result := ShortcutsToText(TfrmOptionsToolbar.GetShortcuts(ToolItem)); end; procedure TfrmMain.miLogMenuClick(Sender: TObject); begin case (Sender as TMenuItem).Tag of 0: seLogWindow.CopyToClipboard; 1: seLogWindow.SelectAll; 2: Commands.cm_ClearLogWindow([]); 3: ShowLogWindow(False); end; end; procedure TfrmMain.miTrayIconExitClick(Sender: TObject); begin RestoreFromTray; Close; end; procedure TfrmMain.miTrayIconRestoreClick(Sender: TObject); begin RestoreFromTray; end; procedure TfrmMain.PanelButtonClick(Button: TSpeedButton; FileView: TFileView); var aFile : UTF8String; begin with FileView do begin if Button.Caption = '/' then CurrentPath := FileSource.GetRootDir(CurrentPath) else if Button.Caption = '..' then ChangePathToParent(True) else if Button.Caption = '~' then SetFileSystemPath(FileView, GetHomeDir); end; if tb_activate_panel_on_click in gDirTabOptions then SetActiveFrame(FileView); end; procedure TfrmMain.FormDestroy(Sender: TObject); begin DCDebug('Destroying main form'); if Assigned(HotMan) then begin HotMan.UnRegister(edtCommand); HotMan.UnRegister(Self); end; TDriveWatcher.RemoveObserver(@OnDriveWatcherEvent); TDriveWatcher.Finalize; DCDebug('Drive watcher finished'); // Close all tabs. CloseNotebook(LeftTabs); CloseNotebook(RightTabs); FreeAndNil(DrivesList); {$IFDEF LCLQT} QObject_hook_destroy(QEventHook); {$ENDIF} DCDebug('Main form destroyed'); end; procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: boolean); begin if OperationsManager.OperationsCount > 0 then begin CanClose := MessageDlg(rsMsgFileOperationsActive, rsMsgFileOperationsActiveLong + LineEnding + rsMsgConfirmQuit, mtConfirmation, [mbYes, mbNo], 0, mbNo) = mrYes; end else CanClose := True; {$IFDEF LCLQT} CloseQueryResult:= CanClose; {$ENDIF} end; procedure TfrmMain.FormDropFiles(Sender: TObject; const FileNames: array of String); var TargetFileView: TFileView = nil; TargetControl: TControl; I: Integer; Files: TFiles = nil; FileNamesList: TStringList = nil; Point: TPoint; DropParams: TDropParams; begin TargetControl := FindLCLControl(Mouse.CursorPos); while TargetControl <> nil do begin if TargetControl = FrameLeft then begin // drop on left panel TargetFileView := FrameLeft; break; end else if TargetControl = FrameRight then begin // drop on right panel TargetFileView := FrameRight; break; end; TargetControl := TargetControl.Parent; end; if Assigned(TargetFileView) then try // fill file list by files FileNamesList := TStringList.Create; for I := Low(FileNames) to High(FileNames) do begin if Length(FileNames[I]) > 0 then FileNamesList.Add(FileNames[I]); end; if FileNamesList.Count > 0 then try Files := TFileSystemFileSource.CreateFilesFromFileList( ExtractFilePath(FileNamesList[0]), FileNamesList); if Files.Count > 0 then begin GetCursorPos(Point); DropParams := TDropParams.Create( Files, GetDropEffectByKeyAndMouse(GetKeyShiftState, mbLeft), Point, False, nil, TargetFileView, TargetFileView.FileSource, TargetFileView.CurrentPath); DropFiles(DropParams); end; except on e: EFileNotFound do MessageDlg(e.Message, mtError, [mbOK], 0); end; finally FreeAndNil(Files); FreeAndNil(FileNamesList); end; end; procedure TfrmMain.DropFiles(var DropParams: TDropParams); begin if Assigned(DropParams) then begin if DropParams.Files.Count > 0 then begin case DropParams.DropEffect of DropMoveEffect: DropParams.TargetPanel.DoDragDropOperation(ddoMove, DropParams); DropCopyEffect: DropParams.TargetPanel.DoDragDropOperation(ddoCopy, DropParams); DropLinkEffect: DropParams.TargetPanel.DoDragDropOperation(ddoSymLink, DropParams); DropAskEffect: begin // Ask the user what he would like to do by displaying a menu. // Returns immediately after showing menu. PopupDragDropMenu(DropParams); end; else FreeAndNil(DropParams); end; end else FreeAndNil(DropParams); end; end; procedure TfrmMain.DoDragDropOperation(Operation: TDragDropOperation; var DropParams: TDropParams); var SourceFileName, TargetFileName: string; begin try with DropParams do begin if Assigned(TargetFileSource) then begin case Operation of ddoMove: if GetDragDropType = ddtInternal then begin if Self.MoveFiles(SourcePanel.FileSource, TargetFileSource, Files, TargetPath, gShowDialogOnDragDrop) then begin SourcePanel.MarkFiles(False); end; end else begin Self.MoveFiles(TFileSystemFileSource.GetFileSource, TargetFileSource, Files, TargetPath, gShowDialogOnDragDrop); end; ddoCopy: if GetDragDropType = ddtInternal then begin if Self.CopyFiles(SourcePanel.FileSource, TargetFileSource, Files, TargetPath, gShowDialogOnDragDrop) then begin SourcePanel.MarkFiles(False); end; end else begin Self.CopyFiles(TFileSystemFileSource.GetFileSource, TargetFileSource, Files, TargetPath, gShowDialogOnDragDrop); end; ddoSymLink, ddoHardLink: begin // Only for filesystem. if ((GetDragDropType = ddtExternal) or (SourcePanel.FileSource.IsClass(TFileSystemFileSource))) and (TargetFileSource.IsClass(TFileSystemFileSource)) then begin // TODO: process multiple files SourceFileName := Files.Items[0].FullPath; TargetFileName := TargetPath + ExtractFileName(SourceFileName); if ((Operation = ddoSymLink) and ShowSymLinkForm(SourceFileName, TargetFileName, TargetPath)) or ((Operation = ddoHardLink) and ShowHardLinkForm(SourceFileName, TargetFileName, TargetPath)) then TargetFileSource.Reload(TargetPath); end else begin msgWarning(rsMsgErrNotSupported); end; end; end; end else msgWarning(rsMsgErrNotSupported); end; finally FreeAndNil(DropParams); end; end; {$IF FPC_FULLVERSION < 020501} function TfrmMain.ExecuteCommand(Command: string; const Params: array of string): TCommandFuncResult; begin Result := Commands.Commands.ExecuteCommand(Command, Params); end; function TfrmMain.GetCommandCaption(Command: String; CaptionType: TCommandCaptionType): String; begin Result := Commands.Commands.GetCommandCaption(Command, CaptionType); end; procedure TfrmMain.GetCommandsList(List: TStrings); begin Commands.Commands.GetCommandsList(List); end; {$ENDIF} procedure TfrmMain.FormUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char); begin // Either left or right panel has to be focused. if not FrameLeft.Focused and not FrameRight.Focused then begin Exit; end; // Check for certain Ascii keys. if (not ((Length(UTF8Key) = 1) and (UTF8Key[1] in ['-', '*', '+', #0..#32]))) then begin if (gKeyTyping[ktmNone] = ktaCommandLine) {$IFDEF MSWINDOWS} // Allow entering international characters with Ctrl+Alt on Windows, // if there is no action for Ctrl+Alt and command line typing has no modifiers. or (HasKeyboardAltGrKey and (GetKeyShiftStateEx * KeyModifiersShortcutNoText = [ssCtrl, ssAlt]) and (gKeyTyping[ktmCtrlAlt] = ktaNone)) {$ENDIF} then begin TypeInCommandLine(UTF8Key); UTF8Key := ''; end; end end; procedure TfrmMain.FormWindowStateChange(Sender: TObject); begin if WindowState = wsMinimized then begin // Minimized MainToolBar.Top:= 0; // restore toolbar position if not HiddenToTray then begin if gMinimizeToTray or gAlwaysShowTrayIcon then begin HideToTray; end; end else // If we get wsMinimized while HiddenToTray is true, // then this means it was sent by LCL when a hidden, minimized window was shown. // We don't react to this message in this case. HiddenToTray := False; end else begin // Not minimized // save window state before minimize for // future loading after restore from tray lastWindowState:=WindowState; HiddenToTray := False; end; end; procedure TfrmMain.MainSplitterDblClick(Sender: TObject); begin // To prevent MainSplitterMouseUp processing MainSplitterLeftMouseBtnDown:=false; MainSplitter.ParentColor:=true; // Set splitter to 50/50 Commands.DoPanelsSplitterPerPos(50); end; procedure TfrmMain.MainSplitterMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (Button=mbLeft) and (not MainSplitterLeftMouseBtnDown) then begin // Under Linux MainSplitter.Color:=clBlack Doesn't work MainSplitter.ParentColor:=true; MainSplitter.Color:=ColorToRGB(clBlack); MainSplitterMouseDownX:=X; MainSplitterMouseDownY:=Y; MainSplitterLeftMouseBtnDown:=true; end; end; procedure TfrmMain.MainSplitterMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var APoint: TPoint; Rect: TRect; sHint: String; Moved: Boolean = False; begin if MainSplitterLeftMouseBtnDown then begin if not gHorizontalFilePanels and (MainSplitter.Left + X > MainSplitter.Width) and (MainSplitter.Left + X + MainSplitter.Width < pnlNotebooks.Width) then begin MainSplitter.Left := MainSplitter.Left + X - MainSplitterMouseDownX; Moved := True; end else if gHorizontalFilePanels and (MainSplitter.Top + Y > MainSplitter.Height) and (MainSplitter.Top + Y + MainSplitter.Height < pnlNotebooks.Height) then begin MainSplitter.Top := MainSplitter.Top + Y - MainSplitterMouseDownY; Moved := True; end; if Moved then begin // create hint if not Assigned(MainSplitterHintWnd) then begin MainSplitterHintWnd := THintWindow.Create(nil); MainSplitterHintWnd.Color := Application.HintColor; end; // calculate percent if not gHorizontalFilePanels then FMainSplitterPos:= MainSplitter.Left * 100 / (pnlNotebooks.Width-MainSplitter.Width) else FMainSplitterPos:= MainSplitter.Top * 100 / (pnlNotebooks.Height-MainSplitter.Height); // generate hint text sHint:= FloatToStrF(FMainSplitterPos, ffFixed, 15, 1) + '%'; // calculate hint position Rect:= MainSplitterHintWnd.CalcHintRect(200, sHint, nil); APoint:= Mouse.CursorPos; with Rect do begin Right:= APoint.X + 8 + Right; Bottom:= APoint.Y + 12 + Bottom; Left:= APoint.X + 8; Top:= APoint.Y + 12; end; // show hint MainSplitterHintWnd.ActivateHint(Rect, sHint); end; end; end; procedure TfrmMain.MainSplitterMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin // hide and destroy hint if Assigned(MainSplitterHintWnd) then begin MainSplitterHintWnd.Hide; FreeAndNil(MainSplitterHintWnd); end; if (MainSplitterLeftMouseBtnDown) then begin MainSplitter.ParentColor:=true; MainSplitterLeftMouseBtnDown:=false; if not FResizingFilePanels then begin FResizingFilePanels := True; if not gHorizontalFilePanels then pnlLeft.Width := MainSplitter.Left else pnlLeft.Height := MainSplitter.Top; FResizingFilePanels := False; end; end; end; procedure TfrmMain.MainTrayIconClick(Sender: TObject); begin // Only react to clicks if the icon is not scheduled to be hidden. if not HidingTrayIcon then begin if WindowState = wsMinimized then begin RestoreFromTray; end else begin MinimizeWindow; HideToTray; end; end; end; procedure TfrmMain.lblDriveInfoDblClick(Sender: TObject); begin if tb_activate_panel_on_click in gDirTabOptions then begin if Sender = lblRightDriveInfo then SetActiveFrame(fpRight) else if Sender = lblLeftDriveInfo then SetActiveFrame(fpLeft); end; Commands.cm_DirHotList([]); end; procedure TfrmMain.LeftDriveBarExecuteDrive(ToolItem: TKASToolItem); var DriveItem: TKASDriveItem; begin DriveItem := ToolItem as TKASDriveItem; SetPanelDrive(fpLeft, DriveItem.Drive, True); end; procedure TfrmMain.MainToolBarDragDrop(Sender, Source: TObject; X, Y: Integer); var aFile: TFile; ToolItem: TKASProgramItem; begin if not (Source is TSpeedButton) and not Draging and (ssShift in GetKeyShiftState) then begin aFile := ActiveFrame.CloneActiveFile; try if Assigned(aFile) and aFile.IsNameValid then begin ToolItem := TKASProgramItem.Create; ToolItem.Command := aFile.FullPath; ToolItem.StartPath := aFile.Path; ToolItem.Hint := ExtractOnlyFileName(aFile.Name); ToolItem.Text := ExtractOnlyFileName(aFile.Name); ToolItem.Icon := aFile.FullPath; MainToolBar.AddButton(ToolItem); end; finally FreeAndNil(aFile); end; end; SaveMainToolBar; Draging := False; end; procedure TfrmMain.MainToolBarDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); var aFile: TFile; begin if (ssShift in GetKeyShiftState) and not (Source is TSpeedButton) then begin aFile := ActiveFrame.CloneActiveFile; try Accept := Assigned(aFile) and aFile.IsNameValid; finally FreeAndNil(aFile); end; end else Accept := false; end; function TfrmMain.MainToolBarLoadButtonGlyph(ToolItem: TKASToolItem; iIconSize: Integer; clBackColor: TColor): TBitmap; begin if ToolItem is TKASNormalItem then Result := PixMapManager.LoadBitmapEnhanced(TKASNormalItem(ToolItem).Icon, iIconSize, True, clBackColor) else Result := nil; end; procedure TfrmMain.tbDeleteClick(Sender: TObject); var Button: TKASToolButton; begin Button := TKASToolButton(pmToolBar.Tag); if Assigned(Button) then begin if msgYesNo(Format(rsMsgDelSel, [Button.Hint])) then begin MainToolBar.RemoveButton(Button); SaveMainToolBar; end; end; end; procedure TfrmMain.dskLeftToolButtonClick(Sender: TObject); begin PanelButtonClick(Sender as TKASToolButton, FrameLeft); end; procedure TfrmMain.btnVirtualDriveClick(Sender: TObject); var TargetPanel: TFileView; begin if gDriveBar1 and gDriveBar2 then begin if (Sender as TSpeedButton).Parent = dskLeft then TargetPanel := FrameLeft else TargetPanel := FrameRight; end else TargetPanel := ActiveFrame; Commands.DoOpenVirtualFileSystemList(TargetPanel); end; procedure TfrmMain.MainToolBarMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Point : TPoint; begin case Button of mbRight: begin Point.X := X; Point.Y := Y; Point := (Sender as TControl).ClientToScreen(Point); if Sender is TKASToolButton then pmToolBar.Tag := PtrInt(Sender) else pmToolBar.Tag := 0; pmToolBar.PopUp(Point.X, Point.Y); end; end; end; procedure TfrmMain.frmMainClose(Sender: TObject; var CloseAction: TCloseAction); begin // Process all queued asynchronous events before closing // (frmMainAfterShow, nbPageAfterMouseDown, etc.). Application.ProcessMessages; if gSaveConfiguration then try DebugLn('Saving configuration'); if Assigned(gIni) then uGlobs.ConvertIniToXml; if gSaveCmdLineHistory then glsCmdLineHistory.Assign(edtCommand.Items); SaveWindowState; SaveMainToolBar; SaveGlobs; // Should be last, writes configuration file except on E: Exception do DebugLn('Cannot save main configuration: ', e.Message); end; FreeAndNil(Cons); Application.Terminate; end; procedure TfrmMain.frmMainAfterShow(Data: PtrInt); begin ActiveFrame.SetFocus; HiddenToTray := False; end; procedure TfrmMain.frmMainShow(Sender: TObject); begin DCDebug('frmMain.frmMainShow'); {$IF DEFINED(LCLCARBON) and DECLARED(lcl_fullversion) and (lcl_fullversion >= 093100)} ActiveControl:= ActiveFrame; HiddenToTray := False; {$ELSE} Application.QueueAsyncCall(@frmMainAfterShow, 0); {$ENDIF} end; procedure TfrmMain.mnuDropClick(Sender: TObject); var DropParamsRef: TDropParams; begin if (Sender is TMenuItem) and Assigned(FDropParams) then begin // Make a copy of the reference to parameters and clear FDropParams, // so that they're not destroyed if pmDropMenuClose is called while we're processing. DropParamsRef := FDropParams; FDropParams := nil; // release ownership with DropParamsRef do begin if (Sender as TMenuItem).Name = 'miMove' then begin TargetPanel.DoDragDropOperation(ddoMove, DropParamsRef); end else if (Sender as TMenuItem).Name = 'miCopy' then begin TargetPanel.DoDragDropOperation(ddoCopy, DropParamsRef); end else if (Sender as TMenuItem).Name = 'miSymLink' then begin TargetPanel.DoDragDropOperation(ddoSymLink, DropParamsRef); end else if (Sender as TMenuItem).Name = 'miHardLink' then begin TargetPanel.DoDragDropOperation(ddoHardLink, DropParamsRef); end else if (Sender as TMenuItem).Name = 'miCancel' then begin FreeAndNil(DropParamsRef); end; end; //with end; end; procedure TfrmMain.PopupDragDropMenu(var DropParams: TDropParams); begin // Disposing of the params is handled in pmDropMenuClose or mnuDropClick. if Assigned(DropParams) then begin FDropParams := DropParams; DropParams := nil; pmDropMenu.PopUp(FDropParams.ScreenDropPoint.X, FDropParams.ScreenDropPoint.Y); end; end; procedure TfrmMain.pmDropMenuClose(Sender: TObject); begin // Free drop parameters given to drop menu. FreeAndNil(FDropParams); end; procedure TfrmMain.mnuSplitterPercentClick(Sender: TObject); begin with (Sender as TMenuItem) do begin Commands.DoPanelsSplitterPerPos(Tag); end; end; procedure TfrmMain.mnuTabMenuClick(Sender: TObject); var Cmd: String; MenuItem: TMenuItem; NoteBook: TFileViewNotebook; begin MenuItem := (Sender as TMenuItem); NoteBook := (pmTabMenu.Parent as TFileViewNotebook); // pmTabMenu.Tag stores tab page nr where the menu was activated. if MenuItem = miCloseTab then Commands.DoCloseTab(NoteBook, pmTabMenu.Tag) else if MenuItem = miRenameTab then Commands.DoRenameTab(NoteBook.Page[pmTabMenu.Tag]) else if MenuItem = miTabOptionNormal then NoteBook.Page[pmTabMenu.Tag].LockState := tlsNormal else if MenuItem = miTabOptionPathLocked then NoteBook.Page[pmTabMenu.Tag].LockState := tlsPathLocked else if MenuItem = miTabOptionPathResets then NoteBook.Page[pmTabMenu.Tag].LockState := tlsPathResets else if MenuItem = miTabOptionDirsInNewTab then NoteBook.Page[pmTabMenu.Tag].LockState := tlsDirsInNewTab else begin Cmd:= MenuItem.Action.Name; Cmd:= 'cm_' + Copy(Cmd, 4, Length(Cmd) - 3); Commands.Commands.ExecuteCommand(Cmd, NoteBook.Name); end; end; procedure TfrmMain.nbPageAfterMouseDown(Data: PtrInt); var Notebook: TFileViewNotebook; begin if TObject(Data) is TFileViewNotebook then begin Notebook := TObject(Data) as TFileViewNotebook; if (Notebook = nbLeft) and (FrameLeft <> nil) then begin if PanelSelected = fpLeft then // same panel FrameLeft.SetFocus else if (tb_activate_panel_on_click in gDirTabOptions) then SetActiveFrame(fpLeft) else FrameRight.SetFocus; end; if (Notebook = nbRight) and (FrameRight <> nil) then begin if PanelSelected = fpRight then // same panel FrameRight.SetFocus else if (tb_activate_panel_on_click in gDirTabOptions) then SetActiveFrame(fpRight) else FrameLeft.SetFocus; end; end; end; procedure TfrmMain.nbPageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Application.QueueAsyncCall(@nbPageAfterMouseDown, PtrInt(Sender)); end; procedure TfrmMain.nbPageChanged(Sender: TObject); var Notebook: TFileViewNotebook; Page: TFileViewPage; begin Notebook := Sender as TFileViewNotebook; Page := Notebook.ActivePage; if Assigned(Page) then begin if Page.LockState = tlsPathResets then // if locked with directory change Page.FileView.CurrentPath := Page.LockPath; // Update selected drive only on non-active panel, // because active panel is updated on focus change. if (PanelSelected <> Notebook.Side) and not (tb_activate_panel_on_click in gDirTabOptions) then begin UpdateSelectedDrive(Notebook); UpdateFreeSpace(Notebook.Side); end; end; if Assigned(QuickViewPanel) then Commands.cm_QuickView(['Close']); end; procedure TfrmMain.nbPageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var PopUpPoint: TPoint; NoteBook: TFileViewNotebook; TabNr: Integer; begin NoteBook := Sender as TFileViewNotebook; case Button of mbMiddle: begin TabNr := NoteBook.TabIndexAtClientPos(Point(X, Y)); if TabNr <> -1 then begin Commands.DoCloseTab(NoteBook, TabNr); end; end; mbRight: begin TabNr := NoteBook.TabIndexAtClientPos(Point(X, Y)); if TabNr <> -1 then begin PopUpPoint := NoteBook.ClientToScreen(Point(X, Y)); {$IFDEF LCLQT} // In QT the NoteBook.ClientToScreen calculates coordinates // relative to Page contents (client rectangle), // so we must substract the height and width of the tab bar. PopUpPoint.X := PopUpPoint.X - (NoteBook.Width - NoteBook.ClientWidth); PopUpPoint.Y := PopUpPoint.Y - (NoteBook.Height - NoteBook.ClientHeight); {$ENDIF} // Check tab options items. case NoteBook.Page[TabNr].LockState of tlsNormal: miTabOptionNormal.Checked := True; tlsPathLocked: miTabOptionPathLocked.Checked := True; tlsDirsInNewTab: miTabOptionDirsInNewTab.Checked := True; tlsPathResets: miTabOptionPathResets.Checked := True; end; pmTabMenu.Parent := NoteBook; pmTabMenu.Tag := TabNr; pmTabMenu.PopUp(PopUpPoint.x, PopUpPoint.y); end; end; end; end; procedure TfrmMain.NotebookCloseTabClicked(Sender: TObject); begin with (Sender As TFileViewPage) do if PageIndex <> -1 then begin RemovePage(Notebook, PageIndex); end; end; procedure TfrmMain.ConvertIniToolbarItem(Loader: TKASToolBarIniLoader; var Item: TKASToolItem; const Shortcut: String); procedure ConvertHotkeys(CommandItem: TKASCommandItem; Hotkeys: THotkeys; SearchHotkey: THotkey); var Hotkey: THotkey; begin Hotkey := Hotkeys.FindByContents(SearchHotkey); if Assigned(Hotkey) then begin Hotkey.Command := 'cm_ExecuteToolbarItem'; Hotkey.Params := nil; SetValue(Hotkey.Params, 'ToolItemID', CommandItem.ID); end; end; var HMForm: THMForm; Hotkey: THotkey; CommandItem: TKASCommandItem; MenuItem: TKASMenuItem; BarFileName: String; begin if Item is TKASCommandItem then begin CommandItem := TKASCommandItem(Item); // Convert toolbar hotkey to use ID as parameter. if Shortcut <> '' then begin Hotkey := THotkey.Create; try Hotkey.Command := 'cm_Int_RunCommandFromBarFile'; AddString(Hotkey.Shortcuts, Shortcut); Hotkey.Params := Hotkey.Shortcuts; HMForm := HotMan.Forms.Find('Main'); if Assigned(HMForm) then ConvertHotkeys(CommandItem, HMForm.Hotkeys, Hotkey); finally Hotkey.Free; end; end; if ((CommandItem.Command = 'cm_OpenBar') or (CommandItem.Command = 'cm_ShowButtonMenu')) and (Length(CommandItem.Params) > 0) then begin BarFileName := CommandItem.Params[0]; if Pos(PathDelim, BarFileName) <> 0 then BarFileName := GetCmdDirFromEnvVar(BarFileName) else BarFileName := gpCfgDir + BarFileName; if mbFileExists(BarFileName) then begin MenuItem := TKASMenuItem.Create; MenuItem.Assign(Item); // Copy whatever is possible from Command item Loader.Load(BarFileName, nil, MenuItem, @ConvertIniToolbarItem); mbRenameFile(BarFileName, BarFileName + '.obsolete'); Item.Free; Item := MenuItem; end; end; end; end; procedure TfrmMain.FormKeyPress(Sender: TObject; var Key: Char); var ModifierKeys: TShiftState; begin // Either left or right panel has to be focused. if not FrameLeft.Focused and not FrameRight.Focused then begin Exit; end; ModifierKeys := GetKeyShiftStateEx; if gCmdLine and // If command line is enabled (GetKeyTypingAction(ModifierKeys) = ktaCommandLine) and not ((Key in ['-', '*', '+', #0..#32]) and (Trim(edtCommand.Text) = '')) then begin TypeInCommandLine(Key); Key := #0; end; end; function TfrmMain.ActiveFrame: TFileView; begin case PanelSelected of fpLeft: Result := FrameLeft; fpRight: Result := FrameRight; else assert(false,'Bad active frame'); end; end; function TfrmMain.NotActiveFrame: TFileView; begin case PanelSelected of fpRight: Result := FrameLeft; fpLeft: Result := FrameRight; else assert(false,'Bad active frame'); Result:=FrameLeft;// only for compilator warning; end; end; function TfrmMain.ActiveNotebook: TFileViewNotebook; begin case PanelSelected of fpLeft: Result := nbLeft; fpRight: Result := nbRight; else assert(false,'Bad active notebook'); end; end; function TfrmMain.NotActiveNotebook: TFileViewNotebook; begin case PanelSelected of fpLeft: Result := nbRight; fpRight: Result := nbLeft; else assert(false,'Bad active notebook'); end; end; function TfrmMain.FrameLeft: TFileView; begin Result := nbLeft.ActiveView; end; function TfrmMain.FrameRight: TFileView; begin Result := nbRight.ActiveView; end; procedure TfrmMain.ForEachView(CallbackFunction: TForEachViewFunction; UserData: Pointer); procedure EnumerateNotebook(ANoteBook: TFileViewNotebook); var i: Integer; begin for i := 0 to ANoteBook.PageCount - 1 do CallbackFunction(ANoteBook.View[i], UserData); end; begin EnumerateNotebook(nbLeft); EnumerateNotebook(nbRight); end; procedure TfrmMain.AppException(Sender: TObject; E: Exception); begin WriteExceptionToErrorFile; ShowExceptionDialog; end; constructor TfrmMain.Create(TheOwner: TComponent); begin FMainSplitterPos := 50.0; inherited Create(TheOwner); FCommands := TMainCommands.Create(Self, actionLst); end; procedure TfrmMain.UpdateActionIcons(); var I: Integer; imgIndex: Integer; iconsDir: String; fileName: String; iconImg: TPicture; actionName: TComponentName; begin actionLst.Images := nil; pmTabMenu.Images := nil; mnuMain.Images := nil; imgLstActions.Clear; if gIconsInMenus then begin // Temporarily while feature is not implemented // http://doublecmd.sourceforge.net/mantisbt/view.php?id=11 fileName := IntToStr(gIconsInMenusSize); iconsDir := gpPixmapPath + PathDelim + 'dctheme' + PathDelim + fileName; iconsDir := iconsDir + 'x' + fileName + PathDelim + 'actions'; if not mbDirectoryExists(iconsDir) then Exit; iconImg := TPicture.Create; try imgLstActions.Width := gIconsInMenusSize; imgLstActions.Height := gIconsInMenusSize; actionLst.Images := imgLstActions; pmTabMenu.Images := imgLstActions; mnuMain.Images := imgLstActions; for I:= 0 to actionLst.ActionCount - 1 do begin actionName := UTF8LowerCase(actionLst.Actions[I].Name); fileName := iconsDir + PathDelim + 'cm_' + UTF8Copy(actionName, 4, Length(actionName) - 3) + '.png'; if mbFileExists(fileName) then try iconImg.LoadFromFile(fileName); imgIndex := imgLstActions.Add(iconImg.Bitmap, nil); if imgIndex >= 0 then begin TAction(actionLst.Actions[I]).ImageIndex := imgIndex; end; except // Skip end; end; finally FreeAndNil(iconImg); end; end; end; procedure TfrmMain.CreateDefaultToolbar; procedure AddCommand(Command, Icon: String); var CommandItem: TKASCommandItem; begin CommandItem := TKASCommandItem.Create(Commands.Commands); CommandItem.Icon := Icon; CommandItem.Command := Command; // Leave CommandItem.Hint empty. It will be loaded at startup based on language. MainToolBar.AddButton(CommandItem); end; procedure AddSeparator; begin MainToolBar.AddButton(TKASSeparatorItem.Create); end; var MainToolBarNode: TXmlNode; begin if MainToolBar.ButtonCount = 0 then begin MainToolBarNode := gConfig.FindNode(gConfig.RootNode, 'Toolbars/MainToolbar', False); if not Assigned(MainToolBarNode) then begin AddCommand('cm_Refresh', 'view-refresh'); AddCommand('cm_RunTerm', 'utilities-terminal'); AddCommand('cm_MarkPlus', 'list-add'); AddCommand('cm_MarkMinus', 'list-remove'); AddSeparator; AddCommand('cm_PackFiles', 'package-x-generic'); AddSeparator; AddCommand('cm_Search', 'system-search'); AddSeparator; AddCommand('cm_ViewHistoryPrev', 'go-previous'); AddCommand('cm_ViewHistoryNext', 'go-next'); SaveMainToolBar; end; end; end; function TfrmMain.GetFileDlgStr(sLngOne, sLngMulti: String; Files: TFiles): String; begin if Files.Count = 0 then raise Exception.Create(rsMsgNoFilesSelected); if Files.Count > 1 then Result := Format(sLngMulti, [Files.Count]) else Result := Format(sLngOne, [Files[0].Name]); end; procedure TfrmMain.miHotAddClick(Sender: TObject); var sName: UTF8String; begin sName:= StringReplace(GetLastDir(ActiveFrame.CurrentPath), '&', '&&', [rfReplaceAll]); if InputQuery('Double Commander', rsMsgTitleNewEntryHotDir, sName) then glsHotDir.Add(sName + '=' + ActiveFrame.CurrentPath); end; procedure TfrmMain.miHotDeleteClick(Sender: TObject); var I: Integer; begin I:= glsHotDir.IndexOfValue(ActiveFrame.CurrentPath); if I >= 0 then glsHotDir.Delete(I); end; procedure TfrmMain.miHotConfClick(Sender: TObject); begin with TfrmHotDir.Create(Application) do begin try LoadFromGlob; ShowModal; finally Free; end; end; end; procedure TfrmMain.CreatePopUpDirHistory; var mi: TMenuItem; I: Integer; begin pmDirHistory.Items.Clear; // store only first gDirHistoryCount of DirHistory for I:= glsDirHistory.Count - 1 downto 0 do if I > gDirHistoryCount then glsDirHistory.Delete(I) else Break; for I:= 0 to glsDirHistory.Count - 1 do begin mi:= TMenuItem.Create(pmDirHistory); mi.Caption:= glsDirHistory[I]; mi.Hint:= mi.Caption; mi.OnClick:= @HotDirSelected; pmDirHistory.Items.Add(mi); end; end; procedure TfrmMain.ShowFileViewHistory; begin ShowFileViewHistory(-1, -1, -1, -1); end; procedure TfrmMain.ShowFileViewHistory(FromFileSourceIndex, FromPathIndex, ToFileSourceIndex, ToPathIndex: Integer); const MaxItemsShown = 20; var ItemsBackward: Integer = 0; ItemsForward: Integer = 0; function GoBack(var FileSourceIndex, PathIndex: Integer): Boolean; begin if PathIndex = 0 then begin if FileSourceIndex = 0 then Result := False else begin Dec(FileSourceIndex); PathIndex := ActiveFrame.PathsCount[FileSourceIndex] - 1; Result := True; end; end else begin Dec(PathIndex); Result := True; end; end; function GoForward(var FileSourceIndex, PathIndex: Integer): Boolean; begin if PathIndex = ActiveFrame.PathsCount[FileSourceIndex] - 1 then begin if FileSourceIndex = ActiveFrame.FileSourcesCount - 1 then Result := False else begin Inc(FileSourceIndex); PathIndex := 0; Result := True; end; end else begin Inc(PathIndex); Result := True; end; end; procedure AddCaptionItem(s: String); var mi: TMenuItem; begin mi := TMenuItem.Create(pmDirHistory); mi.Caption := s; mi.Enabled := False; pmDirHistory.Items.Add(mi); end; procedure FindBoundsBackward; var I: Integer; begin GoBack(ToFileSourceIndex, ToPathIndex); FromFileSourceIndex := ToFileSourceIndex; FromPathIndex := ToPathIndex; for i := 0 to MaxItemsShown - 1 do begin if GoBack(FromFileSourceIndex, FromPathIndex) then Inc(ItemsBackward); end; end; procedure FindBoundsFromCenter; var I: Integer; begin FromFileSourceIndex := ActiveFrame.CurrentFileSourceIndex; FromPathIndex := ActiveFrame.CurrentPathIndex; ToFileSourceIndex := FromFileSourceIndex; ToPathIndex := FromPathIndex; for i := 0 to (MaxItemsShown div 2) - 1 do begin if GoBack(FromFileSourceIndex, FromPathIndex) then Inc(ItemsBackward); if GoForward(ToFileSourceIndex, ToPathIndex) then Inc(ItemsForward); end; for i := ItemsForward to (MaxItemsShown div 2) - 1 do begin if GoBack(FromFileSourceIndex, FromPathIndex) then Inc(ItemsBackward); end; for i := ItemsBackward to (MaxItemsShown div 2) - 1 do begin if GoForward(ToFileSourceIndex, ToPathIndex) then Inc(ItemsForward); end; end; procedure FindBoundsForward; var I: Integer; begin GoForward(FromFileSourceIndex, FromPathIndex); ToFileSourceIndex := FromFileSourceIndex; ToPathIndex := FromPathIndex; for i := 0 to MaxItemsShown - 1 do begin if GoForward(ToFileSourceIndex, ToPathIndex) then Inc(ItemsForward); end; end; var I: Integer; mi: TMenuItem; p: TPoint; begin pmDirHistory.Items.Clear; if FromFileSourceIndex <> -1 then FindBoundsForward else if ToFileSourceIndex <> - 1 then FindBoundsBackward else FindBoundsFromCenter; if (FromFileSourceIndex > 0) or (FromPathIndex > 0) then begin mi := TMenuItem.Create(pmDirHistory); mi.Caption := '...'; mi.OnClick := @ViewHistoryPrevSelected; mi.Tag := HistoryIndexesToTag(FromFileSourceIndex, FromPathIndex); pmDirHistory.Items.Add(mi); end; for i := 0 to ItemsForward + ItemsBackward do begin mi := TMenuItem.Create(pmDirHistory); pmDirHistory.Items.Add(mi); mi.Caption := ActiveFrame.Path[FromFileSourceIndex, FromPathIndex]; mi.OnClick := @ViewHistorySelected; // Remember indexes into history. mi.Tag := HistoryIndexesToTag(FromFileSourceIndex, FromPathIndex); // Mark current history position. if (FromFileSourceIndex = ActiveFrame.CurrentFileSourceIndex) and (FromPathIndex = ActiveFrame.CurrentPathIndex) then mi.Checked := True; if not GoForward(FromFileSourceIndex, FromPathIndex) then Break; // Add separator and address of a file source as a caption. if FromPathIndex = 0 then begin AddCaptionItem('-'); AddCaptionItem('- ' + ActiveFrame.FileSources[FromFileSourceIndex].CurrentAddress + ' -'); end; end; if (ToFileSourceIndex < ActiveFrame.FileSourcesCount - 1) or (ToPathIndex < ActiveFrame.PathsCount[ToFileSourceIndex] - 1) then begin mi := TMenuItem.Create(pmDirHistory); mi.Caption := '...'; mi.OnClick := @ViewHistoryNextSelected; mi.Tag := HistoryIndexesToTag(ToFileSourceIndex, ToPathIndex); pmDirHistory.Items.Add(mi); end; p := ActiveFrame.ClientToScreen(Classes.Point(0,0)); pmDirHistory.Popup(p.X, p.Y); end; procedure TfrmMain.CreatePopUpHotDir; var mi: TMenuItem; I: Integer; begin // Create All popup menu pmHotList.Items.Clear; for I:= 0 to glsHotDir.Count - 1 do begin mi:= TMenuItem.Create(pmHotList); if Pos('&', glsHotDir.Names[I]) = 0 then mi.Caption:= '&' + glsHotDir.Names[I] else mi.Caption:= glsHotDir.Names[I]; mi.Hint:= glsHotDir.ValueFromIndex[I]; mi.OnClick:= @HotDirSelected; pmHotList.Items.Add(mi); end; // now add delimiter mi:= TMenuItem.Create(pmHotList); mi.Caption:= '-'; pmHotList.Items.Add(mi); // now add ADD or DELETE item mi:= TMenuItem.Create(pmHotList); if glsHotDir.IndexOfValue(ActiveFrame.CurrentPath) >= 0 then begin mi.Caption:= Format(rsMsgPopUpHotDelete,[ActiveFrame.CurrentPath]); mi.OnClick:= @miHotDeleteClick; end else begin mi.Caption:= Format(rsMsgPopUpHotAdd,[ActiveFrame.CurrentPath]); mi.OnClick:= @miHotAddClick; end; pmHotList.Items.Add(mi); // now add configure item mi:= TMenuItem.Create(pmHotList); mi.Caption:= rsMsgPopUpHotCnf; mi.OnClick:= @miHotConfClick; pmHotList.Items.Add(mi); end; procedure TfrmMain.HotDirSelected(Sender: TObject); var aPath: String; begin // This handler is used by HotDir and DirHistory. // Hot dirs are only supported by filesystem. aPath := (Sender as TMenuItem).Hint; aPath := mbExpandFileName(aPath); ChooseFileSource(ActiveFrame, aPath); end; procedure TfrmMain.ViewHistorySelected(Sender: TObject); var FileSourceIndex, PathIndex: Integer; begin if Sender is TMenuItem then begin HistoryIndexesFromTag((Sender as TMenuItem).Tag, FileSourceIndex, PathIndex); ActiveFrame.GoToHistoryIndex(FileSourceIndex, PathIndex); end; end; procedure TfrmMain.ViewHistoryPrevSelected(Sender:TObject); var FileSourceIndex, PathIndex: Integer; begin if Sender is TMenuItem then begin HistoryIndexesFromTag((Sender as TMenuItem).Tag, FileSourceIndex, PathIndex); ShowFileViewHistory(-1, -1, FileSourceIndex, PathIndex); end; end; procedure TfrmMain.ViewHistoryNextSelected(Sender:TObject); var FileSourceIndex, PathIndex: Integer; begin if Sender is TMenuItem then begin HistoryIndexesFromTag((Sender as TMenuItem).Tag, FileSourceIndex, PathIndex); ShowFileViewHistory(FileSourceIndex, PathIndex, -1, -1); end; end; procedure TfrmMain.edtCommandKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (key=VK_Down) and (Shift=[ssCtrl]) and (edtCommand.Items.Count>0) then begin Key:=0; edtCommand.DroppedDown:=True; edtCommand.SetFocus; end; end; function TfrmMain.CopyFiles(SourceFileSource, TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String; bShowDialog: Boolean; QueueIdentifier: TOperationsManagerQueueIdentifier): Boolean; var sDestination: String; sDstMaskTemp: String; Operation: TFileSourceCopyOperation = nil; OperationType: TFileSourceOperationType; CopyDialog: TfrmCopyDlg = nil; FileSource: IFileSource; OperationClass: TFileSourceOperationClass; OperationOptionsUIClass: TFileSourceOperationOptionsUIClass = nil; begin Result := False; try if SourceFiles.Count = 0 then Exit; if (SourceFiles.Count = 1) and ((not (SourceFiles[0].IsDirectory or SourceFiles[0].IsLinkToDirectory)) or (TargetPath = '')) then sDestination := TargetPath + SourceFiles[0].Name else sDestination := TargetPath + '*.*'; // If same file source and address if (fsoCopy in SourceFileSource.GetOperationsTypes) and (fsoCopy in TargetFileSource.GetOperationsTypes) and SourceFileSource.Equals(TargetFileSource) and SameText(SourceFileSource.GetCurrentAddress, TargetFileSource.GetCurrentAddress) then begin OperationType := fsoCopy; FileSource := SourceFileSource; OperationClass := SourceFileSource.GetOperationClass(fsoCopy); end else if TargetFileSource.IsClass(TFileSystemFileSource) and (fsoCopyOut in SourceFileSource.GetOperationsTypes) then begin OperationType := fsoCopyOut; FileSource := SourceFileSource; OperationClass := SourceFileSource.GetOperationClass(fsoCopyOut); end else if SourceFileSource.IsClass(TFileSystemFileSource) and (fsoCopyIn in TargetFileSource.GetOperationsTypes) then begin OperationType := fsoCopyIn; FileSource := TargetFileSource; OperationClass := TargetFileSource.GetOperationClass(fsoCopyIn); end else begin msgWarning(rsMsgErrNotSupported); Exit; end; if bShowDialog then begin if Assigned(OperationClass) then OperationOptionsUIClass := OperationClass.GetOptionsUIClass; CopyDialog := TfrmCopyDlg.Create(Application, cmdtCopy, FileSource, OperationOptionsUIClass); CopyDialog.edtDst.Text := sDestination; CopyDialog.lblCopySrc.Caption := GetFileDlgStr(rsMsgCpSel, rsMsgCpFlDr, SourceFiles); while True do begin if CopyDialog.ShowModal = mrCancel then Exit; sDestination := CopyDialog.edtDst.Text; GetDestinationPathAndMask(SourceFiles, SourceFileSource, TargetFileSource, sDestination, SourceFiles.Path, TargetPath, sDstMaskTemp); if (TargetFileSource = nil) or (Length(TargetPath) = 0) then begin MessageDlg(rsMsgInvalidPath, rsMsgErrNotSupported, mtWarning, [mbOK], 0); Continue; end; if HasPathInvalidCharacters(TargetPath) then MessageDlg(rsMsgInvalidPath, Format(rsMsgInvalidPathLong, [TargetPath]), mtWarning, [mbOK], 0) else Break; end; QueueIdentifier := CopyDialog.QueueIdentifier; end else GetDestinationPathAndMask(SourceFiles, TargetFileSource, sDestination, SourceFiles.Path, TargetPath, sDstMaskTemp); case OperationType of fsoCopy: begin // Copy within the same file source. Operation := SourceFileSource.CreateCopyOperation( SourceFiles, TargetPath) as TFileSourceCopyOperation; end; fsoCopyOut: // CopyOut to filesystem. Operation := SourceFileSource.CreateCopyOutOperation( TargetFileSource, SourceFiles, TargetPath) as TFileSourceCopyOperation; fsoCopyIn: // CopyIn from filesystem. Operation := TargetFileSource.CreateCopyInOperation( SourceFileSource, SourceFiles, TargetPath) as TFileSourceCopyOperation; end; if Assigned(Operation) then begin // Set operation options based on settings in dialog. Operation.RenameMask := sDstMaskTemp; if Assigned(CopyDialog) then CopyDialog.SetOperationOptions(Operation); // Start operation. OperationsManager.AddOperation(Operation, QueueIdentifier, False, True); Result := True; end else msgWarning(rsMsgNotImplemented); finally FreeAndNil(SourceFiles); FreeAndNil(CopyDialog); end; end; function TfrmMain.MoveFiles(SourceFileSource, TargetFileSource: IFileSource; var SourceFiles: TFiles; TargetPath: String; bShowDialog: Boolean; QueueIdentifier: TOperationsManagerQueueIdentifier = FreeOperationsQueueId): Boolean; var sDestination: String; sDstMaskTemp: String; Operation: TFileSourceMoveOperation; bMove: Boolean; MoveDialog: TfrmCopyDlg = nil; begin Result := False; try // Only allow moving within the same file source. if (SourceFileSource.IsInterface(TargetFileSource) or TargetFileSource.IsInterface(SourceFileSource)) and (SourceFileSource.CurrentAddress = TargetFileSource.CurrentAddress) and (fsoMove in SourceFileSource.GetOperationsTypes) and (fsoMove in TargetFileSource.GetOperationsTypes) then begin bMove := True; end else if ((fsoCopyOut in SourceFileSource.GetOperationsTypes) and (fsoCopyIn in TargetFileSource.GetOperationsTypes)) then begin bMove := False; // copy + delete through temporary file system msgWarning(rsMsgNotImplemented); Exit; end else begin msgWarning(rsMsgErrNotSupported); Exit; end; if SourceFiles.Count = 0 then Exit; if (SourceFiles.Count = 1) and (not (SourceFiles[0].IsDirectory or SourceFiles[0].IsLinkToDirectory)) then sDestination := TargetPath + ExtractFileName(SourceFiles[0].Name) else sDestination := TargetPath + '*.*'; if bShowDialog then begin MoveDialog := TfrmCopyDlg.Create(Application, cmdtMove, SourceFileSource, SourceFileSource.GetOperationClass(fsoMove).GetOptionsUIClass); MoveDialog.edtDst.Text := sDestination; MoveDialog.lblCopySrc.Caption := GetFileDlgStr(rsMsgRenSel, rsMsgRenFlDr, SourceFiles); while True do begin if MoveDialog.ShowModal = mrCancel then Exit; sDestination := MoveDialog.edtDst.Text; GetDestinationPathAndMask(SourceFiles, SourceFileSource, TargetFileSource, sDestination, SourceFiles.Path, TargetPath, sDstMaskTemp); if (TargetFileSource = nil) or (Length(TargetPath) = 0) then begin MessageDlg(EmptyStr, rsMsgInvalidPath, mtWarning, [mbOK], 0); Continue; end; if HasPathInvalidCharacters(TargetPath) then MessageDlg(rsMsgInvalidPath, Format(rsMsgInvalidPathLong, [TargetPath]), mtWarning, [mbOK], 0) else Break; end; QueueIdentifier := MoveDialog.QueueIdentifier; end else GetDestinationPathAndMask(SourceFiles, TargetFileSource, sDestination, SourceFiles.Path, TargetPath, sDstMaskTemp); if bMove then begin Operation := SourceFileSource.CreateMoveOperation( SourceFiles, TargetPath) as TFileSourceMoveOperation; if Assigned(Operation) then begin // Set operation options based on settings in dialog. Operation.RenameMask := sDstMaskTemp; if Assigned(MoveDialog) then MoveDialog.SetOperationOptions(Operation); // Start operation. OperationsManager.AddOperation(Operation, QueueIdentifier, False, True); Result := True; end else msgWarning(rsMsgNotImplemented); end else begin // Use CopyOut, CopyIn operations. end; finally FreeAndNil(SourceFiles); FreeAndNil(MoveDialog); end; end; function TfrmMain.CopyFiles(sDestPath: String; bShowDialog: Boolean; QueueIdentifier: TOperationsManagerQueueIdentifier = FreeOperationsQueueId): Boolean; var SourceFiles: TFiles = nil; begin SourceFiles := ActiveFrame.CloneSelectedOrActiveFiles; if Assigned(SourceFiles) then begin try Result := CopyFiles(ActiveFrame.FileSource, NotActiveFrame.FileSource, SourceFiles, sDestPath, bShowDialog, QueueIdentifier); if Result then ActiveFrame.MarkFiles(False); finally FreeAndNil(SourceFiles); end; end else Result := False; end; function TfrmMain.MoveFiles(sDestPath: String; bShowDialog: Boolean; QueueIdentifier: TOperationsManagerQueueIdentifier = FreeOperationsQueueId): Boolean; var SourceFiles: TFiles = nil; begin SourceFiles := ActiveFrame.CloneSelectedOrActiveFiles; if Assigned(SourceFiles) then begin try Result := MoveFiles(ActiveFrame.FileSource, NotActiveFrame.FileSource, SourceFiles, sDestPath, bShowDialog, QueueIdentifier); if Result then ActiveFrame.MarkFiles(False); finally FreeAndNil(SourceFiles); end; end else Result := False; end; procedure TfrmMain.GetDestinationPathAndMask(SourceFiles: TFiles; TargetFileSource: IFileSource; EnteredPath: String; BaseDir: String; out DestPath, DestMask: String); var AbsolutePath: String; begin if TargetFileSource.GetPathType(EnteredPath) = ptAbsolute then AbsolutePath := EnteredPath else begin // This only work for filesystem for now. if TargetFileSource.IsClass(TFileSystemFileSource) then AbsolutePath := BaseDir + EnteredPath else AbsolutePath := PathDelim{TargetFileSource.GetRoot} + EnteredPath; end; AbsolutePath := NormalizePathDelimiters(AbsolutePath); // normalize path delimiters AbsolutePath := ExpandAbsolutePath(AbsolutePath); if Length(AbsolutePath) = 0 then Exit; // If the entered path ends with a path delimiter // treat it as a path to a not yet existing directory // which should be created. if (AbsolutePath[Length(AbsolutePath)] = PathDelim) or ((TargetFileSource.IsClass(TFileSystemFileSource)) and mbDirectoryExists(AbsolutePath)) then begin // Destination is a directory. DestPath := AbsolutePath; DestMask := '*.*'; end else begin // Destination is a file name or mask. DestPath := ExtractFilePath(AbsolutePath); DestMask := ExtractFileName(AbsolutePath); if (SourceFiles.Count > 1) and not ContainsWildcards(DestMask) then begin // Assume it is a path to a directory because cannot put multiple // files/directories into one file. DestPath := AbsolutePath; DestMask := '*.*'; end // For convenience, treat '*' as "whole file name". // To remove extension '*.' can be used. else if DestMask = '*' then DestMask := '*.*'; end; end; procedure TfrmMain.GetDestinationPathAndMask(SourceFiles: TFiles; SourceFileSource: IFileSource; var TargetFileSource: IFileSource; EnteredPath: String; BaseDir: String; out DestPath, DestMask: String); var FileSourceIndex, PathIndex: Integer; begin // If it is a file source root and we trying to copy/move to parent directory if StrBegins(EnteredPath, '..') and SourceFileSource.IsPathAtRoot(SourceFiles.Path) then begin // Change to previous file source and last path. FileSourceIndex := ActiveFrame.CurrentFileSourceIndex - 1; if FileSourceIndex < 0 then TargetFileSource := nil // No parent file sources. else begin PathIndex := ActiveFrame.PathsCount[FileSourceIndex] - 1; if PathIndex < 0 then TargetFileSource := nil // No paths. else begin TargetFileSource := ActiveFrame.FileSources[FileSourceIndex]; // Determine destination type if (Length(EnteredPath) = 2) or (EnteredPath[Length(EnteredPath)] = PathDelim) then EnteredPath:= EmptyStr // Destination is a directory else EnteredPath:= ExtractFileName(EnteredPath); // Destination is a file name or mask // Combine destination path EnteredPath := ActiveFrame.Path[FileSourceIndex, PathIndex] + EnteredPath; end; end; end; // Target file source is valid if Assigned(TargetFileSource) then begin GetDestinationPathAndMask(SourceFiles, TargetFileSource, EnteredPath, BaseDir, DestPath, DestMask); end; end; procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var ShiftEx : TShiftState; CmdText : UTF8String; begin // Either left or right panel has to be focused. if not FrameLeft.Focused and not FrameRight.Focused then begin Exit; end; ShiftEx := GetKeyShiftStateEx; case Key of VK_BACK: if (GetKeyTypingAction(ShiftEx) = ktaCommandLine) and (edtCommand.Text <> '') then begin // Delete last character. CmdText := edtCommand.Text; UTF8Delete(CmdText, UTF8Length(CmdText), 1); edtCommand.Text := CmdText; edtCommand.SetFocus; edtCommand.SelStart := UTF8Length(edtCommand.Text) + 1; Key := 0; end; VK_ESCAPE: if IsCommandLineVisible and (GetKeyTypingAction(ShiftEx) = ktaCommandLine) and (edtCommand.Text <> '') then begin edtCommand.Text := ''; Key := 0; end; VK_RETURN, VK_SELECT: if IsCommandLineVisible and (GetKeyTypingAction(ShiftEx) = ktaCommandLine) and (edtCommand.Text <> '') then begin // execute command line (in terminal with Shift) ExecuteCommandLine(Shift = [ssShift]); Key := 0; end; VK_SPACE: if (GetKeyTypingAction(ShiftEx) = ktaCommandLine) and (edtCommand.Text <> '') then begin TypeInCommandLine(' '); Key := 0; end; VK_TAB: begin // Select opposite panel. case PanelSelected of fpLeft: SetActiveFrame(fpRight); fpRight: SetActiveFrame(fpLeft); else SetActiveFrame(fpLeft); end; Key := 0; end; end; CheckCommandLine(ShiftEx, Key); end; procedure TfrmMain.pmToolBarPopup(Sender: TObject); var sText: String; sDir: String; bPaste: Boolean; ToolItem: TKASToolItem; Button: TKASToolButton; begin Button := TKASToolButton(pmToolBar.Tag); tbSeparator.Visible:= Assigned(Button); tbCut.Visible:= Assigned(Button); tbCopy.Visible:= Assigned(Button); tbChangeDir.Visible:= False; tbDelete.Visible:= Assigned(Button); if Assigned(Button) then begin ToolItem := Button.ToolItem; if ToolItem is TKASProgramItem then begin sDir := TKASProgramItem(ToolItem).StartPath; sDir:= PrepareParameter(sDir, FrameLeft, FrameRight, ActiveFrame, [ppoNormalizePathDelims, ppoReplaceTilde]); tbChangeDir.Caption := 'CD ' + sDir; tbChangeDir.Visible := True; end; end; sText:= Clipboard.AsText; bPaste:= StrBegins(sText, DCToolItemClipboardHeader) or StrBegins(sText, DCToolbarClipboardHeader) or StrBegins(sText, TCToolbarClipboardHeader); if bPaste then tbSeparator.Visible:= True; tbPaste.Visible:= bPaste; end; procedure TfrmMain.pnlLeftResize(Sender: TObject); begin if gDriveBar1 and gDriveBar2 and not gHorizontalFilePanels then pnlDskLeft.Width := pnlNotebooks.Width - pnlRight.Width; // Put splitter after left panel. if not gHorizontalFilePanels then begin MainSplitter.Left := pnlLeft.Width; MainSplitter.Top := pnlLeft.Top; MainSplitter.Height := pnlLeft.Height; MainSplitter.Width := 3; end else begin MainSplitter.Top := pnlLeft.Height; MainSplitter.Left := pnlLeft.Left; MainSplitter.Width := pnlLeft.Width; MainSplitter.Height := 3; end; end; procedure TfrmMain.pnlLeftRightDblClick(Sender: TObject); var APanel: TPanel; APoint: TPoint; FileViewNotebook: TFileViewNotebook; begin if Sender is TPanel then begin APanel := Sender as TPanel; if APanel = pnlLeft then begin APoint := FrameLeft.ClientToScreen(Classes.Point(0, FrameLeft.Top)); if Mouse.CursorPos.Y < APoint.Y then Commands.DoNewTab(nbLeft); end else if APanel = pnlRight then begin APoint := FrameRight.ClientToScreen(Classes.Point(0, FrameRight.Top)); if Mouse.CursorPos.Y < APoint.Y then Commands.DoNewTab(nbRight); end; end; if Sender is TFileViewNotebook then begin FileViewNotebook:= Sender as TFileViewNotebook; if FileViewNotebook.DoubleClickPageIndex < 0 then Commands.DoNewTab(FileViewNotebook) else Commands.DoCloseTab(FileViewNotebook, FileViewNotebook.DoubleClickPageIndex); end; end; procedure TfrmMain.pnlNotebooksResize(Sender: TObject); begin if not FResizingFilePanels then begin FResizingFilePanels := True; if not gHorizontalFilePanels then pnlLeft.Width := Round(Double(pnlNotebooks.Width - MainSplitter.Width) * FMainSplitterPos / 100.0) else pnlLeft.Height := Round(Double(pnlNotebooks.Height - MainSplitter.Height) * FMainSplitterPos / 100.0); FResizingFilePanels := False; end; end; procedure TfrmMain.pnlRightResize(Sender: TObject); begin if gDriveBar1 and not gHorizontalFilePanels then begin if gDriveBar2 then pnlDskRight.Width := pnlRight.Width + 1 else pnlDskRight.Width := pnlNotebooks.Width - 2; end; end; procedure TfrmMain.sboxDrivePaint(Sender: TObject); var pbxDrive: TPaintBox absolute Sender; FillPercentage: PtrInt; i: Integer; AColor, AColor2: TColor; ARect: TRect; begin FillPercentage:= pbxDrive.Tag; if FillPercentage <> -1 then begin pbxDrive.Canvas.Brush.Color:= clBlack; pbxDrive.Canvas.FrameRect(0, 0, pbxDrive.Width - 1, pbxDrive.Height - 1); ARect.Top := 1; ARect.Bottom := pbxDrive.Height - 2; if not gIndUseGradient then begin ARect.Left := 1; ARect.Right := 1 + FillPercentage * (pbxDrive.Width - 2) div 100; AColor := gIndForeColor; pbxDrive.Canvas.GradientFill(ARect, LightColor(AColor, 25), DarkColor(AColor, 25), gdVertical); ARect.Left := ARect.Right + 1; ARect.Right := pbxDrive.Width - 2; AColor := gIndBackColor; pbxDrive.Canvas.GradientFill(ARect, DarkColor(AColor, 25), LightColor(AColor, 25), gdVertical); end else begin ARect.Right := 1; for i := 0 to FillPercentage - 1 do begin if i <= 50 then AColor:= RGB(0 + 5 * i, 255, 0) else AColor:= RGB(255, 255 - 5 * (i - 50), 0); AColor2:= DarkColor(AColor, 50); ARect.Left := ARect.Right; ARect.Right := 1 + (i + 1) * (pbxDrive.Width - 2) div 100; pbxDrive.Canvas.GradientFill(ARect, AColor, AColor2, gdVertical); end; ARect.Left := ARect.Right; ARect.Right := pbxDrive.Width - 2; pbxDrive.Canvas.GradientFill(ARect, clSilver, clWhite, gdVertical); end; end; end; procedure TfrmMain.seLogWindowSpecialLineColors(Sender: TObject; Line: integer; var Special: boolean; var FG, BG: TColor); var LogMsgTypeObject: TObject; LogMsgType : TLogMsgType absolute LogMsgTypeObject; begin LogMsgTypeObject := seLogWindow.Lines.Objects[Line-1]; Special := True; case LogMsgType of lmtInfo: FG := clNavy; lmtSuccess: FG := clGreen; lmtError: FG := clRed else FG := clWindowText; end; end; function TfrmMain.FileViewBeforeChangePath(FileView: TFileView; NewFileSource: IFileSource; const NewPath: String): Boolean; var ANoteBook: TFileViewNotebook; Page, NewPage: TFileViewPage; PageAlreadyExists: Boolean = False; i: Integer; begin Result:= True; if FileView.NotebookPage is TFileViewPage then begin Page := FileView.NotebookPage as TFileViewPage; case Page.LockState of tlsPathLocked: Result := False; // do not change directory in this tab tlsDirsInNewTab: begin Result := False; // do not change directory in this tab if Assigned(NewFileSource) then begin ANoteBook := Page.Notebook; { TODO -oVG : add option to turn on/off this feature } for i := 0 to ANotebook.PageCount - 1 do begin NewPage := ANotebook.Page[i]; PageAlreadyExists := Assigned(NewPage.FileView) and mbCompareFileNames(NewPage.FileView.CurrentPath, NewPath); if PageAlreadyExists then Break; end; if not PageAlreadyExists then begin // Open in a new page, cloned view. NewPage := ANotebook.NewPage(Page.FileView); NewPage.FileView.AddFileSource(NewFileSource, NewPath); end; NewPage.MakeActive; end; end; end; end; end; procedure TfrmMain.FileViewAfterChangePath(FileView: TFileView); var ANoteBook : TFileViewNotebook; Page: TFileViewPage; begin if FileView.NotebookPage is TFileViewPage then begin Page := FileView.NotebookPage as TFileViewPage; ANoteBook := Page.Notebook; if Page.IsActive then begin if Assigned(FileView.FileSource) then begin if FileView.FileSource.IsClass(TFileSystemFileSource) then begin if glsDirHistory.IndexOf(FileView.CurrentPath) = -1 then glsDirHistory.Insert(0, FileView.CurrentPath); end; UpdateSelectedDrive(ANoteBook); UpdatePrompt; end; // Update page hint ANoteBook.Hint := FileView.CurrentPath; end; {if (fspDirectAccess in FileView.FileSource.GetProperties) then begin if gTermWindow and Assigned(Cons) then Cons.Terminal.SetCurrentDir(FileView.CurrentPath); end;} end; end; procedure TfrmMain.FileViewActivate(FileView: TFileView); var Page: TFileViewPage; begin if FileView.NotebookPage is TFileViewPage then begin Page := FileView.NotebookPage as TFileViewPage; PanelSelected := Page.Notebook.Side; UpdateSelectedDrive(Page.Notebook); UpdatePrompt; UpdateFreeSpace(Page.Notebook.Side); end; end; procedure TfrmMain.FileViewFilesChanged(FileView: TFileView); var Page: TFileViewPage; begin if FileView.NotebookPage is TFileViewPage then begin Page := FileView.NotebookPage as TFileViewPage; if Page.IsActive then begin UpdateFreeSpace(Page.Notebook.Side); end; end; end; procedure TfrmMain.SetActiveFrame(panel: TFilePanelSelect); begin PanelSelected:=panel; SetActiveFrame(ActiveFrame); end; procedure TfrmMain.SetActiveFrame(FileView: TFileView); begin FileView.SetFocus; if (fspDirectAccess in FileView.FileSource.GetProperties) then begin if gTermWindow and Assigned(Cons) then Cons.Terminal.SetCurrentDir(FileView.CurrentPath); end; end; function CompareDrives(Item1, Item2: Pointer): Integer; begin Result := CompareText(PDrive(Item1)^.DisplayName, PDrive(Item2)^.DisplayName); end; procedure TfrmMain.UpdateDiskCount; var I: Integer; Drive: PDrive; begin DrivesList.Free; DrivesList := TDriveWatcher.GetDrivesList; DrivesList.Sort(@CompareDrives); { Delete drives that in drives black list } for I:= DrivesList.Count - 1 downto 0 do begin Drive := DrivesList[I]; if (gDriveBlackListUnmounted and not Drive^.IsMounted) or MatchesMaskList(Drive^.Path, gDriveBlackList) or MatchesMaskList(Drive^.DeviceId, gDriveBlackList) then DrivesList.Remove(I); end; // create drives drop down menu FDrivesListPopup.UpdateDrivesList(DrivesList); // create drives left/right panels if gDriveBar1 then begin CreateDiskPanel(dskRight); if gDriveBar2 then CreateDiskPanel(dskLeft); end; dskLeft.AddToolItemExecutor(TKASDriveItem, @LeftDriveBarExecuteDrive); dskRight.AddToolItemExecutor(TKASDriveItem, @RightDriveBarExecuteDrive); end; procedure TfrmMain.AddVirtualDriveButton(dskPanel: TKASToolBar); const btnCaption = PathDelim + PathDelim; var bmpBitmap: TBitmap; ToolItem: TKASNormalItem; Button: TKASToolButton; begin (*virtual drive button*) ToolItem := TKASNormalItem.Create; ToolItem.Hint := actOpenVirtualFileSystemList.Caption; ToolItem.Text := btnCaption; Button := dskPanel.AddButton(ToolItem); bmpBitmap:= PixMapManager.GetVirtualDriveIcon(dskPanel.GlyphSize, clBtnFace); try Button.Glyph.Assign(bmpBitmap); Button.GroupIndex := 0; Button.Layout := blGlyphLeft; Button.OnClick:= @btnVirtualDriveClick; finally bmpBitmap.Free; end; end; procedure TfrmMain.AddSpecialButtons(dskPanel: TKASToolBar); procedure AddItem(FromButton: TSpeedButton); var Button: TKASToolButton; ToolItem: TKASNormalItem; begin ToolItem := TKASNormalItem.Create; ToolItem.Text := FromButton.Caption; ToolItem.Hint := FromButton.Hint; Button := dskPanel.AddButton(ToolItem); Button.GroupIndex := 0; end; begin AddItem(btnLeftRoot); AddItem(btnLeftUp); AddItem(btnLeftHome); end; procedure TfrmMain.CreateDiskPanel(dskPanel: TKASToolBar); var I, Count: Integer; Drive : PDrive; BitmapTmp: Graphics.TBitmap; ToolItem: TKASDriveItem; Button: TKASToolButton; begin dskPanel.BeginUpdate; try dskPanel.Clear; dskPanel.Flat := gDriveBarFlat; Count := DrivesList.Count - 1; for I := 0 to Count do begin Drive := DrivesList.Items[I]; ToolItem := TKASDriveItem.Create; ToolItem.Drive := Drive; ToolItem.Text := Drive^.DisplayName; ToolItem.Hint := GetDriveLabelOrStatus(Drive); Button := dskPanel.AddButton(ToolItem); // Set drive icon. BitmapTmp := PixMapManager.GetDriveIcon(Drive, dskPanel.GlyphSize, clBtnFace); Button.Glyph.Assign(BitmapTmp); FreeAndNil(BitmapTmp); {Set Buttons Transparent. Is need? } Button.Glyph.Transparent := True; Button.Transparent := True; {/Set Buttons Transparent} Button.Layout := blGlyphLeft; end; // for // Add virtual drive button AddVirtualDriveButton(dskPanel); // Add special buttons if not gDrivesListButton then AddSpecialButtons(dskPanel); finally dskPanel.EndUpdate; end; end; function TfrmMain.CreateFileView(sType: String; Page: TFileViewPage; AConfig: TIniFileEx; ASectionName: String; ATabIndex: Integer): TFileView; var FileViewFlags: TFileViewFlags = []; begin // This function should be changed to a separate TFileView factory. if gDelayLoadingTabs then FileViewFlags := [fvfDelayLoadingFiles]; if sType = 'columns' then Result := TColumnsFileView.Create(Page, AConfig, ASectionName, ATabIndex, FileViewFlags) else raise Exception.Create('Invalid file view type'); end; function TfrmMain.CreateFileView(sType: String; Page: TFileViewPage; AConfig: TXmlConfig; ANode: TXmlNode): TFileView; var FileViewFlags: TFileViewFlags = []; begin // This function should be changed to a separate TFileView factory. if gDelayLoadingTabs then FileViewFlags := [fvfDelayLoadingFiles]; if sType = 'columns' then {$IFDEF COLUMNSFILEVIEW_VTV} Result := TColumnsFileViewVTV.Create(Page, AConfig, ANode, FileViewFlags) {$ELSE} Result := TColumnsFileView.Create(Page, AConfig, ANode, FileViewFlags) {$ENDIF} else if sType = 'brief' then Result := TBriefFileView.Create(Page, AConfig, ANode, FileViewFlags) else if sType = 'thumbnails' then Result := TThumbFileView.Create(Page, AConfig, ANode, FileViewFlags) else raise Exception.Create('Invalid file view type'); end; procedure TfrmMain.AssignEvents(AFileView: TFileView); begin with AFileView do begin OnBeforeChangePath := @FileViewBeforeChangePath; OnAfterChangePath := @FileViewAfterChangePath; OnActivate := @FileViewActivate; OnFileListChanged := @FileViewFilesChanged; end; end; function TfrmMain.RemovePage(ANoteBook: TFileViewNotebook; iPageIndex:Integer; CloseLocked: Boolean): LongInt; begin Result:= -1; if (ANoteBook.PageCount > 1) and (iPageIndex >= 0) and (iPageIndex < ANoteBook.PageCount) then begin if ANoteBook.Page[iPageIndex].LockState <> tlsNormal then begin if CloseLocked then case msgYesNoCancel(Format(rsMsgCloseLockedTab, [ANoteBook.Page[iPageIndex].Caption])) of mmrNo: Exit(1); mmrCancel, mmrNone: Exit(2); end else Exit(1); end; ANoteBook.RemovePage(iPageIndex); Result:= 0; end; end; procedure TfrmMain.ReLoadTabs(ANoteBook: TFileViewNotebook); var I : Integer; begin for I := 0 to ANoteBook.PageCount - 1 do begin ANoteBook.View[I].UpdateView; end; end; procedure TfrmMain.LoadTabsIni(ANoteBook: TFileViewNotebook); var I: Integer; sIndex, TabsSection: String; sCurrentDir, sPath: String; iActiveTab: Integer; Page: TFileViewPage; AFileView: TFileView; aFileSource: IFileSource; begin if ANoteBook = nbLeft then begin TabsSection:= 'lefttabs'; end else begin TabsSection:= 'righttabs'; end; I:= 0; sIndex:= '0'; // create one tab in any way sCurrentDir:= mbGetCurrentDir; // default path sPath:= gIni.ReadString(TabsSection, sIndex + '_path', sCurrentDir); while True do begin sPath := GetDeepestExistingPath(sPath); if sPath = EmptyStr then sPath := sCurrentDir; Page := ANoteBook.AddPage; aFileSource := TFileSystemFileSource.GetFileSource; AFileView := CreateFileView('columns', Page, gIni, TabsSection, StrToInt(sIndex)); if not Assigned(AFileView) then begin ANoteBook.RemovePage(Page); continue; end; Page.LockState := TTabLockState(gIni.ReadInteger(TabsSection, sIndex + '_options', Integer(tlsNormal))); Page.LockPath := sPath; AFileView.AddFileSource(aFileSource, sPath); // Assign events after loading file source. AssignEvents(AFileView); Inc(I); // get page index in string representation sIndex:= IntToStr(I); // get path of next tab sPath:= gIni.ReadString(TabsSection, sIndex + '_path', ''); // if not found then break if sPath = '' then Break; end; // read active tab index iActiveTab:= gIni.ReadInteger(TabsSection, 'activetab', 0); // set active tab if (iActiveTab >= 0) and (iActiveTab < ANoteBook.PageCount) then ANoteBook.PageIndex := iActiveTab; end; procedure TfrmMain.LoadTabsXml(ANoteBook: TFileViewNotebook); var sPath, sViewType: String; iActiveTab: Integer; Page: TFileViewPage; AFileView: TFileView; AFileViewFlags: TFileViewFlags; aFileSource: IFileSource; RootNode, TabNode, ViewNode: TXmlNode; begin if ANoteBook = nbLeft then RootNode := gConfig.FindNode(gConfig.RootNode, 'Tabs/OpenedTabs/Left') else RootNode := gConfig.FindNode(gConfig.RootNode, 'Tabs/OpenedTabs/Right'); if Assigned(RootNode) then begin TabNode := RootNode.FirstChild; while Assigned(TabNode) do begin if TabNode.CompareName('Tab') = 0 then begin Page := nil; AFileView := nil; ViewNode := gConfig.FindNode(TabNode, 'FileView', False); if Assigned(ViewNode) then begin // File view has its own configuration. if gConfig.TryGetAttr(ViewNode, 'Type', sViewType) then begin Page := ANoteBook.AddPage; Page.LoadConfiguration(gConfig, TabNode); AFileView := CreateFileView(sViewType, Page, gConfig, ViewNode); end else DCDebug('File view type not specified in configuration: ' + gConfig.GetPathFromNode(ViewNode) + '.'); end // Else try old configuration. else if gConfig.TryGetValue(TabNode, 'Path', sPath) then begin sPath := GetDeepestExistingPath(sPath); if sPath <> EmptyStr then begin Page := ANoteBook.AddPage; Page.LoadConfiguration(gConfig, TabNode); AFileView := CreateFileView('columns', Page, gConfig, TabNode); AFileView.AddFileSource(TFileSystemFileSource.GetFileSource, sPath); end; end else DCDebug('Invalid entry in configuration: ' + gConfig.GetPathFromNode(TabNode) + '.'); if Assigned(Page) then begin if (not Assigned(AFileView)) or (AFileView.FileSourcesCount = 0) then begin ANoteBook.RemovePage(Page); end else begin if (Page.LockState in [tlsPathLocked, tlsPathResets, tlsDirsInNewTab]) and (Page.LockPath = '') then Page.LockPath := AFileView.CurrentPath; // Assign events after loading file source. AssignEvents(AFileView); end; end; end; TabNode := TabNode.NextSibling; end; end; // Create at least one tab. if ANoteBook.PageCount = 0 then begin Page := ANoteBook.AddPage; aFileSource := TFileSystemFileSource.GetFileSource; if gDelayLoadingTabs then AFileViewFlags := [fvfDelayLoadingFiles] else AFileViewFlags := []; AFileView := TColumnsFileView.Create(Page, aFileSource, mbGetCurrentDir, AFileViewFlags); AssignEvents(AFileView); end else if Assigned(RootNode) then begin // read active tab index iActiveTab := gConfig.GetValue(RootNode, 'ActiveTab', 0); // set active tab if (iActiveTab >= 0) and (iActiveTab < ANoteBook.PageCount) then begin if ANoteBook.PageIndex = iActiveTab then nbPageChanged(ANoteBook) else ANoteBook.PageIndex := iActiveTab; end; end; end; procedure TfrmMain.SaveTabsXml(ANoteBook: TFileViewNotebook); var I: Integer; TabsSection: String; Page: TFileViewPage; RootNode, TabNode, ViewNode: TXmlNode; begin RootNode := gConfig.FindNode(gConfig.RootNode, 'Tabs/OpenedTabs', True); if ANoteBook = nbLeft then TabsSection := 'Left' else TabsSection := 'Right'; RootNode := gConfig.FindNode(RootNode, TabsSection, True); gConfig.ClearNode(RootNode); gConfig.AddValue(RootNode, 'ActiveTab', ANoteBook.PageIndex); for I:= 0 to ANoteBook.PageCount - 1 do begin TabNode := gConfig.AddNode(RootNode, 'Tab'); ViewNode := gConfig.AddNode(TabNode, 'FileView'); Page := ANoteBook.Page[I]; Page.SaveConfiguration(gConfig, TabNode); Page.FileView.SaveConfiguration(gConfig, ViewNode); end; end; (* Execute internal or external command *) function TfrmMain.ExecCmd(Cmd: String; Param: String=''; StartPath: String=''): Boolean; begin // For Command only replace environment variables and tilde. Cmd := ReplaceEnvVars(ReplaceTilde(Cmd)); Param := PrepareParameter(Param, FrameLeft, FrameRight, ActiveFrame); if Commands.Commands.ExecuteCommand(Cmd, [Param]) = cfrSuccess then Result:= True else begin StartPath := PrepareParameter(StartPath, FrameLeft, FrameRight, ActiveFrame, [ppoNormalizePathDelims, ppoReplaceTilde]); // Only add a space after command if there are parameters. if Length(Param) > 0 then Param := ' ' + Param; if StartPath <> '' then mbSetCurrentDir(StartPath); try Result:= ExecCmdFork(Format('"%s"%s', [Cmd, Param])); except on e: EInvalidCommandLine do begin MessageDlg(rsMsgInvalidCommandLine, rsMsgInvalidCommandLine + ': ' + e.Message, mtError, [mbOK], 0); Result := False; end; end; end; end; procedure TfrmMain.ToggleConsole; begin if gTermWindow then begin if not Assigned(cmdConsole) then begin cmdConsole:= TCmdBox.Create(pgConsole); cmdConsole.Parent:= pgConsole; cmdConsole.Align:= alClient; cmdConsole.AutoFollow:= True; cmdConsole.LineCount:= 256; end; if not Assigned(Cons) then begin Cons:= CreateConsoleThread; Cons.ColsCount:= 80; Cons.RowsCount:= cmdConsole.LineCount; Cons.CmdBox:= cmdConsole; Cons.Start; end; end else begin if Assigned(cmdConsole) then begin cmdConsole.Hide; FreeAndNil(cmdConsole); end; FreeAndNil(Cons); end; nbConsole.Visible:= gTermWindow; ConsoleSplitter.Visible:= gTermWindow; end; procedure TfrmMain.ToolbarExecuteCommand(ToolItem: TKASToolItem); var CommandItem: TKASCommandItem; begin if not Draging then begin CommandItem := ToolItem as TKASCommandItem; Commands.Commands.ExecuteCommand(CommandItem.Command, CommandItem.Params); end; Draging := False; end; procedure TfrmMain.ToolbarExecuteProgram(ToolItem: TKASToolItem); var ProgramItem: TKASProgramItem; begin if not Draging then begin ProgramItem := ToolItem as TKASProgramItem; ExecCmd(ProgramItem.Command, ProgramItem.Params, ProgramItem.StartPath); end; Draging := False; end; procedure TfrmMain.UpdateWindowView; procedure UpdateNoteBook(NoteBook: TFileViewNotebook); var I: Integer; begin NoteBook.ShowTabs := ((NoteBook.PageCount > 1) or (tb_always_visible in gDirTabOptions)) and gDirectoryTabs; if tb_show_close_button in gDirTabOptions then begin NoteBook.Options := NoteBook.Options + [nboShowCloseButtons]; end else begin NoteBook.Options := NoteBook.Options - [nboShowCloseButtons]; end; if nbcMultiline in NoteBook.GetCapabilities then NoteBook.MultiLine := tb_multiple_lines in gDirTabOptions; case gDirTabPosition of tbpos_top: NoteBook.TabPosition := tpTop; tbpos_bottom: NoteBook.TabPosition := tpBottom; else NoteBook.TabPosition := tpTop; end; if FInitializedView then begin for I := 0 to NoteBook.PageCount - 1 do // change on all tabs NoteBook.View[I].UpdateView; end; end; procedure AnchorHorizontalBetween(AControl, ALeftSibling, ARightSibling: TControl); begin AControl.Anchors := AControl.Anchors + [akLeft, akRight]; AControl.AnchorSide[akLeft].Control := ALeftSibling; AControl.AnchorSide[akLeft].Side := asrRight; AControl.AnchorSide[akRight].Control := ARightSibling; AControl.AnchorSide[akRight].Side := asrLeft; end; procedure AnchorHorizontal(AControl, ASibling: TControl); begin AControl.Anchors := AControl.Anchors + [akLeft, akRight]; AControl.AnchorSide[akLeft].Control := ASibling; AControl.AnchorSide[akLeft].Side := asrLeft; AControl.AnchorSide[akRight].Control := ASibling; AControl.AnchorSide[akRight].Side := asrRight; end; procedure AnchorFreeSpace(LeftControl, RightControl: TControl; ExcludeVert: Boolean); begin if gDrivesListButton then begin AnchorHorizontalBetween(LeftControl, btnLeftDrive, btnLeftDirectoryHotlist); AnchorHorizontalBetween(RightControl, btnRightDrive, btnRightDirectoryHotlist); if not ExcludeVert then begin LeftControl.AnchorVerticalCenterTo(pnlLeftTools); RightControl.AnchorVerticalCenterTo(pnlRightTools); end; end else begin AnchorHorizontal(LeftControl, pnlLeftTools); AnchorHorizontal(RightControl, pnlRightTools); if not ExcludeVert then begin LeftControl.AnchorSide[akTop].Control := pnlLeftTools; LeftControl.AnchorSide[akTop].Side := asrTop; RightControl.AnchorSide[akTop].Control := pnlRightTools; RightControl.AnchorSide[akTop].Side := asrTop; end; end; end; var I: Integer; HMForm: THMForm; FunButton: TSpeedButton; Hotkey: THotkey; begin DisableAutoSizing; try if gHorizontalFilePanels then begin pnlLeft.Align := alTop; pnlLeft.BorderSpacing.Right := 0; pnlLeft.BorderSpacing.Bottom := 3; MainSplitter.Cursor := crVSplit; end else begin pnlLeft.Align := alLeft; pnlLeft.BorderSpacing.Right := 3; pnlLeft.BorderSpacing.Bottom := 0; MainSplitter.Cursor := crHSplit; end; (* Disk Panels *) if gHorizontalFilePanels and gDriveBar1 and gDriveBar2 then begin dskLeft.Parent := pnlDiskLeftInner; dskRight.Parent := pnlDiskRightInner; end else begin dskLeft.Parent := pnlDskLeft; dskRight.Parent := pnlDskRight; end; pnlDiskLeftInner.Visible := gHorizontalFilePanels and gDriveBar1 and gDriveBar2; pnlDiskRightInner.Visible := gHorizontalFilePanels and gDriveBar1 and gDriveBar2; pnlDskLeft.Visible := not gHorizontalFilePanels and gDriveBar1 and gDriveBar2; pnlDskRight.Visible := gDriveBar1 and (not gHorizontalFilePanels or not gDriveBar2); pnlDisk.Visible := pnlDskLeft.Visible or pnlDskRight.Visible; // Create disk panels after assigning parent. UpdateDiskCount; // Update list of showed drives (*/ Disk Panels *) FDrivesListPopup.UpdateView; (*Main menu*) Commands.DoShowMainMenu(gMainMenu); (*Tool Bar*) MainToolBar.Visible:= gButtonBar; if gButtonBar then begin MainToolBar.Flat:= gToolBarFlat; MainToolBar.GlyphSize:= gToolBarIconSize; MainToolBar.SetButtonSize(gToolBarButtonSize, gToolBarButtonSize); MainToolBar.ChangePath:= gpExePath; MainToolBar.EnvVar:= '%commander_path%'; LoadMainToolbar; end; btnLeftDrive.Visible := gDrivesListButton; btnLeftDrive.Flat := gInterfaceFlat; btnLeftRoot.Visible := gDrivesListButton; btnLeftRoot.Flat := gInterfaceFlat; btnLeftUp.Visible := gDrivesListButton; btnLeftUp.Flat := gInterfaceFlat; btnLeftHome.Visible := gDrivesListButton; btnLeftHome.Flat := gInterfaceFlat; btnLeftDirectoryHotlist.Visible := gDrivesListButton; btnLeftDirectoryHotlist.Flat := gInterfaceFlat; btnLeftEqualRight.Visible := gDrivesListButton; btnLeftEqualRight.Flat:= gInterfaceFlat; lblLeftDriveInfo.Visible:= gDriveFreeSpace; pbxLeftDrive.Visible := gDriveInd; pnlLeftTools.Visible:= gDrivesListButton or gDriveFreeSpace or gDriveInd; pnlLeftTools.DoubleBuffered := True; btnRightDrive.Visible := gDrivesListButton; btnRightDrive.Flat := gInterfaceFlat; btnRightRoot.Visible := gDrivesListButton; btnRightRoot.Flat := gInterfaceFlat; btnRightUp.Visible := gDrivesListButton; btnRightUp.Flat := gInterfaceFlat; btnRightHome.Visible := gDrivesListButton;; btnRightHome.Flat := gInterfaceFlat; btnRightDirectoryHotlist.Visible := gDrivesListButton; btnRightDirectoryHotlist.Flat := gInterfaceFlat; btnRightEqualLeft.Visible := gDrivesListButton; btnRightEqualLeft.Flat:= gInterfaceFlat; lblRightDriveInfo.Visible:= gDriveFreeSpace; pbxRightDrive.Visible := gDriveInd; pnlRightTools.Visible:= gDrivesListButton or gDriveFreeSpace or gDriveInd; pnlRightTools.DoubleBuffered := True; // Free space indicator. if gDriveFreeSpace then begin AnchorFreeSpace(lblLeftDriveInfo, lblRightDriveInfo, gDriveInd); if gDriveInd then begin lblLeftDriveInfo.AnchorSide[akTop].Side := asrTop; lblRightDriveInfo.AnchorSide[akTop].Side := asrTop; end; end; // Drive free space indicator if gDriveInd then begin AnchorFreeSpace(pbxLeftDrive, pbxRightDrive, gDriveFreeSpace); if gDriveFreeSpace then begin pbxLeftDrive.AnchorSide[akTop].Control := lblLeftDriveInfo; pbxLeftDrive.AnchorSide[akTop].Side := asrBottom; pbxRightDrive.AnchorSide[akTop].Control := lblRightDriveInfo; pbxRightDrive.AnchorSide[akTop].Side := asrBottom; end; end; // Operations panel and menu if (gPanelOfOp = False) then FreeAndNil(FOperationsPanel) else begin FOperationsPanel := TOperationsPanel.Create(Self); FOperationsPanel.Parent := PanelAllProgress; FOperationsPanel.DoubleBuffered := True; PanelAllProgress.OnResize := @FOperationsPanel.ParentResized; end; PanelAllProgress.Visible := gPanelOfOp; Timer.Enabled := gPanelOfOp or gProgInMenuBar; // Log window seLogWindow.Visible := gLogWindow; LogSplitter.Visible := gLogWindow; // Align log window seLogWindow.Top := 0; LogSplitter.Top := 0; FontOptionsToFont(gFonts[dcfLog], seLogWindow.Font); // Command line pnlCommand.Visible := gCmdLine; // Align command line and terminal window pnlCommand.Top := -Height; ConsoleSplitter.Top:= -Height; ToggleConsole; // Function keys pnlKeys.Visible := gKeyButtons; if gKeyButtons then begin pnlKeys.Height := Canvas.TextHeight('Wg') + 4; pnlKeys.Top:= Height * 2; HMForm := HotMan.Forms.Find('Main'); for I := 0 to pnlKeys.ControlCount - 1 do begin if pnlKeys.Controls[I] is TSpeedButton then begin FunButton := pnlKeys.Controls[I] as TSpeedButton; FunButton.Flat := gInterfaceFlat; if Assigned(HMForm) then begin Hotkey := HMForm.Hotkeys.FindByCommand(FunctionButtonsCaptions[I].ACommand); if Assigned(Hotkey) then FunButton.Caption := FunctionButtonsCaptions[I].ACaption + ' ' + ShortcutsToText(Hotkey.Shortcuts); end; end; end; end; UpdateNoteBook(nbLeft); UpdateNoteBook(nbRight); if FInitializedView then begin UpdateSelectedDrives; UpdateFreeSpace(fpLeft); UpdateFreeSpace(fpRight); end; UpdateActionIcons; ShowTrayIcon(gAlwaysShowTrayIcon); FInitializedView := True; finally EnableAutoSizing; end; end; procedure TfrmMain.edtCommandKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if not edtCommand.DroppedDown and ((Key=VK_UP) or (Key=VK_DOWN)) then begin ActiveFrame.SetFocus; Key:= 0; end else if edtCommand.DroppedDown and (Key in [VK_RETURN, VK_SELECT, VK_ESCAPE]) then begin edtCommand.DroppedDown := False; Key := 0; end else case Key of VK_ESCAPE: begin if edtCommand.Text <> '' then edtCommand.Text := '' else ActiveFrame.SetFocus; Key := 0; end; VK_RETURN, VK_SELECT: begin if (Shift * [ssCtrl, ssAlt, ssMeta, ssAltGr] = []) then begin ExecuteCommandLine(ssShift in Shift); Key := 0; end; end; VK_TAB: begin ActiveFrame.SetFocus; Key := 0; end; VK_PAUSE: begin if gTermWindow and Assigned(Cons) then Cons.Terminal.SendBreak_pty(); end; end; CheckCommandLine(GetKeyShiftStateEx, Key); end; procedure TfrmMain.edtCommandExit(Sender: TObject); begin // Hide command line if it was temporarily shown. if (not gCmdLine) and IsCommandLineVisible then pnlCommand.Hide; end; procedure TfrmMain.tbChangeDirClick(Sender: TObject); var sDir: String; ToolItem: TKASToolItem; Button: TKASToolButton; begin Button := TKASToolButton(pmToolBar.Tag); if Assigned(Button) then begin ToolItem := Button.ToolItem; if ToolItem is TKASProgramItem then begin sDir := TKASProgramItem(ToolItem).StartPath; sDir := PrepareParameter(sDir, FrameLeft, FrameRight, ActiveFrame, [ppoNormalizePathDelims, ppoReplaceTilde]); Commands.cm_ChangeDir([sDir]); end; end; end; procedure TfrmMain.tbCopyClick(Sender: TObject); var ToolItem: TKASToolItem; ItemClone: TKASToolItem = nil; Serializer: TKASToolBarSerializer = nil; Stream: TStringStream = nil; Button: TKASToolButton; begin Button := TKASToolButton(pmToolBar.Tag); if Assigned(Button) then try ToolItem := Button.ToolItem; // Create a copy so that ID of the button is different. if Sender = tbCopy then begin ItemClone := ToolItem.Clone; ToolItem := ItemClone; end; Stream := TStringStream.Create(''); Stream.WriteString(DCToolItemClipboardHeader); Serializer := TKASToolBarSerializer.Create; Serializer.Serialize(Stream, ToolItem); Clipboard.SetFormat(PredefinedClipboardFormat(pcfText), Stream); if Sender = tbCut then MainToolBar.RemoveButton(Button); SaveMainToolBar; finally ItemClone.Free; Serializer.Free; Stream.Free; end; end; procedure TfrmMain.tbEditClick(Sender: TObject); begin EditToolbarButton(TKASToolButton(pmToolBar.Tag)); end; procedure TfrmMain.OnUniqueInstanceMessage(Sender: TObject; Params: TCommandLineParams); begin if HiddenToTray then RestoreFromTray else begin WindowState:= lastWindowState; BringToFront; end; LoadTabsCommandLine(Params); if Params.ActiveRight then SetActiveFrame(fpRight) else SetActiveFrame(fpLeft); end; procedure TfrmMain.tbPasteClick(Sender: TObject); var Data: TStringList = nil; ProgramItem: TKASProgramItem; ToolItem: TKASToolItem; Loader: TKASToolBarLoader = nil; Serializer: TKASToolBarSerializer = nil; Stream: TStringStream = nil; Pasted: Boolean = False; Button: TKASToolButton; begin Stream := TStringStream.Create(''); if Clipboard.GetFormat(PredefinedClipboardFormat(pcfText), Stream) then try Button := TKASToolButton(pmToolBar.Tag); // Cut any trailing zeros. while Stream.DataString[Length(Stream.DataString)] = #0 do Stream.Size := Stream.Size - 1; if StrBegins(Stream.DataString, TCToolbarClipboardHeader) or StrBegins(Stream.DataString, DCToolbarClipboardHeader) then begin Data:= TStringList.Create; Data.Text:= Stream.DataString; if Data.Count < 6 then Exit; if (Data[0] = TCToolbarClipboardHeader) or (Data[0] = DCToolbarClipboardHeader) then begin ProgramItem := TKASProgramItem.Create; ProgramItem.Command := Data[1]; ProgramItem.Params := Data[2]; ProgramItem.Icon := Data[3]; ProgramItem.Hint := Data[4]; ProgramItem.StartPath := Data[5]; MainToolBar.InsertButton(Button, ProgramItem); SaveMainToolBar; Pasted := True; end; end else if StrBegins(Stream.DataString, DCToolItemClipboardHeader) then begin Stream.Position := Length(DCToolItemClipboardHeader); Serializer := TKASToolBarSerializer.Create; Loader := TKASToolBarExtendedLoader.Create(Commands.Commands); try ToolItem := Serializer.Deserialize(Stream, Loader); MainToolBar.InsertButton(Button, ToolItem); SaveMainToolBar; Pasted := True; except on EXMLReadError do; end; end; if not Pasted then MessageDlg(Application.Title, rsClipboardContainsInvalidToolbarData, mtWarning, [mbOK], 0); finally Data.Free; Loader.Free; Serializer.Free; Stream.Free; end; end; procedure TfrmMain.CheckCommandLine(ShiftEx: TShiftState; var Key: Word); var ModifierKeys: TShiftState; UTF8Char: TUTF8Char; KeyTypingModifier: TKeyTypingModifier; begin for KeyTypingModifier in TKeyTypingModifier do begin if gKeyTyping[KeyTypingModifier] = ktaCommandLine then begin ModifierKeys := TKeyTypingModifierToShift[KeyTypingModifier]; if ((ModifierKeys <> []) and (ShiftEx * KeyModifiersShortcutNoText = ModifierKeys)) {$IFDEF MSWINDOWS} // Allow entering international characters with Ctrl+Alt on Windows, // if there is no action for Ctrl+Alt and command line typing has no modifiers. or (HasKeyboardAltGrKey and (ShiftEx * KeyModifiersShortcutNoText = [ssCtrl, ssAlt]) and (gKeyTyping[ktmCtrlAlt] = ktaNone) and (gKeyTyping[ktmNone] = ktaCommandLine)) {$ENDIF} then begin if (Key <> VK_SPACE) or (edtCommand.Text <> '') then begin UTF8Char := VirtualKeyToUTF8Char(Key, ShiftEx - ModifierKeys); if (UTF8Char <> '') and (not ((Length(UTF8Char) = 1) and (UTF8Char[1] in [#0..#31]))) then begin TypeInCommandLine(UTF8Char); Key := 0; end; end; end; Break; end; end; end; function TfrmMain.ExecuteCommandFromEdit(sCmd: String; bRunInTerm: Boolean): Boolean; var iIndex: Integer; sDir: String; Operation: TFileSourceExecuteOperation = nil; aFile: TFile = nil; begin Result:= True; InsertFirstItem(sCmd, edtCommand); // only cMaxStringItems(see uGlobs.pas) is stored if edtCommand.Items.Count>cMaxStringItems then edtCommand.Items.Delete(edtCommand.Items.Count-1); edtCommand.DroppedDown:= False; sCmd:= ReplaceEnvVars(sCmd); if (fspDirectAccess in ActiveFrame.FileSource.GetProperties) then begin iIndex:= Pos('cd ', sCmd); if (iIndex = 1) or (sCmd = 'cd') then begin if (iIndex <> 1) then sDir:= GetHomeDir else begin sDir:= RemoveQuotation(Copy(sCmd, iIndex + 3, Length(sCmd))); sDir:= NormalizePathDelimiters(Trim(sDir)); sDir:= ReplaceTilde(IncludeTrailingBackslash(sDir)); sDir:= GetAbsoluteFileName(ActiveFrame.CurrentPath, sDir); end; // Choose FileSource by path ChooseFileSource(ActiveFrame, sDir); if SameText(ExcludeBackPathDelimiter(ActiveFrame.CurrentPath), sDir) then begin if gTermWindow and Assigned(Cons) then Cons.Terminal.SetCurrentDir(sDir); end; end else begin if gTermWindow and Assigned(Cons) then Cons.Terminal.Write_pty(sCmd + sLineBreak) else begin try if bRunInTerm then ExecCmdFork(sCmd, True, gRunInTerm) else ExecCmdFork(sCmd); except on e: EInvalidCommandLine do MessageDlg(rsMsgInvalidCommandLine, rsMsgInvalidCommandLine + ': ' + e.Message, mtError, [mbOK], 0); end; end; end; end else begin aFile:= ActiveFrame.CloneActiveFile; if Assigned(aFile) then try sCmd:= 'quote' + #32 + sCmd; aFile.FullPath:= ActiveFrame.CurrentPath; Operation:= ActiveFrame.FileSource.CreateExecuteOperation( aFile, ActiveFrame.CurrentPath, sCmd) as TFileSourceExecuteOperation; if Assigned(Operation) then Operation.Execute; finally FreeThenNil(aFile); FreeThenNil(Operation); end; end; end; procedure TfrmMain.SetMainSplitterPos(AValue: Double); begin if (AValue >= 0) and (AValue <= 100) then FMainSplitterPos:= AValue; end; procedure TfrmMain.TypeInCommandLine(Str: String); begin Commands.cm_FocusCmdLine([]); edtCommand.Text := edtCommand.Text + Str; edtCommand.SelStart := UTF8Length(edtCommand.Text) + 1; end; //LaBero begin //Minimize the main window procedure TfrmMain.MinimizeWindow; begin Self.WindowState := wsMinimized; end; //LaBero end procedure TfrmMain.LoadTabs; begin if Assigned(gIni) then begin LoadTabsIni(nbLeft); LoadTabsIni(nbRight); end else begin LoadTabsXml(nbLeft); LoadTabsXml(nbRight); end; LoadTabsCommandLine(CommandLineParams); if gDelayLoadingTabs then begin // Load only the current active tab of each notebook. FrameLeft.Flags := FrameLeft.Flags - [fvfDelayLoadingFiles]; FrameRight.Flags := FrameRight.Flags - [fvfDelayLoadingFiles]; end; end; procedure TfrmMain.LoadTabsCommandLine(Params: TCommandLineParams); procedure AddTab(ANoteBook: TFileViewNotebook; aPath: UTF8String); var Page: TFileViewPage; AFileView: TFileView; AFileViewFlags: TFileViewFlags; aFileSource: IFileSource; begin Page := ANoteBook.AddPage; aFileSource := TFileSystemFileSource.GetFileSource; if gDelayLoadingTabs then AFileViewFlags := [fvfDelayLoadingFiles] else AFileViewFlags := []; AFileView := TColumnsFileView.Create(Page, aFileSource, aPath, AFileViewFlags); AssignEvents(AFileView); ANoteBook.PageIndex := ANoteBook.PageCount - 1; end; begin if Params.LeftPath[0] <> #0 then begin Params.LeftPath:= ReplaceEnvVars(ReplaceTilde(Params.LeftPath)); if not mbFileSystemEntryExists(Params.LeftPath) then Params.LeftPath:= GetDeepestExistingPath(Params.LeftPath); if Params.LeftPath[0] <> #0 then begin if Params.NewTab then AddTab(nbLeft, Params.LeftPath) else FrameLeft.CurrentPath:= Params.LeftPath; end; end; if Params.RightPath[0] <> #0 then begin Params.RightPath:= ReplaceEnvVars(ReplaceTilde(Params.RightPath)); if not mbFileSystemEntryExists(Params.RightPath) then Params.RightPath:= GetDeepestExistingPath(Params.RightPath); if Params.RightPath[0] <> #0 then begin if Params.NewTab then AddTab(nbRight, Params.RightPath) else FrameRight.CurrentPath:= Params.RightPath; end; end; if Params.ActiveRight then PanelSelected:= fpRight else PanelSelected:= fpLeft; end; procedure TfrmMain.LoadWindowState; var ANode: TXmlNode; begin (* Load window bounds and state *) if Assigned(gIni) then begin Left := gIni.ReadInteger('Configuration', 'Main.Left', 80); Top := gIni.ReadInteger('Configuration', 'Main.Top', 48); Width := gIni.ReadInteger('Configuration', 'Main.Width', 800); Height := gIni.ReadInteger('Configuration', 'Main.Height', 480); if gIni.ReadBool('Configuration', 'Maximized', True) then Self.WindowState := wsMaximized; end else begin ANode := gConfig.FindNode(gConfig.RootNode, 'MainWindow/Position'); if Assigned(ANode) then begin MainSplitterPos := gConfig.GetValue(ANode, 'Splitter', 50.0); Left := gConfig.GetValue(ANode, 'Left', 80); Top := gConfig.GetValue(ANode, 'Top', 48); Width := gConfig.GetValue(ANode, 'Width', 800); Height := gConfig.GetValue(ANode, 'Height', 480); if gConfig.GetValue(ANode, 'Maximized', True) then Self.WindowState := wsMaximized; end; end; end; procedure TfrmMain.SaveWindowState; var //x: Integer; ANode: TXmlNode; begin (* Save columns widths *) // Save columns settings for all colsets. { for x:=0 to ColSet.GetColumnSet(ActiveColm).ColumnsCount - 1 do ColSet.GetColumnSet(ActiveColm).SetColumnWidth(x, dgPanel.ColWidths[x]); ColSet.GetColumnSet(ActiveColm).Save(gIni); } (* Save all tabs *) SaveTabsXml(nbLeft); SaveTabsXml(nbRight); (* Save window bounds and state *) ANode := gConfig.FindNode(gConfig.RootNode, 'MainWindow/Position', True); // save window size only if it's not Maximized (for not break normal size) if (WindowState <> wsMaximized) then begin gConfig.SetValue(ANode, 'Left', Left); gConfig.SetValue(ANode, 'Top', Top); gConfig.SetValue(ANode, 'Width', Width); gConfig.SetValue(ANode, 'Height', Height); end; gConfig.SetValue(ANode, 'Maximized', (WindowState = wsMaximized)); gConfig.SetValue(ANode, 'Splitter', FMainSplitterPos); end; procedure TfrmMain.LoadMainToolbar; var ToolBarLoader: TKASToolBarExtendedLoader; ToolBarNode: TXmlNode; begin MainToolBar.BeginUpdate; ToolBarLoader := TKASToolBarExtendedLoader.Create(Commands.Commands); try MainToolBar.Clear; ToolBarNode := gConfig.FindNode(gConfig.RootNode, 'Toolbars/MainToolbar', False); if Assigned(ToolBarNode) then MainToolBar.LoadConfiguration(gConfig, ToolBarNode, ToolBarLoader); finally ToolBarLoader.Free; MainToolBar.EndUpdate; end; end; procedure TfrmMain.SaveMainToolBar; var ToolBarNode: TXmlNode; begin ToolBarNode := gConfig.FindNode(gConfig.RootNode, 'Toolbars/MainToolbar', True); gConfig.ClearNode(ToolBarNode); MainToolBar.SaveConfiguration(gConfig, ToolBarNode); end; function TfrmMain.IsCommandLineVisible: Boolean; begin Result := (edtCommand.Visible and pnlCommand.Visible); end; function TfrmMain.FindMatchingDrive(Path: UTF8String): Integer; var i : Integer; LongestPathLen: Integer = 0; DrivePath: UTF8String; DrivePathLen: PtrInt; begin Result := -1; if Assigned(DrivesList) then begin Path := UTF8UpperCase(Path); for i := 0 to DrivesList.Count - 1 do begin DrivePath := UTF8UpperCase(DrivesList[i]^.Path); DrivePathLen := UTF8Length(DrivePath); if (DrivePathLen > LongestPathLen) and IsInPath(DrivePath, Path, True, True) then begin LongestPathLen := DrivePathLen; Result := i; end; end; end; end; procedure TfrmMain.UpdateDriveToolbarSelection(DriveToolbar: TKAStoolBar; FileView: TFileView); var DriveIndex: Integer; begin DriveIndex := FindMatchingDrive(FileView.CurrentPath); if (DriveIndex >= 0) and (DriveIndex < DriveToolbar.ButtonCount) then DriveToolbar.Buttons[DriveIndex].Down := True else // Path not found in toolbar. DriveToolbar.UncheckAllButtons; end; procedure TfrmMain.UpdateDriveButtonSelection(DriveButton: TSpeedButton; FileView: TFileView); var BitmapTmp: Graphics.TBitmap = nil; DriveIndex: Integer; Drive: PDrive; begin if not gDrivesListButton then Exit; DriveIndex := FindMatchingDrive(FileView.CurrentPath); if DriveIndex >= 0 then begin Drive := DrivesList[DriveIndex]; DriveButton.Caption := Drive^.DisplayName; DriveButton.Tag := DriveIndex; BitmapTmp := PixMapManager.GetDriveIcon(Drive, 22, DriveButton.Color); end else begin DriveButton.Caption := ''; DriveButton.Tag := -1; if FileView.FileSource.IsClass(TArchiveFileSource) then BitmapTmp := PixMapManager.GetArchiveIcon(22, DriveButton.Color) else BitmapTmp := PixMapManager.GetDefaultDriveIcon(22, DriveButton.Color); end; DriveButton.Glyph := BitmapTmp; DriveButton.Width := DriveButton.Glyph.Width + DriveButton.Canvas.TextWidth(DriveButton.Caption) + 16; FreeAndNil(BitmapTmp); end; procedure TfrmMain.UpdateSelectedDrive(ANoteBook: TFileViewNotebook); var FileView: TFileView; begin FileView := ANoteBook.ActiveView; if Assigned(FileView) then begin // Change left drive toolbar for left drive button. if (ANoteBook = nbLeft) then begin if gDriveBar1 then // If drives toolbar enabled at all begin if gDriveBar2 then // If showing two toolbars UpdateDriveToolbarSelection(dskLeft, FileView) else // dskRight is the main toolbar. UpdateDriveToolbarSelection(dskRight, FileView); end; UpdateDriveButtonSelection(btnLeftDrive, FileView); end // Change right drive toolbar for right drive button else if (ANoteBook = nbRight) then begin if gDriveBar1 then UpdateDriveToolbarSelection(dskRight, FileView); UpdateDriveButtonSelection(btnRightDrive, FileView); end; end; end; procedure TfrmMain.UpdateSelectedDrives; begin if gDriveBar1 then begin if gDriveBar2 then begin UpdateDriveToolbarSelection(dskLeft, FrameLeft); UpdateDriveToolbarSelection(dskRight, FrameRight); end else // dskRight is the main toolbar. UpdateDriveToolbarSelection(dskRight, ActiveFrame); end; UpdateDriveButtonSelection(btnLeftDrive, FrameLeft); UpdateDriveButtonSelection(btnRightDrive, FrameRight); end; procedure TfrmMain.ShowDrivesList(APanel: TFilePanelSelect); var p: TPoint; ADriveIndex: Integer; begin if tb_activate_panel_on_click in gDirTabOptions then SetActiveFrame(APanel); case APanel of fpLeft: begin p := Classes.Point(btnLeftDrive.Left, btnLeftDrive.Height); p := pnlLeftTools.ClientToScreen(p); ADriveIndex := btnLeftDrive.Tag; end; fpRight: begin p := Classes.Point(btnRightDrive.Left, btnRightDrive.Height); p := pnlRightTools.ClientToScreen(p); ADriveIndex := btnRightDrive.Tag; end; end; p := ScreenToClient(p); FDrivesListPopup.Show(p, APanel, ADriveIndex); end; procedure TfrmMain.HideToTray; {$IF DEFINED(LCLGTK2) or DEFINED(LCLQT)} var ActiveWindow: HWND; LCLObject: TObject; {$ENDIF} begin { If a modal form is active we have to hide it first before hiding the main form to avoid bugs: On GTK2 a modal form loses it's modal state after the main window is restored (GTK still says the window is modal and resetting modal state doesn't do anything). On QT the tray icon does not receive any mouse events (because the modal window has capture) thus preventing the user from restoring the main window. So when the main form is hidden the modal window is hidden too. } {$IF DEFINED(LCLGTK2) or DEFINED(LCLQT)} LastActiveWindow := nil; if not Self.Active then // If there is another window active begin ActiveWindow := GetActiveWindow; if ActiveWindow <> 0 then begin LCLObject := GetLCLOwnerObject(ActiveWindow); if Assigned(LCLObject) and (LCLObject is TCustomForm) and (fsModal in (LCLObject as TCustomForm).FormState) then // only for modal windows begin LastActiveWindow := LCLObject as TCustomForm; {$IFDEF LCLGTK2} // Cannot use Hide method, because it closes the modal form. // We only want to hide it. LastActiveWindow.Visible := False; {$ENDIF} {$IFDEF LCLQT} // Have to use QT directly to hide the window for this to work. TQtWidget(LastActiveWindow.Handle).setVisible(False); {$ENDIF} end; end; end; {$ENDIF} Hide; ShowTrayIcon(True); HiddenToTray := True; end; procedure TfrmMain.RestoreFromTray; begin if lastWindowState=wsMaximized then WindowState:=wsMaximized; ShowOnTop; if not gAlwaysShowTrayIcon then ShowTrayIcon(False); // After the main form is shown, restore the last active modal form if there was any. {$IF DEFINED(LCLGTK2) or DEFINED(LCLQT)} if Assigned(LastActiveWindow) then begin {$IFDEF LCLQT} TQtWidget(LastActiveWindow.Handle).setVisible(true); {$ENDIF} {$IFDEF LCLGTK2} LastActiveWindow.Show; {$ENDIF} LastActiveWindow := nil; end; {$ENDIF} end; procedure TfrmMain.RightDriveBarExecuteDrive(ToolItem: TKASToolItem); var DriveItem: TKASDriveItem; Panel: TFilePanelSelect; begin DriveItem := ToolItem as TKASDriveItem; if gDriveBar2 then Panel := fpRight else Panel := ActiveNotebook.Side; SetPanelDrive(Panel, DriveItem.Drive, True); end; procedure TfrmMain.ShowTrayIcon(bShow: Boolean); begin if (bShow <> MainTrayIcon.Visible) and (HidingTrayIcon = False) then begin if bShow then begin MainTrayIcon.Visible := True; end else begin // ShowTrayIcon might be called from within OnClick event of the icon // (MainTrayIconClick->RestoreFromTray->ShowTrayIcon), so the MainTrayIcon // cannot be hidden here, because it would be destroyed causing A/V. // Hiding it must be delayed until after the mouse click handler of the icon is finished. HidingTrayIcon := True; Application.QueueAsyncCall(@HideTrayIconDelayed, 0); end; end; end; procedure TfrmMain.HideTrayIconDelayed(Data: PtrInt); begin MainTrayIcon.Visible := False; HidingTrayIcon := False; end; procedure TfrmMain.ExecuteCommandLine(bRunInTerm: Boolean); begin mbSetCurrentDir(ActiveFrame.CurrentPath); ExecuteCommandFromEdit(edtCommand.Text, bRunInTerm); edtCommand.Text := ''; ActiveFrame.Reload; ActiveFrame.SetFocus; {$IF DEFINED(LCLGTK) or DEFINED(LCLGTK2)} // workaround for GTK // edtCommandExit is not always called when losing focus edtCommandExit(Self); {$ENDIF} end; procedure TfrmMain.UpdatePrompt; const PTLen = 40; var st: UTF8String; begin if (fsoExecute in ActiveFrame.FileSource.GetOperationsTypes) then begin with lblCommandPath do begin Visible := True; AutoSize := False; if UTF8Length(ActiveFrame.CurrentPath) > PTLen then st:= UTF8Copy(ActiveFrame.CurrentPath, UTF8Length(ActiveFrame.CurrentPath) - PTLen, PTLen) else st:= ActiveFrame.CurrentPath; // Caption := Format(fmtCommandPath, [st]); AutoSize := True; Left := 1; end; // Change path in terminal if (fspDirectAccess in ActiveFrame.FileSource.GetProperties) then begin if gTermWindow and Assigned(Cons) then Cons.Terminal.SetCurrentDir(ActiveFrame.CurrentPath); end; edtCommand.Visible := True; end else begin lblCommandPath.Visible := False; edtCommand.Visible := False; end; // Change program current path if (fspDirectAccess in ActiveFrame.FileSource.GetProperties) then begin mbSetCurrentDir(ActiveFrame.CurrentPath); end; end; procedure TfrmMain.UpdateFreeSpace(Panel: TFilePanelSelect); var FreeSize, TotalSize: Int64; aFileView: TFileView; sboxDrive: TPaintBox; lblDriveInfo: TLabel; begin case Panel of fpLeft : begin sboxDrive := pbxLeftDrive; aFileView := FrameLeft; lblDriveInfo:=lblLeftDriveInfo; end; fpRight: begin sboxDrive := pbxRightDrive; aFileView := FrameRight; lblDriveInfo:=lblRightDriveInfo; end; end; if aFileView.FileSource.GetFreeSpace(aFileView.CurrentPath, FreeSize, TotalSize) then begin if gDriveInd = True then begin if TotalSize > 0 then sboxDrive.Tag:= 100 - Round((FreeSize / TotalSize) * 100) // Save busy percent else sboxDrive.Tag := -1; sboxDrive.Invalidate; end; lblDriveInfo.Hint := Format(rsFreeMsg, [cnvFormatFileSize(FreeSize), cnvFormatFileSize(TotalSize)]); if gShortFormatDriveInfo then lblDriveInfo.Caption := Format(rsFreeMsgShort, [cnvFormatFileSize(FreeSize)]) else lblDriveInfo.Caption := lblDriveInfo.Hint; sboxDrive.Hint := lblDriveInfo.Hint; end else begin lblDriveInfo.Caption := ''; lblDriveInfo.Hint := ''; sboxDrive.Hint := ''; sboxDrive.Tag := -1; sboxDrive.Invalidate; end; end; procedure TfrmMain.CloseNotebook(ANotebook: TFileViewNotebook); var I: Integer; begin for I := 0 to ANotebook.PageCount - 1 do ANotebook.View[I].Clear; ANotebook.DestroyAllPages; end; procedure TfrmMain.DriveListDriveSelected(Sender: TObject; ADriveIndex: Integer; APanel: TFilePanelSelect); begin SetPanelDrive(APanel, DrivesList.Items[ADriveIndex], True); end; procedure TfrmMain.DriveListClose(Sender: TObject); begin SetActiveFrame(SelectedPanel); end; procedure TfrmMain.AllProgressOnUpdateTimer(Sender: TObject); var AllProgressPoint: Integer; begin // Hide progress bar if there are no operations if OperationsManager.OperationsCount = 0 then begin mnuAllOperProgress.Visible:= False; mnuAllOperPause.Visible:= False; mnuAllOperStart.Visible:= False; end else begin if gPanelOfOp = True then FOperationsPanel.UpdateView; if gProgInMenuBar = True then begin AllProgressPoint:= Round(OperationsManager.AllProgressPoint * 100); // Show in menu line mnuAllOperProgress.Caption:=IntToStr(AllProgressPoint) + ' %'; mnuAllOperProgress.Visible:= True; mnuAllOperPause.Visible:= True; mnuAllOperStart.Visible:= True; end; end; end; procedure TfrmMain.SetPanelDrive(aPanel: TFilePanelSelect; Drive: PDrive; ActivateIfNeeded: Boolean); var aFileView, OtherFileView: TFileView; begin if IsAvailable(Drive, Drive^.AutoMount) then begin case aPanel of fpLeft: begin aFileView := FrameLeft; OtherFileView := FrameRight; end; fpRight: begin aFileView := FrameRight; OtherFileView := FrameLeft; end; end; // Copy path opened in the other panel if the file source and drive match // and that path is not already opened in this panel. if OtherFileView.FileSource.IsClass(TFileSystemFileSource) and mbCompareFileNames(ExtractRootDir(OtherFileView.CurrentPath), ExcludeTrailingPathDelimiter(Drive^.Path)) and not mbCompareFileNames(OtherFileView.CurrentPath, aFileView.CurrentPath) and not gGoToRoot then begin SetFileSystemPath(aFileView, OtherFileView.CurrentPath); end else begin SetFileSystemPath(aFileView, Drive^.Path); end; if ActivateIfNeeded and (tb_activate_panel_on_click in gDirTabOptions) then SetActiveFrame(aPanel); end else begin msgWarning(rsMsgDiskNotAvail); // Restore previous selected button. case aPanel of fpLeft: UpdateSelectedDrive(LeftTabs); fpRight: UpdateSelectedDrive(RightTabs); end; end; end; procedure TfrmMain.OnDriveWatcherEvent(EventType: TDriveWatcherEvent; const ADrive: PDrive); begin UpdateDiskCount; end; procedure TfrmMain.AppActivate(Sender: TObject); begin if Assigned(FrameLeft) then FrameLeft.ReloadIfNeeded; if Assigned(FrameRight) then FrameRight.ReloadIfNeeded; end; {$IFDEF LCLQT} function TfrmMain.QObjectEventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; begin Result:= False; if QEvent_type(Event) = QEventClose then begin TQtWidget(Self.Handle).SlotClose; Result:= CloseQueryResult; if Result then QEvent_accept(Event) else QEvent_ignore(Event); end; end; {$ENDIF} initialization TFormCommands.RegisterCommandsForm(TfrmMain, HotkeysCategory, @rsHotkeyCategoryMain); end. doublecmd-0.5.8/src/fcopymovedlg.lfm0000644000175000017500000002367712023046500016502 0ustar alexxalexxobject frmCopyDlg: TfrmCopyDlg Left = 45 Height = 263 Top = 85 Width = 612 HorzScrollBar.Page = 349 HorzScrollBar.Range = 337 VertScrollBar.Page = 205 VertScrollBar.Range = 186 ActiveControl = edtDst BorderIcons = [biSystemMenu, biMaximize] Caption = 'Copy file(s)' ClientHeight = 263 ClientWidth = 612 KeyPreview = True OnCreate = FormCreate OnDestroy = FormDestroy OnKeyDown = FormKeyDown OnShow = frmCopyDlgShow Position = poScreenCenter LCLVersion = '1.1' object lblCopySrc: TLabel AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 8 Height = 20 Top = 8 Width = 596 Anchors = [akTop, akLeft, akRight] AutoSize = False BorderSpacing.Left = 8 BorderSpacing.Top = 8 BorderSpacing.Right = 8 ParentColor = False end object edtDst: TKASPathEdit AnchorSideLeft.Control = Owner AnchorSideTop.Control = lblCopySrc AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 8 Height = 28 Top = 34 Width = 596 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 8 BorderSpacing.Top = 6 BorderSpacing.Right = 8 TabOrder = 0 ObjectTypes = [otFolders, otNonFolders] FileSortType = fstFoldersFirst end object pnlSelector: TPanel AnchorSideLeft.Control = edtDst AnchorSideTop.Control = edtDst AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtDst AnchorSideRight.Side = asrBottom Left = 8 Height = 38 Top = 70 Width = 596 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 8 BevelOuter = bvNone TabOrder = 1 end object pnlButtons: TPanel AnchorSideLeft.Control = edtDst AnchorSideTop.Control = pnlSelector AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtDst AnchorSideRight.Side = asrBottom Left = 8 Height = 36 Top = 112 Width = 596 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Top = 4 BevelOuter = bvNone ClientHeight = 36 ClientWidth = 596 TabOrder = 2 object btnOptions: TButton Left = 0 Height = 36 Top = 0 Width = 100 Align = alLeft AutoSize = True Caption = 'O&ptions' Constraints.MinWidth = 100 OnClick = btnOptionsClick OnMouseUp = btnOptionsMouseUp TabOrder = 0 end object btnAddToQueue: TBitBtn Left = 251 Height = 36 Top = 0 Width = 128 Align = alRight AutoSize = True BorderSpacing.InnerBorder = 2 Caption = 'A&dd To Queue' Constraints.MinHeight = 34 Constraints.MinWidth = 88 Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 000004733AFF21824FFF638272FF000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000004733AFF7ACFA4FF2C8C5AFF3D7659FFAEAEAEFF00000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000004733AFF82D8ACFF76D6A6FF3C9D6AFF27744CFFACAEADFF000000000000 0000000000000000000000000000000000000000000000000000000000000000 000009773FFF83DBAEFF1FC671FF72DEA7FF4BB27FFF177445FFA8ADAAFF0000 0000000000000000000000000000000000000000000000000000000000000000 000004733AFF83DCAFFF11C369FF1ACC73FF69DFA3FF5AC28DFF137643FF9EA7 A3FF000000000000000000000000000000000000000000000000000000000000 000004733AFFA9DCC1FF10BD65FF11C167FF13C269FF59D395FF67C998FF167C 47FF889C92FF0000000000000000000000000000000000000000000000000000 000004733AFFA9DCC1FF0DB35EFF0EB660FF0EB660FF0DB45FFF47C484FF70CA 9CFF1D824DFF678C79FF00000000000000000000000000000000000000000000 000004733AFFA9DCC1FF0CAA58FF12AE5EFF15AF60FF16AD61FF13AA5DFF3AB6 77FF75C79DFF288957FF4E8367FF000000000000000000000000000000000000 000004733AFFA9DCC1FF2EAD6BFF2BAD6AFF27AB68FF22A964FF1CA55FFF41B2 78FF78C69FFF298858FF678C79FF000000000000000000000000000000000000 000004733AFFA9DCC1FF36AD70FF32AC6DFF2DAA6AFF28A866FF58BC89FF78C5 9DFF1F804EFF839A8EFF00000000000000000000000000000000000000000000 000004733AFFA9DCC1FF3EB176FF3AAF73FF36AE70FF6FC598FF71BF97FF187B 49FFA6B0ABFF0000000000000000000000000000000000000000000000000000 000004733AFFA9DCC1FF45B47BFF47B47CFF82CCA6FF67B68CFF177745FFC1C5 C3FF000000000000000000000000000000000000000000000000000000000000 000004733AFFA5DABFFF57BB87FF90D2B0FF5BAB82FF23774CFFD4D5D4FF0000 0000000000000000000000000000000000000000000000000000000000000000 000004733AFFA9DCC1FF9BD5B7FF4C9F73FF3D7D5CFF00000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000004733AFFA4D9BEFF3D9366FF5F8873FF0000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000004733AFF2D8859FF859C90FF000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } ModalResult = 1 OnClick = btnAddToQueueClick OnMouseUp = btnAddToQueueMouseUp TabOrder = 1 end object btnCreateSpecialQueue: TButton Left = 379 Height = 36 Top = 0 Width = 25 Align = alRight AutoSize = True BorderSpacing.Right = 12 Caption = '...' TabOrder = 2 Visible = False end object btnCancel: TBitBtn Left = 416 Height = 36 Top = 0 Width = 84 Align = alRight AutoSize = True BorderSpacing.Left = 12 BorderSpacing.Right = 8 BorderSpacing.InnerBorder = 2 Cancel = True Caption = '&Cancel' Kind = bkCancel ModalResult = 2 OnMouseUp = btnCancelMouseUp TabOrder = 3 end object btnOK: TBitBtn Left = 508 Height = 36 Top = 0 Width = 88 Align = alRight AutoSize = True BorderSpacing.InnerBorder = 2 Constraints.MinHeight = 34 Constraints.MinWidth = 88 Default = True Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 000004733AFF21824FFF638272FF000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000004733AFF7ACFA4FF2C8C5AFF3D7659FFAEAEAEFF00000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000004733AFF82D8ACFF76D6A6FF3C9D6AFF27744CFFACAEADFF000000000000 0000000000000000000000000000000000000000000000000000000000000000 000009773FFF83DBAEFF1FC671FF72DEA7FF4BB27FFF177445FFA8ADAAFF0000 0000000000000000000000000000000000000000000000000000000000000000 000004733AFF83DCAFFF11C369FF1ACC73FF69DFA3FF5AC28DFF137643FF9EA7 A3FF000000000000000000000000000000000000000000000000000000000000 000004733AFFA9DCC1FF10BD65FF11C167FF13C269FF59D395FF67C998FF167C 47FF889C92FF0000000000000000000000000000000000000000000000000000 000004733AFFA9DCC1FF0DB35EFF0EB660FF0EB660FF0DB45FFF47C484FF70CA 9CFF1D824DFF678C79FF00000000000000000000000000000000000000000000 000004733AFFA9DCC1FF0CAA58FF12AE5EFF15AF60FF16AD61FF13AA5DFF3AB6 77FF75C79DFF288957FF4E8367FF000000000000000000000000000000000000 000004733AFFA9DCC1FF2EAD6BFF2BAD6AFF27AB68FF22A964FF1CA55FFF41B2 78FF78C69FFF298858FF678C79FF000000000000000000000000000000000000 000004733AFFA9DCC1FF36AD70FF32AC6DFF2DAA6AFF28A866FF58BC89FF78C5 9DFF1F804EFF839A8EFF00000000000000000000000000000000000000000000 000004733AFFA9DCC1FF3EB176FF3AAF73FF36AE70FF6FC598FF71BF97FF187B 49FFA6B0ABFF0000000000000000000000000000000000000000000000000000 000004733AFFA9DCC1FF45B47BFF47B47CFF82CCA6FF67B68CFF177745FFC1C5 C3FF000000000000000000000000000000000000000000000000000000000000 000004733AFFA5DABFFF57BB87FF90D2B0FF5BAB82FF23774CFFD4D5D4FF0000 0000000000000000000000000000000000000000000000000000000000000000 000004733AFFA9DCC1FF9BD5B7FF4C9F73FF3D7D5CFF00000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000004733AFFA4D9BEFF3D9366FF5F8873FF0000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000004733AFF2D8859FF859C90FF000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000 } ModalResult = 1 OnClick = btnOKClick OnMouseUp = btnOKMouseUp TabOrder = 4 end end object pnlOptions: TPanel AnchorSideLeft.Control = edtDst AnchorSideTop.Control = pnlButtons AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtDst AnchorSideRight.Side = asrBottom Left = 8 Height = 43 Top = 152 Width = 596 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Top = 4 BevelOuter = bvNone ClientHeight = 43 ClientWidth = 596 TabOrder = 3 OnResize = pnlOptionsResize object grpOptions: TGroupBox AnchorSideLeft.Control = pnlOptions AnchorSideTop.Control = pnlOptions AnchorSideRight.Control = pnlOptions AnchorSideRight.Side = asrBottom Left = 0 Height = 4 Top = 0 Width = 596 Anchors = [akTop, akLeft, akRight] AutoSize = True TabOrder = 0 end object btnSaveOptions: TButton AnchorSideLeft.Control = grpOptions AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = grpOptions AnchorSideTop.Side = asrBottom Left = 197 Height = 31 Top = 12 Width = 203 AutoSize = True BorderSpacing.Top = 8 Caption = 'Sa&ve these options as default' OnClick = btnSaveOptionsClick TabOrder = 1 end end end doublecmd-0.5.8/src/uColorExt.pas0000644000175000017500000002247312014201074015725 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Load colors of files in file panels Copyright (C) 2003-2004 Radek Cervinka (radek.cervinka@centrum.cz) Copyright (C) 2006-2009 Koblov Alexander (Alexx2000@mail.ru) Copyright (C) 2008 Dmitry Kolomiets (B4rr4cuda@rambler.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uColorExt; interface uses Classes, Graphics, uFile, DCXmlConfig; type { TMaskItem } TMaskItem = class public sExt: String; sModeStr: String; cColor: TColor; sName: String; procedure Assign(ASource: TMaskItem); end; { TColorExt } TColorExt = class private fOldCount: Integer; lslist: TList; function GetCount: Integer; function GetItems(const Index: Integer): TMaskItem; public constructor Create; destructor Destroy; override; procedure Clear; procedure Add(AItem: TMaskItem); function GetColorByExt(const sExt: String): TColor; function GetColorByAttr(const sModeStr: String): TColor; function GetColorBy(const AFile: TFile): TColor; procedure LoadIni; procedure SaveIni; procedure Load(AConfig: TXmlConfig; ANode: TXmlNode); procedure Save(AConfig: TXmlConfig; ANode: TXmlNode); property Count: Integer read GetCount; property Items[const Index: Integer]: TMaskItem read GetItems; default; end; implementation uses SysUtils, uDebug, uGlobs, uMasks, uFileProperty; { TMaskItem } procedure TMaskItem.Assign(ASource: TMaskItem); begin Assert(Assigned(ASource)); sExt := ASource.sExt; sModeStr := ASource.sModeStr; cColor := ASource.cColor; sName := ASource.sName; end; function TColorExt.GetCount: Integer; begin Result := lslist.Count; end; function TColorExt.GetItems(const Index: Integer): TMaskItem; begin Result := TMaskItem(lslist[Index]); end; constructor TColorExt.Create; begin inherited; lslist:= TList.Create; end; destructor TColorExt.Destroy; begin Clear; FreeAndNil(lsList); inherited; end; procedure TColorExt.Clear; begin while lslist.Count > 0 do begin TMaskItem(lslist[0]).Free; lslist.Delete(0); end; end; procedure TColorExt.Add(AItem: TMaskItem); begin lslist.Add(AItem); end; function TColorExt.GetColorByExt(const sExt: String): TColor; var I: Integer; begin Result:= clDefault; for I:=0 to lslist.Count-1 do begin if MatchesMaskList(sExt, TMaskItem(lslist[I]).sExt,';') then begin Result:= TMaskItem(lslist[I]).cColor; Exit; end; end; end; function TColorExt.GetColorByAttr(const sModeStr: String): TColor; var I: Integer; begin Result:= clDefault; for I:=0 to lslist.Count-1 do begin if MatchesMaskList(sModeStr,TMAskItem(lslist[I]).sModeStr,';') then begin Result:=TMAskItem(lslist[I]).cColor; Exit; end; end; end; function TColorExt.GetColorBy(const AFile: TFile): TColor; var I, J: Integer; MaskItem: TMaskItem; begin Result:= clDefault; for I:= 0 to lslist.Count-1 do begin MaskItem:= TMaskItem(lslist[I]); // get color by search template if MaskItem.sExt[1] = '>' then for J:= 0 to gSearchTemplateList.Count - 1 do with gSearchTemplateList do begin if (Templates[J].TemplateName = PChar(MaskItem.sExt)+1) and Templates[J].CheckFile(AFile) then begin Result:= MaskItem.cColor; Exit; end; end; // Get color by extension and attribute. // If attributes field is empty then don't match directories. if ((MaskItem.sExt = '') or (((MaskItem.sModeStr <> '') or not (AFile.IsDirectory or AFile.IsLinkToDirectory)) and MatchesMaskList(AFile.Name, MaskItem.sExt, ';'))) and ((MaskItem.sModeStr = '') or not (fpAttributes in AFile.SupportedProperties) or MatchesMaskList(AFile.Properties[fpAttributes].AsString, MaskItem.sModeStr, ';')) then begin Result:= MaskItem.cColor; Exit; end; end; end; (* Load colors of files from doublecmd.ini *) { format of colors storage as in Total Commander: doublecmd.ini [Colors] ColorFilter1=*.o;*.ppu;*.rst;*.bak;*.dcu ColorFilter1Color=16711680 ColorFilter2=*.pas ColorFilter2Color=16711000 etc... Added Attributes: ColorFilter1Attributes=-r*xr*xr*x //all read/executable file ColorFilter2Attributes=-*x* //all executable ColorFilter3Attributes=d* //all directories ColorFilter4Attributes=l* //all links Be careful with * expression. Functions return just first found value. This is right demo of [Colors] section: ColorFilter3=* ColorFilter3Color=55758 ColorFilter3Attributes=-rwxrwxr*x ColorFilter3Name=SomeName3 ColorFilter4=* ColorFilter4Color=32768 ColorFilter4Attributes=-*x* ColorFilter4Name=SomeName4 This IS WRONG because ColorFilter3Attributes=-*x* will be found and ColorFilter3Color=32768 will be returned first: ColorFilter3=* ColorFilter3Color=32768 ColorFilter3Attributes=-*x* ColorFilter3Name=SomeName3 ColorFilter4=* ColorFilter4Color=55758 ColorFilter4Attributes=-rwxrwxr*x ColorFilter4Name=SomeName4 !!! The "?" and other regular expressions DOES NOT SUPPORTED } procedure TColorExt.LoadIni; var sExtMask, sAttr, sName: String; iColor, I : Integer; begin I := 1; Clear; while gIni.ReadString('Colors', 'ColorFilter' + IntToStr(I), '') <> '' do begin sExtMask := gIni.ReadString('Colors', 'ColorFilter' + IntToStr(I), ''); iColor := gIni.ReadInteger('Colors', 'ColorFilter' + IntToStr(I) + 'Color', clWindowText); sName:=gIni.ReadString('Colors', 'ColorFilter' + IntToStr(I)+'Name', ''); sAttr := gIni.ReadString('Colors', 'ColorFilter' + IntToStr(I) + 'Attributes', ''); lsList.Add(TMaskItem.Create); TMaskItem(lsList[lsList.Count-1]).sName:=sName; TMaskItem(lsList[lsList.Count-1]).cColor:=iColor; TMaskItem(lsList[lsList.Count-1]).sExt:=sExtMask; TMaskItem(lsList[lsList.Count-1]).sModeStr:=sAttr; fOldCount := I; Inc(I); end; // while gIni.ReadString(); end; procedure TColorExt.SaveIni; var I : Integer; begin if (not assigned(lslist)) then exit; for I:=0 to lslist.Count - 1 do begin gIni.WriteString('Colors', 'ColorFilter' + IntToStr(I+1), TMaskItem(lsList[I]).sExt); gIni.WriteInteger('Colors', 'ColorFilter' + IntToStr(I+1) + 'Color', TMaskItem(lsList[I]).cColor); gIni.WriteString('Colors', 'ColorFilter' + IntToStr(I+1)+'Name', TMaskItem(lsList[I]).sName); gIni.WriteString('Colors', 'ColorFilter' + IntToStr(I+1) + 'Attributes', TMaskItem(lsList[I]).sModeStr); end; // delete old not used filters for I := lslist.Count + 1 to fOldCount do begin gIni.DeleteKey('Colors', 'ColorFilter' + IntToStr(I)); gIni.DeleteKey('Colors', 'ColorFilter' + IntToStr(I) + 'Color'); gIni.DeleteKey('Colors', 'ColorFilter' + IntToStr(I)+'Name'); gIni.DeleteKey('Colors', 'ColorFilter' + IntToStr(I) + 'Attributes'); end; end; procedure TColorExt.Load(AConfig: TXmlConfig; ANode: TXmlNode); var sExtMask, sAttr, sName: String; iColor: Integer; begin Clear; ANode := ANode.FindNode('FileFilters'); if Assigned(ANode) then begin ANode := ANode.FirstChild; while Assigned(ANode) do begin if ANode.CompareName('Filter') = 0 then begin if AConfig.TryGetValue(ANode, 'Name', sName) and AConfig.TryGetValue(ANode, 'FileMasks', sExtMask) and AConfig.TryGetValue(ANode, 'Color', iColor) and AConfig.TryGetValue(ANode, 'Attributes', sAttr) then begin lsList.Add(TMaskItem.Create); TMaskItem(lsList.Last).sName := sName; TMaskItem(lsList.Last).cColor := iColor; TMaskItem(lsList.Last).sExt := sExtMask; TMaskItem(lsList.Last).sModeStr := sAttr; end else begin DCDebug('Invalid entry in configuration: ' + AConfig.GetPathFromNode(ANode) + '.'); end; end; ANode := ANode.NextSibling; end; end; end; procedure TColorExt.Save(AConfig: TXmlConfig; ANode: TXmlNode); var I : Integer; SubNode: TXmlNode; begin if not Assigned(lslist) then Exit; ANode := AConfig.FindNode(ANode, 'FileFilters', True); AConfig.ClearNode(ANode); for I:=0 to lslist.Count - 1 do begin SubNode := AConfig.AddNode(ANode, 'Filter'); AConfig.AddValue(SubNode, 'Name', TMaskItem(lsList[I]).sName); AConfig.AddValue(SubNode, 'FileMasks', TMaskItem(lsList[I]).sExt); AConfig.AddValue(SubNode, 'Color', TMaskItem(lsList[I]).cColor); AConfig.AddValue(SubNode, 'Attributes', TMaskItem(lsList[I]).sModeStr); end; end; end. doublecmd-0.5.8/src/fFileOpDlg.lrt0000644000175000017500000000037411740433676016012 0ustar alexxalexxTFRMFILEOP.LBLCURRENTOPERATION.CAPTION=Current operation: TFRMFILEOP.LBLFROM.CAPTION=From: TFRMFILEOP.LBLTO.CAPTION=To: TFRMFILEOP.BTNMINIMIZETOPANEL.CAPTION=&To panel TFRMFILEOP.BTNVIEWOPERATIONS.CAPTION=&View all TFRMFILEOP.BTNCANCEL.CAPTION=&Cancel doublecmd-0.5.8/src/fmultirename.lrt0000644000175000017500000000557612023046500016515 0ustar alexxalexxTFRMMULTIRENAME.CAPTION=MultiRename TFRMMULTIRENAME.STRINGGRID.COLUMNS[0].TITLE.CAPTION=Old File Name TFRMMULTIRENAME.STRINGGRID.COLUMNS[1].TITLE.CAPTION=New File Name TFRMMULTIRENAME.STRINGGRID.COLUMNS[2].TITLE.CAPTION=File Path TFRMMULTIRENAME.GBMASKA.CAPTION=Mask TFRMMULTIRENAME.LBNAME.CAPTION=File &Name TFRMMULTIRENAME.LBEXT.CAPTION=&Extension TFRMMULTIRENAME.BTNNAMEMENU.CAPTION=... TFRMMULTIRENAME.BTNEXTMENU.CAPTION=... TFRMMULTIRENAME.GBFINDREPLACE.CAPTION=Find && Replace TFRMMULTIRENAME.LBFIND.CAPTION=&Find... TFRMMULTIRENAME.LBREPLACE.CAPTION=Re&place... TFRMMULTIRENAME.CBREGEXP.CAPTION=Regular e&xpressions TFRMMULTIRENAME.CBUSESUBS.CAPTION=&Use substitution TFRMMULTIRENAME.GBCOUNTER.CAPTION=Counter TFRMMULTIRENAME.LBSTNB.CAPTION=S&tart Number TFRMMULTIRENAME.EDPOC.TEXT=1 TFRMMULTIRENAME.LBINTERVAL.CAPTION=&Interval TFRMMULTIRENAME.EDINTERVAL.TEXT=1 TFRMMULTIRENAME.LBWIDTH.CAPTION=&Width TFRMMULTIRENAME.CMBXWIDTH.TEXT=01 TFRMMULTIRENAME.BTNRENAME.CAPTION=&Rename TFRMMULTIRENAME.BTNCLOSE.CAPTION=&Close TFRMMULTIRENAME.GBLOG.CAPTION=Log Result TFRMMULTIRENAME.CBLOG.CAPTION=Ena&ble TFRMMULTIRENAME.BTNRESTORE.CAPTION=Reset &all TFRMMULTIRENAME.GBPRESETS.CAPTION=Presets TFRMMULTIRENAME.BTNLOADPRESET.CAPTION=&Load TFRMMULTIRENAME.BTNSAVEPRESET.CAPTION=&Save TFRMMULTIRENAME.BTNDELETEPRESET.CAPTION=&Delete TFRMMULTIRENAME.MINEXTNAME.CAPTION=Name... TFRMMULTIRENAME.MINAME.CAPTION=[N] Name TFRMMULTIRENAME.MINAMEX.CAPTION=[Nx] Character at position x TFRMMULTIRENAME.MINAMEXX.CAPTION=[Nx:y] Characters from position x to y TFRMMULTIRENAME.N1.CAPTION=- TFRMMULTIRENAME.MINEXTEXTENSION.CAPTION=Extension... TFRMMULTIRENAME.EXTENSION.CAPTION=[E] Extension TFRMMULTIRENAME.MIEXTENSIONX.CAPTION=[Ex] Character at position x TFRMMULTIRENAME.MIEXTENSIONXX.CAPTION=[Ex:y] Characters from position x to y TFRMMULTIRENAME.N2.CAPTION=- TFRMMULTIRENAME.MICOUNTER.CAPTION=[C] Counter TFRMMULTIRENAME.N3.CAPTION=- TFRMMULTIRENAME.MINEXT.CAPTION=Time... TFRMMULTIRENAME.MIYEAR.CAPTION=[Y] Year (2 digits) TFRMMULTIRENAME.MIYEAR1.CAPTION=[YYYY] Year (4 digits) TFRMMULTIRENAME.MIMONTH.CAPTION=[M] Month TFRMMULTIRENAME.MIMONTH1.CAPTION=[MM] Month (2 digits) TFRMMULTIRENAME.MIMONTH2.CAPTION=[MMM] Month name (short, e.g., "jan") TFRMMULTIRENAME.MIMONTH3.CAPTION=[MMMM] Month name (long, e.g., "january") TFRMMULTIRENAME.MIDAY.CAPTION=[D] Day TFRMMULTIRENAME.MIDAY1.CAPTION=[DD] Day (2 digits) TFRMMULTIRENAME.MIDAY2.CAPTION=[DDD] Day of the week (short, e.g., "mon") TFRMMULTIRENAME.MIDAY3.CAPTION=[DDDD] Day of the week (long, e.g., "monday") TFRMMULTIRENAME.N4.CAPTION=- TFRMMULTIRENAME.MIHOUR.CAPTION=[h] Hour TFRMMULTIRENAME.MIHOUR1.CAPTION=[hh] Hour (2 digits) TFRMMULTIRENAME.MIMINUTE.CAPTION=[n] Minute TFRMMULTIRENAME.MIMINUTE1.CAPTION=[nn] Minute (2 digits) TFRMMULTIRENAME.MISECOND.CAPTION=[s] Second TFRMMULTIRENAME.MISECOND1.CAPTION=[ss] Second (2 digits) TFRMMULTIRENAME.N5.CAPTION=- TFRMMULTIRENAME.MIPLUGIN.CAPTION=Plugin doublecmd-0.5.8/src/fFileOpDlg.lfm0000644000175000017500000001132512103177210015744 0ustar alexxalexxobject frmFileOp: TfrmFileOp Left = 287 Height = 212 Top = 244 Width = 522 ClientHeight = 212 ClientWidth = 522 Constraints.MinWidth = 500 OnClose = FormClose OnCreate = FormCreate Position = poScreenCenter ShowInTaskBar = stAlways LCLVersion = '1.0.1.3' object pnlClient: TPanel Left = 3 Height = 167 Top = 3 Width = 516 Align = alTop AutoSize = True BorderSpacing.Around = 3 BevelOuter = bvNone ClientHeight = 167 ClientWidth = 516 TabOrder = 0 object pnlQueue: TPanel Left = 0 Height = 28 Top = 0 Width = 516 Align = alTop AutoSize = True BevelOuter = bvNone ClientHeight = 28 ClientWidth = 516 TabOrder = 0 object lblCurrentOperation: TLabel Left = 0 Height = 22 Top = 0 Width = 516 Align = alTop BorderSpacing.Bottom = 5 Caption = 'Current operation:' ParentColor = False end object lblCurrentOperationText: TLabel Left = 0 Height = 1 Top = 27 Width = 516 Align = alTop ParentColor = False end end object pnlFrom: TPanel Left = 0 Height = 22 Top = 28 Width = 516 Align = alTop AutoSize = True BorderSpacing.Bottom = 3 BevelOuter = bvNone ClientHeight = 22 ClientWidth = 516 TabOrder = 1 object lblFrom: TLabel Left = 0 Height = 22 Top = 0 Width = 40 Align = alLeft Caption = 'From:' Constraints.MinWidth = 40 ParentColor = False end object lblFileNameFrom: TLabel Left = 40 Height = 22 Top = 0 Width = 476 Align = alClient ParentColor = False end end object pnlTo: TPanel Left = 0 Height = 22 Top = 53 Width = 516 Align = alTop AutoSize = True BorderSpacing.Top = 3 BorderSpacing.Bottom = 3 BevelOuter = bvNone ClientHeight = 22 ClientWidth = 516 TabOrder = 2 object lblFileNameTo: TLabel Left = 40 Height = 22 Top = 0 Width = 476 Align = alClient ParentColor = False end object lblTo: TLabel Left = 0 Height = 22 Top = 0 Width = 40 Align = alLeft Caption = 'To:' Constraints.MinWidth = 40 ParentColor = False end end object lblEstimated: TLabel Left = 0 Height = 1 Top = 78 Width = 516 Align = alTop BorderSpacing.Top = 3 ParentColor = False end object pbFirst: TKASProgressBar Left = 0 Height = 22 Top = 107 Width = 516 Align = alTop BorderSpacing.Top = 3 Max = 516 Smooth = True TabOrder = 3 BarShowText = True end object pbSecond: TKASProgressBar Left = 0 Height = 22 Top = 82 Width = 516 Align = alTop BorderSpacing.Top = 3 Max = 516 Smooth = True TabOrder = 4 BarShowText = True end object pnlButtons: TPanel Left = 0 Height = 35 Top = 132 Width = 516 Align = alTop AutoSize = True BorderSpacing.Top = 3 BevelOuter = bvNone ClientHeight = 35 ClientWidth = 516 TabOrder = 5 object btnMinimizeToPanel: TBitBtn Left = 0 Height = 35 Top = 0 Width = 84 Align = alLeft AutoSize = True BorderSpacing.Right = 3 Caption = '&To panel' OnClick = btnMinimizeToPanelClick TabOrder = 0 end object btnViewOperations: TBitBtn Left = 87 Height = 35 Top = 0 Width = 78 Align = alLeft AutoSize = True BorderSpacing.Right = 3 Caption = '&View all' OnClick = btnViewOperationsClick TabOrder = 1 end object btnCancel: TBitBtn Left = 369 Height = 35 Top = 0 Width = 94 Align = alRight AutoSize = True BorderSpacing.Left = 3 BorderSpacing.InnerBorder = 2 Cancel = True Caption = '&Cancel' Constraints.MinWidth = 50 Kind = bkCancel ModalResult = 2 NumGlyphs = 0 OnClick = btnCancelClick TabOrder = 2 end object btnPauseStart: TBitBtn Left = 466 Height = 35 Top = 0 Width = 50 Align = alRight AutoSize = True BorderSpacing.Left = 3 Constraints.MinWidth = 50 NumGlyphs = 0 OnClick = btnPauseStartClick Spacing = 0 TabOrder = 3 end end end end doublecmd-0.5.8/src/uwfxprototypes.pas0000644000175000017500000001237711740433676017171 0ustar alexxalexxunit uWFXprototypes; {$mode objfpc}{$H+} interface uses WfxPlugin; {$IFDEF MSWINDOWS}{$CALLING STDCALL}{$ELSE}{$CALLING CDECL}{$ENDIF} type { File system plugins API (version 2.0) for TC } {R} //Realized {U} //Unrealized { Mandatory } {R} TFsInit=function(PluginNr:Integer; pProgressProc:tProgressProc; pLogProc:tlogProc; pRequestProc:tRequestProc):integer; {R} TFsFindFirst=function(path :pchar;var FindData:tWIN32FINDDATA):thandle; {R} TFsFindNext=function(Hdl:thandle;var FindData:tWIN32FINDDATA):boolean; {R} TFsFindClose=function(Hdl:thandle):integer; { Optional } {R} TFsSetCryptCallback = procedure(pCryptProc:TCryptProc;CryptoNr,Flags:integer); {R} TFsMkDir = function(RemoteDir:pchar):boolean; {R} TFsGetFile = function(RemoteName,LocalName:pchar;CopyFlags:integer; RemoteInfo:pRemoteInfo):integer; {R} TFsPutFile=function(LocalName,RemoteName:pchar;CopyFlags:integer):integer; {R} TFsDeleteFile=function(RemoteName:pchar):boolean; {R} TFsRemoveDir=function(RemoteName:pchar):boolean; {R} TFsStatusInfo = procedure(RemoteDir:pchar;InfoStartEnd,InfoOperation:integer); {R} TFsSetDefaultParams = procedure (dps:pFsDefaultParamStruct); {R} TFsExecuteFile=Function(MainWin:HWND;RemoteName,Verb:pchar):integer; {R} TFsGetDefRootName=procedure (DefRootName:pchar;maxlen:integer); //------------------------------------------------------ {R} TFsSetAttr=function (RemoteName:pchar;NewAttr:integer):boolean; {R} TFsSetTime=Function(RemoteName:pchar;CreationTime,LastAccessTime,LastWriteTime:PWfxFileTime):boolean; {U} TFsExtractCustomIcon=function(RemoteName:pchar;ExtractFlags:integer;var TheIcon:hicon):integer; {R} TFsRenMovFile= function(OldName,NewName:pchar; Move, OverWrite:boolean; ri:pRemoteInfo):Integer; {U} TFsDisconnect = function (DisconnectRoot:pchar):boolean; {U} TFsGetPreviewBitmap = function ( RemoteName:pchar; width,height:integer; ReturnedBitmap:HBITMAP):integer; {R} TFsLinksToLocalFiles = function:boolean; {R} TFsGetLocalName = function (RemoteName:pchar;maxlen:integer):boolean; //------------------------------------------------------ TFsGetBackgroundFlags = function: integer; //------------------------------------------------------ {R} TFsContentPluginUnloading = procedure; {U} TFsContentGetDetectString = procedure (DetectString:pchar;maxlen:integer); {U} TFsContentGetSupportedField = function (FieldIndex:integer;FieldName:pchar; Units:pchar;maxlen:integer):integer; {U} TFsContentGetValue = function (FileName:pchar;FieldIndex,UnitIndex:integer;FieldValue:pbyte; maxlen,flags:integer):integer; {U} TFsContentSetDefaultParams = procedure (dps:pContentDefaultParamStruct); {U} TFsContentStopGetValue = procedure (FileName:pchar); {U} TFsContentGetDefaultSortOrder = function (FieldIndex:integer):integer; {U} TFsContentGetSupportedFieldFlags = function (FieldIndex:integer):integer; {U} TFsContentSetValue = function (FileName:pchar;FieldIndex,UnitIndex,FieldType:integer; FieldValue:pbyte;flags:integer):integer; {U} TFsContentGetDefaultView = function (ViewContents,ViewHeaders,ViewWidths, ViewOptions:pchar;maxlen:integer):boolean; { Unicode } TFsInitW = function(PluginNr:integer;pProgressProcW:tProgressProcW;pLogProcW:tLogProcW; pRequestProcW:tRequestProcW):integer; TFsFindFirstW = function(path :pwidechar;var FindData:tWIN32FINDDATAW):thandle; TFsFindNextW = function(Hdl:thandle;var FindDataW:tWIN32FINDDATAW):bool; //------------------------------------------------------ TFsSetCryptCallbackW = procedure(CryptProcW:TCryptProcW;CryptoNr,Flags:integer); TFsMkDirW = function(RemoteDir:pwidechar):bool; TFsExecuteFileW = function(MainWin:HWND;RemoteName,Verb:pwidechar):integer; TFsRenMovFileW = function(OldName,NewName:pwidechar;Move,OverWrite:bool; RemoteInfo:pRemoteInfo):integer; TFsGetFileW = function(RemoteName,LocalName:pwidechar;CopyFlags:integer; RemoteInfo:pRemoteInfo):integer; TFsPutFileW = function(LocalName,RemoteName:pwidechar;CopyFlags:integer):integer; TFsDeleteFileW = function(RemoteName:pwidechar):bool; TFsRemoveDirW = function(RemoteName:pwidechar):bool; TFsDisconnectW = function(DisconnectRoot:pwidechar):bool; TFsSetAttrW = function(RemoteName:pwidechar;NewAttr:integer):bool; TFsSetTimeW = function(RemoteName:pwidechar;CreationTime,LastAccessTime, LastWriteTime:PWfxFileTime):bool; TFsStatusInfoW = procedure(RemoteDir:pwidechar;InfoStartEnd,InfoOperation:integer); TFsExtractCustomIconW = function(RemoteName:pwidechar;ExtractFlags:integer; var TheIcon:hicon):integer; TFsGetPreviewBitmapW = function(RemoteName:pwidechar;width,height:integer; var ReturnedBitmap:hbitmap):integer; TFsGetLocalNameW = function(RemoteName:pwidechar;maxlen:integer):bool; //------------------------------------------------------ TFsContentGetValueW = function(FileName:pwidechar;FieldIndex,UnitIndex:integer;FieldValue:pbyte; maxlen,flags:integer):integer; TFsContentStopGetValueW = procedure(FileName:pwidechar); TFsContentSetValueW = function(FileName:pwidechar;FieldIndex,UnitIndex,FieldType:integer; FieldValue:pbyte;flags:integer):integer; TFsContentGetDefaultViewW = function(ViewContents,ViewHeaders,ViewWidths, ViewOptions:pwidechar;maxlen:integer):bool; //------------------------------------------------------ {$CALLING DEFAULT} implementation end. doublecmd-0.5.8/src/fpackdlg.lrt0000644000175000017500000000135612023046500015570 0ustar alexxalexxTFRMPACKDLG.CAPTION=Pack files TFRMPACKDLG.LBLPROMPT.CAPTION=Pack file(s) to the file: TFRMPACKDLG.BTNOK.CAPTION=&OK TFRMPACKDLG.BTNCANCEL.CAPTION=&Cancel TFRMPACKDLG.BTNHELP.CAPTION=&Help TFRMPACKDLG.RGPACKER.CAPTION=Packer TFRMPACKDLG.BTNCONFIG.CAPTION=Con&figure TFRMPACKDLG.CBOTHERPLUGINS.CAPTION==> TFRMPACKDLG.CBSTOREDIR.CAPTION=Also &pack path names (only recursed) TFRMPACKDLG.CBMULTIVOLUME.CAPTION=&Multiple disk archive TFRMPACKDLG.CBMOVETOARCHIVE.CAPTION=Mo&ve to archive TFRMPACKDLG.CBCREATESFX.CAPTION=Create self e&xtracting archive TFRMPACKDLG.CBENCRYPT.CAPTION=Encr&ypt TFRMPACKDLG.CBPUTINTARFIRST.CAPTION=P&ut in the TAR archive first TFRMPACKDLG.CBCREATESEPARATEARCHIVES.CAPTION=C&reate separate archives, one per selected file/dir doublecmd-0.5.8/src/ffileassoc.lrt0000644000175000017500000000232012023046500016123 0ustar alexxalexxTFRMFILEASSOC.CAPTION=File associations TFRMFILEASSOC.BTNOK.CAPTION=&OK TFRMFILEASSOC.BTNCANCEL.CAPTION=&Cancel TFRMFILEASSOC.GBACTIONS.CAPTION=Actions TFRMFILEASSOC.BTNUPACT.CAPTION=&Up TFRMFILEASSOC.BTNDOWNACT.CAPTION=&Down TFRMFILEASSOC.BTNADDACT.CAPTION=Add TFRMFILEASSOC.BTNREMOVEACT.CAPTION=Remo&ve TFRMFILEASSOC.LBLCOMMAND.CAPTION=&Command: TFRMFILEASSOC.LBLACTION.CAPTION=Action: TFRMFILEASSOC.GBICON.CAPTION=Icon TFRMFILEASSOC.BTNREMOVEICON.CAPTION=X TFRMFILEASSOC.GBEXTS.CAPTION=Extensions TFRMFILEASSOC.BTNADDEXT.CAPTION=&Add TFRMFILEASSOC.BTNREMOVEEXT.CAPTION=Re&move TFRMFILEASSOC.GBFILETYPES.CAPTION=File types TFRMFILEASSOC.BTNADDNEWTYPE.CAPTION=A&dd TFRMFILEASSOC.BTNREMOVETYPE.CAPTION=&Remove TFRMFILEASSOC.BTNRENAMETYPE.CAPTION=R&ename TFRMFILEASSOC.MIOPEN.CAPTION=Open TFRMFILEASSOC.MIVIEW.CAPTION=View TFRMFILEASSOC.MIEDIT.CAPTION=Edit TFRMFILEASSOC.MIVFS.CAPTION=Open in VFS TFRMFILEASSOC.MIVIEWER.CAPTION=Open in Viewer TFRMFILEASSOC.MIEDITOR.CAPTION=Open in Editor TFRMFILEASSOC.MISHELL.CAPTION=Run in terminal TFRMFILEASSOC.MIGETOUTPUTFROMCOMMAND.CAPTION=Get output from command TFRMFILEASSOC.MIFILENAME.CAPTION=File name TFRMFILEASSOC.MIFILEPATH.CAPTION=File path TFRMFILEASSOC.MIFULLPATH.CAPTION=Full path doublecmd-0.5.8/src/frames/0000755000175000017500000000000012257501472014557 5ustar alexxalexxdoublecmd-0.5.8/src/frames/foptionstoolbar.pas0000644000175000017500000007300012215301020020465 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Toolbar configuration options page Copyright (C) 2006-2010 Koblov Alexander (Alexx2000@mail.ru) Copyright (C) 2012 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsToolbar; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ComCtrls, ExtCtrls, Buttons, fOptionsFrame, KASToolBar, KASToolItems, uFormCommands, uHotkeyManager, DCBasicTypes, fOptionsHotkeysEditHotkey, DCXmlConfig; type { TfrmOptionsToolbar } TfrmOptionsToolbar = class(TOptionsEditor) btnInsertButton: TButton; btnCloneButton: TButton; btnDeleteButton: TButton; btnOpenFile: TButton; btnEditHotkey: TButton; btnRemoveHotkey: TButton; cbInternalCommand: TComboBox; cbFlatButtons: TCheckBox; edtExternalParameters: TEdit; edtExternalCommand: TEdit; lblHotkeyValue: TLabel; edtStartPath: TEdit; edtToolTip: TEdit; gbGroupBox: TGroupBox; edtIconFileName: TEdit; lblInternalParameters: TLabel; lblBarSize: TLabel; lblBarSizeValue: TLabel; lblInternalCommand: TLabel; lblExternalCommand: TLabel; lblHotkey: TLabel; lblIconFile: TLabel; lblIconSize: TLabel; lblIconSizeValue: TLabel; lblExternalParameters: TLabel; lblStartPath: TLabel; lblToolTip: TLabel; edtInternalParameters: TMemo; OpenDialog: TOpenDialog; pnlEditControls: TPanel; pnlFullToolbarButtons: TPanel; pnlEditToolbar: TPanel; pnlToolbarButtons: TPanel; rgToolItemType: TRadioGroup; btnOpenIcon: TButton; sboxToolbars: TScrollBox; trbBarSize: TTrackBar; trbIconSize: TTrackBar; procedure btnEditHotkeyClick(Sender: TObject); procedure btnInsertButtonClick(Sender: TObject); procedure btnRemoveHotKeyClick(Sender: TObject); procedure btnCloneButtonClick(Sender: TObject); procedure btnDeleteButtonClick(Sender: TObject); procedure btnOpenFileClick(Sender: TObject); procedure cbInternalCommandSelect(Sender: TObject); procedure cbFlatButtonsChange(Sender: TObject); procedure edtIconFileNameChange(Sender: TObject); procedure ToolbarDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure ToolbarDragDrop(Sender, Source: TObject; X, Y: Integer); function ToolbarLoadButtonGlyph(ToolItem: TKASToolItem; iIconSize: Integer; clBackColor: TColor): TBitmap; procedure ToolbarToolButtonClick(Sender: TObject); procedure ToolbarToolButtonDragDrop(Sender, Source: TObject; X, Y: Integer); procedure ToolbarToolButtonDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean; NumberOfButton: Integer); procedure ToolbarToolButtonMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ToolbarToolButtonMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer; NumberOfButton: Integer); procedure ToolbarToolButtonMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure btnOpenIconClick(Sender: TObject); function ToolbarToolItemShortcutsHint(ToolItem: TKASNormalItem): String; procedure rgToolItemTypeSelectionChanged(Sender: TObject); procedure trbBarSizeChange(Sender: TObject); procedure trbIconSizeChange(Sender: TObject); private FCurrentButton: TKASToolButton; FEditForm: TfrmEditHotkey; FFormCommands: IFormCommands; FToolButtonMouseX, FToolButtonMouseY, FToolDragButtonNumber: Integer; // For dragging FUpdatingButtonType: Boolean; FUpdatingIconText: Boolean; function AddNewSubToolbar(ToolItem: TKASMenuItem): TKASToolBar; procedure ApplyEditControls; procedure CloseToolbarsBelowCurrentButton; procedure CloseToolbar(Index: Integer); function CreateToolbar(Items: TKASToolBarItems): TKASToolBar; class function FindHotkey(NormalItem: TKASNormalItem; Hotkeys: THotkeys): THotkey; class function FindHotkey(NormalItem: TKASNormalItem): THotkey; function GetTopToolbar: TKASToolBar; procedure LoadCurrentButton; procedure LoadToolbar(ToolBar: TKASToolBar; Config: TXmlConfig; RootNode: TXmlNode); procedure MarkCurrentToolbar; procedure PressButtonDown(Button: TKASToolButton); procedure UpdateIcon(Icon: String); protected procedure Init; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetShortcuts(NormalItem: TKASNormalItem): TDynamicStringArray; class function GetTitle: String; override; procedure SelectButton(ButtonNumber: Integer); end; implementation {$R *.lfm} uses LCLProc, LCLVersion, Toolwin, DCStrUtils, uGlobs, uLng, uOSForms, uDCUtils, uPixMapManager, uKASToolItemsExtended, fMain; const cHotKeyCommand = 'cm_ExecuteToolbarItem'; { TfrmOptionsToolbar } class function TfrmOptionsToolbar.GetIconIndex: Integer; begin Result := 32; end; class function TfrmOptionsToolbar.GetShortcuts(NormalItem: TKASNormalItem): TDynamicStringArray; var Hotkey: THotkey; begin Hotkey := FindHotkey(NormalItem); if Assigned(Hotkey) then Result := Hotkey.Shortcuts else Result := nil; end; class function TfrmOptionsToolbar.GetTitle: String; begin Result := rsOptionsEditorToolbar; end; function TfrmOptionsToolbar.GetTopToolbar: TKASToolBar; begin if sboxToolbars.ControlCount > 0 then Result := sboxToolbars.Controls[0] as TKASToolBar else Result := nil; end; procedure TfrmOptionsToolbar.Init; var ToolBar: TKASToolBar; begin FFormCommands := frmMain as IFormCommands; FFormCommands.GetCommandsList(cbInternalCommand.Items); cbInternalCommand.Sorted := True; FUpdatingButtonType := True; ParseLineToList(rsOptToolbarButtonType, rgToolItemType.Items); FUpdatingButtonType := False; FToolDragButtonNumber := -1; {$IF LCL_FULLVERSION >= 093100} rgToolItemType.OnSelectionChanged := @rgToolItemTypeSelectionChanged; {$ELSE} rgToolItemType.OnClick := @rgToolItemTypeSelectionChanged; {$ENDIF} ToolBar := CreateToolbar(nil); if Assigned(ToolBar) then // Put first one on top so that any other toolbars // created before Show are put below it. ToolBar.Top := 0; end; procedure TfrmOptionsToolbar.Load; var ToolBarNode: TXmlNode; ToolBar: TKASToolBar; begin trbBarSize.Position := gToolBarButtonSize div 2; trbIconSize.Position := gToolBarIconSize div 2; cbFlatButtons.Checked := gToolBarFlat; lblBarSizeValue.Caption := IntToStr(trbBarSize.Position*2); lblIconSizeValue.Caption := IntToStr(trbIconSize.Position*2); FCurrentButton := nil; CloseToolbarsBelowCurrentButton; ToolBar := GetTopToolbar; ToolBarNode := gConfig.FindNode(gConfig.RootNode, 'Toolbars/MainToolbar', False); LoadToolbar(ToolBar, gConfig, ToolBarNode); if ToolBar.ButtonCount > 0 then PressButtonDown(ToolBar.Buttons[0]); end; procedure TfrmOptionsToolbar.LoadCurrentButton; var ToolItem: TKASToolItem; NormalItem: TKASNormalItem; CommandItem: TKASCommandItem; ProgramItem: TKASProgramItem; EnableNormal, EnableCommand, EnableProgram: Boolean; ButtonTypeIndex: Integer = -1; ShortcutsHint: String; begin EnableNormal := False; EnableCommand := False; EnableProgram := False; DisableAutoSizing; try CloseToolbarsBelowCurrentButton; if Assigned(FCurrentButton) then begin ToolItem := FCurrentButton.ToolItem; if ToolItem is TKASSeparatorItem then ButtonTypeIndex := 0; if ToolItem is TKASNormalItem then begin EnableNormal := True; NormalItem := TKASNormalItem(ToolItem); FUpdatingIconText := True; edtIconFileName.Text := NormalItem.Icon; FUpdatingIconText := False; edtToolTip.Text := NormalItem.Hint; ShortcutsHint := NormalItem.GetShortcutsHint; if ShortcutsHint = '' then lblHotkeyValue.Caption := rsOptHotkeysNoHotkey else lblHotkeyValue.Caption := ShortcutsHint; btnRemoveHotkey.Enabled := ShortcutsHint <> ''; end; if ToolItem is TKASCommandItem then begin ButtonTypeIndex := 1; EnableCommand := True; CommandItem := TKASCommandItem(ToolItem); cbInternalCommand.Text := CommandItem.Command; SetStringsFromArray(edtInternalParameters.Lines, CommandItem.Params); end; if ToolItem is TKASProgramItem then begin ButtonTypeIndex := 2; EnableProgram := True; ProgramItem := TKASProgramItem(ToolItem); edtExternalCommand.Text := ProgramItem.Command; edtExternalParameters.Text := ProgramItem.Params; edtStartPath.Text := ProgramItem.StartPath; end; if ToolItem is TKASMenuItem then begin ButtonTypeIndex := 3; AddNewSubToolbar(TKASMenuItem(ToolItem)); end; end; FUpdatingButtonType := True; rgToolItemType.ItemIndex := ButtonTypeIndex; FUpdatingButtonType := False; lblIconFile.Visible := EnableNormal; edtIconFileName.Visible := EnableNormal; btnOpenIcon.Visible := EnableNormal; lblToolTip.Visible := EnableNormal; edtToolTip.Visible := EnableNormal; lblInternalCommand.Visible := EnableCommand; cbInternalCommand.Visible := EnableCommand; lblInternalParameters.Visible := EnableCommand; edtInternalParameters.Visible := EnableCommand; lblExternalCommand.Visible := EnableProgram; edtExternalCommand.Visible := EnableProgram; lblExternalParameters.Visible := EnableProgram; edtExternalParameters.Visible := EnableProgram; lblStartPath.Visible := EnableProgram; edtStartPath.Visible := EnableProgram; btnOpenFile.Visible := EnableProgram; lblHotkey.Visible := EnableNormal; lblHotkeyValue.Visible := EnableNormal; btnEditHotkey.Visible := EnableNormal; btnRemoveHotkey.Visible := EnableNormal; btnCloneButton.Visible := Assigned(FCurrentButton); btnDeleteButton.Visible := Assigned(FCurrentButton); rgToolItemType.Visible := Assigned(FCurrentButton); MarkCurrentToolbar; finally EnableAutoSizing; end; end; procedure TfrmOptionsToolbar.LoadToolbar(ToolBar: TKASToolBar; Config: TXmlConfig; RootNode: TXmlNode); var ToolBarLoader: TKASToolBarExtendedLoader; begin ToolBarLoader := TKASToolBarExtendedLoader.Create(FFormCommands); try if Assigned(RootNode) then ToolBar.LoadConfiguration(Config, RootNode, ToolBarLoader); finally ToolBarLoader.Free; end; end; procedure TfrmOptionsToolbar.MarkCurrentToolbar; var MarkToolBar, ToolBar, PrevToolBar: TKASToolBar; i: Integer; begin if Assigned(FCurrentButton) then MarkToolBar := FCurrentButton.ToolBar else MarkToolBar := GetTopToolbar; if Assigned(MarkToolBar) then begin DisableAutoSizing; try PrevToolBar := nil; for i := 0 to sboxToolbars.ControlCount - 1 do begin ToolBar := sboxToolbars.Controls[i] as TKASToolBar; if ToolBar = MarkToolBar then begin if Assigned(PrevToolBar) then begin PrevToolBar.EdgeBorders := [ebBottom]; PrevToolBar.EdgeInner := esLowered; PrevToolBar.EdgeOuter := esLowered; end; ToolBar.EdgeInner := esRaised; ToolBar.EdgeOuter := esRaised; ToolBar.EdgeBorders := [ebTop, ebBottom]; end else if PrevToolBar = MarkToolBar then begin ToolBar.EdgeInner := esLowered; ToolBar.EdgeOuter := esLowered; ToolBar.EdgeBorders := [ebTop]; end else begin ToolBar.EdgeInner := esNone; ToolBar.EdgeOuter := esNone; ToolBar.EdgeBorders := []; end; PrevToolBar := ToolBar; end; PrevToolBar.EdgeOuter := esRaised; PrevToolBar.EdgeBorders := [ebBottom]; finally EnableAutoSizing; end; end; end; procedure TfrmOptionsToolbar.PressButtonDown(Button: TKASToolButton); begin FUpdatingButtonType := True; Button.Click; FUpdatingButtonType := False; end; procedure TfrmOptionsToolbar.rgToolItemTypeSelectionChanged(Sender: TObject); var ToolBar: TKASToolBar; ToolItem: TKASToolItem = nil; NewButton: TKASToolButton; begin if not FUpdatingButtonType and Assigned(FCurrentButton) then begin case rgToolItemType.ItemIndex of 0: ToolItem := TKASSeparatorItem.Create; 1: ToolItem := TKASCommandItem.Create(FFormCommands); 2: ToolItem := TKASProgramItem.Create; 3: ToolItem := TKASMenuItem.Create; end; if Assigned(ToolItem) then begin ToolBar := FCurrentButton.ToolBar; // Copy what you can from previous button type. ToolItem.Assign(FCurrentButton.ToolItem); NewButton := ToolBar.InsertButton(FCurrentButton, ToolItem); ToolBar.RemoveButton(FCurrentButton); FCurrentButton := NewButton; PressButtonDown(NewButton); end; end; end; function TfrmOptionsToolbar.Save: TOptionsEditorSaveFlags; var ToolBarNode: TXmlNode; ToolBar: TKASToolBar; begin ApplyEditControls; gToolBarFlat := cbFlatButtons.Checked; gToolBarButtonSize := trbBarSize.Position * 2; gToolBarIconSize := trbIconSize.Position * 2; ToolBar := GetTopToolbar; if Assigned(ToolBar) then begin ToolBarNode := gConfig.FindNode(gConfig.RootNode, 'Toolbars/MainToolbar', True); gConfig.ClearNode(ToolBarNode); Toolbar.SaveConfiguration(gConfig, ToolBarNode); end; Result := []; end; procedure TfrmOptionsToolbar.btnOpenIconClick(Sender: TObject); var sFileName: String; begin sFileName := GetCmdDirFromEnvVar(edtIconFileName.Text); if ShowOpenIconDialog(Self, sFileName) then edtIconFileName.Text := sFileName; end; function TfrmOptionsToolbar.CreateToolbar(Items: TKASToolBarItems): TKASToolBar; begin Result := TKASToolBar.Create(sboxToolbars); Result.AutoSize := True; Result.Constraints.MinHeight := 24; Result.Flat := cbFlatButtons.Checked; Result.GlyphSize := trbIconSize.Position * 2; Result.RadioToolBar := True; Result.SetButtonSize(trbBarSize.Position * 2, trbBarSize.Position * 2); Result.ShowDividerAsButton := True; Result.OnDragOver := @ToolbarDragOver; Result.OnDragDrop := @ToolbarDragDrop; Result.OnLoadButtonGlyph := @ToolbarLoadButtonGlyph; Result.OnToolButtonClick := @ToolbarToolButtonClick; Result.OnToolButtonMouseDown := @ToolbarToolButtonMouseDown; Result.OnToolButtonMouseUp := @ToolbarToolButtonMouseUp; Result.OnToolButtonMouseMove := @ToolbarToolButtonMouseMove; Result.OnToolButtonDragDrop := @ToolbarToolButtonDragDrop; Result.OnToolButtonDragOver := @ToolbarToolButtonDragOver; Result.OnToolItemShortcutsHint := @ToolbarToolItemShortcutsHint; Result.BorderSpacing.Bottom := 2; Result.EdgeInner := esNone; Result.EdgeOuter := esNone; Result.EdgeBorders := []; Result.Top := MaxSmallInt; // So that it is put under all existing toolbars (because of Align=alTop). Result.UseItems(Items); Result.Parent := sboxToolbars; end; function TfrmOptionsToolbar.AddNewSubToolbar(ToolItem: TKASMenuItem): TKASToolBar; begin Result := CreateToolbar(ToolItem.SubItems); if Result.ButtonCount = 0 then Result.AddButton(TKASCommandItem.Create(FFormCommands)); end; procedure TfrmOptionsToolbar.ApplyEditControls; var ToolItem: TKASToolItem; NormalItem: TKASNormalItem; CommandItem: TKASCommandItem; ProgramItem: TKASProgramItem; begin if Assigned(FCurrentButton) then begin ToolItem := FCurrentButton.ToolItem; if ToolItem is TKASNormalItem then begin NormalItem := TKASNormalItem(ToolItem); NormalItem.Icon := edtIconFileName.Text; NormalItem.Hint := edtToolTip.Text; end; if ToolItem is TKASCommandItem then begin CommandItem := TKASCommandItem(ToolItem); CommandItem.Command := cbInternalCommand.Text; CommandItem.Params := GetArrayFromStrings(edtInternalParameters.Lines); end; if ToolItem is TKASProgramItem then begin ProgramItem := TKASProgramItem(ToolItem); ProgramItem.Command := edtExternalCommand.Text; ProgramItem.Params := edtExternalParameters.Text; ProgramItem.StartPath := edtStartPath.Text; end; end; end; (*Add new button on tool bar*) procedure TfrmOptionsToolbar.btnInsertButtonClick(Sender: TObject); var ToolBar: TKASToolBar; begin if Assigned(FCurrentButton) then begin ApplyEditControls; ToolBar := FCurrentButton.ToolBar; end else ToolBar := GetTopToolbar; if Assigned(ToolBar) then begin FCurrentButton := ToolBar.InsertButton(FCurrentButton, TKASCommandItem.Create(FFormCommands)); PressButtonDown(FCurrentButton); end; end; procedure TfrmOptionsToolbar.btnRemoveHotKeyClick(Sender: TObject); procedure RemoveHotkey(Hotkeys: THotkeys; NormalItem: TKASNormalItem); var Hotkey: THotkey; begin Hotkey := FindHotkey(NormalItem, Hotkeys); Hotkeys.Remove(Hotkey); end; var HMForm: THMForm; ToolItem: TKASToolItem; NormalItem: TKASNormalItem; I: Integer; begin ToolItem := FCurrentButton.ToolItem; if ToolItem is TKASNormalItem then begin NormalItem := TKASNormalItem(ToolItem); HMForm := HotMan.Forms.Find('Main'); if Assigned(HMForm) then begin RemoveHotkey(HMForm.Hotkeys, NormalItem); for I := 0 to HMForm.Controls.Count - 1 do RemoveHotkey(HMForm.Controls[I].Hotkeys, NormalItem); end; LoadCurrentButton; end; end; (*Clone selected button on tool bar*) procedure TfrmOptionsToolbar.btnCloneButtonClick(Sender: TObject); var SourceItem: TKASToolItem; Button: TKASToolButton; begin if Assigned(FCurrentButton) then begin ApplyEditControls; SourceItem := FCurrentButton.ToolItem; Button := FCurrentButton.ToolBar.InsertButton(FCurrentButton, SourceItem.Clone); PressButtonDown(Button); end; end; (*Remove current button*) procedure TfrmOptionsToolbar.btnDeleteButtonClick(Sender: TObject); var NextButton: Integer; ToolBar: TKASToolBar; begin if Assigned(FCurrentButton) then begin ToolBar := FCurrentButton.ToolBar; NextButton := FCurrentButton.Tag; Toolbar.RemoveButton(FCurrentButton); FCurrentButton := nil; if Toolbar.ButtonCount > 0 then begin // Select next button or the last one. if NextButton >= Toolbar.ButtonCount then NextButton := Toolbar.ButtonCount - 1; PressButtonDown(Toolbar.Buttons[NextButton]); end else begin LoadCurrentButton; end; end; end; procedure TfrmOptionsToolbar.btnEditHotkeyClick(Sender: TObject); var HMForm: THMForm; TemplateHotkey, Hotkey: THotkey; ToolItem: TKASToolItem; NormalItem: TKASNormalItem; AControls: TDynamicStringArray = nil; I: Integer; begin if not Assigned(FEditForm) then FEditForm := TfrmEditHotkey.Create(Self); ToolItem := FCurrentButton.ToolItem; if ToolItem is TKASNormalItem then begin NormalItem := TKASNormalItem(ToolItem); TemplateHotkey := THotkey.Create; try TemplateHotkey.Command := cHotKeyCommand; SetValue(TemplateHotkey.Params, 'ToolItemID', NormalItem.ID); HMForm := HotMan.Forms.Find('Main'); if Assigned(HMForm) then begin Hotkey := FindHotkey(NormalItem, HMForm.Hotkeys); if Assigned(Hotkey) then TemplateHotkey.Shortcuts := Hotkey.Shortcuts; for I := 0 to HMForm.Controls.Count - 1 do begin Hotkey := FindHotkey(NormalItem, HMForm.Controls[I].Hotkeys); if Assigned(Hotkey) then begin TemplateHotkey.Shortcuts := Hotkey.Shortcuts; AddString(AControls, HMForm.Controls[I].Name); end; end; end; if FEditForm.Execute(True, 'Main', cHotKeyCommand, TemplateHotkey, AControls, [ehoHideParams]) then begin LoadCurrentButton; end; finally TemplateHotkey.Free; end; end; end; procedure TfrmOptionsToolbar.btnOpenFileClick(Sender: TObject); begin OpenDialog.DefaultExt:= EmptyStr; OpenDialog.Filter:= EmptyStr; if OpenDialog.Execute then begin edtExternalCommand.Text := OpenDialog.FileName; edtStartPath.Text := ExtractFilePath(OpenDialog.FileName); edtIconFileName.Text := OpenDialog.FileName; edtToolTip.Text := ExtractOnlyFileName(OpenDialog.FileName); end; end; procedure TfrmOptionsToolbar.cbInternalCommandSelect(Sender: TObject); var Command: String; begin Command := cbInternalCommand.Items[cbInternalCommand.ItemIndex]; edtToolTip.Text := FFormCommands.GetCommandCaption(Command, cctLong); edtInternalParameters.HelpKeyword := '/cmds.html#' + Command; edtIconFileName.Text := UTF8LowerCase(Command); end; procedure TfrmOptionsToolbar.CloseToolbarsBelowCurrentButton; var CloseFrom: Integer = 1; i: Integer; begin if Assigned(FCurrentButton) then begin for i := 0 to sboxToolbars.ControlCount - 1 do if sboxToolbars.Controls[i] = FCurrentButton.ToolBar then begin CloseFrom := i + 1; Break; end; end; for i := sboxToolbars.ControlCount - 1 downto CloseFrom do CloseToolbar(i); end; procedure TfrmOptionsToolbar.CloseToolbar(Index: Integer); begin if Index > 0 then sboxToolbars.Controls[Index].Free; end; procedure TfrmOptionsToolbar.cbFlatButtonsChange(Sender: TObject); var i: Integer; ToolBar: TKASToolBar; begin for i := 0 to sboxToolbars.ControlCount - 1 do begin ToolBar := sboxToolbars.Controls[i] as TKASToolBar; ToolBar.Flat := cbFlatButtons.Checked; end; end; procedure TfrmOptionsToolbar.edtIconFileNameChange(Sender: TObject); begin if not FUpdatingIconText then UpdateIcon(edtIconFileName.Text); end; class function TfrmOptionsToolbar.FindHotkey(NormalItem: TKASNormalItem; Hotkeys: THotkeys): THotkey; var i: Integer; ToolItemID: String; begin for i := 0 to Hotkeys.Count - 1 do begin Result := Hotkeys.Items[i]; if (Result.Command = cHotKeyCommand) and (GetParamValue(Result.Params, 'ToolItemID', ToolItemID)) and (ToolItemID = NormalItem.ID) then Exit; end; Result := nil; end; class function TfrmOptionsToolbar.FindHotkey(NormalItem: TKASNormalItem): THotkey; var HMForm: THMForm; i: Integer; begin HMForm := HotMan.Forms.Find('Main'); if Assigned(HMForm) then begin Result := FindHotkey(NormalItem, HMForm.Hotkeys); if not Assigned(Result) then begin for i := 0 to HMForm.Controls.Count - 1 do begin Result := FindHotkey(NormalItem, HMForm.Controls[i].Hotkeys); if Assigned(Result) then Break; end; end; end else Result := nil; end; procedure TfrmOptionsToolbar.trbBarSizeChange(Sender: TObject); var ToolBar: TKASToolBar; i: Integer; begin DisableAutoSizing; try lblBarSizeValue.Caption := IntToStr(trbBarSize.Position*2); trbIconSize.Position := trbBarSize.Position - (trbBarSize.Position div 5); for i := 0 to sboxToolbars.ControlCount - 1 do begin ToolBar := sboxToolbars.Controls[i] as TKASToolBar; ToolBar.SetButtonSize(trbBarSize.Position * 2, trbBarSize.Position * 2); end; finally EnableAutoSizing; end; end; procedure TfrmOptionsToolbar.trbIconSizeChange(Sender: TObject); var ToolBar: TKASToolBar; i: Integer; begin DisableAutoSizing; try lblIconSizeValue.Caption := IntToStr(trbIconSize.Position * 2); for i := 0 to sboxToolbars.ControlCount - 1 do begin ToolBar := sboxToolbars.Controls[i] as TKASToolBar; ToolBar.GlyphSize := trbIconSize.Position * 2; end; finally EnableAutoSizing; end; end; procedure TfrmOptionsToolbar.UpdateIcon(Icon: String); var ToolItem: TKASToolItem; NormalItem: TKASNormalItem; begin // Refresh icon on the toolbar. ToolItem := FCurrentButton.ToolItem; if ToolItem is TKASNormalItem then begin NormalItem := TKASNormalItem(ToolItem); NormalItem.Icon := Icon; FCurrentButton.ToolBar.UpdateIcon(FCurrentButton); end; end; procedure TfrmOptionsToolbar.ToolbarDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin // Drag to a different toolbar. Accept := (Source is TKASToolButton) and (TKASToolButton(Source).ToolBar <> Sender); end; procedure TfrmOptionsToolbar.ToolbarDragDrop(Sender, Source: TObject; X, Y: Integer); var SourceButton: TKASToolButton; TargetToolbar: TKASToolBar; begin if Source is TKASToolButton then begin SourceButton := Source as TKASToolButton; TargetToolbar := Sender as TKASToolBar; if SourceButton.ToolBar <> TargetToolBar then SourceButton.ToolBar.MoveButton(SourceButton, TargetToolbar, nil); end; end; function TfrmOptionsToolbar.ToolbarLoadButtonGlyph(ToolItem: TKASToolItem; iIconSize: Integer; clBackColor: TColor): TBitmap; begin if ToolItem is TKASSeparatorItem then // Paint 'separator' icon begin Result := TBitmap.Create; Result.Transparent := True; Result.TransparentColor := clFuchsia; Result.SetSize(iIconSize, iIconSize); Result.Canvas.Brush.Color:= clFuchsia; Result.Canvas.FillRect(Rect(0,0,iIconSize,iIconSize)); Result.Canvas.Brush.Color:= clBtnText; Result.Canvas.RoundRect(Rect(Round(iIconSize * 0.4), 2, Round(iIconSize * 0.6), iIconSize - 2),iIconSize div 8,iIconSize div 4); end else if ToolItem is TKASNormalItem then Result := PixMapManager.LoadBitmapEnhanced(TKASNormalItem(ToolItem).Icon, iIconSize, True, clBackColor) else Result := nil; end; (*Select button on panel*) procedure TfrmOptionsToolbar.ToolbarToolButtonClick(Sender: TObject); var ClickedButton: TKASToolButton; begin ClickedButton := Sender as TKASToolButton; if not FUpdatingButtonType then ApplyEditControls; if Assigned(FCurrentButton) then begin // If current toolbar has changed depress the previous button. if FCurrentButton.ToolBar <> ClickedButton.ToolBar then FCurrentButton.Down := False; end; FCurrentButton := ClickedButton; LoadCurrentButton; end; procedure TfrmOptionsToolbar.ToolbarToolButtonDragDrop(Sender, Source: TObject; X, Y: Integer); var SourceButton, TargetButton: TKASToolButton; begin if Source is TKASToolButton then begin SourceButton := Source as TKASToolButton; TargetButton := Sender as TKASToolButton; // Drop to a different toolbar. if SourceButton.ToolBar <> TargetButton.ToolBar then begin SourceButton.ToolBar.MoveButton(SourceButton, TargetButton.ToolBar, TargetButton); end; end; end; (* Move button if it is dragged*) procedure TfrmOptionsToolbar.ToolbarToolButtonDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean; NumberOfButton: Integer); var SourceButton, TargetButton: TKASToolButton; begin if Source is TKASToolButton then begin SourceButton := Source as TKASToolButton; TargetButton := Sender as TKASToolButton; // Move on the same toolbar. if SourceButton.ToolBar = TargetButton.ToolBar then begin if FToolDragButtonNumber <> TargetButton.Tag then begin SourceButton.ToolBar.MoveButton(SourceButton.Tag, TargetButton.Tag); FToolDragButtonNumber := TargetButton.Tag; Accept := True; end; end; end; end; (* Do not start drag in here, because oterwise button wouldn't be pushed down*) procedure TfrmOptionsToolbar.ToolbarToolButtonMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin FToolButtonMouseX := X; FToolButtonMouseY := Y; end; (* Start dragging only if mbLeft if pressed and mouse moved.*) procedure TfrmOptionsToolbar.ToolbarToolButtonMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer; NumberOfButton: Integer); var Button: TKASToolButton; begin if Sender is TKASToolButton then begin if (ssLeft in Shift) and (FToolDragButtonNumber = -1) then if (abs(FToolButtonMouseX-X)>10) or (abs(FToolButtonMouseY-Y)>10) then begin Button := TKASToolButton(Sender); FToolDragButtonNumber := NumberOfButton; Button.Toolbar.Buttons[NumberOfButton].BeginDrag(False, 5); end; end; end; (* End button drag*) procedure TfrmOptionsToolbar.ToolbarToolButtonMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin FToolDragButtonNumber := -1; end; function TfrmOptionsToolbar.ToolbarToolItemShortcutsHint(ToolItem: TKASNormalItem): String; begin Result := ShortcutsToText(GetShortcuts(ToolItem)); end; procedure TfrmOptionsToolbar.SelectButton(ButtonNumber: Integer); var ToolBar: TKASToolBar; begin if sboxToolbars.ControlCount > 0 then begin ToolBar := sboxToolbars.Controls[0] as TKASToolBar; if (ButtonNumber >= 0) and (ButtonNumber < Toolbar.ButtonCount) then begin FCurrentButton := Toolbar.Buttons[ButtonNumber]; PressButtonDown(FCurrentButton); end; end; end; end. doublecmd-0.5.8/src/frames/foptionsdragdrop.lrt0000644000175000017500000000013212020403374020650 0ustar alexxalexxTFRMOPTIONSDRAGDROP.CBSHOWCONFIRMATIONDIALOG.CAPTION=&Show confirmation dialog after drop doublecmd-0.5.8/src/frames/foptionsplugins.pas0000644000175000017500000006101512132053450020520 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Plugins options page Copyright (C) 2006-2013 Alexander Koblov (alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsPlugins; {$mode objfpc}{$H+} interface uses Classes, SysUtils, ComCtrls, StdCtrls, Grids, Buttons, fOptionsFrame, uDSXModule, uWCXModule, uWDXModule, uWFXmodule, uWLXModule, Controls; type { TfrmOptionsPlugins } TfrmOptionsPlugins = class(TOptionsEditor) btnAddPlugin: TBitBtn; btnConfigPlugin: TBitBtn; btnEnablePlugin: TBitBtn; btnRemovePlugin: TBitBtn; btnTweakPlugin: TBitBtn; lblDSXDescription: TLabel; lblWCXDescription: TLabel; lblWDXDescription: TLabel; lblWFXDescription: TLabel; lblWLXDescription: TLabel; pcPluginsTypes: TPageControl; stgPlugins: TStringGrid; tsDSX: TTabSheet; tsWCX: TTabSheet; tsWDX: TTabSheet; tsWFX: TTabSheet; tsWLX: TTabSheet; procedure btnConfigPluginClick(Sender: TObject); procedure btnEnablePluginClick(Sender: TObject); procedure btnRemovePluginClick(Sender: TObject); procedure btnTweakPluginClick(Sender: TObject); procedure pcPluginsTypesChange(Sender: TObject); procedure stgPluginsBeforeSelection(Sender: TObject; aCol, aRow: Integer); procedure btnDSXAddClick(Sender: TObject); procedure btnWDXAddClick(Sender: TObject); procedure btnWFXAddClick(Sender: TObject); procedure btnWLXAddClick(Sender: TObject); procedure btnWCXAddClick(Sender: TObject); procedure stgPluginsMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure stgPluginsMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure stgPluginsSelection(Sender: TObject; aCol, aRow: Integer); procedure tsDSXShow(Sender: TObject); procedure tsWCXShow(Sender: TObject); procedure tsWDXShow(Sender: TObject); procedure tsWFXShow(Sender: TObject); procedure tsWLXShow(Sender: TObject); private FMoveRow: Boolean; FSourceRow: Integer; protected procedure Init; override; procedure Done; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; var tmpDSXPlugins: TDSXModuleList; tmpWCXPlugins: TWCXModuleList; tmpWDXPlugins: TWDXModuleList; tmpWFXPlugins: TWFXModuleList; tmpWLXPlugins: TWLXModuleList; implementation {$R *.lfm} uses LCLProc, Forms, Dialogs, StrUtils, uLng, uGlobs, uDCUtils, uDebug, uShowMsg, uTypes, fTweakPlugin, dmCommonData, DCStrUtils, uDefaultPlugins; { TfrmOptionsPlugins } procedure TfrmOptionsPlugins.pcPluginsTypesChange(Sender: TObject); begin if stgPlugins.RowCount > stgPlugins.FixedRows then stgPluginsBeforeSelection(stgPlugins, 0, stgPlugins.FixedRows); end; procedure TfrmOptionsPlugins.btnEnablePluginClick(Sender: TObject); var sExt, sExts: String; iPluginIndex: Integer; bEnabled: Boolean; begin if stgPlugins.Row < stgPlugins.FixedRows then Exit; if pcPluginsTypes.ActivePage.Name = 'tsWCX' then begin sExts:= stgPlugins.Cells[2, stgPlugins.Row]; sExt:= Copy2SpaceDel(sExts); repeat iPluginIndex:= tmpWCXPlugins.Find(stgPlugins.Cells[3, stgPlugins.Row], sExt); if iPluginIndex <> -1 then begin bEnabled:= not tmpWCXPlugins.Enabled[iPluginIndex]; tmpWCXPlugins.Enabled[iPluginIndex]:= bEnabled; end; sExt:= Copy2SpaceDel(sExts); until sExt = ''; stgPlugins.Cells[0, stgPlugins.Row]:= IfThen(bEnabled, string('+'), string('-')); btnEnablePlugin.Caption:= IfThen(bEnabled, rsOptDisable, rsOptEnable); end else if pcPluginsTypes.ActivePage.Name = 'tsWFX' then begin bEnabled:= not tmpWFXPlugins.Enabled[stgPlugins.Row - stgPlugins.FixedRows]; stgPlugins.Cells[0, stgPlugins.Row]:= IfThen(bEnabled, string('+'), string('-')); tmpWFXPlugins.Enabled[stgPlugins.Row - stgPlugins.FixedRows]:= bEnabled; btnEnablePlugin.Caption:= IfThen(bEnabled, rsOptDisable, rsOptEnable); end else if pcPluginsTypes.ActivePage.Name = 'tsWLX' then begin with tmpWLXPlugins.GetWlxModule(stgPlugins.Row - stgPlugins.FixedRows) do begin Enabled:= not Enabled; stgPlugins.Cells[0, stgPlugins.Row]:= IfThen(Enabled, string('+'), string('-')); btnEnablePlugin.Caption:= IfThen(Enabled, rsOptDisable, rsOptEnable); end; end; end; procedure TfrmOptionsPlugins.btnConfigPluginClick(Sender: TObject); var WCXmodule: TWCXmodule; WFXmodule: TWFXmodule; PluginFileName: String; begin if stgPlugins.Row < stgPlugins.FixedRows then Exit; // no plugins PluginFileName := GetCmdDirFromEnvVar(stgPlugins.Cells[3, stgPlugins.Row]); if pcPluginsTypes.ActivePage.Name = 'tsWCX' then begin WCXmodule := TWCXmodule.Create; DCDebug('TWCXmodule created'); try if WCXmodule.LoadModule(PluginFileName) then begin DCDebug('WCXModule Loaded'); WCXmodule.VFSConfigure(stgPlugins.Handle); DCDebug('Dialog executed'); WCXModule.UnloadModule; DCDebug('WCX Module Unloaded'); end else msgError(rsMsgErrEOpen + ': ' + PluginFileName); finally WCXmodule.Free; DCDebug('WCX Freed'); end; end else if pcPluginsTypes.ActivePage.Name = 'tsWFX' then begin WFXmodule := TWFXmodule.Create; DCDebug('TWFXmodule created'); try if WFXmodule.LoadModule(PluginFileName) then begin DCDebug('WFXModule Loaded'); WfxModule.VFSInit(0); WFXmodule.VFSConfigure(stgPlugins.Handle); DCDebug('Dialog executed'); WFXModule.UnloadModule; DCDebug('WFX Module Unloaded'); end else msgError(rsMsgErrEOpen + ': ' + PluginFileName); finally WFXmodule.Free; DCDebug('WFX Freed'); end; end; end; procedure TfrmOptionsPlugins.btnRemovePluginClick(Sender: TObject); var sExt, sExts: String; iPluginIndex: Integer; begin if stgPlugins.Row < stgPlugins.FixedRows then Exit; // no plugins if pcPluginsTypes.ActivePage.Name = 'tsDSX' then begin tmpDSXPlugins.DeleteItem(stgPlugins.Row - stgPlugins.FixedRows); stgPlugins.DeleteColRow(False, stgPlugins.Row); end else if pcPluginsTypes.ActivePage.Name = 'tsWCX' then begin sExts:= stgPlugins.Cells[2, stgPlugins.Row]; sExt:= Copy2SpaceDel(sExts); repeat iPluginIndex:= tmpWCXPlugins.Find(stgPlugins.Cells[3, stgPlugins.Row], sExt); if iPluginIndex <> -1 then tmpWCXPlugins.Delete(iPluginIndex); sExt:= Copy2SpaceDel(sExts); until sExt = ''; stgPlugins.DeleteColRow(False, stgPlugins.Row); end else if pcPluginsTypes.ActivePage.Name = 'tsWDX' then begin tmpWDXPlugins.DeleteItem(stgPlugins.Row - stgPlugins.FixedRows); stgPlugins.DeleteColRow(False, stgPlugins.Row); end else if pcPluginsTypes.ActivePage.Name = 'tsWFX' then begin tmpWFXPlugins.Delete(stgPlugins.Row - stgPlugins.FixedRows); stgPlugins.DeleteColRow(False, stgPlugins.Row); end else if pcPluginsTypes.ActivePage.Name = 'tsWLX' then begin tmpWLXPlugins.DeleteItem(stgPlugins.Row - stgPlugins.FixedRows); stgPlugins.DeleteColRow(False, stgPlugins.Row); end end; procedure TfrmOptionsPlugins.btnTweakPluginClick(Sender: TObject); var ptPluginType: TPluginType; iPluginIndex: Integer; begin iPluginIndex:= stgPlugins.Row - stgPlugins.FixedRows; if pcPluginsTypes.ActivePage.Name = 'tsDSX' then ptPluginType:= ptDSX else if pcPluginsTypes.ActivePage.Name = 'tsWCX' then begin ptPluginType:= ptWCX; // get plugin index iPluginIndex:= tmpWCXPlugins.Find(stgPlugins.Cells[3, stgPlugins.Row], Copy2Space(stgPlugins.Cells[2, stgPlugins.Row])); end else if pcPluginsTypes.ActivePage.Name = 'tsWDX' then ptPluginType:= ptWDX else if pcPluginsTypes.ActivePage.Name = 'tsWFX' then ptPluginType:= ptWFX else if pcPluginsTypes.ActivePage.Name = 'tsWLX' then ptPluginType:= ptWLX; if iPluginIndex < 0 then Exit; if ShowTweakPluginDlg(ptPluginType, iPluginIndex) then pcPluginsTypes.ActivePage.OnShow(pcPluginsTypes.ActivePage); // update info in plugin list end; procedure TfrmOptionsPlugins.stgPluginsBeforeSelection(Sender: TObject; aCol, aRow: Integer); begin if stgPlugins.Cells[0, aRow] = '+' then btnEnablePlugin.Caption:= rsOptDisable else if stgPlugins.Cells[0, aRow] = '-' then btnEnablePlugin.Caption:= rsOptEnable; btnEnablePlugin.Enabled:= (stgPlugins.Cells[0, aRow] <> ''); end; { DSX plugins } procedure TfrmOptionsPlugins.btnDSXAddClick(Sender: TObject); var I, J: Integer; sFileName, sPluginName : String; begin dmComData.OpenDialog.Filter := 'Search plugins (*.dsx)|*.dsx'; if dmComData.OpenDialog.Execute then begin sFileName := dmComData.OpenDialog.FileName; if not CheckPlugin(sFileName) then Exit; sPluginName := ExtractOnlyFileName(sFileName); I:= tmpDSXPlugins.Add(sPluginName, sFileName, EmptyStr); if not tmpDSXPlugins.LoadModule(sPluginName) then begin MessageDlg(Application.Title, rsMsgInvalidPlugin, mtError, [mbOK], 0, mbOK); tmpDSXPlugins.DeleteItem(I); Exit; end; stgPlugins.RowCount:= stgPlugins.RowCount + 1; J:= stgPlugins.RowCount - stgPlugins.FixedRows; stgPlugins.Cells[1, J]:= tmpDSXPlugins.GetDsxModule(I).Name; stgPlugins.Cells[2, J]:= tmpDSXPlugins.GetDsxModule(I).Descr; stgPlugins.Cells[3, J]:= SetCmdDirAsEnvVar(tmpDSXPlugins.GetDsxModule(I).FileName); end; end; procedure TfrmOptionsPlugins.tsDSXShow(Sender: TObject); var i:integer; begin btnAddPlugin.OnClick:= @btnDSXAddClick; stgPlugins.RowCount:= tmpDSXPlugins.Count + stgPlugins.FixedRows; for i:=0 to tmpDSXPlugins.Count-1 do begin stgPlugins.Cells[1, I + stgPlugins.FixedRows]:= tmpDSXPlugins.GetDsxModule(i).Name; stgPlugins.Cells[2, I + stgPlugins.FixedRows]:= tmpDSXPlugins.GetDsxModule(i).Descr; stgPlugins.Cells[3, I + stgPlugins.FixedRows]:= SetCmdDirAsEnvVar(tmpDSXPlugins.GetDsxModule(i).FileName); end; end; { WCX plugins } procedure TfrmOptionsPlugins.btnWCXAddClick(Sender: TObject); var J, iPluginIndex, iFlags: Integer; sExt : String; sExts : String; sExtsTemp : String; sFileName : String; sPluginName : String; sAlreadyAssignedExts : String; WCXmodule : TWCXmodule; begin dmComData.OpenDialog.Filter := Format('Archive plugins (%s)|%s', [WcxMask, WcxMask]); if dmComData.OpenDialog.Execute then begin sFileName := dmComData.OpenDialog.FileName; if not CheckPlugin(sFileName) then Exit; WCXmodule := TWCXmodule.Create; try if not WCXmodule.LoadModule(sFileName) then begin MessageDlg(Application.Title, rsMsgInvalidPlugin, mtError, [mbOK], 0, mbOK); Exit; end; iFlags := WCXmodule.GetPluginCapabilities; WCXModule.UnloadModule; sPluginName := SetCmdDirAsEnvVar(sFileName); if InputQuery(rsOptEnterExt, Format(rsOptAssocPluginWith, [sFileName]), sExts) then begin sExtsTemp := sExts; sExts := ''; sAlreadyAssignedExts := ''; sExt:= Copy2SpaceDel(sExtsTemp); repeat iPluginIndex:= tmpWCXPlugins.Find(sPluginName, sExt); if iPluginIndex <> -1 then begin AddStrWithSep(sAlreadyAssignedExts, sExt); end else begin tmpWCXPlugins.AddObject(sExt + '=' + IntToStr(iFlags) + ',' + sPluginName, TObject(True)); AddStrWithSep(sExts, sExt); end; sExt:= Copy2SpaceDel(sExtsTemp); until sExt = ''; if sAlreadyAssignedExts <> '' then MessageDlg(Format(rsOptPluginAlreadyAssigned, [sFileName]) + LineEnding + sAlreadyAssignedExts, mtWarning, [mbOK], 0); if sExts <> '' then begin stgPlugins.RowCount:= stgPlugins.RowCount + 1; // Add new row J:= stgPlugins.RowCount - 1; stgPlugins.Cells[0, J]:= '+'; // Enabled stgPlugins.Cells[1, J]:= ExtractOnlyFileName(sFileName); stgPlugins.Cells[2, J]:= sExts; stgPlugins.Cells[3, J]:= sPluginName; end; end; finally WCXmodule.Free; end; end; end; procedure TfrmOptionsPlugins.stgPluginsMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var SourceCol: Integer; begin if (Button = mbLeft) then begin stgPlugins.MouseToCell(X, Y, SourceCol, FSourceRow); if (FSourceRow > 0) then begin FMoveRow := True; end; end; end; procedure TfrmOptionsPlugins.stgPluginsMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (Button = mbLeft) then begin FMoveRow := False; end; end; procedure TfrmOptionsPlugins.stgPluginsSelection(Sender: TObject; aCol, aRow: Integer); begin if FMoveRow and (aRow <> FSourceRow) then with stgPlugins do begin if pcPluginsTypes.ActivePage.Name = 'tsDSX' then begin tmpDSXPlugins.Exchange(FSourceRow - FixedRows, aRow - FixedRows); FSourceRow := aRow; tsDSXShow(stgPlugins); end else if pcPluginsTypes.ActivePage.Name = 'tsWCX' then begin tmpWCXPlugins.Exchange(FSourceRow - FixedRows, aRow - FixedRows); FSourceRow := aRow; tsWCXShow(stgPlugins); end else if pcPluginsTypes.ActivePage.Name = 'tsWDX' then begin tmpWDXPlugins.Exchange(FSourceRow - FixedRows, aRow - FixedRows); FSourceRow := aRow; tsWDXShow(stgPlugins); end else if pcPluginsTypes.ActivePage.Name = 'tsWFX' then begin tmpWFXPlugins.Exchange(FSourceRow - FixedRows, aRow - FixedRows); FSourceRow := aRow; tsWFXShow(stgPlugins); end else if pcPluginsTypes.ActivePage.Name = 'tsWLX' then begin tmpWLXPlugins.Exchange(FSourceRow - FixedRows, aRow - FixedRows); FSourceRow := aRow; tsWLXShow(stgPlugins); end; end; end; procedure TfrmOptionsPlugins.tsWCXShow(Sender: TObject); var I, iIndex: Integer; sFileName, sExt: String; iRow: Integer; begin btnAddPlugin.OnClick:= @btnWCXAddClick; stgPlugins.RowCount:= stgPlugins.FixedRows; // Clear column with extensions stgPlugins.Clean(2, stgPlugins.FixedRows, 2, stgPlugins.RowCount, [gzNormal]); for I := 0 to tmpWCXPlugins.Count - 1 do begin // get associated extension sExt := tmpWCXPlugins.Ext[I]; //get file name sFileName:= tmpWCXPlugins.FileName[I]; iIndex:= stgPlugins.Cols[3].IndexOf(sFileName); if iIndex < 0 then begin stgPlugins.RowCount:= stgPlugins.RowCount + 1; iRow := stgPlugins.RowCount - 1; stgPlugins.Cells[1, iRow]:= ExtractOnlyFileName(sFileName); stgPlugins.Cells[2, iRow]:= sExt + #32; if tmpWCXPlugins.Enabled[I] then // enabled begin stgPlugins.Cells[3, iRow]:= sFileName; stgPlugins.Cells[0, iRow]:= '+'; end else // disabled begin stgPlugins.Cells[3, iRow]:= sFileName; stgPlugins.Cells[0, iRow]:= '-'; end; end else begin stgPlugins.Cells[2, iIndex]:= stgPlugins.Cells[2, iIndex] + sExt + #32; end; end; if stgPlugins.RowCount > stgPlugins.FixedRows then stgPluginsBeforeSelection(stgPlugins, 0, stgPlugins.FixedRows); end; { WDX plugins } procedure TfrmOptionsPlugins.btnWDXAddClick(Sender: TObject); var I, J: Integer; sFileName, sPluginName : String; begin dmComData.OpenDialog.Filter := Format('Content plugins (%s;*.lua)|%s;*.lua', [WdxMask, WdxMask]); if dmComData.OpenDialog.Execute then begin sFileName := dmComData.OpenDialog.FileName; if not (StrEnds(sFileName, '.lua') or CheckPlugin(sFileName)) then Exit; sPluginName := ExtractOnlyFileName(sFileName); I:= tmpWDXPlugins.Add(sPluginName, sFileName, EmptyStr); if not tmpWDXPlugins.LoadModule(sPluginName) then begin MessageDlg(Application.Title, rsMsgInvalidPlugin, mtError, [mbOK], 0, mbOK); tmpWDXPlugins.DeleteItem(I); Exit; end; tmpWDXPlugins.GetWdxModule(sPluginName).DetectStr:= tmpWDXPlugins.GetWdxModule(sPluginName).CallContentGetDetectString; stgPlugins.RowCount:= stgPlugins.RowCount + 1; J:= stgPlugins.RowCount - 1; stgPlugins.Cells[1, J]:= tmpWDXPlugins.GetWdxModule(I).Name; stgPlugins.Cells[2, J]:= tmpWDXPlugins.GetWdxModule(I).DetectStr; stgPlugins.Cells[3, J]:= SetCmdDirAsEnvVar(tmpWDXPlugins.GetWdxModule(I).FileName); end; end; procedure TfrmOptionsPlugins.tsWDXShow(Sender: TObject); var i:integer; begin btnAddPlugin.OnClick:= @btnWDXAddClick; stgPlugins.RowCount:= tmpWDXPlugins.Count + stgPlugins.FixedRows; for i:=0 to tmpWDXPlugins.Count-1 do begin stgPlugins.Cells[1, I + stgPlugins.FixedRows]:= tmpWDXPlugins.GetWdxModule(i).Name; stgPlugins.Cells[2, I + stgPlugins.FixedRows]:= tmpWDXPlugins.GetWdxModule(i).DetectStr; stgPlugins.Cells[3, I + stgPlugins.FixedRows]:= SetCmdDirAsEnvVar(tmpWDXPlugins.GetWdxModule(i).FileName); end; end; { WFX plugins } procedure TfrmOptionsPlugins.btnWFXAddClick(Sender: TObject); var I, J: Integer; WfxModule : TWFXmodule; sFileName, sPluginName, sRootName: UTF8String; begin dmComData.OpenDialog.Filter := Format('File system plugins (%s)|%s', [WfxMask, WfxMask]); if dmComData.OpenDialog.Execute then begin sFileName:= dmComData.OpenDialog.FileName; DCDebug('Dialog executed'); if not CheckPlugin(sFileName) then Exit; WfxModule:= TWfxModule.Create; DCDebug('TWFXmodule created'); try if not WfxModule.LoadModule(sFileName) then begin DCDebug('Module not loaded'); MessageDlg(Application.Title, rsMsgInvalidPlugin, mtError, [mbOK], 0, mbOK); Exit; end; DCDebug('WFXModule Loaded'); sRootName:= WfxModule.VFSRootName; if Length(sRootName) = 0 then begin DCDebug('WFX alternate name'); sRootName:= ExtractOnlyFileName(sFileName); end; sPluginName:= sRootName + '=' + SetCmdDirAsEnvVar(sFileName); WFXModule.UnloadModule; DCDebug('WFX Module Unloaded'); DCDebug('WFX sPluginName=' + sPluginName); I:= tmpWFXPlugins.AddObject(sPluginName, TObject(True)); stgPlugins.RowCount:= tmpWFXPlugins.Count + 1; J:= stgPlugins.RowCount - 1; stgPlugins.Cells[0, J]:= '+'; stgPlugins.Cells[1, J]:= tmpWFXPlugins.Name[I]; stgPlugins.Cells[2, J]:= EmptyStr; stgPlugins.Cells[3, J]:= tmpWFXPlugins.FileName[I]; DCDebug('WFX Item Added'); finally WFXmodule.Free; DCDebug('WFX Freed'); end; end; end; procedure TfrmOptionsPlugins.tsWFXShow(Sender: TObject); var I, iRow: Integer; begin btnAddPlugin.OnClick:= @btnWFXAddClick; stgPlugins.RowCount:= tmpWFXPlugins.Count + stgPlugins.FixedRows; for I:= 0 to tmpWFXPlugins.Count - 1 do begin iRow := I + stgPlugins.FixedRows; if tmpWFXPlugins.Enabled[I] then begin stgPlugins.Cells[1, iRow]:= tmpWFXPlugins.Name[I]; stgPlugins.Cells[3, iRow]:= tmpWFXPlugins.FileName[I]; stgPlugins.Cells[0, iRow]:= '+'; end else begin stgPlugins.Cells[1, iRow]:= tmpWFXPlugins.Name[I]; stgPlugins.Cells[3, iRow]:= tmpWFXPlugins.FileName[I]; stgPlugins.Cells[0, iRow]:= '-'; end; stgPlugins.Cells[2, iRow]:= ''; end; end; { WLX Plugins } procedure TfrmOptionsPlugins.btnWLXAddClick(Sender: TObject); var I, J: Integer; sFileName, sPluginName : String; begin dmComData.OpenDialog.Filter:= Format('Viewer plugins (%s)|%s', [WlxMask, WlxMask]); if dmComData.OpenDialog.Execute then begin sFileName := dmComData.OpenDialog.FileName; if not CheckPlugin(sFileName) then Exit; sPluginName := ExtractOnlyFileName(sFileName); I:= tmpWLXPlugins.Add(sPluginName, sFileName, EmptyStr); if not tmpWLXPlugins.LoadModule(sPluginName) then begin MessageDlg(Application.Title, rsMsgInvalidPlugin, mtError, [mbOK], 0, mbOK); tmpWLXPlugins.DeleteItem(I); Exit; end; tmpWLXPlugins.GetWlxModule(sPluginName).DetectStr:= tmpWLXPlugins.GetWlxModule(sPluginName).CallListGetDetectString; stgPlugins.RowCount:= stgPlugins.RowCount + 1; J:= stgPlugins.RowCount - 1; stgPlugins.Cells[0, J]:= '+'; stgPlugins.Cells[1, J]:= tmpWLXPlugins.GetWlxModule(I).Name; stgPlugins.Cells[2, J]:= tmpWLXPlugins.GetWlxModule(I).DetectStr; stgPlugins.Cells[3, J]:= SetCmdDirAsEnvVar(tmpWLXPlugins.GetWlxModule(I).FileName); end; end; procedure TfrmOptionsPlugins.tsWLXShow(Sender: TObject); var i: Integer; begin btnAddPlugin.OnClick:= @btnWLXAddClick; stgPlugins.RowCount:= tmpWLXPlugins.Count + stgPlugins.FixedRows; for i:=0 to tmpWLXPlugins.Count-1 do begin stgPlugins.Cells[0, I + stgPlugins.FixedRows]:= IfThen(tmpWLXPlugins.GetWlxModule(i).Enabled, '+', '-'); stgPlugins.Cells[1, I + stgPlugins.FixedRows]:= tmpWLXPlugins.GetWlxModule(i).Name; stgPlugins.Cells[2, I + stgPlugins.FixedRows]:= tmpWLXPlugins.GetWlxModule(i).DetectStr; stgPlugins.Cells[3, I + stgPlugins.FixedRows]:= SetCmdDirAsEnvVar(tmpWLXPlugins.GetWlxModule(i).FileName); end; end; class function TfrmOptionsPlugins.GetIconIndex: Integer; begin Result := 6; end; class function TfrmOptionsPlugins.GetTitle: String; begin Result := rsOptionsEditorPlugins; end; procedure TfrmOptionsPlugins.Init; begin // Localize plugins. stgPlugins.Columns.Items[0].Title.Caption := rsOptPluginsActive; stgPlugins.Columns.Items[1].Title.Caption := rsOptPluginsName; stgPlugins.Columns.Items[2].Title.Caption := rsOptPluginsRegisteredFor; stgPlugins.Columns.Items[3].Title.Caption := rsOptPluginsFileName; // create plugins lists tmpDSXPlugins:= TDSXModuleList.Create; tmpWCXPlugins:= TWCXModuleList.Create; tmpWDXPlugins:= TWDXModuleList.Create; tmpWFXPlugins:= TWFXModuleList.Create; tmpWLXPlugins:= TWLXModuleList.Create; end; procedure TfrmOptionsPlugins.Done; begin FreeThenNil(tmpDSXPlugins); FreeThenNil(tmpWCXPlugins); FreeThenNil(tmpWDXPlugins); FreeThenNil(tmpWFXPlugins); FreeThenNil(tmpWLXPlugins); end; procedure TfrmOptionsPlugins.Load; begin { Fill plugins lists } tmpDSXPlugins.Assign(gDSXPlugins); tmpWCXPlugins.Assign(gWCXPlugins); tmpWDXPlugins.Assign(gWDXPlugins); tmpWFXPlugins.Assign(gWFXPlugins); tmpWLXPlugins.Assign(gWLXPlugins); // Update selected page. if pcPluginsTypes.ActivePage = tsDSX then tsDSXShow(Self) else if pcPluginsTypes.ActivePage = tsWCX then tsWCXShow(Self) else if pcPluginsTypes.ActivePage = tsWDX then tsWDXShow(Self) else if pcPluginsTypes.ActivePage = tsWFX then tsWFXShow(Self) else if pcPluginsTypes.ActivePage = tsWLX then tsWLXShow(Self); end; function TfrmOptionsPlugins.Save: TOptionsEditorSaveFlags; begin { Set plugins lists } gDSXPlugins.Assign(tmpDSXPlugins); gWCXPlugins.Assign(tmpWCXPlugins); gWDXPlugins.Assign(tmpWDXPlugins); gWFXPlugins.Assign(tmpWFXPlugins); gWLXPlugins.Assign(tmpWLXPlugins); Result := []; end; end. doublecmd-0.5.8/src/frames/foptionsterminal.lrt0000644000175000017500000000016112020403374020663 0ustar alexxalexxTFRMOPTIONSTERMINAL.LBLRUNINTERM.CAPTION=Run in &terminal: TFRMOPTIONSTERMINAL.LBLRUNTERM.CAPTION=Run t&erminal: doublecmd-0.5.8/src/frames/foptionsdriveslistbutton.lrt0000644000175000017500000000040512020403374022475 0ustar alexxalexxTFRMOPTIONSDRIVESLISTBUTTON.GBDRIVESLIST.CAPTION=Drives list TFRMOPTIONSDRIVESLISTBUTTON.CBSHOWLABEL.CAPTION=Show &label TFRMOPTIONSDRIVESLISTBUTTON.CBSHOWFILESYSTEM.CAPTION=Show &file system TFRMOPTIONSDRIVESLISTBUTTON.CBSHOWFREESPACE.CAPTION=Show fr&ee space doublecmd-0.5.8/src/frames/foptionseditorcolors.pas0000644000175000017500000006343212204103540021550 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Internal editor highlighters configuration frame Copyright (C) 2012 Alexander Koblov (alexx2000@mail.ru) Based on Lazarus IDE editor configuration frame (Editor/Display/Colors) This source is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. A copy of the GNU General Public License is available on the World Wide Web at . You can also obtain it by writing to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. } unit fOptionsEditorColors; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, SynEdit, Forms, Controls, StdCtrls, ExtCtrls, ColorBox, ComCtrls, Dialogs, Menus, Buttons, fOptionsFrame, DividerBevel, types, Graphics, SynEditHighlighter, dmHigh; type { TfrmOptionsEditorColors } TfrmOptionsEditorColors = class(TOptionsEditor) BackGroundColorBox: TColorBox; BackGroundLabel: TLabel; BackGroundUseDefaultCheckBox: TCheckBox; bvlAttributeSection: TDividerBevel; cmbLanguage: TComboBox; ColorPreview: TSynEdit; ColumnPosBevel: TPanel; ForegroundColorBox: TColorBox; ForeGroundLabel: TLabel; ForeGroundUseDefaultCheckBox: TCheckBox; FrameColorBox: TColorBox; FrameColorUseDefaultCheckBox: TCheckBox; FrameEdgesBox: TComboBox; FrameStyleBox: TComboBox; ColorElementTree: TListBox; pnlBold: TPanel; pnlElementAttributes: TPanel; pnlItalic: TPanel; pnlStrikeOut: TPanel; pnlTop: TPanel; PnlTop2: TPanel; pnlUnderline: TPanel; Splitter1: TSplitter; stFileExtensions: TStaticText; tbtnGlobal: TToolButton; tbtnLocal: TToolButton; TextBoldCheckBox: TCheckBox; TextBoldRadioInvert: TRadioButton; TextBoldRadioOff: TRadioButton; TextBoldRadioOn: TRadioButton; TextBoldRadioPanel: TPanel; TextItalicCheckBox: TCheckBox; TextStrikeOutCheckBox: TCheckBox; TextItalicRadioInvert: TRadioButton; TextStrikeOutRadioInvert: TRadioButton; TextItalicRadioOff: TRadioButton; TextStrikeOutRadioOff: TRadioButton; TextItalicRadioOn: TRadioButton; TextStrikeOutRadioOn: TRadioButton; TextItalicRadioPanel: TPanel; TextStrikeOutRadioPanel: TPanel; TextUnderlineCheckBox: TCheckBox; TextUnderlineRadioInvert: TRadioButton; TextUnderlineRadioOff: TRadioButton; TextUnderlineRadioOn: TRadioButton; TextUnderlineRadioPanel: TPanel; ToolBar1: TToolBar; ToolButton3: TToolButton; procedure FrameStyleBoxDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); procedure cmbLanguageChange(Sender: TObject); procedure ForegroundColorBoxChange(Sender: TObject); procedure FrameEdgesBoxDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); procedure ColorElementTreeDrawItem(Control: TWinControl; Index: Integer; NodeRect: TRect; State: TOwnerDrawState); procedure ColorElementTreeSelectionChange(Sender: TObject; User: boolean); procedure GeneralCheckBoxOnChange(Sender: TObject); procedure pnlElementAttributesResize(Sender: TObject); procedure tbtnGlobalClick(Sender: TObject); procedure TextStyleRadioOnChange(Sender: TObject); procedure SynPlainTextHighlighterChange(Sender: TObject); private FHighl: TdmHighl; FDefHighlightElement, FCurHighlightElement: TSynHighlighterAttributes; FCurrentHighlighter: TSynCustomHighlighter; FIsEditingDefaults: Boolean; UpdatingColor: Boolean; procedure UpdateCurrentScheme; protected procedure Init; override; procedure Done; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses LCLType, LCLIntf, SynEditTypes, GraphUtil, uLng, uGlobs; const COLOR_NODE_PREFIX = ' abc '; function DefaultToNone(AColor: TColor): TColor; begin if AColor = clDefault then Result := clNone else Result := AColor; end; function NoneToDefault(AColor: TColor): TColor; begin if AColor = clNone then Result := clDefault else Result := AColor; end; function SynAttributeSortCompare(List: TStringList; Index1, Index2: Integer): Integer; begin if CompareStr(List[Index1], rsSynDefaultText) = 0 then Result:= -1 else if CompareStr(List[Index2], rsSynDefaultText) = 0 then Result:= 1 else Result:= CompareStr(List[Index1], List[Index2]); end; { TfrmOptionsEditorColors } procedure TfrmOptionsEditorColors.FrameEdgesBoxDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); //+++ var r: TRect; PCol: Integer; begin if Index < 0 then exit;; r.top := ARect.top + 3; r.bottom := ARect.bottom - 3; r.left := ARect.left + 5; r.right := ARect.Right - 5; with TCustomComboBox(Control).Canvas do begin FillRect(ARect); Pen.Width := 1; PCol := pen.Color; Pen.Color := clGray; Pen.Style := psDot; Pen.EndCap := pecFlat; Rectangle(r); Pen.Width := 2; pen.Color := PCol; Pen.Style := psSolid; case Index of ord(sfeAround): Rectangle(r); ord(sfeBottom): begin MoveTo(r.Left, r.Bottom); LineTo(r.Right-1, r.Bottom); end; ord(sfeLeft): begin MoveTo(r.Left, r.Top); LineTo(r.Left, r.Bottom-1); end; end; end; end; procedure TfrmOptionsEditorColors.FrameStyleBoxDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); //++ var p: TPoint; begin if Index < 0 then exit;; with TCustomComboBox(Control).Canvas do begin FillRect(ARect); Pen.Width := 2; pen.EndCap := pecFlat; case Index of 0: Pen.Style := psSolid; 1: Pen.Style := psDash; 2: Pen.Style := psDot; 3: Pen.Style := psSolid; end; if Index = 3 then begin MoveToEx(Handle, ARect.Left + 5, (ARect.Top + ARect.Bottom) div 2 - 2, @p); WaveTo(Handle, ARect.Right - 5, (ARect.Top + ARect.Bottom) div 2 - 2, 4); end else begin MoveTo(ARect.Left + 5, (ARect.Top + ARect.Bottom) div 2); LineTo(ARect.Right - 5, (ARect.Top + ARect.Bottom) div 2); end; end; end; procedure TfrmOptionsEditorColors.cmbLanguageChange(Sender: TObject); var I: LongInt; AttributeList: TStringList; begin if (cmbLanguage.ItemIndex < 0) then Exit; AttributeList:= TStringList.Create; try FCurrentHighlighter:= TSynCustomHighlighter(cmbLanguage.Items.Objects[cmbLanguage.ItemIndex]); stFileExtensions.Caption:= Copy(FCurrentHighlighter.DefaultFilter, 1, Pos('|', FCurrentHighlighter.DefaultFilter) - 1); ColorPreview.Lines.Text:= FHighl.GetSampleSource(FCurrentHighlighter); if ColorPreview.Lines.Text = EmptyStr then try ColorPreview.Lines.Text:= FCurrentHighlighter.SampleSource; except ColorPreview.Lines.Text:= EmptyStr; end; FHighl.SetHighlighter(ColorPreview, FCurrentHighlighter); ColorElementTree.Items.Clear; for I:=0 to FCurrentHighlighter.AttrCount - 1 do AttributeList.AddObject(FCurrentHighlighter.Attribute[I].Name, FCurrentHighlighter.Attribute[I]); if (AttributeList.Count > 0) then begin AttributeList.CustomSort(@SynAttributeSortCompare); ColorElementTree.Items.Assign(AttributeList); ColorElementTree.ItemIndex:= 0; end; finally AttributeList.Free; end; end; procedure TfrmOptionsEditorColors.ForegroundColorBoxChange(Sender: TObject); //+++ var AttrToEdit: TSynHighlighterAttributes; begin if (FCurHighlightElement = nil) or UpdatingColor then Exit; UpdatingColor := True; if FIsEditingDefaults then AttrToEdit := FHighl.SynPlainTextHighlighter.Attribute[FHighl.SynPlainTextHighlighter.AttrCount-1] else AttrToEdit := FCurHighlightElement; if Sender = ForegroundColorBox then begin AttrToEdit.Foreground := DefaultToNone(ForeGroundColorBox.Selected); ForeGroundUseDefaultCheckBox.Checked := ForeGroundColorBox.Selected <> clDefault; end; if Sender = BackGroundColorBox then begin AttrToEdit.Background := DefaultToNone(BackGroundColorBox.Selected); BackGroundUseDefaultCheckBox.Checked := BackGroundColorBox.Selected <> clDefault; end; if Sender = FrameColorBox then begin AttrToEdit.FrameColor := DefaultToNone(FrameColorBox.Selected); FrameColorUseDefaultCheckBox.Checked := FrameColorBox.Selected <> clDefault; FrameEdgesBox.Enabled := FrameColorBox.Selected <> clDefault; FrameStyleBox.Enabled := FrameColorBox.Selected <> clDefault; end; if Sender = FrameEdgesBox then begin AttrToEdit.FrameEdges := TSynFrameEdges(FrameEdgesBox.ItemIndex); end; if Sender = FrameStyleBox then begin AttrToEdit.FrameStyle := TSynLineStyle(FrameStyleBox.ItemIndex); end; UpdatingColor := False; UpdateCurrentScheme; end; procedure TfrmOptionsEditorColors.ColorElementTreeDrawItem(Control: TWinControl; Index: Integer; NodeRect: TRect; State: TOwnerDrawState); //+++ var FullAbcWidth, AbcWidth: Integer; Attri: TSynHighlighterAttributes; TextY: Integer; c: TColor; s: String; begin if (Index = 0) and FIsEditingDefaults then Attri := FDefHighlightElement else Attri := TSynHighlighterAttributes(ColorElementTree.Items.Objects[Index]); if (Attri = nil) then Exit; // Draw node background and name if odSelected in State then begin ColorElementTree.Canvas.Brush.Color := clHighlight; ColorElementTree.Canvas.Font.Color := clHighlightText; end else begin ColorElementTree.Canvas.Brush.Color := ColorElementTree.Color; ColorElementTree.Canvas.Font.Color := Font.Color; end; FullAbcWidth := ColorElementTree.Canvas.TextExtent(COLOR_NODE_PREFIX).cx; TextY := (NodeRect.Top + NodeRect.Bottom - ColorElementTree.Canvas.TextHeight(ColorElementTree.Items[Index])) div 2; ColorElementTree.Canvas.FillRect(NodeRect); ColorElementTree.Canvas.TextOut(NodeRect.Left+FullAbcWidth, TextY, Attri.Name); // Draw preview box - Background c := clNone; if (hafBackColor in Attri.Features) then c := Attri.Background; // Fallback Background-color for text if (c = clNone) or (c = clDefault) then c := ColorPreview.Color; ColorElementTree.Canvas.Brush.Color := c; ColorElementTree.Canvas.FillRect(NodeRect.Left+2, NodeRect.Top+2, NodeRect.Left+FullAbcWidth-2, NodeRect.Bottom-2); // Draw preview Frame ColorElementTree.Canvas.Pen.Color := Attri.FrameColor; if (hafFrameColor in Attri.Features) and (Attri.FrameColor <> clDefault) and (Attri.FrameColor <> clNone) then ColorElementTree.Canvas.Rectangle(NodeRect.Left+2, NodeRect.Top+2, NodeRect.Left+FullAbcWidth-2, NodeRect.Bottom-2); // Draw preview ForeGround if (hafForeColor in Attri.Features) //and //(ahaSupportedFeatures[TAdditionalHilightAttribute(AttriIdx)].BG) ) // if no BG, then FG was used then begin c := Attri.Foreground; if (c = clNone) or (c = clDefault) then c := ColorPreview.Font.Color; begin s := 'abc'; ColorElementTree.Canvas.Font.Color := c; ColorElementTree.Canvas.Font.Style := Attri.Style; ColorElementTree.Canvas.Font.Height := -(NodeRect.Bottom - NodeRect.Top - 7); TextY := (NodeRect.Top + NodeRect.Bottom - canvas.TextHeight(s)) div 2; AbcWidth := ColorElementTree.Canvas.TextExtent(s).cx; SetBkMode(ColorElementTree.Canvas.Handle, TRANSPARENT); ColorElementTree.Canvas.TextOut(NodeRect.Left+(FullAbcWidth - AbcWidth) div 2, TextY, s); SetBkMode(ColorElementTree.Canvas.Handle, OPAQUE); ColorElementTree.Canvas.Font.Height := Font.Height; ColorElementTree.Canvas.Font.Style := []; end; end; end; procedure TfrmOptionsEditorColors.SynPlainTextHighlighterChange(Sender: TObject); var SynPlainTextHighlighter: TSynHighlighterAttributes absolute Sender; begin ColorPreview.Color:= SynPlainTextHighlighter.Background; ColorPreview.Font.Color:= SynPlainTextHighlighter.Foreground; end; procedure TfrmOptionsEditorColors.ColorElementTreeSelectionChange( Sender: TObject; User: boolean); //+++ var AttrToShow: TSynHighlighterAttributes; IsDefault, CanGlobal: Boolean; begin if (ColorElementTree.ItemIndex < 0) or UpdatingColor then Exit; FCurHighlightElement:= TSynHighlighterAttributes(ColorElementTree.Items.Objects[ColorElementTree.ItemIndex]); UpdatingColor := True; DisableAlign; try FDefHighlightElement:= FHighl.SynPlainTextHighlighter.Attribute[FHighl.SynPlainTextHighlighter.AttrCount - 1]; IsDefault := SameText(rsSynDefaultText, FCurHighlightElement.Name); CanGlobal := (cmbLanguage.ItemIndex > 0) and IsDefault; FIsEditingDefaults:= CanGlobal and (FCurrentHighlighter.Tag = 1); tbtnGlobal.Enabled := CanGlobal; tbtnLocal.Enabled := CanGlobal; tbtnGlobal.AllowAllUp := not CanGlobal; tbtnLocal.AllowAllUp := not CanGlobal; tbtnGlobal.Down := (FCurrentHighlighter.Tag = 1) and CanGlobal; tbtnLocal.Down := (FCurrentHighlighter.Tag = 0) and CanGlobal; if FIsEditingDefaults then AttrToShow := FDefHighlightElement else AttrToShow := FCurHighlightElement; ForegroundColorBox.Style := ForegroundColorBox.Style + [cbIncludeDefault]; BackGroundColorBox.Style := BackGroundColorBox.Style + [cbIncludeDefault]; // Forground ForeGroundLabel.Visible := (hafForeColor in AttrToShow.Features) and (IsDefault = True); ForeGroundUseDefaultCheckBox.Visible := (hafForeColor in AttrToShow.Features) and (IsDefault = False); ForegroundColorBox.Visible := (hafForeColor in AttrToShow.Features); ForegroundColorBox.Selected := NoneToDefault(AttrToShow.Foreground); if ForegroundColorBox.Selected = clDefault then ForegroundColorBox.Tag := ForegroundColorBox.DefaultColorColor else ForegroundColorBox.Tag := ForegroundColorBox.Selected; ForeGroundUseDefaultCheckBox.Checked := ForegroundColorBox.Selected <> clDefault; // BackGround BackGroundLabel.Visible := (hafBackColor in AttrToShow.Features) and (IsDefault = True); BackGroundUseDefaultCheckBox.Visible := (hafBackColor in AttrToShow.Features) and (IsDefault = False); BackGroundColorBox.Visible := (hafBackColor in AttrToShow.Features); BackGroundColorBox.Selected := NoneToDefault(AttrToShow.Background); if BackGroundColorBox.Selected = clDefault then BackGroundColorBox.Tag := BackGroundColorBox.DefaultColorColor else BackGroundColorBox.Tag := BackGroundColorBox.Selected; BackGroundUseDefaultCheckBox.Checked := BackGroundColorBox.Selected <> clDefault; // Frame FrameColorUseDefaultCheckBox.Visible := hafFrameColor in AttrToShow.Features; FrameColorBox.Visible := hafFrameColor in AttrToShow.Features; FrameEdgesBox.Visible := hafFrameEdges in AttrToShow.Features; FrameStyleBox.Visible := hafFrameStyle in AttrToShow.Features; FrameColorBox.Selected := NoneToDefault(AttrToShow.FrameColor); if FrameColorBox.Selected = clDefault then FrameColorBox.Tag := FrameColorBox.DefaultColorColor else FrameColorBox.Tag := FrameColorBox.Selected; FrameColorUseDefaultCheckBox.Checked := FrameColorBox.Selected <> clDefault; FrameEdgesBox.ItemIndex := integer(AttrToShow.FrameEdges); FrameStyleBox.ItemIndex := integer(AttrToShow.FrameStyle); FrameEdgesBox.Enabled := FrameColorUseDefaultCheckBox.Checked; FrameStyleBox.Enabled := FrameColorUseDefaultCheckBox.Checked; // Styles TextBoldCheckBox.Visible := hafStyle in AttrToShow.Features; TextItalicCheckBox.Visible := hafStyle in AttrToShow.Features; TextUnderlineCheckBox.Visible := hafStyle in AttrToShow.Features; TextStrikeOutCheckBox.Visible := hafStyle in AttrToShow.Features; TextBoldRadioPanel.Visible := hafStyleMask in AttrToShow.Features; TextItalicRadioPanel.Visible := hafStyleMask in AttrToShow.Features; TextUnderlineRadioPanel.Visible := hafStyleMask in AttrToShow.Features; TextStrikeOutRadioPanel.Visible := hafStyleMask in AttrToShow.Features; if hafStyleMask in AttrToShow.Features then begin TextBoldCheckBox.Checked := (fsBold in AttrToShow.Style) or (fsBold in AttrToShow.StyleMask); TextBoldRadioPanel.Enabled := TextBoldCheckBox.Checked; if not(fsBold in AttrToShow.StyleMask) then TextBoldRadioInvert.Checked := True else if fsBold in AttrToShow.Style then TextBoldRadioOn.Checked := True else TextBoldRadioOff.Checked := True; TextItalicCheckBox.Checked := (fsItalic in AttrToShow.Style) or (fsItalic in AttrToShow.StyleMask); TextItalicRadioPanel.Enabled := TextItalicCheckBox.Checked; if not(fsItalic in AttrToShow.StyleMask) then TextItalicRadioInvert.Checked := True else if fsItalic in AttrToShow.Style then TextItalicRadioOn.Checked := True else TextItalicRadioOff.Checked := True; TextUnderlineCheckBox.Checked := (fsUnderline in AttrToShow.Style) or (fsUnderline in AttrToShow.StyleMask); TextUnderlineRadioPanel.Enabled := TextUnderlineCheckBox.Checked; if not(fsUnderline in AttrToShow.StyleMask) then TextUnderlineRadioInvert.Checked := True else if fsUnderline in AttrToShow.Style then TextUnderlineRadioOn.Checked := True else TextUnderlineRadioOff.Checked := True; TextStrikeOutCheckBox.Checked := (fsStrikeOut in AttrToShow.Style) or (fsStrikeOut in AttrToShow.StyleMask); TextStrikeOutRadioPanel.Enabled := TextStrikeOutCheckBox.Checked; if not(fsStrikeOut in AttrToShow.StyleMask) then TextStrikeOutRadioInvert.Checked := True else if fsStrikeOut in AttrToShow.Style then TextStrikeOutRadioOn.Checked := True else TextStrikeOutRadioOff.Checked := True; end else begin TextBoldCheckBox.Checked := fsBold in AttrToShow.Style; TextItalicCheckBox.Checked := fsItalic in AttrToShow.Style; TextUnderlineCheckBox.Checked := fsUnderline in AttrToShow.Style; TextStrikeOutCheckBox.Checked := fsStrikeOut in AttrToShow.Style; end; if SameText(AttrToShow.Name, rsSynDefaultText) then begin AttrToShow.OnChange:= @SynPlainTextHighlighterChange; end; UpdatingColor := False; finally EnableAlign; end; pnlElementAttributesResize(nil); end; procedure TfrmOptionsEditorColors.GeneralCheckBoxOnChange(Sender: TObject); var TheColorBox: TColorBox; AttrToEdit: TSynHighlighterAttributes; procedure SetCheckBoxStyle(CheckBox: TCheckBox; style: TFontStyle); begin if hafStyleMask in AttrToEdit.Features then TextStyleRadioOnChange(Sender) else if CheckBox.Checked xor (style in AttrToEdit.Style) then begin if CheckBox.Checked then AttrToEdit.Style := AttrToEdit.Style + [style] else AttrToEdit.Style := AttrToEdit.Style - [style]; UpdateCurrentScheme; end; end; begin if FCurHighlightElement = nil then Exit; if FIsEditingDefaults then AttrToEdit := FDefHighlightElement else AttrToEdit := FCurHighlightElement; if UpdatingColor = False then begin UpdatingColor := True; TheColorBox := nil; if Sender = ForeGroundUseDefaultCheckBox then TheColorBox := ForegroundColorBox; if Sender = BackGroundUseDefaultCheckBox then TheColorBox := BackGroundColorBox; if Sender = FrameColorUseDefaultCheckBox then TheColorBox := FrameColorBox; if Assigned(TheColorBox) then begin if TCheckBox(Sender).Checked then begin TheColorBox.Selected := TheColorBox.Tag; end else begin TheColorBox.Tag := TheColorBox.Selected; TheColorBox.Selected := clDefault; end; if (Sender = ForeGroundUseDefaultCheckBox) and (DefaultToNone(ForegroundColorBox.Selected) <> AttrToEdit.Foreground) then begin AttrToEdit.Foreground := DefaultToNone(ForegroundColorBox.Selected); UpdateCurrentScheme; end; if (Sender = BackGroundUseDefaultCheckBox) and (DefaultToNone(BackGroundColorBox.Selected) <> AttrToEdit.Background) then begin AttrToEdit.Background := DefaultToNone(BackGroundColorBox.Selected); UpdateCurrentScheme; end; if (Sender = FrameColorUseDefaultCheckBox) and (DefaultToNone(FrameColorBox.Selected) <> AttrToEdit.FrameColor) then begin AttrToEdit.FrameColor := DefaultToNone(FrameColorBox.Selected); FrameEdgesBox.Enabled := TCheckBox(Sender).Checked; FrameStyleBox.Enabled := TCheckBox(Sender).Checked; UpdateCurrentScheme; end; end; UpdatingColor := False; end; if Sender = TextBoldCheckBox then SetCheckBoxStyle(TextBoldCheckBox, fsBold); if Sender = TextItalicCheckBox then SetCheckBoxStyle(TextItalicCheckBox, fsItalic); if Sender = TextUnderlineCheckBox then SetCheckBoxStyle(TextUnderlineCheckBox, fsUnderline); if Sender = TextStrikeOutCheckBox then SetCheckBoxStyle(TextStrikeOutCheckBox, fsStrikeOut); end; procedure TfrmOptionsEditorColors.pnlElementAttributesResize(Sender: TObject); //+++ var MinAnchor: TControl; MinWidth: Integer; procedure CheckControl(Other: TControl); var w,h: Integer; begin if not Other.Visible then exit; Other.GetPreferredSize(w,h); if w <= MinWidth then exit; MinAnchor := Other; MinWidth := w; end; begin MinWidth := -1; MinAnchor := ForeGroundLabel; CheckControl(ForeGroundLabel); CheckControl(BackGroundLabel); CheckControl(ForeGroundUseDefaultCheckBox); CheckControl(BackGroundUseDefaultCheckBox); CheckControl(FrameColorUseDefaultCheckBox); ColumnPosBevel.AnchorSide[akLeft].Control := MinAnchor; end; procedure TfrmOptionsEditorColors.tbtnGlobalClick(Sender: TObject); begin if (FCurHighlightElement = nil) or UpdatingColor then Exit; FCurrentHighlighter.Tag := PtrInt(tbtnGlobal.Down); ColorElementTreeSelectionChange(ColorElementTree, True); UpdateCurrentScheme; end; procedure TfrmOptionsEditorColors.TextStyleRadioOnChange(Sender: TObject); //+++ var AttrToEdit: TSynHighlighterAttributes; procedure CalcNewStyle(CheckBox: TCheckBox; RadioOn, RadioOff, RadioInvert: TRadioButton; fs : TFontStyle; Panel: TPanel); begin if CheckBox.Checked then begin Panel.Enabled := True; if RadioInvert.Checked then begin AttrToEdit.Style := AttrToEdit.Style + [fs]; AttrToEdit.StyleMask := AttrToEdit.StyleMask - [fs]; end else if RadioOn.Checked then begin AttrToEdit.Style := AttrToEdit.Style + [fs]; AttrToEdit.StyleMask := AttrToEdit.StyleMask + [fs]; end else if RadioOff.Checked then begin AttrToEdit.Style := AttrToEdit.Style - [fs]; AttrToEdit.StyleMask := AttrToEdit.StyleMask + [fs]; end end else begin Panel.Enabled := False; AttrToEdit.Style := AttrToEdit.Style - [fs]; AttrToEdit.StyleMask := AttrToEdit.StyleMask - [fs]; end; end; begin if UpdatingColor or not (hafStyleMask in FCurHighlightElement.Features) then Exit; if FIsEditingDefaults then AttrToEdit := FDefHighlightElement else AttrToEdit := FCurHighlightElement; if (Sender = TextBoldCheckBox) or (Sender = TextBoldRadioOn) or (Sender = TextBoldRadioOff) or (Sender = TextBoldRadioInvert) then CalcNewStyle(TextBoldCheckBox, TextBoldRadioOn, TextBoldRadioOff, TextBoldRadioInvert, fsBold, TextBoldRadioPanel); if (Sender = TextItalicCheckBox) or (Sender = TextItalicRadioOn) or (Sender = TextItalicRadioOff) or (Sender = TextItalicRadioInvert) then CalcNewStyle(TextItalicCheckBox, TextItalicRadioOn, TextItalicRadioOff, TextItalicRadioInvert, fsItalic, TextItalicRadioPanel); if (Sender = TextUnderlineCheckBox) or (Sender = TextUnderlineRadioOn) or (Sender = TextUnderlineRadioOff) or (Sender = TextUnderlineRadioInvert) then CalcNewStyle(TextUnderlineCheckBox, TextUnderlineRadioOn, TextUnderlineRadioOff, TextUnderlineRadioInvert, fsUnderline, TextUnderlineRadioPanel); if (Sender = TextStrikeOutCheckBox) or (Sender = TextStrikeOutRadioOn) or (Sender = TextStrikeOutRadioOff) or (Sender = TextStrikeOutRadioInvert) then CalcNewStyle(TextStrikeOutCheckBox, TextStrikeOutRadioOn, TextStrikeOutRadioOff, TextStrikeOutRadioInvert, fsStrikeOut, TextStrikeOutRadioPanel); end; procedure TfrmOptionsEditorColors.UpdateCurrentScheme; begin ColorElementTree.Invalidate; end; procedure TfrmOptionsEditorColors.Init; begin inherited Init; FHighl:= TdmHighl.Create(nil, True); FontOptionsToFont(gFonts[dcfEditor], ColorPreview.Font); end; procedure TfrmOptionsEditorColors.Done; begin FHighl.Free; inherited Done; end; procedure TfrmOptionsEditorColors.Load; begin FHighl.Assign(dmHighl); cmbLanguage.Items.Assign(FHighl.SynHighlighterList); cmbLanguage.ItemIndex:= 0; cmbLanguageChange(nil); end; function TfrmOptionsEditorColors.Save: TOptionsEditorSaveFlags; begin Result:= []; dmHighl.Assign(FHighl); end; class function TfrmOptionsEditorColors.GetIconIndex: Integer; begin Result:= 21; end; class function TfrmOptionsEditorColors.GetTitle: String; begin Result:= rsOptionsEditorHighlighters; end; end. doublecmd-0.5.8/src/frames/foptionsmisc.lrt0000644000175000017500000000102112112400256017775 0ustar alexxalexxTFRMOPTIONSMISC.CHKSHOWWARNINGMESSAGES.CAPTION=Show &warning messages ("OK" button only) TFRMOPTIONSMISC.CHKTHUMBSAVE.CAPTION=&Save thumbnails in cache TFRMOPTIONSMISC.LBLTHUMBSIZE.CAPTION=&Thumbnail size: TFRMOPTIONSMISC.DBLTHUMBNAILS.CAPTION=Thumbnails TFRMOPTIONSMISC.LBLTHUMBSEPARATOR.CAPTION=X TFRMOPTIONSMISC.LBLTHUMBPIXELS.CAPTION=pixels TFRMOPTIONSMISC.BTNTHUMBCOMPACTCACHE.CAPTION=&Remove thumbnails for no longer existing files TFRMOPTIONSMISC.CHKGOTOROOT.CAPTION=Always &go to the root of a drive when changing drives doublecmd-0.5.8/src/frames/foptionsquicksearchfilter.lrt0000644000175000017500000000074311740433676022606 0ustar alexxalexxTFRMOPTIONSQUICKSEARCHFILTER.GBEXACTNAMEMATCH.CAPTION=Exact name match TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTBEGINNING.CAPTION=&Beginning (name must start with first typed character) TFRMOPTIONSQUICKSEARCHFILTER.CBEXACTENDING.CAPTION=En&ding (last character before a typed dot . must match) TFRMOPTIONSQUICKSEARCHFILTER.RGPSEARCHITEMS.CAPTION=Search for these items TFRMOPTIONSQUICKSEARCHFILTER.RGPSEARCHCASE.CAPTION=Search case TFRMOPTIONSQUICKSEARCHFILTER.CGPOPTIONS.CAPTION=Options doublecmd-0.5.8/src/frames/foptionscolumnsview.lrt0000644000175000017500000000071412020403374021427 0ustar alexxalexxTFRMOPTIONSCOLUMNSVIEW.GRPAUTOSIZECOLUMNS.CAPTION=Auto-size columns TFRMOPTIONSCOLUMNSVIEW.CHKAUTOFILLCOLUMNS.CAPTION=A&uto fill columns TFRMOPTIONSCOLUMNSVIEW.LBLAUTOSIZECOLUMN.CAPTION=Auto si&ze column: TFRMOPTIONSCOLUMNSVIEW.GBSHOWGRID.CAPTION=Show grid TFRMOPTIONSCOLUMNSVIEW.CBGRIDVERTLINE.CAPTION=&Vertical lines TFRMOPTIONSCOLUMNSVIEW.CBGRIDHORZLINE.CAPTION=&Horizontal lines TFRMOPTIONSCOLUMNSVIEW.CBCUTTEXTTOCOLWIDTH.CAPTION=Cut &text to column width doublecmd-0.5.8/src/frames/foptionsarchivers.pas0000644000175000017500000002544411740433676021053 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Archivers options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsArchivers; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, ExtCtrls, ComCtrls, EditBtn, Grids, Buttons, fOptionsFrame; type { TfrmOptionsArchivers } TfrmOptionsArchivers = class(TOptionsEditor) btnAutoConfig: TBitBtn; btnMultiArcAdd: TBitBtn; btnMultiArcApply: TBitBtn; btnMultiArcDelete: TBitBtn; btnMultiArcRename: TBitBtn; chkMultiArcDebug: TCheckBox; chkMultiArcEnabled: TCheckBox; chkMultiArcOutput: TCheckBox; edtArchiveAdd: TEdit; edtArchiveExtension: TEdit; edtArchiveExtract: TEdit; edtArchiveList: TEdit; edtArchiveListEnd: TEdit; edtArchiveListStart: TEdit; edtDescription: TEdit; fneArchiver: TFileNameEdit; gbArchiverOptions: TGroupBox; lblArchiveAdd: TLabel; lblArchiveExtension: TLabel; lblArchiveExtract: TLabel; lblArchiveList: TLabel; lblArchiveListEnd: TLabel; lblArchiveListFormat: TLabel; lblArchiveListStart: TLabel; lblArchiver: TLabel; lblDescription: TLabel; lbxMultiArc: TListBox; memArchiveListFormat: TMemo; pcArchiverCommands: TPageControl; pnlArchiverCommands: TPanel; pnlMultiArcButtons: TPanel; splMultiArc: TSplitter; stgArchiverCommands: TStringGrid; tbArchiverAdditional: TTabSheet; tbArchiverGeneral: TTabSheet; procedure btnAutoConfigClick(Sender: TObject); procedure btnMultiArcAddClick(Sender: TObject); procedure btnMultiArcApplyClick(Sender: TObject); procedure btnMultiArcDeleteClick(Sender: TObject); procedure btnMultiArcRenameClick(Sender: TObject); procedure chkMultiArcEnabledChange(Sender: TObject); procedure lbxMultiArcSelectionChange(Sender: TObject; User: boolean); procedure stgArchiverCommandsPrepareCanvas(Sender: TObject; aCol, aRow: Integer; aState: TGridDrawState); procedure tbArchiverAdditionalShow(Sender: TObject); private procedure FillArchiverList; protected procedure Init; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses Dialogs, uGlobs, uLng, uMultiArc; const stgArchiveTitle = 0; stgArchiveDelete = 1; stgArchiveTest = 2; stgArchiveExtractWithoutPath = 3; stgArchiveSelfExtract = 4; stgArchiveID = 5; stgArchiveIDPos = 6; stgArchiveIDSeekRange = 7; stgArchivePasswordQuery = 8; stgArchiveFormMode = 9; { TfrmOptionsArchivers } procedure TfrmOptionsArchivers.btnAutoConfigClick(Sender: TObject); begin gMultiArcList.AutoConfigure; lbxMultiArcSelectionChange(lbxMultiArc, True); end; procedure TfrmOptionsArchivers.btnMultiArcAddClick(Sender: TObject); var sName: UTF8String; MultiArcItem: TMultiArcItem; begin if InputQuery(Caption, rsOptArchiveTypeName, sName) then begin MultiArcItem:= TMultiArcItem.Create; lbxMultiArc.Items.AddObject(sName, MultiArcItem); gMultiArcList.Add(sName, MultiArcItem); lbxMultiArc.ItemIndex:= lbxMultiArc.Count - 1; pcArchiverCommands.Enabled:= (lbxMultiArc.Count <> 0); chkMultiArcEnabled.Enabled:= (lbxMultiArc.Count <> 0); end; end; procedure TfrmOptionsArchivers.btnMultiArcApplyClick(Sender: TObject); begin if lbxMultiArc.ItemIndex < 0 then Exit; with TMultiArcItem(lbxMultiArc.Items.Objects[lbxMultiArc.ItemIndex]), stgArchiverCommands do begin FDescription:= edtDescription.Text; FArchiver:= fneArchiver.FileName; FExtension:= edtArchiveExtension.Text; FList:= edtArchiveList.Text; FStart:= edtArchiveListStart.Text; FEnd:= edtArchiveListEnd.Text; FFormat.Assign(memArchiveListFormat.Lines); FExtract:= edtArchiveExtract.Text; FAdd:= edtArchiveAdd.Text; FDelete:= Cells[1, stgArchiveDelete]; FTest:= Cells[1, stgArchiveTest]; FExtractWithoutPath:= Cells[1, stgArchiveExtractWithoutPath]; FAddSelfExtract:= Cells[1, stgArchiveSelfExtract]; FID:= Cells[1, stgArchiveID]; FIDPos:= Cells[1, stgArchiveIDPos]; FIDSeekRange:= Cells[1, stgArchiveIDSeekRange]; FPasswordQuery:= Cells[1, stgArchivePasswordQuery]; FFormMode:= StrToIntDef(Cells[1, stgArchiveFormMode], 0); FOutput:= chkMultiArcOutput.Checked; FDebug:= chkMultiArcDebug.Checked; end; end; procedure TfrmOptionsArchivers.btnMultiArcDeleteClick(Sender: TObject); var I: Integer; begin if lbxMultiArc.ItemIndex < 0 then Exit; I:= lbxMultiArc.ItemIndex; lbxMultiArc.Items.Delete(I); gMultiArcList.Delete(I); lbxMultiArc.ItemIndex:= lbxMultiArc.Count - 1; pcArchiverCommands.Enabled:= (lbxMultiArc.Count <> 0); chkMultiArcEnabled.Enabled:= (lbxMultiArc.Count <> 0); end; procedure TfrmOptionsArchivers.btnMultiArcRenameClick(Sender: TObject); var sNewName: UTF8String; begin if lbxMultiArc.ItemIndex < 0 then Exit; sNewName:= lbxMultiArc.Items[lbxMultiArc.ItemIndex]; if InputQuery(Caption, rsOptArchiveTypeName, sNewName) then begin lbxMultiArc.Items[lbxMultiArc.ItemIndex]:= sNewName; gMultiArcList.Names[lbxMultiArc.ItemIndex]:= sNewName; end; end; procedure TfrmOptionsArchivers.chkMultiArcEnabledChange(Sender: TObject); begin if lbxMultiArc.ItemIndex < 0 then Exit; with TMultiArcItem(lbxMultiArc.Items.Objects[lbxMultiArc.ItemIndex]) do FEnabled:= chkMultiArcEnabled.Checked; end; procedure TfrmOptionsArchivers.lbxMultiArcSelectionChange(Sender: TObject; User: boolean); begin if lbxMultiArc.ItemIndex < 0 then with stgArchiverCommands do begin edtDescription.Text:= EmptyStr; fneArchiver.FileName:= EmptyStr; edtArchiveExtension.Text:= EmptyStr; edtArchiveList.Text:= EmptyStr; edtArchiveListStart.Text:= EmptyStr; edtArchiveListEnd.Text:= EmptyStr; memArchiveListFormat.Lines.Clear; edtArchiveExtract.Text:= EmptyStr; edtArchiveAdd.Text:= EmptyStr; Cells[1, stgArchiveDelete]:= EmptyStr; Cells[1, stgArchiveTest]:= EmptyStr; Cells[1, stgArchiveExtractWithoutPath]:= EmptyStr; Cells[1, stgArchiveSelfExtract]:= EmptyStr; Cells[1, stgArchiveID]:= EmptyStr; Cells[1, stgArchiveIDPos]:= EmptyStr; Cells[1, stgArchiveIDSeekRange]:= EmptyStr; Cells[1, stgArchivePasswordQuery]:= EmptyStr; Cells[1, stgArchiveFormMode]:= EmptyStr; chkMultiArcOutput.Checked:= False; chkMultiArcDebug.Checked:= False; chkMultiArcEnabled.Checked:= False; pcArchiverCommands.Enabled:= (lbxMultiArc.Count <> 0); chkMultiArcEnabled.Enabled:= (lbxMultiArc.Count <> 0); end else with TMultiArcItem(lbxMultiArc.Items.Objects[lbxMultiArc.ItemIndex]), stgArchiverCommands do begin edtDescription.Text:= FDescription; fneArchiver.FileName:= FArchiver; edtArchiveExtension.Text:= FExtension; edtArchiveList.Text:= FList; edtArchiveListStart.Text:= FStart; edtArchiveListEnd.Text:= FEnd; memArchiveListFormat.Lines.Assign(FFormat); edtArchiveExtract.Text:= FExtract; edtArchiveAdd.Text:= FAdd; Cells[1, stgArchiveDelete]:= FDelete; Cells[1, stgArchiveTest]:= FTest; Cells[1, stgArchiveExtractWithoutPath]:= FExtractWithoutPath; Cells[1, stgArchiveSelfExtract]:= FAddSelfExtract; Cells[1, stgArchiveID]:= FID; Cells[1, stgArchiveIDPos]:= FIDPos; Cells[1, stgArchiveIDSeekRange]:= FIDSeekRange; Cells[1, stgArchivePasswordQuery]:= FPasswordQuery; Cells[1, stgArchiveFormMode]:= IntToStr(FFormMode); chkMultiArcOutput.Checked:= FOutput; chkMultiArcDebug.Checked:= FDebug; chkMultiArcEnabled.Checked:= FEnabled; end; end; procedure TfrmOptionsArchivers.stgArchiverCommandsPrepareCanvas(Sender: TObject; aCol, aRow: Integer; aState: TGridDrawState); begin if aRow = 0 then stgArchiverCommands.Canvas.Brush.Color:= stgArchiverCommands.FixedColor else stgArchiverCommands.Canvas.Brush.Color:= stgArchiverCommands.Color; end; procedure TfrmOptionsArchivers.tbArchiverAdditionalShow(Sender: TObject); var I, J: LongInt; iWidth: LongInt = 0; begin for I:= 0 to stgArchiverCommands.RowCount - 1 do begin J:= stgArchiverCommands.Canvas.TextWidth(stgArchiverCommands.Cells[0, I]); if J > iWidth then iWidth:= J; end; stgArchiverCommands.ColWidths[0]:= iWidth + 12; end; procedure TfrmOptionsArchivers.FillArchiverList; var I: Integer; begin for I:= 0 to gMultiArcList.Count - 1 do lbxMultiArc.Items.AddObject(gMultiArcList.Names[I], gMultiArcList[I]); pcArchiverCommands.Enabled:= (lbxMultiArc.Count <> 0); chkMultiArcEnabled.Enabled:= (lbxMultiArc.Count <> 0); if lbxMultiArc.Count > 0 then lbxMultiArc.ItemIndex:= 0; end; class function TfrmOptionsArchivers.GetIconIndex: Integer; begin Result := 18; end; class function TfrmOptionsArchivers.GetTitle: String; begin Result := rsOptionsEditorArchivers; end; procedure TfrmOptionsArchivers.Init; begin // Localize additional archiver commands. stgArchiverCommands.Cells[0, stgArchiveTitle] := rsOptArchiveParam; stgArchiverCommands.Cells[1, stgArchiveTitle] := rsOptArchiveValue; stgArchiverCommands.Cells[0, stgArchiveDelete] := rsOptArchiveDelete; stgArchiverCommands.Cells[0, stgArchiveTest] := rsOptArchiveTest; stgArchiverCommands.Cells[0, stgArchiveExtractWithoutPath] := rsOptArchiveExtractWithoutPath; stgArchiverCommands.Cells[0, stgArchiveSelfExtract] := rsOptArchiveSelfExtract; stgArchiverCommands.Cells[0, stgArchiveID] := rsOptArchiveID; stgArchiverCommands.Cells[0, stgArchiveIDPos] := rsOptArchiveIDPos; stgArchiverCommands.Cells[0, stgArchiveIDSeekRange] := rsOptArchiveIDSeekRange; stgArchiverCommands.Cells[0, stgArchivePasswordQuery] := rsOptArchivePasswordQuery; stgArchiverCommands.Cells[0, stgArchiveFormMode] := rsOptArchiveFormMode; end; procedure TfrmOptionsArchivers.Load; begin FillArchiverList; end; function TfrmOptionsArchivers.Save: TOptionsEditorSaveFlags; begin Result := []; end; end. doublecmd-0.5.8/src/frames/foptionseditorcolors.lfm0000644000175000017500000007177512204103540021554 0ustar alexxalexxinherited frmOptionsEditorColors: TfrmOptionsEditorColors Height = 357 Width = 680 ClientHeight = 357 ClientWidth = 680 DesignLeft = 322 DesignTop = 122 object pnlTop: TPanel[0] Left = 0 Height = 24 Top = 0 Width = 680 Align = alTop AutoSize = True BevelOuter = bvNone ChildSizing.HorizontalSpacing = 3 ChildSizing.EnlargeHorizontal = crsHomogenousChildResize ChildSizing.ShrinkHorizontal = crsHomogenousChildResize ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 4 ClientHeight = 24 ClientWidth = 680 Constraints.MaxWidth = 1000 ParentShowHint = False ShowHint = True TabOrder = 0 object cmbLanguage: TComboBox AnchorSideTop.Side = asrBottom Left = 0 Height = 21 Top = 3 Width = 356 BorderSpacing.Top = 3 ItemHeight = 13 OnChange = cmbLanguageChange Style = csDropDownList TabOrder = 0 end object stFileExtensions: TStaticText AnchorSideBottom.Side = asrBottom Left = 359 Height = 21 Top = 3 Width = 321 AutoSize = True TabOrder = 1 end end object PnlTop2: TPanel[1] Left = 0 Height = 133 Top = 24 Width = 680 Align = alTop Anchors = [akTop, akLeft, akRight, akBottom] BevelOuter = bvNone ClientHeight = 133 ClientWidth = 680 TabOrder = 1 inline ColorPreview: TSynEdit Left = 211 Height = 132 Top = 1 Width = 469 Align = alClient BorderSpacing.Left = 1 BorderSpacing.Top = 1 Font.Height = -16 Font.Name = 'courier' Font.Pitch = fpFixed Font.Quality = fqNonAntialiased ParentColor = False ParentFont = False TabOrder = 0 TabStop = False BookMarkOptions.Xoffset = 30 Gutter.Width = 59 Gutter.MouseActions = <> RightGutter.Width = 0 RightGutter.MouseActions = <> Keystrokes = < item Command = ecUp ShortCut = 38 end item Command = ecSelUp ShortCut = 8230 end item Command = ecScrollUp ShortCut = 16422 end item Command = ecDown ShortCut = 40 end item Command = ecSelDown ShortCut = 8232 end item Command = ecScrollDown ShortCut = 16424 end item Command = ecLeft ShortCut = 37 end item Command = ecSelLeft ShortCut = 8229 end item Command = ecWordLeft ShortCut = 16421 end item Command = ecSelWordLeft ShortCut = 24613 end item Command = ecRight ShortCut = 39 end item Command = ecSelRight ShortCut = 8231 end item Command = ecWordRight ShortCut = 16423 end item Command = ecSelWordRight ShortCut = 24615 end item Command = ecPageDown ShortCut = 34 end item Command = ecSelPageDown ShortCut = 8226 end item Command = ecPageBottom ShortCut = 16418 end item Command = ecSelPageBottom ShortCut = 24610 end item Command = ecPageUp ShortCut = 33 end item Command = ecSelPageUp ShortCut = 8225 end item Command = ecPageTop ShortCut = 16417 end item Command = ecSelPageTop ShortCut = 24609 end item Command = ecLineStart ShortCut = 36 end item Command = ecSelLineStart ShortCut = 8228 end item Command = ecEditorTop ShortCut = 16420 end item Command = ecSelEditorTop ShortCut = 24612 end item Command = ecLineEnd ShortCut = 35 end item Command = ecSelLineEnd ShortCut = 8227 end item Command = ecEditorBottom ShortCut = 16419 end item Command = ecSelEditorBottom ShortCut = 24611 end item Command = ecToggleMode ShortCut = 45 end item Command = ecCopy ShortCut = 16429 end item Command = ecPaste ShortCut = 8237 end item Command = ecDeleteChar ShortCut = 46 end item Command = ecCut ShortCut = 8238 end item Command = ecDeleteLastChar ShortCut = 8 end item Command = ecDeleteLastChar ShortCut = 8200 end item Command = ecDeleteLastWord ShortCut = 16392 end item Command = ecUndo ShortCut = 32776 end item Command = ecRedo ShortCut = 40968 end item Command = ecLineBreak ShortCut = 13 end item Command = ecSelectAll ShortCut = 16449 end item Command = ecCopy ShortCut = 16451 end item Command = ecBlockIndent ShortCut = 24649 end item Command = ecLineBreak ShortCut = 16461 end item Command = ecInsertLine ShortCut = 16462 end item Command = ecDeleteWord ShortCut = 16468 end item Command = ecBlockUnindent ShortCut = 24661 end item Command = ecPaste ShortCut = 16470 end item Command = ecCut ShortCut = 16472 end item Command = ecDeleteLine ShortCut = 16473 end item Command = ecDeleteEOL ShortCut = 24665 end item Command = ecUndo ShortCut = 16474 end item Command = ecRedo ShortCut = 24666 end item Command = ecGotoMarker0 ShortCut = 16432 end item Command = ecGotoMarker1 ShortCut = 16433 end item Command = ecGotoMarker2 ShortCut = 16434 end item Command = ecGotoMarker3 ShortCut = 16435 end item Command = ecGotoMarker4 ShortCut = 16436 end item Command = ecGotoMarker5 ShortCut = 16437 end item Command = ecGotoMarker6 ShortCut = 16438 end item Command = ecGotoMarker7 ShortCut = 16439 end item Command = ecGotoMarker8 ShortCut = 16440 end item Command = ecGotoMarker9 ShortCut = 16441 end item Command = ecSetMarker0 ShortCut = 24624 end item Command = ecSetMarker1 ShortCut = 24625 end item Command = ecSetMarker2 ShortCut = 24626 end item Command = ecSetMarker3 ShortCut = 24627 end item Command = ecSetMarker4 ShortCut = 24628 end item Command = ecSetMarker5 ShortCut = 24629 end item Command = ecSetMarker6 ShortCut = 24630 end item Command = ecSetMarker7 ShortCut = 24631 end item Command = ecSetMarker8 ShortCut = 24632 end item Command = ecSetMarker9 ShortCut = 24633 end item Command = ecNormalSelect ShortCut = 24654 end item Command = ecColumnSelect ShortCut = 24643 end item Command = ecLineSelect ShortCut = 24652 end item Command = ecTab ShortCut = 9 end item Command = ecShiftTab ShortCut = 8201 end item Command = ecMatchBracket ShortCut = 24642 end> MouseActions = <> MouseSelActions = <> Lines.Strings = ( 'ColorPreview' ) VisibleSpecialChars = [vscSpace, vscTabAtLast] BracketHighlightStyle = sbhsBoth BracketMatchColor.Background = clNone BracketMatchColor.Foreground = clNone BracketMatchColor.Style = [fsBold] FoldedCodeColor.Background = clNone FoldedCodeColor.Foreground = clGray FoldedCodeColor.FrameColor = clGray MouseLinkColor.Background = clNone MouseLinkColor.Foreground = clBlue LineHighlightColor.Background = clNone LineHighlightColor.Foreground = clNone inline TSynGutterPartList object TSynGutterMarks Width = 24 MouseActions = <> end object TSynGutterLineNumber Width = 19 MouseActions = <> MarkupInfo.Background = clBtnFace MarkupInfo.Foreground = clNone DigitCount = 2 ShowOnlyLineNumbersMultiplesOf = 1 ZeroStart = False LeadingZeros = False end object TSynGutterChanges Width = 4 MouseActions = <> ModifiedColor = 59900 SavedColor = clGreen end object TSynGutterSeparator Width = 2 MouseActions = <> end object TSynGutterCodeFolding MouseActions = <> MarkupInfo.Background = clNone MarkupInfo.Foreground = clGray MouseActionsExpanded = <> MouseActionsCollapsed = <> end end end object Splitter1: TSplitter Left = 205 Height = 133 Top = 0 Width = 5 end object ColorElementTree: TListBox Left = 0 Height = 133 Top = 0 Width = 205 Align = alLeft ItemHeight = 0 OnDrawItem = ColorElementTreeDrawItem OnSelectionChange = ColorElementTreeSelectionChange ScrollWidth = 203 Style = lbOwnerDrawFixed TabOrder = 2 end end object pnlElementAttributes: TPanel[2] AnchorSideLeft.Control = Owner AnchorSideTop.Control = PnlTop2 AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 0 Height = 200 Top = 157 Width = 680 Anchors = [akLeft, akRight, akBottom] AutoSize = True BevelOuter = bvNone ClientHeight = 200 ClientWidth = 680 Constraints.MinHeight = 200 TabOrder = 2 OnResize = pnlElementAttributesResize object ForeGroundLabel: TLabel AnchorSideLeft.Control = pnlElementAttributes AnchorSideTop.Control = ForegroundColorBox AnchorSideTop.Side = asrCenter Left = 6 Height = 13 Top = 49 Width = 56 BorderSpacing.Left = 6 Caption = 'Fo®round' FocusControl = ForegroundColorBox ParentColor = False Visible = False end object BackGroundLabel: TLabel AnchorSideLeft.Control = pnlElementAttributes AnchorSideTop.Control = BackGroundColorBox AnchorSideTop.Side = asrCenter Left = 6 Height = 13 Top = 74 Width = 56 BorderSpacing.Left = 6 Caption = 'Bac&kground' FocusControl = BackGroundColorBox ParentColor = False Visible = False end object ForeGroundUseDefaultCheckBox: TCheckBox AnchorSideLeft.Control = pnlElementAttributes AnchorSideTop.Control = ForegroundColorBox AnchorSideTop.Side = asrCenter Left = 6 Height = 17 Top = 47 Width = 74 BorderSpacing.Left = 6 Caption = 'Fo®round' OnChange = GeneralCheckBoxOnChange TabOrder = 0 end object ForegroundColorBox: TColorBox AnchorSideLeft.Control = ColumnPosBevel AnchorSideTop.Control = ToolBar1 AnchorSideTop.Side = asrBottom AnchorSideRight.Control = pnlElementAttributes AnchorSideRight.Side = asrBottom Left = 86 Height = 22 Top = 44 Width = 200 DefaultColorColor = clWhite Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbIncludeDefault, cbCustomColor, cbPrettyNames, cbCustomColors] Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 3 Constraints.MaxWidth = 200 ItemHeight = 16 OnChange = ForegroundColorBoxChange TabOrder = 1 end object BackGroundColorBox: TColorBox AnchorSideLeft.Control = ColumnPosBevel AnchorSideTop.Control = ForegroundColorBox AnchorSideTop.Side = asrBottom AnchorSideRight.Control = pnlElementAttributes AnchorSideRight.Side = asrBottom Left = 86 Height = 22 Top = 69 Width = 200 DefaultColorColor = clWhite Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbIncludeDefault, cbCustomColor, cbPrettyNames, cbCustomColors] Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 3 Constraints.MaxWidth = 200 ItemHeight = 16 OnChange = ForegroundColorBoxChange TabOrder = 3 end object BackGroundUseDefaultCheckBox: TCheckBox AnchorSideLeft.Control = pnlElementAttributes AnchorSideTop.Control = BackGroundColorBox AnchorSideTop.Side = asrCenter AnchorSideRight.Side = asrBottom Left = 6 Height = 17 Top = 72 Width = 74 BorderSpacing.Left = 6 Caption = 'Bac&kground' OnChange = GeneralCheckBoxOnChange TabOrder = 2 end object FrameColorBox: TColorBox AnchorSideLeft.Control = ColumnPosBevel AnchorSideTop.Control = BackGroundColorBox AnchorSideTop.Side = asrBottom AnchorSideRight.Control = pnlElementAttributes AnchorSideRight.Side = asrBottom Left = 86 Height = 22 Top = 94 Width = 200 DefaultColorColor = clWhite Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbIncludeDefault, cbCustomColor, cbPrettyNames, cbCustomColors] Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 3 Constraints.MaxWidth = 200 ItemHeight = 16 OnChange = ForegroundColorBoxChange TabOrder = 5 end object FrameColorUseDefaultCheckBox: TCheckBox AnchorSideLeft.Control = pnlElementAttributes AnchorSideTop.Control = FrameColorBox AnchorSideTop.Side = asrCenter AnchorSideRight.Side = asrBottom Left = 6 Height = 17 Top = 97 Width = 67 BorderSpacing.Left = 6 Caption = '&Text-mark' OnChange = GeneralCheckBoxOnChange TabOrder = 4 end object bvlAttributeSection: TDividerBevel Left = 0 Height = 17 Top = 0 Width = 680 Caption = 'Element Attributes' Align = alTop Font.Style = [fsBold] ParentFont = False end object pnlUnderline: TPanel AnchorSideLeft.Control = pnlElementAttributes AnchorSideTop.Control = FrameEdgesBox AnchorSideTop.Side = asrBottom Left = 6 Height = 36 Top = 143 Width = 125 AutoSize = True BorderSpacing.Left = 6 BorderSpacing.Top = 3 BevelOuter = bvNone ClientHeight = 36 ClientWidth = 125 TabOrder = 6 object TextUnderlineRadioPanel: TPanel AnchorSideLeft.Control = TextUnderlineCheckBox AnchorSideTop.Control = TextUnderlineCheckBox AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 0 Height = 19 Top = 17 Width = 125 AutoSize = True BevelInner = bvLowered BevelOuter = bvNone ClientHeight = 19 ClientWidth = 125 TabOrder = 0 object TextUnderlineRadioOn: TRadioButton Tag = 3 AnchorSideLeft.Control = TextUnderlineRadioPanel AnchorSideTop.Control = TextUnderlineRadioPanel AnchorSideRight.Control = TextUnderlineRadioOff Left = 4 Height = 17 Top = 1 Width = 32 BorderSpacing.Left = 3 BorderSpacing.Right = 3 Caption = 'O&n' Checked = True OnChange = TextStyleRadioOnChange TabOrder = 0 TabStop = True end object TextUnderlineRadioOff: TRadioButton Tag = 3 AnchorSideLeft.Control = TextUnderlineRadioOn AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = TextUnderlineRadioOn AnchorSideRight.Control = TextUnderlineRadioInvert Left = 39 Height = 17 Top = 1 Width = 34 BorderSpacing.Left = 3 BorderSpacing.Right = 3 Caption = 'O&ff' OnChange = TextStyleRadioOnChange TabOrder = 1 end object TextUnderlineRadioInvert: TRadioButton Tag = 3 AnchorSideLeft.Control = TextUnderlineRadioOff AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = TextUnderlineRadioPanel AnchorSideRight.Control = TextUnderlineRadioPanel AnchorSideRight.Side = asrBottom Left = 76 Height = 17 Top = 1 Width = 48 BorderSpacing.Left = 3 Caption = 'In&vert' OnChange = TextStyleRadioOnChange TabOrder = 2 end end object TextUnderlineCheckBox: TCheckBox AnchorSideLeft.Control = pnlUnderline AnchorSideTop.Control = pnlUnderline Left = 0 Height = 17 Top = 0 Width = 63 Caption = '&Underline' OnChange = GeneralCheckBoxOnChange TabOrder = 1 end end object pnlBold: TPanel AnchorSideLeft.Control = pnlUnderline AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlUnderline Left = 137 Height = 36 Top = 143 Width = 125 AutoSize = True BorderSpacing.Left = 6 BevelOuter = bvNone ClientHeight = 36 ClientWidth = 125 TabOrder = 7 object TextBoldRadioPanel: TPanel AnchorSideLeft.Control = TextBoldCheckBox AnchorSideTop.Control = TextBoldCheckBox AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 0 Height = 19 Top = 17 Width = 125 AutoSize = True BevelInner = bvLowered BevelOuter = bvNone ClientHeight = 19 ClientWidth = 125 TabOrder = 0 object TextBoldRadioInvert: TRadioButton Tag = 2 AnchorSideLeft.Control = TextBoldRadioOff AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = TextBoldRadioPanel AnchorSideRight.Control = TextBoldRadioPanel AnchorSideRight.Side = asrBottom Left = 76 Height = 17 Top = 1 Width = 48 BorderSpacing.Left = 3 Caption = 'In&vert' OnChange = TextStyleRadioOnChange TabOrder = 2 end object TextBoldRadioOn: TRadioButton Tag = 2 AnchorSideLeft.Control = TextBoldRadioPanel AnchorSideTop.Control = TextBoldRadioPanel AnchorSideRight.Control = TextBoldRadioOff Left = 4 Height = 17 Top = 1 Width = 32 BorderSpacing.Left = 3 BorderSpacing.Right = 3 Caption = 'O&n' Checked = True OnChange = TextStyleRadioOnChange TabOrder = 0 TabStop = True end object TextBoldRadioOff: TRadioButton Tag = 2 AnchorSideLeft.Control = TextBoldRadioOn AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = TextBoldRadioPanel AnchorSideRight.Control = TextBoldRadioInvert Left = 39 Height = 17 Top = 1 Width = 34 BorderSpacing.Left = 3 BorderSpacing.Right = 3 Caption = 'O&ff' OnChange = TextStyleRadioOnChange TabOrder = 1 end end object TextBoldCheckBox: TCheckBox AnchorSideLeft.Control = pnlBold AnchorSideTop.Control = pnlBold Left = 0 Height = 17 Top = 0 Width = 38 Caption = '&Bold' OnChange = GeneralCheckBoxOnChange TabOrder = 1 end end object pnlItalic: TPanel AnchorSideLeft.Control = pnlBold AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlUnderline Left = 268 Height = 36 Top = 143 Width = 125 AutoSize = True BorderSpacing.Left = 6 BevelOuter = bvNone ClientHeight = 36 ClientWidth = 125 TabOrder = 8 object TextItalicRadioPanel: TPanel AnchorSideLeft.Control = TextItalicCheckBox AnchorSideTop.Control = TextItalicCheckBox AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 0 Height = 19 Top = 17 Width = 125 AutoSize = True BevelInner = bvLowered BevelOuter = bvNone ClientHeight = 19 ClientWidth = 125 TabOrder = 0 object TextItalicRadioInvert: TRadioButton Tag = 2 AnchorSideLeft.Control = TextItalicRadioOff AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = TextItalicRadioPanel AnchorSideRight.Control = TextItalicRadioPanel AnchorSideRight.Side = asrBottom Left = 76 Height = 17 Top = 1 Width = 48 BorderSpacing.Left = 3 Caption = 'In&vert' OnChange = TextStyleRadioOnChange TabOrder = 2 end object TextItalicRadioOn: TRadioButton Tag = 2 AnchorSideLeft.Control = TextItalicRadioPanel AnchorSideTop.Control = TextItalicRadioPanel AnchorSideRight.Control = TextItalicRadioOff Left = 4 Height = 17 Top = 1 Width = 32 BorderSpacing.Left = 3 BorderSpacing.Right = 3 Caption = 'O&n' Checked = True OnChange = TextStyleRadioOnChange TabOrder = 0 TabStop = True end object TextItalicRadioOff: TRadioButton Tag = 2 AnchorSideLeft.Control = TextItalicRadioOn AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = TextItalicRadioPanel AnchorSideRight.Control = TextItalicRadioInvert Left = 39 Height = 17 Top = 1 Width = 34 BorderSpacing.Left = 3 BorderSpacing.Right = 3 Caption = 'O&ff' OnChange = TextStyleRadioOnChange TabOrder = 1 end end object TextItalicCheckBox: TCheckBox AnchorSideLeft.Control = pnlItalic AnchorSideTop.Control = pnlItalic Left = 0 Height = 17 Top = 0 Width = 41 Caption = '&Italic' OnChange = GeneralCheckBoxOnChange TabOrder = 1 end end object FrameStyleBox: TComboBox AnchorSideLeft.Control = FrameEdgesBox AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = FrameEdgesBox Left = 189 Height = 21 Top = 119 Width = 97 BorderSpacing.Left = 6 ItemHeight = 15 Items.Strings = ( 'slsSolid' 'slsDashed' 'slsDotted' 'slsWaved' ) OnChange = ForegroundColorBoxChange OnDrawItem = FrameStyleBoxDrawItem ReadOnly = True Style = csOwnerDrawFixed TabOrder = 9 end object FrameEdgesBox: TComboBox AnchorSideLeft.Control = FrameColorBox AnchorSideTop.Control = FrameColorBox AnchorSideTop.Side = asrBottom Left = 86 Height = 21 Top = 119 Width = 97 BorderSpacing.Top = 3 ItemHeight = 15 Items.Strings = ( 'Around' 'Bottom' 'Left' ) OnChange = ForegroundColorBoxChange OnDrawItem = FrameEdgesBoxDrawItem ReadOnly = True Style = csOwnerDrawFixed TabOrder = 10 end object ColumnPosBevel: TPanel AnchorSideLeft.Control = ForeGroundUseDefaultCheckBox AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlUnderline AnchorSideTop.Side = asrBottom AnchorSideBottom.Control = pnlElementAttributes AnchorSideBottom.Side = asrBottom Left = 86 Height = 1 Top = 179 Width = 50 AutoSize = True BorderSpacing.Left = 6 BevelOuter = bvNone Constraints.MinHeight = 1 Constraints.MinWidth = 50 TabOrder = 11 end object pnlStrikeOut: TPanel AnchorSideLeft.Control = pnlItalic AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlUnderline Left = 417 Height = 36 Top = 143 Width = 131 AutoSize = True BorderSpacing.Left = 6 BevelOuter = bvNone ClientHeight = 36 ClientWidth = 131 TabOrder = 12 object TextStrikeOutRadioPanel: TPanel AnchorSideLeft.Control = TextStrikeOutCheckBox AnchorSideTop.Control = TextStrikeOutCheckBox AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 0 Height = 19 Top = 17 Width = 131 AutoSize = True BevelInner = bvLowered BevelOuter = bvNone ClientHeight = 19 ClientWidth = 131 TabOrder = 0 object TextStrikeOutRadioInvert: TRadioButton Tag = 2 AnchorSideLeft.Control = TextStrikeOutRadioOff AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = TextStrikeOutRadioPanel AnchorSideRight.Control = TextStrikeOutRadioPanel AnchorSideRight.Side = asrBottom Left = 80 Height = 17 Top = 1 Width = 50 BorderSpacing.Left = 3 Caption = 'In&vert' OnChange = TextStyleRadioOnChange TabOrder = 2 end object TextStrikeOutRadioOn: TRadioButton Tag = 2 AnchorSideLeft.Control = TextStrikeOutRadioPanel AnchorSideTop.Control = TextStrikeOutRadioPanel AnchorSideRight.Control = TextStrikeOutRadioOff Left = 4 Height = 17 Top = 1 Width = 34 BorderSpacing.Left = 3 BorderSpacing.Right = 3 Caption = 'O&n' Checked = True OnChange = TextStyleRadioOnChange TabOrder = 0 TabStop = True end object TextStrikeOutRadioOff: TRadioButton Tag = 2 AnchorSideLeft.Control = TextStrikeOutRadioOn AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = TextStrikeOutRadioPanel AnchorSideRight.Control = TextStrikeOutRadioInvert Left = 41 Height = 17 Top = 1 Width = 36 BorderSpacing.Left = 3 BorderSpacing.Right = 3 Caption = 'O&ff' OnChange = TextStyleRadioOnChange TabOrder = 1 end end object TextStrikeOutCheckBox: TCheckBox AnchorSideLeft.Control = pnlStrikeOut AnchorSideTop.Control = pnlStrikeOut Left = 0 Height = 17 Top = 0 Width = 68 Caption = '&Strike Out' OnChange = GeneralCheckBoxOnChange TabOrder = 1 end end object ToolBar1: TToolBar Left = 3 Height = 24 Top = 17 Width = 674 AutoSize = True BorderSpacing.Left = 3 BorderSpacing.Right = 3 EdgeBorders = [ebBottom] ParentShowHint = False ShowCaptions = True ShowHint = True TabOrder = 13 object tbtnGlobal: TToolButton Tag = 1 Left = 1 Top = 0 AutoSize = True Caption = 'Use (and edit) &global scheme settings' Down = True Grouped = True OnClick = tbtnGlobalClick Style = tbsCheck end object tbtnLocal: TToolButton Tag = 1 Left = 198 Top = 0 AutoSize = True Caption = 'Use &local scheme settings' Grouped = True OnClick = tbtnGlobalClick Style = tbsCheck end object ToolButton3: TToolButton Left = 188 Top = 0 Width = 10 Style = tbsSeparator end end end end doublecmd-0.5.8/src/frames/foptionseditorcolors.lrt0000644000175000017500000000274112020403374021566 0ustar alexxalexxTFRMOPTIONSEDITORCOLORS.FOREGROUNDLABEL.CAPTION=Fo®round TFRMOPTIONSEDITORCOLORS.BACKGROUNDLABEL.CAPTION=Bac&kground TFRMOPTIONSEDITORCOLORS.FOREGROUNDUSEDEFAULTCHECKBOX.CAPTION=Fo®round TFRMOPTIONSEDITORCOLORS.BACKGROUNDUSEDEFAULTCHECKBOX.CAPTION=Bac&kground TFRMOPTIONSEDITORCOLORS.FRAMECOLORUSEDEFAULTCHECKBOX.CAPTION=&Text-mark TFRMOPTIONSEDITORCOLORS.BVLATTRIBUTESECTION.CAPTION=Element Attributes TFRMOPTIONSEDITORCOLORS.TEXTUNDERLINERADIOON.CAPTION=O&n TFRMOPTIONSEDITORCOLORS.TEXTUNDERLINERADIOOFF.CAPTION=O&ff TFRMOPTIONSEDITORCOLORS.TEXTUNDERLINERADIOINVERT.CAPTION=In&vert TFRMOPTIONSEDITORCOLORS.TEXTUNDERLINECHECKBOX.CAPTION=&Underline TFRMOPTIONSEDITORCOLORS.TEXTBOLDRADIOINVERT.CAPTION=In&vert TFRMOPTIONSEDITORCOLORS.TEXTBOLDRADIOON.CAPTION=O&n TFRMOPTIONSEDITORCOLORS.TEXTBOLDRADIOOFF.CAPTION=O&ff TFRMOPTIONSEDITORCOLORS.TEXTBOLDCHECKBOX.CAPTION=&Bold TFRMOPTIONSEDITORCOLORS.TEXTITALICRADIOINVERT.CAPTION=In&vert TFRMOPTIONSEDITORCOLORS.TEXTITALICRADIOON.CAPTION=O&n TFRMOPTIONSEDITORCOLORS.TEXTITALICRADIOOFF.CAPTION=O&ff TFRMOPTIONSEDITORCOLORS.TEXTITALICCHECKBOX.CAPTION=&Italic TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTRADIOINVERT.CAPTION=In&vert TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTRADIOON.CAPTION=O&n TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTRADIOOFF.CAPTION=O&ff TFRMOPTIONSEDITORCOLORS.TEXTSTRIKEOUTCHECKBOX.CAPTION=&Strike Out TFRMOPTIONSEDITORCOLORS.TBTNGLOBAL.CAPTION=Use (and edit) &global scheme settings TFRMOPTIONSEDITORCOLORS.TBTNLOCAL.CAPTION=Use &local scheme settings doublecmd-0.5.8/src/frames/foptionsfilesviews.lfm0000644000175000017500000002362612024554637021235 0ustar alexxalexxinherited frmOptionsFilesViews: TfrmOptionsFilesViews Height = 581 Width = 640 ClientHeight = 581 ClientWidth = 640 DesignLeft = 554 DesignTop = 98 object gbSorting: TGroupBox[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 156 Top = 6 Width = 628 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = 'Sorting' ChildSizing.LeftRightSpacing = 12 ChildSizing.TopBottomSpacing = 8 ChildSizing.HorizontalSpacing = 6 ChildSizing.VerticalSpacing = 12 ChildSizing.Layout = cclLeftToRightThenTopToBottom ClientHeight = 138 ClientWidth = 624 TabOrder = 0 object lblSortMethod: TLabel AnchorSideTop.Side = asrCenter Left = 12 Height = 14 Top = 8 Width = 92 Caption = '&Sort method:' FocusControl = cbSortMethod ParentColor = False end object cbSortMethod: TComboBox AnchorSideLeft.Control = lblSortMethod AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblSortMethod AnchorSideTop.Side = asrCenter AnchorSideRight.Control = gbSorting AnchorSideRight.Side = asrBottom Left = 114 Height = 21 Top = 5 Width = 498 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 ItemHeight = 13 Items.Strings = ( 'Alphabetical, considering accents' 'Natural sorting: alphabetical and numbers' ) Style = csDropDownList TabOrder = 0 end object lblCaseSensitivity: TLabel Left = 12 Height = 14 Top = 34 Width = 92 Caption = 'Case s&ensitivity:' FocusControl = cbCaseSensitivity ParentColor = False end object cbCaseSensitivity: TComboBox AnchorSideLeft.Control = lblCaseSensitivity AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblCaseSensitivity AnchorSideTop.Side = asrCenter AnchorSideRight.Control = gbSorting AnchorSideRight.Side = asrBottom Left = 114 Height = 21 Top = 31 Width = 498 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 ItemHeight = 13 Items.Strings = ( 'not case sensitive' 'according to locale settings (aAbBcC)' 'first upper then lower case (ABCabc)' ) Style = csDropDownList TabOrder = 1 end object lblSortFolderMode: TLabel Left = 12 Height = 14 Top = 60 Width = 92 Caption = 'So&rting directories:' FocusControl = cbSortFolderMode ParentColor = False end object cbSortFolderMode: TComboBox AnchorSideLeft.Control = lblSortFolderMode AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblSortFolderMode AnchorSideTop.Side = asrCenter AnchorSideRight.Control = gbSorting AnchorSideRight.Side = asrBottom Left = 114 Height = 21 Top = 57 Width = 498 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 ItemHeight = 13 Items.Strings = ( 'sort by name and show first' 'sort like files and show first' 'sort like files' ) Style = csDropDownList TabOrder = 2 end object lblNewFilesPosition: TLabel Left = 12 Height = 14 Top = 86 Width = 92 Caption = '&Insert new files' FocusControl = cbNewFilesPosition ParentColor = False end object cbNewFilesPosition: TComboBox AnchorSideLeft.Control = lblNewFilesPosition AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblNewFilesPosition AnchorSideTop.Side = asrCenter AnchorSideRight.Control = gbSorting AnchorSideRight.Side = asrBottom Left = 114 Height = 21 Top = 83 Width = 498 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 ItemHeight = 13 Style = csDropDownList TabOrder = 3 end object lblUpdatedFilesPosition: TLabel Left = 12 Height = 14 Top = 112 Width = 92 Caption = '&Move updated files' FocusControl = cbUpdatedFilesPosition ParentColor = False end object cbUpdatedFilesPosition: TComboBox AnchorSideLeft.Control = lblUpdatedFilesPosition AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblUpdatedFilesPosition AnchorSideTop.Side = asrCenter AnchorSideRight.Control = gbSorting AnchorSideRight.Side = asrBottom Left = 114 Height = 21 Top = 109 Width = 498 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 ItemHeight = 13 Style = csDropDownList TabOrder = 4 end end object gbMisc: TGroupBox[1] AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbFormatting AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 173 Top = 252 Width = 628 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ChildSizing.VerticalSpacing = 4 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 155 ClientWidth = 624 TabOrder = 2 object cbSpaceMovesDown: TCheckBox Left = 6 Height = 17 Top = 6 Width = 426 Caption = '&When selecting files with , move down to next file (as with )' TabOrder = 0 end object cbDirBrackets: TCheckBox Left = 6 Height = 17 Top = 27 Width = 426 Caption = 'S&how square brackets around directories' TabOrder = 1 end object cbShowSystemFiles: TCheckBox Left = 6 Height = 17 Top = 48 Width = 426 Caption = 'Show s&ystem and hidden files' TabOrder = 2 end object cbListFilesInThread: TCheckBox Left = 6 Height = 17 Top = 69 Width = 426 Caption = 'Load &file list in separate thread' TabOrder = 3 end object cbLoadIconsSeparately: TCheckBox Left = 6 Height = 17 Top = 90 Width = 426 Caption = 'Load icons af&ter file list' TabOrder = 4 end object cbDelayLoadingTabs: TCheckBox Left = 6 Height = 17 Top = 111 Width = 426 Caption = 'Do&n''t load file list until a tab is activated' TabOrder = 5 end object cbHighlightUpdatedFiles: TCheckBox Left = 6 Height = 17 Top = 132 Width = 426 Caption = 'Hi&ghlight new and updated files' TabOrder = 6 end end object gbFormatting: TGroupBox[2] AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbSorting AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 78 Top = 168 Width = 628 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = 'Formatting' ChildSizing.LeftRightSpacing = 12 ChildSizing.TopBottomSpacing = 8 ChildSizing.HorizontalSpacing = 6 ChildSizing.VerticalSpacing = 12 ChildSizing.Layout = cclLeftToRightThenTopToBottom ClientHeight = 60 ClientWidth = 624 TabOrder = 1 object lblDateTimeFormat: TLabel AnchorSideTop.Side = asrCenter Left = 12 Height = 14 Top = 8 Width = 107 Caption = '&Date and time format:' FocusControl = cbDateTimeFormat ParentColor = False end object cbFileSizeFormat: TComboBox AnchorSideLeft.Control = lblFileSizeFormat AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblFileSizeFormat AnchorSideTop.Side = asrCenter AnchorSideRight.Control = gbFormatting AnchorSideRight.Side = asrBottom Left = 129 Height = 21 Top = 31 Width = 483 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 ItemHeight = 13 Style = csDropDownList TabOrder = 1 end object lblFileSizeFormat: TLabel Left = 12 Height = 14 Top = 34 Width = 107 Caption = 'File si&ze format:' FocusControl = cbFileSizeFormat ParentColor = False end object pnlDateTime: TPanel AnchorSideLeft.Control = lblDateTimeFormat AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblDateTimeFormat AnchorSideTop.Side = asrCenter AnchorSideRight.Control = gbFormatting AnchorSideRight.Side = asrBottom Left = 129 Height = 21 Top = 5 Width = 483 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Left = 10 BevelOuter = bvNone ClientHeight = 21 ClientWidth = 483 TabOrder = 0 object lblDateTimeExample: TLabel AnchorSideTop.Control = cbDateTimeFormat AnchorSideTop.Side = asrCenter AnchorSideRight.Control = pnlDateTime AnchorSideRight.Side = asrBottom Left = 387 Height = 14 Top = 3 Width = 96 Anchors = [akTop, akRight] Caption = 'Incorrect format' Font.Style = [fsBold] ParentColor = False ParentFont = False end object cbDateTimeFormat: TComboBox AnchorSideRight.Control = lblDateTimeExample Left = 0 Height = 21 Top = 0 Width = 379 Align = alLeft Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Right = 8 ItemHeight = 13 Items.Strings = ( 'yyyy/mm/dd hh:mm:ss' 'yyyy/mm/dd hh:mm' 'yy/mm/dd hh:mm' 'dd/mm/yyyy hh:mm:ss' 'dd/mm/yyyy hh:mm' 'dd/mm/yy hh:mm' 'dd/mm/yyyy' 'dd/mm/yy' ) OnChange = cbDateTimeFormatChange TabOrder = 0 end end end end doublecmd-0.5.8/src/frames/foptionsicons.pas0000644000175000017500000001156412111165165020162 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Icons options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsIcons; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, ExtCtrls, fOptionsFrame; type { TfrmOptionsIcons } TfrmOptionsIcons = class(TOptionsEditor) cbIconsShowOverlay: TCheckBox; cbIconsSize: TComboBox; cbIconsExclude: TCheckBox; cbIconsInMenusSize: TComboBox; cbIconsInMenus: TCheckBox; edtIconsExcludeDirs: TEdit; gbIconsSize: TGroupBox; gbShowIconsMode: TGroupBox; gbDisableSpecialIcons: TGroupBox; gbIconsInMenus: TGroupBox; imgIconExample: TImage; pnlIconExample: TPanel; rbIconsShowAll: TRadioButton; rbIconsShowAllAndExe: TRadioButton; rbIconsShowNone: TRadioButton; rbIconsShowStandard: TRadioButton; procedure cbIconsExcludeChange(Sender: TObject); procedure cbIconsSizeChange(Sender: TObject); procedure rbIconsShowNoneChange(Sender: TObject); public class function GetIconIndex: Integer; override; class function GetTitle: String; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; end; implementation {$R *.lfm} uses Graphics, uPixMapManager, uGlobs, uLng; { TfrmOptionsIcons } procedure TfrmOptionsIcons.cbIconsSizeChange(Sender: TObject); var bmpTemp: TBitmap; iSize: Integer; begin case cbIconsSize.ItemIndex of 0: iSize:= 16; 1: iSize:= 22; 2: iSize:= 32; end; bmpTemp:= PixmapManager.GetDefaultDriveIcon(iSize, pnlIconExample.Color); imgIconExample.Picture.Bitmap.Assign(bmpTemp); FreeAndNil(bmpTemp); end; procedure TfrmOptionsIcons.cbIconsExcludeChange(Sender: TObject); begin edtIconsExcludeDirs.Enabled:= cbIconsExclude.Checked; end; procedure TfrmOptionsIcons.rbIconsShowNoneChange(Sender: TObject); begin cbIconsSize.Enabled := not rbIconsShowNone.Checked; cbIconsShowOverlay.Enabled := not rbIconsShowNone.Checked; gbDisableSpecialIcons.Enabled := not rbIconsShowNone.Checked; end; class function TfrmOptionsIcons.GetIconIndex: Integer; begin Result := 16; end; class function TfrmOptionsIcons.GetTitle: String; begin Result := rsOptionsEditorIcons; end; procedure TfrmOptionsIcons.Load; begin case gShowIconsNew of sim_none: rbIconsShowNone.Checked:= True; sim_standart: rbIconsShowStandard.Checked:= True; sim_all: rbIconsShowAll.Checked:= True; sim_all_and_exe: rbIconsShowAllAndExe.Checked := True; end; cbIconsShowOverlay.Checked:= gIconOverlays; cbIconsExclude.Checked:= gIconsExclude; cbIconsInMenus.Checked := gIconsInMenus; edtIconsExcludeDirs.Text:= gIconsExcludeDirs; edtIconsExcludeDirs.Enabled:= gIconsExclude; cbIconsSize.Text := IntToStr(gIconsSizeNew) + 'x' + IntToStr(gIconsSizeNew); cbIconsInMenusSize.Text := IntToStr(gIconsInMenusSizeNew) + 'x' + IntToStr(gIconsInMenusSizeNew); cbIconsSizeChange(nil); end; function TfrmOptionsIcons.Save: TOptionsEditorSaveFlags; var SelectedShowIcons: TShowIconsMode = sim_none; SelectedIconsSize: Integer; begin Result := []; if rbIconsShowNone.Checked then SelectedShowIcons := sim_none else if rbIconsShowStandard.Checked then SelectedShowIcons := sim_standart else if rbIconsShowAll.Checked then SelectedShowIcons := sim_all else if rbIconsShowAllAndExe.Checked then SelectedShowIcons := sim_all_and_exe; case cbIconsSize.ItemIndex of 0: SelectedIconsSize := 16; 1: SelectedIconsSize := 22; 2: SelectedIconsSize := 32; else SelectedIconsSize := gIconsSizeNew; end; case cbIconsInMenusSize.ItemIndex of 0: gIconsInMenusSizeNew := 16; 1: gIconsInMenusSizeNew := 22; 2: gIconsInMenusSizeNew := 32; end; if (gIconsSizeNew <> SelectedIconsSize) or (gShowIconsNew <> SelectedShowIcons) or (gIconsInMenusSizeNew <> gIconsInMenusSize) then begin Include(Result, oesfNeedsRestart); end; gIconsSizeNew := SelectedIconsSize; gShowIconsNew := SelectedShowIcons; gIconOverlays := cbIconsShowOverlay.Checked; gIconsExclude := cbIconsExclude.Checked; gIconsExcludeDirs := edtIconsExcludeDirs.Text; gIconsInMenus := cbIconsInMenus.Checked; end; end. doublecmd-0.5.8/src/frames/foptionsfonts.lrt0000644000175000017500000000073612020403374020211 0ustar alexxalexxTFRMOPTIONSFONTS.LBLMAINFONT.CAPTION=Main &font TFRMOPTIONSFONTS.LBLEDITORFONT.CAPTION=&Editor font TFRMOPTIONSFONTS.LBLVIEWERFONT.CAPTION=&Viewer font TFRMOPTIONSFONTS.BTNSELMAINFNT.CAPTION=... TFRMOPTIONSFONTS.BTNSELEDITFNT.CAPTION=... TFRMOPTIONSFONTS.BTNSELVIEWFNT.CAPTION=... TFRMOPTIONSFONTS.LBLLOGFONT.CAPTION=&Log font TFRMOPTIONSFONTS.BTNSELLOGFNT.CAPTION=... TFRMOPTIONSFONTS.LBLVIEWERBOOKFONT.CAPTION=Viewer&Book Font TFRMOPTIONSFONTS.BTNSELVIEWERBOOKFNT.CAPTION=... doublecmd-0.5.8/src/frames/foptionsicons.lrt0000644000175000017500000000147312111165165020176 0ustar alexxalexxTFRMOPTIONSICONS.GBICONSSIZE.CAPTION= Icon size TFRMOPTIONSICONS.CBICONSSIZE.TEXT=16x16 TFRMOPTIONSICONS.GBSHOWICONSMODE.CAPTION= Show icons to the left of the filename TFRMOPTIONSICONS.RBICONSSHOWALL.CAPTION=A&ll TFRMOPTIONSICONS.RBICONSSHOWSTANDARD.CAPTION=Only &standard icons TFRMOPTIONSICONS.RBICONSSHOWNONE.CAPTION=&No icons TFRMOPTIONSICONS.RBICONSSHOWALLANDEXE.CAPTION=All associated + &EXE/LNK (slow) TFRMOPTIONSICONS.CBICONSSHOWOVERLAY.CAPTION=Show o&verlay icons, e.g. for links TFRMOPTIONSICONS.GBDISABLESPECIALICONS.CAPTION=Disable special icons TFRMOPTIONSICONS.CBICONSEXCLUDE.CAPTION=For the following &paths and their subdirectories: TFRMOPTIONSICONS.GBICONSINMENUS.CAPTION=Icons in menus TFRMOPTIONSICONS.CBICONSINMENUS.CAPTION=Show icons for actions in &menus TFRMOPTIONSICONS.CBICONSINMENUSSIZE.TEXT=16x16 doublecmd-0.5.8/src/frames/foptionsmisc.pas0000644000175000017500000000525512112400256017774 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Miscellaneous options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsMisc; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, Spin, DividerBevel, fOptionsFrame; type { TfrmOptionsMisc } TfrmOptionsMisc = class(TOptionsEditor) btnThumbCompactCache: TButton; chkGoToRoot: TCheckBox; chkThumbSave: TCheckBox; chkShowWarningMessages: TCheckBox; dblThumbnails: TDividerBevel; gbExtended: TGroupBox; lblThumbPixels: TLabel; lblThumbSize: TLabel; lblThumbSeparator: TLabel; speThumbWidth: TSpinEdit; speThumbHeight: TSpinEdit; procedure btnThumbCompactCacheClick(Sender: TObject); protected procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses uGlobs, uLng, uThumbnails; { TfrmOptionsMisc } class function TfrmOptionsMisc.GetIconIndex: Integer; begin Result := 14; end; class function TfrmOptionsMisc.GetTitle: String; begin Result := rsOptionsEditorMiscellaneous; end; procedure TfrmOptionsMisc.btnThumbCompactCacheClick(Sender: TObject); begin TThumbnailManager.CompactCache; end; procedure TfrmOptionsMisc.Load; begin chkShowWarningMessages.Checked := gShowWarningMessages; chkThumbSave.Checked := gThumbSave; speThumbWidth.Value := gThumbSize.cx; speThumbHeight.Value := gThumbSize.cy; chkGoToRoot.Checked := gGoToRoot; end; function TfrmOptionsMisc.Save: TOptionsEditorSaveFlags; begin Result := []; gShowWarningMessages := chkShowWarningMessages.Checked; gThumbSave := chkThumbSave.Checked; gThumbSize.cx := speThumbWidth.Value; gThumbSize.cy := speThumbHeight.Value; gGoToRoot := chkGoToRoot.Checked; end; end. doublecmd-0.5.8/src/frames/foptionsbehavior.lrt0000644000175000017500000000077612020403374020663 0ustar alexxalexxTFRMOPTIONSBEHAVIOR.CBONLYONCE.CAPTION=A&llow only one copy of DC at a time TFRMOPTIONSBEHAVIOR.CBMINIMIZETOTRAY.CAPTION=Mo&ve icon to system tray when minimized TFRMOPTIONSBEHAVIOR.CBALWAYSSHOWTRAYICON.CAPTION=Al&ways show tray icon TFRMOPTIONSBEHAVIOR.LBLDRIVESBLACKLIST.CAPTION=Drives &blacklist TFRMOPTIONSBEHAVIOR.EDTDRIVESBLACKLIST.HINT=Here you can enter one or more drives or mount points, separated by ";". TFRMOPTIONSBEHAVIOR.CBBLACKLISTUNMOUNTEDDEVICES.CAPTION=Automatically &hide unmounted devices doublecmd-0.5.8/src/frames/foptionslanguage.pas0000644000175000017500000000533611740427612020637 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Language options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsLanguage; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, fOptionsFrame; type { TfrmOptionsLanguage } TfrmOptionsLanguage = class(TOptionsEditor) lngList: TListBox; private procedure FillLngListBox; protected procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses uDebug, uFindEx, uGlobs, uGlobsPaths, uLng; { TfrmOptionsLanguage } procedure TfrmOptionsLanguage.FillLngListBox; var fr: TSearchRecEx; iIndex: Integer; sLangName: String; begin lngList.Clear; DCDebug('Language dir: ' + gpLngDir); if FindFirstEx(gpLngDir+'*.po', faAnyFile, fr)<>0 then begin FindCloseEx(fr); Exit; end; repeat sLangName := GetLanguageName(gpLngDir + fr.Name); lngList.Items.Add(Format('%s = (%s)', [fr.Name, sLangName])); until FindNextEx(fr)<>0; FindCloseEx(fr); iIndex:=lngList.Items.IndexOfName(gPOFileName + #32); if iIndex>=0 then lngList.Selected[iIndex]:=True; end; class function TfrmOptionsLanguage.GetIconIndex: Integer; begin Result := 0; end; class function TfrmOptionsLanguage.GetTitle: String; begin Result := rsOptionsEditorLanguage; end; procedure TfrmOptionsLanguage.Load; begin FillLngListBox; end; function TfrmOptionsLanguage.Save: TOptionsEditorSaveFlags; var SelectedPOFileName: String; begin Result := []; if lngList.ItemIndex > -1 then begin SelectedPOFileName := Trim(lngList.Items.Names[lngList.ItemIndex]); if SelectedPOFileName <> gPOFileName then Include(Result, oesfNeedsRestart); gPOFileName := SelectedPOFileName; end; end; end. doublecmd-0.5.8/src/frames/foptionstools.lfm0000644000175000017500000001340112020403374020166 0ustar alexxalexxinherited frmOptionsViewer: TfrmOptionsViewer Height = 513 Width = 586 ClientHeight = 513 ClientWidth = 586 object gbViewerBookMode: TGroupBox[7] AnchorSideLeft.Control = fneToolsPath AnchorSideTop.Control = cbToolsKeepTerminalOpen AnchorSideTop.Side = asrBottom AnchorSideRight.Control = fneToolsPath AnchorSideRight.Side = asrBottom Left = 8 Height = 244 Top = 186 Width = 554 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Top = 12 BorderSpacing.Bottom = 10 Caption = 'Viewer Book Mode' ChildSizing.TopBottomSpacing = 6 ClientHeight = 226 ClientWidth = 550 TabOrder = 5 object lblBackgroundColorViewerBook: TLabel AnchorSideTop.Control = cbBackgroundColorViewerBook AnchorSideTop.Side = asrCenter AnchorSideRight.Control = cbBackgroundColorViewerBook Left = 8 Height = 13 Top = 13 Width = 154 Caption = '&Background color in book viewer' FocusControl = cbBackgroundColorViewerBook ParentColor = False end object seNumberColumnsViewer: TSpinEdit AnchorSideLeft.Control = cbFontColorViewerBook AnchorSideTop.Control = cbFontColorViewerBook AnchorSideTop.Side = asrBottom Left = 182 Height = 21 Top = 62 Width = 36 BorderSpacing.Top = 5 MaxValue = 3 MinValue = 1 OnChange = seNumberColumnsViewerChange TabOrder = 5 Value = 1 end object lblNumberColumnsViewer: TLabel AnchorSideLeft.Control = lblBackgroundColorViewerBook AnchorSideTop.Control = seNumberColumnsViewer AnchorSideTop.Side = asrCenter Left = 8 Height = 13 Top = 66 Width = 163 Caption = '&Number of columns in book viewer' FocusControl = seNumberColumnsViewer ParentColor = False end object gbViewerExample: TGroupBox AnchorSideLeft.Control = gbViewerBookMode AnchorSideTop.Control = lblNumberColumnsViewer AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbViewerBookMode AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = seNumberColumnsViewer AnchorSideBottom.Side = asrBottom Left = 8 Height = 133 Top = 87 Width = 534 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 8 Caption = 'Example' ClientHeight = 115 ClientWidth = 530 TabOrder = 4 object pbViewerBook: TPaintBox Left = 5 Height = 105 Top = 5 Width = 520 Align = alClient BorderSpacing.Around = 5 OnPaint = pbViewerBookPaint end end object btnFontViewerColor: TButton AnchorSideLeft.Control = cbFontColorViewerBook AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cbFontColorViewerBook AnchorSideRight.Control = btnBackViewerColor AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = cbFontColorViewerBook AnchorSideBottom.Side = asrBottom Left = 510 Height = 22 Top = 35 Width = 24 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 4 Caption = '>>' OnClick = btnFontViewerColorClick TabOrder = 3 end object btnBackViewerColor: TButton AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cbBackgroundColorViewerBook AnchorSideBottom.Control = cbBackgroundColorViewerBook AnchorSideBottom.Side = asrBottom Left = 510 Height = 22 Top = 8 Width = 24 Anchors = [akTop, akRight, akBottom] BorderSpacing.Left = 4 BorderSpacing.Right = 5 Caption = '>>' OnClick = btnBackViewerColorClick TabOrder = 1 end object cbFontColorViewerBook: TColorBox AnchorSideLeft.Control = cbBackgroundColorViewerBook AnchorSideTop.Control = cbBackgroundColorViewerBook AnchorSideTop.Side = asrBottom AnchorSideRight.Control = cbBackgroundColorViewerBook AnchorSideRight.Side = asrBottom Left = 182 Height = 22 Top = 35 Width = 324 Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbPrettyNames] Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 5 ItemHeight = 16 OnChange = cbColorBoxChange TabOrder = 2 end object lblFontColorViewerBook: TLabel AnchorSideLeft.Control = lblBackgroundColorViewerBook AnchorSideTop.Control = cbFontColorViewerBook AnchorSideTop.Side = asrCenter Left = 8 Height = 13 Top = 40 Width = 120 BorderSpacing.Top = 10 Caption = '&Font color in book viewer' FocusControl = cbFontColorViewerBook ParentColor = False end object cbBackgroundColorViewerBook: TColorBox AnchorSideLeft.Control = lblBackgroundColorViewerBook AnchorSideLeft.Side = asrBottom AnchorSideRight.Control = btnBackViewerColor Left = 182 Height = 22 Top = 8 Width = 324 Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbPrettyNames] Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 20 ItemHeight = 16 OnChange = cbColorBoxChange TabOrder = 0 end end object optColorDialog: TColorDialog[8] Color = clBlack CustomColors.Strings = ( 'ColorA=000000' 'ColorB=000080' 'ColorC=008000' 'ColorD=008080' 'ColorE=800000' 'ColorF=800080' 'ColorG=808000' 'ColorH=808080' 'ColorI=C0C0C0' 'ColorJ=0000FF' 'ColorK=00FF00' 'ColorL=00FFFF' 'ColorM=FF0000' 'ColorN=FF00FF' 'ColorO=FFFF00' 'ColorP=FFFFFF' 'ColorQ=C0DCC0' 'ColorR=F0CAA6' 'ColorS=F0FBFF' 'ColorT=A4A0A0' ) left = 16 top = 128 end end doublecmd-0.5.8/src/frames/foptionsquicksearchfilter.pas0000644000175000017500000000623412020403374022551 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Quick search/filter options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsQuickSearchFilter; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, ExtCtrls, fOptionsFrame; type { TfrmOptionsQuickSearchFilter } TfrmOptionsQuickSearchFilter = class(TOptionsEditor) cbExactBeginning: TCheckBox; cbExactEnding: TCheckBox; cgpOptions: TCheckGroup; gbExactNameMatch: TGroupBox; rgpSearchCase: TRadioGroup; rgpSearchItems: TRadioGroup; protected procedure Init; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses DCStrUtils, uGlobs, uLng, fQuickSearch; const OPTION_AUTOHIDE_POSITION = 0; { TfrmOptionsQuickSearchFilter } class function TfrmOptionsQuickSearchFilter.GetIconIndex: Integer; begin Result := 12; end; class function TfrmOptionsQuickSearchFilter.GetTitle: String; begin Result := rsOptionsEditorQuickSearch; end; procedure TfrmOptionsQuickSearchFilter.Init; begin // Copy localized strings to each combo box. ParseLineToList(rsOptSearchItems, rgpSearchItems.Items); ParseLineToList(rsOptSearchCase, rgpSearchCase.Items); ParseLineToList(rsOptSearchOpt, cgpOptions.Items); end; procedure TfrmOptionsQuickSearchFilter.Load; begin cbExactBeginning.Checked := qsmBeginning in gQuickSearchOptions.Match; cbExactEnding.Checked := qsmEnding in gQuickSearchOptions.Match; rgpSearchItems.ItemIndex := Integer(gQuickSearchOptions.Items); rgpSearchCase.ItemIndex := Integer(gQuickSearchOptions.SearchCase); cgpOptions.Checked[OPTION_AUTOHIDE_POSITION] := gQuickFilterAutoHide; end; function TfrmOptionsQuickSearchFilter.Save: TOptionsEditorSaveFlags; begin Result := []; if cbExactBeginning.Checked then Include(gQuickSearchOptions.Match, qsmBeginning) else Exclude(gQuickSearchOptions.Match, qsmBeginning); if cbExactEnding.Checked then Include(gQuickSearchOptions.Match, qsmEnding) else Exclude(gQuickSearchOptions.Match, qsmEnding); gQuickSearchOptions.Items := TQuickSearchItems(rgpSearchItems.ItemIndex); gQuickSearchOptions.SearchCase := TQuickSearchCase(rgpSearchCase.ItemIndex); gQuickFilterAutoHide := cgpOptions.Checked[OPTION_AUTOHIDE_POSITION]; end; end. doublecmd-0.5.8/src/frames/foptionslog.lfm0000644000175000017500000000762312020403374017620 0ustar alexxalexxinherited frmOptionsLog: TfrmOptionsLog Height = 369 Width = 394 ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ClientHeight = 369 ClientWidth = 394 DesignTop = 27 object gbLogFile: TGroupBox[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 59 Top = 6 Width = 382 Anchors = [akTop, akLeft, akRight] AutoSize = True Caption = 'File operation log file' ClientHeight = 36 ClientWidth = 378 TabOrder = 0 object cbLogFile: TCheckBox AnchorSideTop.Control = fneLogFileName AnchorSideTop.Side = asrCenter Left = 10 Height = 23 Top = 7 Width = 132 Caption = 'C&reate a log file:' TabOrder = 0 end object fneLogFileName: TFileNameEdit AnchorSideLeft.Control = cbLogFile AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = gbLogFile Left = 148 Height = 28 Top = 4 Width = 204 DialogOptions = [] FilterIndex = 0 HideDirectories = False ButtonWidth = 23 NumGlyphs = 1 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 BorderSpacing.Top = 4 BorderSpacing.Bottom = 4 MaxLength = 0 TabOrder = 1 end end object gbLogFileOp: TGroupBox[1] AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbLogFile AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 154 Top = 69 Width = 382 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Top = 4 Caption = 'Log operations' ChildSizing.LeftRightSpacing = 10 ChildSizing.TopBottomSpacing = 4 ChildSizing.VerticalSpacing = 2 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 131 ClientWidth = 378 TabOrder = 1 object cbLogCpMvLn: TCheckBox Left = 10 Height = 23 Top = 4 Width = 226 Caption = 'Cop&y/Move/Create link/symlink' TabOrder = 0 end object cbLogDelete: TCheckBox Left = 10 Height = 23 Top = 29 Width = 226 Caption = '&Delete' TabOrder = 1 end object cbLogDirOp: TCheckBox Left = 10 Height = 23 Top = 54 Width = 226 Caption = 'Crea&te/Delete directories' TabOrder = 2 end object cbLogArcOp: TCheckBox Left = 10 Height = 23 Top = 79 Width = 226 Caption = '&Pack/Unpack' TabOrder = 3 end object cbLogVFS: TCheckBox Left = 10 Height = 23 Top = 104 Width = 226 Caption = '&File system plugins' TabOrder = 4 end end object gbLogFileStatus: TGroupBox[2] AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbLogFileOp AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 104 Top = 227 Width = 382 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Top = 4 Caption = 'Operation status' ChildSizing.LeftRightSpacing = 10 ChildSizing.TopBottomSpacing = 4 ChildSizing.VerticalSpacing = 2 ChildSizing.Layout = cclLeftToRightThenTopToBottom ClientHeight = 81 ClientWidth = 378 TabOrder = 2 object cbLogSuccess: TCheckBox Left = 10 Height = 23 Top = 4 Width = 192 Caption = 'Log &successful operations' TabOrder = 0 end object cbLogErrors: TCheckBox Left = 10 Height = 23 Top = 29 Width = 192 Caption = 'Log &errors' TabOrder = 1 end object cbLogInfo: TCheckBox Left = 10 Height = 23 Top = 54 Width = 192 Caption = 'Log &information messages' TabOrder = 2 end end end doublecmd-0.5.8/src/frames/foptionsdriveslistbutton.pas0000644000175000017500000000461011740433676022501 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Drives list button options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsDrivesListButton; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, fOptionsFrame; type { TfrmOptionsDrivesListButton } TfrmOptionsDrivesListButton = class(TOptionsEditor) cbShowLabel: TCheckBox; cbShowFileSystem: TCheckBox; cbShowFreeSpace: TCheckBox; gbDrivesList: TGroupBox; protected procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses uGlobs, uLng; { TfrmOptionsDrivesListButton } procedure TfrmOptionsDrivesListButton.Load; begin cbShowLabel.Checked := dlbShowLabel in gDrivesListButtonOptions; cbShowFileSystem.Checked := dlbShowFileSystem in gDrivesListButtonOptions; cbShowFreeSpace.Checked := dlbShowFreeSpace in gDrivesListButtonOptions; end; function TfrmOptionsDrivesListButton.Save: TOptionsEditorSaveFlags; begin gDrivesListButtonOptions := []; if cbShowLabel.Checked then Include(gDrivesListButtonOptions, dlbShowLabel); if cbShowFileSystem.Checked then Include(gDrivesListButtonOptions, dlbShowFileSystem); if cbShowFreeSpace.Checked then Include(gDrivesListButtonOptions, dlbShowFreeSpace); Result := []; end; class function TfrmOptionsDrivesListButton.GetIconIndex: Integer; begin Result := 31; end; class function TfrmOptionsDrivesListButton.GetTitle: String; begin Result := rsOptionsEditorDrivesListButton; end; end. doublecmd-0.5.8/src/frames/foptionsconfiguration.pas0000644000175000017500000001103612027612546021716 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Configuration options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsConfiguration; {$mode objfpc}{$H+} interface uses Classes, SysUtils, fOptionsFrame, StdCtrls, Buttons; type { TfrmOptionsConfiguration } TfrmOptionsConfiguration = class(TOptionsEditor) btnConfigApply: TBitBtn; btnConfigEdit: TBitBtn; cbCmdLineHistory: TCheckBox; cbDirHistory: TCheckBox; cbFileMaskHistory: TCheckBox; chkSaveConfiguration: TCheckBox; chkSearchReplaceHistory: TCheckBox; gbLocConfigFiles: TGroupBox; gbSaveOnExit: TGroupBox; lblCmdLineConfigDir: TLabel; rbProgramDir: TRadioButton; rbUserHomeDir: TRadioButton; procedure btnConfigApplyClick(Sender: TObject); procedure btnConfigEditClick(Sender: TObject); procedure chkSaveConfigurationChange(Sender: TObject); protected procedure Init; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses Forms, uGlobs, uGlobsPaths, uShowForm, uOSUtils, uLng; { TfrmOptionsConfiguration } procedure TfrmOptionsConfiguration.btnConfigApplyClick(Sender: TObject); begin if LoadConfig then // force reloading config from file begin LoadGlobs; OptionsDialog.LoadSettings; btnConfigApply.Enabled:= False; end else begin gSaveConfiguration := False; Application.Terminate; end; end; procedure TfrmOptionsConfiguration.btnConfigEditClick(Sender: TObject); begin if Assigned(gIni) then ShowEditorByGlob(gpCfgDir + 'doublecmd.ini') else ShowEditorByGlob(gpCfgDir + 'doublecmd.xml'); btnConfigApply.Enabled:= True; end; procedure TfrmOptionsConfiguration.chkSaveConfigurationChange(Sender: TObject); begin cbDirHistory.Enabled:= chkSaveConfiguration.Checked; cbCmdLineHistory.Enabled:= chkSaveConfiguration.Checked; cbFileMaskHistory.Enabled:= chkSaveConfiguration.Checked; chkSearchReplaceHistory.Enabled:= chkSaveConfiguration.Checked; end; class function TfrmOptionsConfiguration.GetIconIndex: Integer; begin Result := 11; end; class function TfrmOptionsConfiguration.GetTitle: String; begin Result := rsOptionsEditorConfiguration; end; procedure TfrmOptionsConfiguration.Init; begin if gpCmdLineCfgDir = '' then begin rbProgramDir.Caption:= rbProgramDir.Caption + ' - [' + IncludeTrailingPathDelimiter(gpGlobalCfgDir) + ']'; rbUserHomeDir.Caption:= rbUserHomeDir.Caption + ' - [' + IncludeTrailingPathDelimiter(GetAppConfigDir) + ']'; end else begin rbProgramDir.Visible := False; rbProgramDir.Enabled := False; rbUserHomeDir.Visible := False; rbUserHomeDir.Enabled := False; lblCmdLineConfigDir.Visible := True; lblCmdLineConfigDir.Caption := lblCmdLineConfigDir.Caption + ' - [' + IncludeTrailingPathDelimiter(gpCmdLineCfgDir) + ']'; end; end; procedure TfrmOptionsConfiguration.Load; begin if gUseConfigInProgramDirNew then rbProgramDir.Checked := True else rbUserHomeDir.Checked := True; chkSaveConfiguration.Checked:= gSaveConfiguration; chkSearchReplaceHistory.Checked:= gSaveSearchReplaceHistory; cbDirHistory.Checked := gSaveDirHistory; cbCmdLineHistory.Checked := gSaveCmdLineHistory; cbFileMaskHistory.Checked := gSaveFileMaskHistory; end; function TfrmOptionsConfiguration.Save: TOptionsEditorSaveFlags; begin Result := []; gUseConfigInProgramDirNew := rbProgramDir.Checked; gSaveConfiguration := chkSaveConfiguration.Checked; gSaveSearchReplaceHistory := chkSearchReplaceHistory.Checked; gSaveDirHistory := cbDirHistory.Checked; gSaveCmdLineHistory := cbCmdLineHistory.Checked; gSaveFileMaskHistory := cbFileMaskHistory.Checked; end; end. doublecmd-0.5.8/src/frames/foptionstoolbar.lrt0000644000175000017500000000224112020403374020513 0ustar alexxalexxTFRMOPTIONSTOOLBAR.GBGROUPBOX.CAPTION=Appearance TFRMOPTIONSTOOLBAR.LBLBARSIZE.CAPTION=&Bar size: TFRMOPTIONSTOOLBAR.LBLICONSIZE.CAPTION=Icon si&ze: TFRMOPTIONSTOOLBAR.CBFLATBUTTONS.CAPTION=&Flat buttons TFRMOPTIONSTOOLBAR.BTNINSERTBUTTON.CAPTION=&Insert new button TFRMOPTIONSTOOLBAR.BTNCLONEBUTTON.CAPTION=C&lone button TFRMOPTIONSTOOLBAR.BTNDELETEBUTTON.CAPTION=&Delete TFRMOPTIONSTOOLBAR.RGTOOLITEMTYPE.CAPTION=Button type TFRMOPTIONSTOOLBAR.LBLICONFILE.CAPTION=Ico&n: TFRMOPTIONSTOOLBAR.BTNOPENICON.CAPTION=>> TFRMOPTIONSTOOLBAR.LBLTOOLTIP.CAPTION=&Tooltip: TFRMOPTIONSTOOLBAR.LBLINTERNALCOMMAND.CAPTION=Co&mmand: TFRMOPTIONSTOOLBAR.LBLINTERNALPARAMETERS.CAPTION=&Parameters: TFRMOPTIONSTOOLBAR.EDTINTERNALPARAMETERS.HINT=Enter command parameters, each in a separate line. Press F1 to see help on parameters. TFRMOPTIONSTOOLBAR.LBLEXTERNALCOMMAND.CAPTION=Comman&d: TFRMOPTIONSTOOLBAR.BTNOPENFILE.CAPTION=>> TFRMOPTIONSTOOLBAR.LBLEXTERNALPARAMETERS.CAPTION=Parameter&s: TFRMOPTIONSTOOLBAR.LBLSTARTPATH.CAPTION=Start pat&h: TFRMOPTIONSTOOLBAR.LBLHOTKEY.CAPTION=Hot key: TFRMOPTIONSTOOLBAR.BTNEDITHOTKEY.CAPTION=Edit hot&key TFRMOPTIONSTOOLBAR.BTNREMOVEHOTKEY.CAPTION=Remove hotke&y doublecmd-0.5.8/src/frames/foptionshotkeys.lrt0000644000175000017500000000105712020403374020543 0ustar alexxalexxTFRMOPTIONSHOTKEYS.LBLCATEGORIES.CAPTION=C&ategories: TFRMOPTIONSHOTKEYS.LBLCOMMANDS.CAPTION=Co&mmands: TFRMOPTIONSHOTKEYS.LBFILTER.CAPTION=&Filter TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[0].TITLE.CAPTION=Hotkey TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[1].TITLE.CAPTION=Parameters TFRMOPTIONSHOTKEYS.STGHOTKEYS.COLUMNS[2].TITLE.CAPTION=Controls TFRMOPTIONSHOTKEYS.BTNADDHOTKEY.CAPTION=Add &hotkey TFRMOPTIONSHOTKEYS.BTNEDITHOTKEY.CAPTION=&Edit hotkey TFRMOPTIONSHOTKEYS.BTNDELETEHOTKEY.CAPTION=&Delete hotkey TFRMOPTIONSHOTKEYS.LBLSCFILES.CAPTION=&Shortcut files: doublecmd-0.5.8/src/frames/foptionstoolbar.lfm0000644000175000017500000003771112020403374020502 0ustar alexxalexxinherited frmOptionsToolbar: TfrmOptionsToolbar Height = 573 Width = 850 ClientHeight = 573 ClientWidth = 850 object gbGroupBox: TGroupBox[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 81 Top = 0 Width = 838 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Left = 6 BorderSpacing.Right = 6 Caption = 'Appearance' ChildSizing.LeftRightSpacing = 8 ChildSizing.TopBottomSpacing = 4 ClientHeight = 63 ClientWidth = 834 TabOrder = 0 object lblBarSize: TLabel AnchorSideLeft.Control = gbGroupBox AnchorSideTop.Control = trbBarSize AnchorSideTop.Side = asrCenter Left = 8 Height = 13 Top = 13 Width = 41 Caption = '&Bar size:' FocusControl = trbBarSize ParentColor = False end object lblBarSizeValue: TLabel AnchorSideLeft.Control = lblBarSize AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = trbBarSize AnchorSideTop.Side = asrCenter Left = 51 Height = 1 Top = 19 Width = 1 BorderSpacing.Left = 2 ParentColor = False end object trbBarSize: TTrackBar AnchorSideLeft.Control = lblBarSizeValue AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = gbGroupBox Left = 55 Height = 30 Top = 4 Width = 150 Frequency = 4 Max = 40 Min = 10 OnChange = trbBarSizeChange Position = 18 ScalePos = trRight BorderSpacing.Around = 3 Constraints.MinWidth = 40 TabOrder = 0 end object lblIconSize: TLabel AnchorSideLeft.Control = trbBarSize AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = trbIconSize AnchorSideTop.Side = asrCenter Left = 220 Height = 13 Top = 13 Width = 46 BorderSpacing.Left = 15 Caption = 'Icon si&ze:' FocusControl = trbIconSize ParentColor = False end object lblIconSizeValue: TLabel AnchorSideLeft.Control = lblIconSize AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = trbIconSize AnchorSideTop.Side = asrCenter Left = 268 Height = 1 Top = 19 Width = 1 BorderSpacing.Left = 2 ParentColor = False end object trbIconSize: TTrackBar AnchorSideLeft.Control = lblIconSizeValue AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = gbGroupBox AnchorSideBottom.Side = asrBottom Left = 272 Height = 30 Top = 4 Width = 150 Frequency = 4 Max = 32 Min = 8 OnChange = trbIconSizeChange Position = 16 ScalePos = trRight BorderSpacing.Around = 3 Constraints.MinWidth = 40 ParentShowHint = False ShowHint = True TabOrder = 1 end object cbFlatButtons: TCheckBox AnchorSideLeft.Control = gbGroupBox AnchorSideTop.Control = trbIconSize AnchorSideTop.Side = asrBottom Left = 8 Height = 17 Top = 42 Width = 76 BorderSpacing.Top = 8 Caption = '&Flat buttons' Checked = True OnChange = cbFlatButtonsChange State = cbChecked TabOrder = 2 end end object sboxToolbars: TScrollBox[1] AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbGroupBox AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = pnlFullToolbarButtons Left = 6 Height = 171 Top = 87 Width = 838 HorzScrollBar.Page = 834 VertScrollBar.Page = 167 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Around = 6 TabOrder = 1 end object pnlFullToolbarButtons: TPanel[2] AnchorSideLeft.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = pnlEditToolbar Left = 6 Height = 23 Top = 264 Width = 838 Anchors = [akLeft, akRight, akBottom] AutoSize = True BorderSpacing.Left = 6 BorderSpacing.Right = 6 BorderSpacing.Bottom = 2 BevelOuter = bvNone ClientHeight = 23 ClientWidth = 838 TabOrder = 2 object pnlToolbarButtons: TPanel AnchorSideLeft.Control = pnlFullToolbarButtons AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = pnlFullToolbarButtons AnchorSideBottom.Side = asrBottom Left = 282 Height = 23 Top = 0 Width = 274 AutoSize = True BevelOuter = bvNone ChildSizing.HorizontalSpacing = 8 ChildSizing.EnlargeHorizontal = crsHomogenousChildResize ChildSizing.EnlargeVertical = crsHomogenousChildResize ChildSizing.ShrinkHorizontal = crsHomogenousChildResize ChildSizing.ShrinkVertical = crsHomogenousChildResize ChildSizing.Layout = cclTopToBottomThenLeftToRight ChildSizing.ControlsPerLine = 1 ClientHeight = 23 ClientWidth = 274 TabOrder = 0 object btnInsertButton: TButton Left = 0 Height = 23 Top = 0 Width = 113 AutoSize = True Caption = '&Insert new button' OnClick = btnInsertButtonClick TabOrder = 0 end object btnCloneButton: TButton Left = 121 Height = 23 Top = 0 Width = 88 AutoSize = True Caption = 'C&lone button' OnClick = btnCloneButtonClick TabOrder = 1 end object btnDeleteButton: TButton Left = 217 Height = 23 Top = 0 Width = 57 AutoSize = True Caption = '&Delete' OnClick = btnDeleteButtonClick TabOrder = 2 end end end object pnlEditToolbar: TPanel[3] AnchorSideLeft.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 6 Height = 278 Top = 289 Width = 838 Anchors = [akLeft, akRight, akBottom] AutoSize = True BorderSpacing.Left = 6 BorderSpacing.Right = 6 BorderSpacing.Bottom = 6 BevelOuter = bvNone ClientHeight = 278 ClientWidth = 838 TabOrder = 3 object rgToolItemType: TRadioGroup AnchorSideLeft.Control = pnlEditToolbar AnchorSideTop.Control = pnlEditToolbar AnchorSideBottom.Control = pnlEditToolbar AnchorSideBottom.Side = asrBottom Left = 0 Height = 278 Top = 0 Width = 146 Anchors = [akTop, akLeft, akBottom] AutoFill = True AutoSize = True Caption = 'Button type' ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ChildSizing.EnlargeHorizontal = crsHomogenousChildResize ChildSizing.EnlargeVertical = crsHomogenousChildResize ChildSizing.ShrinkHorizontal = crsScaleChilds ChildSizing.ShrinkVertical = crsScaleChilds ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 TabOrder = 0 end object pnlEditControls: TPanel AnchorSideLeft.Control = rgToolItemType AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlEditToolbar AnchorSideRight.Control = pnlEditToolbar AnchorSideRight.Side = asrBottom Left = 152 Height = 278 Top = 0 Width = 680 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Left = 6 BorderSpacing.Right = 6 BevelOuter = bvNone ChildSizing.TopBottomSpacing = 6 ChildSizing.VerticalSpacing = 10 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 278 ClientWidth = 680 TabOrder = 1 object lblIconFile: TLabel Left = 0 Height = 13 Top = 6 Width = 59 Caption = 'Ico&n:' FocusControl = edtIconFileName ParentColor = False Visible = False end object edtIconFileName: TEdit AnchorSideLeft.Control = lblIconFile AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblIconFile AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnOpenIcon Left = 59 Height = 21 Top = 2 Width = 589 Anchors = [akTop, akLeft, akRight] MaxLength = 259 OnChange = edtIconFileNameChange TabOrder = 0 Visible = False end object btnOpenIcon: TButton AnchorSideTop.Control = edtIconFileName AnchorSideRight.Control = pnlEditControls AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = edtIconFileName AnchorSideBottom.Side = asrBottom Left = 648 Height = 21 Top = 2 Width = 32 Anchors = [akTop, akRight, akBottom] Caption = '>>' OnClick = btnOpenIconClick TabOrder = 1 Visible = False end object lblToolTip: TLabel AnchorSideTop.Side = asrCenter Left = 0 Height = 13 Top = 29 Width = 59 Caption = '&Tooltip:' FocusControl = edtToolTip ParentColor = False Visible = False end object edtToolTip: TEdit AnchorSideLeft.Control = lblToolTip AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblToolTip AnchorSideTop.Side = asrCenter AnchorSideRight.Control = pnlEditControls AnchorSideRight.Side = asrBottom Left = 59 Height = 21 Top = 25 Width = 621 Anchors = [akTop, akLeft, akRight] MaxLength = 259 TabOrder = 2 Visible = False end object lblInternalCommand: TLabel AnchorSideTop.Side = asrCenter Left = 0 Height = 13 Top = 52 Width = 59 Caption = 'Co&mmand:' FocusControl = cbInternalCommand ParentColor = False Visible = False end object cbInternalCommand: TComboBox AnchorSideLeft.Control = lblInternalCommand AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblInternalCommand AnchorSideTop.Side = asrCenter AnchorSideRight.Control = pnlEditControls AnchorSideRight.Side = asrBottom Left = 59 Height = 21 Top = 48 Width = 621 HelpType = htKeyword Anchors = [akTop, akLeft, akRight] DropDownCount = 20 ItemHeight = 13 OnSelect = cbInternalCommandSelect Style = csDropDownList TabOrder = 3 Visible = False end object lblInternalParameters: TLabel Left = 0 Height = 100 Top = 75 Width = 59 Caption = '&Parameters:' Constraints.MinHeight = 100 FocusControl = edtInternalParameters ParentColor = False Visible = False end object edtInternalParameters: TMemo AnchorSideLeft.Control = lblInternalParameters AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblInternalParameters AnchorSideRight.Control = pnlEditControls AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = lblInternalParameters AnchorSideBottom.Side = asrBottom Left = 59 Height = 100 Hint = 'Enter command parameters, each in a separate line. Press F1 to see help on parameters.' Top = 75 Width = 621 HelpType = htKeyword Anchors = [akTop, akLeft, akRight, akBottom] ParentShowHint = False ScrollBars = ssAutoBoth ShowHint = True TabOrder = 4 Visible = False WordWrap = False end object lblExternalCommand: TLabel AnchorSideTop.Side = asrCenter Left = 0 Height = 13 Top = 185 Width = 59 Caption = 'Comman&d:' FocusControl = edtExternalCommand ParentColor = False Visible = False end object edtExternalCommand: TEdit AnchorSideLeft.Control = lblExternalCommand AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblExternalCommand AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnOpenFile Left = 59 Height = 21 Top = 181 Width = 589 Anchors = [akTop, akLeft, akRight] MaxLength = 259 TabOrder = 5 Visible = False end object btnOpenFile: TButton AnchorSideTop.Control = edtExternalCommand AnchorSideRight.Control = pnlEditControls AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = edtExternalCommand AnchorSideBottom.Side = asrBottom Left = 648 Height = 21 Top = 181 Width = 32 Anchors = [akTop, akRight, akBottom] BorderSpacing.InnerBorder = 4 Caption = '>>' OnClick = btnOpenFileClick TabOrder = 6 Visible = False end object lblExternalParameters: TLabel AnchorSideTop.Side = asrCenter Left = 0 Height = 13 Top = 208 Width = 59 Caption = 'Parameter&s:' FocusControl = edtExternalParameters ParentColor = False Visible = False end object edtExternalParameters: TEdit AnchorSideLeft.Control = lblExternalParameters AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblExternalParameters AnchorSideTop.Side = asrCenter AnchorSideRight.Control = pnlEditControls AnchorSideRight.Side = asrBottom Left = 59 Height = 21 Top = 204 Width = 621 Anchors = [akTop, akLeft, akRight] MaxLength = 259 TabOrder = 7 Visible = False end object lblStartPath: TLabel AnchorSideTop.Side = asrCenter Left = 0 Height = 13 Top = 231 Width = 59 Caption = 'Start pat&h:' FocusControl = edtStartPath ParentColor = False Visible = False end object edtStartPath: TEdit AnchorSideLeft.Control = lblStartPath AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblStartPath AnchorSideTop.Side = asrCenter AnchorSideRight.Control = pnlEditControls AnchorSideRight.Side = asrBottom Left = 59 Height = 21 Top = 227 Width = 621 Anchors = [akTop, akLeft, akRight] MaxLength = 259 TabOrder = 8 Visible = False end object lblHotkey: TLabel AnchorSideTop.Side = asrCenter Left = 0 Height = 13 Top = 254 Width = 59 Caption = 'Hot key:' ParentColor = False Visible = False end object lblHotkeyValue: TLabel AnchorSideLeft.Control = lblHotkey AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblHotkey Left = 59 Height = 1 Top = 254 Width = 1 BorderSpacing.Right = 10 ParentColor = False Visible = False end object btnEditHotkey: TButton AnchorSideLeft.Control = lblHotkeyValue AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblHotkey AnchorSideTop.Side = asrCenter Left = 70 Height = 23 Top = 249 Width = 80 AutoSize = True Caption = 'Edit hot&key' OnClick = btnEditHotkeyClick TabOrder = 9 Visible = False end object btnRemoveHotkey: TButton AnchorSideLeft.Control = btnEditHotkey AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblHotkey AnchorSideTop.Side = asrCenter Left = 152 Height = 23 Top = 249 Width = 101 AutoSize = True BorderSpacing.Left = 2 Caption = 'Remove hotke&y' OnClick = btnRemoveHotKeyClick TabOrder = 10 Visible = False end end end object OpenDialog: TOpenDialog[4] FilterIndex = 0 left = 16 top = 136 end end doublecmd-0.5.8/src/frames/foptionsautorefresh.lfm0000644000175000017500000000566212020403374021367 0ustar alexxalexxinherited frmOptionsAutoRefresh: TfrmOptionsAutoRefresh Height = 228 Width = 501 ClientHeight = 228 ClientWidth = 501 DesignTop = 27 object gbAutoRefreshEnable: TGroupBox[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 82 Top = 6 Width = 489 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = 'Refresh file list' ChildSizing.LeftRightSpacing = 10 ChildSizing.TopBottomSpacing = 5 ChildSizing.VerticalSpacing = 3 ChildSizing.Layout = cclLeftToRightThenTopToBottom ClientHeight = 59 ClientWidth = 485 TabOrder = 0 object cbWatchFileNameChange: TCheckBox Left = 10 Height = 23 Top = 5 Width = 309 Caption = 'When &files are created, deleted or renamed' OnChange = OnAutoRefreshOptionChanged TabOrder = 0 end object cbWatchAttributesChange: TCheckBox Left = 10 Height = 23 Top = 31 Width = 309 Caption = 'When &size, date or attributes change' OnChange = OnAutoRefreshOptionChanged TabOrder = 1 end end object gbAutoRefreshDisable: TGroupBox[1] AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbAutoRefreshEnable AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 117 Top = 94 Width = 489 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = 'Disable auto-refresh' ChildSizing.TopBottomSpacing = 5 ChildSizing.VerticalSpacing = 3 ClientHeight = 94 ClientWidth = 485 TabOrder = 1 object cbWatchOnlyForeground: TCheckBox AnchorSideLeft.Control = gbAutoRefreshDisable AnchorSideTop.Control = gbAutoRefreshDisable Left = 10 Height = 23 Top = 5 Width = 269 BorderSpacing.Left = 10 Caption = 'When application is in the &background' TabOrder = 0 end object cbWatchExcludeDirs: TCheckBox AnchorSideLeft.Control = cbWatchOnlyForeground AnchorSideTop.Control = cbWatchOnlyForeground AnchorSideTop.Side = asrBottom Left = 10 Height = 23 Top = 31 Width = 339 Caption = 'For the following &paths and their subdirectories:' OnChange = cbWatchExcludeDirsChange TabOrder = 1 end object edtWatchExcludeDirs: TEdit AnchorSideLeft.Control = cbWatchExcludeDirs AnchorSideTop.Control = cbWatchExcludeDirs AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbAutoRefreshDisable AnchorSideRight.Side = asrBottom Left = 30 Height = 28 Top = 57 Width = 447 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 20 BorderSpacing.Right = 8 BorderSpacing.Bottom = 15 TabOrder = 2 end end end doublecmd-0.5.8/src/frames/foptionscolumnsview.lfm0000644000175000017500000000705212020403374021406 0ustar alexxalexxinherited frmOptionsColumnsView: TfrmOptionsColumnsView Height = 344 Width = 659 ClientHeight = 344 ClientWidth = 659 DesignTop = 20 object grpAutosizeColumns: TGroupBox[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbShowGrid AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 105 Top = 82 Width = 647 Anchors = [akTop, akLeft, akRight] BorderSpacing.Around = 6 Caption = 'Auto-size columns' ClientHeight = 87 ClientWidth = 643 TabOrder = 1 object chkAutoFillColumns: TCheckBox AnchorSideTop.Side = asrBottom Left = 8 Height = 17 Top = 8 Width = 95 Caption = 'A&uto fill columns' TabOrder = 0 end object lblAutoSizeColumn: TLabel AnchorSideLeft.Control = chkAutoFillColumns AnchorSideTop.Control = cmbAutoSizeColumn AnchorSideTop.Side = asrCenter Left = 8 Height = 13 Top = 39 Width = 84 Caption = 'Auto si&ze column:' FocusControl = cmbAutoSizeColumn ParentColor = False end object cmbAutoSizeColumn: TComboBox AnchorSideLeft.Control = lblAutoSizeColumn AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = chkAutoFillColumns AnchorSideTop.Side = asrBottom AnchorSideRight.Control = grpAutosizeColumns AnchorSideRight.Side = asrBottom Left = 104 Height = 21 Top = 35 Width = 529 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 12 BorderSpacing.Top = 10 BorderSpacing.Right = 10 ItemHeight = 13 Items.Strings = ( 'First' 'Last' ) Style = csDropDownList TabOrder = 1 end end object gbShowGrid: TGroupBox[1] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 70 Top = 6 Width = 647 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = 'Show grid' ChildSizing.LeftRightSpacing = 12 ChildSizing.TopBottomSpacing = 6 ClientHeight = 52 ClientWidth = 643 TabOrder = 0 object cbGridVertLine: TCheckBox AnchorSideLeft.Control = gbShowGrid AnchorSideTop.Control = gbShowGrid Left = 12 Height = 17 Top = 6 Width = 77 Caption = '&Vertical lines' TabOrder = 0 end object cbGridHorzLine: TCheckBox AnchorSideLeft.Control = gbShowGrid AnchorSideTop.Control = cbGridVertLine AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 29 Width = 90 BorderSpacing.Top = 6 Caption = '&Horizontal lines' TabOrder = 1 end end object grpMisc: TGroupBox[2] AnchorSideLeft.Control = Owner AnchorSideTop.Control = grpAutosizeColumns AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 47 Top = 193 Width = 647 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 29 ClientWidth = 643 TabOrder = 2 object cbCutTextToColWidth: TCheckBox Left = 6 Height = 17 Top = 6 Width = 136 Caption = 'Cut &text to column width' TabOrder = 0 end end end doublecmd-0.5.8/src/frames/foptionstoolbase.lfm0000644000175000017500000000542612020403374020646 0ustar alexxalexxinherited frmOptionsToolBase: TfrmOptionsToolBase Height = 265 Width = 589 ClientHeight = 265 ClientWidth = 589 object edtToolsParameters: TEdit[0] AnchorSideLeft.Control = lblToolsParameters AnchorSideTop.Control = lblToolsParameters AnchorSideTop.Side = asrBottom AnchorSideRight.Control = fneToolsPath AnchorSideRight.Side = asrBottom Left = 8 Height = 21 Top = 105 Width = 554 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 4 OnChange = edtToolsParametersChange TabOrder = 2 end object fneToolsPath: TFileNameEdit[1] AnchorSideLeft.Control = lblToolsPath AnchorSideTop.Control = lblToolsPath AnchorSideTop.Side = asrBottom Left = 8 Height = 21 Top = 57 Width = 554 OnAcceptFileName = fneToolsPathAcceptFileName DialogOptions = [] FilterIndex = 0 HideDirectories = False ButtonWidth = 23 NumGlyphs = 1 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 4 MaxLength = 0 TabOrder = 1 OnChange = fneToolsPathChange end object lblToolsPath: TLabel[2] AnchorSideLeft.Control = cbToolsUseExternalProgram AnchorSideTop.Control = cbToolsUseExternalProgram AnchorSideTop.Side = asrBottom Left = 8 Height = 13 Top = 40 Width = 133 BorderSpacing.Top = 15 Caption = '&Path to program to execute' FocusControl = fneToolsPath ParentColor = False end object lblToolsParameters: TLabel[3] AnchorSideLeft.Control = cbToolsUseExternalProgram AnchorSideTop.Control = fneToolsPath AnchorSideTop.Side = asrBottom Left = 8 Height = 13 Top = 88 Width = 105 BorderSpacing.Top = 10 Caption = 'A&dditional parameters' FocusControl = edtToolsParameters ParentColor = False end object cbToolsKeepTerminalOpen: TCheckBox[4] AnchorSideLeft.Control = cbToolsRunInTerminal AnchorSideTop.Control = cbToolsRunInTerminal AnchorSideTop.Side = asrBottom Left = 23 Height = 17 Top = 157 Width = 269 BorderSpacing.Left = 15 BorderSpacing.Top = 2 Caption = '&Keep terminal window open after executing program' OnChange = cbToolsKeepTerminalOpenChange TabOrder = 4 end object cbToolsRunInTerminal: TCheckBox[5] AnchorSideLeft.Control = edtToolsParameters AnchorSideTop.Control = edtToolsParameters AnchorSideTop.Side = asrBottom Left = 8 Height = 17 Top = 138 Width = 109 BorderSpacing.Top = 12 Caption = '&Execute in terminal' OnChange = cbToolsRunInTerminalChange TabOrder = 3 end object cbToolsUseExternalProgram: TCheckBox[6] Left = 8 Height = 17 Top = 8 Width = 122 BorderSpacing.Top = 12 Caption = '&Use external program' OnChange = cbToolsUseExternalProgramChange TabOrder = 0 end end doublecmd-0.5.8/src/frames/foptionstools.lrt0000644000175000017500000000070512020403374020214 0ustar alexxalexxTFRMOPTIONSVIEWER.GBVIEWERBOOKMODE.CAPTION=Viewer Book Mode TFRMOPTIONSVIEWER.LBLBACKGROUNDCOLORVIEWERBOOK.CAPTION=&Background color in book viewer TFRMOPTIONSVIEWER.LBLNUMBERCOLUMNSVIEWER.CAPTION=&Number of columns in book viewer TFRMOPTIONSVIEWER.GBVIEWEREXAMPLE.CAPTION=Example TFRMOPTIONSVIEWER.BTNFONTVIEWERCOLOR.CAPTION=>> TFRMOPTIONSVIEWER.BTNBACKVIEWERCOLOR.CAPTION=>> TFRMOPTIONSVIEWER.LBLFONTCOLORVIEWERBOOK.CAPTION=&Font color in book viewer doublecmd-0.5.8/src/frames/foptionskeyboard.pas0000644000175000017500000000677112020403374020647 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Keyboard options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsKeyboard; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, fOptionsFrame; type { TfrmOptionsKeyboard } TfrmOptionsKeyboard = class(TOptionsEditor) cbLynxLike: TCheckBox; cbNoModifier: TComboBox; cbAlt: TComboBox; cbCtrlAlt: TComboBox; gbTyping: TGroupBox; lblNoModifier: TLabel; lblAlt: TLabel; lblCtrlAlt: TLabel; protected procedure Init; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses DCStrUtils, uGlobs, uLng; const KeyAction_None = 0; KeyAction_CommandLine = 1; KeyAction_QuickSearch = 2; KeyAction_QuickFilter = 3; { TfrmOptionsKeyboard } procedure TfrmOptionsKeyboard.Init; begin // Copy localized strings to each combo box. ParseLineToList(rsOptLetters, cbNoModifier.Items); cbAlt.Items.Assign(cbNoModifier.Items); cbCtrlAlt.Items.Assign(cbNoModifier.Items); end; procedure TfrmOptionsKeyboard.Load; procedure SetAction(ComboBox: TComboBox; KeyTypingAction: TKeyTypingAction); begin case KeyTypingAction of ktaNone: ComboBox.ItemIndex := KeyAction_None; ktaCommandLine: ComboBox.ItemIndex := KeyAction_CommandLine; ktaQuickSearch: ComboBox.ItemIndex := KeyAction_QuickSearch; ktaQuickFilter: ComboBox.ItemIndex := KeyAction_QuickFilter; else raise Exception.Create('Unknown TKeyTypingMode'); end; end; begin SetAction(cbNoModifier, gKeyTyping[ktmNone]); SetAction(cbAlt, gKeyTyping[ktmAlt]); SetAction(cbCtrlAlt, gKeyTyping[ktmCtrlAlt]); cbLynxLike.Checked := gLynxLike; end; function TfrmOptionsKeyboard.Save: TOptionsEditorSaveFlags; function GetAction(ComboBox: TComboBox): TKeyTypingAction; begin case ComboBox.ItemIndex of KeyAction_None: Result := ktaNone; KeyAction_CommandLine: Result := ktaCommandLine; KeyAction_QuickSearch: Result := ktaQuickSearch; KeyAction_QuickFilter: Result := ktaQuickFilter; else raise Exception.Create('Unknown action selected'); end; end; begin gKeyTyping[ktmNone] := GetAction(cbNoModifier); gKeyTyping[ktmAlt] := GetAction(cbAlt); gKeyTyping[ktmCtrlAlt] := GetAction(cbCtrlAlt); gLynxLike := cbLynxLike.Checked; Result := []; end; class function TfrmOptionsKeyboard.GetIconIndex: Integer; begin Result := 26; end; class function TfrmOptionsKeyboard.GetTitle: String; begin Result := rsOptionsEditorKeyboard; end; end. doublecmd-0.5.8/src/frames/foptionsplugins.lrt0000644000175000017500000000301112020403374020526 0ustar alexxalexxTFRMOPTIONSPLUGINS.TSWCX.CAPTION=Pac&ker plugins (.WCX) TFRMOPTIONSPLUGINS.LBLWCXDESCRIPTION.CAPTION=Pack&er plugins are used to work with archives TFRMOPTIONSPLUGINS.TSWFX.CAPTION=F&ile system plugins (.WFX) TFRMOPTIONSPLUGINS.LBLWFXDESCRIPTION.CAPTION=Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC. TFRMOPTIONSPLUGINS.TSWDX.CAPTION=Content pl&ugins (.WDX) TFRMOPTIONSPLUGINS.LBLWDXDESCRIPTION.CAPTION=Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool TFRMOPTIONSPLUGINS.TSDSX.CAPTION=&Search plugins (.DSX) TFRMOPTIONSPLUGINS.LBLDSXDESCRIPTION.CAPTION=Searc&h plugins allow to use alternative search algorithms or external tools (like "locate", etc.) TFRMOPTIONSPLUGINS.TSWLX.CAPTION=&Viewer plugins (.WLX) TFRMOPTIONSPLUGINS.LBLWLXDESCRIPTION.CAPTION=Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q) TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[0].TITLE.CAPTION=Active TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[1].TITLE.CAPTION=Plugin TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[2].TITLE.CAPTION=Registered for TFRMOPTIONSPLUGINS.STGPLUGINS.COLUMNS[3].TITLE.CAPTION=File name TFRMOPTIONSPLUGINS.BTNADDPLUGIN.CAPTION=A&dd TFRMOPTIONSPLUGINS.BTNENABLEPLUGIN.CAPTION=E&nable TFRMOPTIONSPLUGINS.BTNREMOVEPLUGIN.CAPTION=&Remove TFRMOPTIONSPLUGINS.BTNTWEAKPLUGIN.CAPTION=&Tweak TFRMOPTIONSPLUGINS.BTNCONFIGPLUGIN.CAPTION=Con&figure doublecmd-0.5.8/src/frames/foptionsmisc.lfm0000644000175000017500000000762012112400256017765 0ustar alexxalexxinherited frmOptionsMisc: TfrmOptionsMisc Height = 263 Width = 719 ClientHeight = 263 ClientWidth = 719 DesignLeft = 460 DesignTop = 269 object gbExtended: TGroupBox[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 183 Top = 6 Width = 707 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 ChildSizing.LeftRightSpacing = 12 ChildSizing.TopBottomSpacing = 6 ClientHeight = 179 ClientWidth = 703 TabOrder = 0 object chkShowWarningMessages: TCheckBox Left = 12 Height = 22 Top = 6 Width = 308 Caption = 'Show &warning messages ("OK" button only)' TabOrder = 0 end object chkThumbSave: TCheckBox AnchorSideTop.Control = dblThumbnails AnchorSideTop.Side = asrBottom Left = 12 Height = 22 Top = 87 Width = 191 BorderSpacing.Top = 4 Caption = '&Save thumbnails in cache' TabOrder = 2 end object lblThumbSize: TLabel AnchorSideTop.Control = speThumbWidth AnchorSideTop.Side = asrCenter Left = 12 Height = 16 Top = 119 Width = 104 Caption = '&Thumbnail size:' FocusControl = speThumbWidth ParentColor = False end object dblThumbnails: TDividerBevel AnchorSideLeft.Control = gbExtended AnchorSideTop.Control = chkGoToRoot AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbExtended AnchorSideRight.Side = asrBottom Left = 12 Height = 17 Top = 66 Width = 679 Caption = 'Thumbnails' Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 12 ParentFont = False end object speThumbWidth: TSpinEdit AnchorSideLeft.Control = lblThumbSize AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = chkThumbSave AnchorSideTop.Side = asrBottom Left = 122 Height = 25 Top = 115 Width = 50 BorderSpacing.Left = 6 BorderSpacing.Top = 6 MaxValue = 512 MinValue = 16 TabOrder = 3 Value = 16 end object speThumbHeight: TSpinEdit AnchorSideLeft.Control = lblThumbSeparator AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = speThumbWidth Left = 194 Height = 25 Top = 115 Width = 50 BorderSpacing.Left = 6 MaxValue = 512 MinValue = 16 TabOrder = 4 Value = 16 end object lblThumbSeparator: TLabel AnchorSideLeft.Control = speThumbWidth AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = speThumbWidth AnchorSideTop.Side = asrCenter Left = 178 Height = 16 Top = 119 Width = 10 BorderSpacing.Left = 6 Caption = 'X' ParentColor = False end object lblThumbPixels: TLabel AnchorSideLeft.Control = speThumbHeight AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = speThumbWidth AnchorSideTop.Side = asrCenter Left = 250 Height = 16 Top = 119 Width = 40 BorderSpacing.Left = 6 Caption = 'pixels' ParentColor = False end object btnThumbCompactCache: TButton AnchorSideTop.Control = speThumbWidth AnchorSideTop.Side = asrBottom Left = 12 Height = 27 Top = 146 Width = 316 AutoSize = True BorderSpacing.Top = 6 Caption = '&Remove thumbnails for no longer existing files' OnClick = btnThumbCompactCacheClick TabOrder = 5 end object chkGoToRoot: TCheckBox AnchorSideTop.Control = chkShowWarningMessages AnchorSideTop.Side = asrBottom Left = 12 Height = 22 Top = 32 Width = 375 BorderSpacing.Top = 4 Caption = 'Always &go to the root of a drive when changing drives' TabOrder = 1 end end end doublecmd-0.5.8/src/frames/foptionstoolbase.lrt0000644000175000017500000000060412020403374020662 0ustar alexxalexxTFRMOPTIONSTOOLBASE.LBLTOOLSPATH.CAPTION=&Path to program to execute TFRMOPTIONSTOOLBASE.LBLTOOLSPARAMETERS.CAPTION=A&dditional parameters TFRMOPTIONSTOOLBASE.CBTOOLSKEEPTERMINALOPEN.CAPTION=&Keep terminal window open after executing program TFRMOPTIONSTOOLBASE.CBTOOLSRUNINTERMINAL.CAPTION=&Execute in terminal TFRMOPTIONSTOOLBASE.CBTOOLSUSEEXTERNALPROGRAM.CAPTION=&Use external program doublecmd-0.5.8/src/frames/foptionsbehavior.lfm0000644000175000017500000000736212020403374020636 0ustar alexxalexxinherited frmOptionsBehavior: TfrmOptionsBehavior Height = 276 Width = 666 ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ClientHeight = 276 ClientWidth = 666 object gbMisc1: TGroupBox[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 93 Top = 6 Width = 654 Anchors = [akTop, akLeft, akRight] AutoSize = True ChildSizing.LeftRightSpacing = 8 ChildSizing.TopBottomSpacing = 6 ClientHeight = 75 ClientWidth = 650 TabOrder = 0 object cbOnlyOnce: TCheckBox AnchorSideLeft.Control = gbMisc1 AnchorSideTop.Control = gbMisc1 AnchorSideRight.Control = gbMisc1 AnchorSideRight.Side = asrBottom Left = 8 Height = 17 Top = 6 Width = 634 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = 'A&llow only one copy of DC at a time' TabOrder = 0 end object cbMinimizeToTray: TCheckBox AnchorSideLeft.Control = gbMisc1 AnchorSideTop.Control = cbOnlyOnce AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbMisc1 AnchorSideRight.Side = asrBottom Left = 8 Height = 17 Top = 29 Width = 634 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = 'Mo&ve icon to system tray when minimized' TabOrder = 1 end object cbAlwaysShowTrayIcon: TCheckBox AnchorSideLeft.Control = gbMisc1 AnchorSideTop.Control = cbMinimizeToTray AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbMisc1 AnchorSideRight.Side = asrBottom Left = 8 Height = 17 Top = 52 Width = 634 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 Caption = 'Al&ways show tray icon' OnChange = cbAlwaysShowTrayIconChange TabOrder = 2 end end object gbMisc2: TGroupBox[1] AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbMisc1 AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 85 Top = 99 Width = 654 Anchors = [akTop, akLeft, akRight] AutoSize = True ClientHeight = 67 ClientWidth = 650 TabOrder = 1 object lblDrivesBlackList: TLabel AnchorSideLeft.Control = gbMisc2 AnchorSideTop.Control = gbMisc2 Left = 8 Height = 13 Top = 2 Width = 70 BorderSpacing.Left = 8 BorderSpacing.Top = 2 Caption = 'Drives &blacklist' FocusControl = edtDrivesBlackList ParentColor = False end object edtDrivesBlackList: TEdit AnchorSideLeft.Control = lblDrivesBlackList AnchorSideTop.Control = lblDrivesBlackList AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbMisc2 AnchorSideRight.Side = asrBottom Left = 8 Height = 21 Hint = 'Here you can enter one or more drives or mount points, separated by ";".' Top = 21 Width = 634 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 BorderSpacing.Right = 8 BorderSpacing.Bottom = 4 ParentShowHint = False ShowHint = True TabOrder = 0 end object cbBlacklistUnmountedDevices: TCheckBox AnchorSideLeft.Control = edtDrivesBlackList AnchorSideTop.Control = edtDrivesBlackList AnchorSideTop.Side = asrBottom Left = 8 Height = 27 Top = 65 Width = 314 BorderSpacing.Bottom = 4 Caption = 'Automatically &hide unmounted devices' TabOrder = 1 end end end doublecmd-0.5.8/src/frames/foptionsignorelist.lrt0000644000175000017500000000044512020403374021234 0ustar alexxalexxTFRMOPTIONSIGNORELIST.LBLSAVEIN.CAPTION=&Save in: TFRMOPTIONSIGNORELIST.CHKIGNOREENABLE.CAPTION=&Ignore (don't show) the following files and folders: TFRMOPTIONSIGNORELIST.BTNADDSEL.CAPTION=A&dd selected names TFRMOPTIONSIGNORELIST.BTNADDSELWITHPATH.CAPTION=Add selected names with &full path doublecmd-0.5.8/src/frames/foptionskeyboard.lrt0000644000175000017500000000045112020403374020652 0ustar alexxalexxTFRMOPTIONSKEYBOARD.GBTYPING.CAPTION=Typing TFRMOPTIONSKEYBOARD.LBLNOMODIFIER.CAPTION=&Letters TFRMOPTIONSKEYBOARD.LBLALT.CAPTION=Alt+L&etters TFRMOPTIONSKEYBOARD.LBLCTRLALT.CAPTION=Ctrl+Alt+Le&tters TFRMOPTIONSKEYBOARD.CBLYNXLIKE.CAPTION=Le&ft, Right arrows change directory (Lynx-like movement) doublecmd-0.5.8/src/frames/foptionsfiletypescolors.lfm0000644000175000017500000002234512020403374022263 0ustar alexxalexxinherited frmOptionsFileTypesColors: TfrmOptionsFileTypesColors Height = 356 Width = 759 ClientHeight = 356 ClientWidth = 759 DesignTop = 20 object gbFileTypesColors: TGroupBox[0] AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 8 Height = 342 Top = 6 Width = 743 Anchors = [akTop, akLeft, akRight, akBottom] AutoSize = True BorderSpacing.Left = 8 BorderSpacing.Top = 6 BorderSpacing.Right = 8 BorderSpacing.Bottom = 8 Caption = 'File types colors (sort by drag&&drop)' ClientHeight = 324 ClientWidth = 739 TabOrder = 0 object lblCategoryName: TLabel AnchorSideTop.Control = edtCategoryName AnchorSideTop.Side = asrCenter Left = 12 Height = 13 Top = 142 Width = 77 Caption = 'Category &name:' FocusControl = edtCategoryName ParentColor = False end object lblCategoryMask: TLabel AnchorSideTop.Control = edtCategoryMask AnchorSideTop.Side = asrCenter Left = 12 Height = 13 Top = 173 Width = 76 Caption = 'Category &mask:' FocusControl = edtCategoryMask ParentColor = False end object lblCategoryColor: TLabel AnchorSideTop.Control = cbCategoryColor AnchorSideTop.Side = asrCenter Left = 12 Height = 13 Top = 236 Width = 75 Caption = 'Category co&lor:' FocusControl = cbCategoryColor ParentColor = False end object lblCategoryAttr: TLabel AnchorSideTop.Control = edtCategoryAttr AnchorSideTop.Side = asrCenter Left = 12 Height = 13 Top = 204 Width = 97 Caption = 'Category a&ttributes:' FocusControl = edtCategoryAttr ParentColor = False end object edtCategoryName: TEdit AnchorSideTop.Control = lbCategories AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lbCategories AnchorSideRight.Side = asrBottom Left = 174 Height = 23 Top = 137 Width = 557 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 12 TabOrder = 1 end object edtCategoryMask: TEdit AnchorSideTop.Control = edtCategoryName AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnSearchTemplate Left = 174 Height = 23 Top = 168 Width = 528 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 8 BorderSpacing.Right = 6 TabOrder = 2 end object cbCategoryColor: TColorBox AnchorSideTop.Control = edtCategoryAttr AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnCategoryColor Left = 174 Height = 25 Top = 230 Width = 523 Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbPrettyNames] Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 8 BorderSpacing.Right = 6 ItemHeight = 16 TabOrder = 5 end object btnAddCategory: TBitBtn AnchorSideTop.Control = cbCategoryColor AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnDeleteCategory Left = 389 Height = 32 Top = 267 Width = 110 Anchors = [akTop, akRight] BorderSpacing.Left = 6 BorderSpacing.Top = 12 BorderSpacing.Right = 6 Caption = 'A&dd' OnClick = btnAddCategoryClick TabOrder = 7 end object btnDeleteCategory: TBitBtn AnchorSideTop.Control = cbCategoryColor AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnApplyCategory Left = 505 Height = 32 Top = 267 Width = 110 Anchors = [akTop, akRight] BorderSpacing.Top = 12 BorderSpacing.Right = 6 Caption = 'D&elete' OnClick = btnDeleteCategoryClick TabOrder = 8 end object btnCategoryColor: TButton AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cbCategoryColor AnchorSideRight.Control = edtCategoryAttr AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = cbCategoryColor AnchorSideBottom.Side = asrBottom Left = 703 Height = 25 Top = 230 Width = 28 Anchors = [akTop, akRight, akBottom] BorderSpacing.InnerBorder = 4 Caption = '>>' OnClick = btnCategoryColorClick TabOrder = 6 end object lbCategories: TListBox AnchorSideTop.Control = gbFileTypesColors AnchorSideRight.Control = gbFileTypesColors AnchorSideRight.Side = asrBottom Left = 12 Height = 119 Top = 6 Width = 719 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Top = 6 BorderSpacing.Right = 8 DragMode = dmAutomatic ItemHeight = 0 OnClick = lbCategoriesClick OnDragDrop = lbCategoriesDragDrop OnDragOver = lbCategoriesDragOver OnDrawItem = lbCategoriesDrawItem ScrollWidth = 717 Style = lbOwnerDrawFixed TabOrder = 0 TopIndex = -1 end object btnApplyCategory: TBitBtn AnchorSideTop.Control = cbCategoryColor AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lbCategories AnchorSideRight.Side = asrBottom Left = 621 Height = 32 Top = 267 Width = 110 Anchors = [akTop, akRight] BorderSpacing.Top = 12 Caption = 'A&pply' OnClick = btnApplyCategoryClick TabOrder = 9 end object edtCategoryAttr: TEdit AnchorSideTop.Control = edtCategoryMask AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lbCategories AnchorSideRight.Side = asrBottom Left = 174 Height = 23 Top = 199 Width = 557 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 8 TabOrder = 4 end object btnSearchTemplate: TBitBtn AnchorSideTop.Control = edtCategoryMask AnchorSideRight.Control = lbCategories AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = edtCategoryMask AnchorSideBottom.Side = asrBottom Left = 708 Height = 23 Hint = 'Template...' Top = 168 Width = 23 Anchors = [akTop, akRight, akBottom] Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000009700 00FF000000000000000000000000000000FF00000000000000FFC2B5B3E30000 00FF000000000000000000000000000000000000000000000000000000000000 0000970000FF00000000000000000000000000000000C5B8B570E3DBD9FF8975 7375000000000000000000000000000000000000000000000000000000000000 000000000000970000FF000000000000000000000000C2B4B26FE1D9D7FF8571 6E75000000000000000000000000000000000000000000000000000000000000 0000970000FF00000000000000000000000000000000B3A4A26FD6C9C7FF705E 5B75000000000000000000000000000000000000000000000000000000009700 00FF0000000000000000000000000000000000000000A798967DD9CBCAFF7362 6184000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000005B494812D4C6C5FFD1C2C1FE8F7E 7DFF5B4B4E160000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000C2B3B3C0EEE2E2FED5C8C7FFD6C9 C8FE746363C60000000000000000000000000000000000000000000000000000 00000000000000000000000000009D8B8B5CF9EEEFFFEDE1E0FFDED1D1FFEADE DCFFB1A1A0FF645455630000000000000000000000000000000000000000D2C6 C36CEEE5E2C3BEADABB100000002D2C4C3FBFDF5F4FEE0D4D3FFDACCCBFFE8DD DBFFD2C4C2FE796868FD61525509000000000000000000000000000000008B78 754B00000000000000007C6B6BFCF7ECECFFFEF6F4FFCFC2C0FFD4C7C7FFEDE3 E1FFCDBDBBFF998887FE605151BC00000000000000000000000000000000806F 6D350000000062514F4CCEBEBEFFFBF2F0FFFBF6F5FFC7B9B7FFD0C3C3FFF8F0 EFFFC7B7B4FFA69593FF665555FF5545464D000000000000000000000000D8CF CE59D1C5C299978484FFF4EBEBFEFEFDFDFFF4EEEDFFC3B5B3FFD8CBC9FFFFFC FCFFD8CBC9FFB2A1A0FF867474FE524343FA0000000200000000000000000000 00007767669CE0D3D1FFFFFEFEFFFFFFFFFFEFE7E6FFAF9E9BFFD6C6C4FFFCF7 F7FFD8CACAFFAE9D9EFF827173FF5B4A4EFF67595C9F00000000000000000000 00008E7F7ED8E2D7D6FFCCC2C2FFCDC6C6FFD0C9C9FFD7D1D2FFD6D1D2FFCEC6 C6FFCBC5C5FFC7C0C0FFC2B8B8FFA39698FF726468DC00000000000000000000 0000ACA2A3DEAC9C99FFC9BCBBFFDBCDCAFFF3E6E2FEFFFFFEFFF5EEECFFB9A7 A3FFF3EDEBFEF7F3F3FFA99998FFA49695FFB1A6A7E700000000000000000000 0000000000005F5054459C919391B7ADAFB4BBB2B2C3C0B5B6CFC0B6B7D2BBB2 B3D0BCB2B3C3BBB3B4B59D929592615156460000000000000000 } Layout = blGlyphRight OnClick = btnSearchTemplateClick ParentShowHint = False ShowHint = True TabOrder = 3 end end object optColorDialog: TColorDialog[1] Color = clBlack CustomColors.Strings = ( 'ColorA=000000' 'ColorB=000080' 'ColorC=008000' 'ColorD=008080' 'ColorE=800000' 'ColorF=800080' 'ColorG=808000' 'ColorH=808080' 'ColorI=C0C0C0' 'ColorJ=0000FF' 'ColorK=00FF00' 'ColorL=00FFFF' 'ColorM=FF0000' 'ColorN=FF00FF' 'ColorO=FFFF00' 'ColorP=FFFFFF' 'ColorQ=C0DCC0' 'ColorR=F0CAA6' 'ColorS=F0FBFF' 'ColorT=A4A0A0' ) left = 544 top = 256 end end doublecmd-0.5.8/src/frames/foptionsconfiguration.lrt0000644000175000017500000000150412020403374021721 0ustar alexxalexxTFRMOPTIONSCONFIGURATION.GBLOCCONFIGFILES.CAPTION=Location of configuration files TFRMOPTIONSCONFIGURATION.RBPROGRAMDIR.CAPTION=P&rogram directory (portable version) TFRMOPTIONSCONFIGURATION.RBUSERHOMEDIR.CAPTION=&User home directory TFRMOPTIONSCONFIGURATION.LBLCMDLINECONFIGDIR.CAPTION=Set on command line TFRMOPTIONSCONFIGURATION.GBSAVEONEXIT.CAPTION=Save on exit TFRMOPTIONSCONFIGURATION.CBDIRHISTORY.CAPTION=&Directory history TFRMOPTIONSCONFIGURATION.CBCMDLINEHISTORY.CAPTION=Co&mmand line history TFRMOPTIONSCONFIGURATION.CBFILEMASKHISTORY.CAPTION=&File mask history TFRMOPTIONSCONFIGURATION.CHKSAVECONFIGURATION.CAPTION=Sa&ve configuration TFRMOPTIONSCONFIGURATION.CHKSEARCHREPLACEHISTORY.CAPTION=Searc&h/Replace history TFRMOPTIONSCONFIGURATION.BTNCONFIGEDIT.CAPTION=&Edit TFRMOPTIONSCONFIGURATION.BTNCONFIGAPPLY.CAPTION=A&pply doublecmd-0.5.8/src/frames/foptionsfonts.pas0000644000175000017500000001650611740433676020215 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Fonts options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsFonts; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, Spin, Dialogs, Graphics, fOptionsFrame, uGlobs; type { TfrmOptionsFonts } TfrmOptionsFonts = class(TOptionsEditor) btnSelEditFnt: TButton; btnSelLogFnt: TButton; btnSelMainFnt: TButton; btnSelViewerBookFnt: TButton; btnSelViewFnt: TButton; dlgFnt: TFontDialog; edtEditorFont: TEdit; edtEditorFontSize: TSpinEdit; edtLogFont: TEdit; edtLogFontSize: TSpinEdit; edtMainFont: TEdit; edtMainFontSize: TSpinEdit; edtViewerBookFont: TEdit; edtViewerBookFontSize: TSpinEdit; edtViewerFont: TEdit; edtViewerFontSize: TSpinEdit; lblEditorFont: TLabel; lblLogFont: TLabel; lblMainFont: TLabel; lblViewerBookFont: TLabel; lblViewerFont: TLabel; procedure btnSelEditFntClick(Sender: TObject); procedure btnSelMainFntClick(Sender: TObject); procedure btnSelViewFntClick(Sender: TObject); procedure btnSelLogFntClick(Sender: TObject); procedure btnSelViewerBookFntClick(Sender: TObject); procedure edtEditorFontExit(Sender: TObject); procedure edtEditorFontSizeChange(Sender: TObject); procedure edtLogFontExit(Sender: TObject); procedure edtMainFontExit(Sender: TObject); procedure edtMainFontSizeChange(Sender: TObject); procedure edtViewerBookFontExit(Sender: TObject); procedure edtViewerFontExit(Sender: TObject); procedure edtViewerFontSizeChange(Sender: TObject); procedure edtLogFontSizeChange(Sender: TObject); procedure edtViewerBookFontSizeChange(Sender: TObject); private procedure LoadFont(aDCFont:TDCFont); procedure SaveFont(aDCFont:TDCFont); // function GetFont(aDCFont:TDCFont):TFont; procedure SetFont(aDCFont:TDCFont;aFont:TFont); procedure SetFontSize(aDCFont:TDCFont;aFontSize:Integer); procedure SetFontName(aDCFont:TDCFont;aFontName:String); // procedure RunDialogFont(aDCFont:TDCFont); protected procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses uLng; { TfrmOptionsFonts } procedure TfrmOptionsFonts.btnSelMainFntClick(Sender: TObject); begin RunDialogFont(dcfMain); end; procedure TfrmOptionsFonts.btnSelEditFntClick(Sender: TObject); begin RunDialogFont(dcfEditor); end; procedure TfrmOptionsFonts.btnSelViewFntClick(Sender: TObject); begin RunDialogFont(dcfViewer); end; procedure TfrmOptionsFonts.btnSelViewerBookFntClick(Sender: TObject); begin RunDialogFont(dcfViewerBook); end; procedure TfrmOptionsFonts.btnSelLogFntClick(Sender: TObject); begin RunDialogFont(dcfLog); end; procedure TfrmOptionsFonts.edtMainFontExit(Sender: TObject); begin SetFontName(dcfMain, TEdit(Sender).Text); end; procedure TfrmOptionsFonts.edtEditorFontExit(Sender: TObject); begin SetFontName(dcfEditor, TEdit(Sender).Text); end; procedure TfrmOptionsFonts.edtViewerFontExit(Sender: TObject); begin SetFontName(dcfViewer, TEdit(Sender).Text); end; procedure TfrmOptionsFonts.edtViewerBookFontExit(Sender: TObject); begin SetFontName(dcfViewerBook, TEdit(Sender).Text); end; procedure TfrmOptionsFonts.edtLogFontExit(Sender: TObject); begin SetFontName(dcfLog, TEdit(Sender).Text); end; procedure TfrmOptionsFonts.edtMainFontSizeChange(Sender: TObject); begin SetFontSize(dcfMain, TSpinEdit(Sender).Value); end; procedure TfrmOptionsFonts.edtEditorFontSizeChange(Sender: TObject); begin SetFontSize(dcfEditor, TSpinEdit(Sender).Value); end; procedure TfrmOptionsFonts.edtViewerFontSizeChange(Sender: TObject); begin SetFontSize(dcfViewer, TSpinEdit(Sender).Value); end; procedure TfrmOptionsFonts.edtViewerBookFontSizeChange(Sender: TObject); begin SetFontSize(dcfViewerBook, TSpinEdit(Sender).Value); end; procedure TfrmOptionsFonts.edtLogFontSizeChange(Sender: TObject); begin SetFontSize(dcfLog, TSpinEdit(Sender).Value); end; class function TfrmOptionsFonts.GetIconIndex: Integer; begin Result := 3; end; class function TfrmOptionsFonts.GetTitle: String; begin Result := rsOptionsEditorFonts; end; procedure TfrmOptionsFonts.Load; begin LoadFont(dcfMain); LoadFont(dcfEditor); LoadFont(dcfViewer); LoadFont(dcfLog); LoadFont(dcfViewerBook); end; function TfrmOptionsFonts.Save: TOptionsEditorSaveFlags; begin Result := []; SaveFont(dcfMain); SaveFont(dcfEditor); SaveFont(dcfViewer); SaveFont(dcfLog); SaveFont(dcfViewerBook); end; procedure TfrmOptionsFonts.LoadFont(aDCFont: TDCFont); var xFont:TFont; begin xFont:=TFont.Create; try FontOptionsToFont(gFonts[aDCFont], xFont); SetFont(aDCFont, xFont); finally FreeAndNil(xFont); end; end; procedure TfrmOptionsFonts.SaveFont(aDCFont: TDCFont); begin FontToFontOptions(GetFont(aDCFont), gFonts[aDCFont]); end; procedure TfrmOptionsFonts.SetFont(aDCFont: TDCFont; aFont: TFont); begin case aDCFont of dcfMain: begin edtMainFont.Font := aFont; edtMainFont.Text := aFont.Name; edtMainFontSize.Value := aFont.Size; end; dcfEditor: begin edtEditorFont.Font := aFont; edtEditorFont.Text := aFont.Name; edtEditorFontSize.Value := aFont.Size; end; dcfViewer: begin edtViewerFont.Font := aFont; edtViewerFont.Text := aFont.Name; edtViewerFontSize.Value := aFont.Size; end; dcfLog: begin edtLogFont.Font := aFont; edtLogFont.Text := aFont.Name; edtLogFontSize.Value := aFont.Size; end; dcfViewerBook: begin edtViewerBookFont.Font := aFont; edtViewerBookFont.Text := aFont.Name; edtViewerBookFontSize.Value := aFont.Size; end; end; end; procedure TfrmOptionsFonts.SetFontSize(aDCFont: TDCFont; aFontSize: Integer); begin GetFont(aDCFont).Size:=aFontSize; end; procedure TfrmOptionsFonts.SetFontName(aDCFont: TDCFont; aFontName: String); begin GetFont(aDCFont).Name:=aFontName; end; function TfrmOptionsFonts.GetFont(aDCFont: TDCFont): TFont; begin case aDCFont of dcfMain : result := edtMainFont.Font; dcfEditor : result := edtEditorFont.Font; dcfViewer : result := edtViewerFont.Font; dcfLog : result := edtLogFont.Font; dcfViewerBook: result := edtViewerBookFont.Font; else result:=nil; //TODO: show error for programmer end; end; procedure TfrmOptionsFonts.RunDialogFont(aDCFont: TDCFont); begin dlgFnt.Font := GetFont(aDCFont); if dlgFnt.Execute then SetFont(aDCFont, dlgFnt.Font); end; end. doublecmd-0.5.8/src/frames/foptionslog.pas0000644000175000017500000000617011740433676017641 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Log options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsLog; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, EditBtn, fOptionsFrame; type { TfrmOptionsLog } TfrmOptionsLog = class(TOptionsEditor) cbLogArcOp: TCheckBox; cbLogCpMvLn: TCheckBox; cbLogDelete: TCheckBox; cbLogDirOp: TCheckBox; cbLogErrors: TCheckBox; cbLogFile: TCheckBox; cbLogInfo: TCheckBox; cbLogSuccess: TCheckBox; cbLogVFS: TCheckBox; fneLogFileName: TFileNameEdit; gbLogFile: TGroupBox; gbLogFileOp: TGroupBox; gbLogFileStatus: TGroupBox; protected procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses uGlobs, uLng; { TfrmOptionsLog } class function TfrmOptionsLog.GetIconIndex: Integer; begin Result := 23; end; class function TfrmOptionsLog.GetTitle: String; begin Result := rsOptionsEditorLog; end; procedure TfrmOptionsLog.Load; begin cbLogFile.Checked := gLogFile; fneLogFileName.FileName := gLogFileName; cbLogCpMvLn.Checked := (log_cp_mv_ln in gLogOptions); cbLogDelete.Checked := (log_delete in gLogOptions); cbLogDirOp.Checked := (log_dir_op in gLogOptions); cbLogArcOp.Checked := (log_arc_op in gLogOptions); cbLogVFS.Checked := (log_vfs_op in gLogOptions); cbLogSuccess.Checked := (log_success in gLogOptions); cbLogErrors.Checked := (log_errors in gLogOptions); cbLogInfo.Checked := (log_info in gLogOptions); end; function TfrmOptionsLog.Save: TOptionsEditorSaveFlags; begin Result := []; gLogFile := cbLogFile.Checked; gLogFileName := fneLogFileName.FileName; gLogOptions := []; // Reset log options if cbLogCpMvLn.Checked then Include(gLogOptions, log_cp_mv_ln); if cbLogDelete.Checked then Include(gLogOptions, log_delete); if cbLogDirOp.Checked then Include(gLogOptions, log_dir_op); if cbLogArcOp.Checked then Include(gLogOptions, log_arc_op); if cbLogVFS.Checked then Include(gLogOptions, log_vfs_op); if cbLogSuccess.Checked then Include(gLogOptions, log_success); if cbLogErrors.Checked then Include(gLogOptions, log_errors); if cbLogInfo.Checked then Include(gLogOptions, log_info); end; end. doublecmd-0.5.8/src/frames/foptionstoolbase.pas0000644000175000017500000001210312020576275020654 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Base options page for external tools (Viewer, Editor, Differ) Copyright (C) 2006-2012 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsToolBase; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Controls, StdCtrls, EditBtn, fOptionsFrame, uGlobs; type { TfrmOptionsToolBase } TfrmOptionsToolBase = class(TOptionsEditor) cbToolsKeepTerminalOpen: TCheckBox; cbToolsRunInTerminal: TCheckBox; cbToolsUseExternalProgram: TCheckBox; edtToolsParameters: TEdit; fneToolsPath: TFileNameEdit; lblToolsParameters: TLabel; lblToolsPath: TLabel; procedure cbToolsKeepTerminalOpenChange(Sender: TObject); procedure cbToolsRunInTerminalChange(Sender: TObject); procedure cbToolsUseExternalProgramChange(Sender: TObject); procedure edtToolsParametersChange(Sender: TObject); procedure fneToolsPathAcceptFileName(Sender: TObject; var Value: String); procedure fneToolsPathChange(Sender: TObject); private FExternalTool: TExternalTool; FExternalToolOptions: TExternalToolOptions; FOnUseExternalProgramChange: TNotifyEvent; protected procedure Init; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; property ExternalTool: TExternalTool read FExternalTool write FExternalTool; property OnUseExternalProgramChange: TNotifyEvent read FOnUseExternalProgramChange write FOnUseExternalProgramChange; public constructor Create(TheOwner: TComponent); override; end; implementation {$R *.lfm} uses uDCUtils; { TfrmOptionsToolBase } procedure TfrmOptionsToolBase.cbToolsKeepTerminalOpenChange(Sender: TObject); begin FExternalToolOptions.KeepTerminalOpen := cbToolsKeepTerminalOpen.Checked; end; procedure TfrmOptionsToolBase.cbToolsRunInTerminalChange(Sender: TObject); begin cbToolsKeepTerminalOpen.Enabled := cbToolsRunInTerminal.Checked; FExternalToolOptions.RunInTerminal := cbToolsRunInTerminal.Checked; end; procedure TfrmOptionsToolBase.cbToolsUseExternalProgramChange(Sender: TObject); begin lblToolsPath.Enabled := cbToolsUseExternalProgram.Checked; fneToolsPath.Enabled := cbToolsUseExternalProgram.Checked; lblToolsParameters.Enabled := cbToolsUseExternalProgram.Checked; edtToolsParameters.Enabled := cbToolsUseExternalProgram.Checked; cbToolsRunInTerminal.Enabled := cbToolsUseExternalProgram.Checked; cbToolsKeepTerminalOpen.Enabled := cbToolsUseExternalProgram.Checked; FExternalToolOptions.Enabled := cbToolsUseExternalProgram.Checked; if Assigned(FOnUseExternalProgramChange) then FOnUseExternalProgramChange(Self); end; procedure TfrmOptionsToolBase.edtToolsParametersChange(Sender: TObject); begin FExternalToolOptions.Parameters := edtToolsParameters.Text; end; procedure TfrmOptionsToolBase.fneToolsPathAcceptFileName(Sender: TObject; var Value: String); begin Value := SetCmdDirAsEnvVar(Value); {$IF DEFINED(LCLCARBON)} // OnChange don't called under Carbon when choose file name // from open dialog so assign path in this event. FExternalToolOptions.Path := Value; {$ENDIF} end; procedure TfrmOptionsToolBase.fneToolsPathChange(Sender: TObject); begin // Use fneToolsPath.Caption because Filename is one letter behind when typing manually. FExternalToolOptions.Path := fneToolsPath.Caption; end; procedure TfrmOptionsToolBase.Init; begin // Enable/disable tools controls. cbToolsUseExternalProgramChange(nil); end; procedure TfrmOptionsToolBase.Load; begin FExternalToolOptions := gExternalTools[FExternalTool]; cbToolsUseExternalProgram.Checked := FExternalToolOptions.Enabled; fneToolsPath.FileName := FExternalToolOptions.Path; edtToolsParameters.Text := FExternalToolOptions.Parameters; cbToolsRunInTerminal.Checked := FExternalToolOptions.RunInTerminal; cbToolsKeepTerminalOpen.Checked := FExternalToolOptions.KeepTerminalOpen; end; function TfrmOptionsToolBase.Save: TOptionsEditorSaveFlags; begin gExternalTools[FExternalTool] := FExternalToolOptions; Result := []; end; constructor TfrmOptionsToolBase.Create(TheOwner: TComponent); begin inherited Create(TheOwner); FOnUseExternalProgramChange := nil; end; end. doublecmd-0.5.8/src/frames/foptionsarchivers.lrt0000644000175000017500000000222612020403374021042 0ustar alexxalexxTFRMOPTIONSARCHIVERS.TBARCHIVERGENERAL.CAPTION=General TFRMOPTIONSARCHIVERS.LBLDESCRIPTION.CAPTION=De&scription: TFRMOPTIONSARCHIVERS.LBLARCHIVER.CAPTION=Arc&hiver: TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTENSION.CAPTION=E&xtension: TFRMOPTIONSARCHIVERS.LBLARCHIVELIST.CAPTION=&List: TFRMOPTIONSARCHIVERS.LBLARCHIVEEXTRACT.CAPTION=Ex&tract: TFRMOPTIONSARCHIVERS.LBLARCHIVEADD.CAPTION=Add&ing: TFRMOPTIONSARCHIVERS.LBLARCHIVELISTFORMAT.CAPTION=Listing for&mat: TFRMOPTIONSARCHIVERS.LBLARCHIVELISTSTART.CAPTION=Listin&g start (optional): TFRMOPTIONSARCHIVERS.LBLARCHIVELISTEND.CAPTION=Listing &finish (optional): TFRMOPTIONSARCHIVERS.TBARCHIVERADDITIONAL.CAPTION=Additional TFRMOPTIONSARCHIVERS.GBARCHIVEROPTIONS.CAPTION=Options TFRMOPTIONSARCHIVERS.CHKMULTIARCOUTPUT.CAPTION=S&how console output TFRMOPTIONSARCHIVERS.CHKMULTIARCDEBUG.CAPTION=De&bug mode TFRMOPTIONSARCHIVERS.BTNMULTIARCAPPLY.CAPTION=A&pply TFRMOPTIONSARCHIVERS.BTNMULTIARCRENAME.CAPTION=&Rename TFRMOPTIONSARCHIVERS.BTNMULTIARCDELETE.CAPTION=D&elete TFRMOPTIONSARCHIVERS.BTNMULTIARCADD.CAPTION=A&dd TFRMOPTIONSARCHIVERS.CHKMULTIARCENABLED.CAPTION=E&nabled TFRMOPTIONSARCHIVERS.BTNAUTOCONFIG.CAPTION=A&uto Configure doublecmd-0.5.8/src/frames/foptionsicons.lfm0000644000175000017500000001530012111165165020145 0ustar alexxalexxinherited frmOptionsIcons: TfrmOptionsIcons Height = 389 Width = 478 ClientHeight = 389 ClientWidth = 478 DesignLeft = 244 DesignTop = 121 object gbIconsSize: TGroupBox[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbDisableSpecialIcons AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 82 Top = 242 Width = 466 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = ' Icon size ' ChildSizing.TopBottomSpacing = 8 ClientHeight = 64 ClientWidth = 462 TabOrder = 2 object cbIconsSize: TComboBox AnchorSideLeft.Control = gbIconsSize AnchorSideTop.Control = pnlIconExample AnchorSideTop.Side = asrCenter AnchorSideRight.Side = asrBottom Left = 10 Height = 21 Top = 22 Width = 131 BorderSpacing.Left = 10 BorderSpacing.Right = 10 ItemHeight = 13 ItemIndex = 0 Items.Strings = ( '16x16' '22x22' '32x32' ) OnChange = cbIconsSizeChange Style = csDropDownList TabOrder = 0 Text = '16x16' end object pnlIconExample: TPanel AnchorSideTop.Control = gbIconsSize AnchorSideRight.Control = gbIconsSize AnchorSideRight.Side = asrBottom Left = 404 Height = 48 Top = 8 Width = 48 Anchors = [akTop, akRight] BorderSpacing.Right = 10 BevelOuter = bvLowered ClientHeight = 48 ClientWidth = 48 TabOrder = 1 object imgIconExample: TImage Left = 1 Height = 46 Top = 1 Width = 46 Align = alClient Center = True end end end object gbShowIconsMode: TGroupBox[1] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 145 Top = 6 Width = 466 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = ' Show icons to the left of the filename ' ChildSizing.TopBottomSpacing = 8 ClientHeight = 127 ClientWidth = 462 TabOrder = 0 object rbIconsShowAll: TRadioButton AnchorSideLeft.Control = gbShowIconsMode AnchorSideTop.Control = rbIconsShowAllAndExe AnchorSideTop.Side = asrBottom Left = 10 Height = 17 Top = 31 Width = 31 BorderSpacing.Left = 10 BorderSpacing.Top = 6 Caption = 'A&ll' Checked = True TabOrder = 1 TabStop = True end object rbIconsShowStandard: TRadioButton AnchorSideLeft.Control = gbShowIconsMode AnchorSideTop.Control = rbIconsShowAll AnchorSideTop.Side = asrBottom Left = 10 Height = 17 Top = 54 Width = 115 BorderSpacing.Left = 10 BorderSpacing.Top = 6 Caption = 'Only &standard icons' TabOrder = 2 end object rbIconsShowNone: TRadioButton AnchorSideLeft.Control = gbShowIconsMode AnchorSideTop.Control = rbIconsShowStandard AnchorSideTop.Side = asrBottom Left = 10 Height = 17 Top = 77 Width = 60 BorderSpacing.Left = 10 BorderSpacing.Top = 6 Caption = '&No icons' OnChange = rbIconsShowNoneChange TabOrder = 3 end object rbIconsShowAllAndExe: TRadioButton AnchorSideLeft.Control = gbShowIconsMode AnchorSideTop.Control = gbShowIconsMode Left = 10 Height = 17 Top = 8 Width = 171 BorderSpacing.Left = 10 Caption = 'All associated + &EXE/LNK (slow)' TabOrder = 0 end object cbIconsShowOverlay: TCheckBox AnchorSideLeft.Control = gbShowIconsMode AnchorSideTop.Control = rbIconsShowNone AnchorSideTop.Side = asrBottom Left = 10 Height = 17 Top = 102 Width = 179 BorderSpacing.Left = 10 BorderSpacing.Top = 8 Caption = 'Show o&verlay icons, e.g. for links' TabOrder = 4 end end object gbDisableSpecialIcons: TGroupBox[2] AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbShowIconsMode AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 79 Top = 157 Width = 466 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = 'Disable special icons' ChildSizing.TopBottomSpacing = 8 ClientHeight = 61 ClientWidth = 462 TabOrder = 1 object edtIconsExcludeDirs: TEdit AnchorSideLeft.Control = cbIconsExclude AnchorSideTop.Control = cbIconsExclude AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbDisableSpecialIcons AnchorSideRight.Side = asrBottom Left = 30 Height = 21 Top = 25 Width = 424 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 20 BorderSpacing.Right = 8 BorderSpacing.Bottom = 15 TabOrder = 1 end object cbIconsExclude: TCheckBox AnchorSideLeft.Control = gbDisableSpecialIcons AnchorSideTop.Control = gbDisableSpecialIcons Left = 10 Height = 17 Top = 8 Width = 250 BorderSpacing.Left = 10 Caption = 'For the following &paths and their subdirectories:' OnChange = cbIconsExcludeChange TabOrder = 0 end end object gbIconsInMenus: TGroupBox[3] AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbIconsSize AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 55 Top = 330 Width = 466 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = 'Icons in menus' ChildSizing.LeftRightSpacing = 10 ChildSizing.TopBottomSpacing = 8 ClientHeight = 37 ClientWidth = 462 TabOrder = 3 object cbIconsInMenus: TCheckBox AnchorSideLeft.Control = gbIconsInMenus AnchorSideTop.Control = cbIconsInMenusSize AnchorSideTop.Side = asrCenter Left = 10 Height = 17 Top = 10 Width = 172 Caption = 'Show icons for actions in &menus' TabOrder = 0 end object cbIconsInMenusSize: TComboBox AnchorSideTop.Control = gbIconsInMenus AnchorSideRight.Control = gbIconsInMenus AnchorSideRight.Side = asrBottom Left = 321 Height = 21 Top = 8 Width = 131 Anchors = [akTop, akRight] ItemHeight = 13 ItemIndex = 0 Items.Strings = ( '16x16' '22x22' '32x32' ) OnChange = cbIconsSizeChange Style = csDropDownList TabOrder = 1 Text = '16x16' end end end doublecmd-0.5.8/src/frames/foptionsfilesviews.lrt0000644000175000017500000000240312024554637021246 0ustar alexxalexxTFRMOPTIONSFILESVIEWS.GBSORTING.CAPTION=Sorting TFRMOPTIONSFILESVIEWS.LBLSORTMETHOD.CAPTION=&Sort method: TFRMOPTIONSFILESVIEWS.LBLCASESENSITIVITY.CAPTION=Case s&ensitivity: TFRMOPTIONSFILESVIEWS.LBLSORTFOLDERMODE.CAPTION=So&rting directories: TFRMOPTIONSFILESVIEWS.LBLNEWFILESPOSITION.CAPTION=&Insert new files TFRMOPTIONSFILESVIEWS.LBLUPDATEDFILESPOSITION.CAPTION=&Move updated files TFRMOPTIONSFILESVIEWS.CBSPACEMOVESDOWN.CAPTION=&When selecting files with , move down to next file (as with ) TFRMOPTIONSFILESVIEWS.CBDIRBRACKETS.CAPTION=S&how square brackets around directories TFRMOPTIONSFILESVIEWS.CBSHOWSYSTEMFILES.CAPTION=Show s&ystem and hidden files TFRMOPTIONSFILESVIEWS.CBLISTFILESINTHREAD.CAPTION=Load &file list in separate thread TFRMOPTIONSFILESVIEWS.CBLOADICONSSEPARATELY.CAPTION=Load icons af&ter file list TFRMOPTIONSFILESVIEWS.CBDELAYLOADINGTABS.CAPTION=Do&n't load file list until a tab is activated TFRMOPTIONSFILESVIEWS.CBHIGHLIGHTUPDATEDFILES.CAPTION=Hi&ghlight new and updated files TFRMOPTIONSFILESVIEWS.GBFORMATTING.CAPTION=Formatting TFRMOPTIONSFILESVIEWS.LBLDATETIMEFORMAT.CAPTION=&Date and time format: TFRMOPTIONSFILESVIEWS.LBLFILESIZEFORMAT.CAPTION=File si&ze format: TFRMOPTIONSFILESVIEWS.LBLDATETIMEEXAMPLE.CAPTION=Incorrect format doublecmd-0.5.8/src/frames/foptionsfiletypescolors.lrt0000644000175000017500000000122412020403374022277 0ustar alexxalexxTFRMOPTIONSFILETYPESCOLORS.GBFILETYPESCOLORS.CAPTION=File types colors (sort by drag&&drop) TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYNAME.CAPTION=Category &name: TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYMASK.CAPTION=Category &mask: TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYCOLOR.CAPTION=Category co&lor: TFRMOPTIONSFILETYPESCOLORS.LBLCATEGORYATTR.CAPTION=Category a&ttributes: TFRMOPTIONSFILETYPESCOLORS.BTNADDCATEGORY.CAPTION=A&dd TFRMOPTIONSFILETYPESCOLORS.BTNDELETECATEGORY.CAPTION=D&elete TFRMOPTIONSFILETYPESCOLORS.BTNCATEGORYCOLOR.CAPTION=>> TFRMOPTIONSFILETYPESCOLORS.BTNAPPLYCATEGORY.CAPTION=A&pply TFRMOPTIONSFILETYPESCOLORS.BTNSEARCHTEMPLATE.HINT=Template... doublecmd-0.5.8/src/frames/foptionsfilepanelscolors.lfm0000644000175000017500000003265112020403374022402 0ustar alexxalexxinherited frmOptionsFilePanelsColors: TfrmOptionsFilePanelsColors Height = 493 Width = 644 ClientHeight = 493 ClientWidth = 644 DesignTop = 20 object lblTextColor: TLabel[0] AnchorSideTop.Control = cbTextColor AnchorSideTop.Side = asrCenter Left = 6 Height = 13 Top = 13 Width = 54 Caption = 'T&ext Color:' FocusControl = cbTextColor ParentColor = False end object lblBackgroundColor: TLabel[1] AnchorSideTop.Control = cbBackColor AnchorSideTop.Side = asrCenter Left = 6 Height = 13 Top = 43 Width = 60 Caption = 'Bac&kground:' FocusControl = cbBackColor ParentColor = False end object lblBackgroundColor2: TLabel[2] AnchorSideTop.Control = cbBackColor2 AnchorSideTop.Side = asrCenter Left = 6 Height = 13 Top = 73 Width = 69 Caption = 'Backg&round 2:' FocusControl = cbBackColor2 ParentColor = False end object lblMarkColor: TLabel[3] AnchorSideTop.Control = cbMarkColor AnchorSideTop.Side = asrCenter Left = 6 Height = 13 Top = 103 Width = 55 Caption = '&Mark Color:' FocusControl = cbMarkColor ParentColor = False end object lblCursorColor: TLabel[4] AnchorSideTop.Control = cbCursorColor AnchorSideTop.Side = asrCenter Left = 6 Height = 13 Top = 133 Width = 64 Caption = 'C&ursor Color:' FocusControl = cbCursorColor ParentColor = False end object lblCursorText: TLabel[5] AnchorSideTop.Control = cbCursorText AnchorSideTop.Side = asrCenter Left = 6 Height = 13 Top = 163 Width = 61 Caption = 'Cursor Te&xt:' FocusControl = cbCursorText ParentColor = False end object cbTextColor: TColorBox[6] Left = 160 Height = 22 Top = 8 Width = 200 Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbPrettyNames] Constraints.MinWidth = 100 ItemHeight = 16 OnChange = cbColorBoxChange TabOrder = 0 end object cbBackColor: TColorBox[7] AnchorSideLeft.Control = cbTextColor AnchorSideTop.Control = cbTextColor AnchorSideTop.Side = asrBottom AnchorSideRight.Control = cbTextColor AnchorSideRight.Side = asrBottom Left = 160 Height = 22 Top = 38 Width = 200 Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbPrettyNames] Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 8 ItemHeight = 16 OnChange = cbColorBoxChange TabOrder = 2 end object btnForeColor: TButton[8] AnchorSideLeft.Control = cbTextColor AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cbTextColor AnchorSideBottom.Control = cbTextColor AnchorSideBottom.Side = asrBottom Left = 366 Height = 22 Top = 8 Width = 28 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Left = 6 BorderSpacing.InnerBorder = 4 Caption = '>>' OnClick = btnForeColorClick TabOrder = 1 end object btnBackColor: TButton[9] AnchorSideLeft.Control = btnForeColor AnchorSideTop.Control = cbBackColor AnchorSideBottom.Control = cbBackColor AnchorSideBottom.Side = asrBottom Left = 366 Height = 22 Top = 38 Width = 28 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Right = 10 BorderSpacing.InnerBorder = 4 Caption = '>>' OnClick = btnBackColorClick TabOrder = 3 end object cbBackColor2: TColorBox[10] AnchorSideLeft.Control = cbTextColor AnchorSideTop.Control = cbBackColor AnchorSideTop.Side = asrBottom AnchorSideRight.Control = cbTextColor AnchorSideRight.Side = asrBottom Left = 160 Height = 22 Top = 68 Width = 200 Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbPrettyNames] Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 8 ItemHeight = 16 OnChange = cbColorBoxChange TabOrder = 4 end object cbMarkColor: TColorBox[11] AnchorSideLeft.Control = cbTextColor AnchorSideTop.Control = cbBackColor2 AnchorSideTop.Side = asrBottom AnchorSideRight.Control = cbTextColor AnchorSideRight.Side = asrBottom Left = 160 Height = 22 Top = 98 Width = 200 Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbPrettyNames] Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 8 ItemHeight = 16 OnChange = cbColorBoxChange TabOrder = 6 end object cbCursorColor: TColorBox[12] AnchorSideLeft.Control = cbTextColor AnchorSideTop.Control = cbMarkColor AnchorSideTop.Side = asrBottom AnchorSideRight.Control = cbTextColor AnchorSideRight.Side = asrBottom Left = 160 Height = 22 Top = 128 Width = 200 Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbPrettyNames] Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 8 ItemHeight = 16 OnChange = cbColorBoxChange TabOrder = 8 end object cbCursorText: TColorBox[13] AnchorSideLeft.Control = cbTextColor AnchorSideTop.Control = cbCursorColor AnchorSideTop.Side = asrBottom AnchorSideRight.Control = cbTextColor AnchorSideRight.Side = asrBottom Left = 160 Height = 22 Top = 158 Width = 200 Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbPrettyNames] Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 8 ItemHeight = 16 OnChange = cbColorBoxChange TabOrder = 10 end object btnMarkColor: TButton[14] AnchorSideLeft.Control = btnForeColor AnchorSideTop.Control = cbMarkColor AnchorSideBottom.Control = cbMarkColor AnchorSideBottom.Side = asrBottom Left = 366 Height = 22 Top = 98 Width = 28 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Right = 10 BorderSpacing.InnerBorder = 4 Caption = '>>' OnClick = btnMarkColorClick TabOrder = 7 end object btnCursorColor: TButton[15] AnchorSideLeft.Control = btnForeColor AnchorSideTop.Control = cbCursorColor AnchorSideBottom.Control = cbCursorColor AnchorSideBottom.Side = asrBottom Left = 366 Height = 22 Top = 128 Width = 28 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Right = 10 BorderSpacing.InnerBorder = 4 Caption = '>>' OnClick = btnCursorColorClick TabOrder = 9 end object btnCursorText: TButton[16] AnchorSideLeft.Control = btnForeColor AnchorSideTop.Control = cbCursorText AnchorSideBottom.Control = cbCursorText AnchorSideBottom.Side = asrBottom Left = 366 Height = 22 Top = 158 Width = 28 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Right = 10 BorderSpacing.InnerBorder = 4 Caption = '>>' OnClick = btnCursorTextClick TabOrder = 11 end object btnBackColor2: TButton[17] AnchorSideLeft.Control = btnForeColor AnchorSideTop.Control = cbBackColor2 AnchorSideBottom.Control = cbBackColor2 AnchorSideBottom.Side = asrBottom Left = 366 Height = 22 Top = 68 Width = 28 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Right = 10 BorderSpacing.InnerBorder = 4 Caption = '>>' OnClick = btnBackColor2Click TabOrder = 5 end object gbExample: TGroupBox[18] AnchorSideLeft.Control = btnForeColor AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = btnForeColor AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 404 Height = 135 Top = 8 Width = 234 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Left = 10 BorderSpacing.Right = 6 Caption = 'Example' ClientHeight = 117 ClientWidth = 230 TabOrder = 20 object pbExample: TPaintBox Left = 6 Height = 105 Top = 6 Width = 218 Align = alClient BorderSpacing.Around = 6 OnPaint = pbExamplePaint end end object cbbUseInvertedSelection: TCheckBox[19] AnchorSideTop.Control = dbOptions AnchorSideTop.Side = asrBottom Left = 6 Height = 17 Top = 211 Width = 127 BorderSpacing.Top = 6 Caption = 'U&se Inverted Selection' OnChange = cbColorBoxChange TabOrder = 12 end object tbInactivePanelBrightness: TTrackBar[20] AnchorSideLeft.Control = lblInactivePanelBrightness AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblInactivePanelBrightness AnchorSideTop.Side = asrCenter Left = 171 Height = 27 Top = 248 Width = 200 Max = 100 PageSize = 10 Position = 0 ScalePos = trRight TickStyle = tsNone BorderSpacing.Left = 8 BorderSpacing.Top = 6 TabOrder = 14 end object lblInactivePanelBrightness: TLabel[21] AnchorSideLeft.Control = cbbUseFrameCursor AnchorSideTop.Control = cbbUseFrameCursor AnchorSideTop.Side = asrBottom Left = 6 Height = 13 Top = 255 Width = 157 BorderSpacing.Top = 5 Caption = '&Brightness level of inactive panel' FocusControl = tbInactivePanelBrightness ParentColor = False end object cbbUseFrameCursor: TCheckBox[22] AnchorSideLeft.Control = cbbUseInvertedSelection AnchorSideTop.Control = cbbUseInvertedSelection AnchorSideTop.Side = asrBottom Left = 6 Height = 17 Top = 233 Width = 104 BorderSpacing.Top = 5 Caption = 'Use &Frame Cursor' OnChange = cbColorBoxChange TabOrder = 13 end object lblIndColor: TLabel[23] AnchorSideLeft.Control = cbbUseGradientInd AnchorSideTop.Control = cbIndColor AnchorSideTop.Side = asrCenter AnchorSideRight.Side = asrCenter Left = 6 Height = 13 Top = 329 Width = 100 Caption = '&Indicator Fore Color:' FocusControl = cbIndColor ParentColor = False end object lblIndBackColor: TLabel[24] AnchorSideLeft.Control = lblIndColor AnchorSideTop.Control = cbIndBackColor AnchorSideTop.Side = asrCenter Left = 6 Height = 13 Top = 358 Width = 100 Caption = 'In&dicator Back Color:' FocusControl = cbIndBackColor ParentColor = False end object cbIndColor: TColorBox[25] AnchorSideLeft.Control = cbCursorText AnchorSideTop.Control = cbbUseGradientInd AnchorSideTop.Side = asrBottom AnchorSideRight.Control = cbCursorText AnchorSideRight.Side = asrBottom Left = 160 Height = 22 Top = 324 Width = 200 Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbPrettyNames] Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 5 ItemHeight = 16 TabOrder = 16 end object cbIndBackColor: TColorBox[26] AnchorSideLeft.Control = cbIndColor AnchorSideTop.Control = cbIndColor AnchorSideTop.Side = asrBottom AnchorSideRight.Control = cbIndColor AnchorSideRight.Side = asrBottom Left = 160 Height = 22 Top = 353 Width = 200 Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbPrettyNames] Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 7 ItemHeight = 16 TabOrder = 18 end object btnIndColor: TButton[27] AnchorSideLeft.Control = btnCursorText AnchorSideTop.Control = cbIndColor AnchorSideRight.Control = btnCursorText AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = cbIndColor AnchorSideBottom.Side = asrBottom Left = 366 Height = 22 Top = 324 Width = 28 Anchors = [akTop, akLeft, akRight, akBottom] Caption = '>>' OnClick = btnIndColorClick TabOrder = 17 end object btnIndBackColor: TButton[28] AnchorSideLeft.Control = btnIndColor AnchorSideTop.Control = cbIndBackColor AnchorSideRight.Control = btnIndColor AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = cbIndBackColor AnchorSideBottom.Side = asrBottom Left = 366 Height = 22 Top = 353 Width = 28 Anchors = [akTop, akLeft, akRight, akBottom] Caption = '>>' OnClick = btnIndBackColorClick TabOrder = 19 end object cbbUseGradientInd: TCheckBox[29] AnchorSideLeft.Control = lblInactivePanelBrightness AnchorSideTop.Control = dbFreeSpaceIndicator AnchorSideTop.Side = asrBottom Left = 6 Height = 17 Top = 302 Width = 126 BorderSpacing.Top = 6 Caption = 'Use &Gradient Indicator' OnChange = cbbUseGradientIndChange TabOrder = 15 end object dbFreeSpaceIndicator: TDividerBevel[30] AnchorSideLeft.Control = lblInactivePanelBrightness AnchorSideTop.Control = tbInactivePanelBrightness AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnIndColor AnchorSideRight.Side = asrBottom Left = 6 Height = 17 Top = 279 Width = 388 Caption = 'Drive Free Space Indicator' Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 4 end object dbOptions: TDividerBevel[31] AnchorSideLeft.Control = lblCursorText AnchorSideTop.Control = cbCursorText AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnCursorText AnchorSideRight.Side = asrBottom Left = 6 Height = 17 Top = 188 Width = 388 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 8 end object optColorDialog: TColorDialog[32] Color = clBlack CustomColors.Strings = ( 'ColorA=000000' 'ColorB=000080' 'ColorC=008000' 'ColorD=008080' 'ColorE=800000' 'ColorF=800080' 'ColorG=808000' 'ColorH=808080' 'ColorI=C0C0C0' 'ColorJ=0000FF' 'ColorK=00FF00' 'ColorL=00FFFF' 'ColorM=FF0000' 'ColorN=FF00FF' 'ColorO=FFFF00' 'ColorP=FFFFFF' 'ColorQ=C0DCC0' 'ColorR=F0CAA6' 'ColorS=F0FBFF' 'ColorT=A4A0A0' ) left = 512 top = 192 end end doublecmd-0.5.8/src/frames/fquicksearch.lrt0000644000175000017500000000126711740433676017766 0ustar alexxalexxTFRMQUICKSEARCH.EDTSEARCH.HINT=Enter text to search for or filter by TFRMQUICKSEARCH.TGLFILTER.HINT=Toggle between search or filter TFRMQUICKSEARCH.TGLFILTER.CAPTION=Filter TFRMQUICKSEARCH.BTNCANCEL.HINT=Close filter panel TFRMQUICKSEARCH.BTNCANCEL.CAPTION=X TFRMQUICKSEARCH.SBMATCHBEGINNING.HINT=Match Beginning TFRMQUICKSEARCH.SBMATCHBEGINNING.CAPTION={ TFRMQUICKSEARCH.SBMATCHENDING.HINT=Match Ending TFRMQUICKSEARCH.SBMATCHENDING.CAPTION=} TFRMQUICKSEARCH.SBCASESENSITIVE.HINT=Case Sensitive TFRMQUICKSEARCH.SBCASESENSITIVE.CAPTION=Aa TFRMQUICKSEARCH.SBFILES.HINT=Files TFRMQUICKSEARCH.SBFILES.CAPTION=F TFRMQUICKSEARCH.SBDIRECTORIES.HINT=Directories TFRMQUICKSEARCH.SBDIRECTORIES.CAPTION=D doublecmd-0.5.8/src/frames/foptionsframe.lfm0000644000175000017500000000020211740433676020133 0ustar alexxalexxobject OptionsEditor: TOptionsEditor Left = 0 Height = 240 Top = 0 Width = 320 LCLVersion = '0.9.31' TabOrder = 0 end doublecmd-0.5.8/src/frames/foptionstabs.pas0000644000175000017500000001147011740427612020001 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Tabs options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsTabs; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, ComCtrls, fOptionsFrame; type { TfrmOptionsTabs } TfrmOptionsTabs = class(TOptionsEditor) cbTabsActivateOnClick: TCheckBox; cbTabsAlwaysVisible: TCheckBox; cbTabsConfirmCloseAll: TCheckBox; cbTabsLimitOption: TCheckBox; cbTabsLockedAsterisk: TCheckBox; cbTabsMultiLines: TCheckBox; cbTabsOpenForeground: TCheckBox; cbTabsOpenNearCurrent: TCheckBox; cbTabsShowCloseButton: TCheckBox; cmbTabsPosition: TComboBox; edtTabsLimitLength: TEdit; gbTabs: TGroupBox; lblChar: TLabel; lblTabsPosition: TLabel; private FPageControl: TPageControl; // For checking Tabs capabilities protected procedure Init; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses ExtCtrls {Lazarus < 31552}, DCStrUtils, uLng, uGlobs; { TfrmOptionsTabs } procedure TfrmOptionsTabs.Init; begin ParseLineToList(rsOptTabsPosition, cmbTabsPosition.Items); FPageControl := TPageControl.Create(Self); end; class function TfrmOptionsTabs.GetIconIndex: Integer; begin Result := 9; end; class function TfrmOptionsTabs.GetTitle: String; begin Result := rsOptionsEditorFolderTabs; end; procedure TfrmOptionsTabs.Load; begin cbTabsAlwaysVisible.Checked := (tb_always_visible in gDirTabOptions) and gDirectoryTabs; cbTabsLimitOption.Checked := tb_text_length_limit in gDirTabOptions; cbTabsConfirmCloseAll.Checked:= tb_confirm_close_all in gDirTabOptions; cbTabsOpenForeground.Checked:= tb_open_new_in_foreground in gDirTabOptions; cbTabsOpenNearCurrent.Checked:= tb_open_new_near_current in gDirTabOptions; cbTabsLockedAsterisk.Checked:= tb_show_asterisk_for_locked in gDirTabOptions; cbTabsActivateOnClick.Checked:= tb_activate_panel_on_click in gDirTabOptions; cbTabsMultiLines.Visible:= (nbcMultiline in FPageControl.GetCapabilities); if cbTabsMultiLines.Visible then cbTabsMultiLines.Checked:= tb_multiple_lines in gDirTabOptions; cbTabsShowCloseButton.Visible:= (nbcShowCloseButtons in FPageControl.GetCapabilities); if cbTabsShowCloseButton.Visible then cbTabsShowCloseButton.Checked:= tb_show_close_button in gDirTabOptions; edtTabsLimitLength.Text:= IntToStr(gDirTabLimit); case gDirTabPosition of tbpos_top: cmbTabsPosition.ItemIndex := 0; tbpos_bottom: cmbTabsPosition.ItemIndex := 1; else cmbTabsPosition.ItemIndex := 0; end; end; function TfrmOptionsTabs.Save: TOptionsEditorSaveFlags; begin Result := []; gDirTabOptions := []; // Reset tab options if cbTabsAlwaysVisible.Checked then gDirTabOptions := gDirTabOptions + [tb_always_visible]; if cbTabsMultiLines.Checked then gDirTabOptions := gDirTabOptions + [tb_multiple_lines]; if cbTabsLimitOption.Checked then gDirTabOptions := gDirTabOptions + [tb_text_length_limit]; if cbTabsConfirmCloseAll.Checked then gDirTabOptions := gDirTabOptions + [tb_confirm_close_all]; if cbTabsOpenForeground.Checked then gDirTabOptions := gDirTabOptions + [tb_open_new_in_foreground]; if cbTabsOpenNearCurrent.Checked then gDirTabOptions := gDirTabOptions + [tb_open_new_near_current]; if cbTabsLockedAsterisk.Checked then gDirTabOptions := gDirTabOptions + [tb_show_asterisk_for_locked]; if cbTabsActivateOnClick.Checked then gDirTabOptions := gDirTabOptions + [tb_activate_panel_on_click]; if cbTabsShowCloseButton.Checked then gDirTabOptions := gDirTabOptions + [tb_show_close_button]; gDirTabLimit := StrToIntDef(edtTabsLimitLength.Text, 32); case cmbTabsPosition.ItemIndex of 0: gDirTabPosition := tbpos_top; 1: gDirTabPosition := tbpos_bottom; end; end; end. doublecmd-0.5.8/src/frames/foptionsautorefresh.pas0000644000175000017500000000647211740433676021414 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Auto-refresh options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsAutoRefresh; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, fOptionsFrame; type { TfrmOptionsAutoRefresh } TfrmOptionsAutoRefresh = class(TOptionsEditor) cbWatchAttributesChange: TCheckBox; cbWatchExcludeDirs: TCheckBox; cbWatchFileNameChange: TCheckBox; cbWatchOnlyForeground: TCheckBox; edtWatchExcludeDirs: TEdit; gbAutoRefreshDisable: TGroupBox; gbAutoRefreshEnable: TGroupBox; procedure cbWatchExcludeDirsChange(Sender: TObject); procedure OnAutoRefreshOptionChanged(Sender: TObject); protected procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses uGlobs, uLng; { TfrmOptionsAutoRefresh } procedure TfrmOptionsAutoRefresh.cbWatchExcludeDirsChange(Sender: TObject); begin edtWatchExcludeDirs.Enabled := cbWatchExcludeDirs.Checked; end; procedure TfrmOptionsAutoRefresh.OnAutoRefreshOptionChanged(Sender: TObject); begin gbAutoRefreshDisable.Enabled := cbWatchFileNameChange.Checked or cbWatchAttributesChange.Checked; end; class function TfrmOptionsAutoRefresh.GetIconIndex: Integer; begin Result := 15; end; class function TfrmOptionsAutoRefresh.GetTitle: String; begin Result := rsOptionsEditorAutoRefresh; end; procedure TfrmOptionsAutoRefresh.Load; begin cbWatchFileNameChange.Checked := (watch_file_name_change in gWatchDirs); cbWatchAttributesChange.Checked := (watch_attributes_change in gWatchDirs); cbWatchOnlyForeground.Checked := (watch_only_foreground in gWatchDirs); cbWatchExcludeDirs.Checked := (watch_exclude_dirs in gWatchDirs); edtWatchExcludeDirs.Text := gWatchDirsExclude; OnAutoRefreshOptionChanged(nil); cbWatchExcludeDirsChange(nil); end; function TfrmOptionsAutoRefresh.Save: TOptionsEditorSaveFlags; begin Result := []; gWatchDirs := []; // Reset watch options if cbWatchFileNameChange.Checked then Include(gWatchDirs, watch_file_name_change); if cbWatchAttributesChange.Checked then Include(gWatchDirs, watch_attributes_change); if cbWatchOnlyForeground.Checked then Include(gWatchDirs, watch_only_foreground); if cbWatchExcludeDirs.Checked then Include(gWatchDirs, watch_exclude_dirs); gWatchDirsExclude:= edtWatchExcludeDirs.Text; end; end. doublecmd-0.5.8/src/frames/foptionsmouse.lrt0000644000175000017500000000062412020403374020204 0ustar alexxalexxTFRMOPTIONSMOUSE.GBSELECTION.CAPTION=Selection TFRMOPTIONSMOUSE.CBSELECTIONBYMOUSE.CAPTION=&Selection by mouse TFRMOPTIONSMOUSE.LBLMOUSEMODE.CAPTION=&Mode: TFRMOPTIONSMOUSE.GBSCROLLING.CAPTION=Scrolling TFRMOPTIONSMOUSE.RBSCROLLLINEBYLINECURSOR.CAPTION=Line by line &with cursor movement TFRMOPTIONSMOUSE.RBSCROLLLINEBYLINE.CAPTION=&Line by line TFRMOPTIONSMOUSE.RBSCROLLPAGEBYPAGE.CAPTION=&Page by page doublecmd-0.5.8/src/frames/foptionshotkeys.pas0000644000175000017500000007257312014201074020534 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Hotkeys options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsHotkeys; {$mode objfpc}{$H+} interface uses Classes, SysUtils, ExtCtrls, StdCtrls, Grids, fOptionsFrame, fOptionsHotkeysEditHotkey, uHotkeyManager, DCBasicTypes; type { TfrmOptionsHotkeys } TfrmOptionsHotkeys = class(TOptionsEditor) btnDeleteHotKey: TButton; btnAddHotKey: TButton; btnEditHotkey: TButton; edtFilter: TEdit; lblCommands: TLabel; lbFilter: TLabel; lblSCFiles: TLabel; lbSCFilesList: TListBox; lblCategories: TLabel; lbxCategories: TListBox; pnlHotkeyButtons: TPanel; stgCommands: TStringGrid; stgHotkeys: TStringGrid; procedure btnAddHotKeyClick(Sender: TObject); procedure btnDeleteHotKeyClick(Sender: TObject); procedure btnEditHotkeyClick(Sender: TObject); procedure edtFilterChange(Sender: TObject); procedure lbSCFilesListSelectionChange(Sender: TObject; User: boolean); procedure lbxCategoriesSelectionChange(Sender: TObject; User: boolean); procedure stgCommandsResize(Sender: TObject); procedure stgCommandsSelectCell(Sender: TObject; aCol, aRow: Integer; var CanSelect: Boolean); procedure stgHotkeysDblClick(Sender: TObject); procedure stgHotkeysResize(Sender: TObject); procedure stgHotkeysSelectCell(Sender: TObject; aCol, aRow: Integer; var CanSelect: Boolean); private FEditForm: TfrmEditHotkey; FHotkeysAutoColWidths: array of Integer; FHotkeysAutoGridWidth: Integer; FHotkeysCategories: TStringList; // Untranslated FUpdatingShortcutsFiles: Boolean; procedure AutoSizeCommandsGrid; procedure AutoSizeHotkeysGrid; procedure ClearHotkeysGrid; procedure DeleteHotkeyFromGrid(aHotkey: String); function GetSelectedCommand: String; {en Refreshes all hotkeys from the Commands grid } procedure UpdateHotkeys(HMForm: THMForm); procedure UpdateHotkeysForCommand(HMForm: THMForm; RowNr: Integer); procedure FillSCFilesList; {en Return hotkeys assigned for command for the form and its controls. } procedure GetHotKeyList(HMForm: THMForm; Command: String; HotkeysList: THotkeys); {en Fill hotkey grid with all hotkeys assigned to a command } procedure FillHotkeyList(sCommand: String); {en Fill Commands grid with all commands available for the selected category. @param(Filter If not empty string then shows only commands containing Filter string.) } procedure FillCommandList(Filter: String); procedure FillCategoriesList; {en Retrieves untranslated form name. } function GetSelectedForm: String; procedure SelectHotkey(Hotkey: THotkey); procedure ShowEditHotkeyForm(EditMode: Boolean; aHotkeyRow: Integer); procedure ShowEditHotkeyForm(EditMode: Boolean; const AForm: String; const ACommand: String; const AHotkey: THotkey; const AControls: TDynamicStringArray); protected procedure Init; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public constructor Create(TheOwner: TComponent); override; destructor Destroy; override; procedure AddDeleteWithShiftHotkey(UseTrash: Boolean); class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses Forms, Controls, Dialogs, LCLProc, LCLVersion, uFindEx, uGlobs, uGlobsPaths, uLng, uKeyboard, uFormCommands, DCStrUtils; const stgCmdCommandIndex = 0; stgCmdHotkeysIndex = 1; stgCmdDescriptionIndex = 2; type PHotkeyItem = ^THotkeyItem; THotkeyItem = record Hotkey: THotkey; Controls: TDynamicStringArray; end; procedure DestroyHotkeyItem(HotkeyItem: PHotkeyItem); begin if Assigned(HotkeyItem) then begin HotkeyItem^.Hotkey.Free; Dispose(HotkeyItem); end; end; // Converts hotkeys list to string. function HotkeysToString(const Hotkeys: THotkeys): String; var sCurrent: String; i: Integer; sList: TStringList; begin Result := ''; sList := TStringList.Create; try sList.CaseSensitive := True; for i := 0 to Hotkeys.Count - 1 do begin sCurrent := ShortcutsToText(Hotkeys[i].Shortcuts); if sList.IndexOf(sCurrent) < 0 then begin sList.Add(sCurrent); AddStrWithSep(Result, sCurrent, ';'); end; end; finally sList.Free; end; end; function CompareCategories(List: TStringList; Index1, Index2: Integer): Integer; begin {$IF LCL_FULLVERSION >= 093100} Result := UTF8CompareText(List.Strings[Index1], List.Strings[Index2]); {$ELSE} Result := WideCompareText(UTF8Decode(List.Strings[Index1]), UTF8Decode(List.Strings[Index2])); {$ENDIF} end; { TfrmOptionsHotkeys } procedure TfrmOptionsHotkeys.btnDeleteHotKeyClick(Sender: TObject); var i: Integer; sCommand: String; HMForm: THMForm; HMControl: THMControl; hotkey: THotkey; HotkeyItem: PHotkeyItem; begin if stgHotkeys.Row >= stgHotkeys.FixedRows then begin HotkeyItem := PHotkeyItem(stgHotkeys.Objects[0, stgHotkeys.Row]); sCommand := GetSelectedCommand; HMForm := HotMan.Forms.Find(GetSelectedForm); if Assigned(HMForm) then begin for i := 0 to HMForm.Controls.Count - 1 do begin HMControl := HMForm.Controls[i]; if Assigned(HMControl) then begin hotkey := HMControl.Hotkeys.FindByContents(HotkeyItem^.Hotkey); if Assigned(hotkey) then HMControl.Hotkeys.Remove(hotkey); end; end; hotkey := HMForm.Hotkeys.FindByContents(HotkeyItem^.Hotkey); if Assigned(hotkey) then HMForm.Hotkeys.Remove(hotkey); // refresh lists Self.UpdateHotkeys(HMForm); Self.FillHotkeyList(sCommand); end; end; end; procedure TfrmOptionsHotkeys.btnEditHotkeyClick(Sender: TObject); begin ShowEditHotkeyForm(True, stgHotkeys.Row); end; procedure TfrmOptionsHotkeys.edtFilterChange(Sender: TObject); {< filtering active commands list} begin if lbxCategories.ItemIndex=-1 then Exit; FillCommandList(edtFilter.Text); end; procedure TfrmOptionsHotkeys.lbSCFilesListSelectionChange(Sender: TObject; User: boolean); begin if not FUpdatingShortcutsFiles and (lbSCFilesList.ItemIndex >= 0) then begin HotMan.Load(gpCfgDir + lbSCFilesList.Items[lbSCFilesList.ItemIndex]); FillCategoriesList; end; end; procedure TfrmOptionsHotkeys.lbxCategoriesSelectionChange(Sender: TObject; User: boolean); begin if lbxCategories.ItemIndex=-1 then Exit; edtFilter.Clear; FillCommandList(''); end; procedure TfrmOptionsHotkeys.stgCommandsResize(Sender: TObject); begin AutoSizeCommandsGrid; end; procedure TfrmOptionsHotkeys.stgCommandsSelectCell(Sender: TObject; aCol, aRow: Integer; var CanSelect: Boolean); // < find hotkeys for command var sCommand: String; begin // clears all controls btnAddHotKey.Enabled := False; btnDeleteHotKey.Enabled := False; btnEditHotkey.Enabled := False; ClearHotkeysGrid; if aRow >= stgCommands.FixedRows then begin sCommand := stgCommands.Cells[stgCmdCommandIndex, aRow]; FillHotkeyList(sCommand); btnAddHotKey.Enabled := True; end; end; procedure TfrmOptionsHotkeys.stgHotkeysDblClick(Sender: TObject); begin ShowEditHotkeyForm(True, stgHotkeys.Row); end; procedure TfrmOptionsHotkeys.stgHotkeysResize(Sender: TObject); begin AutoSizeHotkeysGrid; end; procedure TfrmOptionsHotkeys.stgHotkeysSelectCell(Sender: TObject; aCol, aRow: Integer; var CanSelect: Boolean); var aEnabled: Boolean; begin aEnabled := aRow >= stgHotkeys.FixedRows; btnDeleteHotKey.Enabled := aEnabled; btnEditHotkey.Enabled := aEnabled; end; procedure TfrmOptionsHotkeys.AutoSizeCommandsGrid; begin with stgCommands do begin AutoSizeColumns; if ClientWidth > GridWidth then ColWidths[stgCmdDescriptionIndex] := ColWidths[stgCmdDescriptionIndex] + (ClientWidth - GridWidth); end; end; procedure TfrmOptionsHotkeys.AutoSizeHotkeysGrid; var Diff: Integer = 0; i: Integer; begin with stgHotkeys do begin if Length(FHotkeysAutoColWidths) = ColCount then begin if ClientWidth > FHotkeysAutoGridWidth then Diff := (ClientWidth - FHotkeysAutoGridWidth) div 3; for i := 0 to ColCount - 1 do ColWidths[i] := FHotkeysAutoColWidths[i] + Diff; end; end; end; procedure TfrmOptionsHotkeys.btnAddHotKeyClick(Sender: TObject); begin ShowEditHotkeyForm(False, GetSelectedForm, GetSelectedCommand, nil, nil); end; procedure TfrmOptionsHotkeys.DeleteHotkeyFromGrid(aHotkey: String); var i: Integer; begin for i := stgHotkeys.FixedRows to stgHotkeys.RowCount - 1 do if stgHotkeys.Cells[0, i] = aHotkey then begin DestroyHotkeyItem(PHotkeyItem(stgHotkeys.Objects[0, i])); stgHotkeys.DeleteColRow(False, i); Break; end; end; procedure TfrmOptionsHotkeys.UpdateHotkeys(HMForm: THMForm); var i: Integer; begin for i := Self.stgCommands.FixedRows to Self.stgCommands.RowCount - 1 do Self.UpdateHotkeysForCommand(HMForm, i); end; procedure TfrmOptionsHotkeys.UpdateHotkeysForCommand(HMForm: THMForm; RowNr: Integer); var Hotkeys: THotkeys; begin Hotkeys := THotkeys.Create(False); try GetHotKeyList(HMForm, stgCommands.Cells[stgCmdCommandIndex,RowNr], Hotkeys); stgCommands.Cells[stgCmdHotkeysIndex, RowNr] := HotkeysToString(Hotkeys); finally Hotkeys.Free; end; end; procedure TfrmOptionsHotkeys.FillSCFilesList; var SR : TSearchRecEx; Res : Integer; begin FUpdatingShortcutsFiles := True; lbSCFilesList.Items.Clear; Res := FindFirstEx(gpCfgDir + '*.scf', faAnyFile, SR); while Res = 0 do begin Res:= lbSCFilesList.Items.Add(Sr.Name); if Sr.Name = gNameSCFile then lbSCFilesList.Selected[Res] := True; Res := FindNextEx(SR); end; FindCloseEx(SR); FUpdatingShortcutsFiles := False; end; procedure TfrmOptionsHotkeys.GetHotKeyList(HMForm: THMForm; Command: String; HotkeysList: THotkeys); procedure AddHotkeys(hotkeys: THotkeys); var i: Integer; begin for i := 0 to hotkeys.Count - 1 do begin if hotkeys[i].Command = Command then HotkeysList.Add(hotkeys[i]); end; end; var i: Integer; begin AddHotkeys(HMForm.Hotkeys); for i := 0 to HMForm.Controls.Count - 1 do AddHotkeys(HMForm.Controls[i].Hotkeys); end; procedure TfrmOptionsHotkeys.ClearHotkeysGrid; var i: Integer; begin for i := stgHotkeys.FixedRows to stgHotkeys.RowCount - 1 do DestroyHotkeyItem(PHotkeyItem(stgHotkeys.Objects[0, i])); stgHotkeys.RowCount := stgHotkeys.FixedRows; end; procedure TfrmOptionsHotkeys.FillHotkeyList(sCommand: String); function SetObject(RowNr: Integer; AHotkey: THotkey): PHotkeyItem; var HotkeyItem: PHotkeyItem; begin New(HotkeyItem); stgHotkeys.Objects[0, RowNr] := TObject(HotkeyItem); HotkeyItem^.Hotkey := AHotkey.Clone; Result := HotkeyItem; end; var HMForm: THMForm; HMControl: THMControl; iHotKey, iControl, iGrid: Integer; hotkey: THotkey; found: Boolean; HotkeyItem: PHotkeyItem; begin ClearHotkeysGrid; if (sCommand = EmptyStr) or (lbxCategories.ItemIndex = -1) then Exit; HMForm := HotMan.Forms.Find(GetSelectedForm); if not Assigned(HMForm) then Exit; stgHotkeys.BeginUpdate; try // add hotkeys from form for iHotKey := 0 to HMForm.Hotkeys.Count - 1 do begin hotkey := HMForm.Hotkeys[iHotKey]; if hotkey.Command <> sCommand then continue; stgHotkeys.RowCount := stgHotkeys.RowCount + 1; stgHotkeys.Cells[0, stgHotkeys.RowCount - 1] := ShortcutsToText(hotkey.Shortcuts); stgHotkeys.Cells[1, stgHotkeys.RowCount - 1] := ArrayToString(hotkey.Params); SetObject(stgHotkeys.RowCount - 1, hotkey); end; // add hotkeys from controls for iControl := 0 to HMForm.Controls.Count - 1 do begin HMControl := HMForm.Controls[iControl]; for iHotKey := 0 to HMControl.Hotkeys.Count - 1 do begin hotkey := HMControl.Hotkeys[iHotKey]; if hotkey.Command <> sCommand then continue; // search for hotkey in grid and add control name to list found := false; for iGrid := stgHotkeys.FixedRows to stgHotkeys.RowCount - 1 do begin HotkeyItem := PHotkeyItem(stgHotkeys.Objects[0, iGrid]); if HotkeyItem^.Hotkey.SameShortcuts(hotkey.Shortcuts) and HotkeyItem^.Hotkey.SameParams(hotkey.Params) then begin stgHotkeys.Cells[2, iGrid] := stgHotkeys.Cells[2, iGrid] + HMControl.Name + ';'; HotkeyItem := PHotkeyItem(stgHotkeys.Objects[0, iGrid]); AddString(HotkeyItem^.Controls, HMControl.Name); found := true; break; end; { if } end; { for } // add new row for hotkey if not found then begin stgHotkeys.RowCount := stgHotkeys.RowCount + 1; stgHotkeys.Cells[0, stgHotkeys.RowCount - 1] := ShortcutsToText(hotkey.Shortcuts); stgHotkeys.Cells[1, stgHotkeys.RowCount - 1] := ArrayToString(hotkey.Params); stgHotkeys.Cells[2, stgHotkeys.RowCount - 1] := HMControl.Name + ';'; HotkeyItem := SetObject(stgHotkeys.RowCount - 1, hotkey); AddString(HotkeyItem^.Controls, HMControl.Name); end; { if } end; { for } end; { for } finally stgHotkeys.EndUpdate; end; stgHotkeys.AutoSizeColumns; SetLength(FHotkeysAutoColWidths, stgHotkeys.ColCount); for iHotKey := 0 to stgHotkeys.ColCount - 1 do FHotkeysAutoColWidths[iHotKey] := stgHotkeys.ColWidths[iHotKey]; FHotkeysAutoGridWidth := stgHotkeys.GridWidth; AutoSizeHotkeysGrid; end; procedure TfrmOptionsHotkeys.FillCommandList(Filter: String); //< fill stgCommands with commands and descriptions var slTmp: THotkeys; slAllCommands, slDescriptions, slHotKey: TStringList; slFiltered: TStringList = nil; lstr: String; i: Integer; HMForm: THMForm; sForm: String; CommandsFormClass: TComponentClass; CommandsForm: TComponent = nil; CommandsFormCreated: Boolean = False; CommandsIntf: IFormCommands; begin sForm := GetSelectedForm; CommandsFormClass := TFormCommands.GetCommandsForm(sForm); if not Assigned(CommandsFormClass) or not Supports(CommandsFormClass, IFormCommands) then begin stgCommands.Clean; Exit; end; // Find an instance of the form to retrieve action list (for descriptions). for i := 0 to Screen.CustomFormCount - 1 do if Screen.CustomForms[i].ClassType = CommandsFormClass then begin CommandsForm := Screen.CustomForms[i]; Break; end; // If not found create an instance temporarily. if not Assigned(CommandsForm) then begin CommandsForm := CommandsFormClass.Create(Application); CommandsFormCreated := True; end; CommandsIntf := CommandsForm as IFormCommands; slAllCommands := TStringList.Create; slDescriptions := TStringList.Create; slHotKey := TStringList.Create; slTmp := THotkeys.Create(False); HMForm := HotMan.Forms.Find(sForm); CommandsIntf.GetCommandsList(slAllCommands); if Filter <> '' then // if filter not empty begin slFiltered := TStringList.Create; lstr := UTF8LowerCase(Filter); for i := 0 to slAllCommands.Count - 1 do // for all command // if filtered text find in command or description then add to filteredlist if (UTF8Pos(lstr, UTF8LowerCase(slAllCommands.Strings[i])) <> 0) or (UTF8Pos(lstr, UTF8LowerCase(CommandsIntf.GetCommandCaption(slAllCommands.Strings[i], cctLong))) <> 0) then begin slFiltered.Add(slAllCommands[i]); end; end else // filter empty -> assign all commands to filtered list begin slFiltered := slAllCommands; slAllCommands := nil; end; // sort filtered items slFiltered.Sort; for i := 0 to slFiltered.Count - 1 do begin // for all filtered items do // get description for command and add to slDescriptions list slDescriptions.Add(CommandsIntf.GetCommandCaption(slFiltered.Strings[i], cctLong)); // getting list of assigned hot key if Assigned(HMForm) then begin slTmp.Clear; GetHotKeyList(HMForm, slFiltered.Strings[i], slTmp); slHotKey.Add(HotkeysToString(slTmp)); //add to hotkey list created string end else slHotKey.Add(''); end; // add to list NAMES of columns slFiltered.Insert(0, rsOptHotkeysCommand); slDescriptions.Insert(0, rsOptHotkeysDescription); slHotKey.Insert(0, rsOptHotkeysHotkeys); //set stringgrid rows count stgCommands.RowCount := slFiltered.Count; // copy to string grid created lists stgCommands.BeginUpdate; stgCommands.Clean; stgCommands.Cols[stgCmdCommandIndex].Assign(slFiltered); stgCommands.Cols[stgCmdHotkeysIndex].Assign(slHotKey); stgCommands.Cols[stgCmdDescriptionIndex].Assign(slDescriptions); stgCommands.EndUpdate; AutoSizeCommandsGrid; stgCommands.Row := 0; // needs for call select function for refresh hotkeylist slHotKey.Free; slAllCommands.Free; slDescriptions.Free; slFiltered.Free; slTmp.Free; if CommandsFormCreated then CommandsForm.Free; end; procedure TfrmOptionsHotkeys.FillCategoriesList; var i, MainIndex, Diff: Integer; Translated: TStringList; begin Translated := TStringList.Create; try TFormCommands.GetCategoriesList(FHotkeysCategories, Translated); if FHotkeysCategories.Count > 0 then begin // Remove Main category so that it can be put to the top after sorting the rest. MainIndex := FHotkeysCategories.IndexOf('Main'); if (MainIndex >= 0) and (Translated[MainIndex] = rsHotkeyCategoryMain) then begin FHotkeysCategories.Delete(MainIndex); Translated.Delete(MainIndex); Diff := 1; // Account for Main category being at the top. end else begin MainIndex := -1; Diff := 0; end; // Assign indexes to FHotkeysCategories (untranslated). for i := 0 to Translated.Count - 1 do Translated.Objects[i] := TObject(i + Diff); Translated.CustomSort(@CompareCategories); if MainIndex >= 0 then begin FHotkeysCategories.InsertObject(0, 'Main', TObject(0)); Translated.InsertObject(0, rsHotkeyCategoryMain, TObject(0)); end; lbxCategories.Items.Assign(Translated); lbxCategories.ItemIndex := 0; end else lbxCategories.Items.Clear; finally Translated.Free; end; end; function TfrmOptionsHotkeys.GetSelectedForm: String; var Index: Integer; begin Index := lbxCategories.ItemIndex; if (Index >= 0) and (Index < FHotkeysCategories.Count) then Result := FHotkeysCategories[PtrUInt(lbxCategories.Items.Objects[Index])] else Result := EmptyStr; end; class function TfrmOptionsHotkeys.GetIconIndex: Integer; begin Result := 5; end; function TfrmOptionsHotkeys.GetSelectedCommand: String; begin if stgCommands.Row >= stgCommands.FixedRows then Result := stgCommands.Cells[stgCmdCommandIndex, stgCommands.Row] else Result := EmptyStr; end; class function TfrmOptionsHotkeys.GetTitle: String; begin Result := rsOptionsEditorHotKeys; end; procedure TfrmOptionsHotkeys.Init; begin stgCommands.FocusRectVisible := False; stgHotkeys.FocusRectVisible := False; // Localize Hotkeys. // stgCommands is localized in FillCommandList. stgHotkeys.Columns.Items[0].Title.Caption := rsOptHotkeysHotkey; stgHotkeys.Columns.Items[1].Title.Caption := rsOptHotkeysParameters; end; procedure TfrmOptionsHotkeys.Load; begin FillSCFilesList; FillCategoriesList; end; function TfrmOptionsHotkeys.Save: TOptionsEditorSaveFlags; begin Result := []; // Save hotkeys file name. if lbSCFilesList.ItemIndex >= 0 then gNameSCFile := lbSCFilesList.Items[lbSCFilesList.ItemIndex]; end; procedure TfrmOptionsHotkeys.SelectHotkey(Hotkey: THotkey); var HotkeyItem: PHotkeyItem; i: Integer; begin for i := stgHotkeys.FixedRows to stgHotkeys.RowCount - 1 do begin HotkeyItem := PHotkeyItem(stgHotkeys.Objects[0, i]); if Assigned(HotkeyItem) and HotkeyItem^.Hotkey.SameAs(Hotkey) then begin stgHotkeys.Row := i; Break; end; end; end; procedure TfrmOptionsHotkeys.ShowEditHotkeyForm(EditMode: Boolean; aHotkeyRow: Integer); var HotkeyItem: PHotkeyItem; begin HotkeyItem := PHotkeyItem(stgHotkeys.Objects[0, aHotkeyRow]); if Assigned(HotkeyItem) then ShowEditHotkeyForm(EditMode, GetSelectedForm, HotkeyItem^.Hotkey.Command, HotkeyItem^.Hotkey, HotkeyItem^.Controls); end; procedure TfrmOptionsHotkeys.ShowEditHotkeyForm( EditMode: Boolean; const AForm: String; const ACommand: String; const AHotkey: THotkey; const AControls: TDynamicStringArray); var HMForm: THMForm; Hotkey: THotkey = nil; begin if AForm <> EmptyStr then begin if not Assigned(FEditForm) then FEditForm := TfrmEditHotkey.Create(Self); if FEditForm.Execute(EditMode, AForm, ACommand, AHotkey, AControls) then begin HMForm := HotMan.Forms.FindOrCreate(AForm); // refresh hotkey lists Self.UpdateHotkeys(HMForm); Self.FillHotkeyList(ACommand); Hotkey := FEditForm.CloneNewHotkey; try // Select the new shortcut in the hotkeys table. SelectHotkey(Hotkey); finally Hotkey.Free; end; end; end; end; constructor TfrmOptionsHotkeys.Create(TheOwner: TComponent); begin inherited Create(TheOwner); FHotkeysCategories := TStringList.Create; end; destructor TfrmOptionsHotkeys.Destroy; begin inherited Destroy; FHotkeysCategories.Free; end; procedure TfrmOptionsHotkeys.AddDeleteWithShiftHotkey(UseTrash: Boolean); procedure ReverseShift(Hotkey: THotkey; out Shortcut: TShortCut; out TextShortcut: String); var ShiftState: TShiftState; begin Shortcut := TextToShortCutEx(Hotkey.Shortcuts[0]); ShiftState := ShortcutToShiftEx(Shortcut); if ssShift in ShiftState then ShiftState := ShiftState - [ssShift] else ShiftState := ShiftState + [ssShift]; ShortCut := KeyToShortCutEx(Shortcut, ShiftState); TextShortcut := ShortCutToTextEx(Shortcut); end; function ConfirmFix(Hotkey: THotkey; const Msg: String): Boolean; begin Result := QuestionDlg(rsOptHotkeysCannotSetShortcut, Msg, mtConfirmation, [mrYes, rsOptHotkeysFixParameter, 'isdefault', mrCancel], 0) = mrYes; end; function FixOverrides(Hotkey: THotkey; const OldTrashParam: String; NewTrashParam: Boolean; ShouldUseTrash: Boolean): Boolean; begin if Contains(Hotkey.Params, OldTrashParam) or NewTrashParam then begin Result := ConfirmFix(Hotkey, Format(rsOptHotkeysDeleteTrashCanOverrides, [Hotkey.Shortcuts[0]])); if Result then begin DeleteString(Hotkey.Params, OldTrashParam); if ShouldUseTrash then SetValue(Hotkey.Params, 'trashcan', 'setting') else SetValue(Hotkey.Params, 'trashcan', 'reversesetting'); end; end else Result := True; end; procedure FixReversedShortcut( Hotkey: THotkey; NonReversedHotkey: THotkey; const ParamsToDelete: array of String; const AllowedOldParam: String; const NewTrashParam: String; HasTrashCan: Boolean; TrashStr: String); var sDelete: String; begin if ContainsOneOf(Hotkey.Params, ParamsToDelete) or (HasTrashCan and (TrashStr <> NewTrashParam)) then if not ConfirmFix(Hotkey, Format(rsOptHotkeysDeleteTrashCanParameterExists, [Hotkey.Shortcuts[0], NonReversedHotkey.Shortcuts[0]])) then Exit; for sDelete in ParamsToDelete do DeleteString(Hotkey.Params, sDelete); if not Contains(Hotkey.Params, AllowedOldParam) then SetValue(Hotkey.Params, 'trashcan', NewTrashParam); end; procedure AddShiftShortcut(Hotkeys: THotkeys); var i, j: Integer; Shortcut: TShortCut; TextShortcut: String; NewParams: array of String; HasTrashCan, HasTrashBool, NormalTrashSetting: Boolean; TrashStr: String; TrashBoolValue: Boolean; CheckedShortcuts: TDynamicStringArray; ReversedHotkey: THotkey; CountBeforeAdded: Integer; SetShortcut: Boolean; begin SetLength(CheckedShortcuts, 0); CountBeforeAdded := Hotkeys.Count; for i := 0 to CountBeforeAdded - 1 do begin if (Hotkeys[i].Command = 'cm_Delete') and (Length(Hotkeys[i].Shortcuts) > 0) then begin if Length(Hotkeys[i].Shortcuts) > 1 then begin MessageDlg(rsOptHotkeysCannotSetShortcut, Format(rsOptHotkeysShortcutForDeleteIsSequence, [ShortcutsToText(Hotkeys[i].Shortcuts)]), mtWarning, [mbOK], 0); Continue; end; if not Contains(CheckedShortcuts, Hotkeys[i].Shortcuts[0]) then begin ReversedHotkey := nil; SetShortcut := True; ReverseShift(Hotkeys[i], Shortcut, TextShortcut); AddString(CheckedShortcuts, TextShortcut); // Check if shortcut with reversed shift already exists. for j := 0 to CountBeforeAdded - 1 do begin if ArrBegins(Hotkeys[j].Shortcuts, [TextShortcut], False) then begin if Hotkeys[j].Command <> Hotkeys[i].Command then begin if QuestionDlg(rsOptHotkeysCannotSetShortcut, Format(rsOptHotkeysShortcutForDeleteAlreadyAssigned, [Hotkeys[i].Shortcuts[0], TextShortcut, Hotkeys[j].Command]), mtConfirmation, [mrYes, rsOptHotkeysChangeShortcut, 'isdefault', mrCancel], 0) = mrYes then begin Hotkeys[j].Command := Hotkeys[i].Command; end else SetShortcut := False; end; ReversedHotkey := Hotkeys[j]; Break; end; end; if not SetShortcut then Continue; // Fix parameters of original hotkey if needed. HasTrashCan := GetParamValue(Hotkeys[i].Params, 'trashcan', TrashStr); HasTrashBool := HasTrashCan and GetBoolValue(TrashStr, TrashBoolValue); if not FixOverrides(Hotkeys[i], 'recycle', HasTrashBool and TrashBoolValue, UseTrash) then Continue; if not FixOverrides(Hotkeys[i], 'norecycle', HasTrashBool and not TrashBoolValue, not UseTrash) then Continue; // Reverse trash setting for reversed hotkey. NewParams := Copy(Hotkeys[i].Params); HasTrashCan := GetParamValue(NewParams, 'trashcan', TrashStr); // Could have been added above so check again if Contains(NewParams, 'recyclesettingrev') then begin DeleteString(NewParams, 'recyclesettingrev'); NormalTrashSetting := True; end else if Contains(NewParams, 'recyclesetting') then begin DeleteString(NewParams, 'recyclesetting'); NormalTrashSetting := False; end else if HasTrashCan and (TrashStr = 'reversesetting') then NormalTrashSetting := True else NormalTrashSetting := False; if Assigned(ReversedHotkey) then begin HasTrashCan := GetParamValue(ReversedHotkey.Params, 'trashcan', TrashStr); if NormalTrashSetting then begin FixReversedShortcut(ReversedHotkey, Hotkeys[i], ['recyclesettingrev', 'recycle', 'norecycle'], 'recyclesetting', 'setting', HasTrashCan, TrashStr); end else begin FixReversedShortcut(ReversedHotkey, Hotkeys[i], ['recyclesetting', 'recycle', 'norecycle'], 'recyclesettingrev', 'reversesetting', HasTrashCan, TrashStr); end; end else if QuestionDlg(rsOptHotkeysSetDeleteShortcut, Format(rsOptHotkeysAddDeleteShortcutLong, [TextShortcut]), mtConfirmation, [mrYes, rsOptHotkeysAddShortcutButton, 'isdefault', mrCancel], 0) = mrYes then begin if NormalTrashSetting then TrashStr := 'setting' else TrashStr := 'reversesetting'; SetValue(NewParams, 'trashcan', TrashStr); Hotkeys.Add([TextShortcut], NewParams, Hotkeys[i].Command); end; end; end; end; end; var HMForm: THMForm; I: Integer; begin HMForm := HotMan.Forms.Find('Main'); if Assigned(HMForm) then begin AddShiftShortcut(HMForm.Hotkeys); for I := 0 to HMForm.Controls.Count - 1 do AddShiftShortcut(HMForm.Controls[i].Hotkeys); // Refresh hotkeys list. if GetSelectedCommand = 'cm_Delete' then Self.FillHotkeyList('cm_Delete'); end; end; end. doublecmd-0.5.8/src/frames/foptionstabs.lfm0000644000175000017500000001241312020403374017761 0ustar alexxalexxinherited frmOptionsTabs: TfrmOptionsTabs Height = 369 Width = 673 ClientHeight = 369 ClientWidth = 673 DesignTop = 27 object gbTabs: TGroupBox[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 258 Top = 6 Width = 661 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Left = 6 BorderSpacing.Top = 6 BorderSpacing.Right = 6 BorderSpacing.Bottom = 6 Caption = 'Folder tabs headers' ChildSizing.TopBottomSpacing = 6 ClientHeight = 240 ClientWidth = 657 TabOrder = 0 object lblChar: TLabel AnchorSideLeft.Control = edtTabsLimitLength AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtTabsLimitLength AnchorSideTop.Side = asrCenter Left = 223 Height = 13 Top = 54 Width = 51 BorderSpacing.Left = 6 Caption = 'characters' ParentColor = False end object lblTabsPosition: TLabel AnchorSideLeft.Control = cbTabsActivateOnClick AnchorSideTop.Control = cmbTabsPosition AnchorSideTop.Side = asrCenter Left = 12 Height = 13 Top = 217 Width = 63 BorderSpacing.Top = 14 Caption = 'Ta&bs position' FocusControl = cmbTabsPosition ParentColor = False end object cbTabsAlwaysVisible: TCheckBox AnchorSideLeft.Control = gbTabs AnchorSideTop.Control = gbTabs Left = 12 Height = 17 Top = 6 Width = 253 BorderSpacing.Left = 12 BorderSpacing.Top = 6 Caption = '&Show tab header also when there is only one tab' TabOrder = 0 end object cbTabsMultiLines: TCheckBox AnchorSideLeft.Control = cbTabsAlwaysVisible AnchorSideTop.Control = cbTabsAlwaysVisible AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 29 Width = 119 BorderSpacing.Top = 6 Caption = '&Tabs on multiple lines' TabOrder = 1 end object cbTabsLimitOption: TCheckBox AnchorSideLeft.Control = cbTabsMultiLines AnchorSideTop.Control = cbTabsMultiLines AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 52 Width = 125 BorderSpacing.Top = 6 Caption = '&Limit tab title length to' TabOrder = 2 end object edtTabsLimitLength: TEdit AnchorSideLeft.Control = cbTabsLimitOption AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cbTabsLimitOption AnchorSideTop.Side = asrCenter Left = 137 Height = 21 Top = 50 Width = 80 TabOrder = 3 end object cbTabsOpenForeground: TCheckBox AnchorSideLeft.Control = cbTabsConfirmCloseAll AnchorSideTop.Control = cbTabsConfirmCloseAll AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 98 Width = 198 BorderSpacing.Top = 6 Caption = 'Ctrl+&Up opens new tab in foreground' TabOrder = 5 end object cbTabsConfirmCloseAll: TCheckBox AnchorSideLeft.Control = cbTabsLimitOption AnchorSideTop.Control = cbTabsLimitOption AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 75 Width = 119 BorderSpacing.Top = 6 Caption = 'Con&firm close all tabs' TabOrder = 4 end object cbTabsLockedAsterisk: TCheckBox AnchorSideLeft.Control = cbTabsShowCloseButton AnchorSideTop.Control = cbTabsShowCloseButton AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 167 Width = 188 BorderSpacing.Top = 6 Caption = 'Show locked tabs &with an asterisk *' TabOrder = 8 end object cbTabsActivateOnClick: TCheckBox AnchorSideLeft.Control = cbTabsLockedAsterisk AnchorSideTop.Control = cbTabsLockedAsterisk AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 190 Width = 274 BorderSpacing.Top = 6 Caption = 'Activate target &panel when clicking on one of its Tabs' TabOrder = 9 end object cbTabsShowCloseButton: TCheckBox AnchorSideLeft.Control = cbTabsOpenNearCurrent AnchorSideTop.Control = cbTabsOpenNearCurrent AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 144 Width = 125 BorderSpacing.Top = 6 Caption = 'Show ta&b close button' TabOrder = 7 end object cmbTabsPosition: TComboBox AnchorSideLeft.Control = lblTabsPosition AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cbTabsActivateOnClick AnchorSideTop.Side = asrBottom Left = 81 Height = 21 Top = 213 Width = 100 BorderSpacing.Left = 6 BorderSpacing.Top = 6 BorderSpacing.Bottom = 6 ItemHeight = 13 Items.Strings = ( 'Top' 'Bottom' ) Style = csDropDownList TabOrder = 10 end object cbTabsOpenNearCurrent: TCheckBox AnchorSideLeft.Control = cbTabsOpenForeground AnchorSideTop.Control = cbTabsOpenForeground AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 121 Width = 173 BorderSpacing.Top = 6 Caption = 'Open &new tabs near current tab' TabOrder = 6 end end end doublecmd-0.5.8/src/frames/foptionsfiletypescolors.pas0000644000175000017500000002253012011106054022257 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- File types colors options page Copyright (C) 2006-2012 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsFileTypesColors; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Controls, StdCtrls, ColorBox, Dialogs, Buttons, fOptionsFrame; type { TfrmOptionsFileTypesColors } TfrmOptionsFileTypesColors = class(TOptionsEditor) optColorDialog: TColorDialog; btnAddCategory: TBitBtn; btnApplyCategory: TBitBtn; btnDeleteCategory: TBitBtn; btnCategoryColor: TButton; btnSearchTemplate: TBitBtn; cbCategoryColor: TColorBox; edtCategoryAttr: TEdit; edtCategoryMask: TEdit; edtCategoryName: TEdit; gbFileTypesColors: TGroupBox; lbCategories: TListBox; lblCategoryAttr: TLabel; lblCategoryColor: TLabel; lblCategoryMask: TLabel; lblCategoryName: TLabel; procedure lbCategoriesClick(Sender: TObject); procedure btnSearchTemplateClick(Sender: TObject); procedure btnAddCategoryClick(Sender: TObject); procedure btnApplyCategoryClick(Sender: TObject); procedure btnDeleteCategoryClick(Sender: TObject); procedure btnCategoryColorClick(Sender: TObject); procedure lbCategoriesDragDrop(Sender, Source: TObject; X, Y: Integer); procedure lbCategoriesDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure lbCategoriesDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); procedure Clear; protected procedure Init; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public destructor Destroy; override; class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses Graphics, uLng, uGlobs, uColorExt, fMaskInputDlg, uSearchTemplate, uDCUtils; { TfrmOptionsFileTypesColors } procedure TfrmOptionsFileTypesColors.lbCategoriesClick(Sender: TObject); var MaskItem : TMaskItem; bEnabled: Boolean; begin if (lbCategories.ItemIndex <> -1) then begin MaskItem := TMaskItem(lbCategories.Items.Objects[lbCategories.ItemIndex]); edtCategoryName.Text := MaskItem.sName; edtCategoryMask.Text := MaskItem.sExt; SetColorInColorBox(cbCategoryColor, MaskItem.cColor); bEnabled:= (MaskItem.sExt = '') or (MaskItem.sExt[1] <> '>'); edtCategoryMask.Enabled:= bEnabled; edtCategoryAttr.Enabled:= bEnabled; edtCategoryAttr.Text := MaskItem.sModeStr; end else begin edtCategoryName.Text := ''; edtCategoryMask.Text := ''; edtCategoryAttr.Text := ''; cbCategoryColor.ItemIndex := -1; end; end; procedure TfrmOptionsFileTypesColors.btnSearchTemplateClick(Sender: TObject); var sMask: UTF8String; bTemplate: Boolean; begin sMask:= edtCategoryMask.Text; if ShowMaskInputDlg(rsMarkPlus, rsMaskInput, glsMaskHistory, sMask) then begin bTemplate:= IsMaskSearchTemplate(sMask); edtCategoryMask.Text:= sMask; if bTemplate then edtCategoryAttr.Text:= EmptyStr; edtCategoryMask.Enabled:= not bTemplate; edtCategoryAttr.Enabled:= not bTemplate; end; end; procedure TfrmOptionsFileTypesColors.btnAddCategoryClick(Sender: TObject); var iIndex : Integer; MaskItem: TMaskItem; begin if lbCategories.Count = 0 then begin edtCategoryName.Enabled := True; edtCategoryMask.Enabled := True; edtCategoryAttr.Enabled := True; cbCategoryColor.Enabled := True; btnCategoryColor.Enabled := True; btnDeleteCategory.Enabled := True; btnApplyCategory.Enabled := True; end; MaskItem := TMaskItem.Create; try edtCategoryName.Text := 'New'; edtCategoryMask.Text := '*'; edtCategoryAttr.Text := ''; cbCategoryColor.ItemIndex := -1; MaskItem.sName:= edtCategoryName.Text; MaskItem.sExt:= edtCategoryMask.Text; MaskItem.sModeStr:= edtCategoryAttr.Text; MaskItem.cColor:= clBlack; iIndex := lbCategories.Items.AddObject(MaskItem.sName, MaskItem); except FreeAndNil(MaskItem); raise; end; lbCategories.ItemIndex:= iIndex; edtCategoryName.SetFocus; end; procedure TfrmOptionsFileTypesColors.btnApplyCategoryClick(Sender: TObject); var MaskItem : TMaskItem; begin if (lbCategories.ItemIndex <> -1) then begin lbCategories.Items[lbCategories.ItemIndex] := edtCategoryName.Text; if edtCategoryMask.Text = '' then edtCategoryMask.Text := '*'; // because we load colors from ini by mask MaskItem := TMaskItem(lbCategories.Items.Objects[lbCategories.ItemIndex]); MaskItem.sName := edtCategoryName.Text; MaskItem.cColor := cbCategoryColor.Selected; MaskItem.sExt := edtCategoryMask.Text; MaskItem.sModeStr := edtCategoryAttr.Text; end; end; procedure TfrmOptionsFileTypesColors.btnDeleteCategoryClick(Sender: TObject); begin if (lbCategories.ItemIndex <> -1) then begin lbCategories.Items.Objects[lbCategories.ItemIndex].Free; lbCategories.Items.Delete(lbCategories.ItemIndex); if lbCategories.Count > 0 then lbCategories.ItemIndex := 0; lbCategoriesClick(lbCategories); end; end; procedure TfrmOptionsFileTypesColors.btnCategoryColorClick(Sender: TObject); begin optColorDialog.Color:= cbCategoryColor.Selected; if optColorDialog.Execute then SetColorInColorBox(cbCategoryColor, optColorDialog.Color); end; procedure TfrmOptionsFileTypesColors.lbCategoriesDragDrop(Sender, Source: TObject; X, Y: Integer); var SrcIndex, DestIndex: Integer; begin SrcIndex := lbCategories.ItemIndex; if SrcIndex = -1 then Exit; DestIndex := lbCategories.GetIndexAtY(Y); if (DestIndex < 0) or (DestIndex >= lbCategories.Count) then DestIndex := lbCategories.Count - 1; lbCategories.Items.Move(SrcIndex, DestIndex); lbCategories.ItemIndex := DestIndex; end; procedure TfrmOptionsFileTypesColors.lbCategoriesDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := (Source = lbCategories) and (lbCategories.ItemIndex <> -1); end; procedure TfrmOptionsFileTypesColors.lbCategoriesDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); begin with (Control as TListBox) do begin if (not Selected[Index]) and Assigned(Items.Objects[Index]) then begin Canvas.Brush.Color:= gBackColor; Canvas.Font.Color:= TMaskItem(Items.Objects[Index]).cColor; end else begin Canvas.Brush.Color:= gCursorColor; Canvas.Font.Color:= gCursorText; end; Canvas.FillRect(ARect); Canvas.TextOut(ARect.Left+2,ARect.Top,Items[Index]); end; end; procedure TfrmOptionsFileTypesColors.Clear; var i: Integer; begin for i := lbCategories.Count - 1 downto 0 do lbCategories.Items.Objects[i].Free; lbCategories.Clear; end; procedure TfrmOptionsFileTypesColors.Init; begin lbCategories.Canvas.Font := lbCategories.Font; lbCategories.ItemHeight := lbCategories.Canvas.TextHeight('Wg'); end; class function TfrmOptionsFileTypesColors.GetIconIndex: Integer; begin Result := 21; end; class function TfrmOptionsFileTypesColors.GetTitle: String; begin Result := rsOptionsEditorFileTypes; end; procedure TfrmOptionsFileTypesColors.Load; var I : Integer; MaskItem: TMaskItem; begin Clear; lbCategories.Color:= gBackColor; { File lbtypes category color } for I := 0 to gColorExt.Count - 1 do begin MaskItem := TMaskItem.Create; try MaskItem.Assign(gColorExt[I]); lbCategories.Items.AddObject(MaskItem.sName, MaskItem); except FreeAndNil(MaskItem); raise; end; end; // for if lbCategories.Count > 0 then lbCategories.ItemIndex := 0 else begin edtCategoryName.Enabled := False; edtCategoryMask.Enabled := False; edtCategoryAttr.Enabled := False; cbCategoryColor.Enabled := False; btnCategoryColor.Enabled := False; btnDeleteCategory.Enabled := False; btnApplyCategory.Enabled := False; end; lbCategoriesClick(lbCategories); end; function TfrmOptionsFileTypesColors.Save: TOptionsEditorSaveFlags; var i: Integer; MaskItem: TMaskItem; begin Result := []; gColorExt.Clear; for I := 0 to lbCategories.Count - 1 do //write new categories if Assigned(lbCategories.Items.Objects[I]) then begin MaskItem := TMaskItem.Create; try MaskItem.Assign(TMaskItem(lbCategories.Items.Objects[I])); gColorExt.Add(MaskItem); except FreeAndNil(MaskItem); raise; end; end; end; destructor TfrmOptionsFileTypesColors.Destroy; begin Clear; inherited; end; end. doublecmd-0.5.8/src/frames/foptionsdriveslistbutton.lfm0000644000175000017500000000230112020403374022447 0ustar alexxalexxinherited frmOptionsDrivesListButton: TfrmOptionsDrivesListButton object gbDrivesList: TGroupBox[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 85 Top = 6 Width = 308 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = 'Drives list' ChildSizing.LeftRightSpacing = 10 ChildSizing.TopBottomSpacing = 4 ChildSizing.VerticalSpacing = 4 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 67 ClientWidth = 304 TabOrder = 0 object cbShowLabel: TCheckBox Left = 10 Height = 17 Top = 4 Width = 98 Caption = 'Show &label' TabOrder = 0 end object cbShowFileSystem: TCheckBox AnchorSideTop.Side = asrBottom Left = 10 Height = 17 Top = 25 Width = 98 Caption = 'Show &file system' TabOrder = 1 end object cbShowFreeSpace: TCheckBox Left = 10 Height = 17 Top = 46 Width = 98 Caption = 'Show fr&ee space' TabOrder = 2 end end end doublecmd-0.5.8/src/frames/foptionsfilepanelscolors.pas0000644000175000017500000002672011740433676022427 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- File panels colors options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsFilePanelsColors; {$mode objfpc}{$H+} interface uses Classes, SysUtils, ComCtrls, StdCtrls, ColorBox, ExtCtrls, Dialogs, DividerBevel, fOptionsFrame; type { TfrmOptionsFilePanelsColors } TfrmOptionsFilePanelsColors = class(TOptionsEditor) btnBackColor: TButton; btnBackColor2: TButton; btnCursorColor: TButton; btnCursorText: TButton; btnForeColor: TButton; btnMarkColor: TButton; btnIndColor: TButton; btnIndBackColor: TButton; cbBackColor: TColorBox; cbBackColor2: TColorBox; cbbUseFrameCursor: TCheckBox; cbbUseInvertedSelection: TCheckBox; cbCursorColor: TColorBox; cbCursorText: TColorBox; cbMarkColor: TColorBox; cbTextColor: TColorBox; cbIndColor: TColorBox; cbIndBackColor: TColorBox; cbbUseGradientInd: TCheckBox; dbFreeSpaceIndicator: TDividerBevel; dbOptions: TDividerBevel; gbExample: TGroupBox; lblIndBackColor: TLabel; lblIndColor: TLabel; lblBackgroundColor: TLabel; lblBackgroundColor2: TLabel; lblCursorColor: TLabel; lblCursorText: TLabel; lblInactivePanelBrightness: TLabel; lblMarkColor: TLabel; lblTextColor: TLabel; optColorDialog: TColorDialog; pbExample: TPaintBox; tbInactivePanelBrightness: TTrackBar; procedure btnBackColor2Click(Sender: TObject); procedure btnBackColorClick(Sender: TObject); procedure btnCursorColorClick(Sender: TObject); procedure btnCursorTextClick(Sender: TObject); procedure btnForeColorClick(Sender: TObject); procedure btnIndBackColorClick(Sender: TObject); procedure btnIndColorClick(Sender: TObject); procedure btnMarkColorClick(Sender: TObject); procedure cbbUseGradientIndChange(Sender: TObject); procedure cbColorBoxChange(Sender: TObject); procedure pbExamplePaint(Sender: TObject); protected procedure Init; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses Graphics, Types, uLng, uGlobs, uDCUtils; { TfrmOptionsFilePanelsColors } class function TfrmOptionsFilePanelsColors.GetIconIndex: Integer; begin Result := 20; end; class function TfrmOptionsFilePanelsColors.GetTitle: String; begin Result := rsOptionsEditorFilePanels; end; procedure TfrmOptionsFilePanelsColors.Load; begin SetColorInColorBox(cbTextColor, gForeColor); SetColorInColorBox(cbBackColor, gBackColor); SetColorInColorBox(cbBackColor2, gBackColor2); SetColorInColorBox(cbMarkColor, gMarkColor); SetColorInColorBox(cbCursorColor, gCursorColor); SetColorInColorBox(cbCursorText, gCursorText); SetColorInColorBox(cbIndColor, gIndForeColor); SetColorInColorBox(cbIndBackColor, gIndBackColor); cbbUseInvertedSelection.Checked:= gUseInvertedSelection; cbbUseFrameCursor.Checked:= gUseFrameCursor; cbbUseGradientInd.Checked := gIndUseGradient; tbInactivePanelBrightness.Position:= gInactivePanelBrightness; end; function TfrmOptionsFilePanelsColors.Save: TOptionsEditorSaveFlags; begin gForeColor := cbTextColor.Selected; gBackColor := cbBackColor.Selected; // background color gBackColor2 := cbBackColor2.Selected; gMarkColor := cbMarkColor.Selected; gCursorColor := cbCursorColor.Selected; gCursorText := cbCursorText.Selected; gIndForeColor := cbIndColor.Selected; gIndBackColor := cbIndBackColor.Selected; gUseInvertedSelection := cbbUseInvertedSelection.Checked; gInactivePanelBrightness := tbInactivePanelBrightness.Position; gUseFrameCursor := cbbUseFrameCursor.Checked; gIndUseGradient := cbbUseGradientInd.Checked; Result := []; end; procedure TfrmOptionsFilePanelsColors.btnBackColor2Click(Sender: TObject); begin optColorDialog.Color:= cbBackColor2.Selected; if optColorDialog.Execute then begin SetColorInColorBox(cbBackColor2, optColorDialog.Color); pbExample.Repaint; end; end; procedure TfrmOptionsFilePanelsColors.btnBackColorClick(Sender: TObject); begin optColorDialog.Color:= cbBackColor.Selected; if optColorDialog.Execute then begin SetColorInColorBox(cbBackColor, optColorDialog.Color); pbExample.Repaint; end; end; procedure TfrmOptionsFilePanelsColors.btnCursorColorClick(Sender: TObject); begin optColorDialog.Color:= cbCursorColor.Selected; if optColorDialog.Execute then begin SetColorInColorBox(cbCursorColor, optColorDialog.Color); pbExample.Repaint; end; end; procedure TfrmOptionsFilePanelsColors.btnCursorTextClick(Sender: TObject); begin optColorDialog.Color:= cbCursorText.Selected; if optColorDialog.Execute then begin SetColorInColorBox(cbCursorText, optColorDialog.Color); pbExample.Repaint; end; end; procedure TfrmOptionsFilePanelsColors.btnForeColorClick(Sender: TObject); begin optColorDialog.Color:= cbTextColor.Selected; if optColorDialog.Execute then begin SetColorInColorBox(cbTextColor, optColorDialog.Color); pbExample.Repaint; end; end; procedure TfrmOptionsFilePanelsColors.btnIndBackColorClick(Sender: TObject); begin optColorDialog.Color:= cbIndBackColor.Selected; if optColorDialog.Execute then begin SetColorInColorBox(cbIndBackColor, optColorDialog.Color); //pbExample.Repaint; end; end; procedure TfrmOptionsFilePanelsColors.btnIndColorClick(Sender: TObject); begin optColorDialog.Color:= cbIndColor.Selected; if optColorDialog.Execute then begin SetColorInColorBox(cbIndColor, optColorDialog.Color); //pbExample.Repaint; end; end; procedure TfrmOptionsFilePanelsColors.btnMarkColorClick(Sender: TObject); begin optColorDialog.Color:= cbMarkColor.Selected; if optColorDialog.Execute then begin SetColorInColorBox(cbMarkColor, optColorDialog.Color); pbExample.Repaint; end; end; procedure TfrmOptionsFilePanelsColors.cbbUseGradientIndChange(Sender: TObject); begin lblIndColor.Enabled := not(cbbUseGradientInd.Checked); lblIndBackColor.Enabled := not(cbbUseGradientInd.Checked); cbIndColor.Enabled := not(cbbUseGradientInd.Checked); cbIndBackColor.Enabled := not(cbbUseGradientInd.Checked); btnIndColor.Enabled := not(cbbUseGradientInd.Checked); btnIndBackColor.Enabled := not(cbbUseGradientInd.Checked); end; procedure TfrmOptionsFilePanelsColors.cbColorBoxChange(Sender: TObject); begin pbExample.Repaint; end; procedure TfrmOptionsFilePanelsColors.pbExamplePaint(Sender: TObject); var h, I : integer; sText : String; iTextTop, iTextLeft : Integer; Rect : TRect; begin h := pbExample.Height div 6; Rect.Left := 0; Rect.Top := 0; Rect.Right := pbExample.Width; Rect.Bottom := h; for I := 1 to 6 do with pbExample.Canvas do begin case I of 1: begin if cbbUseInvertedSelection.Checked then begin Brush.Color := cbMarkColor.Selected; Font.Color := cbTextColor.Selected; sText := rsOptExampleMark; end else begin Brush.Color := cbBackColor.Selected; Font.Color := cbMarkColor.Selected; sText := rsOptExampleMark; end; end; 2: begin if cbbUseInvertedSelection.Checked then begin Brush.Color := cbMarkColor.Selected; Font.Color := cbTextColor.Selected; sText := rsOptExampleMark; end else begin Brush.Color := cbBackColor2.Selected; Font.Color := cbMarkColor.Selected; sText := rsOptExampleMark; end; end; 3: begin Brush.Color := cbBackColor.Selected; Font.Color := cbTextColor.Selected; sText := rsOptExampleText; end; 4: begin Brush.Color := cbBackColor2.Selected; Font.Color := cbTextColor.Selected; sText := rsOptExampleText; end; 5: begin if cbbUseFrameCursor.Checked then begin Pen.Color := cbCursorColor.Selected; Brush.Color := cbBackColor.Selected; end else Brush.Color := cbCursorColor.Selected; Font.Color := cbCursorText.Selected; sText := rsOptExampleCursor; end; 6: begin if cbbUseInvertedSelection.Checked then begin if cbbUseFrameCursor.Checked then begin Pen.Color := cbCursorColor.Selected; Brush.Color := cbBackColor.Selected; Font.Color := cbMarkColor.Selected; end else begin Brush.Color := cbCursorColor.Selected; Font.Color :=InvertColor(cbCursorText.Selected); end; sText := rsOptExampleMarkCursor; end else begin if cbbUseFrameCursor.Checked then begin Pen.Color := cbCursorColor.Selected; Brush.Color := cbBackColor.Selected; Font.Color := cbMarkColor.Selected; end else begin Brush.Color := cbCursorColor.Selected; Font.Color := cbMarkColor.Selected; end; sText := rsOptExampleMarkCursor; end; end; end; // case with gFonts[dcfMain] do begin Font.Style := Style; Font.Size := Size; Font.Name := Name; end; iTextTop := Rect.Top + (h div 2) - (TextHeight(sText) div 2); iTextLeft := Rect.Left + (pbExample.Width div 2) - (TextWidth(sText) div 2); FillRect(Rect); if (cbbUseFrameCursor.Checked) and ((i=5) or (i=6)) then begin Pen.Color:=cbCursorColor.Selected; Line(Rect.Left, Rect.Top, Rect.Right, Rect.Top); Line(Rect.Left, Rect.Bottom - 1, Rect.Right, Rect.Bottom - 1); end; TextOut(iTextLeft, iTextTop, sText); Rect.Top := Rect.Bottom; Rect.Bottom := h * (I + 1); end; // for end; procedure TfrmOptionsFilePanelsColors.Init; procedure CalcMaxSize(var MaxSize: TSize; Text: String); var TextSize: TSize; begin TextSize := Canvas.TextExtent(Text); if TextSize.cx > MaxSize.cx then MaxSize.cx := TextSize.cx; if TextSize.cy > MaxSize.cy then MaxSize.cy := TextSize.cy; end; var TextSize: TSize = (cx: 0; cy: 0); begin with gFonts[dcfMain] do begin Canvas.Font.Style := Style; Canvas.Font.Size := Size; Canvas.Font.Name := Name; end; CalcMaxSize(TextSize, rsOptExampleMark); CalcMaxSize(TextSize, rsOptExampleText); CalcMaxSize(TextSize, rsOptExampleCursor); CalcMaxSize(TextSize, rsOptExampleMarkCursor); pbExample.Constraints.MinWidth := TextSize.cx + 20; pbExample.Constraints.MinHeight := (TextSize.cy + 4) * 6; end; end. doublecmd-0.5.8/src/frames/foptionsignorelist.pas0000644000175000017500000000647112034100460021216 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Ignore list options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsIgnoreList; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, EditBtn, fOptionsFrame; type { TfrmOptionsIgnoreList } TfrmOptionsIgnoreList = class(TOptionsEditor) btnAddSel: TButton; btnAddSelWithPath: TButton; chkIgnoreEnable: TCheckBox; fneSaveIn: TFileNameEdit; lblSaveIn: TLabel; memIgnoreList: TMemo; procedure btnAddSelClick(Sender: TObject); procedure btnAddSelWithPathClick(Sender: TObject); procedure chkIgnoreEnableChange(Sender: TObject); private procedure FillIgnoreList(bWithFullPath: Boolean); public class function GetIconIndex: Integer; override; class function GetTitle: String; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; end; implementation {$R *.lfm} uses uGlobs, uFile, uLng, fMain; { TfrmOptionsIgnoreList } procedure TfrmOptionsIgnoreList.btnAddSelClick(Sender: TObject); begin FillIgnoreList(False); end; procedure TfrmOptionsIgnoreList.btnAddSelWithPathClick(Sender: TObject); begin FillIgnoreList(True); end; procedure TfrmOptionsIgnoreList.chkIgnoreEnableChange(Sender: TObject); begin memIgnoreList.Enabled:= chkIgnoreEnable.Checked; fneSaveIn.Enabled:= chkIgnoreEnable.Checked; btnAddSelWithPath.Enabled:= chkIgnoreEnable.Checked; btnAddSel.Enabled:= chkIgnoreEnable.Checked; end; procedure TfrmOptionsIgnoreList.FillIgnoreList(bWithFullPath: Boolean); var I: Integer; SelectedFiles: TFiles; begin SelectedFiles := frmMain.ActiveFrame.CloneSelectedOrActiveFiles; try for I:= 0 to SelectedFiles.Count - 1 do if bWithFullPath then memIgnoreList.Lines.Add(SelectedFiles[I].FullPath) else memIgnoreList.Lines.Add(SelectedFiles[I].Name); finally FreeAndNil(SelectedFiles); end; end; class function TfrmOptionsIgnoreList.GetIconIndex: Integer; begin Result := 17; end; class function TfrmOptionsIgnoreList.GetTitle: String; begin Result := rsOptionsEditorIgnoreList; end; procedure TfrmOptionsIgnoreList.Load; begin chkIgnoreEnable.Checked:= gIgnoreListFileEnabled; fneSaveIn.FileName:= gIgnoreListFile; memIgnoreList.Lines.Assign(glsIgnoreList); chkIgnoreEnableChange(chkIgnoreEnable); end; function TfrmOptionsIgnoreList.Save: TOptionsEditorSaveFlags; begin Result := []; gIgnoreListFileEnabled:= chkIgnoreEnable.Checked; gIgnoreListFile:= fneSaveIn.FileName; glsIgnoreList.Assign(memIgnoreList.Lines); end; end. doublecmd-0.5.8/src/frames/foptionsfileoperations.pas0000644000175000017500000001334712014201074022063 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- File operations options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsFileOperations; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, Spin, ExtCtrls, fOptionsFrame; type { TfrmOptionsFileOperations } TfrmOptionsFileOperations = class(TOptionsEditor) bvlConfirmations: TBevel; cbDeleteToTrash: TCheckBox; cbDropReadOnlyFlag: TCheckBox; cbPartialNameSearch: TCheckBox; cbProcessComments: TCheckBox; cbRenameSelOnlyName: TCheckBox; cbShowCopyTabSelectPanel: TCheckBox; cbSkipFileOpError: TCheckBox; cbProgressKind: TComboBox; cbCopyConfirmation: TCheckBox; cbMoveConfirmation: TCheckBox; cbDeleteConfirmation: TCheckBox; cbDeleteToTrashConfirmation: TCheckBox; edtBufferSize: TEdit; gbUserInterface: TGroupBox; gbFileSearch: TGroupBox; gbExecutingOperations: TGroupBox; lblConfirmations: TLabel; lblBufferSize: TLabel; lblProgressKind: TLabel; lblWipePassNumber: TLabel; rbUseMmapInSearch: TRadioButton; rbUseStreamInSearch: TRadioButton; seWipePassNumber: TSpinEdit; procedure cbDeleteToTrashChange(Sender: TObject); private FLoading: Boolean; protected procedure Init; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public constructor Create(TheOwner: TComponent); override; class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses DCStrUtils, uGlobs, uLng, fOptionsHotkeys; { TfrmOptionsFileOperations } class function TfrmOptionsFileOperations.GetIconIndex: Integer; begin Result := 8; end; class function TfrmOptionsFileOperations.GetTitle: String; begin Result := rsOptionsEditorFileOperations; end; procedure TfrmOptionsFileOperations.Init; begin ParseLineToList(rsOptFileOperationsProgressKind, cbProgressKind.Items); end; procedure TfrmOptionsFileOperations.cbDeleteToTrashChange(Sender: TObject); var HotkeysEditor: TOptionsEditor; begin if not FLoading then begin HotkeysEditor := OptionsDialog.GetEditor(TfrmOptionsHotkeys); if Assigned(HotkeysEditor) then (HotkeysEditor as TfrmOptionsHotkeys).AddDeleteWithShiftHotkey(cbDeleteToTrash.Checked); end; end; procedure TfrmOptionsFileOperations.Load; begin FLoading := True; edtBufferSize.Text := IntToStr(gCopyBlockSize div 1024); cbSkipFileOpError.Checked := gSkipFileOpError; cbDropReadOnlyFlag.Checked := gDropReadOnlyFlag; rbUseMmapInSearch.Checked := gUseMmapInSearch; cbPartialNameSearch.Checked := gPartialNameSearch; seWipePassNumber.Value := gWipePassNumber; cbProcessComments.Checked := gProcessComments; cbShowCopyTabSelectPanel.Checked := gShowCopyTabSelectPanel; cbDeleteToTrash.Checked := gUseTrash; cbRenameSelOnlyName.Checked := gRenameSelOnlyName; case gFileOperationsProgressKind of fopkSeparateWindow: cbProgressKind.ItemIndex := 0; fopkSeparateWindowMinimized: cbProgressKind.ItemIndex := 1; fopkOperationsPanel: cbProgressKind.ItemIndex := 2; end; cbCopyConfirmation.Checked := focCopy in gFileOperationsConfirmations; cbMoveConfirmation.Checked := focMove in gFileOperationsConfirmations; cbDeleteConfirmation.Checked := focDelete in gFileOperationsConfirmations; cbDeleteToTrashConfirmation.Checked := focDeleteToTrash in gFileOperationsConfirmations; FLoading := False; end; function TfrmOptionsFileOperations.Save: TOptionsEditorSaveFlags; begin Result := []; gCopyBlockSize := StrToIntDef(edtBufferSize.Text, gCopyBlockSize) * 1024; gSkipFileOpError := cbSkipFileOpError.Checked; gDropReadOnlyFlag := cbDropReadOnlyFlag.Checked; gUseMmapInSearch := rbUseMmapInSearch.Checked; gPartialNameSearch := cbPartialNameSearch.Checked; gWipePassNumber := seWipePassNumber.Value; gProcessComments := cbProcessComments.Checked; gShowCopyTabSelectPanel := cbShowCopyTabSelectPanel.Checked; gUseTrash := cbDeleteToTrash.Checked; gRenameSelOnlyName := cbRenameSelOnlyName.Checked; case cbProgressKind.ItemIndex of 0: gFileOperationsProgressKind := fopkSeparateWindow; 1: gFileOperationsProgressKind := fopkSeparateWindowMinimized; 2: gFileOperationsProgressKind := fopkOperationsPanel; end; gFileOperationsConfirmations := []; if cbCopyConfirmation.Checked then Include(gFileOperationsConfirmations, focCopy); if cbMoveConfirmation.Checked then Include(gFileOperationsConfirmations, focMove); if cbDeleteConfirmation.Checked then Include(gFileOperationsConfirmations, focDelete); if cbDeleteToTrashConfirmation.Checked then Include(gFileOperationsConfirmations, focDeleteToTrash); end; constructor TfrmOptionsFileOperations.Create(TheOwner: TComponent); begin inherited Create(TheOwner); FLoading := False; end; end. doublecmd-0.5.8/src/frames/foptionslayout.pas0000644000175000017500000001216011740433676020371 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Layout options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsLayout; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, fOptionsFrame; type { TfrmOptionsLayout } TfrmOptionsLayout = class(TOptionsEditor) cbFlatDiskPanel: TCheckBox; cbFlatInterface: TCheckBox; cbFlatToolBar: TCheckBox; cbFreespaceInd: TCheckBox; cbLogWindow: TCheckBox; cbPanelOfOperations: TCheckBox; cbProgInMenuBar: TCheckBox; cbShowCmdLine: TCheckBox; cbShowCurDir: TCheckBox; cbShowDiskPanel: TCheckBox; cbShowDriveFreeSpace: TCheckBox; cbShowDrivesListButton: TCheckBox; cbShowKeysPanel: TCheckBox; cbShowMainMenu: TCheckBox; cbShowMainToolBar: TCheckBox; cbShowStatusBar: TCheckBox; cbShowTabHeader: TCheckBox; cbShowTabs: TCheckBox; cbTermWindow: TCheckBox; cbTwoDiskPanels: TCheckBox; cbShowShortDriveFreeSpace: TCheckBox; gbScreenLayout: TGroupBox; procedure cbShowDiskPanelChange(Sender: TObject); procedure cbShowDriveFreeSpaceChange(Sender: TObject); procedure cbTermWindowChange(Sender: TObject); protected procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses uGlobs, uLng; { TfrmOptionsLayout } procedure TfrmOptionsLayout.cbShowDiskPanelChange(Sender: TObject); begin cbTwoDiskPanels.Enabled := cbShowDiskPanel.Checked; cbFlatDiskPanel.Enabled := cbShowDiskPanel.Checked; end; procedure TfrmOptionsLayout.cbShowDriveFreeSpaceChange(Sender: TObject); begin cbShowShortDriveFreeSpace.Enabled:= cbShowDriveFreeSpace.Checked; if not(cbShowDriveFreeSpace.Checked) then cbShowShortDriveFreeSpace.Checked:= false; end; procedure TfrmOptionsLayout.cbTermWindowChange(Sender: TObject); begin if cbTermWindow.Checked then begin cbShowCmdLine.Tag:= Integer(cbShowCmdLine.Checked); cbShowCmdLine.Checked:= True; cbShowCmdLine.Enabled:= False; end else begin cbShowCmdLine.Checked:= Boolean(cbShowCmdLine.Tag); cbShowCmdLine.Enabled:= True; end; end; class function TfrmOptionsLayout.GetIconIndex: Integer; begin Result := 7; end; class function TfrmOptionsLayout.GetTitle: String; begin Result := rsOptionsEditorLayout; end; procedure TfrmOptionsLayout.Load; begin cbShowMainMenu.Checked := gMainMenu; cbShowMainToolBar.Checked := gButtonBar; cbFlatToolBar.Checked := gToolBarFlat; cbShowDiskPanel.Checked := gDriveBar1; cbTwoDiskPanels.Checked := gDriveBar2; cbFlatDiskPanel.Checked := gDriveBarFlat; cbShowDrivesListButton.Checked := gDrivesListButton; cbShowTabs.Checked := gDirectoryTabs; cbShowCurDir.Checked := gCurDir; cbShowTabHeader.Checked := gTabHeader; cbShowStatusBar.Checked := gStatusBar; cbShowCmdLine.Checked := gCmdLine or gTermWindow; cbShowCmdLine.Enabled:= not gTermWindow; cbShowKeysPanel.Checked := gKeyButtons; cbFlatInterface.Checked := gInterfaceFlat; cbLogWindow.Checked := gLogWindow; cbTermWindow.Checked := gTermWindow; cbShowDriveFreeSpace.Checked := gDriveFreeSpace; cbFreespaceInd.Checked := gDriveInd; cbProgInMenuBar.Checked := gProgInMenuBar; cbPanelOfOperations.Checked := gPanelOfOp; cbShowShortDriveFreeSpace.Checked:= gShortFormatDriveInfo; end; function TfrmOptionsLayout.Save: TOptionsEditorSaveFlags; begin Result := []; gMainMenu := cbShowMainMenu.Checked; gButtonBar := cbShowMainToolBar.Checked; gToolBarFlat := cbFlatToolBar.Checked; gDriveBar1 := cbShowDiskPanel.Checked; gDriveBar2 := cbTwoDiskPanels.Checked; gDriveBarFlat := cbFlatDiskPanel.Checked; gDrivesListButton := cbShowDrivesListButton.Checked; gDirectoryTabs := cbShowTabs.Checked; gCurDir := cbShowCurDir.Checked; gTabHeader := cbShowTabHeader.Checked; gStatusBar := cbShowStatusBar.Checked; gCmdLine := cbShowCmdLine.Checked; gKeyButtons := cbShowKeysPanel.Checked; gInterfaceFlat := cbFlatInterface.Checked; gLogWindow := cbLogWindow.Checked; gTermWindow := cbTermWindow.Checked; gDriveFreeSpace := cbShowDriveFreeSpace.Checked; gDriveInd := cbFreespaceInd.Checked; gProgInMenuBar := cbProgInMenuBar.Checked; gPanelOfOp := cbPanelOfOperations.Checked; gShortFormatDriveInfo := cbShowShortDriveFreeSpace.Checked; end; end. doublecmd-0.5.8/src/frames/foptionslanguage.lfm0000644000175000017500000000031511740433676020631 0ustar alexxalexxinherited frmOptionsLanguage: TfrmOptionsLanguage object lngList: TListBox[0] Left = 0 Height = 240 Top = 0 Width = 320 Align = alClient ItemHeight = 0 TabOrder = 0 end end doublecmd-0.5.8/src/frames/foptionscustomcolumns.lrt0000644000175000017500000000055512020403374021772 0ustar alexxalexxTFRMOPTIONSCUSTOMCOLUMNS.LBLCONFIGCOLUMNS.CAPTION=Con&figure columns for file system: TFRMOPTIONSCUSTOMCOLUMNS.CBBFILESYSTEM.TEXT=General TFRMOPTIONSCUSTOMCOLUMNS.BTNNEWCOLUMNSSET.CAPTION=&New TFRMOPTIONSCUSTOMCOLUMNS.BTNEDITCOLUMNSSET.CAPTION=&Edit TFRMOPTIONSCUSTOMCOLUMNS.BTNDELCOLUMNSSET.CAPTION=&Delete TFRMOPTIONSCUSTOMCOLUMNS.BTNCOPYCOLUMNSSET.CAPTION=C&opy doublecmd-0.5.8/src/frames/foptionsignorelist.lfm0000644000175000017500000000573212020403374021215 0ustar alexxalexxinherited frmOptionsIgnoreList: TfrmOptionsIgnoreList Height = 325 Width = 644 ClientHeight = 325 ClientWidth = 644 DesignTop = 27 object lblSaveIn: TLabel[0] Tag = 304 AnchorSideLeft.Control = memIgnoreList AnchorSideTop.Control = fneSaveIn AnchorSideTop.Side = asrCenter Left = 10 Height = 13 Top = 258 Width = 39 Caption = '&Save in:' FocusControl = fneSaveIn ParentColor = False end object chkIgnoreEnable: TCheckBox[1] Tag = 301 AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 10 Height = 17 Top = 8 Width = 624 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Top = 8 BorderSpacing.Right = 10 Caption = '&Ignore (don''t show) the following files and folders:' OnChange = chkIgnoreEnableChange TabOrder = 0 end object memIgnoreList: TMemo[2] AnchorSideLeft.Control = chkIgnoreEnable AnchorSideTop.Control = chkIgnoreEnable AnchorSideTop.Side = asrBottom AnchorSideRight.Control = chkIgnoreEnable AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = fneSaveIn Left = 10 Height = 213 Top = 31 Width = 624 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Top = 6 BorderSpacing.Bottom = 10 Lines.Strings = ( '' ) ParentFont = False ScrollBars = ssBoth TabOrder = 1 end object btnAddSel: TButton[3] Tag = 303 AnchorSideTop.Side = asrBottom AnchorSideRight.Control = memIgnoreList AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 512 Height = 30 Top = 285 Width = 122 Anchors = [akRight, akBottom] AutoSize = True BorderSpacing.Bottom = 10 Caption = 'A&dd selected names' Constraints.MinHeight = 30 OnClick = btnAddSelClick TabOrder = 4 end object btnAddSelWithPath: TButton[4] Tag = 302 AnchorSideLeft.Control = memIgnoreList AnchorSideTop.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 10 Height = 30 Top = 285 Width = 187 Anchors = [akLeft, akBottom] AutoSize = True BorderSpacing.Bottom = 10 Caption = 'Add selected names with &full path' Constraints.MinHeight = 30 OnClick = btnAddSelWithPathClick TabOrder = 3 end object fneSaveIn: TFileNameEdit[5] AnchorSideLeft.Control = lblSaveIn AnchorSideLeft.Side = asrBottom AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = btnAddSel Left = 57 Height = 21 Top = 254 Width = 551 DialogOptions = [] FilterIndex = 0 HideDirectories = False ButtonWidth = 23 NumGlyphs = 1 Anchors = [akLeft, akRight, akBottom] BorderSpacing.Left = 8 BorderSpacing.Bottom = 10 MaxLength = 0 TabOrder = 2 end end doublecmd-0.5.8/src/frames/foptionsfonts.lfm0000644000175000017500000001740612076734417020210 0ustar alexxalexxinherited frmOptionsFonts: TfrmOptionsFonts Height = 351 Width = 703 ClientHeight = 351 ClientWidth = 703 object lblMainFont: TLabel[0] Left = 6 Height = 13 Top = 8 Width = 45 Caption = 'Main &font' FocusControl = edtMainFont ParentColor = False end object lblEditorFont: TLabel[1] AnchorSideTop.Control = edtMainFont AnchorSideTop.Side = asrBottom Left = 6 Height = 13 Top = 58 Width = 51 BorderSpacing.Top = 10 Caption = '&Editor font' FocusControl = edtEditorFont ParentColor = False end object lblViewerFont: TLabel[2] AnchorSideTop.Control = edtEditorFont AnchorSideTop.Side = asrBottom Left = 6 Height = 13 Top = 108 Width = 55 BorderSpacing.Top = 10 Caption = '&Viewer font' FocusControl = edtViewerFont ParentColor = False end object btnSelMainFnt: TButton[3] AnchorSideTop.Control = edtMainFontSize AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = edtMainFontSize AnchorSideBottom.Side = asrBottom Left = 655 Height = 21 Top = 27 Width = 40 Anchors = [akTop, akRight, akBottom] BorderSpacing.Right = 8 Caption = '...' OnClick = btnSelMainFntClick TabOrder = 2 end object edtMainFontSize: TSpinEdit[4] AnchorSideTop.Control = edtMainFont AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnSelMainFnt Left = 596 Height = 21 Top = 27 Width = 55 Anchors = [akTop, akRight] BorderSpacing.Right = 4 MaxValue = 99 MinValue = 6 OnChange = edtMainFontSizeChange TabOrder = 1 Value = 14 end object edtMainFont: TEdit[5] AnchorSideLeft.Control = lblMainFont AnchorSideTop.Control = lblMainFont AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtMainFontSize Left = 6 Height = 21 Top = 27 Width = 586 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 BorderSpacing.Right = 4 OnExit = edtMainFontExit TabOrder = 0 end object btnSelEditFnt: TButton[6] AnchorSideTop.Control = edtEditorFontSize AnchorSideRight.Control = btnSelMainFnt AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = edtEditorFontSize AnchorSideBottom.Side = asrBottom Left = 655 Height = 21 Top = 77 Width = 40 Anchors = [akTop, akRight, akBottom] BorderSpacing.InnerBorder = 4 Caption = '...' OnClick = btnSelEditFntClick TabOrder = 5 end object edtEditorFont: TEdit[7] AnchorSideLeft.Control = lblEditorFont AnchorSideTop.Control = lblEditorFont AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtEditorFontSize Left = 6 Height = 21 Top = 77 Width = 586 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 BorderSpacing.Right = 4 OnExit = edtEditorFontExit TabOrder = 3 end object edtEditorFontSize: TSpinEdit[8] AnchorSideTop.Control = edtEditorFont AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnSelEditFnt Left = 596 Height = 21 Top = 77 Width = 55 Anchors = [akTop, akRight] BorderSpacing.Right = 4 MaxValue = 99 MinValue = 6 OnChange = edtEditorFontSizeChange TabOrder = 4 Value = 14 end object btnSelViewFnt: TButton[9] AnchorSideTop.Control = edtViewerFontSize AnchorSideRight.Control = btnSelEditFnt AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = edtViewerFontSize AnchorSideBottom.Side = asrBottom Left = 655 Height = 21 Top = 127 Width = 40 Anchors = [akTop, akRight, akBottom] BorderSpacing.InnerBorder = 4 Caption = '...' OnClick = btnSelViewFntClick TabOrder = 8 end object edtViewerFont: TEdit[10] AnchorSideLeft.Control = lblViewerFont AnchorSideTop.Control = lblViewerFont AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtViewerFontSize Left = 6 Height = 21 Top = 127 Width = 585 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 BorderSpacing.Right = 4 OnExit = edtViewerFontExit TabOrder = 6 end object edtViewerFontSize: TSpinEdit[11] AnchorSideTop.Control = edtViewerFont AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnSelViewFnt Left = 595 Height = 21 Top = 127 Width = 56 Anchors = [akTop, akRight] BorderSpacing.Right = 4 MaxValue = 99 MinValue = 6 OnChange = edtViewerFontSizeChange TabOrder = 7 Value = 14 end object lblLogFont: TLabel[12] AnchorSideLeft.Control = edtViewerFont AnchorSideTop.Control = edtViewerBookFont AnchorSideTop.Side = asrBottom Left = 6 Height = 13 Top = 208 Width = 40 BorderSpacing.Top = 10 Caption = '&Log font' FocusControl = edtLogFont ParentColor = False end object edtLogFont: TEdit[13] AnchorSideLeft.Control = lblLogFont AnchorSideTop.Control = lblLogFont AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtLogFontSize Left = 6 Height = 21 Top = 227 Width = 585 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 BorderSpacing.Right = 4 OnExit = edtLogFontExit TabOrder = 12 end object btnSelLogFnt: TButton[14] AnchorSideTop.Control = edtLogFontSize AnchorSideRight.Control = btnSelViewerBookFnt AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = edtLogFontSize AnchorSideBottom.Side = asrBottom Left = 655 Height = 21 Top = 227 Width = 40 Anchors = [akTop, akRight, akBottom] BorderSpacing.InnerBorder = 4 Caption = '...' OnClick = btnSelLogFntClick TabOrder = 14 end object edtLogFontSize: TSpinEdit[15] AnchorSideTop.Control = edtLogFont AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnSelLogFnt Left = 595 Height = 21 Top = 227 Width = 56 Anchors = [akTop, akRight] BorderSpacing.Right = 4 MaxValue = 99 MinValue = 6 OnChange = edtLogFontSizeChange TabOrder = 13 Value = 14 end object lblViewerBookFont: TLabel[16] AnchorSideLeft.Control = edtViewerFont AnchorSideTop.Control = edtViewerFont AnchorSideTop.Side = asrBottom Left = 6 Height = 13 Top = 158 Width = 80 BorderSpacing.Top = 10 Caption = 'Viewer&Book Font' FocusControl = edtViewerBookFont ParentColor = False end object edtViewerBookFont: TEdit[17] AnchorSideLeft.Control = lblViewerBookFont AnchorSideTop.Control = lblViewerBookFont AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtViewerBookFontSize Left = 6 Height = 21 Top = 177 Width = 585 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 BorderSpacing.Right = 4 OnExit = edtViewerBookFontExit TabOrder = 9 end object edtViewerBookFontSize: TSpinEdit[18] AnchorSideTop.Control = edtViewerBookFont AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnSelViewerBookFnt Left = 595 Height = 21 Top = 177 Width = 56 Anchors = [akTop, akRight] BorderSpacing.Right = 4 MaxValue = 99 MinValue = 6 OnChange = edtViewerBookFontSizeChange TabOrder = 10 Value = 18 end object btnSelViewerBookFnt: TButton[19] AnchorSideTop.Control = edtViewerBookFontSize AnchorSideRight.Control = btnSelViewFnt AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = edtViewerBookFontSize AnchorSideBottom.Side = asrBottom Left = 655 Height = 21 Top = 177 Width = 40 Anchors = [akTop, akRight, akBottom] Caption = '...' OnClick = btnSelViewerBookFntClick TabOrder = 11 end object dlgFnt: TFontDialog[20] MinFontSize = 0 MaxFontSize = 0 Options = [fdNoStyleSel] left = 88 top = 8 end end doublecmd-0.5.8/src/frames/foptionsmouse.lfm0000644000175000017500000000775212020403374020172 0ustar alexxalexxinherited frmOptionsMouse: TfrmOptionsMouse Height = 253 Width = 426 ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ClientHeight = 253 ClientWidth = 426 DesignTop = 20 object gbSelection: TGroupBox[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 68 Top = 6 Width = 414 Anchors = [akTop, akLeft, akRight] AutoSize = True Caption = 'Selection' ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ClientHeight = 50 ClientWidth = 410 TabOrder = 0 object cbSelectionByMouse: TCheckBox AnchorSideRight.Side = asrBottom Left = 6 Height = 17 Top = 6 Width = 110 Caption = '&Selection by mouse' TabOrder = 0 end object lblMouseMode: TLabel AnchorSideLeft.Control = cbSelectionByMouse AnchorSideTop.Control = cbMouseMode AnchorSideTop.Side = asrCenter Left = 6 Height = 13 Top = 27 Width = 30 Caption = '&Mode:' FocusControl = cbMouseMode ParentColor = False end object cbMouseMode: TComboBox AnchorSideLeft.Control = lblMouseMode AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cbSelectionByMouse AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbSelection AnchorSideRight.Side = asrBottom Left = 44 Height = 21 Top = 23 Width = 358 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 8 BorderSpacing.Right = 8 ItemHeight = 13 Style = csDropDownList TabOrder = 1 end end object gbScrolling: TGroupBox[1] AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbSelection AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 6 Height = 93 Top = 78 Width = 414 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Top = 4 Caption = 'Scrolling' ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ClientHeight = 75 ClientWidth = 410 TabOrder = 1 object rbScrollLineByLineCursor: TRadioButton AnchorSideLeft.Control = gbScrolling AnchorSideTop.Control = gbScrolling AnchorSideRight.Control = gbScrolling AnchorSideRight.Side = asrBottom Left = 6 Height = 17 Top = 6 Width = 398 Anchors = [akTop, akLeft, akRight] Caption = 'Line by line &with cursor movement' Checked = True TabOrder = 0 TabStop = True end object rbScrollLineByLine: TRadioButton AnchorSideLeft.Control = gbScrolling AnchorSideTop.Control = seWheelScrollLines AnchorSideTop.Side = asrCenter Left = 6 Height = 17 Top = 29 Width = 71 BorderSpacing.Right = 6 Caption = '&Line by line' TabOrder = 1 end object rbScrollPageByPage: TRadioButton AnchorSideLeft.Control = gbScrolling AnchorSideTop.Control = seWheelScrollLines AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbScrolling AnchorSideRight.Side = asrBottom Left = 6 Height = 17 Top = 52 Width = 398 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 4 Caption = '&Page by page' TabOrder = 3 end object seWheelScrollLines: TSpinEdit AnchorSideLeft.Control = rbScrollLineByLine AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = rbScrollLineByLineCursor AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbScrolling AnchorSideRight.Side = asrBottom Left = 95 Height = 21 Top = 27 Width = 307 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 18 BorderSpacing.Top = 4 BorderSpacing.Right = 8 MinValue = 1 TabOrder = 2 Value = 1 end end end doublecmd-0.5.8/src/frames/foptionstabs.lrt0000644000175000017500000000153312020403374020005 0ustar alexxalexxTFRMOPTIONSTABS.GBTABS.CAPTION=Folder tabs headers TFRMOPTIONSTABS.LBLCHAR.CAPTION=characters TFRMOPTIONSTABS.LBLTABSPOSITION.CAPTION=Ta&bs position TFRMOPTIONSTABS.CBTABSALWAYSVISIBLE.CAPTION=&Show tab header also when there is only one tab TFRMOPTIONSTABS.CBTABSMULTILINES.CAPTION=&Tabs on multiple lines TFRMOPTIONSTABS.CBTABSLIMITOPTION.CAPTION=&Limit tab title length to TFRMOPTIONSTABS.CBTABSOPENFOREGROUND.CAPTION=Ctrl+&Up opens new tab in foreground TFRMOPTIONSTABS.CBTABSCONFIRMCLOSEALL.CAPTION=Con&firm close all tabs TFRMOPTIONSTABS.CBTABSLOCKEDASTERISK.CAPTION=Show locked tabs &with an asterisk * TFRMOPTIONSTABS.CBTABSACTIVATEONCLICK.CAPTION=Activate target &panel when clicking on one of its Tabs TFRMOPTIONSTABS.CBTABSSHOWCLOSEBUTTON.CAPTION=Show ta&b close button TFRMOPTIONSTABS.CBTABSOPENNEARCURRENT.CAPTION=Open &new tabs near current tab doublecmd-0.5.8/src/frames/foptionsgroups.pas0000644000175000017500000000401111740433676020367 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Options groups Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsGroups; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Graphics, fOptionsFrame; type { TOptionsGroup } TOptionsGroup = class(TOptionsEditor) public class function IsEmpty: Boolean; override; end; { TOptionsColorsGroup } TOptionsColorsGroup = class(TOptionsGroup) public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; { TOptionsToolsGroup } TOptionsToolsGroup = class(TOptionsGroup) public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation uses uLng; { TOptionsGroup } class function TOptionsGroup.IsEmpty: Boolean; begin Result := True; end; { TOptionsToolsGroup } class function TOptionsToolsGroup.GetIconIndex: Integer; begin Result := 2; end; class function TOptionsToolsGroup.GetTitle: String; begin Result := rsOptionsEditorTools; end; { TOptionsColorsGroup } class function TOptionsColorsGroup.GetIconIndex: Integer; begin Result := 4; end; class function TOptionsColorsGroup.GetTitle: String; begin Result := rsOptionsEditorColors; end; end. doublecmd-0.5.8/src/frames/fquicksearch.lfm0000644000175000017500000001167212045446211017730 0ustar alexxalexxobject frmQuickSearch: TfrmQuickSearch Left = 0 Height = 43 Top = 0 Width = 436 AutoSize = True ClientHeight = 43 ClientWidth = 436 LCLVersion = '1.0.1.3' OnExit = FrameExit TabOrder = 0 DesignLeft = 134 DesignTop = 120 object edtSearch: TEdit AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = tglFilter Left = 2 Height = 29 Hint = 'Enter text to search for or filter by' Top = 2 Width = 192 Anchors = [akTop, akLeft, akRight] BorderSpacing.Around = 2 OnChange = edtSearchChange OnKeyDown = edtSearchKeyDown ParentShowHint = False ShowHint = True TabOrder = 0 end object tglFilter: TToggleBox AnchorSideTop.Control = edtSearch AnchorSideRight.Control = pnlOptions AnchorSideBottom.Control = edtSearch AnchorSideBottom.Side = asrBottom Left = 196 Height = 29 Hint = 'Toggle between search or filter' Top = 2 Width = 64 Anchors = [akTop, akRight, akBottom] AutoSize = True BorderSpacing.Right = 2 Caption = 'Filter' OnChange = tglFilterChange ParentShowHint = False ShowHint = True TabOrder = 1 TabStop = False end object btnCancel: TButton AnchorSideTop.Control = edtSearch AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = edtSearch AnchorSideBottom.Side = asrBottom Left = 398 Height = 29 Hint = 'Close filter panel' Top = 2 Width = 34 Anchors = [akTop, akRight, akBottom] AutoSize = True BorderSpacing.Right = 4 Cancel = True Caption = 'X' OnClick = btnCancelClick ParentShowHint = False ShowHint = True TabOrder = 3 TabStop = False end object pnlOptions: TPanel AnchorSideTop.Control = edtSearch AnchorSideRight.Control = btnCancel AnchorSideBottom.Control = edtSearch AnchorSideBottom.Side = asrBottom Left = 262 Height = 29 Top = 2 Width = 132 Anchors = [akTop, akRight, akBottom] AutoSize = True BorderSpacing.Right = 4 BevelOuter = bvNone ClientHeight = 29 ClientWidth = 132 TabOrder = 2 object sbMatchBeginning: TSpeedButton AnchorSideLeft.Control = pnlOptions AnchorSideTop.Control = pnlOptions AnchorSideTop.Side = asrCenter Left = 0 Height = 24 Hint = 'Match Beginning' Top = 2 Width = 24 AllowAllUp = True Caption = '{' GroupIndex = 1 NumGlyphs = 0 OnClick = sbMatchBeginningClick ShowHint = True ParentShowHint = False end object sbMatchEnding: TSpeedButton AnchorSideLeft.Control = sbMatchBeginning AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = sbMatchBeginning AnchorSideBottom.Control = sbMatchBeginning AnchorSideBottom.Side = asrBottom Left = 26 Height = 24 Hint = 'Match Ending' Top = 2 Width = 24 AllowAllUp = True Anchors = [akTop, akLeft, akBottom] BorderSpacing.Left = 2 Caption = '}' GroupIndex = 2 NumGlyphs = 0 OnClick = sbMatchEndingClick ShowHint = True ParentShowHint = False end object sbCaseSensitive: TSpeedButton AnchorSideLeft.Control = sbMatchEnding AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = sbMatchBeginning AnchorSideBottom.Control = sbMatchBeginning AnchorSideBottom.Side = asrBottom Left = 54 Height = 24 Hint = 'Case Sensitive' Top = 2 Width = 24 AllowAllUp = True Anchors = [akTop, akLeft, akBottom] BorderSpacing.Left = 4 Caption = 'Aa' GroupIndex = 3 NumGlyphs = 0 OnClick = sbCaseSensitiveClick ShowHint = True ParentShowHint = False end object sbFiles: TSpeedButton AnchorSideLeft.Control = sbCaseSensitive AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = sbMatchBeginning AnchorSideBottom.Control = sbMatchBeginning AnchorSideBottom.Side = asrBottom Left = 82 Height = 24 Hint = 'Files' Top = 2 Width = 24 AllowAllUp = True Anchors = [akTop, akLeft, akBottom] BorderSpacing.Left = 4 Caption = 'F' GroupIndex = 4 NumGlyphs = 0 OnClick = sbFilesAndDirectoriesClick ShowHint = True ParentShowHint = False end object sbDirectories: TSpeedButton AnchorSideLeft.Control = sbFiles AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = sbMatchBeginning AnchorSideBottom.Control = sbMatchBeginning AnchorSideBottom.Side = asrBottom Left = 108 Height = 24 Hint = 'Directories' Top = 2 Width = 24 AllowAllUp = True Anchors = [akTop, akLeft, akBottom] BorderSpacing.Left = 2 Caption = 'D' GroupIndex = 5 NumGlyphs = 0 OnClick = sbFilesAndDirectoriesClick ShowHint = True ParentShowHint = False end end end doublecmd-0.5.8/src/frames/foptionsconfiguration.lfm0000644000175000017500000001066512020403374021706 0ustar alexxalexxinherited frmOptionsConfiguration: TfrmOptionsConfiguration Height = 339 Width = 594 ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ClientHeight = 339 ClientWidth = 594 DesignTop = 27 object gbLocConfigFiles: TGroupBox[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 85 Top = 6 Width = 582 Anchors = [akTop, akLeft, akRight] AutoSize = True Caption = 'Location of configuration files' ChildSizing.LeftRightSpacing = 10 ChildSizing.TopBottomSpacing = 5 ChildSizing.VerticalSpacing = 5 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 67 ClientWidth = 578 TabOrder = 0 object rbProgramDir: TRadioButton Left = 10 Height = 17 Top = 5 Width = 193 BorderSpacing.CellAlignHorizontal = ccaLeftTop Caption = 'P&rogram directory (portable version)' Checked = True TabOrder = 0 TabStop = True end object rbUserHomeDir: TRadioButton Left = 10 Height = 17 Top = 27 Width = 115 BorderSpacing.CellAlignHorizontal = ccaLeftTop Caption = '&User home directory' TabOrder = 1 end object lblCmdLineConfigDir: TLabel Left = 10 Height = 13 Top = 49 Width = 98 BorderSpacing.CellAlignHorizontal = ccaLeftTop Caption = 'Set on command line' ParentColor = False Visible = False end end object gbSaveOnExit: TGroupBox[1] AnchorSideLeft.Control = Owner AnchorSideTop.Control = btnConfigEdit AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 121 Top = 133 Width = 582 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Top = 6 Caption = 'Save on exit' ChildSizing.TopBottomSpacing = 5 ClientHeight = 103 ClientWidth = 578 TabOrder = 3 object cbDirHistory: TCheckBox AnchorSideLeft.Control = chkSaveConfiguration AnchorSideTop.Control = chkSearchReplaceHistory AnchorSideTop.Side = asrBottom Left = 10 Height = 17 Top = 43 Width = 98 BorderSpacing.Top = 2 Caption = '&Directory history' TabOrder = 2 end object cbCmdLineHistory: TCheckBox AnchorSideLeft.Control = chkSaveConfiguration AnchorSideTop.Control = cbDirHistory AnchorSideTop.Side = asrBottom Left = 10 Height = 17 Top = 62 Width = 120 BorderSpacing.Top = 2 Caption = 'Co&mmand line history' TabOrder = 3 end object cbFileMaskHistory: TCheckBox AnchorSideLeft.Control = chkSaveConfiguration AnchorSideTop.Control = cbCmdLineHistory AnchorSideTop.Side = asrBottom Left = 10 Height = 17 Top = 81 Width = 97 BorderSpacing.Top = 2 Caption = '&File mask history' TabOrder = 4 end object chkSaveConfiguration: TCheckBox AnchorSideLeft.Control = gbSaveOnExit AnchorSideTop.Control = gbSaveOnExit Left = 10 Height = 17 Top = 5 Width = 108 BorderSpacing.Left = 10 Caption = 'Sa&ve configuration' OnChange = chkSaveConfigurationChange TabOrder = 0 end object chkSearchReplaceHistory: TCheckBox AnchorSideLeft.Control = chkSaveConfiguration AnchorSideTop.Control = chkSaveConfiguration AnchorSideTop.Side = asrBottom Left = 10 Height = 17 Top = 24 Width = 129 BorderSpacing.Top = 2 Caption = 'Searc&h/Replace history' TabOrder = 1 end end object btnConfigEdit: TBitBtn[2] AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbLocConfigFiles AnchorSideTop.Side = asrBottom Left = 10 Height = 30 Top = 97 Width = 116 BorderSpacing.Left = 10 BorderSpacing.Top = 6 Caption = '&Edit' OnClick = btnConfigEditClick TabOrder = 1 end object btnConfigApply: TBitBtn[3] AnchorSideLeft.Control = btnConfigEdit AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = gbLocConfigFiles AnchorSideTop.Side = asrBottom Left = 136 Height = 30 Top = 97 Width = 116 BorderSpacing.Left = 10 BorderSpacing.Top = 6 Caption = 'A&pply' Enabled = False OnClick = btnConfigApplyClick TabOrder = 2 end end doublecmd-0.5.8/src/frames/foptionstools.pas0000644000175000017500000001460411740433676020221 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Tools options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsTools; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, Spin, ExtCtrls, ColorBox, Dialogs, Types, fOptionsFrame, fOptionsToolBase; type { TfrmOptionsViewer } TfrmOptionsViewer = class(TfrmOptionsToolBase) btnBackViewerColor: TButton; btnFontViewerColor: TButton; cbBackgroundColorViewerBook: TColorBox; cbFontColorViewerBook: TColorBox; gbViewerBookMode: TGroupBox; gbViewerExample: TGroupBox; lblBackgroundColorViewerBook: TLabel; lblFontColorViewerBook: TLabel; lblNumberColumnsViewer: TLabel; optColorDialog: TColorDialog; pbViewerBook: TPaintBox; seNumberColumnsViewer: TSpinEdit; procedure btnBackViewerColorClick(Sender: TObject); procedure btnFontViewerColorClick(Sender: TObject); procedure cbColorBoxChange(Sender: TObject); procedure seNumberColumnsViewerChange(Sender: TObject); procedure pbViewerBookPaint(Sender: TObject); private FPreviewTextSize: TSize; procedure UseExternalProgramChanged(Sender: TObject); protected procedure Init; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; { TfrmOptionsDiffer } TfrmOptionsDiffer = class(TfrmOptionsToolBase) protected procedure Init; override; public constructor Create(TheOwner: TComponent); override; class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; { TfrmOptionsEditor } TfrmOptionsEditor = class(TfrmOptionsToolBase) protected procedure Init; override; public constructor Create(TheOwner: TComponent); override; class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses uDCUtils, uGlobs, uLng; const ViewerBookPreviewText = 'Text'; { TfrmOptionsViewer } procedure TfrmOptionsViewer.btnBackViewerColorClick(Sender: TObject); begin optColorDialog.Color:= cbBackgroundColorViewerBook.Selected; if optColorDialog.Execute then begin SetColorInColorBox(cbBackgroundColorViewerBook, optColorDialog.Color); end; end; procedure TfrmOptionsViewer.btnFontViewerColorClick(Sender: TObject); begin optColorDialog.Color:= cbFontColorViewerBook.Selected; if optColorDialog.Execute then begin SetColorInColorBox(cbFontColorViewerBook, optColorDialog.Color); end; end; procedure TfrmOptionsViewer.cbColorBoxChange(Sender: TObject); begin pbViewerBook.Repaint; end; procedure TfrmOptionsViewer.seNumberColumnsViewerChange(Sender: TObject); begin pbViewerBook.Repaint; end; procedure TfrmOptionsViewer.pbViewerBookPaint(Sender: TObject); var i, numb: integer; begin with pbViewerBook.Canvas do begin Brush.Color := cbBackgroundColorViewerBook.Selected; Font.Color := cbFontColorViewerBook.Selected; FillRect(0, 0, pbViewerBook.Width, pbViewerBook.Height); for i:= 0 to seNumberColumnsViewer.Value - 1 do begin for numb:= 0 to 1 do TextOut(i * (FPreviewTextSize.cx + 5) + 5, FPreviewTextSize.cy * numb + 4, ViewerBookPreviewText); end; end; end; procedure TfrmOptionsViewer.UseExternalProgramChanged(Sender: TObject); begin gbViewerBookMode.Enabled := not (cbToolsUseExternalProgram.Checked); lblBackgroundColorViewerBook.Enabled := not (cbToolsUseExternalProgram.Checked); lblNumberColumnsViewer.Enabled := not (cbToolsUseExternalProgram.Checked); lblFontColorViewerBook.Enabled := not (cbToolsUseExternalProgram.Checked); end; class function TfrmOptionsViewer.GetIconIndex: Integer; begin Result := 22; end; class function TfrmOptionsViewer.GetTitle: String; begin Result := rsToolViewer; end; procedure TfrmOptionsViewer.Init; begin ExternalTool := etViewer; OnUseExternalProgramChange := @UseExternalProgramChanged; gbViewerBookMode.Enabled := not (cbToolsUseExternalProgram.Checked); pbViewerBook.Font.Name := gFonts[dcfViewerBook].Name; pbViewerBook.Font.Size := gFonts[dcfViewerBook].Size; pbViewerBook.Font.Style := gFonts[dcfViewerBook].Style; inherited Init; FPreviewTextSize := pbViewerBook.Canvas.TextExtent(ViewerBookPreviewText); end; procedure TfrmOptionsViewer.Load; begin inherited; seNumberColumnsViewer.Value := gColCount; SetColorInColorBox(cbBackgroundColorViewerBook,gBookBackgroundColor); SetColorInColorBox(cbFontColorViewerBook,gBookFontColor); end; function TfrmOptionsViewer.Save: TOptionsEditorSaveFlags; begin Result := inherited; gColCount := seNumberColumnsViewer.Value; gBookBackgroundColor := cbBackgroundColorViewerBook.Selected; gBookFontColor := cbFontColorViewerBook.Selected; end; { TfrmOptionsEditor } procedure TfrmOptionsEditor.Init; begin ExternalTool := etEditor; inherited Init; end; constructor TfrmOptionsEditor.Create(TheOwner: TComponent); begin inherited Create(TheOwner); Name := 'frmOptionsEditor'; end; class function TfrmOptionsEditor.GetIconIndex: Integer; begin Result := 10; end; class function TfrmOptionsEditor.GetTitle: String; begin Result := rsToolEditor; end; { TfrmOptionsDiffer } procedure TfrmOptionsDiffer.Init; begin ExternalTool := etDiffer; inherited Init; end; constructor TfrmOptionsDiffer.Create(TheOwner: TComponent); begin inherited Create(TheOwner); Name := 'frmOptionsDiffer'; end; class function TfrmOptionsDiffer.GetIconIndex: Integer; begin Result := 25; end; class function TfrmOptionsDiffer.GetTitle: String; begin Result := rsToolDiffer; end; end. doublecmd-0.5.8/src/frames/foptionslog.lrt0000644000175000017500000000121712020403374017634 0ustar alexxalexxTFRMOPTIONSLOG.GBLOGFILE.CAPTION=File operation log file TFRMOPTIONSLOG.CBLOGFILE.CAPTION=C&reate a log file: TFRMOPTIONSLOG.GBLOGFILEOP.CAPTION=Log operations TFRMOPTIONSLOG.CBLOGCPMVLN.CAPTION=Cop&y/Move/Create link/symlink TFRMOPTIONSLOG.CBLOGDELETE.CAPTION=&Delete TFRMOPTIONSLOG.CBLOGDIROP.CAPTION=Crea&te/Delete directories TFRMOPTIONSLOG.CBLOGARCOP.CAPTION=&Pack/Unpack TFRMOPTIONSLOG.CBLOGVFS.CAPTION=&File system plugins TFRMOPTIONSLOG.GBLOGFILESTATUS.CAPTION=Operation status TFRMOPTIONSLOG.CBLOGSUCCESS.CAPTION=Log &successful operations TFRMOPTIONSLOG.CBLOGERRORS.CAPTION=Log &errors TFRMOPTIONSLOG.CBLOGINFO.CAPTION=Log &information messages doublecmd-0.5.8/src/frames/foptionscustomcolumns.pas0000644000175000017500000001032511740433676021770 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Custom columns options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsCustomColumns; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, ExtCtrls, fOptionsFrame; type { TfrmOptionsCustomColumns } TfrmOptionsCustomColumns = class(TOptionsEditor) btnCopyColumnsSet: TButton; btnDelColumnsSet: TButton; btnEditColumnsSet: TButton; btnNewColumnsSet: TButton; cbbFileSystem: TComboBox; lblConfigColumns: TLabel; lstColumnsSets: TListBox; pnlButtons: TPanel; procedure btnCopyColumnsSetClick(Sender: TObject); procedure btnDelColumnsSetClick(Sender: TObject); procedure btnEditColumnsSetClick(Sender: TObject); procedure btnNewColumnsSetClick(Sender: TObject); private procedure FillColumnsList; protected procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses uGlobs, uLng, fColumnsSetConf; { TfrmOptionsCustomColumns } procedure TfrmOptionsCustomColumns.btnCopyColumnsSetClick(Sender: TObject); var s: string; begin if lstColumnsSets.ItemIndex <> -1 then begin s := lstColumnsSets.Items[lstColumnsSets.ItemIndex]; ColSet.CopyColumnSet(s, s + '_Copy'); FillColumnsList; end; end; procedure TfrmOptionsCustomColumns.btnDelColumnsSetClick(Sender: TObject); begin if lstColumnsSets.ItemIndex=-1 then exit; if lstColumnsSets.Count=1 then exit; ColSet.DeleteColumnSet(lstColumnsSets.Items[lstColumnsSets.ItemIndex]); FillColumnsList; end; procedure TfrmOptionsCustomColumns.btnEditColumnsSetClick(Sender: TObject); var frmColumnsSetConf: TfColumnsSetConf; begin if lstColumnsSets.ItemIndex=-1 then exit; frmColumnsSetConf := TfColumnsSetConf.Create(nil); try {EDIT Set} frmColumnsSetConf.edtNameofColumnsSet.Text:=lstColumnsSets.Items[lstColumnsSets.ItemIndex]; frmColumnsSetConf.lbNrOfColumnsSet.Caption:=IntToStr(lstColumnsSets.ItemIndex+1); frmColumnsSetConf.Tag:=lstColumnsSets.ItemIndex; frmColumnsSetConf.SetColumnsClass(ColSet.GetColumnSet(lstColumnsSets.Items[lstColumnsSets.ItemIndex])); {EDIT Set} frmColumnsSetConf.ShowModal; FillColumnsList; finally FreeAndNil(frmColumnsSetConf); end; end; procedure TfrmOptionsCustomColumns.btnNewColumnsSetClick(Sender: TObject); var frmColumnsSetConf: TfColumnsSetConf; begin frmColumnsSetConf := TfColumnsSetConf.Create(nil); try // Create new Set frmColumnsSetConf.edtNameofColumnsSet.Text:='New Columns'+inttostr(ColSet.count); frmColumnsSetConf.lbNrOfColumnsSet.Caption:=IntToStr(lstColumnsSets.Count+1); frmColumnsSetConf.Tag:=-1; frmColumnsSetConf.SetColumnsClass(nil); frmColumnsSetConf.ShowModal; FillColumnsList; finally FreeAndNil(frmColumnsSetConf); end; end; procedure TfrmOptionsCustomColumns.FillColumnsList; begin lstColumnsSets.Clear; If ColSet.Items.Count>0 then begin lstColumnsSets.Items.AddStrings(ColSet.Items); end; end; class function TfrmOptionsCustomColumns.GetIconIndex: Integer; begin Result := 30; end; class function TfrmOptionsCustomColumns.GetTitle: String; begin Result := rsOptionsEditorCustomColumns; end; procedure TfrmOptionsCustomColumns.Load; begin FillColumnsList; end; function TfrmOptionsCustomColumns.Save: TOptionsEditorSaveFlags; begin Result := []; end; end. doublecmd-0.5.8/src/frames/foptionslayout.lrt0000644000175000017500000000266412020403374020377 0ustar alexxalexxTFRMOPTIONSLAYOUT.GBSCREENLAYOUT.CAPTION= Screen layout TFRMOPTIONSLAYOUT.CBSHOWMAINMENU.CAPTION=Show &main menu TFRMOPTIONSLAYOUT.CBSHOWMAINTOOLBAR.CAPTION=Show &button bar TFRMOPTIONSLAYOUT.CBSHOWDISKPANEL.CAPTION=Show &drive buttons TFRMOPTIONSLAYOUT.CBSHOWDRIVESLISTBUTTON.CAPTION=Show drives list bu&tton TFRMOPTIONSLAYOUT.CBSHOWCURDIR.CAPTION=Show current director&y TFRMOPTIONSLAYOUT.CBSHOWTABHEADER.CAPTION=S&how tabstop header TFRMOPTIONSLAYOUT.CBSHOWSTATUSBAR.CAPTION=Show &status bar TFRMOPTIONSLAYOUT.CBSHOWCMDLINE.CAPTION=Show command l&ine TFRMOPTIONSLAYOUT.CBSHOWKEYSPANEL.CAPTION=Show function &key buttons TFRMOPTIONSLAYOUT.CBFLATDISKPANEL.CAPTION=&Flat buttons TFRMOPTIONSLAYOUT.CBTWODISKPANELS.CAPTION=Show two drive button bars (fi&xed width, above file windows) TFRMOPTIONSLAYOUT.CBSHOWTABS.CAPTION=Sho&w folder tabs TFRMOPTIONSLAYOUT.CBFLATINTERFACE.CAPTION=Flat i&nterface TFRMOPTIONSLAYOUT.CBFLATTOOLBAR.CAPTION=Flat b&uttons TFRMOPTIONSLAYOUT.CBLOGWINDOW.CAPTION=Show lo&g window TFRMOPTIONSLAYOUT.CBTERMWINDOW.CAPTION=Show te&rminal window TFRMOPTIONSLAYOUT.CBFREESPACEIND.CAPTION=Show fr&ee space indicator on drive label TFRMOPTIONSLAYOUT.CBPROGINMENUBAR.CAPTION=Show common progress in menu bar TFRMOPTIONSLAYOUT.CBPANELOFOPERATIONS.CAPTION=Show panel of operation in background TFRMOPTIONSLAYOUT.CBSHOWDRIVEFREESPACE.CAPTION=Show free s&pace label TFRMOPTIONSLAYOUT.CBSHOWSHORTDRIVEFREESPACE.CAPTION=Show short free space &label doublecmd-0.5.8/src/frames/foptionsdragdrop.pas0000644000175000017500000000352411740433676020662 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Drag&drop options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsDragDrop; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, fOptionsFrame; type { TfrmOptionsDragDrop } TfrmOptionsDragDrop = class(TOptionsEditor) cbShowConfirmationDialog: TCheckBox; protected procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses uGlobs, uLng; { TfrmOptionsDragDrop } procedure TfrmOptionsDragDrop.Load; begin cbShowConfirmationDialog.Checked := gShowDialogOnDragDrop; end; function TfrmOptionsDragDrop.Save: TOptionsEditorSaveFlags; begin gShowDialogOnDragDrop := cbShowConfirmationDialog.Checked; Result := []; end; class function TfrmOptionsDragDrop.GetIconIndex: Integer; begin Result := 28; end; class function TfrmOptionsDragDrop.GetTitle: String; begin Result := rsOptionsEditorDragAndDrop; end; end. doublecmd-0.5.8/src/frames/foptionslayout.lfm0000644000175000017500000001551012020403374020346 0ustar alexxalexxinherited frmOptionsLayout: TfrmOptionsLayout Height = 550 Width = 784 ClientHeight = 550 ClientWidth = 784 DesignLeft = 319 DesignTop = 146 object gbScreenLayout: TGroupBox[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 427 Top = 6 Width = 772 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = ' Screen layout ' ChildSizing.LeftRightSpacing = 12 ChildSizing.TopBottomSpacing = 6 ClientHeight = 409 ClientWidth = 768 TabOrder = 0 object cbShowMainMenu: TCheckBox Left = 12 Height = 17 Top = 6 Width = 98 Caption = 'Show &main menu' TabOrder = 0 end object cbShowMainToolBar: TCheckBox AnchorSideTop.Control = cbShowMainMenu AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 25 Width = 98 BorderSpacing.Top = 2 Caption = 'Show &button bar' TabOrder = 1 end object cbShowDiskPanel: TCheckBox AnchorSideTop.Control = cbFlatToolBar AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 63 Width = 111 BorderSpacing.Top = 2 Caption = 'Show &drive buttons' OnChange = cbShowDiskPanelChange TabOrder = 3 end object cbShowDrivesListButton: TCheckBox AnchorSideTop.Control = cbFlatDiskPanel AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 120 Width = 127 BorderSpacing.Top = 2 Caption = 'Show drives list bu&tton' TabOrder = 6 end object cbShowCurDir: TCheckBox AnchorSideTop.Control = cbShowTabs AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 215 Width = 128 BorderSpacing.Top = 2 Caption = 'Show current director&y' TabOrder = 11 end object cbShowTabHeader: TCheckBox AnchorSideTop.Control = cbShowCurDir AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 234 Width = 121 BorderSpacing.Top = 2 Caption = 'S&how tabstop header' TabOrder = 12 end object cbShowStatusBar: TCheckBox AnchorSideTop.Control = cbShowTabHeader AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 253 Width = 96 BorderSpacing.Top = 2 Caption = 'Show &status bar' TabOrder = 13 end object cbShowCmdLine: TCheckBox AnchorSideTop.Control = cbShowStatusBar AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 272 Width = 111 BorderSpacing.Top = 2 Caption = 'Show command l&ine' TabOrder = 14 end object cbShowKeysPanel: TCheckBox AnchorSideTop.Control = cbShowCmdLine AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 291 Width = 146 BorderSpacing.Top = 2 Caption = 'Show function &key buttons' TabOrder = 15 end object cbFlatDiskPanel: TCheckBox AnchorSideLeft.Control = cbTwoDiskPanels AnchorSideTop.Control = cbTwoDiskPanels AnchorSideTop.Side = asrBottom Left = 28 Height = 17 Top = 101 Width = 76 BorderSpacing.Top = 2 Caption = '&Flat buttons' Enabled = False TabOrder = 5 end object cbTwoDiskPanels: TCheckBox AnchorSideLeft.Control = cbShowDiskPanel AnchorSideTop.Control = cbShowDiskPanel AnchorSideTop.Side = asrBottom Left = 28 Height = 17 Top = 82 Width = 313 BorderSpacing.Left = 16 BorderSpacing.Top = 2 Caption = 'Show two drive button bars (fi&xed width, above file windows)' Enabled = False TabOrder = 4 end object cbShowTabs: TCheckBox AnchorSideTop.Control = cbFreespaceInd AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 196 Width = 99 BorderSpacing.Top = 2 Caption = 'Sho&w folder tabs' TabOrder = 10 end object cbFlatInterface: TCheckBox AnchorSideTop.Control = cbShowKeysPanel AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 310 Width = 82 BorderSpacing.Top = 2 Caption = 'Flat i&nterface' TabOrder = 16 end object cbFlatToolBar: TCheckBox AnchorSideLeft.Control = cbShowMainToolBar AnchorSideTop.Control = cbShowMainToolBar AnchorSideTop.Side = asrBottom Left = 28 Height = 17 Top = 44 Width = 76 BorderSpacing.Left = 16 BorderSpacing.Top = 2 Caption = 'Flat b&uttons' TabOrder = 2 end object cbLogWindow: TCheckBox AnchorSideTop.Control = cbFlatInterface AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 329 Width = 100 BorderSpacing.Top = 2 Caption = 'Show lo&g window' TabOrder = 17 end object cbTermWindow: TCheckBox AnchorSideTop.Control = cbLogWindow AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 348 Width = 124 BorderSpacing.Top = 2 Caption = 'Show te&rminal window' OnChange = cbTermWindowChange TabOrder = 18 end object cbFreespaceInd: TCheckBox AnchorSideTop.Control = cbShowShortDriveFreeSpace AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 177 Width = 209 BorderSpacing.Top = 2 Caption = 'Show fr&ee space indicator on drive label' TabOrder = 9 end object cbProgInMenuBar: TCheckBox AnchorSideTop.Control = cbTermWindow AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 367 Width = 190 BorderSpacing.Top = 2 Caption = 'Show common progress in menu bar' TabOrder = 19 end object cbPanelOfOperations: TCheckBox AnchorSideTop.Control = cbProgInMenuBar AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 386 Width = 205 BorderSpacing.Top = 2 Caption = 'Show panel of operation in background' TabOrder = 20 end object cbShowDriveFreeSpace: TCheckBox AnchorSideTop.Control = cbShowDrivesListButton AnchorSideTop.Side = asrBottom Left = 12 Height = 17 Top = 139 Width = 123 BorderSpacing.Top = 2 Caption = 'Show free s&pace label' OnChange = cbShowDriveFreeSpaceChange TabOrder = 7 end object cbShowShortDriveFreeSpace: TCheckBox AnchorSideLeft.Control = cbFlatDiskPanel AnchorSideTop.Control = cbShowDriveFreeSpace AnchorSideTop.Side = asrBottom Left = 28 Height = 17 Top = 158 Width = 151 BorderSpacing.Top = 2 Caption = 'Show short free space &label' TabOrder = 8 end end end doublecmd-0.5.8/src/frames/foptionstooltips.lfm0000644000175000017500000002366412020403374020717 0ustar alexxalexxinherited frmOptionsToolTips: TfrmOptionsToolTips Height = 501 Width = 599 AutoSize = True ClientHeight = 501 ClientWidth = 599 DesignTop = 27 object gbCustomFields: TGroupBox[0] AnchorSideLeft.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 345 Top = 6 Width = 587 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = 'Custom fields by file type' ChildSizing.TopBottomSpacing = 6 ClientHeight = 322 ClientWidth = 583 TabOrder = 0 object btnAddFields: TBitBtn AnchorSideTop.Control = btnApplyFields AnchorSideRight.Control = btnDeleteFields Left = 233 Height = 32 Top = 284 Width = 110 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = 'A&dd' OnClick = btnAddFieldsClick TabOrder = 2 end object btnDeleteFields: TBitBtn AnchorSideTop.Control = btnApplyFields AnchorSideRight.Control = btnApplyFields Left = 349 Height = 32 Top = 284 Width = 110 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = 'D&elete' Enabled = False OnClick = btnDeleteFieldsClick TabOrder = 3 end object lsbCustomFields: TListBox AnchorSideTop.Control = gbCustomFields AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 12 Height = 142 Top = 6 Width = 563 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 BorderSpacing.Right = 8 ItemHeight = 0 OnSelectionChange = lsbCustomFieldsSelectionChange ScrollWidth = 561 TabOrder = 0 TopIndex = -1 end object btnApplyFields: TBitBtn AnchorSideTop.Control = pnlEdit AnchorSideTop.Side = asrBottom AnchorSideRight.Control = pnlEdit AnchorSideRight.Side = asrBottom Left = 465 Height = 32 Top = 284 Width = 110 Anchors = [akTop, akRight] BorderSpacing.Top = 12 Caption = 'A&pply' OnClick = btnApplyFieldsClick TabOrder = 4 end object pnlEdit: TPanel AnchorSideLeft.Control = lsbCustomFields AnchorSideTop.Control = lsbCustomFields AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lsbCustomFields AnchorSideRight.Side = asrBottom Left = 12 Height = 118 Top = 154 Width = 563 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Top = 6 BevelOuter = bvNone ChildSizing.TopBottomSpacing = 6 ClientHeight = 118 ClientWidth = 563 Enabled = False TabOrder = 1 object lblFieldsName: TLabel AnchorSideTop.Control = edtFieldsName AnchorSideTop.Side = asrCenter Left = 1 Height = 18 Top = 17 Width = 102 Caption = 'Category &name:' FocusControl = edtFieldsName ParentColor = False end object lblFieldsMask: TLabel AnchorSideTop.Control = edtFieldsMask AnchorSideTop.Side = asrCenter Left = 1 Height = 18 Top = 53 Width = 100 Caption = 'Category &mask:' FocusControl = edtFieldsMask ParentColor = False end object lblFieldsList: TLabel AnchorSideTop.Control = edtFieldsList AnchorSideTop.Side = asrCenter Left = 1 Height = 18 Top = 89 Width = 93 Caption = 'Category &hint:' FocusControl = edtFieldsList ParentColor = False end object edtFieldsName: TEdit AnchorSideTop.Control = pnlEdit AnchorSideRight.Side = asrBottom Left = 151 Height = 28 Top = 12 Width = 412 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 12 TabOrder = 0 end object edtFieldsMask: TEdit AnchorSideLeft.Control = edtFieldsName AnchorSideTop.Control = edtFieldsName AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnFieldsSearchTemplate Left = 151 Height = 28 Top = 48 Width = 383 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 8 BorderSpacing.Right = 6 TabOrder = 1 end object edtFieldsList: TEdit AnchorSideLeft.Control = edtFieldsName AnchorSideTop.Control = edtFieldsMask AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnFieldsList Left = 151 Height = 28 Top = 84 Width = 378 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 8 BorderSpacing.Right = 6 TabOrder = 3 end object btnFieldsSearchTemplate: TBitBtn AnchorSideTop.Control = edtFieldsMask AnchorSideRight.Control = edtFieldsName AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = edtFieldsMask AnchorSideBottom.Side = asrBottom Left = 540 Height = 28 Hint = 'Template...' Top = 48 Width = 23 Anchors = [akTop, akRight, akBottom] Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000009700 00FF000000000000000000000000000000FF00000000000000FFC2B5B3E30000 00FF000000000000000000000000000000000000000000000000000000000000 0000970000FF00000000000000000000000000000000C5B8B570E3DBD9FF8975 7375000000000000000000000000000000000000000000000000000000000000 000000000000970000FF000000000000000000000000C2B4B26FE1D9D7FF8571 6E75000000000000000000000000000000000000000000000000000000000000 0000970000FF00000000000000000000000000000000B3A4A26FD6C9C7FF705E 5B75000000000000000000000000000000000000000000000000000000009700 00FF0000000000000000000000000000000000000000A798967DD9CBCAFF7362 6184000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000005B494812D4C6C5FFD1C2C1FE8F7E 7DFF5B4B4E160000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000C2B3B3C0EEE2E2FED5C8C7FFD6C9 C8FE746363C60000000000000000000000000000000000000000000000000000 00000000000000000000000000009D8B8B5CF9EEEFFFEDE1E0FFDED1D1FFEADE DCFFB1A1A0FF645455630000000000000000000000000000000000000000D2C6 C36CEEE5E2C3BEADABB100000002D2C4C3FBFDF5F4FEE0D4D3FFDACCCBFFE8DD DBFFD2C4C2FE796868FD61525509000000000000000000000000000000008B78 754B00000000000000007C6B6BFCF7ECECFFFEF6F4FFCFC2C0FFD4C7C7FFEDE3 E1FFCDBDBBFF998887FE605151BC00000000000000000000000000000000806F 6D350000000062514F4CCEBEBEFFFBF2F0FFFBF6F5FFC7B9B7FFD0C3C3FFF8F0 EFFFC7B7B4FFA69593FF665555FF5545464D000000000000000000000000D8CF CE59D1C5C299978484FFF4EBEBFEFEFDFDFFF4EEEDFFC3B5B3FFD8CBC9FFFFFC FCFFD8CBC9FFB2A1A0FF867474FE524343FA0000000200000000000000000000 00007767669CE0D3D1FFFFFEFEFFFFFFFFFFEFE7E6FFAF9E9BFFD6C6C4FFFCF7 F7FFD8CACAFFAE9D9EFF827173FF5B4A4EFF67595C9F00000000000000000000 00008E7F7ED8E2D7D6FFCCC2C2FFCDC6C6FFD0C9C9FFD7D1D2FFD6D1D2FFCEC6 C6FFCBC5C5FFC7C0C0FFC2B8B8FFA39698FF726468DC00000000000000000000 0000ACA2A3DEAC9C99FFC9BCBBFFDBCDCAFFF3E6E2FEFFFFFEFFF5EEECFFB9A7 A3FFF3EDEBFEF7F3F3FFA99998FFA49695FFB1A6A7E700000000000000000000 0000000000005F5054459C919391B7ADAFB4BBB2B2C3C0B5B6CFC0B6B7D2BBB2 B3D0BCB2B3C3BBB3B4B59D929592615156460000000000000000 } Layout = blGlyphRight OnClick = btnFieldsSearchTemplateClick ParentShowHint = False ShowHint = True TabOrder = 2 end object btnFieldsList: TButton AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = edtFieldsList AnchorSideRight.Control = edtFieldsName AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = edtFieldsList AnchorSideBottom.Side = asrBottom Left = 535 Height = 28 Top = 84 Width = 28 Anchors = [akTop, akRight, akBottom] BorderSpacing.InnerBorder = 4 Caption = '>>' OnClick = btnFieldsListClick TabOrder = 4 end end end object gbShowToolTip: TGroupBox[1] AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbCustomFields AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 108 Top = 357 Width = 587 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = 'Show tool tip' ChildSizing.LeftRightSpacing = 12 ChildSizing.TopBottomSpacing = 6 ClientHeight = 85 ClientWidth = 583 TabOrder = 1 object rbToolTipAllFiles: TRadioButton AnchorSideLeft.Control = gbShowToolTip AnchorSideTop.Control = rbToolTipNone AnchorSideTop.Side = asrBottom Left = 12 Height = 23 Top = 31 Width = 267 BorderSpacing.Top = 2 Caption = 'Sho&w tool tip for all files in file panel' TabOrder = 1 end object rbToolTipOnlyLarge: TRadioButton AnchorSideLeft.Control = gbShowToolTip AnchorSideTop.Control = rbToolTipAllFiles AnchorSideTop.Side = asrBottom Left = 12 Height = 23 Top = 56 Width = 326 BorderSpacing.Top = 2 Caption = 'Show &tool tip for files in file panel if truncated' TabOrder = 2 end object rbToolTipNone: TRadioButton AnchorSideLeft.Control = gbShowToolTip AnchorSideTop.Control = gbShowToolTip Left = 12 Height = 23 Top = 6 Width = 97 Caption = 'Don''t &show' Checked = True TabOrder = 0 TabStop = True end end object pmFields: TPopupMenu[2] left = 120 top = 248 end end doublecmd-0.5.8/src/frames/foptionsmouse.pas0000644000175000017500000000575711740427612020213 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Mouse options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsMouse; {$mode objfpc}{$H+} interface uses Classes, SysUtils, fOptionsFrame, StdCtrls, Spin; type { TfrmOptionsMouse } TfrmOptionsMouse = class(TOptionsEditor) cbMouseMode: TComboBox; cbSelectionByMouse: TCheckBox; gbScrolling: TGroupBox; gbSelection: TGroupBox; lblMouseMode: TLabel; rbScrollLineByLine: TRadioButton; rbScrollLineByLineCursor: TRadioButton; rbScrollPageByPage: TRadioButton; seWheelScrollLines: TSpinEdit; protected procedure Init; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses DCStrUtils, uGlobs, uLng; { TfrmOptionsMouse } procedure TfrmOptionsMouse.Init; begin ParseLineToList(rsOptMouseSelectionButton, cbMouseMode.Items); end; procedure TfrmOptionsMouse.Load; begin cbSelectionByMouse.Checked:=gMouseSelectionEnabled; cbMouseMode.ItemIndex := gMouseSelectionButton; seWheelScrollLines.Value:= gWheelScrollLines; case gScrollMode of smLineByLineCursor: rbScrollLineByLineCursor.Checked:= True; smLineByLine: rbScrollLineByLine.Checked:= True; smPageByPage: rbScrollPageByPage.Checked:= True; else rbScrollLineByLine.Checked:= True; end; end; function TfrmOptionsMouse.Save: TOptionsEditorSaveFlags; begin gMouseSelectionEnabled := cbSelectionByMouse.Checked; gMouseSelectionButton := cbMouseMode.ItemIndex; gWheelScrollLines:= seWheelScrollLines.Value; if rbScrollLineByLineCursor.Checked then gScrollMode:= smLineByLineCursor else if rbScrollLineByLine.Checked then gScrollMode:= smLineByLine else if rbScrollPageByPage.Checked then gScrollMode:= smPageByPage; Result := []; end; class function TfrmOptionsMouse.GetIconIndex: Integer; begin Result := 27; end; class function TfrmOptionsMouse.GetTitle: String; begin Result := rsOptionsEditorMouse; end; end. doublecmd-0.5.8/src/frames/foptionsbehavior.pas0000644000175000017500000000553211737171117020653 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Behavior options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsBehavior; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, ExtCtrls, fOptionsFrame; type { TfrmOptionsBehavior } TfrmOptionsBehavior = class(TOptionsEditor) cbAlwaysShowTrayIcon: TCheckBox; cbMinimizeToTray: TCheckBox; cbOnlyOnce: TCheckBox; cbBlacklistUnmountedDevices: TCheckBox; edtDrivesBlackList: TEdit; gbMisc1: TGroupBox; gbMisc2: TGroupBox; lblDrivesBlackList: TLabel; procedure cbAlwaysShowTrayIconChange(Sender: TObject); protected procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses uGlobs, uLng; { TfrmOptionsBehavior } procedure TfrmOptionsBehavior.cbAlwaysShowTrayIconChange(Sender: TObject); begin // Force minimizing to tray when tray icon is always shown. cbMinimizeToTray.Enabled:= not cbAlwaysShowTrayIcon.Checked; end; class function TfrmOptionsBehavior.GetIconIndex: Integer; begin Result := 1; end; class function TfrmOptionsBehavior.GetTitle: String; begin Result := rsOptionsEditorBehavior; end; procedure TfrmOptionsBehavior.Load; begin cbOnlyOnce.Checked:= gOnlyOneAppInstance; cbMinimizeToTray.Checked:= gMinimizeToTray; cbMinimizeToTray.Enabled:= not gAlwaysShowTrayIcon; cbAlwaysShowTrayIcon.Checked:= gAlwaysShowTrayIcon; edtDrivesBlackList.Text:= gDriveBlackList; cbBlacklistUnmountedDevices.Checked:= gDriveBlackListUnmounted; end; function TfrmOptionsBehavior.Save: TOptionsEditorSaveFlags; begin Result := []; gOnlyOneAppInstance:=cbOnlyOnce.Checked; gMinimizeToTray:= cbMinimizeToTray.Checked; gAlwaysShowTrayIcon:= cbAlwaysShowTrayIcon.Checked; gDriveBlackList:= edtDrivesBlackList.Text; gDriveBlackListUnmounted:= cbBlacklistUnmountedDevices.Checked; end; end. doublecmd-0.5.8/src/frames/foptionsdragdrop.lfm0000644000175000017500000000043612020403374020634 0ustar alexxalexxinherited frmOptionsDragDrop: TfrmOptionsDragDrop Width = 454 ClientWidth = 454 DesignTop = 20 object cbShowConfirmationDialog: TCheckBox[0] Left = 8 Height = 20 Top = 8 Width = 194 Caption = '&Show confirmation dialog after drop' TabOrder = 0 end end doublecmd-0.5.8/src/frames/foptionsterminal.lfm0000644000175000017500000000241512020403374020644 0ustar alexxalexxinherited frmOptionsTerminal: TfrmOptionsTerminal Height = 147 Width = 519 ClientHeight = 147 ClientWidth = 519 object lblRunInTerm: TLabel[0] AnchorSideTop.Side = asrCenter Left = 8 Height = 13 Top = 11 Width = 75 Caption = 'Run in &terminal:' FocusControl = edtRunInTerm ParentColor = False end object edtRunInTerm: TEdit[1] AnchorSideLeft.Control = lblRunInTerm AnchorSideLeft.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 89 Height = 21 Top = 8 Width = 420 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 BorderSpacing.Right = 10 TabOrder = 0 end object lblRunTerm: TLabel[2] AnchorSideTop.Side = asrCenter Left = 8 Height = 13 Top = 40 Width = 64 Caption = 'Run t&erminal:' FocusControl = edtRunTerm ParentColor = False end object edtRunTerm: TEdit[3] AnchorSideLeft.Control = edtRunInTerm AnchorSideTop.Control = edtRunInTerm AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtRunInTerm AnchorSideRight.Side = asrBottom Left = 89 Height = 21 Top = 35 Width = 420 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 6 TabOrder = 1 end end doublecmd-0.5.8/src/frames/foptionstooltips.pas0000644000175000017500000001535611740433676020743 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Tooltips options page Copyright (C) 2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsToolTips; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, StdCtrls, Buttons, Menus, ExtCtrls, fOptionsFrame, uInfoToolTip; type { TfrmOptionsToolTips } TfrmOptionsToolTips = class(TOptionsEditor) btnAddFields: TBitBtn; btnDeleteFields: TBitBtn; btnApplyFields: TBitBtn; btnFieldsList: TButton; btnFieldsSearchTemplate: TBitBtn; edtFieldsList: TEdit; edtFieldsMask: TEdit; edtFieldsName: TEdit; gbCustomFields: TGroupBox; gbShowToolTip: TGroupBox; lblFieldsList: TLabel; lblFieldsMask: TLabel; lblFieldsName: TLabel; lsbCustomFields: TListBox; pnlEdit: TPanel; pmFields: TPopupMenu; rbToolTipAllFiles: TRadioButton; rbToolTipNone: TRadioButton; rbToolTipOnlyLarge: TRadioButton; procedure btnAddFieldsClick(Sender: TObject); procedure btnApplyFieldsClick(Sender: TObject); procedure btnDeleteFieldsClick(Sender: TObject); procedure btnFieldsListClick(Sender: TObject); procedure btnFieldsSearchTemplateClick(Sender: TObject); procedure miPluginClick(Sender: TObject); procedure lsbCustomFieldsSelectionChange(Sender: TObject; User: boolean); private FFileInfoToolTip: TFileInfoToolTip; procedure ClearData; protected procedure Init; override; procedure Done; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses LCLProc, fMaskInputDlg, uLng, uGlobs, uSearchTemplate, uFileFunctions; { TfrmOptionsToolTips } procedure TfrmOptionsToolTips.btnFieldsSearchTemplateClick(Sender: TObject); var sMask: UTF8String; bTemplate: Boolean; begin if ShowMaskInputDlg(rsMarkPlus, rsMaskInput, glsMaskHistory, sMask) then begin bTemplate:= IsMaskSearchTemplate(sMask); edtFieldsMask.Text:= sMask; edtFieldsMask.Enabled:= not bTemplate; end; end; procedure TfrmOptionsToolTips.miPluginClick(Sender: TObject); var sMask: String; MenuItem: TMenuItem absolute Sender; begin case MenuItem.Tag of 0: begin sMask := '[DC().' + MenuItem.Hint + '{}]'; end; 1: begin sMask := '[Plugin(' + MenuItem.Parent.Caption + ').' + MenuItem.Caption + '{}]'; end; 2: begin sMask := '[Plugin(' + MenuItem.Parent.Parent.Caption + ').' + MenuItem.Parent.Caption + '{' + MenuItem.Caption + '}]'; end; else begin sMask:= '\n' end; end; edtFieldsList.Text:= edtFieldsList.Text + sMask; end; procedure TfrmOptionsToolTips.lsbCustomFieldsSelectionChange(Sender: TObject; User: boolean); var I: LongInt; begin I:= lsbCustomFields.ItemIndex; pnlEdit.Enabled:= (I <> -1); btnDeleteFields.Enabled:= pnlEdit.Enabled; if pnlEdit.Enabled then begin edtFieldsName.Text:= lsbCustomFields.Items[I]; with FFileInfoToolTip.HintItemList[I] do begin edtFieldsName.Text:= Name; edtFieldsMask.Text:= Mask; edtFieldsList.Text:= Hint; end; end; end; procedure TfrmOptionsToolTips.ClearData; begin edtFieldsName.Text:= EmptyStr; edtFieldsMask.Text:= EmptyStr; edtFieldsList.Text:= EmptyStr; end; class function TfrmOptionsToolTips.GetIconIndex: Integer; begin Result := 19; end; class function TfrmOptionsToolTips.GetTitle: String; begin Result := rsOptionsEditorTooltips; end; procedure TfrmOptionsToolTips.Init; begin FFileInfoToolTip:= TFileInfoToolTip.Create; end; procedure TfrmOptionsToolTips.Done; begin FreeThenNil(FFileInfoToolTip); end; procedure TfrmOptionsToolTips.btnDeleteFieldsClick(Sender: TObject); var I: LongInt; begin I:= lsbCustomFields.ItemIndex; if I <> -1 then begin lsbCustomFields.Items.Delete(I); FFileInfoToolTip.HintItemList.Delete(I); end; lsbCustomFields.ItemIndex:= lsbCustomFields.Items.Count - 1; pnlEdit.Enabled:= (lsbCustomFields.ItemIndex <> -1); btnDeleteFields.Enabled:= (lsbCustomFields.ItemIndex <> -1); if (lsbCustomFields.Items.Count = 0) then ClearData; end; procedure TfrmOptionsToolTips.btnFieldsListClick(Sender: TObject); var MenuItem: TMenuItem; begin FillContentFieldMenu(pmFields.Items, @miPluginClick); MenuItem:= TMenuItem.Create(pmFields); MenuItem.Caption:= '\n (New line)'; MenuItem.Tag:= -1; MenuItem.OnClick:= @miPluginClick; pmFields.Items.Add(MenuItem); pmFields.PopUp(Mouse.CursorPos.x, Mouse.CursorPos.y); end; procedure TfrmOptionsToolTips.btnAddFieldsClick(Sender: TObject); begin pnlEdit.Enabled:= (lsbCustomFields.Items.Count <> 0); btnDeleteFields.Enabled:= (lsbCustomFields.Items.Count <> 0); FFileInfoToolTip.HintItemList.Add(THintItem.Create); lsbCustomFields.ItemIndex:= lsbCustomFields.Items.Add(EmptyStr); ClearData; end; procedure TfrmOptionsToolTips.btnApplyFieldsClick(Sender: TObject); var I: LongInt; begin I:= lsbCustomFields.ItemIndex; if I <> -1 then begin lsbCustomFields.Items[I] := edtFieldsName.Text; with FFileInfoToolTip.HintItemList[I] do begin Name:= edtFieldsName.Text; Mask:= edtFieldsMask.Text; Hint:= edtFieldsList.Text; end; end; end; procedure TfrmOptionsToolTips.Load; var I: LongInt; begin rbToolTipAllFiles.Checked:= (stm_show_for_all in gShowToolTipMode); rbToolTipOnlyLarge.Checked:= (stm_only_large_name in gShowToolTipMode); FFileInfoToolTip.Assign(gFileInfoToolTip); for I:= 0 to FFileInfoToolTip.HintItemList.Count - 1 do lsbCustomFields.Items.Add(FFileInfoToolTip.HintItemList[I].Name); end; function TfrmOptionsToolTips.Save: TOptionsEditorSaveFlags; begin gShowToolTipMode:= []; // Reset tool tip show mode if rbToolTipAllFiles.Checked then Include(gShowToolTipMode, stm_show_for_all); if rbToolTipOnlyLarge.Checked then Include(gShowToolTipMode, stm_only_large_name); gFileInfoToolTip.Assign(FFileInfoToolTip); Result := []; end; end. doublecmd-0.5.8/src/frames/foptionskeyboard.lfm0000644000175000017500000000633712020403374020640 0ustar alexxalexxinherited frmOptionsKeyboard: TfrmOptionsKeyboard Height = 223 Width = 429 ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ClientHeight = 223 ClientWidth = 429 DesignTop = 20 object gbTyping: TGroupBox[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 103 Top = 6 Width = 417 Anchors = [akTop, akLeft, akRight] AutoSize = True Caption = 'Typing' ChildSizing.LeftRightSpacing = 8 ChildSizing.TopBottomSpacing = 8 ChildSizing.VerticalSpacing = 12 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 85 ClientWidth = 413 TabOrder = 0 object lblNoModifier: TLabel Left = 8 Height = 13 Top = 8 Width = 84 Caption = '&Letters' FocusControl = cbNoModifier ParentColor = False end object cbNoModifier: TComboBox AnchorSideLeft.Control = lblNoModifier AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblNoModifier AnchorSideTop.Side = asrCenter AnchorSideRight.Control = gbTyping AnchorSideRight.Side = asrBottom Left = 102 Height = 24 Top = 2 Width = 303 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 ItemHeight = 0 Items.Strings = ( 'None' 'Command Line' 'Quick Search' 'Quick Filter' ) Style = csDropDownList TabOrder = 0 end object lblAlt: TLabel Left = 8 Height = 13 Top = 33 Width = 84 Caption = 'Alt+L&etters' FocusControl = cbAlt ParentColor = False end object lblCtrlAlt: TLabel Left = 8 Height = 13 Top = 58 Width = 84 Caption = 'Ctrl+Alt+Le&tters' FocusControl = cbCtrlAlt ParentColor = False end object cbAlt: TComboBox AnchorSideLeft.Control = lblAlt AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblAlt AnchorSideTop.Side = asrCenter AnchorSideRight.Control = gbTyping AnchorSideRight.Side = asrBottom Left = 102 Height = 25 Top = 27 Width = 303 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 ItemHeight = 0 Style = csDropDownList TabOrder = 1 end object cbCtrlAlt: TComboBox AnchorSideLeft.Control = lblCtrlAlt AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblCtrlAlt AnchorSideTop.Side = asrCenter AnchorSideRight.Control = gbTyping AnchorSideRight.Side = asrBottom Left = 102 Height = 25 Top = 52 Width = 303 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 ItemHeight = 0 Style = csDropDownList TabOrder = 2 end end object cbLynxLike: TCheckBox[1] AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbTyping AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 6 Height = 20 Top = 117 Width = 302 BorderSpacing.Top = 8 Caption = 'Le&ft, Right arrows change directory (Lynx-like movement)' TabOrder = 1 end end doublecmd-0.5.8/src/frames/foptionsplugins.lfm0000644000175000017500000003531312132053450020515 0ustar alexxalexxinherited frmOptionsPlugins: TfrmOptionsPlugins Height = 376 Width = 604 ClientHeight = 376 ClientWidth = 604 DesignTop = 27 object pcPluginsTypes: TPageControl[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner Left = 0 Height = 84 Top = 0 Width = 604 ActivePage = tsWCX Align = alTop TabIndex = 0 TabOrder = 6 OnChange = pcPluginsTypesChange object tsWCX: TTabSheet Caption = 'Pac&ker plugins (.WCX)' ClientHeight = 58 ClientWidth = 596 OnShow = tsWCXShow object lblWCXDescription: TLabel AnchorSideLeft.Control = tsWCX AnchorSideTop.Control = tsWCX AnchorSideRight.Control = tsWCX AnchorSideRight.Side = asrBottom Left = 10 Height = 13 Top = 12 Width = 576 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Top = 12 BorderSpacing.Right = 10 Caption = 'Pack&er plugins are used to work with archives' FocusControl = stgPlugins ParentColor = False WordWrap = True end end object tsWFX: TTabSheet Caption = 'F&ile system plugins (.WFX)' ClientHeight = 58 ClientWidth = 596 OnShow = tsWFXShow object lblWFXDescription: TLabel AnchorSideTop.Control = tsWFX AnchorSideRight.Control = tsWFX AnchorSideRight.Side = asrBottom Left = 10 Height = 13 Top = 12 Width = 576 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Top = 12 BorderSpacing.Right = 10 Caption = 'Fi&le system plugins allow access to disks inaccessible by operating system or to external devices like Palm/PocketPC.' FocusControl = stgPlugins ParentColor = False WordWrap = True end end object tsWDX: TTabSheet Caption = 'Content pl&ugins (.WDX)' ClientHeight = 45 ClientWidth = 598 OnShow = tsWDXShow object lblWDXDescription: TLabel AnchorSideLeft.Control = tsWDX AnchorSideTop.Control = tsWDX AnchorSideRight.Control = tsWDX AnchorSideRight.Side = asrBottom Left = 10 Height = 40 Top = 12 Width = 578 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Top = 12 BorderSpacing.Right = 10 Caption = 'Content plu&gins allow to display extended file details like mp3 tags or image attributes in file lists, or use them in search and multi-rename tool' FocusControl = stgPlugins ParentColor = False WordWrap = True end end object tsDSX: TTabSheet Caption = '&Search plugins (.DSX)' ClientHeight = 45 ClientWidth = 598 OnShow = tsDSXShow object lblDSXDescription: TLabel AnchorSideLeft.Control = tsDSX AnchorSideTop.Control = tsDSX AnchorSideRight.Control = tsDSX AnchorSideRight.Side = asrBottom Left = 10 Height = 40 Top = 12 Width = 578 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Top = 12 BorderSpacing.Right = 10 Caption = 'Searc&h plugins allow to use alternative search algorithms or external tools (like "locate", etc.)' FocusControl = stgPlugins ParentColor = False WordWrap = True end end object tsWLX: TTabSheet Caption = '&Viewer plugins (.WLX)' ClientHeight = 45 ClientWidth = 598 OnShow = tsWLXShow object lblWLXDescription: TLabel AnchorSideLeft.Control = tsWLX AnchorSideTop.Control = tsWLX AnchorSideRight.Control = tsWLX AnchorSideRight.Side = asrBottom Left = 10 Height = 40 Top = 12 Width = 578 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Top = 12 BorderSpacing.Right = 10 Caption = 'Vie&wer plugins allow to display file formats like images, spreadsheets, databases etc. in Viewer (F3, Ctrl+Q)' FocusControl = stgPlugins ParentColor = False WordWrap = True end end end object stgPlugins: TStringGrid[1] AnchorSideLeft.Control = pcPluginsTypes AnchorSideTop.Control = pcPluginsTypes AnchorSideTop.Side = asrBottom AnchorSideRight.Control = pcPluginsTypes AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = btnTweakPlugin Left = 0 Height = 242 Top = 84 Width = 604 Anchors = [akTop, akLeft, akRight, akBottom] AutoAdvance = aaRightDown AutoFillColumns = True BorderSpacing.Bottom = 12 ColCount = 4 Columns = < item Alignment = taCenter MaxSize = 80 SizePriority = 0 Title.Caption = 'Active' Width = 70 end item SizePriority = 0 Title.Caption = 'Plugin' Width = 183 end item SizePriority = 0 Title.Caption = 'Registered for' Width = 183 end item SizePriority = 0 Title.Caption = 'File name' Width = 164 end> FixedCols = 0 Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goColSizing, goRowSelect, goThumbTracking, goSmoothScroll, goHeaderHotTracking, goHeaderPushedLook] RowCount = 1 TabOrder = 0 TitleStyle = tsNative OnBeforeSelection = stgPluginsBeforeSelection OnMouseDown = stgPluginsMouseDown OnMouseUp = stgPluginsMouseUp OnSelection = stgPluginsSelection ColWidths = ( 70 183 183 164 ) end object btnAddPlugin: TBitBtn[2] AnchorSideRight.Control = btnEnablePlugin AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 22 Height = 30 Top = 338 Width = 110 Anchors = [akRight, akBottom] BorderSpacing.Right = 6 BorderSpacing.Bottom = 8 Cancel = True Caption = 'A&dd' Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000009E9E9EA38181 81FF818181FF818181FF818181FF818181FF818181FF818181FF818181FF8181 81FF818181FF818181FF818181FF9E9E9E950000000000000000818181FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFF818181FF0000000000000000818181FFFFFF FFFFEDEDEDFFEDEDEDFFEEEEEEFFEFEFEFFFEFEFEFFFF0F0F0FFF0F0F0FFF1F1 F1FFF2F2F2FFF2F2F2FFFFFFFFFF818181FF0000000000000000818181FFFFFF FFFFEDEDEDFFEDEDEDFFEEEEEEFFEEEEEEFFEFEFEFFFF0F0F0FFF0F0F0FFF1F1 F1FFF1F1F1FFF2F2F2FFFFFFFFFF818181FF0000000000000000818181FFFFFF FFFFECECECFFEDEDEDFFEEEEEEFFEEEEEEFFEFEFEFFFEFEFEFFFF0F0F0FFF1F1 F1FFF1F1F1FFF1F1F1FFFFFFFFFF818181FF0000000000000000818181FFFFFF FFFFECECECFFECECECFFEDEDEDFFEDEDEDFFEEEEEEFFEEEEEEFFEFEFEFFFEFEF EFFFF0F0F0FFF0F0F0FFFFFFFFFF818181FF0000000000000000818181FFFFFF FFFFECECECFFECECECFFEDEDEDFFEDEDEDFFEEEEEEFFEEEEEEFFEFEFEFFFEFEF EFFFEFEFEFFFF0F0F0FFFFFFFFFF818181FF0000000000000000818181FFFFFF FFFFEBEBEBFFECECECFFECECECFFEDEDEDFFEDEDEDFFEEEEEEFFEEEEEEFFE2EE EEFFB1F0F3FF92F0F5FF9AF0F5FF779696FF0000000000000000818181FFFFFF FFFFEBEBEBFFEBEBEBFFECECECFFECECECFFEDEDEDFFEDEDEDFFE0EEEFFF96EF F4FF63F1F8FF46F3FBFF45F3FBFF5DEFF7FD36DDE67603F3FF01818181FFFFFF FFFFEBEBEBFFEBEBEBFFECECECFFECECECFFECECECFFEDEDEDFFB1EEF1FF67F1 F8FF40F4FDFF71F7FDFF72F7FDFF43F3FCFE24ECF6B60AF3FF25818181FFFFFF FFFFEAEAEAFFEBEBEBFFEBEBEBFFECECECFFECECECFFECECECFF9BEFF3FF4EF2 FAFF6AF6FDFFBBFAFEFFBFFBFEFF6EF6FDFF22F0FAD20DF3FF50818181FFFFFF FFFFEAEAEAFFEAEAEAFFEBEBEBFFEBEBEBFFECECECFFECECECFF9CEEF2FF4EF2 FAFF67F6FDFFB5FAFEFFB8FAFEFF6BF5FDFF22EFFAD10DF3FF5C818181FFFFFF FFFFECECECFFEAEAEAFFEAEAEAFFEBEBEBFFEBEBEBFFEBEBEBFFB4EDF0FF6AF0 F7FF3AF4FCFF68F6FDFF6AF6FDFF3CF2FBFD1EEFF9A909F3FF37818181FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9BEE F2FF69F0F7FF4DF2FAFF46EFF7FA28EBF4B60DF3FF6102F3FF099E9E9EA38181 81FF818181FF818181FF818181FF818181FF818181FF818181FF818181FF7C8C 8CFF729F9FFF6AAEAFFF36E4ED8A09F3FF4502F3FF0F00000000 } TabOrder = 1 end object btnEnablePlugin: TBitBtn[3] AnchorSideRight.Control = btnRemovePlugin AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 138 Height = 30 Top = 338 Width = 110 Anchors = [akRight, akBottom] BorderSpacing.Right = 6 BorderSpacing.Bottom = 8 Caption = 'E&nable' OnClick = btnEnablePluginClick TabOrder = 2 end object btnRemovePlugin: TBitBtn[4] AnchorSideRight.Control = btnTweakPlugin AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 254 Height = 30 Top = 338 Width = 110 Anchors = [akRight, akBottom] BorderSpacing.Right = 6 BorderSpacing.Bottom = 8 Caption = '&Remove' Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00008B9C1F008C9DED008D9EEC008D 9E9E008B9C21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00008B9C13008D9EE24FC3D2FD5BD3E1FF30B5 C6FA0890A1F6008D9FA9008B9C14FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00008E9FC536B5C5FA5FD8E7FF26CADFFF4ED4 E5FF6DD9E7FF32B4C5FB008D9EE6008B9C26FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00008B9C431A9BABF66CDAE8FF10C5DCFF03C2DAFF03C2 DAFF15C6DCFF5BD7E7FF56C8D6FE058FA0F1008B9C3FFFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00018EA0D45ECFDDFF46DAEDFF18D0E7FF11CBE3FF07C4 DCFF03C2DAFF03C2DAFF4CD3E4FF58CDDCFF048E9FF4008B9C1CFFFFFF00FFFF FF00FFFFFF00008B9C1A1194A5F78BEDFBFF3CE5FCFF37E4FBFF2FDEF6FF23D7 EEFF14CDE5FF04C3DBFF03C2DAFF56D6E6FF33B6C6FB008E9FA8FFFFFF00FFFF FF00FFFFFF00007F9C5F2FB0C0F58AEFFDFF5FEAFDFF61EBFDFF52E9FDFF3CE6 FDFF2ADBF3FF18D0E7FF10C6DCFF49D2E4FF67D4E2FF018D9FE9FFFFFF00FFFF FF00008B9C070024A1D71342ADFC84EAFBFF6BECFDFF84EFFDFF6DECFDFF52E9 FDFF44E5FBFF65E3F3FF77DDEBFF49C1CFFE1B9EAEF3008C9DEAFFFFFF00008B 9C5F008D9EEB29A5BBF6284ABBFF1D38B8FF61D8F6FF63EAFDFF6CEBFDFF7DEE FDFF88EAF8FF45BECDFA058F9FF7008E9FA3008B9C40008B9C02FFFFFF00008B 9C5A018D9EF64FC8D8FF68DCECFF336DC8FF0D1BABFF62B1D7FF72DCEAFF43BD CCF70990A2F6018E9F9F008B9C1BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000064878100889CFE41BDCDFF77DEEBFF1769B0F70036A0E4018FA0D2008C 9D77008B9C15FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000487802004A 7B95014E80F40B76B2FF0188A1FF32AEBEFE1DA0B1F2008B9C3DFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000049796F0352 86F40F7ABCFF107DC1FF015284F200859ACE008B9CFF008B9C29FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00004A7BED0C72 B2FF107DC1FF0A6BA9FF004A7BDA00698A02008B9C82008B9C13FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00004A7BE50A69 A6FF0B6DABFF004A7BF500487844FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000048783B004B 7CDA004A7BE300487847FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } OnClick = btnRemovePluginClick TabOrder = 3 end object btnTweakPlugin: TBitBtn[5] AnchorSideRight.Control = btnConfigPlugin AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 370 Height = 30 Top = 338 Width = 110 Anchors = [akRight, akBottom] BorderSpacing.Right = 6 BorderSpacing.Bottom = 8 Caption = '&Tweak' Glyph.Data = { 36040000424D3604000000000000360000002800000010000000100000000100 2000000000000004000064000000640000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000009595 95B4818181FF818181FF818181FF818181FF818181FF818181FF818181FF8181 81FF818181FF818181FF818181FF818181FF959595A800000000000000008181 81FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF818181FF00000000000000008181 81FFFFFFFFFFEDEDEDFFEDEDEDFFEEEEEEFFEFEFEFFFEFEFEFFFF0F0F0FFF0F0 F0FFE0E0E0FFADADADFFBABABAFFFFFFFFFF818181FF00000000000000008181 81FFFFFFFFFFEDEDEDFFC6C6C6FFC7C7C7FFC7C7C7FFC8C8C8FFC8C8C8FFB5B5 B5FF929292FF9E9E9EFFABABABFFFFFFFFFF818181FF00000000000000008181 81FFFFFFFFFFECECECFFEDEDEDFFEEEEEEFFEEEEEEFFEFEFEFFFD4D4D4FF7777 77FF858585FF909090FF9D9D9DFFFFFFFFFF818181FF00000000000000008181 81FFFFFFFFFFECECECFFB0B0B0FF585858FF585858FF585858FF585858FF5959 59FF626262FF6C6C6CFFDCDCDCFFFFFFFFFF818181FF00000000000000008181 81FFFFFFFFFFECECECFF696969FF696969FF696969FF6A6A6AFF6A6A6AFF6A6A 6AFF6A6A6AFFD6D6D6FFF0F0F0FFFFFFFFFF818181FF00000000000000008181 81FFFFFFFFFFEBEBEBFF585858FF585858FFB0B0B0FF585858FF6A6A6AFF6A6A 6AFFCCD2D2FFEEEEEEFFF0F0F0FFFFFFFFFF818181FF00000000000000008181 81FFFFFFFFFFEBEBEBFF696969FFD2D2D2FFECECECFFD2D2D2FF696969FF6669 69FFECECECFFEEEEEEFFF0F0F0FFFFFFFFFF818181FF00000000000000008181 81FFFFFFFFFFEBEBEBFFC5C5C5FFC6C6C6FFB0B0B0FF585858FF585858FF5858 58FFC6C6C6FFC7C7C7FFF0F0F0FFFFFFFFFF818181FF00000000000000008181 81FFFFFFFFFFEAEAEAFFEBEBEBFFEBEBEBFF696969FF696969FF696969FFD2D2 D2FFEDEDEDFFEEEEEEFFF0F0F0FFFFFFFFFF818181FF00000000000000008181 81FFFFFFFFFFEAEAEAFFC4C4C4FFC5C5C5FFC5C5C5FFC6C6C6FFC6C6C6FFC6C6 C6FFC6C6C6FFC7C7C7FFF0F0F0FFFFFFFFFF818181FF00000000000000008181 81FFFFFFFFFFECECECFFEAEAEAFFEAEAEAFFEBEBEBFFEBEBEBFFEBEBEBFFECEC ECFFECECECFFEDEDEDFFF0F0F0FFFFFFFFFF818181FF00000000000000008181 81FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF818181FF00000000000000009999 99AC818181FF818181FF818181FF818181FF818181FF818181FF818181FF8181 81FF818181FF818181FF818181FF818181FF8181815600000000 } OnClick = btnTweakPluginClick TabOrder = 4 end object btnConfigPlugin: TBitBtn[6] AnchorSideRight.Control = stgPlugins AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 486 Height = 30 Top = 338 Width = 110 Anchors = [akRight, akBottom] BorderSpacing.Right = 8 BorderSpacing.Bottom = 8 Caption = 'Con&figure' OnClick = btnConfigPluginClick TabOrder = 5 end end doublecmd-0.5.8/src/frames/foptionscustomcolumns.lfm0000644000175000017500000000613112020403374021743 0ustar alexxalexxinherited frmOptionsCustomColumns: TfrmOptionsCustomColumns Height = 372 Width = 730 ClientHeight = 372 ClientWidth = 730 DesignTop = 20 object lblConfigColumns: TLabel[0] AnchorSideTop.Control = cbbFileSystem AnchorSideTop.Side = asrCenter Left = 7 Height = 13 Top = 6 Width = 167 Caption = 'Con&figure columns for file system:' FocusControl = cbbFileSystem ParentColor = False end object cbbFileSystem: TComboBox[1] AnchorSideLeft.Control = lblConfigColumns AnchorSideLeft.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 178 Height = 24 Top = 0 Width = 546 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 4 BorderSpacing.Right = 6 ItemHeight = 0 ItemIndex = 0 Items.Strings = ( 'General' ) Style = csDropDownList TabOrder = 0 Text = 'General' end object lstColumnsSets: TListBox[2] AnchorSideLeft.Control = Owner AnchorSideTop.Control = cbbFileSystem AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = pnlButtons Left = 6 Height = 284 Top = 30 Width = 718 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 6 BorderSpacing.Top = 6 BorderSpacing.Right = 6 BorderSpacing.Bottom = 6 ItemHeight = 0 OnDblClick = btnEditColumnsSetClick ScrollWidth = 716 TabOrder = 1 TopIndex = -1 end object pnlButtons: TPanel[3] AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 7 Height = 46 Top = 320 Width = 717 Anchors = [akLeft, akRight, akBottom] BorderSpacing.Right = 6 BorderSpacing.Bottom = 6 ClientHeight = 46 ClientWidth = 717 TabOrder = 2 object btnNewColumnsSet: TButton AnchorSideLeft.Control = pnlButtons Left = 7 Height = 32 Top = 7 Width = 118 BorderSpacing.Left = 6 Caption = '&New' OnClick = btnNewColumnsSetClick TabOrder = 0 end object btnEditColumnsSet: TButton AnchorSideLeft.Control = btnNewColumnsSet AnchorSideLeft.Side = asrBottom Left = 131 Height = 32 Top = 7 Width = 116 BorderSpacing.Left = 6 Caption = '&Edit' OnClick = btnEditColumnsSetClick TabOrder = 1 end object btnDelColumnsSet: TButton AnchorSideRight.Control = btnCopyColumnsSet Left = 481 Height = 32 Top = 7 Width = 112 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = '&Delete' OnClick = btnDelColumnsSetClick TabOrder = 2 end object btnCopyColumnsSet: TButton AnchorSideRight.Control = pnlButtons AnchorSideRight.Side = asrBottom Left = 599 Height = 32 Top = 7 Width = 111 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = 'C&opy' OnClick = btnCopyColumnsSetClick TabOrder = 3 end end end doublecmd-0.5.8/src/frames/foptionsfileoperations.lfm0000644000175000017500000001664012020403374022061 0ustar alexxalexxinherited frmOptionsFileOperations: TfrmOptionsFileOperations Height = 602 Width = 734 ClientHeight = 602 ClientWidth = 734 DesignTop = 27 object gbUserInterface: TGroupBox[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 299 Top = 6 Width = 722 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = 'User interface' ChildSizing.LeftRightSpacing = 10 ChildSizing.TopBottomSpacing = 4 ChildSizing.HorizontalSpacing = 4 ChildSizing.VerticalSpacing = 4 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 276 ClientWidth = 718 TabOrder = 0 object lblProgressKind: TLabel Left = 10 Height = 18 Top = 4 Width = 371 BorderSpacing.Bottom = 10 Caption = 'Show operations progress &initially in' FocusControl = cbProgressKind ParentColor = False end object cbProgressKind: TComboBox AnchorSideLeft.Control = lblProgressKind AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblProgressKind AnchorSideTop.Side = asrCenter AnchorSideRight.Side = asrBottom Left = 385 Height = 30 Top = -2 Width = 316 Anchors = [akTop, akLeft, akRight] ItemHeight = 0 Style = csDropDownList TabOrder = 0 end object cbDropReadOnlyFlag: TCheckBox Left = 10 Height = 23 Top = 32 Width = 371 Caption = 'D&rop readonly flag' TabOrder = 1 end object cbRenameSelOnlyName: TCheckBox AnchorSideTop.Side = asrBottom Left = 10 Height = 23 Top = 59 Width = 371 Caption = 'Select &file name without extension when renaming' TabOrder = 2 end object cbShowCopyTabSelectPanel: TCheckBox Left = 10 Height = 23 Top = 86 Width = 371 Caption = 'Sho&w tab select panel in copy/move dialog' TabOrder = 3 end object cbDeleteToTrash: TCheckBox Left = 10 Height = 23 Top = 113 Width = 371 Caption = 'Dele&te to recycle bin (Shift key reverses this setting)' OnChange = cbDeleteToTrashChange TabOrder = 4 end object bvlConfirmations: TBevel AnchorSideLeft.Control = gbUserInterface AnchorSideTop.Control = cbDeleteToTrash AnchorSideTop.Side = asrBottom AnchorSideRight.Control = gbUserInterface AnchorSideRight.Side = asrBottom Left = 10 Height = 2 Top = 140 Width = 698 Anchors = [akTop, akLeft, akRight] end object lblConfirmations: TLabel Left = 10 Height = 18 Top = 146 Width = 371 BorderSpacing.Top = 10 Caption = 'Show confirmation window for:' ParentColor = False end object cbCopyConfirmation: TCheckBox Left = 10 Height = 23 Top = 168 Width = 371 Caption = 'Cop&y operation' TabOrder = 5 end object cbMoveConfirmation: TCheckBox Left = 10 Height = 23 Top = 195 Width = 371 Caption = '&Move operation' TabOrder = 6 end object cbDeleteConfirmation: TCheckBox Left = 10 Height = 23 Top = 222 Width = 371 Caption = '&Delete operation' TabOrder = 7 end object cbDeleteToTrashConfirmation: TCheckBox Left = 10 Height = 23 Top = 249 Width = 371 Caption = 'D&elete to trash operation' TabOrder = 8 end end object gbExecutingOperations: TGroupBox[1] AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbUserInterface AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 137 Top = 311 Width = 722 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = 'Executing operations' ChildSizing.LeftRightSpacing = 10 ChildSizing.TopBottomSpacing = 4 ChildSizing.HorizontalSpacing = 4 ChildSizing.VerticalSpacing = 4 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 114 ClientWidth = 718 TabOrder = 1 object lblBufferSize: TLabel Left = 10 Height = 18 Top = 4 Width = 393 BorderSpacing.Bottom = 10 Caption = '&Buffer size for file operations (in KB):' FocusControl = edtBufferSize ParentColor = False end object edtBufferSize: TEdit AnchorSideLeft.Control = lblBufferSize AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblBufferSize AnchorSideTop.Side = asrCenter AnchorSideBottom.Side = asrCenter Left = 407 Height = 28 Top = -1 Width = 80 TabOrder = 0 end object lblWipePassNumber: TLabel Left = 10 Height = 18 Top = 32 Width = 393 BorderSpacing.Bottom = 10 Caption = '&Number of wipe passes:' FocusControl = seWipePassNumber ParentColor = False end object seWipePassNumber: TSpinEdit AnchorSideLeft.Control = lblWipePassNumber AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblWipePassNumber AnchorSideTop.Side = asrCenter Left = 407 Height = 28 Top = 27 Width = 50 TabOrder = 1 end object cbProcessComments: TCheckBox Left = 10 Height = 23 Top = 60 Width = 393 Caption = '&Process comments with files/folders' TabOrder = 2 end object cbSkipFileOpError: TCheckBox Left = 10 Height = 23 Top = 87 Width = 393 Caption = 'S&kip file operations errors and write them to log window' TabOrder = 3 end end object gbFileSearch: TGroupBox[2] AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbExecutingOperations AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 112 Top = 454 Width = 722 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = 'File search' ChildSizing.LeftRightSpacing = 10 ChildSizing.TopBottomSpacing = 4 ChildSizing.HorizontalSpacing = 4 ChildSizing.VerticalSpacing = 4 ClientHeight = 89 ClientWidth = 718 TabOrder = 2 object rbUseMmapInSearch: TRadioButton AnchorSideLeft.Control = gbFileSearch AnchorSideTop.Control = gbFileSearch Left = 10 Height = 23 Top = 4 Width = 308 Caption = 'Use memory mapping for search te&xt in files' TabOrder = 0 end object rbUseStreamInSearch: TRadioButton AnchorSideLeft.Control = rbUseMmapInSearch AnchorSideTop.Control = rbUseMmapInSearch AnchorSideTop.Side = asrBottom Left = 10 Height = 23 Top = 33 Width = 245 BorderSpacing.Top = 6 Caption = '&Use stream for search text in files' Checked = True TabOrder = 1 TabStop = True end object cbPartialNameSearch: TCheckBox AnchorSideLeft.Control = rbUseStreamInSearch AnchorSideTop.Control = rbUseStreamInSearch AnchorSideTop.Side = asrBottom Left = 10 Height = 23 Top = 62 Width = 201 BorderSpacing.Top = 6 Caption = '&Search for part of file name' TabOrder = 2 end end end doublecmd-0.5.8/src/frames/foptionsautorefresh.lrt0000644000175000017500000000101512020403374021376 0ustar alexxalexxTFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHENABLE.CAPTION=Refresh file list TFRMOPTIONSAUTOREFRESH.CBWATCHFILENAMECHANGE.CAPTION=When &files are created, deleted or renamed TFRMOPTIONSAUTOREFRESH.CBWATCHATTRIBUTESCHANGE.CAPTION=When &size, date or attributes change TFRMOPTIONSAUTOREFRESH.GBAUTOREFRESHDISABLE.CAPTION=Disable auto-refresh TFRMOPTIONSAUTOREFRESH.CBWATCHONLYFOREGROUND.CAPTION=When application is in the &background TFRMOPTIONSAUTOREFRESH.CBWATCHEXCLUDEDIRS.CAPTION=For the following &paths and their subdirectories: doublecmd-0.5.8/src/frames/foptionsfilesviews.pas0000644000175000017500000001541712024554637021241 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Files views options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsFilesViews; {$mode objfpc}{$H+} interface uses Classes, SysUtils, StdCtrls, Graphics, ExtCtrls, fOptionsFrame; type { TfrmOptionsFilesViews } TfrmOptionsFilesViews = class(TOptionsEditor) cbDateTimeFormat: TComboBox; cbHighlightUpdatedFiles: TCheckBox; cbDirBrackets: TCheckBox; cbListFilesInThread: TCheckBox; cbLoadIconsSeparately: TCheckBox; cbDelayLoadingTabs: TCheckBox; cbUpdatedFilesPosition: TComboBox; cbShowSystemFiles: TCheckBox; cbNewFilesPosition: TComboBox; cbSortMethod: TComboBox; cbSpaceMovesDown: TCheckBox; cbCaseSensitivity: TComboBox; cbSortFolderMode: TComboBox; cbFileSizeFormat: TComboBox; gbFormatting: TGroupBox; gbSorting: TGroupBox; gbMisc: TGroupBox; lblDateTimeExample: TLabel; lblUpdatedFilesPosition: TLabel; lblSortFolderMode: TLabel; lblCaseSensitivity: TLabel; lblDateTimeFormat: TLabel; lblNewFilesPosition: TLabel; lblSortMethod: TLabel; lblFileSizeFormat: TLabel; pnlDateTime: TPanel; procedure cbDateTimeFormatChange(Sender: TObject); private FIncorrectFormatMessage: string; protected procedure Init; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public procedure AfterConstruction; override; class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses DCStrUtils, uGlobs, uLng, uTypes; { TfrmOptionsFilesViews } procedure TfrmOptionsFilesViews.cbDateTimeFormatChange(Sender: TObject); begin try lblDateTimeExample.Caption:= FormatDateTime(cbDateTimeFormat.Text, Now); lblDateTimeExample.Font.Color := clDefault; except on E: EConvertError do begin lblDateTimeExample.Caption:= FIncorrectFormatMessage; lblDateTimeExample.Font.Color := clRed; end; end; end; procedure TfrmOptionsFilesViews.Init; begin ParseLineToList(rsOptSortMethod, cbSortMethod.Items); ParseLineToList(rsOptSortCaseSens, cbCaseSensitivity.Items); ParseLineToList(rsOptSortFolderMode, cbSortFolderMode.Items); ParseLineToList(rsOptNewFilesPosition, cbNewFilesPosition.Items); ParseLineToList(rsOptUpdatedFilesPosition, cbUpdatedFilesPosition.Items); ParseLineToList(rsOptFileSizeFormat, cbFileSizeFormat.Items); end; procedure TfrmOptionsFilesViews.Load; begin case gSortCaseSensitivity of cstNotSensitive: cbCaseSensitivity.ItemIndex := 0; cstLocale: cbCaseSensitivity.ItemIndex := 1; cstCharValue: cbCaseSensitivity.ItemIndex := 2; end; if not gSortNatural then cbSortMethod.ItemIndex:= 0 else cbSortMethod.ItemIndex:= 1; case gSortFolderMode of sfmSortNameShowFirst: cbSortFolderMode.ItemIndex := 0; sfmSortLikeFileShowFirst: cbSortFolderMode.ItemIndex := 1; sfmSortLikeFile: cbSortFolderMode.ItemIndex := 2; end; case gNewFilesPosition of nfpTop: cbNewFilesPosition.ItemIndex := 0; nfpTopAfterDirectories: cbNewFilesPosition.ItemIndex := 1; nfpSortedPosition: cbNewFilesPosition.ItemIndex := 2; nfpBottom: cbNewFilesPosition.ItemIndex := 3; end; case gUpdatedFilesPosition of ufpNoChange: cbUpdatedFilesPosition.ItemIndex := 0; ufpSameAsNewFiles: cbUpdatedFilesPosition.ItemIndex := 1; ufpSortedPosition: cbUpdatedFilesPosition.ItemIndex := 2; end; cbFileSizeFormat.ItemIndex := Ord(gFileSizeFormat); cbDateTimeFormat.Text := gDateTimeFormat; lblDateTimeExample.Caption:= FormatDateTime(cbDateTimeFormat.Text, Now); cbSpaceMovesDown.Checked := gSpaceMovesDown; cbDirBrackets.Checked := gDirBrackets; cbShowSystemFiles.Checked:= gShowSystemFiles; {$IFDEF LCLCARBON} // Under Mac OS X loading file list in separate thread are very very slow // so disable and hide this option under Mac OS X Carbon cbListFilesInThread.Visible:= False; {$ELSE} cbListFilesInThread.Checked:= gListFilesInThread; {$ENDIF} cbLoadIconsSeparately.Checked:= gLoadIconsSeparately; cbDelayLoadingTabs.Checked:= gDelayLoadingTabs; cbHighlightUpdatedFiles.Checked:= gHighlightUpdatedFiles; end; function TfrmOptionsFilesViews.Save: TOptionsEditorSaveFlags; begin case cbCaseSensitivity.ItemIndex of 0: gSortCaseSensitivity := cstNotSensitive; 1: gSortCaseSensitivity := cstLocale; 2: gSortCaseSensitivity := cstCharValue; end; gSortNatural := (cbSortMethod.ItemIndex = 1); case cbSortFolderMode.ItemIndex of 0: gSortFolderMode := sfmSortNameShowFirst; 1: gSortFolderMode := sfmSortLikeFileShowFirst; 2: gSortFolderMode := sfmSortLikeFile; end; case cbNewFilesPosition.ItemIndex of 0: gNewFilesPosition := nfpTop; 1: gNewFilesPosition := nfpTopAfterDirectories; 2: gNewFilesPosition := nfpSortedPosition; 3: gNewFilesPosition := nfpBottom; end; case cbUpdatedFilesPosition.ItemIndex of 0: gUpdatedFilesPosition := ufpNoChange; 1: gUpdatedFilesPosition := ufpSameAsNewFiles; 2: gUpdatedFilesPosition := ufpSortedPosition; end; gFileSizeFormat := TFileSizeFormat(cbFileSizeFormat.ItemIndex); gDateTimeFormat := GetValidDateTimeFormat(cbDateTimeFormat.Text, gDateTimeFormat); gSpaceMovesDown := cbSpaceMovesDown.Checked; gDirBrackets := cbDirBrackets.Checked; gShowSystemFiles:= cbShowSystemFiles.Checked; gListFilesInThread:= cbListFilesInThread.Checked; gLoadIconsSeparately:= cbLoadIconsSeparately.Checked; gDelayLoadingTabs := cbDelayLoadingTabs.Checked; gHighlightUpdatedFiles := cbHighlightUpdatedFiles.Checked; Result := []; end; procedure TfrmOptionsFilesViews.AfterConstruction; begin inherited AfterConstruction; //save localized "Incorrect format" string FIncorrectFormatMessage := lblDateTimeExample.Caption; end; class function TfrmOptionsFilesViews.GetIconIndex: Integer; begin Result := 29; end; class function TfrmOptionsFilesViews.GetTitle: String; begin Result := rsOptionsEditorFilesViews; end; end. doublecmd-0.5.8/src/frames/foptionsfilepanelscolors.lrt0000644000175000017500000000263012020403374022417 0ustar alexxalexxTFRMOPTIONSFILEPANELSCOLORS.LBLTEXTCOLOR.CAPTION=T&ext Color: TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR.CAPTION=Bac&kground: TFRMOPTIONSFILEPANELSCOLORS.LBLBACKGROUNDCOLOR2.CAPTION=Backg&round 2: TFRMOPTIONSFILEPANELSCOLORS.LBLMARKCOLOR.CAPTION=&Mark Color: TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORCOLOR.CAPTION=C&ursor Color: TFRMOPTIONSFILEPANELSCOLORS.LBLCURSORTEXT.CAPTION=Cursor Te&xt: TFRMOPTIONSFILEPANELSCOLORS.BTNFORECOLOR.CAPTION=>> TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR.CAPTION=>> TFRMOPTIONSFILEPANELSCOLORS.BTNMARKCOLOR.CAPTION=>> TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORCOLOR.CAPTION=>> TFRMOPTIONSFILEPANELSCOLORS.BTNCURSORTEXT.CAPTION=>> TFRMOPTIONSFILEPANELSCOLORS.BTNBACKCOLOR2.CAPTION=>> TFRMOPTIONSFILEPANELSCOLORS.GBEXAMPLE.CAPTION=Example TFRMOPTIONSFILEPANELSCOLORS.CBBUSEINVERTEDSELECTION.CAPTION=U&se Inverted Selection TFRMOPTIONSFILEPANELSCOLORS.LBLINACTIVEPANELBRIGHTNESS.CAPTION=&Brightness level of inactive panel TFRMOPTIONSFILEPANELSCOLORS.CBBUSEFRAMECURSOR.CAPTION=Use &Frame Cursor TFRMOPTIONSFILEPANELSCOLORS.LBLINDCOLOR.CAPTION=&Indicator Fore Color: TFRMOPTIONSFILEPANELSCOLORS.LBLINDBACKCOLOR.CAPTION=In&dicator Back Color: TFRMOPTIONSFILEPANELSCOLORS.BTNINDCOLOR.CAPTION=>> TFRMOPTIONSFILEPANELSCOLORS.BTNINDBACKCOLOR.CAPTION=>> TFRMOPTIONSFILEPANELSCOLORS.CBBUSEGRADIENTIND.CAPTION=Use &Gradient Indicator TFRMOPTIONSFILEPANELSCOLORS.DBFREESPACEINDICATOR.CAPTION=Drive Free Space Indicator doublecmd-0.5.8/src/frames/foptionsframe.pas0000644000175000017500000001460211740762416020146 0ustar alexxalexxunit fOptionsFrame; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, fgl; type TOptionsEditorInitFlag = (oeifLoad); TOptionsEditorInitFlags = set of TOptionsEditorInitFlag; TOptionsEditorSaveFlag = (oesfNeedsRestart); TOptionsEditorSaveFlags = set of TOptionsEditorSaveFlag; TOptionsEditor = class; TOptionsEditorClass = class of TOptionsEditor; TOptionsEditorClassList = class; { IOptionsDialog } {$interfaces corba} IOptionsDialog = interface ['{E62AAF5E-74ED-49AB-93F2-DBE210BF6723}'] procedure LoadSettings; function GetEditor(EditorClass: TOptionsEditorClass): TOptionsEditor; end; {$interfaces default} { TOptionsEditor } TOptionsEditor = class(TFrame) private FOptionsDialog: IOptionsDialog; protected procedure Init; virtual; procedure Done; virtual; procedure Load; virtual; function Save: TOptionsEditorSaveFlags; virtual; property OptionsDialog: IOptionsDialog read FOptionsDialog; public destructor Destroy; override; class function GetIconIndex: Integer; virtual; abstract; class function GetTitle: String; virtual; abstract; class function IsEmpty: Boolean; virtual; procedure LoadSettings; function SaveSettings: TOptionsEditorSaveFlags; procedure Init(AParent: TWinControl; AOptionsDialog: IOptionsDialog; Flags: TOptionsEditorInitFlags); end; { TOptionsEditorRec } TOptionsEditorRec = class private FChildren: TOptionsEditorClassList; FEditorClass: TOptionsEditorClass; function GetChildren: TOptionsEditorClassList; public constructor Create; destructor Destroy; override; function Add(Editor: TOptionsEditorClass): TOptionsEditorRec; function HasChildren: Boolean; property Children: TOptionsEditorClassList read GetChildren; property EditorClass: TOptionsEditorClass read FEditorClass write FEditorClass; end; { TBaseOptionsEditorClassList } TBaseOptionsEditorClassList = specialize TFPGObjectList; { TOptionsEditorClassList } TOptionsEditorClassList = class(TBaseOptionsEditorClassList) public function Add(Editor: TOptionsEditorClass): TOptionsEditorRec; overload; end; var OptionsEditorClassList: TOptionsEditorClassList = nil; implementation uses fOptionsArchivers, fOptionsAutoRefresh, fOptionsBehavior, fOptionsColumnsView, fOptionsConfiguration, fOptionsCustomColumns, fOptionsDragDrop, fOptionsDrivesListButton, fOptionsFileOperations, fOptionsFilePanelsColors, fOptionsFileTypesColors, fOptionsFilesViews, fOptionsFonts, fOptionsGroups, fOptionsHotkeys, fOptionsIcons, fOptionsIgnoreList, fOptionsKeyboard, fOptionsLanguage, fOptionsLayout, fOptionsLog, fOptionsMisc, fOptionsMouse, fOptionsPlugins, fOptionsQuickSearchFilter, fOptionsTabs, fOptionsTerminal, fOptionsToolbar, fOptionsTools, fOptionsEditorColors, fOptionsToolTips; { TOptionsEditorRec } function TOptionsEditorRec.GetChildren: TOptionsEditorClassList; begin if not Assigned(FChildren) then FChildren := TOptionsEditorClassList.Create; Result := FChildren; end; constructor TOptionsEditorRec.Create; begin FChildren := nil; end; destructor TOptionsEditorRec.Destroy; begin inherited Destroy; FreeAndNil(FChildren); end; function TOptionsEditorRec.Add(Editor: TOptionsEditorClass): TOptionsEditorRec; begin Result := Children.Add(Editor); end; function TOptionsEditorRec.HasChildren: Boolean; begin Result := Assigned(FChildren) and (FChildren.Count > 0); end; { TOptionsEditorClassList } function TOptionsEditorClassList.Add(Editor: TOptionsEditorClass): TOptionsEditorRec; begin Result := TOptionsEditorRec.Create; Add(Result); Result.EditorClass:= Editor; end; { TOptionsEditor } procedure TOptionsEditor.Init; begin // Empty. end; procedure TOptionsEditor.Done; begin // Empty. end; destructor TOptionsEditor.Destroy; begin Done; inherited Destroy; end; class function TOptionsEditor.IsEmpty: Boolean; begin Result := False; end; procedure TOptionsEditor.LoadSettings; begin DisableAutoSizing; try Load; finally EnableAutoSizing; end; end; function TOptionsEditor.SaveSettings: TOptionsEditorSaveFlags; begin Result := Save; end; procedure TOptionsEditor.Load; begin // Empty. end; function TOptionsEditor.Save: TOptionsEditorSaveFlags; begin Result := []; end; procedure TOptionsEditor.Init(AParent: TWinControl; AOptionsDialog: IOptionsDialog; Flags: TOptionsEditorInitFlags); begin DisableAutoSizing; try Parent := AParent; FOptionsDialog := AOptionsDialog; Init; if oeifLoad in Flags then LoadSettings; finally EnableAutoSizing; end; end; procedure MakeEditorsClassList; var Main: TOptionsEditorClassList absolute OptionsEditorClassList; Colors, ColumnsView, FilesViews, Keyboard, Layout, Mouse, Tools, Editor: TOptionsEditorRec; begin Main.Add(TfrmOptionsLanguage); Main.Add(TfrmOptionsBehavior); Tools := Main.Add(TOptionsToolsGroup); Tools.Add(TfrmOptionsViewer); Editor:= Tools.Add(TfrmOptionsEditor); Editor.Add(TfrmOptionsEditorColors); Tools.Add(TfrmOptionsDiffer); Tools.Add(TfrmOptionsTerminal); Main.Add(TfrmOptionsFonts); Colors := Main.Add(TOptionsColorsGroup); Colors.Add(TfrmOptionsFilePanelsColors); Colors.Add(TfrmOptionsFileTypesColors); Keyboard := Main.Add(TfrmOptionsKeyboard); Keyboard.Add(TfrmOptionsHotkeys); Mouse := Main.Add(TfrmOptionsMouse); Mouse.Add(TfrmOptionsDragDrop); FilesViews := Main.Add(TfrmOptionsFilesViews); ColumnsView := FilesViews.Add(TfrmOptionsColumnsView); ColumnsView.Add(TfrmOptionsCustomColumns); Main.Add(TfrmOptionsPlugins); Layout := Main.Add(TfrmOptionsLayout); Layout.Add(TfrmOptionsDrivesListButton); Main.Add(TfrmOptionsToolbar); Main.Add(TfrmOptionsFileOperations); Main.Add(TfrmOptionsTabs); Main.Add(TfrmOptionsLog); Main.Add(TfrmOptionsConfiguration); Main.Add(TfrmOptionsQuickSearchFilter); Main.Add(TfrmOptionsMisc); Main.Add(TfrmOptionsAutoRefresh); Main.Add(TfrmOptionsIcons); Main.Add(TfrmOptionsIgnoreList); Main.Add(TfrmOptionsArchivers); Main.Add(TfrmOptionsToolTips); end; initialization OptionsEditorClassList:= TOptionsEditorClassList.Create; MakeEditorsClassList; finalization if Assigned(OptionsEditorClassList) then FreeAndNil(OptionsEditorClassList); end. doublecmd-0.5.8/src/frames/fquicksearch.pas0000644000175000017500000003731412014201074017726 0ustar alexxalexxunit fQuickSearch; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, StdCtrls, LCLType, LCLProc, ExtCtrls, Buttons; type TQuickSearchMode = (qsSearch, qsFilter); TQuickSearchDirection = (qsdNone, qsdFirst, qsdLast, qsdNext, qsdPrevious); TQuickSearchMatch = (qsmBeginning, qsmEnding); TQuickSearchCase = (qscSensitive, qscInsensitive); TQuickSearchItems = (qsiFiles, qsiDirectories, qsiFilesAndDirectories); TQuickSearchOptions = record Match: set of TQuickSearchMatch; SearchCase: TQuickSearchCase; Items: TQuickSearchItems; end; TOnChangeSearch = procedure(Sender: TObject; ASearchText: UTF8String; const ASearchOptions: TQuickSearchOptions; Direction: TQuickSearchDirection = qsdNone) of Object; TOnChangeFilter = procedure(Sender: TObject; AFilterText: UTF8String; const AFilterOptions: TQuickSearchOptions) of Object; TOnExecute = procedure(Sender: TObject) of Object; TOnHide = procedure(Sender: TObject) of Object; { TfrmQuickSearch } TfrmQuickSearch = class(TFrame) btnCancel: TButton; edtSearch: TEdit; pnlOptions: TPanel; sbMatchBeginning: TSpeedButton; sbMatchEnding: TSpeedButton; sbCaseSensitive: TSpeedButton; sbFiles: TSpeedButton; sbDirectories: TSpeedButton; tglFilter: TToggleBox; procedure btnCancelClick(Sender: TObject); procedure edtSearchChange(Sender: TObject); procedure edtSearchKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FrameExit(Sender: TObject); procedure sbCaseSensitiveClick(Sender: TObject); procedure sbFilesAndDirectoriesClick(Sender: TObject); procedure sbMatchBeginningClick(Sender: TObject); procedure sbMatchEndingClick(Sender: TObject); procedure tglFilterChange(Sender: TObject); private Options: TQuickSearchOptions; Mode: TQuickSearchMode; Active: Boolean; FilterOptions: TQuickSearchOptions; FilterText: String; Finalizing: Boolean; FUpdateCount: Integer; FNeedsChangeSearch: Boolean; procedure BeginUpdate; procedure CheckFilesOrDirectoriesDown; procedure EndUpdate; procedure DoHide; procedure DoOnChangeSearch; {en Loads control states from options values } procedure LoadControlStates; procedure PushFilter; procedure PopFilter; procedure ClearFilter; procedure CancelFilter; procedure ProcessParams(const Params: array of String); public OnChangeSearch: TOnChangeSearch; OnChangeFilter: TOnChangeFilter; OnExecute: TOnExecute; OnHide: TOnHide; constructor Create(TheOwner: TWinControl); reintroduce; destructor Destroy; override; procedure Execute(SearchMode: TQuickSearchMode; const Params: array of String; Char: TUTF8Char = #0); procedure Finalize; function CheckSearchOrFilter(var Key: Word): Boolean; overload; function CheckSearchOrFilter(var UTF8Key: TUTF8Char): Boolean; overload; end; {en Allows to compare TQuickSearchOptions structures } operator = (qsOptions1, qsOptions2: TQuickSearchOptions) CompareResult: Boolean; implementation uses uKeyboard, uGlobs, uFormCommands; const { Parameters: "filter" - set filtering (on/off/toggle) "matchbeginning" - set match beginning option (on/off/toggle) "matchending" - set match ending option (on/off/toggle) "casesensitive" - set case sensitive searching (on/off/toggle) "files" - set filtering files (on/off/toggle) "directories" - set filtering directories (on/off/toggle) "filesdirectories" - toggle between files, directories and both (no value) "text"="<...>" - set <...> as new text to search/filter (string) 'toggle' switches between on and off } // parameters for quick search / filter actions PARAMETER_FILTER = 'filter'; PARAMETER_MATCH_BEGINNING = 'matchbeginning'; PARAMETER_MATCH_ENDING = 'matchending'; PARAMETER_CASE_SENSITIVE = 'casesensitive'; PARAMETER_FILES = 'files'; PARAMETER_DIRECTORIES = 'directories'; PARAMETER_FILES_DIRECTORIES = 'filesdirectories'; PARAMETER_TEXT = 'text'; TOGGLE_VALUE = 'toggle'; {$R *.lfm} operator = (qsOptions1, qsOptions2: TQuickSearchOptions) CompareResult: Boolean; begin Result := True; if qsOptions1.Match <> qsOptions2.Match then Result := False; if qsOptions1.Items <> qsOptions2.Items then Result := False; if qsOptions1.SearchCase <> qsOptions2.SearchCase then Result := False; end; function GetBoolState(const Value: String; OldState: Boolean): Boolean; begin if Value = TOGGLE_VALUE then Result := not OldState else if not GetBoolValue(Value, Result) then Result := OldState; end; { TfrmQuickSearch } constructor TfrmQuickSearch.Create(TheOwner: TWinControl); begin inherited Create(TheOwner); Self.Parent := TheOwner; // load default options Options := gQuickSearchOptions; LoadControlStates; FilterOptions := gQuickSearchOptions; FilterText := EmptyStr; Finalizing := False; HotMan.Register(Self.edtSearch, 'Quick Search'); end; destructor TfrmQuickSearch.Destroy; begin if Assigned(HotMan) then HotMan.UnRegister(Self.edtSearch); inherited Destroy; end; procedure TfrmQuickSearch.DoOnChangeSearch; begin if FUpdateCount > 0 then FNeedsChangeSearch := True else begin case Self.Mode of qsSearch: if Assigned(Self.OnChangeSearch) then Self.OnChangeSearch(Self, edtSearch.Text, Options); qsFilter: if Assigned(Self.OnChangeFilter) then Self.OnChangeFilter(Self, edtSearch.Text, Options); end; FNeedsChangeSearch := False; end; end; procedure TfrmQuickSearch.Execute(SearchMode: TQuickSearchMode; const Params: array of String; Char: TUTF8Char = #0); begin tglFilter.Checked := SearchMode = qsFilter; Self.Visible := True; if not edtSearch.Focused then begin edtSearch.SetFocus; if Char = #0 then edtSearch.SelectAll; end; if Char <> #0 then edtSearch.SelText := Char; Self.Active := True; ProcessParams(Params); end; procedure TfrmQuickSearch.Finalize; begin PopFilter; Self.Visible := False; end; procedure TfrmQuickSearch.ProcessParams(const Params: array of String); var Param: String; Value: String; begin BeginUpdate; try for Param in Params do begin if GetParamValue(Param, PARAMETER_FILTER, Value) then begin tglFilter.Checked := GetBoolState(Value, tglFilter.Checked); end else if GetParamValue(Param, PARAMETER_MATCH_BEGINNING, Value) then begin sbMatchBeginning.Down := GetBoolState(Value, sbMatchBeginning.Down); sbMatchBeginningClick(nil); end else if GetParamValue(Param, PARAMETER_MATCH_ENDING, Value) then begin sbMatchEnding.Down := GetBoolState(Value, sbMatchEnding.Down); sbMatchEndingClick(nil); end else if GetParamValue(Param, PARAMETER_CASE_SENSITIVE, Value) then begin sbCaseSensitive.Down := GetBoolState(Value, sbCaseSensitive.Down); sbCaseSensitiveClick(nil); end else if GetParamValue(Param, PARAMETER_FILES, Value) then begin sbFiles.Down := GetBoolState(Value, sbFiles.Down); sbFilesAndDirectoriesClick(nil); end else if GetParamValue(Param, PARAMETER_DIRECTORIES, Value) then begin sbDirectories.Down := GetBoolState(Value, sbDirectories.Down); sbFilesAndDirectoriesClick(nil); end else if Param = PARAMETER_FILES_DIRECTORIES then begin if sbFiles.Down and sbDirectories.Down then sbDirectories.Down := False else if sbFiles.Down then begin sbDirectories.Down := True; sbFiles.Down := False; end else if sbDirectories.Down then sbFiles.Down := True; sbFilesAndDirectoriesClick(nil); end else if GetParamValue(Param, PARAMETER_TEXT, Value) then begin edtSearch.Text := Value; edtSearch.SelectAll; end; end; CheckFilesOrDirectoriesDown; finally EndUpdate; end; end; function TfrmQuickSearch.CheckSearchOrFilter(var Key: Word): Boolean; var ModifierKeys: TShiftState; SearchOrFilterModifiers: TShiftState; SearchMode: TQuickSearchMode; UTF8Char: TUTF8Char; KeyTypingModifier: TKeyTypingModifier; begin Result := False; ModifierKeys := GetKeyShiftStateEx; for KeyTypingModifier in TKeyTypingModifier do begin if gKeyTyping[KeyTypingModifier] in [ktaQuickSearch, ktaQuickFilter] then begin SearchOrFilterModifiers := TKeyTypingModifierToShift[KeyTypingModifier]; if ((SearchOrFilterModifiers <> []) and (ModifierKeys * KeyModifiersShortcutNoText = SearchOrFilterModifiers)) {$IFDEF MSWINDOWS} // Entering international characters with Ctrl+Alt on Windows. or (HasKeyboardAltGrKey and (SearchOrFilterModifiers = []) and (ModifierKeys * KeyModifiersShortcutNoText = [ssCtrl, ssAlt])) {$ENDIF} then begin if (Key <> VK_SPACE) or (edtSearch.Text <> '') then begin UTF8Char := VirtualKeyToUTF8Char(Key, ModifierKeys - SearchOrFilterModifiers); Result := (UTF8Char <> '') and (not ((Length(UTF8Char) = 1) and (UTF8Char[1] in [#0..#31]))); if Result then begin Key := 0; case gKeyTyping[KeyTypingModifier] of ktaQuickSearch: SearchMode := qsSearch; ktaQuickFilter: SearchMode := qsFilter; end; Self.Execute(SearchMode, [], UTF8Char); end; end; Exit; end; end; end; end; function TfrmQuickSearch.CheckSearchOrFilter(var UTF8Key: TUTF8Char): Boolean; var ModifierKeys: TShiftState; SearchMode: TQuickSearchMode; begin Result := False; // Check for certain Ascii keys. if (Length(UTF8Key) = 1) and (UTF8Key[1] in [#0..#32,'+','-','*']) then Exit; ModifierKeys := GetKeyShiftStateEx; if gKeyTyping[ktmNone] in [ktaQuickSearch, ktaQuickFilter] then begin if ModifierKeys * KeyModifiersShortcutNoText = TKeyTypingModifierToShift[ktmNone] then begin // Make upper case if either caps-lock is toggled or shift pressed. if (ssCaps in ModifierKeys) xor (ssShift in ModifierKeys) then UTF8Key := UTF8UpperCase(UTF8Key) else UTF8Key := UTF8LowerCase(UTF8Key); case gKeyTyping[ktmNone] of ktaQuickSearch: SearchMode := qsSearch; ktaQuickFilter: SearchMode := qsFilter; end; Self.Execute(SearchMode, [], UTF8Key); UTF8Key := ''; Result := True; Exit; end; end; end; procedure TfrmQuickSearch.LoadControlStates; begin sbDirectories.Down := (Options.Items = qsiDirectories) or (Options.Items = qsiFilesAndDirectories); sbFiles.Down := (Options.Items = qsiFiles) or (Options.Items = qsiFilesAndDirectories); sbCaseSensitive.Down := Options.SearchCase = qscSensitive; sbMatchBeginning.Down := qsmBeginning in Options.Match; sbMatchEnding.Down := qsmEnding in Options.Match; end; procedure TfrmQuickSearch.PushFilter; begin FilterText := edtSearch.Text; FilterOptions := Options; end; procedure TfrmQuickSearch.PopFilter; begin edtSearch.Text := FilterText; // there was no filter saved, do not continue loading if FilterText = EmptyStr then Exit; Options := FilterOptions; LoadControlStates; FilterText := EmptyStr; tglFilter.Checked := True; end; procedure TfrmQuickSearch.ClearFilter; begin FilterText := EmptyStr; FilterOptions := Options; if Assigned(Self.OnChangeFilter) then Self.OnChangeFilter(Self, EmptyStr, FilterOptions); end; procedure TfrmQuickSearch.CancelFilter; begin Finalize; {$IFDEF LCLGTK2} // On GTK2 OnExit for frame is not called when it is hidden, // but only when a control from outside of frame gains focus. FrameExit(nil); {$ENDIF} DoHide; end; procedure TfrmQuickSearch.CheckFilesOrDirectoriesDown; begin if not (sbFiles.Down or sbDirectories.Down) then begin // unchecking both should not be possible, so recheck last unchecked case Options.Items of qsiFiles: sbFiles.Down := True; qsiDirectories: sbDirectories.Down := True; end; end; end; procedure TfrmQuickSearch.edtSearchChange(Sender: TObject); begin DoOnChangeSearch; end; procedure TfrmQuickSearch.BeginUpdate; begin Inc(FUpdateCount); end; procedure TfrmQuickSearch.btnCancelClick(Sender: TObject); begin CancelFilter; end; procedure TfrmQuickSearch.edtSearchKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if CheckSearchOrFilter(Key) then Exit; case Key of VK_DOWN: begin Key := 0; if Assigned(Self.OnChangeSearch) then Self.OnChangeSearch(Self, edtSearch.Text, Options, qsdNext); end; VK_UP: begin Key := 0; if Assigned(Self.OnChangeSearch) then Self.OnChangeSearch(Self, edtSearch.Text, Options, qsdPrevious); end; (* // disabled as they can conflict with trying to get to start/end position // of edtSearch VK_HOME: begin Key := 0; if Assigned(Self.OnChangeSearch) then Self.OnChangeSearch(Self, edtSearch.Text, Options, qsdFirst); end; VK_END: begin Key := 0; if Assigned(Self.OnChangeSearch) then Self.OnChangeSearch(Self, edtSearch.Text, Options, qsdLast); end; *) VK_RETURN, VK_SELECT: begin Key := 0; if Assigned(Self.OnExecute) then Self.OnExecute(Self); CancelFilter; end; VK_TAB: begin Key := 0; DoHide; end; VK_ESCAPE: begin Key := 0; CancelFilter; end; end; end; procedure TfrmQuickSearch.EndUpdate; begin Dec(FUpdateCount); if FUpdateCount = 0 then begin if FNeedsChangeSearch then DoOnChangeSearch; end; end; procedure TfrmQuickSearch.DoHide; begin if Assigned(Self.OnHide) then Self.OnHide(Self); end; procedure TfrmQuickSearch.FrameExit(Sender: TObject); begin if not Finalizing then begin Finalizing := True; Self.Active := False; if (Mode = qsFilter) and (edtSearch.Text <> EmptyStr) then Self.Visible := not gQuickFilterAutoHide else Finalize; Finalizing := False; end; end; procedure TfrmQuickSearch.sbCaseSensitiveClick(Sender: TObject); begin if sbCaseSensitive.Down then Options.SearchCase := qscSensitive else Options.SearchCase := qscInsensitive; DoOnChangeSearch; end; procedure TfrmQuickSearch.sbFilesAndDirectoriesClick(Sender: TObject); begin if sbFiles.Down and sbDirectories.Down then Options.Items := qsiFilesAndDirectories else if sbFiles.Down then Options.Items := qsiFiles else if sbDirectories.Down then Options.Items := qsiDirectories else if FUpdateCount = 0 then begin CheckFilesOrDirectoriesDown; Exit; end; DoOnChangeSearch; end; procedure TfrmQuickSearch.sbMatchBeginningClick(Sender: TObject); begin if sbMatchBeginning.Down then Include(Options.Match, qsmBeginning) else Exclude(Options.Match, qsmBeginning); DoOnChangeSearch; end; procedure TfrmQuickSearch.sbMatchEndingClick(Sender: TObject); begin if sbMatchEnding.Down then Include(Options.Match, qsmEnding) else Exclude(Options.Match, qsmEnding); DoOnChangeSearch; end; procedure TfrmQuickSearch.tglFilterChange(Sender: TObject); begin if tglFilter.Checked then Mode := qsFilter else Mode := qsSearch; // if a filter was set in background and a search is opened, the filter // will get pushed staying active. Otherwise the filter wil be converted // in a search if not Active and (Mode = qsSearch) then PushFilter else if Active then ClearFilter; DoOnChangeSearch; end; end. doublecmd-0.5.8/src/frames/foptionscolumnsview.pas0000644000175000017500000000535111740427612021424 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Columns files view options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsColumnsView; {$mode objfpc}{$H+} interface uses Classes, SysUtils, fOptionsFrame, StdCtrls; type { TfrmOptionsColumnsView } TfrmOptionsColumnsView = class(TOptionsEditor) cbCutTextToColWidth: TCheckBox; cbGridHorzLine: TCheckBox; cbGridVertLine: TCheckBox; chkAutoFillColumns: TCheckBox; cmbAutoSizeColumn: TComboBox; gbShowGrid: TGroupBox; grpMisc: TGroupBox; grpAutosizeColumns: TGroupBox; lblAutoSizeColumn: TLabel; protected procedure Init; override; procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses DCStrUtils, uGlobs, uLng; { TfrmOptionsColumnsView } procedure TfrmOptionsColumnsView.Init; begin ParseLineToList(rsOptAutoSizeColumn, cmbAutoSizeColumn.Items); end; procedure TfrmOptionsColumnsView.Load; begin cbGridVertLine.Checked := gGridVertLine; cbGridHorzLine.Checked := gGridHorzLine; chkAutoFillColumns.Checked := gAutoFillColumns; cmbAutoSizeColumn.ItemIndex := gAutoSizeColumn; cbCutTextToColWidth.Checked := gCutTextToColWidth; end; function TfrmOptionsColumnsView.Save: TOptionsEditorSaveFlags; begin gGridVertLine := cbGridVertLine.Checked; gGridHorzLine := cbGridHorzLine.Checked; gAutoFillColumns := chkAutoFillColumns.Checked; gAutoSizeColumn := cmbAutoSizeColumn.ItemIndex; gCutTextToColWidth := cbCutTextToColWidth.Checked; Result := []; end; class function TfrmOptionsColumnsView.GetIconIndex: Integer; begin Result := 13; end; class function TfrmOptionsColumnsView.GetTitle: String; begin Result := rsOptionsEditorColumnsView; end; end. doublecmd-0.5.8/src/frames/foptionsarchivers.lfm0000644000175000017500000003533312020403374021024 0ustar alexxalexxinherited frmOptionsArchivers: TfrmOptionsArchivers Height = 642 Width = 901 ClientHeight = 642 ClientWidth = 901 DesignTop = 27 object lbxMultiArc: TListBox[0] Left = 0 Height = 642 Top = 0 Width = 55 Align = alLeft ItemHeight = 0 OnSelectionChange = lbxMultiArcSelectionChange ScrollWidth = 53 TabOrder = 0 TopIndex = -1 end object splMultiArc: TSplitter[1] Left = 55 Height = 642 Top = 0 Width = 5 end object pnlArchiverCommands: TPanel[2] Left = 60 Height = 642 Top = 0 Width = 841 Align = alClient BevelOuter = bvNone ClientHeight = 642 ClientWidth = 841 TabOrder = 2 object pcArchiverCommands: TPageControl AnchorSideLeft.Control = pnlArchiverCommands AnchorSideTop.Control = pnlArchiverCommands AnchorSideRight.Control = pnlArchiverCommands Left = 0 Height = 592 Top = 0 Width = 841 HelpType = htKeyword HelpKeyword = '/multiarc.html' ActivePage = tbArchiverGeneral Align = alClient Anchors = [akTop, akLeft, akRight] TabIndex = 0 TabOrder = 0 object tbArchiverGeneral: TTabSheet Caption = 'General' ClientHeight = 553 ClientWidth = 835 object lblDescription: TLabel AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 10 Width = 811 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Top = 10 BorderSpacing.Right = 10 Caption = 'De&scription:' FocusControl = edtDescription ParentColor = False end object edtDescription: TEdit AnchorSideLeft.Control = lblDescription AnchorSideTop.Control = lblDescription AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblDescription AnchorSideRight.Side = asrBottom Left = 10 Height = 28 Top = 28 Width = 811 Anchors = [akTop, akLeft, akRight] TabOrder = 0 end object lblArchiver: TLabel AnchorSideTop.Control = edtDescription AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 58 Width = 811 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Top = 2 BorderSpacing.Right = 10 Caption = 'Arc&hiver:' FocusControl = fneArchiver ParentColor = False end object lblArchiveExtension: TLabel AnchorSideTop.Control = fneArchiver AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 106 Width = 811 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Top = 2 BorderSpacing.Right = 10 Caption = 'E&xtension:' FocusControl = edtArchiveExtension ParentColor = False end object edtArchiveExtension: TEdit AnchorSideLeft.Control = lblDescription AnchorSideTop.Control = lblArchiveExtension AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblDescription AnchorSideRight.Side = asrBottom Left = 10 Height = 28 Top = 124 Width = 811 Anchors = [akTop, akLeft, akRight] TabOrder = 2 end object lblArchiveList: TLabel AnchorSideTop.Control = edtArchiveExtension AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 154 Width = 811 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Top = 2 BorderSpacing.Right = 10 Caption = '&List:' FocusControl = edtArchiveList ParentColor = False end object edtArchiveList: TEdit AnchorSideLeft.Control = lblDescription AnchorSideTop.Control = lblArchiveList AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblDescription AnchorSideRight.Side = asrBottom Left = 10 Height = 28 Top = 172 Width = 811 Anchors = [akTop, akLeft, akRight] TabOrder = 3 end object lblArchiveExtract: TLabel AnchorSideTop.Control = memArchiveListFormat AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 376 Width = 811 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Top = 2 BorderSpacing.Right = 10 Caption = 'Ex&tract:' FocusControl = edtArchiveExtract ParentColor = False end object edtArchiveExtract: TEdit AnchorSideLeft.Control = lblDescription AnchorSideTop.Control = lblArchiveExtract AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblDescription AnchorSideRight.Side = asrBottom Left = 10 Height = 28 Top = 394 Width = 811 Anchors = [akTop, akLeft, akRight] TabOrder = 7 end object lblArchiveAdd: TLabel AnchorSideTop.Control = edtArchiveExtract AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 424 Width = 811 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Top = 2 BorderSpacing.Right = 10 Caption = 'Add&ing:' FocusControl = edtArchiveAdd ParentColor = False end object edtArchiveAdd: TEdit AnchorSideLeft.Control = lblDescription AnchorSideTop.Control = lblArchiveAdd AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblDescription AnchorSideRight.Side = asrBottom Left = 10 Height = 28 Top = 442 Width = 811 Anchors = [akTop, akLeft, akRight] TabOrder = 8 end object lblArchiveListFormat: TLabel AnchorSideTop.Control = edtArchiveListEnd AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 296 Width = 811 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Top = 2 BorderSpacing.Right = 10 Caption = 'Listing for&mat:' FocusControl = memArchiveListFormat ParentColor = False end object memArchiveListFormat: TMemo AnchorSideTop.Control = lblArchiveListFormat AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 10 Height = 60 Top = 314 Width = 811 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Right = 10 Lines.Strings = ( '' ) ScrollBars = ssAutoBoth TabOrder = 6 WordWrap = False end object fneArchiver: TFileNameEdit AnchorSideLeft.Control = lblDescription AnchorSideTop.Control = lblArchiver AnchorSideTop.Side = asrBottom AnchorSideRight.Side = asrBottom Left = 10 Height = 28 Top = 76 Width = 789 DialogOptions = [] FilterIndex = 0 HideDirectories = False ButtonWidth = 23 NumGlyphs = 1 Anchors = [akTop, akLeft, akRight] MaxLength = 0 TabOrder = 1 end object lblArchiveListStart: TLabel AnchorSideLeft.Control = lblDescription AnchorSideTop.Control = edtArchiveList AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblDescription AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 202 Width = 811 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 2 Caption = 'Listin&g start (optional):' FocusControl = edtArchiveListStart ParentColor = False end object edtArchiveListStart: TEdit AnchorSideLeft.Control = lblDescription AnchorSideTop.Control = lblArchiveListStart AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblDescription AnchorSideRight.Side = asrBottom Left = 10 Height = 28 Top = 220 Width = 811 Anchors = [akTop, akLeft, akRight] TabOrder = 4 end object lblArchiveListEnd: TLabel AnchorSideLeft.Control = lblDescription AnchorSideTop.Control = edtArchiveListStart AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblDescription AnchorSideRight.Side = asrBottom Left = 10 Height = 18 Top = 248 Width = 811 Anchors = [akTop, akLeft, akRight] Caption = 'Listing &finish (optional):' FocusControl = edtArchiveListEnd ParentColor = False end object edtArchiveListEnd: TEdit AnchorSideLeft.Control = lblDescription AnchorSideTop.Control = lblArchiveListEnd AnchorSideTop.Side = asrBottom AnchorSideRight.Control = lblDescription AnchorSideRight.Side = asrBottom Left = 10 Height = 28 Top = 266 Width = 811 Anchors = [akTop, akLeft, akRight] TabOrder = 5 end end object tbArchiverAdditional: TTabSheet HelpType = htKeyword HelpKeyword = '/multiarc.html' Caption = 'Additional' ChildSizing.LeftRightSpacing = 10 ChildSizing.TopBottomSpacing = 10 ClientHeight = 553 ClientWidth = 835 OnShow = tbArchiverAdditionalShow object stgArchiverCommands: TStringGrid Left = 10 Height = 469 Top = 10 Width = 815 Align = alClient AutoFillColumns = True ColCount = 2 DefaultColWidth = 128 Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goColSizing, goEditing, goSmoothScroll] RowCount = 10 TabOrder = 0 OnPrepareCanvas = stgArchiverCommandsPrepareCanvas ColWidths = ( 64 749 ) end object gbArchiverOptions: TGroupBox Left = 10 Height = 62 Top = 481 Width = 815 Align = alBottom Anchors = [akLeft, akRight] AutoSize = True BorderSpacing.Top = 2 Caption = 'Options' ChildSizing.LeftRightSpacing = 10 ChildSizing.TopBottomSpacing = 8 ClientHeight = 39 ClientWidth = 811 TabOrder = 1 object chkMultiArcOutput: TCheckBox AnchorSideTop.Control = gbArchiverOptions Left = 10 Height = 23 Top = 8 Width = 162 Caption = 'S&how console output' TabOrder = 0 end object chkMultiArcDebug: TCheckBox AnchorSideTop.Control = gbArchiverOptions AnchorSideTop.Side = asrCenter AnchorSideRight.Control = gbArchiverOptions AnchorSideRight.Side = asrBottom Left = 697 Height = 23 Top = 8 Width = 104 Anchors = [akTop, akRight] Caption = 'De&bug mode' TabOrder = 1 end end end end object pnlMultiArcButtons: TPanel Left = 0 Height = 50 Top = 592 Width = 841 Align = alBottom BevelOuter = bvNone ClientHeight = 50 ClientWidth = 841 TabOrder = 1 object btnMultiArcApply: TBitBtn AnchorSideTop.Control = pnlMultiArcButtons AnchorSideTop.Side = asrCenter AnchorSideRight.Control = pnlMultiArcButtons AnchorSideRight.Side = asrBottom Left = 731 Height = 30 Top = 10 Width = 100 Anchors = [akTop, akRight] BorderSpacing.Right = 10 Caption = 'A&pply' OnClick = btnMultiArcApplyClick TabOrder = 5 end object btnMultiArcRename: TBitBtn AnchorSideTop.Control = btnMultiArcApply AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnMultiArcApply Left = 625 Height = 30 Top = 10 Width = 100 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = '&Rename' OnClick = btnMultiArcRenameClick TabOrder = 4 end object btnMultiArcDelete: TBitBtn AnchorSideTop.Control = btnMultiArcApply AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnMultiArcRename Left = 519 Height = 30 Top = 10 Width = 100 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = 'D&elete' OnClick = btnMultiArcDeleteClick TabOrder = 3 end object btnMultiArcAdd: TBitBtn AnchorSideTop.Control = btnMultiArcApply AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnMultiArcDelete Left = 413 Height = 30 Top = 10 Width = 100 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = 'A&dd' OnClick = btnMultiArcAddClick TabOrder = 2 end object chkMultiArcEnabled: TCheckBox AnchorSideLeft.Control = pnlMultiArcButtons AnchorSideTop.Control = pnlMultiArcButtons AnchorSideTop.Side = asrCenter AnchorSideRight.Control = btnAutoConfig Left = 10 Height = 23 Top = 14 Width = 260 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 10 BorderSpacing.Right = 6 Caption = 'E&nabled' OnChange = chkMultiArcEnabledChange TabOrder = 0 end object btnAutoConfig: TBitBtn AnchorSideTop.Control = btnMultiArcApply AnchorSideRight.Control = btnMultiArcAdd Left = 276 Height = 30 Top = 10 Width = 131 Anchors = [akTop, akRight] BorderSpacing.Right = 6 Caption = 'A&uto Configure' OnClick = btnAutoConfigClick TabOrder = 1 end end end end doublecmd-0.5.8/src/frames/foptionsfileoperations.lrt0000644000175000017500000000323612020403374022101 0ustar alexxalexxTFRMOPTIONSFILEOPERATIONS.GBUSERINTERFACE.CAPTION=User interface TFRMOPTIONSFILEOPERATIONS.LBLPROGRESSKIND.CAPTION=Show operations progress &initially in TFRMOPTIONSFILEOPERATIONS.CBDROPREADONLYFLAG.CAPTION=D&rop readonly flag TFRMOPTIONSFILEOPERATIONS.CBRENAMESELONLYNAME.CAPTION=Select &file name without extension when renaming TFRMOPTIONSFILEOPERATIONS.CBSHOWCOPYTABSELECTPANEL.CAPTION=Sho&w tab select panel in copy/move dialog TFRMOPTIONSFILEOPERATIONS.CBDELETETOTRASH.CAPTION=Dele&te to recycle bin (Shift key reverses this setting) TFRMOPTIONSFILEOPERATIONS.LBLCONFIRMATIONS.CAPTION=Show confirmation window for: TFRMOPTIONSFILEOPERATIONS.CBCOPYCONFIRMATION.CAPTION=Cop&y operation TFRMOPTIONSFILEOPERATIONS.CBMOVECONFIRMATION.CAPTION=&Move operation TFRMOPTIONSFILEOPERATIONS.CBDELETECONFIRMATION.CAPTION=&Delete operation TFRMOPTIONSFILEOPERATIONS.CBDELETETOTRASHCONFIRMATION.CAPTION=D&elete to trash operation TFRMOPTIONSFILEOPERATIONS.GBEXECUTINGOPERATIONS.CAPTION=Executing operations TFRMOPTIONSFILEOPERATIONS.LBLBUFFERSIZE.CAPTION=&Buffer size for file operations (in KB): TFRMOPTIONSFILEOPERATIONS.LBLWIPEPASSNUMBER.CAPTION=&Number of wipe passes: TFRMOPTIONSFILEOPERATIONS.CBPROCESSCOMMENTS.CAPTION=&Process comments with files/folders TFRMOPTIONSFILEOPERATIONS.CBSKIPFILEOPERROR.CAPTION=S&kip file operations errors and write them to log window TFRMOPTIONSFILEOPERATIONS.GBFILESEARCH.CAPTION=File search TFRMOPTIONSFILEOPERATIONS.RBUSEMMAPINSEARCH.CAPTION=Use memory mapping for search te&xt in files TFRMOPTIONSFILEOPERATIONS.RBUSESTREAMINSEARCH.CAPTION=&Use stream for search text in files TFRMOPTIONSFILEOPERATIONS.CBPARTIALNAMESEARCH.CAPTION=&Search for part of file name doublecmd-0.5.8/src/frames/foptionsterminal.pas0000644000175000017500000000362711740433676020677 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Terminal options page Copyright (C) 2006-2011 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fOptionsTerminal; {$mode objfpc}{$H+} interface uses Classes, SysUtils, fOptionsFrame, StdCtrls; type { TfrmOptionsTerminal } TfrmOptionsTerminal = class(TOptionsEditor) edtRunInTerm: TEdit; edtRunTerm: TEdit; lblRunInTerm: TLabel; lblRunTerm: TLabel; protected procedure Load; override; function Save: TOptionsEditorSaveFlags; override; public class function GetIconIndex: Integer; override; class function GetTitle: String; override; end; implementation {$R *.lfm} uses uGlobs, uLng; { TfrmOptionsTerminal } procedure TfrmOptionsTerminal.Load; begin edtRunInTerm.Text := gRunInTerm; edtRunTerm.Text := gRunTerm; end; function TfrmOptionsTerminal.Save: TOptionsEditorSaveFlags; begin gRunInTerm := edtRunInTerm.Text; gRunTerm := edtRunTerm.Text; Result := []; end; class function TfrmOptionsTerminal.GetIconIndex: Integer; begin Result := 24; end; class function TfrmOptionsTerminal.GetTitle: String; begin Result := rsOptionsEditorTerminal; end; end. doublecmd-0.5.8/src/frames/foptionshotkeys.lfm0000644000175000017500000001440512020403374020521 0ustar alexxalexxinherited frmOptionsHotkeys: TfrmOptionsHotkeys Height = 513 Width = 808 ClientHeight = 513 ClientWidth = 808 DesignTop = 20 object lblCategories: TLabel[0] AnchorSideLeft.Control = lbxCategories AnchorSideTop.Control = Owner Left = 317 Height = 13 Top = 6 Width = 55 BorderSpacing.Top = 6 Caption = 'C&ategories:' FocusControl = lbxCategories ParentColor = False end object lblCommands: TLabel[1] AnchorSideLeft.Control = lbSCFilesList AnchorSideTop.Control = edtFilter Left = 6 Height = 13 Top = 79 Width = 57 BorderSpacing.Top = 6 Caption = 'Co&mmands:' FocusControl = stgCommands ParentColor = False end object lbFilter: TLabel[2] AnchorSideTop.Control = edtFilter AnchorSideTop.Side = asrCenter AnchorSideRight.Control = edtFilter Left = 670 Height = 13 Top = 78 Width = 25 Anchors = [akTop, akRight] BorderSpacing.Top = 4 BorderSpacing.Right = 4 Caption = '&Filter' FocusControl = edtFilter ParentColor = False end object lbxCategories: TListBox[3] AnchorSideLeft.Control = lbSCFilesList AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = lblCategories AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 317 Height = 50 Top = 19 Width = 485 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 BorderSpacing.Right = 6 ItemHeight = 0 OnSelectionChange = lbxCategoriesSelectionChange ScrollWidth = 483 TabOrder = 1 TopIndex = -1 end object edtFilter: TEdit[4] AnchorSideTop.Control = lbxCategories AnchorSideTop.Side = asrBottom AnchorSideRight.Control = stgCommands AnchorSideRight.Side = asrBottom Left = 699 Height = 23 Top = 73 Width = 103 Anchors = [akTop, akRight] BorderSpacing.Top = 4 BorderSpacing.Bottom = 4 OnChange = edtFilterChange TabOrder = 2 end object stgCommands: TStringGrid[5] AnchorSideLeft.Control = lblCommands AnchorSideTop.Control = edtFilter AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 268 Top = 100 Width = 796 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Right = 6 ColCount = 3 Constraints.MinHeight = 200 Constraints.MinWidth = 200 ExtendedSelect = False FixedCols = 0 MouseWheelOption = mwGrid Options = [goVertLine, goColSizing, goColMoving, goRowSelect, goThumbTracking, goDblClickAutoSize, goSmoothScroll] RowCount = 1 TabOrder = 3 TitleStyle = tsNative OnResize = stgCommandsResize OnSelectCell = stgCommandsSelectCell end object stgHotkeys: TStringGrid[6] AnchorSideLeft.Control = stgCommands AnchorSideTop.Control = stgCommands AnchorSideTop.Side = asrBottom AnchorSideRight.Control = pnlHotkeyButtons AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 6 Height = 137 Top = 372 Width = 700 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Top = 4 BorderSpacing.Right = 8 BorderSpacing.Bottom = 4 ColCount = 3 Columns = < item Title.Caption = 'Hotkey' Width = 119 end item Title.Caption = 'Parameters' Width = 119 end item Title.Caption = 'Controls' Width = 120 end> Constraints.MinHeight = 100 Constraints.MinWidth = 100 FixedCols = 0 MouseWheelOption = mwGrid Options = [goFixedVertLine, goFixedHorzLine, goColSizing, goColMoving, goRowSelect, goThumbTracking, goDblClickAutoSize, goSmoothScroll] RowCount = 3 ScrollBars = ssAutoVertical TabOrder = 4 TitleStyle = tsNative OnDblClick = stgHotkeysDblClick OnResize = stgHotkeysResize OnSelectCell = stgHotkeysSelectCell ColWidths = ( 119 119 120 ) end object pnlHotkeyButtons: TPanel[7] AnchorSideTop.Control = stgHotkeys AnchorSideRight.Control = stgCommands AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = stgHotkeys AnchorSideBottom.Side = asrBottom Left = 714 Height = 137 Top = 372 Width = 88 Anchors = [akTop, akRight, akBottom] AutoSize = True BevelOuter = bvNone ChildSizing.VerticalSpacing = 6 ChildSizing.EnlargeHorizontal = crsHomogenousChildResize ChildSizing.EnlargeVertical = crsHomogenousChildResize ChildSizing.ShrinkHorizontal = crsHomogenousChildResize ChildSizing.ShrinkVertical = crsHomogenousChildResize ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 137 ClientWidth = 88 TabOrder = 5 object btnAddHotKey: TButton AnchorSideRight.Side = asrBottom Left = 0 Height = 42 Top = 0 Width = 88 AutoSize = True BorderSpacing.InnerBorder = 4 Caption = 'Add &hotkey' Enabled = False OnClick = btnAddHotKeyClick TabOrder = 0 end object btnEditHotkey: TButton Left = 0 Height = 42 Top = 48 Width = 88 AutoSize = True BorderSpacing.InnerBorder = 4 Caption = '&Edit hotkey' Enabled = False OnClick = btnEditHotkeyClick TabOrder = 1 end object btnDeleteHotKey: TButton AnchorSideRight.Side = asrBottom Left = 0 Height = 41 Top = 96 Width = 88 AutoSize = True BorderSpacing.InnerBorder = 4 Caption = '&Delete hotkey' Enabled = False OnClick = btnDeleteHotKeyClick TabOrder = 2 end end object lbSCFilesList: TListBox[8] AnchorSideLeft.Control = Owner AnchorSideTop.Control = lblSCFiles AnchorSideTop.Side = asrBottom Left = 6 Height = 50 Top = 19 Width = 305 BorderSpacing.Left = 6 ItemHeight = 0 OnSelectionChange = lbSCFilesListSelectionChange ScrollWidth = 303 TabOrder = 0 TopIndex = -1 end object lblSCFiles: TLabel[9] AnchorSideLeft.Control = lbSCFilesList AnchorSideTop.Control = Owner Left = 6 Height = 13 Top = 6 Width = 68 BorderSpacing.Top = 6 Caption = '&Shortcut files:' FocusControl = lbSCFilesList ParentColor = False end end doublecmd-0.5.8/src/frames/foptionstooltips.lrt0000644000175000017500000000143412020403374020731 0ustar alexxalexxTFRMOPTIONSTOOLTIPS.GBCUSTOMFIELDS.CAPTION=Custom fields by file type TFRMOPTIONSTOOLTIPS.BTNADDFIELDS.CAPTION=A&dd TFRMOPTIONSTOOLTIPS.BTNDELETEFIELDS.CAPTION=D&elete TFRMOPTIONSTOOLTIPS.BTNAPPLYFIELDS.CAPTION=A&pply TFRMOPTIONSTOOLTIPS.LBLFIELDSNAME.CAPTION=Category &name: TFRMOPTIONSTOOLTIPS.LBLFIELDSMASK.CAPTION=Category &mask: TFRMOPTIONSTOOLTIPS.LBLFIELDSLIST.CAPTION=Category &hint: TFRMOPTIONSTOOLTIPS.BTNFIELDSSEARCHTEMPLATE.HINT=Template... TFRMOPTIONSTOOLTIPS.BTNFIELDSLIST.CAPTION=>> TFRMOPTIONSTOOLTIPS.GBSHOWTOOLTIP.CAPTION=Show tool tip TFRMOPTIONSTOOLTIPS.RBTOOLTIPALLFILES.CAPTION=Sho&w tool tip for all files in file panel TFRMOPTIONSTOOLTIPS.RBTOOLTIPONLYLARGE.CAPTION=Show &tool tip for files in file panel if truncated TFRMOPTIONSTOOLTIPS.RBTOOLTIPNONE.CAPTION=Don't &show doublecmd-0.5.8/src/frames/foptionsquicksearchfilter.lfm0000644000175000017500000001037312020467420022545 0ustar alexxalexxinherited frmOptionsQuickSearchFilter: TfrmOptionsQuickSearchFilter Height = 354 Width = 702 ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ClientHeight = 354 ClientWidth = 702 DesignTop = 27 object gbExactNameMatch: TGroupBox[0] AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Side = asrBottom Left = 6 Height = 81 Top = 6 Width = 690 Anchors = [akTop, akLeft, akRight] AutoSize = True Caption = 'Exact name match' ChildSizing.TopBottomSpacing = 4 ChildSizing.VerticalSpacing = 4 ClientHeight = 58 ClientWidth = 686 TabOrder = 0 object cbExactBeginning: TCheckBox AnchorSideLeft.Control = gbExactNameMatch AnchorSideTop.Control = gbExactNameMatch Left = 10 Height = 23 Top = 6 Width = 376 BorderSpacing.Left = 10 BorderSpacing.Top = 6 Caption = '&Beginning (name must start with first typed character)' TabOrder = 0 end object cbExactEnding: TCheckBox AnchorSideLeft.Control = cbExactBeginning AnchorSideTop.Control = cbExactBeginning AnchorSideTop.Side = asrBottom AnchorSideBottom.Control = gbExactNameMatch AnchorSideBottom.Side = asrBottom Left = 10 Height = 19 Top = 33 Width = 382 Anchors = [akTop, akLeft, akBottom] BorderSpacing.Bottom = 6 Caption = 'En&ding (last character before a typed dot . must match)' TabOrder = 1 end end object rgpSearchItems: TRadioGroup[1] AnchorSideLeft.Control = Owner AnchorSideTop.Control = gbExactNameMatch AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 104 Top = 87 Width = 690 Anchors = [akTop, akLeft, akRight] AutoFill = True AutoSize = True Caption = 'Search for these items' ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ChildSizing.EnlargeHorizontal = crsHomogenousChildResize ChildSizing.EnlargeVertical = crsHomogenousChildResize ChildSizing.ShrinkHorizontal = crsScaleChilds ChildSizing.ShrinkVertical = crsScaleChilds ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 81 ClientWidth = 686 Items.Strings = ( 'Files' 'Directories' 'Files and Directories' ) TabOrder = 1 end object rgpSearchCase: TRadioGroup[2] AnchorSideLeft.Control = Owner AnchorSideTop.Control = rgpSearchItems AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 81 Top = 191 Width = 690 Anchors = [akTop, akLeft, akRight] AutoFill = True AutoSize = True Caption = 'Search case' ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ChildSizing.EnlargeHorizontal = crsHomogenousChildResize ChildSizing.EnlargeVertical = crsHomogenousChildResize ChildSizing.ShrinkHorizontal = crsScaleChilds ChildSizing.ShrinkVertical = crsScaleChilds ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 58 ClientWidth = 686 Items.Strings = ( 'Sensitive' 'Insensitive' ) TabOrder = 2 end object cgpOptions: TCheckGroup[3] AnchorSideLeft.Control = Owner AnchorSideTop.Control = rgpSearchCase AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 58 Top = 272 Width = 690 Anchors = [akTop, akLeft, akRight] AutoFill = True AutoSize = True Caption = 'Options' ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 6 ChildSizing.EnlargeHorizontal = crsHomogenousChildResize ChildSizing.EnlargeVertical = crsHomogenousChildResize ChildSizing.ShrinkHorizontal = crsScaleChilds ChildSizing.ShrinkVertical = crsScaleChilds ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 Items.Strings = ( 'Hide filter panel when not focused' ) TabOrder = 3 Data = { 0100000002 } end end doublecmd-0.5.8/src/fmaskinputdlg.lrt0000644000175000017500000000032512023046500016660 0ustar alexxalexxTFRMMASKINPUTDLG.LBLSEARCHTEMPLATE.CAPTION=O&r select predefined selection type: TFRMMASKINPUTDLG.BTNOK.CAPTION=&OK TFRMMASKINPUTDLG.BTNCANCEL.CAPTION=&Cancel TFRMMASKINPUTDLG.BTNDEFINETEMPLATE.CAPTION=&Define... doublecmd-0.5.8/src/ufileviewnotebook.pas0000644000175000017500000004653412247124203017553 0ustar alexxalexxunit uFileViewNotebook; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Controls, ComCtrls, ExtCtrls {Lazarus < 31552}, LMessages, LCLType, LCLVersion, Forms, uFileView, uFilePanelSelect, uDCVersion, DCXmlConfig; const lazRevNewTabControl = '31767'; lazRevOnPageChangedRemoved = '32622'; type TTabLockState = ( tlsNormal, //= 093100) and (lazRevision >= lazRevNewTabControl)} TFileViewNotebook = class(TCustomTabControl) {$ELSE} TFileViewNotebook = class(TCustomNotebook) {$ENDIF} private FNotebookSide: TFilePanelSelect; FStartDrag: Boolean; FDraggedPageIndex: Integer; FHintPageIndex: Integer; FLastMouseDownTime: TDateTime; FLastMouseDownPageIndex: Integer; function GetActivePage: TFileViewPage; function GetActiveView: TFileView; function GetFileViewOnPage(Index: Integer): TFileView; function GetPage(Index: Integer): TFileViewPage; reintroduce; procedure DragOverEvent(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); procedure DragDropEvent(Sender, Source: TObject; X, Y: Integer); protected procedure DoChange; override; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure WMEraseBkgnd(var Message: TLMEraseBkgnd); message LM_ERASEBKGND; public constructor Create(ParentControl: TWinControl; NotebookSide: TFilePanelSelect); reintroduce; {$IFDEF MSWINDOWS} {en Removes the rectangle of the pages contents from erasing background to reduce flickering. This is not needed on non-Windows because EraseBackground is not used there. } procedure EraseBackground(DC: HDC); override; {$ENDIF} function AddPage: TFileViewPage; function InsertPage(Index: Integer): TFileViewPage; reintroduce; function NewEmptyPage: TFileViewPage; function NewPage(CloneFromPage: TFileViewPage): TFileViewPage; function NewPage(CloneFromView: TFileView): TFileViewPage; procedure RemovePage(Index: Integer); reintroduce; procedure RemovePage(var aPage: TFileViewPage); procedure DestroyAllPages; procedure ActivatePrevTab; procedure ActivateNextTab; property ActivePage: TFileViewPage read GetActivePage; property ActiveView: TFileView read GetActiveView; property DoubleClickPageIndex: Integer read FLastMouseDownPageIndex; property Page[Index: Integer]: TFileViewPage read GetPage; property View[Index: Integer]: TFileView read GetFileViewOnPage; default; property Side: TFilePanelSelect read FNotebookSide; published property OnDblClick; {$IF DECLARED(lcl_fullversion) and (lcl_fullversion >= 093100) and (lazRevision >= lazRevOnPageChangedRemoved)} property OnChange; {$ENDIF} property OnMouseDown; property OnMouseUp; end; implementation uses LCLIntf, LCLProc, DCStrUtils, uGlobs, uArchiveFileSource {$IF DEFINED(LCLGTK2)} , Glib2, Gtk2 {$ENDIF} {$IF DEFINED(LCLQT) and (LCL_FULLVERSION < 093100)} , qt4, qtwidgets {$ENDIF} {$IF DEFINED(MSWINDOWS)} , win32proc, Windows {$ENDIF} ; // -- TFileViewPage ----------------------------------------------------------- procedure TFileViewPage.AssignPage(OtherPage: TFileViewPage); begin AssignProperties(OtherPage); SetFileView(nil); // Remove previous view. OtherPage.FileView.Clone(Self); end; procedure TFileViewPage.AssignProperties(OtherPage: TFileViewPage); begin FLockState := OtherPage.FLockState; FLockPath := OtherPage.FLockPath; FCurrentTitle := OtherPage.FCurrentTitle; FPermanentTitle := OtherPage.FPermanentTitle; end; constructor TFileViewPage.Create(TheOwner: TComponent); begin FLockState := tlsNormal; {$IF DEFINED(LCLQT) and (LCL_FULLVERSION < 093100)} FSettingCaption := False; {$ENDIF} inherited Create(TheOwner); end; {$IF DEFINED(LCLQT) and (LCL_FULLVERSION < 093100)} // On QT after handle is created but before the widget is visible // setting caption fails unless the notebook and all its parents are // set as Visible and the current page is the one of which we set caption. // Overriding HandleObjectShouldBeVisible is a indirect workaround for that // (see TQtPage.getIndex.CanReturnIndex). // QT 4.6 or higher needed for this workaround. function TFileViewPage.HandleObjectShouldBeVisible: boolean; var AParent: QTabWidgetH; begin if not HandleAllocated then Result := inherited else begin AParent := TQtPage(Handle).getTabWidget; Result := (FSettingCaption and ((AParent = nil) or not QWidget_isVisible(AParent))) or inherited; end; end; {$ENDIF} {$IF (DEFINED(LCLQT) and (LCL_FULLVERSION < 093100)) or DEFINED(MSWINDOWS)} procedure TFileViewPage.RealSetText(const AValue: TCaption); begin {$IF DEFINED(LCLQT)} FSettingCaption := True; {$ENDIF} inherited; {$IF DEFINED(MSWINDOWS)} if HandleAllocated then LCLControlSizeNeedsUpdate(Parent, True); {$ENDIF} {$IF DEFINED(LCLQT)} FSettingCaption := False; {$ENDIF} end; {$ENDIF} function TFileViewPage.IsActive: Boolean; begin Result := Assigned(Notebook) and (Notebook.PageIndex = PageIndex); end; procedure TFileViewPage.LoadConfiguration(AConfig: TXmlConfig; ANode: TXmlNode); begin FLockState := TTabLockState(AConfig.GetValue(ANode, 'Options', Integer(tlsNormal))); FLockPath := AConfig.GetValue(ANode, 'LockPath', ''); FPermanentTitle := AConfig.GetValue(ANode, 'Title', ''); end; procedure TFileViewPage.SaveConfiguration(AConfig: TXmlConfig; ANode: TXmlNode); begin AConfig.AddValueDef(ANode, 'Options', Integer(FLockState), Integer(tlsNormal)); AConfig.AddValueDef(ANode, 'LockPath', FLockPath, ''); AConfig.AddValueDef(ANode, 'Title', FPermanentTitle, ''); end; procedure TFileViewPage.MakeActive; var aFileView: TFileView; begin if Assigned(Notebook) then begin Notebook.PageIndex := PageIndex; aFileView := FileView; if Assigned(aFileView) then aFileView.SetFocus; end; end; procedure TFileViewPage.PaintWindow(DC: HDC); begin // Don't paint anything. end; procedure TFileViewPage.UpdateTitle; var NewCaption: String; begin if Assigned(FileView) then begin if FPermanentTitle <> '' then begin NewCaption := FPermanentTitle; FCurrentTitle := FPermanentTitle; end else begin if (FileView.FileSource is TArchiveFileSource) and (FileView.FileSource.IsPathAtRoot(FileView.CurrentPath)) then begin with (FileView.FileSource as TArchiveFileSource) do NewCaption := ExtractFileName(ArchiveFileName); end else begin NewCaption := FileView.CurrentPath; if NewCaption <> '' then NewCaption := GetLastDir(NewCaption); end; FCurrentTitle := NewCaption; end; if (FLockState in [tlsPathLocked, tlsPathResets, tlsDirsInNewTab]) and (tb_show_asterisk_for_locked in gDirTabOptions) then NewCaption := '*' + NewCaption; if (tb_text_length_limit in gDirTabOptions) and (UTF8Length(NewCaption) > gDirTabLimit) then NewCaption := UTF8Copy(NewCaption, 1, gDirTabLimit) + '...'; Caption := StringReplace(NewCaption, '&', '&&', [rfReplaceAll]); end; end; procedure TFileViewPage.WMEraseBkgnd(var Message: TLMEraseBkgnd); begin Message.Result := 1; end; function TFileViewPage.GetFileView: TFileView; begin if ComponentCount > 0 then Result := TFileView(Components[0]) else Result := nil; end; procedure TFileViewPage.SetFileView(aFileView: TFileView); var aComponent: TComponent; begin if ComponentCount > 0 then begin aComponent := Components[0]; aComponent.Free; end; if Assigned(aFileView) then begin aFileView.Parent := Self; end; end; function TFileViewPage.GetNotebook: TFileViewNotebook; begin Result := Parent as TFileViewNotebook; end; procedure TFileViewPage.SetLockState(NewLockState: TTabLockState); begin if FLockState = NewLockState then Exit; FLockState := NewLockState; if NewLockState in [tlsPathLocked, tlsPathResets, tlsDirsInNewTab] then begin LockPath := FileView.CurrentPath; FPermanentTitle := GetLastDir(LockPath); end else begin LockPath := ''; FPermanentTitle := ''; end; UpdateTitle; end; procedure TFileViewPage.SetPermanentTitle(AValue: String); begin if FPermanentTitle = AValue then Exit; FPermanentTitle := AValue; UpdateTitle; end; procedure TFileViewPage.DoActivate; begin if Assigned(FOnActivate) then FOnActivate(Self); end; // -- TFileViewNotebook ------------------------------------------------------- constructor TFileViewNotebook.Create(ParentControl: TWinControl; NotebookSide: TFilePanelSelect); begin PageClass := TFileViewPage; inherited Create(ParentControl); ControlStyle := ControlStyle + [csNoFocus]; Parent := ParentControl; TabStop := False; ShowHint := True; FHintPageIndex := -1; FNotebookSide := NotebookSide; FStartDrag := False; {$IFDEF MSWINDOWS} // The pages contents are removed from drawing background in EraseBackground. // But double buffering could be enabled to eliminate flickering of drawing // the tabs buttons themselves. But currently there's a bug where the buffer // bitmap is temporarily drawn in different position, probably at (0,0) and // not where pages contents start (after applying TCM_ADJUSTRECT). //DoubleBuffered := True; {$ENDIF} OnDragOver := @DragOverEvent; OnDragDrop := @DragDropEvent; end; function TFileViewNotebook.GetActivePage: TFileViewPage; begin if PageIndex <> -1 then Result := GetPage(PageIndex) else Result := nil; end; function TFileViewNotebook.GetActiveView: TFileView; var APage: TFileViewPage; begin APage := GetActivePage; if Assigned(APage) then Result := APage.FileView else Result := nil; end; function TFileViewNotebook.GetFileViewOnPage(Index: Integer): TFileView; var APage: TFileViewPage; begin APage := GetPage(Index); Result := APage.FileView; end; function TFileViewNotebook.GetPage(Index: Integer): TFileViewPage; begin Result := TFileViewPage(CustomPage(Index)); end; function TFileViewNotebook.AddPage: TFileViewPage; begin Result := InsertPage(PageCount); end; function TFileViewNotebook.InsertPage(Index: Integer): TFileViewPage; begin Pages.Insert(Index, ''); Result := GetPage(Index); ShowTabs:= ((PageCount > 1) or (tb_always_visible in gDirTabOptions)) and gDirectoryTabs; end; function TFileViewNotebook.NewEmptyPage: TFileViewPage; begin if tb_open_new_near_current in gDirTabOptions then Result := InsertPage(PageIndex + 1) else Result := InsertPage(PageCount); end; function TFileViewNotebook.NewPage(CloneFromPage: TFileViewPage): TFileViewPage; begin if Assigned(CloneFromPage) then begin Result := NewEmptyPage; Result.AssignPage(CloneFromPage); end else Result := nil; end; function TFileViewNotebook.NewPage(CloneFromView: TFileView): TFileViewPage; begin if Assigned(CloneFromView) then begin Result := NewEmptyPage; CloneFromView.Clone(Result); end else Result := nil; end; procedure TFileViewNotebook.RemovePage(Index: Integer); begin {$IFDEF LCLGTK2} // If removing currently active page, switch to another page first. // Otherwise there can be no page selected. if (PageIndex = Index) and (PageCount > 1) then begin if Index = PageCount - 1 then Page[Index - 1].MakeActive else Page[Index + 1].MakeActive; end; {$ENDIF} Page[Index].Free; ShowTabs:= ((PageCount > 1) or (tb_always_visible in gDirTabOptions)) and gDirectoryTabs; {$IFNDEF LCLGTK2} // Force-activate current page. if PageIndex <> -1 then Page[PageIndex].MakeActive; {$ENDIF} end; procedure TFileViewNotebook.RemovePage(var aPage: TFileViewPage); begin RemovePage(aPage.PageIndex); aPage := nil; end; procedure TFileViewNotebook.WMEraseBkgnd(var Message: TLMEraseBkgnd); begin inherited WMEraseBkgnd(Message); // Always set as handled otherwise if not handled Windows will draw background // with hbrBackground brush of the window class. This might cause flickering // because later background will be again be erased but with TControl.Brush. // This is not actually needed on non-Windows because WMEraseBkgnd is not used there. Message.Result := 1; end; procedure TFileViewNotebook.DestroyAllPages; begin while PageCount > 0 do Page[0].Free; end; procedure TFileViewNotebook.ActivatePrevTab; begin if PageIndex = 0 then Page[PageCount - 1].MakeActive else Page[PageIndex - 1].MakeActive; end; procedure TFileViewNotebook.ActivateNextTab; begin if PageIndex = PageCount - 1 then Page[0].MakeActive else Page[PageIndex + 1].MakeActive; end; procedure TFileViewNotebook.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); {$IF DEFINED(LCLGTK2)} var ArrowWidth: Integer; arrow_spacing: gint = 0; scroll_arrow_hlength: gint = 16; {$ENDIF} begin inherited; if Button = mbLeft then begin FDraggedPageIndex := TabIndexAtClientPos(Classes.Point(X, Y)); FStartDrag := (FDraggedPageIndex <> -1); end; // Emulate double click if (Button = mbLeft) and Assigned(OnDblClick) then begin if ((Now - FLastMouseDownTime) > ((1/86400)*(GetDoubleClickTime/1000))) then begin FLastMouseDownTime:= Now; FLastMouseDownPageIndex:= FDraggedPageIndex; end else if (FDraggedPageIndex = FLastMouseDownPageIndex) then begin {$IF DEFINED(LCLGTK2)} gtk_widget_style_get(PGtkWidget(Self.Handle), 'arrow-spacing', @arrow_spacing, 'scroll-arrow-hlength', @scroll_arrow_hlength, nil); ArrowWidth:= arrow_spacing + scroll_arrow_hlength; if (X > ArrowWidth) and (X < ClientWidth - ArrowWidth) then {$ENDIF} OnDblClick(Self); FStartDrag:= False; FLastMouseDownTime:= 0; FLastMouseDownPageIndex:= -1; end; end; end; procedure TFileViewNotebook.MouseMove(Shift: TShiftState; X, Y: Integer); var ATabIndex: Integer; begin inherited; if ShowHint then begin ATabIndex := TabIndexAtClientPos(Classes.Point(X, Y)); if (ATabIndex >= 0) and (ATabIndex <> FHintPageIndex) then begin FHintPageIndex := ATabIndex; Application.CancelHint; if (ATabIndex <> PageIndex) and (Length(Page[ATabIndex].LockPath) <> 0) then Hint := Page[ATabIndex].LockPath else Hint := View[ATabIndex].CurrentPath; end; end; if FStartDrag then begin FStartDrag := False; BeginDrag(False); end; end; procedure TFileViewNotebook.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inherited; FStartDrag := False; end; procedure TFileViewNotebook.DragOverEvent(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); var ATabIndex: Integer; begin if (Source is TFileViewNotebook) and (Sender is TFileViewNotebook) then begin ATabIndex := TabIndexAtClientPos(Classes.Point(X, Y)); Accept := (Source <> Sender) or ((ATabIndex <> -1) and (ATabIndex <> FDraggedPageIndex)); end else Accept := False; end; {$IFDEF MSWINDOWS} procedure TFileViewNotebook.EraseBackground(DC: HDC); var ARect: TRect; SaveIndex: Integer; Clip: Integer; begin if HandleAllocated and (DC <> 0) then begin ARect := Classes.Rect(0, 0, Width, Height); Windows.TabCtrl_AdjustRect(Handle, False, ARect); SaveIndex := SaveDC(DC); Clip := ExcludeClipRect(DC, ARect.Left, ARect.Top, ARect.Right, ARect.Bottom); if Clip <> NullRegion then begin ARect := Classes.Rect(0, 0, Width, Height); FillRect(DC, ARect, HBRUSH(Brush.Reference.Handle)); end; RestoreDC(DC, SaveIndex); end; end; {$ENDIF} procedure TFileViewNotebook.DragDropEvent(Sender, Source: TObject; X, Y: Integer); var SourceNotebook: TFileViewNotebook; ATabIndex: Integer; ANewPage, DraggedPage: TFileViewPage; begin if (Source is TFileViewNotebook) and (Sender is TFileViewNotebook) then begin ATabIndex := TabIndexAtClientPos(Classes.Point(X, Y)); if Source = Sender then begin // Move within the same panel. if ATabIndex <> -1 then Pages.Move(FDraggedPageIndex, ATabIndex); end else begin // Move page between panels. SourceNotebook := (Source as TFileViewNotebook); DraggedPage := SourceNotebook.Page[SourceNotebook.FDraggedPageIndex]; if ATabIndex = -1 then ATabIndex := PageCount; // Create a clone of the page in the panel. ANewPage := InsertPage(ATabIndex); ANewPage.AssignPage(DraggedPage); ANewPage.MakeActive; if (ssShift in GetKeyShiftState) and (SourceNotebook.PageCount > 1) then begin // Remove page from source panel. SourceNotebook.RemovePage(DraggedPage); end; end; end; end; procedure TFileViewNotebook.DoChange; begin inherited DoChange; ActivePage.DoActivate; end; end. doublecmd-0.5.8/src/fpackinfodlg.lfm0000644000175000017500000002052412023046500016417 0ustar alexxalexxobject frmPackInfoDlg: TfrmPackInfoDlg Left = 525 Height = 400 Top = 83 Width = 284 AutoSize = True BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Properties of packed file' ClientHeight = 400 ClientWidth = 284 Position = poScreenCenter LCLVersion = '1.1' object pnlInfo: TPanel Left = 0 Height = 313 Top = 0 Width = 284 Align = alClient AutoSize = True BevelOuter = bvNone ClientHeight = 313 ClientWidth = 284 TabOrder = 0 object pnlInfoFile: TPanel AnchorSideLeft.Control = pnlInfo AnchorSideTop.Control = pnlInfo AnchorSideRight.Control = pnlInfo AnchorSideRight.Side = asrBottom Left = 15 Height = 38 Top = 0 Width = 254 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Left = 15 BorderSpacing.Right = 15 BevelOuter = bvNone ClientHeight = 38 ClientWidth = 254 TabOrder = 1 object lblPackedFile: TLabel AnchorSideLeft.Control = pnlInfoFile AnchorSideTop.Control = edtPackedFile AnchorSideTop.Side = asrCenter Left = 0 Height = 18 Top = 15 Width = 28 BorderSpacing.Top = 10 Caption = 'File:' FocusControl = edtPackedFile ParentColor = False end object edtPackedFile: TEdit AnchorSideLeft.Control = lblPackedFile AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = pnlInfoFile AnchorSideRight.Control = pnlInfoFile AnchorSideRight.Side = asrBottom Left = 43 Height = 28 Top = 10 Width = 211 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 15 BorderSpacing.Top = 10 Color = clBtnFace Constraints.MinWidth = 200 Font.Color = clBtnText ParentFont = False ReadOnly = True TabStop = False TabOrder = 0 end end object Bevel1: TBevel AnchorSideLeft.Control = pnlInfo AnchorSideTop.Control = pnlInfoFile AnchorSideTop.Side = asrBottom AnchorSideRight.Control = pnlInfo AnchorSideRight.Side = asrBottom Left = 15 Height = 9 Top = 48 Width = 254 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 15 BorderSpacing.Top = 10 BorderSpacing.Right = 15 Shape = bsTopLine end object pnlInfoProperties: TPanel AnchorSideLeft.Control = pnlInfo AnchorSideTop.Control = Bevel1 AnchorSideTop.Side = asrBottom AnchorSideRight.Control = pnlInfo AnchorSideRight.Side = asrBottom Left = 15 Height = 179 Top = 57 Width = 254 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Left = 15 BorderSpacing.Right = 15 BevelOuter = bvNone ChildSizing.HorizontalSpacing = 30 ChildSizing.VerticalSpacing = 5 ChildSizing.EnlargeHorizontal = crsHomogenousChildResize ChildSizing.EnlargeVertical = crsHomogenousChildResize ChildSizing.ShrinkHorizontal = crsHomogenousChildResize ChildSizing.ShrinkVertical = crsHomogenousChildResize ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 2 ClientHeight = 179 ClientWidth = 254 TabOrder = 0 object lblPacker: TLabel Left = 0 Height = 18 Top = 0 Width = 173 Caption = 'Packer:' ParentColor = False end object lblPackedPacker: TLabel Left = 203 Height = 18 Top = 0 Width = 51 ParentColor = False ShowAccelChar = False end object lblOriginalSize: TLabel Left = 0 Height = 18 Top = 23 Width = 173 Caption = 'Original size:' ParentColor = False end object lblPackedOrgSize: TLabel Left = 203 Height = 18 Top = 23 Width = 51 ParentColor = False ShowAccelChar = False end object lblPackedSize: TLabel Left = 0 Height = 18 Top = 46 Width = 173 Caption = 'Packed size:' ParentColor = False end object lblPackedPackedSize: TLabel Left = 203 Height = 18 Top = 46 Width = 51 ParentColor = False ShowAccelChar = False end object lblCompressionRatio: TLabel Left = 0 Height = 18 Top = 69 Width = 173 Caption = 'Compression ratio:' ParentColor = False end object lblPackedCompression: TLabel Left = 203 Height = 18 Top = 69 Width = 51 ParentColor = False ShowAccelChar = False end object lblMethod: TLabel Left = 0 Height = 18 Top = 92 Width = 173 Caption = 'Method:' ParentColor = False end object lblPackedMethod: TLabel Left = 203 Height = 18 Top = 92 Width = 51 ParentColor = False ShowAccelChar = False end object lblDate: TLabel Left = 0 Height = 18 Top = 115 Width = 173 Caption = 'Date:' ParentColor = False end object lblPackedDate: TLabel Left = 203 Height = 18 Top = 115 Width = 51 ParentColor = False ShowAccelChar = False end object lblTime: TLabel Left = 0 Height = 18 Top = 138 Width = 173 Caption = 'Time:' ParentColor = False end object lblPackedTime: TLabel Left = 203 Height = 18 Top = 138 Width = 51 ParentColor = False ShowAccelChar = False end object lblAttributes: TLabel Left = 0 Height = 18 Top = 161 Width = 173 Caption = 'Attributes:' ParentColor = False end object lblPackedAttr: TLabel Left = 203 Height = 18 Top = 161 Width = 51 ParentColor = False ShowAccelChar = False end object Bevel2: TBevel AnchorSideLeft.Control = pnlInfoProperties AnchorSideRight.Control = pnlInfoProperties AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = lblDate Left = 0 Height = 4 Top = 106 Width = 254 Anchors = [akLeft, akRight, akBottom] BorderSpacing.Bottom = 4 Shape = bsBottomLine end end end object pnlButtons: TPanel Left = 0 Height = 72 Top = 328 Width = 284 Align = alBottom AutoSize = True BorderSpacing.Top = 15 BevelOuter = bvNone ClientHeight = 72 ClientWidth = 284 TabOrder = 1 object btnClose: TButton AnchorSideLeft.Control = pnlButtons AnchorSideTop.Control = pnlButtons AnchorSideBottom.Control = btnUnpackAndExec AnchorSideBottom.Side = asrBottom Left = 10 Height = 31 Top = 0 Width = 48 Anchors = [akTop, akLeft, akBottom] AutoSize = True BorderSpacing.Left = 10 Cancel = True Caption = '&Close' Default = True ModalResult = 2 OnKeyUp = btnCloseKeyUp TabOrder = 0 end object btnUnpackAndExec: TButton AnchorSideLeft.Control = btnClose AnchorSideLeft.Side = asrBottom AnchorSideRight.Control = pnlButtons AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = btnUnpackAllAndExec Left = 62 Height = 31 Top = 0 Width = 212 Anchors = [akLeft, akRight, akBottom] AutoSize = True BorderSpacing.Left = 4 BorderSpacing.Right = 10 BorderSpacing.Bottom = 4 Caption = '&Unpack and execute' ModalResult = 1 TabOrder = 1 end object btnUnpackAllAndExec: TButton AnchorSideLeft.Control = pnlButtons AnchorSideRight.Control = pnlButtons AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = pnlButtons AnchorSideBottom.Side = asrBottom Left = 10 Height = 31 Top = 35 Width = 264 Anchors = [akLeft, akRight, akBottom] AutoSize = True BorderSpacing.Left = 10 BorderSpacing.Right = 10 BorderSpacing.Bottom = 6 Caption = 'Unpack &all and execute' ModalResult = 8 TabOrder = 2 end end end doublecmd-0.5.8/src/fconnectionmanager.lrt0000644000175000017500000000051712023046500017653 0ustar alexxalexxTFRMCONNECTIONMANAGER.CAPTION=Connection manager TFRMCONNECTIONMANAGER.GBCONNECTTO.CAPTION=Connect to: TFRMCONNECTIONMANAGER.BTNCONNECT.CAPTION=C&onnect TFRMCONNECTIONMANAGER.BTNADD.CAPTION=A&dd TFRMCONNECTIONMANAGER.BTNEDIT.CAPTION=&Edit TFRMCONNECTIONMANAGER.BTNDELETE.CAPTION=&Delete TFRMCONNECTIONMANAGER.BTNCANCEL.CAPTION=&Cancel doublecmd-0.5.8/src/ufile.pas0000644000175000017500000006201112063047023015103 0ustar alexxalexxunit uFile; {$mode objfpc}{$H+} interface uses Classes, SysUtils, uFileProperty, DCBasicTypes; type { TFile } TFile = class private // Cached values for extension and name. // Automatically set when name changes. FExtension: String; // '' then begin if NewFullPath[Length(NewFullPath)] = PathDelim then begin // Only path passed. SetPath(NewFullPath); SetName(''); end else begin aExtractedName := ExtractFileName(NewFullPath); SetPath(Copy(NewFullPath, 1, Length(NewFullPath) - Length(aExtractedName))); SetName(aExtractedName); end; end; end; procedure TFile.SetPath(const NewPath: String); begin if NewPath = '' then FPath := '' else FPath := IncludeTrailingPathDelimiter(NewPath); end; function TFile.GetAttributes: TFileAttrs; begin Result := TFileAttributesProperty(FProperties[fpAttributes]).Value; end; procedure TFile.SetAttributes(NewAttributes: TFileAttrs); begin TFileAttributesProperty(FProperties[fpAttributes]).Value := NewAttributes; UpdateNameAndExtension(Name); end; function TFile.GetSize: Int64; begin Result := TFileSizeProperty(FProperties[fpSize]).Value; end; procedure TFile.SetSize(NewSize: Int64); begin TFileSizeProperty(FProperties[fpSize]).Value := NewSize; end; function TFile.GetCompressedSize: Int64; begin Result := TFileCompressedSizeProperty(FProperties[fpCompressedSize]).Value; end; procedure TFile.SetCompressedSize(NewCompressedSize: Int64); begin TFileCompressedSizeProperty(FProperties[fpCompressedSize]).Value := NewCompressedSize; end; function TFile.GetModificationTime: TDateTime; begin Result := TFileModificationDateTimeProperty(FProperties[fpModificationTime]).Value; end; procedure TFile.SetModificationTime(NewTime: TDateTime); begin TFileModificationDateTimeProperty(FProperties[fpModificationTime]).Value := NewTime; end; function TFile.GetCreationTime: TDateTime; begin Result := TFileCreationDateTimeProperty(FProperties[fpCreationTime]).Value; end; procedure TFile.SetCreationTime(NewTime: TDateTime); begin TFileCreationDateTimeProperty(FProperties[fpCreationTime]).Value := NewTime; end; function TFile.GetLastAccessTime: TDateTime; begin Result := TFileLastAccessDateTimeProperty(FProperties[fpLastAccessTime]).Value; end; procedure TFile.SetLastAccessTime(NewTime: TDateTime); begin TFileLastAccessDateTimeProperty(FProperties[fpLastAccessTime]).Value := NewTime; end; function TFile.GetIsLinkToDirectory: Boolean; begin if fpLink in SupportedProperties then Result := TFileLinkProperty(FProperties[fpLink]).IsLinkToDirectory else Result := False; end; procedure TFile.SetIsLinkToDirectory(NewValue: Boolean); begin TFileLinkProperty(FProperties[fpLink]).IsLinkToDirectory := NewValue; end; function TFile.GetType: String; begin Result := TFileTypeProperty(FProperties[fpType]).Value; end; procedure TFile.SetType(NewValue: String); begin TFileTypeProperty(FProperties[fpType]).Value := NewValue; end; function TFile.GetNameProperty: TFileNameProperty; begin Result := TFileNameProperty(FProperties[fpName]); end; procedure TFile.SetNameProperty(NewValue: TFileNameProperty); begin FProperties[fpName] := NewValue; if Assigned(NewValue) then Include(FSupportedProperties, fpName) else Exclude(FSupportedProperties, fpName); end; function TFile.GetAttributesProperty: TFileAttributesProperty; begin Result := TFileAttributesProperty(FProperties[fpAttributes]); end; procedure TFile.SetAttributesProperty(NewValue: TFileAttributesProperty); begin FProperties[fpAttributes] := NewValue; if Assigned(NewValue) then begin Include(FSupportedProperties, fpAttributes); UpdateNameAndExtension(Name); end else Exclude(FSupportedProperties, fpAttributes); end; function TFile.GetSizeProperty: TFileSizeProperty; begin Result := TFileSizeProperty(FProperties[fpSize]); end; procedure TFile.SetSizeProperty(NewValue: TFileSizeProperty); begin FProperties[fpSize] := NewValue; if Assigned(NewValue) then Include(FSupportedProperties, fpSize) else Exclude(FSupportedProperties, fpSize); end; function TFile.GetCompressedSizeProperty: TFileCompressedSizeProperty; begin Result := TFileCompressedSizeProperty(FProperties[fpCompressedSize]); end; procedure TFile.SetCompressedSizeProperty(NewValue: TFileCompressedSizeProperty); begin FProperties[fpCompressedSize] := NewValue; if Assigned(NewValue) then Include(FSupportedProperties, fpCompressedSize) else Exclude(FSupportedProperties, fpCompressedSize); end; function TFile.GetModificationTimeProperty: TFileModificationDateTimeProperty; begin Result := TFileModificationDateTimeProperty(FProperties[fpModificationTime]); end; procedure TFile.SetModificationTimeProperty(NewValue: TFileModificationDateTimeProperty); begin FProperties[fpModificationTime] := NewValue; if Assigned(NewValue) then Include(FSupportedProperties, fpModificationTime) else Exclude(FSupportedProperties, fpModificationTime); end; function TFile.GetCreationTimeProperty: TFileCreationDateTimeProperty; begin Result := TFileCreationDateTimeProperty(FProperties[fpCreationTime]); end; procedure TFile.SetCreationTimeProperty(NewValue: TFileCreationDateTimeProperty); begin FProperties[fpCreationTime] := NewValue; if Assigned(NewValue) then Include(FSupportedProperties, fpCreationTime) else Exclude(FSupportedProperties, fpCreationTime); end; function TFile.GetLastAccessTimeProperty: TFileLastAccessDateTimeProperty; begin Result := TFileLastAccessDateTimeProperty(FProperties[fpLastAccessTime]); end; procedure TFile.SetLastAccessTimeProperty(NewValue: TFileLastAccessDateTimeProperty); begin FProperties[fpLastAccessTime] := NewValue; if Assigned(NewValue) then Include(FSupportedProperties, fpLastAccessTime) else Exclude(FSupportedProperties, fpLastAccessTime); end; function TFile.GetLinkProperty: TFileLinkProperty; begin Result := TFileLinkProperty(FProperties[fpLink]); end; procedure TFile.SetLinkProperty(NewValue: TFileLinkProperty); begin FProperties[fpLink] := NewValue; if Assigned(NewValue) then Include(FSupportedProperties, fpLink) else Exclude(FSupportedProperties, fpLink); end; function TFile.GetOwnerProperty: TFileOwnerProperty; begin Result := TFileOwnerProperty(FProperties[fpOwner]); end; procedure TFile.SetOwnerProperty(NewValue: TFileOwnerProperty); begin FProperties[fpOwner] := NewValue; if Assigned(NewValue) then Include(FSupportedProperties, fpOwner) else Exclude(FSupportedProperties, fpOwner); end; function TFile.GetTypeProperty: TFileTypeProperty; begin Result := TFileTypeProperty(FProperties[fpType]); end; procedure TFile.SetTypeProperty(NewValue: TFileTypeProperty); begin FProperties[fpType] := NewValue; if Assigned(NewValue) then Include(FSupportedProperties, fpType) else Exclude(FSupportedProperties, fpType); end; function TFile.GetCommentProperty: TFileCommentProperty; begin Result := TFileCommentProperty(FProperties[fpComment]); end; procedure TFile.SetCommentProperty(NewValue: TFileCommentProperty); begin FProperties[fpComment] := NewValue; if Assigned(NewValue) then Include(FSupportedProperties, fpComment) else Exclude(FSupportedProperties, fpComment); end; function TFile.IsNameValid: Boolean; begin if Name <> '..' then Result := True else Result := False; end; function TFile.IsDirectory: Boolean; begin if fpAttributes in SupportedProperties then Result := TFileAttributesProperty(FProperties[fpAttributes]).IsDirectory else Result := False; end; function TFile.IsLink: Boolean; begin if fpAttributes in SupportedProperties then Result := TFileAttributesProperty(FProperties[fpAttributes]).IsLink else Result := False; end; function TFile.IsExecutable: Boolean; var FileAttributes: TFileAttributesProperty; begin if fpAttributes in SupportedProperties then begin FileAttributes := TFileAttributesProperty(FProperties[fpAttributes]); {$IF DEFINED(MSWINDOWS)} Result := not FileAttributes.IsDirectory; {$ELSEIF DEFINED(UNIX)} Result := (not FileAttributes.IsDirectory) and (FileAttributes.Value AND (S_IXUSR OR S_IXGRP OR S_IXOTH)>0); {$ELSE} Result := False; {$ENDIF} end else Result := False; end; function TFile.IsSysFile: Boolean; begin {$IFDEF MSWINDOWS} if fpAttributes in SupportedProperties then Result := TFileAttributesProperty(Properties[fpAttributes]).IsSysFile else Result := False; {$ELSE} // Files beginning with '.' are treated as system/hidden files on Unix. Result := (Length(Name) > 1) and (Name[1] = '.') and (Name[2] <> '.'); {$ENDIF} end; procedure TFile.SplitIntoNameAndExtension(const FileName: string; var aFileNameOnly: string; var aExtension: string); var i : longint; begin I := Length(FileName); while (I > 0) and (FileName[I] <> ExtensionSeparator) do Dec(I); if I > 1 then begin aFileNameOnly := Copy(FileName, 1, I - 1); aExtension := Copy(FileName, I + 1, MaxInt); end else begin // For files that does not have '.' or that have only // one '.' and beginning with '.' there is no extension. aFileNameOnly := FileName; aExtension := ''; end; end; procedure TFile.UpdateNameAndExtension(const FileName: string); begin // Cache Extension and NameNoExt. if (FileName = '') or IsDirectory or IsLinkToDirectory then begin // For directories there is no extension. FExtension := ''; FNameNoExt := FileName; end else begin SplitIntoNameAndExtension(FileName, FNameNoExt, FExtension); end; end; // ---------------------------------------------------------------------------- constructor TFiles.Create(const APath: String); begin inherited Create; FList := TFPList.Create; FOwnsObjects := True; Path := APath; end; destructor TFiles.Destroy; begin Clear; FreeAndNil(FList); inherited; end; function TFiles.Clone: TFiles; begin Result := TFiles.Create(Path); CloneTo(Result); end; procedure TFiles.CloneTo(Files: TFiles); var i: Integer; begin for i := 0 to FList.Count - 1 do begin Files.Add(Get(i).Clone); end; end; function TFiles.GetCount: Integer; begin Result := FList.Count; end; procedure TFiles.SetCount(Count: Integer); begin FList.Count := Count; end; function TFiles.Add(AFile: TFile): Integer; begin Result := FList.Add(AFile); end; procedure TFiles.Insert(AFile: TFile; AtIndex: Integer); begin FList.Insert(AtIndex, AFile); end; procedure TFiles.Clear; var i: Integer; p: Pointer; begin if OwnsObjects then begin for i := 0 to FList.Count - 1 do begin p := FList.Items[i]; TFile(p).Free; end; end; FList.Clear; end; function TFiles.Get(Index: Integer): TFile; begin Result := TFile(FList.Items[Index]); end; procedure TFiles.Put(Index: Integer; AFile: TFile); begin FList.Items[Index] := AFile; end; procedure TFiles.SetPath(const NewPath: String); begin if NewPath = '' then FPath := '' else FPath := IncludeTrailingPathDelimiter(NewPath); end; // ---------------------------------------------------------------------------- constructor TFileTreeNode.Create; begin Create(nil); end; constructor TFileTreeNode.Create(aFile: TFile); begin FSubNodes := nil; FFile := aFile; FData := nil; inherited Create; end; constructor TFileTreeNode.Create(aFile: TFile; DataClass: TClass); begin Create(aFile); FData := DataClass.Create; end; destructor TFileTreeNode.Destroy; var i: Integer; begin inherited Destroy; FreeAndNil(FFile); if Assigned(FSubNodes) then begin for i := 0 to FSubNodes.Count - 1 do TFileTreeNode(FSubNodes.Items[i]).Free; FreeAndNil(FSubNodes); end; FreeAndNil(FData); end; function TFileTreeNode.AddSubNode(aFile: TFile): Integer; var aNode: TFileTreeNode; begin if not Assigned(FSubNodes) then FSubNodes := TFPList.Create; aNode := TFileTreeNode.Create(aFile); Result := FSubNodes.Add(aNode); end; procedure TFileTreeNode.RemoveSubNode(Index: Integer); begin if (Index >= 0) and (Index < FSubNodes.Count) then begin TFileTreeNode(FSubNodes.Items[Index]).Free; FSubNodes.Delete(Index); end; end; function TFileTreeNode.Get(Index: Integer): TFileTreeNode; begin Result := TFileTreeNode(FSubNodes.Items[Index]); end; function TFileTreeNode.GetCount: Integer; begin if Assigned(FSubNodes) then Result := FSubNodes.Count else Result := 0; end; procedure TFileTreeNode.SetCount(Count: Integer); begin if not Assigned(FSubNodes) then FSubNodes := TFPList.Create; FSubNodes.Count := Count; end; procedure TFileTreeNode.SetData(NewData: TObject); var TmpData: TObject; begin if Assigned(FData) then begin TmpData := FData; FData := NewData; TmpData.Free; end else FData := NewData; end; end. doublecmd-0.5.8/src/fhackform.pas0000644000175000017500000000044411740433676015757 0ustar alexxalexxunit fHackForm; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms; type { TfrmHackForm } TfrmHackForm = class(TForm) private { private declarations } public { public declarations } end; var frmHackForm: TfrmHackForm; implementation {$R *.lfm} end. doublecmd-0.5.8/src/udrive.pas0000644000175000017500000001026211740433676015314 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Structures describing drives. Copyright (C) 2006-2010 Koblov Alexander (Alexx2000@mail.ru) Copyright (C) 2010 Przemyslaw Nagay (cobines@gmail.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uDrive; {$mode objfpc}{$H+} interface uses Classes; type TDriveType = (dtUnknown, dtFlash, // Flash drive dtFloppy, // 3.5'', ZIP drive, etc. dtHardDisk, // Hard disk drive dtNetwork, // Network share dtOptical, // CD, DVD, Blu-Ray, etc. dtRamDisk, // Ram-disk dtRemovable, // Drive with removable media dtRemovableUsb); // Drive connected via USB { TDrive } // On Linux we also put here mount points other than drives. TDrive = record DisplayName, // EmptyStr then Result := Drive^.DriveLabel else if not Drive^.IsMediaAvailable then Result := rsDriveNoMedia else Result := rsDriveNoLabel; end; { TDrivesList } constructor TDrivesList.Create; begin FList := TFPList.Create; end; destructor TDrivesList.Destroy; begin inherited Destroy; RemoveAll; FList.Free; end; function TDrivesList.Add(ADrive: PDrive): Integer; begin Result := FList.Add(ADrive); end; procedure TDrivesList.Remove(Index: Integer); begin if (Index >= 0) and (Index < FList.Count) then begin Dispose(PDrive(FList[Index])); FList.Delete(Index); end else raise ERangeError.Create('Invalid index'); end; procedure TDrivesList.RemoveAll; begin while FList.Count > 0 do Remove(0); end; procedure TDrivesList.Sort(Compare: TListSortCompare); begin FList.Sort(Compare); end; function TDrivesList.Get(Index: Integer): PDrive; begin if (Index >= 0) and (Index < FList.Count) then begin Result := PDrive(FList.Items[Index]); end else raise ERangeError.Create('Invalid index'); end; function TDrivesList.GetCount: Integer; begin Result := FList.Count; end; end. doublecmd-0.5.8/src/fsymlink.pas0000644000175000017500000000432412076733100015640 0ustar alexxalexxunit fSymLink; interface uses SysUtils, Classes, Controls, Forms, StdCtrls, Buttons; type { TfrmSymLink } TfrmSymLink = class(TForm) lblExistingFile: TLabel; lblLinkToCreate: TLabel; edtExistingFile: TEdit; edtLinkToCreate: TEdit; btnOK: TBitBtn; btnCancel: TBitBtn; procedure btnOKClick(Sender: TObject); procedure FormShow(Sender: TObject); private FCurrentPath: String; public constructor Create(TheOwner: TComponent; CurrentPath: String); reintroduce; end; function ShowSymLinkForm(const sExistingFile, sLinkToCreate, CurrentPath: String): Boolean; implementation {$R *.lfm} uses FileUtil, uLng, uGlobs, uLog, uShowMsg, uOSUtils, DCStrUtils; function ShowSymLinkForm(const sExistingFile, sLinkToCreate, CurrentPath: String): Boolean; begin with TfrmSymLink.Create(Application, CurrentPath) do begin try edtLinkToCreate.Text := sLinkToCreate; edtExistingFile.Text := sExistingFile; Result:= (ShowModal = mrOK); finally Free; end; end; end; constructor TfrmSymLink.Create(TheOwner: TComponent; CurrentPath: String); begin inherited Create(TheOwner); FCurrentPath := CurrentPath; end; procedure TfrmSymLink.btnOKClick(Sender: TObject); var sSrc,sDst:String; begin sSrc:=edtExistingFile.Text; sDst:=edtLinkToCreate.Text; if CompareFilenames(sSrc, sDst) = 0 then Exit; sSrc := GetAbsoluteFileName(FCurrentPath, sSrc); sDst := GetAbsoluteFileName(FCurrentPath, sDst); if CreateSymLink(sSrc, sDst) then begin // write log if (log_cp_mv_ln in gLogOptions) and (log_success in gLogOptions) then logWrite(Format(rsMsgLogSuccess+rsMsgLogSymLink,[sSrc+' -> '+sDst]), lmtSuccess); end else begin // write log if (log_cp_mv_ln in gLogOptions) and (log_errors in gLogOptions) then logWrite(Format(rsMsgLogError+rsMsgLogSymLink,[sSrc+' -> '+sDst]), lmtError); // Standart error modal dialog MsgError(rsSymErrCreate); end; end; procedure TfrmSymLink.FormShow(Sender: TObject); begin edtLinkToCreate.SelectAll; end; end. doublecmd-0.5.8/src/fsetfileproperties.pas0000644000175000017500000002764612014201074017726 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Change file properties dialog Copyright (C) 2009 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fSetFileProperties; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, ExtCtrls, StdCtrls, Buttons, EditBtn, uFileSourceSetFilePropertyOperation, DCBasicTypes, ZVDateTimePicker; type { TfrmSetFileProperties } TfrmSetFileProperties = class(TForm) Bevel2: TBevel; Bevel1: TBevel; btnCancel: TBitBtn; btnCreationTime: TSpeedButton; btnLastAccessTime: TSpeedButton; btnLastWriteTime: TSpeedButton; btnOK: TBitBtn; cbExecGroup: TCheckBox; cbExecOther: TCheckBox; cbExecOwner: TCheckBox; cbReadGroup: TCheckBox; cbReadOther: TCheckBox; cbReadOwner: TCheckBox; cbSgid: TCheckBox; cbSticky: TCheckBox; cbSuid: TCheckBox; cbWriteGroup: TCheckBox; cbWriteOther: TCheckBox; cbWriteOwner: TCheckBox; chkArchive: TCheckBox; chkCreationTime: TCheckBox; chkHidden: TCheckBox; chkLastAccessTime: TCheckBox; chkLastWriteTime: TCheckBox; chkReadOnly: TCheckBox; chkRecursive: TCheckBox; chkSystem: TCheckBox; edtOctal: TEdit; gbTimeSamp: TGroupBox; gbWinAttributes: TGroupBox; gbUnixAttributes: TGroupBox; lblAttrBitsStr: TLabel; lblAttrGroupStr: TLabel; lblAttrInfo: TLabel; lblAttrOtherStr: TLabel; lblAttrOwnerStr: TLabel; lblAttrText: TLabel; lblAttrTextStr: TLabel; lblExec: TLabel; lblOctal: TLabel; lblRead: TLabel; lblWrite: TLabel; DatesPanel: TPanel; ChecksPanel: TPanel; ZVCreationDateTime: TZVDateTimePicker; ZVLastWriteDateTime: TZVDateTimePicker; ZVLastAccessDateTime: TZVDateTimePicker; procedure btnCreationTimeClick(Sender: TObject); procedure btnLastAccessTimeClick(Sender: TObject); procedure btnLastWriteTimeClick(Sender: TObject); procedure btnOKClick(Sender: TObject); procedure cbChangeModeClick(Sender: TObject); procedure chkChangeAttrClick(Sender: TObject); procedure chkCreationTimeChange(Sender: TObject); procedure chkLastAccessTimeChange(Sender: TObject); procedure chkLastWriteTimeChange(Sender: TObject); procedure edtOctalKeyPress(Sender: TObject; var Key: char); procedure edtOctalKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormCreate(Sender: TObject); procedure ZVCreationDateTimeChange(Sender: TObject); procedure ZVLastAccessDateTimeChange(Sender: TObject); procedure ZVLastWriteDateTimeChange(Sender: TObject); private FOperation: TFileSourceSetFilePropertyOperation; FChangeTriggersEnabled: Boolean; procedure ShowMode(Mode: TFileAttrs); procedure ShowAttr(Attr: TFileAttrs); function GetModeFromForm: TFileAttrs; function GetAttrFromForm: TFileAttrs; public constructor Create(aOwner: TComponent; const aOperation: TFileSourceSetFilePropertyOperation); reintroduce; end; function ShowChangeFilePropertiesDialog(const aOperation: TFileSourceSetFilePropertyOperation): Boolean; implementation {$R *.lfm} uses LCLType, DCFileAttributes, DCStrUtils, uDCUtils, uFileProperty; function ShowChangeFilePropertiesDialog(const aOperation: TFileSourceSetFilePropertyOperation): Boolean; begin with TfrmSetFileProperties.Create(Application, aOperation) do try Result:= (ShowModal = mrOK); finally Free; end; end; { TfrmSetFileProperties } procedure TfrmSetFileProperties.btnOKClick(Sender: TObject); begin with FOperation do begin if fpAttributes in SupportedProperties then begin if NewProperties[fpAttributes] is TNtfsFileAttributesProperty then (NewProperties[fpAttributes] as TNtfsFileAttributesProperty).Value:= GetAttrFromForm; if NewProperties[fpAttributes] is TUnixFileAttributesProperty then (NewProperties[fpAttributes] as TUnixFileAttributesProperty).Value:= GetModeFromForm; end; if chkCreationTime.Checked then (NewProperties[fpCreationTime] as TFileCreationDateTimeProperty).Value:= ZVCreationDateTime.DateTime else begin NewProperties[fpCreationTime].Free; NewProperties[fpCreationTime]:= nil; end; if chkLastWriteTime.Checked then (NewProperties[fpModificationTime] as TFileModificationDateTimeProperty).Value:= ZVLastWriteDateTime.DateTime else begin NewProperties[fpModificationTime].Free; NewProperties[fpModificationTime]:= nil; end; if chkLastAccessTime.Checked then (NewProperties[fpLastAccessTime] as TFileLastAccessDateTimeProperty).Value:= ZVLastAccessDateTime.DateTime else begin NewProperties[fpLastAccessTime].Free; NewProperties[fpLastAccessTime]:= nil; end; Recursive:= chkRecursive.Checked; end; end; procedure TfrmSetFileProperties.cbChangeModeClick(Sender: TObject); begin if FChangeTriggersEnabled then begin FChangeTriggersEnabled := False; edtOctal.Text:= DecToOct(GetModeFromForm); FChangeTriggersEnabled := True; end; end; procedure TfrmSetFileProperties.chkChangeAttrClick(Sender: TObject); begin // Called after checking any windows-check end; procedure TfrmSetFileProperties.edtOctalKeyPress(Sender: TObject; var Key: char); begin if not ((Key in ['0'..'7']) or (Key = Chr(VK_BACK))) then Key:= #0; end; procedure TfrmSetFileProperties.edtOctalKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if FChangeTriggersEnabled then begin FChangeTriggersEnabled := False; ShowMode(OctToDec(edtOctal.Text)); FChangeTriggersEnabled := True; end; end; procedure TfrmSetFileProperties.FormCreate(Sender: TObject); begin end; procedure TfrmSetFileProperties.ShowMode(Mode: TFileAttrs); begin cbReadOwner.Checked:= ((Mode and S_IRUSR) = S_IRUSR); cbWriteOwner.Checked:= ((Mode and S_IWUSR) = S_IWUSR); cbExecOwner.Checked:= ((Mode and S_IXUSR) = S_IXUSR); cbReadGroup.Checked:= ((Mode and S_IRGRP) = S_IRGRP); cbWriteGroup.Checked:= ((Mode and S_IWGRP) = S_IWGRP); cbExecGroup.Checked:= ((Mode and S_IXGRP) = S_IXGRP); cbReadOther.Checked:= ((Mode and S_IROTH) = S_IROTH); cbWriteOther.Checked:= ((Mode and S_IWOTH) = S_IWOTH); cbExecOther.Checked:= ((Mode and S_IXOTH) = S_IXOTH); cbSuid.Checked:= ((Mode and S_ISUID) = S_ISUID); cbSgid.Checked:= ((Mode and S_ISGID) = S_ISGID); cbSticky.Checked:= ((Mode and S_ISVTX) = S_ISVTX); end; procedure TfrmSetFileProperties.ShowAttr(Attr: TFileAttrs); begin chkArchive.Checked:= ((Attr and FILE_ATTRIBUTE_ARCHIVE) <> 0); chkReadOnly.Checked:= ((Attr and FILE_ATTRIBUTE_READONLY) <> 0); chkHidden.Checked:= ((Attr and FILE_ATTRIBUTE_HIDDEN) <> 0); chkSystem.Checked:= ((Attr and FILE_ATTRIBUTE_SYSTEM) <> 0); end; function TfrmSetFileProperties.GetModeFromForm: TFileAttrs; begin Result:= 0; if cbReadOwner.Checked then Result:= (Result or S_IRUSR); if cbWriteOwner.Checked then Result:= (Result or S_IWUSR); if cbExecOwner.Checked then Result:= (Result or S_IXUSR); if cbReadGroup.Checked then Result:= (Result or S_IRGRP); if cbWriteGroup.Checked then Result:= (Result or S_IWGRP); if cbExecGroup.Checked then Result:= (Result or S_IXGRP); if cbReadOther.Checked then Result:= (Result or S_IROTH); if cbWriteOther.Checked then Result:= (Result or S_IWOTH); if cbExecOther.Checked then Result:= (Result or S_IXOTH); if cbSuid.Checked then Result:= (Result or S_ISUID); if cbSgid.Checked then Result:= (Result or S_ISGID); if cbSticky.Checked then Result:= (Result or S_ISVTX); end; function TfrmSetFileProperties.GetAttrFromForm: TFileAttrs; begin Result:= 0; if chkArchive.Checked then Result:= (Result or FILE_ATTRIBUTE_ARCHIVE); if chkReadOnly.Checked then Result:= (Result or FILE_ATTRIBUTE_READONLY); if chkHidden.Checked then Result:= (Result or FILE_ATTRIBUTE_HIDDEN); if chkSystem.Checked then Result:= (Result or FILE_ATTRIBUTE_SYSTEM); end; constructor TfrmSetFileProperties.Create(aOwner: TComponent; const aOperation: TFileSourceSetFilePropertyOperation); begin inherited Create(aOwner); FOperation:= aOperation; FChangeTriggersEnabled:= True; // Enable only supported file properties with FOperation do begin if fpAttributes in SupportedProperties then begin if NewProperties[fpAttributes] is TNtfsFileAttributesProperty then begin ShowAttr((NewProperties[fpAttributes] as TNtfsFileAttributesProperty).Value); gbWinAttributes.Show; end; if NewProperties[fpAttributes] is TUnixFileAttributesProperty then begin ShowMode((NewProperties[fpAttributes] as TUnixFileAttributesProperty).Value); gbUnixAttributes.Show; end; end; if (fpCreationTime in SupportedProperties) and Assigned(NewProperties[fpCreationTime]) then begin ZVCreationDateTime.DateTime:= (NewProperties[fpCreationTime] as TFileCreationDateTimeProperty).Value; ZVCreationDateTime.Enabled:= True; chkCreationTime.Enabled:= True; btnCreationTime.Enabled:= True; end; if (fpModificationTime in SupportedProperties) and Assigned(NewProperties[fpModificationTime]) then begin ZVLastWriteDateTime.DateTime:= (NewProperties[fpModificationTime] as TFileModificationDateTimeProperty).Value; ZVLastWriteDateTime.Enabled:= True; chkLastWriteTime.Enabled:= True; btnLastWriteTime.Enabled:= True; end; if (fpLastAccessTime in SupportedProperties) and Assigned(NewProperties[fpLastAccessTime]) then begin ZVLastAccessDateTime.DateTime:= (NewProperties[fpLastAccessTime] as TFileLastAccessDateTimeProperty).Value; ZVLastAccessDateTime.Enabled:= True; chkLastAccessTime.Enabled:= True; btnLastAccessTime.Enabled:= True; end; end; chkCreationTime.Checked:=False; chkLastWriteTime.Checked:=False; chkLastAccessTime.Checked:=False; end; procedure TfrmSetFileProperties.btnCreationTimeClick(Sender: TObject); begin ZVCreationDateTime.DateTime:= Now; end; procedure TfrmSetFileProperties.btnLastAccessTimeClick(Sender: TObject); begin ZVLastAccessDateTime.DateTime:= Now; end; procedure TfrmSetFileProperties.btnLastWriteTimeClick(Sender: TObject); begin ZVLastWriteDateTime.DateTime:= Now; end; procedure TfrmSetFileProperties.chkCreationTimeChange(Sender: TObject); begin UpdateColor(ZVCreationDateTime, chkCreationTime.Checked); if (chkCreationTime.Checked and Visible) then ZVCreationDateTime.SetFocus; end; procedure TfrmSetFileProperties.chkLastAccessTimeChange(Sender: TObject); begin UpdateColor(ZVLastAccessDateTime, chkLastAccessTime.Checked); if (chkLastAccessTime.Checked and Visible) then ZVLastAccessDateTime.SetFocus; end; procedure TfrmSetFileProperties.chkLastWriteTimeChange(Sender: TObject); begin UpdateColor(ZVLastWriteDateTime, chkLastWriteTime.Checked); if (chkLastWriteTime.Checked and Visible) then ZVLastWriteDateTime.SetFocus; end; procedure TfrmSetFileProperties.ZVCreationDateTimeChange(Sender: TObject); begin chkCreationTime.Checked:=True; end; procedure TfrmSetFileProperties.ZVLastAccessDateTimeChange(Sender: TObject); begin chkLastAccessTime.Checked:=True; end; procedure TfrmSetFileProperties.ZVLastWriteDateTimeChange(Sender: TObject); begin chkLastWriteTime.Checked:=True; end; end. doublecmd-0.5.8/src/uquickviewpanel.pas0000644000175000017500000001117112247664766017243 0ustar alexxalexxunit uQuickViewPanel; {$mode objfpc}{$H+} interface uses Classes, SysUtils, ExtCtrls, fViewer, uFileViewNotebook, uFile, uFileSource, uFileView; type { TQuickViewPanel } TQuickViewPanel = class(TPanel) private FFirstFile: Boolean; FFileViewPage: TFileViewPage; FFileView: TFileView; FFileSource: IFileSource; FViewer: TfrmViewer; FFileName: UTF8String; public constructor Create(TheOwner: TComponent; aParent: TFileViewPage); reintroduce; destructor Destroy; override; procedure CreateViewer(aFileView: TFileView); procedure LoadFile(const aFileName: UTF8String); procedure FileViewChangeActiveFile(Sender: TFileView; const aFile : TFile); end; procedure QuickViewShow(aFileViewPage: TFileViewPage; aFileView: TFileView); procedure QuickViewClose; var QuickViewPanel: TQuickViewPanel; implementation uses LCLProc, Forms, Controls, uTempFileSystemFileSource, uFileSourceProperty, uFileSourceOperation, uFileSourceOperationTypes; procedure QuickViewShow(aFileViewPage: TFileViewPage; aFileView: TFileView); var aFile: TFile = nil; begin QuickViewPanel:= TQuickViewPanel.Create(Application, aFileViewPage); QuickViewPanel.CreateViewer(aFileView); aFile := aFileView.CloneActiveFile; try QuickViewPanel.FileViewChangeActiveFile(aFileView, aFile); finally FreeAndNil(aFile); end; aFileView.OnChangeActiveFile:= @QuickViewPanel.FileViewChangeActiveFile; end; procedure QuickViewClose; begin FreeThenNil(QuickViewPanel); end; { TQuickViewPanel } constructor TQuickViewPanel.Create(TheOwner: TComponent; aParent: TFileViewPage); begin inherited Create(TheOwner); Parent:= aParent; Align:= alClient; FFileViewPage:= aParent; FFileSource:= nil; FViewer:= nil; end; destructor TQuickViewPanel.Destroy; begin FFileView.OnChangeActiveFile:= nil; FViewer.ExitPluginMode; FFileViewPage.FileView.Visible:= True; FreeThenNil(FViewer); FFileSource:= nil; FFileView.SetFocus; inherited Destroy; end; procedure TQuickViewPanel.CreateViewer(aFileView: TFileView); begin FViewer:= TfrmViewer.Create(Self, nil, True); FViewer.Parent:= Self; FViewer.BorderStyle:= bsNone; FViewer.Menu:= nil; FViewer.Align:= alClient; FFirstFile:= True; FFileView:= aFileView; FFileSource:= aFileView.FileSource; FFileViewPage.FileView.Visible:= False; end; procedure TQuickViewPanel.LoadFile(const aFileName: UTF8String); begin if FFirstFile then begin FFirstFile:= False; FViewer.LoadFile(aFileName); FViewer.Show; end else begin FViewer.LoadNextFile(aFileName); end; // Viewer can steal focus, so restore it if not FFileView.Focused then FFileView.SetFocus; end; procedure TQuickViewPanel.FileViewChangeActiveFile(Sender: TFileView; const aFile: TFile); var ActiveFile: TFile = nil; TempFiles: TFiles = nil; TempFileSource: ITempFileSystemFileSource = nil; Operation: TFileSourceOperation = nil; begin if not (Assigned(aFile) and (aFile.Name <> '..')) then Exit; try // If files are links to local files if (fspLinksToLocalFiles in Sender.FileSource.Properties) then begin if aFile.IsDirectory or aFile.IsLinkToDirectory then Exit; FFileSource := Sender.FileSource; ActiveFile:= aFile.Clone; if not FFileSource.GetLocalName(ActiveFile) then Exit; end // If files not directly accessible copy them to temp file source. else if not (fspDirectAccess in Sender.FileSource.Properties) then begin if aFile.IsDirectory or SameText(FFileName, aFile.Name) then Exit; if not (fsoCopyOut in Sender.FileSource.GetOperationsTypes) then Exit; ActiveFile:= aFile.Clone; TempFiles:= TFiles.Create(Sender.CurrentPath); TempFiles.Add(aFile.Clone); if FFileSource.IsClass(TTempFileSystemFileSource) then TempFileSource := (FFileSource as ITempFileSystemFileSource) else TempFileSource := TTempFileSystemFileSource.GetFileSource; Operation := Sender.FileSource.CreateCopyOutOperation( TempFileSource, TempFiles, TempFileSource.FileSystemRoot); if not Assigned(Operation) then Exit; Operation.Execute; FreeAndNil(Operation); FFileName:= ActiveFile.Name; FFileSource := TempFileSource; ActiveFile.Path:= TempFileSource.FileSystemRoot; end else begin // We can use the file source directly. FFileSource := Sender.FileSource; ActiveFile:= aFile.Clone; end; LoadFile(ActiveFile.FullPath); finally FreeThenNil(TempFiles); FreeThenNil(ActiveFile); end; end; end. doublecmd-0.5.8/src/ffileproperties.pas0000644000175000017500000004021311767343427017222 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------- File Properties Dialog Copyright (C) 2003-2004 Radek Cervinka (radek.cervinka@centrum.cz) Copyright (C) 2003 Martin Matusu Copyright (C) 2006-2009 Alexander Koblov (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License in a file called COPYING along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. } unit fFileProperties; {$mode objfpc}{$H+} interface uses LResources, SysUtils, Classes, Graphics, Forms, StdCtrls, Buttons, ComCtrls, Dialogs, Controls, ExtCtrls, DCBasicTypes, uFile, uFileProperty, uFileSource, uFileSourceOperation, uFileSourceCalcStatisticsOperation; type { TfrmFileProperties } TfrmFileProperties = class(TForm) btnSetPropertiesToAllFiles: TBitBtn; btnClose: TBitBtn; btnSetProperties: TBitBtn; btnSkipFile: TBitBtn; cbExecGroup: TCheckBox; cbExecOther: TCheckBox; cbExecOwner: TCheckBox; cbReadGroup: TCheckBox; cbReadOther: TCheckBox; cbReadOwner: TCheckBox; cbSgid: TCheckBox; cbSticky: TCheckBox; cbSuid: TCheckBox; cbWriteGroup: TCheckBox; cbWriteOther: TCheckBox; cbWriteOwner: TCheckBox; cbxGroups: TComboBox; cbxUsers: TComboBox; edtOctal: TEdit; gbOwner: TGroupBox; lblFileName: TLabel; lblFileNameStr: TLabel; lblFolder: TLabel; lblFolderStr: TLabel; lblLastAccess: TLabel; lblLastAccessStr: TLabel; lblLastModif: TLabel; lblLastModifStr: TLabel; lblLastStChange: TLabel; lblLastStChangeStr: TLabel; lblOctal: TLabel; lblAttrBitsStr: TLabel; lblAttrText: TLabel; lblExec: TLabel; lblFileStr: TLabel; lblFile: TLabel; lblAttrGroupStr: TLabel; lblGroupStr: TLabel; lblAttrOtherStr: TLabel; lblAttrOwnerStr: TLabel; lblOwnerStr: TLabel; lblRead: TLabel; lblSize: TLabel; lblContains: TLabel; lblSizeStr: TLabel; lblContainsStr: TLabel; lblSymlink: TLabel; lblAttrTextStr: TLabel; lblSymlinkStr: TLabel; lblType: TLabel; lblTypeStr: TLabel; lblWrite: TLabel; pnlCaption: TPanel; pnlData: TPanel; pcPageControl: TPageControl; tmUpdateFolderSize: TTimer; tsProperties: TTabSheet; tsAttributes: TTabSheet; procedure btnSetPropertiesToAllFilesClick(Sender: TObject); procedure btnCloseClick(Sender: TObject); procedure cbChangeModeClick(Sender: TObject); procedure edtOctalKeyPress(Sender: TObject; var Key: char); procedure edtOctalKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormCreate(Sender: TObject); procedure btnSetPropertiesClick(Sender: TObject); procedure btnSkipFileClick(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure tmUpdateFolderSizeTimer(Sender: TObject); procedure FileSourceOperationStateChangedNotify(Operation: TFileSourceOperation; State: TFileSourceOperationState); private bPerm: Boolean; iCurrent: Integer; FFileSource: IFileSource; FFiles: TFiles; FPropertyFormatter: IFilePropertyFormatter; FFileSourceCalcStatisticsOperation: TFileSourceCalcStatisticsOperation; ChangeTriggersEnabled: Boolean; OriginalAttr: TFileAttrs; OriginalUser, OriginalGroup: String; FChangedProperties: Boolean; procedure ShowPermissions(Mode: TFileAttrs); function ChangeProperties: Boolean; function CheckIfChangedProperties: Boolean; function GetModeFromForm: TFileAttrs; procedure ShowFile(iIndex:Integer); procedure AllowChange(Allow: Boolean); procedure StartCalcFolderSize; procedure StopCalcFolderSize; public constructor Create(AOwner: TComponent; aFileSource: IFileSource; theFiles: TFiles); reintroduce; destructor Destroy; override; end; procedure ShowFileProperties(aFileSource: IFileSource; const aFiles: TFiles); implementation {$R *.lfm} uses LCLType, FileUtil, StrUtils, uLng, BaseUnix, uUsersGroups, uDCUtils, uOSUtils, uDefaultFilePropertyFormatter, uMyUnix, DCFileAttributes, uFileSourceOperationTypes, uFileSystemFileSource, uOperationsManager, uFileSourceOperationOptions, uKeyboard, DCStrUtils; procedure ShowFileProperties(aFileSource: IFileSource; const aFiles: TFiles); begin if aFiles.Count > 0 then begin with TfrmFileProperties.Create(Application, aFileSource, aFiles) do try ShowModal; finally Free; end; end; end; constructor TfrmFileProperties.Create(AOwner: TComponent; aFileSource: IFileSource; theFiles: TFiles); begin FFileSource:= aFileSource; FFiles := theFiles; FPropertyFormatter := MaxDetailsFilePropertyFormatter; ChangeTriggersEnabled := True; inherited Create(AOwner); end; destructor TfrmFileProperties.Destroy; begin StopCalcFolderSize; inherited Destroy; FPropertyFormatter := nil; // free interface end; function TfrmFileProperties.GetModeFromForm: TFileAttrs; begin Result:=0; if cbReadOwner.Checked then Result:=(Result OR S_IRUSR); if cbWriteOwner.Checked then Result:=(Result OR S_IWUSR); if cbExecOwner.Checked then Result:=(Result OR S_IXUSR); if cbReadGroup.Checked then Result:=(Result OR S_IRGRP); if cbWriteGroup.Checked then Result:=(Result OR S_IWGRP); if cbExecGroup.Checked then Result:=(Result OR S_IXGRP); if cbReadOther.Checked then Result:=(Result OR S_IROTH); if cbWriteOther.Checked then Result:=(Result OR S_IWOTH); if cbExecOther.Checked then Result:=(Result OR S_IXOTH); if cbSuid.Checked then Result:=(Result OR S_ISUID); if cbSgid.Checked then Result:=(Result OR S_ISGID); if cbSticky.Checked then Result:=(Result OR S_ISVTX); end; procedure TfrmFileProperties.btnCloseClick(Sender: TObject); begin if FChangedProperties then FFileSource.Reload(FFiles.Path); Close; end; procedure TfrmFileProperties.cbChangeModeClick(Sender: TObject); begin if ChangeTriggersEnabled then begin ChangeTriggersEnabled := False; edtOctal.Text:= DecToOct(GetModeFromForm); ChangeTriggersEnabled := True; end; end; procedure TfrmFileProperties.edtOctalKeyPress(Sender: TObject; var Key: char); begin if not ((Key in ['0'..'7']) or (Key = Chr(VK_BACK)) or (Key = Chr(VK_DELETE))) then Key:= #0; end; procedure TfrmFileProperties.edtOctalKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if ChangeTriggersEnabled then begin ChangeTriggersEnabled := False; ShowPermissions(OctToDec(edtOctal.Text)); ChangeTriggersEnabled := True; end; end; procedure TfrmFileProperties.btnSetPropertiesToAllFilesClick(Sender: TObject); begin repeat if not ChangeProperties then Exit; Inc (iCurrent); until (iCurrent = FFiles.Count); FFileSource.Reload(FFiles.Path); Close; end; procedure TfrmFileProperties.ShowPermissions(Mode: TFileAttrs); begin cbReadOwner.Checked:= ((Mode AND S_IRUSR) = S_IRUSR); cbWriteOwner.Checked:= ((Mode AND S_IWUSR) = S_IWUSR); cbExecOwner.Checked:= ((Mode AND S_IXUSR) = S_IXUSR); cbReadGroup.Checked:= ((Mode AND S_IRGRP) = S_IRGRP); cbWriteGroup.Checked:= ((Mode AND S_IWGRP) = S_IWGRP); cbExecGroup.Checked:= ((Mode AND S_IXGRP) = S_IXGRP); cbReadOther.Checked:= ((Mode AND S_IROTH) = S_IROTH); cbWriteOther.Checked:= ((Mode AND S_IWOTH) = S_IWOTH); cbExecOther.Checked:= ((Mode AND S_IXOTH) = S_IXOTH); cbSuid.Checked:= ((Mode AND S_ISUID) = S_ISUID); cbSgid.Checked:= ((Mode AND S_ISGID) = S_ISGID); cbSticky.Checked:= ((Mode AND S_ISVTX) = S_ISVTX); end; function TfrmFileProperties.ChangeProperties: Boolean; begin Result:= True; // First set owner/group because it clears SUID bit. if bPerm then begin if fplchown(PChar(UTF8ToSys(FFiles[iCurrent].FullPath)), StrToUID(cbxUsers.Text), StrToGID(cbxGroups.Text)) <> 0 then begin if MessageDlg(Caption, Format(rsPropsErrChOwn, [FFiles[iCurrent].Name]), mtError, mbOKCancel, 0) = mrCancel then Exit(False); end; end; if not FFiles[iCurrent].IsLink then begin if fpchmod(PAnsiChar(UTF8ToSys(FFiles[iCurrent].FullPath)), GetModeFromForm) <> 0 then begin if MessageDlg(Caption, Format(rsPropsErrChMod, [FFiles[iCurrent].Name]), mtError, mbOKCancel, 0) = mrCancel then Exit(False); end; end; end; function TfrmFileProperties.CheckIfChangedProperties: Boolean; begin Result := (OriginalAttr <> GetModeFromForm) or (OriginalUser <> cbxUsers.Text) or (OriginalGroup <> cbxGroups.Text); end; procedure TfrmFileProperties.ShowFile(iIndex:Integer); var sb: BaseUnix.Stat; iMyUID: Cardinal; Attrs: TFileAttrs; isFileSystem: Boolean; hasSize: Boolean; begin StopCalcFolderSize; // Stop previous calculate folder size operation isFileSystem := FFileSource.IsClass(TFileSystemFileSource); with FFiles[iIndex] do begin lblFileName.Caption:= Name; lblFile.Caption:= Name; lblFolder.Caption:= Path; // Size hasSize := (fpSize in SupportedProperties); if hasSize then begin if IsDirectory and (fsoCalcStatistics in FFileSource.GetOperationsTypes) then StartCalcFolderSize // Start calculate folder size operation else lblSize.Caption := Properties[fpSize].Format(FPropertyFormatter); end; lblSize.Visible := hasSize; lblSizeStr.Visible := hasSize; lblContains.Visible:= IsDirectory; lblContainsStr.Visible:= IsDirectory; // Times lblLastAccess.Visible := fpLastAccessTime in SupportedProperties; lblLastAccessStr.Visible := fpLastAccessTime in SupportedProperties; if fpLastAccessTime in SupportedProperties then lblLastAccess.Caption := Properties[fpLastAccessTime].Format(FPropertyFormatter) else lblLastAccess.Caption:=''; lblLastStChange.Visible := fpCreationTime in SupportedProperties; lblLastStChangeStr.Visible := fpCreationTime in SupportedProperties; if fpCreationTime in SupportedProperties then lblLastStChange.Caption := Properties[fpCreationTime].Format(FPropertyFormatter) else lblLastStChange.Caption:=''; lblLastModif.Visible := fpModificationTime in SupportedProperties; lblLastModifStr.Visible := fpModificationTime in SupportedProperties; if fpModificationTime in SupportedProperties then lblLastModif.Caption := Properties[fpModificationTime].Format(FPropertyFormatter) else lblLastModif.Caption:=''; // Chown if isFileSystem and (fpLStat(PChar(UTF8ToSys(FullPath)), sb) = 0) then begin OriginalUser := UIDToStr(sb.st_uid); OriginalGroup := GIDToStr(sb.st_gid); iMyUID:= fpGetUID; //get user's UID bPerm:= (iMyUID = sb.st_uid); cbxUsers.Text:= OriginalUser; if(imyUID = 0) then GetUsers(cbxUsers.Items); //huh, a ROOT :)) cbxUsers.Enabled:= (imyUID = 0); cbxGroups.Text:= OriginalGroup; if(bPerm or (iMyUID = 0)) then GetUsrGroups(iMyUID, cbxGroups.Items); cbxGroups.Enabled:= (bPerm or (iMyUID = 0)); end; // Attributes if fpAttributes in SupportedProperties then begin Attrs := AttributesProperty.Value; OriginalAttr := Attrs and $0FFF; //if Attrs is TUnixFileAttributesProperty //if Attrs is TNtfsFileAttributesProperty ShowPermissions(Attrs); edtOctal.Text:= DecToOct(GetModeFromForm); lblAttrText.Caption := Properties[fpAttributes].Format(DefaultFilePropertyFormatter); if FPS_ISDIR(Attrs) then lblType.Caption:=rsPropsFolder else if FPS_ISREG(Attrs) then lblType.Caption:=rsPropsFile else if FPS_ISCHR(Attrs) then lblType.Caption:=rsPropsSpChrDev else if FPS_ISBLK(Attrs) then lblType.Caption:=rsPropsSpBlkDev else if FPS_ISFIFO(Attrs) then lblType.Caption:=rsPropsNmdPipe else if FPS_ISLNK(Attrs) then lblType.Caption:=rsPropsSymLink else if FPS_ISSOCK(Attrs) then lblType.Caption:=rsPropsSocket else lblType.Caption:=rsPropsUnknownType; lblSymlink.Visible := FPS_ISLNK(Attrs); lblSymlinkStr.Visible := FPS_ISLNK(Attrs); if FPS_ISLNK(Attrs) and isFileSystem then begin //lblSymlink.Caption := sLinkTo; // maybe make property for this lblSymlink.Caption := ReadSymLink(FullPath); end else begin lblSymlink.Visible := False; lblSymlinkStr.Visible := False; end; end else begin edtOctal.Text:=rsMsgErrNotSupported; lblAttrText.Caption:=rsMsgErrNotSupported; lblType.Caption:=rsPropsUnknownType; lblSymlink.Caption:=''; end; end; // Only allow changes for file system file. AllowChange(isFileSystem); end; procedure TfrmFileProperties.FormCreate(Sender: TObject); begin lblFileNameStr.Font.Style:=[fsBold]; lblFileName.Font.Style:=[fsBold]; AllowChange(False); ShowFile(0); end; procedure TfrmFileProperties.btnSetPropertiesClick(Sender: TObject); begin if CheckIfChangedProperties then FChangedProperties := True; if not ChangeProperties then Exit; btnSkipFileClick(Self); end; procedure TfrmFileProperties.btnSkipFileClick(Sender: TObject); begin inc(iCurrent); if iCurrent >= FFiles.Count then begin if FChangedProperties then FFileSource.Reload(FFiles.Path); Close; end else ShowFile(iCurrent); end; procedure TfrmFileProperties.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Key of VK_TAB: begin if Shift * KeyModifiersShortcut = [ssCtrl] then begin pcPageControl.SelectNextPage(True); Key := 0; end else if Shift * KeyModifiersShortcut = [ssCtrl, ssShift] then begin pcPageControl.SelectNextPage(False); Key := 0; end; end; end; end; procedure TfrmFileProperties.tmUpdateFolderSizeTimer(Sender: TObject); begin if Assigned(FFileSourceCalcStatisticsOperation) then with FFileSourceCalcStatisticsOperation.RetrieveStatistics do begin lblSize.Caption := Format('%s (%s)', [cnvFormatFileSize(Size), Numb2USA(IntToStr(Size))]); lblContains.Caption := Format(rsPropsContains, [Files, Directories]); end; end; procedure TfrmFileProperties.FileSourceOperationStateChangedNotify( Operation: TFileSourceOperation; State: TFileSourceOperationState); begin if Assigned(FFileSourceCalcStatisticsOperation) and (State = fsosStopped) then begin tmUpdateFolderSize.Enabled:= False; tmUpdateFolderSizeTimer(tmUpdateFolderSize); FFileSourceCalcStatisticsOperation := nil; end; end; procedure TfrmFileProperties.AllowChange(Allow: Boolean); begin btnSetPropertiesToAllFiles.Enabled := Allow; btnSetProperties.Enabled := Allow; end; procedure TfrmFileProperties.StartCalcFolderSize; var aFiles: TFiles; begin aFiles:= TFiles.Create(FFiles.Path); aFiles.Add(FFiles.Items[iCurrent].Clone); FFileSourceCalcStatisticsOperation:= FFileSource.CreateCalcStatisticsOperation(aFiles) as TFileSourceCalcStatisticsOperation; if Assigned(FFileSourceCalcStatisticsOperation) then begin FFileSourceCalcStatisticsOperation.SkipErrors:= True; FFileSourceCalcStatisticsOperation.SymLinkOption:= fsooslDontFollow; FFileSourceCalcStatisticsOperation.AddStateChangedListener([fsosStopped], @FileSourceOperationStateChangedNotify); OperationsManager.AddOperation(FFileSourceCalcStatisticsOperation); tmUpdateFolderSize.Enabled:= True; end; end; procedure TfrmFileProperties.StopCalcFolderSize; begin if Assigned(FFileSourceCalcStatisticsOperation) then begin tmUpdateFolderSize.Enabled:= False; FFileSourceCalcStatisticsOperation.Stop; end; FFileSourceCalcStatisticsOperation:= nil; end; end. doublecmd-0.5.8/src/fhackform.lfm0000644000175000017500000000025212045446211015733 0ustar alexxalexxobject frmHackForm: TfrmHackForm Left = 455 Height = 300 Top = 236 Width = 400 Position = poScreenCenter ShowInTaskBar = stNever LCLVersion = '1.0.1.3' end doublecmd-0.5.8/src/uclassesex.pas0000644000175000017500000000753012165754151016175 0ustar alexxalexx{ Double commander ------------------------------------------------------------------------- This module contains additional or extended classes. Copyright (C) 2008-2013 Alexander Koblov (alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uClassesEx; {$mode objfpc}{$H+} interface uses Classes, SysUtils, IniPropStorage; type { TBlobStream } TBlobStream = class(TCustomMemoryStream) public constructor Create(Ptr: Pointer; ASize: PtrInt); end; { TIniPropStorageEx } TIniPropStorageEx = class(TCustomIniPropStorage) private FPercentSize: Integer; function ChangeIdent(const Ident: String): String; protected function IniFileClass: TIniFileClass; override; public constructor Create(AOwner: TComponent); override; procedure Restore; override; function DoReadString(const Section, Ident, default: string): string; override; procedure DoWriteString(const Section, Ident, Value: string); override; property PercentSize: Integer read FPercentSize write FPercentSize; end; implementation uses Forms, DCStrUtils, DCClassesUtf8; { TBlobStream } constructor TBlobStream.Create(Ptr: Pointer; ASize: PtrInt); begin inherited Create; SetPointer(Ptr, ASize); end; { TIniPropStorageEx } function TIniPropStorageEx.IniFileClass: TIniFileClass; begin Result:= TIniFileEx; end; constructor TIniPropStorageEx.Create(AOwner: TComponent); begin inherited Create(AOwner); FPercentSize:= 5; end; procedure TIniPropStorageEx.Restore; var mLeft, mTop, // monitor left and top mWidth, mHeight, // monitor width and height pWidth, pHeight: Integer; begin inherited Restore; if Self.Owner is TCustomForm then with Self.Owner as TCustomForm do begin // Workaround for bug: http://bugs.freepascal.org/view.php?id=22499 if Assigned(Monitor) then begin mLeft:= Monitor.Left; mTop:= Monitor.Top; mWidth:= Monitor.Width; mHeight:= Monitor.Height; pWidth:= (mWidth * FPercentSize) div 100; pHeight:= (mHeight * FPercentSize) div 100; if (mWidth < Width) or (mHeight < Height) then begin Width:= mWidth - pWidth; Height:= mHeight - (pHeight * 2); end; if (Top > (mTop + mHeight - pHeight)) or (Top < mTop) then Top:= mTop + pHeight; if (Left > (mLeft + mWidth - pWidth)) or ((Left + Width - pWidth) < mLeft) then Left:= mLeft + pWidth; end; // Workaround for bug: http://bugs.freepascal.org/view.php?id=18514 if WindowState = wsMinimized then WindowState:= wsNormal; end; end; function TIniPropStorageEx.DoReadString(const Section, Ident, default: string): string; begin Result := inherited DoReadString(Section, ChangeIdent(Ident), default); end; procedure TIniPropStorageEx.DoWriteString(const Section, Ident, Value: string); begin inherited DoWriteString(Section, ChangeIdent(Ident), Value); end; function TIniPropStorageEx.ChangeIdent(const Ident: String): String; begin // Change component name to class name. if StrBegins(Ident, Owner.Name) then Result := Owner.ClassName + Copy(Ident, 1 + Length(Owner.Name), MaxInt) else Result := Ident; end; end. doublecmd-0.5.8/src/fviewoperations.lrt0000644000175000017500000000206311747211345017252 0ustar alexxalexxTFRMVIEWOPERATIONS.CAPTION=File operations TFRMVIEWOPERATIONS.TBPAUSEALL.CAPTION=&Pause all TFRMVIEWOPERATIONS.BTNSTOP.CAPTION=S&top TFRMVIEWOPERATIONS.BTNSTARTPAUSE.CAPTION=&Start TFRMVIEWOPERATIONS.LBLUSEDRAGDROP.CAPTION=Use "drag && drop" to move operations between queues TFRMVIEWOPERATIONS.CBALWAYSONTOP.CAPTION=Always on top TFRMVIEWOPERATIONS.MNUQUEUE.CAPTION=Queue TFRMVIEWOPERATIONS.MNUQUEUE0.CAPTION=Out of queue TFRMVIEWOPERATIONS.MNUQUEUE1.CAPTION=Queue 1 TFRMVIEWOPERATIONS.MNUQUEUE2.CAPTION=Queue 2 TFRMVIEWOPERATIONS.MNUQUEUE3.CAPTION=Queue 3 TFRMVIEWOPERATIONS.MNUQUEUE4.CAPTION=Queue 4 TFRMVIEWOPERATIONS.MNUQUEUE5.CAPTION=Queue 5 TFRMVIEWOPERATIONS.MNUNEWQUEUE.CAPTION=New queue TFRMVIEWOPERATIONS.MNUOPERATIONSHOWDETACHED.CAPTION=Show in detached window TFRMVIEWOPERATIONS.MNUPUTFIRSTINQUEUE.CAPTION=Put first in queue TFRMVIEWOPERATIONS.MNUPUTLASTINQUEUE.CAPTION=Put last in queue TFRMVIEWOPERATIONS.MNUCANCELOPERATION.CAPTION=Cancel TFRMVIEWOPERATIONS.MNUQUEUESHOWDETACHED.CAPTION=Show in detached window TFRMVIEWOPERATIONS.MNUCANCELQUEUE.CAPTION=Cancel doublecmd-0.5.8/src/fsplitter.pas0000644000175000017500000001547711740433676016047 0ustar alexxalexx{ Seksi Commander ---------------------------- Licence : GNU GPL v 2.0 Author : Pavel Letko (letcuv@centrum.cz) File split contributors: Radek Cervinka } unit fSplitter; {$mode objfpc}{$H+} interface uses SysUtils, Classes, Controls, Forms, Dialogs, StdCtrls, uFileSource, uFile; type { TfrmSplitter } TfrmSplitter = class(TForm) teNumberParts: TEdit; grbxFile: TGroupBox; edFileSource: TEdit; lblNumberParts: TLabel; lbFileSource: TLabel; edDirTarget: TEdit; lbDirTarget: TLabel; btnFTChoice: TButton; grbxSize: TGroupBox; cmbxSize: TComboBox; btnOK: TButton; btnCancel: TButton; rbtnKiloB: TRadioButton; rbtnMegaB: TRadioButton; rbtnGigaB: TRadioButton; procedure btnFTChoiceClick(Sender: TObject); procedure cmbxSizeCloseUp(Sender: TObject); procedure cmbxSizeKeyPress(Sender: TObject; var Key: char); procedure cmbxSizeKeyUp(Sender: TObject; var Key: char; Shift: TShiftState); procedure FormCreate(Sender: TObject); procedure rbtnKiloBChange(Sender: TObject); procedure SetNumberOfPart; procedure SetSizeOfPart; procedure teNumberPartsKeyPress(Sender: TObject; var Key: char); procedure teNumberPartsKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } function StrConvert(str: String): Int64; public { Public declarations } end; function ShowSplitterFileForm(aFileSource: IFileSource; var aFile: TFile; const TargetPath: UTF8String): Boolean; implementation {$R *.lfm} uses LCLProc, uLng, uFileProcs, uOperationsManager, uFileSourceSplitOperation, uShowMsg, DCOSUtils; function ShowSplitterFileForm(aFileSource: IFileSource; var aFile: TFile; const TargetPath: UTF8String): Boolean; var iVolumeNumber: Integer; iFileSize, iVolumeSize: Int64; Operation: TFileSourceSplitOperation = nil; begin with TfrmSplitter.Create(Application) do begin try edFileSource.Text:= aFile.FullPath; edDirTarget.Text:= TargetPath; SetNumberOfPart; // Show form Result:= (ShowModal = mrOK); if Result then begin iVolumeSize:= StrConvert(cmbxSize.Text); if iVolumeSize <= 0 then begin msgError(rsSplitErrFileSize); // Incorrect file size format! Exit; end; iFileSize:= mbFileSize(edFileSource.Text); if iVolumeSize >= iFileSize then begin msgError(rsSplitErrSplitFile); // Unable to split the file! Exit; end; if not mbForceDirectory(edDirTarget.Text) then begin msgError(rsSplitErrDirectory); // Unable to create target directory! Exit; end; iVolumeNumber:= StrToInt(teNumberParts.Text); if (iVolumeNumber = 0) then begin msgError(rsSplitErrSplitFile); // Unable to split the file! Exit; end; if iVolumeNumber > 100 then begin if MessageDlg(Caption, rsSplitMsgManyParts, mtWarning, mbYesNo, 0) <> mrYes then begin Exit; // Too many parts end; end; try Operation:= aFileSource.CreateSplitOperation(aFile, edDirTarget.Text) as TFileSourceSplitOperation; if Assigned(Operation) then begin Operation.VolumeSize:= iVolumeSize; Operation.VolumeNumber:= iVolumeNumber; OperationsManager.AddOperation(Operation); end; finally FreeThenNil(aFile); end; end; finally Free; end; end; end; procedure TfrmSplitter.SetNumberOfPart; begin if not (cmbxSize.Text='') then begin if mbFileSize(edFileSource.Text) mod StrConvert(cmbxSize.Text)>0 then teNumberParts.Text:= IntToStr(mbFileSize(edFileSource.Text)div StrConvert(cmbxSize.Text)+1) else teNumberParts.Text:= IntToStr(mbFileSize(edFileSource.Text)div StrConvert(cmbxSize.Text)); end; end; procedure TfrmSplitter.SetSizeOfPart; begin if not (teNumberParts.Text='') then begin if mbFileSize(edFileSource.Text) mod StrToInt64Def(teNumberParts.Text,0)>0 then cmbxSize.Text := IntToStr(mbFileSize(edFileSource.Text) div StrToInt64Def(teNumberParts.Text,0)+1)+'B' else cmbxSize.Text := IntToStr(mbFileSize(edFileSource.Text) div StrToInt64Def(teNumberParts.Text,0))+'B'; end; end; procedure TfrmSplitter.teNumberPartsKeyPress(Sender: TObject; var Key: char); begin if not (Key in ['0'.. '9', #8, #46]) then begin Key := #0; Exit; end; end; procedure TfrmSplitter.teNumberPartsKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin SetSizeOfPart; end; procedure TfrmSplitter.btnFTChoiceClick(Sender: TObject); var sDir: string; begin if SelectDirectory(rsSplitSelDir, edDirTarget.Text, sDir) then // Select directory: // must change on linux!!! begin edDirTarget.Text:= sDir; end; end; function TfrmSplitter.StrConvert(str:string):int64; var iRet:int64; iPos,iMult:integer; sStr:string; begin str:=UpperCase(str); iPos:=Pos('B',str); if iPos>1 then begin rbtnKiloB.Enabled:=false; rbtnMegaB.Enabled:=false; rbtnGigaB.Enabled:=false; rbtnKiloB.Checked:=false; rbtnMegaB.Checked:=false; rbtnGigaB.Checked:=false; dec(iPos); case str[iPos] of 'K':iMult:=1024; //Kilo 'M':iMult:=1024*1024; //Mega 'G':iMult:=1024*1024*1024;//Giga else iMult:=1; inc(iPos); end; dec(iPos); sStr:=Copy(str,1,iPos); iRet:=StrToInt64Def(sStr,0)*iMult; end else begin rbtnKiloB.Enabled:=true; rbtnMegaB.Enabled:=true; rbtnGigaB.Enabled:=true; iMult:=1; if rbtnKiloB.Checked then iMult:=1024; //Kilo if rbtnMegaB.Checked then iMult:=1024*1024; //Mega if rbtnGigaB.Checked then iMult:=1024*1024*1024;//Giga iRet:=StrToInt64Def(Str,0)*iMult; end; Result:=iRet; end; procedure TfrmSplitter.cmbxSizeCloseUp(Sender: TObject); begin SetNumberOfPart; end; procedure TfrmSplitter.cmbxSizeKeyPress(Sender: TObject; var Key: char); begin if not (Key in ['0'.. '9', #8, #46,'G','g','M','m','K','k','B','b']) then begin Key := #0; Exit; end; end; procedure TfrmSplitter.cmbxSizeKeyUp(Sender: TObject; var Key: char; Shift: TShiftState); begin if Key in ['0'.. '9','B','b'] then begin SetNumberOfPart; Exit; end; if Key in [#8, #46] then begin if (Pos ('M',UpperCase(cmbxSize.Text))>0) or (Pos ('K',UpperCase(cmbxSize.Text))>0) or (Pos ('G',UpperCase(cmbxSize.Text))>0) then Exit else SetNumberOfPart; end; end; procedure TfrmSplitter.FormCreate(Sender: TObject); begin rbtnKiloB.Enabled:= False; rbtnMegaB.Enabled:= False; rbtnGigaB.Enabled:= False; end; procedure TfrmSplitter.rbtnKiloBChange(Sender: TObject); begin SetNumberOfPart; end; end. doublecmd-0.5.8/src/usearchtemplate.pas0000644000175000017500000004015412161350542017173 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Load/Save search templates Copyright (C) 2009-2013 Alexander Koblov (alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uSearchTemplate; {$mode objfpc}{$H+} interface uses Classes, SysUtils, DCClassesUtf8, uFile, DCXmlConfig, uFindFiles; type { TSearchTemplate } TSearchTemplate = class private FTemplateName: UTF8String; FSearchRecord: TSearchTemplateRec; FFileChecks: TFindFileChecks; procedure MakeFileChecks; procedure SetSearchRecord(const AValue: TSearchTemplateRec); public constructor Create; function CheckFile(const AFile: TFile): Boolean; property SearchRecord: TSearchTemplateRec read FSearchRecord write SetSearchRecord; property TemplateName: UTF8String read FTemplateName write FTemplateName; end; { TSearchTemplateList } TSearchTemplateList = class(TList) private function GetTemplate(Index: Integer): TSearchTemplate; function GetTemplate(const AName: UTF8String): TSearchTemplate; public procedure Clear; override; function Add(SearchTemplate: TSearchTemplate): Integer; procedure DeleteTemplate(Index: Integer); procedure LoadToStringList(StringList: TStrings); procedure LoadFromIni(IniFile: TIniFileEx); procedure LoadFromXml(AConfig: TXmlConfig; ANode: TXmlNode); procedure SaveToIni(IniFile: TIniFileEx); procedure SaveToXml(AConfig: TXmlConfig; ANode: TXmlNode); property TemplateByName[const AName: UTF8String]: TSearchTemplate read GetTemplate; property Templates[Index: Integer]: TSearchTemplate read GetTemplate; end; const cTemplateSign = '>'; function IsMaskSearchTemplate(const sMask: UTF8String): Boolean; inline; implementation uses DCFileAttributes, DCBasicTypes; function IsMaskSearchTemplate(const sMask: UTF8String): Boolean; inline; begin Result:= (Length(sMask) > 0) and (sMask[1] = cTemplateSign); end; { TSearchTemplate } constructor TSearchTemplate.Create; begin inherited Create; FillByte(FSearchRecord, SizeOf(FSearchRecord), 0); end; procedure TSearchTemplate.MakeFileChecks; begin SearchTemplateToFindFileChecks(FSearchRecord, FFileChecks); end; procedure TSearchTemplate.SetSearchRecord(const AValue: TSearchTemplateRec); begin FSearchRecord := AValue; MakeFileChecks; end; function TSearchTemplate.CheckFile(const AFile: TFile): Boolean; begin // If template has IsNotOlderThan option then DateTime checks must be recalculated // everytime because they depend on current time. if FSearchRecord.IsNotOlderThan then DateTimeOptionsToChecks(FSearchRecord, FFileChecks); Result := uFindFiles.CheckFile(FSearchRecord, FFileChecks, AFile); end; { TSearchTemplateList } function TSearchTemplateList.GetTemplate(Index: Integer): TSearchTemplate; begin Result:= TSearchTemplate(Items[Index]); end; function TSearchTemplateList.GetTemplate(const AName: UTF8String): TSearchTemplate; var I: Integer; sName: UTF8String; begin Result:= nil; if IsMaskSearchTemplate(AName) then sName:= PChar(AName) + 1 // skip template sign else sName:= AName; for I:= 0 to Count - 1 do if SameText(TSearchTemplate(Items[I]).TemplateName, sName) then begin Result:= TSearchTemplate(Items[I]); Exit; end; end; procedure TSearchTemplateList.Clear; var i: Integer; begin for i := 0 to Count - 1 do Templates[i].Free; inherited Clear; end; function TSearchTemplateList.Add(SearchTemplate: TSearchTemplate): Integer; begin Result:= inherited Add(SearchTemplate); end; procedure TSearchTemplateList.DeleteTemplate(Index: Integer); begin Templates[Index].Free; Delete(Index); end; procedure TSearchTemplateList.LoadToStringList(StringList: TStrings); var I: Integer; begin StringList.Clear; for I:= 0 to Count - 1 do StringList.Add(Templates[I].TemplateName); end; const cSection = 'SearchTemplates'; procedure TSearchTemplateList.LoadFromIni(IniFile: TIniFileEx); var I, iCount: Integer; sTemplate: String; SearchTemplate: TSearchTemplate; FloatNotOlderThan: Double; iAttr: LongInt; begin Clear; iCount:= IniFile.ReadInteger(cSection, 'TemplateCount', 0); for I:= 0 to iCount - 1 do begin SearchTemplate:= TSearchTemplate.Create; with SearchTemplate.FSearchRecord do begin sTemplate:= 'Template' + IntToStr(I+1); SearchTemplate.TemplateName:= IniFile.ReadString(cSection, sTemplate+'Name', ''); StartPath:= IniFile.ReadString(cSection, sTemplate+'StartPath', ''); FilesMasks:= IniFile.ReadString(cSection, sTemplate+'FileMask', '*'); iAttr:= IniFile.ReadInteger(cSection, sTemplate+'Attributes', faAnyFile); if iAttr <> faAnyFile then AttributesPattern := FileAttrToStr(TFileAttrs(iAttr)); //AttributesPattern:= IniFile.ReadString(cSection, sTemplate+'AttribStr', ''); // date/time CaseSensitive:= IniFile.ReadBool(cSection, sTemplate+'CaseSens', False); IsDateFrom:= IniFile.ReadBool(cSection, sTemplate+'IsDateFrom', False); IsDateTo:= IniFile.ReadBool(cSection, sTemplate+'IsDateTo', False); IsTimeFrom:= IniFile.ReadBool(cSection, sTemplate+'IsTimeFrom', False); IsTimeTo:= IniFile.ReadBool(cSection, sTemplate+'IsTimeTo', False); if IsDateFrom or IsTimeFrom then DateTimeFrom:= IniFile.ReadDateTime(cSection, sTemplate+'DateTimeFrom', 0); if IsDateTo or IsTimeTo then DateTimeTo:= IniFile.ReadDateTime(cSection, sTemplate+'DateTimeTo', Now); // not older than IsNotOlderThan:= IniFile.ReadBool(cSection, sTemplate+'IsNotOlderThan', False); if IsNotOlderThan then begin FloatNotOlderThan:= IniFile.ReadFloat(cSection, sTemplate+'NotOlderThan', 0); NotOlderThan:= Trunc(FloatNotOlderThan); NotOlderThanUnit:= TTimeUnit(Round(Frac(FloatNotOlderThan)*10) + 1); end; // file size IsFileSizeFrom:= IniFile.ReadBool(cSection, sTemplate+'IsFileSizeFrom', False); IsFileSizeTo:= IniFile.ReadBool(cSection, sTemplate+'IsFileSizeTo', False); if IsFileSizeFrom then FileSizeFrom:= IniFile.ReadInteger(cSection, sTemplate+'FileSizeFrom', 0); if IsFileSizeTo then FileSizeTo:= IniFile.ReadInteger(cSection, sTemplate+'FileSizeTo', MaxInt); // find text NotContainingText:= IniFile.ReadBool(cSection, sTemplate+'IsNoThisText', False); IsFindText:= IniFile.ReadBool(cSection, sTemplate+'FindInFiles', False); if IsFindText then FindText:= IniFile.ReadString(cSection, sTemplate+'FindData', ''); // replace text IsReplaceText:= IniFile.ReadBool(cSection, sTemplate+'ReplaceInFiles', False); if IsReplaceText then ReplaceText:= IniFile.ReadString(cSection, sTemplate+'ReplaceData', ''); end; SearchTemplate.MakeFileChecks; Add(SearchTemplate); end; end; procedure TSearchTemplateList.LoadFromXml(AConfig: TXmlConfig; ANode: TXmlNode); var SearchTemplate: TSearchTemplate; FloatNotOlderThan: Double; begin Clear; ANode := ANode.FindNode(cSection); if Assigned(ANode) then begin ANode := ANode.FirstChild; while Assigned(ANode) do begin if ANode.CompareName('Template') = 0 then begin SearchTemplate:= TSearchTemplate.Create; with SearchTemplate.FSearchRecord do begin SearchTemplate.TemplateName:= AConfig.GetValue(ANode, 'Name', ''); StartPath:= AConfig.GetValue(ANode, 'StartPath', ''); ExcludeDirectories:= AConfig.GetValue(ANode, 'ExcludeDirectories', ''); FilesMasks:= AConfig.GetValue(ANode, 'FilesMasks', '*'); ExcludeFiles:= AConfig.GetValue(ANode, 'ExcludeFiles', ''); SearchDepth:= AConfig.GetValue(ANode, 'SearchDepth', -1); IsPartialNameSearch:= AConfig.GetValue(ANode, 'IsPartialNameSearch', False); RegExp:= AConfig.GetValue(ANode, 'RegExp', False); FollowSymLinks:= AConfig.GetValue(ANode, 'FollowSymLinks', False); AttributesPattern:= AConfig.GetValue(ANode, 'AttributesPattern', ''); // date/time IsDateFrom:= AConfig.GetValue(ANode, 'IsDateFrom', False); IsDateTo:= AConfig.GetValue(ANode, 'IsDateTo', False); IsTimeFrom:= AConfig.GetValue(ANode, 'IsTimeFrom', False); IsTimeTo:= AConfig.GetValue(ANode, 'IsTimeTo', False); if IsDateFrom or IsTimeFrom then DateTimeFrom:= AConfig.GetValue(ANode, 'DateTimeFrom', TDateTime(0)); if IsDateTo or IsTimeTo then DateTimeTo:= AConfig.GetValue(ANode, 'DateTimeTo', Now); // not older than IsNotOlderThan:= AConfig.GetValue(ANode, 'IsNotOlderThan', False); if IsNotOlderThan then begin // Workaround because old value was floating point. FloatNotOlderThan:= AConfig.GetValue(ANode, 'NotOlderThan', Double(0)); NotOlderThan:= Trunc(FloatNotOlderThan); NotOlderThanUnit:= TTimeUnit(AConfig.GetValue(ANode, 'NotOlderThanUnit', 0)); end; // file size IsFileSizeFrom:= AConfig.GetValue(ANode, 'IsFileSizeFrom', False); IsFileSizeTo:= AConfig.GetValue(ANode, 'IsFileSizeTo', False); if IsFileSizeFrom then FileSizeFrom:= AConfig.GetValue(ANode, 'FileSizeFrom', Int64(0)); if IsFileSizeTo then FileSizeTo:= AConfig.GetValue(ANode, 'FileSizeTo', High(Int64)); FileSizeUnit:= TFileSizeUnit(AConfig.GetValue(ANode, 'FileSizeUnit', 0)); // find text IsFindText:= AConfig.GetValue(ANode, 'IsFindText', False); if IsFindText then FindText:= AConfig.GetValue(ANode, 'FindText', ''); // replace text IsReplaceText:= AConfig.GetValue(ANode, 'IsReplaceText', False); if IsReplaceText then ReplaceText:= AConfig.GetValue(ANode, 'ReplaceText', ''); CaseSensitive:= AConfig.GetValue(ANode, 'CaseSensitive', False); NotContainingText:= AConfig.GetValue(ANode, 'NotContainingText', False); TextEncoding:= AConfig.GetValue(ANode, 'TextEncoding', ''); SearchPlugin:= AConfig.GetValue(ANode, 'SearchPlugin', ''); end; SearchTemplate.MakeFileChecks; Add(SearchTemplate); end; ANode := ANode.NextSibling; end; end; end; procedure TSearchTemplateList.SaveToIni(IniFile: TIniFileEx); var I: Integer; sTemplate: String; FloatNotOlderThan: Double; begin IniFile.EraseSection(cSection); IniFile.WriteInteger(cSection, 'TemplateCount', Count); for I:= 0 to Count - 1 do with Templates[I].SearchRecord do begin sTemplate:= 'Template' + IntToStr(I+1); IniFile.WriteString(cSection, sTemplate+'Name', Templates[I].TemplateName); IniFile.WriteString(cSection, sTemplate+'StartPath', StartPath); IniFile.WriteString(cSection, sTemplate+'FileMask', FilesMasks); //IniFile.WriteInteger(cSection, sTemplate+'Attributes', Attributes); //IniFile.WriteString(cSection, sTemplate+'AttribStr', AttributesPattern); // date/time IniFile.WriteBool(cSection, sTemplate+'CaseSens', CaseSensitive); IniFile.WriteBool(cSection, sTemplate+'IsDateFrom', IsDateFrom); IniFile.WriteBool(cSection, sTemplate+'IsDateTo', IsDateTo); IniFile.WriteBool(cSection, sTemplate+'IsTimeFrom', IsTimeFrom); IniFile.WriteBool(cSection, sTemplate+'IsTimeTo', IsTimeTo); if IsDateFrom or IsTimeFrom then IniFile.WriteDateTime(cSection, sTemplate+'DateTimeFrom', DateTimeFrom); if IsDateTo or IsTimeTo then IniFile.WriteDateTime(cSection, sTemplate+'DateTimeTo', DateTimeTo); // not older than IniFile.WriteBool(cSection, sTemplate+'IsNotOlderThan', IsNotOlderThan); if IsNotOlderThan then begin FloatNotOlderThan := Double(NotOlderThan) + Double(Integer(NotOlderThanUnit) - 1) / 10; IniFile.WriteFloat(cSection, sTemplate+'NotOlderThan', FloatNotOlderThan); end; // file size IniFile.WriteBool(cSection, sTemplate+'IsFileSizeFrom', IsFileSizeFrom); IniFile.WriteBool(cSection, sTemplate+'IsFileSizeTo', IsFileSizeTo); if IsFileSizeFrom then IniFile.WriteInteger(cSection, sTemplate+'FileSizeFrom', FileSizeFrom); if IsFileSizeTo then IniFile.WriteInteger(cSection, sTemplate+'FileSizeTo', FileSizeTo); // find text IniFile.WriteBool(cSection, sTemplate+'IsNoThisText', NotContainingText); IniFile.WriteBool(cSection, sTemplate+'FindInFiles', IsFindText); if IsFindText then IniFile.WriteString(cSection, sTemplate+'FindData', FindText); // replace text IniFile.WriteBool(cSection, sTemplate+'ReplaceInFiles', IsReplaceText); if IsReplaceText then IniFile.WriteString(cSection, sTemplate+'ReplaceData', ReplaceText); end; end; procedure TSearchTemplateList.SaveToXml(AConfig: TXmlConfig; ANode: TXmlNode); var I: Integer; SubNode: TXmlNode; begin ANode := AConfig.FindNode(ANode, cSection, True); AConfig.ClearNode(ANode); for I:= 0 to Count - 1 do with Templates[I].SearchRecord do begin SubNode := AConfig.AddNode(ANode, 'Template'); AConfig.AddValue(SubNode, 'Name', Templates[I].TemplateName); AConfig.AddValue(SubNode, 'StartPath', StartPath); AConfig.AddValue(SubNode, 'ExcludeDirectories', ExcludeDirectories); AConfig.AddValue(SubNode, 'FilesMasks', FilesMasks); AConfig.AddValue(SubNode, 'ExcludeFiles', ExcludeFiles); AConfig.AddValue(SubNode, 'SearchDepth', SearchDepth); AConfig.AddValue(SubNode, 'IsPartialNameSearch', IsPartialNameSearch); AConfig.AddValue(SubNode, 'RegExp', RegExp); AConfig.AddValue(SubNode, 'FollowSymLinks', FollowSymLinks); AConfig.AddValue(SubNode, 'AttributesPattern', AttributesPattern); // date/time AConfig.AddValue(SubNode, 'IsDateFrom', IsDateFrom); AConfig.AddValue(SubNode, 'IsDateTo', IsDateTo); AConfig.AddValue(SubNode, 'IsTimeFrom', IsTimeFrom); AConfig.AddValue(SubNode, 'IsTimeTo', IsTimeTo); if IsDateFrom or IsTimeFrom then AConfig.AddValue(SubNode, 'DateTimeFrom', DateTimeFrom); if IsDateTo or IsTimeTo then AConfig.AddValue(SubNode, 'DateTimeTo', DateTimeTo); // not older than AConfig.AddValue(SubNode, 'IsNotOlderThan', IsNotOlderThan); if IsNotOlderThan then begin AConfig.AddValue(SubNode, 'NotOlderThan', NotOlderThan); AConfig.AddValue(SubNode, 'NotOlderThanUnit', Integer(NotOlderThanUnit)); end; // file size AConfig.AddValue(SubNode, 'IsFileSizeFrom', IsFileSizeFrom); AConfig.AddValue(SubNode, 'IsFileSizeTo', IsFileSizeTo); if IsFileSizeFrom then AConfig.AddValue(SubNode, 'FileSizeFrom', FileSizeFrom); if IsFileSizeTo then AConfig.AddValue(SubNode, 'FileSizeTo', FileSizeTo); AConfig.AddValue(SubNode, 'FileSizeUnit', Integer(FileSizeUnit)); // find text AConfig.AddValue(SubNode, 'IsFindText', IsFindText); if IsFindText then AConfig.AddValue(SubNode, 'FindText', FindText); // replace text AConfig.AddValue(SubNode, 'IsReplaceText', IsReplaceText); if IsReplaceText then AConfig.AddValue(SubNode, 'ReplaceText', ReplaceText); AConfig.AddValue(SubNode, 'CaseSensitive', CaseSensitive); AConfig.AddValue(SubNode, 'NotContainingText', NotContainingText); AConfig.AddValue(SubNode, 'TextEncoding', TextEncoding); AConfig.AddValue(SubNode, 'SearchPlugin', SearchPlugin); end; end; end. doublecmd-0.5.8/src/umultiarc.pas0000644000175000017500000003624212127611661016021 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- Implementation of multi archiver support Copyright (C) 2010-2013 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit uMultiArc; {$mode objfpc}{$H+} interface uses Classes, SysUtils, DCBasicTypes; const MaxSignSize = 1024; SignSeekRange = 1024 * 1024; type TSignature = record Value: array[0..Pred(MaxSignSize)] of Byte; Size: LongInt; end; PSignature = ^TSignature; { TSignatureList } TSignatureList = class(TFPList) private function GetSignature(Index: Integer): PSignature; public destructor Destroy; override; procedure Clean; property Items[Index: Integer]: PSignature read GetSignature; default; end; TSignaturePosition = record Value: LongInt; Sign: Boolean; end; PSignaturePosition = ^TSignaturePosition; { TSignaturePositionList } TSignaturePositionList = class(TFPList) private function GetSignaturePosition(Index: Integer): PSignaturePosition; public destructor Destroy; override; procedure Clean; property Items[Index: Integer]: PSignaturePosition read GetSignaturePosition; default; end; { TArchiveItem } TArchiveItem = class FileName, FileExt, FileLink: UTF8String; PackSize, UnpSize: Int64; Year, Month, Day, Hour, Minute, Second: Word; Attributes: TFileAttrs; end; { TMultiArcItem } TMultiArcItem = class private FSeekAfterSignPos: Boolean; FSignature, FSignaturePosition: AnsiString; FSignatureSeekRange: LongInt; FSignatureList: TSignatureList; FSignaturePositionList: TSignaturePositionList; function GetSignatureSeekRange: AnsiString; procedure SetSignature(const AValue: AnsiString); procedure SetSignaturePosition(const AValue: AnsiString); procedure SetSignatureSeekRange(const AValue: AnsiString); public FArchiver, FDescription, FExtension, FStart, FEnd: UTF8String; FFormat: TStringList; FList, FExtract, FExtractWithoutPath, FTest, FDelete, FAdd, FAddSelfExtract, FPasswordQuery: UTF8String; FFormMode: Integer; public FEnabled: Boolean; FOutput: Boolean; FDebug: Boolean; constructor Create; destructor Destroy; override; function CanYouHandleThisFile(const FileName: UTF8String): Boolean; property FID: AnsiString read FSignature write SetSignature; property FIDPos: AnsiString read FSignaturePosition write SetSignaturePosition; property FIDSeekRange: AnsiString read GetSignatureSeekRange write SetSignatureSeekRange; end; { TMultiArcList } TMultiArcList = class FList: TStringList; private function GetCount: LongInt; function GetItem(Index: Integer): TMultiArcItem; function GetName(Index: Integer): UTF8String; procedure SetName(Index: Integer; const AValue: UTF8String); public constructor Create; virtual; destructor Destroy; override; procedure AutoConfigure; procedure Clear; procedure LoadFromFile(const FileName: UTF8String); procedure SaveToFile(const FileName: UTF8String); function Add(const S: UTF8String; aMultiArcItem: TMultiArcItem): Integer; procedure Delete(Index: Integer); property Names[Index: Integer]: UTF8String read GetName write SetName; property Items[Index: Integer]: TMultiArcItem read GetItem; default; property Count: LongInt read GetCount; end; implementation uses LCLProc, StrUtils, Math, FileUtil, DCClassesUtf8, uDCUtils, DCOSUtils; { TMultiArcList } function TMultiArcList.GetCount: LongInt; begin Result:= FList.Count; end; function TMultiArcList.GetItem(Index: Integer): TMultiArcItem; begin Result:= TMultiArcItem(FList.Objects[Index]); end; function TMultiArcList.GetName(Index: Integer): UTF8String; begin Result:= FList.Strings[Index]; end; procedure TMultiArcList.SetName(Index: Integer; const AValue: UTF8String); begin FList.Strings[Index]:= AValue; end; constructor TMultiArcList.Create; begin FList:= TStringList.Create; end; destructor TMultiArcList.Destroy; begin Clear; FreeThenNil(FList); inherited Destroy; end; procedure TMultiArcList.AutoConfigure; var I: Integer; ExePath: UTF8String; begin for I:= 0 to Count - 1 do begin ExePath:= Items[I].FArchiver; if not mbFileExists(ReplaceEnvVars(ExePath)) then ExePath:= FindDefaultExecutablePath(ExePath); if ExePath = EmptyStr then Items[I].FEnabled:= False else begin Items[I].FArchiver:= ExePath; Items[I].FEnabled:= True; end; end; end; procedure TMultiArcList.Clear; var I: Integer; begin for I:= FList.Count - 1 downto 0 do if Assigned(FList.Objects[I]) then begin FList.Objects[I].Free; FList.Objects[I]:= nil; FList.Delete(I); end; end; procedure TMultiArcList.LoadFromFile(const FileName: UTF8String); var I, J: Integer; IniFile: TIniFileEx = nil; Sections: TStringList = nil; Section, Format: UTF8String; FirstTime: Boolean = True; MultiArcItem: TMultiArcItem; begin IniFile:= TIniFileEx.Create(FileName, fmOpenRead); try Sections:= TStringList.Create; IniFile.ReadSections(Sections); for I:= 0 to Sections.Count - 1 do begin Section:= Sections[I]; if SameText(Section, 'MultiArc') then begin FirstTime:= IniFile.ReadBool(Section, 'FirstTime', True); Continue; end; MultiArcItem:= TMultiArcItem.Create; with MultiArcItem do begin FArchiver:= FixExeExt(TrimQuotes(IniFile.ReadString(Section, 'Archiver', EmptyStr))); FDescription:= TrimQuotes(IniFile.ReadString(Section, 'Description', EmptyStr)); FID:= TrimQuotes(IniFile.ReadString(Section, 'ID', EmptyStr)); FIDPos:= TrimQuotes(IniFile.ReadString(Section, 'IDPos', EmptyStr)); FIDSeekRange:= IniFile.ReadString(Section, 'IDSeekRange', EmptyStr); FExtension:= TrimQuotes(IniFile.ReadString(Section, 'Extension', EmptyStr)); FStart:= TrimQuotes(IniFile.ReadString(Section, 'Start', EmptyStr)); FEnd:= TrimQuotes(IniFile.ReadString(Section, 'End', EmptyStr)); for J:= 0 to 50 do begin Format:= TrimQuotes(IniFile.ReadString(Section, 'Format' + IntToStr(J), EmptyStr)); if Format <> EmptyStr then FFormat.Add(Format) else Break; end; FList:= TrimQuotes(IniFile.ReadString(Section, 'List', EmptyStr)); FExtract:= TrimQuotes(IniFile.ReadString(Section, 'Extract', EmptyStr)); FExtractWithoutPath:= TrimQuotes(IniFile.ReadString(Section, 'ExtractWithoutPath', EmptyStr)); FTest:= TrimQuotes(IniFile.ReadString(Section, 'Test', EmptyStr)); FDelete:= TrimQuotes(IniFile.ReadString(Section, 'Delete', EmptyStr)); FAdd:= TrimQuotes(IniFile.ReadString(Section, 'Add', EmptyStr)); FAddSelfExtract:= TrimQuotes(IniFile.ReadString(Section, 'AddSelfExtract', EmptyStr)); FPasswordQuery:= IniFile.ReadString(Section, 'PasswordQuery', EmptyStr); // optional FFormMode:= IniFile.ReadInteger(Section, 'FormMode', 0); FEnabled:= IniFile.ReadBool(Section, 'Enabled', True); FOutput:= IniFile.ReadBool(Section, 'Output', False); FDebug:= IniFile.ReadBool(Section, 'Debug', False); end; FList.AddObject(Section, MultiArcItem); end; if FirstTime then AutoConfigure; finally FreeThenNil(IniFile); FreeThenNil(Sections); end; end; procedure TMultiArcList.SaveToFile(const FileName: UTF8String); var I, J: Integer; IniFile: TIniFileEx; Section: UTF8String; MultiArcItem: TMultiArcItem; begin IniFile:= TIniFileEx.Create(FileName, fmOpenWrite); try IniFile.Clear; for I:= 0 to FList.Count - 1 do begin Section:= FList.Strings[I]; MultiArcItem:= TMultiArcItem(FList.Objects[I]); with MultiArcItem do begin IniFile.WriteString(Section, 'Archiver', FArchiver); IniFile.WriteString(Section, 'Description', FDescription); IniFile.WriteString(Section, 'ID', FID); IniFile.WriteString(Section, 'IDPos', FIDPos); IniFile.WriteString(Section, 'IDSeekRange', FIDSeekRange); IniFile.WriteString(Section, 'Extension', FExtension); IniFile.WriteString(Section, 'Start', FStart); IniFile.WriteString(Section, 'End', FEnd); for J:= 0 to FFormat.Count - 1 do begin IniFile.WriteString(Section, 'Format' + IntToStr(J), FFormat[J]); end; IniFile.WriteString(Section, 'List', FList); IniFile.WriteString(Section, 'Extract', FExtract); IniFile.WriteString(Section, 'ExtractWithoutPath', FExtractWithoutPath); IniFile.WriteString(Section, 'Test', FTest); IniFile.WriteString(Section, 'Delete', FDelete); IniFile.WriteString(Section, 'Add', FAdd); IniFile.WriteString(Section, 'AddSelfExtract', FAddSelfExtract); IniFile.WriteString(Section, 'PasswordQuery', FPasswordQuery); // optional IniFile.WriteInteger(Section, 'FormMode', FFormMode); IniFile.WriteBool(Section, 'Enabled', FEnabled); IniFile.WriteBool(Section, 'Output', FOutput); IniFile.WriteBool(Section, 'Debug', FDebug); end; end; IniFile.WriteBool('MultiArc', 'FirstTime', False); finally IniFile.Free; end; end; function TMultiArcList.Add(const S: UTF8String; aMultiArcItem: TMultiArcItem): Integer; begin Result := FList.AddObject(S, aMultiArcItem); end; procedure TMultiArcList.Delete(Index: Integer); begin Items[Index].Free; FList.Delete(Index); end; { TMultiArcItem } function TMultiArcItem.GetSignatureSeekRange: AnsiString; begin if FSignatureSeekRange = SignSeekRange then Result:= EmptyStr else Result:= IntToStr(FSignatureSeekRange); end; procedure TMultiArcItem.SetSignature(const AValue: AnsiString); var I: Integer; Sign: AnsiString; Value: AnsiString; Signature: PSignature; begin FSignature:= AValue; FSignatureList.Clean; if AValue = EmptyStr then Exit; Value:= AValue; repeat I:= 0; New(Signature); Sign:= Trim(Copy2SymbDel(Value, ',')); try while (Sign <> EmptyStr) and (I < MaxSignSize) do begin Signature^.Value[I]:= StrToInt('$' + Copy2SymbDel(Sign, #32)); Inc(I); end; Signature^.Size:= I; FSignatureList.Add(Signature); except Dispose(Signature); end; until Value = EmptyStr; end; procedure TMultiArcItem.SetSignaturePosition(const AValue: AnsiString); var SignPos, Value: AnsiString; SignaturePosition: PSignaturePosition; begin FSignaturePosition:= AValue; FSignaturePositionList.Clean; if AValue = EmptyStr then Exit; Value:= StringReplace(AValue, '0x', '$', [rfReplaceAll]); repeat SignPos:= Trim(Copy2SymbDel(Value, ',')); if SignPos = '' then FSeekAfterSignPos:= True else try New(SignaturePosition); SignaturePosition^.Value:= StrToInt(SignPos); SignaturePosition^.Sign:= not (SignaturePosition^.Value < 0); SignaturePosition^.Value:= abs(SignaturePosition^.Value); FSignaturePositionList.Add(SignaturePosition); except Dispose(SignaturePosition); end; until Value = EmptyStr; end; procedure TMultiArcItem.SetSignatureSeekRange(const AValue: AnsiString); begin if not TryStrToInt(AValue, FSignatureSeekRange) then FSignatureSeekRange:= SignSeekRange; end; constructor TMultiArcItem.Create; begin FSignatureList:= TSignatureList.Create; FSignaturePositionList:= TSignaturePositionList.Create; FFormat:= TStringList.Create; end; destructor TMultiArcItem.Destroy; begin FreeThenNil(FSignatureList); FreeThenNil(FSignaturePositionList); FreeThenNil(FFormat); inherited Destroy; end; function TMultiArcItem.CanYouHandleThisFile(const FileName: UTF8String): Boolean; var FileMapRec : TFileMapRec; hFile: THandle; I, J: LongInt; lpBuffer: PByte = nil; Origin: LongInt; dwMaxSignSize: LongWord = 0; dwReaded: LongWord; dwOffset: LongWord = 0; begin Result:= False; hFile:= mbFileOpen(FileName, fmOpenRead or fmShareDenyNone); if hFile <> feInvalidHandle then begin // Determine maximum signature size for J:= 0 to FSignatureList.Count - 1 do dwMaxSignSize := Max(FSignatureList[J]^.Size, dwMaxSignSize); { if (FSkipSfxPart) then dwOffset := FSfxOffset } lpBuffer:= GetMem(dwMaxSignSize); if Assigned(lpBuffer) then try // Try to determine by IDPOS for I:= 0 to FSignaturePositionList.Count - 1 do begin case FSignaturePositionList[I]^.Sign of True: Origin:= fsFromBeginning; False: Origin:= fsFromEnd; end; if (FileSeek(hFile, dwOffset + FSignaturePositionList[I]^.Value, Origin) <> -1) then begin dwReaded:= FileRead(hFile, lpBuffer^, dwMaxSignSize); if (dwReaded = dwMaxSignSize) then begin for J := 0 to FSignatureList.Count - 1 do begin if(CompareByte(lpBuffer^, FSignatureList[J]^.Value, FSignatureList[J]^.Size) = 0) then Exit(True); end; end; end; end; finally FreeMem(lpBuffer); FileClose(hFile); end; // if Assigned(lpBuffer) end; // Try raw seek id if (Result = False) and FSeekAfterSignPos then begin FillByte(FileMapRec, SizeOf(FileMapRec), 0); if MapFile(FileName, FileMapRec) then try dwOffset:= Min(FSignatureSeekRange, FileMapRec.FileSize); for I:= 0 to dwOffset do begin for J:= 0 to FSignatureList.Count - 1 do begin if(CompareByte((FileMapRec.MappedFile + I)^, FSignatureList[J]^.Value, FSignatureList[J]^.Size) = 0) then Exit(True); end; end; finally UnMapFile(FileMapRec); end; end; end; { TSignatureList } function TSignatureList.GetSignature(Index: Integer): PSignature; begin Result:= PSignature(Get(Index)); end; destructor TSignatureList.Destroy; begin Clean; inherited Destroy; end; procedure TSignatureList.Clean; var I: Integer; begin for I:= Count - 1 downto 0 do begin Dispose(Items[I]); Delete(I); end; end; { TSignaturePositionList } function TSignaturePositionList.GetSignaturePosition(Index: Integer): PSignaturePosition; begin Result:= PSignaturePosition(Get(Index)); end; destructor TSignaturePositionList.Destroy; begin Clean; inherited Destroy; end; procedure TSignaturePositionList.Clean; var I: Integer; begin for I:= Count - 1 downto 0 do begin Dispose(Items[I]); Delete(I); end; end; end. doublecmd-0.5.8/src/un_process.pas0000644000175000017500000000724411740433676016204 0ustar alexxalexxunit un_process; {$mode delphi}{$H+} interface uses Process, SysUtils, Math; type TOnReadLn = procedure (str: String) of object; TOnOperationProgress = procedure of object; { TExProcess } TExProcess = class protected FProcess: TProcess; FOutputLine: String; FStop: Boolean; FQueryString: String; FOnReadLn, FOnQueryString: TOnReadLn; FOnOperationProgress: TOnOperationProgress; function _GetExitStatus(): Integer; public constructor Create(CommandLine: String = ''); procedure Execute; procedure Stop; procedure SetCmdLine(CommandLine: String); destructor Destroy; override; property Process: TProcess read FProcess; property ExitStatus: Integer read _GetExitStatus; property QueryString: String read FQueryString write FQueryString; property OnReadLn: TOnReadLn read FOnReadLn write FOnReadLn; property OnQueryString: TOnReadLn read FOnQueryString write FOnQueryString; property OnOperationProgress: TOnOperationProgress read FOnOperationProgress write FOnOperationProgress; end; implementation uses LCLProc; const BufferSize = 3000; { TExProcess } function TExProcess._GetExitStatus(): Integer; begin Result:= FProcess.ExitStatus; end; constructor TExProcess.Create(CommandLine: String = ''); begin FOutputLine:= EmptyStr; FProcess:= TProcess.Create(nil); FProcess.CommandLine:= CommandLine; FProcess.Options:= [poUsePipes, poNoConsole]; end; procedure TExProcess.Execute; var I, J: Integer; OutputBuffer: String; begin try FProcess.Execute; repeat if Assigned(FOnOperationProgress) then FOnOperationProgress(); if FStop then Exit; // If no output yet if FProcess.Output.NumBytesAvailable = 0 then begin if not FProcess.Running then Break else begin Sleep(1); Continue; end end; SetLength(OutputBuffer, BufferSize); // Waits for the process output SetLength(OutputBuffer, FProcess.output.Read(OutputBuffer[1], Length(OutputBuffer))); // Cut the incoming stream to lines: FOutputLine:= FOutputLine + OutputBuffer; // Add to the accumulator // Detect the line breaks and cut. repeat if Assigned(FOnOperationProgress) then FOnOperationProgress(); if FStop then Exit; I:= Pos(#13, FOutputLine); J:= Pos(#10, FOutputLine); if I = 0 then I:= J; if J = 0 then J:= I; if (J = 0) then // There are no complete lines yet. begin if Assigned(FOnQueryString) and (Pos(FQueryString, FOutputLine) <> 0) then begin FOnQueryString(FOutputLine); FOutputLine:= EmptyStr; end; Break; end; if Assigned(FOnReadLn) then FOnReadLn(Copy(FOutputLine, 1, Min(I, J) - 1)); // Return the line without the CR/LF characters // Remove the line from accumulator FOutputLine:= Copy(FOutputLine, Max(I, J) + 1, Length(FOutputLine) - Max(I, J)); until False; if Length(OutputBuffer) = 0 then Break; until False; if FStop then Exit; if (Length(FOutputLine) <> 0) and Assigned(FOnReadLn) then FOnReadLn(FOutputLine); OutputBuffer:= EmptyStr; if Assigned(FOnReadLn) then FOnReadLn(OutputBuffer); // Empty line to notify DC about process finish finally end; end; procedure TExProcess.Stop; begin FStop:= True; FProcess.Terminate(-1); end; procedure TExProcess.SetCmdLine(CommandLine: String); begin FProcess.CommandLine:= CommandLine; end; destructor TExProcess.Destroy; begin FreeAndNil(FProcess); end; end. doublecmd-0.5.8/src/fextractdlg.lfm0000644000175000017500000001347012123530225016304 0ustar alexxalexxobject frmExtractDlg: TfrmExtractDlg Left = 540 Height = 225 Top = 144 Width = 528 HelpContext = 160 HorzScrollBar.Page = 446 HorzScrollBar.Range = 437 HorzScrollBar.Visible = False VertScrollBar.Page = 182 VertScrollBar.Range = 177 ActiveControl = edtExtractTo AutoSize = True BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Unpack files' ChildSizing.LeftRightSpacing = 6 ChildSizing.TopBottomSpacing = 5 ClientHeight = 225 ClientWidth = 528 Constraints.MinWidth = 500 OnCreate = FormCreate Position = poScreenCenter SessionProperties = 'cbOverwrite.Checked' LCLVersion = '1.0.4.0' object pnlLabels: TPanel AnchorSideLeft.Control = Owner AnchorSideTop.Control = cbFileMask AnchorSideBottom.Control = edtPassword AnchorSideBottom.Side = asrBottom Left = 6 Height = 157 Top = 5 Width = 211 Anchors = [akTop, akLeft, akBottom] AutoSize = True BevelOuter = bvNone ClientHeight = 157 ClientWidth = 211 Color = clForm ParentColor = False TabOrder = 7 object lblFileMask: TLabel AnchorSideLeft.Control = pnlLabels AnchorSideTop.Control = pnlLabels Left = 0 Height = 16 Top = 3 Width = 211 BorderSpacing.Top = 3 Caption = '&Extract files matching file mask:' FocusControl = cbFileMask ParentColor = False end object lblPassword: TLabel AnchorSideLeft.Control = pnlLabels AnchorSideBottom.Control = pnlLabels AnchorSideBottom.Side = asrBottom Left = 0 Height = 16 Top = 138 Width = 188 Anchors = [akLeft, akBottom] BorderSpacing.Bottom = 3 Caption = '&Password for encrypted files:' FocusControl = edtPassword ParentColor = False end object lblExtractTo: TLabel AnchorSideTop.Control = lblFileMask AnchorSideTop.Side = asrBottom Left = 0 Height = 16 Top = 27 Width = 105 BorderSpacing.Top = 8 Caption = 'To the &directory:' FocusControl = edtExtractTo ParentColor = False end end object cbFileMask: TComboBox AnchorSideLeft.Control = pnlLabels AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 222 Height = 27 Top = 5 Width = 270 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 5 BorderSpacing.Top = 2 BorderSpacing.Right = 36 ItemHeight = 0 ParentFont = False TabOrder = 0 Text = '*.*' end object btnOK: TButton AnchorSideTop.Control = edtPassword AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnCancel Left = 249 Height = 32 Top = 168 Width = 85 Anchors = [akTop, akRight] BorderSpacing.Top = 6 BorderSpacing.Right = 6 BorderSpacing.InnerBorder = 4 Caption = '&OK' Default = True ModalResult = 1 TabOrder = 4 end object btnCancel: TButton AnchorSideTop.Control = btnOK AnchorSideRight.Control = btnHelp Left = 340 Height = 32 Top = 168 Width = 85 Anchors = [akTop, akRight] BorderSpacing.Right = 6 BorderSpacing.InnerBorder = 4 Cancel = True Caption = '&Cancel' ModalResult = 2 TabOrder = 5 end object btnHelp: TButton AnchorSideTop.Control = btnCancel AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 431 Height = 32 Top = 168 Width = 85 Anchors = [akTop, akRight] BorderSpacing.Right = 12 BorderSpacing.InnerBorder = 4 Caption = '&Help' TabOrder = 6 end object edtExtractTo: TDirectoryEdit AnchorSideLeft.Control = cbFileMask AnchorSideTop.Control = cbFileMask AnchorSideTop.Side = asrBottom AnchorSideRight.Control = cbFileMask AnchorSideRight.Side = asrBottom Left = 222 Height = 25 Top = 34 Width = 270 ShowHidden = False ButtonWidth = 23 NumGlyphs = 1 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 2 MaxLength = 0 TabOrder = 1 end object edtPassword: TEdit AnchorSideLeft.Control = cbFileMask AnchorSideTop.Control = pnlCheckBoxes AnchorSideTop.Side = asrBottom AnchorSideRight.Control = edtExtractTo AnchorSideRight.Side = asrBottom Left = 222 Height = 25 Top = 137 Width = 270 Anchors = [akTop, akLeft, akRight] EchoMode = emPassword Enabled = False PasswordChar = '*' TabOrder = 3 end object pnlCheckBoxes: TPanel AnchorSideLeft.Control = Owner AnchorSideTop.Control = edtExtractTo AnchorSideTop.Side = asrBottom AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 Height = 78 Top = 59 Width = 516 Anchors = [akTop, akLeft, akRight] AutoSize = True BevelOuter = bvNone ChildSizing.TopBottomSpacing = 6 ChildSizing.Layout = cclLeftToRightThenTopToBottom ClientHeight = 78 ClientWidth = 516 Color = clForm ParentColor = False TabOrder = 2 object cbInSeparateFolder: TCheckBox AnchorSideTop.Side = asrBottom Left = 0 Height = 22 Top = 6 Width = 439 BorderSpacing.Top = 2 Caption = 'Unpack each archive to a &separate subdir (name of the archive)' TabOrder = 0 end object cbExtractPath: TCheckBox AnchorSideTop.Side = asrBottom Left = 0 Height = 22 Top = 28 Width = 439 Caption = '&Unpack path names if stored with files' Checked = True OnChange = cbExtractPathChange State = cbChecked TabOrder = 1 end object cbOverwrite: TCheckBox AnchorSideTop.Side = asrBottom Left = 0 Height = 22 Top = 50 Width = 439 Caption = 'O&verwrite existing files' Checked = True State = cbChecked TabOrder = 2 end end end doublecmd-0.5.8/src/fAbout.lfm0000644000175000017500000004113512045446211015220 0ustar alexxalexxobject frmAbout: TfrmAbout Left = 26 Height = 400 Top = 125 Width = 667 BorderIcons = [biSystemMenu, biMaximize] Caption = 'About' ClientHeight = 400 ClientWidth = 667 KeyPreview = True OnKeyDown = FormKeyDown OnShow = frmAboutShow Position = poScreenCenter LCLVersion = '1.0.1.3' object pnlText: TPanel AnchorSideLeft.Control = pnlInfo AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 168 Height = 384 Top = 8 Width = 491 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Around = 8 BevelInner = bvRaised BevelOuter = bvLowered ClientHeight = 384 ClientWidth = 491 FullRepaint = False TabOrder = 0 object lblHomePage: TLabel AnchorSideLeft.Control = memInfo AnchorSideTop.Side = asrBottom AnchorSideBottom.Control = pnlText AnchorSideBottom.Side = asrBottom Left = 10 Height = 22 Top = 345 Width = 81 Anchors = [akLeft, akBottom] BorderSpacing.Bottom = 15 Caption = 'Home Page:' ParentColor = False end object lblHomePageAddress: TLabel AnchorSideLeft.Control = lblHomePage AnchorSideLeft.Side = asrBottom AnchorSideTop.Side = asrBottom AnchorSideBottom.Control = pnlText AnchorSideBottom.Side = asrBottom Left = 97 Height = 22 Top = 345 Width = 231 Anchors = [akLeft, akBottom] BorderSpacing.Left = 6 BorderSpacing.Top = 8 BorderSpacing.Bottom = 15 Caption = 'http://doublecmd.sourceforge.net' Font.Color = clBlue ParentColor = False ParentFont = False OnClick = lblHomePageAddressClick OnMouseEnter = lblHomePageAddressMouseEnter OnMouseLeave = lblHomePageAddressMouseLeave end object memInfo: TMemo AnchorSideLeft.Control = pnlText AnchorSideTop.Control = pnlText AnchorSideRight.Control = pnlText AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = lblHomePage Left = 10 Height = 327 Top = 10 Width = 471 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 8 BorderSpacing.Top = 8 BorderSpacing.Right = 8 BorderSpacing.Bottom = 8 ReadOnly = True ScrollBars = ssAutoBoth TabOrder = 0 end end object pnlInfo: TPanel Left = 9 Height = 290 Top = 9 Width = 151 AutoSize = True BorderSpacing.Around = 8 BevelOuter = bvNone ChildSizing.VerticalSpacing = 4 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 290 ClientWidth = 151 TabOrder = 1 object pnlLogo: TPanel Left = 39 Height = 72 Top = 8 Width = 72 BorderSpacing.Top = 8 BorderSpacing.Bottom = 8 BorderSpacing.CellAlignHorizontal = ccaCenter BevelInner = bvRaised BevelOuter = bvLowered BevelWidth = 2 ClientHeight = 72 ClientWidth = 72 TabOrder = 0 object imgLogo: TImage Left = 4 Height = 64 Top = 4 Width = 64 Align = alClient Center = True Picture.Data = { 1754506F727461626C654E6574776F726B47726170686963F511000089504E47 0D0A1A0A0000000D4948445200000040000000400806000000AA6971DE000000 017352474200AECE1CE900000006624B474400FF00FF00FFA0BDA79300000009 7048597300000B1300000B1301009A9C180000000774494D4507DA021112343B F8979BBE000011754944415478DADD9B79905D559DC73FE7DC7BDFD24BBAD39D 3D241D9640020414102C4046CA5229401C71199771CA1A7416D19A9A19A79CC2 3F8471299491C1D1D2A15C81128D5A52AC53208B16191C9180C8960D1224E94E 27E974F7DBEF727EBFF9E3DED7FD3A74BFEEA483C0DCAA5B6F3BEFDCF3FB9EDF FEFB1D6873A92AFF5FAE996831330D36C6B4FED1BCDEE937C64CA16B5600000F 08803C901751CF5AA3AFB75D37C6C44023BBDDA14098E90857D5A231A60758B8 77F0C08A91DD7B97D66A8DE2C3BF7A6231869941505EF6A379F9903F05E166F1 92858D0DA79F38BAEAA48191C58B7B770383C0412032667223CD21C4FBC04260 0038EE1F2EF9E415FD94CE59B36E4D61755F1038455140D31724FB22235C9B00 A8A06A50145533051955455BDF4F3C3F7D159D44B229B72AA046419AD31826A7 555426E748D7A324899A3D2315F7DC737B4ACBCF3CF3A1AFDE74F50F45E4596B ED2010021863A600605575A13166DD2DDFFAD97B5F7AE0BE2B3F70C986DC9A1E 341CDA6DA2F238A2922E42155130B9226A6DBAC08C46D17401A293C4AAA68B97 560054106D8ECFFEAF9344A828922172E85C2E8E496AF50C7445267E4B3F7BC5 4EFC8E4E3A962CA5B864098F6D19E67F9FDEFBD4B5777CEBEAAE62F028306C8C 8955750A0005E0B8DB7E72FFFB776CBCF9EA2B3F7601D1738FA1C68282A84C2E 36DB0991960793EEBAA8A0A228267B4D7728DD451091740745D3B16A5A884BE7 C4804AF3790691942B9C4EEEB6A4AC82A84ECCD91C27D926A1E0C4915BD0A3C9 CAB5E6D6BB9E7CEEBB8F6EFC7BCF9ADF1B63C68D31D8A6CC00C5F1B1CAEA5F7E E3C68F5FF9A1B388B76E56635FF7CA1F632D61A964823DDBF5ED672C5BBFE917 F79F6B8C599429F814804C17148777ED5EF9E7672F5E69CA073198D73BF553AE FAD898E94F4AFCE26BDFFD04D00714547502000572BFBFFBA1F5EBD7AF32EEC0 E084401A32017F1DBA029ACA29886054F1C23AF9FAC163A37AB26C4209DE70C3 0DC50B2EB860477F7F7F978BE3BC7571DEF33D5CE220AC93D42AB8B103C8C161 BCE15D2C2CED070CCED84CD65E233A40158962B4A3133D6680DCC0B1E417F651 5CB49862FFA25439FA3EA28A09821AC6C443434357F9F57ADD747676F6E6F3F9 0ECDE526D0F301E8A5600CD6AEC3F7031255F68D1C441E7F88DE179FC536AA18 15F4D5E40E154C90C35BB21CFFBC3FA377DD29F47477E15B9B01ABD3B9C11D00 BEEF17FC294ECB0C62EF9CC3390740FF822EB8F032709730B6FB45F4819FB2A0 3A8EBE1A0A338E70679DCBB20BDF4EEFD265586B271C0AE7DCA4B7370D5D4D50 FCB93CE76513A8A2C6D0B7E6781A1FFB2C639B1F26F8DD031424CE7485BEA29A 9D3846561F4FEFA5EF61F989EB9038CECC9ECEBA99875E7E2B22871BFD254982 0FF49FF516AAEBDE48E317DF215FDAFFCABABBD6D2F8B38B38E5DD9723714C12 86F38A5EEDA13B7D24B788D0D1D949E1C39FE6C09AD3B04D4D7594AFC47AE43F 7405A75CF61E3449E6B5E609005A3FB42A8DC3B99BFFF5AD65F9BB3FCAC1B567 A2224795ED136BE9FAD015ACDE703A9224539E7BA46B9E108136DAF2B02F1387 2C7EC7E5ECC3B070CB63B8A3A01C9DE7D3F9D79F66D9EA01E2383EAA5CE58B88 F13CAF03C0063E82A7C66002CFC7B918750E1599369930B3985AFADF7939FBC7 46E81DDE354F4023F4D20FB274D5EA299A7D2ED91F630C412E87F53CD41892D4 92A9C69111278848CE6CDAB4C90E0F0FBFE1A4D34E5DF7C2CDB75D79C6A29173 EB62A9E73AA167116EF9712C5CB90AAF73019EE7CF59C3AB2A61AD4A74F3F578 61E3081CA1F4F7D28673D8F0171F250EC359896F6E92029AC48C0C0EB26FDB56 AA2FEE42460E62460F52E8E961F771E77C79C5DAFEFF2E97CB5BFCF3CE3B4F80 2D406E308A2BBD12D29324485442CB83E8EE27897FE71316BB195A7B0ECBCE38 0F5C3CABA931C650E8EA66FF85EFA3FF9E1FA273B3B853E45E8B5DAC7AC7BB48 A2684EC4FB41C081B1315EFAD98F31DBB7A1F53A8890270554150AF900EB7243 175F7CF173C088DF120C99FDCE4E666D4C6ACF552DBE0AB63ACA9ACD77B27FFB E3D8F3DF45F7CA01C4256D17A622AC39F534869E594FC78BDB0E2B9E50111A17 7F80EEAECE39E92607ECBAE74E2AF7DE85278A1A8B41119B725BF3D18A215FC8 4993E62966B024A6ED129DF5E92B0FD37DCFF7D8FBCC13F841D07671C6189238 2677FE45187187B5FFB5E5AB597BEA8659895755C439B6FCC75768DC7737BEB5 60BD36C02A6B4F5C559BD60F98EBE5A9B0F4E19F33F4DB5FE3FBFEAC20F4AC58 C5E8CA13A6786A6D159F4BC8BFF9ADB35A2655A55A6FB0F5BA2F100CED066BE7 AA9FCCBC00500CD65AFA1EBF9FBD2FEE4C7DF07656411CC1F917A173D0E00608 7BFAE93E615D5BCBA39A263B76DFFA03BCD19194F823B0E2763E262A5061C12F 7F44AD566BBB5322C2E2E52B483ABAE714DD554F7F33FDDDDD6DF58BE7FB6C79 F8D778DB9E9997EB3D2F0014C84575CACF3E91C6DA22D3DEAA8A18835BB21233 8B18489063C1C0713897CC389F8850191BC3BBF776F0BCF9394247C39BCA3FFE 10E3A79C49CEB40D2929AF389EC2F63FA0DECCB8BB7C919EFE45842D41CE748E D681271FC73897E522F4D504C0D01355D9B3F5297AD79EDC5ED1AD5883710978 C18C392CEDEE41B24873C627FA0195C71F25DF525778553940AC47D71FB790AC 59DB9E53F2391A0B971054CB33CABF5BB4141521690364BD56A330F847D47A73 B62CAF2800184BA1B49F4A1CD32E99EC594354E83C04009DB42DAA84411ED74C 36CE6056E37D7BD318C5D879275F8E0E008036EA181562D7C61A00B19F4BC359 E790895B5282C2107A1692B489F88C31D477EE40CA65D40FC09A1488EC566B53 636A4CB34E97BDD75716005471CE913899D17C19CFC3292423C3B824233E71A9 A57082346A18CF6FCB01188346118D7D4368904B95A0B12836F505AC07D6C378 1EF801C6F3534B619AC0BC52001883384792CC1CB2AA7368A3463C368A388713 C93841D33478BD8688A40AB00D0061B54A343E0E418064142936DD706B338EF0 52403C1F633DF0739820C02B16302D8EDB3C0150D4254814E2A2104CEA21CE04 40248ADB3784AB551027290788A63546716818D3D8F62C9D03C7B575820A2B8E A15229A1F9425AB7C4A46175C6F54A260E4DD1C8B802CFC3063E7D2DBEC36101 6068C6EE0E091B4818E2C206124548771F4EB5AD5B6CACC19447D3FFBAB4F0A1 2E739444D124A4806067516E1D1BDE806BD453229B79846639BE09064D4052D6 579B7245AEA32B158F2301409308693490B03149781C236148BC7A7D2A7B6DB4 77A31E523C308826719A656AEEBE6B569D159EDF9289EACC1C902F1691638EC5 0C0F4D94D155D2DE82664F82D0AC5899C9DB18A25A6D6A52742E6C2E7184544A 486914298F219571A45A46EB15A45E85D2412AA79EDF369456559228C40EBE98 EA02972A3E9AAEB2086A2CC9CEADD85982266934E8BEE83254252DC989A0EA52 CE1487B8044D92543C9338BDE3080943246E4CC902D8765A5D5D8256CB687914 ADA6444BAD8234AA6858471A0D340A29AF389EDC09A7CC1ABB7BCF6ECE185B5F E60334DF6B691CC27AFBF4781CD377FE5B5385A79A02A16912455D5A88D44CC1 AA7399D94D1097207132C555B1D3C5A3AA9212582921D512522F23F52A1AD6D0 A891DAEB3844E3084D62920BDF8749A2B679783586FCE65FA5B6BBD94FD32CE1 B6DCA63C4EEDC07E3CCF6B3B5F71D500C1056F87A6CFD09208553D24D3AD69C7 491310DA8A804BA056416A25B45E411B55B4D140C30634094F22344E3049447D F971D853CF4145DA174FEA35ECAEADD3D4AF5B3301293794EED8885FEC680F68 92B0E6AA2F60962C9F0AE6840FA1531E937289BECCBCDA431724B50A52AF40A3 86366A681442DC8038425D9C56649C0371D4BB16A29FFA4A0A5A3BD6F73C4677 EEC0AB8CCFC9ADB60FDC4EA334FB582F89597ECD7568239AE2274C4A550B7761 A6345ECD08006115C23A12A54413479942895197803890847AA183EADF7E39DD F9594A54A1F5E9BAEB87734F89F93EB55FDE411004B396B7166F78030337DE32 4B44903536CD9A105145C354B199388224CA884EC00946047509F5FE95C49FBB 897CFF524CE6FCB4BBC3271E21B7FDA939E7ECB01EA53B7F425028CC3A771285 F49DF64606FEEB16BC053D6D4A7266AAEE995E07282431B838DB7197B2B713AC 8B8815062FFF47DC3F7D738A3BD97E3703B8E3A654F91D4EE27578905DDFFE77 FC4261160FDC20E2E85FB79E33EE7C908EF77D18899239B7F5F859EB681D68B8 3811AB554CA3868D631227943BFA48161D43E584337067BF93EE7C0E49662F8C A4A5B61CC3B7DD44CF0B4FE3FCFC61C6A901C9EDB7125EF25E724B576415A5F6 7E8603CEFEFC9738F05757B0EFE73FE6C06F1EA1B6631B321EA66D7D808411D6 78215037C6A8B9F9E69B0B2B56ACB8B7A3A3A3AF323276CC325BE945A09CEF26 E85B42B158C40222EEB08AA7D65A6A2FEEC07EF99369A4279AF51666BD449239 3F5939ACD9DBD73A4E4449D69CC4FAEFFC94A85A3DACE77B9E47B1B31327C2D8 F838E5A79FA251AEE0E5028A6B4FDA8161AC5C2E5FEF8F8C8CD80D1B36BC2997 CB157B7B7B9B4DADA627435CC5212DEC36E7C246A5827EFDB3A9DE9847B8E56D 7F86E7AFFE0C277FF1064A6363735E8388502DA789978E5C8ECEB3DE34C92C22 27349374D6A6DE944EB8A322A655911C6EE381F53C3C6B31D75E49502DCDBFBB CE0F881EBC8767BF7D3D9D3DBD47B4AE66F528BB4D935611517FBAB2F2BC6AF9 5184FBD2DF111C18E468B54818DF27FAD177D852AD72FABF5EC3D8C18347ED30 87DFACBE98793686068502B55DDB906F7E8E60642FD2260D75A40997C6C61FF0 44699C933EF72554E4A8344BF887B2D4E165C1D2F8DFF33C0EFEFA1EBA6FB916 C164C473F4AF5C9EC67D77B2F9F78FB1EEEBDFA773C54A92AC43EC48D60E60E7 C301F98E4EC68776137EF1132CB8F5AB737774E69981F68687D8FAE14B79EEDA 6BB07E404767E71130544AF39C1A259B20D92CE91839811D7FA0BCE96EFA7F77 2F0E9BC9FB2BDD23D8E2EF8BA37AFB4FD8FCF083F4BFFF23AC7CD7E514571C03 71441C4573E60AFF50E2D3EEDC34B1636DAAD573BE4FB55CA65C29C353FFC3C2 077F8C19DD8F6011EB672EA6F027BD34F53275EC20FB6FFC3AC3FF791D85B3CF 65E9DF7C8AFE934EA66BC1021211DCCB2B4C0A98894ED18E8E8EA8542A7D5EA1 9703074ECF0D3E776971740F188B28D8A19D24A5118A95125DE307208A70D643 3D0FDC6BE70C95C9E5A93FF65B9EFFCD23BCD0D58DE95B44D0D74F61E531E4FA FA09A308CF0F745F1898B3FEF99377C5B5DAF65AADF670EB89919EFD3B5EB870 FC6B9FDAB878412E48F63C6F347138254D604A56C0902CE426B3A54EB3A32F4D 0F4F264E92A4AF9A75AC1F9927D89C5315DCB4E3B465CED6F9B235389706B00E 8ACB97B04906F67C7FF0D1CB80678C31A16DD188C982D5ABF7FCFCE978B0B8A8 DFE0E750CFCF2A2E66EA3D21E7E6357E8C40B3DA80C1F8505F7A2CEFBFFEDFBE 075452B275D20A00613EE70F5DFA8D1BAFF9C6DD2F49EEF4F3D2AA8A01632D86 26107A88AEB31908AF45240C9208413E50F7A6B7B1A9BAF0C9B7BDE76D8FA8EA 28904C9C1A6BF1AA3A513DF1BEDB7E75C9DDD75C73D527FEF22DC5BE3D4FE097 4690B0813A87CB8A186931A37960213B5425D9692F6DF6F9B58EC958B2E5BB66 5A7CEA7720B4FE3639D7D4CF2DA230B186C9FF193FD0C8A929AC3D991D1D03FA CCEEEA533F7DE6F6AB80A78121634C34E5D458068455D51E63CCC0F667779E71 C3BF5C77857B69C7590B6C985BB9BC9BBC6F303A29BBDACCE5A3538EBC35534F D27A3E509838E6D63C77A8ADC7E1267215538FC071E8B896A4C644AE0F404DCB 7B78693422ACC72C583DB0EDF2CF7C7CE3C51FB9649331662BE991B9B0797872 BA93A31628AAEA6263CCF29D8363AB6EDF78FFCAD20B7F5C58E8ECE8A854EBFD BDBD5DA3D552AD1A27499C2E6B9A63A86D4CF8DC98F7E5838DC1E6F3B99CF1BD FE5A2DECF7BC433D2FD5247671B198DF7BEC9A657BDEF2C18B77AEEC2BEE0646 5575D418330EC4D39E1C6D7578B236321F28909E1DB6A467893BB3EF22A00AC4 7F1ACF674A062B007A80E234952DC9D6546A595F98AD3731C6C8B440CF00C274 E3BC6C114ADA9C29AF82F66B6E8E9DE1D90A24D9FAB4D5D19BCE3BFC3F18A85F E1469E4F0B0000000049454E44AE426082 } Proportional = True end end object lblTitle: TLabel Left = 0 Height = 22 Top = 88 Width = 151 BorderSpacing.CellAlignHorizontal = ccaLeftTop Caption = 'Double Commander' Font.Color = clRed Font.Style = [fsBold] ParentColor = False ParentFont = False end object lblVersion: TLabel Left = 0 Height = 22 Top = 114 Width = 51 BorderSpacing.CellAlignHorizontal = ccaLeftTop Caption = 'Version' ParentColor = False end object lblRevision: TLabel Left = 0 Height = 22 Top = 140 Width = 58 BorderSpacing.CellAlignHorizontal = ccaLeftTop Caption = 'Revision' ParentColor = False end object lblBuild: TLabel Left = 0 Height = 22 Top = 166 Width = 37 BorderSpacing.CellAlignHorizontal = ccaLeftTop Caption = 'Build' ParentColor = False end object lblLazarusVer: TLabel Left = 0 Height = 22 Top = 192 Width = 53 BorderSpacing.CellAlignHorizontal = ccaLeftTop Caption = 'Lazarus' ParentColor = False end object lblFreePascalVer: TLabel Left = 0 Height = 22 Top = 218 Width = 77 BorderSpacing.CellAlignHorizontal = ccaLeftTop Caption = 'Free Pascal' ParentColor = False end object lblPlatform: TLabel Left = 0 Height = 1 Top = 244 Width = 1 BorderSpacing.CellAlignHorizontal = ccaLeftTop ParentColor = False end object lblOperatingSystem: TLabel Left = 0 Height = 1 Top = 249 Width = 1 BorderSpacing.CellAlignHorizontal = ccaLeftTop ParentColor = False end object lblWidgetsetVer: TLabel Left = 0 Height = 1 Top = 254 Width = 1 BorderSpacing.CellAlignHorizontal = ccaLeftTop ParentColor = False end object btnCopyToClipboard: TButton Left = 4 Height = 31 Top = 259 Width = 143 AutoSize = True BorderSpacing.CellAlignHorizontal = ccaCenter Caption = 'Copy to clipboard' Constraints.MinWidth = 100 OnClick = btnCopyToClipboardClick TabOrder = 1 end end object btnClose: TBitBtn AnchorSideLeft.Control = pnlInfo AnchorSideLeft.Side = asrCenter AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 34 Height = 35 Top = 357 Width = 100 Anchors = [akLeft, akBottom] AutoSize = True BorderSpacing.Bottom = 8 BorderSpacing.InnerBorder = 2 Caption = '&Close' Constraints.MinWidth = 100 Default = True Kind = bkClose ModalResult = 11 TabOrder = 2 end end doublecmd-0.5.8/src/uwcxprototypes.pas0000644000175000017500000000516211740433676017160 0ustar alexxalexxunit uWCXprototypes; {$mode objfpc}{$H+} interface uses LCLType, WcxPlugin; {$IFDEF MSWINDOWS}{$CALLING STDCALL}{$ELSE}{$CALLING CDECL}{$ENDIF} type { Mandatory } TOpenArchive = function (var ArchiveData : tOpenArchiveData): TArcHandle; TReadHeader = function (hArcData: TArcHandle; var HeaderData : THeaderData): Integer; TProcessFile = function (hArcData: TArcHandle; Operation: Integer; DestPath: PAnsiChar; DestName: PAnsiChar): Integer; TCloseArchive = function (hArcData: TArcHandle): Integer; { Optional } TPackFiles = function (PackedFile: PAnsiChar; SubPath: PAnsiChar; SrcPath: PAnsiChar; AddList: PAnsiChar; Flags: Integer): Integer; TDeleteFiles = function (PackedFile: PAnsiChar; DeleteList: PAnsiChar): Integer; TGetPackerCaps = function () : Integer; TConfigurePacker = procedure (Parent: HWND; DllInstance: THandle); TSetChangeVolProc = procedure (hArcData: TArcHandle; ChangeVolProc: tChangeVolProc); TSetProcessDataProc = procedure (hArcData: TArcHandle; ProcessDataProc: TProcessDataProc); TStartMemPack = function (Options: Integer; FileName: PAnsiChar): TArcHandle; TPackToMem = function (hMemPack: TArcHandle; BufIn: PByte; InLen: Integer; Taken: pInteger; BufOut: PByte; OutLen: Integer; Written: pInteger; SeekBy: pInteger): Integer; TDoneMemPack = function (hMemPack: TArcHandle): Integer; TCanYouHandleThisFile = function (FileName: PAnsiChar): boolean; TPackSetDefaultParams = procedure (dps: pPackDefaultParamStruct); TReadHeaderEx = function (hArcData: TArcHandle; var HeaderDataEx : THeaderDataEx): Integer; TPkSetCryptCallback = procedure (PkCryptProc: TPkCryptProc; CryptoNr, Flags: Integer); TGetBackgroundFlags = function(): Integer; { Unicode } TOpenArchiveW = function (var ArchiveData : tOpenArchiveDataW): TArcHandle; TReadHeaderExW = function (hArcData: TArcHandle; var HeaderDataExW : THeaderDataExW): Integer; TProcessFileW = function (hArcData: TArcHandle; Operation: Integer; DestPath, DestName: PWideChar): Integer; TSetChangeVolProcW = procedure (hArcData: TArcHandle; ChangeVolProc: tChangeVolProcW); TSetProcessDataProcW = procedure (hArcData: TArcHandle; ProcessDataProc: TProcessDataProcW); TPackFilesW = function (PackedFile, SubPath, SrcPath, AddList: PWideChar; Flags: Integer): Integer; TDeleteFilesW = function (PackedFile, DeleteList: PWideChar): Integer; TStartMemPackW = function (Options: Integer; FileName: PWideChar): TArcHandle; TCanYouHandleThisFileW = function (FileName: PWideChar): boolean; TPkSetCryptCallbackW = procedure (PkCryptProc: TPkCryptProcW; CryptoNr, Flags: Integer); {$CALLING DEFAULT} implementation end. doublecmd-0.5.8/src/fchecksumcalc.lrt0000644000175000017500000000042212023046500016601 0ustar alexxalexxTFRMCHECKSUMCALC.CAPTION=Calculate check sum... TFRMCHECKSUMCALC.LBLSAVETO.CAPTION=&Save check sum file(s) to: TFRMCHECKSUMCALC.CBSEPARATEFILE.CAPTION=C&reate separate checksum file for each file TFRMCHECKSUMCALC.BTNOK.CAPTION=&OK TFRMCHECKSUMCALC.BTNCANCEL.CAPTION=&Cancel doublecmd-0.5.8/src/fdescredit.pas0000644000175000017500000000545511740433676016142 0ustar alexxalexx{ Double commander ------------------------------------------------------------------------- Dialog for editing file comments. Copyright (C) 2008-2010 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fDescrEdit; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, StdCtrls, Buttons, uDescr; type { TfrmDescrEdit } TfrmDescrEdit = class(TForm) btnOK: TBitBtn; btnCancel: TBitBtn; cbEncoding: TComboBox; lblFileName: TLabel; lblEncoding: TLabel; lblEditCommentFor: TLabel; memDescr: TMemo; procedure cbEncodingChange(Sender: TObject); procedure FormCreate(Sender: TObject); private FDescr: TDescription; procedure DisplayEncoding; public { public declarations } end; function ShowDescrEditDlg(sFileName: String): Boolean; implementation {$R *.lfm} uses LConvEncoding; function ShowDescrEditDlg(sFileName: String): Boolean; const nbsp = #194#160; begin Result:= False; with TfrmDescrEdit.Create(Application) do begin FDescr:= TDescription.Create(False); lblFileName.Caption:= sFileName; // read description memDescr.Lines.Text:= StringReplace(FDescr.ReadDescription(sFileName), nbsp, LineEnding, [rfReplaceAll]); DisplayEncoding; if ShowModal = mrOK then begin FDescr.WriteDescription(sFileName, StringReplace(memDescr.Lines.Text, LineEnding, nbsp, [rfReplaceAll])); FDescr.SaveDescription; Result:= True; end; FDescr.Free; Free; end; end; { TfrmDescrEdit } procedure TfrmDescrEdit.FormCreate(Sender: TObject); begin // fill encoding combobox cbEncoding.Clear; GetSupportedEncodings(cbEncoding.Items); end; procedure TfrmDescrEdit.DisplayEncoding; var I: Integer; begin for I:= 0 to cbEncoding.Items.Count - 1 do if SameText(NormalizeEncoding(cbEncoding.Items.Strings[I]), FDescr.Encoding) then begin cbEncoding.ItemIndex:= I; Break; end; end; procedure TfrmDescrEdit.cbEncodingChange(Sender: TObject); begin FDescr.Encoding:= cbEncoding.Text; memDescr.Lines.Text:= FDescr.ReadDescription(lblFileName.Caption); end; end. doublecmd-0.5.8/src/ffileassoc.pas0000644000175000017500000005214512162610121016117 0ustar alexxalexx{ Double Commander ------------------------------------------------------------------------- File associations configuration Copyright (C) 2008-2009 Koblov Alexander (Alexx2000@mail.ru) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA } unit fFileAssoc; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Buttons, ExtCtrls, EditBtn, uExts, ExtDlgs, Menus, uOSForms; type { TfrmFileAssoc } TfrmFileAssoc = class(TAloneForm) btnAddAct: TButton; btnAddExt: TButton; btnAddNewType: TButton; btnCancel: TBitBtn; btnDownAct: TButton; btnOK: TBitBtn; btnRemoveIcon: TSpeedButton; btnUpAct: TButton; btnRemoveAct: TButton; btnRemoveExt: TButton; btnRemoveType: TButton; btnRenameType: TButton; edbAction: TEditButton; edtIconFileName: TEdit; fneCommand: TFileNameEdit; gbFileTypes: TGroupBox; gbIcon: TGroupBox; gbExts: TGroupBox; gbActions: TGroupBox; lblAction: TLabel; lblCommand: TLabel; lbActions: TListBox; lbExts: TListBox; lbFileTypes: TListBox; miFullPath: TMenuItem; miFilePath: TMenuItem; miFileName: TMenuItem; miGetOutputFromCommand: TMenuItem; miShell: TMenuItem; miViewer: TMenuItem; miVfs: TMenuItem; miEditor: TMenuItem; miEdit: TMenuItem; miView: TMenuItem; miOpen: TMenuItem; OpenPictureDialog: TOpenPictureDialog; pnlLeftSettings: TPanel; pnlActsEdits: TPanel; pnlActsButtons: TPanel; pnlExtsButtons: TPanel; pnlRightSettings: TPanel; pnlSettings: TPanel; pnlButtonPanel: TPanel; pmActions: TPopupMenu; pmCommands: TPopupMenu; sbtnIcon: TSpeedButton; btnCommands: TSpeedButton; procedure btnActionsClick(Sender: TObject); procedure btnAddActClick(Sender: TObject); procedure btnAddExtClick(Sender: TObject); procedure btnAddNewTypeClick(Sender: TObject); procedure btnCancelClick(Sender: TObject); procedure btnCommandsClick(Sender: TObject); procedure btnDownActClick(Sender: TObject); procedure btnOKClick(Sender: TObject); procedure btnRemoveActClick(Sender: TObject); procedure btnRemoveExtClick(Sender: TObject); procedure btnRemoveTypeClick(Sender: TObject); procedure btnRemoveTypeResize(Sender: TObject); procedure btnRenameTypeClick(Sender: TObject); procedure btnRenameTypeResize(Sender: TObject); procedure btnUpActClick(Sender: TObject); procedure edtIconFileNameChange(Sender: TObject); procedure fneCommandAcceptFileName(Sender: TObject; var Value: String); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure lbActionsSelectionChange(Sender: TObject; User: boolean); procedure lbExtsSelectionChange(Sender: TObject; User: boolean); procedure lbFileTypesDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); procedure lbFileTypesSelectionChange(Sender: TObject; User: boolean); procedure edtActionChange(Sender: TObject); procedure fneCommandChange(Sender: TObject); procedure miActionsClick(Sender: TObject); procedure miCommandsClick(Sender: TObject); procedure pnlRightSettingsResize(Sender: TObject); procedure pnlSettingsResize(Sender: TObject); procedure sbtnIconClick(Sender: TObject); procedure btnRemoveIconClick(Sender: TObject); private Exts : TExts; FUpdatingControls: Boolean; procedure UpdateEnabledButtons; {en Frees icon cached in lbFileTypes.Items.Objects[Index]. } procedure FreeIcon(iIndex: Integer); procedure SetIconFileName(const sFileName: String); procedure SetMinimumSize; public constructor Create(TheOwner: TComponent); override; destructor Destroy; override; end; procedure ShowFileAssocDlg; implementation {$R *.lfm} uses LCLType, uGlobsPaths, uGlobs, uPixMapManager, uLng, uDCUtils, DCOSUtils, DCStrUtils; var frmFileAssoc: TfrmFileAssoc = nil; procedure ShowFileAssocDlg; begin if not Assigned(frmFileAssoc) then frmFileAssoc := TfrmFileAssoc.Create(Application); frmFileAssoc.ShowOnTop; end; { TfrmFileAssoc } constructor TfrmFileAssoc.Create(TheOwner: TComponent); begin FUpdatingControls := False; inherited Create(TheOwner); end; destructor TfrmFileAssoc.Destroy; var i: Integer; begin for i := 0 to lbFileTypes.Items.Count - 1 do FreeIcon(i); inherited; end; procedure TfrmFileAssoc.FormCreate(Sender: TObject); var I : Integer; sName : String; Bitmap : TBitmap; begin Exts := TExts.Create; // load extension file if mbFileExists(gpCfgDir + 'doublecmd.ext') then Exts.LoadFromFile(gpCfgDir + 'doublecmd.ext'); lbFileTypes.ItemHeight := gIconsSize + 4; // fill file types list box for I := 0 to Exts.Count - 1 do begin sName := Exts.Items[I].Name; if sName = '' then sName := Exts.Items[I].SectionName; // load icon for use in OnDrawItem procedure Bitmap := PixMapManager.LoadBitmapEnhanced(Exts.Items[I].Icon, gIconsSize, True, lbFileTypes.Color); lbFileTypes.Items.AddObject(sName, Bitmap); end; if Exts.Count > 0 then lbFileTypes.ItemIndex:= 0; UpdateEnabledButtons; // Initialize property storage InitPropStorage(Self); end; procedure TfrmFileAssoc.FormDestroy(Sender: TObject); begin if Assigned(Exts) then FreeAndNil(Exts); end; procedure TfrmFileAssoc.UpdateEnabledButtons; begin if (lbFileTypes.Items.Count = 0) or (lbFileTypes.ItemIndex = -1) then begin btnAddExt.Enabled:= False; btnAddAct.Enabled:= False; sbtnIcon.Enabled:= False; btnRemoveIcon.Enabled:= False; end else begin btnAddExt.Enabled:= True; btnAddAct.Enabled:= (lbExts.Items.Count > 0); sbtnIcon.Enabled:= btnAddAct.Enabled; btnRemoveIcon.Enabled:= btnAddAct.Enabled; end; if (lbExts.Items.Count = 0) or (lbExts.ItemIndex = -1) then btnRemoveExt.Enabled := False else btnRemoveExt.Enabled := True; if (lbActions.Items.Count = 0) or (lbActions.ItemIndex = -1) then begin btnRemoveAct.Enabled := False; btnUpAct.Enabled := False; btnDownAct.Enabled := False; edbAction.Enabled:= False; fneCommand.Enabled:= False; btnCommands.Enabled:= False; edbAction.Text:= ''; fneCommand.FileName:= ''; end else begin btnRemoveAct.Enabled := True; btnUpAct.Enabled := (lbActions.ItemIndex > 0); btnDownAct.Enabled := (lbActions.ItemIndex < lbActions.Items.Count - 1); edbAction.Enabled:= True; fneCommand.Enabled:= True; btnCommands.Enabled:= True; end; end; procedure TfrmFileAssoc.btnAddNewTypeClick(Sender: TObject); var ExtAction : TExtAction; s: string; begin s:= InputBox(Caption, rsMsgEnterName, ''); if s='' then exit; ExtAction := TExtAction.Create; ExtAction.IconIndex:= -1; ExtAction.IsChanged := True; with lbFileTypes do begin ExtAction.Name := s; Items.AddObject(ExtAction.Name, nil); // add file type to TExts object Exts.AddItem(ExtAction); ItemIndex := Items.Count - 1; end; UpdateEnabledButtons; end; procedure TfrmFileAssoc.btnRemoveTypeClick(Sender: TObject); var iIndex : Integer; begin with lbFileTypes do begin iIndex := ItemIndex; if iIndex < 0 then Exit; FreeIcon(iIndex); Items.Delete(iIndex); Exts.DeleteItem(iIndex); if Items.Count = 0 then begin lbExts.Clear; lbActions.Clear; end else begin if iIndex = 0 then ItemIndex := 0 else ItemIndex := iIndex - 1; end end; UpdateEnabledButtons; end; procedure TfrmFileAssoc.btnRemoveTypeResize(Sender: TObject); begin SetMinimumSize; end; procedure TfrmFileAssoc.btnRenameTypeClick(Sender: TObject); var iIndex : Integer; sName : String; begin iIndex := lbFileTypes.ItemIndex; if iIndex < 0 then Exit; sName := lbFileTypes.Items[iIndex]; sName := InputBox(Caption, rsMsgEnterName, sName); lbFileTypes.Items[iIndex] := sName; // rename file type in TExts object Exts.Items[iIndex].Name := sName; Exts.Items[iIndex].IsChanged:= True; UpdateEnabledButtons; end; procedure TfrmFileAssoc.btnRenameTypeResize(Sender: TObject); begin SetMinimumSize; end; procedure TfrmFileAssoc.lbActionsSelectionChange(Sender: TObject; User: boolean); var iIndex : Integer; slActions : TStringList; begin iIndex := lbActions.ItemIndex; if (iIndex < 0) or (lbActions.Tag = 1) then Exit; slActions := TStringList(lbActions.Items.Objects[iIndex]); edbAction.Text := slActions.Names[iIndex]; fneCommand.FileName := slActions.ValueFromIndex[iIndex]; UpdateEnabledButtons; end; procedure TfrmFileAssoc.lbExtsSelectionChange(Sender: TObject; User: boolean); begin if (lbExts.ItemIndex < 0) then Exit; UpdateEnabledButtons; end; procedure TfrmFileAssoc.lbFileTypesDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState); var iTextTop: Integer; MR: TRect; begin with (Control as TListBox) do begin MR.Left:= ARect.Left + 1; MR.Top:= ARect.Top + 1; MR.Right:= ARect.Right - 1; MR.Bottom:= ARect.Bottom - 1; if odSelected in State then begin Canvas.Font.Color := clWindowText; Canvas.Brush.Color:= clWindowText; Canvas.FillRect(ARect); Canvas.Brush.Color:= Color; Canvas.FillRect(MR); end else begin Canvas.Brush.Color:= Color; Canvas.FillRect(ARect); end ; iTextTop := MR.Top + (gIconsSize div 2) - (Canvas.TextHeight(Items[Index]) div 2); if (Canvas.Locked = False) and (Assigned(Items.Objects[Index])) then Canvas.Draw(MR.Left + 2, MR.Top + 1, TBitmap(Items.Objects[Index])); Canvas.TextOut(MR.Left + gIconsSize + 6, iTextTop, Items[Index]); end; end; procedure TfrmFileAssoc.lbFileTypesSelectionChange(Sender: TObject; User: boolean); var ExtCommand : TExtAction; I : Integer; bmpTemp: TBitmap = nil; begin if (lbFileTypes.ItemIndex >= 0) and (lbFileTypes.ItemIndex < Exts.Count) then begin ExtCommand := Exts.Items[lbFileTypes.ItemIndex]; lbExts.Items.Assign(ExtCommand.Extensions); if lbExts.Count > 0 then lbExts.ItemIndex := 0; lbActions.Items.Clear; for I := 0 to ExtCommand.Actions.Count - 1 do begin lbActions.Items.AddObject(ExtCommand.Actions.Names[I], ExtCommand.Actions); end; if lbActions.Count > 0 then lbActions.ItemIndex := 0; bmpTemp := PixMapManager.LoadBitmapEnhanced(ExtCommand.Icon, 32, True, sbtnIcon.Color); try sbtnIcon.Glyph := bmpTemp; finally if Assigned(bmpTemp) then FreeAndNil(bmpTemp); end; FUpdatingControls := True; // Don't trigger OnChange edtIconFileName.Text:= ExtCommand.Icon; FUpdatingControls := False; end else begin lbExts.Items.Clear; lbActions.Items.Clear; sbtnIcon.Glyph.Clear; edtIconFileName.Text := ''; end; UpdateEnabledButtons; end; procedure TfrmFileAssoc.edtActionChange(Sender: TObject); var iIndex : Integer; slActions : TStringList; begin iIndex := lbActions.ItemIndex; if (iIndex < 0) or (edbAction.Text = '') then Exit; slActions := TStringList(lbActions.Items.Objects[iIndex]); slActions.Strings[iIndex] := edbAction.Text + '=' + slActions.ValueFromIndex[iIndex]; lbActions.Items[iIndex] := edbAction.Text; if lbFileTypes.ItemIndex >= 0 then Exts.Items[lbFileTypes.ItemIndex].IsChanged:= True; end; procedure TfrmFileAssoc.fneCommandChange(Sender: TObject); var iIndex : Integer; slActions : TStringList; begin iIndex := lbActions.ItemIndex; if (iIndex < 0) or (fneCommand.Text = '') then Exit; slActions := TStringList(lbActions.Items.Objects[iIndex]); slActions.ValueFromIndex[iIndex] := fneCommand.Text; if lbFileTypes.ItemIndex >= 0 then Exts.Items[lbFileTypes.ItemIndex].IsChanged:= True; end; procedure TfrmFileAssoc.miActionsClick(Sender: TObject); var miMenuItem: TMenuItem absolute Sender; begin if miMenuItem.Name = 'miOpen' then edbAction.Text:= 'Open' else if miMenuItem.Name = 'miView' then edbAction.Text:= 'View' else if miMenuItem.Name = 'miEdit' then edbAction.Text:= 'Edit'; end; procedure TfrmFileAssoc.miCommandsClick(Sender: TObject); var miMenuItem: TMenuItem absolute Sender; begin if miMenuItem.Name = 'miVfs' then fneCommand.Text:= fneCommand.Text + '{!VFS} ' else if miMenuItem.Name = 'miViewer' then fneCommand.Text:= fneCommand.Text + '{!VIEWER} ' else if miMenuItem.Name = 'miEditor' then fneCommand.Text:= fneCommand.Text + '{!EDITOR} ' else if miMenuItem.Name = 'miShell' then fneCommand.Text:= fneCommand.Text + '{!SHELL} ' else if miMenuItem.Name = 'miGetOutputFromCommand' then begin fneCommand.Text:= fneCommand.Text + ''; fneCommand.SetFocus; fneCommand.SelStart:= Pos('?>', fneCommand.Text) - 1; end else if miMenuItem.Name = 'miFileName' then fneCommand.Text:= fneCommand.Text + '%f' else if miMenuItem.Name = 'miFilePath' then fneCommand.Text:= fneCommand.Text + '%d' else if miMenuItem.Name = 'miFullPath' then fneCommand.Text:= fneCommand.Text + '%p'; end; procedure TfrmFileAssoc.pnlRightSettingsResize(Sender: TObject); begin gbExts.Height := pnlRightSettings.ClientHeight div 4; end; procedure TfrmFileAssoc.pnlSettingsResize(Sender: TObject); begin pnlLeftSettings.Width := pnlSettings.ClientWidth div 3; end; procedure TfrmFileAssoc.sbtnIconClick(Sender: TObject); begin OpenPictureDialog.FileName:= NormalizePathDelimiters(edtIconFileName.Text); if OpenPictureDialog.Execute then edtIconFileName.Text := OpenPictureDialog.FileName; // Triggers OnChange end; procedure TfrmFileAssoc.btnRemoveIconClick(Sender: TObject); begin edtIconFileName.Text:= ''; // Triggers OnChange end; procedure TfrmFileAssoc.btnAddExtClick(Sender: TObject); var sExt : String; begin sExt := InputBox(Caption, rsMsgEnterFileExt, ''); if sExt <> '' then begin lbExts.ItemIndex := lbExts.Items.Add(sExt); // add extension in TExts object Exts.Items[lbFileTypes.ItemIndex].Extensions.Add(sExt); Exts.Items[lbFileTypes.ItemIndex].IsChanged:= True; end; UpdateEnabledButtons; end; procedure TfrmFileAssoc.btnRemoveExtClick(Sender: TObject); var I : Integer; begin // remove extension from extensions listbox with lbExts do begin I := ItemIndex; if I < 0 then Exit; Items.Delete(I); if Items.Count > 0 then begin if I = 0 then ItemIndex := 0 else ItemIndex := I - 1; end; end; // remove extension from TExts object Exts.Items[lbFileTypes.ItemIndex].Extensions.Delete(I); Exts.Items[lbFileTypes.ItemIndex].IsChanged:= True; UpdateEnabledButtons; end; procedure TfrmFileAssoc.btnUpActClick(Sender: TObject); var I : Integer; begin // move action in actions listbox with lbActions do begin Tag := 1; // start moving I := ItemIndex; if I = - 1 then exit; if I > 0 then begin Items.Move(I, I - 1); ItemIndex:= I - 1; end; end; // move action in TExts object with lbFileTypes do begin Exts.Items[ItemIndex].Actions.Move(I, I - 1); Exts.Items[ItemIndex].IsChanged:= True; end; lbActions.Tag := 0; // end moving UpdateEnabledButtons; end; procedure TfrmFileAssoc.edtIconFileNameChange(Sender: TObject); begin if not FUpdatingControls then SetIconFileName(edtIconFileName.Text); end; procedure TfrmFileAssoc.fneCommandAcceptFileName(Sender: TObject; var Value: String); begin if Pos(#32, Value) = 0 then Value:= Value + #32 else Value:= QuoteStr(Value) + #32; end; procedure TfrmFileAssoc.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin CloseAction := caFree; frmFileAssoc := nil; end; procedure TfrmFileAssoc.btnDownActClick(Sender: TObject); var I : Integer; begin // move action in actions listbox with lbActions do begin Tag := 1; // start moving I := ItemIndex; if I = - 1 then exit; if (I < Items.Count - 1) and (I > -1) then begin Items.Move(I, I + 1); ItemIndex:= I + 1; end; end; // move action in TExts object with lbFileTypes do begin Exts.Items[ItemIndex].Actions.Move(I, I + 1); Exts.Items[ItemIndex].IsChanged:= True; end; lbActions.Tag := 0; // end moving UpdateEnabledButtons; end; procedure TfrmFileAssoc.btnAddActClick(Sender: TObject); var I : Integer; ExtAction : TExtAction; begin with lbFileTypes do ExtAction := Exts.Items[ItemIndex]; ExtAction.IsChanged:= True; // add action to TExts object I := ExtAction.Actions.Add('='); // add action to actions listbox with lbActions do begin Items.AddObject('', ExtAction.Actions); ItemIndex := I; end; UpdateEnabledButtons; end; procedure TfrmFileAssoc.btnActionsClick(Sender: TObject); begin pmActions.PopUp(); end; procedure TfrmFileAssoc.btnRemoveActClick(Sender: TObject); var I : Integer; begin // remove action from actions listbox with lbActions do begin I := ItemIndex; if I < 0 then Exit; Items.Delete(I); end; // remove action from TExts object with lbFileTypes do begin Exts.Items[ItemIndex].Actions.Delete(I); Exts.Items[ItemIndex].IsChanged:= True; end; // update action index if lbActions.Count > 0 then begin if I = 0 then lbActions.ItemIndex := I else lbActions.ItemIndex := I - 1; end; UpdateEnabledButtons; end; procedure TfrmFileAssoc.btnOKClick(Sender: TObject); begin gExts.Free; gExts := Exts; Exts := nil; // so that it isn't destroyed later gExts.SaveToFile(gpCfgDir + 'doublecmd.ext'); Close; end; procedure TfrmFileAssoc.btnCancelClick(Sender: TObject); begin Close; end; procedure TfrmFileAssoc.btnCommandsClick(Sender: TObject); begin pmCommands.PopUp(); end; procedure TfrmFileAssoc.FreeIcon(iIndex: Integer); begin with lbFileTypes do begin Canvas.Lock; try if Assigned(Items.Objects[iIndex]) then begin Items.Objects[iIndex].Free; Items.Objects[iIndex] := nil; end; finally Canvas.Unlock; end; end; end; procedure TfrmFileAssoc.SetIconFileName(const sFileName: String); var bmpTemp: TBitmap; Index: Integer; begin if sFileName <> EmptyStr then begin bmpTemp:= PixMapManager.LoadBitmapEnhanced(sFileName, 32, True, sbtnIcon.Color); if Assigned(bmpTemp) then begin sbtnIcon.Glyph.Assign(bmpTemp); FreeAndNil(bmpTemp); end else sbtnIcon.Glyph.Clear; end else sbtnIcon.Glyph.Clear; Index := lbFileTypes.ItemIndex; if (Index >= 0) and (Index < Exts.Count) then begin FreeIcon(Index); if sFileName <> EmptyStr then // save icon for use in OnDrawItem procedure lbFileTypes.Items.Objects[Index]:= PixMapManager.LoadBitmapEnhanced(sFileName, gIconsSize, True, Color); lbFileTypes.Repaint; Exts.Items[Index].Icon:= sFileName; Exts.Items[Index].IconIndex:= -1; Exts.Items[Index].IsChanged:= True; end; end; procedure TfrmFileAssoc.SetMinimumSize; begin gbFileTypes.Constraints.MinWidth := gbFileTypes.BorderSpacing.Left + btnRemoveType.Left + btnRemoveType.Width + 5 + // space between btnRenameType.Width + gbFileTypes.Width - (btnRenameType.Left + btnRenameType.Width) + gbFileTypes.BorderSpacing.Right; pnlLeftSettings.Constraints.MinWidth := gbFileTypes.Constraints.MinWidth + gbFileTypes.BorderSpacing.Around; Constraints.MinWidth := pnlLeftSettings.Constraints.MinWidth + pnlLeftSettings.BorderSpacing.Left + pnlLeftSettings.BorderSpacing.Right + pnlLeftSettings.BorderSpacing.Around + pnlRightSettings.Constraints.MinWidth + pnlRightSettings.BorderSpacing.Left + pnlRightSettings.BorderSpacing.Right + pnlRightSettings.BorderSpacing.Around; end; end. doublecmd-0.5.8/src/un_xtrctdwrflnfo.pp0000644000175000017500000010461512047417134017260 0ustar alexxalexx{ This file is part of the chelinfo library. Copyright (c) 2008 by Anton Rzheshevski Parts (c) 2006 Thomas Schatzl, member of the FreePascal Development team Parts (c) 2000 Peter Vreman (adapted from original stabs line reader) Dwarf LineInfo Extractor See the file COPYING.FPC, included in this distribution, for details about the copyright. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. **********************************************************************} { 2008, Anton Rzheshevski aka Cheb: Like dr. Frankenshtein I sewn this library together from the dead meat of the the FPC RTL modules lineinfo.pp and lnfodwrf.pp. These as of Jan. 2008 / FPC 2.2.0 both didn't work and had several limitations (e.g. inability to be used from a DLL) Oct 2009, by cobines Now can extract from ELF32, ELF64, PE regardless of base platform (Linux and Win). Fixed reading .debug_line section from PE files (now long section name is used). Nov 2012, by alexx2000 Now can extract from Mach-O binary (Mac OS X, Intel 32 and 64 bit). } {$mode delphi} {$longstrings on} {$ifndef endian_little} {$fatal powerpc architecture not supported} {$endif} unit un_xtrctdwrflnfo; interface uses SysUtils, Classes; function ExtractDwarfLineInfo( ExeFileName: ansistring; out _dlnfo: pointer; out _dlnfoSize: QWord; out Imagebase: QWord): longbool; { Reads the dwarf line info from an executable. In case of error, see ExtractDwarfLineInfoError for details. ImageBase is nil for unix DLLs in all other cases the value it receives must be substracted from the addresses in the dwarf line info (and then the real base address added, to account for the possible relocation) NOTE: currently in unix it is also NIL for the main executable, corresponding the GetModuleByAddr() in un_lineinfo also returning NIL as the base address for the main executable. } function DlnNameByExename(exename: string): string; {generates file names with .zdli extension. Use in cases when both your windows and linux binaries are placed in the same folder } var ExtractDwarfLineInfoError: WideString = ''; implementation uses zstream; const // Cannot use reference counted strings because they are emptied // when a function from this module is called two or more times // while an exception is being processed (don't know why). DwarfDebugLine: shortstring = '.debug_line'; DwarfZDebugLine: shortstring = '.zdebug_line'; DwarfDarwinDebugLine: shortstring = '__debug_line'; DwarfDarwinSegmentName: shortstring = '__DWARF'; TextDarwinSegmentName: shortstring = '__TEXT'; type TCheckResult = (header_not_found, header_invalid, no_debug_info, found_debug_info); {$MACRO ON} {$ifdef DEBUG_DWARF_PARSER} {$define DEBUG_WRITELN := WriteLn} {$define DEBUG_COMMENT := } {$else} {$define DEBUG_WRITELN := //} {$define DEBUG_COMMENT := //} {$endif} { ELF Header structures types} type Elf32_Half = Word; Elf64_Half = Word; { Types for signed and unsigned 32-bit quantities. } Elf32_Word = DWord; Elf32_Sword = Longint; Elf64_Word = DWord; Elf64_Sword = Longint; { Types for signed and unsigned 64-bit quantities. } Elf32_Xword = QWord; Elf32_Sxword = Int64; Elf64_Xword = QWord; Elf64_Sxword = Int64; { Type of addresses. } Elf32_Addr = DWord; Elf64_Addr = QWord; { Type of file offsets. } Elf32_Off = DWord; Elf64_Off = QWord; { Type for section indices, which are 16-bit quantities. } Elf32_Section = Word; Elf64_Section = Word; { Type for version symbol information. } Elf32_Versym = Elf32_Half; Elf64_Versym = Elf64_Half; { some constants from the corresponding header files } const El_NIDENT = 16; { some important indices into the e_ident signature of an ELF file } EI_MAG0 = 0; EI_MAG1 = 1; EI_MAG2 = 2; EI_MAG3 = 3; EI_CLASS = 4; { the first byte of the e_ident array must be of this value } ELFMAG0 = $7f; { the second byte of the e_ident array must be of this value } ELFMAG1 = Byte('E'); { the third byte of the e_ident array must be of this value } ELFMAG2 = Byte('L'); { the fourth byte of the e_ident array must be of this value } ELFMAG3 = Byte('F'); { the fifth byte specifies the bitness of the header; all other values are invalid } ELFCLASS32 = 1; ELFCLASS64 = 2; {$packrecords c} type { The ELF file header. This appears at the start of every ELF file, 32 bit version } TElf32_Ehdr = record e_ident : array[0..El_NIDENT-1] of Byte; { file identification } e_type : Elf32_Half; { file type } e_machine : Elf32_Half; { machine architecture } e_version : Elf32_Word; { ELF format version } e_entry : Elf32_Addr; { entry point } e_phoff : Elf32_Off; { program header file offset } e_shoff : Elf32_Off; { section header file offset } e_flags : Elf32_Word; { architecture specific flags } e_ehsize : Elf32_Half; { size of ELF header in bytes } e_phentsize : Elf32_Half; { size of program header entry } e_phnum : Elf32_Half; { number of program header entries } e_shentsize : Elf32_Half; { size of section header entry } e_shnum : Elf32_Half; { number of section header entry } e_shstrndx : Elf32_Half; { section name strings section index } end; { ELF32 Section header } TElf32_Shdr = record sh_name : Elf32_Word; { section name } sh_type : Elf32_Word; { section type } sh_flags : Elf32_Word; { section flags } sh_addr : Elf32_Addr; { virtual address } sh_offset : Elf32_Off; { file offset } sh_size : Elf32_Word; { section size } sh_link : Elf32_Word; { misc info } sh_info : Elf32_Word; { misc info } sh_addralign : Elf32_Word; { memory alignment } sh_entsize : Elf32_Word; { entry size if table } end; { The ELF file header. This appears at the start of every ELF file, 64 bit version } TElf64_Ehdr = record e_ident : array[0..El_NIDENT-1] of Byte; e_type : Elf64_Half; e_machine : Elf64_Half; e_version : Elf64_Word; e_entry : Elf64_Addr; e_phoff : Elf64_Off; e_shoff : Elf64_Off; e_flags : Elf64_Word; e_ehsize : Elf64_Half; e_phentsize : Elf64_Half; e_phnum : Elf64_Half; e_shentsize : Elf64_Half; e_shnum : Elf64_Half; e_shstrndx : Elf64_Half; end; { ELF64 Section header } TElf64_Shdr = record sh_name : Elf64_Word; sh_type : Elf64_Word; sh_flags : Elf64_Xword; sh_addr : Elf64_Addr; sh_offset : Elf64_Off; sh_size : Elf64_Xword; sh_link : Elf64_Word; sh_info : Elf64_Word; sh_addralign : Elf64_Xword; sh_entsize : Elf64_Xword; end; {$packrecords default} const (* Constant for the magic field of the TMacho32Header (32-bit architectures) *) MH_MAGIC = $feedface; (* the mach magic number *) MH_CIGAM = $cefaedfe; (* NXSwapInt(MH_MAGIC) *) (* Constant for the magic field of the TMacho64Header (64-bit architectures) *) MH_MAGIC_64 = $feedfacf; (* the 64-bit mach magic number *) MH_CIGAM_64 = $cffaedfe; (* NXSwapInt(MH_MAGIC_64) *) (* Constants for the cmd field of all load commands, the type *) LC_SEGMENT = $00000001; (* segment of this file to be mapped *) LC_SEGMENT_64 = $00000019; (* 64-bit segment of this file to be mapped *) type { The 32-bit mach header appears at the very beginning of the object file for 32-bit architectures. } TMacho32Header = packed record magic: longword; (* mach magic number identifier *) cputype: longint; (* cpu specifier *) cpusubtype: longint; (* machine specifier *) filetype: longword; (* type of file *) ncmds: longword; (* number of load commands *) sizeofcmds: longword; (* the size of all the load commands *) flags: longword; (* flags *) end; { The 64-bit mach header appears at the very beginning of object files for 64-bit architectures. } TMacho64Header = packed record magic: longword; (* mach magic number identifier *) cputype: longint; (* cpu specifier *) cpusubtype: longint; (* machine specifier *) filetype: longword; (* type of file *) ncmds: longword; (* number of load commands *) sizeofcmds: longword; (* the size of all the load commands *) flags: longword; (* flags *) reserved: longword; (* reserved *) end; { The load commands directly follow the mach_header. } TMachoLoadCommand = packed record cmd: longword; (* type of load command *) cmdsize: longword; (* total size of command in bytes *) end; { The segment load command indicates that a part of this file is to be mapped into the task's address space. } TMacho32SegmentCommand = packed record (* for 32-bit architectures *) cmd: longword; (* LC_SEGMENT *) cmdsize: longword; (* includes sizeof section structs *) segname: array[0..15] of ansichar; (* segment name *) vmaddr: longword; (* memory address of this segment *) vmsize: longword; (* memory size of this segment *) fileoff: longword; (* file offset of this segment *) filesize: longword; (* amount to map from the file *) maxprot: longint; (* maximum VM protection *) initprot: longint; (* initial VM protection *) nsects: longword; (* number of sections in segment *) flags: longword; (* flags *) end; { The 64-bit segment load command indicates that a part of this file is to be mapped into a 64-bit task's address space. } TMacho64SegmentCommand = packed record (* for 64-bit architectures *) cmd: longword; (* LC_SEGMENT_64 *) cmdsize: longword; (* includes sizeof section_64 structs *) segname: array[0..15] of ansichar; (* segment name *) vmaddr: qword; (* memory address of this segment *) vmsize: qword; (* memory size of this segment *) fileoff: qword; (* file offset of this segment *) filesize: qword; (* amount to map from the file *) maxprot: longint; (* maximum VM protection *) initprot: longint; (* initial VM protection *) nsects: longword; (* number of sections in segment *) flags: longword; (* flags *) end; { The 32-bit segment section header. } TMacho32SegmentSection = packed record (* for 32-bit architectures *) sectname: array[0..15] of ansichar; (* name of this section *) segname: array[0..15] of ansichar; (* segment this section goes in *) addr: longword; (* memory address of this section *) size: longword; (* size in bytes of this section *) offset: longword; (* file offset of this section *) align: longword; (* section alignment (power of 2) *) reloff: longword; (* file offset of relocation entries *) nreloc: longword; (* number of relocation entries *) flags: longword; (* flags (section type and attributes)*) reserved1: longword; (* reserved (for offset or index) *) reserved2: longword; (* reserved (for count or sizeof) *) end; { The 64-bit segment section header. } TMacho64SegmentSection = packed record (* for 64-bit architectures *) sectname: array[0..15] of ansichar; (* name of this section *) segname: array[0..15] of ansichar; (* segment this section goes in *) addr: qword; (* memory address of this section *) size: qword; (* size in bytes of this section *) offset: longword; (* file offset of this section *) align: longword; (* section alignment (power of 2) *) reloff: longword; (* file offset of relocation entries *) nreloc: longword; (* number of relocation entries *) flags: longword; (* flags (section type and attributes)*) reserved1: longword; (* reserved (for offset or index) *) reserved2: longword; (* reserved (for count or sizeof) *) reserved3: longword; (* reserved *) end; type tdosheader = packed record e_magic : word; e_cblp : word; e_cp : word; e_crlc : word; e_cparhdr : word; e_minalloc : word; e_maxalloc : word; e_ss : word; e_sp : word; e_csum : word; e_ip : word; e_cs : word; e_lfarlc : word; e_ovno : word; e_res : array[0..3] of word; e_oemid : word; e_oeminfo : word; e_res2 : array[0..9] of word; e_lfanew : longint; end; tpeheader = packed record PEMagic : longint; Machine : word; NumberOfSections : word; TimeDateStamp : longint; PointerToSymbolTable : longint; NumberOfSymbols : longint; SizeOfOptionalHeader : word; Characteristics : word; end; tpeoptionalheader32 = packed record Magic : word; MajorLinkerVersion : byte; MinorLinkerVersion : byte; SizeOfCode : longint; SizeOfInitializedData : longint; SizeOfUninitializedData : longint; AddressOfEntryPoint : longint; BaseOfCode : longint; BaseOfData : longint; ImageBase : longint; SectionAlignment : longint; FileAlignment : longint; MajorOperatingSystemVersion : word; MinorOperatingSystemVersion : word; MajorImageVersion : word; MinorImageVersion : word; MajorSubsystemVersion : word; MinorSubsystemVersion : word; Win32VersionValue : longint; SizeOfImage : longint; SizeOfHeaders : longint; CheckSum : longint; Subsystem : word; DllCharacteristics : word; SizeOfStackReserve : longint; SizeOfStackCommit : longint; SizeOfHeapReserve : longint; SizeOfHeapCommit : longint; LoaderFlags : longint; NumberOfRvaAndSizes : longint; DataDirectory : array[1..$80] of byte; end; tpeoptionalheader64 = packed record Magic : word; MajorLinkerVersion : byte; MinorLinkerVersion : byte; SizeOfCode : longint; SizeOfInitializedData : longint; SizeOfUninitializedData : longint; AddressOfEntryPoint : longint; BaseOfCode : longint; ImageBase : qword; SectionAlignment : longint; FileAlignment : longint; MajorOperatingSystemVersion : word; MinorOperatingSystemVersion : word; MajorImageVersion : word; MinorImageVersion : word; MajorSubsystemVersion : word; MinorSubsystemVersion : word; Win32VersionValue : longint; SizeOfImage : longint; SizeOfHeaders : longint; CheckSum : longint; Subsystem : word; DllCharacteristics : word; SizeOfStackReserve : qword; SizeOfStackCommit : qword; SizeOfHeapReserve : qword; SizeOfHeapCommit : qword; LoaderFlags : longint; NumberOfRvaAndSizes : longint; DataDirectory : array[1..$80] of byte; end; tcoffsechdr=packed record name : array[0..7] of char; vsize : longint; rvaofs : longint; datalen : longint; datapos : longint; relocpos : longint; lineno1 : longint; nrelocs : word; lineno2 : word; flags : longint; end; coffsymbol=packed record name : array[0..3] of char; { real is [0..7], which overlaps the strofs ! } strofs : longint; value : longint; section : smallint; empty : word; typ : byte; aux : byte; end; function DlnNameByExename(exename: string): string; begin Result := ChangeFileExt(exename, '.zdli'); end; function cntostr(cn: pchar): string; var i: integer = 0; begin Result:=''; repeat if cn^ = #0 then break; Result+= cn^; inc(i); inc(cn); until i = 8; end; function ExtractElf32( f: TFileStream; out DwarfLineInfoSize: QWord; out DwarfLineInfoOffset: Int64; out Imagebase: QWord; out IsCompressed: Boolean): boolean; var header : TElf32_Ehdr; strtab_header : TElf32_Shdr; cursec_header : TElf32_Shdr; i: Integer; buf : array[0..20] of char; sectionName: string; begin DwarfLineInfoOffset := 0; DwarfLineInfoSize := 0; Imagebase:= 0; IsCompressed := False; Result := False; if (f.read(header, sizeof(header)) <> sizeof(header)) then begin ExtractDwarfLineInfoError:='Could not read the ELF header!'; Exit(false); end; { seek to the start of section headers } { first get string section header } f.Position:= header.e_shoff + (header.e_shstrndx * header.e_shentsize); if (f.read(strtab_header, sizeof(strtab_header)) <> sizeof(strtab_header)) then begin ExtractDwarfLineInfoError:='Could not read string section header'; Exit(false); end; for i := 0 to (header.e_shnum-1) do begin // Section nr 0 is reserved. if i = 0 then Continue; f.Position:= header.e_shoff + (i * header.e_shentsize); if (f.Read(cursec_header, sizeof(cursec_header)) <> sizeof(cursec_header)) then begin ExtractDwarfLineInfoError:='Could not read next section header'; Exit(false); end; { paranoia TODO: check cursec_header.e_shentsize } f.Position:= strtab_header.sh_offset + cursec_header.sh_name; if (f.Read(buf, sizeof(buf)) <> sizeof(buf)) then begin ExtractDwarfLineInfoError:='Could not read section name'; Exit(false); end; buf[sizeof(buf)-1] := #0; sectionName := StrPas(pchar(@buf[0])); DEBUG_WRITELN('Section ', i, ': ', sectionName, ', offset ', IntToStr(cursec_header.sh_offset), ', size ', IntToStr(cursec_header.sh_size)); if sectionName = DwarfDebugLine then begin DEBUG_WRITELN(sectionName + ' section found'); DwarfLineInfoOffset := cursec_header.sh_offset; DwarfLineInfoSize := cursec_header.sh_size; { more checks } DEBUG_WRITELN(' offset ', DwarfLineInfoOffset, ', size ', DwarfLineInfoSize); Result := (DwarfLineInfoOffset >= 0) and (DwarfLineInfoSize > 0); break; end else if sectionName = DwarfZDebugLine then begin DEBUG_WRITELN(sectionName + ' section found'); DwarfLineInfoOffset := cursec_header.sh_offset; DEBUG_WRITELN(' offset ', DwarfLineInfoOffset); IsCompressed:= true; Result := (DwarfLineInfoOffset >= 0); break; end; end; end; function ExtractElf64( f: TFileStream; out DwarfLineInfoSize: QWord; out DwarfLineInfoOffset: Int64; out Imagebase: QWord; out IsCompressed: Boolean): boolean; var header : TElf64_Ehdr; strtab_header : TElf64_Shdr; cursec_header : TElf64_Shdr; i: Integer; buf : array[0..20] of char; sectionName: string; begin DwarfLineInfoOffset := 0; DwarfLineInfoSize := 0; Imagebase:= 0; IsCompressed := False; Result := False; if (f.read(header, sizeof(header)) <> sizeof(header)) then begin ExtractDwarfLineInfoError:='Could not read the ELF header!'; Exit(false); end; { seek to the start of section headers } { first get string section header } f.Position:= header.e_shoff + (header.e_shstrndx * header.e_shentsize); if (f.read(strtab_header, sizeof(strtab_header)) <> sizeof(strtab_header)) then begin ExtractDwarfLineInfoError:='Could not read string section header'; Exit(false); end; for i := 0 to (header.e_shnum-1) do begin f.Position:= header.e_shoff + (i * header.e_shentsize); if (f.Read(cursec_header, sizeof(cursec_header)) <> sizeof(cursec_header)) then begin ExtractDwarfLineInfoError:='Could not read next section header'; Exit(false); end; { paranoia TODO: check cursec_header.e_shentsize } f.Position:= strtab_header.sh_offset + cursec_header.sh_name; if (f.Read(buf, sizeof(buf)) <> sizeof(buf)) then begin ExtractDwarfLineInfoError:='Could not read section name'; Exit(false); end; buf[sizeof(buf)-1] := #0; DEBUG_WRITELN('This section is ', pchar(@buf[0]), ', offset ', IntToStr(cursec_header.sh_offset), ', size ', IntToStr(cursec_header.sh_size)); sectionName := StrPas(pchar(@buf[0])); if sectionName = DwarfDebugLine then begin DEBUG_WRITELN(sectionName + ' section found'); DwarfLineInfoOffset := cursec_header.sh_offset; DwarfLineInfoSize := cursec_header.sh_size; { more checks } DEBUG_WRITELN(' offset ', DwarfLineInfoOffset, ', size ', DwarfLineInfoSize); Result := (DwarfLineInfoOffset >= 0) and (DwarfLineInfoSize > 0); break; end; if sectionName = DwarfZDebugLine then begin DEBUG_WRITELN(sectionName + ' section found'); DwarfLineInfoOffset := cursec_header.sh_offset; DEBUG_WRITELN(' offset ', DwarfLineInfoOffset); IsCompressed:= true; Result := (DwarfLineInfoOffset >= 0); break; end; end; end; function ExtractMacho32( f: TFileStream; out DwarfLineInfoSize: QWord; out DwarfLineInfoOffset: Int64; out Imagebase: QWord; out IsCompressed: Boolean): boolean; var I, J : Integer; header : TMacho32Header; load_command : TMachoLoadCommand; segment_header : TMacho32SegmentCommand; section_header : TMacho32SegmentSection; begin DwarfLineInfoOffset := 0; DwarfLineInfoSize := 0; Imagebase:= 0; IsCompressed := False; Result := False; if (f.read(header, sizeof(header)) <> sizeof(header)) then begin ExtractDwarfLineInfoError:='Could not read the Mach-O header!'; Exit(false); end; for I:= 1 to header.ncmds do begin if (f.Read(load_command, sizeof(load_command)) <> sizeof(load_command)) then begin ExtractDwarfLineInfoError:='Could not read next segment header'; Exit(false); end; if (load_command.cmd <> LC_SEGMENT) then f.Seek(load_command.cmdsize - sizeof(load_command), soFromCurrent) else begin f.Seek(-sizeof(load_command), soFromCurrent); if (f.Read(segment_header, sizeof(segment_header)) <> sizeof(segment_header)) then begin ExtractDwarfLineInfoError:='Could not read segment name'; Exit(false); end; if segment_header.segname <> DwarfDarwinSegmentName then begin f.Seek(load_command.cmdsize - sizeof(segment_header), soFromCurrent); if segment_header.segname = TextDarwinSegmentName then Imagebase:= segment_header.vmaddr; end else begin for J:= 0 to segment_header.nsects - 1 do begin if (f.Read(section_header, sizeof(section_header)) <> sizeof(section_header)) then begin ExtractDwarfLineInfoError:='Could not read next section header'; Exit(false); end; DEBUG_WRITELN('Section ', I, ': ', section_header.sectname, ', offset ', IntToStr(section_header.offset), ', size ', IntToStr(section_header.size)); if section_header.sectname = DwarfDarwinDebugLine then begin DEBUG_WRITELN(section_header.sectname + ' section found'); DwarfLineInfoOffset := section_header.offset; DwarfLineInfoSize := section_header.size; { more checks } DEBUG_WRITELN(' offset ', DwarfLineInfoOffset, ', size ', DwarfLineInfoSize); Result := (DwarfLineInfoOffset >= 0) and (DwarfLineInfoSize > 0); Break; end else if section_header.sectname = DwarfZDebugLine then begin DEBUG_WRITELN(section_header.sectname + ' section found'); DwarfLineInfoOffset := section_header.offset; DEBUG_WRITELN(' offset ', DwarfLineInfoOffset); IsCompressed:= true; Result := (DwarfLineInfoOffset >= 0); Break; end; end; Break; end; end; end; end; function ExtractMacho64( f: TFileStream; out DwarfLineInfoSize: QWord; out DwarfLineInfoOffset: Int64; out Imagebase: QWord; out IsCompressed: Boolean): boolean; var I, J : Integer; header : TMacho64Header; load_command : TMachoLoadCommand; segment_header : TMacho64SegmentCommand; section_header : TMacho64SegmentSection; begin DwarfLineInfoOffset := 0; DwarfLineInfoSize := 0; Imagebase:= 0; IsCompressed := False; Result := False; if (f.read(header, sizeof(header)) <> sizeof(header)) then begin ExtractDwarfLineInfoError:='Could not read the Mach-O header!'; Exit(false); end; for I:= 1 to header.ncmds do begin if (f.Read(load_command, sizeof(load_command)) <> sizeof(load_command)) then begin ExtractDwarfLineInfoError:='Could not read next segment header'; Exit(false); end; if (load_command.cmd <> LC_SEGMENT_64) then f.Seek(load_command.cmdsize - sizeof(load_command), soFromCurrent) else begin f.Seek(-sizeof(load_command), soFromCurrent); if (f.Read(segment_header, sizeof(segment_header)) <> sizeof(segment_header)) then begin ExtractDwarfLineInfoError:='Could not read segment name'; Exit(false); end; if segment_header.segname <> DwarfDarwinSegmentName then begin f.Seek(load_command.cmdsize - sizeof(segment_header), soFromCurrent); if segment_header.segname = TextDarwinSegmentName then Imagebase:= segment_header.vmaddr; end else begin for J:= 0 to segment_header.nsects - 1 do begin if (f.Read(section_header, sizeof(section_header)) <> sizeof(section_header)) then begin ExtractDwarfLineInfoError:='Could not read next section header'; Exit(false); end; DEBUG_WRITELN('Section ', I, ': ', section_header.sectname, ', offset ', IntToStr(section_header.offset), ', size ', IntToStr(section_header.size)); if section_header.sectname = DwarfDarwinDebugLine then begin DEBUG_WRITELN(section_header.sectname + ' section found'); DwarfLineInfoOffset := section_header.offset; DwarfLineInfoSize := section_header.size; { more checks } DEBUG_WRITELN(' offset ', DwarfLineInfoOffset, ', size ', DwarfLineInfoSize); Result := (DwarfLineInfoOffset >= 0) and (DwarfLineInfoSize > 0); Break; end else if section_header.sectname = DwarfZDebugLine then begin DEBUG_WRITELN(section_header.sectname + ' section found'); DwarfLineInfoOffset := section_header.offset; DEBUG_WRITELN(' offset ', DwarfLineInfoOffset); IsCompressed:= true; Result := (DwarfLineInfoOffset >= 0); Break; end; end; Break; end; end; end; end; function CheckWindowsExe( f: TFileStream; out DwarfLineInfoSize: QWord; out DwarfLineInfoOffset: Int64; out Imagebase: QWord; out IsCompressed: Boolean): TCheckResult; var dosheader : tdosheader; peheader : tpeheader; peoptheader32 : tpeoptionalheader32; peoptheader64 : tpeoptionalheader64; coffsec : tcoffsechdr; stringsSectionOffset: PtrUInt; sectionName : String; i: Integer; function GetLongSectionName(numberedSectionName: String): String; var sectionNameBuf : array[0..255] of char; stringOffset : Cardinal; oldOffset: Int64; code: Integer; begin Val(Copy(numberedSectionName, 2, 8), stringOffset, code); if code=0 then begin fillchar(sectionNameBuf, sizeof(sectionNameBuf), 0); oldOffset := f.Position; f.Seek(stringsSectionOffset + stringOffset, soBeginning); f.Read(sectionNameBuf, sizeof(sectionNameBuf)); f.Seek(oldOffset, soBeginning); Result := StrPas(sectionNameBuf); end else Result := ''; end; begin DwarfLineInfoOffset := 0; DwarfLineInfoSize := 0; Imagebase:= 0; IsCompressed := False; Result := header_not_found; { read and check header } if f.Size >= sizeof(tdosheader) then begin f.Read(dosheader, sizeof(tdosheader)); if dosheader.e_magic = $5A4D then // 'MZ' begin f.Position:= dosheader.e_lfanew; if (f.Size - f.Position) >= sizeof(tpeheader) then begin f.Read(peheader, sizeof(tpeheader)); if peheader.pemagic = $4550 then // 'PE' begin peoptheader32.magic := f.ReadWord; if (peoptheader32.magic = $10B) and (peheader.SizeOfOptionalHeader = sizeof(tpeoptionalheader32)) then begin DEBUG_WRITELN('Found Windows Portable Executable header (32-bit).'); f.Read(peoptheader32.MajorLinkerVersion, sizeof(tpeoptionalheader32) - sizeof(tpeoptionalheader32.Magic)); ImageBase:= peoptheader32.Imagebase; end else if (peoptheader32.magic = $20B) and (peheader.SizeOfOptionalHeader = sizeof(tpeoptionalheader64)) then begin DEBUG_WRITELN('Found Windows Portable Executable header (64-bit).'); peoptheader64.magic := peoptheader32.magic; f.Read(peoptheader64.MajorLinkerVersion, sizeof(tpeoptionalheader64) - sizeof(tpeoptionalheader64.Magic)); ImageBase:= peoptheader64.Imagebase; end else begin DEBUG_WRITELN('Unsupported Windows Portable Executable.'); Exit; end; stringsSectionOffset := peheader.PointerToSymbolTable + peheader.NumberOfSymbols * sizeof(coffsymbol); { read section info } for i:=1 to peheader.NumberOfSections do begin f.Read(coffsec, sizeof(tcoffsechdr)); sectionName := cntostr(@coffsec.name); if Length(sectionName) <= 0 then continue; if sectionName[1]='/' then // Section name longer than 8 characters. sectionName := GetLongSectionName(sectionName); DEBUG_WRITELN(sectionName); if sectionName = DwarfDebugLine then begin DwarfLineInfoOffset:= coffsec.datapos; DwarfLineInfoSize:= coffsec.datalen; break; end; if sectionName = DwarfZDebugLine then begin DwarfLineInfoOffset:= coffsec.datapos; IsCompressed:= true; break; end; end; if DwarfLineInfoOffset > 0 then Result := found_debug_info else Result := no_debug_info; end; end; end; end; end; function CheckUnixElf( f: TFileStream; out DwarfLineInfoSize: QWord; out DwarfLineInfoOffset: Int64; out Imagebase: QWord; out IsCompressed: Boolean): TCheckResult; var fileIdentBuf : array[0..El_NIDENT-1] of byte; begin if f.Size >= El_NIDENT then begin if (f.read(fileIdentBuf, El_NIDENT) <> El_NIDENT) then begin Exit(header_not_found); end; { more paranoia checks } if (fileIdentBuf[EI_MAG0] <> ELFMAG0) or (fileIdentBuf[EI_MAG1] <> ELFMAG1) or (fileIdentBuf[EI_MAG2] <> ELFMAG2) or (fileIdentBuf[EI_MAG3] <> ELFMAG3) then begin ExtractDwarfLineInfoError:='Invalid ELF magic header.'; Exit(header_not_found); end; // Found header. f.Seek(0, soBeginning); case fileIdentBuf[EI_CLASS] of ELFCLASS32: begin DEBUG_WRITELN('Found Unix ELF 32-bit header.'); if ExtractElf32(f, DwarfLineInfoSize, DwarfLineInfoOffset, Imagebase, IsCompressed) then Result := found_debug_info else Result := no_debug_info; end; ELFCLASS64: begin DEBUG_WRITELN('Found Unix ELF 64-bit header.'); if ExtractElf64(f, DwarfLineInfoSize, DwarfLineInfoOffset, Imagebase, IsCompressed) then Result := found_debug_info else Result := no_debug_info; end; else begin Exit(header_invalid); end; end; Imagebase:= 0; end; end; function CheckDarwinMacho( f: TFileStream; out DwarfLineInfoSize: QWord; out DwarfLineInfoOffset: Int64; out Imagebase: QWord; out IsCompressed: Boolean): TCheckResult; var fileIdentBuf : LongWord; begin if f.Size >= SizeOf(LongWord) then begin if (f.read(fileIdentBuf, SizeOf(LongWord)) <> SizeOf(LongWord)) then begin Exit(header_not_found); end; f.Seek(0, soBeginning); case fileIdentBuf of MH_MAGIC, MH_CIGAM: begin DEBUG_WRITELN('Found Darwin Mach-O 32-bit header.'); if ExtractMacho32(f, DwarfLineInfoSize, DwarfLineInfoOffset, Imagebase, IsCompressed) then Result := found_debug_info else Result := no_debug_info; end; MH_MAGIC_64, MH_CIGAM_64: begin DEBUG_WRITELN('Found Darwin Mach-O 64-bit header.'); if ExtractMacho64(f, DwarfLineInfoSize, DwarfLineInfoOffset, Imagebase, IsCompressed) then Result := found_debug_info else Result := no_debug_info; end; else begin Exit(header_not_found); end; end; end; end; function ExtractDwarfLineInfo( ExeFileName: ansistring; out _dlnfo: pointer; out _dlnfoSize: QWord; out Imagebase: QWord): longbool; var DwarfOffset : int64; DwarfSize : QWord; IsCompressed: boolean = False; f : TFileStream; DC: TDecompressionStream; CheckResult: TCheckResult; begin DEBUG_WRITELN('Reading dwarf line info from ', ExeFileName); Result := False; f:= TFileStream.Create(ExeFileName, fmOpenRead or fmShareDenyNone); try { Check for Windows PE. } CheckResult := CheckWindowsExe(f, DwarfSize, DwarfOffset, Imagebase, IsCompressed); { Check for Unix ELF. } if CheckResult = header_not_found then begin f.Seek(0, soBeginning); CheckResult := CheckUnixElf(f, DwarfSize, DwarfOffset, Imagebase, IsCompressed); end; { Check for Darwin Mach-O. } if CheckResult = header_not_found then begin f.Seek(0, soBeginning); CheckResult := CheckDarwinMacho(f, DwarfSize, DwarfOffset, Imagebase, IsCompressed); end; if CheckResult = found_debug_info then begin Result := True; if IsCompressed then begin f.Position:= DwarfOffset; DC:= TDecompressionStream.Create(f); DC.Read(DwarfSize, sizeof(DwarfSize)); // 8 bytes (QWORD) DC.Read(ImageBase, sizeof(ImageBase)); // 8 bytes (QWORD) _dlnfoSize:= DwarfSize; GetMem(_dlnfo, DwarfSize); DC.Read(_dlnfo^, DwarfSize); DC.Free; end else begin GetMem(_dlnfo, DwarfSize); _dlnfoSize:= DwarfSize; f.Position:= DwarfOffset; f.Read(_dlnfo^, DwarfSize); end; end else case CheckResult of header_not_found: ExtractDwarfLineInfoError := 'File not supported.'; header_invalid: ExtractDwarfLineInfoError := 'Invalid header.'; no_debug_info: ExtractDwarfLineInfoError := 'The debug line info section not found.'; end; finally f.Free; end; end; end. doublecmd-0.5.8/src/flinker.lfm0000644000175000017500000001257612023046500015432 0ustar alexxalexxobject frmLinker: TfrmLinker Left = 323 Height = 337 Top = 176 Width = 360 HorzScrollBar.Page = 359 HorzScrollBar.Range = 289 VertScrollBar.Page = 363 VertScrollBar.Range = 331 ActiveControl = edSave BorderIcons = [biSystemMenu, biMaximize] Caption = 'Linker' ClientHeight = 337 ClientWidth = 360 Position = poScreenCenter LCLVersion = '1.1' object gbSaveTo: TGroupBox AnchorSideLeft.Control = Owner AnchorSideRight.Control = lstFile AnchorSideRight.Side = asrBottom Left = 6 Height = 80 Top = 248 Width = 242 Anchors = [akLeft, akRight, akBottom] BorderSpacing.Left = 6 BorderSpacing.Bottom = 6 Caption = 'Save to...' ClientHeight = 57 ClientWidth = 238 TabOrder = 1 object lblFileName: TLabel AnchorSideLeft.Control = gbSaveTo AnchorSideTop.Control = gbSaveTo Left = 6 Height = 18 Top = 6 Width = 62 BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = '&File name' FocusControl = edSave ParentColor = False end object edSave: TEdit AnchorSideLeft.Control = gbSaveTo AnchorSideTop.Control = lblFileName AnchorSideTop.Side = asrBottom AnchorSideRight.Control = btnSave Left = 6 Height = 28 Top = 30 Width = 195 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 BorderSpacing.Top = 6 BorderSpacing.Right = 6 TabOrder = 0 end object btnSave: TButton AnchorSideTop.Control = edSave AnchorSideRight.Control = gbSaveTo AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = edSave AnchorSideBottom.Side = asrBottom Left = 207 Height = 28 Top = 30 Width = 25 Anchors = [akTop, akRight, akBottom] BorderSpacing.Right = 6 BorderSpacing.InnerBorder = 4 Caption = '...' OnClick = btnSaveClick TabOrder = 1 end end object grbxControl: TGroupBox AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = lstFile AnchorSideBottom.Side = asrBottom Left = 254 Height = 242 Top = 0 Width = 100 Anchors = [akTop, akRight, akBottom] BorderSpacing.Right = 6 Caption = 'Item' ClientHeight = 219 ClientWidth = 96 TabOrder = 2 object spbtnUp: TButton AnchorSideLeft.Control = grbxControl AnchorSideRight.Control = grbxControl AnchorSideRight.Side = asrBottom Left = 4 Height = 32 Hint = 'Up' Top = 1 Width = 88 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 4 BorderSpacing.Right = 4 BorderSpacing.InnerBorder = 4 Caption = '&Up' OnClick = spbtnUpClick ParentShowHint = False TabOrder = 0 end object spbtnDown: TButton AnchorSideLeft.Control = grbxControl AnchorSideTop.Control = spbtnUp AnchorSideTop.Side = asrBottom AnchorSideRight.Control = grbxControl AnchorSideRight.Side = asrBottom Left = 4 Height = 32 Hint = 'Down' Top = 39 Width = 88 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 4 BorderSpacing.Top = 6 BorderSpacing.Right = 4 BorderSpacing.InnerBorder = 4 Caption = 'Do&wn' OnClick = spbtnDownClick ParentShowHint = False TabOrder = 1 end object spbtnDel: TButton AnchorSideLeft.Control = grbxControl AnchorSideTop.Control = spbtnDown AnchorSideTop.Side = asrBottom AnchorSideRight.Control = grbxControl AnchorSideRight.Side = asrBottom Left = 4 Height = 32 Hint = 'Delete' Top = 77 Width = 88 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 4 BorderSpacing.Top = 6 BorderSpacing.Right = 4 BorderSpacing.InnerBorder = 4 Caption = '&Delete' OnClick = spbtnDelClick ParentShowHint = False TabOrder = 2 end end object btnOK: TButton AnchorSideRight.Control = grbxControl AnchorSideRight.Side = asrCenter AnchorSideBottom.Control = btnExit Left = 260 Height = 32 Top = 258 Width = 88 Anchors = [akRight, akBottom] BorderSpacing.Bottom = 6 BorderSpacing.InnerBorder = 4 Caption = '&OK' Default = True ModalResult = 1 TabOrder = 3 end object btnExit: TButton AnchorSideTop.Side = asrBottom AnchorSideRight.Control = grbxControl AnchorSideRight.Side = asrCenter AnchorSideBottom.Control = gbSaveTo AnchorSideBottom.Side = asrBottom Left = 260 Height = 32 Top = 296 Width = 88 Anchors = [akRight, akBottom] BorderSpacing.Top = 6 BorderSpacing.InnerBorder = 4 Cancel = True Caption = '&Cancel' ModalResult = 2 TabOrder = 4 end object lstFile: TListBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner AnchorSideRight.Control = grbxControl AnchorSideBottom.Control = gbSaveTo Left = 6 Height = 234 Top = 8 Width = 242 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 6 BorderSpacing.Top = 8 BorderSpacing.Right = 6 BorderSpacing.Bottom = 6 ItemHeight = 0 ScrollWidth = 240 TabOrder = 0 TopIndex = -1 end object dlgSaveAll: TSaveDialog Filter = 'All files|*.*' FilterIndex = 0 left = 288 top = 160 end end doublecmd-0.5.8/src/uShowMsg.pas0000644000175000017500000003656711770367601015607 0ustar alexxalexx{ Seksi Commander ---------------------------- Implementing of Showing messages with localization Licence : GNU GPL v 2.0 Author : radek.cervinka@centrum.cz contributors: Koblov Alexander (Alexx2000@mail.ru) } unit uShowMsg; {$mode delphi}{$H+} interface uses Forms, Classes; type TMyMsgResult=(mmrOK, mmrNo, mmrYes, mmrCancel, mmrNone, mmrAppend, mmrResume, mmrCopyInto, mmrCopyIntoAll, mmrOverwrite, mmrOverwriteAll, mmrOverwriteOlder, mmrSkip, mmrSkipAll, mmrIgnoreAll, mmrAll, mmrRetry, mmrAbort); TMyMsgButton=(msmbOK, msmbNo, msmbYes, msmbCancel, msmbNone, msmbAppend, msmbResume, msmbCopyInto, msmbCopyIntoAll, msmbOverwrite, msmbOverwriteAll, msmbOverwriteOlder, msmbSkip, msmbSkipAll, msmbIgnoreAll, msmbAll, msmbRetry, msmbAbort); { TDialogMainThread } TDialogMainThread = class private procedure SyncMsgBox; procedure SyncMessageBox; procedure SyncInputQuery; protected FThread: TThread; FCaption, FMessage, FValue: UTF8String; FMaskInput: Boolean; FFlags: Longint; FButtons: array of TMyMsgButton; FButDefault, FButEscape: TMyMsgButton; FInputQueryResult: Boolean; FMsgBoxResult: TMyMsgResult; FMessageBoxResult: LongInt; public constructor Create(AThread: TThread); destructor Destroy;override; function ShowMsgBox(const sMsg: UTF8String; const Buttons: array of TMyMsgButton; ButDefault, ButEscape:TMyMsgButton) : TMyMsgResult; function ShowMessageBox(const AText, ACaption: UTF8String; Flags: LongInt): LongInt; function ShowInputQuery(const ACaption, APrompt: UTF8String; MaskInput: Boolean; var Value: UTF8String) : Boolean; end; function msgYesNo(const sMsg: UTF8String): Boolean; overload; function msgYesNo(Thread: TThread; const sMsg: UTF8String): Boolean; overload; function msgYesNoCancel(const sMsg: UTF8String): TMyMsgResult; overload; function msgYesNoCancel(Thread: TThread; const sMsg: UTF8String): TMyMsgResult; overload; procedure msgOK(const sMsg: UTF8String); overload; procedure msgOK(Thread: TThread; const sMsg: UTF8String); overload; procedure msgWarning(const sMsg: UTF8String); overload; procedure msgWarning(Thread: TThread; const sMsg: UTF8String); overload; procedure msgError(const sMsg: UTF8String); overload; procedure msgError(Thread: TThread; const sMsg: UTF8String); overload; function MsgBox(const sMsg: UTF8String; const Buttons: array of TMyMsgButton; ButDefault, ButEscape: TMyMsgButton): TMyMsgResult; overload; function MsgBox(Thread: TThread; const sMsg: UTF8String; const Buttons: array of TMyMsgButton; ButDefault, ButEscape: TMyMsgButton): TMyMsgResult; overload; function MsgTest:TMyMsgResult; function ShowMessageBox(const AText, ACaption: UTF8String; Flags: LongInt): LongInt; overload; function ShowMessageBox(Thread: TThread; const AText, ACaption: UTF8String; Flags: LongInt): LongInt; overload; function ShowInputQuery(const ACaption, APrompt: UTF8String; MaskInput: Boolean; var Value: UTF8String): Boolean; overload; function ShowInputQuery(Thread: TThread; const ACaption, APrompt: UTF8String; MaskInput: Boolean; var Value: UTF8String): Boolean; overload; function ShowInputQuery(const ACaption, APrompt: UTF8String; var Value: UTF8String): Boolean; overload; function ShowInputQuery(Thread: TThread; const ACaption, APrompt: UTF8String; var Value: UTF8String): Boolean; overload; function ShowInputComboBox(const sCaption, sPrompt : UTF8String; slValueList : TStringList; var sValue : UTF8String) : Boolean; procedure msgLoadLng; procedure InitDialogButtonWidth; implementation uses LCLIntf, SysUtils, StdCtrls, Graphics, Math, typinfo, fMsg, uLng, Buttons, Controls, uLog, uGlobs, uDebug; const cMsgName = 'Double Commander'; var cLngButton: array[TMyMsgButton] of UTF8String; { TDialogMainThread } procedure TDialogMainThread.SyncMsgBox; begin FMsgBoxResult:= MsgBox(FMessage, FButtons, FButDefault, FButEscape); end; procedure TDialogMainThread.SyncMessageBox; begin FMessageBoxResult:= MessageBoxFunction(PAnsiChar(FMessage), PAnsiChar(FCaption), FFlags); end; procedure TDialogMainThread.SyncInputQuery; begin FInputQueryResult := LCLIntf.RequestInput(FCaption, FMessage, FMaskInput, FValue); end; constructor TDialogMainThread.Create(AThread : TThread); begin FThread:= AThread; end; destructor TDialogMainThread.Destroy; begin FButtons:= nil; inherited Destroy; end; function TDialogMainThread.ShowMsgBox(const sMsg: UTF8String; const Buttons: array of TMyMsgButton; ButDefault, ButEscape: TMyMsgButton) : TMyMsgResult; var I : Integer; begin FMessage := sMsg; SetLength(FButtons, Length(Buttons)); for I := Low(Buttons) to High(Buttons) do FButtons[I] := Buttons[I]; FButDefault := ButDefault; FButEscape := ButEscape; TThread.Synchronize(FThread, SyncMsgBox); Result := FMsgBoxResult; end; function TDialogMainThread.ShowMessageBox(const AText, ACaption: UTF8String; Flags: LongInt): LongInt; begin FCaption:= ACaption; FMessage:= AText; FFlags:= Flags; TThread.Synchronize(FThread, SyncMessageBox); Result:= FMessageBoxResult; end; function TDialogMainThread.ShowInputQuery(const ACaption, APrompt: UTF8String; MaskInput: Boolean; var Value: UTF8String): Boolean; begin FCaption:= ACaption; FMessage:= APrompt; FMaskInput:= MaskInput; FValue:= Value; TThread.Synchronize(FThread, SyncInputQuery); Value:= FValue; Result:= FInputQueryResult; end; { This is workaround for autosize} function MeasureText(Canvas:TCanvas; const sText: UTF8String):Integer; var xEnter:Integer; begin xEnter:=Pos(#10, sText); if xEnter>0 then Result:=Canvas.TextWidth(Copy(sText,1, xEnter)) else Result:=Canvas.TextWidth(sText); end; procedure SetMsgBoxParams(var frmMsg : TfrmMsg; const sMsg: UTF8String; const Buttons: array of TMyMsgButton; ButDefault, ButEscape:TMyMsgButton); var iIndex:Integer; begin Assert(Assigned(frmMsg)); frmMsg.Position:=poScreenCenter; frmMsg.BorderStyle := bsSingle; frmMsg.BorderIcons := [biSystemMenu]; if (High(Buttons)+1)>=3 then frmMsg.Width:=(cButtonWidth+cButtonSpace)*3+cButtonSpace else frmMsg.Width:=(cButtonWidth+cButtonSpace)*(High(Buttons)+1)+cButtonSpace; frmMsg.Height:=(High(Buttons) div 3)*40+90; frmMsg.Caption:=cMsgName; with frmMsg.lblMsg do begin Caption:=sMsg; Top:=15; AutoSize:=True; // Anchors:=[akTop]; Width:=MeasureText(frmMsg.Canvas, sMsg); // workaround if Width>frmMsg.Width then frmMsg.Width:=Width+2*cButtonSpace; Left:=(frmMsg.Width-Width) div 2; end; for iIndex:=0 to High(Buttons) do begin With TButton.Create(frmMsg) do begin Caption:=cLngButton[Buttons[iIndex]]; Parent:=frmMsg; Width:=cButtonWidth; Height := 32; Tag:=iIndex; OnCLick:=frmMsg.ButtonClick; OnMouseUp:=frmMsg.MouseUpEvent; if (High(Buttons)+1)>=3 then Left:=(iIndex mod 3)*(cButtonWidth+cButtonSpace)+(frmMsg.Width-(3*cButtonWidth+2*cButtonSpace)) div 2 else Left:=iIndex*(cButtonWidth+cButtonSpace)+(frmMsg.Width-((High(Buttons)+1)*cButtonWidth+High(Buttons)*cButtonSpace)) div 2; Top:=(iIndex div 3)*(Height+5)+50; if Buttons[iIndex]=ButDefault then Default:=True; if Buttons[iIndex]=ButEscape then frmMsg.Escape:=iIndex; { if iIndex=0 then SetFocus; } end; end; end; function MsgBox(const sMsg: UTF8String; const Buttons: array of TMyMsgButton; ButDefault, ButEscape:TMyMsgButton):TMyMsgResult; var frmMsg:TfrmMsg; begin frmMsg:=TfrmMsg.Create(Application); try SetMsgBoxParams(frmMsg, sMsg, Buttons, ButDefault, ButEscape); frmMsg.ShowModal; if (frmMsg.iSelected)=-1 then Result:=mmrNone else { TODO : not safe code because of direct typecast from one enumeration to another, better to use array lookup } Result:=TMyMsgResult(Buttons[frmMsg.iSelected]); finally frmMsg.Free; end; end; function MsgBox(Thread: TThread; const sMsg: UTF8String; const Buttons: array of TMyMsgButton; ButDefault, ButEscape: TMyMsgButton): TMyMsgResult; var DialogMainThread : TDialogMainThread; begin Result := mmrNone; DialogMainThread := TDialogMainThread.Create(Thread); try Result := DialogMainThread.ShowMsgBox(sMsg, Buttons, ButDefault, ButEscape); finally DialogMainThread.Free; end; end; Function MsgTest:TMyMsgResult; begin Result:= MsgBox('test language of msg subsystem'#10'Second line',[msmbOK, msmbNO, msmbYes, msmbCancel, msmbNone, msmbAppend, msmbOverwrite, msmbOverwriteAll],msmbOK, msmbNO); end; function msgYesNo(const sMsg: UTF8String):Boolean; begin Result:= MsgBox(sMsg,[msmbYes, msmbNo], msmbYes, msmbNo )= mmrYes; end; function msgYesNo(Thread: TThread; const sMsg: UTF8String): Boolean; begin Result:= MsgBox(Thread, sMsg,[msmbYes, msmbNo], msmbYes, msmbNo )= mmrYes; end; function msgYesNoCancel(const sMsg: UTF8String):TMyMsgResult; begin Result:= MsgBox(sMsg,[msmbYes, msmbNo, msmbCancel], msmbYes, msmbCancel); end; function msgYesNoCancel(Thread: TThread; const sMsg: UTF8String): TMyMsgResult; begin Result:= MsgBox(Thread, sMsg,[msmbYes, msmbNo, msmbCancel], msmbYes, msmbCancel); end; procedure msgOK(const sMsg: UTF8String); begin MsgBox(sMsg,[msmbOK],msmbOK, msmbOK); end; procedure msgOK(Thread: TThread; const sMsg: UTF8String); begin MsgBox(Thread, sMsg,[msmbOK],msmbOK, msmbOK); end; procedure msgError(const sMsg: UTF8String); begin MsgBox(sMsg,[msmbOK],msmbOK, msmbOK); end; procedure msgError(Thread: TThread; const sMsg: UTF8String); begin MsgBox(Thread, sMsg,[msmbOK],msmbOK, msmbOK) end; procedure msgWarning(const sMsg: UTF8String); begin if gShowWarningMessages then MsgBox(sMsg,[msmbOK],msmbOK, msmbOK) else begin if gLogWindow then // if log window enabled then write error to it logWrite(sMsg, lmtError) else Beep; end; end; procedure msgWarning(Thread: TThread; const sMsg: UTF8String); begin if gShowWarningMessages then MsgBox(Thread, sMsg,[msmbOK],msmbOK, msmbOK) else begin if gLogWindow then // if log window enabled then write error to it logWrite(Thread, sMsg, lmtError) else Beep; end; end; function ShowMessageBox(const AText, ACaption: UTF8String; Flags: LongInt): LongInt; begin Result:= ShowMessageBox(nil, AText, ACaption, Flags); end; function ShowMessageBox(Thread: TThread; const AText, ACaption: UTF8String; Flags: LongInt): LongInt; var DialogMainThread : TDialogMainThread; begin Result:= 0; DialogMainThread:= TDialogMainThread.Create(Thread); try Result:= DialogMainThread.ShowMessageBox(AText, ACaption, Flags); finally DialogMainThread.Free; end; end; function ShowInputQuery(const ACaption, APrompt: UTF8String; MaskInput: Boolean; var Value: UTF8String): Boolean; overload; begin Result:= ShowInputQuery(nil, ACaption, APrompt, MaskInput, Value); end; function ShowInputQuery(Thread: TThread; const ACaption, APrompt: UTF8String; MaskInput: Boolean; var Value: UTF8String): Boolean; var DialogMainThread : TDialogMainThread; begin Result := False; DialogMainThread:= TDialogMainThread.Create(Thread); try Result:= DialogMainThread.ShowInputQuery(ACaption, APrompt, MaskInput, Value); finally DialogMainThread.Free; end; end; function ShowInputQuery(const ACaption, APrompt: UTF8String; var Value: UTF8String): Boolean; overload; begin Result:= ShowInputQuery(nil, ACaption, APrompt, False, Value); end; function ShowInputQuery(Thread: TThread; const ACaption, APrompt: UTF8String; var Value: UTF8String): Boolean; begin Result:= ShowInputQuery(Thread, ACaption, APrompt, False, Value); end; function ShowInputComboBox(const sCaption, sPrompt : UTF8String; slValueList : TStringList; var sValue : UTF8String) : Boolean; var frmDialog : TForm; lblPrompt : TLabel; cbValue : TComboBox; bbtnOK, bbtnCancel : TBitBtn; begin frmDialog := TForm.CreateNew(nil, 0); with frmDialog do try BorderStyle := bsDialog; Position := poScreenCenter; AutoSize := True; Height := 120; ChildSizing.TopBottomSpacing := 8; ChildSizing.LeftRightSpacing := 8; Caption := sCaption; lblPrompt := TLabel.Create(frmDialog); with lblPrompt do begin Parent := frmDialog; Caption := sPrompt; Top := 6; Left := 6; end; cbValue := TComboBox.Create(frmDialog); with cbValue do begin Parent := frmDialog; Items.Assign(slValueList); Text := sValue; Left := 6; AnchorToNeighbour(akTop, 6, lblPrompt); Constraints.MinWidth := max(280, Screen.Width div 4); end; bbtnCancel := TBitBtn.Create(frmDialog); with bbtnCancel do begin Parent := frmDialog; Kind := bkCancel; Cancel := True; Left := 6; Width:= 90; Anchors := [akTop, akRight]; AnchorToNeighbour(akTop, 18, cbValue); AnchorSide[akRight].Control := cbValue; AnchorSide[akRight].Side := asrRight; end; bbtnOK := TBitBtn.Create(frmDialog); with bbtnOK do begin Parent := frmDialog; Kind := bkOk; Default := True; Width:= 90; Anchors := [akTop, akRight]; AnchorToNeighbour(akTop, 18, cbValue); AnchorToNeighbour(akRight, 6, bbtnCancel); end; Result := (ShowModal = mrOK); if Result then begin if slValueList.IndexOf(cbValue.Text) < 0 then slValueList.Add(cbValue.Text); sValue := cbValue.Text; end; finally FreeAndNil(frmDialog); end; // with frmDialog end; procedure msgLoadLng; begin cLngButton[msmbOK] := rsDlgButtonOK; cLngButton[msmbNo] := rsDlgButtonNo; cLngButton[msmbYes] := rsDlgButtonYes; cLngButton[msmbCancel] := rsDlgButtonCancel; cLngButton[msmbNone] := rsDlgButtonNone; cLngButton[msmbAppend] := rsDlgButtonAppend; cLngButton[msmbResume] := rsDlgButtonResume; cLngButton[msmbCopyInto] := rsDlgButtonCopyInto; cLngButton[msmbCopyIntoAll] := rsDlgButtonCopyIntoAll; cLngButton[msmbOverwrite] := rsDlgButtonOverwrite; cLngButton[msmbOverwriteAll] := rsDlgButtonOverwriteAll; cLngButton[msmbOverwriteOlder] := rsDlgButtonOverwriteOlder; cLngButton[msmbSkip] := rsDlgButtonSkip; cLngButton[msmbSkipAll] := rsDlgButtonSkipAll; cLngButton[msmbIgnoreAll] := rsDlgButtonIgnoreAll; cLngButton[msmbAll] := rsDlgButtonAll; cLngButton[msmbRetry] := rsDlgButtonRetry; cLngButton[msmbAbort] := rsDlgButtonAbort; end; procedure InitDialogButtonWidth; var I: TMyMsgButton; begin for I:= Low(TMyMsgButton) to High(TMyMsgButton) do begin // A reminder in case someone forgots to assign text. if cLngButton[I] = EmptyStr then DCDebug('Warning: MsgBox button ' + GetEnumName(TypeInfo(TMyMsgButton), Integer(I)) + ' caption not set.'); with Application.MainForm.Canvas do if TextWidth(cLngButton[I]) >= (cButtonWidth - 8) then cButtonWidth:= TextWidth(cLngButton[I]) + 8; end; end; end. doublecmd-0.5.8/clean.bat0000644000175000017500000000374112114332114014255 0ustar alexxalexx@echo Clean up output directory @del /Q /S units\*.* @del /Q src\*.*~ @del /Q src\*.~* @del /Q doublecmd.dbg @del /Q doublecmd.zdli @del /Q doublecmd*.exe @del /Q doublecmd*.old @echo Remove generated help files @del /Q doc\en\dev-help\*.* @echo Clean up tools output directories @del /Q /S tools\lib\*.* @del /Q tools\extractdwrflnfo.exe @echo Clean up plugins output directories @del /Q /S plugins\dsx\DSXLocate\lib\*.* @del /Q /S plugins\wcx\cpio\lib\*.* @del /Q /S plugins\wcx\deb\lib\*.* @del /Q /S plugins\wcx\lzma\lib\*.* @del /Q /S plugins\wcx\rpm\lib\*.* @del /Q /S plugins\wcx\unbz2\lib\*.* @del /Q /S plugins\wcx\unrar\lib\*.* @del /Q /S plugins\wcx\zip\lib\*.* @del /Q /S plugins\wdx\deb_wdx\lib\*.* @del /Q /S plugins\wdx\rpm_wdx\lib\*.* @del /Q /S plugins\wdx\svn_wdx\lib\*.* @del /Q /S plugins\wdx\xpi_wdx\lib\*.* @del /Q /S plugins\wfx\ftp\lib\*.* @del /Q /S plugins\wfx\gvfs\lib\*.* @del /Q /S plugins\wfx\samba\lib\*.* @del /Q /S plugins\wfx\sample\lib\*.* @del /Q /S plugins\wlx\simplewlx\lib\*.* @del /Q /S plugins\wlx\WlxMplayer\lib\*.* @echo Remove backup files @del /Q plugins\wcx\cpio\src\*.bak @del /Q plugins\wcx\rpm\src\*.bak @del /Q plugins\wcx\deb\src\*.bak @del /Q plugins\wcx\lzma\src\*.bak @del /Q plugins\wcx\zip\src\*.bak @del /Q plugins\wcx\unbz2\src\*.bak @del /Q plugins\wcx\unrar\src\*.bak @del /Q plugins\wcx\cpio\src\*.*~ @del /Q plugins\wcx\rpm\src\*.*~ @del /Q plugins\wcx\deb\src\*.*~ @del /Q plugins\wcx\lzma\src\*.*~ @del /Q plugins\wcx\zip\src\*.*~ @del /Q plugins\wcx\unbz2\src\*.*~ @del /Q plugins\wcx\unrar\src\*.*~ @echo Clean up components output directories @del /Q /S components\chsdet\lib\*.* @del /Q /S components\CmdLine\lib\*.* @del /Q /S components\dcpcrypt\lib\*.* @del /Q /S components\doublecmd\lib\*.* @del /Q /S components\gifanim\lib\*.* @del /Q /S components\KASToolBar\lib\*.* @del /Q /S components\viewer\lib\*.* @del /Q /S components\ZVDateTimeCtrls\lib\*.* @echo Done.